ZGlmZiAtLWdpdCBhL2Zsb3cudGNsIGIvZmxvdy50Y2wKaW5kZXggMDBkNDRjZS4uOTA1NjBjMyAxMDA3NTUKLS0tIGEvZmxvdy50Y2wKKysrIGIvZmxvdy50Y2wKQEAgLTk5LDggKzk5LDggQEAKIAl7b3BlbnN0YSBzeW50aGVzaXMvb3BlbnN0YX0KIAl7dmVyaWxvZzJkZWYgZmxvb3JwbGFuL3Zlcmlsb2cyZGVmfQogCXtpb1BsYWNlciBmbG9vcnBsYW4vaW9QbGFjZXJ9Ci0Je3BkbiBmbG9vcnBsYW4vcGRufQogCXt0YXBjZWxsIGZsb29ycGxhbi90YXBjZWxsfQorCXtwZG4gZmxvb3JwbGFuL3Bkbn0KIAl7cmVwbGFjZWlvIHBsYWNlbWVudC9yZXBsYWNlfQogCXtwc24gcGxhY2VtZW50L3Bzbn0KIAl7b3BlbmRwIHBsYWNlbWVudC9vcGVuZHB9CkBAIC0xMTQsNyArMTE0LDcgQEAKIHNldCBmaW5hbF9vdXRwdXQgXAogCVtsaXN0ICBcCiAJCVtsaXN0IHlvc3lzIHN5bnRoZXNpcy8kOjplbnYoREVTSUdOX05BTUUpLnN5bnRoZXNpc10gXAotCQlbbGlzdCB0YXBjZWxsIGZsb29ycGxhbi8kOjplbnYoREVTSUdOX05BTUUpLmZsb29ycGxhbl0gXAorCQlbbGlzdCBwZG4gZmxvb3JwbGFuLyQ6OmVudihERVNJR05fTkFNRSkuZmxvb3JwbGFuXSBcCiAJCVtsaXN0IG9wZW5kcCBwbGFjZW1lbnQvJDo6ZW52KERFU0lHTl9OQU1FKS5wbGFjZW1lbnRdIFwKIAkJW2xpc3QgdHJpdG9uUm91dGUgcm91dGluZy8kOjplbnYoREVTSUdOX05BTUUpLnJvdXRpbmddIFwKIAkJW2xpc3QgY3RzIGN0cy8kOjplbnYoREVTSUdOX05BTUUpLmN0c10gXApAQCAtMzI2LDI3ICszMjYsMzEgQEAKIFRJTUVSOjp0aW1lcl9zdG9wCiBleGVjIGVjaG8gIltUSU1FUjo6Z2V0X3J1bnRpbWVdIiA+PiAkOjplbnYoaW9QbGFjZXJfbG9nX2ZpbGVfdGFnKV9ydW50aW1lLnR4dAogCi0jIHBkbiBnZW5lcmF0aW9uCi1USU1FUjo6dGltZXJfc3RhcnQKLXRyeV9jYXRjaCBhcHBseV9wZG4gLi9wZGtzLyQ6OmVudihQREspL2NvbW1vbl9wZG4udGNsIFwKLSAgICAgICAgfCYgdGVlICQ6OmVudihURVJNSU5BTF9PVVRQVVQpICQ6OmVudihwZG5fbG9nX2ZpbGVfdGFnKS5sb2cKLXRyeV9jYXRjaCBtdiAkOjplbnYoVE1QX0RJUikvJDo6ZW52KENVUlJFTlRfU1RBR0UpLyQ6OmVudihERVNJR05fTkFNRSlfcG9zdF9UOC5kZWYgJDo6ZW52KHBkbl90bXBfZmlsZV90YWcpLmRlZgotVElNRVI6OnRpbWVyX3N0b3AKLWV4ZWMgZWNobyAiW1RJTUVSOjpnZXRfcnVudGltZV0iID4+ICQ6OmVudihwZG5fbG9nX2ZpbGVfdGFnKV9ydW50aW1lLnR4dAotIyB0cnlfY2F0Y2ggbXYgJDo6ZW52KERFU0lHTl9OQU1FKV9wZG4uZGVmICQ6OmVudihwZG5fdG1wX2ZpbGVfdGFnKV9lbXB0eS5kZWYKLSMgdHJ5X2NhdGNoIGNwICQ6OmVudihSRVNVTFRTX0RJUikvJDo6ZW52KENVUlJFTlRfU1RBR0UpLzNfMl9mbG9vcnBsYW4uZGVmICQ6OmVudihSRVNVTFRTX0RJUikvJDo6ZW52KENVUlJFTlRfU1RBR0UpLzNfM19wZG4uZGVmCi0KLSMgdGFwY2VsbAotdHJ5X2NhdGNoIGNwICQ6OmVudihwZG5fdG1wX2ZpbGVfdGFnKS5kZWYgJDo6ZW52KHRhcGNlbGxfcmVzdWx0X2ZpbGVfdGFnKS5kZWYKK3RyeV9jYXRjaCBjcCAkOjplbnYoaW9QbGFjZXJfdG1wX2ZpbGVfdGFnKS5kZWYgJDo6ZW52KHRhcGNlbGxfdG1wX2ZpbGVfdGFnKS5kZWYKIFRJTUVSOjp0aW1lcl9zdGFydAogdHJ5X2NhdGNoIHRhcGNlbGwgLWxlZiAkOjplbnYoTUVSR0VEX0xFRikgXAotCS1kZWYgJDo6ZW52KHRhcGNlbGxfcmVzdWx0X2ZpbGVfdGFnKS5kZWYgXAorCS1kZWYgJDo6ZW52KHRhcGNlbGxfdG1wX2ZpbGVfdGFnKS5kZWYgXAogCS13ZWxsdGFwICQ6OmVudihGUF9XRUxMVEFQX0NFTEwpIFwKIAktZW5kY2FwICQ6OmVudihGUF9FTkRDQVBfQ0VMTCkgXAotCS1vdXRkZWYgJDo6ZW52KHRhcGNlbGxfcmVzdWx0X2ZpbGVfdGFnKS5kZWYgXAorCS1vdXRkZWYgJDo6ZW52KHRhcGNlbGxfdG1wX2ZpbGVfdGFnKS5kZWYgXAogCXwmIHRlZSAkOjplbnYoVEVSTUlOQUxfT1VUUFVUKSAkOjplbnYodGFwY2VsbF9sb2dfZmlsZV90YWcpLmxvZwogVElNRVI6OnRpbWVyX3N0b3AKKwogZXhlYyBlY2hvICJbVElNRVI6OmdldF9ydW50aW1lXSIgPj4gJDo6ZW52KHRhcGNlbGxfbG9nX2ZpbGVfdGFnKV9ydW50aW1lLnR4dAorIyBwZG4gZ2VuZXJhdGlvbgorVElNRVI6OnRpbWVyX3N0YXJ0CitwdXRzICJJbml0aWFsaXppbmcgb3BlbkRCIgorY2F0Y2gge2V4ZWMgb3BlbmRidGNsICQ6OmVudihTQ1JJUFRTX0RJUikvcGRuL2luaXRfZGIudGNsfQorcHV0cyAiQXBwbHlpbmcgUEROIgordHJ5X2NhdGNoIG9wZW5kYnRjbCAkOjplbnYoU0NSSVBUU19ESVIpL3Bkbi9hcHBseV9wZG4udGNsIC4vcGRrcy8kOjplbnYoUERLKS9jb21tb25fcGRuLnRjbCBcCisJICB8JiB0ZWUgJDo6ZW52KFRFUk1JTkFMX09VVFBVVCkgJDo6ZW52KHBkbl9sb2dfZmlsZV90YWcpLmxvZwordHJ5X2NhdGNoIHNlZCAtaSAicy8rIFJPV0NPTC4qOy87L2ciICQ6OmVudihwZG5fcmVzdWx0X2ZpbGVfdGFnKS5kZWYKKworVElNRVI6OnRpbWVyX3N0b3AKK2V4ZWMgZWNobyAiW1RJTUVSOjpnZXRfcnVudGltZV0iID4+ICQ6OmVudihwZG5fbG9nX2ZpbGVfdGFnKV9ydW50aW1lLnR4dAorI3RyeV9jYXRjaCBjcCAkOjplbnYocmVwbGFjZW1hY3JvX3RtcF9maWxlX3RhZykuZGVmICQ6OmVudihwZG5fdG1wX2ZpbGVfdGFnKS5kZWYKKworIyB0YXBjZWxsCiAKIAogIyBvdXRwdXRzOiAzX2Zsb29ycGxhbi5kZWYsIDNfZmxvb3JwbGFuLnYsIDNfZmxvb3JwbGFuLnNkYwpkaWZmIC0tZ2l0IGEvcGRrcy9za3l3YXRlcjEzMC9jb21tb25fcGRuLnRjbCBiL3Bka3Mvc2t5d2F0ZXIxMzAvY29tbW9uX3Bkbi50Y2wKaW5kZXggMmVlZWY1MC4uODQ3MDU5NiAxMDA2NDQKLS0tIGEvcGRrcy9za3l3YXRlcjEzMC9jb21tb25fcGRuLnRjbAorKysgYi9wZGtzL3NreXdhdGVyMTMwL2NvbW1vbl9wZG4udGNsCkBAIC0xLDM2ICsxLDkgQEAKLSMjIyBQRE4gQ29uZmlnLiBBbGwgdW5pdHMgaW4gbWljcm9tZXRlciAodW0pCi0jIyBUaGUgdmFsdWVzIHVzZWQgaW4gdGhpcyBjb25maWcgYXJlIGZvciByZWZlcmVuY2Ugb25seSBhbmQgZG8gbm90IGNvcnJlc3BvbmQgdG8gYW55IHNwZWNpZmljIGZvdW5kcnkKLSMjIGRlc2lnbiBuYW1lIHRvIGJlIHVzZWQgaW4gREVGCi1zZXQgOjpkZXNpZ24gJDo6ZW52KERFU0lHTl9OQU1FKQotCi0jIyBERUYgREJVCi1zZXQgOjpkZWZfdW5pdHMgJDo6ZW52KERFRl9VTklUU19QRVJfTUFDUk9OKQotCi0jI0lucHV0IERFRiB3aXRoIG1hY3JvcyBwYWNrZWQKLXNldCA6OkZwT3V0RGVmICQ6OmVudihpb1BsYWNlcl90bXBfZmlsZV90YWcpLmRlZgotCi0jIyMjIGlucHV0IHRlY2ggbGVmIHBhdGgKLSNzZXQgOjp0ZWNoTGVmICQ6OmVudihURUNIX0xFRikKLQotIyMjIyBpbnB1dCBjZWxsIGxlZiBwYXRoCi1zZXQgOjpjZWxsTGVmIFtsaXN0ICQ6OmVudihNRVJHRURfTEVGKV0KLQotIyMjIyBpbnB1dCBmbGF0IGxlZiBwYXRoLiBGTEFUIExFRiB0aGF0IGNvbnRhaW5zIHBoeXNpY2FsIHZpZXdzIG9mIGFsbCBzdGFuZGFyZCBjZWxscyBhbmQgbWFjcm9zIGluIHRoZSBkZXNpZ24KLSMgRW5zdXJlIHRoYXQgdGhlIGZpbGUgZW5kcyB3aXRoIEVORCBMSUJSQVJZCi1zZXQgOjpmbGF0TGVmICQ6OmVudihNRVJHRURfTEVGKQotCi1zZXQgOjptYWNyb19wb3dlcl9waW5zICQ6OmVudihWRERfUElOKQotc2V0IDo6bWFjcm9fZ3JvdW5kX3BpbnMgJDo6ZW52KEdORF9QSU4pCi0KLSMjIyMgcGxhY2VtZW50IFNJVEUgbmFtZSBmcm9tIExFRgotc2V0IDo6c2l0ZV9uYW1lICQ6OmVudihQTEFDRV9TSVRFKQotc2V0IDo6c2l0ZV93aWR0aCAkOjplbnYoUExBQ0VfU0lURV9XSURUSCkKLQogIyBGbG9vcnBsYW4gaW5mb3JtYXRpb24gLSBjb3JlIGJvdW5kYXJ5IGNvb3JkaW5hdGVzLCBzdGQuIGNlbGwgcm93IGhlaWdodCwKICMgbWluaW11bSB0cmFjayBwaXRjaCBhcyBkZWZpbmVkIGluIExFRgogIwogCi1zZXQgY29yZWluZm8gW2pvaW4gW2V4ZWMgJDo6ZW52KFNDUklQVFNfRElSKS9leHRyYWN0X2NvcmVpbmZvLnNoICQ6OkZwT3V0RGVmXSAiICJdCitzZXQgOjpkZWZfdW5pdHMgJDo6ZW52KERFRl9VTklUU19QRVJfTUFDUk9OKQorc2V0IGNvcmVpbmZvIFtqb2luIFtleGVjICQ6OmVudihTQ1JJUFRTX0RJUikvZXh0cmFjdF9jb3JlaW5mby5zaCAkOjplbnYodGFwY2VsbF90bXBfZmlsZV90YWcpLmRlZl0gIiAiXQogIyBESUVBUkVBICggMCAwICkgKCA5MzkzMCA5MzkzMCApIDsKICMgUk9XIFJPV18wIHVuaXQgMCAwIEZTIERPIDE5NSBieSAxIFNURVAgNDgwIDAgOwogIyBST1cgUk9XXzI3IHVuaXQgMCA4OTkxMCBOIERPIDE5NSBieSAxIFNURVAgNDgwIDAgOwpAQCAtNDMsNjAgKzE2LDQzIEBACiBzZXQgOjpjb3JlX2FyZWFfdXJ4IFtleHByIHsgKFtsaW5kZXggJGNvcmVpbmZvIDZdKyRzdGVwKiRzaXRlc19wZXJfcm93KS9kb3VibGUoJDo6ZGVmX3VuaXRzKSB9XQogc2V0IDo6Y29yZV9hcmVhX3VyeSBbZXhwciB7IFtsaW5kZXggJGNvcmVpbmZvIDddL2RvdWJsZSgkOjpkZWZfdW5pdHMpIH1dCiAKLXNldCA6OmRpZV9hcmVhX2xseCBbZXhwciB7IFtsaW5kZXggJGNvcmVpbmZvIDBdL2RvdWJsZSgkOjpkZWZfdW5pdHMpIH1dCi1zZXQgOjpkaWVfYXJlYV9sbHkgW2V4cHIgeyBbbGluZGV4ICRjb3JlaW5mbyAxXS9kb3VibGUoJDo6ZGVmX3VuaXRzKSB9XQotc2V0IDo6ZGllX2FyZWFfdXJ4IFtleHByIHsgW2xpbmRleCAkY29yZWluZm8gMl0vZG91YmxlKCQ6OmRlZl91bml0cykgfV0KLXNldCA6OmRpZV9hcmVhX3VyeSBbZXhwciB7IFtsaW5kZXggJGNvcmVpbmZvIDNdL2RvdWJsZSgkOjpkZWZfdW5pdHMpIH1dCitwdXRzICIoJDo6Y29yZV9hcmVhX2xseCAkOjpjb3JlX2FyZWFfbGx5KSAoJDo6Y29yZV9hcmVhX3VyeCAkOjpjb3JlX2FyZWFfdXJ5KSIKIAotc2V0IDo6cm93X2hlaWdodCAkOjplbnYoUExBQ0VfU0lURV9IRUlHSFQpCitzZXQgOjpoYWxvIDQKKworIyBQT1dFUiBvciBHUk9VTkQgI1N0ZC4gY2VsbCByYWlscyBzdGFydGluZyB3aXRoIHBvd2VyIG9yIGdyb3VuZCByYWlscyBhdCB0aGUgYm90dG9tIG9mIHRoZSBjb3JlIGFyZWEKK3NldCA6OnJhaWxzX3N0YXJ0X3dpdGggIlBPV0VSIiA7CisKKyMgUE9XRVIgb3IgR1JPVU5EICNVcHBlciBtZXRhbCBzdHJpcGVzIHN0YXJ0aW5nIHdpdGggcG93ZXIgb3IgZ3JvdW5kIHJhaWxzIGF0IHRoZSBsZWZ0L2JvdHRvbSBvZiB0aGUgY29yZSBhcmVhCitzZXQgOjpzdHJpcGVzX3N0YXJ0X3dpdGggIlBPV0VSIiA7CisKKwogCiAjIFBvd2VyIG5ldHMKIHNldCA6OnBvd2VyX25ldHMgIlZERCIKIHNldCA6Omdyb3VuZF9uZXRzICJWU1MiCiAKLXNldCA6Om1hY3JvX2Jsb2NrYWdlX2xheWVyX2xpc3QgIiIKKyMjIFBETiBTVFJBVEVHWToKIAotIyBEZXRhaWxzIGZyb20gdGVjaGxlZiAoQkVPTCBMRUYpCi1zZXQgOjptZXRfbGF5ZXJfbGlzdCAibWV0MSBtZXQyIG1ldDMgbWV0NCBtZXQ1IiAgOyNGcm9tIG1ldDEgYW5kIHVwd2FyZHMKLXNldCA6Om1ldF9sYXllcl9kaXIgICJob3IgdmVyIGhvciB2ZXIgaG9yIgorI3NldCA6OnJvd19oZWlnaHQgJDo6ZW52KFBMQUNFX1NJVEVfSEVJR0hUKQogCi0jIEVuc3VyZSBwaXRjaGVzIHdpbGwgbWFrZSB0aGUgc3RyaXBlcyBmYWxsIG9uIHRyYWNrCi0jIEVuc3VyZSBvZmZzZXRzIHdpbGwgbWFrZSB0aGUgc3RyaXBlcyBmYWxsIG9uIHRyYWNrCi0KLXBkbiBzcGVjaWZ5X2dyaWQgc3RkY2VsbCBbbGlzdCBcCi0gICAgbGF5ZXJzICAgICJtZXQxIG1ldDQgbWV0NSIgXAotICAgIGRpciAgICAgICAiaG9yIHZlciBob3IiIFwKLSAgICB3aWR0aHMgICAgIjAuMTQgMC4zIDEuNiIgXAotICAgIHBpdGNoZXMgICAiJDo6cm93X2hlaWdodCAkOjplbnYoRlBfUEROX1ZQSVRDSCkgJDo6ZW52KEZQX1BETl9IUElUQ0gpIiBcCi0gICAgbG9mZnNldCAgICIwICQ6OmVudihGUF9QRE5fVk9GRlNFVCkgMCIgXAotICAgIGJvZmZzZXQgICAiMCAwICQ6OmVudihGUF9QRE5fSE9GRlNFVCkiIFwKLSAgICBjb25uZWN0ICAgInttZXQxIG1ldDR9IHttZXQ0IG1ldDV9IiBcCi0gICAgdmlhcyAgICAgICJNMU0yX1BSIE0yTTNfUFIgTTNNNF9QUiBNNE01X1BSIiBcCi1dCi0KLSNwZG4gc3BlY2lmeV9ncmlkIG1hY3JvIFtsaXN0IFwKLSMgICAgbGF5ZXJzICAgICJNNiIgXAotIyAgICBkaXIgICAgICAgInZlciIgXAotIyAgICB3aWR0aHMgICAgIjAuOTMiIFwKLSMgICAgcGl0Y2hlcyAgICI0MCIgXAotIyAgICBsb2Zmc2V0ICAgMiBcCi0jICAgIGJvZmZzZXQgICAwIFwKLSMgICAgbWluX3BpdGNoIDAuMiBcCi0jICAgIGNvbm5lY3QgICAie000X1BJTl9ob3IgTTZ9IHtNNiBNN30iIFwKLSMgICAgdmlhcyAgICAgICJWSUExX1JVTEVfMSBWSUEyX1JVTEVfMSBWSUEzX1JVTEVfMSBWSUE0X1JVTEVfMjkzIFZJQTVfUlVMRV8zNjAgVklBNl9SVUxFXzIxIFZJQTdfUlVMRV8xOCBWSUE4X1JVTEVfMSIgXAotI10KLSNzZXQgOjpoYWxvIDQKLQotIyBNZXRhbCBsYXllciBmb3IgcmFpbHMgb24gZXZlcnkgcm93Ci1zZXQgOjpyYWlsc19tbGF5ZXIgIm1ldDEiIDsKLQotIyBQT1dFUiBvciBHUk9VTkQgI1N0ZC4gY2VsbCByYWlscyBzdGFydGluZyB3aXRoIHBvd2VyIG9yIGdyb3VuZCByYWlscyBhdCB0aGUgYm90dG9tIG9mIHRoZSBjb3JlIGFyZWEKLXNldCA6OnJhaWxzX3N0YXJ0X3dpdGggIkdST1VORCIgOwotCi0jIFBPV0VSIG9yIEdST1VORCAjVXBwZXIgbWV0YWwgc3RyaXBlcyBzdGFydGluZyB3aXRoIHBvd2VyIG9yIGdyb3VuZCByYWlscyBhdCB0aGUgbGVmdC9ib3R0b20gb2YgdGhlIGNvcmUgYXJlYQotc2V0IDo6c3RyaXBlc19zdGFydF93aXRoICJHUk9VTkQiIDsKLQotcHJvYyBnZW5lcmF0ZV92aWFydWxlcyB7fSB7CitwZG4gc3BlY2lmeV9ncmlkIHN0ZGNlbGwgeworICAgIHJhaWxzIG1ldDEKKyAgICBsYXllcnMgeworICAgICAgICBtZXQxIHt3aWR0aCAwLjE0IHBpdGNoICAzLjMzIG9mZnNldCAwLjA3fSAKKyAgICAgICAgbWV0NCB7d2lkdGggMC4zIHBpdGNoIDE1My42IG9mZnNldCAxNi4zMn0KKyAgICAgICAgbWV0NSB7d2lkdGggMS42IHBpdGNoIDE1My42IG9mZnNldCAxNi42NX0KKyAgICB9CisgICAgY29ubmVjdCB7e21ldDEgbWV0NH0ge21ldDQgbWV0NX19CiB9CiAKLWNkICQ6OmVudihUTVBfRElSKS9mbG9vcnBsYW4KK3BkbiBzcGVjaWZ5X2dyaWQgbWFjcm8geworICAgIG9yaWVudCB7TiBGTiBTIEZTIEUgRkUgVyBGV30KKyAgICBwb3dlcl9waW5zICIkOjplbnYoVkREX1BJTikiCisgICAgZ3JvdW5kX3BpbnMgIiQ6OmVudihHTkRfUElOKSIKKyAgICBibG9ja2FnZXMgImxpMSBtZXQxIG1ldDIiCisgICAgbGF5ZXJzIHsKKyAgICAgICAgbWV0MyB7d2lkdGggMC4zMzMgcGl0Y2ggNDAuMjkzIG9mZnNldCAyfQorICAgIH0gCisgICAgY29ubmVjdCB7e21ldDJfUElOX3ZlciBtZXQzfSB7bWV0MyBtZXQ1fX0KK30KZGlmZiAtLWdpdCBhL3Bka3Mvc2t5d2F0ZXIxMzAvc2NzOGxwL2xlZi9tZXJnZWQubGVmIGIvcGRrcy9za3l3YXRlcjEzMC9zY3M4bHAvbGVmL21lcmdlZC5sZWYKaW5kZXggNGYzNTdmNy4uN2UyOGViNCAxMDA2NDQKLS0tIGEvcGRrcy9za3l3YXRlcjEzMC9zY3M4bHAvbGVmL21lcmdlZC5sZWYKKysrIGIvcGRrcy9za3l3YXRlcjEzMC9zY3M4bHAvbGVmL21lcmdlZC5sZWYKQEAgLTE3LDE4ICsxNywxOCBAQAogCiAjIyMjIGVuZCBvZiBoZWFkZXIgc2VjdGlvbiAgIyMjIyMjIwogCi1TSVRFIHVuaXRoZAotICAgIFNZTU1FVFJZIFkgIDsKLSAgICBDTEFTUyBDT1JFICA7Ci0gICAgU0laRSAgMC40NjAgQlkgMi43MjAgOwotRU5EIHVuaXRoZAotCiBTSVRFIHVuaXQKICAgICBTWU1NRVRSWSBZICA7CiAgICAgQ0xBU1MgQ09SRSAgOwogICAgIFNJWkUgIDAuNDgwIEJZIDMuMzMwIDsKIEVORCB1bml0CiAKK1NJVEUgdW5pdGhkCisgICAgU1lNTUVUUlkgWSAgOworICAgIENMQVNTIENPUkUgIDsKKyAgICBTSVpFICAwLjQ2MCBCWSAyLjcyMCA7CitFTkQgdW5pdGhkCisKIFNJVEUgdW5pdGh2CiAgICAgU1lNTUVUUlkgWSAgOwogICAgIENMQVNTIENPUkUgIDsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuLy5kb2NrZXJpZ25vcmUgYi9zY3JpcHRzL3Bkbi8uZG9ja2VyaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MTNmYmYKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL3Bkbi8uZG9ja2VyaWdub3JlCkBAIC0wLDAgKzEsMTAgQEAKKy5naXQKK0RvY2tlcmZpbGUKKy5kb2NrZXJpZ25vcmUKKy5naXRpZ25vcmUKKworIyBmcm9tIC5naXRpZ25vcmUgZmlsZQorKi5kZWYKKyoubGVmCisqLmxpYgorKi52ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vLmdpdGlnbm9yZSBiL3NjcmlwdHMvcGRuLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFkNjAyZQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvcGRuLy5naXRpZ25vcmUKQEAgLTAsMCArMSwxMSBAQAorKi5kZWYKKyoubGVmCisqLmxpYgorKi52CisqLm9kYgorZHVtbXkuZ3VpZGUKK21hY3JvY2VsbC5saXN0CitwaW5fZHVtcGVyLmxvZworcnVuLnBhcmFtCitzcmMvUGRuUGluRHVtcGVyL2J1aWxkCisKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuLy5naXRtb2R1bGVzIGIvc2NyaXB0cy9wZG4vLmdpdG1vZHVsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwZTJlNAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvcGRuLy5naXRtb2R1bGVzCkBAIC0wLDAgKzEsMyBAQAorW3N1Ym1vZHVsZSAibW9kdWxlL09wZW5EQiJdCisJcGF0aCA9IG1vZHVsZS9PcGVuREIKKwl1cmwgPSBodHRwczovL2dpdGh1Yi5jb20vVGhlLU9wZW5ST0FELVByb2plY3QvT3BlbkRCLmdpdApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vYXBwbHlfcGRuLnRjbCBiL3NjcmlwdHMvcGRuL2FwcGx5X3Bkbi50Y2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYwMzkyNQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvcGRuL2FwcGx5X3Bkbi50Y2wKQEAgLTAsMCArMSwxOCBAQAoraWYgeyAkOjphcmdjID4gMCB9IHsKKwlzZXQgUEROX0NGRyBbbGluZGV4ICQ6OmFyZ3YgMF0KK30gZWxzZSB7CisJcHV0cyAibm8gY29tbWFuZCBsaW5lIGFyZ3VtZW50IHBhc3NlZCIKKwlleGl0Cit9CitzZXQgZGlyICQ6OmVudihTQ1JJUFRTX0RJUikvcGRuL3NyYy9zY3JpcHRzCitzb3VyY2UgJGRpci9wa2dJbmRleC50Y2wKKworcGFja2FnZSByZXF1aXJlIHBkbgorCitzZXQgZGIgW2RiRGF0YWJhc2VfY3JlYXRlXQorb2RiX2ltcG9ydF9kYiAkZGIgJDo6ZW52KHBkbl90bXBfZmlsZV90YWcpLm9kYgorCitzZXQgYmxvY2sgW1skZGIgZ2V0Q2hpcF0gZ2V0QmxvY2tdCitwZG4gYXBwbHkgJGJsb2NrICRQRE5fQ0ZHCisKK29kYl93cml0ZV9kZWYgJGJsb2NrICQ6OmVudihwZG5fcmVzdWx0X2ZpbGVfdGFnKS5kZWYgREVGXzVfNgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vZG9jL1BETi5tZCBiL3NjcmlwdHMvcGRuL2RvYy9QRE4ubWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YjkwMDcuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vZG9jL1BETi5tZAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0jIEVsZW1lbnRzIG9mIGEgY29uZmlndXJhdGlvbiBmaWxlCi0KLUEgY29uZmlndXJhdGlvbiBmaWxlIGZvciBhcHBseV9wZG4gY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBwYXJ0cwotMS4gR2xvYmFsIHZhcmlhYmxlIGRlZmluaXRpb25zCi0xLiBDYWxsIGEgVENMIHByb2NlZHVyZSB0byBjcmVhdGUgZ3JpZCBzcGVjaWZpY2F0aW9ucwotMS4gRGVmaW5lIGEgVENMIHByb2NlZHVyZSB0byB3cml0ZSBvdXQgdGhlIHJlcXVpcmVkIHNldCBvZiBWSUFzCi0KLSMjIFJlcXVpcmVkIEdsb2JhbCBWYXJpYWJsZXMKLUdsb2JhbCB2YXJpYWJsZXMgYXJlIHByZWZpeGVkIGJ5IGBgYDo6YGBgIGFuZCBmb3JjZSB0aGUgdmFyaWFibGUgdG8gYmUgZGVjbGFyZWQgaW4gdGhlIGdsb2JhbCBzY29wZSwgcmF0aGVyIHRoYW4gdGhlIGxvY2FsIHNjb3BlLiBUaGlzIG1ha2UgdGhlIHZhbHVlcyBvZiB0aGVzZSB2YXJpYWJsZXMgYXZhaWxhYmxlIGV2ZXJ5d2hlcmUgaW4gdGhlIFRDTCBjb2RlLgotVGhlIGBgYGFwcGx5X3BkbmBgYCBjb21tYW5kIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgZ2xvYmFsIHZhcmlhYmxlcyB0byBleGlzdAotCi18IFZhcmlhYmxlIE5hbWUgfCBEZXNjcmlwdGlvbiB8Ci18Oi0tLXw6LS0tfAotfCAgYGBgOjpkZXNpZ25gYGAgfCAgTmFtZSBvZiB0aGUgZGVzaWduIHwKLXwgIGBgYDo6ZGVmX3VuaXRzYGBgIHwgTnVtYmVyIG9mIGRhdGFiYXNlIHVuaXQgdGhhdCBtYWtlIDEgbWljcm9uIHwKLXwgYGBgOjpGcE91dERlZmBgYCB8IE5hbWUgb2YgdGhlIGZsb29ycGxhbiBERUYgY29udGFpbmluZyBtYWNybyBhbmQgcGluIHBsYWNlbWVudCB8Ci18IGBgYDo6ZmxhdExlZmBgYCB8IEZpbGUgY29udGFpbmluZyB0ZWNobm9sb2d5IGFuZCBsaWJyYXJ5IGNlbGwgZGF0YSB8Ci18IGBgYDo6bWFjcm9fcG93ZXJfcGluc2BgYCB8IExpc3Qgb2YgbmFtZXMgb2YgcG93ZXIgcGlucyBvbiBtYWNyb3MgfAotfCBgYGA6Om1hY3JvX2dyb3VuZF9waW5zYGBgIHwgTGlzdCBvZiBuYW1lcyBvZiBncm91bmQgcGlucyBvbiBtYWNyb3MgfAotfCBgYGA6OnNpdGVfbmFtZWBgYCB8IE5hbWUgb2YgdGhlIHN0ZGNlbGwgc2l0ZSAgfAotfCBgYGA6OnNpdGVfd2lkdGhgYGAgfCBXaWR0aCBvZiB0aGUgc3RkY2VsbCBzaXRlIHwKLXwgYGBgOjpyb3dfaGVpZ2h0YGBgIHwgSGVpZ2h0IG9mIGEgc3RkY2VsbCByb3cgfAotfCBgYGA6OmNvcmVfYXJlYV9sbHhgYGAgfCBDb3JlIGFyZWEgbGx4IHwKLXwgYGBgOjpjb3JlX2FyZWFfbGx5YGBgIHwgQ29yZSBhcmVhIGxseSB8Ci18IGBgYDo6Y29yZV9hcmVhX3VyeGBgYCB8IENvcmUgYXJlYSB1cnggfAotfCBgYGA6OmNvcmVfYXJlYV91cnlgYGAgfCBDb3JlIGFyZWEgdXJ5IHwKLXwgYGBgOjpkaWVfYXJlYV9sbHhgYGAgfCBEaWUgYXJlYSBsbHggfAotfCBgYGA6OmRpZV9hcmVhX2xseGBgYCB8IERpZSBhcmVhIGxseSB8Ci18IGBgYDo6ZGllX2FyZWFfbGx4YGBgIHwgRGllIGFyZWEgdXJ4IHwKLXwgYGBgOjpkaWVfYXJlYV9sbHhgYGAgfCBEaWUgYXJlYSB1cnkgfAotfCBgYGA6OnBvd2VyX25ldHNgYGAgfCBOYW1lIG9mIHRoZSBwb3dlciBuZXQgfAotfCBgYGA6Omdyb3VuZF9uZXRzYGBgIHwgTmFtZSBvZiB0aGUgZ3JvdW5kIG5ldCB8Ci18IGBgYDo6bWFjcm9fYmxvY2thZ2VfbGF5ZXJfbGlzdGBgYCB8IExpc3Qgb2YgbWV0YWwgbGF5ZXIgbmFtZXMgYmxvY2tlZCBieSBtYWNyb3MgfAotfCBgYGA6Om1ldF9sYXllcl9saXN0YGBgIHwgTGlzdCBvZiBtZXRhbCBsYXllciBuYW1lcyAtIGJvdHRvbSB0byB0b3AgfAotfCBgYGA6Om1ldF9sYXllcl9kaXJgYGAgfCBMaXN0IG9mIHByZWZlcnJlZCBkaXJlY3Rpb24gZm9yIHRoZSBsYXllciBuYW1lcyAtIGJvdHRvbSB0byB0b3AgfAotfCBgYGA6OnJhaWxzX21sYXllcmBgYCB8IExheWVyIHVzZWQgYXMgc3RkY2VsbCByYWlsIHwKLXwgYGBgOjpyYWlsc19zdGFydF93aXRoYGBgIHwgUE9XRVJcfEdST1VORCB8Ci18IGBgYDo6c3RyaXBlc19zdGFydF93aXRoYGBgIHwgUE9XRVJcfEdST1VORCB8Ci0KLSMjIE9wdGlvbmFsIEdsb2JhbCBWYXJpYWJsZXMKLQotfCBWYXJpYWJsZSBOYW1lIHwgRGVzY3JpcHRpb24gfAotfC0tLXw6LS0tfAotfCBgYGA6OmhhbG9gYGAgfCBIYWxvIHRvIGFwcGx5IGFyb3VuZCBtYWNyb3MuIFNwZWNpZnkgb25lLCB0d28gb3IgZm91ciB2YWx1ZXMuIElmIGEgSEFMTyBpcyBkZWZpbmVkIGluIHRoZSBmbG9vcnBsYW4gREVGLCB0aGVuIHRoaXMgd2lsbCBiZSBpZ25vcmVkLiB8Ci0KLQotIyMgQ2FsbCBUQ0wgcHJvY2VkdXJlCi1BIHNldCBvZiBwb3dlciBncmlkIHNwZWNpZmljYXRpb25zIGFyZSBwcm92aWRlZCBieSBjYWxsaW5nIHRoZSBgYGBwZG4gc3BlY2lmeV9ncmlkYGBgIGNvbW1hbmQuIAotQXQgbGVhc3Qgb25lIHBvd2VyIGdyaWQgc3BlY2lmaWNhdGlvbiBtdXN0IGJlIGRlZmluZWQuCi0KLVRoZSBjb21tYW5kIGhhcyB0aGUgZm9sbG93aW5nIGZvcm0KLQotYGBgVENMCi1wZG4gc3BlY2lmeV9ncmlkIChzdGRjZWxsfG1hY3JvKSA8c3BlY2lmaWNhdGlvbj4KLWBgYAotCi1XaGVyZSBzcGVjaWZpY2F0aW9uIGlzIGEgbGlzdCBvZiBrZXkgdmFsdWUgcGFpcnMKLQotfCBLZXkgfCBEZXNjcmlwdGlvbiB8Ci18Oi0tLXw6LS0tfAotfCBgYGBsYXllcnNgYGAgfCBMaXN0IG9mIGxheWVycyBvbiB3aGljaCB0byBkcmF3IHN0cmlwZXMgfAotfCBgYGBkaXJgYGAgfCBMaXN0IG9mIGRpcmVjdGlvbnMgb2YgbGF5ZXJzIHwKLXwgYGBgd2lkdGhzYGBgIHwgTGlzdCBvZiB3aWR0aCBvZiBzdHJpcGVzICB8Ci18IGBgYHBpdGNoZXNgYGAgfCBMaXN0IG9mIHBpdGNoZXMgb2Ygc3RyaXBlcyB8Ci18IGBgYGxvZmZzZXRgYGAgfCBMaXN0IG9mIGxlZnQgaGFuZCBvZmZzZXRzIG9mIHN0cmlwZXMgfAotfCBgYGBib2Zmc2V0YGBgIHwgTGlzdCBvZiBib3R0b20gb2Zmc2V0cyBvZiBzdHJpcGVzIHwKLXwgYGBgY29ubmVjdGBgYCB8IExpc3Qgb2YgY29ubmVjdGlvbnMgdG8gYmUgbWFkZSBiZXR3ZWVuIGxheWVycyB8Ci18IGBgYHZpYXNgYGAgfCBMaXN0IG9mIHZpYXMgdG8gdXNlIHRvIGNvbm5lY3QgbGF5ZXJzIC0gbWF0Y2ggOjptZXRfbGF5ZXJfbGlzdCB8Ci18IGBgYGluc3RhbmNlYGBgIHwgIHwKLXwgYGBgbWFjcm9gYGAgfCAgfAotCi1UaGUgbGlzdHMgZm9yIGRpciwgd2lkdGhzLCBwaXRjaGVzLCBsb2Zmc2V0LCBib2Zmc2V0IG11c3QgYWxsIGJlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgbGlzdCBmb3IgbGF5ZXJzCi1zdWNoIHRoYXQgdGhlIG50aCBlbGVtZW50IGluIHRoZSBsaXN0IGdpdmVzIHRoZSB2YWx1ZXMgZm9yIHRoZSBsYXllciB3aG9zZSBuYW1lIGlzIGFsc28gbnRoIGluIHRoZQotbGlzdCBvZiBsYXllcnMKLQotVGhlIGtleSBjb25uZWN0IHNwZWNpZmllcyB0d28gbGF5ZXJzIHRvIGJlIGNvbm5lY3RlZCB0b2dldGhlciB3aGVyZSB0aGUgc3RyaXBlcyB0aGUgc2FtZSBuZXQgb2YgdGhlIGZpcnN0IGxheWVyIAotb3ZlcmxhcHMgd2l0aCBzdHJpcGVzIG9mIHRoZSBzZWNvbmQgbGF5ZXIKLQotTWFjcm8gcGlucyBhcmUgZXh0cmFjdGVkIGZyb20gdGhlIExFRi9ERUYgYW5kIGFyZSBzcGVjaWZpZWQgb24gYSBsYXllciBjYWxsZWQgYGBgXDxsYXllcl9uYW1lPl9QSU5fXDxkaXI+YGBgLCB3aGVyZSBgYGBcPGxheWVyX25hbWU+YGBgCi1pcyB0aGUgbmFtZSBvZiB0aGUgbGF5ZXIgYXMgc3BlY2lmaWVkIGluIDo6bWV0X2xheWVyX2xpc3QsIGFuZCAnJydcPGRpcj5gYGAgaXMgaG9yIHRvIGluZGljYXRlIGhvcml6b250YWwgcGlucyBpbiB0aGUgZmxvb3JwbGFuIGFuZCBpcyAKLWBgYHZlcmBgYCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwaW5zIGFyZSBvcmllbnRlZCB2ZXJ0aWNhbGx5IGluIHRoZSBmbG9vcnBsYW4uCi0KLVRoZSBrZXkgdmlhcyBjb250YWlucyBhIGxpc3Qgb2YgdmlhcyB0byBiZSB1c2VkIHRvIGNvbm5lY3QgdG8gdGhlIG5leHQgaGlnaGVyIGxheWVyLiBUaGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgCi1saXN0IGlzIGZvciBNMSB0byBNMiBWSUFzLCB0aGUgc2Vjb25kIGVsZW1lbnQgZm9yIE0yIHRvIE0zIHZpYXMgZXRjLiBIZW5jZSwgdGhpcyBsaXN0IHNob3VsZCBiZSAxIGVsZW1lbnQgc2hvcnRlcgotdGhhbiB0aGUgbGlzdCA6Om1ldF9sYXllcl9saXN0Ci0KLUEgc2VwYXJhdGUgZ3JpZCBpcyBidWlsdCBmb3IgZWFjaCBtYWNyby4gVGhlIGxpc3Qgb2YgbWFjcm8gc3BlY2lmaWNhdGlvbiBzdGhhdCBoYXZlIGJlZW4gZGVmaW5lZCBhcmUgc2VhcmNoZWQgdG8gCi1maW5kIGEgc3BlY2lmaWNhdGlvbiB3aXRoIGEgbWF0Y2luZyBpbnN0YW5jZSBuYW1lIGtleSwgZmFpbGluZyB0aGF0IGEgbWFjcm8gc3BlY2lmaWNhdGlvbiB3aXRoIGEgbWF0Y2hpbmcgbWFjcm8gbmFtZSBrZXksIAotb3IgZWxzZSB0aGUgZmlyc3Qgc3BlY2lmaWNhdGlvbiB3aXRoIG5laXRoZXIgYW4gaW5zdGFuY2Ugb3IgbWFjcm8ga2V5IGlzIHVzZWQuCi0KLSMjIyBFeGFtcGxlcyBvZiBncmlkIHNwZWNpZmljYXRpb25zCi0KLTEuIFN0ZGNlbGwgZ3JpZCBzcGVjaWZpY2F0aW9uCi1gYGBUQ0wKLXBkbiBzcGVjaWZ5X2dyaWQgc3RkY2VsbCB7Ci0gICAgbGF5ZXJzICAgICJNMSBNNCBNNyIgCi0gICAgZGlyICAgICAgICJob3IgdmVyIGhvciIgCi0gICAgd2lkdGhzICAgICIwLjY0IDAuOTMgMC45MyIgCi0gICAgcGl0Y2hlcyAgICIyLjQwIDQwLjAgNDAuMCIgCi0gICAgbG9mZnNldCAgICIwIDIgMiIgCi0gICAgYm9mZnNldCAgICIwIDIgMiIgCi0gICAgY29ubmVjdCAgICJ7TTEgTTR9IHtNNCBNN30iIAotICAgIHZpYXMgICAgICAiVklBMV9SVUxFXzEgVklBMl9SVUxFXzEgVklBM19SVUxFXzEgVklBNF9SVUxFXzEgVklBNV9SVUxFXzI2NCBWSUE2X1JVTEVfMTggVklBN19SVUxFXzE4IFZJQThfUlVMRV8xIgotfQotYGBgCi1UaGlzIHNwZWNpZmljYXRpb24gYWRkcyBhIGdyaWQgb3ZlciB0aGUgc3RkY2VsbCBhcmVhLCB3aXRoIGFuIE0xIGhvcml6b250YWwgZm9sbG93cGluIHdpZHRoIG9mIDAuNjQsY29ubmVjdGluZyB0byAKLU00IHZlcnRpY2FsIHN0cmlwZXMgb2YgMC45MyBldmVyeSA0MC4wLCBjb25uZWN0aW5nIGluIHR1cm4gdG8gaG9yaXpvbnRhbCBNNyBzdHJpcGVzLCBhbHNvIDAuOTMgd2lkZSBhbmQgNDAuMCBwaXRjaAotCi0yLiBNYWNybyBncmlkIHNwZWNpZmljYXRpb24KLWBgYFRDTAotcGRuIHNwZWNpZnlfZ3JpZCBtYWNybyB7Ci0gICAgbGF5ZXJzICAgICJNNiIgCi0gICAgZGlyICAgICAgICJ2ZXIiCi0gICAgd2lkdGhzICAgICIwLjkzIgotICAgIHBpdGNoZXMgICAiNDAiIAotICAgIGxvZmZzZXQgICAyIAotICAgIGJvZmZzZXQgICAwIAotICAgIGNvbm5lY3QgICAie000X1BJTl9ob3IgTTZ9IHtNNiBNN30iCi0gICAgdmlhcyAgICAgICJWSUExX1JVTEVfMSBWSUEyX1JVTEVfMSBWSUEzX1JVTEVfMSBWSUE0X1JVTEVfMjkzIFZJQTVfUlVMRV8zNjAgVklBNl9SVUxFXzIxIFZJQTdfUlVMRV8xOCBWSUE4X1JVTEVfMSIKLX0KLWBgYAotCi1JZiB0aGlzIHRoZSBvbmx5IG1hY3JvIGdyaWQgc3BlY2lmaWNhdGlvbiBkZWZpbmVkLCB0aGVuIGl0IHdpbGwgYmUgYXBwbGllZCBvdmVyIGFsbCB0aGUgbWFjcm9zIGluIHRoZSBkZXNpZ24uCi0KLUFsbCBob3Jpem9udGFsIE00IHBpbnMgb24gdGhlIG1hY3JvcyBhcmUgY29ubmVjdGVkIHRvIHZlcnRpY2FsIE02LCB3aGljaCBpcyB0aGVuIGNvbm5lY3RlZCB0byBob3Jpem9udGFsIE03LiBJbiB0aGlzIHdheSBtYWNyb3MgdGhhdAotaGF2ZSB0aGVpciBwaW5zIG9yaWVudGVkIGluIG5vbi1wcmVmZXJyZWQgcm91dGluZyBkaXJlY3Rpb25zIGNhbiBzdGlsbCBiZSBjb25uZWN0ZWQgdXAgdG8gdGhlIHBvd2VyIGdyaWQuCi0KLSMjIERlZmluZSBUQ0wgUHJvY2VkdXJlCi1BIGZ1bmN0aW9uIGNhbGwgZ2VuZXJhdGVfdmlhcyBtdXN0IGJlIGNyZWF0ZWQgdGhhdCB3cml0ZXMgb3V0IGEgZGVmaW5pdGlvbiBvZiBWSUFzIHRoYXQgYXJlIHJlZmVyZW5jZWQgYnkgdGhlIGdyaWQgc3BlY2ZpY2F0aW9ucywgYnV0IGRvIG5vdCBhbHJlYWR5IGV4aXN0IGluIHRoZSB0ZWNobm9sb2d5IExFRi4KLQotSXQgaXMgdW5saWtlbHkgdGhhdCB0aGUgVklBcyBuZWVkZWQgdG8gY29ubmVjdCB0aGUgbGF5ZXJzIG9mIHRoZSBwb3dlciBncmlkIHdpbGwgYWxyZWFkeSBleGlzdCBpbiB0aGUgdGVjaG5vbG9neSBMRUYuIFRoZSB0ZWNobm9sb2d5IExFRiBwcm92aWRlcyBhIG1lY2hhbmlzbSB0byBjcmVhdGUgVklBcyB1c2luZyBWSUFSVUxFUy4gVklBcyByZWZlcmVuY2VkIGluIHRoZSBncmlkIHNwZWNpZmljYXRpb25zIHRoYXQgZG8gbm90IGFscmVhZHkgZXhpc3QgaW4gdGhlIHRlY2hub2xvZ3kgZmlsZSBhcmUgbXVzdCBiZSBjcmVhdGVkIHVzaW5nIGF2YWlsYWJsZSBWSUFSVUxFcy4gCi0KLVRoZSBmdW5jdGlvbiBjYWxscyB0aGUgYGBgcGRuIGRlZl9vdXRgYGAgZnVuY3Rpb24gdG8gd3JpdGUgREVGIGZvciB0aGUgcmVxdWlyZWQgVklBcy4KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vZG9jL1JFQURNRS5tZCBiL3NjcmlwdHMvcGRuL2RvYy9SRUFETUUubWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYzJhMGUuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vZG9jL1JFQURNRS5tZAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMgT3BlblJPQUQtcGRuDQotDQotVGhpcyB1dGlsaXR5IGFpbXMgdG8gc2ltcGxpZnkgdGhlIHByb2Nlc3Mgb2YgYWRkaW5nIGEgcG93ZXIgZ3JpZCBpbnRvIGEgZmxvb3JwbGFuLiBUaGUgYWltIGlzIHRvIHNwZWNpZnkgYSBzbWFsbCBzZXQgb2YgcG93ZXIgZ3JpZCBwb2xpY2llcyB0byBiZSBhcHBsaWVkIHRvIHRoZSBkZXNpZ24sIHN1Y2ggYXMgbGF5ZXJzIHRvIHVzZSwgc3RyaXBlIHdpZHRoIGFuZCBzcGFjaW5nLCB0aGVuIGhhdmUgdGhlIHV0aWxpdHkgZ2VuZXJhdGUgdGhlIGFjdHVhbCBtZXRhbCBzdHJhcHMuIEdyaWQgcG9saWNpZXMgY2FuIGJlIGRlZmluZWQgb3ZlciB0aGUgc3RkY2VsbCBhcmVhLCBhbmQgb3ZlciBhcmVhcyBvY2N1cGllZCBieSBtYWNyb3MuDQotDQotIyMgSW5zdGFsbGF0aW9uIGFuZCBTZXR1cA0KLQ0KLVRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgZm9sbG93aW5nIHN1YmRpcmVjdG9yaWVzDQotKiBzcmMvIGNvbnRhaW5pbmcgc291cmNlIGNvZGUgYW5kIGV4ZWN1dGFibGVzIHRvIHJ1biBwb3dlciBncmlkIGluc2VydGlvbg0KLSogZG9jLyBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIGFuZCBleGFtcGxlcw0KLQ0KLVRvIHVzZSB0aGUgc3JjL3NjcmlwdHMgZGlyZWN0b3J5IG11c3QgYmUgYWRkZWQgdG8gdGhlIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUsIGFuZCB0byB0aGUgVENMTElCUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSAoYSBzcGFjZSBkZWxpbWl0ZWQgbGlzdCBvZiBkaXJlY3RvcmllcykNCi0NCi1gYGANCi0lIHNldGVudiBQQVRIICIke1BBVEh9OjxwZG5EaXI+L3NyYy9zY3JpcHRzIg0KLSUgc2V0ZW52IFRDTExJQlBBVEggIiRUQ0xMSUJQQVRIIDxwZG5EaXI+L3NyYy9zY3JpcHRzIg0KLWBgYA0KLQ0KLXdoZXJlIFw8cGRuRGlyPiBpcyB0aGUgcGF0aCB0byB3aGVyZSB0aGUgaW5zdGFsbGF0aW9uIGNhbiBiZSBmb3VuZC4NCi0gDQotIyMgVXNhZ2UNCi0NCi1gYGANCi0lIGFwcGx5X3BkbiA8Y29uZmlndXJhdGlvbl9maWxlPg0KLWBgYA0KLQ0KLUFsbCBpbnB1dHMgYW5kIHBvd2VyIGdyaWQgcG9saWNpZXMgYXJlIHNwZWNpZmllZCBpbiBhIFRDTCBmb3JtYXQgXDxjb25maWd1cmF0aW9uIGZpbGU+IA0KLQ0KLWUuZy4NCi0NCi1gYGANCi0lIGFwcGx5X3BkbiBQRE4uY2ZnDQotYGBgDQotDQotIyMgQ29uZmlnIEZpbGUNCi0NCi1Gb3IgZnVydGhlciBpbmZvcm1hdGlvbiBvbiB0aGUgY29uZmlnIGZpbGUsIGFuZCB0byByZXZpZXcgYW4gZXhhbXBsZSBjb25maWcgc2VlIHRoZSBmb2xsb3dpbmc6DQotDQotKiBbUEROLm1kXShQRE4ubWQpDQotKiBbZXhhbXBsZV9QRE4uY2ZnXShleGFtcGxlX1BETi5jZmcpDQotDQotIyMgQXNzdW1wdGlvbnMgYW5kIExpbWl0YXRpb25zDQotDQotQ3VycmVudGx5IHRoZSBmb2xsb3dpbmcgYXNzdW1wdGlvbnMgYXJlIG1hZGU6DQotDQotMS4gVGhlIGRlc2lnbiBpcyByZWN0YW5ndWxhcg0KLTEuIFRoZSBpbnB1dCBmbG9vcnBsYW4gZGVmIGZpbGUgZGVmaW5lcyB0aGUgc2l6ZSBvZiB0aGUgZGVzaWduLCBpbmNsdWRlcyB0aGUgcGxhY2VtZW50IG9mIGFsbCBtYWNybyBibG9ja3MgYW5kIElPIHBpbnMNCi0xLiBUaGUgdXNlciBtdXN0IHByb3ZpZGUgYSBmdW5jdGlvbiB0aGF0IHdpbGwgd3JpdGUgb3V0IHRoZSBWSUFzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIGNvbm5lY3QgdGhlIGxheWVycyB0b2dldGhlci4gSW4gb3JkZXIgdG8gZ2V0IGEgRFJDIGNsZWFuIHBvd2VyIGdyaWQsIGl0IGlzIGltcG9ydGFudCB0aGF0IHRoZXNlIFZJQSBkZWZpbml0aW9ucyBhcmUgdGhlbXNlbHZlcyBEUkMgY2xlYW4sIGFuZCB3aWxsIGNhdXNlIG5vIERSQyB2aW9sYXRpb25zIHdoZW4gaW5zdGFudGlhdGVkIGluIHRoZSBkZXNpZ24uDQotDQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vZG9jL2V4YW1wbGVfUEROLmNmZyBiL3NjcmlwdHMvcGRuL2RvYy9leGFtcGxlX1BETi5jZmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZWM2NGEuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vZG9jL2V4YW1wbGVfUEROLmNmZworKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0jIyMgUEROIENvbmZpZy4gQWxsIHVuaXRzIGluIG1pY3JvbWV0ZXIgKHVtKQotIyMgVGhlIHZhbHVlcyB1c2VkIGluIHRoaXMgY29uZmlnIGFyZSBmb3IgcmVmZXJlbmNlIG9ubHkgYW5kIGRvIG5vdCBjb3JyZXNwb25kIHRvIGFueSBzcGVjaWZpYyBmb3VuZHJ5Ci0jIyBkZXNpZ24gbmFtZSB0byBiZSB1c2VkIGluIERFRgotc2V0IDo6ZGVzaWduICJhcmlhbmUiCi0KLSMjIERFRiBEQlUgCi1zZXQgOjpkZWZfdW5pdHMgIjIwMDAiCi0KLSMjSW5wdXQgREVGIHdpdGggbWFjcm9zIHBhY2tlZAotc2V0IDo6RnBPdXREZWYgIi9wcm9qZWN0cy9zc2cvcGoxMDAwMDA2NF9kaXBoZGEvdXNlcnMvY29saG9sMDEvb3BlbnJvYWQvVHJpdG9uRlBsYW4vdGVzdC9hcmlhbmUvZmxvb3JwbGFuLmRlZiIKLQotIyMjIyBpbnB1dCB0ZWNoIGxlZiBwYXRoCi1zZXQgOjp0ZWNoTGVmICIvaG9tZS96ZjRfdGVjaGRhdGEvdHNtYzY1L2FybV9uZGEvYWxsX2V4dHJhY3RlZF9maWxlcy9hcm0vdHNtYy9jbG42NWxwL2FybV90ZWNoL3IycDAvbGVmLzFwOW1fNngyei9zYzEyX3RlY2gubGVmIgotIAotIyMjIyBpbnB1dCBjZWxsIGxlZiBwYXRoCi1zZXQgOjpjZWxsTGVmIFtsaXN0IFwKLS9wcm9qZWN0cy9zc2cvcGoxMDAwMDA2NF9kaXBoZGEvdXNlcnMvY29saG9sMDEvb3BlbnJvYWQvVHJpdG9uRlBsYW4vdGVzdC90c21jLTY1bHAvbWVyZ2VkLmxlZl0KLQotIyMjIyBpbnB1dCBmbGF0IGxlZiBwYXRoLiBGTEFUIExFRiB0aGF0IGNvbnRhaW5zIHBoeXNpY2FsIHZpZXdzIG9mIGFsbCBzdGFuZGFyZCBjZWxscyBhbmQgbWFjcm9zIGluIHRoZSBkZXNpZ24KLSMgRW5zdXJlIHRoYXQgdGhlIGZpbGUgZW5kcyB3aXRoIEVORCBMSUJSQVJZIAotc2V0IDo6ZmxhdExlZiAvcHJvamVjdHMvc3NnL3BqMTAwMDAwNjRfZGlwaGRhL3VzZXJzL2NvbGhvbDAxL29wZW5yb2FkL1RyaXRvbkZQbGFuL3Rlc3QvdHNtYy02NWxwL21lcmdlZC5sZWYKLQotc2V0IDo6bWFjcm9fcG93ZXJfcGlucyAiVkREUEUgVkREQ0UiCi1zZXQgOjptYWNyb19ncm91bmRfcGlucyAiVlNTRSIKLQotIyMjIyBwbGFjZW1lbnQgU0lURSBuYW1lIGZyb20gTEVGCi1zZXQgOjpzaXRlX25hbWUgInNjMTJfY2xuNjVscCIgCi1zZXQgOjpzaXRlX3dpZHRoIDAuMiAKLQotIyBGbG9vcnBsYW4gaW5mb3JtYXRpb24gLSBjb3JlIGJvdW5kYXJ5IGNvb3JkaW5hdGVzLCBzdGQuIGNlbGwgcm93IGhlaWdodCwKLSMgbWluaW11bSB0cmFjayBwaXRjaCBhcyBkZWZpbmVkIGluIExFRgotc2V0IDo6Y29yZV9hcmVhX2xseCAiMTQuMDAwMCIKLXNldCA6OmNvcmVfYXJlYV9sbHkgIjE0LjAwMDAiCi1zZXQgOjpjb3JlX2FyZWFfdXJ4ICIxNjYzLjgwMCIKLXNldCA6OmNvcmVfYXJlYV91cnkgIjEzMzEuNjAwIgotc2V0IDo6ZGllX2FyZWFfbGx4ICIwIgotc2V0IDo6ZGllX2FyZWFfbGx5ICIwIgotc2V0IDo6ZGllX2FyZWFfdXJ4ICIxNjc3LjgiCi1zZXQgOjpkaWVfYXJlYV91cnkgIjEzNDUuNiIKLXNldCA6OnJvd19oZWlnaHQgIjIuNCIKLQotIyBQb3dlciBuZXRzCi1zZXQgOjpwb3dlcl9uZXRzICJWREQiCi1zZXQgOjpncm91bmRfbmV0cyAiVlNTIgotCi1zZXQgOjptYWNyb19ibG9ja2FnZV9sYXllcl9saXN0ICJNMSBNMiBNMyBNNCIgCi0KLSMgRGV0YWlscyBmcm9tIHRlY2hsZWYgKEJFT0wgTEVGKQotc2V0IDo6bWV0X2xheWVyX2xpc3QgIk0xIE0yIE0zIE00IE01IE02IE03IE04IE05IiAgOyNGcm9tIE0xIGFuZCB1cHdhcmRzCi1zZXQgOjptZXRfbGF5ZXJfZGlyICAiaG9yIHZlciBob3IgdmVyIGhvciB2ZXIgaG9yIHZlciBob3IiCi0KLSMgRW5zdXJlIHBpdGNoZXMgd2lsbCBtYWtlIHRoZSBzdHJpcGVzIGZhbGwgb24gdHJhY2sKLSMgRW5zdXJlIG9mZnNldHMgd2lsbCBtYWtlIHRoZSBzdHJpcGVzIGZhbGwgb24gdHJhY2sKLQotcGRuIHNwZWNpZnlfZ3JpZCBzdGRjZWxsIFtsaXN0IFwKLSAgICBsYXllcnMgICAgIk0xIE00IE03IiBcCi0gICAgZGlyICAgICAgICJob3IgdmVyIGhvciIgXAotICAgIHdpZHRocyAgICAiMC42NCAwLjkzIDAuOTMiIFwKLSAgICBwaXRjaGVzICAgIjIuNDAgNDAuMCA0MC4wIiBcCi0gICAgbG9mZnNldCAgICIwIDIgMiIgXAotICAgIGJvZmZzZXQgICAiMCAyIDIiIFwKLSAgICBjb25uZWN0ICAgIntNMSBNNH0ge000IE03fSIgXAotICAgIHZpYXMgICAgICAiVklBMV9SVUxFXzEgVklBMl9SVUxFXzEgVklBM19SVUxFXzEgVklBNF9SVUxFXzEgVklBNV9SVUxFXzI2NCBWSUE2X1JVTEVfMTggVklBN19SVUxFXzE4IFZJQThfUlVMRV8xIiBcCi1dCi1wZG4gc3BlY2lmeV9ncmlkIG1hY3JvIFtsaXN0IFwKLSAgICBsYXllcnMgICAgIk02IiBcCi0gICAgZGlyICAgICAgICJ2ZXIiIFwKLSAgICB3aWR0aHMgICAgIjAuOTMiIFwKLSAgICBwaXRjaGVzICAgIjQwIiBcCi0gICAgbG9mZnNldCAgIDIgXAotICAgIGJvZmZzZXQgICAwIFwKLSAgICBtaW5fcGl0Y2ggMC4yIFwKLSAgICBjb25uZWN0ICAgIntNNF9QSU5faG9yIE02fSB7TTYgTTd9IiBcCi0gICAgdmlhcyAgICAgICJWSUExX1JVTEVfMSBWSUEyX1JVTEVfMSBWSUEzX1JVTEVfMSBWSUE0X1JVTEVfMjkzIFZJQTVfUlVMRV8zNjAgVklBNl9SVUxFXzIxIFZJQTdfUlVMRV8xOCBWSUE4X1JVTEVfMSIgXAotXQotCi1zZXQgOjpoYWxvIDQKLQotIyBNZXRhbCBsYXllciBmb3IgcmFpbHMgb24gZXZlcnkgcm93Ci1zZXQgOjpyYWlsc19tbGF5ZXIgIk0xIiA7Ci0KLSMgUE9XRVIgb3IgR1JPVU5EICNTdGQuIGNlbGwgcmFpbHMgc3RhcnRpbmcgd2l0aCBwb3dlciBvciBncm91bmQgcmFpbHMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgY29yZSBhcmVhCi1zZXQgOjpyYWlsc19zdGFydF93aXRoICJHUk9VTkQiIDsKLQotIyBQT1dFUiBvciBHUk9VTkQgI1VwcGVyIG1ldGFsIHN0cmlwZXMgc3RhcnRpbmcgd2l0aCBwb3dlciBvciBncm91bmQgcmFpbHMgYXQgdGhlIGxlZnQvYm90dG9tIG9mIHRoZSBjb3JlIGFyZWEKLXNldCA6OnN0cmlwZXNfc3RhcnRfd2l0aCAiR1JPVU5EIiA7Ci0KLXByb2MgZ2VuZXJhdGVfdmlhcnVsZXMge30gewotICAgcGRuIGRlZl9vdXQgIlxuXG5WSUFTIDE0IDtcbiIKLQotICAgcGRuIGRlZl9vdXQgIi0gVklBMV9SVUxFXzEgXG4gKyBWSUFSVUxFIFZJQTFfUlVMRSBcbiArIENVVFNJWkUgMjAwIDIwMCBcbiArIExBWUVSUyBNMSBWSUExIE0yIFxuICsgQ1VUU1BBQ0lORyAyNjAgMjYwIFxuICsgRU5DTE9TVVJFIDE0MCA4MCAxNDAgODAgXG4gKyBST1dDT0wgMSA0IFxuIDsiCi0gICBwZG4gZGVmX291dCAiLSBWSUEyX1JVTEVfMSBcbiArIFZJQVJVTEUgVklBMl9SVUxFIFxuICsgQ1VUU0laRSAyMDAgMjAwIFxuICsgTEFZRVJTIE0yIFZJQTIgTTMgXG4gKyBDVVRTUEFDSU5HIDI2MCAyNjAgXG4gKyBFTkNMT1NVUkUgMTQwIDgwIDE0MCA4MCBcbiArIFJPV0NPTCAxIDQgXG4gOyIKLSAgIHBkbiBkZWZfb3V0ICItIFZJQTNfUlVMRV8xIFxuICsgVklBUlVMRSBWSUEzX1JVTEUgXG4gKyBDVVRTSVpFIDIwMCAyMDAgXG4gKyBMQVlFUlMgTTMgVklBMyBNNCBcbiArIENVVFNQQUNJTkcgMjYwIDI2MCBcbiArIEVOQ0xPU1VSRSAxNDAgODAgMTQwIDgwIFxuICsgUk9XQ09MIDEgNCBcbiA7IgotICAKLSAgIHBkbiBkZWZfb3V0ICItIFZJQTRfUlVMRV8xIFxuICsgVklBUlVMRSBWSUE0X1JVTEUgXG4gKyBDVVRTSVpFIDIwMCAyMDAgXG4gKyBMQVlFUlMgTTQgVklBNCBNNSBcbiArIENVVFNQQUNJTkcgMjYwIDI2MCBcbiArIEVOQ0xPU1VSRSAxNDAgODAgMTQwIDgwIFxuICsgUk9XQ09MIDEgNCBcbiA7IgotICAgcGRuIGRlZl9vdXQgIi0gVklBNF9SVUxFXzYgXG4gKyBWSUFSVUxFIFZJQTRfUlVMRSBcbiArIENVVFNJWkUgMjAwIDIwMCBcbiArIExBWUVSUyBNNCBWSUE0IE01IFxuICsgQ1VUU1BBQ0lORyAyNjAgMjYwIFxuICsgRU5DTE9TVVJFIDE0MCAyMCAxNDAgMjAgXG4gKyBST1dDT0wgMSA0IFxuIDsiCi0gICBwZG4gZGVmX291dCAiLSBWSUE0X1JVTEVfMjkzIFxuICsgVklBUlVMRSBWSUE0X1JVTEUgXG4gKyBDVVRTSVpFIDIwMCAyMDAgXG4gKyBMQVlFUlMgTTQgVklBNCBNNSBcbiArIENVVFNQQUNJTkcgMjYwIDI2MCBcbiArIEVOQ0xPU1VSRSAxNDAgMjAgMTQwIDIwIFxuICsgUk9XQ09MIDEgNCBcbiA7IgotICAgcGRuIGRlZl9vdXQgIi0gVklBNF9SVUxFXzI5NCBcbiArIFZJQVJVTEUgVklBNF9SVUxFIFxuICsgQ1VUU0laRSAyMDAgMjAwIFxuICsgTEFZRVJTIE00IFZJQTQgTTUgXG4gKyBDVVRTUEFDSU5HIDI2MCAyNjAgXG4gKyBFTkNMT1NVUkUgNjAgMTAwIDYwIDEwMCBcbiArIFJPV0NPTCA0IDEgXG4gOyIKLSAgCi0gICBwZG4gZGVmX291dCAiLSBWSUE1X1JVTEVfMjc1IFxuICsgVklBUlVMRSBWSUE1X1JVTEUgXG4gKyBDVVRTSVpFIDIwMCAyMDAgXG4gKyBMQVlFUlMgTTUgVklBNCBNNiBcbiArIENVVFNQQUNJTkcgMjYwIDI2MCBcbiArIEVOQ0xPU1VSRSAxNDAgMjAgMTQwIDIwIFxuICsgUk9XQ09MIDEgNCBcbiA7IgotICAgcGRuIGRlZl9vdXQgIi0gVklBNV9SVUxFXzI2NCBcbiArIFZJQVJVTEUgVklBNV9SVUxFIFxuICsgQ1VUU0laRSAyMDAgMjAwIFxuICsgTEFZRVJTIE01IFZJQTUgTTYgXG4gKyBDVVRTUEFDSU5HIDI2MCAyNjAgXG4gKyBFTkNMT1NVUkUgMTQwIDgwIDE0MCA4MCBcbiArIFJPV0NPTCAxIDQgXG4gOyIKLSAgIHBkbiBkZWZfb3V0ICItIFZJQTVfUlVMRV8zNjAgXG4gKyBWSUFSVUxFIFZJQTVfUlVMRSBcbiArIENVVFNJWkUgMjAwIDIwMCBcbiArIExBWUVSUyBNNSBWSUE1IE02IFxuICsgQ1VUU1BBQ0lORyAyNjAgMjYwIFxuICsgRU5DTE9TVVJFIDIwIDIyMCAyMCAyMjAgXG4gKyBST1dDT0wgMSA0IFxuIDsiCi0KLSAgIHBkbiBkZWZfb3V0ICItIFZJQTZfUlVMRV8xOCBcbiArIFZJQVJVTEUgVklBNl9SVUxFIFxuICsgQ1VUU0laRSAyMDAgMjAwIFxuICsgTEFZRVJTIE02IFZJQTYgTTcgXG4gKyBDVVRTUEFDSU5HIDI2MCAyNjAgXG4gKyBFTkNMT1NVUkUgMTQwIDIyMCAxNDAgMjIwIFxuICsgUk9XQ09MIDIgMiBcbiA7IgotICAgcGRuIGRlZl9vdXQgIi0gVklBNl9SVUxFXzIxIFxuICsgVklBUlVMRSBWSUE2X1JVTEUgXG4gKyBDVVRTSVpFIDIwMCAyMDAgXG4gKyBMQVlFUlMgTTYgVklBNiBNNyBcbiArIENVVFNQQUNJTkcgMjYwIDI2MCBcbiArIEVOQ0xPU1VSRSAyMCAyMjAgMjAgMjIwIFxuICsgUk9XQ09MIDIgMiBcbiA7IgotCi0gICBwZG4gZGVmX291dCAiLSBWSUE3X1JVTEVfMTggXG4gKyBWSUFSVUxFIFZJQTdfUlVMRSBcbiArIENVVFNJWkUgNzIwIDcyMCBcbiArIExBWUVSUyBNNyBWSUE3IE04IFxuICsgQ1VUU1BBQ0lORyAxMTIwIDY4MCBcbiArIEVOQ0xPU1VSRSAxMDQwIDE0MCAxMDQwIDE0MCBcbiArIFJPV0NPTCAyIDIgXG4gOyIKLSAgIHBkbiBkZWZfb3V0ICItIFZJQThfUlVMRV8xIFxuICsgVklBUlVMRSBWSUE4X1JVTEUgXG4gKyBDVVRTSVpFIDcyMCA3MjAgXG4gKyBMQVlFUlMgTTggVklBOCBNOSBcbiArIENVVFNQQUNJTkcgNjgwIDExMjAgXG4gKyBFTkNMT1NVUkUgNDAgMjgwIDQwIDI4MCBcbiArIFJPV0NPTCAyIDIgXG4gOyIKLSAgIHBkbiBkZWZfb3V0ICJFTkQgVklBUyIKLX0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vaW5pdF9kYi50Y2wgYi9zY3JpcHRzL3Bkbi9pbml0X2RiLnRjbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWE1OGQyCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9wZG4vaW5pdF9kYi50Y2wKQEAgLTAsMCArMSw3IEBACitzZXQgZGIgW2RiRGF0YWJhc2VfY3JlYXRlXQorCitzZXQgbGlicyBbb2RiX3JlYWRfbGVmICRkYiAkOjplbnYoTUVSR0VEX0xFRildCitzZXQgY2hpcCBbb2RiX3JlYWRfZGVmICRsaWJzICQ6OmVudih0YXBjZWxsX3RtcF9maWxlX3RhZykuZGVmXQorI3NldCBjaGlwIFtvZGJfcmVhZF9kZXNpZ24gJGRiICQ6ZW52KE1FUkdFRF9MRUYpICQ6OmVudihtcGxhY2VfdG1wX2ZpbGVfdGFnKS5kZWZdCisKK29kYl9leHBvcnRfZGIgJGRiICQ6OmVudihwZG5fdG1wX2ZpbGVfdGFnKS5vZGIKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvQ01ha2VMaXN0cy50eHQgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL0NNYWtlTGlzdHMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGJmN2RlLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvQ01ha2VMaXN0cy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDMuMSkKLQotcHJvamVjdChQZG5QaW5EdW1wZXIKLSAgTEFOR1VBR0VTIENYWAotKQotCi1zZXQoQ01BS0VfQ1hYX1NUQU5EQVJEIDE3KQotc2V0KENNQUtFX0NYWF9TVEFOREFSRF9SRVFVSVJFRCBPTikKLXNldChDTUFLRV9DWFhfRVhURU5TSU9OUyBPRkYpCi0KLQotaWYgKENNQUtFX0NPTVBJTEVSX0lTX0dOVUNDIEFORCBDTUFLRV9DWFhfQ09NUElMRVJfVkVSU0lPTiBWRVJTSU9OX0xFU1MgNy4zKQotICBtZXNzYWdlKEZBVEFMX0VSUk9SICJQZG5QaW5EdW1wZXIgcmVxdWlyZXMgR0NDIDcgYW5kIGFib3ZlISBcbnVzZSAtRENNQUtFX0NYWF9DT01QSUxFUiB0byBhc3NpZ24geW91ciBjb21waWxlciBwYXRoIikKLWVuZGlmKCkKLQotCi1zZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLU8zIikKLXNldChDTUFLRV9DWFhfRkxBR1NfREVCVUcgIi1PMCAtZ2dkYiIpCi1zZXQoQ01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0UgIi1PMyIpCi0KLXNldChUSFJFQURTX1BSRUZFUl9QVEhSRUFEX0ZMQUcgT04pCi0KLXNldChGTEVYUk9VVEVfSE9NRSAke1BST0pFQ1RfU09VUkNFX0RJUn0gKQotCi1zZXQoREVGTElCX0hPTUUKLSAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L21vZHVsZS9kZWYvNS44LXAwMjkKLSkKLXNldChMRUZMSUJfSE9NRQotICAke1BST0pFQ1RfU09VUkNFX0RJUn0vbW9kdWxlL2xlZi81LjgtcDAyOQotKQotCi0jIyBpbmNsdWRlIHN1YmRpcmVjdG9yaWVzIAotYWRkX3N1YmRpcmVjdG9yeSgke0RFRkxJQl9IT01FfSkKLWFkZF9zdWJkaXJlY3RvcnkoJHtMRUZMSUJfSE9NRX0pCi0KLQotIyMgY29uZmlndXJlIHNldHRpbmdzCi1maW5kX3BhY2thZ2UoWkxJQiBSRVFVSVJFRCkKLWZpbmRfcGFja2FnZShCSVNPTiBSRVFVSVJFRCkKLQotZmluZF9wYWNrYWdlKEJvb3N0IDEuNjguMCBSRVFVSVJFRCkKLWZpbmRfcGFja2FnZShUaHJlYWRzIFJFUVVJUkVEKQotCi1zZXQgKEZMRVhST1VURV9TUkMKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL2dsb2JhbC5jcHAKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL2RyYy9mckRSQ191dGlsLmNwcAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvZHJjL2ZyRFJDX3NldHVwLmNwcAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvZHJjL2ZyRFJDX2luaXQuY3BwCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy9kcmMvZnJEUkNfbWFpbi5jcHAKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL2lvL2lvX2d1aWRlLmNwcAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvaW8vZnJBUEcuY3BwCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy9pby9pb19wYXJzZXJfaGVscGVyLmNwcAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvaW8vaW8uY3BwCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy9pby9kZWZ3LmNwcAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvaW8vaW9fcGluLmNwcAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvaW8vZnJQaW5QcmVwLmNwcAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvaW8vZnJTaGFwZVV0aWwuY3BwCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy9kci9GbGV4R3JpZEdyYXBoLmNwcAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvZHIvRmxleEdyaWRHcmFwaF9tYXplLmNwcAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvZHIvRmxleERSLmNwcAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvZHIvRmxleERSX21hemUuY3BwCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy9kci9GbGV4RFJfZW5kLmNwcAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvZHIvRmxleERSX2luaXQuY3BwCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy9kci9GbGV4RFJfY29ubi5jcHAKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL2RyL0ZsZXhEUl9ycS5jcHAKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL0ZsZXhSb3V0ZS5jcHAKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL3RhL0ZsZXhUQV9ycS5jcHAKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL3RhL0ZsZXhUQV9hc3NpZ24uY3BwCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy90YS9GbGV4VEFfZW5kLmNwcAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvdGEvRmxleFRBX2luaXQuY3BwCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy90YS9GbGV4VEEuY3BwCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy9mclJlZ2lvblF1ZXJ5LmNwcAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvdXRpbGl0eS5jcHAKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL21haW4uY3BwCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy9kYi9vYmovZnJJbnN0LmNwcAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvZGIvb2JqL2ZyUGluLmNwcAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvZGIvb2JqL2ZyU2hhcGUuY3BwCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy9kYi9vYmovZnJWaWEuY3BwCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy9kYi90YU9iai90YVRyYWNrLmNwcAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvZGIvdGFPYmovdGFTaGFwZS5jcHAKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL2RiL2luZnJhL2ZyQm94LmNwcAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvZGIvaW5mcmEvZnJUaW1lLmNwcAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvZGIvaW5mcmEvZnJUaW1lX2hlbHBlci5jcHAKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL2RiL2luZnJhL2ZyUG9pbnQuY3BwCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy9kYi9kck9iai9kclZpYS5jcHAKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL2RiL2RyT2JqL2RyU2hhcGUuY3BwCi0gICkKLQotCi1zZXQgKEZMRVhST1VURV9IRUFERVIKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL2RyYy9mckRSQy5oCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy9GbGV4Um91dGUuaAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvaW8vZnJHdWlkZVByZXAuaAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvaW8vZnJBUEcuaAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvaW8vZnJQaW5QcmVwLmgKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL2lvL2lvLmgKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL2lvL2ZyU2hhcGVVdGlsLmgKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL2lvL2ZyVXRpbC5oCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy9mclJlZ2lvblF1ZXJ5LmgKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL2ZyRGVzaWduLmgKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL2ZyQmFzZVR5cGVzLmgKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL2RyL0ZsZXhEUi5oCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy9kci9GbGV4R3JpZEdyYXBoLmgKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL2RyL0ZsZXhXYXZlZnJvbnQuaAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvZHIvRmxleFJlZ2lvblF1ZXJ5LmgKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL2RyL0ZsZXhNYXplVHlwZXMuaAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvdGEvRmxleFRBLmgKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL0ZsZXhBY2Nlc3NQYXR0ZXJuLmgKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL2dsb2JhbC5oCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy9kYi9vYmovZnJUcmFja1BhdHRlcm4uaAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvZGIvb2JqL2ZyUGluLmgKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL2RiL29iai9mckluc3RUZXJtLmgKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL2RiL29iai9mck1hcmtlci5oCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy9kYi9vYmovZnJSZWYuaAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvZGIvb2JqL2ZyRmlnLmgKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL2RiL29iai9mclRlcm0uaAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvZGIvb2JqL2ZyQm91bmRhcnkuaAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvZGIvb2JqL2ZyQmxvY2suaAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvZGIvb2JqL2ZyVmlhLmgKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL2RiL29iai9mckluc3QuaAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvZGIvb2JqL2ZyU2hhcGUuaAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvZGIvb2JqL2ZyR3VpZGUuaAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvZGIvb2JqL2ZyQmxvY2tPYmplY3QuaAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvZGIvb2JqL2ZySW5zdEJsb2NrYWdlLmgKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL2RiL29iai9mck5ldC5oCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy9kYi9vYmovZnJCbG9ja2FnZS5oCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy9kYi9vYmovZnJDTWFwLmgKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL2RiL3RhT2JqL3RhU2hhcGUuaAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvZGIvdGFPYmovdGFGaWcuaAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvZGIvdGFPYmovdGFWaWEuaAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvZGIvdGFPYmovdGFUcmFjay5oCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy9kYi90YU9iai90YUJsb2NrT2JqZWN0LmgKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL2RiL3RhT2JqL3RhUGluLmgKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL2RiL2luZnJhL2ZyQm94LmgKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL2RiL2luZnJhL2ZyT3JpZW50LmgKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL2RiL2luZnJhL2ZyUHJlZlJvdXRpbmdEaXIuaAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvZGIvaW5mcmEvZnJTZWdTdHlsZS5oCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy9kYi9pbmZyYS9mclRpbWUuaAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvZGIvaW5mcmEvZnJQb2ludC5oCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy9kYi9pbmZyYS9mclRyYW5zZm9ybS5oCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy9kYi90ZWNoL2ZyVGVjaE9iamVjdC5oCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy9kYi90ZWNoL2ZyQ29uc3RyYWludC5oCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy9kYi90ZWNoL2ZyTGF5ZXIuaAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvZGIvdGVjaC9mckxvb2t1cFRibC5oCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy9kYi90ZWNoL2ZyVmlhUnVsZUdlbmVyYXRlLmgKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL2RiL3RlY2gvZnJWaWFEZWYuaAotICAke0ZMRVhST1VURV9IT01FfS9zcmMvZGIvZHJPYmovZHJCbG9ja09iamVjdC5oCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy9kYi9kck9iai9kck5ldC5oCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy9kYi9kck9iai9kckZpZy5oCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy9kYi9kck9iai9kclZpYS5oCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy9kYi9kck9iai9kck1hcmtlci5oCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy9kYi9kck9iai9kclNoYXBlLmgKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL2RiL2RyT2JqL2RyUmVmLmgKLSAgJHtGTEVYUk9VVEVfSE9NRX0vc3JjL2RiL2RyT2JqL2RyQWNjZXNzUGF0dGVybi5oCi0gICR7RkxFWFJPVVRFX0hPTUV9L3NyYy9kYi9kck9iai9kclBpbi5oCi0gICkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGluY2x1ZGUgZGlyZWN0b3JpZXMgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWluY2x1ZGVfZGlyZWN0b3JpZXMoCi0gICR7Qk9PU1RfSU5DTFVERURJUn0KLSAgJHtCT09TVF9ST09UfS9pbmNsdWRlCi0KLSAgJHtERUZMSUJfSE9NRX0vZGVmCi0gICR7REVGTElCX0hPTUV9L2RlZnpsaWIKLSAgJHtERUZMSUJfSE9NRX0vY2RlZgotICAke0RFRkxJQl9IT01FfS9jZGVmemxpYgotCi0gICR7TEVGTElCX0hPTUV9L2xlZgotICAke0xFRkxJQl9IT01FfS9sZWZ6bGliCi0gICR7TEVGTElCX0hPTUV9L2NsZWYKLSAgJHtMRUZMSUJfSE9NRX0vY2xlZnpsaWIKLQotICAke0ZMRVhST1VURV9IT01FfS9zcmMKLSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENyZWF0ZSBhIGxpYnJhcnkgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWFkZF9saWJyYXJ5KCBmbGV4cm91dGVsaWIgU1RBVElDCi0gICR7RkxFWFJPVVRFX1NSQ30KLSkKLQotc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCBmbGV4cm91dGVsaWIgCi0gIFBST1BFUlRJRVMgT1VUUFVUX05BTUUgImZsZXhyb3V0ZSIKLSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENyZWF0ZSBhbiBleGVjdXRhYmxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWFkZF9leGVjdXRhYmxlKCBQZG5QaW5EdW1wZXIgCi0gICR7RkxFWFJPVVRFX1NSQ30KLSkKLQotYWRkX2RlcGVuZGVuY2llcyggUGRuUGluRHVtcGVyIGRlZiApCi1hZGRfZGVwZW5kZW5jaWVzKCBQZG5QaW5EdW1wZXIgbGVmICkKLQotYWRkX2RlcGVuZGVuY2llcyggZmxleHJvdXRlbGliIGRlZiApCi1hZGRfZGVwZW5kZW5jaWVzKCBmbGV4cm91dGVsaWIgbGVmICkKLQotdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCBQZG5QaW5EdW1wZXIgCi0gIFBVQkxJQwotICBkZWYKLSAgI2RlZnpsaWIKLSAgI2NkZWYKLSAgI2NkZWZ6bGliCi0gIGxlZgotICAjbGVmemxpYgotICAjY2xlZgotICAjY2xlZnpsaWIKLQotICAke1pMSUJfTElCUkFSSUVTfQotICBUaHJlYWRzOjpUaHJlYWRzCi0gIC1zdGF0aWMgCi0gICkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEluc3RhbGwgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWluc3RhbGwoRklMRVMgJHtGTEVYUk9VVEVfSEVBREVSfSBERVNUSU5BVElPTiBpbmNsdWRlKQotaW5zdGFsbChUQVJHRVRTIFBkblBpbkR1bXBlciBERVNUSU5BVElPTiBiaW4pCi1pbnN0YWxsKFRBUkdFVFMgUGRuUGluRHVtcGVyIERFU1RJTkFUSU9OIGxpYikKLQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL0xJQ0VOU0UgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL0xJQ0VOU0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMGRkNDguLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9MSUNFTlNFCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotQlNEIDMtQ2xhdXNlIExpY2Vuc2UKLQotQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0xLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKLSAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0yLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCi0gICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCi0gICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3IgdGhlIG5hbWVzIG9mIGl0cwotICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgotQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi1ESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi1GT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLVNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCi1DQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLU9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLVRISVJELVBBUlRZIFNPRlRXQVJFIE5PVElDRVMgQU5EIElORk9STUFUSU9OCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVBoeXNpY2FsIE1lbW9yeSBVc2UKLT09PT0KLUF1dGhvcjogIERhdmlkIFJvYmVydCBOYWRlYXUKLVNpdGU6ICAgIGh0dHA6Ly9OYWRlYXVTb2Z0d2FyZS5jb20vCi1MaWNlbnNlOiBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDMuMCBVbnBvcnRlZCBMaWNlbnNlCi0gICAgICAgICBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8zLjAvZGVlZC5lbl9VUwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotTEVGL0RFRiB2NS44IGFuZCBBYm92ZSBUb29sa2l0Ci09PT09Ci1Db3B5cmlnaHQgMjAxMiAtIDIwMTcsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLSAKLUxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoteW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvUkVBRE1FLm1kIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9SRUFETUUubWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYzBmOGMuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9SRUFETUUubWQKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIFBkblBpbkR1bXBlcgotKipQZG5QaW5EdW1wZXIqKiBpcyBhIHRlbXBvcmFyeSB1dGlsaXR5IHRvIGdldCBNQUNSTyBwaW4gbG9jYXRpb24gZm9yIFBETiBjb25zdHJ1Y3Rpb24uCi1JdCBpcyBiYXNlZCBvbiBUcml0b25Sb3V0ZSBkYXRhYmFzZSBhbmQgd2lsbCBiZSByZXBsYWNlZCBieSAKLVtPcGVuUk9BRF0oaHR0cHM6Ly90aGVvcGVucm9hZHByb2plY3Qub3JnLykgZGF0YWJhc2Ugb25jZSBhdmFpbGFibGUuCi0KLSMjIEluc3RhbGxhdGlvbiAjIwotUGRuUGluRHVtcGVyIGlzIHRlc3RlZCBpbiA2NC1iaXQgQ2VudE9TIDYvNyBlbnZpcm9ubWVudHMgd2l0aCB0aGUgZm9sbG93aW5nCi1wcmVyZXF1aXNpdGVzOgotKiBBIGNvbXBhdGlibGUgQysrIGNvbXBpbGVyIHN1cHBvcnRpbmcgQysrMTcgKEdDQyA3IGFuZCBhYm92ZSkKLSogQm9vc3QgPj0gMS42OC4wCi0qIEJpc29uID49IDMuMC40Ci0qIHpsaWIgPj0gMS4yLjcKLSogQ01ha2UgPj0gMy4xCi0KLVRvIGluc3RhbGwgUGRuUGluRHVtcGVyOgotYGBgCi0kIGNkIFBkblBpbkR1bXBlcgotJCBta2RpciBidWlsZAotJCBjZCBidWlsZAotJCBjbWFrZSAtREJPT1NUX1JPT1Q9PEJPT1NUX1JPT1Q+IC4uLwotJCBtYWtlCi1gYGAKLSAgIAotIyMgU3VwcG9ydGVkIFRlY2hub2xvZ2llcyAjIwotKiBDTE42NUxQICh3aXRoIGxpbWl0ZWQgc2VsZWN0aW9uIG9mIG1hY3JvcykKLQotIyMgTGljZW5zZSAjIwotKiBbQlNEIDMtY2xhdXNlIExpY2Vuc2VdKExJQ0VOU0UpIAotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvLmdpdGlnbm9yZSBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS8uZ2l0aWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTk2ZjAwLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS8uZ2l0aWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotYmluLwotYmluL2RlZmRpZmYKLWJpbi9kZWZydwotYmluL2RlZndyaXRlCi1iaW4vbGVmZGVmZGlmZgotZGVmLyoub3V0cHV0Ci1kZWYvKi50YWIuaAotZGVmLyoudGFiLmNwcAotZGVmZGlmZi9kZWZkaWZmCi1kZWZydy9kZWZydwotZGVmd3JpdGUvZGVmd3JpdGUKLWRlZnpsaWIvKi5hCi1pbmNsdWRlLyouaAotaW5jbHVkZS8qLmhwcAotbGliLyouYQotKi5hCi0qKi8qLmEKLQotTWFrZWZpbGUKLUNNYWtlQ2FjaGUudHh0Ci0qLmNtYWtlCi1DTWFrZUZpbGVzCi1pbnN0YWxsX21hbmlmZXN0LnR4dApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L0NNYWtlTGlzdHMudHh0IGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L0NNYWtlTGlzdHMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDE0ODI2Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9DTWFrZUxpc3RzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0jIERFRiBQQVJTRVIgQ01BS0UgQ29tcGlsZSBTZXR0aW5ncwotcHJvamVjdChERUZfUEFSU0VSIAotICBMQU5HVUFHRVMgQ1hYIAotKQotCi1jbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMy4xKQotCi1zZXQoREVGTElCX0hPTUUgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9KQotCi1zZXQoQ01BS0VfQ1hYX0ZMQUdTX0RFQlVHICItZyAtZ2dkYiIpCi1zZXQoQ01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0UgIi1PMyIpCi0KLSMgQklTT04gYW5kIFpMSUIgaXMgcmVxdWlyZWQgdG8gY29tcGlsZSBERUYvTEVGIFBhcnNlcnMuCi1maW5kX3BhY2thZ2UoQklTT04pCi1maW5kX3BhY2thZ2UoWkxJQikKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENyZWF0ZSBhIGxpYnJhcnkgZm9yIERFRgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zZXQoIERFRkxJQl9ERUZfU1JDCi0gIGRlZi9kZWZpQWxpYXMuY3BwCi0gIGRlZi9kZWZpQXNzZXJ0aW9uLmNwcAotICBkZWYvZGVmaUJsb2NrYWdlLmNwcAotICBkZWYvZGVmaUNvbXBvbmVudC5jcHAKLSAgZGVmL2RlZmlEZWJ1Zy5jcHAKLSAgZGVmL2RlZmlGaWxsLmNwcAotICBkZWYvZGVmaUZQQy5jcHAKLSAgZGVmL2RlZmlHcm91cC5jcHAKLSAgZGVmL2RlZmlJT1RpbWluZy5jcHAKLSAgZGVmL2RlZmlNaXNjLmNwcAotICBkZWYvZGVmaU5ldC5jcHAKLSAgZGVmL2RlZmlOb25EZWZhdWx0LmNwcAotICBkZWYvZGVmaVBhcnRpdGlvbi5jcHAKLSAgZGVmL2RlZmlQYXRoLmNwcAotICBkZWYvZGVmaVBpbkNhcC5jcHAKLSAgZGVmL2RlZmlQaW5Qcm9wLmNwcAotICBkZWYvZGVmaVByb3AuY3BwCi0gIGRlZi9kZWZpUHJvcFR5cGUuY3BwCi0gIGRlZi9kZWZpUmVnaW9uLmNwcAotICBkZWYvZGVmaVJvd1RyYWNrLmNwcAotICBkZWYvZGVmaVNjYW5jaGFpbi5jcHAKLSAgZGVmL2RlZmlTaXRlLmNwcAotICBkZWYvZGVmaVNsb3QuY3BwCi0gIGRlZi9kZWZpVGltaW5nRGlzYWJsZS5jcHAKLSAgZGVmL2RlZmlVdGlsLmNwcAotICBkZWYvZGVmaVZpYS5jcHAKLSAgZGVmL2RlZl9rZXl3b3Jkcy5jcHAKLSAgZGVmL2RlZnJDYWxsYmFja3MuY3BwCi0gIGRlZi9kZWZyRGF0YS5jcHAKLSAgZGVmL2RlZnJSZWFkZXIuY3BwCi0gIGRlZi9kZWZyU2V0dGluZ3MuY3BwCi0gIGRlZi9kZWZ3V3JpdGVyQ2FsbHMuY3BwCi0gIGRlZi9kZWZ3V3JpdGVyLmNwcAotICBkZWYvZGVmLnRhYi5jcHAKLSAgKQotCi1zZXQoIERFRkxJQl9ERUZaTElCX1NSQyAKLSAgZGVmemxpYi9kZWZ6bGliLmNwcAotICApCi0KLXNldCAoIERFRkxJQl9DREVGX1NSQyAKLSAgY2RlZi94ZGVmaUFzc2VydGlvbi5jcHAKLSAgY2RlZi94ZGVmaUJsb2NrYWdlLmNwcAotICBjZGVmL3hkZWZpQ29tcG9uZW50LmNwcAotICBjZGVmL3hkZWZpRGVidWcuY3BwCi0gIGNkZWYveGRlZmlGaWxsLmNwcAotICBjZGVmL3hkZWZpRlBDLmNwcAotICBjZGVmL3hkZWZpR3JvdXAuY3BwCi0gIGNkZWYveGRlZmlJT1RpbWluZy5jcHAKLSAgY2RlZi94ZGVmaU1pc2MuY3BwCi0gIGNkZWYveGRlZmlOZXQuY3BwCi0gIGNkZWYveGRlZmlOb25EZWZhdWx0LmNwcAotICBjZGVmL3hkZWZpUGFydGl0aW9uLmNwcAotICBjZGVmL3hkZWZpUGF0aC5jcHAKLSAgY2RlZi94ZGVmaVBpbkNhcC5jcHAKLSAgY2RlZi94ZGVmaVBpblByb3AuY3BwCi0gIGNkZWYveGRlZmlQcm9wLmNwcAotICBjZGVmL3hkZWZpUHJvcFR5cGUuY3BwCi0gIGNkZWYveGRlZmlSZWdpb24uY3BwCi0gIGNkZWYveGRlZmlSb3dUcmFjay5jcHAKLSAgY2RlZi94ZGVmaVNjYW5jaGFpbi5jcHAKLSAgY2RlZi94ZGVmaVNpdGUuY3BwCi0gIGNkZWYveGRlZmlTbG90LmNwcAotICBjZGVmL3hkZWZpVGltaW5nRGlzYWJsZS5jcHAKLSAgY2RlZi94ZGVmaVZpYS5jcHAKLSAgY2RlZi94ZGVmclJlYWRlci5jcHAKLSAgY2RlZi94ZGVmd1dyaXRlckNhbGxzLmNwcAotICBjZGVmL3hkZWZ3V3JpdGVyLmNwcAotICApCi0KLXNldCAoREVGTElCX0NERUZaTElCX1NSQwotICBjZGVmemxpYi9jZGVmemxpYi5jCi0gICkKLQotc2V0IChERUZMSUJfSEVBREVSUwotICBkZWYvZGVmLnRhYi5oCi0gIGRlZi9sZXguaAotICBkZWYvZGVmaUFsaWFzLmhwcAotICBkZWYvZGVmaUFzc2VydGlvbi5ocHAKLSAgZGVmL2RlZmlCbG9ja2FnZS5ocHAKLSAgZGVmL2RlZmlDb21wb25lbnQuaHBwCi0gIGRlZi9kZWZpRGVidWcuaHBwCi0gIGRlZi9kZWZpRGVmcy5ocHAKLSAgZGVmL2RlZmlGaWxsLmhwcAotICBkZWYvZGVmaUZQQy5ocHAKLSAgZGVmL2RlZmlHcm91cC5ocHAKLSAgZGVmL2RlZmlJT1RpbWluZy5ocHAKLSAgZGVmL2RlZmlLUkRlZnMuaHBwCi0gIGRlZi9kZWZpTWlzYy5ocHAKLSAgZGVmL2RlZmlOZXQuaHBwCi0gIGRlZi9kZWZpTm9uRGVmYXVsdC5ocHAKLSAgZGVmL2RlZmlQYXJ0aXRpb24uaHBwCi0gIGRlZi9kZWZpUGF0aC5ocHAKLSAgZGVmL2RlZmlQaW5DYXAuaHBwCi0gIGRlZi9kZWZpUGluUHJvcC5ocHAKLSAgZGVmL2RlZmlQcm9wLmhwcAotICBkZWYvZGVmaVByb3BUeXBlLmhwcAotICBkZWYvZGVmaVJlZ2lvbi5ocHAKLSAgZGVmL2RlZmlSb3dUcmFjay5ocHAKLSAgZGVmL2RlZmlTY2FuY2hhaW4uaHBwCi0gIGRlZi9kZWZpU2l0ZS5ocHAKLSAgZGVmL2RlZmlTbG90LmhwcAotICBkZWYvZGVmaVRpbWluZ0Rpc2FibGUuaHBwCi0gIGRlZi9kZWZpVXNlci5ocHAKLSAgZGVmL2RlZmlVdGlsLmhwcAotICBkZWYvZGVmaVZpYS5ocHAKLSAgZGVmL2RlZnJDYWxsQmFja3MuaHBwCi0gIGRlZi9kZWZyRGF0YS5ocHAKLSAgZGVmL2RlZnJSZWFkZXIuaHBwCi0gIGRlZi9kZWZyU2V0dGluZ3MuaHBwCi0gIGRlZi9kZWZ3V3JpdGVyQ2FsbHMuaHBwCi0gIGRlZi9kZWZ3V3JpdGVyLmhwcAotCi0gIGRlZnpsaWIvZGVmemxpYi5ocHAKLQotICBjZGVmL2RlZmlBbGlhcy5oCi0gIGNkZWYvZGVmaUFzc2VydGlvbi5oCi0gIGNkZWYvZGVmaUJsb2NrYWdlLmgKLSAgY2RlZi9kZWZpQ29tcG9uZW50LmgKLSAgY2RlZi9kZWZpRGVidWcuaAotICBjZGVmL2RlZmlEZWZzLmgKLSAgY2RlZi9kZWZpRmlsbC5oCi0gIGNkZWYvZGVmaUZQQy5oCi0gIGNkZWYvZGVmaUdyb3VwLmgKLSAgY2RlZi9kZWZpSU9UaW1pbmcuaAotICBjZGVmL2RlZmlLUkRlZnMuaAotICBjZGVmL2RlZmlNaXNjLmgKLSAgY2RlZi9kZWZpTmV0LmgKLSAgY2RlZi9kZWZpTm9uRGVmYXVsdC5oCi0gIGNkZWYvZGVmaVBhcnRpdGlvbi5oCi0gIGNkZWYvZGVmaVBhdGguaAotICBjZGVmL2RlZmlQaW5DYXAuaAotICBjZGVmL2RlZmlQaW5Qcm9wLmgKLSAgY2RlZi9kZWZpUHJvcC5oCi0gIGNkZWYvZGVmaVByb3BUeXBlLmgKLSAgY2RlZi9kZWZpUmVnaW9uLmgKLSAgY2RlZi9kZWZpUm93VHJhY2suaAotICBjZGVmL2RlZmlTY2FuY2hhaW4uaAotICBjZGVmL2RlZmlTaXRlLmgKLSAgY2RlZi9kZWZpU2xvdC5oCi0gIGNkZWYvZGVmaVRpbWluZ0Rpc2FibGUuaAotICBjZGVmL2RlZmlUeXBlZGVmcy5oCi0gIGNkZWYvZGVmaVVzZXIuaAotICBjZGVmL2RlZmlWaWEuaAotICBjZGVmL2RlZk1zZ1RhYmxlLmgKLSAgY2RlZi9kZWZyUmVhZGVyLmgKLSAgY2RlZi9kZWZ3V3JpdGVyQ2FsbHMuaAotICBjZGVmL2RlZndXcml0ZXIuaAotCi0gIGNkZWZ6bGliL2RlZnpsaWIuaAotKQotCi0KLSMgQklTT04gZGVwZW5kZW5jaWVzCi1hZGRfY3VzdG9tX2NvbW1hbmQoIAotICBPVVRQVVQgJHtERUZMSUJfSE9NRX0vZGVmL2RlZi50YWIuY3BwCi0gIENPTU1BTkQgJHtCSVNPTl9FWEVDVVRBQkxFfSAtdiAtcGRlZnl5IC1kICR7REVGTElCX0hPTUV9L2RlZi9kZWYueSAKLSAgQ09NTUFORCBtdiBkZWYudGFiLmggJHtERUZMSUJfSE9NRX0vZGVmL2RlZi50YWIuaAotICBDT01NQU5EIG12IGRlZi50YWIuYyAke0RFRkxJQl9IT01FfS9kZWYvZGVmLnRhYi5jcHAKLSkKLWFkZF9jdXN0b21fdGFyZ2V0KERlZkJpc29uVGFyZ2V0IEFMTCBERVBFTkRTIGRlZi9kZWYudGFiLmNwcCkKLQotCi1hZGRfbGlicmFyeSggZGVmIFNUQVRJQyAke0RFRkxJQl9ERUZfU1JDfSApCi1hZGRfbGlicmFyeSggZGVmemxpYiBTVEFUSUMgJHtERUZMSUJfREVGWkxJQl9TUkN9ICkKLQotYWRkX2xpYnJhcnkoIGNkZWYgU1RBVElDICR7REVGTElCX0NERUZfU1JDfSApCi1hZGRfbGlicmFyeSggY2RlZnpsaWIgU1RBVElDICR7REVGTElCX0NERUZaTElCX1NSQ30pCi0KLQotc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCBkZWYKLSAgUFJPUEVSVElFUwotICBBUkNISVZFX09VVFBVVF9ESVJFQ1RPUlkgJHtERUZMSUJfSE9NRX0vbGliCi0gIExJQlJBUllfT1VUUFVUX0RJUkVDVE9SWSAke0RFRkxJQl9IT01FfS9saWIKLSAgUlVOVElNRV9PVVRQVVRfRElSRUNUT1JZICR7REVGTElCX0hPTUV9L2xpYgotKQotCi1zZXRfdGFyZ2V0X3Byb3BlcnRpZXMoIGRlZnpsaWIKLSAgUFJPUEVSVElFUwotICBBUkNISVZFX09VVFBVVF9ESVJFQ1RPUlkgJHtERUZMSUJfSE9NRX0vbGliCi0gIExJQlJBUllfT1VUUFVUX0RJUkVDVE9SWSAke0RFRkxJQl9IT01FfS9saWIKLSAgUlVOVElNRV9PVVRQVVRfRElSRUNUT1JZICR7REVGTElCX0hPTUV9L2xpYgotKQotCi1zZXRfdGFyZ2V0X3Byb3BlcnRpZXMoIGNkZWYKLSAgUFJPUEVSVElFUwotICBBUkNISVZFX09VVFBVVF9ESVJFQ1RPUlkgJHtERUZMSUJfSE9NRX0vbGliCi0gIExJQlJBUllfT1VUUFVUX0RJUkVDVE9SWSAke0RFRkxJQl9IT01FfS9saWIKLSAgUlVOVElNRV9PVVRQVVRfRElSRUNUT1JZICR7REVGTElCX0hPTUV9L2xpYgotKQotCi1zZXRfdGFyZ2V0X3Byb3BlcnRpZXMoIGNkZWZ6bGliIAotICBQUk9QRVJUSUVTIAotICBBUkNISVZFX09VVFBVVF9ESVJFQ1RPUlkgJHtERUZMSUJfSE9NRX0vbGliCi0gIExJQlJBUllfT1VUUFVUX0RJUkVDVE9SWSAke0RFRkxJQl9IT01FfS9saWIKLSAgUlVOVElNRV9PVVRQVVRfRElSRUNUT1JZICR7REVGTElCX0hPTUV9L2xpYgotICBMSU5LRVJfTEFOR1VBR0UgQ1hYIAotKQotCi0jIGluY2x1ZGUgZGlyZWN0b3J5IHNldHRpbmdzCi10YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcyggZGVmCi0gIFBVQkxJQwotICBkZWYvCi0gICkKLQotdGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMoIGRlZnpsaWIKLSAgUFVCTElDCi0gIGRlZi8KLSAgZGVmemxpYi8KLSAgKQotCi10YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcyggY2RlZiAKLSAgUFVCTElDCi0gIGRlZi8KLSAgY2RlZi8KLSAgKQotCi10YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcyggY2RlZnpsaWIKLSAgUFVCTElDCi0gIGRlZi8KLSAgZGVmemxpYi8KLSAgY2RlZi8KLSAgY2RlZnpsaWIvCi0gICkKLQotYWRkX2RlcGVuZGVuY2llcyggY2RlZiBkZWYgKQotYWRkX2RlcGVuZGVuY2llcyggZGVmIERlZkJpc29uVGFyZ2V0ICkKLWFkZF9kZXBlbmRlbmNpZXMoIGRlZnpsaWIgZGVmICkKLWFkZF9kZXBlbmRlbmNpZXMoIGNkZWZ6bGliIGNkZWYgKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgaW5zdGFsbAotCi1pbnN0YWxsKEZJTEVTICR7REVGTElCX0hFQURFUlN9IERFU1RJTkFUSU9OIGluY2x1ZGUpCi1pbnN0YWxsKFRBUkdFVFMgZGVmIGRlZnpsaWIgY2RlZiBjZGVmemxpYiBERVNUSU5BVElPTiBsaWIpCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9MSUNFTlNFLlRYVCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9MSUNFTlNFLlRYVApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc4MDJhNC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvTElDRU5TRS5UWFQKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1Db3B5cmlnaHQgMjAxMiAtIDIwMTcsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLSAKLUxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoteW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L1RFU1QvY29tcGxldGUuNS44LmRlZiBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9URVNUL2NvbXBsZXRlLjUuOC5kZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNGFmNTAuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L1RFU1QvY29tcGxldGUuNS44LmRlZgorKysgL2Rldi9udWxsCkBAIC0xLDEwMDcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBERUY1N18wMSB0ZXN0Y2FzZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotVkVSU0lPTiA1LjggOyAKLU5BTUVTQ0FTRVNFTlNJVElWRSBPTiA7Ci1ESVZJREVSQ0hBUiAiLyIgOwotQlVTQklUQ0hBUlMgIltdIiA7Ci1ERVNJR04gZGVzaWduIDsKLVRFQ0hOT0xPR1kgdGVjaG5vbG9neSA7Ci1VTklUUyBESVNUQU5DRSBNSUNST05TIDEwMDAgOwotCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBQUk9QRVJUWURFRklOSVRJT05TIAotIyAgICBvYmplY3RUeXBlIHByb3BOYW1lIHByb3BUeXBlIFsgUkFOR0UgbWluIG1heCBdIFsgdmFsdWUgXSA7IC4uLiAKLSMgRU5EIFBST1BFUlRZREVGSU5JVElPTlMgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1QUk9QRVJUWURFRklOSVRJT05TCi0gIERFU0lHTiBzdHJwcm9wIFNUUklORyAiYVN0cmluZyIgOwotICBERVNJR04gaW50cHJvcCBJTlRFR0VSIDEgOwotICBERVNJR04gcmVhbHByb3AgUkVBTCAxLjEgOwotICBERVNJR04gaW50cmFuZ2Vwcm9wIElOVEVHRVIgUkFOR0UgMSAxMDAgMjUgOwotICBERVNJR04gcmVhbHJhbmdlcHJvcCBSRUFMIFJBTkdFIDEuMSAxMDAuMSAyNS4yNSA7Ci0gIFJFR0lPTiBzdHJwcm9wIFNUUklORyA7Ci0gIFJFR0lPTiBpbnRwcm9wIElOVEVHRVIgOwotICBSRUdJT04gcmVhbHByb3AgUkVBTCA7Ci0gIFJFR0lPTiBpbnRyYW5nZXByb3AgSU5URUdFUiBSQU5HRSAxIDEwMCA7Ci0gIFJFR0lPTiByZWFscmFuZ2Vwcm9wIFJFQUwgUkFOR0UgMS4xIDEwMC4xIDsKLSAgR1JPVVAgc3RycHJvcCBTVFJJTkcgOwotICBHUk9VUCBpbnRwcm9wIElOVEVHRVIgOwotICBHUk9VUCByZWFscHJvcCBSRUFMIDsKLSAgR1JPVVAgaW50cmFuZ2Vwcm9wIElOVEVHRVIgUkFOR0UgMSAxMDAgOwotICBHUk9VUCByZWFscmFuZ2Vwcm9wIFJFQUwgUkFOR0UgMS4xIDEwMC4xIDsKLSAgQ09NUE9ORU5UIHN0cnByb3AgU1RSSU5HIDsKLSAgQ09NUE9ORU5UIGludHByb3AgSU5URUdFUiA7Ci0gIENPTVBPTkVOVCByZWFscHJvcCBSRUFMIDsKLSAgQ09NUE9ORU5UIGludHJhbmdlcHJvcCBJTlRFR0VSIFJBTkdFIDEgMTAwIDsKLSAgQ09NUE9ORU5UIHJlYWxyYW5nZXByb3AgUkVBTCBSQU5HRSAxLjEgMTAwLjEgOwotICBORVQgc3RycHJvcCBTVFJJTkcgOwotICBORVQgaW50cHJvcCBJTlRFR0VSIDsKLSAgTkVUIHJlYWxwcm9wIFJFQUwgOwotICBORVQgaW50cmFuZ2Vwcm9wIElOVEVHRVIgUkFOR0UgMSAxMDAgOwotICBORVQgcmVhbHJhbmdlcHJvcCBSRUFMIFJBTkdFIDEuMSAxMDAuMSA7Ci0gIFNQRUNJQUxORVQgc3RycHJvcCBTVFJJTkcgOwotICBTUEVDSUFMTkVUIGludHByb3AgSU5URUdFUiA7Ci0gIFNQRUNJQUxORVQgcmVhbHByb3AgUkVBTCA7Ci0gIFNQRUNJQUxORVQgaW50cmFuZ2Vwcm9wIElOVEVHRVIgUkFOR0UgMSAxMDAgOwotICBTUEVDSUFMTkVUIHJlYWxyYW5nZXByb3AgUkVBTCBSQU5HRSAxLjEgMTAwLjEgOwotICBST1cgc3RycHJvcCBTVFJJTkcgOwotICBST1cgaW50cHJvcCBJTlRFR0VSIDsKLSAgUk9XIHJlYWxwcm9wIFJFQUwgOwotICBST1cgaW50cmFuZ2Vwcm9wIElOVEVHRVIgUkFOR0UgMSAxMDAgOwotICBST1cgcmVhbHJhbmdlcHJvcCBSRUFMIFJBTkdFIDEuMSAxMDAuMSA7Ci0gIENPTVBPTkVOVFBJTiBzdHJwcm9wIFNUUklORyA7Ci0gIENPTVBPTkVOVFBJTiBpbnRwcm9wIElOVEVHRVIgOwotICBDT01QT05FTlRQSU4gcmVhbHByb3AgUkVBTCA7Ci0gIENPTVBPTkVOVFBJTiBpbnRyYW5nZXByb3AgSU5URUdFUiBSQU5HRSAxIDEwMCA7Ci0gIENPTVBPTkVOVFBJTiByZWFscmFuZ2Vwcm9wIFJFQUwgUkFOR0UgMS4xIDEwMC4xIDsKLSAgTk9OREVGQVVMVFJVTEUgc3RycHJvcCBTVFJJTkcgOwotICBOT05ERUZBVUxUUlVMRSBpbnRwcm9wIElOVEVHRVIgOwotICBOT05ERUZBVUxUUlVMRSByZWFscHJvcCBSRUFMIDsKLSAgTk9OREVGQVVMVFJVTEUgaW50cmFuZ2Vwcm9wIElOVEVHRVIgUkFOR0UgMSAxMDAgOwotICBOT05ERUZBVUxUUlVMRSByZWFscmFuZ2Vwcm9wIFJFQUwgUkFOR0UgMS4xIDEwMC4xIDsKLUVORCBQUk9QRVJUWURFRklOSVRJT05TCi0KLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIERJRUFSRUEgcHQgcHQgOwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotRElFQVJFQSAoIC0xOTAwMDAgLTEyMDAwMCApICggLTE5MDAwMCAzNTAwMDAgKSAoIDE5MDAwMCAzNTAwMDAgKQotICAgICAgICAoIDE5MDAwMCAxOTAwMDAgKSAoIDE5MDM2MCAxOTAwMDAgKSAoIDE5MDM2MCAtMTIwMDAwICkgOwotCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBST1cgcm93TmFtZSByb3dUeXBlIG9yaWdYIG9yaWdZIG9yaWVudAotIyAgICAgeyBETyBudW1YIEJZIDEgU1RFUCBzcGFjZVggMAotIyAgICAgfCBETyAxIEJZIG51bVkgU1RFUCAwIHNwYWNlWSB9Ci0jICAgICArIFBST1BFUlRZIHsgcHJvcE5hbWUgcHJvcFZhbCB9Li4uIDsKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVJPVyBST1dfMSBDT1JFIDEwMDAgMTAwMCBOIERPIDEwMCBCWSAxIFNURVAgNzAwIDAKLSAgKyBQUk9QRVJUWSBzdHJwcm9wICJhU3RyaW5nIiAKLSAgKyBQUk9QRVJUWSBpbnRwcm9wIDEgCi0gICsgUFJPUEVSVFkgcmVhbHByb3AgMS4xIAotICArIFBST1BFUlRZIGludHJhbmdlcHJvcCAyNQotICArIFBST1BFUlRZIHJlYWxyYW5nZXByb3AgMjUuMjUgOwotUk9XIFJPV18yIENPUkUgMTAwMCAyMDAwIFMgRE8gMTAwIEJZIDEgU1RFUCA3MDAgMCA7Ci1ST1cgUk9XXzMgQ09SRSAxMDAwIDMwMDAgRSBETyAxMDAgQlkgMSBTVEVQIDg0MDAgMCA7Ci1ST1cgUk9XXzQgQ09SRSAxMDAwIDQwMDAgVyBETyAxMDAgQlkgMSBTVEVQIDg0MDAgMCA7Ci1ST1cgUk9XXzUgQ09SRSAxMDAwIDUwMDAgRk4gRE8gMTAwIEJZIDEgU1RFUCA3MDAgMCA7Ci1ST1cgUk9XXzYgQ09SRSAxMDAwIDYwMDAgRlMgRE8gMTAwIEJZIDEgU1RFUCA3MDAgMCA7Ci1ST1cgUk9XXzcgQ09SRSAxMDAwIDcwMDAgRkUgRE8gMTAwIEJZIDEgU1RFUCA4NDAwIDAgOwotUk9XIFJPV184IENPUkUgMTAwMCA4MDAwIEZXIERPIDEwMCBCWSAxIFNURVAgODQwMCAwIDsKLQotUk9XIFJPV19WRVJUXzEgQ09SRSAtMTAwMDAgLTEwMDAwIE4gRE8gMSBCWSAxMCBTVEVQIDAgODQwMCA7Ci1ST1cgUk9XX1ZFUlRfMiBDT1JFIC05MDAwIC0xMDAwMCBTIERPIDEgQlkgMTAgU1RFUCAwIDg0MDAgOwotUk9XIFJPV19WRVJUXzMgQ09SRSAtODAwMCAtMTAwMDAgRSBETyAxIEJZIDEwIFNURVAgMCA3MDAgOwotUk9XIFJPV19WRVJUXzQgQ09SRSAtNzAwMCAtMTAwMDAgVyBETyAxIEJZIDEwIFNURVAgMCA3MDAgOwotUk9XIFJPV19WRVJUXzUgQ09SRSAtNjAwMCAtMTAwMDAgRk4gRE8gMSBCWSAxMCBTVEVQIDAgODQwMCA7Ci1ST1cgUk9XX1ZFUlRfNiBDT1JFIC01MDAwIC0xMDAwMCBGUyBETyAxIEJZIDEwIFNURVAgMCA4NDAwIDsKLVJPVyBST1dfVkVSVF83IENPUkUgLTQwMDAgLTEwMDAwIEZFIERPIDEgQlkgMTAgU1RFUCAwIDcwMCA7Ci1ST1cgUk9XX1ZFUlRfOCBDT1JFIC0zMDAwIC0xMDAwMCBGVyBETyAxIEJZIDEgU1RFUCAwIDcwMCA7Ci0KLVJPVyBST1dfYXJyYXkwIEFSUkFZU0lURSAxMDAwMCAxMDAwMCBOIERPIDEwMCBCWSAxIFNURVAgMTYwMDAgMCA7Ci1ST1cgUk9XX2FycmF5MSBBUlJBWVNJVEUgMTAwMDAgMTcwMDAgVyBETyAxMDAgQlkgMSBTVEVQIDE2MDAwIDAgOwotUk9XIFJPV19hcnJheTIgQVJSQVlTSVRFIDEwMDAwIDE3MDAwIFMgRE8gMTAwIEJZIDEgU1RFUCAxNjAwMCAwIDsKLVJPVyBST1dfYXJyYXkzIEFSUkFZU0lURSAxMDAwMCAxNzAwMCBFIERPIDEwMCBCWSAxIFNURVAgMTYwMDAgMCA7Ci1ST1cgUk9XX2FycmF5NCBBUlJBWVNJVEUgMTAwMDAgMTcwMDAgRk4gRE8gMTAwIEJZIDEgU1RFUCAxNjAwMCAwIDsKLVJPVyBST1dfYXJyYXk1IEFSUkFZU0lURSAxMDAwMCAxNzAwMCBGRSBETyAxMDAgQlkgMSBTVEVQIDE2MDAwIDAgOwotUk9XIFJPV19hcnJheTYgQVJSQVlTSVRFIDEwMDAwIDE3MDAwIEZTIERPIDEwMCBCWSAxIFNURVAgMTYwMDAgMCA7Ci1ST1cgUk9XX2FycmF5NyBBUlJBWVNJVEUgMTAwMDAgMTcwMDAgRlcgRE8gMTAwIEJZIDEgU1RFUCAxNjAwMCAwIDsKLQotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVFJBQ0tTIAotIyAgICB7WCB8IFl9IHN0YXJ0IAotIyAgICBETyBudW10cmFja3MgU1RFUCBzcGFjZSAKLSMgICAgWyBNQVNLIG1hc2tOdW0ge1NBTUVNQVNLXV0KLSMgICAgWyBMQVlFUiBsYXllck5hbWUgLi4uXSA7Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1UUkFDS1MgWSA1MiBETyA4NTcgU1RFUCAxMDQgTUFTSyAxIDsKLVRSQUNLUyBZIDUyIERPIDg1NyBTVEVQIDEwNCBNQVNLIDEgU0FNRU1BU0sgTEFZRVIgTTEgTTIgOwotVFJBQ0tTIFggNTIgRE8gMTcyMCBTVEVQIDEwNCBNQVNLIDIgTEFZRVIgTTIgOwotVFJBQ0tTIFggNTIgRE8gMTcyMCBTVEVQIDEwNCA7Ci0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBHQ0VMTEdSSUQgCi0jICAgIFggc3RhcnQgRE8gbnVtQ29sdW1ucysxIFNURVAgc3BhY2UgCi0jICAgIFkgc3RhcnQgRE8gbnVtUm93cysxIFNURVAgc3BhY2UgOwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotR0NFTExHUklEIFggMCBETyAxMDAgU1RFUCA2MDAgOwotR0NFTExHUklEIFkgMTAgRE8gMTIwIFNURVAgNDAwIDsKLQotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVklBUyBudW1WaWFzIDsKLSMgICAgIFstIHZpYU5hbWUgCi0jICAgICBbKyBQQVRURVJOTkFNRSBwYXR0ZXJuTmFtZV0KLSMgICAgICArIFJFQ1QgbGF5ZXJOYW1lIFsrIE1BU0sgbWFza05VTV0gcHQgcHQKLSMgICAgICAgfCArIFBPTFlHT04gbGF5ZXJOYW1lIFsrIE1BU0sgbWFza05VTV0gcHQgcHQgcHRdLi4uO10uLi4gCi0jIEVORCBWSUFTCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1WSUFTIDYgOwotLSBWSUFHRU4xMl8wCi0gICAgKyBQQVRURVJOTkFNRSBWSUFHRU5fMTJfMTIuODAwXzcuNjAwX0k1Ci0gICAgKyBSRUNUIE1FVEFMMSAoIC00NDAwIC0zODAwICkgKCA0NDAwIDM4MDAgKQotICAgICsgUkVDVCBNMiArIE1BU0sgMyAoIC00NTAwIC0zODAwICkgKCA0NTAwIDM4MDAgKQotICAgICsgUkVDVCBWMSArIE1BU0sgMiAoIC0zNjAwIC0zODAwICkgKCAtMjAwMCAtMjIwMCApCi0gICAgKyBSRUNUIFYxICsgTUFTSyAxICggLTM2MDAgMjIwMCApICggLTIwMDAgMzgwMCApCi0gICAgKyBSRUNUIFYxICsgTUFTSyAyICggMjAwMCAtMzgwMCApICggMzYwMCAtMjIwMCApCi0gICAgKyBSRUNUIFYxICsgTUFTSyAzICggMjAwMCAyMjAwICkgKCAzNjAwIDM4MDAgKSA7Ci0KLS0gVklBR0VOMTJfMgotICAgICsgUEFUVEVSTk5BTUUgVklBR0VOXzEyXzUuMDAwMF8zLjAwMF8xLjU2MDBfLTAuMTYwMF8xLjA0MDBfMS4wNDAwX0QKLSAgICArIFJFQ1QgTUVUQUwxICggLTI1MDAgLTE1MDAgKSAoIDI1MDAgMTUwMCApCi0gICAgKyBSRUNUIE0yICggLTI1MDAgLTE1MDAgKSAoIDI1MDAgMTUwMCApCi0gICAgKyBSRUNUIFYxICggLTIzNjAgLTk2MCApICggLTc2MCA2NDAgKQotICAgICsgUkVDVCBWMSAoIC0xMzIwIC05NjAgKSAoIDI4MCA2NDAgKQotICAgICsgUkVDVCBWMSAoIDc2MCAtOTYwICkgKCAyMzYwIDY0MCApIDsKLQotLSBWSUFHRU4xMl8zCi0gICAgKyBQQVRURVJOTkFNRSBWSUFHRU4xMgotICAgICsgUkVDVCBNRVRBTDEgKCAtMTYwMCAtMTYwMCApICggMTYwMCAxNjAwICkKLSAgICArIFJFQ1QgTTIgKCAtMTYwMCAtMTYwMCApICggMTYwMCAxNjAwICkKLSAgICArIFJFQ1QgVjEgKCAtODAwIC04MDAgKSAoIDgwMCA4MDAgKSA7Ci0KLS0gVklBR0VOMTJfNAotICAgICsgVklBUlVMRSBWSUFHRU4xMgotICAgICsgQ1VUU0laRSAxNjAwIDE2MDAKLSAgICArIExBWUVSUyBNMSBWMSBNMgotICAgICsgQ1VUU1BBQ0lORyA1NjAwIDYxMDAKLSAgICArIEVOQ0xPU1VSRSAxMDAgMTAwIDE1MCAxNTAKLSAgICArIFJPV0NPTCA1IDE0Ci0gICAgKyBQQVRURVJOIDJfRkZFMF8zX0ZGRkYgCi0gICAgKyBPUklHSU4gMTAgLTEwCi0gICAgKyBPRkZTRVQgMCAwIDIwIC0yMCA7Ci0KLS0gTTJfTTFyY3RfMAotICArIFJFQ1QgVjEgKCAtMjUgLTY1ICkgKCAyNSA2NSApCi0gICsgUkVDVCBNMSAoIC0zNSAtOTUgKSAoIDM1IDk1ICkKLSAgKyBSRUNUIE0yICggLTY1IC02NSApICggNjUgNjUgKSA7Ci0KLS0gVklBR0VOMTJfMQotICAgICsgUE9MWUdPTiBNRVRBTDEgKyBNQVNLIDIgKCAtMjUwMCAtMTUwMCApICggLTI1MDAgMjUwMCApICggMTUwMCAyNTAwICkgKCAxNTAwIDE1MDAgKSAoIDI1MDAgMTUwMCApICggMjUwMCAtMTUwMCApCi0gICAgKyBSRUNUIE0yICggLTI1MDAgLTE1MDAgKSAoIDI1MDAgMTUwMCApCi0gICAgKyBSRUNUIFYxICggLTI0MDAgLTk2MCApICggLTcwMCA2NDAgKSA7Ci0gICAgCi0tIENVU1RPTVZJQQotICAgICsgUE9MWUdPTiBNRVRBTDEgKyBNQVNLIDMgKCAtMjUwMCAtMTUwMCApICggLTI1MDAgMjUwMCApICggMTUwMCAyNTAwICkgKCAxNTAwIDE1MDAgKSAoIDI1MDAgMTUwMCApICggMjUwMCAtMTUwMCApIDsKLSAgICAKLS0gVFVSTk0xXzEKLSAgICArIFJFQ1QgTUVUQUwxICggLTEwMCAtNjAgKSAoIDEwMCA2MCApIDsKLS0gVFVSTk0yXzEKLSAgICArIFJFQ1QgTTIgKCAtMTAwIC02MCApICggMTAwIDYwICkgOwotLSBUVVJOTTNfMQotICAgICsgUkVDVCBNMyAoIC0xMDAgLTYwICkgKCAxMDAgNjAgKSA7Ci0tIG15dmlhMQotICAgICsgUkVDVCBNRVRBTDEgKyBNQVNLIDIgKCAwIDAgKSAoIDQwMDAwIDQwMDAwICkKLSAgICArIFJFQ1QgVjEgKyBNQVNLIDMgKCAwIDAgKSAoIDQwMDAwIDQwMDAwICkKLSAgICArIFJFQ1QgTTIgKCAwIDAgKSAoIDQwMDAwIDQwMDAwICkgOwotRU5EIFZJQVMKLQotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgW1NUWUxFUyBudW1TdHlsZXMgOwotIyAgICAgey0gU1RZTEUgc3R5bGVOdW0gcHQgcHQgcHQghSA7fSAuLi4KLSMgRU5EIFNUWUxFU10KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVNUWUxFUyAxMCA7Ci0tIFNUWUxFIDAgKCAzMCAxMCApICggMTAgMzAgKSAoIC0xMCAzMCApICggLTMwIDEwICkgKCAtMzAgLTEwICkgKCAtMTAgLTMwICkgKCAxMCAtMzAgKSAoIDMwIC0xMCApIDsKLS0gU1RZTEUgMSAoIDI1IDI1ICkgKCAtMjUgMjUgKSAoIC0yNSAtMjUgKSAoIDI1IC0yNSApIDsKLS0gU1RZTEUgMiAoIDUwIDUwICkgKCAtNTAgNTAgKSAoIC01MCAtNTAgKSAoIDUwIC01MCApIDsKLS0gU1RZTEUgMyAoIDUwIDIxICkgKCAyMSA1MCApICggLTIxIDUwICkgKCAtNTAgMjEgKSAoIC01MCAtMjEgKSAoIC0yMSAtNTAgKSAoIDIxIC01MCApICggNTAgLTIxICkgOwotLSBTVFlMRSA0ICggLTMwIC0yMCApICggMTAgLTYwICkgKCA1MCAtMjAgKSAoIDUwIDQwICkgKCAwIDQwICkgKCAtMzAgMTAgKSA7Ci0tIFNUWUxFIDUgKCAwIDIwMDAgKSAoIDAgLTIwMDAgKSAoIDAgMjAwMCApICggMCAtMjAwMCApIDsKLS0gU1RZTEUgNiAoIC0yMDAwIDIwMDAgKSAoIDIwMDAgLTIwMDAgKSAoICogKiApIDsKLS0gU1RZTEUgNyAoIDAgMCApICggMCAxMDAwICkgKCAxMDAwIDAgKSA7Ci0tIFNUWUxFIDggKCAtNzUwMCAtMzExMCApICggLTMxMTAgLTc1MDAgKSAoIDMxMTAgLTc1MDAgKSAoIDc1MDAgLTMxMTAgKSAoIDc1MDAgNzUwMCApICggLTc1MDAgNzUwMCApIDsKLS0gU1RZTEUgOSAoIDAgLTEwNjEwICkgKCA3NTAwIC0zMTEwICkgKCA3NTAwIDMxMTAgKSAoIDMxMTAgNzUwMCApICggLTMxMTAgNzUwMCApICggLTEwNjEwIDAgKSA7Ci1FTkQgU1RZTEVTCi0KLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFtOT05ERUZBVUxUUlVMRVMgbnVtTkRScyA7Ci0jICAgICB7LSBTVFlMRSBzdHlsZU51bSBwdCBwdCBwdCCFIDt9IC4uLgotIyBFTkQgTk9OREVGQVVMVFJVTEVTXQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotTk9OREVGQVVMVFJVTEVTIDEgOwotLSBERUZBVUxUCi0gICsgTEFZRVIgTUVUQUwxCi0gICAgICBXSURUSCAxMC4xCi0gICAgICBESUFHV0lEVEggOC4wMQotICAgICAgU1BBQ0lORyAyLjIKLSAgICAgIFdJUkVFWFQgMS4xCi0gICsgTEFZRVIgTTIKLSAgICAgIFdJRFRIIDEwLjEKLSAgICAgIFNQQUNJTkcgMi4yCi0gICsgTEFZRVIgTTMKLSAgICAgIFdJRFRIIDExLjEKLSAgICAgIFNQQUNJTkcgMy4yCi0gICsgVklBIE0xX00yCi0gICsgVklBIE0yX00zCi0gICsgVklBUlVMRSBWSUFHRU4xMgotICArIE1JTkNVVFMgVjEgMgotICArIFBST1BFUlRZIHN0cnByb3AgImFTdHJpbmciIAotICArIFBST1BFUlRZIGludHByb3AgMSAKLSAgKyBQUk9QRVJUWSByZWFscHJvcCAxLjEgCi0gICsgUFJPUEVSVFkgaW50cmFuZ2Vwcm9wIDI1Ci0gICsgUFJPUEVSVFkgcmVhbHJhbmdlcHJvcCAyNS4yNSA7Ci0tIFJVTEUyCi0gICsgSEFSRFNQQUNJTkcgCi0gICsgTEFZRVIgTUVUQUwxCi0gICAgICBXSURUSCAxMC4xCi0gICAgICBESUFHV0lEVEggOC4wMQotICAgICAgU1BBQ0lORyAyLjIKLSAgICAgIFdJUkVFWFQgMS4xCi0gICsgTEFZRVIgTTIKLSAgICAgIFdJRFRIIDEwLjEKLSAgICAgIFNQQUNJTkcgMi4yCi0gICsgTEFZRVIgTTMKLSAgICAgIFdJRFRIIDExLjEKLSAgICAgIFNQQUNJTkcgMy4yCi0gICsgVklBIE0xX00yCi0gICsgVklBIE0yX00zCi0gICsgVklBUlVMRSBWSUFHRU4xMgotICArIE1JTkNVVFMgVjEgMgotICArIFBST1BFUlRZIHN0cnByb3AgImFTdHJpbmciIAotICArIFBST1BFUlRZIGludHByb3AgMSAKLSAgKyBQUk9QRVJUWSByZWFscHJvcCAxLjEgCi0gICsgUFJPUEVSVFkgaW50cmFuZ2Vwcm9wIDI1Ci0gICsgUFJPUEVSVFkgcmVhbHJhbmdlcHJvcCAyNS4yNSA7Ci1FTkQgTk9OREVGQVVMVFJVTEVTCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBSRUdJT05TIG51bVJlZ2lvbnM7IAotIyAgICAgWy0gcmVnaW9uTmFtZSBwdCBwdCBbcHQgcHRdLi4uIAotIyAgICAgWysgVFlQRSBbIEZFTkNFIHwgR1VJREUgXQotIyAgICAgWysgUFJPUEVSVFkge3Byb3BOYW1lIHByb3BWYWx9Li4uXS4uLjtdLi4uIAotIyBFTkQgUkVHSU9OUwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotUkVHSU9OUyAyIDsKLS0gcmVnaW9uMSAoIC01MDAgLTUwMCApICggMzAwIDEwMCApICggNTAwIDUwMCApICggMTAwMCAxMDAwICkKLSAgKyBUWVBFIEZFTkNFCi0gICsgUFJPUEVSVFkgc3RycHJvcCAiYVN0cmluZyIgCi0gICsgUFJPUEVSVFkgaW50cHJvcCAxIAotICArIFBST1BFUlRZIHJlYWxwcm9wIDEuMSAKLSAgKyBQUk9QRVJUWSBpbnRyYW5nZXByb3AgMjUKLSAgKyBQUk9QRVJUWSByZWFscmFuZ2Vwcm9wIDI1LjI1IDsKLS0gcmVnaW9uMiAoIDQwMDAgMCApICggNTAwMCAxMDAwICkKLSAgKyBUWVBFIEdVSURFIDsKLUVORCBSRUdJT05TCi0KLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENPTVBPTkVOVFMgbnVtQ29tcHMgOyAKLSMgICAgIFstIGNvbXBOYW1lIG1vZGVsTmFtZVtuZXROYW1lIHwgKl0uLi4gCi0jICAgICAgICAgWysgRUVRTUFTVEVSIG1hY3JvbmFtZV0gCi0jICAgICAgICAgWysgR0VORVJBVEUgZ2VuZXJhdG9yTmFtZSBbcGFyYW1ldGVyc11dIAotIyAgICAgICAgIFsrIFNPVVJDRSB7TkVUTElTVCB8IERJU1QgfCBVU0VSIHwgVElNSU5HfV0gCi0jICAgICAgICAgWysgRk9SRUlHTiBmb3JlaWduQ2VsbE5hbWUgcHQgb3JpZW50XS4uLiAKLSMgICAgICAgICBbKyB7RklYRUQgcHQgb3JpZW50IHwgQ09WRVIgcHQgb3JpZW50IHwgUExBQ0VEIHB0IG9yaWVudCB8IFVOUExBQ0VEfV0KLSMgICAgICAgICBbKyBXRUlHSFQgd2VpZ2h0XSAKLSMgICAgICAgICBbKyBSRUdJT04ge3B0IHB0IHwgcmVnaW9uTmFtZX1dIAotIyAgICAgICAgIFsrIFBST1BFUlRZIHtwcm9wTmFtZSBwcm9wVmFsfS4uLl0uLi47IAotIyAgICAgXS4uLiAKLSMgRU5EIENPTVBPTkVOVFMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUNPTVBPTkVOVE1BU0tTSElGVCBNMyBNMiBWMSBNMSA7Ci0KLUNPTVBPTkVOVFMgMTMgOwotLSBJMSBCCi0gICsgRUVRTUFTVEVSIEEKLSAgKyBHRU5FUkFURSBnZW5lcmF0b3IgCi0gICsgU09VUkNFIE5FVExJU1QKLSAgKyBGT1JFSUdOIGdkczJuYW1lICggLTUwMCAtNTAwICkgTgotICArIFBMQUNFRCAoIDEwMCAxMDAgKSBOCi0gICsgV0VJR0hUIDEwMAotICArIFJFR0lPTiByZWdpb24xIAotICArIE1BU0tTSElGVCAxMTAyCi0gICsgSEFMTyA1IDYgNyA4Ci0gICsgSEFMTyBTT0ZUIDUgNiA3IDgKLSAgKyBST1VURUhBTE8gMTAwIE1FVEFMMSBNMwotICArIFBST1BFUlRZIHN0cnByb3AgImFTdHJpbmciIAotICArIFBST1BFUlRZIGludHByb3AgMSAKLSAgKyBQUk9QRVJUWSByZWFscHJvcCAxLjEgCi0gICsgUFJPUEVSVFkgaW50cmFuZ2Vwcm9wIDI1Ci0gICsgUFJPUEVSVFkgcmVhbHJhbmdlcHJvcCAyNS4yNSA7Ci0tIEkyIEEKLSAgKyBTT1VSQ0UgRElTVAotICArIFJPVVRFSEFMTyAxMDAgTTIgTTMKLSAgKyBQTEFDRUQgKCAyMDAgMjAwICkgUyA7Ci0tIEkzIEEKLSAgKyBTT1VSQ0UgVVNFUgotICArIFBMQUNFRCAoIDMwMCAzMDAgKSBFIDsKLS0gSTQgQQotICArIFNPVVJDRSBUSU1JTkcKLSAgKyBQTEFDRUQgKCA0MDAgNDAwICkgVyA7Ci0tIEk1IEEKLSAgKyBQTEFDRUQgKCA1MDAgNTAwICkgRk4gOwotLSBJNiBBCi0gICsgUExBQ0VEICggNjAwIDYwMCApIEZTIDsKLS0gSTcgQQotICArIFBMQUNFRCAoIDcwMCA3MDAgKSBGRSA7Ci0tIEk4IEEKLSAgKyBQTEFDRUQgKCA4MDAgODAwICkgRlcgOwotLSBJOSBBCi0gICsgRklYRUQgKCA5MDAgOTAwICkgTiA7Ci0tIEkxMCBBCi0gICsgQ09WRVIgKCAxMDAwIDEwMDAgKSBOIDsKLS0gSTExIEEKLSAgKyBVTlBMQUNFRCA7Ci0tIEkxMlswXSBBIDsKLS0gSTEyWzFdIEEgOwotLSBJMTNbMF1bMTBdIEEgOwotLSBJMTRcWzFcXSBBIDsKLS0gdmVjdG9ybW9kdWxlWzFdL3NjYWxhcm5hbWUgQSA7Ci0tIHZlY3Rvcm1vZHVsZVsxXS92ZWN0b3JuYW1lWzFdIEEgOwotLSBzY2FuY2VsbDEgQ0hLM0EgOwotLSBzY2FuY2VsbDIgQ0hLM0EgOwotLSBzY2FuY2VsbDMgQ0hLM0EgOwotLSBzY2FuY2VsbDQgQ0hLM0EgOwotLSBzY2FuY2VsbDUgQ0hLM0EgOwotLSBzY2FuY2VsbDYgQ0hLM0EgOwotLSBzY2FuY2VsbDcgQ0hLM0EgOwotLSBzY2FuY2VsbDggQ0hLM0EgOwotLSBzY2FuY2VsbDkgQ0hLM0EgOwotLSBzY2FuY2VsbDEwIENISzNBIDsKLS0gc2NhbmNlbGwxMSBDSEszQSA7Ci0tIHNjYW5jZWxsMTIgQ0hLM0EgOwotLSBub2JyYWNrZXRzIEEgOwotLSBzb21ldGhpbmd3aXRoWzFdIEEgOwotLSBtb3JlW11icmFja2V0cyBBIDsKLS0gbW9yZVsxXWJyYWNrZXRzIEEgOwotLSBtb3JlXFsxXF1icmFja2V0cyBBIDsKLS0gbW9yZVsxXVsyXSBBIDsKLS0gbW9yZVxbMVxdXFsyXF0gQSA7Ci0tIG1vcmVcWzJcXSBBIDsKLS0gZm9vXFsxXF1cWzJcXS9oYWhhXFszXF1cWzRcXSBBIDsKLS0gZm9vWzJdWzNdL2hhaGFbNF1bNV0gQSA7Ci0tIGZvb1xbM1xdXFs0XF0vaGFoYVs1XVs2XSBBIDsKLS0gZm9vWzRdWzVdL2hhaGFcWzZcXVxbN1xdIEEgOwotLSBmb29bNV1bNl1iYXIvaGFoYVxbN1xdXFs4XF0gQSA7Ci0tIGZvb1s2XVs3XWJhci9oYWhhWzhdWzldIEEgOwotRU5EIENPTVBPTkVOVFMKLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFBJTlMgbnVtUGlucyA7IAotIyAgICAgWyAtIHBpbk5hbWUgKyBORVQgbmV0TmFtZSAKLSMgICAgICAgIFsrIFNQRUNJQUxdIAotIyAgICAgICAgWysgRElSRUNUSU9OIHtJTlBVVCB8IE9VVFBVVCB8IElOT1VUIHwgRkVFRFRIUlV9XSAKLSMgICAgICAgIFsrIFVTRSB7U0lHTkFMIHwgUE9XRVIgfCBHUk9VTkQgfCBDTE9DSwotIyAgICAgICAgICAgICAgICAgICAgfCBBTkFMT0cgfCAgU0NBTiAgfCAgUkVTRVR9XSAKLSMgICAgICAgIFsrIExBWUVSIGxheWVyTmFtZSBwdCBwdF0gCi0jICAgICAgICBbKyB7RklYRUQgfCBQTEFDRUQgfCBDT1ZFUn0gcHQgb3JpZW50XSAKLSMgICAgICAgIFsrIEFOVEVOTkFQSU5QQVJUSUFMTUVUQUxBUkVBICAgICAgaW50ZWdlciBbTEFZRVIgbGF5ZXJOYW1lXSBdIC4uLiAKLSMgICAgICAgIFsrIEFOVEVOTkFQSU5QQVJUSUFMTUVUQUxTSURFQVJFQSAgaW50ZWdlciBbTEFZRVIgbGF5ZXJOYW1lXSBdIC4uLiAKLSMgICAgICAgIFsrIEFOVEVOTkFQSU5ESUZGQVJFQSAgICAgICAgICAgICAgaW50ZWdlciBbTEFZRVIgbGF5ZXJOYW1lXSBdIC4uLiAKLSMgICAgICAgIFsrIEFOVEVOTkFQSU5QQVJUSUFMQ1VUQVJFQSAgICAgICAgaW50ZWdlciBbTEFZRVIgY3V0TGF5ZXJOYW1lXSBdIC4uLiAKLSMgICAgICAgIFsrIEFOVEVOTkFNT0RFTCBPWElERXsxLDIsMyw0fSBdCi0jICAgICAgICBbKyBBTlRFTk5BUElOR0FURUFSRUEgICAgICAgICAgICAgIGludGVnZXIgW0xBWUVSIGxheWVyTmFtZV0gXSAuLi4gCi0jICAgICAgICBbKyBBTlRFTk5BUElOTUFYQVJFQUNBUiAgICAgICAgICAgIGludGVnZXIgTEFZRVIgbGF5ZXJOYW1lIF0gCi0jICAgICAgICBbKyBBTlRFTk5BUElOTUFYU0lERUFSRUFDQVIgICAgICAgIGludGVnZXIgTEFZRVIgbGF5ZXJOYW1lIF0gCi0jICAgICAgICBbKyBBTlRFTk5BUElOTUFYQ1VUQ0FSICAgICAgICAgICAgIGludGVnZXIgTEFZRVIgbGF5ZXJOYW1lIF0gCi0jICAgICA7IAotIyAgICAgXS4uLiAKLSMgRU5EIFBJTlMgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1QSU5TIDExIDsKLS0gUDAgKyBORVQgTjAKLSAgKyBTUEVDSUFMCi0gICsgRElSRUNUSU9OIElOUFVUCi0gICsgVVNFIFNJR05BTAotICArIFBPUlQKLSAgICArIExBWUVSIE0yIE1BU0sgMiAoIDAgMCApICggMzAgMTM1ICkKLSAgICArIFZJQSBWSUFHRU4xMl8wICggMCAxMDAgKQotICAgICsgRklYRUQgKCA0NSAtMjE2MCApIE4KLSAgKyBQT1JUCi0gICAgKyBMQVlFUiBNMSAoIDAgMCApICggMzAgMTM1ICkKLSAgICArIFZJQSBNMV9NMiBNQVNLIDIzICggMTAwIDAgKQotICAgICsgQ09WRVIgKCAwIC0xMDAwICkgTgotICArIFBPUlQKLSAgICArIExBWUVSIE0zICggMCAwICkgKCAzMCAxMzUgKQotICAgICsgUExBQ0VEICggMTAwMCAtMTAwMCApIE4KLSAgKyBORVRFWFBSICJwb3dlcjEgVkREIgotICArIFNVUFBMWVNFTlNJVElWSVRZIFAxCi0gICsgR1JPVU5EU0VOU0lUSVZJVFkgUDIKLSAgKyBBTlRFTk5BUElOUEFSVElBTE1FVEFMQVJFQSAgICAgIDUgTEFZRVIgTUVUQUwxCi0gICsgQU5URU5OQVBJTlBBUlRJQUxNRVRBTEFSRUEgICAgICA1IExBWUVSIE0yCi0gICsgQU5URU5OQVBJTlBBUlRJQUxNRVRBTFNJREVBUkVBICAxMCBMQVlFUiBNRVRBTDEKLSAgKyBBTlRFTk5BUElOUEFSVElBTE1FVEFMU0lERUFSRUEgIDEwIExBWUVSIE0yCi0gICsgQU5URU5OQVBJTkRJRkZBUkVBICAgICAgICAgICAgICAyMCBMQVlFUiBNMQotICArIEFOVEVOTkFQSU5ESUZGQVJFQSAgICAgICAgICAgICAgMjAgTEFZRVIgTTIKLSAgKyBBTlRFTk5BUElOUEFSVElBTENVVEFSRUEgICAgICAgIDM1IExBWUVSIFYxCi0gICsgQU5URU5OQVBJTlBBUlRJQUxDVVRBUkVBICAgICAgICAzNSBMQVlFUiBWMgotICArIEFOVEVOTkFNT0RFTCBPWElERTEKLSAgKyBBTlRFTk5BUElOR0FURUFSRUEgICAgICAgICAgICAgIDE1IExBWUVSIE0xCi0gICsgQU5URU5OQVBJTkdBVEVBUkVBICAgICAgICAgICAgICAxNSBMQVlFUiBNMgotICArIEFOVEVOTkFQSU5NQVhBUkVBQ0FSICAgICAgICAgICAgMjUgTEFZRVIgTTEKLSAgKyBBTlRFTk5BUElOTUFYU0lERUFSRUFDQVIgICAgICAgIDMwIExBWUVSIE0xCi0gICsgQU5URU5OQVBJTk1BWENVVENBUiAgICAgICAgICAgICA0MCBMQVlFUiBNMSAKLSAgKyBBTlRFTk5BTU9ERUwgT1hJREUyCi0gICsgQU5URU5OQVBJTkdBVEVBUkVBICAgICAgICAgICAgICAxMTUgTEFZRVIgTTEKLSAgKyBBTlRFTk5BUElOR0FURUFSRUEgICAgICAgICAgICAgIDExNSBMQVlFUiBNMgotICArIEFOVEVOTkFQSU5NQVhBUkVBQ0FSICAgICAgICAgICAgMTI1IExBWUVSIE0xCi0gICsgQU5URU5OQVBJTk1BWFNJREVBUkVBQ0FSICAgICAgICAxMzAgTEFZRVIgTTEKLSAgKyBBTlRFTk5BUElOTUFYQ1VUQ0FSICAgICAgICAgICAgIDE0MCBMQVlFUiBNMQotICArIEFOVEVOTkFNT0RFTCBPWElERTMKLSAgKyBBTlRFTk5BUElOR0FURUFSRUEgICAgICAgICAgICAgIDExNSBMQVlFUiBNMQotICArIEFOVEVOTkFQSU5HQVRFQVJFQSAgICAgICAgICAgICAgMTE1IExBWUVSIE0yCi0gICsgQU5URU5OQVBJTk1BWEFSRUFDQVIgICAgICAgICAgICAxMjUgTEFZRVIgTTEKLSAgKyBBTlRFTk5BUElOTUFYU0lERUFSRUFDQVIgICAgICAgIDEzMCBMQVlFUiBNMQotICArIEFOVEVOTkFQSU5NQVhDVVRDQVIgICAgICAgICAgICAgMTQwIExBWUVSIE0xCi0gICsgQU5URU5OQU1PREVMIE9YSURFNAotICArIEFOVEVOTkFQSU5HQVRFQVJFQSAgICAgICAgICAgICAgMTE1IExBWUVSIE0xCi0gICsgQU5URU5OQVBJTkdBVEVBUkVBICAgICAgICAgICAgICAxMTUgTEFZRVIgTTIKLSAgKyBBTlRFTk5BUElOTUFYQVJFQUNBUiAgICAgICAgICAgIDEyNSBMQVlFUiBNMQotICArIEFOVEVOTkFQSU5NQVhTSURFQVJFQUNBUiAgICAgICAgMTMwIExBWUVSIE0xCi0gICsgQU5URU5OQVBJTk1BWENVVENBUiAgICAgICAgICAgICAxNDAgTEFZRVIgTTEgOwotLSBQMSAgKyBORVQgTjEKLSAgKyBESVJFQ1RJT04gT1VUUFVUCi0gICsgVVNFIFBPV0VSCi0gICsgUE9MWUdPTiBNMiBNQVNLIDMgKCAwIDAgKSAoIDAgMTAwICkgKCA1MCAxMDAgKSAoIDUwIDUwICkgKCAxMDAgNTAgKSAoIDEwMCAwICkKLSAgKyBQTEFDRUQgKCA0NSAtMjE2MCApIE4gCi0gICsgTkVURVhQUiAicG93ZXIxIFZERFsxXSIKLSAgKyBBTlRFTk5BUElOUEFSVElBTE1FVEFMQVJFQSAgICAgIDUKLSAgKyBBTlRFTk5BUElOUEFSVElBTE1FVEFMU0lERUFSRUEgIDEwCi0gICsgQU5URU5OQVBJTkdBVEVBUkVBICAgICAgICAgICAgICAxNQotICArIEFOVEVOTkFQSU5ESUZGQVJFQSAgICAgICAgICAgICAgMjAKLSAgKyBBTlRFTk5BUElOUEFSVElBTENVVEFSRUEgICAgICAgIDM1IDsKLS0gUDIgICsgTkVUIE4yCi0gICsgRElSRUNUSU9OIElOT1VUCi0gICsgVVNFIEdST1VORAotICArIExBWUVSIE0yIE1BU0sgMiAoIDAgMCApICggMzAgMTM1ICkKLSAgKyBDT1ZFUiAoIDQ1IC0yMTYwICkgTiA7Ci0tIFAyLmV4dHJhMSArIE5FVCBOMgotICArIERJUkVDVElPTiBJTk9VVAotICArIFVTRSBHUk9VTkQKLSAgKyBMQVlFUiBNRVRBTDEgKCAwIDAgKSAoIDEwIDEwICkKLSAgKyBDT1ZFUiAoIDAgMCApIE4gOwotLSBQMyAgKyBORVQgTjMKLSAgKyBESVJFQ1RJT04gRkVFRFRIUlUKLSAgKyBVU0UgQ0xPQ0sgOwotLSBQNCAgKyBORVQgTjQKLSAgKyBVU0UgU0lHTkFMIDsKLS0gUDUgKyBORVQgTjUKLSAgKyBVU0UgQU5BTE9HIDsKLS0gUDYgKyBORVQgTjYKLSAgKyBVU0UgU0NBTiA7Ci0tIFA3ICsgTkVUIE43Ci0gICsgVVNFIFJFU0VUIDsKLS0gQVJSQVlQSU5bMF1bMTBdICsgTkVUIEFSUkFZTkVUWzBdWzEwXQotICArIExBWUVSIE0yICggMCAwICkgKCAzMCAxMzUgKSA7Ci0tIEFSUkFZUElOLmV4dHJhMlswXVsxMF0gKyBORVQgQVJSQVlORVRbMF1bMTBdCi0gICsgTEFZRVIgTTIgKCAwIDAgKSAoIDEwIDEwICkgOwotLSBzY2FucGluICsgTkVUIFNDQU4gCi0gICsgVVNFIFNDQU4gOwotLSBzY2FucGluMiArIE5FVCBTQ0FOIAotICArIFVTRSBTQ0FOIDsKLS0gSU5CVVNbMV0gKyBORVQgSU5CVVM8MT4KLSAgKyBMQVlFUiBNRVRBTDEgKCAwIDAgKSAoIDEwIDEwICkgOwotLSBPVVRCVVM8MT4gKyBORVQgT1VUQlVTPDE+IDsKLS0gSU5CVVMuZXh0cmExWzFdICsgTkVUIElOQlVTPDE+Ci0gICsgTEFZRVIgTTEgKCAxMCAxMCApICggMTAwIDEwMCApIDsKLS0gdmVjdG9ycGluWzBdICsgTkVUIHZlY3Rvcm1vZHVsZVsxXS92ZWN0b3JuZXRbMF0gOwotLSBzY2FsYXJwaW4gKyBORVQgdmVjdG9ybW9kdWxlWzFdL3NjYWxhcm5ldCA7Ci0tIFJFX1JEWV8yICsgTkVUIFJFX1JEWV8yICsgRElSRUNUSU9OIE9VVFBVVCArIFVTRSBTSUdOQUwKLSArIFBPUlQKLSArIFZJQSBteXZpYTEgTUFTSyAxMjMgKCA1MDAgNTAwICkKLSAgICsgRklYRUQgKCAtMzkwMDAwIDAgKSBOCi0gKyBQT1JUCi0gKyBQT0xZR09OIE1FVEFMMSBNQVNLIDIyICggNDAwMDAgNDAwMDAgKSAoIDgwMDAwIDQwMDAwICkgKCA4MDAwMCAtNDAwMDAgKSAoIDQwMDAwIC00MDAwMCApICggNDAwMDAgLTgwMDAwICkKLSAgICAgICAgICAgICAgICAgICggLTQwMDAwIC04MDAwMCApICggLTQwMDAwIC00MDAwMCApICggLTgwMDAwIC00MDAwMCApICggLTgwMDAwIDQwMDAwICkgKCAtNDAwMDAgNDAwMDAgKSAoIC00MDAwMCA4MDAwMCApCi0gICAgICAgICAgICAgICAgICAoIDQwMDAwIDgwMDAwICkKLSAgICsgRklYRUQgKCAtMTkwMDAwIDAgKSBOCi0gKyBQT1JUCi0gKyBWSUEgbXl2aWExICggMTAwIDEwMCApCi0gICArIEZJWEVEICggMjkwMDAwIDAgKSBOIDsKLUVORCBQSU5TCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBQSU5QUk9QRVJUSUVTIG51bTsgCi0jICAgICBbLSB7IGNvbXBOYW1lIHwgUElOIH0gcGluTmFtZSAKLSMgICAgICAgICAgICBbKyBQUk9QRVJUWSB7cHJvcE5hbWUgcHJvcFZhbH0uLi5dLi4uOyAKLSMgICAgIF0uLi4gCi0jIEVORCBQSU5QUk9QRVJUSUVTCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1QSU5QUk9QRVJUSUVTIDIgOwotLSBQSU4gUDAKLSAgKyBQUk9QRVJUWSBzdHJwcm9wICJhU3RyaW5nIiAKLSAgKyBQUk9QRVJUWSBpbnRwcm9wIDEgCi0gICsgUFJPUEVSVFkgcmVhbHByb3AgMS4xIAotICArIFBST1BFUlRZIGludHJhbmdlcHJvcCAyNQotICArIFBST1BFUlRZIHJlYWxyYW5nZXByb3AgMjUuMjUgOwotLSBJMSBBIAotICArIFBST1BFUlRZIHN0cnByb3AgImFTdHJpbmciIAotICArIFBST1BFUlRZIGludHByb3AgMSAKLSAgKyBQUk9QRVJUWSByZWFscHJvcCAxLjEgCi0gICsgUFJPUEVSVFkgaW50cmFuZ2Vwcm9wIDI1Ci0gICsgUFJPUEVSVFkgcmVhbHJhbmdlcHJvcCAyNS4yNSA7Ci1FTkQgUElOUFJPUEVSVElFUwotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQkxPQ0tBR0VTIG51bUJsb2NrYWdlcyA7IAotIyAgICAgLSAgICB7IExBWUVSIGxheWVyTmFtZSAKLSMgICAgICAgICAgICAgICAgIFsrIENPTVBPTkVOVCBjb21wTmFtZSAKLSMgICAgICAgICAgICAgICAgIHwrIFNMT1RTIAotIyAgICAgICAgICAgICAgICAgfCsgRklMTFMgCi0jICAgICAgICAgICAgICAgICB8ICsgUFVTSERPV04gXSAKLSMgICAgICAgICAgICAgfCBQTEFDRU1FTlQgCi0jICAgICAgICAgICAgICAgICBbICsgQ09NUE9ORU5UIGNvbXBOYW1lIAotIyAgICAgICAgICAgICAgICAgfCArIFBVU0hET1dOIF0gCi0jICAgICAgICAgICAgIH0gCi0jICAgICAgICAgICAgIFJFQ1QgcHQgcHQgCi0jICAgICAgICAgICAgIFtSRUNUIHB0IHB0IF0gLi4uIDsgCi0jICAgICAuLi4gCi0jIEVORCBCTE9DS0FHRVMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUJMT0NLQUdFUyA4IDsKLSAgICAtIExBWUVSIE1FVEFMMSArIE1BU0sgMQotICAgICAgICBSRUNUICggNjAgNzAgKSAoIDgwIDkwICkgOwotICAgIC0gTEFZRVIgTTIgKyBTTE9UUyArIFBVU0hET1dOICsgRVhDRVBUUEdORVQgKyBDT01QT05FTlQgSTEgKyBNQVNLIDMKLSAgICAgICAgUE9MWUdPTiAoIDEwMCAxMDAgKSAoIDEwMCAyMDAgKSAoIDE1MCAyMDAgKSAoIDE1MCAxNTAgKSAoIDIwMCAxNTAgKSAoIDIwMCAxMDAgKSA7Ci0gICAgLSBMQVlFUiBNMiArIFNMT1RTICsgTUFTSyAyCi0gICAgICAgIFJFQ1QgKCAxMCAyMCApICggNDAgNTAgKSA7Ci0gICAgLSBMQVlFUiBNRVRBTDEgKyBGSUxMUyArIE1BU0sgMSAKLSAgICAgICAgUkVDVCAoIC0xMCAyMCApICggMzAgNDAgKSA7Ci0gICAgLSBMQVlFUiBNMSArIFBVU0hET1dOICsgU1BBQ0lORyAzICsgTUFTSyAxCi0gICAgICAgIFJFQ1QgKCA1MCAzMCApICggNTUgNDAgKSA7Ci0gICAgLSBMQVlFUiBNMSArIEVYQ0VQVFBHTkVUICsgREVTSUdOUlVMRVdJRFRIIDQ1ICsgTUFTSyAxCi0gICAgICAgIFJFQ1QgKCA1MCAzMCApICggNTUgNDAgKSA7Ci0gICAgLSBQTEFDRU1FTlQgICAgICAgICAgICAgICAgICAgICAgIAotIyAgICAgICAgUE9MWUdPTiAoIDEwMCAxMDAgKSAoIDEwMCAyMDAgKSAoIDE1MCAyMDAgKSAoIDE1MCAxNTAgKSAoIDIwMCAxNTAgKSAoIDIwMCAxMDAgKSA7Ci0gICAgICAgIFJFQ1QgKCAtMTUgMCApICggMCAgMjAgKQotICAgICAgICBSRUNUICggLTE1IDIwICkgKCAzMCA0MCApCi0gICAgICAgIFJFQ1QgKCAzMCAgNSApICggNTAgNDAgKQotICAgICAgICBSRUNUICggLTEwIC0xNSApICggNTAgMCApIDsgICAjZmxvYXRpbmcgIAotICAgIC0gUExBQ0VNRU5UICsgUEFSVElBTCAwLjQwICsgUFVTSERPV04gKyBDT01QT05FTlQgSTEgCi0gICAgICAgIFJFQ1QgKCAtMTAgMCApICggMCAgMjAgKQotICAgICAgICBSRUNUICggLTEwIDIwICkgKCAzMCA0MCApCi0gICAgICAgIFJFQ1QgKCAzMCAgMCApICggNTAgNDAgKQotICAgICAgICBSRUNUICggLTEwIC01ICkgKCA1MCAwICkgOyAgI2Nvb3JkaW5hdGUgYXJlIGFic29sdXRlCi0gICAgLSBQTEFDRU1FTlQgKyBQVVNIRE9XTiAKLSAgICAgICAgUkVDVCAoIC01IDAgKSAoIDAgIDIwICkKLSAgICAgICAgUkVDVCAoIC01IDIwICkgKCAzMCA0MCApCi0gICAgICAgIFJFQ1QgKCAzMCAgMCApICggMjUgNDAgKQotICAgICAgICBSRUNUICggLTUgMCApICggNTAgMTAgKSA7ICAjY29vcmRpbmF0ZSBhcmUgYWJzb2x1dGUKLSAgICAtIFBMQUNFTUVOVCArIFNPRlQKLSAgICAgICAgUkVDVCAoIDUwIDMwICkgKCA1NSA0MCApIDsKLSAgICAtIFBMQUNFTUVOVCArIFBBUlRJQUwgMC40MAotICAgICAgICBSRUNUICggNTAgMzAgKSAoIDU1IDQwICkgOwotCi1FTkQgQkxPQ0tBR0VTCi0KLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFNQRUNJQUxORVRTIG51bU5ldHMgOyAKLSMgICAgIFstIG5ldE5hbWUgWyhjb21wTmFtZVJlZ0V4cHIgcGluTmFtZVsrIFNZTlRIRVNJWkVEXSldLi4uIAotIyAgICAgICAgWysgV0lEVEggbGF5ZXJOYW1lIHdpZHRoXS4uLiAKLSMgICAgICAgICBbKyBWT0xUQUdFIG12b2x0c10gCi0jICAgICAgICAgWysgU09VUkNFIHtORVRMSVNUIHwgRElTVCB8IFVTRVIgfCBUSU1JTkd9XSAKLSMgICAgICAgICBbKyBGSVhFREJVTVAgXSAKLSMgICAgICAgICBbKyBPUklHSU5BTCBuZXROYW1lXSAKLSMgICAgICAgICBbKyBVU0UgCi0jICAgICAgICAgICAgIHsgU0lHTkFMIHwgUE9XRVIgfCBHUk9VTkQgfCBDTE9DSyAKLSMgICAgICAgICAgICAgICAgIHwgU0NBTiB8IFJFU0VUIHwgVElFT0ZGIHwgQU5BTE9HIH1dIAotIyAgICAgICAgWytQQVRURVJOIAotIyAgICAgICAgICAgICB7U1RFSU5FUiB8IEJBTEFOQ0VEIHwgVFJVTkt9XSAKLSMgICAgICAgICBbKyBFU1RDQVAgd2lyZUNhcGFjaXRhbmNlXSAKLSMgICAgICAgICBbKyBXRUlHSFQgd2VpZ2h0XSAKLSMgICAgICAgICBbKyBQUk9QRVJUWSB7cHJvcE5hbWUgcHJvcFZhbH0uLi5dLi4uO10uLi4gCi0jICAgICAgICAgWysge1JPVVRFRCB8IEZJWEVEIHwgQ09WRVJ9IGxheWVyTmFtZSB3aWR0aCAKLSMgICAgICAgICAgICAgWysgU0hBUEUge1JJTkcgfCBTVFJJUEUgfCBGT0xMT1dQSU4gfCBJT1dJUkUgCi0jICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ09SRVdJUkUgfCBCTE9DS1dJUkUgfCBGSUxMV0lSRSAKLSMgICAgICAgICAgICAgICAgICAgICAgICAgfCBQQURSSU5HIHwgQkxPQ0tSSU5HIHwgQkxPQ0tBR0VXSVJFfV0gCi0jICAgICAgICAgICAgICAgICAoeCB5KSBbICh4ICopIHwgKCogeSkgfCB2aWFOYW1lIF0uLi4gCi0jICAgICAgICAgICAgICAgICBbIE5FVyBsYXllck5hbWUgd2lkdGggCi0jICAgICAgICAgICAgICAgICAgICAgWysgU0hBUEUge1JJTkcgfCBTVFJJUEUgfCBGT0xMT1dQSU4gfCBJT1dJUkUgfCBDT1JFV0lSRSAKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJMT0NLV0lSRSB8IEZJTExXSVJFIAotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUEFEUklORyB8IEJMT0NLUklORyB8IEJMT0NLQUdFV0lSRX1dIAotIyAgICAgICAgICAgICAgICAgICAgICh4IHkpIFsgKHggKikgfCAoKiB5KSB8IAotIyAgICAgICAgICAgICAgICAgICAgICAgIHZpYU5hbWUgWyBETyBudW1YIGJ5IG51bVkgU1RFUCBzdGVwWCBzdGVwWV0gXS4uLl0uLi5dIAotIyAgICAgICAgIFsrIFNISUVMRCBzaGllbGRlZE5ldE5hbWUgbGF5ZXJOYW1lIHdpZHRoIAotIyAgICAgICAgICAgICBbKyBTSEFQRSB7UklORyB8IFNUUklQRSB8IEZPTExPV1BJTiB8IElPV0lSRSAKLSMgICAgICAgICAgICAgICAgICAgICAgICAgfCBDT1JFV0lSRSB8IEJMT0NLV0lSRSB8IEZJTExXSVJFIAotIyAgICAgICAgICAgICAgICAgICAgICAgICB8IFBBRFJJTkcgfCBCTE9DS1JJTkcgfCBCTE9DS0FHRVdJUkV9XSAKLSMgICAgICAgICAgICAgICAgICh4IHkpIFsgKHggKikgfCAoKiB5KSB8IHZpYU5hbWUgXS4uLiAKLSMgICAgICAgICAgICAgICAgIFtORVcgbGF5ZXJOYW1lIHdpZHRoIAotIyAgICAgICAgICAgICAgICAgICBbKyBTSEFQRSB7UklORyB8IFNUUklQRSB8IEZPTExPV1BJTiB8IElPV0lSRSAKLSMgICAgICAgICAgICAgICAgICAgICAgICAgfCBDT1JFV0lSRSB8IEJMT0NLV0lSRSB8IEZJTExXSVJFIHwgQkxPQ0tBR0VXSVJFfV0gCi0jICAgICAgICAgICAgICAgICAgICh4IHkpIFsgWyBNQVNLIG1hc2tOdW0gXSh4ICopIHwgWyBNQVNLIG1hc2tOdW0gXSAoKiB5KSB8IAotIyAgICAgICAgICAgICAgICAgICAgIFsgTUFTSyB2aWFNYXNrTnVtIF0gdmlhTmFtZSBbIERPIG51bVggYnkgbnVtWSBTVEVQIHN0ZXBYIHN0ZXBZXSBdLi4uXS4uLl0uLi4gCi0jICAgICA7XS4uLiAKLSMgRU5EIFNQRUNJQUxORVRTCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1TUEVDSUFMTkVUUyA1IDsKLS0gU04xICggSTEgWi5leHRyYTEgKSAoIEkyIFogKSAoIEkzIFogKSAoICogWiApCi0gICsgV0lEVEggTUVUQUwxIDIwMAotICArIFdJRFRIIE0yIDMwMAotICArIFZPTFRBR0UgMzIwMAotICArIFNPVVJDRSBORVRMSVNUCi0gICsgRklYRURCVU1QCi0gICsgT1JJR0lOQUwgVkRECi0gICsgVVNFIFNJR05BTAotICArIFBBVFRFUk4gU1RFSU5FUgotICArIEVTVENBUCAxNTAwMDAwCi0gICsgV0VJR0hUIDMwCi0gKyBQUk9QRVJUWSBzdHJwcm9wICJhU3RyaW5nIiAKLSAgKyBQUk9QRVJUWSBpbnRwcm9wIDEgCi0gICsgUFJPUEVSVFkgcmVhbHByb3AgMS4xIAotICArIFBST1BFUlRZIGludHJhbmdlcHJvcCAyNQotICArIFBST1BFUlRZIHJlYWxyYW5nZXByb3AgMjUuMjUKLSAgCi0gICsgUk9VVEVEIE0xIDEyMCArIFNIQVBFIFJJTkcgKCAxNDAwMCAzNDE0NDAgKSAoIDk2MDAgKiApICggKiAyODI0MDAgKSBNMV9NMiBETyAyIEJZIDIgU1RFUCAyMDAgMjAwICggMjQwMCAqICkKLSAgICBORVcgTUVUQUwxIDEyMCArIFNIQVBFIFNUUklQRSAgICAoIDI0MDAgMjgyNDAwICkgKCAyNDAgKiApIE0xX00yIAotICAgIE5FVyBNMSAxMjAgKyBTSEFQRSBGT0xMT1dQSU4gKCAyNTAwIDI4MjQwMCApICggMjUwICogKSBWSUFHRU4xMl8wIE4KLSAgICBORVcgTTEgMTIwICsgU0hBUEUgSU9XSVJFICAgICggMjYwMCAyODI0MDAgKSAoIDI2MCAqICkgVklBR0VOMTJfMgotICAgIE5FVyBNRVRBTDEgMTIwICsgU0hBUEUgQ09SRVdJUkUgICggMjcwMCAyODI0MDAgKSAoIDI3MCAqICkgVklBR0VOMTJfMwotICAgIE5FVyBNMSAxMjAgKyBTSEFQRSBCTE9DS1dJUkUgKCAyODAwIDI4MjQwMCApICggMjgwICogKSBDVVNUT01WSUEgVklBR0VOMTJfMQotICAgTkVXIE0xIDEyMCArIFNIQVBFIEZJTExXSVJFICAoIDI5MDAgMjgyNDAwICkgKCAyOTAgKiApIFZJQUdFTjEyXzQKLSAgICBORVcgTTEgMTIwICsgU0hBUEUgRklMTFdJUkVPUEMgICggMjkwMCAyODI0MDAgKSBWSUFHRU4xMl80Ci0gICAgTkVXIE0xIDEyMCArIFNIQVBFIEJMT0NLQUdFV0lSRSAoIDIwMDAgMjgyNDAwICkgKCAyMDAgKiApIFZJQUdFTjEyCi0gICBORVcgTTEgMTIwICsgU0hBUEUgQkxPQ0tSSU5HICggMjEwMCAyODI0MDAgKSAoIDIxMCAqICkKLSAgICBORVcgTTEgMTIwICsgU0hBUEUgUEFEUklORyAgICggMjIwMCAyODI0MDAgKSAoIDIyMCAqICkKLQotICAgIE5FVyBNMSAyMDAgKCAzMDAwIDMwMDAgKSBUVVJOTTFfMQotICAgIE5FVyBNMiAyMDAgKCAzMTAwIDMxMDAgKSAoIDMyMDAgMzEwMCApIFRVUk5NMl8xCi0gICBORVcgTTIgMjAwICggMzMwMCAzMzAwICkgKCAzNDAwIDMzMDAgKSBUVVJOTTJfMSAoIDM0MDAgMzYwMCApCi0gICAgCi0gICAgTkVXIE0yIDIwMCAoIDQwMCA0MDAgKSBNMV9NMiAoICogKiApICAgICAgICAgICAjIGNhc2UgOiBwdCB2aWEgKCAqICogKQotICAgIE5FVyBNMiAyMDAgKCA1MDAgNTAwICkgTTFfTTIgKCAqICogKSBNMV9NMiAgICAgIyBjYXNlIDogcHQgdmlhICggKiAqICkgdmlhCi0gICAgTkVXIE0yIDIwMCAoIDcwMCA3MDAgKSBNMV9NMiAoICogKiApICggKiA4MDAgKSAjIGNhc2UgOiBwdCB2aWEgKCAqICogKSBwdAotICAgCi0gICBORVcgTTIgMTUwMDAgKyBTVFlMRSA5ICggMTA1MDAwIDEwNTAwMCApICggNTAwMDAgNTAwMDAgKQotICAgIE5FVyBNMiAxNTAwMCArIFNUWUxFIDggKCAxMDUwMDAgMTU1MDAwICkgKCAqIDEwNTAwMCApCi0gICsgQ09WRVIgTUVUQUwxIDEwMCAoIDEwMCAxMDAgKSAoIDEwMCAyMDAgKQotICsgRklYRUQgTTEgMTAwICggMjAwIDIwMCApICggMzAwIDIwMCApCi0gICsgUk9VVEVEIE0xIDEyMCArIFNIQVBFIERSQ0ZJTEwgKCA4MDAwIDgwMDAgKSAoIDgwMDAgODIwMCApICggODQwMCA4MjAwICkKLSAgKyBTSElFTEQgTjEgTTIgOTAgKCAxNDEwMCAzNDA0NDAgKSAoIDgxNjAgKiApIE0xX00yICAoICogMzAxNjAwICkgTTFfTTIgRk4gRE8gMiBCWSAyIFNURVAgMjAwIDIwMCAoIDI0MDAgKiApCi0gIDsKLS0gVkRECi0gICsgVk9MVEFHRSA1MDAwCi0gICsgRklYRUQgKyBTSEFQRSBSSU5HICsgTUFTSyAyICsgUE9MWUdPTiBNRVRBTDEgKCAwICAwICkgKCAwIDEwMCApICggMTAwIDEwMCApICggMjAwIDIwMCApICggMjAwIDAgKQotICArIENPVkVSICsgU0hBUEUgUklORyArIE1BU0sgMyArIFBPTFlHT04gTTIgKCAxMDAgMTAwICkgKCAqIDIwMCApICggMjAwICogKSAoIDMwMCAzMDAgKSAoIDMwMCAxMDAgKSAKLSAgKyBWSUEgTTFfTTIgTiAoIDI0MDAgMCApICggMTAgMTAgKQotICArIEZJWEVEICsgU0hBUEUgUklORyArIFJFQ1QgTTMgKCAwIDAgKSAoIDEwIDEwICkKLSAgKyBTSElFTEQgTjEgKyBTSEFQRSBCTE9DS1JJTkcgKyBSRUNUIE0zICggMCAwICkgKCAxMCAxMCApCi0gICsgUk9VVEVEIE0xIDIwICggMTAgMCApIE1BU0sgMyAoIDEwIDIwICkgVklBR0VOMTJfNAotICAgIE5FVyBNMiAxMDAgKCAxMCAxMCApICggMjAgMTAgKSBNQVNLIDEgKCAyMCAyMCApIE1BU0sgMDMxIFZJQUdFTjEyXzMKLSAgKyBTSEFQRSBTVFJJUEUgKyBWSUEgVklBMTJfMiAoIDMwIDMwICkgKCA0MCA0MCApCi0gICsgUk9VVEVEIE0xIDEwMCAoIDAgMCAxMDAgKSAoIDAgMCA1MCApICggMTAwIDAgNTAgKSBNMV9NMiAoIDEwMCAxMDAgNTAgKSAKLSAgKyBST1VURUQgTTEgNTAgKyBTVFlMRSAwICggMCAwICkgKCAxNTAgMTUwICkKLSAgKyBST1VURUQgTTEgNTAgKyBTVFlMRSAwICggMTUwIDE1MCApICggMCAwICkKLSAgKyBST1VURUQgTTEgNTAgKyBTVFlMRSAwICggMTUwIDAgKSAoIDAgMTUwICkKLSAgKyBST1VURUQgTTEgNTAgKyBTVFlMRSAwICggMCAxNTAgKSAoIDE1MCAwICkKLSAgKyBST1VURUQgTTEgNTAgKyBTVFlMRSAxICggMTUwIDE1MCApICggMzAwIDAgKSAoIDQwMCAwICkKLSAgKyBST1VURUQgTTIgMTAwICsgU0hBUEUgUklORyArIFNUWUxFIDAgKCAwIDAgKSAoIDEwMCAxMDAgKSAoIDIwMCAxMDAgKQotICArIFJPVVRFRCBNMSAxMDAgKyBTVFlMRSAgMiAoIDAgMCApIE0xX00yICggIDYwMCAqICkgTTFfTTIKLSAgKyBST1VURUQgTTEgNTAgKCAxNTAgMTUwICkgKCAzMDAgMzAwICkgCi0gIDsKLS0gU04yIAotICArIFJPVVRFRCBNMiAxMDAgKyBTVFlMRSAzICggMCAwICkgKCAxNTAgMTUwICkgKCAzMDAgMCApCi0gICAgTkVXIE0yIDEwMCAoIDMwMCAwICkgKCA0MDAgMCApCi0gICsgUk9VVEVEIE0xIDEwMCAoIDAgMCApICggMTUwIDE1MCApICggMzAwIDAgKSAoIDQwMCAwICkKLSArIFJPVVRFRCBNMSA0MDAwICsgU1RZTEUgNSAoIDAgMCApICggMTAwMCAwICkKLSAgKyBST1VURUQgTTEgNDAwMCArIFNUWUxFIDYgKCAwIDAgKSAoIDEwMDAgMTAwMCApCi0gICsgUk9VVEVEIE0xIDEwMDAgKyBTVFlMRSA3ICggMCAwICkgKCAqICogKSA7Ci0tIFNOMwotICArIFVTRSBHUk9VTkQKLSAgKyBST1VURUQgTTIgMTAwICggMTAwIDAgKSAoICogMzAwMCApCi0gIE5FVyBNMyAxMDAgKCAwIDEwMDAgKSAoIDMwMDAgKiApCi0gICsgU0hJRUxEIE4xIE0yIDQwICsgU0hBUEUgRklMTFdJUkUgKCAzMDAgODAgKSAoICogMTkyMCApCi0gIE5FVyBNMiA0MCArIFNIQVBFIEZJTExXSVJFICggNTAwIDgwICkgKCAqIDE5MjAgKSA7Ci0tIERVTU1ZCi0gICsgUk9VVEVEIE0xIDEwMCArIFNIQVBFIEZJTExXSVJFICggMCAwICkgKCAxMDAgMCApIDsKLS0gRFVNTVkyCi0gICsgUk9VVEVEIE0yIDEwMCArIFNIQVBFIEZJTExXSVJFT1BDICggMCAwICkgKCAxMDAgMCApIDsKLUVORCBTUEVDSUFMTkVUUwotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTkVUUyBudW1OZXRzIDsgCi0jICAgICBbLSB7IG5ldE5hbWUgWygge2NvbXBOYW1lIHwgUElOfSBwaW5OYW1lIAotIyAgICAgICAgICAgWysgU1lOVEhFU0laRURdKV0uLi4gCi0jICAgICAgICB8IE1VU1RKT0lOIChjb21wTmFtZSBwaW5OYW1lKSB9IAotIyAgICAgICAgIFsrIFNISUVMRE5FVCBzaGllbGROZXROYW1lIF0gLi4uIAotIyAgICAgICAgIFsrIE5PU0hJRUxEIGxhc3RTZWdtZW50IF0gLi4uIAotIyAgICAgICAgIFsrIFZQSU4gdnBpbk5hbWUgW0xBWUVSIGxheWVyTmFtZV0gcHQgcHQgCi0jICAgICAgICAgICAgIFsgeyBQTEFDRUQgfCBGSVhFRCB8IENPVkVSIH0gcHQgb3JpZW50IF0gXS4uLiAKLSMgICAgICAgICBbKyBTVUJORVQgc3VibmV0TmFtZSAKLSMgICAgICAgICAgICAgWygge2NvbXBOYW1lIHwgUElOfSBwaW5OYW1lKXwgKFZQSU4gdnBpbk5hbWUpXS4uLiAKLSMgICAgICAgICAgICAgW05PTkRFRkFVTFRSVUxFIHJ1bGVuYW1lXSAKLSMgICAgICAgICAgICAgW3JlZ3VsYXJXaXJpbmddXSAKLSMgICAgICAgICBbKyBYVEFMSyBudW1dIAotIyAgICAgICAgIFsrIE5PTkRFRkFVTFRSVUxFIHJ1bGVOYW1lXSAKLSMgICAgICAgICBbcmVndWxhcldpcmluZ10uLi4gCi0jICAgICAgICAgWysgU09VUkNFIHtORVRMSVNUIHwgRElTVCB8IFVTRVIgfCBURVNUIHwgVElNSU5HfV0gCi0jICAgICAgICAgWysgRklYRURCVU1QIF0KLSMgICAgICAgICBbKyBGUkVRVUVOQ1kgZnJlcSBdCi0jICAgICAgICAgWysgT1JJR0lOQUwgbmV0TmFtZV0gCi0jICAgICAgICAgWysgVVNFIAotIyAgICAgICAgICAgICB7IFNJR05BTCB8IFBPV0VSIHwgR1JPVU5EIHwgQ0xPQ0sgCi0jICAgICAgICAgICAgICAgICB8IFNDQU4gfCBSRVNFVCB8IFRJRU9GRiB8IEFOQUxPR31dIAotIyAgICAgICAgIFsrIFBBVFRFUk4gCi0jICAgICAgICAgICAgIHtTVEVJTkVSIHwgQkFMQU5DRUQgfV0gCi0jICAgICAgICAgWysgRVNUQ0FQIHdpcmVDYXBhY2l0YW5jZV0gCi0jICAgICAgICAgWysgV0VJR0hUIHdlaWdodF0gCi0jICAgICAgICAgWysgUFJPUEVSVFkge3Byb3BOYW1lIHByb3BWYWx9Li4uXS4uLjsgCi0jICAgICBdLi4uIAotIyBFTkQgTkVUUyAKLSMgCi0jIHJlZ3VsYXJXaXJpbmcgPSAKLSMgeysgUk9VVEVEIHwgKyBGSVhFRCB8ICsgQ09WRVIgfCArIE5PU0hJRUxEfSAKLSMgbGF5ZXJOYW1lIFtUQVBFUiB8IFRBUEVSUlVMRSBydWxlbmFtZV0gW1NUWUxFIHN0eWxlTnVtIF0gCi0jICAgIHJvdXRpbmdQb2ludHMKLSMgW05FVyBsYXllck5hbWUgW1RBUEVSIHwgVEFQRVJSVUxFIHJ1bGVuYW1lXSBbU1RZTEUgc3R5bGVOdW0gXQotIyAgICByb3V0aW5nUG9pbnRzCi0jIF0gLi4uCi0jCi0jIHJvdXRpbmdQb2ludHMgPQotIyAoIHggeSBbdmFsdWVdICkgCi0jIHsoIHggKiBbdmFsdWVdKSB8ICggKiB5IFt2YWx1ZV0pIHwgKCAqICogW3ZhbHVlXSApIHwgdmlhTmFtZSB8ICsgUkVDVCAoIGRlbHRhMXggZGVsdGExeSBkZWx0YTJ4IGRlbHRhMnkgKSB8ICsgVklSVFVBTCAoIHggeSApIF0uLi5dIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotTkVUUyA2IDsKLS0gU0NBTiAoIHNjYW5jZWxsMSBQQTEwICsgU1lOVEhFU0laRUQgKSAoIHNjYW5jZWxsMiBQQTIgKyBTWU5USEVTSVpFRCApCi0gICsgU09VUkNFIFRFU1QgOwotLSBOMSAoIEkxIEEgKSAoIFBJTiBQMCApCi0gICsgU0hJRUxETkVUIFNOMQotICArIFNISUVMRE5FVCBWREQKLSAgKyBGSVhFRCBNMyAoIDEwIDAgKSBNQVNLIDMgKCAxMCAyMCApIE1BU0sgMDMxIE0xX00yCi0gICsgUk9VVEVEIE0xICggMCAwICkgKCA1IDAgKSBWSVJUVUFMICggMiAzICkgTUFTSyAxICggNyA3ICkKLSAgKyBST1VURUQgTTEgKCAwIDAgKSAoIDUgMCApIFZJUlRVQUwgKCAyIDMgKSBSRUNUICggMSAyIDMgNCApICggNyA3ICkKLSAgKyBGSVhFRCBNMSAoIDAgMCApICggNSAwICkgKCA3IDcgKSAKLSAgKyBGSVhFRCBNMSAoIDAgMCApICggNSAwICkgTUFTSyAzIFJFQ1QgKCAxIDIgMyA0ICkgKCA3IDcgKSAKLSAgKyBOT1NISUVMRCBNMiAoIDE0MTAwIDM0MTQ0MCApICggMTQwMDAgKiApIE0xX00yCi0gICsgVlBJTiBOMV9WUDAgTEFZRVIgTTMgKCAtMzMzIC0zMzMgKSAoIDMzMyAzMzMgKSBQTEFDRUQgKCAxODk1NjAgMjczMDAgKSBOCi0gICsgVlBJTiBOMV9WUDEgTEFZRVIgTTMgKCAtMzMzIC0zMzMgKSAoIDMzMyAzMzMgKSBQTEFDRUQgKCAxODk1NjAgMjczMDAgKSBTCi0gICsgVlBJTiBOMV9WUDIgTEFZRVIgTTMgKCAtMzMzIC0zMzMgKSAoIDMzMyAzMzMgKSBQTEFDRUQgKCAxODk1NjAgMjczMDAgKSBFCi0gICsgVlBJTiBOMV9WUDMgTEFZRVIgTTMgKCAtMzMzIC0zMzMgKSAoIDMzMyAzMzMgKSBQTEFDRUQgKCAxODk1NjAgMjczMDAgKSBXCi0gICsgVlBJTiBOMV9WUDQgTEFZRVIgTTMgKCAtMzMzIC0zMzMgKSAoIDMzMyAzMzMgKSBQTEFDRUQgKCAxODk1NjAgMjczMDAgKSBGTgotICArIFZQSU4gTjFfVlA1IExBWUVSIE0zICggLTMzMyAtMzMzICkgKCAzMzMgMzMzICkgUExBQ0VEICggMTg5NTYwIDI3MzAwICkgRlMKLSAgKyBWUElOIE4xX1ZQNiBMQVlFUiBNMyAoIC0zMzMgLTMzMyApICggMzMzIDMzMyApIFBMQUNFRCAoIDE4OTU2MCAyNzMwMCApIEZFCi0gICsgVlBJTiBOMV9WUDcgTEFZRVIgTTMgKCAtMzMzIC0zMzMgKSAoIDMzMyAzMzMgKSBQTEFDRUQgKCAxODk1NjAgMjczMDAgKSBGVwotICArIFZQSU4gTjFfVlA4ICggLTMzMyAtMzMzICkgKCAzMzMgMzMzICkKLSAgKyBTVUJORVQgTjFfU1VCMCAoIEkyIEEgKSAoIFBJTiBQMSApICggVlBJTiBOMV9WUDkgKQotICAgIE5PTkRFRkFVTFRSVUxFIFJVTEUxCi0gICAgUk9VVEVEIE0xICggMTY4MjgwIDYzMzAwIDcwMCApICggKiA2NDUwMCApIE0xX00yICggMTY5NDAwICogODAwICkgTTJfTTMKLSAgKyBYVEFMSyAyCi0gICsgTk9OREVGQVVMVFJVTEUgUlVMRTEKLSAgKyBST1VURUQKLSAgICBNMiAoIDE0MDAwIDM0MTQ0MCApICggOTYwMCAqICkgKCAqIDI4MjQwMCApIG5kMVZJQTEyICggMjQwMCAqICkgVFVSTk0xXzEKLSAgICBORVcgTTEgVEFQRVIgKCAyNDAwIDI4MjQwMCApICggMjQwICogKQotICArIFNPVVJDRSBORVRMSVNUCi0gICsgRklYRURCVU1QCi0gICsgRlJFUVVFTkNZIDEwMAotICArIE9SSUdJTkFMIE4yCi0gICsgVVNFIFNJR05BTAotICArIFBBVFRFUk4gU1RFSU5FUgotICArIEVTVENBUCAxNTAwMDAwCi0gICsgV0VJR0hUIDEwMAotICArIFBST1BFUlRZIHN0cnByb3AgImFTdHJpbmciIAotICArIFBST1BFUlRZIGludHByb3AgMSAKLSAgKyBQUk9QRVJUWSByZWFscHJvcCAxLjEgCi0gICsgUFJPUEVSVFkgaW50cmFuZ2Vwcm9wIDI1Ci0gICsgUFJPUEVSVFkgcmVhbHJhbmdlcHJvcCAyNS4yNSA7Ci0tIE4yICggSTMgQSApICggUElOIFAyICkKLSAgKyBGSVhFRAotICAgIE0yICggMTQwMDAgMzQxNDQwICkgKCA5NjAwICogKSAoICogMjgyNDAwICkgTTFfTTIgKCAyNDAwICogKQotICAgIE5FVyBNMSBUQVBFUlJVTEUgUlVMRTEgKCAyNDAwIDI4MjQwMCApICggMjQwICogKQotICArIFNPVVJDRSBESVNUCi0gICsgUEFUVEVSTiBCQUxBTkNFRAotICArIFdFSUdIVCA1MDAgOwotLSBOMyAoIEk0IEEgKSAoIFBJTiBQMyApCi0gICsgQ09WRVIKLSAgICBNMiAoIDE0MDAwIDM0MTQ0MCApICggOTYwMCAqICkgKCAqIDI4MjQwMCApIE0xX00yICggMjQwMCAqICkgVklBR0VOMTJfMCBOCi0gICAgTkVXIE0xICggMjQwMCAyODI0MDAgKSAoIDI0MCAqICkKLSAgICBORVcgTTIgKCA0MDAgNDAwICkgTTFfTTIgTiAoICogKiApICAgICAgICAgICAjIGNhc2UgOiBwdCB2aWEgKCAqICogKQotICAgIE5FVyBNMiAoIDUwMCA1MDAgKSBNMV9NMiAoICogKiApIE0xX00yICAgICAjIGNhc2UgOiBwdCB2aWEgKCAqICogKSB2aWEKLSAgICBORVcgTTIgKCA2MDAgNjAwIDEwICkgTTFfTTIgUyAoICogKiAzMCApICggKiA4MDAgKSAgICAjIGNhc2UgOiBwdCB2aWEgKCAqICogZXh0ICkgCi0gICAgTkVXIE0yICggNzAwIDcwMCApIE0xX00yICggKiAqICkgKCAqIDgwMCApICMgY2FzZSA6IHB0IHZpYSAoICogKiApIHB0Ci0gICAgTkVXIE0xICggMCAwICkgTTFfTTIgRlMgTTJfTTMKLSAgICBORVcgTTMgKCAwIDAgKSBNMl9NMyBXIE0xX00yCi0gICAgTkVXIE0xICggMTAgMTAgKSAoIDIwIDEwICkgTUFTSyAxICggMjAgMjAgKSBNQVNLIDAzMSBWSUExXzIKLSAgKyBTT1VSQ0UgVVNFUgotICArIFBBVFRFUk4gVFJVTksgOwotLSBONCAoIEk1IEEgKSAoIFBJTiBQNCApCi0gICsgU09VUkNFIFRFU1QKLSAgKyBST1VURUQgTTIgU1RZTEUgMSAoIDAgMCApICggMTUwIDE1MCApICggMzAwIDAgKSAoIDQwMCAwICkKLSAgKyBST1VURUQgTTEgKCAxNTAgMTUwICkgTUFTSyAzICggMzAwIDMwMCApIE1BU0sgMDMyIFZJQUdFTjEyCi0gICsgTk9TSElFTEQgTTEgKCAxNTAgMTUwIDMwICkgKCAxNTAgMzAwIDMwICkKLSAgKyBST1VURUQgTTEgU1RZTEUgMCAoIDAgMCApICggMTUwIDE1MCApCi0gICAgTkVXIE0xIFNUWUxFIDEgKCAxNTAgMTUwICkgTUFTSyAyICggMzAwIDAgKSAoIDQwMCAwICkKLSAgKyBVU0UgR1JPVU5EIDsKLS0gTjUgKCBJNiBBICkgKCBQSU4gUDUgKQotICArIFJPVVRFRCBNMiBTVFlMRSAzICggMCAxMDAwICkgKCAxNTAgMTE1MCApICggMzAwIDEwMDAgKSAoIDQwMCAxMDAwICkKLSAgKyBST1VURUQgTTEgKCAwIDEwMDAgKSAoIDE1MCAxMTUwICkgKCAzMDAgMTAwMCApICggNDAwIDEwMDAgKQotICArIFNPVVJDRSBUSU1JTkcgOwotLSBONgotICArIE5PTkRFRkFVTFRSVUxFIFJVTEUyCi0gICsgUk9VVEVEIE0xIFNUWUxFIDQgKCAxMDAwIDAgKSAoIDExMDAgMTAwICkKLSAgKyBST1VURUQgTTEgU1RZTEUgNCAoIDEyMDAgMTAwICkgKCAxMzAwIDAgKQotICArIFJPVVRFRCBNMSBTVFlMRSA0ICggMTAwMCAtMTAwICkgKCAxMzAwIC0xMDAgKSA7Ci0tIFNDQU4gKCBzY2FuY2VsbDEgUEExMCArIFNZTlRIRVNJWkVEICkgKCBzY2FuY2VsbDIgUEEyICsgU1lOVEhFU0laRUQgKQotICArIFNPVVJDRSBURVNUIDsKLS0gTVVTVEpPSU5fMSAoIEk3IEEgKSA7Ci0tIEFSUkFZTkVUWzBdWzEwXSA7Ci0tIHZlY3Rvcm1vZHVsZVsxXS92ZWN0b3JuZXRbMF0gOwotLSB2ZWN0b3Jtb2R1bGVbMV0vc2NhbGFybmV0IDsKLUVORCBORVRTCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBTQ0FOQ0hBSU5TIG51bVNjYW5DaGFpbnMgOyAKLSMgICAgIFstIGNoYWluTmFtZSAKLSMgICAgIFsrIENPTU1PTlNDQU5QSU5TIFsoSU4gcGluKV1bKE9VVCBwaW4pXV0gCi0jICAgICBbKyBTVEFSVCB7Zml4ZWRJbkNvbXAgfCBQSU59IFtvdXRQaW5dIF0gCi0jICAgICB7KyBGTE9BVElORyB7ZmxvYXRpbmdDb21wIFsoSU4gcGluKV0gWyhPVVQgcGluKV19Li4ufSAKLSMgICAgIFsrIE9SREVSRUQgCi0jICAgICAgICAge2ZpeGVkQ29tcCBbKElOIHBpbildIFsoT1VUIHBpbildIAotIyAgICAgICAgIGZpeGVkQ29tcCBbKElOIHBpbildIFsoT1VUIHBpbildfSAKLSMgICAgICAgICBbZml4ZWRDb21wIFsoSU4gcGluKV0gWyhPVVQgcGluKV1dIC4uLn1dIAotIyAgICAgWysgU1RPUCB7Zml4ZWRPdXRDb21wIHwgUElOfSBbaW5QaW5dIF0gCi0jICAgICA7XSAKLSMgICAgIC4uLiAKLSMgRU5EIFNDQU5DSEFJTlMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVNDQU5DSEFJTlMgMiA7Ci0tIGNoYWluMQotICArIFBBUlRJVElPTiBjbG9jazEgTUFYQklUUyAyNTYJIyBERUY1LjUgCi0gICsgQ09NTU9OU0NBTlBJTlMgKCBJTiBQQTEgKSAoIE9VVCBQQTIgKQotICArIFNUQVJUIEkxIEIKLSAgKyBTVE9QICBJNCBCCi0gICsgT1JERVJFRCAKLSAgICAgc2NhbmNlbGwxICggSU4gUEEyICkKLSAgICAgc2NhbmNlbGwyICggT1VUIFBBMTAgKQotICAgICAoIEJJVFMgNCApCi0gICsgRkxPQVRJTkcKLSAgICAgc2NhbmNlbGwzICggSU4gUEEyICkKLSAgICAgc2NhbmNlbGw0ICggT1VUIFBBMTAgKQotICAgICAoIEJJVFMgNCApIDsKLS0gY2hhaW4yCi0gICsgUEFSVElUSU9OIGNsb2NrMSBNQVhCSVRTIDI1NgkjIERFRjUuNSAKLSAgKyBDT01NT05TQ0FOUElOUyAoIElOIFBBMSApICggT1VUIFBBMiApCi0gICsgU1RBUlQgUElOIHNjYW5waW4KLSAgKyBTVE9QICBQSU4gc2NhbnBpbjIKLSAgKyBPUkRFUkVEIAotICAgICBzY2FuY2VsbDUgKCBJTiBQQTIgKQotICAgICBzY2FuY2VsbDYgKCBPVVQgUEExMCApCi0gICAgICggQklUUyA0ICkKLSAgKyBGTE9BVElORwotICAgICBzY2FuY2VsbDcgKCBJTiBQQTIgKQotICAgICBzY2FuY2VsbDggKCBPVVQgUEExMCApCi0gICAgICggQklUUyA0ICkgOwotLSBjaGFpbjMKLSAgKyBQQVJUSVRJT04gY2xvY2sxIE1BWEJJVFMgMjU2CSMgREVGNS41IAotICArIENPTU1PTlNDQU5QSU5TICggSU4gUEExICkgKCBPVVQgUEEyICkKLSAgKyBTVEFSVCBJNSBCCi0gICsgU1RPUCAgSTYgQgotICArIE9SREVSRUQgCi0gICAgIHNjYW5jZWxsOSAoIElOIFBBMiApCi0gICAgIHNjYW5jZWxsMTAgKCBPVVQgUEExMCApCi0gICAgICggQklUUyA0ICkKLSAgKyBGTE9BVElORwotICAgICBzY2FuY2VsbDExICggSU4gUEEyICkKLSAgICAgc2NhbmNlbGwxMiAoIE9VVCBQQTEwICkKLSAgICAgKCBCSVRTIDQgKSA7Ci1FTkQgU0NBTkNIQUlOUwotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgR1JPVVBTIG51bUdyb3VwcyA7IAotIyAgICAgWy0gZ3JvdXBOYW1lIGNvbXBOYW1lUmVnRXhwci4uLiAKLSMgICAgICAgICBbKyBTT0ZUIAotIyAgICAgICAgICAgICBbTUFYSEFMRlBFUklNRVRFUiB2YWx1ZV0gCi0jICAgICAgICAgICAgIFtNQVhYIHZhbHVlXVtNQVhZIHZhbHVlXV0gCi0jICAgICAgICAgWysgUkVHSU9OIHtwdCBwdCB8IHJlZ2lvbk5hbWV9IF0gCi0jICAgICAgICAgWysgUFJPUEVSVFkge3Byb3BOYW1lIHByb3BWYWx9Li4uXS4uLjtdLi4uIAotIyBFTkQgR1JPVVBTCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1HUk9VUFMgMyA7Ci0tIGdyb3VwMSBJMyBJMgotICArIFNPRlQgTUFYSEFMRlBFUklNRVRFUiA0MDAwIE1BWFggMTAwMDAwIE1BWFkgMTAwMDAwCi0gICsgUkVHSU9OIHJlZ2lvbjEKLSAgKyBQUk9QRVJUWSBzdHJwcm9wICJhU3RyaW5nIiAKLSAgKyBQUk9QRVJUWSBpbnRwcm9wIDEgCi0gICsgUFJPUEVSVFkgcmVhbHByb3AgMS4xIAotICArIFBST1BFUlRZIGludHJhbmdlcHJvcCAyNQotICArIFBST1BFUlRZIHJlYWxyYW5nZXByb3AgMjUuMjUgOwotLSBncm91cDIgSTQKLSAgKyBTT0ZUIE1BWEhBTEZQRVJJTUVURVIgNDAwMAotICArIFJFR0lPTiAoIDAgMCApICggMTAwIDEwMCApIDsKLS0gcmVnaW9uMiBJNyBJOAotICArIFJFR0lPTiByZWdpb24yIDsKLUVORCBHUk9VUFMKLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFNMT1RTIG51bVNsb3RzIDsgCi0jICAgICAtIHsgTEFZRVIgbGF5ZXJOYW1lIAotIyAgICAgICAgICAgICBSRUNUIHB0IHB0IAotIyAgICAgICAgICAgICBbUkVDVCBwdCBwdF0gLi4uIDsgCi0jICAgICAgICAgfSAKLSMgICAgIC4uLiAKLSMgRU5EIFNMT1RTCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1TTE9UUyAzIDsKLSAgLSAgTEFZRVIgTTEKLSAgICAgICAgUkVDVCAoIDMgMyApICAoIDYgOCApIDsKLSAgLSAgTEFZRVIgTTIKLSAgICAgICAgUkVDVCAoIDMgMyApICAoIDYgOCApCi0gICAgICAgIFBPTFlHT04gKCAwIDAgKSAoIDAgMTAgKSAoIDEwIDEwICkgKCAxMCAyMCApICggMjAgMjAgKSAoIDIwIDAgKSA7Ci0gIC0gIExBWUVSIE0zCi0gICAgICAgIFJFQ1QgKCAzIDMgKSAgKCA2IDggKSA7Ci1FTkQgU0xPVFMgICAgIAotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgRklMTFMgbnVtRmlsbHMgOyAKLSMgICAgIC0geyBMQVlFUiBsYXllck5hbWUgCi0jICAgICAgICAgICAgIFJFQ1QgcHQgcHQgCi0jICAgICAgICAgICAgIFtSRUNUIHB0IHB0XSAuLi4gOyAKLSMgICAgICAgICB9IAotIyAgICAgLi4uIAotIyBFTkQgRklMTFMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUZJTExTIDUgOwotICAgLSBWSUEgbXl2aWExICsgTUFTSyAyICsgT1BDCi0gICAgKCA1MDAwIDUwMDAgKQotICAgICggODAwIDgwMCApIDsKLSAgIC0gIExBWUVSIE0xICsgTUFTSyAyCi0gICAgICAgIFJFQ1QgKCAwIDIgKSAgKCAxIDEwICkgOwotICAgLSAgTEFZRVIgTTIgKyBPUEMKLSAgICAgICAgUkVDVCAoIDAgMiApICAoIDEgMTAgKQotICAgICAgICBQT0xZR09OICggMCAwICkgKCAwIDEwICkgKCAxMCAxMCApICggMTAgMjAgKSAoIDIwIDIwICkgKCAyMCAwICkgOwotICAgLSAgTEFZRVIgTTMgICAgCi0gICAgICAgIFJFQ1QgKCAwIDIgKSAgKCAxIDEwICkgOwotICAgLSBWSUEgTTFfTTIgKyBNQVNLIDIwMiArIE9QQyAoIDI0MDAgMCApICggMTAgMTAgKSA7Ci0gICAtIFZJQSBWSUFHRU4xMl8wICsgT1BDICggMTAwIDEwMCApICggMjAwIDEwMCApIDsKLUVORCBGSUxMUyAgICAgCSAgIAotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQkVHSU5FWFQgInRhZyIgCi0jICAgZXh0ZW5zaW9uVGV4dCAKLSMgRU5ERVhUIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotQkVHSU5FWFQgInRhZyIKLS0gQ1JFQVRPUiAiQ2FkZW5jZSIgOwotLSBPVFRFUiBmdXJyeQotICArIFBST1BFUlRZIGFycmcgbGF0ZXIKLSAgOwotLSBTRUFMIGNvdXNpbiB0byBXQUxSVVMgOwotRU5ERVhUCi0KLUVORCBERVNJR04KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9URVNUL2NvbXBsZXRlLjUuOC5kZWYuYXUgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvVEVTVC9jb21wbGV0ZS41LjguZGVmLmF1CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjIwZGEzLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9URVNUL2NvbXBsZXRlLjUuOC5kZWYuYXUKKysrIC9kZXYvbnVsbApAQCAtMSw4MDggKzAsMCBAQAotVkVSU0lPTiA1LjggOwotQUxJQVMgYWxpYXMxIGFsaWFzVmFsdWUxIDEgOwotQUxJQVMgYWxpYXMyIGFsaWFzVmFsdWUyIDAgOwotRElWSURFUkNIQVIgIi8iIDsKLUJVU0JJVENIQVJTICJbXSIgOwotREVTSUdOIGRlc2lnbiA7Ci1URUNITk9MT0dZIHRlY2hub2xvZ3kgOwotVU5JVFMgRElTVEFOQ0UgTUlDUk9OUyAxMDAwIDsKLQotUFJPUEVSVFlERUZJTklUSU9OUwotREVTSUdOIHN0cnByb3AgU1RSSU5HICJhU3RyaW5nIiA7Ci1ERVNJR04gaW50cHJvcCBJTlRFR0VSIDEgOwotREVTSUdOIHJlYWxwcm9wIFJFQUwgMS4xIDsKLURFU0lHTiBpbnRyYW5nZXByb3AgSU5URUdFUiBSQU5HRSAxIDEwMCAyNSA7Ci1ERVNJR04gcmVhbHJhbmdlcHJvcCBSRUFMIFJBTkdFIDEuMSAxMDAuMSAyNS4yNSA7Ci1SRUdJT04gc3RycHJvcCBTVFJJTkcgOwotUkVHSU9OIGludHByb3AgSU5URUdFUiA7Ci1SRUdJT04gcmVhbHByb3AgUkVBTCA7Ci1SRUdJT04gaW50cmFuZ2Vwcm9wIElOVEVHRVIgUkFOR0UgMSAxMDAgOwotUkVHSU9OIHJlYWxyYW5nZXByb3AgUkVBTCBSQU5HRSAxLjEgMTAwLjEgOwotR1JPVVAgc3RycHJvcCBTVFJJTkcgOwotR1JPVVAgaW50cHJvcCBJTlRFR0VSIDsKLUdST1VQIHJlYWxwcm9wIFJFQUwgOwotR1JPVVAgaW50cmFuZ2Vwcm9wIElOVEVHRVIgUkFOR0UgMSAxMDAgOwotR1JPVVAgcmVhbHJhbmdlcHJvcCBSRUFMIFJBTkdFIDEuMSAxMDAuMSA7Ci1DT01QT05FTlQgc3RycHJvcCBTVFJJTkcgOwotQ09NUE9ORU5UIGludHByb3AgSU5URUdFUiA7Ci1DT01QT05FTlQgcmVhbHByb3AgUkVBTCA7Ci1DT01QT05FTlQgaW50cmFuZ2Vwcm9wIElOVEVHRVIgUkFOR0UgMSAxMDAgOwotQ09NUE9ORU5UIHJlYWxyYW5nZXByb3AgUkVBTCBSQU5HRSAxLjEgMTAwLjEgOwotTkVUIHN0cnByb3AgU1RSSU5HIDsKLU5FVCBpbnRwcm9wIElOVEVHRVIgOwotTkVUIHJlYWxwcm9wIFJFQUwgOwotTkVUIGludHJhbmdlcHJvcCBJTlRFR0VSIFJBTkdFIDEgMTAwIDsKLU5FVCByZWFscmFuZ2Vwcm9wIFJFQUwgUkFOR0UgMS4xIDEwMC4xIDsKLVNQRUNJQUxORVQgc3RycHJvcCBTVFJJTkcgOwotU1BFQ0lBTE5FVCBpbnRwcm9wIElOVEVHRVIgOwotU1BFQ0lBTE5FVCByZWFscHJvcCBSRUFMIDsKLVNQRUNJQUxORVQgaW50cmFuZ2Vwcm9wIElOVEVHRVIgUkFOR0UgMSAxMDAgOwotU1BFQ0lBTE5FVCByZWFscmFuZ2Vwcm9wIFJFQUwgUkFOR0UgMS4xIDEwMC4xIDsKLVBhcnNlZCA1MCBudW1iZXIgb2YgbGluZXMhIQotUk9XIHN0cnByb3AgU1RSSU5HIDsKLVJPVyBpbnRwcm9wIElOVEVHRVIgOwotUk9XIHJlYWxwcm9wIFJFQUwgOwotUk9XIGludHJhbmdlcHJvcCBJTlRFR0VSIFJBTkdFIDEgMTAwIDsKLVJPVyByZWFscmFuZ2Vwcm9wIFJFQUwgUkFOR0UgMS4xIDEwMC4xIDsKLUNPTVBPTkVOVFBJTiBzdHJwcm9wIFNUUklORyA7Ci1DT01QT05FTlRQSU4gaW50cHJvcCBJTlRFR0VSIDsKLUNPTVBPTkVOVFBJTiByZWFscHJvcCBSRUFMIDsKLUNPTVBPTkVOVFBJTiBpbnRyYW5nZXByb3AgSU5URUdFUiBSQU5HRSAxIDEwMCA7Ci1DT01QT05FTlRQSU4gcmVhbHJhbmdlcHJvcCBSRUFMIFJBTkdFIDEuMSAxMDAuMSA7Ci1OT05ERUZBVUxUUlVMRSBzdHJwcm9wIFNUUklORyA7Ci1OT05ERUZBVUxUUlVMRSBpbnRwcm9wIElOVEVHRVIgOwotTk9OREVGQVVMVFJVTEUgcmVhbHByb3AgUkVBTCA7Ci1OT05ERUZBVUxUUlVMRSBpbnRyYW5nZXByb3AgSU5URUdFUiBSQU5HRSAxIDEwMCA7Ci1OT05ERUZBVUxUUlVMRSByZWFscmFuZ2Vwcm9wIFJFQUwgUkFOR0UgMS4xIDEwMC4xIDsKLUVORCBQUk9QRVJUWURFRklOSVRJT05TCi0KLURJRUFSRUEgLTE5MDAwMCAtMTIwMDAwIC0xOTAwMDAgMzUwMDAwIDsKLURJRUFSRUEgLTE5MDAwMCAtMTIwMDAwIC0xOTAwMDAgMzUwMDAwIDE5MDAwMCAzNTAwMDAgMTkwMDAwIDE5MDAwMCAxOTAzNjAgMTkwMDAwIDE5MDM2MCAtMTIwMDAwIDsKLVJPVyBST1dfMSBDT1JFIDEwMDAgMTAwMCBOIERPIDEwMCBCWSAxIFNURVAgNzAwIDAgOwotICArIFBST1BFUlRZIHN0cnByb3AgYVN0cmluZyBTVFJJTkcgICArIFBST1BFUlRZIGludHByb3AgMSBJTlRFR0VSICAgKyBQUk9QRVJUWSByZWFscHJvcCAxLjEgUkVBTCAgICsgUFJPUEVSVFkgaW50cmFuZ2Vwcm9wIDI1IElOVEVHRVIgICArIFBST1BFUlRZIHJlYWxyYW5nZXByb3AgMjUuMjUgUkVBTCA7Ci1ST1cgUk9XXzIgQ09SRSAxMDAwIDIwMDAgUyBETyAxMDAgQlkgMSBTVEVQIDcwMCAwIDsKLVJPVyBST1dfMyBDT1JFIDEwMDAgMzAwMCBFIERPIDEwMCBCWSAxIFNURVAgODQwMCAwIDsKLVJPVyBST1dfNCBDT1JFIDEwMDAgNDAwMCBXIERPIDEwMCBCWSAxIFNURVAgODQwMCAwIDsKLVJPVyBST1dfNSBDT1JFIDEwMDAgNTAwMCBGTiBETyAxMDAgQlkgMSBTVEVQIDcwMCAwIDsKLVJPVyBST1dfNiBDT1JFIDEwMDAgNjAwMCBGUyBETyAxMDAgQlkgMSBTVEVQIDcwMCAwIDsKLVJPVyBST1dfNyBDT1JFIDEwMDAgNzAwMCBGRSBETyAxMDAgQlkgMSBTVEVQIDg0MDAgMCA7Ci1ST1cgUk9XXzggQ09SRSAxMDAwIDgwMDAgRlcgRE8gMTAwIEJZIDEgU1RFUCA4NDAwIDAgOwotUk9XIFJPV19WRVJUXzEgQ09SRSAtMTAwMDAgLTEwMDAwIE4gRE8gMSBCWSAxMCBTVEVQIDAgODQwMCA7Ci1ST1cgUk9XX1ZFUlRfMiBDT1JFIC05MDAwIC0xMDAwMCBTIERPIDEgQlkgMTAgU1RFUCAwIDg0MDAgOwotUk9XIFJPV19WRVJUXzMgQ09SRSAtODAwMCAtMTAwMDAgRSBETyAxIEJZIDEwIFNURVAgMCA3MDAgOwotUGFyc2VkIDEwMCBudW1iZXIgb2YgbGluZXMhIQotUk9XIFJPV19WRVJUXzQgQ09SRSAtNzAwMCAtMTAwMDAgVyBETyAxIEJZIDEwIFNURVAgMCA3MDAgOwotUk9XIFJPV19WRVJUXzUgQ09SRSAtNjAwMCAtMTAwMDAgRk4gRE8gMSBCWSAxMCBTVEVQIDAgODQwMCA7Ci1ST1cgUk9XX1ZFUlRfNiBDT1JFIC01MDAwIC0xMDAwMCBGUyBETyAxIEJZIDEwIFNURVAgMCA4NDAwIDsKLVJPVyBST1dfVkVSVF83IENPUkUgLTQwMDAgLTEwMDAwIEZFIERPIDEgQlkgMTAgU1RFUCAwIDcwMCA7Ci1ST1cgUk9XX1ZFUlRfOCBDT1JFIC0zMDAwIC0xMDAwMCBGVyBETyAxIEJZIDEgU1RFUCAwIDcwMCA7Ci1ST1cgUk9XX2FycmF5MCBBUlJBWVNJVEUgMTAwMDAgMTAwMDAgTiBETyAxMDAgQlkgMSBTVEVQIDE2MDAwIDAgOwotUk9XIFJPV19hcnJheTEgQVJSQVlTSVRFIDEwMDAwIDE3MDAwIFcgRE8gMTAwIEJZIDEgU1RFUCAxNjAwMCAwIDsKLVJPVyBST1dfYXJyYXkyIEFSUkFZU0lURSAxMDAwMCAxNzAwMCBTIERPIDEwMCBCWSAxIFNURVAgMTYwMDAgMCA7Ci1ST1cgUk9XX2FycmF5MyBBUlJBWVNJVEUgMTAwMDAgMTcwMDAgRSBETyAxMDAgQlkgMSBTVEVQIDE2MDAwIDAgOwotUk9XIFJPV19hcnJheTQgQVJSQVlTSVRFIDEwMDAwIDE3MDAwIEZOIERPIDEwMCBCWSAxIFNURVAgMTYwMDAgMCA7Ci1ST1cgUk9XX2FycmF5NSBBUlJBWVNJVEUgMTAwMDAgMTcwMDAgRkUgRE8gMTAwIEJZIDEgU1RFUCAxNjAwMCAwIDsKLVJPVyBST1dfYXJyYXk2IEFSUkFZU0lURSAxMDAwMCAxNzAwMCBGUyBETyAxMDAgQlkgMSBTVEVQIDE2MDAwIDAgOwotUk9XIFJPV19hcnJheTcgQVJSQVlTSVRFIDEwMDAwIDE3MDAwIEZXIERPIDEwMCBCWSAxIFNURVAgMTYwMDAgMCA7Ci1UUkFDS1MgWSA1MiBETyA4NTcgU1RFUCAxMDQgTUFTSyAxIExBWUVSIDsKLVRSQUNLUyBZIDUyIERPIDg1NyBTVEVQIDEwNCBNQVNLIDEgU0FNRU1BU0sgTEFZRVIgTTEgTTIgOwotVFJBQ0tTIFggNTIgRE8gMTcyMCBTVEVQIDEwNCBNQVNLIDIgTEFZRVIgTTIgOwotVFJBQ0tTIFggNTIgRE8gMTcyMCBTVEVQIDEwNCBMQVlFUiA7Ci1HQ0VMTEdSSUQgWCAwIERPIDEwMCBTVEVQIDYwMCA7Ci1HQ0VMTEdSSUQgWSAxMCBETyAxMjAgU1RFUCA0MDAgOwotCi1WSUFTIDYgOwotUGFyc2VkIDE1MCBudW1iZXIgb2YgbGluZXMhIQotLSBWSUFHRU4xMl8wICsgUkVDVCBNRVRBTDEgLTQ0MDAgLTM4MDAgNDQwMCAzODAwIAotKyBSRUNUIE0yICsgTUFTSyAzIC00NTAwIC0zODAwIDQ1MDAgMzgwMCAKLSsgUkVDVCBWMSArIE1BU0sgMiAtMzYwMCAtMzgwMCAtMjAwMCAtMjIwMCAKLSsgUkVDVCBWMSArIE1BU0sgMSAtMzYwMCAyMjAwIC0yMDAwIDM4MDAgCi0rIFJFQ1QgVjEgKyBNQVNLIDIgMjAwMCAtMzgwMCAzNjAwIC0yMjAwIAotKyBSRUNUIFYxICsgTUFTSyAzIDIwMDAgMjIwMCAzNjAwIDM4MDAgCi0gOwotLSBWSUFHRU4xMl8yICsgUkVDVCBNRVRBTDEgLTI1MDAgLTE1MDAgMjUwMCAxNTAwIAotKyBSRUNUIE0yIC0yNTAwIC0xNTAwIDI1MDAgMTUwMCAKLSsgUkVDVCBWMSAtMjM2MCAtOTYwIC03NjAgNjQwIAotKyBSRUNUIFYxIC0xMzIwIC05NjAgMjgwIDY0MCAKLSsgUkVDVCBWMSA3NjAgLTk2MCAyMzYwIDY0MCAKLSA7Ci0tIFZJQUdFTjEyXzMgKyBSRUNUIE1FVEFMMSAtMTYwMCAtMTYwMCAxNjAwIDE2MDAgCi0rIFJFQ1QgTTIgLTE2MDAgLTE2MDAgMTYwMCAxNjAwIAotKyBSRUNUIFYxIC04MDAgLTgwMCA4MDAgODAwIAotIDsKLS0gVklBR0VOMTJfNCAgOwotKyBWSUFSVUxFICdWSUFHRU4xMicKLSAgKyBDVVRTSVpFIDE2MDAgMTYwMAotICArIExBWUVSUyBNMSBWMSBNMgotICArIENVVFNQQUNJTkcgNTYwMCA2MTAwCi0gICsgRU5DTE9TVVJFIDEwMCAxMDAgMTUwIDE1MAotICArIFJPV0NPTCA1IDE0Ci0gICsgT1JJR0lOIDEwIC0xMAotICArIE9GRlNFVCAwIDAgMjAgLTIwCi0gICsgUEFUVEVSTiAnMl9GRkUwXzNfRkZGRicKLS0gTTJfTTFyY3RfMCArIFJFQ1QgVjEgLTI1IC02NSAyNSA2NSAKLSsgUkVDVCBNMSAtMzUgLTk1IDM1IDk1IAotKyBSRUNUIE0yIC02NSAtNjUgNjUgNjUgCi0gOwotLSBWSUFHRU4xMl8xICsgUkVDVCBNMiAtMjUwMCAtMTUwMCAyNTAwIDE1MDAgCi0rIFJFQ1QgVjEgLTI0MDAgLTk2MCAtNzAwIDY0MCAKLQotICArIFBPTFlHT04gTUVUQUwxICsgTUFTSyAyIC0yNTAwIC0xNTAwIC0yNTAwIDI1MDAgMTUwMCAyNTAwIDE1MDAgMTUwMCAyNTAwIDE1MDAgMjUwMCAtMTUwMCAgOwotRU5EIFZJQVMKLS0gQ1VTVE9NVklBIAotICArIFBPTFlHT04gTUVUQUwxICsgTUFTSyAzIC0yNTAwIC0xNTAwIC0yNTAwIDI1MDAgMTUwMCAyNTAwIDE1MDAgMTUwMCAyNTAwIDE1MDAgMjUwMCAtMTUwMCAgOwotRU5EIFZJQVMKLS0gVFVSTk0xXzEgKyBSRUNUIE1FVEFMMSAtMTAwIC02MCAxMDAgNjAgCi0gOwotRU5EIFZJQVMKLS0gVFVSTk0yXzEgKyBSRUNUIE0yIC0xMDAgLTYwIDEwMCA2MCAKLSA7Ci1FTkQgVklBUwotUGFyc2VkIDIwMCBudW1iZXIgb2YgbGluZXMhIQotLSBUVVJOTTNfMSArIFJFQ1QgTTMgLTEwMCAtNjAgMTAwIDYwIAotIDsKLUVORCBWSUFTCi0tIG15dmlhMSArIFJFQ1QgTUVUQUwxICsgTUFTSyAyIDAgMCA0MDAwMCA0MDAwMCAKLSsgUkVDVCBWMSArIE1BU0sgMyAwIDAgNDAwMDAgNDAwMDAgCi0rIFJFQ1QgTTIgMCAwIDQwMDAwIDQwMDAwIAotIDsKLUVORCBWSUFTCi0KLVNUWUxFUyAxMCA7Ci0tIFNUWUxFIDAgMzAgMTAgMTAgMzAgLTEwIDMwIC0zMCAxMCAtMzAgLTEwIC0xMCAtMzAgMTAgLTMwIDMwIC0xMCA7Ci0tIFNUWUxFIDEgMjUgMjUgLTI1IDI1IC0yNSAtMjUgMjUgLTI1IDsKLS0gU1RZTEUgMiA1MCA1MCAtNTAgNTAgLTUwIC01MCA1MCAtNTAgOwotLSBTVFlMRSAzIDUwIDIxIDIxIDUwIC0yMSA1MCAtNTAgMjEgLTUwIC0yMSAtMjEgLTUwIDIxIC01MCA1MCAtMjEgOwotLSBTVFlMRSA0IC0zMCAtMjAgMTAgLTYwIDUwIC0yMCA1MCA0MCAwIDQwIC0zMCAxMCA7Ci0tIFNUWUxFIDUgMCAyMDAwIDAgLTIwMDAgMCAyMDAwIDAgLTIwMDAgOwotLSBTVFlMRSA2IC0yMDAwIDIwMDAgMjAwMCAtMjAwMCAyMDAwIC0yMDAwIDsKLS0gU1RZTEUgNyAwIDAgMCAxMDAwIDEwMDAgMCA7Ci0tIFNUWUxFIDggLTc1MDAgLTMxMTAgLTMxMTAgLTc1MDAgMzExMCAtNzUwMCA3NTAwIC0zMTEwIDc1MDAgNzUwMCAtNzUwMCA3NTAwIDsKLS0gU1RZTEUgOSAwIC0xMDYxMCA3NTAwIC0zMTEwIDc1MDAgMzExMCAzMTEwIDc1MDAgLTMxMTAgNzUwMCAtMTA2MTAgMCA7Ci1FTkQgU1RZTEVTCi0KLU5PTkRFRkFVTFRSVUxFUyAxIDsKLVBhcnNlZCAyNTAgbnVtYmVyIG9mIGxpbmVzISEKLS0gREVGQVVMVAotICAgKyBMQVlFUiBNRVRBTDEgV0lEVEggMTAgRElBR1dJRFRIIDggU1BBQ0lORyAyIFdJUkVFWFQgMQotICAgKyBMQVlFUiBNMiBXSURUSCAxMCBTUEFDSU5HIDIKLSAgICsgTEFZRVIgTTMgV0lEVEggMTEgU1BBQ0lORyAzCi0gICArIFZJQSBNMV9NMgotICAgKyBWSUEgTTJfTTMKLSAgICsgVklBUlVMRSBWSUFHRU4xMgotICAgKyBNSU5DVVRTIFYxIDIKLSAgICsgUFJPUEVSVFkgc3RycHJvcCBhU3RyaW5nIFNUUklORwotICAgKyBQUk9QRVJUWSBpbnRwcm9wIDEgSU5URUdFUgotICAgKyBQUk9QRVJUWSByZWFscHJvcCAxLjEgUkVBTAotICAgKyBQUk9QRVJUWSBpbnRyYW5nZXByb3AgMjUgSU5URUdFUgotICAgKyBQUk9QRVJUWSByZWFscmFuZ2Vwcm9wIDI1LjI1IFJFQUwKLUVORCBOT05ERUZBVUxUUlVMRVMKLS0gUlVMRTIKLSAgICsgSEFSRFNQQUNJTkcKLSAgICsgTEFZRVIgTUVUQUwxIFdJRFRIIDEwIERJQUdXSURUSCA4IFNQQUNJTkcgMiBXSVJFRVhUIDEKLSAgICsgTEFZRVIgTTIgV0lEVEggMTAgU1BBQ0lORyAyCi0gICArIExBWUVSIE0zIFdJRFRIIDExIFNQQUNJTkcgMwotICAgKyBWSUEgTTFfTTIKLSAgICsgVklBIE0yX00zCi0gICArIFZJQVJVTEUgVklBR0VOMTIKLSAgICsgTUlOQ1VUUyBWMSAyCi0gICArIFBST1BFUlRZIHN0cnByb3AgYVN0cmluZyBTVFJJTkcKLSAgICsgUFJPUEVSVFkgaW50cHJvcCAxIElOVEVHRVIKLSAgICsgUFJPUEVSVFkgcmVhbHByb3AgMS4xIFJFQUwKLSAgICsgUFJPUEVSVFkgaW50cmFuZ2Vwcm9wIDI1IElOVEVHRVIKLSAgICsgUFJPUEVSVFkgcmVhbHJhbmdlcHJvcCAyNS4yNSBSRUFMCi1FTkQgTk9OREVGQVVMVFJVTEVTCi0KLVJFR0lPTlMgMiA7Ci0tIHJlZ2lvbjEgLTUwMCAtNTAwIDMwMCAxMDAgCi01MDAgNTAwIDEwMDAgMTAwMCAKLSsgVFlQRSBGRU5DRQotKyBQUk9QRVJUWSBzdHJwcm9wIGFTdHJpbmcgU1RSSU5HICsgUFJPUEVSVFkgaW50cHJvcCAxIElOVEVHRVIgKyBQUk9QRVJUWSByZWFscHJvcCAxLjEgUkVBTCArIFBST1BFUlRZIGludHJhbmdlcHJvcCAyNSBJTlRFR0VSICsgUFJPUEVSVFkgcmVhbHJhbmdlcHJvcCAyNS4yNSBSRUFMIDsKLS0gcmVnaW9uMiA0MDAwIDAgNTAwMCAxMDAwIAotKyBUWVBFIEdVSURFCi07Ci1FTkQgUkVHSU9OUwotUGFyc2VkIDMwMCBudW1iZXIgb2YgbGluZXMhIQotCi1DT01QT05FTlRNQVNLU0hJRlQgTTMgTTIgVjEgTTEgOwotCi1DT01QT05FTlRTIDEzIDsKLS0gSTEgQiArIFBMQUNFRCAxMDAgMTAwIE4gKyBTT1VSQ0UgTkVUTElTVCArIEdFTkVSQVRFIGdlbmVyYXRvciArIFdFSUdIVCAxMDAgKyBFRVFNQVNURVIgQSArIFJFR0lPTiByZWdpb24xICsgTUFTS1NISUZUIDExMDIKLSsgSEFMTyBTT0ZUIDUgNiA3IDgKLSsgUk9VVEVIQUxPIDEwMCBNRVRBTDEgTTMKLSsgUFJPUEVSVFkgc3RycHJvcCBhU3RyaW5nIFNUUklORyArIFBST1BFUlRZIGludHByb3AgMSBJTlRFR0VSICsgUFJPUEVSVFkgcmVhbHByb3AgMS4xIFJFQUwgKyBQUk9QRVJUWSBpbnRyYW5nZXByb3AgMjUgSU5URUdFUiArIFBST1BFUlRZIHJlYWxyYW5nZXByb3AgMjUuMjUgUkVBTCA7Ci0tIEkyIEEgKyBQTEFDRUQgMjAwIDIwMCBTICsgU09VUkNFIERJU1QgKyBST1VURUhBTE8gMTAwIE0yIE0zCi07Ci0tIEkzIEEgKyBQTEFDRUQgMzAwIDMwMCBFICsgU09VUkNFIFVTRVIgOwotLSBJNCBBICsgUExBQ0VEIDQwMCA0MDAgVyArIFNPVVJDRSBUSU1JTkcgOwotLSBJNSBBICsgUExBQ0VEIDUwMCA1MDAgRk4gOwotUGFyc2VkIDM1MCBudW1iZXIgb2YgbGluZXMhIQotLSBJNiBBICsgUExBQ0VEIDYwMCA2MDAgRlMgOwotLSBJNyBBICsgUExBQ0VEIDcwMCA3MDAgRkUgOwotLSBJOCBBICsgUExBQ0VEIDgwMCA4MDAgRlcgOwotLSBJOSBBICsgRklYRUQgOTAwIDkwMCBOIDsKLS0gSTEwIEEgKyBDT1ZFUiAxMDAwIDEwMDAgTiA7Ci0tIEkxMSBBICsgVU5QTEFDRUQgOwotLSBJMTJbMF0gQSA7Ci0tIEkxMlsxXSBBIDsKLUVORCBDT01QT05FTlRTCi0tIEkxM1swXVsxMF0gQSA7Ci1FTkQgQ09NUE9ORU5UUwotLSBJMTRcWzFcXSBBIDsKLUVORCBDT01QT05FTlRTCi0tIHZlY3Rvcm1vZHVsZVsxXS9zY2FsYXJuYW1lIEEgOwotRU5EIENPTVBPTkVOVFMKLS0gdmVjdG9ybW9kdWxlWzFdL3ZlY3Rvcm5hbWVbMV0gQSA7Ci1FTkQgQ09NUE9ORU5UUwotLSBzY2FuY2VsbDEgQ0hLM0EgOwotRU5EIENPTVBPTkVOVFMKLS0gc2NhbmNlbGwyIENISzNBIDsKLUVORCBDT01QT05FTlRTCi0tIHNjYW5jZWxsMyBDSEszQSA7Ci1FTkQgQ09NUE9ORU5UUwotLSBzY2FuY2VsbDQgQ0hLM0EgOwotRU5EIENPTVBPTkVOVFMKLS0gc2NhbmNlbGw1IENISzNBIDsKLUVORCBDT01QT05FTlRTCi0tIHNjYW5jZWxsNiBDSEszQSA7Ci1FTkQgQ09NUE9ORU5UUwotLSBzY2FuY2VsbDcgQ0hLM0EgOwotRU5EIENPTVBPTkVOVFMKLS0gc2NhbmNlbGw4IENISzNBIDsKLUVORCBDT01QT05FTlRTCi0tIHNjYW5jZWxsOSBDSEszQSA7Ci1FTkQgQ09NUE9ORU5UUwotLSBzY2FuY2VsbDEwIENISzNBIDsKLUVORCBDT01QT05FTlRTCi0tIHNjYW5jZWxsMTEgQ0hLM0EgOwotRU5EIENPTVBPTkVOVFMKLS0gc2NhbmNlbGwxMiBDSEszQSA7Ci1FTkQgQ09NUE9ORU5UUwotLSBub2JyYWNrZXRzIEEgOwotRU5EIENPTVBPTkVOVFMKLS0gc29tZXRoaW5nd2l0aFsxXSBBIDsKLUVORCBDT01QT05FTlRTCi0tIG1vcmVbXWJyYWNrZXRzIEEgOwotRU5EIENPTVBPTkVOVFMKLS0gbW9yZVsxXWJyYWNrZXRzIEEgOwotRU5EIENPTVBPTkVOVFMKLS0gbW9yZVxbMVxdYnJhY2tldHMgQSA7Ci1FTkQgQ09NUE9ORU5UUwotLSBtb3JlWzFdWzJdIEEgOwotRU5EIENPTVBPTkVOVFMKLS0gbW9yZVxbMVxdXFsyXF0gQSA7Ci1FTkQgQ09NUE9ORU5UUwotLSBtb3JlXFsyXF0gQSA7Ci1FTkQgQ09NUE9ORU5UUwotLSBmb29cWzFcXVxbMlxdL2hhaGFcWzNcXVxbNFxdIEEgOwotRU5EIENPTVBPTkVOVFMKLS0gZm9vWzJdWzNdL2hhaGFbNF1bNV0gQSA7Ci1FTkQgQ09NUE9ORU5UUwotLSBmb29cWzNcXVxbNFxdL2hhaGFbNV1bNl0gQSA7Ci1FTkQgQ09NUE9ORU5UUwotLSBmb29bNF1bNV0vaGFoYVxbNlxdXFs3XF0gQSA7Ci1FTkQgQ09NUE9ORU5UUwotLSBmb29bNV1bNl1iYXIvaGFoYVxbN1xdXFs4XF0gQSA7Ci1FTkQgQ09NUE9ORU5UUwotLSBmb29bNl1bN11iYXIvaGFoYVs4XVs5XSBBIDsKLUVORCBDT01QT05FTlRTCi1QYXJzZWQgNDAwIG51bWJlciBvZiBsaW5lcyEhCi0KLVBJTlMgMTEgOwotUGFyc2VkIDQ1MCBudW1iZXIgb2YgbGluZXMhIQotLSBQMCArIE5FVCBOMCArIERJUkVDVElPTiBJTlBVVCArIFVTRSBTSUdOQUwgKyBORVRFWFBSICJwb3dlcjEgVkREIiArIFNVUFBMWVNFTlNJVElWSVRZIFAxICsgR1JPVU5EU0VOU0lUSVZJVFkgUDIgCi0gICsgUE9SVAotICAgICArIExBWUVSIE0yIE1BU0sgMiAwIDAgMzAgMTM1IAotICAgICArIFZJQSBWSUFHRU4xMl8wICggMCAxMDAgKSAKLSAgICAgKyBGSVhFRCAoIDQ1IC0yMTYwICkgTiAKLSAgKyBQT1JUCi0gICAgICsgTEFZRVIgTTEgMCAwIDMwIDEzNSAKLSAgICAgKyBWSUEgTTFfTTIgTUFTSyAwMjMgKCAxMDAgMCApIAotICAgICArIENPVkVSICggMCAtMTAwMCApIE4gCi0gICsgUE9SVAotICAgICArIExBWUVSIE0zIDAgMCAzMCAxMzUgCi0gICAgICsgUExBQ0VEICggMTAwMCAtMTAwMCApIE4gKyBTUEVDSUFMIEFOVEVOTkFQSU5QQVJUSUFMTUVUQUxBUkVBIDUgTEFZRVIgTUVUQUwxCi1BTlRFTk5BUElOUEFSVElBTE1FVEFMQVJFQSA1IExBWUVSIE0yCi1BTlRFTk5BUElOUEFSVElBTE1FVEFMU0lERUFSRUEgMTAgTEFZRVIgTUVUQUwxCi1BTlRFTk5BUElOUEFSVElBTE1FVEFMU0lERUFSRUEgMTAgTEFZRVIgTTIKLUFOVEVOTkFQSU5ESUZGQVJFQSAyMCBMQVlFUiBNMQotQU5URU5OQVBJTkRJRkZBUkVBIDIwIExBWUVSIE0yCi1BTlRFTk5BUElOUEFSVElBTENVVEFSRUEgMzUgTEFZRVIgVjEKLUFOVEVOTkFQSU5QQVJUSUFMQ1VUQVJFQSAzNSBMQVlFUiBWMgotQU5URU5OQU1PREVMIE9YSURFMQotQU5URU5OQVBJTkdBVEVBUkVBIDE1IExBWUVSIE0xCi1BTlRFTk5BUElOR0FURUFSRUEgMTUgTEFZRVIgTTIKLUFOVEVOTkFQSU5NQVhBUkVBQ0FSIDI1IExBWUVSIE0xCi1BTlRFTk5BUElOTUFYU0lERUFSRUFDQVIgMzAgTEFZRVIgTTEKLUFOVEVOTkFQSU5NQVhDVVRDQVIgNDAgTEFZRVIgTTEKLUFOVEVOTkFNT0RFTCBPWElERTIKLUFOVEVOTkFQSU5HQVRFQVJFQSAxMTUgTEFZRVIgTTEKLUFOVEVOTkFQSU5HQVRFQVJFQSAxMTUgTEFZRVIgTTIKLUFOVEVOTkFQSU5NQVhBUkVBQ0FSIDEyNSBMQVlFUiBNMQotQU5URU5OQVBJTk1BWFNJREVBUkVBQ0FSIDEzMCBMQVlFUiBNMQotQU5URU5OQVBJTk1BWENVVENBUiAxNDAgTEFZRVIgTTEKLUFOVEVOTkFNT0RFTCBPWElERTMKLUFOVEVOTkFQSU5HQVRFQVJFQSAxMTUgTEFZRVIgTTEKLUFOVEVOTkFQSU5HQVRFQVJFQSAxMTUgTEFZRVIgTTIKLUFOVEVOTkFQSU5NQVhBUkVBQ0FSIDEyNSBMQVlFUiBNMQotQU5URU5OQVBJTk1BWFNJREVBUkVBQ0FSIDEzMCBMQVlFUiBNMQotQU5URU5OQVBJTk1BWENVVENBUiAxNDAgTEFZRVIgTTEKLUFOVEVOTkFNT0RFTCBPWElERTQKLUFOVEVOTkFQSU5HQVRFQVJFQSAxMTUgTEFZRVIgTTEKLUFOVEVOTkFQSU5HQVRFQVJFQSAxMTUgTEFZRVIgTTIKLUFOVEVOTkFQSU5NQVhBUkVBQ0FSIDEyNSBMQVlFUiBNMQotQU5URU5OQVBJTk1BWFNJREVBUkVBQ0FSIDEzMCBMQVlFUiBNMQotQU5URU5OQVBJTk1BWENVVENBUiAxNDAgTEFZRVIgTTEKLTsKLS0gUDEgKyBORVQgTjEgKyBESVJFQ1RJT04gT1VUUFVUICsgVVNFIFBPV0VSICsgTkVURVhQUiAicG93ZXIxIFZERFsxXSIgCi0gICsgUE9MWUdPTiBNMiBNQVNLIDMgMCAwIDAgMTAwIDUwIDEwMCA1MCA1MCAxMDAgNTAgMTAwIDAgKyBQTEFDRUQgKCA0NSAtMjE2MCApIE4gQU5URU5OQVBJTlBBUlRJQUxNRVRBTEFSRUEgNQotQU5URU5OQVBJTlBBUlRJQUxNRVRBTFNJREVBUkVBIDEwCi1BTlRFTk5BUElORElGRkFSRUEgMjAKLUFOVEVOTkFQSU5QQVJUSUFMQ1VUQVJFQSAzNQotQU5URU5OQU1PREVMIE9YSURFMQotQU5URU5OQVBJTkdBVEVBUkVBIDE1Ci07Ci0tIFAyICsgTkVUIE4yICsgRElSRUNUSU9OIElOT1VUICsgVVNFIEdST1VORCAKLSAgKyBMQVlFUiBNMiBNQVNLIDIgMCAwIDMwIDEzNSArIENPVkVSICggNDUgLTIxNjAgKSBOIDsKLS0gUDIuZXh0cmExICsgTkVUIE4yICsgRElSRUNUSU9OIElOT1VUICsgVVNFIEdST1VORCAKLSAgKyBMQVlFUiBNRVRBTDEgMCAwIDEwIDEwICsgQ09WRVIgKCAwIDAgKSBOIDsKLS0gUDMgKyBORVQgTjMgKyBESVJFQ1RJT04gRkVFRFRIUlUgKyBVU0UgQ0xPQ0sgOwotLSBQNCArIE5FVCBONCArIFVTRSBTSUdOQUwgOwotLSBQNSArIE5FVCBONSArIFVTRSBBTkFMT0cgOwotLSBQNiArIE5FVCBONiArIFVTRSBTQ0FOIDsKLVBhcnNlZCA1MDAgbnVtYmVyIG9mIGxpbmVzISEKLS0gUDcgKyBORVQgTjcgKyBVU0UgUkVTRVQgOwotLSBBUlJBWVBJTlswXVsxMF0gKyBORVQgQVJSQVlORVRbMF1bMTBdIAotICArIExBWUVSIE0yIDAgMCAzMCAxMzUgOwotLSBBUlJBWVBJTi5leHRyYTJbMF1bMTBdICsgTkVUIEFSUkFZTkVUWzBdWzEwXSAKLSAgKyBMQVlFUiBNMiAwIDAgMTAgMTAgOwotRU5EIFBJTlMKLS0gc2NhbnBpbiArIE5FVCBTQ0FOICsgVVNFIFNDQU4gOwotRU5EIFBJTlMKLS0gc2NhbnBpbjIgKyBORVQgU0NBTiArIFVTRSBTQ0FOIDsKLUVORCBQSU5TCi0tIElOQlVTWzFdICsgTkVUIElOQlVTPDE+IAotICArIExBWUVSIE1FVEFMMSAwIDAgMTAgMTAgOwotRU5EIFBJTlMKLS0gT1VUQlVTPDE+ICsgTkVUIE9VVEJVUzwxPiA7Ci1FTkQgUElOUwotLSBJTkJVUy5leHRyYTFbMV0gKyBORVQgSU5CVVM8MT4gCi0gICsgTEFZRVIgTTEgMTAgMTAgMTAwIDEwMCA7Ci1FTkQgUElOUwotLSB2ZWN0b3JwaW5bMF0gKyBORVQgdmVjdG9ybW9kdWxlWzFdL3ZlY3Rvcm5ldFswXSA7Ci1FTkQgUElOUwotLSBzY2FsYXJwaW4gKyBORVQgdmVjdG9ybW9kdWxlWzFdL3NjYWxhcm5ldCA7Ci1FTkQgUElOUwotLSBSRV9SRFlfMiArIE5FVCBSRV9SRFlfMiArIERJUkVDVElPTiBPVVRQVVQgKyBVU0UgU0lHTkFMIAotICArIFBPUlQKLSAgICAgKyBWSUEgbXl2aWExIE1BU0sgMTIzICggNTAwIDUwMCApIAotICAgICArIEZJWEVEICggLTM5MDAwMCAwICkgTiAKLSAgKyBQT1JUCi0gICAgICsgUE9MWUdPTiBNRVRBTDEgTUFTSyAyMiAoIDQwMDAwIDQwMDAwICkgKCA4MDAwMCA0MDAwMCApICggODAwMDAgLTQwMDAwICkgKCA0MDAwMCAtNDAwMDAgKSAoIDQwMDAwIC04MDAwMCApICggLTQwMDAwIC04MDAwMCApICggLTQwMDAwIC00MDAwMCApICggLTgwMDAwIC00MDAwMCApICggLTgwMDAwIDQwMDAwICkgKCAtNDAwMDAgNDAwMDAgKSAoIC00MDAwMCA4MDAwMCApICggNDAwMDAgODAwMDAgKSAKLSAgICAgKyBGSVhFRCAoIC0xOTAwMDAgMCApIE4gCi0gICsgUE9SVAotICAgICArIFZJQSBteXZpYTEgKCAxMDAgMTAwICkgCi0gICAgICsgRklYRUQgKCAyOTAwMDAgMCApIE4gOwotRU5EIFBJTlMKLQotUElOUFJPUEVSVElFUyAyIDsKLS0gUElOIFAwIDsKLSAgKyBQUk9QRVJUWSBzdHJwcm9wIGFTdHJpbmcgU1RSSU5HICAgKyBQUk9QRVJUWSBpbnRwcm9wIDEgSU5URUdFUiAgICsgUFJPUEVSVFkgcmVhbHByb3AgMS4xIFJFQUwgICArIFBST1BFUlRZIGludHJhbmdlcHJvcCAyNSBJTlRFR0VSICAgKyBQUk9QRVJUWSByZWFscmFuZ2Vwcm9wIDI1LjI1IFJFQUwgOwotUGFyc2VkIDU1MCBudW1iZXIgb2YgbGluZXMhIQotLSBJMSBBIDsKLSAgKyBQUk9QRVJUWSBzdHJwcm9wIGFTdHJpbmcgU1RSSU5HICAgKyBQUk9QRVJUWSBpbnRwcm9wIDEgSU5URUdFUiAgICsgUFJPUEVSVFkgcmVhbHByb3AgMS4xIFJFQUwgICArIFBST1BFUlRZIGludHJhbmdlcHJvcCAyNSBJTlRFR0VSICAgKyBQUk9QRVJUWSByZWFscmFuZ2Vwcm9wIDI1LjI1IFJFQUwgOwotRU5EIFBJTlBST1BFUlRJRVMKLQotQkxPQ0tBR0VTIDggOwotLSBMQVlFUiBNRVRBTDEKLSAgICsgTUFTSyAxCi0gICBSRUNUIDYwIDcwIDgwIDkwCi07Ci0tIExBWUVSIE0yCi0gICArIENPTVBPTkVOVCBJMQotICAgKyBTTE9UUwotICAgKyBQVVNIRE9XTgotICAgKyBFWENFUFRQR05FVAotICAgKyBNQVNLIDMKLSAgIFBPTFlHT04gMTAwIDEwMCAxMDAgMjAwIDE1MCAyMDAgMTUwIDE1MCAyMDAgMTUwIDIwMCAxMDAgCi07Ci0tIExBWUVSIE0yCi0gICArIFNMT1RTCi0gICArIE1BU0sgMgotICAgUkVDVCAxMCAyMCA0MCA1MAotOwotLSBMQVlFUiBNRVRBTDEKLSAgICsgRklMTFMKLSAgICsgTUFTSyAxCi0gICBSRUNUIC0xMCAyMCAzMCA0MAotOwotLSBMQVlFUiBNMQotICAgKyBQVVNIRE9XTgotICAgKyBNQVNLIDEKLSAgICsgU1BBQ0lORyAzCi0gICBSRUNUIDUwIDMwIDU1IDQwCi07Ci0tIExBWUVSIE0xCi0gICArIEVYQ0VQVFBHTkVUCi0gICArIE1BU0sgMQotICAgKyBERVNJR05SVUxFV0lEVEggNDUKLSAgIFJFQ1QgNTAgMzAgNTUgNDAKLTsKLS0gUExBQ0VNRU5UCi0gICBSRUNUIC0xNSAwIDAgMjAKLSAgIFJFQ1QgLTE1IDIwIDMwIDQwCi0gICBSRUNUIDMwIDUgNTAgNDAKLSAgIFJFQ1QgLTEwIC0xNSA1MCAwCi07Ci0tIFBMQUNFTUVOVAotICAgKyBQQVJUSUFMIDAuNAotICAgKyBDT01QT05FTlQgSTEKLSAgICsgUFVTSERPV04KLSAgIFJFQ1QgLTEwIDAgMCAyMAotICAgUkVDVCAtMTAgMjAgMzAgNDAKLSAgIFJFQ1QgMzAgMCA1MCA0MAotICAgUkVDVCAtMTAgLTUgNTAgMAotOwotRU5EIEJMT0NLQUdFUwotLSBQTEFDRU1FTlQKLSAgICsgUFVTSERPV04KLSAgIFJFQ1QgLTUgMCAwIDIwCi0gICBSRUNUIC01IDIwIDMwIDQwCi0gICBSRUNUIDMwIDAgMjUgNDAKLSAgIFJFQ1QgLTUgMCA1MCAxMAotOwotRU5EIEJMT0NLQUdFUwotUGFyc2VkIDYwMCBudW1iZXIgb2YgbGluZXMhIQotLSBQTEFDRU1FTlQKLSAgICsgU09GVAotICAgUkVDVCA1MCAzMCA1NSA0MAotOwotRU5EIEJMT0NLQUdFUwotLSBQTEFDRU1FTlQKLSAgICsgUEFSVElBTCAwLjQKLSAgIFJFQ1QgNTAgMzAgNTUgNDAKLTsKLUVORCBCTE9DS0FHRVMKLQotU1BFQ0lBTE5FVFMgNSA7Ci0tIFNOMSBQYXJzZWQgNjUwIG51bWJlciBvZiBsaW5lcyEhCi0oIEkxIFouZXh0cmExICkgKCBJMiBaICkgKCBJMyBaICkgKCAqIFogKSAKLSAgKyBST1VURUQgCi1NMSAxMjAgKyBTSEFQRSBSSU5HICggMTQwMDAgMzQxNDQwICkgKCA5NjAwIDM0MTQ0MCApIAotKCA5NjAwIDI4MjQwMCApIE0xX00yIERPIDIgQlkgMiBTVEVQIDIwMCAyMDAgKCAyNDAwIDI4MjQwMCApIE5FVyBNRVRBTDEgCi0xMjAgKyBTSEFQRSBTVFJJUEUgKCAyNDAwIDI4MjQwMCApICggMjQwIDI4MjQwMCApIE0xX00yIAotTkVXIE0xIDEyMCArIFNIQVBFIEZPTExPV1BJTiAoIDI1MDAgMjgyNDAwICkgKCAyNTAgMjgyNDAwICkgCi1WSUFHRU4xMl8wIE4gTkVXIE0xIDEyMCArIFNIQVBFIElPV0lSRSAKLSggMjYwMCAyODI0MDAgKSAoIDI2MCAyODI0MDAgKSBWSUFHRU4xMl8yIE5FVyBNRVRBTDEgMTIwIAotKyBTSEFQRSBDT1JFV0lSRSAoIDI3MDAgMjgyNDAwICkgKCAyNzAgMjgyNDAwICkgVklBR0VOMTJfMyBORVcgTTEgCi0xMjAgKyBTSEFQRSBCTE9DS1dJUkUgKCAyODAwIDI4MjQwMCApICggMjgwIDI4MjQwMCApIENVU1RPTVZJQSAKLVZJQUdFTjEyXzEgTkVXIE0xIDEyMCArIFNIQVBFIEZJTExXSVJFICggMjkwMCAyODI0MDAgKSAKLSggMjkwIDI4MjQwMCApIFZJQUdFTjEyXzQgTkVXIE0xIDEyMCArIFNIQVBFIEZJTExXSVJFT1BDIAotKCAyOTAwIDI4MjQwMCApIFZJQUdFTjEyXzQgTkVXIE0xIDEyMCArIFNIQVBFIEJMT0NLQUdFV0lSRSAKLSggMjAwMCAyODI0MDAgKSAoIDIwMCAyODI0MDAgKSBWSUFHRU4xMiBORVcgTTEgMTIwIAotKyBTSEFQRSBCTE9DS1JJTkcgKCAyMTAwIDI4MjQwMCApICggMjEwIDI4MjQwMCApIE5FVyBNMSAxMjAgCi0rIFNIQVBFIFBBRFJJTkcgKCAyMjAwIDI4MjQwMCApICggMjIwIDI4MjQwMCApIE5FVyBNMSAyMDAgCi0oIDMwMDAgMzAwMCApIFRVUk5NMV8xIE5FVyBNMiAyMDAgKCAzMTAwIDMxMDAgKSAKLSggMzIwMCAzMTAwICkgVFVSTk0yXzEgTkVXIE0yIDIwMCAoIDMzMDAgMzMwMCApIAotKCAzNDAwIDMzMDAgKSBUVVJOTTJfMSAoIDM0MDAgMzYwMCApIE5FVyBNMiAyMDAgCi0oIDQwMCA0MDAgKSBNMV9NMiAoIDQwMCA0MDAgKSBORVcgTTIgMjAwIAotKCA1MDAgNTAwICkgTTFfTTIgKCA1MDAgNTAwICkgTTFfTTIgTkVXIE0yIAotMjAwICggNzAwIDcwMCApIE0xX00yICggNzAwIDcwMCApICggNzAwIDgwMCApIAotTkVXIE0yIDE1MDAwICsgU1RZTEUgOSAoIDEwNTAwMCAxMDUwMDAgKSAoIDUwMDAwIDUwMDAwICkgCi1ORVcgTTIgMTUwMDAgKyBTVFlMRSA4ICggMTA1MDAwIDE1NTAwMCApICggMTA1MDAwIDEwNTAwMCApIAotCi0gICsgQ09WRVIgTUVUQUwxIDEwMCAoIDEwMCAxMDAgKSAoIDEwMCAyMDAgKSAKLQotICArIEZJWEVEIE0xIDEwMCAoIDIwMCAyMDAgKSAoIDMwMCAyMDAgKSAKLQotICArIFJPVVRFRCBNMSAxMjAgKyBTSEFQRSBEUkNGSUxMICggODAwMCA4MDAwICkgCi0oIDgwMDAgODIwMCApICggODQwMCA4MjAwICkgCi0KLSAgKyBTSElFTEQgTjEgTTIgOTAgKCAxNDEwMCAzNDA0NDAgKSAoIDgxNjAgMzQwNDQwICkgCi1NMV9NMiAoIDgxNjAgMzAxNjAwICkgTTFfTTIgRk4gRE8gMiBCWSAyIFNURVAgMjAwIDIwMCAKLSggMjQwMCAzMDE2MDAgKSAKLSAgKyBQUk9QRVJUWSBzdHJwcm9wIGFTdHJpbmcgU1RSSU5HIAotICArIFBST1BFUlRZIGludHByb3AgMSBJTlRFR0VSIAotICArIFBST1BFUlRZIHJlYWxwcm9wIDEuMSBSRUFMIAotICArIFBST1BFUlRZIGludHJhbmdlcHJvcCAyNSBJTlRFR0VSIAotICArIFBST1BFUlRZIHJlYWxyYW5nZXByb3AgMjUuMjUgUkVBTCAKLQotICArIEZJWEVEQlVNUCAKLSAgKyBWT0xUQUdFIDMyMDAgCi0gICsgV0VJR0hUIDMwIAotICArIFNPVVJDRSBORVRMSVNUIAotICArIFBBVFRFUk4gU1RFSU5FUiAKLSAgKyBPUklHSU5BTCBWREQgCi0gICsgVVNFIFNJR05BTCA7Ci0tIFZERCBQYXJzZWQgNzAwIG51bWJlciBvZiBsaW5lcyEhCi0KLSAgKyBST1VURUQgTTEgMjAgKCAxMCAwICkgTUFTSyAzIAotKCAxMCAyMCApIFZJQUdFTjEyXzQgTkVXIE0yIDEwMCAoIDEwIDEwICkgCi0oIDIwIDEwICkgTUFTSyAxICggMjAgMjAgKSBNQVNLIDAzMSBWSUFHRU4xMl8zIAotCi0gICsgUk9VVEVEIE0xIDEwMCAoIDAgMCAxMDAgKSAoIDAgMCA1MCApIAotKCAxMDAgMCA1MCApIE0xX00yICggMTAwIDEwMCA1MCApIAotCi0gICsgUk9VVEVEIE0xIDUwICsgU1RZTEUgMCAoIDAgMCApIAotKCAxNTAgMTUwICkgCi0KLSAgKyBST1VURUQgTTEgNTAgKyBTVFlMRSAwICggMTUwIDE1MCApIAotKCAwIDAgKSAKLQotICArIFJPVVRFRCBNMSA1MCArIFNUWUxFIDAgKCAxNTAgMCApIAotKCAwIDE1MCApIAotCi0gICsgUk9VVEVEIE0xIDUwICsgU1RZTEUgMCAoIDAgMTUwICkgCi0oIDE1MCAwICkgCi0KLSAgKyBST1VURUQgTTEgNTAgKyBTVFlMRSAxICggMTUwIDE1MCApIAotKCAzMDAgMCApICggNDAwIDAgKSAKLQotICArIFJPVVRFRCBNMiAxMDAgKyBTSEFQRSBSSU5HICsgU1RZTEUgMCAKLSggMCAwICkgKCAxMDAgMTAwICkgKCAyMDAgMTAwICkgCi0KLSAgKyBST1VURUQgTTEgMTAwICsgU1RZTEUgMiAoIDAgMCApIAotTTFfTTIgKCA2MDAgMCApIE0xX00yIAotCi0gICsgUk9VVEVEIE0xIDUwICggMTUwIDE1MCApICggMzAwIDMwMCApIAotCi0gICsgRklYRUQgCi0gICsgU0hBUEUgUklORyAKLSAgKyBNQVNLIDIgKyBQT0xZR09OIE1FVEFMMSAwIDAgMCAxMDAgMTAwIDEwMCAyMDAgMjAwIDIwMCAwIAotICArIENPVkVSIAotICArIFNIQVBFIFJJTkcgCi0gICsgTUFTSyAzICsgUE9MWUdPTiBNMiAxMDAgMTAwIDEwMCAyMDAgMjAwIDIwMCAzMDAgMzAwIDMwMCAxMDAgCi0gICsgRklYRUQgCi0gICsgU0hBUEUgUklORyAKLSAgKyBSRUNUIE0zIDAgMCAxMCAxMAotICArIFNISUVMRCAKLSAgKyBOMSAKLSAgKyBTSEFQRSBCTE9DS1JJTkcgCi0gICsgUkVDVCBNMyAwIDAgMTAgMTAKLSAgKyBST1VURUQgCi0gICsgVklBIE0xX00yICBOIDI0MDAgMCAxMCAxMDsKLQotICArIFJPVVRFRCAKLSAgKyBTSEFQRSBTVFJJUEUgCi0gICsgVklBIFZJQTEyXzIgIE4gMzAgMzAgNDAgNDA7Ci0KLSAgKyBWT0xUQUdFIDUwMDAgOwotLSBTTjIgCi0gICsgUk9VVEVEIE0yIDEwMCArIFNUWUxFIDMgKCAwIDAgKSAKLSggMTUwIDE1MCApICggMzAwIDAgKSBORVcgTTIgMTAwICggMzAwIDAgKSAKLSggNDAwIDAgKSAKLQotICArIFJPVVRFRCBNMSAxMDAgKCAwIDAgKSAoIDE1MCAxNTAgKSAKLSggMzAwIDAgKSAoIDQwMCAwICkgCi0KLSAgKyBST1VURUQgTTEgNDAwMCArIFNUWUxFIDUgKCAwIDAgKSAKLSggMTAwMCAwICkgCi0KLSAgKyBST1VURUQgTTEgNDAwMCArIFNUWUxFIDYgKCAwIDAgKSAKLSggMTAwMCAxMDAwICkgCi0KLSAgKyBST1VURUQgTTEgMTAwMCArIFNUWUxFIDcgKCAwIDAgKSAKLSggMCAwICkgCi07Ci0tIFNOMyAKLSAgKyBST1VURUQgTTIgMTAwICggMTAwIDAgKSAoIDEwMCAzMDAwICkgCi1ORVcgTTMgMTAwICggMCAxMDAwICkgKCAzMDAwIDEwMDAgKSAKLQotICArIFNISUVMRCBOMSBNMiA0MCArIFNIQVBFIEZJTExXSVJFICggMzAwIDgwICkgCi0oIDMwMCAxOTIwICkgTkVXIE0yIDQwICsgU0hBUEUgRklMTFdJUkUgKCA1MDAgODAgKSAKLSggNTAwIDE5MjAgKSAKLQotICArIFVTRSBHUk9VTkQgOwotLSBEVU1NWSAKLSAgKyBST1VURUQgTTEgMTAwICsgU0hBUEUgRklMTFdJUkUgKCAwIDAgKSAKLSggMTAwIDAgKSAKLTsKLUVORCBTUEVDSUFMTkVUUwotLSBEVU1NWTIgCi0gICsgUk9VVEVEIE0yIDEwMCArIFNIQVBFIEZJTExXSVJFT1BDICggMCAwICkgCi0oIDEwMCAwICkgCi07Ci1FTkQgU1BFQ0lBTE5FVFMKLVBhcnNlZCA3NTAgbnVtYmVyIG9mIGxpbmVzISEKLQotTkVUUyA2IDsKLS0gU0NBTiAoIHNjYW5jZWxsMSBQQTEwICkgKyBTWU5USEVTSVpFRCAoIHNjYW5jZWxsMiBQQTIgKSArIFNZTlRIRVNJWkVEICsgU09VUkNFIFRFU1QgOwotLSBOMSAgICArIFNVQk5FVCBDQksgTjFfU1VCMCBQYXJzZWQgODAwIG51bWJlciBvZiBsaW5lcyEhCi0gICArIE5PTkRFRkFVTFRSVUxFIENCSyBSVUxFMSAoIEkxIEEgKSAoIFBJTiBQMCApICsgTk9OREVGQVVMVFJVTEUgUlVMRTEKLSAgKyBOMV9WUDAgTTMgLTMzMyAtMzMzIDMzMyAzMzMgUCAxODk1NjAgMjczMDAgTgotICArIE4xX1ZQMSBNMyAtMzMzIC0zMzMgMzMzIDMzMyBQIDE4OTU2MCAyNzMwMCBTCi0gICsgTjFfVlAyIE0zIC0zMzMgLTMzMyAzMzMgMzMzIFAgMTg5NTYwIDI3MzAwIEUKLSAgKyBOMV9WUDMgTTMgLTMzMyAtMzMzIDMzMyAzMzMgUCAxODk1NjAgMjczMDAgVwotICArIE4xX1ZQNCBNMyAtMzMzIC0zMzMgMzMzIDMzMyBQIDE4OTU2MCAyNzMwMCBGTgotICArIE4xX1ZQNSBNMyAtMzMzIC0zMzMgMzMzIDMzMyBQIDE4OTU2MCAyNzMwMCBGUwotICArIE4xX1ZQNiBNMyAtMzMzIC0zMzMgMzMzIDMzMyBQIDE4OTU2MCAyNzMwMCBGRQotICArIE4xX1ZQNyBNMyAtMzMzIC0zMzMgMzMzIDMzMyBQIDE4OTU2MCAyNzMwMCBGVwotICArIE4xX1ZQOCAtMzMzIC0zMzMgMzMzIDMzMwotCi0gICsgRklYRUQgTTMgKCAxMCAwICkgTUFTSyAzICggMTAgMjAgKSAKLU1BU0sgMDMxIE0xX00yIAotCi0gICsgUk9VVEVEIE0xICggMCAwICkgKCA1IDAgKSBWSVJUVUFMICggMiAzICkgCi1NQVNLIDEgKCA3IDcgKSAKLQotICArIFJPVVRFRCBNMSAoIDAgMCApICggNSAwICkgVklSVFVBTCAoIDIgMyApIAotUkVDVCAoIDEgMiAzIDQgKSAoIDcgNyApIAotCi0gICsgRklYRUQgTTEgKCAwIDAgKSAoIDUgMCApICggNyA3ICkgCi0KLSAgKyBGSVhFRCBNMSAoIDAgMCApICggNSAwICkgTUFTSyAzIAotUkVDVCAoIDEgMiAzIDQgKSAoIDcgNyApIAotCi0gICsgTk9TSElFTEQgTTIgKCAxNDEwMCAzNDE0NDAgKSAoIDE0MDAwIDM0MTQ0MCApIE0xX00yIAotCi0gICsgUk9VVEVEIE0yICggMTQwMDAgMzQxNDQwICkgKCA5NjAwIDM0MTQ0MCApICggOTYwMCAyODI0MDAgKSAKLW5kMVZJQTEyICggMjQwMCAyODI0MDAgKSBUVVJOTTFfMSBORVcgTTEgVEFQRVIgCi0oIDI0MDAgMjgyNDAwICkgKCAyNDAgMjgyNDAwICkgCi0KLSAgKyBTSElFTERORVQgU04xCi0gICsgU0hJRUxETkVUIFZERAotICArIFNVQk5FVCBOMV9TVUIwICAoIEkyIEEgKQotICggUElOIFAxICkKLSAoIFZQSU4gTjFfVlA5ICkKLSAgUk9VVEVEIE0xICggMTY4MjgwIDYzMzAwIDcwMCApICggMTY4MjgwIDY0NTAwICkgTTFfTTIgCi0oIDE2OTQwMCA2NDUwMCA4MDAgKSBNMl9NMyAgICsgUFJPUEVSVFkgc3RycHJvcCBhU3RyaW5nIFNUUklORyAKLSAgKyBQUk9QRVJUWSBpbnRwcm9wIDEgSU5URUdFUiAKLSAgKyBQUk9QRVJUWSByZWFscHJvcCAxLjEgUkVBTCAKLSAgKyBQUk9QRVJUWSBpbnRyYW5nZXByb3AgMjUgSU5URUdFUiAKLSAgKyBQUk9QRVJUWSByZWFscmFuZ2Vwcm9wIDI1LjI1IFJFQUwgCi0rIFdFSUdIVCAxMDAgKyBFU1RDQVAgMS41ZSswNiArIFNPVVJDRSBORVRMSVNUICsgRklYRURCVU1QICsgRlJFUVVFTkNZIDEwMCArIFBBVFRFUk4gU1RFSU5FUiArIE9SSUdJTkFMIE4yICsgVVNFIFNJR05BTCA7Ci0tIE4yICggSTMgQSApICggUElOIFAyICkgCi0gICsgRklYRUQgTTIgKCAxNDAwMCAzNDE0NDAgKSAoIDk2MDAgMzQxNDQwICkgKCA5NjAwIDI4MjQwMCApIAotTTFfTTIgKCAyNDAwIDI4MjQwMCApIE5FVyBNMSBUQVBFUlJVTEUgUlVMRTEgKCAyNDAwIDI4MjQwMCApIAotKCAyNDAgMjgyNDAwICkgCi0rIFdFSUdIVCA1MDAgKyBTT1VSQ0UgRElTVCArIFBBVFRFUk4gQkFMQU5DRUQgOwotLSBOMyAoIEk0IEEgKSAoIFBJTiBQMyApIAotICArIENPVkVSIE0yICggMTQwMDAgMzQxNDQwICkgKCA5NjAwIDM0MTQ0MCApICggOTYwMCAyODI0MDAgKSAKLU0xX00yICggMjQwMCAyODI0MDAgKSBWSUFHRU4xMl8wIE4gTkVXIE0xIAotKCAyNDAwIDI4MjQwMCApICggMjQwIDI4MjQwMCApIE5FVyBNMiAoIDQwMCA0MDAgKSBNMV9NMiAKLU4gKCA0MDAgNDAwICkgTkVXIE0yICggNTAwIDUwMCApIE0xX00yIAotKCA1MDAgNTAwICkgTTFfTTIgTkVXIE0yICggNjAwIDYwMCAxMCApIE0xX00yIAotUyAoIDYwMCA2MDAgMzAgKSAoIDYwMCA4MDAgKSBORVcgTTIgKCA3MDAgNzAwICkgCi1NMV9NMiAoIDcwMCA3MDAgKSAoIDcwMCA4MDAgKSBORVcgTTEgKCAwIDAgKSAKLU0xX00yIEZTIE0yX00zIE5FVyBNMyAoIDAgMCApIAotTTJfTTMgVyBNMV9NMiBORVcgTTEgKCAxMCAxMCApIAotKCAyMCAxMCApIE1BU0sgMSAoIDIwIDIwICkgTUFTSyAwMzEgVklBMV8yIAotKyBTT1VSQ0UgVVNFUiArIFBBVFRFUk4gVFJVTksgOwotLSBONCAoIEk1IEEgKSAoIFBJTiBQNCApIAotICArIFJPVVRFRCBNMiBTVFlMRSAxICggMCAwICkgKCAxNTAgMTUwICkgCi0oIDMwMCAwICkgKCA0MDAgMCApIAotCi0gICsgUk9VVEVEIE0xICggMTUwIDE1MCApIE1BU0sgMyAoIDMwMCAzMDAgKSAKLU1BU0sgMDMyIFZJQUdFTjEyIAotCi0gICsgTk9TSElFTEQgTTEgKCAxNTAgMTUwIDMwICkgKCAxNTAgMzAwIDMwICkgCi0KLSAgKyBST1VURUQgTTEgU1RZTEUgMCAoIDAgMCApICggMTUwIDE1MCApIAotTkVXIE0xIFNUWUxFIDEgKCAxNTAgMTUwICkgTUFTSyAyICggMzAwIDAgKSAKLSggNDAwIDAgKSAKLSsgU09VUkNFIFRFU1QgKyBVU0UgR1JPVU5EIDsKLS0gTjUgKCBJNiBBICkgKCBQSU4gUDUgKSAKLSAgKyBST1VURUQgTTIgU1RZTEUgMyAoIDAgMTAwMCApICggMTUwIDExNTAgKSAKLSggMzAwIDEwMDAgKSAoIDQwMCAxMDAwICkgCi0KLSAgKyBST1VURUQgTTEgKCAwIDEwMDAgKSAoIDE1MCAxMTUwICkgKCAzMDAgMTAwMCApIAotKCA0MDAgMTAwMCApIAotKyBTT1VSQ0UgVElNSU5HIDsKLUVORCBORVRTCi1QYXJzZWQgODUwIG51bWJlciBvZiBsaW5lcyEhCi0tIE42ICAgICsgTk9OREVGQVVMVFJVTEUgQ0JLIFJVTEUyICsgTk9OREVGQVVMVFJVTEUgUlVMRTIKLQotICArIFJPVVRFRCBNMSBTVFlMRSA0ICggMTAwMCAwICkgKCAxMTAwIDEwMCApIAotCi0gICsgUk9VVEVEIE0xIFNUWUxFIDQgKCAxMjAwIDEwMCApICggMTMwMCAwICkgCi0KLSAgKyBST1VURUQgTTEgU1RZTEUgNCAoIDEwMDAgLTEwMCApICggMTMwMCAtMTAwICkgCi07Ci1FTkQgTkVUUwotLSBTQ0FOICggc2NhbmNlbGwxIFBBMTAgKSArIFNZTlRIRVNJWkVEICggc2NhbmNlbGwyIFBBMiApICsgU1lOVEhFU0laRUQgKyBTT1VSQ0UgVEVTVCA7Ci1FTkQgTkVUUwotLSBNVVNUSk9JTl8xICggSTcgQSApIDsKLUVORCBORVRTCi0tIEFSUkFZTkVUWzBdWzEwXSA7Ci1FTkQgTkVUUwotLSB2ZWN0b3Jtb2R1bGVbMV0vdmVjdG9ybmV0WzBdIDsKLUVORCBORVRTCi0tIHZlY3Rvcm1vZHVsZVsxXS9zY2FsYXJuZXQgOwotRU5EIE5FVFMKLQotU0NBTkNIQUlOUyAyIDsKLS0gY2hhaW4xCi0gICsgU1RBUlQgSTEgQgotICArIFNUT1AgSTQgQgotICArIENPTU1PTlNDQU5QSU5TICAoIElOIFBBMSApICAoIE9VVCBQQTIgKSAKLSAgKyBGTE9BVElORwotICAgIHNjYW5jZWxsMyAoIElOIFBBMiApIAotICAgIHNjYW5jZWxsNCAoIE9VVCBQQTEwICkgKCBCSVRTIDQgKSAKLSAgKyBPUkRFUkVECi0gICAgc2NhbmNlbGwxICggSU4gUEEyICkgCi0gICAgc2NhbmNlbGwyICggT1VUIFBBMTAgKSAoIEJJVFMgNCApIAotICArIFBBUlRJVElPTiBjbG9jazEgTUFYQklUUyAyNTYgOwotUGFyc2VkIDkwMCBudW1iZXIgb2YgbGluZXMhIQotLSBjaGFpbjIKLSAgKyBTVEFSVCBQSU4gc2NhbnBpbgotICArIFNUT1AgUElOIHNjYW5waW4yCi0gICsgQ09NTU9OU0NBTlBJTlMgICggSU4gUEExICkgICggT1VUIFBBMiApIAotICArIEZMT0FUSU5HCi0gICAgc2NhbmNlbGw3ICggSU4gUEEyICkgCi0gICAgc2NhbmNlbGw4ICggT1VUIFBBMTAgKSAoIEJJVFMgNCApIAotICArIE9SREVSRUQKLSAgICBzY2FuY2VsbDUgKCBJTiBQQTIgKSAKLSAgICBzY2FuY2VsbDYgKCBPVVQgUEExMCApICggQklUUyA0ICkgCi0gICsgUEFSVElUSU9OIGNsb2NrMSBNQVhCSVRTIDI1NiA7Ci1FTkQgU0NBTkNIQUlOUwotLSBjaGFpbjMKLSAgKyBTVEFSVCBJNSBCCi0gICsgU1RPUCBJNiBCCi0gICsgQ09NTU9OU0NBTlBJTlMgICggSU4gUEExICkgICggT1VUIFBBMiApIAotICArIEZMT0FUSU5HCi0gICAgc2NhbmNlbGwxMSAoIElOIFBBMiApIAotICAgIHNjYW5jZWxsMTIgKCBPVVQgUEExMCApICggQklUUyA0ICkgCi0gICsgT1JERVJFRAotICAgIHNjYW5jZWxsOSAoIElOIFBBMiApIAotICAgIHNjYW5jZWxsMTAgKCBPVVQgUEExMCApICggQklUUyA0ICkgCi0gICsgUEFSVElUSU9OIGNsb2NrMSBNQVhCSVRTIDI1NiA7Ci1FTkQgU0NBTkNIQUlOUwotCi1HUk9VUFMgMyA7Ci0tIGdyb3VwMSBJMyBJMgotICArIFJFR0lPTiByZWdpb24xIAotICArIFBST1BFUlRZIHN0cnByb3AgYVN0cmluZyBTVFJJTkcgCi0gICsgUFJPUEVSVFkgaW50cHJvcCAxIElOVEVHRVIgCi0gICsgUFJPUEVSVFkgcmVhbHByb3AgMS4xIFJFQUwgCi0gICsgUFJPUEVSVFkgaW50cmFuZ2Vwcm9wIDI1IElOVEVHRVIgCi0gICsgUFJPUEVSVFkgcmVhbHJhbmdlcHJvcCAyNS4yNSBSRUFMICA7Ci0tIGdyb3VwMiBJNCA7Ci0tIHJlZ2lvbjIgSTcgSTgKLSAgKyBSRUdJT04gcmVnaW9uMiAgOwotRU5EIEdST1VQUwotUGFyc2VkIDk1MCBudW1iZXIgb2YgbGluZXMhIQotCi1TTE9UUyAzIDsKLS0gTEFZRVIgTTEKLSAgIFJFQ1QgMyAzIDYgOAotOwotLSBMQVlFUiBNMgotICAgUkVDVCAzIDMgNiA4Ci0gICBQT0xZR09OIDAgMCAwIDEwIDEwIDEwIDEwIDIwIDIwIDIwIDIwIDAgOwotOwotLSBMQVlFUiBNMwotICAgUkVDVCAzIDMgNiA4Ci07Ci1FTkQgU0xPVFMKLQotRklMTFMgNSA7Ci0tIFZJQSBteXZpYTEgKyBNQVNLIDAwMiArIE9QQwotIDUwMDAgNTAwMCA4MDAgODAwOwotOwotLSBMQVlFUiBNMSArIE1BU0sgMgotICAgUkVDVCAwIDIgMSAxMAotOwotLSBMQVlFUiBNMiArIE9QQwotICAgUkVDVCAwIDIgMSAxMAotICAgUE9MWUdPTiAwIDAgMCAxMCAxMCAxMCAxMCAyMCAyMCAyMCAyMCAwIDsKLTsKLS0gTEFZRVIgTTMKLSAgIFJFQ1QgMCAyIDEgMTAKLTsKLS0gVklBIE0xX00yICsgTUFTSyAyMDIgKyBPUEMKLSAyNDAwIDAgMTAgMTA7Ci07Ci1FTkQgRklMTFMKLS0gVklBIFZJQUdFTjEyXzAgKyBPUEMKLSAxMDAgMTAwIDIwMCAxMDA7Ci07Ci1FTkQgRklMTFMKLVBhcnNlZCAxMDAwIG51bWJlciBvZiBsaW5lcyEhCi1CRUdJTkVYVCAgInRhZyIKLS0gQ1JFQVRPUiAiQ2FkZW5jZSIgOwotLSBPVFRFUiBmdXJyeQotICArIFBST1BFUlRZIGFycmcgbGF0ZXIKLSAgOwotLSBTRUFMIGNvdXNpbiB0byBXQUxSVVMgOwotRU5ERVhUCi1FTkQgREVTSUdOCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZNc2dUYWJsZS5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYvZGVmTXNnVGFibGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRlYjUzNC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZNc2dUYWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLQotLyoKLSAqIGVtc01rRXJyb3I6Ci0qLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJlbXMuaCIKLQotI2lmZGVmIFRTSVpFCi0jdW5kZWYgVFNJWkUKLSNkZWZpbmUgVFNJWkUgMjA0OAotI2VuZGlmCi0KLWVtc0Vycm9yX3QgREVGRW1zTXNnVGFibGVbXSA9Ci17Ci0gICAgezUwMDAgICAsIEVNU19OT05FLCAiVGhlICdkZWZyUmVhZCcgZnVuY3Rpb24gaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgJ2RlZnJJbml0JyBmdW5jdGlvbi5cblRoZSAnZGVmckluaXQnIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgcHJpb3IgdG8gdGhlICdkZWZyUmVhZCcgZnVuY3Rpb24uIiwgLTEsIDB9LAotICAgIHs1MDAxICAgLCBFTVNfTk9ORSwgIkRFRiBzdGF0ZW1lbnQgZm91bmQgaW4gdGhlIGRlZiBmaWxlIHdpdGggbm8gY2FsbGJhY2sgc2V0LiIsIC0xLCAwfSwKLSAgICB7NjAwMCAgICwgRU1TX05PTkUsICJUaGUgc3ludGF4IGZvciBhbiBBTElBUyBzdGF0ZW1lbnQgaXMgXCImQUxJQVMgYWxpYXNOYW1lID0gYWxpYXNEZWZpbml0aW9uICZFTkRBTElBU1wiLiAnPScgaXMgbWlzc2luZyBhZnRlciB0aGUgYWxpYXNOYW1lLiIsIC0xLCAwfSwKLSAgICB7NjAwMSAgICwgRU1TX05PTkUsICJFbmQgb2YgZmlsZSBpcyByZWFjaGVkIHdoaWxlIHBhcnNpbmcgaW4gdGhlIG1pZGRsZSBvZiBhbiBBTElBUyBzdGF0ZW1lbnQuXG5SZXZpZXcgeW91IGRlZiBmaWxlIGFuZCBhZGQgJyZFTkRBTElBUycgaW4gdGhlIEFMSUFTIHN0YXRlbWVudC4iLCAtMSwgMH0sCi0gICAgezYwMDIgICAsIEVNU19OT05FLCAiVGhlIGRlZiBmaWxlIGlzIGluY29tcGxldGUuIiwgLTEsIDB9LAotICAgIHs2MDAzICAgLCBFTVNfTk9ORSwgIlRoZSBCRUdJTkVYVCB0YWcgaXMgbWlzc2luZyBpbiB0aGUgREVGIGZpbGUuIEluY2x1ZGUgdGhlIHRhZyBhbmQgdGhlbiB0cnkgYWdhaW4uIiwgLTEsIDB9LAotICAgIHs2MDA0ICAgLCBFTVNfTk9ORSwgIlRoZSBCRUdJTkVYVCB0YWcgaXMgZW1wdHkuIFNwZWNpZnkgYSB2YWx1ZSBmb3IgdGhlIHRhZyBhbmQgdHJ5IGFnYWluLiIsIC0xLCAwfSwKLSAgICB7NjAwNSAgICwgRU1TX05PTkUsICJUaGUgJ1wiJyBpcyBtaXNzaW5nIHdpdGhpbiB0aGUgdGFnLiBTcGVjaWZ5IHRoZSAnXCInIGluIHRoZSB0YWcgYW5kIHRoZW4gdHJ5IGFnYWluLiIsIC0xLCAwfSwKLSAgICB7NjAwNiAgICwgRU1TX05PTkUsICJUaGUgZW5kaW5nICdcIicgaXMgbWlzc2luZyBpbiB0aGUgdGFnLiBTcGVjaWZ5IHRoZSBlbmRpbmcgJ1wiJyBpbiB0aGUgdGFnIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLCAtMSwgMH0sCi0gICAgezYwMDcgICAsIEVNU19OT05FLCAiVGhlIEVOREVYVCBzdGF0ZW1lbnQgaXMgbWlzc2luZyBpbiB0aGUgREVGIGZpbGUuIEluY2x1ZGUgdGhlIHN0YXRlbWVudCBhbmQgdGhlbiB0cnkgYWdhaW4uIiwgLTEsIDB9LAotICAgIHs2MDA4ICAgLCBFTVNfTk9ORSwgIkludmFsaWQgY2hhcmFjdGVycyBmb3VuZCBpbiBcJyVzXCcuXG5UaGVzZSBjaGFyYWN0ZXJzIG1pZ2h0IGJlIHVzaW5nIHRoZSBjaGFyYWN0ZXIgdHlwZXMgb3RoZXIgdGhhbiBFbmdsaXNoLlxuQ3JlYXRlIGNoYXJhY3RlcnMgYnkgc3BlY2lmeWluZyB2YWxpZCBjaGFyYWN0ZXJzIHR5cGVzLiIsIC0xLCAwfSwKLSAgICB7NjAxMCAgICwgRU1TX05PTkUsICJBbiBlcnJvciBoYXMgYmVlbiByZXBvcnRlZCBpbiBjYWxsYmFjay4iLCAtMSwgMH0sCi0gICAgezYwMTEgICAsIEVNU19OT05FLCAiVG9vIG1hbnkgc3ludGF4IGVycm9ycyBoYXZlIGJlZW4gcmVwb3J0ZWQuIiwgLTEsIDB9LAotICAgIHs2MDMwICAgLCBFTVNfTk9ORSwgIkludmFsaWQgZGlyZWN0aW9uIHNwZWNpZmllZCB3aXRoIEZQQyBuYW1lLiBUaGUgdmFsaWQgZGlyZWN0aW9uIGlzIGVpdGhlciAnSCcgb3IgJ1YnLiBTcGVjaWZ5IGEgdmFsaWQgdmFsZSBhbmQgdGhlbiB0cnkgYWdhaW4uIiwgLTEsIDB9LAotICAgIHs2MDYwICAgLCBFTVNfTk9ORSwgIkludmFsaWQgdmFsdWUgc3BlY2lmaWVkIGZvciBJT1RJTUlORyByaXNlL2ZhbGwuIFRoZSB2YWxpZCB2YWx1ZSBmb3IgcmlzZSBpcyAnUicgYW5kIGZvciBmYWxsIGlzICdGJy4gU3BlY2lmeSBhIHZhbGlkIHZhbHVlIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLCAtMSwgMH0sCi0gICAgezYwODAgICAsIEVNU19OT05FLCAiQW4gaW50ZXJuYWwgZXJyb3IgaGFzIG9jY3VycmVkLiBUaGUgaW5kZXggbnVtYmVyIGZvciB0aGUgU1VCTkVUIHdpcmVzIGFycmF5IGlzIGxlc3MgdGhlbiBvciBlcXVhbCB0byAwLlxuQ29udGFjdCBDYWRlbmNlIEN1c3RvbWVyIFN1cHBvcnQgd2l0aCB0aGlzIGVycm9yIGluZm9ybWF0aW9uLiIsIC0xLCAwfSwKLSAgICB7NjA4MSAgICwgRU1TX05PTkUsICJBbiBpbnRlcm5hbCBlcnJvciBoYXMgb2NjdXJyZWQuIFRoZSBpbmRleCBudW1iZXIgZm9yIHRoZSBORVQgUEFUSCB3aXJlcyBhcnJheSBpcyBsZXNzIHRoZW4gb3IgZXF1YWwgdG8gMC5cbkNvbnRhY3QgQ2FkZW5jZSBDdXN0b21lciBTdXBwb3J0IHdpdGggdGhpcyBlcnJvciBpbmZvcm1hdGlvbi4iLCAtMSwgMH0sCi0gICAgezYwODIgICAsIEVNU19OT05FLCAiQW4gaW50ZXJuYWwgZXJyb3IgaGFzIG9jY3VycmVkLiBUaGUgaW5kZXggbnVtYmVyIGZvciB0aGUgTkVUIFNISUVMRFBBVEggd2lyZXMgYXJyYXkgaXMgbGVzcyB0aGVuIG9yIGVxdWFsIHRvIDAuXG5Db250YWN0IENhZGVuY2UgQ3VzdG9tZXIgU3VwcG9ydCB3aXRoIHRoaXMgZXJyb3IgaW5mb3JtYXRpb24uIiwgLTEsIDB9LAotICAgIHs2MDgzICAgLCBFTVNfTk9ORSwgIlRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgTkVUIElOU1RBTkNFIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIsIC0xLCAwfSwKLSAgICB7NjA4NCAgICwgRU1TX05PTkUsICJUaGUgaW5kZXggbnVtYmVyICVkIHNwZWNpZmllZCBmb3IgdGhlIE5FVCBQSU4gaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwgLTEsIDB9LAotICAgIHs2MDg1ICAgLCBFTVNfTk9ORSwgIlRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgTkVUIFBPTFlHT04gaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwgLTEsIDB9LAotICAgIHs2MDg2ICAgLCBFTVNfTk9ORSwgIlRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgTkVUIFJFQ1RBTkdMRSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiBTcGVjaWZ5IGEgdmFsaWQgaW5kZXggbnVtYmVyIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLCAtMSwgMH0sCi0gICAgezYwOTAgICAsIEVNU19OT05FLCAiVGhlIGluZGV4IG51bWJlciAlZCBzcGVjaWZpZWQgZm9yIHRoZSBOT05ERUZBVUxUIExBWUVSIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIsIC0xLCAwfSwKLSAgICB7NjA5MSAgICwgRU1TX05PTkUsICJUaGUgaW5kZXggbnVtYmVyICVkIHNwZWNpZmllZCBmb3IgdGhlIE5PTkRFRkFVTFQgUFJPUEVSVFkgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwgLTEsIDB9LAotICAgIHs2MTAwICAgLCBFTVNfTk9ORSwgIlRoZSB2YWx1ZSBzcGVmaWZpZWQgZm9yIFBBUlRJVElPTiBTRVRVUCBpcyBpbnZhbGlkLiBUaGUgdmFsaWQgdmFsdWUgZm9yIFNFVFVQIGlzICdSJyBvciAnRicuIFNwZWNpZnkgYSB2YWxpZCB2YWx1ZSBmb3IgU0VUVVAgYW5kIHRoZW4gdHJ5IGFnYWluLiIsIC0xLCAwfSwKLSAgICB7NjEwMSAgICwgRU1TX05PTkUsICJUaGUgdmFsdWUgc3BlZmlmaWVkIGZvciBQQVJUSVRJT04gSE9MRCBpcyBpbnZhbGlkLiBUaGUgdmFsaWQgdmFsdWUgZm9yIEhPTEQgaXMgJ1InIG9yICdGJy4gU3BlY2lmeSBhIHZhbGlkIHZhbHVlIGZvciBIT0xEIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLCAtMSwgMH0sCi0gICAgezYxMjAgICAsIEVNU19OT05FLCAiVGhlIGluZGV4IG51bWJlciAlZCBzcGVjaWZpZWQgZm9yIHRoZSBQSU4gUFJPUEVSVFkgaXMgaW52YWxpZGUuXG5WYWxpZCBpbmRleCBudW1iZXIgaXMgZnJvbSAwIHRvICVkLiBTcGVjaWZ5IGEgdmFsaWQgaW5kZXggbnVtYmVyIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLCAtMSwgMH0sCi0gICAgezYxMzAgICAsIEVNU19OT05FLCAiVGhlIGluZGV4IG51bWJlciAlZCBzcGVjaWZpZWQgZm9yIHRoZSBSRUdJT04gUFJPUEVSVFkgaXMgaW52YWxpZGUuXG5WYWxpZCBpbmRleCBudW1iZXIgaXMgZnJvbSAwIHRvICVkLiBTcGVjaWZ5IGEgdmFsaWQgaW5kZXggbnVtYmVyIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLCAtMSwgMH0sCi0gICAgezYxMzEgICAsIEVNU19OT05FLCAiVGhlIGluZGV4IG51bWJlciAlZCBzcGVjaWZpZWQgZm9yIHRoZSBSRUdJT04gUkVDVEFOR0xFIGlzIGludmFsaWRlLlxuVmFsaWQgaW5kZXggbnVtYmVyIGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwgLTEsIDB9LAotICAgIHs2MTQwICAgLCBFTVNfTk9ORSwgIlRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgVklBIExBWUVSIFJFQ1RBTkdMRSBpcyBpbnZhbGlkZS5cblZhbGlkIGluZGV4IG51bWJlciBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIsIC0xLCAwfSwKLSAgICB7NjE1MCAgICwgRU1TX05PTkUsICJUaGUgU1RBUlQgc3RhdGVtZW50IGluIHRoZSBTQ0FOQ0hBSU5TIGhhcyBkZWZpbmVkIG1vcmUgdGhhbiBvbmUgdGltZSBpbiB0aGUgU0NBTkNIQUlOUyBzdGF0ZW1lbnQuXG5VcGRhdGUgdGhlIERFRiBmaWxlIHRvIG9ubHkgb25lIFNUQVJUIHN0YXRlbWVudCBhbmQgdGhlbiB0cnkgYWdhaW4uIiwgLTEsIDB9LAotICAgIHs2MTUxICAgLCBFTVNfTk9ORSwgIlRoZSBTVE9QIHN0YXRtZW50IGluIHRoZSBTQ0FOQ0hBSU5TIGhhcyBkZWZpbmVkIG1vcmUgdGhhbiBvbmUgdGltZSBpbiB0aGUgU0NBTkNIQUlOUyBzdGF0ZW1lbnQuXG5VcGRhdGUgdGhlIERFRiBmaWxlIHRvIG9ubHkgb25lIFNUT1Agc3RhdGVtZW50IGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLCAtMSwgMH0sCi0gICAgezYxNjAgICAsIEVNU19OT05FLCAiVGhlIGluZGV4IG51bWJlciAlZCBzcGVjaWZpZWQgZm9yIHRoZSBTTE9UIFJFQ1RBTkdMRSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggbnVtYmVyIGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwgLTEsIDB9LAotICAgIHs2MTcwICAgLCBFTVNfTk9ORSwgIlRoZSBUaW1pbmdEaXNhYmxlIHR5cGUgaXMgaW52YWxpZC4gVGhlIHZhbGlkIHR5cGVzIGFyZSBGUk9NUElOLCAmIFRIUlVQSU4uIFNwZWNpZnkgdGhlIHZhbGlkIHR5cGUgYW5kIHRoZW4gdHJ5IGFnYWluLiIsIC0xLCAwfSwKLSAgICB7NjE4MCAgICwgRU1TX05PTkUsICJUaGUgaW5kZXggbnVtYmVyICVkIHNwZWNpZmllZCBmb3IgdGhlIFZJQSBQT0xZR09OIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluIiwgLTEsIDB9LAotICAgIHs2MjAwICAgLCBFTVNfTk9ORSwgIlRoZSBBU1NFUlRJT04gc3RhdGVtZW50IGlzIGludmFsaWQgYmVjYXVzZSBpdCBoYXMgYW4gaW52YWxpZCBvcGVyYW5kIHJ1bGUuXG5WYWxpZCBvcGVyYW5kIHJ1bGUgaXMgZWl0aGVyIE5FVCBvciBQQVRILiBTcGVjaWZ5IGEgdmFsaWQgb3BlcmFuZCBhbmQgdGhlbiB0cnkgYWdhaW4uIiwgLTEsIDB9LAotICAgIHs2MjAxICAgLCBFTVNfTk9ORSwgIlVuYWJsZSB0byBwcm9jZXNzIHRoZSBERUYgZmlsZS4gQm90aCBXSVJFRExPR0lDIGFuZCBERUxBWSBzdGF0ZW1lbnRzIGFyZSBkZWZpbmVkIGluIGNvbnN0cmFpbnQvYXNzZXJ0aW9uLlxuVXBkYXRlIHRoZSBERUYgZmlsZSB0byBkZWZpbmUgZWl0aGVyIGEgV0lSRURMT0dJQyBvciBERUxBWSBzdGF0ZW1lbnQgb25seS4iLCAtMSwgMH0sCi0gICAgezYyMDIgICAsIEVNU19OT05FLCAiVW5hYmxlIHRvIHByb2Nlc3MgdGhlIERFRiBmaWxlLiBCb3RoIFNVTSBhbmQgRElGRiBzdGF0ZW1lbnRzIGFyZSBkZWZpbmVkIGluIGNvbnN0cmFpbnQvYXNzZXJ0aW9uLlxuVXBkYXRlIHRoZSBERUYgZmlsZSB0byBkZWZpbmUgZWl0aGVyIGEgU1VNIG9yIERJRkYgc3RhdGVtZW50IG9ubHkuIiwgLTEsIDB9LAotICAgIHs2NTAxICAgLCBFTVNfTk9ORSwgIkFuIGVycm9yIGhhcyBiZWVuIGZvdW5kIHdoaWxlIHByb2Nlc3NpbmcgdGhlIERFRiBmaWxlICclcydcblVuaXQgJWQgaXMgYSA1LjYgb3IgbGF0ZXIgc3ludGF4LiBEZWZpbmUgdGhlIERFRiBmaWxlIGFzIDUuNiBhbmQgdGhlbiB0cnkgYWdhaW4uIiwgLTEsIDB9LAotICAgIHs2NTAyICAgLCBFTVNfTk9ORSwgIlRoZSB2YWx1ZSAlZCBkZWZpbmVkIGZvciBERUYgVU5JVFMgRElTVEFOQ0UgTUlDUk9OIGlzIGludmFsaWRcbi4gVGhlIHZhbGlkIHZhbHVlcyBhcmUgMTAwLCAyMDAsIDEwMDAsIDIwMDAsIDEwMDAwLCBvciAyMDAwMC4gU3BlY2lmeSBhIHZhbGlkIHZhbHVlIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLCAtMSwgMH0sCi0gICAgezY1MDMgICAsIEVNU19OT05FLCAiVGhlIGV4ZWN1dGlvbiBoYXMgYmVlbiBzdG9wcGVkIGJlY2F1c2UgdGhlIERFRiBwYXJzZXIgNS43IGRvZXMgbm90IHN1cHBvcnQgREVGIGZpbGUgd2l0aCB2ZXJzaW9uICVzLlxuVXBkYXRlIHlvdXIgREVGIGZpbGUgdG8gdmVyc2lvbiA1Ljcgb3IgZWFybGllci4iLCAtMSwgMH0sCi0gICAgezY1MDQgICAsIEVNU19OT05FLCAiRGVmIHBhcnNlciB2ZXJzaW9uIDUuNyBhbmQgbGF0ZXIgZG9lcyBub3Qgc3VwcG9ydCBOQU1FU0NBU0VTRU5TSVRJVkUgT0ZGLlxuRWl0aGVyIHJlbW92ZSB0aGlzIG9wdGlvbmFsIGNvbnN0cnVjdCBvciBzZXQgaXQgdG8gT04uIiwgLTEsIDB9LAotICAgIHs2NTA1ICAgLCBFTVNfTk9ORSwgIlRoZSBOT05ERUZBVUxUUlVMRSBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHs2NTA2ICAgLCBFTVNfTk9ORSwgIlRoZSBORVRFWFBSIHN0YXRlbWVudCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezY1MDcgICAsIEVNU19OT05FLCAiVGhlIFNVUFBMWVNFTlNJVElWSVRZIHN0YXRlbWVudCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezY1MDggICAsIEVNU19OT05FLCAiVGhlIEdST1VORFNFTlNJVElWSVRZIHN0YXRlbWVudCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezY1MDkgICAsIEVNU19OT05FLCAiVGhlIFBPTFlHT04gc3RhdGVtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7NjUxMCAgICwgRU1TX05PTkUsICJUaGUgQU5URU5OQVBJTlBBUlRJQUxNRVRBTEFSRUEgc3RhdGVtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7NjUxMSAgICwgRU1TX05PTkUsICJUaGUgQU5URU5OQVBJTlBBUlRJQUxNRVRBTFNJREVBUkVBIHN0YXRlbWVudCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZyIsIC0xLCAwfSwKLSAgICB7NjUxMiAgICwgRU1TX05PTkUsICJUaGUgQU5URU5OQVBJTkdBVEVBUkVBIHN0YXRlbWVudCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZyIsIC0xLCAwfSwKLSAgICB7NjUxMyAgICwgRU1TX05PTkUsICJUaGUgQU5URU5OQVBJTkRJRkZBUkVBIHN0YXRlbWVudCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZyIsIC0xLCAwfSwKLSAgICB7NjUxNCAgICwgRU1TX05PTkUsICJUaGUgQU5URU5OQVBJTk1BWEFSRUFDQVIgc3RhdGVtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnIiwgLTEsIDB9LAotICAgIHs2NTE1ICAgLCBFTVNfTk9ORSwgIlRoZSBBTlRFTk5BUElOTUFYU0lERUFSRUFDQVIgc3RhdGVtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnIiwgLTEsIDB9LAotICAgIHs2NTE2ICAgLCBFTVNfTk9ORSwgIlRoZSBBTlRFTk5BUElOUEFSVElBTENVVEFSRUEgc3RhdGVtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnIiwgLTEsIDB9LAotICAgIHs2NTE3ICAgLCBFTVNfTk9ORSwgIlRoZSBBTlRFTk5BUElOTUFYQ1VUQ0FSIHN0YXRlbWVudCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZyIsIC0xLCAwfSwKLSAgICB7NjUxOCAgICwgRU1TX05PTkUsICJUaGUgQU5URU5OQU1PREVMIHN0YXRlbWVudCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1LjUgYW5kIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZyIsIC0xLCAwfSwKLSAgICB7NjUxOSAgICwgRU1TX05PTkUsICJUaGUgU1BBQ0lORyBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWciLCAtMSwgMH0sCi0gICAgezY1MjAgICAsIEVNU19OT05FLCAiVGhlIERFU0lHTlJVTEVXSURUSCBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWciLCAtMSwgMH0sCi0gICAgezY1MjMgICAsIEVNU19OT05FLCAiSW52YWxpZCBST1cgc3RhdGVtZW50IGRlZmluZWQgaW4gdGhlIERFRiBmaWxlLiBUaGUgRE8gc3RhdGVtZW50IHdoaWNoIGlzIHJlcXVpcmVkIGluIHRoZSBST1cgc3RhdGVtZW50IGlzIG5vdCBkZWZpbmVkLlxuVXBkYXRlIHlvdXIgREVGIGZpbGUgd2l0aCBhIERPIHN0YXRlbWVudC4iLCAtMSwgMH0sCi0gICAgezY1MjQgICAsIEVNU19OT05FLCAiSW52YWxpZCBzeW50YXggc3BlY2lmaWVkLiBUaGUgdmFsaWQgc3ludGF4IGlzIGVpdGhlciBcIkRPIDEgQlkgbnVtIG9yIERPIG51bSBCWSAxXCIuIFNwZWNpZnkgdGhlIHZhbGlkIHN5bnRheCBhbmQgdHJ5IGFnYWluLiIsIC0xLCAwfSwKLSAgICB7NjUyNSAgICwgRU1TX05PTkUsICJUaGUgRE8gbnVtYmVyICVnIGluIFRSQUNLIGlzIGludmFsaWQuXG5UaGUgbnVtYmVyIHZhbHVlIGhhcyB0byBiZSBncmVhdGVyIHRoYW4gMC4gU3BlY2lmeSB0aGUgdmFsaWQgc3ludGF4IGFuZCB0cnkgYWdhaW4uIiwgLTEsIDB9LAotICAgIHs2NTI2ICAgLCBFTVNfTk9ORSwgIlRoZSBTVEVQIG51bWJlciAlZyBpbiBUUkFDSyBpcyBpbnZhbGlkLlxuVGhlIG51bWJlciB2YWx1ZSBoYXMgdG8gYmUgZ3JlYXRlciB0aGFuIDAuIFNwZWNpZnkgdGhlIHZhbGlkIHN5bnRheCBhbmQgdHJ5IGFnYWluLiIsIC0xLCAwfSwKLSAgICB7NjUyNyAgICwgRU1TX05PTkUsICJUaGUgRE8gbnVtYmVyICVnIGluIEdDRUxMR1JJRCBpcyBpbnZhbGlkLlxuVGhlIG51bWJlciB2YWx1ZSBoYXMgdG8gYmUgZ3JlYXRlciB0aGFuIDAuIFNwZWNpZnkgdGhlIHZhbGlkIHN5bnRheCBhbmQgdHJ5IGFnYWluLiIsIC0xLCAwfSwKLSAgICB7NjUyOCAgICwgRU1TX05PTkUsICJUaGUgU1RFUCBudW1iZXIgJWcgaW4gR0NFTExHUklEIGlzIGludmFsaWQuXG5UaGUgbnVtYmVyIHZhbHVlIGhhcyB0byBiZSBncmVhdGVyIHRoYW4gMC4gU3BlY2lmeSB0aGUgdmFsaWQgc3ludGF4IGFuZCB0cnkgYWdhaW4uIiwgLTEsIDB9LAotICAgIHs2NTI5ICAgLCBFTVNfTk9ORSwgIlRoZSBIQUxPIHN0YXRlbWVudCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZyIsIC0xLCAwfSwKLSAgICB7NjUzMCAgICwgRU1TX05PTkUsICJUaGUgRklYRURCVU1QIHN0YXRlbWVudCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1LjUgYW5kIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZyIsIC0xLCAwfSwKLSAgICB7NjUzMSAgICwgRU1TX05PTkUsICJUaGUgbGF5ZXJOYW1lIHdoaWNoIGlzIHJlcXVpcmVkIGluIHBhdGggaXMgbWlzc2luZy4gSW5jbHVkZSB0aGUgbGF5ZXJOYW1lIGluIHRoZSBwYXRoIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLCAtMSwgMH0sCi0gICAgezY1MzIgICAsIEVNU19OT05FLCAiVGhlIFZJQSBETyBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS41IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWciLCAtMSwgMH0sCi0gICAgezY1MzMgICAsIEVNU19OT05FLCAiRWl0aGVyIHRoZSBudW1YIG9yIG51bVkgaW4gdGhlIFZJQSBETyBzdGF0ZW1lbnQgaGFzIGludmFsaWQgdmFsdWUuIFRoZSB2YWx1ZSBzcGVjaWZpZWQgaXMgMC5cblVwZGF0ZSB5b3VyIERFRiBmaWxlIHdpdGggdGhlIGNvcnJlY3QgdmFsdWUgYW5kIHRoZW4gdHJ5IGFnYWluLiIsIC0xLCAwfSwKLSAgICB7NjUzNCAgICwgRU1TX05PTkUsICJUaGUgU1RZTEUgc3RhdGVtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnIiwgLTEsIDB9LAotICAgIHs2NTM1ICAgLCBFTVNfTk9ORSwgIlRoZSBQT0xZR09OIHN0YXRlbWVudCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZyIsIC0xLCAwfSwKLSAgICB7NjUzNiAgICwgRU1TX05PTkUsICJUaGUgUkVDVCBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWciLCAtMSwgMH0sCi0gICAgezY1MzcgICAsIEVNU19OT05FLCAiVGhlIHZhbHVlICVzIGZvciBzdGF0ZW1lbnQgVk9MVEFHRSBpcyBpbnZhbGlkLiBUaGUgdmFsdWUgY2FuIG9ubHkgYmUgaW50ZWdlci5cblNwZWNpZnkgYSB2YWxpZCB2YWx1ZSBpbiB1bml0cyBvZiBtaWxsaXZvbHRzIiwgLTEsIDB9LAotICAgIHs2NTM4ICAgLCBFTVNfTk9ORSwgIlRoZSBQQVJUSVRJT04gc3RhdGVtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNSBhbmQgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnIiwgLTEsIDB9LAotICAgIHs2NTM5ICAgLCBFTVNfTk9ORSwgIkludmFsaWQgQkxPQ0tBR0Ugc3RhdGVtZW50IGRlZmluZWQgaW4gdGhlIERFRiBmaWxlLiBUaGUgQkxPQ0tBR0Ugc3RhdG1lbnQgaGFzIGJvdGggdGhlIExBWUVSIGFuZCB0aGUgUExBQ0VNRU5UIHN0YXRlbWVudHMgZGVmaW5lZC5cblVwZGF0ZSB5b3VyIERFRiBmaWxlIHRvIGhhdmUgZWl0aGVyIEJMT0NLQUdFIG9yIFBMQUNFTUVOVCBzdGF0ZW1lbnQgb25seS4iLCAtMSwgMH0sCi0gICAgezY1NDAgICAsIEVNU19OT05FLCAiVGhlIFNQQUNJTkcgc3RhdGVtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnIiwgLTEsIDB9LAotICAgIHs2NTQxICAgLCBFTVNfTk9ORSwgIlRoZSBTUEFDSU5HIHN0YXRlbWVudCBpcyBkZWZpbmVkIGluIHRoZSBMQVlFUiBzdGF0ZW1lbnQsXG5idXQgdGhlcmUgaXMgYWxyZWFkeSBlaXRoZXIgYSBTUEFDSU5HIHN0YXRlbWVudCBvciBERVNJR05SVUxFV0lEVEggIHN0YXRlbWVudCBoYXMgZGVmaW5lZCBpbiB0aGUgTEFZRVIgc3RhdGVtZW50LlxuVXBkYXRlIHlvdXIgREVGIGZpbGUgdG8gaGF2ZSBlaXRoZXIgU1BBQ0lORyBzdGF0ZW1lbnQgb3IgYSBERVNJR05SVUxFV0lEVEggc3RhdGVtZW50LiIsIC0xLCAwfSwKLSAgICB7NjU0MiAgICwgRU1TX05PTkUsICJUaGUgZGVmaW5lZCBCTE9DS0FHRVMgQ09NUE9ORU5UIHN0YXRlbWVudCBoYXMgZWl0aGVyIENPTVBPTkVOVCwgU0xPVFMsIEZJTExTLCBQVVNIRE9XTiBvciBFWENFUFRQR05FVCBkZWZpbmVkLlxuT25seSBvbmUgb2YgdGhlc2Ugc3RhdGVtZW50cyBpcyBhbGxvd2VkIHBlciBMQVlFUi4gVXBkYXRlZCB0aGUgREVGIGZpbGUgdG8gZGVmaW5lIGEgdmFsaWQgQkxPQ0tBR0VTIENPTVBPTkVOVCBzdGF0ZW1lbnQgcGVyIGxheWVyLiIsIC0xLCAwfSwKLSAgICB7NjU0MyAgICwgRU1TX05PTkUsICJUaGUgZGVmaW5lZCBCTE9DS0FHRVMgUExBQ0VNRU5UIHN0YXRlbWVudCBoYXMgZWl0aGVyIENPTVBPTkVOVCwgUFVTSERPV04sIFNPRlQgb3IgUEFSVElBTCBkZWZpbmVkLlxuT25seSBvbmUgb2YgdGhlc2Ugc3RhdGVtZW50cyBpcyBhbGxvd2VkIHBlciBMQVlFUi4gVXBkYXRlZCB0aGUgREVGIGZpbGUgdG8gZGVmaW5lIGEgdmFsaWQgQkxPQ0tBR0VTIFBMQUNFTUVOVCBzdGF0ZW1lbnQuIiwgLTEsIDB9LAotICAgIHs2NTQ0ICAgLCBFTVNfTk9ORSwgIkEgUE9MWUdPTiBzdGF0ZW1lbnQgaXMgZGVmaW5lZCBpbiB0aGUgQkxPQ0tBR0Ugc3RhdGVtZW50LFxuYnV0IGl0IGlzIG5vdCBkZWZpbmVkIGluIHRoZSBCTE9DS0FHRSBMQVlFUiBzdGF0ZW1lbnQuXG5VcGRhdGUgeW91ciBERUYgZmlsZSB0byBlaXRoZXIgcmVtb3ZlIHRoZSBQT0xZR09OIHN0YXRlbWVudCBmcm9tIHRoZSBCTE9DS0FHRSBzdGF0ZW1lbnQgb3JcbmRlZmluZSB0aGUgUE9MWUdPTiBzdGF0ZW1lbnQgaW4gYSBCTE9DS0FHRSBMQVlFUiBzdGF0ZW1lbnQuIiwgLTEsIDB9LAotICAgIHs2NTQ1ICAgLCBFTVNfTk9ORSwgIlRoZSBOT05ERUZBVUxUUlVMRSBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHs2NTQ2ICAgLCBFTVNfTk9ORSwgIlRoZSBTVFlMRVMgc3RhdGVtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnIiwgLTEsIDB9LAotICAgIHs2NTQ3ICAgLCBFTVNfTk9ORSwgIlRoZSBQTEFDRU1FTlQgU09GVCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1Ljcgb3IgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7NjU0OCAgICwgRU1TX05PTkUsICJUaGUgUEFSVElBTCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1Ljcgb3IgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7NjU0OSAgICwgRU1TX05PTkUsICJUaGUgRVhDRVBUUEdORVQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS43IG9yIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezY1NTAgICAsIEVNU19OT05FLCAiVGhlIEhBTE8gU09GVCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1Ljcgb3IgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7NjU1MSAgICwgRU1TX05PTkUsICJUaGUgUk9VVEVIQUxPIGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNyBvciBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHs2NTUyICAgLCBFTVNfTk9ORSwgIlRoZSBGSUxMV0lSRU9QQyBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1Ljcgb3IgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7NjU1MyAgICwgRU1TX05PTkUsICJUaGUgTEFZRVIgT1BDIGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNyBvciBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHs2NTU0ICAgLCBFTVNfTk9ORSwgIlRoZSBWSUEgT1BDIGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNyBvciBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHs2NTU1ICAgLCBFTVNfTk9ORSwgIlRoZSBQT1JUIGluIFBJTlMgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS43IG9yIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezY1NTYgICAsIEVNU19OT05FLCAiVGhlIFBJTiBWSUEgc3RhdGVtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNyBhbmQgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7NjU1NyAgICwgRU1TX05PTkUsICJUaGUgVklBUlVMRSBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcsIiwgLTEsIDB9LAotICAgIHs2NTU4ICAgLCBFTVNfTk9ORSwgIlRoZSBGUkVRVUVOQ1kgc3RhdGVtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNSBhbmQgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnIiwgLTEsIDB9LAotICAgIHs2NTU5ICAgLCBFTVNfTk9ORSwgIlRoZSBST1dDT0wgc3RhdGVtZW50IGlzIG1pc3NpbmcgZnJvbSB0aGUgVklBUlVMRSBzdGF0ZW1lbnQuIEVuc3VyZSB0aGF0IGl0IGV4aXN0cyBpbiB0aGUgVklBUlVMRSBzdGF0ZW1lbnQuIiwgLTEsIDB9LAotICAgIHs2NTYwICAgLCBFTVNfTk9ORSwgIlRoZSBPUklHSU4gc3RhdGVtZW50IGlzIG1pc3NpbmcgZnJvbSB0aGUgVklBUlVMRSBzdGF0ZW1lbnQuIEVuc3VyZSB0aGF0IGl0IGV4aXN0cyBpbiB0aGUgVklBUlVMRSBzdGF0ZW1lbnQuIiwgLTEsIDB9LAotICAgIHs2NTYxICAgLCBFTVNfTk9ORSwgIiBUaGUgT0ZGU0VUIHN0YXRlbWVudCBpcyBtaXNzaW5nIGZyb20gdGhlIFZJQVJVTEUgc3RhdGVtZW50LiBFbnN1cmUgdGhhdCBpdCBleGlzdHMgaW4gdGhlIFZJQVJVTEUgc3RhdGVtZW50LiIsIC0xLCAwfSwKLSAgICB7NjU2MiAgICwgRU1TX05PTkUsICJUaGUgUEFUVEVSTiBzdGF0ZW1lbnQgaXMgbWlzc2luZyBmcm9tIHRoZSBWSUFSVUxFIHN0YXRlbWVudC4gRW5zdXJlIHRoYXQgaXQgZXhpc3RzIGluIHRoZSBWSUFSVUxFIHN0YXRlbWVudC4iLCAtMSwgMH0sCi0gICAgezY1NjMgICAsIEVNU19OT05FLCAiVGhlIFRZUEUgc3RhdGVtZW50IGFscmVhZHkgZXhpc3RzLiBJdCBoYXMgYmVlbiBkZWZpbmVkIGluIHRoZSBSRUdJT04gc3RhdGVtZW50LiIsIC0xLCAwfSwKLSAgICB7NjU2NCAgICwgRU1TX05PTkUsICJQT0xZR09OIHN0YXRlbWVudCBpbiBGSUxMUyBMQVlFUiBpcyBhIHZlcnNpb24gNS42IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGRlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLCIsIC0xLCAwfSwKLSAgICB7NzAwMCAgICwgRU1TX05PTkUsICJUaGUgc3BlY2lmaWVkIHN0cmluZyBoYXMgZXhjZWVkZWQgNDA5NiBjaGFyYWN0ZXJzLiBUaGUgZXh0cmEgY2hhcmFjdGVycyB3aWxsIGJlIHRydW5jYXRlZC4gU3BlY2lmeSBhIHN0cmluZyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gNDA5NiBjaGFyYWN0ZXJzLiIsIC0xLCAwfSwKLSAgICB7NzAxMCAgICwgRU1TX05PTkUsICJUaGUgUHJvcE5hbWUgJXMgaXMgbm90IGRlZmluZWQgZm9yICVzLiIsIC0xLCAwfSwKLSAgICB7NzAxMSAgICwgRU1TX05PTkUsICJUaGUgTkFNRVNDQVNFU0VOU0lUSVZFIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5UaGUgREVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC4iLCAtMSwgMH0sCi0gICAgezcwMTIgICAsIEVNU19OT05FLCAiVGhlIERFRiBmaWxlIGlzIGludmFsaWQgYmVjYXVzZSB0aGUgVkVSU0lPTiBzdGF0ZW1lbnQgaXMgbm90IGRlZmluZWQgaW4gaXQuXG5UaGUgVkVSU0lPTiBzdGF0ZW1lbnQgaXMgcmVxdWlyZWQgaW4gREVGIGZpbGUuIERlZmluZSB0aGlzIHN0YXRlbWVudCBieSByZWZlcmluZyB0byB0aGUgTEVGL0RFRiBMYW5ndWFnZSBSZWZlcmVuY2UgbWFudWFsLiIsIC0xLCAwfSwKLSAgICB7NzAxMyAgICwgRU1TX05PTkUsICJUaGUgREVGIGZpbGUgaXMgaW52YWxpZCBpZiBOQU1FU0NBU0VTRU5TSVRJVkUgaXMgdW5kZWZpbmVkLlxuTkFNRVNDQVNFU0VOU0lUSVZFIGlzIGEgbWFuZGF0b3J5IHN0YXRlbWVudCBpbiB0aGUgREVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNiBhbmQgZWFybGllci5cblRvIGRlZmluZSB0aGUgTkFNRVNDQVNFU0VOU0lUSVZFIHN0YXRlbWVudCwgcmVmZXIgdG8gdGhlIExFRi9ERUYgNS41IGFuZCBlYXJsaWVyIExhbmd1YWdlIFJlZmVyZW5jZSBtYW51YWwuIiwgLTEsIDB9LAotICAgIHs3MDE0ICAgLCBFTVNfTk9ORSwgIlRoZSBERUYgZmlsZSBpcyBpbnZhbGlkIGlmIEJVU0JJVENIQVJTIGlzIHVuZGVmaW5lZC5cbkJVU0JJVENIQVJTIGlzIGEgbWFuZGF0b3J5IHN0YXRlbWVudCBpbiB0aGUgREVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNiBhbmQgZWFybGllci5cblRvIGRlZmluZSB0aGUgQlVTQklUQ0hBUlMgc3RhdGVtZW50LCByZWZlciB0byB0aGUgTEVGL0RFRiA1LjUgYW5kIGVhcmxpZXIgTGFuZ3VhZ2UgUmVmZXJlbmNlIG1hbnVhbC4iLCAtMSwgMH0sCi0gICAgezcwMTUgICAsIEVNU19OT05FLCAiVGhlIERFRiBmaWxlIGlzIGludmFsaWQgaWYgRElWSURFUkNIQVIgaXMgdW5kZWZpbmVkLlxuRElWSURFUkNIQVIgaXMgYSBtYW5kYXRvcnkgc3RhdGVtZW50IGluIHRoZSBERUYgZmlsZSB3aXRoIHZlcnNpb24gNS42IGFuZCBlYXJsaWVyLlxuVG8gZGVmaW5lIHRoZSBESVZJREVSQ0hBUiBzdGF0ZW1lbnQsIHJlZmVyIHRvIHRoZSBMRUYvREVGIDUuNSBhbmQgZWFybGllciBMYW5ndWFnZSBSZWZlcmVuY2UgbWFudWFsLiIsIC0xLCAwfSwKLSAgICB7NzAxNiAgICwgRU1TX05PTkUsICJERVNJR04gaXMgYSBtYW5kYXRvcnkgc3RhdGVtZW50IGluIHRoZSBERUYgZmlsZS4gRW5zdXJlIHRoYXQgaXQgZXhpc3RzIGluIHRoZSBmaWxlLiIsIC0xLCAwfSwKLSAgICB7NzAxNyAgICwgRU1TX05PTkUsICJUaGUgREVGQVVMVENBUCBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIERFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuIiwgLTEsIDB9LAotICAgIHs3MDE4ICAgLCBFTVNfTk9ORSwgIlRoZSBETyBzdGF0ZW1lbnQgaW4gdGhlIFJPVyBzdGF0ZW1lbnQgd2l0aCB0aGUgbmFtZSAlcyBoYXMgaW52YWxpZCBzeW50YXguXG5UaGUgdmFsaWQgc3ludGF4IGlzIFwiRE8gbnVtWCBCWSAxIFNURVAgc3BhY2VYIDAgfCBETyAxIEJZIG51bVkgU1RFUCAwIHNwYWNlWVwiLlxuU3BlY2lmeSB0aGUgdmFsaWQgc3ludGF4IGFuZCB0cnkgYWdhaW4uIiwgLTEsIDB9LAotICAgIHs3MDE5ICAgLCBFTVNfTk9ORSwgIlRoZSBQQVRURVJOTkFNRSBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuVGhlIERFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuIiwgLTEsIDB9LAotICAgIHs3MDIwICAgLCBFTVNfTk9ORSwgIlRoZSBSRUdJT04gcHQgcHQgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS41IGFuZCBsYXRlci5cblRoZSBERUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LiIsIC0xLCAwfSwKLSAgICB7NzAyMSAgICwgRU1TX05PTkUsICJUaGUgRk9SRUlHTiBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuVGhlIERFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuIiwgLTEsIDB9LAotICAgIHs3MDIyICAgLCBFTVNfTk9ORSwgIkluIHRoZSBDT01QT05FTlQgVU5QTEFDRUQgc3RhdGVtZW50LCB0aGUgcG9pbnQgYW5kIG9yaWVudCBhcmUgaW52YWxpZCBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgREVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC4iLCAtMSwgMH0sCi0gICAgezcwMjMgICAsIEVNU19OT05FLCAiVGhlIFNQRUNJQUwgTkVUIHN0YXRlbWVudCwgd2l0aCB0eXBlICVzLCBkb2VzIG5vdCBoYXZlIGFueSBuZXQgc3RhdGVtZW50IGRlZmluZWQuXG5UaGUgREVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC4iLCAtMSwgMH0sCi0gICAgezcwMjQgICAsIEVNU19OT05FLCAiVGhlIEVTVENBUCBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjUgYW5kIGxhdGVyLlxuVGhlIERFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuIiwgLTEsIDB9LAotICAgIHs3MDI1ICAgLCBFTVNfTk9ORSwgIlRoZSBTUEVDSUFMIE5FVCBTSElFTEQgc3RhdGVtZW50LCBkb2VzIG5vdCBoYXZlIGFueSBzaGllbGQgbmV0IHN0YXRlbWVudCBkZWZpbmVkLlxuVGhlIERFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuIiwgLTEsIDB9LAotICAgIHs3MDI2ICAgLCBFTVNfTk9ORSwgIlRoZSBXSURUSCBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjUgYW5kIGxhdGVyLlxuVGhlIERFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuIiwgLTEsIDB9LAotICAgIHs3MDI3ICAgLCBFTVNfTk9ORSwgIlRoZSBHUk9VUCBSRUdJT04gcHQgcHQgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS41IGFuZCBsYXRlci5cblRoZSBERUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LiIsIC0xLCAwfSwKLSAgICB7NzAyOCAgICwgRU1TX05PTkUsICJUaGUgR1JPVVAgU09GVCBNQVhYIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNSBhbmQgbGF0ZXIuXG5UaGUgREVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC4iLCAtMSwgMH0sCi0gICAgezcwMjkgICAsIEVNU19OT05FLCAiVGhlIEdST1VQIFNPRlQgTUFYWSBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjUgYW5kIGxhdGVyLlxuVGhlIERFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuIiwgLTEsIDB9LAotICAgIHs3MDMwICAgLCBFTVNfTk9ORSwgIlRoZSBHUk9VUCBTT0ZUIE1BWEhBTEZQRVJJTUVURVIgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS41IGFuZCBsYXRlci5cblRoZSBERUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LiIsIC0xLCAwfSwKLSAgICB7NzAzMSAgICwgRU1TX05PTkUsICJUaGUgQVNTRVJUSU9OUyBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIERFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuIiwgLTEsIDB9LAotICAgIHs3MDMyICAgLCBFTVNfTk9ORSwgIlRoZSBDT05TVFJBSU5UUyBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIERFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuIiwgLTEsIDB9LAotICAgIHs3MDM1ICAgLCBFTVNfTk9ORSwgIlRoZSBJT1RJTUlOR1Mgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cblRoZSBERUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LiIsIC0xLCAwfSwKLSAgICB7NzUwMCAgICwgRU1TX05PTkUsICJVbmFibGUgdG8gb3BlbiB0aGUgZmlsZSBkZWZSV2FybmluZy5sb2cgaW4gJXMuXG5XYXJuaW5nIG1lc3NhZ2VzIHdpbGwgbm90IGJlIHdyaXR0ZW4gb3V0IGluIHRoZSBsb2cgZmlsZS5cbkNoZWNrIGlmIHlvdSBoYXZlIHdyaXRlIHBlcm1pc3Npb24gb24gdGhlIGRpcmVjdG9yeS4iLCAtMSwgMH0sCi0gICAgezgwMDAgICAsIEVNU19OT05FLCAiVGhlIGRhdGEgc3RpbGwgZXhpc3RzIGFmdGVyIHRoZSBFTkQgREVTSUdOIHN0YXRlbWVudC4gVGhlIERFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBkYXRhLiIsIC0xLCAwfSwKLSAgICB7ODUwMCAgICwgRU1TX05PTkUsICJVbmFibGUgdG8gb3BlbiB0aGUgZmlsZSBkZWZSV2FybmluZy5sb2cgaW4gJXMuXG5JbmZvIG1lc3NhZ2VzIHdpbGwgbm90IGJlIHdyaXR0ZW4gb3V0IGluIHRoZSBsb2cgZmlsZS5cbkNoZWNrIGlmIHlvdSBoYXZlIHdyaXRlIHBlcm1pc3Npb24gb24gdGhlIGRpcmVjdG9yeS4iLCAtMSwgMH0sCi0gICAgezkwMDAgICAsIEVNU19OT05FLCAiVGhlIERFRiB3cml0ZXIgaGFzIGRldGVjdGVkIHRoYXQgdGhlIGZ1bmN0aW9uIGRlZndJbml0Q2JrIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGFuZCB5b3UgYXJlIHRyeWluZyB0byBjYWxsIGRlZndJbml0LlxuT25seSBkZWZ3SW5pdENiayBvciBkZWZ3SW5pdCBjYW4gYmUgY2FsbGVkIGJ1dCBub3QgYm90aC5cblVwZGF0ZSB5b3VyIHByb2dyYW0gYW5kIHRoZW4gdHJ5IGFnYWluLiIsIC0xLCAwfSwKLSAgICB7OTAwMSAgICwgRU1TX05PTkUsICJUaGUgREVGIHdyaXRlciBoYXMgZGV0ZWN0ZWQgdGhhdCB0aGUgZnVuY3Rpb24gZGVmd0luaXQgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgYW5kIHlvdSBhcmUgdHJ5aW5nIHRvIGNhbGwgZGVmd0luaXRDYmsuXG5Pbmx5IGRlZndJbml0Q2JrIG9yIGRlZndJbml0IGNhbiBiZSBjYWxsZWQgYnV0IG5vdCBib3RoLlxuVXBkYXRlIHlvdXIgcHJvZ3JhbSBhbmQgdGhlbiB0cnkgYWdhaW4uIiwgLTEsIDB9LAotICAgIHs5MDEwICAgLCBFTVNfTk9ORSwgIlRoZSBmdW5jdGlvbiBkZWZ3V3JpdGUgaXMgY2FsbGVkIGJlZm9yZSB0aGUgZnVuY3Rpb24gZGVmd0luaXRDYmsuXG5Zb3UgbmVlZCB0byBjYWxsIGRlZndJbml0Q2JrIGJlZm9yZSBjYWxsaW5nIGFueSBvdGhlciBmdW5jdGlvbnMuXG5VcGRhdGUgeW91ciBwcm9ncmFtIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLCAtMSwgMH0sCi0gICAgezkwMTEgICAsIEVNU19OT05FLCAiWW91IHByb2dyYW0gaGFzIGNhbGxlZCB0aGUgZnVuY3Rpb24gZGVmd0luaXQgdG8gaW5pdGlhbGl6ZSB0aGUgd3JpdGVyLlxuSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBjYWxsYmFjayBvcHRpb24geW91IG5lZWQgdG8gdXNlIHRoZSBmdW5jdGlvbiBkZWZ3SW5pdENiay4iLCAtMSwgMH0sCi0gICAgezkwMTIgICAsIEVNU19OT05FLCAiWW91IGFyZSBjYWxsaW5nIHRoZSBmdW5jdGlvbiBkZWZ3UHJpbnRVbnVzZWRDYWxsYmFja3MgYnV0IHlvdSBkaWQgY2FsbCB0aGUgZnVuY3Rpb24gZGVmd1NldFJlZ2lzdGVyVW51c2VkQ2FsbGJhY2tzIHdoaWNoIGlzIHJlcXVpcmVkIGJlZm9yZSB5b3UgY2FuIGNhbGwgZGVmd1ByaW50VW51c2VkQ2FsbGJhY2tzLiIsIC0xLCAwfSwKLSAgICB7LTEgICAgICwgRU1TX05PTkUsICIiLCAtMSwgMH0KLX07Ci0KLS8qCi0gKiBFbmQgbWFjaGluZSBnZW5lcmF0ZWQgdGFibGUuCi0qLwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYvZGVmaUFsaWFzLmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZpQWxpYXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZhOWJmNC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZpQWxpYXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQ29weXJpZ2h0IDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZSAgICAgICAgICAgICAqLwotLyogRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAqLwotLyogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgKi8KLS8qICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAqLwotLyogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgKi8KLS8qICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgICAgICovCi0vKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgICAgICAqLwotLyogICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LCAgICAgICAgICAqLwotLyogY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJEF1dGhvcjogYXJha2htYW4gJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRSZXZpc2lvbjogIzQgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkRGF0ZTogMjAxNC8wNC8zMCAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJFN0YXRlOiAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLQotI2lmbmRlZiBDREVGSUFMSUFTX0gKLSNkZWZpbmUgQ0RFRklBTElBU19ICi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImRlZmlUeXBlZGVmcy5oIgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZmlBc3NlcnRpb24uaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZmlBc3NlcnRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY0ZGNhMi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZpQXNzZXJ0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qIEFUVEVOVElPTjogVEhJUyBJUyBBTiBBVVRPLUdFTkVSQVRFRCBGSUxFLiBETyBOT1QgQ0hBTkdFIElUISAgICAgICAgICAgICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qIENvcHlyaWdodCAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UgICAgICAgICAgICAgKi8KLS8qIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7ICAgICAgICAgICAgKi8KLS8qICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gICAgICAgICovCi0vKiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAgICAgKi8KLS8qICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsICAgICAgICovCi0vKiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICAgICAqLwotLyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICAgICAgKi8KLS8qICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwgICAgICAgICAgKi8KLS8qIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRBdXRob3I6IGRlbGwgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJFJldmlzaW9uOiAjMSAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJERhdGU6IDIwMTcvMDYvMDYgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkU3RhdGU6ICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotCi0jaWZuZGVmIENERUZJQVNTRVJUSU9OX0gKLSNkZWZpbmUgQ0RFRklBU1NFUlRJT05fSAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJkZWZpVHlwZWRlZnMuaCIKLQotLyogU3RydWN0IGhvbGRzIHRoZSBkYXRhIGZvciBvbmUgYXNzZXJ0aW9uL2NvbnN0cmFpbnQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEFuIGFzc2VydGlvbiBvciBjb25zdHJhaW50IGlzIGVpdGhlciBhIG5ldC9wYXRoIHJ1bGUgb3IgYSAgICAgICAgICAgICAgICAgICovCi0vKiB3aXJlZCBsb2dpYyBydWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBBIG5ldC9wYXRoIHJ1bGUgaXMgYW4gaXRlbSBvciBsaXN0IG9mIGl0ZW1zIHBsdXMgc3BlY2lmaWNhdGlvbnMuICAgICAgICAgICovCi0vKiAgICBUaGUgc3BlY2lmaWNhdGlvbnMgYXJlOiByaXNlL2ZhbGwgbWluL21heC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIGl0ZW1zIGFyZSBhIGxpc3Qgb2YgKG9uZSBvciBtb3JlKSBuZXQgbmFtZXMgb3IgcGF0aHMgb3IgYSAgICAgICAgICAgKi8KLS8qICAgIGNvbWJpbmF0aW9uIG9mIGJvdGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEEgd2lyZWQgbG9naWMgcnVsZSBpcyBhIG5ldG5hbWUgYW5kIGEgZGlzdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2Ugd2lsbCBOT1QgYWxsb3cgdGhlIG1peGluZyBvZiB3aXJlZCBsb2dpYyBydWxlcyBhbmQgbmV0L3BhdGggZGVsYXlzICAgICAqLwotLyogIGluIHRoZSBzYW1lIGFzc2VydGlvbi9jb25zdHJhaW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2Ugd2lsbCBhbGxvdyB0aGUgcnVsZSB0byBiZSBhIHN1bSBvZiBzdW1zICh3aGljaCB3aWxsIGJlIGludGVycHJldGVkICAgICAqLwotLyogIGFzIGp1c3Qgb25lIGxpc3QpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLUVYVEVSTiBpbnQgZGVmaUFzc2VydGlvbl9pc0Fzc2VydGlvbiAoY29uc3QgZGVmaUFzc2VydGlvbiogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaUFzc2VydGlvbl9pc0NvbnN0cmFpbnQgKGNvbnN0IGRlZmlBc3NlcnRpb24qIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlBc3NlcnRpb25faXNXaXJlZGxvZ2ljIChjb25zdCBkZWZpQXNzZXJ0aW9uKiBvYmopOwotRVhURVJOIGludCBkZWZpQXNzZXJ0aW9uX2lzRGVsYXkgKGNvbnN0IGRlZmlBc3NlcnRpb24qIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlBc3NlcnRpb25faXNTdW0gKGNvbnN0IGRlZmlBc3NlcnRpb24qIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlBc3NlcnRpb25faXNEaWZmIChjb25zdCBkZWZpQXNzZXJ0aW9uKiBvYmopOwotRVhURVJOIGludCBkZWZpQXNzZXJ0aW9uX2hhc1Jpc2VNaW4gKGNvbnN0IGRlZmlBc3NlcnRpb24qIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlBc3NlcnRpb25faGFzUmlzZU1heCAoY29uc3QgZGVmaUFzc2VydGlvbiogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaUFzc2VydGlvbl9oYXNGYWxsTWluIChjb25zdCBkZWZpQXNzZXJ0aW9uKiBvYmopOwotRVhURVJOIGludCBkZWZpQXNzZXJ0aW9uX2hhc0ZhbGxNYXggKGNvbnN0IGRlZmlBc3NlcnRpb24qIG9iaik7Ci1FWFRFUk4gZG91YmxlIGRlZmlBc3NlcnRpb25fcmlzZU1pbiAoY29uc3QgZGVmaUFzc2VydGlvbiogb2JqKTsKLUVYVEVSTiBkb3VibGUgZGVmaUFzc2VydGlvbl9yaXNlTWF4IChjb25zdCBkZWZpQXNzZXJ0aW9uKiBvYmopOwotRVhURVJOIGRvdWJsZSBkZWZpQXNzZXJ0aW9uX2ZhbGxNaW4gKGNvbnN0IGRlZmlBc3NlcnRpb24qIG9iaik7Ci1FWFRFUk4gZG91YmxlIGRlZmlBc3NlcnRpb25fZmFsbE1heCAoY29uc3QgZGVmaUFzc2VydGlvbiogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpQXNzZXJ0aW9uX25ldE5hbWUgKGNvbnN0IGRlZmlBc3NlcnRpb24qIG9iaik7Ci1FWFRFUk4gZG91YmxlIGRlZmlBc3NlcnRpb25fZGlzdGFuY2UgKGNvbnN0IGRlZmlBc3NlcnRpb24qIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlBc3NlcnRpb25fbnVtSXRlbXMgKGNvbnN0IGRlZmlBc3NlcnRpb24qIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlBc3NlcnRpb25faXNQYXRoIChjb25zdCBkZWZpQXNzZXJ0aW9uKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpQXNzZXJ0aW9uX2lzTmV0IChjb25zdCBkZWZpQXNzZXJ0aW9uKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIHZvaWQgZGVmaUFzc2VydGlvbl9wYXRoIChjb25zdCBkZWZpQXNzZXJ0aW9uKiBvYmosIGludCAgaW5kZXgsIGNoYXIqKiAgZnJvbUluc3QsIGNoYXIqKiAgZnJvbVBpbiwgY2hhcioqICB0b0luc3QsIGNoYXIqKiAgdG9QaW4pOwotRVhURVJOIHZvaWQgZGVmaUFzc2VydGlvbl9uZXQgKGNvbnN0IGRlZmlBc3NlcnRpb24qIG9iaiwgaW50ICBpbmRleCwgY2hhcioqICBuZXROYW1lKTsKLQotRVhURVJOIHZvaWQgZGVmaUFzc2VydGlvbl9wcmludCAoY29uc3QgZGVmaUFzc2VydGlvbiogb2JqLCBGSUxFKiAgZik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYvZGVmaUJsb2NrYWdlLmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZpQmxvY2thZ2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MxOTQwOC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZpQmxvY2thZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQ29weXJpZ2h0IDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZSAgICAgICAgICAgICAqLwotLyogRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAqLwotLyogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgKi8KLS8qICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAqLwotLyogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgKi8KLS8qICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgICAgICovCi0vKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgICAgICAqLwotLyogICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LCAgICAgICAgICAqLwotLyogY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJEF1dGhvcjogZGVsbCAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkUmV2aXNpb246ICMxICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkRGF0ZTogMjAxNy8wNi8wNiAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRTdGF0ZTogICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0KLSNpZm5kZWYgQ0RFRklCTE9DS0FHRV9ICi0jZGVmaW5lIENERUZJQkxPQ0tBR0VfSAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJkZWZpVHlwZWRlZnMuaCIKLQotRVhURVJOIGludCBkZWZpQmxvY2thZ2VfaGFzTGF5ZXIgKGNvbnN0IGRlZmlCbG9ja2FnZSogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaUJsb2NrYWdlX2hhc1BsYWNlbWVudCAoY29uc3QgZGVmaUJsb2NrYWdlKiBvYmopOwotRVhURVJOIGludCBkZWZpQmxvY2thZ2VfaGFzQ29tcG9uZW50IChjb25zdCBkZWZpQmxvY2thZ2UqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlCbG9ja2FnZV9oYXNTbG90cyAoY29uc3QgZGVmaUJsb2NrYWdlKiBvYmopOwotRVhURVJOIGludCBkZWZpQmxvY2thZ2VfaGFzRmlsbHMgKGNvbnN0IGRlZmlCbG9ja2FnZSogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaUJsb2NrYWdlX2hhc1B1c2hkb3duIChjb25zdCBkZWZpQmxvY2thZ2UqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlCbG9ja2FnZV9oYXNFeGNlcHRwZ25ldCAoY29uc3QgZGVmaUJsb2NrYWdlKiBvYmopOwotRVhURVJOIGludCBkZWZpQmxvY2thZ2VfaGFzU29mdCAoY29uc3QgZGVmaUJsb2NrYWdlKiBvYmopOwotRVhURVJOIGludCBkZWZpQmxvY2thZ2VfaGFzUGFydGlhbCAoY29uc3QgZGVmaUJsb2NrYWdlKiBvYmopOwotRVhURVJOIGludCBkZWZpQmxvY2thZ2VfaGFzU3BhY2luZyAoY29uc3QgZGVmaUJsb2NrYWdlKiBvYmopOwotRVhURVJOIGludCBkZWZpQmxvY2thZ2VfaGFzRGVzaWduUnVsZVdpZHRoIChjb25zdCBkZWZpQmxvY2thZ2UqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlCbG9ja2FnZV9oYXNNYXNrIChjb25zdCBkZWZpQmxvY2thZ2UqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlCbG9ja2FnZV9tYXNrIChjb25zdCBkZWZpQmxvY2thZ2UqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlCbG9ja2FnZV9taW5TcGFjaW5nIChjb25zdCBkZWZpQmxvY2thZ2UqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlCbG9ja2FnZV9kZXNpZ25SdWxlV2lkdGggKGNvbnN0IGRlZmlCbG9ja2FnZSogb2JqKTsKLUVYVEVSTiBkb3VibGUgZGVmaUJsb2NrYWdlX3BsYWNlbWVudE1heERlbnNpdHkgKGNvbnN0IGRlZmlCbG9ja2FnZSogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpQmxvY2thZ2VfbGF5ZXJOYW1lIChjb25zdCBkZWZpQmxvY2thZ2UqIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaUJsb2NrYWdlX2xheWVyQ29tcG9uZW50TmFtZSAoY29uc3QgZGVmaUJsb2NrYWdlKiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlCbG9ja2FnZV9wbGFjZW1lbnRDb21wb25lbnROYW1lIChjb25zdCBkZWZpQmxvY2thZ2UqIG9iaik7Ci0KLUVYVEVSTiBpbnQgZGVmaUJsb2NrYWdlX251bVJlY3RhbmdsZXMgKGNvbnN0IGRlZmlCbG9ja2FnZSogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaUJsb2NrYWdlX3hsIChjb25zdCBkZWZpQmxvY2thZ2UqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlCbG9ja2FnZV95bCAoY29uc3QgZGVmaUJsb2NrYWdlKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpQmxvY2thZ2VfeGggKGNvbnN0IGRlZmlCbG9ja2FnZSogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgZGVmaUJsb2NrYWdlX3loIChjb25zdCBkZWZpQmxvY2thZ2UqIG9iaiwgaW50ICBpbmRleCk7Ci0KLUVYVEVSTiBpbnQgZGVmaUJsb2NrYWdlX251bVBvbHlnb25zIChjb25zdCBkZWZpQmxvY2thZ2UqIG9iaik7Ci1FWFRFUk4gc3RydWN0IGRlZmlQb2ludHMgZGVmaUJsb2NrYWdlX2dldFBvbHlnb24gKGNvbnN0IGRlZmlCbG9ja2FnZSogb2JqLCBpbnQgIGluZGV4KTsKLQotRVhURVJOIHZvaWQgZGVmaUJsb2NrYWdlX3ByaW50IChjb25zdCBkZWZpQmxvY2thZ2UqIG9iaiwgRklMRSogIGYpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZmlDb21wb25lbnQuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZmlDb21wb25lbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNmMGMyZi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZpQ29tcG9uZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBBVFRFTlRJT046IFRISVMgSVMgQU4gQVVUTy1HRU5FUkFURUQgRklMRS4gRE8gTk9UIENIQU5HRSBJVCEgICAgICAgICAgICAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBDb3B5cmlnaHQgMjAxMywgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlICAgICAgICAgICAgICovCi0vKiBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAgICAgICAgICAgICovCi0vKiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICAgICAgICAqLwotLyogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICovCi0vKiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAgICAgICAqLwotLyogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgICAgKi8KLS8qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgICAgICovCi0vKiAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksICAgICAgICAgICovCi0vKiBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkQXV0aG9yOiBkZWxsICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRSZXZpc2lvbjogIzEgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICREYXRlOiAyMDE3LzA2LzA2ICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJFN0YXRlOiAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLQotI2lmbmRlZiBDREVGSUNPTVBPTkVOVF9ICi0jZGVmaW5lIENERUZJQ09NUE9ORU5UX0gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiZGVmaVR5cGVkZWZzLmgiCi0KLS8qIFBsYWNlbWVudCBzdGF0dXMgZm9yIHRoZSBjb21wb25lbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBEZWZhdWx0IGlzIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBERUZJX0NPTVBPTkVOVF9VTlBMQUNFRCAxCi0jZGVmaW5lIERFRklfQ09NUE9ORU5UX1BMQUNFRCAyCi0jZGVmaW5lIERFRklfQ09NUE9ORU5UX0ZJWEVEIDMKLSNkZWZpbmUgREVGSV9DT01QT05FTlRfQ09WRVIgNAotCi0vKiBTdHJ1Y3QgaG9sZHMgdGhlIGRhdGEgZm9yIGNvbXBvbmVudE1hc2tTaGlmdExheWVycy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi1FWFRFUk4gaW50IGRlZmlDb21wb25lbnRNYXNrU2hpZnRMYXllcl9udW1NYXNrU2hpZnRMYXllcnMgKGNvbnN0IGRlZmlDb21wb25lbnRNYXNrU2hpZnRMYXllciogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpQ29tcG9uZW50TWFza1NoaWZ0TGF5ZXJfbWFza1NoaWZ0TGF5ZXIgKGNvbnN0IGRlZmlDb21wb25lbnRNYXNrU2hpZnRMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLQotLyogU3RydWN0IGhvbGRzIHRoZSBkYXRhIGZvciBvbmUgY29tcG9uZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNS43ICAgICAgICAgICAgKi8KLQotICAvKiBGb3IgT0EgdG8gbW9kaWZ5IHRoZSBJZCAmIE5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlDb21wb25lbnRfaWQgKGNvbnN0IGRlZmlDb21wb25lbnQqIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaUNvbXBvbmVudF9uYW1lIChjb25zdCBkZWZpQ29tcG9uZW50KiBvYmopOwotRVhURVJOIGludCBkZWZpQ29tcG9uZW50X3BsYWNlbWVudFN0YXR1cyAoY29uc3QgZGVmaUNvbXBvbmVudCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaUNvbXBvbmVudF9pc1VucGxhY2VkIChjb25zdCBkZWZpQ29tcG9uZW50KiBvYmopOwotRVhURVJOIGludCBkZWZpQ29tcG9uZW50X2lzUGxhY2VkIChjb25zdCBkZWZpQ29tcG9uZW50KiBvYmopOwotRVhURVJOIGludCBkZWZpQ29tcG9uZW50X2lzRml4ZWQgKGNvbnN0IGRlZmlDb21wb25lbnQqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlDb21wb25lbnRfaXNDb3ZlciAoY29uc3QgZGVmaUNvbXBvbmVudCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaUNvbXBvbmVudF9wbGFjZW1lbnRYIChjb25zdCBkZWZpQ29tcG9uZW50KiBvYmopOwotRVhURVJOIGludCBkZWZpQ29tcG9uZW50X3BsYWNlbWVudFkgKGNvbnN0IGRlZmlDb21wb25lbnQqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlDb21wb25lbnRfcGxhY2VtZW50T3JpZW50IChjb25zdCBkZWZpQ29tcG9uZW50KiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlDb21wb25lbnRfcGxhY2VtZW50T3JpZW50U3RyIChjb25zdCBkZWZpQ29tcG9uZW50KiBvYmopOwotRVhURVJOIGludCBkZWZpQ29tcG9uZW50X2hhc1JlZ2lvbk5hbWUgKGNvbnN0IGRlZmlDb21wb25lbnQqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlDb21wb25lbnRfaGFzUmVnaW9uQm91bmRzIChjb25zdCBkZWZpQ29tcG9uZW50KiBvYmopOwotRVhURVJOIGludCBkZWZpQ29tcG9uZW50X2hhc0VFUSAoY29uc3QgZGVmaUNvbXBvbmVudCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaUNvbXBvbmVudF9oYXNHZW5lcmF0ZSAoY29uc3QgZGVmaUNvbXBvbmVudCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaUNvbXBvbmVudF9oYXNTb3VyY2UgKGNvbnN0IGRlZmlDb21wb25lbnQqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlDb21wb25lbnRfaGFzV2VpZ2h0IChjb25zdCBkZWZpQ29tcG9uZW50KiBvYmopOwotRVhURVJOIGludCBkZWZpQ29tcG9uZW50X3dlaWdodCAoY29uc3QgZGVmaUNvbXBvbmVudCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaUNvbXBvbmVudF9tYXNrU2hpZnRTaXplIChjb25zdCBkZWZpQ29tcG9uZW50KiBvYmopOwotRVhURVJOIGludCBkZWZpQ29tcG9uZW50X21hc2tTaGlmdCAoY29uc3QgZGVmaUNvbXBvbmVudCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgZGVmaUNvbXBvbmVudF9oYXNOZXRzIChjb25zdCBkZWZpQ29tcG9uZW50KiBvYmopOwotRVhURVJOIGludCBkZWZpQ29tcG9uZW50X251bU5ldHMgKGNvbnN0IGRlZmlDb21wb25lbnQqIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaUNvbXBvbmVudF9uZXQgKGNvbnN0IGRlZmlDb21wb25lbnQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaUNvbXBvbmVudF9yZWdpb25OYW1lIChjb25zdCBkZWZpQ29tcG9uZW50KiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlDb21wb25lbnRfc291cmNlIChjb25zdCBkZWZpQ29tcG9uZW50KiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlDb21wb25lbnRfRUVRIChjb25zdCBkZWZpQ29tcG9uZW50KiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlDb21wb25lbnRfZ2VuZXJhdGVOYW1lIChjb25zdCBkZWZpQ29tcG9uZW50KiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlDb21wb25lbnRfbWFjcm9OYW1lIChjb25zdCBkZWZpQ29tcG9uZW50KiBvYmopOwotRVhURVJOIGludCBkZWZpQ29tcG9uZW50X2hhc0hhbG8gKGNvbnN0IGRlZmlDb21wb25lbnQqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlDb21wb25lbnRfaGFzSGFsb1NvZnQgKGNvbnN0IGRlZmlDb21wb25lbnQqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlDb21wb25lbnRfaGFzUm91dGVIYWxvIChjb25zdCBkZWZpQ29tcG9uZW50KiBvYmopOwotRVhURVJOIGludCBkZWZpQ29tcG9uZW50X2hhbG9EaXN0IChjb25zdCBkZWZpQ29tcG9uZW50KiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlDb21wb25lbnRfbWluTGF5ZXIgKGNvbnN0IGRlZmlDb21wb25lbnQqIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaUNvbXBvbmVudF9tYXhMYXllciAoY29uc3QgZGVmaUNvbXBvbmVudCogb2JqKTsKLQotICAvKiBSZXR1cm5zIGFycmF5cyBmb3IgdGhlIGxsIGFuZCB1ciBvZiB0aGUgcmVjdGFuZ2xlcyBpbiB0aGUgcmVnaW9uLiAgICAgICAgKi8KLSAgLyogVGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgYXJyYXlzIGlzIGdpdmVuIGluIHNpemUuICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gdm9pZCBkZWZpQ29tcG9uZW50X3JlZ2lvbkJvdW5kcyAoY29uc3QgZGVmaUNvbXBvbmVudCogb2JqLCBpbnQqIHNpemUsIGludCoqICB4bCwgaW50KiogIHlsLCBpbnQqKiAgeGgsIGludCoqICB5aCk7Ci0KLUVYVEVSTiBpbnQgZGVmaUNvbXBvbmVudF9oYXNGb3JlaWduTmFtZSAoY29uc3QgZGVmaUNvbXBvbmVudCogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpQ29tcG9uZW50X2ZvcmVpZ25OYW1lIChjb25zdCBkZWZpQ29tcG9uZW50KiBvYmopOwotRVhURVJOIGludCBkZWZpQ29tcG9uZW50X2ZvcmVpZ25YIChjb25zdCBkZWZpQ29tcG9uZW50KiBvYmopOwotRVhURVJOIGludCBkZWZpQ29tcG9uZW50X2ZvcmVpZ25ZIChjb25zdCBkZWZpQ29tcG9uZW50KiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlDb21wb25lbnRfZm9yZWlnbk9yaSAoY29uc3QgZGVmaUNvbXBvbmVudCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaUNvbXBvbmVudF9mb3JlaWduT3JpZW50IChjb25zdCBkZWZpQ29tcG9uZW50KiBvYmopOwotRVhURVJOIGludCBkZWZpQ29tcG9uZW50X2hhc0ZvcmkgKGNvbnN0IGRlZmlDb21wb25lbnQqIG9iaik7Ci0KLUVYVEVSTiBpbnQgZGVmaUNvbXBvbmVudF9udW1Qcm9wcyAoY29uc3QgZGVmaUNvbXBvbmVudCogb2JqKTsKLUVYVEVSTiBjaGFyKiBkZWZpQ29tcG9uZW50X3Byb3BOYW1lIChjb25zdCBkZWZpQ29tcG9uZW50KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGNoYXIqIGRlZmlDb21wb25lbnRfcHJvcFZhbHVlIChjb25zdCBkZWZpQ29tcG9uZW50KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGRvdWJsZSBkZWZpQ29tcG9uZW50X3Byb3BOdW1iZXIgKGNvbnN0IGRlZmlDb21wb25lbnQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY2hhciBkZWZpQ29tcG9uZW50X3Byb3BUeXBlIChjb25zdCBkZWZpQ29tcG9uZW50KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpQ29tcG9uZW50X3Byb3BJc051bWJlciAoY29uc3QgZGVmaUNvbXBvbmVudCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgZGVmaUNvbXBvbmVudF9wcm9wSXNTdHJpbmcgKGNvbnN0IGRlZmlDb21wb25lbnQqIG9iaiwgaW50ICBpbmRleCk7Ci0KLSAgLyogRGVidWcgcHJpbnRpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gdm9pZCBkZWZpQ29tcG9uZW50X3ByaW50IChjb25zdCBkZWZpQ29tcG9uZW50KiBvYmosIEZJTEUqICBmb3V0KTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZpRGVidWcuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZmlEZWJ1Zy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzNiMTEzLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZmlEZWJ1Zy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBBVFRFTlRJT046IFRISVMgSVMgQU4gQVVUTy1HRU5FUkFURUQgRklMRS4gRE8gTk9UIENIQU5HRSBJVCEgICAgICAgICAgICAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBDb3B5cmlnaHQgMjAxMywgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlICAgICAgICAgICAgICovCi0vKiBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAgICAgICAgICAgICovCi0vKiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICAgICAgICAqLwotLyogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICovCi0vKiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAgICAgICAqLwotLyogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgICAgKi8KLS8qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgICAgICovCi0vKiAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksICAgICAgICAgICovCi0vKiBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkQXV0aG9yOiBkZWxsICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJFJldmlzaW9uOiAjMSAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICREYXRlOiAyMDE3LzA2LzA2ICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkU3RhdGU6ICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotCi0jaWZuZGVmIENERUZJREVCVUdfSAotI2RlZmluZSBDREVGSURFQlVHX0gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiZGVmaVR5cGVkZWZzLmgiCi0KLS8qIFNldCBmbGFnICovCi1FWFRFUk4gdm9pZCBkZWZpU2V0RGVidWcgKGludCAgbnVtLCBpbnQgIHZhbHVlKTsKLQotLyogUmVhZCBmbGFnICovCi1FWFRFUk4gaW50IGRlZmlEZWJ1ZyAoaW50ICBudW0pOwotCi0vKiBFcnJvciBsb2dnaW4gZnVuY3Rpb24gKi8KLUVYVEVSTiB2b2lkIGRlZmlFcnJvciAoaW50ICBjaGVjaywgaW50ICBtc2dOdW0sIGNvbnN0IGNoYXIqICBtZXNzYWdlKTsKLQotLyogZm9yIGF1dG8gdXBzaGlmdGluZyBuYW1lcyBpbiBjYXNlIGluc2Vuc2l0aXZlIGZpbGVzICovCi1FWFRFUk4gY29uc3QgY2hhciogdXBwZXJDYXNlIChjb25zdCBjaGFyKiAgYyk7Ci1FWFRFUk4gY29uc3QgY2hhciogREVGQ0FTRSAoY29uc3QgY2hhciogIGNoKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZpRGVmcy5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYvZGVmaURlZnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBiY2QxYy4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZpRGVmcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAyMDEyLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIENhZGVuY2UgTEVGL0RFRiBPcGVuIFNvdXJjZSBEaXN0cmlidXRpb24sCi0gKiBQcm9kdWN0IFZlcnNpb24gNS44LiAKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgCi0gKiBpbXBsaWVkLgotICoKLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogCi0gKiBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotICogY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotICoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBUSEUgRklMRSBXQVMgT0JTT0xFVEVEIElOIExFRi9ERUYgNS44Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYvZGVmaUZQQy5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYvZGVmaUZQQy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjNjMDU4Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZmlGUEMuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQ29weXJpZ2h0IDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZSAgICAgICAgICAgICAqLwotLyogRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAqLwotLyogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgKi8KLS8qICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAqLwotLyogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgKi8KLS8qICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgICAgICovCi0vKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgICAgICAqLwotLyogICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LCAgICAgICAgICAqLwotLyogY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJEF1dGhvcjogZGVsbCAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkUmV2aXNpb246ICMxICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkRGF0ZTogMjAxNy8wNi8wNiAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRTdGF0ZTogICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0KLSNpZm5kZWYgQ0RFRklGUENfSAotI2RlZmluZSBDREVGSUZQQ19ICi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImRlZmlUeXBlZGVmcy5oIgotCi1FWFRFUk4gY29uc3QgY2hhciogZGVmaUZQQ19uYW1lIChjb25zdCBkZWZpRlBDKiBvYmopOwotRVhURVJOIGludCBkZWZpRlBDX2lzVmVydGljYWwgKGNvbnN0IGRlZmlGUEMqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlGUENfaXNIb3Jpem9udGFsIChjb25zdCBkZWZpRlBDKiBvYmopOwotRVhURVJOIGludCBkZWZpRlBDX2hhc0FsaWduIChjb25zdCBkZWZpRlBDKiBvYmopOwotRVhURVJOIGludCBkZWZpRlBDX2hhc01heCAoY29uc3QgZGVmaUZQQyogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaUZQQ19oYXNNaW4gKGNvbnN0IGRlZmlGUEMqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlGUENfaGFzRXF1YWwgKGNvbnN0IGRlZmlGUEMqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGRlZmlGUENfYWxpZ25NYXggKGNvbnN0IGRlZmlGUEMqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGRlZmlGUENfYWxpZ25NaW4gKGNvbnN0IGRlZmlGUEMqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGRlZmlGUENfZXF1YWwgKGNvbnN0IGRlZmlGUEMqIG9iaik7Ci0KLUVYVEVSTiBpbnQgZGVmaUZQQ19udW1QYXJ0cyAoY29uc3QgZGVmaUZQQyogb2JqKTsKLQotICAvKiBSZXR1cm4gdGhlIGNvbnN0cmFpbnQgbnVtYmVyICJpbmRleCIgd2hlcmUgaW5kZXggaXMgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnJvbSAwIHRvIG51bVBhcnRzKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSByZXR1cm5lZCBjb3JuZXIgaXMgJ0InIGZvciBib3R0b20gbGVmdCAgJ1QnIGZvciB0b3ByaWdodCAgICAgICAgICAgICAqLwotICAvKiBUaGUgcmV0dXJuZWQgdHlwIGlzICdSJyBmb3Igcm93cyAgICdDJyBmb3IgY29tcHMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIHJldHVybmVkIGNoYXIqIHBvaW50cyB0byBuYW1lIG9mIHRoZSBpdGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gdm9pZCBkZWZpRlBDX2dldFBhcnQgKGNvbnN0IGRlZmlGUEMqIG9iaiwgaW50ICBpbmRleCwgaW50KiAgY29ybmVyLCBpbnQqICB0eXAsIGNoYXIqKiAgbmFtZSk7Ci0KLSAgLyogZGVidWcgcHJpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gdm9pZCBkZWZpRlBDX3ByaW50IChjb25zdCBkZWZpRlBDKiBvYmosIEZJTEUqICBmKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZpRmlsbC5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYvZGVmaUZpbGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAxNmIxMC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZpRmlsbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBBVFRFTlRJT046IFRISVMgSVMgQU4gQVVUTy1HRU5FUkFURUQgRklMRS4gRE8gTk9UIENIQU5HRSBJVCEgICAgICAgICAgICAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBDb3B5cmlnaHQgMjAxMywgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlICAgICAgICAgICAgICovCi0vKiBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAgICAgICAgICAgICovCi0vKiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICAgICAgICAqLwotLyogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICovCi0vKiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAgICAgICAqLwotLyogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgICAgKi8KLS8qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgICAgICovCi0vKiAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksICAgICAgICAgICovCi0vKiBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkQXV0aG9yOiBkZWxsICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRSZXZpc2lvbjogIzEgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICREYXRlOiAyMDE3LzA2LzA2ICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJFN0YXRlOiAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLQotI2lmbmRlZiBDREVGSUZJTExfSAotI2RlZmluZSBDREVGSUZJTExfSAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJkZWZpVHlwZWRlZnMuaCIKLQotRVhURVJOIGludCBkZWZpRmlsbF9oYXNMYXllciAoY29uc3QgZGVmaUZpbGwqIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaUZpbGxfbGF5ZXJOYW1lIChjb25zdCBkZWZpRmlsbCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaUZpbGxfaGFzTGF5ZXJPcGMgKGNvbnN0IGRlZmlGaWxsKiBvYmopOwotCi1FWFRFUk4gaW50IGRlZmlGaWxsX2xheWVyTWFzayAoY29uc3QgZGVmaUZpbGwqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlGaWxsX3ZpYVRvcE1hc2sgKGNvbnN0IGRlZmlGaWxsKiBvYmopOwotRVhURVJOIGludCBkZWZpRmlsbF92aWFDdXRNYXNrIChjb25zdCBkZWZpRmlsbCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaUZpbGxfdmlhQm90dG9tTWFzayAoY29uc3QgZGVmaUZpbGwqIG9iaik7Ci0KLUVYVEVSTiBpbnQgZGVmaUZpbGxfbnVtUmVjdGFuZ2xlcyAoY29uc3QgZGVmaUZpbGwqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlGaWxsX3hsIChjb25zdCBkZWZpRmlsbCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgZGVmaUZpbGxfeWwgKGNvbnN0IGRlZmlGaWxsKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpRmlsbF94aCAoY29uc3QgZGVmaUZpbGwqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlGaWxsX3loIChjb25zdCBkZWZpRmlsbCogb2JqLCBpbnQgIGluZGV4KTsKLQotRVhURVJOIGludCBkZWZpRmlsbF9udW1Qb2x5Z29ucyAoY29uc3QgZGVmaUZpbGwqIG9iaik7Ci1FWFRFUk4gc3RydWN0IGRlZmlQb2ludHMgZGVmaUZpbGxfZ2V0UG9seWdvbiAoY29uc3QgZGVmaUZpbGwqIG9iaiwgaW50ICBpbmRleCk7Ci0KLUVYVEVSTiBpbnQgZGVmaUZpbGxfaGFzVmlhIChjb25zdCBkZWZpRmlsbCogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpRmlsbF92aWFOYW1lIChjb25zdCBkZWZpRmlsbCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaUZpbGxfaGFzVmlhT3BjIChjb25zdCBkZWZpRmlsbCogb2JqKTsKLQotRVhURVJOIGludCBkZWZpRmlsbF9udW1WaWFQdHMgKGNvbnN0IGRlZmlGaWxsKiBvYmopOwotRVhURVJOIHN0cnVjdCBkZWZpUG9pbnRzIGRlZmlGaWxsX2dldFZpYVB0cyAoY29uc3QgZGVmaUZpbGwqIG9iaiwgaW50ICBpbmRleCk7Ci0KLUVYVEVSTiB2b2lkIGRlZmlGaWxsX3ByaW50IChjb25zdCBkZWZpRmlsbCogb2JqLCBGSUxFKiAgZik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYvZGVmaUdyb3VwLmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZpR3JvdXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk2NGViZS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZpR3JvdXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQ29weXJpZ2h0IDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZSAgICAgICAgICAgICAqLwotLyogRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAqLwotLyogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgKi8KLS8qICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAqLwotLyogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgKi8KLS8qICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgICAgICovCi0vKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgICAgICAqLwotLyogICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LCAgICAgICAgICAqLwotLyogY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJEF1dGhvcjogZGVsbCAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkUmV2aXNpb246ICMxICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkRGF0ZTogMjAxNy8wNi8wNiAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRTdGF0ZTogICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0KLSNpZm5kZWYgQ0RFRklHUk9VUF9ICi0jZGVmaW5lIENERUZJR1JPVVBfSAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJkZWZpVHlwZWRlZnMuaCIKLQotLyogU3RydWN0IGhvbGRzIHRoZSBkYXRhIGZvciBvbmUgcHJvcGVydHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlHcm91cF9uYW1lIChjb25zdCBkZWZpR3JvdXAqIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaUdyb3VwX3JlZ2lvbk5hbWUgKGNvbnN0IGRlZmlHcm91cCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaUdyb3VwX2hhc1JlZ2lvbkJveCAoY29uc3QgZGVmaUdyb3VwKiBvYmopOwotRVhURVJOIGludCBkZWZpR3JvdXBfaGFzUmVnaW9uTmFtZSAoY29uc3QgZGVmaUdyb3VwKiBvYmopOwotRVhURVJOIGludCBkZWZpR3JvdXBfaGFzTWF4WCAoY29uc3QgZGVmaUdyb3VwKiBvYmopOwotRVhURVJOIGludCBkZWZpR3JvdXBfaGFzTWF4WSAoY29uc3QgZGVmaUdyb3VwKiBvYmopOwotRVhURVJOIGludCBkZWZpR3JvdXBfaGFzUGVyaW0gKGNvbnN0IGRlZmlHcm91cCogb2JqKTsKLUVYVEVSTiB2b2lkIGRlZmlHcm91cF9yZWdpb25SZWN0cyAoY29uc3QgZGVmaUdyb3VwKiBvYmosIGludCogIHNpemUsIGludCoqICB4bCwgaW50KiogeWwsIGludCoqICB4aCwgaW50KiogIHloKTsKLUVYVEVSTiBpbnQgZGVmaUdyb3VwX21heFggKGNvbnN0IGRlZmlHcm91cCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaUdyb3VwX21heFkgKGNvbnN0IGRlZmlHcm91cCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaUdyb3VwX3BlcmltIChjb25zdCBkZWZpR3JvdXAqIG9iaik7Ci0KLUVYVEVSTiBpbnQgZGVmaUdyb3VwX251bVByb3BzIChjb25zdCBkZWZpR3JvdXAqIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaUdyb3VwX3Byb3BOYW1lIChjb25zdCBkZWZpR3JvdXAqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaUdyb3VwX3Byb3BWYWx1ZSAoY29uc3QgZGVmaUdyb3VwKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGRvdWJsZSBkZWZpR3JvdXBfcHJvcE51bWJlciAoY29uc3QgZGVmaUdyb3VwKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGNvbnN0IGNoYXIgZGVmaUdyb3VwX3Byb3BUeXBlIChjb25zdCBkZWZpR3JvdXAqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlHcm91cF9wcm9wSXNOdW1iZXIgKGNvbnN0IGRlZmlHcm91cCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgZGVmaUdyb3VwX3Byb3BJc1N0cmluZyAoY29uc3QgZGVmaUdyb3VwKiBvYmosIGludCAgaW5kZXgpOwotCi0gIC8qIGRlYnVnIHByaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIHZvaWQgZGVmaUdyb3VwX3ByaW50IChjb25zdCBkZWZpR3JvdXAqIG9iaiwgRklMRSogIGYpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZmlJT1RpbWluZy5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYvZGVmaUlPVGltaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMDY0NDMuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYvZGVmaUlPVGltaW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qIEFUVEVOVElPTjogVEhJUyBJUyBBTiBBVVRPLUdFTkVSQVRFRCBGSUxFLiBETyBOT1QgQ0hBTkdFIElUISAgICAgICAgICAgICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qIENvcHlyaWdodCAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UgICAgICAgICAgICAgKi8KLS8qIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7ICAgICAgICAgICAgKi8KLS8qICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gICAgICAgICovCi0vKiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAgICAgKi8KLS8qICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsICAgICAgICovCi0vKiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICAgICAqLwotLyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICAgICAgKi8KLS8qICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwgICAgICAgICAgKi8KLS8qIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRBdXRob3I6IGRlbGwgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJFJldmlzaW9uOiAjMSAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJERhdGU6IDIwMTcvMDYvMDYgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkU3RhdGU6ICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotCi0jaWZuZGVmIENERUZJSU9USU1JTkdfSAotI2RlZmluZSBDREVGSUlPVElNSU5HX0gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiZGVmaVR5cGVkZWZzLmgiCi0KLUVYVEVSTiBpbnQgZGVmaUlPVGltaW5nX2hhc1ZhcmlhYmxlUmlzZSAoY29uc3QgZGVmaUlPVGltaW5nKiBvYmopOwotRVhURVJOIGludCBkZWZpSU9UaW1pbmdfaGFzVmFyaWFibGVGYWxsIChjb25zdCBkZWZpSU9UaW1pbmcqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlJT1RpbWluZ19oYXNTbGV3UmlzZSAoY29uc3QgZGVmaUlPVGltaW5nKiBvYmopOwotRVhURVJOIGludCBkZWZpSU9UaW1pbmdfaGFzU2xld0ZhbGwgKGNvbnN0IGRlZmlJT1RpbWluZyogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaUlPVGltaW5nX2hhc0NhcGFjaXRhbmNlIChjb25zdCBkZWZpSU9UaW1pbmcqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlJT1RpbWluZ19oYXNEcml2ZUNlbGwgKGNvbnN0IGRlZmlJT1RpbWluZyogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaUlPVGltaW5nX2hhc0Zyb20gKGNvbnN0IGRlZmlJT1RpbWluZyogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaUlPVGltaW5nX2hhc1RvIChjb25zdCBkZWZpSU9UaW1pbmcqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlJT1RpbWluZ19oYXNQYXJhbGxlbCAoY29uc3QgZGVmaUlPVGltaW5nKiBvYmopOwotCi1FWFRFUk4gY29uc3QgY2hhciogZGVmaUlPVGltaW5nX2luc3QgKGNvbnN0IGRlZmlJT1RpbWluZyogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpSU9UaW1pbmdfcGluIChjb25zdCBkZWZpSU9UaW1pbmcqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGRlZmlJT1RpbWluZ192YXJpYWJsZUZhbGxNaW4gKGNvbnN0IGRlZmlJT1RpbWluZyogb2JqKTsKLUVYVEVSTiBkb3VibGUgZGVmaUlPVGltaW5nX3ZhcmlhYmxlUmlzZU1pbiAoY29uc3QgZGVmaUlPVGltaW5nKiBvYmopOwotRVhURVJOIGRvdWJsZSBkZWZpSU9UaW1pbmdfdmFyaWFibGVGYWxsTWF4IChjb25zdCBkZWZpSU9UaW1pbmcqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGRlZmlJT1RpbWluZ192YXJpYWJsZVJpc2VNYXggKGNvbnN0IGRlZmlJT1RpbWluZyogb2JqKTsKLUVYVEVSTiBkb3VibGUgZGVmaUlPVGltaW5nX3NsZXdGYWxsTWluIChjb25zdCBkZWZpSU9UaW1pbmcqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGRlZmlJT1RpbWluZ19zbGV3UmlzZU1pbiAoY29uc3QgZGVmaUlPVGltaW5nKiBvYmopOwotRVhURVJOIGRvdWJsZSBkZWZpSU9UaW1pbmdfc2xld0ZhbGxNYXggKGNvbnN0IGRlZmlJT1RpbWluZyogb2JqKTsKLUVYVEVSTiBkb3VibGUgZGVmaUlPVGltaW5nX3NsZXdSaXNlTWF4IChjb25zdCBkZWZpSU9UaW1pbmcqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGRlZmlJT1RpbWluZ19jYXBhY2l0YW5jZSAoY29uc3QgZGVmaUlPVGltaW5nKiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlJT1RpbWluZ19kcml2ZUNlbGwgKGNvbnN0IGRlZmlJT1RpbWluZyogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpSU9UaW1pbmdfZnJvbSAoY29uc3QgZGVmaUlPVGltaW5nKiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlJT1RpbWluZ190byAoY29uc3QgZGVmaUlPVGltaW5nKiBvYmopOwotRVhURVJOIGRvdWJsZSBkZWZpSU9UaW1pbmdfcGFyYWxsZWwgKGNvbnN0IGRlZmlJT1RpbWluZyogb2JqKTsKLQotICAvKiBkZWJ1ZyBwcmludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiB2b2lkIGRlZmlJT1RpbWluZ19wcmludCAoY29uc3QgZGVmaUlPVGltaW5nKiBvYmosIEZJTEUqICBmKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZpS1JEZWZzLmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZpS1JEZWZzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYmNkMWMuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYvZGVmaUtSRGVmcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAyMDEyLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIENhZGVuY2UgTEVGL0RFRiBPcGVuIFNvdXJjZSBEaXN0cmlidXRpb24sCi0gKiBQcm9kdWN0IFZlcnNpb24gNS44LiAKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgCi0gKiBpbXBsaWVkLgotICoKLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogCi0gKiBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotICogY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotICoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBUSEUgRklMRSBXQVMgT0JTT0xFVEVEIElOIExFRi9ERUYgNS44Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYvZGVmaU1pc2MuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZmlNaXNjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYjBlZWQuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYvZGVmaU1pc2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQ29weXJpZ2h0IDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZSAgICAgICAgICAgICAqLwotLyogRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAqLwotLyogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgKi8KLS8qICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAqLwotLyogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgKi8KLS8qICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgICAgICovCi0vKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgICAgICAqLwotLyogICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LCAgICAgICAgICAqLwotLyogY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJEF1dGhvcjogZGVsbCAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkUmV2aXNpb246ICMxICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkRGF0ZTogMjAxNy8wNi8wNiAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRTdGF0ZTogICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0KLSNpZm5kZWYgQ0RFRklNSVNDX0gKLSNkZWZpbmUgQ0RFRklNSVNDX0gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiZGVmaVR5cGVkZWZzLmgiCi0KLUVYVEVSTiBpbnQgZGVmaUdlb21ldHJpZXNfbnVtUG9pbnRzIChjb25zdCBkZWZpR2VvbWV0cmllcyogb2JqKTsKLUVYVEVSTiB2b2lkIGRlZmlHZW9tZXRyaWVzX3BvaW50cyAoY29uc3QgZGVmaUdlb21ldHJpZXMqIG9iaiwgaW50ICBpbmRleCwgaW50KiAgeCwgaW50KiAgeSk7Ci0KLUVYVEVSTiBpbnQgZGVmaVN0eWxlc19zdHlsZSAoY29uc3QgZGVmaVN0eWxlcyogb2JqKTsKLUVYVEVSTiBzdHJ1Y3QgZGVmaVBvaW50cyBkZWZpU3R5bGVzX2dldFBvbHlnb24gKGNvbnN0IGRlZmlTdHlsZXMqIG9iaik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYvZGVmaU5ldC5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYvZGVmaU5ldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTUyYmZjLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZmlOZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qIEFUVEVOVElPTjogVEhJUyBJUyBBTiBBVVRPLUdFTkVSQVRFRCBGSUxFLiBETyBOT1QgQ0hBTkdFIElUISAgICAgICAgICAgICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qIENvcHlyaWdodCAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UgICAgICAgICAgICAgKi8KLS8qIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7ICAgICAgICAgICAgKi8KLS8qICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gICAgICAgICovCi0vKiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAgICAgKi8KLS8qICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsICAgICAgICovCi0vKiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICAgICAqLwotLyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICAgICAgKi8KLS8qICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwgICAgICAgICAgKi8KLS8qIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRBdXRob3I6IGRlbGwgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJFJldmlzaW9uOiAjMSAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJERhdGU6IDIwMTcvMDYvMDYgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkU3RhdGU6ICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotCi0jaWZuZGVmIENERUZJTkVUX0gKLSNkZWZpbmUgQ0RFRklORVRfSAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJkZWZpVHlwZWRlZnMuaCIKLQotLyogUmV0dXJuIGNvZGVzIGZvciBkZWZpTmV0Ojp2aWFPcmllbnQgCi0gICAgREVGX09SSUVOVF9OICAwCi0gICAgREVGX09SSUVOVF9XICAxCi0gICAgREVGX09SSUVOVF9TICAyCi0gICAgREVGX09SSUVOVF9FICAzCi0gICAgREVGX09SSUVOVF9GTiA0Ci0gICAgREVGX09SSUVOVF9GVyA1Ci0gICAgREVGX09SSUVOVF9GUyA2Ci0gICAgREVGX09SSUVOVF9GRSA3Ci0qLwotCi1FWFRFUk4gY29uc3QgY2hhciogZGVmaVdpcmVfd2lyZVR5cGUgKGNvbnN0IGRlZmlXaXJlKiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlXaXJlX3dpcmVTaGllbGROZXROYW1lIChjb25zdCBkZWZpV2lyZSogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaVdpcmVfbnVtUGF0aHMgKGNvbnN0IGRlZmlXaXJlKiBvYmopOwotCi1FWFRFUk4gY29uc3QgZGVmaVBhdGgqIGRlZmlXaXJlX3BhdGggKGNvbnN0IGRlZmlXaXJlKiBvYmosIGludCAgaW5kZXgpOwotCi0gIC8qIFdNRCAtLSB0aGUgZm9sbG93aW5nIHdpbGwgYmUgcmVtb3ZlZCBieSB0aGUgbmV4dCByZWxlYXNlICAgICAgICAgICAgICAgICAqLwotCi0gIC8qIE5FVzogYSBuZXQgY2FuIGhhdmUgbW9yZSB0aGFuIDEgd2lyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIC8qIERlYnVnIHByaW50aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIHZvaWQgZGVmaVN1Ym5ldF9wcmludCAoY29uc3QgZGVmaVN1Ym5ldCogb2JqLCBGSUxFKiAgZik7Ci0KLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpU3VibmV0X25hbWUgKGNvbnN0IGRlZmlTdWJuZXQqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlTdWJuZXRfbnVtQ29ubmVjdGlvbnMgKGNvbnN0IGRlZmlTdWJuZXQqIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaVN1Ym5ldF9pbnN0YW5jZSAoY29uc3QgZGVmaVN1Ym5ldCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpU3VibmV0X3BpbiAoY29uc3QgZGVmaVN1Ym5ldCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgZGVmaVN1Ym5ldF9waW5Jc1N5bnRoZXNpemVkIChjb25zdCBkZWZpU3VibmV0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpU3VibmV0X3BpbklzTXVzdEpvaW4gKGNvbnN0IGRlZmlTdWJuZXQqIG9iaiwgaW50ICBpbmRleCk7Ci0KLSAgLyogV01EIC0tIHRoZSBmb2xsb3dpbmcgd2lsbCBiZSByZW1vdmVkIGJ5IHRoZSBuZXh0IHJlbGVhc2UgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGRlZmlTdWJuZXRfaXNGaXhlZCAoY29uc3QgZGVmaVN1Ym5ldCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaVN1Ym5ldF9pc1JvdXRlZCAoY29uc3QgZGVmaVN1Ym5ldCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaVN1Ym5ldF9pc0NvdmVyIChjb25zdCBkZWZpU3VibmV0KiBvYmopOwotCi1FWFRFUk4gaW50IGRlZmlTdWJuZXRfaGFzTm9uRGVmYXVsdFJ1bGUgKGNvbnN0IGRlZmlTdWJuZXQqIG9iaik7Ci0KLSAgLyogV01EIC0tIHRoZSBmb2xsb3dpbmcgd2lsbCBiZSByZW1vdmVkIGJ5IHRoZSBuZXh0IHJlbGVhc2UgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGRlZmlTdWJuZXRfbnVtUGF0aHMgKGNvbnN0IGRlZmlTdWJuZXQqIG9iaik7Ci1FWFRFUk4gY29uc3QgZGVmaVBhdGgqIGRlZmlTdWJuZXRfcGF0aCAoY29uc3QgZGVmaVN1Ym5ldCogb2JqLCBpbnQgIGluZGV4KTsKLQotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlTdWJuZXRfbm9uRGVmYXVsdFJ1bGUgKGNvbnN0IGRlZmlTdWJuZXQqIG9iaik7Ci0KLUVYVEVSTiBpbnQgZGVmaVN1Ym5ldF9udW1XaXJlcyAoY29uc3QgZGVmaVN1Ym5ldCogb2JqKTsKLUVYVEVSTiBjb25zdCBkZWZpV2lyZSogZGVmaVN1Ym5ldF93aXJlIChjb25zdCBkZWZpU3VibmV0KiBvYmosIGludCAgaW5kZXgpOwotCi0gIC8qIFdNRCAtLSB0aGUgZm9sbG93aW5nIHdpbGwgYmUgcmVtb3ZlZCBieSB0aGUgbmV4dCByZWxlYXNlICAgICAgICAgICAgICAgICAqLwotCi1FWFRFUk4gaW50IGRlZmlWcGluX3hsIChjb25zdCBkZWZpVnBpbiogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaVZwaW5feWwgKGNvbnN0IGRlZmlWcGluKiBvYmopOwotRVhURVJOIGludCBkZWZpVnBpbl94aCAoY29uc3QgZGVmaVZwaW4qIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlWcGluX3loIChjb25zdCBkZWZpVnBpbiogb2JqKTsKLUVYVEVSTiBjaGFyIGRlZmlWcGluX3N0YXR1cyAoY29uc3QgZGVmaVZwaW4qIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlWcGluX29yaWVudCAoY29uc3QgZGVmaVZwaW4qIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaVZwaW5fb3JpZW50U3RyIChjb25zdCBkZWZpVnBpbiogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaVZwaW5feExvYyAoY29uc3QgZGVmaVZwaW4qIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlWcGluX3lMb2MgKGNvbnN0IGRlZmlWcGluKiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlWcGluX25hbWUgKGNvbnN0IGRlZmlWcGluKiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlWcGluX2xheWVyIChjb25zdCBkZWZpVnBpbiogb2JqKTsKLQotLyogUHJlIDUuNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlTaGllbGRfc2hpZWxkTmFtZSAoY29uc3QgZGVmaVNoaWVsZCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaVNoaWVsZF9udW1QYXRocyAoY29uc3QgZGVmaVNoaWVsZCogb2JqKTsKLQotRVhURVJOIGNvbnN0IGRlZmlQYXRoKiBkZWZpU2hpZWxkX3BhdGggKGNvbnN0IGRlZmlTaGllbGQqIG9iaiwgaW50ICBpbmRleCk7Ci0KLS8qIFN0cnVjdCBob2xkcyB0aGUgZGF0YSBmb3Igb25lIGNvbXBvbmVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogUm91dGluZXMgdXNlZCBieSBZQUNDIHRvIHNldCB0aGUgZmllbGRzIGluIHRoZSBuZXQuICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogV01EIC0tIHRoZSBmb2xsb3dpbmcgd2lsbCBiZSByZW1vdmVkIGJ5IHRoZSBuZXh0IHJlbGVhc2UgICAgICAgICAgICAgICAgICovCi0KLSAgLyogTkVXOiBhIG5ldCBjYW4gaGF2ZSBtb3JlIHRoYW4gMSB3aXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogNS42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogRm9yIE9BIHRvIG1vZGlmeSB0aGUgbmV0TmFtZSwgaWQgJiBwaW5OYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogUm91dGluZXMgdG8gcmV0dXJuIHRoZSB2YWx1ZSBvZiBuZXQgZGF0YS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gY29uc3QgY2hhciogZGVmaU5ldF9uYW1lIChjb25zdCBkZWZpTmV0KiBvYmopOwotRVhURVJOIGludCBkZWZpTmV0X3dlaWdodCAoY29uc3QgZGVmaU5ldCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaU5ldF9udW1Qcm9wcyAoY29uc3QgZGVmaU5ldCogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpTmV0X3Byb3BOYW1lIChjb25zdCBkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlOZXRfcHJvcFZhbHVlIChjb25zdCBkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGRvdWJsZSBkZWZpTmV0X3Byb3BOdW1iZXIgKGNvbnN0IGRlZmlOZXQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY29uc3QgY2hhciBkZWZpTmV0X3Byb3BUeXBlIChjb25zdCBkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpTmV0X3Byb3BJc051bWJlciAoY29uc3QgZGVmaU5ldCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgZGVmaU5ldF9wcm9wSXNTdHJpbmcgKGNvbnN0IGRlZmlOZXQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlOZXRfbnVtQ29ubmVjdGlvbnMgKGNvbnN0IGRlZmlOZXQqIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaU5ldF9pbnN0YW5jZSAoY29uc3QgZGVmaU5ldCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpTmV0X3BpbiAoY29uc3QgZGVmaU5ldCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgZGVmaU5ldF9waW5Jc011c3RKb2luIChjb25zdCBkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpTmV0X3BpbklzU3ludGhlc2l6ZWQgKGNvbnN0IGRlZmlOZXQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlOZXRfbnVtU3VibmV0cyAoY29uc3QgZGVmaU5ldCogb2JqKTsKLQotRVhURVJOIGNvbnN0IGRlZmlTdWJuZXQqIGRlZmlOZXRfc3VibmV0IChjb25zdCBkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpOwotCi0gIC8qIFdNRCAtLSB0aGUgZm9sbG93aW5nIHdpbGwgYmUgcmVtb3ZlZCBieSB0aGUgbmV4dCByZWxlYXNlICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBkZWZpTmV0X2lzRml4ZWQgKGNvbnN0IGRlZmlOZXQqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlOZXRfaXNSb3V0ZWQgKGNvbnN0IGRlZmlOZXQqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlOZXRfaXNDb3ZlciAoY29uc3QgZGVmaU5ldCogb2JqKTsKLQotICAvKiBUaGUgZm9sbG93aW5nIHJvdXRpbmVzIGFyZSBmb3Igd2lyaW5nICovCi1FWFRFUk4gaW50IGRlZmlOZXRfbnVtV2lyZXMgKGNvbnN0IGRlZmlOZXQqIG9iaik7Ci0KLUVYVEVSTiBjb25zdCBkZWZpV2lyZSogZGVmaU5ldF93aXJlIChjb25zdCBkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpOwotCi0gIC8qIFJvdXRpbmVzIHRvIGdldCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgVmlydHVhbCBQaW5zLiAqLwotRVhURVJOIGludCBkZWZpTmV0X251bVZwaW5zIChjb25zdCBkZWZpTmV0KiBvYmopOwotCi1FWFRFUk4gY29uc3QgZGVmaVZwaW4qIGRlZmlOZXRfdnBpbiAoY29uc3QgZGVmaU5ldCogb2JqLCBpbnQgIGluZGV4KTsKLQotRVhURVJOIGludCBkZWZpTmV0X2hhc1Byb3BzIChjb25zdCBkZWZpTmV0KiBvYmopOwotRVhURVJOIGludCBkZWZpTmV0X2hhc1dlaWdodCAoY29uc3QgZGVmaU5ldCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaU5ldF9oYXNTdWJuZXRzIChjb25zdCBkZWZpTmV0KiBvYmopOwotRVhURVJOIGludCBkZWZpTmV0X2hhc1NvdXJjZSAoY29uc3QgZGVmaU5ldCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaU5ldF9oYXNGaXhlZGJ1bXAgKGNvbnN0IGRlZmlOZXQqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlOZXRfaGFzRnJlcXVlbmN5IChjb25zdCBkZWZpTmV0KiBvYmopOwotRVhURVJOIGludCBkZWZpTmV0X2hhc1BhdHRlcm4gKGNvbnN0IGRlZmlOZXQqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlOZXRfaGFzT3JpZ2luYWwgKGNvbnN0IGRlZmlOZXQqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlOZXRfaGFzQ2FwIChjb25zdCBkZWZpTmV0KiBvYmopOwotRVhURVJOIGludCBkZWZpTmV0X2hhc1VzZSAoY29uc3QgZGVmaU5ldCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaU5ldF9oYXNTdHlsZSAoY29uc3QgZGVmaU5ldCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaU5ldF9oYXNOb25EZWZhdWx0UnVsZSAoY29uc3QgZGVmaU5ldCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaU5ldF9oYXNWb2x0YWdlIChjb25zdCBkZWZpTmV0KiBvYmopOwotRVhURVJOIGludCBkZWZpTmV0X2hhc1NwYWNpbmdSdWxlcyAoY29uc3QgZGVmaU5ldCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaU5ldF9oYXNXaWR0aFJ1bGVzIChjb25zdCBkZWZpTmV0KiBvYmopOwotRVhURVJOIGludCBkZWZpTmV0X2hhc1hUYWxrIChjb25zdCBkZWZpTmV0KiBvYmopOwotCi1FWFRFUk4gaW50IGRlZmlOZXRfbnVtU3BhY2luZ1J1bGVzIChjb25zdCBkZWZpTmV0KiBvYmopOwotRVhURVJOIHZvaWQgZGVmaU5ldF9zcGFjaW5nUnVsZSAoY29uc3QgZGVmaU5ldCogb2JqLCBpbnQgIGluZGV4LCBjaGFyKiogIGxheWVyLCBkb3VibGUqICBkaXN0LCBkb3VibGUqICBsZWZ0LCBkb3VibGUqICByaWdodCk7Ci1FWFRFUk4gaW50IGRlZmlOZXRfbnVtV2lkdGhSdWxlcyAoY29uc3QgZGVmaU5ldCogb2JqKTsKLUVYVEVSTiB2b2lkIGRlZmlOZXRfd2lkdGhSdWxlIChjb25zdCBkZWZpTmV0KiBvYmosIGludCAgaW5kZXgsIGNoYXIqKiAgbGF5ZXIsIGRvdWJsZSogIGRpc3QpOwotRVhURVJOIGRvdWJsZSBkZWZpTmV0X3ZvbHRhZ2UgKGNvbnN0IGRlZmlOZXQqIG9iaik7Ci0KLUVYVEVSTiBpbnQgZGVmaU5ldF9YVGFsayAoY29uc3QgZGVmaU5ldCogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpTmV0X3NvdXJjZSAoY29uc3QgZGVmaU5ldCogb2JqKTsKLUVYVEVSTiBkb3VibGUgZGVmaU5ldF9mcmVxdWVuY3kgKGNvbnN0IGRlZmlOZXQqIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaU5ldF9vcmlnaW5hbCAoY29uc3QgZGVmaU5ldCogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpTmV0X3BhdHRlcm4gKGNvbnN0IGRlZmlOZXQqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGRlZmlOZXRfY2FwIChjb25zdCBkZWZpTmV0KiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlOZXRfdXNlIChjb25zdCBkZWZpTmV0KiBvYmopOwotRVhURVJOIGludCBkZWZpTmV0X3N0eWxlIChjb25zdCBkZWZpTmV0KiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlOZXRfbm9uRGVmYXVsdFJ1bGUgKGNvbnN0IGRlZmlOZXQqIG9iaik7Ci0KLSAgLyogV01EIC0tIHRoZSBmb2xsb3dpbmcgd2lsbCBiZSByZW1vdmVkIGJ5IHRoZSBuZXh0IHJlbGVhc2UgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGRlZmlOZXRfbnVtUGF0aHMgKGNvbnN0IGRlZmlOZXQqIG9iaik7Ci0KLUVYVEVSTiBjb25zdCBkZWZpUGF0aCogZGVmaU5ldF9wYXRoIChjb25zdCBkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpOwotCi1FWFRFUk4gaW50IGRlZmlOZXRfbnVtU2hpZWxkcyAoY29uc3QgZGVmaU5ldCogb2JqKTsKLQotRVhURVJOIGNvbnN0IGRlZmlTaGllbGQqIGRlZmlOZXRfc2hpZWxkIChjb25zdCBkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpOwotCi1FWFRFUk4gaW50IGRlZmlOZXRfbnVtU2hpZWxkTmV0cyAoY29uc3QgZGVmaU5ldCogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpTmV0X3NoaWVsZE5ldCAoY29uc3QgZGVmaU5ldCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgZGVmaU5ldF9udW1Ob1NoaWVsZHMgKGNvbnN0IGRlZmlOZXQqIG9iaik7Ci0KLUVYVEVSTiBjb25zdCBkZWZpU2hpZWxkKiBkZWZpTmV0X25vU2hpZWxkIChjb25zdCBkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpOwotCi0gIC8qIDUuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBkZWZpTmV0X251bVBvbHlnb25zIChjb25zdCBkZWZpTmV0KiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlOZXRfcG9seWdvbk5hbWUgKGNvbnN0IGRlZmlOZXQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gc3RydWN0IGRlZmlQb2ludHMgZGVmaU5ldF9nZXRQb2x5Z29uIChjb25zdCBkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpTmV0X3BvbHlNYXNrIChjb25zdCBkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlOZXRfcG9seVJvdXRlU3RhdHVzIChjb25zdCBkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlOZXRfcG9seVJvdXRlU3RhdHVzU2hpZWxkTmFtZSAoY29uc3QgZGVmaU5ldCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpTmV0X3BvbHlTaGFwZVR5cGUgKGNvbnN0IGRlZmlOZXQqIG9iaiwgaW50ICBpbmRleCk7Ci0KLUVYVEVSTiBpbnQgZGVmaU5ldF9udW1SZWN0YW5nbGVzIChjb25zdCBkZWZpTmV0KiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlOZXRfcmVjdE5hbWUgKGNvbnN0IGRlZmlOZXQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlOZXRfeGwgKGNvbnN0IGRlZmlOZXQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlOZXRfeWwgKGNvbnN0IGRlZmlOZXQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlOZXRfeGggKGNvbnN0IGRlZmlOZXQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlOZXRfeWggKGNvbnN0IGRlZmlOZXQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlOZXRfcmVjdE1hc2sgKGNvbnN0IGRlZmlOZXQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaU5ldF9yZWN0Um91dGVTdGF0dXMgKGNvbnN0IGRlZmlOZXQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaU5ldF9yZWN0Um91dGVTdGF0dXNTaGllbGROYW1lIChjb25zdCBkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlOZXRfcmVjdFNoYXBlVHlwZSAoY29uc3QgZGVmaU5ldCogb2JqLCBpbnQgIGluZGV4KTsKLQotICAvKiA1LjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgZGVmaU5ldF9udW1WaWFTcGVjcyAoY29uc3QgZGVmaU5ldCogb2JqKTsKLUVYVEVSTiBzdHJ1Y3QgZGVmaVBvaW50cyBkZWZpTmV0X2dldFZpYVB0cyAoY29uc3QgZGVmaU5ldCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpTmV0X3ZpYU5hbWUgKGNvbnN0IGRlZmlOZXQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY29uc3QgaW50IGRlZmlOZXRfdmlhT3JpZW50IChjb25zdCBkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlOZXRfdmlhT3JpZW50U3RyIChjb25zdCBkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGNvbnN0IGludCBkZWZpTmV0X3RvcE1hc2tOdW0gKGNvbnN0IGRlZmlOZXQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY29uc3QgaW50IGRlZmlOZXRfY3V0TWFza051bSAoY29uc3QgZGVmaU5ldCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBjb25zdCBpbnQgZGVmaU5ldF9ib3R0b21NYXNrTnVtIChjb25zdCBkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlOZXRfdmlhUm91dGVTdGF0dXMgKGNvbnN0IGRlZmlOZXQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaU5ldF92aWFSb3V0ZVN0YXR1c1NoaWVsZE5hbWUgKGNvbnN0IGRlZmlOZXQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaU5ldF92aWFTaGFwZVR5cGUgKGNvbnN0IGRlZmlOZXQqIG9iaiwgaW50ICBpbmRleCk7Ci0KLSAgLyogRGVidWcgcHJpbnRpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gdm9pZCBkZWZpTmV0X3ByaW50IChjb25zdCBkZWZpTmV0KiBvYmosIEZJTEUqICBmKTsKLQotICAvKiBUaGUgbWV0aG9kIGZyZWVXaXJlKCkgaXMgYWRkZWQgaXMgdXNlciBzZWxlY3QgdG8gaGF2ZSBhIGNhbGxiYWNrICAgICAgICAgKi8KLSAgLyogcGVyIHdpcmUgd2l0aGluIGEgbmV0IFRoaXMgaXMgYW4gaW50ZXJuYWwgbWV0aG9kIGFuZCBpcyBub3QgcHVibGljICAgICAgICovCi0KLSAgLyogQ2xlYXIgdGhlIHJlY3RhbmdsZXMgJiBwb2x5Z29ucyBkYXRhIGlmIHBhcnRpYWwgcGF0aCBjYWxsYmFjayBpcyBzZXQgICAgICovCi0KLSAgLyogV01EIC0tIHRoZSBmb2xsb3dpbmcgd2lsbCBiZSByZW1vdmVkIGJ5IHRoZSBuZXggcmVsZWFzZSAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogV01EIC0tIHRoZSBmb2xsb3dpbmcgd2lsbCBiZSByZW1vdmVkIGJ5IHRoZSBuZXggcmVsZWFzZSAgICAgICAgICAgICAgICAgICovCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYvZGVmaU5vbkRlZmF1bHQuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZmlOb25EZWZhdWx0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5N2JkZTEuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYvZGVmaU5vbkRlZmF1bHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQ29weXJpZ2h0IDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZSAgICAgICAgICAgICAqLwotLyogRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAqLwotLyogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgKi8KLS8qICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAqLwotLyogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgKi8KLS8qICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgICAgICovCi0vKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgICAgICAqLwotLyogICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LCAgICAgICAgICAqLwotLyogY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJEF1dGhvcjogZGVsbCAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkUmV2aXNpb246ICMxICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkRGF0ZTogMjAxNy8wNi8wNiAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRTdGF0ZTogICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0KLSNpZm5kZWYgQ0RFRklOT05ERUZBVUxUX0gKLSNkZWZpbmUgQ0RFRklOT05ERUZBVUxUX0gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiZGVmaVR5cGVkZWZzLmgiCi0KLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpTm9uRGVmYXVsdF9uYW1lIChjb25zdCBkZWZpTm9uRGVmYXVsdCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaU5vbkRlZmF1bHRfaGFzSGFyZHNwYWNpbmcgKGNvbnN0IGRlZmlOb25EZWZhdWx0KiBvYmopOwotCi1FWFRFUk4gaW50IGRlZmlOb25EZWZhdWx0X251bVByb3BzIChjb25zdCBkZWZpTm9uRGVmYXVsdCogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpTm9uRGVmYXVsdF9wcm9wTmFtZSAoY29uc3QgZGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaU5vbkRlZmF1bHRfcHJvcFZhbHVlIChjb25zdCBkZWZpTm9uRGVmYXVsdCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBkb3VibGUgZGVmaU5vbkRlZmF1bHRfcHJvcE51bWJlciAoY29uc3QgZGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY29uc3QgY2hhciBkZWZpTm9uRGVmYXVsdF9wcm9wVHlwZSAoY29uc3QgZGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlOb25EZWZhdWx0X3Byb3BJc051bWJlciAoY29uc3QgZGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlOb25EZWZhdWx0X3Byb3BJc1N0cmluZyAoY29uc3QgZGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCk7Ci0KLSAgLyogQSBub24gZGVmYXVsdCBydWxlIGNhbiBoYXZlIG9uZSBvciBtb3JlIGxheWVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBsYXllciBpbmZvcm1hdGlvbiBpcyBrZXB0IGluIGFuIGFycmF5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBkZWZpTm9uRGVmYXVsdF9udW1MYXllcnMgKGNvbnN0IGRlZmlOb25EZWZhdWx0KiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlOb25EZWZhdWx0X2xheWVyTmFtZSAoY29uc3QgZGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGRlZmlOb25EZWZhdWx0X2xheWVyV2lkdGggKGNvbnN0IGRlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpTm9uRGVmYXVsdF9sYXllcldpZHRoVmFsIChjb25zdCBkZWZpTm9uRGVmYXVsdCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgZGVmaU5vbkRlZmF1bHRfaGFzTGF5ZXJEaWFnV2lkdGggKGNvbnN0IGRlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGRvdWJsZSBkZWZpTm9uRGVmYXVsdF9sYXllckRpYWdXaWR0aCAoY29uc3QgZGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlOb25EZWZhdWx0X2xheWVyRGlhZ1dpZHRoVmFsIChjb25zdCBkZWZpTm9uRGVmYXVsdCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgZGVmaU5vbkRlZmF1bHRfaGFzTGF5ZXJTcGFjaW5nIChjb25zdCBkZWZpTm9uRGVmYXVsdCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBkb3VibGUgZGVmaU5vbkRlZmF1bHRfbGF5ZXJTcGFjaW5nIChjb25zdCBkZWZpTm9uRGVmYXVsdCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgZGVmaU5vbkRlZmF1bHRfbGF5ZXJTcGFjaW5nVmFsIChjb25zdCBkZWZpTm9uRGVmYXVsdCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgZGVmaU5vbkRlZmF1bHRfaGFzTGF5ZXJXaXJlRXh0IChjb25zdCBkZWZpTm9uRGVmYXVsdCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBkb3VibGUgZGVmaU5vbkRlZmF1bHRfbGF5ZXJXaXJlRXh0IChjb25zdCBkZWZpTm9uRGVmYXVsdCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgZGVmaU5vbkRlZmF1bHRfbGF5ZXJXaXJlRXh0VmFsIChjb25zdCBkZWZpTm9uRGVmYXVsdCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgZGVmaU5vbkRlZmF1bHRfbnVtVmlhcyAoY29uc3QgZGVmaU5vbkRlZmF1bHQqIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaU5vbkRlZmF1bHRfdmlhTmFtZSAoY29uc3QgZGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlOb25EZWZhdWx0X251bVZpYVJ1bGVzIChjb25zdCBkZWZpTm9uRGVmYXVsdCogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpTm9uRGVmYXVsdF92aWFSdWxlTmFtZSAoY29uc3QgZGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlOb25EZWZhdWx0X251bU1pbkN1dHMgKGNvbnN0IGRlZmlOb25EZWZhdWx0KiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlOb25EZWZhdWx0X2N1dExheWVyTmFtZSAoY29uc3QgZGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlOb25EZWZhdWx0X251bUN1dHMgKGNvbnN0IGRlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpOwotCi0gIC8qIERlYnVnIHByaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIHZvaWQgZGVmaU5vbkRlZmF1bHRfcHJpbnQgKGNvbnN0IGRlZmlOb25EZWZhdWx0KiBvYmosIEZJTEUqICBmKTsKLQotICAvKiBMYXllciBpbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZpUGFydGl0aW9uLmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZpUGFydGl0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4M2FmNzMuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYvZGVmaVBhcnRpdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBBVFRFTlRJT046IFRISVMgSVMgQU4gQVVUTy1HRU5FUkFURUQgRklMRS4gRE8gTk9UIENIQU5HRSBJVCEgICAgICAgICAgICAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBDb3B5cmlnaHQgMjAxMywgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlICAgICAgICAgICAgICovCi0vKiBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAgICAgICAgICAgICovCi0vKiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICAgICAgICAqLwotLyogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICovCi0vKiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAgICAgICAqLwotLyogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgICAgKi8KLS8qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgICAgICovCi0vKiAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksICAgICAgICAgICovCi0vKiBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkQXV0aG9yOiBkZWxsICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRSZXZpc2lvbjogIzEgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICREYXRlOiAyMDE3LzA2LzA2ICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJFN0YXRlOiAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLQotI2lmbmRlZiBDREVGSVBBUlRJVElPTl9ICi0jZGVmaW5lIENERUZJUEFSVElUSU9OX0gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiZGVmaVR5cGVkZWZzLmgiCi0KLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpUGFydGl0aW9uX25hbWUgKGNvbnN0IGRlZmlQYXJ0aXRpb24qIG9iaik7Ci1FWFRFUk4gY2hhciBkZWZpUGFydGl0aW9uX2RpcmVjdGlvbiAoY29uc3QgZGVmaVBhcnRpdGlvbiogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpUGFydGl0aW9uX2l0ZW1UeXBlIChjb25zdCBkZWZpUGFydGl0aW9uKiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlQYXJ0aXRpb25fcGluTmFtZSAoY29uc3QgZGVmaVBhcnRpdGlvbiogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpUGFydGl0aW9uX2luc3ROYW1lIChjb25zdCBkZWZpUGFydGl0aW9uKiBvYmopOwotCi1FWFRFUk4gaW50IGRlZmlQYXJ0aXRpb25fbnVtUGlucyAoY29uc3QgZGVmaVBhcnRpdGlvbiogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpUGFydGl0aW9uX3BpbiAoY29uc3QgZGVmaVBhcnRpdGlvbiogb2JqLCBpbnQgIGluZGV4KTsKLQotRVhURVJOIGludCBkZWZpUGFydGl0aW9uX2lzU2V0dXBSaXNlIChjb25zdCBkZWZpUGFydGl0aW9uKiBvYmopOwotRVhURVJOIGludCBkZWZpUGFydGl0aW9uX2lzU2V0dXBGYWxsIChjb25zdCBkZWZpUGFydGl0aW9uKiBvYmopOwotRVhURVJOIGludCBkZWZpUGFydGl0aW9uX2lzSG9sZFJpc2UgKGNvbnN0IGRlZmlQYXJ0aXRpb24qIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlQYXJ0aXRpb25faXNIb2xkRmFsbCAoY29uc3QgZGVmaVBhcnRpdGlvbiogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaVBhcnRpdGlvbl9oYXNNaW4gKGNvbnN0IGRlZmlQYXJ0aXRpb24qIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlQYXJ0aXRpb25faGFzTWF4IChjb25zdCBkZWZpUGFydGl0aW9uKiBvYmopOwotRVhURVJOIGludCBkZWZpUGFydGl0aW9uX2hhc1Jpc2VNaW4gKGNvbnN0IGRlZmlQYXJ0aXRpb24qIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlQYXJ0aXRpb25faGFzRmFsbE1pbiAoY29uc3QgZGVmaVBhcnRpdGlvbiogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaVBhcnRpdGlvbl9oYXNSaXNlTWF4IChjb25zdCBkZWZpUGFydGl0aW9uKiBvYmopOwotRVhURVJOIGludCBkZWZpUGFydGl0aW9uX2hhc0ZhbGxNYXggKGNvbnN0IGRlZmlQYXJ0aXRpb24qIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlQYXJ0aXRpb25faGFzUmlzZU1pblJhbmdlIChjb25zdCBkZWZpUGFydGl0aW9uKiBvYmopOwotRVhURVJOIGludCBkZWZpUGFydGl0aW9uX2hhc0ZhbGxNaW5SYW5nZSAoY29uc3QgZGVmaVBhcnRpdGlvbiogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaVBhcnRpdGlvbl9oYXNSaXNlTWF4UmFuZ2UgKGNvbnN0IGRlZmlQYXJ0aXRpb24qIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlQYXJ0aXRpb25faGFzRmFsbE1heFJhbmdlIChjb25zdCBkZWZpUGFydGl0aW9uKiBvYmopOwotCi1FWFRFUk4gZG91YmxlIGRlZmlQYXJ0aXRpb25fcGFydGl0aW9uTWluIChjb25zdCBkZWZpUGFydGl0aW9uKiBvYmopOwotRVhURVJOIGRvdWJsZSBkZWZpUGFydGl0aW9uX3BhcnRpdGlvbk1heCAoY29uc3QgZGVmaVBhcnRpdGlvbiogb2JqKTsKLQotRVhURVJOIGRvdWJsZSBkZWZpUGFydGl0aW9uX3Jpc2VNaW4gKGNvbnN0IGRlZmlQYXJ0aXRpb24qIG9iaik7Ci1FWFRFUk4gZG91YmxlIGRlZmlQYXJ0aXRpb25fZmFsbE1pbiAoY29uc3QgZGVmaVBhcnRpdGlvbiogb2JqKTsKLUVYVEVSTiBkb3VibGUgZGVmaVBhcnRpdGlvbl9yaXNlTWF4IChjb25zdCBkZWZpUGFydGl0aW9uKiBvYmopOwotRVhURVJOIGRvdWJsZSBkZWZpUGFydGl0aW9uX2ZhbGxNYXggKGNvbnN0IGRlZmlQYXJ0aXRpb24qIG9iaik7Ci0KLUVYVEVSTiBkb3VibGUgZGVmaVBhcnRpdGlvbl9yaXNlTWluTGVmdCAoY29uc3QgZGVmaVBhcnRpdGlvbiogb2JqKTsKLUVYVEVSTiBkb3VibGUgZGVmaVBhcnRpdGlvbl9mYWxsTWluTGVmdCAoY29uc3QgZGVmaVBhcnRpdGlvbiogb2JqKTsKLUVYVEVSTiBkb3VibGUgZGVmaVBhcnRpdGlvbl9yaXNlTWF4TGVmdCAoY29uc3QgZGVmaVBhcnRpdGlvbiogb2JqKTsKLUVYVEVSTiBkb3VibGUgZGVmaVBhcnRpdGlvbl9mYWxsTWF4TGVmdCAoY29uc3QgZGVmaVBhcnRpdGlvbiogb2JqKTsKLUVYVEVSTiBkb3VibGUgZGVmaVBhcnRpdGlvbl9yaXNlTWluUmlnaHQgKGNvbnN0IGRlZmlQYXJ0aXRpb24qIG9iaik7Ci1FWFRFUk4gZG91YmxlIGRlZmlQYXJ0aXRpb25fZmFsbE1pblJpZ2h0IChjb25zdCBkZWZpUGFydGl0aW9uKiBvYmopOwotRVhURVJOIGRvdWJsZSBkZWZpUGFydGl0aW9uX3Jpc2VNYXhSaWdodCAoY29uc3QgZGVmaVBhcnRpdGlvbiogb2JqKTsKLUVYVEVSTiBkb3VibGUgZGVmaVBhcnRpdGlvbl9mYWxsTWF4UmlnaHQgKGNvbnN0IGRlZmlQYXJ0aXRpb24qIG9iaik7Ci0KLSAgLyogZGVidWcgcHJpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gdm9pZCBkZWZpUGFydGl0aW9uX3ByaW50IChjb25zdCBkZWZpUGFydGl0aW9uKiBvYmosIEZJTEUqICBmKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZpUGF0aC5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYvZGVmaVBhdGguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIwZGFmOS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZpUGF0aC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBBVFRFTlRJT046IFRISVMgSVMgQU4gQVVUTy1HRU5FUkFURUQgRklMRS4gRE8gTk9UIENIQU5HRSBJVCEgICAgICAgICAgICAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBDb3B5cmlnaHQgMjAxMy0yMDE0LCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlICAgICAgICAgICAgICovCi0vKiBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAgICAgICAgICAgICovCi0vKiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICAgICAgICAqLwotLyogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICovCi0vKiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAgICAgICAqLwotLyogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgICAgKi8KLS8qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgICAgICovCi0vKiAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksICAgICAgICAgICovCi0vKiBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkQXV0aG9yOiBkZWxsICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkUmV2aXNpb246ICMxICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJERhdGU6IDIwMTcvMDYvMDYgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRTdGF0ZTogICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0KLSNpZm5kZWYgQ0RFRklQQVRIX0gKLSNkZWZpbmUgQ0RFRklQQVRIX0gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiZGVmaVR5cGVkZWZzLmgiCi0KLS8qIFRYX0RJUjpUUkFOU0xBVElPTiBPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLS8qIDUuNC4xIDEtRCAmIDItRCBBcnJheXMgb2YgVmlhcyBpbiBTUEVDSUFMTkVUIFNlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICovCi0KLS8qIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBuZXh0KCkgcm91dGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1lbnVtIGRlZmlQYXRoX2UgewotICBERUZJUEFUSF9ET05FID0gMCwKLSAgREVGSVBBVEhfTEFZRVIgPSAxLAotICBERUZJUEFUSF9WSUEgPSAyLAotICBERUZJUEFUSF9WSUFST1RBVElPTiA9IDMsCi0gIERFRklQQVRIX1dJRFRIID0gNCwKLSAgREVGSVBBVEhfUE9JTlQgPSA1LAotICBERUZJUEFUSF9GTFVTSFBPSU5UID0gNiwKLSAgREVGSVBBVEhfVEFQRVIgPSA3LAotICBERUZJUEFUSF9TSEFQRSA9IDgsCi0gIERFRklQQVRIX1NUWUxFID0gOSwKLSAgREVGSVBBVEhfVEFQRVJSVUxFID0gMTAsCi0gIERFRklQQVRIX1ZJQURBVEEgPSAxMSwKLSAgREVGSVBBVEhfUkVDVCA9IDEyLAotICBERUZJUEFUSF9WSVJUVUFMUE9JTlQgPSAxMywKLSAgREVGSVBBVEhfTUFTSyA9IDE0LAotICBERUZJUEFUSF9WSUFNQVNLID0gMTUKLSAgfSA7Ci0KLSAgLyogVGhpcyBpcyAnZGF0YSBvd25lcnNoaXAgdHJhbnNmZXInIGNvbnN0cnVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogVG8gdHJhdmVyc2UgdGhlIHBhdGggYW5kIGdldCB0aGUgcGFydHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gdm9pZCBkZWZpUGF0aF9pbml0VHJhdmVyc2UgKGNvbnN0IGRlZmlQYXRoKiBvYmopOwotRVhURVJOIHZvaWQgZGVmaVBhdGhfaW5pdFRyYXZlcnNlQmFja3dhcmRzIChjb25zdCBkZWZpUGF0aCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaVBhdGhfbmV4dCAoY29uc3QgZGVmaVBhdGgqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlQYXRoX3ByZXYgKGNvbnN0IGRlZmlQYXRoKiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlQYXRoX2dldExheWVyIChjb25zdCBkZWZpUGF0aCogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpUGF0aF9nZXRUYXBlclJ1bGUgKGNvbnN0IGRlZmlQYXRoKiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlQYXRoX2dldFZpYSAoY29uc3QgZGVmaVBhdGgqIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaVBhdGhfZ2V0U2hhcGUgKGNvbnN0IGRlZmlQYXRoKiBvYmopOwotRVhURVJOIGludCBkZWZpUGF0aF9nZXRUYXBlciAoY29uc3QgZGVmaVBhdGgqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlQYXRoX2dldFN0eWxlIChjb25zdCBkZWZpUGF0aCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaVBhdGhfZ2V0VmlhUm90YXRpb24gKGNvbnN0IGRlZmlQYXRoKiBvYmopOwotRVhURVJOIHZvaWQgZGVmaVBhdGhfZ2V0VmlhUmVjdCAoY29uc3QgZGVmaVBhdGgqIG9iaiwgaW50KiAgZGVsdGFYMSwgaW50KiAgZGVsdGFZMSwgaW50KiAgZGVsdGFYMiwgaW50KiAgZGVsdGFZMik7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaVBhdGhfZ2V0VmlhUm90YXRpb25TdHIgKGNvbnN0IGRlZmlQYXRoKiBvYmopOwotRVhURVJOIHZvaWQgZGVmaVBhdGhfZ2V0VmlhRGF0YSAoY29uc3QgZGVmaVBhdGgqIG9iaiwgaW50KiAgbnVtWCwgaW50KiAgbnVtWSwgaW50KiAgc3RlcFgsIGludCogIHN0ZXBZKTsKLUVYVEVSTiBpbnQgZGVmaVBhdGhfZ2V0V2lkdGggKGNvbnN0IGRlZmlQYXRoKiBvYmopOwotRVhURVJOIHZvaWQgZGVmaVBhdGhfZ2V0UG9pbnQgKGNvbnN0IGRlZmlQYXRoKiBvYmosIGludCogIHgsIGludCogIHkpOwotRVhURVJOIHZvaWQgZGVmaVBhdGhfZ2V0Rmx1c2hQb2ludCAoY29uc3QgZGVmaVBhdGgqIG9iaiwgaW50KiAgeCwgaW50KiAgeSwgaW50KiAgZXh0KTsKLUVYVEVSTiB2b2lkIGRlZmlQYXRoX2dldFZpcnR1YWxQb2ludCAoY29uc3QgZGVmaVBhdGgqIG9iaiwgaW50KiAgeCwgaW50KiAgeSk7Ci1FWFRFUk4gaW50IGRlZmlQYXRoX2dldE1hc2sgKGNvbnN0IGRlZmlQYXRoKiBvYmopOwotRVhURVJOIGludCBkZWZpUGF0aF9nZXRWaWFUb3BNYXNrIChjb25zdCBkZWZpUGF0aCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaVBhdGhfZ2V0VmlhQ3V0TWFzayAoY29uc3QgZGVmaVBhdGgqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlQYXRoX2dldFZpYUJvdHRvbU1hc2sgKGNvbnN0IGRlZmlQYXRoKiBvYmopOwotRVhURVJOIGludCBkZWZpUGF0aF9nZXRSZWN0TWFzayAoY29uc3QgZGVmaVBhdGgqIG9iaik7Ci0KLSAgLyogVGhlc2Ugcm91dGluZXMgYXJlIGNhbGxlZCBieSB0aGUgcGFyc2VyIHRvIGZpbGwgdGhlIHBhdGguICAgICAgICAgICAgICAgICovCi0KLSAgLyogZGVidWcgcHJpbnRpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gdm9pZCBkZWZpUGF0aF9wcmludCAoY29uc3QgZGVmaVBhdGgqIG9iaiwgRklMRSogIGZvdXQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBhcyBpdGVyYXRvciBpbiBjb25zdCB0cmF2ZXJzYWwgZnVuY3Rpb25zLiAgICAgICAgICAqLwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZmlQaW5DYXAuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZmlQaW5DYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI0ODNkYi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZpUGluQ2FwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBBVFRFTlRJT046IFRISVMgSVMgQU4gQVVUTy1HRU5FUkFURUQgRklMRS4gRE8gTk9UIENIQU5HRSBJVCEgICAgICAgICAgICAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBDb3B5cmlnaHQgMjAxMywgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlICAgICAgICAgICAgICovCi0vKiBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAgICAgICAgICAgICovCi0vKiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICAgICAgICAqLwotLyogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICovCi0vKiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAgICAgICAqLwotLyogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgICAgKi8KLS8qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgICAgICovCi0vKiAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksICAgICAgICAgICovCi0vKiBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkQXV0aG9yOiBkZWxsICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRSZXZpc2lvbjogIzEgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICREYXRlOiAyMDE3LzA2LzA2ICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJFN0YXRlOiAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLQotI2lmbmRlZiBDREVGSVBJTkNBUF9ICi0jZGVmaW5lIENERUZJUElOQ0FQX0gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiZGVmaVR5cGVkZWZzLmgiCi0KLUVYVEVSTiBpbnQgZGVmaVBpbkNhcF9waW4gKGNvbnN0IGRlZmlQaW5DYXAqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGRlZmlQaW5DYXBfY2FwIChjb25zdCBkZWZpUGluQ2FwKiBvYmopOwotCi1FWFRFUk4gdm9pZCBkZWZpUGluQ2FwX3ByaW50IChjb25zdCBkZWZpUGluQ2FwKiBvYmosIEZJTEUqICBmKTsKLQotLyogNS41ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotRVhURVJOIGNoYXIqIGRlZmlQaW5BbnRlbm5hTW9kZWxfYW50ZW5uYU94aWRlIChjb25zdCBkZWZpUGluQW50ZW5uYU1vZGVsKiBvYmopOwotCi1FWFRFUk4gaW50IGRlZmlQaW5BbnRlbm5hTW9kZWxfaGFzQVBpbkdhdGVBcmVhIChjb25zdCBkZWZpUGluQW50ZW5uYU1vZGVsKiBvYmopOwotRVhURVJOIGludCBkZWZpUGluQW50ZW5uYU1vZGVsX251bUFQaW5HYXRlQXJlYSAoY29uc3QgZGVmaVBpbkFudGVubmFNb2RlbCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaVBpbkFudGVubmFNb2RlbF9BUGluR2F0ZUFyZWEgKGNvbnN0IGRlZmlQaW5BbnRlbm5hTW9kZWwqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlQaW5BbnRlbm5hTW9kZWxfaGFzQVBpbkdhdGVBcmVhTGF5ZXIgKGNvbnN0IGRlZmlQaW5BbnRlbm5hTW9kZWwqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaVBpbkFudGVubmFNb2RlbF9BUGluR2F0ZUFyZWFMYXllciAoY29uc3QgZGVmaVBpbkFudGVubmFNb2RlbCogb2JqLCBpbnQgIGluZGV4KTsKLQotRVhURVJOIGludCBkZWZpUGluQW50ZW5uYU1vZGVsX2hhc0FQaW5NYXhBcmVhQ2FyIChjb25zdCBkZWZpUGluQW50ZW5uYU1vZGVsKiBvYmopOwotRVhURVJOIGludCBkZWZpUGluQW50ZW5uYU1vZGVsX251bUFQaW5NYXhBcmVhQ2FyIChjb25zdCBkZWZpUGluQW50ZW5uYU1vZGVsKiBvYmopOwotRVhURVJOIGludCBkZWZpUGluQW50ZW5uYU1vZGVsX0FQaW5NYXhBcmVhQ2FyIChjb25zdCBkZWZpUGluQW50ZW5uYU1vZGVsKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpUGluQW50ZW5uYU1vZGVsX2hhc0FQaW5NYXhBcmVhQ2FyTGF5ZXIgKGNvbnN0IGRlZmlQaW5BbnRlbm5hTW9kZWwqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaVBpbkFudGVubmFNb2RlbF9BUGluTWF4QXJlYUNhckxheWVyIChjb25zdCBkZWZpUGluQW50ZW5uYU1vZGVsKiBvYmosIGludCAgaW5kZXgpOwotCi1FWFRFUk4gaW50IGRlZmlQaW5BbnRlbm5hTW9kZWxfaGFzQVBpbk1heFNpZGVBcmVhQ2FyIChjb25zdCBkZWZpUGluQW50ZW5uYU1vZGVsKiBvYmopOwotRVhURVJOIGludCBkZWZpUGluQW50ZW5uYU1vZGVsX251bUFQaW5NYXhTaWRlQXJlYUNhciAoY29uc3QgZGVmaVBpbkFudGVubmFNb2RlbCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaVBpbkFudGVubmFNb2RlbF9BUGluTWF4U2lkZUFyZWFDYXIgKGNvbnN0IGRlZmlQaW5BbnRlbm5hTW9kZWwqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlQaW5BbnRlbm5hTW9kZWxfaGFzQVBpbk1heFNpZGVBcmVhQ2FyTGF5ZXIgKGNvbnN0IGRlZmlQaW5BbnRlbm5hTW9kZWwqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaVBpbkFudGVubmFNb2RlbF9BUGluTWF4U2lkZUFyZWFDYXJMYXllciAoY29uc3QgZGVmaVBpbkFudGVubmFNb2RlbCogb2JqLCBpbnQgIGluZGV4KTsKLQotRVhURVJOIGludCBkZWZpUGluQW50ZW5uYU1vZGVsX2hhc0FQaW5NYXhDdXRDYXIgKGNvbnN0IGRlZmlQaW5BbnRlbm5hTW9kZWwqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlQaW5BbnRlbm5hTW9kZWxfbnVtQVBpbk1heEN1dENhciAoY29uc3QgZGVmaVBpbkFudGVubmFNb2RlbCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaVBpbkFudGVubmFNb2RlbF9BUGluTWF4Q3V0Q2FyIChjb25zdCBkZWZpUGluQW50ZW5uYU1vZGVsKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpUGluQW50ZW5uYU1vZGVsX2hhc0FQaW5NYXhDdXRDYXJMYXllciAoY29uc3QgZGVmaVBpbkFudGVubmFNb2RlbCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpUGluQW50ZW5uYU1vZGVsX0FQaW5NYXhDdXRDYXJMYXllciAoY29uc3QgZGVmaVBpbkFudGVubmFNb2RlbCogb2JqLCBpbnQgIGluZGV4KTsKLQotRVhURVJOIGludCBkZWZpUGluUG9ydF9udW1MYXllciAoY29uc3QgZGVmaVBpblBvcnQqIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaVBpblBvcnRfbGF5ZXIgKGNvbnN0IGRlZmlQaW5Qb3J0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIHZvaWQgZGVmaVBpblBvcnRfYm91bmRzIChjb25zdCBkZWZpUGluUG9ydCogb2JqLCBpbnQgIGluZGV4LCBpbnQqICB4bCwgaW50KiAgeWwsIGludCogIHhoLCBpbnQqICB5aCk7Ci1FWFRFUk4gaW50IGRlZmlQaW5Qb3J0X2hhc0xheWVyU3BhY2luZyAoY29uc3QgZGVmaVBpblBvcnQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlQaW5Qb3J0X2hhc0xheWVyRGVzaWduUnVsZVdpZHRoIChjb25zdCBkZWZpUGluUG9ydCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgZGVmaVBpblBvcnRfbGF5ZXJTcGFjaW5nIChjb25zdCBkZWZpUGluUG9ydCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgZGVmaVBpblBvcnRfbGF5ZXJNYXNrIChjb25zdCBkZWZpUGluUG9ydCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgZGVmaVBpblBvcnRfbGF5ZXJEZXNpZ25SdWxlV2lkdGggKGNvbnN0IGRlZmlQaW5Qb3J0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpUGluUG9ydF9udW1Qb2x5Z29ucyAoY29uc3QgZGVmaVBpblBvcnQqIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaVBpblBvcnRfcG9seWdvbk5hbWUgKGNvbnN0IGRlZmlQaW5Qb3J0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIHN0cnVjdCBkZWZpUG9pbnRzIGRlZmlQaW5Qb3J0X2dldFBvbHlnb24gKGNvbnN0IGRlZmlQaW5Qb3J0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpUGluUG9ydF9oYXNQb2x5Z29uU3BhY2luZyAoY29uc3QgZGVmaVBpblBvcnQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlQaW5Qb3J0X2hhc1BvbHlnb25EZXNpZ25SdWxlV2lkdGggKGNvbnN0IGRlZmlQaW5Qb3J0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpUGluUG9ydF9wb2x5Z29uU3BhY2luZyAoY29uc3QgZGVmaVBpblBvcnQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlQaW5Qb3J0X3BvbHlnb25EZXNpZ25SdWxlV2lkdGggKGNvbnN0IGRlZmlQaW5Qb3J0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpUGluUG9ydF9wb2x5Z29uTWFzayAoY29uc3QgZGVmaVBpblBvcnQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlQaW5Qb3J0X251bVZpYXMgKGNvbnN0IGRlZmlQaW5Qb3J0KiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlQaW5Qb3J0X3ZpYU5hbWUgKGNvbnN0IGRlZmlQaW5Qb3J0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpUGluUG9ydF92aWFQdFggKGNvbnN0IGRlZmlQaW5Qb3J0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpUGluUG9ydF92aWFQdFkgKGNvbnN0IGRlZmlQaW5Qb3J0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpUGluUG9ydF92aWFUb3BNYXNrIChjb25zdCBkZWZpUGluUG9ydCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgZGVmaVBpblBvcnRfdmlhQ3V0TWFzayAoY29uc3QgZGVmaVBpblBvcnQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlQaW5Qb3J0X3ZpYUJvdHRvbU1hc2sgKGNvbnN0IGRlZmlQaW5Qb3J0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpUGluUG9ydF9oYXNQbGFjZW1lbnQgKGNvbnN0IGRlZmlQaW5Qb3J0KiBvYmopOwotRVhURVJOIGludCBkZWZpUGluUG9ydF9pc1BsYWNlZCAoY29uc3QgZGVmaVBpblBvcnQqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlQaW5Qb3J0X2lzQ292ZXIgKGNvbnN0IGRlZmlQaW5Qb3J0KiBvYmopOwotRVhURVJOIGludCBkZWZpUGluUG9ydF9pc0ZpeGVkIChjb25zdCBkZWZpUGluUG9ydCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaVBpblBvcnRfcGxhY2VtZW50WCAoY29uc3QgZGVmaVBpblBvcnQqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlQaW5Qb3J0X3BsYWNlbWVudFkgKGNvbnN0IGRlZmlQaW5Qb3J0KiBvYmopOwotRVhURVJOIGludCBkZWZpUGluUG9ydF9vcmllbnQgKGNvbnN0IGRlZmlQaW5Qb3J0KiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlQaW5Qb3J0X29yaWVudFN0ciAoY29uc3QgZGVmaVBpblBvcnQqIG9iaik7Ci0KLSAgLyogNS42IHNldExheWVyIGlzIGNoYW5nZWQgdG8gYWRkTGF5ZXIgZHVlIHRvIG11bHRpcGxlIExBWUVSIGFyZSBhbGxvd2VkICAgICovCi0gIC8qIGluIDUuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA1LjcgcG9ydCBzdGF0ZW1lbnRzLCB3aGljaCBtYXkgaGF2ZSBMQVlFUiwgUE9MWUdPTiwgJnwgVklBICAgICAgICAgICAgICAgKi8KLQotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlQaW5fcGluTmFtZSAoY29uc3QgZGVmaVBpbiogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpUGluX25ldE5hbWUgKGNvbnN0IGRlZmlQaW4qIG9iaik7Ci0gIC8qIG9wdGlvbmFsIHBhcnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBkZWZpUGluX2hhc0RpcmVjdGlvbiAoY29uc3QgZGVmaVBpbiogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaVBpbl9oYXNVc2UgKGNvbnN0IGRlZmlQaW4qIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlQaW5faGFzTGF5ZXIgKGNvbnN0IGRlZmlQaW4qIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlQaW5faGFzUGxhY2VtZW50IChjb25zdCBkZWZpUGluKiBvYmopOwotRVhURVJOIGludCBkZWZpUGluX2lzVW5wbGFjZWQgKGNvbnN0IGRlZmlQaW4qIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlQaW5faXNQbGFjZWQgKGNvbnN0IGRlZmlQaW4qIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlQaW5faXNDb3ZlciAoY29uc3QgZGVmaVBpbiogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaVBpbl9pc0ZpeGVkIChjb25zdCBkZWZpUGluKiBvYmopOwotRVhURVJOIGludCBkZWZpUGluX3BsYWNlbWVudFggKGNvbnN0IGRlZmlQaW4qIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlQaW5fcGxhY2VtZW50WSAoY29uc3QgZGVmaVBpbiogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpUGluX2RpcmVjdGlvbiAoY29uc3QgZGVmaVBpbiogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpUGluX3VzZSAoY29uc3QgZGVmaVBpbiogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaVBpbl9udW1MYXllciAoY29uc3QgZGVmaVBpbiogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpUGluX2xheWVyIChjb25zdCBkZWZpUGluKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIHZvaWQgZGVmaVBpbl9ib3VuZHMgKGNvbnN0IGRlZmlQaW4qIG9iaiwgaW50ICBpbmRleCwgaW50KiAgeGwsIGludCogIHlsLCBpbnQqICB4aCwgaW50KiAgeWgpOwotRVhURVJOIGludCBkZWZpUGluX2xheWVyTWFzayAoY29uc3QgZGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgZGVmaVBpbl9oYXNMYXllclNwYWNpbmcgKGNvbnN0IGRlZmlQaW4qIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlQaW5faGFzTGF5ZXJEZXNpZ25SdWxlV2lkdGggKGNvbnN0IGRlZmlQaW4qIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlQaW5fbGF5ZXJTcGFjaW5nIChjb25zdCBkZWZpUGluKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpUGluX2xheWVyRGVzaWduUnVsZVdpZHRoIChjb25zdCBkZWZpUGluKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpUGluX251bVBvbHlnb25zIChjb25zdCBkZWZpUGluKiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlQaW5fcG9seWdvbk5hbWUgKGNvbnN0IGRlZmlQaW4qIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gc3RydWN0IGRlZmlQb2ludHMgZGVmaVBpbl9nZXRQb2x5Z29uIChjb25zdCBkZWZpUGluKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpUGluX3BvbHlnb25NYXNrIChjb25zdCBkZWZpUGluKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpUGluX2hhc1BvbHlnb25TcGFjaW5nIChjb25zdCBkZWZpUGluKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpUGluX2hhc1BvbHlnb25EZXNpZ25SdWxlV2lkdGggKGNvbnN0IGRlZmlQaW4qIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlQaW5fcG9seWdvblNwYWNpbmcgKGNvbnN0IGRlZmlQaW4qIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlQaW5fcG9seWdvbkRlc2lnblJ1bGVXaWR0aCAoY29uc3QgZGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgZGVmaVBpbl9oYXNOZXRFeHByIChjb25zdCBkZWZpUGluKiBvYmopOwotRVhURVJOIGludCBkZWZpUGluX2hhc1N1cHBseVNlbnNpdGl2aXR5IChjb25zdCBkZWZpUGluKiBvYmopOwotRVhURVJOIGludCBkZWZpUGluX2hhc0dyb3VuZFNlbnNpdGl2aXR5IChjb25zdCBkZWZpUGluKiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlQaW5fbmV0RXhwciAoY29uc3QgZGVmaVBpbiogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpUGluX3N1cHBseVNlbnNpdGl2aXR5IChjb25zdCBkZWZpUGluKiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlQaW5fZ3JvdW5kU2Vuc2l0aXZpdHkgKGNvbnN0IGRlZmlQaW4qIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlQaW5fb3JpZW50IChjb25zdCBkZWZpUGluKiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlQaW5fb3JpZW50U3RyIChjb25zdCBkZWZpUGluKiBvYmopOwotRVhURVJOIGludCBkZWZpUGluX2hhc1NwZWNpYWwgKGNvbnN0IGRlZmlQaW4qIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlQaW5fbnVtVmlhcyAoY29uc3QgZGVmaVBpbiogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpUGluX3ZpYU5hbWUgKGNvbnN0IGRlZmlQaW4qIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlQaW5fdmlhVG9wTWFzayAoY29uc3QgZGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgZGVmaVBpbl92aWFDdXRNYXNrIChjb25zdCBkZWZpUGluKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpUGluX3ZpYUJvdHRvbU1hc2sgKGNvbnN0IGRlZmlQaW4qIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlQaW5fdmlhUHRYIChjb25zdCBkZWZpUGluKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpUGluX3ZpYVB0WSAoY29uc3QgZGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KTsKLQotICAvKiA1LjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgZGVmaVBpbl9oYXNBUGluUGFydGlhbE1ldGFsQXJlYSAoY29uc3QgZGVmaVBpbiogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaVBpbl9udW1BUGluUGFydGlhbE1ldGFsQXJlYSAoY29uc3QgZGVmaVBpbiogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaVBpbl9BUGluUGFydGlhbE1ldGFsQXJlYSAoY29uc3QgZGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgZGVmaVBpbl9oYXNBUGluUGFydGlhbE1ldGFsQXJlYUxheWVyIChjb25zdCBkZWZpUGluKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlQaW5fQVBpblBhcnRpYWxNZXRhbEFyZWFMYXllciAoY29uc3QgZGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KTsKLQotRVhURVJOIGludCBkZWZpUGluX2hhc0FQaW5QYXJ0aWFsTWV0YWxTaWRlQXJlYSAoY29uc3QgZGVmaVBpbiogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaVBpbl9udW1BUGluUGFydGlhbE1ldGFsU2lkZUFyZWEgKGNvbnN0IGRlZmlQaW4qIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlQaW5fQVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhIChjb25zdCBkZWZpUGluKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpUGluX2hhc0FQaW5QYXJ0aWFsTWV0YWxTaWRlQXJlYUxheWVyIChjb25zdCBkZWZpUGluKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlQaW5fQVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhTGF5ZXIgKGNvbnN0IGRlZmlQaW4qIG9iaiwgaW50ICBpbmRleCk7Ci0KLUVYVEVSTiBpbnQgZGVmaVBpbl9oYXNBUGluRGlmZkFyZWEgKGNvbnN0IGRlZmlQaW4qIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlQaW5fbnVtQVBpbkRpZmZBcmVhIChjb25zdCBkZWZpUGluKiBvYmopOwotRVhURVJOIGludCBkZWZpUGluX0FQaW5EaWZmQXJlYSAoY29uc3QgZGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgZGVmaVBpbl9oYXNBUGluRGlmZkFyZWFMYXllciAoY29uc3QgZGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpUGluX0FQaW5EaWZmQXJlYUxheWVyIChjb25zdCBkZWZpUGluKiBvYmosIGludCAgaW5kZXgpOwotCi1FWFRFUk4gaW50IGRlZmlQaW5faGFzQVBpblBhcnRpYWxDdXRBcmVhIChjb25zdCBkZWZpUGluKiBvYmopOwotRVhURVJOIGludCBkZWZpUGluX251bUFQaW5QYXJ0aWFsQ3V0QXJlYSAoY29uc3QgZGVmaVBpbiogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaVBpbl9BUGluUGFydGlhbEN1dEFyZWEgKGNvbnN0IGRlZmlQaW4qIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlQaW5faGFzQVBpblBhcnRpYWxDdXRBcmVhTGF5ZXIgKGNvbnN0IGRlZmlQaW4qIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaVBpbl9BUGluUGFydGlhbEN1dEFyZWFMYXllciAoY29uc3QgZGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KTsKLQotICAvKiA1LjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgZGVmaVBpbl9udW1BbnRlbm5hTW9kZWwgKGNvbnN0IGRlZmlQaW4qIG9iaik7Ci1FWFRFUk4gY29uc3QgZGVmaVBpbkFudGVubmFNb2RlbCogZGVmaVBpbl9hbnRlbm5hTW9kZWwgKGNvbnN0IGRlZmlQaW4qIG9iaiwgaW50ICBpbmRleCk7Ci0KLSAgLyogNS43ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGRlZmlQaW5faGFzUG9ydCAoY29uc3QgZGVmaVBpbiogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaVBpbl9udW1Qb3J0cyAoY29uc3QgZGVmaVBpbiogb2JqKTsKLUVYVEVSTiBjb25zdCBkZWZpUGluUG9ydCogZGVmaVBpbl9waW5Qb3J0IChjb25zdCBkZWZpUGluKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIHZvaWQgZGVmaVBpbl9wcmludCAoY29uc3QgZGVmaVBpbiogb2JqLCBGSUxFKiAgZik7Ci0KLSAgLyogNS41IEFudGVubmFNb2RlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYvZGVmaVBpblByb3AuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZmlQaW5Qcm9wLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZWY0MWIuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYvZGVmaVBpblByb3AuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQ29weXJpZ2h0IDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZSAgICAgICAgICAgICAqLwotLyogRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAqLwotLyogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgKi8KLS8qICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAqLwotLyogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgKi8KLS8qICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgICAgICovCi0vKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgICAgICAqLwotLyogICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LCAgICAgICAgICAqLwotLyogY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJEF1dGhvcjogZGVsbCAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkUmV2aXNpb246ICMxICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkRGF0ZTogMjAxNy8wNi8wNiAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRTdGF0ZTogICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0KLSNpZm5kZWYgQ0RFRklQSU5QUk9QX0gKLSNkZWZpbmUgQ0RFRklQSU5QUk9QX0gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiZGVmaVR5cGVkZWZzLmgiCi0KLUVYVEVSTiBpbnQgZGVmaVBpblByb3BfaXNQaW4gKGNvbnN0IGRlZmlQaW5Qcm9wKiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlQaW5Qcm9wX2luc3ROYW1lIChjb25zdCBkZWZpUGluUHJvcCogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpUGluUHJvcF9waW5OYW1lIChjb25zdCBkZWZpUGluUHJvcCogb2JqKTsKLQotRVhURVJOIGludCBkZWZpUGluUHJvcF9udW1Qcm9wcyAoY29uc3QgZGVmaVBpblByb3AqIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaVBpblByb3BfcHJvcE5hbWUgKGNvbnN0IGRlZmlQaW5Qcm9wKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlQaW5Qcm9wX3Byb3BWYWx1ZSAoY29uc3QgZGVmaVBpblByb3AqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGRlZmlQaW5Qcm9wX3Byb3BOdW1iZXIgKGNvbnN0IGRlZmlQaW5Qcm9wKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGNvbnN0IGNoYXIgZGVmaVBpblByb3BfcHJvcFR5cGUgKGNvbnN0IGRlZmlQaW5Qcm9wKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpUGluUHJvcF9wcm9wSXNOdW1iZXIgKGNvbnN0IGRlZmlQaW5Qcm9wKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpUGluUHJvcF9wcm9wSXNTdHJpbmcgKGNvbnN0IGRlZmlQaW5Qcm9wKiBvYmosIGludCAgaW5kZXgpOwotCi1FWFRFUk4gdm9pZCBkZWZpUGluUHJvcF9wcmludCAoY29uc3QgZGVmaVBpblByb3AqIG9iaiwgRklMRSogIGYpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZmlQcm9wLmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZpUHJvcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGE5Y2NhLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZmlQcm9wLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qIEFUVEVOVElPTjogVEhJUyBJUyBBTiBBVVRPLUdFTkVSQVRFRCBGSUxFLiBETyBOT1QgQ0hBTkdFIElUISAgICAgICAgICAgICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qIENvcHlyaWdodCAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UgICAgICAgICAgICAgKi8KLS8qIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7ICAgICAgICAgICAgKi8KLS8qICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gICAgICAgICovCi0vKiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAgICAgKi8KLS8qICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsICAgICAgICovCi0vKiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICAgICAqLwotLyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICAgICAgKi8KLS8qICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwgICAgICAgICAgKi8KLS8qIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRBdXRob3I6IGRlbGwgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJFJldmlzaW9uOiAjMSAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJERhdGU6IDIwMTcvMDYvMDYgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkU3RhdGU6ICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotCi0jaWZuZGVmIENERUZJUFJPUF9ICi0jZGVmaW5lIENERUZJUFJPUF9ICi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImRlZmlUeXBlZGVmcy5oIgotCi0vKiBTdHJ1Y3QgaG9sZHMgdGhlIGRhdGEgZm9yIG9uZSBwcm9wZXJ0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi1FWFRFUk4gY29uc3QgY2hhciogZGVmaVByb3Bfc3RyaW5nIChjb25zdCBkZWZpUHJvcCogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpUHJvcF9wcm9wVHlwZSAoY29uc3QgZGVmaVByb3AqIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaVByb3BfcHJvcE5hbWUgKGNvbnN0IGRlZmlQcm9wKiBvYmopOwotRVhURVJOIGNoYXIgZGVmaVByb3BfZGF0YVR5cGUgKGNvbnN0IGRlZmlQcm9wKiBvYmopOwotICAgICAgIC8qIGVpdGhlciBJOmludGVnZXIgUjpyZWFsIFM6c3RyaW5nIFE6cXVvdGVkc3RyaW5nIE46bmFtZU1hcFN0cmluZyAgICAgKi8KLUVYVEVSTiBpbnQgZGVmaVByb3BfaGFzTnVtYmVyIChjb25zdCBkZWZpUHJvcCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaVByb3BfaGFzUmFuZ2UgKGNvbnN0IGRlZmlQcm9wKiBvYmopOwotRVhURVJOIGludCBkZWZpUHJvcF9oYXNTdHJpbmcgKGNvbnN0IGRlZmlQcm9wKiBvYmopOwotRVhURVJOIGludCBkZWZpUHJvcF9oYXNOYW1lTWFwU3RyaW5nIChjb25zdCBkZWZpUHJvcCogb2JqKTsKLUVYVEVSTiBkb3VibGUgZGVmaVByb3BfbnVtYmVyIChjb25zdCBkZWZpUHJvcCogb2JqKTsKLUVYVEVSTiBkb3VibGUgZGVmaVByb3BfbGVmdCAoY29uc3QgZGVmaVByb3AqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGRlZmlQcm9wX3JpZ2h0IChjb25zdCBkZWZpUHJvcCogb2JqKTsKLQotRVhURVJOIHZvaWQgZGVmaVByb3BfcHJpbnQgKGNvbnN0IGRlZmlQcm9wKiBvYmosIEZJTEUqICBmKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogICBOOm5hbWVNYXBTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZpUHJvcFR5cGUuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZmlQcm9wVHlwZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjBmYzhlLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZmlQcm9wVHlwZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBBVFRFTlRJT046IFRISVMgSVMgQU4gQVVUTy1HRU5FUkFURUQgRklMRS4gRE8gTk9UIENIQU5HRSBJVCEgICAgICAgICAgICAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBDb3B5cmlnaHQgMjAxMywgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlICAgICAgICAgICAgICovCi0vKiBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAgICAgICAgICAgICovCi0vKiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICAgICAgICAqLwotLyogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICovCi0vKiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAgICAgICAqLwotLyogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgICAgKi8KLS8qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgICAgICovCi0vKiAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksICAgICAgICAgICovCi0vKiBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkQXV0aG9yOiBkZWxsICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRSZXZpc2lvbjogIzEgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICREYXRlOiAyMDE3LzA2LzA2ICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJFN0YXRlOiAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLQotI2lmbmRlZiBDREVGSVBST1BUWVBFX0gKLSNkZWZpbmUgQ0RFRklQUk9QVFlQRV9ICi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImRlZmlUeXBlZGVmcy5oIgotCi0vKiBTdHJ1Y3QgaG9sZHMgdGhlIGRhdGEgdHlwZSBmb3Igb25lIHByb3BlcnR5LCBpZiB0aGUgcHJvcGVydHkgaXMgICAgICAgICAgICAqLwotLyogZWl0aGVyIFJFQUwgb3IgSU5URUdFUi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotRVhURVJOIGNvbnN0IGNoYXIgZGVmaVByb3BUeXBlX3Byb3BUeXBlIChjb25zdCBkZWZpUHJvcFR5cGUqIG9iaiwgY2hhciogIG5hbWUpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZmlSZWdpb24uaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZmlSZWdpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmViNTBmMS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZpUmVnaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qIEFUVEVOVElPTjogVEhJUyBJUyBBTiBBVVRPLUdFTkVSQVRFRCBGSUxFLiBETyBOT1QgQ0hBTkdFIElUISAgICAgICAgICAgICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qIENvcHlyaWdodCAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UgICAgICAgICAgICAgKi8KLS8qIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7ICAgICAgICAgICAgKi8KLS8qICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gICAgICAgICovCi0vKiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAgICAgKi8KLS8qICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsICAgICAgICovCi0vKiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICAgICAqLwotLyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICAgICAgKi8KLS8qICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwgICAgICAgICAgKi8KLS8qIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRBdXRob3I6IGRlbGwgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJFJldmlzaW9uOiAjMSAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJERhdGU6IDIwMTcvMDYvMDYgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkU3RhdGU6ICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotCi0jaWZuZGVmIENERUZJUkVHSU9OX0gKLSNkZWZpbmUgQ0RFRklSRUdJT05fSAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJkZWZpVHlwZWRlZnMuaCIKLQotLyogU3RydWN0IGhvbGRzIHRoZSBkYXRhIGZvciBvbmUgcHJvcGVydHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlSZWdpb25fbmFtZSAoY29uc3QgZGVmaVJlZ2lvbiogb2JqKTsKLQotRVhURVJOIGludCBkZWZpUmVnaW9uX251bVByb3BzIChjb25zdCBkZWZpUmVnaW9uKiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlSZWdpb25fcHJvcE5hbWUgKGNvbnN0IGRlZmlSZWdpb24qIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaVJlZ2lvbl9wcm9wVmFsdWUgKGNvbnN0IGRlZmlSZWdpb24qIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGRlZmlSZWdpb25fcHJvcE51bWJlciAoY29uc3QgZGVmaVJlZ2lvbiogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBjb25zdCBjaGFyIGRlZmlSZWdpb25fcHJvcFR5cGUgKGNvbnN0IGRlZmlSZWdpb24qIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlSZWdpb25fcHJvcElzTnVtYmVyIChjb25zdCBkZWZpUmVnaW9uKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpUmVnaW9uX3Byb3BJc1N0cmluZyAoY29uc3QgZGVmaVJlZ2lvbiogb2JqLCBpbnQgIGluZGV4KTsKLQotRVhURVJOIGludCBkZWZpUmVnaW9uX2hhc1R5cGUgKGNvbnN0IGRlZmlSZWdpb24qIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaVJlZ2lvbl90eXBlIChjb25zdCBkZWZpUmVnaW9uKiBvYmopOwotCi1FWFRFUk4gaW50IGRlZmlSZWdpb25fbnVtUmVjdGFuZ2xlcyAoY29uc3QgZGVmaVJlZ2lvbiogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaVJlZ2lvbl94bCAoY29uc3QgZGVmaVJlZ2lvbiogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgZGVmaVJlZ2lvbl95bCAoY29uc3QgZGVmaVJlZ2lvbiogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgZGVmaVJlZ2lvbl94aCAoY29uc3QgZGVmaVJlZ2lvbiogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgZGVmaVJlZ2lvbl95aCAoY29uc3QgZGVmaVJlZ2lvbiogb2JqLCBpbnQgIGluZGV4KTsKLQotRVhURVJOIHZvaWQgZGVmaVJlZ2lvbl9wcmludCAoY29uc3QgZGVmaVJlZ2lvbiogb2JqLCBGSUxFKiAgZik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYvZGVmaVJvd1RyYWNrLmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZpUm93VHJhY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwZDRhYi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZpUm93VHJhY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQ29weXJpZ2h0IDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZSAgICAgICAgICAgICAqLwotLyogRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAqLwotLyogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgKi8KLS8qICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAqLwotLyogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgKi8KLS8qICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgICAgICovCi0vKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgICAgICAqLwotLyogICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LCAgICAgICAgICAqLwotLyogY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJEF1dGhvcjogZGVsbCAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkUmV2aXNpb246ICMxICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkRGF0ZTogMjAxNy8wNi8wNiAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRTdGF0ZTogICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0KLSNpZm5kZWYgQ0RFRklST1dUUkFDS19ICi0jZGVmaW5lIENERUZJUk9XVFJBQ0tfSAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJkZWZpVHlwZWRlZnMuaCIKLQotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlSb3dfbmFtZSAoY29uc3QgZGVmaVJvdyogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpUm93X21hY3JvIChjb25zdCBkZWZpUm93KiBvYmopOwotRVhURVJOIGRvdWJsZSBkZWZpUm93X3ggKGNvbnN0IGRlZmlSb3cqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGRlZmlSb3dfeSAoY29uc3QgZGVmaVJvdyogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaVJvd19vcmllbnQgKGNvbnN0IGRlZmlSb3cqIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaVJvd19vcmllbnRTdHIgKGNvbnN0IGRlZmlSb3cqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlSb3dfaGFzRG8gKGNvbnN0IGRlZmlSb3cqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGRlZmlSb3dfeE51bSAoY29uc3QgZGVmaVJvdyogb2JqKTsKLUVYVEVSTiBkb3VibGUgZGVmaVJvd195TnVtIChjb25zdCBkZWZpUm93KiBvYmopOwotRVhURVJOIGludCBkZWZpUm93X2hhc0RvU3RlcCAoY29uc3QgZGVmaVJvdyogb2JqKTsKLUVYVEVSTiBkb3VibGUgZGVmaVJvd194U3RlcCAoY29uc3QgZGVmaVJvdyogb2JqKTsKLUVYVEVSTiBkb3VibGUgZGVmaVJvd195U3RlcCAoY29uc3QgZGVmaVJvdyogb2JqKTsKLQotRVhURVJOIGludCBkZWZpUm93X251bVByb3BzIChjb25zdCBkZWZpUm93KiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlSb3dfcHJvcE5hbWUgKGNvbnN0IGRlZmlSb3cqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaVJvd19wcm9wVmFsdWUgKGNvbnN0IGRlZmlSb3cqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGRlZmlSb3dfcHJvcE51bWJlciAoY29uc3QgZGVmaVJvdyogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBjb25zdCBjaGFyIGRlZmlSb3dfcHJvcFR5cGUgKGNvbnN0IGRlZmlSb3cqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlSb3dfcHJvcElzTnVtYmVyIChjb25zdCBkZWZpUm93KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpUm93X3Byb3BJc1N0cmluZyAoY29uc3QgZGVmaVJvdyogb2JqLCBpbnQgIGluZGV4KTsKLQotRVhURVJOIHZvaWQgZGVmaVJvd19wcmludCAoY29uc3QgZGVmaVJvdyogb2JqLCBGSUxFKiAgZik7Ci0KLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpVHJhY2tfbWFjcm8gKGNvbnN0IGRlZmlUcmFjayogb2JqKTsKLUVYVEVSTiBkb3VibGUgZGVmaVRyYWNrX3ggKGNvbnN0IGRlZmlUcmFjayogb2JqKTsKLUVYVEVSTiBkb3VibGUgZGVmaVRyYWNrX3hOdW0gKGNvbnN0IGRlZmlUcmFjayogb2JqKTsKLUVYVEVSTiBkb3VibGUgZGVmaVRyYWNrX3hTdGVwIChjb25zdCBkZWZpVHJhY2sqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlUcmFja19udW1MYXllcnMgKGNvbnN0IGRlZmlUcmFjayogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpVHJhY2tfbGF5ZXIgKGNvbnN0IGRlZmlUcmFjayogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgZGVmaVRyYWNrX2ZpcnN0VHJhY2tNYXNrIChjb25zdCBkZWZpVHJhY2sqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlUcmFja19zYW1lTWFzayAoY29uc3QgZGVmaVRyYWNrKiBvYmopOwotCi1FWFRFUk4gdm9pZCBkZWZpVHJhY2tfcHJpbnQgKGNvbnN0IGRlZmlUcmFjayogb2JqLCBGSUxFKiAgZik7Ci0KLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpR2NlbGxHcmlkX21hY3JvIChjb25zdCBkZWZpR2NlbGxHcmlkKiBvYmopOwotRVhURVJOIGludCBkZWZpR2NlbGxHcmlkX3ggKGNvbnN0IGRlZmlHY2VsbEdyaWQqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlHY2VsbEdyaWRfeE51bSAoY29uc3QgZGVmaUdjZWxsR3JpZCogb2JqKTsKLUVYVEVSTiBkb3VibGUgZGVmaUdjZWxsR3JpZF94U3RlcCAoY29uc3QgZGVmaUdjZWxsR3JpZCogb2JqKTsKLQotRVhURVJOIHZvaWQgZGVmaUdjZWxsR3JpZF9wcmludCAoY29uc3QgZGVmaUdjZWxsR3JpZCogb2JqLCBGSUxFKiAgZik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYvZGVmaVNjYW5jaGFpbi5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYvZGVmaVNjYW5jaGFpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDQ5YzRmLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZmlTY2FuY2hhaW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQ29weXJpZ2h0IDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZSAgICAgICAgICAgICAqLwotLyogRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAqLwotLyogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgKi8KLS8qICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAqLwotLyogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgKi8KLS8qICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgICAgICovCi0vKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgICAgICAqLwotLyogICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LCAgICAgICAgICAqLwotLyogY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJEF1dGhvcjogZGVsbCAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkUmV2aXNpb246ICMxICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkRGF0ZTogMjAxNy8wNi8wNiAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRTdGF0ZTogICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0KLSNpZm5kZWYgQ0RFRklTQ0FOQ0hBSU5fSAotI2RlZmluZSBDREVGSVNDQU5DSEFJTl9ICi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImRlZmlUeXBlZGVmcy5oIgotCi1FWFRFUk4gaW50IGRlZmlPcmRlcmVkX251bSAoY29uc3QgZGVmaU9yZGVyZWQqIG9iaik7Ci1FWFRFUk4gY2hhcioqIGRlZmlPcmRlcmVkX2luc3QgKGNvbnN0IGRlZmlPcmRlcmVkKiBvYmopOwotRVhURVJOIGNoYXIqKiBkZWZpT3JkZXJlZF9pbiAoY29uc3QgZGVmaU9yZGVyZWQqIG9iaik7Ci1FWFRFUk4gY2hhcioqIGRlZmlPcmRlcmVkX291dCAoY29uc3QgZGVmaU9yZGVyZWQqIG9iaik7Ci1FWFRFUk4gaW50KiBkZWZpT3JkZXJlZF9iaXRzIChjb25zdCBkZWZpT3JkZXJlZCogb2JqKTsKLQotLyogU3RydWN0IGhvbGRzIHRoZSBkYXRhIGZvciBvbmUgU2NhbiBjaGFpbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpU2NhbmNoYWluX25hbWUgKGNvbnN0IGRlZmlTY2FuY2hhaW4qIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlTY2FuY2hhaW5faGFzU3RhcnQgKGNvbnN0IGRlZmlTY2FuY2hhaW4qIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlTY2FuY2hhaW5faGFzU3RvcCAoY29uc3QgZGVmaVNjYW5jaGFpbiogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaVNjYW5jaGFpbl9oYXNGbG9hdGluZyAoY29uc3QgZGVmaVNjYW5jaGFpbiogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaVNjYW5jaGFpbl9oYXNPcmRlcmVkIChjb25zdCBkZWZpU2NhbmNoYWluKiBvYmopOwotRVhURVJOIGludCBkZWZpU2NhbmNoYWluX2hhc0NvbW1vbkluUGluIChjb25zdCBkZWZpU2NhbmNoYWluKiBvYmopOwotRVhURVJOIGludCBkZWZpU2NhbmNoYWluX2hhc0NvbW1vbk91dFBpbiAoY29uc3QgZGVmaVNjYW5jaGFpbiogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaVNjYW5jaGFpbl9oYXNQYXJ0aXRpb24gKGNvbnN0IGRlZmlTY2FuY2hhaW4qIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlTY2FuY2hhaW5faGFzUGFydGl0aW9uTWF4Qml0cyAoY29uc3QgZGVmaVNjYW5jaGFpbiogb2JqKTsKLQotICAvKiBJZiB0aGUgcGluIHBhcnQgb2YgdGhlc2Ugcm91dGluZXMgd2VyZSBub3Qgc3VwcGxpZWQgaW4gdGhlIERFRiAgICAgICAgICAgKi8KLSAgLyogdGhlbiBhIE5VTEwgcG9pbnRlciB3aWxsIGJlIHJldHVybmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gdm9pZCBkZWZpU2NhbmNoYWluX3N0YXJ0IChjb25zdCBkZWZpU2NhbmNoYWluKiBvYmosIGNoYXIqKiAgaW5zdCwgY2hhcioqICBwaW4pOwotRVhURVJOIHZvaWQgZGVmaVNjYW5jaGFpbl9zdG9wIChjb25zdCBkZWZpU2NhbmNoYWluKiBvYmosIGNoYXIqKiAgaW5zdCwgY2hhcioqICBwaW4pOwotCi0gIC8qIFRoZXJlIGNvdWxkIGJlIG1hbnkgT1JERVJFRCBjb25zdHJ1Y3RzIGluIHRoZSBERUYuICBUaGUgZGF0YSBpbiAgICAgICAgICAqLwotICAvKiBlYWNoIE9SREVSRUQgY29uc3RydWN0IGlzIHN0b3JlZCBpbiBpdHMgb3duIGFycmF5LiAgVGhlIG51bU9yZGVyZWRMaXN0cyggKi8KLSAgLyogcm91dGluZSB0ZWxscyBob3cgbWFueSBsaXN0cyB0aGVyZSBhcmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGRlZmlTY2FuY2hhaW5fbnVtT3JkZXJlZExpc3RzIChjb25zdCBkZWZpU2NhbmNoYWluKiBvYmopOwotCi0gIC8qIFRoaXMgcm91dGluZSB3aWxsIHJldHVybiBhbiBhcnJheSBvZiBpbnN0YW5jZXMgYW5kICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBhbiBhcnJheSBvZiBpbiBhbmQgb3V0IHBpbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG51bWJlciBpZiB0aGluZ3MgaW4gdGhlIGFycmF5cyBpcyByZXR1cm5lZCBpbiBzaXplLiAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBpblBpbiBhbmQgb3V0UGluIGVudHJ5IGlzIG9wdGlvbmFsIGZvciBlYWNoIGluc3RhbmNlLiAgICAgICAgICAgICAgICAqLwotICAvKiBJZiBhbiBlbnRyeSBpcyBub3QgZ2l2ZW4sIHRoZW4gdGhhdCBjaGFyKiBpcyBOVUxMLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRm9yIGV4YW1wbGUgaWYgdGhlIHNlY29uZCBpbnN0YW5jZSBoYXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIGluc3RuYW09ICJGT08iIGFuZCBJTj0iQSIsIGJ1dCBubyBPVVQgZ2l2ZW4sIHRoZW4gaW5zdFsxXSBwb2ludHMgICAgICAgICAqLwotICAvKiB0byAiRk9PIiAgaW5QaW5bMV0gcG9pbnRzIHRvICJBIiBhbmQgb3V0UGluWzFdIGlzIGEgTlVMTCBwb2ludGVyLiAgICAgICAgKi8KLUVYVEVSTiB2b2lkIGRlZmlTY2FuY2hhaW5fb3JkZXJlZCAoY29uc3QgZGVmaVNjYW5jaGFpbiogb2JqLCBpbnQgIGluZGV4LCBpbnQqICBzaXplLCBjaGFyKioqICBpbnN0LCBjaGFyKioqICBpblBpbiwgY2hhcioqKiAgb3V0UGluLCBpbnQqKiAgYml0cyk7Ci0KLSAgLyogQWxsIG9mIHRoZSBmbG9hdGluZyBjb25zdHJ1Y3RzIGluIHRoZSBzY2FuIGNoYWluIGFyZSAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIHN0b3JlZCBpbiB0aGlzIG9uZSBhcnJheS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJZiB0aGUgSU4gb3IgT1VUIG9mIGFuIGVudHJ5IGlzIG5vdCBzdXBwbGllZCB0aGVuIHRoZSBhcnJheSB3aWxsIGhhdmUgICAgKi8KLSAgLyogYSBOVUxMIHBvaW50ZXIgaW4gdGhhdCBwbGFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gdm9pZCBkZWZpU2NhbmNoYWluX2Zsb2F0aW5nIChjb25zdCBkZWZpU2NhbmNoYWluKiBvYmosIGludCogIHNpemUsIGNoYXIqKiogIGluc3QsIGNoYXIqKiogIGluUGluLCBjaGFyKioqICBvdXRQaW4sIGludCoqICBiaXRzKTsKLQotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlTY2FuY2hhaW5fY29tbW9uSW5QaW4gKGNvbnN0IGRlZmlTY2FuY2hhaW4qIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaVNjYW5jaGFpbl9jb21tb25PdXRQaW4gKGNvbnN0IGRlZmlTY2FuY2hhaW4qIG9iaik7Ci0KLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpU2NhbmNoYWluX3BhcnRpdGlvbk5hbWUgKGNvbnN0IGRlZmlTY2FuY2hhaW4qIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlTY2FuY2hhaW5fcGFydGl0aW9uTWF4Qml0cyAoY29uc3QgZGVmaVNjYW5jaGFpbiogb2JqKTsKLQotRVhURVJOIHZvaWQgZGVmaVNjYW5jaGFpbl9wcmludCAoY29uc3QgZGVmaVNjYW5jaGFpbiogb2JqLCBGSUxFKiAgZik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYvZGVmaVNpdGUuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZmlTaXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNTNjZWIuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYvZGVmaVNpdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQ29weXJpZ2h0IDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZSAgICAgICAgICAgICAqLwotLyogRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAqLwotLyogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgKi8KLS8qICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAqLwotLyogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgKi8KLS8qICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgICAgICovCi0vKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgICAgICAqLwotLyogICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LCAgICAgICAgICAqLwotLyogY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJEF1dGhvcjogZGVsbCAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkUmV2aXNpb246ICMxICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkRGF0ZTogMjAxNy8wNi8wNiAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRTdGF0ZTogICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0KLSNpZm5kZWYgQ0RFRklTSVRFX0gKLSNkZWZpbmUgQ0RFRklTSVRFX0gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiZGVmaVR5cGVkZWZzLmgiCi0KLS8qCi0gKiBTdHJ1Y3QgaG9sZHMgdGhlIGRhdGEgZm9yIG9uZSBzaXRlLgotICogSXQgaXMgYWxzbyB1c2VkIGZvciBhIGNhbnBsYWNlIGFuZCBjYW5ub3RvY2N1cHkuCi0gKi8KLQotRVhURVJOIGRvdWJsZSBkZWZpU2l0ZV94X251bSAoY29uc3QgZGVmaVNpdGUqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGRlZmlTaXRlX3lfbnVtIChjb25zdCBkZWZpU2l0ZSogb2JqKTsKLUVYVEVSTiBkb3VibGUgZGVmaVNpdGVfeF9zdGVwIChjb25zdCBkZWZpU2l0ZSogb2JqKTsKLUVYVEVSTiBkb3VibGUgZGVmaVNpdGVfeV9zdGVwIChjb25zdCBkZWZpU2l0ZSogb2JqKTsKLUVYVEVSTiBkb3VibGUgZGVmaVNpdGVfeF9vcmlnIChjb25zdCBkZWZpU2l0ZSogb2JqKTsKLUVYVEVSTiBkb3VibGUgZGVmaVNpdGVfeV9vcmlnIChjb25zdCBkZWZpU2l0ZSogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaVNpdGVfb3JpZW50IChjb25zdCBkZWZpU2l0ZSogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpU2l0ZV9vcmllbnRTdHIgKGNvbnN0IGRlZmlTaXRlKiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlTaXRlX25hbWUgKGNvbnN0IGRlZmlTaXRlKiBvYmopOwotCi1FWFRFUk4gdm9pZCBkZWZpU2l0ZV9wcmludCAoY29uc3QgZGVmaVNpdGUqIG9iaiwgRklMRSogIGYpOwotCi0vKiBTdHJ1Y3QgaG9sZHMgdGhlIGRhdGEgZm9yIGEgQm94ICovCi0gIC8qIFVzZSB0aGUgZGVmYXVsdCBkZXN0cnVjdG9yIGFuZCBjb25zdHJ1Y3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA1LjYgY2hhbmdlZCB0byB1c2UgaXQgb3duIGNvbnN0cnVjdG9yICYgZGVzdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAvKiBOT1RFOiA1LjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSBzdGlsbCBoZXJlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICAgICAgICAgICovCi0gIC8qIEZvciBuZXcgcmVhZGVyIHRoZXkgc2hvdWxkIHVzZSBudW1Qb2ludHMgJiBnZXRQb2ludCB0byBnZXQgdGhlICAgICAgICAgICAqLwotICAvKiBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgZGVmaUJveF94bCAoY29uc3QgZGVmaUJveCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaUJveF95bCAoY29uc3QgZGVmaUJveCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaUJveF94aCAoY29uc3QgZGVmaUJveCogb2JqKTsKLUVYVEVSTiBpbnQgZGVmaUJveF95aCAoY29uc3QgZGVmaUJveCogb2JqKTsKLQotRVhURVJOIHN0cnVjdCBkZWZpUG9pbnRzIGRlZmlCb3hfZ2V0UG9pbnQgKGNvbnN0IGRlZmlCb3gqIG9iaik7Ci0KLUVYVEVSTiB2b2lkIGRlZmlCb3hfcHJpbnQgKGNvbnN0IGRlZmlCb3gqIG9iaiwgRklMRSogIGYpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZmlTbG90LmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZpU2xvdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTE5NDIzLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZmlTbG90LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qIEFUVEVOVElPTjogVEhJUyBJUyBBTiBBVVRPLUdFTkVSQVRFRCBGSUxFLiBETyBOT1QgQ0hBTkdFIElUISAgICAgICAgICAgICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qIENvcHlyaWdodCAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UgICAgICAgICAgICAgKi8KLS8qIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7ICAgICAgICAgICAgKi8KLS8qICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gICAgICAgICovCi0vKiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAgICAgKi8KLS8qICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsICAgICAgICovCi0vKiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICAgICAqLwotLyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICAgICAgKi8KLS8qICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwgICAgICAgICAgKi8KLS8qIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRBdXRob3I6IGRlbGwgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJFJldmlzaW9uOiAjMSAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJERhdGU6IDIwMTcvMDYvMDYgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkU3RhdGU6ICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotCi0jaWZuZGVmIENERUZJU0xPVF9ICi0jZGVmaW5lIENERUZJU0xPVF9ICi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImRlZmlUeXBlZGVmcy5oIgotCi1FWFRFUk4gaW50IGRlZmlTbG90X2hhc0xheWVyIChjb25zdCBkZWZpU2xvdCogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpU2xvdF9sYXllck5hbWUgKGNvbnN0IGRlZmlTbG90KiBvYmopOwotCi1FWFRFUk4gaW50IGRlZmlTbG90X251bVJlY3RhbmdsZXMgKGNvbnN0IGRlZmlTbG90KiBvYmopOwotRVhURVJOIGludCBkZWZpU2xvdF94bCAoY29uc3QgZGVmaVNsb3QqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlTbG90X3lsIChjb25zdCBkZWZpU2xvdCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgZGVmaVNsb3RfeGggKGNvbnN0IGRlZmlTbG90KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBkZWZpU2xvdF95aCAoY29uc3QgZGVmaVNsb3QqIG9iaiwgaW50ICBpbmRleCk7Ci0KLUVYVEVSTiBpbnQgZGVmaVNsb3RfbnVtUG9seWdvbnMgKGNvbnN0IGRlZmlTbG90KiBvYmopOwotRVhURVJOIHN0cnVjdCBkZWZpUG9pbnRzIGRlZmlTbG90X2dldFBvbHlnb24gKGNvbnN0IGRlZmlTbG90KiBvYmosIGludCAgaW5kZXgpOwotCi1FWFRFUk4gdm9pZCBkZWZpU2xvdF9wcmludCAoY29uc3QgZGVmaVNsb3QqIG9iaiwgRklMRSogIGYpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZmlUaW1pbmdEaXNhYmxlLmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZpVGltaW5nRGlzYWJsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTA2YWU5Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZmlUaW1pbmdEaXNhYmxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qIEFUVEVOVElPTjogVEhJUyBJUyBBTiBBVVRPLUdFTkVSQVRFRCBGSUxFLiBETyBOT1QgQ0hBTkdFIElUISAgICAgICAgICAgICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qIENvcHlyaWdodCAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UgICAgICAgICAgICAgKi8KLS8qIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7ICAgICAgICAgICAgKi8KLS8qICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gICAgICAgICovCi0vKiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAgICAgKi8KLS8qICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsICAgICAgICovCi0vKiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICAgICAqLwotLyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICAgICAgKi8KLS8qICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwgICAgICAgICAgKi8KLS8qIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRBdXRob3I6IGRlbGwgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJFJldmlzaW9uOiAjMSAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJERhdGU6IDIwMTcvMDYvMDYgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkU3RhdGU6ICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotCi0jaWZuZGVmIENERUZJVElNSU5HRElTQUJMRV9ICi0jZGVmaW5lIENERUZJVElNSU5HRElTQUJMRV9ICi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImRlZmlUeXBlZGVmcy5oIgotCi0vKiBBIFRpbWluZyBkaXNhYmxlIGNhbiBiZSBhIGZyb20tdG8gIG9yIGEgdGhydSBvciBhIG1hY3JvLiAgICAgICAgICAgICAgICAgICAqLwotLyogICBBIG1hY3JvIGlzIGVpdGhlciBhIGZyb210byBtYWNybyBvciBhIHRocnUgbWFjcm8uICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotRVhURVJOIGludCBkZWZpVGltaW5nRGlzYWJsZV9oYXNNYWNyb1RocnUgKGNvbnN0IGRlZmlUaW1pbmdEaXNhYmxlKiBvYmopOwotRVhURVJOIGludCBkZWZpVGltaW5nRGlzYWJsZV9oYXNNYWNyb0Zyb21UbyAoY29uc3QgZGVmaVRpbWluZ0Rpc2FibGUqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlUaW1pbmdEaXNhYmxlX2hhc1RocnUgKGNvbnN0IGRlZmlUaW1pbmdEaXNhYmxlKiBvYmopOwotRVhURVJOIGludCBkZWZpVGltaW5nRGlzYWJsZV9oYXNGcm9tVG8gKGNvbnN0IGRlZmlUaW1pbmdEaXNhYmxlKiBvYmopOwotRVhURVJOIGludCBkZWZpVGltaW5nRGlzYWJsZV9oYXNSZWVudHJhbnRQYXRoc0ZsYWcgKGNvbnN0IGRlZmlUaW1pbmdEaXNhYmxlKiBvYmopOwotCi1FWFRFUk4gY29uc3QgY2hhciogZGVmaVRpbWluZ0Rpc2FibGVfZnJvbVBpbiAoY29uc3QgZGVmaVRpbWluZ0Rpc2FibGUqIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaVRpbWluZ0Rpc2FibGVfdG9QaW4gKGNvbnN0IGRlZmlUaW1pbmdEaXNhYmxlKiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlUaW1pbmdEaXNhYmxlX2Zyb21JbnN0IChjb25zdCBkZWZpVGltaW5nRGlzYWJsZSogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpVGltaW5nRGlzYWJsZV90b0luc3QgKGNvbnN0IGRlZmlUaW1pbmdEaXNhYmxlKiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGRlZmlUaW1pbmdEaXNhYmxlX21hY3JvTmFtZSAoY29uc3QgZGVmaVRpbWluZ0Rpc2FibGUqIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaVRpbWluZ0Rpc2FibGVfdGhydVBpbiAoY29uc3QgZGVmaVRpbWluZ0Rpc2FibGUqIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaVRpbWluZ0Rpc2FibGVfdGhydUluc3QgKGNvbnN0IGRlZmlUaW1pbmdEaXNhYmxlKiBvYmopOwotCi0gIC8qIGRlYnVnIHByaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIHZvaWQgZGVmaVRpbWluZ0Rpc2FibGVfcHJpbnQgKGNvbnN0IGRlZmlUaW1pbmdEaXNhYmxlKiBvYmosIEZJTEUqICBmKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZpVHlwZWRlZnMuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZmlUeXBlZGVmcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODU4MDk0Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZmlUeXBlZGVmcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLSAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0gLyogQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhICovCi0gLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLSAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotIC8qIENvcHlyaWdodCAyMDEyLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zICovCi0gLyogICovCi0gLyogVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UgKi8KLSAvKiBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAgKi8KLSAvKiAgKi8KLSAvKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyAqLwotIC8qICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gKi8KLSAvKiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgKi8KLSAvKiAgKi8KLSAvKiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICovCi0gLyogICovCi0gLyogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAqLwotIC8qICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywgKi8KLSAvKiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgKi8KLSAvKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgKi8KLSAvKiAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICovCi0gLyogICovCi0gLyogICovCi0gLyogRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwgKi8KLSAvKiBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuICovCi0gLyogICovCi0gLyogICRBdXRob3I6IHh4eCAkICovCi0gLyogICRSZXZpc2lvbjogeHh4ICQgKi8KLSAvKiAgJERhdGU6IHh4eCAkICovCi0gLyogICRTdGF0ZTogeHh4ICQgKi8KLSAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLSNpZm5kZWYgQ0xFRklUWVBFREVGU19ICi0jZGVmaW5lIENMRUZJVFlQRURFRlNfSAotCi0jaWZuZGVmIEVYVEVSTgotI2RlZmluZSBFWFRFUk4gZXh0ZXJuCi0jZW5kaWYKLQotI2RlZmluZSBib29sIGludAotI2RlZmluZSBkZWZpVXNlckRhdGEgdm9pZCAqCi0jZGVmaW5lIGRlZmlVc2VyRGF0YUhhbmRsZSB2b2lkICoqCi0KLS8qIFR5cGVkZWZzICovCi0KLS8qIFBvaW50ZXJzIHRvIEMrKyBjbGFzc2VzICovCi10eXBlZGVmIHZvaWQgKmRlZmlQaW5Qb3J0OwotdHlwZWRlZiB2b2lkICpkZWZpVGltaW5nRGlzYWJsZTsKLXR5cGVkZWYgdm9pZCAqZGVmaVBhcnRpdGlvbjsKLXR5cGVkZWYgdm9pZCAqZGVmaUFzc2VydGlvbjsKLXR5cGVkZWYgdm9pZCAqZGVmaVBpbkFudGVubmFNb2RlbDsKLXR5cGVkZWYgdm9pZCAqZGVmaUlPVGltaW5nOwotdHlwZWRlZiB2b2lkICpkZWZpUmVnaW9uOwotdHlwZWRlZiB2b2lkICpkZWZpU3VibmV0OwotdHlwZWRlZiB2b2lkICpkZWZpVHJhY2s7Ci10eXBlZGVmIHZvaWQgKmRlZmlQcm9wOwotdHlwZWRlZiB2b2lkICpkZWZpUm93OwotdHlwZWRlZiB2b2lkICpkZWZpRlBDOwotdHlwZWRlZiB2b2lkICpkZWZpU2hpZWxkOwotdHlwZWRlZiB2b2lkICpkZWZpVmlhOwotdHlwZWRlZiB2b2lkICpkZWZpTm9uRGVmYXVsdDsKLXR5cGVkZWYgdm9pZCAqZGVmaUJveDsKLXR5cGVkZWYgdm9pZCAqZGVmaVdpcmU7Ci10eXBlZGVmIHZvaWQgKmRlZmlPcmRlcmVkOwotdHlwZWRlZiB2b2lkICpkZWZpUHJvcFR5cGU7Ci10eXBlZGVmIHZvaWQgKmRlZmlBbGlhc19pdHI7Ci10eXBlZGVmIHZvaWQgKmRlZmlTY2FuY2hhaW47Ci10eXBlZGVmIHZvaWQgKmRlZmlDb21wb25lbnQ7Ci10eXBlZGVmIHZvaWQgKmRlZmlGaWxsOwotdHlwZWRlZiB2b2lkICpkZWZpU2l0ZTsKLXR5cGVkZWYgdm9pZCAqZGVmaVBpbjsKLXR5cGVkZWYgdm9pZCAqZGVmaVBpblByb3A7Ci10eXBlZGVmIHZvaWQgKmRlZmlTdHlsZXM7Ci10eXBlZGVmIHZvaWQgKmRlZmlCbG9ja2FnZTsKLXR5cGVkZWYgdm9pZCAqZGVmaUdlb21ldHJpZXM7Ci10eXBlZGVmIHZvaWQgKmRlZmlWcGluOwotdHlwZWRlZiB2b2lkICpkZWZpTmV0OwotdHlwZWRlZiB2b2lkICpkZWZpU2xvdDsKLXR5cGVkZWYgdm9pZCAqZGVmaUdjZWxsR3JpZDsKLXR5cGVkZWYgdm9pZCAqZGVmaVBhdGg7Ci10eXBlZGVmIHZvaWQgKmRlZmlHcm91cDsKLXR5cGVkZWYgdm9pZCAqZGVmaVBpbkNhcDsKLXR5cGVkZWYgdm9pZCAqZGVmaUNvbXBvbmVudE1hc2tTaGlmdExheWVyOwotdHlwZWRlZiB2b2lkICpkZWZyRGF0YTsKLQotLyogRGF0YSBzdHJ1Y3R1cmVzIGRlZmluaXRpb25zICovCi1zdHJ1Y3QgZGVmaVBvaW50cyB7Ci0gIGludCBudW1Qb2ludHM7Ci0gIGludCogeDsKLSAgaW50KiB5OwotfTsKLQotc3RydWN0IGRlZmlQbnQgewotICBpbnQgeDsKLSAgaW50IHk7Ci0gIGludCBleHQ7Ci19OwotCi1zdHJ1Y3QgZGVmaVZpYURhdGEgewotICBpbnQgbnVtWDsKLSAgaW50IG51bVk7Ci0gIGludCBzdGVwWDsKLSAgaW50IHN0ZXBZOwotfTsKLQotc3RydWN0IGRlZmlWaWFSZWN0IHsKLSAgaW50IGRlbHRhWDE7Ci0gIGludCBkZWx0YVkxOwotICBpbnQgZGVsdGFYMjsKLSAgaW50IGRlbHRhWTI7Ci19OwotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYvZGVmaVVzZXIuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZmlVc2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMTEzYTUuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYvZGVmaVVzZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQ29weXJpZ2h0IDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZSAgICAgICAgICAgICAqLwotLyogRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAqLwotLyogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgKi8KLS8qICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAqLwotLyogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgKi8KLS8qICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgICAgICovCi0vKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgICAgICAqLwotLyogICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LCAgICAgICAgICAqLwotLyogY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJEF1dGhvcjogZGVsbCAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJFJldmlzaW9uOiAjMSAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICREYXRlOiAyMDE3LzA2LzA2ICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkU3RhdGU6ICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotLyoKLSAqIFVzZXIgaGVhZGVyIGZpbGUgZm9yIHRoZSBERUYgSW50ZXJmYWNlLiAgVGhpcyBpbmNsdWRlcwotICogYWxsIG9mIHRoZSBoZWFkZXIgZmlsZXMgd2hpY2ggYXJlIHJlbGV2YW50IHRvIGJvdGggdGhlCi0gKiByZWFkZXIgYW5kIHRoZSB3cml0ZXIuCi0gKgotICogZGVmclJlYWRlci5oIGFuZCBkZWZ3V3JpdGVyLmggaW5jbHVkZSB0aGlzIGZpbGUsIHNvIHRoYXQKLSAqIGFuIGFwcGxpY2F0aW9uIG9ubHkgbmVlZHMgdG8gaW5jbHVkZSBlaXRoZXIgZGVmd1JlYWRlci5oCi0gKiBvciBkZWZ3V3JpdGVyLmguCi0gKi8KLQotCi0jaWZuZGVmIENERUZJVVNFUl9ICi0jZGVmaW5lIENERUZJVVNFUl9ICi0KLSNpbmNsdWRlICJkZWZpQWxpYXMuaCIKLSNpbmNsdWRlICJkZWZpQXNzZXJ0aW9uLmgiCi0jaW5jbHVkZSAiZGVmaUJsb2NrYWdlLmgiCi0jaW5jbHVkZSAiZGVmaUNvbXBvbmVudC5oIgotI2luY2x1ZGUgImRlZmlEZWJ1Zy5oIgotI2luY2x1ZGUgImRlZmlGaWxsLmgiCi0jaW5jbHVkZSAiZGVmaUZQQy5oIgotI2luY2x1ZGUgImRlZmlHcm91cC5oIgotI2luY2x1ZGUgImRlZmlJT1RpbWluZy5oIgotI2luY2x1ZGUgImRlZmlNaXNjLmgiCi0jaW5jbHVkZSAiZGVmaU5ldC5oIgotI2luY2x1ZGUgImRlZmlOb25EZWZhdWx0LmgiCi0jaW5jbHVkZSAiZGVmaVBhcnRpdGlvbi5oIgotI2luY2x1ZGUgImRlZmlQYXRoLmgiCi0jaW5jbHVkZSAiZGVmaVBpbkNhcC5oIgotI2luY2x1ZGUgImRlZmlQaW5Qcm9wLmgiCi0jaW5jbHVkZSAiZGVmaVByb3AuaCIKLSNpbmNsdWRlICJkZWZpUHJvcFR5cGUuaCIKLSNpbmNsdWRlICJkZWZpUmVnaW9uLmgiCi0jaW5jbHVkZSAiZGVmaVJvd1RyYWNrLmgiCi0jaW5jbHVkZSAiZGVmaVNjYW5jaGFpbi5oIgotI2luY2x1ZGUgImRlZmlTaXRlLmgiCi0jaW5jbHVkZSAiZGVmaVNsb3QuaCIKLSNpbmNsdWRlICJkZWZpVGltaW5nRGlzYWJsZS5oIgotI2luY2x1ZGUgImRlZmlWaWEuaCIKLQotCi0vKiBHZW5lcmFsIHV0aWxpdGllcy4gKi8KLS8qICNpbmNsdWRlICJkZWZpTWFsbG9jLmhwcCIgKi8KLS8qICNpbmNsdWRlICJkZWZpVXRpbHMuaHBwIiAqLwotCi0vKgotICogQVBJIG9iamVjdHMKLSAqLwotCi0vKiBORVcgQ0FMTEJBQ0sgLSBJZiB5b3UgYXJlIGNyZWF0aW5nIGEgbmV3IC5jcHAgYW5kIC5ocHAgZmlsZSB0bwotICogZGVzY3JpYmUgYSBuZXcgY2xhc3Mgb2Ygb2JqZWN0IGluIHRoZSBwYXJzZXIsIHRoZW4gYWRkIGEgcmVmZXJlbmNlCi0gKiB0byB0aGUgLmhwcCBoZXJlLgotICoKLSAqICBZb3UgbXVzdCBhbHNvIGFkZCBhbiBlbnRyeSBmb3IgdGhlIC5oIGFuZCB0aGUgLmhwcCBpbiB0aGUgcGFja2FnZV9saXN0Ci0gKiBmaWxlIG9mIHRoZSAuLi8uLi8uLi9yZWxlYXNlIGRpcmVjdG9yeS4gKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZpVmlhLmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZpVmlhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkM2Q0MTcuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYvZGVmaVZpYS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBBVFRFTlRJT046IFRISVMgSVMgQU4gQVVUTy1HRU5FUkFURUQgRklMRS4gRE8gTk9UIENIQU5HRSBJVCEgICAgICAgICAgICAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBDb3B5cmlnaHQgMjAxMywgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlICAgICAgICAgICAgICovCi0vKiBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAgICAgICAgICAgICovCi0vKiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICAgICAgICAqLwotLyogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICovCi0vKiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAgICAgICAqLwotLyogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgICAgKi8KLS8qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgICAgICovCi0vKiAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksICAgICAgICAgICovCi0vKiBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkQXV0aG9yOiBkZWxsICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRSZXZpc2lvbjogIzEgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICREYXRlOiAyMDE3LzA2LzA2ICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJFN0YXRlOiAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLQotI2lmbmRlZiBDREVGSVZJQV9ICi0jZGVmaW5lIENERUZJVklBX0gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiZGVmaVR5cGVkZWZzLmgiCi0KLS8qIFN0cnVjdCBob2xkcyB0aGUgZGF0YSBmb3Igb25lIHByb3BlcnR5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogNS42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpVmlhX25hbWUgKGNvbnN0IGRlZmlWaWEqIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaVZpYV9wYXR0ZXJuIChjb25zdCBkZWZpVmlhKiBvYmopOwotRVhURVJOIGludCBkZWZpVmlhX2hhc1BhdHRlcm4gKGNvbnN0IGRlZmlWaWEqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlWaWFfbnVtTGF5ZXJzIChjb25zdCBkZWZpVmlhKiBvYmopOwotRVhURVJOIHZvaWQgZGVmaVZpYV9sYXllciAoY29uc3QgZGVmaVZpYSogb2JqLCBpbnQgIGluZGV4LCBjaGFyKiogIGxheWVyLCBpbnQqICB4bCwgaW50KiAgeWwsIGludCogIHhoLCBpbnQqICB5aCk7Ci1FWFRFUk4gaW50IGRlZmlWaWFfbnVtUG9seWdvbnMgKGNvbnN0IGRlZmlWaWEqIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogZGVmaVZpYV9wb2x5Z29uTmFtZSAoY29uc3QgZGVmaVZpYSogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBzdHJ1Y3QgZGVmaVBvaW50cyBkZWZpVmlhX2dldFBvbHlnb24gKGNvbnN0IGRlZmlWaWEqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlWaWFfaGFzVmlhUnVsZSAoY29uc3QgZGVmaVZpYSogb2JqKTsKLUVYVEVSTiB2b2lkIGRlZmlWaWFfdmlhUnVsZSAoY29uc3QgZGVmaVZpYSogb2JqLCBjaGFyKiogIHZpYVJ1bGVOYW1lLCBpbnQqICB4U2l6ZSwgaW50KiAgeVNpemUsIGNoYXIqKiAgYm90TGF5ZXIsIGNoYXIqKiAgY3V0TGF5ZXIsIGNoYXIqKiAgdG9wTGF5ZXIsIGludCogIHhDdXRTcGFjaW5nLCBpbnQqICB5Q3V0U3BhY2luZywgaW50KiAgeEJvdEVuYywgaW50KiAgeUJvdEVuYywgaW50KiAgeFRvcEVuYywgaW50KiAgeVRvcEVuYyk7Ci1FWFRFUk4gaW50IGRlZmlWaWFfaGFzUm93Q29sIChjb25zdCBkZWZpVmlhKiBvYmopOwotRVhURVJOIHZvaWQgZGVmaVZpYV9yb3dDb2wgKGNvbnN0IGRlZmlWaWEqIG9iaiwgaW50KiAgbnVtQ3V0Um93cywgaW50KiAgbnVtQ3V0Q29scyk7Ci1FWFRFUk4gaW50IGRlZmlWaWFfaGFzT3JpZ2luIChjb25zdCBkZWZpVmlhKiBvYmopOwotRVhURVJOIHZvaWQgZGVmaVZpYV9vcmlnaW4gKGNvbnN0IGRlZmlWaWEqIG9iaiwgaW50KiAgeE9mZnNldCwgaW50KiAgeU9mZnNldCk7Ci1FWFRFUk4gaW50IGRlZmlWaWFfaGFzT2Zmc2V0IChjb25zdCBkZWZpVmlhKiBvYmopOwotRVhURVJOIHZvaWQgZGVmaVZpYV9vZmZzZXQgKGNvbnN0IGRlZmlWaWEqIG9iaiwgaW50KiAgeEJvdE9mZnNldCwgaW50KiAgeUJvdE9mZnNldCwgaW50KiAgeFRvcE9mZnNldCwgaW50KiAgeVRvcE9mZnNldCk7Ci1FWFRFUk4gaW50IGRlZmlWaWFfaGFzQ3V0UGF0dGVybiAoY29uc3QgZGVmaVZpYSogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBkZWZpVmlhX2N1dFBhdHRlcm4gKGNvbnN0IGRlZmlWaWEqIG9iaik7Ci1FWFRFUk4gaW50IGRlZmlWaWFfaGFzUmVjdE1hc2sgKGNvbnN0IGRlZmlWaWEqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlWaWFfcmVjdE1hc2sgKGNvbnN0IGRlZmlWaWEqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlWaWFfaGFzUG9seU1hc2sgKGNvbnN0IGRlZmlWaWEqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGRlZmlWaWFfcG9seU1hc2sgKGNvbnN0IGRlZmlWaWEqIG9iaiwgaW50ICBpbmRleCk7Ci0KLUVYVEVSTiB2b2lkIGRlZmlWaWFfcHJpbnQgKGNvbnN0IGRlZmlWaWEqIG9iaiwgRklMRSogIGYpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZnJSZWFkZXIuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZnJSZWFkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU0ODE5NC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZyUmVhZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NjggKzAsMCBAQAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBBVFRFTlRJT046IFRISVMgSVMgQU4gQVVUTy1HRU5FUkFURUQgRklMRS4gRE8gTk9UIENIQU5HRSBJVCEgICAgICAgICAgICAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBDb3B5cmlnaHQgMjAxMy0yMDE0LCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlICAgICAgICAgICAgICovCi0vKiBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAgICAgICAgICAgICovCi0vKiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICAgICAgICAqLwotLyogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICovCi0vKiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAgICAgICAqLwotLyogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgICAgKi8KLS8qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgICAgICovCi0vKiAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksICAgICAgICAgICovCi0vKiBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkQXV0aG9yOiBkZWxsICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJFJldmlzaW9uOiAjMSAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICREYXRlOiAyMDE3LzA2LzA2ICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkU3RhdGU6ICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotCi0jaWZuZGVmIENERUZSUkVBREVSX0gKLSNkZWZpbmUgQ0RFRlJSRUFERVJfSAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJkZWZpVHlwZWRlZnMuaCIKLQotI2RlZmluZSBERUZfTVNHUyA0MDEzCi0jZGVmaW5lIENCTUFYIDE1MCAgICAKLQotLyogQW4gZW51bSBkZXNjcmliaW5nIGFsbCBvZiB0aGUgdHlwZXMgb2YgcmVhZGVyIGNhbGxiYWNrcy4gICAgICAgICAgICAgICAgICAgKi8KLXR5cGVkZWYgZW51bSB7Ci0gIGRlZnJVbnNwZWNpZmllZENia1R5cGUgPSAwLAotICBkZWZyRGVzaWduU3RhcnRDYmtUeXBlID0gMSwKLSAgZGVmclRlY2hOYW1lQ2JrVHlwZSA9IDIsCi0gIGRlZnJQcm9wQ2JrVHlwZSA9IDMsCi0gIGRlZnJQcm9wRGVmRW5kQ2JrVHlwZSA9IDQsCi0gIGRlZnJQcm9wRGVmU3RhcnRDYmtUeXBlID0gNSwKLSAgZGVmckZsb29yUGxhbk5hbWVDYmtUeXBlID0gNiwKLSAgZGVmckFycmF5TmFtZUNia1R5cGUgPSA3LAotICBkZWZyVW5pdHNDYmtUeXBlID0gOCwKLSAgZGVmckRpdmlkZXJDYmtUeXBlID0gOSwKLSAgZGVmckJ1c0JpdENia1R5cGUgPSAxMCwKLSAgZGVmclNpdGVDYmtUeXBlID0gMTEsCi0gIGRlZnJDb21wb25lbnRTdGFydENia1R5cGUgPSAxMiwKLSAgZGVmckNvbXBvbmVudENia1R5cGUgPSAxMywKLSAgZGVmckNvbXBvbmVudEVuZENia1R5cGUgPSAxNCwKLSAgZGVmck5ldFN0YXJ0Q2JrVHlwZSA9IDE1LAotICBkZWZyTmV0Q2JrVHlwZSA9IDE2LAotICBkZWZyTmV0TmFtZUNia1R5cGUgPSAxNywKLSAgZGVmck5ldE5vbkRlZmF1bHRSdWxlQ2JrVHlwZSA9IDE4LAotICBkZWZyTmV0U3VibmV0TmFtZUNia1R5cGUgPSAxOSwKLSAgZGVmck5ldEVuZENia1R5cGUgPSAyMCwKLSAgZGVmclBhdGhDYmtUeXBlID0gMjEsCi0gIGRlZnJWZXJzaW9uQ2JrVHlwZSA9IDIyLAotICBkZWZyVmVyc2lvblN0ckNia1R5cGUgPSAyMywKLSAgZGVmckNvbXBvbmVudEV4dENia1R5cGUgPSAyNCwKLSAgZGVmclBpbkV4dENia1R5cGUgPSAyNSwKLSAgZGVmclZpYUV4dENia1R5cGUgPSAyNiwKLSAgZGVmck5ldENvbm5lY3Rpb25FeHRDYmtUeXBlID0gMjcsCi0gIGRlZnJOZXRFeHRDYmtUeXBlID0gMjgsCi0gIGRlZnJHcm91cEV4dENia1R5cGUgPSAyOSwKLSAgZGVmclNjYW5DaGFpbkV4dENia1R5cGUgPSAzMCwKLSAgZGVmcklvVGltaW5nc0V4dENia1R5cGUgPSAzMSwKLSAgZGVmclBhcnRpdGlvbnNFeHRDYmtUeXBlID0gMzIsCi0gIGRlZnJIaXN0b3J5Q2JrVHlwZSA9IDMzLAotICBkZWZyRGllQXJlYUNia1R5cGUgPSAzNCwKLSAgZGVmckNhbnBsYWNlQ2JrVHlwZSA9IDM1LAotICBkZWZyQ2Fubm90T2NjdXB5Q2JrVHlwZSA9IDM2LAotICBkZWZyUGluQ2FwQ2JrVHlwZSA9IDM3LAotICBkZWZyRGVmYXVsdENhcENia1R5cGUgPSAzOCwKLSAgZGVmclN0YXJ0UGluc0Nia1R5cGUgPSAzOSwKLSAgZGVmclBpbkNia1R5cGUgPSA0MCwKLSAgZGVmclBpbkVuZENia1R5cGUgPSA0MSwKLSAgZGVmclJvd0Nia1R5cGUgPSA0MiwKLSAgZGVmclRyYWNrQ2JrVHlwZSA9IDQzLAotICBkZWZyR2NlbGxHcmlkQ2JrVHlwZSA9IDQ0LAotICBkZWZyVmlhU3RhcnRDYmtUeXBlID0gNDUsCi0gIGRlZnJWaWFDYmtUeXBlID0gNDYsCi0gIGRlZnJWaWFFbmRDYmtUeXBlID0gNDcsCi0gIGRlZnJSZWdpb25TdGFydENia1R5cGUgPSA0OCwKLSAgZGVmclJlZ2lvbkNia1R5cGUgPSA0OSwKLSAgZGVmclJlZ2lvbkVuZENia1R5cGUgPSA1MCwKLSAgZGVmclNOZXRTdGFydENia1R5cGUgPSA1MSwKLSAgZGVmclNOZXRDYmtUeXBlID0gNTIsCi0gIGRlZnJTTmV0UGFydGlhbFBhdGhDYmtUeXBlID0gNTMsCi0gIGRlZnJTTmV0V2lyZUNia1R5cGUgPSA1NCwKLSAgZGVmclNOZXRFbmRDYmtUeXBlID0gNTUsCi0gIGRlZnJHcm91cHNTdGFydENia1R5cGUgPSA1NiwKLSAgZGVmckdyb3VwTmFtZUNia1R5cGUgPSA1NywKLSAgZGVmckdyb3VwTWVtYmVyQ2JrVHlwZSA9IDU4LAotICBkZWZyR3JvdXBDYmtUeXBlID0gNTksCi0gIGRlZnJHcm91cHNFbmRDYmtUeXBlID0gNjAsCi0gIGRlZnJBc3NlcnRpb25zU3RhcnRDYmtUeXBlID0gNjEsCi0gIGRlZnJBc3NlcnRpb25DYmtUeXBlID0gNjIsCi0gIGRlZnJBc3NlcnRpb25zRW5kQ2JrVHlwZSA9IDYzLAotICBkZWZyQ29uc3RyYWludHNTdGFydENia1R5cGUgPSA2NCwKLSAgZGVmckNvbnN0cmFpbnRDYmtUeXBlID0gNjUsCi0gIGRlZnJDb25zdHJhaW50c0VuZENia1R5cGUgPSA2NiwKLSAgZGVmclNjYW5jaGFpbnNTdGFydENia1R5cGUgPSA2NywKLSAgZGVmclNjYW5jaGFpbkNia1R5cGUgPSA2OCwKLSAgZGVmclNjYW5jaGFpbnNFbmRDYmtUeXBlID0gNjksCi0gIGRlZnJJT1RpbWluZ3NTdGFydENia1R5cGUgPSA3MCwKLSAgZGVmcklPVGltaW5nQ2JrVHlwZSA9IDcxLAotICBkZWZySU9UaW1pbmdzRW5kQ2JrVHlwZSA9IDcyLAotICBkZWZyRlBDU3RhcnRDYmtUeXBlID0gNzMsCi0gIGRlZnJGUENDYmtUeXBlID0gNzQsCi0gIGRlZnJGUENFbmRDYmtUeXBlID0gNzUsCi0gIGRlZnJUaW1pbmdEaXNhYmxlc1N0YXJ0Q2JrVHlwZSA9IDc2LAotICBkZWZyVGltaW5nRGlzYWJsZUNia1R5cGUgPSA3NywKLSAgZGVmclRpbWluZ0Rpc2FibGVzRW5kQ2JrVHlwZSA9IDc4LAotICBkZWZyUGFydGl0aW9uc1N0YXJ0Q2JrVHlwZSA9IDc5LAotICBkZWZyUGFydGl0aW9uQ2JrVHlwZSA9IDgwLAotICBkZWZyUGFydGl0aW9uc0VuZENia1R5cGUgPSA4MSwKLSAgZGVmclBpblByb3BTdGFydENia1R5cGUgPSA4MiwKLSAgZGVmclBpblByb3BDYmtUeXBlID0gODMsCi0gIGRlZnJQaW5Qcm9wRW5kQ2JrVHlwZSA9IDg0LAotICBkZWZyQmxvY2thZ2VTdGFydENia1R5cGUgPSA4NSwKLSAgZGVmckJsb2NrYWdlQ2JrVHlwZSA9IDg2LAotICBkZWZyQmxvY2thZ2VFbmRDYmtUeXBlID0gODcsCi0gIGRlZnJTbG90U3RhcnRDYmtUeXBlID0gODgsCi0gIGRlZnJTbG90Q2JrVHlwZSA9IDg5LAotICBkZWZyU2xvdEVuZENia1R5cGUgPSA5MCwKLSAgZGVmckZpbGxTdGFydENia1R5cGUgPSA5MSwKLSAgZGVmckZpbGxDYmtUeXBlID0gOTIsCi0gIGRlZnJGaWxsRW5kQ2JrVHlwZSA9IDkzLAotICBkZWZyQ2FzZVNlbnNpdGl2ZUNia1R5cGUgPSA5NCwKLSAgZGVmck5vbkRlZmF1bHRTdGFydENia1R5cGUgPSA5NSwKLSAgZGVmck5vbkRlZmF1bHRDYmtUeXBlID0gOTYsCi0gIGRlZnJOb25EZWZhdWx0RW5kQ2JrVHlwZSA9IDk3LAotICBkZWZyU3R5bGVzU3RhcnRDYmtUeXBlID0gOTgsCi0gIGRlZnJTdHlsZXNDYmtUeXBlID0gOTksCi0gIGRlZnJTdHlsZXNFbmRDYmtUeXBlID0gMTAwLAotICBkZWZyRXh0ZW5zaW9uQ2JrVHlwZSA9IDEwMSwKLQotICAvKiBORVcgQ0FMTEJBQ0sgLSBJZiB5b3UgYXJlIGNyZWF0aW5nIGEgbmV3IGNhbGxiYWNrLCB5b3UgbXVzdCBhZGQgICAgICAgICAgKi8KLSAgLyogYSB1bmlxdWUgaXRlbSB0byB0aGlzIGVudW0gZm9yIGVhY2ggY2FsbGJhY2sgcm91dGluZS4gV2hlbiB0aGUgICAgICAgICAgICovCi0gIC8qIGNhbGxiYWNrIGlzIGNhbGxlZCBpbiBkZWYueSB5b3UgaGF2ZSB0byBzdXBwbHkgdGhpcyBlbnVtIGl0ZW0gICAgICAgICAgICAqLwotICAvKiBhcyBhbiBhcmd1bWVudCBpbiB0aGUgY2FsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICBkZWZyQ29tcG9uZW50TWFza1NoaWZ0TGF5ZXJDYmtUeXBlID0gMTAyLAotICBkZWZyRGVzaWduRW5kQ2JrVHlwZSA9IDEwMwotfSBkZWZyQ2FsbGJhY2tUeXBlX2U7Ci0KLS8qIERlY2xhcmF0aW9ucyBvZiBmdW5jdGlvbiBzaWduYXR1cmVzIGZvciBlYWNoIHR5cGUgb2YgY2FsbGJhY2suICAgICAgICAgICAgICovCi0vKiBUaGVzZSBkZWNsYXJhdGlvbnMgYXJlIHR5cGUtc2FmZSB3aGVuIGNvbXBpbGluZyB3aXRoIEFOU0kgQyAgICAgICAgICAgICAgICAqLwotLyogb3IgQysrOyB5b3Ugd2lsbCBvbmx5IGJlIGFibGUgdG8gcmVnaXN0ZXIgYSBmdW5jdGlvbiBwb2ludGVyICAgICAgICAgICAgICAgKi8KLS8qIHdpdGggdGhlIGNvcnJlY3Qgc2lnbmF0dXJlIGZvciBhIGdpdmVuIHR5cGUgb2YgY2FsbGJhY2suICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRWFjaCBjYWxsYmFjayBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byByZXR1cm4gMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgKi8KLS8qIEEgbm9uLXplcm8gcmV0dXJuIGNvZGUgd2lsbCBjYXVzZSB0aGUgcmVhZGVyIHRvIGFib3J0LiAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlIGRlZnJEZXNpZ25TdGFydCBhbmQgZGVmckRlc2lnbkVuZCBjYWxsYmFjayBpcyBvbmx5IGNhbGxlZCBvbmNlLiAgICAgICAgKi8KLS8qIE90aGVyIGNhbGxiYWNrcyBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLCBlYWNoIHRpbWUgd2l0aCBhIGRpZmZlcmVudCAgICovCi0vKiBzZXQgb2YgZGF0YS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZvciBlYWNoIGNhbGxiYWNrLCB0aGUgRGVmIEFQSSB3aWxsIG1ha2UgdGhlIGNhbGxiYWNrIHRvIHRoZSAgICAgICAgICAgICAgICovCi0vKiBmdW5jdGlvbiBzdXBwbGllZCBieSB0aGUgY2xpZW50LCB3aGljaCBzaG91bGQgZWl0aGVyIG1ha2UgYSBjb3B5ICAgICAgICAgICAqLwotLyogb2YgdGhlIERlZiBvYmplY3QsIG9yIHN0b3JlIHRoZSBkYXRhIGluIHRoZSBjbGllbnQncyBvd24gZGF0YSBzdHJ1Y3R1cmVzLiAgKi8KLS8qIFRoZSBEZWYgQVBJIHdpbGwgZGVsZXRlIG9yIHJldXNlIGVhY2ggb2JqZWN0IGFmdGVyIG1ha2luZyB0aGUgY2FsbGJhY2ssICAgICovCi0vKiBzbyB0aGUgY2xpZW50IHNob3VsZCBub3Qga2VlcCBhIHBvaW50ZXIgdG8gaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEFsbCBjYWxsYmFja3MgcGFzcyB0aGUgdXNlciBkYXRhIHBvaW50ZXIgcHJvdmlkZWQgaW4gZGVmclJlYWQoKSAgICAgICAgICAgICovCi0vKiBvciBkZWZyU2V0VXNlckRhdGEoKSBiYWNrIHRvIHRoZSBjbGllbnQ7IHRoaXMgY2FuIGJlIHVzZWQgYnkgdGhlICAgICAgICAgICAqLwotLyogY2xpZW50IHRvIG9idGFpbiBhY2Nlc3MgdG8gdGhlIHJlc3Qgb2YgdGhlIGNsaWVudCdzIGRhdGEgc3RydWN0dXJlcy4gICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGUgdXNlciBkYXRhIHBvaW50ZXIgaXMgb2J0YWluZWQgdXNpbmcgZGVmckdldFVzZXJEYXRhKCkgaW1tZWRpYXRlbHkgICAgICAqLwotLyogcHJpb3IgdG8gbWFraW5nIGVhY2ggY2FsbGJhY2ssIHNvIHRoZSBjbGllbnQgaXMgZnJlZSB0byBjaGFuZ2UgdGhlICAgICAgICAgKi8KLS8qIHVzZXIgZGF0YSBvbiB0aGUgZmx5IGlmIG5lY2Vzc2FyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogQ2FsbGJhY2tzIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGFyZSBwYXNzZWQgYSBjYWxsYmFjayB0eXBlICAgICAgICAgICAgICAgKi8KLS8qIHBhcmFtZXRlciwgd2hpY2ggYWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIHdyaXRlIGEgc2luZ2xlIGNhbGxiYWNrICAgICAgICAgICovCi0vKiBmdW5jdGlvbiwgcmVnaXN0ZXIgdGhhdCBmdW5jdGlvbiBmb3IgbXVsdGlwbGUgY2FsbGJhY2tzLCB0aGVuICAgICAgICAgICAgICAqLwotLyogc3dpdGNoIGJhc2VkIG9uIHRoZSBjYWxsYmFjayB0eXBlIHRvIGhhbmRsZSB0aGUgYXBwcm9wcmlhdGUgdHlwZSBvZiAgICAgICAgKi8KLS8qIGRhdGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLS8qIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIG5vdGhpbmcuICAgICAgICovCi10eXBlZGVmIGludCAoKmRlZnJWb2lkQ2JrRm5UeXBlKSAoZGVmckNhbGxiYWNrVHlwZV9lLCB2b2lkKiB2LCBkZWZpVXNlckRhdGEpOwotCi0vKiBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBhIHN0cmluZy4gICAgICAqLwotdHlwZWRlZiBpbnQgKCpkZWZyU3RyaW5nQ2JrRm5UeXBlKSAoZGVmckNhbGxiYWNrVHlwZV9lLCBjb25zdCBjaGFyICpzdHJpbmcsIGRlZmlVc2VyRGF0YSk7Ci0KLS8qIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgaW50ZWdlci4gICAgICovCi10eXBlZGVmIGludCAoKmRlZnJJbnRlZ2VyQ2JrRm5UeXBlKSAoZGVmckNhbGxiYWNrVHlwZV9lLCBpbnQgbnVtYmVyLCBkZWZpVXNlckRhdGEpOwotCi0vKiBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBhIGRvdWJsZS4gICAgICAqLwotdHlwZWRlZiBpbnQgKCpkZWZyRG91YmxlQ2JrRm5UeXBlKSAoZGVmckNhbGxiYWNrVHlwZV9lLCBkb3VibGUgbnVtYmVyLCBkZWZpVXNlckRhdGEpOwotCi0vKiBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBhIGRlZmlQcm9wLiAgICAqLwotdHlwZWRlZiBpbnQgKCpkZWZyUHJvcENia0ZuVHlwZSkgKGRlZnJDYWxsYmFja1R5cGVfZSwgZGVmaVByb3AgKnByb3AsIGRlZmlVc2VyRGF0YSk7Ci0KLS8qIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgZGVmaVNpdGUuICAgICovCi10eXBlZGVmIGludCAoKmRlZnJTaXRlQ2JrRm5UeXBlKSAoZGVmckNhbGxiYWNrVHlwZV9lLCBkZWZpU2l0ZSAqc2l0ZSwgZGVmaVVzZXJEYXRhKTsKLQotLyogQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBkZWZDb21wb25lbnQgKi8KLXR5cGVkZWYgaW50ICgqZGVmckNvbXBvbmVudENia0ZuVHlwZSkgKGRlZnJDYWxsYmFja1R5cGVfZSwgZGVmaUNvbXBvbmVudCAqY29tcCwgZGVmaVVzZXJEYXRhKTsKLQotLyogQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBkZWZDb21wb25lbnQgKi8KLXR5cGVkZWYgaW50ICgqZGVmckNvbXBvbmVudE1hc2tTaGlmdExheWVyQ2JrRm5UeXBlKSAoZGVmckNhbGxiYWNrVHlwZV9lLCBkZWZpQ29tcG9uZW50TWFza1NoaWZ0TGF5ZXIgKmNvbXAsIGRlZmlVc2VyRGF0YSk7Ci0KLS8qIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgZGVmTmV0LiAgICAgICovCi10eXBlZGVmIGludCAoKmRlZnJOZXRDYmtGblR5cGUpIChkZWZyQ2FsbGJhY2tUeXBlX2UsIGRlZmlOZXQgKm5ldCwgZGVmaVVzZXJEYXRhKTsKLQotLyogQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBkZWZQYXRoLiAgICAgKi8KLXR5cGVkZWYgaW50ICgqZGVmclBhdGhDYmtGblR5cGUpIChkZWZyQ2FsbGJhY2tUeXBlX2UsIGRlZmlQYXRoICpwYXRoLCBkZWZpVXNlckRhdGEpOwotCi0vKiBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBhIGRlZmlCb3guICAgICAqLwotdHlwZWRlZiBpbnQgKCpkZWZyQm94Q2JrRm5UeXBlKSAoZGVmckNhbGxiYWNrVHlwZV9lLCBkZWZpQm94ICpib3gsIGRlZmlVc2VyRGF0YSk7Ci0KLS8qIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgZGVmaVBpbkNhcC4gICovCi10eXBlZGVmIGludCAoKmRlZnJQaW5DYXBDYmtGblR5cGUpIChkZWZyQ2FsbGJhY2tUeXBlX2UsIGRlZmlQaW5DYXAgKnBpbmNhcCwgZGVmaVVzZXJEYXRhKTsKLQotLyogQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBkZWZpUGluLiAgICAgKi8KLXR5cGVkZWYgaW50ICgqZGVmclBpbkNia0ZuVHlwZSkgKGRlZnJDYWxsYmFja1R5cGVfZSwgZGVmaVBpbiAqcGluLCBkZWZpVXNlckRhdGEpOwotCi0vKiBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBhIGRlZmlSb3cuICAgICAqLwotdHlwZWRlZiBpbnQgKCpkZWZyUm93Q2JrRm5UeXBlKSAoZGVmckNhbGxiYWNrVHlwZV9lLCBkZWZpUm93ICpyb3csIGRlZmlVc2VyRGF0YSk7Ci0KLS8qIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgZGVmaVRyYWNrLiAgICovCi10eXBlZGVmIGludCAoKmRlZnJUcmFja0Nia0ZuVHlwZSkgKGRlZnJDYWxsYmFja1R5cGVfZSwgZGVmaVRyYWNrICp0cmFjaywgZGVmaVVzZXJEYXRhKTsKLQotLyogQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBkZWZpR2NlbGxHcmkgKi8KLXR5cGVkZWYgaW50ICgqZGVmckdjZWxsR3JpZENia0ZuVHlwZSkgKGRlZnJDYWxsYmFja1R5cGVfZSwgZGVmaUdjZWxsR3JpZCAqZ3JpZCwgZGVmaVVzZXJEYXRhKTsKLQotLyogQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBkZWZpVmlhLiAgICAgKi8KLXR5cGVkZWYgaW50ICgqZGVmclZpYUNia0ZuVHlwZSkgKGRlZnJDYWxsYmFja1R5cGVfZSwgZGVmaVZpYSAqLCBkZWZpVXNlckRhdGEpOwotCi0vKiBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBhIGRlZmlSZWdpb24uICAqLwotdHlwZWRlZiBpbnQgKCpkZWZyUmVnaW9uQ2JrRm5UeXBlKSAoZGVmckNhbGxiYWNrVHlwZV9lLCBkZWZpUmVnaW9uICosIGRlZmlVc2VyRGF0YSk7Ci0KLS8qIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgZGVmaUdyb3VwLiAgICovCi10eXBlZGVmIGludCAoKmRlZnJHcm91cENia0ZuVHlwZSkgKGRlZnJDYWxsYmFja1R5cGVfZSwgZGVmaUdyb3VwICosIGRlZmlVc2VyRGF0YSk7Ci0KLS8qIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgZGVmaUFzc2VydGlvICovCi10eXBlZGVmIGludCAoKmRlZnJBc3NlcnRpb25DYmtGblR5cGUpIChkZWZyQ2FsbGJhY2tUeXBlX2UsIGRlZmlBc3NlcnRpb24gKiwgZGVmaVVzZXJEYXRhKTsKLQotLyogQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBkZWZpU2NhbkNoYWkgKi8KLXR5cGVkZWYgaW50ICgqZGVmclNjYW5jaGFpbkNia0ZuVHlwZSkgKGRlZnJDYWxsYmFja1R5cGVfZSwgZGVmaVNjYW5jaGFpbiAqLCBkZWZpVXNlckRhdGEpOwotCi0vKiBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBhIGRlZmlJT1RpbWluZyAqLwotdHlwZWRlZiBpbnQgKCpkZWZySU9UaW1pbmdDYmtGblR5cGUpIChkZWZyQ2FsbGJhY2tUeXBlX2UsIGRlZmlJT1RpbWluZyAqLCBkZWZpVXNlckRhdGEpOwotCi0vKiBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBhIGRlZmlGUEMuICAgICAqLwotdHlwZWRlZiBpbnQgKCpkZWZyRlBDQ2JrRm5UeXBlKSAoZGVmckNhbGxiYWNrVHlwZV9lLCBkZWZpRlBDICosIGRlZmlVc2VyRGF0YSk7Ci0KLS8qIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgZGVmaVRpbWluZ0RpICovCi10eXBlZGVmIGludCAoKmRlZnJUaW1pbmdEaXNhYmxlQ2JrRm5UeXBlKSAoZGVmckNhbGxiYWNrVHlwZV9lLCBkZWZpVGltaW5nRGlzYWJsZSAqLCBkZWZpVXNlckRhdGEpOwotCi0vKiBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBhIGRlZmlQYXJ0aXRpbyAqLwotdHlwZWRlZiBpbnQgKCpkZWZyUGFydGl0aW9uQ2JrRm5UeXBlKSAoZGVmckNhbGxiYWNrVHlwZV9lLCBkZWZpUGFydGl0aW9uICosIGRlZmlVc2VyRGF0YSk7Ci0KLS8qIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgZGVmaVBpblByb3AuICovCi10eXBlZGVmIGludCAoKmRlZnJQaW5Qcm9wQ2JrRm5UeXBlKSAoZGVmckNhbGxiYWNrVHlwZV9lLCBkZWZpUGluUHJvcCAqLCBkZWZpVXNlckRhdGEpOwotCi0vKiBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBhIGRlZmlCbG9ja2FnZSAqLwotdHlwZWRlZiBpbnQgKCpkZWZyQmxvY2thZ2VDYmtGblR5cGUpIChkZWZyQ2FsbGJhY2tUeXBlX2UsIGRlZmlCbG9ja2FnZSAqLCBkZWZpVXNlckRhdGEpOwotCi0vKiBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBhIGRlZmlTbG90LiAgICAqLwotdHlwZWRlZiBpbnQgKCpkZWZyU2xvdENia0ZuVHlwZSkgKGRlZnJDYWxsYmFja1R5cGVfZSwgZGVmaVNsb3QgKiwgZGVmaVVzZXJEYXRhKTsKLQotLyogQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBkZWZpRmlsbC4gICAgKi8KLXR5cGVkZWYgaW50ICgqZGVmckZpbGxDYmtGblR5cGUpIChkZWZyQ2FsbGJhY2tUeXBlX2UsIGRlZmlGaWxsICosIGRlZmlVc2VyRGF0YSk7Ci0KLS8qIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgZGVmaU5vbkRlZmF1ICovCi10eXBlZGVmIGludCAoKmRlZnJOb25EZWZhdWx0Q2JrRm5UeXBlKSAoZGVmckNhbGxiYWNrVHlwZV9lLCBkZWZpTm9uRGVmYXVsdCAqLCBkZWZpVXNlckRhdGEpOwotCi0vKiBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBhIGRlZmlTdHlsZXMuICAqLwotdHlwZWRlZiBpbnQgKCpkZWZyU3R5bGVzQ2JrRm5UeXBlKSAoZGVmckNhbGxiYWNrVHlwZV9lLCBkZWZpU3R5bGVzICosIGRlZmlVc2VyRGF0YSk7Ci0KLS8qIE5FVyBDQUxMQkFDSyAtIEVhY2ggY2FsbGJhY2sgbXVzdCByZXR1cm4gdXNlciBkYXRhLCBlbnVtLCBhbmQgICAgICAgICAgICAgICovCi0vKiAgIE9VUi1EQVRBIGl0ZW0uICBXZSBtdXN0IGRlZmluZSBhIGNhbGxiYWNrIGZ1bmN0aW9uIHR5cGUgZm9yICAgICAgICAgICAgICAqLwotLyogICBlYWNoIHR5cGUgb2YgT1VSLURBVEEuICBTb21lIHJvdXRpbmVzIHJldHVybiBhIHN0cmluZywgc29tZSAgICAgICAgICAgICAgKi8KLS8qICAgcmV0dXJuIGFuIGludGVnZXIsIGFuZCBzb21lIHJldHVybiBhIHBvaW50ZXIgdG8gYSBjbGFzcy4gICAgICAgICAgICAgICAgICovCi0vKiAgIElmIHlvdSBjcmVhdGUgYSBuZXcgY2xhc3MsIHRoZW4geW91IG11c3QgY3JlYXRlIGEgbmV3IGZ1bmN0aW9uICAgICAgICAgICAqLwotLyogICB0eXBlIGhlcmUgdG8gcmV0dXJuIHRoYXQgY2xhc3MgdG8gdGhlIHVzZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotLyogVGhlIHJlYWRlciBpbml0aWFsaXphdGlvbi4gIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBkZWZyUmVhZCgpLiAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgZGVmckluaXQgKCk7Ci1FWFRFUk4gaW50IGRlZnJJbml0U2Vzc2lvbiAoaW50ICBzdGFydFNlc3Npb24pOwotCi0vKiBvYnNvbGV0ZWQgbm93LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBkZWZyUmVzZXQgKCk7Ci0KLS8qU2V0cyBhbGwgcGFyc2VyIG1lbW9yeSBpbnRvIGluaXQgc3RhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGRlZnJDbGVhciAoKTsKLQotLyogQ2hhbmdlIHRoZSBjb21tZW50IGNoYXJhY3RlciBpbiB0aGUgREVGIGZpbGUuICBUaGUgZGVmYXVsdCAgICAgICAgICAgICAgICAgKi8KLS8qIGlzICcjJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gdm9pZCBkZWZyU2V0Q29tbWVudENoYXIgKGNoYXIgIGMpOwotCi0vKiBGdW5jdGlvbnMgdG8gY2FsbCB0byBzZXQgc3BlY2lmaWMgYWN0aW9ucyBpbiB0aGUgcGFyc2VyLiAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIHZvaWQgZGVmclNldEFkZFBhdGhUb05ldCAoKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRBbGxvd0NvbXBvbmVudE5ldHMgKCk7Ci1FWFRFUk4gaW50IGRlZnJHZXRBbGxvd0NvbXBvbmVudE5ldHMgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0Q2FzZVNlbnNpdGl2aXR5IChpbnQgIGNhc2VTZW5zZSk7Ci0KLS8qIEZ1bmN0aW9ucyB0byBrZWVwIHRyYWNrIG9mIGNhbGxiYWNrcyB0aGF0IHRoZSB1c2VyIGRpZCBub3QgICAgICAgICAgICAgICAgICovCi0vKiBzdXBwbHkuICBOb3JtYWxseSBhbGwgcGFydHMgb2YgdGhlIERFRiBmaWxlIHRoYXQgdGhlIHVzZXIgICAgICAgICAgICAgICAgICAqLwotLyogZG9lcyBub3Qgc3VwcGx5IGEgY2FsbGJhY2sgZm9yIHdpbGwgYmUgaWdub3JlZC4gIFRoZXNlICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIHJvdXRpbmVzIHRlbGwgdGhlIHBhcnNlciBjb3VudCB0aGUgREVGIGNvbnN0cnVjdHMgdGhhdCBhcmUgICAgICAgICAgICAgICAgICovCi0vKiBwcmVzZW50IGluIHRoZSBpbnB1dCBmaWxlLCBidXQgZGlkIG5vdCB0cmlnZ2VyIGEgY2FsbGJhY2suICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBzaG91bGQgaGVscCB5b3UgZmluZCBhbnkgImltcG9ydGFudCIgREVGIGNvbnN0cnVjdHMgdGhhdCAgICAgICAgICAgICAgKi8KLS8qIHlvdSBhcmUgaWdub3JpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gdm9pZCBkZWZyU2V0UmVnaXN0ZXJVbnVzZWRDYWxsYmFja3MgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyUHJpbnRVbnVzZWRDYWxsYmFja3MgKEZJTEUqICBsb2cpOwotCi0vKiBPYnNvbGV0ZWQgbm93LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCAgZGVmclJlbGVhc2VOUmVzZXRNZW1vcnkgKCk7Ci0KLS8qIFRoZSBtYWluIHJlYWRlciBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGUgZmlsZSBzaG91bGQgYWxyZWFkeSBiZSBvcGVuZWQuICBUaGlzIHJlcXVpcmVtZW50IGFsbG93cyAgICAgICAgICAgICAgICAqLwotLyogdGhlIHJlYWRlciB0byBiZSB1c2VkIHdpdGggc3RkaW4gb3IgYSBwaXBlLiAgVGhlIGZpbGUgbmFtZSAgICAgICAgICAgICAgICAgKi8KLS8qIGlzIG9ubHkgdXNlZCBmb3IgZXJyb3IgbWVzc2FnZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGRlZnJSZWFkIChGSUxFICogZmlsZSwgY29uc3QgY2hhciAqIGZpbGVOYW1lLCBkZWZpVXNlckRhdGEgIHVzZXJEYXRhLCBpbnQgIGNhc2Vfc2Vuc2l0aXZlKTsKLQotLyogU2V0L2dldCB0aGUgY2xpZW50LXByb3ZpZGVkIHVzZXIgZGF0YS4gIGRlZmkgZG9lc24ndCBsb29rIGF0ICAgICAgICAgICAgICAgKi8KLS8qIHRoaXMgZGF0YSBhdCBhbGwsIGl0IHNpbXBseSBwYXNzZXMgdGhlIG9wYXF1ZSBkZWZpVXNlckRhdGEgcG9pbnRlciAgICAgICAgICovCi0vKiBiYWNrIHRvIHRoZSBhcHBsaWNhdGlvbiB3aXRoIGVhY2ggY2FsbGJhY2suICBUaGUgY2xpZW50IGNhbiAgICAgICAgICAgICAgICAqLwotLyogY2hhbmdlIHRoZSBkYXRhIGF0IGFueSB0aW1lLCBhbmQgaXQgd2lsbCB0YWtlIGVmZmVjdCBvbiB0aGUgICAgICAgICAgICAgICAgKi8KLS8qIG5leHQgY2FsbGJhY2suICBUaGUgZGVmaSByZWFkZXIgYW5kIHdyaXRlciBtYWludGFpbiBzZXBhcmF0ZSAgICAgICAgICAgICAgICovCi0vKiB1c2VyIGRhdGEgcG9pbnRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIHZvaWQgZGVmclNldFVzZXJEYXRhIChkZWZpVXNlckRhdGEgcDApOwotRVhURVJOIGRlZmlVc2VyRGF0YSBkZWZyR2V0VXNlckRhdGEgKCk7Ci0KLS8qIEZ1bmN0aW9ucyB0byBjYWxsIHRvIHJlZ2lzdGVyIGEgY2FsbGJhY2sgZnVuY3Rpb24gb3IgZ2V0IHRoZSBmdW5jdGlvbiAgICAgICovCi0vKnBvaW50ZXIgYWZ0ZXIgaXQgaGFzIGJlZW4gcmVnaXN0ZXJlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotLyogUmVnaXN0ZXIgb25lIGZ1bmN0aW9uIGZvciBhbGwgY2FsbGJhY2tzIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlICAgICAgICAgICAgKi8KLUVYVEVSTiB2b2lkIGRlZnJTZXRBcnJheU5hbWVDYmsgKGRlZnJTdHJpbmdDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldEFzc2VydGlvbkNiayAoZGVmckFzc2VydGlvbkNia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0QXNzZXJ0aW9uc1N0YXJ0Q2JrIChkZWZySW50ZWdlckNia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0QXNzZXJ0aW9uc0VuZENiayAoZGVmclZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldEJsb2NrYWdlQ2JrIChkZWZyQmxvY2thZ2VDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldEJsb2NrYWdlU3RhcnRDYmsgKGRlZnJJbnRlZ2VyQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRCbG9ja2FnZUVuZENiayAoZGVmclZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldEJ1c0JpdENiayAoZGVmclN0cmluZ0Nia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0Q2Fubm90T2NjdXB5Q2JrIChkZWZyU2l0ZUNia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0Q2FucGxhY2VDYmsgKGRlZnJTaXRlQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRDYXNlU2Vuc2l0aXZlQ2JrIChkZWZySW50ZWdlckNia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0Q29tcG9uZW50Q2JrIChkZWZyQ29tcG9uZW50Q2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRDb21wb25lbnRFeHRDYmsgKGRlZnJTdHJpbmdDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldENvbXBvbmVudFN0YXJ0Q2JrIChkZWZySW50ZWdlckNia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0Q29tcG9uZW50RW5kQ2JrIChkZWZyVm9pZENia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0Q29uc3RyYWludENiayAoZGVmckFzc2VydGlvbkNia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0Q29uc3RyYWludHNTdGFydENiayAoZGVmckludGVnZXJDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldENvbnN0cmFpbnRzRW5kQ2JrIChkZWZyVm9pZENia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0RGVmYXVsdENhcENiayAoZGVmckludGVnZXJDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldERlc2lnbkNiayAoZGVmclN0cmluZ0Nia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0RGVzaWduRW5kQ2JrIChkZWZyVm9pZENia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0RGllQXJlYUNiayAoZGVmckJveENia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0RGl2aWRlckNiayAoZGVmclN0cmluZ0Nia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0RXh0ZW5zaW9uQ2JrIChkZWZyU3RyaW5nQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRGaWxsQ2JrIChkZWZyRmlsbENia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0RmlsbFN0YXJ0Q2JrIChkZWZySW50ZWdlckNia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0RmlsbEVuZENiayAoZGVmclZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldEZQQ0NiayAoZGVmckZQQ0Nia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0RlBDU3RhcnRDYmsgKGRlZnJJbnRlZ2VyQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRGUENFbmRDYmsgKGRlZnJWb2lkQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRGbG9vclBsYW5OYW1lQ2JrIChkZWZyU3RyaW5nQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRHY2VsbEdyaWRDYmsgKGRlZnJHY2VsbEdyaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldEdyb3VwTmFtZUNiayAoZGVmclN0cmluZ0Nia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0R3JvdXBNZW1iZXJDYmsgKGRlZnJTdHJpbmdDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldENvbXBvbmVudE1hc2tTaGlmdExheWVyQ2JrIChkZWZyQ29tcG9uZW50TWFza1NoaWZ0TGF5ZXJDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldEdyb3VwQ2JrIChkZWZyR3JvdXBDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldEdyb3VwRXh0Q2JrIChkZWZyU3RyaW5nQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRHcm91cHNTdGFydENiayAoZGVmckludGVnZXJDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldEdyb3Vwc0VuZENiayAoZGVmclZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldEhpc3RvcnlDYmsgKGRlZnJTdHJpbmdDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldElPVGltaW5nQ2JrIChkZWZySU9UaW1pbmdDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldElPVGltaW5nc1N0YXJ0Q2JrIChkZWZySW50ZWdlckNia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0SU9UaW1pbmdzRW5kQ2JrIChkZWZyVm9pZENia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0SW9UaW1pbmdzRXh0Q2JrIChkZWZyU3RyaW5nQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXROZXRDYmsgKGRlZnJOZXRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldE5ldE5hbWVDYmsgKGRlZnJTdHJpbmdDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldE5ldE5vbkRlZmF1bHRSdWxlQ2JrIChkZWZyU3RyaW5nQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXROZXRDb25uZWN0aW9uRXh0Q2JrIChkZWZyU3RyaW5nQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXROZXRFeHRDYmsgKGRlZnJTdHJpbmdDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldE5ldFBhcnRpYWxQYXRoQ2JrIChkZWZyTmV0Q2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXROZXRTdWJuZXROYW1lQ2JrIChkZWZyU3RyaW5nQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXROZXRTdGFydENiayAoZGVmckludGVnZXJDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldE5ldEVuZENiayAoZGVmclZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldE5vbkRlZmF1bHRDYmsgKGRlZnJOb25EZWZhdWx0Q2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXROb25EZWZhdWx0U3RhcnRDYmsgKGRlZnJJbnRlZ2VyQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXROb25EZWZhdWx0RW5kQ2JrIChkZWZyVm9pZENia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0UGFydGl0aW9uQ2JrIChkZWZyUGFydGl0aW9uQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRQYXJ0aXRpb25zRXh0Q2JrIChkZWZyU3RyaW5nQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRQYXJ0aXRpb25zU3RhcnRDYmsgKGRlZnJJbnRlZ2VyQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRQYXJ0aXRpb25zRW5kQ2JrIChkZWZyVm9pZENia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0UGF0aENiayAoZGVmclBhdGhDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldFBpbkNhcENiayAoZGVmclBpbkNhcENia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0UGluQ2JrIChkZWZyUGluQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRQaW5FeHRDYmsgKGRlZnJTdHJpbmdDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldFBpblByb3BDYmsgKGRlZnJQaW5Qcm9wQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRQaW5Qcm9wU3RhcnRDYmsgKGRlZnJJbnRlZ2VyQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRQaW5Qcm9wRW5kQ2JrIChkZWZyVm9pZENia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0UHJvcENiayAoZGVmclByb3BDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldFByb3BEZWZFbmRDYmsgKGRlZnJWb2lkQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRQcm9wRGVmU3RhcnRDYmsgKGRlZnJWb2lkQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRSZWdpb25DYmsgKGRlZnJSZWdpb25DYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldFJlZ2lvblN0YXJ0Q2JrIChkZWZySW50ZWdlckNia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0UmVnaW9uRW5kQ2JrIChkZWZyVm9pZENia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0Um93Q2JrIChkZWZyUm93Q2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRTTmV0Q2JrIChkZWZyTmV0Q2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRTTmV0U3RhcnRDYmsgKGRlZnJJbnRlZ2VyQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRTTmV0RW5kQ2JrIChkZWZyVm9pZENia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0U05ldFBhcnRpYWxQYXRoQ2JrIChkZWZyTmV0Q2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRTTmV0V2lyZUNiayAoZGVmck5ldENia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0U2NhbkNoYWluRXh0Q2JrIChkZWZyU3RyaW5nQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRTY2FuY2hhaW5DYmsgKGRlZnJTY2FuY2hhaW5DYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldFNjYW5jaGFpbnNTdGFydENiayAoZGVmckludGVnZXJDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldFNjYW5jaGFpbnNFbmRDYmsgKGRlZnJWb2lkQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRTaXRlQ2JrIChkZWZyU2l0ZUNia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0U2xvdENiayAoZGVmclNsb3RDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldFNsb3RTdGFydENiayAoZGVmckludGVnZXJDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldFNsb3RFbmRDYmsgKGRlZnJWb2lkQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRTdGFydFBpbnNDYmsgKGRlZnJJbnRlZ2VyQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRTdHlsZXNDYmsgKGRlZnJTdHlsZXNDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldFN0eWxlc1N0YXJ0Q2JrIChkZWZySW50ZWdlckNia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0U3R5bGVzRW5kQ2JrIChkZWZyVm9pZENia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0UGluRW5kQ2JrIChkZWZyVm9pZENia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0VGVjaG5vbG9neUNiayAoZGVmclN0cmluZ0Nia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0VGltaW5nRGlzYWJsZUNiayAoZGVmclRpbWluZ0Rpc2FibGVDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldFRpbWluZ0Rpc2FibGVzU3RhcnRDYmsgKGRlZnJJbnRlZ2VyQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRUaW1pbmdEaXNhYmxlc0VuZENiayAoZGVmclZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldFRyYWNrQ2JrIChkZWZyVHJhY2tDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldFVuaXRzQ2JrIChkZWZyRG91YmxlQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRWZXJzaW9uQ2JrIChkZWZyRG91YmxlQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRWZXJzaW9uU3RyQ2JrIChkZWZyU3RyaW5nQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRWaWFDYmsgKGRlZnJWaWFDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmclNldFZpYUV4dENiayAoZGVmclN0cmluZ0Nia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0VmlhU3RhcnRDYmsgKGRlZnJJbnRlZ2VyQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRWaWFFbmRDYmsgKGRlZnJWb2lkQ2JrRm5UeXBlIHAwKTsKLQotLyogTkVXIENBTExCQUNLIC0gRm9yIGVhY2ggbmV3IGNhbGxiYWNrIHlvdSBjcmVhdGUsIHlvdSBtdXN0ICAgICAgICAgICAgICAgICAgKi8KLS8qIGNyZWF0ZSBhIHJvdXRpbmUgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gc2V0IGl0LiAgQWRkIHRoZSAgICAgICAgICAgICAgICAgICovCi0vKiBzZXR0aW5nIHJvdXRpbmVzIGhlcmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0vKlNldCBhbGwgb2YgdGhlIGNhbGxiYWNrcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIHNldCB0byB0aGUgZm9sbG93aW5nICAgICAgICAqLwotLypmdW5jdGlvbi4gIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgaWYgeW91IHdhbnQgdG8gY2hlY2sgdG8gc2VlICAgICAgICAgICAgKi8KLS8qaWYgeW91IGZvcmdvdCBhbnl0aGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gdm9pZCBkZWZyVW5zZXRDYWxsYmFja3MgKCk7Ci0KLS8qIEZ1bmN0aW9ucyB0byBjYWxsIHRvIHVucmVnaXN0ZXIgYSBjYWxsYmFjayBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gdm9pZCBkZWZyVW5zZXRBcnJheU5hbWVDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXRBc3NlcnRpb25DYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXRBc3NlcnRpb25zU3RhcnRDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXRBc3NlcnRpb25zRW5kQ2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0QmxvY2thZ2VDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXRCbG9ja2FnZVN0YXJ0Q2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0QmxvY2thZ2VFbmRDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXRCdXNCaXRDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXRDYW5ub3RPY2N1cHlDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXRDYW5wbGFjZUNiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldENhc2VTZW5zaXRpdmVDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXRDb21wb25lbnRDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXRDb21wb25lbnRFeHRDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXRDb21wb25lbnRTdGFydENiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldENvbXBvbmVudEVuZENiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldENvbnN0cmFpbnRDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXRDb25zdHJhaW50c1N0YXJ0Q2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0Q29uc3RyYWludHNFbmRDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXREZWZhdWx0Q2FwQ2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0RGVzaWduQ2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0RGVzaWduRW5kQ2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0RGllQXJlYUNiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldERpdmlkZXJDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXRFeHRlbnNpb25DYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXRGaWxsQ2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0RmlsbFN0YXJ0Q2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0RmlsbEVuZENiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldEZQQ0NiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldEZQQ1N0YXJ0Q2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0RlBDRW5kQ2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0Rmxvb3JQbGFuTmFtZUNiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldEdjZWxsR3JpZENiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldEdyb3VwQ2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0R3JvdXBFeHRDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXRHcm91cE1lbWJlckNiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldENvbXBvbmVudE1hc2tTaGlmdExheWVyQ2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0R3JvdXBOYW1lQ2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0R3JvdXBzU3RhcnRDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXRHcm91cHNFbmRDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXRIaXN0b3J5Q2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0SU9UaW1pbmdDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXRJT1RpbWluZ3NTdGFydENiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldElPVGltaW5nc0VuZENiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldElPVGltaW5nc0V4dENiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldE5ldENiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldE5ldE5hbWVDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXROZXROb25EZWZhdWx0UnVsZUNiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldE5ldENvbm5lY3Rpb25FeHRDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXROZXRFeHRDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXROZXRQYXJ0aWFsUGF0aENiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldE5ldFN1Ym5ldE5hbWVDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXROZXRTdGFydENiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldE5ldEVuZENiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldE5vbkRlZmF1bHRDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXROb25EZWZhdWx0U3RhcnRDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXROb25EZWZhdWx0RW5kQ2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0UGFydGl0aW9uQ2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0UGFydGl0aW9uc0V4dENiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldFBhcnRpdGlvbnNTdGFydENiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldFBhcnRpdGlvbnNFbmRDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXRQYXRoQ2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0UGluQ2FwQ2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0UGluQ2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0UGluRW5kQ2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0UGluRXh0Q2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0UGluUHJvcENiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldFBpblByb3BTdGFydENiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldFBpblByb3BFbmRDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXRQcm9wQ2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0UHJvcERlZkVuZENiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldFByb3BEZWZTdGFydENiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldFJlZ2lvbkNiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldFJlZ2lvblN0YXJ0Q2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0UmVnaW9uRW5kQ2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0Um93Q2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0U2NhbkNoYWluRXh0Q2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0U2NhbmNoYWluQ2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0U2NhbmNoYWluc1N0YXJ0Q2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0U2NhbmNoYWluc0VuZENiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldFNpdGVDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXRTbG90Q2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0U2xvdFN0YXJ0Q2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0U2xvdEVuZENiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldFNOZXRXaXJlQ2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0U05ldENiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldFNOZXRTdGFydENiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldFNOZXRFbmRDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXRTTmV0UGFydGlhbFBhdGhDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXRTdGFydFBpbnNDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXRTdHlsZXNDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXRTdHlsZXNTdGFydENiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldFN0eWxlc0VuZENiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldFRlY2hub2xvZ3lDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXRUaW1pbmdEaXNhYmxlQ2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0VGltaW5nRGlzYWJsZXNTdGFydENiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldFRpbWluZ0Rpc2FibGVzRW5kQ2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0VHJhY2tDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXRVbml0c0NiayAoKTsKLUVYVEVSTiB2b2lkIGRlZnJVbnNldFZlcnNpb25DYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXRWZXJzaW9uU3RyQ2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0VmlhQ2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0VmlhRXh0Q2JrICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0VmlhU3RhcnRDYmsgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXRWaWFFbmRDYmsgKCk7Ci0KLS8qIFJvdXRpbmUgdG8gc2V0IGFsbCB1bnVzZWQgY2FsbGJhY2tzLiBUaGlzIGlzIHVzZWZ1bCBmb3IgY2hlY2tpbmcgICAgICAgICAgICovCi0vKnRvIHNlZSBpZiB5b3UgbWlzc2VkIHNvbWV0aGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIHZvaWQgZGVmclNldFVudXNlZENhbGxiYWNrcyAoZGVmclZvaWRDYmtGblR5cGUgIGZ1bmMpOwotCi0vKiBSZXR1cm4gdGhlIGN1cnJlbnQgbGluZSBudW1iZXIgaW4gdGhlIGlucHV0IGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBkZWZyTGluZU51bWJlciAoKTsKLUVYVEVSTiBsb25nIGxvbmcgZGVmckxvbmdMaW5lTnVtYmVyICgpOwotCi0vKiBSb3V0aW5lIHRvIHNldCB0aGUgbWVzc2FnZSBsb2dnaW5nIHJvdXRpbmUgZm9yIGVycm9ycyAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHR5cGVkZWYgdm9pZCAoKkRFRklfTE9HX0ZVTkNUSU9OKSAoY29uc3QgY2hhciopOwotRVhURVJOIHZvaWQgZGVmclNldExvZ0Z1bmN0aW9uIChERUZJX0xPR19GVU5DVElPTiBwMCk7Ci0KLS8qIFJvdXRpbmUgdG8gc2V0IHRoZSBtZXNzYWdlIGxvZ2dpbmcgcm91dGluZSBmb3Igd2FybmluZ3MgICAgICAgICAgICAgICAgICAgICovCi0jaWZuZGVmIERFRklfV0FSTklOR19MT0dfRlVOQ1RJT04KLSAgICB0eXBlZGVmIHZvaWQgKCpERUZJX1dBUk5JTkdfTE9HX0ZVTkNUSU9OKSAoY29uc3QgY2hhciopOwotI2VuZGlmCi1FWFRFUk4gdm9pZCBkZWZyU2V0V2FybmluZ0xvZ0Z1bmN0aW9uIChERUZJX1dBUk5JTkdfTE9HX0ZVTkNUSU9OIHAwKTsKLQotLyogUm91dGluZSB0byBzZXQgdGhlIHVzZXIgZGVmaW5lZCBtYWxsb2Mgcm91dGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLXR5cGVkZWYgdm9pZCogKCpERUZJX01BTExPQ19GVU5DVElPTikgKHNpemVfdCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0TWFsbG9jRnVuY3Rpb24gKERFRklfTUFMTE9DX0ZVTkNUSU9OIHAwKTsKLQotLyogUm91dGluZSB0byBzZXQgdGhlIHVzZXIgZGVmaW5lZCByZWFsbG9jIHJvdXRpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLXR5cGVkZWYgdm9pZCogKCpERUZJX1JFQUxMT0NfRlVOQ1RJT04pICh2b2lkKiwgc2l6ZV90KTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRSZWFsbG9jRnVuY3Rpb24gKERFRklfUkVBTExPQ19GVU5DVElPTiBwMCk7Ci0KLS8qIFJvdXRpbmUgdG8gc2V0IHRoZSB1c2VyIGRlZmluZWQgZnJlZSByb3V0aW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi10eXBlZGVmIHZvaWQgKCpERUZJX0ZSRUVfRlVOQ1RJT04pICh2b2lkICopOwotRVhURVJOIHZvaWQgZGVmclNldEZyZWVGdW5jdGlvbiAoREVGSV9GUkVFX0ZVTkNUSU9OIHAwKTsKLQotLyogUm91dGluZSB0byBzZXQgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBmaWxlIHRoYXQgaXMgcGFyc2luZyByb3V0aW5lICh0YWtlcyAgKi8KLXR5cGVkZWYgdm9pZCAoKkRFRklfTElORV9OVU1CRVJfRlVOQ1RJT04pICAoaW50KTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRMaW5lTnVtYmVyRnVuY3Rpb24gKERFRklfTElORV9OVU1CRVJfRlVOQ1RJT04gcDApOwotCi0vKiBSb3V0aW5lIHRvIHNldCB0aGUgbGluZSBudW1iZXIgb2YgdGhlIGZpbGUgdGhhdCBpcyBwYXJzaW5nIHJvdXRpbmUgKHRha2VzICAqLwotdHlwZWRlZiB2b2lkICgqREVGSV9MT05HX0xJTkVfTlVNQkVSX0ZVTkNUSU9OKSAgKGxvbmcgbG9uZyk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0TG9uZ0xpbmVOdW1iZXJGdW5jdGlvbiAoREVGSV9MT05HX0xJTkVfTlVNQkVSX0ZVTkNUSU9OIHAwKTsKLQotLyogU2V0IHRoZSBudW1iZXIgb2YgbGluZXMgYmVmb3JlIGNhbGxpbmcgdGhlIGxpbmUgZnVuY3Rpb24gY2FsbGJhY2sgcm91dGluZSAgKi8KLS8qIERlZmF1bHQgaXMgMTAwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gdm9pZCBkZWZyU2V0RGVsdGFOdW1iZXJMaW5lcyAoaW50IHAwKTsKLQotLyogUm91dGluZSB0byBzZXQgdGhlIHJlYWQgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLXR5cGVkZWYgc2l6ZV90ICgqREVGSV9SRUFEX0ZVTkNUSU9OKSAgKEZJTEUqLCBjaGFyKiwgc2l6ZV90KTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRSZWFkRnVuY3Rpb24gKERFRklfUkVBRF9GVU5DVElPTiBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZyVW5zZXRSZWFkRnVuY3Rpb24gKCk7Ci0KLS8qIFJvdXRpbmUgdG8gc2V0IHRoZSBkZWZyV2FybmluZy5sb2cgdG8gb3BlbiBhcyBhcHBlbmQgaW5zdGVhZCBmb3Igd3JpdGUgICAgICovCi0vKiBOZXcgaW4gNS43ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIHZvaWQgZGVmclNldE9wZW5Mb2dGaWxlQXBwZW5kICgpOwotRVhURVJOIHZvaWQgZGVmclVuc2V0T3BlbkxvZ0ZpbGVBcHBlbmQgKCk7Ci0KLS8qIFJvdXRpbmUgdG8gc2V0IHRoZSBtYWdpYyBjb21tZW50IGZvdW5kIHJvdXRpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi10eXBlZGVmIHZvaWQgKCpERUZJX01BR0lDX0NPTU1FTlRfRk9VTkRfRlVOQ1RJT04pICgpOwotRVhURVJOIHZvaWQgZGVmclNldE1hZ2ljQ29tbWVudEZvdW5kRnVuY3Rpb24gKERFRklfTUFHSUNfQ09NTUVOVF9GT1VORF9GVU5DVElPTiBwMCk7Ci0KLS8qIFJvdXRpbmUgdG8gc2V0IHRoZSBtYWdpYyBjb21tZW50IHN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gdm9pZCBkZWZyU2V0TWFnaWNDb21tZW50U3RyaW5nIChjaGFyICogcDApOwotCi0vKiBSb3V0aW5lIHRvIGRpc2FibGUgc3RyaW5nIHByb3BlcnR5IHZhbHVlIHByb2Nlc3MsIGRlZmF1bHQgaXQgd2lsbCBwcm9jZXNzICAqLwotLyogdGhlIHZhbHVlIHN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiB2b2lkIGRlZnJEaXNhYmxlUHJvcFN0clByb2Nlc3MgKCk7Ci0KLS8qIFRlc3RpbmcgcHVycG9zZXMgb25seSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gdm9pZCBkZWZyU2V0TkxpbmVzIChsb25nIGxvbmcgIG4pOwotCi0vKiBSb3V0aW5lIHRvIHNldCB0aGUgbWF4IG51bWJlciBvZiB3YXJuaW5ncyBmb3IgYSBwZXJ0aWN1bGFyIHNlY3Rpb24gICAgICAgICAqLwotCi1FWFRFUk4gdm9pZCBkZWZyU2V0QXNzZXJ0aW9uV2FybmluZ3MgKGludCAgd2Fybik7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0QmxvY2thZ2VXYXJuaW5ncyAoaW50ICB3YXJuKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRDYXNlU2Vuc2l0aXZlV2FybmluZ3MgKGludCAgd2Fybik7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0Q29tcG9uZW50V2FybmluZ3MgKGludCAgd2Fybik7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0Q29uc3RyYWludFdhcm5pbmdzIChpbnQgIHdhcm4pOwotRVhURVJOIHZvaWQgZGVmclNldERlZmF1bHRDYXBXYXJuaW5ncyAoaW50ICB3YXJuKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRHY2VsbEdyaWRXYXJuaW5ncyAoaW50ICB3YXJuKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRJT1RpbWluZ1dhcm5pbmdzIChpbnQgIHdhcm4pOwotRVhURVJOIHZvaWQgZGVmclNldE5ldFdhcm5pbmdzIChpbnQgIHdhcm4pOwotRVhURVJOIHZvaWQgZGVmclNldE5vbkRlZmF1bHRXYXJuaW5ncyAoaW50ICB3YXJuKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRQaW5FeHRXYXJuaW5ncyAoaW50ICB3YXJuKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRQaW5XYXJuaW5ncyAoaW50ICB3YXJuKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRSZWdpb25XYXJuaW5ncyAoaW50ICB3YXJuKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRSb3dXYXJuaW5ncyAoaW50ICB3YXJuKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRTY2FuY2hhaW5XYXJuaW5ncyAoaW50ICB3YXJuKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRTTmV0V2FybmluZ3MgKGludCAgd2Fybik7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0U3R5bGVzV2FybmluZ3MgKGludCAgd2Fybik7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0VHJhY2tXYXJuaW5ncyAoaW50ICB3YXJuKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRVbml0c1dhcm5pbmdzIChpbnQgIHdhcm4pOwotRVhURVJOIHZvaWQgZGVmclNldFZlcnNpb25XYXJuaW5ncyAoaW50ICB3YXJuKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRWaWFXYXJuaW5ncyAoaW50ICB3YXJuKTsKLQotLyogSGFuZGxpbmcgb3V0cHV0IG1lc3NhZ2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiB2b2lkIGRlZnJEaXNhYmxlUGFyc2VyTXNncyAoaW50ICBuTXNnLCBpbnQqICBtc2dzKTsKLUVYVEVSTiB2b2lkIGRlZnJFbmFibGVQYXJzZXJNc2dzIChpbnQgIG5Nc2csIGludCogIG1zZ3MpOwotRVhURVJOIHZvaWQgZGVmckVuYWJsZUFsbE1zZ3MgKCk7Ci1FWFRFUk4gdm9pZCBkZWZyU2V0VG90YWxNc2dMaW1pdCAoaW50ICB0b3ROdW1Nc2dzKTsKLUVYVEVSTiB2b2lkIGRlZnJTZXRMaW1pdFBlck1zZyAoaW50ICBtc2dJZCwgaW50ICBudW1Nc2cpOwotCi0vKiBSZXR1cm4gY29kZXMgZm9yIHRoZSB1c2VyIGNhbGxiYWNrcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLypUaGUgdXNlciBzaG91bGQgcmV0dXJuIG9uZSBvZiB0aGVzZSB2YWx1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgUEFSU0VfT0sgMCAgICAgIAotI2RlZmluZSBTVE9QX1BBUlNFIDEgICAgCi0jZGVmaW5lIFBBUlNFX0VSUk9SIDIgICAKLQotLyogQWRkIHRoaXMgYWxpYXMgdG8gdGhlIGxpc3QgZm9yIHRoZSBwYXJzZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiB2b2lkIGRlZnJBZGRBbGlhcyAoY29uc3QgY2hhciogIGtleSwgY29uc3QgY2hhciogIHZhbHVlLCBpbnQgIG1hcmtlZCwgZGVmckRhdGEgKiBkYXRhKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZ3V3JpdGVyLmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZ3V3JpdGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ODBjOGIuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYvZGVmd1dyaXRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1NSArMCwwIEBACi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qIEFUVEVOVElPTjogVEhJUyBJUyBBTiBBVVRPLUdFTkVSQVRFRCBGSUxFLiBETyBOT1QgQ0hBTkdFIElUISAgICAgICAgICAgICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qIENvcHlyaWdodCAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UgICAgICAgICAgICAgKi8KLS8qIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7ICAgICAgICAgICAgKi8KLS8qICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gICAgICAgICovCi0vKiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAgICAgKi8KLS8qICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsICAgICAgICovCi0vKiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICAgICAqLwotLyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICAgICAgKi8KLS8qICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwgICAgICAgICAgKi8KLS8qIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRBdXRob3I6IGRlbGwgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJFJldmlzaW9uOiAjMSAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJERhdGU6IDIwMTcvMDYvMDYgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkU3RhdGU6ICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotCi0jaWZuZGVmIENERUZXV1JJVEVSX0gKLSNkZWZpbmUgQ0RFRldXUklURVJfSAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJkZWZpVHlwZWRlZnMuaCIKLQotLyogUmV0dXJuIGNvZGVzIGZvciB3cml0aW5nIGZ1bmN0aW9uczogKi8KLSNkZWZpbmUgREVGV19PSyAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIERFRldfVU5JTklUSUFMSVpFRCAgICAgMQotI2RlZmluZSBERUZXX0JBRF9PUkRFUiAgICAgICAgIDIKLSNkZWZpbmUgREVGV19CQURfREFUQSAgICAgICAgICAzCi0jZGVmaW5lIERFRldfQUxSRUFEWV9ERUZJTkVEICAgNAotI2RlZmluZSBERUZXX1dST05HX1ZFUlNJT04gICAgIDUKLSNkZWZpbmUgREVGV19PQlNPTEVURSAgICAgICAgICA2Ci0jZGVmaW5lIERFRldfVE9PX01BTllfU1RNUyAgICAgNyAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2VjdGlvbiBpcyBzbWFsbGVyIHRoYW4gdGhlIGFjdHVhbCBudW1iZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9mIHN0YXRlbWVudHMgZGVmaW5lZCBpbiB0aGF0IHNlY3Rpb24gICAgKi8KLQotLyogb3JpZW50Ci0gICAwID0gTgotICAgMSA9IFcKLSAgIDIgPSBTCi0gICAzID0gRQotICAgNCA9IEZOCi0gICA1ID0gRlcKLSAgIDYgPSBGUwotICAgNyA9IEZFCi0qLwotCi0vKiBUaGlzIHJvdXRpbmUgd2lsbCB3cml0ZSBhIG5ldyBsaW5lICovCi1FWFRFUk4gaW50IGRlZndOZXdMaW5lICgpOwotCi0vKiBUaGUgREVGIHdyaXRlciBpbml0aWFsaXphdGlvbi4gIE11c3QgYmUgY2FsbGVkIGZpcnN0LgotICogRWl0aGVyIHRoaXMgcm91dGluZSBvciBkZWZ3SW5pdENiayBzaG91bGQgYmUgY2FsbCBvbmx5LgotICogQ2FuJ3QgY2FsbCBib3RoIHJvdXRpbmVzIGluIG9uZSBwcm9ncmFtLgotICogVGhpcyByb3V0aW5lIGlzIGZvciB1c2VyIHdobyBkb2VzIG5vdCB3YW50IHRvIHVzZSB0aGUgY2FsbGJhY2sgbWFjaGFuaXNtLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICovCi1FWFRFUk4gaW50IGRlZndJbml0IChGSUxFKiAgZiwgaW50ICB2ZXJzMSwgaW50ICB2ZXJzaW9uMiwgY29uc3QgY2hhciogIGNhc2VTZW5zaXRpdmUsIGNvbnN0IGNoYXIqICBkaXZpZGVyQ2hhciwgY29uc3QgY2hhciogIGJ1c0JpdENoYXJzLCBjb25zdCBjaGFyKiAgZGVzaWduTmFtZSwgY29uc3QgY2hhciogIHRlY2hub2xvZ3ksIGNvbnN0IGNoYXIqICBhcnJheSwgY29uc3QgY2hhciogIGZsb29ycGxhbiwgZG91YmxlICB1bml0cyk7Ci0KLS8qIFRoZSBERUYgd3JpdGVyIGluaXRpYWxpemF0aW9uLiAgTXVzdCBiZSBjYWxsZWQgZmlyc3QuCi0gKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGRlZndJbml0IHNob3VsZCBiZSBjYWxsIG9ubHkuCi0gKiBDYW4ndCBjYWxsIGJvdGggcm91dGluZXMgaW4gb25lIHByb2dyYW0uCi0gKiBUaGlzIHJvdXRpbmUgaXMgZm9yIHVzZXIgd2hvIGNob29zZSB0byB1c2UgdGhlIGNhbGxiYWNrIG1hY2hhbmlzbS4KLSAqIElmIHVzZXIgdXNlcyB0aGUgY2FsbGJhY2sgZm9yIHRoZSB3cml0ZXIsIHRoZXkgbmVlZCB0byBwcm92aWRlCi0gKiBjYWxsYmFja3MgZm9yIFZlcnNpb24sIE5hbWVzQ2FzZVNlbnNpdGl2ZSwgQnVzQml0Q2hhcnMgYW5kIERpdmlkZXJDaGFyLgotICogVGhlc2Ugc2VjdGlvbnMgYXJlIHJlcXVpcmVkIGJ5IHRoZSBkZWYuICBJZiBhbnkgb2YgdGhlc2UgY2FsbGJhY2tzCi0gKiBhcmUgbWlzc2luZywgZGVmYXVsdHMgd2lsbCBiZSB1c2VkLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICovCi1FWFRFUk4gaW50IGRlZndJbml0Q2JrIChGSUxFKiAgZik7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgZGVmd0luaXQuCi0gKiBUaGlzIHJvdXRpbmUgaXMgcmVxdWlyZWQuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAqLwotRVhURVJOIGludCBkZWZ3VmVyc2lvbiAoaW50ICB2ZXJzMSwgaW50ICB2ZXJzMik7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgZGVmd0luaXQuCi0gKiBUaGlzIHJvdXRpbmUgaXMgcmVxdWlyZWQuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAqLwotRVhURVJOIGludCBkZWZ3Q2FzZVNlbnNpdGl2ZSAoY29uc3QgY2hhciogIGNhc2VTZW5zaXRpdmUpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGRlZndJbml0LgotICogVGhpcyByb3V0aW5lIGlzIHJlcXVpcmVkLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gKi8KLUVYVEVSTiBpbnQgZGVmd0J1c0JpdENoYXJzIChjb25zdCBjaGFyKiAgYnVzQml0Q2hhcnMpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGRlZndJbml0LgotICogVGhpcyByb3V0aW5lIGlzIHJlcXVpcmVkLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gKi8KLUVYVEVSTiBpbnQgZGVmd0RpdmlkZXJDaGFyIChjb25zdCBjaGFyKiAgZGl2aWRlckNoYXIpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGRlZndJbml0LgotICogVGhpcyByb3V0aW5lIGlzIHJlcXVpcmVkLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gKi8KLUVYVEVSTiBpbnQgZGVmd0Rlc2lnbk5hbWUgKGNvbnN0IGNoYXIqICBuYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBkZWZ3SW5pdC4KLSAqIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICovCi1FWFRFUk4gaW50IGRlZndUZWNobm9sb2d5IChjb25zdCBjaGFyKiAgdGVjaG5vbG9neSk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgZGVmd0luaXQuCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAqLwotRVhURVJOIGludCBkZWZ3QXJyYXkgKGNvbnN0IGNoYXIqICBhcnJheSk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgZGVmd0luaXQuCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAqLwotRVhURVJOIGludCBkZWZ3Rmxvb3JwbGFuIChjb25zdCBjaGFyKiAgZmxvb3JwbGFuKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBkZWZ3SW5pdC4KLSAqIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICovCi1FWFRFUk4gaW50IGRlZndVbml0cyAoaW50ICB1bml0cyk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgZGVmd0luaXQuCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgMCB0byBtYW55IHRpbWVzLiAqLwotRVhURVJOIGludCBkZWZ3SGlzdG9yeSAoY29uc3QgY2hhciogIHN0cmluZyk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgaGlzdG9yeSByb3V0aW5lcyAoaWYgYW55KS4KLSAqIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICovCi1FWFRFUk4gaW50IGRlZndTdGFydFByb3BEZWYgKCk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBkZWZ3U3RhcnRQcm9wRGVmLgotICogVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCi0gKiBJdCBhZGRzIGludGVnZXIgcHJvcGVydHkgZGVmaW5pdGlvbiB0byB0aGUgc3RhdGVtZW50LgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWxsLgotICogVGhlIG9ialR5cGUgY2FuIGJlIExJQlJBUlkgb3IgVklBIG9yIE1BQ1JPIG9yIFBJTi4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTk9OREVGQVVMVFJVTEUgfCBNQUNSTyB8IFBJTiAgICAgICAgICovCi1FWFRFUk4gaW50IGRlZndJbnRQcm9wRGVmIChjb25zdCBjaGFyKiAgb2JqVHlwZSwgY29uc3QgY2hhciogIHByb3BOYW1lLCBkb3VibGUgIGxlZnRSYW5nZSwgZG91YmxlICByaWdodFJhbmdlLCBpbnQgICAgIHByb3BWYWx1ZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBkZWZ3U3RhcnRQcm9wRGVmLgotICogVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCi0gKiBJdCBhZGRzIHJlYWwgcHJvcGVydHkgZGVmaW5pdGlvbiB0byB0aGUgc3RhdGVtZW50LgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWxsLgotICogVGhlIG9ialR5cGUgY2FuIGJlIExJQlJBUlkgb3IgVklBIG9yIE1BQ1JPIG9yIFBJTi4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTk9OREVGQVVMVFJVTEUgfCBNQUNSTyB8IFBJTiAgICAgICAgICovCi1FWFRFUk4gaW50IGRlZndSZWFsUHJvcERlZiAoY29uc3QgY2hhciogIG9ialR5cGUsIGNvbnN0IGNoYXIqICBwcm9wTmFtZSwgZG91YmxlICBsZWZ0UmFuZ2UsIGRvdWJsZSAgcmlnaHRSYW5nZSwgZG91YmxlICBwcm9wVmFsdWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgZGVmd1N0YXJ0UHJvcERlZi4KLSAqIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgotICogSXQgYWRkcyBzdHJpbmcgcHJvcGVydHkgZGVmaW5pdGlvbiB0byB0aGUgc3RhdGVtZW50LgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWxsLgotICogVGhlIG9ialR5cGUgY2FuIGJlIExJQlJBUlkgb3IgVklBIG9yIE1BQ1JPIG9yIFBJTi4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5PTkRFRkFVTFRSVUxFIHwgTUFDUk8gfCBQSU4gICAgICAgICovCi1FWFRFUk4gaW50IGRlZndTdHJpbmdQcm9wRGVmIChjb25zdCBjaGFyKiAgb2JqVHlwZSwgY29uc3QgY2hhciogIHByb3BOYW1lLCBkb3VibGUgIGxlZnRSYW5nZSwgZG91YmxlICByaWdodFJhbmdlLCBjb25zdCBjaGFyKiAgcHJvcFZhbHVlKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGFsbCB0aGUgcHJvcGVydGllcyBoYXZlIGJlZW4KLSAqIGFkZGVkIHRvIHRoZSBmaWxlLgotICogSWYgeW91IGNhbGxlZCBkZWZ3UHJvcGVydHlEZWZpbml0aW9ucyB0aGVuIHRoaXMgcm91dGluZSBpcyBOT1Qgb3B0aW9uYWwuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAqLwotRVhURVJOIGludCBkZWZ3RW5kUHJvcERlZiAoKTsKLQotLyogVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgYWZ0ZXIgZGVmd1JvdywgZGVmd1JlZ2lvbiwgZGVmd0NvbXBvbmVudCwKLSAqIGRlZndQaW4sIGRlZndTcGVjaWFsTmV0LCBkZWZ3TmV0LCBhbmQgZGVmd0dyb3VwCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwsIGl0IGFkZHMgc3RyaW5nIHByb3BlcnR5IHRvIHRoZSBzdGF0ZW1lbnQuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIDAgdG8gbWFueSB0aW1lcyAqLwotRVhURVJOIGludCBkZWZ3U3RyaW5nUHJvcGVydHkgKGNvbnN0IGNoYXIqICBwcm9wTmFtZSwgY29uc3QgY2hhciogIHByb3BWYWx1ZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIGFmdGVyIGRlZndSb3csIGRlZndSZWdpb24sIGRlZndDb21wb25lbnQsCi0gKiBkZWZ3UGluLCBkZWZ3U3BlY2lhbE5ldCwgZGVmd05ldCwgYW5kIGRlZndHcm91cAotICogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLCBpdCBhZGRzIHJlYWwgcHJvcGVydHkgdG8gdGhlIHN0YXRlbWVudC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgMCB0byBtYW55IHRpbWVzICovCi1FWFRFUk4gaW50IGRlZndSZWFsUHJvcGVydHkgKGNvbnN0IGNoYXIqICBwcm9wTmFtZSwgZG91YmxlICBwcm9wVmFsdWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBhZnRlciBkZWZ3Um93LCBkZWZ3UmVnaW9uLCBkZWZ3Q29tcG9uZW50LAotICogZGVmd1BpbiwgZGVmd1NwZWNpYWxOZXQsIGRlZndOZXQsIGFuZCBkZWZ3R3JvdXAKLSAqIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCwgaXQgYWRkcyBpbnQgcHJvcGVydHkgdG8gdGhlIHN0YXRlbWVudC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgMCB0byBtYW55IHRpbWVzICovCi1FWFRFUk4gaW50IGRlZndJbnRQcm9wZXJ0eSAoY29uc3QgY2hhciogIHByb3BOYW1lLCBpbnQgIHByb3BWYWx1ZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbnMgKGlmIGFueSkuCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAqLwotRVhURVJOIGludCBkZWZ3RGllQXJlYSAoaW50ICB4bCwgaW50ICB5bCwgaW50ICB4aCwgaW50ICB5aCk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbnMgKGlmIGFueSkuCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0gKiBUaGlzIHJvdXRpbmUgaXMgdGhlIHNhbWUgYXMgZGVmd0RpZUFyZWEsIGJ1dCBhY2NlcHQgbW9yZSB0aGFuIDIgcG9pbnRzCi0gKiBUaGlzIGlzIGEgNS42IHN5bnRheAotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gKi8KLUVYVEVSTiBpbnQgZGVmd0RpZUFyZWFMaXN0IChpbnQgIG51bV9wb2ludHMsIGludCogIHhsLCBpbnQqICB5aCk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgRGllIEFyZWEgKGlmIGFueSkuCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSBpbnRlZ2VyICJvcmllbnQiIGFuZCBvcGVyYXRpb24gb2YgdGhlIGRvIGlzIGV4cGxhaW5lZCBpbgotICogdGhlIGRvY3VtZW50YXRpb24uCi0gKiBJbiA1LjYsIHRoZSBETyBzeW50YXggaXMgb3B0aW9uYWwgYW5kIHRoZSBTVEVQIHN5bnRheCBpcyBvcHRpb25hbCBpbiBETyAqLwotRVhURVJOIGludCBkZWZ3Um93IChjb25zdCBjaGFyKiAgcm93TmFtZSwgY29uc3QgY2hhciogIHJvd1R5cGUsIGludCAgeF9vcmlnLCBpbnQgIHlfb3JpZywgaW50ICBvcmllbnQsIGludCAgZG9fY291bnQsIGludCAgZG9faW5jcmVtZW50LCBpbnQgIHhzdGVwLCBpbnQgIHlzdGVwKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBEaWUgQXJlYSAoaWYgYW55KS4KLSAqIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhpcyByb3V0aW5lIGlzIHRoZSBzYW1lIGFzIGRlZndSb3csIGV4Y3BldCBvcmllbnQgaXMgYSBjaGFyKiAqLwotRVhURVJOIGludCBkZWZ3Um93U3RyIChjb25zdCBjaGFyKiAgcm93TmFtZSwgY29uc3QgY2hhciogIHJvd1R5cGUsIGludCAgeF9vcmlnLCBpbnQgIHlfb3JpZywgY29uc3QgY2hhciogIG9yaWVudCwgaW50ICBkb19jb3VudCwgaW50ICBkb19pbmNyZW1lbnQsIGludCAgeHN0ZXAsIGludCAgeXN0ZXApOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGRlZndSb3cgKGlmIGFueSkuCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSBvcGVyYXRpb24gb2YgdGhlIGRvIGlzIGV4cGxhaW5lZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gKi8KLUVYVEVSTiBpbnQgZGVmd1RyYWNrcyAoY29uc3QgY2hhciogIG1hc3RlciwgaW50ICBkb1N0YXJ0LCBpbnQgIGRvQ291bnQsIGludCAgZG9TdGVwLCBpbnQgIG51bUxheWVycywgY29uc3QgY2hhcioqICBsYXllcnMsIGludCAgbWFzaywgaW50ICBzYW1lTWFzayk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgZGVmd1RyYWNrcyAoaWYgYW55KS4KLSAqIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhlIG9wZXJhdGlvbiBvZiB0aGUgZG8gaXMgZXhwbGFpbmVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiAqLwotRVhURVJOIGludCBkZWZ3R2NlbGxHcmlkIChjb25zdCBjaGFyKiAgbWFzdGVyLCBpbnQgIGRvU3RhcnQsIGludCAgZG9Db3VudCwgaW50ICBkb1N0ZXApOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGRlZndUcmFja3MgKGlmIGFueSkuCi0gKiBUaGlzIHNlY3Rpb24gb2Ygcm91dGluZXMgaXMgb3B0aW9uYWwuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIHN0YXJ0cyB0aGUgZGVmYXVsdCBjYXBhY2l0YW5jZSBzZWN0aW9uLiAgIEFsbCBvZiB0aGUKLSAqIGNhcGFjaXRhbmNlcyBtdXN0IGZvbGxvdy4KLSAqIFRoZSBjb3VudCBpcyB0aGUgbnVtYmVyIG9mIGRlZndEZWZhdWx0Q2FwIGNhbGxzIHRvIGZvbGxvdy4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLgotICogVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAqLwotRVhURVJOIGludCBkZWZ3U3RhcnREZWZhdWx0Q2FwIChpbnQgIGNvdW50KTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBvbmNlIGZvciBlYWNoIGRlZmF1bHQgY2FwLiAgVGhlIGNhbGxzIG11c3QKLSAqIGJlIHByZWNlZWRlZCBieSBhIGNhbGwgdG8gZGVmd1N0YXJ0RGVmYXVsdENhcCBhbmQgbXVzdCBiZQotICogdGVybWluYXRlZCBieSBhIGNhbGwgdG8gZGVmd0VuZERlZmF1bHRDYXAuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gKi8KLUVYVEVSTiBpbnQgZGVmd0RlZmF1bHRDYXAgKGludCAgcGlucywgZG91YmxlICBjYXApOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGRlZndEZWZhdWx0Q2FwIGNhbGxzIChpZiBhbnkpLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBJZiB0aGUgY291bnQgaW4gU3RhcnREZWZhdWx0Q2FwIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mCi0gKiBjYWxscyB0byBEZWZhdWx0Q2FwIHRoZW4gREVGV19CQURfREFUQSB3aWxsIHJldHVybiByZXR1cm5lZC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLgotICogVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAqLwotRVhURVJOIGludCBkZWZ3RW5kRGVmYXVsdENhcCAoKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBkZWZ3RGVmYXVsdENhcCBjYWxscyAoaWYgYW55KS4KLSAqIFRoZSBvcGVyYXRpb24gb2YgdGhlIGRvIGlzIGV4cGxhaW5lZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KLSAqIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtYW55IHRpbWVzLiAqLwotRVhURVJOIGludCBkZWZ3Q2FuUGxhY2UgKGNvbnN0IGNoYXIqICBtYXN0ZXIsIGludCAgeE9yaWcsIGludCAgeU9yaWcsIGludCAgb3JpZW50LCBpbnQgIGRvQ250LCBpbnQgIGRvSW5jLCBpbnQgIHhTdGVwLCBpbnQgIHlTdGVwKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBkZWZ3RGVmYXVsdENhcCBjYWxscyAoaWYgYW55KS4KLSAqIFRoZSBvcGVyYXRpb24gb2YgdGhlIGRvIGlzIGV4cGxhaW5lZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KLSAqIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtYW55IHRpbWVzLgotICogVGhpcyByb3V0aW5lIGlzIHRoZSBzYW1lIGFzIGRlZndDYW5QbGFjZSwgZXhjZXB0IG9yaWVudCBpcyBhIGNoYXIqICovCi1FWFRFUk4gaW50IGRlZndDYW5QbGFjZVN0ciAoY29uc3QgY2hhciogIG1hc3RlciwgaW50ICB4T3JpZywgaW50ICB5T3JpZywgY29uc3QgY2hhciogIG9yaWVudCwgaW50ICBkb0NudCwgaW50ICBkb0luYywgaW50ICB4U3RlcCwgaW50ICB5U3RlcCk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgZGVmd0NhblBsYWNlIGNhbGxzIChpZiBhbnkpLgotICogVGhlIG9wZXJhdGlvbiBvZiB0aGUgZG8gaXMgZXhwbGFpbmVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgotICogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG1hbnkgdGltZXMuICovCi1FWFRFUk4gaW50IGRlZndDYW5ub3RPY2N1cHkgKGNvbnN0IGNoYXIqICBtYXN0ZXIsIGludCAgeE9yaWcsIGludCAgeU9yaWcsIGludCAgb3JpZW50LCBpbnQgIGRvQ250LCBpbnQgIGRvSW5jLCBpbnQgIHhTdGVwLCBpbnQgIHlTdGVwKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBkZWZ3Q2FuUGxhY2UgY2FsbHMgKGlmIGFueSkuCi0gKiBUaGUgb3BlcmF0aW9uIG9mIHRoZSBkbyBpcyBleHBsYWluZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbWFueSB0aW1lcy4KLSAqIFRoaXMgcm91dGluZSBpcyB0aGUgc2FtZSBhcyBkZWZ3Q2Fubm90T2NjdXB5LCBleGNlcHQgb3JpZW50IGlzIGEgY2hhciogKi8KLUVYVEVSTiBpbnQgZGVmd0Nhbm5vdE9jY3VweVN0ciAoY29uc3QgY2hhciogIG1hc3RlciwgaW50ICB4T3JpZywgaW50ICB5T3JpZywgY29uc3QgY2hhciogIG9yaWVudCwgaW50ICBkb0NudCwgaW50ICBkb0luYywgaW50ICB4U3RlcCwgaW50ICB5U3RlcCk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBkZWZ3Q2Fubm90T2NjdXB5IChpZiBhbnkpLgotICogVGhpcyBzZWN0aW9uIG9mIHJvdXRpbmVzIGlzIG9wdGlvbmFsLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGUgcm91dGluZSBzdGFydHMgdGhlIHZpYSBzZWN0aW9uLiAgIEFsbCBvZiB0aGUgdmlhcyBtdXN0IGZvbGxvdy4KLSAqIFRoZSBjb3VudCBpcyB0aGUgbnVtYmVyIG9mIGRlZndWaWEgY2FsbHMgdG8gZm9sbG93LgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICovCi1FWFRFUk4gaW50IGRlZndTdGFydFZpYXMgKGludCAgY291bnQpOwotCi0vKiBUaGVzZSByb3V0aW5lcyBlbnRlciBlYWNoIHZpYSBpbnRvIHRoZSBmaWxlLgotICogVGhlc2Ugcm91dGluZXMgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGRlZndTdGFydFZpYXMgY2FsbC4KLSAqIGRlZndWaWFOYW1lIHNob3VsZCBiZSBjYWxsZWQgZmlyc3QsIGZvbGxvdyBlaXRoZXIgYnkgZGVmd1ZpYVBhdHRlcm4gb3IKLSAqIGRlZndWaWFMYXllci4gIEF0IHRoZSBlbmQgb2YgZWFjaCB2aWEsIGRlZndPbmVWaWFFbmQgc2hvdWxkIGJlIGNhbGxlZAotICogVGhlc2Ugcm91dGluZXMgYXJlIGZvciBbLSB2aWFOYW1lIFsrIFBBVFRFUk5OQU1FIHBhdHRlcm5OYW1lICsgUkVDVCBsYXllck5hbWUKLSAqIHB0IHB0XS4uLjtdLi4uCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lcyBjYW4gYmUgY2FsbGVkIG1hbnkgdGltZXMuICovCi1FWFRFUk4gaW50IGRlZndWaWFOYW1lIChjb25zdCBjaGFyKiAgbmFtZSk7Ci0KLUVYVEVSTiBpbnQgZGVmd1ZpYVBhdHRlcm4gKGNvbnN0IGNoYXIqICBwYXR0ZXJuTmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAqLwotLyogbWFzayBpcyA1Ljggc3ludGF4ICovCi1FWFRFUk4gaW50IGRlZndWaWFSZWN0IChjb25zdCBjaGFyKiAgbGF5ZXJOYW1lLCBpbnQgIHhsLCBpbnQgIHlsLCBpbnQgIHhoLCBpbnQgIHloLCBpbnQgIG1hc2spOwotCi0vKiBUaGlzIGlzIGEgNS42IHN5bnRheAotICogVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuICovCi0vKiBtYXNrIGlzIDUuOCBzeW50YXggKi8KLUVYVEVSTiBpbnQgZGVmd1ZpYVBvbHlnb24gKGNvbnN0IGNoYXIqICBsYXllck5hbWUsIGludCAgbnVtX3BvbHlzLCBkb3VibGUqICB4bCwgZG91YmxlKiAgeWwsIGludCAgbWFzayk7Ci0KLS8qIFRoZXNlIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgZGVmd1ZpYU5hbWUuCi0gKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGRlZndWaWFQYXR0ZXJuIGNhbiBiZSBjYWxsZWQgYWZ0ZXIgZWFjaAotICogZGVmd1ZpYU5hbWUgaXMgY2FsbGVkLgotICogVGhpcyBpcyBhIDUuNiBzeW50YXgKLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgZGVmd1ZpYU5hbWUgY2FsbGVkLiAqLwotRVhURVJOIGludCBkZWZ3VmlhVmlhcnVsZSAoY29uc3QgY2hhciogIHZpYVJ1bGVOYW1lLCBkb3VibGUgIHhDdXRTaXplLCBkb3VibGUgIHlDdXRTaXplLCBjb25zdCBjaGFyKiAgYm90TWV0YWxMYXllciwgY29uc3QgY2hhciogIGN1dExheWVyLCBjb25zdCBjaGFyKiAgdG9wTWV0YWxMYXllciwgZG91YmxlICB4Q3V0U3BhY2luZywgZG91YmxlICB5Q3V0U3BhY2luZywgZG91YmxlICB4Qm90RW5jLCBkb3VibGUgIHlCb3RFbmMsIGRvdWJsZSAgeFRvcEVuYywgZG91YmxlICB5VG9wRW5jKTsKLQotLyogVGhpcyByb3V0aW5lIGNhbiBjYWxsIG9ubHkgYWZ0ZXIgZGVmd1ZpYVZpYXJ1bGUuCi0gKiBJdCBjYW4gb25seSBiZSBjYWxsZWQgb25jZS4KLSAqIFRoaXMgaXMgYSA1LjYgc3ludGF4LgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICovCi1FWFRFUk4gaW50IGRlZndWaWFWaWFydWxlUm93Q29sIChpbnQgIG51bUN1dFJvd3MsIGludCAgbnVtQ3V0Q29scyk7Ci0KLS8qIFRoaXMgcm91dGluZSBjYW4gY2FsbCBvbmx5IGFmdGVyIGRlZndWaWFWaWFydWxlLgotICogSXQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuCi0gKiBUaGlzIGlzIGEgNS42IHN5bnRheC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAqLwotRVhURVJOIGludCBkZWZ3VmlhVmlhcnVsZU9yaWdpbiAoaW50ICB4T2Zmc2V0LCBpbnQgIHlPZmZzZXQpOwotCi0vKiBUaGlzIHJvdXRpbmUgY2FuIGNhbGwgb25seSBhZnRlciBkZWZ3VmlhVmlhcnVsZS4KLSAqIEl0IGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLgotICogVGhpcyBpcyBhIDUuNiBzeW50YXguCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gKi8KLUVYVEVSTiBpbnQgZGVmd1ZpYVZpYXJ1bGVPZmZzZXQgKGludCAgeEJvdE9mZnNldCwgaW50ICB5Qm90T2Zmc2V0LCBpbnQgIHhUb3BPZmZzZXQsIGludCAgeVRvcE9mZnNldCk7Ci0KLS8qIFRoaXMgcm91dGluZSBjYW4gY2FsbCBvbmx5IGFmdGVyIGRlZndWaWFWaWFydWxlLgotICogSXQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuCi0gKiBUaGlzIGlzIGEgNS42IHN5bnRheC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAqLwotRVhURVJOIGludCBkZWZ3VmlhVmlhcnVsZVBhdHRlcm4gKGNvbnN0IGNoYXIqICBjdXRQYXR0ZXJuKTsKLQotRVhURVJOIGludCBkZWZ3T25lVmlhRW5kICgpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGRlZndWaWEgY2FsbHMuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIElmIHRoZSBjb3VudCBpbiBTdGFydFZpYXMgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YKLSAqIGNhbGxzIHRvIFZpYSBvciBWaWFQYXR0ZXJuIHRoZW4gREVGV19CQURfREFUQSB3aWxsIHJldHVybiByZXR1cm5lZC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAqLwotRVhURVJOIGludCBkZWZ3RW5kVmlhcyAoKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHZpYSBzZWN0aW9uIChpZiBhbnkpLgotICogVGhpcyBzZWN0aW9uIG9mIHJvdXRpbmVzIGlzIG9wdGlvbmFsLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGUgcm91dGluZSBzdGFydHMgdGhlIHJlZ2lvbiBzZWN0aW9uLiAgIEFsbCBvZiB0aGUgcmVnaW9ucyBtdXN0IGZvbGxvdy4KLSAqIFRoZSBjb3VudCBpcyB0aGUgbnVtYmVyIG9mIGRlZndSZWdpb24gY2FsbHMgdG8gZm9sbG93LgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICovCi1FWFRFUk4gaW50IGRlZndTdGFydFJlZ2lvbnMgKGludCAgY291bnQpOwotCi0vKiBUaGlzIHJvdXRpbmUgZW50ZXIgZWFjaCByZWdpb24gaW50byB0aGUgZmlsZS4KLSAqIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgZGVmd1N0YXJ0UmVnaW9ucyBjYWxsLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG1hbnkgdGltZXMuICovCi1FWFRFUk4gaW50IGRlZndSZWdpb25OYW1lIChjb25zdCBjaGFyKiAgbmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBlbnRlciB0aGUgcmVnaW9uIHBvaW50IHRvIHRoZSByZWdpb24gbmFtZS4KLSAqIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgZGVmd1JlZ2lvbk5hbWUgY2FsbC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtYW55IHRpbWVzLiAqLwotRVhURVJOIGludCBkZWZ3UmVnaW9uUG9pbnRzIChpbnQgIHhsLCBpbnQgIHlsLCBpbnQgIHhoLCBpbnQgIHloKTsKLQotLyogVGhpcyByb3V0aW5lIGVudGVyIHRoZSByZWdpb24gdHlwZSwgRkVOQ0UgfCBHVUlERS4KLSAqIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgZGVmd1JlZ2lvbk5hbWUgY2FsbC4KLSAqIFRoaXMgaXMgYSA1LjQuMSBzeW50YXguCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAqLwotRVhURVJOIGludCBkZWZ3UmVnaW9uVHlwZSAoY29uc3QgY2hhciogIHR5cGUpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGRlZndSZWdpb24gY2FsbHMuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIElmIHRoZSBjb3VudCBpbiBTdGFydFJlZ2lvbnMgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YKLSAqIGNhbGxzIHRvIFJlZ2lvbiBvciBSZWdpb25QYXR0ZXJuIHRoZW4gREVGV19CQURfREFUQSB3aWxsIHJldHVybiByZXR1cm5lZC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAqLwotRVhURVJOIGludCBkZWZ3RW5kUmVnaW9ucyAoKTsKLQotLyogVGhpcyBpcyBhIDUuOCBzeW50YXguCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAqLwotRVhURVJOIGludCBkZWZ3Q29tcG9uZW50TWFza1NoaWZ0TGF5ZXJzIChjb25zdCBjaGFyKiogIGxheWVyTmFtZXMsIGludCAgICAgICAgICAgbnVtTGF5ZXJOYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSByZWdpb25zIHNlY3Rpb24gKGlmIGFueSkuCi0gKiBUaGlzIHNlY3Rpb24gb2Ygcm91dGluZXMgaXMgTk9UIG9wdGlvbmFsLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGUgcm91dGluZSBzdGFydHMgdGhlIGNvbXBvbmVudHMgc2VjdGlvbi4gQWxsIG9mIHRoZSBjb21wb25lbnRzCi0gKiBtdXN0IGZvbGxvdy4KLSAqIFRoZSBjb3VudCBpcyB0aGUgbnVtYmVyIG9mIGRlZndDb21wb25lbnQgY2FsbHMgdG8gZm9sbG93LgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICovCi1FWFRFUk4gaW50IGRlZndTdGFydENvbXBvbmVudHMgKGludCAgY291bnQpOwotCi0vKiBUaGlzIHJvdXRpbmUgZW50ZXIgZWFjaCBjb21wb25lbnQgaW50byB0aGUgZmlsZS4KLSAqIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgZGVmd1N0YXJ0Q29tcG9uZW50cyBjYWxsLgotICogVGhlIG9wdGlvbmFsIGZpZWxkcyB3aWxsIGJlIGlnbm9yZWQgaWYgdGhleSBhcmUgc2V0IHRvIHplcm8KLSAqIChleGNlcHQgZm9yIHdlaWdodCB3aGljaCBtdXN0IGJlIHNldCB0byAtMS4wKS4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtYW55IHRpbWVzLiAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVTRVIgfCBUSU1JTkcgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3JlaWdueCwgZm9yZWlnbnkgJiBvcmllbnRzICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIFBMQUNFRCB8IFVOUExBQ0VEICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHhoLCB5aCBvciByZWdpb24gICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBkZWZ3Q29tcG9uZW50IChjb25zdCBjaGFyKiAgaW5zdGFuY2UsIGNvbnN0IGNoYXIqICBtYXN0ZXIsIGludCAgICBudW1OZXROYW1lLCBjb25zdCBjaGFyKiogIG5ldE5hbWVzLCBjb25zdCBjaGFyKiAgZWVxLCBjb25zdCBjaGFyKiAgZ2VuTmFtZSwgY29uc3QgY2hhciogIGdlblBhcmVtZXRlcnMsIGNvbnN0IGNoYXIqICBzb3VyY2UsIGludCAgbnVtRm9yZWlnbiwgY29uc3QgY2hhcioqICBmb3JlaWducywgaW50KiAgZm9yZWlnblgsIGludCogIGZvcmVpZ25ZLCBpbnQqICBmb3JlaWduT3JpZW50cywgY29uc3QgY2hhciogIHN0YXR1cywgaW50ICBzdGF0dXNYLCBpbnQgIHN0YXR1c1ksIGludCAgc3RhdHVzT3JpZW50LCBkb3VibGUgIHdlaWdodCwgY29uc3QgY2hhciogIHJlZ2lvbiwgaW50ICB4bCwgaW50ICB5bCwgaW50ICB4aCwgaW50ICB5aCk7Ci0KLS8qIFRoaXMgcm91dGluZSBlbnRlciBlYWNoIGNvbXBvbmVudCBpbnRvIHRoZSBmaWxlLgotICogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBkZWZ3U3RhcnRDb21wb25lbnRzIGNhbGwuCi0gKiBUaGUgb3B0aW9uYWwgZmllbGRzIHdpbGwgYmUgaWdub3JlZCBpZiB0aGV5IGFyZSBzZXQgdG8gemVybwotICogKGV4Y2VwdCBmb3Igd2VpZ2h0IHdoaWNoIG11c3QgYmUgc2V0IHRvIC0xLjApLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG1hbnkgdGltZXMuIAotICogVGhpcyByb3V0aW5lIGlzIHRoZSBzYW1lIGFzIGRlZndDb21wb25lbnQsIGV4Y2VwdCBvcmllbnQgaXMgYSBjaGFyKiogKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVTRVIgfCBUSU1JTkcgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3JlaWdueCwgZm9yZWlnbnkgJiBvcmllbnRzICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUExBQ0VEIHwgVU5QTEFDRUQgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHhoLCB5aCBvciByZWdpb24gICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBkZWZ3Q29tcG9uZW50U3RyIChjb25zdCBjaGFyKiAgaW5zdGFuY2UsIGNvbnN0IGNoYXIqICBtYXN0ZXIsIGludCAgICBudW1OZXROYW1lLCBjb25zdCBjaGFyKiogIG5ldE5hbWVzLCBjb25zdCBjaGFyKiAgZWVxLCBjb25zdCBjaGFyKiAgZ2VuTmFtZSwgY29uc3QgY2hhciogIGdlblBhcmVtZXRlcnMsIGNvbnN0IGNoYXIqICBzb3VyY2UsIGludCAgbnVtRm9yZWlnbiwgY29uc3QgY2hhcioqICBmb3JlaWducywgaW50KiAgZm9yZWlnblgsIGludCogIGZvcmVpZ25ZLCBjb25zdCBjaGFyKiogIGZvcmVpZ25PcmllbnRzLCBjb25zdCBjaGFyKiAgc3RhdHVzLCBpbnQgIHN0YXR1c1gsIGludCAgc3RhdHVzWSwgY29uc3QgY2hhciogIHN0YXR1c09yaWVudCwgZG91YmxlICB3ZWlnaHQsIGNvbnN0IGNoYXIqICByZWdpb24sIGludCAgeGwsIGludCAgeWwsIGludCAgeGgsIGludCAgeWgpOwotCi0vKiBUaGlzIGlzIGEgNS44IHN5bnRheC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICovCi1FWFRFUk4gaW50IGRlZndDb21wb25lbnRNYXNrU2hpZnQgKGludCAgc2hpZnRMYXllck1hc2tzKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGVpdGhlciB0aGUgZGVmd0NvbXBvbmVudCBvcgotICogZGVmd0NvbXBvbmVudFN0ci4KLSAqIFRoaXMgcm91dGluZSBjYW4gb25seSBjYWxsZWQgb25jZSBwZXIgY29tcG9uZW50LgotICogRWl0aGVyIHRoaXMgcm91dGluZSBvciBkZWZ3Q29tcG9uZW50SGFsb1NvZnQgY2FuIGJlIGNhbGxlZCwgYnV0IG5vdCBib3RoCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0gKiBUaGlzIGlzIGEgNS42IHN5bnRheC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgKi8KLUVYVEVSTiBpbnQgZGVmd0NvbXBvbmVudEhhbG8gKGludCAgbGVmdCwgaW50ICBib3R0b20sIGludCAgcmlnaHQsIGludCAgdG9wKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGVpdGhlciB0aGUgZGVmd0NvbXBvbmVudCBvcgotICogZGVmd0NvbXBvbmVudFN0ci4KLSAqIFRoaXMgcm91dGluZSBjYW4gb25seSBjYWxsZWQgb25jZSBwZXIgY29tcG9uZW50LgotICogVGhpcyByb3V0aW5lIGlzIGp1c3QgbGlrZSBkZWZ3Q29tcG9uZW50SGFsbywgZXhjZXB0IGl0IHdyaXRlcyB0aGUgb3B0aW9uIFNPRlQKLSAqIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgZGVmd0NvbXBvbmVudEhhbG8gY2FuIGJlIGNhbGxlZCwgYnV0IG5vdCBib3RoCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0gKiBUaGlzIGlzIGEgNS43IHN5bnRheC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgKi8KLUVYVEVSTiBpbnQgZGVmd0NvbXBvbmVudEhhbG9Tb2Z0IChpbnQgIGxlZnQsIGludCAgYm90dG9tLCBpbnQgIHJpZ2h0LCBpbnQgIHRvcCk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBlaXRoZXIgdGhlIGRlZndDb21wb25lbnQgb3IKLSAqIGRlZndDb21wb25lbnRTdHIuCi0gKiBUaGlzIHJvdXRpbmUgY2FuIG9ubHkgY2FsbGVkIG9uY2UgcGVyIGNvbXBvbmVudC4KLSAqIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4KLSAqIFRoaXMgaXMgYSA1Ljcgc3ludGF4LgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAqLwotRVhURVJOIGludCBkZWZ3Q29tcG9uZW50Um91dGVIYWxvIChpbnQgIGhhbG9EaXN0LCBjb25zdCBjaGFyKiAgbWluTGF5ZXIsIGNvbnN0IGNoYXIqICBtYXhMYXllcik7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgZGVmd0NvbXBvbmVudCBjYWxscy4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogSWYgdGhlIGNvdW50IGluIFN0YXJ0Q29tcG9uZW50cyBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZgotICogY2FsbHMgdG8gQ29tcG9uZW50IHRoZW4gREVGV19CQURfREFUQSB3aWxsIHJldHVybiByZXR1cm5lZC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAqLwotRVhURVJOIGludCBkZWZ3RW5kQ29tcG9uZW50cyAoKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBjb21wb25lbnRzIHNlY3Rpb24gKGlmIGFueSkuCi0gKiBUaGlzIHNlY3Rpb24gb2Ygcm91dGluZXMgaXMgb3B0aW9uYWwuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIHN0YXJ0cyB0aGUgcGlucyBzZWN0aW9uLiBBbGwgb2YgdGhlIHBpbnMgbXVzdCBmb2xsb3cuCi0gKiBUaGUgY291bnQgaXMgdGhlIG51bWJlciBvZiBkZWZ3UGluIGNhbGxzIHRvIGZvbGxvdy4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAqLwotRVhURVJOIGludCBkZWZ3U3RhcnRQaW5zIChpbnQgIGNvdW50KTsKLQotLyogVGhpcyByb3V0aW5lIGVudGVyIGVhY2ggcGluIGludG8gdGhlIGZpbGUuCi0gKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGRlZndTdGFydFBpbnMgY2FsbC4KLSAqIFRoZSBvcHRpb25hbCBmaWVsZHMgd2lsbCBiZSBpZ25vcmVkIGlmIHRoZXkgYXJlIHNldCB0byB6ZXJvLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG1hbnkgdGltZXMuCi0gKiBOT1RFOiBVc2UgZGVmd1BpbkxheWVyIHRvIHdyaXRlIG91dCBsYXllciB3aXRoIFNQQUNJTkcgb3IgREVTSUdOUlVMRVdJRFRIICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElOT1VUIHwgRkVFRFRIUlUgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHUk9VTkQgfCBDTE9DSyB8IFRJRU9GRiB8IEFOQUxPRyAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ09WRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGRlZndQaW4gKGNvbnN0IGNoYXIqICBuYW1lLCBjb25zdCBjaGFyKiAgbmV0LCBpbnQgIHNwZWNpYWwsIGNvbnN0IGNoYXIqICBkaXJlY3Rpb24sIGNvbnN0IGNoYXIqICB1c2UsIGNvbnN0IGNoYXIqICBzdGF0dXMsIGludCAgc3RhdHVzWCwgaW50ICBzdGF0dXNZLCBpbnQgIG9yaWVudCwgY29uc3QgY2hhciogIGxheWVyLCBpbnQgIHhsLCBpbnQgIHlsLCBpbnQgIHhoLCBpbnQgIHloKTsKLQotLyogVGhpcyByb3V0aW5lIGVudGVyIGVhY2ggcGluIGludG8gdGhlIGZpbGUuCi0gKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGRlZndTdGFydFBpbnMgY2FsbC4KLSAqIFRoZSBvcHRpb25hbCBmaWVsZHMgd2lsbCBiZSBpZ25vcmVkIGlmIHRoZXkgYXJlIHNldCB0byB6ZXJvLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG1hbnkgdGltZXMuCi0gKiBUaGlzIHJvdXRpbmUgaXMgdGhlIHNhbWUgYXMgZGVmd1BpbiwgZXhjZXB0IG9yaWVudCBpcyBhIGNoYXIqCi0gKiBOT1RFOiBVc2UgZGVmd1BpbkxheWVyIHRvIHdyaXRlIG91dCBsYXllciB3aXRoIFNQQUNJTkcgb3IgREVTSUdOUlVMRVdJRFRIICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElOT1VUIHwgRkVFRFRIUlUgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHUk9VTkQgfCBDTE9DSyB8IFRJRU9GRiB8IEFOQUxPRyAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ09WRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGRlZndQaW5TdHIgKGNvbnN0IGNoYXIqICBuYW1lLCBjb25zdCBjaGFyKiAgbmV0LCBpbnQgIHNwZWNpYWwsIGNvbnN0IGNoYXIqICBkaXJlY3Rpb24sIGNvbnN0IGNoYXIqICB1c2UsIGNvbnN0IGNoYXIqICBzdGF0dXMsIGludCAgc3RhdHVzWCwgaW50ICBzdGF0dXNZLCBjb25zdCBjaGFyKiAgb3JpZW50LCBjb25zdCBjaGFyKiAgbGF5ZXIsIGludCAgeGwsIGludCAgeWwsIGludCAgeGgsIGludCAgeWgpOwotCi0vKiBUaGlzIHJvdXRpbmUgc2hvdWxkIGJlIGNhbGxlZCBpZiB0aGUgbGF5ZXIgaGFzIGVpdGhlciBTUEFDSU5HIG9yCi0gKiBERVNJR05SVUxFV0lEVEguICBJZiB0aGlzIHJvdXRpbmUgaXMgdXNlZCBhbmQgdGhlIHBpbiBoYXMgb25seSBvbmUKLSAqIGxheWVyLCB0aGUgbGF5ZXIgaW4gZGVmd1BpbiBvciBkZWZ3UGluU3RyIGhhcyB0byBiZSBudWxsLCBvdGhlcndpc2UKLSAqIHRoZSBsYXllciB3aWxsIGJlIHdyaXR0ZW4gb3V0IHR3aWNlLgotICogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGRlZndQaW4gb3IgZGVmd1BpblN0ci4KLSAqIFRoaXMgaXMgYSA1LjYgc3ludGF4LgotICogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gYSBwaW4uICovCi1FWFRFUk4gaW50IGRlZndQaW5MYXllciAoY29uc3QgY2hhciogIGxheWVyTmFtZSwgaW50ICBzcGFjaW5nLCBpbnQgIGRlc2lnblJ1bGVXaWR0aCwgaW50ICB4bCwgaW50ICB5bCwgaW50ICB4aCwgaW50ICB5aCwgaW50ICBtYXNrKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGRlZndQaW4gb3IgZGVmd1BpblN0ci4KLSAqIFRoaXMgcm91dGluZSBpcyB0byB3cml0ZSBvdXQgbGF5ZXIgd2l0aCBwb2x5Z29uLgotICogVGhpcyBpcyBhIDUuNiBzeW50YXguCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgcGluLiAqLwotRVhURVJOIGludCBkZWZ3UGluUG9seWdvbiAoY29uc3QgY2hhciogIGxheWVyTmFtZSwgaW50ICBzcGFjaW5nLCBpbnQgIGRlc2lnblJ1bGVXaWR0aCwgaW50ICBudW1fcG9seXMsIGRvdWJsZSogIHhsLCBkb3VibGUqICB5bCwgaW50ICBtYXNrKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGRlZndQaW4gb3IgZGVmd1BpblN0ci4KLSAqIFRoaXMgcm91dGluZSBpcyB0byB3cml0ZSBvdXQgbGF5ZXIgd2l0aCB2aWEuCi0gKiBUaGlzIGlzIGEgNS43IHN5bnRheC4KLSAqIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gYSBwaW4uICovCi1FWFRFUk4gaW50IGRlZndQaW5WaWEgKGNvbnN0IGNoYXIqICB2aWFOYW1lLCBpbnQgIHhsLCBpbnQgIHlsLCBpbnQgIG1hc2spOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgZGVmd1BpbiBvciBkZWZ3UGluU3RyLgotICogVGhpcyByb3V0aW5lIGlzIHRvIHdyaXRlIG91dCBwaW4gd2l0aCBwb3J0LgotICogVGhpcyBpcyBhIDUuNyBzeW50YXguCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgcGluLiAqLwotRVhURVJOIGludCBkZWZ3UGluUG9ydCAoKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBkZWZ3UGluUG9ydC4gCi0gKiBUaGlzIGlzIGEgNS43IHN5bnRheC4KLSAqIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgcGluLiAqLwotRVhURVJOIGludCBkZWZ3UGluUG9ydExheWVyIChjb25zdCBjaGFyKiAgbGF5ZXJOYW1lLCBpbnQgIHNwYWNpbmcsIGludCAgZGVzaWduUnVsZVdpZHRoLCBpbnQgIHhsLCBpbnQgIHlsLCBpbnQgIHhoLCBpbnQgIHloLCBpbnQgIG1hc2spOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgZGVmd1BpblBvcnQuCi0gKiBUaGlzIGlzIGEgNS43IHN5bnRheC4KLSAqIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gYSBwaW4uICovCi1FWFRFUk4gaW50IGRlZndQaW5Qb3J0UG9seWdvbiAoY29uc3QgY2hhciogIGxheWVyTmFtZSwgaW50ICBzcGFjaW5nLCBpbnQgIGRlc2lnblJ1bGVXaWR0aCwgaW50ICBudW1fcG9seXMsIGRvdWJsZSogIHhsLCBkb3VibGUqICB5bCwgaW50ICBtYXNrKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGRlZndQaW5Qb3J0LgotICogVGhpcyBpcyBhIDUuNyBzeW50YXguCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgcGluLiAqLwotRVhURVJOIGludCBkZWZ3UGluUG9ydFZpYSAoY29uc3QgY2hhciogIHZpYU5hbWUsIGludCAgeGwsIGludCAgeWwsIGludCAgbWFzayk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBkZWZ3UGluUG9ydC4KLSAqIFRoaXMgaXMgYSA1Ljcgc3ludGF4LgotICogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG1hbnkgdGltZXMuCi0gKiBOT1RFOiBVc2UgZGVmd1BpbkxheWVyIHRvIHdyaXRlIG91dCBsYXllciB3aXRoIFNQQUNJTkcgb3IgREVTSUdOUlVMRVdJRFRIICovCi1FWFRFUk4gaW50IGRlZndQaW5Qb3J0TG9jYXRpb24gKGNvbnN0IGNoYXIqICBzdGF0dXMsIGludCAgc3RhdHVzWCwgaW50ICBzdGF0dXNZLCBjb25zdCBjaGFyKiAgb3JpZW50KTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGRlZndQaW4uCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoaXMgaXMgYSA1LjYgc3ludGF4LgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UgcGVyIHBpbi4gKi8KLUVYVEVSTiBpbnQgZGVmd1Bpbk5ldEV4cHIgKGNvbnN0IGNoYXIqICBwaW5FeHByKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGRlZndQaW4uCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoaXMgaXMgYSA1LjYgc3ludGF4LgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UgcGVyIHBpbi4gKi8KLUVYVEVSTiBpbnQgZGVmd1BpblN1cHBseVNlbnNpdGl2aXR5IChjb25zdCBjaGFyKiAgcGluTmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBkZWZ3UGluLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGlzIGlzIGEgNS42IHN5bnRheC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBwaW4uICovCi1FWFRFUk4gaW50IGRlZndQaW5Hcm91bmRTZW5zaXRpdml0eSAoY29uc3QgY2hhciogIHBpbk5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgZGVmd1Bpbi4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhpcyBpcyBhIDUuNCBzeW50YXguCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAqLwotRVhURVJOIGludCBkZWZ3UGluQW50ZW5uYVBpblBhcnRpYWxNZXRhbEFyZWEgKGludCAgdmFsdWUsIGNvbnN0IGNoYXIqICBsYXllck5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgZGVmd1Bpbi4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhpcyBpcyBhIDUuNCBzeW50YXguCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAqLwotRVhURVJOIGludCBkZWZ3UGluQW50ZW5uYVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhIChpbnQgIHZhbHVlLCBjb25zdCBjaGFyKiAgbGF5ZXJOYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGRlZndQaW4uCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoaXMgaXMgYSA1LjQgc3ludGF4LgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gKi8KLUVYVEVSTiBpbnQgZGVmd1BpbkFudGVubmFQaW5QYXJ0aWFsQ3V0QXJlYSAoaW50ICB2YWx1ZSwgY29uc3QgY2hhciogIGxheWVyTmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBkZWZ3UGluLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGlzIGlzIGEgNS40IHN5bnRheC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuICovCi1FWFRFUk4gaW50IGRlZndQaW5BbnRlbm5hUGluRGlmZkFyZWEgKGludCAgdmFsdWUsIGNvbnN0IGNoYXIqICBsYXllck5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgZGVmd1Bpbi4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhpcyBpcyBhIDUuNSBzeW50YXguCi0gKiBUaGUgb3hpZGUgY2FuIGJlIGVpdGhlciBPWElERTEsIE9YSURFMiwgT1hJREUzLCBvciBPWElERTQuCi0gKiBFYWNoIG94aWRlIHZhbHVlIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGRlZndQaW4uICovCi1FWFRFUk4gaW50IGRlZndQaW5BbnRlbm5hTW9kZWwgKGNvbnN0IGNoYXIqICBveGlkZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBkZWZ3UGluLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGlzIGlzIGEgNS40IHN5bnRheC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuICovCi1FWFRFUk4gaW50IGRlZndQaW5BbnRlbm5hUGluR2F0ZUFyZWEgKGludCAgdmFsdWUsIGNvbnN0IGNoYXIqICBsYXllck5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgZGVmd1Bpbi4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhpcyBpcyBhIDUuNCBzeW50YXguCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAqLwotRVhURVJOIGludCBkZWZ3UGluQW50ZW5uYVBpbk1heEFyZWFDYXIgKGludCAgdmFsdWUsIGNvbnN0IGNoYXIqICBsYXllck5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgZGVmd1Bpbi4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhpcyBpcyBhIDUuNCBzeW50YXguCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAqLwotRVhURVJOIGludCBkZWZ3UGluQW50ZW5uYVBpbk1heFNpZGVBcmVhQ2FyIChpbnQgIHZhbHVlLCBjb25zdCBjaGFyKiAgbGF5ZXJOYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGRlZndQaW4uCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoaXMgaXMgYSA1LjQgc3ludGF4LgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gKi8KLUVYVEVSTiBpbnQgZGVmd1BpbkFudGVubmFQaW5NYXhDdXRDYXIgKGludCAgdmFsdWUsIGNvbnN0IGNoYXIqICBsYXllck5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGRlZndQaW4gY2FsbHMuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIElmIHRoZSBjb3VudCBpbiBTdGFydFBpbnMgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YKLSAqIGNhbGxzIHRvIFBpbiB0aGVuIERFRldfQkFEX0RBVEEgd2lsbCByZXR1cm4gcmV0dXJuZWQuCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gKi8KLUVYVEVSTiBpbnQgZGVmd0VuZFBpbnMgKCk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgcGluIHNlY3Rpb24gKGlmIGFueSkuCi0gKiBUaGlzIHNlY3Rpb24gb2Ygcm91dGluZXMgaXMgb3B0aW9uYWwuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIHN0YXJ0cyB0aGUgcGlucHJvcGVydGllcyBzZWN0aW9uLiBBbGwgb2YgdGhlIHBpbnByb3BlcnRpZXMKLSAqIG11c3QgZm9sbG93LgotICogVGhlIGNvdW50IGlzIHRoZSBudW1iZXIgb2YgZGVmd1BpblByb3AgY2FsbHMgdG8gZm9sbG93LgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICovCi1FWFRFUk4gaW50IGRlZndTdGFydFBpblByb3BlcnRpZXMgKGludCAgY291bnQpOwotCi0vKiBUaGlzIHJvdXRpbmUgZW50ZXIgZWFjaCBwaW5wcm9wZXJ0eSBpbnRvIHRoZSBmaWxlLgotICogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBkZWZ3U3RhcnRQaW5Qcm9wZXJ0aWVzIGNhbGwuCi0gKiBUaGUgb3B0aW9uYWwgZmllbGRzIHdpbGwgYmUgaWdub3JlZCBpZiB0aGV5IGFyZSBzZXQgdG8gemVyby4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtYW55IHRpbWVzLiAqLwotRVhURVJOIGludCBkZWZ3UGluUHJvcGVydHkgKGNvbnN0IGNoYXIqICBuYW1lLCBjb25zdCBjaGFyKiAgcGluTmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgZGVmd1BpblByb3BlcnR5IGNhbGxzLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBJZiB0aGUgY291bnQgaW4gU3RhcnRQaW5zIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mCi0gKiBjYWxscyB0byBQaW4gdGhlbiBERUZXX0JBRF9EQVRBIHdpbGwgcmV0dXJuIHJldHVybmVkLgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICovCi1FWFRFUk4gaW50IGRlZndFbmRQaW5Qcm9wZXJ0aWVzICgpOwotCi0vKiBSb3V0aW5lcyB0byBlbnRlciBhIHNwZWNpYWwgbmV0IG9yIG5ldHMgaW50byB0aGUgZmlsZS4KLSAqIFlvdSBtdXN0IGZpcnN0IGNhbGwgZGVmd1N0YXJ0U3BlY2lhbE5ldHMgd2l0aCB0aGUgbnVtYmVyIG9mCi0gKiBuZXRzLiBUaGlzIHNlY3Rpb24gaXMgcmVxdWlyZWQsIGV2ZW4gaWYgeW91IGRvIG5vdCBoYXZlIGFueSBuZXRzLgotICogRm9yIGVhY2ggbmV0IHlvdSBzaG91bGQgY2FsbCBkZWZ3U3BlY2lhbE5ldCBmb2xsb3dlZCBieQotICogb25lIG9yIG1vcmUgZGVmd1NwZWNpYWxOZXRDb25uZWN0aW9uIGNhbGxzLgotICogQWZ0ZXIgdGhlIGNvbm5lY3Rpb25zIGNvbWUgdGhlIG9wdGlvbnMuICBPcHRpb25zIGFyZQotICogTk9UIHJlcXVpcmVkLgotICogRWFjaCBuZXQgaXMgY29tcGxldGVkIGJ5IGNhbGxpbmcgZGVmd1NwZWNpYWxOZXRFbmRPbmVOZXQoKS4KLSAqIFRoZSBuZXRzIHNlY3Rpb24gaXMgZmluaXNoZWQgYnkgY2FsbGluZyBkZWZ3RW5kTmV0cygpLiAqLwotRVhURVJOIGludCBkZWZ3U3RhcnRTcGVjaWFsTmV0cyAoaW50ICBjb3VudCk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgZGVmd1N0YXJ0U3BlY2lhbE5ldHMgaXQgaXMgZm9yCi0gKiAtIG5ldE5hbWUgKi8KLUVYVEVSTiBpbnQgZGVmd1NwZWNpYWxOZXQgKGNvbnN0IGNoYXIqICBuYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciBjb21wTmFtZVJlZ0V4cHIsIHBpbk5hbWUsIGFuZCBTWU5USEVTSVpFRCAqLwotLyogSXQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyAqLwotRVhURVJOIGludCBkZWZ3U3BlY2lhbE5ldENvbm5lY3Rpb24gKGNvbnN0IGNoYXIqICBpbnN0LCBjb25zdCBjaGFyKiAgcGluLCBpbnQgIHN5bnRoZXNpemVkKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciArIEZJWEVEQlVNUAotICogVGhpcyBpcyBhIDUuNC4xIHN5bnRheCAqLwotRVhURVJOIGludCBkZWZ3U3BlY2lhbE5ldEZpeGVkYnVtcCAoKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciArIFZPTFRBR0Ugdm9sdHMgKi8KLUVYVEVSTiBpbnQgZGVmd1NwZWNpYWxOZXRWb2x0YWdlIChkb3VibGUgIHYpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yICsgU1BBQ0lORyBsYXllck5hbWUgc3BhY2luZyBbUkFOR0UgbWlud2lkdGggbWF4d2lkdGggKi8KLUVYVEVSTiBpbnQgZGVmd1NwZWNpYWxOZXRTcGFjaW5nIChjb25zdCBjaGFyKiAgbGF5ZXIsIGludCAgc3BhY2luZywgZG91YmxlICBtaW53aWR0aCwgZG91YmxlICBtYXh3aWR0aCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgKyBXSURUSCBsYXllck5hbWUgd2lkdGggKi8KLUVYVEVSTiBpbnQgZGVmd1NwZWNpYWxOZXRXaWR0aCAoY29uc3QgY2hhciogIGxheWVyLCBpbnQgIHdpZHRoKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciArIFNPVVJDRSB7TkVUTElTVCB8IERJU1QgfCBVU0VSIHwgVElNSU5HfSAqLwotRVhURVJOIGludCBkZWZ3U3BlY2lhbE5ldFNvdXJjZSAoY29uc3QgY2hhciogIG5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yICsgT1JJR0lOQUwgbmV0TmFtZSAqLwotRVhURVJOIGludCBkZWZ3U3BlY2lhbE5ldE9yaWdpbmFsIChjb25zdCBjaGFyKiAgbmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgKyBQQVRURVJOIHtTVEVJTkVSIHwgQkFMQU5DRUQgfCBXSVJFRExPR0lDIHwgVFJVTkt9ICovCi1FWFRFUk4gaW50IGRlZndTcGVjaWFsTmV0UGF0dGVybiAoY29uc3QgY2hhciogIG5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yICsgVVNFIHtTSUdOQUwgfCBQT1dFUiB8IEdST1VORCB8IENMT0NLIHwgVElFT0ZGIHwKLSAgIEFOQUxPRyB8IFNDQU4gfCBSRVNFVH0gKi8KLUVYVEVSTiBpbnQgZGVmd1NwZWNpYWxOZXRVc2UgKGNvbnN0IGNoYXIqICBuYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciArIFdFSUdIVCB3ZWlnaHQgKi8KLUVYVEVSTiBpbnQgZGVmd1NwZWNpYWxOZXRXZWlnaHQgKGRvdWJsZSAgdmFsdWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yICsgRVNUQ0FQIHdpcmVDYXBhY2l0YW5jZSAqLwotRVhURVJOIGludCBkZWZ3U3BlY2lhbE5ldEVzdENhcCAoZG91YmxlICB2YWx1ZSk7Ci0KLS8qIFBhdGhzIGFyZSBhIHNwZWNpYWwgdHlwZSBvZiBvcHRpb24uICBBIHBhdGggbXVzdCBiZWdpbgotICogd2l0aCBhIGRlZndTcGVjaWFsTmV0UGF0aFN0YXJ0IGFuZCBlbmQgd2l0aCBhIGRlZndTcGVjaWFsTmV0UGF0aEVuZCgpLgotICogVGhlIGluZGl2aWR1YWwgcGFydHMgb2YgdGhlIHBhdGggY2FuIGJlIGVudGVyZWQgaW4KLSAqIGFueSBvcmRlci4gKi8KLUVYVEVSTiBpbnQgZGVmd1NwZWNpYWxOZXRQYXRoU3RhcnQgKGNvbnN0IGNoYXIqICB0eXApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTSElFTEQgfCBORVcgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgZGVmd1NwZWNpYWxOZXRTaGllbGROZXROYW1lIChjb25zdCBjaGFyKiAgbmFtZSk7Ci0KLUVYVEVSTiBpbnQgZGVmd1NwZWNpYWxOZXRQYXRoTGF5ZXIgKGNvbnN0IGNoYXIqICBuYW1lKTsKLQotRVhURVJOIGludCBkZWZ3U3BlY2lhbE5ldFBhdGhXaWR0aCAoaW50ICB3aWR0aCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4KLSAqIFRoaXMgaXMgYSA1LjYgc3ludGF4LiAqLwotRVhURVJOIGludCBkZWZ3U3BlY2lhbE5ldFBhdGhTdHlsZSAoaW50ICBzdHlsZU51bSk7Ci0KLUVYVEVSTiBpbnQgZGVmd1NwZWNpYWxOZXRQYXRoU2hhcGUgKGNvbnN0IGNoYXIqICBzaGFwZVR5cGUpOwotICAgICAgICAvKiBGT0xMT1dQSU4gfCBJT1dJUkUgfCBDT1JFV0lSRSB8IEJMT0NLV0lSRSB8IEZJTExXSVJFIHwgQkxPQ0tBR0VXSVIgKi8KLQotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLgotICAgVGhpcyBpcyBhIDUuOCBzeW50YXguCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gKi8KLUVYVEVSTiBpbnQgZGVmd1NwZWNpYWxOZXRQYXRoTWFzayAoaW50ICBjb2xvck1hc2spOwotCi0vKiB4IGFuZCB5IGxvY2F0aW9uIG9mIHRoZSBwYXRoICovCi1FWFRFUk4gaW50IGRlZndTcGVjaWFsTmV0UGF0aFBvaW50IChpbnQgIG51bVB0cywgZG91YmxlKiAgcG9pbnR4LCBkb3VibGUqICBwb2ludHkpOwotRVhURVJOIGludCBkZWZ3U3BlY2lhbE5ldFBhdGhWaWEgKGNvbnN0IGNoYXIqICBuYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBkZWZ3U3BlY2lhbE5ldFBhdGgKLSAqIFRoaXMgaXMgYSA1LjQuMSBzeW50YXggKi8KLUVYVEVSTiBpbnQgZGVmd1NwZWNpYWxOZXRQYXRoVmlhRGF0YSAoaW50ICBudW1YLCBpbnQgIG51bVksIGludCAgc3RlcFgsIGludCAgc3RlcFkpOwotCi0vKiB4IGFuZCB5IGxvY2F0aW9uIG9mIHRoZSBwYXRoICovCi1FWFRFUk4gaW50IGRlZndTcGVjaWFsTmV0UGF0aFBvaW50V2l0aFdpcmVFeHQgKGludCAgbnVtUHRzLCBkb3VibGUqICBwb2ludHgsIGRvdWJsZSogIHBvaW50eSwgZG91YmxlKiAgb3B0VmFsdWUpOwotCi1FWFRFUk4gaW50IGRlZndTcGVjaWFsTmV0UGF0aEVuZCAoKTsKLQotLyogVGhpcyBpcyBhIDUuNiBzeW50YXgKLSAqIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAqLwotRVhURVJOIGludCBkZWZ3U3BlY2lhbE5ldFBvbHlnb24gKGNvbnN0IGNoYXIqICBsYXllck5hbWUsIGludCAgbnVtX3BvbHlzLCBkb3VibGUqICB4bCwgZG91YmxlKiAgeWwpOwotCi0vKiBUaGlzIGlzIGEgNS42IHN5bnRheAotICogVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuICovCi1FWFRFUk4gaW50IGRlZndTcGVjaWFsTmV0UmVjdCAoY29uc3QgY2hhciogIGxheWVyTmFtZSwgaW50ICB4bCwgaW50ICB5bCwgaW50ICB4aCwgaW50ICB5aCk7Ci0KLUVYVEVSTiBpbnQgZGVmd1NwZWNpYWxOZXRWaWEgKGNvbnN0IGNoYXIqICBsYXllck5hbWUpOwotCi1FWFRFUk4gaW50IGRlZndTcGVjaWFsTmV0VmlhV2l0aE9yaWVudCAoY29uc3QgY2hhciogIGxheWVyTmFtZSwgaW50ICBvcmllbnQpOwotCi1FWFRFUk4gaW50IGRlZndTcGVjaWFsTmV0VmlhUG9pbnRzIChpbnQgIG51bV9wb2ludHMsIGRvdWJsZSogIHhsLCBkb3VibGUqICB5bCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYXQgdGhlIGVuZCBvZiBlYWNoIG5ldCAqLwotRVhURVJOIGludCBkZWZ3U3BlY2lhbE5ldEVuZE9uZU5ldCAoKTsKLQotLyogNS4zIGZvciBzcGVjaWFsIG5ldCAqLwotLyogU2hpZWxkcyBhcmUgYSBzcGVjaWFsIHR5cGUgb2Ygb3B0aW9uLiAgQSBzaGllbGQgbXVzdCBiZWdpbgotICogd2l0aCBhIGRlZndTcGVjaWFsTmV0U2hpZWxkU3RhcnQgYW5kIGVuZCB3aXRoIGEgZGVmd1NwZWNpYWxOZXRTaGllbGRFbmQoKS4KLSAqIFRoZSBpbmRpdmlkdWFsIHBhcnRzIG9mIHRoZSBzaGllbGQgY2FuIGJlIGVudGVyZWQgaW4KLSAqIGFueSBvcmRlci4gKi8KLUVYVEVSTiBpbnQgZGVmd1NwZWNpYWxOZXRTaGllbGRTdGFydCAoY29uc3QgY2hhciogIG5hbWUpOwotCi1FWFRFUk4gaW50IGRlZndTcGVjaWFsTmV0U2hpZWxkTGF5ZXIgKGNvbnN0IGNoYXIqICBuYW1lKTsKLUVYVEVSTiBpbnQgZGVmd1NwZWNpYWxOZXRTaGllbGRXaWR0aCAoaW50ICB3aWR0aCk7Ci1FWFRFUk4gaW50IGRlZndTcGVjaWFsTmV0U2hpZWxkU2hhcGUgKGNvbnN0IGNoYXIqICBzaGFwZVR5cGUpOwotICAgICAgICAvKiBGT0xMT1dQSU4gfCBJT1dJUkUgfCBDT1JFV0lSRSB8IEJMT0NLV0lSRSB8IEZJTExXSVJFIHwgQkxPQ0tBR0VXSVIgKi8KLQotLyogeCBhbmQgeSBsb2NhdGlvbiBvZiB0aGUgcGF0aCAqLwotRVhURVJOIGludCBkZWZ3U3BlY2lhbE5ldFNoaWVsZFBvaW50IChpbnQgIG51bVB0cywgZG91YmxlKiAgcG9pbnR4LCBkb3VibGUqICBwb2ludHkpOwotRVhURVJOIGludCBkZWZ3U3BlY2lhbE5ldFNoaWVsZFZpYSAoY29uc3QgY2hhciogIG5hbWUpOwotCi0vKiBBIDUuNC4xIHN5bnRheCAqLwotRVhURVJOIGludCBkZWZ3U3BlY2lhbE5ldFNoaWVsZFZpYURhdGEgKGludCAgbnVtWCwgaW50ICBudW1ZLCBpbnQgIHN0ZXBYLCBpbnQgIHN0ZXBZKTsKLUVYVEVSTiBpbnQgZGVmd1NwZWNpYWxOZXRTaGllbGRFbmQgKCk7Ci0vKiBlbmQgNS4zICovCi0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgc3BlY2lhbCBuZXQgc2VjdGlvbiAqLwotRVhURVJOIGludCBkZWZ3RW5kU3BlY2lhbE5ldHMgKCk7Ci0KLS8qIFJvdXRpbmVzIHRvIGVudGVyIGEgbmV0IG9yIG5ldHMgaW50byB0aGUgZmlsZS4KLSAqIFlvdSBtdXN0IGZpcnN0IGNhbGwgZGVmd05ldHMgd2l0aCB0aGUgbnVtYmVyIG9mIG5ldHMuCi0gKiBUaGlzIHNlY3Rpb24gaXMgcmVxdWlyZWQsIGV2ZW4gaWYgeW91IGRvIG5vdCBoYXZlIGFueSBuZXRzLgotICogRm9yIGVhY2ggbmV0IHlvdSBzaG91bGQgY2FsbCBkZWZ3TmV0IGZvbGxvd2VkIGJ5IG9uZSBvcgotICogbW9yZSBkZWZ3TmV0Q29ubmVjdGlvbiBjYWxscy4KLSAqIEFmdGVyIHRoZSBjb25uZWN0aW9ucyBjb21lIHRoZSBvcHRpb25zLiAgT3B0aW9ucyBhcmUKLSAqIE5PVCByZXF1aXJlZC4KLSAqIEVhY2ggbmV0IGlzIGNvbXBsZXRlZCBieSBjYWxsaW5nIGRlZndOZXRFbmRPbmVOZXQoKS4KLSAqIFRoZSBuZXRzIHNlY3Rpb24gaXMgZmluaXNoZWQgYnkgY2FsbGluZyBkZWZ3RW5kTmV0cygpLiAqLwotRVhURVJOIGludCBkZWZ3U3RhcnROZXRzIChpbnQgIGNvdW50KTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBkZWZ3U3RhcnROZXRzLCBpdCBpcyBmb3IgLSBuZXROYW1lICovCi1FWFRFUk4gaW50IGRlZndOZXQgKGNvbnN0IGNoYXIqICBuYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciB7IGNvbXBOYW1lIHwgUElOIH0gcGluTmFtZSBbKyBTWU5USEVTSVpFRF0gKi8KLS8qIEl0IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgKi8KLUVYVEVSTiBpbnQgZGVmd05ldENvbm5lY3Rpb24gKGNvbnN0IGNoYXIqICBpbnN0LCBjb25zdCBjaGFyKiAgcGluLCBpbnQgIHN5bnRoZXNpemVkKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciBNVVNUSk9JTiwgY29tcE5hbWUsIHBpbk5hbWUgKi8KLUVYVEVSTiBpbnQgZGVmd05ldE11c3Rqb2luQ29ubmVjdGlvbiAoY29uc3QgY2hhciogIGluc3QsIGNvbnN0IGNoYXIqICBwaW4pOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yICsgVlBJTiB2cGluTmFtZSBbTEFZRVIgbGF5ZXJOYW1lIHB0IHB0Ci0gKiBbeyBQTEFDRUQgfCBGSVhFRCB8IENPVkVSIH0gcHQgb3JpZW50XSAqLwotRVhURVJOIGludCBkZWZ3TmV0VnBpbiAoY29uc3QgY2hhciogIHZwaW5OYW1lLCBjb25zdCBjaGFyKiAgbGF5ZXJOYW1lLCBpbnQgIGxheWVyWGwsIGludCAgbGF5ZXJZbCwgaW50ICBsYXllclhoLCBpbnQgIGxheWVyWWgsIGNvbnN0IGNoYXIqICBzdGF0dXMsIGludCAgc3RhdHVzWCwgaW50ICBzdGF0dXNZLCBpbnQgIG9yaWVudCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgKyBWUElOIHZwaW5OYW1lIFtMQVlFUiBsYXllck5hbWUgcHQgcHQKLSAqIFt7IFBMQUNFRCB8IEZJWEVEIHwgQ09WRVIgfSBwdCBvcmllbnRdCi0gKiBUaGlzIHJvdXRpbmUgaXMgdGhlIHNhbWUgYXMgZGVmd05ldFZwaW4sIGV4Y2VwdCBvcmllbnQgaXMgYSBjaGFyKiAqLwotRVhURVJOIGludCBkZWZ3TmV0VnBpblN0ciAoY29uc3QgY2hhciogIHZwaW5OYW1lLCBjb25zdCBjaGFyKiAgbGF5ZXJOYW1lLCBpbnQgIGxheWVyWGwsIGludCAgbGF5ZXJZbCwgaW50ICBsYXllclhoLCBpbnQgIGxheWVyWWgsIGNvbnN0IGNoYXIqICBzdGF0dXMsIGludCAgc3RhdHVzWCwgaW50ICBzdGF0dXNZLCBjb25zdCBjaGFyKiAgb3JpZW50KTsKLQotLyogVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgZWl0aGVyIHdpdGhpbiBuZXQgb3Igc3VibmV0LgotICogaXQgaXMgZm9yIE5PTkRFRkFVTFRSVUxFIHJ1bGVuYW1lICovCi1FWFRFUk4gaW50IGRlZndOZXROb25kZWZhdWx0UnVsZSAoY29uc3QgY2hhciogIG5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yICsgWFRBTEsgbnVtICovCi1FWFRFUk4gaW50IGRlZndOZXRYdGFsayAoaW50ICB4dGFsayk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgKyBGSVhFREJVTVAKLSAqIFRoaXMgaXMgYSA1LjQuMSBzeW50YXggKi8KLUVYVEVSTiBpbnQgZGVmd05ldEZpeGVkYnVtcCAoKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciArIEZSRVFVRU5DWQotICogVGhpcyBpcyBhIDUuNC4xIHN5bnRheCAqLwotRVhURVJOIGludCBkZWZ3TmV0RnJlcXVlbmN5IChkb3VibGUgIGZyZXF1ZW5jeSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgKyBTT1VSQ0Uge05FVExJU1QgfCBESVNUIHwgVVNFUiB8IFRFU1QgfCBUSU1JTkd9ICovCi1FWFRFUk4gaW50IGRlZndOZXRTb3VyY2UgKGNvbnN0IGNoYXIqICBuYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciArIE9SSUdJTkFMIG5ldG5hbWUgKi8KLUVYVEVSTiBpbnQgZGVmd05ldE9yaWdpbmFsIChjb25zdCBjaGFyKiAgbmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgKyBVU0Uge1NJR05BTCB8IFBPV0VSIHwgR1JPVU5EIHwgQ0xPQ0sgfCBUSUVPRkYgfCAKLSAqIEFOQUxPR30gKi8KLUVYVEVSTiBpbnQgZGVmd05ldFVzZSAoY29uc3QgY2hhciogIG5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yICsgUEFUVEVSTiB7U1RFSU5FUiB8IEJBTEFOQ0VEIHwgV0lSRURMT0dJQ30gKi8KLUVYVEVSTiBpbnQgZGVmd05ldFBhdHRlcm4gKGNvbnN0IGNoYXIqICBuYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciArIEVTVENBUCB3aXJlQ2FwYWNpdGFuY2UgKi8KLUVYVEVSTiBpbnQgZGVmd05ldEVzdENhcCAoZG91YmxlICB2YWx1ZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgKyBXRUlHSFQgd2VpZ2h0ICovCi1FWFRFUk4gaW50IGRlZndOZXRXZWlnaHQgKGRvdWJsZSAgdmFsdWUpOwotCi0vKiA1LjMgZm9yIG5ldCAqLwotLyogVGhpcyByb3V0aW5lIGlzIGZvciArIFNISUVMRE5FVCB3ZWlnaHQgKi8KLUVYVEVSTiBpbnQgZGVmd05ldFNoaWVsZG5ldCAoY29uc3QgY2hhciogIG5hbWUpOwotCi0vKiBOb3NoaWVsZCBhcmUgYSBzcGVjaWFsIHR5cGUgb2Ygb3B0aW9uLiAgQSBub3NoaWVsZCBtdXN0IGJlZ2luCi0gKiB3aXRoIGEgZGVmd05ldE5vc2hpZWxkU3RhcnQgYW5kIGVuZCB3aXRoIGEgZGVmd05ldE5vc2hpZWxkRW5kKCkuCi0gKiBUaGUgaW5kaXZpZHVhbCBwYXJ0cyBvZiB0aGUgbm9zaGllbGQgY2FuIGJlIGVudGVyZWQgaW4KLSAqIGFueSBvcmRlci4gKi8KLUVYVEVSTiBpbnQgZGVmd05ldE5vc2hpZWxkU3RhcnQgKGNvbnN0IGNoYXIqICBuYW1lKTsKLQotLyogeCBhbmQgeSBsb2NhdGlvbiBvZiB0aGUgcGF0aCAqLwotRVhURVJOIGludCBkZWZ3TmV0Tm9zaGllbGRQb2ludCAoaW50ICBudW1QdHMsIGNvbnN0IGNoYXIqKiAgcG9pbnR4LCBjb25zdCBjaGFyKiogIHBvaW50eSk7Ci1FWFRFUk4gaW50IGRlZndOZXROb3NoaWVsZFZpYSAoY29uc3QgY2hhciogIG5hbWUpOwotRVhURVJOIGludCBkZWZ3TmV0Tm9zaGllbGRFbmQgKCk7Ci0vKiBlbmQgNS4zICovCi0KLS8qIFN1Ym5ldCBhcmUgYSBzcGVjaWFsIHR5cGUgb2Ygb3B0aW9uLiBBIHN1Ym5ldCBtdXN0IGJlZ2luCi0gKiB3aXRoIGEgZGVmd05ldFN1Ym5ldFN0YXJ0IGFuZCBlbmQgd2l0aCBhIGRlZndOZXRTdWJuZXRFbmQoKS4KLSAqIFJvdXRpbmVzIHRvIGNhbGwgd2l0aGluIHRoZSBzdWJuZXQgYXJlOiBkZWZ3TmV0U3VibmV0UGluLAotICogZGVmd05ldE5vbmRlZmF1bHRSdWxlIGFuZCBkZWZ3TmV0UGF0aFN0YXJ0Li4uICovCi1FWFRFUk4gaW50IGRlZndOZXRTdWJuZXRTdGFydCAoY29uc3QgY2hhciogIG5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIHRoZSBkZWZ3TmV0U3VibmV0LCBpdCBpcyBmb3IKLSAqIFsoe2NvbXBOYW1lIHwgUElOfSBwaW5OYW1lKSB8IChWUElOIHZwaW5OYW1lKV0uLi4gKi8KLUVYVEVSTiBpbnQgZGVmd05ldFN1Ym5ldFBpbiAoY29uc3QgY2hhciogIGNvbXBOYW1lLCBjb25zdCBjaGFyKiAgcGluTmFtZSk7Ci0KLUVYVEVSTiBpbnQgZGVmd05ldFN1Ym5ldEVuZCAoKTsKLQotLyogUGF0aHMgYXJlIGEgc3BlY2lhbCB0eXBlIG9mIG9wdGlvbi4gIEEgcGF0aCBtdXN0IGJlZ2luCi0gKiB3aXRoIGEgZGVmd05ldFBhdGhTdGFydCBhbmQgZW5kIHdpdGggYSBkZWZ3UGF0aEVuZCgpLgotICogVGhlIGluZGl2aWR1YWwgcGFydHMgb2YgdGhlIHBhdGggY2FuIGJlIGVudGVyZWQgaW4KLSAqIGFueSBvcmRlci4gKi8KLUVYVEVSTiBpbnQgZGVmd05ldFBhdGhTdGFydCAoY29uc3QgY2hhciogIHR5cCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTk9TSElFTEQgfCBORVcgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBkZWZ3TmV0UGF0aFdpZHRoIChpbnQgIHcpOwotRVhURVJOIGludCBkZWZ3TmV0UGF0aExheWVyIChjb25zdCBjaGFyKiAgbmFtZSwgaW50ICBpc1RhcGVyLCBjb25zdCBjaGFyKiAgcnVsZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcnVsZW5hbWUgY2FuIGJlIGFzc2lnbmVkICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0gKiBUaGlzIGlzIGEgNS42IHN5bnRheC4gKi8KLUVYVEVSTiBpbnQgZGVmd05ldFBhdGhTdHlsZSAoaW50ICBzdHlsZU51bSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4KLSAqIFRoaXMgaXMgYSA1Ljggc3ludGF4LiAqLwotRVhURVJOIGludCBkZWZ3TmV0UGF0aE1hc2sgKGludCAgbWFza051bSk7Ci0KLUVYVEVSTiBpbnQgZGVmd05ldFBhdGhSZWN0IChpbnQgIGRlbHRhWDEsIGludCAgZGVsdGFZMSwgaW50ICBkZWx0YVgyLCBpbnQgIGRlbHRhWTIpOwotCi1FWFRFUk4gaW50IGRlZndOZXRQYXRoVmlydHVhbCAoaW50ICB4LCBpbnQgIHkpOwotCi0vKiB4IGFuZCB5IGxvY2F0aW9uIG9mIHRoZSBwYXRoICovCi1FWFRFUk4gaW50IGRlZndOZXRQYXRoUG9pbnQgKGludCAgbnVtUHRzLCBkb3VibGUqICBwb2ludHgsIGRvdWJsZSogIHBvaW50eSk7Ci0KLUVYVEVSTiBpbnQgZGVmd05ldFBhdGhQb2ludFdpdGhFeHQgKGludCAgbnVtUHRzLCBkb3VibGUqICBwb2ludHgsIGRvdWJsZSogIHBvaW50eSwgZG91YmxlKiAgb3B0VmFsdWUpOwotCi1FWFRFUk4gaW50IGRlZndOZXRQYXRoVmlhIChjb25zdCBjaGFyKiAgbmFtZSk7Ci0KLUVYVEVSTiBpbnQgZGVmd05ldFBhdGhWaWFXaXRoT3JpZW50IChjb25zdCBjaGFyKiAgbmFtZSwgaW50ICBvcmllbnQpOwotCi1FWFRFUk4gaW50IGRlZndOZXRQYXRoVmlhV2l0aE9yaWVudFN0ciAoY29uc3QgY2hhciogIG5hbWUsIGNvbnN0IGNoYXIqICBvcmllbnQpOwotRVhURVJOIGludCBkZWZ3TmV0UGF0aEVuZCAoKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhdCB0aGUgZW5kIG9mIGVhY2ggbmV0ICovCi1FWFRFUk4gaW50IGRlZndOZXRFbmRPbmVOZXQgKCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgbmV0IHNlY3Rpb24gKi8KLUVYVEVSTiBpbnQgZGVmd0VuZE5ldHMgKCk7Ci0KLS8qIFRoaXMgc2VjdGlvbiBvZiByb3V0aW5lcyBpcyBvcHRpb25hbC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhlIHJvdXRpbmUgc3RhcnRzIHRoZSBJL08gVGltaW5nIHNlY3Rpb24uIEFsbCBvZiB0aGUgaW90aW1pbmdzIG9wdGlvbnMKLSAqIG11c3QgZm9sbG93LgotICogVGhlIGNvdW50IGlzIHRoZSBudW1iZXIgb2YgZGVmd0lPVGltaW5nIGNhbGxzIHRvIGZvbGxvdy4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLgotICogVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAqLwotRVhURVJOIGludCBkZWZ3U3RhcnRJT1RpbWluZ3MgKGludCAgY291bnQpOwotCi0vKiBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBhZnRlciBkZWZ3U3RhcmF0SU9UaW1pbmcKLSAqIEl0IGlzIGZvciAtIC0geyhjb21wIHBpbikgfCAoUElOIG5hbWUpfQotICogVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAqLwotRVhURVJOIGludCBkZWZ3SU9UaW1pbmcgKGNvbnN0IGNoYXIqICBpbnN0LCBjb25zdCBjaGFyKiAgcGluKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciArIHsgUklTRSB8IEZBTEwgfSBWQVJJQUJMRSBtaW4gbWF4Ci0gKiBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuICovCi1FWFRFUk4gaW50IGRlZndJT1RpbWluZ1ZhcmlhYmxlIChjb25zdCBjaGFyKiAgcmlzZUZhbGwsIGludCAgbnVtMSwgaW50ICBudW0yKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciArIHsgUklTRSB8IEZBTEwgfSBTTEVXUkFURSBtaW4gbWF4Ci0gKiBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuICovCi1FWFRFUk4gaW50IGRlZndJT1RpbWluZ1NsZXdyYXRlIChjb25zdCBjaGFyKiAgcmlzZUZhbGwsIGludCAgbnVtMSwgaW50ICBudW0yKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciArIERSSVZFQ0VMTCBtYWNyb05hbWUgW1tGUk9NUElOIHBpbk5hbWVdIFRPUElOIHBpbk5hbWVdCi0gKiBbUEFSQUxMRUwgbnVtRHJpdmVyc10KLSAqIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gKi8KLUVYVEVSTiBpbnQgZGVmd0lPVGltaW5nRHJpdmVjZWxsIChjb25zdCBjaGFyKiAgbmFtZSwgY29uc3QgY2hhciogIGZyb21QaW4sIGNvbnN0IGNoYXIqICB0b1BpbiwgaW50ICBudW1Ecml2ZXJzKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciArIENBUEFDSVRBTkNFIGNhcGFjaXRhbmNlCi0gKiBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuICovCi1FWFRFUk4gaW50IGRlZndJT1RpbWluZ0NhcGFjaXRhbmNlIChkb3VibGUgIG51bSk7Ci0KLS8qIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gKi8KLUVYVEVSTiBpbnQgZGVmd0VuZElPVGltaW5ncyAoKTsKLQotLyogUm91dGluZXMgdG8gZW50ZXIgc2NhbiBjaGFpbnMuICBUaGlzIHNlY3Rpb24gaXMgb3B0aW9uYWwKLSAqIFRoZSBzZWN0aW9uIG11c3Qgc3RhcnQgd2l0aCBhIGRlZndTdGFydFNjYW5jaGFpbnMoKSBjYWxsIGFuZAotICogZW5kIHdpdGggYSBkZWZ3RW5kU2NhbmNoYWluKCkgY2FsbC4KLSAqIEVhY2ggc2NhbiBjaGFpbiBiZWdpbnMgd2l0aCBhIGRlZndTY2FuY2hhaW4oKSBjYWxsLgotICogVGhlIHJlc3Qgb2YgdGhlIGNhbGxzIGZvbGxvdy4gICovCi1FWFRFUk4gaW50IGRlZndTdGFydFNjYW5jaGFpbnMgKGludCAgY291bnQpOwotCi0vKiBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBhZnRlciBkZWZ3U3RhcnRTY2FuY2hhaW5zCi0gKiBJdCBpcyBmb3IgLSBjaGFpbk5hbWUgKi8KLUVYVEVSTiBpbnQgZGVmd1NjYW5jaGFpbiAoY29uc3QgY2hhciogIG5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yICsgQ09NTU9OU0NBTlBJTlMgW0lOIHBpbl0gW09VVCBwaW5dICovCi1FWFRFUk4gaW50IGRlZndTY2FuY2hhaW5Db21tb25zY2FucGlucyAoY29uc3QgY2hhciogIGluc3QxLCBjb25zdCBjaGFyKiAgcGluMSwgY29uc3QgY2hhciogIGluc3QyLCBjb25zdCBjaGFyKiAgcGluMik7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgKyBQQVJUSVRJT04gcGFyYXRpdGlvbk5hbWUgW01BWEJJVFMgbWF4Qml0c10gKi8KLS8qIFRoaXMgaXMgNS40LjEgc3ludGF4ICovCi1FWFRFUk4gaW50IGRlZndTY2FuY2hhaW5QYXJ0aXRpb24gKGNvbnN0IGNoYXIqICBuYW1lLCBpbnQgIG1heEJpdHMpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yICsgU1RBUlQge2ZpeGVkSW5Db21wIHwgUElOIH0gW291dFBpbl0gKi8KLUVYVEVSTiBpbnQgZGVmd1NjYW5jaGFpblN0YXJ0IChjb25zdCBjaGFyKiAgaW5zdCwgY29uc3QgY2hhciogIHBpbik7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgKyBTVE9QIHtmaXhlZE91dENvbXAgfCBQSU4gfSBbaW5QaW5dICovCi1FWFRFUk4gaW50IGRlZndTY2FuY2hhaW5TdG9wIChjb25zdCBjaGFyKiAgaW5zdCwgY29uc3QgY2hhciogIHBpbik7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgKyBGTE9BVElORyB7ZmxvYXRpbmdDb21wIFtJTiBwaW5dIFtPVVQgcGluXX0KLSAqIFRoaXMgaXMgYSA1LjQuMSBzeW50YXggKi8KLUVYVEVSTiBpbnQgZGVmd1NjYW5jaGFpbkZsb2F0aW5nIChjb25zdCBjaGFyKiAgbmFtZSwgY29uc3QgY2hhciogIGluc3QxLCBjb25zdCBjaGFyKiAgcGluMSwgY29uc3QgY2hhciogIGluc3QyLCBjb25zdCBjaGFyKiAgcGluMik7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgKyBGTE9BVElORyB7ZmxvYXRpbmdDb21wIFtJTiBwaW5dIFtPVVQgcGluXX0KLSAqIFRoaXMgaXMgYSA1LjQuMSBzeW50YXguCi0gKiBUaGlzIHJvdXRpbmUgaXMgdGhlIHNhbWUgYXMgZGVmd1NjYW5jaGFpbkZsb2F0aW5nLiAgQnV0IGFsc28gYWRkZWQKLSAqIHRoZSBvcHRpb24gQklUUy4gKi8KLUVYVEVSTiBpbnQgZGVmd1NjYW5jaGFpbkZsb2F0aW5nQml0cyAoY29uc3QgY2hhciogIG5hbWUsIGNvbnN0IGNoYXIqICBpbnN0MSwgY29uc3QgY2hhciogIHBpbjEsIGNvbnN0IGNoYXIqICBpbnN0MiwgY29uc3QgY2hhciogIHBpbjIsIGludCAgICBiaXRzKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciArIE9SREVSRUQge2ZpeGVkQ29tcCBbSU4gcGluXSBbT1VUIHBpbl0KLSAqIGZpeGVkQ29tcCBbSU4gcGluXSBbT1VUIHBpbl0uCi0gKiBXaGVuIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgZm9yIHRoZSAxc3QgdGltZSB3aXRoaW4gYSBzY2FuY2hhaW4sIAotICogYm90aCBuYW1lMSBhbmQgbmFtZTIgYXJlIHJlcXVpcmVkLiAgT25seSBuYW1lMSBpcyByZXF1aXJlZCBpcyB0aGUKLSAqIHJvdXRpbmUgaXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLiAqLwotRVhURVJOIGludCBkZWZ3U2NhbmNoYWluT3JkZXJlZCAoY29uc3QgY2hhciogIG5hbWUxLCBjb25zdCBjaGFyKiAgaW5zdDEsIGNvbnN0IGNoYXIqICBwaW4xLCBjb25zdCBjaGFyKiAgaW5zdDIsIGNvbnN0IGNoYXIqICBwaW4yLCBjb25zdCBjaGFyKiAgbmFtZTIsIGNvbnN0IGNoYXIqICBpbnN0MywgY29uc3QgY2hhciogIHBpbjMsIGNvbnN0IGNoYXIqICBpbnN0NCwgY29uc3QgY2hhciogIHBpbjQpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yICsgT1JERVJFRCB7Zml4ZWRDb21wIFtJTiBwaW5dIFtPVVQgcGluXQotICogZml4ZWRDb21wIFtJTiBwaW5dIFtPVVQgcGluXS4KLSAqIFdoZW4gdGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmb3IgdGhlIDFzdCB0aW1lIHdpdGhpbiBhIHNjYW5jaGFpbiwgCi0gKiBib3RoIG5hbWUxIGFuZCBuYW1lMiBhcmUgcmVxdWlyZWQuICBPbmx5IG5hbWUxIGlzIHJlcXVpcmVkIGlzIHRoZQotICogcm91dGluZSBpcyBjYWxsZWQgbW9yZSB0aGFuIG9uY2UuCi0gKiBUaGlzIGlzIGEgNS40LjEgc3ludGF4LgotICogVGhpcyByb3V0aW5lIGlzIHRoZSBzYW1lIGFzIGRlZndTY2FuY2hhaW5PcmRlcmVkLiAgQnV0IGFsc28gYWRkZWQKLSAqIHRoZSBvcHRpb24gQklUUyAqLwotRVhURVJOIGludCBkZWZ3U2NhbmNoYWluT3JkZXJlZEJpdHMgKGNvbnN0IGNoYXIqICBuYW1lMSwgY29uc3QgY2hhciogIGluc3QxLCBjb25zdCBjaGFyKiAgcGluMSwgY29uc3QgY2hhciogIGluc3QyLCBjb25zdCBjaGFyKiAgcGluMiwgaW50ICAgIGJpdHMxLCBjb25zdCBjaGFyKiAgbmFtZTIsIGNvbnN0IGNoYXIqICBpbnN0MywgY29uc3QgY2hhciogIHBpbjMsIGNvbnN0IGNoYXIqICBpbnN0NCwgY29uc3QgY2hhciogIHBpbjQsIGludCAgICBiaXRzMik7Ci0KLUVYVEVSTiBpbnQgZGVmd0VuZFNjYW5jaGFpbiAoKTsKLQotLyogUm91dGluZXMgdG8gZW50ZXIgY29uc3RyYWludHMuICBUaGlzIHNlY3Rpb24gaXMgb3B0aW9uYWwKLSAqIFRoZSBzZWN0aW9uIG11c3Qgc3RhcnQgd2l0aCBhIGRlZndTdGFydENvbnN0cmFpbnMoKSBjYWxsIGFuZAotICogZW5kIHdpdGggYSBkZWZ3RW5kQ29uc3RyYWludHMoKSBjYWxsLgotICogRWFjaCBjb250cmFpbnQgd2lsbCBjYWxsIHRoZSBkZWZ3Q29uc3RyYWludC4uLigpLgotICogVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAqLwotRVhURVJOIGludCBkZWZ3U3RhcnRDb25zdHJhaW50cyAoaW50ICBjb3VudCk7Ci0KLS8qIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgYXJlIGZvciAtIHtvcGVyYW5kIFsrIFJJU0VNQVggdGltZV0gWysgRkFMTE1BWCB0aW1lXQotICogWysgUklTRU1JTiB0aW1lXSBbKyBGQUxMTUlOIHRpbWVdIHwgV0lSRURMT0dJQyBuZXROYW1lIE1BWERJU1QgZGlzdGFuY2UgfTt9Ci0gKiBvcGVyYW5kIC0gTkVUIG5ldE5hbWUgfCBQQVRIIGNvbXAgZnJvbVBpbiBjb21wIHRvUGluIHwgU1VNIChvcGVyYW5kLCAuLi4pCi0gKiBUaGUgZm9sbG93aW5nIGFwaXMgYXJlIG9ic29sZXRlIGluIDUuNC4gKi8gCi1FWFRFUk4gaW50IGRlZndDb25zdHJhaW50T3BlcmFuZCAoKTsKLUVYVEVSTiBpbnQgZGVmd0NvbnN0cmFpbnRPcGVyYW5kTmV0IChjb25zdCBjaGFyKiAgbmV0TmFtZSk7Ci1FWFRFUk4gaW50IGRlZndDb25zdHJhaW50T3BlcmFuZFBhdGggKGNvbnN0IGNoYXIqICBjb21wMSwgY29uc3QgY2hhciogIGZyb21QaW4sIGNvbnN0IGNoYXIqICBjb21wMiwgY29uc3QgY2hhciogIHRvUGluKTsKLUVYVEVSTiBpbnQgZGVmd0NvbnN0cmFpbnRPcGVyYW5kU3VtICgpOwotRVhURVJOIGludCBkZWZ3Q29uc3RyYWludE9wZXJhbmRTdW1FbmQgKCk7Ci1FWFRFUk4gaW50IGRlZndDb25zdHJhaW50T3BlcmFuZFRpbWUgKGNvbnN0IGNoYXIqICB0aW1lVHlwZSwgaW50ICB0aW1lKTsKLUVYVEVSTiBpbnQgZGVmd0NvbnN0cmFpbnRPcGVyYW5kRW5kICgpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yIC0gV0lSRUxPR0lDIG5ldE5hbWUgTUFYRElTVCBkaXN0YW5jZSAqLwotRVhURVJOIGludCBkZWZ3Q29uc3RyYWludFdpcmVkbG9naWMgKGNvbnN0IGNoYXIqICBuZXROYW1lLCBpbnQgIGRpc3RhbmNlKTsKLQotRVhURVJOIGludCBkZWZ3RW5kQ29uc3RyYWludHMgKCk7Ci0KLS8qIFJvdXRpbmVzIHRvIGVudGVyIGdyb3Vwcy4gIFRoaXMgc2VjdGlvbiBpcyBvcHRpb25hbAotICogVGhlIHNlY3Rpb24gbXVzdCBzdGFydCB3aXRoIGEgZGVmd1N0YXJ0R3JvdXBzKCkgY2FsbCBhbmQKLSAqIGVuZCB3aXRoIGEgZGVmd0VuZEdyb3VwcygpIGNhbGwuCi0gKiBFYWNoIGdyb3VwIHdpbGwgY2FsbCB0aGUgZGVmd0dyb3VwLi4uKCkuICovCi1FWFRFUk4gaW50IGRlZndTdGFydEdyb3VwcyAoaW50ICBjb3VudCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgLSBncm91cE5hbWUgY29tcE5hbWVSZWdFeHByIC4uLiAqLwotRVhURVJOIGludCBkZWZ3R3JvdXAgKGNvbnN0IGNoYXIqICBncm91cE5hbWUsIGludCAgbnVtRXhwciwgY29uc3QgY2hhcioqICBncm91cEV4cHIpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yICsgU09GVCBbTUFYSEFMRlBFUklNRVRFUiB2YWx1ZV0gW01BWFggdmFsdWVdCi0gKiBbTUFYWSB2YWx1ZV0gKi8KLUVYVEVSTiBpbnQgZGVmd0dyb3VwU29mdCAoY29uc3QgY2hhciogIHR5cGUxLCBkb3VibGUgIHZhbHVlMSwgY29uc3QgY2hhciogIHR5cGUyLCBkb3VibGUgIHZhbHVlMiwgY29uc3QgY2hhciogIHR5cGUzLCBkb3VibGUgIHZhbHVlMyk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgKyBSRUdJT04ge3B0IHB0IHwgcmVnaW9uTmFtZX0gKi8KLUVYVEVSTiBpbnQgZGVmd0dyb3VwUmVnaW9uIChpbnQgIHhsLCBpbnQgIHlsLCBpbnQgIHhoLCBpbnQgIHloLCBjb25zdCBjaGFyKiAgcmVnaW9uTmFtZSk7Ci0KLUVYVEVSTiBpbnQgZGVmd0VuZEdyb3VwcyAoKTsKLQotLyogUm91dGluZXMgdG8gZW50ZXIgQmxvY2thZ2VzLiAgVGhpcyBzZWN0aW9uIGlzIG9wdGlvbmFsCi0gKiBUaGUgc2VjdGlvbiBtdXN0IHN0YXJ0IHdpdGggYSBkZWZ3U3RhcnRCbG9ja2FnZXMoKSBjYWxsIGFuZAotICogZW5kIHdpdGggYSBkZWZ3RW5kQmxvY2thZ2VzKCkgY2FsbC4KLSAqIEVhY2ggYmxvY2thZ2Ugd2lsbCBjYWxsIHRoZSBkZWZ3QmxvY2thZ2VzLi4uKCkuCi0gKiBUaGlzIGlzIGEgNS40IHN5bnRheC4gKi8KLUVYVEVSTiBpbnQgZGVmd1N0YXJ0QmxvY2thZ2VzIChpbnQgIGNvdW50KTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciAtIGxheWVyTmFtZQotKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHBlciBlbnRyeSB3aXRoaW4gYSBibG9ja2FnZSBmb3IgbGF5ZXIuCi0qIFRoaXMgaXMgYSA1LjQgc3ludGF4LiAqLwotRVhURVJOIGludCBkZWZ3QmxvY2thZ2VzTGF5ZXIgKGNvbnN0IGNoYXIqICBsYXllck5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yIC0gc2xvdHMgCi0qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgcGVyIGVudHJ5IHdpdGhpbiBhIGJsb2NrYWdlIGxheWVyLCBjYW4ndCBiZSBtb3JlIHRoZW4gb25lLgotKiBUaGlzIGlzIGEgNS40IHN5bnRheC4gKi8KLUVYVEVSTiBpbnQgZGVmd0Jsb2NrYWdlc0xheWVyU2xvdHMgKCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgLSBmaWxscwotKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHBlciBlbnRyeSB3aXRoaW4gYSBibG9ja2FnZSBsYXllciwgY2FuJ3QgYmUgbW9yZSB0aGVuIG9uZS4KLSogVGhpcyBpcyBhIDUuNCBzeW50YXguICovCi1FWFRFUk4gaW50IGRlZndCbG9ja2FnZXNMYXllckZpbGxzICgpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yIC0gcHVzaGRvd24KLSogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBwZXIgZW50cnkgd2l0aGluIGEgYmxvY2thZ2UgbGF5ZXIsIGNhbid0IGJlIG1vcmUgdGhlbiBvbmUuCi0qIFRoaXMgaXMgYSA1LjQgc3ludGF4LiAqLwotRVhURVJOIGludCBkZWZ3QmxvY2thZ2VzTGF5ZXJQdXNoZG93biAoKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciAtIGV4Y2VwdHBnbmV0Ci0qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgcGVyIGVudHJ5IHdpdGhpbiBhIGJsb2NrYWdlIGxheWVyLCBjYW4ndCBiZSBtb3JlIHRoZW4gb25lLgotKiBUaGlzIGlzIGEgNS43IHN5bnRheC4gKi8KLUVYVEVSTiBpbnQgZGVmd0Jsb2NrYWdlc0xheWVyRXhjZXB0cGduZXQgKCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgLSBjb21wb25lbnQKLSogVGhpcyByb3V0aW5lIGNhbGxlZCBwZXIgZW50cnkgd2l0aGluIGEgYmxvY2thZ2UgbGF5ZXIsIGNhbid0IGJlIG1vcmUgdGhhbiBvbmUuCi0qIFRoaXMgaXMgYSA1LjYgc3ludGF4LiAqLwotRVhURVJOIGludCBkZWZ3QmxvY2thZ2VzTGF5ZXJDb21wb25lbnQgKGNvbnN0IGNoYXIqICBjb21wTmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgLSBzcGFjaW5nCi0qIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgZGVmd0Jsb2NrYWdlc0Rlc2lnblJ1bGVXaWR0aCBpcyBjYWxsZWQgcGVyIGVudHJ5Ci0qIHdpdGhpbiBhIGJsb2NrYWdlIGxheWVyLCBjYW4ndCBiZSBtb3JlIHRoYW4gb25lLgotKiBUaGlzIGlzIGEgNS42IHN5bnRheC4gKi8KLUVYVEVSTiBpbnQgZGVmd0Jsb2NrYWdlc0xheWVyU3BhY2luZyAoaW50ICBtaW5TcGFjaW5nKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciAtIGRlc2lnbnJ1bGV3aWR0aAotKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGRlZndCbG9ja2FnZXNTcGFjaW5nIGlzIGNhbGxlZCBwZXIgZW50cnkKLSogd2l0aGluIGEgYmxvY2thZ2UgbGF5ZXIsIGNhbid0IGJlIG1vcmUgdGhhbiBvbmUuCi0qIFRoaXMgaXMgYSA1LjYgc3ludGF4LiAqLwotRVhURVJOIGludCBkZWZ3QmxvY2thZ2VzTGF5ZXJEZXNpZ25SdWxlV2lkdGggKGludCAgZWZmZWN0aXZlV2lkdGgpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yIC0gbWFzay4KLSogVGhpcyByb3V0aW5lIGNhbGxlZCBwZXIgZW50cnkgd2l0aGluIGEgYmxvY2thZ2UgbGF5ZXIsIGNhbid0IGJlIG1vcmUgdGhhbiBvbmUuCi0qIFRoaXMgaXMgYSA1Ljggc3ludGF4LiAqLwotRVhURVJOIGludCBkZWZ3QmxvY2thZ2VzTGF5ZXJNYXNrIChpbnQgIG1hc2tDb2xvcik7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgLSBsYXllck5hbWUgJiBjb21wTmFtZQotICogRWl0aGVyIHRoaXMgcm91dGluZSwgZGVmQmxvY2thZ2VMYXllclNsb3RzLCBkZWZCbG9ja2FnZUxheWVyRmlsbHMsCi0gKiBvciBkZWZ3QmxvY2thZ2VQbGFjZW1lbnQgaXMgY2FsbGVkIHBlciBlbnRyeSB3aXRoaW4KLSAqIGEgYmxvY2thZ2UsIGNhbid0IGJlIG1vcmUgdGhlbiBvbmUuCi0gKiBUaGlzIGlzIGEgNS40IHN5bnRheC4gKi8KLUVYVEVSTiBpbnQgZGVmd0Jsb2NrYWdlTGF5ZXIgKGNvbnN0IGNoYXIqICBsYXllck5hbWUsIGNvbnN0IGNoYXIqICBjb21wTmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgLSBsYXllck5hbWUgJiBzbG90cyAKLSAqIEVpdGhlciB0aGlzIHJvdXRpbmUsIGRlZkJsb2NrYWdlTGF5ZXIsIGRlZkJsb2NrYWdlTGF5ZXJGaWxscywKLSAqIGRlZndCbG9ja2FnZVBsYWNlbWVudCwgb3IgZGVmd0Jsb2NrYWdlUHVzaGRvd24gaXMgY2FsbGVkIHBlciBlbnRyeSB3aXRoaW4KLSAqIGEgYmxvY2thZ2UsIGNhbid0IGJlIG1vcmUgdGhlbiBvbmUuCi0gKiBUaGlzIGlzIGEgNS40IHN5bnRheC4gKi8KLUVYVEVSTiBpbnQgZGVmd0Jsb2NrYWdlTGF5ZXJTbG90cyAoY29uc3QgY2hhciogIGxheWVyTmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgLSBsYXllck5hbWUgJiBmaWxscwotICogRWl0aGVyIHRoaXMgcm91dGluZSwgZGVmQmxvY2thZ2VMYXllciwgZGVmQmxvY2thZ2VMYXllclNsb3RzLAotICogZGVmd0Jsb2NrYWdlUGxhY2VtZW50LCBvciBkZWZ3QmxvY2thZ2VQdXNoZG93biBpcyBjYWxsZWQgcGVyIGVudHJ5IHdpdGhpbgotICogYSBibG9ja2FnZSwgY2FuJ3QgYmUgbW9yZSB0aGVuIG9uZS4KLSAqIFRoaXMgaXMgYSA1LjQgc3ludGF4LiAqLwotRVhURVJOIGludCBkZWZ3QmxvY2thZ2VMYXllckZpbGxzIChjb25zdCBjaGFyKiAgbGF5ZXJOYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciAtIGxheWVyTmFtZSAmIHB1c2hkb3duCi0gKiBFaXRoZXIgdGhpcyByb3V0aW5lLCBkZWZCbG9ja2FnZUxheWVyLCBkZWZCbG9ja2FnZUxheWVyU2xvdHMsCi0gKiBkZWZ3QmxvY2thZ2VQbGFjZW1lbnQsIG9yIGRlZndCbG9ja2FnZUZpbGxzIGlzIGNhbGxlZCBwZXIgZW50cnkgd2l0aGluCi0gKiBhIGJsb2NrYWdlLCBjYW4ndCBiZSBtb3JlIHRoZW4gb25lLgotICogVGhpcyBpcyBhIDUuNCBzeW50YXguICovCi1FWFRFUk4gaW50IGRlZndCbG9ja2FnZUxheWVyUHVzaGRvd24gKGNvbnN0IGNoYXIqICBsYXllck5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yIC0gZXhjZXB0cGduZXQKLSAqIEVpdGhlciB0aGlzIHJvdXRpbmUsIGRlZkJsb2NrYWdlTGF5ZXIsIGRlZkJsb2NrYWdlTGF5ZXJTbG90cywKLSAqIGRlZndCbG9ja2FnZVBsYWNlbWVudCwgb3IgZGVmd0Jsb2NrYWdlRmlsbHMgaXMgY2FsbGVkIHBlciBlbnRyeSB3aXRoaW4KLSAqIGEgYmxvY2thZ2UsIGNhbid0IGJlIG1vcmUgdGhlbiBvbmUuCi0gKiBUaGlzIGlzIGEgNS43IHN5bnRheC4gKi8KLUVYVEVSTiBpbnQgZGVmd0Jsb2NrYWdlTGF5ZXJFeGNlcHRwZ25ldCAoY29uc3QgY2hhciogIGxheWVyTmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgLSBzcGFjaW5nCi0gKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGRlZndCbG9ja2FnZURlc2lnblJ1bGVXaWR0aCBpcyBjYWxsZWQgcGVyIGVudHJ5Ci0gKiB3aXRoaW4gYSBibG9ja2FnZSwgY2FuJ3QgYmUgbW9yZSB0aGFuIG9uZS4KLSAqIFRoaXMgaXMgYSA1LjYgc3ludGF4LiAqLwotRVhURVJOIGludCBkZWZ3QmxvY2thZ2VTcGFjaW5nIChpbnQgIG1pblNwYWNpbmcpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yIC0gZGVzaWducnVsZXdpZHRoCi0gKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGRlZndCbG9ja2FnZVNwYWNpbmcgaXMgY2FsbGVkIHBlciBlbnRyeQotICogd2l0aGluIGEgYmxvY2thZ2UsIGNhbid0IGJlIG1vcmUgdGhhbiBvbmUuCi0gKiBUaGlzIGlzIGEgNS42IHN5bnRheC4gKi8KLUVYVEVSTiBpbnQgZGVmd0Jsb2NrYWdlRGVzaWduUnVsZVdpZHRoIChpbnQgIGVmZmVjdGl2ZVdpZHRoKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciAtIHBsYWNlbWVudAotICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBwZXIgZW50cnkgd2l0aGluIGJsb2NrYWdlIGZvciBwbGFjZW1lbnQuCi0gKiBUaGlzIGlzIGEgNS40IHN5bnRheC4KLSAqIDExLzI1LzIwMDIgLSBidWcgZml4OiBzdWJtaXR0ZWQgYnkgQ3JhaWcgRmlsZXMgKGNmaWxlc0BmdGMuYWdpbGVudC5jb20pCi0gKiB0aGlzIHJvdXRpbmUgYWxsb3dzIHRvIGNhbGwgYmxvY2thZ2Ugd2l0aG91dCBhIGNvbXBvbmVudC4gKi8KLUVYVEVSTiBpbnQgZGVmd0Jsb2NrYWdlc1BsYWNlbWVudCAoKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciAtIGNvbXBvbmVudAotKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHBlciBlbnRyeSB3aXRoaW4gYmxvY2thZ2UgcGxhY2VtZW50LCBjYW4ndCBiZSBtb3JlIHRoZW4gb25lLgotKiBUaGlzIGlzIGEgNS40IHN5bnRheC4gKi8KLUVYVEVSTiBpbnQgZGVmd0Jsb2NrYWdlc1BsYWNlbWVudENvbXBvbmVudCAoY29uc3QgY2hhciogIGNvbXBOYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciAtIFB1c2hkb3duCi0qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgcGVyIGVudHJ5IHdpdGhpbiBibG9ja2FnZSBwbGFjZW1lbnQsIGNhbid0IGJlIG1vcmUgdGhlbiBvbmUuCi0qIFRoaXMgaXMgYSA1LjQgc3ludGF4LiAqLwotRVhURVJOIGludCBkZWZ3QmxvY2thZ2VzUGxhY2VtZW50UHVzaGRvd24gKCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgLSBzb2Z0Ci0qIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgZGVmd0Jsb2NrYWdlc1BsYWNlbWVudFBhcnRpYWwKLSogaXMgY2FsbGVkIHBlciBlbnRyeSB3aXRoaW4gYmxvY2thZ2UgcGxhY2VtZW50LCBjYW4ndCBiZSBtb3JlIHRoZW4gb25lLgotKiBUaGlzIGlzIGEgNS43IHN5bnRheC4gKi8KLUVYVEVSTiBpbnQgZGVmd0Jsb2NrYWdlc1BsYWNlbWVudFNvZnQgKCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgLSBQYXJ0aWFsCi0qIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgZGVmd0Jsb2NrYWdlc1BsYWNlbWVudFNvZnQKLSogaXMgY2FsbGVkIHBlciBlbnRyeSB3aXRoaW4gYmxvY2thZ2UgcGxhY2VtZW50LCBjYW4ndCBiZSBtb3JlIHRoZW4gb25lLgotKiBUaGlzIGlzIGEgNS43IHN5bnRheC4gKi8KLUVYVEVSTiBpbnQgZGVmd0Jsb2NrYWdlc1BsYWNlbWVudFBhcnRpYWwgKGRvdWJsZSAgbWF4RGVuc2l0eSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgcmVjdGFuZ2xlLgotKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZS4gCi0qIFRoaXMgaXMgYSA1LjQgc3ludGF4LiAqLwotRVhURVJOIGludCBkZWZ3QmxvY2thZ2VzUmVjdCAoaW50ICB4bCwgaW50ICB5bCwgaW50ICB4aCwgaW50ICB5aCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgcG9seWdvbi4KLSogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWUuIAotKiBUaGlzIGlzIGEgNS42IHN5bnRheC4gKi8KLUVYVEVSTiBpbnQgZGVmd0Jsb2NrYWdlc1BvbHlnb24gKGludCAgbnVtX3BvbHlzLCBpbnQqICB4bCwgaW50KiAgeWwpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yIC0gcGxhY2VtZW50Ci0qIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgZGVmQmxvY2thZ2VMYXllcgotKiBpcyBjYWxsZWQgcGVyIGVudHJ5IHdpdGhpbiBibG9ja2FnZSwgY2FuJ3QgYmUgbW9yZSB0aGVuIG9uZS4KLSogVGhpcyBpcyBhIDUuNCBzeW50YXguCi0qIDExLzI1LzIwMDIgLSBidWcgZml4OiBzdWJtaXR0ZWQgYnkgQ3JhaWcgRmlsZXMgKGNmaWxlc0BmdGMuYWdpbGVudC5jb20pCi0qIHRoaXMgcm91dGluZSBhbGxvd3MgdG8gY2FsbCBibG9ja2FnZSB3aXRob3V0IGEgY29tcG9uZW50LiAqLwotRVhURVJOIGludCBkZWZ3QmxvY2thZ2VQbGFjZW1lbnQgKCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgLSBwbGFjZW1lbnQgJiBjb21wb25lbnQKLSAqIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgZGVmd0Jsb2NrYWdlUGxhY2VtZW50UHVzaGRvd24KLSAqIGlzIGNhbGxlZCBwZXIgZW50cnkgd2l0aGluIGJsb2NrYWdlLCBjYW4ndCBiZSBtb3JlIHRoZW4gb25lLgotICogVGhpcyBpcyBhIDUuNCBzeW50YXguICovCi1FWFRFUk4gaW50IGRlZndCbG9ja2FnZVBsYWNlbWVudENvbXBvbmVudCAoY29uc3QgY2hhciogIGNvbXBOYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciAtIHBsYWNlbWVudCAmIFB1c2hkb3duCi0gKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGRlZndCbG9ja2FnZVBsYWNlbWVudENvbXBvbmVudAotICogaXMgY2FsbGVkIHBlciBlbnRyeSB3aXRoaW4gYmxvY2thZ2UsIGNhbid0IGJlIG1vcmUgdGhlbiBvbmUuCi0gKiBUaGlzIGlzIGEgNS40IHN5bnRheC4gKi8KLUVYVEVSTiBpbnQgZGVmd0Jsb2NrYWdlUGxhY2VtZW50UHVzaGRvd24gKCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgLSBwbGFjZW1lbnQgJiBzb2Z0Ci0gKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGRlZndCbG9ja2FnZVBsYWNlbWVudFB1c2hkb3duCi0gKiBpcyBjYWxsZWQgcGVyIGVudHJ5IHdpdGhpbiBibG9ja2FnZSwgY2FuJ3QgYmUgbW9yZSB0aGVuIG9uZS4KLSAqIFRoaXMgaXMgYSA1Ljcgc3ludGF4LiAqLwotRVhURVJOIGludCBkZWZ3QmxvY2thZ2VQbGFjZW1lbnRTb2Z0ICgpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yIC0gcGxhY2VtZW50ICYgUGFydGlhbAotICogRWl0aGVyIHRoaXMgcm91dGluZSBvciBkZWZ3QmxvY2thZ2VQbGFjZW1lbnRDb21wb25lbnQKLSAqIGlzIGNhbGxlZCBwZXIgZW50cnkgd2l0aGluIGJsb2NrYWdlLCBjYW4ndCBiZSBtb3JlIHRoZW4gb25lLgotICogVGhpcyBpcyBhIDUuNyBzeW50YXguICovCi1FWFRFUk4gaW50IGRlZndCbG9ja2FnZVBsYWNlbWVudFBhcnRpYWwgKGRvdWJsZSAgbWF4RGVuc2l0eSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4KLSAqIFRoaXMgaXMgYSA1Ljggc3ludGF4LiAqLwotRVhURVJOIGludCBkZWZ3QmxvY2thZ2VNYXNrIChpbnQgIG1hc2tDb2xvcik7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgcmVjdGFuZ2xlLgotICogVGhpcyBpcyBhIDUuNCBzeW50YXguICovCi1FWFRFUk4gaW50IGRlZndCbG9ja2FnZVJlY3QgKGludCAgeGwsIGludCAgeWwsIGludCAgeGgsIGludCAgeWgpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yIHBvbHlnb24uCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW5hbCBhbmQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lLiAKLSAqIFRoaXMgaXMgYSA1LjYgc3ludGF4LiAqLwotRVhURVJOIGludCBkZWZ3QmxvY2thZ2VQb2x5Z29uIChpbnQgIG51bV9wb2x5cywgaW50KiAgeGwsIGludCogIHlsKTsKLQotLyogVGhpcyBpcyBhIDUuNCBzeW50YXguICovCi1FWFRFUk4gaW50IGRlZndFbmRCbG9ja2FnZXMgKCk7Ci0KLS8qIFJvdXRpbmVzIHRvIGVudGVyIFNsb3RzLiAgVGhpcyBzZWN0aW9uIGlzIG9wdGlvbmFsCi0gKiBUaGUgc2VjdGlvbiBtdXN0IHN0YXJ0IHdpdGggYSBkZWZ3U3RhcnRTbG90cygpIGNhbGwgYW5kCi0gKiBlbmQgd2l0aCBhIGRlZndFbmRTbG90cygpIGNhbGwuCi0gKiBFYWNoIHNsb3RzIHdpbGwgY2FsbCB0aGUgZGVmd1Nsb3RzLi4uKCkuCi0gKiBUaGlzIGlzIGEgNS40IHN5bnRheC4gKi8KLUVYVEVSTiBpbnQgZGVmd1N0YXJ0U2xvdHMgKGludCAgY291bnQpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yIC0gbGF5ZXJOYW1lICYgY29tcE5hbWUKLSAqIEVpdGhlciB0aGlzIHJvdXRpbmUsIGRlZlNsb3RzLCBkZWZTbG90c0xheWVyRmlsbHMsCi0gKiBvciBkZWZ3U2xvdHNQbGFjZW1lbnQgaXMgY2FsbGVkIHBlciBlbnRyeSB3aXRoaW4KLSAqIGEgc2xvdCwgY2FuJ3QgYmUgbW9yZSB0aGVuIG9uZS4KLSAqIFRoaXMgaXMgYSA1LjQgc3ludGF4LiAqLwotRVhURVJOIGludCBkZWZ3U2xvdExheWVyIChjb25zdCBjaGFyKiAgbGF5ZXJOYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciByZWN0YW5nbGUKLSAqIFRoaXMgaXMgYSA1LjQgc3ludGF4LiAqLwotRVhURVJOIGludCBkZWZ3U2xvdFJlY3QgKGludCAgeGwsIGludCAgeWwsIGludCAgeGgsIGludCAgeWgpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yIHJlY3RhbmdsZQotICogVGhpcyBpcyBhIDUuNiBzeW50YXggYW5kIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZS4gKi8KLUVYVEVSTiBpbnQgZGVmd1Nsb3RQb2x5Z29uIChpbnQgIG51bV9wb2x5cywgZG91YmxlKiAgeGwsIGRvdWJsZSogIHlsKTsKLQotLyogVGhpcyBpcyBhIDUuNCBzeW50YXguICovCi1FWFRFUk4gaW50IGRlZndFbmRTbG90cyAoKTsKLQotLyogUm91dGluZXMgdG8gZW50ZXIgRmlsbHMuICBUaGlzIHNlY3Rpb24gaXMgb3B0aW9uYWwKLSAqIFRoZSBzZWN0aW9uIG11c3Qgc3RhcnQgd2l0aCBhIGRlZndTdGFydEZpbGxzKCkgY2FsbCBhbmQKLSAqIGVuZCB3aXRoIGEgZGVmd0VuZEZpbGxzKCkgY2FsbC4KLSAqIEVhY2ggZmlsbHMgd2lsbCBjYWxsIHRoZSBkZWZ3RmlsbHMuLi4oKS4KLSAqIFRoaXMgaXMgYSA1LjQgc3ludGF4LiAqLwotRVhURVJOIGludCBkZWZ3U3RhcnRGaWxscyAoaW50ICBjb3VudCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgLSBsYXllck5hbWUgJiBjb21wTmFtZQotICogRWl0aGVyIHRoaXMgcm91dGluZSwgZGVmRmlsbHMsIGRlZkZpbGxzTGF5ZXJGaWxscywKLSAqIG9yIGRlZndGaWxsc1BsYWNlbWVudCBpcyBjYWxsZWQgcGVyIGVudHJ5IHdpdGhpbgotICogYSBmaWxsLCBjYW4ndCBiZSBtb3JlIHRoZW4gb25lLgotICogVGhpcyBpcyBhIDUuNCBzeW50YXguICovCi1FWFRFUk4gaW50IGRlZndGaWxsTGF5ZXIgKGNvbnN0IGNoYXIqICBsYXllck5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0gKiBUaGlzIGlzIGEgNS44IHN5bnRheC4gKi8KLUVYVEVSTiBpbnQgZGVmd0ZpbGxMYXllck1hc2sgKGludCAgbWFza0NvbG9yKTsKLQotLyogVGhpcyByb3V0aW5lIGhhcyB0byBiZSBjYWxsZWQgYWZ0ZXIgZGVmd0ZpbGxMYXllcgotICogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLgotICogVGhpcyBpcyBhIDUuNyBzeW50YXguICovCi1FWFRFUk4gaW50IGRlZndGaWxsTGF5ZXJPUEMgKCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgcmVjdGFuZ2xlLgotICogVGhpcyBpcyBhIDUuNCBzeW50YXguICovCi1FWFRFUk4gaW50IGRlZndGaWxsUmVjdCAoaW50ICB4bCwgaW50ICB5bCwgaW50ICB4aCwgaW50ICB5aCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgcG9seWdvbi4KLSAqIFRoaXMgaXMgYSA1LjYgc3ludGF4IGFuZCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWUuICovCi1FWFRFUk4gaW50IGRlZndGaWxsUG9seWdvbiAoaW50ICBudW1fcG9seXMsIGRvdWJsZSogIHhsLCBkb3VibGUqICB5bCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgdmlhLgotICogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLgotICogVGhpcyBpcyBhIDUuNyBzeW50YXggYW5kIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZS4gKi8KLUVYVEVSTiBpbnQgZGVmd0ZpbGxWaWEgKGNvbnN0IGNoYXIqICB2aWFOYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLgotICogVGhpcyBpcyBhIDUuOCBzeW50YXguICovCi1FWFRFUk4gaW50IGRlZndGaWxsVmlhTWFzayAoaW50ICBjb2xvck1hc2spOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yIHZpYSBPUEMuCi0gKiBUaGlzIHJvdXRpbmUgY2FuIG9ubHkgYmUgY2FsbGVkIGFmdGVyIGRlZndGaWxsVmlhLgotICogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLgotICogVGhpcyBpcyBhIDUuNyBzeW50YXggYW5kIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZS4gKi8KLUVYVEVSTiBpbnQgZGVmd0ZpbGxWaWFPUEMgKCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgdmlhIE9QQy4KLSAqIFRoaXMgcm91dGluZSBjYW4gb25seSBiZSBjYWxsZWQgYWZ0ZXIgZGVmd0ZpbGxWaWEuCi0gKiBUaGlzIHJvdXRpbmUgaXMgcmVxdWlyZWQgZm9sbG93aW5nIGRlZndGaWxsVmlhLgotICogVGhpcyBpcyBhIDUuNyBzeW50YXggYW5kIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZS4gKi8KLUVYVEVSTiBpbnQgZGVmd0ZpbGxQb2ludHMgKGludCAgbnVtX3BvaW50cywgZG91YmxlKiAgeGwsIGRvdWJsZSogIHlsKTsKLQotLyogVGhpcyBpcyBhIDUuNCBzeW50YXguICovCi1FWFRFUk4gaW50IGRlZndFbmRGaWxscyAoKTsKLQotLyogUm91dGluZXMgdG8gZW50ZXIgTk9OREVGQVVMVFJVTEVTLiAgVGhpcyBzZWN0aW9uIGlzIHJlcXVpcmVkCi0gKiBUaGUgc2VjdGlvbiBtdXN0IHN0YXJ0IHdpdGggYSBkZWZ3U3RhcnROb25EZWZhdWx0UnVsZXMoKSBhbmQKLSAqIGVuZCB3aXRoIGRlZndFbmROb25EZWZhdWx0UnVsZXMoKSBjYWxsLgotICogVGhpcyBpcyBhIDUuNiBzeW50YXguICovCi1FWFRFUk4gaW50IGRlZndTdGFydE5vbkRlZmF1bHRSdWxlcyAoaW50ICBjb3VudCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgTGF5ZXIgd2l0aGluIHRoZSBOT05ERUZBVUxUUlVMRVMKLSAqIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAgSXQgaXMgcmVxdWlyZWQuCi0gKiBUaGlzIGlzIGEgNS42IHN5bnRheC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAqLwotRVhURVJOIGludCBkZWZ3Tm9uRGVmYXVsdFJ1bGUgKGNvbnN0IGNoYXIqICBydWxlTmFtZSwgaW50ICBoYXJkU3BhY2luZyk7Ci0KLS8qIFJvdXRpbmVzIHRvIGVudGVyIE5PTkRFRkFVTFRSVUxFUy4gIFRoaXMgc2VjdGlvbiBpcyByZXF1aXJlZAotICogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBkZWZ3Tm9uRGVmYXVsdFJ1bGUuIAotICogVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCi0gKiBUaGlzIGlzIGEgNS42IHN5bnRheC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAqLwotRVhURVJOIGludCBkZWZ3Tm9uRGVmYXVsdFJ1bGVMYXllciAoY29uc3QgY2hhciogIGxheWVyTmFtZSwgaW50ICB3aWR0aCwgaW50ICBkaWFnV2lkdGgsIGludCAgc3BhY2luZywgaW50ICB3aXJlRXh0KTsKLQotLyogUm91dGluZXMgdG8gZW50ZXIgTk9OREVGQVVMVFJVTEVTLiAgVGhpcyBzZWN0aW9uIGlzIG9wdGlvbmFsLgotICogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBkZWZ3Tm9uRGVmYXVsdFJ1bGUuIAotICogVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCi0gKiBUaGlzIGlzIGEgNS42IHN5bnRheC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAqLwotRVhURVJOIGludCBkZWZ3Tm9uRGVmYXVsdFJ1bGVWaWEgKGNvbnN0IGNoYXIqICB2aWFOYW1lKTsKLQotLyogUm91dGluZXMgdG8gZW50ZXIgTk9OREVGQVVMVFJVTEVTLiAgVGhpcyBzZWN0aW9uIGlzIG9wdGlvbmFsLgotICogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBkZWZ3Tm9uRGVmYXVsdFJ1bGUuIAotICogVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCi0gKiBUaGlzIGlzIGEgNS42IHN5bnRheC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAqLwotRVhURVJOIGludCBkZWZ3Tm9uRGVmYXVsdFJ1bGVWaWFSdWxlIChjb25zdCBjaGFyKiAgdmlhUnVsZU5hbWUpOwotCi0vKiBSb3V0aW5lcyB0byBlbnRlciBOT05ERUZBVUxUUlVMRVMuICBUaGlzIHNlY3Rpb24gaXMgb3B0aW9uYWwuCi0gKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGRlZndOb25EZWZhdWx0UnVsZS4gCi0gKiBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KLSAqIFRoaXMgaXMgYSA1LjYgc3ludGF4LgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICovCi1FWFRFUk4gaW50IGRlZndOb25EZWZhdWx0UnVsZU1pbkN1dHMgKGNvbnN0IGNoYXIqICBjdXRMYXllck5hbWUsIGludCAgbnVtQ3V0Uyk7Ci0KLS8qIFRoaXMgaXMgYSA1LjQgc3ludGF4LiAqLwotRVhURVJOIGludCBkZWZ3RW5kTm9uRGVmYXVsdFJ1bGVzICgpOwotCi0vKiBSb3V0aW5lcyB0byBlbnRlciBTVFlMRVMuICBUaGlzIHNlY3Rpb24gaXMgcmVxdWlyZWQKLSAqIFRoZSBzZWN0aW9uIG11c3Qgc3RhcnQgd2l0aCBhIGRlZndTdGFydFN0eWxlcygpIGFuZAotICogZW5kIHdpdGggZGVmd0VuZFN0eWxlcygpIGNhbGwuCi0gKiBUaGlzIGlzIGEgNS42IHN5bnRheC4gKi8KLUVYVEVSTiBpbnQgZGVmd1N0YXJ0U3R5bGVzIChpbnQgIGNvdW50KTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciBMYXllciB3aXRoaW4gdGhlIE5PTkRFRkFVTFRSVUxFUwotICogVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuICBJdCBpcyByZXF1aXJlZC4KLSAqIFRoaXMgaXMgYSA1LjYgc3ludGF4LgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICovCi1FWFRFUk4gaW50IGRlZndTdHlsZXMgKGludCAgc3R5bGVOdW1zLCBpbnQgIG51bV9wb2ludHMsIGRvdWJsZSogIHhwLCBkb3VibGUqICB5cCk7Ci0KLS8qIFRoaXMgaXMgYSA1LjQgc3ludGF4LiAqLwotRVhURVJOIGludCBkZWZ3RW5kU3R5bGVzICgpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGRlZndJbml0LgotICogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBpdCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAqLwotRVhURVJOIGludCBkZWZ3U3RhcnRCZWdpbmV4dCAoY29uc3QgY2hhciogIG5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGRlZndCZWdpbmV4dC4KLSAqIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCwgaXQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gKi8KLUVYVEVSTiBpbnQgZGVmd0JlZ2luZXh0Q3JlYXRvciAoY29uc3QgY2hhciogIGNyZWF0b3JOYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBkZWZ3QmVnaW5leHQuCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwsIGl0IGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLgotICogSXQgZ2V0cyB0aGUgY3VycmVudCBzeXN0ZW0gdGltZSBhbmQgZGF0ZS4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAqLwotRVhURVJOIGludCBkZWZ3QmVnaW5leHREYXRlICgpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGRlZndCZWdpbmV4dC4KLSAqIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCwgaXQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gKi8KLUVYVEVSTiBpbnQgZGVmd0JlZ2luZXh0UmV2aXNpb24gKGludCAgdmVyczEsIGludCAgdmVyczIpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGRlZndCZWdpbmV4dC4KLSAqIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCwgaXQgY2FuIGJlIGNhbGxlZCBtYW55IHRpbWVzLgotICogSXQgYWxsb3dzIHVzZXIgdG8gY3VzdG9taXplIHRoZWlyIG93biBzeW50YXguCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gKi8KLUVYVEVSTiBpbnQgZGVmd0JlZ2luZXh0U3ludGF4IChjb25zdCBjaGFyKiAgdGl0bGUsIGNvbnN0IGNoYXIqICBzdHJpbmcpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGRlZndJbml0LgotICogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBpdCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAqLwotRVhURVJOIGludCBkZWZ3RW5kQmVnaW5leHQgKCk7Ci0KLS8qIEVuZCB0aGUgREVGIGZpbGUuCi0gKiBUaGlzIHJvdXRpbmUgSVMgTk9UIE9QVElPTkFMLgotICogVGhlIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgTEFTVC4gKi8KLUVYVEVSTiBpbnQgZGVmd0VuZCAoKTsKLQotLyogR2VuZXJhbCByb3V0aW5lcyB0aGF0IGNhbiBiZSBjYWxsZWQgYW55dGltZSBhZnRlciB0aGUgSW5pdCBpcyBjYWxsZWQuCi0gKi8KLUVYVEVSTiBpbnQgZGVmd0N1cnJlbnRMaW5lTnVtYmVyICgpOwotCi0vKgotICogZXh0ZXJuIHZvaWQgZGVmd0Vycm9yICggY29uc3QgY2hhciAqLCAuLi4gKTsKLSAqIGV4dGVybiB2b2lkIGRlZndXYXJuaW5nICggY29uc3QgY2hhciAqLCAuLi4gKTsKLSAqIGV4dGVybiB2b2lkIGRlZndWRXJyb3IgKCBjb25zdCBjaGFyICosIHZhX2xpc3QgKTsKLSAqIGV4dGVybiB2b2lkIGRlZndWV2FybmluZyAoIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCApOwotICogZXh0ZXJuIGludCAgZGVmd0dldEN1cnJlbnRMaW5lTnVtYmVyICh2b2lkKTsKLSAqIGV4dGVybiBjb25zdCBjaGFyICpkZWZ3R2V0Q3VycmVudEZpbGVOYW1lICh2b2lkKTsKLSAqLwotCi0vKiBUaGlzIHJvdXRpbmUgd2lsbCBwcmludCB0aGUgZXJyb3IgbWVzc2FnZS4gKi8KLUVYVEVSTiB2b2lkIGRlZndQcmludEVycm9yIChpbnQgIHN0YXR1cyk7Ci0KLS8qIFRoaXMgcm91dGluZSB3aWxsIGFsbG93IHVzZXIgdG8gd3JpdGUgdGhlaXIgb3duIGNvbWVtbnQuICBJdCB3aWxsCi0gKiBhdXRvbWFjdGljYWxseSBhZGQgYSAjIGluZnJvbnQgb2YgdGhlIGxpbmUuCi0gKi8KLUVYVEVSTiB2b2lkIGRlZndBZGRDb21tZW50IChjb25zdCBjaGFyKiAgY29tbWVudCk7Ci0KLS8qIFRoaXMgcm91dGluZSB3aWxsIGluZGVudCAzIGJsYW5rIHNwYWNlcyAqLwotRVhURVJOIHZvaWQgZGVmd0FkZEluZGVudCAoKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi9kZWZ3V3JpdGVyQ2FsbHMuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZndXcml0ZXJDYWxscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWU2ZDRlLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL2RlZndXcml0ZXJDYWxscy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQ29weXJpZ2h0IDIwMTMtMjAxNCwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZSAgICAgICAgICAgICAqLwotLyogRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAqLwotLyogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgKi8KLS8qICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAqLwotLyogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgKi8KLS8qICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgICAgICovCi0vKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgICAgICAqLwotLyogICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LCAgICAgICAgICAqLwotLyogY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJEF1dGhvcjogZGVsbCAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJFJldmlzaW9uOiAjMSAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICREYXRlOiAyMDE3LzA2LzA2ICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkU3RhdGU6ICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotCi0jaWZuZGVmIENERUZXV1JJVEVSQ0FMTFNfSAotI2RlZmluZSBDREVGV1dSSVRFUkNBTExTX0gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiZGVmaVR5cGVkZWZzLmgiCi0KLS8qCi0gKiBUaGUgbWFpbiB3cml0ZXIgZnVuY3Rpb24uCi0gKiBUaGUgZmlsZSBzaG91bGQgYWxyZWFkeSBiZSBvcGVuZWQuICBUaGlzIHJlcXVpcmVtZW50IGFsbG93cwotICogdGhlIHdyaXRlciB0byBiZSB1c2VkIHdpdGggc3RkaW4gb3IgYSBwaXBlLiAgVGhlIGZpbGUgbmFtZQotICogaXMgb25seSB1c2VkIGZvciBlcnJvciBtZXNzYWdlcy4gIFRoZSBpbmNsdWRlU2VhcmNoUGF0aCBpcwotICogYSBjb2xvbi1kZWxpbWl0ZWQgbGlzdCBvZiBkaXJlY3RvcmllcyBpbiB3aGljaCB0byBmaW5kCi0gKiBpbmNsdWRlIGZpbGVzLgotICovCi1FWFRFUk4gaW50IGRlZndXcml0ZSAoRklMRSAqIGZpbGUsIGNvbnN0IGNoYXIgKiBmaWxlTmFtZSwgZGVmaVVzZXJEYXRhICB1c2VyRGF0YSk7Ci0KLS8qCi0gKiBTZXQgYWxsIG9mIHRoZSBjYWxsYmFja3MgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBzZXQgdG8gYSBmdW5jdGlvbgotICogdGhhdCB3aWxsIGFkZCB1cCBob3cgbWFueSB0aW1lcyBhIGdpdmVuIGRlZiBkYXRhIHR5cGUgd2FzIGlnbm9yZWQKLSAqIChpZSBubyBjYWxsYmFjayB3YXMgZG9uZSkuICBUaGUgc3RhdGlzdGljcyBjYW4gbGF0ZXIgYmUgcHJpbnRlZCBvdXQuCi0gKi8KLUVYVEVSTiB2b2lkIGRlZndTZXRSZWdpc3RlclVudXNlZENhbGxiYWNrcyAoKTsKLUVYVEVSTiB2b2lkIGRlZndQcmludFVudXNlZENhbGxiYWNrcyAoRklMRSogIGxvZyk7Ci0KLS8qCi0gKiBTZXQvZ2V0IHRoZSBjbGllbnQtcHJvdmlkZWQgdXNlciBkYXRhLiAgZGVmaSBkb2Vzbid0IGxvb2sgYXQKLSAqIHRoaXMgZGF0YSBhdCBhbGwsIGl0IHNpbXBseSBwYXNzZXMgdGhlIG9wYXF1ZSBkZWZpVXNlckRhdGEgcG9pbnRlcgotICogYmFjayB0byB0aGUgYXBwbGljYXRpb24gd2l0aCBlYWNoIGNhbGxiYWNrLiAgVGhlIGNsaWVudCBjYW4KLSAqIGNoYW5nZSB0aGUgZGF0YSBhdCBhbnkgdGltZSwgYW5kIGl0IHdpbGwgdGFrZSBlZmZlY3Qgb24gdGhlCi0gKiBuZXh0IGNhbGxiYWNrLiAgVGhlIGRlZmkgd3JpdGVyIGFuZCB3cml0ZXIgbWFpbnRhaW4gc2VwYXJhdGUKLSAqIHVzZXIgZGF0YSBwb2ludGVycy4KLSAqLwotRVhURVJOIHZvaWQgZGVmd1NldFVzZXJEYXRhIChkZWZpVXNlckRhdGEgIHAwKTsKLUVYVEVSTiBkZWZpVXNlckRhdGEgZGVmd0dldFVzZXJEYXRhICgpOwotCi0vKgotICogQW4gZW51bSBkZXNjcmliaW5nIGFsbCBvZiB0aGUgdHlwZXMgb2Ygd3JpdGVyIGNhbGxiYWNrcy4KLSAqLwotdHlwZWRlZiBlbnVtIHsKLSAgZGVmd1Vuc3BlY2lmaWVkQ2JrVHlwZSA9IDAsCi0gIGRlZndWZXJzaW9uQ2JrVHlwZSA9IDEsCi0gIGRlZndDYXNlU2Vuc2l0aXZlQ2JrVHlwZSA9IDIsCi0gIGRlZndCdXNCaXRDYmtUeXBlID0gMywKLSAgZGVmd0RpdmlkZXJDYmtUeXBlID0gNCwKLSAgZGVmd0Rlc2lnbkNia1R5cGUgPSA1LAotICBkZWZ3VGVjaENia1R5cGUgPSA2LAotICBkZWZ3QXJyYXlDYmtUeXBlID0gNywKLSAgZGVmd0Zsb29yUGxhbkNia1R5cGUgPSA4LAotICBkZWZ3VW5pdHNDYmtUeXBlID0gOSwKLSAgZGVmd0hpc3RvcnlDYmtUeXBlID0gMTAsCi0gIGRlZndQcm9wRGVmQ2JrVHlwZSA9IDExLAotICBkZWZ3RGllQXJlYUNia1R5cGUgPSAxMiwKLSAgZGVmd1Jvd0Nia1R5cGUgPSAxMywKLSAgZGVmd1RyYWNrQ2JrVHlwZSA9IDE0LAotICBkZWZ3R2NlbGxHcmlkQ2JrVHlwZSA9IDE1LAotICBkZWZ3RGVmYXVsdENhcENia1R5cGUgPSAxNiwKLSAgZGVmd0NhbnBsYWNlQ2JrVHlwZSA9IDE3LAotICBkZWZ3Q2Fubm90T2NjdXB5Q2JrVHlwZSA9IDE4LAotICBkZWZ3VmlhQ2JrVHlwZSA9IDE5LAotICBkZWZ3UmVnaW9uQ2JrVHlwZSA9IDIwLAotICBkZWZ3Q29tcG9uZW50Q2JrVHlwZSA9IDIxLAotICBkZWZ3UGluQ2JrVHlwZSA9IDIyLAotICBkZWZ3UGluUHJvcENia1R5cGUgPSAyMywKLSAgZGVmd1NOZXRDYmtUeXBlID0gMjQsCi0gIGRlZndOZXRDYmtUeXBlID0gMjUsCi0gIGRlZndJT1RpbWluZ0Nia1R5cGUgPSAyNiwKLSAgZGVmd1NjYW5jaGFpbkNia1R5cGUgPSAyNywKLSAgZGVmd0NvbnN0cmFpbnRDYmtUeXBlID0gMjgsCi0gIGRlZndBc3NlcnRpb25DYmtUeXBlID0gMjksCi0gIGRlZndHcm91cENia1R5cGUgPSAzMCwKLSAgZGVmd0Jsb2NrYWdlQ2JrVHlwZSA9IDMxLAotICBkZWZ3RXh0Q2JrVHlwZSA9IDMyLAotICBkZWZ3RGVzaWduRW5kQ2JrVHlwZSA9IDMzCi0KLSAgLyogTkVXIENBTExCQUNLUyAtIGVhY2ggY2FsbGJhY2sgaGFzIGl0cyBvd24gdHlwZS4gIEZvciBlYWNoIGNhbGxiYWNrCi0gICAqIHRoYXQgeW91IGFkZCwgeW91IG11c3QgYWRkIGFuIGl0ZW0gdG8gdGhpcyBlbnVtLiAqLwotCi19IGRlZndDYWxsYmFja1R5cGVfZTsKLQotLyogRGVjbGFyYXRpb25zIG9mIGZ1bmN0aW9uIHNpZ25hdHVyZXMgZm9yIGVhY2ggdHlwZSBvZiBjYWxsYmFjay4KLSAqIFRoZXNlIGRlY2xhcmF0aW9ucyBhcmUgdHlwZS1zYWZlIHdoZW4gY29tcGlsaW5nIHdpdGggQU5TSSBDCi0gKiBvciBDKys7IHlvdSB3aWxsIG9ubHkgYmUgYWJsZSB0byByZWdpc3RlciBhIGZ1bmN0aW9uIHBvaW50ZXIKLSAqIHdpdGggdGhlIGNvcnJlY3Qgc2lnbmF0dXJlIGZvciBhIGdpdmVuIHR5cGUgb2YgY2FsbGJhY2suCi0gKgotICogRWFjaCBjYWxsYmFjayBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byByZXR1cm4gMCBpZiBzdWNjZXNzZnVsLgotICogQSBub24temVybyByZXR1cm4gY29kZSB3aWxsIGNhdXNlIHRoZSB3cml0ZXIgdG8gYWJvcnQuCi0gKgotICogVGhlIGRlZndEZXNpZ25TdGFydCBhbmQgZGVmd0Rlc2lnbkVuZCBjYWxsYmFjayBpcyBvbmx5IGNhbGxlZCBvbmNlLgotICogT3RoZXIgY2FsbGJhY2tzIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMsIGVhY2ggdGltZSB3aXRoIGEgZGlmZmVyZW50Ci0gKiBzZXQgb2YgZGF0YS4KLSAqCi0gKiBGb3IgZWFjaCBjYWxsYmFjaywgdGhlIERlZiBBUEkgd2lsbCBtYWtlIHRoZSBjYWxsYmFjayB0byB0aGUKLSAqIGZ1bmN0aW9uIHN1cHBsaWVkIGJ5IHRoZSBjbGllbnQsIHdoaWNoIHNob3VsZCBlaXRoZXIgbWFrZSBhIGNvcHkKLSAqIG9mIHRoZSBEZWYgb2JqZWN0LCBvciBzdG9yZSB0aGUgZGF0YSBpbiB0aGUgY2xpZW50J3Mgb3duIGRhdGEgc3RydWN0dXJlcy4KLSAqIFRoZSBEZWYgQVBJIHdpbGwgZGVsZXRlIG9yIHJldXNlIGVhY2ggb2JqZWN0IGFmdGVyIG1ha2luZyB0aGUgY2FsbGJhY2ssCi0gKiBzbyB0aGUgY2xpZW50IHNob3VsZCBub3Qga2VlcCBhIHBvaW50ZXIgdG8gaXQuCi0gKgotICogQWxsIGNhbGxiYWNrcyBwYXNzIHRoZSB1c2VyIGRhdGEgcG9pbnRlciBwcm92aWRlZCBpbiBkZWZ3UmVhZCgpCi0gKiBvciBkZWZ3U2V0VXNlckRhdGEoKSBiYWNrIHRvIHRoZSBjbGllbnQ7IHRoaXMgY2FuIGJlIHVzZWQgYnkgdGhlCi0gKiBjbGllbnQgdG8gb2J0YWluIGFjY2VzcyB0byB0aGUgcmVzdCBvZiB0aGUgY2xpZW50J3MgZGF0YSBzdHJ1Y3R1cmVzLgotICoKLSAqIFRoZSB1c2VyIGRhdGEgcG9pbnRlciBpcyBvYnRhaW5lZCB1c2luZyBkZWZ3R2V0VXNlckRhdGEoKSBpbW1lZGlhdGVseQotICogcHJpb3IgdG8gbWFraW5nIGVhY2ggY2FsbGJhY2ssIHNvIHRoZSBjbGllbnQgaXMgZnJlZSB0byBjaGFuZ2UgdGhlCi0gKiB1c2VyIGRhdGEgb24gdGhlIGZseSBpZiBuZWNlc3NhcnkuCi0gKgotICogQ2FsbGJhY2tzIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGFyZSBwYXNzZWQgYSBjYWxsYmFjayB0eXBlCi0gKiBwYXJhbWV0ZXIsIHdoaWNoIGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byB3cml0ZSBhIHNpbmdsZSBjYWxsYmFjawotICogZnVuY3Rpb24sIHJlZ2lzdGVyIHRoYXQgZnVuY3Rpb24gZm9yIG11bHRpcGxlIGNhbGxiYWNrcywgdGhlbgotICogc3dpdGNoIGJhc2VkIG9uIHRoZSBjYWxsYmFjayB0eXBlIHRvIGhhbmRsZSB0aGUgYXBwcm9wcmlhdGUgdHlwZSBvZgotICogZGF0YS4KLSAqLwotCi0vKiBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBub3RoaW5nLiAqLwotdHlwZWRlZiBpbnQgKCpkZWZ3Vm9pZENia0ZuVHlwZSkgKCBkZWZ3Q2FsbGJhY2tUeXBlX2UsIGRlZmlVc2VyRGF0YSApOwotCi0vKiBGdW5jdGlvbnMgdG8gY2FsbCB0byByZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uLgotICovCi1FWFRFUk4gdm9pZCBkZWZ3U2V0QXJyYXlDYmsgKGRlZndWb2lkQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZndTZXRBc3NlcnRpb25DYmsgKGRlZndWb2lkQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZndTZXRCbG9ja2FnZUNiayAoZGVmd1ZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmd1NldEJ1c0JpdENiayAoZGVmd1ZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmd1NldENhbm5vdE9jY3VweUNiayAoZGVmd1ZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmd1NldENhbnBsYWNlQ2JrIChkZWZ3Vm9pZENia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZ3U2V0Q2FzZVNlbnNpdGl2ZUNiayAoZGVmd1ZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmd1NldENvbXBvbmVudENiayAoZGVmd1ZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmd1NldENvbnN0cmFpbnRDYmsgKGRlZndWb2lkQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZndTZXREZWZhdWx0Q2FwQ2JrIChkZWZ3Vm9pZENia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZ3U2V0RGVzaWduQ2JrIChkZWZ3Vm9pZENia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZ3U2V0RGVzaWduRW5kQ2JrIChkZWZ3Vm9pZENia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZ3U2V0RGllQXJlYUNiayAoZGVmd1ZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmd1NldERpdmlkZXJDYmsgKGRlZndWb2lkQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZndTZXRFeHRDYmsgKGRlZndWb2lkQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZndTZXRGbG9vclBsYW5DYmsgKGRlZndWb2lkQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZndTZXRHY2VsbEdyaWRDYmsgKGRlZndWb2lkQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZndTZXRHcm91cENiayAoZGVmd1ZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmd1NldEhpc3RvcnlDYmsgKGRlZndWb2lkQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZndTZXRJT1RpbWluZ0NiayAoZGVmd1ZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmd1NldE5ldENiayAoZGVmd1ZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmd1NldFBpbkNiayAoZGVmd1ZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmd1NldFBpblByb3BDYmsgKGRlZndWb2lkQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZndTZXRQcm9wRGVmQ2JrIChkZWZ3Vm9pZENia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZ3U2V0UmVnaW9uQ2JrIChkZWZ3Vm9pZENia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZ3U2V0Um93Q2JrIChkZWZ3Vm9pZENia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZ3U2V0U05ldENiayAoZGVmd1ZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmd1NldFNjYW5jaGFpbkNiayAoZGVmd1ZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmd1NldFRlY2hub2xvZ3lDYmsgKGRlZndWb2lkQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGRlZndTZXRUcmFja0NiayAoZGVmd1ZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmd1NldFVuaXRzQ2JrIChkZWZ3Vm9pZENia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBkZWZ3U2V0VmVyc2lvbkNiayAoZGVmd1ZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgZGVmd1NldFZpYUNiayAoZGVmd1ZvaWRDYmtGblR5cGUgcDApOwotCi0vKiBORVcgQ0FMTEJBQ0sgLSBlYWNoIGNhbGxiYWNrIG11c3QgaGF2ZSBhIGZ1bmN0aW9uIHRvIGFsbG93IHRoZSB1c2VyCi0gKiB0byBzZXQgaXQuICBBZGQgdGhlIGZ1bmN0aW9uIGhlcmUuICovCi0KLS8qCi0gKiBTZXQgYWxsIG9mIHRoZSBjYWxsYmFja3MgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBzZXQgdG8gdGhlIGZvbGxvd2luZwotICogZnVuY3Rpb24uICBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGNoZWNrIHRvIHNlZQotICogaWYgeW91IGZvcmdvdCBhbnl0aGluZy4KLSAqLwotRVhURVJOIHZvaWQgZGVmd1NldFVudXNlZENhbGxiYWNrcyAoZGVmd1ZvaWRDYmtGblR5cGUgIGZ1bmMpOwotCi0vKiBSb3V0aW5lIHRvIHNldCB0aGUgbWVzc2FnZSBsb2dnaW5nIHJvdXRpbmUgZm9yIGVycm9ycyAqLwotICAgIHR5cGVkZWYgdm9pZCAoKkRFRklfTE9HX0ZVTkNUSU9OKSAoY29uc3QgY2hhciopOwotCi1FWFRFUk4gdm9pZCBkZWZ3U2V0TG9nRnVuY3Rpb24gKERFRklfTE9HX0ZVTkNUSU9OICBwMCk7Ci0KLS8qIFJvdXRpbmUgdG8gc2V0IHRoZSBtZXNzYWdlIGxvZ2dpbmcgcm91dGluZSBmb3Igd2FybmluZ3MgKi8KLSNpZm5kZWYgREVGSV9XQVJOSU5HX0xPR19GVU5DVElPTgotICAgIHR5cGVkZWYgdm9pZCAoKkRFRklfV0FSTklOR19MT0dfRlVOQ1RJT04pKGNvbnN0IGNoYXIqKTsKLSNlbmRpZgotCi1FWFRFUk4gdm9pZCBkZWZ3U2V0V2FybmluZ0xvZ0Z1bmN0aW9uIChERUZJX1dBUk5JTkdfTE9HX0ZVTkNUSU9OICBwMCk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYveGRlZmlBc3NlcnRpb24uY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYveGRlZmlBc3NlcnRpb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDUwMGU5Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZpQXNzZXJ0aW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIEFUVEVOVElPTjogVEhJUyBJUyBBTiBBVVRPLUdFTkVSQVRFRCBGSUxFLiBETyBOT1QgQ0hBTkdFIElUIQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiB4eHggJAotLy8gICRSZXZpc2lvbjogeHh4ICQKLS8vICAkRGF0ZTogeHh4ICQKLS8vICAkU3RhdGU6IHh4eCAkICAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jZGVmaW5lIEVYVEVSTiBleHRlcm4gIkMiCi0KLSNpbmNsdWRlICJkZWZpQXNzZXJ0aW9uLmgiCi0jaW5jbHVkZSAiZGVmaUFzc2VydGlvbi5ocHAiCi0KLS8vIFdyYXBwZXJzIGRlZmluaXRpb25zLgotaW50IGRlZmlBc3NlcnRpb25faXNBc3NlcnRpb24gKGNvbnN0IDo6ZGVmaUFzc2VydGlvbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpQXNzZXJ0aW9uKilvYmopLT5pc0Fzc2VydGlvbigpOwotfQotCi1pbnQgZGVmaUFzc2VydGlvbl9pc0NvbnN0cmFpbnQgKGNvbnN0IDo6ZGVmaUFzc2VydGlvbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpQXNzZXJ0aW9uKilvYmopLT5pc0NvbnN0cmFpbnQoKTsKLX0KLQotaW50IGRlZmlBc3NlcnRpb25faXNXaXJlZGxvZ2ljIChjb25zdCA6OmRlZmlBc3NlcnRpb24qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUFzc2VydGlvbiopb2JqKS0+aXNXaXJlZGxvZ2ljKCk7Ci19Ci0KLWludCBkZWZpQXNzZXJ0aW9uX2lzRGVsYXkgKGNvbnN0IDo6ZGVmaUFzc2VydGlvbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpQXNzZXJ0aW9uKilvYmopLT5pc0RlbGF5KCk7Ci19Ci0KLWludCBkZWZpQXNzZXJ0aW9uX2lzU3VtIChjb25zdCA6OmRlZmlBc3NlcnRpb24qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUFzc2VydGlvbiopb2JqKS0+aXNTdW0oKTsKLX0KLQotaW50IGRlZmlBc3NlcnRpb25faXNEaWZmIChjb25zdCA6OmRlZmlBc3NlcnRpb24qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUFzc2VydGlvbiopb2JqKS0+aXNEaWZmKCk7Ci19Ci0KLWludCBkZWZpQXNzZXJ0aW9uX2hhc1Jpc2VNaW4gKGNvbnN0IDo6ZGVmaUFzc2VydGlvbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpQXNzZXJ0aW9uKilvYmopLT5oYXNSaXNlTWluKCk7Ci19Ci0KLWludCBkZWZpQXNzZXJ0aW9uX2hhc1Jpc2VNYXggKGNvbnN0IDo6ZGVmaUFzc2VydGlvbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpQXNzZXJ0aW9uKilvYmopLT5oYXNSaXNlTWF4KCk7Ci19Ci0KLWludCBkZWZpQXNzZXJ0aW9uX2hhc0ZhbGxNaW4gKGNvbnN0IDo6ZGVmaUFzc2VydGlvbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpQXNzZXJ0aW9uKilvYmopLT5oYXNGYWxsTWluKCk7Ci19Ci0KLWludCBkZWZpQXNzZXJ0aW9uX2hhc0ZhbGxNYXggKGNvbnN0IDo6ZGVmaUFzc2VydGlvbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpQXNzZXJ0aW9uKilvYmopLT5oYXNGYWxsTWF4KCk7Ci19Ci0KLWRvdWJsZSBkZWZpQXNzZXJ0aW9uX3Jpc2VNaW4gKGNvbnN0IDo6ZGVmaUFzc2VydGlvbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpQXNzZXJ0aW9uKilvYmopLT5yaXNlTWluKCk7Ci19Ci0KLWRvdWJsZSBkZWZpQXNzZXJ0aW9uX3Jpc2VNYXggKGNvbnN0IDo6ZGVmaUFzc2VydGlvbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpQXNzZXJ0aW9uKilvYmopLT5yaXNlTWF4KCk7Ci19Ci0KLWRvdWJsZSBkZWZpQXNzZXJ0aW9uX2ZhbGxNaW4gKGNvbnN0IDo6ZGVmaUFzc2VydGlvbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpQXNzZXJ0aW9uKilvYmopLT5mYWxsTWluKCk7Ci19Ci0KLWRvdWJsZSBkZWZpQXNzZXJ0aW9uX2ZhbGxNYXggKGNvbnN0IDo6ZGVmaUFzc2VydGlvbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpQXNzZXJ0aW9uKilvYmopLT5mYWxsTWF4KCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlBc3NlcnRpb25fbmV0TmFtZSAoY29uc3QgOjpkZWZpQXNzZXJ0aW9uKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlBc3NlcnRpb24qKW9iaiktPm5ldE5hbWUoKTsKLX0KLQotZG91YmxlIGRlZmlBc3NlcnRpb25fZGlzdGFuY2UgKGNvbnN0IDo6ZGVmaUFzc2VydGlvbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpQXNzZXJ0aW9uKilvYmopLT5kaXN0YW5jZSgpOwotfQotCi1pbnQgZGVmaUFzc2VydGlvbl9udW1JdGVtcyAoY29uc3QgOjpkZWZpQXNzZXJ0aW9uKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlBc3NlcnRpb24qKW9iaiktPm51bUl0ZW1zKCk7Ci19Ci0KLWludCBkZWZpQXNzZXJ0aW9uX2lzUGF0aCAoY29uc3QgOjpkZWZpQXNzZXJ0aW9uKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlBc3NlcnRpb24qKW9iaiktPmlzUGF0aChpbmRleCk7Ci19Ci0KLWludCBkZWZpQXNzZXJ0aW9uX2lzTmV0IChjb25zdCA6OmRlZmlBc3NlcnRpb24qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUFzc2VydGlvbiopb2JqKS0+aXNOZXQoaW5kZXgpOwotfQotCi12b2lkIGRlZmlBc3NlcnRpb25fcGF0aCAoY29uc3QgOjpkZWZpQXNzZXJ0aW9uKiBvYmosIGludCAgaW5kZXgsIGNoYXIqKiAgZnJvbUluc3QsIGNoYXIqKiAgZnJvbVBpbiwgY2hhcioqICB0b0luc3QsIGNoYXIqKiAgdG9QaW4pIHsKLSAgICAoKExlZkRlZlBhcnNlcjo6ZGVmaUFzc2VydGlvbiopb2JqKS0+cGF0aChpbmRleCwgZnJvbUluc3QsIGZyb21QaW4sIHRvSW5zdCwgdG9QaW4pOwotfQotCi12b2lkIGRlZmlBc3NlcnRpb25fbmV0IChjb25zdCA6OmRlZmlBc3NlcnRpb24qIG9iaiwgaW50ICBpbmRleCwgY2hhcioqICBuZXROYW1lKSB7Ci0gICAgKChMZWZEZWZQYXJzZXI6OmRlZmlBc3NlcnRpb24qKW9iaiktPm5ldChpbmRleCwgbmV0TmFtZSk7Ci19Ci0KLXZvaWQgZGVmaUFzc2VydGlvbl9wcmludCAoY29uc3QgOjpkZWZpQXNzZXJ0aW9uKiBvYmosIEZJTEUqICBmKSB7Ci0gICAgKChMZWZEZWZQYXJzZXI6OmRlZmlBc3NlcnRpb24qKW9iaiktPnByaW50KGYpOwotfQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi94ZGVmaUJsb2NrYWdlLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZpQmxvY2thZ2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODAwMzU1Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZpQmxvY2thZ2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IHh4eCAkCi0vLyAgJFJldmlzaW9uOiB4eHggJAotLy8gICREYXRlOiB4eHggJAotLy8gICRTdGF0ZTogeHh4ICQgIAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNkZWZpbmUgRVhURVJOIGV4dGVybiAiQyIKLQotI2luY2x1ZGUgImRlZmlCbG9ja2FnZS5oIgotI2luY2x1ZGUgImRlZmlCbG9ja2FnZS5ocHAiCi0KLS8vIFdyYXBwZXJzIGRlZmluaXRpb25zLgotaW50IGRlZmlCbG9ja2FnZV9oYXNMYXllciAoY29uc3QgOjpkZWZpQmxvY2thZ2UqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUJsb2NrYWdlKilvYmopLT5oYXNMYXllcigpOwotfQotCi1pbnQgZGVmaUJsb2NrYWdlX2hhc1BsYWNlbWVudCAoY29uc3QgOjpkZWZpQmxvY2thZ2UqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUJsb2NrYWdlKilvYmopLT5oYXNQbGFjZW1lbnQoKTsKLX0KLQotaW50IGRlZmlCbG9ja2FnZV9oYXNDb21wb25lbnQgKGNvbnN0IDo6ZGVmaUJsb2NrYWdlKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlCbG9ja2FnZSopb2JqKS0+aGFzQ29tcG9uZW50KCk7Ci19Ci0KLWludCBkZWZpQmxvY2thZ2VfaGFzU2xvdHMgKGNvbnN0IDo6ZGVmaUJsb2NrYWdlKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlCbG9ja2FnZSopb2JqKS0+aGFzU2xvdHMoKTsKLX0KLQotaW50IGRlZmlCbG9ja2FnZV9oYXNGaWxscyAoY29uc3QgOjpkZWZpQmxvY2thZ2UqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUJsb2NrYWdlKilvYmopLT5oYXNGaWxscygpOwotfQotCi1pbnQgZGVmaUJsb2NrYWdlX2hhc1B1c2hkb3duIChjb25zdCA6OmRlZmlCbG9ja2FnZSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpQmxvY2thZ2UqKW9iaiktPmhhc1B1c2hkb3duKCk7Ci19Ci0KLWludCBkZWZpQmxvY2thZ2VfaGFzRXhjZXB0cGduZXQgKGNvbnN0IDo6ZGVmaUJsb2NrYWdlKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlCbG9ja2FnZSopb2JqKS0+aGFzRXhjZXB0cGduZXQoKTsKLX0KLQotaW50IGRlZmlCbG9ja2FnZV9oYXNTb2Z0IChjb25zdCA6OmRlZmlCbG9ja2FnZSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpQmxvY2thZ2UqKW9iaiktPmhhc1NvZnQoKTsKLX0KLQotaW50IGRlZmlCbG9ja2FnZV9oYXNQYXJ0aWFsIChjb25zdCA6OmRlZmlCbG9ja2FnZSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpQmxvY2thZ2UqKW9iaiktPmhhc1BhcnRpYWwoKTsKLX0KLQotaW50IGRlZmlCbG9ja2FnZV9oYXNTcGFjaW5nIChjb25zdCA6OmRlZmlCbG9ja2FnZSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpQmxvY2thZ2UqKW9iaiktPmhhc1NwYWNpbmcoKTsKLX0KLQotaW50IGRlZmlCbG9ja2FnZV9oYXNEZXNpZ25SdWxlV2lkdGggKGNvbnN0IDo6ZGVmaUJsb2NrYWdlKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlCbG9ja2FnZSopb2JqKS0+aGFzRGVzaWduUnVsZVdpZHRoKCk7Ci19Ci0KLWludCBkZWZpQmxvY2thZ2VfaGFzTWFzayAoY29uc3QgOjpkZWZpQmxvY2thZ2UqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUJsb2NrYWdlKilvYmopLT5oYXNNYXNrKCk7Ci19Ci0KLWludCBkZWZpQmxvY2thZ2VfbWFzayAoY29uc3QgOjpkZWZpQmxvY2thZ2UqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUJsb2NrYWdlKilvYmopLT5tYXNrKCk7Ci19Ci0KLWludCBkZWZpQmxvY2thZ2VfbWluU3BhY2luZyAoY29uc3QgOjpkZWZpQmxvY2thZ2UqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUJsb2NrYWdlKilvYmopLT5taW5TcGFjaW5nKCk7Ci19Ci0KLWludCBkZWZpQmxvY2thZ2VfZGVzaWduUnVsZVdpZHRoIChjb25zdCA6OmRlZmlCbG9ja2FnZSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpQmxvY2thZ2UqKW9iaiktPmRlc2lnblJ1bGVXaWR0aCgpOwotfQotCi1kb3VibGUgZGVmaUJsb2NrYWdlX3BsYWNlbWVudE1heERlbnNpdHkgKGNvbnN0IDo6ZGVmaUJsb2NrYWdlKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlCbG9ja2FnZSopb2JqKS0+cGxhY2VtZW50TWF4RGVuc2l0eSgpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpQmxvY2thZ2VfbGF5ZXJOYW1lIChjb25zdCA6OmRlZmlCbG9ja2FnZSogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpQmxvY2thZ2UqKW9iaiktPmxheWVyTmFtZSgpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpQmxvY2thZ2VfbGF5ZXJDb21wb25lbnROYW1lIChjb25zdCA6OmRlZmlCbG9ja2FnZSogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpQmxvY2thZ2UqKW9iaiktPmxheWVyQ29tcG9uZW50TmFtZSgpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpQmxvY2thZ2VfcGxhY2VtZW50Q29tcG9uZW50TmFtZSAoY29uc3QgOjpkZWZpQmxvY2thZ2UqIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaUJsb2NrYWdlKilvYmopLT5wbGFjZW1lbnRDb21wb25lbnROYW1lKCk7Ci19Ci0KLWludCBkZWZpQmxvY2thZ2VfbnVtUmVjdGFuZ2xlcyAoY29uc3QgOjpkZWZpQmxvY2thZ2UqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUJsb2NrYWdlKilvYmopLT5udW1SZWN0YW5nbGVzKCk7Ci19Ci0KLWludCBkZWZpQmxvY2thZ2VfeGwgKGNvbnN0IDo6ZGVmaUJsb2NrYWdlKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlCbG9ja2FnZSopb2JqKS0+eGwoaW5kZXgpOwotfQotCi1pbnQgZGVmaUJsb2NrYWdlX3lsIChjb25zdCA6OmRlZmlCbG9ja2FnZSogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpQmxvY2thZ2UqKW9iaiktPnlsKGluZGV4KTsKLX0KLQotaW50IGRlZmlCbG9ja2FnZV94aCAoY29uc3QgOjpkZWZpQmxvY2thZ2UqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUJsb2NrYWdlKilvYmopLT54aChpbmRleCk7Ci19Ci0KLWludCBkZWZpQmxvY2thZ2VfeWggKGNvbnN0IDo6ZGVmaUJsb2NrYWdlKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlCbG9ja2FnZSopb2JqKS0+eWgoaW5kZXgpOwotfQotCi1pbnQgZGVmaUJsb2NrYWdlX251bVBvbHlnb25zIChjb25zdCA6OmRlZmlCbG9ja2FnZSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpQmxvY2thZ2UqKW9iaiktPm51bVBvbHlnb25zKCk7Ci19Ci0KLTo6ZGVmaVBvaW50cyBkZWZpQmxvY2thZ2VfZ2V0UG9seWdvbiAoY29uc3QgOjpkZWZpQmxvY2thZ2UqIG9iaiwgaW50ICBpbmRleCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmaVBvaW50cyB0bXA7Ci0gICAgdG1wID0gKChMZWZEZWZQYXJzZXI6OmRlZmlCbG9ja2FnZSopb2JqKS0+Z2V0UG9seWdvbihpbmRleCk7Ci0gICAgcmV0dXJuICooKDo6ZGVmaVBvaW50cyopJnRtcCk7Ci19Ci0KLXZvaWQgZGVmaUJsb2NrYWdlX3ByaW50IChjb25zdCA6OmRlZmlCbG9ja2FnZSogb2JqLCBGSUxFKiAgZikgewotICAgICgoTGVmRGVmUGFyc2VyOjpkZWZpQmxvY2thZ2UqKW9iaiktPnByaW50KGYpOwotfQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi94ZGVmaUNvbXBvbmVudC5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi94ZGVmaUNvbXBvbmVudC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwODk2ZGUuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYveGRlZmlDb21wb25lbnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IHh4eCAkCi0vLyAgJFJldmlzaW9uOiB4eHggJAotLy8gICREYXRlOiB4eHggJAotLy8gICRTdGF0ZTogeHh4ICQgIAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNkZWZpbmUgRVhURVJOIGV4dGVybiAiQyIKLQotI2luY2x1ZGUgImRlZmlDb21wb25lbnQuaCIKLSNpbmNsdWRlICJkZWZpQ29tcG9uZW50LmhwcCIKLQotLy8gV3JhcHBlcnMgZGVmaW5pdGlvbnMuCi1pbnQgZGVmaUNvbXBvbmVudE1hc2tTaGlmdExheWVyX251bU1hc2tTaGlmdExheWVycyAoY29uc3QgOjpkZWZpQ29tcG9uZW50TWFza1NoaWZ0TGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUNvbXBvbmVudE1hc2tTaGlmdExheWVyKilvYmopLT5udW1NYXNrU2hpZnRMYXllcnMoKTsKLX0KLQotY29uc3QgY2hhciogZGVmaUNvbXBvbmVudE1hc2tTaGlmdExheWVyX21hc2tTaGlmdExheWVyIChjb25zdCA6OmRlZmlDb21wb25lbnRNYXNrU2hpZnRMYXllciogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpQ29tcG9uZW50TWFza1NoaWZ0TGF5ZXIqKW9iaiktPm1hc2tTaGlmdExheWVyKGluZGV4KTsKLX0KLQotY29uc3QgY2hhciogZGVmaUNvbXBvbmVudF9pZCAoY29uc3QgOjpkZWZpQ29tcG9uZW50KiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlDb21wb25lbnQqKW9iaiktPmlkKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlDb21wb25lbnRfbmFtZSAoY29uc3QgOjpkZWZpQ29tcG9uZW50KiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlDb21wb25lbnQqKW9iaiktPm5hbWUoKTsKLX0KLQotaW50IGRlZmlDb21wb25lbnRfcGxhY2VtZW50U3RhdHVzIChjb25zdCA6OmRlZmlDb21wb25lbnQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUNvbXBvbmVudCopb2JqKS0+cGxhY2VtZW50U3RhdHVzKCk7Ci19Ci0KLWludCBkZWZpQ29tcG9uZW50X2lzVW5wbGFjZWQgKGNvbnN0IDo6ZGVmaUNvbXBvbmVudCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpQ29tcG9uZW50KilvYmopLT5pc1VucGxhY2VkKCk7Ci19Ci0KLWludCBkZWZpQ29tcG9uZW50X2lzUGxhY2VkIChjb25zdCA6OmRlZmlDb21wb25lbnQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUNvbXBvbmVudCopb2JqKS0+aXNQbGFjZWQoKTsKLX0KLQotaW50IGRlZmlDb21wb25lbnRfaXNGaXhlZCAoY29uc3QgOjpkZWZpQ29tcG9uZW50KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlDb21wb25lbnQqKW9iaiktPmlzRml4ZWQoKTsKLX0KLQotaW50IGRlZmlDb21wb25lbnRfaXNDb3ZlciAoY29uc3QgOjpkZWZpQ29tcG9uZW50KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlDb21wb25lbnQqKW9iaiktPmlzQ292ZXIoKTsKLX0KLQotaW50IGRlZmlDb21wb25lbnRfcGxhY2VtZW50WCAoY29uc3QgOjpkZWZpQ29tcG9uZW50KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlDb21wb25lbnQqKW9iaiktPnBsYWNlbWVudFgoKTsKLX0KLQotaW50IGRlZmlDb21wb25lbnRfcGxhY2VtZW50WSAoY29uc3QgOjpkZWZpQ29tcG9uZW50KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlDb21wb25lbnQqKW9iaiktPnBsYWNlbWVudFkoKTsKLX0KLQotaW50IGRlZmlDb21wb25lbnRfcGxhY2VtZW50T3JpZW50IChjb25zdCA6OmRlZmlDb21wb25lbnQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUNvbXBvbmVudCopb2JqKS0+cGxhY2VtZW50T3JpZW50KCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlDb21wb25lbnRfcGxhY2VtZW50T3JpZW50U3RyIChjb25zdCA6OmRlZmlDb21wb25lbnQqIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaUNvbXBvbmVudCopb2JqKS0+cGxhY2VtZW50T3JpZW50U3RyKCk7Ci19Ci0KLWludCBkZWZpQ29tcG9uZW50X2hhc1JlZ2lvbk5hbWUgKGNvbnN0IDo6ZGVmaUNvbXBvbmVudCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpQ29tcG9uZW50KilvYmopLT5oYXNSZWdpb25OYW1lKCk7Ci19Ci0KLWludCBkZWZpQ29tcG9uZW50X2hhc1JlZ2lvbkJvdW5kcyAoY29uc3QgOjpkZWZpQ29tcG9uZW50KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlDb21wb25lbnQqKW9iaiktPmhhc1JlZ2lvbkJvdW5kcygpOwotfQotCi1pbnQgZGVmaUNvbXBvbmVudF9oYXNFRVEgKGNvbnN0IDo6ZGVmaUNvbXBvbmVudCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpQ29tcG9uZW50KilvYmopLT5oYXNFRVEoKTsKLX0KLQotaW50IGRlZmlDb21wb25lbnRfaGFzR2VuZXJhdGUgKGNvbnN0IDo6ZGVmaUNvbXBvbmVudCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpQ29tcG9uZW50KilvYmopLT5oYXNHZW5lcmF0ZSgpOwotfQotCi1pbnQgZGVmaUNvbXBvbmVudF9oYXNTb3VyY2UgKGNvbnN0IDo6ZGVmaUNvbXBvbmVudCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpQ29tcG9uZW50KilvYmopLT5oYXNTb3VyY2UoKTsKLX0KLQotaW50IGRlZmlDb21wb25lbnRfaGFzV2VpZ2h0IChjb25zdCA6OmRlZmlDb21wb25lbnQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUNvbXBvbmVudCopb2JqKS0+aGFzV2VpZ2h0KCk7Ci19Ci0KLWludCBkZWZpQ29tcG9uZW50X3dlaWdodCAoY29uc3QgOjpkZWZpQ29tcG9uZW50KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlDb21wb25lbnQqKW9iaiktPndlaWdodCgpOwotfQotCi1pbnQgZGVmaUNvbXBvbmVudF9tYXNrU2hpZnRTaXplIChjb25zdCA6OmRlZmlDb21wb25lbnQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUNvbXBvbmVudCopb2JqKS0+bWFza1NoaWZ0U2l6ZSgpOwotfQotCi1pbnQgZGVmaUNvbXBvbmVudF9tYXNrU2hpZnQgKGNvbnN0IDo6ZGVmaUNvbXBvbmVudCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpQ29tcG9uZW50KilvYmopLT5tYXNrU2hpZnQoaW5kZXgpOwotfQotCi1pbnQgZGVmaUNvbXBvbmVudF9oYXNOZXRzIChjb25zdCA6OmRlZmlDb21wb25lbnQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUNvbXBvbmVudCopb2JqKS0+aGFzTmV0cygpOwotfQotCi1pbnQgZGVmaUNvbXBvbmVudF9udW1OZXRzIChjb25zdCA6OmRlZmlDb21wb25lbnQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUNvbXBvbmVudCopb2JqKS0+bnVtTmV0cygpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpQ29tcG9uZW50X25ldCAoY29uc3QgOjpkZWZpQ29tcG9uZW50KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlDb21wb25lbnQqKW9iaiktPm5ldChpbmRleCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlDb21wb25lbnRfcmVnaW9uTmFtZSAoY29uc3QgOjpkZWZpQ29tcG9uZW50KiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlDb21wb25lbnQqKW9iaiktPnJlZ2lvbk5hbWUoKTsKLX0KLQotY29uc3QgY2hhciogZGVmaUNvbXBvbmVudF9zb3VyY2UgKGNvbnN0IDo6ZGVmaUNvbXBvbmVudCogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpQ29tcG9uZW50KilvYmopLT5zb3VyY2UoKTsKLX0KLQotY29uc3QgY2hhciogZGVmaUNvbXBvbmVudF9FRVEgKGNvbnN0IDo6ZGVmaUNvbXBvbmVudCogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpQ29tcG9uZW50KilvYmopLT5FRVEoKTsKLX0KLQotY29uc3QgY2hhciogZGVmaUNvbXBvbmVudF9nZW5lcmF0ZU5hbWUgKGNvbnN0IDo6ZGVmaUNvbXBvbmVudCogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpQ29tcG9uZW50KilvYmopLT5nZW5lcmF0ZU5hbWUoKTsKLX0KLQotY29uc3QgY2hhciogZGVmaUNvbXBvbmVudF9tYWNyb05hbWUgKGNvbnN0IDo6ZGVmaUNvbXBvbmVudCogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpQ29tcG9uZW50KilvYmopLT5tYWNyb05hbWUoKTsKLX0KLQotaW50IGRlZmlDb21wb25lbnRfaGFzSGFsbyAoY29uc3QgOjpkZWZpQ29tcG9uZW50KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlDb21wb25lbnQqKW9iaiktPmhhc0hhbG8oKTsKLX0KLQotaW50IGRlZmlDb21wb25lbnRfaGFzSGFsb1NvZnQgKGNvbnN0IDo6ZGVmaUNvbXBvbmVudCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpQ29tcG9uZW50KilvYmopLT5oYXNIYWxvU29mdCgpOwotfQotCi1pbnQgZGVmaUNvbXBvbmVudF9oYXNSb3V0ZUhhbG8gKGNvbnN0IDo6ZGVmaUNvbXBvbmVudCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpQ29tcG9uZW50KilvYmopLT5oYXNSb3V0ZUhhbG8oKTsKLX0KLQotaW50IGRlZmlDb21wb25lbnRfaGFsb0Rpc3QgKGNvbnN0IDo6ZGVmaUNvbXBvbmVudCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpQ29tcG9uZW50KilvYmopLT5oYWxvRGlzdCgpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpQ29tcG9uZW50X21pbkxheWVyIChjb25zdCA6OmRlZmlDb21wb25lbnQqIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaUNvbXBvbmVudCopb2JqKS0+bWluTGF5ZXIoKTsKLX0KLQotY29uc3QgY2hhciogZGVmaUNvbXBvbmVudF9tYXhMYXllciAoY29uc3QgOjpkZWZpQ29tcG9uZW50KiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlDb21wb25lbnQqKW9iaiktPm1heExheWVyKCk7Ci19Ci0KLXZvaWQgZGVmaUNvbXBvbmVudF9yZWdpb25Cb3VuZHMgKGNvbnN0IDo6ZGVmaUNvbXBvbmVudCogb2JqLCBpbnQqIHNpemUsIGludCoqICB4bCwgaW50KiogIHlsLCBpbnQqKiAgeGgsIGludCoqICB5aCkgewotICAgICgoTGVmRGVmUGFyc2VyOjpkZWZpQ29tcG9uZW50KilvYmopLT5yZWdpb25Cb3VuZHMoc2l6ZSwgeGwsIHlsLCB4aCwgeWgpOwotfQotCi1pbnQgZGVmaUNvbXBvbmVudF9oYXNGb3JlaWduTmFtZSAoY29uc3QgOjpkZWZpQ29tcG9uZW50KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlDb21wb25lbnQqKW9iaiktPmhhc0ZvcmVpZ25OYW1lKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlDb21wb25lbnRfZm9yZWlnbk5hbWUgKGNvbnN0IDo6ZGVmaUNvbXBvbmVudCogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpQ29tcG9uZW50KilvYmopLT5mb3JlaWduTmFtZSgpOwotfQotCi1pbnQgZGVmaUNvbXBvbmVudF9mb3JlaWduWCAoY29uc3QgOjpkZWZpQ29tcG9uZW50KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlDb21wb25lbnQqKW9iaiktPmZvcmVpZ25YKCk7Ci19Ci0KLWludCBkZWZpQ29tcG9uZW50X2ZvcmVpZ25ZIChjb25zdCA6OmRlZmlDb21wb25lbnQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUNvbXBvbmVudCopb2JqKS0+Zm9yZWlnblkoKTsKLX0KLQotY29uc3QgY2hhciogZGVmaUNvbXBvbmVudF9mb3JlaWduT3JpIChjb25zdCA6OmRlZmlDb21wb25lbnQqIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaUNvbXBvbmVudCopb2JqKS0+Zm9yZWlnbk9yaSgpOwotfQotCi1pbnQgZGVmaUNvbXBvbmVudF9mb3JlaWduT3JpZW50IChjb25zdCA6OmRlZmlDb21wb25lbnQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUNvbXBvbmVudCopb2JqKS0+Zm9yZWlnbk9yaWVudCgpOwotfQotCi1pbnQgZGVmaUNvbXBvbmVudF9oYXNGb3JpIChjb25zdCA6OmRlZmlDb21wb25lbnQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUNvbXBvbmVudCopb2JqKS0+aGFzRm9yaSgpOwotfQotCi1pbnQgZGVmaUNvbXBvbmVudF9udW1Qcm9wcyAoY29uc3QgOjpkZWZpQ29tcG9uZW50KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlDb21wb25lbnQqKW9iaiktPm51bVByb3BzKCk7Ci19Ci0KLWNoYXIqIGRlZmlDb21wb25lbnRfcHJvcE5hbWUgKGNvbnN0IDo6ZGVmaUNvbXBvbmVudCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpQ29tcG9uZW50KilvYmopLT5wcm9wTmFtZShpbmRleCk7Ci19Ci0KLWNoYXIqIGRlZmlDb21wb25lbnRfcHJvcFZhbHVlIChjb25zdCA6OmRlZmlDb21wb25lbnQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUNvbXBvbmVudCopb2JqKS0+cHJvcFZhbHVlKGluZGV4KTsKLX0KLQotZG91YmxlIGRlZmlDb21wb25lbnRfcHJvcE51bWJlciAoY29uc3QgOjpkZWZpQ29tcG9uZW50KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlDb21wb25lbnQqKW9iaiktPnByb3BOdW1iZXIoaW5kZXgpOwotfQotCi1jaGFyIGRlZmlDb21wb25lbnRfcHJvcFR5cGUgKGNvbnN0IDo6ZGVmaUNvbXBvbmVudCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpQ29tcG9uZW50KilvYmopLT5wcm9wVHlwZShpbmRleCk7Ci19Ci0KLWludCBkZWZpQ29tcG9uZW50X3Byb3BJc051bWJlciAoY29uc3QgOjpkZWZpQ29tcG9uZW50KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlDb21wb25lbnQqKW9iaiktPnByb3BJc051bWJlcihpbmRleCk7Ci19Ci0KLWludCBkZWZpQ29tcG9uZW50X3Byb3BJc1N0cmluZyAoY29uc3QgOjpkZWZpQ29tcG9uZW50KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlDb21wb25lbnQqKW9iaiktPnByb3BJc1N0cmluZyhpbmRleCk7Ci19Ci0KLXZvaWQgZGVmaUNvbXBvbmVudF9wcmludCAoY29uc3QgOjpkZWZpQ29tcG9uZW50KiBvYmosIEZJTEUqICBmb3V0KSB7Ci0gICAgKChMZWZEZWZQYXJzZXI6OmRlZmlDb21wb25lbnQqKW9iaiktPnByaW50KGZvdXQpOwotfQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi94ZGVmaURlYnVnLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZpRGVidWcuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWYwYjU2Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZpRGVidWcuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBBVFRFTlRJT046IFRISVMgSVMgQU4gQVVUTy1HRU5FUkFURUQgRklMRS4gRE8gTk9UIENIQU5HRSBJVCEKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTIsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogeHh4ICQKLS8vICAkUmV2aXNpb246IHh4eCAkCi0vLyAgJERhdGU6IHh4eCAkCi0vLyAgJFN0YXRlOiB4eHggJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNkZWZpbmUgRVhURVJOIGV4dGVybiAiQyIKLQotI2luY2x1ZGUgImRlZmlEZWJ1Zy5oIgotI2luY2x1ZGUgImRlZmlEZWJ1Zy5ocHAiCi0KLS8vIFdyYXBwZXJzIGRlZmluaXRpb25zLgotdm9pZCBkZWZpU2V0RGVidWcgKGludCAgbnVtLCBpbnQgIHZhbHVlKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZpU2V0RGVidWcobnVtLCB2YWx1ZSk7Ci19Ci0KLWludCBkZWZpRGVidWcgKGludCAgbnVtKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmaURlYnVnKG51bSk7Ci19Ci0KLXZvaWQgZGVmaUVycm9yIChpbnQgIGNoZWNrLCBpbnQgIG1zZ051bSwgY29uc3QgY2hhciogIG1lc3NhZ2UpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZmlFcnJvcihjaGVjaywgbXNnTnVtLCBtZXNzYWdlKTsKLX0KLQotY29uc3QgY2hhciogdXBwZXJDYXNlIChjb25zdCBjaGFyKiAgYykgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OnVwcGVyQ2FzZShjKTsKLX0KLQotY29uc3QgY2hhciogREVGQ0FTRSAoY29uc3QgY2hhciogIGNoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6REVGQ0FTRShjaCk7Ci19Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZpRlBDLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZpRlBDLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZmNzNmYi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi94ZGVmaUZQQy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIEFUVEVOVElPTjogVEhJUyBJUyBBTiBBVVRPLUdFTkVSQVRFRCBGSUxFLiBETyBOT1QgQ0hBTkdFIElUIQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiB4eHggJAotLy8gICRSZXZpc2lvbjogeHh4ICQKLS8vICAkRGF0ZTogeHh4ICQKLS8vICAkU3RhdGU6IHh4eCAkICAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jZGVmaW5lIEVYVEVSTiBleHRlcm4gIkMiCi0KLSNpbmNsdWRlICJkZWZpRlBDLmgiCi0jaW5jbHVkZSAiZGVmaUZQQy5ocHAiCi0KLS8vIFdyYXBwZXJzIGRlZmluaXRpb25zLgotY29uc3QgY2hhciogZGVmaUZQQ19uYW1lIChjb25zdCA6OmRlZmlGUEMqIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaUZQQyopb2JqKS0+bmFtZSgpOwotfQotCi1pbnQgZGVmaUZQQ19pc1ZlcnRpY2FsIChjb25zdCA6OmRlZmlGUEMqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUZQQyopb2JqKS0+aXNWZXJ0aWNhbCgpOwotfQotCi1pbnQgZGVmaUZQQ19pc0hvcml6b250YWwgKGNvbnN0IDo6ZGVmaUZQQyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpRlBDKilvYmopLT5pc0hvcml6b250YWwoKTsKLX0KLQotaW50IGRlZmlGUENfaGFzQWxpZ24gKGNvbnN0IDo6ZGVmaUZQQyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpRlBDKilvYmopLT5oYXNBbGlnbigpOwotfQotCi1pbnQgZGVmaUZQQ19oYXNNYXggKGNvbnN0IDo6ZGVmaUZQQyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpRlBDKilvYmopLT5oYXNNYXgoKTsKLX0KLQotaW50IGRlZmlGUENfaGFzTWluIChjb25zdCA6OmRlZmlGUEMqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUZQQyopb2JqKS0+aGFzTWluKCk7Ci19Ci0KLWludCBkZWZpRlBDX2hhc0VxdWFsIChjb25zdCA6OmRlZmlGUEMqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUZQQyopb2JqKS0+aGFzRXF1YWwoKTsKLX0KLQotZG91YmxlIGRlZmlGUENfYWxpZ25NYXggKGNvbnN0IDo6ZGVmaUZQQyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpRlBDKilvYmopLT5hbGlnbk1heCgpOwotfQotCi1kb3VibGUgZGVmaUZQQ19hbGlnbk1pbiAoY29uc3QgOjpkZWZpRlBDKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlGUEMqKW9iaiktPmFsaWduTWluKCk7Ci19Ci0KLWRvdWJsZSBkZWZpRlBDX2VxdWFsIChjb25zdCA6OmRlZmlGUEMqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUZQQyopb2JqKS0+ZXF1YWwoKTsKLX0KLQotaW50IGRlZmlGUENfbnVtUGFydHMgKGNvbnN0IDo6ZGVmaUZQQyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpRlBDKilvYmopLT5udW1QYXJ0cygpOwotfQotCi12b2lkIGRlZmlGUENfZ2V0UGFydCAoY29uc3QgOjpkZWZpRlBDKiBvYmosIGludCAgaW5kZXgsIGludCogIGNvcm5lciwgaW50KiAgdHlwLCBjaGFyKiogIG5hbWUpIHsKLSAgICAoKExlZkRlZlBhcnNlcjo6ZGVmaUZQQyopb2JqKS0+Z2V0UGFydChpbmRleCwgY29ybmVyLCB0eXAsIG5hbWUpOwotfQotCi12b2lkIGRlZmlGUENfcHJpbnQgKGNvbnN0IDo6ZGVmaUZQQyogb2JqLCBGSUxFKiAgZikgewotICAgICgoTGVmRGVmUGFyc2VyOjpkZWZpRlBDKilvYmopLT5wcmludChmKTsKLX0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYveGRlZmlGaWxsLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZpRmlsbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NTZhYTQuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYveGRlZmlGaWxsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIEFUVEVOVElPTjogVEhJUyBJUyBBTiBBVVRPLUdFTkVSQVRFRCBGSUxFLiBETyBOT1QgQ0hBTkdFIElUIQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiB4eHggJAotLy8gICRSZXZpc2lvbjogeHh4ICQKLS8vICAkRGF0ZTogeHh4ICQKLS8vICAkU3RhdGU6IHh4eCAkICAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jZGVmaW5lIEVYVEVSTiBleHRlcm4gIkMiCi0KLSNpbmNsdWRlICJkZWZpRmlsbC5oIgotI2luY2x1ZGUgImRlZmlGaWxsLmhwcCIKLQotLy8gV3JhcHBlcnMgZGVmaW5pdGlvbnMuCi1pbnQgZGVmaUZpbGxfaGFzTGF5ZXIgKGNvbnN0IDo6ZGVmaUZpbGwqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUZpbGwqKW9iaiktPmhhc0xheWVyKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlGaWxsX2xheWVyTmFtZSAoY29uc3QgOjpkZWZpRmlsbCogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpRmlsbCopb2JqKS0+bGF5ZXJOYW1lKCk7Ci19Ci0KLWludCBkZWZpRmlsbF9oYXNMYXllck9wYyAoY29uc3QgOjpkZWZpRmlsbCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpRmlsbCopb2JqKS0+aGFzTGF5ZXJPcGMoKTsKLX0KLQotaW50IGRlZmlGaWxsX2xheWVyTWFzayAoY29uc3QgOjpkZWZpRmlsbCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpRmlsbCopb2JqKS0+bGF5ZXJNYXNrKCk7Ci19Ci0KLWludCBkZWZpRmlsbF92aWFUb3BNYXNrIChjb25zdCA6OmRlZmlGaWxsKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlGaWxsKilvYmopLT52aWFUb3BNYXNrKCk7Ci19Ci0KLWludCBkZWZpRmlsbF92aWFDdXRNYXNrIChjb25zdCA6OmRlZmlGaWxsKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlGaWxsKilvYmopLT52aWFDdXRNYXNrKCk7Ci19Ci0KLWludCBkZWZpRmlsbF92aWFCb3R0b21NYXNrIChjb25zdCA6OmRlZmlGaWxsKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlGaWxsKilvYmopLT52aWFCb3R0b21NYXNrKCk7Ci19Ci0KLWludCBkZWZpRmlsbF9udW1SZWN0YW5nbGVzIChjb25zdCA6OmRlZmlGaWxsKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlGaWxsKilvYmopLT5udW1SZWN0YW5nbGVzKCk7Ci19Ci0KLWludCBkZWZpRmlsbF94bCAoY29uc3QgOjpkZWZpRmlsbCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpRmlsbCopb2JqKS0+eGwoaW5kZXgpOwotfQotCi1pbnQgZGVmaUZpbGxfeWwgKGNvbnN0IDo6ZGVmaUZpbGwqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUZpbGwqKW9iaiktPnlsKGluZGV4KTsKLX0KLQotaW50IGRlZmlGaWxsX3hoIChjb25zdCA6OmRlZmlGaWxsKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlGaWxsKilvYmopLT54aChpbmRleCk7Ci19Ci0KLWludCBkZWZpRmlsbF95aCAoY29uc3QgOjpkZWZpRmlsbCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpRmlsbCopb2JqKS0+eWgoaW5kZXgpOwotfQotCi1pbnQgZGVmaUZpbGxfbnVtUG9seWdvbnMgKGNvbnN0IDo6ZGVmaUZpbGwqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUZpbGwqKW9iaiktPm51bVBvbHlnb25zKCk7Ci19Ci0KLTo6ZGVmaVBvaW50cyBkZWZpRmlsbF9nZXRQb2x5Z29uIChjb25zdCA6OmRlZmlGaWxsKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZmlQb2ludHMgdG1wOwotICAgIHRtcCA9ICgoTGVmRGVmUGFyc2VyOjpkZWZpRmlsbCopb2JqKS0+Z2V0UG9seWdvbihpbmRleCk7Ci0gICAgcmV0dXJuICooKDo6ZGVmaVBvaW50cyopJnRtcCk7Ci19Ci0KLWludCBkZWZpRmlsbF9oYXNWaWEgKGNvbnN0IDo6ZGVmaUZpbGwqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUZpbGwqKW9iaiktPmhhc1ZpYSgpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpRmlsbF92aWFOYW1lIChjb25zdCA6OmRlZmlGaWxsKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlGaWxsKilvYmopLT52aWFOYW1lKCk7Ci19Ci0KLWludCBkZWZpRmlsbF9oYXNWaWFPcGMgKGNvbnN0IDo6ZGVmaUZpbGwqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUZpbGwqKW9iaiktPmhhc1ZpYU9wYygpOwotfQotCi1pbnQgZGVmaUZpbGxfbnVtVmlhUHRzIChjb25zdCA6OmRlZmlGaWxsKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlGaWxsKilvYmopLT5udW1WaWFQdHMoKTsKLX0KLQotOjpkZWZpUG9pbnRzIGRlZmlGaWxsX2dldFZpYVB0cyAoY29uc3QgOjpkZWZpRmlsbCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZpUG9pbnRzIHRtcDsKLSAgICB0bXAgPSAoKExlZkRlZlBhcnNlcjo6ZGVmaUZpbGwqKW9iaiktPmdldFZpYVB0cyhpbmRleCk7Ci0gICAgcmV0dXJuICooKDo6ZGVmaVBvaW50cyopJnRtcCk7Ci19Ci0KLXZvaWQgZGVmaUZpbGxfcHJpbnQgKGNvbnN0IDo6ZGVmaUZpbGwqIG9iaiwgRklMRSogIGYpIHsKLSAgICAoKExlZkRlZlBhcnNlcjo6ZGVmaUZpbGwqKW9iaiktPnByaW50KGYpOwotfQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi94ZGVmaUdyb3VwLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZpR3JvdXAuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGJlMzlkLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZpR3JvdXAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IHh4eCAkCi0vLyAgJFJldmlzaW9uOiB4eHggJAotLy8gICREYXRlOiB4eHggJAotLy8gICRTdGF0ZTogeHh4ICQgIAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNkZWZpbmUgRVhURVJOIGV4dGVybiAiQyIKLQotI2luY2x1ZGUgImRlZmlHcm91cC5oIgotI2luY2x1ZGUgImRlZmlHcm91cC5ocHAiCi0KLS8vIFdyYXBwZXJzIGRlZmluaXRpb25zLgotY29uc3QgY2hhciogZGVmaUdyb3VwX25hbWUgKGNvbnN0IDo6ZGVmaUdyb3VwKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlHcm91cCopb2JqKS0+bmFtZSgpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpR3JvdXBfcmVnaW9uTmFtZSAoY29uc3QgOjpkZWZpR3JvdXAqIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaUdyb3VwKilvYmopLT5yZWdpb25OYW1lKCk7Ci19Ci0KLWludCBkZWZpR3JvdXBfaGFzUmVnaW9uQm94IChjb25zdCA6OmRlZmlHcm91cCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpR3JvdXAqKW9iaiktPmhhc1JlZ2lvbkJveCgpOwotfQotCi1pbnQgZGVmaUdyb3VwX2hhc1JlZ2lvbk5hbWUgKGNvbnN0IDo6ZGVmaUdyb3VwKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlHcm91cCopb2JqKS0+aGFzUmVnaW9uTmFtZSgpOwotfQotCi1pbnQgZGVmaUdyb3VwX2hhc01heFggKGNvbnN0IDo6ZGVmaUdyb3VwKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlHcm91cCopb2JqKS0+aGFzTWF4WCgpOwotfQotCi1pbnQgZGVmaUdyb3VwX2hhc01heFkgKGNvbnN0IDo6ZGVmaUdyb3VwKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlHcm91cCopb2JqKS0+aGFzTWF4WSgpOwotfQotCi1pbnQgZGVmaUdyb3VwX2hhc1BlcmltIChjb25zdCA6OmRlZmlHcm91cCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpR3JvdXAqKW9iaiktPmhhc1BlcmltKCk7Ci19Ci0KLXZvaWQgZGVmaUdyb3VwX3JlZ2lvblJlY3RzIChjb25zdCA6OmRlZmlHcm91cCogb2JqLCBpbnQqICBzaXplLCBpbnQqKiAgeGwsIGludCoqIHlsLCBpbnQqKiAgeGgsIGludCoqICB5aCkgewotICAgICgoTGVmRGVmUGFyc2VyOjpkZWZpR3JvdXAqKW9iaiktPnJlZ2lvblJlY3RzKHNpemUsIHhsLCB5bCwgeGgsIHloKTsKLX0KLQotaW50IGRlZmlHcm91cF9tYXhYIChjb25zdCA6OmRlZmlHcm91cCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpR3JvdXAqKW9iaiktPm1heFgoKTsKLX0KLQotaW50IGRlZmlHcm91cF9tYXhZIChjb25zdCA6OmRlZmlHcm91cCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpR3JvdXAqKW9iaiktPm1heFkoKTsKLX0KLQotaW50IGRlZmlHcm91cF9wZXJpbSAoY29uc3QgOjpkZWZpR3JvdXAqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUdyb3VwKilvYmopLT5wZXJpbSgpOwotfQotCi1pbnQgZGVmaUdyb3VwX251bVByb3BzIChjb25zdCA6OmRlZmlHcm91cCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpR3JvdXAqKW9iaiktPm51bVByb3BzKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlHcm91cF9wcm9wTmFtZSAoY29uc3QgOjpkZWZpR3JvdXAqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaUdyb3VwKilvYmopLT5wcm9wTmFtZShpbmRleCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlHcm91cF9wcm9wVmFsdWUgKGNvbnN0IDo6ZGVmaUdyb3VwKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlHcm91cCopb2JqKS0+cHJvcFZhbHVlKGluZGV4KTsKLX0KLQotZG91YmxlIGRlZmlHcm91cF9wcm9wTnVtYmVyIChjb25zdCA6OmRlZmlHcm91cCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpR3JvdXAqKW9iaiktPnByb3BOdW1iZXIoaW5kZXgpOwotfQotCi1jb25zdCBjaGFyIGRlZmlHcm91cF9wcm9wVHlwZSAoY29uc3QgOjpkZWZpR3JvdXAqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaUdyb3VwKilvYmopLT5wcm9wVHlwZShpbmRleCk7Ci19Ci0KLWludCBkZWZpR3JvdXBfcHJvcElzTnVtYmVyIChjb25zdCA6OmRlZmlHcm91cCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpR3JvdXAqKW9iaiktPnByb3BJc051bWJlcihpbmRleCk7Ci19Ci0KLWludCBkZWZpR3JvdXBfcHJvcElzU3RyaW5nIChjb25zdCA6OmRlZmlHcm91cCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpR3JvdXAqKW9iaiktPnByb3BJc1N0cmluZyhpbmRleCk7Ci19Ci0KLXZvaWQgZGVmaUdyb3VwX3ByaW50IChjb25zdCA6OmRlZmlHcm91cCogb2JqLCBGSUxFKiAgZikgewotICAgICgoTGVmRGVmUGFyc2VyOjpkZWZpR3JvdXAqKW9iaiktPnByaW50KGYpOwotfQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi94ZGVmaUlPVGltaW5nLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZpSU9UaW1pbmcuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjFhNmYzLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZpSU9UaW1pbmcuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IHh4eCAkCi0vLyAgJFJldmlzaW9uOiB4eHggJAotLy8gICREYXRlOiB4eHggJAotLy8gICRTdGF0ZTogeHh4ICQgIAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNkZWZpbmUgRVhURVJOIGV4dGVybiAiQyIKLQotI2luY2x1ZGUgImRlZmlJT1RpbWluZy5oIgotI2luY2x1ZGUgImRlZmlJT1RpbWluZy5ocHAiCi0KLS8vIFdyYXBwZXJzIGRlZmluaXRpb25zLgotaW50IGRlZmlJT1RpbWluZ19oYXNWYXJpYWJsZVJpc2UgKGNvbnN0IDo6ZGVmaUlPVGltaW5nKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlJT1RpbWluZyopb2JqKS0+aGFzVmFyaWFibGVSaXNlKCk7Ci19Ci0KLWludCBkZWZpSU9UaW1pbmdfaGFzVmFyaWFibGVGYWxsIChjb25zdCA6OmRlZmlJT1RpbWluZyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpSU9UaW1pbmcqKW9iaiktPmhhc1ZhcmlhYmxlRmFsbCgpOwotfQotCi1pbnQgZGVmaUlPVGltaW5nX2hhc1NsZXdSaXNlIChjb25zdCA6OmRlZmlJT1RpbWluZyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpSU9UaW1pbmcqKW9iaiktPmhhc1NsZXdSaXNlKCk7Ci19Ci0KLWludCBkZWZpSU9UaW1pbmdfaGFzU2xld0ZhbGwgKGNvbnN0IDo6ZGVmaUlPVGltaW5nKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlJT1RpbWluZyopb2JqKS0+aGFzU2xld0ZhbGwoKTsKLX0KLQotaW50IGRlZmlJT1RpbWluZ19oYXNDYXBhY2l0YW5jZSAoY29uc3QgOjpkZWZpSU9UaW1pbmcqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUlPVGltaW5nKilvYmopLT5oYXNDYXBhY2l0YW5jZSgpOwotfQotCi1pbnQgZGVmaUlPVGltaW5nX2hhc0RyaXZlQ2VsbCAoY29uc3QgOjpkZWZpSU9UaW1pbmcqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUlPVGltaW5nKilvYmopLT5oYXNEcml2ZUNlbGwoKTsKLX0KLQotaW50IGRlZmlJT1RpbWluZ19oYXNGcm9tIChjb25zdCA6OmRlZmlJT1RpbWluZyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpSU9UaW1pbmcqKW9iaiktPmhhc0Zyb20oKTsKLX0KLQotaW50IGRlZmlJT1RpbWluZ19oYXNUbyAoY29uc3QgOjpkZWZpSU9UaW1pbmcqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUlPVGltaW5nKilvYmopLT5oYXNUbygpOwotfQotCi1pbnQgZGVmaUlPVGltaW5nX2hhc1BhcmFsbGVsIChjb25zdCA6OmRlZmlJT1RpbWluZyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpSU9UaW1pbmcqKW9iaiktPmhhc1BhcmFsbGVsKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlJT1RpbWluZ19pbnN0IChjb25zdCA6OmRlZmlJT1RpbWluZyogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpSU9UaW1pbmcqKW9iaiktPmluc3QoKTsKLX0KLQotY29uc3QgY2hhciogZGVmaUlPVGltaW5nX3BpbiAoY29uc3QgOjpkZWZpSU9UaW1pbmcqIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaUlPVGltaW5nKilvYmopLT5waW4oKTsKLX0KLQotZG91YmxlIGRlZmlJT1RpbWluZ192YXJpYWJsZUZhbGxNaW4gKGNvbnN0IDo6ZGVmaUlPVGltaW5nKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlJT1RpbWluZyopb2JqKS0+dmFyaWFibGVGYWxsTWluKCk7Ci19Ci0KLWRvdWJsZSBkZWZpSU9UaW1pbmdfdmFyaWFibGVSaXNlTWluIChjb25zdCA6OmRlZmlJT1RpbWluZyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpSU9UaW1pbmcqKW9iaiktPnZhcmlhYmxlUmlzZU1pbigpOwotfQotCi1kb3VibGUgZGVmaUlPVGltaW5nX3ZhcmlhYmxlRmFsbE1heCAoY29uc3QgOjpkZWZpSU9UaW1pbmcqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUlPVGltaW5nKilvYmopLT52YXJpYWJsZUZhbGxNYXgoKTsKLX0KLQotZG91YmxlIGRlZmlJT1RpbWluZ192YXJpYWJsZVJpc2VNYXggKGNvbnN0IDo6ZGVmaUlPVGltaW5nKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlJT1RpbWluZyopb2JqKS0+dmFyaWFibGVSaXNlTWF4KCk7Ci19Ci0KLWRvdWJsZSBkZWZpSU9UaW1pbmdfc2xld0ZhbGxNaW4gKGNvbnN0IDo6ZGVmaUlPVGltaW5nKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlJT1RpbWluZyopb2JqKS0+c2xld0ZhbGxNaW4oKTsKLX0KLQotZG91YmxlIGRlZmlJT1RpbWluZ19zbGV3UmlzZU1pbiAoY29uc3QgOjpkZWZpSU9UaW1pbmcqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUlPVGltaW5nKilvYmopLT5zbGV3UmlzZU1pbigpOwotfQotCi1kb3VibGUgZGVmaUlPVGltaW5nX3NsZXdGYWxsTWF4IChjb25zdCA6OmRlZmlJT1RpbWluZyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpSU9UaW1pbmcqKW9iaiktPnNsZXdGYWxsTWF4KCk7Ci19Ci0KLWRvdWJsZSBkZWZpSU9UaW1pbmdfc2xld1Jpc2VNYXggKGNvbnN0IDo6ZGVmaUlPVGltaW5nKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlJT1RpbWluZyopb2JqKS0+c2xld1Jpc2VNYXgoKTsKLX0KLQotZG91YmxlIGRlZmlJT1RpbWluZ19jYXBhY2l0YW5jZSAoY29uc3QgOjpkZWZpSU9UaW1pbmcqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUlPVGltaW5nKilvYmopLT5jYXBhY2l0YW5jZSgpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpSU9UaW1pbmdfZHJpdmVDZWxsIChjb25zdCA6OmRlZmlJT1RpbWluZyogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpSU9UaW1pbmcqKW9iaiktPmRyaXZlQ2VsbCgpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpSU9UaW1pbmdfZnJvbSAoY29uc3QgOjpkZWZpSU9UaW1pbmcqIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaUlPVGltaW5nKilvYmopLT5mcm9tKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlJT1RpbWluZ190byAoY29uc3QgOjpkZWZpSU9UaW1pbmcqIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaUlPVGltaW5nKilvYmopLT50bygpOwotfQotCi1kb3VibGUgZGVmaUlPVGltaW5nX3BhcmFsbGVsIChjb25zdCA6OmRlZmlJT1RpbWluZyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpSU9UaW1pbmcqKW9iaiktPnBhcmFsbGVsKCk7Ci19Ci0KLXZvaWQgZGVmaUlPVGltaW5nX3ByaW50IChjb25zdCA6OmRlZmlJT1RpbWluZyogb2JqLCBGSUxFKiAgZikgewotICAgICgoTGVmRGVmUGFyc2VyOjpkZWZpSU9UaW1pbmcqKW9iaiktPnByaW50KGYpOwotfQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi94ZGVmaU1pc2MuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYveGRlZmlNaXNjLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY2ZjJjYi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi94ZGVmaU1pc2MuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBBVFRFTlRJT046IFRISVMgSVMgQU4gQVVUTy1HRU5FUkFURUQgRklMRS4gRE8gTk9UIENIQU5HRSBJVCEKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTIsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogeHh4ICQKLS8vICAkUmV2aXNpb246IHh4eCAkCi0vLyAgJERhdGU6IHh4eCAkCi0vLyAgJFN0YXRlOiB4eHggJCAgCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2RlZmluZSBFWFRFUk4gZXh0ZXJuICJDIgotCi0jaW5jbHVkZSAiZGVmaU1pc2MuaCIKLSNpbmNsdWRlICJkZWZpTWlzYy5ocHAiCi0KLS8vIFdyYXBwZXJzIGRlZmluaXRpb25zLgotaW50IGRlZmlHZW9tZXRyaWVzX251bVBvaW50cyAoY29uc3QgOjpkZWZpR2VvbWV0cmllcyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpR2VvbWV0cmllcyopb2JqKS0+bnVtUG9pbnRzKCk7Ci19Ci0KLXZvaWQgZGVmaUdlb21ldHJpZXNfcG9pbnRzIChjb25zdCA6OmRlZmlHZW9tZXRyaWVzKiBvYmosIGludCAgaW5kZXgsIGludCogIHgsIGludCogIHkpIHsKLSAgICAoKExlZkRlZlBhcnNlcjo6ZGVmaUdlb21ldHJpZXMqKW9iaiktPnBvaW50cyhpbmRleCwgeCwgeSk7Ci19Ci0KLWludCBkZWZpU3R5bGVzX3N0eWxlIChjb25zdCA6OmRlZmlTdHlsZXMqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVN0eWxlcyopb2JqKS0+c3R5bGUoKTsKLX0KLQotOjpkZWZpUG9pbnRzIGRlZmlTdHlsZXNfZ2V0UG9seWdvbiAoY29uc3QgOjpkZWZpU3R5bGVzKiBvYmopIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZmlQb2ludHMgdG1wOwotICAgIHRtcCA9ICgoTGVmRGVmUGFyc2VyOjpkZWZpU3R5bGVzKilvYmopLT5nZXRQb2x5Z29uKCk7Ci0gICAgcmV0dXJuICooKDo6ZGVmaVBvaW50cyopJnRtcCk7Ci19Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZpTmV0LmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZpTmV0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNkNWE1Ny4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi94ZGVmaU5ldC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MzkgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBBVFRFTlRJT046IFRISVMgSVMgQU4gQVVUTy1HRU5FUkFURUQgRklMRS4gRE8gTk9UIENIQU5HRSBJVCEKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTIsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogeHh4ICQKLS8vICAkUmV2aXNpb246IHh4eCAkCi0vLyAgJERhdGU6IHh4eCAkCi0vLyAgJFN0YXRlOiB4eHggJCAgCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2RlZmluZSBFWFRFUk4gZXh0ZXJuICJDIgotCi0jaW5jbHVkZSAiZGVmaU5ldC5oIgotI2luY2x1ZGUgImRlZmlOZXQuaHBwIgotCi0vLyBXcmFwcGVycyBkZWZpbml0aW9ucy4KLWNvbnN0IGNoYXIqIGRlZmlXaXJlX3dpcmVUeXBlIChjb25zdCA6OmRlZmlXaXJlKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlXaXJlKilvYmopLT53aXJlVHlwZSgpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpV2lyZV93aXJlU2hpZWxkTmV0TmFtZSAoY29uc3QgOjpkZWZpV2lyZSogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpV2lyZSopb2JqKS0+d2lyZVNoaWVsZE5ldE5hbWUoKTsKLX0KLQotaW50IGRlZmlXaXJlX251bVBhdGhzIChjb25zdCA6OmRlZmlXaXJlKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlXaXJlKilvYmopLT5udW1QYXRocygpOwotfQotCi1jb25zdCA6OmRlZmlQYXRoKiBkZWZpV2lyZV9wYXRoIChjb25zdCA6OmRlZmlXaXJlKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKGNvbnN0IDo6ZGVmaVBhdGgqKSAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaVdpcmUqKW9iaiktPnBhdGgoaW5kZXgpOwotfQotCi12b2lkIGRlZmlTdWJuZXRfcHJpbnQgKGNvbnN0IDo6ZGVmaVN1Ym5ldCogb2JqLCBGSUxFKiAgZikgewotICAgICgoTGVmRGVmUGFyc2VyOjpkZWZpU3VibmV0KilvYmopLT5wcmludChmKTsKLX0KLQotY29uc3QgY2hhciogZGVmaVN1Ym5ldF9uYW1lIChjb25zdCA6OmRlZmlTdWJuZXQqIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaVN1Ym5ldCopb2JqKS0+bmFtZSgpOwotfQotCi1pbnQgZGVmaVN1Ym5ldF9udW1Db25uZWN0aW9ucyAoY29uc3QgOjpkZWZpU3VibmV0KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlTdWJuZXQqKW9iaiktPm51bUNvbm5lY3Rpb25zKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlTdWJuZXRfaW5zdGFuY2UgKGNvbnN0IDo6ZGVmaVN1Ym5ldCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpU3VibmV0KilvYmopLT5pbnN0YW5jZShpbmRleCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlTdWJuZXRfcGluIChjb25zdCA6OmRlZmlTdWJuZXQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaVN1Ym5ldCopb2JqKS0+cGluKGluZGV4KTsKLX0KLQotaW50IGRlZmlTdWJuZXRfcGluSXNTeW50aGVzaXplZCAoY29uc3QgOjpkZWZpU3VibmV0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlTdWJuZXQqKW9iaiktPnBpbklzU3ludGhlc2l6ZWQoaW5kZXgpOwotfQotCi1pbnQgZGVmaVN1Ym5ldF9waW5Jc011c3RKb2luIChjb25zdCA6OmRlZmlTdWJuZXQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVN1Ym5ldCopb2JqKS0+cGluSXNNdXN0Sm9pbihpbmRleCk7Ci19Ci0KLWludCBkZWZpU3VibmV0X2lzRml4ZWQgKGNvbnN0IDo6ZGVmaVN1Ym5ldCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpU3VibmV0KilvYmopLT5pc0ZpeGVkKCk7Ci19Ci0KLWludCBkZWZpU3VibmV0X2lzUm91dGVkIChjb25zdCA6OmRlZmlTdWJuZXQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVN1Ym5ldCopb2JqKS0+aXNSb3V0ZWQoKTsKLX0KLQotaW50IGRlZmlTdWJuZXRfaXNDb3ZlciAoY29uc3QgOjpkZWZpU3VibmV0KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlTdWJuZXQqKW9iaiktPmlzQ292ZXIoKTsKLX0KLQotaW50IGRlZmlTdWJuZXRfaGFzTm9uRGVmYXVsdFJ1bGUgKGNvbnN0IDo6ZGVmaVN1Ym5ldCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpU3VibmV0KilvYmopLT5oYXNOb25EZWZhdWx0UnVsZSgpOwotfQotCi1pbnQgZGVmaVN1Ym5ldF9udW1QYXRocyAoY29uc3QgOjpkZWZpU3VibmV0KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlTdWJuZXQqKW9iaiktPm51bVBhdGhzKCk7Ci19Ci0KLWNvbnN0IDo6ZGVmaVBhdGgqIGRlZmlTdWJuZXRfcGF0aCAoY29uc3QgOjpkZWZpU3VibmV0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKGNvbnN0IDo6ZGVmaVBhdGgqKSAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaVN1Ym5ldCopb2JqKS0+cGF0aChpbmRleCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlTdWJuZXRfbm9uRGVmYXVsdFJ1bGUgKGNvbnN0IDo6ZGVmaVN1Ym5ldCogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpU3VibmV0KilvYmopLT5ub25EZWZhdWx0UnVsZSgpOwotfQotCi1pbnQgZGVmaVN1Ym5ldF9udW1XaXJlcyAoY29uc3QgOjpkZWZpU3VibmV0KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlTdWJuZXQqKW9iaiktPm51bVdpcmVzKCk7Ci19Ci0KLWNvbnN0IDo6ZGVmaVdpcmUqIGRlZmlTdWJuZXRfd2lyZSAoY29uc3QgOjpkZWZpU3VibmV0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKGNvbnN0IDo6ZGVmaVdpcmUqKSAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaVN1Ym5ldCopb2JqKS0+d2lyZShpbmRleCk7Ci19Ci0KLWludCBkZWZpVnBpbl94bCAoY29uc3QgOjpkZWZpVnBpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpVnBpbiopb2JqKS0+eGwoKTsKLX0KLQotaW50IGRlZmlWcGluX3lsIChjb25zdCA6OmRlZmlWcGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlWcGluKilvYmopLT55bCgpOwotfQotCi1pbnQgZGVmaVZwaW5feGggKGNvbnN0IDo6ZGVmaVZwaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVZwaW4qKW9iaiktPnhoKCk7Ci19Ci0KLWludCBkZWZpVnBpbl95aCAoY29uc3QgOjpkZWZpVnBpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpVnBpbiopb2JqKS0+eWgoKTsKLX0KLQotY2hhciBkZWZpVnBpbl9zdGF0dXMgKGNvbnN0IDo6ZGVmaVZwaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVZwaW4qKW9iaiktPnN0YXR1cygpOwotfQotCi1pbnQgZGVmaVZwaW5fb3JpZW50IChjb25zdCA6OmRlZmlWcGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlWcGluKilvYmopLT5vcmllbnQoKTsKLX0KLQotY29uc3QgY2hhciogZGVmaVZwaW5fb3JpZW50U3RyIChjb25zdCA6OmRlZmlWcGluKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlWcGluKilvYmopLT5vcmllbnRTdHIoKTsKLX0KLQotaW50IGRlZmlWcGluX3hMb2MgKGNvbnN0IDo6ZGVmaVZwaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVZwaW4qKW9iaiktPnhMb2MoKTsKLX0KLQotaW50IGRlZmlWcGluX3lMb2MgKGNvbnN0IDo6ZGVmaVZwaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVZwaW4qKW9iaiktPnlMb2MoKTsKLX0KLQotY29uc3QgY2hhciogZGVmaVZwaW5fbmFtZSAoY29uc3QgOjpkZWZpVnBpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpVnBpbiopb2JqKS0+bmFtZSgpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpVnBpbl9sYXllciAoY29uc3QgOjpkZWZpVnBpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpVnBpbiopb2JqKS0+bGF5ZXIoKTsKLX0KLQotY29uc3QgY2hhciogZGVmaVNoaWVsZF9zaGllbGROYW1lIChjb25zdCA6OmRlZmlTaGllbGQqIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaVNoaWVsZCopb2JqKS0+c2hpZWxkTmFtZSgpOwotfQotCi1pbnQgZGVmaVNoaWVsZF9udW1QYXRocyAoY29uc3QgOjpkZWZpU2hpZWxkKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlTaGllbGQqKW9iaiktPm51bVBhdGhzKCk7Ci19Ci0KLWNvbnN0IDo6ZGVmaVBhdGgqIGRlZmlTaGllbGRfcGF0aCAoY29uc3QgOjpkZWZpU2hpZWxkKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKGNvbnN0IDo6ZGVmaVBhdGgqKSAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaVNoaWVsZCopb2JqKS0+cGF0aChpbmRleCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlOZXRfbmFtZSAoY29uc3QgOjpkZWZpTmV0KiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPm5hbWUoKTsKLX0KLQotaW50IGRlZmlOZXRfd2VpZ2h0IChjb25zdCA6OmRlZmlOZXQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+d2VpZ2h0KCk7Ci19Ci0KLWludCBkZWZpTmV0X251bVByb3BzIChjb25zdCA6OmRlZmlOZXQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+bnVtUHJvcHMoKTsKLX0KLQotY29uc3QgY2hhciogZGVmaU5ldF9wcm9wTmFtZSAoY29uc3QgOjpkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPnByb3BOYW1lKGluZGV4KTsKLX0KLQotY29uc3QgY2hhciogZGVmaU5ldF9wcm9wVmFsdWUgKGNvbnN0IDo6ZGVmaU5ldCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpTmV0KilvYmopLT5wcm9wVmFsdWUoaW5kZXgpOwotfQotCi1kb3VibGUgZGVmaU5ldF9wcm9wTnVtYmVyIChjb25zdCA6OmRlZmlOZXQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+cHJvcE51bWJlcihpbmRleCk7Ci19Ci0KLWNvbnN0IGNoYXIgZGVmaU5ldF9wcm9wVHlwZSAoY29uc3QgOjpkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPnByb3BUeXBlKGluZGV4KTsKLX0KLQotaW50IGRlZmlOZXRfcHJvcElzTnVtYmVyIChjb25zdCA6OmRlZmlOZXQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+cHJvcElzTnVtYmVyKGluZGV4KTsKLX0KLQotaW50IGRlZmlOZXRfcHJvcElzU3RyaW5nIChjb25zdCA6OmRlZmlOZXQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+cHJvcElzU3RyaW5nKGluZGV4KTsKLX0KLQotaW50IGRlZmlOZXRfbnVtQ29ubmVjdGlvbnMgKGNvbnN0IDo6ZGVmaU5ldCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpTmV0KilvYmopLT5udW1Db25uZWN0aW9ucygpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpTmV0X2luc3RhbmNlIChjb25zdCA6OmRlZmlOZXQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+aW5zdGFuY2UoaW5kZXgpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpTmV0X3BpbiAoY29uc3QgOjpkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPnBpbihpbmRleCk7Ci19Ci0KLWludCBkZWZpTmV0X3BpbklzTXVzdEpvaW4gKGNvbnN0IDo6ZGVmaU5ldCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpTmV0KilvYmopLT5waW5Jc011c3RKb2luKGluZGV4KTsKLX0KLQotaW50IGRlZmlOZXRfcGluSXNTeW50aGVzaXplZCAoY29uc3QgOjpkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPnBpbklzU3ludGhlc2l6ZWQoaW5kZXgpOwotfQotCi1pbnQgZGVmaU5ldF9udW1TdWJuZXRzIChjb25zdCA6OmRlZmlOZXQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+bnVtU3VibmV0cygpOwotfQotCi1jb25zdCA6OmRlZmlTdWJuZXQqIGRlZmlOZXRfc3VibmV0IChjb25zdCA6OmRlZmlOZXQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoY29uc3QgOjpkZWZpU3VibmV0KikgKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPnN1Ym5ldChpbmRleCk7Ci19Ci0KLWludCBkZWZpTmV0X2lzRml4ZWQgKGNvbnN0IDo6ZGVmaU5ldCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpTmV0KilvYmopLT5pc0ZpeGVkKCk7Ci19Ci0KLWludCBkZWZpTmV0X2lzUm91dGVkIChjb25zdCA6OmRlZmlOZXQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+aXNSb3V0ZWQoKTsKLX0KLQotaW50IGRlZmlOZXRfaXNDb3ZlciAoY29uc3QgOjpkZWZpTmV0KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPmlzQ292ZXIoKTsKLX0KLQotaW50IGRlZmlOZXRfbnVtV2lyZXMgKGNvbnN0IDo6ZGVmaU5ldCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpTmV0KilvYmopLT5udW1XaXJlcygpOwotfQotCi1jb25zdCA6OmRlZmlXaXJlKiBkZWZpTmV0X3dpcmUgKGNvbnN0IDo6ZGVmaU5ldCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuIChjb25zdCA6OmRlZmlXaXJlKikgKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPndpcmUoaW5kZXgpOwotfQotCi1pbnQgZGVmaU5ldF9udW1WcGlucyAoY29uc3QgOjpkZWZpTmV0KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPm51bVZwaW5zKCk7Ci19Ci0KLWNvbnN0IDo6ZGVmaVZwaW4qIGRlZmlOZXRfdnBpbiAoY29uc3QgOjpkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKGNvbnN0IDo6ZGVmaVZwaW4qKSAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+dnBpbihpbmRleCk7Ci19Ci0KLWludCBkZWZpTmV0X2hhc1Byb3BzIChjb25zdCA6OmRlZmlOZXQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+aGFzUHJvcHMoKTsKLX0KLQotaW50IGRlZmlOZXRfaGFzV2VpZ2h0IChjb25zdCA6OmRlZmlOZXQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+aGFzV2VpZ2h0KCk7Ci19Ci0KLWludCBkZWZpTmV0X2hhc1N1Ym5ldHMgKGNvbnN0IDo6ZGVmaU5ldCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpTmV0KilvYmopLT5oYXNTdWJuZXRzKCk7Ci19Ci0KLWludCBkZWZpTmV0X2hhc1NvdXJjZSAoY29uc3QgOjpkZWZpTmV0KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPmhhc1NvdXJjZSgpOwotfQotCi1pbnQgZGVmaU5ldF9oYXNGaXhlZGJ1bXAgKGNvbnN0IDo6ZGVmaU5ldCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpTmV0KilvYmopLT5oYXNGaXhlZGJ1bXAoKTsKLX0KLQotaW50IGRlZmlOZXRfaGFzRnJlcXVlbmN5IChjb25zdCA6OmRlZmlOZXQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+aGFzRnJlcXVlbmN5KCk7Ci19Ci0KLWludCBkZWZpTmV0X2hhc1BhdHRlcm4gKGNvbnN0IDo6ZGVmaU5ldCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpTmV0KilvYmopLT5oYXNQYXR0ZXJuKCk7Ci19Ci0KLWludCBkZWZpTmV0X2hhc09yaWdpbmFsIChjb25zdCA6OmRlZmlOZXQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+aGFzT3JpZ2luYWwoKTsKLX0KLQotaW50IGRlZmlOZXRfaGFzQ2FwIChjb25zdCA6OmRlZmlOZXQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+aGFzQ2FwKCk7Ci19Ci0KLWludCBkZWZpTmV0X2hhc1VzZSAoY29uc3QgOjpkZWZpTmV0KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPmhhc1VzZSgpOwotfQotCi1pbnQgZGVmaU5ldF9oYXNTdHlsZSAoY29uc3QgOjpkZWZpTmV0KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPmhhc1N0eWxlKCk7Ci19Ci0KLWludCBkZWZpTmV0X2hhc05vbkRlZmF1bHRSdWxlIChjb25zdCA6OmRlZmlOZXQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+aGFzTm9uRGVmYXVsdFJ1bGUoKTsKLX0KLQotaW50IGRlZmlOZXRfaGFzVm9sdGFnZSAoY29uc3QgOjpkZWZpTmV0KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPmhhc1ZvbHRhZ2UoKTsKLX0KLQotaW50IGRlZmlOZXRfaGFzU3BhY2luZ1J1bGVzIChjb25zdCA6OmRlZmlOZXQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+aGFzU3BhY2luZ1J1bGVzKCk7Ci19Ci0KLWludCBkZWZpTmV0X2hhc1dpZHRoUnVsZXMgKGNvbnN0IDo6ZGVmaU5ldCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpTmV0KilvYmopLT5oYXNXaWR0aFJ1bGVzKCk7Ci19Ci0KLWludCBkZWZpTmV0X2hhc1hUYWxrIChjb25zdCA6OmRlZmlOZXQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+aGFzWFRhbGsoKTsKLX0KLQotaW50IGRlZmlOZXRfbnVtU3BhY2luZ1J1bGVzIChjb25zdCA6OmRlZmlOZXQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+bnVtU3BhY2luZ1J1bGVzKCk7Ci19Ci0KLXZvaWQgZGVmaU5ldF9zcGFjaW5nUnVsZSAoY29uc3QgOjpkZWZpTmV0KiBvYmosIGludCAgaW5kZXgsIGNoYXIqKiAgbGF5ZXIsIGRvdWJsZSogIGRpc3QsIGRvdWJsZSogIGxlZnQsIGRvdWJsZSogIHJpZ2h0KSB7Ci0gICAgKChMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPnNwYWNpbmdSdWxlKGluZGV4LCBsYXllciwgZGlzdCwgbGVmdCwgcmlnaHQpOwotfQotCi1pbnQgZGVmaU5ldF9udW1XaWR0aFJ1bGVzIChjb25zdCA6OmRlZmlOZXQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+bnVtV2lkdGhSdWxlcygpOwotfQotCi12b2lkIGRlZmlOZXRfd2lkdGhSdWxlIChjb25zdCA6OmRlZmlOZXQqIG9iaiwgaW50ICBpbmRleCwgY2hhcioqICBsYXllciwgZG91YmxlKiAgZGlzdCkgewotICAgICgoTGVmRGVmUGFyc2VyOjpkZWZpTmV0KilvYmopLT53aWR0aFJ1bGUoaW5kZXgsIGxheWVyLCBkaXN0KTsKLX0KLQotZG91YmxlIGRlZmlOZXRfdm9sdGFnZSAoY29uc3QgOjpkZWZpTmV0KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPnZvbHRhZ2UoKTsKLX0KLQotaW50IGRlZmlOZXRfWFRhbGsgKGNvbnN0IDo6ZGVmaU5ldCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpTmV0KilvYmopLT5YVGFsaygpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpTmV0X3NvdXJjZSAoY29uc3QgOjpkZWZpTmV0KiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPnNvdXJjZSgpOwotfQotCi1kb3VibGUgZGVmaU5ldF9mcmVxdWVuY3kgKGNvbnN0IDo6ZGVmaU5ldCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpTmV0KilvYmopLT5mcmVxdWVuY3koKTsKLX0KLQotY29uc3QgY2hhciogZGVmaU5ldF9vcmlnaW5hbCAoY29uc3QgOjpkZWZpTmV0KiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPm9yaWdpbmFsKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlOZXRfcGF0dGVybiAoY29uc3QgOjpkZWZpTmV0KiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPnBhdHRlcm4oKTsKLX0KLQotZG91YmxlIGRlZmlOZXRfY2FwIChjb25zdCA6OmRlZmlOZXQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+Y2FwKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlOZXRfdXNlIChjb25zdCA6OmRlZmlOZXQqIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+dXNlKCk7Ci19Ci0KLWludCBkZWZpTmV0X3N0eWxlIChjb25zdCA6OmRlZmlOZXQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+c3R5bGUoKTsKLX0KLQotY29uc3QgY2hhciogZGVmaU5ldF9ub25EZWZhdWx0UnVsZSAoY29uc3QgOjpkZWZpTmV0KiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPm5vbkRlZmF1bHRSdWxlKCk7Ci19Ci0KLWludCBkZWZpTmV0X251bVBhdGhzIChjb25zdCA6OmRlZmlOZXQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+bnVtUGF0aHMoKTsKLX0KLQotY29uc3QgOjpkZWZpUGF0aCogZGVmaU5ldF9wYXRoIChjb25zdCA6OmRlZmlOZXQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoY29uc3QgOjpkZWZpUGF0aCopICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpTmV0KilvYmopLT5wYXRoKGluZGV4KTsKLX0KLQotaW50IGRlZmlOZXRfbnVtU2hpZWxkcyAoY29uc3QgOjpkZWZpTmV0KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPm51bVNoaWVsZHMoKTsKLX0KLQotY29uc3QgOjpkZWZpU2hpZWxkKiBkZWZpTmV0X3NoaWVsZCAoY29uc3QgOjpkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKGNvbnN0IDo6ZGVmaVNoaWVsZCopICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpTmV0KilvYmopLT5zaGllbGQoaW5kZXgpOwotfQotCi1pbnQgZGVmaU5ldF9udW1TaGllbGROZXRzIChjb25zdCA6OmRlZmlOZXQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+bnVtU2hpZWxkTmV0cygpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpTmV0X3NoaWVsZE5ldCAoY29uc3QgOjpkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPnNoaWVsZE5ldChpbmRleCk7Ci19Ci0KLWludCBkZWZpTmV0X251bU5vU2hpZWxkcyAoY29uc3QgOjpkZWZpTmV0KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPm51bU5vU2hpZWxkcygpOwotfQotCi1jb25zdCA6OmRlZmlTaGllbGQqIGRlZmlOZXRfbm9TaGllbGQgKGNvbnN0IDo6ZGVmaU5ldCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuIChjb25zdCA6OmRlZmlTaGllbGQqKSAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+bm9TaGllbGQoaW5kZXgpOwotfQotCi1pbnQgZGVmaU5ldF9udW1Qb2x5Z29ucyAoY29uc3QgOjpkZWZpTmV0KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPm51bVBvbHlnb25zKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlOZXRfcG9seWdvbk5hbWUgKGNvbnN0IDo6ZGVmaU5ldCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpTmV0KilvYmopLT5wb2x5Z29uTmFtZShpbmRleCk7Ci19Ci0KLTo6ZGVmaVBvaW50cyBkZWZpTmV0X2dldFBvbHlnb24gKGNvbnN0IDo6ZGVmaU5ldCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZpUG9pbnRzIHRtcDsKLSAgICB0bXAgPSAoKExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+Z2V0UG9seWdvbihpbmRleCk7Ci0gICAgcmV0dXJuICooKDo6ZGVmaVBvaW50cyopJnRtcCk7Ci19Ci0KLWludCBkZWZpTmV0X3BvbHlNYXNrIChjb25zdCA6OmRlZmlOZXQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+cG9seU1hc2soaW5kZXgpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpTmV0X3BvbHlSb3V0ZVN0YXR1cyAoY29uc3QgOjpkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPnBvbHlSb3V0ZVN0YXR1cyhpbmRleCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlOZXRfcG9seVJvdXRlU3RhdHVzU2hpZWxkTmFtZSAoY29uc3QgOjpkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPnBvbHlSb3V0ZVN0YXR1c1NoaWVsZE5hbWUoaW5kZXgpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpTmV0X3BvbHlTaGFwZVR5cGUgKGNvbnN0IDo6ZGVmaU5ldCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpTmV0KilvYmopLT5wb2x5U2hhcGVUeXBlKGluZGV4KTsKLX0KLQotaW50IGRlZmlOZXRfbnVtUmVjdGFuZ2xlcyAoY29uc3QgOjpkZWZpTmV0KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPm51bVJlY3RhbmdsZXMoKTsKLX0KLQotY29uc3QgY2hhciogZGVmaU5ldF9yZWN0TmFtZSAoY29uc3QgOjpkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPnJlY3ROYW1lKGluZGV4KTsKLX0KLQotaW50IGRlZmlOZXRfeGwgKGNvbnN0IDo6ZGVmaU5ldCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpTmV0KilvYmopLT54bChpbmRleCk7Ci19Ci0KLWludCBkZWZpTmV0X3lsIChjb25zdCA6OmRlZmlOZXQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+eWwoaW5kZXgpOwotfQotCi1pbnQgZGVmaU5ldF94aCAoY29uc3QgOjpkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPnhoKGluZGV4KTsKLX0KLQotaW50IGRlZmlOZXRfeWggKGNvbnN0IDo6ZGVmaU5ldCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpTmV0KilvYmopLT55aChpbmRleCk7Ci19Ci0KLWludCBkZWZpTmV0X3JlY3RNYXNrIChjb25zdCA6OmRlZmlOZXQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+cmVjdE1hc2soaW5kZXgpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpTmV0X3JlY3RSb3V0ZVN0YXR1cyAoY29uc3QgOjpkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPnJlY3RSb3V0ZVN0YXR1cyhpbmRleCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlOZXRfcmVjdFJvdXRlU3RhdHVzU2hpZWxkTmFtZSAoY29uc3QgOjpkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPnJlY3RSb3V0ZVN0YXR1c1NoaWVsZE5hbWUoaW5kZXgpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpTmV0X3JlY3RTaGFwZVR5cGUgKGNvbnN0IDo6ZGVmaU5ldCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpTmV0KilvYmopLT5yZWN0U2hhcGVUeXBlKGluZGV4KTsKLX0KLQotaW50IGRlZmlOZXRfbnVtVmlhU3BlY3MgKGNvbnN0IDo6ZGVmaU5ldCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpTmV0KilvYmopLT5udW1WaWFTcGVjcygpOwotfQotCi06OmRlZmlQb2ludHMgZGVmaU5ldF9nZXRWaWFQdHMgKGNvbnN0IDo6ZGVmaU5ldCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZpUG9pbnRzIHRtcDsKLSAgICB0bXAgPSAoKExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+Z2V0VmlhUHRzKGluZGV4KTsKLSAgICByZXR1cm4gKigoOjpkZWZpUG9pbnRzKikmdG1wKTsKLX0KLQotY29uc3QgY2hhciogZGVmaU5ldF92aWFOYW1lIChjb25zdCA6OmRlZmlOZXQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+dmlhTmFtZShpbmRleCk7Ci19Ci0KLWNvbnN0IGludCBkZWZpTmV0X3ZpYU9yaWVudCAoY29uc3QgOjpkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPnZpYU9yaWVudChpbmRleCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlOZXRfdmlhT3JpZW50U3RyIChjb25zdCA6OmRlZmlOZXQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+dmlhT3JpZW50U3RyKGluZGV4KTsKLX0KLQotY29uc3QgaW50IGRlZmlOZXRfdG9wTWFza051bSAoY29uc3QgOjpkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPnRvcE1hc2tOdW0oaW5kZXgpOwotfQotCi1jb25zdCBpbnQgZGVmaU5ldF9jdXRNYXNrTnVtIChjb25zdCA6OmRlZmlOZXQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaU5ldCopb2JqKS0+Y3V0TWFza051bShpbmRleCk7Ci19Ci0KLWNvbnN0IGludCBkZWZpTmV0X2JvdHRvbU1hc2tOdW0gKGNvbnN0IDo6ZGVmaU5ldCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpTmV0KilvYmopLT5ib3R0b21NYXNrTnVtKGluZGV4KTsKLX0KLQotY29uc3QgY2hhciogZGVmaU5ldF92aWFSb3V0ZVN0YXR1cyAoY29uc3QgOjpkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPnZpYVJvdXRlU3RhdHVzKGluZGV4KTsKLX0KLQotY29uc3QgY2hhciogZGVmaU5ldF92aWFSb3V0ZVN0YXR1c1NoaWVsZE5hbWUgKGNvbnN0IDo6ZGVmaU5ldCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpTmV0KilvYmopLT52aWFSb3V0ZVN0YXR1c1NoaWVsZE5hbWUoaW5kZXgpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpTmV0X3ZpYVNoYXBlVHlwZSAoY29uc3QgOjpkZWZpTmV0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPnZpYVNoYXBlVHlwZShpbmRleCk7Ci19Ci0KLXZvaWQgZGVmaU5ldF9wcmludCAoY29uc3QgOjpkZWZpTmV0KiBvYmosIEZJTEUqICBmKSB7Ci0gICAgKChMZWZEZWZQYXJzZXI6OmRlZmlOZXQqKW9iaiktPnByaW50KGYpOwotfQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi94ZGVmaU5vbkRlZmF1bHQuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYveGRlZmlOb25EZWZhdWx0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVjOTE1Zi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi94ZGVmaU5vbkRlZmF1bHQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IHh4eCAkCi0vLyAgJFJldmlzaW9uOiB4eHggJAotLy8gICREYXRlOiB4eHggJAotLy8gICRTdGF0ZTogeHh4ICQgIAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNkZWZpbmUgRVhURVJOIGV4dGVybiAiQyIKLQotI2luY2x1ZGUgImRlZmlOb25EZWZhdWx0LmgiCi0jaW5jbHVkZSAiZGVmaU5vbkRlZmF1bHQuaHBwIgotCi0vLyBXcmFwcGVycyBkZWZpbml0aW9ucy4KLWNvbnN0IGNoYXIqIGRlZmlOb25EZWZhdWx0X25hbWUgKGNvbnN0IDo6ZGVmaU5vbkRlZmF1bHQqIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaU5vbkRlZmF1bHQqKW9iaiktPm5hbWUoKTsKLX0KLQotaW50IGRlZmlOb25EZWZhdWx0X2hhc0hhcmRzcGFjaW5nIChjb25zdCA6OmRlZmlOb25EZWZhdWx0KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlOb25EZWZhdWx0KilvYmopLT5oYXNIYXJkc3BhY2luZygpOwotfQotCi1pbnQgZGVmaU5vbkRlZmF1bHRfbnVtUHJvcHMgKGNvbnN0IDo6ZGVmaU5vbkRlZmF1bHQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaU5vbkRlZmF1bHQqKW9iaiktPm51bVByb3BzKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlOb25EZWZhdWx0X3Byb3BOYW1lIChjb25zdCA6OmRlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlOb25EZWZhdWx0KilvYmopLT5wcm9wTmFtZShpbmRleCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlOb25EZWZhdWx0X3Byb3BWYWx1ZSAoY29uc3QgOjpkZWZpTm9uRGVmYXVsdCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpTm9uRGVmYXVsdCopb2JqKS0+cHJvcFZhbHVlKGluZGV4KTsKLX0KLQotZG91YmxlIGRlZmlOb25EZWZhdWx0X3Byb3BOdW1iZXIgKGNvbnN0IDo6ZGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaU5vbkRlZmF1bHQqKW9iaiktPnByb3BOdW1iZXIoaW5kZXgpOwotfQotCi1jb25zdCBjaGFyIGRlZmlOb25EZWZhdWx0X3Byb3BUeXBlIChjb25zdCA6OmRlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlOb25EZWZhdWx0KilvYmopLT5wcm9wVHlwZShpbmRleCk7Ci19Ci0KLWludCBkZWZpTm9uRGVmYXVsdF9wcm9wSXNOdW1iZXIgKGNvbnN0IDo6ZGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaU5vbkRlZmF1bHQqKW9iaiktPnByb3BJc051bWJlcihpbmRleCk7Ci19Ci0KLWludCBkZWZpTm9uRGVmYXVsdF9wcm9wSXNTdHJpbmcgKGNvbnN0IDo6ZGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaU5vbkRlZmF1bHQqKW9iaiktPnByb3BJc1N0cmluZyhpbmRleCk7Ci19Ci0KLWludCBkZWZpTm9uRGVmYXVsdF9udW1MYXllcnMgKGNvbnN0IDo6ZGVmaU5vbkRlZmF1bHQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaU5vbkRlZmF1bHQqKW9iaiktPm51bUxheWVycygpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpTm9uRGVmYXVsdF9sYXllck5hbWUgKGNvbnN0IDo6ZGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaU5vbkRlZmF1bHQqKW9iaiktPmxheWVyTmFtZShpbmRleCk7Ci19Ci0KLWRvdWJsZSBkZWZpTm9uRGVmYXVsdF9sYXllcldpZHRoIChjb25zdCA6OmRlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlOb25EZWZhdWx0KilvYmopLT5sYXllcldpZHRoKGluZGV4KTsKLX0KLQotaW50IGRlZmlOb25EZWZhdWx0X2xheWVyV2lkdGhWYWwgKGNvbnN0IDo6ZGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaU5vbkRlZmF1bHQqKW9iaiktPmxheWVyV2lkdGhWYWwoaW5kZXgpOwotfQotCi1pbnQgZGVmaU5vbkRlZmF1bHRfaGFzTGF5ZXJEaWFnV2lkdGggKGNvbnN0IDo6ZGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaU5vbkRlZmF1bHQqKW9iaiktPmhhc0xheWVyRGlhZ1dpZHRoKGluZGV4KTsKLX0KLQotZG91YmxlIGRlZmlOb25EZWZhdWx0X2xheWVyRGlhZ1dpZHRoIChjb25zdCA6OmRlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlOb25EZWZhdWx0KilvYmopLT5sYXllckRpYWdXaWR0aChpbmRleCk7Ci19Ci0KLWludCBkZWZpTm9uRGVmYXVsdF9sYXllckRpYWdXaWR0aFZhbCAoY29uc3QgOjpkZWZpTm9uRGVmYXVsdCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpTm9uRGVmYXVsdCopb2JqKS0+bGF5ZXJEaWFnV2lkdGhWYWwoaW5kZXgpOwotfQotCi1pbnQgZGVmaU5vbkRlZmF1bHRfaGFzTGF5ZXJTcGFjaW5nIChjb25zdCA6OmRlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlOb25EZWZhdWx0KilvYmopLT5oYXNMYXllclNwYWNpbmcoaW5kZXgpOwotfQotCi1kb3VibGUgZGVmaU5vbkRlZmF1bHRfbGF5ZXJTcGFjaW5nIChjb25zdCA6OmRlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlOb25EZWZhdWx0KilvYmopLT5sYXllclNwYWNpbmcoaW5kZXgpOwotfQotCi1pbnQgZGVmaU5vbkRlZmF1bHRfbGF5ZXJTcGFjaW5nVmFsIChjb25zdCA6OmRlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlOb25EZWZhdWx0KilvYmopLT5sYXllclNwYWNpbmdWYWwoaW5kZXgpOwotfQotCi1pbnQgZGVmaU5vbkRlZmF1bHRfaGFzTGF5ZXJXaXJlRXh0IChjb25zdCA6OmRlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlOb25EZWZhdWx0KilvYmopLT5oYXNMYXllcldpcmVFeHQoaW5kZXgpOwotfQotCi1kb3VibGUgZGVmaU5vbkRlZmF1bHRfbGF5ZXJXaXJlRXh0IChjb25zdCA6OmRlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlOb25EZWZhdWx0KilvYmopLT5sYXllcldpcmVFeHQoaW5kZXgpOwotfQotCi1pbnQgZGVmaU5vbkRlZmF1bHRfbGF5ZXJXaXJlRXh0VmFsIChjb25zdCA6OmRlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlOb25EZWZhdWx0KilvYmopLT5sYXllcldpcmVFeHRWYWwoaW5kZXgpOwotfQotCi1pbnQgZGVmaU5vbkRlZmF1bHRfbnVtVmlhcyAoY29uc3QgOjpkZWZpTm9uRGVmYXVsdCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpTm9uRGVmYXVsdCopb2JqKS0+bnVtVmlhcygpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpTm9uRGVmYXVsdF92aWFOYW1lIChjb25zdCA6OmRlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlOb25EZWZhdWx0KilvYmopLT52aWFOYW1lKGluZGV4KTsKLX0KLQotaW50IGRlZmlOb25EZWZhdWx0X251bVZpYVJ1bGVzIChjb25zdCA6OmRlZmlOb25EZWZhdWx0KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlOb25EZWZhdWx0KilvYmopLT5udW1WaWFSdWxlcygpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpTm9uRGVmYXVsdF92aWFSdWxlTmFtZSAoY29uc3QgOjpkZWZpTm9uRGVmYXVsdCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpTm9uRGVmYXVsdCopb2JqKS0+dmlhUnVsZU5hbWUoaW5kZXgpOwotfQotCi1pbnQgZGVmaU5vbkRlZmF1bHRfbnVtTWluQ3V0cyAoY29uc3QgOjpkZWZpTm9uRGVmYXVsdCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpTm9uRGVmYXVsdCopb2JqKS0+bnVtTWluQ3V0cygpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpTm9uRGVmYXVsdF9jdXRMYXllck5hbWUgKGNvbnN0IDo6ZGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaU5vbkRlZmF1bHQqKW9iaiktPmN1dExheWVyTmFtZShpbmRleCk7Ci19Ci0KLWludCBkZWZpTm9uRGVmYXVsdF9udW1DdXRzIChjb25zdCA6OmRlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlOb25EZWZhdWx0KilvYmopLT5udW1DdXRzKGluZGV4KTsKLX0KLQotdm9pZCBkZWZpTm9uRGVmYXVsdF9wcmludCAoY29uc3QgOjpkZWZpTm9uRGVmYXVsdCogb2JqLCBGSUxFKiAgZikgewotICAgICgoTGVmRGVmUGFyc2VyOjpkZWZpTm9uRGVmYXVsdCopb2JqKS0+cHJpbnQoZik7Ci19Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZpUGFydGl0aW9uLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZpUGFydGl0aW9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFhYjg0ZC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi94ZGVmaVBhcnRpdGlvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBBVFRFTlRJT046IFRISVMgSVMgQU4gQVVUTy1HRU5FUkFURUQgRklMRS4gRE8gTk9UIENIQU5HRSBJVCEKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTIsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogeHh4ICQKLS8vICAkUmV2aXNpb246IHh4eCAkCi0vLyAgJERhdGU6IHh4eCAkCi0vLyAgJFN0YXRlOiB4eHggJCAgCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2RlZmluZSBFWFRFUk4gZXh0ZXJuICJDIgotCi0jaW5jbHVkZSAiZGVmaVBhcnRpdGlvbi5oIgotI2luY2x1ZGUgImRlZmlQYXJ0aXRpb24uaHBwIgotCi0vLyBXcmFwcGVycyBkZWZpbml0aW9ucy4KLWNvbnN0IGNoYXIqIGRlZmlQYXJ0aXRpb25fbmFtZSAoY29uc3QgOjpkZWZpUGFydGl0aW9uKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlQYXJ0aXRpb24qKW9iaiktPm5hbWUoKTsKLX0KLQotY2hhciBkZWZpUGFydGl0aW9uX2RpcmVjdGlvbiAoY29uc3QgOjpkZWZpUGFydGl0aW9uKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQYXJ0aXRpb24qKW9iaiktPmRpcmVjdGlvbigpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpUGFydGl0aW9uX2l0ZW1UeXBlIChjb25zdCA6OmRlZmlQYXJ0aXRpb24qIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaVBhcnRpdGlvbiopb2JqKS0+aXRlbVR5cGUoKTsKLX0KLQotY29uc3QgY2hhciogZGVmaVBhcnRpdGlvbl9waW5OYW1lIChjb25zdCA6OmRlZmlQYXJ0aXRpb24qIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaVBhcnRpdGlvbiopb2JqKS0+cGluTmFtZSgpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpUGFydGl0aW9uX2luc3ROYW1lIChjb25zdCA6OmRlZmlQYXJ0aXRpb24qIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaVBhcnRpdGlvbiopb2JqKS0+aW5zdE5hbWUoKTsKLX0KLQotaW50IGRlZmlQYXJ0aXRpb25fbnVtUGlucyAoY29uc3QgOjpkZWZpUGFydGl0aW9uKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQYXJ0aXRpb24qKW9iaiktPm51bVBpbnMoKTsKLX0KLQotY29uc3QgY2hhciogZGVmaVBhcnRpdGlvbl9waW4gKGNvbnN0IDo6ZGVmaVBhcnRpdGlvbiogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpUGFydGl0aW9uKilvYmopLT5waW4oaW5kZXgpOwotfQotCi1pbnQgZGVmaVBhcnRpdGlvbl9pc1NldHVwUmlzZSAoY29uc3QgOjpkZWZpUGFydGl0aW9uKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQYXJ0aXRpb24qKW9iaiktPmlzU2V0dXBSaXNlKCk7Ci19Ci0KLWludCBkZWZpUGFydGl0aW9uX2lzU2V0dXBGYWxsIChjb25zdCA6OmRlZmlQYXJ0aXRpb24qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBhcnRpdGlvbiopb2JqKS0+aXNTZXR1cEZhbGwoKTsKLX0KLQotaW50IGRlZmlQYXJ0aXRpb25faXNIb2xkUmlzZSAoY29uc3QgOjpkZWZpUGFydGl0aW9uKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQYXJ0aXRpb24qKW9iaiktPmlzSG9sZFJpc2UoKTsKLX0KLQotaW50IGRlZmlQYXJ0aXRpb25faXNIb2xkRmFsbCAoY29uc3QgOjpkZWZpUGFydGl0aW9uKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQYXJ0aXRpb24qKW9iaiktPmlzSG9sZEZhbGwoKTsKLX0KLQotaW50IGRlZmlQYXJ0aXRpb25faGFzTWluIChjb25zdCA6OmRlZmlQYXJ0aXRpb24qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBhcnRpdGlvbiopb2JqKS0+aGFzTWluKCk7Ci19Ci0KLWludCBkZWZpUGFydGl0aW9uX2hhc01heCAoY29uc3QgOjpkZWZpUGFydGl0aW9uKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQYXJ0aXRpb24qKW9iaiktPmhhc01heCgpOwotfQotCi1pbnQgZGVmaVBhcnRpdGlvbl9oYXNSaXNlTWluIChjb25zdCA6OmRlZmlQYXJ0aXRpb24qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBhcnRpdGlvbiopb2JqKS0+aGFzUmlzZU1pbigpOwotfQotCi1pbnQgZGVmaVBhcnRpdGlvbl9oYXNGYWxsTWluIChjb25zdCA6OmRlZmlQYXJ0aXRpb24qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBhcnRpdGlvbiopb2JqKS0+aGFzRmFsbE1pbigpOwotfQotCi1pbnQgZGVmaVBhcnRpdGlvbl9oYXNSaXNlTWF4IChjb25zdCA6OmRlZmlQYXJ0aXRpb24qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBhcnRpdGlvbiopb2JqKS0+aGFzUmlzZU1heCgpOwotfQotCi1pbnQgZGVmaVBhcnRpdGlvbl9oYXNGYWxsTWF4IChjb25zdCA6OmRlZmlQYXJ0aXRpb24qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBhcnRpdGlvbiopb2JqKS0+aGFzRmFsbE1heCgpOwotfQotCi1pbnQgZGVmaVBhcnRpdGlvbl9oYXNSaXNlTWluUmFuZ2UgKGNvbnN0IDo6ZGVmaVBhcnRpdGlvbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGFydGl0aW9uKilvYmopLT5oYXNSaXNlTWluUmFuZ2UoKTsKLX0KLQotaW50IGRlZmlQYXJ0aXRpb25faGFzRmFsbE1pblJhbmdlIChjb25zdCA6OmRlZmlQYXJ0aXRpb24qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBhcnRpdGlvbiopb2JqKS0+aGFzRmFsbE1pblJhbmdlKCk7Ci19Ci0KLWludCBkZWZpUGFydGl0aW9uX2hhc1Jpc2VNYXhSYW5nZSAoY29uc3QgOjpkZWZpUGFydGl0aW9uKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQYXJ0aXRpb24qKW9iaiktPmhhc1Jpc2VNYXhSYW5nZSgpOwotfQotCi1pbnQgZGVmaVBhcnRpdGlvbl9oYXNGYWxsTWF4UmFuZ2UgKGNvbnN0IDo6ZGVmaVBhcnRpdGlvbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGFydGl0aW9uKilvYmopLT5oYXNGYWxsTWF4UmFuZ2UoKTsKLX0KLQotZG91YmxlIGRlZmlQYXJ0aXRpb25fcGFydGl0aW9uTWluIChjb25zdCA6OmRlZmlQYXJ0aXRpb24qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBhcnRpdGlvbiopb2JqKS0+cGFydGl0aW9uTWluKCk7Ci19Ci0KLWRvdWJsZSBkZWZpUGFydGl0aW9uX3BhcnRpdGlvbk1heCAoY29uc3QgOjpkZWZpUGFydGl0aW9uKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQYXJ0aXRpb24qKW9iaiktPnBhcnRpdGlvbk1heCgpOwotfQotCi1kb3VibGUgZGVmaVBhcnRpdGlvbl9yaXNlTWluIChjb25zdCA6OmRlZmlQYXJ0aXRpb24qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBhcnRpdGlvbiopb2JqKS0+cmlzZU1pbigpOwotfQotCi1kb3VibGUgZGVmaVBhcnRpdGlvbl9mYWxsTWluIChjb25zdCA6OmRlZmlQYXJ0aXRpb24qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBhcnRpdGlvbiopb2JqKS0+ZmFsbE1pbigpOwotfQotCi1kb3VibGUgZGVmaVBhcnRpdGlvbl9yaXNlTWF4IChjb25zdCA6OmRlZmlQYXJ0aXRpb24qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBhcnRpdGlvbiopb2JqKS0+cmlzZU1heCgpOwotfQotCi1kb3VibGUgZGVmaVBhcnRpdGlvbl9mYWxsTWF4IChjb25zdCA6OmRlZmlQYXJ0aXRpb24qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBhcnRpdGlvbiopb2JqKS0+ZmFsbE1heCgpOwotfQotCi1kb3VibGUgZGVmaVBhcnRpdGlvbl9yaXNlTWluTGVmdCAoY29uc3QgOjpkZWZpUGFydGl0aW9uKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQYXJ0aXRpb24qKW9iaiktPnJpc2VNaW5MZWZ0KCk7Ci19Ci0KLWRvdWJsZSBkZWZpUGFydGl0aW9uX2ZhbGxNaW5MZWZ0IChjb25zdCA6OmRlZmlQYXJ0aXRpb24qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBhcnRpdGlvbiopb2JqKS0+ZmFsbE1pbkxlZnQoKTsKLX0KLQotZG91YmxlIGRlZmlQYXJ0aXRpb25fcmlzZU1heExlZnQgKGNvbnN0IDo6ZGVmaVBhcnRpdGlvbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGFydGl0aW9uKilvYmopLT5yaXNlTWF4TGVmdCgpOwotfQotCi1kb3VibGUgZGVmaVBhcnRpdGlvbl9mYWxsTWF4TGVmdCAoY29uc3QgOjpkZWZpUGFydGl0aW9uKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQYXJ0aXRpb24qKW9iaiktPmZhbGxNYXhMZWZ0KCk7Ci19Ci0KLWRvdWJsZSBkZWZpUGFydGl0aW9uX3Jpc2VNaW5SaWdodCAoY29uc3QgOjpkZWZpUGFydGl0aW9uKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQYXJ0aXRpb24qKW9iaiktPnJpc2VNaW5SaWdodCgpOwotfQotCi1kb3VibGUgZGVmaVBhcnRpdGlvbl9mYWxsTWluUmlnaHQgKGNvbnN0IDo6ZGVmaVBhcnRpdGlvbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGFydGl0aW9uKilvYmopLT5mYWxsTWluUmlnaHQoKTsKLX0KLQotZG91YmxlIGRlZmlQYXJ0aXRpb25fcmlzZU1heFJpZ2h0IChjb25zdCA6OmRlZmlQYXJ0aXRpb24qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBhcnRpdGlvbiopb2JqKS0+cmlzZU1heFJpZ2h0KCk7Ci19Ci0KLWRvdWJsZSBkZWZpUGFydGl0aW9uX2ZhbGxNYXhSaWdodCAoY29uc3QgOjpkZWZpUGFydGl0aW9uKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQYXJ0aXRpb24qKW9iaiktPmZhbGxNYXhSaWdodCgpOwotfQotCi12b2lkIGRlZmlQYXJ0aXRpb25fcHJpbnQgKGNvbnN0IDo6ZGVmaVBhcnRpdGlvbiogb2JqLCBGSUxFKiAgZikgewotICAgICgoTGVmRGVmUGFyc2VyOjpkZWZpUGFydGl0aW9uKilvYmopLT5wcmludChmKTsKLX0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYveGRlZmlQYXRoLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZpUGF0aC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmOTA0ZmQuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYveGRlZmlQYXRoLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIEFUVEVOVElPTjogVEhJUyBJUyBBTiBBVVRPLUdFTkVSQVRFRCBGSUxFLiBETyBOT1QgQ0hBTkdFIElUIQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiB4eHggJAotLy8gICRSZXZpc2lvbjogeHh4ICQKLS8vICAkRGF0ZTogeHh4ICQKLS8vICAkU3RhdGU6IHh4eCAkICAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jZGVmaW5lIEVYVEVSTiBleHRlcm4gIkMiCi0KLSNpbmNsdWRlICJkZWZpUGF0aC5oIgotI2luY2x1ZGUgImRlZmlQYXRoLmhwcCIKLQotLy8gV3JhcHBlcnMgZGVmaW5pdGlvbnMuCi12b2lkIGRlZmlQYXRoX2luaXRUcmF2ZXJzZSAoY29uc3QgOjpkZWZpUGF0aCogb2JqKSB7Ci0gICAgKChMZWZEZWZQYXJzZXI6OmRlZmlQYXRoKilvYmopLT5pbml0VHJhdmVyc2UoKTsKLX0KLQotdm9pZCBkZWZpUGF0aF9pbml0VHJhdmVyc2VCYWNrd2FyZHMgKGNvbnN0IDo6ZGVmaVBhdGgqIG9iaikgewotICAgICgoTGVmRGVmUGFyc2VyOjpkZWZpUGF0aCopb2JqKS0+aW5pdFRyYXZlcnNlQmFja3dhcmRzKCk7Ci19Ci0KLWludCBkZWZpUGF0aF9uZXh0IChjb25zdCA6OmRlZmlQYXRoKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQYXRoKilvYmopLT5uZXh0KCk7Ci19Ci0KLWludCBkZWZpUGF0aF9wcmV2IChjb25zdCA6OmRlZmlQYXRoKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQYXRoKilvYmopLT5wcmV2KCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlQYXRoX2dldExheWVyIChjb25zdCA6OmRlZmlQYXRoKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlQYXRoKilvYmopLT5nZXRMYXllcigpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpUGF0aF9nZXRUYXBlclJ1bGUgKGNvbnN0IDo6ZGVmaVBhdGgqIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaVBhdGgqKW9iaiktPmdldFRhcGVyUnVsZSgpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpUGF0aF9nZXRWaWEgKGNvbnN0IDo6ZGVmaVBhdGgqIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaVBhdGgqKW9iaiktPmdldFZpYSgpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpUGF0aF9nZXRTaGFwZSAoY29uc3QgOjpkZWZpUGF0aCogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpUGF0aCopb2JqKS0+Z2V0U2hhcGUoKTsKLX0KLQotaW50IGRlZmlQYXRoX2dldFRhcGVyIChjb25zdCA6OmRlZmlQYXRoKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQYXRoKilvYmopLT5nZXRUYXBlcigpOwotfQotCi1pbnQgZGVmaVBhdGhfZ2V0U3R5bGUgKGNvbnN0IDo6ZGVmaVBhdGgqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBhdGgqKW9iaiktPmdldFN0eWxlKCk7Ci19Ci0KLWludCBkZWZpUGF0aF9nZXRWaWFSb3RhdGlvbiAoY29uc3QgOjpkZWZpUGF0aCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGF0aCopb2JqKS0+Z2V0VmlhUm90YXRpb24oKTsKLX0KLQotdm9pZCBkZWZpUGF0aF9nZXRWaWFSZWN0IChjb25zdCA6OmRlZmlQYXRoKiBvYmosIGludCogIGRlbHRhWDEsIGludCogIGRlbHRhWTEsIGludCogIGRlbHRhWDIsIGludCogIGRlbHRhWTIpIHsKLSAgICAoKExlZkRlZlBhcnNlcjo6ZGVmaVBhdGgqKW9iaiktPmdldFZpYVJlY3QoZGVsdGFYMSwgZGVsdGFZMSwgZGVsdGFYMiwgZGVsdGFZMik7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlQYXRoX2dldFZpYVJvdGF0aW9uU3RyIChjb25zdCA6OmRlZmlQYXRoKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlQYXRoKilvYmopLT5nZXRWaWFSb3RhdGlvblN0cigpOwotfQotCi12b2lkIGRlZmlQYXRoX2dldFZpYURhdGEgKGNvbnN0IDo6ZGVmaVBhdGgqIG9iaiwgaW50KiAgbnVtWCwgaW50KiAgbnVtWSwgaW50KiAgc3RlcFgsIGludCogIHN0ZXBZKSB7Ci0gICAgKChMZWZEZWZQYXJzZXI6OmRlZmlQYXRoKilvYmopLT5nZXRWaWFEYXRhKG51bVgsIG51bVksIHN0ZXBYLCBzdGVwWSk7Ci19Ci0KLWludCBkZWZpUGF0aF9nZXRXaWR0aCAoY29uc3QgOjpkZWZpUGF0aCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGF0aCopb2JqKS0+Z2V0V2lkdGgoKTsKLX0KLQotdm9pZCBkZWZpUGF0aF9nZXRQb2ludCAoY29uc3QgOjpkZWZpUGF0aCogb2JqLCBpbnQqICB4LCBpbnQqICB5KSB7Ci0gICAgKChMZWZEZWZQYXJzZXI6OmRlZmlQYXRoKilvYmopLT5nZXRQb2ludCh4LCB5KTsKLX0KLQotdm9pZCBkZWZpUGF0aF9nZXRGbHVzaFBvaW50IChjb25zdCA6OmRlZmlQYXRoKiBvYmosIGludCogIHgsIGludCogIHksIGludCogIGV4dCkgewotICAgICgoTGVmRGVmUGFyc2VyOjpkZWZpUGF0aCopb2JqKS0+Z2V0Rmx1c2hQb2ludCh4LCB5LCBleHQpOwotfQotCi12b2lkIGRlZmlQYXRoX2dldFZpcnR1YWxQb2ludCAoY29uc3QgOjpkZWZpUGF0aCogb2JqLCBpbnQqICB4LCBpbnQqICB5KSB7Ci0gICAgKChMZWZEZWZQYXJzZXI6OmRlZmlQYXRoKilvYmopLT5nZXRWaXJ0dWFsUG9pbnQoeCwgeSk7Ci19Ci0KLWludCBkZWZpUGF0aF9nZXRNYXNrIChjb25zdCA6OmRlZmlQYXRoKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQYXRoKilvYmopLT5nZXRNYXNrKCk7Ci19Ci0KLWludCBkZWZpUGF0aF9nZXRWaWFUb3BNYXNrIChjb25zdCA6OmRlZmlQYXRoKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQYXRoKilvYmopLT5nZXRWaWFUb3BNYXNrKCk7Ci19Ci0KLWludCBkZWZpUGF0aF9nZXRWaWFDdXRNYXNrIChjb25zdCA6OmRlZmlQYXRoKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQYXRoKilvYmopLT5nZXRWaWFDdXRNYXNrKCk7Ci19Ci0KLWludCBkZWZpUGF0aF9nZXRWaWFCb3R0b21NYXNrIChjb25zdCA6OmRlZmlQYXRoKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQYXRoKilvYmopLT5nZXRWaWFCb3R0b21NYXNrKCk7Ci19Ci0KLWludCBkZWZpUGF0aF9nZXRSZWN0TWFzayAoY29uc3QgOjpkZWZpUGF0aCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGF0aCopb2JqKS0+Z2V0UmVjdE1hc2soKTsKLX0KLQotdm9pZCBkZWZpUGF0aF9wcmludCAoY29uc3QgOjpkZWZpUGF0aCogb2JqLCBGSUxFKiAgZm91dCkgewotICAgICgoTGVmRGVmUGFyc2VyOjpkZWZpUGF0aCopb2JqKS0+cHJpbnQoZm91dCk7Ci19Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZpUGluQ2FwLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZpUGluQ2FwLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZhMGY5MS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi94ZGVmaVBpbkNhcC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NTEgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBBVFRFTlRJT046IFRISVMgSVMgQU4gQVVUTy1HRU5FUkFURUQgRklMRS4gRE8gTk9UIENIQU5HRSBJVCEKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTIsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogeHh4ICQKLS8vICAkUmV2aXNpb246IHh4eCAkCi0vLyAgJERhdGU6IHh4eCAkCi0vLyAgJFN0YXRlOiB4eHggJCAgCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2RlZmluZSBFWFRFUk4gZXh0ZXJuICJDIgotCi0jaW5jbHVkZSAiZGVmaVBpbkNhcC5oIgotI2luY2x1ZGUgImRlZmlQaW5DYXAuaHBwIgotCi0vLyBXcmFwcGVycyBkZWZpbml0aW9ucy4KLWludCBkZWZpUGluQ2FwX3BpbiAoY29uc3QgOjpkZWZpUGluQ2FwKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW5DYXAqKW9iaiktPnBpbigpOwotfQotCi1kb3VibGUgZGVmaVBpbkNhcF9jYXAgKGNvbnN0IDo6ZGVmaVBpbkNhcCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGluQ2FwKilvYmopLT5jYXAoKTsKLX0KLQotdm9pZCBkZWZpUGluQ2FwX3ByaW50IChjb25zdCA6OmRlZmlQaW5DYXAqIG9iaiwgRklMRSogIGYpIHsKLSAgICAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpbkNhcCopb2JqKS0+cHJpbnQoZik7Ci19Ci0KLWNoYXIqIGRlZmlQaW5BbnRlbm5hTW9kZWxfYW50ZW5uYU94aWRlIChjb25zdCA6OmRlZmlQaW5BbnRlbm5hTW9kZWwqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpbkFudGVubmFNb2RlbCopb2JqKS0+YW50ZW5uYU94aWRlKCk7Ci19Ci0KLWludCBkZWZpUGluQW50ZW5uYU1vZGVsX2hhc0FQaW5HYXRlQXJlYSAoY29uc3QgOjpkZWZpUGluQW50ZW5uYU1vZGVsKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW5BbnRlbm5hTW9kZWwqKW9iaiktPmhhc0FQaW5HYXRlQXJlYSgpOwotfQotCi1pbnQgZGVmaVBpbkFudGVubmFNb2RlbF9udW1BUGluR2F0ZUFyZWEgKGNvbnN0IDo6ZGVmaVBpbkFudGVubmFNb2RlbCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGluQW50ZW5uYU1vZGVsKilvYmopLT5udW1BUGluR2F0ZUFyZWEoKTsKLX0KLQotaW50IGRlZmlQaW5BbnRlbm5hTW9kZWxfQVBpbkdhdGVBcmVhIChjb25zdCA6OmRlZmlQaW5BbnRlbm5hTW9kZWwqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpbkFudGVubmFNb2RlbCopb2JqKS0+QVBpbkdhdGVBcmVhKGluZGV4KTsKLX0KLQotaW50IGRlZmlQaW5BbnRlbm5hTW9kZWxfaGFzQVBpbkdhdGVBcmVhTGF5ZXIgKGNvbnN0IDo6ZGVmaVBpbkFudGVubmFNb2RlbCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGluQW50ZW5uYU1vZGVsKilvYmopLT5oYXNBUGluR2F0ZUFyZWFMYXllcihpbmRleCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlQaW5BbnRlbm5hTW9kZWxfQVBpbkdhdGVBcmVhTGF5ZXIgKGNvbnN0IDo6ZGVmaVBpbkFudGVubmFNb2RlbCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpUGluQW50ZW5uYU1vZGVsKilvYmopLT5BUGluR2F0ZUFyZWFMYXllcihpbmRleCk7Ci19Ci0KLWludCBkZWZpUGluQW50ZW5uYU1vZGVsX2hhc0FQaW5NYXhBcmVhQ2FyIChjb25zdCA6OmRlZmlQaW5BbnRlbm5hTW9kZWwqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpbkFudGVubmFNb2RlbCopb2JqKS0+aGFzQVBpbk1heEFyZWFDYXIoKTsKLX0KLQotaW50IGRlZmlQaW5BbnRlbm5hTW9kZWxfbnVtQVBpbk1heEFyZWFDYXIgKGNvbnN0IDo6ZGVmaVBpbkFudGVubmFNb2RlbCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGluQW50ZW5uYU1vZGVsKilvYmopLT5udW1BUGluTWF4QXJlYUNhcigpOwotfQotCi1pbnQgZGVmaVBpbkFudGVubmFNb2RlbF9BUGluTWF4QXJlYUNhciAoY29uc3QgOjpkZWZpUGluQW50ZW5uYU1vZGVsKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW5BbnRlbm5hTW9kZWwqKW9iaiktPkFQaW5NYXhBcmVhQ2FyKGluZGV4KTsKLX0KLQotaW50IGRlZmlQaW5BbnRlbm5hTW9kZWxfaGFzQVBpbk1heEFyZWFDYXJMYXllciAoY29uc3QgOjpkZWZpUGluQW50ZW5uYU1vZGVsKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW5BbnRlbm5hTW9kZWwqKW9iaiktPmhhc0FQaW5NYXhBcmVhQ2FyTGF5ZXIoaW5kZXgpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpUGluQW50ZW5uYU1vZGVsX0FQaW5NYXhBcmVhQ2FyTGF5ZXIgKGNvbnN0IDo6ZGVmaVBpbkFudGVubmFNb2RlbCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpUGluQW50ZW5uYU1vZGVsKilvYmopLT5BUGluTWF4QXJlYUNhckxheWVyKGluZGV4KTsKLX0KLQotaW50IGRlZmlQaW5BbnRlbm5hTW9kZWxfaGFzQVBpbk1heFNpZGVBcmVhQ2FyIChjb25zdCA6OmRlZmlQaW5BbnRlbm5hTW9kZWwqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpbkFudGVubmFNb2RlbCopb2JqKS0+aGFzQVBpbk1heFNpZGVBcmVhQ2FyKCk7Ci19Ci0KLWludCBkZWZpUGluQW50ZW5uYU1vZGVsX251bUFQaW5NYXhTaWRlQXJlYUNhciAoY29uc3QgOjpkZWZpUGluQW50ZW5uYU1vZGVsKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW5BbnRlbm5hTW9kZWwqKW9iaiktPm51bUFQaW5NYXhTaWRlQXJlYUNhcigpOwotfQotCi1pbnQgZGVmaVBpbkFudGVubmFNb2RlbF9BUGluTWF4U2lkZUFyZWFDYXIgKGNvbnN0IDo6ZGVmaVBpbkFudGVubmFNb2RlbCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGluQW50ZW5uYU1vZGVsKilvYmopLT5BUGluTWF4U2lkZUFyZWFDYXIoaW5kZXgpOwotfQotCi1pbnQgZGVmaVBpbkFudGVubmFNb2RlbF9oYXNBUGluTWF4U2lkZUFyZWFDYXJMYXllciAoY29uc3QgOjpkZWZpUGluQW50ZW5uYU1vZGVsKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW5BbnRlbm5hTW9kZWwqKW9iaiktPmhhc0FQaW5NYXhTaWRlQXJlYUNhckxheWVyKGluZGV4KTsKLX0KLQotY29uc3QgY2hhciogZGVmaVBpbkFudGVubmFNb2RlbF9BUGluTWF4U2lkZUFyZWFDYXJMYXllciAoY29uc3QgOjpkZWZpUGluQW50ZW5uYU1vZGVsKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlQaW5BbnRlbm5hTW9kZWwqKW9iaiktPkFQaW5NYXhTaWRlQXJlYUNhckxheWVyKGluZGV4KTsKLX0KLQotaW50IGRlZmlQaW5BbnRlbm5hTW9kZWxfaGFzQVBpbk1heEN1dENhciAoY29uc3QgOjpkZWZpUGluQW50ZW5uYU1vZGVsKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW5BbnRlbm5hTW9kZWwqKW9iaiktPmhhc0FQaW5NYXhDdXRDYXIoKTsKLX0KLQotaW50IGRlZmlQaW5BbnRlbm5hTW9kZWxfbnVtQVBpbk1heEN1dENhciAoY29uc3QgOjpkZWZpUGluQW50ZW5uYU1vZGVsKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW5BbnRlbm5hTW9kZWwqKW9iaiktPm51bUFQaW5NYXhDdXRDYXIoKTsKLX0KLQotaW50IGRlZmlQaW5BbnRlbm5hTW9kZWxfQVBpbk1heEN1dENhciAoY29uc3QgOjpkZWZpUGluQW50ZW5uYU1vZGVsKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW5BbnRlbm5hTW9kZWwqKW9iaiktPkFQaW5NYXhDdXRDYXIoaW5kZXgpOwotfQotCi1pbnQgZGVmaVBpbkFudGVubmFNb2RlbF9oYXNBUGluTWF4Q3V0Q2FyTGF5ZXIgKGNvbnN0IDo6ZGVmaVBpbkFudGVubmFNb2RlbCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGluQW50ZW5uYU1vZGVsKilvYmopLT5oYXNBUGluTWF4Q3V0Q2FyTGF5ZXIoaW5kZXgpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpUGluQW50ZW5uYU1vZGVsX0FQaW5NYXhDdXRDYXJMYXllciAoY29uc3QgOjpkZWZpUGluQW50ZW5uYU1vZGVsKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlQaW5BbnRlbm5hTW9kZWwqKW9iaiktPkFQaW5NYXhDdXRDYXJMYXllcihpbmRleCk7Ci19Ci0KLWludCBkZWZpUGluUG9ydF9udW1MYXllciAoY29uc3QgOjpkZWZpUGluUG9ydCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGluUG9ydCopb2JqKS0+bnVtTGF5ZXIoKTsKLX0KLQotY29uc3QgY2hhciogZGVmaVBpblBvcnRfbGF5ZXIgKGNvbnN0IDo6ZGVmaVBpblBvcnQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaVBpblBvcnQqKW9iaiktPmxheWVyKGluZGV4KTsKLX0KLQotdm9pZCBkZWZpUGluUG9ydF9ib3VuZHMgKGNvbnN0IDo6ZGVmaVBpblBvcnQqIG9iaiwgaW50ICBpbmRleCwgaW50KiAgeGwsIGludCogIHlsLCBpbnQqICB4aCwgaW50KiAgeWgpIHsKLSAgICAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpblBvcnQqKW9iaiktPmJvdW5kcyhpbmRleCwgeGwsIHlsLCB4aCwgeWgpOwotfQotCi1pbnQgZGVmaVBpblBvcnRfaGFzTGF5ZXJTcGFjaW5nIChjb25zdCA6OmRlZmlQaW5Qb3J0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW5Qb3J0KilvYmopLT5oYXNMYXllclNwYWNpbmcoaW5kZXgpOwotfQotCi1pbnQgZGVmaVBpblBvcnRfaGFzTGF5ZXJEZXNpZ25SdWxlV2lkdGggKGNvbnN0IDo6ZGVmaVBpblBvcnQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpblBvcnQqKW9iaiktPmhhc0xheWVyRGVzaWduUnVsZVdpZHRoKGluZGV4KTsKLX0KLQotaW50IGRlZmlQaW5Qb3J0X2xheWVyU3BhY2luZyAoY29uc3QgOjpkZWZpUGluUG9ydCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGluUG9ydCopb2JqKS0+bGF5ZXJTcGFjaW5nKGluZGV4KTsKLX0KLQotaW50IGRlZmlQaW5Qb3J0X2xheWVyTWFzayAoY29uc3QgOjpkZWZpUGluUG9ydCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGluUG9ydCopb2JqKS0+bGF5ZXJNYXNrKGluZGV4KTsKLX0KLQotaW50IGRlZmlQaW5Qb3J0X2xheWVyRGVzaWduUnVsZVdpZHRoIChjb25zdCA6OmRlZmlQaW5Qb3J0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW5Qb3J0KilvYmopLT5sYXllckRlc2lnblJ1bGVXaWR0aChpbmRleCk7Ci19Ci0KLWludCBkZWZpUGluUG9ydF9udW1Qb2x5Z29ucyAoY29uc3QgOjpkZWZpUGluUG9ydCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGluUG9ydCopb2JqKS0+bnVtUG9seWdvbnMoKTsKLX0KLQotY29uc3QgY2hhciogZGVmaVBpblBvcnRfcG9seWdvbk5hbWUgKGNvbnN0IDo6ZGVmaVBpblBvcnQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaVBpblBvcnQqKW9iaiktPnBvbHlnb25OYW1lKGluZGV4KTsKLX0KLQotOjpkZWZpUG9pbnRzIGRlZmlQaW5Qb3J0X2dldFBvbHlnb24gKGNvbnN0IDo6ZGVmaVBpblBvcnQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmaVBvaW50cyB0bXA7Ci0gICAgdG1wID0gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW5Qb3J0KilvYmopLT5nZXRQb2x5Z29uKGluZGV4KTsKLSAgICByZXR1cm4gKigoOjpkZWZpUG9pbnRzKikmdG1wKTsKLX0KLQotaW50IGRlZmlQaW5Qb3J0X2hhc1BvbHlnb25TcGFjaW5nIChjb25zdCA6OmRlZmlQaW5Qb3J0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW5Qb3J0KilvYmopLT5oYXNQb2x5Z29uU3BhY2luZyhpbmRleCk7Ci19Ci0KLWludCBkZWZpUGluUG9ydF9oYXNQb2x5Z29uRGVzaWduUnVsZVdpZHRoIChjb25zdCA6OmRlZmlQaW5Qb3J0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW5Qb3J0KilvYmopLT5oYXNQb2x5Z29uRGVzaWduUnVsZVdpZHRoKGluZGV4KTsKLX0KLQotaW50IGRlZmlQaW5Qb3J0X3BvbHlnb25TcGFjaW5nIChjb25zdCA6OmRlZmlQaW5Qb3J0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW5Qb3J0KilvYmopLT5wb2x5Z29uU3BhY2luZyhpbmRleCk7Ci19Ci0KLWludCBkZWZpUGluUG9ydF9wb2x5Z29uRGVzaWduUnVsZVdpZHRoIChjb25zdCA6OmRlZmlQaW5Qb3J0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW5Qb3J0KilvYmopLT5wb2x5Z29uRGVzaWduUnVsZVdpZHRoKGluZGV4KTsKLX0KLQotaW50IGRlZmlQaW5Qb3J0X3BvbHlnb25NYXNrIChjb25zdCA6OmRlZmlQaW5Qb3J0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW5Qb3J0KilvYmopLT5wb2x5Z29uTWFzayhpbmRleCk7Ci19Ci0KLWludCBkZWZpUGluUG9ydF9udW1WaWFzIChjb25zdCA6OmRlZmlQaW5Qb3J0KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW5Qb3J0KilvYmopLT5udW1WaWFzKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlQaW5Qb3J0X3ZpYU5hbWUgKGNvbnN0IDo6ZGVmaVBpblBvcnQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaVBpblBvcnQqKW9iaiktPnZpYU5hbWUoaW5kZXgpOwotfQotCi1pbnQgZGVmaVBpblBvcnRfdmlhUHRYIChjb25zdCA6OmRlZmlQaW5Qb3J0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW5Qb3J0KilvYmopLT52aWFQdFgoaW5kZXgpOwotfQotCi1pbnQgZGVmaVBpblBvcnRfdmlhUHRZIChjb25zdCA6OmRlZmlQaW5Qb3J0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW5Qb3J0KilvYmopLT52aWFQdFkoaW5kZXgpOwotfQotCi1pbnQgZGVmaVBpblBvcnRfdmlhVG9wTWFzayAoY29uc3QgOjpkZWZpUGluUG9ydCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGluUG9ydCopb2JqKS0+dmlhVG9wTWFzayhpbmRleCk7Ci19Ci0KLWludCBkZWZpUGluUG9ydF92aWFDdXRNYXNrIChjb25zdCA6OmRlZmlQaW5Qb3J0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW5Qb3J0KilvYmopLT52aWFDdXRNYXNrKGluZGV4KTsKLX0KLQotaW50IGRlZmlQaW5Qb3J0X3ZpYUJvdHRvbU1hc2sgKGNvbnN0IDo6ZGVmaVBpblBvcnQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpblBvcnQqKW9iaiktPnZpYUJvdHRvbU1hc2soaW5kZXgpOwotfQotCi1pbnQgZGVmaVBpblBvcnRfaGFzUGxhY2VtZW50IChjb25zdCA6OmRlZmlQaW5Qb3J0KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW5Qb3J0KilvYmopLT5oYXNQbGFjZW1lbnQoKTsKLX0KLQotaW50IGRlZmlQaW5Qb3J0X2lzUGxhY2VkIChjb25zdCA6OmRlZmlQaW5Qb3J0KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW5Qb3J0KilvYmopLT5pc1BsYWNlZCgpOwotfQotCi1pbnQgZGVmaVBpblBvcnRfaXNDb3ZlciAoY29uc3QgOjpkZWZpUGluUG9ydCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGluUG9ydCopb2JqKS0+aXNDb3ZlcigpOwotfQotCi1pbnQgZGVmaVBpblBvcnRfaXNGaXhlZCAoY29uc3QgOjpkZWZpUGluUG9ydCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGluUG9ydCopb2JqKS0+aXNGaXhlZCgpOwotfQotCi1pbnQgZGVmaVBpblBvcnRfcGxhY2VtZW50WCAoY29uc3QgOjpkZWZpUGluUG9ydCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGluUG9ydCopb2JqKS0+cGxhY2VtZW50WCgpOwotfQotCi1pbnQgZGVmaVBpblBvcnRfcGxhY2VtZW50WSAoY29uc3QgOjpkZWZpUGluUG9ydCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGluUG9ydCopb2JqKS0+cGxhY2VtZW50WSgpOwotfQotCi1pbnQgZGVmaVBpblBvcnRfb3JpZW50IChjb25zdCA6OmRlZmlQaW5Qb3J0KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW5Qb3J0KilvYmopLT5vcmllbnQoKTsKLX0KLQotY29uc3QgY2hhciogZGVmaVBpblBvcnRfb3JpZW50U3RyIChjb25zdCA6OmRlZmlQaW5Qb3J0KiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlQaW5Qb3J0KilvYmopLT5vcmllbnRTdHIoKTsKLX0KLQotY29uc3QgY2hhciogZGVmaVBpbl9waW5OYW1lIChjb25zdCA6OmRlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+cGluTmFtZSgpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpUGluX25ldE5hbWUgKGNvbnN0IDo6ZGVmaVBpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpUGluKilvYmopLT5uZXROYW1lKCk7Ci19Ci0KLWludCBkZWZpUGluX2hhc0RpcmVjdGlvbiAoY29uc3QgOjpkZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW4qKW9iaiktPmhhc0RpcmVjdGlvbigpOwotfQotCi1pbnQgZGVmaVBpbl9oYXNVc2UgKGNvbnN0IDo6ZGVmaVBpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGluKilvYmopLT5oYXNVc2UoKTsKLX0KLQotaW50IGRlZmlQaW5faGFzTGF5ZXIgKGNvbnN0IDo6ZGVmaVBpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGluKilvYmopLT5oYXNMYXllcigpOwotfQotCi1pbnQgZGVmaVBpbl9oYXNQbGFjZW1lbnQgKGNvbnN0IDo6ZGVmaVBpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGluKilvYmopLT5oYXNQbGFjZW1lbnQoKTsKLX0KLQotaW50IGRlZmlQaW5faXNVbnBsYWNlZCAoY29uc3QgOjpkZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW4qKW9iaiktPmlzVW5wbGFjZWQoKTsKLX0KLQotaW50IGRlZmlQaW5faXNQbGFjZWQgKGNvbnN0IDo6ZGVmaVBpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGluKilvYmopLT5pc1BsYWNlZCgpOwotfQotCi1pbnQgZGVmaVBpbl9pc0NvdmVyIChjb25zdCA6OmRlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+aXNDb3ZlcigpOwotfQotCi1pbnQgZGVmaVBpbl9pc0ZpeGVkIChjb25zdCA6OmRlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+aXNGaXhlZCgpOwotfQotCi1pbnQgZGVmaVBpbl9wbGFjZW1lbnRYIChjb25zdCA6OmRlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+cGxhY2VtZW50WCgpOwotfQotCi1pbnQgZGVmaVBpbl9wbGFjZW1lbnRZIChjb25zdCA6OmRlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+cGxhY2VtZW50WSgpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpUGluX2RpcmVjdGlvbiAoY29uc3QgOjpkZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlQaW4qKW9iaiktPmRpcmVjdGlvbigpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpUGluX3VzZSAoY29uc3QgOjpkZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlQaW4qKW9iaiktPnVzZSgpOwotfQotCi1pbnQgZGVmaVBpbl9udW1MYXllciAoY29uc3QgOjpkZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW4qKW9iaiktPm51bUxheWVyKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlQaW5fbGF5ZXIgKGNvbnN0IDo6ZGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpUGluKilvYmopLT5sYXllcihpbmRleCk7Ci19Ci0KLXZvaWQgZGVmaVBpbl9ib3VuZHMgKGNvbnN0IDo6ZGVmaVBpbiogb2JqLCBpbnQgIGluZGV4LCBpbnQqICB4bCwgaW50KiAgeWwsIGludCogIHhoLCBpbnQqICB5aCkgewotICAgICgoTGVmRGVmUGFyc2VyOjpkZWZpUGluKilvYmopLT5ib3VuZHMoaW5kZXgsIHhsLCB5bCwgeGgsIHloKTsKLX0KLQotaW50IGRlZmlQaW5fbGF5ZXJNYXNrIChjb25zdCA6OmRlZmlQaW4qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+bGF5ZXJNYXNrKGluZGV4KTsKLX0KLQotaW50IGRlZmlQaW5faGFzTGF5ZXJTcGFjaW5nIChjb25zdCA6OmRlZmlQaW4qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+aGFzTGF5ZXJTcGFjaW5nKGluZGV4KTsKLX0KLQotaW50IGRlZmlQaW5faGFzTGF5ZXJEZXNpZ25SdWxlV2lkdGggKGNvbnN0IDo6ZGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGluKilvYmopLT5oYXNMYXllckRlc2lnblJ1bGVXaWR0aChpbmRleCk7Ci19Ci0KLWludCBkZWZpUGluX2xheWVyU3BhY2luZyAoY29uc3QgOjpkZWZpUGluKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW4qKW9iaiktPmxheWVyU3BhY2luZyhpbmRleCk7Ci19Ci0KLWludCBkZWZpUGluX2xheWVyRGVzaWduUnVsZVdpZHRoIChjb25zdCA6OmRlZmlQaW4qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+bGF5ZXJEZXNpZ25SdWxlV2lkdGgoaW5kZXgpOwotfQotCi1pbnQgZGVmaVBpbl9udW1Qb2x5Z29ucyAoY29uc3QgOjpkZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW4qKW9iaiktPm51bVBvbHlnb25zKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlQaW5fcG9seWdvbk5hbWUgKGNvbnN0IDo6ZGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpUGluKilvYmopLT5wb2x5Z29uTmFtZShpbmRleCk7Ci19Ci0KLTo6ZGVmaVBvaW50cyBkZWZpUGluX2dldFBvbHlnb24gKGNvbnN0IDo6ZGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZpUG9pbnRzIHRtcDsKLSAgICB0bXAgPSAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+Z2V0UG9seWdvbihpbmRleCk7Ci0gICAgcmV0dXJuICooKDo6ZGVmaVBvaW50cyopJnRtcCk7Ci19Ci0KLWludCBkZWZpUGluX3BvbHlnb25NYXNrIChjb25zdCA6OmRlZmlQaW4qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+cG9seWdvbk1hc2soaW5kZXgpOwotfQotCi1pbnQgZGVmaVBpbl9oYXNQb2x5Z29uU3BhY2luZyAoY29uc3QgOjpkZWZpUGluKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW4qKW9iaiktPmhhc1BvbHlnb25TcGFjaW5nKGluZGV4KTsKLX0KLQotaW50IGRlZmlQaW5faGFzUG9seWdvbkRlc2lnblJ1bGVXaWR0aCAoY29uc3QgOjpkZWZpUGluKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW4qKW9iaiktPmhhc1BvbHlnb25EZXNpZ25SdWxlV2lkdGgoaW5kZXgpOwotfQotCi1pbnQgZGVmaVBpbl9wb2x5Z29uU3BhY2luZyAoY29uc3QgOjpkZWZpUGluKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW4qKW9iaiktPnBvbHlnb25TcGFjaW5nKGluZGV4KTsKLX0KLQotaW50IGRlZmlQaW5fcG9seWdvbkRlc2lnblJ1bGVXaWR0aCAoY29uc3QgOjpkZWZpUGluKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW4qKW9iaiktPnBvbHlnb25EZXNpZ25SdWxlV2lkdGgoaW5kZXgpOwotfQotCi1pbnQgZGVmaVBpbl9oYXNOZXRFeHByIChjb25zdCA6OmRlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+aGFzTmV0RXhwcigpOwotfQotCi1pbnQgZGVmaVBpbl9oYXNTdXBwbHlTZW5zaXRpdml0eSAoY29uc3QgOjpkZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW4qKW9iaiktPmhhc1N1cHBseVNlbnNpdGl2aXR5KCk7Ci19Ci0KLWludCBkZWZpUGluX2hhc0dyb3VuZFNlbnNpdGl2aXR5IChjb25zdCA6OmRlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+aGFzR3JvdW5kU2Vuc2l0aXZpdHkoKTsKLX0KLQotY29uc3QgY2hhciogZGVmaVBpbl9uZXRFeHByIChjb25zdCA6OmRlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+bmV0RXhwcigpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpUGluX3N1cHBseVNlbnNpdGl2aXR5IChjb25zdCA6OmRlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+c3VwcGx5U2Vuc2l0aXZpdHkoKTsKLX0KLQotY29uc3QgY2hhciogZGVmaVBpbl9ncm91bmRTZW5zaXRpdml0eSAoY29uc3QgOjpkZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlQaW4qKW9iaiktPmdyb3VuZFNlbnNpdGl2aXR5KCk7Ci19Ci0KLWludCBkZWZpUGluX29yaWVudCAoY29uc3QgOjpkZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW4qKW9iaiktPm9yaWVudCgpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpUGluX29yaWVudFN0ciAoY29uc3QgOjpkZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlQaW4qKW9iaiktPm9yaWVudFN0cigpOwotfQotCi1pbnQgZGVmaVBpbl9oYXNTcGVjaWFsIChjb25zdCA6OmRlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+aGFzU3BlY2lhbCgpOwotfQotCi1pbnQgZGVmaVBpbl9udW1WaWFzIChjb25zdCA6OmRlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+bnVtVmlhcygpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpUGluX3ZpYU5hbWUgKGNvbnN0IDo6ZGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpUGluKilvYmopLT52aWFOYW1lKGluZGV4KTsKLX0KLQotaW50IGRlZmlQaW5fdmlhVG9wTWFzayAoY29uc3QgOjpkZWZpUGluKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW4qKW9iaiktPnZpYVRvcE1hc2soaW5kZXgpOwotfQotCi1pbnQgZGVmaVBpbl92aWFDdXRNYXNrIChjb25zdCA6OmRlZmlQaW4qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+dmlhQ3V0TWFzayhpbmRleCk7Ci19Ci0KLWludCBkZWZpUGluX3ZpYUJvdHRvbU1hc2sgKGNvbnN0IDo6ZGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGluKilvYmopLT52aWFCb3R0b21NYXNrKGluZGV4KTsKLX0KLQotaW50IGRlZmlQaW5fdmlhUHRYIChjb25zdCA6OmRlZmlQaW4qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+dmlhUHRYKGluZGV4KTsKLX0KLQotaW50IGRlZmlQaW5fdmlhUHRZIChjb25zdCA6OmRlZmlQaW4qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+dmlhUHRZKGluZGV4KTsKLX0KLQotaW50IGRlZmlQaW5faGFzQVBpblBhcnRpYWxNZXRhbEFyZWEgKGNvbnN0IDo6ZGVmaVBpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGluKilvYmopLT5oYXNBUGluUGFydGlhbE1ldGFsQXJlYSgpOwotfQotCi1pbnQgZGVmaVBpbl9udW1BUGluUGFydGlhbE1ldGFsQXJlYSAoY29uc3QgOjpkZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW4qKW9iaiktPm51bUFQaW5QYXJ0aWFsTWV0YWxBcmVhKCk7Ci19Ci0KLWludCBkZWZpUGluX0FQaW5QYXJ0aWFsTWV0YWxBcmVhIChjb25zdCA6OmRlZmlQaW4qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+QVBpblBhcnRpYWxNZXRhbEFyZWEoaW5kZXgpOwotfQotCi1pbnQgZGVmaVBpbl9oYXNBUGluUGFydGlhbE1ldGFsQXJlYUxheWVyIChjb25zdCA6OmRlZmlQaW4qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+aGFzQVBpblBhcnRpYWxNZXRhbEFyZWFMYXllcihpbmRleCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlQaW5fQVBpblBhcnRpYWxNZXRhbEFyZWFMYXllciAoY29uc3QgOjpkZWZpUGluKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlQaW4qKW9iaiktPkFQaW5QYXJ0aWFsTWV0YWxBcmVhTGF5ZXIoaW5kZXgpOwotfQotCi1pbnQgZGVmaVBpbl9oYXNBUGluUGFydGlhbE1ldGFsU2lkZUFyZWEgKGNvbnN0IDo6ZGVmaVBpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGluKilvYmopLT5oYXNBUGluUGFydGlhbE1ldGFsU2lkZUFyZWEoKTsKLX0KLQotaW50IGRlZmlQaW5fbnVtQVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhIChjb25zdCA6OmRlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+bnVtQVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhKCk7Ci19Ci0KLWludCBkZWZpUGluX0FQaW5QYXJ0aWFsTWV0YWxTaWRlQXJlYSAoY29uc3QgOjpkZWZpUGluKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW4qKW9iaiktPkFQaW5QYXJ0aWFsTWV0YWxTaWRlQXJlYShpbmRleCk7Ci19Ci0KLWludCBkZWZpUGluX2hhc0FQaW5QYXJ0aWFsTWV0YWxTaWRlQXJlYUxheWVyIChjb25zdCA6OmRlZmlQaW4qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+aGFzQVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhTGF5ZXIoaW5kZXgpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpUGluX0FQaW5QYXJ0aWFsTWV0YWxTaWRlQXJlYUxheWVyIChjb25zdCA6OmRlZmlQaW4qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+QVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhTGF5ZXIoaW5kZXgpOwotfQotCi1pbnQgZGVmaVBpbl9oYXNBUGluRGlmZkFyZWEgKGNvbnN0IDo6ZGVmaVBpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGluKilvYmopLT5oYXNBUGluRGlmZkFyZWEoKTsKLX0KLQotaW50IGRlZmlQaW5fbnVtQVBpbkRpZmZBcmVhIChjb25zdCA6OmRlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+bnVtQVBpbkRpZmZBcmVhKCk7Ci19Ci0KLWludCBkZWZpUGluX0FQaW5EaWZmQXJlYSAoY29uc3QgOjpkZWZpUGluKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW4qKW9iaiktPkFQaW5EaWZmQXJlYShpbmRleCk7Ci19Ci0KLWludCBkZWZpUGluX2hhc0FQaW5EaWZmQXJlYUxheWVyIChjb25zdCA6OmRlZmlQaW4qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+aGFzQVBpbkRpZmZBcmVhTGF5ZXIoaW5kZXgpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpUGluX0FQaW5EaWZmQXJlYUxheWVyIChjb25zdCA6OmRlZmlQaW4qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+QVBpbkRpZmZBcmVhTGF5ZXIoaW5kZXgpOwotfQotCi1pbnQgZGVmaVBpbl9oYXNBUGluUGFydGlhbEN1dEFyZWEgKGNvbnN0IDo6ZGVmaVBpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGluKilvYmopLT5oYXNBUGluUGFydGlhbEN1dEFyZWEoKTsKLX0KLQotaW50IGRlZmlQaW5fbnVtQVBpblBhcnRpYWxDdXRBcmVhIChjb25zdCA6OmRlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+bnVtQVBpblBhcnRpYWxDdXRBcmVhKCk7Ci19Ci0KLWludCBkZWZpUGluX0FQaW5QYXJ0aWFsQ3V0QXJlYSAoY29uc3QgOjpkZWZpUGluKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW4qKW9iaiktPkFQaW5QYXJ0aWFsQ3V0QXJlYShpbmRleCk7Ci19Ci0KLWludCBkZWZpUGluX2hhc0FQaW5QYXJ0aWFsQ3V0QXJlYUxheWVyIChjb25zdCA6OmRlZmlQaW4qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+aGFzQVBpblBhcnRpYWxDdXRBcmVhTGF5ZXIoaW5kZXgpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpUGluX0FQaW5QYXJ0aWFsQ3V0QXJlYUxheWVyIChjb25zdCA6OmRlZmlQaW4qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+QVBpblBhcnRpYWxDdXRBcmVhTGF5ZXIoaW5kZXgpOwotfQotCi1pbnQgZGVmaVBpbl9udW1BbnRlbm5hTW9kZWwgKGNvbnN0IDo6ZGVmaVBpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUGluKilvYmopLT5udW1BbnRlbm5hTW9kZWwoKTsKLX0KLQotY29uc3QgOjpkZWZpUGluQW50ZW5uYU1vZGVsKiBkZWZpUGluX2FudGVubmFNb2RlbCAoY29uc3QgOjpkZWZpUGluKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKGNvbnN0IDo6ZGVmaVBpbkFudGVubmFNb2RlbCopICgoTGVmRGVmUGFyc2VyOjpkZWZpUGluKilvYmopLT5hbnRlbm5hTW9kZWwoaW5kZXgpOwotfQotCi1pbnQgZGVmaVBpbl9oYXNQb3J0IChjb25zdCA6OmRlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+aGFzUG9ydCgpOwotfQotCi1pbnQgZGVmaVBpbl9udW1Qb3J0cyAoY29uc3QgOjpkZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW4qKW9iaiktPm51bVBvcnRzKCk7Ci19Ci0KLWNvbnN0IDo6ZGVmaVBpblBvcnQqIGRlZmlQaW5fcGluUG9ydCAoY29uc3QgOjpkZWZpUGluKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKGNvbnN0IDo6ZGVmaVBpblBvcnQqKSAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpbiopb2JqKS0+cGluUG9ydChpbmRleCk7Ci19Ci0KLXZvaWQgZGVmaVBpbl9wcmludCAoY29uc3QgOjpkZWZpUGluKiBvYmosIEZJTEUqICBmKSB7Ci0gICAgKChMZWZEZWZQYXJzZXI6OmRlZmlQaW4qKW9iaiktPnByaW50KGYpOwotfQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi94ZGVmaVBpblByb3AuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYveGRlZmlQaW5Qcm9wLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIyNzY1Zi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi94ZGVmaVBpblByb3AuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBBVFRFTlRJT046IFRISVMgSVMgQU4gQVVUTy1HRU5FUkFURUQgRklMRS4gRE8gTk9UIENIQU5HRSBJVCEKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTIsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogeHh4ICQKLS8vICAkUmV2aXNpb246IHh4eCAkCi0vLyAgJERhdGU6IHh4eCAkCi0vLyAgJFN0YXRlOiB4eHggJCAgCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2RlZmluZSBFWFRFUk4gZXh0ZXJuICJDIgotCi0jaW5jbHVkZSAiZGVmaVBpblByb3AuaCIKLSNpbmNsdWRlICJkZWZpUGluUHJvcC5ocHAiCi0KLS8vIFdyYXBwZXJzIGRlZmluaXRpb25zLgotaW50IGRlZmlQaW5Qcm9wX2lzUGluIChjb25zdCA6OmRlZmlQaW5Qcm9wKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQaW5Qcm9wKilvYmopLT5pc1BpbigpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpUGluUHJvcF9pbnN0TmFtZSAoY29uc3QgOjpkZWZpUGluUHJvcCogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpUGluUHJvcCopb2JqKS0+aW5zdE5hbWUoKTsKLX0KLQotY29uc3QgY2hhciogZGVmaVBpblByb3BfcGluTmFtZSAoY29uc3QgOjpkZWZpUGluUHJvcCogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpUGluUHJvcCopb2JqKS0+cGluTmFtZSgpOwotfQotCi1pbnQgZGVmaVBpblByb3BfbnVtUHJvcHMgKGNvbnN0IDo6ZGVmaVBpblByb3AqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpblByb3AqKW9iaiktPm51bVByb3BzKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlQaW5Qcm9wX3Byb3BOYW1lIChjb25zdCA6OmRlZmlQaW5Qcm9wKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlQaW5Qcm9wKilvYmopLT5wcm9wTmFtZShpbmRleCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlQaW5Qcm9wX3Byb3BWYWx1ZSAoY29uc3QgOjpkZWZpUGluUHJvcCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpUGluUHJvcCopb2JqKS0+cHJvcFZhbHVlKGluZGV4KTsKLX0KLQotZG91YmxlIGRlZmlQaW5Qcm9wX3Byb3BOdW1iZXIgKGNvbnN0IDo6ZGVmaVBpblByb3AqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpblByb3AqKW9iaiktPnByb3BOdW1iZXIoaW5kZXgpOwotfQotCi1jb25zdCBjaGFyIGRlZmlQaW5Qcm9wX3Byb3BUeXBlIChjb25zdCA6OmRlZmlQaW5Qcm9wKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlQaW5Qcm9wKilvYmopLT5wcm9wVHlwZShpbmRleCk7Ci19Ci0KLWludCBkZWZpUGluUHJvcF9wcm9wSXNOdW1iZXIgKGNvbnN0IDo6ZGVmaVBpblByb3AqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpblByb3AqKW9iaiktPnByb3BJc051bWJlcihpbmRleCk7Ci19Ci0KLWludCBkZWZpUGluUHJvcF9wcm9wSXNTdHJpbmcgKGNvbnN0IDo6ZGVmaVBpblByb3AqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpblByb3AqKW9iaiktPnByb3BJc1N0cmluZyhpbmRleCk7Ci19Ci0KLXZvaWQgZGVmaVBpblByb3BfcHJpbnQgKGNvbnN0IDo6ZGVmaVBpblByb3AqIG9iaiwgRklMRSogIGYpIHsKLSAgICAoKExlZkRlZlBhcnNlcjo6ZGVmaVBpblByb3AqKW9iaiktPnByaW50KGYpOwotfQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi94ZGVmaVByb3AuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYveGRlZmlQcm9wLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRiNTQ1Ny4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi94ZGVmaVByb3AuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBBVFRFTlRJT046IFRISVMgSVMgQU4gQVVUTy1HRU5FUkFURUQgRklMRS4gRE8gTk9UIENIQU5HRSBJVCEKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTIsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogeHh4ICQKLS8vICAkUmV2aXNpb246IHh4eCAkCi0vLyAgJERhdGU6IHh4eCAkCi0vLyAgJFN0YXRlOiB4eHggJCAgCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2RlZmluZSBFWFRFUk4gZXh0ZXJuICJDIgotCi0jaW5jbHVkZSAiZGVmaVByb3AuaCIKLSNpbmNsdWRlICJkZWZpUHJvcC5ocHAiCi0KLS8vIFdyYXBwZXJzIGRlZmluaXRpb25zLgotY29uc3QgY2hhciogZGVmaVByb3Bfc3RyaW5nIChjb25zdCA6OmRlZmlQcm9wKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlQcm9wKilvYmopLT5zdHJpbmcoKTsKLX0KLQotY29uc3QgY2hhciogZGVmaVByb3BfcHJvcFR5cGUgKGNvbnN0IDo6ZGVmaVByb3AqIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaVByb3AqKW9iaiktPnByb3BUeXBlKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlQcm9wX3Byb3BOYW1lIChjb25zdCA6OmRlZmlQcm9wKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlQcm9wKilvYmopLT5wcm9wTmFtZSgpOwotfQotCi1jaGFyIGRlZmlQcm9wX2RhdGFUeXBlIChjb25zdCA6OmRlZmlQcm9wKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQcm9wKilvYmopLT5kYXRhVHlwZSgpOwotfQotCi1pbnQgZGVmaVByb3BfaGFzTnVtYmVyIChjb25zdCA6OmRlZmlQcm9wKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQcm9wKilvYmopLT5oYXNOdW1iZXIoKTsKLX0KLQotaW50IGRlZmlQcm9wX2hhc1JhbmdlIChjb25zdCA6OmRlZmlQcm9wKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQcm9wKilvYmopLT5oYXNSYW5nZSgpOwotfQotCi1pbnQgZGVmaVByb3BfaGFzU3RyaW5nIChjb25zdCA6OmRlZmlQcm9wKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQcm9wKilvYmopLT5oYXNTdHJpbmcoKTsKLX0KLQotaW50IGRlZmlQcm9wX2hhc05hbWVNYXBTdHJpbmcgKGNvbnN0IDo6ZGVmaVByb3AqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVByb3AqKW9iaiktPmhhc05hbWVNYXBTdHJpbmcoKTsKLX0KLQotZG91YmxlIGRlZmlQcm9wX251bWJlciAoY29uc3QgOjpkZWZpUHJvcCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUHJvcCopb2JqKS0+bnVtYmVyKCk7Ci19Ci0KLWRvdWJsZSBkZWZpUHJvcF9sZWZ0IChjb25zdCA6OmRlZmlQcm9wKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlQcm9wKilvYmopLT5sZWZ0KCk7Ci19Ci0KLWRvdWJsZSBkZWZpUHJvcF9yaWdodCAoY29uc3QgOjpkZWZpUHJvcCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUHJvcCopb2JqKS0+cmlnaHQoKTsKLX0KLQotdm9pZCBkZWZpUHJvcF9wcmludCAoY29uc3QgOjpkZWZpUHJvcCogb2JqLCBGSUxFKiAgZikgewotICAgICgoTGVmRGVmUGFyc2VyOjpkZWZpUHJvcCopb2JqKS0+cHJpbnQoZik7Ci19Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZpUHJvcFR5cGUuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYveGRlZmlQcm9wVHlwZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMGMwNDQuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYveGRlZmlQcm9wVHlwZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIEFUVEVOVElPTjogVEhJUyBJUyBBTiBBVVRPLUdFTkVSQVRFRCBGSUxFLiBETyBOT1QgQ0hBTkdFIElUIQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiB4eHggJAotLy8gICRSZXZpc2lvbjogeHh4ICQKLS8vICAkRGF0ZTogeHh4ICQKLS8vICAkU3RhdGU6IHh4eCAkICAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jZGVmaW5lIEVYVEVSTiBleHRlcm4gIkMiCi0KLSNpbmNsdWRlICJkZWZpUHJvcFR5cGUuaCIKLSNpbmNsdWRlICJkZWZpUHJvcFR5cGUuaHBwIgotCi0vLyBXcmFwcGVycyBkZWZpbml0aW9ucy4KLWNvbnN0IGNoYXIgZGVmaVByb3BUeXBlX3Byb3BUeXBlIChjb25zdCA6OmRlZmlQcm9wVHlwZSogb2JqLCBjaGFyKiAgbmFtZSkgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaVByb3BUeXBlKilvYmopLT5wcm9wVHlwZShuYW1lKTsKLX0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYveGRlZmlSZWdpb24uY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYveGRlZmlSZWdpb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTRlM2NiLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZpUmVnaW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIEFUVEVOVElPTjogVEhJUyBJUyBBTiBBVVRPLUdFTkVSQVRFRCBGSUxFLiBETyBOT1QgQ0hBTkdFIElUIQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiB4eHggJAotLy8gICRSZXZpc2lvbjogeHh4ICQKLS8vICAkRGF0ZTogeHh4ICQKLS8vICAkU3RhdGU6IHh4eCAkICAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jZGVmaW5lIEVYVEVSTiBleHRlcm4gIkMiCi0KLSNpbmNsdWRlICJkZWZpUmVnaW9uLmgiCi0jaW5jbHVkZSAiZGVmaVJlZ2lvbi5ocHAiCi0KLS8vIFdyYXBwZXJzIGRlZmluaXRpb25zLgotY29uc3QgY2hhciogZGVmaVJlZ2lvbl9uYW1lIChjb25zdCA6OmRlZmlSZWdpb24qIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaVJlZ2lvbiopb2JqKS0+bmFtZSgpOwotfQotCi1pbnQgZGVmaVJlZ2lvbl9udW1Qcm9wcyAoY29uc3QgOjpkZWZpUmVnaW9uKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlSZWdpb24qKW9iaiktPm51bVByb3BzKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlSZWdpb25fcHJvcE5hbWUgKGNvbnN0IDo6ZGVmaVJlZ2lvbiogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpUmVnaW9uKilvYmopLT5wcm9wTmFtZShpbmRleCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlSZWdpb25fcHJvcFZhbHVlIChjb25zdCA6OmRlZmlSZWdpb24qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaVJlZ2lvbiopb2JqKS0+cHJvcFZhbHVlKGluZGV4KTsKLX0KLQotZG91YmxlIGRlZmlSZWdpb25fcHJvcE51bWJlciAoY29uc3QgOjpkZWZpUmVnaW9uKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlSZWdpb24qKW9iaiktPnByb3BOdW1iZXIoaW5kZXgpOwotfQotCi1jb25zdCBjaGFyIGRlZmlSZWdpb25fcHJvcFR5cGUgKGNvbnN0IDo6ZGVmaVJlZ2lvbiogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpUmVnaW9uKilvYmopLT5wcm9wVHlwZShpbmRleCk7Ci19Ci0KLWludCBkZWZpUmVnaW9uX3Byb3BJc051bWJlciAoY29uc3QgOjpkZWZpUmVnaW9uKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlSZWdpb24qKW9iaiktPnByb3BJc051bWJlcihpbmRleCk7Ci19Ci0KLWludCBkZWZpUmVnaW9uX3Byb3BJc1N0cmluZyAoY29uc3QgOjpkZWZpUmVnaW9uKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlSZWdpb24qKW9iaiktPnByb3BJc1N0cmluZyhpbmRleCk7Ci19Ci0KLWludCBkZWZpUmVnaW9uX2hhc1R5cGUgKGNvbnN0IDo6ZGVmaVJlZ2lvbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUmVnaW9uKilvYmopLT5oYXNUeXBlKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlSZWdpb25fdHlwZSAoY29uc3QgOjpkZWZpUmVnaW9uKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlSZWdpb24qKW9iaiktPnR5cGUoKTsKLX0KLQotaW50IGRlZmlSZWdpb25fbnVtUmVjdGFuZ2xlcyAoY29uc3QgOjpkZWZpUmVnaW9uKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlSZWdpb24qKW9iaiktPm51bVJlY3RhbmdsZXMoKTsKLX0KLQotaW50IGRlZmlSZWdpb25feGwgKGNvbnN0IDo6ZGVmaVJlZ2lvbiogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUmVnaW9uKilvYmopLT54bChpbmRleCk7Ci19Ci0KLWludCBkZWZpUmVnaW9uX3lsIChjb25zdCA6OmRlZmlSZWdpb24qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVJlZ2lvbiopb2JqKS0+eWwoaW5kZXgpOwotfQotCi1pbnQgZGVmaVJlZ2lvbl94aCAoY29uc3QgOjpkZWZpUmVnaW9uKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlSZWdpb24qKW9iaiktPnhoKGluZGV4KTsKLX0KLQotaW50IGRlZmlSZWdpb25feWggKGNvbnN0IDo6ZGVmaVJlZ2lvbiogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUmVnaW9uKilvYmopLT55aChpbmRleCk7Ci19Ci0KLXZvaWQgZGVmaVJlZ2lvbl9wcmludCAoY29uc3QgOjpkZWZpUmVnaW9uKiBvYmosIEZJTEUqICBmKSB7Ci0gICAgKChMZWZEZWZQYXJzZXI6OmRlZmlSZWdpb24qKW9iaiktPnByaW50KGYpOwotfQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi94ZGVmaVJvd1RyYWNrLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZpUm93VHJhY2suY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjUwNmIzLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZpUm93VHJhY2suY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IHh4eCAkCi0vLyAgJFJldmlzaW9uOiB4eHggJAotLy8gICREYXRlOiB4eHggJAotLy8gICRTdGF0ZTogeHh4ICQgIAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNkZWZpbmUgRVhURVJOIGV4dGVybiAiQyIKLQotI2luY2x1ZGUgImRlZmlSb3dUcmFjay5oIgotI2luY2x1ZGUgImRlZmlSb3dUcmFjay5ocHAiCi0KLS8vIFdyYXBwZXJzIGRlZmluaXRpb25zLgotY29uc3QgY2hhciogZGVmaVJvd19uYW1lIChjb25zdCA6OmRlZmlSb3cqIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaVJvdyopb2JqKS0+bmFtZSgpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpUm93X21hY3JvIChjb25zdCA6OmRlZmlSb3cqIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaVJvdyopb2JqKS0+bWFjcm8oKTsKLX0KLQotZG91YmxlIGRlZmlSb3dfeCAoY29uc3QgOjpkZWZpUm93KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlSb3cqKW9iaiktPngoKTsKLX0KLQotZG91YmxlIGRlZmlSb3dfeSAoY29uc3QgOjpkZWZpUm93KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlSb3cqKW9iaiktPnkoKTsKLX0KLQotaW50IGRlZmlSb3dfb3JpZW50IChjb25zdCA6OmRlZmlSb3cqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVJvdyopb2JqKS0+b3JpZW50KCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlSb3dfb3JpZW50U3RyIChjb25zdCA6OmRlZmlSb3cqIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaVJvdyopb2JqKS0+b3JpZW50U3RyKCk7Ci19Ci0KLWludCBkZWZpUm93X2hhc0RvIChjb25zdCA6OmRlZmlSb3cqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVJvdyopb2JqKS0+aGFzRG8oKTsKLX0KLQotZG91YmxlIGRlZmlSb3dfeE51bSAoY29uc3QgOjpkZWZpUm93KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlSb3cqKW9iaiktPnhOdW0oKTsKLX0KLQotZG91YmxlIGRlZmlSb3dfeU51bSAoY29uc3QgOjpkZWZpUm93KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlSb3cqKW9iaiktPnlOdW0oKTsKLX0KLQotaW50IGRlZmlSb3dfaGFzRG9TdGVwIChjb25zdCA6OmRlZmlSb3cqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVJvdyopb2JqKS0+aGFzRG9TdGVwKCk7Ci19Ci0KLWRvdWJsZSBkZWZpUm93X3hTdGVwIChjb25zdCA6OmRlZmlSb3cqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVJvdyopb2JqKS0+eFN0ZXAoKTsKLX0KLQotZG91YmxlIGRlZmlSb3dfeVN0ZXAgKGNvbnN0IDo6ZGVmaVJvdyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpUm93KilvYmopLT55U3RlcCgpOwotfQotCi1pbnQgZGVmaVJvd19udW1Qcm9wcyAoY29uc3QgOjpkZWZpUm93KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlSb3cqKW9iaiktPm51bVByb3BzKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlSb3dfcHJvcE5hbWUgKGNvbnN0IDo6ZGVmaVJvdyogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpUm93KilvYmopLT5wcm9wTmFtZShpbmRleCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlSb3dfcHJvcFZhbHVlIChjb25zdCA6OmRlZmlSb3cqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaVJvdyopb2JqKS0+cHJvcFZhbHVlKGluZGV4KTsKLX0KLQotZG91YmxlIGRlZmlSb3dfcHJvcE51bWJlciAoY29uc3QgOjpkZWZpUm93KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlSb3cqKW9iaiktPnByb3BOdW1iZXIoaW5kZXgpOwotfQotCi1jb25zdCBjaGFyIGRlZmlSb3dfcHJvcFR5cGUgKGNvbnN0IDo6ZGVmaVJvdyogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpUm93KilvYmopLT5wcm9wVHlwZShpbmRleCk7Ci19Ci0KLWludCBkZWZpUm93X3Byb3BJc051bWJlciAoY29uc3QgOjpkZWZpUm93KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlSb3cqKW9iaiktPnByb3BJc051bWJlcihpbmRleCk7Ci19Ci0KLWludCBkZWZpUm93X3Byb3BJc1N0cmluZyAoY29uc3QgOjpkZWZpUm93KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlSb3cqKW9iaiktPnByb3BJc1N0cmluZyhpbmRleCk7Ci19Ci0KLXZvaWQgZGVmaVJvd19wcmludCAoY29uc3QgOjpkZWZpUm93KiBvYmosIEZJTEUqICBmKSB7Ci0gICAgKChMZWZEZWZQYXJzZXI6OmRlZmlSb3cqKW9iaiktPnByaW50KGYpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpVHJhY2tfbWFjcm8gKGNvbnN0IDo6ZGVmaVRyYWNrKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlUcmFjayopb2JqKS0+bWFjcm8oKTsKLX0KLQotZG91YmxlIGRlZmlUcmFja194IChjb25zdCA6OmRlZmlUcmFjayogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpVHJhY2sqKW9iaiktPngoKTsKLX0KLQotZG91YmxlIGRlZmlUcmFja194TnVtIChjb25zdCA6OmRlZmlUcmFjayogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpVHJhY2sqKW9iaiktPnhOdW0oKTsKLX0KLQotZG91YmxlIGRlZmlUcmFja194U3RlcCAoY29uc3QgOjpkZWZpVHJhY2sqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVRyYWNrKilvYmopLT54U3RlcCgpOwotfQotCi1pbnQgZGVmaVRyYWNrX251bUxheWVycyAoY29uc3QgOjpkZWZpVHJhY2sqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVRyYWNrKilvYmopLT5udW1MYXllcnMoKTsKLX0KLQotY29uc3QgY2hhciogZGVmaVRyYWNrX2xheWVyIChjb25zdCA6OmRlZmlUcmFjayogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpVHJhY2sqKW9iaiktPmxheWVyKGluZGV4KTsKLX0KLQotaW50IGRlZmlUcmFja19maXJzdFRyYWNrTWFzayAoY29uc3QgOjpkZWZpVHJhY2sqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVRyYWNrKilvYmopLT5maXJzdFRyYWNrTWFzaygpOwotfQotCi1pbnQgZGVmaVRyYWNrX3NhbWVNYXNrIChjb25zdCA6OmRlZmlUcmFjayogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpVHJhY2sqKW9iaiktPnNhbWVNYXNrKCk7Ci19Ci0KLXZvaWQgZGVmaVRyYWNrX3ByaW50IChjb25zdCA6OmRlZmlUcmFjayogb2JqLCBGSUxFKiAgZikgewotICAgICgoTGVmRGVmUGFyc2VyOjpkZWZpVHJhY2sqKW9iaiktPnByaW50KGYpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpR2NlbGxHcmlkX21hY3JvIChjb25zdCA6OmRlZmlHY2VsbEdyaWQqIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaUdjZWxsR3JpZCopb2JqKS0+bWFjcm8oKTsKLX0KLQotaW50IGRlZmlHY2VsbEdyaWRfeCAoY29uc3QgOjpkZWZpR2NlbGxHcmlkKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlHY2VsbEdyaWQqKW9iaiktPngoKTsKLX0KLQotaW50IGRlZmlHY2VsbEdyaWRfeE51bSAoY29uc3QgOjpkZWZpR2NlbGxHcmlkKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlHY2VsbEdyaWQqKW9iaiktPnhOdW0oKTsKLX0KLQotZG91YmxlIGRlZmlHY2VsbEdyaWRfeFN0ZXAgKGNvbnN0IDo6ZGVmaUdjZWxsR3JpZCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpR2NlbGxHcmlkKilvYmopLT54U3RlcCgpOwotfQotCi12b2lkIGRlZmlHY2VsbEdyaWRfcHJpbnQgKGNvbnN0IDo6ZGVmaUdjZWxsR3JpZCogb2JqLCBGSUxFKiAgZikgewotICAgICgoTGVmRGVmUGFyc2VyOjpkZWZpR2NlbGxHcmlkKilvYmopLT5wcmludChmKTsKLX0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYveGRlZmlTY2FuY2hhaW4uY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYveGRlZmlTY2FuY2hhaW4uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2UzNjBjLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZpU2NhbmNoYWluLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIEFUVEVOVElPTjogVEhJUyBJUyBBTiBBVVRPLUdFTkVSQVRFRCBGSUxFLiBETyBOT1QgQ0hBTkdFIElUIQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiB4eHggJAotLy8gICRSZXZpc2lvbjogeHh4ICQKLS8vICAkRGF0ZTogeHh4ICQKLS8vICAkU3RhdGU6IHh4eCAkICAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jZGVmaW5lIEVYVEVSTiBleHRlcm4gIkMiCi0KLSNpbmNsdWRlICJkZWZpU2NhbmNoYWluLmgiCi0jaW5jbHVkZSAiZGVmaVNjYW5jaGFpbi5ocHAiCi0KLS8vIFdyYXBwZXJzIGRlZmluaXRpb25zLgotaW50IGRlZmlPcmRlcmVkX251bSAoY29uc3QgOjpkZWZpT3JkZXJlZCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpT3JkZXJlZCopb2JqKS0+bnVtKCk7Ci19Ci0KLWNoYXIqKiBkZWZpT3JkZXJlZF9pbnN0IChjb25zdCA6OmRlZmlPcmRlcmVkKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlPcmRlcmVkKilvYmopLT5pbnN0KCk7Ci19Ci0KLWNoYXIqKiBkZWZpT3JkZXJlZF9pbiAoY29uc3QgOjpkZWZpT3JkZXJlZCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpT3JkZXJlZCopb2JqKS0+aW4oKTsKLX0KLQotY2hhcioqIGRlZmlPcmRlcmVkX291dCAoY29uc3QgOjpkZWZpT3JkZXJlZCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpT3JkZXJlZCopb2JqKS0+b3V0KCk7Ci19Ci0KLWludCogZGVmaU9yZGVyZWRfYml0cyAoY29uc3QgOjpkZWZpT3JkZXJlZCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpT3JkZXJlZCopb2JqKS0+Yml0cygpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpU2NhbmNoYWluX25hbWUgKGNvbnN0IDo6ZGVmaVNjYW5jaGFpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpU2NhbmNoYWluKilvYmopLT5uYW1lKCk7Ci19Ci0KLWludCBkZWZpU2NhbmNoYWluX2hhc1N0YXJ0IChjb25zdCA6OmRlZmlTY2FuY2hhaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVNjYW5jaGFpbiopb2JqKS0+aGFzU3RhcnQoKTsKLX0KLQotaW50IGRlZmlTY2FuY2hhaW5faGFzU3RvcCAoY29uc3QgOjpkZWZpU2NhbmNoYWluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlTY2FuY2hhaW4qKW9iaiktPmhhc1N0b3AoKTsKLX0KLQotaW50IGRlZmlTY2FuY2hhaW5faGFzRmxvYXRpbmcgKGNvbnN0IDo6ZGVmaVNjYW5jaGFpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpU2NhbmNoYWluKilvYmopLT5oYXNGbG9hdGluZygpOwotfQotCi1pbnQgZGVmaVNjYW5jaGFpbl9oYXNPcmRlcmVkIChjb25zdCA6OmRlZmlTY2FuY2hhaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVNjYW5jaGFpbiopb2JqKS0+aGFzT3JkZXJlZCgpOwotfQotCi1pbnQgZGVmaVNjYW5jaGFpbl9oYXNDb21tb25JblBpbiAoY29uc3QgOjpkZWZpU2NhbmNoYWluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlTY2FuY2hhaW4qKW9iaiktPmhhc0NvbW1vbkluUGluKCk7Ci19Ci0KLWludCBkZWZpU2NhbmNoYWluX2hhc0NvbW1vbk91dFBpbiAoY29uc3QgOjpkZWZpU2NhbmNoYWluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlTY2FuY2hhaW4qKW9iaiktPmhhc0NvbW1vbk91dFBpbigpOwotfQotCi1pbnQgZGVmaVNjYW5jaGFpbl9oYXNQYXJ0aXRpb24gKGNvbnN0IDo6ZGVmaVNjYW5jaGFpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpU2NhbmNoYWluKilvYmopLT5oYXNQYXJ0aXRpb24oKTsKLX0KLQotaW50IGRlZmlTY2FuY2hhaW5faGFzUGFydGl0aW9uTWF4Qml0cyAoY29uc3QgOjpkZWZpU2NhbmNoYWluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlTY2FuY2hhaW4qKW9iaiktPmhhc1BhcnRpdGlvbk1heEJpdHMoKTsKLX0KLQotdm9pZCBkZWZpU2NhbmNoYWluX3N0YXJ0IChjb25zdCA6OmRlZmlTY2FuY2hhaW4qIG9iaiwgY2hhcioqICBpbnN0LCBjaGFyKiogIHBpbikgewotICAgICgoTGVmRGVmUGFyc2VyOjpkZWZpU2NhbmNoYWluKilvYmopLT5zdGFydChpbnN0LCBwaW4pOwotfQotCi12b2lkIGRlZmlTY2FuY2hhaW5fc3RvcCAoY29uc3QgOjpkZWZpU2NhbmNoYWluKiBvYmosIGNoYXIqKiAgaW5zdCwgY2hhcioqICBwaW4pIHsKLSAgICAoKExlZkRlZlBhcnNlcjo6ZGVmaVNjYW5jaGFpbiopb2JqKS0+c3RvcChpbnN0LCBwaW4pOwotfQotCi1pbnQgZGVmaVNjYW5jaGFpbl9udW1PcmRlcmVkTGlzdHMgKGNvbnN0IDo6ZGVmaVNjYW5jaGFpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpU2NhbmNoYWluKilvYmopLT5udW1PcmRlcmVkTGlzdHMoKTsKLX0KLQotdm9pZCBkZWZpU2NhbmNoYWluX29yZGVyZWQgKGNvbnN0IDo6ZGVmaVNjYW5jaGFpbiogb2JqLCBpbnQgIGluZGV4LCBpbnQqICBzaXplLCBjaGFyKioqICBpbnN0LCBjaGFyKioqICBpblBpbiwgY2hhcioqKiAgb3V0UGluLCBpbnQqKiAgYml0cykgewotICAgICgoTGVmRGVmUGFyc2VyOjpkZWZpU2NhbmNoYWluKilvYmopLT5vcmRlcmVkKGluZGV4LCBzaXplLCBpbnN0LCBpblBpbiwgb3V0UGluLCBiaXRzKTsKLX0KLQotdm9pZCBkZWZpU2NhbmNoYWluX2Zsb2F0aW5nIChjb25zdCA6OmRlZmlTY2FuY2hhaW4qIG9iaiwgaW50KiAgc2l6ZSwgY2hhcioqKiAgaW5zdCwgY2hhcioqKiAgaW5QaW4sIGNoYXIqKiogIG91dFBpbiwgaW50KiogIGJpdHMpIHsKLSAgICAoKExlZkRlZlBhcnNlcjo6ZGVmaVNjYW5jaGFpbiopb2JqKS0+ZmxvYXRpbmcoc2l6ZSwgaW5zdCwgaW5QaW4sIG91dFBpbiwgYml0cyk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlTY2FuY2hhaW5fY29tbW9uSW5QaW4gKGNvbnN0IDo6ZGVmaVNjYW5jaGFpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpU2NhbmNoYWluKilvYmopLT5jb21tb25JblBpbigpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpU2NhbmNoYWluX2NvbW1vbk91dFBpbiAoY29uc3QgOjpkZWZpU2NhbmNoYWluKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlTY2FuY2hhaW4qKW9iaiktPmNvbW1vbk91dFBpbigpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpU2NhbmNoYWluX3BhcnRpdGlvbk5hbWUgKGNvbnN0IDo6ZGVmaVNjYW5jaGFpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpU2NhbmNoYWluKilvYmopLT5wYXJ0aXRpb25OYW1lKCk7Ci19Ci0KLWludCBkZWZpU2NhbmNoYWluX3BhcnRpdGlvbk1heEJpdHMgKGNvbnN0IDo6ZGVmaVNjYW5jaGFpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpU2NhbmNoYWluKilvYmopLT5wYXJ0aXRpb25NYXhCaXRzKCk7Ci19Ci0KLXZvaWQgZGVmaVNjYW5jaGFpbl9wcmludCAoY29uc3QgOjpkZWZpU2NhbmNoYWluKiBvYmosIEZJTEUqICBmKSB7Ci0gICAgKChMZWZEZWZQYXJzZXI6OmRlZmlTY2FuY2hhaW4qKW9iaiktPnByaW50KGYpOwotfQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi94ZGVmaVNpdGUuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYveGRlZmlTaXRlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgwNjY0ZS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi94ZGVmaVNpdGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IHh4eCAkCi0vLyAgJFJldmlzaW9uOiB4eHggJAotLy8gICREYXRlOiB4eHggJAotLy8gICRTdGF0ZTogeHh4ICQgIAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNkZWZpbmUgRVhURVJOIGV4dGVybiAiQyIKLQotI2luY2x1ZGUgImRlZmlTaXRlLmgiCi0jaW5jbHVkZSAiZGVmaVNpdGUuaHBwIgotCi0vLyBXcmFwcGVycyBkZWZpbml0aW9ucy4KLWRvdWJsZSBkZWZpU2l0ZV94X251bSAoY29uc3QgOjpkZWZpU2l0ZSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpU2l0ZSopb2JqKS0+eF9udW0oKTsKLX0KLQotZG91YmxlIGRlZmlTaXRlX3lfbnVtIChjb25zdCA6OmRlZmlTaXRlKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlTaXRlKilvYmopLT55X251bSgpOwotfQotCi1kb3VibGUgZGVmaVNpdGVfeF9zdGVwIChjb25zdCA6OmRlZmlTaXRlKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlTaXRlKilvYmopLT54X3N0ZXAoKTsKLX0KLQotZG91YmxlIGRlZmlTaXRlX3lfc3RlcCAoY29uc3QgOjpkZWZpU2l0ZSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpU2l0ZSopb2JqKS0+eV9zdGVwKCk7Ci19Ci0KLWRvdWJsZSBkZWZpU2l0ZV94X29yaWcgKGNvbnN0IDo6ZGVmaVNpdGUqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVNpdGUqKW9iaiktPnhfb3JpZygpOwotfQotCi1kb3VibGUgZGVmaVNpdGVfeV9vcmlnIChjb25zdCA6OmRlZmlTaXRlKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlTaXRlKilvYmopLT55X29yaWcoKTsKLX0KLQotaW50IGRlZmlTaXRlX29yaWVudCAoY29uc3QgOjpkZWZpU2l0ZSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpU2l0ZSopb2JqKS0+b3JpZW50KCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlTaXRlX29yaWVudFN0ciAoY29uc3QgOjpkZWZpU2l0ZSogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpU2l0ZSopb2JqKS0+b3JpZW50U3RyKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlTaXRlX25hbWUgKGNvbnN0IDo6ZGVmaVNpdGUqIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaVNpdGUqKW9iaiktPm5hbWUoKTsKLX0KLQotdm9pZCBkZWZpU2l0ZV9wcmludCAoY29uc3QgOjpkZWZpU2l0ZSogb2JqLCBGSUxFKiAgZikgewotICAgICgoTGVmRGVmUGFyc2VyOjpkZWZpU2l0ZSopb2JqKS0+cHJpbnQoZik7Ci19Ci0KLWludCBkZWZpQm94X3hsIChjb25zdCA6OmRlZmlCb3gqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUJveCopb2JqKS0+eGwoKTsKLX0KLQotaW50IGRlZmlCb3hfeWwgKGNvbnN0IDo6ZGVmaUJveCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpQm94KilvYmopLT55bCgpOwotfQotCi1pbnQgZGVmaUJveF94aCAoY29uc3QgOjpkZWZpQm94KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlCb3gqKW9iaiktPnhoKCk7Ci19Ci0KLWludCBkZWZpQm94X3loIChjb25zdCA6OmRlZmlCb3gqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaUJveCopb2JqKS0+eWgoKTsKLX0KLQotOjpkZWZpUG9pbnRzIGRlZmlCb3hfZ2V0UG9pbnQgKGNvbnN0IDo6ZGVmaUJveCogb2JqKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZpUG9pbnRzIHRtcDsKLSAgICB0bXAgPSAoKExlZkRlZlBhcnNlcjo6ZGVmaUJveCopb2JqKS0+Z2V0UG9pbnQoKTsKLSAgICByZXR1cm4gKigoOjpkZWZpUG9pbnRzKikmdG1wKTsKLX0KLQotdm9pZCBkZWZpQm94X3ByaW50IChjb25zdCA6OmRlZmlCb3gqIG9iaiwgRklMRSogIGYpIHsKLSAgICAoKExlZkRlZlBhcnNlcjo6ZGVmaUJveCopb2JqKS0+cHJpbnQoZik7Ci19Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZpU2xvdC5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi94ZGVmaVNsb3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjEwYjU4Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZpU2xvdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIEFUVEVOVElPTjogVEhJUyBJUyBBTiBBVVRPLUdFTkVSQVRFRCBGSUxFLiBETyBOT1QgQ0hBTkdFIElUIQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiB4eHggJAotLy8gICRSZXZpc2lvbjogeHh4ICQKLS8vICAkRGF0ZTogeHh4ICQKLS8vICAkU3RhdGU6IHh4eCAkICAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jZGVmaW5lIEVYVEVSTiBleHRlcm4gIkMiCi0KLSNpbmNsdWRlICJkZWZpU2xvdC5oIgotI2luY2x1ZGUgImRlZmlTbG90LmhwcCIKLQotLy8gV3JhcHBlcnMgZGVmaW5pdGlvbnMuCi1pbnQgZGVmaVNsb3RfaGFzTGF5ZXIgKGNvbnN0IDo6ZGVmaVNsb3QqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVNsb3QqKW9iaiktPmhhc0xheWVyKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlTbG90X2xheWVyTmFtZSAoY29uc3QgOjpkZWZpU2xvdCogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpU2xvdCopb2JqKS0+bGF5ZXJOYW1lKCk7Ci19Ci0KLWludCBkZWZpU2xvdF9udW1SZWN0YW5nbGVzIChjb25zdCA6OmRlZmlTbG90KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlTbG90KilvYmopLT5udW1SZWN0YW5nbGVzKCk7Ci19Ci0KLWludCBkZWZpU2xvdF94bCAoY29uc3QgOjpkZWZpU2xvdCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpU2xvdCopb2JqKS0+eGwoaW5kZXgpOwotfQotCi1pbnQgZGVmaVNsb3RfeWwgKGNvbnN0IDo6ZGVmaVNsb3QqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVNsb3QqKW9iaiktPnlsKGluZGV4KTsKLX0KLQotaW50IGRlZmlTbG90X3hoIChjb25zdCA6OmRlZmlTbG90KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlTbG90KilvYmopLT54aChpbmRleCk7Ci19Ci0KLWludCBkZWZpU2xvdF95aCAoY29uc3QgOjpkZWZpU2xvdCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpU2xvdCopb2JqKS0+eWgoaW5kZXgpOwotfQotCi1pbnQgZGVmaVNsb3RfbnVtUG9seWdvbnMgKGNvbnN0IDo6ZGVmaVNsb3QqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVNsb3QqKW9iaiktPm51bVBvbHlnb25zKCk7Ci19Ci0KLTo6ZGVmaVBvaW50cyBkZWZpU2xvdF9nZXRQb2x5Z29uIChjb25zdCA6OmRlZmlTbG90KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZmlQb2ludHMgdG1wOwotICAgIHRtcCA9ICgoTGVmRGVmUGFyc2VyOjpkZWZpU2xvdCopb2JqKS0+Z2V0UG9seWdvbihpbmRleCk7Ci0gICAgcmV0dXJuICooKDo6ZGVmaVBvaW50cyopJnRtcCk7Ci19Ci0KLXZvaWQgZGVmaVNsb3RfcHJpbnQgKGNvbnN0IDo6ZGVmaVNsb3QqIG9iaiwgRklMRSogIGYpIHsKLSAgICAoKExlZkRlZlBhcnNlcjo6ZGVmaVNsb3QqKW9iaiktPnByaW50KGYpOwotfQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi94ZGVmaVRpbWluZ0Rpc2FibGUuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYveGRlZmlUaW1pbmdEaXNhYmxlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUxZDBmOC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi94ZGVmaVRpbWluZ0Rpc2FibGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBBVFRFTlRJT046IFRISVMgSVMgQU4gQVVUTy1HRU5FUkFURUQgRklMRS4gRE8gTk9UIENIQU5HRSBJVCEKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTIsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogeHh4ICQKLS8vICAkUmV2aXNpb246IHh4eCAkCi0vLyAgJERhdGU6IHh4eCAkCi0vLyAgJFN0YXRlOiB4eHggJCAgCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2RlZmluZSBFWFRFUk4gZXh0ZXJuICJDIgotCi0jaW5jbHVkZSAiZGVmaVRpbWluZ0Rpc2FibGUuaCIKLSNpbmNsdWRlICJkZWZpVGltaW5nRGlzYWJsZS5ocHAiCi0KLS8vIFdyYXBwZXJzIGRlZmluaXRpb25zLgotaW50IGRlZmlUaW1pbmdEaXNhYmxlX2hhc01hY3JvVGhydSAoY29uc3QgOjpkZWZpVGltaW5nRGlzYWJsZSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpVGltaW5nRGlzYWJsZSopb2JqKS0+aGFzTWFjcm9UaHJ1KCk7Ci19Ci0KLWludCBkZWZpVGltaW5nRGlzYWJsZV9oYXNNYWNyb0Zyb21UbyAoY29uc3QgOjpkZWZpVGltaW5nRGlzYWJsZSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpVGltaW5nRGlzYWJsZSopb2JqKS0+aGFzTWFjcm9Gcm9tVG8oKTsKLX0KLQotaW50IGRlZmlUaW1pbmdEaXNhYmxlX2hhc1RocnUgKGNvbnN0IDo6ZGVmaVRpbWluZ0Rpc2FibGUqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVRpbWluZ0Rpc2FibGUqKW9iaiktPmhhc1RocnUoKTsKLX0KLQotaW50IGRlZmlUaW1pbmdEaXNhYmxlX2hhc0Zyb21UbyAoY29uc3QgOjpkZWZpVGltaW5nRGlzYWJsZSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpVGltaW5nRGlzYWJsZSopb2JqKS0+aGFzRnJvbVRvKCk7Ci19Ci0KLWludCBkZWZpVGltaW5nRGlzYWJsZV9oYXNSZWVudHJhbnRQYXRoc0ZsYWcgKGNvbnN0IDo6ZGVmaVRpbWluZ0Rpc2FibGUqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVRpbWluZ0Rpc2FibGUqKW9iaiktPmhhc1JlZW50cmFudFBhdGhzRmxhZygpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpVGltaW5nRGlzYWJsZV9mcm9tUGluIChjb25zdCA6OmRlZmlUaW1pbmdEaXNhYmxlKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlUaW1pbmdEaXNhYmxlKilvYmopLT5mcm9tUGluKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlUaW1pbmdEaXNhYmxlX3RvUGluIChjb25zdCA6OmRlZmlUaW1pbmdEaXNhYmxlKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlUaW1pbmdEaXNhYmxlKilvYmopLT50b1BpbigpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpVGltaW5nRGlzYWJsZV9mcm9tSW5zdCAoY29uc3QgOjpkZWZpVGltaW5nRGlzYWJsZSogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpVGltaW5nRGlzYWJsZSopb2JqKS0+ZnJvbUluc3QoKTsKLX0KLQotY29uc3QgY2hhciogZGVmaVRpbWluZ0Rpc2FibGVfdG9JbnN0IChjb25zdCA6OmRlZmlUaW1pbmdEaXNhYmxlKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlUaW1pbmdEaXNhYmxlKilvYmopLT50b0luc3QoKTsKLX0KLQotY29uc3QgY2hhciogZGVmaVRpbWluZ0Rpc2FibGVfbWFjcm9OYW1lIChjb25zdCA6OmRlZmlUaW1pbmdEaXNhYmxlKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlUaW1pbmdEaXNhYmxlKilvYmopLT5tYWNyb05hbWUoKTsKLX0KLQotY29uc3QgY2hhciogZGVmaVRpbWluZ0Rpc2FibGVfdGhydVBpbiAoY29uc3QgOjpkZWZpVGltaW5nRGlzYWJsZSogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpVGltaW5nRGlzYWJsZSopb2JqKS0+dGhydVBpbigpOwotfQotCi1jb25zdCBjaGFyKiBkZWZpVGltaW5nRGlzYWJsZV90aHJ1SW5zdCAoY29uc3QgOjpkZWZpVGltaW5nRGlzYWJsZSogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpkZWZpVGltaW5nRGlzYWJsZSopb2JqKS0+dGhydUluc3QoKTsKLX0KLQotdm9pZCBkZWZpVGltaW5nRGlzYWJsZV9wcmludCAoY29uc3QgOjpkZWZpVGltaW5nRGlzYWJsZSogb2JqLCBGSUxFKiAgZikgewotICAgICgoTGVmRGVmUGFyc2VyOjpkZWZpVGltaW5nRGlzYWJsZSopb2JqKS0+cHJpbnQoZik7Ci19Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZpVmlhLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZpVmlhLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4ZWJjYi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi94ZGVmaVZpYS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBBVFRFTlRJT046IFRISVMgSVMgQU4gQVVUTy1HRU5FUkFURUQgRklMRS4gRE8gTk9UIENIQU5HRSBJVCEKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTIsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogeHh4ICQKLS8vICAkUmV2aXNpb246IHh4eCAkCi0vLyAgJERhdGU6IHh4eCAkCi0vLyAgJFN0YXRlOiB4eHggJCAgCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2RlZmluZSBFWFRFUk4gZXh0ZXJuICJDIgotCi0jaW5jbHVkZSAiZGVmaVZpYS5oIgotI2luY2x1ZGUgImRlZmlWaWEuaHBwIgotCi0vLyBXcmFwcGVycyBkZWZpbml0aW9ucy4KLWNvbnN0IGNoYXIqIGRlZmlWaWFfbmFtZSAoY29uc3QgOjpkZWZpVmlhKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlWaWEqKW9iaiktPm5hbWUoKTsKLX0KLQotY29uc3QgY2hhciogZGVmaVZpYV9wYXR0ZXJuIChjb25zdCA6OmRlZmlWaWEqIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6ZGVmaVZpYSopb2JqKS0+cGF0dGVybigpOwotfQotCi1pbnQgZGVmaVZpYV9oYXNQYXR0ZXJuIChjb25zdCA6OmRlZmlWaWEqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVZpYSopb2JqKS0+aGFzUGF0dGVybigpOwotfQotCi1pbnQgZGVmaVZpYV9udW1MYXllcnMgKGNvbnN0IDo6ZGVmaVZpYSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpVmlhKilvYmopLT5udW1MYXllcnMoKTsKLX0KLQotdm9pZCBkZWZpVmlhX2xheWVyIChjb25zdCA6OmRlZmlWaWEqIG9iaiwgaW50ICBpbmRleCwgY2hhcioqICBsYXllciwgaW50KiAgeGwsIGludCogIHlsLCBpbnQqICB4aCwgaW50KiAgeWgpIHsKLSAgICAoKExlZkRlZlBhcnNlcjo6ZGVmaVZpYSopb2JqKS0+bGF5ZXIoaW5kZXgsIGxheWVyLCB4bCwgeWwsIHhoLCB5aCk7Ci19Ci0KLWludCBkZWZpVmlhX251bVBvbHlnb25zIChjb25zdCA6OmRlZmlWaWEqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVZpYSopb2JqKS0+bnVtUG9seWdvbnMoKTsKLX0KLQotY29uc3QgY2hhciogZGVmaVZpYV9wb2x5Z29uTmFtZSAoY29uc3QgOjpkZWZpVmlhKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlWaWEqKW9iaiktPnBvbHlnb25OYW1lKGluZGV4KTsKLX0KLQotOjpkZWZpUG9pbnRzIGRlZmlWaWFfZ2V0UG9seWdvbiAoY29uc3QgOjpkZWZpVmlhKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZmlQb2ludHMgdG1wOwotICAgIHRtcCA9ICgoTGVmRGVmUGFyc2VyOjpkZWZpVmlhKilvYmopLT5nZXRQb2x5Z29uKGluZGV4KTsKLSAgICByZXR1cm4gKigoOjpkZWZpUG9pbnRzKikmdG1wKTsKLX0KLQotaW50IGRlZmlWaWFfaGFzVmlhUnVsZSAoY29uc3QgOjpkZWZpVmlhKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlWaWEqKW9iaiktPmhhc1ZpYVJ1bGUoKTsKLX0KLQotdm9pZCBkZWZpVmlhX3ZpYVJ1bGUgKGNvbnN0IDo6ZGVmaVZpYSogb2JqLCBjaGFyKiogIHZpYVJ1bGVOYW1lLCBpbnQqICB4U2l6ZSwgaW50KiAgeVNpemUsIGNoYXIqKiAgYm90TGF5ZXIsIGNoYXIqKiAgY3V0TGF5ZXIsIGNoYXIqKiAgdG9wTGF5ZXIsIGludCogIHhDdXRTcGFjaW5nLCBpbnQqICB5Q3V0U3BhY2luZywgaW50KiAgeEJvdEVuYywgaW50KiAgeUJvdEVuYywgaW50KiAgeFRvcEVuYywgaW50KiAgeVRvcEVuYykgewotICAgICgoTGVmRGVmUGFyc2VyOjpkZWZpVmlhKilvYmopLT52aWFSdWxlKHZpYVJ1bGVOYW1lLCB4U2l6ZSwgeVNpemUsIGJvdExheWVyLCBjdXRMYXllciwgdG9wTGF5ZXIsIHhDdXRTcGFjaW5nLCB5Q3V0U3BhY2luZywgeEJvdEVuYywgeUJvdEVuYywgeFRvcEVuYywgeVRvcEVuYyk7Ci19Ci0KLWludCBkZWZpVmlhX2hhc1Jvd0NvbCAoY29uc3QgOjpkZWZpVmlhKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlWaWEqKW9iaiktPmhhc1Jvd0NvbCgpOwotfQotCi12b2lkIGRlZmlWaWFfcm93Q29sIChjb25zdCA6OmRlZmlWaWEqIG9iaiwgaW50KiAgbnVtQ3V0Um93cywgaW50KiAgbnVtQ3V0Q29scykgewotICAgICgoTGVmRGVmUGFyc2VyOjpkZWZpVmlhKilvYmopLT5yb3dDb2wobnVtQ3V0Um93cywgbnVtQ3V0Q29scyk7Ci19Ci0KLWludCBkZWZpVmlhX2hhc09yaWdpbiAoY29uc3QgOjpkZWZpVmlhKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlWaWEqKW9iaiktPmhhc09yaWdpbigpOwotfQotCi12b2lkIGRlZmlWaWFfb3JpZ2luIChjb25zdCA6OmRlZmlWaWEqIG9iaiwgaW50KiAgeE9mZnNldCwgaW50KiAgeU9mZnNldCkgewotICAgICgoTGVmRGVmUGFyc2VyOjpkZWZpVmlhKilvYmopLT5vcmlnaW4oeE9mZnNldCwgeU9mZnNldCk7Ci19Ci0KLWludCBkZWZpVmlhX2hhc09mZnNldCAoY29uc3QgOjpkZWZpVmlhKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlWaWEqKW9iaiktPmhhc09mZnNldCgpOwotfQotCi12b2lkIGRlZmlWaWFfb2Zmc2V0IChjb25zdCA6OmRlZmlWaWEqIG9iaiwgaW50KiAgeEJvdE9mZnNldCwgaW50KiAgeUJvdE9mZnNldCwgaW50KiAgeFRvcE9mZnNldCwgaW50KiAgeVRvcE9mZnNldCkgewotICAgICgoTGVmRGVmUGFyc2VyOjpkZWZpVmlhKilvYmopLT5vZmZzZXQoeEJvdE9mZnNldCwgeUJvdE9mZnNldCwgeFRvcE9mZnNldCwgeVRvcE9mZnNldCk7Ci19Ci0KLWludCBkZWZpVmlhX2hhc0N1dFBhdHRlcm4gKGNvbnN0IDo6ZGVmaVZpYSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpVmlhKilvYmopLT5oYXNDdXRQYXR0ZXJuKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlWaWFfY3V0UGF0dGVybiAoY29uc3QgOjpkZWZpVmlhKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmRlZmlWaWEqKW9iaiktPmN1dFBhdHRlcm4oKTsKLX0KLQotaW50IGRlZmlWaWFfaGFzUmVjdE1hc2sgKGNvbnN0IDo6ZGVmaVZpYSogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpVmlhKilvYmopLT5oYXNSZWN0TWFzayhpbmRleCk7Ci19Ci0KLWludCBkZWZpVmlhX3JlY3RNYXNrIChjb25zdCA6OmRlZmlWaWEqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6ZGVmaVZpYSopb2JqKS0+cmVjdE1hc2soaW5kZXgpOwotfQotCi1pbnQgZGVmaVZpYV9oYXNQb2x5TWFzayAoY29uc3QgOjpkZWZpVmlhKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmRlZmlWaWEqKW9iaiktPmhhc1BvbHlNYXNrKGluZGV4KTsKLX0KLQotaW50IGRlZmlWaWFfcG9seU1hc2sgKGNvbnN0IDo6ZGVmaVZpYSogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpkZWZpVmlhKilvYmopLT5wb2x5TWFzayhpbmRleCk7Ci19Ci0KLXZvaWQgZGVmaVZpYV9wcmludCAoY29uc3QgOjpkZWZpVmlhKiBvYmosIEZJTEUqICBmKSB7Ci0gICAgKChMZWZEZWZQYXJzZXI6OmRlZmlWaWEqKW9iaiktPnByaW50KGYpOwotfQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi94ZGVmclJlYWRlci5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi94ZGVmclJlYWRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMWZhYWEuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWYveGRlZnJSZWFkZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTExOSArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIEFUVEVOVElPTjogVEhJUyBJUyBBTiBBVVRPLUdFTkVSQVRFRCBGSUxFLiBETyBOT1QgQ0hBTkdFIElUIQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiB4eHggJAotLy8gICRSZXZpc2lvbjogeHh4ICQKLS8vICAkRGF0ZTogeHh4ICQKLS8vICAkU3RhdGU6IHh4eCAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2RlZmluZSBFWFRFUk4gZXh0ZXJuICJDIgotCi0jaW5jbHVkZSAiZGVmclJlYWRlci5oIgotI2luY2x1ZGUgImRlZnJSZWFkZXIuaHBwIgotCi0vLyBXcmFwcGVycyBkZWZpbml0aW9ucy4KLWludCBkZWZySW5pdCAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmckluaXQoKTsKLX0KLQotaW50IGRlZnJJbml0U2Vzc2lvbiAoaW50ICBzdGFydFNlc3Npb24pIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZySW5pdFNlc3Npb24oc3RhcnRTZXNzaW9uKTsKLX0KLQotaW50IGRlZnJSZXNldCAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmclJlc2V0KCk7Ci19Ci0KLWludCBkZWZyQ2xlYXIgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZnJDbGVhcigpOwotfQotCi12b2lkIGRlZnJTZXRDb21tZW50Q2hhciAoY2hhciAgYykgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldENvbW1lbnRDaGFyKGMpOwotfQotCi12b2lkIGRlZnJTZXRBZGRQYXRoVG9OZXQgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldEFkZFBhdGhUb05ldCgpOwotfQotCi12b2lkIGRlZnJTZXRBbGxvd0NvbXBvbmVudE5ldHMgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldEFsbG93Q29tcG9uZW50TmV0cygpOwotfQotCi1pbnQgZGVmckdldEFsbG93Q29tcG9uZW50TmV0cyAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmckdldEFsbG93Q29tcG9uZW50TmV0cygpOwotfQotCi12b2lkIGRlZnJTZXRDYXNlU2Vuc2l0aXZpdHkgKGludCAgY2FzZVNlbnNlKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0Q2FzZVNlbnNpdGl2aXR5KGNhc2VTZW5zZSk7Ci19Ci0KLXZvaWQgZGVmclNldFJlZ2lzdGVyVW51c2VkQ2FsbGJhY2tzICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRSZWdpc3RlclVudXNlZENhbGxiYWNrcygpOwotfQotCi12b2lkIGRlZnJQcmludFVudXNlZENhbGxiYWNrcyAoRklMRSogIGxvZykgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclByaW50VW51c2VkQ2FsbGJhY2tzKGxvZyk7Ci19Ci0KLWludCAgZGVmclJlbGVhc2VOUmVzZXRNZW1vcnkgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZnJSZWxlYXNlTlJlc2V0TWVtb3J5KCk7Ci19Ci0KLWludCBkZWZyUmVhZCAoRklMRSAqIGZpbGUsIGNvbnN0IGNoYXIgKiBmaWxlTmFtZSwgZGVmaVVzZXJEYXRhICB1c2VyRGF0YSwgaW50ICBjYXNlX3NlbnNpdGl2ZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZnJSZWFkKGZpbGUsIGZpbGVOYW1lLCB1c2VyRGF0YSwgY2FzZV9zZW5zaXRpdmUpOwotfQotCi12b2lkIGRlZnJTZXRVc2VyRGF0YSAoZGVmaVVzZXJEYXRhIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0VXNlckRhdGEocDApOwotfQotCi1kZWZpVXNlckRhdGEgZGVmckdldFVzZXJEYXRhICgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZyR2V0VXNlckRhdGEoKTsKLX0KLQotdm9pZCBkZWZyU2V0QXJyYXlOYW1lQ2JrICg6OmRlZnJTdHJpbmdDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRBcnJheU5hbWVDYmsoKExlZkRlZlBhcnNlcjo6ZGVmclN0cmluZ0Nia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXRBc3NlcnRpb25DYmsgKDo6ZGVmckFzc2VydGlvbkNia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldEFzc2VydGlvbkNiaygoTGVmRGVmUGFyc2VyOjpkZWZyQXNzZXJ0aW9uQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmclNldEFzc2VydGlvbnNTdGFydENiayAoOjpkZWZySW50ZWdlckNia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldEFzc2VydGlvbnNTdGFydENiaygoTGVmRGVmUGFyc2VyOjpkZWZySW50ZWdlckNia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXRBc3NlcnRpb25zRW5kQ2JrICg6OmRlZnJWb2lkQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0QXNzZXJ0aW9uc0VuZENiaygoTGVmRGVmUGFyc2VyOjpkZWZyVm9pZENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXRCbG9ja2FnZUNiayAoOjpkZWZyQmxvY2thZ2VDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRCbG9ja2FnZUNiaygoTGVmRGVmUGFyc2VyOjpkZWZyQmxvY2thZ2VDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0QmxvY2thZ2VTdGFydENiayAoOjpkZWZySW50ZWdlckNia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldEJsb2NrYWdlU3RhcnRDYmsoKExlZkRlZlBhcnNlcjo6ZGVmckludGVnZXJDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0QmxvY2thZ2VFbmRDYmsgKDo6ZGVmclZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRCbG9ja2FnZUVuZENiaygoTGVmRGVmUGFyc2VyOjpkZWZyVm9pZENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXRCdXNCaXRDYmsgKDo6ZGVmclN0cmluZ0Nia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldEJ1c0JpdENiaygoTGVmRGVmUGFyc2VyOjpkZWZyU3RyaW5nQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmclNldENhbm5vdE9jY3VweUNiayAoOjpkZWZyU2l0ZUNia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldENhbm5vdE9jY3VweUNiaygoTGVmRGVmUGFyc2VyOjpkZWZyU2l0ZUNia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXRDYW5wbGFjZUNiayAoOjpkZWZyU2l0ZUNia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldENhbnBsYWNlQ2JrKChMZWZEZWZQYXJzZXI6OmRlZnJTaXRlQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmclNldENhc2VTZW5zaXRpdmVDYmsgKDo6ZGVmckludGVnZXJDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRDYXNlU2Vuc2l0aXZlQ2JrKChMZWZEZWZQYXJzZXI6OmRlZnJJbnRlZ2VyQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmclNldENvbXBvbmVudENiayAoOjpkZWZyQ29tcG9uZW50Q2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0Q29tcG9uZW50Q2JrKChMZWZEZWZQYXJzZXI6OmRlZnJDb21wb25lbnRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0Q29tcG9uZW50RXh0Q2JrICg6OmRlZnJTdHJpbmdDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRDb21wb25lbnRFeHRDYmsoKExlZkRlZlBhcnNlcjo6ZGVmclN0cmluZ0Nia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXRDb21wb25lbnRTdGFydENiayAoOjpkZWZySW50ZWdlckNia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldENvbXBvbmVudFN0YXJ0Q2JrKChMZWZEZWZQYXJzZXI6OmRlZnJJbnRlZ2VyQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmclNldENvbXBvbmVudEVuZENiayAoOjpkZWZyVm9pZENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldENvbXBvbmVudEVuZENiaygoTGVmRGVmUGFyc2VyOjpkZWZyVm9pZENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXRDb25zdHJhaW50Q2JrICg6OmRlZnJBc3NlcnRpb25DYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRDb25zdHJhaW50Q2JrKChMZWZEZWZQYXJzZXI6OmRlZnJBc3NlcnRpb25DYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0Q29uc3RyYWludHNTdGFydENiayAoOjpkZWZySW50ZWdlckNia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldENvbnN0cmFpbnRzU3RhcnRDYmsoKExlZkRlZlBhcnNlcjo6ZGVmckludGVnZXJDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0Q29uc3RyYWludHNFbmRDYmsgKDo6ZGVmclZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRDb25zdHJhaW50c0VuZENiaygoTGVmRGVmUGFyc2VyOjpkZWZyVm9pZENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXREZWZhdWx0Q2FwQ2JrICg6OmRlZnJJbnRlZ2VyQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0RGVmYXVsdENhcENiaygoTGVmRGVmUGFyc2VyOjpkZWZySW50ZWdlckNia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXREZXNpZ25DYmsgKDo6ZGVmclN0cmluZ0Nia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldERlc2lnbkNiaygoTGVmRGVmUGFyc2VyOjpkZWZyU3RyaW5nQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmclNldERlc2lnbkVuZENiayAoOjpkZWZyVm9pZENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldERlc2lnbkVuZENiaygoTGVmRGVmUGFyc2VyOjpkZWZyVm9pZENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXREaWVBcmVhQ2JrICg6OmRlZnJCb3hDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXREaWVBcmVhQ2JrKChMZWZEZWZQYXJzZXI6OmRlZnJCb3hDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0RGl2aWRlckNiayAoOjpkZWZyU3RyaW5nQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0RGl2aWRlckNiaygoTGVmRGVmUGFyc2VyOjpkZWZyU3RyaW5nQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmclNldEV4dGVuc2lvbkNiayAoOjpkZWZyU3RyaW5nQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0RXh0ZW5zaW9uQ2JrKChMZWZEZWZQYXJzZXI6OmRlZnJTdHJpbmdDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0RmlsbENiayAoOjpkZWZyRmlsbENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldEZpbGxDYmsoKExlZkRlZlBhcnNlcjo6ZGVmckZpbGxDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0RmlsbFN0YXJ0Q2JrICg6OmRlZnJJbnRlZ2VyQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0RmlsbFN0YXJ0Q2JrKChMZWZEZWZQYXJzZXI6OmRlZnJJbnRlZ2VyQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmclNldEZpbGxFbmRDYmsgKDo6ZGVmclZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRGaWxsRW5kQ2JrKChMZWZEZWZQYXJzZXI6OmRlZnJWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmclNldEZQQ0NiayAoOjpkZWZyRlBDQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0RlBDQ2JrKChMZWZEZWZQYXJzZXI6OmRlZnJGUENDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0RlBDU3RhcnRDYmsgKDo6ZGVmckludGVnZXJDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRGUENTdGFydENiaygoTGVmRGVmUGFyc2VyOjpkZWZySW50ZWdlckNia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXRGUENFbmRDYmsgKDo6ZGVmclZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRGUENFbmRDYmsoKExlZkRlZlBhcnNlcjo6ZGVmclZvaWRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0Rmxvb3JQbGFuTmFtZUNiayAoOjpkZWZyU3RyaW5nQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0Rmxvb3JQbGFuTmFtZUNiaygoTGVmRGVmUGFyc2VyOjpkZWZyU3RyaW5nQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmclNldEdjZWxsR3JpZENiayAoOjpkZWZyR2NlbGxHcmlkQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0R2NlbGxHcmlkQ2JrKChMZWZEZWZQYXJzZXI6OmRlZnJHY2VsbEdyaWRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0R3JvdXBOYW1lQ2JrICg6OmRlZnJTdHJpbmdDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRHcm91cE5hbWVDYmsoKExlZkRlZlBhcnNlcjo6ZGVmclN0cmluZ0Nia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXRHcm91cE1lbWJlckNiayAoOjpkZWZyU3RyaW5nQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0R3JvdXBNZW1iZXJDYmsoKExlZkRlZlBhcnNlcjo6ZGVmclN0cmluZ0Nia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXRDb21wb25lbnRNYXNrU2hpZnRMYXllckNiayAoOjpkZWZyQ29tcG9uZW50TWFza1NoaWZ0TGF5ZXJDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRDb21wb25lbnRNYXNrU2hpZnRMYXllckNiaygoTGVmRGVmUGFyc2VyOjpkZWZyQ29tcG9uZW50TWFza1NoaWZ0TGF5ZXJDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0R3JvdXBDYmsgKDo6ZGVmckdyb3VwQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0R3JvdXBDYmsoKExlZkRlZlBhcnNlcjo6ZGVmckdyb3VwQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmclNldEdyb3VwRXh0Q2JrICg6OmRlZnJTdHJpbmdDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRHcm91cEV4dENiaygoTGVmRGVmUGFyc2VyOjpkZWZyU3RyaW5nQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmclNldEdyb3Vwc1N0YXJ0Q2JrICg6OmRlZnJJbnRlZ2VyQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0R3JvdXBzU3RhcnRDYmsoKExlZkRlZlBhcnNlcjo6ZGVmckludGVnZXJDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0R3JvdXBzRW5kQ2JrICg6OmRlZnJWb2lkQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0R3JvdXBzRW5kQ2JrKChMZWZEZWZQYXJzZXI6OmRlZnJWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmclNldEhpc3RvcnlDYmsgKDo6ZGVmclN0cmluZ0Nia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldEhpc3RvcnlDYmsoKExlZkRlZlBhcnNlcjo6ZGVmclN0cmluZ0Nia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXRJT1RpbWluZ0NiayAoOjpkZWZySU9UaW1pbmdDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRJT1RpbWluZ0NiaygoTGVmRGVmUGFyc2VyOjpkZWZySU9UaW1pbmdDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0SU9UaW1pbmdzU3RhcnRDYmsgKDo6ZGVmckludGVnZXJDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRJT1RpbWluZ3NTdGFydENiaygoTGVmRGVmUGFyc2VyOjpkZWZySW50ZWdlckNia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXRJT1RpbWluZ3NFbmRDYmsgKDo6ZGVmclZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRJT1RpbWluZ3NFbmRDYmsoKExlZkRlZlBhcnNlcjo6ZGVmclZvaWRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0SW9UaW1pbmdzRXh0Q2JrICg6OmRlZnJTdHJpbmdDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRJb1RpbWluZ3NFeHRDYmsoKExlZkRlZlBhcnNlcjo6ZGVmclN0cmluZ0Nia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXROZXRDYmsgKDo6ZGVmck5ldENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldE5ldENiaygoTGVmRGVmUGFyc2VyOjpkZWZyTmV0Q2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmclNldE5ldE5hbWVDYmsgKDo6ZGVmclN0cmluZ0Nia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldE5ldE5hbWVDYmsoKExlZkRlZlBhcnNlcjo6ZGVmclN0cmluZ0Nia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXROZXROb25EZWZhdWx0UnVsZUNiayAoOjpkZWZyU3RyaW5nQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0TmV0Tm9uRGVmYXVsdFJ1bGVDYmsoKExlZkRlZlBhcnNlcjo6ZGVmclN0cmluZ0Nia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXROZXRDb25uZWN0aW9uRXh0Q2JrICg6OmRlZnJTdHJpbmdDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXROZXRDb25uZWN0aW9uRXh0Q2JrKChMZWZEZWZQYXJzZXI6OmRlZnJTdHJpbmdDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0TmV0RXh0Q2JrICg6OmRlZnJTdHJpbmdDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXROZXRFeHRDYmsoKExlZkRlZlBhcnNlcjo6ZGVmclN0cmluZ0Nia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXROZXRQYXJ0aWFsUGF0aENiayAoOjpkZWZyTmV0Q2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0TmV0UGFydGlhbFBhdGhDYmsoKExlZkRlZlBhcnNlcjo6ZGVmck5ldENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXROZXRTdWJuZXROYW1lQ2JrICg6OmRlZnJTdHJpbmdDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXROZXRTdWJuZXROYW1lQ2JrKChMZWZEZWZQYXJzZXI6OmRlZnJTdHJpbmdDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0TmV0U3RhcnRDYmsgKDo6ZGVmckludGVnZXJDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXROZXRTdGFydENiaygoTGVmRGVmUGFyc2VyOjpkZWZySW50ZWdlckNia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXROZXRFbmRDYmsgKDo6ZGVmclZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXROZXRFbmRDYmsoKExlZkRlZlBhcnNlcjo6ZGVmclZvaWRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0Tm9uRGVmYXVsdENiayAoOjpkZWZyTm9uRGVmYXVsdENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldE5vbkRlZmF1bHRDYmsoKExlZkRlZlBhcnNlcjo6ZGVmck5vbkRlZmF1bHRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0Tm9uRGVmYXVsdFN0YXJ0Q2JrICg6OmRlZnJJbnRlZ2VyQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0Tm9uRGVmYXVsdFN0YXJ0Q2JrKChMZWZEZWZQYXJzZXI6OmRlZnJJbnRlZ2VyQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmclNldE5vbkRlZmF1bHRFbmRDYmsgKDo6ZGVmclZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXROb25EZWZhdWx0RW5kQ2JrKChMZWZEZWZQYXJzZXI6OmRlZnJWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmclNldFBhcnRpdGlvbkNiayAoOjpkZWZyUGFydGl0aW9uQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0UGFydGl0aW9uQ2JrKChMZWZEZWZQYXJzZXI6OmRlZnJQYXJ0aXRpb25DYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0UGFydGl0aW9uc0V4dENiayAoOjpkZWZyU3RyaW5nQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0UGFydGl0aW9uc0V4dENiaygoTGVmRGVmUGFyc2VyOjpkZWZyU3RyaW5nQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmclNldFBhcnRpdGlvbnNTdGFydENiayAoOjpkZWZySW50ZWdlckNia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldFBhcnRpdGlvbnNTdGFydENiaygoTGVmRGVmUGFyc2VyOjpkZWZySW50ZWdlckNia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXRQYXJ0aXRpb25zRW5kQ2JrICg6OmRlZnJWb2lkQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0UGFydGl0aW9uc0VuZENiaygoTGVmRGVmUGFyc2VyOjpkZWZyVm9pZENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXRQYXRoQ2JrICg6OmRlZnJQYXRoQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0UGF0aENiaygoTGVmRGVmUGFyc2VyOjpkZWZyUGF0aENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXRQaW5DYXBDYmsgKDo6ZGVmclBpbkNhcENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldFBpbkNhcENiaygoTGVmRGVmUGFyc2VyOjpkZWZyUGluQ2FwQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmclNldFBpbkNiayAoOjpkZWZyUGluQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0UGluQ2JrKChMZWZEZWZQYXJzZXI6OmRlZnJQaW5DYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0UGluRXh0Q2JrICg6OmRlZnJTdHJpbmdDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRQaW5FeHRDYmsoKExlZkRlZlBhcnNlcjo6ZGVmclN0cmluZ0Nia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXRQaW5Qcm9wQ2JrICg6OmRlZnJQaW5Qcm9wQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0UGluUHJvcENiaygoTGVmRGVmUGFyc2VyOjpkZWZyUGluUHJvcENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXRQaW5Qcm9wU3RhcnRDYmsgKDo6ZGVmckludGVnZXJDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRQaW5Qcm9wU3RhcnRDYmsoKExlZkRlZlBhcnNlcjo6ZGVmckludGVnZXJDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0UGluUHJvcEVuZENiayAoOjpkZWZyVm9pZENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldFBpblByb3BFbmRDYmsoKExlZkRlZlBhcnNlcjo6ZGVmclZvaWRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0UHJvcENiayAoOjpkZWZyUHJvcENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldFByb3BDYmsoKExlZkRlZlBhcnNlcjo6ZGVmclByb3BDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0UHJvcERlZkVuZENiayAoOjpkZWZyVm9pZENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldFByb3BEZWZFbmRDYmsoKExlZkRlZlBhcnNlcjo6ZGVmclZvaWRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0UHJvcERlZlN0YXJ0Q2JrICg6OmRlZnJWb2lkQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0UHJvcERlZlN0YXJ0Q2JrKChMZWZEZWZQYXJzZXI6OmRlZnJWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmclNldFJlZ2lvbkNiayAoOjpkZWZyUmVnaW9uQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0UmVnaW9uQ2JrKChMZWZEZWZQYXJzZXI6OmRlZnJSZWdpb25DYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0UmVnaW9uU3RhcnRDYmsgKDo6ZGVmckludGVnZXJDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRSZWdpb25TdGFydENiaygoTGVmRGVmUGFyc2VyOjpkZWZySW50ZWdlckNia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXRSZWdpb25FbmRDYmsgKDo6ZGVmclZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRSZWdpb25FbmRDYmsoKExlZkRlZlBhcnNlcjo6ZGVmclZvaWRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0Um93Q2JrICg6OmRlZnJSb3dDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRSb3dDYmsoKExlZkRlZlBhcnNlcjo6ZGVmclJvd0Nia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXRTTmV0Q2JrICg6OmRlZnJOZXRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRTTmV0Q2JrKChMZWZEZWZQYXJzZXI6OmRlZnJOZXRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0U05ldFN0YXJ0Q2JrICg6OmRlZnJJbnRlZ2VyQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0U05ldFN0YXJ0Q2JrKChMZWZEZWZQYXJzZXI6OmRlZnJJbnRlZ2VyQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmclNldFNOZXRFbmRDYmsgKDo6ZGVmclZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRTTmV0RW5kQ2JrKChMZWZEZWZQYXJzZXI6OmRlZnJWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmclNldFNOZXRQYXJ0aWFsUGF0aENiayAoOjpkZWZyTmV0Q2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0U05ldFBhcnRpYWxQYXRoQ2JrKChMZWZEZWZQYXJzZXI6OmRlZnJOZXRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0U05ldFdpcmVDYmsgKDo6ZGVmck5ldENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldFNOZXRXaXJlQ2JrKChMZWZEZWZQYXJzZXI6OmRlZnJOZXRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0U2NhbkNoYWluRXh0Q2JrICg6OmRlZnJTdHJpbmdDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRTY2FuQ2hhaW5FeHRDYmsoKExlZkRlZlBhcnNlcjo6ZGVmclN0cmluZ0Nia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXRTY2FuY2hhaW5DYmsgKDo6ZGVmclNjYW5jaGFpbkNia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldFNjYW5jaGFpbkNiaygoTGVmRGVmUGFyc2VyOjpkZWZyU2NhbmNoYWluQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmclNldFNjYW5jaGFpbnNTdGFydENiayAoOjpkZWZySW50ZWdlckNia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldFNjYW5jaGFpbnNTdGFydENiaygoTGVmRGVmUGFyc2VyOjpkZWZySW50ZWdlckNia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXRTY2FuY2hhaW5zRW5kQ2JrICg6OmRlZnJWb2lkQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0U2NhbmNoYWluc0VuZENiaygoTGVmRGVmUGFyc2VyOjpkZWZyVm9pZENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXRTaXRlQ2JrICg6OmRlZnJTaXRlQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0U2l0ZUNiaygoTGVmRGVmUGFyc2VyOjpkZWZyU2l0ZUNia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXRTbG90Q2JrICg6OmRlZnJTbG90Q2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0U2xvdENiaygoTGVmRGVmUGFyc2VyOjpkZWZyU2xvdENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXRTbG90U3RhcnRDYmsgKDo6ZGVmckludGVnZXJDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRTbG90U3RhcnRDYmsoKExlZkRlZlBhcnNlcjo6ZGVmckludGVnZXJDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0U2xvdEVuZENiayAoOjpkZWZyVm9pZENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldFNsb3RFbmRDYmsoKExlZkRlZlBhcnNlcjo6ZGVmclZvaWRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0U3RhcnRQaW5zQ2JrICg6OmRlZnJJbnRlZ2VyQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0U3RhcnRQaW5zQ2JrKChMZWZEZWZQYXJzZXI6OmRlZnJJbnRlZ2VyQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmclNldFN0eWxlc0NiayAoOjpkZWZyU3R5bGVzQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0U3R5bGVzQ2JrKChMZWZEZWZQYXJzZXI6OmRlZnJTdHlsZXNDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0U3R5bGVzU3RhcnRDYmsgKDo6ZGVmckludGVnZXJDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRTdHlsZXNTdGFydENiaygoTGVmRGVmUGFyc2VyOjpkZWZySW50ZWdlckNia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXRTdHlsZXNFbmRDYmsgKDo6ZGVmclZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRTdHlsZXNFbmRDYmsoKExlZkRlZlBhcnNlcjo6ZGVmclZvaWRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0UGluRW5kQ2JrICg6OmRlZnJWb2lkQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0UGluRW5kQ2JrKChMZWZEZWZQYXJzZXI6OmRlZnJWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmclNldFRlY2hub2xvZ3lDYmsgKDo6ZGVmclN0cmluZ0Nia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldFRlY2hub2xvZ3lDYmsoKExlZkRlZlBhcnNlcjo6ZGVmclN0cmluZ0Nia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXRUaW1pbmdEaXNhYmxlQ2JrICg6OmRlZnJUaW1pbmdEaXNhYmxlQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0VGltaW5nRGlzYWJsZUNiaygoTGVmRGVmUGFyc2VyOjpkZWZyVGltaW5nRGlzYWJsZUNia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXRUaW1pbmdEaXNhYmxlc1N0YXJ0Q2JrICg6OmRlZnJJbnRlZ2VyQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0VGltaW5nRGlzYWJsZXNTdGFydENiaygoTGVmRGVmUGFyc2VyOjpkZWZySW50ZWdlckNia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXRUaW1pbmdEaXNhYmxlc0VuZENiayAoOjpkZWZyVm9pZENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldFRpbWluZ0Rpc2FibGVzRW5kQ2JrKChMZWZEZWZQYXJzZXI6OmRlZnJWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmclNldFRyYWNrQ2JrICg6OmRlZnJUcmFja0Nia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldFRyYWNrQ2JrKChMZWZEZWZQYXJzZXI6OmRlZnJUcmFja0Nia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXRVbml0c0NiayAoOjpkZWZyRG91YmxlQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0VW5pdHNDYmsoKExlZkRlZlBhcnNlcjo6ZGVmckRvdWJsZUNia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXRWZXJzaW9uQ2JrICg6OmRlZnJEb3VibGVDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRWZXJzaW9uQ2JrKChMZWZEZWZQYXJzZXI6OmRlZnJEb3VibGVDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0VmVyc2lvblN0ckNiayAoOjpkZWZyU3RyaW5nQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0VmVyc2lvblN0ckNiaygoTGVmRGVmUGFyc2VyOjpkZWZyU3RyaW5nQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmclNldFZpYUNiayAoOjpkZWZyVmlhQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0VmlhQ2JrKChMZWZEZWZQYXJzZXI6OmRlZnJWaWFDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0VmlhRXh0Q2JrICg6OmRlZnJTdHJpbmdDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRWaWFFeHRDYmsoKExlZkRlZlBhcnNlcjo6ZGVmclN0cmluZ0Nia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJTZXRWaWFTdGFydENiayAoOjpkZWZySW50ZWdlckNia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldFZpYVN0YXJ0Q2JrKChMZWZEZWZQYXJzZXI6OmRlZnJJbnRlZ2VyQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmclNldFZpYUVuZENiayAoOjpkZWZyVm9pZENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldFZpYUVuZENiaygoTGVmRGVmUGFyc2VyOjpkZWZyVm9pZENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZnJVbnNldENhbGxiYWNrcyAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXRDYWxsYmFja3MoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRBcnJheU5hbWVDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0QXJyYXlOYW1lQ2JrKCk7Ci19Ci0KLXZvaWQgZGVmclVuc2V0QXNzZXJ0aW9uQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldEFzc2VydGlvbkNiaygpOwotfQotCi12b2lkIGRlZnJVbnNldEFzc2VydGlvbnNTdGFydENiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXRBc3NlcnRpb25zU3RhcnRDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRBc3NlcnRpb25zRW5kQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldEFzc2VydGlvbnNFbmRDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRCbG9ja2FnZUNiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXRCbG9ja2FnZUNiaygpOwotfQotCi12b2lkIGRlZnJVbnNldEJsb2NrYWdlU3RhcnRDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0QmxvY2thZ2VTdGFydENiaygpOwotfQotCi12b2lkIGRlZnJVbnNldEJsb2NrYWdlRW5kQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldEJsb2NrYWdlRW5kQ2JrKCk7Ci19Ci0KLXZvaWQgZGVmclVuc2V0QnVzQml0Q2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldEJ1c0JpdENiaygpOwotfQotCi12b2lkIGRlZnJVbnNldENhbm5vdE9jY3VweUNiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXRDYW5ub3RPY2N1cHlDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRDYW5wbGFjZUNiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXRDYW5wbGFjZUNiaygpOwotfQotCi12b2lkIGRlZnJVbnNldENhc2VTZW5zaXRpdmVDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0Q2FzZVNlbnNpdGl2ZUNiaygpOwotfQotCi12b2lkIGRlZnJVbnNldENvbXBvbmVudENiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXRDb21wb25lbnRDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRDb21wb25lbnRFeHRDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0Q29tcG9uZW50RXh0Q2JrKCk7Ci19Ci0KLXZvaWQgZGVmclVuc2V0Q29tcG9uZW50U3RhcnRDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0Q29tcG9uZW50U3RhcnRDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRDb21wb25lbnRFbmRDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0Q29tcG9uZW50RW5kQ2JrKCk7Ci19Ci0KLXZvaWQgZGVmclVuc2V0Q29uc3RyYWludENiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXRDb25zdHJhaW50Q2JrKCk7Ci19Ci0KLXZvaWQgZGVmclVuc2V0Q29uc3RyYWludHNTdGFydENiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXRDb25zdHJhaW50c1N0YXJ0Q2JrKCk7Ci19Ci0KLXZvaWQgZGVmclVuc2V0Q29uc3RyYWludHNFbmRDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0Q29uc3RyYWludHNFbmRDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXREZWZhdWx0Q2FwQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldERlZmF1bHRDYXBDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXREZXNpZ25DYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0RGVzaWduQ2JrKCk7Ci19Ci0KLXZvaWQgZGVmclVuc2V0RGVzaWduRW5kQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldERlc2lnbkVuZENiaygpOwotfQotCi12b2lkIGRlZnJVbnNldERpZUFyZWFDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0RGllQXJlYUNiaygpOwotfQotCi12b2lkIGRlZnJVbnNldERpdmlkZXJDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0RGl2aWRlckNiaygpOwotfQotCi12b2lkIGRlZnJVbnNldEV4dGVuc2lvbkNiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXRFeHRlbnNpb25DYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRGaWxsQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldEZpbGxDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRGaWxsU3RhcnRDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0RmlsbFN0YXJ0Q2JrKCk7Ci19Ci0KLXZvaWQgZGVmclVuc2V0RmlsbEVuZENiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXRGaWxsRW5kQ2JrKCk7Ci19Ci0KLXZvaWQgZGVmclVuc2V0RlBDQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldEZQQ0NiaygpOwotfQotCi12b2lkIGRlZnJVbnNldEZQQ1N0YXJ0Q2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldEZQQ1N0YXJ0Q2JrKCk7Ci19Ci0KLXZvaWQgZGVmclVuc2V0RlBDRW5kQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldEZQQ0VuZENiaygpOwotfQotCi12b2lkIGRlZnJVbnNldEZsb29yUGxhbk5hbWVDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0Rmxvb3JQbGFuTmFtZUNiaygpOwotfQotCi12b2lkIGRlZnJVbnNldEdjZWxsR3JpZENiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXRHY2VsbEdyaWRDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRHcm91cENiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXRHcm91cENiaygpOwotfQotCi12b2lkIGRlZnJVbnNldEdyb3VwRXh0Q2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldEdyb3VwRXh0Q2JrKCk7Ci19Ci0KLXZvaWQgZGVmclVuc2V0R3JvdXBNZW1iZXJDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0R3JvdXBNZW1iZXJDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRDb21wb25lbnRNYXNrU2hpZnRMYXllckNiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXRDb21wb25lbnRNYXNrU2hpZnRMYXllckNiaygpOwotfQotCi12b2lkIGRlZnJVbnNldEdyb3VwTmFtZUNiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXRHcm91cE5hbWVDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRHcm91cHNTdGFydENiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXRHcm91cHNTdGFydENiaygpOwotfQotCi12b2lkIGRlZnJVbnNldEdyb3Vwc0VuZENiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXRHcm91cHNFbmRDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRIaXN0b3J5Q2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldEhpc3RvcnlDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRJT1RpbWluZ0NiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXRJT1RpbWluZ0NiaygpOwotfQotCi12b2lkIGRlZnJVbnNldElPVGltaW5nc1N0YXJ0Q2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldElPVGltaW5nc1N0YXJ0Q2JrKCk7Ci19Ci0KLXZvaWQgZGVmclVuc2V0SU9UaW1pbmdzRW5kQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldElPVGltaW5nc0VuZENiaygpOwotfQotCi12b2lkIGRlZnJVbnNldElPVGltaW5nc0V4dENiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXRJT1RpbWluZ3NFeHRDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXROZXRDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0TmV0Q2JrKCk7Ci19Ci0KLXZvaWQgZGVmclVuc2V0TmV0TmFtZUNiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXROZXROYW1lQ2JrKCk7Ci19Ci0KLXZvaWQgZGVmclVuc2V0TmV0Tm9uRGVmYXVsdFJ1bGVDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0TmV0Tm9uRGVmYXVsdFJ1bGVDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXROZXRDb25uZWN0aW9uRXh0Q2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldE5ldENvbm5lY3Rpb25FeHRDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXROZXRFeHRDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0TmV0RXh0Q2JrKCk7Ci19Ci0KLXZvaWQgZGVmclVuc2V0TmV0UGFydGlhbFBhdGhDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0TmV0UGFydGlhbFBhdGhDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXROZXRTdWJuZXROYW1lQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldE5ldFN1Ym5ldE5hbWVDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXROZXRTdGFydENiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXROZXRTdGFydENiaygpOwotfQotCi12b2lkIGRlZnJVbnNldE5ldEVuZENiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXROZXRFbmRDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXROb25EZWZhdWx0Q2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldE5vbkRlZmF1bHRDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXROb25EZWZhdWx0U3RhcnRDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0Tm9uRGVmYXVsdFN0YXJ0Q2JrKCk7Ci19Ci0KLXZvaWQgZGVmclVuc2V0Tm9uRGVmYXVsdEVuZENiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXROb25EZWZhdWx0RW5kQ2JrKCk7Ci19Ci0KLXZvaWQgZGVmclVuc2V0UGFydGl0aW9uQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldFBhcnRpdGlvbkNiaygpOwotfQotCi12b2lkIGRlZnJVbnNldFBhcnRpdGlvbnNFeHRDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0UGFydGl0aW9uc0V4dENiaygpOwotfQotCi12b2lkIGRlZnJVbnNldFBhcnRpdGlvbnNTdGFydENiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXRQYXJ0aXRpb25zU3RhcnRDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRQYXJ0aXRpb25zRW5kQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldFBhcnRpdGlvbnNFbmRDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRQYXRoQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldFBhdGhDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRQaW5DYXBDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0UGluQ2FwQ2JrKCk7Ci19Ci0KLXZvaWQgZGVmclVuc2V0UGluQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldFBpbkNiaygpOwotfQotCi12b2lkIGRlZnJVbnNldFBpbkVuZENiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXRQaW5FbmRDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRQaW5FeHRDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0UGluRXh0Q2JrKCk7Ci19Ci0KLXZvaWQgZGVmclVuc2V0UGluUHJvcENiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXRQaW5Qcm9wQ2JrKCk7Ci19Ci0KLXZvaWQgZGVmclVuc2V0UGluUHJvcFN0YXJ0Q2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldFBpblByb3BTdGFydENiaygpOwotfQotCi12b2lkIGRlZnJVbnNldFBpblByb3BFbmRDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0UGluUHJvcEVuZENiaygpOwotfQotCi12b2lkIGRlZnJVbnNldFByb3BDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0UHJvcENiaygpOwotfQotCi12b2lkIGRlZnJVbnNldFByb3BEZWZFbmRDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0UHJvcERlZkVuZENiaygpOwotfQotCi12b2lkIGRlZnJVbnNldFByb3BEZWZTdGFydENiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXRQcm9wRGVmU3RhcnRDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRSZWdpb25DYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0UmVnaW9uQ2JrKCk7Ci19Ci0KLXZvaWQgZGVmclVuc2V0UmVnaW9uU3RhcnRDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0UmVnaW9uU3RhcnRDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRSZWdpb25FbmRDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0UmVnaW9uRW5kQ2JrKCk7Ci19Ci0KLXZvaWQgZGVmclVuc2V0Um93Q2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldFJvd0NiaygpOwotfQotCi12b2lkIGRlZnJVbnNldFNjYW5DaGFpbkV4dENiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXRTY2FuQ2hhaW5FeHRDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRTY2FuY2hhaW5DYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0U2NhbmNoYWluQ2JrKCk7Ci19Ci0KLXZvaWQgZGVmclVuc2V0U2NhbmNoYWluc1N0YXJ0Q2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldFNjYW5jaGFpbnNTdGFydENiaygpOwotfQotCi12b2lkIGRlZnJVbnNldFNjYW5jaGFpbnNFbmRDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0U2NhbmNoYWluc0VuZENiaygpOwotfQotCi12b2lkIGRlZnJVbnNldFNpdGVDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0U2l0ZUNiaygpOwotfQotCi12b2lkIGRlZnJVbnNldFNsb3RDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0U2xvdENiaygpOwotfQotCi12b2lkIGRlZnJVbnNldFNsb3RTdGFydENiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXRTbG90U3RhcnRDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRTbG90RW5kQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldFNsb3RFbmRDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRTTmV0V2lyZUNiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXRTTmV0V2lyZUNiaygpOwotfQotCi12b2lkIGRlZnJVbnNldFNOZXRDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0U05ldENiaygpOwotfQotCi12b2lkIGRlZnJVbnNldFNOZXRTdGFydENiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXRTTmV0U3RhcnRDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRTTmV0RW5kQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldFNOZXRFbmRDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRTTmV0UGFydGlhbFBhdGhDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0U05ldFBhcnRpYWxQYXRoQ2JrKCk7Ci19Ci0KLXZvaWQgZGVmclVuc2V0U3RhcnRQaW5zQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldFN0YXJ0UGluc0NiaygpOwotfQotCi12b2lkIGRlZnJVbnNldFN0eWxlc0NiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXRTdHlsZXNDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRTdHlsZXNTdGFydENiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXRTdHlsZXNTdGFydENiaygpOwotfQotCi12b2lkIGRlZnJVbnNldFN0eWxlc0VuZENiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXRTdHlsZXNFbmRDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRUZWNobm9sb2d5Q2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldFRlY2hub2xvZ3lDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRUaW1pbmdEaXNhYmxlQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldFRpbWluZ0Rpc2FibGVDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRUaW1pbmdEaXNhYmxlc1N0YXJ0Q2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldFRpbWluZ0Rpc2FibGVzU3RhcnRDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRUaW1pbmdEaXNhYmxlc0VuZENiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXRUaW1pbmdEaXNhYmxlc0VuZENiaygpOwotfQotCi12b2lkIGRlZnJVbnNldFRyYWNrQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldFRyYWNrQ2JrKCk7Ci19Ci0KLXZvaWQgZGVmclVuc2V0VW5pdHNDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0VW5pdHNDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRWZXJzaW9uQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldFZlcnNpb25DYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRWZXJzaW9uU3RyQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldFZlcnNpb25TdHJDYmsoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRWaWFDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclVuc2V0VmlhQ2JrKCk7Ci19Ci0KLXZvaWQgZGVmclVuc2V0VmlhRXh0Q2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldFZpYUV4dENiaygpOwotfQotCi12b2lkIGRlZnJVbnNldFZpYVN0YXJ0Q2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldFZpYVN0YXJ0Q2JrKCk7Ci19Ci0KLXZvaWQgZGVmclVuc2V0VmlhRW5kQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldFZpYUVuZENiaygpOwotfQotCi12b2lkIGRlZnJTZXRVbnVzZWRDYWxsYmFja3MgKDo6ZGVmclZvaWRDYmtGblR5cGUgIGZ1bmMpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRVbnVzZWRDYWxsYmFja3MoKExlZkRlZlBhcnNlcjo6ZGVmclZvaWRDYmtGblR5cGUgKSBmdW5jKTsKLX0KLQotaW50IGRlZnJMaW5lTnVtYmVyICgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZyTGluZU51bWJlcigpOwotfQotCi1sb25nIGxvbmcgZGVmckxvbmdMaW5lTnVtYmVyICgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZyTG9uZ0xpbmVOdW1iZXIoKTsKLX0KLQotdm9pZCBkZWZyU2V0TG9nRnVuY3Rpb24gKDo6REVGSV9MT0dfRlVOQ1RJT04gcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRMb2dGdW5jdGlvbihwMCk7Ci19Ci0KLXZvaWQgZGVmclNldFdhcm5pbmdMb2dGdW5jdGlvbiAoOjpERUZJX1dBUk5JTkdfTE9HX0ZVTkNUSU9OIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0V2FybmluZ0xvZ0Z1bmN0aW9uKHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0TWFsbG9jRnVuY3Rpb24gKDo6REVGSV9NQUxMT0NfRlVOQ1RJT04gcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRNYWxsb2NGdW5jdGlvbihwMCk7Ci19Ci0KLXZvaWQgZGVmclNldFJlYWxsb2NGdW5jdGlvbiAoOjpERUZJX1JFQUxMT0NfRlVOQ1RJT04gcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRSZWFsbG9jRnVuY3Rpb24ocDApOwotfQotCi12b2lkIGRlZnJTZXRGcmVlRnVuY3Rpb24gKDo6REVGSV9GUkVFX0ZVTkNUSU9OIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0RnJlZUZ1bmN0aW9uKHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0TGluZU51bWJlckZ1bmN0aW9uICg6OkRFRklfTElORV9OVU1CRVJfRlVOQ1RJT04gcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRMaW5lTnVtYmVyRnVuY3Rpb24ocDApOwotfQotCi12b2lkIGRlZnJTZXRMb25nTGluZU51bWJlckZ1bmN0aW9uICg6OkRFRklfTE9OR19MSU5FX05VTUJFUl9GVU5DVElPTiBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldExvbmdMaW5lTnVtYmVyRnVuY3Rpb24ocDApOwotfQotCi12b2lkIGRlZnJTZXREZWx0YU51bWJlckxpbmVzIChpbnQgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXREZWx0YU51bWJlckxpbmVzKHAwKTsKLX0KLQotdm9pZCBkZWZyU2V0UmVhZEZ1bmN0aW9uICg6OkRFRklfUkVBRF9GVU5DVElPTiBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldFJlYWRGdW5jdGlvbihwMCk7Ci19Ci0KLXZvaWQgZGVmclVuc2V0UmVhZEZ1bmN0aW9uICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJVbnNldFJlYWRGdW5jdGlvbigpOwotfQotCi12b2lkIGRlZnJTZXRPcGVuTG9nRmlsZUFwcGVuZCAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0T3BlbkxvZ0ZpbGVBcHBlbmQoKTsKLX0KLQotdm9pZCBkZWZyVW5zZXRPcGVuTG9nRmlsZUFwcGVuZCAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyVW5zZXRPcGVuTG9nRmlsZUFwcGVuZCgpOwotfQotCi12b2lkIGRlZnJTZXRNYWdpY0NvbW1lbnRGb3VuZEZ1bmN0aW9uICg6OkRFRklfTUFHSUNfQ09NTUVOVF9GT1VORF9GVU5DVElPTiBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldE1hZ2ljQ29tbWVudEZvdW5kRnVuY3Rpb24ocDApOwotfQotCi12b2lkIGRlZnJTZXRNYWdpY0NvbW1lbnRTdHJpbmcgKGNoYXIgKiBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldE1hZ2ljQ29tbWVudFN0cmluZyhwMCk7Ci19Ci0KLXZvaWQgZGVmckRpc2FibGVQcm9wU3RyUHJvY2VzcyAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyRGlzYWJsZVByb3BTdHJQcm9jZXNzKCk7Ci19Ci0KLXZvaWQgZGVmclNldE5MaW5lcyAobG9uZyBsb25nICBuKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0TkxpbmVzKG4pOwotfQotCi12b2lkIGRlZnJTZXRBc3NlcnRpb25XYXJuaW5ncyAoaW50ICB3YXJuKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0QXNzZXJ0aW9uV2FybmluZ3Mod2Fybik7Ci19Ci0KLXZvaWQgZGVmclNldEJsb2NrYWdlV2FybmluZ3MgKGludCAgd2FybikgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldEJsb2NrYWdlV2FybmluZ3Mod2Fybik7Ci19Ci0KLXZvaWQgZGVmclNldENhc2VTZW5zaXRpdmVXYXJuaW5ncyAoaW50ICB3YXJuKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0Q2FzZVNlbnNpdGl2ZVdhcm5pbmdzKHdhcm4pOwotfQotCi12b2lkIGRlZnJTZXRDb21wb25lbnRXYXJuaW5ncyAoaW50ICB3YXJuKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0Q29tcG9uZW50V2FybmluZ3Mod2Fybik7Ci19Ci0KLXZvaWQgZGVmclNldENvbnN0cmFpbnRXYXJuaW5ncyAoaW50ICB3YXJuKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0Q29uc3RyYWludFdhcm5pbmdzKHdhcm4pOwotfQotCi12b2lkIGRlZnJTZXREZWZhdWx0Q2FwV2FybmluZ3MgKGludCAgd2FybikgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldERlZmF1bHRDYXBXYXJuaW5ncyh3YXJuKTsKLX0KLQotdm9pZCBkZWZyU2V0R2NlbGxHcmlkV2FybmluZ3MgKGludCAgd2FybikgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldEdjZWxsR3JpZFdhcm5pbmdzKHdhcm4pOwotfQotCi12b2lkIGRlZnJTZXRJT1RpbWluZ1dhcm5pbmdzIChpbnQgIHdhcm4pIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRJT1RpbWluZ1dhcm5pbmdzKHdhcm4pOwotfQotCi12b2lkIGRlZnJTZXROZXRXYXJuaW5ncyAoaW50ICB3YXJuKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0TmV0V2FybmluZ3Mod2Fybik7Ci19Ci0KLXZvaWQgZGVmclNldE5vbkRlZmF1bHRXYXJuaW5ncyAoaW50ICB3YXJuKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0Tm9uRGVmYXVsdFdhcm5pbmdzKHdhcm4pOwotfQotCi12b2lkIGRlZnJTZXRQaW5FeHRXYXJuaW5ncyAoaW50ICB3YXJuKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0UGluRXh0V2FybmluZ3Mod2Fybik7Ci19Ci0KLXZvaWQgZGVmclNldFBpbldhcm5pbmdzIChpbnQgIHdhcm4pIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRQaW5XYXJuaW5ncyh3YXJuKTsKLX0KLQotdm9pZCBkZWZyU2V0UmVnaW9uV2FybmluZ3MgKGludCAgd2FybikgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldFJlZ2lvbldhcm5pbmdzKHdhcm4pOwotfQotCi12b2lkIGRlZnJTZXRSb3dXYXJuaW5ncyAoaW50ICB3YXJuKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0Um93V2FybmluZ3Mod2Fybik7Ci19Ci0KLXZvaWQgZGVmclNldFNjYW5jaGFpbldhcm5pbmdzIChpbnQgIHdhcm4pIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRTY2FuY2hhaW5XYXJuaW5ncyh3YXJuKTsKLX0KLQotdm9pZCBkZWZyU2V0U05ldFdhcm5pbmdzIChpbnQgIHdhcm4pIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRTTmV0V2FybmluZ3Mod2Fybik7Ci19Ci0KLXZvaWQgZGVmclNldFN0eWxlc1dhcm5pbmdzIChpbnQgIHdhcm4pIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRTdHlsZXNXYXJuaW5ncyh3YXJuKTsKLX0KLQotdm9pZCBkZWZyU2V0VHJhY2tXYXJuaW5ncyAoaW50ICB3YXJuKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0VHJhY2tXYXJuaW5ncyh3YXJuKTsKLX0KLQotdm9pZCBkZWZyU2V0VW5pdHNXYXJuaW5ncyAoaW50ICB3YXJuKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZyU2V0VW5pdHNXYXJuaW5ncyh3YXJuKTsKLX0KLQotdm9pZCBkZWZyU2V0VmVyc2lvbldhcm5pbmdzIChpbnQgIHdhcm4pIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRWZXJzaW9uV2FybmluZ3Mod2Fybik7Ci19Ci0KLXZvaWQgZGVmclNldFZpYVdhcm5pbmdzIChpbnQgIHdhcm4pIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJTZXRWaWFXYXJuaW5ncyh3YXJuKTsKLX0KLQotdm9pZCBkZWZyRGlzYWJsZVBhcnNlck1zZ3MgKGludCAgbk1zZywgaW50KiAgbXNncykgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmckRpc2FibGVQYXJzZXJNc2dzKG5Nc2csIG1zZ3MpOwotfQotCi12b2lkIGRlZnJFbmFibGVQYXJzZXJNc2dzIChpbnQgIG5Nc2csIGludCogIG1zZ3MpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJFbmFibGVQYXJzZXJNc2dzKG5Nc2csIG1zZ3MpOwotfQotCi12b2lkIGRlZnJFbmFibGVBbGxNc2dzICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZnJFbmFibGVBbGxNc2dzKCk7Ci19Ci0KLXZvaWQgZGVmclNldFRvdGFsTXNnTGltaXQgKGludCAgdG90TnVtTXNncykgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldFRvdGFsTXNnTGltaXQodG90TnVtTXNncyk7Ci19Ci0KLXZvaWQgZGVmclNldExpbWl0UGVyTXNnIChpbnQgIG1zZ0lkLCBpbnQgIG51bU1zZykgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmclNldExpbWl0UGVyTXNnKG1zZ0lkLCBudW1Nc2cpOwotfQotCi12b2lkIGRlZnJBZGRBbGlhcyAoY29uc3QgY2hhciogIGtleSwgY29uc3QgY2hhciogIHZhbHVlLCBpbnQgIG1hcmtlZCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmckFkZEFsaWFzKGtleSwgdmFsdWUsIG1hcmtlZCk7Ci19Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZ3V3JpdGVyLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZ3V3JpdGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzczNmE3ZS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi94ZGVmd1dyaXRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTE1ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IHh4eCAkCi0vLyAgJFJldmlzaW9uOiB4eHggJAotLy8gICREYXRlOiB4eHggJAotLy8gICRTdGF0ZTogeHh4ICQgIAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNkZWZpbmUgRVhURVJOIGV4dGVybiAiQyIKLQotI2luY2x1ZGUgImRlZndXcml0ZXIuaCIKLSNpbmNsdWRlICJkZWZ3V3JpdGVyLmhwcCIKLQotLy8gV3JhcHBlcnMgZGVmaW5pdGlvbnMuCi1pbnQgZGVmd05ld0xpbmUgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndOZXdMaW5lKCk7Ci19Ci0KLWludCBkZWZ3SW5pdCAoRklMRSogIGYsIGludCAgdmVyczEsIGludCAgdmVyc2lvbjIsIGNvbnN0IGNoYXIqICBjYXNlU2Vuc2l0aXZlLCBjb25zdCBjaGFyKiAgZGl2aWRlckNoYXIsIGNvbnN0IGNoYXIqICBidXNCaXRDaGFycywgY29uc3QgY2hhciogIGRlc2lnbk5hbWUsIGNvbnN0IGNoYXIqICB0ZWNobm9sb2d5LCBjb25zdCBjaGFyKiAgYXJyYXksIGNvbnN0IGNoYXIqICBmbG9vcnBsYW4sIGRvdWJsZSAgdW5pdHMpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3SW5pdChmLCB2ZXJzMSwgdmVyc2lvbjIsIGNhc2VTZW5zaXRpdmUsIGRpdmlkZXJDaGFyLCBidXNCaXRDaGFycywgZGVzaWduTmFtZSwgdGVjaG5vbG9neSwgYXJyYXksIGZsb29ycGxhbiwgdW5pdHMpOwotfQotCi1pbnQgZGVmd0luaXRDYmsgKEZJTEUqICBmKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0luaXRDYmsoZik7Ci19Ci0KLWludCBkZWZ3VmVyc2lvbiAoaW50ICB2ZXJzMSwgaW50ICB2ZXJzMikgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndWZXJzaW9uKHZlcnMxLCB2ZXJzMik7Ci19Ci0KLWludCBkZWZ3Q2FzZVNlbnNpdGl2ZSAoY29uc3QgY2hhciogIGNhc2VTZW5zaXRpdmUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3Q2FzZVNlbnNpdGl2ZShjYXNlU2Vuc2l0aXZlKTsKLX0KLQotaW50IGRlZndCdXNCaXRDaGFycyAoY29uc3QgY2hhciogIGJ1c0JpdENoYXJzKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0J1c0JpdENoYXJzKGJ1c0JpdENoYXJzKTsKLX0KLQotaW50IGRlZndEaXZpZGVyQ2hhciAoY29uc3QgY2hhciogIGRpdmlkZXJDaGFyKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0RpdmlkZXJDaGFyKGRpdmlkZXJDaGFyKTsKLX0KLQotaW50IGRlZndEZXNpZ25OYW1lIChjb25zdCBjaGFyKiAgbmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndEZXNpZ25OYW1lKG5hbWUpOwotfQotCi1pbnQgZGVmd1RlY2hub2xvZ3kgKGNvbnN0IGNoYXIqICB0ZWNobm9sb2d5KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1RlY2hub2xvZ3kodGVjaG5vbG9neSk7Ci19Ci0KLWludCBkZWZ3QXJyYXkgKGNvbnN0IGNoYXIqICBhcnJheSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndBcnJheShhcnJheSk7Ci19Ci0KLWludCBkZWZ3Rmxvb3JwbGFuIChjb25zdCBjaGFyKiAgZmxvb3JwbGFuKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0Zsb29ycGxhbihmbG9vcnBsYW4pOwotfQotCi1pbnQgZGVmd1VuaXRzIChpbnQgIHVuaXRzKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1VuaXRzKHVuaXRzKTsKLX0KLQotaW50IGRlZndIaXN0b3J5IChjb25zdCBjaGFyKiAgc3RyaW5nKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0hpc3Rvcnkoc3RyaW5nKTsKLX0KLQotaW50IGRlZndTdGFydFByb3BEZWYgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndTdGFydFByb3BEZWYoKTsKLX0KLQotaW50IGRlZndJbnRQcm9wRGVmIChjb25zdCBjaGFyKiAgb2JqVHlwZSwgY29uc3QgY2hhciogIHByb3BOYW1lLCBkb3VibGUgIGxlZnRSYW5nZSwgZG91YmxlICByaWdodFJhbmdlLCBpbnQgICAgIHByb3BWYWx1ZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndJbnRQcm9wRGVmKG9ialR5cGUsIHByb3BOYW1lLCBsZWZ0UmFuZ2UsIHJpZ2h0UmFuZ2UsIHByb3BWYWx1ZSk7Ci19Ci0KLWludCBkZWZ3UmVhbFByb3BEZWYgKGNvbnN0IGNoYXIqICBvYmpUeXBlLCBjb25zdCBjaGFyKiAgcHJvcE5hbWUsIGRvdWJsZSAgbGVmdFJhbmdlLCBkb3VibGUgIHJpZ2h0UmFuZ2UsIGRvdWJsZSAgcHJvcFZhbHVlKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1JlYWxQcm9wRGVmKG9ialR5cGUsIHByb3BOYW1lLCBsZWZ0UmFuZ2UsIHJpZ2h0UmFuZ2UsIHByb3BWYWx1ZSk7Ci19Ci0KLWludCBkZWZ3U3RyaW5nUHJvcERlZiAoY29uc3QgY2hhciogIG9ialR5cGUsIGNvbnN0IGNoYXIqICBwcm9wTmFtZSwgZG91YmxlICBsZWZ0UmFuZ2UsIGRvdWJsZSAgcmlnaHRSYW5nZSwgY29uc3QgY2hhciogIHByb3BWYWx1ZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndTdHJpbmdQcm9wRGVmKG9ialR5cGUsIHByb3BOYW1lLCBsZWZ0UmFuZ2UsIHJpZ2h0UmFuZ2UsIHByb3BWYWx1ZSk7Ci19Ci0KLWludCBkZWZ3RW5kUHJvcERlZiAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0VuZFByb3BEZWYoKTsKLX0KLQotaW50IGRlZndTdHJpbmdQcm9wZXJ0eSAoY29uc3QgY2hhciogIHByb3BOYW1lLCBjb25zdCBjaGFyKiAgcHJvcFZhbHVlKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1N0cmluZ1Byb3BlcnR5KHByb3BOYW1lLCBwcm9wVmFsdWUpOwotfQotCi1pbnQgZGVmd1JlYWxQcm9wZXJ0eSAoY29uc3QgY2hhciogIHByb3BOYW1lLCBkb3VibGUgIHByb3BWYWx1ZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndSZWFsUHJvcGVydHkocHJvcE5hbWUsIHByb3BWYWx1ZSk7Ci19Ci0KLWludCBkZWZ3SW50UHJvcGVydHkgKGNvbnN0IGNoYXIqICBwcm9wTmFtZSwgaW50ICBwcm9wVmFsdWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3SW50UHJvcGVydHkocHJvcE5hbWUsIHByb3BWYWx1ZSk7Ci19Ci0KLWludCBkZWZ3RGllQXJlYSAoaW50ICB4bCwgaW50ICB5bCwgaW50ICB4aCwgaW50ICB5aCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndEaWVBcmVhKHhsLCB5bCwgeGgsIHloKTsKLX0KLQotaW50IGRlZndEaWVBcmVhTGlzdCAoaW50ICBudW1fcG9pbnRzLCBpbnQqICB4bCwgaW50KiAgeWgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3RGllQXJlYUxpc3QobnVtX3BvaW50cywgeGwsIHloKTsKLX0KLQotaW50IGRlZndSb3cgKGNvbnN0IGNoYXIqICByb3dOYW1lLCBjb25zdCBjaGFyKiAgcm93VHlwZSwgaW50ICB4X29yaWcsIGludCAgeV9vcmlnLCBpbnQgIG9yaWVudCwgaW50ICBkb19jb3VudCwgaW50ICBkb19pbmNyZW1lbnQsIGludCAgeHN0ZXAsIGludCAgeXN0ZXApIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3Um93KHJvd05hbWUsIHJvd1R5cGUsIHhfb3JpZywgeV9vcmlnLCBvcmllbnQsIGRvX2NvdW50LCBkb19pbmNyZW1lbnQsIHhzdGVwLCB5c3RlcCk7Ci19Ci0KLWludCBkZWZ3Um93U3RyIChjb25zdCBjaGFyKiAgcm93TmFtZSwgY29uc3QgY2hhciogIHJvd1R5cGUsIGludCAgeF9vcmlnLCBpbnQgIHlfb3JpZywgY29uc3QgY2hhciogIG9yaWVudCwgaW50ICBkb19jb3VudCwgaW50ICBkb19pbmNyZW1lbnQsIGludCAgeHN0ZXAsIGludCAgeXN0ZXApIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3Um93U3RyKHJvd05hbWUsIHJvd1R5cGUsIHhfb3JpZywgeV9vcmlnLCBvcmllbnQsIGRvX2NvdW50LCBkb19pbmNyZW1lbnQsIHhzdGVwLCB5c3RlcCk7Ci19Ci0KLWludCBkZWZ3VHJhY2tzIChjb25zdCBjaGFyKiAgbWFzdGVyLCBpbnQgIGRvU3RhcnQsIGludCAgZG9Db3VudCwgaW50ICBkb1N0ZXAsIGludCAgbnVtTGF5ZXJzLCBjb25zdCBjaGFyKiogIGxheWVycywgaW50ICBtYXNrLCBpbnQgIHNhbWVNYXNrKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1RyYWNrcyhtYXN0ZXIsIGRvU3RhcnQsIGRvQ291bnQsIGRvU3RlcCwgbnVtTGF5ZXJzLCBsYXllcnMsIG1hc2ssIHNhbWVNYXNrKTsKLX0KLQotaW50IGRlZndHY2VsbEdyaWQgKGNvbnN0IGNoYXIqICBtYXN0ZXIsIGludCAgZG9TdGFydCwgaW50ICBkb0NvdW50LCBpbnQgIGRvU3RlcCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndHY2VsbEdyaWQobWFzdGVyLCBkb1N0YXJ0LCBkb0NvdW50LCBkb1N0ZXApOwotfQotCi1pbnQgZGVmd1N0YXJ0RGVmYXVsdENhcCAoaW50ICBjb3VudCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndTdGFydERlZmF1bHRDYXAoY291bnQpOwotfQotCi1pbnQgZGVmd0RlZmF1bHRDYXAgKGludCAgcGlucywgZG91YmxlICBjYXApIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3RGVmYXVsdENhcChwaW5zLCBjYXApOwotfQotCi1pbnQgZGVmd0VuZERlZmF1bHRDYXAgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndFbmREZWZhdWx0Q2FwKCk7Ci19Ci0KLWludCBkZWZ3Q2FuUGxhY2UgKGNvbnN0IGNoYXIqICBtYXN0ZXIsIGludCAgeE9yaWcsIGludCAgeU9yaWcsIGludCAgb3JpZW50LCBpbnQgIGRvQ250LCBpbnQgIGRvSW5jLCBpbnQgIHhTdGVwLCBpbnQgIHlTdGVwKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0NhblBsYWNlKG1hc3RlciwgeE9yaWcsIHlPcmlnLCBvcmllbnQsIGRvQ250LCBkb0luYywgeFN0ZXAsIHlTdGVwKTsKLX0KLQotaW50IGRlZndDYW5QbGFjZVN0ciAoY29uc3QgY2hhciogIG1hc3RlciwgaW50ICB4T3JpZywgaW50ICB5T3JpZywgY29uc3QgY2hhciogIG9yaWVudCwgaW50ICBkb0NudCwgaW50ICBkb0luYywgaW50ICB4U3RlcCwgaW50ICB5U3RlcCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndDYW5QbGFjZVN0cihtYXN0ZXIsIHhPcmlnLCB5T3JpZywgb3JpZW50LCBkb0NudCwgZG9JbmMsIHhTdGVwLCB5U3RlcCk7Ci19Ci0KLWludCBkZWZ3Q2Fubm90T2NjdXB5IChjb25zdCBjaGFyKiAgbWFzdGVyLCBpbnQgIHhPcmlnLCBpbnQgIHlPcmlnLCBpbnQgIG9yaWVudCwgaW50ICBkb0NudCwgaW50ICBkb0luYywgaW50ICB4U3RlcCwgaW50ICB5U3RlcCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndDYW5ub3RPY2N1cHkobWFzdGVyLCB4T3JpZywgeU9yaWcsIG9yaWVudCwgZG9DbnQsIGRvSW5jLCB4U3RlcCwgeVN0ZXApOwotfQotCi1pbnQgZGVmd0Nhbm5vdE9jY3VweVN0ciAoY29uc3QgY2hhciogIG1hc3RlciwgaW50ICB4T3JpZywgaW50ICB5T3JpZywgY29uc3QgY2hhciogIG9yaWVudCwgaW50ICBkb0NudCwgaW50ICBkb0luYywgaW50ICB4U3RlcCwgaW50ICB5U3RlcCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndDYW5ub3RPY2N1cHlTdHIobWFzdGVyLCB4T3JpZywgeU9yaWcsIG9yaWVudCwgZG9DbnQsIGRvSW5jLCB4U3RlcCwgeVN0ZXApOwotfQotCi1pbnQgZGVmd1N0YXJ0VmlhcyAoaW50ICBjb3VudCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndTdGFydFZpYXMoY291bnQpOwotfQotCi1pbnQgZGVmd1ZpYU5hbWUgKGNvbnN0IGNoYXIqICBuYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1ZpYU5hbWUobmFtZSk7Ci19Ci0KLWludCBkZWZ3VmlhUGF0dGVybiAoY29uc3QgY2hhciogIHBhdHRlcm5OYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1ZpYVBhdHRlcm4ocGF0dGVybk5hbWUpOwotfQotCi1pbnQgZGVmd1ZpYVJlY3QgKGNvbnN0IGNoYXIqICBsYXllck5hbWUsIGludCAgeGwsIGludCAgeWwsIGludCAgeGgsIGludCAgeWgsIGludCAgbWFzaykgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndWaWFSZWN0KGxheWVyTmFtZSwgeGwsIHlsLCB4aCwgeWgsIG1hc2spOwotfQotCi1pbnQgZGVmd1ZpYVBvbHlnb24gKGNvbnN0IGNoYXIqICBsYXllck5hbWUsIGludCAgbnVtX3BvbHlzLCBkb3VibGUqICB4bCwgZG91YmxlKiAgeWwsIGludCAgbWFzaykgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndWaWFQb2x5Z29uKGxheWVyTmFtZSwgbnVtX3BvbHlzLCB4bCwgeWwsIG1hc2spOwotfQotCi1pbnQgZGVmd1ZpYVZpYXJ1bGUgKGNvbnN0IGNoYXIqICB2aWFSdWxlTmFtZSwgZG91YmxlICB4Q3V0U2l6ZSwgZG91YmxlICB5Q3V0U2l6ZSwgY29uc3QgY2hhciogIGJvdE1ldGFsTGF5ZXIsIGNvbnN0IGNoYXIqICBjdXRMYXllciwgY29uc3QgY2hhciogIHRvcE1ldGFsTGF5ZXIsIGRvdWJsZSAgeEN1dFNwYWNpbmcsIGRvdWJsZSAgeUN1dFNwYWNpbmcsIGRvdWJsZSAgeEJvdEVuYywgZG91YmxlICB5Qm90RW5jLCBkb3VibGUgIHhUb3BFbmMsIGRvdWJsZSAgeVRvcEVuYykgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndWaWFWaWFydWxlKHZpYVJ1bGVOYW1lLCB4Q3V0U2l6ZSwgeUN1dFNpemUsIGJvdE1ldGFsTGF5ZXIsIGN1dExheWVyLCB0b3BNZXRhbExheWVyLCB4Q3V0U3BhY2luZywgeUN1dFNwYWNpbmcsIHhCb3RFbmMsIHlCb3RFbmMsIHhUb3BFbmMsIHlUb3BFbmMpOwotfQotCi1pbnQgZGVmd1ZpYVZpYXJ1bGVSb3dDb2wgKGludCAgbnVtQ3V0Um93cywgaW50ICBudW1DdXRDb2xzKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1ZpYVZpYXJ1bGVSb3dDb2wobnVtQ3V0Um93cywgbnVtQ3V0Q29scyk7Ci19Ci0KLWludCBkZWZ3VmlhVmlhcnVsZU9yaWdpbiAoaW50ICB4T2Zmc2V0LCBpbnQgIHlPZmZzZXQpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3VmlhVmlhcnVsZU9yaWdpbih4T2Zmc2V0LCB5T2Zmc2V0KTsKLX0KLQotaW50IGRlZndWaWFWaWFydWxlT2Zmc2V0IChpbnQgIHhCb3RPZmZzZXQsIGludCAgeUJvdE9mZnNldCwgaW50ICB4VG9wT2Zmc2V0LCBpbnQgIHlUb3BPZmZzZXQpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3VmlhVmlhcnVsZU9mZnNldCh4Qm90T2Zmc2V0LCB5Qm90T2Zmc2V0LCB4VG9wT2Zmc2V0LCB5VG9wT2Zmc2V0KTsKLX0KLQotaW50IGRlZndWaWFWaWFydWxlUGF0dGVybiAoY29uc3QgY2hhciogIGN1dFBhdHRlcm4pIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3VmlhVmlhcnVsZVBhdHRlcm4oY3V0UGF0dGVybik7Ci19Ci0KLWludCBkZWZ3T25lVmlhRW5kICgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3T25lVmlhRW5kKCk7Ci19Ci0KLWludCBkZWZ3RW5kVmlhcyAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0VuZFZpYXMoKTsKLX0KLQotaW50IGRlZndTdGFydFJlZ2lvbnMgKGludCAgY291bnQpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3U3RhcnRSZWdpb25zKGNvdW50KTsKLX0KLQotaW50IGRlZndSZWdpb25OYW1lIChjb25zdCBjaGFyKiAgbmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndSZWdpb25OYW1lKG5hbWUpOwotfQotCi1pbnQgZGVmd1JlZ2lvblBvaW50cyAoaW50ICB4bCwgaW50ICB5bCwgaW50ICB4aCwgaW50ICB5aCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndSZWdpb25Qb2ludHMoeGwsIHlsLCB4aCwgeWgpOwotfQotCi1pbnQgZGVmd1JlZ2lvblR5cGUgKGNvbnN0IGNoYXIqICB0eXBlKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1JlZ2lvblR5cGUodHlwZSk7Ci19Ci0KLWludCBkZWZ3RW5kUmVnaW9ucyAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0VuZFJlZ2lvbnMoKTsKLX0KLQotaW50IGRlZndDb21wb25lbnRNYXNrU2hpZnRMYXllcnMgKGNvbnN0IGNoYXIqKiAgbGF5ZXJOYW1lcywgaW50ICAgICAgICAgICBudW1MYXllck5hbWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3Q29tcG9uZW50TWFza1NoaWZ0TGF5ZXJzKGxheWVyTmFtZXMsIG51bUxheWVyTmFtZSk7Ci19Ci0KLWludCBkZWZ3U3RhcnRDb21wb25lbnRzIChpbnQgIGNvdW50KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1N0YXJ0Q29tcG9uZW50cyhjb3VudCk7Ci19Ci0KLWludCBkZWZ3Q29tcG9uZW50IChjb25zdCBjaGFyKiAgaW5zdGFuY2UsIGNvbnN0IGNoYXIqICBtYXN0ZXIsIGludCAgICBudW1OZXROYW1lLCBjb25zdCBjaGFyKiogIG5ldE5hbWVzLCBjb25zdCBjaGFyKiAgZWVxLCBjb25zdCBjaGFyKiAgZ2VuTmFtZSwgY29uc3QgY2hhciogIGdlblBhcmVtZXRlcnMsIGNvbnN0IGNoYXIqICBzb3VyY2UsIGludCAgbnVtRm9yZWlnbiwgY29uc3QgY2hhcioqICBmb3JlaWducywgaW50KiAgZm9yZWlnblgsIGludCogIGZvcmVpZ25ZLCBpbnQqICBmb3JlaWduT3JpZW50cywgY29uc3QgY2hhciogIHN0YXR1cywgaW50ICBzdGF0dXNYLCBpbnQgIHN0YXR1c1ksIGludCAgc3RhdHVzT3JpZW50LCBkb3VibGUgIHdlaWdodCwgY29uc3QgY2hhciogIHJlZ2lvbiwgaW50ICB4bCwgaW50ICB5bCwgaW50ICB4aCwgaW50ICB5aCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndDb21wb25lbnQoaW5zdGFuY2UsIG1hc3RlciwgbnVtTmV0TmFtZSwgbmV0TmFtZXMsIGVlcSwgZ2VuTmFtZSwgZ2VuUGFyZW1ldGVycywgc291cmNlLCBudW1Gb3JlaWduLCBmb3JlaWducywgZm9yZWlnblgsIGZvcmVpZ25ZLCBmb3JlaWduT3JpZW50cywgc3RhdHVzLCBzdGF0dXNYLCBzdGF0dXNZLCBzdGF0dXNPcmllbnQsIHdlaWdodCwgcmVnaW9uLCB4bCwgeWwsIHhoLCB5aCk7Ci19Ci0KLWludCBkZWZ3Q29tcG9uZW50U3RyIChjb25zdCBjaGFyKiAgaW5zdGFuY2UsIGNvbnN0IGNoYXIqICBtYXN0ZXIsIGludCAgICBudW1OZXROYW1lLCBjb25zdCBjaGFyKiogIG5ldE5hbWVzLCBjb25zdCBjaGFyKiAgZWVxLCBjb25zdCBjaGFyKiAgZ2VuTmFtZSwgY29uc3QgY2hhciogIGdlblBhcmVtZXRlcnMsIGNvbnN0IGNoYXIqICBzb3VyY2UsIGludCAgbnVtRm9yZWlnbiwgY29uc3QgY2hhcioqICBmb3JlaWducywgaW50KiAgZm9yZWlnblgsIGludCogIGZvcmVpZ25ZLCBjb25zdCBjaGFyKiogIGZvcmVpZ25PcmllbnRzLCBjb25zdCBjaGFyKiAgc3RhdHVzLCBpbnQgIHN0YXR1c1gsIGludCAgc3RhdHVzWSwgY29uc3QgY2hhciogIHN0YXR1c09yaWVudCwgZG91YmxlICB3ZWlnaHQsIGNvbnN0IGNoYXIqICByZWdpb24sIGludCAgeGwsIGludCAgeWwsIGludCAgeGgsIGludCAgeWgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3Q29tcG9uZW50U3RyKGluc3RhbmNlLCBtYXN0ZXIsIG51bU5ldE5hbWUsIG5ldE5hbWVzLCBlZXEsIGdlbk5hbWUsIGdlblBhcmVtZXRlcnMsIHNvdXJjZSwgbnVtRm9yZWlnbiwgZm9yZWlnbnMsIGZvcmVpZ25YLCBmb3JlaWduWSwgZm9yZWlnbk9yaWVudHMsIHN0YXR1cywgc3RhdHVzWCwgc3RhdHVzWSwgc3RhdHVzT3JpZW50LCB3ZWlnaHQsIHJlZ2lvbiwgeGwsIHlsLCB4aCwgeWgpOwotfQotCi1pbnQgZGVmd0NvbXBvbmVudE1hc2tTaGlmdCAoaW50ICBzaGlmdExheWVyTWFza3MpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3Q29tcG9uZW50TWFza1NoaWZ0KHNoaWZ0TGF5ZXJNYXNrcyk7Ci19Ci0KLWludCBkZWZ3Q29tcG9uZW50SGFsbyAoaW50ICBsZWZ0LCBpbnQgIGJvdHRvbSwgaW50ICByaWdodCwgaW50ICB0b3ApIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3Q29tcG9uZW50SGFsbyhsZWZ0LCBib3R0b20sIHJpZ2h0LCB0b3ApOwotfQotCi1pbnQgZGVmd0NvbXBvbmVudEhhbG9Tb2Z0IChpbnQgIGxlZnQsIGludCAgYm90dG9tLCBpbnQgIHJpZ2h0LCBpbnQgIHRvcCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndDb21wb25lbnRIYWxvU29mdChsZWZ0LCBib3R0b20sIHJpZ2h0LCB0b3ApOwotfQotCi1pbnQgZGVmd0NvbXBvbmVudFJvdXRlSGFsbyAoaW50ICBoYWxvRGlzdCwgY29uc3QgY2hhciogIG1pbkxheWVyLCBjb25zdCBjaGFyKiAgbWF4TGF5ZXIpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3Q29tcG9uZW50Um91dGVIYWxvKGhhbG9EaXN0LCBtaW5MYXllciwgbWF4TGF5ZXIpOwotfQotCi1pbnQgZGVmd0VuZENvbXBvbmVudHMgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndFbmRDb21wb25lbnRzKCk7Ci19Ci0KLWludCBkZWZ3U3RhcnRQaW5zIChpbnQgIGNvdW50KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1N0YXJ0UGlucyhjb3VudCk7Ci19Ci0KLWludCBkZWZ3UGluIChjb25zdCBjaGFyKiAgbmFtZSwgY29uc3QgY2hhciogIG5ldCwgaW50ICBzcGVjaWFsLCBjb25zdCBjaGFyKiAgZGlyZWN0aW9uLCBjb25zdCBjaGFyKiAgdXNlLCBjb25zdCBjaGFyKiAgc3RhdHVzLCBpbnQgIHN0YXR1c1gsIGludCAgc3RhdHVzWSwgaW50ICBvcmllbnQsIGNvbnN0IGNoYXIqICBsYXllciwgaW50ICB4bCwgaW50ICB5bCwgaW50ICB4aCwgaW50ICB5aCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndQaW4obmFtZSwgbmV0LCBzcGVjaWFsLCBkaXJlY3Rpb24sIHVzZSwgc3RhdHVzLCBzdGF0dXNYLCBzdGF0dXNZLCBvcmllbnQsIGxheWVyLCB4bCwgeWwsIHhoLCB5aCk7Ci19Ci0KLWludCBkZWZ3UGluU3RyIChjb25zdCBjaGFyKiAgbmFtZSwgY29uc3QgY2hhciogIG5ldCwgaW50ICBzcGVjaWFsLCBjb25zdCBjaGFyKiAgZGlyZWN0aW9uLCBjb25zdCBjaGFyKiAgdXNlLCBjb25zdCBjaGFyKiAgc3RhdHVzLCBpbnQgIHN0YXR1c1gsIGludCAgc3RhdHVzWSwgY29uc3QgY2hhciogIG9yaWVudCwgY29uc3QgY2hhciogIGxheWVyLCBpbnQgIHhsLCBpbnQgIHlsLCBpbnQgIHhoLCBpbnQgIHloKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1BpblN0cihuYW1lLCBuZXQsIHNwZWNpYWwsIGRpcmVjdGlvbiwgdXNlLCBzdGF0dXMsIHN0YXR1c1gsIHN0YXR1c1ksIG9yaWVudCwgbGF5ZXIsIHhsLCB5bCwgeGgsIHloKTsKLX0KLQotaW50IGRlZndQaW5MYXllciAoY29uc3QgY2hhciogIGxheWVyTmFtZSwgaW50ICBzcGFjaW5nLCBpbnQgIGRlc2lnblJ1bGVXaWR0aCwgaW50ICB4bCwgaW50ICB5bCwgaW50ICB4aCwgaW50ICB5aCwgaW50ICBtYXNrKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1BpbkxheWVyKGxheWVyTmFtZSwgc3BhY2luZywgZGVzaWduUnVsZVdpZHRoLCB4bCwgeWwsIHhoLCB5aCwgbWFzayk7Ci19Ci0KLWludCBkZWZ3UGluUG9seWdvbiAoY29uc3QgY2hhciogIGxheWVyTmFtZSwgaW50ICBzcGFjaW5nLCBpbnQgIGRlc2lnblJ1bGVXaWR0aCwgaW50ICBudW1fcG9seXMsIGRvdWJsZSogIHhsLCBkb3VibGUqICB5bCwgaW50ICBtYXNrKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1BpblBvbHlnb24obGF5ZXJOYW1lLCBzcGFjaW5nLCBkZXNpZ25SdWxlV2lkdGgsIG51bV9wb2x5cywgeGwsIHlsLCBtYXNrKTsKLX0KLQotaW50IGRlZndQaW5WaWEgKGNvbnN0IGNoYXIqICB2aWFOYW1lLCBpbnQgIHhsLCBpbnQgIHlsLCBpbnQgIG1hc2spIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3UGluVmlhKHZpYU5hbWUsIHhsLCB5bCwgbWFzayk7Ci19Ci0KLWludCBkZWZ3UGluUG9ydCAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1BpblBvcnQoKTsKLX0KLQotaW50IGRlZndQaW5Qb3J0TGF5ZXIgKGNvbnN0IGNoYXIqICBsYXllck5hbWUsIGludCAgc3BhY2luZywgaW50ICBkZXNpZ25SdWxlV2lkdGgsIGludCAgeGwsIGludCAgeWwsIGludCAgeGgsIGludCAgeWgsIGludCAgbWFzaykgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndQaW5Qb3J0TGF5ZXIobGF5ZXJOYW1lLCBzcGFjaW5nLCBkZXNpZ25SdWxlV2lkdGgsIHhsLCB5bCwgeGgsIHloLCBtYXNrKTsKLX0KLQotaW50IGRlZndQaW5Qb3J0UG9seWdvbiAoY29uc3QgY2hhciogIGxheWVyTmFtZSwgaW50ICBzcGFjaW5nLCBpbnQgIGRlc2lnblJ1bGVXaWR0aCwgaW50ICBudW1fcG9seXMsIGRvdWJsZSogIHhsLCBkb3VibGUqICB5bCwgaW50ICBtYXNrKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1BpblBvcnRQb2x5Z29uKGxheWVyTmFtZSwgc3BhY2luZywgZGVzaWduUnVsZVdpZHRoLCBudW1fcG9seXMsIHhsLCB5bCwgbWFzayk7Ci19Ci0KLWludCBkZWZ3UGluUG9ydFZpYSAoY29uc3QgY2hhciogIHZpYU5hbWUsIGludCAgeGwsIGludCAgeWwsIGludCAgbWFzaykgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndQaW5Qb3J0VmlhKHZpYU5hbWUsIHhsLCB5bCwgbWFzayk7Ci19Ci0KLWludCBkZWZ3UGluUG9ydExvY2F0aW9uIChjb25zdCBjaGFyKiAgc3RhdHVzLCBpbnQgIHN0YXR1c1gsIGludCAgc3RhdHVzWSwgY29uc3QgY2hhciogIG9yaWVudCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndQaW5Qb3J0TG9jYXRpb24oc3RhdHVzLCBzdGF0dXNYLCBzdGF0dXNZLCBvcmllbnQpOwotfQotCi1pbnQgZGVmd1Bpbk5ldEV4cHIgKGNvbnN0IGNoYXIqICBwaW5FeHByKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1Bpbk5ldEV4cHIocGluRXhwcik7Ci19Ci0KLWludCBkZWZ3UGluU3VwcGx5U2Vuc2l0aXZpdHkgKGNvbnN0IGNoYXIqICBwaW5OYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1BpblN1cHBseVNlbnNpdGl2aXR5KHBpbk5hbWUpOwotfQotCi1pbnQgZGVmd1Bpbkdyb3VuZFNlbnNpdGl2aXR5IChjb25zdCBjaGFyKiAgcGluTmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndQaW5Hcm91bmRTZW5zaXRpdml0eShwaW5OYW1lKTsKLX0KLQotaW50IGRlZndQaW5BbnRlbm5hUGluUGFydGlhbE1ldGFsQXJlYSAoaW50ICB2YWx1ZSwgY29uc3QgY2hhciogIGxheWVyTmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndQaW5BbnRlbm5hUGluUGFydGlhbE1ldGFsQXJlYSh2YWx1ZSwgbGF5ZXJOYW1lKTsKLX0KLQotaW50IGRlZndQaW5BbnRlbm5hUGluUGFydGlhbE1ldGFsU2lkZUFyZWEgKGludCAgdmFsdWUsIGNvbnN0IGNoYXIqICBsYXllck5hbWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3UGluQW50ZW5uYVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhKHZhbHVlLCBsYXllck5hbWUpOwotfQotCi1pbnQgZGVmd1BpbkFudGVubmFQaW5QYXJ0aWFsQ3V0QXJlYSAoaW50ICB2YWx1ZSwgY29uc3QgY2hhciogIGxheWVyTmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndQaW5BbnRlbm5hUGluUGFydGlhbEN1dEFyZWEodmFsdWUsIGxheWVyTmFtZSk7Ci19Ci0KLWludCBkZWZ3UGluQW50ZW5uYVBpbkRpZmZBcmVhIChpbnQgIHZhbHVlLCBjb25zdCBjaGFyKiAgbGF5ZXJOYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1BpbkFudGVubmFQaW5EaWZmQXJlYSh2YWx1ZSwgbGF5ZXJOYW1lKTsKLX0KLQotaW50IGRlZndQaW5BbnRlbm5hTW9kZWwgKGNvbnN0IGNoYXIqICBveGlkZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndQaW5BbnRlbm5hTW9kZWwob3hpZGUpOwotfQotCi1pbnQgZGVmd1BpbkFudGVubmFQaW5HYXRlQXJlYSAoaW50ICB2YWx1ZSwgY29uc3QgY2hhciogIGxheWVyTmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndQaW5BbnRlbm5hUGluR2F0ZUFyZWEodmFsdWUsIGxheWVyTmFtZSk7Ci19Ci0KLWludCBkZWZ3UGluQW50ZW5uYVBpbk1heEFyZWFDYXIgKGludCAgdmFsdWUsIGNvbnN0IGNoYXIqICBsYXllck5hbWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3UGluQW50ZW5uYVBpbk1heEFyZWFDYXIodmFsdWUsIGxheWVyTmFtZSk7Ci19Ci0KLWludCBkZWZ3UGluQW50ZW5uYVBpbk1heFNpZGVBcmVhQ2FyIChpbnQgIHZhbHVlLCBjb25zdCBjaGFyKiAgbGF5ZXJOYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1BpbkFudGVubmFQaW5NYXhTaWRlQXJlYUNhcih2YWx1ZSwgbGF5ZXJOYW1lKTsKLX0KLQotaW50IGRlZndQaW5BbnRlbm5hUGluTWF4Q3V0Q2FyIChpbnQgIHZhbHVlLCBjb25zdCBjaGFyKiAgbGF5ZXJOYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1BpbkFudGVubmFQaW5NYXhDdXRDYXIodmFsdWUsIGxheWVyTmFtZSk7Ci19Ci0KLWludCBkZWZ3RW5kUGlucyAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0VuZFBpbnMoKTsKLX0KLQotaW50IGRlZndTdGFydFBpblByb3BlcnRpZXMgKGludCAgY291bnQpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3U3RhcnRQaW5Qcm9wZXJ0aWVzKGNvdW50KTsKLX0KLQotaW50IGRlZndQaW5Qcm9wZXJ0eSAoY29uc3QgY2hhciogIG5hbWUsIGNvbnN0IGNoYXIqICBwaW5OYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1BpblByb3BlcnR5KG5hbWUsIHBpbk5hbWUpOwotfQotCi1pbnQgZGVmd0VuZFBpblByb3BlcnRpZXMgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndFbmRQaW5Qcm9wZXJ0aWVzKCk7Ci19Ci0KLWludCBkZWZ3U3RhcnRTcGVjaWFsTmV0cyAoaW50ICBjb3VudCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndTdGFydFNwZWNpYWxOZXRzKGNvdW50KTsKLX0KLQotaW50IGRlZndTcGVjaWFsTmV0IChjb25zdCBjaGFyKiAgbmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndTcGVjaWFsTmV0KG5hbWUpOwotfQotCi1pbnQgZGVmd1NwZWNpYWxOZXRDb25uZWN0aW9uIChjb25zdCBjaGFyKiAgaW5zdCwgY29uc3QgY2hhciogIHBpbiwgaW50ICBzeW50aGVzaXplZCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndTcGVjaWFsTmV0Q29ubmVjdGlvbihpbnN0LCBwaW4sIHN5bnRoZXNpemVkKTsKLX0KLQotaW50IGRlZndTcGVjaWFsTmV0Rml4ZWRidW1wICgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3U3BlY2lhbE5ldEZpeGVkYnVtcCgpOwotfQotCi1pbnQgZGVmd1NwZWNpYWxOZXRWb2x0YWdlIChkb3VibGUgIHYpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3U3BlY2lhbE5ldFZvbHRhZ2Uodik7Ci19Ci0KLWludCBkZWZ3U3BlY2lhbE5ldFNwYWNpbmcgKGNvbnN0IGNoYXIqICBsYXllciwgaW50ICBzcGFjaW5nLCBkb3VibGUgIG1pbndpZHRoLCBkb3VibGUgIG1heHdpZHRoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1NwZWNpYWxOZXRTcGFjaW5nKGxheWVyLCBzcGFjaW5nLCBtaW53aWR0aCwgbWF4d2lkdGgpOwotfQotCi1pbnQgZGVmd1NwZWNpYWxOZXRXaWR0aCAoY29uc3QgY2hhciogIGxheWVyLCBpbnQgIHdpZHRoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1NwZWNpYWxOZXRXaWR0aChsYXllciwgd2lkdGgpOwotfQotCi1pbnQgZGVmd1NwZWNpYWxOZXRTb3VyY2UgKGNvbnN0IGNoYXIqICBuYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1NwZWNpYWxOZXRTb3VyY2UobmFtZSk7Ci19Ci0KLWludCBkZWZ3U3BlY2lhbE5ldE9yaWdpbmFsIChjb25zdCBjaGFyKiAgbmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndTcGVjaWFsTmV0T3JpZ2luYWwobmFtZSk7Ci19Ci0KLWludCBkZWZ3U3BlY2lhbE5ldFBhdHRlcm4gKGNvbnN0IGNoYXIqICBuYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1NwZWNpYWxOZXRQYXR0ZXJuKG5hbWUpOwotfQotCi1pbnQgZGVmd1NwZWNpYWxOZXRVc2UgKGNvbnN0IGNoYXIqICBuYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1NwZWNpYWxOZXRVc2UobmFtZSk7Ci19Ci0KLWludCBkZWZ3U3BlY2lhbE5ldFdlaWdodCAoZG91YmxlICB2YWx1ZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndTcGVjaWFsTmV0V2VpZ2h0KHZhbHVlKTsKLX0KLQotaW50IGRlZndTcGVjaWFsTmV0RXN0Q2FwIChkb3VibGUgIHZhbHVlKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1NwZWNpYWxOZXRFc3RDYXAodmFsdWUpOwotfQotCi1pbnQgZGVmd1NwZWNpYWxOZXRQYXRoU3RhcnQgKGNvbnN0IGNoYXIqICB0eXApIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3U3BlY2lhbE5ldFBhdGhTdGFydCh0eXApOwotfQotCi1pbnQgZGVmd1NwZWNpYWxOZXRTaGllbGROZXROYW1lIChjb25zdCBjaGFyKiAgbmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndTcGVjaWFsTmV0U2hpZWxkTmV0TmFtZShuYW1lKTsKLX0KLQotaW50IGRlZndTcGVjaWFsTmV0UGF0aExheWVyIChjb25zdCBjaGFyKiAgbmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndTcGVjaWFsTmV0UGF0aExheWVyKG5hbWUpOwotfQotCi1pbnQgZGVmd1NwZWNpYWxOZXRQYXRoV2lkdGggKGludCAgd2lkdGgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3U3BlY2lhbE5ldFBhdGhXaWR0aCh3aWR0aCk7Ci19Ci0KLWludCBkZWZ3U3BlY2lhbE5ldFBhdGhTdHlsZSAoaW50ICBzdHlsZU51bSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndTcGVjaWFsTmV0UGF0aFN0eWxlKHN0eWxlTnVtKTsKLX0KLQotaW50IGRlZndTcGVjaWFsTmV0UGF0aFNoYXBlIChjb25zdCBjaGFyKiAgc2hhcGVUeXBlKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1NwZWNpYWxOZXRQYXRoU2hhcGUoc2hhcGVUeXBlKTsKLX0KLQotaW50IGRlZndTcGVjaWFsTmV0UGF0aE1hc2sgKGludCAgY29sb3JNYXNrKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1NwZWNpYWxOZXRQYXRoTWFzayhjb2xvck1hc2spOwotfQotCi1pbnQgZGVmd1NwZWNpYWxOZXRQYXRoUG9pbnQgKGludCAgbnVtUHRzLCBkb3VibGUqICBwb2ludHgsIGRvdWJsZSogIHBvaW50eSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndTcGVjaWFsTmV0UGF0aFBvaW50KG51bVB0cywgcG9pbnR4LCBwb2ludHkpOwotfQotCi1pbnQgZGVmd1NwZWNpYWxOZXRQYXRoVmlhIChjb25zdCBjaGFyKiAgbmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndTcGVjaWFsTmV0UGF0aFZpYShuYW1lKTsKLX0KLQotaW50IGRlZndTcGVjaWFsTmV0UGF0aFZpYURhdGEgKGludCAgbnVtWCwgaW50ICBudW1ZLCBpbnQgIHN0ZXBYLCBpbnQgIHN0ZXBZKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1NwZWNpYWxOZXRQYXRoVmlhRGF0YShudW1YLCBudW1ZLCBzdGVwWCwgc3RlcFkpOwotfQotCi1pbnQgZGVmd1NwZWNpYWxOZXRQYXRoUG9pbnRXaXRoV2lyZUV4dCAoaW50ICBudW1QdHMsIGRvdWJsZSogIHBvaW50eCwgZG91YmxlKiAgcG9pbnR5LCBkb3VibGUqICBvcHRWYWx1ZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndTcGVjaWFsTmV0UGF0aFBvaW50V2l0aFdpcmVFeHQobnVtUHRzLCBwb2ludHgsIHBvaW50eSwgb3B0VmFsdWUpOwotfQotCi1pbnQgZGVmd1NwZWNpYWxOZXRQYXRoRW5kICgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3U3BlY2lhbE5ldFBhdGhFbmQoKTsKLX0KLQotaW50IGRlZndTcGVjaWFsTmV0UG9seWdvbiAoY29uc3QgY2hhciogIGxheWVyTmFtZSwgaW50ICBudW1fcG9seXMsIGRvdWJsZSogIHhsLCBkb3VibGUqICB5bCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndTcGVjaWFsTmV0UG9seWdvbihsYXllck5hbWUsIG51bV9wb2x5cywgeGwsIHlsKTsKLX0KLQotaW50IGRlZndTcGVjaWFsTmV0UmVjdCAoY29uc3QgY2hhciogIGxheWVyTmFtZSwgaW50ICB4bCwgaW50ICB5bCwgaW50ICB4aCwgaW50ICB5aCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndTcGVjaWFsTmV0UmVjdChsYXllck5hbWUsIHhsLCB5bCwgeGgsIHloKTsKLX0KLQotaW50IGRlZndTcGVjaWFsTmV0VmlhIChjb25zdCBjaGFyKiAgbGF5ZXJOYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1NwZWNpYWxOZXRWaWEobGF5ZXJOYW1lKTsKLX0KLQotaW50IGRlZndTcGVjaWFsTmV0VmlhV2l0aE9yaWVudCAoY29uc3QgY2hhciogIGxheWVyTmFtZSwgaW50ICBvcmllbnQpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3U3BlY2lhbE5ldFZpYVdpdGhPcmllbnQobGF5ZXJOYW1lLCBvcmllbnQpOwotfQotCi1pbnQgZGVmd1NwZWNpYWxOZXRWaWFQb2ludHMgKGludCAgbnVtX3BvaW50cywgZG91YmxlKiAgeGwsIGRvdWJsZSogIHlsKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1NwZWNpYWxOZXRWaWFQb2ludHMobnVtX3BvaW50cywgeGwsIHlsKTsKLX0KLQotaW50IGRlZndTcGVjaWFsTmV0RW5kT25lTmV0ICgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3U3BlY2lhbE5ldEVuZE9uZU5ldCgpOwotfQotCi1pbnQgZGVmd1NwZWNpYWxOZXRTaGllbGRTdGFydCAoY29uc3QgY2hhciogIG5hbWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3U3BlY2lhbE5ldFNoaWVsZFN0YXJ0KG5hbWUpOwotfQotCi1pbnQgZGVmd1NwZWNpYWxOZXRTaGllbGRMYXllciAoY29uc3QgY2hhciogIG5hbWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3U3BlY2lhbE5ldFNoaWVsZExheWVyKG5hbWUpOwotfQotCi1pbnQgZGVmd1NwZWNpYWxOZXRTaGllbGRXaWR0aCAoaW50ICB3aWR0aCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndTcGVjaWFsTmV0U2hpZWxkV2lkdGgod2lkdGgpOwotfQotCi1pbnQgZGVmd1NwZWNpYWxOZXRTaGllbGRTaGFwZSAoY29uc3QgY2hhciogIHNoYXBlVHlwZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndTcGVjaWFsTmV0U2hpZWxkU2hhcGUoc2hhcGVUeXBlKTsKLX0KLQotaW50IGRlZndTcGVjaWFsTmV0U2hpZWxkUG9pbnQgKGludCAgbnVtUHRzLCBkb3VibGUqICBwb2ludHgsIGRvdWJsZSogIHBvaW50eSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndTcGVjaWFsTmV0U2hpZWxkUG9pbnQobnVtUHRzLCBwb2ludHgsIHBvaW50eSk7Ci19Ci0KLWludCBkZWZ3U3BlY2lhbE5ldFNoaWVsZFZpYSAoY29uc3QgY2hhciogIG5hbWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3U3BlY2lhbE5ldFNoaWVsZFZpYShuYW1lKTsKLX0KLQotaW50IGRlZndTcGVjaWFsTmV0U2hpZWxkVmlhRGF0YSAoaW50ICBudW1YLCBpbnQgIG51bVksIGludCAgc3RlcFgsIGludCAgc3RlcFkpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3U3BlY2lhbE5ldFNoaWVsZFZpYURhdGEobnVtWCwgbnVtWSwgc3RlcFgsIHN0ZXBZKTsKLX0KLQotaW50IGRlZndTcGVjaWFsTmV0U2hpZWxkRW5kICgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3U3BlY2lhbE5ldFNoaWVsZEVuZCgpOwotfQotCi1pbnQgZGVmd0VuZFNwZWNpYWxOZXRzICgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3RW5kU3BlY2lhbE5ldHMoKTsKLX0KLQotaW50IGRlZndTdGFydE5ldHMgKGludCAgY291bnQpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3U3RhcnROZXRzKGNvdW50KTsKLX0KLQotaW50IGRlZndOZXQgKGNvbnN0IGNoYXIqICBuYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd05ldChuYW1lKTsKLX0KLQotaW50IGRlZndOZXRDb25uZWN0aW9uIChjb25zdCBjaGFyKiAgaW5zdCwgY29uc3QgY2hhciogIHBpbiwgaW50ICBzeW50aGVzaXplZCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndOZXRDb25uZWN0aW9uKGluc3QsIHBpbiwgc3ludGhlc2l6ZWQpOwotfQotCi1pbnQgZGVmd05ldE11c3Rqb2luQ29ubmVjdGlvbiAoY29uc3QgY2hhciogIGluc3QsIGNvbnN0IGNoYXIqICBwaW4pIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3TmV0TXVzdGpvaW5Db25uZWN0aW9uKGluc3QsIHBpbik7Ci19Ci0KLWludCBkZWZ3TmV0VnBpbiAoY29uc3QgY2hhciogIHZwaW5OYW1lLCBjb25zdCBjaGFyKiAgbGF5ZXJOYW1lLCBpbnQgIGxheWVyWGwsIGludCAgbGF5ZXJZbCwgaW50ICBsYXllclhoLCBpbnQgIGxheWVyWWgsIGNvbnN0IGNoYXIqICBzdGF0dXMsIGludCAgc3RhdHVzWCwgaW50ICBzdGF0dXNZLCBpbnQgIG9yaWVudCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndOZXRWcGluKHZwaW5OYW1lLCBsYXllck5hbWUsIGxheWVyWGwsIGxheWVyWWwsIGxheWVyWGgsIGxheWVyWWgsIHN0YXR1cywgc3RhdHVzWCwgc3RhdHVzWSwgb3JpZW50KTsKLX0KLQotaW50IGRlZndOZXRWcGluU3RyIChjb25zdCBjaGFyKiAgdnBpbk5hbWUsIGNvbnN0IGNoYXIqICBsYXllck5hbWUsIGludCAgbGF5ZXJYbCwgaW50ICBsYXllcllsLCBpbnQgIGxheWVyWGgsIGludCAgbGF5ZXJZaCwgY29uc3QgY2hhciogIHN0YXR1cywgaW50ICBzdGF0dXNYLCBpbnQgIHN0YXR1c1ksIGNvbnN0IGNoYXIqICBvcmllbnQpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3TmV0VnBpblN0cih2cGluTmFtZSwgbGF5ZXJOYW1lLCBsYXllclhsLCBsYXllcllsLCBsYXllclhoLCBsYXllclloLCBzdGF0dXMsIHN0YXR1c1gsIHN0YXR1c1ksIG9yaWVudCk7Ci19Ci0KLWludCBkZWZ3TmV0Tm9uZGVmYXVsdFJ1bGUgKGNvbnN0IGNoYXIqICBuYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd05ldE5vbmRlZmF1bHRSdWxlKG5hbWUpOwotfQotCi1pbnQgZGVmd05ldFh0YWxrIChpbnQgIHh0YWxrKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd05ldFh0YWxrKHh0YWxrKTsKLX0KLQotaW50IGRlZndOZXRGaXhlZGJ1bXAgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndOZXRGaXhlZGJ1bXAoKTsKLX0KLQotaW50IGRlZndOZXRGcmVxdWVuY3kgKGRvdWJsZSAgZnJlcXVlbmN5KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd05ldEZyZXF1ZW5jeShmcmVxdWVuY3kpOwotfQotCi1pbnQgZGVmd05ldFNvdXJjZSAoY29uc3QgY2hhciogIG5hbWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3TmV0U291cmNlKG5hbWUpOwotfQotCi1pbnQgZGVmd05ldE9yaWdpbmFsIChjb25zdCBjaGFyKiAgbmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndOZXRPcmlnaW5hbChuYW1lKTsKLX0KLQotaW50IGRlZndOZXRVc2UgKGNvbnN0IGNoYXIqICBuYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd05ldFVzZShuYW1lKTsKLX0KLQotaW50IGRlZndOZXRQYXR0ZXJuIChjb25zdCBjaGFyKiAgbmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndOZXRQYXR0ZXJuKG5hbWUpOwotfQotCi1pbnQgZGVmd05ldEVzdENhcCAoZG91YmxlICB2YWx1ZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndOZXRFc3RDYXAodmFsdWUpOwotfQotCi1pbnQgZGVmd05ldFdlaWdodCAoZG91YmxlICB2YWx1ZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndOZXRXZWlnaHQodmFsdWUpOwotfQotCi1pbnQgZGVmd05ldFNoaWVsZG5ldCAoY29uc3QgY2hhciogIG5hbWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3TmV0U2hpZWxkbmV0KG5hbWUpOwotfQotCi1pbnQgZGVmd05ldE5vc2hpZWxkU3RhcnQgKGNvbnN0IGNoYXIqICBuYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd05ldE5vc2hpZWxkU3RhcnQobmFtZSk7Ci19Ci0KLWludCBkZWZ3TmV0Tm9zaGllbGRQb2ludCAoaW50ICBudW1QdHMsIGNvbnN0IGNoYXIqKiAgcG9pbnR4LCBjb25zdCBjaGFyKiogIHBvaW50eSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndOZXROb3NoaWVsZFBvaW50KG51bVB0cywgcG9pbnR4LCBwb2ludHkpOwotfQotCi1pbnQgZGVmd05ldE5vc2hpZWxkVmlhIChjb25zdCBjaGFyKiAgbmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndOZXROb3NoaWVsZFZpYShuYW1lKTsKLX0KLQotaW50IGRlZndOZXROb3NoaWVsZEVuZCAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd05ldE5vc2hpZWxkRW5kKCk7Ci19Ci0KLWludCBkZWZ3TmV0U3VibmV0U3RhcnQgKGNvbnN0IGNoYXIqICBuYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd05ldFN1Ym5ldFN0YXJ0KG5hbWUpOwotfQotCi1pbnQgZGVmd05ldFN1Ym5ldFBpbiAoY29uc3QgY2hhciogIGNvbXBOYW1lLCBjb25zdCBjaGFyKiAgcGluTmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndOZXRTdWJuZXRQaW4oY29tcE5hbWUsIHBpbk5hbWUpOwotfQotCi1pbnQgZGVmd05ldFN1Ym5ldEVuZCAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd05ldFN1Ym5ldEVuZCgpOwotfQotCi1pbnQgZGVmd05ldFBhdGhTdGFydCAoY29uc3QgY2hhciogIHR5cCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndOZXRQYXRoU3RhcnQodHlwKTsKLX0KLQotaW50IGRlZndOZXRQYXRoV2lkdGggKGludCAgdykgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndOZXRQYXRoV2lkdGgodyk7Ci19Ci0KLWludCBkZWZ3TmV0UGF0aExheWVyIChjb25zdCBjaGFyKiAgbmFtZSwgaW50ICBpc1RhcGVyLCBjb25zdCBjaGFyKiAgcnVsZW5hbWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3TmV0UGF0aExheWVyKG5hbWUsIGlzVGFwZXIsIHJ1bGVuYW1lKTsKLX0KLQotaW50IGRlZndOZXRQYXRoU3R5bGUgKGludCAgc3R5bGVOdW0pIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3TmV0UGF0aFN0eWxlKHN0eWxlTnVtKTsKLX0KLQotaW50IGRlZndOZXRQYXRoTWFzayAoaW50ICBtYXNrTnVtKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd05ldFBhdGhNYXNrKG1hc2tOdW0pOwotfQotCi1pbnQgZGVmd05ldFBhdGhSZWN0IChpbnQgIGRlbHRhWDEsIGludCAgZGVsdGFZMSwgaW50ICBkZWx0YVgyLCBpbnQgIGRlbHRhWTIpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3TmV0UGF0aFJlY3QoZGVsdGFYMSwgZGVsdGFZMSwgZGVsdGFYMiwgZGVsdGFZMik7Ci19Ci0KLWludCBkZWZ3TmV0UGF0aFZpcnR1YWwgKGludCAgeCwgaW50ICB5KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd05ldFBhdGhWaXJ0dWFsKHgsIHkpOwotfQotCi1pbnQgZGVmd05ldFBhdGhQb2ludCAoaW50ICBudW1QdHMsIGRvdWJsZSogIHBvaW50eCwgZG91YmxlKiAgcG9pbnR5KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd05ldFBhdGhQb2ludChudW1QdHMsIHBvaW50eCwgcG9pbnR5KTsKLX0KLQotaW50IGRlZndOZXRQYXRoUG9pbnRXaXRoRXh0IChpbnQgIG51bVB0cywgZG91YmxlKiAgcG9pbnR4LCBkb3VibGUqICBwb2ludHksIGRvdWJsZSogIG9wdFZhbHVlKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd05ldFBhdGhQb2ludFdpdGhFeHQobnVtUHRzLCBwb2ludHgsIHBvaW50eSwgb3B0VmFsdWUpOwotfQotCi1pbnQgZGVmd05ldFBhdGhWaWEgKGNvbnN0IGNoYXIqICBuYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd05ldFBhdGhWaWEobmFtZSk7Ci19Ci0KLWludCBkZWZ3TmV0UGF0aFZpYVdpdGhPcmllbnQgKGNvbnN0IGNoYXIqICBuYW1lLCBpbnQgIG9yaWVudCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndOZXRQYXRoVmlhV2l0aE9yaWVudChuYW1lLCBvcmllbnQpOwotfQotCi1pbnQgZGVmd05ldFBhdGhWaWFXaXRoT3JpZW50U3RyIChjb25zdCBjaGFyKiAgbmFtZSwgY29uc3QgY2hhciogIG9yaWVudCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndOZXRQYXRoVmlhV2l0aE9yaWVudFN0cihuYW1lLCBvcmllbnQpOwotfQotCi1pbnQgZGVmd05ldFBhdGhFbmQgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndOZXRQYXRoRW5kKCk7Ci19Ci0KLWludCBkZWZ3TmV0RW5kT25lTmV0ICgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3TmV0RW5kT25lTmV0KCk7Ci19Ci0KLWludCBkZWZ3RW5kTmV0cyAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0VuZE5ldHMoKTsKLX0KLQotaW50IGRlZndTdGFydElPVGltaW5ncyAoaW50ICBjb3VudCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndTdGFydElPVGltaW5ncyhjb3VudCk7Ci19Ci0KLWludCBkZWZ3SU9UaW1pbmcgKGNvbnN0IGNoYXIqICBpbnN0LCBjb25zdCBjaGFyKiAgcGluKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0lPVGltaW5nKGluc3QsIHBpbik7Ci19Ci0KLWludCBkZWZ3SU9UaW1pbmdWYXJpYWJsZSAoY29uc3QgY2hhciogIHJpc2VGYWxsLCBpbnQgIG51bTEsIGludCAgbnVtMikgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndJT1RpbWluZ1ZhcmlhYmxlKHJpc2VGYWxsLCBudW0xLCBudW0yKTsKLX0KLQotaW50IGRlZndJT1RpbWluZ1NsZXdyYXRlIChjb25zdCBjaGFyKiAgcmlzZUZhbGwsIGludCAgbnVtMSwgaW50ICBudW0yKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0lPVGltaW5nU2xld3JhdGUocmlzZUZhbGwsIG51bTEsIG51bTIpOwotfQotCi1pbnQgZGVmd0lPVGltaW5nRHJpdmVjZWxsIChjb25zdCBjaGFyKiAgbmFtZSwgY29uc3QgY2hhciogIGZyb21QaW4sIGNvbnN0IGNoYXIqICB0b1BpbiwgaW50ICBudW1Ecml2ZXJzKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0lPVGltaW5nRHJpdmVjZWxsKG5hbWUsIGZyb21QaW4sIHRvUGluLCBudW1Ecml2ZXJzKTsKLX0KLQotaW50IGRlZndJT1RpbWluZ0NhcGFjaXRhbmNlIChkb3VibGUgIG51bSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndJT1RpbWluZ0NhcGFjaXRhbmNlKG51bSk7Ci19Ci0KLWludCBkZWZ3RW5kSU9UaW1pbmdzICgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3RW5kSU9UaW1pbmdzKCk7Ci19Ci0KLWludCBkZWZ3U3RhcnRTY2FuY2hhaW5zIChpbnQgIGNvdW50KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1N0YXJ0U2NhbmNoYWlucyhjb3VudCk7Ci19Ci0KLWludCBkZWZ3U2NhbmNoYWluIChjb25zdCBjaGFyKiAgbmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndTY2FuY2hhaW4obmFtZSk7Ci19Ci0KLWludCBkZWZ3U2NhbmNoYWluQ29tbW9uc2NhbnBpbnMgKGNvbnN0IGNoYXIqICBpbnN0MSwgY29uc3QgY2hhciogIHBpbjEsIGNvbnN0IGNoYXIqICBpbnN0MiwgY29uc3QgY2hhciogIHBpbjIpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3U2NhbmNoYWluQ29tbW9uc2NhbnBpbnMoaW5zdDEsIHBpbjEsIGluc3QyLCBwaW4yKTsKLX0KLQotaW50IGRlZndTY2FuY2hhaW5QYXJ0aXRpb24gKGNvbnN0IGNoYXIqICBuYW1lLCBpbnQgIG1heEJpdHMpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3U2NhbmNoYWluUGFydGl0aW9uKG5hbWUsIG1heEJpdHMpOwotfQotCi1pbnQgZGVmd1NjYW5jaGFpblN0YXJ0IChjb25zdCBjaGFyKiAgaW5zdCwgY29uc3QgY2hhciogIHBpbikgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndTY2FuY2hhaW5TdGFydChpbnN0LCBwaW4pOwotfQotCi1pbnQgZGVmd1NjYW5jaGFpblN0b3AgKGNvbnN0IGNoYXIqICBpbnN0LCBjb25zdCBjaGFyKiAgcGluKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1NjYW5jaGFpblN0b3AoaW5zdCwgcGluKTsKLX0KLQotaW50IGRlZndTY2FuY2hhaW5GbG9hdGluZyAoY29uc3QgY2hhciogIG5hbWUsIGNvbnN0IGNoYXIqICBpbnN0MSwgY29uc3QgY2hhciogIHBpbjEsIGNvbnN0IGNoYXIqICBpbnN0MiwgY29uc3QgY2hhciogIHBpbjIpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3U2NhbmNoYWluRmxvYXRpbmcobmFtZSwgaW5zdDEsIHBpbjEsIGluc3QyLCBwaW4yKTsKLX0KLQotaW50IGRlZndTY2FuY2hhaW5GbG9hdGluZ0JpdHMgKGNvbnN0IGNoYXIqICBuYW1lLCBjb25zdCBjaGFyKiAgaW5zdDEsIGNvbnN0IGNoYXIqICBwaW4xLCBjb25zdCBjaGFyKiAgaW5zdDIsIGNvbnN0IGNoYXIqICBwaW4yLCBpbnQgICAgYml0cykgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndTY2FuY2hhaW5GbG9hdGluZ0JpdHMobmFtZSwgaW5zdDEsIHBpbjEsIGluc3QyLCBwaW4yLCBiaXRzKTsKLX0KLQotaW50IGRlZndTY2FuY2hhaW5PcmRlcmVkIChjb25zdCBjaGFyKiAgbmFtZTEsIGNvbnN0IGNoYXIqICBpbnN0MSwgY29uc3QgY2hhciogIHBpbjEsIGNvbnN0IGNoYXIqICBpbnN0MiwgY29uc3QgY2hhciogIHBpbjIsIGNvbnN0IGNoYXIqICBuYW1lMiwgY29uc3QgY2hhciogIGluc3QzLCBjb25zdCBjaGFyKiAgcGluMywgY29uc3QgY2hhciogIGluc3Q0LCBjb25zdCBjaGFyKiAgcGluNCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndTY2FuY2hhaW5PcmRlcmVkKG5hbWUxLCBpbnN0MSwgcGluMSwgaW5zdDIsIHBpbjIsIG5hbWUyLCBpbnN0MywgcGluMywgaW5zdDQsIHBpbjQpOwotfQotCi1pbnQgZGVmd1NjYW5jaGFpbk9yZGVyZWRCaXRzIChjb25zdCBjaGFyKiAgbmFtZTEsIGNvbnN0IGNoYXIqICBpbnN0MSwgY29uc3QgY2hhciogIHBpbjEsIGNvbnN0IGNoYXIqICBpbnN0MiwgY29uc3QgY2hhciogIHBpbjIsIGludCAgICBiaXRzMSwgY29uc3QgY2hhciogIG5hbWUyLCBjb25zdCBjaGFyKiAgaW5zdDMsIGNvbnN0IGNoYXIqICBwaW4zLCBjb25zdCBjaGFyKiAgaW5zdDQsIGNvbnN0IGNoYXIqICBwaW40LCBpbnQgICAgYml0czIpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3U2NhbmNoYWluT3JkZXJlZEJpdHMobmFtZTEsIGluc3QxLCBwaW4xLCBpbnN0MiwgcGluMiwgYml0czEsIG5hbWUyLCBpbnN0MywgcGluMywgaW5zdDQsIHBpbjQsIGJpdHMyKTsKLX0KLQotaW50IGRlZndFbmRTY2FuY2hhaW4gKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndFbmRTY2FuY2hhaW4oKTsKLX0KLQotaW50IGRlZndTdGFydENvbnN0cmFpbnRzIChpbnQgIGNvdW50KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1N0YXJ0Q29uc3RyYWludHMoY291bnQpOwotfQotCi1pbnQgZGVmd0NvbnN0cmFpbnRPcGVyYW5kICgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3Q29uc3RyYWludE9wZXJhbmQoKTsKLX0KLQotaW50IGRlZndDb25zdHJhaW50T3BlcmFuZE5ldCAoY29uc3QgY2hhciogIG5ldE5hbWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3Q29uc3RyYWludE9wZXJhbmROZXQobmV0TmFtZSk7Ci19Ci0KLWludCBkZWZ3Q29uc3RyYWludE9wZXJhbmRQYXRoIChjb25zdCBjaGFyKiAgY29tcDEsIGNvbnN0IGNoYXIqICBmcm9tUGluLCBjb25zdCBjaGFyKiAgY29tcDIsIGNvbnN0IGNoYXIqICB0b1BpbikgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndDb25zdHJhaW50T3BlcmFuZFBhdGgoY29tcDEsIGZyb21QaW4sIGNvbXAyLCB0b1Bpbik7Ci19Ci0KLWludCBkZWZ3Q29uc3RyYWludE9wZXJhbmRTdW0gKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndDb25zdHJhaW50T3BlcmFuZFN1bSgpOwotfQotCi1pbnQgZGVmd0NvbnN0cmFpbnRPcGVyYW5kU3VtRW5kICgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3Q29uc3RyYWludE9wZXJhbmRTdW1FbmQoKTsKLX0KLQotaW50IGRlZndDb25zdHJhaW50T3BlcmFuZFRpbWUgKGNvbnN0IGNoYXIqICB0aW1lVHlwZSwgaW50ICB0aW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0NvbnN0cmFpbnRPcGVyYW5kVGltZSh0aW1lVHlwZSwgdGltZSk7Ci19Ci0KLWludCBkZWZ3Q29uc3RyYWludE9wZXJhbmRFbmQgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndDb25zdHJhaW50T3BlcmFuZEVuZCgpOwotfQotCi1pbnQgZGVmd0NvbnN0cmFpbnRXaXJlZGxvZ2ljIChjb25zdCBjaGFyKiAgbmV0TmFtZSwgaW50ICBkaXN0YW5jZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndDb25zdHJhaW50V2lyZWRsb2dpYyhuZXROYW1lLCBkaXN0YW5jZSk7Ci19Ci0KLWludCBkZWZ3RW5kQ29uc3RyYWludHMgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndFbmRDb25zdHJhaW50cygpOwotfQotCi1pbnQgZGVmd1N0YXJ0R3JvdXBzIChpbnQgIGNvdW50KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1N0YXJ0R3JvdXBzKGNvdW50KTsKLX0KLQotaW50IGRlZndHcm91cCAoY29uc3QgY2hhciogIGdyb3VwTmFtZSwgaW50ICBudW1FeHByLCBjb25zdCBjaGFyKiogIGdyb3VwRXhwcikgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndHcm91cChncm91cE5hbWUsIG51bUV4cHIsIGdyb3VwRXhwcik7Ci19Ci0KLWludCBkZWZ3R3JvdXBTb2Z0IChjb25zdCBjaGFyKiAgdHlwZTEsIGRvdWJsZSAgdmFsdWUxLCBjb25zdCBjaGFyKiAgdHlwZTIsIGRvdWJsZSAgdmFsdWUyLCBjb25zdCBjaGFyKiAgdHlwZTMsIGRvdWJsZSAgdmFsdWUzKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0dyb3VwU29mdCh0eXBlMSwgdmFsdWUxLCB0eXBlMiwgdmFsdWUyLCB0eXBlMywgdmFsdWUzKTsKLX0KLQotaW50IGRlZndHcm91cFJlZ2lvbiAoaW50ICB4bCwgaW50ICB5bCwgaW50ICB4aCwgaW50ICB5aCwgY29uc3QgY2hhciogIHJlZ2lvbk5hbWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3R3JvdXBSZWdpb24oeGwsIHlsLCB4aCwgeWgsIHJlZ2lvbk5hbWUpOwotfQotCi1pbnQgZGVmd0VuZEdyb3VwcyAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0VuZEdyb3VwcygpOwotfQotCi1pbnQgZGVmd1N0YXJ0QmxvY2thZ2VzIChpbnQgIGNvdW50KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1N0YXJ0QmxvY2thZ2VzKGNvdW50KTsKLX0KLQotaW50IGRlZndCbG9ja2FnZXNMYXllciAoY29uc3QgY2hhciogIGxheWVyTmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndCbG9ja2FnZXNMYXllcihsYXllck5hbWUpOwotfQotCi1pbnQgZGVmd0Jsb2NrYWdlc0xheWVyU2xvdHMgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndCbG9ja2FnZXNMYXllclNsb3RzKCk7Ci19Ci0KLWludCBkZWZ3QmxvY2thZ2VzTGF5ZXJGaWxscyAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0Jsb2NrYWdlc0xheWVyRmlsbHMoKTsKLX0KLQotaW50IGRlZndCbG9ja2FnZXNMYXllclB1c2hkb3duICgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3QmxvY2thZ2VzTGF5ZXJQdXNoZG93bigpOwotfQotCi1pbnQgZGVmd0Jsb2NrYWdlc0xheWVyRXhjZXB0cGduZXQgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndCbG9ja2FnZXNMYXllckV4Y2VwdHBnbmV0KCk7Ci19Ci0KLWludCBkZWZ3QmxvY2thZ2VzTGF5ZXJDb21wb25lbnQgKGNvbnN0IGNoYXIqICBjb21wTmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndCbG9ja2FnZXNMYXllckNvbXBvbmVudChjb21wTmFtZSk7Ci19Ci0KLWludCBkZWZ3QmxvY2thZ2VzTGF5ZXJTcGFjaW5nIChpbnQgIG1pblNwYWNpbmcpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3QmxvY2thZ2VzTGF5ZXJTcGFjaW5nKG1pblNwYWNpbmcpOwotfQotCi1pbnQgZGVmd0Jsb2NrYWdlc0xheWVyRGVzaWduUnVsZVdpZHRoIChpbnQgIGVmZmVjdGl2ZVdpZHRoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0Jsb2NrYWdlc0xheWVyRGVzaWduUnVsZVdpZHRoKGVmZmVjdGl2ZVdpZHRoKTsKLX0KLQotaW50IGRlZndCbG9ja2FnZXNMYXllck1hc2sgKGludCAgbWFza0NvbG9yKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0Jsb2NrYWdlc0xheWVyTWFzayhtYXNrQ29sb3IpOwotfQotCi1pbnQgZGVmd0Jsb2NrYWdlTGF5ZXIgKGNvbnN0IGNoYXIqICBsYXllck5hbWUsIGNvbnN0IGNoYXIqICBjb21wTmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndCbG9ja2FnZUxheWVyKGxheWVyTmFtZSwgY29tcE5hbWUpOwotfQotCi1pbnQgZGVmd0Jsb2NrYWdlTGF5ZXJTbG90cyAoY29uc3QgY2hhciogIGxheWVyTmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndCbG9ja2FnZUxheWVyU2xvdHMobGF5ZXJOYW1lKTsKLX0KLQotaW50IGRlZndCbG9ja2FnZUxheWVyRmlsbHMgKGNvbnN0IGNoYXIqICBsYXllck5hbWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3QmxvY2thZ2VMYXllckZpbGxzKGxheWVyTmFtZSk7Ci19Ci0KLWludCBkZWZ3QmxvY2thZ2VMYXllclB1c2hkb3duIChjb25zdCBjaGFyKiAgbGF5ZXJOYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0Jsb2NrYWdlTGF5ZXJQdXNoZG93bihsYXllck5hbWUpOwotfQotCi1pbnQgZGVmd0Jsb2NrYWdlTGF5ZXJFeGNlcHRwZ25ldCAoY29uc3QgY2hhciogIGxheWVyTmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndCbG9ja2FnZUxheWVyRXhjZXB0cGduZXQobGF5ZXJOYW1lKTsKLX0KLQotaW50IGRlZndCbG9ja2FnZVNwYWNpbmcgKGludCAgbWluU3BhY2luZykgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndCbG9ja2FnZVNwYWNpbmcobWluU3BhY2luZyk7Ci19Ci0KLWludCBkZWZ3QmxvY2thZ2VEZXNpZ25SdWxlV2lkdGggKGludCAgZWZmZWN0aXZlV2lkdGgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3QmxvY2thZ2VEZXNpZ25SdWxlV2lkdGgoZWZmZWN0aXZlV2lkdGgpOwotfQotCi1pbnQgZGVmd0Jsb2NrYWdlc1BsYWNlbWVudCAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0Jsb2NrYWdlc1BsYWNlbWVudCgpOwotfQotCi1pbnQgZGVmd0Jsb2NrYWdlc1BsYWNlbWVudENvbXBvbmVudCAoY29uc3QgY2hhciogIGNvbXBOYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0Jsb2NrYWdlc1BsYWNlbWVudENvbXBvbmVudChjb21wTmFtZSk7Ci19Ci0KLWludCBkZWZ3QmxvY2thZ2VzUGxhY2VtZW50UHVzaGRvd24gKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndCbG9ja2FnZXNQbGFjZW1lbnRQdXNoZG93bigpOwotfQotCi1pbnQgZGVmd0Jsb2NrYWdlc1BsYWNlbWVudFNvZnQgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndCbG9ja2FnZXNQbGFjZW1lbnRTb2Z0KCk7Ci19Ci0KLWludCBkZWZ3QmxvY2thZ2VzUGxhY2VtZW50UGFydGlhbCAoZG91YmxlICBtYXhEZW5zaXR5KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0Jsb2NrYWdlc1BsYWNlbWVudFBhcnRpYWwobWF4RGVuc2l0eSk7Ci19Ci0KLWludCBkZWZ3QmxvY2thZ2VzUmVjdCAoaW50ICB4bCwgaW50ICB5bCwgaW50ICB4aCwgaW50ICB5aCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndCbG9ja2FnZXNSZWN0KHhsLCB5bCwgeGgsIHloKTsKLX0KLQotaW50IGRlZndCbG9ja2FnZXNQb2x5Z29uIChpbnQgIG51bV9wb2x5cywgaW50KiAgeGwsIGludCogIHlsKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0Jsb2NrYWdlc1BvbHlnb24obnVtX3BvbHlzLCB4bCwgeWwpOwotfQotCi1pbnQgZGVmd0Jsb2NrYWdlUGxhY2VtZW50ICgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3QmxvY2thZ2VQbGFjZW1lbnQoKTsKLX0KLQotaW50IGRlZndCbG9ja2FnZVBsYWNlbWVudENvbXBvbmVudCAoY29uc3QgY2hhciogIGNvbXBOYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0Jsb2NrYWdlUGxhY2VtZW50Q29tcG9uZW50KGNvbXBOYW1lKTsKLX0KLQotaW50IGRlZndCbG9ja2FnZVBsYWNlbWVudFB1c2hkb3duICgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3QmxvY2thZ2VQbGFjZW1lbnRQdXNoZG93bigpOwotfQotCi1pbnQgZGVmd0Jsb2NrYWdlUGxhY2VtZW50U29mdCAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0Jsb2NrYWdlUGxhY2VtZW50U29mdCgpOwotfQotCi1pbnQgZGVmd0Jsb2NrYWdlUGxhY2VtZW50UGFydGlhbCAoZG91YmxlICBtYXhEZW5zaXR5KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0Jsb2NrYWdlUGxhY2VtZW50UGFydGlhbChtYXhEZW5zaXR5KTsKLX0KLQotaW50IGRlZndCbG9ja2FnZU1hc2sgKGludCAgbWFza0NvbG9yKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0Jsb2NrYWdlTWFzayhtYXNrQ29sb3IpOwotfQotCi1pbnQgZGVmd0Jsb2NrYWdlUmVjdCAoaW50ICB4bCwgaW50ICB5bCwgaW50ICB4aCwgaW50ICB5aCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndCbG9ja2FnZVJlY3QoeGwsIHlsLCB4aCwgeWgpOwotfQotCi1pbnQgZGVmd0Jsb2NrYWdlUG9seWdvbiAoaW50ICBudW1fcG9seXMsIGludCogIHhsLCBpbnQqICB5bCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndCbG9ja2FnZVBvbHlnb24obnVtX3BvbHlzLCB4bCwgeWwpOwotfQotCi1pbnQgZGVmd0VuZEJsb2NrYWdlcyAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0VuZEJsb2NrYWdlcygpOwotfQotCi1pbnQgZGVmd1N0YXJ0U2xvdHMgKGludCAgY291bnQpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3U3RhcnRTbG90cyhjb3VudCk7Ci19Ci0KLWludCBkZWZ3U2xvdExheWVyIChjb25zdCBjaGFyKiAgbGF5ZXJOYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1Nsb3RMYXllcihsYXllck5hbWUpOwotfQotCi1pbnQgZGVmd1Nsb3RSZWN0IChpbnQgIHhsLCBpbnQgIHlsLCBpbnQgIHhoLCBpbnQgIHloKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1Nsb3RSZWN0KHhsLCB5bCwgeGgsIHloKTsKLX0KLQotaW50IGRlZndTbG90UG9seWdvbiAoaW50ICBudW1fcG9seXMsIGRvdWJsZSogIHhsLCBkb3VibGUqICB5bCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndTbG90UG9seWdvbihudW1fcG9seXMsIHhsLCB5bCk7Ci19Ci0KLWludCBkZWZ3RW5kU2xvdHMgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndFbmRTbG90cygpOwotfQotCi1pbnQgZGVmd1N0YXJ0RmlsbHMgKGludCAgY291bnQpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3U3RhcnRGaWxscyhjb3VudCk7Ci19Ci0KLWludCBkZWZ3RmlsbExheWVyIChjb25zdCBjaGFyKiAgbGF5ZXJOYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0ZpbGxMYXllcihsYXllck5hbWUpOwotfQotCi1pbnQgZGVmd0ZpbGxMYXllck1hc2sgKGludCAgbWFza0NvbG9yKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0ZpbGxMYXllck1hc2sobWFza0NvbG9yKTsKLX0KLQotaW50IGRlZndGaWxsTGF5ZXJPUEMgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndGaWxsTGF5ZXJPUEMoKTsKLX0KLQotaW50IGRlZndGaWxsUmVjdCAoaW50ICB4bCwgaW50ICB5bCwgaW50ICB4aCwgaW50ICB5aCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndGaWxsUmVjdCh4bCwgeWwsIHhoLCB5aCk7Ci19Ci0KLWludCBkZWZ3RmlsbFBvbHlnb24gKGludCAgbnVtX3BvbHlzLCBkb3VibGUqICB4bCwgZG91YmxlKiAgeWwpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3RmlsbFBvbHlnb24obnVtX3BvbHlzLCB4bCwgeWwpOwotfQotCi1pbnQgZGVmd0ZpbGxWaWEgKGNvbnN0IGNoYXIqICB2aWFOYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0ZpbGxWaWEodmlhTmFtZSk7Ci19Ci0KLWludCBkZWZ3RmlsbFZpYU1hc2sgKGludCAgY29sb3JNYXNrKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0ZpbGxWaWFNYXNrKGNvbG9yTWFzayk7Ci19Ci0KLWludCBkZWZ3RmlsbFZpYU9QQyAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0ZpbGxWaWFPUEMoKTsKLX0KLQotaW50IGRlZndGaWxsUG9pbnRzIChpbnQgIG51bV9wb2ludHMsIGRvdWJsZSogIHhsLCBkb3VibGUqICB5bCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndGaWxsUG9pbnRzKG51bV9wb2ludHMsIHhsLCB5bCk7Ci19Ci0KLWludCBkZWZ3RW5kRmlsbHMgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndFbmRGaWxscygpOwotfQotCi1pbnQgZGVmd1N0YXJ0Tm9uRGVmYXVsdFJ1bGVzIChpbnQgIGNvdW50KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd1N0YXJ0Tm9uRGVmYXVsdFJ1bGVzKGNvdW50KTsKLX0KLQotaW50IGRlZndOb25EZWZhdWx0UnVsZSAoY29uc3QgY2hhciogIHJ1bGVOYW1lLCBpbnQgIGhhcmRTcGFjaW5nKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd05vbkRlZmF1bHRSdWxlKHJ1bGVOYW1lLCBoYXJkU3BhY2luZyk7Ci19Ci0KLWludCBkZWZ3Tm9uRGVmYXVsdFJ1bGVMYXllciAoY29uc3QgY2hhciogIGxheWVyTmFtZSwgaW50ICB3aWR0aCwgaW50ICBkaWFnV2lkdGgsIGludCAgc3BhY2luZywgaW50ICB3aXJlRXh0KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd05vbkRlZmF1bHRSdWxlTGF5ZXIobGF5ZXJOYW1lLCB3aWR0aCwgZGlhZ1dpZHRoLCBzcGFjaW5nLCB3aXJlRXh0KTsKLX0KLQotaW50IGRlZndOb25EZWZhdWx0UnVsZVZpYSAoY29uc3QgY2hhciogIHZpYU5hbWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3Tm9uRGVmYXVsdFJ1bGVWaWEodmlhTmFtZSk7Ci19Ci0KLWludCBkZWZ3Tm9uRGVmYXVsdFJ1bGVWaWFSdWxlIChjb25zdCBjaGFyKiAgdmlhUnVsZU5hbWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3Tm9uRGVmYXVsdFJ1bGVWaWFSdWxlKHZpYVJ1bGVOYW1lKTsKLX0KLQotaW50IGRlZndOb25EZWZhdWx0UnVsZU1pbkN1dHMgKGNvbnN0IGNoYXIqICBjdXRMYXllck5hbWUsIGludCAgbnVtQ3V0UykgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndOb25EZWZhdWx0UnVsZU1pbkN1dHMoY3V0TGF5ZXJOYW1lLCBudW1DdXRTKTsKLX0KLQotaW50IGRlZndFbmROb25EZWZhdWx0UnVsZXMgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndFbmROb25EZWZhdWx0UnVsZXMoKTsKLX0KLQotaW50IGRlZndTdGFydFN0eWxlcyAoaW50ICBjb3VudCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndTdGFydFN0eWxlcyhjb3VudCk7Ci19Ci0KLWludCBkZWZ3U3R5bGVzIChpbnQgIHN0eWxlTnVtcywgaW50ICBudW1fcG9pbnRzLCBkb3VibGUqICB4cCwgZG91YmxlKiAgeXApIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3U3R5bGVzKHN0eWxlTnVtcywgbnVtX3BvaW50cywgeHAsIHlwKTsKLX0KLQotaW50IGRlZndFbmRTdHlsZXMgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndFbmRTdHlsZXMoKTsKLX0KLQotaW50IGRlZndTdGFydEJlZ2luZXh0IChjb25zdCBjaGFyKiAgbmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndTdGFydEJlZ2luZXh0KG5hbWUpOwotfQotCi1pbnQgZGVmd0JlZ2luZXh0Q3JlYXRvciAoY29uc3QgY2hhciogIGNyZWF0b3JOYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0JlZ2luZXh0Q3JlYXRvcihjcmVhdG9yTmFtZSk7Ci19Ci0KLWludCBkZWZ3QmVnaW5leHREYXRlICgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3QmVnaW5leHREYXRlKCk7Ci19Ci0KLWludCBkZWZ3QmVnaW5leHRSZXZpc2lvbiAoaW50ICB2ZXJzMSwgaW50ICB2ZXJzMikgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndCZWdpbmV4dFJldmlzaW9uKHZlcnMxLCB2ZXJzMik7Ci19Ci0KLWludCBkZWZ3QmVnaW5leHRTeW50YXggKGNvbnN0IGNoYXIqICB0aXRsZSwgY29uc3QgY2hhciogIHN0cmluZykgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndCZWdpbmV4dFN5bnRheCh0aXRsZSwgc3RyaW5nKTsKLX0KLQotaW50IGRlZndFbmRCZWdpbmV4dCAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0VuZEJlZ2luZXh0KCk7Ci19Ci0KLWludCBkZWZ3RW5kICgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpkZWZ3RW5kKCk7Ci19Ci0KLWludCBkZWZ3Q3VycmVudExpbmVOdW1iZXIgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndDdXJyZW50TGluZU51bWJlcigpOwotfQotCi12b2lkIGRlZndQcmludEVycm9yIChpbnQgIHN0YXR1cykgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmd1ByaW50RXJyb3Ioc3RhdHVzKTsKLX0KLQotdm9pZCBkZWZ3QWRkQ29tbWVudCAoY29uc3QgY2hhciogIGNvbW1lbnQpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZndBZGRDb21tZW50KGNvbW1lbnQpOwotfQotCi12b2lkIGRlZndBZGRJbmRlbnQgKCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmd0FkZEluZGVudCgpOwotfQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZi94ZGVmd1dyaXRlckNhbGxzLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZ3V3JpdGVyQ2FsbHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzYxNTg5Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9jZGVmL3hkZWZ3V3JpdGVyQ2FsbHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IHh4eCAkCi0vLyAgJFJldmlzaW9uOiB4eHggJAotLy8gICREYXRlOiB4eHggJAotLy8gICRTdGF0ZTogeHh4ICQgIAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNkZWZpbmUgRVhURVJOIGV4dGVybiAiQyIKLQotI2luY2x1ZGUgImRlZndXcml0ZXJDYWxscy5oIgotI2luY2x1ZGUgImRlZndXcml0ZXJDYWxscy5ocHAiCi0KLS8vIFdyYXBwZXJzIGRlZmluaXRpb25zLgotaW50IGRlZndXcml0ZSAoRklMRSAqIGZpbGUsIGNvbnN0IGNoYXIgKiBmaWxlTmFtZSwgZGVmaVVzZXJEYXRhICB1c2VyRGF0YSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmRlZndXcml0ZShmaWxlLCBmaWxlTmFtZSwgdXNlckRhdGEpOwotfQotCi12b2lkIGRlZndTZXRSZWdpc3RlclVudXNlZENhbGxiYWNrcyAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZ3U2V0UmVnaXN0ZXJVbnVzZWRDYWxsYmFja3MoKTsKLX0KLQotdm9pZCBkZWZ3UHJpbnRVbnVzZWRDYWxsYmFja3MgKEZJTEUqICBsb2cpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZndQcmludFVudXNlZENhbGxiYWNrcyhsb2cpOwotfQotCi12b2lkIGRlZndTZXRVc2VyRGF0YSAoZGVmaVVzZXJEYXRhICBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmd1NldFVzZXJEYXRhKHAwKTsKLX0KLQotZGVmaVVzZXJEYXRhIGRlZndHZXRVc2VyRGF0YSAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6ZGVmd0dldFVzZXJEYXRhKCk7Ci19Ci0KLXZvaWQgZGVmd1NldEFycmF5Q2JrICg6OmRlZndWb2lkQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZ3U2V0QXJyYXlDYmsoKExlZkRlZlBhcnNlcjo6ZGVmd1ZvaWRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZ3U2V0QXNzZXJ0aW9uQ2JrICg6OmRlZndWb2lkQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZ3U2V0QXNzZXJ0aW9uQ2JrKChMZWZEZWZQYXJzZXI6OmRlZndWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmd1NldEJsb2NrYWdlQ2JrICg6OmRlZndWb2lkQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZ3U2V0QmxvY2thZ2VDYmsoKExlZkRlZlBhcnNlcjo6ZGVmd1ZvaWRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZ3U2V0QnVzQml0Q2JrICg6OmRlZndWb2lkQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZ3U2V0QnVzQml0Q2JrKChMZWZEZWZQYXJzZXI6OmRlZndWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmd1NldENhbm5vdE9jY3VweUNiayAoOjpkZWZ3Vm9pZENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmd1NldENhbm5vdE9jY3VweUNiaygoTGVmRGVmUGFyc2VyOjpkZWZ3Vm9pZENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZndTZXRDYW5wbGFjZUNiayAoOjpkZWZ3Vm9pZENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmd1NldENhbnBsYWNlQ2JrKChMZWZEZWZQYXJzZXI6OmRlZndWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmd1NldENhc2VTZW5zaXRpdmVDYmsgKDo6ZGVmd1ZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZndTZXRDYXNlU2Vuc2l0aXZlQ2JrKChMZWZEZWZQYXJzZXI6OmRlZndWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmd1NldENvbXBvbmVudENiayAoOjpkZWZ3Vm9pZENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmd1NldENvbXBvbmVudENiaygoTGVmRGVmUGFyc2VyOjpkZWZ3Vm9pZENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZndTZXRDb25zdHJhaW50Q2JrICg6OmRlZndWb2lkQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZ3U2V0Q29uc3RyYWludENiaygoTGVmRGVmUGFyc2VyOjpkZWZ3Vm9pZENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZndTZXREZWZhdWx0Q2FwQ2JrICg6OmRlZndWb2lkQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZ3U2V0RGVmYXVsdENhcENiaygoTGVmRGVmUGFyc2VyOjpkZWZ3Vm9pZENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZndTZXREZXNpZ25DYmsgKDo6ZGVmd1ZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZndTZXREZXNpZ25DYmsoKExlZkRlZlBhcnNlcjo6ZGVmd1ZvaWRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZ3U2V0RGVzaWduRW5kQ2JrICg6OmRlZndWb2lkQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZ3U2V0RGVzaWduRW5kQ2JrKChMZWZEZWZQYXJzZXI6OmRlZndWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmd1NldERpZUFyZWFDYmsgKDo6ZGVmd1ZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZndTZXREaWVBcmVhQ2JrKChMZWZEZWZQYXJzZXI6OmRlZndWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmd1NldERpdmlkZXJDYmsgKDo6ZGVmd1ZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZndTZXREaXZpZGVyQ2JrKChMZWZEZWZQYXJzZXI6OmRlZndWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmd1NldEV4dENiayAoOjpkZWZ3Vm9pZENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmd1NldEV4dENiaygoTGVmRGVmUGFyc2VyOjpkZWZ3Vm9pZENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZndTZXRGbG9vclBsYW5DYmsgKDo6ZGVmd1ZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZndTZXRGbG9vclBsYW5DYmsoKExlZkRlZlBhcnNlcjo6ZGVmd1ZvaWRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZ3U2V0R2NlbGxHcmlkQ2JrICg6OmRlZndWb2lkQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZ3U2V0R2NlbGxHcmlkQ2JrKChMZWZEZWZQYXJzZXI6OmRlZndWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmd1NldEdyb3VwQ2JrICg6OmRlZndWb2lkQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZ3U2V0R3JvdXBDYmsoKExlZkRlZlBhcnNlcjo6ZGVmd1ZvaWRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZ3U2V0SGlzdG9yeUNiayAoOjpkZWZ3Vm9pZENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmd1NldEhpc3RvcnlDYmsoKExlZkRlZlBhcnNlcjo6ZGVmd1ZvaWRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZ3U2V0SU9UaW1pbmdDYmsgKDo6ZGVmd1ZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZndTZXRJT1RpbWluZ0NiaygoTGVmRGVmUGFyc2VyOjpkZWZ3Vm9pZENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZndTZXROZXRDYmsgKDo6ZGVmd1ZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZndTZXROZXRDYmsoKExlZkRlZlBhcnNlcjo6ZGVmd1ZvaWRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZ3U2V0UGluQ2JrICg6OmRlZndWb2lkQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZ3U2V0UGluQ2JrKChMZWZEZWZQYXJzZXI6OmRlZndWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmd1NldFBpblByb3BDYmsgKDo6ZGVmd1ZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZndTZXRQaW5Qcm9wQ2JrKChMZWZEZWZQYXJzZXI6OmRlZndWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmd1NldFByb3BEZWZDYmsgKDo6ZGVmd1ZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZndTZXRQcm9wRGVmQ2JrKChMZWZEZWZQYXJzZXI6OmRlZndWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmd1NldFJlZ2lvbkNiayAoOjpkZWZ3Vm9pZENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmd1NldFJlZ2lvbkNiaygoTGVmRGVmUGFyc2VyOjpkZWZ3Vm9pZENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZndTZXRSb3dDYmsgKDo6ZGVmd1ZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZndTZXRSb3dDYmsoKExlZkRlZlBhcnNlcjo6ZGVmd1ZvaWRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZ3U2V0U05ldENiayAoOjpkZWZ3Vm9pZENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmd1NldFNOZXRDYmsoKExlZkRlZlBhcnNlcjo6ZGVmd1ZvaWRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZ3U2V0U2NhbmNoYWluQ2JrICg6OmRlZndWb2lkQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZ3U2V0U2NhbmNoYWluQ2JrKChMZWZEZWZQYXJzZXI6OmRlZndWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmd1NldFRlY2hub2xvZ3lDYmsgKDo6ZGVmd1ZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZndTZXRUZWNobm9sb2d5Q2JrKChMZWZEZWZQYXJzZXI6OmRlZndWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgZGVmd1NldFRyYWNrQ2JrICg6OmRlZndWb2lkQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZ3U2V0VHJhY2tDYmsoKExlZkRlZlBhcnNlcjo6ZGVmd1ZvaWRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZ3U2V0VW5pdHNDYmsgKDo6ZGVmd1ZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZndTZXRVbml0c0NiaygoTGVmRGVmUGFyc2VyOjpkZWZ3Vm9pZENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZndTZXRWZXJzaW9uQ2JrICg6OmRlZndWb2lkQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZ3U2V0VmVyc2lvbkNiaygoTGVmRGVmUGFyc2VyOjpkZWZ3Vm9pZENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGRlZndTZXRWaWFDYmsgKDo6ZGVmd1ZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmRlZndTZXRWaWFDYmsoKExlZkRlZlBhcnNlcjo6ZGVmd1ZvaWRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBkZWZ3U2V0VW51c2VkQ2FsbGJhY2tzICg6OmRlZndWb2lkQ2JrRm5UeXBlICBmdW5jKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZ3U2V0VW51c2VkQ2FsbGJhY2tzKChMZWZEZWZQYXJzZXI6OmRlZndWb2lkQ2JrRm5UeXBlICkgZnVuYyk7Ci19Ci0KLXZvaWQgZGVmd1NldExvZ0Z1bmN0aW9uICg6OkRFRklfTE9HX0ZVTkNUSU9OICBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6ZGVmd1NldExvZ0Z1bmN0aW9uKHAwKTsKLX0KLQotdm9pZCBkZWZ3U2V0V2FybmluZ0xvZ0Z1bmN0aW9uICg6OkRFRklfV0FSTklOR19MT0dfRlVOQ1RJT04gIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpkZWZ3U2V0V2FybmluZ0xvZ0Z1bmN0aW9uKHAwKTsKLX0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWZ6bGliL2NkZWZ6bGliLmMgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZnpsaWIvY2RlZnpsaWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRlZGRmMC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZnpsaWIvY2RlZnpsaWIuYworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IDIwMTQsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLSAqIAotICogVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLSAqIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotICogICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogCi0gKiBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotICogY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSAiemxpYi5oIgotI2luY2x1ZGUgImRlZnpsaWIuaCIKLSNpbmNsdWRlICJkZWZyUmVhZGVyLmgiCi0KLS8qCi0gKiBQcml2YXRlIGZ1bmN0aW9uczoKLSAqLwotc2l6ZV90IGRlZkdaaXBfcmVhZChGSUxFKiBmaWxlLCBjaGFyKiBidWYsIHNpemVfdCBsZW4pIHsKLSAgcmV0dXJuIGd6cmVhZCgoZ3pGaWxlKWZpbGUsIGJ1ZiwgKHVuc2lnbmVkIGludClsZW4pOwotfQotCi0vKgotICogUHVibGljIGZ1bmN0aW9uczoKLSAqLwotZGVmR1pGaWxlIAotZGVmR1ppcE9wZW4oY29uc3QgY2hhciAqZ3ppcFBhdGgsIGNvbnN0IGNoYXIqIG1vZGUpIHsKLSAgZGVmR1pGaWxlIGZwdHI7Ci0KLSAgaWYgKCFnemlwUGF0aCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBmcHRyID0gZ3pvcGVuKGd6aXBQYXRoLCBtb2RlKTsKLQotICBpZiAoZnB0cikgewotICAgIC8qIHN1Y2Nlc3NmdWxseSBvcGVuIHRoZSBnemlwIGZpbGUgKi8KLSAgICAvKiBzZXQgdGhlIHJlYWQgZnVuY3Rpb24gdG8gcmVhZCBmcm9tIGEgY29tcHJlc3NlZCBmaWxlICovCi0gICAgZGVmclNldFJlYWRGdW5jdGlvbihkZWZHWmlwX3JlYWQpOwotICAgIHJldHVybiAoZGVmR1pGaWxlKWZwdHI7Ci0gIH0gZWxzZQotICAgIHJldHVybiBOVUxMOwotfQotCi1pbnQgZGVmR1ppcENsb3NlKGRlZkdaRmlsZSBmaWxlUHRyKSB7Ci0gIHJldHVybiAoZ3pjbG9zZSgoZ3pGaWxlKWZpbGVQdHIpKTsKLX0KLQotaW50IGRlZnJSZWFkR1ppcChkZWZHWkZpbGUgZmlsZSwgY29uc3QgY2hhciogZ3ppcEZpbGUsIGRlZmlVc2VyRGF0YSB1RGF0YSkgewotICByZXR1cm4gZGVmclJlYWQoKEZJTEUqKWZpbGUsIGd6aXBGaWxlLCB1RGF0YSwgMSk7Ci19CmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZnpsaWIvZGVmemxpYi5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2NkZWZ6bGliL2RlZnpsaWIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM1YTY4OS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvY2RlZnpsaWIvZGVmemxpYi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgMjAxMiwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotICogCi0gKiBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotICogRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0gKiAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAKLSAqIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0gKiBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBDTEVGREVGWklQX0gKLSNkZWZpbmUgQ0xFRkRFRlpJUF9ICi0KLXR5cGVkZWYgdm9pZCogZGVmR1pGaWxlOwotCi0vKiAKLSAqIE5hbWU6IGRlZkdaaXBPcGVuCi0gKiBEZXNjcmlwdGlvbjogT3BlbiBhIGd6aXAgZmlsZQotICogUmV0dXJuczogQSBmaWxlIHBvaW50ZXIKLSAqLwotZXh0ZXJuIGRlZkdaRmlsZSBkZWZHWmlwT3Blbihjb25zdCBjaGFyKiBnemlwRmlsZSwgY29uc3QgY2hhciogbW9kZSk7Ci0KLS8qIAotICogTmFtZTogZGVmR1ppcENsb3NlCi0gKiBEZXNjcmlwdGlvbjogQ2xvc2UgYSBnemlwIGZpbGUKLSAqIFJldHVybnM6IDAgaWYgbm8gZXJyb3JzCi0gKi8KLWV4dGVybiBpbnQgZGVmR1ppcENsb3NlKGRlZkdaRmlsZSBmaWxlUHRyKTsKLQotLyoKLSAqIE5hbWU6IGRlZnJSZWFkR1ppcAotICogRGVzY3JpcHRpb246IFBhcnNlIGEgZGVmIGd6aXAgZmlsZQotICogUmV0dXJuczogMCBpZiBubyBlcnJvcnMKLSAqLwotZXh0ZXJuIGludCBkZWZyUmVhZEdaaXAoZGVmR1pGaWxlIGZpbGUsIGNvbnN0IGNoYXIqIGd6aXBGaWxlLCB2b2lkKiB1RGF0YSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWYubXNnIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWYubXNnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjU4YzBkLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmLm1zZworKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0jIEVycm9yIG1lc3NhZ2UgbnVtYmVyOgotIyAgIDYwMDAgLSBvdXQgb2YgbWVtb3J5Ci0jICAgNjAxMCAtIGRlZmlCbG9ja2FnZS5jcHAKLSMgICA2MDIwIC0gZGVmaUNvbXBvbmVudC5jcHAKLSMgICA2MDMwIC0gZGVmaUZQQy5jcHAKLSMgICA2MDQwIC0gZGVmaUZpbGwuY3BwCi0jICAgNjA1MCAtIGRlZmlHcm91cC5jcHAKLSMgICA2MDYwIC0gZGVmaUlPVGltaW5nLmNwcAotIyAgIDYwNzAgLSBkZWZpTWlzYy5jcHAKLSMgICA2MDgwIC0gZGVmaU5ldC5jcHAKLSMgICA2MDkwIC0gZGVmaU5vbkRlZmF1bHQuY3BwCi0jICAgNjEwMCAtIGRlZmlQYXJ0aXRpb24uY3BwCi0jICAgNjExMCAtIGRlZmlQaW5DYXAuY3BwCi0jICAgNjEyMCAtIGRlZmlQaW5Qcm9wLmNwcAotIyAgIDYxMzAgLSBkZWZpUmVnaW9uLmNwcAotIyAgIDYxNDAgLSBkZWZpUm93VHJhY2suY3BwCi0jICAgNjE1MCAtIGRlZmlTY2FuY2hhaW4uY3BwCi0jICAgNjE2MCAtIGRlZmlTbG90LmNwcAotIyAgIDYxNzAgLSBkZWZpVGltaW5nRGlzYWJsZS5jcHAKLSMgICA2MTgwIC0gZGVmaVZpYS5jcHAKLSMgICA2MjAwIC0gZGVmaUFzc2VydGlvbi5jcHAKLSMgNTAwMCAtIGRlZiByZWFkZXIsIGRlZnJSZWFkZXIuY3BwCi0jIDU1MDAgLSBsZXguY3BwaCwgeXllcnJvcgotIyA2MDAwIC0gZGVmIHBhcnNlciwgZXJyb3IsIGxleC5jcHBoLCBkZWYueSAoQ0FMTEJBQ0sgYW5kIENIS0VSUikKLSMgNjUwMCAtIGRlZiBwYXJzZXIsIGVycm9yLCBkZWYueQotIyA3MDAwIC0gZGVmIHBhcnNlciwgd2FybmluZywgbGV4LmNwcGgKLSMgNzUwMCAtIGRlZiBwYXJzZXIsIHdhcm5pbmcsIGxlZi55Ci0jIDgwMDAgLSBkZWYgcGFyc2VyLCBpbmZvLCBsZXguY3BwaAotIyA5MDAwIC0gZGVmIHdyaXRlcgotIyBlbXNNa0Vycm9yIERFRiAtYiBkZWZNc2dUYWJsZSAtbSBkZWYubXNnIC1lIC1uCi01MDAwICJUaGUgJ2RlZnJSZWFkJyBmdW5jdGlvbiBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSAnZGVmckluaXQnIGZ1bmN0aW9uLlxuVGhlICdkZWZySW5pdCcgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBwcmlvciB0byB0aGUgJ2RlZnJSZWFkJyBmdW5jdGlvbi4iCi01MDAxICJERUYgc3RhdGVtZW50IGZvdW5kIGluIHRoZSBkZWYgZmlsZSB3aXRoIG5vIGNhbGxiYWNrIHNldC4iCi02MDAwICJUaGUgc3ludGF4IGZvciBhbiBBTElBUyBzdGF0ZW1lbnQgaXMgXCImQUxJQVMgYWxpYXNOYW1lID0gYWxpYXNEZWZpbml0aW9uICZFTkRBTElBU1wiLiAnPScgaXMgbWlzc2luZyBhZnRlciB0aGUgYWxpYXNOYW1lLiIKLTYwMDEgIkVuZCBvZiBmaWxlIGlzIHJlYWNoZWQgd2hpbGUgcGFyc2luZyBpbiB0aGUgbWlkZGxlIG9mIGFuIEFMSUFTIHN0YXRlbWVudC5cblJldmlldyB5b3UgZGVmIGZpbGUgYW5kIGFkZCAnJkVOREFMSUFTJyBpbiB0aGUgQUxJQVMgc3RhdGVtZW50LiIKLTYwMDIgIlRoZSBkZWYgZmlsZSBpcyBpbmNvbXBsZXRlLiIKLTYwMDMgIlRoZSBCRUdJTkVYVCB0YWcgaXMgbWlzc2luZyBpbiB0aGUgREVGIGZpbGUuIEluY2x1ZGUgdGhlIHRhZyBhbmQgdGhlbiB0cnkgYWdhaW4uIgotNjAwNCAiVGhlIEJFR0lORVhUIHRhZyBpcyBlbXB0eS4gU3BlY2lmeSBhIHZhbHVlIGZvciB0aGUgdGFnIGFuZCB0cnkgYWdhaW4uIgotNjAwNSAiVGhlICdcIicgaXMgbWlzc2luZyB3aXRoaW4gdGhlIHRhZy4gU3BlY2lmeSB0aGUgJ1wiJyBpbiB0aGUgdGFnIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iCi02MDA2ICJUaGUgZW5kaW5nICdcIicgaXMgbWlzc2luZyBpbiB0aGUgdGFnLiBTcGVjaWZ5IHRoZSBlbmRpbmcgJ1wiJyBpbiB0aGUgdGFnIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iCi02MDA3ICJUaGUgRU5ERVhUIHN0YXRlbWVudCBpcyBtaXNzaW5nIGluIHRoZSBERUYgZmlsZS4gSW5jbHVkZSB0aGUgc3RhdGVtZW50IGFuZCB0aGVuIHRyeSBhZ2Fpbi4iCi02MDA4ICJJbnZhbGlkIGNoYXJhY3RlcnMgZm91bmQgaW4gXCclc1wnLlxuVGhlc2UgY2hhcmFjdGVycyBtaWdodCBiZSB1c2luZyB0aGUgY2hhcmFjdGVyIHR5cGVzIG90aGVyIHRoYW4gRW5nbGlzaC5cbkNyZWF0ZSBjaGFyYWN0ZXJzIGJ5IHNwZWNpZnlpbmcgdmFsaWQgY2hhcmFjdGVycyB0eXBlcy4iCi02MDEwICJBbiBlcnJvciBoYXMgYmVlbiByZXBvcnRlZCBpbiBjYWxsYmFjay4iCi02MDExICJUb28gbWFueSBzeW50YXggZXJyb3JzIGhhdmUgYmVlbiByZXBvcnRlZC4iCi02MDMwICJJbnZhbGlkIGRpcmVjdGlvbiBzcGVjaWZpZWQgd2l0aCBGUEMgbmFtZS4gVGhlIHZhbGlkIGRpcmVjdGlvbiBpcyBlaXRoZXIgJ0gnIG9yICdWJy4gU3BlY2lmeSBhIHZhbGlkIHZhbGUgYW5kIHRoZW4gdHJ5IGFnYWluLiIKLTYwNjAgIkludmFsaWQgdmFsdWUgc3BlY2lmaWVkIGZvciBJT1RJTUlORyByaXNlL2ZhbGwuIFRoZSB2YWxpZCB2YWx1ZSBmb3IgcmlzZSBpcyAnUicgYW5kIGZvciBmYWxsIGlzICdGJy4gU3BlY2lmeSBhIHZhbGlkIHZhbHVlIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iCi02MDgwICJBbiBpbnRlcm5hbCBlcnJvciBoYXMgb2NjdXJyZWQuIFRoZSBpbmRleCBudW1iZXIgZm9yIHRoZSBTVUJORVQgd2lyZXMgYXJyYXkgaXMgbGVzcyB0aGVuIG9yIGVxdWFsIHRvIDAuXG5Db250YWN0IENhZGVuY2UgQ3VzdG9tZXIgU3VwcG9ydCB3aXRoIHRoaXMgZXJyb3IgaW5mb3JtYXRpb24uIgotNjA4MSAiQW4gaW50ZXJuYWwgZXJyb3IgaGFzIG9jY3VycmVkLiBUaGUgaW5kZXggbnVtYmVyIGZvciB0aGUgTkVUIFBBVEggd2lyZXMgYXJyYXkgaXMgbGVzcyB0aGVuIG9yIGVxdWFsIHRvIDAuXG5Db250YWN0IENhZGVuY2UgQ3VzdG9tZXIgU3VwcG9ydCB3aXRoIHRoaXMgZXJyb3IgaW5mb3JtYXRpb24uIgotNjA4MiAiQW4gaW50ZXJuYWwgZXJyb3IgaGFzIG9jY3VycmVkLiBUaGUgaW5kZXggbnVtYmVyIGZvciB0aGUgTkVUIFNISUVMRFBBVEggd2lyZXMgYXJyYXkgaXMgbGVzcyB0aGVuIG9yIGVxdWFsIHRvIDAuXG5Db250YWN0IENhZGVuY2UgQ3VzdG9tZXIgU3VwcG9ydCB3aXRoIHRoaXMgZXJyb3IgaW5mb3JtYXRpb24uIgotNjA4MyAiVGhlIGluZGV4IG51bWJlciAlZCBzcGVjaWZpZWQgZm9yIHRoZSBORVQgSU5TVEFOQ0UgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIgotNjA4NCAiVGhlIGluZGV4IG51bWJlciAlZCBzcGVjaWZpZWQgZm9yIHRoZSBORVQgUElOIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIKLTYwODUgIlRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgTkVUIFBPTFlHT04gaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIgotNjA4NiAiVGhlIGluZGV4IG51bWJlciAlZCBzcGVjaWZpZWQgZm9yIHRoZSBORVQgUkVDVEFOR0xFIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIKLTYwOTAgIlRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgTk9OREVGQVVMVCBMQVlFUiBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiBTcGVjaWZ5IGEgdmFsaWQgaW5kZXggbnVtYmVyIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iCi02MDkxICJUaGUgaW5kZXggbnVtYmVyICVkIHNwZWNpZmllZCBmb3IgdGhlIE5PTkRFRkFVTFQgUFJPUEVSVFkgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIgotNjEwMCAiVGhlIHZhbHVlIHNwZWZpZmllZCBmb3IgUEFSVElUSU9OIFNFVFVQIGlzIGludmFsaWQuIFRoZSB2YWxpZCB2YWx1ZSBmb3IgU0VUVVAgaXMgJ1InIG9yICdGJy4gU3BlY2lmeSBhIHZhbGlkIHZhbHVlIGZvciBTRVRVUCBhbmQgdGhlbiB0cnkgYWdhaW4uIgotNjEwMSAiVGhlIHZhbHVlIHNwZWZpZmllZCBmb3IgUEFSVElUSU9OIEhPTEQgaXMgaW52YWxpZC4gVGhlIHZhbGlkIHZhbHVlIGZvciBIT0xEIGlzICdSJyBvciAnRicuIFNwZWNpZnkgYSB2YWxpZCB2YWx1ZSBmb3IgSE9MRCBhbmQgdGhlbiB0cnkgYWdhaW4uIgotNjEyMCAiVGhlIGluZGV4IG51bWJlciAlZCBzcGVjaWZpZWQgZm9yIHRoZSBQSU4gUFJPUEVSVFkgaXMgaW52YWxpZGUuXG5WYWxpZCBpbmRleCBudW1iZXIgaXMgZnJvbSAwIHRvICVkLiBTcGVjaWZ5IGEgdmFsaWQgaW5kZXggbnVtYmVyIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iCi02MTMwICJUaGUgaW5kZXggbnVtYmVyICVkIHNwZWNpZmllZCBmb3IgdGhlIFJFR0lPTiBQUk9QRVJUWSBpcyBpbnZhbGlkZS5cblZhbGlkIGluZGV4IG51bWJlciBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIKLTYxMzEgIlRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgUkVHSU9OIFJFQ1RBTkdMRSBpcyBpbnZhbGlkZS5cblZhbGlkIGluZGV4IG51bWJlciBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIKLTYxNDAgIlRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgVklBIExBWUVSIFJFQ1RBTkdMRSBpcyBpbnZhbGlkZS5cblZhbGlkIGluZGV4IG51bWJlciBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIKLTYxNTAgIlRoZSBTVEFSVCBzdGF0ZW1lbnQgaW4gdGhlIFNDQU5DSEFJTlMgaGFzIGRlZmluZWQgbW9yZSB0aGFuIG9uZSB0aW1lIGluIHRoZSBTQ0FOQ0hBSU5TIHN0YXRlbWVudC5cblVwZGF0ZSB0aGUgREVGIGZpbGUgdG8gb25seSBvbmUgU1RBUlQgc3RhdGVtZW50IGFuZCB0aGVuIHRyeSBhZ2Fpbi4iCi02MTUxICJUaGUgU1RPUCBzdGF0bWVudCBpbiB0aGUgU0NBTkNIQUlOUyBoYXMgZGVmaW5lZCBtb3JlIHRoYW4gb25lIHRpbWUgaW4gdGhlIFNDQU5DSEFJTlMgc3RhdGVtZW50LlxuVXBkYXRlIHRoZSBERUYgZmlsZSB0byBvbmx5IG9uZSBTVE9QIHN0YXRlbWVudCBhbmQgdGhlbiB0cnkgYWdhaW4uIgotNjE2MCAiVGhlIGluZGV4IG51bWJlciAlZCBzcGVjaWZpZWQgZm9yIHRoZSBTTE9UIFJFQ1RBTkdMRSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggbnVtYmVyIGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIgotNjE3MCAiVGhlIFRpbWluZ0Rpc2FibGUgdHlwZSBpcyBpbnZhbGlkLiBUaGUgdmFsaWQgdHlwZXMgYXJlIEZST01QSU4sICYgVEhSVVBJTi4gU3BlY2lmeSB0aGUgdmFsaWQgdHlwZSBhbmQgdGhlbiB0cnkgYWdhaW4uIgotNjE4MCAiVGhlIGluZGV4IG51bWJlciAlZCBzcGVjaWZpZWQgZm9yIHRoZSBWSUEgUE9MWUdPTiBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiBTcGVjaWZ5IGEgdmFsaWQgaW5kZXggbnVtYmVyIGFuZCB0aGVuIHRyeSBhZ2FpbiIKLTYyMDAgIlRoZSBBU1NFUlRJT04gc3RhdGVtZW50IGlzIGludmFsaWQgYmVjYXVzZSBpdCBoYXMgYW4gaW52YWxpZCBvcGVyYW5kIHJ1bGUuXG5WYWxpZCBvcGVyYW5kIHJ1bGUgaXMgZWl0aGVyIE5FVCBvciBQQVRILiBTcGVjaWZ5IGEgdmFsaWQgb3BlcmFuZCBhbmQgdGhlbiB0cnkgYWdhaW4uIgotNjIwMSAiVW5hYmxlIHRvIHByb2Nlc3MgdGhlIERFRiBmaWxlLiBCb3RoIFdJUkVETE9HSUMgYW5kIERFTEFZIHN0YXRlbWVudHMgYXJlIGRlZmluZWQgaW4gY29uc3RyYWludC9hc3NlcnRpb24uXG5VcGRhdGUgdGhlIERFRiBmaWxlIHRvIGRlZmluZSBlaXRoZXIgYSBXSVJFRExPR0lDIG9yIERFTEFZIHN0YXRlbWVudCBvbmx5LiIKLTYyMDIgIlVuYWJsZSB0byBwcm9jZXNzIHRoZSBERUYgZmlsZS4gQm90aCBTVU0gYW5kIERJRkYgc3RhdGVtZW50cyBhcmUgZGVmaW5lZCBpbiBjb25zdHJhaW50L2Fzc2VydGlvbi5cblVwZGF0ZSB0aGUgREVGIGZpbGUgdG8gZGVmaW5lIGVpdGhlciBhIFNVTSBvciBESUZGIHN0YXRlbWVudCBvbmx5LiIKLTY1MDEgIkFuIGVycm9yIGhhcyBiZWVuIGZvdW5kIHdoaWxlIHByb2Nlc3NpbmcgdGhlIERFRiBmaWxlICclcydcblVuaXQgJWQgaXMgYSA1LjYgb3IgbGF0ZXIgc3ludGF4LiBEZWZpbmUgdGhlIERFRiBmaWxlIGFzIDUuNiBhbmQgdGhlbiB0cnkgYWdhaW4uIgotNjUwMiAiVGhlIHZhbHVlICVkIGRlZmluZWQgZm9yIERFRiBVTklUUyBESVNUQU5DRSBNSUNST04gaXMgaW52YWxpZFxuLiBUaGUgdmFsaWQgdmFsdWVzIGFyZSAxMDAsIDIwMCwgMTAwMCwgMjAwMCwgMTAwMDAsIG9yIDIwMDAwLiBTcGVjaWZ5IGEgdmFsaWQgdmFsdWUgYW5kIHRoZW4gdHJ5IGFnYWluLiIKLTY1MDMgIlRoZSBleGVjdXRpb24gaGFzIGJlZW4gc3RvcHBlZCBiZWNhdXNlIHRoZSBERUYgcGFyc2VyIDUuNyBkb2VzIG5vdCBzdXBwb3J0IERFRiBmaWxlIHdpdGggdmVyc2lvbiAlcy5cblVwZGF0ZSB5b3VyIERFRiBmaWxlIHRvIHZlcnNpb24gNS43IG9yIGVhcmxpZXIuIgotNjUwNCAiRGVmIHBhcnNlciB2ZXJzaW9uIDUuNyBhbmQgbGF0ZXIgZG9lcyBub3Qgc3VwcG9ydCBOQU1FU0NBU0VTRU5TSVRJVkUgT0ZGLlxuRWl0aGVyIHJlbW92ZSB0aGlzIG9wdGlvbmFsIGNvbnN0cnVjdCBvciBzZXQgaXQgdG8gT04uIgotNjUwNSAiVGhlIE5PTkRFRkFVTFRSVUxFIHN0YXRlbWVudCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi02NTA2ICJUaGUgTkVURVhQUiBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotNjUwNyAiVGhlIFNVUFBMWVNFTlNJVElWSVRZIHN0YXRlbWVudCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi02NTA4ICJUaGUgR1JPVU5EU0VOU0lUSVZJVFkgc3RhdGVtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTY1MDkgIlRoZSBQT0xZR09OIHN0YXRlbWVudCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi02NTEwICJUaGUgQU5URU5OQVBJTlBBUlRJQUxNRVRBTEFSRUEgc3RhdGVtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTY1MTEgIlRoZSBBTlRFTk5BUElOUEFSVElBTE1FVEFMU0lERUFSRUEgc3RhdGVtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnIgotNjUxMiAiVGhlIEFOVEVOTkFQSU5HQVRFQVJFQSBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWciCi02NTEzICJUaGUgQU5URU5OQVBJTkRJRkZBUkVBIHN0YXRlbWVudCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZyIKLTY1MTQgIlRoZSBBTlRFTk5BUElOTUFYQVJFQUNBUiBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWciCi02NTE1ICJUaGUgQU5URU5OQVBJTk1BWFNJREVBUkVBQ0FSIHN0YXRlbWVudCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZyIKLTY1MTYgIlRoZSBBTlRFTk5BUElOUEFSVElBTENVVEFSRUEgc3RhdGVtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnIgotNjUxNyAiVGhlIEFOVEVOTkFQSU5NQVhDVVRDQVIgc3RhdGVtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnIgotNjUxOCAiVGhlIEFOVEVOTkFNT0RFTCBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS41IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWciCi02NTE5ICJUaGUgU1BBQ0lORyBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWciCi02NTIwICJUaGUgREVTSUdOUlVMRVdJRFRIIHN0YXRlbWVudCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZyIKLTY1MjMgIkludmFsaWQgUk9XIHN0YXRlbWVudCBkZWZpbmVkIGluIHRoZSBERUYgZmlsZS4gVGhlIERPIHN0YXRlbWVudCB3aGljaCBpcyByZXF1aXJlZCBpbiB0aGUgUk9XIHN0YXRlbWVudCBpcyBub3QgZGVmaW5lZC5cblVwZGF0ZSB5b3VyIERFRiBmaWxlIHdpdGggYSBETyBzdGF0ZW1lbnQuIgotNjUyNCAiSW52YWxpZCBzeW50YXggc3BlY2lmaWVkLiBUaGUgdmFsaWQgc3ludGF4IGlzIGVpdGhlciBcIkRPIDEgQlkgbnVtIG9yIERPIG51bSBCWSAxXCIuIFNwZWNpZnkgdGhlIHZhbGlkIHN5bnRheCBhbmQgdHJ5IGFnYWluLiIKLTY1MjUgIlRoZSBETyBudW1iZXIgJWcgaW4gVFJBQ0sgaXMgaW52YWxpZC5cblRoZSBudW1iZXIgdmFsdWUgaGFzIHRvIGJlIGdyZWF0ZXIgdGhhbiAwLiBTcGVjaWZ5IHRoZSB2YWxpZCBzeW50YXggYW5kIHRyeSBhZ2Fpbi4iCi02NTI2ICJUaGUgU1RFUCBudW1iZXIgJWcgaW4gVFJBQ0sgaXMgaW52YWxpZC5cblRoZSBudW1iZXIgdmFsdWUgaGFzIHRvIGJlIGdyZWF0ZXIgdGhhbiAwLiBTcGVjaWZ5IHRoZSB2YWxpZCBzeW50YXggYW5kIHRyeSBhZ2Fpbi4iCi02NTI3ICJUaGUgRE8gbnVtYmVyICVnIGluIEdDRUxMR1JJRCBpcyBpbnZhbGlkLlxuVGhlIG51bWJlciB2YWx1ZSBoYXMgdG8gYmUgZ3JlYXRlciB0aGFuIDAuIFNwZWNpZnkgdGhlIHZhbGlkIHN5bnRheCBhbmQgdHJ5IGFnYWluLiIKLTY1MjggIlRoZSBTVEVQIG51bWJlciAlZyBpbiBHQ0VMTEdSSUQgaXMgaW52YWxpZC5cblRoZSBudW1iZXIgdmFsdWUgaGFzIHRvIGJlIGdyZWF0ZXIgdGhhbiAwLiBTcGVjaWZ5IHRoZSB2YWxpZCBzeW50YXggYW5kIHRyeSBhZ2Fpbi4iCi02NTI5ICJUaGUgSEFMTyBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWciCi02NTMwICJUaGUgRklYRURCVU1QIHN0YXRlbWVudCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1LjUgYW5kIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZyIKLTY1MzEgIlRoZSBsYXllck5hbWUgd2hpY2ggaXMgcmVxdWlyZWQgaW4gcGF0aCBpcyBtaXNzaW5nLiBJbmNsdWRlIHRoZSBsYXllck5hbWUgaW4gdGhlIHBhdGggYW5kIHRoZW4gdHJ5IGFnYWluLiIKLTY1MzIgIlRoZSBWSUEgRE8gc3RhdGVtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNSBhbmQgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnIgotNjUzMyAiRWl0aGVyIHRoZSBudW1YIG9yIG51bVkgaW4gdGhlIFZJQSBETyBzdGF0ZW1lbnQgaGFzIGludmFsaWQgdmFsdWUuIFRoZSB2YWx1ZSBzcGVjaWZpZWQgaXMgMC5cblVwZGF0ZSB5b3VyIERFRiBmaWxlIHdpdGggdGhlIGNvcnJlY3QgdmFsdWUgYW5kIHRoZW4gdHJ5IGFnYWluLiIKLTY1MzQgIlRoZSBTVFlMRSBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWciCi02NTM1ICJUaGUgUE9MWUdPTiBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWciCi02NTM2ICJUaGUgUkVDVCBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWciCi02NTM3ICJUaGUgdmFsdWUgJXMgZm9yIHN0YXRlbWVudCBWT0xUQUdFIGlzIGludmFsaWQuIFRoZSB2YWx1ZSBjYW4gb25seSBiZSBpbnRlZ2VyLlxuU3BlY2lmeSBhIHZhbGlkIHZhbHVlIGluIHVuaXRzIG9mIG1pbGxpdm9sdHMiCi02NTM4ICJUaGUgUEFSVElUSU9OIHN0YXRlbWVudCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1LjUgYW5kIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZyIKLTY1MzkgIkludmFsaWQgQkxPQ0tBR0Ugc3RhdGVtZW50IGRlZmluZWQgaW4gdGhlIERFRiBmaWxlLiBUaGUgQkxPQ0tBR0Ugc3RhdG1lbnQgaGFzIGJvdGggdGhlIExBWUVSIGFuZCB0aGUgUExBQ0VNRU5UIHN0YXRlbWVudHMgZGVmaW5lZC5cblVwZGF0ZSB5b3VyIERFRiBmaWxlIHRvIGhhdmUgZWl0aGVyIEJMT0NLQUdFIG9yIFBMQUNFTUVOVCBzdGF0ZW1lbnQgb25seS4iCi02NTQwICJUaGUgU1BBQ0lORyBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWciCi02NTQxICJUaGUgU1BBQ0lORyBzdGF0ZW1lbnQgaXMgZGVmaW5lZCBpbiB0aGUgTEFZRVIgc3RhdGVtZW50LFxuYnV0IHRoZXJlIGlzIGFscmVhZHkgZWl0aGVyIGEgU1BBQ0lORyBzdGF0ZW1lbnQgb3IgREVTSUdOUlVMRVdJRFRIICBzdGF0ZW1lbnQgaGFzIGRlZmluZWQgaW4gdGhlIExBWUVSIHN0YXRlbWVudC5cblVwZGF0ZSB5b3VyIERFRiBmaWxlIHRvIGhhdmUgZWl0aGVyIFNQQUNJTkcgc3RhdGVtZW50IG9yIGEgREVTSUdOUlVMRVdJRFRIIHN0YXRlbWVudC4iCi02NTQyICJUaGUgZGVmaW5lZCBCTE9DS0FHRVMgQ09NUE9ORU5UIHN0YXRlbWVudCBoYXMgZWl0aGVyIENPTVBPTkVOVCwgU0xPVFMsIEZJTExTLCBQVVNIRE9XTiBvciBFWENFUFRQR05FVCBkZWZpbmVkLlxuT25seSBvbmUgb2YgdGhlc2Ugc3RhdGVtZW50cyBpcyBhbGxvd2VkIHBlciBMQVlFUi4gVXBkYXRlZCB0aGUgREVGIGZpbGUgdG8gZGVmaW5lIGEgdmFsaWQgQkxPQ0tBR0VTIENPTVBPTkVOVCBzdGF0ZW1lbnQgcGVyIGxheWVyLiIKLTY1NDMgIlRoZSBkZWZpbmVkIEJMT0NLQUdFUyBQTEFDRU1FTlQgc3RhdGVtZW50IGhhcyBlaXRoZXIgQ09NUE9ORU5ULCBQVVNIRE9XTiwgU09GVCBvciBQQVJUSUFMIGRlZmluZWQuXG5Pbmx5IG9uZSBvZiB0aGVzZSBzdGF0ZW1lbnRzIGlzIGFsbG93ZWQgcGVyIExBWUVSLiBVcGRhdGVkIHRoZSBERUYgZmlsZSB0byBkZWZpbmUgYSB2YWxpZCBCTE9DS0FHRVMgUExBQ0VNRU5UIHN0YXRlbWVudC4iCi02NTQ0ICJBIFBPTFlHT04gc3RhdGVtZW50IGlzIGRlZmluZWQgaW4gdGhlIEJMT0NLQUdFIHN0YXRlbWVudCxcbmJ1dCBpdCBpcyBub3QgZGVmaW5lZCBpbiB0aGUgQkxPQ0tBR0UgTEFZRVIgc3RhdGVtZW50LlxuVXBkYXRlIHlvdXIgREVGIGZpbGUgdG8gZWl0aGVyIHJlbW92ZSB0aGUgUE9MWUdPTiBzdGF0ZW1lbnQgZnJvbSB0aGUgQkxPQ0tBR0Ugc3RhdGVtZW50IG9yXG5kZWZpbmUgdGhlIFBPTFlHT04gc3RhdGVtZW50IGluIGEgQkxPQ0tBR0UgTEFZRVIgc3RhdGVtZW50LiIKLTY1NDUgIlRoZSBOT05ERUZBVUxUUlVMRSBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotNjU0NiAiVGhlIFNUWUxFUyBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWciCi02NTQ3ICJUaGUgUExBQ0VNRU5UIFNPRlQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS43IG9yIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi02NTQ4ICJUaGUgUEFSVElBTCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1Ljcgb3IgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTY1NDkgIlRoZSBFWENFUFRQR05FVCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1Ljcgb3IgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTY1NTAgIlRoZSBIQUxPIFNPRlQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS43IG9yIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi02NTUxICJUaGUgUk9VVEVIQUxPIGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNyBvciBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotNjU1MiAiVGhlIEZJTExXSVJFT1BDIGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNyBvciBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotNjU1MyAiVGhlIExBWUVSIE9QQyBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1Ljcgb3IgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTY1NTQgIlRoZSBWSUEgT1BDIGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNyBvciBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotNjU1NSAiVGhlIFBPUlQgaW4gUElOUyBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1Ljcgb3IgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTY1NTYgIlRoZSBQSU4gVklBIHN0YXRlbWVudCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1LjcgYW5kIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi02NTU3ICJUaGUgVklBUlVMRSBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWciLAotNjU1OCAiVGhlIEZSRVFVRU5DWSBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS41IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWciCi02NTU5ICJUaGUgUk9XQ09MIHN0YXRlbWVudCBpcyBtaXNzaW5nIGZyb20gdGhlIFZJQVJVTEUgc3RhdGVtZW50LiBFbnN1cmUgdGhhdCBpdCBleGlzdHMgaW4gdGhlIFZJQVJVTEUgc3RhdGVtZW50LiIKLTY1NjAgIlRoZSBPUklHSU4gc3RhdGVtZW50IGlzIG1pc3NpbmcgZnJvbSB0aGUgVklBUlVMRSBzdGF0ZW1lbnQuIEVuc3VyZSB0aGF0IGl0IGV4aXN0cyBpbiB0aGUgVklBUlVMRSBzdGF0ZW1lbnQuIgotNjU2MSAiIFRoZSBPRkZTRVQgc3RhdGVtZW50IGlzIG1pc3NpbmcgZnJvbSB0aGUgVklBUlVMRSBzdGF0ZW1lbnQuIEVuc3VyZSB0aGF0IGl0IGV4aXN0cyBpbiB0aGUgVklBUlVMRSBzdGF0ZW1lbnQuIgotNjU2MiAiVGhlIFBBVFRFUk4gc3RhdGVtZW50IGlzIG1pc3NpbmcgZnJvbSB0aGUgVklBUlVMRSBzdGF0ZW1lbnQuIEVuc3VyZSB0aGF0IGl0IGV4aXN0cyBpbiB0aGUgVklBUlVMRSBzdGF0ZW1lbnQuIgotNjU2MyAiVGhlIFRZUEUgc3RhdGVtZW50IGFscmVhZHkgZXhpc3RzLiBJdCBoYXMgYmVlbiBkZWZpbmVkIGluIHRoZSBSRUdJT04gc3RhdGVtZW50LiIKLTY1NjQgIlBPTFlHT04gc3RhdGVtZW50IGluIEZJTExTIExBWUVSIGlzIGEgdmVyc2lvbiA1LjYgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgZGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWciLAotNzAwMCAiVGhlIHNwZWNpZmllZCBzdHJpbmcgaGFzIGV4Y2VlZGVkIDQwOTYgY2hhcmFjdGVycy4gVGhlIGV4dHJhIGNoYXJhY3RlcnMgd2lsbCBiZSB0cnVuY2F0ZWQuIFNwZWNpZnkgYSBzdHJpbmcgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDQwOTYgY2hhcmFjdGVycy4iCi03MDEwICJUaGUgUHJvcE5hbWUgJXMgaXMgbm90IGRlZmluZWQgZm9yICVzLiIKLTcwMTEgIlRoZSBOQU1FU0NBU0VTRU5TSVRJVkUgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cblRoZSBERUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LiIKLTcwMTIgIk5vIFZFUlNJT04gc3RhdGVtZW50IGZvdW5kLCB1c2luZyB0aGUgZGVmYXVsdCB2YWx1ZSAlMmcuIgotNzAxMyAiVGhlIERFRiBmaWxlIGlzIGludmFsaWQgaWYgTkFNRVNDQVNFU0VOU0lUSVZFIGlzIHVuZGVmaW5lZC5cbk5BTUVTQ0FTRVNFTlNJVElWRSBpcyBhIG1hbmRhdG9yeSBzdGF0ZW1lbnQgaW4gdGhlIERFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjYgYW5kIGVhcmxpZXIuXG5UbyBkZWZpbmUgdGhlIE5BTUVTQ0FTRVNFTlNJVElWRSBzdGF0ZW1lbnQsIHJlZmVyIHRvIHRoZSBMRUYvREVGIDUuNSBhbmQgZWFybGllciBMYW5ndWFnZSBSZWZlcmVuY2UgbWFudWFsLiIKLTcwMTQgIlRoZSBERUYgZmlsZSBpcyBpbnZhbGlkIGlmIEJVU0JJVENIQVJTIGlzIHVuZGVmaW5lZC5cbkJVU0JJVENIQVJTIGlzIGEgbWFuZGF0b3J5IHN0YXRlbWVudCBpbiB0aGUgREVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNiBhbmQgZWFybGllci5cblRvIGRlZmluZSB0aGUgQlVTQklUQ0hBUlMgc3RhdGVtZW50LCByZWZlciB0byB0aGUgTEVGL0RFRiA1LjUgYW5kIGVhcmxpZXIgTGFuZ3VhZ2UgUmVmZXJlbmNlIG1hbnVhbC4iCi03MDE1ICJUaGUgREVGIGZpbGUgaXMgaW52YWxpZCBpZiBESVZJREVSQ0hBUiBpcyB1bmRlZmluZWQuXG5ESVZJREVSQ0hBUiBpcyBhIG1hbmRhdG9yeSBzdGF0ZW1lbnQgaW4gdGhlIERFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjYgYW5kIGVhcmxpZXIuXG5UbyBkZWZpbmUgdGhlIERJVklERVJDSEFSIHN0YXRlbWVudCwgcmVmZXIgdG8gdGhlIExFRi9ERUYgNS41IGFuZCBlYXJsaWVyIExhbmd1YWdlIFJlZmVyZW5jZSBtYW51YWwuIgotNzAxNiAiREVTSUdOIGlzIGEgbWFuZGF0b3J5IHN0YXRlbWVudCBpbiB0aGUgREVGIGZpbGUuIEVuc3VyZSB0aGF0IGl0IGV4aXN0cyBpbiB0aGUgZmlsZS4iCi03MDE3ICJUaGUgREVGQVVMVENBUCBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIERFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuIgotNzAxOCAiVGhlIERPIHN0YXRlbWVudCBpbiB0aGUgUk9XIHN0YXRlbWVudCB3aXRoIHRoZSBuYW1lICVzIGhhcyBpbnZhbGlkIHN5bnRheC5cblRoZSB2YWxpZCBzeW50YXggaXMgXCJETyBudW1YIEJZIDEgU1RFUCBzcGFjZVggMCB8IERPIDEgQlkgbnVtWSBTVEVQIDAgc3BhY2VZXCIuXG5TcGVjaWZ5IHRoZSB2YWxpZCBzeW50YXggYW5kIHRyeSBhZ2Fpbi4iCi03MDE5ICJUaGUgUEFUVEVSTk5BTUUgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cblRoZSBERUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LiIKLTcwMjAgIlRoZSBSRUdJT04gcHQgcHQgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS41IGFuZCBsYXRlci5cblRoZSBERUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LiIKLTcwMjEgIlRoZSBGT1JFSUdOIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5UaGUgREVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC4iCi03MDIyICJJbiB0aGUgQ09NUE9ORU5UIFVOUExBQ0VEIHN0YXRlbWVudCwgdGhlIHBvaW50IGFuZCBvcmllbnQgYXJlIGludmFsaWQgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIERFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuIgotNzAyMyAiVGhlIFNQRUNJQUwgTkVUIHN0YXRlbWVudCwgd2l0aCB0eXBlICVzLCBkb2VzIG5vdCBoYXZlIGFueSBuZXQgc3RhdGVtZW50IGRlZmluZWQuXG5UaGUgREVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC4iCi03MDI0ICJUaGUgRVNUQ0FQIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNSBhbmQgbGF0ZXIuXG5UaGUgREVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC4iCi03MDI1ICJUaGUgU1BFQ0lBTCBORVQgU0hJRUxEIHN0YXRlbWVudCwgZG9lcyBub3QgaGF2ZSBhbnkgc2hpZWxkIG5ldCBzdGF0ZW1lbnQgZGVmaW5lZC5cblRoZSBERUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LiIKLTcwMjYgIlRoZSBXSURUSCBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjUgYW5kIGxhdGVyLlxuVGhlIERFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuIgotNzAyNyAiVGhlIEdST1VQIFJFR0lPTiBwdCBwdCBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjUgYW5kIGxhdGVyLlxuVGhlIERFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuIgotNzAyOCAiVGhlIEdST1VQIFNPRlQgTUFYWCBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjUgYW5kIGxhdGVyLlxuVGhlIERFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuIgotNzAyOSAiVGhlIEdST1VQIFNPRlQgTUFYWSBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjUgYW5kIGxhdGVyLlxuVGhlIERFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuIgotNzAzMCAiVGhlIEdST1VQIFNPRlQgTUFYSEFMRlBFUklNRVRFUiBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjUgYW5kIGxhdGVyLlxuVGhlIERFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuIgotNzAzMSAiVGhlIEFTU0VSVElPTlMgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cblRoZSBERUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LiIKLTcwMzIgIlRoZSBDT05TVFJBSU5UUyBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIERFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuIgotNzAzNSAiVGhlIElPVElNSU5HUyBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIERFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuIgotNzUwMCAiVW5hYmxlIHRvIG9wZW4gdGhlIGZpbGUgZGVmUldhcm5pbmcubG9nIGluICVzLlxuV2FybmluZyBtZXNzYWdlcyB3aWxsIG5vdCBiZSB3cml0dGVuIG91dCBpbiB0aGUgbG9nIGZpbGUuXG5DaGVjayBpZiB5b3UgaGF2ZSB3cml0ZSBwZXJtaXNzaW9uIG9uIHRoZSBkaXJlY3RvcnkuIgotODAwMCAiVGhlIGRhdGEgc3RpbGwgZXhpc3RzIGFmdGVyIHRoZSBFTkQgREVTSUdOIHN0YXRlbWVudC4gVGhlIERFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBkYXRhLiIKLTg1MDAgIlVuYWJsZSB0byBvcGVuIHRoZSBmaWxlIGRlZlJXYXJuaW5nLmxvZyBpbiAlcy5cbkluZm8gbWVzc2FnZXMgd2lsbCBub3QgYmUgd3JpdHRlbiBvdXQgaW4gdGhlIGxvZyBmaWxlLlxuQ2hlY2sgaWYgeW91IGhhdmUgd3JpdGUgcGVybWlzc2lvbiBvbiB0aGUgZGlyZWN0b3J5LiIKLTkwMDAgIlRoZSBERUYgd3JpdGVyIGhhcyBkZXRlY3RlZCB0aGF0IHRoZSBmdW5jdGlvbiBkZWZ3SW5pdENiayBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBhbmQgeW91IGFyZSB0cnlpbmcgdG8gY2FsbCBkZWZ3SW5pdC5cbk9ubHkgZGVmd0luaXRDYmsgb3IgZGVmd0luaXQgY2FuIGJlIGNhbGxlZCBidXQgbm90IGJvdGguXG5VcGRhdGUgeW91ciBwcm9ncmFtIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iCi05MDAxICJUaGUgREVGIHdyaXRlciBoYXMgZGV0ZWN0ZWQgdGhhdCB0aGUgZnVuY3Rpb24gZGVmd0luaXQgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgYW5kIHlvdSBhcmUgdHJ5aW5nIHRvIGNhbGwgZGVmd0luaXRDYmsuXG5Pbmx5IGRlZndJbml0Q2JrIG9yIGRlZndJbml0IGNhbiBiZSBjYWxsZWQgYnV0IG5vdCBib3RoLlxuVXBkYXRlIHlvdXIgcHJvZ3JhbSBhbmQgdGhlbiB0cnkgYWdhaW4uIgotOTAxMCAiVGhlIGZ1bmN0aW9uIGRlZndXcml0ZSBpcyBjYWxsZWQgYmVmb3JlIHRoZSBmdW5jdGlvbiBkZWZ3SW5pdENiay5cbllvdSBuZWVkIHRvIGNhbGwgZGVmd0luaXRDYmsgYmVmb3JlIGNhbGxpbmcgYW55IG90aGVyIGZ1bmN0aW9ucy5cblVwZGF0ZSB5b3VyIHByb2dyYW0gYW5kIHRoZW4gdHJ5IGFnYWluLiIKLTkwMTEgIllvdSBwcm9ncmFtIGhhcyBjYWxsZWQgdGhlIGZ1bmN0aW9uIGRlZndJbml0IHRvIGluaXRpYWxpemUgdGhlIHdyaXRlci5cbklmIHlvdSB3YW50IHRvIHVzZSB0aGUgY2FsbGJhY2sgb3B0aW9uIHlvdSBuZWVkIHRvIHVzZSB0aGUgZnVuY3Rpb24gZGVmd0luaXRDYmsuIgotOTAxMiAiWW91IGFyZSBjYWxsaW5nIHRoZSBmdW5jdGlvbiBkZWZ3UHJpbnRVbnVzZWRDYWxsYmFja3MgYnV0IHlvdSBkaWQgY2FsbCB0aGUgZnVuY3Rpb24gZGVmd1NldFJlZ2lzdGVyVW51c2VkQ2FsbGJhY2tzIHdoaWNoIGlzIHJlcXVpcmVkIGJlZm9yZSB5b3UgY2FuIGNhbGwgZGVmd1ByaW50VW51c2VkQ2FsbGJhY2tzLiIKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmLnkgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZi55CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjhmNzljLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmLnkKKysrIC9kZXYvbnVsbApAQCAtMSw1MTg0ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMy0yMDE3LCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gCi0vLyAgJEF1dGhvcjogaWNmdGNtICQKLS8vICAkUmV2aXNpb246ICMyICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNyAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0vLyAgRXJyb3IgbWVzc2FnZSBudW1iZXI6Ci0vLyAgNTAwMCAtIGRlZiByZWFkZXIsIGRlZnJSZWFkZXIuY3BwCi0vLyAgNTUwMCAtIGxleC5jcHBoLCB5eWVycm9yCi0vLyAgNjAwMCAtIGRlZiBwYXJzZXIsIGVycm9yLCBsZXguY3BwaCwgZGVmLnkgKENBTExCQUNLICYgQ0hLRVJSKQotLy8gIDYwMTAgLSBkZWZpQmxvY2thZ2UuY3BwCi0vLyAgNjAyMCAtIGRlZmlDb21wb25lbnQuY3BwCi0vLyAgNjAzMCAtIGRlZmlGUEMuY3BwCi0vLyAgNjA0MCAtIGRlZmlGaWxsLmNwcAotLy8gIDYwNTAgLSBkZWZpR3JvdXAuY3BwCi0vLyAgNjA2MCAtIGRlZmlJT1RpbWluZy5jcHAKLS8vICA2MDcwIC0gZGVmaU1pc2MuY3BwCi0vLyAgNjA4MCAtIGRlZmlOZXQuY3BwCi0vLyAgNjA5MCAtIGRlZmlOb25EZWZhdWx0LmNwcAotLy8gIDYxMDAgLSBkZWZpUGFydGl0aW9uLmNwcAotLy8gIDYxMTAgLSBkZWZpUGluQ2FwLmNwcAotLy8gIDYxMjAgLSBkZWZpUGluUHJvcC5jcHAKLS8vICA2MTMwIC0gZGVmaVJlZ2lvbi5jcHAKLS8vICA2MTQwIC0gZGVmaVJvd1RyYWNrLmNwcAotLy8gIDYxNTAgLSBkZWZpU2NhbmNoYWluLmNwcAotLy8gIDYxNjAgLSBkZWZpU2xvdC5jcHAKLS8vICA2MTcwIC0gZGVmaVRpbWluZ0Rpc2FibGUuY3BwCi0vLyAgNjE4MCAtIGRlZmlWaWEuY3BwCi0vLyAgNjUwMCAtIGRlZiBwYXJzZXIsIGVycm9yLCBkZWYueQotJXB1cmUtcGFyc2VyCi0lbGV4LXBhcmFtIHtkZWZyRGF0YSAqZGVmRGF0YX0KLSVwYXJzZS1wYXJhbSB7ZGVmckRhdGEgKmRlZkRhdGF9Ci0KLQotJXsKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJkZWZyUmVhZGVyLmhwcCIKLSNpbmNsdWRlICJkZWZpVXNlci5ocHAiCi0jaW5jbHVkZSAiZGVmckNhbGxCYWNrcy5ocHAiCi0jaW5jbHVkZSAibGV4LmgiCi0KLSNkZWZpbmUgREVGX01BWF9JTlQgMjE0NzQ4MzY0NwotI2RlZmluZSBZWURFQlVHIDEgICAgIC8vIHRoaXMgaXMgdGVtcCBmaXggZm9yIHBjciA3NTUxMzIgCi0vLyBUWF9ESVI6VFJBTlNMQVRJT04gT04KLQotCi0jaW5jbHVkZSAiZGVmckRhdGEuaHBwIgotI2luY2x1ZGUgImRlZnJTZXR0aW5ncy5ocHAiCi0jaW5jbHVkZSAiZGVmckNhbGxCYWNrcy5ocHAiCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLS8vIE1hY3JvIHRvIGRlc2NyaWJlIGhvdyB3ZSBoYW5kbGUgYSBjYWxsYmFjay4KLS8vIElmIHRoZSBmdW5jdGlvbiB3YXMgc2V0IHRoZW4gY2FsbCBpdC4KLS8vIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIG5vbiB6ZXJvIHRoZW4gdGhlcmUgd2FzIGFuIGVycm9yCi0vLyBzbyBjYWxsIHRoZSBlcnJvciByb3V0aW5lIGFuZCBleGl0LgotLy8KLSNkZWZpbmUgQ0FMTEJBQ0soZnVuYywgdHlwLCBkYXRhKSBcCi0gICAgaWYgKCFkZWZEYXRhLT5lcnJvcnMpIHtcCi0gICAgICBpZiAoZnVuYykgeyBcCi0gICAgICAgIGlmICgoZGVmRGF0YS0+ZGVmUmV0VmFsID0gKCpmdW5jKSh0eXAsIGRhdGEsIGRlZkRhdGEtPnNlc3Npb24tPlVzZXJEYXRhKSkgPT0gUEFSU0VfT0spIHsgXAotICAgICAgICB9IGVsc2UgaWYgKGRlZkRhdGEtPmRlZlJldFZhbCA9PSBTVE9QX1BBUlNFKSB7IFwKLSAgICAgICAgICByZXR1cm4gZGVmRGF0YS0+ZGVmUmV0VmFsOyBcCi0gICAgICAgIH0gZWxzZSB7IFwKLSAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2MDEwLCAiQW4gZXJyb3IgaGFzIGJlZW4gcmVwb3J0ZWQgaW4gY2FsbGJhY2suIik7IFwKLSAgICAgICAgICByZXR1cm4gZGVmRGF0YS0+ZGVmUmV0VmFsOyBcCi0gICAgICAgIH0gXAotICAgICAgfSBcCi0gICAgfQotCi0jZGVmaW5lIENIS0VSUigpIFwKLSAgICBpZiAoZGVmRGF0YS0+Y2hlY2tFcnJvcnMoKSkgeyBcCi0gICAgICByZXR1cm4gMTsgXAotICAgIH0KLQotI2RlZmluZSBDSEtQUk9QVFlQRShwcm9wVHlwZSwgcHJvcE5hbWUsIG5hbWUpIFwKLSAgICBpZiAocHJvcFR5cGUgPT0gJ04nKSB7IFwKLSAgICAgICBkZWZEYXRhLT53YXJuaW5nTXNnID0gKGNoYXIqKW1hbGxvYyhzdHJsZW4ocHJvcE5hbWUpK3N0cmxlbihuYW1lKSs0MCk7IFwKLSAgICAgICBzcHJpbnRmKGRlZkRhdGEtPndhcm5pbmdNc2csICJUaGUgUHJvcE5hbWUgJXMgaXMgbm90IGRlZmluZWQgZm9yICVzLiIsIFwKLSAgICAgICAgICAgICAgIHByb3BOYW1lLCBuYW1lKTsgXAotICAgICAgIGRlZkRhdGEtPmRlZldhcm5pbmcoNzAxMCwgZGVmRGF0YS0+d2FybmluZ01zZyk7IFwKLSAgICAgICBmcmVlKGRlZkRhdGEtPndhcm5pbmdNc2cpOyBcCi0gICAgfQotCi1pbnQgeXlsZXgoWVlTVFlQRSAqcFl5bHZhbCwgZGVmckRhdGEgKmRlZkRhdGEpCi17Ci0gICAgcmV0dXJuIGRlZkRhdGEtPmRlZnl5bGV4KHBZeWx2YWwpOwotfQotCi0KLXZvaWQgeXllcnJvcihkZWZyRGF0YSAqZGVmRGF0YSwgY29uc3QgY2hhciAqcykKLXsKLSAgICByZXR1cm4gZGVmRGF0YS0+ZGVmeXllcnJvcihzKTsKLX0KLQotCi0KLQotI2RlZmluZSBGSVhFRCAxCi0jZGVmaW5lIENPVkVSIDIKLSNkZWZpbmUgUExBQ0VEIDMKLSNkZWZpbmUgVU5QTEFDRUQgNAotJX0KLQotCi0KLQotCi0KLQotCi0KLQotJXRva2VuIDxzdHJpbmc+ICBRU1RSSU5HCi0ldG9rZW4gPHN0cmluZz4gIFRfU1RSSU5HIFNJVEVfUEFUVEVSTgotJXRva2VuIDxkdmFsPiAgICBOVU1CRVIKLSV0b2tlbiA8a2V5d29yZD4gS19ISVNUT1JZIEtfTkFNRVNDQVNFU0VOU0lUSVZFCi0ldG9rZW4gPGtleXdvcmQ+IEtfREVTSUdOIEtfVklBUyBLX1RFQ0ggS19VTklUUyBLX0FSUkFZIEtfRkxPT1JQTEFOCi0ldG9rZW4gPGtleXdvcmQ+IEtfU0lURSBLX0NBTlBMQUNFIEtfQ0FOTk9UT0NDVVBZIEtfRElFQVJFQQotJXRva2VuIDxrZXl3b3JkPiBLX1BJTlMKLSV0b2tlbiA8a2V5d29yZD4gS19ERUZBVUxUQ0FQIEtfTUlOUElOUyBLX1dJUkVDQVAKLSV0b2tlbiA8a2V5d29yZD4gS19UUkFDS1MgS19HQ0VMTEdSSUQKLSV0b2tlbiA8a2V5d29yZD4gS19ETyBLX0JZIEtfU1RFUCBLX0xBWUVSIEtfUk9XIEtfUkVDVAotJXRva2VuIDxrZXl3b3JkPiBLX0NPTVBTIEtfQ09NUF9HRU4gS19TT1VSQ0UgS19XRUlHSFQgS19FRVFNQVNURVIKLSV0b2tlbiA8a2V5d29yZD4gS19GSVhFRCBLX0NPVkVSIEtfVU5QTEFDRUQgS19QTEFDRUQgS19GT1JFSUdOIEtfUkVHSU9OIAotJXRva2VuIDxrZXl3b3JkPiBLX1JFR0lPTlMKLSV0b2tlbiA8a2V5d29yZD4gS19ORVRTIEtfU1RBUlRfTkVUIEtfTVVTVEpPSU4gS19PUklHSU5BTCBLX1VTRSBLX1NUWUxFCi0ldG9rZW4gPGtleXdvcmQ+IEtfUEFUVEVSTiBLX1BBVFRFUk5OQU1FIEtfRVNUQ0FQIEtfUk9VVEVEIEtfTkVXIAotJXRva2VuIDxrZXl3b3JkPiBLX1NORVRTIEtfU0hBUEUgS19XSURUSCBLX1ZPTFRBR0UgS19TUEFDSU5HIEtfTk9OREVGQVVMVFJVTEUKLSV0b2tlbiA8a2V5d29yZD4gS19OT05ERUZBVUxUUlVMRVMKLSV0b2tlbiA8a2V5d29yZD4gS19OIEtfUyBLX0UgS19XIEtfRk4gS19GRSBLX0ZTIEtfRlcKLSV0b2tlbiA8a2V5d29yZD4gS19HUk9VUFMgS19HUk9VUCBLX1NPRlQgS19NQVhYIEtfTUFYWSBLX01BWEhBTEZQRVJJTUVURVIKLSV0b2tlbiA8a2V5d29yZD4gS19DT05TVFJBSU5UUyBLX05FVCBLX1BBVEggS19TVU0gS19ESUZGIAotJXRva2VuIDxrZXl3b3JkPiBLX1NDQU5DSEFJTlMgS19TVEFSVCBLX0ZMT0FUSU5HIEtfT1JERVJFRCBLX1NUT1AgS19JTiBLX09VVAotJXRva2VuIDxrZXl3b3JkPiBLX1JJU0VNSU4gS19SSVNFTUFYIEtfRkFMTE1JTiBLX0ZBTExNQVggS19XSVJFRExPR0lDCi0ldG9rZW4gPGtleXdvcmQ+IEtfTUFYRElTVAotJXRva2VuIDxrZXl3b3JkPiBLX0FTU0VSVElPTlMKLSV0b2tlbiA8a2V5d29yZD4gS19ESVNUQU5DRSBLX01JQ1JPTlMKLSV0b2tlbiA8a2V5d29yZD4gS19FTkQKLSV0b2tlbiA8a2V5d29yZD4gS19JT1RJTUlOR1MgS19SSVNFIEtfRkFMTCBLX1ZBUklBQkxFIEtfU0xFV1JBVEUgS19DQVBBQ0lUQU5DRQotJXRva2VuIDxrZXl3b3JkPiBLX0RSSVZFQ0VMTCBLX0ZST01QSU4gS19UT1BJTiBLX1BBUkFMTEVMCi0ldG9rZW4gPGtleXdvcmQ+IEtfVElNSU5HRElTQUJMRVMgS19USFJVUElOIEtfTUFDUk8KLSV0b2tlbiA8a2V5d29yZD4gS19QQVJUSVRJT05TIEtfVFVSTk9GRgotJXRva2VuIDxrZXl3b3JkPiBLX0ZST01DTE9DS1BJTiBLX0ZST01DT01QUElOIEtfRlJPTUlPUElOCi0ldG9rZW4gPGtleXdvcmQ+IEtfVE9DTE9DS1BJTiBLX1RPQ09NUFBJTiBLX1RPSU9QSU4KLSV0b2tlbiA8a2V5d29yZD4gS19TRVRVUFJJU0UgS19TRVRVUEZBTEwgS19IT0xEUklTRSBLX0hPTERGQUxMCi0ldG9rZW4gPGtleXdvcmQ+IEtfVlBJTiBLX1NVQk5FVCBLX1hUQUxLIEtfUElOIEtfU1lOVEhFU0laRUQKLSV0b2tlbiA8a2V5d29yZD4gS19ERUZJTkUgS19ERUZJTkVTIEtfREVGSU5FQiBLX0lGIEtfVEhFTiBLX0VMU0UgS19GQUxTRSBLX1RSVUUgCi0ldG9rZW4gPGtleXdvcmQ+IEtfRVEgS19ORSBLX0xFIEtfTFQgS19HRSBLX0dUIEtfT1IgS19BTkQgS19OT1QKLSV0b2tlbiA8a2V5d29yZD4gS19TUEVDSUFMIEtfRElSRUNUSU9OIEtfUkFOR0UKLSV0b2tlbiA8a2V5d29yZD4gS19GUEMgS19IT1JJWk9OVEFMIEtfVkVSVElDQUwgS19BTElHTiBLX01JTiBLX01BWCBLX0VRVUFMCi0ldG9rZW4gPGtleXdvcmQ+IEtfQk9UVE9NTEVGVCBLX1RPUFJJR0hUIEtfUk9XUyBLX1RBUEVSIEtfVEFQRVJSVUxFCi0ldG9rZW4gPGtleXdvcmQ+IEtfVkVSU0lPTiBLX0RJVklERVJDSEFSIEtfQlVTQklUQ0hBUlMKLSV0b2tlbiA8a2V5d29yZD4gS19QUk9QRVJUWURFRklOSVRJT05TIEtfU1RSSU5HIEtfUkVBTCBLX0lOVEVHRVIgS19QUk9QRVJUWQotJXRva2VuIDxrZXl3b3JkPiBLX0JFR0lORVhUIEtfRU5ERVhUIEtfTkFNRU1BUFNUUklORyBLX09OIEtfT0ZGIEtfWCBLX1kKLSV0b2tlbiA8a2V5d29yZD4gS19DT01QT05FTlQgS19NQVNLIEtfTUFTS1NISUZUIEtfQ09NUFNNQVNLU0hJRlQgS19TQU1FTUFTSwotJXRva2VuIDxrZXl3b3JkPiBLX1BJTlBST1BFUlRJRVMgS19URVNUCi0ldG9rZW4gPGtleXdvcmQ+IEtfQ09NTU9OU0NBTlBJTlMgS19TTkVUIEtfQ09NUE9ORU5UUElOIEtfUkVFTlRSQU5UUEFUSFMKLSV0b2tlbiA8a2V5d29yZD4gS19TSElFTEQgS19TSElFTERORVQgS19OT1NISUVMRCBLX1ZJUlRVQUwKLSV0b2tlbiA8a2V5d29yZD4gS19BTlRFTk5BUElOUEFSVElBTE1FVEFMQVJFQSBLX0FOVEVOTkFQSU5QQVJUSUFMTUVUQUxTSURFQVJFQQotJXRva2VuIDxrZXl3b3JkPiBLX0FOVEVOTkFQSU5HQVRFQVJFQSBLX0FOVEVOTkFQSU5ESUZGQVJFQQotJXRva2VuIDxrZXl3b3JkPiBLX0FOVEVOTkFQSU5NQVhBUkVBQ0FSIEtfQU5URU5OQVBJTk1BWFNJREVBUkVBQ0FSCi0ldG9rZW4gPGtleXdvcmQ+IEtfQU5URU5OQVBJTlBBUlRJQUxDVVRBUkVBIEtfQU5URU5OQVBJTk1BWENVVENBUgotJXRva2VuIDxrZXl3b3JkPiBLX1NJR05BTCBLX1BPV0VSIEtfR1JPVU5EIEtfQ0xPQ0sgS19USUVPRkYgS19BTkFMT0cgS19TQ0FOCi0ldG9rZW4gPGtleXdvcmQ+IEtfUkVTRVQgS19SSU5HIEtfU1RSSVBFIEtfRk9MTE9XUElOIEtfSU9XSVJFIEtfQ09SRVdJUkUKLSV0b2tlbiA8a2V5d29yZD4gS19CTE9DS1dJUkUgS19GSUxMV0lSRSBLX0JMT0NLQUdFV0lSRSBLX1BBRFJJTkcgS19CTE9DS1JJTkcKLSV0b2tlbiA8a2V5d29yZD4gS19CTE9DS0FHRVMgS19QTEFDRU1FTlQgS19TTE9UUyBLX0ZJTExTIEtfUFVTSERPV04KLSV0b2tlbiA8a2V5d29yZD4gS19ORVRMSVNUIEtfRElTVCBLX1VTRVIgS19USU1JTkcgS19CQUxBTkNFRCBLX1NURUlORVIgS19UUlVOSwotJXRva2VuIDxrZXl3b3JkPiBLX0ZJWEVEQlVNUCBLX0ZFTkNFIEtfRlJFUVVFTkNZIEtfR1VJREUgS19NQVhCSVRTCi0ldG9rZW4gPGtleXdvcmQ+IEtfUEFSVElUSU9OIEtfVFlQRSBLX0FOVEVOTkFNT0RFTCBLX0RSQ0ZJTEwKLSV0b2tlbiA8a2V5d29yZD4gS19PWElERTEgS19PWElERTIgS19PWElERTMgS19PWElERTQKLSV0b2tlbiA8a2V5d29yZD4gS19DVVRTSVpFIEtfQ1VUU1BBQ0lORyBLX0RFU0lHTlJVTEVXSURUSCBLX0RJQUdXSURUSAotJXRva2VuIDxrZXl3b3JkPiBLX0VOQ0xPU1VSRSBLX0hBTE8gS19HUk9VTkRTRU5TSVRJVklUWQotJXRva2VuIDxrZXl3b3JkPiBLX0hBUkRTUEFDSU5HIEtfTEFZRVJTIEtfTUlOQ1VUUyBLX05FVEVYUFIgCi0ldG9rZW4gPGtleXdvcmQ+IEtfT0ZGU0VUIEtfT1JJR0lOIEtfUk9XQ09MIEtfU1RZTEVTCi0ldG9rZW4gPGtleXdvcmQ+IEtfUE9MWUdPTiBLX1BPUlQgS19TVVBQTFlTRU5TSVRJVklUWSBLX1ZJQSBLX1ZJQVJVTEUgS19XSVJFRVhUCi0ldG9rZW4gPGtleXdvcmQ+IEtfRVhDRVBUUEdORVQgS19GSUxMV0lSRU9QQyBLX09QQyBLX1BBUlRJQUwgS19ST1VURUhBTE8KLSV0eXBlIDxwdD4gICAgICBwdCBvcHRfcGFyZW4KLSV0eXBlIDxpbnRlZ2VyPiBjb21wX25ldF9saXN0IHN1Ym5ldF9vcHRfc3luCi0ldHlwZSA8aW50ZWdlcj4gb3JpZW50IHBpbl92aWFfbWFza19vcHQKLSV0eXBlIDxpbnRlZ2VyPiBwbGFjZW1lbnRfc3RhdHVzCi0ldHlwZSA8c3RyaW5nPiAgbmV0X3R5cGUgc3VibmV0X3R5cGUgdHJhY2tfc3RhcnQgdXNlX3R5cGUgc2hhcGVfdHlwZSBzb3VyY2VfdHlwZQotJXR5cGUgPHN0cmluZz4gIHBhdHRlcm5fdHlwZSBuZXRzb3VyY2VfdHlwZQotJXR5cGUgPHRrPiAgICAgIHBhdGggcGF0aHMgbmV3X3BhdGgKLSV0eXBlIDxzdHJpbmc+ICByaXNlZmFsbCBvcHRfcGluIG9wdF9wYXR0ZXJuIHBpbl9sYXllcl9vcHQKLSV0eXBlIDxzdHJpbmc+ICB2cGluX3N0YXR1cyBvcHRfcGx1cyB0cmFja190eXBlIHJlZ2lvbl90eXBlCi0ldHlwZSA8c3RyaW5nPiAgaF9vcl92IHR1cm5vZmZfc2V0dXAgdHVybm9mZl9ob2xkCi0ldHlwZSA8aW50ZWdlcj4gY29ubl9vcHQgcGFydGl0aW9uX21heGJpdHMgc2FtZV9tYXNrIG1hc2sgb3JpZW50X3B0Ci0KLSUlCi0KLWRlZl9maWxlOiB2ZXJzaW9uX3N0bXQgY2FzZV9zZW5zX3N0bXQgcnVsZXMgZW5kX2Rlc2lnbgotICAgICAgICAgICAgOwotCi12ZXJzaW9uX3N0bXQ6ICAvLyBlbXB0eSAKLSAgICB8IEtfVkVSU0lPTiB7IGRlZkRhdGEtPmR1bWJfbW9kZSA9IDE7IGRlZkRhdGEtPm5vX251bSA9IDE7IH0gVF9TVFJJTkcgJzsnCi0gICAgICB7Ci0gICAgICAgIGRlZkRhdGEtPlZlcnNpb25OdW0gPSBkZWZyRGF0YTo6Y29udmVydF9kZWZuYW1lMm51bSgkMyk7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5WZXJzaW9uTnVtID4gQ1VSUkVOVF9WRVJTSU9OKSB7Ci0gICAgICAgICAgY2hhciB0ZW1wWzMwMF07Ci0gICAgICAgICAgc3ByaW50Zih0ZW1wLAotICAgICAgICAgICJUaGUgZXhlY3V0aW9uIGhhcyBiZWVuIHN0b3BwZWQgYmVjYXVzZSB0aGUgREVGIHBhcnNlciAlLjFmIGRvZXMgbm90IHN1cHBvcnQgREVGIGZpbGUgd2l0aCB2ZXJzaW9uICVzLlxuVXBkYXRlIHlvdXIgREVGIGZpbGUgdG8gdmVyc2lvbiA1Ljggb3IgZWFybGllci4iLAotICAgICAgICAgICAgICAgICAgQ1VSUkVOVF9WRVJTSU9OLCAkMyk7Ci0gICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNjUwMywgdGVtcCk7Ci0gICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+VmVyc2lvblN0ckNiaykgewotICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+VmVyc2lvblN0ckNiaywgZGVmclZlcnNpb25TdHJDYmtUeXBlLCAkMyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5WZXJzaW9uQ2JrKSB7Ci0gICAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPlZlcnNpb25DYmssIGRlZnJWZXJzaW9uQ2JrVHlwZSwgZGVmRGF0YS0+VmVyc2lvbk51bSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPiA1LjMgJiYgZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuNCkKLSAgICAgICAgICBkZWZEYXRhLT5kZWZJZ25vcmVWZXJzaW9uID0gMTsKLSAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjYpICAgICAvLyBkZWZhdWx0IHRvIGZhbHNlIGJlZm9yZSA1LjYKLSAgICAgICAgICBkZWZEYXRhLT5uYW1lc19jYXNlX3NlbnNpdGl2ZSA9IGRlZkRhdGEtPnNlc3Npb24tPnJlYWRlcl9jYXNlX3NlbnNpdGl2ZTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGRlZkRhdGEtPm5hbWVzX2Nhc2Vfc2Vuc2l0aXZlID0gMTsKLSAgICAgICAgZGVmRGF0YS0+aGFzVmVyID0gMTsKLSAgICAgICAgZGVmRGF0YS0+ZG9uZURlc2lnbiA9IDA7Ci0gICAgfQotCi1jYXNlX3NlbnNfc3RtdDogLy8gZW1wdHkgCi0gICAgfCBLX05BTUVTQ0FTRVNFTlNJVElWRSBLX09OICc7JwotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuNikgewotICAgICAgICAgIGRlZkRhdGEtPm5hbWVzX2Nhc2Vfc2Vuc2l0aXZlID0gMTsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5DYXNlU2Vuc2l0aXZlQ2JrKQotICAgICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5DYXNlU2Vuc2l0aXZlQ2JrLCBkZWZyQ2FzZVNlbnNpdGl2ZUNia1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICBkZWZEYXRhLT5uYW1lc19jYXNlX3NlbnNpdGl2ZSk7IAotICAgICAgICAgIGRlZkRhdGEtPmhhc05hbWVDYXNlID0gMTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+Q2FzZVNlbnNpdGl2ZUNiaykgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYXNlU2Vuc2l0aXZlV2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5DYXNlU2Vuc2l0aXZlV2FybmluZ3MpCi0gICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZXYXJuaW5nKDcwMTEsICJUaGUgTkFNRVNDQVNFU0VOU0lUSVZFIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5UaGUgREVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC4iKTsKLSAgICAgIH0KLSAgICB8IEtfTkFNRVNDQVNFU0VOU0lUSVZFIEtfT0ZGICc7JwotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuNikgewotICAgICAgICAgIGRlZkRhdGEtPm5hbWVzX2Nhc2Vfc2Vuc2l0aXZlID0gMDsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5DYXNlU2Vuc2l0aXZlQ2JrKQotICAgICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5DYXNlU2Vuc2l0aXZlQ2JrLCBkZWZyQ2FzZVNlbnNpdGl2ZUNia1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICBkZWZEYXRhLT5uYW1lc19jYXNlX3NlbnNpdGl2ZSk7Ci0gICAgICAgICAgZGVmRGF0YS0+aGFzTmFtZUNhc2UgPSAxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkNhc2VTZW5zaXRpdmVDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhc2VTZW5zaXRpdmVXYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPkNhc2VTZW5zaXRpdmVXYXJuaW5ncykgewotICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTA0LCAiRGVmIHBhcnNlciB2ZXJzaW9uIDUuNyBhbmQgbGF0ZXIgZG9lcyBub3Qgc3VwcG9ydCBOQU1FU0NBU0VTRU5TSVRJVkUgT0ZGLlxuRWl0aGVyIHJlbW92ZSB0aGlzIG9wdGlvbmFsIGNvbnN0cnVjdCBvciBzZXQgaXQgdG8gT04uIik7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi1ydWxlczogLy8gZW1wdHkgCi0gICAgICAgIHwgcnVsZXMgcnVsZQotICAgICAgICB8IGVycm9yIAotICAgICAgICAgICAgOwotCi1ydWxlOiBkZXNpZ25fc2VjdGlvbiB8IGFzc2VydGlvbnNfc2VjdGlvbiB8IGJsb2NrYWdlX3NlY3Rpb24gfCBjb21wc19zZWN0aW9uCi0gICAgICB8IGNvbnN0cmFpbnRfc2VjdGlvbiB8IGV4dGVuc2lvbl9zZWN0aW9uIHwgZmlsbF9zZWN0aW9uIHwgY29tcHNfbWFza1NoaWZ0X3NlY3Rpb24KLSAgICAgIHwgZmxvb3JwbGFuX2NvbnRyYWludHNfc2VjdGlvbiB8IGdyb3Vwc19zZWN0aW9uIHwgaW90aW1pbmdfc2VjdGlvbgotICAgICAgfCBuZXRzX3NlY3Rpb24gfCAgbm9uZGVmYXVsdHJ1bGVfc2VjdGlvbiB8IHBhcnRpdGlvbnNfc2VjdGlvbgotICAgICAgfCBwaW5fcHJvcHNfc2VjdGlvbiB8IHJlZ2lvbnNfc2VjdGlvbiB8IHNjYW5jaGFpbnNfc2VjdGlvbgotICAgICAgfCBzbG90X3NlY3Rpb24gfCBzbmV0c19zZWN0aW9uIHwgc3R5bGVzX3NlY3Rpb24gfCB0aW1pbmdkaXNhYmxlc19zZWN0aW9uCi0gICAgICB8IHZpYV9zZWN0aW9uCi0gICAgICAgICAgICA7Ci0KLWRlc2lnbl9zZWN0aW9uOiBhcnJheV9uYW1lIHwgYnVzX2JpdF9jaGFycyB8IGNhbnBsYWNlIHwgY2Fubm90b2NjdXB5IHwKLSAgICAgICAgICAgICAgZGVzaWduX25hbWUgfCBkaWVfYXJlYSB8IGRpdmlkZXJfY2hhciB8IAotICAgICAgICAgICAgICBmbG9vcnBsYW5fbmFtZSB8IGdjZWxsZ3JpZCB8IGhpc3RvcnkgfAotICAgICAgICAgICAgICBwaW5fY2FwX3J1bGUgfCBwaW5fcnVsZSB8IHByb3BfZGVmX3NlY3Rpb24gfAotICAgICAgICAgICAgICByb3dfcnVsZSB8IHRlY2hfbmFtZSB8IHRyYWNrc19ydWxlIHwgdW5pdHMKLSAgICAgICAgICAgIDsKLQotCi0KLWRlc2lnbl9uYW1lOiBLX0RFU0lHTiB7ZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTsgZGVmRGF0YS0+bm9fbnVtID0gMTsgfSBUX1NUUklORyAnOycgCi0gICAgICB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5EZXNpZ25DYmspCi0gICAgICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+RGVzaWduQ2JrLCBkZWZyRGVzaWduU3RhcnRDYmtUeXBlLCAkMyk7Ci0gICAgICAgICAgICBkZWZEYXRhLT5oYXNEZXMgPSAxOwotICAgICAgICAgIH0KLQotZW5kX2Rlc2lnbjogS19FTkQgS19ERVNJR04KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBkZWZEYXRhLT5kb25lRGVzaWduID0gMTsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkRlc2lnbkVuZENiaykKLSAgICAgICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5EZXNpZ25FbmRDYmssIGRlZnJEZXNpZ25FbmRDYmtUeXBlLCAwKTsKLSAgICAgICAgICAgIC8vIDExLzE2LzIwMDEgLSBwY3IgNDA4MzM0Ci0gICAgICAgICAgICAvLyBSZXR1cm4gMSBpZiB0aGVyZSBpcyBhbnkgZGVmRGF0YS0+ZXJyb3JzIGR1cmluZyBwYXJzaW5nCi0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+ZXJyb3JzKQotICAgICAgICAgICAgICAgIHJldHVybiAxOwotCi0gICAgICAgICAgICBpZiAoIWRlZkRhdGEtPmhhc1ZlcikgewotICAgICAgICAgICAgICBjaGFyIHRlbXBbMzAwXTsKLSAgICAgICAgICAgICAgc3ByaW50Zih0ZW1wLCAiTm8gVkVSU0lPTiBzdGF0ZW1lbnQgZm91bmQsIHVzaW5nIHRoZSBkZWZhdWx0IHZhbHVlICUyZy4iLCBkZWZEYXRhLT5WZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmV2FybmluZyg3MDEyLCB0ZW1wKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZGVmRGF0YS0+aGFzTmFtZUNhc2UgJiYgZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuNikKLSAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmV2FybmluZyg3MDEzLCAiVGhlIERFRiBmaWxlIGlzIGludmFsaWQgaWYgTkFNRVNDQVNFU0VOU0lUSVZFIGlzIHVuZGVmaW5lZC5cbk5BTUVTQ0FTRVNFTlNJVElWRSBpcyBhIG1hbmRhdG9yeSBzdGF0ZW1lbnQgaW4gdGhlIERFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjYgYW5kIGVhcmxpZXIuXG5UbyBkZWZpbmUgdGhlIE5BTUVTQ0FTRVNFTlNJVElWRSBzdGF0ZW1lbnQsIHJlZmVyIHRvIHRoZSBMRUYvREVGIDUuNSBhbmQgZWFybGllciBMYW5ndWFnZSBSZWZlcmVuY2UgbWFudWFsLiIpOwotICAgICAgICAgICAgaWYgKCFkZWZEYXRhLT5oYXNCdXNCaXQgJiYgZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuNikKLSAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmV2FybmluZyg3MDE0LCAiVGhlIERFRiBmaWxlIGlzIGludmFsaWQgaWYgQlVTQklUQ0hBUlMgaXMgdW5kZWZpbmVkLlxuQlVTQklUQ0hBUlMgaXMgYSBtYW5kYXRvcnkgc3RhdGVtZW50IGluIHRoZSBERUYgZmlsZSB3aXRoIHZlcnNpb24gNS42IGFuZCBlYXJsaWVyLlxuVG8gZGVmaW5lIHRoZSBCVVNCSVRDSEFSUyBzdGF0ZW1lbnQsIHJlZmVyIHRvIHRoZSBMRUYvREVGIDUuNSBhbmQgZWFybGllciBMYW5ndWFnZSBSZWZlcmVuY2UgbWFudWFsLiIpOwotICAgICAgICAgICAgaWYgKCFkZWZEYXRhLT5oYXNEaXZDaGFyICYmIGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjYpCi0gICAgICAgICAgICAgIGRlZkRhdGEtPmRlZldhcm5pbmcoNzAxNSwgIlRoZSBERUYgZmlsZSBpcyBpbnZhbGlkIGlmIERJVklERVJDSEFSIGlzIHVuZGVmaW5lZC5cbkRJVklERVJDSEFSIGlzIGEgbWFuZGF0b3J5IHN0YXRlbWVudCBpbiB0aGUgREVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNiBhbmQgZWFybGllci5cblRvIGRlZmluZSB0aGUgRElWSURFUkNIQVIgc3RhdGVtZW50LCByZWZlciB0byB0aGUgTEVGL0RFRiA1LjUgYW5kIGVhcmxpZXIgTGFuZ3VhZ2UgUmVmZXJlbmNlIG1hbnVhbC4iKTsKLSAgICAgICAgICAgIGlmICghZGVmRGF0YS0+aGFzRGVzKQotICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZXYXJuaW5nKDcwMTYsICJERVNJR04gaXMgYSBtYW5kYXRvcnkgc3RhdGVtZW50IGluIHRoZSBERUYgZmlsZS4gRW5zdXJlIHRoYXQgaXQgZXhpc3RzIGluIHRoZSBmaWxlLiIpOwotICAgICAgICAgIH0KLQotdGVjaF9uYW1lOiBLX1RFQ0ggeyBkZWZEYXRhLT5kdW1iX21vZGUgPSAxOyBkZWZEYXRhLT5ub19udW0gPSAxOyB9IFRfU1RSSU5HICc7JwotICAgICAgICAgIHsgCi0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5UZWNobm9sb2d5Q2JrKQotICAgICAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPlRlY2hub2xvZ3lDYmssIGRlZnJUZWNoTmFtZUNia1R5cGUsICQzKTsKLSAgICAgICAgICB9Ci0KLWFycmF5X25hbWU6IEtfQVJSQVkge2RlZkRhdGEtPmR1bWJfbW9kZSA9IDE7IGRlZkRhdGEtPm5vX251bSA9IDE7fSBUX1NUUklORyAnOycKLSAgICAgICAgICB7IAotICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+QXJyYXlOYW1lQ2JrKQotICAgICAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPkFycmF5TmFtZUNiaywgZGVmckFycmF5TmFtZUNia1R5cGUsICQzKTsKLSAgICAgICAgICB9Ci0KLWZsb29ycGxhbl9uYW1lOiBLX0ZMT09SUExBTiB7IGRlZkRhdGEtPmR1bWJfbW9kZSA9IDE7IGRlZkRhdGEtPm5vX251bSA9IDE7IH0gVF9TVFJJTkcgJzsnCi0gICAgICAgICAgeyAKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkZsb29yUGxhbk5hbWVDYmspCi0gICAgICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+Rmxvb3JQbGFuTmFtZUNiaywgZGVmckZsb29yUGxhbk5hbWVDYmtUeXBlLCAkMyk7Ci0gICAgICAgICAgfQotCi1oaXN0b3J5OiBLX0hJU1RPUlkKLSAgICAgICAgICB7IAotICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+SGlzdG9yeUNiaykKLSAgICAgICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5IaXN0b3J5Q2JrLCBkZWZySGlzdG9yeUNia1R5cGUsICZkZWZEYXRhLT5IaXN0b3J5X3RleHRbMF0pOwotICAgICAgICAgIH0KLQotcHJvcF9kZWZfc2VjdGlvbjogS19QUk9QRVJUWURFRklOSVRJT05TCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UHJvcERlZlN0YXJ0Q2JrKQotICAgICAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPlByb3BEZWZTdGFydENiaywgZGVmclByb3BEZWZTdGFydENia1R5cGUsIDApOwotICAgICAgICAgIH0KLSAgICBwcm9wZXJ0eV9kZWZzIEtfRU5EIEtfUFJPUEVSVFlERUZJTklUSU9OUwotICAgICAgICAgIHsgCi0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Qcm9wRGVmRW5kQ2JrKQotICAgICAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPlByb3BEZWZFbmRDYmssIGRlZnJQcm9wRGVmRW5kQ2JrVHlwZSwgMCk7Ci0gICAgICAgICAgICBkZWZEYXRhLT5yZWFsX251bSA9IDA7ICAgICAvLyBqdXN0IHdhbnQgdG8gbWFrZSBzdXJlIGl0IGlzIHJlc2V0IAotICAgICAgICAgIH0KLQotcHJvcGVydHlfZGVmczogLy8gZW1wdHkgCi0gICAgICAgIHwgcHJvcGVydHlfZGVmcyBwcm9wZXJ0eV9kZWYKLSAgICAgICAgICAgIHsgfQotCi1wcm9wZXJ0eV9kZWY6IEtfREVTSUdOIHtkZWZEYXRhLT5kdW1iX21vZGUgPSAxOyBkZWZEYXRhLT5ub19udW0gPSAxOyBkZWZEYXRhLT5Qcm9wLmNsZWFyKCk7IH0KLSAgICAgICAgICAgICAgVF9TVFJJTkcgcHJvcGVydHlfdHlwZV9hbmRfdmFsICc7JyAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UHJvcENiaykgewotICAgICAgICAgICAgICAgIGRlZkRhdGEtPlByb3Auc2V0UHJvcFR5cGUoImRlc2lnbiIsICQzKTsKLSAgICAgICAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPlByb3BDYmssIGRlZnJQcm9wQ2JrVHlwZSwgJmRlZkRhdGEtPlByb3ApOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGRlZkRhdGEtPnNlc3Npb24tPkRlc2lnblByb3Auc2V0UHJvcFR5cGUoZGVmRGF0YS0+REVGQ0FTRSgkMyksIGRlZkRhdGEtPmRlZlByb3BEZWZUeXBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfCBLX05FVCB7IGRlZkRhdGEtPmR1bWJfbW9kZSA9IDEgOyBkZWZEYXRhLT5ub19udW0gPSAxOyBkZWZEYXRhLT5Qcm9wLmNsZWFyKCk7IH0KLSAgICAgICAgICBUX1NUUklORyBwcm9wZXJ0eV90eXBlX2FuZF92YWwgJzsnCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlByb3BDYmspIHsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT5Qcm9wLnNldFByb3BUeXBlKCJuZXQiLCAkMyk7Ci0gICAgICAgICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5Qcm9wQ2JrLCBkZWZyUHJvcENia1R5cGUsICZkZWZEYXRhLT5Qcm9wKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBkZWZEYXRhLT5zZXNzaW9uLT5OZXRQcm9wLnNldFByb3BUeXBlKGRlZkRhdGEtPkRFRkNBU0UoJDMpLCBkZWZEYXRhLT5kZWZQcm9wRGVmVHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIHwgS19TTkVUIHsgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMSA7IGRlZkRhdGEtPm5vX251bSA9IDE7IGRlZkRhdGEtPlByb3AuY2xlYXIoKTsgfQotICAgICAgICAgIFRfU1RSSU5HIHByb3BlcnR5X3R5cGVfYW5kX3ZhbCAnOycKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UHJvcENiaykgewotICAgICAgICAgICAgICAgIGRlZkRhdGEtPlByb3Auc2V0UHJvcFR5cGUoInNwZWNpYWxuZXQiLCAkMyk7Ci0gICAgICAgICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5Qcm9wQ2JrLCBkZWZyUHJvcENia1R5cGUsICZkZWZEYXRhLT5Qcm9wKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBkZWZEYXRhLT5zZXNzaW9uLT5TTmV0UHJvcC5zZXRQcm9wVHlwZShkZWZEYXRhLT5ERUZDQVNFKCQzKSwgZGVmRGF0YS0+ZGVmUHJvcERlZlR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICB8IEtfUkVHSU9OIHsgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMSA7IGRlZkRhdGEtPm5vX251bSA9IDE7IGRlZkRhdGEtPlByb3AuY2xlYXIoKTsgfQotICAgICAgICAgIFRfU1RSSU5HIHByb3BlcnR5X3R5cGVfYW5kX3ZhbCAnOycKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UHJvcENiaykgewotICAgICAgICAgICAgICAgIGRlZkRhdGEtPlByb3Auc2V0UHJvcFR5cGUoInJlZ2lvbiIsICQzKTsKLSAgICAgICAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPlByb3BDYmssIGRlZnJQcm9wQ2JrVHlwZSwgJmRlZkRhdGEtPlByb3ApOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGRlZkRhdGEtPnNlc3Npb24tPlJlZ2lvblByb3Auc2V0UHJvcFR5cGUoZGVmRGF0YS0+REVGQ0FTRSgkMyksIGRlZkRhdGEtPmRlZlByb3BEZWZUeXBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfCBLX0dST1VQIHsgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMSA7IGRlZkRhdGEtPm5vX251bSA9IDE7IGRlZkRhdGEtPlByb3AuY2xlYXIoKTsgfQotICAgICAgICAgIFRfU1RSSU5HIHByb3BlcnR5X3R5cGVfYW5kX3ZhbCAnOycKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UHJvcENiaykgewotICAgICAgICAgICAgICAgIGRlZkRhdGEtPlByb3Auc2V0UHJvcFR5cGUoImdyb3VwIiwgJDMpOwotICAgICAgICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+UHJvcENiaywgZGVmclByb3BDYmtUeXBlLCAmZGVmRGF0YS0+UHJvcCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZGVmRGF0YS0+c2Vzc2lvbi0+R3JvdXBQcm9wLnNldFByb3BUeXBlKGRlZkRhdGEtPkRFRkNBU0UoJDMpLCBkZWZEYXRhLT5kZWZQcm9wRGVmVHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIHwgS19DT01QT05FTlQgeyBkZWZEYXRhLT5kdW1iX21vZGUgPSAxIDsgZGVmRGF0YS0+bm9fbnVtID0gMTsgZGVmRGF0YS0+UHJvcC5jbGVhcigpOyB9Ci0gICAgICAgICAgVF9TVFJJTkcgcHJvcGVydHlfdHlwZV9hbmRfdmFsICc7JwotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Qcm9wQ2JrKSB7Ci0gICAgICAgICAgICAgICAgZGVmRGF0YS0+UHJvcC5zZXRQcm9wVHlwZSgiY29tcG9uZW50IiwgJDMpOwotICAgICAgICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+UHJvcENiaywgZGVmclByb3BDYmtUeXBlLCAmZGVmRGF0YS0+UHJvcCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZGVmRGF0YS0+c2Vzc2lvbi0+Q29tcFByb3Auc2V0UHJvcFR5cGUoZGVmRGF0YS0+REVGQ0FTRSgkMyksIGRlZkRhdGEtPmRlZlByb3BEZWZUeXBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfCBLX1JPVyB7IGRlZkRhdGEtPmR1bWJfbW9kZSA9IDEgOyBkZWZEYXRhLT5ub19udW0gPSAxOyBkZWZEYXRhLT5Qcm9wLmNsZWFyKCk7IH0KLSAgICAgICAgICBUX1NUUklORyBwcm9wZXJ0eV90eXBlX2FuZF92YWwgJzsnCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlByb3BDYmspIHsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT5Qcm9wLnNldFByb3BUeXBlKCJyb3ciLCAkMyk7Ci0gICAgICAgICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5Qcm9wQ2JrLCBkZWZyUHJvcENia1R5cGUsICZkZWZEYXRhLT5Qcm9wKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBkZWZEYXRhLT5zZXNzaW9uLT5Sb3dQcm9wLnNldFByb3BUeXBlKGRlZkRhdGEtPkRFRkNBU0UoJDMpLCBkZWZEYXRhLT5kZWZQcm9wRGVmVHlwZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfCBLX0NPTVBPTkVOVFBJTgotICAgICAgICAgIHsgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMSA7IGRlZkRhdGEtPm5vX251bSA9IDE7IGRlZkRhdGEtPlByb3AuY2xlYXIoKTsgfQotICAgICAgICAgIFRfU1RSSU5HIHByb3BlcnR5X3R5cGVfYW5kX3ZhbCAnOycKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UHJvcENiaykgewotICAgICAgICAgICAgICAgIGRlZkRhdGEtPlByb3Auc2V0UHJvcFR5cGUoImNvbXBvbmVudHBpbiIsICQzKTsKLSAgICAgICAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPlByb3BDYmssIGRlZnJQcm9wQ2JrVHlwZSwgJmRlZkRhdGEtPlByb3ApOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGRlZkRhdGEtPnNlc3Npb24tPkNvbXBQaW5Qcm9wLnNldFByb3BUeXBlKGRlZkRhdGEtPkRFRkNBU0UoJDMpLCBkZWZEYXRhLT5kZWZQcm9wRGVmVHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIHwgS19OT05ERUZBVUxUUlVMRQotICAgICAgICAgIHsgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMSA7IGRlZkRhdGEtPm5vX251bSA9IDE7IGRlZkRhdGEtPlByb3AuY2xlYXIoKTsgfQotICAgICAgICAgIFRfU1RSSU5HIHByb3BlcnR5X3R5cGVfYW5kX3ZhbCAnOycKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjYpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+bm9uRGVmYXVsdFdhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+Tm9uRGVmYXVsdFdhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZNc2cgPSAoY2hhciopbWFsbG9jKDEwMDApOyAKLSAgICAgICAgICAgICAgICAgIHNwcmludGYgKGRlZkRhdGEtPmRlZk1zZywKLSAgICAgICAgICAgICAgICAgICAgICJUaGUgTk9OREVGQVVMVFJVTEUgc3RhdGVtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGRlZkRhdGEtPlZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNjUwNSwgZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICAgIGZyZWUoZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Qcm9wQ2JrKSB7Ci0gICAgICAgICAgICAgICAgICBkZWZEYXRhLT5Qcm9wLnNldFByb3BUeXBlKCJub25kZWZhdWx0cnVsZSIsICQzKTsKLSAgICAgICAgICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+UHJvcENiaywgZGVmclByb3BDYmtUeXBlLCAmZGVmRGF0YS0+UHJvcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlZkRhdGEtPnNlc3Npb24tPk5EZWZQcm9wLnNldFByb3BUeXBlKGRlZkRhdGEtPkRFRkNBU0UoJDMpLCBkZWZEYXRhLT5kZWZQcm9wRGVmVHlwZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfCBlcnJvciAnOycgeyB5eWVycm9rOyB5eWNsZWFyaW47fTsKLQotcHJvcGVydHlfdHlwZV9hbmRfdmFsOiBLX0lOVEVHRVIgeyBkZWZEYXRhLT5yZWFsX251bSA9IDA7IH0gb3B0X3JhbmdlIG9wdF9udW1fdmFsCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlByb3BDYmspIGRlZkRhdGEtPlByb3Auc2V0UHJvcEludGVnZXIoKTsKLSAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmUHJvcERlZlR5cGUgPSAnSSc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIHwgS19SRUFMIHsgZGVmRGF0YS0+cmVhbF9udW0gPSAxOyB9IG9wdF9yYW5nZSBvcHRfbnVtX3ZhbAotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Qcm9wQ2JrKSBkZWZEYXRhLT5Qcm9wLnNldFByb3BSZWFsKCk7Ci0gICAgICAgICAgICAgIGRlZkRhdGEtPmRlZlByb3BEZWZUeXBlID0gJ1InOwotICAgICAgICAgICAgICBkZWZEYXRhLT5yZWFsX251bSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIHwgS19TVFJJTkcKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UHJvcENiaykgZGVmRGF0YS0+UHJvcC5zZXRQcm9wU3RyaW5nKCk7Ci0gICAgICAgICAgICAgIGRlZkRhdGEtPmRlZlByb3BEZWZUeXBlID0gJ1MnOwotICAgICAgICAgICAgfQotICAgICAgICB8IEtfU1RSSU5HIFFTVFJJTkcKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UHJvcENiaykgZGVmRGF0YS0+UHJvcC5zZXRQcm9wUVN0cmluZygkMik7Ci0gICAgICAgICAgICAgIGRlZkRhdGEtPmRlZlByb3BEZWZUeXBlID0gJ1EnOwotICAgICAgICAgICAgfQotICAgICAgICB8IEtfTkFNRU1BUFNUUklORyBUX1NUUklORwotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Qcm9wQ2JrKSBkZWZEYXRhLT5Qcm9wLnNldFByb3BOYW1lTWFwU3RyaW5nKCQyKTsKLSAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmUHJvcERlZlR5cGUgPSAnUyc7Ci0gICAgICAgICAgICB9Ci0KLW9wdF9udW1fdmFsOiAvLyBlbXB0eSAKLSAgICAgICAgfCBOVU1CRVIKLSAgICAgICAgICAgIHsgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UHJvcENiaykgZGVmRGF0YS0+UHJvcC5zZXROdW1iZXIoJDEpOyB9Ci0KLXVuaXRzOiBLX1VOSVRTIEtfRElTVEFOQ0UgS19NSUNST05TIE5VTUJFUiAnOycKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Vbml0c0NiaykgewotICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+ZGVmVmFsaWROdW0oKGludCkkNCkpCi0gICAgICAgICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5Vbml0c0NiaywgIGRlZnJVbml0c0Nia1R5cGUsICQ0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLWRpdmlkZXJfY2hhcjogS19ESVZJREVSQ0hBUiBRU1RSSU5HICc7JwotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkRpdmlkZXJDYmspCi0gICAgICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+RGl2aWRlckNiaywgZGVmckRpdmlkZXJDYmtUeXBlLCAkMik7Ci0gICAgICAgICAgICBkZWZEYXRhLT5oYXNEaXZDaGFyID0gMTsKLSAgICAgICAgICB9Ci0KLWJ1c19iaXRfY2hhcnM6IEtfQlVTQklUQ0hBUlMgUVNUUklORyAnOycKLSAgICAgICAgICB7IAotICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+QnVzQml0Q2JrKQotICAgICAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPkJ1c0JpdENiaywgZGVmckJ1c0JpdENia1R5cGUsICQyKTsKLSAgICAgICAgICAgIGRlZkRhdGEtPmhhc0J1c0JpdCA9IDE7Ci0gICAgICAgICAgfQotCi1jYW5wbGFjZTogS19DQU5QTEFDRSB7ZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTtkZWZEYXRhLT5ub19udW0gPSAxOyB9IFRfU1RSSU5HIE5VTUJFUiBOVU1CRVIKLSAgICAgICAgICAgIG9yaWVudCBLX0RPIE5VTUJFUiAgS19CWSBOVU1CRVIgIEtfU1RFUCBOVU1CRVIgTlVNQkVSICc7JyAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+Q2FucGxhY2VDYmspIHsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT5DYW5wbGFjZS5zZXROYW1lKCQzKTsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT5DYW5wbGFjZS5zZXRMb2NhdGlvbigkNCwkNSk7Ci0gICAgICAgICAgICAgICAgZGVmRGF0YS0+Q2FucGxhY2Uuc2V0T3JpZW50KCQ2KTsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT5DYW5wbGFjZS5zZXREbygkOCwkMTAsJDEyLCQxMyk7Ci0gICAgICAgICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5DYW5wbGFjZUNiaywgZGVmckNhbnBsYWNlQ2JrVHlwZSwKLSAgICAgICAgICAgICAgICAmKGRlZkRhdGEtPkNhbnBsYWNlKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLWNhbm5vdG9jY3VweTogS19DQU5OT1RPQ0NVUFkge2RlZkRhdGEtPmR1bWJfbW9kZSA9IDE7ZGVmRGF0YS0+bm9fbnVtID0gMTsgfSBUX1NUUklORyBOVU1CRVIgTlVNQkVSCi0gICAgICAgICAgICBvcmllbnQgS19ETyBOVU1CRVIgIEtfQlkgTlVNQkVSICBLX1NURVAgTlVNQkVSIE5VTUJFUiAnOycgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkNhbm5vdE9jY3VweUNiaykgewotICAgICAgICAgICAgICAgIGRlZkRhdGEtPkNhbm5vdE9jY3VweS5zZXROYW1lKCQzKTsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT5DYW5ub3RPY2N1cHkuc2V0TG9jYXRpb24oJDQsJDUpOwotICAgICAgICAgICAgICAgIGRlZkRhdGEtPkNhbm5vdE9jY3VweS5zZXRPcmllbnQoJDYpOwotICAgICAgICAgICAgICAgIGRlZkRhdGEtPkNhbm5vdE9jY3VweS5zZXREbygkOCwkMTAsJDEyLCQxMyk7Ci0gICAgICAgICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5DYW5ub3RPY2N1cHlDYmssIGRlZnJDYW5ub3RPY2N1cHlDYmtUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgJihkZWZEYXRhLT5DYW5ub3RPY2N1cHkpKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi1vcmllbnQ6IEtfTiAgICB7JCQgPSAwO30KLSAgICAgICAgfCBLX1cgIHskJCA9IDE7fQotICAgICAgICB8IEtfUyAgeyQkID0gMjt9Ci0gICAgICAgIHwgS19FICB7JCQgPSAzO30KLSAgICAgICAgfCBLX0ZOIHskJCA9IDQ7fQotICAgICAgICB8IEtfRlcgeyQkID0gNTt9Ci0gICAgICAgIHwgS19GUyB7JCQgPSA2O30KLSAgICAgICAgfCBLX0ZFIHskJCA9IDc7fQotCi1kaWVfYXJlYTogS19ESUVBUkVBCi0gICAgICAgICAgewotICAgICAgICAgICAgZGVmRGF0YS0+R2VvbWV0cmllcy5SZXNldCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBmaXJzdFB0IG5leHRQdCBvdGhlclB0cyAnOycKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5EaWVBcmVhQ2JrKSB7Ci0gICAgICAgICAgICAgICBkZWZEYXRhLT5EaWVBcmVhLmFkZFBvaW50KCZkZWZEYXRhLT5HZW9tZXRyaWVzKTsKLSAgICAgICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+RGllQXJlYUNiaywgZGVmckRpZUFyZWFDYmtUeXBlLCAmKGRlZkRhdGEtPkRpZUFyZWEpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLS8vIDgvMzEvMjAwMSAtIFRoaXMgaXMgb2Jzb2xldGUgaW4gNS40IAotcGluX2NhcF9ydWxlOiBzdGFydF9kZWZfY2FwIHBpbl9jYXBzIGVuZF9kZWZfY2FwCi0gICAgICAgICAgICB7IH0KLQotc3RhcnRfZGVmX2NhcDogS19ERUZBVUxUQ0FQIE5VTUJFUiAKLSAgICAgICAgewotICAgICAgICAgIGlmIChkZWZEYXRhLT5WZXJzaW9uTnVtIDwgNS40KSB7Ci0gICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+RGVmYXVsdENhcENiaykKLSAgICAgICAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPkRlZmF1bHRDYXBDYmssIGRlZnJEZWZhdWx0Q2FwQ2JrVHlwZSwgUk9VTkQoJDIpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkRlZmF1bHRDYXBDYmspIC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+ZGVmYXVsdENhcFdhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+RGVmYXVsdENhcFdhcm5pbmdzKQotICAgICAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZldhcm5pbmcoNzAxNywgIlRoZSBERUZBVUxUQ0FQIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgREVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC4iKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotcGluX2NhcHM6IC8vIGVtcHR5IAotICAgICAgICB8IHBpbl9jYXBzIHBpbl9jYXAKLSAgICAgICAgICAgIDsKLQotcGluX2NhcDogS19NSU5QSU5TIE5VTUJFUiBLX1dJUkVDQVAgTlVNQkVSICc7JwotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5WZXJzaW9uTnVtIDwgNS40KSB7Ci0gICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkNhcENiaykgewotICAgICAgICAgICAgICAgIGRlZkRhdGEtPlBpbkNhcC5zZXRQaW4oUk9VTkQoJDIpKTsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT5QaW5DYXAuc2V0Q2FwKCQ0KTsKLSAgICAgICAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkNhcENiaywgZGVmclBpbkNhcENia1R5cGUsICYoZGVmRGF0YS0+UGluQ2FwKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLWVuZF9kZWZfY2FwOiBLX0VORCBLX0RFRkFVTFRDQVAgCi0gICAgICAgICAgICB7IH0KLQotcGluX3J1bGU6IHN0YXJ0X3BpbnMgcGlucyBlbmRfcGlucwotICAgICAgICAgICAgeyB9Ci0KLXN0YXJ0X3BpbnM6IEtfUElOUyBOVU1CRVIgJzsnCi0gICAgICAgICAgeyAKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlN0YXJ0UGluc0NiaykKLSAgICAgICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5TdGFydFBpbnNDYmssIGRlZnJTdGFydFBpbnNDYmtUeXBlLCBST1VORCgkMikpOwotICAgICAgICAgIH0KLQotcGluczogLy8gZW1wdHkgCi0gICAgICAgIHwgcGlucyBwaW4KLSAgICAgICAgICAgIDsKLQotcGluOiAnLScge2RlZkRhdGEtPmR1bWJfbW9kZSA9IDE7IGRlZkRhdGEtPm5vX251bSA9IDE7IH0gVF9TVFJJTkcgJysnIEtfTkVUCi0gICAgICAgICB7ZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTsgZGVmRGF0YS0+bm9fbnVtID0gMTsgfSBUX1NUUklORwotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkNiayB8fCBkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkV4dENiaykgewotICAgICAgICAgICAgICBkZWZEYXRhLT5QaW4uU2V0dXAoJDMsICQ3KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZkRhdGEtPmhhc1BvcnQgPSAwOwotICAgICAgICAgIH0KLSAgICAgICAgcGluX29wdGlvbnMgJzsnCi0gICAgICAgICAgeyAKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkNiaykKLSAgICAgICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5QaW5DYmssIGRlZnJQaW5DYmtUeXBlLCAmZGVmRGF0YS0+UGluKTsKLSAgICAgICAgICB9Ci0KLXBpbl9vcHRpb25zOiAvLyBlbXB0eSAKLSAgICAgICAgfCBwaW5fb3B0aW9ucyBwaW5fb3B0aW9uCi0KLXBpbl9vcHRpb246ICcrJyBLX1NQRUNJQUwKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5QaW5DYmspCi0gICAgICAgICAgICAgIGRlZkRhdGEtPlBpbi5zZXRTcGVjaWFsKCk7Ci0gICAgICAgICAgfQotCi0gICAgICAgIHwgZXh0ZW5zaW9uX3N0bXQKLSAgICAgICAgICB7IAotICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluRXh0Q2JrKQotICAgICAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkV4dENiaywgZGVmclBpbkV4dENia1R5cGUsICZkZWZEYXRhLT5IaXN0b3J5X3RleHRbMF0pOwotICAgICAgICAgIH0KLQotICAgICAgICB8ICcrJyBLX0RJUkVDVElPTiBUX1NUUklORwotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkNiayB8fCBkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkV4dENiaykKLSAgICAgICAgICAgICAgZGVmRGF0YS0+UGluLnNldERpcmVjdGlvbigkMyk7Ci0gICAgICAgICAgfQotCi0gICAgICAgIHwgJysnIEtfTkVURVhQUiBRU1RSSU5HCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjYpIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluQ2JrIHx8IGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluRXh0Q2JrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChkZWZEYXRhLT5waW5XYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPlBpbldhcm5pbmdzKSAmJgotICAgICAgICAgICAgICAgICAgICAoZGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5QaW5FeHRXYXJuaW5ncykpIHsKLSAgICAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZk1zZyA9IChjaGFyKiltYWxsb2MoMTAwMCk7Ci0gICAgICAgICAgICAgICAgICBzcHJpbnRmIChkZWZEYXRhLT5kZWZNc2csCi0gICAgICAgICAgICAgICAgICAgICAiVGhlIE5FVEVYUFIgc3RhdGVtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGRlZkRhdGEtPlZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNjUwNiwgZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICAgIGZyZWUoZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluQ2JrIHx8IGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluRXh0Q2JrKQotICAgICAgICAgICAgICAgIGRlZkRhdGEtPlBpbi5zZXROZXRFeHByKCQzKTsKLQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICB8ICcrJyBLX1NVUFBMWVNFTlNJVElWSVRZIHsgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTsgfSBUX1NUUklORwotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5WZXJzaW9uTnVtIDwgNS42KSB7Ci0gICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkNiayB8fCBkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkV4dENiaykgewotICAgICAgICAgICAgICAgIGlmICgoZGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5QaW5XYXJuaW5ncykgJiYKLSAgICAgICAgICAgICAgICAgICAgKGRlZkRhdGEtPnBpbldhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+UGluRXh0V2FybmluZ3MpKSB7Ci0gICAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZNc2cgPSAoY2hhciopbWFsbG9jKDEwMDApOwotICAgICAgICAgICAgICAgICAgc3ByaW50ZiAoZGVmRGF0YS0+ZGVmTXNnLAotICAgICAgICAgICAgICAgICAgICAgIlRoZSBTVVBQTFlTRU5TSVRJVklUWSBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgZGVmRGF0YS0+VmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTA3LCBkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgICAgZnJlZShkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5QaW5DYmsgfHwgZGVmRGF0YS0+Y2FsbGJhY2tzLT5QaW5FeHRDYmspCi0gICAgICAgICAgICAgICAgZGVmRGF0YS0+UGluLnNldFN1cHBseVNlbnMoJDQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICB8ICcrJyBLX0dST1VORFNFTlNJVElWSVRZIHsgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTsgfSBUX1NUUklORwotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5WZXJzaW9uTnVtIDwgNS42KSB7Ci0gICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkNiayB8fCBkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkV4dENiaykgewotICAgICAgICAgICAgICAgIGlmICgoZGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5QaW5XYXJuaW5ncykgJiYKLSAgICAgICAgICAgICAgICAgICAgKGRlZkRhdGEtPnBpbldhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+UGluRXh0V2FybmluZ3MpKSB7Ci0gICAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZNc2cgPSAoY2hhciopbWFsbG9jKDEwMDApOwotICAgICAgICAgICAgICAgICAgc3ByaW50ZiAoZGVmRGF0YS0+ZGVmTXNnLAotICAgICAgICAgICAgICAgICAgICAgIlRoZSBHUk9VTkRTRU5TSVRJVklUWSBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgZGVmRGF0YS0+VmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTA4LCBkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgICAgZnJlZShkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5QaW5DYmsgfHwgZGVmRGF0YS0+Y2FsbGJhY2tzLT5QaW5FeHRDYmspCi0gICAgICAgICAgICAgICAgZGVmRGF0YS0+UGluLnNldEdyb3VuZFNlbnMoJDQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICB8ICcrJyBLX1VTRSB1c2VfdHlwZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkNiayB8fCBkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkV4dENiaykgZGVmRGF0YS0+UGluLnNldFVzZSgkMyk7Ci0gICAgICAgICAgfQotICAgICAgICB8ICcrJyBLX1BPUlQgICAgICAgICAgLy8gNS43IAotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5WZXJzaW9uTnVtIDwgNS43KSB7Ci0gICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5QaW5DYmsgfHwgZGVmRGF0YS0+Y2FsbGJhY2tzLT5QaW5FeHRDYmspIHsKLSAgICAgICAgICAgICAgICAgaWYgKChkZWZEYXRhLT5waW5XYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPlBpbldhcm5pbmdzKSAmJgotICAgICAgICAgICAgICAgICAgICAgKGRlZkRhdGEtPnBpbldhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+UGluRXh0V2FybmluZ3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmTXNnID0gKGNoYXIqKW1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgICAgICAgc3ByaW50ZiAoZGVmRGF0YS0+ZGVmTXNnLAotICAgICAgICAgICAgICAgICAgICAgIlRoZSBQT1JUIGluIFBJTlMgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS43IG9yIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBkZWZEYXRhLT5WZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTU1LCBkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgICAgIGZyZWUoZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkNiayB8fCBkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkV4dENiaykKLSAgICAgICAgICAgICAgICAgZGVmRGF0YS0+UGluLmFkZFBvcnQoKTsKLSAgICAgICAgICAgICAgIGRlZkRhdGEtPmhhc1BvcnQgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICB8ICcrJyBLX0xBWUVSIHsgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTsgfSBUX1NUUklORwotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkNiayB8fCBkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkV4dENiaykgewotICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+aGFzUG9ydCkKLSAgICAgICAgICAgICAgICAgZGVmRGF0YS0+UGluLmFkZFBvcnRMYXllcigkNCk7Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgZGVmRGF0YS0+UGluLmFkZExheWVyKCQ0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgcGluX2xheWVyX21hc2tfb3B0IHBpbl9sYXllcl9zcGFjaW5nX29wdCBwdCBwdAotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkNiayB8fCBkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkV4dENiaykgewotICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+aGFzUG9ydCkKLSAgICAgICAgICAgICAgICAgZGVmRGF0YS0+UGluLmFkZFBvcnRMYXllclB0cygkOC54LCAkOC55LCAkOS54LCAkOS55KTsKLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICBkZWZEYXRhLT5QaW4uYWRkTGF5ZXJQdHMoJDgueCwgJDgueSwgJDkueCwgJDkueSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgIHwgJysnIEtfUE9MWUdPTiB7IGRlZkRhdGEtPmR1bWJfbW9kZSA9IDE7IH0gVF9TVFJJTkcKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuNikgewotICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5QaW5DYmsgfHwgZGVmRGF0YS0+Y2FsbGJhY2tzLT5QaW5FeHRDYmspIHsKLSAgICAgICAgICAgICAgICBpZiAoKGRlZkRhdGEtPnBpbldhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+UGluV2FybmluZ3MpICYmCi0gICAgICAgICAgICAgICAgICAgIChkZWZEYXRhLT5waW5XYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPlBpbkV4dFdhcm5pbmdzKSkgewotICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmTXNnID0gKGNoYXIqKW1hbGxvYygxMDAwKTsKLSAgICAgICAgICAgICAgICAgIHNwcmludGYgKGRlZkRhdGEtPmRlZk1zZywKLSAgICAgICAgICAgICAgICAgICAgICJUaGUgUE9MWUdPTiBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgZGVmRGF0YS0+VmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTA5LCBkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgICAgZnJlZShkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5QaW5DYmsgfHwgZGVmRGF0YS0+Y2FsbGJhY2tzLT5QaW5FeHRDYmspIHsKLSAgICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+aGFzUG9ydCkKLSAgICAgICAgICAgICAgICAgICBkZWZEYXRhLT5QaW4uYWRkUG9ydFBvbHlnb24oJDQpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICBkZWZEYXRhLT5QaW4uYWRkUG9seWdvbigkNCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZGVmRGF0YS0+R2VvbWV0cmllcy5SZXNldCgpOyAgICAgICAgICAgIAotICAgICAgICAgIH0KLSAgICAgICAgICBwaW5fcG9seV9tYXNrX29wdCBwaW5fcG9seV9zcGFjaW5nX29wdCBmaXJzdFB0IG5leHRQdCBuZXh0UHQgb3RoZXJQdHMKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA+PSA1LjYpIHsgIC8vIG9ubHkgYWRkIGlmIDUuNiBvciBiZXlvbmQKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluQ2JrIHx8IGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluRXh0Q2JrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmhhc1BvcnQpCi0gICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+UGluLmFkZFBvcnRQb2x5Z29uUHRzKCZkZWZEYXRhLT5HZW9tZXRyaWVzKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+UGluLmFkZFBvbHlnb25QdHMoJmRlZkRhdGEtPkdlb21ldHJpZXMpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB8ICcrJyBLX1ZJQSB7IGRlZkRhdGEtPmR1bWJfbW9kZSA9IDE7IH0gVF9TVFJJTkcgcGluX3ZpYV9tYXNrX29wdCAnKCcgTlVNQkVSIE5VTUJFUiAnKScgICAvLyA1LjcKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuNykgewotICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5QaW5DYmsgfHwgZGVmRGF0YS0+Y2FsbGJhY2tzLT5QaW5FeHRDYmspIHsKLSAgICAgICAgICAgICAgICBpZiAoKGRlZkRhdGEtPnBpbldhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+UGluV2FybmluZ3MpICYmCi0gICAgICAgICAgICAgICAgICAgIChkZWZEYXRhLT5waW5XYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPlBpbkV4dFdhcm5pbmdzKSkgewotICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmTXNnID0gKGNoYXIqKW1hbGxvYygxMDAwKTsKLSAgICAgICAgICAgICAgICAgIHNwcmludGYgKGRlZkRhdGEtPmRlZk1zZywKLSAgICAgICAgICAgICAgICAgICAgICJUaGUgUElOIFZJQSBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS43IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgZGVmRGF0YS0+VmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTU2LCBkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgICAgZnJlZShkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5QaW5DYmsgfHwgZGVmRGF0YS0+Y2FsbGJhY2tzLT5QaW5FeHRDYmspIHsKLSAgICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+aGFzUG9ydCkKLSAgICAgICAgICAgICAgICAgICBkZWZEYXRhLT5QaW4uYWRkUG9ydFZpYSgkNCwgKGludCkkNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkkOCwgJDUpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICBkZWZEYXRhLT5QaW4uYWRkVmlhKCQ0LCAoaW50KSQ3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSQ4LCAkNSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gIAotICAgICAgICB8IHBsYWNlbWVudF9zdGF0dXMgcHQgb3JpZW50Ci0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluQ2JrIHx8IGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluRXh0Q2JrKSB7Ci0gICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5oYXNQb3J0KSB7Ci0gICAgICAgICAgICAgICAgIGRlZkRhdGEtPlBpbi5zZXRQb3J0UGxhY2VtZW50KCQxLCAkMi54LCAkMi55LCAkMyk7Ci0gICAgICAgICAgICAgICAgIGRlZkRhdGEtPmhhc1BvcnQgPSAwOwotICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgZGVmRGF0YS0+UGluLnNldFBsYWNlbWVudCgkMSwgJDIueCwgJDIueSwgJDMpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGlzIDUuNCBzeW50YXggCi0gICAgICAgIHwgJysnIEtfQU5URU5OQVBJTlBBUlRJQUxNRVRBTEFSRUEgTlVNQkVSIHBpbl9sYXllcl9vcHQKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA8PSA1LjMpIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluQ2JrIHx8IGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluRXh0Q2JrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChkZWZEYXRhLT5waW5XYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPlBpbldhcm5pbmdzKSAmJgotICAgICAgICAgICAgICAgICAgICAoZGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5QaW5FeHRXYXJuaW5ncykpIHsKLSAgICAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZk1zZyA9IChjaGFyKiltYWxsb2MoMTAwMCk7Ci0gICAgICAgICAgICAgICAgICBzcHJpbnRmIChkZWZEYXRhLT5kZWZNc2csCi0gICAgICAgICAgICAgICAgICAgICAiVGhlIEFOVEVOTkFQSU5QQVJUSUFMTUVUQUxBUkVBIHN0YXRlbWVudCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBkZWZEYXRhLT5WZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZkVycm9yKDY1MTAsIGRlZkRhdGEtPmRlZk1zZyk7Ci0gICAgICAgICAgICAgICAgICBmcmVlKGRlZkRhdGEtPmRlZk1zZyk7Ci0gICAgICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkNiayB8fCBkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkV4dENiaykKLSAgICAgICAgICAgICAgZGVmRGF0YS0+UGluLmFkZEFQaW5QYXJ0aWFsTWV0YWxBcmVhKChpbnQpJDMsICQ0KTsgCi0gICAgICAgICAgfQotICAgICAgICB8ICcrJyBLX0FOVEVOTkFQSU5QQVJUSUFMTUVUQUxTSURFQVJFQSBOVU1CRVIgcGluX2xheWVyX29wdAotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5WZXJzaW9uTnVtIDw9IDUuMykgewotICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5QaW5DYmsgfHwgZGVmRGF0YS0+Y2FsbGJhY2tzLT5QaW5FeHRDYmspIHsKLSAgICAgICAgICAgICAgICBpZiAoKGRlZkRhdGEtPnBpbldhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+UGluV2FybmluZ3MpICYmCi0gICAgICAgICAgICAgICAgICAgIChkZWZEYXRhLT5waW5XYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPlBpbkV4dFdhcm5pbmdzKSkgewotICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmTXNnID0gKGNoYXIqKW1hbGxvYygxMDAwKTsKLSAgICAgICAgICAgICAgICAgIHNwcmludGYgKGRlZkRhdGEtPmRlZk1zZywKLSAgICAgICAgICAgICAgICAgICAgICJUaGUgQU5URU5OQVBJTlBBUlRJQUxNRVRBTFNJREVBUkVBIHN0YXRlbWVudCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBkZWZEYXRhLT5WZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZkVycm9yKDY1MTEsIGRlZkRhdGEtPmRlZk1zZyk7Ci0gICAgICAgICAgICAgICAgICBmcmVlKGRlZkRhdGEtPmRlZk1zZyk7Ci0gICAgICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkNiayB8fCBkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkV4dENiaykKLSAgICAgICAgICAgICAgZGVmRGF0YS0+UGluLmFkZEFQaW5QYXJ0aWFsTWV0YWxTaWRlQXJlYSgoaW50KSQzLCAkNCk7IAotICAgICAgICAgIH0KLSAgICAgICAgfCAnKycgS19BTlRFTk5BUElOR0FURUFSRUEgTlVNQkVSIHBpbl9sYXllcl9vcHQKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA8PSA1LjMpIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluQ2JrIHx8IGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluRXh0Q2JrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChkZWZEYXRhLT5waW5XYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPlBpbldhcm5pbmdzKSAmJgotICAgICAgICAgICAgICAgICAgICAoZGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5QaW5FeHRXYXJuaW5ncykpIHsKLSAgICAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZk1zZyA9IChjaGFyKiltYWxsb2MoMTAwMCk7Ci0gICAgICAgICAgICAgICAgICBzcHJpbnRmIChkZWZEYXRhLT5kZWZNc2csCi0gICAgICAgICAgICAgICAgICAgICAiVGhlIEFOVEVOTkFQSU5HQVRFQVJFQSBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgZGVmRGF0YS0+VmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTEyLCBkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgICAgZnJlZShkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkNiayB8fCBkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkV4dENiaykKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT5QaW4uYWRkQVBpbkdhdGVBcmVhKChpbnQpJDMsICQ0KTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgIHwgJysnIEtfQU5URU5OQVBJTkRJRkZBUkVBIE5VTUJFUiBwaW5fbGF5ZXJfb3B0Ci0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPD0gNS4zKSB7Ci0gICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkNiayB8fCBkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkV4dENiaykgewotICAgICAgICAgICAgICAgIGlmICgoZGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5QaW5XYXJuaW5ncykgJiYKLSAgICAgICAgICAgICAgICAgICAgKGRlZkRhdGEtPnBpbldhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+UGluRXh0V2FybmluZ3MpKSB7Ci0gICAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZNc2cgPSAoY2hhciopbWFsbG9jKDEwMDApOwotICAgICAgICAgICAgICAgICAgc3ByaW50ZiAoZGVmRGF0YS0+ZGVmTXNnLAotICAgICAgICAgICAgICAgICAgICAgIlRoZSBBTlRFTk5BUElORElGRkFSRUEgc3RhdGVtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGRlZkRhdGEtPlZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNjUxMywgZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICAgIGZyZWUoZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluQ2JrIHx8IGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluRXh0Q2JrKQotICAgICAgICAgICAgICBkZWZEYXRhLT5QaW4uYWRkQVBpbkRpZmZBcmVhKChpbnQpJDMsICQ0KTsgCi0gICAgICAgICAgfQotICAgICAgICB8ICcrJyBLX0FOVEVOTkFQSU5NQVhBUkVBQ0FSIE5VTUJFUiBLX0xBWUVSIHtkZWZEYXRhLT5kdW1iX21vZGU9MTt9IFRfU1RSSU5HCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPD0gNS4zKSB7Ci0gICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkNiayB8fCBkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkV4dENiaykgewotICAgICAgICAgICAgICAgIGlmICgoZGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5QaW5XYXJuaW5ncykgJiYKLSAgICAgICAgICAgICAgICAgICAgKGRlZkRhdGEtPnBpbldhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+UGluRXh0V2FybmluZ3MpKSB7Ci0gICAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZNc2cgPSAoY2hhciopbWFsbG9jKDEwMDApOwotICAgICAgICAgICAgICAgICAgc3ByaW50ZiAoZGVmRGF0YS0+ZGVmTXNnLAotICAgICAgICAgICAgICAgICAgICAgIlRoZSBBTlRFTk5BUElOTUFYQVJFQUNBUiBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgZGVmRGF0YS0+VmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTE0LCBkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgICAgZnJlZShkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5QaW5DYmsgfHwgZGVmRGF0YS0+Y2FsbGJhY2tzLT5QaW5FeHRDYmspCi0gICAgICAgICAgICAgIGRlZkRhdGEtPlBpbi5hZGRBUGluTWF4QXJlYUNhcigoaW50KSQzLCAkNik7IAotICAgICAgICAgIH0KLSAgICAgICAgfCAnKycgS19BTlRFTk5BUElOTUFYU0lERUFSRUFDQVIgTlVNQkVSIEtfTEFZRVIge2RlZkRhdGEtPmR1bWJfbW9kZT0xO30KLSAgICAgICAgICAgVF9TVFJJTkcKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA8PSA1LjMpIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluQ2JrIHx8IGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluRXh0Q2JrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChkZWZEYXRhLT5waW5XYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPlBpbldhcm5pbmdzKSAmJgotICAgICAgICAgICAgICAgICAgICAoZGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5QaW5FeHRXYXJuaW5ncykpIHsKLSAgICAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZk1zZyA9IChjaGFyKiltYWxsb2MoMTAwMCk7Ci0gICAgICAgICAgICAgICAgICBzcHJpbnRmIChkZWZEYXRhLT5kZWZNc2csCi0gICAgICAgICAgICAgICAgICAgICAiVGhlIEFOVEVOTkFQSU5NQVhTSURFQVJFQUNBUiBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgZGVmRGF0YS0+VmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTE1LCBkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgICAgZnJlZShkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5QaW5DYmsgfHwgZGVmRGF0YS0+Y2FsbGJhY2tzLT5QaW5FeHRDYmspCi0gICAgICAgICAgICAgIGRlZkRhdGEtPlBpbi5hZGRBUGluTWF4U2lkZUFyZWFDYXIoKGludCkkMywgJDYpOyAKLSAgICAgICAgICB9Ci0gICAgICAgIHwgJysnIEtfQU5URU5OQVBJTlBBUlRJQUxDVVRBUkVBIE5VTUJFUiBwaW5fbGF5ZXJfb3B0Ci0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPD0gNS4zKSB7Ci0gICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkNiayB8fCBkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkV4dENiaykgewotICAgICAgICAgICAgICAgIGlmICgoZGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5QaW5XYXJuaW5ncykgJiYKLSAgICAgICAgICAgICAgICAgICAgKGRlZkRhdGEtPnBpbldhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+UGluRXh0V2FybmluZ3MpKSB7Ci0gICAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZNc2cgPSAoY2hhciopbWFsbG9jKDEwMDApOwotICAgICAgICAgICAgICAgICAgc3ByaW50ZiAoZGVmRGF0YS0+ZGVmTXNnLAotICAgICAgICAgICAgICAgICAgICAgIlRoZSBBTlRFTk5BUElOUEFSVElBTENVVEFSRUEgc3RhdGVtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGRlZkRhdGEtPlZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNjUxNiwgZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICAgIGZyZWUoZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluQ2JrIHx8IGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluRXh0Q2JrKQotICAgICAgICAgICAgICBkZWZEYXRhLT5QaW4uYWRkQVBpblBhcnRpYWxDdXRBcmVhKChpbnQpJDMsICQ0KTsgCi0gICAgICAgICAgfQotICAgICAgICB8ICcrJyBLX0FOVEVOTkFQSU5NQVhDVVRDQVIgTlVNQkVSIEtfTEFZRVIge2RlZkRhdGEtPmR1bWJfbW9kZT0xO30gVF9TVFJJTkcKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA8PSA1LjMpIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluQ2JrIHx8IGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluRXh0Q2JrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChkZWZEYXRhLT5waW5XYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPlBpbldhcm5pbmdzKSAmJgotICAgICAgICAgICAgICAgICAgICAoZGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5QaW5FeHRXYXJuaW5ncykpIHsKLSAgICAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZk1zZyA9IChjaGFyKiltYWxsb2MoMTAwMCk7Ci0gICAgICAgICAgICAgICAgICBzcHJpbnRmIChkZWZEYXRhLT5kZWZNc2csCi0gICAgICAgICAgICAgICAgICAgICAiVGhlIEFOVEVOTkFQSU5NQVhDVVRDQVIgc3RhdGVtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGRlZkRhdGEtPlZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNjUxNywgZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICAgIGZyZWUoZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluQ2JrIHx8IGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluRXh0Q2JrKQotICAgICAgICAgICAgICBkZWZEYXRhLT5QaW4uYWRkQVBpbk1heEN1dENhcigoaW50KSQzLCAkNik7IAotICAgICAgICAgIH0KLSAgICAgICAgfCAnKycgS19BTlRFTk5BTU9ERUwgcGluX294aWRlCi0gICAgICAgICAgeyAgLy8gNS41IHN5bnRheCAKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5WZXJzaW9uTnVtIDwgNS41KSB7Ci0gICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkNiayB8fCBkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkV4dENiaykgewotICAgICAgICAgICAgICAgIGlmICgoZGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5QaW5XYXJuaW5ncykgJiYKLSAgICAgICAgICAgICAgICAgICAgKGRlZkRhdGEtPnBpbldhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+UGluRXh0V2FybmluZ3MpKSB7Ci0gICAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZNc2cgPSAoY2hhciopbWFsbG9jKDEwMDApOwotICAgICAgICAgICAgICAgICAgc3ByaW50ZiAoZGVmRGF0YS0+ZGVmTXNnLAotICAgICAgICAgICAgICAgICAgICAgIlRoZSBBTlRFTk5BTU9ERUwgc3RhdGVtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNSBhbmQgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGRlZkRhdGEtPlZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNjUxOCwgZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICAgIGZyZWUoZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotcGluX2xheWVyX21hc2tfb3B0OiAvLyBlbXB0eSAKLSAgICAgICAgfCBLX01BU0sgTlVNQkVSCi0gICAgICAgICB7IAotICAgICAgICAgICBpZiAoZGVmRGF0YS0+dmFsaWRhdGVNYXNrSW5wdXQoKGludCkkMiwgZGVmRGF0YS0+cGluV2FybmluZ3MsIGRlZkRhdGEtPnNldHRpbmdzLT5QaW5XYXJuaW5ncykpIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluQ2JrIHx8IGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluRXh0Q2JrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmhhc1BvcnQpCi0gICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+UGluLmFkZFBvcnRMYXllck1hc2soKGludCkkMik7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgIGRlZkRhdGEtPlBpbi5hZGRMYXllck1hc2soKGludCkkMik7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgCi1waW5fdmlhX21hc2tfb3B0OiAKLSAgICAgICAgLy8gZW1wdHkgCi0gICAgICAgIHsgJCQgPSAwOyB9Ci0gICAgICAgIHwgS19NQVNLIE5VTUJFUgotICAgICAgICAgeyAKLSAgICAgICAgICAgaWYgKGRlZkRhdGEtPnZhbGlkYXRlTWFza0lucHV0KChpbnQpJDIsIGRlZkRhdGEtPnBpbldhcm5pbmdzLCBkZWZEYXRhLT5zZXR0aW5ncy0+UGluV2FybmluZ3MpKSB7Ci0gICAgICAgICAgICAgJCQgPSAkMjsKLSAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgCi1waW5fcG9seV9tYXNrX29wdDogLy8gZW1wdHkgCi0gICAgICAgIHwgS19NQVNLIE5VTUJFUgotICAgICAgICAgeyAKLSAgICAgICAgICAgaWYgKGRlZkRhdGEtPnZhbGlkYXRlTWFza0lucHV0KChpbnQpJDIsIGRlZkRhdGEtPnBpbldhcm5pbmdzLCBkZWZEYXRhLT5zZXR0aW5ncy0+UGluV2FybmluZ3MpKSB7Ci0gICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkNiayB8fCBkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkV4dENiaykgewotICAgICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5oYXNQb3J0KQotICAgICAgICAgICAgICAgICAgIGRlZkRhdGEtPlBpbi5hZGRQb3J0UG9seU1hc2soKGludCkkMik7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgIGRlZkRhdGEtPlBpbi5hZGRQb2x5TWFzaygoaW50KSQyKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAKLSAgICAgICAgIAotcGluX2xheWVyX3NwYWNpbmdfb3B0OiAvLyBlbXB0eSAKLSAgICAgICAgfCBLX1NQQUNJTkcgTlVNQkVSCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjYpIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluQ2JrIHx8IGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluRXh0Q2JrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChkZWZEYXRhLT5waW5XYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPlBpbldhcm5pbmdzKSAmJgotICAgICAgICAgICAgICAgICAgICAoZGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5QaW5FeHRXYXJuaW5ncykpIHsKLSAgICAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZk1zZyA9IChjaGFyKiltYWxsb2MoMTAwMCk7Ci0gICAgICAgICAgICAgICAgICBzcHJpbnRmIChkZWZEYXRhLT5kZWZNc2csCi0gICAgICAgICAgICAgICAgICAgICAiVGhlIFNQQUNJTkcgc3RhdGVtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGRlZkRhdGEtPlZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNjUxOSwgZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICAgIGZyZWUoZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluQ2JrIHx8IGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluRXh0Q2JrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmhhc1BvcnQpCi0gICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+UGluLmFkZFBvcnRMYXllclNwYWNpbmcoKGludCkkMik7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgIGRlZkRhdGEtPlBpbi5hZGRMYXllclNwYWNpbmcoKGludCkkMik7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIHwgS19ERVNJR05SVUxFV0lEVEggTlVNQkVSCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjYpIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluQ2JrIHx8IGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluRXh0Q2JrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChkZWZEYXRhLT5waW5XYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPlBpbldhcm5pbmdzKSAmJgotICAgICAgICAgICAgICAgICAgICAoZGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5QaW5FeHRXYXJuaW5ncykpIHsKLSAgICAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZk1zZyA9IChjaGFyKiltYWxsb2MoMTAwMCk7Ci0gICAgICAgICAgICAgICAgICBzcHJpbnRmIChkZWZEYXRhLT5kZWZNc2csCi0gICAgICAgICAgICAgICAgICAgICAiREVTSUdOUlVMRVdJRFRIIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS42IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGRlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnIiwgZGVmRGF0YS0+VmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTIwLCBkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgICAgZnJlZShkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5QaW5DYmsgfHwgZGVmRGF0YS0+Y2FsbGJhY2tzLT5QaW5FeHRDYmspIHsKLSAgICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+aGFzUG9ydCkKLSAgICAgICAgICAgICAgICAgICBkZWZEYXRhLT5QaW4uYWRkUG9ydExheWVyRGVzaWduUnVsZVdpZHRoKChpbnQpJDIpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICBkZWZEYXRhLT5QaW4uYWRkTGF5ZXJEZXNpZ25SdWxlV2lkdGgoKGludCkkMik7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLXBpbl9wb2x5X3NwYWNpbmdfb3B0OiAvLyBlbXB0eSAKLSAgICAgICAgfCBLX1NQQUNJTkcgTlVNQkVSCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjYpIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluQ2JrIHx8IGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluRXh0Q2JrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChkZWZEYXRhLT5waW5XYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPlBpbldhcm5pbmdzKSAmJgotICAgICAgICAgICAgICAgICAgICAoZGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5QaW5FeHRXYXJuaW5ncykpIHsKLSAgICAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZk1zZyA9IChjaGFyKiltYWxsb2MoMTAwMCk7Ci0gICAgICAgICAgICAgICAgICBzcHJpbnRmIChkZWZEYXRhLT5kZWZNc2csCi0gICAgICAgICAgICAgICAgICAgICAiU1BBQ0lORyBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBkZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZyIsIGRlZkRhdGEtPlZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNjUyMSwgZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICAgIGZyZWUoZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluQ2JrIHx8IGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluRXh0Q2JrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmhhc1BvcnQpCi0gICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+UGluLmFkZFBvcnRQb2x5U3BhY2luZygoaW50KSQyKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+UGluLmFkZFBvbHlTcGFjaW5nKChpbnQpJDIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB8IEtfREVTSUdOUlVMRVdJRFRIIE5VTUJFUgotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5WZXJzaW9uTnVtIDwgNS42KSB7Ci0gICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkNiayB8fCBkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkV4dENiaykgewotICAgICAgICAgICAgICAgIGlmICgoZGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5QaW5XYXJuaW5ncykgJiYKLSAgICAgICAgICAgICAgICAgICAgKGRlZkRhdGEtPnBpbldhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+UGluRXh0V2FybmluZ3MpKSB7Ci0gICAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZNc2cgPSAoY2hhciopbWFsbG9jKDEwMDApOwotICAgICAgICAgICAgICAgICAgc3ByaW50ZiAoZGVmRGF0YS0+ZGVmTXNnLAotICAgICAgICAgICAgICAgICAgICAgIlRoZSBERVNJR05SVUxFV0lEVEggc3RhdGVtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGRlZkRhdGEtPlZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNjUyMCwgZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICAgIGZyZWUoZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluQ2JrIHx8IGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluRXh0Q2JrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmhhc1BvcnQpCi0gICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+UGluLmFkZFBvcnRQb2x5RGVzaWduUnVsZVdpZHRoKChpbnQpJDIpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICBkZWZEYXRhLT5QaW4uYWRkUG9seURlc2lnblJ1bGVXaWR0aCgoaW50KSQyKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotcGluX294aWRlOiBLX09YSURFMQotICAgICAgICAgIHsgZGVmRGF0YS0+YU94aWRlID0gMTsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkNiayB8fCBkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkV4dENiaykKLSAgICAgICAgICAgICAgZGVmRGF0YS0+UGluLmFkZEFudGVubmFNb2RlbChkZWZEYXRhLT5hT3hpZGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfCBLX09YSURFMgotICAgICAgICAgIHsgZGVmRGF0YS0+YU94aWRlID0gMjsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkNiayB8fCBkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkV4dENiaykKLSAgICAgICAgICAgICAgZGVmRGF0YS0+UGluLmFkZEFudGVubmFNb2RlbChkZWZEYXRhLT5hT3hpZGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfCBLX09YSURFMwotICAgICAgICAgIHsgZGVmRGF0YS0+YU94aWRlID0gMzsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkNiayB8fCBkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkV4dENiaykKLSAgICAgICAgICAgICAgZGVmRGF0YS0+UGluLmFkZEFudGVubmFNb2RlbChkZWZEYXRhLT5hT3hpZGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfCBLX09YSURFNAotICAgICAgICAgIHsgZGVmRGF0YS0+YU94aWRlID0gNDsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkNiayB8fCBkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkV4dENiaykKLSAgICAgICAgICAgICAgZGVmRGF0YS0+UGluLmFkZEFudGVubmFNb2RlbChkZWZEYXRhLT5hT3hpZGUpOwotICAgICAgICAgIH0KLQotdXNlX3R5cGU6IEtfU0lHTkFMCi0gICAgICAgICAgeyAkJCA9IChjaGFyKikiU0lHTkFMIjsgfQotICAgICAgICB8IEtfUE9XRVIKLSAgICAgICAgICB7ICQkID0gKGNoYXIqKSJQT1dFUiI7IH0KLSAgICAgICAgfCBLX0dST1VORAotICAgICAgICAgIHsgJCQgPSAoY2hhciopIkdST1VORCI7IH0KLSAgICAgICAgfCBLX0NMT0NLCi0gICAgICAgICAgeyAkJCA9IChjaGFyKikiQ0xPQ0siOyB9Ci0gICAgICAgIHwgS19USUVPRkYKLSAgICAgICAgICB7ICQkID0gKGNoYXIqKSJUSUVPRkYiOyB9Ci0gICAgICAgIHwgS19BTkFMT0cKLSAgICAgICAgICB7ICQkID0gKGNoYXIqKSJBTkFMT0ciOyB9Ci0gICAgICAgIHwgS19TQ0FOCi0gICAgICAgICAgeyAkJCA9IChjaGFyKikiU0NBTiI7IH0KLSAgICAgICAgfCBLX1JFU0VUCi0gICAgICAgICAgeyAkJCA9IChjaGFyKikiUkVTRVQiOyB9Ci0KLXBpbl9sYXllcl9vcHQ6Ci0gICAgICAgIC8vIGVtcHR5IAotICAgICAgICAgIHsgJCQgPSAoY2hhciopIiI7IH0KLSAgICAgICAgfCBLX0xBWUVSIHtkZWZEYXRhLT5kdW1iX21vZGU9MTt9IFRfU1RSSU5HCi0gICAgICAgICAgeyAkJCA9ICQzOyB9Ci0KLWVuZF9waW5zOiBLX0VORCBLX1BJTlMKLSAgICAgICAgeyAKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5QaW5FbmRDYmspCi0gICAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPlBpbkVuZENiaywgZGVmclBpbkVuZENia1R5cGUsIDApOwotICAgICAgICB9Ci0KLXJvd19ydWxlOiBLX1JPVyB7ZGVmRGF0YS0+ZHVtYl9tb2RlID0gMjsgZGVmRGF0YS0+bm9fbnVtID0gMjsgfSBUX1NUUklORyBUX1NUUklORyBOVU1CRVIgTlVNQkVSCi0gICAgICBvcmllbnQKLSAgICAgICAgewotICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlJvd0NiaykgewotICAgICAgICAgICAgZGVmRGF0YS0+cm93TmFtZSA9ICQzOwotICAgICAgICAgICAgZGVmRGF0YS0+Um93LnNldHVwKCQzLCAkNCwgJDUsICQ2LCAkNyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICByb3dfZG9fb3B0aW9uCi0gICAgICByb3dfb3B0aW9ucyAnOycKLSAgICAgICAgewotICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlJvd0NiaykgCi0gICAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPlJvd0NiaywgZGVmclJvd0Nia1R5cGUsICZkZWZEYXRhLT5Sb3cpOwotICAgICAgICB9Ci0KLXJvd19kb19vcHRpb246IC8vIGVtcHR5IAotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjYpIHsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlJvd0NiaykgewotICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+cm93V2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5Sb3dXYXJuaW5ncykgewotICAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZkVycm9yKDY1MjMsICJJbnZhbGlkIFJPVyBzdGF0ZW1lbnQgZGVmaW5lZCBpbiB0aGUgREVGIGZpbGUuIFRoZSBETyBzdGF0ZW1lbnQgd2hpY2ggaXMgcmVxdWlyZWQgaW4gdGhlIFJPVyBzdGF0ZW1lbnQgaXMgbm90IGRlZmluZWQuXG5VcGRhdGUgeW91ciBERUYgZmlsZSB3aXRoIGEgRE8gc3RhdGVtZW50LiIpOwotICAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB8IEtfRE8gTlVNQkVSIEtfQlkgTlVNQkVSIHJvd19zdGVwX29wdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgLy8gMDYvMDUvMjAwMiAtIHBjciA0NDg0NTUgCi0gICAgICAgICAgLy8gQ2hlY2sgZm9yIDEgYW5kIDAgaW4gdGhlIGNvcnJlY3QgcG9zaXRpb24gCi0gICAgICAgICAgLy8gMDcvMjYvMjAwMiAtIENvbW1lbnRlZCBvdXQgZHVlIHRvIHBjciA0NTkyMTggCi0gICAgICAgICAgaWYgKGRlZkRhdGEtPmhhc0RvU3RlcCkgewotICAgICAgICAgICAgLy8gMDQvMjkvMjAwNCAtIHBjciA2OTU1MzUgCi0gICAgICAgICAgICAvLyBjaGFuZ2VkIHRoZSB0ZXN0aW5nIAotICAgICAgICAgICAgaWYgKCgoJDQgPT0gMSkgJiYgKGRlZkRhdGEtPnlTdGVwID09IDApKSB8fAotICAgICAgICAgICAgICAgICgoJDIgPT0gMSkgJiYgKGRlZkRhdGEtPnhTdGVwID09IDApKSkgewotICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nIAotICAgICAgICAgICAgfSBlbHNlIAotICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuNikgewotICAgICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlJvd0NiaykgewotICAgICAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPnJvd1dhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+Um93V2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmTXNnID0gKGNoYXIqKW1hbGxvYygxMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihkZWZEYXRhLT5kZWZNc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBETyBzdGF0ZW1lbnQgaW4gdGhlIFJPVyBzdGF0ZW1lbnQgd2l0aCB0aGUgbmFtZSAlcyBoYXMgaW52YWxpZCBzeW50YXguXG5UaGUgdmFsaWQgc3ludGF4IGlzIFwiRE8gbnVtWCBCWSAxIFNURVAgc3BhY2VYIDAgfCBETyAxIEJZIG51bVkgU1RFUCAwIHNwYWNlWVwiLlxuU3BlY2lmeSB0aGUgdmFsaWQgc3ludGF4IGFuZCB0cnkgYWdhaW4uIiwgZGVmRGF0YS0+cm93TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZldhcm5pbmcoNzAxOCwgZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gcGNyIDQ1OTIxOCAtIEVycm9yIGlmIGF0IGxlYXN0IG51bVggb3IgbnVtWSBkb2VzIG5vdCBlcXVhbCAxIAotICAgICAgICAgIGlmICgoJDIgIT0gMSkgJiYgKCQ0ICE9IDEpKSB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Sb3dDYmspIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPnJvd1dhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+Um93V2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTI0LCAiSW52YWxpZCBzeW50YXggc3BlY2lmaWVkLiBUaGUgdmFsaWQgc3ludGF4IGlzIGVpdGhlciBcIkRPIDEgQlkgbnVtIG9yIERPIG51bSBCWSAxXCIuIFNwZWNpZnkgdGhlIHZhbGlkIHN5bnRheCBhbmQgdHJ5IGFnYWluLiIpOwotICAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlJvd0NiaykKLSAgICAgICAgICAgIGRlZkRhdGEtPlJvdy5zZXREbyhST1VORCgkMiksIFJPVU5EKCQ0KSwgZGVmRGF0YS0+eFN0ZXAsIGRlZkRhdGEtPnlTdGVwKTsKLSAgICAgICAgfQotCi1yb3dfc3RlcF9vcHRpb246IC8vIGVtcHR5IAotICAgICAgICB7Ci0gICAgICAgICAgZGVmRGF0YS0+aGFzRG9TdGVwID0gMDsKLSAgICAgICAgfQotICAgICAgfCBLX1NURVAgTlVNQkVSIE5VTUJFUgotICAgICAgICB7Ci0gICAgICAgICAgZGVmRGF0YS0+aGFzRG9TdGVwID0gMTsKLSAgICAgICAgICBkZWZEYXRhLT5Sb3cuc2V0SGFzRG9TdGVwKCk7Ci0gICAgICAgICAgZGVmRGF0YS0+eFN0ZXAgPSAkMjsKLSAgICAgICAgICBkZWZEYXRhLT55U3RlcCA9ICQzOwotICAgICAgICB9Ci0KLXJvd19vcHRpb25zOiAvLyBlbXB0eSAKLSAgICAgIHwgcm93X29wdGlvbnMgcm93X29wdGlvbgotICAgICAgOwotCi1yb3dfb3B0aW9uIDogJysnIEtfUFJPUEVSVFkge2RlZkRhdGEtPmR1bWJfbW9kZSA9IERFRl9NQVhfSU5UOyB9Ci0gICAgICAgICAgICAgcm93X3Byb3BfbGlzdAotICAgICAgICAgeyBkZWZEYXRhLT5kdW1iX21vZGUgPSAwOyB9Ci0KLXJvd19wcm9wX2xpc3QgOiAvLyBlbXB0eSAKLSAgICAgICB8IHJvd19wcm9wX2xpc3Qgcm93X3Byb3AKLSAgICAgICA7Ci0gICAgICAgCi1yb3dfcHJvcCA6IFRfU1RSSU5HIE5VTUJFUgotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+Um93Q2JrKSB7Ci0gICAgICAgICAgICAgY2hhciBwcm9wVHA7Ci0gICAgICAgICAgICAgY2hhciogc3RyID0gZGVmRGF0YS0+cmluZ0NvcHkoIiAgICAgICAgICAgICAgICAgICAgICAgIik7Ci0gICAgICAgICAgICAgcHJvcFRwID0gIGRlZkRhdGEtPnNlc3Npb24tPlJvd1Byb3AucHJvcFR5cGUoJDEpOwotICAgICAgICAgICAgIENIS1BST1BUWVBFKHByb3BUcCwgJDEsICJST1ciKTsKLSAgICAgICAgICAgICAvLyBGb3IgYmFja3dvcmQgY29tcGF0aWJpbGl0eSwgYWxzbyBzZXQgdGhlIHN0cmluZyB2YWx1ZSAKLSAgICAgICAgICAgICBzcHJpbnRmKHN0ciwgIiVnIiwgJDIpOwotICAgICAgICAgICAgIGRlZkRhdGEtPlJvdy5hZGROdW1Qcm9wZXJ0eSgkMSwgJDIsIHN0ciwgcHJvcFRwKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIHwgVF9TVFJJTkcgUVNUUklORwotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+Um93Q2JrKSB7Ci0gICAgICAgICAgICAgY2hhciBwcm9wVHA7Ci0gICAgICAgICAgICAgcHJvcFRwID0gIGRlZkRhdGEtPnNlc3Npb24tPlJvd1Byb3AucHJvcFR5cGUoJDEpOwotICAgICAgICAgICAgIENIS1BST1BUWVBFKHByb3BUcCwgJDEsICJST1ciKTsKLSAgICAgICAgICAgICBkZWZEYXRhLT5Sb3cuYWRkUHJvcGVydHkoJDEsICQyLCBwcm9wVHApOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfCBUX1NUUklORyBUX1NUUklORwotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+Um93Q2JrKSB7Ci0gICAgICAgICAgICAgY2hhciBwcm9wVHA7Ci0gICAgICAgICAgICAgcHJvcFRwID0gIGRlZkRhdGEtPnNlc3Npb24tPlJvd1Byb3AucHJvcFR5cGUoJDEpOwotICAgICAgICAgICAgIENIS1BST1BUWVBFKHByb3BUcCwgJDEsICJST1ciKTsKLSAgICAgICAgICAgICBkZWZEYXRhLT5Sb3cuYWRkUHJvcGVydHkoJDEsICQyLCBwcm9wVHApOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi10cmFja3NfcnVsZTogdHJhY2tfc3RhcnQgTlVNQkVSCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5UcmFja0NiaykgewotICAgICAgICAgICAgZGVmRGF0YS0+VHJhY2suc2V0dXAoJDEpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBLX0RPIE5VTUJFUiBLX1NURVAgTlVNQkVSIHRyYWNrX29wdHMgJzsnIAotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCgkNSA8PSAwKSAmJiAoZGVmRGF0YS0+VmVyc2lvbk51bSA+PSA1LjQpKSB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5UcmFja0NiaykKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPnRyYWNrV2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5UcmFja1dhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmTXNnID0gKGNoYXIqKW1hbGxvYygxMDAwKTsKLSAgICAgICAgICAgICAgICBzcHJpbnRmIChkZWZEYXRhLT5kZWZNc2csCi0gICAgICAgICAgICAgICAgICAgIlRoZSBETyBudW1iZXIgJWcgaW4gVFJBQ0sgaXMgaW52YWxpZC5cblRoZSBudW1iZXIgdmFsdWUgaGFzIHRvIGJlIGdyZWF0ZXIgdGhhbiAwLiBTcGVjaWZ5IHRoZSB2YWxpZCBzeW50YXggYW5kIHRyeSBhZ2Fpbi4iLCAkNSk7Ci0gICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNjUyNSwgZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICBmcmVlKGRlZkRhdGEtPmRlZk1zZyk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKCQ3IDwgMCkgewotICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+VHJhY2tDYmspCi0gICAgICAgICAgICAgIGlmIChkZWZEYXRhLT50cmFja1dhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+VHJhY2tXYXJuaW5ncykgewotICAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZk1zZyA9IChjaGFyKiltYWxsb2MoMTAwMCk7Ci0gICAgICAgICAgICAgICAgc3ByaW50ZiAoZGVmRGF0YS0+ZGVmTXNnLAotICAgICAgICAgICAgICAgICAgICJUaGUgU1RFUCBudW1iZXIgJWcgaW4gVFJBQ0sgaXMgaW52YWxpZC5cblRoZSBudW1iZXIgdmFsdWUgaGFzIHRvIGJlIGdyZWF0ZXIgdGhhbiAwLiBTcGVjaWZ5IHRoZSB2YWxpZCBzeW50YXggYW5kIHRyeSBhZ2Fpbi4iLCAkNyk7Ci0gICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNjUyNiwgZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICBmcmVlKGRlZkRhdGEtPmRlZk1zZyk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+VHJhY2tDYmspIHsKLSAgICAgICAgICAgIGRlZkRhdGEtPlRyYWNrLnNldERvKFJPVU5EKCQyKSwgUk9VTkQoJDUpLCAkNyk7Ci0gICAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPlRyYWNrQ2JrLCBkZWZyVHJhY2tDYmtUeXBlLCAmZGVmRGF0YS0+VHJhY2spOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi10cmFja19zdGFydDogS19UUkFDS1MgdHJhY2tfdHlwZQotICAgICAgICB7Ci0gICAgICAgICAgJCQgPSAkMjsKLSAgICAgICAgfQotCi10cmFja190eXBlOiBLX1gKLSAgICAgICAgICAgIHsgJCQgPSAoY2hhciopIlgiO30KLSAgICAgICAgfCBLX1kKLSAgICAgICAgICAgIHsgJCQgPSAoY2hhciopIlkiO30KLSAgICAgICAgICAgIAotdHJhY2tfb3B0czogdHJhY2tfbWFza19zdGF0ZW1lbnQgdHJhY2tfbGF5ZXJfc3RhdGVtZW50Ci0gICAgICAgIAotdHJhY2tfbWFza19zdGF0ZW1lbnQ6IC8vIGVtcHR5IAotICAgICAgICB8IEtfTUFTSyBOVU1CRVIgc2FtZV9tYXNrCi0gICAgICAgICAgIHsgCi0gICAgICAgICAgICAgIGlmIChkZWZEYXRhLT52YWxpZGF0ZU1hc2tJbnB1dCgoaW50KSQyLCBkZWZEYXRhLT50cmFja1dhcm5pbmdzLCBkZWZEYXRhLT5zZXR0aW5ncy0+VHJhY2tXYXJuaW5ncykpIHsKLSAgICAgICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlRyYWNrQ2JrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlZkRhdGEtPlRyYWNrLmFkZE1hc2soJDIsICQzKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotc2FtZV9tYXNrOiAKLSAgICAgICAgLy8gZW1wdHkgCi0gICAgICAgIHsgJCQgPSAwOyB9Ci0gICAgICAgIHwgS19TQU1FTUFTSwotICAgICAgICB7ICQkID0gMTsgfQotICAgICAgICAKLXRyYWNrX2xheWVyX3N0YXRlbWVudDogLy8gZW1wdHkgCi0gICAgICAgIHwgS19MQVlFUiB7IGRlZkRhdGEtPmR1bWJfbW9kZSA9IDEwMDA7IH0gdHJhY2tfbGF5ZXIgdHJhY2tfbGF5ZXJzCi0gICAgICAgICAgICB7IGRlZkRhdGEtPmR1bWJfbW9kZSA9IDA7IH0KLQotdHJhY2tfbGF5ZXJzOiAvLyBlbXB0eSAKLSAgICAgICAgfCB0cmFja19sYXllciB0cmFja19sYXllcnMgCi0gICAgICAgICAgICA7Ci0KLXRyYWNrX2xheWVyOiBUX1NUUklORwotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+VHJhY2tDYmspCi0gICAgICAgICAgICBkZWZEYXRhLT5UcmFjay5hZGRMYXllcigkMSk7Ci0gICAgICAgIH0KLQotZ2NlbGxncmlkOiBLX0dDRUxMR1JJRCB0cmFja190eXBlIE5VTUJFUiAKLSAgICAgS19ETyBOVU1CRVIgS19TVEVQIE5VTUJFUiAnOycKLSAgICAgICAgewotICAgICAgICAgIGlmICgkNSA8PSAwKSB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5HY2VsbEdyaWRDYmspCi0gICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5nY2VsbEdyaWRXYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPkdjZWxsR3JpZFdhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmTXNnID0gKGNoYXIqKW1hbGxvYygxMDAwKTsKLSAgICAgICAgICAgICAgICBzcHJpbnRmIChkZWZEYXRhLT5kZWZNc2csCi0gICAgICAgICAgICAgICAgICAgIlRoZSBETyBudW1iZXIgJWcgaW4gR0NFTExHUklEIGlzIGludmFsaWQuXG5UaGUgbnVtYmVyIHZhbHVlIGhhcyB0byBiZSBncmVhdGVyIHRoYW4gMC4gU3BlY2lmeSB0aGUgdmFsaWQgc3ludGF4IGFuZCB0cnkgYWdhaW4uIiwgJDUpOwotICAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZkVycm9yKDY1MjcsIGRlZkRhdGEtPmRlZk1zZyk7Ci0gICAgICAgICAgICAgICAgZnJlZShkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICgkNyA8IDApIHsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkdjZWxsR3JpZENiaykKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmdjZWxsR3JpZFdhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+R2NlbGxHcmlkV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZNc2cgPSAoY2hhciopbWFsbG9jKDEwMDApOwotICAgICAgICAgICAgICAgIHNwcmludGYgKGRlZkRhdGEtPmRlZk1zZywKLSAgICAgICAgICAgICAgICAgICAiVGhlIFNURVAgbnVtYmVyICVnIGluIEdDRUxMR1JJRCBpcyBpbnZhbGlkLlxuVGhlIG51bWJlciB2YWx1ZSBoYXMgdG8gYmUgZ3JlYXRlciB0aGFuIDAuIFNwZWNpZnkgdGhlIHZhbGlkIHN5bnRheCBhbmQgdHJ5IGFnYWluLiIsICQ3KTsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTI4LCBkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgIGZyZWUoZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5HY2VsbEdyaWRDYmspIHsKLSAgICAgICAgICAgIGRlZkRhdGEtPkdjZWxsR3JpZC5zZXR1cCgkMiwgUk9VTkQoJDMpLCBST1VORCgkNSksICQ3KTsKLSAgICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+R2NlbGxHcmlkQ2JrLCBkZWZyR2NlbGxHcmlkQ2JrVHlwZSwgJmRlZkRhdGEtPkdjZWxsR3JpZCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLWV4dGVuc2lvbl9zZWN0aW9uOiBLX0JFR0lORVhUCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5FeHRlbnNpb25DYmspCi0gICAgICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5FeHRlbnNpb25DYmssIGRlZnJFeHRlbnNpb25DYmtUeXBlLCAmZGVmRGF0YS0+SGlzdG9yeV90ZXh0WzBdKTsKLSAgICAgICAgfQotCi1leHRlbnNpb25fc3RtdDogJysnIEtfQkVHSU5FWFQKLSAgICAgICAgeyB9Ci0KLXZpYV9zZWN0aW9uOiB2aWEgdmlhX2RlY2xhcmF0aW9ucyB2aWFfZW5kCi0gICAgICAgICAgICA7Ci0gICAgICAgIAotdmlhOiBLX1ZJQVMgTlVNQkVSICc7JyAKLSAgICAgICAgewotICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlZpYVN0YXJ0Q2JrKQotICAgICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5WaWFTdGFydENiaywgZGVmclZpYVN0YXJ0Q2JrVHlwZSwgUk9VTkQoJDIpKTsKLSAgICAgICAgfQotCi12aWFfZGVjbGFyYXRpb25zOiAvLyBlbXB0eSAKLSAgICAgICAgfCB2aWFfZGVjbGFyYXRpb25zIHZpYV9kZWNsYXJhdGlvbgotICAgICAgICAgICAgOwotCi12aWFfZGVjbGFyYXRpb246ICctJyB7ZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTtkZWZEYXRhLT5ub19udW0gPSAxOyB9IFRfU1RSSU5HCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlZpYUNiaykgZGVmRGF0YS0+VmlhLnNldHVwKCQzKTsKLSAgICAgICAgICAgICAgZGVmRGF0YS0+dmlhUnVsZSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGxheWVyX3N0bXRzICc7JwotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5WaWFDYmspCi0gICAgICAgICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5WaWFDYmssIGRlZnJWaWFDYmtUeXBlLCAmZGVmRGF0YS0+VmlhKTsKLSAgICAgICAgICAgICAgZGVmRGF0YS0+VmlhLmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0KLWxheWVyX3N0bXRzOiAvLyBlbXB0eSAKLSAgICAgICAgfCBsYXllcl9zdG10cyBsYXllcl9zdG10Ci0gICAgICAgICAgICA7Ci0KLWxheWVyX3N0bXQ6ICcrJyBLX1JFQ1Qge2RlZkRhdGEtPmR1bWJfbW9kZSA9IDE7ZGVmRGF0YS0+bm9fbnVtID0gMTsgfSBUX1NUUklORyBtYXNrIHB0IHB0IAotICAgICAgICAgICAgeyAKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+VmlhQ2JrKQotICAgICAgICAgICAgICAgIGlmIChkZWZEYXRhLT52YWxpZGF0ZU1hc2tJbnB1dCgkNSwgZGVmRGF0YS0+dmlhV2FybmluZ3MsIGRlZkRhdGEtPnNldHRpbmdzLT5WaWFXYXJuaW5ncykpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+VmlhLmFkZExheWVyKCQ0LCAkNi54LCAkNi55LCAkNy54LCAkNy55LCAkNSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB8ICcrJyBLX1BPTFlHT04geyBkZWZEYXRhLT5kdW1iX21vZGUgPSAxOyB9IFRfU1RSSU5HIG1hc2sKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjYpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5WaWFDYmspIHsKLSAgICAgICAgICAgICAgICAgIGlmIChkZWZEYXRhLT52aWFXYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPlZpYVdhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZk1zZyA9IChjaGFyKiltYWxsb2MoMTAwMCk7Ci0gICAgICAgICAgICAgICAgICAgIHNwcmludGYgKGRlZkRhdGEtPmRlZk1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBQT0xZR09OIHN0YXRlbWVudCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBkZWZEYXRhLT5WZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNjUwOSwgZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGRlZkRhdGEtPkdlb21ldHJpZXMuUmVzZXQoKTsKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaXJzdFB0IG5leHRQdCBuZXh0UHQgb3RoZXJQdHMKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPj0gNS42KSB7ICAvLyBvbmx5IGFkZCBpZiA1LjYgb3IgYmV5b25kCi0gICAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+VmlhQ2JrKQotICAgICAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPnZhbGlkYXRlTWFza0lucHV0KCQ1LCBkZWZEYXRhLT52aWFXYXJuaW5ncywgZGVmRGF0YS0+c2V0dGluZ3MtPlZpYVdhcm5pbmdzKSkgewotICAgICAgICAgICAgICAgICAgICBkZWZEYXRhLT5WaWEuYWRkUG9seWdvbigkNCwgJmRlZkRhdGEtPkdlb21ldHJpZXMsICQ1KTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB8ICcrJyBLX1BBVFRFUk5OQU1FIHtkZWZEYXRhLT5kdW1iX21vZGUgPSAxO2RlZkRhdGEtPm5vX251bSA9IDE7IH0gVF9TVFJJTkcKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjYpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5WaWFDYmspCi0gICAgICAgICAgICAgICAgICBkZWZEYXRhLT5WaWEuYWRkUGF0dGVybigkNCk7Ci0gICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlZpYUNiaykKLSAgICAgICAgICAgICAgICAgIGlmIChkZWZEYXRhLT52aWFXYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPlZpYVdhcm5pbmdzKQotICAgICAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZXYXJuaW5nKDcwMTksICJUaGUgUEFUVEVSTk5BTUUgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cblRoZSBERUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LiIpOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfCAnKycgS19WSUFSVUxFIHtkZWZEYXRhLT5kdW1iX21vZGUgPSAxO2RlZkRhdGEtPm5vX251bSA9IDE7IH0gVF9TVFJJTkcKLSAgICAgICAgICAnKycgS19DVVRTSVpFIE5VTUJFUiBOVU1CRVIKLSAgICAgICAgICAnKycgS19MQVlFUlMge2RlZkRhdGEtPmR1bWJfbW9kZSA9IDM7ZGVmRGF0YS0+bm9fbnVtID0gMTsgfSBUX1NUUklORyBUX1NUUklORyBUX1NUUklORwotICAgICAgICAgICcrJyBLX0NVVFNQQUNJTkcgTlVNQkVSIE5VTUJFUgotICAgICAgICAgICcrJyBLX0VOQ0xPU1VSRSBOVU1CRVIgTlVNQkVSIE5VTUJFUiBOVU1CRVIKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGRlZkRhdGEtPnZpYVJ1bGUgPSAxOwotICAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjYpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5WaWFDYmspIHsKLSAgICAgICAgICAgICAgICAgIGlmIChkZWZEYXRhLT52aWFXYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPlZpYVdhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZk1zZyA9IChjaGFyKiltYWxsb2MoMTAwMCk7Ci0gICAgICAgICAgICAgICAgICAgIHNwcmludGYgKGRlZkRhdGEtPmRlZk1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBWSUFSVUxFIHN0YXRlbWVudCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBkZWZEYXRhLT5WZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNjU1NywgZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+VmlhQ2JrKQotICAgICAgICAgICAgICAgICAgIGRlZkRhdGEtPlZpYS5hZGRWaWFSdWxlKCQ0LCAoaW50KSQ3LCAoaW50KSQ4LCAkMTIsICQxMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQxNCwgKGludCkkMTcsIChpbnQpJDE4LCAoaW50KSQyMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpJDIyLCAoaW50KSQyMywgKGludCkkMjQpOyAKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB8IGxheWVyX3ZpYXJ1bGVfb3B0cwotICAgICAgICB8IGV4dGVuc2lvbl9zdG10Ci0gICAgICAgICAgeyAKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlZpYUV4dENiaykKLSAgICAgICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5WaWFFeHRDYmssIGRlZnJWaWFFeHRDYmtUeXBlLCAmZGVmRGF0YS0+SGlzdG9yeV90ZXh0WzBdKTsKLSAgICAgICAgICB9Ci0KLWxheWVyX3ZpYXJ1bGVfb3B0czogJysnIEtfUk9XQ09MIE5VTUJFUiBOVU1CRVIKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCFkZWZEYXRhLT52aWFSdWxlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+VmlhQ2JrKSB7Ci0gICAgICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+dmlhV2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5WaWFXYXJuaW5ncykgewotICAgICAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTU5LCAiVGhlIFJPV0NPTCBzdGF0ZW1lbnQgaXMgbWlzc2luZyBmcm9tIHRoZSBWSUFSVUxFIHN0YXRlbWVudC4gRW5zdXJlIHRoYXQgaXQgZXhpc3RzIGluIHRoZSBWSUFSVUxFIHN0YXRlbWVudC4iKTsKLSAgICAgICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+VmlhQ2JrKQotICAgICAgICAgICAgICAgICBkZWZEYXRhLT5WaWEuYWRkUm93Q29sKChpbnQpJDMsIChpbnQpJDQpOwotICAgICAgICAgICAgfQotICAgICAgICB8ICcrJyBLX09SSUdJTiBOVU1CRVIgTlVNQkVSCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICghZGVmRGF0YS0+dmlhUnVsZSkgewotICAgICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlZpYUNiaykgewotICAgICAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPnZpYVdhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+VmlhV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNjU2MCwgIlRoZSBPUklHSU4gc3RhdGVtZW50IGlzIG1pc3NpbmcgZnJvbSB0aGUgVklBUlVMRSBzdGF0ZW1lbnQuIEVuc3VyZSB0aGF0IGl0IGV4aXN0cyBpbiB0aGUgVklBUlVMRSBzdGF0ZW1lbnQuIik7Ci0gICAgICAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlZpYUNiaykKLSAgICAgICAgICAgICAgICAgZGVmRGF0YS0+VmlhLmFkZE9yaWdpbigoaW50KSQzLCAoaW50KSQ0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfCAnKycgS19PRkZTRVQgTlVNQkVSIE5VTUJFUiBOVU1CRVIgTlVNQkVSCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICghZGVmRGF0YS0+dmlhUnVsZSkgewotICAgICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlZpYUNiaykgewotICAgICAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPnZpYVdhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+VmlhV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNjU2MSwgIlRoZSBPRkZTRVQgc3RhdGVtZW50IGlzIG1pc3NpbmcgZnJvbSB0aGUgVklBUlVMRSBzdGF0ZW1lbnQuIEVuc3VyZSB0aGF0IGl0IGV4aXN0cyBpbiB0aGUgVklBUlVMRSBzdGF0ZW1lbnQuIik7Ci0gICAgICAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlZpYUNiaykKLSAgICAgICAgICAgICAgICAgZGVmRGF0YS0+VmlhLmFkZE9mZnNldCgoaW50KSQzLCAoaW50KSQ0LCAoaW50KSQ1LCAoaW50KSQ2KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfCAnKycgS19QQVRURVJOIHtkZWZEYXRhLT5kdW1iX21vZGUgPSAxO2RlZkRhdGEtPm5vX251bSA9IDE7IH0gVF9TVFJJTkcgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICghZGVmRGF0YS0+dmlhUnVsZSkgewotICAgICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlZpYUNiaykgewotICAgICAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPnZpYVdhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+VmlhV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNjU2MiwgIlRoZSBQQVRURVJOIHN0YXRlbWVudCBpcyBtaXNzaW5nIGZyb20gdGhlIFZJQVJVTEUgc3RhdGVtZW50LiBFbnN1cmUgdGhhdCBpdCBleGlzdHMgaW4gdGhlIFZJQVJVTEUgc3RhdGVtZW50LiIpOwotICAgICAgICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5WaWFDYmspCi0gICAgICAgICAgICAgICAgIGRlZkRhdGEtPlZpYS5hZGRDdXRQYXR0ZXJuKCQ0KTsKLSAgICAgICAgICAgIH0KLQotZmlyc3RQdDogcHQKLSAgICAgICAgICB7IGRlZkRhdGEtPkdlb21ldHJpZXMuc3RhcnRMaXN0KCQxLngsICQxLnkpOyB9Ci0KLW5leHRQdDogcHQKLSAgICAgICAgICB7IGRlZkRhdGEtPkdlb21ldHJpZXMuYWRkVG9MaXN0KCQxLngsICQxLnkpOyB9Ci0KLW90aGVyUHRzOiAvLyBlbXB0eSAKLSAgICAgICAgfCBvdGhlclB0cyBuZXh0UHQKLSAgICAgICAgOwotCi1wdDogJygnIE5VTUJFUiBOVU1CRVIgJyknCi0gICAgICAgICAgewotICAgICAgICAgICAgZGVmRGF0YS0+c2F2ZV94ID0gJDI7Ci0gICAgICAgICAgICBkZWZEYXRhLT5zYXZlX3kgPSAkMzsKLSAgICAgICAgICAgICQkLnggPSBST1VORCgkMik7Ci0gICAgICAgICAgICAkJC55ID0gUk9VTkQoJDMpOwotICAgICAgICAgIH0KLSAgICAgICAgfCAnKCcgJyonIE5VTUJFUiAnKScKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBkZWZEYXRhLT5zYXZlX3kgPSAkMzsKLSAgICAgICAgICAgICQkLnggPSBST1VORChkZWZEYXRhLT5zYXZlX3gpOwotICAgICAgICAgICAgJCQueSA9IFJPVU5EKCQzKTsKLSAgICAgICAgICB9Ci0gICAgICAgIHwgJygnIE5VTUJFUiAnKicgJyknCi0gICAgICAgICAgewotICAgICAgICAgICAgZGVmRGF0YS0+c2F2ZV94ID0gJDI7Ci0gICAgICAgICAgICAkJC54ID0gUk9VTkQoJDIpOwotICAgICAgICAgICAgJCQueSA9IFJPVU5EKGRlZkRhdGEtPnNhdmVfeSk7Ci0gICAgICAgICAgfQotICAgICAgICB8ICcoJyAnKicgJyonICcpJwotICAgICAgICAgIHsKLSAgICAgICAgICAgICQkLnggPSBST1VORChkZWZEYXRhLT5zYXZlX3gpOwotICAgICAgICAgICAgJCQueSA9IFJPVU5EKGRlZkRhdGEtPnNhdmVfeSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotbWFzazogLy8gZW1wdHkgCi0gICAgICB7ICQkID0gMDsgfQotICAgICAgfCAnKycgS19NQVNLIE5VTUJFUgotICAgICAgeyAkJCA9ICQzOyB9Ci0KLXZpYV9lbmQ6IEtfRU5EIEtfVklBUwotICAgICAgICB7IAotICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlZpYUVuZENiaykKLSAgICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+VmlhRW5kQ2JrLCBkZWZyVmlhRW5kQ2JrVHlwZSwgMCk7Ci0gICAgICAgIH0KLQotcmVnaW9uc19zZWN0aW9uOiByZWdpb25zX3N0YXJ0IHJlZ2lvbnNfc3RtdHMgS19FTkQgS19SRUdJT05TCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5SZWdpb25FbmRDYmspCi0gICAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPlJlZ2lvbkVuZENiaywgZGVmclJlZ2lvbkVuZENia1R5cGUsIDApOwotICAgICAgICB9Ci0KLXJlZ2lvbnNfc3RhcnQ6IEtfUkVHSU9OUyBOVU1CRVIgJzsnCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5SZWdpb25TdGFydENiaykKLSAgICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+UmVnaW9uU3RhcnRDYmssIGRlZnJSZWdpb25TdGFydENia1R5cGUsIFJPVU5EKCQyKSk7Ci0gICAgICAgIH0KLQotcmVnaW9uc19zdG10czogLy8gZW1wdHkgCi0gICAgICAgIHwgcmVnaW9uc19zdG10cyByZWdpb25zX3N0bXQKLSAgICAgICAgICAgIHt9Ci0KLXJlZ2lvbnNfc3RtdDogJy0nIHsgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTsgZGVmRGF0YS0+bm9fbnVtID0gMTsgfSBUX1NUUklORwotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UmVnaW9uQ2JrKQotICAgICAgICAgICAgIGRlZkRhdGEtPlJlZ2lvbi5zZXR1cCgkMyk7Ci0gICAgICAgICAgZGVmRGF0YS0+cmVnVHlwZURlZiA9IDA7Ci0gICAgICAgIH0KLSAgICAgcmVjdF9saXN0IHJlZ2lvbl9vcHRpb25zICc7JwotICAgICAgICB7IENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+UmVnaW9uQ2JrLCBkZWZyUmVnaW9uQ2JrVHlwZSwgJmRlZkRhdGEtPlJlZ2lvbik7IH0KLQotcmVjdF9saXN0IDoKLSAgICAgIHB0IHB0Ci0gICAgICAgIHsgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UmVnaW9uQ2JrKQotICAgICAgICAgIGRlZkRhdGEtPlJlZ2lvbi5hZGRSZWN0KCQxLngsICQxLnksICQyLngsICQyLnkpOyB9Ci0gICAgICB8IHJlY3RfbGlzdCBwdCBwdAotICAgICAgICB7IGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlJlZ2lvbkNiaykKLSAgICAgICAgICBkZWZEYXRhLT5SZWdpb24uYWRkUmVjdCgkMi54LCAkMi55LCAkMy54LCAkMy55KTsgfQotICAgICAgOwotCi1yZWdpb25fb3B0aW9uczogLy8gZW1wdHkgCi0gICAgICB8IHJlZ2lvbl9vcHRpb25zIHJlZ2lvbl9vcHRpb24KLSAgICAgIDsKLQotcmVnaW9uX29wdGlvbiA6ICcrJyBLX1BST1BFUlRZIHtkZWZEYXRhLT5kdW1iX21vZGUgPSBERUZfTUFYX0lOVDsgfQotICAgICAgICAgICAgICAgIHJlZ2lvbl9wcm9wX2xpc3QKLSAgICAgICAgIHsgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMDsgfQotICAgICAgfCAnKycgS19UWVBFIHJlZ2lvbl90eXBlICAgICAgLy8gNS40LjEgCi0gICAgICAgICB7Ci0gICAgICAgICAgIGlmIChkZWZEYXRhLT5yZWdUeXBlRGVmKSB7Ci0gICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlJlZ2lvbkNiaykgewotICAgICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5yZWdpb25XYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPlJlZ2lvbldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTYzLCAiVGhlIFRZUEUgc3RhdGVtZW50IGFscmVhZHkgZXhpc3RzLiBJdCBoYXMgYmVlbiBkZWZpbmVkIGluIHRoZSBSRUdJT04gc3RhdGVtZW50LiIpOwotICAgICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UmVnaW9uQ2JrKSBkZWZEYXRhLT5SZWdpb24uc2V0VHlwZSgkMyk7Ci0gICAgICAgICAgIGRlZkRhdGEtPnJlZ1R5cGVEZWYgPSAxOwotICAgICAgICAgfQotICAgICAgOwotCi1yZWdpb25fcHJvcF9saXN0IDogLy8gZW1wdHkgCi0gICAgICAgfCByZWdpb25fcHJvcF9saXN0IHJlZ2lvbl9wcm9wCi0gICAgICAgOwotICAgICAgIAotcmVnaW9uX3Byb3AgOiBUX1NUUklORyBOVU1CRVIKLSAgICAgICAgewotICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlJlZ2lvbkNiaykgewotICAgICAgICAgICAgIGNoYXIgcHJvcFRwOwotICAgICAgICAgICAgIGNoYXIqIHN0ciA9IGRlZkRhdGEtPnJpbmdDb3B5KCIgICAgICAgICAgICAgICAgICAgICAgICIpOwotICAgICAgICAgICAgIHByb3BUcCA9IGRlZkRhdGEtPnNlc3Npb24tPlJlZ2lvblByb3AucHJvcFR5cGUoJDEpOwotICAgICAgICAgICAgIENIS1BST1BUWVBFKHByb3BUcCwgJDEsICJSRUdJT04iKTsKLSAgICAgICAgICAgICAvLyBGb3IgYmFja3dvcmQgY29tcGF0aWJpbGl0eSwgYWxzbyBzZXQgdGhlIHN0cmluZyB2YWx1ZSAKLSAgICAgICAgICAgICAvLyBXZSB3aWxsIHVzZSBhIHRlbXBvcmFyeSBzdHJpbmcgdG8gc3RvcmUgdGhlIG51bWJlci4KLSAgICAgICAgICAgICAvLyBUaGUgc3RyaW5nIHNwYWNlIGlzIGJvcnJvd2VkIGZyb20gdGhlIHJpbmcgYnVmZmVyCi0gICAgICAgICAgICAgLy8gaW4gdGhlIGxleGVyLgotICAgICAgICAgICAgIHNwcmludGYoc3RyLCAiJWciLCAkMik7Ci0gICAgICAgICAgICAgZGVmRGF0YS0+UmVnaW9uLmFkZE51bVByb3BlcnR5KCQxLCAkMiwgc3RyLCBwcm9wVHApOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfCBUX1NUUklORyBRU1RSSU5HCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5SZWdpb25DYmspIHsKLSAgICAgICAgICAgICBjaGFyIHByb3BUcDsKLSAgICAgICAgICAgICBwcm9wVHAgPSBkZWZEYXRhLT5zZXNzaW9uLT5SZWdpb25Qcm9wLnByb3BUeXBlKCQxKTsKLSAgICAgICAgICAgICBDSEtQUk9QVFlQRShwcm9wVHAsICQxLCAiUkVHSU9OIik7Ci0gICAgICAgICAgICAgZGVmRGF0YS0+UmVnaW9uLmFkZFByb3BlcnR5KCQxLCAkMiwgcHJvcFRwKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIHwgVF9TVFJJTkcgVF9TVFJJTkcKLSAgICAgICAgewotICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlJlZ2lvbkNiaykgewotICAgICAgICAgICAgIGNoYXIgcHJvcFRwOwotICAgICAgICAgICAgIHByb3BUcCA9IGRlZkRhdGEtPnNlc3Npb24tPlJlZ2lvblByb3AucHJvcFR5cGUoJDEpOwotICAgICAgICAgICAgIENIS1BST1BUWVBFKHByb3BUcCwgJDEsICJSRUdJT04iKTsKLSAgICAgICAgICAgICBkZWZEYXRhLT5SZWdpb24uYWRkUHJvcGVydHkoJDEsICQyLCBwcm9wVHApOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi1yZWdpb25fdHlwZTogS19GRU5DRQotICAgICAgICAgICAgeyAkJCA9IChjaGFyKikiRkVOQ0UiOyB9Ci0gICAgICB8IEtfR1VJREUKLSAgICAgICAgICAgIHsgJCQgPSAoY2hhciopIkdVSURFIjsgfQotICAKLWNvbXBzX21hc2tTaGlmdF9zZWN0aW9uIDogS19DT01QU01BU0tTSElGVCAgbGF5ZXJfc3RhdGVtZW50ICc7JwotICAgICAgICAgewotICAgICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuOCkgewotICAgICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jb21wb25lbnRXYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPkNvbXBvbmVudFdhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmTXNnID0gKGNoYXIqKW1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgICAgICAgc3ByaW50ZiAoZGVmRGF0YS0+ZGVmTXNnLAotICAgICAgICAgICAgICAgICAgICAgIlRoZSBNQVNLU0hJRlQgc3RhdGVtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuOCBhbmQgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnIiwgZGVmRGF0YS0+VmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNzQxNSwgZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICAgICBmcmVlKGRlZkRhdGEtPmRlZk1zZyk7Ci0gICAgICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+Q29tcG9uZW50TWFza1NoaWZ0TGF5ZXJDYmspIHsKLSAgICAgICAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPkNvbXBvbmVudE1hc2tTaGlmdExheWVyQ2JrLCBkZWZyQ29tcG9uZW50TWFza1NoaWZ0TGF5ZXJDYmtUeXBlLCAmZGVmRGF0YS0+Q29tcG9uZW50TWFza1NoaWZ0TGF5ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgICAgICAgICAKLWNvbXBzX3NlY3Rpb246IHN0YXJ0X2NvbXBzIGNvbXBzX3J1bGUgZW5kX2NvbXBzCi0gICAgICAgICAgICA7Ci0gICAgICAgICAKLXN0YXJ0X2NvbXBzOiBLX0NPTVBTIE5VTUJFUiAnOycKLSAgICAgICAgIHsgCi0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Db21wb25lbnRTdGFydENiaykKLSAgICAgICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5Db21wb25lbnRTdGFydENiaywgZGVmckNvbXBvbmVudFN0YXJ0Q2JrVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgUk9VTkQoJDIpKTsKLSAgICAgICAgIH0KLSAgICAgICAgIAotbGF5ZXJfc3RhdGVtZW50IDogLy8gZW1wdHkgCi0gICAgICAgICB8IGxheWVyX3N0YXRlbWVudCBtYXNrTGF5ZXIKLSAgICAgICAgIDsKLSAgICAgICAgIAotbWFza0xheWVyOiBUX1NUUklORwotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Db21wb25lbnRNYXNrU2hpZnRMYXllckNiaykgewotICAgICAgICAgICAgICBkZWZEYXRhLT5Db21wb25lbnRNYXNrU2hpZnRMYXllci5hZGRNYXNrU2hpZnRMYXllcigkMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gCi0KLWNvbXBzX3J1bGU6IC8vIGVtcHR5IAotICAgICAgICB8IGNvbXBzX3J1bGUgY29tcAotICAgICAgICAgICAgOwotCi1jb21wOiBjb21wX3N0YXJ0IGNvbXBfb3B0aW9ucyAnOycKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkNvbXBvbmVudENiaykKLSAgICAgICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5Db21wb25lbnRDYmssIGRlZnJDb21wb25lbnRDYmtUeXBlLCAmZGVmRGF0YS0+Q29tcG9uZW50KTsKLSAgICAgICAgIH0KLQotY29tcF9zdGFydDogY29tcF9pZF9hbmRfbmFtZSBjb21wX25ldF9saXN0Ci0gICAgICAgICB7Ci0gICAgICAgICAgICBkZWZEYXRhLT5kdW1iX21vZGUgPSAwOwotICAgICAgICAgICAgZGVmRGF0YS0+bm9fbnVtID0gMDsKLSAgICAgICAgIH0KLQotY29tcF9pZF9hbmRfbmFtZTogJy0nIHtkZWZEYXRhLT5kdW1iX21vZGUgPSBERUZfTUFYX0lOVDsgZGVmRGF0YS0+bm9fbnVtID0gREVGX01BWF9JTlQ7IH0KLSAgICAgICBUX1NUUklORyBUX1NUUklORwotICAgICAgICAgewotICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+Q29tcG9uZW50Q2JrKQotICAgICAgICAgICAgICBkZWZEYXRhLT5Db21wb25lbnQuSWRBbmROYW1lKCQzLCAkNCk7Ci0gICAgICAgICB9Ci0KLWNvbXBfbmV0X2xpc3Q6IC8vIGVtcHR5IAotICAgICAgICB7IH0KLSAgICAgICAgfCBjb21wX25ldF9saXN0ICcqJwotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Db21wb25lbnRDYmspCi0gICAgICAgICAgICAgICAgZGVmRGF0YS0+Q29tcG9uZW50LmFkZE5ldCgiKiIpOwotICAgICAgICAgICAgfQotICAgICAgICB8IGNvbXBfbmV0X2xpc3QgVF9TVFJJTkcKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+Q29tcG9uZW50Q2JrKQotICAgICAgICAgICAgICAgIGRlZkRhdGEtPkNvbXBvbmVudC5hZGROZXQoJDIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi1jb21wX29wdGlvbnM6IC8vIGVtcHR5IAotICAgICAgICB8ICAgICBjb21wX29wdGlvbnMgY29tcF9vcHRpb24KLSAgICAgICAgICAgIDsKLSAgICAKLWNvbXBfb3B0aW9uOiAgY29tcF9nZW5lcmF0ZSB8IGNvbXBfc291cmNlIHwgY29tcF90eXBlIHwgd2VpZ2h0IHwgbWFza1NoaWZ0IHwKLSAgICAgICAgICAgICAgY29tcF9mb3JlaWduIHwgY29tcF9yZWdpb24gfCBjb21wX2VlcSB8IGNvbXBfaGFsbyB8Ci0gICAgICAgICAgICAgIGNvbXBfcm91dGVoYWxvIHwgY29tcF9wcm9wZXJ0eSB8IGNvbXBfZXh0ZW5zaW9uX3N0bXQKLSAgICAgICAgICAgIDsKLQotY29tcF9leHRlbnNpb25fc3RtdDogZXh0ZW5zaW9uX3N0bXQKLSAgICAgICAgewotICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkNvbXBvbmVudENiaykKLSAgICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+Q29tcG9uZW50RXh0Q2JrLCBkZWZyQ29tcG9uZW50RXh0Q2JrVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICZkZWZEYXRhLT5IaXN0b3J5X3RleHRbMF0pOwotICAgICAgICB9Ci0KLWNvbXBfZWVxOiAnKycgS19FRVFNQVNURVIge2RlZkRhdGEtPmR1bWJfbW9kZT0xOyBkZWZEYXRhLT5ub19udW0gPSAxOyB9IFRfU1RSSU5HCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Db21wb25lbnRDYmspCi0gICAgICAgICAgICBkZWZEYXRhLT5Db21wb25lbnQuc2V0RUVRKCQ0KTsKLSAgICAgICAgfQotCi1jb21wX2dlbmVyYXRlOiAnKycgS19DT01QX0dFTiB7IGRlZkRhdGEtPmR1bWJfbW9kZSA9IDI7ICBkZWZEYXRhLT5ub19udW0gPSAyOyB9IFRfU1RSSU5HCi0gICAgb3B0X3BhdHRlcm4KLSAgICAgICAgewotICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkNvbXBvbmVudENiaykKLSAgICAgICAgICAgICBkZWZEYXRhLT5Db21wb25lbnQuc2V0R2VuZXJhdGUoJDQsICQ1KTsKLSAgICAgICAgfQotb3B0X3BhdHRlcm4gOgotICAgIC8vIGVtcHR5IAotICAgICAgeyAkJCA9IChjaGFyKikiIjsgfQotICAgIHwgVF9TVFJJTkcKLSAgICAgIHsgJCQgPSAkMTsgfQotCi1jb21wX3NvdXJjZTogJysnIEtfU09VUkNFIHNvdXJjZV90eXBlIAotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+Q29tcG9uZW50Q2JrKQotICAgICAgICAgICAgZGVmRGF0YS0+Q29tcG9uZW50LnNldFNvdXJjZSgkMyk7Ci0gICAgICAgIH0KLQotc291cmNlX3R5cGU6IEtfTkVUTElTVAotICAgICAgICAgICAgeyAkJCA9IChjaGFyKikiTkVUTElTVCI7IH0KLSAgICAgICAgfCBLX0RJU1QKLSAgICAgICAgICAgIHsgJCQgPSAoY2hhciopIkRJU1QiOyB9Ci0gICAgICAgIHwgS19VU0VSCi0gICAgICAgICAgICB7ICQkID0gKGNoYXIqKSJVU0VSIjsgfQotICAgICAgICB8IEtfVElNSU5HCi0gICAgICAgICAgICB7ICQkID0gKGNoYXIqKSJUSU1JTkciOyB9Ci0KLQotY29tcF9yZWdpb246Ci0gICAgICAgIGNvbXBfcmVnaW9uX3N0YXJ0IGNvbXBfcG50X2xpc3QKLSAgICAgICAgeyB9Ci0gICAgICAgIHwgY29tcF9yZWdpb25fc3RhcnQgVF9TVFJJTkcgCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Db21wb25lbnRDYmspCi0gICAgICAgICAgICBkZWZEYXRhLT5Db21wb25lbnQuc2V0UmVnaW9uTmFtZSgkMik7Ci0gICAgICAgIH0KLQotY29tcF9wbnRfbGlzdDogcHQgcHQKLSAgICAgICAgeyAKLSAgICAgICAgICAvLyAxMS8xMi8yMDAyIC0gdGhpcyBpcyBvYnNvbGV0ZSBpbiA1LjUsICYgd2lsbCBiZSBpZ25vcmVkIAotICAgICAgICAgIGlmIChkZWZEYXRhLT5WZXJzaW9uTnVtIDwgNS41KSB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Db21wb25lbnRDYmspCi0gICAgICAgICAgICAgICBkZWZEYXRhLT5Db21wb25lbnQuc2V0UmVnaW9uQm91bmRzKCQxLngsICQxLnksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDIueCwgJDIueSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGRlZkRhdGEtPmRlZldhcm5pbmcoNzAyMCwgIlRoZSBSRUdJT04gcHQgcHQgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS41IGFuZCBsYXRlci5cblRoZSBERUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LiIpOwotICAgICAgICB9IAotICAgIHwgY29tcF9wbnRfbGlzdCBwdCBwdAotICAgICAgICB7IAotICAgICAgICAgIC8vIDExLzEyLzIwMDIgLSB0aGlzIGlzIG9ic29sZXRlIGluIDUuNSwgJiB3aWxsIGJlIGlnbm9yZWQgCi0gICAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjUpIHsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkNvbXBvbmVudENiaykKLSAgICAgICAgICAgICAgIGRlZkRhdGEtPkNvbXBvbmVudC5zZXRSZWdpb25Cb3VuZHMoJDIueCwgJDIueSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQzLngsICQzLnkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBkZWZEYXRhLT5kZWZXYXJuaW5nKDcwMjAsICJUaGUgUkVHSU9OIHB0IHB0IHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNSBhbmQgbGF0ZXIuXG5UaGUgREVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC4iKTsKLSAgICAgICAgfSAKLQotY29tcF9oYWxvOiAnKycgS19IQUxPICAgICAgICAgICAgICAgICAgICAvLyA1LjcgCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuNikgewotICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkNvbXBvbmVudENiaykgewotICAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNvbXBvbmVudFdhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+Q29tcG9uZW50V2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmTXNnID0gKGNoYXIqKW1hbGxvYygxMDAwKTsKLSAgICAgICAgICAgICAgICAgc3ByaW50ZiAoZGVmRGF0YS0+ZGVmTXNnLAotICAgICAgICAgICAgICAgICAgICAiVGhlIEhBTE8gc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjYgYW5kIGxhdGVyIHN5bnRheC5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgZGVmRGF0YS0+VmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZkVycm9yKDY1MjksIGRlZkRhdGEtPmRlZk1zZyk7Ci0gICAgICAgICAgICAgICAgIGZyZWUoZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBoYWxvX3NvZnQgTlVNQkVSIE5VTUJFUiBOVU1CRVIgTlVNQkVSIAotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+Q29tcG9uZW50Q2JrKQotICAgICAgICAgICAgZGVmRGF0YS0+Q29tcG9uZW50LnNldEhhbG8oKGludCkkNSwgKGludCkkNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSQ3LCAoaW50KSQ4KTsKLSAgICAgICAgfQotCi1oYWxvX3NvZnQ6IC8vIDUuNyAKLSAgICB8IEtfU09GVAotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuNykgewotICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Db21wb25lbnRDYmspIHsKLSAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y29tcG9uZW50V2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5Db21wb25lbnRXYXJuaW5ncykgewotICAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZk1zZyA9IChjaGFyKiltYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICAgIHNwcmludGYgKGRlZkRhdGEtPmRlZk1zZywKLSAgICAgICAgICAgICAgICAgICJUaGUgSEFMTyBTT0ZUIGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNyBvciBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgZGVmRGF0YS0+VmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNjU1MCwgZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICBmcmVlKGRlZkRhdGEtPmRlZk1zZyk7Ci0gICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkNvbXBvbmVudENiaykKLSAgICAgICAgICAgICBkZWZEYXRhLT5Db21wb25lbnQuc2V0SGFsb1NvZnQoKTsKLSAgICAgICAgfQotICAgICAgfQotCi0vLyA1LjcgCi1jb21wX3JvdXRlaGFsbzogJysnIEtfUk9VVEVIQUxPIE5VTUJFUiB7IGRlZkRhdGEtPmR1bWJfbW9kZSA9IDI7IGRlZkRhdGEtPm5vX251bSA9IDI7IH0gVF9TVFJJTkcgVF9TVFJJTkcKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjcpIHsKLSAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+Q29tcG9uZW50Q2JrKSB7Ci0gICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNvbXBvbmVudFdhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+Q29tcG9uZW50V2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZNc2cgPSAoY2hhciopbWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgICBzcHJpbnRmIChkZWZEYXRhLT5kZWZNc2csCi0gICAgICAgICAgICAgICAgICAiVGhlIFJPVVRFSEFMTyBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1Ljcgb3IgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGRlZkRhdGEtPlZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZkVycm9yKDY1NTEsIGRlZkRhdGEtPmRlZk1zZyk7Ci0gICAgICAgICAgICAgICAgZnJlZShkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Db21wb25lbnRDYmspCi0gICAgICAgICAgICAgZGVmRGF0YS0+Q29tcG9uZW50LnNldFJvdXRlSGFsbygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSQzLCAkNSwgJDYpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLWNvbXBfcHJvcGVydHk6ICcrJyBLX1BST1BFUlRZIHsgZGVmRGF0YS0+ZHVtYl9tb2RlID0gREVGX01BWF9JTlQ7IH0KLSAgICAgIGNvbXBfcHJvcF9saXN0Ci0gICAgICB7IGRlZkRhdGEtPmR1bWJfbW9kZSA9IDA7IH0KLQotY29tcF9wcm9wX2xpc3Q6IGNvbXBfcHJvcAotICAgIHwgY29tcF9wcm9wX2xpc3QgY29tcF9wcm9wCi0gICAgICAgICAgOwotCi1jb21wX3Byb3A6IFRfU1RSSU5HIE5VTUJFUgotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+Q29tcG9uZW50Q2JrKSB7Ci0gICAgICAgICAgICBjaGFyIHByb3BUcDsKLSAgICAgICAgICAgIGNoYXIqIHN0ciA9IGRlZkRhdGEtPnJpbmdDb3B5KCIgICAgICAgICAgICAgICAgICAgICAgICIpOwotICAgICAgICAgICAgcHJvcFRwID0gZGVmRGF0YS0+c2Vzc2lvbi0+Q29tcFByb3AucHJvcFR5cGUoJDEpOwotICAgICAgICAgICAgQ0hLUFJPUFRZUEUocHJvcFRwLCAkMSwgIkNPTVBPTkVOVCIpOwotICAgICAgICAgICAgc3ByaW50ZihzdHIsICIlZyIsICQyKTsKLSAgICAgICAgICAgIGRlZkRhdGEtPkNvbXBvbmVudC5hZGROdW1Qcm9wZXJ0eSgkMSwgJDIsIHN0ciwgcHJvcFRwKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgfCBUX1NUUklORyBRU1RSSU5HCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Db21wb25lbnRDYmspIHsKLSAgICAgICAgICAgIGNoYXIgcHJvcFRwOwotICAgICAgICAgICAgcHJvcFRwID0gZGVmRGF0YS0+c2Vzc2lvbi0+Q29tcFByb3AucHJvcFR5cGUoJDEpOwotICAgICAgICAgICAgQ0hLUFJPUFRZUEUocHJvcFRwLCAkMSwgIkNPTVBPTkVOVCIpOwotICAgICAgICAgICAgZGVmRGF0YS0+Q29tcG9uZW50LmFkZFByb3BlcnR5KCQxLCAkMiwgcHJvcFRwKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgfCBUX1NUUklORyBUX1NUUklORwotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+Q29tcG9uZW50Q2JrKSB7Ci0gICAgICAgICAgICBjaGFyIHByb3BUcDsKLSAgICAgICAgICAgIHByb3BUcCA9IGRlZkRhdGEtPnNlc3Npb24tPkNvbXBQcm9wLnByb3BUeXBlKCQxKTsKLSAgICAgICAgICAgIENIS1BST1BUWVBFKHByb3BUcCwgJDEsICJDT01QT05FTlQiKTsKLSAgICAgICAgICAgIGRlZkRhdGEtPkNvbXBvbmVudC5hZGRQcm9wZXJ0eSgkMSwgJDIsIHByb3BUcCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLWNvbXBfcmVnaW9uX3N0YXJ0OiAnKycgS19SRUdJT04KLSAgICAgICAgeyBkZWZEYXRhLT5kdW1iX21vZGUgPSAxOyBkZWZEYXRhLT5ub19udW0gPSAxOyB9Ci0KLWNvbXBfZm9yZWlnbjogJysnIEtfRk9SRUlHTiB7IGRlZkRhdGEtPmR1bWJfbW9kZSA9IDE7IGRlZkRhdGEtPm5vX251bSA9IDE7IH0gVF9TVFJJTkcKLSAgICAgICAgb3B0X3BhcmVuIG9yaWVudAotICAgICAgICB7IAotICAgICAgICAgIGlmIChkZWZEYXRhLT5WZXJzaW9uTnVtIDwgNS42KSB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Db21wb25lbnRDYmspIHsKLSAgICAgICAgICAgICAgZGVmRGF0YS0+Q29tcG9uZW50LnNldEZvcmVpZ25OYW1lKCQ0KTsKLSAgICAgICAgICAgICAgZGVmRGF0YS0+Q29tcG9uZW50LnNldEZvcmVpZ25Mb2NhdGlvbigkNS54LCAkNS55LCAkNik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkNvbXBvbmVudENiaykKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNvbXBvbmVudFdhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+Q29tcG9uZW50V2FybmluZ3MpCi0gICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmV2FybmluZyg3MDIxLCAiVGhlIEZPUkVJR04gc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cblRoZSBERUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LiIpOwotICAgICAgICAgfQotCi1vcHRfcGFyZW46Ci0gICAgICAgcHQKLSAgICAgICAgIHsgJCQgPSAkMTsgfQotICAgICAgIHwgTlVNQkVSIE5VTUJFUgotICAgICAgICAgeyAkJC54ID0gUk9VTkQoJDEpOyAkJC55ID0gUk9VTkQoJDIpOyB9Ci0KLWNvbXBfdHlwZTogcGxhY2VtZW50X3N0YXR1cyBwdCBvcmllbnQKLSAgICAgICAgewotICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkNvbXBvbmVudENiaykgewotICAgICAgICAgICAgZGVmRGF0YS0+Q29tcG9uZW50LnNldFBsYWNlbWVudFN0YXR1cygkMSk7Ci0gICAgICAgICAgICBkZWZEYXRhLT5Db21wb25lbnQuc2V0UGxhY2VtZW50TG9jYXRpb24oJDIueCwgJDIueSwgJDMpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB8ICcrJyBLX1VOUExBQ0VECi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Db21wb25lbnRDYmspCi0gICAgICAgICAgICBkZWZEYXRhLT5Db21wb25lbnQuc2V0UGxhY2VtZW50U3RhdHVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZJX0NPTVBPTkVOVF9VTlBMQUNFRCk7Ci0gICAgICAgICAgICBkZWZEYXRhLT5Db21wb25lbnQuc2V0UGxhY2VtZW50TG9jYXRpb24oLTEsIC0xLCAtMSk7Ci0gICAgICAgIH0KLSAgICAgICAgfCAnKycgS19VTlBMQUNFRCBwdCBvcmllbnQKLSAgICAgICAgewotICAgICAgICAgIGlmIChkZWZEYXRhLT5WZXJzaW9uTnVtIDwgNS40KSB7ICAgLy8gUENSIDQ5NTQ2MyAKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkNvbXBvbmVudENiaykgewotICAgICAgICAgICAgICBkZWZEYXRhLT5Db21wb25lbnQuc2V0UGxhY2VtZW50U3RhdHVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGSV9DT01QT05FTlRfVU5QTEFDRUQpOwotICAgICAgICAgICAgICBkZWZEYXRhLT5Db21wb25lbnQuc2V0UGxhY2VtZW50TG9jYXRpb24oJDMueCwgJDMueSwgJDQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y29tcG9uZW50V2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5Db21wb25lbnRXYXJuaW5ncykKLSAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZldhcm5pbmcoNzAyMiwgIkluIHRoZSBDT01QT05FTlQgVU5QTEFDRUQgc3RhdGVtZW50LCBwb2ludCBhbmQgb3JpZW50IGFyZSBpbnZhbGlkIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cblRoZSBERUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LiIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFkZGluZyAnbm9fbnVtJyBtb2RpZmljYXRpb24sIG90aGVyd2lzZSB0aGUgdG9rZW4gd2lsbCBiZSBwYXJzZWQgYXMgbnVtYmVyIChkb3VibGUpLiAKLW1hc2tTaGlmdDogJysnIEtfTUFTS1NISUZUIHsgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTsgZGVmRGF0YS0+bm9fbnVtID0gMTsgfSBUX1NUUklORwotICAgICAgICB7ICAKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Db21wb25lbnRDYmspIHsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT52YWxpZGF0ZU1hc2tTaGlmdElucHV0KCQ0LCBkZWZEYXRhLT5jb21wb25lbnRXYXJuaW5ncywgZGVmRGF0YS0+c2V0dGluZ3MtPkNvbXBvbmVudFdhcm5pbmdzKSkgewotICAgICAgICAgICAgICAgIGRlZkRhdGEtPkNvbXBvbmVudC5zZXRNYXNrU2hpZnQoJDQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLXBsYWNlbWVudF9zdGF0dXM6ICcrJyBLX0ZJWEVEIAotICAgICAgICB7ICQkID0gREVGSV9DT01QT05FTlRfRklYRUQ7IH0KLSAgICAgICAgfCAnKycgS19DT1ZFUiAKLSAgICAgICAgeyAkJCA9IERFRklfQ09NUE9ORU5UX0NPVkVSOyB9Ci0gICAgICAgIHwgJysnIEtfUExBQ0VECi0gICAgICAgIHsgJCQgPSBERUZJX0NPTVBPTkVOVF9QTEFDRUQ7IH0KLQotd2VpZ2h0OiAnKycgS19XRUlHSFQgTlVNQkVSIAotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+Q29tcG9uZW50Q2JrKQotICAgICAgICAgICAgZGVmRGF0YS0+Q29tcG9uZW50LnNldFdlaWdodChST1VORCgkMykpOwotICAgICAgICB9Ci0KLWVuZF9jb21wczogS19FTkQgS19DT01QUwotICAgICAgICB7IAotICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkNvbXBvbmVudENiaykKLSAgICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+Q29tcG9uZW50RW5kQ2JrLCBkZWZyQ29tcG9uZW50RW5kQ2JrVHlwZSwgMCk7Ci0gICAgICAgIH0KLQotbmV0c19zZWN0aW9uOiAgc3RhcnRfbmV0cyBuZXRfcnVsZXMgZW5kX25ldHMKLSAgICAgICAgOwotCi1zdGFydF9uZXRzOiBLX05FVFMgTlVNQkVSICc7JwotICAgICAgICB7IAotICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPk5ldFN0YXJ0Q2JrKQotICAgICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5OZXRTdGFydENiaywgZGVmck5ldFN0YXJ0Q2JrVHlwZSwgUk9VTkQoJDIpKTsKLSAgICAgICAgICBkZWZEYXRhLT5uZXRPc25ldCA9IDE7Ci0gICAgICAgIH0KLQotbmV0X3J1bGVzOiAvLyBlbXB0eSAKLSAgICAgICAgfCBuZXRfcnVsZXMgb25lX25ldAotICAgICAgICAgICAgOwotCi1vbmVfbmV0OiBuZXRfYW5kX2Nvbm5lY3Rpb25zIG5ldF9vcHRpb25zICc7JwotICAgICAgICB7IAotICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPk5ldENiaykKLSAgICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0Q2JrLCBkZWZyTmV0Q2JrVHlwZSwgJmRlZkRhdGEtPk5ldCk7Ci0gICAgICAgIH0KLS8qCi0qKiBuZXRfYW5kX2Nvbm5lY3Rpb25zOiBuZXRfc3RhcnQge2RlZkRhdGEtPmR1bWJfbW9kZSA9IERFRl9NQVhfSU5UOyBub19udW0gPSBERUZfTUFYX0lOVDt9Ci0qKiAgICAgICAgICAgICAgICAgICAgICBuZXRfY29ubmVjdGlvbnMKLSoqIHdtZCAtLSB0aGlzIGNhbiBiZSB1c2VkIHRvIHJlcGxhY2UKLSoqICAgICAgICB8ICcoJyBLX1BJTiB7ZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTsgbm9fbnVtID0gMTt9IFRfU1RSSU5HIGNvbm5fb3B0ICcpJyAoPz8/KQotKi8KLW5ldF9hbmRfY29ubmVjdGlvbnM6IG5ldF9zdGFydAotICAgICAgICB7ZGVmRGF0YS0+ZHVtYl9tb2RlID0gMDsgZGVmRGF0YS0+bm9fbnVtID0gMDsgfQotCi0vKiBwY3IgMjM1NTU1ICYgMjM2MjEwICovCi1uZXRfc3RhcnQ6ICctJyB7ZGVmRGF0YS0+ZHVtYl9tb2RlID0gREVGX01BWF9JTlQ7IGRlZkRhdGEtPm5vX251bSA9IERFRl9NQVhfSU5UOyBkZWZEYXRhLT5ub25kZWZfaXNfa2V5d29yZCA9IFRSVUU7IGRlZkRhdGEtPm11c3Rqb2luX2lzX2tleXdvcmQgPSBUUlVFO30gbmV0X25hbWUgCi0KLW5ldF9uYW1lOiBUX1NUUklORwotICAgICAgICB7Ci0gICAgICAgICAgLy8gOS8yMi8xOTk5IAotICAgICAgICAgIC8vIHRoaXMgaXMgc2hhcmVkIGJ5IGJvdGggbmV0IGFuZCBzcGVjaWFsIG5ldCAKLSAgICAgICAgICBpZiAoKGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0Q2JrICYmIChkZWZEYXRhLT5uZXRPc25ldD09MSkpIHx8IChkZWZEYXRhLT5jYWxsYmFja3MtPlNOZXRDYmsgJiYgKGRlZkRhdGEtPm5ldE9zbmV0PT0yKSkpCi0gICAgICAgICAgICBkZWZEYXRhLT5OZXQuc2V0TmFtZSgkMSk7Ci0gICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0TmFtZUNiaykKLSAgICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0TmFtZUNiaywgZGVmck5ldE5hbWVDYmtUeXBlLCAkMSk7Ci0gICAgICAgIH0gbmV0X2Nvbm5lY3Rpb25zCi0gICAgICAgIHwgS19NVVNUSk9JTiAnKCcgVF9TVFJJTkcge2RlZkRhdGEtPmR1bWJfbW9kZSA9IDE7IGRlZkRhdGEtPm5vX251bSA9IDE7fSBUX1NUUklORyAnKScKLSAgICAgICAgewotICAgICAgICAgIGlmICgoZGVmRGF0YS0+Y2FsbGJhY2tzLT5OZXRDYmsgJiYgKGRlZkRhdGEtPm5ldE9zbmV0PT0xKSkgfHwgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldENiayAmJiAoZGVmRGF0YS0+bmV0T3NuZXQ9PTIpKSkKLSAgICAgICAgICAgIGRlZkRhdGEtPk5ldC5hZGRNdXN0UGluKCQzLCAkNSwgMCk7Ci0gICAgICAgICAgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMzsKLSAgICAgICAgICBkZWZEYXRhLT5ub19udW0gPSAzOwotICAgICAgICB9Ci0KLW5ldF9jb25uZWN0aW9uczogLy8gZW1wdHkgCi0gICAgICAgIHwgbmV0X2Nvbm5lY3Rpb25zIG5ldF9jb25uZWN0aW9uIAotICAgICAgICA7Ci0KLW5ldF9jb25uZWN0aW9uOiAnKCcgVF9TVFJJTkcge2RlZkRhdGEtPmR1bWJfbW9kZSA9IERFRl9NQVhfSU5UOyBkZWZEYXRhLT5ub19udW0gPSBERUZfTUFYX0lOVDt9Ci0gICAgICAgICAgICAgICAgVF9TVFJJTkcgY29ubl9vcHQgJyknCi0gICAgICAgIHsKLSAgICAgICAgICAvLyA5LzIyLzE5OTkgCi0gICAgICAgICAgLy8gc2luY2UgdGhlIGNvZGUgaXMgc2hhcmVkIGJ5IGJvdGggbmV0ICYgc3BlY2lhbCBuZXQsIAotICAgICAgICAgIC8vIG5lZWQgdG8gY2hlY2sgb24gYm90aCBmbGFncyAKLSAgICAgICAgICBpZiAoKGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0Q2JrICYmIChkZWZEYXRhLT5uZXRPc25ldD09MSkpIHx8IChkZWZEYXRhLT5jYWxsYmFja3MtPlNOZXRDYmsgJiYgKGRlZkRhdGEtPm5ldE9zbmV0PT0yKSkpCi0gICAgICAgICAgICBkZWZEYXRhLT5OZXQuYWRkUGluKCQyLCAkNCwgJDUpOwotICAgICAgICAgIC8vIDEvMTQvMjAwMCAtIHBjciAyODkxNTYgCi0gICAgICAgICAgLy8gcmVzZXQgZGVmRGF0YS0+ZHVtYl9tb2RlICYgZGVmRGF0YS0+bm9fbnVtIHRvIDMgLCBqdXN0IGluIGNhc2UgCi0gICAgICAgICAgLy8gdGhlIG5leHQgc3RhdGVtZW50IGlzIGFub3RoZXIgbmV0X2Nvbm5lY3Rpb24gCi0gICAgICAgICAgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMzsKLSAgICAgICAgICBkZWZEYXRhLT5ub19udW0gPSAzOwotICAgICAgICB9Ci0gICAgICAgIHwgJygnICcqJyB7ZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTsgZGVmRGF0YS0+bm9fbnVtID0gMTt9IFRfU1RSSU5HIGNvbm5fb3B0ICcpJwotICAgICAgICB7Ci0gICAgICAgICAgaWYgKChkZWZEYXRhLT5jYWxsYmFja3MtPk5ldENiayAmJiAoZGVmRGF0YS0+bmV0T3NuZXQ9PTEpKSB8fCAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5TTmV0Q2JrICYmIChkZWZEYXRhLT5uZXRPc25ldD09MikpKQotICAgICAgICAgICAgZGVmRGF0YS0+TmV0LmFkZFBpbigiKiIsICQ0LCAkNSk7Ci0gICAgICAgICAgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMzsKLSAgICAgICAgICBkZWZEYXRhLT5ub19udW0gPSAzOwotICAgICAgICB9Ci0gICAgICAgIHwgJygnIEtfUElOIHtkZWZEYXRhLT5kdW1iX21vZGUgPSAxOyBkZWZEYXRhLT5ub19udW0gPSAxO30gVF9TVFJJTkcgY29ubl9vcHQgJyknCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoKGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0Q2JrICYmIChkZWZEYXRhLT5uZXRPc25ldD09MSkpIHx8IChkZWZEYXRhLT5jYWxsYmFja3MtPlNOZXRDYmsgJiYgKGRlZkRhdGEtPm5ldE9zbmV0PT0yKSkpCi0gICAgICAgICAgICBkZWZEYXRhLT5OZXQuYWRkUGluKCJQSU4iLCAkNCwgJDUpOwotICAgICAgICAgIGRlZkRhdGEtPmR1bWJfbW9kZSA9IDM7Ci0gICAgICAgICAgZGVmRGF0YS0+bm9fbnVtID0gMzsKLSAgICAgICAgfQotCi1jb25uX29wdDogLy8gZW1wdHkgCi0gICAgICAgICAgeyAkJCA9IDA7IH0KLSAgICAgICAgfCBleHRlbnNpb25fc3RtdAotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0Q29ubmVjdGlvbkV4dENiaykKLSAgICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0Q29ubmVjdGlvbkV4dENiaywgZGVmck5ldENvbm5lY3Rpb25FeHRDYmtUeXBlLAotICAgICAgICAgICAgICAmZGVmRGF0YS0+SGlzdG9yeV90ZXh0WzBdKTsKLSAgICAgICAgICAkJCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgfCAnKycgS19TWU5USEVTSVpFRAotICAgICAgICB7ICQkID0gMTsgfQotICAgICAgICAKLSAgICAgICAgCi0vLyBUaGVzZSBhcmUgYWxsIHRoZSBvcHRpb25hbCBmaWVsZHMgZm9yIGEgbmV0IHRoYXQgZ28gYWZ0ZXIgdGhlICcrJyAKLW5ldF9vcHRpb25zOiAvLyBlbXB0eSAKLSAgICAgICAgfCBuZXRfb3B0aW9ucyBuZXRfb3B0aW9uCi0gICAgICAgIDsKLQotbmV0X29wdGlvbjogJysnIG5ldF90eXBlIAotICAgICAgICB7ICAKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5OZXRDYmspIGRlZkRhdGEtPk5ldC5hZGRXaXJlKCQyLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICAgcGF0aHMKLSAgICAgICAgewotICAgICAgICAgIGRlZkRhdGEtPmJ5X2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgICBkZWZEYXRhLT5kb19pc19rZXl3b3JkID0gRkFMU0U7Ci0gICAgICAgICAgZGVmRGF0YS0+bmV3X2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgICBkZWZEYXRhLT5ub25kZWZfaXNfa2V5d29yZCA9IEZBTFNFOwotICAgICAgICAgIGRlZkRhdGEtPm11c3Rqb2luX2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgICBkZWZEYXRhLT5zdGVwX2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgICBkZWZEYXRhLT5vcmllbnRfaXNfa2V5d29yZCA9IEZBTFNFOwotICAgICAgICAgIGRlZkRhdGEtPnZpcnR1YWxfaXNfa2V5d29yZCA9IEZBTFNFOwotICAgICAgICAgIGRlZkRhdGEtPnJlY3RfaXNfa2V5d29yZCA9IEZBTFNFOwotICAgICAgICAgIGRlZkRhdGEtPm1hc2tfaXNfa2V5d29yZCA9IEZBTFNFOwotICAgICAgICAgIGRlZkRhdGEtPm5lZWROUENiayA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICB8ICcrJyBLX1NPVVJDRSBuZXRzb3VyY2VfdHlwZQotICAgICAgICB7IGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPk5ldENiaykgZGVmRGF0YS0+TmV0LnNldFNvdXJjZSgkMyk7IH0KLQotICAgICAgICB8ICcrJyBLX0ZJWEVEQlVNUAotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjUpIHsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPk5ldENiaykgewotICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+bmV0V2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5OZXRXYXJuaW5ncykgewotICAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZNc2cgPSAoY2hhciopbWFsbG9jKDEwMDApOwotICAgICAgICAgICAgICAgICBzcHJpbnRmIChkZWZEYXRhLT5kZWZNc2csCi0gICAgICAgICAgICAgICAgICAgICJUaGUgRklYRURCVU1QIHN0YXRlbWVudCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1LjUgYW5kIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBkZWZEYXRhLT5WZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNjUzMCwgZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICAgZnJlZShkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5OZXRDYmspIGRlZkRhdGEtPk5ldC5zZXRGaXhlZGJ1bXAoKTsKLSAgICAgICAgfSAKLQotICAgICAgICB8ICcrJyBLX0ZSRVFVRU5DWSB7IGRlZkRhdGEtPnJlYWxfbnVtID0gMTsgfSBOVU1CRVIKLSAgICAgICAgewotICAgICAgICAgIGlmIChkZWZEYXRhLT5WZXJzaW9uTnVtIDwgNS41KSB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5OZXRDYmspIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPm5ldFdhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+TmV0V2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmTXNnID0gKGNoYXIqKW1hbGxvYygxMDAwKTsKLSAgICAgICAgICAgICAgICAgc3ByaW50ZiAoZGVmRGF0YS0+ZGVmTXNnLAotICAgICAgICAgICAgICAgICAgICAiVGhlIEZSRVFVRU5DWSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNSBhbmQgbGF0ZXIgc3ludGF4LlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZyIsIGRlZkRhdGEtPlZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTU4LCBkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgICBmcmVlKGRlZkRhdGEtPmRlZk1zZyk7Ci0gICAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPk5ldENiaykgZGVmRGF0YS0+TmV0LnNldEZyZXF1ZW5jeSgkNCk7Ci0gICAgICAgICAgZGVmRGF0YS0+cmVhbF9udW0gPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgfCAnKycgS19PUklHSU5BTCB7ZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTsgZGVmRGF0YS0+bm9fbnVtID0gMTt9IFRfU1RSSU5HCi0gICAgICAgIHsgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0Q2JrKSBkZWZEYXRhLT5OZXQuc2V0T3JpZ2luYWwoJDQpOyB9Ci0KLSAgICAgICAgfCAnKycgS19QQVRURVJOIHBhdHRlcm5fdHlwZQotICAgICAgICB7IGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPk5ldENiaykgZGVmRGF0YS0+TmV0LnNldFBhdHRlcm4oJDMpOyB9Ci0KLSAgICAgICAgfCAnKycgS19XRUlHSFQgTlVNQkVSCi0gICAgICAgIHsgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0Q2JrKSBkZWZEYXRhLT5OZXQuc2V0V2VpZ2h0KFJPVU5EKCQzKSk7IH0KLQotICAgICAgICB8ICcrJyBLX1hUQUxLIE5VTUJFUgotICAgICAgICB7IGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPk5ldENiaykgZGVmRGF0YS0+TmV0LnNldFhUYWxrKFJPVU5EKCQzKSk7IH0KLQotICAgICAgICB8ICcrJyBLX0VTVENBUCBOVU1CRVIKLSAgICAgICAgeyBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5OZXRDYmspIGRlZkRhdGEtPk5ldC5zZXRDYXAoJDMpOyB9Ci0KLSAgICAgICAgfCAnKycgS19VU0UgdXNlX3R5cGUgCi0gICAgICAgIHsgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0Q2JrKSBkZWZEYXRhLT5OZXQuc2V0VXNlKCQzKTsgfQotCi0gICAgICAgIHwgJysnIEtfU1RZTEUgTlVNQkVSCi0gICAgICAgIHsgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0Q2JrKSBkZWZEYXRhLT5OZXQuc2V0U3R5bGUoKGludCkkMyk7IH0KLQotICAgICAgICB8ICcrJyBLX05PTkRFRkFVTFRSVUxFIHsgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTsgZGVmRGF0YS0+bm9fbnVtID0gMTsgfSBUX1NUUklORwotICAgICAgICB7IAotICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPk5ldENiayAmJiBkZWZEYXRhLT5jYWxsYmFja3MtPk5ldE5vbkRlZmF1bHRSdWxlQ2JrKSB7Ci0gICAgICAgICAgICAgLy8gVXNlciB3YW50cyBhIGNhbGxiYWNrIG9uIG5vbmRlZmF1bHRydWxlIAotICAgICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0Tm9uRGVmYXVsdFJ1bGVDYmssCi0gICAgICAgICAgICAgICAgICAgICAgZGVmck5ldE5vbkRlZmF1bHRSdWxlQ2JrVHlwZSwgJDQpOwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBTdGlsbCBzYXZlIGRhdGEgaW4gdGhlIGNsYXNzIAotICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPk5ldENiaykgZGVmRGF0YS0+TmV0LnNldE5vbkRlZmF1bHRSdWxlKCQ0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHwgdnBpbl9zdG10Ci0KLSAgICAgICAgfCAnKycgS19TSElFTERORVQgeyBkZWZEYXRhLT5kdW1iX21vZGUgPSAxOyBkZWZEYXRhLT5ub19udW0gPSAxOyB9IFRfU1RSSU5HCi0gICAgICAgIHsgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0Q2JrKSBkZWZEYXRhLT5OZXQuYWRkU2hpZWxkTmV0KCQ0KTsgfQotCi0gICAgICAgIHwgJysnIEtfTk9TSElFTEQgeyBkZWZEYXRhLT5kdW1iX21vZGUgPSAxOyBkZWZEYXRhLT5ub19udW0gPSAxOyB9Ci0gICAgICAgIHsgLy8gc2luY2UgdGhlIHBhcnNlciBzdGlsbCBzdXBwb3J0IDUuMyBhbmQgZWFybGllciwgY2FuJ3QgCi0gICAgICAgICAgLy8gbW92ZSBOT1NISUVMRCBpbiBuZXRfdHlwZSAKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuNCkgeyAgIC8vIFBDUiA0NDUyMDkgCi0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5OZXRDYmspIGRlZkRhdGEtPk5ldC5hZGROb1NoaWVsZCgiIik7Ci0gICAgICAgICAgICBkZWZEYXRhLT5ieV9pc19rZXl3b3JkID0gRkFMU0U7Ci0gICAgICAgICAgICBkZWZEYXRhLT5kb19pc19rZXl3b3JkID0gRkFMU0U7Ci0gICAgICAgICAgICBkZWZEYXRhLT5uZXdfaXNfa2V5d29yZCA9IEZBTFNFOwotICAgICAgICAgICAgZGVmRGF0YS0+c3RlcF9pc19rZXl3b3JkID0gRkFMU0U7Ci0gICAgICAgICAgICBkZWZEYXRhLT5vcmllbnRfaXNfa2V5d29yZCA9IEZBTFNFOwotICAgICAgICAgICAgZGVmRGF0YS0+dmlydHVhbF9pc19rZXl3b3JkID0gRkFMU0U7Ci0gICAgICAgICAgICBkZWZEYXRhLT5tYXNrX2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgICAgIGRlZkRhdGEtPnJlY3RfaXNfa2V5d29yZCA9IEZBTFNFOwotICAgICAgICAgICAgZGVmRGF0YS0+c2hpZWxkID0gVFJVRTsgICAgLy8gc2F2ZSB0aGUgcGF0aCBpbmZvIGluIHRoZSBkZWZEYXRhLT5zaGllbGQgcGF0aHMgCi0gICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5OZXRDYmspIGRlZkRhdGEtPk5ldC5hZGRXaXJlKCJOT1NISUVMRCIsIE5VTEwpOwotICAgICAgICB9Ci0gICAgICAgIHBhdGhzCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuNCkgeyAgIC8vIFBDUiA0NDUyMDkgCi0gICAgICAgICAgICBkZWZEYXRhLT5zaGllbGQgPSBGQUxTRTsKLSAgICAgICAgICAgIGRlZkRhdGEtPmJ5X2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgICAgIGRlZkRhdGEtPmRvX2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgICAgIGRlZkRhdGEtPm5ld19pc19rZXl3b3JkID0gRkFMU0U7Ci0gICAgICAgICAgICBkZWZEYXRhLT5zdGVwX2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgICAgIGRlZkRhdGEtPm5vbmRlZl9pc19rZXl3b3JkID0gRkFMU0U7Ci0gICAgICAgICAgICBkZWZEYXRhLT5tdXN0am9pbl9pc19rZXl3b3JkID0gRkFMU0U7Ci0gICAgICAgICAgICBkZWZEYXRhLT5vcmllbnRfaXNfa2V5d29yZCA9IEZBTFNFOwotICAgICAgICAgICAgZGVmRGF0YS0+dmlydHVhbF9pc19rZXl3b3JkID0gRkFMU0U7Ci0gICAgICAgICAgICBkZWZEYXRhLT5yZWN0X2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgICAgIGRlZkRhdGEtPm1hc2tfaXNfa2V5d29yZCA9IEZBTFNFOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkZWZEYXRhLT5ieV9pc19rZXl3b3JkID0gRkFMU0U7Ci0gICAgICAgICAgICBkZWZEYXRhLT5kb19pc19rZXl3b3JkID0gRkFMU0U7Ci0gICAgICAgICAgICBkZWZEYXRhLT5uZXdfaXNfa2V5d29yZCA9IEZBTFNFOwotICAgICAgICAgICAgZGVmRGF0YS0+c3RlcF9pc19rZXl3b3JkID0gRkFMU0U7Ci0gICAgICAgICAgICBkZWZEYXRhLT5ub25kZWZfaXNfa2V5d29yZCA9IEZBTFNFOwotICAgICAgICAgICAgZGVmRGF0YS0+bXVzdGpvaW5faXNfa2V5d29yZCA9IEZBTFNFOwotICAgICAgICAgICAgZGVmRGF0YS0+b3JpZW50X2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgICAgIGRlZkRhdGEtPnZpcnR1YWxfaXNfa2V5d29yZCA9IEZBTFNFOwotICAgICAgICAgICAgZGVmRGF0YS0+cmVjdF9pc19rZXl3b3JkID0gRkFMU0U7Ci0gICAgICAgICAgICBkZWZEYXRhLT5tYXNrX2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZGVmRGF0YS0+bmVlZE5QQ2JrID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHwgJysnIEtfU1VCTkVUCi0gICAgICAgIHsgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTsgZGVmRGF0YS0+bm9fbnVtID0gMTsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5OZXRDYmspIHsKLSAgICAgICAgICAgIGRlZkRhdGEtPlN1Ym5ldCA9IG5ldyBkZWZpU3VibmV0KGRlZkRhdGEpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBUX1NUUklORyB7Ci0gICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0Q2JrICYmIGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0U3VibmV0TmFtZUNiaykgewotICAgICAgICAgICAgLy8gVXNlciB3YW50cyBhIGNhbGxiYWNrIG9uIE5ldCBzdWJuZXROYW1lIAotICAgICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5OZXRTdWJuZXROYW1lQ2JrLCBkZWZyTmV0U3VibmV0TmFtZUNia1R5cGUsICQ0KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gU3RpbGwgc2F2ZSB0aGUgc3VibmV0IG5hbWUgaW4gdGhlIGNsYXNzIAotICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPk5ldENiaykgewotICAgICAgICAgICAgZGVmRGF0YS0+U3VibmV0LT5zZXROYW1lKCQ0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gCi0gICAgICAgIGNvbXBfbmFtZXMgewotICAgICAgICAgIGRlZkRhdGEtPnJvdXRlZF9pc19rZXl3b3JkID0gVFJVRTsKLSAgICAgICAgICBkZWZEYXRhLT5maXhlZF9pc19rZXl3b3JkID0gVFJVRTsKLSAgICAgICAgICBkZWZEYXRhLT5jb3Zlcl9pc19rZXl3b3JkID0gVFJVRTsKLSAgICAgICAgfSBzdWJuZXRfb3B0aW9ucyB7Ci0gICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0Q2JrKSB7Ci0gICAgICAgICAgICBkZWZEYXRhLT5OZXQuYWRkU3VibmV0KGRlZkRhdGEtPlN1Ym5ldCk7Ci0gICAgICAgICAgICBkZWZEYXRhLT5TdWJuZXQgPSBOVUxMOwotICAgICAgICAgICAgZGVmRGF0YS0+cm91dGVkX2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgICAgIGRlZkRhdGEtPmZpeGVkX2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgICAgIGRlZkRhdGEtPmNvdmVyX2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB8ICcrJyBLX1BST1BFUlRZIHtkZWZEYXRhLT5kdW1iX21vZGUgPSBERUZfTUFYX0lOVDsgfQotICAgICAgICAgIG5ldF9wcm9wX2xpc3QKLSAgICAgICAgeyBkZWZEYXRhLT5kdW1iX21vZGUgPSAwOyB9Ci0KLSAgICAgICAgfCBleHRlbnNpb25fc3RtdAotICAgICAgICB7IAotICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPk5ldEV4dENiaykKLSAgICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0RXh0Q2JrLCBkZWZyTmV0RXh0Q2JrVHlwZSwgJmRlZkRhdGEtPkhpc3RvcnlfdGV4dFswXSk7Ci0gICAgICAgIH0KLQotbmV0X3Byb3BfbGlzdDogbmV0X3Byb3AKLSAgICAgIHwgbmV0X3Byb3BfbGlzdCBuZXRfcHJvcAotICAgICAgOwotCi1uZXRfcHJvcDogVF9TVFJJTkcgTlVNQkVSCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5OZXRDYmspIHsKLSAgICAgICAgICAgIGNoYXIgcHJvcFRwOwotICAgICAgICAgICAgY2hhciogc3RyID0gZGVmRGF0YS0+cmluZ0NvcHkoIiAgICAgICAgICAgICAgICAgICAgICAgIik7Ci0gICAgICAgICAgICBwcm9wVHAgPSBkZWZEYXRhLT5zZXNzaW9uLT5OZXRQcm9wLnByb3BUeXBlKCQxKTsKLSAgICAgICAgICAgIENIS1BST1BUWVBFKHByb3BUcCwgJDEsICJORVQiKTsKLSAgICAgICAgICAgIHNwcmludGYoc3RyLCAiJWciLCAkMik7Ci0gICAgICAgICAgICBkZWZEYXRhLT5OZXQuYWRkTnVtUHJvcCgkMSwgJDIsIHN0ciwgcHJvcFRwKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgfCBUX1NUUklORyBRU1RSSU5HCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5OZXRDYmspIHsKLSAgICAgICAgICAgIGNoYXIgcHJvcFRwOwotICAgICAgICAgICAgcHJvcFRwID0gZGVmRGF0YS0+c2Vzc2lvbi0+TmV0UHJvcC5wcm9wVHlwZSgkMSk7Ci0gICAgICAgICAgICBDSEtQUk9QVFlQRShwcm9wVHAsICQxLCAiTkVUIik7Ci0gICAgICAgICAgICBkZWZEYXRhLT5OZXQuYWRkUHJvcCgkMSwgJDIsIHByb3BUcCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHwgVF9TVFJJTkcgVF9TVFJJTkcKLSAgICAgICAgewotICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPk5ldENiaykgewotICAgICAgICAgICAgY2hhciBwcm9wVHA7Ci0gICAgICAgICAgICBwcm9wVHAgPSBkZWZEYXRhLT5zZXNzaW9uLT5OZXRQcm9wLnByb3BUeXBlKCQxKTsKLSAgICAgICAgICAgIENIS1BST1BUWVBFKHByb3BUcCwgJDEsICJORVQiKTsKLSAgICAgICAgICAgIGRlZkRhdGEtPk5ldC5hZGRQcm9wKCQxLCAkMiwgcHJvcFRwKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotbmV0c291cmNlX3R5cGU6IEtfTkVUTElTVAotICAgICAgICB7ICQkID0gKGNoYXIqKSJORVRMSVNUIjsgfQotICAgICAgICB8IEtfRElTVAotICAgICAgICB7ICQkID0gKGNoYXIqKSJESVNUIjsgfQotICAgICAgICB8IEtfVVNFUgotICAgICAgICB7ICQkID0gKGNoYXIqKSJVU0VSIjsgfQotICAgICAgICB8IEtfVElNSU5HCi0gICAgICAgIHsgJCQgPSAoY2hhciopIlRJTUlORyI7IH0KLSAgICAgICAgfCBLX1RFU1QKLSAgICAgICAgeyAkJCA9IChjaGFyKikiVEVTVCI7IH0KLQotdnBpbl9zdG10OiB2cGluX2JlZ2luIHZwaW5fbGF5ZXJfb3B0IHB0IHB0IAotICAgICAgICB7Ci0gICAgICAgICAgLy8gdnBpbl9vcHRpb25zIG1heSBoYXZlIHRvIGRlYWwgd2l0aCBvcmllbnQgCi0gICAgICAgICAgZGVmRGF0YS0+b3JpZW50X2lzX2tleXdvcmQgPSBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIHZwaW5fb3B0aW9ucwotICAgICAgICB7IGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPk5ldENiaykKLSAgICAgICAgICAgIGRlZkRhdGEtPk5ldC5hZGRWcGluQm91bmRzKCQzLngsICQzLnksICQ0LngsICQ0LnkpOwotICAgICAgICAgIGRlZkRhdGEtPm9yaWVudF9pc19rZXl3b3JkID0gRkFMU0U7Ci0gICAgICAgIH0KLQotdnBpbl9iZWdpbjogJysnIEtfVlBJTiB7ZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTsgZGVmRGF0YS0+bm9fbnVtID0gMTt9IFRfU1RSSU5HCi0gICAgICAgIHsgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0Q2JrKSBkZWZEYXRhLT5OZXQuYWRkVnBpbigkNCk7IH0KLQotdnBpbl9sYXllcl9vcHQ6IC8vIGVtcHR5IAotICAgICAgICB8IEtfTEFZRVIge2RlZkRhdGEtPmR1bWJfbW9kZT0xO30gVF9TVFJJTkcKLSAgICAgICAgeyBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5OZXRDYmspIGRlZkRhdGEtPk5ldC5hZGRWcGluTGF5ZXIoJDMpOyB9Ci0KLXZwaW5fb3B0aW9uczogLy8gZW1wdHkgCi0gICAgICAgIHwgdnBpbl9zdGF0dXMgcHQgb3JpZW50Ci0gICAgICAgIHsgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0Q2JrKSBkZWZEYXRhLT5OZXQuYWRkVnBpbkxvYygkMSwgJDIueCwgJDIueSwgJDMpOyB9Ci0KLXZwaW5fc3RhdHVzOiBLX1BMQUNFRCAKLSAgICAgICAgeyAkJCA9IChjaGFyKikiUExBQ0VEIjsgfQotICAgICAgICB8IEtfRklYRUQgCi0gICAgICAgIHsgJCQgPSAoY2hhciopIkZJWEVEIjsgfQotICAgICAgICB8IEtfQ09WRVIKLSAgICAgICAgeyAkJCA9IChjaGFyKikiQ09WRVIiOyB9Ci0KLW5ldF90eXBlOiBLX0ZJWEVECi0gICAgICAgIHsgJCQgPSAoY2hhciopIkZJWEVEIjsgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTsgfQotICAgICAgICB8IEtfQ09WRVIKLSAgICAgICAgeyAkJCA9IChjaGFyKikiQ09WRVIiOyBkZWZEYXRhLT5kdW1iX21vZGUgPSAxOyB9Ci0gICAgICAgIHwgS19ST1VURUQKLSAgICAgICAgeyAkJCA9IChjaGFyKikiUk9VVEVEIjsgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTsgfQotCi1wYXRoczoKLSAgICBwYXRoICAgLy8gbm90IG5lY2Vzc2FyeSB0byBkbyBwYXJ0aWFsIGNhbGxiYWNrIGZvciBuZXQgeWV0Ci0gICAgICB7IGlmIChkZWZEYXRhLT5OZWVkUGF0aERhdGEgJiYgZGVmRGF0YS0+Y2FsbGJhY2tzLT5OZXRDYmspCi0gICAgICAgICAgZGVmRGF0YS0+cGF0aElzRG9uZShkZWZEYXRhLT5zaGllbGQsIDAsIGRlZkRhdGEtPm5ldE9zbmV0LCAmZGVmRGF0YS0+bmVlZE5QQ2JrKTsKLSAgICAgIH0KLSAgICB8IHBhdGhzIG5ld19wYXRoCi0gICAgICB7IH0KLQotbmV3X3BhdGg6IEtfTkVXIHsgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTsgfSBwYXRoCi0gICAgICB7IGlmIChkZWZEYXRhLT5OZWVkUGF0aERhdGEgJiYgZGVmRGF0YS0+Y2FsbGJhY2tzLT5OZXRDYmspCi0gICAgICAgICAgZGVmRGF0YS0+cGF0aElzRG9uZShkZWZEYXRhLT5zaGllbGQsIDAsIGRlZkRhdGEtPm5ldE9zbmV0LCAmZGVmRGF0YS0+bmVlZE5QQ2JrKTsKLSAgICAgIH0KLQotcGF0aDogIFRfU1RSSU5HCi0gICAgICB7Ci0gICAgICAgIGlmICgoc3RyY21wKCQxLCAiVEFQRVIiKSA9PSAwKSB8fCAoc3RyY21wKCQxLCAiVEFQRVJSVUxFIikgPT0gMCkpIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+TmVlZFBhdGhEYXRhICYmIGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0Q2JrKSB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+bmV0V2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5OZXRXYXJuaW5ncykgewotICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTMxLCAiVGhlIGxheWVyTmFtZSB3aGljaCBpcyByZXF1aXJlZCBpbiBwYXRoIGlzIG1pc3NpbmcuIEluY2x1ZGUgdGhlIGxheWVyTmFtZSBpbiB0aGUgcGF0aCBhbmQgdGhlbiB0cnkgYWdhaW4uIik7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBTaW5jZSB0aGVyZSBpcyBhbHJlYWR5IGVycm9yLCB0aGUgbmV4dCB0b2tlbiBpcyBpbnNpZ25pZmljYW50IAotICAgICAgICAgIGRlZkRhdGEtPmR1bWJfbW9kZSA9IDE7IGRlZkRhdGEtPm5vX251bSA9IDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLy8gQ0NSIDc2NjI4OSAtIERvIG5vdCBhY2N1bW11bGF0ZSB0aGUgbGF5ZXIgaW5mb3JtYXRpb24gaWYgdGhlcmUgCi0gICAgICAgICAgLy8gaXMgbm90IGEgY2FsbGJhY2sgc2V0IAotICAgICAgICAgIGlmIChkZWZEYXRhLT5OZWVkUGF0aERhdGEgJiYgZGVmRGF0YS0+Y2FsbGJhY2tzLT5OZXRDYmspCi0gICAgICAgICAgICAgIGRlZkRhdGEtPlBhdGhPYmouYWRkTGF5ZXIoJDEpOwotICAgICAgICAgIGRlZkRhdGEtPmR1bWJfbW9kZSA9IDA7IGRlZkRhdGEtPm5vX251bSA9IDA7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICBvcHRfdGFwZXJfc3R5bGVfcyAgcGF0aF9wdAotICAgICAgeyBkZWZEYXRhLT5kdW1iX21vZGUgPSBERUZfTUFYX0lOVDsgZGVmRGF0YS0+YnlfaXNfa2V5d29yZCA9IFRSVUU7IGRlZkRhdGEtPmRvX2lzX2tleXdvcmQgPSBUUlVFOwotLyoKLSAgICAgICBkdW1iX21vZGUgPSAxOyBieV9pc19rZXl3b3JkID0gVFJVRTsgZG9faXNfa2V5d29yZCA9IFRSVUU7Ci0qLwotICAgICAgICBkZWZEYXRhLT5uZXdfaXNfa2V5d29yZCA9IFRSVUU7IGRlZkRhdGEtPnN0ZXBfaXNfa2V5d29yZCA9IFRSVUU7IAotICAgICAgICBkZWZEYXRhLT5vcmllbnRfaXNfa2V5d29yZCA9IFRSVUU7IGRlZkRhdGEtPnZpcnR1YWxfaXNfa2V5d29yZCA9IFRSVUU7Ci0gICAgICAgIGRlZkRhdGEtPm1hc2tfaXNfa2V5d29yZCA9IFRSVUUsIGRlZkRhdGEtPnJlY3RfaXNfa2V5d29yZCA9IFRSVUU7ICB9Ci0gICAgCi0gICAgICAgcGF0aF9pdGVtX2xpc3QKLSAgICAgCi0gICAgICB7IGRlZkRhdGEtPmR1bWJfbW9kZSA9IDA7ICAgZGVmRGF0YS0+dmlydHVhbF9pc19rZXl3b3JkID0gRkFMU0U7IGRlZkRhdGEtPm1hc2tfaXNfa2V5d29yZCA9IEZBTFNFLAotICAgICAgIGRlZkRhdGEtPnJlY3RfaXNfa2V5d29yZCA9IEZBTFNFOyB9Ci0gICAgCi12aXJ0dWFsX3N0YXRlbWVudCA6Ci0gICAgS19WSVJUVUFMIHZpcnR1YWxfcHQKLSAgICB7Ci0gICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuOCkgewotICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5TTmV0Q2JrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPnNOZXRXYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPlNOZXRXYXJuaW5ncykgewotICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmTXNnID0gKGNoYXIqKW1hbGxvYygxMDAwKTsKLSAgICAgICAgICAgICAgICAgIHNwcmludGYgKGRlZkRhdGEtPmRlZk1zZywKLSAgICAgICAgICAgICAgICAgICAgICJUaGUgVklSVFVBTCBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS44IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWciLCBkZWZEYXRhLT5WZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZkVycm9yKDY1MzYsIGRlZkRhdGEtPmRlZk1zZyk7Ci0gICAgICAgICAgICAgICAgICBmcmVlKGRlZkRhdGEtPmRlZk1zZyk7Ci0gICAgICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgfSAKLSAgCi1yZWN0X3N0YXRlbWVudCA6IAotICAgIEtfUkVDVCByZWN0X3B0cwotICAgIHsKLSAgICAgIGlmIChkZWZEYXRhLT5WZXJzaW9uTnVtIDwgNS44KSB7Ci0gICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlNOZXRDYmspIHsKLSAgICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+c05ldFdhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+U05ldFdhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZNc2cgPSAoY2hhciopbWFsbG9jKDEwMDApOwotICAgICAgICAgICAgICAgICAgc3ByaW50ZiAoZGVmRGF0YS0+ZGVmTXNnLAotICAgICAgICAgICAgICAgICAgICAgIlRoZSBSRUNUIHN0YXRlbWVudCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1LjggYW5kIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZyIsIGRlZkRhdGEtPlZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNjUzNiwgZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICAgIGZyZWUoZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgfQotICAgIH0gCi0gICAgICAgICAgICAgIAotICAgIAotcGF0aF9pdGVtX2xpc3Q6IC8vIGVtcHR5IAotICAgIHwgcGF0aF9pdGVtX2xpc3QgcGF0aF9pdGVtCi0gICAgOwotCi0KLXBhdGhfaXRlbToKLSAgICAgVF9TVFJJTkcKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPk5lZWRQYXRoRGF0YSAmJiAoKGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0Q2JrICYmIChkZWZEYXRhLT5uZXRPc25ldD09MSkpIHx8Ci0gICAgICAgICAgICAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5TTmV0Q2JrICYmIChkZWZEYXRhLT5uZXRPc25ldD09MikpKSkgewotICAgICAgICAgIGlmIChzdHJjbXAoJDEsICJUQVBFUiIpID09IDApCi0gICAgICAgICAgICBkZWZEYXRhLT5QYXRoT2JqLnNldFRhcGVyKCk7Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBkZWZEYXRhLT5QYXRoT2JqLmFkZFZpYSgkMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB8IEtfTUFTSyBOVU1CRVIgVF9TVFJJTkcKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPnZhbGlkYXRlTWFza0lucHV0KChpbnQpJDIsIGRlZkRhdGEtPnNOZXRXYXJuaW5ncywgZGVmRGF0YS0+c2V0dGluZ3MtPlNOZXRXYXJuaW5ncykpIHsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5OZWVkUGF0aERhdGEgJiYgKChkZWZEYXRhLT5jYWxsYmFja3MtPk5ldENiayAmJiAoZGVmRGF0YS0+bmV0T3NuZXQ9PTEpKSB8fAotICAgICAgICAgICAgICAgIChkZWZEYXRhLT5jYWxsYmFja3MtPlNOZXRDYmsgJiYgKGRlZkRhdGEtPm5ldE9zbmV0PT0yKSkpKSB7Ci0gICAgICAgICAgICAgIGlmIChzdHJjbXAoJDMsICJUQVBFUiIpID09IDApCi0gICAgICAgICAgICAgICAgZGVmRGF0YS0+UGF0aE9iai5zZXRUYXBlcigpOwotICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT5QYXRoT2JqLmFkZFZpYU1hc2soJDIpOwotICAgICAgICAgICAgICAgIGRlZkRhdGEtPlBhdGhPYmouYWRkVmlhKCQzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB8IFRfU1RSSU5HIG9yaWVudAotICAgICAgeyBpZiAoZGVmRGF0YS0+TmVlZFBhdGhEYXRhICYmICgoZGVmRGF0YS0+Y2FsbGJhY2tzLT5OZXRDYmsgJiYgKGRlZkRhdGEtPm5ldE9zbmV0PT0xKSkgfHwKLSAgICAgICAgICAgIChkZWZEYXRhLT5jYWxsYmFja3MtPlNOZXRDYmsgJiYgKGRlZkRhdGEtPm5ldE9zbmV0PT0yKSkpKSB7Ci0gICAgICAgICAgICBkZWZEYXRhLT5QYXRoT2JqLmFkZFZpYSgkMSk7Ci0gICAgICAgICAgICBkZWZEYXRhLT5QYXRoT2JqLmFkZFZpYVJvdGF0aW9uKCQyKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIHwgS19NQVNLIE5VTUJFUiBUX1NUUklORyBvcmllbnQKLSAgICAgIHsgCi0gICAgICAgIGlmIChkZWZEYXRhLT52YWxpZGF0ZU1hc2tJbnB1dCgoaW50KSQyLCBkZWZEYXRhLT5zTmV0V2FybmluZ3MsIGRlZkRhdGEtPnNldHRpbmdzLT5TTmV0V2FybmluZ3MpKSB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+TmVlZFBhdGhEYXRhICYmICgoZGVmRGF0YS0+Y2FsbGJhY2tzLT5OZXRDYmsgJiYgKGRlZkRhdGEtPm5ldE9zbmV0PT0xKSkgfHwKLSAgICAgICAgICAgICAgICAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5TTmV0Q2JrICYmIChkZWZEYXRhLT5uZXRPc25ldD09MikpKSkgewotICAgICAgICAgICAgICAgIGRlZkRhdGEtPlBhdGhPYmouYWRkVmlhTWFzaygkMik7Ci0gICAgICAgICAgICAgICAgZGVmRGF0YS0+UGF0aE9iai5hZGRWaWEoJDMpOwotICAgICAgICAgICAgICAgIGRlZkRhdGEtPlBhdGhPYmouYWRkVmlhUm90YXRpb24oJDQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfCBLX01BU0sgTlVNQkVSIFRfU1RSSU5HIEtfRE8gTlVNQkVSIEtfQlkgTlVNQkVSIEtfU1RFUCBOVU1CRVIgTlVNQkVSCi0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT52YWxpZGF0ZU1hc2tJbnB1dCgoaW50KSQyLCBkZWZEYXRhLT5zTmV0V2FybmluZ3MsIGRlZkRhdGEtPnNldHRpbmdzLT5TTmV0V2FybmluZ3MpKSB7ICAgICAgCi0gICAgICAgICAgICBpZiAoKCQ1ID09IDApIHx8ICgkNyA9PSAwKSkgewotICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+TmVlZFBhdGhEYXRhICYmCi0gICAgICAgICAgICAgICAgICBkZWZEYXRhLT5jYWxsYmFja3MtPlNOZXRDYmspIHsKLSAgICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+bmV0V2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5OZXRXYXJuaW5ncykgewotICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNjUzMywgIkVpdGhlciB0aGUgbnVtWCBvciBudW1ZIGluIHRoZSBWSUEgRE8gc3RhdGVtZW50IGhhcyB0aGUgdmFsdWUuIFRoZSB2YWx1ZSBzcGVjaWZpZWQgaXMgMC5cblVwZGF0ZSB5b3VyIERFRiBmaWxlIHdpdGggdGhlIGNvcnJlY3QgdmFsdWUgYW5kIHRoZW4gdHJ5IGFnYWluLlxuIik7Ci0gICAgICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5OZWVkUGF0aERhdGEgJiYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldENiayAmJiAoZGVmRGF0YS0+bmV0T3NuZXQ9PTIpKSkgewotICAgICAgICAgICAgICAgIGRlZkRhdGEtPlBhdGhPYmouYWRkVmlhTWFzaygkMik7Ci0gICAgICAgICAgICAgICAgZGVmRGF0YS0+UGF0aE9iai5hZGRWaWEoJDMpOwotICAgICAgICAgICAgICAgIGRlZkRhdGEtPlBhdGhPYmouYWRkVmlhRGF0YSgoaW50KSQ1LCAoaW50KSQ3LCAoaW50KSQ5LCAoaW50KSQxMCk7Ci0gICAgICAgICAgICB9ICBlbHNlIGlmIChkZWZEYXRhLT5OZWVkUGF0aERhdGEgJiYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0Q2JrICYmIChkZWZEYXRhLT5uZXRPc25ldD09MSkpKSB7Ci0gICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5uZXRXYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPk5ldFdhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNjU2NywgIlRoZSBWSUEgRE8gc3RhdGVtZW50IGlzIGRlZmluZWQgaW4gdGhlIE5FVCBzdGF0ZW1lbnQgYW5kIGlzIGludmFsaWQuXG5SZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB5b3VyIERFRiBmaWxlIGFuZCB0cnkgYWdhaW4uIik7Ci0gICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIHwgVF9TVFJJTkcgS19ETyBOVU1CRVIgS19CWSBOVU1CRVIgS19TVEVQIE5VTUJFUiBOVU1CRVIKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjUpIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+TmVlZFBhdGhEYXRhICYmIAotICAgICAgICAgICAgICBkZWZEYXRhLT5jYWxsYmFja3MtPlNOZXRDYmspIHsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5uZXRXYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPk5ldFdhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGRlZkRhdGEtPmRlZk1zZyA9IChjaGFyKiltYWxsb2MoMTAwMCk7Ci0gICAgICAgICAgICAgIHNwcmludGYgKGRlZkRhdGEtPmRlZk1zZywKLSAgICAgICAgICAgICAgICAgIlRoZSBWSUEgRE8gc3RhdGVtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNSBhbmQgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnIiwgZGVmRGF0YS0+VmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgIGRlZkRhdGEtPmRlZkVycm9yKDY1MzIsIGRlZkRhdGEtPmRlZk1zZyk7Ci0gICAgICAgICAgICAgIGZyZWUoZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICgoJDMgPT0gMCkgfHwgKCQ1ID09IDApKSB7Ci0gICAgICAgICAgaWYgKGRlZkRhdGEtPk5lZWRQYXRoRGF0YSAmJgotICAgICAgICAgICAgICBkZWZEYXRhLT5jYWxsYmFja3MtPlNOZXRDYmspIHsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5uZXRXYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPk5ldFdhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGRlZkRhdGEtPmRlZkVycm9yKDY1MzMsICJFaXRoZXIgdGhlIG51bVggb3IgbnVtWSBpbiB0aGUgVklBIERPIHN0YXRlbWVudCBoYXMgdGhlIHZhbHVlLiBUaGUgdmFsdWUgc3BlY2lmaWVkIGlzIDAuXG5VcGRhdGUgeW91ciBERUYgZmlsZSB3aXRoIHRoZSBjb3JyZWN0IHZhbHVlIGFuZCB0aGVuIHRyeSBhZ2Fpbi5cbiIpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRlZkRhdGEtPk5lZWRQYXRoRGF0YSAmJiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5TTmV0Q2JrICYmIChkZWZEYXRhLT5uZXRPc25ldD09MikpKSB7Ci0gICAgICAgICAgICBkZWZEYXRhLT5QYXRoT2JqLmFkZFZpYSgkMSk7Ci0gICAgICAgICAgICBkZWZEYXRhLT5QYXRoT2JqLmFkZFZpYURhdGEoKGludCkkMywgKGludCkkNSwgKGludCkkNywgKGludCkkOCk7Ci0gICAgICAgIH0gIGVsc2UgaWYgKGRlZkRhdGEtPk5lZWRQYXRoRGF0YSAmJiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5OZXRDYmsgJiYgKGRlZkRhdGEtPm5ldE9zbmV0PT0xKSkpIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+bmV0V2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5OZXRXYXJuaW5ncykgewotICAgICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNjU2NywgIlRoZSBWSUEgRE8gc3RhdGVtZW50IGlzIGRlZmluZWQgaW4gdGhlIE5FVCBzdGF0ZW1lbnQgYW5kIGlzIGludmFsaWQuXG5SZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB5b3VyIERFRiBmaWxlIGFuZCB0cnkgYWdhaW4uIik7Ci0gICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB8IFRfU1RSSU5HIG9yaWVudCBLX0RPIE5VTUJFUiBLX0JZIE5VTUJFUiBLX1NURVAgTlVNQkVSIE5VTUJFUgotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuNSkgewotICAgICAgICAgIGlmIChkZWZEYXRhLT5OZWVkUGF0aERhdGEgJiYKLSAgICAgICAgICAgICAgZGVmRGF0YS0+Y2FsbGJhY2tzLT5TTmV0Q2JrKSB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+bmV0V2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5OZXRXYXJuaW5ncykgewotICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZNc2cgPSAoY2hhciopbWFsbG9jKDEwMDApOwotICAgICAgICAgICAgICBzcHJpbnRmIChkZWZEYXRhLT5kZWZNc2csCi0gICAgICAgICAgICAgICAgICJUaGUgVklBIERPIHN0YXRlbWVudCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1LjUgYW5kIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZyIsIGRlZkRhdGEtPlZlcnNpb25OdW0pOwotICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTMyLCBkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCgkNCA9PSAwKSB8fCAoJDYgPT0gMCkpIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+TmVlZFBhdGhEYXRhICYmCi0gICAgICAgICAgICAgIGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldENiaykgewotICAgICAgICAgICAgaWYgKGRlZkRhdGEtPm5ldFdhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+TmV0V2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNjUzMywgIkVpdGhlciB0aGUgbnVtWCBvciBudW1ZIGluIHRoZSBWSUEgRE8gc3RhdGVtZW50IGhhcyB0aGUgdmFsdWUuIFRoZSB2YWx1ZSBzcGVjaWZpZWQgaXMgMC5cblVwZGF0ZSB5b3VyIERFRiBmaWxlIHdpdGggdGhlIGNvcnJlY3QgdmFsdWUgYW5kIHRoZW4gdHJ5IGFnYWluLlxuIik7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZGVmRGF0YS0+TmVlZFBhdGhEYXRhICYmIChkZWZEYXRhLT5jYWxsYmFja3MtPlNOZXRDYmsgJiYgKGRlZkRhdGEtPm5ldE9zbmV0PT0yKSkpIHsKLSAgICAgICAgICAgIGRlZkRhdGEtPlBhdGhPYmouYWRkVmlhKCQxKTsKLSAgICAgICAgICAgIGRlZkRhdGEtPlBhdGhPYmouYWRkVmlhUm90YXRpb24oJDIpOwotICAgICAgICAgICAgZGVmRGF0YS0+UGF0aE9iai5hZGRWaWFEYXRhKChpbnQpJDQsIChpbnQpJDYsIChpbnQpJDgsIChpbnQpJDkpOwotICAgICAgICB9IGVsc2UgaWYgKGRlZkRhdGEtPk5lZWRQYXRoRGF0YSAmJiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5OZXRDYmsgJiYgKGRlZkRhdGEtPm5ldE9zbmV0PT0xKSkpIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+bmV0V2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5OZXRXYXJuaW5ncykgewotICAgICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNjU2NywgIlRoZSBWSUEgRE8gc3RhdGVtZW50IGlzIGRlZmluZWQgaW4gdGhlIE5FVCBzdGF0ZW1lbnQgYW5kIGlzIGludmFsaWQuXG5SZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB5b3VyIERFRiBmaWxlIGFuZCB0cnkgYWdhaW4uIik7Ci0gICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB8IEtfTUFTSyBOVU1CRVIgVF9TVFJJTkcgb3JpZW50IEtfRE8gTlVNQkVSIEtfQlkgTlVNQkVSIEtfU1RFUCBOVU1CRVIgTlVNQkVSCi0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT52YWxpZGF0ZU1hc2tJbnB1dCgoaW50KSQyLCBkZWZEYXRhLT5zTmV0V2FybmluZ3MsIGRlZkRhdGEtPnNldHRpbmdzLT5TTmV0V2FybmluZ3MpKSB7Ci0gICAgICAgICAgICBpZiAoKCQ2ID09IDApIHx8ICgkOCA9PSAwKSkgewotICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+TmVlZFBhdGhEYXRhICYmCi0gICAgICAgICAgICAgICAgICBkZWZEYXRhLT5jYWxsYmFja3MtPlNOZXRDYmspIHsKLSAgICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+bmV0V2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5OZXRXYXJuaW5ncykgewotICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNjUzMywgIkVpdGhlciB0aGUgbnVtWCBvciBudW1ZIGluIHRoZSBWSUEgRE8gc3RhdGVtZW50IGhhcyB0aGUgdmFsdWUuIFRoZSB2YWx1ZSBzcGVjaWZpZWQgaXMgMC5cblVwZGF0ZSB5b3VyIERFRiBmaWxlIHdpdGggdGhlIGNvcnJlY3QgdmFsdWUgYW5kIHRoZW4gdHJ5IGFnYWluLlxuIik7Ci0gICAgICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5OZWVkUGF0aERhdGEgJiYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldENiayAmJiAoZGVmRGF0YS0+bmV0T3NuZXQ9PTIpKSkgewotICAgICAgICAgICAgICAgIGRlZkRhdGEtPlBhdGhPYmouYWRkVmlhTWFzaygkMik7IAotICAgICAgICAgICAgICAgIGRlZkRhdGEtPlBhdGhPYmouYWRkVmlhKCQzKTsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT5QYXRoT2JqLmFkZFZpYVJvdGF0aW9uKCQ0KTs7Ci0gICAgICAgICAgICAgICAgZGVmRGF0YS0+UGF0aE9iai5hZGRWaWFEYXRhKChpbnQpJDYsIChpbnQpJDgsIChpbnQpJDEwLCAoaW50KSQxMSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGRlZkRhdGEtPk5lZWRQYXRoRGF0YSAmJiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5OZXRDYmsgJiYgKGRlZkRhdGEtPm5ldE9zbmV0PT0xKSkpIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPm5ldFdhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+TmV0V2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTY3LCAiVGhlIFZJQSBETyBzdGF0ZW1lbnQgaXMgZGVmaW5lZCBpbiB0aGUgTkVUIHN0YXRlbWVudCBhbmQgaXMgaW52YWxpZC5cblJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHlvdXIgREVGIGZpbGUgYW5kIHRyeSBhZ2Fpbi4iKTsKLSAgICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICB8IHZpcnR1YWxfc3RhdGVtZW50Ci0gICB8IHJlY3Rfc3RhdGVtZW50IAotICAgfCBLX01BU0sgTlVNQkVSIEtfUkVDVCB7IGRlZkRhdGEtPmR1bWJfbW9kZSA9IDY7IH0gJygnIE5VTUJFUiBOVU1CRVIgTlVNQkVSIE5VTUJFUiAnKScKLSAgICB7Ci0gICAgICBpZiAoZGVmRGF0YS0+dmFsaWRhdGVNYXNrSW5wdXQoKGludCkkMiwgZGVmRGF0YS0+c05ldFdhcm5pbmdzLCBkZWZEYXRhLT5zZXR0aW5ncy0+U05ldFdhcm5pbmdzKSkgewotICAgICAgICBpZiAoZGVmRGF0YS0+TmVlZFBhdGhEYXRhICYmICgoZGVmRGF0YS0+Y2FsbGJhY2tzLT5OZXRDYmsgJiYgKGRlZkRhdGEtPm5ldE9zbmV0PT0xKSkgfHwKLSAgICAgICAgICAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5TTmV0Q2JrICYmIChkZWZEYXRhLT5uZXRPc25ldD09MikpKSkgewotICAgICAgICAgIGRlZkRhdGEtPlBhdGhPYmouYWRkTWFzaygkMik7Ci0gICAgICAgICAgZGVmRGF0YS0+UGF0aE9iai5hZGRWaWFSZWN0KCQ2LCAkNywgJDgsICQ5KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgIHwgS19NQVNLIE5VTUJFUgotICAgIHsKLSAgICAgICBpZiAoZGVmRGF0YS0+dmFsaWRhdGVNYXNrSW5wdXQoKGludCkkMiwgZGVmRGF0YS0+c05ldFdhcm5pbmdzLCBkZWZEYXRhLT5zZXR0aW5ncy0+U05ldFdhcm5pbmdzKSkgewotICAgICAgICBpZiAoZGVmRGF0YS0+TmVlZFBhdGhEYXRhICYmICgoZGVmRGF0YS0+Y2FsbGJhY2tzLT5OZXRDYmsgJiYgKGRlZkRhdGEtPm5ldE9zbmV0PT0xKSkgfHwKLSAgICAgICAgICAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5TTmV0Q2JrICYmIChkZWZEYXRhLT5uZXRPc25ldD09MikpKSkgewotICAgICAgICAgIGRlZkRhdGEtPlBhdGhPYmouYWRkTWFzaygkMik7IAotICAgICAgICB9Ci0gICAgICAgfSAgCi0gICAgfQotICAgIHBhdGhfcHQKLSAgfCBwYXRoX3B0IAotICAgIHsKLSAgICAgICAvLyByZXNldCBkZWZEYXRhLT5kdW1iX21vZGUgdG8gMSBqdXN0IGluY2FzZSB0aGUgbmV4dCB0b2tlbiBpcyBhIHZpYSBvZiB0aGUgcGF0aAotICAgICAgICAvLyAyLzUvMjAwNCAtIHBjciA2ODY3ODEKLSAgICAgICAgZGVmRGF0YS0+ZHVtYl9tb2RlID0gREVGX01BWF9JTlQ7IGRlZkRhdGEtPmJ5X2lzX2tleXdvcmQgPSBUUlVFOyBkZWZEYXRhLT5kb19pc19rZXl3b3JkID0gVFJVRTsKLSAgICAgICAgZGVmRGF0YS0+bmV3X2lzX2tleXdvcmQgPSBUUlVFOyBkZWZEYXRhLT5zdGVwX2lzX2tleXdvcmQgPSBUUlVFOwotICAgICAgICBkZWZEYXRhLT5vcmllbnRfaXNfa2V5d29yZCA9IFRSVUU7Ci0gICAgfSAgCi0KLSAgICAgIAotcGF0aF9wdCA6Ci0gICAgICcoJyBOVU1CRVIgTlVNQkVSICcpJwotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+TmVlZFBhdGhEYXRhICYmICgoZGVmRGF0YS0+Y2FsbGJhY2tzLT5OZXRDYmsgJiYgKGRlZkRhdGEtPm5ldE9zbmV0PT0xKSkgfHwKLSAgICAgICAgICAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5TTmV0Q2JrICYmIChkZWZEYXRhLT5uZXRPc25ldD09MikpKSkKLSAgICAgICAgICBkZWZEYXRhLT5QYXRoT2JqLmFkZFBvaW50KFJPVU5EKCQyKSwgUk9VTkQoJDMpKTsgCi0gICAgICAgIGRlZkRhdGEtPnNhdmVfeCA9ICQyOwotICAgICAgICBkZWZEYXRhLT5zYXZlX3kgPSAkMzsgCi0gICAgICB9Ci0gICAgfCAnKCcgJyonIE5VTUJFUiAnKScKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPk5lZWRQYXRoRGF0YSAmJiAoKGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0Q2JrICYmIChkZWZEYXRhLT5uZXRPc25ldD09MSkpIHx8Ci0gICAgICAgICAgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldENiayAmJiAoZGVmRGF0YS0+bmV0T3NuZXQ9PTIpKSkpCi0gICAgICAgICAgZGVmRGF0YS0+UGF0aE9iai5hZGRQb2ludChST1VORChkZWZEYXRhLT5zYXZlX3gpLCBST1VORCgkMykpOyAKLSAgICAgICAgZGVmRGF0YS0+c2F2ZV95ID0gJDM7Ci0gICAgICB9Ci0gICAgfCAnKCcgTlVNQkVSICcqJyAnKScKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPk5lZWRQYXRoRGF0YSAmJiAoKGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0Q2JrICYmIChkZWZEYXRhLT5uZXRPc25ldD09MSkpIHx8Ci0gICAgICAgICAgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldENiayAmJiAoZGVmRGF0YS0+bmV0T3NuZXQ9PTIpKSkpCi0gICAgICAgICAgZGVmRGF0YS0+UGF0aE9iai5hZGRQb2ludChST1VORCgkMiksIFJPVU5EKGRlZkRhdGEtPnNhdmVfeSkpOyAKLSAgICAgICAgZGVmRGF0YS0+c2F2ZV94ID0gJDI7Ci0gICAgICB9Ci0gICAgfCAnKCcgJyonICcqJyAnKScKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPk5lZWRQYXRoRGF0YSAmJiAoKGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0Q2JrICYmIChkZWZEYXRhLT5uZXRPc25ldD09MSkpIHx8Ci0gICAgICAgICAgICAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5TTmV0Q2JrICYmIChkZWZEYXRhLT5uZXRPc25ldD09MikpKSkKLSAgICAgICAgICBkZWZEYXRhLT5QYXRoT2JqLmFkZFBvaW50KFJPVU5EKGRlZkRhdGEtPnNhdmVfeCksIFJPVU5EKGRlZkRhdGEtPnNhdmVfeSkpOyAKLSAgICAgIH0KLSAgICB8ICcoJyBOVU1CRVIgTlVNQkVSIE5VTUJFUiAnKScKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPk5lZWRQYXRoRGF0YSAmJiAoKGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0Q2JrICYmIChkZWZEYXRhLT5uZXRPc25ldD09MSkpIHx8Ci0gICAgICAgICAgICAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5TTmV0Q2JrICYmIChkZWZEYXRhLT5uZXRPc25ldD09MikpKSkKLSAgICAgICAgICBkZWZEYXRhLT5QYXRoT2JqLmFkZEZsdXNoUG9pbnQoUk9VTkQoJDIpLCBST1VORCgkMyksIFJPVU5EKCQ0KSk7IAotICAgICAgICBkZWZEYXRhLT5zYXZlX3ggPSAkMjsKLSAgICAgICAgZGVmRGF0YS0+c2F2ZV95ID0gJDM7Ci0gICAgICB9Ci0gICAgfCAnKCcgJyonIE5VTUJFUiBOVU1CRVIgJyknCi0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5OZWVkUGF0aERhdGEgJiYgKChkZWZEYXRhLT5jYWxsYmFja3MtPk5ldENiayAmJiAoZGVmRGF0YS0+bmV0T3NuZXQ9PTEpKSB8fAotICAgICAgICAgIChkZWZEYXRhLT5jYWxsYmFja3MtPlNOZXRDYmsgJiYgKGRlZkRhdGEtPm5ldE9zbmV0PT0yKSkpKQotICAgICAgICAgIGRlZkRhdGEtPlBhdGhPYmouYWRkRmx1c2hQb2ludChST1VORChkZWZEYXRhLT5zYXZlX3gpLCBST1VORCgkMyksCi0gICAgICAgICAgUk9VTkQoJDQpKTsgCi0gICAgICAgIGRlZkRhdGEtPnNhdmVfeSA9ICQzOwotICAgICAgfQotICAgIHwgJygnIE5VTUJFUiAnKicgTlVNQkVSICcpJwotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+TmVlZFBhdGhEYXRhICYmICgoZGVmRGF0YS0+Y2FsbGJhY2tzLT5OZXRDYmsgJiYgKGRlZkRhdGEtPm5ldE9zbmV0PT0xKSkgfHwKLSAgICAgICAgICAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5TTmV0Q2JrICYmIChkZWZEYXRhLT5uZXRPc25ldD09MikpKSkKLSAgICAgICAgICBkZWZEYXRhLT5QYXRoT2JqLmFkZEZsdXNoUG9pbnQoUk9VTkQoJDIpLCBST1VORChkZWZEYXRhLT5zYXZlX3kpLAotICAgICAgICAgIFJPVU5EKCQ0KSk7IAotICAgICAgICBkZWZEYXRhLT5zYXZlX3ggPSAkMjsKLSAgICAgIH0KLSAgICB8ICcoJyAnKicgJyonIE5VTUJFUiAnKScKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPk5lZWRQYXRoRGF0YSAmJiAoKGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0Q2JrICYmIChkZWZEYXRhLT5uZXRPc25ldD09MSkpIHx8Ci0gICAgICAgICAgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldENiayAmJiAoZGVmRGF0YS0+bmV0T3NuZXQ9PTIpKSkpCi0gICAgICAgICAgZGVmRGF0YS0+UGF0aE9iai5hZGRGbHVzaFBvaW50KFJPVU5EKGRlZkRhdGEtPnNhdmVfeCksIFJPVU5EKGRlZkRhdGEtPnNhdmVfeSksCi0gICAgICAgICAgUk9VTkQoJDQpKTsgCi0gICAgICB9Ci0KLXZpcnR1YWxfcHQgOgotICAgICAnKCcgTlVNQkVSIE5VTUJFUiAnKScKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPk5lZWRQYXRoRGF0YSAmJiAoKGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0Q2JrICYmIChkZWZEYXRhLT5uZXRPc25ldD09MSkpIHx8Ci0gICAgICAgICAgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldENiayAmJiAoZGVmRGF0YS0+bmV0T3NuZXQ9PTIpKSkpCi0gICAgICAgICAgZGVmRGF0YS0+UGF0aE9iai5hZGRWaXJ0dWFsUG9pbnQoUk9VTkQoJDIpLCBST1VORCgkMykpOyAKLSAgICAgICAgZGVmRGF0YS0+c2F2ZV94ID0gJDI7Ci0gICAgICAgIGRlZkRhdGEtPnNhdmVfeSA9ICQzOwotICAgICAgfQotICAgIHwgJygnICcqJyBOVU1CRVIgJyknCi0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5OZWVkUGF0aERhdGEgJiYgKChkZWZEYXRhLT5jYWxsYmFja3MtPk5ldENiayAmJiAoZGVmRGF0YS0+bmV0T3NuZXQ9PTEpKSB8fAotICAgICAgICAgIChkZWZEYXRhLT5jYWxsYmFja3MtPlNOZXRDYmsgJiYgKGRlZkRhdGEtPm5ldE9zbmV0PT0yKSkpKQotICAgICAgICAgIGRlZkRhdGEtPlBhdGhPYmouYWRkVmlydHVhbFBvaW50KFJPVU5EKGRlZkRhdGEtPnNhdmVfeCksIFJPVU5EKCQzKSk7IAotICAgICAgICBkZWZEYXRhLT5zYXZlX3kgPSAkMzsKLSAgICAgIH0KLSAgICB8ICcoJyBOVU1CRVIgJyonICcpJwotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+TmVlZFBhdGhEYXRhICYmICgoZGVmRGF0YS0+Y2FsbGJhY2tzLT5OZXRDYmsgJiYgKGRlZkRhdGEtPm5ldE9zbmV0PT0xKSkgfHwKLSAgICAgICAgICAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5TTmV0Q2JrICYmIChkZWZEYXRhLT5uZXRPc25ldD09MikpKSkKLSAgICAgICAgICBkZWZEYXRhLT5QYXRoT2JqLmFkZFZpcnR1YWxQb2ludChST1VORCgkMiksIFJPVU5EKGRlZkRhdGEtPnNhdmVfeSkpOyAKLSAgICAgICAgZGVmRGF0YS0+c2F2ZV94ID0gJDI7Ci0gICAgICB9Ci0gICAgfCAnKCcgJyonICcqJyAnKScKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPk5lZWRQYXRoRGF0YSAmJiAoKGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0Q2JrICYmIChkZWZEYXRhLT5uZXRPc25ldD09MSkpIHx8Ci0gICAgICAgICAgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldENiayAmJiAoZGVmRGF0YS0+bmV0T3NuZXQ9PTIpKSkpCi0gICAgICAgICAgZGVmRGF0YS0+UGF0aE9iai5hZGRWaXJ0dWFsUG9pbnQoUk9VTkQoZGVmRGF0YS0+c2F2ZV94KSwgUk9VTkQoZGVmRGF0YS0+c2F2ZV95KSk7Ci0gICAgICB9Ci0gCi1yZWN0X3B0cyA6Ci0gICAgJygnIE5VTUJFUiBOVU1CRVIgTlVNQkVSIE5VTUJFUiAnKScKLSAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5OZWVkUGF0aERhdGEgJiYgKChkZWZEYXRhLT5jYWxsYmFja3MtPk5ldENiayAmJiAoZGVmRGF0YS0+bmV0T3NuZXQ9PTEpKSB8fAotICAgICAgICAgIChkZWZEYXRhLT5jYWxsYmFja3MtPlNOZXRDYmsgJiYgKGRlZkRhdGEtPm5ldE9zbmV0PT0yKSkpKSB7Ci0gICAgICAgICAgZGVmRGF0YS0+UGF0aE9iai5hZGRWaWFSZWN0KCQyLCAkMywgJDQsICQ1KTsgCi0gICAgICAgIH0gICAgCi0gICAgfSAgIAotICAgIAotICAgICAgICAgICAgICAgIAotb3B0X3RhcGVyX3N0eWxlX3M6IC8vIGVtcHR5IAotICAgIHwgb3B0X3RhcGVyX3N0eWxlX3Mgb3B0X3RhcGVyX3N0eWxlCi0gICAgOwotb3B0X3RhcGVyX3N0eWxlOiBvcHRfc3R5bGUKLSAgICB8IG9wdF90YXBlcgotICAgIDsKLQotb3B0X3RhcGVyOiBLX1RBUEVSCi0gICAgICB7IGlmIChkZWZEYXRhLT5OZWVkUGF0aERhdGEgJiYgKChkZWZEYXRhLT5jYWxsYmFja3MtPk5ldENiayAmJiAoZGVmRGF0YS0+bmV0T3NuZXQ9PTEpKSB8fAotICAgICAgICAgIChkZWZEYXRhLT5jYWxsYmFja3MtPlNOZXRDYmsgJiYgKGRlZkRhdGEtPm5ldE9zbmV0PT0yKSkpKQotICAgICAgICAgIGRlZkRhdGEtPlBhdGhPYmouc2V0VGFwZXIoKTsgfQotICAgIHwgS19UQVBFUlJVTEUgeyBkZWZEYXRhLT5kdW1iX21vZGUgPSAxOyB9IFRfU1RSSU5HCi0gICAgICB7IGlmIChkZWZEYXRhLT5OZWVkUGF0aERhdGEgJiYgKChkZWZEYXRhLT5jYWxsYmFja3MtPk5ldENiayAmJiAoZGVmRGF0YS0+bmV0T3NuZXQ9PTEpKSB8fAotICAgICAgICAgIChkZWZEYXRhLT5jYWxsYmFja3MtPlNOZXRDYmsgJiYgKGRlZkRhdGEtPm5ldE9zbmV0PT0yKSkpKQotICAgICAgICAgIGRlZkRhdGEtPlBhdGhPYmouYWRkVGFwZXJSdWxlKCQzKTsgfQotCi1vcHRfc3R5bGU6IEtfU1RZTEUgTlVNQkVSCi0gICAgICB7IAotICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuNikgewotICAgICAgICAgICBpZiAoZGVmRGF0YS0+TmVlZFBhdGhEYXRhICYmIChkZWZEYXRhLT5jYWxsYmFja3MtPk5ldENiayB8fAotICAgICAgICAgICAgICAgZGVmRGF0YS0+Y2FsbGJhY2tzLT5TTmV0Q2JrKSkgewotICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5uZXRXYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPk5ldFdhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZNc2cgPSAoY2hhciopbWFsbG9jKDEwMDApOwotICAgICAgICAgICAgICAgc3ByaW50ZiAoZGVmRGF0YS0+ZGVmTXNnLAotICAgICAgICAgICAgICAgICAgIlRoZSBTVFlMRSBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWciLCBkZWZEYXRhLT5WZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZkVycm9yKDY1MzQsIGRlZkRhdGEtPmRlZk1zZyk7Ci0gICAgICAgICAgICAgICBmcmVlKGRlZkRhdGEtPmRlZk1zZyk7Ci0gICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgIGlmIChkZWZEYXRhLT5OZWVkUGF0aERhdGEgJiYgKChkZWZEYXRhLT5jYWxsYmFja3MtPk5ldENiayAmJiAoZGVmRGF0YS0+bmV0T3NuZXQ9PTEpKSB8fAotICAgICAgICAgICAgIChkZWZEYXRhLT5jYWxsYmFja3MtPlNOZXRDYmsgJiYgKGRlZkRhdGEtPm5ldE9zbmV0PT0yKSkpKQotICAgICAgICAgICAgIGRlZkRhdGEtPlBhdGhPYmouYWRkU3R5bGUoKGludCkkMik7Ci0gICAgICB9Ci0KLW9wdF9zcGF0aHM6IC8vIGVtcHR5IAotICAgIHwgb3B0X3NwYXRocyBvcHRfc2hhcGVfc3R5bGUKLSAgICA7Ci0KLW9wdF9zaGFwZV9zdHlsZToKLSAgICAnKycgS19TSEFQRSBzaGFwZV90eXBlCi0gICAgICB7IGlmIChkZWZEYXRhLT5OZWVkUGF0aERhdGEgJiYgKChkZWZEYXRhLT5jYWxsYmFja3MtPk5ldENiayAmJiAoZGVmRGF0YS0+bmV0T3NuZXQ9PTEpKSB8fAotICAgICAgICAgIChkZWZEYXRhLT5jYWxsYmFja3MtPlNOZXRDYmsgJiYgKGRlZkRhdGEtPm5ldE9zbmV0PT0yKSkpKQotICAgICAgICAgIGRlZkRhdGEtPlBhdGhPYmouYWRkU2hhcGUoJDMpOyB9Ci0gICAgfCAnKycgS19TVFlMRSBOVU1CRVIKLSAgICAgIHsgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjYpIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+TmVlZFBhdGhEYXRhICYmICgoZGVmRGF0YS0+Y2FsbGJhY2tzLT5OZXRDYmsgJiYgKGRlZkRhdGEtPm5ldE9zbmV0PT0xKSkgfHwKLSAgICAgICAgICAgIChkZWZEYXRhLT5jYWxsYmFja3MtPlNOZXRDYmsgJiYgKGRlZkRhdGEtPm5ldE9zbmV0PT0yKSkpKSB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+bmV0V2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5OZXRXYXJuaW5ncykgewotICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZNc2cgPSAoY2hhciopbWFsbG9jKDEwMDApOwotICAgICAgICAgICAgICBzcHJpbnRmIChkZWZEYXRhLT5kZWZNc2csCi0gICAgICAgICAgICAgICAgICJUaGUgU1RZTEUgc3RhdGVtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnIiwgZGVmRGF0YS0+VmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgIGRlZkRhdGEtPmRlZkVycm9yKDY1MzQsIGRlZkRhdGEtPmRlZk1zZyk7Ci0gICAgICAgICAgICAgIGZyZWUoZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChkZWZEYXRhLT5OZWVkUGF0aERhdGEgJiYgKChkZWZEYXRhLT5jYWxsYmFja3MtPk5ldENiayAmJiAoZGVmRGF0YS0+bmV0T3NuZXQ9PTEpKSB8fAotICAgICAgICAgICAgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldENiayAmJiAoZGVmRGF0YS0+bmV0T3NuZXQ9PTIpKSkpCi0gICAgICAgICAgICBkZWZEYXRhLT5QYXRoT2JqLmFkZFN0eWxlKChpbnQpJDMpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLWVuZF9uZXRzOiBLX0VORCBLX05FVFMgCi0gICAgICAgICAgeyAKLSAgICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0RW5kQ2JrLCBkZWZyTmV0RW5kQ2JrVHlwZSwgMCk7Ci0gICAgICAgICAgICBkZWZEYXRhLT5uZXRPc25ldCA9IDA7Ci0gICAgICAgICAgfQotCi1zaGFwZV90eXBlOiBLX1JJTkcKLSAgICAgICAgICAgIHsgJCQgPSAoY2hhciopIlJJTkciOyB9Ci0gICAgICAgIHwgS19TVFJJUEUKLSAgICAgICAgICAgIHsgJCQgPSAoY2hhciopIlNUUklQRSI7IH0KLSAgICAgICAgfCBLX0ZPTExPV1BJTgotICAgICAgICAgICAgeyAkJCA9IChjaGFyKikiRk9MTE9XUElOIjsgfQotICAgICAgICB8IEtfSU9XSVJFCi0gICAgICAgICAgICB7ICQkID0gKGNoYXIqKSJJT1dJUkUiOyB9Ci0gICAgICAgIHwgS19DT1JFV0lSRQotICAgICAgICAgICAgeyAkJCA9IChjaGFyKikiQ09SRVdJUkUiOyB9Ci0gICAgICAgIHwgS19CTE9DS1dJUkUKLSAgICAgICAgICAgIHsgJCQgPSAoY2hhciopIkJMT0NLV0lSRSI7IH0KLSAgICAgICAgfCBLX0ZJTExXSVJFCi0gICAgICAgICAgICB7ICQkID0gKGNoYXIqKSJGSUxMV0lSRSI7IH0KLSAgICAgICAgfCBLX0ZJTExXSVJFT1BDICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNyAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjcpIHsKLSAgICAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPk5lZWRQYXRoRGF0YSkgewotICAgICAgICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5maWxsV2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5GaWxsV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZk1zZyA9IChjaGFyKiltYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiAoZGVmRGF0YS0+ZGVmTXNnLAotICAgICAgICAgICAgICAgICAgICAgICAiVGhlIEZJTExXSVJFT1BDIGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNyBvciBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgZGVmRGF0YS0+VmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTUyLCBkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgICAgICAgZnJlZShkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICQkID0gKGNoYXIqKSJGSUxMV0lSRU9QQyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIHwgS19EUkNGSUxMCi0gICAgICAgICAgICB7ICQkID0gKGNoYXIqKSJEUkNGSUxMIjsgfQotICAgICAgICB8IEtfQkxPQ0tBR0VXSVJFCi0gICAgICAgICAgICB7ICQkID0gKGNoYXIqKSJCTE9DS0FHRVdJUkUiOyB9Ci0gICAgICAgIHwgS19QQURSSU5HCi0gICAgICAgICAgICB7ICQkID0gKGNoYXIqKSJQQURSSU5HIjsgfQotICAgICAgICB8IEtfQkxPQ0tSSU5HCi0gICAgICAgICAgICB7ICQkID0gKGNoYXIqKSJCTE9DS1JJTkciOyB9Ci0KLXNuZXRzX3NlY3Rpb24gOiAgc3RhcnRfc25ldHMgc25ldF9ydWxlcyBlbmRfc25ldHMKLSAgICAgICAgICAgIDsKLQotc25ldF9ydWxlczogLy8gZW1wdHkgCi0gICAgICAgIHwgc25ldF9ydWxlcyBzbmV0X3J1bGUKLSAgICAgICAgICAgIDsKLQotc25ldF9ydWxlOiBuZXRfYW5kX2Nvbm5lY3Rpb25zIHNuZXRfb3B0aW9ucyAnOycKLSAgICAgICAgeyBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPlNOZXRDYmssIGRlZnJTTmV0Q2JrVHlwZSwgJmRlZkRhdGEtPk5ldCk7IH0KLQotc25ldF9vcHRpb25zOiAvLyBlbXB0eSAKLSAgICAgICAgfCBzbmV0X29wdGlvbnMgc25ldF9vcHRpb24KLSAgICAgICAgICAgIDsKLQotc25ldF9vcHRpb246IHNuZXRfd2lkdGggfCBzbmV0X3ZvbHRhZ2UgfCAKLSAgICAgICAgICAgICBzbmV0X3NwYWNpbmcgfCBzbmV0X290aGVyX29wdGlvbgotICAgICAgICAgICAgIDsKLQotc25ldF9vdGhlcl9vcHRpb246ICcrJyBuZXRfdHlwZQotICAgICAgICAgICAgewotICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5WZXJzaW9uTnVtID49IDUuOCkgewotICAgICAgICAgICAgICAgIGRlZkRhdGEtPnNwZWNpYWxXaXJlX3JvdXRlU3RhdHVzID0gJDI7Ci0gICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldENiaykgeyAgIC8vIFBDUiA5MDIzMDYgCi0gICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmTXNnID0gKGNoYXIqKW1hbGxvYygxMDI0KTsKLSAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGRlZkRhdGEtPmRlZk1zZywgIlRoZSBTUEVDSUFMIE5FVCBzdGF0ZW1lbnQsIHdpdGggdHlwZSAlcywgZG9lcyBub3QgaGF2ZSBhbnkgbmV0IHN0YXRlbWVudCBkZWZpbmVkLlxuVGhlIERFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1uZXQuIiwgJDIpOwotICAgICAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZldhcm5pbmcoNzAyMywgZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICAgICBmcmVlKGRlZkRhdGEtPmRlZk1zZyk7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIHwgICcrJyBuZXRfdHlwZQotICAgICAgICAgICAgewotICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldENiaykgZGVmRGF0YS0+TmV0LmFkZFdpcmUoJDIsIE5VTEwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3BhdGhzCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyA3LzE3LzIwMDMgLSBGaXggZm9yIHBjciA2MDQ4NDgsIGFkZCBhIGNhbGxiYWNrIGZvciBlYWNoIHdpcmUKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlNOZXRXaXJlQ2JrKSB7Ci0gICAgICAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPlNOZXRXaXJlQ2JrLCBkZWZyU05ldFdpcmVDYmtUeXBlLCAmZGVmRGF0YS0+TmV0KTsKLSAgICAgICAgICAgICAgIGRlZkRhdGEtPk5ldC5mcmVlV2lyZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmRGF0YS0+YnlfaXNfa2V5d29yZCA9IEZBTFNFOwotICAgICAgICAgICAgZGVmRGF0YS0+ZG9faXNfa2V5d29yZCA9IEZBTFNFOwotICAgICAgICAgICAgZGVmRGF0YS0+bmV3X2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgICAgIGRlZkRhdGEtPnN0ZXBfaXNfa2V5d29yZCA9IEZBTFNFOwotICAgICAgICAgICAgZGVmRGF0YS0+b3JpZW50X2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgICAgIGRlZkRhdGEtPnZpcnR1YWxfaXNfa2V5d29yZCA9IEZBTFNFOwotICAgICAgICAgICAgZGVmRGF0YS0+bWFza19pc19rZXl3b3JkID0gRkFMU0U7Ci0gICAgICAgICAgICBkZWZEYXRhLT5yZWN0X2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgICAgIGRlZkRhdGEtPm5lZWRTTlBDYmsgPSAwOwotICAgICAgICAgICAgfQotIAotICAgICAgICB8ICcrJyBLX1NISUVMRCB7IGRlZkRhdGEtPmR1bWJfbW9kZSA9IDE7IGRlZkRhdGEtPm5vX251bSA9IDE7IH0gVF9TVFJJTkcKLSAgICAgICAgICAgIHsgZGVmRGF0YS0+c2hpZWxkTmFtZSA9ICQ0OyAKLSAgICAgICAgICAgICAgZGVmRGF0YS0+c3BlY2lhbFdpcmVfcm91dGVTdGF0dXMgPSAoY2hhciopIlNISUVMRCI7Ci0gICAgICAgICAgICAgIGRlZkRhdGEtPnNwZWNpYWxXaXJlX3JvdXRlU3RhdHVzTmFtZSA9ICQ0OyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNoaWVsZF9sYXllcgotICAgICAgICAgICAgCi0gICAgICAgIHwgJysnIEtfU0hBUEUgc2hhcGVfdHlwZQotICAgICAgICAgIHsgIAotICAgICAgICAgICAgZGVmRGF0YS0+c3BlY2lhbFdpcmVfc2hhcGVUeXBlID0gJDM7Ci0gICAgICAgICAgfQotICAgICAgICB8ICcrJyBLX01BU0sgTlVNQkVSCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGRlZkRhdGEtPnZhbGlkYXRlTWFza0lucHV0KChpbnQpJDMsIGRlZkRhdGEtPnNOZXRXYXJuaW5ncywgZGVmRGF0YS0+c2V0dGluZ3MtPlNOZXRXYXJuaW5ncykpIHsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT5zcGVjaWFsV2lyZV9tYXNrID0gJDM7Ci0gICAgICAgICAgICB9ICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgIHwgJysnIEtfUE9MWUdPTiB7IGRlZkRhdGEtPmR1bWJfbW9kZSA9IDE7IH0gVF9TVFJJTkcKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuNikgewotICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5TTmV0Q2JrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPnNOZXRXYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPlNOZXRXYXJuaW5ncykgewotICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmTXNnID0gKGNoYXIqKW1hbGxvYygxMDAwKTsKLSAgICAgICAgICAgICAgICAgIHNwcmludGYgKGRlZkRhdGEtPmRlZk1zZywKLSAgICAgICAgICAgICAgICAgICAgICJUaGUgUE9MWUdPTiBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWciLCBkZWZEYXRhLT5WZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZkVycm9yKDY1MzUsIGRlZkRhdGEtPmRlZk1zZyk7Ci0gICAgICAgICAgICAgICAgICBmcmVlKGRlZkRhdGEtPmRlZk1zZyk7Ci0gICAgICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZGVmRGF0YS0+R2VvbWV0cmllcy5SZXNldCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBmaXJzdFB0IG5leHRQdCBuZXh0UHQgb3RoZXJQdHMKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA+PSA1LjYpIHsgIC8vIG9ubHkgYWRkIGlmIDUuNiBvciBiZXlvbmQKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldENiaykgewotICAgICAgICAgICAgICAgIC8vIGRlZkRhdGEtPm5lZWRTTlBDYmsgd2lsbCBpbmRpY2F0ZSB0aGF0IGl0IGhhcyByZWFjaCB0aGUgbWF4Ci0gICAgICAgICAgICAgICAgLy8gbWVtb3J5IGFuZCBpZiB1c2VyIGhhcyBzZXQgcGFydGlhbFBhdGhDQmssIGRlZiBwYXJzZXIKLSAgICAgICAgICAgICAgICAvLyB3aWxsIG1ha2UgdGhlIGNhbGxiYWNrLgotICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBpbXByb3ZlIHBlcmZvcm1hbmNlCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBjb25zdHJ1Y3QgaXMgb25seSBpbiBzcGVjaWFsbmV0Ci0gICAgICAgICAgICAgICAgZGVmRGF0YS0+TmV0LmFkZFBvbHlnb24oJDQsICZkZWZEYXRhLT5HZW9tZXRyaWVzLCAmZGVmRGF0YS0+bmVlZFNOUENiaywgZGVmRGF0YS0+c3BlY2lhbFdpcmVfbWFzaywgZGVmRGF0YS0+c3BlY2lhbFdpcmVfcm91dGVTdGF0dXMsIGRlZkRhdGEtPnNwZWNpYWxXaXJlX3NoYXBlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZEYXRhLT5zcGVjaWFsV2lyZV9yb3V0ZVN0YXR1c05hbWUpOwotICAgICAgICAgICAgICAgIGRlZkRhdGEtPnNwZWNpYWxXaXJlX21hc2sgPSAwOwotICAgICAgICAgICAgICAgIGRlZkRhdGEtPnNwZWNpYWxXaXJlX3JvdXRlU3RhdHVzID0gKGNoYXIqKSJST1VURUQiOwotICAgICAgICAgICAgICAgIGRlZkRhdGEtPnNwZWNpYWxXaXJlX3NoYXBlVHlwZSA9IChjaGFyKikiIjsKLSAgICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+bmVlZFNOUENiayAmJiBkZWZEYXRhLT5jYWxsYmFja3MtPlNOZXRQYXJ0aWFsUGF0aENiaykgewotICAgICAgICAgICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldFBhcnRpYWxQYXRoQ2JrLCBkZWZyU05ldFBhcnRpYWxQYXRoQ2JrVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVmRGF0YS0+TmV0KTsKLSAgICAgICAgICAgICAgICAgICBkZWZEYXRhLT5OZXQuY2xlYXJSZWN0UG9seU5QYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+TmV0LmNsZWFyVmlhKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgIHwgJysnIEtfUkVDVCB7IGRlZkRhdGEtPmR1bWJfbW9kZSA9IDE7IH0gVF9TVFJJTkcgcHQgcHQKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuNikgewotICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5TTmV0Q2JrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPnNOZXRXYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPlNOZXRXYXJuaW5ncykgewotICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmTXNnID0gKGNoYXIqKW1hbGxvYygxMDAwKTsKLSAgICAgICAgICAgICAgICAgIHNwcmludGYgKGRlZkRhdGEtPmRlZk1zZywKLSAgICAgICAgICAgICAgICAgICAgICJUaGUgUkVDVCBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWciLCBkZWZEYXRhLT5WZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZkVycm9yKDY1MzYsIGRlZkRhdGEtPmRlZk1zZyk7Ci0gICAgICAgICAgICAgICAgICBmcmVlKGRlZkRhdGEtPmRlZk1zZyk7Ci0gICAgICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlNOZXRDYmspIHsKLSAgICAgICAgICAgICAgLy8gZGVmRGF0YS0+bmVlZFNOUENiayB3aWxsIGluZGljYXRlIHRoYXQgaXQgaGFzIHJlYWNoIHRoZSBtYXgKLSAgICAgICAgICAgICAgLy8gbWVtb3J5IGFuZCBpZiB1c2VyIGhhcyBzZXQgcGFydGlhbFBhdGhDQmssIGRlZiBwYXJzZXIKLSAgICAgICAgICAgICAgLy8gd2lsbCBtYWtlIHRoZSBjYWxsYmFjay4KLSAgICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGltcHJvdmUgcGVyZm9ybWFuY2UKLSAgICAgICAgICAgICAgLy8gVGhpcyBjb25zdHJ1Y3QgaXMgb25seSBpbiBzcGVjaWFsbmV0Ci0gICAgICAgICAgICAgIGRlZkRhdGEtPk5ldC5hZGRSZWN0KCQ0LCAkNS54LCAkNS55LCAkNi54LCAkNi55LCAmZGVmRGF0YS0+bmVlZFNOUENiaywgZGVmRGF0YS0+c3BlY2lhbFdpcmVfbWFzaywgZGVmRGF0YS0+c3BlY2lhbFdpcmVfcm91dGVTdGF0dXMsIGRlZkRhdGEtPnNwZWNpYWxXaXJlX3NoYXBlVHlwZSwgZGVmRGF0YS0+c3BlY2lhbFdpcmVfcm91dGVTdGF0dXNOYW1lKTsKLSAgICAgICAgICAgICAgZGVmRGF0YS0+c3BlY2lhbFdpcmVfbWFzayA9IDA7Ci0gICAgICAgICAgICAgIGRlZkRhdGEtPnNwZWNpYWxXaXJlX3JvdXRlU3RhdHVzID0gKGNoYXIqKSJST1VURUQiOwotICAgICAgICAgICAgICBkZWZEYXRhLT5zcGVjaWFsV2lyZV9zaGFwZVR5cGUgPSAoY2hhciopIiI7Ci0gICAgICAgICAgICAgIGRlZkRhdGEtPnNwZWNpYWxXaXJlX3JvdXRlU3RhdHVzTmFtZSA9IChjaGFyKikiIjsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPm5lZWRTTlBDYmsgJiYgZGVmRGF0YS0+Y2FsbGJhY2tzLT5TTmV0UGFydGlhbFBhdGhDYmspIHsKLSAgICAgICAgICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5TTmV0UGFydGlhbFBhdGhDYmssIGRlZnJTTmV0UGFydGlhbFBhdGhDYmtUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVmRGF0YS0+TmV0KTsKLSAgICAgICAgICAgICAgICAgZGVmRGF0YS0+TmV0LmNsZWFyUmVjdFBvbHlOUGF0aCgpOwotICAgICAgICAgICAgICAgICBkZWZEYXRhLT5OZXQuY2xlYXJWaWEoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfCAnKycgS19WSUEgeyBkZWZEYXRhLT5kdW1iX21vZGUgPSAxOyB9IFRfU1RSSU5HIG9yaWVudF9wdAotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjgpIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldENiaykgewotICAgICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5zTmV0V2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5TTmV0V2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZk1zZyA9IChjaGFyKiltYWxsb2MoMTAwMCk7Ci0gICAgICAgICAgICAgICAgICBzcHJpbnRmIChkZWZEYXRhLT5kZWZNc2csCi0gICAgICAgICAgICAgICAgICAgICAiVGhlIFZJQSBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS44IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWciLCBkZWZEYXRhLT5WZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZkVycm9yKDY1MzYsIGRlZkRhdGEtPmRlZk1zZyk7Ci0gICAgICAgICAgICAgICAgICBmcmVlKGRlZkRhdGEtPmRlZk1zZyk7Ci0gICAgICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmlyc3RQdCBvdGhlclB0cwotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPj0gNS44ICYmIGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldENiaykgewotICAgICAgICAgICAgICBkZWZEYXRhLT5OZXQuYWRkUHRzKCQ0LCAkNSwgJmRlZkRhdGEtPkdlb21ldHJpZXMsICZkZWZEYXRhLT5uZWVkU05QQ2JrLCBkZWZEYXRhLT5zcGVjaWFsV2lyZV9tYXNrLCBkZWZEYXRhLT5zcGVjaWFsV2lyZV9yb3V0ZVN0YXR1cywgZGVmRGF0YS0+c3BlY2lhbFdpcmVfc2hhcGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZkRhdGEtPnNwZWNpYWxXaXJlX3JvdXRlU3RhdHVzTmFtZSk7Ci0gICAgICAgICAgICAgIGRlZkRhdGEtPnNwZWNpYWxXaXJlX21hc2sgPSAwOwotICAgICAgICAgICAgICBkZWZEYXRhLT5zcGVjaWFsV2lyZV9yb3V0ZVN0YXR1cyA9IChjaGFyKikiUk9VVEVEIjsKLSAgICAgICAgICAgICAgZGVmRGF0YS0+c3BlY2lhbFdpcmVfc2hhcGVUeXBlID0gKGNoYXIqKSIiOwotICAgICAgICAgICAgICBkZWZEYXRhLT5zcGVjaWFsV2lyZV9yb3V0ZVN0YXR1c05hbWUgPSAoY2hhciopIiI7Ci0gICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5uZWVkU05QQ2JrICYmIGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldFBhcnRpYWxQYXRoQ2JrKSB7Ci0gICAgICAgICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldFBhcnRpYWxQYXRoQ2JrLCBkZWZyU05ldFBhcnRpYWxQYXRoQ2JrVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlZkRhdGEtPk5ldCk7Ci0gICAgICAgICAgICAgICAgIGRlZkRhdGEtPk5ldC5jbGVhclJlY3RQb2x5TlBhdGgoKTsKLSAgICAgICAgICAgICAgICAgZGVmRGF0YS0+TmV0LmNsZWFyVmlhKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotIAotICAgICAgICB8ICcrJyBLX1NPVVJDRSBzb3VyY2VfdHlwZQotICAgICAgICAgICAgeyBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5TTmV0Q2JrKSBkZWZEYXRhLT5OZXQuc2V0U291cmNlKCQzKTsgfQotCi0gICAgICAgIHwgJysnIEtfRklYRURCVU1QCi0gICAgICAgICAgICB7IGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlNOZXRDYmspIGRlZkRhdGEtPk5ldC5zZXRGaXhlZGJ1bXAoKTsgfQotIAotICAgICAgICB8ICcrJyBLX0ZSRVFVRU5DWSBOVU1CRVIKLSAgICAgICAgICAgIHsgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldENiaykgZGVmRGF0YS0+TmV0LnNldEZyZXF1ZW5jeSgkMyk7IH0KLQotICAgICAgICB8ICcrJyBLX09SSUdJTkFMIHtkZWZEYXRhLT5kdW1iX21vZGUgPSAxOyBkZWZEYXRhLT5ub19udW0gPSAxO30gVF9TVFJJTkcKLSAgICAgICAgICAgIHsgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldENiaykgZGVmRGF0YS0+TmV0LnNldE9yaWdpbmFsKCQ0KTsgfQotIAotICAgICAgICB8ICcrJyBLX1BBVFRFUk4gcGF0dGVybl90eXBlCi0gICAgICAgICAgICB7IGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlNOZXRDYmspIGRlZkRhdGEtPk5ldC5zZXRQYXR0ZXJuKCQzKTsgfQotIAotICAgICAgICB8ICcrJyBLX1dFSUdIVCBOVU1CRVIKLSAgICAgICAgICAgIHsgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldENiaykgZGVmRGF0YS0+TmV0LnNldFdlaWdodChST1VORCgkMykpOyB9Ci0gCi0gICAgICAgIHwgJysnIEtfRVNUQ0FQIE5VTUJFUgotICAgICAgICAgICAgeyAKLSAgICAgICAgICAgICAgLy8gMTEvMTIvMjAwMiAtIHRoaXMgaXMgb2Jzb2xldGUgaW4gNS41LCAmIHdpbGwgYmUgaWdub3JlZCAKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjUpCi0gICAgICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlNOZXRDYmspIGRlZkRhdGEtPk5ldC5zZXRDYXAoJDMpOwotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZldhcm5pbmcoNzAyNCwgIlRoZSBFU1RDQVAgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS41IGFuZCBsYXRlci5cblRoZSBERUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LiIpOwotICAgICAgICAgICAgfQotIAotICAgICAgICB8ICcrJyBLX1VTRSB1c2VfdHlwZQotICAgICAgICAgICAgeyBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5TTmV0Q2JrKSBkZWZEYXRhLT5OZXQuc2V0VXNlKCQzKTsgfQotIAotICAgICAgICB8ICcrJyBLX1NUWUxFIE5VTUJFUgotICAgICAgICAgICAgeyBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5TTmV0Q2JrKSBkZWZEYXRhLT5OZXQuc2V0U3R5bGUoKGludCkkMyk7IH0KLSAKLSAgICAgICAgfCAnKycgS19QUk9QRVJUWSB7ZGVmRGF0YS0+ZHVtYl9tb2RlID0gREVGX01BWF9JTlQ7IH0KLSAgICAgICAgICBzbmV0X3Byb3BfbGlzdAotICAgICAgICAgICAgeyBkZWZEYXRhLT5kdW1iX21vZGUgPSAwOyB9Ci0gCi0gICAgICAgIHwgZXh0ZW5zaW9uX3N0bXQKLSAgICAgICAgICB7IENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0RXh0Q2JrLCBkZWZyTmV0RXh0Q2JrVHlwZSwgJmRlZkRhdGEtPkhpc3RvcnlfdGV4dFswXSk7IH0KLQotb3JpZW50X3B0OiAvLyBlbXB0eSAKLSAgICAgICAgeyAkJCA9IDA7IH0KLSAgICAgICAgfCBLX04gIHskJCA9IDA7fQotICAgICAgICB8IEtfVyAgeyQkID0gMTt9Ci0gICAgICAgIHwgS19TICB7JCQgPSAyO30KLSAgICAgICAgfCBLX0UgIHskJCA9IDM7fQotICAgICAgICB8IEtfRk4geyQkID0gNDt9Ci0gICAgICAgIHwgS19GVyB7JCQgPSA1O30KLSAgICAgICAgfCBLX0ZTIHskJCA9IDY7fQotICAgICAgICB8IEtfRkUgeyQkID0gNzt9Ci0gICAgICAgIAotc2hpZWxkX2xheWVyOiAvLyBQQ1IgOTAyMzA2IAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlNOZXRDYmspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjgpIHsgCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZNc2cgPSAoY2hhciopbWFsbG9jKDEwMjQpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihkZWZEYXRhLT5kZWZNc2csICJUaGUgU1BFQ0lBTCBORVQgU0hJRUxEIHN0YXRlbWVudCBkb2Vzbid0IGhhdmUgcm91dGluZyBwb2ludHMgZGVmaW5pdGlvbi5cbldpbGwgYmUgaWdub3JlZC4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZldhcm5pbmcoNzAyNSwgZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgIC8vIENDUiAxMjQ0NDMzCi0gICAgICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+c3BlY2lhbFdpcmVfcm91dGVTdGF0dXMgPSAoY2hhciopIlNISUVMRCI7Ci0gICAgICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+c3BlY2lhbFdpcmVfcm91dGVTdGF0dXNOYW1lID0gZGVmRGF0YS0+c2hpZWxkTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfAotICAgICAgICAgICAgeyAvLyBzaW5jZSB0aGUgcGFyc2VyIHN0aWxsIHN1cHBvcnRzIDUuMyBhbmQgZWFybGllciwgCi0gICAgICAgICAgICAgIC8vIGNhbid0IGp1c3QgbW92ZSBTSElFTEQgaW4gbmV0X3R5cGUgCi0gICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5WZXJzaW9uTnVtIDwgNS40KSB7IC8vIFBDUiA0NDUyMDkgCi0gICAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldENiaykgZGVmRGF0YS0+TmV0LmFkZFNoaWVsZChkZWZEYXRhLT5zaGllbGROYW1lKTsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT5ieV9pc19rZXl3b3JkID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgZGVmRGF0YS0+ZG9faXNfa2V5d29yZCA9IEZBTFNFOwotICAgICAgICAgICAgICAgIGRlZkRhdGEtPm5ld19pc19rZXl3b3JkID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgZGVmRGF0YS0+c3RlcF9pc19rZXl3b3JkID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgZGVmRGF0YS0+b3JpZW50X2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT52aXJ0dWFsX2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT5tYXNrX2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT5yZWN0X2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT5zcGVjaWFsV2lyZV9yb3V0ZVN0YXR1cyA9IChjaGFyKikiUk9VVEVEIjsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT5zcGVjaWFsV2lyZV9yb3V0ZVN0YXR1c05hbWUgPSAoY2hhciopIiI7Ci0gICAgICAgICAgICAgICAgZGVmRGF0YS0+c2hpZWxkID0gVFJVRTsgICAvLyBzYXZlIHRoZSBwYXRoIGluZm8gaW4gdGhlIGRlZkRhdGEtPnNoaWVsZCBwYXRocyAKLSAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldENiaykgZGVmRGF0YS0+TmV0LmFkZFdpcmUoIlNISUVMRCIsIGRlZkRhdGEtPnNoaWVsZE5hbWUpOwotICAgICAgICAgICAgICAgIGRlZkRhdGEtPnNwZWNpYWxXaXJlX3JvdXRlU3RhdHVzID0gKGNoYXIqKSJST1VURUQiOwotICAgICAgICAgICAgICAgIGRlZkRhdGEtPnNwZWNpYWxXaXJlX3JvdXRlU3RhdHVzTmFtZSA9IChjaGFyKikiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwYXRocwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyA3LzE3LzIwMDMgLSBGaXggZm9yIHBjciA2MDQ4NDgsIGFkZCBhIGNhbGxiYWNrIGZvciBlYWNoIHdpcmUKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldFdpcmVDYmspIHsKLSAgICAgICAgICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5TTmV0V2lyZUNiaywgZGVmclNOZXRXaXJlQ2JrVHlwZSwgJmRlZkRhdGEtPk5ldCk7Ci0gICAgICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5WZXJzaW9uTnVtIDwgNS40KQotICAgICAgICAgICAgICAgICAgIGRlZkRhdGEtPk5ldC5mcmVlU2hpZWxkKCk7Ci0gICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICBkZWZEYXRhLT5OZXQuZnJlZVdpcmUoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuNCkgeyAgLy8gUENSIDQ0NTIwOSAKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT5zaGllbGQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT5ieV9pc19rZXl3b3JkID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgZGVmRGF0YS0+ZG9faXNfa2V5d29yZCA9IEZBTFNFOwotICAgICAgICAgICAgICAgIGRlZkRhdGEtPm5ld19pc19rZXl3b3JkID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgZGVmRGF0YS0+c3RlcF9pc19rZXl3b3JkID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgZGVmRGF0YS0+bm9uZGVmX2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT5tdXN0am9pbl9pc19rZXl3b3JkID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgZGVmRGF0YS0+b3JpZW50X2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT52aXJ0dWFsX2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT5tYXNrX2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT5yZWN0X2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT5ieV9pc19rZXl3b3JkID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgZGVmRGF0YS0+ZG9faXNfa2V5d29yZCA9IEZBTFNFOwotICAgICAgICAgICAgICAgIGRlZkRhdGEtPm5ld19pc19rZXl3b3JkID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgZGVmRGF0YS0+c3RlcF9pc19rZXl3b3JkID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgZGVmRGF0YS0+b3JpZW50X2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT52aXJ0dWFsX2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT5tYXNrX2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT5yZWN0X2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBkZWZEYXRhLT5uZWVkU05QQ2JrID0gMDsKLSAgICAgICAgICAgIH0KLQotc25ldF93aWR0aDogJysnIEtfV0lEVEggeyBkZWZEYXRhLT5kdW1iX21vZGUgPSAxOyB9IFRfU1RSSU5HIE5VTUJFUgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyAxMS8xMi8yMDAyIC0gdGhpcyBpcyBvYnNvbGV0ZSBpbiA1LjUsICYgd2lsbCBiZSBpZ25vcmVkIAotICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuNSkKLSAgICAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldENiaykgZGVmRGF0YS0+TmV0LnNldFdpZHRoKCQ0LCAkNSk7Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmV2FybmluZyg3MDI2LCAiVGhlIFdJRFRIIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNSBhbmQgbGF0ZXIuXG5UaGUgREVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC4iKTsKLSAgICAgICAgICAgIH0KLQotc25ldF92b2x0YWdlOiAnKycgS19WT0xUQUdFICB7IGRlZkRhdGEtPmR1bWJfbW9kZSA9IDE7IGRlZkRhdGEtPm5vX251bSA9IDE7IH0gVF9TVFJJTkcKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGRlZnJEYXRhOjpudW1Jc0ludCgkNCkpIHsKLSAgICAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldENiaykgZGVmRGF0YS0+TmV0LnNldFZvbHRhZ2UoYXRvaSgkNCkpOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5TTmV0Q2JrKSB7Ci0gICAgICAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPnNOZXRXYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPlNOZXRXYXJuaW5ncykgewotICAgICAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmTXNnID0gKGNoYXIqKW1hbGxvYygxMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgIHNwcmludGYgKGRlZkRhdGEtPmRlZk1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgdmFsdWUgJXMgZm9yIHN0YXRlbWVudCBWT0xUQUdFIGlzIGludmFsaWQuIFRoZSB2YWx1ZSBjYW4gb25seSBiZSBpbnRlZ2VyLlxuU3BlY2lmeSBhIHZhbGlkIHZhbHVlIGluIHVuaXRzIG9mIG1pbGxpdm9sdHMiLCAkNCk7Ci0gICAgICAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTM3LCBkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgICAgICAgZnJlZShkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotc25ldF9zcGFjaW5nOiAnKycgS19TUEFDSU5HIHsgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTsgfSBUX1NUUklORyBOVU1CRVIKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldENiaykgZGVmRGF0YS0+TmV0LnNldFNwYWNpbmcoJDQsJDUpOwotICAgICAgICAgICAgfQotICAgICAgICBvcHRfc25ldF9yYW5nZQotICAgICAgICAgICAgewotICAgICAgICAgICAgfQotCi1zbmV0X3Byb3BfbGlzdDogc25ldF9wcm9wCi0gICAgICB8IHNuZXRfcHJvcF9saXN0IHNuZXRfcHJvcAotICAgICAgOwotCi1zbmV0X3Byb3A6IFRfU1RSSU5HIE5VTUJFUgotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5TTmV0Q2JrKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBwcm9wVHA7Ci0gICAgICAgICAgICAgICAgY2hhciogc3RyID0gZGVmRGF0YS0+cmluZ0NvcHkoIiAgICAgICAgICAgICAgICAgICAgICAgIik7Ci0gICAgICAgICAgICAgICAgcHJvcFRwID0gZGVmRGF0YS0+c2Vzc2lvbi0+U05ldFByb3AucHJvcFR5cGUoJDEpOwotICAgICAgICAgICAgICAgIENIS1BST1BUWVBFKHByb3BUcCwgJDEsICJTUEVDSUFMIE5FVCIpOwotICAgICAgICAgICAgICAgIC8vIEZvciBiYWNrd29yZCBjb21wYXRpYmlsaXR5LCBhbHNvIHNldCB0aGUgc3RyaW5nIHZhbHVlIAotICAgICAgICAgICAgICAgIHNwcmludGYoc3RyLCAiJWciLCAkMik7Ci0gICAgICAgICAgICAgICAgZGVmRGF0YS0+TmV0LmFkZE51bVByb3AoJDEsICQyLCBzdHIsIHByb3BUcCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgIHwgVF9TVFJJTkcgUVNUUklORwotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5TTmV0Q2JrKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBwcm9wVHA7Ci0gICAgICAgICAgICAgICAgcHJvcFRwID0gZGVmRGF0YS0+c2Vzc2lvbi0+U05ldFByb3AucHJvcFR5cGUoJDEpOwotICAgICAgICAgICAgICAgIENIS1BST1BUWVBFKHByb3BUcCwgJDEsICJTUEVDSUFMIE5FVCIpOwotICAgICAgICAgICAgICAgIGRlZkRhdGEtPk5ldC5hZGRQcm9wKCQxLCAkMiwgcHJvcFRwKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgfCBUX1NUUklORyBUX1NUUklORwotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5TTmV0Q2JrKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBwcm9wVHA7Ci0gICAgICAgICAgICAgICAgcHJvcFRwID0gZGVmRGF0YS0+c2Vzc2lvbi0+U05ldFByb3AucHJvcFR5cGUoJDEpOwotICAgICAgICAgICAgICAgIENIS1BST1BUWVBFKHByb3BUcCwgJDEsICJTUEVDSUFMIE5FVCIpOwotICAgICAgICAgICAgICAgIGRlZkRhdGEtPk5ldC5hZGRQcm9wKCQxLCAkMiwgcHJvcFRwKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi1vcHRfc25ldF9yYW5nZTogLy8gbm90aGluZyAKLSAgICAgICAgfCBLX1JBTkdFIE5VTUJFUiBOVU1CRVIKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldENiaykgZGVmRGF0YS0+TmV0LnNldFJhbmdlKCQyLCQzKTsKLSAgICAgICAgICAgIH0KLQotb3B0X3JhbmdlOiAvLyBub3RoaW5nIAotICAgICAgICB8IEtfUkFOR0UgTlVNQkVSIE5VTUJFUgotICAgICAgICAgICAgeyBkZWZEYXRhLT5Qcm9wLnNldFJhbmdlKCQyLCAkMyk7IH0KLQotcGF0dGVybl90eXBlOiBLX0JBTEFOQ0VECi0gICAgICAgICAgICB7ICQkID0gKGNoYXIqKSJCQUxBTkNFRCI7IH0KLSAgICAgICAgfCBLX1NURUlORVIKLSAgICAgICAgICAgIHsgJCQgPSAoY2hhciopIlNURUlORVIiOyB9Ci0gICAgICAgIHwgS19UUlVOSwotICAgICAgICAgICAgeyAkJCA9IChjaGFyKikiVFJVTksiOyB9Ci0gICAgICAgIHwgS19XSVJFRExPR0lDCi0gICAgICAgICAgICB7ICQkID0gKGNoYXIqKSJXSVJFRExPR0lDIjsgfQotCi1zcGF0aHM6Ci0gICAgc3BhdGgKLSAgICAgIHsgCi0gICAgICAgIGlmIChkZWZEYXRhLT5OZWVkUGF0aERhdGEgJiYgZGVmRGF0YS0+Y2FsbGJhY2tzLT5TTmV0Q2JrKSB7Ci0gICAgICAgICAgIGlmIChkZWZEYXRhLT5uZWVkU05QQ2JrICYmIGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldFBhcnRpYWxQYXRoQ2JrKSB7IAotICAgICAgICAgICAgICAvLyByZXF1aXJlIGEgY2FsbGJhY2sgYmVmb3JlIHByb2NlZWQgYmVjYXVzZSBkZWZEYXRhLT5uZWVkU05QQ2JrIG11c3QgYmUKLSAgICAgICAgICAgICAgLy8gc2V0IHRvIDEgZnJvbSB0aGUgcHJldmlvdXMgcGF0aElzRG9uZSBhbmQgdXNlciBoYXMgcmVnaXN0ZXJlZAotICAgICAgICAgICAgICAvLyBhIGNhbGxiYWNrIHJvdXRpbmUuCi0gICAgICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldFBhcnRpYWxQYXRoQ2JrLCBkZWZyU05ldFBhcnRpYWxQYXRoQ2JrVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgJmRlZkRhdGEtPk5ldCk7Ci0gICAgICAgICAgICAgIGRlZkRhdGEtPm5lZWRTTlBDYmsgPSAwOyAgIC8vIHJlc2V0IHRoZSBmbGFnCi0gICAgICAgICAgICAgIGRlZkRhdGEtPnBhdGhJc0RvbmUoZGVmRGF0YS0+c2hpZWxkLCAxLCBkZWZEYXRhLT5uZXRPc25ldCwgJmRlZkRhdGEtPm5lZWRTTlBDYmspOwotICAgICAgICAgICAgICBkZWZEYXRhLT5OZXQuY2xlYXJSZWN0UG9seU5QYXRoKCk7Ci0gICAgICAgICAgICAgIGRlZkRhdGEtPk5ldC5jbGVhclZpYSgpOwotICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgZGVmRGF0YS0+cGF0aElzRG9uZShkZWZEYXRhLT5zaGllbGQsIDAsIGRlZkRhdGEtPm5ldE9zbmV0LCAmZGVmRGF0YS0+bmVlZFNOUENiayk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB8IHNwYXRocyBzbmV3X3BhdGgKLSAgICAgIHsgfQotCi1zbmV3X3BhdGg6IEtfTkVXIHsgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTsgfSBzcGF0aAotICAgICAgeyBpZiAoZGVmRGF0YS0+TmVlZFBhdGhEYXRhICYmIGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldENiaykgewotICAgICAgICAgICBpZiAoZGVmRGF0YS0+bmVlZFNOUENiayAmJiBkZWZEYXRhLT5jYWxsYmFja3MtPlNOZXRQYXJ0aWFsUGF0aENiaykgewotICAgICAgICAgICAgICAvLyByZXF1aXJlIGEgY2FsbGJhY2sgYmVmb3JlIHByb2NlZWQgYmVjYXVzZSBkZWZEYXRhLT5uZWVkU05QQ2JrIG11c3QgYmUKLSAgICAgICAgICAgICAgLy8gc2V0IHRvIDEgZnJvbSB0aGUgcHJldmlvdXMgcGF0aElzRG9uZSBhbmQgdXNlciBoYXMgcmVnaXN0ZXJlZAotICAgICAgICAgICAgICAvLyBhIGNhbGxiYWNrIHJvdXRpbmUuCi0gICAgICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldFBhcnRpYWxQYXRoQ2JrLCBkZWZyU05ldFBhcnRpYWxQYXRoQ2JrVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgJmRlZkRhdGEtPk5ldCk7Ci0gICAgICAgICAgICAgIGRlZkRhdGEtPm5lZWRTTlBDYmsgPSAwOyAgIC8vIHJlc2V0IHRoZSBmbGFnCi0gICAgICAgICAgICAgIGRlZkRhdGEtPnBhdGhJc0RvbmUoZGVmRGF0YS0+c2hpZWxkLCAxLCBkZWZEYXRhLT5uZXRPc25ldCwgJmRlZkRhdGEtPm5lZWRTTlBDYmspOwotICAgICAgICAgICAgICAvLyByZXNldCBhbnkgcG9seSBvciByZWN0IGluIHNwZWNpYWwgd2lyaW5nIHN0YXRlbWVudAotICAgICAgICAgICAgICBkZWZEYXRhLT5OZXQuY2xlYXJSZWN0UG9seU5QYXRoKCk7Ci0gICAgICAgICAgICAgIGRlZkRhdGEtPk5ldC5jbGVhclZpYSgpOwotICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgZGVmRGF0YS0+cGF0aElzRG9uZShkZWZEYXRhLT5zaGllbGQsIDAsIGRlZkRhdGEtPm5ldE9zbmV0LCAmZGVmRGF0YS0+bmVlZFNOUENiayk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotc3BhdGg6ICBUX1NUUklORwotICAgICAgeyBpZiAoZGVmRGF0YS0+TmVlZFBhdGhEYXRhICYmIGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldENiaykKLSAgICAgICAgICAgZGVmRGF0YS0+UGF0aE9iai5hZGRMYXllcigkMSk7Ci0gICAgICAgIGRlZkRhdGEtPmR1bWJfbW9kZSA9IDA7IGRlZkRhdGEtPm5vX251bSA9IDA7Ci0gICAgICB9Ci0gICAgd2lkdGggb3B0X3NwYXRocyBwYXRoX3B0Ci0vKgotICAgICAgeyBkdW1iX21vZGUgPSAxOyBuZXdfaXNfa2V5d29yZCA9IFRSVUU7IH0KLSovCi0gICAgICB7IGRlZkRhdGEtPmR1bWJfbW9kZSA9IERFRl9NQVhfSU5UOyBkZWZEYXRhLT5ieV9pc19rZXl3b3JkID0gVFJVRTsgZGVmRGF0YS0+ZG9faXNfa2V5d29yZCA9IFRSVUU7Ci0gICAgICAgIGRlZkRhdGEtPm5ld19pc19rZXl3b3JkID0gVFJVRTsgZGVmRGF0YS0+c3RlcF9pc19rZXl3b3JkID0gVFJVRTsKLSAgICAgICAgIGRlZkRhdGEtPm9yaWVudF9pc19rZXl3b3JkID0gVFJVRTsgZGVmRGF0YS0+cmVjdF9pc19rZXl3b3JkID0gVFJVRSwgZGVmRGF0YS0+bWFza19pc19rZXl3b3JkID0gVFJVRTsgCi0gICAgICAgICBkZWZEYXRhLT52aXJ0dWFsX2lzX2tleXdvcmQgPSBUUlVFOyAgfQotCi0gICAgcGF0aF9pdGVtX2xpc3QKLSAgICAgIHsgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMDsgZGVmRGF0YS0+cmVjdF9pc19rZXl3b3JkID0gRkFMU0UsIGRlZkRhdGEtPm1hc2tfaXNfa2V5d29yZCA9IEZBTFNFLCBkZWZEYXRhLT52aXJ0dWFsX2lzX2tleXdvcmQgPSBGQUxTRTsgfQotCi13aWR0aDogTlVNQkVSCi0gICAgICB7IGlmIChkZWZEYXRhLT5OZWVkUGF0aERhdGEgJiYgZGVmRGF0YS0+Y2FsbGJhY2tzLT5TTmV0Q2JrKQotICAgICAgICAgIGRlZkRhdGEtPlBhdGhPYmouYWRkV2lkdGgoUk9VTkQoJDEpKTsKLSAgICAgIH0KLQotc3RhcnRfc25ldHM6IEtfU05FVFMgTlVNQkVSICc7JwotICAgICAgeyAKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldFN0YXJ0Q2JrKQotICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldFN0YXJ0Q2JrLCBkZWZyU05ldFN0YXJ0Q2JrVHlwZSwgUk9VTkQoJDIpKTsKLSAgICAgICAgZGVmRGF0YS0+bmV0T3NuZXQgPSAyOwotICAgICAgfQotCi1lbmRfc25ldHM6IEtfRU5EIEtfU05FVFMgCi0gICAgICB7IAotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5TTmV0RW5kQ2JrKQotICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+U05ldEVuZENiaywgZGVmclNOZXRFbmRDYmtUeXBlLCAwKTsKLSAgICAgICAgZGVmRGF0YS0+bmV0T3NuZXQgPSAwOwotICAgICAgfQotCi1ncm91cHNfc2VjdGlvbjogZ3JvdXBzX3N0YXJ0IGdyb3VwX3J1bGVzIGdyb3Vwc19lbmQKLSAgICAgIDsKLQotZ3JvdXBzX3N0YXJ0OiBLX0dST1VQUyBOVU1CRVIgJzsnCi0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkdyb3Vwc1N0YXJ0Q2JrKQotICAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPkdyb3Vwc1N0YXJ0Q2JrLCBkZWZyR3JvdXBzU3RhcnRDYmtUeXBlLCBST1VORCgkMikpOwotICAgICAgfQotCi1ncm91cF9ydWxlczogLy8gZW1wdHkgCi0gICAgICB8IGdyb3VwX3J1bGVzIGdyb3VwX3J1bGUKLSAgICAgIDsKLQotZ3JvdXBfcnVsZTogc3RhcnRfZ3JvdXAgZ3JvdXBfbWVtYmVycyBncm91cF9vcHRpb25zICc7JwotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Hcm91cENiaykKLSAgICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5Hcm91cENiaywgZGVmckdyb3VwQ2JrVHlwZSwgJmRlZkRhdGEtPkdyb3VwKTsKLSAgICAgIH0KLQotc3RhcnRfZ3JvdXA6ICctJyB7IGRlZkRhdGEtPmR1bWJfbW9kZSA9IDE7IGRlZkRhdGEtPm5vX251bSA9IDE7IH0gVF9TVFJJTkcgCi0gICAgICB7Ci0gICAgICAgIGRlZkRhdGEtPmR1bWJfbW9kZSA9IERFRl9NQVhfSU5UOwotICAgICAgICBkZWZEYXRhLT5ub19udW0gPSBERUZfTUFYX0lOVDsKLSAgICAgICAgLyogZHVtYl9tb2RlIGlzIGF1dG9tYXRpY2FsbHkgdHVybmVkIG9mZiBhdCB0aGUgZmlyc3QKLSAgICAgICAgICogKyBpbiB0aGUgb3B0aW9ucyBvciBhdCB0aGUgOyBhdCB0aGUgZW5kIG9mIHRoZSBncm91cCAqLwotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Hcm91cENiaykgZGVmRGF0YS0+R3JvdXAuc2V0dXAoJDMpOwotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Hcm91cE5hbWVDYmspCi0gICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+R3JvdXBOYW1lQ2JrLCBkZWZyR3JvdXBOYW1lQ2JrVHlwZSwgJDMpOwotICAgICAgfQotCi1ncm91cF9tZW1iZXJzOiAKLSAgICAgIHwgZ3JvdXBfbWVtYmVycyBncm91cF9tZW1iZXIKLSAgICAgIHsgIH0KLQotZ3JvdXBfbWVtYmVyOiBUX1NUUklORwotICAgICAgewotICAgICAgICAvLyBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Hcm91cENiaykgZGVmRGF0YS0+R3JvdXAuYWRkTWVtYmVyKCQxKTsgCi0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkdyb3VwTWVtYmVyQ2JrKQotICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+R3JvdXBNZW1iZXJDYmssIGRlZnJHcm91cE1lbWJlckNia1R5cGUsICQxKTsKLSAgICAgIH0KLQotZ3JvdXBfb3B0aW9uczogLy8gZW1wdHkgCi0gICAgICB8IGdyb3VwX29wdGlvbnMgZ3JvdXBfb3B0aW9uIAotICAgICAgOwotCi1ncm91cF9vcHRpb246ICcrJyBLX1NPRlQgZ3JvdXBfc29mdF9vcHRpb25zCi0gICAgICB7IH0KLSAgICAgIHwgICAgICcrJyBLX1BST1BFUlRZIHsgZGVmRGF0YS0+ZHVtYl9tb2RlID0gREVGX01BWF9JTlQ7IH0KLSAgICAgICAgICAgIGdyb3VwX3Byb3BfbGlzdAotICAgICAgeyBkZWZEYXRhLT5kdW1iX21vZGUgPSAwOyB9Ci0gICAgICB8ICAgICAnKycgS19SRUdJT04geyBkZWZEYXRhLT5kdW1iX21vZGUgPSAxOyAgZGVmRGF0YS0+bm9fbnVtID0gMTsgfSBncm91cF9yZWdpb24KLSAgICAgIHsgfQotICAgICAgfCBleHRlbnNpb25fc3RtdAotICAgICAgeyAKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+R3JvdXBNZW1iZXJDYmspCi0gICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5Hcm91cEV4dENiaywgZGVmckdyb3VwRXh0Q2JrVHlwZSwgJmRlZkRhdGEtPkhpc3RvcnlfdGV4dFswXSk7Ci0gICAgICB9Ci0KLWdyb3VwX3JlZ2lvbjogcHQgcHQKLSAgICAgIHsKLSAgICAgICAgLy8gMTEvMTIvMjAwMiAtIHRoaXMgaXMgb2Jzb2xldGUgaW4gNS41LCAmIHdpbGwgYmUgaWdub3JlZCAKLSAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjUpIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Hcm91cENiaykKLSAgICAgICAgICAgIGRlZkRhdGEtPkdyb3VwLmFkZFJlZ2lvblJlY3QoJDEueCwgJDEueSwgJDIueCwgJDIueSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGRlZkRhdGEtPmRlZldhcm5pbmcoNzAyNywgIlRoZSBHUk9VUCBSRUdJT04gcHQgcHQgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS41IGFuZCBsYXRlci5cblRoZSBERUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LiIpOwotICAgICAgfQotICAgICAgfCBUX1NUUklORwotICAgICAgeyBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Hcm91cENiaykKLSAgICAgICAgICBkZWZEYXRhLT5Hcm91cC5zZXRSZWdpb25OYW1lKCQxKTsKLSAgICAgIH0KLQotZ3JvdXBfcHJvcF9saXN0IDogLy8gZW1wdHkgCi0gICAgICB8IGdyb3VwX3Byb3BfbGlzdCBncm91cF9wcm9wCi0gICAgICA7Ci0KLWdyb3VwX3Byb3AgOiBUX1NUUklORyBOVU1CRVIKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+R3JvdXBDYmspIHsKLSAgICAgICAgICBjaGFyIHByb3BUcDsKLSAgICAgICAgICBjaGFyKiBzdHIgPSBkZWZEYXRhLT5yaW5nQ29weSgiICAgICAgICAgICAgICAgICAgICAgICAiKTsKLSAgICAgICAgICBwcm9wVHAgPSBkZWZEYXRhLT5zZXNzaW9uLT5Hcm91cFByb3AucHJvcFR5cGUoJDEpOwotICAgICAgICAgIENIS1BST1BUWVBFKHByb3BUcCwgJDEsICJHUk9VUCIpOwotICAgICAgICAgIHNwcmludGYoc3RyLCAiJWciLCAkMik7Ci0gICAgICAgICAgZGVmRGF0YS0+R3JvdXAuYWRkTnVtUHJvcGVydHkoJDEsICQyLCBzdHIsIHByb3BUcCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHwgVF9TVFJJTkcgUVNUUklORwotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Hcm91cENiaykgewotICAgICAgICAgIGNoYXIgcHJvcFRwOwotICAgICAgICAgIHByb3BUcCA9IGRlZkRhdGEtPnNlc3Npb24tPkdyb3VwUHJvcC5wcm9wVHlwZSgkMSk7Ci0gICAgICAgICAgQ0hLUFJPUFRZUEUocHJvcFRwLCAkMSwgIkdST1VQIik7Ci0gICAgICAgICAgZGVmRGF0YS0+R3JvdXAuYWRkUHJvcGVydHkoJDEsICQyLCBwcm9wVHApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB8IFRfU1RSSU5HIFRfU1RSSU5HCi0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkdyb3VwQ2JrKSB7Ci0gICAgICAgICAgY2hhciBwcm9wVHA7Ci0gICAgICAgICAgcHJvcFRwID0gZGVmRGF0YS0+c2Vzc2lvbi0+R3JvdXBQcm9wLnByb3BUeXBlKCQxKTsKLSAgICAgICAgICBDSEtQUk9QVFlQRShwcm9wVHAsICQxLCAiR1JPVVAiKTsKLSAgICAgICAgICBkZWZEYXRhLT5Hcm91cC5hZGRQcm9wZXJ0eSgkMSwgJDIsIHByb3BUcCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotZ3JvdXBfc29mdF9vcHRpb25zOiAvLyBlbXB0eSAKLSAgICAgIHwgZ3JvdXBfc29mdF9vcHRpb25zIGdyb3VwX3NvZnRfb3B0aW9uIAotICAgICAgeyB9Ci0KLWdyb3VwX3NvZnRfb3B0aW9uOiBLX01BWFggTlVNQkVSCi0gICAgICB7Ci0gICAgICAgIC8vIDExLzEyLzIwMDIgLSB0aGlzIGlzIG9ic29sZXRlIGluIDUuNSwgJiB3aWxsIGJlIGlnbm9yZWQgCi0gICAgICAgIGlmIChkZWZEYXRhLT5WZXJzaW9uTnVtIDwgNS41KQotICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkdyb3VwQ2JrKSBkZWZEYXRhLT5Hcm91cC5zZXRNYXhYKFJPVU5EKCQyKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBkZWZEYXRhLT5kZWZXYXJuaW5nKDcwMjgsICJUaGUgR1JPVVAgU09GVCBNQVhYIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNSBhbmQgbGF0ZXIuXG5UaGUgREVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC4iKTsKLSAgICAgIH0KLSAgICAgIHwgS19NQVhZIE5VTUJFUgotICAgICAgeyAKLSAgICAgICAgLy8gMTEvMTIvMjAwMiAtIHRoaXMgaXMgb2Jzb2xldGUgaW4gNS41LCAmIHdpbGwgYmUgaWdub3JlZCAKLSAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjUpCi0gICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+R3JvdXBDYmspIGRlZkRhdGEtPkdyb3VwLnNldE1heFkoUk9VTkQoJDIpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGRlZkRhdGEtPmRlZldhcm5pbmcoNzAyOSwgIlRoZSBHUk9VUCBTT0ZUIE1BWFkgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS41IGFuZCBsYXRlci5cblRoZSBERUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LiIpOwotICAgICAgfQotICAgICAgfCBLX01BWEhBTEZQRVJJTUVURVIgTlVNQkVSCi0gICAgICB7IAotICAgICAgICAvLyAxMS8xMi8yMDAyIC0gdGhpcyBpcyBvYnNvbGV0ZSBpbiA1LjUsICYgd2lsbCBiZSBpZ25vcmVkIAotICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuNSkKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Hcm91cENiaykgZGVmRGF0YS0+R3JvdXAuc2V0UGVyaW0oUk9VTkQoJDIpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGRlZkRhdGEtPmRlZldhcm5pbmcoNzAzMCwgIlRoZSBHUk9VUCBTT0ZUIE1BWEhBTEZQRVJJTUVURVIgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS41IGFuZCBsYXRlci5cblRoZSBERUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LiIpOwotICAgICAgfQotCi1ncm91cHNfZW5kOiBLX0VORCBLX0dST1VQUyAKLSAgICAgIHsgCi0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkdyb3Vwc0VuZENiaykKLSAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPkdyb3Vwc0VuZENiaywgZGVmckdyb3Vwc0VuZENia1R5cGUsIDApOwotICAgICAgfQotCi0vLyA4LzMxLzIwMDEgLSBUaGlzIGlzIG9ic29sZXRlIGluIDUuNCAKLWFzc2VydGlvbnNfc2VjdGlvbjogYXNzZXJ0aW9uc19zdGFydCBjb25zdHJhaW50X3J1bGVzIGFzc2VydGlvbnNfZW5kCi0gICAgICA7Ci0KLS8vIDgvMzEvMjAwMSAtIFRoaXMgaXMgb2Jzb2xldGUgaW4gNS40IAotY29uc3RyYWludF9zZWN0aW9uOiBjb25zdHJhaW50c19zdGFydCBjb25zdHJhaW50X3J1bGVzIGNvbnN0cmFpbnRzX2VuZAotICAgICAgOwotCi1hc3NlcnRpb25zX3N0YXJ0OiBLX0FTU0VSVElPTlMgTlVNQkVSICc7JwotICAgICAgewotICAgICAgICBpZiAoKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjQpICYmIChkZWZEYXRhLT5jYWxsYmFja3MtPkFzc2VydGlvbnNTdGFydENiaykpIHsKLSAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPkFzc2VydGlvbnNTdGFydENiaywgZGVmckFzc2VydGlvbnNTdGFydENia1R5cGUsCi0gICAgICAgICAgICAgICAgICAgUk9VTkQoJDIpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Bc3NlcnRpb25DYmspCi0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+YXNzZXJ0aW9uV2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5Bc3NlcnRpb25XYXJuaW5ncykKLSAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmV2FybmluZyg3MDMxLCAiVGhlIEFTU0VSVElPTlMgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cblRoZSBERUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkFzc2VydGlvbkNiaykKLSAgICAgICAgICBkZWZEYXRhLT5Bc3NlcnRpb24uc2V0QXNzZXJ0aW9uTW9kZSgpOwotICAgICAgfQotCi1jb25zdHJhaW50c19zdGFydDogS19DT05TVFJBSU5UUyBOVU1CRVIgJzsnCi0gICAgICB7Ci0gICAgICAgIGlmICgoZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuNCkgJiYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+Q29uc3RyYWludHNTdGFydENiaykpIHsKLSAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPkNvbnN0cmFpbnRzU3RhcnRDYmssIGRlZnJDb25zdHJhaW50c1N0YXJ0Q2JrVHlwZSwKLSAgICAgICAgICAgICAgICAgICBST1VORCgkMikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkNvbnN0cmFpbnRDYmspCi0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y29uc3RyYWludFdhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+Q29uc3RyYWludFdhcm5pbmdzKQotICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZXYXJuaW5nKDcwMzIsICJUaGUgQ09OU1RSQUlOVFMgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cblRoZSBERUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkNvbnN0cmFpbnRDYmspCi0gICAgICAgICAgZGVmRGF0YS0+QXNzZXJ0aW9uLnNldENvbnN0cmFpbnRNb2RlKCk7Ci0gICAgICB9Ci0KLWNvbnN0cmFpbnRfcnVsZXM6IC8vIGVtcHR5IAotICAgICAgfCBjb25zdHJhaW50X3J1bGVzIGNvbnN0cmFpbnRfcnVsZSAKLSAgICAgIDsKLQotY29uc3RyYWludF9ydWxlOiAgIG9wZXJhbmRfcnVsZSAKLSAgICAgIHwgd2lyZWRsb2dpY19ydWxlIAotICAgICAgewotICAgICAgICBpZiAoKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjQpICYmIChkZWZEYXRhLT5jYWxsYmFja3MtPkNvbnN0cmFpbnRDYmsgfHwgZGVmRGF0YS0+Y2FsbGJhY2tzLT5Bc3NlcnRpb25DYmspKSB7Ci0gICAgICAgICAgaWYgKGRlZkRhdGEtPkFzc2VydGlvbi5pc0NvbnN0cmFpbnQoKSkgCi0gICAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPkNvbnN0cmFpbnRDYmssIGRlZnJDb25zdHJhaW50Q2JrVHlwZSwgJmRlZkRhdGEtPkFzc2VydGlvbik7Ci0gICAgICAgICAgaWYgKGRlZkRhdGEtPkFzc2VydGlvbi5pc0Fzc2VydGlvbigpKSAKLSAgICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+QXNzZXJ0aW9uQ2JrLCBkZWZyQXNzZXJ0aW9uQ2JrVHlwZSwgJmRlZkRhdGEtPkFzc2VydGlvbik7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotb3BlcmFuZF9ydWxlOiAnLScgb3BlcmFuZCBkZWxheV9zcGVjcyAnOycKLSAgICAgIHsgCi0gICAgICAgIGlmICgoZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuNCkgJiYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+Q29uc3RyYWludENiayB8fCBkZWZEYXRhLT5jYWxsYmFja3MtPkFzc2VydGlvbkNiaykpIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+QXNzZXJ0aW9uLmlzQ29uc3RyYWludCgpKSAKLSAgICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+Q29uc3RyYWludENiaywgZGVmckNvbnN0cmFpbnRDYmtUeXBlLCAmZGVmRGF0YS0+QXNzZXJ0aW9uKTsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+QXNzZXJ0aW9uLmlzQXNzZXJ0aW9uKCkpIAotICAgICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5Bc3NlcnRpb25DYmssIGRlZnJBc3NlcnRpb25DYmtUeXBlLCAmZGVmRGF0YS0+QXNzZXJ0aW9uKTsKLSAgICAgICAgfQotICAgCi0gICAgICAgIC8vIHJlc2V0IGFsbCB0aGUgZmxhZ3MgYW5kIGV2ZXJ5dGhpbmcKLSAgICAgICAgZGVmRGF0YS0+QXNzZXJ0aW9uLmNsZWFyKCk7Ci0gICAgICB9Ci0KLW9wZXJhbmQ6IEtfTkVUIHsgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTsgZGVmRGF0YS0+bm9fbnVtID0gMTsgfSBUX1NUUklORyAKLSAgICAgIHsKLSAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkNvbnN0cmFpbnRDYmsgfHwgZGVmRGF0YS0+Y2FsbGJhY2tzLT5Bc3NlcnRpb25DYmspCi0gICAgICAgICAgIGRlZkRhdGEtPkFzc2VydGlvbi5hZGROZXQoJDMpOwotICAgICAgfQotICAgICAgfCBLX1BBVEgge2RlZkRhdGEtPmR1bWJfbW9kZSA9IDQ7IGRlZkRhdGEtPm5vX251bSA9IDQ7fSBUX1NUUklORyBUX1NUUklORyBUX1NUUklORyBUX1NUUklORwotICAgICAgewotICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+Q29uc3RyYWludENiayB8fCBkZWZEYXRhLT5jYWxsYmFja3MtPkFzc2VydGlvbkNiaykKLSAgICAgICAgICAgZGVmRGF0YS0+QXNzZXJ0aW9uLmFkZFBhdGgoJDMsICQ0LCAkNSwgJDYpOwotICAgICAgfQotICAgICAgfCBLX1NVTSAgJygnIG9wZXJhbmRfbGlzdCAnKScKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+Q29uc3RyYWludENiayB8fCBkZWZEYXRhLT5jYWxsYmFja3MtPkFzc2VydGlvbkNiaykKLSAgICAgICAgICAgZGVmRGF0YS0+QXNzZXJ0aW9uLnNldFN1bSgpOwotICAgICAgfQotICAgICAgfCBLX0RJRkYgJygnIG9wZXJhbmRfbGlzdCAnKScKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+Q29uc3RyYWludENiayB8fCBkZWZEYXRhLT5jYWxsYmFja3MtPkFzc2VydGlvbkNiaykKLSAgICAgICAgICAgZGVmRGF0YS0+QXNzZXJ0aW9uLnNldERpZmYoKTsKLSAgICAgIH0KLQotb3BlcmFuZF9saXN0OiBvcGVyYW5kIAotICAgICAgfCBvcGVyYW5kX2xpc3Qgb3BlcmFuZAotICAgICAgeyB9Ci0gICAgICB8IG9wZXJhbmRfbGlzdCAnLCcgb3BlcmFuZAotCi13aXJlZGxvZ2ljX3J1bGU6ICctJyBLX1dJUkVETE9HSUMgeyBkZWZEYXRhLT5kdW1iX21vZGUgPSAxOyBkZWZEYXRhLT5ub19udW0gPSAxOyB9IFRfU1RSSU5HCi0gICAgICBvcHRfcGx1cyBLX01BWERJU1QgTlVNQkVSICc7JwotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Db25zdHJhaW50Q2JrIHx8IGRlZkRhdGEtPmNhbGxiYWNrcy0+QXNzZXJ0aW9uQ2JrKQotICAgICAgICAgIGRlZkRhdGEtPkFzc2VydGlvbi5zZXRXaXJlZGxvZ2ljKCQ0LCAkNyk7Ci0gICAgICB9Ci0KLW9wdF9wbHVzOgotICAgICAgLy8gZW1wdHkgCi0gICAgICB7ICQkID0gKGNoYXIqKSIiOyB9Ci0gICAgICB8ICcrJwotICAgICAgeyAkJCA9IChjaGFyKikiKyI7IH0KLQotZGVsYXlfc3BlY3M6IC8vIGVtcHR5IAotICAgICAgfCBkZWxheV9zcGVjcyBkZWxheV9zcGVjCi0gICAgICA7Ci0KLWRlbGF5X3NwZWM6ICcrJyBLX1JJU0VNSU4gTlVNQkVSIAotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Db25zdHJhaW50Q2JrIHx8IGRlZkRhdGEtPmNhbGxiYWNrcy0+QXNzZXJ0aW9uQ2JrKQotICAgICAgICAgIGRlZkRhdGEtPkFzc2VydGlvbi5zZXRSaXNlTWluKCQzKTsKLSAgICAgIH0KLSAgICAgIHwgJysnIEtfUklTRU1BWCBOVU1CRVIgCi0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkNvbnN0cmFpbnRDYmsgfHwgZGVmRGF0YS0+Y2FsbGJhY2tzLT5Bc3NlcnRpb25DYmspCi0gICAgICAgICAgZGVmRGF0YS0+QXNzZXJ0aW9uLnNldFJpc2VNYXgoJDMpOwotICAgICAgfQotICAgICAgfCAnKycgS19GQUxMTUlOIE5VTUJFUiAKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+Q29uc3RyYWludENiayB8fCBkZWZEYXRhLT5jYWxsYmFja3MtPkFzc2VydGlvbkNiaykKLSAgICAgICAgICBkZWZEYXRhLT5Bc3NlcnRpb24uc2V0RmFsbE1pbigkMyk7Ci0gICAgICB9Ci0gICAgICB8ICcrJyBLX0ZBTExNQVggTlVNQkVSIAotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Db25zdHJhaW50Q2JrIHx8IGRlZkRhdGEtPmNhbGxiYWNrcy0+QXNzZXJ0aW9uQ2JrKQotICAgICAgICAgIGRlZkRhdGEtPkFzc2VydGlvbi5zZXRGYWxsTWF4KCQzKTsKLSAgICAgIH0KLQotY29uc3RyYWludHNfZW5kOiBLX0VORCBLX0NPTlNUUkFJTlRTCi0gICAgICB7IGlmICgoZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuNCkgJiYgZGVmRGF0YS0+Y2FsbGJhY2tzLT5Db25zdHJhaW50c0VuZENiaykgewotICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+Q29uc3RyYWludHNFbmRDYmssIGRlZnJDb25zdHJhaW50c0VuZENia1R5cGUsIDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkNvbnN0cmFpbnRzRW5kQ2JrKSB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y29uc3RyYWludFdhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+Q29uc3RyYWludFdhcm5pbmdzKQotICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZXYXJuaW5nKDcwMzIsICJUaGUgQ09OU1RSQUlOVFMgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cblRoZSBERUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LiIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi1hc3NlcnRpb25zX2VuZDogS19FTkQgS19BU1NFUlRJT05TCi0gICAgICB7IGlmICgoZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuNCkgJiYgZGVmRGF0YS0+Y2FsbGJhY2tzLT5Bc3NlcnRpb25zRW5kQ2JrKSB7Ci0gICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5Bc3NlcnRpb25zRW5kQ2JrLCBkZWZyQXNzZXJ0aW9uc0VuZENia1R5cGUsIDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkFzc2VydGlvbnNFbmRDYmspIHsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5hc3NlcnRpb25XYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPkFzc2VydGlvbldhcm5pbmdzKQotICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZXYXJuaW5nKDcwMzEsICJUaGUgQVNTRVJUSU9OUyBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIERFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuIik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLXNjYW5jaGFpbnNfc2VjdGlvbjogc2NhbmNoYWluX3N0YXJ0IHNjYW5jaGFpbl9ydWxlcyBzY2FuY2hhaW5fZW5kCi0gICAgICA7Ci0KLXNjYW5jaGFpbl9zdGFydDogS19TQ0FOQ0hBSU5TIE5VTUJFUiAnOycKLSAgICAgIHsgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U2NhbmNoYWluc1N0YXJ0Q2JrKQotICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+U2NhbmNoYWluc1N0YXJ0Q2JrLCBkZWZyU2NhbmNoYWluc1N0YXJ0Q2JrVHlwZSwKLSAgICAgICAgICAgICAgICAgICBST1VORCgkMikpOwotICAgICAgfQotCi1zY2FuY2hhaW5fcnVsZXM6IC8vIGVtcHR5IAotICAgICAgfCBzY2FuY2hhaW5fcnVsZXMgc2Nhbl9ydWxlCi0gICAgICB7fQotCi1zY2FuX3J1bGU6IHN0YXJ0X3NjYW4gc2Nhbl9tZW1iZXJzICc7JyAKLSAgICAgIHsgCi0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlNjYW5jaGFpbkNiaykKLSAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPlNjYW5jaGFpbkNiaywgZGVmclNjYW5jaGFpbkNia1R5cGUsICZkZWZEYXRhLT5TY2FuY2hhaW4pOwotICAgICAgfQotCi1zdGFydF9zY2FuOiAnLScge2RlZkRhdGEtPmR1bWJfbW9kZSA9IDE7IGRlZkRhdGEtPm5vX251bSA9IDE7fSBUX1NUUklORyAKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U2NhbmNoYWluQ2JrKQotICAgICAgICAgIGRlZkRhdGEtPlNjYW5jaGFpbi5zZXROYW1lKCQzKTsKLSAgICAgICAgZGVmRGF0YS0+Yml0X2lzX2tleXdvcmQgPSBUUlVFOwotICAgICAgfQotCi1zY2FuX21lbWJlcnM6IAotICAgICAgfCBzY2FuX21lbWJlcnMgc2Nhbl9tZW1iZXIKLSAgICAgIDsKLQotb3B0X3BpbiA6Ci0gICAgICAvLyBlbXB0eSAKLSAgICAgIHsgJCQgPSAoY2hhciopIiI7IH0KLSAgICAgIHwgVF9TVFJJTkcKLSAgICAgIHsgJCQgPSAkMTsgfQotCi1zY2FuX21lbWJlcjogJysnIEtfU1RBUlQge2RlZkRhdGEtPmR1bWJfbW9kZSA9IDI7IGRlZkRhdGEtPm5vX251bSA9IDI7fSBUX1NUUklORyBvcHRfcGluCi0gICAgICB7IGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlNjYW5jaGFpbkNiaykKLSAgICAgICAgICBkZWZEYXRhLT5TY2FuY2hhaW4uc2V0U3RhcnQoJDQsICQ1KTsKLSAgICAgIH0KLSAgICAgIHwgJysnIEtfRkxPQVRJTkcgeyBkZWZEYXRhLT5kdW1iX21vZGUgPSAxOyBkZWZEYXRhLT5ub19udW0gPSAxOyB9IGZsb2F0aW5nX2luc3RfbGlzdAotICAgICAgeyBkZWZEYXRhLT5kdW1iX21vZGUgPSAwOyBkZWZEYXRhLT5ub19udW0gPSAwOyB9Ci0gICAgICB8ICcrJyBLX09SREVSRUQKLSAgICAgIHsKLSAgICAgICAgIGRlZkRhdGEtPmR1bWJfbW9kZSA9IDE7Ci0gICAgICAgICBkZWZEYXRhLT5ub19udW0gPSAxOwotICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U2NhbmNoYWluQ2JrKQotICAgICAgICAgICBkZWZEYXRhLT5TY2FuY2hhaW4uYWRkT3JkZXJlZExpc3QoKTsKLSAgICAgIH0KLSAgICAgIG9yZGVyZWRfaW5zdF9saXN0Ci0gICAgICB7IGRlZkRhdGEtPmR1bWJfbW9kZSA9IDA7IGRlZkRhdGEtPm5vX251bSA9IDA7IH0KLSAgICAgIHwgJysnIEtfU1RPUCB7ZGVmRGF0YS0+ZHVtYl9tb2RlID0gMjsgZGVmRGF0YS0+bm9fbnVtID0gMjsgfSBUX1NUUklORyBvcHRfcGluCi0gICAgICB7IGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlNjYW5jaGFpbkNiaykKLSAgICAgICAgICBkZWZEYXRhLT5TY2FuY2hhaW4uc2V0U3RvcCgkNCwgJDUpOwotICAgICAgfQotICAgICAgfCAnKycgS19DT01NT05TQ0FOUElOUyB7IGRlZkRhdGEtPmR1bWJfbW9kZSA9IDEwOyBkZWZEYXRhLT5ub19udW0gPSAxMDsgfSBvcHRfY29tbW9uX3BpbnMKLSAgICAgIHsgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMDsgIGRlZkRhdGEtPm5vX251bSA9IDA7IH0KLSAgICAgIHwgJysnIEtfUEFSVElUSU9OIHsgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTsgZGVmRGF0YS0+bm9fbnVtID0gMTsgfSBUX1NUUklORyAgLy8gNS41IAotICAgICAgcGFydGl0aW9uX21heGJpdHMKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjUpIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5TY2FuY2hhaW5DYmspIHsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5zY2FuY2hhaW5XYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPlNjYW5jaGFpbldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGRlZkRhdGEtPmRlZk1zZyA9IChjaGFyKiltYWxsb2MoMTAwMCk7Ci0gICAgICAgICAgICAgIHNwcmludGYgKGRlZkRhdGEtPmRlZk1zZywKLSAgICAgICAgICAgICAgICAgIlRoZSBQQVJUSVRJT04gc3RhdGVtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNSBhbmQgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnIiwgZGVmRGF0YS0+VmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgIGRlZkRhdGEtPmRlZkVycm9yKDY1MzgsIGRlZkRhdGEtPmRlZk1zZyk7Ci0gICAgICAgICAgICAgIGZyZWUoZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlNjYW5jaGFpbkNiaykKLSAgICAgICAgICBkZWZEYXRhLT5TY2FuY2hhaW4uc2V0UGFydGl0aW9uKCQ0LCAkNSk7Ci0gICAgICB9Ci0gICAgICB8IGV4dGVuc2lvbl9zdG10Ci0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlNjYW5DaGFpbkV4dENiaykKLSAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPlNjYW5DaGFpbkV4dENiaywgZGVmclNjYW5DaGFpbkV4dENia1R5cGUsICZkZWZEYXRhLT5IaXN0b3J5X3RleHRbMF0pOwotICAgICAgfQotCi1vcHRfY29tbW9uX3BpbnM6IC8vIGVtcHR5IAotICAgICAgeyB9Ci0gICAgICB8ICcoJyBUX1NUUklORyBUX1NUUklORyAnKScKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U2NhbmNoYWluQ2JrKSB7Ci0gICAgICAgICAgaWYgKHN0cmNtcCgkMiwgIklOIikgPT0gMCB8fCBzdHJjbXAoJDIsICJpbiIpID09IDApCi0gICAgICAgICAgICBkZWZEYXRhLT5TY2FuY2hhaW4uc2V0Q29tbW9uSW4oJDMpOwotICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCgkMiwgIk9VVCIpID09IDAgfHwgc3RyY21wKCQyLCAib3V0IikgPT0gMCkKLSAgICAgICAgICAgIGRlZkRhdGEtPlNjYW5jaGFpbi5zZXRDb21tb25PdXQoJDMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB8ICcoJyBUX1NUUklORyBUX1NUUklORyAnKScgJygnIFRfU1RSSU5HIFRfU1RSSU5HICcpJwotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5TY2FuY2hhaW5DYmspIHsKLSAgICAgICAgICBpZiAoc3RyY21wKCQyLCAiSU4iKSA9PSAwIHx8IHN0cmNtcCgkMiwgImluIikgPT0gMCkKLSAgICAgICAgICAgIGRlZkRhdGEtPlNjYW5jaGFpbi5zZXRDb21tb25JbigkMyk7Ci0gICAgICAgICAgZWxzZSBpZiAoc3RyY21wKCQyLCAiT1VUIikgPT0gMCB8fCBzdHJjbXAoJDIsICJvdXQiKSA9PSAwKQotICAgICAgICAgICAgZGVmRGF0YS0+U2NhbmNoYWluLnNldENvbW1vbk91dCgkMyk7Ci0gICAgICAgICAgaWYgKHN0cmNtcCgkNiwgIklOIikgPT0gMCB8fCBzdHJjbXAoJDYsICJpbiIpID09IDApCi0gICAgICAgICAgICBkZWZEYXRhLT5TY2FuY2hhaW4uc2V0Q29tbW9uSW4oJDcpOwotICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCgkNiwgIk9VVCIpID09IDAgfHwgc3RyY21wKCQ2LCAib3V0IikgPT0gMCkKLSAgICAgICAgICAgIGRlZkRhdGEtPlNjYW5jaGFpbi5zZXRDb21tb25PdXQoJDcpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLWZsb2F0aW5nX2luc3RfbGlzdDogLy8gZW1wdHkgCi0gICAgICB8IGZsb2F0aW5nX2luc3RfbGlzdCBvbmVfZmxvYXRpbmdfaW5zdAotICAgICAgOwotCi1vbmVfZmxvYXRpbmdfaW5zdDogVF9TVFJJTkcKLSAgICAgIHsKLSAgICAgICAgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTAwMDsKLSAgICAgICAgZGVmRGF0YS0+bm9fbnVtID0gMTAwMDsKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U2NhbmNoYWluQ2JrKQotICAgICAgICAgIGRlZkRhdGEtPlNjYW5jaGFpbi5hZGRGbG9hdGluZ0luc3QoJDEpOwotICAgICAgfQotICAgICAgZmxvYXRpbmdfcGlucwotICAgICAgeyBkZWZEYXRhLT5kdW1iX21vZGUgPSAxOyBkZWZEYXRhLT5ub19udW0gPSAxOyB9Ci0KLWZsb2F0aW5nX3BpbnM6IC8vIGVtcHR5ICAKLSAgICAgIHsgfQotICAgICAgfCAnKCcgVF9TVFJJTkcgIFRfU1RSSU5HICcpJwotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5TY2FuY2hhaW5DYmspIHsKLSAgICAgICAgICBpZiAoc3RyY21wKCQyLCAiSU4iKSA9PSAwIHx8IHN0cmNtcCgkMiwgImluIikgPT0gMCkKLSAgICAgICAgICAgIGRlZkRhdGEtPlNjYW5jaGFpbi5hZGRGbG9hdGluZ0luKCQzKTsKLSAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoJDIsICJPVVQiKSA9PSAwIHx8IHN0cmNtcCgkMiwgIm91dCIpID09IDApCi0gICAgICAgICAgICBkZWZEYXRhLT5TY2FuY2hhaW4uYWRkRmxvYXRpbmdPdXQoJDMpOwotICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCgkMiwgIkJJVFMiKSA9PSAwIHx8IHN0cmNtcCgkMiwgImJpdHMiKSA9PSAwKSB7Ci0gICAgICAgICAgICBkZWZEYXRhLT5iaXRzTnVtID0gYXRvaSgkMyk7Ci0gICAgICAgICAgICBkZWZEYXRhLT5TY2FuY2hhaW4uc2V0RmxvYXRpbmdCaXRzKGRlZkRhdGEtPmJpdHNOdW0pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgfCAnKCcgVF9TVFJJTkcgIFRfU1RSSU5HICcpJyAnKCcgVF9TVFJJTkcgIFRfU1RSSU5HICcpJwotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5TY2FuY2hhaW5DYmspIHsKLSAgICAgICAgICBpZiAoc3RyY21wKCQyLCAiSU4iKSA9PSAwIHx8IHN0cmNtcCgkMiwgImluIikgPT0gMCkKLSAgICAgICAgICAgIGRlZkRhdGEtPlNjYW5jaGFpbi5hZGRGbG9hdGluZ0luKCQzKTsKLSAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoJDIsICJPVVQiKSA9PSAwIHx8IHN0cmNtcCgkMiwgIm91dCIpID09IDApCi0gICAgICAgICAgICBkZWZEYXRhLT5TY2FuY2hhaW4uYWRkRmxvYXRpbmdPdXQoJDMpOwotICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCgkMiwgIkJJVFMiKSA9PSAwIHx8IHN0cmNtcCgkMiwgImJpdHMiKSA9PSAwKSB7Ci0gICAgICAgICAgICBkZWZEYXRhLT5iaXRzTnVtID0gYXRvaSgkMyk7Ci0gICAgICAgICAgICBkZWZEYXRhLT5TY2FuY2hhaW4uc2V0RmxvYXRpbmdCaXRzKGRlZkRhdGEtPmJpdHNOdW0pOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoc3RyY21wKCQ2LCAiSU4iKSA9PSAwIHx8IHN0cmNtcCgkNiwgImluIikgPT0gMCkKLSAgICAgICAgICAgIGRlZkRhdGEtPlNjYW5jaGFpbi5hZGRGbG9hdGluZ0luKCQ3KTsKLSAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoJDYsICJPVVQiKSA9PSAwIHx8IHN0cmNtcCgkNiwgIm91dCIpID09IDApCi0gICAgICAgICAgICBkZWZEYXRhLT5TY2FuY2hhaW4uYWRkRmxvYXRpbmdPdXQoJDcpOwotICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCgkNiwgIkJJVFMiKSA9PSAwIHx8IHN0cmNtcCgkNiwgImJpdHMiKSA9PSAwKSB7Ci0gICAgICAgICAgICBkZWZEYXRhLT5iaXRzTnVtID0gYXRvaSgkNyk7Ci0gICAgICAgICAgICBkZWZEYXRhLT5TY2FuY2hhaW4uc2V0RmxvYXRpbmdCaXRzKGRlZkRhdGEtPmJpdHNOdW0pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgfCAnKCcgVF9TVFJJTkcgIFRfU1RSSU5HICcpJyAnKCcgVF9TVFJJTkcgIFRfU1RSSU5HICcpJyAnKCcgVF9TVFJJTkcKLSAgICAgIFRfU1RSSU5HICcpJwotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5TY2FuY2hhaW5DYmspIHsKLSAgICAgICAgICBpZiAoc3RyY21wKCQyLCAiSU4iKSA9PSAwIHx8IHN0cmNtcCgkMiwgImluIikgPT0gMCkKLSAgICAgICAgICAgIGRlZkRhdGEtPlNjYW5jaGFpbi5hZGRGbG9hdGluZ0luKCQzKTsKLSAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoJDIsICJPVVQiKSA9PSAwIHx8IHN0cmNtcCgkMiwgIm91dCIpID09IDApCi0gICAgICAgICAgICBkZWZEYXRhLT5TY2FuY2hhaW4uYWRkRmxvYXRpbmdPdXQoJDMpOwotICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCgkMiwgIkJJVFMiKSA9PSAwIHx8IHN0cmNtcCgkMiwgImJpdHMiKSA9PSAwKSB7Ci0gICAgICAgICAgICBkZWZEYXRhLT5iaXRzTnVtID0gYXRvaSgkMyk7Ci0gICAgICAgICAgICBkZWZEYXRhLT5TY2FuY2hhaW4uc2V0RmxvYXRpbmdCaXRzKGRlZkRhdGEtPmJpdHNOdW0pOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoc3RyY21wKCQ2LCAiSU4iKSA9PSAwIHx8IHN0cmNtcCgkNiwgImluIikgPT0gMCkKLSAgICAgICAgICAgIGRlZkRhdGEtPlNjYW5jaGFpbi5hZGRGbG9hdGluZ0luKCQ3KTsKLSAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoJDYsICJPVVQiKSA9PSAwIHx8IHN0cmNtcCgkNiwgIm91dCIpID09IDApCi0gICAgICAgICAgICBkZWZEYXRhLT5TY2FuY2hhaW4uYWRkRmxvYXRpbmdPdXQoJDcpOwotICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCgkNiwgIkJJVFMiKSA9PSAwIHx8IHN0cmNtcCgkNiwgImJpdHMiKSA9PSAwKSB7Ci0gICAgICAgICAgICBkZWZEYXRhLT5iaXRzTnVtID0gYXRvaSgkNyk7Ci0gICAgICAgICAgICBkZWZEYXRhLT5TY2FuY2hhaW4uc2V0RmxvYXRpbmdCaXRzKGRlZkRhdGEtPmJpdHNOdW0pOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoc3RyY21wKCQxMCwgIklOIikgPT0gMCB8fCBzdHJjbXAoJDEwLCAiaW4iKSA9PSAwKQotICAgICAgICAgICAgZGVmRGF0YS0+U2NhbmNoYWluLmFkZEZsb2F0aW5nSW4oJDExKTsKLSAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoJDEwLCAiT1VUIikgPT0gMCB8fCBzdHJjbXAoJDEwLCAib3V0IikgPT0gMCkKLSAgICAgICAgICAgIGRlZkRhdGEtPlNjYW5jaGFpbi5hZGRGbG9hdGluZ091dCgkMTEpOwotICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCgkMTAsICJCSVRTIikgPT0gMCB8fCBzdHJjbXAoJDEwLCAiYml0cyIpID09IDApIHsKLSAgICAgICAgICAgIGRlZkRhdGEtPmJpdHNOdW0gPSBhdG9pKCQxMSk7Ci0gICAgICAgICAgICBkZWZEYXRhLT5TY2FuY2hhaW4uc2V0RmxvYXRpbmdCaXRzKGRlZkRhdGEtPmJpdHNOdW0pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIAotb3JkZXJlZF9pbnN0X2xpc3Q6IC8vIGVtcHR5IAotICAgICAgfCBvcmRlcmVkX2luc3RfbGlzdCBvbmVfb3JkZXJlZF9pbnN0Ci0gICAgICA7Ci0KLW9uZV9vcmRlcmVkX2luc3Q6IFRfU1RSSU5HCi0gICAgICB7IGRlZkRhdGEtPmR1bWJfbW9kZSA9IDEwMDA7IGRlZkRhdGEtPm5vX251bSA9IDEwMDA7IAotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5TY2FuY2hhaW5DYmspCi0gICAgICAgICAgZGVmRGF0YS0+U2NhbmNoYWluLmFkZE9yZGVyZWRJbnN0KCQxKTsKLSAgICAgIH0KLSAgICAgIG9yZGVyZWRfcGlucwotICAgICAgeyBkZWZEYXRhLT5kdW1iX21vZGUgPSAxOyBkZWZEYXRhLT5ub19udW0gPSAxOyB9Ci0KLW9yZGVyZWRfcGluczogLy8gZW1wdHkgIAotICAgICAgeyB9Ci0gICAgICB8ICcoJyBUX1NUUklORyAgVF9TVFJJTkcgJyknCi0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlNjYW5jaGFpbkNiaykgewotICAgICAgICAgIGlmIChzdHJjbXAoJDIsICJJTiIpID09IDAgfHwgc3RyY21wKCQyLCAiaW4iKSA9PSAwKQotICAgICAgICAgICAgZGVmRGF0YS0+U2NhbmNoYWluLmFkZE9yZGVyZWRJbigkMyk7Ci0gICAgICAgICAgZWxzZSBpZiAoc3RyY21wKCQyLCAiT1VUIikgPT0gMCB8fCBzdHJjbXAoJDIsICJvdXQiKSA9PSAwKQotICAgICAgICAgICAgZGVmRGF0YS0+U2NhbmNoYWluLmFkZE9yZGVyZWRPdXQoJDMpOwotICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCgkMiwgIkJJVFMiKSA9PSAwIHx8IHN0cmNtcCgkMiwgImJpdHMiKSA9PSAwKSB7Ci0gICAgICAgICAgICBkZWZEYXRhLT5iaXRzTnVtID0gYXRvaSgkMyk7Ci0gICAgICAgICAgICBkZWZEYXRhLT5TY2FuY2hhaW4uc2V0T3JkZXJlZEJpdHMoZGVmRGF0YS0+Yml0c051bSk7Ci0gICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHwgJygnIFRfU1RSSU5HICBUX1NUUklORyAnKScgJygnIFRfU1RSSU5HICBUX1NUUklORyAnKScKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U2NhbmNoYWluQ2JrKSB7Ci0gICAgICAgICAgaWYgKHN0cmNtcCgkMiwgIklOIikgPT0gMCB8fCBzdHJjbXAoJDIsICJpbiIpID09IDApCi0gICAgICAgICAgICBkZWZEYXRhLT5TY2FuY2hhaW4uYWRkT3JkZXJlZEluKCQzKTsKLSAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoJDIsICJPVVQiKSA9PSAwIHx8IHN0cmNtcCgkMiwgIm91dCIpID09IDApCi0gICAgICAgICAgICBkZWZEYXRhLT5TY2FuY2hhaW4uYWRkT3JkZXJlZE91dCgkMyk7Ci0gICAgICAgICAgZWxzZSBpZiAoc3RyY21wKCQyLCAiQklUUyIpID09IDAgfHwgc3RyY21wKCQyLCAiYml0cyIpID09IDApIHsKLSAgICAgICAgICAgIGRlZkRhdGEtPmJpdHNOdW0gPSBhdG9pKCQzKTsKLSAgICAgICAgICAgIGRlZkRhdGEtPlNjYW5jaGFpbi5zZXRPcmRlcmVkQml0cyhkZWZEYXRhLT5iaXRzTnVtKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHN0cmNtcCgkNiwgIklOIikgPT0gMCB8fCBzdHJjbXAoJDYsICJpbiIpID09IDApCi0gICAgICAgICAgICBkZWZEYXRhLT5TY2FuY2hhaW4uYWRkT3JkZXJlZEluKCQ3KTsKLSAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoJDYsICJPVVQiKSA9PSAwIHx8IHN0cmNtcCgkNiwgIm91dCIpID09IDApCi0gICAgICAgICAgICBkZWZEYXRhLT5TY2FuY2hhaW4uYWRkT3JkZXJlZE91dCgkNyk7Ci0gICAgICAgICAgZWxzZSBpZiAoc3RyY21wKCQ2LCAiQklUUyIpID09IDAgfHwgc3RyY21wKCQ2LCAiYml0cyIpID09IDApIHsKLSAgICAgICAgICAgIGRlZkRhdGEtPmJpdHNOdW0gPSBhdG9pKCQ3KTsKLSAgICAgICAgICAgIGRlZkRhdGEtPlNjYW5jaGFpbi5zZXRPcmRlcmVkQml0cyhkZWZEYXRhLT5iaXRzTnVtKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHwgJygnIFRfU1RSSU5HICBUX1NUUklORyAnKScgJygnIFRfU1RSSU5HICBUX1NUUklORyAnKScgJygnIFRfU1RSSU5HCi0gICAgICBUX1NUUklORyAnKScKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U2NhbmNoYWluQ2JrKSB7Ci0gICAgICAgICAgaWYgKHN0cmNtcCgkMiwgIklOIikgPT0gMCB8fCBzdHJjbXAoJDIsICJpbiIpID09IDApCi0gICAgICAgICAgICBkZWZEYXRhLT5TY2FuY2hhaW4uYWRkT3JkZXJlZEluKCQzKTsKLSAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoJDIsICJPVVQiKSA9PSAwIHx8IHN0cmNtcCgkMiwgIm91dCIpID09IDApCi0gICAgICAgICAgICBkZWZEYXRhLT5TY2FuY2hhaW4uYWRkT3JkZXJlZE91dCgkMyk7Ci0gICAgICAgICAgZWxzZSBpZiAoc3RyY21wKCQyLCAiQklUUyIpID09IDAgfHwgc3RyY21wKCQyLCAiYml0cyIpID09IDApIHsKLSAgICAgICAgICAgIGRlZkRhdGEtPmJpdHNOdW0gPSBhdG9pKCQzKTsKLSAgICAgICAgICAgIGRlZkRhdGEtPlNjYW5jaGFpbi5zZXRPcmRlcmVkQml0cyhkZWZEYXRhLT5iaXRzTnVtKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHN0cmNtcCgkNiwgIklOIikgPT0gMCB8fCBzdHJjbXAoJDYsICJpbiIpID09IDApCi0gICAgICAgICAgICBkZWZEYXRhLT5TY2FuY2hhaW4uYWRkT3JkZXJlZEluKCQ3KTsKLSAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoJDYsICJPVVQiKSA9PSAwIHx8IHN0cmNtcCgkNiwgIm91dCIpID09IDApCi0gICAgICAgICAgICBkZWZEYXRhLT5TY2FuY2hhaW4uYWRkT3JkZXJlZE91dCgkNyk7Ci0gICAgICAgICAgZWxzZSBpZiAoc3RyY21wKCQ2LCAiQklUUyIpID09IDAgfHwgc3RyY21wKCQ2LCAiYml0cyIpID09IDApIHsKLSAgICAgICAgICAgIGRlZkRhdGEtPmJpdHNOdW0gPSBhdG9pKCQ3KTsKLSAgICAgICAgICAgIGRlZkRhdGEtPlNjYW5jaGFpbi5zZXRPcmRlcmVkQml0cyhkZWZEYXRhLT5iaXRzTnVtKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHN0cmNtcCgkMTAsICJJTiIpID09IDAgfHwgc3RyY21wKCQxMCwgImluIikgPT0gMCkKLSAgICAgICAgICAgIGRlZkRhdGEtPlNjYW5jaGFpbi5hZGRPcmRlcmVkSW4oJDExKTsKLSAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoJDEwLCAiT1VUIikgPT0gMCB8fCBzdHJjbXAoJDEwLCAib3V0IikgPT0gMCkKLSAgICAgICAgICAgIGRlZkRhdGEtPlNjYW5jaGFpbi5hZGRPcmRlcmVkT3V0KCQxMSk7Ci0gICAgICAgICAgZWxzZSBpZiAoc3RyY21wKCQxMCwgIkJJVFMiKSA9PSAwIHx8IHN0cmNtcCgkMTAsICJiaXRzIikgPT0gMCkgewotICAgICAgICAgICAgZGVmRGF0YS0+Yml0c051bSA9IGF0b2koJDExKTsKLSAgICAgICAgICAgIGRlZkRhdGEtPlNjYW5jaGFpbi5zZXRPcmRlcmVkQml0cyhkZWZEYXRhLT5iaXRzTnVtKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAKLXBhcnRpdGlvbl9tYXhiaXRzOiAvLyBlbXB0eSAKLSAgICAgIHsgJCQgPSAtMTsgfQotICAgICAgfCBLX01BWEJJVFMgTlVNQkVSCi0gICAgICB7ICQkID0gUk9VTkQoJDIpOyB9Ci0gICAgCi1zY2FuY2hhaW5fZW5kOiBLX0VORCBLX1NDQU5DSEFJTlMKLSAgICAgIHsgCi0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlNjYW5jaGFpbnNFbmRDYmspCi0gICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5TY2FuY2hhaW5zRW5kQ2JrLCBkZWZyU2NhbmNoYWluc0VuZENia1R5cGUsIDApOwotICAgICAgICBkZWZEYXRhLT5iaXRfaXNfa2V5d29yZCA9IEZBTFNFOwotICAgICAgICBkZWZEYXRhLT5kdW1iX21vZGUgPSAwOyBkZWZEYXRhLT5ub19udW0gPSAwOwotICAgICAgfQotCi0vLyA4LzMxLzIwMDEgLSBUaGlzIGlzIG9ic29sZXRlIGluIDUuNCAKLWlvdGltaW5nX3NlY3Rpb246IGlvdGltaW5nX3N0YXJ0IGlvdGltaW5nX3J1bGVzIGlvdGltaW5nX2VuZAotICAgICAgOwotCi1pb3RpbWluZ19zdGFydDogS19JT1RJTUlOR1MgTlVNQkVSICc7JwotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuNCAmJiBkZWZEYXRhLT5jYWxsYmFja3MtPklPVGltaW5nc1N0YXJ0Q2JrKSB7Ci0gICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5JT1RpbWluZ3NTdGFydENiaywgZGVmcklPVGltaW5nc1N0YXJ0Q2JrVHlwZSwgUk9VTkQoJDIpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5JT1RpbWluZ3NTdGFydENiaykKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5pT1RpbWluZ1dhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+SU9UaW1pbmdXYXJuaW5ncykKLSAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmV2FybmluZyg3MDM1LCAiVGhlIElPVElNSU5HUyBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIERFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotaW90aW1pbmdfcnVsZXM6IC8vIGVtcHR5IAotICAgICAgfCBpb3RpbWluZ19ydWxlcyBpb3RpbWluZ19ydWxlCi0gICAgICB7IH0KLQotaW90aW1pbmdfcnVsZTogc3RhcnRfaW90aW1pbmcgaW90aW1pbmdfbWVtYmVycyAnOycgCi0gICAgICB7IAotICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuNCAmJiBkZWZEYXRhLT5jYWxsYmFja3MtPklPVGltaW5nQ2JrKQotICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+SU9UaW1pbmdDYmssIGRlZnJJT1RpbWluZ0Nia1R5cGUsICZkZWZEYXRhLT5JT1RpbWluZyk7Ci0gICAgICB9IAotCi1zdGFydF9pb3RpbWluZzogJy0nICcoJyB7ZGVmRGF0YS0+ZHVtYl9tb2RlID0gMjsgZGVmRGF0YS0+bm9fbnVtID0gMjsgfSBUX1NUUklORyBUX1NUUklORyAnKScKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+SU9UaW1pbmdDYmspCi0gICAgICAgICAgZGVmRGF0YS0+SU9UaW1pbmcuc2V0TmFtZSgkNCwgJDUpOwotICAgICAgfQotCi1pb3RpbWluZ19tZW1iZXJzOiAKLSAgICAgIHwgaW90aW1pbmdfbWVtYmVycyBpb3RpbWluZ19tZW1iZXIKLSAgICAgIDsKLQotaW90aW1pbmdfbWVtYmVyOgotICAgICAgJysnIHJpc2VmYWxsIEtfVkFSSUFCTEUgTlVNQkVSIE5VTUJFUgotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5JT1RpbWluZ0NiaykgCi0gICAgICAgICAgZGVmRGF0YS0+SU9UaW1pbmcuc2V0VmFyaWFibGUoJDIsICQ0LCAkNSk7Ci0gICAgICB9Ci0gICAgICB8ICcrJyByaXNlZmFsbCBLX1NMRVdSQVRFIE5VTUJFUiBOVU1CRVIKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+SU9UaW1pbmdDYmspIAotICAgICAgICAgIGRlZkRhdGEtPklPVGltaW5nLnNldFNsZXdSYXRlKCQyLCAkNCwgJDUpOwotICAgICAgfQotICAgICAgfCAnKycgS19DQVBBQ0lUQU5DRSBOVU1CRVIKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+SU9UaW1pbmdDYmspIAotICAgICAgICAgIGRlZkRhdGEtPklPVGltaW5nLnNldENhcGFjaXRhbmNlKCQzKTsKLSAgICAgIH0KLSAgICAgIHwgJysnIEtfRFJJVkVDRUxMIHtkZWZEYXRhLT5kdW1iX21vZGUgPSAxOyBkZWZEYXRhLT5ub19udW0gPSAxOyB9IFRfU1RSSU5HCi0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPklPVGltaW5nQ2JrKSAKLSAgICAgICAgICBkZWZEYXRhLT5JT1RpbWluZy5zZXREcml2ZUNlbGwoJDQpOwotICAgICAgfSBpb3RpbWluZ19kcml2ZWNlbGxfb3B0Ci0gICAgICAvLyB8ICcrJyBLX0ZST01QSU4gICB7ZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTsgZGVmRGF0YS0+bm9fbnVtID0gMTsgfSBUX1NUUklORwotCi0gICAgICAvLyB8ICcrJyBLX1BBUkFMTEVMIE5VTUJFUgotCi0gICAgICB8IGV4dGVuc2lvbl9zdG10Ci0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5WZXJzaW9uTnVtIDwgNS40ICYmIGRlZkRhdGEtPmNhbGxiYWNrcy0+SW9UaW1pbmdzRXh0Q2JrKQotICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+SW9UaW1pbmdzRXh0Q2JrLCBkZWZySW9UaW1pbmdzRXh0Q2JrVHlwZSwgJmRlZkRhdGEtPkhpc3RvcnlfdGV4dFswXSk7Ci0gICAgICB9Ci0KLWlvdGltaW5nX2RyaXZlY2VsbF9vcHQ6IGlvdGltaW5nX2Zyb21waW4KLSAgICAgIEtfVE9QSU4ge2RlZkRhdGEtPmR1bWJfbW9kZSA9IDE7IGRlZkRhdGEtPm5vX251bSA9IDE7IH0gVF9TVFJJTkcKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+SU9UaW1pbmdDYmspIAotICAgICAgICAgIGRlZkRhdGEtPklPVGltaW5nLnNldFRvKCQ0KTsKLSAgICAgIH0KLSAgICAgIGlvdGltaW5nX3BhcmFsbGVsCi0KLWlvdGltaW5nX2Zyb21waW46IC8vIGVtcHR5IAotICAgICAgfCBLX0ZST01QSU4ge2RlZkRhdGEtPmR1bWJfbW9kZSA9IDE7IGRlZkRhdGEtPm5vX251bSA9IDE7IH0gVF9TVFJJTkcKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+SU9UaW1pbmdDYmspCi0gICAgICAgICAgZGVmRGF0YS0+SU9UaW1pbmcuc2V0RnJvbSgkMyk7Ci0gICAgICB9Ci0KLWlvdGltaW5nX3BhcmFsbGVsOiAvLyBlbXB0eSAKLSAgICAgIHwgS19QQVJBTExFTCBOVU1CRVIKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+SU9UaW1pbmdDYmspCi0gICAgICAgICAgZGVmRGF0YS0+SU9UaW1pbmcuc2V0UGFyYWxsZWwoJDIpOwotICAgICAgfQotCi1yaXNlZmFsbDogS19SSVNFIHsgJCQgPSAoY2hhciopIlJJU0UiOyB9IHwgS19GQUxMIHsgJCQgPSAoY2hhciopIkZBTEwiOyB9Ci0KLWlvdGltaW5nX2VuZDogS19FTkQgS19JT1RJTUlOR1MKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjQgJiYgZGVmRGF0YS0+Y2FsbGJhY2tzLT5JT1RpbWluZ3NFbmRDYmspCi0gICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5JT1RpbWluZ3NFbmRDYmssIGRlZnJJT1RpbWluZ3NFbmRDYmtUeXBlLCAwKTsKLSAgICAgIH0KLQotZmxvb3JwbGFuX2NvbnRyYWludHNfc2VjdGlvbjogZnBfc3RhcnQgZnBfc3RtdHMgS19FTkQgS19GUEMKLSAgICAgIHsgCi0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkZQQ0VuZENiaykKLSAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPkZQQ0VuZENiaywgZGVmckZQQ0VuZENia1R5cGUsIDApOwotICAgICAgfQotCi1mcF9zdGFydDogS19GUEMgTlVNQkVSICc7JwotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5GUENTdGFydENiaykKLSAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPkZQQ1N0YXJ0Q2JrLCBkZWZyRlBDU3RhcnRDYmtUeXBlLCBST1VORCgkMikpOwotICAgICAgfQotCi1mcF9zdG10czogLy8gZW1wdHkgCi0gICAgICB8IGZwX3N0bXRzIGZwX3N0bXQKLSAgICAgIHt9Ci0KLWZwX3N0bXQ6ICctJyB7IGRlZkRhdGEtPmR1bWJfbW9kZSA9IDE7IGRlZkRhdGEtPm5vX251bSA9IDE7ICB9IFRfU1RSSU5HIGhfb3JfdgotICAgICAgeyBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5GUENDYmspIGRlZkRhdGEtPkZQQy5zZXROYW1lKCQzLCAkNCk7IH0KLSAgICAgIGNvbnN0cmFpbnRfdHlwZSBjb25zdHJhaW5fd2hhdF9saXN0ICc7JwotICAgICAgeyBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5GUENDYmspIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+RlBDQ2JrLCBkZWZyRlBDQ2JrVHlwZSwgJmRlZkRhdGEtPkZQQyk7IH0KLQotaF9vcl92OiBLX0hPUklaT05UQUwgCi0gICAgICB7ICQkID0gKGNoYXIqKSJIT1JJWk9OVEFMIjsgfQotICAgICAgfCBLX1ZFUlRJQ0FMCi0gICAgICB7ICQkID0gKGNoYXIqKSJWRVJUSUNBTCI7IH0KLQotY29uc3RyYWludF90eXBlOiBLX0FMSUdOCi0gICAgICB7IGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkZQQ0NiaykgZGVmRGF0YS0+RlBDLnNldEFsaWduKCk7IH0KLSAgICAgIHwgS19NQVggTlVNQkVSCi0gICAgICB7IGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkZQQ0NiaykgZGVmRGF0YS0+RlBDLnNldE1heCgkMik7IH0KLSAgICAgIHwgS19NSU4gTlVNQkVSCi0gICAgICB7IGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkZQQ0NiaykgZGVmRGF0YS0+RlBDLnNldE1pbigkMik7IH0KLSAgICAgIHwgS19FUVVBTCBOVU1CRVIKLSAgICAgIHsgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+RlBDQ2JrKSBkZWZEYXRhLT5GUEMuc2V0RXF1YWwoJDIpOyB9Ci0KLWNvbnN0cmFpbl93aGF0X2xpc3Q6IC8vIGVtcHR5IAotICAgICAgfCBjb25zdHJhaW5fd2hhdF9saXN0IGNvbnN0cmFpbl93aGF0Ci0gICAgICA7Ci0KLWNvbnN0cmFpbl93aGF0OiAnKycgS19CT1RUT01MRUZUCi0gICAgICB7IGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkZQQ0NiaykgZGVmRGF0YS0+RlBDLnNldERvaW5nQm90dG9tTGVmdCgpOyB9Ci0gICAgICByb3dfb3JfY29tcF9saXN0IAotICAgICAgfCAgICAgICAnKycgS19UT1BSSUdIVAotICAgICAgeyBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5GUENDYmspIGRlZkRhdGEtPkZQQy5zZXREb2luZ1RvcFJpZ2h0KCk7IH0KLSAgICAgIHJvd19vcl9jb21wX2xpc3QgCi0gICAgICA7Ci0KLXJvd19vcl9jb21wX2xpc3Q6IC8vIGVtcHR5IAotICAgICAgfCByb3dfb3JfY29tcF9saXN0IHJvd19vcl9jb21wCi0KLXJvd19vcl9jb21wOiAnKCcgS19ST1dTICB7ZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTsgZGVmRGF0YS0+bm9fbnVtID0gMTsgfSBUX1NUUklORyAnKScKLSAgICAgIHsgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+RlBDQ2JrKSBkZWZEYXRhLT5GUEMuYWRkUm93KCQ0KTsgfQotICAgICAgfCAgICAnKCcgS19DT01QUyB7ZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTsgZGVmRGF0YS0+bm9fbnVtID0gMTsgfSBUX1NUUklORyAnKScKLSAgICAgIHsgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+RlBDQ2JrKSBkZWZEYXRhLT5GUEMuYWRkQ29tcHMoJDQpOyB9Ci0KLXRpbWluZ2Rpc2FibGVzX3NlY3Rpb246IHRpbWluZ2Rpc2FibGVzX3N0YXJ0IHRpbWluZ2Rpc2FibGVzX3J1bGVzCi0gICAgICB0aW1pbmdkaXNhYmxlc19lbmQKLSAgICAgIDsKLQotdGltaW5nZGlzYWJsZXNfc3RhcnQ6IEtfVElNSU5HRElTQUJMRVMgTlVNQkVSICc7JwotICAgICAgeyAKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+VGltaW5nRGlzYWJsZXNTdGFydENiaykKLSAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPlRpbWluZ0Rpc2FibGVzU3RhcnRDYmssIGRlZnJUaW1pbmdEaXNhYmxlc1N0YXJ0Q2JrVHlwZSwKLSAgICAgICAgICAgICAgICAgICBST1VORCgkMikpOwotICAgICAgfQotCi10aW1pbmdkaXNhYmxlc19ydWxlczogLy8gZW1wdHkgCi0gICAgICB8IHRpbWluZ2Rpc2FibGVzX3J1bGVzIHRpbWluZ2Rpc2FibGVzX3J1bGUKLSAgICAgIHt9Ci0KLXRpbWluZ2Rpc2FibGVzX3J1bGU6ICctJyBLX0ZST01QSU4geyBkZWZEYXRhLT5kdW1iX21vZGUgPSAyOyBkZWZEYXRhLT5ub19udW0gPSAyOyAgfSBUX1NUUklORwotICAgICAgVF9TVFJJTkcgS19UT1BJTiB7IGRlZkRhdGEtPmR1bWJfbW9kZSA9IDI7IGRlZkRhdGEtPm5vX251bSA9IDI7ICB9IFRfU1RSSU5HIFRfU1RSSU5HICc7JwotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5UaW1pbmdEaXNhYmxlQ2JrKSB7Ci0gICAgICAgICAgZGVmRGF0YS0+VGltaW5nRGlzYWJsZS5zZXRGcm9tVG8oJDQsICQ1LCAkOCwgJDkpOwotICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+VGltaW5nRGlzYWJsZUNiaywgZGVmclRpbWluZ0Rpc2FibGVDYmtUeXBlLAotICAgICAgICAgICAgICAgICZkZWZEYXRhLT5UaW1pbmdEaXNhYmxlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgfCAnLScgS19USFJVUElOIHtkZWZEYXRhLT5kdW1iX21vZGUgPSAyOyBkZWZEYXRhLT5ub19udW0gPSAyOyB9IFRfU1RSSU5HIFRfU1RSSU5HICc7JwotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5UaW1pbmdEaXNhYmxlQ2JrKSB7Ci0gICAgICAgICAgZGVmRGF0YS0+VGltaW5nRGlzYWJsZS5zZXRUaHJ1KCQ0LCAkNSk7Ci0gICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5UaW1pbmdEaXNhYmxlQ2JrLCBkZWZyVGltaW5nRGlzYWJsZUNia1R5cGUsCi0gICAgICAgICAgICAgICAgICAgJmRlZkRhdGEtPlRpbWluZ0Rpc2FibGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB8ICctJyBLX01BQ1JPIHtkZWZEYXRhLT5kdW1iX21vZGUgPSAxOyBkZWZEYXRhLT5ub19udW0gPSAxO30gVF9TVFJJTkcgdGRfbWFjcm9fb3B0aW9uICc7JwotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5UaW1pbmdEaXNhYmxlQ2JrKSB7Ci0gICAgICAgICAgZGVmRGF0YS0+VGltaW5nRGlzYWJsZS5zZXRNYWNybygkNCk7Ci0gICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5UaW1pbmdEaXNhYmxlQ2JrLCBkZWZyVGltaW5nRGlzYWJsZUNia1R5cGUsCi0gICAgICAgICAgICAgICAgJmRlZkRhdGEtPlRpbWluZ0Rpc2FibGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB8ICctJyBLX1JFRU5UUkFOVFBBVEhTICc7JwotICAgICAgeyBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5UaW1pbmdEaXNhYmxlQ2JrKQotICAgICAgICAgIGRlZkRhdGEtPlRpbWluZ0Rpc2FibGUuc2V0UmVlbnRyYW50UGF0aHNGbGFnKCk7Ci0gICAgICB9Ci0KLQotdGRfbWFjcm9fb3B0aW9uOiBLX0ZST01QSU4ge2RlZkRhdGEtPmR1bWJfbW9kZSA9IDE7IGRlZkRhdGEtPm5vX251bSA9IDE7fSBUX1NUUklORyBLX1RPUElOCi0gICAgICB7ZGVmRGF0YS0+ZHVtYl9tb2RlPTE7IGRlZkRhdGEtPm5vX251bSA9IDE7fSBUX1NUUklORwotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5UaW1pbmdEaXNhYmxlQ2JrKQotICAgICAgICAgIGRlZkRhdGEtPlRpbWluZ0Rpc2FibGUuc2V0TWFjcm9Gcm9tVG8oJDMsJDYpOwotICAgICAgfQotICAgICAgfCAgICAgICAgS19USFJVUElOIHtkZWZEYXRhLT5kdW1iX21vZGU9MTsgZGVmRGF0YS0+bm9fbnVtID0gMTt9IFRfU1RSSU5HCi0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlRpbWluZ0Rpc2FibGVDYmspCi0gICAgICAgICAgZGVmRGF0YS0+VGltaW5nRGlzYWJsZS5zZXRNYWNyb1RocnUoJDMpOwotICAgICAgfQotCi10aW1pbmdkaXNhYmxlc19lbmQ6IEtfRU5EIEtfVElNSU5HRElTQUJMRVMKLSAgICAgIHsgCi0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlRpbWluZ0Rpc2FibGVzRW5kQ2JrKQotICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+VGltaW5nRGlzYWJsZXNFbmRDYmssIGRlZnJUaW1pbmdEaXNhYmxlc0VuZENia1R5cGUsIDApOwotICAgICAgfQotCi0KLXBhcnRpdGlvbnNfc2VjdGlvbjogcGFydGl0aW9uc19zdGFydCBwYXJ0aXRpb25fcnVsZXMgcGFydGl0aW9uc19lbmQKLSAgICAgIDsKLQotcGFydGl0aW9uc19zdGFydDogS19QQVJUSVRJT05TIE5VTUJFUiAnOycKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UGFydGl0aW9uc1N0YXJ0Q2JrKQotICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+UGFydGl0aW9uc1N0YXJ0Q2JrLCBkZWZyUGFydGl0aW9uc1N0YXJ0Q2JrVHlwZSwKLSAgICAgICAgICAgICAgICAgICBST1VORCgkMikpOwotICAgICAgfQotCi1wYXJ0aXRpb25fcnVsZXM6IC8vIGVtcHR5IAotICAgICAgfCBwYXJ0aXRpb25fcnVsZXMgcGFydGl0aW9uX3J1bGUKLSAgICAgIHsgfQotCi1wYXJ0aXRpb25fcnVsZTogc3RhcnRfcGFydGl0aW9uIHBhcnRpdGlvbl9tZW1iZXJzICc7JyAKLSAgICAgIHsgCi0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBhcnRpdGlvbkNiaykKLSAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPlBhcnRpdGlvbkNiaywgZGVmclBhcnRpdGlvbkNia1R5cGUsICZkZWZEYXRhLT5QYXJ0aXRpb24pOwotICAgICAgfQotCi1zdGFydF9wYXJ0aXRpb246ICctJyB7IGRlZkRhdGEtPmR1bWJfbW9kZSA9IDE7IGRlZkRhdGEtPm5vX251bSA9IDE7IH0gVF9TVFJJTkcgdHVybm9mZgotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5QYXJ0aXRpb25DYmspCi0gICAgICAgICAgZGVmRGF0YS0+UGFydGl0aW9uLnNldE5hbWUoJDMpOwotICAgICAgfQotCi10dXJub2ZmOiAvLyBlbXB0eSAKLSAgICAgIHwgS19UVVJOT0ZGIHR1cm5vZmZfc2V0dXAgdHVybm9mZl9ob2xkCi0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBhcnRpdGlvbkNiaykKLSAgICAgICAgICBkZWZEYXRhLT5QYXJ0aXRpb24uYWRkVHVybk9mZigkMiwgJDMpOwotICAgICAgfQotCi10dXJub2ZmX3NldHVwOiAvLyBlbXB0eSAKLSAgICAgIHsgJCQgPSAoY2hhciopIiAiOyB9Ci0gICAgICB8IEtfU0VUVVBSSVNFCi0gICAgICB7ICQkID0gKGNoYXIqKSJSIjsgfQotICAgICAgfCBLX1NFVFVQRkFMTAotICAgICAgeyAkJCA9IChjaGFyKikiRiI7IH0KLQotdHVybm9mZl9ob2xkOiAvLyBlbXB0eSAKLSAgICAgIHsgJCQgPSAoY2hhciopIiAiOyB9Ci0gICAgICB8IEtfSE9MRFJJU0UKLSAgICAgIHsgJCQgPSAoY2hhciopIlIiOyB9Ci0gICAgICB8IEtfSE9MREZBTEwKLSAgICAgIHsgJCQgPSAoY2hhciopIkYiOyB9Ci0KLXBhcnRpdGlvbl9tZW1iZXJzOiAvLyBlbXB0eSAKLSAgICAgIHwgcGFydGl0aW9uX21lbWJlcnMgcGFydGl0aW9uX21lbWJlcgotICAgICAgOwotCi1wYXJ0aXRpb25fbWVtYmVyOiAnKycgS19GUk9NQ0xPQ0tQSU4ge2RlZkRhdGEtPmR1bWJfbW9kZT0yOyBkZWZEYXRhLT5ub19udW0gPSAyO30KLSAgICAgIFRfU1RSSU5HIFRfU1RSSU5HIHJpc2VmYWxsIG1pbm1heHBpbnMKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UGFydGl0aW9uQ2JrKQotICAgICAgICAgIGRlZkRhdGEtPlBhcnRpdGlvbi5zZXRGcm9tQ2xvY2tQaW4oJDQsICQ1KTsKLSAgICAgIH0KLSAgICAgIHwgJysnIEtfRlJPTUNPTVBQSU4ge2RlZkRhdGEtPmR1bWJfbW9kZT0yOyBkZWZEYXRhLT5ub19udW0gPSAyOyB9Ci0gICAgICBUX1NUUklORyBUX1NUUklORyByaXNlZmFsbG1pbm1heDJfbGlzdAotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5QYXJ0aXRpb25DYmspCi0gICAgICAgICAgZGVmRGF0YS0+UGFydGl0aW9uLnNldEZyb21Db21wUGluKCQ0LCAkNSk7Ci0gICAgICB9Ci0gICAgICB8ICcrJyBLX0ZST01JT1BJTiB7ZGVmRGF0YS0+ZHVtYl9tb2RlPTE7IGRlZkRhdGEtPm5vX251bSA9IDE7IH0gVF9TVFJJTkcKLSAgICAgIHJpc2VmYWxsbWlubWF4MV9saXN0Ci0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBhcnRpdGlvbkNiaykKLSAgICAgICAgICBkZWZEYXRhLT5QYXJ0aXRpb24uc2V0RnJvbUlPUGluKCQ0KTsKLSAgICAgIH0KLSAgICAgIHwgJysnIEtfVE9DTE9DS1BJTiB7ZGVmRGF0YS0+ZHVtYl9tb2RlPTI7IGRlZkRhdGEtPm5vX251bSA9IDI7IH0KLSAgICAgIFRfU1RSSU5HIFRfU1RSSU5HIHJpc2VmYWxsIG1pbm1heHBpbnMKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UGFydGl0aW9uQ2JrKQotICAgICAgICAgIGRlZkRhdGEtPlBhcnRpdGlvbi5zZXRUb0Nsb2NrUGluKCQ0LCAkNSk7Ci0gICAgICB9Ci0gICAgICB8ICcrJyBLX1RPQ09NUFBJTiB7ZGVmRGF0YS0+ZHVtYl9tb2RlPTI7IGRlZkRhdGEtPm5vX251bSA9IDI7IH0KLSAgICAgIFRfU1RSSU5HIFRfU1RSSU5HIHJpc2VmYWxsbWlubWF4Ml9saXN0Ci0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBhcnRpdGlvbkNiaykKLSAgICAgICAgICBkZWZEYXRhLT5QYXJ0aXRpb24uc2V0VG9Db21wUGluKCQ0LCAkNSk7Ci0gICAgICB9Ci0gICAgICB8ICcrJyBLX1RPSU9QSU4ge2RlZkRhdGEtPmR1bWJfbW9kZT0xOyBkZWZEYXRhLT5ub19udW0gPSAyOyB9IFRfU1RSSU5HIHJpc2VmYWxsbWlubWF4MV9saXN0Ci0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBhcnRpdGlvbkNiaykKLSAgICAgICAgICBkZWZEYXRhLT5QYXJ0aXRpb24uc2V0VG9JT1BpbigkNCk7Ci0gICAgICB9Ci0gICAgICB8IGV4dGVuc2lvbl9zdG10Ci0gICAgICB7IAotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5QYXJ0aXRpb25zRXh0Q2JrKQotICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+UGFydGl0aW9uc0V4dENiaywgZGVmclBhcnRpdGlvbnNFeHRDYmtUeXBlLAotICAgICAgICAgICAgICAgICAgICZkZWZEYXRhLT5IaXN0b3J5X3RleHRbMF0pOwotICAgICAgfQotCi1taW5tYXhwaW5zOiBtaW5fb3JfbWF4X2xpc3QgS19QSU5TCi0gICAgICB7IGRlZkRhdGEtPmR1bWJfbW9kZSA9IERFRl9NQVhfSU5UOyBkZWZEYXRhLT5ub19udW0gPSBERUZfTUFYX0lOVDsgfSBwaW5fbGlzdAotICAgICAgeyBkZWZEYXRhLT5kdW1iX21vZGUgPSAwOyBkZWZEYXRhLT5ub19udW0gPSAwOyB9Ci0KLW1pbl9vcl9tYXhfbGlzdDogLy8gZW1wdHkgCi0gICAgICB8IG1pbl9vcl9tYXhfbGlzdCBtaW5fb3JfbWF4X21lbWJlcgotICAgICAgeyB9Ci0KLW1pbl9vcl9tYXhfbWVtYmVyOiBLX01JTiBOVU1CRVIgTlVNQkVSCi0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBhcnRpdGlvbkNiaykKLSAgICAgICAgICBkZWZEYXRhLT5QYXJ0aXRpb24uc2V0TWluKCQyLCAkMyk7Ci0gICAgICB9Ci0gICAgICB8IEtfTUFYIE5VTUJFUiBOVU1CRVIKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UGFydGl0aW9uQ2JrKQotICAgICAgICAgIGRlZkRhdGEtPlBhcnRpdGlvbi5zZXRNYXgoJDIsICQzKTsKLSAgICAgIH0KLQotcGluX2xpc3Q6IC8vIGVtcHR5IAotICAgICAgfCBwaW5fbGlzdCBUX1NUUklORwotICAgICAgeyBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5QYXJ0aXRpb25DYmspIGRlZkRhdGEtPlBhcnRpdGlvbi5hZGRQaW4oJDIpOyB9Ci0KLXJpc2VmYWxsbWlubWF4MV9saXN0OiAvLyBlbXB0eSAKLSAgICAgIHwgcmlzZWZhbGxtaW5tYXgxX2xpc3QgcmlzZWZhbGxtaW5tYXgxCi0KLXJpc2VmYWxsbWlubWF4MTogS19SSVNFTUlOIE5VTUJFUgotICAgICAgeyBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5QYXJ0aXRpb25DYmspIGRlZkRhdGEtPlBhcnRpdGlvbi5hZGRSaXNlTWluKCQyKTsgfQotICAgICAgfCBLX0ZBTExNSU4gTlVNQkVSCi0gICAgICB7IGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBhcnRpdGlvbkNiaykgZGVmRGF0YS0+UGFydGl0aW9uLmFkZEZhbGxNaW4oJDIpOyB9Ci0gICAgICB8IEtfUklTRU1BWCBOVU1CRVIKLSAgICAgIHsgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UGFydGl0aW9uQ2JrKSBkZWZEYXRhLT5QYXJ0aXRpb24uYWRkUmlzZU1heCgkMik7IH0KLSAgICAgIHwgS19GQUxMTUFYIE5VTUJFUgotICAgICAgeyBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5QYXJ0aXRpb25DYmspIGRlZkRhdGEtPlBhcnRpdGlvbi5hZGRGYWxsTWF4KCQyKTsgfQotCi1yaXNlZmFsbG1pbm1heDJfbGlzdDoKLSAgICAgIHJpc2VmYWxsbWlubWF4MgotICAgICAgfCByaXNlZmFsbG1pbm1heDJfbGlzdCByaXNlZmFsbG1pbm1heDIKLSAgICAgIDsKLQotcmlzZWZhbGxtaW5tYXgyOiBLX1JJU0VNSU4gTlVNQkVSIE5VTUJFUgotICAgICAgeyBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5QYXJ0aXRpb25DYmspCi0gICAgICAgICAgZGVmRGF0YS0+UGFydGl0aW9uLmFkZFJpc2VNaW5SYW5nZSgkMiwgJDMpOyB9Ci0gICAgICB8IEtfRkFMTE1JTiBOVU1CRVIgTlVNQkVSCi0gICAgICB7IGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBhcnRpdGlvbkNiaykKLSAgICAgICAgICBkZWZEYXRhLT5QYXJ0aXRpb24uYWRkRmFsbE1pblJhbmdlKCQyLCAkMyk7IH0KLSAgICAgIHwgS19SSVNFTUFYIE5VTUJFUiBOVU1CRVIKLSAgICAgIHsgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UGFydGl0aW9uQ2JrKQotICAgICAgICAgIGRlZkRhdGEtPlBhcnRpdGlvbi5hZGRSaXNlTWF4UmFuZ2UoJDIsICQzKTsgfQotICAgICAgfCBLX0ZBTExNQVggTlVNQkVSIE5VTUJFUgotICAgICAgeyBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5QYXJ0aXRpb25DYmspCi0gICAgICAgICAgZGVmRGF0YS0+UGFydGl0aW9uLmFkZEZhbGxNYXhSYW5nZSgkMiwgJDMpOyB9Ci0KLXBhcnRpdGlvbnNfZW5kOiBLX0VORCBLX1BBUlRJVElPTlMKLSAgICAgIHsgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UGFydGl0aW9uc0VuZENiaykKLSAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPlBhcnRpdGlvbnNFbmRDYmssIGRlZnJQYXJ0aXRpb25zRW5kQ2JrVHlwZSwgMCk7IH0KLQotY29tcF9uYW1lczogLy8gZW1wdHkgCi0gICAgICB8IGNvbXBfbmFtZXMgY29tcF9uYW1lCi0gICAgICB7IH0KLQotY29tcF9uYW1lOiAnKCcge2RlZkRhdGEtPmR1bWJfbW9kZT0yOyBkZWZEYXRhLT5ub19udW0gPSAyOyB9IFRfU1RSSU5HCi0gICAgICBUX1NUUklORyBzdWJuZXRfb3B0X3N5biAnKScKLSAgICAgIHsKLSAgICAgICAgLy8gbm90ZSB0aGF0IHRoZSBkZWZEYXRhLT5maXJzdCBUX1NUUklORyBjb3VsZCBiZSB0aGUga2V5d29yZCBWUElOIAotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5OZXRDYmspCi0gICAgICAgICAgZGVmRGF0YS0+U3VibmV0LT5hZGRQaW4oJDMsICQ0LCAkNSk7Ci0gICAgICB9Ci0KLXN1Ym5ldF9vcHRfc3luOiAvLyBlbXB0eSAKLSAgICAgIHsgJCQgPSAwOyB9Ci0gICAgICB8ICcrJyBLX1NZTlRIRVNJWkVECi0gICAgICB7ICQkID0gMTsgfQotCi1zdWJuZXRfb3B0aW9uczogLy8gZW1wdHkgCi0gICAgICB8IHN1Ym5ldF9vcHRpb25zIHN1Ym5ldF9vcHRpb24KLQotc3VibmV0X29wdGlvbjogc3VibmV0X3R5cGUKLSAgICAgIHsgIAotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5OZXRDYmspIGRlZkRhdGEtPlN1Ym5ldC0+YWRkV2lyZSgkMSk7Ci0gICAgICB9Ci0gICAgICBwYXRocwotICAgICAgeyAgCi0gICAgICAgIGRlZkRhdGEtPmJ5X2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgZGVmRGF0YS0+ZG9faXNfa2V5d29yZCA9IEZBTFNFOwotICAgICAgICBkZWZEYXRhLT5uZXdfaXNfa2V5d29yZCA9IEZBTFNFOwotICAgICAgICBkZWZEYXRhLT5zdGVwX2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgZGVmRGF0YS0+b3JpZW50X2lzX2tleXdvcmQgPSBGQUxTRTsKLSAgICAgICAgZGVmRGF0YS0+bmVlZE5QQ2JrID0gMDsKLSAgICAgIH0KLSAgICAgIHwgS19OT05ERUZBVUxUUlVMRSB7IGRlZkRhdGEtPmR1bWJfbW9kZSA9IDE7IGRlZkRhdGEtPm5vX251bSA9IDE7IH0gVF9TVFJJTkcKLSAgICAgIHsgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+TmV0Q2JrKSBkZWZEYXRhLT5TdWJuZXQtPnNldE5vbkRlZmF1bHQoJDMpOyB9Ci0KLXN1Ym5ldF90eXBlOiBLX0ZJWEVECi0gICAgICB7ICQkID0gKGNoYXIqKSJGSVhFRCI7IGRlZkRhdGEtPmR1bWJfbW9kZSA9IDE7IH0KLSAgICAgIHwgS19DT1ZFUgotICAgICAgeyAkJCA9IChjaGFyKikiQ09WRVIiOyBkZWZEYXRhLT5kdW1iX21vZGUgPSAxOyB9Ci0gICAgICB8IEtfUk9VVEVECi0gICAgICB7ICQkID0gKGNoYXIqKSJST1VURUQiOyBkZWZEYXRhLT5kdW1iX21vZGUgPSAxOyB9Ci0gICAgICB8IEtfTk9TSElFTEQKLSAgICAgIHsgJCQgPSAoY2hhciopIk5PU0hJRUxEIjsgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTsgfQotCi1waW5fcHJvcHNfc2VjdGlvbjogYmVnaW5fcGluX3Byb3BzIHBpbl9wcm9wX2xpc3QgZW5kX3Bpbl9wcm9wcyA7Ci0KLWJlZ2luX3Bpbl9wcm9wczogS19QSU5QUk9QRVJUSUVTIE5VTUJFUiBvcHRfc2VtaQotICAgICAgeyBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5QaW5Qcm9wU3RhcnRDYmspCi0gICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5QaW5Qcm9wU3RhcnRDYmssIGRlZnJQaW5Qcm9wU3RhcnRDYmtUeXBlLCBST1VORCgkMikpOyB9Ci0KLW9wdF9zZW1pOgotICAgICAgLy8gZW1wdHkgCi0gICAgICB7IH0KLSAgICAgIHwgJzsnCi0gICAgICB7IH0KLQotZW5kX3Bpbl9wcm9wczogS19FTkQgS19QSU5QUk9QRVJUSUVTCi0gICAgICB7IGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBpblByb3BFbmRDYmspCi0gICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5QaW5Qcm9wRW5kQ2JrLCBkZWZyUGluUHJvcEVuZENia1R5cGUsIDApOyB9Ci0KLXBpbl9wcm9wX2xpc3Q6IC8vIGVtcHR5IAotICAgICAgfCBwaW5fcHJvcF9saXN0IHBpbl9wcm9wX3Rlcm1pbmFsCi0gICAgICA7Ci0KLXBpbl9wcm9wX3Rlcm1pbmFsOiAnLScgeyBkZWZEYXRhLT5kdW1iX21vZGUgPSAyOyBkZWZEYXRhLT5ub19udW0gPSAyOyB9IFRfU1RSSU5HIFRfU1RSSU5HCi0gICAgICB7IGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBpblByb3BDYmspIGRlZkRhdGEtPlBpblByb3Auc2V0TmFtZSgkMywgJDQpOyB9Ci0gICAgICBwaW5fcHJvcF9vcHRpb25zICc7JwotICAgICAgeyBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5QaW5Qcm9wQ2JrKSB7Ci0gICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5QaW5Qcm9wQ2JrLCBkZWZyUGluUHJvcENia1R5cGUsICZkZWZEYXRhLT5QaW5Qcm9wKTsKLSAgICAgICAgIC8vIHJlc2V0IHRoZSBwcm9wZXJ0eSBudW1iZXIKLSAgICAgICAgIGRlZkRhdGEtPlBpblByb3AuY2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgfQotCi1waW5fcHJvcF9vcHRpb25zIDogLy8gZW1wdHkgCi0gICAgICB8IHBpbl9wcm9wX29wdGlvbnMgcGluX3Byb3AgOwotCi1waW5fcHJvcDogJysnIEtfUFJPUEVSVFkgeyBkZWZEYXRhLT5kdW1iX21vZGUgPSBERUZfTUFYX0lOVDsgfQotICAgICAgcGluX3Byb3BfbmFtZV92YWx1ZV9saXN0IAotICAgICAgeyBkZWZEYXRhLT5kdW1iX21vZGUgPSAwOyB9Ci0KLXBpbl9wcm9wX25hbWVfdmFsdWVfbGlzdCA6IC8vIGVtcHR5IAotICAgICAgfCBwaW5fcHJvcF9uYW1lX3ZhbHVlX2xpc3QgcGluX3Byb3BfbmFtZV92YWx1ZQotICAgICAgOwotCi1waW5fcHJvcF9uYW1lX3ZhbHVlIDogVF9TVFJJTkcgTlVNQkVSCi0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlBpblByb3BDYmspIHsKLSAgICAgICAgICBjaGFyIHByb3BUcDsKLSAgICAgICAgICBjaGFyKiBzdHIgPSBkZWZEYXRhLT5yaW5nQ29weSgiICAgICAgICAgICAgICAgICAgICAgICAiKTsKLSAgICAgICAgICBwcm9wVHAgPSBkZWZEYXRhLT5zZXNzaW9uLT5Db21wUGluUHJvcC5wcm9wVHlwZSgkMSk7Ci0gICAgICAgICAgQ0hLUFJPUFRZUEUocHJvcFRwLCAkMSwgIlBJTlBST1BFUlRJRVMiKTsKLSAgICAgICAgICBzcHJpbnRmKHN0ciwgIiVnIiwgJDIpOwotICAgICAgICAgIGRlZkRhdGEtPlBpblByb3AuYWRkTnVtUHJvcGVydHkoJDEsICQyLCBzdHIsIHByb3BUcCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSB8IFRfU1RSSU5HIFFTVFJJTkcKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+UGluUHJvcENiaykgewotICAgICAgICAgIGNoYXIgcHJvcFRwOwotICAgICAgICAgIHByb3BUcCA9IGRlZkRhdGEtPnNlc3Npb24tPkNvbXBQaW5Qcm9wLnByb3BUeXBlKCQxKTsKLSAgICAgICAgICBDSEtQUk9QVFlQRShwcm9wVHAsICQxLCAiUElOUFJPUEVSVElFUyIpOwotICAgICAgICAgIGRlZkRhdGEtPlBpblByb3AuYWRkUHJvcGVydHkoJDEsICQyLCBwcm9wVHApOwotICAgICAgICB9Ci0gICAgICB9Ci0gfCBUX1NUUklORyBUX1NUUklORwotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5QaW5Qcm9wQ2JrKSB7Ci0gICAgICAgICAgY2hhciBwcm9wVHA7Ci0gICAgICAgICAgcHJvcFRwID0gZGVmRGF0YS0+c2Vzc2lvbi0+Q29tcFBpblByb3AucHJvcFR5cGUoJDEpOwotICAgICAgICAgIENIS1BST1BUWVBFKHByb3BUcCwgJDEsICJQSU5QUk9QRVJUSUVTIik7Ci0gICAgICAgICAgZGVmRGF0YS0+UGluUHJvcC5hZGRQcm9wZXJ0eSgkMSwgJDIsIHByb3BUcCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotYmxvY2thZ2Vfc2VjdGlvbjogYmxvY2thZ2Vfc3RhcnQgYmxvY2thZ2VfZGVmcyBibG9ja2FnZV9lbmQgOwotCi1ibG9ja2FnZV9zdGFydDogS19CTE9DS0FHRVMgTlVNQkVSICc7JwotICAgICAgeyBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5CbG9ja2FnZVN0YXJ0Q2JrKQotICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+QmxvY2thZ2VTdGFydENiaywgZGVmckJsb2NrYWdlU3RhcnRDYmtUeXBlLCBST1VORCgkMikpOyB9Ci0KLWJsb2NrYWdlX2VuZDogS19FTkQgS19CTE9DS0FHRVMKLSAgICAgIHsgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+QmxvY2thZ2VFbmRDYmspCi0gICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5CbG9ja2FnZUVuZENiaywgZGVmckJsb2NrYWdlRW5kQ2JrVHlwZSwgMCk7IH0KLQotYmxvY2thZ2VfZGVmczogLy8gZW1wdHkgCi0gICAgICB8IGJsb2NrYWdlX2RlZnMgYmxvY2thZ2VfZGVmCi0gICAgICA7Ci0KLWJsb2NrYWdlX2RlZjogYmxvY2thZ2VfcnVsZSByZWN0UG9seV9ibG9ja2FnZSByZWN0UG9seV9ibG9ja2FnZV9ydWxlcwotICAgICAgJzsnCi0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkJsb2NrYWdlQ2JrKSB7Ci0gICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5CbG9ja2FnZUNiaywgZGVmckJsb2NrYWdlQ2JrVHlwZSwgJmRlZkRhdGEtPkJsb2NrYWdlKTsKLSAgICAgICAgICBkZWZEYXRhLT5CbG9ja2FnZS5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLWJsb2NrYWdlX3J1bGU6ICctJyBLX0xBWUVSIHsgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTsgZGVmRGF0YS0+bm9fbnVtID0gMTsgfSBUX1NUUklORyAKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+QmxvY2thZ2VDYmspIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+QmxvY2thZ2UuaGFzUGxhY2VtZW50KCkgIT0gMCkgewotICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmJsb2NrYWdlV2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5CbG9ja2FnZVdhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGRlZkRhdGEtPmRlZkVycm9yKDY1MzksICJJbnZhbGlkIEJMT0NLQUdFIHN0YXRlbWVudCBkZWZpbmVkIGluIHRoZSBERUYgZmlsZS4gVGhlIEJMT0NLQUdFIHN0YXRtZW50IGhhcyBib3RoIHRoZSBMQVlFUiBhbmQgdGhlIFBMQUNFTUVOVCBzdGF0ZW1lbnRzIGRlZmluZWQuXG5VcGRhdGUgeW91ciBERUYgZmlsZSB0byBoYXZlIGVpdGhlciBCTE9DS0FHRSBvciBQTEFDRU1FTlQgc3RhdGVtZW50IG9ubHkuIik7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBkZWZEYXRhLT5CbG9ja2FnZS5zZXRMYXllcigkNCk7Ci0gICAgICAgICAgZGVmRGF0YS0+QmxvY2thZ2UuY2xlYXJQb2x5KCk7IC8vIGZyZWUgcG9seSwgaWYgYW55Ci0gICAgICAgIH0KLSAgICAgICAgZGVmRGF0YS0+aGFzQmxrTGF5ZXJDb21wID0gMDsKLSAgICAgICAgZGVmRGF0YS0+aGFzQmxrTGF5ZXJTcGFjID0gMDsKLSAgICAgICAgZGVmRGF0YS0+aGFzQmxrTGF5ZXJUeXBlQ29tcCA9IDA7Ci0gICAgICB9Ci0KLSAgICAgIGxheWVyX2Jsb2NrYWdlX3J1bGVzCi0gICAgICAvLyAxMC8yOS8yMDAxIC0gZW5oYW5jZW1lbnQgCi0gICAgICB8ICctJyBLX1BMQUNFTUVOVAotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5CbG9ja2FnZUNiaykgewotICAgICAgICAgIGlmIChkZWZEYXRhLT5CbG9ja2FnZS5oYXNMYXllcigpICE9IDApIHsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5ibG9ja2FnZVdhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+QmxvY2thZ2VXYXJuaW5ncykgewotICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTM5LCAiSW52YWxpZCBCTE9DS0FHRSBzdGF0ZW1lbnQgZGVmaW5lZCBpbiB0aGUgREVGIGZpbGUuIFRoZSBCTE9DS0FHRSBzdGF0bWVudCBoYXMgYm90aCB0aGUgTEFZRVIgYW5kIHRoZSBQTEFDRU1FTlQgc3RhdGVtZW50cyBkZWZpbmVkLlxuVXBkYXRlIHlvdXIgREVGIGZpbGUgdG8gaGF2ZSBlaXRoZXIgQkxPQ0tBR0Ugb3IgUExBQ0VNRU5UIHN0YXRlbWVudCBvbmx5LiIpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZGVmRGF0YS0+QmxvY2thZ2Uuc2V0UGxhY2VtZW50KCk7Ci0gICAgICAgICAgZGVmRGF0YS0+QmxvY2thZ2UuY2xlYXJQb2x5KCk7IC8vIGZyZWUgcG9seSwgaWYgYW55Ci0gICAgICAgIH0KLSAgICAgICAgZGVmRGF0YS0+aGFzQmxrUGxhY2VDb21wID0gMDsKLSAgICAgICAgZGVmRGF0YS0+aGFzQmxrUGxhY2VUeXBlQ29tcCA9IDA7Ci0gICAgICB9Ci0gICAgICBwbGFjZW1lbnRfY29tcF9ydWxlcwotICAgICAgCi1sYXllcl9ibG9ja2FnZV9ydWxlczogLy8gZW1wdHkgCi0gICAgICB8IGxheWVyX2Jsb2NrYWdlX3J1bGVzIGxheWVyX2Jsb2NrYWdlX3J1bGUKLSAgICAgIDsKLQotbGF5ZXJfYmxvY2thZ2VfcnVsZTogJysnIEtfU1BBQ0lORyBOVU1CRVIKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjYpIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5CbG9ja2FnZUNiaykgewotICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmJsb2NrYWdlV2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5CbG9ja2FnZVdhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGRlZkRhdGEtPmRlZk1zZyA9IChjaGFyKiltYWxsb2MoMTAwMCk7Ci0gICAgICAgICAgICAgIHNwcmludGYgKGRlZkRhdGEtPmRlZk1zZywKLSAgICAgICAgICAgICAgICAgIlRoZSBTUEFDSU5HIHN0YXRlbWVudCBpcyBhdmFpbGFibGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZyIsIGRlZkRhdGEtPlZlcnNpb25OdW0pOwotICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTQwLCBkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICBmcmVlKGRlZkRhdGEtPmRlZk1zZyk7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChkZWZEYXRhLT5oYXNCbGtMYXllclNwYWMpIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5CbG9ja2FnZUNiaykgewotICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmJsb2NrYWdlV2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5CbG9ja2FnZVdhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGRlZkRhdGEtPmRlZkVycm9yKDY1NDEsICJUaGUgU1BBQ0lORyBzdGF0ZW1lbnQgaXMgZGVmaW5lZCBpbiB0aGUgTEFZRVIgc3RhdGVtZW50LFxuYnV0IHRoZXJlIGlzIGFscmVhZHkgZWl0aGVyIGEgU1BBQ0lORyBzdGF0ZW1lbnQgb3IgREVTSUdOUlVMRVdJRFRIICBzdGF0ZW1lbnQgaGFzIGRlZmluZWQgaW4gdGhlIExBWUVSIHN0YXRlbWVudC5cblVwZGF0ZSB5b3VyIERFRiBmaWxlIHRvIGhhdmUgZWl0aGVyIFNQQUNJTkcgc3RhdGVtZW50IG9yIGEgREVTSUdOUlVMRVdJRFRIIHN0YXRlbWVudC4iKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkJsb2NrYWdlQ2JrKQotICAgICAgICAgICAgZGVmRGF0YS0+QmxvY2thZ2Uuc2V0U3BhY2luZygoaW50KSQzKTsKLSAgICAgICAgICBkZWZEYXRhLT5oYXNCbGtMYXllclNwYWMgPSAxOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB8ICcrJyBLX0RFU0lHTlJVTEVXSURUSCBOVU1CRVIKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjYpIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5CbG9ja2FnZUNiaykgewotICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmJsb2NrYWdlV2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5CbG9ja2FnZVdhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGRlZkRhdGEtPmRlZkVycm9yKDY1NDEsICJUaGUgU1BBQ0lORyBzdGF0ZW1lbnQgaXMgZGVmaW5lZCBpbiB0aGUgTEFZRVIgc3RhdGVtZW50LFxuYnV0IHRoZXJlIGlzIGFscmVhZHkgZWl0aGVyIGEgU1BBQ0lORyBzdGF0ZW1lbnQgb3IgREVTSUdOUlVMRVdJRFRIICBzdGF0ZW1lbnQgaGFzIGRlZmluZWQgaW4gdGhlIExBWUVSIHN0YXRlbWVudC5cblVwZGF0ZSB5b3VyIERFRiBmaWxlIHRvIGhhdmUgZWl0aGVyIFNQQUNJTkcgc3RhdGVtZW50IG9yIGEgREVTSUdOUlVMRVdJRFRIIHN0YXRlbWVudC4iKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGRlZkRhdGEtPmhhc0Jsa0xheWVyU3BhYykgewotICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkJsb2NrYWdlQ2JrKSB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+YmxvY2thZ2VXYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPkJsb2NrYWdlV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNjU0MSwgIlRoZSBTUEFDSU5HIHN0YXRlbWVudCBpcyBkZWZpbmVkIGluIHRoZSBMQVlFUiBzdGF0ZW1lbnQsXG5idXQgdGhlcmUgaXMgYWxyZWFkeSBlaXRoZXIgYSBTUEFDSU5HIHN0YXRlbWVudCBvciBERVNJR05SVUxFV0lEVEggIHN0YXRlbWVudCBoYXMgZGVmaW5lZCBpbiB0aGUgTEFZRVIgc3RhdGVtZW50LlxuVXBkYXRlIHlvdXIgREVGIGZpbGUgdG8gaGF2ZSBlaXRoZXIgU1BBQ0lORyBzdGF0ZW1lbnQgb3IgYSBERVNJR05SVUxFV0lEVEggc3RhdGVtZW50LiIpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+QmxvY2thZ2VDYmspCi0gICAgICAgICAgICBkZWZEYXRhLT5CbG9ja2FnZS5zZXREZXNpZ25SdWxlV2lkdGgoKGludCkkMyk7Ci0gICAgICAgICAgZGVmRGF0YS0+aGFzQmxrTGF5ZXJTcGFjID0gMTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgfCBtYXNrX2Jsb2NrYWdlX3J1bGUKLSAgICAgIHwgY29tcF9ibG9ja2FnZV9ydWxlCi0gICAgICAKLW1hc2tfYmxvY2thZ2VfcnVsZTogCi0gICAgICAnKycgS19NQVNLIE5VTUJFUgotICAgICAgeyAgICAgIAotICAgICAgICBpZiAoZGVmRGF0YS0+dmFsaWRhdGVNYXNrSW5wdXQoKGludCkkMywgZGVmRGF0YS0+YmxvY2thZ2VXYXJuaW5ncywgZGVmRGF0YS0+c2V0dGluZ3MtPkJsb2NrYWdlV2FybmluZ3MpKSB7Ci0gICAgICAgICAgZGVmRGF0YS0+QmxvY2thZ2Uuc2V0TWFzaygoaW50KSQzKTsKLSAgICAgICAgfQotICAgICAgfSAKLQotY29tcF9ibG9ja2FnZV9ydWxlOgotICAgICAgLy8gMDYvMjAvMjAwMSAtIHBjciAzODMyMDQgPSBwY3IgMzc4MTAyIAotICAgICAgJysnIEtfQ09NUE9ORU5UIHsgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTsgZGVmRGF0YS0+bm9fbnVtID0gMTsgfSBUX1NUUklORwotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+aGFzQmxrTGF5ZXJDb21wKSB7Ci0gICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+QmxvY2thZ2VDYmspIHsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5ibG9ja2FnZVdhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+QmxvY2thZ2VXYXJuaW5ncykgewotICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTQyLCAiVGhlIGRlZmluZWQgQkxPQ0tBR0VTIENPTVBPTkVOVCBzdGF0ZW1lbnQgaGFzIGVpdGhlciBDT01QT05FTlQsIFNMT1RTLCBGSUxMUywgUFVTSERPV04gb3IgRVhDRVBUUEdORVQgZGVmaW5lZC5cbk9ubHkgb25lIG9mIHRoZXNlIHN0YXRlbWVudHMgaXMgYWxsb3dlZCBwZXIgTEFZRVIuIFVwZGF0ZWQgdGhlIERFRiBmaWxlIHRvIGRlZmluZSBhIHZhbGlkIEJMT0NLQUdFUyBDT01QT05FTlQgc3RhdGVtZW50IHBlciBsYXllci4iKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkJsb2NrYWdlQ2JrKSB7Ci0gICAgICAgICAgICBkZWZEYXRhLT5CbG9ja2FnZS5zZXRDb21wb25lbnQoJDQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuOCkgewotICAgICAgICAgICAgZGVmRGF0YS0+aGFzQmxrTGF5ZXJDb21wID0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIDgvMzAvMjAwMSAtIHBjciAzOTQzOTQgCi0gICAgICB8ICcrJyBLX1NMT1RTCi0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5oYXNCbGtMYXllckNvbXAgfHwgZGVmRGF0YS0+aGFzQmxrTGF5ZXJUeXBlQ29tcCkgewotICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkJsb2NrYWdlQ2JrKSB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+YmxvY2thZ2VXYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPkJsb2NrYWdlV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNjU0MiwgIlRoZSBkZWZpbmVkIEJMT0NLQUdFUyBDT01QT05FTlQgc3RhdGVtZW50IGhhcyBlaXRoZXIgQ09NUE9ORU5ULCBTTE9UUywgRklMTFMsIFBVU0hET1dOIG9yIEVYQ0VQVFBHTkVUIGRlZmluZWQuXG5Pbmx5IG9uZSBvZiB0aGVzZSBzdGF0ZW1lbnRzIGlzIGFsbG93ZWQgcGVyIExBWUVSLiBVcGRhdGVkIHRoZSBERUYgZmlsZSB0byBkZWZpbmUgYSB2YWxpZCBCTE9DS0FHRVMgQ09NUE9ORU5UIHN0YXRlbWVudCBwZXIgbGF5ZXIuIik7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5CbG9ja2FnZUNiaykgewotICAgICAgICAgICAgZGVmRGF0YS0+QmxvY2thZ2Uuc2V0U2xvdHMoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjgpIHsKLSAgICAgICAgICAgIGRlZkRhdGEtPmhhc0Jsa0xheWVyQ29tcCA9IDE7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChkZWZEYXRhLT5WZXJzaW9uTnVtID09IDUuOCkgewotICAgICAgICAgICAgZGVmRGF0YS0+aGFzQmxrTGF5ZXJUeXBlQ29tcCA9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB8ICcrJyBLX0ZJTExTCi0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5oYXNCbGtMYXllckNvbXAgfHwgZGVmRGF0YS0+aGFzQmxrTGF5ZXJUeXBlQ29tcCkgewotICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkJsb2NrYWdlQ2JrKSB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+YmxvY2thZ2VXYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPkJsb2NrYWdlV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNjU0MiwgIlRoZSBkZWZpbmVkIEJMT0NLQUdFUyBDT01QT05FTlQgc3RhdGVtZW50IGhhcyBlaXRoZXIgQ09NUE9ORU5ULCBTTE9UUywgRklMTFMsIFBVU0hET1dOIG9yIEVYQ0VQVFBHTkVUIGRlZmluZWQuXG5Pbmx5IG9uZSBvZiB0aGVzZSBzdGF0ZW1lbnRzIGlzIGFsbG93ZWQgcGVyIExBWUVSLiBVcGRhdGVkIHRoZSBERUYgZmlsZSB0byBkZWZpbmUgYSB2YWxpZCBCTE9DS0FHRVMgQ09NUE9ORU5UIHN0YXRlbWVudCBwZXIgbGF5ZXIuIik7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5CbG9ja2FnZUNiayl7Ci0gICAgICAgICAgICBkZWZEYXRhLT5CbG9ja2FnZS5zZXRGaWxscygpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuOCkgewotICAgICAgICAgICAgZGVmRGF0YS0+aGFzQmxrTGF5ZXJDb21wID0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPT0gNS44KSB7Ci0gICAgICAgICAgICBkZWZEYXRhLT5oYXNCbGtMYXllclR5cGVDb21wID0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHwgJysnIEtfUFVTSERPV04KLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPmhhc0Jsa0xheWVyQ29tcCkgewotICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkJsb2NrYWdlQ2JrKSB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+YmxvY2thZ2VXYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPkJsb2NrYWdlV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNjU0MiwgIlRoZSBkZWZpbmVkIEJMT0NLQUdFUyBDT01QT05FTlQgc3RhdGVtZW50IGhhcyBlaXRoZXIgQ09NUE9ORU5ULCBTTE9UUywgRklMTFMsIFBVU0hET1dOIG9yIEVYQ0VQVFBHTkVUIGRlZmluZWQuXG5Pbmx5IG9uZSBvZiB0aGVzZSBzdGF0ZW1lbnRzIGlzIGFsbG93ZWQgcGVyIExBWUVSLiBVcGRhdGVkIHRoZSBERUYgZmlsZSB0byBkZWZpbmUgYSB2YWxpZCBCTE9DS0FHRVMgQ09NUE9ORU5UIHN0YXRlbWVudCBwZXIgbGF5ZXIuIik7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5CbG9ja2FnZUNiayl7Ci0gICAgICAgICAgICBkZWZEYXRhLT5CbG9ja2FnZS5zZXRQdXNoZG93bigpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuOCkgewotICAgICAgICAgICAgZGVmRGF0YS0+aGFzQmxrTGF5ZXJDb21wID0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHwgJysnIEtfRVhDRVBUUEdORVQgICAgICAgICAgICAgIC8vIDUuNyAKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjcpIHsKLSAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+QmxvY2thZ2VDYmspIHsKLSAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+YmxvY2thZ2VXYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPkJsb2NrYWdlV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZk1zZyA9IChjaGFyKiltYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICAgc3ByaW50ZiAoZGVmRGF0YS0+ZGVmTXNnLAotICAgICAgICAgICAgICAgICAiVGhlIEVYQ0VQVFBHTkVUIGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNyBvciBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgZGVmRGF0YS0+VmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTQ5LCBkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgZnJlZShkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICBpZiAoZGVmRGF0YS0+aGFzQmxrTGF5ZXJDb21wKSB7Ci0gICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+QmxvY2thZ2VDYmspIHsKLSAgICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5ibG9ja2FnZVdhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+QmxvY2thZ2VXYXJuaW5ncykgewotICAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTQyLCAiVGhlIGRlZmluZWQgQkxPQ0tBR0VTIENPTVBPTkVOVCBzdGF0ZW1lbnQgaGFzIGVpdGhlciBDT01QT05FTlQsIFNMT1RTLCBGSUxMUywgUFVTSERPV04gb3IgRVhDRVBUUEdORVQgZGVmaW5lZC5cbk9ubHkgb25lIG9mIHRoZXNlIHN0YXRlbWVudHMgaXMgYWxsb3dlZCBwZXIgTEFZRVIuIFVwZGF0ZWQgdGhlIERFRiBmaWxlIHRvIGRlZmluZSBhIHZhbGlkIEJMT0NLQUdFUyBDT01QT05FTlQgc3RhdGVtZW50IHBlciBsYXllci4iKTsKLSAgICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkJsb2NrYWdlQ2JrKXsKLSAgICAgICAgICAgICAgIGRlZkRhdGEtPkJsb2NrYWdlLnNldEV4Y2VwdHBnbmV0KCk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5WZXJzaW9uTnVtIDwgNS44KXsKLSAgICAgICAgICAgICAgIGRlZkRhdGEtPmhhc0Jsa0xheWVyQ29tcCA9IDE7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotcGxhY2VtZW50X2NvbXBfcnVsZXM6IC8vIGVtcHR5IAotICAgICAgfCBwbGFjZW1lbnRfY29tcF9ydWxlcyBwbGFjZW1lbnRfY29tcF9ydWxlCi0gICAgICA7Ci0gICAgICAKLXBsYWNlbWVudF9jb21wX3J1bGU6IC8vIGVtcHR5IAotICAgICAgLy8gMTAvMjkvMjAwMSAtIGVuaGFuY2VtZW50IAotICAgICAgJysnIEtfQ09NUE9ORU5UIHsgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTsgZGVmRGF0YS0+bm9fbnVtID0gMTsgfSBUX1NUUklORwotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+aGFzQmxrUGxhY2VDb21wKSB7Ci0gICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+QmxvY2thZ2VDYmspIHsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5ibG9ja2FnZVdhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+QmxvY2thZ2VXYXJuaW5ncykgewotICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTQzLCAiVGhlIGRlZmluZWQgQkxPQ0tBR0VTIFBMQUNFTUVOVCBzdGF0ZW1lbnQgaGFzIGVpdGhlciBDT01QT05FTlQsIFBVU0hET1dOLCBTT0ZUIG9yIFBBUlRJQUwgZGVmaW5lZC5cbk9ubHkgb25lIG9mIHRoZXNlIHN0YXRlbWVudHMgaXMgYWxsb3dlZCBwZXIgTEFZRVIuIFVwZGF0ZWQgdGhlIERFRiBmaWxlIHRvIGRlZmluZSBhIHZhbGlkIEJMT0NLQUdFUyBQTEFDRU1FTlQgc3RhdGVtZW50LiIpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+QmxvY2thZ2VDYmspewotICAgICAgICAgICAgZGVmRGF0YS0+QmxvY2thZ2Uuc2V0Q29tcG9uZW50KCQ0KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjgpIHsKLSAgICAgICAgICAgIGRlZkRhdGEtPmhhc0Jsa1BsYWNlQ29tcCA9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB8ICcrJyBLX1BVU0hET1dOCi0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5oYXNCbGtQbGFjZUNvbXApIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5CbG9ja2FnZUNiaykgewotICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmJsb2NrYWdlV2FybmluZ3MrKyA8IGRlZkRhdGEtPnNldHRpbmdzLT5CbG9ja2FnZVdhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGRlZkRhdGEtPmRlZkVycm9yKDY1NDMsICJUaGUgZGVmaW5lZCBCTE9DS0FHRVMgUExBQ0VNRU5UIHN0YXRlbWVudCBoYXMgZWl0aGVyIENPTVBPTkVOVCwgUFVTSERPV04sIFNPRlQgb3IgUEFSVElBTCBkZWZpbmVkLlxuT25seSBvbmUgb2YgdGhlc2Ugc3RhdGVtZW50cyBpcyBhbGxvd2VkIHBlciBMQVlFUi4gVXBkYXRlZCB0aGUgREVGIGZpbGUgdG8gZGVmaW5lIGEgdmFsaWQgQkxPQ0tBR0VTIFBMQUNFTUVOVCBzdGF0ZW1lbnQuIik7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5CbG9ja2FnZUNiayl7Ci0gICAgICAgICAgICBkZWZEYXRhLT5CbG9ja2FnZS5zZXRQdXNoZG93bigpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuOCkgewotICAgICAgICAgICAgZGVmRGF0YS0+aGFzQmxrUGxhY2VDb21wID0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHwgJysnIEtfU09GVCAgICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjcpIHsKLSAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+QmxvY2thZ2VDYmspIHsKLSAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+YmxvY2thZ2VXYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPkJsb2NrYWdlV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZk1zZyA9IChjaGFyKiltYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICAgc3ByaW50ZiAoZGVmRGF0YS0+ZGVmTXNnLAotICAgICAgICAgICAgICAgICAiVGhlIFBMQUNFTUVOVCBTT0ZUIGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNyBvciBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgZGVmRGF0YS0+VmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTQ3LCBkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgZnJlZShkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgIGlmIChkZWZEYXRhLT5oYXNCbGtQbGFjZUNvbXAgfHwgZGVmRGF0YS0+aGFzQmxrUGxhY2VUeXBlQ29tcCkgewotICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkJsb2NrYWdlQ2JrKSB7Ci0gICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+YmxvY2thZ2VXYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPkJsb2NrYWdlV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmRXJyb3IoNjU0MywgIlRoZSBkZWZpbmVkIEJMT0NLQUdFUyBQTEFDRU1FTlQgc3RhdGVtZW50IGhhcyBlaXRoZXIgQ09NUE9ORU5ULCBQVVNIRE9XTiwgU09GVCBvciBQQVJUSUFMIGRlZmluZWQuXG5Pbmx5IG9uZSBvZiB0aGVzZSBzdGF0ZW1lbnRzIGlzIGFsbG93ZWQgcGVyIExBWUVSLiBVcGRhdGVkIHRoZSBERUYgZmlsZSB0byBkZWZpbmUgYSB2YWxpZCBCTE9DS0FHRVMgUExBQ0VNRU5UIHN0YXRlbWVudC4iKTsKLSAgICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkJsb2NrYWdlQ2JrKXsKLSAgICAgICAgICAgICAgIGRlZkRhdGEtPkJsb2NrYWdlLnNldFNvZnQoKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjgpIHsKLSAgICAgICAgICAgICAgIGRlZkRhdGEtPmhhc0Jsa1BsYWNlQ29tcCA9IDE7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5WZXJzaW9uTnVtID09IDUuOCkgewotICAgICAgICAgICAgICAgZGVmRGF0YS0+aGFzQmxrUGxhY2VUeXBlQ29tcCA9IDE7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHwgJysnIEtfUEFSVElBTCBOVU1CRVIgICAgICAgICAvLyA1LjcKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPCA1LjcpIHsKLSAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+QmxvY2thZ2VDYmspIHsKLSAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+YmxvY2thZ2VXYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPkJsb2NrYWdlV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZNc2cgPSAoY2hhciopbWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgICBzcHJpbnRmIChkZWZEYXRhLT5kZWZNc2csCi0gICAgICAgICAgICAgICAgICAiVGhlIFBBUlRJQUwgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS43IG9yIGxhdGVyLlxuSG93ZXZlciwgeW91ciBERUYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBkZWZEYXRhLT5WZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTQ4LCBkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgIGZyZWUoZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgaWYgKGRlZkRhdGEtPmhhc0Jsa1BsYWNlQ29tcCB8fCBkZWZEYXRhLT5oYXNCbGtQbGFjZVR5cGVDb21wKSB7Ci0gICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+QmxvY2thZ2VDYmspIHsKLSAgICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5ibG9ja2FnZVdhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+QmxvY2thZ2VXYXJuaW5ncykgewotICAgICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTQzLCAiVGhlIGRlZmluZWQgQkxPQ0tBR0VTIFBMQUNFTUVOVCBzdGF0ZW1lbnQgaGFzIGVpdGhlciBDT01QT05FTlQsIFBVU0hET1dOLCBTT0ZUIG9yIFBBUlRJQUwgZGVmaW5lZC5cbk9ubHkgb25lIG9mIHRoZXNlIHN0YXRlbWVudHMgaXMgYWxsb3dlZCBwZXIgTEFZRVIuIFVwZGF0ZWQgdGhlIERFRiBmaWxlIHRvIGRlZmluZSBhIHZhbGlkIEJMT0NLQUdFUyBQTEFDRU1FTlQgc3RhdGVtZW50LiIpOwotICAgICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+QmxvY2thZ2VDYmspewotICAgICAgICAgICAgICAgZGVmRGF0YS0+QmxvY2thZ2Uuc2V0UGFydGlhbCgkMyk7Ci0gICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuOCkgewotICAgICAgICAgICAgICAgZGVmRGF0YS0+aGFzQmxrUGxhY2VDb21wID0gMTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPT0gNS44KSB7Ci0gICAgICAgICAgICAgICBkZWZEYXRhLT5oYXNCbGtQbGFjZVR5cGVDb21wID0gMTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgICAgICAgCi0KLXJlY3RQb2x5X2Jsb2NrYWdlX3J1bGVzOiAvLyBlbXB0eSAKLSAgICAgIHwgcmVjdFBvbHlfYmxvY2thZ2VfcnVsZXMgcmVjdFBvbHlfYmxvY2thZ2UKLSAgICAgIDsKLSAgCi1yZWN0UG9seV9ibG9ja2FnZTogS19SRUNUIHB0IHB0Ci0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkJsb2NrYWdlQ2JrKQotICAgICAgICAgIGRlZkRhdGEtPkJsb2NrYWdlLmFkZFJlY3QoJDIueCwgJDIueSwgJDMueCwgJDMueSk7Ci0gICAgICB9Ci0gICAgICB8IEtfUE9MWUdPTgotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5CbG9ja2FnZUNiaykgewotICAgICAgICAgICAgZGVmRGF0YS0+R2VvbWV0cmllcy5SZXNldCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBmaXJzdFB0IG5leHRQdCBuZXh0UHQgb3RoZXJQdHMKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+QmxvY2thZ2VDYmspIHsKLSAgICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA+PSA1LjYpIHsgIC8vIG9ubHkgNS42IGFuZCBiZXlvbmQKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5CbG9ja2FnZS5oYXNMYXllcigpKSB7ICAvLyBvbmx5IGluIGxheWVyCi0gICAgICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkJsb2NrYWdlQ2JrKQotICAgICAgICAgICAgICAgIGRlZkRhdGEtPkJsb2NrYWdlLmFkZFBvbHlnb24oJmRlZkRhdGEtPkdlb21ldHJpZXMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+QmxvY2thZ2VDYmspIHsKLSAgICAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+YmxvY2thZ2VXYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPkJsb2NrYWdlV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgICAgIGRlZkRhdGEtPmRlZkVycm9yKDY1NDQsICJBIFBPTFlHT04gc3RhdGVtZW50IGlzIGRlZmluZWQgaW4gdGhlIEJMT0NLQUdFIHN0YXRlbWVudCxcbmJ1dCBpdCBpcyBub3QgZGVmaW5lZCBpbiB0aGUgQkxPQ0tBR0UgTEFZRVIgc3RhdGVtZW50LlxuVXBkYXRlIHlvdXIgREVGIGZpbGUgdG8gZWl0aGVyIHJlbW92ZSB0aGUgUE9MWUdPTiBzdGF0ZW1lbnQgZnJvbSB0aGUgQkxPQ0tBR0Ugc3RhdGVtZW50IG9yXG5kZWZpbmUgdGhlIFBPTFlHT04gc3RhdGVtZW50IGluIGEgQkxPQ0tBR0UgTEFZRVIgc3RhdGVtZW50LiIpOwotICAgICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLS8vIDgvMzEvMjAwMSAtIDUuNCBlbmhhbmNlbWVudCAKLXNsb3Rfc2VjdGlvbjogc2xvdF9zdGFydCBzbG90X2RlZnMgc2xvdF9lbmQgOwotCi1zbG90X3N0YXJ0OiBLX1NMT1RTIE5VTUJFUiAnOycKLSAgICAgIHsgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U2xvdFN0YXJ0Q2JrKQotICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+U2xvdFN0YXJ0Q2JrLCBkZWZyU2xvdFN0YXJ0Q2JrVHlwZSwgUk9VTkQoJDIpKTsgfQotCi1zbG90X2VuZDogS19FTkQgS19TTE9UUwotICAgICAgeyBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5TbG90RW5kQ2JrKQotICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+U2xvdEVuZENiaywgZGVmclNsb3RFbmRDYmtUeXBlLCAwKTsgfQotCi1zbG90X2RlZnM6IC8vIGVtcHR5IAotICAgICAgfCBzbG90X2RlZnMgc2xvdF9kZWYKLSAgICAgIDsKLQotc2xvdF9kZWY6IHNsb3RfcnVsZSBnZW9tX3Nsb3RfcnVsZXMgJzsnCi0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlNsb3RDYmspIHsKLSAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPlNsb3RDYmssIGRlZnJTbG90Q2JrVHlwZSwgJmRlZkRhdGEtPlNsb3QpOwotICAgICAgICAgIGRlZkRhdGEtPlNsb3QuY2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgfQotCi1zbG90X3J1bGU6ICctJyBLX0xBWUVSIHsgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTsgZGVmRGF0YS0+bm9fbnVtID0gMTsgfSBUX1NUUklORyAKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U2xvdENiaykgewotICAgICAgICAgIGRlZkRhdGEtPlNsb3Quc2V0TGF5ZXIoJDQpOwotICAgICAgICAgIGRlZkRhdGEtPlNsb3QuY2xlYXJQb2x5KCk7ICAgICAvLyBmcmVlIHBvbHksIGlmIGFueQotICAgICAgICB9Ci0gICAgICB9IGdlb21fc2xvdAotCi1nZW9tX3Nsb3RfcnVsZXM6IC8vIGVtcHR5IAotICAgICAgfCBnZW9tX3Nsb3RfcnVsZXMgZ2VvbV9zbG90Ci0gICAgICA7Ci0KLWdlb21fc2xvdDogS19SRUNUIHB0IHB0Ci0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlNsb3RDYmspCi0gICAgICAgICAgZGVmRGF0YS0+U2xvdC5hZGRSZWN0KCQyLngsICQyLnksICQzLngsICQzLnkpOwotICAgICAgfQotICAgICAgfCBLX1BPTFlHT04KLSAgICAgIHsKLSAgICAgICAgICBkZWZEYXRhLT5HZW9tZXRyaWVzLlJlc2V0KCk7Ci0gICAgICB9Ci0gICAgICBmaXJzdFB0IG5leHRQdCBuZXh0UHQgb3RoZXJQdHMKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPj0gNS42KSB7ICAvLyBvbmx5IDUuNiBhbmQgYmV5b25kCi0gICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U2xvdENiaykKLSAgICAgICAgICAgIGRlZkRhdGEtPlNsb3QuYWRkUG9seWdvbigmZGVmRGF0YS0+R2VvbWV0cmllcyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotLy8gOC8zMS8yMDAxIC0gIDUuNCBlbmhhbmNlbWVudCAKLWZpbGxfc2VjdGlvbjogZmlsbF9zdGFydCBmaWxsX2RlZnMgZmlsbF9lbmQgOwotCi1maWxsX3N0YXJ0OiBLX0ZJTExTIE5VTUJFUiAnOycKLSAgICAgIHsgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+RmlsbFN0YXJ0Q2JrKQotICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+RmlsbFN0YXJ0Q2JrLCBkZWZyRmlsbFN0YXJ0Q2JrVHlwZSwgUk9VTkQoJDIpKTsgfQotCi1maWxsX2VuZDogS19FTkQgS19GSUxMUwotICAgICAgeyBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5GaWxsRW5kQ2JrKQotICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+RmlsbEVuZENiaywgZGVmckZpbGxFbmRDYmtUeXBlLCAwKTsgfQotCi1maWxsX2RlZnM6IC8vIGVtcHR5IAotICAgICAgfCBmaWxsX2RlZnMgZmlsbF9kZWYKLSAgICAgIDsKLQotZmlsbF9kZWY6IGZpbGxfcnVsZSBnZW9tX2ZpbGxfcnVsZXMgJzsnCi0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkZpbGxDYmspIHsKLSAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPkZpbGxDYmssIGRlZnJGaWxsQ2JrVHlwZSwgJmRlZkRhdGEtPkZpbGwpOwotICAgICAgICAgIGRlZkRhdGEtPkZpbGwuY2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgfCAnLScgS19WSUEgeyBkZWZEYXRhLT5kdW1iX21vZGUgPSAxOyBkZWZEYXRhLT5ub19udW0gPSAxOyB9IFRfU1RSSU5HICAvLyA1LjcKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+RmlsbENiaykgewotICAgICAgICAgIGRlZkRhdGEtPkZpbGwuc2V0VmlhKCQ0KTsKLSAgICAgICAgICBkZWZEYXRhLT5GaWxsLmNsZWFyUHRzKCk7Ci0gICAgICAgICAgZGVmRGF0YS0+R2VvbWV0cmllcy5SZXNldCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBmaWxsX3ZpYV9tYXNrX29wY19vcHQgZmlsbF92aWFfcHQgJzsnCi0KLWZpbGxfcnVsZTogJy0nIEtfTEFZRVIgeyBkZWZEYXRhLT5kdW1iX21vZGUgPSAxOyBkZWZEYXRhLT5ub19udW0gPSAxOyB9IFRfU1RSSU5HCi0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkZpbGxDYmspIHsKLSAgICAgICAgICBkZWZEYXRhLT5GaWxsLnNldExheWVyKCQ0KTsKLSAgICAgICAgICBkZWZEYXRhLT5GaWxsLmNsZWFyUG9seSgpOyAgICAvLyBmcmVlIHBvbHksIGlmIGFueQotICAgICAgICB9Ci0gICAgICB9IAotICAgICAgZmlsbF9sYXllcl9tYXNrX29wY19vcHQgZ2VvbV9maWxsICAgICAgICAgICAgLy8gNS43Ci0KLWdlb21fZmlsbF9ydWxlczogLy8gZW1wdHkgCi0gICAgICB8IGdlb21fZmlsbF9ydWxlcyBnZW9tX2ZpbGwKLSAgICAgIDsKLQotZ2VvbV9maWxsOiBLX1JFQ1QgcHQgcHQKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+RmlsbENiaykKLSAgICAgICAgICBkZWZEYXRhLT5GaWxsLmFkZFJlY3QoJDIueCwgJDIueSwgJDMueCwgJDMueSk7Ci0gICAgICB9Ci0gICAgICB8IEtfUE9MWUdPTgotICAgICAgewotICAgICAgICBkZWZEYXRhLT5HZW9tZXRyaWVzLlJlc2V0KCk7Ci0gICAgICB9Ci0gICAgICBmaXJzdFB0IG5leHRQdCBuZXh0UHQgb3RoZXJQdHMKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPj0gNS42KSB7ICAvLyBvbmx5IDUuNiBhbmQgYmV5b25kCi0gICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+RmlsbENiaykKLSAgICAgICAgICAgIGRlZkRhdGEtPkZpbGwuYWRkUG9seWdvbigmZGVmRGF0YS0+R2VvbWV0cmllcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkZWZEYXRhLT5kZWZNc2cgPSAoY2hhciopbWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgIHNwcmludGYgKGRlZkRhdGEtPmRlZk1zZywKLSAgICAgICAgICAgICAgIlBPTFlHT04gc3RhdGVtZW50IGluIEZJTExTIExBWUVSIGlzIGEgdmVyc2lvbiA1LjYgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgZGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgZGVmRGF0YS0+VmVyc2lvbk51bSk7Ci0gICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTY0LCBkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgZnJlZShkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotZmlsbF9sYXllcl9tYXNrX29wY19vcHQ6IC8vIGVtcHR5IAotICAgIHwgZmlsbF9sYXllcl9tYXNrX29wY19vcHQgb3B0X21hc2tfb3BjX2wKLSAgICA7Ci1vcHRfbWFza19vcGNfbDogZmlsbF9sYXllcl9vcGMKLSAgICB8IGZpbGxfbWFzawotICAgIDsKLSAgICAgICAgCi0vLyA1LjcKLWZpbGxfbGF5ZXJfb3BjOiAKLSAgICAgICcrJyBLX09QQwotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA8IDUuNykgewotICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5GaWxsQ2JrKSB7Ci0gICAgICAgICAgICAgaWYgKGRlZkRhdGEtPmZpbGxXYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPkZpbGxXYXJuaW5ncykgewotICAgICAgICAgICAgICAgZGVmRGF0YS0+ZGVmTXNnID0gKGNoYXIqKW1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgICBzcHJpbnRmIChkZWZEYXRhLT5kZWZNc2csCi0gICAgICAgICAgICAgICAgICJUaGUgTEFZRVIgT1BDIGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNyBvciBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgZGVmRGF0YS0+VmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTUzLCBkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgZnJlZShkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkZpbGxDYmspCi0gICAgICAgICAgICAgZGVmRGF0YS0+RmlsbC5zZXRMYXllck9wYygpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLWZpbGxfdmlhX3B0OiBmaXJzdFB0IG90aGVyUHRzCi0gICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5GaWxsQ2JrKSB7Ci0gICAgICAgICAgZGVmRGF0YS0+RmlsbC5hZGRQdHMoJmRlZkRhdGEtPkdlb21ldHJpZXMpOwotICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+RmlsbENiaywgZGVmckZpbGxDYmtUeXBlLCAmZGVmRGF0YS0+RmlsbCk7Ci0gICAgICAgICAgZGVmRGF0YS0+RmlsbC5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfQotICAgICAgCi0KLWZpbGxfdmlhX21hc2tfb3BjX29wdDogLy8gZW1wdHkgCi0gICAgfCBmaWxsX3ZpYV9tYXNrX29wY19vcHQgb3B0X21hc2tfb3BjCi0gICAgOwotb3B0X21hc2tfb3BjOiBmaWxsX3ZpYV9vcGMKLSAgICB8IGZpbGxfdmlhTWFzawotICAgIDsKLSAgICAKLS8vIDUuNwotZmlsbF92aWFfb3BjOgotICAgICAgJysnIEtfT1BDCi0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5WZXJzaW9uTnVtIDwgNS43KSB7Ci0gICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkZpbGxDYmspIHsKLSAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+ZmlsbFdhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+RmlsbFdhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZNc2cgPSAoY2hhciopbWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgIHNwcmludGYgKGRlZkRhdGEtPmRlZk1zZywKLSAgICAgICAgICAgICAgICAgIlRoZSBWSUEgT1BDIGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNyBvciBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgZGVmRGF0YS0+VmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICBkZWZEYXRhLT5kZWZFcnJvcig2NTU0LCBkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgZnJlZShkZWZEYXRhLT5kZWZNc2cpOwotICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPkZpbGxDYmspCi0gICAgICAgICAgICAgZGVmRGF0YS0+RmlsbC5zZXRWaWFPcGMoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi1maWxsX21hc2s6Ci0gICAgICAnKycgS19NQVNLIE5VTUJFUgotICAgICAgeyAKLSAgICAgICAgaWYgKGRlZkRhdGEtPnZhbGlkYXRlTWFza0lucHV0KChpbnQpJDMsIGRlZkRhdGEtPmZpbGxXYXJuaW5ncywgZGVmRGF0YS0+c2V0dGluZ3MtPkZpbGxXYXJuaW5ncykpIHsKLSAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5GaWxsQ2JrKSB7Ci0gICAgICAgICAgICAgICAgZGVmRGF0YS0+RmlsbC5zZXRNYXNrKChpbnQpJDMpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi1maWxsX3ZpYU1hc2s6Ci0gICAgICAnKycgS19NQVNLIE5VTUJFUgotICAgICAgeyAKLSAgICAgICAgaWYgKGRlZkRhdGEtPnZhbGlkYXRlTWFza0lucHV0KChpbnQpJDMsIGRlZkRhdGEtPmZpbGxXYXJuaW5ncywgZGVmRGF0YS0+c2V0dGluZ3MtPkZpbGxXYXJuaW5ncykpIHsKLSAgICAgICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5GaWxsQ2JrKSB7Ci0gICAgICAgICAgICAgICAgZGVmRGF0YS0+RmlsbC5zZXRNYXNrKChpbnQpJDMpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0vLyAxMS8xNy8yMDAzIC0gNS42IGVuaGFuY2VtZW50IAotbm9uZGVmYXVsdHJ1bGVfc2VjdGlvbjogbm9uZGVmYXVsdF9zdGFydCBub25kZWZhdWx0X2RlZiBub25kZWZhdWx0X2RlZnMKLSAgICBub25kZWZhdWx0X2VuZCA7Ci0KLW5vbmRlZmF1bHRfc3RhcnQ6IEtfTk9OREVGQVVMVFJVTEVTIE5VTUJFUiAnOycKLSAgICAgIHsgCi0gICAgICAgIGlmIChkZWZEYXRhLT5WZXJzaW9uTnVtIDwgNS42KSB7Ci0gICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+Tm9uRGVmYXVsdFN0YXJ0Q2JrKSB7Ci0gICAgICAgICAgICBpZiAoZGVmRGF0YS0+bm9uRGVmYXVsdFdhcm5pbmdzKysgPCBkZWZEYXRhLT5zZXR0aW5ncy0+Tm9uRGVmYXVsdFdhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGRlZkRhdGEtPmRlZk1zZyA9IChjaGFyKiltYWxsb2MoMTAwMCk7Ci0gICAgICAgICAgICAgIHNwcmludGYgKGRlZkRhdGEtPmRlZk1zZywKLSAgICAgICAgICAgICAgICAgIlRoZSBOT05ERUZBVUxUUlVMRSBzdGF0ZW1lbnQgaXMgYXZhaWxhYmxlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cbkhvd2V2ZXIsIHlvdXIgREVGIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgZGVmRGF0YS0+VmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgIGRlZkRhdGEtPmRlZkVycm9yKDY1NDUsIGRlZkRhdGEtPmRlZk1zZyk7Ci0gICAgICAgICAgICAgIGZyZWUoZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+Tm9uRGVmYXVsdFN0YXJ0Q2JrKQotICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+Tm9uRGVmYXVsdFN0YXJ0Q2JrLCBkZWZyTm9uRGVmYXVsdFN0YXJ0Q2JrVHlwZSwKLSAgICAgICAgICAgICAgICAgICBST1VORCgkMikpOwotICAgICAgfQotCi1ub25kZWZhdWx0X2VuZDogS19FTkQgS19OT05ERUZBVUxUUlVMRVMKLSAgICAgIHsgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+Tm9uRGVmYXVsdEVuZENiaykKLSAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPk5vbkRlZmF1bHRFbmRDYmssIGRlZnJOb25EZWZhdWx0RW5kQ2JrVHlwZSwgMCk7IH0KLQotbm9uZGVmYXVsdF9kZWZzOiAvLyBlbXB0eSAKLSAgICAgIHwgbm9uZGVmYXVsdF9kZWZzIG5vbmRlZmF1bHRfZGVmCi0gICAgICA7Ci0KLW5vbmRlZmF1bHRfZGVmOiAnLScgeyBkZWZEYXRhLT5kdW1iX21vZGUgPSAxOyBkZWZEYXRhLT5ub19udW0gPSAxOyB9IFRfU1RSSU5HCi0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPk5vbkRlZmF1bHRDYmspIHsKLSAgICAgICAgICBkZWZEYXRhLT5Ob25EZWZhdWx0LmNsZWFyKCk7IAotICAgICAgICAgIGRlZkRhdGEtPk5vbkRlZmF1bHQuc2V0TmFtZSgkMyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIG5vbmRlZmF1bHRfb3B0aW9ucyAnOycKLSAgICAgIHsgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+Tm9uRGVmYXVsdENiaykKLSAgICAgICAgICBDQUxMQkFDSyhkZWZEYXRhLT5jYWxsYmFja3MtPk5vbkRlZmF1bHRDYmssIGRlZnJOb25EZWZhdWx0Q2JrVHlwZSwgJmRlZkRhdGEtPk5vbkRlZmF1bHQpOyB9Ci0KLW5vbmRlZmF1bHRfb3B0aW9uczogLy8gZW1wdHkgIAotICAgICAgfCBub25kZWZhdWx0X29wdGlvbnMgbm9uZGVmYXVsdF9vcHRpb24KLSAgICAgIDsKLQotbm9uZGVmYXVsdF9vcHRpb246ICcrJyBLX0hBUkRTUEFDSU5HCi0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPk5vbkRlZmF1bHRDYmspCi0gICAgICAgICAgZGVmRGF0YS0+Tm9uRGVmYXVsdC5zZXRIYXJkc3BhY2luZygpOwotICAgICAgfQotICAgICAgfCAnKycgS19MQVlFUiB7IGRlZkRhdGEtPmR1bWJfbW9kZSA9IDE7IGRlZkRhdGEtPm5vX251bSA9IDE7IH0gVF9TVFJJTkcKLSAgICAgICAgS19XSURUSCBOVU1CRVIKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+Tm9uRGVmYXVsdENiaykgewotICAgICAgICAgIGRlZkRhdGEtPk5vbkRlZmF1bHQuYWRkTGF5ZXIoJDQpOwotICAgICAgICAgIGRlZkRhdGEtPk5vbkRlZmF1bHQuYWRkV2lkdGgoJDYpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBub25kZWZhdWx0X2xheWVyX29wdGlvbnMKLSAgICAgIHwgJysnIEtfVklBIHsgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMTsgZGVmRGF0YS0+bm9fbnVtID0gMTsgfSBUX1NUUklORwotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Ob25EZWZhdWx0Q2JrKSB7Ci0gICAgICAgICAgZGVmRGF0YS0+Tm9uRGVmYXVsdC5hZGRWaWEoJDQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB8ICcrJyBLX1ZJQVJVTEUgeyBkZWZEYXRhLT5kdW1iX21vZGUgPSAxOyBkZWZEYXRhLT5ub19udW0gPSAxOyB9IFRfU1RSSU5HCi0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPk5vbkRlZmF1bHRDYmspIHsKLSAgICAgICAgICBkZWZEYXRhLT5Ob25EZWZhdWx0LmFkZFZpYVJ1bGUoJDQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB8ICcrJyBLX01JTkNVVFMgeyBkZWZEYXRhLT5kdW1iX21vZGUgPSAxOyBkZWZEYXRhLT5ub19udW0gPSAxOyB9IFRfU1RSSU5HIE5VTUJFUgotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Ob25EZWZhdWx0Q2JrKSB7Ci0gICAgICAgICAgZGVmRGF0YS0+Tm9uRGVmYXVsdC5hZGRNaW5DdXRzKCQ0LCAoaW50KSQ1KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgfCBub25kZWZhdWx0X3Byb3Bfb3B0Ci0gICAgICA7Ci0KLW5vbmRlZmF1bHRfbGF5ZXJfb3B0aW9uczogLy8gZW1wdHkgCi0gICAgICB8IG5vbmRlZmF1bHRfbGF5ZXJfb3B0aW9ucyBub25kZWZhdWx0X2xheWVyX29wdGlvbgotCi1ub25kZWZhdWx0X2xheWVyX29wdGlvbjoKLSAgICAgIEtfRElBR1dJRFRIIE5VTUJFUgotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Ob25EZWZhdWx0Q2JrKSB7Ci0gICAgICAgICAgZGVmRGF0YS0+Tm9uRGVmYXVsdC5hZGREaWFnV2lkdGgoJDIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB8IEtfU1BBQ0lORyBOVU1CRVIKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+Tm9uRGVmYXVsdENiaykgewotICAgICAgICAgIGRlZkRhdGEtPk5vbkRlZmF1bHQuYWRkU3BhY2luZygkMik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHwgS19XSVJFRVhUIE5VTUJFUgotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Ob25EZWZhdWx0Q2JrKSB7Ci0gICAgICAgICAgZGVmRGF0YS0+Tm9uRGVmYXVsdC5hZGRXaXJlRXh0KCQyKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgOwotCi1ub25kZWZhdWx0X3Byb3Bfb3B0OiAnKycgS19QUk9QRVJUWSB7IGRlZkRhdGEtPmR1bWJfbW9kZSA9IERFRl9NQVhfSU5UOyAgfQotICAgICAgICAgICAgICAgICAgICAgbm9uZGVmYXVsdF9wcm9wX2xpc3QKLSAgICAgIHsgZGVmRGF0YS0+ZHVtYl9tb2RlID0gMDsgfQotCi1ub25kZWZhdWx0X3Byb3BfbGlzdDogLy8gZW1wdHkgCi0gICAgICB8IG5vbmRlZmF1bHRfcHJvcF9saXN0IG5vbmRlZmF1bHRfcHJvcAotICAgICAgOwotCi1ub25kZWZhdWx0X3Byb3A6IFRfU1RSSU5HIE5VTUJFUgotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+Y2FsbGJhY2tzLT5Ob25EZWZhdWx0Q2JrKSB7Ci0gICAgICAgICAgY2hhciBwcm9wVHA7Ci0gICAgICAgICAgY2hhciogc3RyID0gZGVmRGF0YS0+cmluZ0NvcHkoIiAgICAgICAgICAgICAgICAgICAgICAgIik7Ci0gICAgICAgICAgcHJvcFRwID0gZGVmRGF0YS0+c2Vzc2lvbi0+TkRlZlByb3AucHJvcFR5cGUoJDEpOwotICAgICAgICAgIENIS1BST1BUWVBFKHByb3BUcCwgJDEsICJOT05ERUZBVUxUUlVMRSIpOwotICAgICAgICAgIHNwcmludGYoc3RyLCAiJWciLCAkMik7Ci0gICAgICAgICAgZGVmRGF0YS0+Tm9uRGVmYXVsdC5hZGROdW1Qcm9wZXJ0eSgkMSwgJDIsIHN0ciwgcHJvcFRwKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgfCBUX1NUUklORyBRU1RSSU5HCi0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPk5vbkRlZmF1bHRDYmspIHsKLSAgICAgICAgICBjaGFyIHByb3BUcDsKLSAgICAgICAgICBwcm9wVHAgPSBkZWZEYXRhLT5zZXNzaW9uLT5ORGVmUHJvcC5wcm9wVHlwZSgkMSk7Ci0gICAgICAgICAgQ0hLUFJPUFRZUEUocHJvcFRwLCAkMSwgIk5PTkRFRkFVTFRSVUxFIik7Ci0gICAgICAgICAgZGVmRGF0YS0+Tm9uRGVmYXVsdC5hZGRQcm9wZXJ0eSgkMSwgJDIsIHByb3BUcCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHwgVF9TVFJJTkcgVF9TVFJJTkcKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+Tm9uRGVmYXVsdENiaykgewotICAgICAgICAgIGNoYXIgcHJvcFRwOwotICAgICAgICAgIHByb3BUcCA9IGRlZkRhdGEtPnNlc3Npb24tPk5EZWZQcm9wLnByb3BUeXBlKCQxKTsKLSAgICAgICAgICBDSEtQUk9QVFlQRShwcm9wVHAsICQxLCAiTk9OREVGQVVMVFJVTEUiKTsKLSAgICAgICAgICBkZWZEYXRhLT5Ob25EZWZhdWx0LmFkZFByb3BlcnR5KCQxLCAkMiwgcHJvcFRwKTsKLSAgICAgICAgfQotICAgICAgfQotCi0vLyAxMi8yLzIwMDMgLSA1LjYgZW5oYW5jZW1lbnQgCi1zdHlsZXNfc2VjdGlvbjogc3R5bGVzX3N0YXJ0IHN0eWxlc19ydWxlcyBzdHlsZXNfZW5kIDsKLQotc3R5bGVzX3N0YXJ0OiBLX1NUWUxFUyBOVU1CRVIgJzsnCi0gICAgICB7Ci0gICAgICAgIGlmIChkZWZEYXRhLT5WZXJzaW9uTnVtIDwgNS42KSB7Ci0gICAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U3R5bGVzU3RhcnRDYmspIHsKLSAgICAgICAgICAgIGlmIChkZWZEYXRhLT5zdHlsZXNXYXJuaW5ncysrIDwgZGVmRGF0YS0+c2V0dGluZ3MtPlN0eWxlc1dhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGRlZkRhdGEtPmRlZk1zZyA9IChjaGFyKiltYWxsb2MoMTAwMCk7Ci0gICAgICAgICAgICAgIHNwcmludGYgKGRlZkRhdGEtPmRlZk1zZywKLSAgICAgICAgICAgICAgICAgIlRoZSBTVFlMRVMgc3RhdGVtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnIiwgZGVmRGF0YS0+VmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgIGRlZkRhdGEtPmRlZkVycm9yKDY1NDYsIGRlZkRhdGEtPmRlZk1zZyk7Ci0gICAgICAgICAgICAgIGZyZWUoZGVmRGF0YS0+ZGVmTXNnKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U3R5bGVzU3RhcnRDYmspCi0gICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5TdHlsZXNTdGFydENiaywgZGVmclN0eWxlc1N0YXJ0Q2JrVHlwZSwgUk9VTkQoJDIpKTsKLSAgICAgIH0KLQotc3R5bGVzX2VuZDogS19FTkQgS19TVFlMRVMKLSAgICAgIHsgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U3R5bGVzRW5kQ2JrKQotICAgICAgICAgIENBTExCQUNLKGRlZkRhdGEtPmNhbGxiYWNrcy0+U3R5bGVzRW5kQ2JrLCBkZWZyU3R5bGVzRW5kQ2JrVHlwZSwgMCk7IH0KLQotc3R5bGVzX3J1bGVzOiAvLyBlbXB0eSAKLSAgICAgIHwgc3R5bGVzX3J1bGVzIHN0eWxlc19ydWxlCi0gICAgICA7Ci0KLXN0eWxlc19ydWxlOiAnLScgS19TVFlMRSBOVU1CRVIKLSAgICAgIHsKLSAgICAgICAgaWYgKGRlZkRhdGEtPmNhbGxiYWNrcy0+U3R5bGVzQ2JrKSBkZWZEYXRhLT5TdHlsZXMuc2V0U3R5bGUoKGludCkkMyk7Ci0gICAgICAgIGRlZkRhdGEtPkdlb21ldHJpZXMuUmVzZXQoKTsKLSAgICAgIH0KLSAgICAgIGZpcnN0UHQgbmV4dFB0IG90aGVyUHRzICc7JwotICAgICAgewotICAgICAgICBpZiAoZGVmRGF0YS0+VmVyc2lvbk51bSA+PSA1LjYpIHsgIC8vIG9ubHkgNS42IGFuZCBiZXlvbmQgd2lsbCBjYWxsIHRoZSBjYWxsYmFjawotICAgICAgICAgIGlmIChkZWZEYXRhLT5jYWxsYmFja3MtPlN0eWxlc0NiaykgewotICAgICAgICAgICAgZGVmRGF0YS0+U3R5bGVzLnNldFBvbHlnb24oJmRlZkRhdGEtPkdlb21ldHJpZXMpOwotICAgICAgICAgICAgQ0FMTEJBQ0soZGVmRGF0YS0+Y2FsbGJhY2tzLT5TdHlsZXNDYmssIGRlZnJTdHlsZXNDYmtUeXBlLCAmZGVmRGF0YS0+U3R5bGVzKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotCi0lJQotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmX2tleXdvcmRzLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmX2tleXdvcmRzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWExY2ZlZS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZl9rZXl3b3Jkcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzY3ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTMgLSAyMDE2LCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGljZnRjbSAkCi0vLyAgJFJldmlzaW9uOiAjMiAkCi0vLyAgJERhdGU6IDIwMTcvMDgvMjggJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIFJldmlzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIDAzLTE1LTIwMDAgV2FuZGEgZGEgUm9zYSAtIEFkZCBjb2RlIHRvIHN1cHBvcnQgNS40LCBhZGQga2V5d29yZHMgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBQSU5TICsgVVNFLCBTUEVDSUFMTkVUUyArIFNIQVBFICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBvdGhlciBrZXl3b3JkcyAgICAgICAgICAgICAgICAgICAgICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAibGV4LmgiCi0jaW5jbHVkZSAiZGVmaURlZnMuaHBwIgotI2luY2x1ZGUgImRlZmlEZWJ1Zy5ocHAiCi0jaW5jbHVkZSAiZGVmckNhbGxCYWNrcy5ocHAiCi0jaW5jbHVkZSAiZGVmckRhdGEuaHBwIgotI2luY2x1ZGUgImRlZnJTZXR0aW5ncy5ocHAiCi0KLSNpZmRlZiBXSU4zMgotIyAgIGluY2x1ZGUgPGRpcmVjdC5oPgotI2Vsc2UgLyogbm90IFdJTjMyICovCi0jICAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYgLyogV0lOMzIgKi8KLQotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0jaW5jbHVkZSAiZGVmLnRhYi5oIgotCi0KLWludCBkZWZyRGF0YTo6ZGVmR2V0S2V5d29yZChjb25zdCBjaGFyKiBuYW1lLCBpbnQgKnJlc3VsdCkgCi17IAotICAgIG1hcDxjb25zdCBjaGFyKiwgaW50LCBkZWZDb21wYXJlQ1N0cmluZ3M+Ojpjb25zdF9pdGVyYXRvciBzZWFyY2ggPSBzZXR0aW5ncy0+S2V5d29yZF9zZXQuZmluZChuYW1lKTsKLQotICAgIGlmICggc2VhcmNoICE9IHNldHRpbmdzLT5LZXl3b3JkX3NldC5lbmQoKSkgewotICAgICAgICAqcmVzdWx0ID0gc2VhcmNoLT5zZWNvbmQ7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLQotICAgIHJldHVybiBGQUxTRTsKLX0KLQotaW50IAotZGVmckRhdGE6OmRlZkdldEFsaWFzKGNvbnN0IHN0cmluZyAmbmFtZSwgc3RyaW5nICZyZXN1bHQpIAoteyAKLSAgICBtYXA8c3RyaW5nLCBzdHJpbmcsIGRlZkNvbXBhcmVTdHJpbmdzPjo6aXRlcmF0b3Igc2VhcmNoID0gZGVmX2FsaWFzX3NldC5maW5kKG5hbWUpOwotCi0gICAgaWYgKCBzZWFyY2ggIT0gZGVmX2FsaWFzX3NldC5lbmQoKSkgewotICAgICAgICByZXN1bHQgPSBzZWFyY2gtPnNlY29uZDsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotCi0gICAgcmV0dXJuIEZBTFNFOwotfQotCi1pbnQgZGVmckRhdGE6OmRlZkdldERlZmluZShjb25zdCBzdHJpbmcgJm5hbWUsIHN0cmluZyAmcmVzdWx0KSAKLXsgCi0gICAgbWFwPHN0cmluZywgc3RyaW5nLCBkZWZDb21wYXJlU3RyaW5ncz46Oml0ZXJhdG9yIHNlYXJjaCA9IGRlZl9kZWZpbmVzX3NldC5maW5kKG5hbWUpOwotCi0gICAgaWYgKCBzZWFyY2ggIT0gZGVmX2RlZmluZXNfc2V0LmVuZCgpKSB7Ci0gICAgICAgIHJlc3VsdCA9IHNlYXJjaC0+c2Vjb25kOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLS8vIGxleC5jcHBoIHN0YXJ0cyBoZXJlCi0vKiBVc2VyIGRlZmluZWQgaWYgbG9nIGZpbGUgc2hvdWxkIGJlIGluIGFwcGVuZCBmcm9tIHRoZSBwcmV2aW91cyBydW4gKi8KLS8qIFVzZXIgZGVmaW5lZCBpZiBwcm9wZXJ0eSBzdHJpbmcgdmFsdWUgc2hvdWxkIGJlIHByb2Nlc3MgKi8KLS8qIFZhcmlibGUgZnJvbSBsZXguY3BwaCB0byBrZWVwIHRyYWNrIG9mIGludmFsaWQgbm9uRW5nbGlzaCBjaGFyYWN0ZXIgKi8KLS8qIGluIGRlZiBmaWxlICovCi0KLS8qKioqKioqKioqKipTb21lIHNpbXBsZSBmaWxlIHJlYWRpbmcgcm91dGluZXMgc2luY2UgdW5nZXRjKCkgcHJvdmVzICoqKiovCi0vKioqKioqKioqKioqdG8gYmUgcXVpdGUgc2xvdywgYW5kIHdlIGRvbid0IG5lZWQgbXVsdGlwbGUgY2hhcnMgb2YgcHVzaGJhY2sgKi8KLSNpZm5kZWYgV0lOMzIKLSMgICBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi12b2lkIAotZGVmckRhdGE6OnJlbG9hZF9idWZmZXIoKSB7Ci0gICBpbnQgbmIgPSAwOwotCi0gICBpZiAoZmlyc3RfYnVmZmVyKSB7Ci0gICAgICBmaXJzdF9idWZmZXIgPSAwOwotICAgICAgaWYgKHNldHRpbmdzLT5SZWFkRnVuY3Rpb24pIHsKLSAgICAgICAgIGlmICgobmIgPSAoKnNldHRpbmdzLT5SZWFkRnVuY3Rpb24pKEZpbGUsIGJ1ZmZlciwgNCkpICE9IDQpIHsKLSAgICAgICAgICAgIG5leHQgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgIGlmICgobmIgPSBmcmVhZChidWZmZXIsIDEsIDQsIEZpbGUpKSAhPSA0KSB7Ci0gICAgICAgICAgICBuZXh0ID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgIH0KLQotICAgaWYgKG5iID09IDApIHsKLSAgICAgIGlmIChzZXR0aW5ncy0+UmVhZEZ1bmN0aW9uKQotICAgICAgICAgbmIgPSAoKnNldHRpbmdzLT5SZWFkRnVuY3Rpb24pKEZpbGUsIGJ1ZmZlciwgSU5fQlVGX1NJWkUpOwotICAgICAgZWxzZQotICAgICAgICAgLyogVGhpcyBpcyBhIG5vcm1hbCBmaWxlIHNvIGp1c3QgcmVhZCBzb21lIGJ5dGVzLiAqLwotICAgICAgICAgbmIgPSBmcmVhZChidWZmZXIsIDEsIElOX0JVRl9TSVpFLCBGaWxlKTsKLSAgIH0KLSAgICAKLSAgIGlmIChuYiA8PSAwKSB7Ci0gICAgICBuZXh0ID0gTlVMTDsKLSAgIH0gZWxzZSB7Ci0gICAgICBuZXh0ID0gYnVmZmVyOwotICAgICAgbGFzdCA9IGJ1ZmZlciArIG5iIC0gMTsKLSAgIH0KLX0gICAKLQotaW50IAotIGRlZnJEYXRhOjpHRVRDKCkgewotICAgLy8gUmVtb3ZlICdccicgc3ltYm9scyBmcm9tIFdpbmRvd3Mgc3RyZWFtcy4KLSAgICBmb3IoOzspIHsKLSAgICAgICBpZiAobmV4dCA+IGxhc3QpCi0gICAgICAgICAgcmVsb2FkX2J1ZmZlcigpOwotICAgICAgIGlmKG5leHQgPT0gTlVMTCkKLSAgICAgICAgICByZXR1cm4gRU9GOwotCi0gICAgICAgaW50IGNoID0gKm5leHQrKzsKLQotICAgICAgIGlmIChjaCAhPSAnXHInKQotICAgICAgICAgICByZXR1cm4gY2g7Ci0gICAgfQotfQotCi12b2lkIAotZGVmckRhdGE6OlVOR0VUQyhjaGFyIGNoKSB7Ci0gICAgaWYgKG5leHQgPD0gYnVmZmVyKSB7Ci0gICAgICAgIGRlZkVycm9yKDYxMTEsICJVTkdFVEM6IGJ1ZmZlciBhY2Nlc3MgdmlvbGF0aW9uLiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICooLS1uZXh0KSA9IGNoOwotICAgIH0KLX0KLQotLyogUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIGFsbG9jYXRlZCBmcm9tIHRoZSByaW5nIGJ1ZmZlci4KLSAqIFdlIHdpbGwga2VlcCBzZXZlcmFsIHN0cmluZ3MgaW4gdGhlIGJ1ZmZlciBhbmQganVzdCByZXVzZSB0aGVtLgotICogVGhpcyBjb3VsZCBjYXVzZSBwcm9ibGVtcyBpZiB3ZSBuZWVkIHRvIHVzZSBtb3JlIHN0cmluZ3MgdGhhbiB3ZQotICogaGF2ZSBpbiB0aGUgYnVmZmVyLgotICovCi1jaGFyKiAKLWRlZnJEYXRhOjpyaW5nQ29weShjb25zdCBjaGFyKiBzdHJpbmcpIAotewotICAgaW50IGxlbiA9IHN0cmxlbihzdHJpbmcpICsgMTsKLSAgIGlmICgrKyhyaW5nUGxhY2UpID49IFJJTkdfU0laRSkgCi0gICAgICAgcmluZ1BsYWNlID0gMDsKLSAgIGlmIChsZW4gPiByaW5nU2l6ZXNbcmluZ1BsYWNlXSkgewotICAgICAgZnJlZShyaW5nW3JpbmdQbGFjZV0pOwotICAgICAgcmluZ1tyaW5nUGxhY2VdID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICAgICAgcmluZ1NpemVzW3JpbmdQbGFjZV0gPSBsZW47Ci0gICB9Ci0gICBzdHJjcHkocmluZ1tyaW5nUGxhY2VdLCBzdHJpbmcpOwotICAgcmV0dXJuIHJpbmdbcmluZ1BsYWNlXTsKLX0KLQotCi1pbnQgCi1kZWZyRGF0YTo6RGVmR2V0VG9rZW5Gcm9tU3RhY2soY2hhciAqcykgewotICAgY29uc3QgY2hhciAqY2g7ICAgICAgICAvKiB1dGlsaXR5IHZhcmlhYmxlICovCi0gICBjaGFyICpwclMgPSBOVUxMOyAgICAgICAgICAvKiBwb2ludGluZyB0byB0aGUgcHJldmlvdXMgY2hhciBvciBzICovCi0KLSAgIHdoaWxlKGlucHV0X2xldmVsID49IDApIHsKLSAgICAgIGZvcihjaD1zdGFja1tpbnB1dF9sZXZlbF0uY19zdHIoKTsgKmNoICE9IDA7IGNoKyspICAgIC8qIHNraXAgd2hpdGUgc3BhY2UgKi8KLSAgICAgICAgIGlmICgqY2ggIT0gJyAnICYmICpjaCAhPSAnXHQnICYmIChubF90b2tlbiB8fCAqY2ggIT0gJ1xuJykpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgIC8qIGRpZCB3ZSBmaW5kIGFueXRoaW5nPyAgSWYgbm90LCBkZWNyZW1lbnQgbGV2ZWwgYW5kIHRyeSBhZ2FpbiAqLwotICAgICAgaWYgKCpjaCA9PSAwKQotICAgICAgICAgaW5wdXRfbGV2ZWwtLTsKLSAgICAgIGVsc2UgaWYgKCpjaCA9PSAnXG4nKSB7Ci0gICAgICAgICAqcysrID0gKmNoOyAKLSAgICAgICAgICpzID0gMDsKLSAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgfQotICAgICAgZWxzZSB7ICAgICAgICAgICAgLyogd2UgZm91bmQgc29tZXRoaW5nICovCi0gICAgICAgIGZvcig7IDsgY2grKykgIHsKLSAgICAgICAgICAgaWYgKCpjaCA9PSAnICcgfHwgKmNoID09ICdcdCcgfHwgKmNoID09ICdcbicgfHwgKmNoID09IDApIHsKLSAgICAgICAgICAgICAgLyogMTAvMTAvMjAwMCAtIFdhbmRhIGRhIFJvc2EsIHBjciAzNDEwMzIKLSAgICAgICAgICAgICAgKiogVGFrZSBvdXQgdGhlIGxhc3QgJyInLCB0aGUgMXN0IHdpbGwgYmUgc2tpcCBsYXRlcgotICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICBpZiAoKnByUyA9PSAnIicpIHsKLSAgICAgICAgICAgICAgICAgKnByUyA9ICdcMCc7Ci0gICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAqcysrID0gJ1wwJzsKLSAgICAgICAgICAgICAgc3RhY2tbaW5wdXRfbGV2ZWxdID0gY2g7Ci0KLSAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgLyogMTAvMTAvMjAwMCAtIFdhbmRhIGRhIFJvc2EsIHBjciAzNDEwMzIKLSAgICAgICAgICAgKiogU2F2ZSB0aGUgbG9jYXRpb24gb2YgdGhlIHByZXZpb3VzIHMKLSAgICAgICAgICAgKi8KLSAgICAgICAgICAgcHJTID0gczsKLSAgICAgICAgICAgKnMrKyA9ICpjaDsKLSAgICAgICAgfQotICAgICB9Ci0gICB9Ci0gICByZXR1cm4gRkFMU0U7ICAgIC8qIGlmIHdlIGdldCBoZXJlLCB3ZSByYW4gb3V0IG9mIGlucHV0IGxldmVscyAqLwotfQotCi0gdm9pZCAKLWRlZnJEYXRhOjpwcmludF9saW5lcyhsb25nIGxvbmcgbGluZXMpIAotewotICAgIGlmIChsaW5lcyAlIHNldHRpbmdzLT5kZWZpRGVsdGFOdW1iZXJMaW5lcykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHNldHRpbmdzLT5Db250ZXh0TGluZU51bWJlckZ1bmN0aW9uKSB7Ci0gICAgICAgIHNldHRpbmdzLT5Db250ZXh0TGluZU51bWJlckZ1bmN0aW9uKHNlc3Npb24tPlVzZXJEYXRhLCAoaW50KWxpbmVzKTsKLSAgICB9IGVsc2UgaWYgKHNldHRpbmdzLT5Db250ZXh0TG9uZ0xpbmVOdW1iZXJGdW5jdGlvbiApIHsKLSAgICAgICAgc2V0dGluZ3MtPkNvbnRleHRMb25nTGluZU51bWJlckZ1bmN0aW9uKHNlc3Npb24tPlVzZXJEYXRhLCBsaW5lcyk7Ci0gICAgfQotICAgIGlmIChzZXR0aW5ncy0+TGluZU51bWJlckZ1bmN0aW9uKSB7Ci0gICAgICAgIHNldHRpbmdzLT5MaW5lTnVtYmVyRnVuY3Rpb24oKGludClsaW5lcyk7Ci0gICAgfSBlbHNlIGlmIChzZXR0aW5ncy0+TG9uZ0xpbmVOdW1iZXJGdW5jdGlvbiApIHsKLSAgICAgICAgc2V0dGluZ3MtPkxvbmdMaW5lTnVtYmVyRnVuY3Rpb24obGluZXMpOwotICAgIH0KLX0KLQotY29uc3QgY2hhciAqIAotZGVmckRhdGE6OmxpbmVzMnN0cihsb25nIGxvbmcgbGluZXMpIAotewotCi0jaWZkZWYgX1dJTjMyCi0gICAgc3ByaW50ZihsaW5lQnVmZmVyLCAiJUk2NGQiLCBsaW5lcyk7Ci0jZWxzZQotICAgIHNwcmludGYobGluZUJ1ZmZlciwgIiVsbGQiLCBsaW5lcyk7Ci0jZW5kaWYgCi0KLSAgICByZXR1cm4gbGluZUJ1ZmZlcjsKLX0KLQotCi0vLyBJbmNyZW1lbnQgY3VycmVudCBwb3NpdGlvbiBvZiBidWZmZXIgcG9pbnRlci4gCi0vLyBEb3VibGUgYnVmZmVyIHNpemUgaWYgY3VyUG9zIGlzIG91dCBvZiBib3VuZGFyeS4KLXZvaWQgIAotZGVmckRhdGE6OkluY0N1clBvcyhjaGFyICoqY3VyUG9zLCBjaGFyICoqYnVmZmVyLCBpbnQgKmJ1ZmZlclNpemUpCi17Ci0gICAgKCpjdXJQb3MpKys7Ci0gICAgaWYgKCpjdXJQb3MgLSAqYnVmZmVyIDwgKmJ1ZmZlclNpemUpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGxvbmcgb2Zmc2V0ID0gKmN1clBvcyAtICpidWZmZXI7Ci0KLSAgICAqYnVmZmVyU2l6ZSAqPSAyOwotICAgICpidWZmZXIgPSAoY2hhciopIHJlYWxsb2MoKmJ1ZmZlciwgKmJ1ZmZlclNpemUpOwotICAgICpjdXJQb3MgPSAqYnVmZmVyICsgb2Zmc2V0OwotfQotCi0KLWludAotZGVmckRhdGE6OkRlZkdldFRva2VuKGNoYXIgKipidWYsIGludCAqYnVmZmVyU2l6ZSkKLXsKLSAgICBjaGFyICpzID0gKmJ1ZjsKLSAgICBpbnQgY2g7Ci0KLSAgICBudG9rZW5zKys7Ci0gICAgZGVmSW52YWxpZENoYXIgPSAwOwotCi0gICAgaWYgKGlucHV0X2xldmVsID49IDApeyAgLyogaWYgd2UgYXJlIGV4cGFuZGluZyBhbiBhbGlhcyAqLwotICAgICAgIGlmKERlZkdldFRva2VuRnJvbVN0YWNrKHMpKSAvKiB0cnkgdG8gZ2V0IGEgdG9rZW4gZnJvbSBpdCAqLwotICAgICAgICAgIHJldHVybiBUUlVFOyAgICAgICAgICAgICAgIC8qIGlmIHdlIGdldCBvbmUsIHJldHVybiBpdCAqLwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1dCBpZiBub3QsIGNvbnRpbnVlICovCi0KLSAgICAvKiBza2lwIGJsYW5rcyBhbmQgY291bnQgbGluZXMgKi8KLSAgICB3aGlsZSAoKGNoID0gR0VUQygpKSAhPSBFT0YpIHsKLSAgICAgICBpZiAoY2ggPT0gJ1xuJykgewotICAgICAgICAgIHByaW50X2xpbmVzKCsrbmxpbmVzKTsKLSAgICAgICB9Ci0gICAgICAgaWYgKGNoICE9ICcgJyAmJiBjaCAhPSAnXHQnICYmIChubF90b2tlbiB8fCBjaCAhPSAnXG4nKSkKLSAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoY2ggPT0gRU9GKSAKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0KLSAgICBpZiAoY2ggPT0gJ1xuJykgewotICAgICAgICpzID0gY2g7IAotICAgICAgIEluY0N1clBvcygmcywgYnVmLCBidWZmZXJTaXplKTsKLQotICAgICAgICpzID0gJ1wwJzsKLSAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0KLSAgICAvKiBub3cgZ2V0IHRoZSB0b2tlbiAqLwotICAgIGlmIChjaCA9PSAnIicpIHsKLSAgICAgICBkbyB7Ci0gICAgICAgICAgLyogNS81LzIwMDggLSBDQ1IgNTU2ODE4Ci0gICAgICAgICAgKiogQ2hlY2sgaWYgdGhlIGNoIGlzIGEgdmFsaWQgYXNjaWkgY2hhcmFjdGVyIDAgPTwgY2ggPCAxMjgKLSAgICAgICAgICAqKiBJZiBub3Qgd3JpdGUgb3V0IGFuIGVycm9yCi0gICAgICAgICAgKi8KLSAgICAgICAgICAvKiA4LzcvMjAwOCAtIENDUiA1ODYxNzUKLSAgICAgICAgICAqKiBTb21lIGZpbGVzIG1heSBub3QgZW5kIHdpdGggXG4gb3IgXDAgb3IgRU9GIGFzIHRoZSBsYXN0IGNoYXJhY3RlcgotICAgICAgICAgICoqIFRoZSBwYXJzZXIgYWxsb3dzIHRoaXMgY2hhciBpbnN0ZWFkIG9mIGVycm9yIG91dAotICAgICAgICAgICovCi0gICAgICAgICAgaWYgKChjaCA8IC0xKSB8fCAoY2ggPiAxMjcpKSB7Ci0gICAgICAgICAgICAgZGVmSW52YWxpZENoYXIgPSAxOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIDgvMjIvMjAwMCAtIFdhbmRhIGRhIFJvc2EsIHBjciAzMzMzMzQKLSAgICAgICAgICAqKiBzYXZlIHRoZSBwcmV2aW91cyBjaGFyIHRvIGFsbG93IGJhY2tzbGFzaCBxdW90ZSB3aXRoaW4gcXVvdGUKLSAgICAgICAgICAqLwotICAgICAgICAgIGlmICghc2V0dGluZ3MtPkRpc1Byb3BTdHJQcm9jZXNzKSB7Ci0gICAgICAgICAgICAgLyogMy80LzIwMDggLSBDQ1IgNTIzODc5IC0gY29udmVydCBcXCB0byBcLCBcIiB0byAiLCBceCB0byB4ICovCi0gICAgICAgICAgICAgaWYgKGNoID09ICdcXCcpIHsgICAgICAvKiBnb3QgYSBcLCBzYXZlIHRoZSBuZXh0IGNoYXIgb25seSAqLwotICAgICAgICAgICAgICAgIGNoID0gR0VUQygpOwotICAgICAgICAgICAgICAgIGlmICgoY2ggPT0gJ1xuJykgfHwgKGNoID09IEVPRikpIHsgLyogc2VuYXR5IGNoZWNrICovCi0gICAgICAgICAgICAgICAgICAgICpzID0gJ1wwJzsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgKnMgPSBjaDsKLSAgICAgICAgICBJbmNDdXJQb3MoJnMsIGJ1ZiwgYnVmZmVyU2l6ZSk7Ci0KLSAgICAgICAgICBjaCA9IEdFVEMoKTsKLQotICAgICAgICAgIGlmIChjaCA9PSBFT0YpIHsKLSAgICAgICAgICAgICAqcyA9ICdcMCc7Ci0gICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgIH0KLSAgICAgICB9IHdoaWxlIChjaCAhPSAnIicpOwotCi0gICAgICAgKnMgPSAnXDAnOwotICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLQotICAgIGlmIChuYW1lc19jYXNlX3NlbnNpdGl2ZSkgewotICAgICAgIGZvcig7IDsgY2ggPSBHRVRDKCkpICB7Ci0KLSAgICAgICAgICAvKiA1LzUvMjAwOCAtIENDUiA1NTY4MTgKLSAgICAgICAgICAqKiBDaGVjayBpZiB0aGUgY2ggaXMgYSB2YWxpZCBhc2NpaSBjaGFyYWN0ZXIgMCA9PCBjaCA8IDEyOAotICAgICAgICAgICoqIElmIG5vdCB3cml0ZSBvdXQgYW4gZXJyb3IKLSAgICAgICAgICAqLwotICAgICAgICAgIGlmICgoY2ggPCAtMSkgfHwgKGNoID4gMTI3KSkgewotICAgICAgICAgICAgIGRlZkludmFsaWRDaGFyID0gMTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoY2ggPT0gJyAnIHx8IGNoID09ICdcdCcgfHwgY2ggPT0gJ1xuJyB8fCBjaCA9PSBFT0YpCi0gICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAqcyA9IGNoOwotICAgICAgICAgIEluY0N1clBvcygmcywgYnVmLCBidWZmZXJTaXplKTsgICAgICAgIAotICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7IC8qIHdlIGFyZSBjYXNlIGluc2Vuc2l0aXZlLCB1c2UgYSBkaWZmZXJlbnQgbG9vcCAqLwotICAgICAgIGZvcig7IDsgY2ggPSBHRVRDKCkpICB7Ci0KLSAgICAgICAgICAvKiA1LzUvMjAwOCAtIENDUiA1NTY4MTgKLSAgICAgICAgICAqKiBDaGVjayBpZiB0aGUgY2ggaXMgYSB2YWxpZCBhc2NpaSBjaGFyYWN0ZXIgMCA9PCBjaCA8IDEyOAotICAgICAgICAgICoqIElmIG5vdCB3cml0ZSBvdXQgYW4gZXJyb3IKLSAgICAgICAgICAqLwotICAgICAgICAgIGlmICgoY2ggPCAtMSkgfHwgKGNoID4gMTI3KSkgewotICAgICAgICAgICAgIGRlZkludmFsaWRDaGFyID0gMTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoY2ggPT0gJyAnIHx8IGNoID09ICdcdCcgfHwgY2ggPT0gJ1xuJyB8fCBjaCA9PSBFT0YpCi0gICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAqcyA9IChjaCA+PSAnYScgJiYgY2ggPD0gJ3onKT8gKGNoIC0nYScgKyAnQScpIDogY2g7ICAgICAgICAgICAgCi0gICAgICAgICAgSW5jQ3VyUG9zKCZzLCBidWYsIGJ1ZmZlclNpemUpOwotICAgICAgIH0KLSAgICB9Ci0gICAKLSAgICAvKiBJZiB3ZSBnb3QgdGhpcyBmYXIsIHRoZSBsYXN0IGNoYXIgd2FzIHdoaXRlc3BhY2UgKi8KLSAgICAqcyA9ICdcMCc7Ci0gICAgaWYgKGNoICE9IEVPRikgICAvKiBzaG91bGRuJ3QgdW5nZXRjIGFuIEVPRiAqLwotICAgICAgIFVOR0VUQygoY2hhciljaCk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qIGNyZWF0ZXMgYW4gdXBwZXIgY2FzZSBjb3B5IG9mIGFuIGFycmF5ICovCi12b2lkIAotZGVmckRhdGE6OnVjX2FycmF5KGNoYXIgKnNvdXJjZSwgY2hhciAqZGVzdCkKLXsKLSAgICBmb3IoOyAqc291cmNlICE9IDA7ICkKLSAgICAqZGVzdCsrID0gdG91cHBlcigqc291cmNlKyspOwotICAgICpkZXN0ID0gMDsKLX0KLQotCi12b2lkCi1kZWZyRGF0YTo6U3RvcmVBbGlhcygpCi17Ci0gICAgaW50ICAgICAgICAgdG9rZW5TaXplID0gVE9LRU5fU0laRTsKLSAgICBjaGFyICAgICAgICAqYW5hbWUgPSAoY2hhciopbWFsbG9jKHRva2VuU2l6ZSk7Ci0KLSAgICBEZWZHZXRUb2tlbigmYW5hbWUsICZ0b2tlblNpemUpOwotCi0gICAgY2hhciAgICAgICAgKmxpbmUgPSAoY2hhciopbWFsbG9jKHRva2VuU2l6ZSk7Ci0KLSAgICBEZWZHZXRUb2tlbigmbGluZSwgJnRva2VuU2l6ZSk7ICAKLQotICAgIGNoYXIgICAgICAgICp1Y19saW5lID0gKGNoYXIqKW1hbGxvYyh0b2tlblNpemUpOwotCi0gICAgc3RyaW5nIHNvX2ZhcjsgICAgICAgICAgICAgICAvKiBjb250YWlucyBhbGlhcyBjb250ZW50cyBhcyB3ZSBidWlsZCBpdCAqLwotCi0gICAgaWYgKHN0cmNtcChsaW5lLCI9IikgIT0gMCkgewotICAgICAgIGRlZkVycm9yKDYwMDAsICJFeHBlY3RpbmcgJz0nIik7Ci0gICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIG5vdyBrZWVwIGdldHRpbmcgbGluZXMgdGlsbCB3ZSBnZXQgb25lIHRoYXQgY29udGFpbnMgJkVOREFMSUFTICovCi0gICAgZm9yKGNoYXIgKnAgPSBOVUxMIDtwID09IE5VTEw7KXsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGNoYXIgKnMgPSBsaW5lOwotICAgICAgICBmb3IoaT0wO2k8dG9rZW5TaXplLTE7aSsrKSB7Ci0gICAgICAgICAgICBpbnQgY2ggPSBHRVRDKCk7Ci0gICAgICAgICAgICBpZiAoY2ggPT0gRU9GKSB7Ci0gICAgICAgICAgICAgICAgZGVmRXJyb3IoNjAwMSwgIkVuZCBvZiBmaWxlIGluICZBTElBUyIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgKnMrKyA9IGNoOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoY2ggPT0gJ1xuJykgewotICAgICAgICAgICAgICAgIHByaW50X2xpbmVzKCsrbmxpbmVzKTsgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAqcyA9ICdcMCc7Ci0KLSAgICAgICAgdWNfYXJyYXkobGluZSwgdWNfbGluZSk7ICAgICAgICAgICAgIC8qIG1ha2UgdXBwZXIgY2FzZSBjb3B5ICovCi0gICAgICAgIHAgPSBzdHJzdHIodWNfbGluZSwgIiZFTkRBTElBUyIpOyAgICAvKiBsb29rIGZvciBFTkRfQUxJQVMgKi8KLSAgICAgICAgaWYgKHAgIT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHdlIGZpbmQgaXQgKi8KLSAgICAgICAgICAgICoobGluZSArIChwIC0gdWNfbGluZSkpID0gMDsgICAgIC8qIHJlbW92ZSBpdCBmcm9tIHRoZSBsaW5lICovCi0KLSAgICAgICAgc29fZmFyICs9IGxpbmU7Ci0gICAgfQotCi0gICAgZGVmX2FsaWFzX3NldFthbmFtZV0gPSBzb19mYXI7Ci0KLSAgICBmcmVlKGFuYW1lKTsKLSAgICBmcmVlKGxpbmUpOwotICAgIGZyZWUodWNfbGluZSk7Ci19Ci0KLS8qIFRoZSBtYWluIHJvdXRpbmUgY2FsbGVkIGJ5IHRoZSBZQUNDIHBhcnNlciB0byBnZXQgdGhlIG5leHQgdG9rZW4uCi0gKiAgICBSZXR1cm5zIDAgaWYgbm8gbW9yZSB0b2tlbnMgYXJlIGF2YWlsYWJsZS4KLSAqICAgIFJldHVybnMgYW4gaW50ZWdlciBmb3Iga2V5d29yZHMgKHNlZSB0aGUgeWFjY19kZWZpbmVzLmggZm9yIHZhbHVlcykKLSAqICAgIFJldHVybnMgdGhlIGNoYXJhY3RlciBpdHNlbGYgZm9yIHB1bmN0dWF0aW9uCi0gKiAgICBSZXR1cm5zIE5VTUJFUiBmb3IgbnVtZXJpYyBsb29raW5nIHRva2VucwotICogICAgUmV0dXJucyBUX1NUUklORyBmb3IgYW55dGhpbmcgZWxzZQotICogSWYgdGhlIGdsb2JhbCAiZHVtYl9tb2RlIiBpcyA+IDAsIGl0IHJlYWRzIHRoZSBuZXh0IHRva2VuIGluICJkdW1iIG1vZGUiLgotICogSW4gdGhpcyBjYXNlLCBpdCBkb2VzIG5vdCBkbyBrZXl3b3JkIGxvb2t1cCwgb3IgYXR0ZW1wdCB0byByZWFkIGEgdG9rZW4KLSAqIGFzIGEgbnVtYmVyOyBpZiB0aGUgdG9rZW4gaXMgbm90IHB1bmN0dWF0aW9uLCBpdCdzIGEgVF9TVFJJTkcuICBFYWNoIHRva2VuCi0gKiByZWFkIGRlY3JlbWVudHMgZHVtYl9tb2RlLCBzbyB5b3UgY2FuIGluc3RydWN0IHRoZSB0aGUgbGV4ZXIgdG8gcmVhZCB0aGUKLSAqIG5leHQgTiB0b2tlbnMgaW4gZHVtYiBtb2RlIGJ5IHNldHRpbmcgImR1bWJfbW9kZSIgdG8gdGhhdCB2YWx1ZS4KLSAqCi0gKiBOZXdsaW5lcyBhcmUgaW4gZ2VuZXJhbCBzaWxlbnRseSBpZ25vcmVkLiAgSWYgdGhlIGdsb2JhbCBubF90b2tlbiBpcwotICogdHJ1ZSwgaG93ZXZlciwgdGhleSBhcmUgcmV0dXJuZWQgYXMgdGhlIHRva2VuIEtfTkwuCi0gKi8KLQotaW50IAotZGVmckRhdGE6OmRlZnl5bGV4KFlZU1RZUEUgKnBZeWx2YWwpIHsKLQotICAgaW50IHYgPSBzdWJsZXgocFl5bHZhbCk7Ci0gICBpZiAoZGVmUHJpbnRUb2tlbnMpIHsKLSAgICAgIGlmICh2ID09IDApIHsKLSAgICAgICAgIHByaW50ZigieXlsZXggTklMXG4iKTsKLSAgICAgIH0gZWxzZSBpZiAodiA8IDI1NikgewotICAgICAgICAgcHJpbnRmKCJ5eWxleCBjaGFyICVjXG4iLCB2KTsKLSAgICAgIH0gZWxzZSBpZiAodiA9PSBRU1RSSU5HKSB7Ci0gICAgICAgICBwcmludGYoInl5bGV4IHF1b3RlZCBzdHJpbmcgJyVzJ1xuIiwgcFl5bHZhbC0+c3RyaW5nKTsKLSAgICAgIH0gZWxzZSBpZiAodiA9PSBUX1NUUklORykgewotICAgICAgICAgcHJpbnRmKCJ5eWxleCBzdHJpbmcgJyVzJ1xuIiwgcFl5bHZhbC0+c3RyaW5nKTsKLSAgICAgIH0gZWxzZSBpZiAodiA9PSBOVU1CRVIpIHsKLSAgICAgICAgIHByaW50ZigieXlsZXggbnVtYmVyICVmXG4iLCBwWXlsdmFsLT5kdmFsKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICBwcmludGYoInl5bGV4IGtleXdvcmQgJXNcbiIsIGRlZnJEYXRhOjpkZWZreXdkKHYpKTsKLSAgICAgIH0KLSAgIH0KLQotICAgaWYgKCh2ID09IDApICYmICghZG9uZURlc2lnbikpIHsKLSAgICAgIGRlZkVycm9yKDYwMDIsICJJbmNvbXBsZXRlIGRlZiBmaWxlLiIpOwotICAgICAgLy8gU3RvcCBwcmludGluZyBlcnJvciBtZXNzYWdlcyBhZnRlciB0aGUgRU9GLiAKLSAgICAgIGhhc0ZhdGFsRXJyb3IgPSAxOyAKLSAgICAgIHJldHVybiAoLTEpOwotICAgfQotCi0gICByZXR1cm4gdjsKLX0KLQotaW50IAotZGVmckRhdGE6OnN1YmxleChZWVNUWVBFICpwWXlsdmFsKQotewotICAgY2hhciBmYzsKLSAgIGRvdWJsZSBudW1WYWw7Ci0gICBjaGFyKiAgb3V0TXNnOwotCi0gICBwdl9kZWZ0b2tlbiA9IChjaGFyKilyZWFsbG9jKHB2X2RlZnRva2VuLCBkZWZ0b2tlbkxlbmd0aCk7Ci0gICBzdHJjcHkocHZfZGVmdG9rZW4sIGRlZnRva2VuKTsKLQotICAgLyogRmlyc3QsIHdlIGVhdCBhbGwgdGhlIHRoaW5ncyB0aGUgcGFyc2VyIHNob3VsZCBiZSB1bmF3YXJlIG9mLgotICAgICogVGhpcyBpbmNsdWRlczoKLSAgICAqIGEpIENvbW1lbnRzCi0gICAgKiBiKSAmYWxpYXMgZGVmaW5pdGlvbnMKLSAgICAqIGMpICZhbGlhcyBleHBhbnNpb25zCi0gICAgKi8KLSAgIGZvcig7OykgewotICAgICAgaWYoIURlZkdldFRva2VuKCZkZWZ0b2tlbiwgJmRlZnRva2VuTGVuZ3RoKSkgeyAgICAvKiBnZXQgYSByYXcgdG9rZW4gKi8KLSAgICAgICAgIHJldHVybiAwOwotICAgICAgfQotICAgICAgZmMgPSBkZWZ0b2tlblswXTsKLSAgICAgIHVjX3Rva2VuID0gKGNoYXIqKXJlYWxsb2ModWNfdG9rZW4sIGRlZnRva2VuTGVuZ3RoKTsKLQotICAgICAgLyogZmlyc3QsIGNoZWNrIGZvciAjIGNvbW1lbnRzIG9yICZhbGlhcyBzdGF0ZW1lbnRzLiAgIyBjb21tZW50cwotICAgICAgd2UgaWdub3JlLCBhbmQgJmFsaWFzIHN0YXRlbWVudHMgYXJlIGVhdGVuIGFuZCByZWNvcmRlZCBieSB0aGUKLSAgICAgIGxleGVyLiAqLwotICAgICAgaWYgKGZjID09IHNldHRpbmdzLT5Db21tZW50Q2hhcikgewotICAgICAgICAgLy8gVGhlIGNvZGUgaXNuJ3Qgd29yayBpbiBjb3JyZWN0IHdheSwgbm8gd2F5IHRvIGZpeCBpdCBleGl0cyAKLSAgICAgICAgIC8vIGJ1dCBrZWVwIGl0IGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuIAotICAgICAgICAgaW50IG1hZ2ljX2NvdW50ID0gLTE7Ci0gICAgICAgICBmb3IoZmMgPSBHRVRDKCk7OyBmYyA9IEdFVEMoKSkgey8qIHNvIHNraXAgdG8gdGhlIGVuZCBvZiBsaW5lICovCi0gICAgICAgICAgICBtYWdpY19jb3VudCsrOwotICAgICAgICAgICAgaWYgKChtYWdpY19jb3VudCA8IChpbnQpc3RybGVuKG1hZ2ljKSkgJiYgKGZjID09IG1hZ2ljW21hZ2ljX2NvdW50XSkpIHsKLSAgICAgICAgICAgICAgaWYgKChpbnQpc3RybGVuKG1hZ2ljKSA9PSAobWFnaWNfY291bnQgKyAxKSkgewotICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy0+TWFnaWNDb21tZW50Rm91bmRGdW5jdGlvbikgewotICAgICAgICAgICAgICAgICAgc2V0dGluZ3MtPk1hZ2ljQ29tbWVudEZvdW5kRnVuY3Rpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmYyA9PSBFT0YpIHJldHVybiAwOwotICAgICAgICAgICAgaWYgKGZjID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICBwcmludF9saW5lcygrK25saW5lcyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChmYyA9PSAnJicpIHsKLSAgICAgICAgIC8qIGJlZ2lucyB3aXRoICYuICBJZiAmYWxpYXMsIHJlYWQgY29udGVudHMgYW5kICovCi0gICAgICAgICAvKiBzdG9yZSB0aGVtLiAgT3RoZXJ3aXNlIGl0J3MgYSBkZWZpbmUsIG9yIGEgbWFjcm8gdXNlLiAqLwotICAgICAgICAgc3RyaW5nIGFsaWFzOwotICAgICAgICAgdWNfYXJyYXkoZGVmdG9rZW4sIHVjX3Rva2VuKTsKLQotICAgICAgICAgaWYgKHN0cmNtcCh1Y190b2tlbiwiJkFMSUFTIikgPT0gMCkKLSAgICAgICAgICAgIFN0b3JlQWxpYXMoKTsgICAgLyogcmVhZCBhbmQgc3RvcmUgdGhlIGFsaWFzICovCi0gICAgICAgICBlbHNlIGlmIChkZWZHZXRBbGlhcyhkZWZ0b2tlbiwgYWxpYXMpKQotICAgICAgICAgICAgc3RhY2tbKytpbnB1dF9sZXZlbF0gPSBhbGlhczsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGJyZWFrOyAgICAvKiBiZWdpbnMgd2l0aCAmLCBidXQgbm90IGFuICZhbGlhcyBkZWZuLiBvciB1c2UuICovCi0gICAgICB9IGVsc2UKLSAgICAgICAgIGJyZWFrOyAgICAvKiBkb2VzIG5vdCBiZWdpbiB3aXRoIGNvbW1lbnRDaGFyIG9yICcmJyAqLwotICAgfQotCi0gICBpZiAoZGVmSW52YWxpZENoYXIpIHsKLSAgICAgIG91dE1zZyA9IChjaGFyKiltYWxsb2MoNTAwICsgc3RybGVuKGRlZnRva2VuKSk7Ci0gICAgICBzcHJpbnRmKG91dE1zZywgIkludmFsaWQgY2hhcmFjdGVycyBmb3VuZCBpbiBcJyVzXCcuXG5UaGVzZSBjaGFyYWN0ZXJzIG1pZ2h0IGJlIHVzaW5nIHRoZSBjaGFyYWN0ZXIgdHlwZXMgb3RoZXIgdGhhbiBFbmdsaXNoLlxuQ3JlYXRlIGNoYXJhY3RlcnMgYnkgc3BlY2lmeWluZyB2YWxpZCBjaGFyYWN0ZXJzIHR5cGVzLiIsCi0gICAgICAgICAgICAgIGRlZnRva2VuKTsKLSAgICAgIGRlZkVycm9yKDYwMDgsIG91dE1zZyk7Ci0gICAgICBmcmVlKG91dE1zZyk7Ci0gICAgICBoYXNGYXRhbEVycm9yID0gMTsKLSAgICAgIHJldHVybiAwOwotICAgfQotCi0gICBpZiAoZG9uZURlc2lnbikgewotICAgICAgZmMgPSBFT0Y7Ci0gICAgICBkZWZJbmZvKDgwMDAsICJUaGVyZSBhcmUgc3RpbGwgZGF0YSBhZnRlciB0aGUgRU5EIERFU0lHTiBzdGF0ZW1lbnQiKTsKLSAgICAgIHJldHVybiAwOyAgICAKLSAgIH0KLQotICAgaWYoZmMgPT0gJ1wiJykgewotICAgICAgcFl5bHZhbC0+c3RyaW5nID0gcmluZ0NvcHkoJihkZWZ0b2tlblsxXSkpOwotCi0gICAgICByZXR1cm4gUVNUUklORzsKLSAgIH0KLQotICAgLyogYXQgdGhpcyBwb2ludCB3ZSd2ZSByZWFkIGEgdG9rZW4gKi8KLSAgIC8qIHByaW50ZigiVG9rZW4gaXMgJXNcbiIsIGRlZnRva2VuKTsgKi8KLSAgIAotICAgLy8gUHJvdGVjdCB0aGUgdG9rZW4gY291bnRpbmcgdmFyaWFibGVzIGZvcm0gdGhlIGRlY3JlbWVudCBvdmVyZmxvdy4KLSAgIGlmIChkdW1iX21vZGUgPj0gMCkgewotICAgICAgIGR1bWJfbW9kZS0tOwotICAgfQotCi0gICBpZiAobm9fbnVtID49IDApIHsKLSAgICAgICBub19udW0tLTsKLSAgIH0KLQotICAgaWYgKGlzZGlnaXQoZmMpIHx8IGZjID09ICcuJyB8fCAoZmMgPT0gJy0nICYmIGRlZnRva2VuWzFdICE9ICdcMCcpICkgewotICAgICAgY2hhciAqY2g7Ci0gICAgICAvKiA2LzEyLzIwMDMgLSBUaGUgZm9sbG93aW5nIHN3aXRjaGluZyB0byB1c2Ugc3RydG9sIGZpcnN0IGlzIGEgZml4ICovCi0gICAgICAvKiBmb3IgRkUgZm9yIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50LiAqLwotICAgICAgLyogQWRkaW5nIHRoZSBmbGFnICJwYXJzaW5nX3Byb3BlcnR5IiBpcyBmb3IgcGNyIDU5NDIxNCwgbmVlZCB0byBjYWxsICovCi0gICAgICAvKiBzdHJ0b2QgZmlyc3QgdG8gaGFuZGxlIGRvdWJsZSBudW1iZXIgaW5zaWRlIFBST1BFUlRZLiAgT25seSAgICAgICAgKi8KLSAgICAgIC8qIHByb3BlcnR5IGhhcyByZWFsIG51bWJlciAobGFyZ2UgbnVtYmVyKSAqLwotICAgICAgaWYgKCFyZWFsX251bSkgewotICAgICAgICAgcFl5bHZhbC0+ZHZhbCA9IHN0cnRvbChkZWZ0b2tlbiwgJmNoLCAxMCk7IC8qIHRyeSBzdHJpbmcgdG8gbG9uZyBmaXJzdCAqLwotICAgICAgICAgaWYgKG5vX251bSA8IDAgJiYgKmNoID09ICdcMCcpIHsgLyogZGlkIHdlIHVzZSB0aGUgd2hvbGUgc3RyaW5nPyAqLwotICAgICAgICAgICAgcmV0dXJuIE5VTUJFUjsKLSAgICAgICAgIH0gZWxzZSB7ICAvKiBmYWlsZWQgc3RydG9sLCB0cnkgZG91YmxlICovCi0gICAgICAgICAgICBudW1WYWwgPSBwWXlsdmFsLT5kdmFsID0gc3RydG9kKGRlZnRva2VuLCAmY2gpOwotICAgICAgICAgICAgaWYgKG5vX251bSA8IDAgJiYgKmNoID09ICdcMCcpIHsgIC8qIGRpZCB3ZSB1c2UgdGhlIHdob2xlIHN0cmluZz8gKi8KLSAgICAgICAgICAgICAgIC8qIGNoZWNrIGlmIHRoZSBpbnRlZ2VyIGhhcyBleGNlZWQgdGhlIGxpbWl0ICovCi0gICAgICAgICAgICAgICBpZiAoKG51bVZhbCA+PSBsVmFsKSAmJiAobnVtVmFsIDw9IHJWYWwpKQotICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTUJFUjsgICAgLyogWUVTLCBpdCdzIHJlYWxseSBhIG51bWJlciAqLwotICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICBjaGFyKiBzdHIgPSAoY2hhciopbWFsbG9jKHN0cmxlbihkZWZ0b2tlbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArc3RybGVuKHNlc3Npb24tPkZpbGVOYW1lKSszNTApOwotICAgICAgICAgICAgICAgICAgc3ByaW50ZihzdHIsCi0gICAgICAgICAgICAgICAgICAgICI8TnVtYmVyIGhhcyBleGNlZWQgdGhlIGxpbWl0IGZvciBhbiBpbnRlZ2VyPiBpbiAlcyBhdCBsaW5lICVzXG4iLAotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5GaWxlTmFtZSwgbGluZXMyc3RyKG5saW5lcykpOwotICAgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7Ci0gICAgICAgICAgICAgICAgICBkZWZpRXJyb3IoMSwgMCwgc3RyKTsKLSAgICAgICAgICAgICAgICAgIGZyZWUoc3RyKTsKLSAgICAgICAgICAgICAgICAgIGVycm9ycysrOwotICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTUJFUjsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgcFl5bHZhbC0+c3RyaW5nID0gcmluZ0NvcHkoZGVmdG9rZW4pOyAgLyogTk8sIGl0J3MgYSBzdHJpbmcgKi8KLSAgICAgICAgICAgICAgIHJldHVybiBUX1NUUklORzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0gZWxzZSB7ICAvKiBoYW5kbGluZyBQUk9QRVJUWSwgZG8gc3RydG9kIGZpcnN0IGluc3RlYWQgb2Ygc3RydG9sICovCi0gICAgICAgICBudW1WYWwgPSBwWXlsdmFsLT5kdmFsID0gc3RydG9kKGRlZnRva2VuLCAmY2gpOwotICAgICAgICAgaWYgKG5vX251bSA8IDAgJiYgKmNoID09ICdcMCcpIHsgLyogZGlkIHdlIHVzZSB0aGUgd2hvbGUgc3RyaW5nPyAqLwotICAgICAgICAgICAgLyogY2hlY2sgaWYgdGhlIGludGVnZXIgaGFzIGV4Y2VlZCB0aGUgbGltaXQgKi8KLSAgICAgICAgICAgIGlmIChyZWFsX251bSkgICAgLyogdGhpcyBpcyBmb3IgUFJPUEVSVFlERUYgd2l0aCBSRUFMICovCi0gICAgICAgICAgICAgICByZXR1cm4gTlVNQkVSOwotICAgICAgICAgICAgaWYgKChudW1WYWwgPj0gbFZhbCkgJiYgKG51bVZhbCA8PSByVmFsKSkgCi0gICAgICAgICAgICAgICByZXR1cm4gTlVNQkVSOyAgICAvKiBZRVMsIGl0J3MgcmVhbGx5IGEgbnVtYmVyICovCi0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgIGNoYXIqIHN0ciA9IChjaGFyKiltYWxsb2Moc3RybGVuKGRlZnRva2VuKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArc3RybGVuKHNlc3Npb24tPkZpbGVOYW1lKSszNTApOwotICAgICAgICAgICAgICAgc3ByaW50ZihzdHIsCi0gICAgICAgICAgICAgICAgICI8TnVtYmVyIGhhcyBleGNlZWQgdGhlIGxpbWl0IGZvciBhbiBpbnRlZ2VyPiBpbiAlcyBhdCBsaW5lICVzXG4iLAotICAgICAgICAgICAgICAgICBzZXNzaW9uLT5GaWxlTmFtZSwgbGluZXMyc3RyKG5saW5lcykpOwotICAgICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7Ci0gICAgICAgICAgICAgICBkZWZpRXJyb3IoMSwgMCwgc3RyKTsKLSAgICAgICAgICAgICAgIGZyZWUoc3RyKTsKLSAgICAgICAgICAgICAgIGVycm9ycysrOwotICAgICAgICAgICAgICAgcmV0dXJuIE5VTUJFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0gZWxzZSB7ICAvKiBmYWlsZWQgaW50ZWdlciBjb252ZXJzaW9uLCB0cnkgZmxvYXRpbmcgcG9pbnQgKi8KLSAgICAgICAgICAgIHBZeWx2YWwtPmR2YWwgPSBzdHJ0b2woZGVmdG9rZW4sICZjaCwgMTApOwotICAgICAgICAgICAgaWYgKG5vX251bSA8IDAgJiYgKmNoID09ICdcMCcpICAvKiBkaWQgd2UgdXNlIHRoZSB3aG9sZSBzdHJpbmc/ICovCi0gICAgICAgICAgICAgICByZXR1cm4gTlVNQkVSOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICBwWXlsdmFsLT5zdHJpbmcgPSByaW5nQ29weShkZWZ0b2tlbik7ICAvKiBOTywgaXQncyBhIHN0cmluZyAqLwotICAgICAgICAgICAgICAgcmV0dXJuIFRfU1RSSU5HOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgfQotICAgICAgCi0gICAvKiBpZiB3ZSBhcmUgZHVtYiBtb2RlLCBhbGwgd2UgcmV0dXJuIGlzIHB1bmN0dWF0aW9uIGFuZCBzdHJpbmdzICYgbnVtYmVycyovCi0gICAvKiB1bnRpbCB3ZSBzZWUgdGhlIG5leHQgJysnIG9yICc7JyBkZWZ0b2tlbiAqLwotICAgaWYgKGR1bWJfbW9kZSA+PSAwKSB7Ci0gICAgICBpZiAoZGVmdG9rZW5bMV09PSdcMCcgJiYgKGZjPT0nKCd8fGZjPT0nKSd8fGZjPT0nKyd8fGZjPT0nOyd8fGZjPT0nKicpKXsKLSAgICAgIAotICAgICAgICAgaWYgKGZjID09ICc7JyB8fCAgZmMgPT0gJysnKSB7Ci0gICAgICAgICAgICBkdW1iX21vZGUgPSAwOwotICAgICAgICAgICAgbm9fbnVtID0gMDsKLSAgICAgICAgIH0gICAKLSAgICAgICAgIHJldHVybiAoaW50KWZjOwotICAgICAgfQotICAgICAgaWYgKGJ5X2lzX2tleXdvcmQgICYmICgoc3RyY21wKGRlZnRva2VuLCJCWSIpID09IDApIHx8Ci0gICAgICAgICAgKHN0cmNtcChkZWZ0b2tlbiwgImJ5IikgPT0gMCkpKSB7Ci0gICAgICAgICByZXR1cm4gS19CWTsgLyogZXZlbiBpbiBkdW1iIG1vZGUsIHdlIG11c3Qgc2VlIHRoZSBCWSBkZWZ0b2tlbiAqLwotICAgICAgfQotICAgICAgaWYgKGRvX2lzX2tleXdvcmQgICYmICgoc3RyY21wKGRlZnRva2VuLCJETyIpID09IDApIHx8Ci0gICAgICAgICAgKHN0cmNtcChkZWZ0b2tlbiwgImRvIikgPT0gMCkpKSB7Ci0gICAgICAgICByZXR1cm4gS19ETzsgLyogZXZlbiBpbiBkdW1iIG1vZGUsIHdlIG11c3Qgc2VlIHRoZSBETyBkZWZ0b2tlbiAqLwotICAgICAgfQotICAgICAgaWYgKG5ld19pc19rZXl3b3JkICAmJiAoKHN0cmNtcChkZWZ0b2tlbiwiTkVXIikgPT0gMCkgfHwKLSAgICAgICAgICAoc3RyY21wKGRlZnRva2VuLCAibmV3IikgPT0gMCkpKSB7Ci0gICAgICAgICByZXR1cm4gS19ORVc7IC8qIGV2ZW4gaW4gZHVtYiBtb2RlLCB3ZSBtdXN0IHNlZSB0aGUgTkVXIGRlZnRva2VuICovCi0gICAgICB9Ci0gICAgICBpZiAobm9uZGVmX2lzX2tleXdvcmQgJiYgKChzdHJjbXAoZGVmdG9rZW4sICJOT05ERUZBVUxUUlVMRSIpID09IDApIHx8Ci0gICAgICAgICAgKHN0cmNtcChkZWZ0b2tlbiwgIm5vbmRlZmF1bHRydWxlIikgPT0gMCkpKXsKLSAgICAgICAgICByZXR1cm4gS19OT05ERUZBVUxUUlVMRTsgLyogZXZlbiBpbiBkdW1iIG1vZGUsIHdlIG11c3Qgc2VlIHRoZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOT05ERUZBVUxUUlVMRSBkZWZ0b2tlbiAqLwotICAgICAgfQotICAgICAgaWYgKG11c3Rqb2luX2lzX2tleXdvcmQgJiYgKChzdHJjbXAoZGVmdG9rZW4sICJNVVNUSk9JTiIpID09IDApIHx8Ci0gICAgICAgICAgKHN0cmNtcChkZWZ0b2tlbiwgIm11c3Rqb2luIikgPT0gMCkpKSB7Ci0gICAgICAgICAgcmV0dXJuIEtfTVVTVEpPSU47IC8qIGV2ZW4gaW4gZHVtYiBtb2RlLCB3ZSBtdXN0IHNlZSB0aGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTVVTVEpPSU4gZGVmdG9rZW4gKi8KLSAgICAgIH0KLSAgICAgIGlmIChzdGVwX2lzX2tleXdvcmQgICYmICgoc3RyY21wKGRlZnRva2VuLCJTVEVQIikgPT0gMCkgfHwKLSAgICAgICAgICAoc3RyY21wKGRlZnRva2VuLCAic3RlcCIpID09IDApKSkgewotICAgICAgICAgIHJldHVybiBLX1NURVA7LyogZXZlbiBpbiBkdW1iIG1vZGUsIHdlIG11c3Qgc2VlIHRoZSBTVEVQIGRlZnRva2VuICovCi0gICAgICB9Ci0gICAgICBpZiAoZml4ZWRfaXNfa2V5d29yZCAgJiYgKChzdHJjbXAoZGVmdG9rZW4sIkZJWEVEIikgPT0gMCkgfHwKLSAgICAgICAgICAoc3RyY21wKGRlZnRva2VuLCAiZml4ZWQiKSA9PSAwKSkpIHsKLSAgICAgICAgIHJldHVybiBLX0ZJWEVEOyAvKiBldmVuIGluIGR1bWIgbW9kZSwgd2UgbXVzdCBzZWUgdGhlIEZJWEVEIGRlZnRva2VuICovCi0gICAgICB9ICAKLSAgICAgIGlmIChjb3Zlcl9pc19rZXl3b3JkICAmJiAoKHN0cmNtcChkZWZ0b2tlbiwiQ09WRVIiKSA9PSAwKSB8fAotICAgICAgICAgIChzdHJjbXAoZGVmdG9rZW4sICJjb3ZlciIpID09IDApKSkgewotICAgICAgICAgcmV0dXJuIEtfQ09WRVI7IC8qIGV2ZW4gaW4gZHVtYiBtb2RlLCB3ZSBtdXN0IHNlZSB0aGUgQ09WRVIgZGVmdG9rZW4gKi8KLSAgICAgIH0KLSAgICAgIGlmIChyb3V0ZWRfaXNfa2V5d29yZCAgJiYgKChzdHJjbXAoZGVmdG9rZW4sIlJPVVRFRCIpID09IDApIHx8Ci0gICAgICAgICAgKHN0cmNtcChkZWZ0b2tlbiwgInJvdW50ZWQiKSA9PSAwKSkpIHsKLSAgICAgICAgIHJldHVybiBLX1JPVVRFRDsgLyogZXZlbiBpbiBkdW1iIG1vZGUsIHdlIG11c3Qgc2VlIHRoZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBST1VURUQgZGVmdG9rZW4gKi8KLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKHZpcnR1YWxfaXNfa2V5d29yZCAmJiAoKHN0cmNtcChkZWZ0b2tlbiwgIlZJUlRVQUwiKSA9PSAwICkKLSAgICAgICAgIHx8IChzdHJjbXAoZGVmdG9rZW4sICJ2aXJ0dWFsIikgPT0gMCApKSkgewotICAgICAgICAgcmV0dXJuIEtfVklSVFVBTDsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKHJlY3RfaXNfa2V5d29yZCAmJiAoKHN0cmNtcChkZWZ0b2tlbiwgIlJFQ1QiKSA9PSAwICkKLSAgICAgICAgIHx8IChzdHJjbXAoZGVmdG9rZW4sICJyZWN0IikgPT0gMCApKSkgewotICAgICAgICAgcmV0dXJuIEtfUkVDVDsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKHZpcnR1YWxfaXNfa2V5d29yZCAmJiAoKHN0cmNtcChkZWZ0b2tlbiwgIk1BU0siKSA9PSAwICkKLSAgICAgICAgIHx8IChzdHJjbXAoZGVmdG9rZW4sICJtYXNrIikgPT0gMCApKSkgewotICAgICAgICAgcmV0dXJuIEtfTUFTSzsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKG9yaWVudF9pc19rZXl3b3JkKSB7Ci0gICAgICAgICBpbnQgcmVzdWx0OwotICAgICAgICAgdWNfYXJyYXkoZGVmdG9rZW4sIHVjX3Rva2VuKTsKLQotICAgICAgICAgaWYgKGRlZkdldEtleXdvcmQodWNfdG9rZW4sICZyZXN1bHQpKSB7Ci0gICAgICAgICAgICBpZiAoS19OID09IHJlc3VsdCkKLSAgICAgICAgICAgICAgICByZXR1cm4gS19OOwotICAgICAgICAgICAgaWYgKEtfVyA9PSByZXN1bHQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEtfVzsKLSAgICAgICAgICAgIGlmIChLX1MgPT0gcmVzdWx0KQotICAgICAgICAgICAgICAgIHJldHVybiBLX1M7Ci0gICAgICAgICAgICBpZiAoS19FID09IHJlc3VsdCkKLSAgICAgICAgICAgICAgICByZXR1cm4gS19FOwotICAgICAgICAgICAgaWYgKEtfRk4gPT0gcmVzdWx0KQotICAgICAgICAgICAgICAgIHJldHVybiBLX0ZOOwotICAgICAgICAgICAgaWYgKEtfRlcgPT0gcmVzdWx0KQotICAgICAgICAgICAgICAgIHJldHVybiBLX0ZXOwotICAgICAgICAgICAgaWYgKEtfRlMgPT0gcmVzdWx0KQotICAgICAgICAgICAgICAgIHJldHVybiBLX0ZTOwotICAgICAgICAgICAgaWYgKEtfRkUgPT0gcmVzdWx0KQotICAgICAgICAgICAgaWYgKHN0cmNtcChkZWZ0b2tlbiwgIkZFIikgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gS19GRTsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHBZeWx2YWwtPnN0cmluZyA9IHJpbmdDb3B5KGRlZnRva2VuKTsKLSAgICAgIHJldHVybiBUX1NUUklORzsKLSAgIH0KLQotICAgLyogaWYgd2UgZ2V0IGhlcmUgd2UgYXJlIGluIHNtYXJ0IG1vZGUuICBQYXJzZSBkZWZ0b2tlbiAqLwotICAgLyogMi8xOS8yMDA0IC0gYWRkIF8gc2luY2UgbmFtZSBjYW4gc3RhcnRzIHdpdGggJ18nICovCi0gICAvKiAyLzIzLzIwMDQgLSBhZGQgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIHdoaWNoIGEgbmFtZSBjYW4gc3RhcnRzIHdpdGggKi8KLSAgIC8qICAgICEgJCB8IDogLCBAIH4gPSA8IC4gPyB7ICcgXiAiICovCi0gICBpZiAoaXNhbHBoYShmYykgfHwgZmMgPT0gJyYnIHx8IGZjID09ICdfJykgewotICAgICAgaW50IHJlc3VsdDsKLQotICAgICAgSGlzdG9yeV90ZXh0LnJlc2l6ZSgwKTsKLSAgICAgIHVjX2FycmF5KGRlZnRva2VuLCB1Y190b2tlbik7Ci0KLSAgICAgIGlmIChkZWZHZXRLZXl3b3JkKHVjX3Rva2VuLCAmcmVzdWx0KSkgewotICAgICAgICAgaWYgKEtfSElTVE9SWSA9PSByZXN1bHQpIHsgIC8qIGhpc3RvcnkgLSBnZXQgdXAgdG8gJzsnICovCi0gICAgICAgICAgICBpbnQgbjsKLSAgICAgICAgICAgIGludCBjOwotICAgICAgICAgICAgaW50IHByZXY7Ci0gICAgICAgICAgICBuID0gMDsKLSAgICAgICAgICAgIHByZXYgPSAnICc7Ci0gICAgICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgICAgYyA9IEdFVEMoKTsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgaWYgKGMgPT0gRU9GKSB7Ci0gICAgICAgICAgICAgICAgICAgZGVmRXJyb3IoNjAxNSwgIlVuZXhwZWN0ZWQgZW5kIG9mIHRoZSBERUYgZmlsZS4iKTsKLSAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgaWYgKGMgPT0gJzsnICYmIChwcmV2ID09ICcgJyB8fCBwcmV2ID09ICdcdCcgfHwgcHJldiA9PSAnXG4nKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBpZiAoYyA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50X2xpbmVzKCsrbmxpbmVzKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIHByZXYgPSBjOwotICAgICAgICAgICAgICAgSGlzdG9yeV90ZXh0LnB1c2hfYmFjayhjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEhpc3RvcnlfdGV4dC5wdXNoX2JhY2soJ1wwJyk7Ci0gICAgICAgICB9IGVsc2UgaWYgKEtfQkVHSU5FWFQgPT0gcmVzdWx0KSB7IC8qIGV4dGVuc2lvbiwgZ2V0IHVwIHRvIGVuZCAqLwotICAgICAgICAgICAgaW50IG5uOwotICAgICAgICAgICAgaW50IGNjOwotICAgICAgICAgICAgaW50IGZvdW5kVGFnID0gMDsKLSAgICAgICAgICAgIGludCBub3RFbXBUYWcgPSAwOwotICAgICAgICAgICAgaW50IGJlZ1F1b3RlID0gMDsKLSAgICAgICAgICAgIG5uID0gMDsKLSAgICAgICAgICAgIC8qIEZpcnN0IG1ha2Ugc3VyZSB0aGVyZSBpcyBhIG5hbWUgYWZ0ZXIgQkVHSU5FWFQgd2l0aGluIHF1b3RlICovCi0gICAgICAgICAgICAvKiBCRUdJTkVYVCAibmFtZSIgKi8KLSAgICAgICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICAgICBjYyA9IEdFVEMoKTsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgaWYgKGNjID09IEVPRikgewotICAgICAgICAgICAgICAgICAgIGRlZkVycm9yKDYwMTUsICJVbmV4cGVjdGVkIGVuZCBvZiB0aGUgREVGIGZpbGUuIik7Ci0gICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIGlmIChjYyA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kVGFnKSB7Ci0gICAgICAgICAgICAgICAgICAgICBkZWZFcnJvcig2MDAzLCAidGFnIGlzIG1pc3NpbmcgZm9yIEJFR0lORVhUIik7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICAgIEhpc3RvcnlfdGV4dC5wdXNoX2JhY2soY2MpOwotICAgICAgICAgICAgICAgICAgaWYgKGNjICE9ICcgJykgewotICAgICAgICAgICAgICAgICAgICAgaWYgKGNjID09ICdcIicpIHsgICAvKiBmb3VuZCBhIHF1b3RlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJlZ1F1b3RlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnUXVvdGUgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobm90RW1wVGFnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFRhZyA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAvKiBGb3VuZCB0aGUgcXVvdGVkIHRhZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZkVycm9yKDYwMDQsICJUaGUgQkVHSU5FWFQgdGFnIGlzIGVtcHR5LiBTcGVjaWZ5IGEgdmFsdWUgZm9yIHRoZSB0YWcgYW5kIHRyeSBhZ2Fpbi4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghYmVnUXVvdGUpIHsgICAvKiBhbnl0aGluZyBidXQgYSBxdW90ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmRXJyb3IoNjAwNSwgIlRoZSAnXCInIGlzIG1pc3Npbmcgd2l0aGluIHRoZSB0YWcuIFNwZWNpZnkgdGhlICdcIicgaW4gdGhlIHRhZyBhbmQgdGhlbiB0cnkgYWdhaW4uIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgIH0gIGVsc2UgICAgICAgICAgICAgLyogYW55dGhpbmcgYnV0IGEgcXVvdGUgYW5kIHRoZXJlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBub3RFbXBUYWcgPSAxOyAgIC8qIGlzIGFscmVhZHkgYSBxdW90ZSAqLwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZvdW5kVGFnKSB7Ci0gICAgICAgICAgICAgICAvKiBXZSBoYXZlIGhhbmRsZSB3aXRoIHRoZSB0YWcsIGp1c3QgcmVhZCB0aGUgcmVzdCB1bnRpbCAqLwotICAgICAgICAgICAgICAgLyogRU5ERVhUICovCi0gICAgICAgICAgICAgICBiZWdRdW90ZSA9IDA7Ci0gICAgICAgICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgICAgICAgY2MgPSBHRVRDKCk7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChjYyA9PSBFT0YpIHsKLSAgICAgICAgICAgICAgICAgICAgICBkZWZFcnJvcig2MDE1LCAiVW5leHBlY3RlZCBlbmQgb2YgdGhlIERFRiBmaWxlLiIpOwotICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICBpZiAoY2MgPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfbGluZXMoKytubGluZXMpOwotICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjYyA9PSAnXCInKSB7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoIWJlZ1F1b3RlKQotICAgICAgICAgICAgICAgICAgICAgICAgYmVnUXVvdGUgPSAxOwotICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgYmVnUXVvdGUgPSAwOwotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICBIaXN0b3J5X3RleHQucHVzaF9iYWNrKGNjKTsKLQotICAgICAgICAgICAgICAgICAgaW50IGhpc3RUZXh0U2l6ZSA9IEhpc3RvcnlfdGV4dC5zaXplKCk7Ci0KLSAgICAgICAgICAgICAgICAgIGlmIChoaXN0VGV4dFNpemUgPj0gNiAmJiBtZW1jbXAoJkhpc3RvcnlfdGV4dFtoaXN0VGV4dFNpemUgLSA2IF0sICJFTkRFWFQiLCA2KSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoYmVnUXVvdGUpCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZFcnJvcig2MDA2LCAiVGhlIGVuZGluZyAnXCInIGlzIG1pc3NpbmcgaW4gdGhlIHRhZy4gU3BlY2lmeSB0aGUgZW5kaW5nICdcIicgaW4gdGhlIHRhZyBhbmQgdGhlbiB0cnkgYWdhaW4uIik7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGlzdFRleHRTaXplID49IDEwICYmIG1lbWNtcCgmSGlzdG9yeV90ZXh0W2hpc3RUZXh0U2l6ZSAtIDEwIF0sICJFTkQgREVTSUdOIiwgMTApID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgIGRlZkVycm9yKDYwMDcsICJUaGUgRU5ERVhUIHN0YXRlbWVudCBpcyBtaXNzaW5nIGluIHRoZSBERUYgZmlsZS4gSW5jbHVkZSB0aGUgc3RhdGVtZW50IGFuZCB0aGVuIHRyeSBhZ2Fpbi4iKTsKLSAgICAgICAgICAgICAgICAgICAgIG5saW5lcy0tOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBIaXN0b3J5X3RleHQucHVzaF9iYWNrKCdcMCcpOwotICAgICAgICAgfQotICAgICAgICAgcmV0dXJuIHJlc3VsdDsgICAgICAgIC8qIFlFUywgcmV0dXJuIGl0cyB2YWx1ZSAqLwotICAgICAgfSBlbHNlIHsgIC8qIHdlIGRvbid0IGhhdmUgYSBrZXl3b3JkLiAgKi8KLSAgICAgICAgIGlmIChmYyA9PSAnJicpCi0gICAgICAgICByZXR1cm4gYW1wZXJfbG9va3VwKHBZeWx2YWwsIGRlZnRva2VuKTsKLSAgICAgICAgIHBZeWx2YWwtPnN0cmluZyA9IHJpbmdDb3B5KGRlZnRva2VuKTsgIC8qIE5PLCBpdCdzIGEgc3RyaW5nICovCi0gICAgICAgICByZXR1cm4gVF9TVFJJTkc7Ci0gICAgICB9Ci0gICB9IGVsc2UgeyAgLyogaXQgc2hvdWxkIGJlIGEgcHVuY3R1YXRpb24gY2hhcmFjdGVyICovCi0gICAgICBpZiAoZGVmdG9rZW5bMV0gIT0gJ1wwJykgewotICAgICAgICAgaWYgKHN0cmNtcChkZWZ0b2tlbiwgIj49IikgPT0gMCkgcmV0dXJuIEtfR0U7Ci0gICAgICAgICBpZiAoc3RyY21wKGRlZnRva2VuLCAiPD0iKSA9PSAwKSByZXR1cm4gS19MRTsKLSAgICAgICAgIGlmIChzdHJjbXAoZGVmdG9rZW4sICI8PiIpID09IDApIHJldHVybiBLX05FOwotCi0gICAgICAgICBkZWZFcnJvcig2MDE3LCAiT2RkIHB1bmN0dWF0aW9uIGZvdW5kLiIpOwotICAgICAgICAgaGFzRmF0YWxFcnJvciA9IDE7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmxlbihkZWZ0b2tlbikgPiAyCi0gICAgICAgICAgICAgICAgIHx8IHN0cmxlbihkZWZ0b2tlbikgPT0gMCkgewotICAgICAgICAgIGRlZkVycm9yKDYwMTcsICJPZGQgcHVuY3R1YXRpb24gZm91bmQuIik7Ci0gICAgICAgICAgaGFzRmF0YWxFcnJvciA9IDE7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gKGludClkZWZ0b2tlblswXTsKLSAgIH0KLX0KLQotLyogV2UgaGF2ZSBmb3VuZCBhIGRlZnRva2VuIGJlZ2lubmluZyB3aXRoICcmJy4gIElmIGl0IGhhcyBiZWVuIHByZXZpb3VzbHkKLSAgIGRlZmluZWQsIHN1YnN0aXR1dGUgdGhlIGRlZmluaXRpb24uICBPdGhlcndpc2UgcmV0dXJuIGl0LiAqLwotaW50IAotZGVmckRhdGE6OmFtcGVyX2xvb2t1cChZWVNUWVBFICpwWXlsdmFsLCBjaGFyICp0a24pCi17Ci0gICBzdHJpbmcgICBkZWZWYWx1ZTsKLQotICAgLyogcHJpbnRmKCJBbXBlcl9sb29rdXA6ICVzXG4iLCB0a24pOyAqLwotCi0gICAvKiAmZGVmaW5lcyByZXR1cm5zIGEgVF9TVFJJTkcgKi8KLSAgIGlmIChkZWZHZXREZWZpbmUodGtuLCBkZWZWYWx1ZSkpIHsKLSAgICAgIGludCB2YWx1ZTsKLSAgICAgIGlmIChkZWZHZXRLZXl3b3JkKGRlZlZhbHVlLmNfc3RyKCksICZ2YWx1ZSkpCi0gICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICBpZiAoZGVmVmFsdWUuY19zdHIoKVswXSA9PSAnIicpCi0gICAgICAgICBwWXlsdmFsLT5zdHJpbmcgPSByaW5nQ29weShkZWZWYWx1ZS5jX3N0cigpKzEpOwotICAgICAgZWxzZQotICAgICAgICAgcFl5bHZhbC0+c3RyaW5nID0gcmluZ0NvcHkoZGVmVmFsdWUuY19zdHIoKSk7Ci0gICAgICByZXR1cm4gKGRlZlZhbHVlLmNfc3RyKClbMF0gPT0gJ1wiJyA/IFFTVFJJTkcgOiBUX1NUUklORyk7Ci0gICB9Ci0gICAvKiBpZiBub25lIG9mIHRoZSBhYm92ZSwganVzdCByZXR1cm4gdGhlIGRlZnRva2VuLiAqLwotICAgcFl5bHZhbC0+c3RyaW5nID0gcmluZ0NvcHkodGtuKTsKLSAgIHJldHVybiBUX1NUUklORzsKLX0KLQotdm9pZCAKLWRlZnJEYXRhOjpkZWZFcnJvcihpbnQgbXNnTnVtLCBjb25zdCBjaGFyICpzKSB7Ci0gICBjaGFyKiBzdHI7Ci0gICBjb25zdCBjaGFyICAqY3VyVG9rZW4gPSBpc2dyYXBoKGRlZnRva2VuWzBdKSA/IGRlZnRva2VuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIjx1bnByaW50YWJsZT4iOwotICAgY29uc3QgY2hhciAgKnB2VG9rZW4gPSBpc2dyYXBoKHB2X2RlZnRva2VuWzBdKSA/IHB2X2RlZnRva2VuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIjx1bnByaW50YWJsZT4iOwotICAgaW50IGxlbiA9IHN0cmxlbihjdXJUb2tlbiktMTsKLSAgIGludCBwdkxlbiA9IHN0cmxlbihwdlRva2VuKS0xOwotCi0gICBpZiAoaGFzRmF0YWxFcnJvcikKLSAgICAgICByZXR1cm47Ci0gICBpZiAoKHNldHRpbmdzLT50b3RhbERlZk1zZ0xpbWl0ID4gMCkgJiYgKGRlZk1zZ1ByaW50ZWQgPj0gc2V0dGluZ3MtPnRvdGFsRGVmTXNnTGltaXQpKQotICAgICAgcmV0dXJuOwotICAgaWYgKHNldHRpbmdzLT5Nc2dMaW1pdFttc2dOdW0tNTAwMF0gPiAwKSB7Ci0gICAgICBpZiAobXNnTGltaXRbbXNnTnVtLTUwMDBdID49IHNldHRpbmdzLT5Nc2dMaW1pdFttc2dOdW0tNTAwMF0pCi0gICAgICAgICByZXR1cm47ICAgICAgICAgICAgIC8qIG92ZXIgdGhlIGxpbWl0ICovCi0gICAgICBtc2dMaW1pdFttc2dOdW0tNTAwMF0gPSBtc2dMaW1pdFttc2dOdW0tNTAwMF0gKyAxOwotICAgfQotCi0gICAvKiBQQ1IgNjkwNjc5LCBwcm9iYWJseSBtaXNzaW5nIHNwYWNlIGJlZm9yZSBhICc7JyAqLwotICAgaWYgKHN0cmNtcChzLCAicGFyc2UgZXJyb3IiKSA9PSAwKSB7Ci0gICAgICBpZiAoKGxlbiA+IDEpICYmIChkZWZ0b2tlbltsZW5dID09ICc7JykpIHsKLSAgICAgICAgIHN0ciA9IChjaGFyKiltYWxsb2MobGVuICsgc3RybGVuKHMpICsgc3RybGVuKHNlc3Npb24tPkZpbGVOYW1lKSArIDM1MCk7Ci0gICAgICAgICBzcHJpbnRmKHN0ciwgIkVSUk9SIChERUZQQVJTLSVkKTogJXMsIGZpbGUgJXMgYXQgbGluZSAlc1xuTGFzdCB0b2tlbiB3YXMgPCVzPiwgc3BhY2UgaXMgbWlzc2luZyBiZWZvcmUgPDs+XG4iLAotICAgICAgICAgICAgICBtc2dOdW0sIHMsIHNlc3Npb24tPkZpbGVOYW1lLCBsaW5lczJzdHIobmxpbmVzKSwgY3VyVG9rZW4pOwotICAgICAgfSBlbHNlIGlmICgocHZMZW4gPiAxKSAmJiAocHZfZGVmdG9rZW5bcHZMZW5dID09ICc7JykpIHsKLSAgICAgICAgIHN0ciA9IChjaGFyKiltYWxsb2MocHZMZW4gKyBzdHJsZW4ocykgKyBzdHJsZW4oc2Vzc2lvbi0+RmlsZU5hbWUpICsgMzUwKTsKLSAgICAgICAgIHNwcmludGYoc3RyLCAiRVJST1IgKERFRlBBUlMtJWQpOiAlcywgZmlsZSAlcyBhdCBsaW5lICVzXG5MYXN0IHRva2VuIHdhcyA8JXM+LCBzcGFjZSBpcyBtaXNzaW5nIGJlZm9yZSA8Oz5cbiIsCi0gICAgICAgICAgICAgIG1zZ051bSwgcywgc2Vzc2lvbi0+RmlsZU5hbWUsIGxpbmVzMnN0cihubGluZXMtMSksIHB2VG9rZW4pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgIHN0ciA9IChjaGFyKiltYWxsb2MobGVuICsgc3RybGVuKHNlc3Npb24tPkZpbGVOYW1lKSArIDM1MCk7Ci0gICAgICAgICBzcHJpbnRmKHN0ciwgIkVSUk9SIChERUZQQVJTLSVkKTogRGVmIHBhcnNlciBoYXMgZW5jb3VudGVyZWQgYW4gZXJyb3IgaW4gZmlsZSAlcyBhdCBsaW5lICVzLCBvbiB0b2tlbiAlcy5cblByb2JsZW0gY2FuIGJlIHN5bnRheCBlcnJvciBvbiB0aGUgZGVmIGZpbGUgb3IgYW4gaW52YWxpZCBwYXJhbWV0ZXIgbmFtZS5cbkRvdWJsZSBjaGVjayB0aGUgc3ludGF4IG9uIHRoZSBkZWYgZmlsZSB3aXRoIHRoZSBMRUZERUYgUmVmZXJlbmNlIE1hbnVhbC5cbiIsCi0gICAgICAgICAgICAgIG1zZ051bSwgc2Vzc2lvbi0+RmlsZU5hbWUsIGxpbmVzMnN0cihubGluZXMpLCBjdXJUb2tlbik7Ci0gICAgICB9Ci0gICB9IGVsc2UgaWYgKHN0cmNtcChzLCAic3ludGF4IGVycm9yIikgPT0gMCkgewotICAgICAgaWYgKChsZW4gPiAxKSAmJiAoZGVmdG9rZW5bbGVuXSA9PSAnOycpKSB7Ci0gICAgICAgICBzdHIgPSAoY2hhciopbWFsbG9jKGxlbiArIHN0cmxlbihzKSArIHN0cmxlbihzZXNzaW9uLT5GaWxlTmFtZSkgKyAzNTApOwotICAgICAgICAgc3ByaW50ZihzdHIsICJFUlJPUiAoREVGUEFSUy0lZCk6ICVzLCBmaWxlICVzIGF0IGxpbmUgJXNcbkxhc3QgdG9rZW4gd2FzIDwlcz4sIHNwYWNlIGlzIG1pc3NpbmcgYmVmb3JlIDw7PlxuIiwKLSAgICAgICAgICAgICAgbXNnTnVtLCBzLCBzZXNzaW9uLT5GaWxlTmFtZSwgbGluZXMyc3RyKG5saW5lcyksIGN1clRva2VuKTsKLSAgICAgIH0gZWxzZSBpZiAoKHB2TGVuID4gMSkgJiYgKHB2X2RlZnRva2VuW3B2TGVuXSA9PSAnOycpKSB7Ci0gICAgICAgICBzdHIgPSAoY2hhciopbWFsbG9jKHB2TGVuICsgc3RybGVuKHMpICsgc3RybGVuKHNlc3Npb24tPkZpbGVOYW1lKSArIDM1MCk7Ci0gICAgICAgICBzcHJpbnRmKHN0ciwgIkVSUk9SIChERUZQQVJTLSVkKTogJXMsIGZpbGUgJXMgYXQgbGluZSAlc1xuTGFzdCB0b2tlbiB3YXMgPCVzPiwgc3BhY2UgaXMgbWlzc2luZyBiZWZvcmUgPDs+XG4iLAotICAgICAgICAgICAgICBtc2dOdW0sIHMsIHNlc3Npb24tPkZpbGVOYW1lLCBsaW5lczJzdHIobmxpbmVzLTEpLCBwdlRva2VuKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICBzdHIgPSAoY2hhciopbWFsbG9jKGxlbiArIHN0cmxlbihzZXNzaW9uLT5GaWxlTmFtZSkgKyAzNTApOwotICAgICAgICAgc3ByaW50ZihzdHIsICJFUlJPUiAoREVGUEFSUy0lZCk6IERlZiBwYXJzZXIgaGFzIGVuY291bnRlcmVkIGFuIGVycm9yIGluIGZpbGUgJXMgYXQgbGluZSAlcywgb24gdG9rZW4gJXMuXG5Qcm9ibGVtIGNhbiBiZSBzeW50YXggZXJyb3Igb24gdGhlIGRlZiBmaWxlIG9yIGFuIGludmFsaWQgcGFyYW1ldGVyIG5hbWUuXG5Eb3VibGUgY2hlY2sgdGhlIHN5bnRheCBvbiB0aGUgZGVmIGZpbGUgd2l0aCB0aGUgTEVGREVGIFJlZmVyZW5jZSBNYW51YWwuXG4iLAotICAgICAgICAgICAgICBtc2dOdW0sIHNlc3Npb24tPkZpbGVOYW1lLCBsaW5lczJzdHIobmxpbmVzKSwgY3VyVG9rZW4pOwotICAgICAgfQotICAgfSBlbHNlIHsKLSAgICAgIHN0ciA9IChjaGFyKiltYWxsb2MobGVuICsgc3RybGVuKHMpICsgc3RybGVuKHNlc3Npb24tPkZpbGVOYW1lKSArIDM1MCk7Ci0gICAgICBzcHJpbnRmKHN0ciwgIkVSUk9SIChERUZQQVJTLSVkKTogJXMgRXJyb3IgaW4gZmlsZSAlcyBhdCBsaW5lICVzLCBvbiB0b2tlbiAlcy5cblVwZGF0ZSB0aGUgZGVmIGZpbGUgYmVmb3JlIHBhcnNpbmcgdGhlIGZpbGUgYWdhaW4uXG4iLAotICAgICAgICAgICBtc2dOdW0sIHMsIHNlc3Npb24tPkZpbGVOYW1lLCBsaW5lczJzdHIobmxpbmVzKSwgY3VyVG9rZW4pOwotICAgfQotCi0gICBmZmx1c2goc3Rkb3V0KTsKLSAgIGRlZmlFcnJvcigxLCBtc2dOdW0sIHN0cik7Ci0gICBmcmVlKHN0cik7Ci0gICBlcnJvcnMrKzsKLX0KLQotLyogeXlkZWZlcnJvciBpcyBjYWxsZWQgYnkgYmlzb24uc2ltcGxlICovCi12b2lkIAotZGVmckRhdGE6OmRlZnl5ZXJyb3IoY29uc3QgY2hhciAqcykgewotICAgZGVmRXJyb3IoZGVmTXNnQ250KyssIHMpOwotfQotCi0vKiBBbGwgaW5mbyBzdGFydHMgd2l0aCA4MDAwICovCi0vKiBBbGwgaW5mbyB3aXRoaW4gZGVmSW5mbyBzdGFydHMgd2l0aCA4NTAwICovCi12b2lkIAotZGVmckRhdGE6OmRlZkluZm8oaW50IG1zZ051bSwgY29uc3QgY2hhciAqcykgewotICAgaW50IGk7Ci0KLSAgIGZvciAoaSA9IDA7IGkgPCBzZXR0aW5ncy0+bkRETXNnczsgaSsrKSB7ICAvKiBjaGVjayBpZiBpbmZvIGhhcyBiZWVuIGRpc2FibGUgKi8KLSAgICAgIGlmIChzZXR0aW5ncy0+ZGlzYWJsZURNc2dzW2ldID09IG1zZ051bSkKLSAgICAgICAgIHJldHVybjsgIC8qIGRvbid0IHByaW50IG91dCBhbnkgaW5mbyBzaW5jZSBtc2cgaGFzIGJlZW4gZGlzYWJsZWQgKi8KLSAgIH0KLSAgIAotICAgaWYgKHNldHRpbmdzLT5Db250ZXh0V2FybmluZ0xvZ0Z1bmN0aW9uKSB7Ci0gICAgICBjaGFyKiBzdHIgPSAoY2hhciopbWFsbG9jKHN0cmxlbihkZWZ0b2tlbikrc3RybGVuKHMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICtzdHJsZW4oc2Vzc2lvbi0+RmlsZU5hbWUpKzM1MCk7Ci0gICAgICBzcHJpbnRmKHN0ciwgIklORk8gKERFRlBBUlMtJWQpOiAlcyBTZWUgZmlsZSAlcyBhdCBsaW5lICVzLlxuIiwKLSAgICAgICAgICAgICAgbXNnTnVtLCBzLCBzZXNzaW9uLT5GaWxlTmFtZSwgbGluZXMyc3RyKG5saW5lcykpOwotICAgICAgKCpzZXR0aW5ncy0+Q29udGV4dFdhcm5pbmdMb2dGdW5jdGlvbikoc2Vzc2lvbi0+VXNlckRhdGEsIHN0cik7Ci0gICAgICBmcmVlKHN0cik7Ci0gICB9IGVsc2UgaWYgKHNldHRpbmdzLT5XYXJuaW5nTG9nRnVuY3Rpb24pIHsKLSAgICAgIGNoYXIqIHN0ciA9IChjaGFyKiltYWxsb2Moc3RybGVuKGRlZnRva2VuKStzdHJsZW4ocykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK3N0cmxlbihzZXNzaW9uLT5GaWxlTmFtZSkrMzUwKTsKLSAgICAgIHNwcmludGYoc3RyLCAiSU5GTyAoREVGUEFSUy0lZCk6ICVzIFNlZSBmaWxlICVzIGF0IGxpbmUgJXMuXG4iLAotICAgICAgICAgICAgICBtc2dOdW0sIHMsIHNlc3Npb24tPkZpbGVOYW1lLCBsaW5lczJzdHIobmxpbmVzKSk7Ci0gICAgICAoKnNldHRpbmdzLT5XYXJuaW5nTG9nRnVuY3Rpb24pKHN0cik7Ci0gICAgICBmcmVlKHN0cik7Ci0gICB9IGVsc2UgaWYgKGRlZnJMb2cpIHsKLSAgICAgIGZwcmludGYoZGVmckxvZywgIklORk8gKERFRlBBUlMtJWQpOiAlcyBTZWUgZmlsZSAlcyBhdCBsaW5lICVzXG4iLAotICAgICAgICAgICAgICBtc2dOdW0sIHMsIHNlc3Npb24tPkZpbGVOYW1lLCBsaW5lczJzdHIobmxpbmVzKSk7Ci0gICB9IGVsc2UgewotICAgICAgaWYgKCFoYXNPcGVuZWREZWZMb2dGaWxlKSB7Ci0gICAgICAgICBpZiAoKGRlZnJMb2cgPSBmb3BlbigiZGVmUldhcm5pbmcubG9nIiwgInciKSkgPT0gMCkgewotICAgICAgICAgICAgcHJpbnRmKCJXQVJOSU5HKERFRlBBUlMtODUwMCk6IFVuYWJsZSB0byBvcGVuIHRoZSBmaWxlIGRlZlJXYXJuaW5nLmxvZyBpbiAlcy5cbiIsCi0gICAgICAgICAgICBnZXRjd2QoTlVMTCwgNjQpKTsKLSAgICAgICAgICAgIHByaW50ZigiSW5mbyBtZXNzYWdlcyB3aWxsIG5vdCBiZSBwcmludGVkLlxuIik7Ci0gICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaGFzT3BlbmVkRGVmTG9nRmlsZSA9IDE7Ci0gICAgICAgICAgICBmcHJpbnRmKGRlZnJMb2csICJJbmZvIGZyb20gZmlsZTogJXNcblxuIiwgc2Vzc2lvbi0+RmlsZU5hbWUpOwotICAgICAgICAgICAgZnByaW50ZihkZWZyTG9nLCAiSU5GTyAoREVGUEFSUy0lZCk6ICVzIFNlZSBmaWxlICVzIGF0IGxpbmUgJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgIG1zZ051bSwgcywgc2Vzc2lvbi0+RmlsZU5hbWUsIGxpbmVzMnN0cihubGluZXMpKTsKLSAgICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICBpZiAoKGRlZnJMb2cgPSBmb3BlbigiZGVmUldhcm5pbmcubG9nIiwgImEiKSkgPT0gMCkgewotICAgICAgICAgICAgcHJpbnRmKCJXQVJOSU5HIChERUZQQVJTLTg1MDApOiBVbmFibGUgdG8gb3BlbiB0aGUgZmlsZSBkZWZSV2FybmluZy5sb2cgaW4gJXMuXG4iLAotICAgICAgICAgICAgZ2V0Y3dkKE5VTEwsIDY0KSk7Ci0gICAgICAgICAgICBwcmludGYoIkluZm8gbWVzc2FnZXMgd2lsbCBub3QgYmUgcHJpbnRlZC5cbiIpOwotICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGhhc09wZW5lZERlZkxvZ0ZpbGUgPSAxOwotICAgICAgICAgICAgZnByaW50ZihkZWZyTG9nLCAiXG5JbmZvIGZyb20gZmlsZTogJXNcblxuIiwgc2Vzc2lvbi0+RmlsZU5hbWUpOwotICAgICAgICAgICAgZnByaW50ZihkZWZyTG9nLCAiSU5GTyAoREVGUEFSUy0lZCk6ICVzIFNlZSBmaWxlICVzIGF0IGxpbmUgJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgIG1zZ051bSwgcywgc2Vzc2lvbi0+RmlsZU5hbWUsIGxpbmVzMnN0cihubGluZXMpKTsKLSAgICAgICAgIH0KLSAgICAgIH0gCi0gICB9Ci19Ci0KLS8qIEFsbCB3YXJuaW5nIHN0YXJ0cyB3aXRoIDcwMDAgKi8KLS8qIEFsbCB3YXJuaW5nIHdpdGhpbiBkZWZXYXJuaW5nIHN0YXJ0cyB3aXRoIDc1MDAgKi8KLXZvaWQgCi1kZWZyRGF0YTo6ZGVmV2FybmluZyhpbnQgbXNnTnVtLCBjb25zdCBjaGFyICpzKSB7Ci0gICBpbnQgaTsKLQotICAgZm9yIChpID0gMDsgaSA8c2V0dGluZ3MtPm5ERE1zZ3M7IGkrKykgeyAgLyogY2hlY2sgaWYgd2FybmluZyBoYXMgYmVlbiBkaXNhYmxlICovCi0gICAgICBpZiAoc2V0dGluZ3MtPmRpc2FibGVETXNnc1tpXSA9PSBtc2dOdW0pCi0gICAgICAgICByZXR1cm47ICAvKiBkb24ndCBwcmludCBvdXQgYW55IHdhcm5pbmcgc2luY2UgbXNnIGhhcyBiZWVuIGRpc2FibGVkICovCi0gICB9Ci0KLSAgIGlmIChzZXR0aW5ncy0+Q29udGV4dFdhcm5pbmdMb2dGdW5jdGlvbikgewotICAgICAgY2hhciogc3RyID0gKGNoYXIqKW1hbGxvYyhzdHJsZW4oZGVmdG9rZW4pK3N0cmxlbihzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArc3RybGVuKHNlc3Npb24tPkZpbGVOYW1lKSszNTApOwotICAgICAgc3ByaW50ZihzdHIsICJXQVJOSU5HIChERUZQQVJTLSVkKTogJXMgU2VlIGZpbGUgJXMgYXQgbGluZSAlcy5cbiIsCi0gICAgICAgICAgICAgIG1zZ051bSwgcywgc2Vzc2lvbi0+RmlsZU5hbWUsIGxpbmVzMnN0cihubGluZXMpKTsKLSAgICAgICgqc2V0dGluZ3MtPkNvbnRleHRXYXJuaW5nTG9nRnVuY3Rpb24pKHNlc3Npb24tPlVzZXJEYXRhLCBzdHIpOwotICAgICAgZnJlZShzdHIpOwotICAgfSBlbHNlIGlmIChzZXR0aW5ncy0+V2FybmluZ0xvZ0Z1bmN0aW9uKSB7Ci0gICAgICBjaGFyKiBzdHIgPSAoY2hhciopbWFsbG9jKHN0cmxlbihkZWZ0b2tlbikrc3RybGVuKHMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICtzdHJsZW4oc2Vzc2lvbi0+RmlsZU5hbWUpKzM1MCk7Ci0gICAgICBzcHJpbnRmKHN0ciwgIldBUk5JTkcgKERFRlBBUlMtJWQpOiAlcyBTZWUgZmlsZSAlcyBhdCBsaW5lICVzLlxuIiwKLSAgICAgICAgICAgICAgbXNnTnVtLCBzLCBzZXNzaW9uLT5GaWxlTmFtZSwgbGluZXMyc3RyKG5saW5lcykpOwotICAgICAgKCpzZXR0aW5ncy0+V2FybmluZ0xvZ0Z1bmN0aW9uKShzdHIpOwotICAgICAgZnJlZShzdHIpOwotICAgfSBlbHNlIGlmIChkZWZyTG9nKSB7Ci0gICAgICBmcHJpbnRmKGRlZnJMb2csICJXQVJOSU5HIChERUZQQVJTLSVkKTogJXMgU2VlIGZpbGUgJXMgYXQgbGluZSAlc1xuIiwKLSAgICAgICAgICAgICAgbXNnTnVtLCBzLCBzZXNzaW9uLT5GaWxlTmFtZSwgbGluZXMyc3RyKG5saW5lcykpOwotICAgfSBlbHNlIHsKLSAgICAgIGlmICghaGFzT3BlbmVkRGVmTG9nRmlsZSkgewotICAgICAgICAgaWYgKChkZWZyTG9nID0gZm9wZW4oImRlZlJXYXJuaW5nLmxvZyIsICJ3IikpID09IDApIHsKLSAgICAgICAgICAgIHByaW50ZigiV0FSTklORyAoREVGUEFSUy03NTAwKTogVW5hYmxlIHRvIG9wZW4gdGhlIGZpbGUgZGVmUldhcm5pbmcubG9nIGluICVzLlxuIiwKLSAgICAgICAgICAgIGdldGN3ZChOVUxMLCA2NCkpOwotICAgICAgICAgICAgcHJpbnRmKCJXYXJuaW5nIG1lc3NhZ2VzIHdpbGwgbm90IGJlIHByaW50ZWQuXG4iKTsKLSAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBoYXNPcGVuZWREZWZMb2dGaWxlID0gMTsKLSAgICAgICAgICAgIGZwcmludGYoZGVmckxvZywgIldhcm5pbmdzIGZyb20gZmlsZTogJXNcblxuIiwgc2Vzc2lvbi0+RmlsZU5hbWUpOwotICAgICAgICAgICAgZnByaW50ZihkZWZyTG9nLCAiV0FSTklORyAoREVGUEFSUy0lZCk6ICVzIFNlZSBmaWxlICVzIGF0IGxpbmUgJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgIG1zZ051bSwgcywgc2Vzc2lvbi0+RmlsZU5hbWUsIGxpbmVzMnN0cihubGluZXMpKTsKLSAgICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICBpZiAoKGRlZnJMb2cgPSBmb3BlbigiZGVmUldhcm5pbmcubG9nIiwgImEiKSkgPT0gMCkgewotICAgICAgICAgICAgcHJpbnRmKCJXQVJOSU5HIChERUZBUFJTLTc1MDEpOiBVbmFibGUgdG8gb3BlbiB0aGUgZmlsZSBkZWZSV2FybmluZy5sb2cgaW4gJXMuXG4iLAotICAgICAgICAgICAgZ2V0Y3dkKE5VTEwsIDY0KSk7Ci0gICAgICAgICAgICBwcmludGYoIldhcm5pbmcgbWVzc2FnZXMgd2lsbCBub3QgYmUgcHJpbnRlZC5cbiIpOwotICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGhhc09wZW5lZERlZkxvZ0ZpbGUgPSAxOwotICAgICAgICAgICAgZnByaW50ZihkZWZyTG9nLCAiXG5XYXJuaW5ncyBmcm9tIGZpbGU6ICVzXG5cbiIsIHNlc3Npb24tPkZpbGVOYW1lKTsKLSAgICAgICAgICAgIGZwcmludGYoZGVmckxvZywgIldBUk5JTkcgKERFRlBBUlMtJWQpOiAlcyBTZWUgZmlsZSAlcyBhdCBsaW5lICVzXG4iLAotICAgICAgICAgICAgICAgICAgICBtc2dOdW0sIHMsIHNlc3Npb24tPkZpbGVOYW1lLCBsaW5lczJzdHIobmxpbmVzKSk7Ci0gICAgICAgICB9Ci0gICAgICB9IAotICAgfQotICAgZGVmX3dhcm5pbmdzKys7Ci19Ci0KLWNvbnN0IGNoYXIqIAotZGVmckRhdGE6OmRlZmt5d2QoaW50IG51bSkKLXsKLSAgIHN3aXRjaCAobnVtKSB7Ci0gICAgICBjYXNlIFFTVFJJTkc6IHJldHVybiAgIlFTVFJJTkciOwotICAgICAgY2FzZSBUX1NUUklORzogcmV0dXJuICAiVF9TVFJJTkciOwotICAgICAgY2FzZSBTSVRFX1BBVFRFUk46IHJldHVybiAgIlNJVEVfUEFUVEVSTiI7Ci0gICAgICBjYXNlIE5VTUJFUjogcmV0dXJuICJOVU1CRVIiOwotICAgICAgY2FzZSBLX0FMSUdOOiByZXR1cm4gIkFMSUdOIjsKLSAgICAgIGNhc2UgS19BTkQ6IHJldHVybiAiQU5EIjsKLSAgICAgIGNhc2UgS19BUlJBWTogcmV0dXJuICJBUlJBWSI7Ci0gICAgICBjYXNlIEtfQVNTRVJUSU9OUzogcmV0dXJuICJBU1NFUlRJT05TIjsKLSAgICAgIGNhc2UgS19CRUdJTkVYVDogcmV0dXJuICJCRUdJTkVYVCI7Ci0gICAgICBjYXNlIEtfQk9UVE9NTEVGVDogcmV0dXJuICJCT1RUT01MRUZUIjsKLSAgICAgIGNhc2UgS19CVVNCSVRDSEFSUzogcmV0dXJuICJCVVNCSVRDSEFSUyI7Ci0gICAgICBjYXNlIEtfQlk6IHJldHVybiAiQlkiOwotICAgICAgY2FzZSBLX0NBTk5PVE9DQ1VQWTogcmV0dXJuICJDQU5OT1RPQ0NVUFkiOwotICAgICAgY2FzZSBLX0NBTlBMQUNFOiByZXR1cm4gIkNBTlBMQUNFIjsKLSAgICAgIGNhc2UgS19DQVBBQ0lUQU5DRTogcmV0dXJuICJDQVBBQ0lUQU5DRSI7Ci0gICAgICBjYXNlIEtfQ09NTU9OU0NBTlBJTlM6IHJldHVybiAiQ09NTU9OU0NBTlBJTlMiOwotICAgICAgY2FzZSBLX0NPTVBPTkVOVDogcmV0dXJuICJDT01QT05FTlQiOwotICAgICAgY2FzZSBLX0NPTVBPTkVOVFBJTjogcmV0dXJuICJDT01QT05FTlRQSU4iOwotICAgICAgY2FzZSBLX0NPTVBTOiByZXR1cm4gIkNPTVBTIjsKLSAgICAgIGNhc2UgS19DT01QX0dFTjogcmV0dXJuICJDT01QX0dFTiI7Ci0gICAgICBjYXNlIEtfQ09OU1RSQUlOVFM6IHJldHVybiAiQ09OU1RSQUlOVFMiOwotICAgICAgY2FzZSBLX0NPVkVSOiByZXR1cm4gIkNPVkVSIjsKLSAgICAgIGNhc2UgS19DVVRTSVpFOiByZXR1cm4gIkNVVFNJWkUiOwotICAgICAgY2FzZSBLX0NVVFNQQUNJTkc6IHJldHVybiAiQ1VUU1BBQ0lORyI7Ci0gICAgICBjYXNlIEtfREVGQVVMVENBUDogcmV0dXJuICJERUZBVUxUQ0FQIjsKLSAgICAgIGNhc2UgS19ERUZJTkU6IHJldHVybiAiREVGSU5FIjsKLSAgICAgIGNhc2UgS19ERUZJTkVTOiByZXR1cm4gIkRFRklORVMiOwotICAgICAgY2FzZSBLX0RFRklORUI6IHJldHVybiAiREVGSU5FQiI7Ci0gICAgICBjYXNlIEtfREVTSUdOOiByZXR1cm4gIkRFU0lHTiI7Ci0gICAgICBjYXNlIEtfREVTSUdOUlVMRVdJRFRIOiByZXR1cm4gIkRFU0lHTlJVTEVXSURUSCI7Ci0gICAgICBjYXNlIEtfRElBR1dJRFRIOiByZXR1cm4gIkRJQUdXSURUSCI7Ci0gICAgICBjYXNlIEtfRElFQVJFQTogcmV0dXJuICJESUVBUkVBIjsKLSAgICAgIGNhc2UgS19ESUZGOiByZXR1cm4gIkRJRkYiOwotICAgICAgY2FzZSBLX0RJUkVDVElPTjogcmV0dXJuICJESVJFQ1RJT04iOwotICAgICAgY2FzZSBLX0RJU1Q6IHJldHVybiAiRElTVCI7Ci0gICAgICBjYXNlIEtfRElTVEFOQ0U6IHJldHVybiAiRElTVEFOQ0UiOwotICAgICAgY2FzZSBLX0RJVklERVJDSEFSOiByZXR1cm4gIkRJVklERVJDSEFSIjsKLSAgICAgIGNhc2UgS19ETzogcmV0dXJuICJETyI7Ci0gICAgICBjYXNlIEtfRFJJVkVDRUxMOiByZXR1cm4gIkRSSVZFQ0VMTCI7Ci0gICAgICBjYXNlIEtfRTogcmV0dXJuICJFIjsKLSAgICAgIGNhc2UgS19FRVFNQVNURVI6IHJldHVybiAiRUVRTUFTVEVSIjsKLSAgICAgIGNhc2UgS19FTFNFOiByZXR1cm4gIkVMU0UiOwotICAgICAgY2FzZSBLX0VOQ0xPU1VSRTogcmV0dXJuICJFTkNMT1NVUkUiOwotICAgICAgY2FzZSBLX0VORDogcmV0dXJuICJFTkQiOwotICAgICAgY2FzZSBLX0VOREVYVDogcmV0dXJuICJFTkRFWFQiOwotICAgICAgY2FzZSBLX0VROiByZXR1cm4gIkVRIjsKLSAgICAgIGNhc2UgS19FUVVBTDogcmV0dXJuICJFUVVBTCI7Ci0gICAgICBjYXNlIEtfRVNUQ0FQOiByZXR1cm4gIkVTVENBUCI7Ci0gICAgICBjYXNlIEtfRkU6IHJldHVybiAiRkUiOwotICAgICAgY2FzZSBLX0ZBTEw6IHJldHVybiAiRkFMTCI7Ci0gICAgICBjYXNlIEtfRkFMTE1BWDogcmV0dXJuICJGQUxMTUFYIjsKLSAgICAgIGNhc2UgS19GQUxMTUlOOiByZXR1cm4gIkZBTExNSU4iOwotICAgICAgY2FzZSBLX0ZBTFNFOiByZXR1cm4gIkZBTFNFIjsKLSAgICAgIGNhc2UgS19GSVhFRDogcmV0dXJuICJGSVhFRCI7Ci0gICAgICBjYXNlIEtfRkxPQVRJTkc6IHJldHVybiAiRkxPQVRJTkciOwotICAgICAgY2FzZSBLX0ZMT09SUExBTjogcmV0dXJuICJGTE9PUlBMQU4iOwotICAgICAgY2FzZSBLX0ZOOiByZXR1cm4gIkZOIjsKLSAgICAgIGNhc2UgS19GT1JFSUdOOiByZXR1cm4gIkZPUkVJR04iOwotICAgICAgY2FzZSBLX0ZQQzogcmV0dXJuICJGUEMiOwotICAgICAgY2FzZSBLX0ZST01DTE9DS1BJTjogcmV0dXJuICJGUk9NQ0xPQ0tQSU4iOwotICAgICAgY2FzZSBLX0ZST01DT01QUElOOiByZXR1cm4gIkZST01DT01QUElOIjsKLSAgICAgIGNhc2UgS19GUk9NUElOOiByZXR1cm4gIkZST01QSU4iOwotICAgICAgY2FzZSBLX0ZST01JT1BJTjogcmV0dXJuICJGUk9NSU9QSU4iOwotICAgICAgY2FzZSBLX0ZTOiByZXR1cm4gIkZTIjsKLSAgICAgIGNhc2UgS19GVzogcmV0dXJuICJGVyI7Ci0gICAgICBjYXNlIEtfR0NFTExHUklEOiByZXR1cm4gIkdDRUxMR1JJRCI7Ci0gICAgICBjYXNlIEtfR0U6IHJldHVybiAiR0UiOwotICAgICAgY2FzZSBLX0dUOiByZXR1cm4gIkdUIjsKLSAgICAgIGNhc2UgS19HUk9VTkQ6IHJldHVybiAiR1JPVU5EIjsKLSAgICAgIGNhc2UgS19HUk9VTkRTRU5TSVRJVklUWTogcmV0dXJuICJHUk9VTkRTRU5TSVRJVklUWSI7Ci0gICAgICBjYXNlIEtfR1JPVVA6IHJldHVybiAiR1JPVVAiOwotICAgICAgY2FzZSBLX0dST1VQUzogcmV0dXJuICJHUk9VUFMiOwotICAgICAgY2FzZSBLX0hBTE86IHJldHVybiAiSEFMTyI7Ci0gICAgICBjYXNlIEtfSEFSRFNQQUNJTkc6IHJldHVybiAiSEFSRFNQQUNJTkciOwotICAgICAgY2FzZSBLX0hJU1RPUlk6IHJldHVybiAiSElTVE9SWSI7Ci0gICAgICBjYXNlIEtfSE9MRFJJU0U6IHJldHVybiAiSE9MRFJJU0UiOwotICAgICAgY2FzZSBLX0hPTERGQUxMOiByZXR1cm4gIkhPTERGQUxMIjsKLSAgICAgIGNhc2UgS19IT1JJWk9OVEFMOiByZXR1cm4gIkhPUklaT05UQUwiOwotICAgICAgY2FzZSBLX0lGOiByZXR1cm4gIklGIjsKLSAgICAgIGNhc2UgS19JTjogcmV0dXJuICJJTiI7Ci0gICAgICBjYXNlIEtfSU5URUdFUjogcmV0dXJuICJJTlRFR0VSIjsKLSAgICAgIGNhc2UgS19JT1RJTUlOR1M6IHJldHVybiAiSU9USU1JTkdTIjsKLSAgICAgIGNhc2UgS19MQVlFUjogcmV0dXJuICJMQVlFUiI7Ci0gICAgICBjYXNlIEtfTEFZRVJTOiByZXR1cm4gIkxBWUVSUyI7Ci0gICAgICBjYXNlIEtfTEU6IHJldHVybiAiTEUiOwotICAgICAgY2FzZSBLX0xUOiByZXR1cm4gIkxUIjsKLSAgICAgIGNhc2UgS19NQUNSTzogcmV0dXJuICJNQUNSTyI7Ci0gICAgICBjYXNlIEtfTUFTSzogcmV0dXJuICJNQVNLIjsKLSAgICAgIGNhc2UgS19NQVg6IHJldHVybiAiTUFYIjsKLSAgICAgIGNhc2UgS19NQVhESVNUOiByZXR1cm4gIk1BWERJU1QiOwotICAgICAgY2FzZSBLX01BWEhBTEZQRVJJTUVURVI6IHJldHVybiAiTUFYSEFMRlBFUklNRVRFUiI7Ci0gICAgICBjYXNlIEtfTUFYWDogcmV0dXJuICJNQVhYIjsKLSAgICAgIGNhc2UgS19NQVhZOiByZXR1cm4gIk1BWFkiOwotICAgICAgY2FzZSBLX01JQ1JPTlM6IHJldHVybiAiTUlDUk9OUyI7Ci0gICAgICBjYXNlIEtfTUlOOiByZXR1cm4gIk1JTiI7Ci0gICAgICBjYXNlIEtfTUlOQ1VUUzogcmV0dXJuICJNSU5DVVRTIjsKLSAgICAgIGNhc2UgS19NSU5QSU5TOiByZXR1cm4gIk1JTlBJTlMiOwotICAgICAgY2FzZSBLX01VU1RKT0lOOiByZXR1cm4gIk1VU1RKT0lOIjsKLSAgICAgIGNhc2UgS19OOiByZXR1cm4gIk4iOwotICAgICAgY2FzZSBLX05BTUVTQ0FTRVNFTlNJVElWRTogcmV0dXJuICJOQU1FU0NBU0VTRU5TSVRJVkUiOwotICAgICAgY2FzZSBLX05BTUVNQVBTVFJJTkc6IHJldHVybiAiTkFNRU1BUFNUUklORyI7Ci0gICAgICBjYXNlIEtfTkU6IHJldHVybiAiTkUiOwotICAgICAgY2FzZSBLX05FVDogcmV0dXJuICJORVQiOwotICAgICAgY2FzZSBLX05FVEVYUFI6IHJldHVybiAiTkVURVhQUiI7Ci0gICAgICBjYXNlIEtfTkVUTElTVDogcmV0dXJuICJORVRMSVNUIjsKLSAgICAgIGNhc2UgS19ORVRTOiByZXR1cm4gIk5FVFMiOwotICAgICAgY2FzZSBLX05FVzogcmV0dXJuICJORVciOwotICAgICAgY2FzZSBLX05PTkRFRkFVTFRSVUxFOiByZXR1cm4gIk5PTkRFRkFVTFRSVUxFIjsKLSAgICAgIGNhc2UgS19OT1NISUVMRDogcmV0dXJuICJOT1NISUVMRCI7Ci0gICAgICBjYXNlIEtfTk9UOiByZXR1cm4gIk5PVCI7Ci0gICAgICBjYXNlIEtfT0ZGOiByZXR1cm4gIk9GRiI7Ci0gICAgICBjYXNlIEtfT0ZGU0VUOiByZXR1cm4gIk9GRlNFVCI7Ci0gICAgICBjYXNlIEtfT046IHJldHVybiAiT04iOwotICAgICAgY2FzZSBLX09SOiByZXR1cm4gIk9SIjsKLSAgICAgIGNhc2UgS19PUkRFUkVEOiByZXR1cm4gIk9SREVSRUQiOwotICAgICAgY2FzZSBLX09SSUdJTjogcmV0dXJuICJPUklHSU4iOwotICAgICAgY2FzZSBLX09SSUdJTkFMOiByZXR1cm4gIk9SSUdJTkFMIjsKLSAgICAgIGNhc2UgS19PVVQ6IHJldHVybiAiT1VUIjsKLSAgICAgIGNhc2UgS19QQVJBTExFTDogcmV0dXJuICJQQVJBTExFTCI7Ci0gICAgICBjYXNlIEtfUEFSVElUSU9OUzogcmV0dXJuICJQQVJUSVRJT05TIjsKLSAgICAgIGNhc2UgS19QQVRIOiByZXR1cm4gIlBBVEgiOwotICAgICAgY2FzZSBLX1BBVFRFUk46IHJldHVybiAiUEFUVEVSTiI7Ci0gICAgICBjYXNlIEtfUEFUVEVSTk5BTUU6IHJldHVybiAiUEFUVEVSTk5BTUUiOwotICAgICAgY2FzZSBLX1BJTlBST1BFUlRJRVM6IHJldHVybiAiUElOUFJPUEVSVElFUyI7Ci0gICAgICBjYXNlIEtfUElOUzogcmV0dXJuICJQSU5TIjsKLSAgICAgIGNhc2UgS19QTEFDRUQ6IHJldHVybiAiUExBQ0VEIjsKLSAgICAgIGNhc2UgS19QSU46IHJldHVybiAiUElOIjsKLSAgICAgIGNhc2UgS19QT0xZR09OOiByZXR1cm4gIlBPTFlHT04iOwotICAgICAgY2FzZSBLX1BST1BFUlRZOiByZXR1cm4gIlBST1BFUlRZIjsKLSAgICAgIGNhc2UgS19QUk9QRVJUWURFRklOSVRJT05TOiByZXR1cm4gIlBST1BFUlRZREVGSU5JVElPTlMiOwotICAgICAgY2FzZSBLX1JBTkdFOiByZXR1cm4gIlJBTkdFIjsKLSAgICAgIGNhc2UgS19SRUFMOiByZXR1cm4gIlJFQUwiOwotICAgICAgY2FzZSBLX1JFQ1Q6IHJldHVybiAiUkVDVCI7Ci0gICAgICBjYXNlIEtfUkVFTlRSQU5UUEFUSFM6IHJldHVybiAiUkVSRUVOVFJBTlRQQVRIUyI7Ci0gICAgICBjYXNlIEtfUkVHSU9OOiByZXR1cm4gIlJFR0lPTiI7Ci0gICAgICBjYXNlIEtfUkVHSU9OUzogcmV0dXJuICJSRUdJT05TIjsKLSAgICAgIGNhc2UgS19SSVNFOiByZXR1cm4gIlJJU0UiOwotICAgICAgY2FzZSBLX1JJU0VNQVg6IHJldHVybiAiUklTRU1BWCI7Ci0gICAgICBjYXNlIEtfUklTRU1JTjogcmV0dXJuICJSSVNFTUlOIjsKLSAgICAgIGNhc2UgS19ST1VURUQ6IHJldHVybiAiUk9VVEVEIjsKLSAgICAgIGNhc2UgS19ST1c6IHJldHVybiAiUk9XIjsKLSAgICAgIGNhc2UgS19ST1dDT0w6IHJldHVybiAiUk9XQ09MIjsKLSAgICAgIGNhc2UgS19ST1dTOiByZXR1cm4gIlJPV1MiOwotICAgICAgY2FzZSBLX1M6IHJldHVybiAiUyI7Ci0gICAgICBjYXNlIEtfU0NBTkNIQUlOUzogcmV0dXJuICJTQ0FOQ0hBSU5TIjsKLSAgICAgIGNhc2UgS19TRVRVUFJJU0U6IHJldHVybiAiU0VUVVBSSVNFIjsKLSAgICAgIGNhc2UgS19TRVRVUEZBTEw6IHJldHVybiAiU0VUVVBGQUxMIjsKLSAgICAgIGNhc2UgS19TSEFQRTogcmV0dXJuICJTSEFQRSI7Ci0gICAgICBjYXNlIEtfU0lURTogcmV0dXJuICJTSVRFIjsKLSAgICAgIGNhc2UgS19TTEVXUkFURTogcmV0dXJuICJTTEVXUkFURSI7Ci0gICAgICBjYXNlIEtfU05FVDogcmV0dXJuICJTTkVUIjsKLSAgICAgIGNhc2UgS19TTkVUUzogcmV0dXJuICJTTkVUUyI7Ci0gICAgICBjYXNlIEtfU09VUkNFOiByZXR1cm4gIlNPVVJDRSI7Ci0gICAgICBjYXNlIEtfU09GVDogcmV0dXJuICJTT0ZUIjsKLSAgICAgIGNhc2UgS19TUEFDSU5HOiByZXR1cm4gIlNQQUNJTkciOwotICAgICAgY2FzZSBLX1NQRUNJQUw6IHJldHVybiAiU1BFQ0lBTCI7Ci0gICAgICBjYXNlIEtfU1RBUlQ6IHJldHVybiAiU1RBUlQiOwotICAgICAgY2FzZSBLX1NUQVJUX05FVDogcmV0dXJuICJTVEFSVF9ORVQiOwotICAgICAgY2FzZSBLX1NURVA6IHJldHVybiAiU1RFUCI7Ci0gICAgICBjYXNlIEtfU1RSSU5HOiByZXR1cm4gIlNUUklORyI7Ci0gICAgICBjYXNlIEtfU1RPUDogcmV0dXJuICJTVE9QIjsKLSAgICAgIGNhc2UgS19TVUJORVQ6IHJldHVybiAiU1VCTkVUIjsKLSAgICAgIGNhc2UgS19TVU06IHJldHVybiAiU1VNIjsKLSAgICAgIGNhc2UgS19TVVBQTFlTRU5TSVRJVklUWTogcmV0dXJuICJTVVBQTFlTRU5TSVRJVklUWSI7Ci0gICAgICBjYXNlIEtfU1RZTEU6IHJldHVybiAiU1RZTEUiOwotICAgICAgY2FzZSBLX1NUWUxFUzogcmV0dXJuICJTVFlMRVMiOwotICAgICAgY2FzZSBLX1NZTlRIRVNJWkVEOiByZXR1cm4gIlNZTlRIRVNJWkVEIjsKLSAgICAgIGNhc2UgS19UQVBFUjogcmV0dXJuICJUQVBFUiI7Ci0gICAgICBjYXNlIEtfVEFQRVJSVUxFOiByZXR1cm4gIlRBUEVSUlVMRSI7Ci0gICAgICBjYXNlIEtfVEhFTjogcmV0dXJuICJUSEVOIjsKLSAgICAgIGNhc2UgS19USFJVUElOOiByZXR1cm4gIlRIUlVQSU4iOwotICAgICAgY2FzZSBLX1RJTUlORzogcmV0dXJuICJUSU1JTkciOwotICAgICAgY2FzZSBLX1RJTUlOR0RJU0FCTEVTOiByZXR1cm4gIlRJTUlOR0RJU0FCTEVTIjsKLSAgICAgIGNhc2UgS19UT0NMT0NLUElOOiByZXR1cm4gIlRPQ0xPQ0tQSU4iOwotICAgICAgY2FzZSBLX1RPQ09NUFBJTjogcmV0dXJuICJUT0NPTVBQSU4iOwotICAgICAgY2FzZSBLX1RPSU9QSU46IHJldHVybiAiVE9JT1BJTiI7Ci0gICAgICBjYXNlIEtfVE9QSU46IHJldHVybiAiVE9QSU4iOwotICAgICAgY2FzZSBLX1RPUFJJR0hUOiByZXR1cm4gIlRPUFJJR0hUIjsKLSAgICAgIGNhc2UgS19UUkFDS1M6IHJldHVybiAiVFJBQ0tTIjsKLSAgICAgIGNhc2UgS19UUlVFOiByZXR1cm4gIlRSVUUiOwotICAgICAgY2FzZSBLX1RVUk5PRkY6IHJldHVybiAiVFVSTk9GRiI7Ci0gICAgICBjYXNlIEtfVkFSSUFCTEU6IHJldHVybiAiVkFSSUFCTEUiOwotICAgICAgY2FzZSBLX1ZJQTogcmV0dXJuICJWSUEiOwotICAgICAgY2FzZSBLX1ZJQVJVTEU6IHJldHVybiAiVklBUlVMRSI7Ci0gICAgICBjYXNlIEtfVklBUzogcmV0dXJuICJWSUFTIjsKLSAgICAgIGNhc2UgS19WT0xUQUdFOiByZXR1cm4gIlZPTFRBR0UiOwotICAgICAgY2FzZSBLX1RFQ0g6IHJldHVybiAiVEVDSCI7Ci0gICAgICBjYXNlIEtfVU5JVFM6IHJldHVybiAiVU5JVFMiOwotICAgICAgY2FzZSBLX1VOUExBQ0VEOiByZXR1cm4gIlVOUExBQ0VEIjsKLSAgICAgIGNhc2UgS19VU0U6IHJldHVybiAiVVNFIjsKLSAgICAgIGNhc2UgS19VU0VSOiByZXR1cm4gIlVTRVIiOwotICAgICAgY2FzZSBLX1ZFUlNJT046IHJldHVybiAiVkVSU0lPTiI7Ci0gICAgICBjYXNlIEtfVklSVFVBTDogcmV0dXJuICJWSVJUVUFMIjsKLSAgICAgIGNhc2UgS19WRVJUSUNBTDogcmV0dXJuICJWRVJUSUNBTCI7Ci0gICAgICBjYXNlIEtfVlBJTjogcmV0dXJuICJWUElOIjsKLSAgICAgIGNhc2UgS19XOiByZXR1cm4gIlciOwotICAgICAgY2FzZSBLX1dJUkVDQVA6IHJldHVybiAiV0lSRUNBUCI7Ci0gICAgICBjYXNlIEtfV0VJR0hUOiByZXR1cm4gIldFSUdIVCI7Ci0gICAgICBjYXNlIEtfV0lEVEg6IHJldHVybiAiV0lEVEgiOwotICAgICAgY2FzZSBLX1dJUkVETE9HSUM6IHJldHVybiAiV0lSRURMT0dJQyI7Ci0gICAgICBjYXNlIEtfV0lSRUVYVDogcmV0dXJuICJXSVJFRVhUIjsKLSAgICAgIGNhc2UgS19YVEFMSzogcmV0dXJuICJYVEFMSyI7Ci0gICAgICBjYXNlIEtfWDogcmV0dXJuICJYIjsKLSAgICAgIGNhc2UgS19ZOiByZXR1cm4gIlkiOwotICAgICAgZGVmYXVsdDogcmV0dXJuICJib2d1cyI7Ci0gICB9Ci19Ci0KLWNvbnN0IGNoYXIqIAotZGVmckRhdGE6OkRFRkNBU0UoY29uc3QgY2hhciogY2gpCi17Ci0gICAgcmV0dXJuIG5hbWVzX2Nhc2Vfc2Vuc2l0aXZlID8gY2ggOiB1cHBlckNhc2UoY2gpOwotfQotCi12b2lkCi1kZWZyRGF0YTo6cGF0aElzRG9uZShpbnQgIHNoLCBpbnQgIHJlc2V0LCBpbnQgIG9zTmV0LCBpbnQgICpuZWVkQ2JrKQotewotICAgIGlmICgoY2FsbGJhY2tzLT5OZXRDYmsgfHwgY2FsbGJhY2tzLT5TTmV0Q2JrKSAmJiBzZXR0aW5ncy0+QWRkUGF0aFRvTmV0KSB7Ci0gICAgICAgIC8vUGF0aE9iai5yZXZlcnNlT3JkZXIoKTsKLSAgICAgICAgaWYgKFN1Ym5ldCkgewotICAgICAgICAgICAgLy8gaWYgKHNoKQotICAgICAgICAgICAgLy8gICAgZGVmclN1Ym5ldC0+YWRkU2hpZWxkUGF0aChkZWZyUGF0aCk7Ci0gICAgICAgICAgICAvLyBlbHNlIAotICAgICAgICAgICAgU3VibmV0LT5hZGRXaXJlUGF0aCgmUGF0aE9iaiwgcmVzZXQsIG9zTmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkQ2JrKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChzaCkKLSAgICAgICAgICAgICAgICBOZXQuYWRkU2hpZWxkUGF0aCgmUGF0aE9iaiwgcmVzZXQsIG9zTmV0LCBuZWVkQ2JrKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBOZXQuYWRkV2lyZVBhdGgoJlBhdGhPYmosIHJlc2V0LCBvc05ldCwgbmVlZENiayk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGNhbGxiYWNrcy0+UGF0aENiaykgewotICAgICAgICAvL2RlZnJQYXRoLT5yZXZlcnNlT3JkZXIoKTsKLSAgICAgICAgKCpjYWxsYmFja3MtPlBhdGhDYmspKGRlZnJQYXRoQ2JrVHlwZSwgJlBhdGhPYmosIHNlc3Npb24tPlVzZXJEYXRhKTsKLSAgICAgICAgUGF0aE9iai5EZXN0cm95KCk7Ci0gICAgICAgIGZyZWUoKGNoYXIqKSAmUGF0aE9iaik7Ci0gICAgfQotCi0gICAgUGF0aE9iai5Jbml0KCk7Ci19Ci0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0KLQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZl9vYmpzLmRlZnMgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZl9vYmpzLmRlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA5YzU3NTMuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZfb2Jqcy5kZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIGRlZl9vYmpzLmRlZnMKLSMKLQotREVGX1NSQ1MJPSBcCi0JCSAgJChERUZfU1JDX0RJUikvREZFRl9tYWxsb2MuY3BwIFwKLQkJICAkKERFRl9TUkNfRElSKS9ERkVGX3N0cmluZ2hhc2guY3BwIFwKLQkJICAkKERFRl9TUkNfRElSKS9kZWYudGFiLmNwcCBcCi0JCSAgJChERUZfU1JDX0RJUikvZGVmX2tleXdvcmRzLmNwcCBcCi0JCSAgJChERUZfU1JDX0RJUikvZGVmaUFsaWFzLmNwcCBcCi0JCSAgJChERUZfU1JDX0RJUikvZGVmaUFzc2VydGlvbi5jcHAgXAotCQkgICQoREVGX1NSQ19ESVIpL2RlZmlCbG9ja2FnZS5jcHAgXAotCQkgICQoREVGX1NSQ19ESVIpL2RlZmlDb21wb25lbnQuY3BwIFwKLQkJICAkKERFRl9TUkNfRElSKS9kZWZpRGVidWcuY3BwIFwKLQkJICAkKERFRl9TUkNfRElSKS9kZWZpRmlsbC5jcHAgXAotCQkgICQoREVGX1NSQ19ESVIpL2RlZmlGUEMuY3BwIFwKLQkJICAkKERFRl9TUkNfRElSKS9kZWZpR3JvdXAuY3BwIFwKLQkJICAkKERFRl9TUkNfRElSKS9kZWZpSU9UaW1pbmcuY3BwIFwKLQkJICAkKERFRl9TUkNfRElSKS9kZWZpTWlzYy5jcHAgXAotCQkgICQoREVGX1NSQ19ESVIpL2RlZmlOZXQuY3BwIFwKLQkJICAkKERFRl9TUkNfRElSKS9kZWZpTm9uRGVmYXVsdC5jcHAgXAotCQkgICQoREVGX1NSQ19ESVIpL2RlZmlQYXJ0aXRpb24uY3BwIFwKLQkJICAkKERFRl9TUkNfRElSKS9kZWZpUGF0aC5jcHAgXAotCQkgICQoREVGX1NSQ19ESVIpL2RlZmlQaW5DYXAuY3BwIFwKLQkJICAkKERFRl9TUkNfRElSKS9kZWZpUGluUHJvcC5jcHAgXAotCQkgICQoREVGX1NSQ19ESVIpL2RlZmlQcm9wLmNwcCBcCi0JCSAgJChERUZfU1JDX0RJUikvZGVmaVByb3BUeXBlLmNwcCBcCi0JCSAgJChERUZfU1JDX0RJUikvZGVmaVJlZ2lvbi5jcHAgXAotCQkgICQoREVGX1NSQ19ESVIpL2RlZmlSb3dUcmFjay5jcHAgXAotCQkgICQoREVGX1NSQ19ESVIpL2RlZmlTY2FuY2hhaW4uY3BwIFwKLQkJICAkKERFRl9TUkNfRElSKS9kZWZpU2l0ZS5jcHAgXAotCQkgICQoREVGX1NSQ19ESVIpL2RlZmlTbG90LmNwcCBcCi0JCSAgJChERUZfU1JDX0RJUikvZGVmaVRpbWluZ0Rpc2FibGUuY3BwIFwKLQkJICAkKERFRl9TUkNfRElSKS9kZWZpVXRpbC5jcHAgXAotCQkgICQoREVGX1NSQ19ESVIpL2RlZmlWaWEuY3BwIFwKLQkJICAkKERFRl9TUkNfRElSKS9kZWZyUmVhZGVyLmNwcCBcCi0JCSAgJChERUZfU1JDX0RJUikvZGVmd1dyaXRlci5jcHAgXAotCQkgICQoREVGX1NSQ19ESVIpL2RlZndXcml0ZXJDYWxscy5jcHAKLQotREVGX0JJU09OX1NSQ1MJPSAkKERFRl9TUkNfRElSKS9kZWYueQotCi1ERUZfT0JKUwk9ICQoREVGX1NSQ1M6LmNwcD0ubykKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpQWxpYXMuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpQWxpYXMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzNlZTFlLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaUFsaWFzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEzIC0gMjAxNCwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpbmNsdWRlICJkZWZpQWxpYXMuaHBwIgotI2luY2x1ZGUgImRlZnJEYXRhLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotZXh0ZXJuIGRlZnJDb250ZXh0IGRlZkNvbnRleHQ7Ci0KLWNsYXNzIGRlZkFsaWFzSXRlcmF0b3IgewotcHVibGljOgotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgZGVmQ29tcGFyZVN0cmluZ3M+OjppdGVyYXRvciBtZTsgCi19OyAKLQotZGVmaUFsaWFzX2l0cjo6ZGVmaUFsaWFzX2l0cihkZWZyRGF0YSAqZGF0YSkgCi06IGZpcnN0KDEpLAotICBpdGVyYXRvcihOVUxMKSwKLSAgZGVmRGF0YShkYXRhID8gZGF0YSA6IGRlZkNvbnRleHQuZGF0YSkKLXsKLSAgICBkZWZpQWxpYXNfaXRyOjpJbml0KCk7Ci19Ci0KLQotdm9pZCBkZWZpQWxpYXNfaXRyOjpJbml0KCkgewotICAgIGZpcnN0ID0gMTsKLSAgICBpdGVyYXRvciA9IG5ldyBkZWZBbGlhc0l0ZXJhdG9yKCk7Ci19Ci0gCi0KLXZvaWQgZGVmaUFsaWFzX2l0cjo6RGVzdHJveSgpIHsKLSAgICBkZWxldGUgaXRlcmF0b3I7Ci0gICAgaXRlcmF0b3IgPSBOVUxMOwotfQotCi0KLWRlZmlBbGlhc19pdHI6On5kZWZpQWxpYXNfaXRyKCkgewotICAgIGRlZmlBbGlhc19pdHI6OkRlc3Ryb3koKTsKLX0KLQotIAotaW50IGRlZmlBbGlhc19pdHI6Ok5leHQoKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gMDsKLSAgICAgICAgaXRlcmF0b3ItPm1lID0gZGVmRGF0YS0+ZGVmX2FsaWFzX3NldC5iZWdpbigpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGl0ZXJhdG9yLT5tZSsrOwotICAgIH0KLQotICAgIGlmIChpdGVyYXRvci0+bWUgPT0gZGVmRGF0YS0+ZGVmX2FsaWFzX3NldC5lbmQoKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpQWxpYXNfaXRyOjpLZXkoKSB7Ci0gICAgaWYgKGl0ZXJhdG9yLT5tZSA9PSBkZWZEYXRhLT5kZWZfYWxpYXNfc2V0LmVuZCgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gaXRlcmF0b3ItPm1lLT5maXJzdC5jX3N0cigpOwotfQotCi0KLWNvbnN0IGNoYXIqIGRlZmlBbGlhc19pdHI6OkRhdGEoKSB7Ci0gICAgaWYgKGl0ZXJhdG9yLT5tZSA9PSBkZWZEYXRhLT5kZWZfYWxpYXNfc2V0LmVuZCgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8vIEZpcnN0IGNoYXIgaXMgcmVzZXJ2ZWQgZm9yICdtYXJrZWQnIHN5bWJvbCAoJzAnIG9yICcxJykKLSAgICByZXR1cm4gaXRlcmF0b3ItPm1lLT5zZWNvbmQuY19zdHIoKSArIDE7Ci19Ci0KLSAKLWludCBkZWZpQWxpYXNfaXRyOjpNYXJrZWQoKSB7Ci0gICAgY29uc3QgY2hhciAqdmFsdWUgPSBpdGVyYXRvci0+bWUtPnNlY29uZC5jX3N0cigpOwotCi0gICAgaWYgKCh2YWx1ZSA9PSBOVUxMKSB8fCAodmFsdWVbMF0gPT0gJzAnKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9ZWxzZSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLX0KLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaUFsaWFzLmhwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaUFsaWFzLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJhMGU2OC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlBbGlhcy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEzIC0gMjAxNCwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpZm5kZWYgZGVmaUFMSUFTX2gKLSNkZWZpbmUgZGVmaUFMSUFTX2gKLQotI2luY2x1ZGUgImRlZmlLUkRlZnMuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1jbGFzcyBkZWZBbGlhc0l0ZXJhdG9yOwotY2xhc3MgZGVmckRhdGE7Ci0KLWNsYXNzIGRlZmlBbGlhc19pdHIgewotcHVibGljOgotICBkZWZpQWxpYXNfaXRyKGRlZnJEYXRhICpkZWZEYXRhID0gMCk7Ci0gIHZvaWQgSW5pdCgpOwotCi0gIHZvaWQgRGVzdHJveSgpOwotICB+ZGVmaUFsaWFzX2l0cigpOwotCi0gIGludCBOZXh0KCk7Ci0gIGNvbnN0IGNoYXIqIEtleSgpOwotICBjb25zdCBjaGFyKiBEYXRhKCk7Ci0gIGludCBNYXJrZWQoKTsKLQotcHJvdGVjdGVkOgotICBkZWZBbGlhc0l0ZXJhdG9yICAgKml0ZXJhdG9yOwotICBpbnQgZmlyc3Q7Ci0gIGRlZnJEYXRhICpkZWZEYXRhOwotfTsKLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLVVTRV9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaUFzc2VydGlvbi5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlBc3NlcnRpb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjdjODdkLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaUFzc2VydGlvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MjUgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMyAtIDIwMTUsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSAibGV4LmgiCi0jaW5jbHVkZSAiZGVmaUFzc2VydGlvbi5ocHAiCi0jaW5jbHVkZSAiZGVmaURlYnVnLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotc3RydWN0IGRlZmlBc3NlcnRQYXRoIHsKLSAgY2hhciogZnJvbVBpbl87Ci0gIGNoYXIqIHRvUGluXzsKLSAgY2hhciogZnJvbUluc3RfOwotICBjaGFyKiB0b0luc3RfOwotfTsKLQotCi0KLWRlZmlBc3NlcnRpb246OmRlZmlBc3NlcnRpb24oZGVmckRhdGEgKmRhdGEpCi0gOiBkZWZEYXRhKGRhdGEpCi17Ci0gIEluaXQoKTsKLX0KLQotCi1kZWZpQXNzZXJ0aW9uOjp+ZGVmaUFzc2VydGlvbigpIHsKLSAgRGVzdHJveSgpOwotfQotCi0KLXZvaWQgZGVmaUFzc2VydGlvbjo6SW5pdCgpIHsKLSAgbmV0TmFtZV8gPSAoY2hhciopbWFsbG9jKDMyKTsKLSAgbmV0TmFtZUxlbmd0aF8gPSAzMjsKLSAgbnVtSXRlbXNfID0gMDsKLSAgY2xlYXIoKTsKLSAgbnVtSXRlbXNBbGxvY2F0ZWRfID0gMTY7Ci0gIGl0ZW1zXyA9IChpbnQqKiltYWxsb2Moc2l6ZW9mKGNoYXIqKSoxNik7Ci0gIGl0ZW1UeXBlc18gPSAoY2hhciopbWFsbG9jKDE2KTsKLX0KLQotCi12b2lkIGRlZmlBc3NlcnRpb246OkRlc3Ryb3koKSB7Ci0gIGZyZWUobmV0TmFtZV8pOwotICBmcmVlKChjaGFyKikoaXRlbVR5cGVzXykpOwotICBmcmVlKChjaGFyKikoaXRlbXNfKSk7Ci19Ci0KLQotdm9pZCBkZWZpQXNzZXJ0aW9uOjpjbGVhcigpIHsKLSAgaW50IGk7Ci0gIHN0cnVjdCBkZWZpQXNzZXJ0UGF0aCogczsKLQotICBpZiAobmV0TmFtZV8pCi0gICAgICoobmV0TmFtZV8pID0gJ1wwJzsKLSAgaXNTdW1fID0gMDsKLSAgaXNEaWZmXyA9IDA7Ci0gIGlzQXNzZXJ0aW9uXyA9IDA7Ci0gIGhhc1Jpc2VNaW5fID0gMDsKLSAgaGFzUmlzZU1heF8gPSAwOwotICBoYXNGYWxsTWluXyA9IDA7Ci0gIGhhc0ZhbGxNYXhfID0gMDsKLSAgaXNEZWxheV8gPSAwOwotICBpc1dpcmVkbG9naWNfID0gMDsKLQotICBmb3IgKGkgPSAwOyBpIDwgbnVtSXRlbXNfOyBpKyspIHsKLSAgICBpZiAoaXRlbVR5cGVzX1tpXSA9PSAncCcpIHsKLSAgICAgIHMgPSAoc3RydWN0IGRlZmlBc3NlcnRQYXRoKikoaXRlbXNfW2ldKTsKLSAgICAgIGZyZWUocy0+ZnJvbVBpbl8pOwotICAgICAgZnJlZShzLT50b1Bpbl8pOwotICAgICAgZnJlZShzLT5mcm9tSW5zdF8pOwotICAgICAgZnJlZShzLT50b0luc3RfKTsKLSAgICAgIGZyZWUoKGNoYXIqKXMpOwotICAgIH0gZWxzZSBpZiAoaXRlbVR5cGVzX1tpXSA9PSAnbicpIHsKLSAgICAgIGZyZWUoKGNoYXIqKShpdGVtc19baV0pKTsKLSAgICB9IGVsc2UgewotICAgICAgZGVmaUVycm9yKDAsIDYwMDksICJFUlJPUiAoREVGUEFSU0UtNjAwOSk6IEFuIGludmFsaWQgYXR0cmlidXRlIHR5cGUgaGFzIGVuY291bnRlciB3aGlsZSBjbGVhbm5pbmcgdGhlIG1lbW9yeS4iLCBkZWZEYXRhKTsKLSAgICB9Ci0gICAgaXRlbVR5cGVzX1tpXSA9ICdCJzsgIC8vIGJvZ3VzCi0gICAgaXRlbXNfW2ldID0gMDsKLSAgfQotCi0gIG51bUl0ZW1zXyA9IDA7Ci19Ci0KLQotdm9pZCBkZWZpQXNzZXJ0aW9uOjpzZXRDb25zdHJhaW50TW9kZSgpIHsKLSAgaXNBc3NlcnRpb25fID0gMDsKLX0KLQotCi12b2lkIGRlZmlBc3NlcnRpb246OnNldEFzc2VydGlvbk1vZGUoKSB7Ci0gIGlzQXNzZXJ0aW9uXyA9IDE7Ci19Ci0KLQotdm9pZCBkZWZpQXNzZXJ0aW9uOjpzZXRXaXJlZGxvZ2ljTW9kZSgpIHsKLSAgaXNXaXJlZGxvZ2ljXyA9IDE7Ci19Ci0KLQotdm9pZCBkZWZpQXNzZXJ0aW9uOjpzZXRXaXJlZGxvZ2ljKGNvbnN0IGNoYXIqIG5hbWUsIGRvdWJsZSBkaXN0KSB7Ci0gIGludCBsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotICBpZiAoaXNEZWxheV8pCi0gICAgZGVmaUVycm9yKDAsIDYyMDEsICJFUlJPUiAoREVGUEFSUy02MjAxKTogVW5hYmxlIHRvIHByb2Nlc3MgdGhlIERFRiBmaWxlLiBCb3RoIFdJUkVETE9HSUMgYW5kIERFTEFZIHN0YXRlbWVudHMgYXJlIGRlZmluZWQgaW4gY29uc3RyYWludC9hc3NlcnRpb24uXG5VcGRhdGUgdGhlIERFRiBmaWxlIHRvIGRlZmluZSBlaXRoZXIgYSBXSVJFRExPR0lDIG9yIERFTEFZIHN0YXRlbWVudCBvbmx5LiIsIGRlZkRhdGEpOwotICBpc1dpcmVkbG9naWNfID0gMTsKLSAgaWYgKG5ldE5hbWVMZW5ndGhfIDwgbGVuKSB7Ci0gICAgZnJlZShuZXROYW1lXyk7Ci0gICAgbmV0TmFtZV8gPSAoY2hhciopbWFsbG9jKGxlbik7Ci0gICAgbmV0TmFtZUxlbmd0aF8gPSBsZW47Ci0gIH0KLSAgc3RyY3B5KG5ldE5hbWVfLCBkZWZEYXRhLT5ERUZDQVNFKG5hbWUpKTsKLSAgZmFsbE1heF8gPSBkaXN0OwotfQotCi0KLXZvaWQgZGVmaUFzc2VydGlvbjo6c2V0RGVsYXkoKSB7Ci0gIGlmIChpc1dpcmVkbG9naWNfKQotICAgIGRlZmlFcnJvcigwLCA2MjAxLCAiRVJST1IgKERFRlBBUlMtNjIwMSk6IFVuYWJsZSB0byBwcm9jZXNzIHRoZSBERUYgZmlsZS4gQm90aCBXSVJFRExPR0lDIGFuZCBERUxBWSBzdGF0ZW1lbnRzIGFyZSBkZWZpbmVkIGluIGNvbnN0cmFpbnQvYXNzZXJ0aW9uLlxuVXBkYXRlIHRoZSBERUYgZmlsZSB0byBkZWZpbmUgZWl0aGVyIGEgV0lSRURMT0dJQyBvciBERUxBWSBzdGF0ZW1lbnQgb25seS4iLCBkZWZEYXRhKTsKLSAgaXNEZWxheV8gPSAxOwotfQotCi0KLXZvaWQgZGVmaUFzc2VydGlvbjo6c2V0U3VtKCkgewotICBpZiAoaXNEaWZmXykKLSAgICAgZGVmaUVycm9yKDAsIDYyMDIsICJFUlJPUiAoREVQUEFSUy02MjAyKTogVW5hYmxlIHRvIHByb2Nlc3MgdGhlIERFRiBmaWxlLiBCb3RoIFNVTSBhbmQgRElGRiBzdGF0ZW1lbnRzIGFyZSBkZWZpbmVkIGluIGNvbnN0cmFpbnQvYXNzZXJ0aW9uLlxuVXBkYXRlIHRoZSBERUYgZmlsZSB0byBkZWZpbmUgZWl0aGVyIGEgU1VNIG9yIERJRkYgc3RhdGVtZW50IG9ubHkuIiwgZGVmRGF0YSk7Ci0gIGlzU3VtXyA9IDE7Ci19Ci0KLQotdm9pZCBkZWZpQXNzZXJ0aW9uOjp1bnNldFN1bSgpIHsKLSAgaXNTdW1fID0gMDsKLX0KLQotCi12b2lkIGRlZmlBc3NlcnRpb246OnNldERpZmYoKSB7Ci0gIGlmIChpc1N1bV8pCi0gICAgIGRlZmlFcnJvcigwLCA2MjAyLCAiRVJST1IgKERFUFBBUlMtNjIwMik6IFVuYWJsZSB0byBwcm9jZXNzIHRoZSBERUYgZmlsZS4gQm90aCBTVU0gYW5kIERJRkYgc3RhdGVtZW50cyBhcmUgZGVmaW5lZCBpbiBjb25zdHJhaW50L2Fzc2VydGlvbi5cblVwZGF0ZSB0aGUgREVGIGZpbGUgdG8gZGVmaW5lIGVpdGhlciBhIFNVTSBvciBESUZGIHN0YXRlbWVudCBvbmx5LiIsIGRlZkRhdGEpOwotICBpc0RpZmZfID0gMTsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpQXNzZXJ0aW9uOjpuZXROYW1lKCkgY29uc3QgewotICByZXR1cm4gbmV0TmFtZV87Ci19Ci0KLQotdm9pZCBkZWZpQXNzZXJ0aW9uOjpzZXROZXROYW1lKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgaW50IGxlbiA9IHN0cmxlbihuYW1lKSArIDE7Ci0gIGNsZWFyKCk7Ci0gIGlmIChsZW4gPiBuZXROYW1lTGVuZ3RoXykgewotICAgIGZyZWUobmV0TmFtZV8pOwotICAgIG5ldE5hbWVfID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICAgIG5ldE5hbWVMZW5ndGhfID0gbGVuOwotICB9Ci0gIHN0cmNweShuZXROYW1lXywgZGVmRGF0YS0+REVGQ0FTRShuYW1lKSk7Ci19Ci0KLQotCi1pbnQgZGVmaUFzc2VydGlvbjo6aXNEZWxheSgpIGNvbnN0IHsKLSAgcmV0dXJuIGlzRGVsYXlfID8gMSA6IDA7Ci19Ci0KLQotaW50IGRlZmlBc3NlcnRpb246OmlzQXNzZXJ0aW9uKCkgY29uc3QgewotICByZXR1cm4gaXNBc3NlcnRpb25fID8gMSA6IDA7Ci19Ci0KLQotaW50IGRlZmlBc3NlcnRpb246OmlzQ29uc3RyYWludCgpIGNvbnN0IHsKLSAgcmV0dXJuIGlzQXNzZXJ0aW9uXyA/IDAgOiAxOwotfQotCi0KLWludCBkZWZpQXNzZXJ0aW9uOjppc1N1bSgpIGNvbnN0IHsKLSAgcmV0dXJuIGlzU3VtXzsKLX0KLQotCi1pbnQgZGVmaUFzc2VydGlvbjo6aXNEaWZmKCkgY29uc3QgewotICByZXR1cm4gaXNEaWZmXzsKLX0KLQotCi1pbnQgZGVmaUFzc2VydGlvbjo6aXNXaXJlZGxvZ2ljKCkgY29uc3QgewotICByZXR1cm4gaXNXaXJlZGxvZ2ljXzsKLX0KLQotCi1pbnQgZGVmaUFzc2VydGlvbjo6aGFzUmlzZU1pbigpIGNvbnN0IHsKLSAgcmV0dXJuIGhhc1Jpc2VNaW5fOwotfQotCi0KLWludCBkZWZpQXNzZXJ0aW9uOjpoYXNSaXNlTWF4KCkgY29uc3QgewotICByZXR1cm4gaGFzUmlzZU1heF87Ci19Ci0KLQotaW50IGRlZmlBc3NlcnRpb246Omhhc0ZhbGxNaW4oKSBjb25zdCB7Ci0gIHJldHVybiBoYXNGYWxsTWluXzsKLX0KLQotCi1pbnQgZGVmaUFzc2VydGlvbjo6aGFzRmFsbE1heCgpIGNvbnN0IHsKLSAgcmV0dXJuIGhhc0ZhbGxNYXhfOwotfQotCi0KLWRvdWJsZSBkZWZpQXNzZXJ0aW9uOjpkaXN0YW5jZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGZhbGxNYXhfOyAgLy8gZGlzdGFuY2UgaXMgc3RvcmVkIGhlcmUKLX0KLQotCi1kb3VibGUgZGVmaUFzc2VydGlvbjo6cmlzZU1pbigpIGNvbnN0IHsKLSAgcmV0dXJuIHJpc2VNaW5fOwotfQotCi0KLWRvdWJsZSBkZWZpQXNzZXJ0aW9uOjpyaXNlTWF4KCkgY29uc3QgewotICByZXR1cm4gcmlzZU1heF87Ci19Ci0KLQotZG91YmxlIGRlZmlBc3NlcnRpb246OmZhbGxNaW4oKSBjb25zdCB7Ci0gIHJldHVybiBmYWxsTWluXzsKLX0KLQotCi1kb3VibGUgZGVmaUFzc2VydGlvbjo6ZmFsbE1heCgpIGNvbnN0IHsKLSAgcmV0dXJuIGZhbGxNYXhfOwotfQotCi0KLXZvaWQgZGVmaUFzc2VydGlvbjo6c2V0UmlzZU1pbihkb3VibGUgZCkgewotICByaXNlTWluXyA9IGQ7Ci0gIGhhc1Jpc2VNaW5fID0gMTsKLX0KLQotCi12b2lkIGRlZmlBc3NlcnRpb246OnNldFJpc2VNYXgoZG91YmxlIGQpIHsKLSAgcmlzZU1heF8gPSBkOwotICBoYXNSaXNlTWF4XyA9IDE7Ci19Ci0KLQotdm9pZCBkZWZpQXNzZXJ0aW9uOjpzZXRGYWxsTWluKGRvdWJsZSBkKSB7Ci0gIGZhbGxNaW5fID0gZDsKLSAgaGFzRmFsbE1pbl8gPSAxOwotfQotCi0KLXZvaWQgZGVmaUFzc2VydGlvbjo6c2V0RmFsbE1heChkb3VibGUgZCkgewotICBmYWxsTWF4XyA9IGQ7Ci0gIGhhc0ZhbGxNYXhfID0gMTsKLX0KLQotCi1pbnQgZGVmaUFzc2VydGlvbjo6bnVtSXRlbXMoKSBjb25zdCB7Ci0gIHJldHVybiBudW1JdGVtc187Ci19Ci0KLQotaW50IGRlZmlBc3NlcnRpb246OmlzUGF0aChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBudW1JdGVtc18pIHsKLSAgICByZXR1cm4gKGl0ZW1UeXBlc19baW5kZXhdID09ICdwJykgPyAxIDogMDsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotCi1pbnQgZGVmaUFzc2VydGlvbjo6aXNOZXQoaW50IGluZGV4KSBjb25zdCB7Ci0gIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgbnVtSXRlbXNfKSB7Ci0gICAgcmV0dXJuIChpdGVtVHlwZXNfW2luZGV4XSA9PSAnbicpID8gMSA6IDA7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotdm9pZCBkZWZpQXNzZXJ0aW9uOjpwYXRoKGludCBpbmRleCwgY2hhcioqIGZyb21JbnN0LCBjaGFyKiogZnJvbVBpbiwKLQkgICBjaGFyKiogdG9JbnN0LCBjaGFyKiogdG9QaW4pIGNvbnN0IHsKLSAgc3RydWN0IGRlZmlBc3NlcnRQYXRoKiBhcDsKLQotICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IG51bUl0ZW1zXyAmJgotICAgICAgaXRlbVR5cGVzX1tpbmRleF0gPT0gJ3AnKSB7Ci0gICAgYXAgPSAoc3RydWN0IGRlZmlBc3NlcnRQYXRoKikoaXRlbXNfW2luZGV4XSk7Ci0gICAgaWYgKGZyb21JbnN0KSAqZnJvbUluc3QgPSBhcC0+ZnJvbUluc3RfOwotICAgIGlmIChmcm9tUGluKSAqZnJvbVBpbiA9IGFwLT5mcm9tUGluXzsKLSAgICBpZiAodG9JbnN0KSAqdG9JbnN0ID0gYXAtPnRvSW5zdF87Ci0gICAgaWYgKHRvUGluKSAqdG9QaW4gPSBhcC0+dG9QaW5fOwotICB9Ci19Ci0KLQotdm9pZCBkZWZpQXNzZXJ0aW9uOjpuZXQoaW50IGluZGV4LCBjaGFyKiogbmV0TmFtZSkgY29uc3QgewotICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IG51bUl0ZW1zXyAmJgotICAgICAgaXRlbVR5cGVzX1tpbmRleF0gPT0gJ24nKSB7Ci0gICAgaWYgKG5ldE5hbWUpICpuZXROYW1lID0gKGNoYXIqKShpdGVtc19baW5kZXhdKTsKLSAgfQotfQotCi0KLXZvaWQgZGVmaUFzc2VydGlvbjo6YnVtcEl0ZW1zKCkgewotICBpbnQgaTsKLSAgY2hhciogbmV3VHlwZXM7Ci0gIGludCoqIG5ld0l0ZW1zOwotICAobnVtSXRlbXNBbGxvY2F0ZWRfKSAqPSAyOwotICBuZXdUeXBlcyA9IChjaGFyKiltYWxsb2MobnVtSXRlbXNBbGxvY2F0ZWRfICogc2l6ZW9mKGNoYXIpKTsKLSAgbmV3SXRlbXMgPSAoaW50KiopbWFsbG9jKG51bUl0ZW1zQWxsb2NhdGVkXyAqIHNpemVvZihpbnQqKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBudW1JdGVtc187IGkrKykgewotICAgIG5ld0l0ZW1zW2ldID0gaXRlbXNfW2ldOwotICAgIG5ld1R5cGVzW2ldID0gaXRlbVR5cGVzX1tpXTsKLSAgfQotICBmcmVlKChjaGFyKilpdGVtc18pOwotICBmcmVlKChjaGFyKilpdGVtVHlwZXNfKTsKLSAgaXRlbXNfID0gbmV3SXRlbXM7Ci0gIGl0ZW1UeXBlc18gPSBuZXdUeXBlczsKLX0KLQotCi12b2lkIGRlZmlBc3NlcnRpb246OmFkZE5ldChjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIGludCBpOwotICBjaGFyKiBzLCAqczE7Ci0KLSAgLy8gc2V0IHdpcmVkbG9naWMgdG8gZmFsc2UKLSAgaXNXaXJlZGxvZ2ljXyA9IDA7Ci0KLSAgLy8gbWFrZSBvdXIgb3duIGNvcHkKLSAgaSA9IHN0cmxlbihuYW1lKSArIDE7Ci0gIGlmIChuYW1lW2ktMl0gPT0gJywnKSB7Ci0gICAgIHMgID0gKGNoYXIqKW1hbGxvYyhpLTEpOwotICAgICBzMSA9IChjaGFyKiltYWxsb2MoaS0xKTsKLSAgICAgc3RybmNweShzMSwgbmFtZSwgaS0yKTsKLSAgICAgczFbaS0yXSA9ICdcMCc7Ci0gICAgIHN0cmNweShzLCBkZWZEYXRhLT5ERUZDQVNFKHMxKSk7Ci0gICAgIGZyZWUoczEpOwotICB9IGVsc2UgewotICAgICBzID0gKGNoYXIqKW1hbGxvYyhpKTsKLSAgICAgc3RyY3B5KHMsIGRlZkRhdGEtPkRFRkNBU0UobmFtZSkpOwotICB9Ci0KLSAgLy8gbWFrZSBzdXJlIHRoZXJlIGlzIHNwYWNlIGluIHRoZSBhcnJheQotICBpZiAobnVtSXRlbXNfID49IG51bUl0ZW1zQWxsb2NhdGVkXykKLSAgICBidW1wSXRlbXMoKTsKLQotICAvLyBwbGFjZSBpdAotICBpID0gbnVtSXRlbXNfOwotICBpdGVtc19baV0gPSAoaW50KilzOwotICBpdGVtVHlwZXNfW2ldID0gJ24nOwotICBudW1JdGVtc18gPSBpICsgMTsKLSAgLy9zdHJjcHkoaXRlbVR5cGVzXywgIm4iKTsKLX0KLQotCi12b2lkIGRlZmlBc3NlcnRpb246OmFkZFBhdGgoY29uc3QgY2hhciogZnJvbUluc3QsIGNvbnN0IGNoYXIqIGZyb21QaW4sCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0b0luc3QsIGNvbnN0IGNoYXIqIHRvUGluKSB7Ci0gIGludCBpOwotICBzdHJ1Y3QgZGVmaUFzc2VydFBhdGgqIHM7Ci0KLSAgLy8gc2V0IHdpcmVkbG9naWMgdG8gZmFsc2UKLSAgaXNXaXJlZGxvZ2ljXyA9IDA7Ci0KLSAgLy8gbWFrZSBvdXIgb3duIGNvcHkKLSAgcyA9IChzdHJ1Y3QgZGVmaUFzc2VydFBhdGgqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGRlZmlBc3NlcnRQYXRoKSk7Ci0gIGkgPSBzdHJsZW4oZnJvbUluc3QpICsgMTsKLSAgcy0+ZnJvbUluc3RfID0gKGNoYXIqKW1hbGxvYyhpKTsKLSAgc3RyY3B5KHMtPmZyb21JbnN0XywgZGVmRGF0YS0+REVGQ0FTRShmcm9tSW5zdCkpOwotICBpID0gc3RybGVuKHRvSW5zdCkgKyAxOwotICBzLT50b0luc3RfID0gKGNoYXIqKW1hbGxvYyhpKTsKLSAgc3RyY3B5KHMtPnRvSW5zdF8sIGRlZkRhdGEtPkRFRkNBU0UodG9JbnN0KSk7Ci0gIGkgPSBzdHJsZW4oZnJvbVBpbikgKyAxOwotICBzLT5mcm9tUGluXyA9IChjaGFyKiltYWxsb2MoaSk7Ci0gIHN0cmNweShzLT5mcm9tUGluXywgZGVmRGF0YS0+REVGQ0FTRShmcm9tUGluKSk7Ci0gIGkgPSBzdHJsZW4odG9QaW4pICsgMTsKLSAgcy0+dG9QaW5fID0gKGNoYXIqKW1hbGxvYyhpKTsKLSAgc3RyY3B5KHMtPnRvUGluXywgZGVmRGF0YS0+REVGQ0FTRSh0b1BpbikpOwotCi0gIC8vIG1ha2Ugc3VyZSB0aGVyZSBpcyBzcGFjZSBpbiB0aGUgYXJyYXkKLSAgaWYgKG51bUl0ZW1zXyA+PSBudW1JdGVtc0FsbG9jYXRlZF8pCi0gICAgYnVtcEl0ZW1zKCk7Ci0KLSAgLy8gcGxhY2UgaXQKLSAgaSA9IG51bUl0ZW1zXzsKLSAgaXRlbXNfW2ldID0gKGludCopczsKLSAgaXRlbVR5cGVzX1tpXSA9ICdwJzsKLSAgbnVtSXRlbXNfID0gaSArIDE7Ci0gIC8vc3RyY3B5KGl0ZW1UeXBlc18sICJwIik7Ci19Ci0KLQotdm9pZCBkZWZpQXNzZXJ0aW9uOjpwcmludChGSUxFKiBmKSBjb25zdCB7Ci0gIGZwcmludGYoZiwgIkFzc2VydGlvbiAlc1xuIiwgbmV0TmFtZSgpKTsKLX0KLQotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpQXNzZXJ0aW9uLmhwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaUFzc2VydGlvbi5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNDhkMmIuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpQXNzZXJ0aW9uLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2lmbmRlZiBkZWZpQXNzZXJ0aW9uX2gKLSNkZWZpbmUgZGVmaUFzc2VydGlvbl9oCi0KLSNpbmNsdWRlICJkZWZpS1JEZWZzLmhwcCIKLSNpbmNsdWRlIDxzdGRpby5oPgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0vLyBTdHJ1Y3QgaG9sZHMgdGhlIGRhdGEgZm9yIG9uZSBhc3NlcnRpb24vY29uc3RyYWludC4KLS8vIEFuIGFzc2VydGlvbiBvciBjb25zdHJhaW50IGlzIGVpdGhlciBhIG5ldC9wYXRoIHJ1bGUgb3IgYQotLy8gd2lyZWQgbG9naWMgcnVsZS4KLS8vCi0vLyAgQSBuZXQvcGF0aCBydWxlIGlzIGFuIGl0ZW0gb3IgbGlzdCBvZiBpdGVtcyBwbHVzIHNwZWNpZmljYXRpb25zLgotLy8gICAgVGhlIHNwZWNpZmljYXRpb25zIGFyZTogcmlzZS9mYWxsIG1pbi9tYXguCi0vLyAgICBUaGUgaXRlbXMgYXJlIGEgbGlzdCBvZiAob25lIG9yIG1vcmUpIG5ldCBuYW1lcyBvciBwYXRocyBvciBhCi0vLyAgICBjb21iaW5hdGlvbiBvZiBib3RoLgotLy8KLS8vICBBIHdpcmVkIGxvZ2ljIHJ1bGUgaXMgYSBuZXRuYW1lIGFuZCBhIGRpc3RhbmNlLgotLy8KLS8vICBXZSB3aWxsIE5PVCBhbGxvdyB0aGUgbWl4aW5nIG9mIHdpcmVkIGxvZ2ljIHJ1bGVzIGFuZCBuZXQvcGF0aCBkZWxheXMKLS8vICBpbiB0aGUgc2FtZSBhc3NlcnRpb24vY29uc3RyYWludC4KLS8vCi0vLyAgV2Ugd2lsbCBhbGxvdyB0aGUgcnVsZSB0byBiZSBhIHN1bSBvZiBzdW1zICh3aGljaCB3aWxsIGJlIGludGVycHJldGVkCi0vLyAgYXMganVzdCBvbmUgbGlzdCkuCi0vLwotY2xhc3MgZGVmckRhdGE7Ci0KLWNsYXNzIGRlZmlBc3NlcnRpb24gewotcHVibGljOgotICBkZWZpQXNzZXJ0aW9uKGRlZnJEYXRhICpkYXRhKTsKLSAgdm9pZCBJbml0KCk7Ci0KLSAgdm9pZCBEZXN0cm95KCk7Ci0gIH5kZWZpQXNzZXJ0aW9uKCk7Ci0KLSAgdm9pZCBzZXRDb25zdHJhaW50TW9kZSgpOwotICB2b2lkIHNldEFzc2VydGlvbk1vZGUoKTsKLSAgdm9pZCBzZXRTdW0oKTsKLSAgdm9pZCBzZXREaWZmKCk7Ci0gIHZvaWQgc2V0TmV0TmFtZShjb25zdCBjaGFyKiBuYW1lKTsKLSAgdm9pZCBzZXRSaXNlTWluKGRvdWJsZSBudW0pOwotICB2b2lkIHNldFJpc2VNYXgoZG91YmxlIG51bSk7Ci0gIHZvaWQgc2V0RmFsbE1pbihkb3VibGUgbnVtKTsKLSAgdm9pZCBzZXRGYWxsTWF4KGRvdWJsZSBudW0pOwotICB2b2lkIHNldERlbGF5KCk7Ci0gIHZvaWQgc2V0V2lyZWRsb2dpY01vZGUoKTsKLSAgdm9pZCBzZXRXaXJlZGxvZ2ljKGNvbnN0IGNoYXIqIG5ldCwgZG91YmxlIGRpc3QpOwotICB2b2lkIGFkZE5ldChjb25zdCBjaGFyKiBuYW1lKTsKLSAgdm9pZCBhZGRQYXRoKGNvbnN0IGNoYXIqIGZyb21JbnN0LCBjb25zdCBjaGFyKiBmcm9tUGluLAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogdG9JbnN0LCBjb25zdCBjaGFyKiB0b1Bpbik7Ci0gIHZvaWQgYnVtcEl0ZW1zKCk7Ci0gIHZvaWQgdW5zZXRTdW0oKTsKLQotICBpbnQgaXNBc3NlcnRpb24oKSBjb25zdDsgIC8vIEVpdGhlciBpc0Fzc2VydGlvbiBvciBpc0NvbnN0cmFpbnQgaXMgdHJ1ZQotICBpbnQgaXNDb25zdHJhaW50KCkgY29uc3Q7Ci0gIGludCBpc1dpcmVkbG9naWMoKSBjb25zdDsgLy8gRWl0aGVyIGlzV2lyZWRsb2dpYyBvciBpc0RlbGF5IGlzIHRydWUKLSAgaW50IGlzRGVsYXkoKSBjb25zdDsKLSAgaW50IGlzU3VtKCkgY29uc3Q7Ci0gIGludCBpc0RpZmYoKSBjb25zdDsKLSAgaW50IGhhc1Jpc2VNaW4oKSBjb25zdDsKLSAgaW50IGhhc1Jpc2VNYXgoKSBjb25zdDsKLSAgaW50IGhhc0ZhbGxNaW4oKSBjb25zdDsKLSAgaW50IGhhc0ZhbGxNYXgoKSBjb25zdDsKLSAgZG91YmxlIHJpc2VNaW4oKSBjb25zdDsKLSAgZG91YmxlIHJpc2VNYXgoKSBjb25zdDsKLSAgZG91YmxlIGZhbGxNaW4oKSBjb25zdDsKLSAgZG91YmxlIGZhbGxNYXgoKSBjb25zdDsKLSAgY29uc3QgY2hhciogbmV0TmFtZSgpIGNvbnN0OyAvLyBXaXJlZCBsb2dpYyBuZXQgbmFtZQotICBkb3VibGUgZGlzdGFuY2UoKSBjb25zdDsgLy8gV2lyZWQgbG9naWMgZGlzdGFuY2UKLSAgaW50IG51bUl0ZW1zKCkgY29uc3Q7ICAvLyBudW1iZXIgb2YgcGF0aHMgb3IgbmV0cyAKLSAgaW50IGlzUGF0aChpbnQgaW5kZXgpIGNvbnN0OyAgIC8vIGlzIGl0ZW0gI2luZGV4IGEgcGF0aD8KLSAgaW50IGlzTmV0KGludCBpbmRleCkgY29uc3Q7ICAgIC8vIGlzIGl0ZW0gI2luZGV4IGEgbmV0PwotICB2b2lkIHBhdGgoaW50IGluZGV4LCBjaGFyKiogZnJvbUluc3QsIGNoYXIqKiBmcm9tUGluLAotCSAgIGNoYXIqKiB0b0luc3QsIGNoYXIqKiB0b1BpbikgY29uc3Q7IC8vIEdldCBwYXRoIGRhdGEgZm9yIGl0ZW0gI2luZGV4Ci0gIHZvaWQgbmV0KGludCBpbmRleCwgY2hhcioqIG5ldE5hbWUpIGNvbnN0OyAgIC8vIEdldCBuZXQgZGF0YSBmb3IgaXRlbSAjaW5kZXgKLQotICB2b2lkIGNsZWFyKCk7Ci0gIHZvaWQgcHJpbnQoRklMRSogZikgY29uc3Q7Ci0KLQotcHJvdGVjdGVkOgotICBjaGFyIGlzQXNzZXJ0aW9uXzsKLSAgY2hhciBpc1N1bV87Ci0gIGNoYXIgaXNEaWZmXzsKLSAgY2hhciBoYXNSaXNlTWluXzsKLSAgY2hhciBoYXNSaXNlTWF4XzsKLSAgY2hhciBoYXNGYWxsTWluXzsKLSAgY2hhciBoYXNGYWxsTWF4XzsKLSAgY2hhciBpc1dpcmVkbG9naWNfOwotICBjaGFyIGlzRGVsYXlfOwotICBjaGFyKiBuZXROYW1lXzsgICAgIC8vIHdpcmVkIGxvZ2ljIG5ldCBuYW1lCi0gIGludCBuZXROYW1lTGVuZ3RoXzsKLSAgZG91YmxlIHJpc2VNaW5fOwotICBkb3VibGUgcmlzZU1heF87Ci0gIGRvdWJsZSBmYWxsTWluXzsKLSAgZG91YmxlIGZhbGxNYXhfOyAgICAvLyBhbHNvIHVzZWQgdG8gc3RvcmUgdGhlIHdpcmVkIGxvZ2ljIGRpc3QKLSAgaW50IG51bUl0ZW1zXzsKLSAgaW50IG51bUl0ZW1zQWxsb2NhdGVkXzsKLSAgY2hhciogaXRlbVR5cGVzXzsKLSAgaW50KiogaXRlbXNfOyAgICAgICAvLyBub3QgcmVhbGx5IGludGVnZXJzLgotCi0gIGRlZnJEYXRhICpkZWZEYXRhOwotfTsKLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLVVTRV9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaUJsb2NrYWdlLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaUJsb2NrYWdlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY0ODQ5ZS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlCbG9ja2FnZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NTkgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMyAtIDIwMTUsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlICJsZXguaCIKLSNpbmNsdWRlICJkZWZpQmxvY2thZ2UuaHBwIgotI2luY2x1ZGUgImRlZmlEZWJ1Zy5ocHAiCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyAgICBkZWZpQmxvY2thZ2VzCi0vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1kZWZpQmxvY2thZ2U6OmRlZmlCbG9ja2FnZShkZWZyRGF0YSAqZGF0YSkgCi0gOiBkZWZEYXRhKGRhdGEpCi17Ci0gIEluaXQoKTsKLX0KLQotCi12b2lkIGRlZmlCbG9ja2FnZTo6SW5pdCgpIHsKLSAgbnVtUG9seXNfID0gMDsKLSAgY2xlYXIoKTsKLSAgbGF5ZXJOYW1lXyA9IDA7Ci0gIGNvbXBvbmVudE5hbWVfID0gMDsKLSAgbGF5ZXJOYW1lTGVuZ3RoXyA9IDA7Ci0gIGNvbXBvbmVudE5hbWVMZW5ndGhfID0gMDsKLSAgeGxfID0gMDsKLSAgeWxfID0gMDsKLSAgeGhfID0gMDsKLSAgeWhfID0gMDsKLSAgcmVjdHNBbGxvY2F0ZWRfID0gMDsKLSAgcG9seXNBbGxvY2F0ZWRfID0gMDsKLSAgcG9seWdvbnNfID0gMDsKLX0KLQotCi1kZWZpQmxvY2thZ2U6On5kZWZpQmxvY2thZ2UoKSB7Ci0gIERlc3Ryb3koKTsKLX0KLQotCi12b2lkIGRlZmlCbG9ja2FnZTo6Y2xlYXIoKSB7Ci0gIGhhc0xheWVyXyA9IDA7Ci0gIGhhc1BsYWNlbWVudF8gPSAwOwotICBoYXNDb21wb25lbnRfID0gMDsKLSAgaGFzU2xvdHNfID0gMDsKLSAgaGFzRmlsbHNfID0gMDsKLSAgaGFzUHVzaGRvd25fID0gMDsKLSAgaGFzRXhjZXB0cGduZXRfID0gMDsKLSAgaGFzU29mdF8gPSAwOwotICBtYXhEZW5zaXR5XyA9IC0xOwotICBtaW5TcGFjaW5nXyA9IC0xOwotICB3aWR0aF8gPSAtMTsKLSAgbnVtUmVjdGFuZ2xlc18gPSAwOwotICBtYXNrXyA9IDA7Ci19Ci0KLQotdm9pZCBkZWZpQmxvY2thZ2U6OmNsZWFyUG9seSgpIHsKLSAgc3RydWN0IGRlZmlQb2ludHMqIHA7Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1Qb2x5c187IGkrKykgewotICAgIHAgPSBwb2x5Z29uc19baV07Ci0gICAgZnJlZSgoY2hhciopKHAtPngpKTsKLSAgICBmcmVlKChjaGFyKikocC0+eSkpOwotICAgIGZyZWUoKGNoYXIqKShwb2x5Z29uc19baV0pKTsKLSAgfQotICBudW1Qb2x5c18gPSAwOwotfQotCi12b2lkIGRlZmlCbG9ja2FnZTo6RGVzdHJveSgpIHsKLSAgaWYgKGxheWVyTmFtZV8pIGZyZWUobGF5ZXJOYW1lXyk7Ci0gIGlmIChjb21wb25lbnROYW1lXykgZnJlZShjb21wb25lbnROYW1lXyk7Ci0gIGxheWVyTmFtZV8gPSAwOwotICBjb21wb25lbnROYW1lXyA9IDA7Ci0gIGlmIChyZWN0c0FsbG9jYXRlZF8pIHsKLSAgICBmcmVlKChjaGFyKikoeGxfKSk7Ci0gICAgZnJlZSgoY2hhciopKHlsXykpOwotICAgIGZyZWUoKGNoYXIqKSh4aF8pKTsKLSAgICBmcmVlKChjaGFyKikoeWhfKSk7Ci0gICAgcmVjdHNBbGxvY2F0ZWRfID0gMDsKLSAgICB4bF8gPSAwOwotICAgIHlsXyA9IDA7Ci0gICAgeGhfID0gMDsKLSAgICB5aF8gPSAwOwotICB9Ci0gIGNsZWFyUG9seSgpOwotICBmcmVlKChjaGFyKikocG9seWdvbnNfKSk7Ci0gIHBvbHlnb25zXyA9IDA7Ci0gIGNsZWFyKCk7Ci19Ci0KLQotdm9pZCBkZWZpQmxvY2thZ2U6OnNldExheWVyKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgaW50IGxlbiA9IHN0cmxlbihuYW1lKSArIDE7Ci0gIGlmIChsYXllck5hbWVMZW5ndGhfIDwgbGVuKSB7Ci0gICAgaWYgKGxheWVyTmFtZV8pIGZyZWUobGF5ZXJOYW1lXyk7Ci0gICAgbGF5ZXJOYW1lXyA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgICBsYXllck5hbWVMZW5ndGhfID0gbGVuOwotICB9Ci0gIHN0cmNweShsYXllck5hbWVfLCBkZWZEYXRhLT5ERUZDQVNFKG5hbWUpKTsKLSAgaGFzTGF5ZXJfID0gMTsKLX0KLQotCi12b2lkIGRlZmlCbG9ja2FnZTo6c2V0UGxhY2VtZW50KCkgewotCi0gIC8qIDEwLzI5LzIwMDEgLSBXYW5kYSBkYSBSb3NhLCBuZXcgZW5oYW5jZW1lbnQgKi8KLSAgaGFzUGxhY2VtZW50XyA9IDE7Ci0gIHJldHVybjsKLX0KLQotdm9pZCBkZWZpQmxvY2thZ2U6OnNldENvbXBvbmVudChjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIGludCBsZW47Ci0KLSAgLyogMTAvMjkvMjAwMSAtIFdhbmRhIGRhIFJvc2EsIGNvbXBvbmVudCBuYW1lIGlzIHJlcXVpcmVkICovCi0gIGxlbiA9IHN0cmxlbihuYW1lKSArIDE7Ci0gIGlmIChjb21wb25lbnROYW1lTGVuZ3RoXyA8IGxlbikgewotICAgIGlmIChjb21wb25lbnROYW1lXykgZnJlZShjb21wb25lbnROYW1lXyk7Ci0gICAgY29tcG9uZW50TmFtZV8gPSAoY2hhciopbWFsbG9jKGxlbik7Ci0gICAgY29tcG9uZW50TmFtZUxlbmd0aF8gPSBsZW47Ci0gIH0KLSAgc3RyY3B5KGNvbXBvbmVudE5hbWVfLCBkZWZEYXRhLT5ERUZDQVNFKG5hbWUpKTsKLSAgaGFzQ29tcG9uZW50XyA9IDE7Ci19Ci0KLXZvaWQgZGVmaUJsb2NrYWdlOjpzZXRTbG90cygpIHsKLSAgaGFzU2xvdHNfID0gMTsKLX0KLQotdm9pZCBkZWZpQmxvY2thZ2U6OnNldEZpbGxzKCkgewotICBoYXNGaWxsc18gPSAxOwotfQotCi12b2lkIGRlZmlCbG9ja2FnZTo6c2V0UHVzaGRvd24oKSB7Ci0gIGhhc1B1c2hkb3duXyA9IDE7Ci19Ci0KLS8vIDUuNwotdm9pZCBkZWZpQmxvY2thZ2U6OnNldEV4Y2VwdHBnbmV0KCkgewotICBoYXNFeGNlcHRwZ25ldF8gPSAxOwotfQotCi0vLyA1LjcKLXZvaWQgZGVmaUJsb2NrYWdlOjpzZXRTb2Z0KCkgewotICBoYXNTb2Z0XyA9IDE7Ci19Ci0KLS8vIDUuNwotdm9pZCBkZWZpQmxvY2thZ2U6OnNldFBhcnRpYWwoZG91YmxlIG1heERlbnNpdHkpIHsKLSAgbWF4RGVuc2l0eV8gPSBtYXhEZW5zaXR5OwotfQotCi12b2lkIGRlZmlCbG9ja2FnZTo6c2V0U3BhY2luZyhpbnQgbWluU3BhY2luZykgewotICBtaW5TcGFjaW5nXyA9IG1pblNwYWNpbmc7Ci19Ci0KLXZvaWQgZGVmaUJsb2NrYWdlOjpzZXREZXNpZ25SdWxlV2lkdGgoaW50IHdpZHRoKSB7Ci0gIHdpZHRoXyA9IHdpZHRoOwotfQotCi12b2lkIGRlZmlCbG9ja2FnZTo6c2V0TWFzayhpbnQgY29sb3JNYXNrKSB7Ci0gIG1hc2tfID0gY29sb3JNYXNrOwotfQotCi12b2lkIGRlZmlCbG9ja2FnZTo6YWRkUmVjdChpbnQgeGwsIGludCB5bCwgaW50IHhoLCBpbnQgeWgpIHsKLSAgaWYgKG51bVJlY3RhbmdsZXNfID09IHJlY3RzQWxsb2NhdGVkXykgewotICAgIGludCBpOwotICAgIGludCBtYXggPSByZWN0c0FsbG9jYXRlZF8gPSAocmVjdHNBbGxvY2F0ZWRfID09IDApID8KLSAgICAgICAgICAyIDogcmVjdHNBbGxvY2F0ZWRfICogMjsKLSAgICBpbnQqIG5ld3hsID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKm1heCk7Ci0gICAgaW50KiBuZXd5bCA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSptYXgpOwotICAgIGludCogbmV3eGggPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkqbWF4KTsKLSAgICBpbnQqIG5ld3loID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKm1heCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bVJlY3RhbmdsZXNfOyBpKyspIHsKLSAgICAgIG5ld3hsW2ldID0geGxfW2ldOwotICAgICAgbmV3eWxbaV0gPSB5bF9baV07Ci0gICAgICBuZXd4aFtpXSA9IHhoX1tpXTsKLSAgICAgIG5ld3loW2ldID0geWhfW2ldOwotICAgIH0KLSAgICBmcmVlKChjaGFyKikoeGxfKSk7Ci0gICAgZnJlZSgoY2hhciopKHlsXykpOwotICAgIGZyZWUoKGNoYXIqKSh4aF8pKTsKLSAgICBmcmVlKChjaGFyKikoeWhfKSk7Ci0gICAgeGxfID0gbmV3eGw7Ci0gICAgeWxfID0gbmV3eWw7Ci0gICAgeGhfID0gbmV3eGg7Ci0gICAgeWhfID0gbmV3eWg7Ci0gIH0KLSAgeGxfW251bVJlY3RhbmdsZXNfXSA9IHhsOwotICB5bF9bbnVtUmVjdGFuZ2xlc19dID0geWw7Ci0gIHhoX1tudW1SZWN0YW5nbGVzX10gPSB4aDsKLSAgeWhfW251bVJlY3RhbmdsZXNfXSA9IHloOwotICBudW1SZWN0YW5nbGVzXyArPSAxOwotfQotCi0KLS8vIDUuNgotdm9pZCBkZWZpQmxvY2thZ2U6OmFkZFBvbHlnb24oZGVmaUdlb21ldHJpZXMqIGdlb20pIHsKLSAgc3RydWN0IGRlZmlQb2ludHMqIHA7Ci0gIGludCB4LCB5OwotICBpbnQgaTsKLQotICBpZiAobnVtUG9seXNfID09IHBvbHlzQWxsb2NhdGVkXykgewotICAgIHN0cnVjdCBkZWZpUG9pbnRzKiogcG9seTsKLSAgICBwb2x5c0FsbG9jYXRlZF8gPSAocG9seXNBbGxvY2F0ZWRfID09IDApID8KLSAgICAgICAgICAyIDogcG9seXNBbGxvY2F0ZWRfICogMjsKLSAgICBwb2x5ID0gKHN0cnVjdCBkZWZpUG9pbnRzKiopbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGVmaVBvaW50cyopICoKLSAgICAgICAgICAgIHBvbHlzQWxsb2NhdGVkXyk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bVBvbHlzXzsgaSsrKQotICAgICAgcG9seVtpXSA9IHBvbHlnb25zX1tpXTsKLSAgICBpZiAocG9seWdvbnNfKQotICAgICAgZnJlZSgoY2hhciopKHBvbHlnb25zXykpOwotICAgIHBvbHlnb25zXyA9IHBvbHk7Ci0gIH0KLSAgcCA9IChzdHJ1Y3QgZGVmaVBvaW50cyopbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGVmaVBvaW50cykpOwotICBwLT5udW1Qb2ludHMgPSBnZW9tLT5udW1Qb2ludHMoKTsKLSAgcC0+eCA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSpwLT5udW1Qb2ludHMpOwotICBwLT55ID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKnAtPm51bVBvaW50cyk7Ci0gIGZvciAoaSA9IDA7IGkgPCBwLT5udW1Qb2ludHM7IGkrKykgewotICAgIGdlb20tPnBvaW50cyhpLCAmeCwgJnkpOwotICAgIHAtPnhbaV0gPSB4OwotICAgIHAtPnlbaV0gPSB5OwotICB9Ci0gIHBvbHlnb25zX1tudW1Qb2x5c19dID0gcDsKLSAgbnVtUG9seXNfICs9IDE7Ci19Ci0KLQotaW50IGRlZmlCbG9ja2FnZTo6aGFzTGF5ZXIoKSBjb25zdCB7Ci0gIHJldHVybiBoYXNMYXllcl87Ci19Ci0KLQotaW50IGRlZmlCbG9ja2FnZTo6aGFzUGxhY2VtZW50KCkgY29uc3QgewotICByZXR1cm4gaGFzUGxhY2VtZW50XzsKLX0KLQotCi1pbnQgZGVmaUJsb2NrYWdlOjpoYXNDb21wb25lbnQoKSBjb25zdCB7Ci0gIHJldHVybiBoYXNDb21wb25lbnRfOwotfQotCi0KLWludCBkZWZpQmxvY2thZ2U6Omhhc1Nsb3RzKCkgY29uc3QgewotICByZXR1cm4gaGFzU2xvdHNfOwotfQotCi0KLWludCBkZWZpQmxvY2thZ2U6Omhhc0ZpbGxzKCkgY29uc3QgewotICByZXR1cm4gaGFzRmlsbHNfOwotfQotCi0KLWludCBkZWZpQmxvY2thZ2U6Omhhc1B1c2hkb3duKCkgY29uc3QgewotICByZXR1cm4gaGFzUHVzaGRvd25fOwotfQotCi0vLyA1LjcKLWludCBkZWZpQmxvY2thZ2U6Omhhc0V4Y2VwdHBnbmV0KCkgY29uc3QgewotICByZXR1cm4gaGFzRXhjZXB0cGduZXRfOwotfQotCi0vLyA1LjcKLWludCBkZWZpQmxvY2thZ2U6Omhhc1NvZnQoKSBjb25zdCB7Ci0gIHJldHVybiBoYXNTb2Z0XzsKLX0KLQotLy8gNS43Ci1pbnQgZGVmaUJsb2NrYWdlOjpoYXNQYXJ0aWFsKCkgY29uc3QgewotICBpZiAobWF4RGVuc2l0eV8gPT0gLTEpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiAxOwotfQotCi0vLyA1LjcKLWRvdWJsZSBkZWZpQmxvY2thZ2U6OnBsYWNlbWVudE1heERlbnNpdHkoKSBjb25zdCB7Ci0gIHJldHVybiBtYXhEZW5zaXR5XzsKLX0KLQotaW50IGRlZmlCbG9ja2FnZTo6aGFzU3BhY2luZygpIGNvbnN0IHsKLSAgaWYgKG1pblNwYWNpbmdfID09IC0xKQotICAgIHJldHVybiAwOwotICByZXR1cm4gMTsKLX0KLQotCi1pbnQgZGVmaUJsb2NrYWdlOjpoYXNEZXNpZ25SdWxlV2lkdGgoKSBjb25zdCB7Ci0gIGlmICh3aWR0aF8gPT0gLTEpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiAxOwotfQotCi1pbnQgZGVmaUJsb2NrYWdlOjpoYXNNYXNrKCkgY29uc3QgewotICAgIHJldHVybiBtYXNrXzsKLX0KLQotaW50IGRlZmlCbG9ja2FnZTo6bWluU3BhY2luZygpIGNvbnN0IHsKLSAgcmV0dXJuIG1pblNwYWNpbmdfOwotfQotCi0KLWludCBkZWZpQmxvY2thZ2U6OmRlc2lnblJ1bGVXaWR0aCgpIGNvbnN0IHsKLSAgcmV0dXJuIHdpZHRoXzsKLX0KLQotaW50IGRlZmlCbG9ja2FnZTo6bWFzaygpIGNvbnN0IHsKLSAgcmV0dXJuIG1hc2tfOwotfQotCi1jb25zdCBjaGFyKiBkZWZpQmxvY2thZ2U6OmxheWVyTmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGxheWVyTmFtZV87Ci19Ci0KLQotY29uc3QgY2hhciogZGVmaUJsb2NrYWdlOjpsYXllckNvbXBvbmVudE5hbWUoKSBjb25zdCB7Ci0gIHJldHVybiBjb21wb25lbnROYW1lXzsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpQmxvY2thZ2U6OnBsYWNlbWVudENvbXBvbmVudE5hbWUoKSBjb25zdCB7Ci0gIHJldHVybiBjb21wb25lbnROYW1lXzsKLX0KLQotCi1pbnQgZGVmaUJsb2NrYWdlOjpudW1SZWN0YW5nbGVzKCkgY29uc3QgewotICByZXR1cm4gbnVtUmVjdGFuZ2xlc187Ci19Ci0KLQotaW50IGRlZmlCbG9ja2FnZTo6eGwoaW50IGluZGV4KSBjb25zdCB7Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtUmVjdGFuZ2xlc18pIHsKLSAgICBkZWZpRXJyb3IoMSwgMCwgImJhZCBpbmRleCBmb3IgYmxvY2thZ2UgeGwiLCBkZWZEYXRhKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4geGxfW2luZGV4XTsKLX0KLQotCi1pbnQgZGVmaUJsb2NrYWdlOjp5bChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1SZWN0YW5nbGVzXykgewotICAgIGRlZmlFcnJvcigxLCAwLCAiYmFkIGluZGV4IGZvciBibG9ja2FnZSB5bCIsIGRlZkRhdGEpOwotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiB5bF9baW5kZXhdOwotfQotCi0KLWludCBkZWZpQmxvY2thZ2U6OnhoKGludCBpbmRleCkgY29uc3QgewotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVJlY3RhbmdsZXNfKSB7Ci0gICAgZGVmaUVycm9yKDEsIDAsICJiYWQgaW5kZXggZm9yIGJsb2NrYWdlIHhoIiwgZGVmRGF0YSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIHhoX1tpbmRleF07Ci19Ci0KLQotaW50IGRlZmlCbG9ja2FnZTo6eWgoaW50IGluZGV4KSBjb25zdCB7Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtUmVjdGFuZ2xlc18pIHsKLSAgICBkZWZpRXJyb3IoMSwgMCwgImJhZCBpbmRleCBmb3IgYmxvY2thZ2UgeWgiLCBkZWZEYXRhKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4geWhfW2luZGV4XTsKLX0KLQotCi0vLyA1LjYKLWludCBkZWZpQmxvY2thZ2U6Om51bVBvbHlnb25zKCkgY29uc3QgewotICByZXR1cm4gbnVtUG9seXNfOwotfQotCi0KLS8vIDUuNgotc3RydWN0IGRlZmlQb2ludHMgZGVmaUJsb2NrYWdlOjpnZXRQb2x5Z29uKGludCBpbmRleCkgY29uc3QgewotICByZXR1cm4gKihwb2x5Z29uc19baW5kZXhdKTsKLX0KLQotCi12b2lkIGRlZmlCbG9ja2FnZTo6cHJpbnQoRklMRSogZikgY29uc3QgewotICBpbnQgaSwgajsKLSAgc3RydWN0IGRlZmlQb2ludHMgcG9pbnRzOwotCi0gIGlmIChoYXNMYXllcigpKSB7Ci0gICAgZnByaW50ZihmLCAiLSBMQVlFUiAlcyIsIGxheWVyTmFtZSgpKTsKLSAgICBpZiAoaGFzQ29tcG9uZW50KCkpCi0gICAgICBmcHJpbnRmKGYsICIgKyBDT01QT05FTlQgJXMiLCBsYXllckNvbXBvbmVudE5hbWUoKSk7Ci0gICAgaWYgKGhhc1Nsb3RzKCkpCi0gICAgICBmcHJpbnRmKGYsICIgKyBTTE9UUyIpOwotICAgIGlmIChoYXNGaWxscygpKQotICAgICAgZnByaW50ZihmLCAiICsgRklMTFMiKTsKLSAgICBpZiAoaGFzUHVzaGRvd24oKSkKLSAgICAgIGZwcmludGYoZiwgIiArIFBVU0hET1dOIik7Ci0gICAgaWYgKGhhc0V4Y2VwdHBnbmV0KCkpCi0gICAgICBmcHJpbnRmKGYsICIgKyBFWENFUFRQR05FVCIpOwotICAgIGZwcmludGYoZiwgIlxuIik7Ci0gIH0KLSAgaWYgKGhhc1BsYWNlbWVudCgpKSB7Ci0gICAgZnByaW50ZihmLCAiLSBQTEFDRU1FTlQiKTsKLSAgICBpZiAoaGFzQ29tcG9uZW50KCkpCi0gICAgICBmcHJpbnRmKGYsICIgKyBDT01QT05FTlQgJXMiLCBsYXllckNvbXBvbmVudE5hbWUoKSk7Ci0gICAgaWYgKGhhc1B1c2hkb3duKCkpCi0gICAgICBmcHJpbnRmKGYsICIgKyBQVVNIRE9XTiIpOwotICAgIGlmIChoYXNTb2Z0KCkpCi0gICAgICBmcHJpbnRmKGYsICIgKyBTT0ZUIik7Ci0gICAgaWYgKGhhc1BhcnRpYWwoKSkKLSAgICAgIGZwcmludGYoZiwgIiArIFBBUlRJQUwgJWYiLCBwbGFjZW1lbnRNYXhEZW5zaXR5KCkpOwotICAgIGZwcmludGYoZiwgIlxuIik7Ci0gIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgbnVtUmVjdGFuZ2xlcygpOyBpKyspIHsKLSAgICBmcHJpbnRmKGYsICIgICBSRUNUICVkICVkICVkICVkXG4iLCB4bChpKSwgeWwoaSksIHhoKGkpLCB5aChpKSk7Ci0gIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgbnVtUG9seWdvbnMoKTsgaSsrKSB7Ci0gICAgZnByaW50ZihmLCAiICAgUE9MWUdPTiAiKTsKLSAgICBwb2ludHMgPSBnZXRQb2x5Z29uKGkpOwotICAgIGZvciAoaiA9IDA7IGogPCBwb2ludHMubnVtUG9pbnRzOyBqKyspCi0gICAgICBmcHJpbnRmKGYsICIlZCAlZCAiLCBwb2ludHMueFtqXSwgcG9pbnRzLnlbal0pOwotICAgIGZwcmludGYoZiwiXG4iKTsKLSAgfQotICBmcHJpbnRmKGYsIlxuIik7Ci19Ci1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpQmxvY2thZ2UuaHBwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpQmxvY2thZ2UuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjU5NjczLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaUJsb2NrYWdlLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2lmbmRlZiBkZWZpQkxPQ0tBR0VTX2gKLSNkZWZpbmUgZGVmaUJMT0NLQUdFU19oCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImRlZmlLUkRlZnMuaHBwIgotI2luY2x1ZGUgImRlZmlNaXNjLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLWNsYXNzIGRlZnJEYXRhOwotCi1jbGFzcyBkZWZpQmxvY2thZ2UgewotcHVibGljOgotICBkZWZpQmxvY2thZ2UoZGVmckRhdGEgKmRhdGEpOwotICB2b2lkIEluaXQoKTsKLQotICB2b2lkIERlc3Ryb3koKTsKLSAgfmRlZmlCbG9ja2FnZSgpOwotCi0gIHZvaWQgY2xlYXIoKTsKLSAgdm9pZCBjbGVhclBvbHkoKTsKLQotICB2b2lkIHNldExheWVyKGNvbnN0IGNoYXIqIG5hbWUpOwotICB2b2lkIHNldFBsYWNlbWVudCgpOwotICB2b2lkIHNldENvbXBvbmVudChjb25zdCBjaGFyKiBuYW1lKTsKLSAgdm9pZCBzZXRTbG90cygpOwotICB2b2lkIHNldEZpbGxzKCk7Ci0gIHZvaWQgc2V0UHVzaGRvd24oKTsKLSAgdm9pZCBzZXRFeGNlcHRwZ25ldCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgdm9pZCBzZXRTb2Z0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgdm9pZCBzZXRQYXJ0aWFsKGRvdWJsZSBtYXhEZW5zaXR5KTsgICAgICAgICAgICAgICAvLyA1LjcKLSAgdm9pZCBzZXRTcGFjaW5nKGludCBtaW5TcGFjaW5nKTsKLSAgdm9pZCBzZXREZXNpZ25SdWxlV2lkdGgoaW50IHdpZHRoKTsKLSAgdm9pZCBzZXRNYXNrKGludCBtYXNrQ29sb3IpOyAgICAgICAgICAgICAgICAgICAgICAvLyA1LjgKLSAgdm9pZCBhZGRSZWN0KGludCB4bCwgaW50IHlsLCBpbnQgeGgsIGludCB5aCk7Ci0gIHZvaWQgYWRkUG9seWdvbihkZWZpR2VvbWV0cmllcyogZ2VvbSk7Ci0KLSAgaW50IGhhc0xheWVyKCkgY29uc3Q7Ci0gIGludCBoYXNQbGFjZW1lbnQoKSBjb25zdDsKLSAgaW50IGhhc0NvbXBvbmVudCgpIGNvbnN0OwotICBpbnQgaGFzU2xvdHMoKSBjb25zdDsKLSAgaW50IGhhc0ZpbGxzKCkgY29uc3Q7Ci0gIGludCBoYXNQdXNoZG93bigpIGNvbnN0OwotICBpbnQgaGFzRXhjZXB0cGduZXQoKSBjb25zdDsgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNwotICBpbnQgaGFzU29mdCgpIGNvbnN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNwotICBpbnQgaGFzUGFydGlhbCgpIGNvbnN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNwotICBpbnQgaGFzU3BhY2luZygpIGNvbnN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNgotICBpbnQgaGFzRGVzaWduUnVsZVdpZHRoKCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgIC8vIDUuNgotICBpbnQgaGFzTWFzaygpIGNvbnN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuOAotICBpbnQgbWFzaygpIGNvbnN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjgKLSAgaW50IG1pblNwYWNpbmcoKSBjb25zdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjYKLSAgaW50IGRlc2lnblJ1bGVXaWR0aCgpIGNvbnN0OyAgICAgICAgICAgICAgICAgICAgICAvLyA1LjYKLSAgZG91YmxlIHBsYWNlbWVudE1heERlbnNpdHkoKSBjb25zdDsgICAgICAgICAgICAgICAvLyA1LjcKLSAgY29uc3QgY2hhciogbGF5ZXJOYW1lKCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIGxheWVyQ29tcG9uZW50TmFtZSgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBwbGFjZW1lbnRDb21wb25lbnROYW1lKCkgY29uc3Q7Ci0KLSAgaW50IG51bVJlY3RhbmdsZXMoKSBjb25zdDsKLSAgaW50IHhsKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCB5bChpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgeGgoaW50IGluZGV4KSBjb25zdDsKLSAgaW50IHloKGludCBpbmRleCkgY29uc3Q7Ci0KLSAgaW50IG51bVBvbHlnb25zKCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjYKLSAgc3RydWN0IGRlZmlQb2ludHMgZ2V0UG9seWdvbihpbnQgaW5kZXgpIGNvbnN0OyAgICAvLyA1LjYKLQotICB2b2lkIHByaW50KEZJTEUqIGYpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gIGludCAgICBoYXNMYXllcl87Ci0gIGNoYXIqICBsYXllck5hbWVfOwotICBpbnQgICAgbGF5ZXJOYW1lTGVuZ3RoXzsKLSAgaW50ICAgIGhhc1BsYWNlbWVudF87Ci0gIGludCAgICBoYXNDb21wb25lbnRfOwotICBjaGFyKiAgY29tcG9uZW50TmFtZV87Ci0gIGludCAgICBjb21wb25lbnROYW1lTGVuZ3RoXzsKLSAgaW50ICAgIGhhc1Nsb3RzXzsKLSAgaW50ICAgIGhhc0ZpbGxzXzsKLSAgaW50ICAgIGhhc1B1c2hkb3duXzsgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIGludCAgICBoYXNFeGNlcHRwZ25ldF8gOyAgICAgICAgICAgICAgIC8vIDUuNwotICBpbnQgICAgaGFzU29mdF87ICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgZG91YmxlIG1heERlbnNpdHlfOyAgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIGludCAgICBtaW5TcGFjaW5nXzsKLSAgaW50ICAgIHdpZHRoXzsKLSAgaW50ICAgIG51bVJlY3RhbmdsZXNfOwotICBpbnQgICAgcmVjdHNBbGxvY2F0ZWRfOwotICBpbnQgICAgbWFza187ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjgKLSAgaW50KiAgIHhsXzsKLSAgaW50KiAgIHlsXzsKLSAgaW50KiAgIHhoXzsKLSAgaW50KiAgIHloXzsKLSAgaW50ICAgIG51bVBvbHlzXzsgICAgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIGludCAgICBwb2x5c0FsbG9jYXRlZF87ICAgICAgICAgICAgICAgIC8vIDUuNgotICBzdHJ1Y3QgZGVmaVBvaW50cyoqIHBvbHlnb25zXzsgICAgICAgICAvLyA1LjYKLQotICBkZWZyRGF0YSAqZGVmRGF0YTsKLX07Ci0KLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLVVTRV9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaUNvbXBvbmVudC5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlDb21wb25lbnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTIyMTc1Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaUNvbXBvbmVudC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5ODggKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMyAtIDIwMTYsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAiZGVmaUNvbXBvbmVudC5ocHAiCi0jaW5jbHVkZSAiZGVmaURlYnVnLmhwcCIKLSNpbmNsdWRlICJsZXguaCIKLSNpbmNsdWRlICJkZWZpVXRpbC5ocHAiCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogY2xhc3MgZGVmaUNvbXBvbmVudE1hc2tTaGlmdExheWVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZGVmaUNvbXBvbmVudE1hc2tTaGlmdExheWVyOjpkZWZpQ29tcG9uZW50TWFza1NoaWZ0TGF5ZXIoZGVmckRhdGEgKmRhdGEpCi0gOiBkZWZEYXRhKGRhdGEpCi17Ci0gICAgSW5pdCgpOwotfQotCi1kZWZpQ29tcG9uZW50TWFza1NoaWZ0TGF5ZXI6On5kZWZpQ29tcG9uZW50TWFza1NoaWZ0TGF5ZXIoKSB7Ci0gICAgRGVzdHJveSgpOwotfQotCi12b2lkIGRlZmlDb21wb25lbnRNYXNrU2hpZnRMYXllcjo6SW5pdCgpIHsKLSAgICBsYXllcnNBbGxvY2F0ZWRfID0gMDsKLSAgICBudW1MYXllcnNfID0gMDsKLSAgICBsYXllcnNfID0gMDsKLQotICAgIGJ1bXBMYXllcnMoMTYpOwotfQotCi12b2lkIGRlZmlDb21wb25lbnRNYXNrU2hpZnRMYXllcjo6RGVzdHJveSgpIHsKLSAgICBpZiAobnVtTGF5ZXJzXykgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUxheWVyc187IGkrKykgewotICAgICAgICAgICAgaWYgKGxheWVyc19baV0pIHsKLSAgICAgICAgICAgICAgICBmcmVlKGxheWVyc19baV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZyZWUoKGNoYXIqKShsYXllcnNfKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGxheWVyc0FsbG9jYXRlZF8pIHsKLSAgICAgICAgICAgIGZyZWUoKGNoYXIqKShsYXllcnNfKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbGF5ZXJzQWxsb2NhdGVkXyA9IDA7Ci0gICAgbnVtTGF5ZXJzXyA9IDA7Ci0gICAgbGF5ZXJzXyA9IDA7Ci19Ci0KLXZvaWQgZGVmaUNvbXBvbmVudE1hc2tTaGlmdExheWVyOjphZGRNYXNrU2hpZnRMYXllcihjb25zdCBjaGFyKiBsYXllcikgewotICAgIGludCBsZW4gPSBzdHJsZW4obGF5ZXIpICsgMTsKLSAgICBpZiAobnVtTGF5ZXJzXyA9PSBsYXllcnNBbGxvY2F0ZWRfKQotICAgICAgICBidW1wTGF5ZXJzKG51bUxheWVyc18gKiAyKTsKLSAgICBsYXllcnNfW251bUxheWVyc19dID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICAgIHN0cmNweShsYXllcnNfW251bUxheWVyc19dLCBkZWZEYXRhLT5ERUZDQVNFKGxheWVyKSk7Ci0gICAgKG51bUxheWVyc18pKys7Ci19Ci0KLXZvaWQgZGVmaUNvbXBvbmVudE1hc2tTaGlmdExheWVyOjpidW1wTGF5ZXJzKGludCBzaXplKSB7Ci0gICAgaW50IGk7Ci0gICAgY2hhcioqIG5ld0xheWVycyA9IChjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikqIHNpemUpOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1MYXllcnNfOyBpKyspIHsKLSAgICAgICAgbmV3TGF5ZXJzW2ldID0gbGF5ZXJzX1tpXTsKLSAgICB9Ci0gICAgaWYgKGxheWVyc18pIHsKLSAgICAgICAgZnJlZSgoY2hhciopKGxheWVyc18pKTsKLSAgICB9Ci0gICAgbGF5ZXJzXyA9IG5ld0xheWVyczsKLSAgICBsYXllcnNBbGxvY2F0ZWRfID0gc2l6ZTsKLX0KLQotdm9pZCBkZWZpQ29tcG9uZW50TWFza1NoaWZ0TGF5ZXI6OmNsZWFyKCkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtTGF5ZXJzXzsgaSsrKSB7Ci0gICAgICAgIGZyZWUobGF5ZXJzX1tpXSk7Ci0gICAgfQotICAgIG51bUxheWVyc18gPSAwOwotfQotCi1pbnQgZGVmaUNvbXBvbmVudE1hc2tTaGlmdExheWVyOjpudW1NYXNrU2hpZnRMYXllcnMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG51bUxheWVyc187Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlDb21wb25lbnRNYXNrU2hpZnRMYXllcjo6bWFza1NoaWZ0TGF5ZXIoaW50IGluZGV4KSBjb25zdCB7Ci0gICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBudW1MYXllcnNfKSB7Ci0gICAgICAgIHJldHVybiBsYXllcnNfW2luZGV4XTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIGNsYXNzIGRlZmlDb21wb25lbnQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1kZWZpQ29tcG9uZW50OjpkZWZpQ29tcG9uZW50KGRlZnJEYXRhICpkYXRhKSAKLSA6IGRlZkRhdGEoZGF0YSkKLXsKLSAgSW5pdCgpOwotfQotCi0KLXZvaWQgZGVmaUNvbXBvbmVudDo6SW5pdCgpIHsKLSAgaWRfID0gMDsKLSAgbmFtZV8gPSAwOwotICByZWdpb25OYW1lXyA9IDA7Ci0gIGZvcmVpZ25OYW1lXyA9IDA7Ci0gIEZvcmlfID0gMDsKLSAgRUVRXyA9IDA7Ci0gIGdlbmVyYXRlTmFtZV8gPSAwOwotICBtYWNyb05hbWVfID0gMDsKLSAgZ2VuZXJhdGVOYW1lU2l6ZV8gPSAwOwotICBtYXNrU2hpZnRTaXplXyA9IDA7Ci0gIG1hc2tTaGlmdF8gPSAwOwotICBtYWNyb05hbWVTaXplXyA9IDA7Ci0gIG1pbkxheWVyU2l6ZV8gPSAwOwotICBtYXhMYXllclNpemVfID0gMDsKLSAgbWluTGF5ZXJfID0gMDsKLSAgbWF4TGF5ZXJfID0gMDsKLSAgbmV0c18gPSAwOwotICBzb3VyY2VfID0gMDsKLSAgbnVtTmV0c18gPSAwOwotICBidW1wTmFtZSgxNik7Ci0gIGJ1bXBJZCgxNik7Ci0gIGJ1bXBSZWdpb25OYW1lKDE2KTsKLSAgYnVtcEVFUSgxNik7Ci0gIGJ1bXBOZXRzKDE2KTsKLSAgYnVtcEZvcmVpZ25OYW1lKDE2KTsKLSAgYnVtcE1pbkxheWVyKDE2KTsKLSAgYnVtcE1heExheWVyKDE2KTsKLSAgbnVtUHJvcHNfID0gMDsKLSAgcHJvcHNBbGxvY2F0ZWRfID0gMjsKLSAgbmFtZXNfID0gKGNoYXIqKiltYWxsb2Moc2l6ZW9mKGNoYXIqKSogMik7Ci0gIHZhbHVlc18gPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKiAyKTsKLSAgZHZhbHVlc18gPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkqIDIpOwotICB0eXBlc18gPSAoY2hhciopbWFsbG9jKHNpemVvZihjaGFyKSogMik7Ci0gIGNsZWFyKCk7Ci0KLSAgbnVtUmVjdHNfID0gMDsKLSAgcmVjdHNBbGxvY2F0ZWRfID0gMTsKLSAgcmVjdFhsXyA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSoxKTsKLSAgcmVjdFlsXyA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSoxKTsKLSAgcmVjdFhoXyA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSoxKTsKLSAgcmVjdFloXyA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSoxKTsKLX0KLQotCi12b2lkIGRlZmlDb21wb25lbnQ6OkRlc3Ryb3koKSB7Ci0gIGZyZWUobmFtZV8pOwotICBmcmVlKHJlZ2lvbk5hbWVfKTsKLSAgZnJlZShpZF8pOwotICBmcmVlKEVFUV8pOwotICBmcmVlKG1pbkxheWVyXyk7Ci0gIGZyZWUobWF4TGF5ZXJfKTsKLSAgZnJlZSgoY2hhciopKG5ldHNfKSk7Ci0gIG5ldHNBbGxvY2F0ZWRfID0gMDsgICAgICAvLyBhdm9pZCBmcmVlaW5nIGFnYWluIGxhdGVyCi0gIGlmIChzb3VyY2VfKSBmcmVlKHNvdXJjZV8pOwotICBpZiAoZm9yZWlnbk5hbWVfKSBmcmVlKGZvcmVpZ25OYW1lXyk7Ci0gIGlmIChnZW5lcmF0ZU5hbWVfKSBmcmVlKGdlbmVyYXRlTmFtZV8pOwotICBpZiAobWFjcm9OYW1lXykgZnJlZShtYWNyb05hbWVfKTsKLSAgaWYgKG5ldHNBbGxvY2F0ZWRfKSBmcmVlKChjaGFyKikobmV0c18pKTsKLSAgZnJlZSgoY2hhciopKG1hc2tTaGlmdF8pKTsKLSAgZnJlZSgoY2hhciopKG5hbWVzXykpOwotICBmcmVlKChjaGFyKikodmFsdWVzXykpOwotICBmcmVlKChjaGFyKikoZHZhbHVlc18pKTsKLSAgZnJlZSgoY2hhciopKHR5cGVzXykpOwotICBmcmVlKChjaGFyKikocmVjdFhsXykpOwotICBmcmVlKChjaGFyKikocmVjdFlsXykpOwotICBmcmVlKChjaGFyKikocmVjdFhoXykpOwotICBmcmVlKChjaGFyKikocmVjdFloXykpOwotfQotCi0KLWRlZmlDb21wb25lbnQ6On5kZWZpQ29tcG9uZW50KCkgewotICBEZXN0cm95KCk7Ci19Ci0KLQotdm9pZCBkZWZpQ29tcG9uZW50OjpJZEFuZE5hbWUoY29uc3QgY2hhciogaWQsIGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgaW50IGxlbjsKLQotICBjbGVhcigpOwotCi0gIGlmICgobGVuID0gc3RybGVuKGlkKSsxKSA+IGlkU2l6ZV8pCi0gICAgYnVtcElkKGxlbik7Ci0gIHN0cmNweShpZF8sIGRlZkRhdGEtPkRFRkNBU0UoaWQpKTsKLQotICBpZiAoKGxlbiA9IHN0cmxlbihuYW1lKSsxKSA+IG5hbWVTaXplXykKLSAgICBidW1wTmFtZShsZW4pOwotICBzdHJjcHkobmFtZV8sIGRlZkRhdGEtPkRFRkNBU0UobmFtZSkpOwotfQotCi0KLWNvbnN0IGNoYXIqIGRlZmlDb21wb25lbnQ6OnNvdXJjZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHNvdXJjZV87Ci19Ci0KLQotaW50IGRlZmlDb21wb25lbnQ6OndlaWdodCgpIGNvbnN0IHsKLSAgcmV0dXJuIHdlaWdodF87Ci19Ci0KLQotdm9pZCBkZWZpQ29tcG9uZW50OjpzZXRXZWlnaHQoaW50IHcpIHsKLSAgd2VpZ2h0XyA9IHc7Ci0gIGhhc1dlaWdodF8gPSAxOwotfQotCi1pbnQgZGVmaUNvbXBvbmVudDo6bWFza1NoaWZ0KGludCBpbmRleCkgY29uc3QgewotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbWFza1NoaWZ0U2l6ZV8pIHsKLSAgICAgICAgZGVmaUVycm9yKDEsIDAsICJiYWQgaW5kZXggZm9yIGNvbXBvbmVudCBtYXNrU2hpZnQiLCBkZWZEYXRhKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1hc2tTaGlmdF9baW5kZXhdOwotfQotCi12b2lkIGRlZmlDb21wb25lbnQ6OnNldE1hc2tTaGlmdChjb25zdCBjaGFyICpzaGlmdE1hc2spIHsKLSAgICBpbnQgc2hpZnRNYXNrTGVuZ3RoID0gc3RybGVuKHNoaWZ0TWFzayk7Ci0KLSAgICBtYXNrU2hpZnRfID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKiBzaGlmdE1hc2tMZW5ndGgpOwotICAgIG1hc2tTaGlmdFNpemVfID0gc2hpZnRNYXNrTGVuZ3RoOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaGlmdE1hc2tMZW5ndGg7IGkrKykgewotICAgICAgICBpbnQgY3VyU2hpZnQgPSBzaGlmdE1hc2tbaV0gLSAnMCc7Ci0KLSAgICAgICAgLy8gU3RyaXAgcG9zc2libGUgZXJyb3IgZGF0YS4KLSAgICAgICAgaWYgKGN1clNoaWZ0ID4gOSB8fCBjdXJTaGlmdCA8IDApIHsKLSAgICAgICAgICAgIGN1clNoaWZ0ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIG1hc2tTaGlmdF9bc2hpZnRNYXNrTGVuZ3RoIC0gaSAtIDFdID0gY3VyU2hpZnQ7Ci0gICAgfSAKLX0KLQotdm9pZCBkZWZpQ29tcG9uZW50OjpzZXRHZW5lcmF0ZShjb25zdCBjaGFyKiBuZXdOYW1lLCBjb25zdCBjaGFyKiBtYWNyb05hbWUpIHsKLSAgaW50IGxlbiA9IHN0cmxlbihuZXdOYW1lKSArIDE7Ci0KLSAgaWYgKGdlbmVyYXRlTmFtZVNpemVfIDwgbGVuKSB7Ci0gICAgaWYgKGdlbmVyYXRlTmFtZV8pIGZyZWUoZ2VuZXJhdGVOYW1lXyk7Ci0gICAgZ2VuZXJhdGVOYW1lXyA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgICBnZW5lcmF0ZU5hbWVTaXplXyA9IGxlbjsKLSAgfQotICBzdHJjcHkoZ2VuZXJhdGVOYW1lXywgZGVmRGF0YS0+REVGQ0FTRShuZXdOYW1lKSk7Ci0KLSAgbGVuID0gc3RybGVuKG1hY3JvTmFtZSkgKyAxOwotICBpZiAobWFjcm9OYW1lU2l6ZV8gPCBsZW4pIHsKLSAgICBpZiAobWFjcm9OYW1lXykgZnJlZShtYWNyb05hbWVfKTsKLSAgICBtYWNyb05hbWVfID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICAgIG1hY3JvTmFtZVNpemVfID0gbGVuOwotICB9Ci0gIHN0cmNweShtYWNyb05hbWVfLCBkZWZEYXRhLT5ERUZDQVNFKG1hY3JvTmFtZSkpOwotCi0gIGhhc0dlbmVyYXRlXyA9IDE7ICAvLyBZaW5nIFRhbiBmaXggYXQgMjAwMTA5MTgKLX0KLQotCi12b2lkIGRlZmlDb21wb25lbnQ6OnNldFNvdXJjZShjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIGludCBsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotICBzb3VyY2VfID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICBzdHJjcHkoc291cmNlXywgZGVmRGF0YS0+REVGQ0FTRShuYW1lKSk7Ci19Ci0KLQotdm9pZCBkZWZpQ29tcG9uZW50OjpzZXRSZWdpb25OYW1lKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgaW50IGxlbjsKLQotICBpZiAoKGxlbiA9IHN0cmxlbihuYW1lKSsxKSA+IHJlZ2lvbk5hbWVTaXplXykKLSAgICBidW1wUmVnaW9uTmFtZShsZW4pOwotICBzdHJjcHkocmVnaW9uTmFtZV8sIGRlZkRhdGEtPkRFRkNBU0UobmFtZSkpOwotICBoYXNSZWdpb25OYW1lXyA9IDE7Ci19Ci0KLQotdm9pZCBkZWZpQ29tcG9uZW50OjpzZXRFRVEoY29uc3QgY2hhciogbmFtZSkgewotICBpbnQgbGVuOwotCi0gIGlmICgobGVuID0gc3RybGVuKG5hbWUpKzEpID4gRUVRU2l6ZV8pCi0gICAgYnVtcEVFUShsZW4pOwotICBzdHJjcHkoRUVRXywgZGVmRGF0YS0+REVGQ0FTRShuYW1lKSk7Ci0gIGhhc0VFUV8gPSAxOwotfQotCi0KLXZvaWQgZGVmaUNvbXBvbmVudDo6c2V0UGxhY2VtZW50U3RhdHVzKGludCBuKSB7Ci0gIHN0YXR1c189IG47Ci19Ci0KLQotdm9pZCBkZWZpQ29tcG9uZW50OjpzZXRQbGFjZW1lbnRMb2NhdGlvbihpbnQgeCwgaW50IHksIGludCBvcmllbnQpIHsKLSAgeF8gPSB4OwotICB5XyA9IHk7Ci0gIG9yaWVudF8gPSBvcmllbnQ7Ci19Ci0KLQotdm9pZCBkZWZpQ29tcG9uZW50OjpzZXRSZWdpb25Cb3VuZHMoaW50IHhsLCBpbnQgeWwsIGludCB4aCwgaW50IHloKSB7Ci0gIGludCBpOwotICBpID0gbnVtUmVjdHNfOwotICBpZiAoaSA9PSByZWN0c0FsbG9jYXRlZF8pIHsKLSAgICBpbnQgbWF4ID0gcmVjdHNBbGxvY2F0ZWRfICogMjsKLSAgICBpbnQqIG54bCA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSptYXgpOwotICAgIGludCogbnlsID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKm1heCk7Ci0gICAgaW50KiBueGggPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkqbWF4KTsKLSAgICBpbnQqIG55aCA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSptYXgpOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1SZWN0c187IGkrKykgewotICAgICAgbnhsW2ldID0gcmVjdFhsX1tpXTsKLSAgICAgIG55bFtpXSA9IHJlY3RZbF9baV07Ci0gICAgICBueGhbaV0gPSByZWN0WGhfW2ldOwotICAgICAgbnloW2ldID0gcmVjdFloX1tpXTsKLSAgICB9Ci0gICAgZnJlZSgoY2hhciopKHJlY3RYbF8pKTsKLSAgICBmcmVlKChjaGFyKikocmVjdFlsXykpOwotICAgIGZyZWUoKGNoYXIqKShyZWN0WGhfKSk7Ci0gICAgZnJlZSgoY2hhciopKHJlY3RZaF8pKTsKLSAgICByZWN0WGxfID0gbnhsOwotICAgIHJlY3RZbF8gPSBueWw7Ci0gICAgcmVjdFhoXyA9IG54aDsKLSAgICByZWN0WWhfID0gbnloOwotICAgIHJlY3RzQWxsb2NhdGVkXyA9IG1heDsKLSAgfQotICByZWN0WGxfW2ldID0geGw7Ci0gIHJlY3RZbF9baV0gPSB5bDsKLSAgcmVjdFhoX1tpXSA9IHhoOwotICByZWN0WWhfW2ldID0geWg7Ci0gIG51bVJlY3RzXyArPSAxOwotfQotCi0KLS8vIDUuNgotdm9pZCBkZWZpQ29tcG9uZW50OjpzZXRIYWxvKGludCBsZWZ0LCBpbnQgYm90dG9tLCBpbnQgcmlnaHQsIGludCB0b3ApIHsKLSAgaGFzSGFsb18gPSAxOwotICBsZWZ0SGFsb18gPSBsZWZ0OyAKLSAgYm90dG9tSGFsb18gPSBib3R0b207IAotICByaWdodEhhbG9fID0gcmlnaHQ7IAotICB0b3BIYWxvXyA9IHRvcDsgCi19Ci0KLS8vIDUuNwotdm9pZCBkZWZpQ29tcG9uZW50OjpzZXRIYWxvU29mdCgpIHsKLSAgaGFzSGFsb1NvZnRfID0gMTsKLX0KLQotLy8gNS43Ci12b2lkIGRlZmlDb21wb25lbnQ6OnNldFJvdXRlSGFsbyhpbnQgaGFsb0Rpc3QsIGNvbnN0IGNoYXIqIG1pbkxheWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWF4TGF5ZXIpIHsKLSAgaW50IGxlbjsKLQotICBoYWxvRGlzdF8gPSBoYWxvRGlzdDsKLSAgaWYgKChsZW4gPSBzdHJsZW4obWluTGF5ZXIpKzEpID4gbWluTGF5ZXJTaXplXykKLSAgICBidW1wTWluTGF5ZXIobGVuKTsKLSAgc3RyY3B5KG1pbkxheWVyXywgZGVmRGF0YS0+REVGQ0FTRShtaW5MYXllcikpOwotICBpZiAoKGxlbiA9IHN0cmxlbihtYXhMYXllcikrMSkgPiBtYXhMYXllclNpemVfKQotICAgIGJ1bXBNYXhMYXllcihsZW4pOwotICBzdHJjcHkobWF4TGF5ZXJfLCBkZWZEYXRhLT5ERUZDQVNFKG1heExheWVyKSk7Ci19Ci0KLXZvaWQgZGVmaUNvbXBvbmVudDo6Y2hhbmdlSWRBbmROYW1lKGNvbnN0IGNoYXIqIGlkLCBjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIGludCBsZW47Ci0KLSAgaWYgKChsZW4gPSBzdHJsZW4oaWQpKzEpID4gaWRTaXplXykKLSAgICBidW1wSWQobGVuKTsKLSAgc3RyY3B5KGlkXywgZGVmRGF0YS0+REVGQ0FTRShpZCkpOwotCi0gIGlmICgobGVuID0gc3RybGVuKG5hbWUpKzEpID4gbmFtZVNpemVfKQotICAgIGJ1bXBOYW1lKGxlbik7Ci0gIHN0cmNweShuYW1lXywgZGVmRGF0YS0+REVGQ0FTRShuYW1lKSk7Ci19Ci0KLQotY29uc3QgY2hhciogZGVmaUNvbXBvbmVudDo6aWQoKSBjb25zdCB7Ci0gIHJldHVybiBpZF87Ci19Ci0KLQotY29uc3QgY2hhciogZGVmaUNvbXBvbmVudDo6bmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG5hbWVfOwotfQotCi0KLWludCBkZWZpQ29tcG9uZW50OjpwbGFjZW1lbnRTdGF0dXMoKSBjb25zdCB7Ci0gIHJldHVybiBzdGF0dXNfOwotfQotCi0KLWludCBkZWZpQ29tcG9uZW50OjpwbGFjZW1lbnRYKCkgY29uc3QgewotICByZXR1cm4geF87Ci19Ci0KLQotaW50IGRlZmlDb21wb25lbnQ6OnBsYWNlbWVudFkoKSBjb25zdCB7Ci0gIHJldHVybiB5XzsKLX0KLQotCi1pbnQgZGVmaUNvbXBvbmVudDo6cGxhY2VtZW50T3JpZW50KCkgY29uc3QgewotICByZXR1cm4gb3JpZW50XzsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpQ29tcG9uZW50OjpwbGFjZW1lbnRPcmllbnRTdHIoKSBjb25zdCB7Ci0gIHJldHVybiAoZGVmaU9yaWVudFN0cihvcmllbnRfKSk7Ci19Ci0KLQotY29uc3QgY2hhciogZGVmaUNvbXBvbmVudDo6cmVnaW9uTmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHJlZ2lvbk5hbWVfOwotfQotCi0KLWNvbnN0IGNoYXIqIGRlZmlDb21wb25lbnQ6OkVFUSgpIGNvbnN0IHsKLSAgcmV0dXJuIEVFUV87Ci19Ci0KLQotY29uc3QgY2hhciogZGVmaUNvbXBvbmVudDo6Z2VuZXJhdGVOYW1lKCkgY29uc3QgewotICByZXR1cm4gZ2VuZXJhdGVOYW1lXzsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpQ29tcG9uZW50OjptYWNyb05hbWUoKSBjb25zdCB7Ci0gIHJldHVybiBtYWNyb05hbWVfOwotfQotCi0KLXZvaWQgZGVmaUNvbXBvbmVudDo6cmVnaW9uQm91bmRzKGludCogc2l6ZSwKLQkgIGludCoqIHhsLCBpbnQqKiB5bCwgaW50KiogeGgsIGludCoqIHloKSBjb25zdCB7Ci0gICpzaXplID0gbnVtUmVjdHNfOwotICAqeGwgPSByZWN0WGxfOwotICAqeWwgPSByZWN0WWxfOwotICAqeGggPSByZWN0WGhfOwotICAqeWggPSByZWN0WWhfOwotfQotCi0KLXZvaWQgZGVmaUNvbXBvbmVudDo6YnVtcElkKGludCBzaXplKSB7Ci0gIGlmIChpZF8pIGZyZWUoaWRfKTsKLSAgaWRfID0gKGNoYXIqKW1hbGxvYyhzaXplKTsKLSAgaWRTaXplXyA9IHNpemU7Ci0gICooaWRfKSA9ICdcMCc7Ci19Ci0KLQotdm9pZCBkZWZpQ29tcG9uZW50OjpidW1wTmFtZShpbnQgc2l6ZSkgewotICBpZiAobmFtZV8pIGZyZWUobmFtZV8pOwotICBuYW1lXyA9IChjaGFyKiltYWxsb2Moc2l6ZSk7Ci0gIG5hbWVTaXplXyA9IHNpemU7Ci0gICoobmFtZV8pID0gJ1wwJzsKLX0KLQotCi12b2lkIGRlZmlDb21wb25lbnQ6OmJ1bXBSZWdpb25OYW1lKGludCBzaXplKSB7Ci0gIGlmIChyZWdpb25OYW1lXykgZnJlZShyZWdpb25OYW1lXyk7Ci0gIHJlZ2lvbk5hbWVfID0gKGNoYXIqKW1hbGxvYyhzaXplKTsKLSAgcmVnaW9uTmFtZVNpemVfID0gc2l6ZTsKLSAgKihyZWdpb25OYW1lXykgPSAnXDAnOwotfQotCi0KLXZvaWQgZGVmaUNvbXBvbmVudDo6YnVtcEVFUShpbnQgc2l6ZSkgewotICBpZiAoRUVRXykgZnJlZShFRVFfKTsKLSAgRUVRXyA9IChjaGFyKiltYWxsb2Moc2l6ZSk7Ci0gIEVFUVNpemVfID0gc2l6ZTsKLSAgKihFRVFfKSA9ICdcMCc7Ci19Ci0KLQotdm9pZCBkZWZpQ29tcG9uZW50OjpidW1wTWluTGF5ZXIoaW50IHNpemUpIHsKLSAgaWYgKG1pbkxheWVyXykgZnJlZShtaW5MYXllcl8pOwotICBtaW5MYXllcl8gPSAoY2hhciopbWFsbG9jKHNpemUpOwotICBtaW5MYXllclNpemVfID0gc2l6ZTsKLSAgKihtaW5MYXllcl8pID0gJ1wwJzsKLX0KLQotCi12b2lkIGRlZmlDb21wb25lbnQ6OmJ1bXBNYXhMYXllcihpbnQgc2l6ZSkgewotICBpZiAobWF4TGF5ZXJfKSBmcmVlKG1heExheWVyXyk7Ci0gIG1heExheWVyXyA9IChjaGFyKiltYWxsb2Moc2l6ZSk7Ci0gIG1heExheWVyU2l6ZV8gPSBzaXplOwotICAqKG1heExheWVyXykgPSAnXDAnOwotfQotCi12b2lkIGRlZmlDb21wb25lbnQ6OmNsZWFyKCkgewotICBpbnQgaTsKLQotICBpZiAoaWRfKQotICAgICAqKGlkXykgPSAnXDAnOwotICBpZiAobmFtZV8pCi0gICAgICoobmFtZV8pID0gJ1wwJzsKLSAgaWYgKHJlZ2lvbk5hbWVfKQotICAgICAqKHJlZ2lvbk5hbWVfKSA9ICdcMCc7Ci0gIGlmIChmb3JlaWduTmFtZV8pCi0gICAgICooZm9yZWlnbk5hbWVfKSA9ICdcMCc7Ci0gIGlmIChFRVFfKQotICAgICAqKEVFUV8pID0gJ1wwJzsKLSAgaWYgKG1pbkxheWVyXykKLSAgICAgKihtaW5MYXllcl8pID0gJ1wwJzsKLSAgaWYgKG1heExheWVyXykKLSAgICAgKihtYXhMYXllcl8pID0gJ1wwJzsKLSAgRm9yaV8gPSAwOwotICBzdGF0dXNfID0gMDsKLSAgaGFzUmVnaW9uTmFtZV8gPSAwOwotICBoYXNGb3JlaWduTmFtZV8gPSAwOwotICBoYXNGb3JpXyA9IDA7Ci0gIGhhc0VFUV8gPSAwOwotICBoYXNXZWlnaHRfID0gMDsKLSAgaGFzR2VuZXJhdGVfID0gMDsKLSAgaWYgKG1hc2tTaGlmdFNpemVfKSB7Ci0gICAgIGZyZWUoKGludCopKG1hc2tTaGlmdF8pKTsKLSAgfQotICBtYXNrU2hpZnRfID0gMDsKLSAgbWFza1NoaWZ0U2l6ZV8gPSAwOwotICB3ZWlnaHRfID0gMDsKLSAgaWYgKHNvdXJjZV8pIGZyZWUoc291cmNlXyk7Ci0gIGZvciAoaSA9IDA7IGkgPCBudW1OZXRzXzsgaSsrKSB7Ci0gICAgZnJlZShuZXRzX1tpXSk7Ci0gIH0KLSAgbnVtTmV0c18gPSAwOwotICBzb3VyY2VfID0gMDsKLSAgaGFzSGFsb18gPSAwOwotICBoYXNIYWxvU29mdF8gPSAwOwotICBoYWxvRGlzdF8gPSAwOwotICBsZWZ0SGFsb18gPSAwOwotICBib3R0b21IYWxvXyA9IDA7Ci0gIHJpZ2h0SGFsb18gPSAwOwotICB0b3BIYWxvXyA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBudW1Qcm9wc187IGkrKykgewotICAgIGZyZWUobmFtZXNfW2ldKTsKLSAgICBmcmVlKHZhbHVlc19baV0pOwotICAgIGR2YWx1ZXNfW2ldID0gMDsKLSAgfQotICBudW1Qcm9wc18gPSAwOwotICBudW1SZWN0c18gPSAwOwotfQotCi0KLWludCBkZWZpQ29tcG9uZW50Ojppc1VucGxhY2VkKCkgY29uc3QgewotICByZXR1cm4gc3RhdHVzXyA9PSBERUZJX0NPTVBPTkVOVF9VTlBMQUNFRCA/IDEgOiAwIDsKLX0KLQotCi1pbnQgZGVmaUNvbXBvbmVudDo6aXNQbGFjZWQoKSBjb25zdCB7Ci0gIHJldHVybiBzdGF0dXNfID09IERFRklfQ09NUE9ORU5UX1BMQUNFRCA/IDEgOiAwIDsKLX0KLQotCi1pbnQgZGVmaUNvbXBvbmVudDo6aXNGaXhlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIHN0YXR1c18gPT0gREVGSV9DT01QT05FTlRfRklYRUQgPyAxIDogMCA7Ci19Ci0KLQotaW50IGRlZmlDb21wb25lbnQ6OmlzQ292ZXIoKSBjb25zdCB7Ci0gIHJldHVybiBzdGF0dXNfID09IERFRklfQ09NUE9ORU5UX0NPVkVSID8gMSA6IDAgOwotfQotCi0KLXZvaWQgZGVmaUNvbXBvbmVudDo6cHJpbnQoRklMRSogZm91dCkgY29uc3QgewotICBmcHJpbnRmKGZvdXQsICJDb21wb25lbnQgaWQgJyVzJyBuYW1lICclcyciLAotICAgICAgaWQoKSwKLSAgICAgIG5hbWUoKSk7Ci0gIGlmIChpc1BsYWNlZCgpKSB7Ci0gICAgZnByaW50Zihmb3V0LCAiIFBsYWNlZCBhdCAlZCwlZCBvcmllbnQgJXMiLAotICAgIHBsYWNlbWVudFgoKSwKLSAgICBwbGFjZW1lbnRZKCksCi0gICAgcGxhY2VtZW50T3JpZW50U3RyKCkpOwotICB9Ci0gIGlmIChpc0ZpeGVkKCkpIHsKLSAgICBmcHJpbnRmKGZvdXQsICIgRml4ZWQgYXQgJWQsJWQgb3JpZW50ICVzIiwKLSAgICBwbGFjZW1lbnRYKCksCi0gICAgcGxhY2VtZW50WSgpLAotICAgIHBsYWNlbWVudE9yaWVudFN0cigpKTsKLSAgfQotICBpZiAoaXNDb3ZlcigpKSB7Ci0gICAgZnByaW50Zihmb3V0LCAiIENvdmVyIGF0ICVkLCVkIG9yaWVudCAlcyIsCi0gICAgcGxhY2VtZW50WCgpLAotICAgIHBsYWNlbWVudFkoKSwKLSAgICBwbGFjZW1lbnRPcmllbnRTdHIoKSk7Ci0gIH0KLSAgZnByaW50Zihmb3V0LCAiXG4iKTsKLQotICBpZiAoaGFzR2VuZXJhdGUoKSkgewotICAgIGZwcmludGYoZm91dCwgIiAgZ2VuZXJhdGUgJXMgJXNcbiIsIGdlbmVyYXRlTmFtZSgpLAotICAgIG1hY3JvTmFtZSgpKTsKLSAgfQotICBpZiAoaGFzV2VpZ2h0KCkpIHsKLSAgICBmcHJpbnRmKGZvdXQsICIgIHdlaWdodCAlZFxuIiwgd2VpZ2h0KCkpOwotICB9Ci0gIGlmIChtYXNrU2hpZnRTaXplKCkpIHsKLSAgICAgIGZwcmludGYoZm91dCwgIiAgbWFza1NoaWZ0ICIpOwotCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hc2tTaGlmdFNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIiAlZCIsIG1hc2tTaGlmdChpKSk7Ci0gICAgICB9Ci0gICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICB9Ci0gIGlmIChoYXNTb3VyY2UoKSkgewotICAgIGZwcmludGYoZm91dCwgIiAgc291cmNlICclcydcbiIsIHNvdXJjZSgpKTsKLSAgfQotICBpZiAoaGFzRUVRKCkpIHsKLSAgICBmcHJpbnRmKGZvdXQsICIgIEVFUSAnJXMnXG4iLCBFRVEoKSk7Ci0gIH0KLQotICBpZiAoaGFzUmVnaW9uTmFtZSgpKSB7Ci0gICAgZnByaW50Zihmb3V0LCAiICBSZWdpb24gJyVzJ1xuIiwgcmVnaW9uTmFtZSgpKTsKLSAgfQotICBpZiAoaGFzUmVnaW9uQm91bmRzKCkpIHsKLSAgICBpbnQgc2l6ZTsKLSAgICBpbnQgKnhsLCAqeWwsICp4aCwgKnloOwotICAgIGludCBqOwotICAgIHJlZ2lvbkJvdW5kcygmc2l6ZSwgJnhsLCAmeWwsICZ4aCwgJnloKTsKLSAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZTsgaisrKQotICAgICAgZnByaW50Zihmb3V0LCAiICBSZWdpb24gYm91bmRzICVkLCVkICVkLCVkXG4iLCB4bFtqXSwgeWxbal0sIHhoW2pdLCB5aFtqXSk7Ci0gIH0KLSAgaWYgKGhhc05ldHMoKSkgewotICAgIGludCBpOwotICAgIGZwcmludGYoZm91dCwgIiBOZXQgY29ubmVjdGlvbnM6XG4iKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTmV0cygpOyBpKyspIHsKLSAgICAgIGZwcmludGYoZm91dCwgIiAgJyVzJ1xuIiwgbmV0KGkpKTsKLSAgICB9Ci0gIH0KLX0KLQotCi1pbnQgZGVmaUNvbXBvbmVudDo6aGFzUmVnaW9uTmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIChpbnQpKGhhc1JlZ2lvbk5hbWVfKTsKLX0KLQotCi1pbnQgZGVmaUNvbXBvbmVudDo6aGFzR2VuZXJhdGUoKSBjb25zdCB7Ci0gIHJldHVybiAoaW50KShoYXNHZW5lcmF0ZV8pOwotfQotCi0KLWludCBkZWZpQ29tcG9uZW50OjpoYXNXZWlnaHQoKSBjb25zdCB7Ci0gIHJldHVybiAoaW50KShoYXNXZWlnaHRfKTsKLX0KLQotaW50IGRlZmlDb21wb25lbnQ6Om1hc2tTaGlmdFNpemUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1hc2tTaGlmdFNpemVfOwotfQotCi1pbnQgZGVmaUNvbXBvbmVudDo6aGFzU291cmNlKCkgY29uc3QgewotICByZXR1cm4gc291cmNlXyA/IDEgOiAwOwotfQotCi0KLWludCBkZWZpQ29tcG9uZW50OjpoYXNSZWdpb25Cb3VuZHMoKSBjb25zdCB7Ci0gIHJldHVybiBudW1SZWN0c18gPyAxIDogMCA7Ci19Ci0KLQotaW50IGRlZmlDb21wb25lbnQ6Omhhc0VFUSgpIGNvbnN0IHsKLSAgcmV0dXJuIChpbnQpKGhhc0VFUV8pOwotfQotCi0KLWludCBkZWZpQ29tcG9uZW50OjpoYXNOZXRzKCkgY29uc3QgewotICByZXR1cm4gbnVtTmV0c18gPyAxIDogMDsKLX0KLQotCi1pbnQgZGVmaUNvbXBvbmVudDo6bnVtTmV0cygpIGNvbnN0IHsKLSAgcmV0dXJuIG51bU5ldHNfOwotfQotCi0KLS8vIDUuNgotaW50IGRlZmlDb21wb25lbnQ6Omhhc0hhbG8oKSBjb25zdCB7Ci0gIHJldHVybiBoYXNIYWxvXzsKLX0KLQotCi0vLyA1LjcKLWludCBkZWZpQ29tcG9uZW50OjpoYXNIYWxvU29mdCgpIGNvbnN0IHsKLSAgcmV0dXJuIGhhc0hhbG9Tb2Z0XzsKLX0KLQotCi0vLyA1LjcKLWludCBkZWZpQ29tcG9uZW50OjpoYXNSb3V0ZUhhbG8oKSBjb25zdCB7Ci0gIHJldHVybiBoYWxvRGlzdF87Ci19Ci0KLS8vIDUuNwotaW50IGRlZmlDb21wb25lbnQ6OmhhbG9EaXN0KCkgY29uc3QgewotICByZXR1cm4gaGFsb0Rpc3RfOwotfQotCi0vLyA1LjcKLWNvbnN0IGNoYXIqIGRlZmlDb21wb25lbnQ6Om1pbkxheWVyKCkgY29uc3QgewotICByZXR1cm4gbWluTGF5ZXJfOwotfQotCi0vLyA1LjcKLWNvbnN0IGNoYXIqIGRlZmlDb21wb25lbnQ6Om1heExheWVyKCkgY29uc3QgewotICByZXR1cm4gbWF4TGF5ZXJfOwotfQotCi12b2lkIGRlZmlDb21wb25lbnQ6OmhhbG9FZGdlcyhpbnQqIGxlZnQsIGludCogYm90dG9tLCBpbnQqIHJpZ2h0LCBpbnQqIHRvcCkgewotICAqbGVmdCA9IGxlZnRIYWxvXzsKLSAgKmJvdHRvbSA9IGJvdHRvbUhhbG9fOwotICAqcmlnaHQgPSByaWdodEhhbG9fOwotICAqdG9wID0gdG9wSGFsb187Ci19Ci0KLXZvaWQgZGVmaUNvbXBvbmVudDo6cmV2ZXJzZU5ldE9yZGVyKCkgewotICAvLyBSZXZlcnNlIHRoZSBvcmRlciBvZiB0aGUgaXRlbXMgaW4gdGhlIG5ldHMgYXJyYXkuCi0gIGludCBvbmUgPSAwOwotICBpbnQgdHdvID0gbnVtTmV0c18gLSAxOwotICBjaGFyKiB0OwotICB3aGlsZSAob25lIDwgdHdvKSB7Ci0gICAgdCA9IG5ldHNfW29uZV07Ci0gICAgbmV0c19bb25lXSA9IG5ldHNfW3R3b107Ci0gICAgbmV0c19bdHdvXSA9IHQ7Ci0gICAgb25lKys7Ci0gICAgdHdvLS07Ci0gIH0KLX0KLQotCi1jaGFyKiBkZWZpQ29tcG9uZW50Ojpwcm9wTmFtZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1Qcm9wc18pIHsKLSAgICBkZWZpRXJyb3IoMSwgMCwgImJhZCBpbmRleCBmb3IgY29tcG9uZW50IHByb3BlcnR5IiwgZGVmRGF0YSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIG5hbWVzX1tpbmRleF07Ci19Ci0KLQotY2hhciogZGVmaUNvbXBvbmVudDo6cHJvcFZhbHVlKGludCBpbmRleCkgY29uc3QgewotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVByb3BzXykgewotICAgIGRlZmlFcnJvcigxLCAwLCAiYmFkIGluZGV4IGZvciBjb21wb25lbnQgcHJvcGVydHkiLCBkZWZEYXRhKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gdmFsdWVzX1tpbmRleF07Ci19Ci0KLQotZG91YmxlIGRlZmlDb21wb25lbnQ6OnByb3BOdW1iZXIoaW50IGluZGV4KSBjb25zdCB7Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtUHJvcHNfKSB7Ci0gICAgZGVmaUVycm9yKDEsIDAsICJiYWQgaW5kZXggZm9yIGNvbXBvbmVudCBwcm9wZXJ0eSIsIGRlZkRhdGEpOwotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBkdmFsdWVzX1tpbmRleF07Ci19Ci0KLQotY2hhciBkZWZpQ29tcG9uZW50Ojpwcm9wVHlwZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1Qcm9wc18pIHsKLSAgICBkZWZpRXJyb3IoMSwgMCwgImJhZCBpbmRleCBmb3IgY29tcG9uZW50IHByb3BlcnR5IiwgZGVmRGF0YSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIHR5cGVzX1tpbmRleF07Ci19Ci0KLQotaW50IGRlZmlDb21wb25lbnQ6OnByb3BJc051bWJlcihpbnQgaW5kZXgpIGNvbnN0IHsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1Qcm9wc18pIHsKLSAgICBkZWZpRXJyb3IoMSwgMCwgImJhZCBpbmRleCBmb3IgY29tcG9uZW50IHByb3BlcnR5IiwgZGVmRGF0YSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIGR2YWx1ZXNfW2luZGV4XSA/IDEgOiAwOwotfQotCi1pbnQgZGVmaUNvbXBvbmVudDo6cHJvcElzU3RyaW5nKGludCBpbmRleCkgY29uc3QgewotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVByb3BzXykgewotICAgIGRlZmlFcnJvcigxLCAwLCAiYmFkIGluZGV4IGZvciBjb21wb25lbnQgcHJvcGVydHkiLCBkZWZEYXRhKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gZHZhbHVlc19baW5kZXhdID8gMCA6IDE7Ci19Ci0KLWludCBkZWZpQ29tcG9uZW50OjpudW1Qcm9wcygpIGNvbnN0IHsKLSAgcmV0dXJuIG51bVByb3BzXzsKLX0KLQotCi12b2lkIGRlZmlDb21wb25lbnQ6OmFkZFByb3BlcnR5KGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIHR5cGUpIHsKLSAgaW50IGxlbiA9IHN0cmxlbihuYW1lKSArIDE7Ci0gIGlmIChudW1Qcm9wc18gPT0gcHJvcHNBbGxvY2F0ZWRfKSB7Ci0gICAgaW50IGk7Ci0gICAgY2hhcioqICBubjsKLSAgICBjaGFyKiogIG52OwotICAgIGRvdWJsZSogbmQ7Ci0gICAgY2hhciogICBudDsKLQotICAgIHByb3BzQWxsb2NhdGVkXyAqPSAyOwotICAgIG5uID0gKGNoYXIqKiltYWxsb2Moc2l6ZW9mKGNoYXIqKSpwcm9wc0FsbG9jYXRlZF8pOwotICAgIG52ID0gKGNoYXIqKiltYWxsb2Moc2l6ZW9mKGNoYXIqKSpwcm9wc0FsbG9jYXRlZF8pOwotICAgIG5kID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpKnByb3BzQWxsb2NhdGVkXyk7Ci0gICAgbnQgPSAoY2hhciopbWFsbG9jKHNpemVvZihjaGFyKSpwcm9wc0FsbG9jYXRlZF8pOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1Qcm9wc187IGkrKykgewotICAgICAgbm5baV0gPSBuYW1lc19baV07Ci0gICAgICBudltpXSA9IHZhbHVlc19baV07Ci0gICAgICBuZFtpXSA9IGR2YWx1ZXNfW2ldOwotICAgICAgbnRbaV0gPSB0eXBlc19baV07Ci0gICAgfQotICAgIGZyZWUoKGNoYXIqKShuYW1lc18pKTsKLSAgICBmcmVlKChjaGFyKikodmFsdWVzXykpOwotICAgIGZyZWUoKGNoYXIqKShkdmFsdWVzXykpOwotICAgIGZyZWUoKGNoYXIqKSh0eXBlc18pKTsKLSAgICBuYW1lc18gPSBubjsKLSAgICB2YWx1ZXNfID0gbnY7Ci0gICAgZHZhbHVlc18gPSBuZDsKLSAgICB0eXBlc18gPSBudDsKLSAgfQotICBuYW1lc19bbnVtUHJvcHNfXSA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgc3RyY3B5KG5hbWVzX1tudW1Qcm9wc19dLCBkZWZEYXRhLT5ERUZDQVNFKG5hbWUpKTsKLSAgbGVuID0gc3RybGVuKHZhbHVlKSArIDE7Ci0gIHZhbHVlc19bbnVtUHJvcHNfXSA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgc3RyY3B5KHZhbHVlc19bbnVtUHJvcHNfXSwgZGVmRGF0YS0+REVGQ0FTRSh2YWx1ZSkpOwotICBkdmFsdWVzX1tudW1Qcm9wc19dID0gMDsKLSAgdHlwZXNfW251bVByb3BzX10gPSB0eXBlOwotICBudW1Qcm9wc18gKz0gMTsKLX0KLQotCi12b2lkIGRlZmlDb21wb25lbnQ6OmFkZE51bVByb3BlcnR5KGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGRvdWJsZSBkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YWx1ZSwgY29uc3QgY2hhciB0eXBlKSB7Ci0gIGludCBsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotICBpZiAobnVtUHJvcHNfID09IHByb3BzQWxsb2NhdGVkXykgewotICAgIGludCBpOwotICAgIGNoYXIqKiAgbm47Ci0gICAgY2hhcioqICBudjsKLSAgICBkb3VibGUqIG5kOwotICAgIGNoYXIqICAgbnQ7Ci0KLSAgICBwcm9wc0FsbG9jYXRlZF8gKj0gMjsKLSAgICBubiA9IChjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikqcHJvcHNBbGxvY2F0ZWRfKTsKLSAgICBudiA9IChjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikqcHJvcHNBbGxvY2F0ZWRfKTsKLSAgICBuZCA9IChkb3VibGUqKW1hbGxvYyhzaXplb2YoZG91YmxlKSpwcm9wc0FsbG9jYXRlZF8pOwotICAgIG50ID0gKGNoYXIqKW1hbGxvYyhzaXplb2YoY2hhcikqcHJvcHNBbGxvY2F0ZWRfKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUHJvcHNfOyBpKyspIHsKLSAgICAgIG5uW2ldID0gbmFtZXNfW2ldOwotICAgICAgbnZbaV0gPSB2YWx1ZXNfW2ldOwotICAgICAgbmRbaV0gPSBkdmFsdWVzX1tpXTsKLSAgICAgIG50W2ldID0gdHlwZXNfW2ldOwotICAgIH0KLSAgICBmcmVlKChjaGFyKikobmFtZXNfKSk7Ci0gICAgZnJlZSgoY2hhciopKHZhbHVlc18pKTsKLSAgICBmcmVlKChjaGFyKikoZHZhbHVlc18pKTsKLSAgICBmcmVlKChjaGFyKikodHlwZXNfKSk7Ci0gICAgbmFtZXNfID0gbm47Ci0gICAgdmFsdWVzXyA9IG52OwotICAgIGR2YWx1ZXNfID0gbmQ7Ci0gICAgdHlwZXNfID0gbnQ7Ci0gIH0KLSAgbmFtZXNfW251bVByb3BzX10gPSAoY2hhciopbWFsbG9jKGxlbik7Ci0gIHN0cmNweShuYW1lc19bbnVtUHJvcHNfXSwgZGVmRGF0YS0+REVGQ0FTRShuYW1lKSk7Ci0gIGxlbiA9IHN0cmxlbih2YWx1ZSkgKyAxOwotICB2YWx1ZXNfW251bVByb3BzX10gPSAoY2hhciopbWFsbG9jKGxlbik7Ci0gIHN0cmNweSh2YWx1ZXNfW251bVByb3BzX10sIGRlZkRhdGEtPkRFRkNBU0UodmFsdWUpKTsKLSAgZHZhbHVlc19bbnVtUHJvcHNfXSA9IGQ7Ci0gIHR5cGVzX1tudW1Qcm9wc19dID0gdHlwZTsKLSAgbnVtUHJvcHNfICs9IDE7Ci19Ci0KLQotdm9pZCBkZWZpQ29tcG9uZW50OjphZGROZXQoY29uc3QgY2hhciogbmV0KSB7Ci0gIGludCBsZW4gPSBzdHJsZW4obmV0KSArIDE7Ci0gIGlmIChudW1OZXRzXyA9PSBuZXRzQWxsb2NhdGVkXykKLSAgICBidW1wTmV0cyhudW1OZXRzXyAqIDIpOwotICBuZXRzX1tudW1OZXRzX10gPSAoY2hhciopbWFsbG9jKGxlbik7Ci0gIHN0cmNweShuZXRzX1tudW1OZXRzX10sIGRlZkRhdGEtPkRFRkNBU0UobmV0KSk7Ci0gIChudW1OZXRzXykrKzsKLX0KLQotCi12b2lkIGRlZmlDb21wb25lbnQ6OmJ1bXBOZXRzKGludCBzaXplKSB7Ci0gIGludCBpOwotICBjaGFyKiogbmV3TmV0cyA9IChjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikqIHNpemUpOwotICBmb3IgKGkgPSAwOyBpIDwgbnVtTmV0c187IGkrKykgewotICAgIG5ld05ldHNbaV0gPSBuZXRzX1tpXTsKLSAgfQotICBmcmVlKChjaGFyKikobmV0c18pKTsKLSAgbmV0c18gPSBuZXdOZXRzOwotICBuZXRzQWxsb2NhdGVkXyA9IHNpemU7Ci19Ci0KLQotY29uc3QgY2hhciogZGVmaUNvbXBvbmVudDo6bmV0KGludCBpbmRleCkgY29uc3QgewotICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IG51bU5ldHNfKSB7Ci0gICAgcmV0dXJuIG5ldHNfW2luZGV4XTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotCi12b2lkIGRlZmlDb21wb25lbnQ6OmJ1bXBGb3JlaWduTmFtZShpbnQgc2l6ZSkgewotICBpZiAoZm9yZWlnbk5hbWVfKSBmcmVlKGZvcmVpZ25OYW1lXyk7Ci0gIGZvcmVpZ25OYW1lXyA9IChjaGFyKiltYWxsb2Moc2l6ZW9mKGNoYXIpICogc2l6ZSk7Ci0gIGZvcmVpZ25OYW1lU2l6ZV8gPSBzaXplOwotICAqKGZvcmVpZ25OYW1lXykgPSAnXDAnOwotfQotCi0KLXZvaWQgZGVmaUNvbXBvbmVudDo6c2V0Rm9yZWlnbk5hbWUoY29uc3QgY2hhciogbmFtZSkgewotICBpbnQgbGVuOwotCi0gIGlmIChoYXNGb3JlaWduTmFtZSgpKQotICAgICAgZGVmaUVycm9yKDEsIDAsCi0gICAgICAiTXVsdGlwbGUgZGVmaW5lIG9mICcrIEZPUkVJR04nIGluIENPTVBPTkVOVCBpcyBub3Qgc3VwcG9ydGVkLlxuIiwgZGVmRGF0YSk7Ci0gIGlmICgobGVuID0gc3RybGVuKG5hbWUpKzEpID4gZm9yZWlnbk5hbWVTaXplXykKLSAgICBidW1wRm9yZWlnbk5hbWUobGVuKTsKLSAgc3RyY3B5KGZvcmVpZ25OYW1lXywgZGVmRGF0YS0+REVGQ0FTRShuYW1lKSk7Ci0gIGhhc0ZvcmVpZ25OYW1lXyA9IDE7Ci19Ci0KLQotdm9pZCBkZWZpQ29tcG9uZW50OjpzZXRGb3JlaWduTG9jYXRpb24oaW50IHgsIGludCB5LCBpbnQgb3JpZW50KSB7Ci0gIEZ4XyA9IHg7Ci0gIEZ5XyA9IHk7Ci0gIEZvcmlfID0gb3JpZW50OwotICBoYXNGb3JpXyA9IDE7Ci19Ci0KLQotaW50IGRlZmlDb21wb25lbnQ6Omhhc0ZvcmVpZ25OYW1lKCkgY29uc3QgewotICByZXR1cm4gKGludCkoaGFzRm9yZWlnbk5hbWVfKTsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpQ29tcG9uZW50Ojpmb3JlaWduTmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGZvcmVpZ25OYW1lXzsKLX0KLQotCi1pbnQgZGVmaUNvbXBvbmVudDo6Zm9yZWlnblgoKSBjb25zdCB7Ci0gIHJldHVybiBGeF87Ci19Ci0KLQotaW50IGRlZmlDb21wb25lbnQ6OmZvcmVpZ25ZKCkgY29uc3QgewotICByZXR1cm4gRnlfOwotfQotCi0KLWludCBkZWZpQ29tcG9uZW50OjpoYXNGb3JpKCkgY29uc3QgewotICByZXR1cm4gKGludCkoaGFzRm9yaV8pOwotfQotCi1jb25zdCBjaGFyKiBkZWZpQ29tcG9uZW50Ojpmb3JlaWduT3JpKCkgY29uc3QgewotICBzd2l0Y2ggKEZvcmlfKSB7Ci0gICAgY2FzZSAwOiByZXR1cm4gKCJOIik7Ci0gICAgY2FzZSAxOiByZXR1cm4gKCJXIik7Ci0gICAgY2FzZSAyOiByZXR1cm4gKCJTIik7Ci0gICAgY2FzZSAzOiByZXR1cm4gKCJFIik7Ci0gICAgY2FzZSA0OiByZXR1cm4gKCJGTiIpOwotICAgIGNhc2UgNTogcmV0dXJuICgiRlciKTsKLSAgICBjYXNlIDY6IHJldHVybiAoIkZTIik7Ci0gICAgY2FzZSA3OiByZXR1cm4gKCJGRSIpOwotICB9Ci0gIHJldHVybiAwOwotfQotCi1pbnQgZGVmaUNvbXBvbmVudDo6Zm9yZWlnbk9yaWVudCgpIGNvbnN0IHsKLSAgcmV0dXJuIEZvcmlfOwotfQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaUNvbXBvbmVudC5ocHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlDb21wb25lbnQuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2NkNDQ2Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaUNvbXBvbmVudC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMywgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpZm5kZWYgZGVmaUNvbXBvbmVudF9oCi0jZGVmaW5lIGRlZmlDb21wb25lbnRfaAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJkZWZpS1JEZWZzLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotY2xhc3MgZGVmckRhdGE7Ci0KLS8vIFBsYWNlbWVudCBzdGF0dXMgZm9yIHRoZSBjb21wb25lbnQuCi0vLyBEZWZhdWx0IGlzIDAKLSNkZWZpbmUgREVGSV9DT01QT05FTlRfVU5QTEFDRUQgMQotI2RlZmluZSBERUZJX0NPTVBPTkVOVF9QTEFDRUQgMgotI2RlZmluZSBERUZJX0NPTVBPTkVOVF9GSVhFRCAzCi0jZGVmaW5lIERFRklfQ09NUE9ORU5UX0NPVkVSIDQKLQotCi0vLyBTdHJ1Y3QgaG9sZHMgdGhlIGRhdGEgZm9yIGNvbXBvbmVudE1hc2tTaGlmdExheWVycy4KLWNsYXNzIGRlZmlDb21wb25lbnRNYXNrU2hpZnRMYXllciB7Ci1wdWJsaWM6Ci0gICAgICAgICAgICAgICAgZGVmaUNvbXBvbmVudE1hc2tTaGlmdExheWVyKGRlZnJEYXRhICpkYXRhKTsKLSAgICAgICAgICAgICAgICB+ZGVmaUNvbXBvbmVudE1hc2tTaGlmdExheWVyKCk7Ci0KLSAgICB2b2lkICAgICAgICAgSW5pdCgpOwotICAgIHZvaWQgICAgICAgICBEZXN0cm95KCk7Ci0gICAgdm9pZCAgICAgICAgIGFkZE1hc2tTaGlmdExheWVyKGNvbnN0IGNoYXIqIGxheWVyKTsKLSAgICBpbnQgICAgICAgICAgbnVtTWFza1NoaWZ0TGF5ZXJzKCkgY29uc3Q7Ci0gICAgdm9pZCAgICAgICAgIGJ1bXBMYXllcnMoaW50IHNpemUpOwotICAgIHZvaWQgICAgICAgICBjbGVhcigpOwotICAgIGNvbnN0ICBjaGFyKiBtYXNrU2hpZnRMYXllcihpbnQgaW5kZXgpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gICAgaW50ICAgICAgICAgIGxheWVyc0FsbG9jYXRlZF87ICAvLyBhbGxvY2F0ZWQgc2l6ZSBvZiBsYXllcnNfCi0gICAgaW50ICAgICAgICAgIG51bUxheWVyc187ICAgICAgICAvLyBudW1iZXIgb2YgcGxhY2VzIHVzZWQgaW4gbGF5ZXJzXwotICAgIGNoYXIqKiAgICAgICBsYXllcnNfOwotCi0gICAgZGVmckRhdGEgICAgKmRlZkRhdGE7Ci19OwotCi0KLS8vIFN0cnVjdCBob2xkcyB0aGUgZGF0YSBmb3Igb25lIGNvbXBvbmVudC4KLWNsYXNzIGRlZmlDb21wb25lbnQgewotcHVibGljOgotICBkZWZpQ29tcG9uZW50KGRlZnJEYXRhICpkZWZEYXRhKTsKLSAgdm9pZCBJbml0KCk7Ci0KLSAgdm9pZCBEZXN0cm95KCk7Ci0gIH5kZWZpQ29tcG9uZW50KCk7Ci0KLSAgdm9pZCBJZEFuZE5hbWUoY29uc3QgY2hhciogaWQsIGNvbnN0IGNoYXIqIG5hbWUpOwotICB2b2lkIHNldEdlbmVyYXRlKGNvbnN0IGNoYXIqIGdlbk5hbWUsIGNvbnN0IGNoYXIqIG1hY3JvTmFtZSk7Ci0gIHZvaWQgc2V0UGxhY2VtZW50U3RhdHVzKGludCBuKTsKLSAgdm9pZCBzZXRQbGFjZW1lbnRMb2NhdGlvbihpbnQgeCwgaW50IHksIGludCBvcmllbnQpOwotICB2b2lkIHNldFJlZ2lvbk5hbWUoY29uc3QgY2hhciogbmFtZSk7Ci0gIHZvaWQgc2V0UmVnaW9uQm91bmRzKGludCB4bCwgaW50IHlsLCBpbnQgeGgsIGludCB5aCk7Ci0gIHZvaWQgc2V0RUVRKGNvbnN0IGNoYXIqIG5hbWUpOwotICB2b2lkIGFkZE5ldChjb25zdCBjaGFyKiBuZXROYW1lKTsKLSAgdm9pZCBhZGRQcm9wZXJ0eShjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSwgY29uc3QgY2hhciB0eXBlKTsKLSAgdm9pZCBhZGROdW1Qcm9wZXJ0eShjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBkb3VibGUgZCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YWx1ZSwgY29uc3QgY2hhciB0eXBlKTsKLSAgdm9pZCByZXZlcnNlTmV0T3JkZXIoKTsKLSAgdm9pZCBzZXRXZWlnaHQoaW50IHcpOwotICB2b2lkIHNldE1hc2tTaGlmdChjb25zdCBjaGFyKiBjb2xvcik7Ci0gIHZvaWQgc2V0U291cmNlKGNvbnN0IGNoYXIqIG5hbWUpOwotICB2b2lkIHNldEZvcmVpZ25OYW1lKGNvbnN0IGNoYXIqIG5hbWUpOwotICB2b2lkIHNldEZvcmkoY29uc3QgY2hhciogbmFtZSk7Ci0gIHZvaWQgc2V0Rm9yZWlnbkxvY2F0aW9uKGludCB4LCBpbnQgeSwgaW50IG9yaWVudCk7Ci0gIHZvaWQgc2V0SGFsbyhpbnQgbGVmdCwgaW50IGJvdHRvbSwgaW50IHJpZ2h0LCBpbnQgdG9wKTsgICAvLyA1LjYKLSAgdm9pZCBzZXRIYWxvU29mdCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNwotICB2b2lkIHNldFJvdXRlSGFsbyhpbnQgaGFsb0Rpc3QsIGNvbnN0IGNoYXIqIG1pbkxheWVyLCBjb25zdCBjaGFyKiBtYXhMYXllcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgdm9pZCBjbGVhcigpOwotCi0gIC8vIEZvciBPQSB0byBtb2RpZnkgdGhlIElkICYgTmFtZQotICB2b2lkIGNoYW5nZUlkQW5kTmFtZShjb25zdCBjaGFyKiBpZCwgY29uc3QgY2hhciogbmFtZSk7Ci0KLSAgY29uc3QgY2hhciogaWQoKSBjb25zdDsKLSAgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0OwotICBpbnQgcGxhY2VtZW50U3RhdHVzKCkgY29uc3Q7Ci0gIGludCBpc1VucGxhY2VkKCkgY29uc3Q7Ci0gIGludCBpc1BsYWNlZCgpIGNvbnN0OwotICBpbnQgaXNGaXhlZCgpIGNvbnN0OwotICBpbnQgaXNDb3ZlcigpIGNvbnN0OwotICBpbnQgcGxhY2VtZW50WCgpIGNvbnN0OwotICBpbnQgcGxhY2VtZW50WSgpIGNvbnN0OwotICBpbnQgcGxhY2VtZW50T3JpZW50KCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIHBsYWNlbWVudE9yaWVudFN0cigpIGNvbnN0OwotICBpbnQgaGFzUmVnaW9uTmFtZSgpIGNvbnN0OwotICBpbnQgaGFzUmVnaW9uQm91bmRzKCkgY29uc3Q7Ci0gIGludCBoYXNFRVEoKSBjb25zdDsKLSAgaW50IGhhc0dlbmVyYXRlKCkgY29uc3Q7Ci0gIGludCBoYXNTb3VyY2UoKSBjb25zdDsKLSAgaW50IGhhc1dlaWdodCgpIGNvbnN0OwotICBpbnQgd2VpZ2h0KCkgY29uc3Q7Ci0gIGludCBtYXNrU2hpZnRTaXplKCkgY29uc3Q7Ci0gIGludCBtYXNrU2hpZnQoaW50IGluZGV4KSBjb25zdDsKLSAgaW50IGhhc05ldHMoKSBjb25zdDsKLSAgaW50IG51bU5ldHMoKSBjb25zdDsKLSAgY29uc3QgY2hhciogbmV0KGludCBpbmRleCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIHJlZ2lvbk5hbWUoKSBjb25zdDsKLSAgY29uc3QgY2hhciogc291cmNlKCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIEVFUSgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBnZW5lcmF0ZU5hbWUoKSBjb25zdDsKLSAgY29uc3QgY2hhciogbWFjcm9OYW1lKCkgY29uc3Q7Ci0gIGludCBoYXNIYWxvKCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIGludCBoYXNIYWxvU29mdCgpIGNvbnN0OyAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIHZvaWQgaGFsb0VkZ2VzKGludCogbGVmdCwgaW50KiBib3R0b20sIGludCogcmlnaHQsIGludCogdG9wKTsgIC8vIDUuNiAKLSAgaW50IGhhc1JvdXRlSGFsbygpIGNvbnN0OyAgICAgICAgICAgICAgICAvLyA1LjcKLSAgaW50IGhhbG9EaXN0KCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgY29uc3QgY2hhciogbWluTGF5ZXIoKSBjb25zdDsgICAgICAgICAgICAvLyA1LjcKLSAgY29uc3QgY2hhciogbWF4TGF5ZXIoKSBjb25zdDsgICAgICAgICAgICAvLyA1LjcKLQotICAvLyBSZXR1cm5zIGFycmF5cyBmb3IgdGhlIGxsIGFuZCB1ciBvZiB0aGUgcmVjdGFuZ2xlcyBpbiB0aGUgcmVnaW9uLgotICAvLyBUaGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBhcnJheXMgaXMgZ2l2ZW4gaW4gc2l6ZS4KLSAgdm9pZCByZWdpb25Cb3VuZHMoaW50KnNpemUsIGludCoqIHhsLCBpbnQqKiB5bCwgaW50KiogeGgsIGludCoqIHloKSBjb25zdDsKLQotICBpbnQgaGFzRm9yZWlnbk5hbWUoKSBjb25zdDsKLSAgY29uc3QgY2hhciogZm9yZWlnbk5hbWUoKSBjb25zdDsKLSAgaW50IGZvcmVpZ25YKCkgY29uc3Q7Ci0gIGludCBmb3JlaWduWSgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBmb3JlaWduT3JpKCkgY29uc3Q7IC8vIHJldHVybiB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBvcmllbnQKLSAgaW50IGZvcmVpZ25PcmllbnQoKSBjb25zdDsgICAgICAvLyByZXR1cm4gdGhlIGVudW0gdmFsdWUgb2YgdGhlIG9yaWVudAotICBpbnQgaGFzRm9yaSgpIGNvbnN0OwotCi0gIGludCAgICBudW1Qcm9wcygpIGNvbnN0OwotICBjaGFyKiAgcHJvcE5hbWUoaW50IGluZGV4KSBjb25zdDsKLSAgY2hhciogIHByb3BWYWx1ZShpbnQgaW5kZXgpIGNvbnN0OwotICBkb3VibGUgcHJvcE51bWJlcihpbnQgaW5kZXgpIGNvbnN0OwotICBjaGFyICAgcHJvcFR5cGUoaW50IGluZGV4KSBjb25zdDsKLSAgaW50ICAgIHByb3BJc051bWJlcihpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgICAgcHJvcElzU3RyaW5nKGludCBpbmRleCkgY29uc3Q7Ci0KLQotICAvLyBEZWJ1ZyBwcmludGluZwotICB2b2lkIHByaW50KEZJTEUqIGZvdXQpIGNvbnN0OwotCi0gIHZvaWQgYnVtcElkKGludCBzaXplKTsKLSAgdm9pZCBidW1wTmFtZShpbnQgc2l6ZSk7Ci0gIHZvaWQgYnVtcFJlZ2lvbk5hbWUoaW50IHNpemUpOwotICB2b2lkIGJ1bXBFRVEoaW50IHNpemUpOwotICB2b2lkIGJ1bXBOZXRzKGludCBzaXplKTsKLSAgdm9pZCBidW1wRm9yZWlnbk5hbWUoaW50IHNpemUpOwotICB2b2lkIGJ1bXBNaW5MYXllcihpbnQgc2l6ZSk7Ci0gIHZvaWQgYnVtcE1heExheWVyKGludCBzaXplKTsKLSAgdm9pZCBidW1wRm9yaShpbnQgc2l6ZSk7Ci0KLXByb3RlY3RlZDoKLSAgY2hhciogaWRfOyAgICAgICAgICAgIC8vIGluc3RhbmNlIGlkCi0gIGNoYXIqIG5hbWVfOyAgICAgICAgICAvLyBuYW1lLgotICBpbnQgbmFtZVNpemVfOyAgICAgICAgLy8gYWxsb2NhdGVkIHNpemUgb2YgbmFtZS4KLSAgaW50IGlkU2l6ZV87ICAgICAgICAgIC8vIGFsbG9jYXRlZCBzaXplIG9mIGlkLgotICBpbnQgRm9yaVNpemVfOyAgICAgICAgLy8gYWxsb2NhdGUgc2l6ZSBvZiBmb3JlaWduIG9yaQotICBpbnQgc3RhdHVzXzsgICAgICAgICAgLy8gcGxhY2VtZW50IHN0YXR1cwotICBjaGFyIGhhc1JlZ2lvbk5hbWVfOyAgLy8gdGhlIGZpbGUgc3VwcGxpZWQgYSByZWdpb24gbmFtZSBmb3IgdGhpcyBjb21wCi0gIGNoYXIgaGFzRUVRXzsgICAgICAgICAvLyB0aGUgZmlsZSBzdXBwbGllZCBhbiBlZXEKLSAgY2hhciBoYXNHZW5lcmF0ZV87ICAgIC8vIHRoZSBmaWxlIHN1cHBsaWVkIGFuIGdlbmVyYXRlIG5hbWUgYW5kIG1hY3JvIG5hbWUKLSAgY2hhciBoYXNXZWlnaHRfOyAgICAgIC8vIHRoZSBmaWxlIHN1cHBsaWVkIGEgd2VpZ2h0Ci0gIGNoYXIgaGFzRm9yaV87ICAgICAgICAvLyB0aGUgZmlsZSBzdXBwbGllZCBhIGZvcmVpZ24gb3JpZyBuYW1lCi0gIGludCBvcmllbnRfOyAgICAgICAgICAvLyBvcmllbnRhdGlvbgotICBpbnQgeF8sIHlfOyAgICAgICAgICAgLy8gcGxhY2VtZW50IGxvYwotCi0gIGludCBudW1SZWN0c187Ci0gIGludCByZWN0c0FsbG9jYXRlZF87Ci0gIGludCogcmVjdFhsXzsgICAgICAgLy8gcmVnaW9uIHBvaW50cwotICBpbnQqIHJlY3RZbF87Ci0gIGludCogcmVjdFhoXzsKLSAgaW50KiByZWN0WWhfOwotCi0gIGNoYXIqIHJlZ2lvbk5hbWVfOyAgICAvLyBuYW1lLgotICBpbnQgcmVnaW9uTmFtZVNpemVfOyAgLy8gYWxsb2NhdGVkIHNpemUgb2YgcmVnaW9uIG5hbWUKLQotICBjaGFyKiBFRVFfOwotICBpbnQgRUVRU2l6ZV87ICAgICAgICAgLy8gYWxsb2NhdGVkIHNpemUgb2YgZWVxCi0KLSAgaW50IG51bU5ldHNfOyAgICAgICAgIC8vIG51bWJlciBvZiBuZXQgY29ubmVjdGlvbnMKLSAgaW50IG5ldHNBbGxvY2F0ZWRfOyAgIC8vIGFsbG9jYXRlZCBzaXplIG9mIG5ldHMgYXJyYXkKLSAgY2hhcioqIG5ldHNfOyAgICAgICAgIC8vIG5ldCBjb25uZWN0aW9ucwotCi0gIGludCB3ZWlnaHRfOwotICBpbnQqIG1hc2tTaGlmdF87IAotICBpbnQgbWFza1NoaWZ0U2l6ZV87Ci0gIGNoYXIqIHNvdXJjZV87Ci0gIGNoYXIgaGFzRm9yZWlnbk5hbWVfOyAvLyB0aGUgZmlsZSBzdXBwbGllZCBhIGZvcmVpZ24gbmFtZQotICBjaGFyKiBmb3JlaWduTmFtZV87ICAgLy8gbmFtZQotICBpbnQgZm9yZWlnbk5hbWVTaXplXzsgLy8gYWxsb2NhdGUgc2l6ZSBvZiBmb3JlaWduIG5hbWUKLSAgaW50IEZ4XywgRnlfOyAgICAgICAgIC8vIGZvcmVpZ24gbG9jCi0gIGludCBGb3JpXzsgICAgICAgICAgICAvLyBmb3JlaWduIG9yaQotICBpbnQgZ2VuZXJhdGVOYW1lU2l6ZV87Ci0gIGNoYXIqIGdlbmVyYXRlTmFtZV87Ci0gIGludCBtYWNyb05hbWVTaXplXzsKLSAgY2hhciogbWFjcm9OYW1lXzsKLQotICBpbnQgaGFzSGFsb187Ci0gIGludCBoYXNIYWxvU29mdF87ICAgICAgICAgICAvLyA1LjcKLSAgaW50IGxlZnRIYWxvXzsKLSAgaW50IGJvdHRvbUhhbG9fOwotICBpbnQgcmlnaHRIYWxvXzsKLSAgaW50IHRvcEhhbG9fOwotICBpbnQgaGFsb0Rpc3RfOyAgICAgICAgICAgICAgLy8gNS43Ci0gIGludCBtaW5MYXllclNpemVfOyAgICAgICAgICAvLyA1LjcKLSAgY2hhciogbWluTGF5ZXJfOyAgICAgICAgICAgIC8vIDUuNwotICBpbnQgbWF4TGF5ZXJTaXplXzsgICAgICAgICAgLy8gNS43Ci0gIGNoYXIqIG1heExheWVyXzsgICAgICAgICAgICAvLyA1LjcKLQotICBpbnQgbnVtUHJvcHNfOwotICBpbnQgcHJvcHNBbGxvY2F0ZWRfOwotICBjaGFyKiogIG5hbWVzXzsKLSAgY2hhcioqICB2YWx1ZXNfOwotICBkb3VibGUqIGR2YWx1ZXNfOwotICBjaGFyKiAgIHR5cGVzXzsKLQotICBkZWZyRGF0YSAqZGVmRGF0YTsKLX07Ci0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1VU0VfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlEZWJ1Zy5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlEZWJ1Zy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMjllNzguLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpRGVidWcuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMyAtIDIwMTUsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJsZXguaCIKLSNpbmNsdWRlICJkZWZpRGVidWcuaHBwIgotCi0KLSNpbmNsdWRlICJkZWZyRGF0YS5ocHAiCi0jaW5jbHVkZSAiZGVmclNldHRpbmdzLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotZXh0ZXJuIGRlZnJDb250ZXh0IGRlZkNvbnRleHQ7Ci0gICAgCi0gICAgLyoqKioqKioqKioqKioqKioqKioKLSAqICBEZWJ1ZyBmbGFnczoKLSAqICAwIC0KLSAqICAxIC0gbWFsbG9jIGRlYnVnCi0gKiAgMiAtIHByaW50IGVhY2ggaGlzdG9yeSBzaXplIGJ1bXAgdXAuCi0gKiAgMyAtIHByaW50IGVhY2ggY2FsbCB0byBDYXRjaEFsbAotICogIDQgLQotICogIDUgLQotICogIDYgLQotICogIDcgLQotICogIDggLQotICogIDkgLQotICogMTAgLQotICogMTEgLSBsZXhlciBkZWJ1ZwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFNldCBmbGFnICovCi12b2lkIGRlZmlTZXREZWJ1ZyhpbnQsIGludCkgewotfQotCi0vKiBSZWFkIGZsYWcgKi8KLWludCBkZWZpRGVidWcoaW50KSB7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgZGVmaUVycm9yKGludCBjaGVjaywgaW50IG1zZ051bSwgY29uc3QgY2hhciogbWVzcywgZGVmckRhdGEgKmRlZkRhdGEpIHsKLSAgLyogY2hlY2sgaXMgMSBpZiB0aGUgY2FsbGVyIGZ1bmN0aW9uIGhhcyBjaGVja2VkIHRvdGFsTXNnTGltaXQsIGV0Yy4gKi8KLSAgaWYgKCFkZWZEYXRhKSB7Ci0gICAgZGVmRGF0YSA9IGRlZkNvbnRleHQuZGF0YTsKLSAgfQotCi0gIHJldHVybiBkZWZEYXRhLT5kZWZpRXJyb3IoY2hlY2ssIG1zZ051bSwgbWVzcyk7Ci19Ci0KLWNvbnN0IGNoYXIqIHVwcGVyQ2FzZShjb25zdCBjaGFyKiBzdHIsIGRlZnJEYXRhICpkZWZEYXRhKSB7Ci0gIGlmICghZGVmRGF0YSkgewotICAgIGRlZkRhdGEgPSBkZWZDb250ZXh0LmRhdGE7Ci0gIH0KLQotICAgcmV0dXJuIGRlZkRhdGEtPnVwcGVyQ2FzZShzdHIpOwotfQotCi1jb25zdCBjaGFyKiBERUZDQVNFKGNvbnN0IGNoYXIqIGNoLCBkZWZyRGF0YSAqZGVmRGF0YSkgewotICBpZiAoIWRlZkRhdGEpIHsKLSAgICBkZWZEYXRhID0gZGVmQ29udGV4dC5kYXRhOwotICB9Ci0KLSAgIHJldHVybiBkZWZEYXRhLT5ERUZDQVNFKGNoKTsKLX0KLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaURlYnVnLmhwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaURlYnVnLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdlNTc4OS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlEZWJ1Zy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2lmbmRlZiBkZWZpRGVidWdfaAotI2RlZmluZSBkZWZpRGVidWdfaCAKLQotI2luY2x1ZGUgImRlZmlLUkRlZnMuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1jbGFzcyBkZWZyRGF0YTsKLQotLyogU2V0IGZsYWcgKi8KLWV4dGVybiB2b2lkIGRlZmlTZXREZWJ1ZyAoaW50IG51bSwgaW50IHZhbHVlKSA7Ci0KLS8qIFJlYWQgZmxhZyAqLwotZXh0ZXJuIGludCBkZWZpRGVidWcgKGludCBudW0pIDsKLQotLyogRXJyb3IgbG9nZ2luIGZ1bmN0aW9uICovCi1leHRlcm4gdm9pZCBkZWZpRXJyb3IoaW50IGNoZWNrLCBpbnQgbXNnTnVtLCBjb25zdCBjaGFyKiBtZXNzYWdlLCBkZWZyRGF0YSAqZGVmRGF0YSA9IE5VTEwpOwotCi0vKiBmb3IgYXV0byB1cHNoaWZ0aW5nIG5hbWVzIGluIGNhc2UgaW5zZW5zaXRpdmUgZmlsZXMgKi8KLWV4dGVybiBjb25zdCBjaGFyKiB1cHBlckNhc2UoY29uc3QgY2hhciogYywgZGVmckRhdGEgKmRlZkRhdGEgPSBOVUxMKTsKLWV4dGVybiBjb25zdCBjaGFyKiBERUZDQVNFKGNvbnN0IGNoYXIqIGNoLCBkZWZyRGF0YSAqZGVmRGF0YSA9IE5VTEwpOwotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotVVNFX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpRGVmcy5ocHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlEZWZzLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdiN2I4OS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlEZWZzLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotLyogRGVmaW5pdGlvbnMgaGVhZGVyIGZpbGUgZm9yIHRoZSBERUYgSW50ZXJmYWNlICovCi0KLSNpZm5kZWYgREVGSV9ERUZTX0gKLSNkZWZpbmUgREVGSV9ERUZTX0gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0KLSNpbmNsdWRlICJkZWZpS1JEZWZzLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotLyo9PT09PT09PT09PT09PT09PT09IEdlbmVyYWwgVHlwZXMgYW5kIERlZmluaXRpb25zID09PT09PT09PT09PT09PT09Ki8KLQotI2lmbmRlZiBUUlVFCi0jZGVmaW5lIFRSVUUgKDEpCi0jZW5kaWYKLQotI2lmbmRlZiBGQUxTRQotI2RlZmluZSBGQUxTRSAoMCkKLSNlbmRpZgotCi0jaWZuZGVmIE5VTEwKLSNkZWZpbmUgTlVMTCAoMCkKLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCBkZWZwb2ludCBkZWZQT0lOVDsKLQotc3RydWN0IGRlZnBvaW50IHsKLSAgICBpbnQgeDsKLSAgICBpbnQgeTsKLSAgICB9OwotCi10eXBlZGVmIHN0cnVjdCBkZWZyZWN0IGRlZlJFQ1Q7Ci0KLXN0cnVjdCBkZWZyZWN0IHsKLSAgICBkZWZQT0lOVCBsbCx1cjsKLSAgICB9OwotCi10eXBlZGVmIHN0cnVjdCBkZWZ0b2tlbiBkZWZUT0tFTjsKLQotc3RydWN0IGRlZnRva2VuIHsKLSAgICBkZWZUT0tFTiAqbmV4dDsKLSAgICBpbnQgd2hhdDsKLSAgICBpbnQgZGF0YTsKLSAgICBkZWZQT0lOVCBwdDsKLSAgICB9OwotCi0jZGVmaW5lIFNUQVJUX0xJU1QgMTAwMDEKLSNkZWZpbmUgUE9JTlRfU1BFQyAxMDAwMgotI2RlZmluZSBWSUFfU1BFQyAgIDEwMDAzCi0jZGVmaW5lIFdJRFRIX1NQRUMgMTAwMDQKLSNkZWZpbmUgTEFZRVJfU1BFQyAxMDAwNQotI2RlZmluZSBTSEFQRV9TUEVDIDEwMDA2Ci0KLSNpZm5kZWYJTUlOCi0jZGVmaW5lIE1JTih4LHkpICgoeCkgPCAoeSk/ICh4KSA6ICh5KSkKLSNlbmRpZgotCi0jaWZuZGVmCU1JTgotI2RlZmluZSBNQVgoeCx5KSAoKHgpID4gKHkpPyAoeCkgOiAoeSkpCi0jZW5kaWYKLQotI2RlZmluZSBST1VORCh4KSAoKHgpID49IDAgPyAoaW50KSgoeCkrMC41KSA6IChpbnQpKCh4KS0wLjUpKQotCi0vL2RlZlRPS0VOICpUb2tlbkZyb21SZWN0KCk7Ci0KLS8qPT09PT09PT09PT09PT09PT09PSBFbnVtZXJhdGVkIFR5cGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotdHlwZWRlZiBpbnQgZGVmaUJvb2xlYW47Ci0KLS8qIEV2ZXJ5IHR5cGUgb2Ygb2JqZWN0IGhhcyBhIHVuaXF1ZSBpZGVudGlmaWVyLCBhbmQgZWFjaCBvYmplY3QKLSAqIHdoaWNoIGlzIGNyZWF0ZWQga25vd3MgaXRzIHR5cGUsIGJ5IHN0b3JpbmcgdGhlIGRlZmlPYmplY3RUeXBlX2UKLSAqIGFzIHRoZSBmaXJzdCBtZW1iZXIgaW4gdGhlIHN0cnVjdHVyZS4KLSAqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAvKiBkZWNyZWFzZSBsaWtlbGlob29kIG9mIGFjY2lkZW50YWxseSBjb3JyZWN0IHZhbHVlcyBieSBzdGFydGluZwotICAgICBhdCBhbiB1bnVzdWFsIG51bWJlciAqLwotICBkZWZpSW52YWxpZE9iamVjdCA9IDQxNzEzLCAKLSAgZGVmaVVua25vd25PYmplY3QgLyogdm9pZCAqICovCi19IGRlZmlPYmplY3RUeXBlX2U7Ci0KLQotLyogVGhlIG1lbW9yeSBwb2xpY3kgY29udHJvbHMgaG93IGFuIG9iamVjdCB3aGljaCByZWZlcnMgdG8gb3IgaXMgY29tcG9zZWQgb2YKLSAqIG90aGVyIG9iamVjdHMgbWFuYWdlcyB0aG9zZSBzdWItb2JqZWN0cywgcGFydGljdWxhcmx5IHdoZW4gdGhlIHBhcmVudAotICogb2JqZWN0IGlzIGNvcGllZCBvciBkZWxldGVkLiAgVGhlIHBvbGljeSBpcyBzcGVjaWZpZWQgYXMgYW4gYXJndW1lbnQgdG8gdGhlCi0gKiBjb25zdHJ1Y3RvciBvciBpbml0aWFsaXplciwgYW5kIGl0IGlzIHN0b3JlZCB3aXRoIHRoZSBwYXJlbnQgb2JqZWN0LgotICoKLSAqIFRoZSBtZW1vcnkgcG9saWN5IGlzIGEgZ2VuZXJhbGl6YXRpb24gb2YgdGhlIGNvbW1vbiBkaXN0aW5jdGlvbiBiZXR3ZWVuCi0gKiBkZWVwIGFuZCBzaGFsbG93IGNvcGllcy4gIFdoZW4gYSBzaGFsbG93IGNvcHkgb2YgYSBwYXJlbnQgb2JqZWN0IGlzIG1hZGUsCi0gKiB0aGUgY29weSBtYWludGFpbnMgcG9pbnRlcnMgdG8gdGhlIG9yaWdpbmFsIHN1Yi1vYmplY3RzLCBhbmQgdGhlIG9yaWdpbmFsCi0gKiBwYXJlbnQgcmVtYWlucyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhvc2Ugc3ViLW9iamVjdHMuICBXaGVuIGEgZGVlcAotICogY29weSBvZiBhIHBhcmVudCBvYmplY3QgaXMgbWFkZSwgdGhlIGNvcHkgbWFpbnRhaW5zIHBvaW50ZXJzIHRvIG5ldyBjb3BpZXMKLSAqIG9mIGVhY2ggb2YgdGhlIHN1Yi1vYmplY3RzLCBhbmQgdGhlIGNvcHkgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZQotICogbmV3IHN1Yi1vYmplY3RzLgotICoKLSAqIFRoZSBkZWZpUHJpdmF0ZVN1Yk9iamVjdHMgcG9saWN5IGNvcnJlc3BvbmRzIHRvIGEgZGVlcCBjb3B5LCB3aGlsZSB0aGUgdGhlCi0gKiBkZWZpUmVmZXJlbmNlZFN1Yk9iamVjdHMgcG9saWN5IGNvcnJlc3BvbmRzIHRvIGEgc2hhbGxvdyBjb3B5LiAgVXN1YWxseSBhbgotICogaW5pdGlhbCBwYXJlbnQgb2JqZWN0IHdpbGwgYmUgY3JlYXRlZCB1c2luZyBkZWZpUHJpdmF0ZVN1Yk9iamVjdHMuICBXaGVuIGEKLSAqIGNvcHkgaXMgbWFkZSBvZiB0aGF0IHBhcmVudCBvYmplY3QsIHRoZSBjb3B5IG1heSBlaXRoZXIgbWFpbnRhaW4gaXRzIG93bgotICogcHJpdmF0ZSB2ZXJzaW9ucyBvZiBlYWNoIHN1Yi1vYmplY3QsIG9yIGl0IG1heSByZWZlciB0byB0aGUgb3JpZ2luYWwKLSAqIHN1Yi1vYmplY3RzLgotICoKLSAqIEluIGNlcnRhaW4gY2FzZXMsIGl0IGlzIHVzZWZ1bCB0byBjcmVhdGUgYSBkZWVwIGNvcHkgb2YgYSBwYXJlbnQgb2JqZWN0LAotICogZXZlbiB0aG91Z2ggdGhlIG5ldyBwYXJlbnQgb2JqZWN0IHNob3VsZG4ndCBiZSByZXNwb25zaWJsZSBmb3IgdGhlIG5ldwotICogc3ViLW9iamVjdHMuICBJbiB0aGlzIGNhc2UsIHRoZSBkZWZpT3JwaGFuU3ViT2JqZWN0cyBhbmQKLSAqIGRlZmlBZG9wdGVkU3ViT2JqZWN0cyBwb2xpY2llcyBtYXkgYmUgdXNlZC4gIGRlZmlPcnBoYW5TdWJPYmplY3RzIGlzCi0gKiBzcGVjaWZpZWQgd2hpbGUgY3JlYXRpbmcgdGhlIGRlZXAgY29weSwgYW5kIHRoZW4gZGVmaUFkb3B0ZWRTdWJPYmplY3RzIGlzCi0gKiBzcGVjaWZpZWQgd2hpbGUgY3JlYXRpbmcgYW5vdGhlciBwYXJlbnQgd2hpY2ggd2lsbCB0YWtlIG9uIHRoZQotICogcmVzcG9uc2liaWxpdHkgZm9yIHRoZSBvcnBoYW5zLgotICoKLSAqIEFuIG9iamVjdCdzIG1lbW9yeSBwb2xpY3kgYWZmZWN0cyBvbmx5IHRoZSBzdWItb2JqZWN0cyB3aGljaCBpdCBkaXJlY3RseQotICogY29udHJvbHMuICBUaG9zZSBzdWItb2JqZWN0cyB0aGVtc2VsdmVzIG1heSBoYXZlIHRoZSBzYW1lIG1lbW9yeSBwb2xpY3kgYXMKLSAqIHRoZWlyIHBhcmVudHMsIG9yIHRoZXkgbWF5IGhhdmUgYSBkaWZmZXJlbnQgbWVtb3J5IHBvbGljeS4gIFdoZW4gYSBjb3B5IGlzCi0gKiBtYWRlIG9mIGEgY2hpbGQgc3ViLW9iamVjdCwgdGhlIG1lbW9yeSBwb2xpY3kgb2YgdGhlIGNoaWxkIGNvbnRyb2xzCi0gKiB3aGV0aGVyIGRlZXAgb3Igc2hhbGxvdyBjb3BpZXMgYXJlIG1hZGUgb2YgdGhlIGdyYW5kY2hpbGRyZW4uCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAvKiBkZWNyZWFzZSBsaWtlbGlob29kIG9mIGFjY2lkZW50YWxseSBjb3JyZWN0IHZhbHVlcyBieSBzdGFydGluZwotICAgICBhdCBhbiB1bnVzdWFsIG51bWJlciAqLwotICBkZWZpSW52YWxpZE1lbW9yeVBvbGljeSA9IDIzOTUwLAotICBkZWZpUHJpdmF0ZVN1Yk9iamVjdHMsICAgICAgLy8gZGVlcCBjb3B5ICsgZGVsZXRlCi0gIGRlZmlSZWZlcmVuY2VkU3ViT2JqZWN0cywgICAvLyBzaGFsbG93IGNvcHksIG5vIGRlbGV0ZQotICBkZWZpT3JwaGFuU3ViT2JqZWN0cywgICAgICAgLy8gZGVlcCBjb3B5LCBubyBkZWxldGUKLSAgZGVmaUFkb3B0ZWRTdWJPYmplY3RzICAgICAgIC8vIHNoYWxsb3cgY29weSArIGRlbGV0ZQotfSBkZWZpTWVtb3J5UG9saWN5X2U7Ci0KLS8qIEFuIG9wYXF1ZSBwb2ludGVyIGZvciBwYXNzaW5nIHVzZXIgZGF0YSB0aHJvdWdoIGZyb20gb25lIEFQSQotICogZnVuY3Rpb24gdG8gYW5vdGhlci4KLSAqIEEgaGFuZGxlIHdoaWNoIGEgdXNlciBjYW4gc2V0IHRvIHBvaW50IHRvIHRoZWlyIG93biBkYXRhCi0gKiBvbiBhIHBlci1jYWxsYmFjayBiYXNpcy4gIChTZWUgdGhlIGNvbW1lbnQgaW4gZGVmd1dyaXRlci5oKQotICovCi0jZGVmaW5lIGRlZmlVc2VyRGF0YSB2b2lkICoKLSNkZWZpbmUgZGVmaVVzZXJEYXRhSGFuZGxlIHZvaWQgKioKLQotLyogT24gU3VuT3MgNC4xLjMgd2l0aCBhY2MsIHRoaXMgaXMgaW4gbGliYW5zaS5hLCBidXQgaXNuJ3QgcHJvcGVybHkKLSAqIGRlY2xhcmVkIGFueXdoZXJlIGluIHRoZSBoZWFkZXIgZmlsZXMgc3VwcGxpZWQgd2l0aCB0aGUgY29tcGlsZXIuCi0gKi8KLSNpZmRlZiBfX1N1bk9TXzRfMV8zCi1leHRlcm4gaW50IHN0cmNhc2VjbXAoY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKLSNlbmRpZgotCi0jaWZkZWYgV0lOMzIKLSNkZWZpbmUgc3RyZHVwIF9zdHJkdXAKLSNlbmRpZiAKLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLVVTRV9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaUZQQy5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlGUEMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTA4OGE2Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaUZQQy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMyAtIDIwMTUsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSAibGV4LmgiCi0jaW5jbHVkZSAiZGVmaUZQQy5ocHAiCi0jaW5jbHVkZSAiZGVmaURlYnVnLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vICAgZGVmaUZQQwotLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCi1kZWZpRlBDOjpkZWZpRlBDKGRlZnJEYXRhICpkYXRhKQotIDogZGVmRGF0YShkYXRhKQotewotICBJbml0KCk7Ci19Ci0KLQotdm9pZCBkZWZpRlBDOjpJbml0KCkgewotICBuYW1lXyA9IDA7Ci0gIG5hbWVMZW5ndGhfID0gMDsKLSAgbmFtZXNBbGxvY2F0ZWRfID0gMDsKLSAgbmFtZXNVc2VkXyA9IDA7Ci0gIG5hbWVzXyA9IDA7Ci0gIHJvd09yQ29tcF8gPSAwOwotICBjbGVhcigpOwotfQotCi0KLWRlZmlGUEM6On5kZWZpRlBDKCkgewotICBEZXN0cm95KCk7Ci19Ci0KLQotdm9pZCBkZWZpRlBDOjpEZXN0cm95KCkgewotCi0gIGNsZWFyKCk7Ci0KLSAgaWYgKG5hbWVfKSBmcmVlKG5hbWVfKTsKLSAgbmFtZV8gPSAwOwotICBuYW1lTGVuZ3RoXyA9IDA7Ci0KLSAgZnJlZSgoY2hhciopKG5hbWVzXykpOwotICBmcmVlKChjaGFyKikocm93T3JDb21wXykpOwotICBuYW1lc0FsbG9jYXRlZF8gPSAwOwotfQotCi0KLXZvaWQgZGVmaUZQQzo6Y2xlYXIoKSB7Ci0gIGludCBpOwotCi0gIGRpcmVjdGlvbl8gPSAwOwotICBoYXNBbGlnbl8gPSAwOwotICBoYXNNaW5fID0gMDsKLSAgaGFzTWF4XyA9IDA7Ci0gIGhhc0VxdWFsXyA9IDA7Ci0gIGNvcm5lcl8gPSAwOwotCi0gIGZvciAoaSA9IDA7IGkgPCBuYW1lc1VzZWRfOyBpKyspIHsKLSAgICBpZiAobmFtZXNfW2ldKSBmcmVlIChuYW1lc19baV0pIDsKLSAgfQotICBuYW1lc1VzZWRfID0gMDsKLX0KLQotCi12b2lkIGRlZmlGUEM6OnNldE5hbWUoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogZGlyZWN0aW9uKSB7Ci0gIGludCBsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotCi0gIGNsZWFyKCk7Ci0KLSAgaWYgKGxlbiA+IG5hbWVMZW5ndGhfKSB7Ci0gICAgaWYgKG5hbWVfKSBmcmVlKG5hbWVfKTsKLSAgICBuYW1lTGVuZ3RoXyA9IGxlbjsKLSAgICBuYW1lXyA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgfQotICBzdHJjcHkobmFtZV8sIGRlZkRhdGEtPkRFRkNBU0UobmFtZSkpOwotCi0gIGlmICgqZGlyZWN0aW9uID09ICdIJykKLSAgICBkaXJlY3Rpb25fID0gJ0gnOwotICBlbHNlIGlmICgqZGlyZWN0aW9uID09ICdWJykKLSAgICBkaXJlY3Rpb25fID0gJ1YnOwotICBlbHNlCi0gICAgZGVmaUVycm9yKDAsIDYwMzAsICJFUlJPUiAoREVGUEFSUy02MDMwKTogSW52YWxpZCBkaXJlY3Rpb24gc3BlY2lmaWVkIHdpdGggRlBDIG5hbWUuIFRoZSB2YWxpZCBkaXJlY3Rpb24gaXMgZWl0aGVyICdIJyBvciAnVicuIFNwZWNpZnkgYSB2YWxpZCB2YWx1ZSBhbmQgdGhlbiB0cnkgYWdhaW4uIiwgZGVmRGF0YSk7Ci0KLX0KLQotCi12b2lkIGRlZmlGUEM6OnByaW50KEZJTEUqIGYpIGNvbnN0IHsKLSAgZnByaW50ZihmLCAiRlBDICclcydcbiIsIG5hbWVfKTsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpRlBDOjpuYW1lKCkgY29uc3QgewotICByZXR1cm4gbmFtZV87Ci19Ci0KLQotaW50IGRlZmlGUEM6OmlzVmVydGljYWwoKSBjb25zdCB7Ci0gIHJldHVybiBkaXJlY3Rpb25fID09ICdWJyA/IDEgOiAwIDsKLX0KLQotCi1pbnQgZGVmaUZQQzo6aXNIb3Jpem9udGFsKCkgY29uc3QgewotICByZXR1cm4gZGlyZWN0aW9uXyA9PSAnSCcgPyAxIDogMCA7Ci19Ci0KLQotaW50IGRlZmlGUEM6Omhhc0FsaWduKCkgY29uc3QgewotICByZXR1cm4gKGludCkoaGFzQWxpZ25fKTsKLX0KLQotCi1pbnQgZGVmaUZQQzo6aGFzTWF4KCkgY29uc3QgewotICByZXR1cm4gKGludCkoaGFzTWF4Xyk7Ci19Ci0KLQotaW50IGRlZmlGUEM6Omhhc01pbigpIGNvbnN0IHsKLSAgcmV0dXJuIChpbnQpKGhhc01pbl8pOwotfQotCi0KLWludCBkZWZpRlBDOjpoYXNFcXVhbCgpIGNvbnN0IHsKLSAgcmV0dXJuIChpbnQpKGhhc0VxdWFsXyk7Ci19Ci0KLQotZG91YmxlIGRlZmlGUEM6OmFsaWduTWluKCkgY29uc3QgewotICByZXR1cm4gbWluTWF4RXF1YWxfOwotfQotCi0KLWRvdWJsZSBkZWZpRlBDOjphbGlnbk1heCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1pbk1heEVxdWFsXzsKLX0KLQotCi1kb3VibGUgZGVmaUZQQzo6ZXF1YWwoKSBjb25zdCB7Ci0gIHJldHVybiBtaW5NYXhFcXVhbF87Ci19Ci0KLQotaW50IGRlZmlGUEM6Om51bVBhcnRzKCkgY29uc3QgewotICByZXR1cm4gbmFtZXNVc2VkXzsKLX0KLQotCi12b2lkIGRlZmlGUEM6OnNldEFsaWduKCkgewotICBoYXNBbGlnbl8gPSAwOwotfQotCi0KLXZvaWQgZGVmaUZQQzo6c2V0TWluKGRvdWJsZSBudW0pIHsKLSAgbWluTWF4RXF1YWxfID0gbnVtOwotfQotCi0KLXZvaWQgZGVmaUZQQzo6c2V0TWF4KGRvdWJsZSBudW0pIHsKLSAgbWluTWF4RXF1YWxfID0gbnVtOwotfQotCi0KLXZvaWQgZGVmaUZQQzo6c2V0RXF1YWwoZG91YmxlIG51bSkgewotICBtaW5NYXhFcXVhbF8gPSBudW07Ci19Ci0KLQotdm9pZCBkZWZpRlBDOjpzZXREb2luZ0JvdHRvbUxlZnQoKSB7Ci0gIGNvcm5lcl8gPSAnQic7Ci19Ci0KLQotdm9pZCBkZWZpRlBDOjpzZXREb2luZ1RvcFJpZ2h0KCkgewotICBjb3JuZXJfID0gJ1QnOwotfQotCi0KLXZvaWQgZGVmaUZQQzo6Z2V0UGFydChpbnQgaW5kZXgsIGludCogY29ybmVyLCBpbnQqIHR5cCwgY2hhcioqIG5hbWUpIGNvbnN0IHsKLSAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPD0gbmFtZXNVc2VkXykgewotICAgIC8vIDQgZm9yIGJvdHRvbSBsZWZ0ICAwIGZvciB0b3ByaWdodAotICAgIC8vIDIgZm9yIHJvdyAgIDAgZm9yIGNvbXBzCi0gICAgaWYgKGNvcm5lcikgKmNvcm5lciA9IChpbnQpKChyb3dPckNvbXBfW2luZGV4XSAmIDQpID8gJ0InIDogJ1QnKSA7Ci0gICAgaWYgKHR5cCkgKnR5cCA9IChpbnQpKChyb3dPckNvbXBfW2luZGV4XSAmIDIpID8gJ1InIDogJ0MnKSA7Ci0gICAgaWYgKG5hbWUpICpuYW1lID0gbmFtZXNfW2luZGV4XTsKLSAgfQotfQotCi0KLXZvaWQgZGVmaUZQQzo6YWRkUm93KGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgYWRkSXRlbSgnUicsIGRlZkRhdGEtPkRFRkNBU0UobmFtZSkpOwotfQotCi0KLXZvaWQgZGVmaUZQQzo6YWRkQ29tcHMoY29uc3QgY2hhciogbmFtZSkgewotICBhZGRJdGVtKCdDJywgZGVmRGF0YS0+REVGQ0FTRShuYW1lKSk7Ci19Ci0KLQotdm9pZCBkZWZpRlBDOjphZGRJdGVtKGNoYXIgaXRlbSwgY29uc3QgY2hhciogbmFtZSkgewotICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLQotICBpZiAobmFtZXNVc2VkXyA+PSBuYW1lc0FsbG9jYXRlZF8pIHsKLSAgICBjaGFyKiBuZXdSOwotICAgIGNoYXIqKiBuZXdOOwotICAgIGludCBpOwotICAgIG5hbWVzQWxsb2NhdGVkXyA9Ci0JbmFtZXNBbGxvY2F0ZWRfID8gbmFtZXNBbGxvY2F0ZWRfICogMiA6IDggOwotICAgIG5ld04gPSAoY2hhcioqKSBtYWxsb2Moc2l6ZW9mKGNoYXIqKSAqIG5hbWVzQWxsb2NhdGVkXyk7Ci0gICAgbmV3UiA9IChjaGFyKikgbWFsbG9jKHNpemVvZihjaGFyKSAqIG5hbWVzQWxsb2NhdGVkXyk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG5hbWVzVXNlZF87IGkrKykgewotICAgICAgbmV3TltpXSA9IG5hbWVzX1tpXTsKLSAgICAgIG5ld1JbaV0gPSByb3dPckNvbXBfW2ldOwotICAgIH0KLSAgICBpZiAobmFtZXNfKSBmcmVlKChjaGFyKikobmFtZXNfKSk7Ci0gICAgaWYgKHJvd09yQ29tcF8pIGZyZWUocm93T3JDb21wXyk7Ci0gICAgbmFtZXNfID0gbmV3TjsKLSAgICByb3dPckNvbXBfID0gbmV3UjsKLSAgfQotCi0gIG5hbWVzX1tuYW1lc1VzZWRfXSA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgc3RyY3B5KG5hbWVzX1tuYW1lc1VzZWRfXSwgbmFtZSk7Ci0KLSAgLy8gNCBmb3IgYm90dG9tbGVmdAotICAvLyAyIGZvciByb3cKLSAgcm93T3JDb21wX1tuYW1lc1VzZWRfXSA9IAotICAgICAgICAgKGNoYXIpKCgoY29ybmVyXyA9PSAnQicpID8gNCA6IDApIHwKLQkgKGl0ZW0gPT0gJ1InID8gMiA6IDApKTsKLQotICBuYW1lc1VzZWRfICs9IDE7Ci19Ci0KLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaUZQQy5ocHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlGUEMuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTJkODYzLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaUZQQy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMywgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpZm5kZWYgZGVmaUZQQ19oCi0jZGVmaW5lIGRlZmlGUENfaAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJkZWZpS1JEZWZzLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotY2xhc3MgZGVmckRhdGE7Ci0KLWNsYXNzIGRlZmlGUEMgewotcHVibGljOgotICBkZWZpRlBDKGRlZnJEYXRhICpkYXRhKTsKLSAgdm9pZCBJbml0KCk7Ci0KLSAgdm9pZCBEZXN0cm95KCk7Ci0gIH5kZWZpRlBDKCk7Ci0KLSAgdm9pZCBjbGVhcigpOwotCi0gIHZvaWQgc2V0TmFtZShjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiBkaXJlY3Rpb24pOwotICB2b2lkIHNldEFsaWduKCk7Ci0gIHZvaWQgc2V0TWF4KGRvdWJsZSBudW0pOwotICB2b2lkIHNldE1pbihkb3VibGUgbnVtKTsKLSAgdm9pZCBzZXRFcXVhbChkb3VibGUgbnVtKTsKLSAgdm9pZCBzZXREb2luZ0JvdHRvbUxlZnQoKTsKLSAgdm9pZCBzZXREb2luZ1RvcFJpZ2h0KCk7Ci0gIHZvaWQgYWRkUm93KGNvbnN0IGNoYXIqIG5hbWUpOwotICB2b2lkIGFkZENvbXBzKGNvbnN0IGNoYXIqIG5hbWUpOwotICB2b2lkIGFkZEl0ZW0oY2hhciB0eXAsIGNvbnN0IGNoYXIqIG5hbWUpOwotCi0gIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdDsKLSAgaW50IGlzVmVydGljYWwoKSBjb25zdDsKLSAgaW50IGlzSG9yaXpvbnRhbCgpIGNvbnN0OwotICBpbnQgaGFzQWxpZ24oKSBjb25zdDsKLSAgaW50IGhhc01heCgpIGNvbnN0OwotICBpbnQgaGFzTWluKCkgY29uc3Q7Ci0gIGludCBoYXNFcXVhbCgpIGNvbnN0OwotICBkb3VibGUgYWxpZ25NYXgoKSBjb25zdDsKLSAgZG91YmxlIGFsaWduTWluKCkgY29uc3Q7Ci0gIGRvdWJsZSBlcXVhbCgpIGNvbnN0OwotCi0gIGludCBudW1QYXJ0cygpIGNvbnN0OwotCi0gIC8vIFJldHVybiB0aGUgY29uc3RyYWludCBudW1iZXIgImluZGV4IiB3aGVyZSBpbmRleCBpcwotICAvLyAgICBmcm9tIDAgdG8gbnVtUGFydHMoKQotICAvLyBUaGUgcmV0dXJuZWQgY29ybmVyIGlzICdCJyBmb3IgYm90dG9tIGxlZnQgICdUJyBmb3IgdG9wcmlnaHQKLSAgLy8gVGhlIHJldHVybmVkIHR5cCBpcyAnUicgZm9yIHJvd3MgICAnQycgZm9yIGNvbXBzCi0gIC8vIFRoZSByZXR1cm5lZCBjaGFyKiBwb2ludHMgdG8gbmFtZSBvZiB0aGUgaXRlbS4KLSAgdm9pZCBnZXRQYXJ0KGludCBpbmRleCwgaW50KiBjb3JuZXIsIGludCogdHlwLCBjaGFyKiogbmFtZSkgY29uc3Q7Ci0KLSAgLy8gZGVidWcgcHJpbnQKLSAgdm9pZCBwcmludChGSUxFKiBmKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICBjaGFyKiBuYW1lXzsKLSAgaW50IG5hbWVMZW5ndGhfOwotICBjaGFyIGRpcmVjdGlvbl87IC8vIEggb3IgVgotICBjaGFyIGhhc0FsaWduXzsKLSAgY2hhciBoYXNNaW5fOwotICBjaGFyIGhhc01heF87Ci0gIGNoYXIgaGFzRXF1YWxfOwotICBjaGFyIGNvcm5lcl87ICAgLy8gQm90dG9tbGVmdCBvciBUb3ByaWdodAotICBkb3VibGUgbWluTWF4RXF1YWxfOwotICBpbnQgbmFtZXNBbGxvY2F0ZWRfOyAgLy8gYWxsb2NhdGVkIHNpemUgb2YgbmFtZXNfIGFuZCByb3dPckNvbXBfCi0gIGludCBuYW1lc1VzZWRfOyAgICAgICAvLyBudW1iZXIgb2YgZW50cmllcyB1c2VkIGluIHRoZSBhcnJheXMKLSAgY2hhciogcm93T3JDb21wXzsKLSAgY2hhcioqIG5hbWVzXzsKLQotICBkZWZyRGF0YSAqZGVmRGF0YTsKLX07Ci0KLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLVVTRV9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaUZpbGwuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpRmlsbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNzkwOWIuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpRmlsbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MjggKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMyAtIDIwMTUsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlICJsZXguaCIKLSNpbmNsdWRlICJkZWZpRmlsbC5ocHAiCi0jaW5jbHVkZSAiZGVmaURlYnVnLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vICAgIGRlZmlGaWxsCi0vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1kZWZpRmlsbDo6ZGVmaUZpbGwoZGVmckRhdGEgKmRhdGEpIAotOiBkZWZEYXRhKGRhdGEpIAotewotICBJbml0KCk7Ci19Ci0KLQotdm9pZCBkZWZpRmlsbDo6SW5pdCgpIHsKLSAgbnVtUG9seXNfID0gMDsKLSAgbnVtUHRzXyA9IDA7Ci0gIGNsZWFyKCk7Ci0gIGxheWVyTmFtZUxlbmd0aF8gPSAwOwotICB4bF8gPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkqMSk7Ci0gIHlsXyA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSoxKTsKLSAgeGhfID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKjEpOwotICB5aF8gPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkqMSk7Ci0gIHJlY3RzQWxsb2NhdGVkXyA9IDE7ICAgICAgLy8gQXQgbGVhc3QgMSByZWN0YW5nbGUgd2lsbCBkZWZpbmUKLSAgcG9seXNBbGxvY2F0ZWRfID0gMDsKLSAgcG9seWdvbnNfID0gMDsKLSAgbGF5ZXJOYW1lXyA9IDA7Ci0gIHZpYU5hbWVfID0gMDsKLSAgdmlhTmFtZUxlbmd0aF8gPSAwOwotICB2aWFQdHNfID0gMDsKLSAgcHRzQWxsb2NhdGVkXyA9IDA7Ci0gIHZpYVB0c18gPSAwOwotCi19Ci0KLWRlZmlGaWxsOjp+ZGVmaUZpbGwoKSB7Ci0gIERlc3Ryb3koKTsKLX0KLQotdm9pZCBkZWZpRmlsbDo6Y2xlYXIoKSB7Ci0gIGhhc0xheWVyXyA9IDA7Ci0gIGxheWVyT3BjXyA9IDA7Ci0gIG51bVJlY3RhbmdsZXNfID0gMDsKLSAgaGFzVmlhXyA9IDA7Ci0gIHZpYU9wY18gPSAwOwotICBtYXNrXyA9IDA7Ci19Ci0KLXZvaWQgZGVmaUZpbGw6OmNsZWFyUG9seSgpIHsKLSAgc3RydWN0IGRlZmlQb2ludHMqIHA7Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1Qb2x5c187IGkrKykgewotICAgIHAgPSBwb2x5Z29uc19baV07Ci0gICAgZnJlZSgoY2hhciopKHAtPngpKTsKLSAgICBmcmVlKChjaGFyKikocC0+eSkpOwotICAgIGZyZWUoKGNoYXIqKShwb2x5Z29uc19baV0pKTsKLSAgfQotICBudW1Qb2x5c18gPSAwOwotfQotCi12b2lkIGRlZmlGaWxsOjpjbGVhclB0cygpIHsKLSAgc3RydWN0IGRlZmlQb2ludHMqIHA7Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1QdHNfOyBpKyspIHsKLSAgICBwID0gdmlhUHRzX1tpXTsKLSAgICBmcmVlKChjaGFyKikocC0+eCkpOwotICAgIGZyZWUoKGNoYXIqKShwLT55KSk7Ci0gICAgZnJlZSgoY2hhciopKHZpYVB0c19baV0pKTsKLSAgfQotICBudW1QdHNfID0gMDsKLX0KLQotdm9pZCBkZWZpRmlsbDo6RGVzdHJveSgpIHsKLSAgaWYgKGxheWVyTmFtZV8pIGZyZWUobGF5ZXJOYW1lXyk7Ci0gIGlmICh2aWFOYW1lXykgZnJlZSh2aWFOYW1lXyk7Ci0gIGZyZWUoKGNoYXIqKSh4bF8pKTsKLSAgZnJlZSgoY2hhciopKHlsXykpOwotICBmcmVlKChjaGFyKikoeGhfKSk7Ci0gIGZyZWUoKGNoYXIqKSh5aF8pKTsKLSAgcmVjdHNBbGxvY2F0ZWRfID0gMDsKLSAgeGxfID0gMDsKLSAgeWxfID0gMDsKLSAgeGhfID0gMDsKLSAgeWhfID0gMDsKLSAgY2xlYXJQb2x5KCk7Ci0gIGlmIChwb2x5Z29uc18pIGZyZWUoKGNoYXIqKShwb2x5Z29uc18pKTsKLSAgcG9seWdvbnNfID0gMDsKLSAgY2xlYXJQdHMoKTsKLSAgaWYgKHZpYVB0c18pIGZyZWUoKGNoYXIqKSh2aWFQdHNfKSk7Ci0gIHZpYVB0c18gPSAwOwotICBjbGVhcigpOwotfQotCi0KLXZvaWQgZGVmaUZpbGw6OnNldExheWVyKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgaW50IGxlbiA9IHN0cmxlbihuYW1lKSArIDE7Ci0gIGlmIChsYXllck5hbWVMZW5ndGhfIDwgbGVuKSB7Ci0gICAgaWYgKGxheWVyTmFtZV8pIGZyZWUobGF5ZXJOYW1lXyk7Ci0gICAgbGF5ZXJOYW1lXyA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgICBsYXllck5hbWVMZW5ndGhfID0gbGVuOwotICB9Ci0gIHN0cmNweShsYXllck5hbWVfLCBkZWZEYXRhLT5ERUZDQVNFKG5hbWUpKTsKLSAgaGFzTGF5ZXJfID0gMTsKLX0KLQotLy8gNS43Ci12b2lkIGRlZmlGaWxsOjpzZXRMYXllck9wYygpIHsKLSAgbGF5ZXJPcGNfID0gMTsKLX0KLQotdm9pZCBkZWZpRmlsbDo6YWRkUmVjdChpbnQgeGwsIGludCB5bCwgaW50IHhoLCBpbnQgeWgpIHsKLSAgaWYgKG51bVJlY3RhbmdsZXNfID09IHJlY3RzQWxsb2NhdGVkXykgewotICAgIGludCBpOwotICAgIGludCBtYXggPSByZWN0c0FsbG9jYXRlZF8gPSByZWN0c0FsbG9jYXRlZF8gKiAyOwotICAgIGludCogbmV3eGwgPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkqbWF4KTsKLSAgICBpbnQqIG5ld3lsID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKm1heCk7Ci0gICAgaW50KiBuZXd4aCA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSptYXgpOwotICAgIGludCogbmV3eWggPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkqbWF4KTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUmVjdGFuZ2xlc187IGkrKykgewotICAgICAgbmV3eGxbaV0gPSB4bF9baV07Ci0gICAgICBuZXd5bFtpXSA9IHlsX1tpXTsKLSAgICAgIG5ld3hoW2ldID0geGhfW2ldOwotICAgICAgbmV3eWhbaV0gPSB5aF9baV07Ci0gICAgfQotICAgIGZyZWUoKGNoYXIqKSh4bF8pKTsKLSAgICBmcmVlKChjaGFyKikoeWxfKSk7Ci0gICAgZnJlZSgoY2hhciopKHhoXykpOwotICAgIGZyZWUoKGNoYXIqKSh5aF8pKTsKLSAgICB4bF8gPSBuZXd4bDsKLSAgICB5bF8gPSBuZXd5bDsKLSAgICB4aF8gPSBuZXd4aDsKLSAgICB5aF8gPSBuZXd5aDsKLSAgfQotICB4bF9bbnVtUmVjdGFuZ2xlc19dID0geGw7Ci0gIHlsX1tudW1SZWN0YW5nbGVzX10gPSB5bDsKLSAgeGhfW251bVJlY3RhbmdsZXNfXSA9IHhoOwotICB5aF9bbnVtUmVjdGFuZ2xlc19dID0geWg7Ci0gIG51bVJlY3RhbmdsZXNfICs9IDE7Ci19Ci0KLS8vIDUuNgotdm9pZCBkZWZpRmlsbDo6YWRkUG9seWdvbihkZWZpR2VvbWV0cmllcyogZ2VvbSkgewotICBzdHJ1Y3QgZGVmaVBvaW50cyogcDsKLSAgaW50IHgsIHk7Ci0gIGludCBpOwotCi0gIGlmIChudW1Qb2x5c18gPT0gcG9seXNBbGxvY2F0ZWRfKSB7Ci0gICAgc3RydWN0IGRlZmlQb2ludHMqKiBwb2x5OwotICAgIHBvbHlzQWxsb2NhdGVkXyA9IChwb2x5c0FsbG9jYXRlZF8gPT0gMCkgPwotICAgICAgICAgIDIgOiBwb2x5c0FsbG9jYXRlZF8gKiAyOwotICAgIHBvbHkgPSAoc3RydWN0IGRlZmlQb2ludHMqKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZWZpUG9pbnRzKikgKgotICAgICAgICAgICAgcG9seXNBbGxvY2F0ZWRfKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUG9seXNfOyBpKyspCi0gICAgICBwb2x5W2ldID0gcG9seWdvbnNfW2ldOwotICAgIGlmIChwb2x5Z29uc18pCi0gICAgICBmcmVlKChjaGFyKikocG9seWdvbnNfKSk7Ci0gICAgcG9seWdvbnNfID0gcG9seTsKLSAgfQotICBwID0gKHN0cnVjdCBkZWZpUG9pbnRzKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZWZpUG9pbnRzKSk7Ci0gIHAtPm51bVBvaW50cyA9IGdlb20tPm51bVBvaW50cygpOwotICBwLT54ID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKnAtPm51bVBvaW50cyk7Ci0gIHAtPnkgPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkqcC0+bnVtUG9pbnRzKTsKLSAgZm9yIChpID0gMDsgaSA8IHAtPm51bVBvaW50czsgaSsrKSB7Ci0gICAgZ2VvbS0+cG9pbnRzKGksICZ4LCAmeSk7Ci0gICAgcC0+eFtpXSA9IHg7Ci0gICAgcC0+eVtpXSA9IHk7Ci0gIH0KLSAgcG9seWdvbnNfW251bVBvbHlzX10gPSBwOwotICBudW1Qb2x5c18gKz0gMTsKLX0KLQotaW50IGRlZmlGaWxsOjpoYXNMYXllcigpIGNvbnN0IHsKLSAgcmV0dXJuIGhhc0xheWVyXzsKLX0KLQotY29uc3QgY2hhciogZGVmaUZpbGw6OmxheWVyTmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGxheWVyTmFtZV87Ci19Ci0KLS8vIDUuNwotaW50IGRlZmlGaWxsOjpoYXNMYXllck9wYygpIGNvbnN0IHsKLSAgcmV0dXJuIGxheWVyT3BjXzsKLX0KLQotaW50IGRlZmlGaWxsOjpudW1SZWN0YW5nbGVzKCkgY29uc3QgewotICByZXR1cm4gbnVtUmVjdGFuZ2xlc187Ci19Ci0KLQotaW50IGRlZmlGaWxsOjp4bChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1SZWN0YW5nbGVzXykgewotICAgIGRlZmlFcnJvcigxLCAwLCAiYmFkIGluZGV4IGZvciBGaWxsIHhsIiwgZGVmRGF0YSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIHhsX1tpbmRleF07Ci19Ci0KLQotaW50IGRlZmlGaWxsOjp5bChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1SZWN0YW5nbGVzXykgewotICAgIGRlZmlFcnJvcigxLCAwLCAiYmFkIGluZGV4IGZvciBGaWxsIHlsIiwgZGVmRGF0YSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIHlsX1tpbmRleF07Ci19Ci0KLQotaW50IGRlZmlGaWxsOjp4aChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1SZWN0YW5nbGVzXykgewotICAgIGRlZmlFcnJvcigxLCAwLCAiYmFkIGluZGV4IGZvciBGaWxsIHhoIiwgZGVmRGF0YSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIHhoX1tpbmRleF07Ci19Ci0KLQotaW50IGRlZmlGaWxsOjp5aChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1SZWN0YW5nbGVzXykgewotICAgIGRlZmlFcnJvcigxLCAwLCAiYmFkIGluZGV4IGZvciBGaWxsIHloIiwgZGVmRGF0YSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIHloX1tpbmRleF07Ci19Ci0KLS8vIDUuNgotaW50IGRlZmlGaWxsOjpudW1Qb2x5Z29ucygpIGNvbnN0IHsKLSAgcmV0dXJuIG51bVBvbHlzXzsKLX0KLQotCi0vLyA1LjYKLXN0cnVjdCBkZWZpUG9pbnRzIGRlZmlGaWxsOjpnZXRQb2x5Z29uKGludCBpbmRleCkgY29uc3QgewotICByZXR1cm4gKihwb2x5Z29uc19baW5kZXhdKTsKLX0KLQotLy8gNS43Ci12b2lkIGRlZmlGaWxsOjpzZXRWaWEoY29uc3QgY2hhciogbmFtZSkgewotICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLSAgaWYgKHZpYU5hbWVMZW5ndGhfIDwgbGVuKSB7Ci0gICAgaWYgKHZpYU5hbWVfKSBmcmVlKHZpYU5hbWVfKTsKLSAgICB2aWFOYW1lXyA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgICB2aWFOYW1lTGVuZ3RoXyA9IGxlbjsKLSAgfQotICBzdHJjcHkodmlhTmFtZV8sIGRlZkRhdGEtPkRFRkNBU0UobmFtZSkpOwotICBoYXNWaWFfID0gMTsKLX0KLQotLy8gNS43Ci12b2lkIGRlZmlGaWxsOjpzZXRWaWFPcGMoKSB7Ci0gIHZpYU9wY18gPSAxOwotfQotCi0vLyA1LjgKLXZvaWQgZGVmaUZpbGw6OnNldE1hc2soaW50IGNvbG9yTWFzaykgewotICAgIG1hc2tfID0gY29sb3JNYXNrOwotfQotCi0KLS8vIDUuNwotdm9pZCBkZWZpRmlsbDo6YWRkUHRzKGRlZmlHZW9tZXRyaWVzKiBnZW9tKSB7Ci0gIHN0cnVjdCBkZWZpUG9pbnRzKiBwOwotICBpbnQgeCwgeTsKLSAgaW50IGk7Ci0KLSAgaWYgKG51bVB0c18gPT0gcHRzQWxsb2NhdGVkXykgewotICAgIHN0cnVjdCBkZWZpUG9pbnRzKiogcHRzOwotICAgIHB0c0FsbG9jYXRlZF8gPSAocHRzQWxsb2NhdGVkXyA9PSAwKSA/Ci0gICAgICAgICAgMiA6IHB0c0FsbG9jYXRlZF8gKiAyOwotICAgIHB0cz0gKHN0cnVjdCBkZWZpUG9pbnRzKiopbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGVmaVBvaW50cyopICoKLSAgICAgICAgICAgIHB0c0FsbG9jYXRlZF8pOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1QdHNfOyBpKyspCi0gICAgICBwdHNbaV0gPSB2aWFQdHNfW2ldOwotICAgIGlmICh2aWFQdHNfKQotICAgICAgZnJlZSgoY2hhciopKHZpYVB0c18pKTsKLSAgICB2aWFQdHNfID0gcHRzOwotICB9Ci0gIHAgPSAoc3RydWN0IGRlZmlQb2ludHMqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGRlZmlQb2ludHMpKTsKLSAgcC0+bnVtUG9pbnRzID0gZ2VvbS0+bnVtUG9pbnRzKCk7Ci0gIHAtPnggPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkqcC0+bnVtUG9pbnRzKTsKLSAgcC0+eSA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSpwLT5udW1Qb2ludHMpOwotICBmb3IgKGkgPSAwOyBpIDwgcC0+bnVtUG9pbnRzOyBpKyspIHsKLSAgICBnZW9tLT5wb2ludHMoaSwgJngsICZ5KTsKLSAgICBwLT54W2ldID0geDsKLSAgICBwLT55W2ldID0geTsKLSAgfQotICB2aWFQdHNfW251bVB0c19dID0gcDsKLSAgbnVtUHRzXyArPSAxOwotfQotCi0vLyA1LjcKLWludCBkZWZpRmlsbDo6aGFzVmlhKCkgY29uc3QgewotICByZXR1cm4gaGFzVmlhXzsKLX0KLQotLy8gNS43Ci1jb25zdCBjaGFyKiBkZWZpRmlsbDo6dmlhTmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHZpYU5hbWVfOwotfQotCi0vLyA1LjcKLWludCBkZWZpRmlsbDo6aGFzVmlhT3BjKCkgY29uc3QgewotICByZXR1cm4gdmlhT3BjXzsKLX0KLQotLy8gNS43Ci1pbnQgZGVmaUZpbGw6Om51bVZpYVB0cygpIGNvbnN0IHsKLSAgcmV0dXJuIG51bVB0c187Ci19Ci0KLS8vIDUuOAotaW50IGRlZmlGaWxsOjpsYXllck1hc2soKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1hc2tfOwotfQotCi0vLyA1LjgKLWludCBkZWZpRmlsbDo6dmlhVG9wTWFzaygpIGNvbnN0IHsKLSAgICByZXR1cm4gbWFza18gLyAxMDA7Ci19Ci0KLS8vIDUuOAotaW50IGRlZmlGaWxsOjp2aWFDdXRNYXNrKCkgY29uc3QgewotICAgIHJldHVybiBtYXNrXyAvIDEwICUgMTA7Ci19Ci0KLS8vIDUuOAotaW50IGRlZmlGaWxsOjp2aWFCb3R0b21NYXNrKCkgY29uc3QgewotICAgIHJldHVybiBtYXNrXyAlIDEwOwotfQotCi0vLyA1LjcKLXN0cnVjdCBkZWZpUG9pbnRzIGRlZmlGaWxsOjpnZXRWaWFQdHMoaW50IGluZGV4KSBjb25zdCB7Ci0gIHJldHVybiAqKHZpYVB0c19baW5kZXhdKTsKLX0KLQotdm9pZCBkZWZpRmlsbDo6cHJpbnQoRklMRSogZikgY29uc3QgewotICBpbnQgaSwgajsKLSAgc3RydWN0IGRlZmlQb2ludHMgcG9pbnRzOwotCi0gIGlmIChoYXNMYXllcigpKQotICAgIGZwcmludGYoZiwgIi0gTEFZRVIgJXMiLCBsYXllck5hbWUoKSk7Ci0KLSAgaWYgKGxheWVyTWFzaygpKQotICAgICAgZnByaW50ZihmLCAiICsgTWFzayAlZCIsIGxheWVyTWFzaygpKTsKLQotICBpZiAoaGFzTGF5ZXJPcGMoKSkKLSAgICBmcHJpbnRmKGYsICIgKyBPUEMiKTsKLSAgZnByaW50ZihmLCAiXG4iKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgbnVtUmVjdGFuZ2xlcygpOyBpKyspIHsKLSAgICBmcHJpbnRmKGYsICIgICBSRUNUICVkICVkICVkICVkXG4iLCB4bChpKSwKLSAgICAgICAgICAgIHlsKGkpLCB4aChpKSwKLSAgICAgICAgICAgIHloKGkpKTsKLSAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1Qb2x5Z29ucygpOyBpKyspIHsKLSAgICBmcHJpbnRmKGYsICIgICBQT0xZR09OICIpOwotICAgIHBvaW50cyA9IGdldFBvbHlnb24oaSk7Ci0gICAgZm9yIChqID0gMDsgaiA8IHBvaW50cy5udW1Qb2ludHM7IGorKykKLSAgICAgIGZwcmludGYoZiwgIiVkICVkICIsIHBvaW50cy54W2pdLCBwb2ludHMueVtqXSk7Ci0gICAgZnByaW50ZihmLCAiXG4iKTsKLSAgfQotICBmcHJpbnRmKGYsIlxuIik7Ci0KLSAgaWYgKGhhc1ZpYSgpKQotICAgIGZwcmludGYoZiwgIi0gVklBICVzIiwgdmlhTmFtZSgpKTsKLQotICBpZiAobWFza18pIHsKLSAgICAgIGZwcmludGYoZiwgIiArIE1BU0sgJWQlZCVkIiwgdmlhVG9wTWFzaygpLAotICAgICAgICAgIHZpYUN1dE1hc2soKSwKLSAgICAgICAgICB2aWFCb3R0b21NYXNrKCkpOwotICB9Ci0KLSAgaWYgKGhhc1ZpYU9wYygpKQotICAgIGZwcmludGYoZiwgIiArIE9QQyIpOwotICBmcHJpbnRmKGYsICJcbiIpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1WaWFQdHMoKTsgaSsrKSB7Ci0gICAgZnByaW50ZihmLCAiICAgIik7Ci0gICAgcG9pbnRzID0gZ2V0VmlhUHRzKGkpOwotICAgIGZvciAoaiA9IDA7IGogPCBwb2ludHMubnVtUG9pbnRzOyBqKyspCi0gICAgICBmcHJpbnRmKGYsICIlZCAlZCAiLCBwb2ludHMueFtqXSwgcG9pbnRzLnlbal0pOwotICAgIGZwcmludGYoZiwgIlxuIik7Ci0gIH0KLSAgZnByaW50ZihmLCJcbiIpOwotfQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaUZpbGwuaHBwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpRmlsbC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYzlhMjMuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpRmlsbC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMywgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpZm5kZWYgZGVmaUZJTExfaAotI2RlZmluZSBkZWZpRklMTF9oCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImRlZmlLUkRlZnMuaHBwIgotI2luY2x1ZGUgImRlZmlNaXNjLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotY2xhc3MgZGVmckRhdGE7Ci0KLWNsYXNzIGRlZmlGaWxsIHsKLXB1YmxpYzoKLSAgZGVmaUZpbGwoZGVmckRhdGEgKmRhdGEpOwotICB2b2lkIEluaXQoKTsKLQotICB2b2lkIERlc3Ryb3koKTsKLSAgfmRlZmlGaWxsKCk7Ci0KLSAgdm9pZCBjbGVhcigpOwotICB2b2lkIGNsZWFyUG9seSgpOwotICB2b2lkIGNsZWFyUHRzKCk7Ci0KLSAgdm9pZCBzZXRMYXllcihjb25zdCBjaGFyKiBuYW1lKTsKLSAgdm9pZCBzZXRMYXllck9wYygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIHZvaWQgYWRkUmVjdChpbnQgeGwsIGludCB5bCwgaW50IHhoLCBpbnQgeWgpOwotICB2b2lkIGFkZFBvbHlnb24oZGVmaUdlb21ldHJpZXMqIGdlb20pOwotICB2b2lkIHNldFZpYShjb25zdCBjaGFyKiBuYW1lKTsgICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgdm9pZCBzZXRWaWFPcGMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIHZvaWQgYWRkUHRzKGRlZmlHZW9tZXRyaWVzKiBnZW9tKTsgICAgICAgICAgICAgIC8vIDUuNwotCi0gIGludCBoYXNMYXllcigpIGNvbnN0OwotICBjb25zdCBjaGFyKiBsYXllck5hbWUoKSBjb25zdDsKLSAgaW50IGhhc0xheWVyT3BjKCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0KLSAgdm9pZCBzZXRNYXNrKGludCBjb2xvck1hc2spOwkJCSAgLy8gNS44Ci0gIGludCBsYXllck1hc2soKSBjb25zdDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuOAotICBpbnQgdmlhVG9wTWFzaygpIGNvbnN0OwkJCSAgLy8gNS44Ci0gIGludCB2aWFDdXRNYXNrKCkgY29uc3Q7CQkJICAvLyA1LjgKLSAgaW50IHZpYUJvdHRvbU1hc2soKSBjb25zdDsgICAgICAgICAgICAgICAgICAgICAgLy8gNS44Ci0KLSAgaW50IG51bVJlY3RhbmdsZXMoKSBjb25zdDsKLSAgaW50IHhsKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCB5bChpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgeGgoaW50IGluZGV4KSBjb25zdDsKLSAgaW50IHloKGludCBpbmRleCkgY29uc3Q7Ci0KLSAgaW50IG51bVBvbHlnb25zKCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIHN0cnVjdCBkZWZpUG9pbnRzIGdldFBvbHlnb24oaW50IGluZGV4KSBjb25zdDsgIC8vIDUuNgotCi0gIGludCBoYXNWaWEoKSBjb25zdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNwotICBjb25zdCBjaGFyKiB2aWFOYW1lKCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgaW50IGhhc1ZpYU9wYygpIGNvbnN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0KLSAgaW50IG51bVZpYVB0cygpIGNvbnN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIHN0cnVjdCBkZWZpUG9pbnRzIGdldFZpYVB0cyhpbnQgaW5kZXgpIGNvbnN0OyAgIC8vIDUuNwotCi0gIHZvaWQgcHJpbnQoRklMRSogZikgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgaW50ICAgaGFzTGF5ZXJfOwotICBjaGFyKiBsYXllck5hbWVfOwotICBpbnQgICBsYXllck5hbWVMZW5ndGhfOwotICBpbnQgICBsYXllck9wY187ICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIGludCAgIG51bVJlY3RhbmdsZXNfOwotICBpbnQgICByZWN0c0FsbG9jYXRlZF87Ci0gIGludCogIHhsXzsKLSAgaW50KiAgeWxfOwotICBpbnQqICB4aF87Ci0gIGludCogIHloXzsKLSAgaW50ICAgbnVtUG9seXNfOyAgICAgICAgICAgICAgICAgIC8vIDUuNgotICBpbnQgICBwb2x5c0FsbG9jYXRlZF87ICAgICAgICAgICAgLy8gNS42Ci0gIHN0cnVjdCBkZWZpUG9pbnRzKiogcG9seWdvbnNfOyAgICAvLyA1LjYKLSAgaW50ICAgaGFzVmlhXzsgICAgICAgICAgICAgICAgICAgIC8vIDUuNwotICBjaGFyKiB2aWFOYW1lXzsgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIGludCAgIHZpYU5hbWVMZW5ndGhfOyAgICAgICAgICAgICAvLyA1LjcKLSAgaW50ICAgdmlhT3BjXzsgICAgICAgICAgICAgICAgICAgIC8vIDUuNwotICBpbnQgICBudW1QdHNfOyAgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIGludCAgIHB0c0FsbG9jYXRlZF87ICAgICAgICAgICAgICAvLyA1LjcKLSAgaW50ICAgbWFza187ICAgICAgICAgICAgICAgICAgICAgIC8vIDUuOAotICBzdHJ1Y3QgZGVmaVBvaW50cyoqIHZpYVB0c187ICAgICAgLy8gNS43Ci0KLSAgZGVmckRhdGEgKmRlZkRhdGE7Ci19OwotCi0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1VU0VfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlHcm91cC5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlHcm91cC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZTI1OTAuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpR3JvdXAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDQ3ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTMgLSAyMDE1LCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgImxleC5oIgotI2luY2x1ZGUgImRlZmlHcm91cC5ocHAiCi0jaW5jbHVkZSAiZGVmaURlYnVnLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vICAgZGVmaUdyb3VwCi0vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0KLWRlZmlHcm91cDo6ZGVmaUdyb3VwKGRlZnJEYXRhICpkYXRhKSAKLTogZGVmRGF0YShkYXRhKQotewotICBJbml0KCk7Ci19Ci0KLQotdm9pZCBkZWZpR3JvdXA6OkluaXQoKSB7Ci0gIG5hbWVfID0gMDsKLSAgbmFtZUxlbmd0aF8gPSAwOwotICByZWdpb25fID0gMDsKLSAgcmVnaW9uTGVuZ3RoXyA9IDA7Ci0KLSAgbnVtUmVjdHNfID0gMDsKLSAgcmVjdHNBbGxvY2F0ZWRfID0gMjsKLSAgeGxfID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKjIpOwotICB5bF8gPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkqMik7Ci0gIHhoXyA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSoyKTsKLSAgeWhfID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKjIpOwotCi0gIG51bVByb3BzXyA9IDA7IAotICBwcm9wc0FsbG9jYXRlZF8gPSAyOwotICBwcm9wTmFtZXNfICAgPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKjIpOwotICBwcm9wVmFsdWVzXyAgPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKjIpOwotICBwcm9wRFZhbHVlc18gPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkqMik7Ci0gIHByb3BUeXBlc18gICA9IChjaGFyKiltYWxsb2Moc2l6ZW9mKGNoYXIpKjIpOwotfQotCi0KLWRlZmlHcm91cDo6fmRlZmlHcm91cCgpIHsKLSAgRGVzdHJveSgpOwotfQotCi0KLXZvaWQgZGVmaUdyb3VwOjpEZXN0cm95KCkgewotCi0gIGlmIChuYW1lXykgZnJlZShuYW1lXyk7Ci0gIGlmIChyZWdpb25fKSBmcmVlKHJlZ2lvbl8pOwotICBuYW1lXyA9IDA7Ci0gIG5hbWVMZW5ndGhfID0gMDsKLSAgcmVnaW9uXyA9IDA7Ci0gIHJlZ2lvbkxlbmd0aF8gPSAwOwotCi0gIGNsZWFyKCk7Ci0gIGZyZWUoKGNoYXIqKShwcm9wTmFtZXNfKSk7Ci0gIGZyZWUoKGNoYXIqKShwcm9wVmFsdWVzXykpOwotICBmcmVlKChjaGFyKikocHJvcERWYWx1ZXNfKSk7Ci0gIGZyZWUoKGNoYXIqKShwcm9wVHlwZXNfKSk7Ci0gIGZyZWUoKGNoYXIqKSh4bF8pKTsKLSAgZnJlZSgoY2hhciopKHlsXykpOwotICBmcmVlKChjaGFyKikoeGhfKSk7Ci0gIGZyZWUoKGNoYXIqKSh5aF8pKTsKLX0KLQotCi12b2lkIGRlZmlHcm91cDo6Y2xlYXIoKSB7Ci0gIGludCBpOwotICBoYXNSZWdpb25OYW1lXyA9IDA7Ci0gIGhhc1BlcmltXyA9IDA7Ci0gIGhhc01heFhfID0gMDsKLSAgaGFzTWF4WV8gPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgbnVtUHJvcHNfOyBpKyspIHsKLSAgICBmcmVlKHByb3BOYW1lc19baV0pOwotICAgIGZyZWUocHJvcFZhbHVlc19baV0pOwotICAgIHByb3BEVmFsdWVzX1tpXSA9IDA7Ci0gIH0KLSAgbnVtUHJvcHNfID0gMDsKLSAgbnVtUmVjdHNfID0gMDsKLX0KLQotCi12b2lkIGRlZmlHcm91cDo6c2V0dXAoY29uc3QgY2hhciogbmFtZSkgewotICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLSAgaWYgKGxlbiA+IG5hbWVMZW5ndGhfKSB7Ci0gICAgaWYgKG5hbWVfKSBmcmVlKG5hbWVfKTsKLSAgICBuYW1lTGVuZ3RoXyA9IGxlbjsKLSAgICBuYW1lXyA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgfQotICBzdHJjcHkobmFtZV8sIGRlZkRhdGEtPkRFRkNBU0UobmFtZSkpOwotICBjbGVhcigpOwotCi19Ci0KLQotdm9pZCBkZWZpR3JvdXA6OmFkZFJlZ2lvblJlY3QoaW50IHhsLCBpbnQgeWwsIGludCB4aCwgaW50IHloKSB7Ci0gIGludCBpOwotICBpZiAobnVtUmVjdHNfID09IHJlY3RzQWxsb2NhdGVkXykgewotICAgIGludCBtYXggPSBudW1SZWN0c18gKiAyOwotICAgIGludCogbnhsID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKm1heCk7Ci0gICAgaW50KiBueWwgPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkqbWF4KTsKLSAgICBpbnQqIG54aCA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSptYXgpOwotICAgIGludCogbnloID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKm1heCk7Ci0gICAgbWF4ID0gbnVtUmVjdHNfOwotICAgIGZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykgewotICAgICAgbnhsW2ldID0geGxfW2ldOwotICAgICAgbnlsW2ldID0geWxfW2ldOwotICAgICAgbnhoW2ldID0geGhfW2ldOwotICAgICAgbnloW2ldID0geWhfW2ldOwotICAgIH0KLSAgICBmcmVlKChjaGFyKikoeGxfKSk7Ci0gICAgZnJlZSgoY2hhciopKHlsXykpOwotICAgIGZyZWUoKGNoYXIqKSh4aF8pKTsKLSAgICBmcmVlKChjaGFyKikoeWhfKSk7Ci0gICAgeGxfID0gbnhsOwotICAgIHlsXyA9IG55bDsKLSAgICB4aF8gPSBueGg7Ci0gICAgeWhfID0gbnloOwotICAgIHJlY3RzQWxsb2NhdGVkXyAqPSAyOwotICB9Ci0KLSAgaSA9IG51bVJlY3RzXzsKLSAgeGxfW2ldID0geGw7Ci0gIHlsX1tpXSA9IHlsOwotICB4aF9baV0gPSB4aDsKLSAgeWhfW2ldID0geWg7Ci0gIG51bVJlY3RzXyArPSAxOwotfQotCi0KLXZvaWQgZGVmaUdyb3VwOjpyZWdpb25SZWN0cyhpbnQqIHNpemUsIGludCoqIHhsLAotICAgaW50Kip5bCwgaW50KiogeGgsIGludCoqIHloKSBjb25zdCB7Ci0gICpzaXplID0gbnVtUmVjdHNfOwotICAqeGwgPSB4bF87Ci0gICp5bCA9IHlsXzsKLSAgKnhoID0geGhfOwotICAqeWggPSB5aF87Ci19Ci0KLQotdm9pZCBkZWZpR3JvdXA6OnNldFJlZ2lvbk5hbWUoY29uc3QgY2hhciogcmVnaW9uKSB7Ci0gIGludCBsZW4gPSBzdHJsZW4ocmVnaW9uKSArIDE7Ci0gIGlmIChsZW4gPiByZWdpb25MZW5ndGhfKSB7Ci0gICAgaWYgKHJlZ2lvbl8pIGZyZWUocmVnaW9uXyk7Ci0gICAgcmVnaW9uTGVuZ3RoXyA9IGxlbjsKLSAgICByZWdpb25fID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICB9Ci0gIHN0cmNweShyZWdpb25fLCBkZWZEYXRhLT5ERUZDQVNFKHJlZ2lvbikpOwotICBoYXNSZWdpb25OYW1lXyA9IDE7Ci0KLX0KLQotCi12b2lkIGRlZmlHcm91cDo6c2V0TWF4WChpbnQgeCkgewotICBoYXNNYXhYXyA9IDE7Ci0gIG1heFhfID0geDsKLX0KLQotCi12b2lkIGRlZmlHcm91cDo6c2V0TWF4WShpbnQgeSkgewotICBoYXNNYXhZXyA9IDE7Ci0gIG1heFlfID0geTsKLX0KLQotCi12b2lkIGRlZmlHcm91cDo6c2V0UGVyaW0oaW50IHApIHsKLSAgaGFzUGVyaW1fID0gMTsKLSAgcGVyaW1fID0gcDsKLX0KLQotCi12b2lkIGRlZmlHcm91cDo6YWRkUHJvcGVydHkoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciB0eXBlKSB7Ci0gIGludCBsZW47Ci0gIGlmIChudW1Qcm9wc18gPT0gcHJvcHNBbGxvY2F0ZWRfKSB7Ci0gICAgaW50IGk7Ci0gICAgY2hhcioqICBubjsKLSAgICBjaGFyKiogIG52OwotICAgIGRvdWJsZSogbmQ7Ci0gICAgY2hhciogICBudDsKLQotICAgIHByb3BzQWxsb2NhdGVkXyAqPSAyOwotICAgIG5uID0gKGNoYXIqKiltYWxsb2Moc2l6ZW9mKGNoYXIqKSpwcm9wc0FsbG9jYXRlZF8pOwotICAgIG52ID0gKGNoYXIqKiltYWxsb2Moc2l6ZW9mKGNoYXIqKSpwcm9wc0FsbG9jYXRlZF8pOwotICAgIG5kID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpKnByb3BzQWxsb2NhdGVkXyk7Ci0gICAgbnQgPSAoY2hhciopbWFsbG9jKHNpemVvZihjaGFyKSpwcm9wc0FsbG9jYXRlZF8pOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1Qcm9wc187IGkrKykgewotICAgICAgbm5baV0gPSBwcm9wTmFtZXNfW2ldOwotICAgICAgbnZbaV0gPSBwcm9wVmFsdWVzX1tpXTsKLSAgICAgIG5kW2ldID0gcHJvcERWYWx1ZXNfW2ldOwotICAgICAgbnRbaV0gPSBwcm9wVHlwZXNfW2ldOwotICAgIH0KLSAgICBmcmVlKChjaGFyKikocHJvcE5hbWVzXykpOwotICAgIGZyZWUoKGNoYXIqKShwcm9wVmFsdWVzXykpOwotICAgIGZyZWUoKGNoYXIqKShwcm9wRFZhbHVlc18pKTsKLSAgICBmcmVlKChjaGFyKikocHJvcFR5cGVzXykpOwotICAgIHByb3BOYW1lc18gPSBubjsKLSAgICBwcm9wVmFsdWVzXyA9IG52OwotICAgIHByb3BEVmFsdWVzXyA9IG5kOwotICAgIHByb3BUeXBlc18gPSBudDsKLSAgfQotICBsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotICBwcm9wTmFtZXNfW251bVByb3BzX10gPSAoY2hhciopbWFsbG9jKGxlbik7Ci0gIHN0cmNweShwcm9wTmFtZXNfW251bVByb3BzX10sIGRlZkRhdGEtPkRFRkNBU0UobmFtZSkpOwotICBsZW4gPSBzdHJsZW4odmFsdWUpICsgMTsKLSAgcHJvcFZhbHVlc19bbnVtUHJvcHNfXSA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgc3RyY3B5KHByb3BWYWx1ZXNfW251bVByb3BzX10sIGRlZkRhdGEtPkRFRkNBU0UodmFsdWUpKTsKLSAgcHJvcERWYWx1ZXNfW251bVByb3BzX10gPSAwOwotICBwcm9wVHlwZXNfW251bVByb3BzX10gPSB0eXBlOwotICBudW1Qcm9wc18gKz0gMTsKLX0KLQotCi12b2lkIGRlZmlHcm91cDo6YWRkTnVtUHJvcGVydHkoY29uc3QgY2hhciogbmFtZSwgY29uc3QgZG91YmxlIGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFsdWUsIGNvbnN0IGNoYXIgdHlwZSkgewotICBpbnQgbGVuOwotICBpZiAobnVtUHJvcHNfID09IHByb3BzQWxsb2NhdGVkXykgewotICAgIGludCBpOwotICAgIGNoYXIqKiAgbm47Ci0gICAgY2hhcioqICBudjsKLSAgICBkb3VibGUqIG5kOwotICAgIGNoYXIqICAgbnQ7Ci0KLSAgICBwcm9wc0FsbG9jYXRlZF8gKj0gMjsKLSAgICBubiA9IChjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikqcHJvcHNBbGxvY2F0ZWRfKTsKLSAgICBudiA9IChjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikqcHJvcHNBbGxvY2F0ZWRfKTsKLSAgICBuZCA9IChkb3VibGUqKW1hbGxvYyhzaXplb2YoZG91YmxlKSpwcm9wc0FsbG9jYXRlZF8pOwotICAgIG50ID0gKGNoYXIqKW1hbGxvYyhzaXplb2YoY2hhcikqcHJvcHNBbGxvY2F0ZWRfKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUHJvcHNfOyBpKyspIHsKLSAgICAgIG5uW2ldID0gcHJvcE5hbWVzX1tpXTsKLSAgICAgIG52W2ldID0gcHJvcFZhbHVlc19baV07Ci0gICAgICBuZFtpXSA9IHByb3BEVmFsdWVzX1tpXTsKLSAgICAgIG50W2ldID0gcHJvcFR5cGVzX1tpXTsKLSAgICB9Ci0gICAgZnJlZSgoY2hhciopKHByb3BOYW1lc18pKTsKLSAgICBmcmVlKChjaGFyKikocHJvcFZhbHVlc18pKTsKLSAgICBmcmVlKChjaGFyKikocHJvcERWYWx1ZXNfKSk7Ci0gICAgZnJlZSgoY2hhciopKHByb3BUeXBlc18pKTsKLSAgICBwcm9wTmFtZXNfID0gbm47Ci0gICAgcHJvcFZhbHVlc18gPSBudjsKLSAgICBwcm9wRFZhbHVlc18gPSBuZDsKLSAgICBwcm9wVHlwZXNfID0gbnQ7Ci0gIH0KLSAgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLSAgcHJvcE5hbWVzX1tudW1Qcm9wc19dID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICBzdHJjcHkocHJvcE5hbWVzX1tudW1Qcm9wc19dLCBkZWZEYXRhLT5ERUZDQVNFKG5hbWUpKTsKLSAgbGVuID0gc3RybGVuKHZhbHVlKSArIDE7Ci0gIHByb3BWYWx1ZXNfW251bVByb3BzX10gPSAoY2hhciopbWFsbG9jKGxlbik7Ci0gIHN0cmNweShwcm9wVmFsdWVzX1tudW1Qcm9wc19dLCBkZWZEYXRhLT5ERUZDQVNFKHZhbHVlKSk7Ci0gIHByb3BEVmFsdWVzX1tudW1Qcm9wc19dID0gZDsKLSAgcHJvcFR5cGVzX1tudW1Qcm9wc19dID0gdHlwZTsKLSAgbnVtUHJvcHNfICs9IDE7Ci19Ci0KLQotaW50IGRlZmlHcm91cDo6bnVtUHJvcHMoKSBjb25zdCB7Ci0gIHJldHVybiBudW1Qcm9wc187Ci19Ci0KLQotY29uc3QgY2hhciogZGVmaUdyb3VwOjpwcm9wTmFtZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgY2hhciBtc2dbMTYwXTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1Qcm9wc18pIHsKLSAgICAgc3ByaW50ZiAobXNnLCAiRVJST1IgKExFRlBBUlMtNjA1MCk6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBHUk9VUCBQUk9QRVJUWSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bVByb3BzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MDUwLCBtc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gcHJvcE5hbWVzX1tpbmRleF07Ci19Ci0KLQotY29uc3QgY2hhciogZGVmaUdyb3VwOjpwcm9wVmFsdWUoaW50IGluZGV4KSBjb25zdCB7Ci0gIGNoYXIgbXNnWzE2MF07Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtUHJvcHNfKSB7Ci0gICAgIHNwcmludGYgKG1zZywgIkVSUk9SIChMRUZQQVJTLTYwNTApOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgR1JPVVAgUFJPUEVSVFkgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGluZGV4LCBudW1Qcm9wc18pOwotICAgICBkZWZpRXJyb3IoMCwgNjA1MCwgbXNnLCBkZWZEYXRhKTsKLSAgICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIHByb3BWYWx1ZXNfW2luZGV4XTsKLX0KLQotCi1kb3VibGUgZGVmaUdyb3VwOjpwcm9wTnVtYmVyKGludCBpbmRleCkgY29uc3QgewotICBjaGFyIG1zZ1sxNjBdOwotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVByb3BzXykgewotICAgICBzcHJpbnRmIChtc2csICJFUlJPUiAoTEVGUEFSUy02MDUwKTogVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIEdST1VQIFBST1BFUlRZIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQiLCBpbmRleCwgbnVtUHJvcHNfKTsKLSAgICAgZGVmaUVycm9yKDAsIDYwNTAsIG1zZywgZGVmRGF0YSk7Ci0gICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBwcm9wRFZhbHVlc19baW5kZXhdOwotfQotCi0KLWNvbnN0IGNoYXIgZGVmaUdyb3VwOjpwcm9wVHlwZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgY2hhciBtc2dbMTYwXTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1Qcm9wc18pIHsKLSAgICAgc3ByaW50ZiAobXNnLCAiRVJST1IgKExFRlBBUlMtNjA1MCk6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBHUk9VUCBQUk9QRVJUWSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bVByb3BzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MDUwLCBtc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gcHJvcFR5cGVzX1tpbmRleF07Ci19Ci0KLQotaW50IGRlZmlHcm91cDo6cHJvcElzTnVtYmVyKGludCBpbmRleCkgY29uc3QgewotICBjaGFyIG1zZ1sxNjBdOwotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVByb3BzXykgewotICAgICBzcHJpbnRmIChtc2csICJFUlJPUiAoTEVGUEFSUy02MDUwKTogVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIEdST1VQIFBST1BFUlRZIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQiLCBpbmRleCwgbnVtUHJvcHNfKTsKLSAgICAgZGVmaUVycm9yKDAsIDYwNTAsIG1zZywgZGVmRGF0YSk7Ci0gICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBwcm9wRFZhbHVlc19baW5kZXhdID8gMSA6IDA7Ci19Ci0KLQotaW50IGRlZmlHcm91cDo6cHJvcElzU3RyaW5nKGludCBpbmRleCkgY29uc3QgewotICBjaGFyIG1zZ1sxNjBdOwotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVByb3BzXykgewotICAgICBzcHJpbnRmIChtc2csICJFUlJPUiAoTEVGUEFSUy02MDUwKTogVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIEdST1VQIFBST1BFUlRZIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQiLCBpbmRleCwgbnVtUHJvcHNfKTsKLSAgICAgZGVmaUVycm9yKDAsIDYwNTAsIG1zZywgZGVmRGF0YSk7Ci0gICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBwcm9wRFZhbHVlc19baW5kZXhdID8gMCA6IDE7Ci19Ci0KLQotY29uc3QgY2hhciogZGVmaUdyb3VwOjpyZWdpb25OYW1lKCkgY29uc3QgewotICByZXR1cm4gcmVnaW9uXzsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpR3JvdXA6Om5hbWUoKSBjb25zdCB7Ci0gIHJldHVybiBuYW1lXzsKLX0KLQotCi1pbnQgZGVmaUdyb3VwOjpwZXJpbSgpIGNvbnN0IHsKLSAgcmV0dXJuIHBlcmltXzsKLX0KLQotCi1pbnQgZGVmaUdyb3VwOjptYXhYKCkgY29uc3QgewotICByZXR1cm4gbWF4WF87Ci19Ci0KLQotaW50IGRlZmlHcm91cDo6bWF4WSgpIGNvbnN0IHsKLSAgcmV0dXJuIG1heFlfOwotfQotCi0KLWludCBkZWZpR3JvdXA6Omhhc01heFgoKSBjb25zdCB7Ci0gIHJldHVybiBoYXNNYXhYXzsKLX0KLQotCi1pbnQgZGVmaUdyb3VwOjpoYXNNYXhZKCkgY29uc3QgewotICByZXR1cm4gaGFzTWF4WV87Ci19Ci0KLQotaW50IGRlZmlHcm91cDo6aGFzUGVyaW0oKSBjb25zdCB7Ci0gIHJldHVybiBoYXNQZXJpbV87Ci19Ci0KLQotaW50IGRlZmlHcm91cDo6aGFzUmVnaW9uQm94KCkgY29uc3QgewotICByZXR1cm4gbnVtUmVjdHNfID8gMSA6IDAgOwotfQotCi0KLWludCBkZWZpR3JvdXA6Omhhc1JlZ2lvbk5hbWUoKSBjb25zdCB7Ci0gIHJldHVybiBoYXNSZWdpb25OYW1lXzsKLX0KLQotCi12b2lkIGRlZmlHcm91cDo6cHJpbnQoRklMRSogZikgY29uc3QgewotICBpbnQgaTsKLQotICBmcHJpbnRmKGYsICJHcm91cCAnJXMnXG4iLCBuYW1lKCkpOwotCi0gIGlmIChoYXNSZWdpb25OYW1lKCkpIHsKLSAgICBmcHJpbnRmKGYsICIgIHJlZ2lvbiBuYW1lICclcydcbiIsIHJlZ2lvbk5hbWUoKSk7Ci0gIH0KLQotICBpZiAoaGFzUmVnaW9uQm94KCkpIHsKLSAgICBpbnQgc2l6ZSA9IG51bVJlY3RzXzsKLSAgICBpbnQqIHhsID0geGxfOwotICAgIGludCogeWwgPSB5bF87Ci0gICAgaW50KiB4aCA9IHhoXzsKLSAgICBpbnQqIHloID0geWhfOwotICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICBmcHJpbnRmKGYsICIgIHJlZ2lvbiBib3ggJWQsJWQgJWQsJWRcbiIsIHhsW2ldLCB5bFtpXSwgeGhbaV0sIHloW2ldKTsKLSAgfQotCi0gIGlmIChoYXNNYXhYKCkpIHsKLSAgICBmcHJpbnRmKGYsICIgIG1heCB4ICVkXG4iLCBtYXhYKCkpOwotICB9Ci0KLSAgaWYgKGhhc01heFkoKSkgewotICAgIGZwcmludGYoZiwgIiAgbWF4IHkgJWRcbiIsIG1heFkoKSk7Ci0gIH0KLQotICBpZiAoaGFzUGVyaW0oKSkgewotICAgIGZwcmludGYoZiwgIiAgcGVyaW0gJWRcbiIsIHBlcmltKCkpOwotICB9Ci0KLX0KLQotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpR3JvdXAuaHBwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpR3JvdXAuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzVkYTJjLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaUdyb3VwLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2lmbmRlZiBkZWZpR3JvdXBfaAotI2RlZmluZSBkZWZpR3JvdXBfaAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJkZWZpS1JEZWZzLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotY2xhc3MgZGVmckRhdGE7Ci0KLS8vIFN0cnVjdCBob2xkcyB0aGUgZGF0YSBmb3Igb25lIHByb3BlcnR5LgotCi1jbGFzcyBkZWZpR3JvdXAgewotcHVibGljOgotICBkZWZpR3JvdXAoZGVmckRhdGEgKmRhdGEpOwotICB2b2lkIEluaXQoKTsKLQotICB2b2lkIERlc3Ryb3koKTsKLSAgfmRlZmlHcm91cCgpOwotCi0gIHZvaWQgY2xlYXIoKTsKLQotICB2b2lkIHNldHVwKGNvbnN0IGNoYXIqIG5hbWUpOwotICB2b2lkIGFkZFByb3BlcnR5KGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHZhbHVlLCBjb25zdCBjaGFyIHR5cGUpOwotICB2b2lkIGFkZE51bVByb3BlcnR5KGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGRvdWJsZSBkLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhbHVlLCBjb25zdCBjaGFyIHR5cGUpOwotICB2b2lkIGFkZFJlZ2lvblJlY3QoaW50IHhsLCBpbnQgeWwsIGludCB4aCwgaW50IHloKTsKLSAgdm9pZCBzZXRSZWdpb25OYW1lKGNvbnN0IGNoYXIqIG5hbWUpOwotICB2b2lkIHNldE1heFgoaW50IHgpOwotICB2b2lkIHNldE1heFkoaW50IHkpOwotICB2b2lkIHNldFBlcmltKGludCBwKTsKLQotICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIHJlZ2lvbk5hbWUoKSBjb25zdDsKLSAgaW50IGhhc1JlZ2lvbkJveCgpIGNvbnN0OwotICBpbnQgaGFzUmVnaW9uTmFtZSgpIGNvbnN0OwotICBpbnQgaGFzTWF4WCgpIGNvbnN0OwotICBpbnQgaGFzTWF4WSgpIGNvbnN0OwotICBpbnQgaGFzUGVyaW0oKSBjb25zdDsKLSAgdm9pZCByZWdpb25SZWN0cyhpbnQqIHNpemUsIGludCoqIHhsLCBpbnQqKnlsLCBpbnQqKiB4aCwgaW50KiogeWgpIGNvbnN0OwotICBpbnQgbWF4WCgpIGNvbnN0OwotICBpbnQgbWF4WSgpIGNvbnN0OwotICBpbnQgcGVyaW0oKSBjb25zdDsKLQotICBpbnQgbnVtUHJvcHMoKSBjb25zdDsKLSAgY29uc3QgY2hhciogIHByb3BOYW1lKGludCBpbmRleCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqICBwcm9wVmFsdWUoaW50IGluZGV4KSBjb25zdDsKLSAgZG91YmxlIHByb3BOdW1iZXIoaW50IGluZGV4KSBjb25zdDsKLSAgY29uc3QgY2hhciAgIHByb3BUeXBlKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCAgICBwcm9wSXNOdW1iZXIoaW50IGluZGV4KSBjb25zdDsKLSAgaW50ICAgIHByb3BJc1N0cmluZyhpbnQgaW5kZXgpIGNvbnN0OwotCi0gIC8vIGRlYnVnIHByaW50Ci0gIHZvaWQgcHJpbnQoRklMRSogZikgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgY2hhciogbmFtZV87Ci0gIGludCBuYW1lTGVuZ3RoXzsKLSAgY2hhciogcmVnaW9uXzsKLSAgaW50IHJlZ2lvbkxlbmd0aF87Ci0KLSAgaW50IHJlY3RzQWxsb2NhdGVkXzsKLSAgaW50IG51bVJlY3RzXzsKLSAgaW50KiB4bF87Ci0gIGludCogeWxfOwotICBpbnQqIHhoXzsKLSAgaW50KiB5aF87Ci0KLSAgaW50IG1heFhfOwotICBpbnQgbWF4WV87Ci0gIGludCBwZXJpbV87Ci0gIGNoYXIgaGFzUmVnaW9uQm94XzsKLSAgY2hhciBoYXNSZWdpb25OYW1lXzsKLSAgY2hhciBoYXNQZXJpbV87Ci0gIGNoYXIgaGFzTWF4WF87Ci0gIGNoYXIgaGFzTWF4WV87Ci0KLSAgaW50IG51bVByb3BzXzsKLSAgaW50IHByb3BzQWxsb2NhdGVkXzsKLSAgY2hhcioqICBwcm9wTmFtZXNfOwotICBjaGFyKiogIHByb3BWYWx1ZXNfOwotICBkb3VibGUqIHByb3BEVmFsdWVzXzsKLSAgY2hhciogICBwcm9wVHlwZXNfOwotCi0gIGRlZnJEYXRhICpkZWZEYXRhOwotfTsKLQotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotVVNFX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpSU9UaW1pbmcuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpSU9UaW1pbmcuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzNiMDNmLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaUlPVGltaW5nLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQyNCArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEzIC0gMjAxNSwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlICJsZXguaCIKLSNpbmNsdWRlICJkZWZpSU9UaW1pbmcuaHBwIgotI2luY2x1ZGUgImRlZmlEZWJ1Zy5ocHAiCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyAgIGRlZmlJT1RpbWluZwotLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCi1kZWZpSU9UaW1pbmc6OmRlZmlJT1RpbWluZyhkZWZyRGF0YSAqZGF0YSkKLSA6IGRlZkRhdGEoZGF0YSkKLXsKLSAgSW5pdCgpOwotfQotCi0KLXZvaWQgZGVmaUlPVGltaW5nOjpJbml0KCkgewotICBpbnN0XyA9IDA7Ci0gIGluc3RMZW5ndGhfID0gMDsKLSAgcGluXyA9IDA7Ci0gIHBpbkxlbmd0aF8gPSAwOwotICBmcm9tXyA9IDA7Ci0gIGZyb21MZW5ndGhfID0gMDsKLSAgdG9fID0gMDsKLSAgdG9MZW5ndGhfID0gMDsKLSAgZHJpdmVDZWxsXyA9IDA7Ci0gIGRyaXZlQ2VsbExlbmd0aF8gPSAwOwotICBoYXNWYXJpYWJsZVJpc2VfID0gMDsKLSAgaGFzVmFyaWFibGVGYWxsXyA9IDA7Ci0gIGhhc1NsZXdSaXNlXyA9IDA7Ci0gIGhhc1NsZXdGYWxsXyA9IDA7Ci0gIGhhc0NhcGFjaXRhbmNlXyA9IDA7Ci0gIGhhc0RyaXZlQ2VsbF8gPSAwOwotICBoYXNGcm9tXyA9IDA7Ci0gIGlmIChwaW5fKSBmcmVlKHBpbl8pOwotICBwaW5fID0gMDsKLSAgcGluTGVuZ3RoXyA9IDA7Ci0KLSAgaGFzVG9fID0gMDsKLSAgaGFzUGFyYWxsZWxfID0gMDsKLSAgdmFyaWFibGVGYWxsTWluXyA9IDAuMDsKLSAgdmFyaWFibGVSaXNlTWluXyA9IDAuMDsKLSAgdmFyaWFibGVGYWxsTWF4XyA9IDAuMDsKLSAgdmFyaWFibGVSaXNlTWF4XyA9IDAuMDsKLSAgc2xld0ZhbGxNaW5fID0gMC4wOwotICBzbGV3UmlzZU1pbl8gPSAwLjA7Ci0gIHNsZXdGYWxsTWF4XyA9IDAuMDsKLSAgc2xld1Jpc2VNYXhfID0gMC4wOwotICBjYXBhY2l0YW5jZV8gPSAwLjA7Ci0gIHBhcmFsbGVsXyA9IDAuMDsKLX0KLQotCi1kZWZpSU9UaW1pbmc6On5kZWZpSU9UaW1pbmcoKSB7Ci0gIERlc3Ryb3koKTsKLX0KLQotCi12b2lkIGRlZmlJT1RpbWluZzo6RGVzdHJveSgpIHsKLQotICBpZiAoaW5zdF8pIGZyZWUoaW5zdF8pOwotICBpbnN0XyA9IDA7Ci0gIGluc3RMZW5ndGhfID0gMDsKLQotICBpZiAocGluXykgZnJlZShwaW5fKTsKLSAgcGluXyA9IDA7Ci0gIHBpbkxlbmd0aF8gPSAwOwotCi0gIGlmIChmcm9tXykgZnJlZShmcm9tXyk7Ci0gIGZyb21fID0gMDsKLSAgZnJvbUxlbmd0aF8gPSAwOwotCi0gIGlmICh0b18pIGZyZWUodG9fKTsKLSAgdG9fID0gMDsKLSAgdG9MZW5ndGhfID0gMDsKLQotICBpZiAoZHJpdmVDZWxsXykgZnJlZShkcml2ZUNlbGxfKTsKLSAgZHJpdmVDZWxsXyA9IDA7Ci0gIGRyaXZlQ2VsbExlbmd0aF8gPSAwOwotCi0gIGNsZWFyKCk7Ci19Ci0KLQotdm9pZCBkZWZpSU9UaW1pbmc6OmNsZWFyKCkgewotICBoYXNWYXJpYWJsZVJpc2VfID0gMDsKLSAgaGFzVmFyaWFibGVGYWxsXyA9IDA7Ci0gIGhhc1NsZXdSaXNlXyA9IDA7Ci0gIGhhc1NsZXdGYWxsXyA9IDA7Ci0gIGhhc0NhcGFjaXRhbmNlXyA9IDA7Ci0gIGhhc0RyaXZlQ2VsbF8gPSAwOwotICBoYXNGcm9tXyA9IDA7Ci0gIGhhc1RvXyA9IDA7Ci0gIGhhc1BhcmFsbGVsXyA9IDA7Ci0gIHZhcmlhYmxlRmFsbE1pbl8gPSAwLjA7Ci0gIHZhcmlhYmxlUmlzZU1pbl8gPSAwLjA7Ci0gIHZhcmlhYmxlRmFsbE1heF8gPSAwLjA7Ci0gIHZhcmlhYmxlUmlzZU1heF8gPSAwLjA7Ci0gIHNsZXdGYWxsTWluXyA9IDAuMDsKLSAgc2xld1Jpc2VNaW5fID0gMC4wOwotICBzbGV3RmFsbE1heF8gPSAwLjA7Ci0gIHNsZXdSaXNlTWF4XyA9IDAuMDsKLSAgY2FwYWNpdGFuY2VfID0gMC4wOwotICBwYXJhbGxlbF8gPSAwLjA7Ci19Ci0KLQotdm9pZCBkZWZpSU9UaW1pbmc6OnNldE5hbWUoY29uc3QgY2hhciogaW5zdCwgY29uc3QgY2hhciogcGluKSB7Ci0gIGludCBsZW47Ci0KLSAgY2xlYXIoKTsKLQotICBsZW4gPSBzdHJsZW4oaW5zdCkgKyAxOwotICBpZiAobGVuID4gaW5zdExlbmd0aF8pIHsKLSAgICBpZiAoaW5zdF8pIGZyZWUoaW5zdF8pOwotICAgIGluc3RMZW5ndGhfID0gbGVuOwotICAgIGluc3RfID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICB9Ci0gIHN0cmNweShpbnN0XywgZGVmRGF0YS0+REVGQ0FTRShpbnN0KSk7Ci0KLSAgbGVuID0gc3RybGVuKHBpbikgKyAxOwotICBpZiAobGVuID4gcGluTGVuZ3RoXykgewotICAgIGlmIChwaW5fKSBmcmVlKHBpbl8pOwotICAgIHBpbkxlbmd0aF8gPSBsZW47Ci0gICAgcGluXyA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgfQotICBzdHJjcHkocGluXywgZGVmRGF0YS0+REVGQ0FTRShwaW4pKTsKLQotfQotCi0KLXZvaWQgZGVmaUlPVGltaW5nOjpwcmludChGSUxFKiBmKSBjb25zdCB7Ci0gIGZwcmludGYoZiwgIklPVGltaW5nICclcycgJyVzJ1xuIiwgaW5zdF8sIHBpbl8pOwotCi0gIGlmIChoYXNTbGV3UmlzZSgpKQotICAgIGZwcmludGYoZiwgIiAgU2xldyByaXNlICAlNS4yZiAlNS4yZlxuIiwKLSAgICAgICBzbGV3UmlzZU1pbigpLAotICAgICAgIHNsZXdSaXNlTWF4KCkpOwotCi0gIGlmIChoYXNTbGV3RmFsbCgpKQotICAgIGZwcmludGYoZiwgIiAgU2xldyBmYWxsICAlNS4yZiAlNS4yZlxuIiwKLSAgICAgICBzbGV3RmFsbE1pbigpLAotICAgICAgIHNsZXdGYWxsTWF4KCkpOwotCi0gIGlmIChoYXNWYXJpYWJsZVJpc2UoKSkKLSAgICBmcHJpbnRmKGYsICIgIHZhcmlhYmxlIHJpc2UgICU1LjJmICU1LjJmXG4iLAotICAgICAgIHZhcmlhYmxlUmlzZU1pbigpLAotICAgICAgIHZhcmlhYmxlUmlzZU1heCgpKTsKLQotICBpZiAoaGFzVmFyaWFibGVGYWxsKCkpCi0gICAgZnByaW50ZihmLCAiICB2YXJpYWJsZSBmYWxsICAlNS4yZiAlNS4yZlxuIiwKLSAgICAgICB2YXJpYWJsZUZhbGxNaW4oKSwKLSAgICAgICB2YXJpYWJsZUZhbGxNYXgoKSk7Ci0KLSAgaWYgKGhhc0NhcGFjaXRhbmNlKCkpCi0gICAgZnByaW50ZihmLCAiICBjYXBhY2l0YW5jZSAlNS4yZlxuIiwKLSAgICAgICBjYXBhY2l0YW5jZSgpKTsKLQotICBpZiAoaGFzRHJpdmVDZWxsKCkpCi0gICAgZnByaW50ZihmLCAiICBkcml2ZSBjZWxsICclcydcbiIsCi0gICAgICAgZHJpdmVDZWxsKCkpOwotCi0gIGlmIChoYXNGcm9tKCkpCi0gICAgZnByaW50ZihmLCAiICBmcm9tIHBpbiAnJXMnXG4iLAotICAgICAgIGZyb20oKSk7Ci0KLSAgaWYgKGhhc1RvKCkpCi0gICAgZnByaW50ZihmLCAiICB0byBwaW4gJyVzJ1xuIiwKLSAgICAgICB0bygpKTsKLQotICBpZiAoaGFzUGFyYWxsZWwoKSkKLSAgICBmcHJpbnRmKGYsICIgIHBhcmFsbGVsICU1LjJmXG4iLAotICAgICAgIHBhcmFsbGVsKCkpOwotfQotCi0KLQotdm9pZCBkZWZpSU9UaW1pbmc6OnNldFZhcmlhYmxlKGNvbnN0IGNoYXIqIHJpc2VGYWxsLCBkb3VibGUgbWluLCBkb3VibGUgbWF4KSB7Ci0gIGlmICgqcmlzZUZhbGwgPT0gJ1InKSB7Ci0gICAgaGFzVmFyaWFibGVSaXNlXyA9IDE7Ci0gICAgdmFyaWFibGVSaXNlTWluXyA9IG1pbjsKLSAgICB2YXJpYWJsZVJpc2VNYXhfID0gbWF4OwotCi0gIH0gZWxzZSBpZiAoKnJpc2VGYWxsID09ICdGJykgewotICAgIGhhc1ZhcmlhYmxlRmFsbF8gPSAxOwotICAgIHZhcmlhYmxlRmFsbE1pbl8gPSBtaW47Ci0gICAgdmFyaWFibGVGYWxsTWF4XyA9IG1heDsKLQotICB9IGVsc2UgewotICAgIGRlZmlFcnJvcigwLCA2MDYwLCAiRVJST1IgKERFRlBBUlMtNjA2MCk6IEludmFsaWQgdmFsdWUgc3BlY2lmaWVkIGZvciBJT1RJTUlORyByaXNlL2ZhbGwuIFRoZSB2YWxpZCB2YWx1ZSBmb3IgcmlzZSBpcyAnUicgYW5kIGZvciBmYWxsIGlzICdGJy4gU3BlY2lmeSBhIHZhbGlkIHZhbHVlIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLCBkZWZEYXRhKTsKLSAgfQotfQotCi0KLXZvaWQgZGVmaUlPVGltaW5nOjpzZXRTbGV3UmF0ZShjb25zdCBjaGFyKiByaXNlRmFsbCwgZG91YmxlIG1pbiwgZG91YmxlIG1heCkgewotICBpZiAoKnJpc2VGYWxsID09ICdSJykgewotICAgIGhhc1NsZXdSaXNlXyA9IDE7Ci0gICAgc2xld1Jpc2VNaW5fID0gbWluOwotICAgIHNsZXdSaXNlTWF4XyA9IG1heDsKLQotICB9IGVsc2UgaWYgKCpyaXNlRmFsbCA9PSAnRicpIHsKLSAgICBoYXNTbGV3RmFsbF8gPSAxOwotICAgIHNsZXdGYWxsTWluXyA9IG1pbjsKLSAgICBzbGV3RmFsbE1heF8gPSBtYXg7Ci0KLSAgfSBlbHNlIHsKLSAgICBkZWZpRXJyb3IoMCwgNjA2MCwgIkVSUk9SIChERUZQQVJTLTYwNjApOiBJbnZhbGlkIHZhbHVlIHNwZWNpZmllZCBmb3IgSU9USU1JTkcgcmlzZS9mYWxsLiBUaGUgdmFsaWQgdmFsdWUgZm9yIHJpc2UgaXMgJ1InIGFuZCBmb3IgZmFsbCBpcyAnRicuIFNwZWNpZnkgYSB2YWxpZCB2YWx1ZSBhbmQgdGhlbiB0cnkgYWdhaW4uIiwgZGVmRGF0YSk7Ci0gIH0KLX0KLQotCi12b2lkIGRlZmlJT1RpbWluZzo6c2V0Q2FwYWNpdGFuY2UoZG91YmxlIG51bSkgewotICBoYXNDYXBhY2l0YW5jZV8gPSAxOwotICBjYXBhY2l0YW5jZV8gPSBudW07Ci19Ci0KLQotdm9pZCBkZWZpSU9UaW1pbmc6OnNldERyaXZlQ2VsbChjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIGludCBsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotCi0gIGlmIChkcml2ZUNlbGxMZW5ndGhfIDwgbGVuKSB7Ci0gICAgaWYgKGRyaXZlQ2VsbF8pIGZyZWUoZHJpdmVDZWxsXyk7Ci0gICAgZHJpdmVDZWxsXyA9IChjaGFyKikgbWFsbG9jKGxlbik7Ci0gICAgZHJpdmVDZWxsTGVuZ3RoXyA9IGxlbjsKLSAgfQotCi0gIHN0cmNweShkcml2ZUNlbGxfLCBkZWZEYXRhLT5ERUZDQVNFKG5hbWUpKTsKLSAgaGFzRHJpdmVDZWxsXyA9IDE7Ci19Ci0KLQotdm9pZCBkZWZpSU9UaW1pbmc6OnNldEZyb20oY29uc3QgY2hhciogbmFtZSkgewotICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLQotICBpZiAoZnJvbUxlbmd0aF8gPCBsZW4pIHsKLSAgICBpZiAoZnJvbV8pIGZyZWUoZnJvbV8pOwotICAgIGZyb21fID0gKGNoYXIqKSBtYWxsb2MobGVuKTsKLSAgICBmcm9tTGVuZ3RoXyA9IGxlbjsKLSAgfQotCi0gIHN0cmNweShmcm9tXywgZGVmRGF0YS0+REVGQ0FTRShuYW1lKSk7Ci0gIGhhc0Zyb21fID0gMTsKLX0KLQotCi12b2lkIGRlZmlJT1RpbWluZzo6c2V0VG8oY29uc3QgY2hhciogbmFtZSkgewotICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLQotICBpZiAodG9MZW5ndGhfIDwgbGVuKSB7Ci0gICAgaWYgKHRvXykgZnJlZSh0b18pOwotICAgIHRvXyA9IChjaGFyKikgbWFsbG9jKGxlbik7Ci0gICAgdG9MZW5ndGhfID0gbGVuOwotICB9Ci0KLSAgc3RyY3B5KHRvXywgZGVmRGF0YS0+REVGQ0FTRShuYW1lKSk7Ci0gIGhhc1RvXyA9IDE7Ci19Ci0KLQotdm9pZCBkZWZpSU9UaW1pbmc6OnNldFBhcmFsbGVsKGRvdWJsZSBudW0pIHsKLSAgaGFzUGFyYWxsZWxfID0gMTsKLSAgcGFyYWxsZWxfID0gbnVtOwotfQotCi0KLWludCBkZWZpSU9UaW1pbmc6Omhhc1ZhcmlhYmxlUmlzZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGhhc1ZhcmlhYmxlUmlzZV87Ci19Ci0KLQotaW50IGRlZmlJT1RpbWluZzo6aGFzVmFyaWFibGVGYWxsKCkgY29uc3QgewotICByZXR1cm4gaGFzVmFyaWFibGVGYWxsXzsKLX0KLQotCi1pbnQgZGVmaUlPVGltaW5nOjpoYXNTbGV3UmlzZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGhhc1NsZXdSaXNlXzsKLX0KLQotCi1pbnQgZGVmaUlPVGltaW5nOjpoYXNTbGV3RmFsbCgpIGNvbnN0IHsKLSAgcmV0dXJuIGhhc1NsZXdGYWxsXzsKLX0KLQotCi1pbnQgZGVmaUlPVGltaW5nOjpoYXNDYXBhY2l0YW5jZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGhhc0NhcGFjaXRhbmNlXzsKLX0KLQotCi1pbnQgZGVmaUlPVGltaW5nOjpoYXNEcml2ZUNlbGwoKSBjb25zdCB7Ci0gIHJldHVybiBoYXNEcml2ZUNlbGxfOwotfQotCi0KLWludCBkZWZpSU9UaW1pbmc6Omhhc0Zyb20oKSBjb25zdCB7Ci0gIHJldHVybiBoYXNGcm9tXzsKLX0KLQotCi1pbnQgZGVmaUlPVGltaW5nOjpoYXNUbygpIGNvbnN0IHsKLSAgcmV0dXJuIGhhc1RvXzsKLX0KLQotCi1pbnQgZGVmaUlPVGltaW5nOjpoYXNQYXJhbGxlbCgpIGNvbnN0IHsKLSAgcmV0dXJuIGhhc1BhcmFsbGVsXzsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpSU9UaW1pbmc6Omluc3QoKSBjb25zdCB7Ci0gIHJldHVybiBpbnN0XzsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpSU9UaW1pbmc6OnBpbigpIGNvbnN0IHsKLSAgcmV0dXJuIHBpbl87Ci19Ci0KLQotZG91YmxlIGRlZmlJT1RpbWluZzo6dmFyaWFibGVGYWxsTWluKCkgY29uc3QgewotICByZXR1cm4gdmFyaWFibGVGYWxsTWluXzsKLX0KLQotCi1kb3VibGUgZGVmaUlPVGltaW5nOjp2YXJpYWJsZVJpc2VNaW4oKSBjb25zdCB7Ci0gIHJldHVybiB2YXJpYWJsZVJpc2VNaW5fOwotfQotCi0KLWRvdWJsZSBkZWZpSU9UaW1pbmc6OnZhcmlhYmxlRmFsbE1heCgpIGNvbnN0IHsKLSAgcmV0dXJuIHZhcmlhYmxlRmFsbE1heF87Ci19Ci0KLQotZG91YmxlIGRlZmlJT1RpbWluZzo6dmFyaWFibGVSaXNlTWF4KCkgY29uc3QgewotICByZXR1cm4gdmFyaWFibGVSaXNlTWF4XzsKLX0KLQotCi1kb3VibGUgZGVmaUlPVGltaW5nOjpzbGV3RmFsbE1pbigpIGNvbnN0IHsKLSAgcmV0dXJuIHNsZXdGYWxsTWluXzsKLX0KLQotCi1kb3VibGUgZGVmaUlPVGltaW5nOjpzbGV3UmlzZU1pbigpIGNvbnN0IHsKLSAgcmV0dXJuIHNsZXdSaXNlTWluXzsKLX0KLQotCi1kb3VibGUgZGVmaUlPVGltaW5nOjpzbGV3RmFsbE1heCgpIGNvbnN0IHsKLSAgcmV0dXJuIHNsZXdGYWxsTWF4XzsKLX0KLQotCi1kb3VibGUgZGVmaUlPVGltaW5nOjpzbGV3UmlzZU1heCgpIGNvbnN0IHsKLSAgcmV0dXJuIHNsZXdSaXNlTWF4XzsKLX0KLQotCi1kb3VibGUgZGVmaUlPVGltaW5nOjpjYXBhY2l0YW5jZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGNhcGFjaXRhbmNlXzsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpSU9UaW1pbmc6OmRyaXZlQ2VsbCgpIGNvbnN0IHsKLSAgcmV0dXJuIGRyaXZlQ2VsbF87Ci19Ci0KLQotY29uc3QgY2hhciogZGVmaUlPVGltaW5nOjpmcm9tKCkgY29uc3QgewotICByZXR1cm4gZnJvbV87Ci19Ci0KLQotY29uc3QgY2hhciogZGVmaUlPVGltaW5nOjp0bygpIGNvbnN0IHsKLSAgcmV0dXJuIHRvXzsKLX0KLQotCi1kb3VibGUgZGVmaUlPVGltaW5nOjpwYXJhbGxlbCgpIGNvbnN0IHsKLSAgcmV0dXJuIHBhcmFsbGVsXzsKLX0KLQotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpSU9UaW1pbmcuaHBwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpSU9UaW1pbmcuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWFjNmUyLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaUlPVGltaW5nLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2lmbmRlZiBkZWZpSU9UaW1pbmdfaAotI2RlZmluZSBkZWZpSU9UaW1pbmdfaAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJkZWZpS1JEZWZzLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotY2xhc3MgZGVmckRhdGE7Ci0KLWNsYXNzIGRlZmlJT1RpbWluZyB7Ci1wdWJsaWM6Ci0gIGRlZmlJT1RpbWluZyhkZWZyRGF0YSAqZGF0YSk7Ci0gIHZvaWQgSW5pdCgpOwotCi0gIHZvaWQgRGVzdHJveSgpOwotICB+ZGVmaUlPVGltaW5nKCk7Ci0KLSAgdm9pZCBjbGVhcigpOwotCi0gIHZvaWQgc2V0TmFtZShjb25zdCBjaGFyKiBpbnN0LCBjb25zdCBjaGFyKiBwaW4pOwotICB2b2lkIHNldFZhcmlhYmxlKGNvbnN0IGNoYXIqIHJpc2VGYWxsLCBkb3VibGUgbWluLCBkb3VibGUgbWF4KTsKLSAgdm9pZCBzZXRTbGV3UmF0ZShjb25zdCBjaGFyKiByaXNlRmFsbCwgZG91YmxlIG1pbiwgZG91YmxlIG1heCk7Ci0gIHZvaWQgc2V0Q2FwYWNpdGFuY2UoZG91YmxlIG51bSk7Ci0gIHZvaWQgc2V0RHJpdmVDZWxsKGNvbnN0IGNoYXIqIG5hbWUpOwotICB2b2lkIHNldEZyb20oY29uc3QgY2hhciogbmFtZSk7Ci0gIHZvaWQgc2V0VG8oY29uc3QgY2hhciogbmFtZSk7Ci0gIHZvaWQgc2V0UGFyYWxsZWwoZG91YmxlIG51bSk7Ci0KLQotICBpbnQgaGFzVmFyaWFibGVSaXNlKCkgY29uc3Q7Ci0gIGludCBoYXNWYXJpYWJsZUZhbGwoKSBjb25zdDsKLSAgaW50IGhhc1NsZXdSaXNlKCkgY29uc3Q7Ci0gIGludCBoYXNTbGV3RmFsbCgpIGNvbnN0OwotICBpbnQgaGFzQ2FwYWNpdGFuY2UoKSBjb25zdDsKLSAgaW50IGhhc0RyaXZlQ2VsbCgpIGNvbnN0OwotICBpbnQgaGFzRnJvbSgpIGNvbnN0OwotICBpbnQgaGFzVG8oKSBjb25zdDsKLSAgaW50IGhhc1BhcmFsbGVsKCkgY29uc3Q7Ci0KLSAgY29uc3QgY2hhciogaW5zdCgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBwaW4oKSBjb25zdDsKLSAgZG91YmxlIHZhcmlhYmxlRmFsbE1pbigpIGNvbnN0OwotICBkb3VibGUgdmFyaWFibGVSaXNlTWluKCkgY29uc3Q7Ci0gIGRvdWJsZSB2YXJpYWJsZUZhbGxNYXgoKSBjb25zdDsKLSAgZG91YmxlIHZhcmlhYmxlUmlzZU1heCgpIGNvbnN0OwotICBkb3VibGUgc2xld0ZhbGxNaW4oKSBjb25zdDsKLSAgZG91YmxlIHNsZXdSaXNlTWluKCkgY29uc3Q7Ci0gIGRvdWJsZSBzbGV3RmFsbE1heCgpIGNvbnN0OwotICBkb3VibGUgc2xld1Jpc2VNYXgoKSBjb25zdDsKLSAgZG91YmxlIGNhcGFjaXRhbmNlKCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIGRyaXZlQ2VsbCgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBmcm9tKCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIHRvKCkgY29uc3Q7Ci0gIGRvdWJsZSBwYXJhbGxlbCgpIGNvbnN0OwotCi0gIC8vIGRlYnVnIHByaW50Ci0gIHZvaWQgcHJpbnQoRklMRSogZikgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgY2hhciogaW5zdF87Ci0gIGludCBpbnN0TGVuZ3RoXzsKLSAgY2hhciogcGluXzsKLSAgaW50IHBpbkxlbmd0aF87Ci0gIGNoYXIqIGZyb21fOwotICBpbnQgZnJvbUxlbmd0aF87Ci0gIGNoYXIqIHRvXzsKLSAgaW50IHRvTGVuZ3RoXzsKLSAgY2hhciogZHJpdmVDZWxsXzsKLSAgY2hhciBkcml2ZUNlbGxMZW5ndGhfOwotICBjaGFyIGhhc1ZhcmlhYmxlUmlzZV87Ci0gIGNoYXIgaGFzVmFyaWFibGVGYWxsXzsKLSAgY2hhciBoYXNTbGV3UmlzZV87Ci0gIGNoYXIgaGFzU2xld0ZhbGxfOwotICBjaGFyIGhhc0NhcGFjaXRhbmNlXzsKLSAgY2hhciBoYXNEcml2ZUNlbGxfOwotICBjaGFyIGhhc0Zyb21fOwotICBjaGFyIGhhc1RvXzsKLSAgY2hhciBoYXNQYXJhbGxlbF87Ci0gIGRvdWJsZSB2YXJpYWJsZUZhbGxNaW5fOwotICBkb3VibGUgdmFyaWFibGVSaXNlTWluXzsKLSAgZG91YmxlIHZhcmlhYmxlRmFsbE1heF87Ci0gIGRvdWJsZSB2YXJpYWJsZVJpc2VNYXhfOwotICBkb3VibGUgc2xld0ZhbGxNaW5fOwotICBkb3VibGUgc2xld1Jpc2VNaW5fOwotICBkb3VibGUgc2xld0ZhbGxNYXhfOwotICBkb3VibGUgc2xld1Jpc2VNYXhfOwotICBkb3VibGUgY2FwYWNpdGFuY2VfOwotICBkb3VibGUgcGFyYWxsZWxfOwotCi0gIGRlZnJEYXRhICpkZWZEYXRhOwotfTsKLQotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotVVNFX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpS1JEZWZzLmhwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaUtSRGVmcy5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YTM3MTIuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpS1JEZWZzLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaWZuZGVmIGRlZmlLUkRFRlNfaAotI2RlZmluZSBkZWZpS1JERUZTX2gKLQotI2RlZmluZSBCRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRSBuYW1lc3BhY2UgTGVmRGVmUGFyc2VyIHsKLSNkZWZpbmUgRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFIH0KLSNkZWZpbmUgVVNFX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFIHVzaW5nIG5hbWVzcGFjZSBMZWZEZWZQYXJzZXI7Ci0KLSNlbmRpZiAvKiBkZWZpS1JERUZTX2ggKi8KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaU1pc2MuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpTWlzYy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMzFiOGYuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpTWlzYy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMyAtIDIwMTUsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJsZXguaCIKLSNpbmNsdWRlICJkZWZpRGVidWcuaHBwIgotI2luY2x1ZGUgImRlZmlNaXNjLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vICAgIEhhbmRsZSBwb2ludHMgZm9yIGEgcG9seWdvbgotLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLWRlZmlHZW9tZXRyaWVzOjpkZWZpR2VvbWV0cmllcyhkZWZyRGF0YSAqZGF0YSkKLSA6IGRlZkRhdGEoZGF0YSkKLXsKLSAgICBwb2ludHNBbGxvY2F0ZWRfID0gMDsKLSAgICBudW1Qb2ludHNfID0gMDsKLX0KLQotdm9pZCBkZWZpR2VvbWV0cmllczo6SW5pdCgpIHsKLSAgICBEZXN0cm95KCk7Ci19Ci0KLXZvaWQgZGVmaUdlb21ldHJpZXM6OkRlc3Ryb3koKSB7Ci0gIGlmIChwb2ludHNBbGxvY2F0ZWRfKSB7Ci0gICAgZnJlZSgoY2hhciopKHhfKSk7Ci0gICAgZnJlZSgoY2hhciopKHlfKSk7Ci0gIH0KLSAgcG9pbnRzQWxsb2NhdGVkXyA9IDA7Ci0gIG51bVBvaW50c18gPSAwOwotfQotCi1kZWZpR2VvbWV0cmllczo6fmRlZmlHZW9tZXRyaWVzKCkgewotICBEZXN0cm95KCk7Ci19Ci0KLXZvaWQgZGVmaUdlb21ldHJpZXM6OlJlc2V0KCkgewotICBudW1Qb2ludHNfID0gMDsKLX0KLQotdm9pZCBkZWZpR2VvbWV0cmllczo6c3RhcnRMaXN0KGludCB4LCBpbnQgeSkgewotICBpZiAocG9pbnRzQWxsb2NhdGVkXyA9PSAwKSB7Ci0gICAgcG9pbnRzQWxsb2NhdGVkXyA9IDE2OwotICAgIHhfID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKjE2KTsKLSAgICB5XyA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSoxNik7Ci0gICAgbnVtUG9pbnRzXyA9IDA7Ci0gIH0gZWxzZSAgIC8vIHJlc2V0IHRoZSBudW1Qb2ludHMgdG8gMAotICAgIG51bVBvaW50c18gPSAwOwotICBhZGRUb0xpc3QoeCwgeSk7Ci19Ci0KLXZvaWQgZGVmaUdlb21ldHJpZXM6OmFkZFRvTGlzdChpbnQgeCwgaW50IHkpIHsKLSAgaWYgKG51bVBvaW50c18gPT0gcG9pbnRzQWxsb2NhdGVkXykgewotICAgIGludCBpOwotICAgIGludCogbng7Ci0gICAgaW50KiBueTsKLSAgICBwb2ludHNBbGxvY2F0ZWRfICo9IDI7Ci0gICAgbnggPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkqcG9pbnRzQWxsb2NhdGVkXyk7Ci0gICAgbnkgPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkqcG9pbnRzQWxsb2NhdGVkXyk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bVBvaW50c187IGkrKykgewotICAgICAgbnhbaV0gPSB4X1tpXTsKLSAgICAgIG55W2ldID0geV9baV07Ci0gICAgfQotICAgIGZyZWUoKGNoYXIqKSh4XykpOwotICAgIGZyZWUoKGNoYXIqKSh5XykpOwotICAgIHhfID0gbng7Ci0gICAgeV8gPSBueTsKLSAgfQotICB4X1tudW1Qb2ludHNfXSA9IHg7Ci0gIHlfW251bVBvaW50c19dID0geTsKLSAgbnVtUG9pbnRzXyArPSAxOwotfQotCi1pbnQgZGVmaUdlb21ldHJpZXM6Om51bVBvaW50cygpIGNvbnN0IHsKLSAgcmV0dXJuIG51bVBvaW50c187Ci19Ci0KLXZvaWQgZGVmaUdlb21ldHJpZXM6OnBvaW50cyhpbnQgaW5kZXgsIGludCogeCwgaW50KiB5KSBjb25zdCB7Ci0gIGNoYXIgbXNnWzE2MF07Ci0gIGlmICgoaW5kZXggPCAwKSB8fCAoaW5kZXggPj0gbnVtUG9pbnRzXykpIHsKLSAgICAgc3ByaW50ZiAobXNnLCAiRVJST1IgKExFRlBBUlMtNjA3MCk6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIEdFT01FVFJZIFBPSU5UUyBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bVBvaW50c18pOwotICAgICBkZWZpRXJyb3IoMCwgNjA3MCwgbXNnLCBkZWZEYXRhKTsKLSAgICAgcmV0dXJuOwotICB9Ci0gICp4ID0geF9baW5kZXhdOwotICAqeSA9IHlfW2luZGV4XTsKLSAgcmV0dXJuOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gICAgZGVmaVN0eWxlcwotLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotZGVmaVN0eWxlczo6ZGVmaVN0eWxlcygpIHsKLSAgSW5pdCgpOwotfQotCi12b2lkIGRlZmlTdHlsZXM6OkluaXQoKSB7Ci0gIHN0eWxlTnVtXyA9IDA7Ci0gIHBvbHlnb25fID0gMDsKLX0KLQotZGVmaVN0eWxlczo6fmRlZmlTdHlsZXMoKSB7Ci0gIERlc3Ryb3koKTsKLX0KLQotdm9pZCBkZWZpU3R5bGVzOjpEZXN0cm95KCkgewotIGNsZWFyKCk7Ci19Ci0KLXZvaWQgZGVmaVN0eWxlczo6Y2xlYXIoKSB7Ci0gIHN0cnVjdCBkZWZpUG9pbnRzKiBwOwotCi0gIHAgPSBwb2x5Z29uXzsKLSAgaWYgKHApIHsKLSAgICBmcmVlKChjaGFyKikocC0+eCkpOwotICAgIGZyZWUoKGNoYXIqKShwLT55KSk7Ci0gICAgZnJlZSgoY2hhciopKHBvbHlnb25fKSk7Ci0gIH0KLSAgc3R5bGVOdW1fID0gMDsKLSAgcG9seWdvbl8gPSAwOwotfQotCi12b2lkIGRlZmlTdHlsZXM6OnNldFN0eWxlKGludCBzdHlsZU51bSkgewotICBzdHlsZU51bV8gPSBzdHlsZU51bTsKLX0KLQotdm9pZCBkZWZpU3R5bGVzOjpzZXRQb2x5Z29uKGRlZmlHZW9tZXRyaWVzKiBnZW9tKSB7Ci0gIHN0cnVjdCBkZWZpUG9pbnRzKiBwOwotICBpbnQgaSwgeCwgeTsKLQotICBpZiAocG9seWdvbl8gPT0gMCkgewotICAgIHAgPSAoc3RydWN0IGRlZmlQb2ludHMqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGRlZmlQb2ludHMpKTsKLSAgICBwLT5udW1Qb2ludHMgPSBnZW9tLT5udW1Qb2ludHMoKTsKLSAgICBwLT54ID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKnAtPm51bVBvaW50cyk7Ci0gICAgcC0+eSA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSpwLT5udW1Qb2ludHMpOwotICAgIG51bVBvaW50QWxsb2NfID0gcC0+bnVtUG9pbnRzOyAvLyBrZWVwIHRyYWNrIHRoZSBtYXggbnVtYmVyIHB0cwotICB9IGVsc2UgaWYgKG51bVBvaW50QWxsb2NfIDwgZ2VvbS0+bnVtUG9pbnRzKCkpIHsKLSAgICAvLyB0aGUgaW5jb21pbmcgcG9seWdvbiBoYXMgbW9yZSBudW1iZXIgdGhlbiBoYXMgYmVlbiBhbGxvY2F0ZWQsCi0gICAgLy8gbmVlZCB0byByZWFsbG9jYXRlIG1vcmUgbWVtb3J5Ci0gICAgcCA9IHBvbHlnb25fOwotICAgIGZyZWUoKGNoYXIqKShwLT54KSk7Ci0gICAgZnJlZSgoY2hhciopKHAtPnkpKTsKLSAgICBwLT5udW1Qb2ludHMgPSBnZW9tLT5udW1Qb2ludHMoKTsKLSAgICBwLT54ID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKnAtPm51bVBvaW50cyk7Ci0gICAgcC0+eSA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSpwLT5udW1Qb2ludHMpOwotICAgIG51bVBvaW50QWxsb2NfID0gcC0+bnVtUG9pbnRzOyAvLyBrZWVwIHRyYWNrIHRoZSBtYXggbnVtYmVyIHB0cwotICB9IGVsc2UgewotICAgIHAgPSBwb2x5Z29uXzsKLSAgICBwLT5udW1Qb2ludHMgPSBnZW9tLT5udW1Qb2ludHMoKTsKLSAgfQotICBmb3IgKGkgPSAwOyBpIDwgcC0+bnVtUG9pbnRzOyBpKyspIHsKLSAgICBnZW9tLT5wb2ludHMoaSwgJngsICZ5KTsKLSAgICBwLT54W2ldID0geDsKLSAgICBwLT55W2ldID0geTsKLSAgfQotICBwb2x5Z29uXyA9IHA7Ci19Ci0KLWludCBkZWZpU3R5bGVzOjpzdHlsZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHN0eWxlTnVtXzsKLX0KLQotc3RydWN0IGRlZmlQb2ludHMgZGVmaVN0eWxlczo6Z2V0UG9seWdvbigpIGNvbnN0IHsKLSAgcmV0dXJuICoocG9seWdvbl8pOwotfQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaU1pc2MuaHBwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpTWlzYy5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZmQ3Y2YuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpTWlzYy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2lmbmRlZiBkZWZpTWlzY19oCi0jZGVmaW5lIGRlZmlNaXNjX2gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiZGVmaUtSRGVmcy5ocHAiCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLWNsYXNzIGRlZnJEYXRhOwotCi1zdHJ1Y3QgZGVmaVBvaW50cyB7Ci0gIGludCBudW1Qb2ludHM7Ci0gIGludCogeDsKLSAgaW50KiB5OwotfTsKLQotY2xhc3MgZGVmaUdlb21ldHJpZXMgewotcHVibGljOgotICBkZWZpR2VvbWV0cmllcyhkZWZyRGF0YSAqZGF0YSk7Ci0gIHZvaWQgSW5pdCgpOwotICB2b2lkIFJlc2V0KCk7Ci0KLSAgdm9pZCBEZXN0cm95KCk7Ci0gIH5kZWZpR2VvbWV0cmllcygpOwotCi0gIHZvaWQgc3RhcnRMaXN0KGludCB4LCBpbnQgeSk7Ci0gIHZvaWQgYWRkVG9MaXN0KGludCB4LCBpbnQgeSk7Ci0KLSAgaW50ICBudW1Qb2ludHMoKSBjb25zdDsKLSAgdm9pZCBwb2ludHMoaW50IGluZGV4LCBpbnQqIHgsIGludCogeSkgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgaW50IG51bVBvaW50c187Ci0gIGludCBwb2ludHNBbGxvY2F0ZWRfOwotICBpbnQqIHhfOwotICBpbnQqIHlfOwotCi0gIGRlZnJEYXRhICpkZWZEYXRhOwotfTsKLQotY2xhc3MgZGVmaVN0eWxlcyB7Ci1wdWJsaWM6Ci0gIGRlZmlTdHlsZXMoKTsKLSAgdm9pZCBJbml0KCk7Ci0KLSAgdm9pZCBEZXN0cm95KCk7Ci0gIH5kZWZpU3R5bGVzKCk7Ci0KLSAgdm9pZCBjbGVhcigpOwotCi0gIHZvaWQgc2V0U3R5bGUoaW50IHN0eWxlTnVtKTsKLSAgdm9pZCBzZXRQb2x5Z29uKGRlZmlHZW9tZXRyaWVzKiBnZW9tKTsKLQotICBpbnQgc3R5bGUoKSBjb25zdDsKLSAgc3RydWN0IGRlZmlQb2ludHMgZ2V0UG9seWdvbigpIGNvbnN0OwotCi0gIHByb3RlY3RlZDoKLSAgICBpbnQgICAgc3R5bGVOdW1fOwotICAgIHN0cnVjdCBkZWZpUG9pbnRzKiBwb2x5Z29uXzsKLSAgICBpbnQgICAgbnVtUG9pbnRBbGxvY187Ci19OwotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotVVNFX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpTmV0LmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaU5ldC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMjRmNTQuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpTmV0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMwMjIgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMy0yMDE3LCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGljZnRjbSAkCi0vLyAgJFJldmlzaW9uOiAjNCAkCi0vLyAgJERhdGU6IDIwMTcvMDkvMTQgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSAiZGVmaU5ldC5ocHAiCi0jaW5jbHVkZSAiZGVmaVBhdGguaHBwIgotI2luY2x1ZGUgImRlZmlEZWJ1Zy5ocHAiCi0jaW5jbHVkZSAibGV4LmgiCi0jaW5jbHVkZSAiZGVmaVV0aWwuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0jZGVmaW5lCW1heExpbWl0ICAgNjU1MzYKLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gICAgZGVmaVN1Ym5ldAotLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCi1kZWZpU3VibmV0OjpkZWZpU3VibmV0KGRlZnJEYXRhICpkYXRhKQotIDogZGVmRGF0YShkYXRhKQotewotICBJbml0KCk7Ci19Ci0KLQotdm9pZCBkZWZpU3VibmV0OjpJbml0KCkgewotICBuYW1lXyA9IDA7Ci0gIGJ1bXBOYW1lKDE2KTsKLQotICBpbnN0YW5jZXNfID0gMDsKLSAgcGluc18gPSAwOwotICBtdXN0c18gPSAwOwotICBzeW50aGVzaXplZF8gPSAwOwotICBudW1QaW5zXyA9IDA7Ci0gIGJ1bXBQaW5zKDE2KTsKLQotICAvLyBXTUQgLS0gdGhpcyB3aWxsIGJlIHJlbW92ZWQgYnkgdGhlIG5leHQgcmVsZWFzZQotICBwYXRoc18gPSAwOwotICBudW1QYXRoc18gPSAwOwotICBwYXRoc0FsbG9jYXRlZF8gPSAwOwotCi0gIG51bVdpcmVzXyA9IDA7Ci0gIHdpcmVzQWxsb2NhdGVkXyA9IDA7Ci0gIHdpcmVzXyA9IDA7Ci0gIG5vbkRlZmF1bHRSdWxlXyA9IDA7Ci0KLSAgY2xlYXIoKTsKLX0KLQotCi12b2lkIGRlZmlTdWJuZXQ6OkRlc3Ryb3koKSB7Ci0gIGNsZWFyKCk7Ci0gIGZyZWUobmFtZV8pOwotICBmcmVlKChjaGFyKikoaW5zdGFuY2VzXykpOwotICBmcmVlKChjaGFyKikocGluc18pKTsKLSAgZnJlZShtdXN0c18pOwotICBmcmVlKHN5bnRoZXNpemVkXyk7Ci0KLX0KLQotCi1kZWZpU3VibmV0Ojp+ZGVmaVN1Ym5ldCgpIHsKLSAgRGVzdHJveSgpOwotfQotCi0KLXZvaWQgZGVmaVN1Ym5ldDo6c2V0TmFtZShjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIGludCBsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotICBpZiAobGVuID4gbmFtZVNpemVfKSBidW1wTmFtZShsZW4pOwotICBzdHJjcHkobmFtZV8sIGRlZkRhdGEtPkRFRkNBU0UobmFtZSkpOwotfQotCi0KLXZvaWQgZGVmaVN1Ym5ldDo6c2V0Tm9uRGVmYXVsdChjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIGludCBsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotICBub25EZWZhdWx0UnVsZV8gPSAoY2hhciopbWFsbG9jKGxlbik7Ci0gIHN0cmNweShub25EZWZhdWx0UnVsZV8sIGRlZkRhdGEtPkRFRkNBU0UobmFtZSkpOwotfQotCi0gCi12b2lkIGRlZmlTdWJuZXQ6OmFkZE11c3RQaW4oY29uc3QgY2hhciogaW5zdGFuY2UsIGNvbnN0IGNoYXIqIHBpbiwgaW50IHN5bikgewotICBhZGRQaW4oaW5zdGFuY2UsIHBpbiwgc3luKTsKLSAgbXVzdHNfW251bVBpbnNfIC0gMV0gPSAxOwotfQotCi0KLXZvaWQgZGVmaVN1Ym5ldDo6YWRkUGluKGNvbnN0IGNoYXIqIGluc3RhbmNlLCBjb25zdCBjaGFyKiBwaW4sIGludCBzeW4pIHsKLSAgaW50IGxlbjsKLQotICBpZiAobnVtUGluc18gPT0gcGluc0FsbG9jYXRlZF8pCi0gICAgYnVtcFBpbnMocGluc0FsbG9jYXRlZF8gKiAyKTsKLQotICBsZW4gPSBzdHJsZW4oaW5zdGFuY2UpKyAxOwotICBpbnN0YW5jZXNfW251bVBpbnNfXSA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgc3RyY3B5KGluc3RhbmNlc19bbnVtUGluc19dLCBkZWZEYXRhLT5ERUZDQVNFKGluc3RhbmNlKSk7Ci0KLSAgbGVuID0gc3RybGVuKHBpbikrIDE7Ci0gIHBpbnNfW251bVBpbnNfXSA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgc3RyY3B5KHBpbnNfW251bVBpbnNfXSwgZGVmRGF0YS0+REVGQ0FTRShwaW4pKTsKLQotICBtdXN0c19bbnVtUGluc19dID0gMDsKLSAgc3ludGhlc2l6ZWRfW251bVBpbnNfXSA9IHN5bjsKLQotICAobnVtUGluc18pKys7Ci19Ci0KLS8vIFdNRCAtLSB0aGlzIHdpbGwgYmUgcmVtb3ZlZCBieSB0aGUgbmV4dCByZWxlYXNlCi12b2lkIGRlZmlTdWJuZXQ6OnNldFR5cGUoY29uc3QgY2hhciogdHlwKSB7Ci0gIGlmICgqdHlwID09ICdGJykgewotICAgIGlzRml4ZWRfID0gMTsKLSAgfSBlbHNlIGlmICgqdHlwID09ICdDJykgewotICAgIGlzQ292ZXJfID0gMTsKLSAgfSBlbHNlIGlmICgqdHlwID09ICdSJykgewotICAgIGlzUm91dGVkXyA9IDE7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gU2lsZW50bHkgZG8gbm90aGluZyB3aXRoIGJhZCBpbnB1dC4KLSAgfQotIAotfQotIAotLy8gV01EIC0tIHRoaXMgd2lsbCBiZSByZW1vdmVkIGJ5IHRoZSBuZXh0IHJlbGVhc2UKLXZvaWQgZGVmaVN1Ym5ldDo6YWRkUGF0aChkZWZpUGF0aCogcCwgaW50IHJlc2V0LCBpbnQgbmV0T3NuZXQsIGludCAqbmVlZENiaykgewotICBpbnQgaTsKLSAgc2l6ZV90IGluY051bWJlcjsKLQotICBpZiAocmVzZXQpIHsKLSAgICAgZm9yIChpID0gMDsgaSA8IG51bVBhdGhzXzsgaSsrKSB7Ci0gICAgICAgIGRlbGV0ZSBwYXRoc19baV07Ci0gICAgIH0gIAotICAgICBudW1QYXRoc18gPSAwOwotICB9IAotCi0gIGlmIChudW1QYXRoc18gPj0gcGF0aHNBbGxvY2F0ZWRfKSB7Ci0gICAgLy8gNi8xNy8yMDAzIC0gZG9uJ3Qgd2FudCB0byBhbGxvY2F0ZSB0b28gbGFyZ2UgbWVtb3J5IGp1c3QgaW4gY2FzZQotICAgIC8vIGEgbmV0IGhhcyBtYW55IHdpcmVzIHdpdGggb25seSAxIG9yIDIgcGF0aHMKLSAgICBpZiAocGF0aHNBbGxvY2F0ZWRfIDw9IG1heExpbWl0KSB7Ci0gICAgICAgIGluY051bWJlciA9IHBhdGhzQWxsb2NhdGVkXyoyOwotICAgICAgICBpZiAoaW5jTnVtYmVyID4gbWF4TGltaXQpIHsKLSAgICAgICAgICAgIGluY051bWJlciA9IHBhdGhzQWxsb2NhdGVkXyArIG1heExpbWl0OwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW5jTnVtYmVyID0gcGF0aHNBbGxvY2F0ZWRfICsgbWF4TGltaXQ7Ci0gICAgfQotCi0gICAgc3dpdGNoIChuZXRPc25ldCkgewotICAgICAgY2FzZSAyOiAKLSAgICAgICAgIGJ1bXBQYXRocygKLSAgICAgICAgICAgIHBhdGhzQWxsb2NhdGVkXyA/IGluY051bWJlciA6IDEwMDApOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICAgYnVtcFBhdGhzKAotICAgICAgICAgICAgcGF0aHNBbGxvY2F0ZWRfID8gaW5jTnVtYmVyIDogOCk7Ci0gICAgICAgICBicmVhazsKLSAgICAgfQotICB9Ci0gIAotICBwYXRoc19bbnVtUGF0aHNfKytdID0gbmV3IGRlZmlQYXRoKHApOwotICAKLSAgaWYgKG51bVBhdGhzXyA9PSBwYXRoc0FsbG9jYXRlZF8pCi0gICAgKm5lZWRDYmsgPSAxOyAgIC8vIHByZS13YXJuIHRoZSBwYXJzZXIgaXQgbmVlZHMgdG8gcmVhbGxvYyBuZXh0IHRpbWUKLX0KLQotCi12b2lkIGRlZmlTdWJuZXQ6OmFkZFdpcmUoY29uc3QgY2hhciogdHlwZSkgewotICBkZWZpV2lyZSogd2lyZTsKLSAgaWYgKG51bVdpcmVzXyA9PSB3aXJlc0FsbG9jYXRlZF8pIHsKLSAgICBkZWZpV2lyZSoqIGFycmF5OwotICAgIGludCBpOwotICAgIHdpcmVzQWxsb2NhdGVkXyA9IHdpcmVzQWxsb2NhdGVkXyA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lyZXNBbGxvY2F0ZWRfICogMiA6IDIgOwotICAgIGFycmF5ID0gKGRlZmlXaXJlKiopbWFsbG9jKHNpemVvZihkZWZpV2lyZSopKndpcmVzQWxsb2NhdGVkXyk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bVdpcmVzXzsgaSsrKSB7Ci0gICAgICBhcnJheVtpXSA9IHdpcmVzX1tpXTsKLSAgICB9Ci0gICAgaWYgKHdpcmVzXykgCi0gICAgICAgZnJlZSgoY2hhciopKHdpcmVzXykpOwotICAgIHdpcmVzXyA9IGFycmF5OwotICB9Ci0gIHdpcmUgPSB3aXJlc19bbnVtV2lyZXNfXSA9IG5ldyBkZWZpV2lyZShkZWZEYXRhKTsKLSAgbnVtV2lyZXNfICs9IDE7Ci0gIHdpcmUtPkluaXQodHlwZSwgTlVMTCk7Ci19Ci0KLQotdm9pZCBkZWZpU3VibmV0OjphZGRXaXJlUGF0aChkZWZpUGF0aCogcCwgaW50IHJlc2V0LCBpbnQgbmV0T3NuZXQsIGludCAqbmVlZENiaykgewotICBpZiAobnVtV2lyZXNfID4gMCkKLSAgICAgd2lyZXNfW251bVdpcmVzXy0xXS0+YWRkUGF0aChwLCByZXNldCwgbmV0T3NuZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRDYmspOwotICBlbHNlCi0gICAgIC8vIFNvbWV0aGluZyBzY3JldyB1cCwgY2FuJ3QgYmUgYm90aCBiZSB6ZXJvLgotICAgICBkZWZpRXJyb3IoMCwgNjA4MCwgIkVSUk9SIChERUZQQVJTLTYwODApOiBBbiBpbnRlcm5hbCBlcnJvciBoYXMgb2NjdXJyZWQuIFRoZSBpbmRleCBudW1iZXIgZm9yIHRoZSBTVUJORVQgd2lyZXMgYXJyYXkgaXMgbGVzcyB0aGVuIG9yIGVxdWFsIHRvIDAuXG5Db250YWN0IENhZGVuY2UgQ3VzdG9tZXIgU3VwcG9ydCB3aXRoIHRoaXMgZXJyb3IgaW5mb3JtYXRpb24uIiwgZGVmRGF0YSk7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlTdWJuZXQ6Om5hbWUoKSBjb25zdCB7Ci0gIHJldHVybiBuYW1lXzsKLX0KLQotCi1pbnQgZGVmaVN1Ym5ldDo6aGFzTm9uRGVmYXVsdFJ1bGUoKSBjb25zdCB7Ci0gIHJldHVybiBub25EZWZhdWx0UnVsZV8gPyAxIDogMDsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpU3VibmV0Ojpub25EZWZhdWx0UnVsZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG5vbkRlZmF1bHRSdWxlXzsKLX0KLQotCi1pbnQgZGVmaVN1Ym5ldDo6bnVtQ29ubmVjdGlvbnMoKSBjb25zdCB7Ci0gIHJldHVybiBudW1QaW5zXzsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpU3VibmV0OjppbnN0YW5jZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBudW1QaW5zXykKLSAgICByZXR1cm4gaW5zdGFuY2VzX1tpbmRleF07Ci0gIHJldHVybiAwOwotfQotCi0KLWNvbnN0IGNoYXIqIGRlZmlTdWJuZXQ6OnBpbihpbnQgaW5kZXgpIGNvbnN0IHsKLSAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBudW1QaW5zXykKLSAgICByZXR1cm4gcGluc19baW5kZXhdOwotICByZXR1cm4gMDsKLX0KLQotCi1pbnQgZGVmaVN1Ym5ldDo6cGluSXNNdXN0Sm9pbihpbnQgaW5kZXgpIGNvbnN0IHsKLSAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBudW1QaW5zXykKLSAgICByZXR1cm4gKGludCkobXVzdHNfW2luZGV4XSk7Ci0gIHJldHVybiAwOwotfQotCi0KLWludCBkZWZpU3VibmV0OjpwaW5Jc1N5bnRoZXNpemVkKGludCBpbmRleCkgY29uc3QgewotICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IG51bVBpbnNfKQotICAgIHJldHVybiAoaW50KShzeW50aGVzaXplZF9baW5kZXhdKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIFdNRCAtLSB0aGlzIHdpbGwgYmUgcmVtb3ZlZCBieSB0aGUgbmV4dCByZWxlYXNlCi1pbnQgZGVmaVN1Ym5ldDo6aXNGaXhlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIChpbnQpKGlzRml4ZWRfKTsKLX0KLSAKLSAKLS8vIFdNRCAtLSB0aGlzIHdpbGwgYmUgcmVtb3ZlZCBieSB0aGUgbmV4dCByZWxlYXNlCi1pbnQgZGVmaVN1Ym5ldDo6aXNSb3V0ZWQoKSBjb25zdCB7Ci0gIHJldHVybiAoaW50KShpc1JvdXRlZF8pOwotfQotIAotIAotLy8gV01EIC0tIHRoaXMgd2lsbCBiZSByZW1vdmVkIGJ5IHRoZSBuZXh0IHJlbGVhc2UKLWludCBkZWZpU3VibmV0Ojppc0NvdmVyKCkgY29uc3QgewotICByZXR1cm4gKGludCkoaXNDb3Zlcl8pOwotfQotCi0KLXZvaWQgZGVmaVN1Ym5ldDo6YnVtcE5hbWUobG9uZyBsb25nICBzaXplKSB7Ci0gIGlmIChuYW1lXykgZnJlZShuYW1lXyk7Ci0gIG5hbWVfID0gKGNoYXIqKW1hbGxvYyhzaXplKTsKLSAgbmFtZVNpemVfID0gc2l6ZTsKLSAgbmFtZV9bMF0gPSAnXDAnOwotfQotCi0KLXZvaWQgZGVmaVN1Ym5ldDo6YnVtcFBpbnMobG9uZyBsb25nIHNpemUpIHsKLSAgY2hhcioqIG5ld0luc3RhbmNlcyA9IChjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikqc2l6ZSk7Ci0gIGNoYXIqKiBuZXdQaW5zID0gKGNoYXIqKiltYWxsb2Moc2l6ZW9mKGNoYXIqKSpzaXplKTsKLSAgY2hhciogbmV3TXVzdHMgPSAoY2hhciopbWFsbG9jKHNpemUpOwotICBjaGFyKiBuZXdTeW4gPSAoY2hhciopbWFsbG9jKHNpemUpOwotICBsb25nIGxvbmcgaTsKLQotICBpZiAoaW5zdGFuY2VzXykgewotICAgIGZvciAoaSA9IDA7IGkgPCBwaW5zQWxsb2NhdGVkXzsgaSsrKSB7Ci0gICAgICBuZXdJbnN0YW5jZXNbaV0gPSBpbnN0YW5jZXNfW2ldOwotICAgICAgbmV3UGluc1tpXSA9IHBpbnNfW2ldOwotICAgICAgbmV3TXVzdHNbaV0gPSBtdXN0c19baV07Ci0gICAgICBuZXdTeW5baV0gPSBzeW50aGVzaXplZF9baV07Ci0gICAgfQotICAgIGZyZWUoKGNoYXIqKShpbnN0YW5jZXNfKSk7Ci0gICAgZnJlZSgoY2hhciopKHBpbnNfKSk7Ci0gICAgZnJlZShtdXN0c18pOwotICAgIGZyZWUoc3ludGhlc2l6ZWRfKTsKLSAgfQotCi0gIGluc3RhbmNlc18gPSBuZXdJbnN0YW5jZXM7Ci0gIHBpbnNfID0gbmV3UGluczsKLSAgbXVzdHNfID0gbmV3TXVzdHM7Ci0gIHN5bnRoZXNpemVkXyA9IG5ld1N5bjsKLSAgcGluc0FsbG9jYXRlZF8gPSBzaXplOwotfQotCi0KLXZvaWQgZGVmaVN1Ym5ldDo6Y2xlYXIoKSB7Ci0gIGludCBpOwotCi0gIC8vIFdNRCAtLSB0aGlzIHdpbGwgYmUgcmVtb3ZlZCBieSB0aGUgbmV4dCByZWxlYXNlCi0gIGlzRml4ZWRfID0gMDsKLSAgaXNSb3V0ZWRfID0gMDsKLSAgaXNDb3Zlcl8gPSAwOwotICBuYW1lX1swXSA9ICdcMCc7Ci0KLSAgZm9yIChpID0gMDsgaSA8IG51bVBpbnNfOyBpKyspIHsKLSAgICBmcmVlKGluc3RhbmNlc19baV0pOwotICAgIGZyZWUocGluc19baV0pOwotICAgIGluc3RhbmNlc19baV0gPSAwOwotICAgIHBpbnNfW2ldID0gMDsKLSAgICBtdXN0c19baV0gPSAwOwotICAgIHN5bnRoZXNpemVkX1tpXSA9IDA7Ci0gIH0KLSAgbnVtUGluc18gPSAwOwotCi0gIC8vIFdNRCAtLSB0aGlzIHdpbGwgYmUgcmVtb3ZlZCBieSB0aGUgbmV4dCByZWxlYXNlCi0gIGlmIChwYXRoc18pIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUGF0aHNfOyBpKyspIHsKLSAgICAgIGRlbGV0ZSBwYXRoc19baV07Ci0gICAgfQotICAgIGRlbGV0ZSBbXSBwYXRoc187Ci0gICAgcGF0aHNfID0gMDsKLSAgICBudW1QYXRoc18gPSAwOwotICAgIHBhdGhzQWxsb2NhdGVkXyA9IDA7Ci0gIH0KLQotICBpZiAobm9uRGVmYXVsdFJ1bGVfKSB7Ci0gICAgZnJlZShub25EZWZhdWx0UnVsZV8pOwotICAgIG5vbkRlZmF1bHRSdWxlXyA9IDA7Ci0gIH0KLQotICBpZiAobnVtV2lyZXNfKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bVdpcmVzXzsgaSsrKSB7Ci0gICAgICBkZWxldGUgd2lyZXNfW2ldOwotICAgICAgd2lyZXNfW2ldID0gMDsKLSAgICB9Ci0gICAgZnJlZSgoY2hhciopKHdpcmVzXykpOwotICAgIHdpcmVzXyA9IDA7Ci0gICAgbnVtV2lyZXNfID0gMDsKLSAgICB3aXJlc0FsbG9jYXRlZF8gPSAwOwotICB9Ci19Ci0KLQotdm9pZCBkZWZpU3VibmV0OjpwcmludChGSUxFKiBmKSBjb25zdCB7Ci0gIGludCBpLCBqOwotICBjb25zdCBkZWZpUGF0aCogcDsKLSAgY29uc3QgZGVmaVdpcmUqIHc7Ci0KLSAgZnByaW50ZihmLCAiIHN1Ym5ldCAnJXMnIiwgbmFtZV8pOwotICBmcHJpbnRmKGYsICJcbiIpOwotCi0gIGlmIChoYXNOb25EZWZhdWx0UnVsZSgpKQotICAgIGZwcmludGYoZiwgIiAgbm9uZGVmYXVsdCBydWxlICVzXG4iLAotICAgIG5vbkRlZmF1bHRSdWxlKCkpOwotCi0gIGlmIChudW1Db25uZWN0aW9ucygpKSB7Ci0gICAgZnByaW50ZihmLCAiICBQaW5zOlxuIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bUNvbm5lY3Rpb25zKCk7IGkrKykgewotICAgIGZwcmludGYoZiwgIiAgICclcycgJyVzJyVzJXNcbiIsIAotICAgICAgaW5zdGFuY2UoaSksCi0gICAgICBwaW4oaSksCi0gICAgICBwaW5Jc011c3RKb2luKGkpID8gIiBNVVNUSk9JTiIgOiAiIiwKLSAgICAgIHBpbklzU3ludGhlc2l6ZWQoaSkgPyAiIFNZTlRIRVNJWkVEIiA6ICIiKTsKLSAgICB9Ci0gIH0KLQotICBpZiAobnVtV2lyZXMoKSkgewotICAgIGZwcmludGYoZiwgIiAgUGF0aHM6XG4iKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtV2lyZXMoKTsgaSsrKSB7Ci0gICAgICB3ID0gd2lyZShpKTsKLSAgICAgIGZvciAoaiA9IDA7IGogPCB3LT5udW1QYXRocygpOyBqKyspIHsKLSAgICAgICAgIHAgPSB3LT5wYXRoKGopOwotICAgICAgICAgcC0+cHJpbnQoZik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLWludCBkZWZpU3VibmV0OjpudW1XaXJlcygpIGNvbnN0IHsKLSAgcmV0dXJuIG51bVdpcmVzXzsKLX0KLSAKLSAKLWRlZmlXaXJlKiBkZWZpU3VibmV0Ojp3aXJlKGludCBpbmRleCkgewotICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IG51bVdpcmVzXykKLSAgICByZXR1cm4gd2lyZXNfW2luZGV4XTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotY29uc3QgZGVmaVdpcmUqIGRlZmlTdWJuZXQ6OndpcmUoaW50IGluZGV4KSBjb25zdCB7Ci0gICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBudW1XaXJlc18pCi0gICAgICAgIHJldHVybiB3aXJlc19baW5kZXhdOwotICAgIHJldHVybiAwOwotfQotCi0KLS8vIFdNRCAtLSB0aGlzIHdpbGwgYmUgcmVtb3ZlZCBhZnRlciB0aGUgbmV4dCByZWxlYXNlCi1kZWZpUGF0aCogZGVmaVN1Ym5ldDo6cGF0aChpbnQgaW5kZXgpIHsKLSAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBudW1QYXRoc18pCi0gICAgcmV0dXJuIHBhdGhzX1tpbmRleF07Ci0gIHJldHVybiAwOwotfQotCi0vLyBXTUQgLS0gdGhpcyB3aWxsIGJlIHJlbW92ZWQgYWZ0ZXIgdGhlIG5leHQgcmVsZWFzZQotY29uc3QgZGVmaVBhdGgqIGRlZmlTdWJuZXQ6OnBhdGgoaW50IGluZGV4KSBjb25zdCB7Ci0gICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBudW1QYXRoc18pCi0gICAgICAgIHJldHVybiBwYXRoc19baW5kZXhdOwotICAgIHJldHVybiAwOwotfQotIAotLy8gV01EIC0tIHRoaXMgd2lsbCBiZSByZW1vdmVkIGFmdGVyIHRoZSBuZXh0IHJlbGVhc2UKLWludCBkZWZpU3VibmV0OjpudW1QYXRocygpIGNvbnN0IHsKLSAgcmV0dXJuIG51bVBhdGhzXzsKLX0KLSAKLS8vIFdNRCAtLSB0aGlzIHdpbGwgYmUgcmVtb3ZlZCBhZnRlciB0aGUgbmV4dCByZWxlYXNlCi12b2lkIGRlZmlTdWJuZXQ6OmJ1bXBQYXRocyhsb25nIGxvbmcgc2l6ZSkgewotICBsb25nIGxvbmcgaTsKLSAgZGVmaVBhdGgqKiBuZXdQYXRocyA9IG5ldyBkZWZpUGF0aCpbc2l6ZV07Ci0gCi0gIGZvciAoaSA9IDA7IGkgPCBudW1QYXRoc187IGkrKykKLSAgICBuZXdQYXRoc1tpXSA9IHBhdGhzX1tpXTsKLSAKLSAgcGF0aHNBbGxvY2F0ZWRfID0gc2l6ZTsKLQotICBkZWxldGUgW10gcGF0aHNfOwotICBwYXRoc18gPSBuZXdQYXRoczsKLX0KLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gICAgZGVmaVZwaW4KLS8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQotZGVmaVZwaW46OmRlZmlWcGluKGRlZnJEYXRhICpkYXRhKQotIDogZGVmRGF0YShkYXRhKQotewotfQotCi0KLXZvaWQgZGVmaVZwaW46OkluaXQoY29uc3QgY2hhciogbmFtZSkgewotICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLSAgbmFtZV8gPSAoY2hhciopbWFsbG9jKGxlbik7Ci0gIHN0cmNweShuYW1lXywgZGVmRGF0YS0+REVGQ0FTRShuYW1lKSk7Ci0gIG9yaWVudF8gPSAtMTsKLSAgc3RhdHVzXyA9ICcgJzsKLSAgbGF5ZXJfID0gMDsKLX0KLQotCi1kZWZpVnBpbjo6fmRlZmlWcGluKCkgewotICAgIERlc3Ryb3koKTsKLX0KLQotCi12b2lkIGRlZmlWcGluOjpEZXN0cm95KCkgewotICBmcmVlKG5hbWVfKTsKLSAgaWYgKGxheWVyXykgZnJlZShsYXllcl8pOwotfQotCi0KLXZvaWQgZGVmaVZwaW46OnNldEJvdW5kcyhpbnQgeGwsIGludCB5bCwgaW50IHhoLCBpbnQgeWgpIHsKLSAgeGxfID0geGw7Ci0gIHlsXyA9IHlsOwotICB4aF8gPSB4aDsKLSAgeWhfID0geWg7Ci19Ci0KLQotdm9pZCBkZWZpVnBpbjo6c2V0TGF5ZXIoY29uc3QgY2hhciogbGF5KSB7Ci0gIGludCBsZW4gPSBzdHJsZW4obGF5KSsxOwotICBsYXllcl8gPSAoY2hhciopbWFsbG9jKGxlbik7Ci0gIHN0cmNweShsYXllcl8sIGxheSk7Ci19Ci0KLQotdm9pZCBkZWZpVnBpbjo6c2V0T3JpZW50KGludCBvcmllbnQpIHsKLSAgb3JpZW50XyA9IG9yaWVudDsKLX0KLQotCi12b2lkIGRlZmlWcGluOjpzZXRMb2MoaW50IHgsIGludCB5KSB7Ci0gIHhMb2NfID0geDsKLSAgeUxvY18gPSB5OwotfQotCi0KLXZvaWQgZGVmaVZwaW46OnNldFN0YXR1cyhjaGFyIHN0KSB7Ci0gIHN0YXR1c18gPSBzdDsKLX0KLQotCi1pbnQgZGVmaVZwaW46OnhsKCkgY29uc3QgIHsKLSAgcmV0dXJuIHhsXzsKLX0KLQotCi1pbnQgZGVmaVZwaW46OnlsKCkgY29uc3QgIHsKLSAgcmV0dXJuIHlsXzsKLX0KLQotCi1pbnQgZGVmaVZwaW46OnhoKCkgY29uc3QgIHsKLSAgcmV0dXJuIHhoXzsKLX0KLQotCi1pbnQgZGVmaVZwaW46OnloKCkgY29uc3QgIHsKLSAgcmV0dXJuIHloXzsKLX0KLQotCi1jaGFyIGRlZmlWcGluOjpzdGF0dXMoKSBjb25zdCB7Ci0gIHJldHVybiBzdGF0dXNfOwotfQotCi0KLWludCBkZWZpVnBpbjo6b3JpZW50KCkgY29uc3QgIHsKLSAgcmV0dXJuIG9yaWVudF87Ci19Ci0KLQotY29uc3QgY2hhciogZGVmaVZwaW46Om9yaWVudFN0cigpIGNvbnN0ICB7Ci0gIHJldHVybiAoZGVmaU9yaWVudFN0cihvcmllbnRfKSk7Ci19Ci0KLQotaW50IGRlZmlWcGluOjp4TG9jKCkgY29uc3QgewotICByZXR1cm4geExvY187Ci19Ci0KLQotaW50IGRlZmlWcGluOjp5TG9jKCkgY29uc3QgewotICByZXR1cm4geUxvY187Ci19Ci0KLQotY29uc3QgY2hhciogZGVmaVZwaW46Om5hbWUoKSBjb25zdCB7Ci0gIHJldHVybiBuYW1lXzsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpVnBpbjo6bGF5ZXIoKSBjb25zdCB7Ci0gIHJldHVybiBsYXllcl87Ci19Ci0KLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gICAgZGVmaVNoaWVsZAotLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCi1kZWZpU2hpZWxkOjpkZWZpU2hpZWxkKGRlZnJEYXRhICpkYXRhKQotIDogZGVmRGF0YShkYXRhKQotewotfQotCi0KLXZvaWQgZGVmaVNoaWVsZDo6SW5pdChjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIGludCBsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotICBuYW1lXyA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgc3RyY3B5KG5hbWVfLCBkZWZEYXRhLT5ERUZDQVNFKG5hbWUpKTsKLSAgbnVtUGF0aHNfID0gMDsKLSAgcGF0aHNBbGxvY2F0ZWRfID0gMDsKLSAgcGF0aHNfID0gTlVMTDsKLX0KLQotCi12b2lkIGRlZmlTaGllbGQ6OkRlc3Ryb3koKSB7Ci0gIGNsZWFyKCk7Ci19Ci0KLQotZGVmaVNoaWVsZDo6fmRlZmlTaGllbGQoKSB7Ci0gIERlc3Ryb3koKTsKLX0KLQotCi12b2lkIGRlZmlTaGllbGQ6OmFkZFBhdGgoZGVmaVBhdGgqIHAsIGludCByZXNldCwgaW50IG5ldE9zbmV0LCBpbnQgKm5lZWRDYmspIHsKLSAgaW50IGk7Ci0gIHNpemVfdCBpbmNOdW1iZXI7Ci0KLSAgaWYgKHJlc2V0KSB7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBudW1QYXRoc187IGkrKykgewotICAgICAgICBkZWxldGUgcGF0aHNfW2ldOwotICAgICB9Ci0gICAgIG51bVBhdGhzXyA9IDA7Ci0gIH0KLSAgaWYgKG51bVBhdGhzXyA+PSBwYXRoc0FsbG9jYXRlZF8pIHsKLSAgICAvLyA2LzE3LzIwMDMgLSBkb24ndCB3YW50IHRvIGFsbG9jYXRlIHRvbyBsYXJnZSBtZW1vcnkganVzdCBpbiBjYXNlCi0gICAgLy8gYSBuZXQgaGFzIG1hbnkgd2lyZXMgd2l0aCBvbmx5IDEgb3IgMiBwYXRocwotCi0gICAgaWYgKHBhdGhzQWxsb2NhdGVkXyA8PSBtYXhMaW1pdCkgewotICAgICAgICBpbmNOdW1iZXIgPSBwYXRoc0FsbG9jYXRlZF8qMjsKLSAgICAgICAgaWYgKGluY051bWJlciA+IG1heExpbWl0KSB7Ci0gICAgICAgICAgICBpbmNOdW1iZXIgPSBwYXRoc0FsbG9jYXRlZF8gKyBtYXhMaW1pdDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGluY051bWJlciA9IHBhdGhzQWxsb2NhdGVkXyArIG1heExpbWl0OwotICAgIH0KLQotICAgIHN3aXRjaCAobmV0T3NuZXQpIHsKLSAgICAgIGNhc2UgMjoKLSAgICAgICAgYnVtcFBhdGhzKAotICAgICAgICAgICAgcGF0aHNBbGxvY2F0ZWRfID8gaW5jTnVtYmVyIDogMTAwMCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnVtcFBhdGhzKAotICAgICAgICAgICAgcGF0aHNBbGxvY2F0ZWRfID8gaW5jTnVtYmVyIDogOCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICBwYXRoc19bbnVtUGF0aHNfKytdID0gbmV3IGRlZmlQYXRoKHApOwotICBpZiAobnVtUGF0aHNfID09IHBhdGhzQWxsb2NhdGVkXykKLSAgICAqbmVlZENiayA9IDE7ICAgLy8gcHJlLXdhcm4gdGhlIHBhcnNlciBpdCBuZWVkcyB0byByZWFsbG9jIG5leHQgdGltZQotfQotCi0KLXZvaWQgZGVmaVNoaWVsZDo6Y2xlYXIoKSB7Ci0gIGludCAgICAgICBpOwotCi0gIGlmIChuYW1lXykgewotICAgIGZyZWUobmFtZV8pOwotICAgIG5hbWVfID0gMDsKLSAgfQotCi0gIGlmIChwYXRoc18pIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUGF0aHNfOyBpKyspIHsKLSAgICAgIGRlbGV0ZSBwYXRoc19baV07Ci0gICAgfQotCi0gICAgZGVsZXRlIFtdIHBhdGhzXzsKLQotICAgIHBhdGhzXyA9IDA7Ci0gICAgbnVtUGF0aHNfID0gMDsKLSAgICBwYXRoc0FsbG9jYXRlZF8gPSAwOwotICB9Ci19Ci0KLQotdm9pZCBkZWZpU2hpZWxkOjpidW1wUGF0aHMobG9uZyBsb25nIHNpemUpIHsKLSAgbG9uZyBsb25nIGk7Ci0KLSAgZGVmaVBhdGgqKiBuZXdQYXRocyA9IG5ldyBkZWZpUGF0aCpbc2l6ZV07Ci0KLSAgZm9yIChpID0gMDsgaSA8IG51bVBhdGhzXzsgaSsrKQotICAgIG5ld1BhdGhzW2ldID0gcGF0aHNfW2ldOwotCi0gIHBhdGhzQWxsb2NhdGVkXyA9IHNpemU7Ci0KLSAgZGVsZXRlIFtdIHBhdGhzXzsKLSAgCi0gIHBhdGhzXyA9IG5ld1BhdGhzOwotfQotCi0KLWludCBkZWZpU2hpZWxkOjpudW1QYXRocygpIGNvbnN0IHsKLSAgcmV0dXJuIG51bVBhdGhzXzsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpU2hpZWxkOjpzaGllbGROYW1lKCkgY29uc3QgewotICByZXR1cm4gbmFtZV87Ci19Ci0KLWRlZmlQYXRoKiBkZWZpU2hpZWxkOjpwYXRoKGludCBpbmRleCkgewotICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IG51bVBhdGhzXykKLSAgICByZXR1cm4gcGF0aHNfW2luZGV4XTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWNvbnN0IGRlZmlQYXRoKiBkZWZpU2hpZWxkOjpwYXRoKGludCBpbmRleCkgY29uc3QgewotICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgbnVtUGF0aHNfKQotICAgICAgICByZXR1cm4gcGF0aHNfW2luZGV4XTsKLSAgICByZXR1cm4gMDsKLX0KLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gICAgZGVmaVdpcmUKLS8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQotZGVmaVdpcmU6OmRlZmlXaXJlKGRlZnJEYXRhICpkYXRhKQotIDogZGVmRGF0YShkYXRhKQotewotfQotCi0KLXZvaWQgZGVmaVdpcmU6OkluaXQoY29uc3QgY2hhciogdHlwZSwgY29uc3QgY2hhciogd2lyZVNoaWVsZE5hbWUpIHsKLSAgaW50IGxlbiA9IHN0cmxlbih0eXBlKSArIDE7Ci0gIHR5cGVfID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICBzdHJjcHkodHlwZV8sIGRlZkRhdGEtPkRFRkNBU0UodHlwZSkpOwotICBpZiAod2lyZVNoaWVsZE5hbWUpIHsKLSAgICB3aXJlU2hpZWxkTmFtZV8gPSAoY2hhciopbWFsbG9jKHN0cmxlbih3aXJlU2hpZWxkTmFtZSkrMSk7Ci0gICAgc3RyY3B5KHdpcmVTaGllbGROYW1lXywgd2lyZVNoaWVsZE5hbWUpOwotICB9IGVsc2UKLSAgICB3aXJlU2hpZWxkTmFtZV8gPSAwOyAKLSAgbnVtUGF0aHNfID0gMDsKLSAgcGF0aHNBbGxvY2F0ZWRfID0gMDsKLSAgcGF0aHNfID0gMDsKLX0KLQotCi12b2lkIGRlZmlXaXJlOjpEZXN0cm95KCkgewotICBjbGVhcigpOwotfQotCi0KLWRlZmlXaXJlOjp+ZGVmaVdpcmUoKSB7Ci0gIERlc3Ryb3koKTsKLX0KLQotCi12b2lkIGRlZmlXaXJlOjphZGRQYXRoKGRlZmlQYXRoKiBwLCBpbnQgcmVzZXQsIGludCBuZXRPc25ldCwgaW50ICpuZWVkQ2JrKSB7Ci0gIGludCBpOwotICBzaXplX3QgaW5jTnVtYmVyOwotCi0gIGlmIChyZXNldCkgewotICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUGF0aHNfOyBpKyspIHsKLSAgICAgICAgZGVsZXRlIHBhdGhzX1tpXTsKLSAgICAgfQotICAgICBudW1QYXRoc18gPSAwOwotICB9Ci0gIGlmIChudW1QYXRoc18gPj0gcGF0aHNBbGxvY2F0ZWRfKSB7Ci0gICAgLy8gNi8xNy8yMDAzIC0gZG9uJ3Qgd2FudCB0byBhbGxvY2F0ZSB0b28gbGFyZ2UgbWVtb3J5IGp1c3QgaW4gY2FzZQotICAgIC8vIGEgbmV0IGhhcyBtYW55IHdpcmVzIHdpdGggb25seSAxIG9yIDIgcGF0aHMKLQotICAgIGlmIChwYXRoc0FsbG9jYXRlZF8gPD0gbWF4TGltaXQpIHsKLSAgICAgICAgaW5jTnVtYmVyID0gcGF0aHNBbGxvY2F0ZWRfKjI7Ci0gICAgICAgIGlmIChpbmNOdW1iZXIgPiBtYXhMaW1pdCkgewotICAgICAgICAgICAgaW5jTnVtYmVyID0gcGF0aHNBbGxvY2F0ZWRfICsgbWF4TGltaXQ7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpbmNOdW1iZXIgPSBwYXRoc0FsbG9jYXRlZF8gKyBtYXhMaW1pdDsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKG5ldE9zbmV0KSB7Ci0gICAgICBjYXNlIDI6Ci0gICAgICAgIGJ1bXBQYXRocygKLSAgICAgICAgICBwYXRoc0FsbG9jYXRlZF8gID8gaW5jTnVtYmVyIDogMTAwMCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnVtcFBhdGhzKAotICAgICAgICAgIHBhdGhzQWxsb2NhdGVkXyA/IGluY051bWJlciA6IDgpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgCi0gIHBhdGhzX1tudW1QYXRoc18rK10gPSBuZXcgZGVmaVBhdGgocCk7Ci0KLSAgaWYgKG51bVBhdGhzXyA9PSBwYXRoc0FsbG9jYXRlZF8pCi0gICAgKm5lZWRDYmsgPSAxOyAgIC8vIHByZS13YXJuIHRoZSBwYXJzZXIgaXQgbmVlZHMgdG8gcmVhbGxvYyBuZXh0IHRpbWUKLX0KLQotCi12b2lkIGRlZmlXaXJlOjpjbGVhcigpIHsKLSAgaW50ICAgICAgIGk7Ci0KLSAgaWYgKHR5cGVfKSB7Ci0gICAgZnJlZSh0eXBlXyk7Ci0gICAgdHlwZV8gPSAwOwotICB9Ci0KLSAgaWYgKHdpcmVTaGllbGROYW1lXykgewotICAgICAgZnJlZSh3aXJlU2hpZWxkTmFtZV8pOwotICAgICAgd2lyZVNoaWVsZE5hbWVfID0gMDsKLSAgfQotCi0gIGlmIChwYXRoc18pIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUGF0aHNfOyBpKyspIHsKLSAgICAgIGRlbGV0ZSBwYXRoc19baV07Ci0gICAgfQotCi0gICAgZGVsZXRlIFtdIHBhdGhzXzsKLSAgICBwYXRoc18gPSAwOwotICAgIG51bVBhdGhzXyA9IDA7Ci0gICAgcGF0aHNBbGxvY2F0ZWRfID0gMDsKLSAgfQotfQotCi0KLXZvaWQgZGVmaVdpcmU6OmJ1bXBQYXRocyhsb25nIGxvbmcgc2l6ZSkgewotICBsb25nIGxvbmcgaTsKLSAgZGVmaVBhdGgqKiBuZXdQYXRocyA9ICBuZXcgZGVmaVBhdGgqW3NpemVdOyAKLQotICBmb3IgKGkgPSAwOyBpIDwgbnVtUGF0aHNfOyBpKyspCi0gICAgbmV3UGF0aHNbaV0gPSBwYXRoc19baV07Ci0KLSAgcGF0aHNBbGxvY2F0ZWRfID0gc2l6ZTsKLSAgZGVsZXRlIFtdIHBhdGhzXzsKLSAgcGF0aHNfID0gbmV3UGF0aHM7Ci19Ci0KLQotaW50IGRlZmlXaXJlOjpudW1QYXRocygpIGNvbnN0IHsKLSAgcmV0dXJuIG51bVBhdGhzXzsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpV2lyZTo6d2lyZVR5cGUoKSBjb25zdCB7Ci0gIHJldHVybiB0eXBlXzsKLX0KLQotY29uc3QgY2hhciogZGVmaVdpcmU6OndpcmVTaGllbGROZXROYW1lKCkgY29uc3QgewotICByZXR1cm4gd2lyZVNoaWVsZE5hbWVfOwotfQotCi1kZWZpUGF0aCogZGVmaVdpcmU6OnBhdGgoaW50IGluZGV4KSB7Ci0gIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgbnVtUGF0aHNfKQotICAgIHJldHVybiBwYXRoc19baW5kZXhdOwotICByZXR1cm4gMDsKLX0KLQotCi1jb25zdCBkZWZpUGF0aCogZGVmaVdpcmU6OnBhdGgoaW50IGluZGV4KSBjb25zdCB7Ci0gICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBudW1QYXRoc18pCi0gICAgICAgIHJldHVybiBwYXRoc19baW5kZXhdOwotICAgIHJldHVybiAwOwotfQotCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyAgICBkZWZpTmV0Ci0vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0KLWRlZmlOZXQ6OmRlZmlOZXQoZGVmckRhdGEgKmRhdGEpCi0gOiBkZWZEYXRhKGRhdGEpCi17Ci0gIEluaXQoKTsKLX0KLQotCi12b2lkIGRlZmlOZXQ6OkluaXQoKSB7Ci0gIG5hbWVfID0gMDsKLSAgaW5zdGFuY2VzXyA9IDA7Ci0gIG51bVBpbnNfID0gMDsKLSAgbnVtUHJvcHNfID0gMDsKLSAgcHJvcE5hbWVzXyA9IDA7Ci0gIHN1Ym5ldHNfID0gMDsKLSAgc291cmNlXyA9IDA7Ci0gIHBhdHRlcm5fID0gMDsKLSAgc3R5bGVfID0gMDsKLSAgc2hpZWxkTmV0XyA9IDA7Ci0gIG9yaWdpbmFsXyA9IDA7Ci0gIHVzZV8gPSAwOwotICBub25EZWZhdWx0UnVsZV8gPSAwOwotICBudW1XaXJlc18gPSAwOwotICB3aXJlc0FsbG9jYXRlZF8gPSAwOwotICB3aXJlc189IDA7Ci0KLSAgbnVtV2lkdGhzXyA9IDA7Ci0gIHdpZHRoc0FsbG9jYXRlZF8gPSAwOwotICB3bGF5ZXJzXyA9IDA7Ci0gIHdkaXN0XyA9IDA7Ci0KLSAgbnVtU3BhY2luZ18gPSAwOwotICBzcGFjaW5nQWxsb2NhdGVkXyA9IDA7Ci0gIHNsYXllcnNfID0gMDsKLSAgc2Rpc3RfID0gMDsKLSAgc2xlZnRfID0gMDsKLSAgc3JpZ2h0XyA9IDA7Ci0KLSAgdnBpbnNfID0gMDsKLSAgbnVtVnBpbnNfID0gMDsKLSAgdnBpbnNBbGxvY2F0ZWRfID0gMDsKLQotICBzaGllbGRzXyA9IDA7Ci0gIG51bVNoaWVsZHNfID0gMDsKLSAgbnVtTm9TaGllbGRzXyA9IDA7Ci0gIHNoaWVsZHNBbGxvY2F0ZWRfID0gMDsKLSAgbnVtU2hpZWxkTmV0XyA9IDA7Ci0gIHNoaWVsZE5ldHNBbGxvY2F0ZWRfID0gMDsKLQotICBidW1wUHJvcHMoMik7Ci0gIGJ1bXBOYW1lKDE2KTsKLSAgYnVtcFBpbnMoMTYpOwotICBidW1wU3VibmV0cygyKTsKLQotICByZWN0TmFtZXNfID0gMDsKLSAgcmVjdFJvdXRlU3RhdHVzXyA9IDA7Ci0gIHJlY3RSb3V0ZVN0YXR1c1NoaWVsZE5hbWVzXz0wOwotICByZWN0U2hhcGVUeXBlc18gPSAwOwotICByZWN0TWFza3NfID0gMDsKLSAgcG9seWdvbk5hbWVzXyA9IDA7Ci0gIHBvbHlSb3V0ZVN0YXR1c18gPSAwOwotICBwb2x5U2hhcGVUeXBlc18gPSAwOwotICBwb2x5Um91dGVTdGF0dXNTaGllbGROYW1lc18gPSAwOwotICBudW1Qb2x5c18gPSAwOwotICBwb2x5c0FsbG9jYXRlZF8gPSAwOwotICBwb2x5Z29uc18gPSAwOwotICBwb2x5TWFza3NfID0gMDsKLQotICBudW1TdWJuZXRzXyA9IDA7Ci0gIHBhdGhzXyA9IDA7Ci0gIG51bVBhdGhzXyA9IDA7Ci0KLSAgbnVtUHRzXyA9IDA7Ci0gIHZpYU5hbWVzXyA9IDA7Ci0gIHZpYVB0c18gPSAwOwotICBwdHNBbGxvY2F0ZWRfPTA7Ci0gIHZpYU1hc2tzXyA9IDA7Ci0gIHZpYU9yaWVudHNfID0gMDsKLSAgdmlhUm91dGVTdGF0dXNfID0gMDsKLSAgdmlhU2hhcGVUeXBlc18gPSAwOwotICB2aWFSb3V0ZVN0YXR1c1NoaWVsZE5hbWVzXyA9IDA7Ci0KLSAgY2xlYXIoKTsKLX0KLQotCi12b2lkIGRlZmlOZXQ6OkRlc3Ryb3koKSB7Ci0gIGNsZWFyKCk7Ci0gIGZyZWUobmFtZV8pOwotICBmcmVlKChjaGFyKikoaW5zdGFuY2VzXykpOwotICBmcmVlKChjaGFyKikocGluc18pKTsKLSAgZnJlZShtdXN0c18pOwotICBmcmVlKHN5bnRoZXNpemVkXyk7Ci0gIGZyZWUoKGNoYXIqKShwcm9wTmFtZXNfKSk7Ci0gIGZyZWUoKGNoYXIqKShwcm9wVmFsdWVzXykpOwotICBmcmVlKChjaGFyKikocHJvcERWYWx1ZXNfKSk7Ci0gIGZyZWUoKGNoYXIqKShwcm9wVHlwZXNfKSk7Ci0gIGZyZWUoKGNoYXIqKShzdWJuZXRzXykpOwotICBpZiAoc291cmNlXykgZnJlZShzb3VyY2VfKTsKLSAgaWYgKHBhdHRlcm5fKSBmcmVlKHBhdHRlcm5fKTsKLSAgaWYgKHNoaWVsZE5ldF8pIGZyZWUoc2hpZWxkTmV0Xyk7Ci0gIGlmIChvcmlnaW5hbF8pIGZyZWUob3JpZ2luYWxfKTsKLSAgaWYgKHVzZV8pIGZyZWUodXNlXyk7Ci0gIGlmIChub25EZWZhdWx0UnVsZV8pIGZyZWUobm9uRGVmYXVsdFJ1bGVfKTsKLSAgaWYgKHdsYXllcnNfKSBmcmVlKChjaGFyKikod2xheWVyc18pKTsKLSAgaWYgKHNsYXllcnNfKSBmcmVlKChjaGFyKikoc2xheWVyc18pKTsKLSAgaWYgKHNkaXN0XykgZnJlZSgoY2hhciopKHNkaXN0XykpOwotICBpZiAod2Rpc3RfKSBmcmVlKChjaGFyKikod2Rpc3RfKSk7Ci0gIGlmIChzbGVmdF8pIGZyZWUoKGNoYXIqKShzbGVmdF8pKTsKLSAgaWYgKHNyaWdodF8pIGZyZWUoKGNoYXIqKShzcmlnaHRfKSk7Ci19Ci0KLQotZGVmaU5ldDo6fmRlZmlOZXQoKSB7Ci0gIERlc3Ryb3koKTsKLX0KLQotCi12b2lkIGRlZmlOZXQ6OnNldE5hbWUoY29uc3QgY2hhciogbmFtZSkgewotICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLSAgY2xlYXIoKTsKLSAgaWYgKGxlbiA+IG5hbWVTaXplXykgYnVtcE5hbWUobGVuKTsKLSAgc3RyY3B5KG5hbWVfLCBkZWZEYXRhLT5ERUZDQVNFKG5hbWUpKTsKLX0KLQotCi12b2lkIGRlZmlOZXQ6OmFkZE11c3RQaW4oY29uc3QgY2hhciogaW5zdGFuY2UsIGNvbnN0IGNoYXIqIHBpbiwgaW50IHN5bikgewotICBjbGVhcigpOwotICBhZGRQaW4oaW5zdGFuY2UsIHBpbiwgc3luKTsKLSAgbXVzdHNfW251bVBpbnNfIC0gMV0gPSAxOwotfQotCi0KLXZvaWQgZGVmaU5ldDo6YWRkUGluKGNvbnN0IGNoYXIqIGluc3RhbmNlLCBjb25zdCBjaGFyKiBwaW4sIGludCBzeW4pIHsKLSAgaW50IGxlbjsKLQotICBpZiAobnVtUGluc18gPT0gcGluc0FsbG9jYXRlZF8pCi0gICAgYnVtcFBpbnMocGluc0FsbG9jYXRlZF8gKiAyKTsKLQotICBsZW4gPSBzdHJsZW4oaW5zdGFuY2UpKyAxOwotICBpbnN0YW5jZXNfW251bVBpbnNfXSA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgc3RyY3B5KGluc3RhbmNlc19bbnVtUGluc19dLCBkZWZEYXRhLT5ERUZDQVNFKGluc3RhbmNlKSk7Ci0KLSAgbGVuID0gc3RybGVuKHBpbikrIDE7Ci0gIHBpbnNfW251bVBpbnNfXSA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgc3RyY3B5KHBpbnNfW251bVBpbnNfXSwgZGVmRGF0YS0+REVGQ0FTRShwaW4pKTsKLQotICBtdXN0c19bbnVtUGluc19dID0gMDsKLSAgc3ludGhlc2l6ZWRfW251bVBpbnNfXSA9IHN5bjsKLQotICAobnVtUGluc18pKys7Ci19Ci0KLQotdm9pZCBkZWZpTmV0OjpzZXRXZWlnaHQoaW50IHcpIHsKLSAgaGFzV2VpZ2h0XyA9IDE7Ci0gIHdlaWdodF8gPSB3OwotfQotCi0KLXZvaWQgZGVmaU5ldDo6YWRkUHJvcChjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSwgY29uc3QgY2hhciB0eXBlKSB7Ci0gIGludCBsZW47Ci0KLSAgaWYgKG51bVByb3BzXyA9PSBwcm9wc0FsbG9jYXRlZF8pCi0gICAgYnVtcFByb3BzKHByb3BzQWxsb2NhdGVkXyAqIDIpOwotCi0gIGxlbiA9IHN0cmxlbihuYW1lKSsgMTsKLSAgcHJvcE5hbWVzX1tudW1Qcm9wc19dID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICBzdHJjcHkocHJvcE5hbWVzX1tudW1Qcm9wc19dLCBkZWZEYXRhLT5ERUZDQVNFKG5hbWUpKTsKLQotICBsZW4gPSBzdHJsZW4odmFsdWUpKyAxOwotICBwcm9wVmFsdWVzX1tudW1Qcm9wc19dID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICBzdHJjcHkocHJvcFZhbHVlc19bbnVtUHJvcHNfXSwgZGVmRGF0YS0+REVGQ0FTRSh2YWx1ZSkpOwotCi0gIHByb3BEVmFsdWVzX1tudW1Qcm9wc19dID0gMDsKLSAgcHJvcFR5cGVzX1tudW1Qcm9wc19dID0gdHlwZTsKLQotICAobnVtUHJvcHNfKSsrOwotfQotCi0KLXZvaWQgZGVmaU5ldDo6YWRkTnVtUHJvcChjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBkb3VibGUgZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YWx1ZSwgY29uc3QgY2hhciB0eXBlKSB7Ci0gIGludCBsZW47Ci0KLSAgaWYgKG51bVByb3BzXyA9PSBwcm9wc0FsbG9jYXRlZF8pCi0gICAgYnVtcFByb3BzKHByb3BzQWxsb2NhdGVkXyAqIDIpOwotCi0gIGxlbiA9IHN0cmxlbihuYW1lKSsgMTsKLSAgcHJvcE5hbWVzX1tudW1Qcm9wc19dID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICBzdHJjcHkocHJvcE5hbWVzX1tudW1Qcm9wc19dLCBkZWZEYXRhLT5ERUZDQVNFKG5hbWUpKTsKLQotICBsZW4gPSBzdHJsZW4odmFsdWUpKyAxOwotICBwcm9wVmFsdWVzX1tudW1Qcm9wc19dID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICBzdHJjcHkocHJvcFZhbHVlc19bbnVtUHJvcHNfXSwgZGVmRGF0YS0+REVGQ0FTRSh2YWx1ZSkpOwotCi0gIHByb3BEVmFsdWVzX1tudW1Qcm9wc19dID0gZDsKLSAgcHJvcFR5cGVzX1tudW1Qcm9wc19dID0gdHlwZTsKLQotICAobnVtUHJvcHNfKSsrOwotfQotCi0KLXZvaWQgZGVmaU5ldDo6YWRkU3VibmV0KGRlZmlTdWJuZXQqIHN1Ym5ldCkgewotCi0gIGlmIChudW1TdWJuZXRzXyA+PSBzdWJuZXRzQWxsb2NhdGVkXykKLSAgICBidW1wU3VibmV0cyhzdWJuZXRzQWxsb2NhdGVkXyAqIDIpOwotCi0gIHN1Ym5ldHNfW251bVN1Ym5ldHNfKytdID0gc3VibmV0OwotfQotCi0vLyBXTUQgLS0gd2lsbCBiZSByZW1vdmVkIGFmdGVyIHRoZSBuZXh0IHJlbGVhc2UKLXZvaWQgZGVmaU5ldDo6c2V0VHlwZShjb25zdCBjaGFyKiB0eXApIHsKLSAgaWYgKCp0eXAgPT0gJ0YnKSB7Ci0gICAgaXNGaXhlZF8gPSAxOwotICB9IGVsc2UgaWYgKCp0eXAgPT0gJ0MnKSB7Ci0gICAgaXNDb3Zlcl8gPSAxOwotICB9IGVsc2UgaWYgKCp0eXAgPT0gJ1InKSB7Ci0gICAgaXNSb3V0ZWRfID0gMTsKLSAgfSBlbHNlIHsKLSAgICAvLyBTaWxlbnRseSBkbyBub3RoaW5nIHdpdGggYmFkIGlucHV0LgotICB9Ci19Ci0KLXZvaWQgZGVmaU5ldDo6YWRkV2lyZShjb25zdCBjaGFyKiB0eXBlLCBjb25zdCBjaGFyKiB3aXJlU2hpZWxkTmFtZSkgewotICBkZWZpV2lyZSogd2lyZTsKLSAgaWYgKG51bVdpcmVzXyA9PSB3aXJlc0FsbG9jYXRlZF8pIHsKLSAgICBkZWZpV2lyZSoqIGFycmF5OwotICAgIGludCBpOwotICAgIHdpcmVzQWxsb2NhdGVkXyA9IHdpcmVzQWxsb2NhdGVkXyA/Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aXJlc0FsbG9jYXRlZF8gKiAyIDogMiA7Ci0gICAgYXJyYXkgPSAoZGVmaVdpcmUqKiltYWxsb2Moc2l6ZW9mKGRlZmlXaXJlKikqd2lyZXNBbGxvY2F0ZWRfKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtV2lyZXNfOyBpKyspCi0gICAgICBhcnJheVtpXSA9IHdpcmVzX1tpXTsKLSAgICBpZiAod2lyZXNfKSBmcmVlKChjaGFyKikod2lyZXNfKSk7Ci0gICAgd2lyZXNfID0gYXJyYXk7Ci0gIH0KLSAgd2lyZSA9IHdpcmVzX1tudW1XaXJlc19dID0gbmV3IGRlZmlXaXJlKGRlZkRhdGEpOwotICBudW1XaXJlc18gKz0gMTsKLSAgd2lyZS0+SW5pdCh0eXBlLCB3aXJlU2hpZWxkTmFtZSk7Ci19Ci0KLQotdm9pZCBkZWZpTmV0OjphZGRXaXJlUGF0aChkZWZpUGF0aCogcCwgaW50IHJlc2V0LCBpbnQgbmV0T3NuZXQsIGludCAqbmVlZENiaykgewotICBpZiAobnVtV2lyZXNfID4gMCkKLSAgICAgd2lyZXNfW251bVdpcmVzXy0xXS0+YWRkUGF0aChwLCByZXNldCwgbmV0T3NuZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRDYmspOwotICBlbHNlCi0gICAgIC8vIFNvbWV0aGluZyBzY3JldyB1cCwgY2FuJ3QgYmUgYm90aCBiZSB6ZXJvLgotICAgICBkZWZpRXJyb3IoMCwgNjA4MSwgIkVSUk9SIChERUZQQVJTLTYwODEpOiBBbiBpbnRlcm5hbCBlcnJvciBoYXMgb2NjdXJyZWQuIFRoZSBpbmRleCBudW1iZXIgZm9yIHRoZSBORVQgUEFUSCB3aXJlcyBhcnJheSBpcyBsZXNzIHRoZW4gb3IgZXF1YWwgdG8gMC5cbkNvbnRhY3QgQ2FkZW5jZSBDdXN0b21lciBTdXBwb3J0IHdpdGggdGhpcyBlcnJvciBpbmZvcm1hdGlvbi4iLCBkZWZEYXRhKTsKLX0KLQotCi12b2lkIGRlZmlOZXQ6OmFkZFNoaWVsZChjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIGRlZmlTaGllbGQqIHNoaWVsZDsKLSAgaWYgKG51bVNoaWVsZHNfID09IHNoaWVsZHNBbGxvY2F0ZWRfKSB7Ci0gICAgZGVmaVNoaWVsZCoqIGFycmF5OwotICAgIGludCBpOwotICAgIHNoaWVsZHNBbGxvY2F0ZWRfID0gc2hpZWxkc0FsbG9jYXRlZF8gPwotICAgICAgICAgICAgICAgICAgICAgICAgICBzaGllbGRzQWxsb2NhdGVkXyAqIDIgOiAyIDsKLSAgICBhcnJheSA9IChkZWZpU2hpZWxkKiopbWFsbG9jKHNpemVvZihkZWZpU2hpZWxkKikqc2hpZWxkc0FsbG9jYXRlZF8pOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1TaGllbGRzXzsgaSsrKQotICAgICAgYXJyYXlbaV0gPSBzaGllbGRzX1tpXTsKLSAgICBpZiAoc2hpZWxkc18pIGZyZWUoKGNoYXIqKShzaGllbGRzXykpOwotICAgIHNoaWVsZHNfID0gYXJyYXk7Ci0gIH0KLSAgc2hpZWxkID0gc2hpZWxkc19bbnVtU2hpZWxkc19dID0gbmV3IGRlZmlTaGllbGQoZGVmRGF0YSk7Ci0gIG51bVNoaWVsZHNfICs9IDE7Ci0gIHNoaWVsZC0+SW5pdChuYW1lKTsKLX0KLQotCi12b2lkIGRlZmlOZXQ6OmFkZFNoaWVsZFBhdGgoZGVmaVBhdGgqIHAsIGludCByZXNldCwgaW50IG5ldE9zbmV0LCBpbnQgKm5lZWRDYmspIHsKLSAgLy8gU2luY2Ugc2hpZWxkIGFuZCBub3NoaWVsZCBzaGFyZSB0aGUgbGlzdCBzaGllbGRzXywgdGhlCi0gIC8vIG9ubHkgd2F5IHRvIHRlbGwgd2hldGhlciB0aGUgbGlzdCBpcyBjdXJyZW50bHkgY29udGFpbmVkCi0gIC8vIGRhdGEgZm9yIHNoaWVsZHNfIG9yIG5vc2hpZWxkc18gaXMgZnJvbSB0aGUgdmFyaWFibGVzCi0gIC8vIG51bVNoaWVsZHNfIGFuZCBudW1Ob1NoaWVsZHNfLgotICAvLyBTaW5jZSBzaGllbGQgYW5kIG5vc2hpZWxkIGFyZSBtdXR1YWwgZXhjbHVzaXZlLCBvbmx5IG9uZQotICAvLyBudW1TaGllbGRzXyBvciBudW1Ob1NoaWVsZHMgd2lsbCBiZSBub24temVybwotICAvLyBpbiB0aGlzIG1ldGhvZC4gIFdoaWNoZXZlciBpcyBub24temVybyB3aWxsIGJlIHRoZSBjdXJyZW50Ci0gIC8vIHdvcmtpbmcgbGlzdAotICBpZiAobnVtU2hpZWxkc18gPiAwKQotICAgICBzaGllbGRzX1tudW1TaGllbGRzXy0xXS0+YWRkUGF0aChwLCByZXNldCwKLSAgICAgICAgICAgICAgbmV0T3NuZXQsIG5lZWRDYmspOwotICBlbHNlIGlmIChudW1Ob1NoaWVsZHNfID4gMCkKLSAgICAgc2hpZWxkc19bbnVtTm9TaGllbGRzXy0xXS0+YWRkUGF0aChwLCByZXNldCwKLSAgICAgICAgICAgICAgbmV0T3NuZXQsIG5lZWRDYmspOwotICBlbHNlCi0gICAgIC8vIFNvbWV0aGluZyBzY3JldyB1cCwgY2FuJ3QgYmUgYm90aCBiZSB6ZXJvLgotICAgICBkZWZpRXJyb3IoMCwgNjA4MiwgIkVSUk9SIChERUZQQVJTLTYwODIpOiBBbiBpbnRlcm5hbCBlcnJvciBoYXMgb2NjdXJyZWQuIFRoZSBpbmRleCBudW1iZXIgZm9yIHRoZSBORVQgU0hJRUxEUEFUSCB3aXJlcyBhcnJheSBpcyBsZXNzIHRoZW4gb3IgZXF1YWwgdG8gMC5cbkNvbnRhY3QgQ2FkZW5jZSBDdXN0b21lciBTdXBwb3J0IHdpdGggdGhpcyBlcnJvciBpbmZvcm1hdGlvbi4iLCBkZWZEYXRhKTsKLX0KLQotCi12b2lkIGRlZmlOZXQ6OmFkZE5vU2hpZWxkKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgZGVmaVNoaWVsZCogc2hpZWxkOwotICBpZiAobnVtTm9TaGllbGRzXyA9PSBzaGllbGRzQWxsb2NhdGVkXykgewotICAgIGRlZmlTaGllbGQqKiBhcnJheTsKLSAgICBpbnQgaTsKLSAgICBzaGllbGRzQWxsb2NhdGVkXyA9IHNoaWVsZHNBbGxvY2F0ZWRfID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZWxkc0FsbG9jYXRlZF8gKiAyIDogMiA7Ci0gICAgYXJyYXkgPSAoZGVmaVNoaWVsZCoqKW1hbGxvYyhzaXplb2YoZGVmaVNoaWVsZCopKnNoaWVsZHNBbGxvY2F0ZWRfKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTm9TaGllbGRzXzsgaSsrKQotICAgICAgYXJyYXlbaV0gPSBzaGllbGRzX1tpXTsKLSAgICBpZiAoc2hpZWxkc18pIGZyZWUoKGNoYXIqKShzaGllbGRzXykpOwotICAgIHNoaWVsZHNfID0gYXJyYXk7Ci0gIH0KLSAgc2hpZWxkID0gc2hpZWxkc19bbnVtTm9TaGllbGRzX10gPSAgbmV3IGRlZmlTaGllbGQoZGVmRGF0YSk7Ci0gIG51bU5vU2hpZWxkc18gKz0gMTsKLSAgc2hpZWxkLT5Jbml0KG5hbWUpOwotfQotCi0KLXZvaWQgZGVmaU5ldDo6YWRkU2hpZWxkTmV0KGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgaW50IGxlbjsKLQotICBpZiAobnVtU2hpZWxkTmV0XyA9PSBzaGllbGROZXRzQWxsb2NhdGVkXykgewotICAgICBpZiAoc2hpZWxkTmV0c0FsbG9jYXRlZF8gPT0gMCkKLSAgICAgICAgYnVtcFNoaWVsZE5ldHMoMik7Ci0gICAgIGVsc2UKLSAgICAgICAgYnVtcFNoaWVsZE5ldHMoc2hpZWxkTmV0c0FsbG9jYXRlZF8gKiAyKTsKLQotICB9Ci0gCi0gIGxlbiA9IHN0cmxlbihuYW1lKSArIDE7Ci0gIHNoaWVsZE5ldF9bbnVtU2hpZWxkTmV0X10gPSAoY2hhciopbWFsbG9jKGxlbik7Ci0gIHN0cmNweShzaGllbGROZXRfW251bVNoaWVsZE5ldF9dLCBkZWZEYXRhLT5ERUZDQVNFKG5hbWUpKTsKLSAgKG51bVNoaWVsZE5ldF8pKys7Ci19Ci0KLQotdm9pZCBkZWZpTmV0OjpjaGFuZ2VOZXROYW1lKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgaW50IGxlbiA9IHN0cmxlbihuYW1lKSArIDE7Ci0gIGlmIChsZW4gPiBuYW1lU2l6ZV8pIGJ1bXBOYW1lKGxlbik7Ci0gIHN0cmNweShuYW1lXywgZGVmRGF0YS0+REVGQ0FTRShuYW1lKSk7Ci19Ci0KLXZvaWQgZGVmaU5ldDo6Y2hhbmdlSW5zdGFuY2UoY29uc3QgY2hhciogaW5zdGFuY2UsIGludCBpbmRleCkgewotICBpbnQgbGVuOwotICBjaGFyIGVyck1zZ1sxMjhdOwotCi0gIGlmICgoaW5kZXggPCAwKSB8fCAoaW5kZXggPiBudW1QaW5zXykpIHsKLSAgICAgc3ByaW50ZiAoZXJyTXNnLCAiRVJST1IgKERFRlBBUlMtNjA4Myk6IFRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgTkVUIElOU1RBTkNFIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIsCi0gICAgICAgICAgICAgaW5kZXgsIG51bVBpbnNfKTsKLSAgICAgZGVmaUVycm9yKDAsIDYwODMsIGVyck1zZywgZGVmRGF0YSk7Ci0gIH0KLQotICBsZW4gPSBzdHJsZW4oaW5zdGFuY2UpKyAxOwotICBpZiAoaW5zdGFuY2VzX1tpbmRleF0pCi0gICAgZnJlZSgoY2hhciopKGluc3RhbmNlc19baW5kZXhdKSk7Ci0gIGluc3RhbmNlc19baW5kZXhdID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICBzdHJjcHkoaW5zdGFuY2VzX1tpbmRleF0sIGRlZkRhdGEtPkRFRkNBU0UoaW5zdGFuY2UpKTsKLSAgcmV0dXJuOwotfQotCi12b2lkIGRlZmlOZXQ6OmNoYW5nZVBpbihjb25zdCBjaGFyKiBwaW4sIGludCBpbmRleCkgewotICBpbnQgbGVuOwotICBjaGFyIGVyck1zZ1sxMjhdOwotCi0gIGlmICgoaW5kZXggPCAwKSB8fCAoaW5kZXggPiBudW1QaW5zXykpIHsKLSAgICAgc3ByaW50ZiAoZXJyTXNnLCAiRVJST1IgKERFRlBBUlMtNjA4NCk6IFRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgTkVUIFBJTiBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiBTcGVjaWZ5IGEgdmFsaWQgaW5kZXggbnVtYmVyIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLAotICAgICAgICAgICAgIGluZGV4LCBudW1QaW5zXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MDg0LCBlcnJNc2csIGRlZkRhdGEpOwotICB9Ci0KLSAgbGVuID0gc3RybGVuKHBpbikrIDE7Ci0gIGlmIChwaW5zX1tpbmRleF0pCi0gICAgZnJlZSgoY2hhciopKHBpbnNfW2luZGV4XSkpOwotICBwaW5zX1tpbmRleF0gPSAoY2hhciopbWFsbG9jKGxlbik7Ci0gIHN0cmNweShwaW5zX1tpbmRleF0sIGRlZkRhdGEtPkRFRkNBU0UocGluKSk7Ci0gIHJldHVybjsKLX0KLQotY29uc3QgY2hhciogZGVmaU5ldDo6bmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG5hbWVfOwotfQotCi0KLWludCBkZWZpTmV0Ojp3ZWlnaHQoKSBjb25zdCB7Ci0gIHJldHVybiB3ZWlnaHRfOwotfQotCi0KLWludCBkZWZpTmV0OjpudW1Qcm9wcygpIGNvbnN0IHsKLSAgcmV0dXJuIG51bVByb3BzXzsKLX0KLQotCi1pbnQgZGVmaU5ldDo6aGFzUHJvcHMoKSBjb25zdCB7Ci0gIHJldHVybiBudW1Qcm9wc18gPyAxIDogMCA7Ci19Ci0KLQotaW50IGRlZmlOZXQ6Omhhc1dlaWdodCgpIGNvbnN0IHsKLSAgcmV0dXJuIChpbnQpKGhhc1dlaWdodF8pOwotfQotCi0KLWNvbnN0IGNoYXIqIGRlZmlOZXQ6OnByb3BOYW1lKGludCBpbmRleCkgY29uc3QgewotICBpZiAoaW5kZXggPj0gMCAmJiAgaW5kZXggPCBudW1Qcm9wc18pCi0gICAgcmV0dXJuIHByb3BOYW1lc19baW5kZXhdOwotICByZXR1cm4gMDsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpTmV0Ojpwcm9wVmFsdWUoaW50IGluZGV4KSBjb25zdCB7Ci0gIGlmIChpbmRleCA+PSAwICYmICBpbmRleCA8IG51bVByb3BzXykKLSAgICByZXR1cm4gcHJvcFZhbHVlc19baW5kZXhdOwotICByZXR1cm4gMDsKLX0KLQotCi1kb3VibGUgZGVmaU5ldDo6cHJvcE51bWJlcihpbnQgaW5kZXgpIGNvbnN0IHsKLSAgaWYgKGluZGV4ID49IDAgJiYgIGluZGV4IDwgbnVtUHJvcHNfKQotICAgIHJldHVybiBwcm9wRFZhbHVlc19baW5kZXhdOwotICByZXR1cm4gMDsKLX0KLQotCi1jb25zdCBjaGFyIGRlZmlOZXQ6OnByb3BUeXBlKGludCBpbmRleCkgY29uc3QgewotICBpZiAoaW5kZXggPj0gMCAmJiAgaW5kZXggPCBudW1Qcm9wc18pCi0gICAgcmV0dXJuIHByb3BUeXBlc19baW5kZXhdOwotICByZXR1cm4gMDsKLX0KLQotCi1pbnQgZGVmaU5ldDo6cHJvcElzTnVtYmVyKGludCBpbmRleCkgY29uc3QgewotICBpZiAoaW5kZXggPj0gMCAmJiAgaW5kZXggPCBudW1Qcm9wc18pCi0gICAgcmV0dXJuIHByb3BEVmFsdWVzX1tpbmRleF0gPyAxIDogMDsKLSAgcmV0dXJuIDA7IAotfQotCi0KLWludCBkZWZpTmV0Ojpwcm9wSXNTdHJpbmcoaW50IGluZGV4KSBjb25zdCB7Ci0gIGlmIChpbmRleCA+PSAwICYmICBpbmRleCA8IG51bVByb3BzXykKLSAgICByZXR1cm4gcHJvcERWYWx1ZXNfW2luZGV4XSA/IDAgOiAxOwotICByZXR1cm4gMDsgCi19Ci0KLQotaW50IGRlZmlOZXQ6Om51bUNvbm5lY3Rpb25zKCkgY29uc3QgewotICByZXR1cm4gbnVtUGluc187Ci19Ci0KLQotaW50IGRlZmlOZXQ6Om51bVNoaWVsZE5ldHMoKSBjb25zdCB7Ci0gIHJldHVybiBudW1TaGllbGROZXRfOwotfQotCi0KLWNvbnN0IGNoYXIqIGRlZmlOZXQ6Omluc3RhbmNlKGludCBpbmRleCkgY29uc3QgewotICBpZiAoaW5kZXggPj0gMCAmJiAgaW5kZXggPCBudW1QaW5zXykKLSAgICByZXR1cm4gaW5zdGFuY2VzX1tpbmRleF07Ci0gIHJldHVybiAwOwotfQotCi0KLWNvbnN0IGNoYXIqIGRlZmlOZXQ6OnBpbihpbnQgaW5kZXgpIGNvbnN0IHsKLSAgaWYgKGluZGV4ID49IDAgJiYgIGluZGV4IDwgbnVtUGluc18pCi0gICAgcmV0dXJuIHBpbnNfW2luZGV4XTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotaW50IGRlZmlOZXQ6OnBpbklzTXVzdEpvaW4oaW50IGluZGV4KSBjb25zdCB7Ci0gIGlmIChpbmRleCA+PSAwICYmICBpbmRleCA8IG51bVBpbnNfKQotICAgIHJldHVybiAoaW50KShtdXN0c19baW5kZXhdKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotaW50IGRlZmlOZXQ6OnBpbklzU3ludGhlc2l6ZWQoaW50IGluZGV4KSBjb25zdCB7Ci0gIGlmIChpbmRleCA+PSAwICYmICBpbmRleCA8IG51bVBpbnNfKQotICAgIHJldHVybiAoaW50KShzeW50aGVzaXplZF9baW5kZXhdKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotaW50IGRlZmlOZXQ6Omhhc1N1Ym5ldHMoKSBjb25zdCB7Ci0gIHJldHVybiBudW1TdWJuZXRzXyA/IDEgOiAwIDsKLX0KLQotCi1pbnQgZGVmaU5ldDo6bnVtU3VibmV0cygpIGNvbnN0IHsKLSAgcmV0dXJuIG51bVN1Ym5ldHNfOwotfQotCi0KLWRlZmlTdWJuZXQqIGRlZmlOZXQ6OnN1Ym5ldChpbnQgaW5kZXgpIHsKLSAgaWYgKGluZGV4ID49IDAgJiYgIGluZGV4IDwgbnVtU3VibmV0c18pCi0gICAgcmV0dXJuIHN1Ym5ldHNfW2luZGV4XTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotY29uc3QgZGVmaVN1Ym5ldCogZGVmaU5ldDo6c3VibmV0KGludCBpbmRleCkgY29uc3QgewotICAgIGlmIChpbmRleCA+PSAwICYmICBpbmRleCA8IG51bVN1Ym5ldHNfKQotICAgICAgICByZXR1cm4gc3VibmV0c19baW5kZXhdOwotICAgIHJldHVybiAwOwotfQotCi0KLWludCBkZWZpTmV0Ojppc0ZpeGVkKCkgY29uc3QgewotICByZXR1cm4gKGludCkoaXNGaXhlZF8pOwotfQotIAotIAotaW50IGRlZmlOZXQ6OmlzUm91dGVkKCkgY29uc3QgewotICByZXR1cm4gKGludCkoaXNSb3V0ZWRfKTsKLX0KLSAKLSAKLWludCBkZWZpTmV0Ojppc0NvdmVyKCkgY29uc3QgewotICByZXR1cm4gKGludCkoaXNDb3Zlcl8pOwotfQotIAotCi0vLyB0aGlzIG1ldGhvZCB3aWxsIG9ubHkgY2FsbCBpZiB0aGUgY2FsbGJhY2sgZGVmclNOZXRXaXJlQ2JrIGlzIHNldAotLy8gd2hpY2ggd2lsbCBjYWxsYmFjayBldmVyeSB3aXJlLiAgVGhlcmVmb3JlLCBvbmx5IG9uZSB3aXJlIHNob3VsZCBiZSBoZXJlCi12b2lkIGRlZmlOZXQ6OmZyZWVXaXJlKCkgewotICBpbnQgaTsKLQotICBpZiAobnVtV2lyZXNfKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bVdpcmVzXzsgaSsrKSB7Ci0gICAgICB3aXJlc19baV0tPkRlc3Ryb3koKTsKLSAgICAgIGRlbGV0ZSB3aXJlc19baV07Ci0gICAgICB3aXJlc19baV0gPSAwOwotICAgIH0KLSAgICBmcmVlKChjaGFyKikod2lyZXNfKSk7Ci0gICAgd2lyZXNfID0gMDsKLSAgICBudW1XaXJlc18gPSAwOwotICAgIHdpcmVzQWxsb2NhdGVkXyA9IDA7Ci0gIH0KLQotICBjbGVhclJlY3RQb2x5KCk7Ci0gIGNsZWFyVmlhKCk7Ci19Ci0KLQotdm9pZCBkZWZpTmV0OjpmcmVlU2hpZWxkKCkgewotICBpbnQgaTsKLQotICBpZiAobnVtU2hpZWxkc18pIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtU2hpZWxkc187IGkrKykgewotICAgICAgc2hpZWxkc19baV0tPkRlc3Ryb3koKTsKLSAgICAgIGZyZWUoKGNoYXIqKShzaGllbGRzX1tpXSkpOwotICAgICAgc2hpZWxkc19baV0gPSAwOwotICAgIH0KLSAgICBudW1TaGllbGRzXyA9IDA7Ci0gICAgc2hpZWxkc0FsbG9jYXRlZF8gPSAwOwotICB9Ci19Ci0KLQotdm9pZCBkZWZpTmV0OjpwcmludChGSUxFKiBmKSBjb25zdCB7Ci0gIGludCBpLCBqLCB4LCB5LCBuZXdMYXllcjsKLSAgaW50IG51bVgsIG51bVksIHN0ZXBYLCBzdGVwWTsKLSAgY29uc3QgZGVmaVBhdGgqIHA7Ci0gIGNvbnN0IGRlZmlTdWJuZXQqIHM7Ci0gIGNvbnN0IGRlZmlWcGluKiB2cDsKLSAgY29uc3QgZGVmaVdpcmUqIHc7Ci0gIGludCBwYXRoOwotCi0gIGZwcmludGYoZiwgIk5ldCAnJXMnIiwgbmFtZV8pOwotICBmcHJpbnRmKGYsICJcbiIpOwotCi0gIGlmIChoYXNXZWlnaHQoKSkKLSAgICBmcHJpbnRmKGYsICIgIHdlaWdodD0lZFxuIiwgd2VpZ2h0KCkpOwotCi0gIGlmIChoYXNGaXhlZGJ1bXAoKSkKLSAgICBmcHJpbnRmKGYsICIgIGZpeGVkYnVtcFxuIik7Ci0KLSAgaWYgKGhhc0ZyZXF1ZW5jeSgpKQotICAgIGZwcmludGYoZiwgIiAgZnJlcXVlbmN5PSVmXG4iLCBmcmVxdWVuY3koKSk7Ci0KLSAgaWYgKGhhc0NhcCgpKQotICAgIGZwcmludGYoZiwgIiAgY2FwPSVmXG4iLCBjYXAoKSk7Ci0KLSAgaWYgKGhhc1NvdXJjZSgpKQotICAgIGZwcmludGYoZiwgIiAgc291cmNlPSclcydcbiIsIHNvdXJjZSgpKTsKLQotICBpZiAoaGFzUGF0dGVybigpKQotICAgIGZwcmludGYoZiwgIiAgcGF0dGVybj0nJXMnXG4iLCBwYXR0ZXJuKCkpOwotCi0gIGlmIChoYXNPcmlnaW5hbCgpKQotICAgIGZwcmludGYoZiwgIiAgb3JpZ2luYWw9JyVzJ1xuIiwgb3JpZ2luYWwoKSk7Ci0KLSAgaWYgKGhhc1VzZSgpKQotICAgIGZwcmludGYoZiwgIiAgdXNlPSclcydcbiIsIHVzZSgpKTsKLQotICBpZiAoaGFzTm9uRGVmYXVsdFJ1bGUoKSkKLSAgICBmcHJpbnRmKGYsICIgIG5vbkRlZmF1bHRSdWxlPSclcydcbiIsIG5vbkRlZmF1bHRSdWxlKCkpOwotCi0gIGlmIChoYXNYVGFsaygpKQotICAgIGZwcmludGYoZiwgIiAgeHRhbGs9JWRcbiIsIFhUYWxrKCkpOwotCi0gIGlmIChoYXNTdHlsZSgpKQotICAgIGZwcmludGYoZiwgIiAgc3R5bGU9JyVkJ1xuIiwgc3R5bGUoKSk7Ci0KLSAgaWYgKGhhc1Byb3BzKCkpIHsKLSAgICBmcHJpbnRmKGYsICIgUHJvcHM6XG4iKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUHJvcHMoKTsgaSsrKSB7Ci0gICAgICBmcHJpbnRmKGYsICIgICclcycgJyVzJ1xuIiwgcHJvcE5hbWUoaSksCi0gICAgICBwcm9wVmFsdWUoaSkpOwotICAgIH0KLSAgfQotCi0gIGlmIChudW1Db25uZWN0aW9ucygpKSB7Ci0gICAgZnByaW50ZihmLCAiIFBpbnM6XG4iKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQ29ubmVjdGlvbnMoKTsgaSsrKSB7Ci0gICAgZnByaW50ZihmLCAiICAnJXMnICclcyclcyVzXG4iLCAKLSAgICAgIGluc3RhbmNlKGkpLAotICAgICAgcGluKGkpLAotICAgICAgcGluSXNNdXN0Sm9pbihpKSA/ICIgTVVTVEpPSU4iIDogIiIsCi0gICAgICBwaW5Jc1N5bnRoZXNpemVkKGkpID8gIiBTWU5USEVTSVpFRCIgOiAiIik7Ci0gICAgfQotICB9Ci0gCi0gIGZvciAoaSA9IDA7IGkgPCBudW1WcGluc187IGkrKykgewotICAgIHZwID0gdnBpbihpKTsKLSAgICBmcHJpbnRmKGYsCi0gICAgIiAgVlBJTiAlcyBzdGF0dXMgJyVjJyBsYXllciAlcyAlZCwlZCBvcmllbnQgJXMgYm91bmRzICVkLCVkIHRvICVkLCVkXG4iLAotICAgIHZwLT5uYW1lKCksCi0gICAgdnAtPnN0YXR1cygpLAotICAgIHZwLT5sYXllcigpID8gdnAtPmxheWVyKCkgOiAiIiwKLSAgICB2cC0+eExvYygpLAotICAgIHZwLT55TG9jKCksCi0gICAgdnAtPm9yaWVudFN0cigpLAotICAgIHZwLT54bCgpLAotICAgIHZwLT55bCgpLAotICAgIHZwLT54aCgpLAotICAgIHZwLT55aCgpKTsKLSAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1XaXJlc187IGkrKykgewotICAgIG5ld0xheWVyID0gMDsKLSAgICB3ID0gd2lyZShpKTsKLSAgICBmcHJpbnRmKGYsICIrICVzICIsIHctPndpcmVUeXBlKCkpOwotICAgIGZvciAoaiA9IDA7IGogPCB3LT5udW1QYXRocygpOyBqKyspIHsKLSAgICAgIHAgPSB3LT5wYXRoKGopOwotICAgICAgcC0+aW5pdFRyYXZlcnNlKCk7Ci0gICAgICB3aGlsZSAoKHBhdGggPSAoaW50KShwLT5uZXh0KCkpKSAhPSBERUZJUEFUSF9ET05FKSB7Ci0gICAgICAgICBzd2l0Y2ggKHBhdGgpIHsKLSAgICAgICAgICAgY2FzZSBERUZJUEFUSF9MQVlFUjoKLSAgICAgICAgICAgICAgICBpZiAobmV3TGF5ZXIgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIlcyAiLCBwLT5nZXRMYXllcigpKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3TGF5ZXIgPSAxOwotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJORVcgJXMgIiwgcC0+Z2V0TGF5ZXIoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIGNhc2UgREVGSVBBVEhfVklBOgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiVzXG4iLCBwLT5nZXRWaWEoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIGNhc2UgREVGSVBBVEhfVklBUk9UQVRJT046Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiJWRcbiIsIHAtPmdldFZpYVJvdGF0aW9uKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICBjYXNlIERFRklQQVRIX1ZJQURBVEE6Ci0gICAgICAgICAgICAgICAgcC0+Z2V0VmlhRGF0YSgmbnVtWCwgJm51bVksICZzdGVwWCwgJnN0ZXBZKTsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIlZCAlZCAlZCAlZFxuIiwgbnVtWCwgbnVtWSwgc3RlcFgsIHN0ZXBZKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgY2FzZSBERUZJUEFUSF9XSURUSDoKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIlZFxuIiwgcC0+Z2V0V2lkdGgoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIGNhc2UgREVGSVBBVEhfUE9JTlQ6Ci0gICAgICAgICAgICAgICAgcC0+Z2V0UG9pbnQoJngsICZ5KTsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIoICVkICVkIClcbiIsIHgsIHkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICBjYXNlIERFRklQQVRIX1RBUEVSOgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIlRBUEVSXG4iKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAoaGFzU3VibmV0cygpKSB7Ci0gICAgZnByaW50ZihmLCAiIFN1Ym5ldHM6XG4iKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtU3VibmV0cygpOyBpKyspIHsKLSAgICAgIHMgPSBzdWJuZXQoaSk7Ci0gICAgICBzLT5wcmludChmKTsKLSAgICB9Ci0gIH0KLQotfQotCi0KLXZvaWQgZGVmaU5ldDo6YnVtcE5hbWUobG9uZyBsb25nIHNpemUpIHsKLSAgaWYgKG5hbWVfKSBmcmVlKG5hbWVfKTsKLSAgbmFtZV8gPSAoY2hhciopbWFsbG9jKHNpemUpOwotICBuYW1lU2l6ZV8gPSBzaXplOwotICBuYW1lX1swXSA9ICdcMCc7Ci19Ci0KLQotdm9pZCBkZWZpTmV0OjpidW1wUGlucyhsb25nIGxvbmcgc2l6ZSkgewotICBjaGFyKiogbmV3SW5zdGFuY2VzID0gKGNoYXIqKiltYWxsb2Moc2l6ZW9mKGNoYXIqKSpzaXplKTsKLSAgY2hhcioqIG5ld1BpbnMgPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKnNpemUpOwotICBjaGFyKiBuZXdNdXN0cyA9IChjaGFyKiltYWxsb2Moc2l6ZSk7Ci0gIGNoYXIqIG5ld1N5biA9IChjaGFyKiltYWxsb2Moc2l6ZSk7Ci0gIGxvbmcgbG9uZyBpOwotCi0gIGlmIChpbnN0YW5jZXNfKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IHBpbnNBbGxvY2F0ZWRfOyBpKyspIHsKLSAgICAgIG5ld0luc3RhbmNlc1tpXSA9IGluc3RhbmNlc19baV07Ci0gICAgICBuZXdQaW5zW2ldID0gcGluc19baV07Ci0gICAgICBuZXdNdXN0c1tpXSA9IG11c3RzX1tpXTsKLSAgICAgIG5ld1N5bltpXSA9IHN5bnRoZXNpemVkX1tpXTsKLSAgICB9Ci0gICAgZnJlZSgoY2hhciopKGluc3RhbmNlc18pKTsKLSAgICBmcmVlKChjaGFyKikocGluc18pKTsKLSAgICBmcmVlKG11c3RzXyk7Ci0gICAgZnJlZShzeW50aGVzaXplZF8pOwotICB9Ci0KLSAgaW5zdGFuY2VzXyA9IG5ld0luc3RhbmNlczsKLSAgcGluc18gPSBuZXdQaW5zOwotICBtdXN0c18gPSBuZXdNdXN0czsKLSAgc3ludGhlc2l6ZWRfID0gbmV3U3luOwotICBwaW5zQWxsb2NhdGVkXyA9IHNpemU7Ci19Ci0KLQotdm9pZCBkZWZpTmV0OjpidW1wUHJvcHMobG9uZyBsb25nIHNpemUpIHsKLSAgY2hhcioqICBuZXdOYW1lcyA9IChjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikqc2l6ZSk7Ci0gIGNoYXIqKiAgbmV3VmFsdWVzID0gKGNoYXIqKiltYWxsb2Moc2l6ZW9mKGNoYXIqKSpzaXplKTsKLSAgZG91YmxlKiBuZXdEVmFsdWVzID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpKnNpemUpOwotICBjaGFyKiAgIG5ld1R5cGVzID0gKGNoYXIqKW1hbGxvYyhzaXplb2YoY2hhcikqc2l6ZSk7Ci0gIGxvbmcgbG9uZyBpOwotCi0gIGlmIChwcm9wTmFtZXNfKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bVByb3BzXzsgaSsrKSB7Ci0gICAgICBuZXdOYW1lc1tpXSA9IHByb3BOYW1lc19baV07Ci0gICAgICBuZXdWYWx1ZXNbaV0gPSBwcm9wVmFsdWVzX1tpXTsKLSAgICAgIG5ld0RWYWx1ZXNbaV0gPSBwcm9wRFZhbHVlc19baV07Ci0gICAgICBuZXdUeXBlc1tpXSA9IHByb3BUeXBlc19baV07Ci0gICAgfQotICAgIGZyZWUoKGNoYXIqKShwcm9wTmFtZXNfKSk7Ci0gICAgZnJlZSgoY2hhciopKHByb3BWYWx1ZXNfKSk7Ci0gICAgZnJlZSgoY2hhciopKHByb3BEVmFsdWVzXykpOwotICAgIGZyZWUoKGNoYXIqKShwcm9wVHlwZXNfKSk7Ci0gIH0KLQotICBwcm9wTmFtZXNfID0gbmV3TmFtZXM7Ci0gIHByb3BWYWx1ZXNfID0gbmV3VmFsdWVzOwotICBwcm9wRFZhbHVlc18gPSBuZXdEVmFsdWVzOwotICBwcm9wVHlwZXNfID0gbmV3VHlwZXM7Ci0gIHByb3BzQWxsb2NhdGVkXyA9IHNpemU7Ci19Ci0KLQotdm9pZCBkZWZpTmV0OjpidW1wU3VibmV0cyhsb25nIGxvbmcgc2l6ZSkgewotICBkZWZpU3VibmV0KiogbmV3U3VibmV0cyA9IChkZWZpU3VibmV0KiopbWFsbG9jKHNpemVvZihkZWZpU3VibmV0Kikqc2l6ZSk7Ci0gIGludCBpOwotICBpZiAoc3VibmV0c18pIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtU3VibmV0c187IGkrKykgewotICAgICAgbmV3U3VibmV0c1tpXSA9IHN1Ym5ldHNfW2ldOwotICAgIH0KLSAgICBmcmVlKChjaGFyKikoc3VibmV0c18pKTsKLSAgfQotCi0gIHN1Ym5ldHNfID0gbmV3U3VibmV0czsKLSAgc3VibmV0c0FsbG9jYXRlZF8gPSBzaXplOwotfQotCi0KLXZvaWQgZGVmaU5ldDo6Y2xlYXIoKSB7Ci0gIGludCBpOwotCi0gIC8vIFdNRCAtLSB0aGlzIHdpbGwgYmUgcmVtb3ZlZCBieSB0aGUgbmV4dCByZWxlYXNlCi0gIGlzRml4ZWRfID0gMDsKLSAgaXNSb3V0ZWRfID0gMDsKLSAgaXNDb3Zlcl8gPSAwOwotCi0gIGhhc1dlaWdodF8gPSAwOwotICBoYXNDYXBfID0gMDsKLSAgaGFzRnJlcXVlbmN5XyA9IDA7Ci0gIGhhc1ZvbHRhZ2VfID0gMDsKLSAgeFRhbGtfID0gLTE7Ci0KLSAgaWYgKHZwaW5zXykgewotICAgIGZvciAoaSA9IDA7IGkgPCBudW1WcGluc187IGkrKykgewotICAgICAgZGVsZXRlIHZwaW5zX1tpXTsKLSAgICB9Ci0gICAgZnJlZSgoY2hhciopdnBpbnNfKTsKLSAgICB2cGluc18gID0gMDsKLSAgICBudW1WcGluc18gPSAwOwotICAgIHZwaW5zQWxsb2NhdGVkXyA9IDA7Ci0gIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgbnVtUHJvcHNfOyBpKyspIHsKLSAgICBmcmVlKHByb3BOYW1lc19baV0pOwotICAgIGZyZWUocHJvcFZhbHVlc19baV0pOwotICAgIHByb3BOYW1lc19baV0gPSAwOwotICAgIHByb3BWYWx1ZXNfW2ldID0gMDsKLSAgICBwcm9wRFZhbHVlc19baV0gPSAwOwotICB9Ci0gIG51bVByb3BzXyA9IDA7Ci0KLSAgZm9yIChpID0gMDsgaSA8IG51bVBpbnNfOyBpKyspIHsKLSAgICBmcmVlKGluc3RhbmNlc19baV0pOwotICAgIGZyZWUocGluc19baV0pOwotICAgIGluc3RhbmNlc19baV0gPSAwOwotICAgIHBpbnNfW2ldID0gMDsKLSAgICBtdXN0c19baV0gPSAwOwotICAgIHN5bnRoZXNpemVkX1tpXSA9IDA7Ci0gIH0KLSAgbnVtUGluc18gPSAwOwotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1TdWJuZXRzXzsgaSsrKSB7Ci0gICAgZGVsZXRlIHN1Ym5ldHNfW2ldOwotICAgIHN1Ym5ldHNfW2ldID0gMDsKLSAgfQotICBudW1TdWJuZXRzXyA9IDA7Ci0KLSAgaWYgKG5hbWVfKQotICAgICBuYW1lX1swXSA9ICdcMCc7Ci0KLSAgLy8gV01EIC0tIHRoaXMgd2lsbCBiZSByZW1vdmVkIGJ5IHRoZSBuZXh0IHJlbGVhc2UKLSAgaWYgKHBhdGhzXykgewotICAgIGZvciAoaSA9IDA7IGkgPCBudW1QYXRoc187IGkrKykgewotICAgICAgZGVsZXRlIHBhdGhzX1tpXTsKLSAgICB9Ci0KLSAgICBkZWxldGUgW10gcGF0aHNfOwotICAgIHBhdGhzXyA9IDA7Ci0gICAgbnVtUGF0aHNfID0gMDsKLSAgICBwYXRoc0FsbG9jYXRlZF8gPSAwOwotICB9Ci0KLSAgLy8gNS40LjEKLSAgZml4ZWRidW1wXyA9IDA7Ci0KLSAgaWYgKHNvdXJjZV8pIHsgZnJlZShzb3VyY2VfKTsgc291cmNlXyA9IDA7IH0KLSAgaWYgKHBhdHRlcm5fKSB7IGZyZWUocGF0dGVybl8pOyBwYXR0ZXJuXyA9IDA7IH0KLSAgaWYgKG9yaWdpbmFsXykgeyBmcmVlKG9yaWdpbmFsXyk7IG9yaWdpbmFsXyA9IDA7IH0KLSAgaWYgKHVzZV8pIHsgZnJlZSh1c2VfKTsgdXNlXyA9IDA7IH0KLSAgaWYgKG5vbkRlZmF1bHRSdWxlXykgeyBmcmVlKG5vbkRlZmF1bHRSdWxlXyk7Ci0gICAgICAgICAgICBub25EZWZhdWx0UnVsZV8gPSAwOyB9Ci0gIHN0eWxlXyA9IDA7Ci0gCi0gIGlmIChudW1XaXJlc18pIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtV2lyZXNfOyBpKyspIHsKLSAgICAgIGRlbGV0ZSB3aXJlc19baV07Ci0gICAgICB3aXJlc19baV0gPSAwOwotICAgIH0KLSAgICBmcmVlKChjaGFyKikod2lyZXNfKSk7Ci0gICAgd2lyZXNfID0gMDsKLSAgICBudW1XaXJlc18gPSAwOwotICAgIHdpcmVzQWxsb2NhdGVkXyA9IDA7Ci0gIH0KLQotICBpZiAobnVtU2hpZWxkc18pIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtU2hpZWxkc187IGkrKykgewotICAgICAgZGVsZXRlIHNoaWVsZHNfW2ldOwotICAgICAgc2hpZWxkc19baV0gPSAwOwotICAgIH0KLSAgICBudW1TaGllbGRzXyA9IDA7Ci0gICAgc2hpZWxkc0FsbG9jYXRlZF8gPSAwOwotICB9Ci0KLSAgaWYgKG51bU5vU2hpZWxkc18pIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTm9TaGllbGRzXzsgaSsrKSB7Ci0gICAgICBkZWxldGUgc2hpZWxkc19baV07Ci0gICAgICBzaGllbGRzX1tpXSA9IDA7Ci0gICAgfQotICAgIG51bU5vU2hpZWxkc18gPSAwOwotICAgIHNoaWVsZHNBbGxvY2F0ZWRfID0gMDsKLSAgfQotICBpZiAoc2hpZWxkc18pCi0gICAgZnJlZSgoY2hhciopKHNoaWVsZHNfKSk7Ci0KLSAgc2hpZWxkc18gPSAwOwotCi0gIGlmIChudW1XaWR0aHNfKSB7Ci0gICBmb3IgKGkgPSAwOyBpIDwgbnVtV2lkdGhzXzsgaSsrKQotICAgICBmcmVlKHdsYXllcnNfW2ldKTsKLSAgbnVtV2lkdGhzXyA9IDA7Ci0gIH0KLQotICBpZiAobnVtU3BhY2luZ18pIHsKLSAgIGZvciAoaSA9IDA7IGkgPCBudW1TcGFjaW5nXzsgaSsrKQotICAgICBmcmVlKHNsYXllcnNfW2ldKTsKLSAgbnVtU3BhY2luZ18gPSAwOwotICB9Ci0KLSAgaWYgKG51bVNoaWVsZE5ldF8pIHsKLSAgIGZvciAoaSA9IDA7IGkgPCBudW1TaGllbGROZXRfOyBpKyspCi0gICAgIGZyZWUoc2hpZWxkTmV0X1tpXSk7Ci0gICBudW1TaGllbGROZXRfID0gMDsKLSAgfQotCi0gIGlmIChwb2x5Z29uTmFtZXNfKSB7Ci0gICAgc3RydWN0IGRlZmlQb2ludHMqIHA7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bVBvbHlzXzsgaSsrKSB7Ci0gICAgICBpZiAocG9seWdvbk5hbWVzX1tpXSl7Ci0gICAgICBmcmVlKChjaGFyKikocG9seWdvbk5hbWVzX1tpXSkpOwotICAgICAgfQotICAgICAgaWYgKHBvbHlSb3V0ZVN0YXR1c19baV0pIHsKLSAgICAgIGZyZWUoKGNoYXIqKShwb2x5Um91dGVTdGF0dXNfW2ldKSk7Ci0gICAgICB9Ci0gICAgICBpZiAocG9seVNoYXBlVHlwZXNfW2ldKSB7Ci0gICAgICBmcmVlKChjaGFyKikocG9seVNoYXBlVHlwZXNfW2ldKSk7Ci0gICAgICB9Ci0gICAgICBpZiAocG9seVJvdXRlU3RhdHVzU2hpZWxkTmFtZXNfW2ldKSB7Ci0gICAgICAgICAgZnJlZSgoY2hhciopKHBvbHlSb3V0ZVN0YXR1c1NoaWVsZE5hbWVzX1tpXSkpOwotICAgICAgfQotICAgICAgcCA9IHBvbHlnb25zX1tpXTsKLSAgICAgIGZyZWUoKGNoYXIqKShwLT54KSk7Ci0gICAgICBmcmVlKChjaGFyKikocC0+eSkpOwotICAgICAgZnJlZSgoY2hhciopKHBvbHlnb25zX1tpXSkpOwotICAgIH0KLSAgICBmcmVlKChjaGFyKikocG9seWdvbk5hbWVzXykpOwotICAgIGZyZWUoKGNoYXIqKShwb2x5Z29uc18pKTsKLSAgICBmcmVlKChjaGFyKikocG9seU1hc2tzXykpOwotICAgIGZyZWUoKGNoYXIqKShwb2x5Um91dGVTdGF0dXNfKSk7Ci0gICAgZnJlZSgoY2hhciopKHBvbHlTaGFwZVR5cGVzXykpOwotICAgIGZyZWUoKGNoYXIqKShwb2x5Um91dGVTdGF0dXNTaGllbGROYW1lc18pKTsKLSAgICBwb2x5Z29uTmFtZXNfID0gMDsKLSAgICBwb2x5Z29uc18gPSAwOwotICAgIHBvbHlNYXNrc18gPSAwOwotICAgIHBvbHlSb3V0ZVN0YXR1c18gPSAwOwotICAgIHBvbHlTaGFwZVR5cGVzXyA9IDA7Ci0gICAgcG9seVJvdXRlU3RhdHVzU2hpZWxkTmFtZXNfID0gMDsKLSAgfQotICBudW1Qb2x5c18gPSAwOwotICBwb2x5c0FsbG9jYXRlZF8gPSAwOwotCi0gIGlmIChyZWN0TmFtZXNfKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bVJlY3RzXzsgaSsrKSB7Ci0gICAgICBpZiAocmVjdE5hbWVzX1tpXSkgeyAKLSAgICAgIGZyZWUgKChjaGFyKikocmVjdE5hbWVzX1tpXSkpOwotICAgICAgfQotICAgICAgaWYgKHJlY3RSb3V0ZVN0YXR1c19baV0pIHsgCi0gICAgICBmcmVlICgoY2hhciopKHJlY3RSb3V0ZVN0YXR1c19baV0pKTsKLSAgICAgIH0KLSAgICAgIGlmIChyZWN0Um91dGVTdGF0dXNTaGllbGROYW1lc19baV0pIHsKLSAgICAgICAgICBmcmVlICgoY2hhciopKHJlY3RSb3V0ZVN0YXR1c1NoaWVsZE5hbWVzX1tpXSkpOwotICAgICAgfQotICAgICAgaWYgKHJlY3RTaGFwZVR5cGVzX1tpXSkgeyAKLSAgICAgIGZyZWUgKChjaGFyKikocmVjdFNoYXBlVHlwZXNfW2ldKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGZyZWUoKGNoYXIqKShyZWN0TmFtZXNfKSk7Ci0gICAgZnJlZSgoY2hhciopKHhsXykpOwotICAgIGZyZWUoKGNoYXIqKSh5bF8pKTsKLSAgICBmcmVlKChjaGFyKikoeGhfKSk7Ci0gICAgZnJlZSgoY2hhciopKHloXykpOwotICAgIGZyZWUoKGNoYXIqKShyZWN0TWFza3NfKSk7Ci0gICAgZnJlZSgoY2hhciopKHJlY3RSb3V0ZVN0YXR1c18pKTsKLSAgICBmcmVlKChjaGFyKikocmVjdFJvdXRlU3RhdHVzU2hpZWxkTmFtZXNfKSk7Ci0gICAgZnJlZSgoY2hhciopKHJlY3RTaGFwZVR5cGVzXykpOwotICB9Ci0gIHJlY3ROYW1lc18gPSAwOwotICByZWN0Um91dGVTdGF0dXNfID0gMDsKLSAgcmVjdFNoYXBlVHlwZXNfID0gMDsKLSAgcmVjdFJvdXRlU3RhdHVzU2hpZWxkTmFtZXNfID0gMDsKLSAgbnVtUmVjdHNfID0gMDsKLSAgcmVjdHNBbGxvY2F0ZWRfID0gMDsKLSAgeGxfID0gMDsKLSAgeWxfID0gMDsKLSAgeGhfID0gMDsKLSAgeWhfID0gMDsKLSAgcmVjdE1hc2tzXyA9IDA7Ci0KLSAgaWYgKHZpYU5hbWVzXykgewotICAgICAgc3RydWN0IGRlZmlQb2ludHMqIHA7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1QdHNfOyBpKyspIHsKLSAgICAgICAgICBwID0gdmlhUHRzX1tpXTsKLSAgICAgICAgICBmcmVlKChjaGFyKikocC0+eCkpOwotICAgICAgICAgIGZyZWUoKGNoYXIqKShwLT55KSk7Ci0gICAgICAgICAgZnJlZSgoY2hhciopKHZpYVB0c19baV0pKTsKLSAgICAgIGlmICh2aWFOYW1lc19baV0pIHsKLSAgICAgICAgICBmcmVlICgoY2hhciopKHZpYU5hbWVzX1tpXSkpOwotICAgICAgfQotICAgICAgaWYgKHZpYVJvdXRlU3RhdHVzX1tpXSkgewotICAgICAgICAgIGZyZWUgKChjaGFyKikodmlhUm91dGVTdGF0dXNfW2ldKSk7Ci0gICAgICB9Ci0gICAgICBpZiAodmlhU2hhcGVUeXBlc19baV0pIHsKLSAgICAgICAgICBmcmVlICgoY2hhciopKHZpYVNoYXBlVHlwZXNfW2ldKSk7Ci0gICAgICB9Ci0gICAgICAgICAgaWYgKHZpYVJvdXRlU3RhdHVzU2hpZWxkTmFtZXNfW2ldKSB7Ci0gICAgICAgICAgICAgIGZyZWUgKChjaGFyKikodmlhUm91dGVTdGF0dXNTaGllbGROYW1lc19baV0pKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBmcmVlKChjaGFyKikodmlhTmFtZXNfKSk7Ci0gICAgICBmcmVlKChjaGFyKikodmlhUHRzXykpOwotICAgICAgZnJlZSgoY2hhciopKHZpYU1hc2tzXykpOwotICAgICAgZnJlZSgoY2hhciopKHZpYU9yaWVudHNfKSk7Ci0gICAgICBmcmVlKChjaGFyKikodmlhUm91dGVTdGF0dXNfKSk7Ci0gICAgICBmcmVlKChjaGFyKikodmlhU2hhcGVUeXBlc18pKTsKLSAgICAgIGZyZWUoKGNoYXIqKSh2aWFSb3V0ZVN0YXR1c1NoaWVsZE5hbWVzXykpOwotICAgICAgdmlhTmFtZXNfID0gMDsKLSAgICAgIHZpYVB0c18gPSAwOwotICAgICAgdmlhUm91dGVTdGF0dXNfID0gMDsKLSAgICAgIHZpYVNoYXBlVHlwZXNfID0gMDsKLSAgICAgIHZpYVJvdXRlU3RhdHVzU2hpZWxkTmFtZXNfID0gMCA7Ci0gIH0KLSAgbnVtUHRzXyA9IDA7Ci0gIHB0c0FsbG9jYXRlZF8gPSAwOwotICB2aWFPcmllbnRzXyA9IDA7Ci0gIHZpYU1hc2tzXyA9IDA7Ci19Ci0KLXZvaWQgZGVmaU5ldDo6Y2xlYXJSZWN0UG9seU5QYXRoKCkgewotICBpbnQgaTsKLQotICBpZiAocGF0aHNfKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bVBhdGhzXzsgaSsrKSB7Ci0gICAgICBkZWxldGUgcGF0aHNfW2ldOwotICAgIH0KLSAgICBudW1QYXRoc18gPSAwOwotICB9Ci0KLSAgY2xlYXJSZWN0UG9seSgpOwotCi19Ci0KLXZvaWQgZGVmaU5ldDo6Y2xlYXJSZWN0UG9seSgpIHsKLSAgaW50IGk7Ci0KLSAgaWYgKHBvbHlnb25OYW1lc18pIHsKLSAgICBzdHJ1Y3QgZGVmaVBvaW50cyogcDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUG9seXNfOyBpKyspIHsKLSAgICAgIGlmIChwb2x5Z29uTmFtZXNfW2ldKXsKLSAgICAgIGZyZWUoKGNoYXIqKShwb2x5Z29uTmFtZXNfW2ldKSk7Ci0gICAgICB9Ci0gICAgICBpZiAocG9seVJvdXRlU3RhdHVzX1tpXSkgewotICAgICAgZnJlZSgoY2hhciopKHBvbHlSb3V0ZVN0YXR1c19baV0pKTsKLSAgICAgIH0KLSAgICAgIGlmIChwb2x5U2hhcGVUeXBlc19baV0pIHsKLSAgICAgIGZyZWUoKGNoYXIqKShwb2x5U2hhcGVUeXBlc19baV0pKTsKLSAgICAgIH0KLSAgICAgIGlmIChwb2x5Um91dGVTdGF0dXNTaGllbGROYW1lc19baV0pIHsKLSAgICAgICAgICBmcmVlKChjaGFyKikocG9seVJvdXRlU3RhdHVzU2hpZWxkTmFtZXNfW2ldKSk7Ci0gICAgICB9Ci0gICAgICBwID0gcG9seWdvbnNfW2ldOwotICAgICAgZnJlZSgoY2hhciopKHAtPngpKTsKLSAgICAgIGZyZWUoKGNoYXIqKShwLT55KSk7Ci0gICAgICBmcmVlKChjaGFyKikocG9seWdvbnNfW2ldKSk7Ci0gICAgfQotICAgIGZyZWUoKGNoYXIqKShwb2x5TWFza3NfKSk7Ci0gICAgZnJlZSgoY2hhciopKHBvbHlnb25OYW1lc18pKTsKLSAgICBmcmVlKChjaGFyKikocG9seWdvbnNfKSk7Ci0gICAgZnJlZSgoY2hhciopKHBvbHlSb3V0ZVN0YXR1c18pKTsKLSAgICBmcmVlKChjaGFyKikocG9seVNoYXBlVHlwZXNfKSk7Ci0gICAgZnJlZSgoY2hhciopKHBvbHlSb3V0ZVN0YXR1c1NoaWVsZE5hbWVzXykpOwotICB9Ci0gIG51bVBvbHlzXyA9IDA7Ci0gIHBvbHlzQWxsb2NhdGVkXyA9IDA7Ci0gIHBvbHlNYXNrc18gPSAwOwotICBwb2x5Z29uTmFtZXNfID0gMDsKLSAgcG9seVJvdXRlU3RhdHVzXz0gMDsKLSAgcG9seVNoYXBlVHlwZXNfPSAwOwotICBwb2x5Um91dGVTdGF0dXNTaGllbGROYW1lc18gPSAwOwotICBwb2x5Z29uc18gPSAwOwotCi0gIGlmIChyZWN0TmFtZXNfKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bVJlY3RzXzsgaSsrKSB7Ci0gICAgICBpZiAocmVjdE5hbWVzX1tpXSl7Ci0gICAgICBmcmVlKChjaGFyKikocmVjdE5hbWVzX1tpXSkpOwotICAgICAgfQotICAgICAgaWYgKHJlY3RSb3V0ZVN0YXR1c19baV0pewotICAgICAgZnJlZSgoY2hhciopKHJlY3RSb3V0ZVN0YXR1c19baV0pKTsKLSAgICAgIH0KLSAgICAgIGlmIChyZWN0U2hhcGVUeXBlc19baV0pIHsKLSAgICAgIGZyZWUoKGNoYXIqKShyZWN0U2hhcGVUeXBlc19baV0pKTsKLSAgICAgIH0KLSAgICAgIGlmIChyZWN0Um91dGVTdGF0dXNTaGllbGROYW1lc19baV0pIHsKLSAgICAgICAgICBmcmVlKChjaGFyKikocmVjdFJvdXRlU3RhdHVzU2hpZWxkTmFtZXNfW2ldKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGZyZWUoKGNoYXIqKShyZWN0TWFza3NfKSk7Ci0gICAgZnJlZSgoY2hhciopKHJlY3ROYW1lc18pKTsKLSAgICBmcmVlKChjaGFyKikoeGxfKSk7Ci0gICAgZnJlZSgoY2hhciopKHlsXykpOwotICAgIGZyZWUoKGNoYXIqKSh4aF8pKTsKLSAgICBmcmVlKChjaGFyKikoeWhfKSk7Ci0gICAgZnJlZSgoY2hhciopKHJlY3RTaGFwZVR5cGVzXykpOwotICAgIGZyZWUoKGNoYXIqKShyZWN0Um91dGVTdGF0dXNfKSk7Ci0gICAgZnJlZSgoY2hhciopKHJlY3RSb3V0ZVN0YXR1c1NoaWVsZE5hbWVzXykpOwotICB9Ci0gIHJlY3ROYW1lc18gPSAwOwotICByZWN0c0FsbG9jYXRlZF8gPSAwOwotICB4bF8gPSAwOwotICB5bF8gPSAwOwotICB4aF8gPSAwOwotICB5aF8gPSAwOwotICBudW1SZWN0c18gPSAwOwotICByZWN0TWFza3NfID0gMDsKLSAgcmVjdFJvdXRlU3RhdHVzXyA9IDA7Ci0gIHJlY3RTaGFwZVR5cGVzXyA9IDA7Ci0gIHJlY3RSb3V0ZVN0YXR1c1NoaWVsZE5hbWVzXz0wOwotfQotCi1pbnQgZGVmaU5ldDo6aGFzU291cmNlKCkgY29uc3QgewotICAgcmV0dXJuIHNvdXJjZV8gPyAxIDogMDsKLX0KLQotCi1pbnQgZGVmaU5ldDo6aGFzRml4ZWRidW1wKCkgY29uc3QgewotICAgcmV0dXJuIGZpeGVkYnVtcF8gPyAxIDogMDsKLX0KLQotCi1pbnQgZGVmaU5ldDo6aGFzRnJlcXVlbmN5KCkgY29uc3QgewotICByZXR1cm4gKGludCkoaGFzRnJlcXVlbmN5Xyk7Ci19Ci0KLQotaW50IGRlZmlOZXQ6Omhhc1BhdHRlcm4oKSBjb25zdCB7Ci0gICByZXR1cm4gcGF0dGVybl8gPyAxIDogMDsKLX0KLQotCi1pbnQgZGVmaU5ldDo6aGFzT3JpZ2luYWwoKSBjb25zdCB7Ci0gICByZXR1cm4gb3JpZ2luYWxfID8gMSA6IDA7Ci19Ci0KLQotaW50IGRlZmlOZXQ6Omhhc0NhcCgpIGNvbnN0IHsKLSAgcmV0dXJuIChpbnQpKGhhc0NhcF8pOwotfQotCi0KLWludCBkZWZpTmV0OjpoYXNVc2UoKSBjb25zdCB7Ci0gICByZXR1cm4gdXNlXyA/IDEgOiAwOwotfQotCi0KLWludCBkZWZpTmV0OjpoYXNTdHlsZSgpIGNvbnN0IHsKLSAgIHJldHVybiBzdHlsZV8gPyAxIDogMDsKLX0KLQotCi1pbnQgZGVmaU5ldDo6aGFzWFRhbGsoKSBjb25zdCB7Ci0gICByZXR1cm4gKHhUYWxrXyAhPSAtMSkgPyAxIDogMDsKLX0KLQotCi1pbnQgZGVmaU5ldDo6aGFzTm9uRGVmYXVsdFJ1bGUoKSBjb25zdCB7Ci0gICByZXR1cm4gbm9uRGVmYXVsdFJ1bGVfID8gMSA6IDA7Ci19Ci0KLQotdm9pZCBkZWZpTmV0OjpzZXRTb3VyY2UoY29uc3QgY2hhciogdHlwKSB7Ci0gIGludCBsZW47Ci0gIGlmIChzb3VyY2VfKSBmcmVlKHNvdXJjZV8pOwotICBsZW4gPSBzdHJsZW4odHlwKSArIDE7Ci0gIHNvdXJjZV8gPSAoY2hhciopbWFsbG9jKGxlbik7Ci0gIHN0cmNweShzb3VyY2VfLCBkZWZEYXRhLT5ERUZDQVNFKHR5cCkpOwotfQotCi0KLXZvaWQgZGVmaU5ldDo6c2V0Rml4ZWRidW1wKCkgewotICBmaXhlZGJ1bXBfID0gMTsKLX0KLQotCi12b2lkIGRlZmlOZXQ6OnNldEZyZXF1ZW5jeShkb3VibGUgZnJlcXVlbmN5KSB7Ci0gIGZyZXF1ZW5jeV8gPSBmcmVxdWVuY3k7Ci0gIGhhc0ZyZXF1ZW5jeV8gPSAxOwotfQotCi0KLXZvaWQgZGVmaU5ldDo6c2V0T3JpZ2luYWwoY29uc3QgY2hhciogdHlwKSB7Ci0gIGludCBsZW47Ci0gIGlmIChvcmlnaW5hbF8pIGZyZWUob3JpZ2luYWxfKTsKLSAgbGVuID0gc3RybGVuKHR5cCkgKyAxOwotICBvcmlnaW5hbF8gPSAoY2hhciopbWFsbG9jKGxlbik7Ci0gIHN0cmNweShvcmlnaW5hbF8sIGRlZkRhdGEtPkRFRkNBU0UodHlwKSk7Ci19Ci0KLQotdm9pZCBkZWZpTmV0OjpzZXRQYXR0ZXJuKGNvbnN0IGNoYXIqIHR5cCkgewotICBpbnQgbGVuOwotICBpZiAocGF0dGVybl8pIGZyZWUocGF0dGVybl8pOwotICBsZW4gPSBzdHJsZW4odHlwKSArIDE7Ci0gIHBhdHRlcm5fID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICBzdHJjcHkocGF0dGVybl8sIGRlZkRhdGEtPkRFRkNBU0UodHlwKSk7Ci19Ci0KLQotdm9pZCBkZWZpTmV0OjpzZXRDYXAoZG91YmxlIHcpIHsKLSAgY2FwXyA9IHc7Ci0gIGhhc0NhcF8gPSAxOwotfQotCi0KLXZvaWQgZGVmaU5ldDo6c2V0VXNlKGNvbnN0IGNoYXIqIHR5cCkgewotICBpbnQgbGVuOwotICBpZiAodXNlXykgZnJlZSh1c2VfKTsKLSAgbGVuID0gc3RybGVuKHR5cCkgKyAxOwotICB1c2VfID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICBzdHJjcHkodXNlXywgZGVmRGF0YS0+REVGQ0FTRSh0eXApKTsKLX0KLQotCi12b2lkIGRlZmlOZXQ6OnNldFN0eWxlKGludCBzdHlsZSkgewotICBzdHlsZV8gPSBzdHlsZTsKLX0KLQotCi12b2lkIGRlZmlOZXQ6OnNldE5vbkRlZmF1bHRSdWxlKGNvbnN0IGNoYXIqIHR5cCkgewotICBpbnQgbGVuOwotICBpZiAobm9uRGVmYXVsdFJ1bGVfKSBmcmVlKG5vbkRlZmF1bHRSdWxlXyk7Ci0gIGxlbiA9IHN0cmxlbih0eXApICsgMTsKLSAgbm9uRGVmYXVsdFJ1bGVfID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICBzdHJjcHkobm9uRGVmYXVsdFJ1bGVfLCBkZWZEYXRhLT5ERUZDQVNFKHR5cCkpOwotfQotCi0KLWNvbnN0IGNoYXIqIGRlZmlOZXQ6OnNvdXJjZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHNvdXJjZV87Ci19Ci0KLQotY29uc3QgY2hhciogZGVmaU5ldDo6b3JpZ2luYWwoKSBjb25zdCB7Ci0gIHJldHVybiBvcmlnaW5hbF87Ci19Ci0KLQotY29uc3QgY2hhciogZGVmaU5ldDo6cGF0dGVybigpIGNvbnN0IHsKLSAgcmV0dXJuIHBhdHRlcm5fOwotfQotCi0KLWRvdWJsZSBkZWZpTmV0OjpjYXAoKSBjb25zdCB7Ci0gIHJldHVybiAoaGFzQ2FwXyA/IGNhcF8gOiAwLjApOwotfQotCi0KLWRvdWJsZSBkZWZpTmV0OjpmcmVxdWVuY3koKSBjb25zdCB7Ci0gIHJldHVybiAoaGFzRnJlcXVlbmN5XyA/IGZyZXF1ZW5jeV8gOiAwLjApOwotfQotCi0KLWNvbnN0IGNoYXIqIGRlZmlOZXQ6OnVzZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHVzZV87Ci19Ci0KLQotaW50IGRlZmlOZXQ6OnN0eWxlKCkgY29uc3QgewotICByZXR1cm4gc3R5bGVfOwotfQotCi0KLWNvbnN0IGNoYXIqIGRlZmlOZXQ6OnNoaWVsZE5ldChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgcmV0dXJuIHNoaWVsZE5ldF9baW5kZXhdOwotfQotCi0KLWNvbnN0IGNoYXIqIGRlZmlOZXQ6Om5vbkRlZmF1bHRSdWxlKCkgY29uc3QgewotICByZXR1cm4gbm9uRGVmYXVsdFJ1bGVfOwotfQotCi0vLyBXTUQgLS0gdGhpcyB3aWxsIGJlIHJlbW92ZWQgYnkgdGhlIG5leHQgcmVsZWFzZQotdm9pZCBkZWZpTmV0OjpidW1wUGF0aHMobG9uZyBsb25nIHNpemUpIHsKLSAgbG9uZyBsb25nIGk7Ci0KLSAgZGVmaVBhdGgqKiBuZXdQYXRocyA9IG5ldyBkZWZpUGF0aCpbc2l6ZV07Ci0gCi0gIGZvciAoaSA9IDA7IGkgPCBudW1QYXRoc187IGkrKykKLSAgICBuZXdQYXRoc1tpXSA9IHBhdGhzX1tpXTsKLSAKLSAgZGVsZXRlIFtdIHBhdGhzXzsKLSAgcGF0aHNBbGxvY2F0ZWRfID0gc2l6ZTsKLSAgcGF0aHNfID0gbmV3UGF0aHM7Ci19Ci0gCi0vLyBXTUQgLS0gdGhpcyB3aWxsIGJlIHJlbW92ZWQgYnkgdGhlIG5leHQgcmVsZWFzZQotaW50IGRlZmlOZXQ6Om51bVBhdGhzKCkgY29uc3QgewotICByZXR1cm4gbnVtUGF0aHNfOwotfQotCi0gCi0vLyBXTUQgLS0gdGhpcyB3aWxsIGJlIHJlbW92ZWQgYnkgdGhlIG5leHQgcmVsZWFzZQotZGVmaVBhdGgqIGRlZmlOZXQ6OnBhdGgoaW50IGluZGV4KSB7Ci0gIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgbnVtUGF0aHNfKQotICAgIHJldHVybiBwYXRoc19baW5kZXhdOwotICByZXR1cm4gMDsKLX0KLQotCi1jb25zdCBkZWZpUGF0aCogZGVmaU5ldDo6cGF0aChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IG51bVBhdGhzXykKLSAgICAgICAgcmV0dXJuIHBhdGhzX1tpbmRleF07Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotaW50IGRlZmlOZXQ6Om51bVdpcmVzKCkgY29uc3QgewotICByZXR1cm4gbnVtV2lyZXNfOwotfQotCi0KLWRlZmlXaXJlKiBkZWZpTmV0Ojp3aXJlKGludCBpbmRleCkgewotICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IG51bVdpcmVzXykKLSAgICByZXR1cm4gd2lyZXNfW2luZGV4XTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotY29uc3QgZGVmaVdpcmUqIGRlZmlOZXQ6OndpcmUoaW50IGluZGV4KSBjb25zdCB7Ci0gICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBudW1XaXJlc18pCi0gICAgICAgIHJldHVybiB3aXJlc19baW5kZXhdOwotICAgIHJldHVybiAwOwotfQotCi0KLXZvaWQgZGVmaU5ldDo6YnVtcFNoaWVsZE5ldHMobG9uZyBsb25nIHNpemUpIHsKLSAgY2hhcioqIG5ld1NoaWVsZE5ldHMgPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKnNpemUpOwotICBsb25nIGxvbmcgaTsKLSAKLSAgaWYgKHNoaWVsZE5ldF8pIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgc2hpZWxkTmV0c0FsbG9jYXRlZF87IGkrKykgewotICAgICAgbmV3U2hpZWxkTmV0c1tpXSA9IHNoaWVsZE5ldF9baV07Ci0gICAgfQotICAgIGZyZWUoKGNoYXIqKShzaGllbGROZXRfKSk7Ci0gIH0KLSAKLSAgc2hpZWxkTmV0XyA9IG5ld1NoaWVsZE5ldHM7Ci0gIHNoaWVsZE5ldHNBbGxvY2F0ZWRfID0gc2l6ZTsKLX0KLQotCi1pbnQgZGVmaU5ldDo6bnVtU2hpZWxkcygpIGNvbnN0IHsKLSAgcmV0dXJuIG51bVNoaWVsZHNfOwotfQotCi0KLWRlZmlTaGllbGQqIGRlZmlOZXQ6OnNoaWVsZChpbnQgaW5kZXgpIHsKLSAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBudW1TaGllbGRzXykKLSAgICByZXR1cm4gc2hpZWxkc19baW5kZXhdOwotICByZXR1cm4gMDsKLX0KLQotCi1jb25zdCBkZWZpU2hpZWxkKiBkZWZpTmV0OjpzaGllbGQoaW50IGluZGV4KSBjb25zdCB7Ci0gICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBudW1TaGllbGRzXykKLSAgICAgICAgcmV0dXJuIHNoaWVsZHNfW2luZGV4XTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGRlZmlOZXQ6Om51bU5vU2hpZWxkcygpIGNvbnN0IHsKLSAgcmV0dXJuIG51bU5vU2hpZWxkc187Ci19Ci0KLQotZGVmaVNoaWVsZCogZGVmaU5ldDo6bm9TaGllbGQoaW50IGluZGV4KSB7Ci0gIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgbnVtTm9TaGllbGRzXykKLSAgICByZXR1cm4gc2hpZWxkc19baW5kZXhdOwotICByZXR1cm4gMDsKLX0KLQotY29uc3QgZGVmaVNoaWVsZCogZGVmaU5ldDo6bm9TaGllbGQoaW50IGluZGV4KSBjb25zdCB7Ci0gICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBudW1Ob1NoaWVsZHNfKQotICAgICAgICByZXR1cm4gc2hpZWxkc19baW5kZXhdOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgZGVmaU5ldDo6aGFzVm9sdGFnZSgpIGNvbnN0IHsKLSAgcmV0dXJuIChpbnQpKGhhc1ZvbHRhZ2VfKTsKLX0KLQotCi1kb3VibGUgZGVmaU5ldDo6dm9sdGFnZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHZvbHRhZ2VfOwotfQotCi0KLWludCBkZWZpTmV0OjpudW1XaWR0aFJ1bGVzKCkgY29uc3QgewotICByZXR1cm4gbnVtV2lkdGhzXzsKLX0KLQotCi1pbnQgZGVmaU5ldDo6bnVtU3BhY2luZ1J1bGVzKCkgY29uc3QgewotICByZXR1cm4gbnVtU3BhY2luZ187Ci19Ci0KLQotaW50IGRlZmlOZXQ6Omhhc1dpZHRoUnVsZXMoKSBjb25zdCB7Ci0gIHJldHVybiBudW1XaWR0aHNfOwotfQotCi0KLWludCBkZWZpTmV0OjpoYXNTcGFjaW5nUnVsZXMoKSBjb25zdCB7Ci0gIHJldHVybiBudW1TcGFjaW5nXzsKLX0KLQotCi12b2lkIGRlZmlOZXQ6OnNldFhUYWxrKGludCBpKSB7Ci0gIHhUYWxrXyA9IGk7Ci19Ci0KLQotaW50IGRlZmlOZXQ6OlhUYWxrKCkgY29uc3QgewotICByZXR1cm4geFRhbGtfOwotfQotCi0KLXZvaWQgZGVmaU5ldDo6YWRkVnBpbihjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIGRlZmlWcGluKiB2cDsKLSAgaWYgKG51bVZwaW5zXyA9PSB2cGluc0FsbG9jYXRlZF8pIHsKLSAgICBkZWZpVnBpbioqIGFycmF5OwotICAgIGludCBpOwotICAgIHZwaW5zQWxsb2NhdGVkXyA9IHZwaW5zQWxsb2NhdGVkXyA/Ci0gICAgICAgICAgdnBpbnNBbGxvY2F0ZWRfICogMiA6IDIgOwotICAgIGFycmF5ID0gKGRlZmlWcGluKiopbWFsbG9jKHNpemVvZihkZWZpVnBpbiopKnZwaW5zQWxsb2NhdGVkXyk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bVZwaW5zXzsgaSsrKQotICAgICAgYXJyYXlbaV0gPSB2cGluc19baV07Ci0gICAgaWYgKHZwaW5zXykgZnJlZSgoY2hhciopKHZwaW5zXykpOwotICAgIHZwaW5zXyA9IGFycmF5OwotICB9Ci0gIHZwID0gdnBpbnNfW251bVZwaW5zX10gPSAgbmV3IGRlZmlWcGluKGRlZkRhdGEpOwotICBudW1WcGluc18gKz0gMTsKLSAgdnAtPkluaXQobmFtZSk7Ci19Ci0KLQotdm9pZCBkZWZpTmV0OjphZGRWcGluTGF5ZXIoY29uc3QgY2hhciogbmFtZSkgewotICBkZWZpVnBpbiogdnAgPSB2cGluc19bbnVtVnBpbnNfLTFdOwotICB2cC0+c2V0TGF5ZXIobmFtZSk7Ci19Ci0KLQotdm9pZCBkZWZpTmV0OjphZGRWcGluTG9jKGNvbnN0IGNoYXIqIHN0YXR1cywgaW50IHgsIGludCB5LCBpbnQgb3JpZW50KSB7Ci0gIGRlZmlWcGluKiB2cCA9IHZwaW5zX1tudW1WcGluc18tMV07Ci0gIHZwLT5zZXRTdGF0dXMoKnN0YXR1cyk7Ci0gIHZwLT5zZXRMb2MoeCx5KTsKLSAgdnAtPnNldE9yaWVudChvcmllbnQpOwotfQotCi0KLXZvaWQgZGVmaU5ldDo6YWRkVnBpbkJvdW5kcyhpbnQgeGwsIGludCB5bCwgaW50IHhoLCBpbnQgeWgpIHsKLSAgZGVmaVZwaW4qIHZwID0gdnBpbnNfW251bVZwaW5zXy0xXTsKLSAgdnAtPnNldEJvdW5kcyh4bCwgeWwsIHhoLCB5aCk7Ci19Ci0KLQotaW50IGRlZmlOZXQ6Om51bVZwaW5zKCkgY29uc3QgewotICByZXR1cm4gbnVtVnBpbnNfOwotfQotCi0KLWRlZmlWcGluKiBkZWZpTmV0Ojp2cGluKGludCBpbmRleCkgewotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVZwaW5zXykgcmV0dXJuIDA7Ci0gIHJldHVybiB2cGluc19baW5kZXhdOwotfQotCi0KLWNvbnN0IGRlZmlWcGluKiBkZWZpTmV0Ojp2cGluKGludCBpbmRleCkgY29uc3QgewotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtVnBpbnNfKSByZXR1cm4gMDsKLSAgICByZXR1cm4gdnBpbnNfW2luZGV4XTsKLX0KLQotdm9pZCBkZWZpTmV0OjpzcGFjaW5nUnVsZShpbnQgaW5kZXgsIGNoYXIqKiBsYXllciwgZG91YmxlKiBkaXN0LAotICAgICBkb3VibGUqIGxlZnQsIGRvdWJsZSogcmlnaHQpIGNvbnN0IHsKLSAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBudW1TcGFjaW5nXykgewotICAgIGlmIChsYXllcikgKmxheWVyID0gc2xheWVyc19baW5kZXhdOwotICAgIGlmIChkaXN0KSAqZGlzdCA9IHNkaXN0X1tpbmRleF07Ci0gICAgaWYgKGxlZnQpICpsZWZ0ID0gc2xlZnRfW2luZGV4XTsKLSAgICBpZiAocmlnaHQpICpyaWdodCA9IHNyaWdodF9baW5kZXhdOwotICB9Ci19Ci0KLQotdm9pZCBkZWZpTmV0Ojp3aWR0aFJ1bGUoaW50IGluZGV4LCBjaGFyKiogbGF5ZXIsIGRvdWJsZSogZGlzdCkgY29uc3QgewotICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IG51bVdpZHRoc18pIHsKLSAgICBpZiAobGF5ZXIpICpsYXllciA9IHdsYXllcnNfW2luZGV4XTsKLSAgICBpZiAoZGlzdCkgKmRpc3QgPSB3ZGlzdF9baW5kZXhdOwotICB9Ci19Ci0KLQotdm9pZCBkZWZpTmV0OjpzZXRWb2x0YWdlKGRvdWJsZSB2KSB7Ci0gIHZvbHRhZ2VfID0gdjsKLSAgaGFzVm9sdGFnZV8gPSAxOwotfQotCi0KLXZvaWQgZGVmaU5ldDo6c2V0V2lkdGgoY29uc3QgY2hhciogbGF5ZXIsIGRvdWJsZSBkKSB7Ci0gIGludCBsZW4gPSBzdHJsZW4obGF5ZXIpICsgMTsKLSAgY2hhciogbCA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgc3RyY3B5KGwsIGRlZkRhdGEtPkRFRkNBU0UobGF5ZXIpKTsKLQotICBpZiAobnVtV2lkdGhzXyA+PSB3aWR0aHNBbGxvY2F0ZWRfKSB7Ci0gICAgaW50IGk7Ci0gICAgY2hhcioqIG5sOwotICAgIGRvdWJsZSogbmQ7Ci0gICAgd2lkdGhzQWxsb2NhdGVkXyA9IHdpZHRoc0FsbG9jYXRlZF8gPwotICAgICAgIHdpZHRoc0FsbG9jYXRlZF8gKiAyIDogNCA7Ci0gICAgbmwgPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopICogd2lkdGhzQWxsb2NhdGVkXyk7Ci0gICAgbmQgPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiB3aWR0aHNBbGxvY2F0ZWRfKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtV2lkdGhzXzsgaSsrKSB7Ci0gICAgICBubFtpXSA9IHdsYXllcnNfW2ldOwotICAgICAgbmRbaV0gPSB3ZGlzdF9baV07Ci0gICAgfQotICAgIGZyZWUoKGNoYXIqKSh3bGF5ZXJzXykpOwotICAgIGZyZWUoKGNoYXIqKSh3ZGlzdF8pKTsKLSAgICB3bGF5ZXJzXyA9IG5sOwotICAgIHdkaXN0XyA9IG5kOwotICB9Ci0KLSAgd2xheWVyc19bbnVtV2lkdGhzX10gPSBsOwotICB3ZGlzdF9bbnVtV2lkdGhzX10gPSBkOwotICAobnVtV2lkdGhzXykrKzsKLX0KLQotCi12b2lkIGRlZmlOZXQ6OnNldFNwYWNpbmcoY29uc3QgY2hhciogbGF5ZXIsIGRvdWJsZSBkKSB7Ci0gIGludCBsZW4gPSBzdHJsZW4obGF5ZXIpICsgMTsKLSAgY2hhciogbCA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgc3RyY3B5KGwsIGRlZkRhdGEtPkRFRkNBU0UobGF5ZXIpKTsKLQotICBpZiAobnVtU3BhY2luZ18gPj0gc3BhY2luZ0FsbG9jYXRlZF8pIHsKLSAgICBpbnQgaTsKLSAgICBjaGFyKiogbmw7Ci0gICAgZG91YmxlKiBuZDsKLSAgICBkb3VibGUqIG4xOwotICAgIGRvdWJsZSogbjI7Ci0gICAgc3BhY2luZ0FsbG9jYXRlZF8gPSBzcGFjaW5nQWxsb2NhdGVkXyA/Ci0gICAgICAgc3BhY2luZ0FsbG9jYXRlZF8gKiAyIDogNCA7Ci0gICAgbmwgPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopICogc3BhY2luZ0FsbG9jYXRlZF8pOwotICAgIG5kID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpICogc3BhY2luZ0FsbG9jYXRlZF8pOwotICAgIG4xID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpICogc3BhY2luZ0FsbG9jYXRlZF8pOwotICAgIG4yID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpICogc3BhY2luZ0FsbG9jYXRlZF8pOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1TcGFjaW5nXzsgaSsrKSB7Ci0gICAgICBubFtpXSA9IHNsYXllcnNfW2ldOwotICAgICAgbmRbaV0gPSBzZGlzdF9baV07Ci0gICAgICBuMVtpXSA9IHNsZWZ0X1tpXTsKLSAgICAgIG4yW2ldID0gc3JpZ2h0X1tpXTsKLSAgICB9Ci0gICAgZnJlZSgoY2hhciopKHNsYXllcnNfKSk7Ci0gICAgZnJlZSgoY2hhciopKHNkaXN0XykpOwotICAgIGZyZWUoKGNoYXIqKShzbGVmdF8pKTsKLSAgICBmcmVlKChjaGFyKikoc3JpZ2h0XykpOwotICAgIHNsYXllcnNfID0gbmw7Ci0gICAgc2Rpc3RfID0gbmQ7Ci0gICAgc2xlZnRfID0gbjE7Ci0gICAgc3JpZ2h0XyA9IG4yOwotICB9Ci0KLSAgc2xheWVyc19bbnVtU3BhY2luZ19dID0gbDsKLSAgc2Rpc3RfW251bVNwYWNpbmdfXSA9IGQ7Ci0gIHNsZWZ0X1tudW1TcGFjaW5nX10gPSBkOwotICBzcmlnaHRfW251bVNwYWNpbmdfXSA9IGQ7Ci0gIChudW1TcGFjaW5nXykrKzsKLX0KLQotCi12b2lkIGRlZmlOZXQ6OnNldFJhbmdlKGRvdWJsZSBsZWZ0LCBkb3VibGUgcmlnaHQpIHsKLSAgLy8gVGhpcyBpcyBhbHdheXMgY2FsbGVkIHJpZ2h0IGFmdGVyIHNldFNwYWNpbmcuCi0gIHNsZWZ0X1tudW1TcGFjaW5nXy0xXSA9IGxlZnQ7Ci0gIHNyaWdodF9bbnVtU3BhY2luZ18tMV0gPSByaWdodDsKLX0KLQotLy8gNS42Ci12b2lkIGRlZmlOZXQ6OmFkZFBvbHlnb24oY29uc3QgY2hhciogbGF5ZXJOYW1lLCBkZWZpR2VvbWV0cmllcyogZ2VvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm5lZWRDYmssIGludCBjb2xvck1hc2ssCi0gICAgICAgICAgICAgY29uc3QgY2hhciogcm91dGVTdGF0dXMsCi0gICAgICAgICAgICAgY29uc3QgY2hhciogc2hhcGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHJvdXRlU3RhdHVzU2hpZWxkTmFtZSkgewotICBzdHJ1Y3QgZGVmaVBvaW50cyogcDsKLSAgaW50IHgsIHk7Ci0gIGludCBpOwotCi0gIC8vIFRoaXMgbWV0aG9kIHdpbGwgb25seSBjYWxsIGJ5IHNwZWNpYWxuZXQsIG5lZWQgdG8gY2hhbmdlIGlmIG5ldCBhbHNvCi0gIC8vIGNhbGxzIGl0LgotICAqbmVlZENiayA9IDA7Ci0gIGlmIChudW1Qb2x5c18gPT0gcG9seXNBbGxvY2F0ZWRfKSB7Ci0gICAgY2hhcioqIG5ld247Ci0gICAgY2hhcioqIG5ld1JTOwotICAgIGNoYXIqKiBuZXdTVDsKLSAgICBjaGFyKiogbmV3UlNOOwotICAgIGludCogbWFza247Ci0gICAgc3RydWN0IGRlZmlQb2ludHMqKiBwb2x5OwotICAgIHBvbHlzQWxsb2NhdGVkXyA9IChwb2x5c0FsbG9jYXRlZF8gPT0gMCkgPwotICAgICAgICAgIDEwMDAgOiBwb2x5c0FsbG9jYXRlZF8gKiAyOwotICAgIG5ld24gPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopICogcG9seXNBbGxvY2F0ZWRfKTsKLSAgICBuZXdSUyA9IChjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikgKiBwb2x5c0FsbG9jYXRlZF8pOwotICAgIG5ld1NUID0gKGNoYXIqKiltYWxsb2Moc2l6ZW9mKGNoYXIqKSAqIHBvbHlzQWxsb2NhdGVkXyk7Ci0gICAgbmV3UlNOID0gKGNoYXIqKiltYWxsb2Moc2l6ZW9mKGNoYXIqKSAqIHBvbHlzQWxsb2NhdGVkXyk7Ci0gICAgbWFza24gPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkgKiBwb2x5c0FsbG9jYXRlZF8pOwotICAgIHBvbHkgPSAoc3RydWN0IGRlZmlQb2ludHMqKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZWZpUG9pbnRzKikgKgotICAgICAgICAgICAgcG9seXNBbGxvY2F0ZWRfKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUG9seXNfOyBpKyspIHsKLSAgICAgIG5ld25baV0gPSBwb2x5Z29uTmFtZXNfW2ldOwotICAgICAgcG9seVtpXSA9IHBvbHlnb25zX1tpXTsKLSAgICAgIG1hc2tuW2ldID0gcG9seU1hc2tzX1tpXTsKLSAgICAgIG5ld1JTW2ldID0gcG9seVJvdXRlU3RhdHVzX1tpXTsKLSAgICAgIG5ld1NUW2ldID0gcG9seVNoYXBlVHlwZXNfW2ldOwotICAgICAgbmV3UlNOW2ldID0gcG9seVJvdXRlU3RhdHVzU2hpZWxkTmFtZXNfW2ldOwotCi0gICAgfQotICAgIGlmIChwb2x5Z29uc18pCi0gICAgICBmcmVlKChjaGFyKikocG9seWdvbnNfKSk7Ci0gICAgaWYgKHBvbHlnb25OYW1lc18pCi0gICAgICBmcmVlKChjaGFyKikocG9seWdvbk5hbWVzXykpOwotICAgIGlmIChwb2x5TWFza3NfKQotICAgICAgZnJlZSgoY2hhciopKHBvbHlNYXNrc18pKTsKLSAgICBpZiAocG9seVJvdXRlU3RhdHVzXykKLSAgICAgIGZyZWUoKGNoYXIqKShwb2x5Um91dGVTdGF0dXNfKSk7Ci0gICAgaWYgKHBvbHlTaGFwZVR5cGVzXykKLSAgICAgIGZyZWUoKGNoYXIqKShwb2x5U2hhcGVUeXBlc18pKTsKLSAgICBpZiAocG9seVJvdXRlU3RhdHVzU2hpZWxkTmFtZXNfKQotICAgICAgZnJlZSgoY2hhciopKHBvbHlSb3V0ZVN0YXR1c1NoaWVsZE5hbWVzXykpOwotICAgIHBvbHlnb25OYW1lc18gPSBuZXduOwotICAgIHBvbHlnb25zXyA9IHBvbHk7Ci0gICAgcG9seU1hc2tzXyA9IG1hc2tuOwotICAgIHBvbHlTaGFwZVR5cGVzXyA9IG5ld1NUOwotICAgIHBvbHlSb3V0ZVN0YXR1c189IG5ld1JTOwotICAgIHBvbHlSb3V0ZVN0YXR1c1NoaWVsZE5hbWVzXyA9IG5ld1JTTjsKLSAgfQotICBwb2x5Z29uTmFtZXNfW251bVBvbHlzX10gPSBzdHJkdXAobGF5ZXJOYW1lKTsKLSAgcG9seVJvdXRlU3RhdHVzX1tudW1Qb2x5c19dID0gc3RyZHVwKHJvdXRlU3RhdHVzKTsKLSAgcG9seVNoYXBlVHlwZXNfW251bVBvbHlzX10gPSBzdHJkdXAoc2hhcGVUeXBlKTsKLSAgcG9seVJvdXRlU3RhdHVzU2hpZWxkTmFtZXNfW251bVBvbHlzX10gPSBzdHJkdXAocm91dGVTdGF0dXNTaGllbGROYW1lKTsKLSAgcCA9IChzdHJ1Y3QgZGVmaVBvaW50cyopbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGVmaVBvaW50cykpOwotICBwLT5udW1Qb2ludHMgPSBnZW9tLT5udW1Qb2ludHMoKTsKLSAgcC0+eCA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSpwLT5udW1Qb2ludHMpOwotICBwLT55ID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKnAtPm51bVBvaW50cyk7Ci0gIGZvciAoaSA9IDA7IGkgPCBwLT5udW1Qb2ludHM7IGkrKykgewotICAgIGdlb20tPnBvaW50cyhpLCAmeCwgJnkpOwotICAgIHAtPnhbaV0gPSB4OwotICAgIHAtPnlbaV0gPSB5OwotICB9Ci0gIHBvbHlNYXNrc19bbnVtUG9seXNfXSA9IGNvbG9yTWFzazsKLSAgcG9seWdvbnNfW251bVBvbHlzX10gPSBwOwotICBudW1Qb2x5c18gKz0gMTsKLSAgaWYgKG51bVBvbHlzXyA9PSAxMDAwKSAgLy8gV2FudCB0byBpbnZva2UgdGhlIHBhcnRpYWwgY2FsbGJhY2sgaWYgc2V0Ci0gICAgICpuZWVkQ2JrID0gMTsKLX0KLQotCi0vLyA1LjYKLWludCBkZWZpTmV0OjpudW1Qb2x5Z29ucygpIGNvbnN0IHsKLSAgcmV0dXJuIG51bVBvbHlzXzsKLX0KLQotCi0vLyA1LjYKLWNvbnN0IGNoYXIqIGRlZmlOZXQ6OnBvbHlnb25OYW1lKGludCBpbmRleCkgY29uc3QgewotICBjaGFyIGVyck1zZ1sxMjhdOwotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gbnVtUG9seXNfKSB7Ci0gICAgIHNwcmludGYgKGVyck1zZywgIkVSUk9SIChERUZQQVJTLTYwODUpOiBUaGUgaW5kZXggbnVtYmVyICVkIHNwZWNpZmllZCBmb3IgdGhlIE5FVCBQT0xZR09OIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIsCi0gICAgICAgICAgICAgaW5kZXgsIG51bVBvbHlzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MDg1LCBlcnJNc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gcG9seWdvbk5hbWVzX1tpbmRleF07Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlOZXQ6OnBvbHlSb3V0ZVN0YXR1cyhpbnQgaW5kZXgpIGNvbnN0IHsKLSAgY2hhciBlcnJNc2dbMTI4XTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IG51bVBvbHlzXykgewotICAgICBzcHJpbnRmIChlcnJNc2csICJFUlJPUiAoREVGUEFSUy02MDg1KTogVGhlIGluZGV4IG51bWJlciAlZCBzcGVjaWZpZWQgZm9yIHRoZSBORVQgUE9MWUdPTiBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiBTcGVjaWZ5IGEgdmFsaWQgaW5kZXggbnVtYmVyIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLAotICAgICAgICAgICAgIGluZGV4LCBudW1Qb2x5c18pOwotICAgICBkZWZpRXJyb3IoMCwgNjA4NSwgZXJyTXNnLCBkZWZEYXRhKTsKLSAgICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIHBvbHlSb3V0ZVN0YXR1c19baW5kZXhdOwotfQotCi1jb25zdCBjaGFyKiBkZWZpTmV0Ojpwb2x5Um91dGVTdGF0dXNTaGllbGROYW1lKGludCBpbmRleCkgY29uc3QgewotICAgIGNoYXIgZXJyTXNnWzEyOF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IG51bVBvbHlzXykgewotICAgICAgICBzcHJpbnRmIChlcnJNc2csICJFUlJPUiAoREVGUEFSUy02MDg1KTogVGhlIGluZGV4IG51bWJlciAlZCBzcGVjaWZpZWQgZm9yIHRoZSBORVQgUE9MWUdPTiBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiBTcGVjaWZ5IGEgdmFsaWQgaW5kZXggbnVtYmVyIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLAotICAgICAgICAgICAgaW5kZXgsIG51bVBvbHlzXyk7Ci0gICAgICAgIGRlZmlFcnJvcigwLCA2MDg1LCBlcnJNc2csIGRlZkRhdGEpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHBvbHlSb3V0ZVN0YXR1c1NoaWVsZE5hbWVzX1tpbmRleF07Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlOZXQ6OnBvbHlTaGFwZVR5cGUoaW50IGluZGV4KSBjb25zdCB7Ci0gIGNoYXIgZXJyTXNnWzEyOF07Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBudW1Qb2x5c18pIHsKLSAgICAgc3ByaW50ZiAoZXJyTXNnLCAiRVJST1IgKERFRlBBUlMtNjA4NSk6IFRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgTkVUIFBPTFlHT04gaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgICBpbmRleCwgbnVtUG9seXNfKTsKLSAgICAgZGVmaUVycm9yKDAsIDYwODUsIGVyck1zZywgZGVmRGF0YSk7Ci0gICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBwb2x5U2hhcGVUeXBlc19baW5kZXhdOwotfQotCi1pbnQgZGVmaU5ldDo6cG9seU1hc2soaW50IGluZGV4KSBjb25zdCB7Ci0gIGNoYXIgZXJyTXNnWzEyOF07Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBudW1Qb2x5c18pIHsKLSAgICAgc3ByaW50ZiAoZXJyTXNnLCAiRVJST1IgKERFRlBBUlMtNjA4NSk6IFRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgTkVUIFBPTFlHT04gaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgICBpbmRleCwgbnVtUG9seXNfKTsKLSAgICAgZGVmaUVycm9yKDAsIDYwODUsIGVyck1zZywgZGVmRGF0YSk7Ci0gICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBwb2x5TWFza3NfW2luZGV4XTsKLX0KLQotLy8gNS42Ci1zdHJ1Y3QgZGVmaVBvaW50cyBkZWZpTmV0OjpnZXRQb2x5Z29uKGludCBpbmRleCkgY29uc3QgewotICByZXR1cm4gKihwb2x5Z29uc19baW5kZXhdKTsKLX0KLQotLy8gNS42Ci12b2lkIGRlZmlOZXQ6OmFkZFJlY3QoY29uc3QgY2hhciogbGF5ZXJOYW1lLCBpbnQgeGwsIGludCB5bCwgaW50IHhoLCBpbnQgeWgsCi0gICAgICAgICAgICAgICAgICAgICAgaW50ICpuZWVkQ2JrLCAKLSAgICAgICAgICAgICAgaW50IGNvbG9yTWFzaywKLSAgICAgICAgICAgICAgY29uc3QgY2hhciogcm91dGVTdGF0dXMsCi0gICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNoYXBlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiByb3V0ZVN0YXR1c05hbWUpIHsKLSAgLy8gVGhpcyBtZXRob2Qgd2lsbCBvbmx5IGNhbGwgYnkgc3BlY2lhbG5ldCwgbmVlZCB0byBjaGFuZ2UgaWYgbmV0IGFsc28KLSAgLy8gY2FsbHMgaXQuCi0gICpuZWVkQ2JrID0gMDsKLSAgaWYgKG51bVJlY3RzXyA9PSByZWN0c0FsbG9jYXRlZF8pIHsKLSAgICBpbnQgICAgaTsKLSAgICBpbnQgICAgbWF4OwotICAgIGNoYXIqKiBuZXduOwotICAgIGludCogICBuZXd4bDsKLSAgICBpbnQqICAgbmV3eWw7Ci0gICAgaW50KiAgIG5ld3hoOwotICAgIGludCogICBuZXd5aDsKLSAgICBpbnQqICAgbmV3TWFzazsKLSAgICBjaGFyKiogbmV3UlM7Ci0gICAgY2hhcioqIG5ld1NUOwotICAgIGNoYXIqKiBuZXdSU047Ci0KLSAgICBtYXggPSByZWN0c0FsbG9jYXRlZF8gPSAocmVjdHNBbGxvY2F0ZWRfID09IDApID8gMTAwMCA6Ci0gICAgICAgICAgICAgIHJlY3RzQWxsb2NhdGVkXyAqIDI7Ci0gICAgbmV3biA9IChjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikqbWF4KTsKLSAgICBuZXdSUyA9IChjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikqbWF4KTsKLSAgICBuZXdTVCA9IChjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikqbWF4KTsKLSAgICBuZXdSU04gPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKm1heCk7Ci0gICAgbmV3eGwgPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkqbWF4KTsKLSAgICBuZXd5bCA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSptYXgpOwotICAgIG5ld3hoID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKm1heCk7Ci0gICAgbmV3eWggPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkqbWF4KTsKLSAgICBuZXdNYXNrID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKm1heCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bVJlY3RzXzsgaSsrKSB7Ci0gICAgICBuZXduW2ldID0gcmVjdE5hbWVzX1tpXTsKLSAgICAgIG5ld3hsW2ldID0geGxfW2ldOwotICAgICAgbmV3eWxbaV0gPSB5bF9baV07Ci0gICAgICBuZXd4aFtpXSA9IHhoX1tpXTsKLSAgICAgIG5ld3loW2ldID0geWhfW2ldOwotICAgICAgbmV3TWFza1tpXSA9IHJlY3RNYXNrc19baV07Ci0gICAgICBuZXdSU1tpXSA9IHJlY3RSb3V0ZVN0YXR1c19baV07Ci0gICAgICBuZXdTVFtpXSA9IHJlY3RTaGFwZVR5cGVzX1tpXTsKLSAgICAgIG5ld1JTTltpXSA9IHJlY3RSb3V0ZVN0YXR1c1NoaWVsZE5hbWVzX1tpXTsKLSAgICB9Ci0gICAgaWYgKHJlY3ROYW1lc18pCi0gICAgICBmcmVlKChjaGFyKikocmVjdE5hbWVzXykpOwotICAgIGlmIChyZWN0Um91dGVTdGF0dXNfKQotICAgICAgZnJlZSgoY2hhciopKHJlY3RSb3V0ZVN0YXR1c18pKTsKLSAgICBpZiAocmVjdFNoYXBlVHlwZXNfKQotICAgICAgZnJlZSgoY2hhciopKHJlY3RTaGFwZVR5cGVzXykpOwotICAgIGlmIChyZWN0Um91dGVTdGF0dXNTaGllbGROYW1lc18pCi0gICAgICBmcmVlKChjaGFyKikocmVjdFJvdXRlU3RhdHVzU2hpZWxkTmFtZXNfKSk7Ci0gICAgaWYgKHhsXykgewotICAgICAgZnJlZSgoY2hhciopKHhsXykpOwotICAgICAgZnJlZSgoY2hhciopKHlsXykpOwotICAgICAgZnJlZSgoY2hhciopKHhoXykpOwotICAgICAgZnJlZSgoY2hhciopKHloXykpOwotICAgICAgZnJlZSgoY2hhciopKHJlY3RNYXNrc18pKTsKLSAgICB9Ci0gICAgcmVjdE5hbWVzXyA9IG5ld247Ci0gICAgeGxfID0gbmV3eGw7Ci0gICAgeWxfID0gbmV3eWw7Ci0gICAgeGhfID0gbmV3eGg7Ci0gICAgeWhfID0gbmV3eWg7Ci0gICAgcmVjdE1hc2tzXyA9IG5ld01hc2s7Ci0gICAgcmVjdFJvdXRlU3RhdHVzXyA9IG5ld1JTOwotICAgIHJlY3RTaGFwZVR5cGVzXyA9IG5ld1NUOwotICAgIHJlY3RSb3V0ZVN0YXR1c1NoaWVsZE5hbWVzXyA9IG5ld1JTTjsKLSAgfQotICByZWN0TmFtZXNfW251bVJlY3RzX10gPSBzdHJkdXAobGF5ZXJOYW1lKTsKLSAgeGxfW251bVJlY3RzX10gPSB4bDsKLSAgeWxfW251bVJlY3RzX10gPSB5bDsKLSAgeGhfW251bVJlY3RzX10gPSB4aDsKLSAgeWhfW251bVJlY3RzX10gPSB5aDsKLSAgcmVjdE1hc2tzX1tudW1SZWN0c19dID0gY29sb3JNYXNrOwotICByZWN0Um91dGVTdGF0dXNfW251bVJlY3RzX10gPSBzdHJkdXAocm91dGVTdGF0dXMpOwotICByZWN0U2hhcGVUeXBlc19bbnVtUmVjdHNfXSA9IHN0cmR1cChzaGFwZVR5cGUpOwotICByZWN0Um91dGVTdGF0dXNTaGllbGROYW1lc19bbnVtUmVjdHNfXSA9IHN0cmR1cChyb3V0ZVN0YXR1c05hbWUpOwotICBudW1SZWN0c18gKz0gMTsKLSAgaWYgKG51bVJlY3RzXyA9PSAxMDAwKSAgLy8gV2FudCB0byBpbnZva2UgdGhlIHBhcnRpYWwgY2FsbGJhY2sgaWYgc2V0Ci0gICAgICpuZWVkQ2JrID0gMTsKLX0KLQotLy8gNS42Ci1pbnQgZGVmaU5ldDo6bnVtUmVjdGFuZ2xlcygpIGNvbnN0IHsKLSAgcmV0dXJuIG51bVJlY3RzXzsKLX0KLQotLy8gNS42Ci1jb25zdCBjaGFyKiBkZWZpTmV0OjpyZWN0TmFtZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgY2hhciBlcnJNc2dbMTI4XTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IG51bVJlY3RzXykgewotICAgICBzcHJpbnRmIChlcnJNc2csICJFUlJPUiAoREVGUEFSUy02MDg2KTogVGhlIGluZGV4IG51bWJlciAlZCBzcGVjaWZpZWQgZm9yIHRoZSBORVQgUkVDVEFOR0xFIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIsCi0gICAgICAgICAgICAgaW5kZXgsIG51bVJlY3RzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MDg2LCBlcnJNc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gcmVjdE5hbWVzX1tpbmRleF07Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlOZXQ6OnJlY3RSb3V0ZVN0YXR1cyhpbnQgaW5kZXgpIGNvbnN0IHsKLSAgY2hhciBlcnJNc2dbMTI4XTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IG51bVJlY3RzXykgewotICAgICBzcHJpbnRmIChlcnJNc2csICJFUlJPUiAoREVGUEFSUy02MDg2KTogVGhlIGluZGV4IG51bWJlciAlZCBzcGVjaWZpZWQgZm9yIHRoZSBORVQgUkVDVEFOR0xFIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIsCi0gICAgICAgICAgICAgaW5kZXgsIG51bVJlY3RzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MDg2LCBlcnJNc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gcmVjdFJvdXRlU3RhdHVzX1tpbmRleF07Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlOZXQ6OnJlY3RSb3V0ZVN0YXR1c1NoaWVsZE5hbWUoaW50IGluZGV4KSBjb25zdCB7Ci0gICAgY2hhciBlcnJNc2dbMTI4XTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gbnVtUmVjdHNfKSB7Ci0gICAgICAgIHNwcmludGYgKGVyck1zZywgIkVSUk9SIChERUZQQVJTLTYwODYpOiBUaGUgaW5kZXggbnVtYmVyICVkIHNwZWNpZmllZCBmb3IgdGhlIE5FVCBSRUNUQU5HTEUgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgIGluZGV4LCBudW1SZWN0c18pOwotICAgICAgICBkZWZpRXJyb3IoMCwgNjA4NiwgZXJyTXNnLCBkZWZEYXRhKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiByZWN0Um91dGVTdGF0dXNTaGllbGROYW1lc19baW5kZXhdOwotfQotCi1jb25zdCBjaGFyKiBkZWZpTmV0OjpyZWN0U2hhcGVUeXBlKGludCBpbmRleCkgY29uc3QgewotICBjaGFyIGVyck1zZ1sxMjhdOwotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gbnVtUmVjdHNfKSB7Ci0gICAgIHNwcmludGYgKGVyck1zZywgIkVSUk9SIChERUZQQVJTLTYwODYpOiBUaGUgaW5kZXggbnVtYmVyICVkIHNwZWNpZmllZCBmb3IgdGhlIE5FVCBSRUNUQU5HTEUgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgICBpbmRleCwgbnVtUmVjdHNfKTsKLSAgICAgZGVmaUVycm9yKDAsIDYwODYsIGVyck1zZywgZGVmRGF0YSk7Ci0gICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiByZWN0U2hhcGVUeXBlc19baW5kZXhdOwotfQotCi0vLyA1LjYKLWludCBkZWZpTmV0Ojp4bChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgY2hhciBlcnJNc2dbMTI4XTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1SZWN0c18pIHsKLSAgICAgc3ByaW50ZiAoZXJyTXNnLCAiRVJST1IgKERFRlBBUlMtNjA4Nik6IFRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgTkVUIFJFQ1RBTkdMRSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiBTcGVjaWZ5IGEgdmFsaWQgaW5kZXggbnVtYmVyIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLAotICAgICAgICAgICAgIGluZGV4LCBudW1SZWN0c18pOwotICAgICBkZWZpRXJyb3IoMCwgNjA4NiwgZXJyTXNnLCBkZWZEYXRhKTsKLSAgICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIHhsX1tpbmRleF07Ci19Ci0KLS8vIDUuNgotaW50IGRlZmlOZXQ6OnlsKGludCBpbmRleCkgY29uc3QgewotICBjaGFyIGVyck1zZ1sxMjhdOwotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVJlY3RzXykgewotICAgICBzcHJpbnRmIChlcnJNc2csICJFUlJPUiAoREVGUEFSUy02MDg2KTogVGhlIGluZGV4IG51bWJlciAlZCBzcGVjaWZpZWQgZm9yIHRoZSBORVQgUkVDVEFOR0xFIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIsCi0gICAgICAgICAgICAgaW5kZXgsIG51bVJlY3RzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MDg2LCBlcnJNc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4geWxfW2luZGV4XTsKLX0KLQotLy8gNS42Ci1pbnQgZGVmaU5ldDo6eGgoaW50IGluZGV4KSBjb25zdCB7Ci0gIGNoYXIgZXJyTXNnWzEyOF07Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtUmVjdHNfKSB7Ci0gICAgIHNwcmludGYgKGVyck1zZywgIkVSUk9SIChERUZQQVJTLTYwODYpOiBUaGUgaW5kZXggbnVtYmVyICVkIHNwZWNpZmllZCBmb3IgdGhlIE5FVCBSRUNUQU5HTEUgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgICBpbmRleCwgbnVtUmVjdHNfKTsKLSAgICAgZGVmaUVycm9yKDAsIDYwODYsIGVyck1zZywgZGVmRGF0YSk7Ci0gICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiB4aF9baW5kZXhdOwotfQotCi0vLyA1LjYKLWludCBkZWZpTmV0Ojp5aChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgY2hhciBlcnJNc2dbMTI4XTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1SZWN0c18pIHsKLSAgICAgc3ByaW50ZiAoZXJyTXNnLCAiRVJST1IgKERFRlBBUlMtNjA4Nik6IFRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgTkVUIFJFQ1RBTkdMRSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiBTcGVjaWZ5IGEgdmFsaWQgaW5kZXggbnVtYmVyIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLAotICAgICAgICAgICAgIGluZGV4LCBudW1SZWN0c18pOwotICAgICBkZWZpRXJyb3IoMCwgNjA4NiwgZXJyTXNnLCBkZWZEYXRhKTsKLSAgICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIHloX1tpbmRleF07Ci19Ci0KLWludCBkZWZpTmV0OjpyZWN0TWFzayhpbnQgaW5kZXgpIGNvbnN0IHsKLSAgY2hhciBlcnJNc2dbMTI4XTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1SZWN0c18pIHsKLSAgICAgc3ByaW50ZiAoZXJyTXNnLCAiRVJST1IgKERFRlBBUlMtNjA4Nik6IFRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgTkVUIFJFQ1RBTkdMRSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiBTcGVjaWZ5IGEgdmFsaWQgaW5kZXggbnVtYmVyIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLAotICAgICAgICAgICAgIGluZGV4LCBudW1SZWN0c18pOwotICAgICBkZWZpRXJyb3IoMCwgNjA4NiwgZXJyTXNnLCBkZWZEYXRhKTsKLSAgICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIHJlY3RNYXNrc19baW5kZXhdOwotfQotCi0KLXZvaWQgZGVmaU5ldDo6YWRkUHRzKGNvbnN0IGNoYXIqIHZpYU5hbWUsIGludCBvLCBkZWZpR2VvbWV0cmllcyogZ2VvbSwgCi0JICAgICAgICAgICAgIGludCAqbmVlZENiaywgaW50IGNvbG9yTWFzaywKLQkJICAgICBjb25zdCBjaGFyKiByb3V0ZVN0YXR1cywKLQkJICAgICBjb25zdCBjaGFyKiBzaGFwZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiByb3V0ZVN0YXR1c1NoaWVsZE5hbWUpIHsKLSAgICBzdHJ1Y3QgZGVmaVBvaW50cyogcDsKLSAgICBpbnQgeCwgeTsKLSAgICBpbnQgaTsKLQotICAgICpuZWVkQ2JrID0gMDsKLSAgICBpZiAobnVtUHRzXyA9PSBwdHNBbGxvY2F0ZWRfKSB7Ci0gICAgICAgIHN0cnVjdCBkZWZpUG9pbnRzKiogcHRzOwotICAgICAgICBjaGFyKiogbmV3bjsKLQljaGFyKiogbmV3UlM7Ci0JY2hhcioqIG5ld1NUOwotICAgICAgICBjaGFyKiogbmV3UlNOOwotICAgICAgICBpbnQqICAgb3JpZW50bjsKLQlpbnQqICAgbWFza247Ci0KLSAgICAgICAgcHRzQWxsb2NhdGVkXyA9IChwdHNBbGxvY2F0ZWRfID09IDApID8KLSAgICAgICAgICAgIDEwMDAgOiBwdHNBbGxvY2F0ZWRfICogMjsKLSAgICAgICAgbmV3biA9IChjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikgKnB0c0FsbG9jYXRlZF8pOwotICAgICAgICBuZXdSUyA9IChjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikgKnB0c0FsbG9jYXRlZF8pOwotICAgICAgICBuZXdTVCA9IChjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikgKnB0c0FsbG9jYXRlZF8pOwotICAgICAgICBuZXdSU04gPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopICpwdHNBbGxvY2F0ZWRfKTsKLSAgICAgICAgb3JpZW50biA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSAqcHRzQWxsb2NhdGVkXyk7Ci0gICAgICAgIHB0cz0gKHN0cnVjdCBkZWZpUG9pbnRzKiopbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGVmaVBvaW50cyopICoKLSAgICAgICAgICAgIHB0c0FsbG9jYXRlZF8pOwotCW1hc2tuID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpICpwdHNBbGxvY2F0ZWRfKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVB0c187IGkrKykgewotICAgICAgICAgICAgcHRzW2ldID0gdmlhUHRzX1tpXTsKLSAgICAgICAgICAgIG5ld25baV0gPSB2aWFOYW1lc19baV07Ci0gICAgICAgICAgICBuZXdSU1tpXSA9IHZpYVJvdXRlU3RhdHVzX1tpXTsKLSAgICAgICAgICAgIG5ld1NUW2ldID0gdmlhU2hhcGVUeXBlc19baV07Ci0gICAgICAgICAgICBuZXdSU05baV0gPSB2aWFSb3V0ZVN0YXR1c1NoaWVsZE5hbWVzX1tpXTsKLSAgICAgICAgICAgIG9yaWVudG5baV0gPSB2aWFPcmllbnRzX1tpXTsKLQkgICAgbWFza25baV0gPSB2aWFNYXNrc19baV07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZpYVB0c18pCi0gICAgICAgICAgICBmcmVlKChjaGFyKikodmlhUHRzXykpOwotICAgICAgICBpZiAodmlhTmFtZXNfKSAKLSAgICAgICAgICAgIGZyZWUoKGNoYXIqKSh2aWFOYW1lc18pKTsKLSAgICAgICAgaWYgKHZpYU9yaWVudHNfKQotICAgICAgICAgICAgZnJlZSgoY2hhciopKHZpYU9yaWVudHNfKSk7Ci0gICAgICAgIGlmICh2aWFNYXNrc18pCi0JICAgIGZyZWUoKGNoYXIqKSh2aWFNYXNrc18pKTsKLSAgICAgICAgaWYgKHZpYVJvdXRlU3RhdHVzXykKLQkgICAgZnJlZSgoY2hhciopKHZpYVJvdXRlU3RhdHVzXykpOwotICAgICAgICBpZiAodmlhU2hhcGVUeXBlc18pCi0JICAgIGZyZWUoKGNoYXIqKSh2aWFTaGFwZVR5cGVzXykpOwotICAgICAgICBpZiAodmlhUm91dGVTdGF0dXNTaGllbGROYW1lc18pCi0gICAgICAgICAgICBmcmVlKChjaGFyKikodmlhUm91dGVTdGF0dXNTaGllbGROYW1lc18pKTsKLSAgICAKLSAgICAgICAgdmlhUHRzXyA9IHB0czsKLSAgICAgICAgdmlhTmFtZXNfID0gbmV3bjsKLSAgICAgICAgdmlhT3JpZW50c18gPSBvcmllbnRuOwotCXZpYU1hc2tzXyA9IG1hc2tuOwotCXZpYVNoYXBlVHlwZXNfPSBuZXdTVDsKLQl2aWFSb3V0ZVN0YXR1c18gPSBuZXdSUzsKLSAgICAgICAgdmlhUm91dGVTdGF0dXNTaGllbGROYW1lc18gPSBuZXdSU047Ci0gICAgfQotICAgIHZpYU5hbWVzX1tudW1QdHNfXSA9IHN0cmR1cCh2aWFOYW1lKTsKLSAgICB2aWFTaGFwZVR5cGVzX1tudW1QdHNfXSA9IHN0cmR1cChzaGFwZVR5cGUpOwotICAgIHZpYVJvdXRlU3RhdHVzX1tudW1QdHNfXSA9IHN0cmR1cChyb3V0ZVN0YXR1cyk7Ci0gICAgdmlhUm91dGVTdGF0dXNTaGllbGROYW1lc19bbnVtUHRzX10gPSBzdHJkdXAocm91dGVTdGF0dXNTaGllbGROYW1lKTsKLSAgICB2aWFPcmllbnRzX1tudW1QdHNfXSA9IG87Ci0gICAgdmlhTWFza3NfW251bVB0c19dID0gY29sb3JNYXNrOwotICAgIHAgPSAoc3RydWN0IGRlZmlQb2ludHMqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGRlZmlQb2ludHMpKTsKLSAgICBwLT5udW1Qb2ludHMgPSBnZW9tLT5udW1Qb2ludHMoKTsKLSAgICBwLT54ID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKnAtPm51bVBvaW50cyk7Ci0gICAgcC0+eSA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSpwLT5udW1Qb2ludHMpOwotICAgIGZvciAoaSA9IDA7IGkgPCBwLT5udW1Qb2ludHM7IGkrKykgewotICAgICAgICBnZW9tLT5wb2ludHMoaSwgJngsICZ5KTsKLSAgICAgICAgcC0+eFtpXSA9IHg7Ci0gICAgICAgIHAtPnlbaV0gPSB5OwotICAgIH0KLSAgICB2aWFQdHNfW251bVB0c19dID0gcDsKLSAgICBudW1QdHNfICs9IDE7Ci0gICAgaWYgKG51bVB0c18gPT0gMTAwMCkgIC8vIFdhbnQgdG8gaW52b2tlIHRoZSBwYXJ0aWFsIGNhbGxiYWNrIGlmIHNldAotICAgICAqbmVlZENiayA9IDE7Ci19Ci0KLWludCBkZWZpTmV0OjpudW1WaWFTcGVjcygpIGNvbnN0IHsKLSAgICByZXR1cm4gbnVtUHRzXzsKLX0KLQotY29uc3QgY2hhciogZGVmaU5ldDo6dmlhTmFtZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgICBjaGFyIGVyck1zZ1sxMjhdOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBudW1QdHNfKSB7Ci0gICAgICAgIHNwcmludGYgKGVyck1zZywgIkVSUk9SIChERUZQQVJTLTYwODUpOiBUaGUgaW5kZXggbnVtYmVyICVkIHNwZWNpZmllZCBmb3IgdGhlIE5FVCBQT0xZR09OIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIsCi0gICAgICAgICAgICBpbmRleCwgbnVtUHRzXyk7Ci0gICAgICAgIGRlZmlFcnJvcigwLCA2MDg1LCBlcnJNc2csIGRlZkRhdGEpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHZpYU5hbWVzX1tpbmRleF07Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlOZXQ6OnZpYVJvdXRlU3RhdHVzKGludCBpbmRleCkgY29uc3QgewotICAgIGNoYXIgZXJyTXNnWzEyOF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IG51bVB0c18pIHsKLSAgICAgICAgc3ByaW50ZiAoZXJyTXNnLCAiRVJST1IgKERFRlBBUlMtNjA4NSk6IFRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgTkVUIFBPTFlHT04gaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgIGluZGV4LCBudW1QdHNfKTsKLSAgICAgICAgZGVmaUVycm9yKDAsIDYwODUsIGVyck1zZywgZGVmRGF0YSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gdmlhUm91dGVTdGF0dXNfW2luZGV4XTsKLX0KLQotY29uc3QgY2hhciogZGVmaU5ldDo6dmlhUm91dGVTdGF0dXNTaGllbGROYW1lKGludCBpbmRleCkgY29uc3QgewotICAgIGNoYXIgZXJyTXNnWzEyOF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IG51bVB0c18pIHsKLSAgICAgICAgc3ByaW50ZiAoZXJyTXNnLCAiRVJST1IgKERFRlBBUlMtNjA4NSk6IFRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgTkVUIFBPTFlHT04gaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgIGluZGV4LCBudW1QdHNfKTsKLSAgICAgICAgZGVmaUVycm9yKDAsIDYwODUsIGVyck1zZywgZGVmRGF0YSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gdmlhUm91dGVTdGF0dXNTaGllbGROYW1lc19baW5kZXhdOwotfQotCi1jb25zdCBjaGFyKiBkZWZpTmV0Ojp2aWFTaGFwZVR5cGUoaW50IGluZGV4KSBjb25zdCB7Ci0gICAgY2hhciBlcnJNc2dbMTI4XTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gbnVtUHRzXykgewotICAgICAgICBzcHJpbnRmIChlcnJNc2csICJFUlJPUiAoREVGUEFSUy02MDg1KTogVGhlIGluZGV4IG51bWJlciAlZCBzcGVjaWZpZWQgZm9yIHRoZSBORVQgUE9MWUdPTiBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiBTcGVjaWZ5IGEgdmFsaWQgaW5kZXggbnVtYmVyIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLAotICAgICAgICAgICAgaW5kZXgsIG51bVB0c18pOwotICAgICAgICBkZWZpRXJyb3IoMCwgNjA4NSwgZXJyTXNnLCBkZWZEYXRhKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiB2aWFTaGFwZVR5cGVzX1tpbmRleF07Ci19Ci0KLWNvbnN0IGludCBkZWZpTmV0Ojp2aWFPcmllbnQoaW50IGluZGV4KSBjb25zdCB7Ci0gICAgY2hhciBlcnJNc2dbMTI4XTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gbnVtUHRzXykgewotICAgICAgICBzcHJpbnRmIChlcnJNc2csICJFUlJPUiAoREVGUEFSUy02MDg1KTogVGhlIGluZGV4IG51bWJlciAlZCBzcGVjaWZpZWQgZm9yIHRoZSBORVQgUE9MWUdPTiBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiBTcGVjaWZ5IGEgdmFsaWQgaW5kZXggbnVtYmVyIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLAotICAgICAgICAgICAgaW5kZXgsIG51bVB0c18pOwotICAgICAgICBkZWZpRXJyb3IoMCwgNjA4NSwgZXJyTXNnLCBkZWZEYXRhKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiB2aWFPcmllbnRzX1tpbmRleF07Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlOZXQ6OnZpYU9yaWVudFN0cihpbnQgaW5kZXgpIGNvbnN0ICB7Ci0gICAgY2hhciBlcnJNc2dbMTI4XTsKLQotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBudW1QdHNfKSB7Ci0gICAgICAgIHNwcmludGYgKGVyck1zZywgIkVSUk9SIChERUZQQVJTLTYwODUpOiBUaGUgaW5kZXggbnVtYmVyICVkIHNwZWNpZmllZCBmb3IgdGhlIE5FVCBQT0xZR09OIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIsCi0gICAgICAgICAgICBpbmRleCwgbnVtUHRzXyk7Ci0gICAgICAgIGRlZmlFcnJvcigwLCA2MDg1LCBlcnJNc2csIGRlZkRhdGEpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIChkZWZpT3JpZW50U3RyKHZpYU9yaWVudHNfW2luZGV4XSkpOwotfQotCi1jb25zdCBpbnQgZGVmaU5ldDo6dG9wTWFza051bShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgIGNoYXIgZXJyTXNnWzEyOF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IG51bVB0c18pIHsKLSAgICAgICAgc3ByaW50ZiAoZXJyTXNnLCAiRVJST1IgKERFRlBBUlMtNjA4NSk6IFRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgTkVUIFBPTFlHT04gaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgIGluZGV4LCBudW1QdHNfKTsKLSAgICAgICAgZGVmaUVycm9yKDAsIDYwODUsIGVyck1zZywgZGVmRGF0YSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiB2aWFNYXNrc19baW5kZXhdIC8gMTAwOwotfQotCi1jb25zdCBpbnQgZGVmaU5ldDo6Y3V0TWFza051bShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgICBjaGFyIGVyck1zZ1sxMjhdOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBudW1QdHNfKSB7Ci0gICAgICAgIHNwcmludGYgKGVyck1zZywgIkVSUk9SIChERUZQQVJTLTYwODUpOiBUaGUgaW5kZXggbnVtYmVyICVkIHNwZWNpZmllZCBmb3IgdGhlIE5FVCBQT0xZR09OIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIsCi0gICAgICAgICAgICBpbmRleCwgbnVtUHRzXyk7Ci0gICAgICAgIGRlZmlFcnJvcigwLCA2MDg1LCBlcnJNc2csIGRlZkRhdGEpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmlhTWFza3NfW2luZGV4XSAvIDEwICUgMTA7Ci19Ci0KLWNvbnN0IGludCBkZWZpTmV0Ojpib3R0b21NYXNrTnVtKGludCBpbmRleCkgY29uc3QgewotICAgIGNoYXIgZXJyTXNnWzEyOF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IG51bVB0c18pIHsKLSAgICAgICAgc3ByaW50ZiAoZXJyTXNnLCAiRVJST1IgKERFRlBBUlMtNjA4NSk6IFRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgTkVUIFBPTFlHT04gaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgIGluZGV4LCBudW1QdHNfKTsKLSAgICAgICAgZGVmaUVycm9yKDAsIDYwODUsIGVyck1zZywgZGVmRGF0YSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiB2aWFNYXNrc19baW5kZXhdICUgMTA7Ci19Ci0KLXN0cnVjdCBkZWZpUG9pbnRzIGRlZmlOZXQ6OmdldFZpYVB0cyhpbnQgaW5kZXgpY29uc3QgewotICAgIHJldHVybiAqKHZpYVB0c19baW5kZXhdKTsKLX0KLQotdm9pZCBkZWZpTmV0OjpjbGVhclZpYSgpIHsKLSAgICBpZiAodmlhTmFtZXNfKSB7Ci0gICAgICAgIHN0cnVjdCBkZWZpUG9pbnRzKiBwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVB0c187IGkrKykgewotICAgICAgICAgICAgaWYgKHZpYU5hbWVzX1tpXSkgewotCQlmcmVlKChjaGFyKikodmlhTmFtZXNfW2ldKSk7Ci0JICAgIH0KLQkgICAgaWYgKHZpYVJvdXRlU3RhdHVzX1tpXSkgewotCSAgICAgIGZyZWUgKChjaGFyKikodmlhUm91dGVTdGF0dXNfW2ldKSk7Ci0JICAgIH0KLQkgICAgaWYgKHZpYVNoYXBlVHlwZXNfW2ldKSB7Ci0JICAgICAgZnJlZSAoKGNoYXIqKSh2aWFTaGFwZVR5cGVzX1tpXSkpOwotCSAgICB9Ci0gICAgICAgICAgICBpZiAodmlhUm91dGVTdGF0dXNTaGllbGROYW1lc19baV0pIHsKLSAgICAgICAgICAgICAgZnJlZSAoKGNoYXIqKSh2aWFSb3V0ZVN0YXR1c1NoaWVsZE5hbWVzX1tpXSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcCA9IHZpYVB0c19baV07Ci0gICAgICAgICAgICBmcmVlKChjaGFyKikocC0+eCkpOwotICAgICAgICAgICAgZnJlZSgoY2hhciopKHAtPnkpKTsKLSAgICAgICAgICAgIGZyZWUoKGNoYXIqKSh2aWFQdHNfW2ldKSk7Ci0gICAgICAgIH0KLQlpZiAodmlhTWFza3NfKSB7Ci0JICAgIGZyZWUoKGNoYXIqKSh2aWFNYXNrc18pKTsKLQl9Ci0JaWYgKHZpYU9yaWVudHNfKSB7Ci0JICAgIGZyZWUoKGNoYXIqKSh2aWFPcmllbnRzXykpOwotCX0KLQlpZiAodmlhTmFtZXNfKSB7Ci0JICAgIGZyZWUoKGNoYXIqKSh2aWFOYW1lc18pKTsKLQl9Ci0JaWYgKHZpYVJvdXRlU3RhdHVzXykgewotCSAgICBmcmVlKChjaGFyKikodmlhUm91dGVTdGF0dXNfKSk7Ci0JfQotCWlmICh2aWFTaGFwZVR5cGVzXykgewotCSAgICBmcmVlKChjaGFyKikodmlhU2hhcGVUeXBlc18pKTsKLQl9Ci0JaWYgKHZpYVJvdXRlU3RhdHVzU2hpZWxkTmFtZXNfKSB7Ci0JICAgIGZyZWUoKGNoYXIqKSh2aWFSb3V0ZVN0YXR1c1NoaWVsZE5hbWVzXykpOwotCX0KLQlpZiAodmlhUHRzXykgewotCSAgICBmcmVlKChjaGFyKikodmlhUHRzXykpOwotCX0KLSAgICB9Ci0KLSAgICB2aWFNYXNrc18gPSAwOwotICAgIHZpYU9yaWVudHNfID0gMDsKLSAgICBudW1QdHNfID0gMDsKLSAgICBwdHNBbGxvY2F0ZWRfID0gMDsKLSAgICB2aWFQdHNfID0gMDsKLSAgICB2aWFSb3V0ZVN0YXR1c18gPSAwOwotICAgIHZpYVNoYXBlVHlwZXNfID0gMDsKLSAgICB2aWFSb3V0ZVN0YXR1c1NoaWVsZE5hbWVzXyA9IDA7Ci0gICAgdmlhTmFtZXNfID0gMDsKLX0KLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaU5ldC5ocHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlOZXQuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWFkOWUwLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaU5ldC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NjkgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMyAtIDIwMTcsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogaWNmdGNtICQKLS8vICAkUmV2aXNpb246ICMyICQKLS8vICAkRGF0ZTogMjAxNy8wNi8xOSAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpZm5kZWYgZGVmaU5ldF9oCi0jZGVmaW5lIGRlZmlOZXRfaAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJkZWZpS1JEZWZzLmhwcCIKLSNpbmNsdWRlICJkZWZpUGF0aC5ocHAiCi0jaW5jbHVkZSAiZGVmaU1pc2MuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1jbGFzcyBkZWZyRGF0YTsKLQotLyogUmV0dXJuIGNvZGVzIGZvciBkZWZpTmV0Ojp2aWFPcmllbnQgCi0gICAgREVGX09SSUVOVF9OICAwCi0gICAgREVGX09SSUVOVF9XICAxCi0gICAgREVGX09SSUVOVF9TICAyCi0gICAgREVGX09SSUVOVF9FICAzCi0gICAgREVGX09SSUVOVF9GTiA0Ci0gICAgREVGX09SSUVOVF9GVyA1Ci0gICAgREVGX09SSUVOVF9GUyA2Ci0gICAgREVGX09SSUVOVF9GRSA3Ci0qLwotCi1jbGFzcyBkZWZpV2lyZSB7Ci1wdWJsaWM6Ci0gIGRlZmlXaXJlKGRlZnJEYXRhICpkYXRhKTsKLSAgfmRlZmlXaXJlKCk7Ci0KLSAgdm9pZCBJbml0KGNvbnN0IGNoYXIqIHR5cGUsIGNvbnN0IGNoYXIqIHdpcmVTaGllbGROYW1lKTsKLSAgdm9pZCBEZXN0cm95KCk7Ci0gIHZvaWQgY2xlYXIoKTsKLSAgdm9pZCBhZGRQYXRoKGRlZmlQYXRoICpwLCBpbnQgcmVzZXQsIGludCBuZXRPc25ldCwgaW50ICpuZWVkQ2JrKTsKLQotICBjb25zdCBjaGFyKiB3aXJlVHlwZSgpIGNvbnN0OwotICBjb25zdCBjaGFyKiB3aXJlU2hpZWxkTmV0TmFtZSgpIGNvbnN0OwotICBpbnQgICAgICAgICBudW1QYXRocygpIGNvbnN0OwotCi0gIGRlZmlQYXRoKiAgIHBhdGgoaW50IGluZGV4KTsKLSAgY29uc3QgZGVmaVBhdGgqICAgcGF0aChpbnQgaW5kZXgpIGNvbnN0OwotCi0gIHZvaWQgYnVtcFBhdGhzKGxvbmcgbG9uZyBzaXplKTsKLQotcHJvdGVjdGVkOgotICBjaGFyKiAgICAgIHR5cGVfOwotICBjaGFyKiAgICAgIHdpcmVTaGllbGROYW1lXzsgICAgLy8gSXQgb25seSBzZXQgZnJvbSBzcGVjaWFsbmV0IFNISUVMRCwgNS40Ci0gIGludCAgICAgICAgbnVtUGF0aHNfOwotICBsb25nIGxvbmcgIHBhdGhzQWxsb2NhdGVkXzsKLSAgZGVmaVBhdGgqKiBwYXRoc187Ci0KLSAgZGVmckRhdGEgICpkZWZEYXRhOwotfTsKLQotCi0KLWNsYXNzIGRlZmlTdWJuZXQgewotcHVibGljOgotICBkZWZpU3VibmV0KGRlZnJEYXRhICpkYXRhKTsKLSAgdm9pZCBJbml0KCk7Ci0KLSAgdm9pZCBEZXN0cm95KCk7Ci0gIH5kZWZpU3VibmV0KCk7Ci0KLSAgdm9pZCBzZXROYW1lKGNvbnN0IGNoYXIqIG5hbWUpOwotICB2b2lkIHNldE5vbkRlZmF1bHQoY29uc3QgY2hhciogbmFtZSk7Ci0gIHZvaWQgYWRkUGluKGNvbnN0IGNoYXIqIGluc3RhbmNlLCBjb25zdCBjaGFyKiBwaW4sIGludCBzeW4pOwotICB2b2lkIGFkZE11c3RQaW4oY29uc3QgY2hhciogaW5zdGFuY2UsIGNvbnN0IGNoYXIqIHBpbiwgaW50IHN5bik7Ci0KLSAgLy8gV01EIC0tIHRoZSBmb2xsb3dpbmcgd2lsbCBiZSByZW1vdmVkIGJ5IHRoZSBuZXh0IHJlbGVhc2UKLSAgdm9pZCBzZXRUeXBlKGNvbnN0IGNoYXIqIHR5cCk7ICAvLyBFaXRoZXIgRklYRUQgQ09WRVIgUk9VVEVECi0gIHZvaWQgYWRkUGF0aChkZWZpUGF0aCogcCwgaW50IHJlc2V0LCBpbnQgbmV0T3NuZXQsIGludCAqbmVlZENiayk7Ci0KLSAgLy8gTkVXOiBhIG5ldCBjYW4gaGF2ZSBtb3JlIHRoYW4gMSB3aXJlCi0gIHZvaWQgYWRkV2lyZShjb25zdCBjaGFyICp0eXApOyAKLSAgdm9pZCBhZGRXaXJlUGF0aChkZWZpUGF0aCAqcCwgaW50IHJlc2V0LCBpbnQgbmV0T3NuZXQsIGludCAqbmVlZENiayk7Ci0KLSAgLy8gRGVidWcgcHJpbnRpbmcKLSAgdm9pZCBwcmludChGSUxFKiBmKSBjb25zdDsKLQotICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3Q7Ci0gIGludCBudW1Db25uZWN0aW9ucygpIGNvbnN0OwotICBjb25zdCBjaGFyKiBpbnN0YW5jZShpbnQgaW5kZXgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBwaW4oaW50IGluZGV4KSBjb25zdDsKLSAgaW50IHBpbklzU3ludGhlc2l6ZWQoaW50IGluZGV4KSBjb25zdDsKLSAgaW50IHBpbklzTXVzdEpvaW4oaW50IGluZGV4KSBjb25zdDsKLQotICAvLyBXTUQgLS0gdGhlIGZvbGxvd2luZyB3aWxsIGJlIHJlbW92ZWQgYnkgdGhlIG5leHQgcmVsZWFzZQotICBpbnQgaXNGaXhlZCgpIGNvbnN0OwotICBpbnQgaXNSb3V0ZWQoKSBjb25zdDsKLSAgaW50IGlzQ292ZXIoKSBjb25zdDsKLQotICBpbnQgaGFzTm9uRGVmYXVsdFJ1bGUoKSBjb25zdDsKLQotICAvLyBXTUQgLS0gdGhlIGZvbGxvd2luZyB3aWxsIGJlIHJlbW92ZWQgYnkgdGhlIG5leHQgcmVsZWFzZQotICBpbnQgbnVtUGF0aHMoKSBjb25zdDsKLSAgZGVmaVBhdGgqIHBhdGgoaW50IGluZGV4KTsKLSAgY29uc3QgZGVmaVBhdGgqIHBhdGgoaW50IGluZGV4KSBjb25zdDsKLQotICBjb25zdCBjaGFyKiBub25EZWZhdWx0UnVsZSgpIGNvbnN0OwotCi0gIGludCAgICAgICAgIG51bVdpcmVzKCkgY29uc3Q7Ci0gIGRlZmlXaXJlKiAgIHdpcmUoaW50IGluZGV4KTsKLSAgY29uc3QgZGVmaVdpcmUqICAgd2lyZShpbnQgaW5kZXgpIGNvbnN0OwotCi0gIHZvaWQgYnVtcE5hbWUobG9uZyBsb25nIHNpemUpOwotICB2b2lkIGJ1bXBQaW5zKGxvbmcgbG9uZyAgc2l6ZSk7Ci0gIHZvaWQgYnVtcFBhdGhzKGxvbmcgbG9uZyAgc2l6ZSk7Ci0gIHZvaWQgY2xlYXIoKTsKLQotcHJvdGVjdGVkOgotICBjaGFyKiAgICAgICAgIG5hbWVfOyAgICAgICAgICAgIC8vIG5hbWUuCi0gIGludCAgICAgICAgICAgbmFtZVNpemVfOyAgICAgICAgICAvLyBhbGxvY2F0ZWQgc2l6ZSBvZiBuYW1lLgotICBpbnQgICAgICAgICAgIG51bVBpbnNfOyAgICAgICAgICAgLy8gbnVtYmVyIG9mIHBpbnMgdXNlZCBpbiBhcnJheS4KLSAgbG9uZyBsb25nICAgICBwaW5zQWxsb2NhdGVkXzsgICAgIC8vIG51bWJlciBvZiBwaW5zIGFsbG9jYXRlZCBpbiBhcnJheS4KLSAgY2hhcioqICAgICAgICBpbnN0YW5jZXNfOyAgICAgIC8vIGluc3RhbmNlIG5hbWVzIGZvciBjb25uZWN0aW9ucwotICBjaGFyKiogICAgICAgIHBpbnNfOyAgICAgICAgICAgLy8gcGluIG5hbWVzIGZvciBjb25uZWN0aW9ucwotICBjaGFyKiAgICAgICAgIHN5bnRoZXNpemVkXzsgICAgIC8vIHN5bnRoZXNpemVkIGZsYWdzIGZvciBwaW5zCi0gIGNoYXIqICAgICAgICAgbXVzdHNfOyAgICAgICAgICAgLy8gbXVzdC1qb2luIGZsYWdzCi0KLSAgLy8gV01EIC0tIHRoZSBmb2xsb3dpbmcgd2lsbCBiZSByZW1vdmVkIGJ5IHRoZSBuZXh0IHJlbGVhc2UKLSAgY2hhciAgICAgICBpc0ZpeGVkXzsgICAgICAgIC8vIG5ldCB0eXBlCi0gIGNoYXIgICAgICAgaXNSb3V0ZWRfOwotICBjaGFyICAgICAgIGlzQ292ZXJfOwotICBkZWZpUGF0aCoqIHBhdGhzXzsgICAgICAgICAgLy8gcGF0aHMgZm9yIHRoaXMgc3VibmV0Ci0gIGludCAgICAgICAgbnVtUGF0aHNfOyAgICAgICAvLyBudW1iZXIgb2YgcGF0aHMgdXNlZAotICBsb25nIGxvbmcgIHBhdGhzQWxsb2NhdGVkXzsgLy8gYWxsb2NhdGVkIHNpemUgb2YgcGF0aHMgYXJyYXkKLQotICBpbnQgICAgICAgIG51bVdpcmVzXzsgICAgICAgICAgLy8gbnVtYmVyIG9mIHdpcmVzIGRlZmluZWQgaW4gdGhlIHN1Ym5ldAotICBsb25nIGxvbmcgIHdpcmVzQWxsb2NhdGVkXzsgICAgLy8gbnVtYmVyIG9mIHdpcmVzIGFsbG9jYXRlZCBpbiB0aGUgc3VibmV0Ci0gIGRlZmlXaXJlKiogd2lyZXNfOyAgICAgICAgICAgICAvLyB0aGlzIHJlcGxhY2UgdGhlIHBhdGhzCi0gIGNoYXIqICAgICAgbm9uRGVmYXVsdFJ1bGVfOwotCi0gIGRlZnJEYXRhICpkZWZEYXRhOwotfTsKLQotCi0KLWNsYXNzIGRlZmlWcGluIHsKLXB1YmxpYzoKLSAgZGVmaVZwaW4oZGVmckRhdGEgKmRhdGEpOwotICB+ZGVmaVZwaW4oKTsKLQotICB2b2lkIEluaXQoY29uc3QgY2hhciogbmFtZSk7Ci0gIHZvaWQgRGVzdHJveSgpOwotICB2b2lkIHNldExheWVyKGNvbnN0IGNoYXIqIG5hbWUpOwotICB2b2lkIHNldEJvdW5kcyhpbnQgeGwsIGludCB5bCwgaW50IHhoLCBpbnQgeWgpOwotICB2b2lkIHNldE9yaWVudChpbnQgb3JpZW50KTsKLSAgdm9pZCBzZXRMb2MoaW50IHgsIGludCB5KTsKLSAgdm9pZCBzZXRTdGF0dXMoY2hhciBzdCk7Ci0KLSAgaW50IHhsKCkgY29uc3QgOwotICBpbnQgeWwoKSBjb25zdCA7Ci0gIGludCB4aCgpIGNvbnN0IDsKLSAgaW50IHloKCkgY29uc3QgOwotICBjaGFyIHN0YXR1cygpIGNvbnN0OyAgICAgIC8qIFAtcGxhY2VkLCBGLWZpeGVkLCBDLWNvdmVyLCAnICcgLSBub3Qgc2V0ICovCi0gIGludCBvcmllbnQoKSBjb25zdCA7Ci0gIGNvbnN0IGNoYXIqIG9yaWVudFN0cigpIGNvbnN0IDsKLSAgaW50IHhMb2MoKSBjb25zdDsKLSAgaW50IHlMb2MoKSBjb25zdDsKLSAgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBsYXllcigpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gIGludCB4bF87Ci0gIGludCB5bF87Ci0gIGludCB4aF87Ci0gIGludCB5aF87Ci0gIGludCBvcmllbnRfOyAgLyogMC03ICAtMSBpcyBubyBvcmllbnQgKi8KLSAgY2hhciBzdGF0dXNfOyAvKiBQLXBsYWNlZCAgRi1maXhlZCAgQy1jb3ZlciAgJyAnLSBub25lICovCi0gIGludCB4TG9jXzsKLSAgaW50IHlMb2NfOwotICBjaGFyKiBuYW1lXzsKLSAgY2hhciogbGF5ZXJfOwotCi0gIGRlZnJEYXRhICpkZWZEYXRhOwotfTsKLQotCi0KLS8vIFByZSA1LjQKLWNsYXNzIGRlZmlTaGllbGQgewotcHVibGljOgotICBkZWZpU2hpZWxkKGRlZnJEYXRhICpkYXRhKTsKLSAgfmRlZmlTaGllbGQoKTsKLQotICB2b2lkIEluaXQoY29uc3QgY2hhciogbmFtZSk7Ci0gIHZvaWQgRGVzdHJveSgpOwotICB2b2lkIGNsZWFyKCk7Ci0gIHZvaWQgYWRkUGF0aChkZWZpUGF0aCAqcCwgaW50IHJlc2V0LCBpbnQgbmV0T3NuZXQsIGludCAqbmVlZENiayk7Ci0KLSAgY29uc3QgY2hhciogc2hpZWxkTmFtZSgpIGNvbnN0OwotICBpbnQgICAgICAgICBudW1QYXRocygpIGNvbnN0OwotCi0gIGRlZmlQYXRoKiAgICAgICAgIHBhdGgoaW50IGluZGV4KTsKLSAgY29uc3QgZGVmaVBhdGgqICAgcGF0aChpbnQgaW5kZXgpIGNvbnN0OwotCi0gIHZvaWQgYnVtcFBhdGhzKGxvbmcgbG9uZyBzaXplKTsKLQotcHJvdGVjdGVkOgotICBjaGFyKiAgICAgIG5hbWVfOwotICBpbnQgICAgICAgIG51bVBhdGhzXzsKLSAgbG9uZyBsb25nICBwYXRoc0FsbG9jYXRlZF87Ci0gIGRlZmlQYXRoKiogcGF0aHNfOwotCi0gIGRlZnJEYXRhICpkZWZEYXRhOwotfTsKLQotCi0KLQotLy8gU3RydWN0IGhvbGRzIHRoZSBkYXRhIGZvciBvbmUgY29tcG9uZW50LgotY2xhc3MgZGVmaU5ldCB7Ci1wdWJsaWM6Ci0gIGRlZmlOZXQoZGVmckRhdGEgKmRhdGEpOwotICB2b2lkIEluaXQoKTsKLQotICB2b2lkIERlc3Ryb3koKTsKLSAgfmRlZmlOZXQoKTsKLQotICAvLyBSb3V0aW5lcyB1c2VkIGJ5IFlBQ0MgdG8gc2V0IHRoZSBmaWVsZHMgaW4gdGhlIG5ldC4KLSAgdm9pZCBzZXROYW1lKGNvbnN0IGNoYXIqIG5hbWUpOwotICB2b2lkIGFkZFBpbihjb25zdCBjaGFyKiBpbnN0YW5jZSwgY29uc3QgY2hhciogcGluLCBpbnQgc3luKTsKLSAgdm9pZCBhZGRNdXN0UGluKGNvbnN0IGNoYXIqIGluc3RhbmNlLCBjb25zdCBjaGFyKiBwaW4sIGludCBzeW4pOwotICB2b2lkIHNldFdlaWdodChpbnQgdyk7Ci0KLSAgLy8gV01EIC0tIHRoZSBmb2xsb3dpbmcgd2lsbCBiZSByZW1vdmVkIGJ5IHRoZSBuZXh0IHJlbGVhc2UKLSAgdm9pZCBzZXRUeXBlKGNvbnN0IGNoYXIqIHR5cCk7ICAvLyBFaXRoZXIgRklYRUQgQ09WRVIgUk9VVEVECi0KLSAgdm9pZCBhZGRQcm9wKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHZhbHVlLCBjb25zdCBjaGFyIHR5cGUpOwotICB2b2lkIGFkZE51bVByb3AoY29uc3QgY2hhciogbmFtZSwgY29uc3QgZG91YmxlIGQsCi0gICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YWx1ZSwgY29uc3QgY2hhciB0eXBlKTsKLSAgdm9pZCBhZGRTdWJuZXQoZGVmaVN1Ym5ldCogc3VibmV0KTsKLSAgLy8gTkVXOiBhIG5ldCBjYW4gaGF2ZSBtb3JlIHRoYW4gMSB3aXJlCi0gIHZvaWQgYWRkV2lyZShjb25zdCBjaGFyICp0eXAsIGNvbnN0IGNoYXIqIHdpcmVTaGllbGROYW1lKTsKLSAgdm9pZCBhZGRXaXJlUGF0aChkZWZpUGF0aCogcCwgaW50IHJlc2V0LCBpbnQgbmV0T3NuZXQsIGludCAqbmVlZENiayk7Ci0gIHZvaWQgYWRkU2hhcGUoY29uc3QgY2hhciAqc2hhcGVUeXBlKTsgICAgICAgICAvLyA1LjgKLSAgdm9pZCBzZXRTb3VyY2UoY29uc3QgY2hhciogdHlwKTsKLSAgdm9pZCBzZXRGaXhlZGJ1bXAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNC4xCi0gIHZvaWQgc2V0RnJlcXVlbmN5KGRvdWJsZSBmcmVxdWVuY3kpOyAgICAgICAgICAvLyA1LjQuMQotICB2b2lkIHNldE9yaWdpbmFsKGNvbnN0IGNoYXIqIHR5cCk7Ci0gIHZvaWQgc2V0UGF0dGVybihjb25zdCBjaGFyKiB0eXApOwotICB2b2lkIHNldENhcChkb3VibGUgdyk7Ci0gIHZvaWQgc2V0VXNlKGNvbnN0IGNoYXIqIHR5cCk7Ci0gIHZvaWQgc2V0Tm9uRGVmYXVsdFJ1bGUoY29uc3QgY2hhciogdHlwKTsKLSAgdm9pZCBzZXRTdHlsZShpbnQgc3R5bGUpOwotICB2b2lkIGFkZFNoaWVsZChjb25zdCBjaGFyKiBzaGllbGROZXROYW1lKTsgICAgLy8gcHJlIDUuNAotICB2b2lkIGFkZE5vU2hpZWxkKGNvbnN0IGNoYXIqIHNoaWVsZE5ldE5hbWUpOyAgLy8gcHJlIDUuNAotICB2b2lkIGFkZFNoaWVsZE5ldChjb25zdCBjaGFyKiBzaGllbGROZXROYW1lKTsKLQotICB2b2lkIGFkZFNoaWVsZFBhdGgoZGVmaVBhdGgqIHAsIGludCByZXNldCwgaW50IG5ldE9zbmV0LCBpbnQgKm5lZWRDYmspOwotICB2b2lkIGNsZWFyKCk7Ci0gIHZvaWQgc2V0V2lkdGgoY29uc3QgY2hhciogbGF5ZXIsIGRvdWJsZSBkaXN0KTsKLSAgdm9pZCBzZXRTcGFjaW5nKGNvbnN0IGNoYXIqIGxheWVyLCBkb3VibGUgZGlzdCk7Ci0gIHZvaWQgc2V0Vm9sdGFnZShkb3VibGUgbnVtKTsKLSAgdm9pZCBzZXRSYW5nZShkb3VibGUgbGVmdCwgZG91YmxlIHJpZ2h0KTsKLSAgdm9pZCBzZXRYVGFsayhpbnQgbnVtKTsKLSAgdm9pZCBhZGRWcGluKGNvbnN0IGNoYXIqIG5hbWUpOwotICB2b2lkIGFkZFZwaW5MYXllcihjb25zdCBjaGFyKiBuYW1lKTsKLSAgdm9pZCBhZGRWcGluTG9jKGNvbnN0IGNoYXIqIHN0YXR1cywgaW50IHgsIGludCB5LCBpbnQgb3JpZW50KTsKLSAgdm9pZCBhZGRWcGluQm91bmRzKGludCB4bCwgaW50IHlsLCBpbnQgeGgsIGludCB5aCk7Ci0gIC8vIDUuNgotICB2b2lkIGFkZFBvbHlnb24oY29uc3QgY2hhciogbGF5ZXJOYW1lLCBkZWZpR2VvbWV0cmllcyogZ2VvbSwgaW50ICpuZWVkQ2JrLAotCSAgICAgICAgICBpbnQgbWFzaywgY29uc3QgY2hhciogcm91dGVTdGF0dXMsCi0JCSAgY29uc3QgY2hhciogc2hhcGVUeXBlLAotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc2hpZWxkTmV0TmFtZSk7Ci0gIHZvaWQgYWRkUmVjdChjb25zdCBjaGFyKiBsYXllck5hbWUsIGludCB4bCwgaW50IHlsLCBpbnQgeGgsIGludCB5aCwKLSAgICAgICAgICAgICAgIGludCAqbmVlZENiaywgaW50IG1hc2ssIGNvbnN0IGNoYXIqIHJvdXRlU3RhdHVzLAotCSAgICAgICBjb25zdCBjaGFyKiBzaGFwZVR5cGUsCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzaGllbGROZXROYW1lKTsgLy8gNS42Ci0gIHZvaWQgYWRkUHRzKGNvbnN0IGNoYXIqIHZpYU5hbWUsIGludCBvLCBkZWZpR2VvbWV0cmllcyogZ2VvbSwKLQkgICAgICBpbnQgKm5lZWRDYmssIGludCBtYXNrLCBjb25zdCBjaGFyKiByb3V0ZVN0YXR1cywKLQkgICAgICBjb25zdCBjaGFyKiBzaGFwZVR5cGUsCi0gICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNoaWVsZE5ldE5hbWUpOyAgLy9WSUEgNS44Ci0KLSAgLy8gRm9yIE9BIHRvIG1vZGlmeSB0aGUgbmV0TmFtZSwgaWQgJiBwaW5OYW1lCi0gIHZvaWQgY2hhbmdlTmV0TmFtZShjb25zdCBjaGFyKiBuYW1lKTsKLSAgdm9pZCBjaGFuZ2VJbnN0YW5jZShjb25zdCBjaGFyKiBuYW1lLCBpbnQgaW5kZXgpOwotICB2b2lkIGNoYW5nZVBpbihjb25zdCBjaGFyKiBuYW1lLCBpbnQgaW5kZXgpOwotCi0gIC8vIFJvdXRpbmVzIHRvIHJldHVybiB0aGUgdmFsdWUgb2YgbmV0IGRhdGEuCi0gIGNvbnN0IGNoYXIqICBuYW1lKCkgY29uc3Q7Ci0gIGludCAgICAgICAgICB3ZWlnaHQoKSBjb25zdDsKLSAgaW50ICAgICAgICAgIG51bVByb3BzKCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqICBwcm9wTmFtZShpbnQgaW5kZXgpIGNvbnN0OwotICBjb25zdCBjaGFyKiAgcHJvcFZhbHVlKGludCBpbmRleCkgY29uc3Q7Ci0gIGRvdWJsZSBwcm9wTnVtYmVyKGludCBpbmRleCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIgICBwcm9wVHlwZShpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgICAgcHJvcElzTnVtYmVyKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCAgICBwcm9wSXNTdHJpbmcoaW50IGluZGV4KSBjb25zdDsKLSAgaW50ICAgICAgICAgIG51bUNvbm5lY3Rpb25zKCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqICBpbnN0YW5jZShpbnQgaW5kZXgpIGNvbnN0OwotICBjb25zdCBjaGFyKiAgcGluKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCAgICAgICAgICBwaW5Jc011c3RKb2luKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCAgICAgICAgICBwaW5Jc1N5bnRoZXNpemVkKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCAgICAgICAgICBudW1TdWJuZXRzKCkgY29uc3Q7Ci0KLSAgZGVmaVN1Ym5ldCogIHN1Ym5ldChpbnQgaW5kZXgpOwotICBjb25zdCBkZWZpU3VibmV0KiAgc3VibmV0KGludCBpbmRleCkgY29uc3Q7Ci0KLSAgLy8gV01EIC0tIHRoZSBmb2xsb3dpbmcgd2lsbCBiZSByZW1vdmVkIGJ5IHRoZSBuZXh0IHJlbGVhc2UKLSAgaW50ICAgICAgICAgaXNGaXhlZCgpIGNvbnN0OwotICBpbnQgICAgICAgICBpc1JvdXRlZCgpIGNvbnN0OwotICBpbnQgICAgICAgICBpc0NvdmVyKCkgY29uc3Q7Ci0KLSAgLyogVGhlIGZvbGxvd2luZyByb3V0aW5lcyBhcmUgZm9yIHdpcmluZyAqLwotICBpbnQgICAgICAgICBudW1XaXJlcygpIGNvbnN0OwotCi0gIGRlZmlXaXJlKiAgIHdpcmUoaW50IGluZGV4KTsKLSAgY29uc3QgZGVmaVdpcmUqICAgd2lyZShpbnQgaW5kZXgpIGNvbnN0OwotCi0gIC8qIFJvdXRpbmVzIHRvIGdldCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgVmlydHVhbCBQaW5zLiAqLwotICBpbnQgICAgICAgbnVtVnBpbnMoKSBjb25zdDsKLSAgCi0gIGRlZmlWcGluKiB2cGluKGludCBpbmRleCk7Ci0gIGNvbnN0IGRlZmlWcGluKiB2cGluKGludCBpbmRleCkgY29uc3Q7Ci0KLSAgaW50IGhhc1Byb3BzKCkgY29uc3Q7Ci0gIGludCBoYXNXZWlnaHQoKSBjb25zdDsKLSAgaW50IGhhc1N1Ym5ldHMoKSBjb25zdDsKLSAgaW50IGhhc1NvdXJjZSgpIGNvbnN0OwotICBpbnQgaGFzRml4ZWRidW1wKCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjQuMQotICBpbnQgaGFzRnJlcXVlbmN5KCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjQuMQotICBpbnQgaGFzUGF0dGVybigpIGNvbnN0OwotICBpbnQgaGFzT3JpZ2luYWwoKSBjb25zdDsKLSAgaW50IGhhc0NhcCgpIGNvbnN0OwotICBpbnQgaGFzVXNlKCkgY29uc3Q7Ci0gIGludCBoYXNTdHlsZSgpIGNvbnN0OwotICBpbnQgaGFzTm9uRGVmYXVsdFJ1bGUoKSBjb25zdDsKLSAgaW50IGhhc1ZvbHRhZ2UoKSBjb25zdDsKLSAgaW50IGhhc1NwYWNpbmdSdWxlcygpIGNvbnN0OwotICBpbnQgaGFzV2lkdGhSdWxlcygpIGNvbnN0OwotICBpbnQgaGFzWFRhbGsoKSBjb25zdDsKLQotICBpbnQgbnVtU3BhY2luZ1J1bGVzKCkgY29uc3Q7Ci0gIHZvaWQgc3BhY2luZ1J1bGUoaW50IGluZGV4LCBjaGFyKiogbGF5ZXIsIGRvdWJsZSogZGlzdCwgZG91YmxlKiBsZWZ0LAotICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmlnaHQpIGNvbnN0OwotICBpbnQgbnVtV2lkdGhSdWxlcygpIGNvbnN0OwotICB2b2lkIHdpZHRoUnVsZShpbnQgaW5kZXgsIGNoYXIqKiBsYXllciwgZG91YmxlKiBkaXN0KSBjb25zdDsKLSAgZG91YmxlIHZvbHRhZ2UoKSBjb25zdDsKLQotICBpbnQgICAgICAgICAgICBYVGFsaygpIGNvbnN0OwotICBjb25zdCBjaGFyKiAgICBzb3VyY2UoKSBjb25zdDsKLSAgZG91YmxlICAgICAgICAgZnJlcXVlbmN5KCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqICAgIG9yaWdpbmFsKCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqICAgIHBhdHRlcm4oKSBjb25zdDsKLSAgZG91YmxlICAgICAgICAgY2FwKCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqICAgIHVzZSgpIGNvbnN0OwotICBpbnQgICAgICAgICAgICBzdHlsZSgpIGNvbnN0OwotICBjb25zdCBjaGFyKiAgICBub25EZWZhdWx0UnVsZSgpIGNvbnN0OwotCi0gIC8vIFdNRCAtLSB0aGUgZm9sbG93aW5nIHdpbGwgYmUgcmVtb3ZlZCBieSB0aGUgbmV4dCByZWxlYXNlCi0gIGludCAgICAgICAgICAgIG51bVBhdGhzKCkgY29uc3Q7Ci0gIAotICBkZWZpUGF0aCogICAgICAgICAgICBwYXRoKGludCBpbmRleCk7Ci0gIGNvbnN0IGRlZmlQYXRoKiAgICAgIHBhdGgoaW50IGluZGV4KSBjb25zdDsKLQotICBpbnQgICAgICAgICAgICBudW1TaGllbGRzKCkgY29uc3Q7ICAgICAgICAgIC8vIHByZSA1LjQKLQotICBkZWZpU2hpZWxkKiAgICBzaGllbGQoaW50IGluZGV4KTsgICAgICAgICAgIC8vIHByZSA1LjQKLSAgY29uc3QgZGVmaVNoaWVsZCogICAgc2hpZWxkKGludCBpbmRleCkgY29uc3QgOyAgICAgICAgICAgLy8gcHJlIDUuNAotCi0gIGludCAgICAgICAgICAgIG51bVNoaWVsZE5ldHMoKSBjb25zdDsKLSAgY29uc3QgY2hhciogICAgc2hpZWxkTmV0KGludCBpbmRleCkgY29uc3Q7Ci0gIGludCAgICAgICAgICAgIG51bU5vU2hpZWxkcygpIGNvbnN0OyAgICAgICAgLy8gcHJlIDUuNAotCi0gIGRlZmlTaGllbGQqICAgIG5vU2hpZWxkKGludCBpbmRleCk7ICAgICAgICAgLy8gcHJlIDUuNAotICBjb25zdCBkZWZpU2hpZWxkKiAgICBub1NoaWVsZChpbnQgaW5kZXgpIGNvbnN0OyAgICAgICAgIC8vIHByZSA1LjQKLQotICAvLyA1LjYKLSAgaW50ICAgICAgICAgICAgbnVtUG9seWdvbnMoKSBjb25zdDsgICAgICAgICAgICAgICAgIC8vIDUuNgotICBjb25zdCAgY2hhciogICBwb2x5Z29uTmFtZShpbnQgaW5kZXgpIGNvbnN0OyAgICAgICAgLy8gNS42Ci0gIHN0cnVjdCBkZWZpUG9pbnRzIGdldFBvbHlnb24oaW50IGluZGV4KSBjb25zdDsgICAgICAvLyA1LjYKLSAgaW50ICAgICAgICAgICAgcG9seU1hc2soaW50IGluZGV4KSBjb25zdDsKLSAgY29uc3QgY2hhciogICAgcG9seVJvdXRlU3RhdHVzKGludCBpbmRleCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqICAgIHBvbHlSb3V0ZVN0YXR1c1NoaWVsZE5hbWUoaW50IGluZGV4KSBjb25zdDsKLSAgY29uc3QgY2hhciogICAgcG9seVNoYXBlVHlwZShpbnQgaW5kZXgpIGNvbnN0OwotCi0KLSAgaW50ICBudW1SZWN0YW5nbGVzKCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNgotICBjb25zdCAgY2hhciogcmVjdE5hbWUoaW50IGluZGV4KSBjb25zdDsgICAgICAgICAgICAgLy8gNS42Ci0gIGludCAgeGwoaW50IGluZGV4KWNvbnN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjYKLSAgaW50ICB5bChpbnQgaW5kZXgpY29uc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNgotICBpbnQgIHhoKGludCBpbmRleCljb25zdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIGludCAgeWgoaW50IGluZGV4KWNvbnN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjYKLSAgaW50ICByZWN0TWFzayhpbnQgaW5kZXgpY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIHJlY3RSb3V0ZVN0YXR1cyhpbnQgaW5kZXgpIGNvbnN0OwotICBjb25zdCBjaGFyKiByZWN0Um91dGVTdGF0dXNTaGllbGROYW1lKGludCBpbmRleCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIHJlY3RTaGFwZVR5cGUoaW50IGluZGV4KSBjb25zdDsKLSAgCi0KLSAgLy8gNS44Ci0gIGludCAgbnVtVmlhU3BlY3MoKSBjb25zdDsKLSAgc3RydWN0IGRlZmlQb2ludHMgZ2V0VmlhUHRzKGludCBpbmRleCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgY29uc3QgY2hhciogdmlhTmFtZShpbnQgaW5kZXgpIGNvbnN0OwotICBjb25zdCBpbnQgdmlhT3JpZW50KGludCBpbmRleCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIHZpYU9yaWVudFN0cihpbnQgaW5kZXgpIGNvbnN0OwotICBjb25zdCBpbnQgdG9wTWFza051bShpbnQgaW5kZXgpIGNvbnN0OwotICBjb25zdCBpbnQgY3V0TWFza051bShpbnQgaW5kZXgpIGNvbnN0OwotICBjb25zdCBpbnQgYm90dG9tTWFza051bShpbnQgaW5kZXgpIGNvbnN0OwotICBjb25zdCBjaGFyKiB2aWFSb3V0ZVN0YXR1cyhpbnQgaW5kZXgpIGNvbnN0OwotICBjb25zdCBjaGFyKiB2aWFSb3V0ZVN0YXR1c1NoaWVsZE5hbWUoaW50IGluZGV4KSBjb25zdDsKLSAgY29uc3QgY2hhciogdmlhU2hhcGVUeXBlKGludCBpbmRleCkgY29uc3Q7Ci0KLSAgLy8gRGVidWcgcHJpbnRpbmcKLSAgdm9pZCBwcmludChGSUxFKiBmKSBjb25zdDsKLQotCi0gIHZvaWQgYnVtcE5hbWUobG9uZyBsb25nIHNpemUpOwotICB2b2lkIGJ1bXBQaW5zKGxvbmcgbG9uZyBzaXplKTsKLSAgdm9pZCBidW1wUHJvcHMobG9uZyBsb25nIHNpemUpOwotICB2b2lkIGJ1bXBTdWJuZXRzKGxvbmcgbG9uZyBzaXplKTsKLSAgdm9pZCBidW1wUGF0aHMobG9uZyBsb25nICBzaXplKTsKLSAgdm9pZCBidW1wU2hpZWxkTmV0cyhsb25nIGxvbmcgc2l6ZSk7Ci0KLSAgLy8gVGhlIG1ldGhvZCBmcmVlV2lyZSgpIGlzIGFkZGVkIGlzIHVzZXIgc2VsZWN0IHRvIGhhdmUgYSBjYWxsYmFjawotICAvLyBwZXIgd2lyZSB3aXRoaW4gYSBuZXQgVGhpcyBpcyBhbiBpbnRlcm5hbCBtZXRob2QgYW5kIGlzIG5vdCBwdWJsaWMKLSAgdm9pZCBmcmVlV2lyZSgpOwotICB2b2lkIGZyZWVTaGllbGQoKTsKLQotICAvLyBDbGVhciB0aGUgcmVjdGFuZ2xlcyAmIHBvbHlnb25zIGRhdGEgaWYgcGFydGlhbCBwYXRoIGNhbGxiYWNrIGlzIHNldAotICB2b2lkIGNsZWFyUmVjdFBvbHlOUGF0aCgpOwotICB2b2lkIGNsZWFyUmVjdFBvbHkoKTsKLSAgdm9pZCBjbGVhclZpYSgpOwotCi1wcm90ZWN0ZWQ6Ci0gIGNoYXIqICAgICBuYW1lXzsgICAgICAgICAgLy8gbmFtZS4KLSAgaW50ICAgICAgIG5hbWVTaXplXzsgICAgICAvLyBhbGxvY2F0ZWQgc2l6ZSBvZiBuYW1lLgotICBpbnQgICAgICAgbnVtUGluc187ICAgICAgIC8vIG51bWJlciBvZiBwaW5zIHVzZWQgaW4gYXJyYXkuCi0gIGxvbmcgbG9uZyBwaW5zQWxsb2NhdGVkXzsgLy8gbnVtYmVyIG9mIHBpbnMgYWxsb2NhdGVkIGluIGFycmF5LgotICBjaGFyKiogICAgaW5zdGFuY2VzXzsgICAgIC8vIGluc3RhbmNlIG5hbWVzIGZvciBjb25uZWN0aW9ucwotICBjaGFyKiogICAgcGluc187ICAgICAgICAgIC8vIHBpbiBuYW1lcyBmb3IgY29ubmVjdGlvbnMKLSAgY2hhciogICAgIG11c3RzXzsgICAgICAgICAvLyBtdXN0LWpvaW4gZmxhZ3MgZm9yIHBpbnMKLSAgY2hhciogICAgIHN5bnRoZXNpemVkXzsgICAvLyBzeW50aGVzaXplZCBmbGFncyBmb3IgcGlucwotICBpbnQgICAgICAgd2VpZ2h0XzsgICAgICAgIC8vIG5ldCB3ZWlnaHQKLSAgY2hhciAgICAgIGhhc1dlaWdodF87ICAgICAvLyBmbGFnIGZvciBvcHRpb25hbCB3ZWlnaHQKLQotICAvLyBXTUQgLS0gdGhlIGZvbGxvd2luZyB3aWxsIGJlIHJlbW92ZWQgYnkgdGhlIG5leCByZWxlYXNlCi0gIGNoYXIgaXNGaXhlZF87ICAgICAgICAvLyBuZXQgdHlwZQotICBjaGFyIGlzUm91dGVkXzsKLSAgY2hhciBpc0NvdmVyXzsKLQotICBjaGFyIGhhc0NhcF87ICAgICAgICAgLy8gZmlsZSBzdXBwbGllZCBhIGNhcGFjaXRhbmNlIHZhbHVlCi0gIGNoYXIgaGFzRnJlcXVlbmN5XzsgICAvLyBmaWxlIHN1cHBsaWVkIGEgZnJlcXVlbmN5IHZhbHVlCi0gIGNoYXIgaGFzVm9sdGFnZV87Ci0gIGludCBudW1Qcm9wc187ICAgICAgICAvLyBudW0gb2YgcHJvcHMgaW4gYXJyYXkKLSAgY2hhcioqICBwcm9wTmFtZXNfOyAgIC8vIFByb3AgbmFtZXMKLSAgY2hhcioqICBwcm9wVmFsdWVzXzsgIC8vIFByb3AgdmFsdWVzIEFsbCBpbiBzdHJpbmdzIQotICBkb3VibGUqIHByb3BEVmFsdWVzXzsgLy8gUHJvcCB2YWx1ZXMgaW4gbnVtYmVycyEKLSAgY2hhciogICBwcm9wVHlwZXNfOyAgIC8vIFByb3AgdHlwZXMsICdJJyAtIEludGVnZXIsICdSJyAtIFJlYWwsICdTJyAtIFN0cmluZwotCi0gIGxvbmcgbG9uZyAgICBwcm9wc0FsbG9jYXRlZF87ICAgLy8gYWxsb2NhdGVkIHNpemUgb2YgcHJvcHMgYXJyYXkKLSAgaW50ICAgICAgICAgIG51bVN1Ym5ldHNfOyAgICAgICAvLyBudW0gb2Ygc3VibmV0cyBpbiBhcnJheQotICBkZWZpU3VibmV0Kiogc3VibmV0c187ICAgICAgICAgIC8vIFByb3AgbmFtZXMKLSAgbG9uZyBsb25nICAgIHN1Ym5ldHNBbGxvY2F0ZWRfOyAvLyBhbGxvY2F0ZWQgc2l6ZSBvZiBwcm9wcyBhcnJheQotICBkb3VibGUgICAgICAgY2FwXzsgICAgICAgICAgICAgIC8vIGNhcCB2YWx1ZQotICBjaGFyKiAgICAgICAgc291cmNlXzsKLSAgaW50ICAgICAgICAgIGZpeGVkYnVtcF87ICAgICAvLyA1LjQuMQotICBkb3VibGUgICAgICAgZnJlcXVlbmN5XzsgICAgIC8vIDUuNC4xCi0gIGNoYXIqIHBhdHRlcm5fOwotICBjaGFyKiBvcmlnaW5hbF87Ci0gIGNoYXIqIHVzZV87Ci0gIGNoYXIqIG5vbkRlZmF1bHRSdWxlXzsKLSAgaW50ICAgc3R5bGVfOwotCi0gIC8vIFdNRCAtLSB0aGUgZm9sbG93aW5nIHdpbGwgYmUgcmVtb3ZlZCBieSB0aGUgbmV4IHJlbGVhc2UKLSAgZGVmaVBhdGgqKiBwYXRoc187ICAgICAgICAgIC8vIHBhdGhzIGZvciB0aGlzIHN1Ym5ldAotICBpbnQgICAgICAgIG51bVBhdGhzXzsgICAgICAgLy8gbnVtYmVyIG9mIHBhdGhzIHVzZWQKLSAgbG9uZyBsb25nICBwYXRoc0FsbG9jYXRlZF87IC8vIGFsbG9jYXRlZCBzaXplIG9mIHBhdGhzIGFycmF5Ci0KLSAgZG91YmxlIHZvbHRhZ2VfOwotCi0gIGludCAgICAgICAgIG51bVdpcmVzXzsgICAgICAgICAvLyBudW1iZXIgb2Ygd2lyZXMgZGVmaW5lZCBpbiB0aGUgbmV0Ci0gIGxvbmcgbG9uZyAgIHdpcmVzQWxsb2NhdGVkXzsgICAvLyBhbGxvY2F0ZWQgc2l6ZSBvZiB3aXJlIHBhdGhzIGFycmF5Ci0gIGRlZmlXaXJlKiogIHdpcmVzXzsgICAgICAgICAgICAvLyB0aGlzIHJlcGxhY2UgdGhlIHBhdGhzCi0KLSAgbG9uZyBsb25nICAgd2lkdGhzQWxsb2NhdGVkXzsKLSAgaW50ICAgICAgICAgbnVtV2lkdGhzXzsKLSAgY2hhcioqICAgICAgd2xheWVyc187Ci0gIGRvdWJsZSogICAgIHdkaXN0XzsKLQotICBsb25nIGxvbmcgICBzcGFjaW5nQWxsb2NhdGVkXzsKLSAgaW50ICAgICAgICAgbnVtU3BhY2luZ187Ci0gIGNoYXIqKiAgICAgIHNsYXllcnNfOwotICBkb3VibGUqICAgICBzZGlzdF87Ci0gIGRvdWJsZSogICAgIHNsZWZ0XzsKLSAgZG91YmxlKiAgICAgc3JpZ2h0XzsKLSAgaW50ICAgICAgICAgeFRhbGtfOwotCi0gIGludCAgICAgICAgIG51bVZwaW5zXzsKLSAgbG9uZyBsb25nICAgdnBpbnNBbGxvY2F0ZWRfOwotICBkZWZpVnBpbioqICB2cGluc187Ci0KLSAgaW50ICAgICAgICAgIG51bVNoaWVsZHNfOyAgICAgICAgICAgIC8vIG51bWJlciBvZiBTSElFTEQgcGF0aHMgdXNlZAotICBsb25nIGxvbmcgICAgc2hpZWxkc0FsbG9jYXRlZF87ICAgICAgLy8gYWxsb2NhdGVkIHNpemUgb2YgU0hJRUxEIHBhdGhzIGFycmF5Ci0gIGRlZmlTaGllbGQqKiBzaGllbGRzXzsgICAgICAgICAgICAgICAvLyBTSElFTEQgZGF0YSAKLSAgaW50ICAgICAgICAgIG51bU5vU2hpZWxkc187ICAgICAgICAgIC8vIG51bWJlciBvZiBOT1NISUVMRCBwYXRocyB1c2VkCi0KLSAgaW50ICAgICAgICAgIG51bVNoaWVsZE5ldF87ICAgICAgICAgIC8vIG51bWJlciBvZiBTSElFTERORVRTIHVzZWQgaW4gYXJyYXkuCi0gIGxvbmcgbG9uZyAgICBzaGllbGROZXRzQWxsb2NhdGVkXzsgICAvLyBudW1iZXIgb2YgU0hJRUxETkVUUyBhbGxvY2F0ZWQgaW4gYXJyYXkuCi0gIGNoYXIqKiAgICAgICBzaGllbGROZXRfOyAgICAgICAgICAgICAvLyBuYW1lIG9mIHRoZSBTSElFTERORVQKLQotICBpbnQgICAgICAgICAgbnVtUG9seXNfOyAgICAgICAgICAgICAgLy8gNS42Ci0gIGNoYXIqKiAgICAgICBwb2x5Z29uTmFtZXNfOyAgICAgICAgICAvLyA1LjYgbGF5ZXJOYW1lIGZvciBQT0xZR09OCi0gIGxvbmcgbG9uZyAgICBwb2x5c0FsbG9jYXRlZF87ICAgICAgICAvLyA1LjYKLSAgc3RydWN0IGRlZmlQb2ludHMqKiBwb2x5Z29uc187ICAgICAgIC8vIDUuNgotICBpbnQqICAgICAgICAgcG9seU1hc2tzXzsKLSAgY2hhcioqIHBvbHlSb3V0ZVN0YXR1c187Ci0gIGNoYXIqKiBwb2x5U2hhcGVUeXBlc187Ci0gIGNoYXIqKiBwb2x5Um91dGVTdGF0dXNTaGllbGROYW1lc187Ci0KLSAgaW50ICAgICAgICBudW1SZWN0c187ICAgICAgICAgICAgICAgICAgICAvLyA1LjYKLSAgbG9uZyBsb25nICByZWN0c0FsbG9jYXRlZF87ICAgICAgICAgICAgICAvLyA1LjYKLSAgY2hhcioqICAgICByZWN0TmFtZXNfOyAgICAgICAgICAgICAgICAgICAvLyA1LjYKLSAgaW50KiB4bF87Ci0gIGludCogeWxfOwotICBpbnQqIHhoXzsKLSAgaW50KiB5aF87Ci0gIGludCogcmVjdE1hc2tzXzsKLSAgY2hhcioqIHJlY3RSb3V0ZVN0YXR1c187Ci0gIGNoYXIqKiByZWN0Um91dGVTdGF0dXNTaGllbGROYW1lc187Ci0gIGNoYXIqKiByZWN0U2hhcGVUeXBlc187Ci0gIAotCi0gIHN0cnVjdCBkZWZpUG9pbnRzKiogdmlhUHRzXzsgICAgICAvLyA1LjggICAgICAgICAgICAgICAgICAKLSAgY2hhcioqICAgICAgICAgICAgICB2aWFOYW1lc187ICAgICAgICAgICAgICAgICAgIAotICBpbnQgICAgICAgICAgICAgICAgIG51bVB0c187ICAgICAgICAgICAgICAgICAgICAKLSAgbG9uZyBsb25nICAgICAgICAgICBwdHNBbGxvY2F0ZWRfOwotICBpbnQqICAgICAgICAgICAgICAgIHZpYU9yaWVudHNfOwotICBpbnQqICAgICAgICAgICAgICAgIHZpYU1hc2tzXzsKLSAgY2hhcioqICAgICAgICAgICAgICB2aWFSb3V0ZVN0YXR1c187Ci0gIGNoYXIqKiAgICAgICAgICAgICAgdmlhUm91dGVTdGF0dXNTaGllbGROYW1lc187Ci0gIGNoYXIqKiAgICAgICAgICAgICAgdmlhU2hhcGVUeXBlc187Ci0KLSAgZGVmckRhdGEgKmRlZkRhdGE7Ci19OwotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotVVNFX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpTm9uRGVmYXVsdC5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlOb25EZWZhdWx0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY3MzhlMC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlOb25EZWZhdWx0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDcwNyArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEzIC0gMjAxNSwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJsZXguaCIKLSNpbmNsdWRlICJkZWZpTm9uRGVmYXVsdC5ocHAiCi0jaW5jbHVkZSAiZGVmaURlYnVnLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gICAgIGRlZmlOb25EZWZhdWx0Ci0vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLWRlZmlOb25EZWZhdWx0OjpkZWZpTm9uRGVmYXVsdChkZWZyRGF0YSAqZGF0YSkKLTogZGVmRGF0YShkYXRhKSB7IAotICBJbml0KCk7Ci19Ci0KLXZvaWQgZGVmaU5vbkRlZmF1bHQ6OkluaXQoKSB7IAotICBuYW1lXyA9IDA7Ci0gIGhhcmRTcGFjaW5nXyA9IDA7Ci0gIG51bUxheWVyc18gPSAwOwotICB3aWR0aF8gPSAwOwotICBoYXNEaWFnV2lkdGhfID0gMDsKLSAgaGFzU3BhY2luZ18gPSAwOwotICBoYXNXaXJlRXh0XyA9IDA7Ci0gIG51bVZpYXNfID0gMDsKLSAgdmlhc0FsbG9jYXRlZF8gPSAwOwotICB2aWFOYW1lc18gPSAwOwotICBudW1WaWFSdWxlc18gPSAwOwotICB2aWFSdWxlc0FsbG9jYXRlZF8gPSAwOwotICB2aWFSdWxlTmFtZXNfID0gMDsKLSAgbnVtTWluQ3V0c18gPSAwOwotICBtaW5DdXRzQWxsb2NhdGVkXyA9IDA7Ci0gIGN1dExheWVyTmFtZV8gPSAwOwotICBudW1DdXRzXyA9IDA7Ci0gIG51bVByb3BzXyA9IDA7Ci0gIHByb3BzQWxsb2NhdGVkXyA9IDA7Ci0gIG5hbWVzXyA9IDA7Ci0gIHZhbHVlc18gPSAwOwotICBkdmFsdWVzXyA9IDA7Ci0gIHR5cGVzXyA9IDA7Ci0gIGxheWVyc0FsbG9jYXRlZF8gPSAwOwotICBsYXllck5hbWVfID0gMDsKLSAgd2lkdGhfID0gMDsKLSAgaGFzRGlhZ1dpZHRoXyA9IDA7Ci0gIGRpYWdXaWR0aF8gPSAwOwotICBoYXNTcGFjaW5nXyA9IDA7Ci0gIHNwYWNpbmdfID0gMDsKLSAgaGFzV2lyZUV4dF8gPSAwOwotICB3aXJlRXh0XyA9IDA7Ci19Ci0KLWRlZmlOb25EZWZhdWx0Ojp+ZGVmaU5vbkRlZmF1bHQoKSB7IAotICBEZXN0cm95KCk7Ci19Ci0KLXZvaWQgZGVmaU5vbkRlZmF1bHQ6OkRlc3Ryb3koKSB7Ci0gIGNsZWFyKCk7Ci0gIGlmIChwcm9wc0FsbG9jYXRlZF8pIHsKLSAgICBmcmVlKChjaGFyKikobmFtZXNfKSk7Ci0gICAgZnJlZSgoY2hhciopKHZhbHVlc18pKTsKLSAgICBmcmVlKChjaGFyKikoZHZhbHVlc18pKTsKLSAgICBmcmVlKChjaGFyKikodHlwZXNfKSk7Ci0gIH0KLSAgaWYgKGxheWVyc0FsbG9jYXRlZF8pIHsKLSAgICBmcmVlKChjaGFyKikobGF5ZXJOYW1lXykpOwotICAgIGZyZWUoKGNoYXIqKSh3aWR0aF8pKTsKLSAgICBmcmVlKChjaGFyKikoaGFzRGlhZ1dpZHRoXykpOwotICAgIGZyZWUoKGNoYXIqKShkaWFnV2lkdGhfKSk7Ci0gICAgZnJlZSgoY2hhciopKGhhc1NwYWNpbmdfKSk7Ci0gICAgZnJlZSgoY2hhciopKHNwYWNpbmdfKSk7Ci0gICAgZnJlZSgoY2hhciopKGhhc1dpcmVFeHRfKSk7Ci0gICAgZnJlZSgoY2hhciopKHdpcmVFeHRfKSk7Ci0gIH0KLSAgaWYgKHZpYXNBbGxvY2F0ZWRfKQotICAgIGZyZWUoKGNoYXIqKSh2aWFOYW1lc18pKTsKLSAgaWYgKHZpYVJ1bGVzQWxsb2NhdGVkXykKLSAgICBmcmVlKChjaGFyKikodmlhUnVsZU5hbWVzXykpOwotICBpZiAobWluQ3V0c0FsbG9jYXRlZF8pIHsKLSAgICBmcmVlKChjaGFyKikoY3V0TGF5ZXJOYW1lXykpOwotICAgIGZyZWUoKGNoYXIqKShudW1DdXRzXykpOwotICB9Ci19Ci0KLXZvaWQgZGVmaU5vbkRlZmF1bHQ6OmNsZWFyKCkgeyAKLSAgaW50IGk7Ci0KLSAgaWYgKG5hbWVfKQotICAgIGZyZWUobmFtZV8pOwotICBoYXJkU3BhY2luZ18gPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgbnVtUHJvcHNfOyBpKyspIHsKLSAgICBmcmVlKG5hbWVzX1tpXSk7Ci0gICAgZnJlZSh2YWx1ZXNfW2ldKTsKLSAgICBkdmFsdWVzX1tpXSA9IDA7Ci0gIH0KLSAgbnVtUHJvcHNfID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IG51bUxheWVyc187IGkrKykKLSAgICBmcmVlKGxheWVyTmFtZV9baV0pOwotICBudW1MYXllcnNfID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IG51bVZpYXNfOyBpKyspCi0gICAgZnJlZSgoY2hhciopKHZpYU5hbWVzX1tpXSkpOwotICBudW1WaWFzXyA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBudW1WaWFSdWxlc187IGkrKykKLSAgICBmcmVlKChjaGFyKikodmlhUnVsZU5hbWVzX1tpXSkpOwotICBudW1WaWFSdWxlc18gPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgbnVtTWluQ3V0c187IGkrKykKLSAgICBmcmVlKChjaGFyKikoY3V0TGF5ZXJOYW1lX1tpXSkpOwotICBudW1NaW5DdXRzXyA9IDA7Ci19Ci0KLXZvaWQgZGVmaU5vbkRlZmF1bHQ6OnNldE5hbWUoY29uc3QgY2hhciogbmFtZSkgeyAKLSAgbmFtZV8gPSAoY2hhciopbWFsbG9jKHN0cmxlbihuYW1lKSsxKTsKLSAgc3RyY3B5KG5hbWVfLCBkZWZEYXRhLT5ERUZDQVNFKG5hbWUpKTsKLX0KLQotdm9pZCBkZWZpTm9uRGVmYXVsdDo6c2V0SGFyZHNwYWNpbmcoKSB7Ci0gIGhhcmRTcGFjaW5nXyA9IDE7Ci19Ci0KLXZvaWQgZGVmaU5vbkRlZmF1bHQ6OmFkZExheWVyKGNvbnN0IGNoYXIqIG5hbWUpIHsgCi0gIGludCBsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotICBpZiAobnVtTGF5ZXJzXyA9PSBsYXllcnNBbGxvY2F0ZWRfKSB7Ci0gICAgaW50IGk7Ci0gICAgY2hhcioqICBuZXdsOwotICAgIGRvdWJsZSogbmV3dzsKLSAgICBkb3VibGUqIG5ld2Q7Ci0gICAgZG91YmxlKiBuZXdzOwotICAgIGRvdWJsZSogbmV3ZTsKLSAgICBjaGFyKiAgIG5ld2hkOwotICAgIGNoYXIqICAgbmV3aHM7Ci0gICAgY2hhciogICBuZXdoZTsKLQotICAgIGlmIChsYXllcnNBbGxvY2F0ZWRfID09IDApCi0gICAgICBsYXllcnNBbGxvY2F0ZWRfID0gMjsKLSAgICBlbHNlCi0gICAgICBsYXllcnNBbGxvY2F0ZWRfICo9IDI7Ci0gICAgbmV3bCA9IChjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikgKiBsYXllcnNBbGxvY2F0ZWRfKTsKLSAgICBuZXdlID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpICogbGF5ZXJzQWxsb2NhdGVkXyk7Ci0gICAgbmV3dyA9IChkb3VibGUqKW1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGxheWVyc0FsbG9jYXRlZF8pOwotICAgIG5ld2QgPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBsYXllcnNBbGxvY2F0ZWRfKTsKLSAgICBuZXdzID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpICogbGF5ZXJzQWxsb2NhdGVkXyk7Ci0gICAgbmV3aGUgPSAoY2hhciopbWFsbG9jKHNpemVvZihjaGFyKSAqIGxheWVyc0FsbG9jYXRlZF8pOwotICAgIG5ld2hkID0gKGNoYXIqKW1hbGxvYyhzaXplb2YoY2hhcikgKiBsYXllcnNBbGxvY2F0ZWRfKTsKLSAgICBuZXdocyA9IChjaGFyKiltYWxsb2Moc2l6ZW9mKGNoYXIpICogbGF5ZXJzQWxsb2NhdGVkXyk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bUxheWVyc187IGkrKykgewotICAgICAgbmV3bFtpXSAgPSBsYXllck5hbWVfW2ldOwotICAgICAgbmV3d1tpXSAgPSB3aWR0aF9baV07Ci0gICAgICBuZXdkW2ldICA9IGRpYWdXaWR0aF9baV07Ci0gICAgICBuZXdzW2ldICA9IHNwYWNpbmdfW2ldOwotICAgICAgbmV3ZVtpXSAgPSB3aXJlRXh0X1tpXTsKLSAgICAgIG5ld2hlW2ldICA9IGhhc1dpcmVFeHRfW2ldOwotICAgICAgbmV3aGRbaV0gID0gaGFzRGlhZ1dpZHRoX1tpXTsKLSAgICAgIG5ld2hzW2ldICA9IGhhc1NwYWNpbmdfW2ldOwotICAgIH0KLSAgICBpZiAobGF5ZXJzQWxsb2NhdGVkXyA+IDIpIHsKLSAgICAgIGZyZWUoKGNoYXIqKShsYXllck5hbWVfKSk7Ci0gICAgICBmcmVlKChjaGFyKikod2lkdGhfKSk7Ci0gICAgICBmcmVlKChjaGFyKikoZGlhZ1dpZHRoXykpOwotICAgICAgZnJlZSgoY2hhciopKHNwYWNpbmdfKSk7Ci0gICAgICBmcmVlKChjaGFyKikod2lyZUV4dF8pKTsKLSAgICAgIGZyZWUoKGNoYXIqKShoYXNXaXJlRXh0XykpOwotICAgICAgZnJlZSgoY2hhciopKGhhc0RpYWdXaWR0aF8pKTsKLSAgICAgIGZyZWUoKGNoYXIqKShoYXNTcGFjaW5nXykpOwotICAgIH0KLSAgICBsYXllck5hbWVfID0gbmV3bDsKLSAgICB3aWR0aF8gPSBuZXd3OwotICAgIGRpYWdXaWR0aF8gPSBuZXdkOwotICAgIHNwYWNpbmdfID0gbmV3czsKLSAgICB3aXJlRXh0XyA9IG5ld2U7Ci0gICAgaGFzRGlhZ1dpZHRoXyA9IG5ld2hkOwotICAgIGhhc1NwYWNpbmdfID0gbmV3aHM7Ci0gICAgaGFzV2lyZUV4dF8gPSBuZXdoZTsKLSAgfQotICBsYXllck5hbWVfW251bUxheWVyc19dID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICBzdHJjcHkobGF5ZXJOYW1lX1tudW1MYXllcnNfXSwgZGVmRGF0YS0+REVGQ0FTRShuYW1lKSk7Ci0gIHdpZHRoX1tudW1MYXllcnNfXSA9IDAuMDsKLSAgZGlhZ1dpZHRoX1tudW1MYXllcnNfXSA9IDAuMDsKLSAgc3BhY2luZ19bbnVtTGF5ZXJzX10gPSAwLjA7Ci0gIHdpcmVFeHRfW251bUxheWVyc19dID0gMC4wOwotICBoYXNEaWFnV2lkdGhfW251bUxheWVyc19dID0gJ1wwJzsKLSAgaGFzU3BhY2luZ19bbnVtTGF5ZXJzX10gPSAnXDAnOwotICBoYXNXaXJlRXh0X1tudW1MYXllcnNfXSA9ICdcMCc7Ci0gIG51bUxheWVyc18gKz0gMTsKLX0KLQotdm9pZCBkZWZpTm9uRGVmYXVsdDo6YWRkV2lkdGgoZG91YmxlIG51bSkgeyAKLSAgd2lkdGhfW251bUxheWVyc18tMV0gPSBudW07Ci19Ci0KLXZvaWQgZGVmaU5vbkRlZmF1bHQ6OmFkZERpYWdXaWR0aChkb3VibGUgbnVtKSB7IAotICBkaWFnV2lkdGhfW251bUxheWVyc18tMV0gPSBudW07Ci0gIGhhc0RpYWdXaWR0aF9bbnVtTGF5ZXJzXy0xXSA9IDE7Ci19Ci0KLXZvaWQgZGVmaU5vbkRlZmF1bHQ6OmFkZFNwYWNpbmcoZG91YmxlIG51bSkgeyAKLSAgc3BhY2luZ19bbnVtTGF5ZXJzXy0xXSA9IG51bTsKLSAgaGFzU3BhY2luZ19bbnVtTGF5ZXJzXy0xXSA9IDE7Ci19Ci0KLXZvaWQgZGVmaU5vbkRlZmF1bHQ6OmFkZFdpcmVFeHQoZG91YmxlIG51bSkgeyAKLSAgd2lyZUV4dF9bbnVtTGF5ZXJzXy0xXSA9IG51bTsKLSAgaGFzV2lyZUV4dF9bbnVtTGF5ZXJzXy0xXSA9IDE7Ci19Ci0KLXZvaWQgZGVmaU5vbkRlZmF1bHQ6OmFkZFZpYShjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIGlmIChudW1WaWFzXyA9PSB2aWFzQWxsb2NhdGVkXykgewotICAgIGludCBpOwotICAgIGNoYXIqKiB2bjsKLQotICAgIGlmICh2aWFzQWxsb2NhdGVkXyA9PSAwKQotICAgICAgdmlhc0FsbG9jYXRlZF8gPSAyOwotICAgIGVsc2UKLSAgICAgIHZpYXNBbGxvY2F0ZWRfICo9IDI7Ci0gICAgdm4gPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKiB2aWFzQWxsb2NhdGVkXyk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bVZpYXNfOyBpKyspIHsKLSAgICAgIHZuW2ldID0gdmlhTmFtZXNfW2ldOwotICAgIH0KLSAgICBmcmVlKChjaGFyKikodmlhTmFtZXNfKSk7Ci0gICAgdmlhTmFtZXNfID0gdm47Ci0gIH0gCi0gIHZpYU5hbWVzX1tudW1WaWFzX10gPSAoY2hhciopbWFsbG9jKHN0cmxlbihuYW1lKSsxKTsKLSAgc3RyY3B5KHZpYU5hbWVzX1tudW1WaWFzX10sIGRlZkRhdGEtPkRFRkNBU0UobmFtZSkpOwotICBudW1WaWFzXyArPSAxOwotfQotCi12b2lkIGRlZmlOb25EZWZhdWx0OjphZGRWaWFSdWxlKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgaWYgKG51bVZpYVJ1bGVzXyA9PSB2aWFSdWxlc0FsbG9jYXRlZF8pIHsKLSAgICBpbnQgaTsKLSAgICBjaGFyKiogdm47Ci0KLSAgICBpZiAodmlhUnVsZXNBbGxvY2F0ZWRfID09IDApCi0gICAgICB2aWFSdWxlc0FsbG9jYXRlZF8gPSAyOwotICAgIGVsc2UKLSAgICAgIHZpYVJ1bGVzQWxsb2NhdGVkXyAqPSAyOwotICAgIHZuID0gKGNoYXIqKiltYWxsb2Moc2l6ZW9mKGNoYXIqKSogdmlhUnVsZXNBbGxvY2F0ZWRfKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVmlhUnVsZXNfOyBpKyspIHsKLSAgICAgIHZuW2ldID0gdmlhUnVsZU5hbWVzX1tpXTsKLSAgICB9Ci0gICAgZnJlZSgoY2hhciopKHZpYVJ1bGVOYW1lc18pKTsKLSAgICB2aWFSdWxlTmFtZXNfID0gdm47Ci0gIH0gCi0gIHZpYVJ1bGVOYW1lc19bbnVtVmlhUnVsZXNfXSA9IChjaGFyKiltYWxsb2Moc3RybGVuKG5hbWUpKzEpOwotICBzdHJjcHkodmlhUnVsZU5hbWVzX1tudW1WaWFSdWxlc19dLCBkZWZEYXRhLT5ERUZDQVNFKG5hbWUpKTsKLSAgbnVtVmlhUnVsZXNfICs9IDE7Ci19Ci0KLXZvaWQgZGVmaU5vbkRlZmF1bHQ6OmFkZE1pbkN1dHMoY29uc3QgY2hhciogbmFtZSwgaW50IG51bUN1dHMpIHsKLSAgaWYgKG51bU1pbkN1dHNfID09IG1pbkN1dHNBbGxvY2F0ZWRfKSB7Ci0gICAgaW50IGk7Ci0gICAgY2hhcioqIGNsbjsKLSAgICBpbnQqICAgbmM7Ci0KLSAgICBpZiAobWluQ3V0c0FsbG9jYXRlZF8gPT0gMCkKLSAgICAgIG1pbkN1dHNBbGxvY2F0ZWRfID0gMjsKLSAgICBlbHNlCi0gICAgICBtaW5DdXRzQWxsb2NhdGVkXyAqPSAyOwotICAgIGNsbiA9IChjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikqIG1pbkN1dHNBbGxvY2F0ZWRfKTsKLSAgICBuYyA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSogbWluQ3V0c0FsbG9jYXRlZF8pOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1NaW5DdXRzXzsgaSsrKSB7Ci0gICAgICBjbG5baV0gPSBjdXRMYXllck5hbWVfW2ldOwotICAgICAgbmNbaV0gID0gbnVtQ3V0c19baV07Ci0gICAgfQotICAgIGlmIChtaW5DdXRzQWxsb2NhdGVkXyA+IDIpIHsKLSAgICAgIGZyZWUoKGNoYXIqKShjdXRMYXllck5hbWVfKSk7Ci0gICAgICBmcmVlKChjaGFyKikobnVtQ3V0c18pKTsKLSAgICB9Ci0gICAgY3V0TGF5ZXJOYW1lXyA9IGNsbjsKLSAgICBudW1DdXRzXyA9IG5jOwotICB9IAotICBjdXRMYXllck5hbWVfW251bU1pbkN1dHNfXSA9IChjaGFyKiltYWxsb2Moc3RybGVuKG5hbWUpKzEpOwotICBzdHJjcHkoY3V0TGF5ZXJOYW1lX1tudW1NaW5DdXRzX10sIGRlZkRhdGEtPkRFRkNBU0UobmFtZSkpOwotICBudW1DdXRzX1tudW1NaW5DdXRzX10gPSBudW1DdXRzOwotICBudW1NaW5DdXRzXyArPSAxOwotfQotCi1jb25zdCBjaGFyKiBkZWZpTm9uRGVmYXVsdDo6bmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG5hbWVfOwotfQotCi1pbnQgZGVmaU5vbkRlZmF1bHQ6Omhhc0hhcmRzcGFjaW5nKCkgY29uc3QgewotICByZXR1cm4gaGFyZFNwYWNpbmdfOwotfQotCi1pbnQgZGVmaU5vbkRlZmF1bHQ6Om51bUxheWVycygpIGNvbnN0IHsgCi0gIHJldHVybiBudW1MYXllcnNfOwotfQotCi1jb25zdCBjaGFyKiBkZWZpTm9uRGVmYXVsdDo6bGF5ZXJOYW1lKGludCBpbmRleCkgY29uc3QgeyAKLSAgY2hhciBtc2dbMTYwXTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1MYXllcnNfKSB7Ci0gICAgIHNwcmludGYgKG1zZywgIkVSUk9SIChERUZQQVJTLTYwOTApOiBUaGUgaW5kZXggbnVtYmVyICVkIHNwZWNpZmllZCBmb3IgdGhlIE5PTkRFRkFVTFQgTEFZRVIgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgICBpbmRleCwgbnVtTGF5ZXJzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MDkwLCBtc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gbGF5ZXJOYW1lX1tpbmRleF07Ci19Ci0KLS8vIFdpbGwgYmUgb2Jzb2xldGVkIGluIDUuNwotZG91YmxlIGRlZmlOb25EZWZhdWx0OjpsYXllcldpZHRoKGludCBpbmRleCkgY29uc3QgeyAKLSAgY2hhciBtc2dbMTYwXTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1MYXllcnNfKSB7Ci0gICAgIHNwcmludGYgKG1zZywgIkVSUk9SIChERUZQQVJTLTYwOTApOiBUaGUgaW5kZXggbnVtYmVyICVkIHNwZWNpZmllZCBmb3IgdGhlIE5PTkRFRkFVTFQgTEFZRVIgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgICBpbmRleCwgbnVtTGF5ZXJzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MDkwLCBtc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gd2lkdGhfW2luZGV4XTsKLX0KLQotaW50IGRlZmlOb25EZWZhdWx0OjpsYXllcldpZHRoVmFsKGludCBpbmRleCkgY29uc3QgeyAKLSAgY2hhciBtc2dbMTYwXTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1MYXllcnNfKSB7Ci0gICAgIHNwcmludGYgKG1zZywgIkVSUk9SIChERUZQQVJTLTYwOTApOiBUaGUgaW5kZXggbnVtYmVyICVkIHNwZWNpZmllZCBmb3IgdGhlIE5PTkRFRkFVTFQgTEFZRVIgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgICBpbmRleCwgbnVtTGF5ZXJzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MDkwLCBtc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gKGludCl3aWR0aF9baW5kZXhdOwotfQotCi1pbnQgZGVmaU5vbkRlZmF1bHQ6Omhhc0xheWVyRGlhZ1dpZHRoKGludCBpbmRleCkgY29uc3QgeyAKLSAgY2hhciBtc2dbMTYwXTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1MYXllcnNfKSB7Ci0gICAgIHNwcmludGYgKG1zZywgIkVSUk9SIChERUZQQVJTLTYwOTApOiBUaGUgaW5kZXggbnVtYmVyICVkIHNwZWNpZmllZCBmb3IgdGhlIE5PTkRFRkFVTFQgTEFZRVIgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgICBpbmRleCwgbnVtTGF5ZXJzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MDkwLCBtc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gaGFzRGlhZ1dpZHRoX1tpbmRleF07Ci19Ci0KLS8vIFdpbGwgYmUgb2Jzb2xldGVkIGluIDUuNwotZG91YmxlIGRlZmlOb25EZWZhdWx0OjpsYXllckRpYWdXaWR0aChpbnQgaW5kZXgpIGNvbnN0IHsgCi0gIGNoYXIgbXNnWzE2MF07Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtTGF5ZXJzXykgewotICAgICBzcHJpbnRmIChtc2csICJFUlJPUiAoREVGUEFSUy02MDkwKTogVGhlIGluZGV4IG51bWJlciAlZCBzcGVjaWZpZWQgZm9yIHRoZSBOT05ERUZBVUxUIExBWUVSIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIsCi0gICAgICAgICAgICAgaW5kZXgsIG51bUxheWVyc18pOwotICAgICBkZWZpRXJyb3IoMCwgNjA5MCwgbXNnLCBkZWZEYXRhKTsKLSAgICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIGRpYWdXaWR0aF9baW5kZXhdOwotfQotCi1pbnQgZGVmaU5vbkRlZmF1bHQ6OmxheWVyRGlhZ1dpZHRoVmFsKGludCBpbmRleCkgY29uc3QgeyAKLSAgY2hhciBtc2dbMTYwXTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1MYXllcnNfKSB7Ci0gICAgIHNwcmludGYgKG1zZywgIkVSUk9SIChERUZQQVJTLTYwOTApOiBUaGUgaW5kZXggbnVtYmVyICVkIHNwZWNpZmllZCBmb3IgdGhlIE5PTkRFRkFVTFQgTEFZRVIgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgICBpbmRleCwgbnVtTGF5ZXJzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MDkwLCBtc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gKGludClkaWFnV2lkdGhfW2luZGV4XTsKLX0KLQotaW50IGRlZmlOb25EZWZhdWx0OjpoYXNMYXllcldpcmVFeHQoaW50IGluZGV4KSBjb25zdCB7IAotICBjaGFyIG1zZ1sxNjBdOwotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bUxheWVyc18pIHsKLSAgICAgc3ByaW50ZiAobXNnLCAiRVJST1IgKERFRlBBUlMtNjA5MCk6IFRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgTk9OREVGQVVMVCBMQVlFUiBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiBTcGVjaWZ5IGEgdmFsaWQgaW5kZXggbnVtYmVyIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLAotICAgICAgICAgICAgIGluZGV4LCBudW1MYXllcnNfKTsKLSAgICAgZGVmaUVycm9yKDAsIDYwOTAsIG1zZywgZGVmRGF0YSk7Ci0gICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBoYXNXaXJlRXh0X1tpbmRleF07Ci19Ci0KLWludCBkZWZpTm9uRGVmYXVsdDo6aGFzTGF5ZXJTcGFjaW5nKGludCBpbmRleCkgY29uc3QgeyAKLSAgY2hhciBtc2dbMTYwXTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1MYXllcnNfKSB7Ci0gICAgIHNwcmludGYgKG1zZywgIkVSUk9SIChERUZQQVJTLTYwOTApOiBUaGUgaW5kZXggbnVtYmVyICVkIHNwZWNpZmllZCBmb3IgdGhlIE5PTkRFRkFVTFQgTEFZRVIgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgICBpbmRleCwgbnVtTGF5ZXJzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MDkwLCBtc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gaGFzU3BhY2luZ19baW5kZXhdOwotfQotCi0vLyBXaWxsIGJlIG9ic29sZXRlZCBpbiA1LjcKLWRvdWJsZSBkZWZpTm9uRGVmYXVsdDo6bGF5ZXJXaXJlRXh0KGludCBpbmRleCkgY29uc3QgeyAKLSAgY2hhciBtc2dbMTYwXTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1MYXllcnNfKSB7Ci0gICAgIHNwcmludGYgKG1zZywgIkVSUk9SIChERUZQQVJTLTYwOTApOiBUaGUgaW5kZXggbnVtYmVyICVkIHNwZWNpZmllZCBmb3IgdGhlIE5PTkRFRkFVTFQgTEFZRVIgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgICBpbmRleCwgbnVtTGF5ZXJzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MDkwLCBtc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gd2lyZUV4dF9baW5kZXhdOwotfQotCi1pbnQgZGVmaU5vbkRlZmF1bHQ6OmxheWVyV2lyZUV4dFZhbChpbnQgaW5kZXgpIGNvbnN0IHsgCi0gIGNoYXIgbXNnWzE2MF07Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtTGF5ZXJzXykgewotICAgICBzcHJpbnRmIChtc2csICJFUlJPUiAoREVGUEFSUy02MDkwKTogVGhlIGluZGV4IG51bWJlciAlZCBzcGVjaWZpZWQgZm9yIHRoZSBOT05ERUZBVUxUIExBWUVSIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIsCi0gICAgICAgICAgICAgaW5kZXgsIG51bUxheWVyc18pOwotICAgICBkZWZpRXJyb3IoMCwgNjA5MCwgbXNnLCBkZWZEYXRhKTsKLSAgICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIChpbnQpd2lyZUV4dF9baW5kZXhdOwotfQotCi0vLyBXaWxsIGJlIG9ic29sZXRlZCBpbiA1LjcKLWRvdWJsZSBkZWZpTm9uRGVmYXVsdDo6bGF5ZXJTcGFjaW5nKGludCBpbmRleCkgY29uc3QgeyAKLSAgY2hhciBtc2dbMTYwXTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1MYXllcnNfKSB7Ci0gICAgIHNwcmludGYgKG1zZywgIkVSUk9SIChERUZQQVJTLTYwOTApOiBUaGUgaW5kZXggbnVtYmVyICVkIHNwZWNpZmllZCBmb3IgdGhlIE5PTkRFRkFVTFQgTEFZRVIgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgICBpbmRleCwgbnVtTGF5ZXJzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MDkwLCBtc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gc3BhY2luZ19baW5kZXhdOwotfQotCi1pbnQgZGVmaU5vbkRlZmF1bHQ6OmxheWVyU3BhY2luZ1ZhbChpbnQgaW5kZXgpIGNvbnN0IHsgCi0gIGNoYXIgbXNnWzE2MF07Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtTGF5ZXJzXykgewotICAgICBzcHJpbnRmIChtc2csICJFUlJPUiAoREVGUEFSUy02MDkwKTogVGhlIGluZGV4IG51bWJlciAlZCBzcGVjaWZpZWQgZm9yIHRoZSBOT05ERUZBVUxUIExBWUVSIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIsCi0gICAgICAgICAgICAgaW5kZXgsIG51bUxheWVyc18pOwotICAgICBkZWZpRXJyb3IoMCwgNjA5MCwgbXNnLCBkZWZEYXRhKTsKLSAgICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIChpbnQpc3BhY2luZ19baW5kZXhdOwotfQotCi1pbnQgZGVmaU5vbkRlZmF1bHQ6Om51bVZpYXMoKSBjb25zdCB7IAotICByZXR1cm4gbnVtVmlhc187Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlOb25EZWZhdWx0Ojp2aWFOYW1lKGludCBpbmRleCkgY29uc3QgewotICBjaGFyIG1zZ1sxNjBdOwotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVZpYXNfKSB7Ci0gICAgIHNwcmludGYgKG1zZywgIkVSUk9SIChERUZQQVJTLTYwOTApOiBUaGUgaW5kZXggbnVtYmVyICVkIHNwZWNpZmllZCBmb3IgdGhlIE5PTkRFRkFVTFQgTEFZRVIgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgICBpbmRleCwgbnVtTGF5ZXJzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MDkwLCBtc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gdmlhTmFtZXNfW2luZGV4XTsKLX0KLQotaW50IGRlZmlOb25EZWZhdWx0OjpudW1WaWFSdWxlcygpIGNvbnN0IHsgCi0gIHJldHVybiBudW1WaWFSdWxlc187Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlOb25EZWZhdWx0Ojp2aWFSdWxlTmFtZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgY2hhciBtc2dbMTYwXTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1WaWFSdWxlc18pIHsKLSAgICAgc3ByaW50ZiAobXNnLCAiRVJST1IgKERFRlBBUlMtNjA5MCk6IFRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgTk9OREVGQVVMVCBMQVlFUiBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiBTcGVjaWZ5IGEgdmFsaWQgaW5kZXggbnVtYmVyIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLAotICAgICAgICAgICAgIGluZGV4LCBudW1MYXllcnNfKTsKLSAgICAgZGVmaUVycm9yKDAsIDYwOTAsIG1zZywgZGVmRGF0YSk7Ci0gICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiB2aWFSdWxlTmFtZXNfW2luZGV4XTsKLX0KLQotaW50IGRlZmlOb25EZWZhdWx0OjpudW1NaW5DdXRzKCkgY29uc3QgewotICByZXR1cm4gbnVtTWluQ3V0c187Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlOb25EZWZhdWx0OjpjdXRMYXllck5hbWUoaW50IGluZGV4KSBjb25zdCB7Ci0gIGNoYXIgbXNnWzE2MF07Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtTWluQ3V0c18pIHsKLSAgICAgc3ByaW50ZiAobXNnLCAiRVJST1IgKERFRlBBUlMtNjA5MCk6IFRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgTk9OREVGQVVMVCBMQVlFUiBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiBTcGVjaWZ5IGEgdmFsaWQgaW5kZXggbnVtYmVyIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLAotICAgICAgICAgICAgIGluZGV4LCBudW1MYXllcnNfKTsKLSAgICAgZGVmaUVycm9yKDAsIDYwOTAsIG1zZywgZGVmRGF0YSk7Ci0gICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBjdXRMYXllck5hbWVfW2luZGV4XTsKLX0KLQotaW50IGRlZmlOb25EZWZhdWx0OjpudW1DdXRzKGludCBpbmRleCkgY29uc3QgewotICBjaGFyIG1zZ1sxNjBdOwotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bU1pbkN1dHNfKSB7Ci0gICAgIHNwcmludGYgKG1zZywgIkVSUk9SIChERUZQQVJTLTYwOTApOiBUaGUgaW5kZXggbnVtYmVyICVkIHNwZWNpZmllZCBmb3IgdGhlIE5PTkRFRkFVTFQgTEFZRVIgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgICBpbmRleCwgbnVtTGF5ZXJzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MDkwLCBtc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gbnVtQ3V0c19baW5kZXhdOwotfQotCi12b2lkIGRlZmlOb25EZWZhdWx0OjpwcmludChGSUxFKiBmKSBjb25zdCB7IAotICBpbnQgICBpOwotCi0gIGZwcmludGYoZiwgIm5vbmRlZmF1bHRydWxlICVzXG4iLCBuYW1lKCkpOwotICAKLSAgZnByaW50ZihmLCAiJWQgbGF5ZXJzICAgJWQgdmlhcyAgICVkIHZpYXJ1bGVzICAgJWQgbWluY3V0c1xuIiwKLSAgICBudW1MYXllcnMoKSwKLSAgICBudW1WaWFzKCksCi0gICAgbnVtVmlhUnVsZXMoKSwKLSAgICBudW1NaW5DdXRzKCkpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1MYXllcnMoKTsgaSsrKSB7Ci0gICAgZnByaW50ZihmLCAiICBMYXllciAlc1xuIiwgbGF5ZXJOYW1lKGkpKTsKLSAgICBmcHJpbnRmKGYsICIgICAgV0lEVEggJWdcbiIsIGxheWVyV2lkdGgoaSkpOwotICAgIGlmIChoYXNMYXllckRpYWdXaWR0aChpKSkKLSAgICAgIGZwcmludGYoZiwgIiAgICBESUFHV0lEVEggJWdcbiIsIGxheWVyRGlhZ1dpZHRoKGkpKTsKLSAgICBpZiAoaGFzTGF5ZXJTcGFjaW5nKGkpKQotICAgICAgZnByaW50ZihmLCAiICAgIFNQQUNJTkcgJWdcbiIsIGxheWVyU3BhY2luZyhpKSk7Ci0gICAgaWYgKGhhc0xheWVyV2lyZUV4dChpKSkKLSAgICAgIGZwcmludGYoZiwgIiAgICBXSVJFRVhUICVnXG4iLAotICAgICAgICAgICAgICBsYXllcldpcmVFeHQoaSkpOwotICB9Ci0gIGZvciAoaSA9IDA7IGkgPCBudW1WaWFzKCk7IGkrKykgewotICAgIGZwcmludGYoZiwgIiAgICBWSUEgJXNcbiIsIHZpYU5hbWUoaSkpOwotICB9Ci0gIGZvciAoaSA9IDA7IGkgPCBudW1WaWFSdWxlcygpOyBpKyspIHsKLSAgICBmcHJpbnRmKGYsICIgICAgVklBUlVMRSAlc1xuIiwgdmlhUnVsZU5hbWUoaSkpOwotICB9Ci0gIGZvciAoaSA9IDA7IGkgPCBudW1NaW5DdXRzKCk7IGkrKykgewotICAgIGZwcmludGYoZiwgIiAgICBNSU5DVVRTICVzICVkXG4iLCBjdXRMYXllck5hbWUoaSksCi0gICAgICAgICAgICBudW1DdXRzKGkpKTsKLSAgfQotfQotCi1pbnQgZGVmaU5vbkRlZmF1bHQ6Om51bVByb3BzKCkgY29uc3QgewotICByZXR1cm4gbnVtUHJvcHNfOwotfQotCi12b2lkIGRlZmlOb25EZWZhdWx0OjphZGRQcm9wZXJ0eShjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgdHlwZSkgewotICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLSAgaWYgKG51bVByb3BzXyA9PSBwcm9wc0FsbG9jYXRlZF8pIHsKLSAgICBpbnQgaTsKLSAgICBpbnQgbWF4OwotICAgIGludCBsaW0gPSBudW1Qcm9wc187Ci0gICAgY2hhcioqICBubjsKLSAgICBjaGFyKiogIG52OwotICAgIGRvdWJsZSogbmQ7Ci0gICAgY2hhciogICBudDsKLQotICAgIGlmIChwcm9wc0FsbG9jYXRlZF8gPT0gMCkgCi0gICAgICBtYXggPSBwcm9wc0FsbG9jYXRlZF8gPSAyOwotICAgIGVsc2UKLSAgICAgIG1heCA9IHByb3BzQWxsb2NhdGVkXyAqPSAyOwotICAgIG5uID0gKGNoYXIqKiltYWxsb2Moc2l6ZW9mKGNoYXIqKSAqIG1heCk7Ci0gICAgbnYgPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopICogbWF4KTsKLSAgICBuZCA9IChkb3VibGUqKW1hbGxvYyhzaXplb2YoZG91YmxlKSAqIG1heCk7Ci0gICAgbnQgPSAoY2hhciopbWFsbG9jKHNpemVvZihjaGFyKSAqIG1heCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGxpbTsgaSsrKSB7Ci0gICAgICBubltpXSA9IG5hbWVzX1tpXTsKLSAgICAgIG52W2ldID0gdmFsdWVzX1tpXTsKLSAgICAgIG5kW2ldID0gZHZhbHVlc19baV07Ci0gICAgICBudFtpXSA9IHR5cGVzX1tpXTsKLSAgICB9Ci0gICAgZnJlZSgoY2hhciopKG5hbWVzXykpOwotICAgIGZyZWUoKGNoYXIqKSh2YWx1ZXNfKSk7Ci0gICAgZnJlZSgoY2hhciopKGR2YWx1ZXNfKSk7Ci0gICAgZnJlZSgoY2hhciopKHR5cGVzXykpOwotICAgIG5hbWVzXyAgID0gbm47Ci0gICAgdmFsdWVzXyAgPSBudjsKLSAgICBkdmFsdWVzXyA9IG5kOwotICAgIHR5cGVzXyAgID0gbnQ7Ci0gIH0KLSAgbmFtZXNfW251bVByb3BzX10gPSAoY2hhciopbWFsbG9jKHNpemVvZihjaGFyKSpsZW4pOwotICBzdHJjcHkobmFtZXNfW251bVByb3BzX10sbmFtZSk7Ci0gIGxlbiA9IHN0cmxlbih2YWx1ZSkgKyAxOwotICB2YWx1ZXNfW251bVByb3BzX10gPSAoY2hhciopbWFsbG9jKHNpemVvZihjaGFyKSAqIGxlbik7Ci0gIHN0cmNweSh2YWx1ZXNfW251bVByb3BzX10sdmFsdWUpOwotICBkdmFsdWVzX1tudW1Qcm9wc19dID0gMDsKLSAgdHlwZXNfW251bVByb3BzX10gPSB0eXBlOwotICBudW1Qcm9wc18gKz0gMTsKLX0KLQotdm9pZCBkZWZpTm9uRGVmYXVsdDo6YWRkTnVtUHJvcGVydHkoY29uc3QgY2hhciogbmFtZSwgY29uc3QgZG91YmxlIGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YWx1ZSwgY29uc3QgY2hhciB0eXBlKSB7Ci0gIGludCBsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotICBpZiAobnVtUHJvcHNfID09IHByb3BzQWxsb2NhdGVkXykgewotICAgIGludCBpOwotICAgIGludCBtYXg7Ci0gICAgaW50IGxpbSA9IG51bVByb3BzXzsKLSAgICBjaGFyKiogIG5uOwotICAgIGNoYXIqKiAgbnY7Ci0gICAgZG91YmxlKiBuZDsKLSAgICBjaGFyKiAgIG50OwotCi0gICAgaWYgKHByb3BzQWxsb2NhdGVkXyA9PSAwKSAKLSAgICAgIG1heCA9IHByb3BzQWxsb2NhdGVkXyA9IDI7Ci0gICAgZWxzZQotICAgICAgbWF4ID0gcHJvcHNBbGxvY2F0ZWRfICo9IDI7Ci0gICAgbm4gPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopICogbWF4KTsKLSAgICBudiA9IChjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikgKiBtYXgpOwotICAgIG5kID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpICogbWF4KTsKLSAgICBudCA9IChjaGFyKiltYWxsb2Moc2l6ZW9mKGNoYXIpICogbWF4KTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbGltOyBpKyspIHsKLSAgICAgIG5uW2ldID0gbmFtZXNfW2ldOwotICAgICAgbnZbaV0gPSB2YWx1ZXNfW2ldOwotICAgICAgbmRbaV0gPSBkdmFsdWVzX1tpXTsKLSAgICAgIG50W2ldID0gdHlwZXNfW2ldOwotICAgIH0KLSAgICBmcmVlKChjaGFyKikobmFtZXNfKSk7Ci0gICAgZnJlZSgoY2hhciopKHZhbHVlc18pKTsKLSAgICBmcmVlKChjaGFyKikoZHZhbHVlc18pKTsKLSAgICBmcmVlKChjaGFyKikodHlwZXNfKSk7Ci0gICAgbmFtZXNfICAgPSBubjsKLSAgICB2YWx1ZXNfICA9IG52OwotICAgIGR2YWx1ZXNfID0gbmQ7Ci0gICAgdHlwZXNfICAgPSBudDsKLSAgfQotICBuYW1lc19bbnVtUHJvcHNfXSA9IChjaGFyKiltYWxsb2Moc2l6ZW9mKGNoYXIpICogbGVuKTsKLSAgc3RyY3B5KG5hbWVzX1tudW1Qcm9wc19dLG5hbWUpOwotICBsZW4gPSBzdHJsZW4odmFsdWUpICsgMTsKLSAgdmFsdWVzX1tudW1Qcm9wc19dID0gKGNoYXIqKW1hbGxvYyhzaXplb2YoY2hhcikgKiBsZW4pOwotICBzdHJjcHkodmFsdWVzX1tudW1Qcm9wc19dLHZhbHVlKTsKLSAgZHZhbHVlc19bbnVtUHJvcHNfXSA9IGQ7Ci0gIHR5cGVzX1tudW1Qcm9wc19dID0gdHlwZTsKLSAgbnVtUHJvcHNfICs9IDE7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlOb25EZWZhdWx0Ojpwcm9wTmFtZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgY2hhciBtc2dbMTYwXTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1Qcm9wc18pIHsKLSAgICAgc3ByaW50ZiAobXNnLCAiRVJST1IgKERFRlBBUlMtNjA5MSk6IFRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgTk9OREVGQVVMVCBQUk9QRVJUWSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiBTcGVjaWZ5IGEgdmFsaWQgaW5kZXggbnVtYmVyIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLAotICAgICAgICAgICAgIGluZGV4LCBudW1Qcm9wc18pOwotICAgICBkZWZpRXJyb3IoMCwgNjA5MSwgbXNnLCBkZWZEYXRhKTsKLSAgICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIG5hbWVzX1tpbmRleF07Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlOb25EZWZhdWx0Ojpwcm9wVmFsdWUoaW50IGluZGV4KSBjb25zdCB7Ci0gIGNoYXIgbXNnWzE2MF07Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtUHJvcHNfKSB7Ci0gICAgIHNwcmludGYgKG1zZywgIkVSUk9SIChERUZQQVJTLTYwOTEpOiBUaGUgaW5kZXggbnVtYmVyICVkIHNwZWNpZmllZCBmb3IgdGhlIE5PTkRFRkFVTFQgUFJPUEVSVFkgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgICBpbmRleCwgbnVtUHJvcHNfKTsKLSAgICAgZGVmaUVycm9yKDAsIDYwOTEsIG1zZywgZGVmRGF0YSk7Ci0gICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiB2YWx1ZXNfW2luZGV4XTsKLX0KLQotZG91YmxlIGRlZmlOb25EZWZhdWx0Ojpwcm9wTnVtYmVyKGludCBpbmRleCkgY29uc3QgewotICBjaGFyIG1zZ1sxNjBdOwotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVByb3BzXykgewotICAgICBzcHJpbnRmIChtc2csICJFUlJPUiAoREVGUEFSUy02MDkxKTogVGhlIGluZGV4IG51bWJlciAlZCBzcGVjaWZpZWQgZm9yIHRoZSBOT05ERUZBVUxUIFBST1BFUlRZIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIsCi0gICAgICAgICAgICAgaW5kZXgsIG51bVByb3BzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MDkxLCBtc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gZHZhbHVlc19baW5kZXhdOwotfQotCi1jb25zdCBjaGFyIGRlZmlOb25EZWZhdWx0Ojpwcm9wVHlwZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgY2hhciBtc2dbMTYwXTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1Qcm9wc18pIHsKLSAgICAgc3ByaW50ZiAobXNnLCAiRVJST1IgKERFRlBBUlMtNjA5MSk6IFRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgTk9OREVGQVVMVCBQUk9QRVJUWSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiBTcGVjaWZ5IGEgdmFsaWQgaW5kZXggbnVtYmVyIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLAotICAgICAgICAgICAgIGluZGV4LCBudW1Qcm9wc18pOwotICAgICBkZWZpRXJyb3IoMCwgNjA5MSwgbXNnLCBkZWZEYXRhKTsKLSAgICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIHR5cGVzX1tpbmRleF07Ci19Ci0KLWludCBkZWZpTm9uRGVmYXVsdDo6cHJvcElzTnVtYmVyKGludCBpbmRleCkgY29uc3QgewotICBjaGFyIG1zZ1sxNjBdOwotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVByb3BzXykgewotICAgICBzcHJpbnRmIChtc2csICJFUlJPUiAoREVGUEFSUy02MDkxKTogVGhlIGluZGV4IG51bWJlciAlZCBzcGVjaWZpZWQgZm9yIHRoZSBOT05ERUZBVUxUIFBST1BFUlRZIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIsCi0gICAgICAgICAgICAgaW5kZXgsIG51bVByb3BzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MDkxLCBtc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gZHZhbHVlc19baW5kZXhdID8gMSA6IDA7Ci19Ci0KLWludCBkZWZpTm9uRGVmYXVsdDo6cHJvcElzU3RyaW5nKGludCBpbmRleCkgY29uc3QgewotICBjaGFyIG1zZ1sxNjBdOwotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVByb3BzXykgewotICAgICBzcHJpbnRmIChtc2csICJFUlJPUiAoREVGUEFSUy02MDkxKTogVGhlIGluZGV4IG51bWJlciAlZCBzcGVjaWZpZWQgZm9yIHRoZSBOT05ERUZBVUxUIFBST1BFUlRZIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIsCi0gICAgICAgICAgICAgaW5kZXgsIG51bVByb3BzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MDkxLCBtc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gZHZhbHVlc19baW5kZXhdID8gMCA6IDE7Ci19Ci1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpTm9uRGVmYXVsdC5ocHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlOb25EZWZhdWx0LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIwNzgwYy4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlOb25EZWZhdWx0LmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2lmbmRlZiBkZWZpTm9uRGVmYXVsdF9oCi0jZGVmaW5lIGRlZmlOb25EZWZhdWx0X2gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiZGVmaUtSRGVmcy5ocHAiCi0jaW5jbHVkZSAiZGVmaU1pc2MuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1jbGFzcyBkZWZpTm9uRGVmYXVsdCB7Ci1wdWJsaWM6Ci0gIGRlZmlOb25EZWZhdWx0KGRlZnJEYXRhICpkYXRhKTsKLSAgdm9pZCBJbml0KCk7Ci0KLSAgdm9pZCBEZXN0cm95KCk7Ci0gIH5kZWZpTm9uRGVmYXVsdCgpOwotCi0gIHZvaWQgY2xlYXIoKTsKLSAgdm9pZCBzZXROYW1lKGNvbnN0IGNoYXIqIG5hbWUpOwotICB2b2lkIHNldEhhcmRzcGFjaW5nKCk7Ci0gIHZvaWQgYWRkTGF5ZXIoY29uc3QgY2hhciogbmFtZSk7Ci0gIHZvaWQgYWRkV2lkdGgoZG91YmxlIG51bSk7Ci0gIHZvaWQgYWRkRGlhZ1dpZHRoKGRvdWJsZSBudW0pOwotICB2b2lkIGFkZFNwYWNpbmcoZG91YmxlIG51bSk7Ci0gIHZvaWQgYWRkV2lyZUV4dChkb3VibGUgbnVtKTsKLSAgdm9pZCBhZGRWaWEoY29uc3QgY2hhciogbmFtZSk7Ci0gIHZvaWQgYWRkVmlhUnVsZShjb25zdCBjaGFyKiBuYW1lKTsKLSAgdm9pZCBhZGRNaW5DdXRzKGNvbnN0IGNoYXIqIG5hbWUsIGludCBudW1DdXRzKTsKLSAgdm9pZCBhZGRQcm9wZXJ0eShjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSwgY29uc3QgY2hhciB0eXBlKTsKLSAgdm9pZCBhZGROdW1Qcm9wZXJ0eShjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBkb3VibGUgZCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YWx1ZSwgY29uc3QgY2hhciB0eXBlKTsKLSAgdm9pZCBlbmQoKTsKLQotICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3Q7Ci0gIGludCAgIGhhc0hhcmRzcGFjaW5nKCkgY29uc3Q7Ci0KLSAgaW50ICAgICAgICAgbnVtUHJvcHMoKSBjb25zdDsKLSAgY29uc3QgY2hhciogcHJvcE5hbWUoaW50IGluZGV4KSBjb25zdDsKLSAgY29uc3QgY2hhciogcHJvcFZhbHVlKGludCBpbmRleCkgY29uc3Q7Ci0gIGRvdWJsZSAgICAgIHByb3BOdW1iZXIoaW50IGluZGV4KSBjb25zdDsKLSAgY29uc3QgY2hhciAgcHJvcFR5cGUoaW50IGluZGV4KSBjb25zdDsKLSAgaW50ICAgICAgICAgcHJvcElzTnVtYmVyKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCAgICAgICAgIHByb3BJc1N0cmluZyhpbnQgaW5kZXgpIGNvbnN0OwotICAKLSAgLy8gQSBub24gZGVmYXVsdCBydWxlIGNhbiBoYXZlIG9uZSBvciBtb3JlIGxheWVycy4KLSAgLy8gVGhlIGxheWVyIGluZm9ybWF0aW9uIGlzIGtlcHQgaW4gYW4gYXJyYXkuCi0gIGludCAgICAgICAgIG51bUxheWVycygpIGNvbnN0IDsKLSAgY29uc3QgY2hhciogbGF5ZXJOYW1lKGludCBpbmRleCkgY29uc3QgOwotICBkb3VibGUgICAgICBsYXllcldpZHRoKGludCBpbmRleCkgY29uc3QgOyAgICAgICAvLyBXaWxsIGJlIG9ic29sZXRlZCBpbiA1LjcKLSAgaW50ICAgICAgICAgbGF5ZXJXaWR0aFZhbChpbnQgaW5kZXgpIGNvbnN0IDsKLSAgaW50ICAgICAgICAgaGFzTGF5ZXJEaWFnV2lkdGgoaW50IGluZGV4KSBjb25zdDsKLSAgZG91YmxlICAgICAgbGF5ZXJEaWFnV2lkdGgoaW50IGluZGV4KSBjb25zdDsgICAgLy8gV2lsbCBiZSBvYnNvbGV0ZWQgaW4gNS43Ci0gIGludCAgICAgICAgIGxheWVyRGlhZ1dpZHRoVmFsKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCAgICAgICAgIGhhc0xheWVyU3BhY2luZyhpbnQgaW5kZXgpIGNvbnN0IDsKLSAgZG91YmxlICAgICAgbGF5ZXJTcGFjaW5nKGludCBpbmRleCkgY29uc3QgOyAgICAgLy8gV2lsbCBiZSBvYnNvbGV0ZWQgaW4gNS43Ci0gIGludCAgICAgICAgIGxheWVyU3BhY2luZ1ZhbChpbnQgaW5kZXgpIGNvbnN0IDsKLSAgaW50ICAgICAgICAgaGFzTGF5ZXJXaXJlRXh0KGludCBpbmRleCkgY29uc3QgOwotICBkb3VibGUgICAgICBsYXllcldpcmVFeHQoaW50IGluZGV4KSBjb25zdCA7ICAgICAvLyBXaWxsIGJlIG9ic29sZXRlZCBpbiA1LjcKLSAgaW50ICAgICAgICAgbGF5ZXJXaXJlRXh0VmFsKGludCBpbmRleCkgY29uc3QgOwotICBpbnQgICAgICAgICBudW1WaWFzKCkgY29uc3QgOwotICBjb25zdCBjaGFyKiB2aWFOYW1lKGludCBpbmRleCkgY29uc3QgOwotICBpbnQgICAgICAgICBudW1WaWFSdWxlcygpIGNvbnN0IDsKLSAgY29uc3QgY2hhciogdmlhUnVsZU5hbWUoaW50IGluZGV4KSBjb25zdCA7Ci0gIGludCAgICAgICAgIG51bU1pbkN1dHMoKSBjb25zdDsKLSAgY29uc3QgY2hhciogY3V0TGF5ZXJOYW1lKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCAgICAgICAgIG51bUN1dHMoaW50IGluZGV4KSBjb25zdDsKLQotICAvLyBEZWJ1ZyBwcmludAotICB2b2lkIHByaW50KEZJTEUqIGYpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gIGNoYXIqICAgbmFtZV87Ci0gIGNoYXIgICAgaGFyZFNwYWNpbmdfOwotCi0gIC8vIExheWVyIGluZm9ybWF0aW9uCi0gIGludCAgICAgbnVtTGF5ZXJzXzsKLSAgaW50ICAgICBsYXllcnNBbGxvY2F0ZWRfOwotICBjaGFyKiogIGxheWVyTmFtZV87Ci0gIGRvdWJsZSogd2lkdGhfOwotICBjaGFyKiAgIGhhc0RpYWdXaWR0aF87Ci0gIGRvdWJsZSogZGlhZ1dpZHRoXzsKLSAgY2hhciogICBoYXNTcGFjaW5nXzsKLSAgZG91YmxlKiBzcGFjaW5nXzsKLSAgY2hhciogICBoYXNXaXJlRXh0XzsKLSAgZG91YmxlKiB3aXJlRXh0XzsKLQotICBpbnQgICAgIG51bVZpYXNfOwotICBpbnQgICAgIHZpYXNBbGxvY2F0ZWRfOwotICBjaGFyKiogIHZpYU5hbWVzXzsKLSAgaW50ICAgICBudW1WaWFSdWxlc187Ci0gIGludCAgICAgdmlhUnVsZXNBbGxvY2F0ZWRfOwotICBjaGFyKiogIHZpYVJ1bGVOYW1lc187Ci0gIGludCAgICAgbnVtTWluQ3V0c187Ci0gIGludCAgICAgbWluQ3V0c0FsbG9jYXRlZF87Ci0gIGNoYXIqKiAgY3V0TGF5ZXJOYW1lXzsKLSAgaW50KiAgICBudW1DdXRzXzsKLQotICBpbnQgICAgIG51bVByb3BzXzsKLSAgaW50ICAgICBwcm9wc0FsbG9jYXRlZF87Ci0gIGNoYXIqKiAgbmFtZXNfOwotICBjaGFyKiogIHZhbHVlc187Ci0gIGRvdWJsZSogZHZhbHVlc187Ci0gIGNoYXIqICAgdHlwZXNfOwotCi0gIGRlZnJEYXRhICpkZWZEYXRhOwotfTsKLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLVVTRV9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaVBhcnRpdGlvbi5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlQYXJ0aXRpb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTFiMWFmLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaVBhcnRpdGlvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NTEgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMyAtIDIwMTUsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSAibGV4LmgiCi0jaW5jbHVkZSAiZGVmaVBhcnRpdGlvbi5ocHAiCi0jaW5jbHVkZSAiZGVmaURlYnVnLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vICAgZGVmaVBhcnRpdGlvbgotLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCi1kZWZpUGFydGl0aW9uOjpkZWZpUGFydGl0aW9uKGRlZnJEYXRhICpkYXRhKQotOiBkZWZEYXRhKGRhdGEpCi17Ci0gIEluaXQoKTsKLX0KLQotCi12b2lkIGRlZmlQYXJ0aXRpb246OkluaXQoKSB7Ci0gIG5hbWVfID0gMDsKLSAgbmFtZUxlbmd0aF8gPSAwOwotICBwaW5fID0gMDsKLSAgcGluTGVuZ3RoXyA9IDA7Ci0gIGluc3RfID0gMDsKLSAgaW5zdExlbmd0aF8gPSAwOwotCi0gIHBpbnNBbGxvY2F0ZWRfID0gMDsKLSAgbnVtUGluc18gPSAwOwotICBwaW5zXyA9IDA7Ci0KLSAgY2xlYXIoKTsKLX0KLQotCi1kZWZpUGFydGl0aW9uOjp+ZGVmaVBhcnRpdGlvbigpIHsKLSAgRGVzdHJveSgpOwotfQotCi0KLXZvaWQgZGVmaVBhcnRpdGlvbjo6RGVzdHJveSgpIHsKLQotICBpZiAobmFtZV8pIGZyZWUobmFtZV8pOwotICBuYW1lXyA9IDA7Ci0gIG5hbWVMZW5ndGhfID0gMDsKLSAgaWYgKHBpbl8pIGZyZWUocGluXyk7Ci0gIHBpbl8gPSAwOwotICBwaW5MZW5ndGhfID0gMDsKLSAgaWYgKGluc3RfKSBmcmVlKGluc3RfKTsKLSAgaW5zdF8gPSAwOwotICBpbnN0TGVuZ3RoXyA9IDA7Ci0KLSAgY2xlYXIoKTsKLQotICBpZiAocGluc18pIGZyZWUoKGNoYXIqKShwaW5zXykpOwotICBwaW5zXyA9IDA7Ci0gIHBpbnNBbGxvY2F0ZWRfID0gMDsKLX0KLQotCi12b2lkIGRlZmlQYXJ0aXRpb246OmNsZWFyKCkgewotICBpbnQgaTsKLQotICBzZXR1cF8gPSAnICc7Ci0gIGhvbGRfID0gJyAnOwotICBkaXJlY3Rpb25fID0gJyAnOwotICB0eXBlXyA9ICcgJzsKLSAgaWYgKG5hbWVfKSAqKG5hbWVfKSA9ICdcMCc7Ci0gIGlmIChwaW5fKSAqKHBpbl8pID0gJ1wwJzsKLSAgaWYgKGluc3RfKSAqKGluc3RfKSA9ICdcMCc7Ci0gIGhhc01pbl8gPSAwOwotICBoYXNNYXhfID0gMDsKLQotICBpZiAobnVtUGluc18pIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUGluc187IGkrKykgewotICAgICAgZnJlZShwaW5zX1tpXSk7Ci0gICAgICBwaW5zX1tpXSA9IDA7Ci0gICAgfQotICAgIG51bVBpbnNfID0gMDsKLSAgfQotICBoYXNSaXNlTWluXyA9IDA7Ci0gIGhhc0ZhbGxNaW5fID0gMDsKLSAgaGFzUmlzZU1heF8gPSAwOwotICBoYXNGYWxsTWF4XyA9IDA7Ci0gIGhhc1Jpc2VNaW5SYW5nZV8gPSAwOwotICBoYXNGYWxsTWluUmFuZ2VfID0gMDsgIAotICBoYXNSaXNlTWF4UmFuZ2VfID0gMDsKLSAgaGFzRmFsbE1heFJhbmdlXyA9IDA7Ci19Ci0KLQotdm9pZCBkZWZpUGFydGl0aW9uOjpzZXROYW1lKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgaW50IGxlbiA9IHN0cmxlbihuYW1lKSArIDE7Ci0KLSAgY2xlYXIoKTsKLQotICBpZiAobGVuID4gbmFtZUxlbmd0aF8pIHsKLSAgICBpZiAobmFtZV8pIGZyZWUobmFtZV8pOwotICAgIG5hbWVMZW5ndGhfID0gbGVuOwotICAgIG5hbWVfID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICB9Ci0gIHN0cmNweShuYW1lXywgZGVmRGF0YS0+REVGQ0FTRShuYW1lKSk7Ci0KLX0KLQotCi12b2lkIGRlZmlQYXJ0aXRpb246OnByaW50KEZJTEUqIGYpIGNvbnN0IHsKLSAgaW50IGk7Ci0KLSAgZnByaW50ZihmLCAiUGFydGl0aW9uICclcycgJWNcbiIsCi0gICAgICAgbmFtZSgpLCBkaXJlY3Rpb24oKSk7Ci0gIGZwcmludGYoZiwgIiAgaW5zdCAlcyAgcGluICVzICB0eXBlICVzXG4iLAotICAgICAgIGluc3ROYW1lKCksIHBpbk5hbWUoKSwKLSAgICAgICBpdGVtVHlwZSgpKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgbnVtUGlucygpOyBpKyspCi0gICAgZnByaW50ZihmLCAiICAlc1xuIiwgcGluKGkpKTsKLQotICBpZiAoaXNTZXR1cFJpc2UoKSkKLSAgICBmcHJpbnRmKGYsICIgIFNFVFVQIFJJU0VcbiIpOwotCi0gIGlmIChpc1NldHVwRmFsbCgpKQotICAgIGZwcmludGYoZiwgIiAgU0VUVVAgRkFMTFxuIik7Ci0KLSAgaWYgKGlzSG9sZFJpc2UoKSkKLSAgICBmcHJpbnRmKGYsICIgIEhPTEQgUklTRVxuIik7Ci0KLSAgaWYgKGlzSG9sZEZhbGwoKSkKLSAgICBmcHJpbnRmKGYsICIgIEhPTEQgRkFMTFxuIik7Ci0KLSAgaWYgKGhhc01pbigpKQotICAgIGZwcmludGYoZiwgIiAgTUlOICVnXG4iLCBwYXJ0aXRpb25NaW4oKSk7Ci0KLSAgaWYgKGhhc01heCgpKQotICAgIGZwcmludGYoZiwgIiAgTUFYICVnXG4iLCBwYXJ0aXRpb25NYXgoKSk7Ci0KLSAgaWYgKGhhc1Jpc2VNaW4oKSkKLSAgICBmcHJpbnRmKGYsICIgIFJJU0UgTUlOICVnXG4iLCByaXNlTWluKCkpOwotCi0gIGlmIChoYXNGYWxsTWluKCkpCi0gICAgZnByaW50ZihmLCAiICBGQUxMIE1JTiAlZ1xuIiwgZmFsbE1pbigpKTsKLQotICBpZiAoaGFzUmlzZU1heCgpKQotICAgIGZwcmludGYoZiwgIiAgUklTRSBNQVggJWdcbiIsIHJpc2VNYXgoKSk7Ci0KLSAgaWYgKGhhc0ZhbGxNYXgoKSkKLSAgICBmcHJpbnRmKGYsICIgIEZBTEwgTUFYICVnXG4iLCBmYWxsTWF4KCkpOwotCi0gIGlmIChoYXNGYWxsTWluUmFuZ2UoKSkKLSAgICBmcHJpbnRmKGYsICIgIEZBTEwgTUlOICVnICVnXG4iLCBmYWxsTWluTGVmdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxNaW5SaWdodCgpKTsKLQotICBpZiAoaGFzUmlzZU1pblJhbmdlKCkpCi0gICAgZnByaW50ZihmLCAiICBSSVNFIE1JTiAlZyAlZ1xuIiwgcmlzZU1pbkxlZnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaXNlTWluUmlnaHQoKSk7Ci0KLSAgaWYgKGhhc0ZhbGxNYXhSYW5nZSgpKQotICAgIGZwcmludGYoZiwgIiAgRkFMTCBNQVggJWcgJWdcbiIsIGZhbGxNYXhMZWZ0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsbE1heFJpZ2h0KCkpOwotCi0gIGlmIChoYXNSaXNlTWF4UmFuZ2UoKSkKLSAgICBmcHJpbnRmKGYsICIgIFJJU0UgTUFYICVnICVnXG4iLCByaXNlTWF4TGVmdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpc2VNYXhSaWdodCgpKTsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpUGFydGl0aW9uOjpuYW1lKCkgY29uc3QgewotICByZXR1cm4gbmFtZV87Ci19Ci0KLQotdm9pZCBkZWZpUGFydGl0aW9uOjpzZXRGcm9tSU9QaW4oY29uc3QgY2hhciogcGluKSB7Ci0gIHNldCgnRicsICdJJywgIiIsIHBpbik7Ci19Ci0KLQotY2hhciBkZWZpUGFydGl0aW9uOjpkaXJlY3Rpb24oKSBjb25zdCB7Ci0gIHJldHVybiBkaXJlY3Rpb25fOwotfQotCi0KLWNvbnN0IGNoYXIqIGRlZmlQYXJ0aXRpb246Omluc3ROYW1lKCkgY29uc3QgewotICByZXR1cm4gaW5zdF87Ci19Ci0KLQotY29uc3QgY2hhciogZGVmaVBhcnRpdGlvbjo6cGluTmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHBpbl87Ci19Ci0KLQotc3RhdGljIGNoYXIqIGFkKGNvbnN0IGNoYXIqIGluKSB7Ci0gIHJldHVybiAoY2hhciopaW47Ci19Ci0KLQotY29uc3QgY2hhciogZGVmaVBhcnRpdGlvbjo6aXRlbVR5cGUoKSBjb25zdCB7Ci0gIGNoYXIqIGM7Ci0gIGlmICh0eXBlXyA9PSAnTCcpIGMgPSBhZCgiQ0xPQ0siKTsKLSAgZWxzZSBpZiAodHlwZV8gPT0gJ0knKSBjID0gYWQoIklPIik7Ci0gIGVsc2UgaWYgKHR5cGVfID09ICdDJykgYyA9IGFkKCJDT01QIik7Ci0gIGVsc2UgYyA9IGFkKCJCT0dVUyIpOwotICByZXR1cm4gYzsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpUGFydGl0aW9uOjpwaW4oaW50IGluZGV4KSBjb25zdCB7Ci0gIHJldHVybiBwaW5zX1tpbmRleF07Ci19Ci0KLQotaW50IGRlZmlQYXJ0aXRpb246Om51bVBpbnMoKSBjb25zdCB7Ci0gIHJldHVybiBudW1QaW5zXzsKLX0KLQotCi1pbnQgZGVmaVBhcnRpdGlvbjo6aXNTZXR1cFJpc2UoKSBjb25zdCB7Ci0gIHJldHVybiBzZXR1cF8gPT0gJ1InID8gMSA6IDAgOwotfQotCi0KLWludCBkZWZpUGFydGl0aW9uOjppc1NldHVwRmFsbCgpIGNvbnN0IHsKLSAgcmV0dXJuIHNldHVwXyA9PSAnRicgPyAxIDogMCA7Ci19Ci0KLQotaW50IGRlZmlQYXJ0aXRpb246OmlzSG9sZFJpc2UoKSBjb25zdCB7Ci0gIHJldHVybiBob2xkXyA9PSAnUicgPyAxIDogMCA7Ci19Ci0KLQotaW50IGRlZmlQYXJ0aXRpb246OmlzSG9sZEZhbGwoKSBjb25zdCB7Ci0gIHJldHVybiBob2xkXyA9PSAnRicgPyAxIDogMCA7Ci19Ci0KLQotdm9pZCBkZWZpUGFydGl0aW9uOjphZGRUdXJuT2ZmKGNvbnN0IGNoYXIqIHNldHVwLCBjb25zdCBjaGFyKiBob2xkKSB7Ci0gIGlmICgqc2V0dXAgPT0gJyAnKSB7Ci0gICAgc2V0dXBfID0gKnNldHVwOwotICB9IGVsc2UgaWYgKCpzZXR1cCA9PSAnUicpIHsKLSAgICBzZXR1cF8gPSAqc2V0dXA7Ci0gIH0gZWxzZSBpZiAoKnNldHVwID09ICdGJykgewotICAgIHNldHVwXyA9ICpzZXR1cDsKLSAgfSBlbHNlIHsKLSAgICBkZWZpRXJyb3IoMCwgNjEwMCwgIkVSUk9SIChERUZQQVJTLTYxMDApOiBUaGUgdmFsdWUgc3BlZmlmaWVkIGZvciBQQVJUSVRJT04gU0VUVVAgaXMgaW52YWxpZC4gVGhlIHZhbGlkIHZhbHVlIGZvciBTRVRVUCBpcyAnUicgb3IgJ0YnLiBTcGVjaWZ5IGEgdmFsaWQgdmFsdWUgZm9yIFNFVFVQIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLCBkZWZEYXRhKTsKLSAgfQotCi0gIGlmICgqaG9sZCA9PSAnICcpIHsKLSAgICBob2xkXyA9ICpob2xkOwotICB9IGVsc2UgaWYgKCpob2xkID09ICdSJykgewotICAgIGhvbGRfID0gKmhvbGQ7Ci0gIH0gZWxzZSBpZiAoKmhvbGQgPT0gJ0YnKSB7Ci0gICAgaG9sZF8gPSAqaG9sZDsKLSAgfSBlbHNlIHsKLSAgICBkZWZpRXJyb3IoMCwgNjEwMSwgIkVSUk9SIChERUZQQVJTLTYxMDEpOiBUaGUgdmFsdWUgc3BlZmlmaWVkIGZvciBQQVJUSVRJT04gSE9MRCBpcyBpbnZhbGlkLiBUaGUgdmFsaWQgdmFsdWUgZm9yIEhPTEQgaXMgJ1InIG9yICdGJy4gU3BlY2lmeSBhIHZhbGlkIHZhbHVlIGZvciBIT0xEIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLCBkZWZEYXRhKTsKLSAgfQotCi19Ci0KLQotdm9pZCBkZWZpUGFydGl0aW9uOjpzZXRGcm9tQ2xvY2tQaW4oY29uc3QgY2hhciogaW5zdCwgY29uc3QgY2hhciogcGluKSB7Ci0gIHNldCgnRicsICdMJywgaW5zdCwgcGluKTsKLX0KLQotCi12b2lkIGRlZmlQYXJ0aXRpb246OnNldFRvQ2xvY2tQaW4oY29uc3QgY2hhciogaW5zdCwgY29uc3QgY2hhciogcGluKSB7Ci0gIHNldCgnVCcsICdMJywgaW5zdCwgcGluKTsKLX0KLQotCi12b2lkIGRlZmlQYXJ0aXRpb246OnNldChjaGFyIGRpciwgY2hhciB0eXAsIGNvbnN0IGNoYXIqIGluc3QsIGNvbnN0IGNoYXIqIHBpbikgewotICBpbnQgbGVuID0gc3RybGVuKHBpbikgKyAxOwotICBkaXJlY3Rpb25fID0gZGlyOwotICB0eXBlXyA9IHR5cDsKLQotICBpZiAocGluTGVuZ3RoXyA8PSBsZW4pIHsKLSAgICBpZiAocGluXykgZnJlZShwaW5fKTsKLSAgICBwaW5fID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICAgIHBpbkxlbmd0aF8gPSBsZW47Ci0gIH0KLQotICBzdHJjcHkocGluXywgZGVmRGF0YS0+REVGQ0FTRShwaW4pKTsKLQotICBsZW4gPSBzdHJsZW4oaW5zdCkgKyAxOwotICBpZiAoaW5zdExlbmd0aF8gPD0gbGVuKSB7Ci0gICAgaWYgKGluc3RfKSBmcmVlKGluc3RfKTsKLSAgICBpbnN0XyA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgICBpbnN0TGVuZ3RoXyA9IGxlbjsKLSAgfQotCi0gIHN0cmNweShpbnN0XywgZGVmRGF0YS0+REVGQ0FTRShpbnN0KSk7Ci19Ci0KLQotdm9pZCBkZWZpUGFydGl0aW9uOjpzZXRNaW4oZG91YmxlIG1pbiwgZG91YmxlIG1heCkgewotICBtaW5fID0gbWluOwotICBtYXhfID0gbWF4OwotICBoYXNNaW5fID0gMTsKLX0KLQotCi12b2lkIGRlZmlQYXJ0aXRpb246OnNldEZyb21Db21wUGluKGNvbnN0IGNoYXIqIGluc3QsIGNvbnN0IGNoYXIqIHBpbikgewotICBzZXQoJ0YnLCAnQycsIGluc3QsIHBpbik7Ci19Ci0KLQotdm9pZCBkZWZpUGFydGl0aW9uOjpzZXRNYXgoZG91YmxlIG1pbiwgZG91YmxlIG1heCkgewotICBtaW5fID0gbWluOwotICBtYXhfID0gbWF4OwotICBoYXNNYXhfID0gMTsKLX0KLQotCi12b2lkIGRlZmlQYXJ0aXRpb246OnNldFRvSU9QaW4oY29uc3QgY2hhciogcGluKSB7Ci0gIHNldCgnVCcsICdJJywgIiIsIHBpbik7Ci19Ci0KLQotdm9pZCBkZWZpUGFydGl0aW9uOjpzZXRUb0NvbXBQaW4oY29uc3QgY2hhciogaW5zdCwgY29uc3QgY2hhciogcGluKSB7Ci0gIHNldCgnVCcsICdDJywgaW5zdCwgcGluKTsKLX0KLQotCi12b2lkIGRlZmlQYXJ0aXRpb246OmFkZFBpbihjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIGludCBsZW47Ci0gIGludCBpOwotICBjaGFyKiogbmV3cDsKLQotICBpZiAobnVtUGluc18gPj0gcGluc0FsbG9jYXRlZF8pIHsKLSAgICBwaW5zQWxsb2NhdGVkXyA9IHBpbnNBbGxvY2F0ZWRfID8gMiAqIHBpbnNBbGxvY2F0ZWRfIDogODsKLSAgICBuZXdwID0gKGNoYXIqKikgbWFsbG9jKHNpemVvZihjaGFyKikgKiBwaW5zQWxsb2NhdGVkXyk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bVBpbnNfOyBpKyspCi0gICAgICBuZXdwW2ldID0gcGluc19baV07Ci0gICAgaWYgKHBpbnNfKSBmcmVlKChjaGFyKikocGluc18pKTsKLSAgICBwaW5zXyA9IG5ld3A7Ci0gIH0KLQotICBsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotICBwaW5zX1tudW1QaW5zX10gPSAoY2hhciopbWFsbG9jKGxlbik7Ci0gIHN0cmNweShwaW5zX1tudW1QaW5zX10sIGRlZkRhdGEtPkRFRkNBU0UobmFtZSkpOwotICBudW1QaW5zXyArPSAxOwotfQotCi0KLWludCBkZWZpUGFydGl0aW9uOjpoYXNNaW4oKSBjb25zdCB7Ci0gIHJldHVybihpbnQpKGhhc01pbl8pOwotfQotCi0KLWludCBkZWZpUGFydGl0aW9uOjpoYXNNYXgoKSBjb25zdCB7Ci0gIHJldHVybihpbnQpKGhhc01heF8pOwotfQotCi0KLWRvdWJsZSBkZWZpUGFydGl0aW9uOjpwYXJ0aXRpb25NaW4oKSBjb25zdCB7Ci0gIHJldHVybihtaW5fKTsKLX0KLQotCi1kb3VibGUgZGVmaVBhcnRpdGlvbjo6cGFydGl0aW9uTWF4KCkgY29uc3QgewotICByZXR1cm4obWF4Xyk7Ci19Ci0KLWludCBkZWZpUGFydGl0aW9uOjpoYXNSaXNlTWluKCkgY29uc3QgewotICByZXR1cm4gKGludCkoaGFzUmlzZU1pbl8pOwotfQotCi0KLWludCBkZWZpUGFydGl0aW9uOjpoYXNGYWxsTWluKCkgY29uc3QgewotICByZXR1cm4gKGludCkoaGFzRmFsbE1pbl8pOwotfQotCi0KLWludCBkZWZpUGFydGl0aW9uOjpoYXNSaXNlTWF4KCkgY29uc3QgewotICByZXR1cm4gKGludCkoaGFzUmlzZU1heF8pOwotfQotCi0KLWludCBkZWZpUGFydGl0aW9uOjpoYXNGYWxsTWF4KCkgY29uc3QgewotICByZXR1cm4gKGludCkoaGFzRmFsbE1heF8pOwotfQotCi0KLWludCBkZWZpUGFydGl0aW9uOjpoYXNSaXNlTWluUmFuZ2UoKSBjb25zdCB7Ci0gIHJldHVybiAoaW50KShoYXNSaXNlTWluUmFuZ2VfKTsKLX0KLQotCi1pbnQgZGVmaVBhcnRpdGlvbjo6aGFzRmFsbE1pblJhbmdlKCkgY29uc3QgewotICByZXR1cm4gKGludCkoaGFzRmFsbE1pblJhbmdlXyk7Ci19Ci0KLQotaW50IGRlZmlQYXJ0aXRpb246Omhhc1Jpc2VNYXhSYW5nZSgpIGNvbnN0IHsKLSAgcmV0dXJuIChpbnQpKGhhc1Jpc2VNYXhSYW5nZV8pOwotfQotCi0KLWludCBkZWZpUGFydGl0aW9uOjpoYXNGYWxsTWF4UmFuZ2UoKSBjb25zdCB7Ci0gIHJldHVybiAoaW50KShoYXNGYWxsTWF4UmFuZ2VfKTsKLX0KLQotCi1kb3VibGUgZGVmaVBhcnRpdGlvbjo6cmlzZU1pbigpIGNvbnN0IHsKLSAgcmV0dXJuIHJpc2VNaW5fOwotfQotCi0KLWRvdWJsZSBkZWZpUGFydGl0aW9uOjpmYWxsTWluKCkgY29uc3QgewotICByZXR1cm4gZmFsbE1pbl87Ci19Ci0KLQotZG91YmxlIGRlZmlQYXJ0aXRpb246OnJpc2VNYXgoKSBjb25zdCB7Ci0gIHJldHVybiByaXNlTWF4XzsKLX0KLQotCi1kb3VibGUgZGVmaVBhcnRpdGlvbjo6ZmFsbE1heCgpIGNvbnN0IHsKLSAgcmV0dXJuIGZhbGxNYXhfOwotfQotCi0KLWRvdWJsZSBkZWZpUGFydGl0aW9uOjpyaXNlTWluTGVmdCgpIGNvbnN0IHsKLSAgcmV0dXJuIHJpc2VNaW5MZWZ0XzsKLX0KLQotCi1kb3VibGUgZGVmaVBhcnRpdGlvbjo6ZmFsbE1pbkxlZnQoKSBjb25zdCB7Ci0gIHJldHVybiBmYWxsTWluTGVmdF87Ci19Ci0KLQotZG91YmxlIGRlZmlQYXJ0aXRpb246OnJpc2VNYXhMZWZ0KCkgY29uc3QgewotICByZXR1cm4gcmlzZU1heExlZnRfOwotfQotCi0KLWRvdWJsZSBkZWZpUGFydGl0aW9uOjpmYWxsTWF4TGVmdCgpIGNvbnN0IHsKLSAgcmV0dXJuIGZhbGxNYXhMZWZ0XzsKLX0KLQotCi1kb3VibGUgZGVmaVBhcnRpdGlvbjo6cmlzZU1pblJpZ2h0KCkgY29uc3QgewotICByZXR1cm4gcmlzZU1pblJpZ2h0XzsKLX0KLQotCi1kb3VibGUgZGVmaVBhcnRpdGlvbjo6ZmFsbE1pblJpZ2h0KCkgY29uc3QgewotICByZXR1cm4gZmFsbE1pblJpZ2h0XzsKLX0KLQotCi1kb3VibGUgZGVmaVBhcnRpdGlvbjo6cmlzZU1heFJpZ2h0KCkgY29uc3QgewotICByZXR1cm4gcmlzZU1heFJpZ2h0XzsKLX0KLQotCi1kb3VibGUgZGVmaVBhcnRpdGlvbjo6ZmFsbE1heFJpZ2h0KCkgY29uc3QgewotICByZXR1cm4gZmFsbE1heFJpZ2h0XzsKLX0KLQotCi12b2lkIGRlZmlQYXJ0aXRpb246OmFkZFJpc2VNaW4oZG91YmxlIGQpIHsKLSAgaGFzUmlzZU1pbl8gPSAxOwotICByaXNlTWluXyA9IGQ7Ci19Ci0KLQotdm9pZCBkZWZpUGFydGl0aW9uOjphZGRSaXNlTWF4KGRvdWJsZSBkKSB7Ci0gIGhhc1Jpc2VNYXhfID0gMTsKLSAgcmlzZU1heF8gPSBkOwotfQotCi0KLXZvaWQgZGVmaVBhcnRpdGlvbjo6YWRkRmFsbE1pbihkb3VibGUgZCkgewotICBoYXNGYWxsTWluXyA9IDE7Ci0gIGZhbGxNaW5fID0gZDsKLX0KLQotCi12b2lkIGRlZmlQYXJ0aXRpb246OmFkZEZhbGxNYXgoZG91YmxlIGQpIHsKLSAgaGFzRmFsbE1heF8gPSAxOwotICBmYWxsTWF4XyA9IGQ7Ci19Ci0KLQotdm9pZCBkZWZpUGFydGl0aW9uOjphZGRSaXNlTWluUmFuZ2UoZG91YmxlIGwsIGRvdWJsZSBoKSB7Ci0gIGhhc1Jpc2VNaW5SYW5nZV8gPSAxOwotICByaXNlTWluTGVmdF8gPSBsOwotICByaXNlTWluUmlnaHRfID0gaDsKLX0KLQotCi12b2lkIGRlZmlQYXJ0aXRpb246OmFkZFJpc2VNYXhSYW5nZShkb3VibGUgbCwgZG91YmxlIGgpIHsKLSAgaGFzUmlzZU1heFJhbmdlXyA9IDE7Ci0gIHJpc2VNYXhMZWZ0XyA9IGw7Ci0gIHJpc2VNYXhSaWdodF8gPSBoOwotfQotCi0KLXZvaWQgZGVmaVBhcnRpdGlvbjo6YWRkRmFsbE1pblJhbmdlKGRvdWJsZSBsLCBkb3VibGUgaCkgewotICBoYXNGYWxsTWluUmFuZ2VfID0gMTsKLSAgZmFsbE1pbkxlZnRfID0gbDsKLSAgZmFsbE1pblJpZ2h0XyA9IGg7Ci19Ci0KLQotdm9pZCBkZWZpUGFydGl0aW9uOjphZGRGYWxsTWF4UmFuZ2UoZG91YmxlIGwsIGRvdWJsZSBoKSB7Ci0gIGhhc0ZhbGxNYXhSYW5nZV8gPSAxOwotICBmYWxsTWF4TGVmdF8gPSBsOwotICBmYWxsTWF4UmlnaHRfID0gaDsKLX0KLQotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpUGFydGl0aW9uLmhwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaVBhcnRpdGlvbi5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYjk3NmUuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpUGFydGl0aW9uLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2lmbmRlZiBkZWZpUGFydGl0aW9uX2gKLSNkZWZpbmUgZGVmaVBhcnRpdGlvbl9oCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImRlZmlLUkRlZnMuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1jbGFzcyBkZWZyRGF0YTsKLQotY2xhc3MgZGVmaVBhcnRpdGlvbiB7Ci1wdWJsaWM6Ci0gIGRlZmlQYXJ0aXRpb24oZGVmckRhdGEgKmRhdGEpOwotICB2b2lkIEluaXQoKTsKLQotICB2b2lkIERlc3Ryb3koKTsKLSAgfmRlZmlQYXJ0aXRpb24oKTsKLQotICB2b2lkIGNsZWFyKCk7Ci0KLSAgdm9pZCBzZXROYW1lKGNvbnN0IGNoYXIqIG5hbWUpOwotICB2b2lkIGFkZFR1cm5PZmYoY29uc3QgY2hhciogc2V0dXAsIGNvbnN0IGNoYXIqIGhvbGQpOwotICB2b2lkIHNldEZyb21DbG9ja1Bpbihjb25zdCBjaGFyKiBpbnN0LCBjb25zdCBjaGFyKiBwaW4pOwotICB2b2lkIHNldEZyb21Db21wUGluKGNvbnN0IGNoYXIqIGluc3QsIGNvbnN0IGNoYXIqIHBpbik7Ci0gIHZvaWQgc2V0RnJvbUlPUGluKGNvbnN0IGNoYXIqIGluc3QpOwotICB2b2lkIHNldFRvQ2xvY2tQaW4oY29uc3QgY2hhciogaW5zdCwgY29uc3QgY2hhciogcGluKTsKLSAgdm9pZCBzZXRUb0NvbXBQaW4oY29uc3QgY2hhciogaW5zdCwgY29uc3QgY2hhciogcGluKTsKLSAgdm9pZCBzZXQoY2hhciBkaXIsIGNoYXIgdHlwLCBjb25zdCBjaGFyKiBpbnN0LCBjb25zdCBjaGFyKiBwaW4pOwotICB2b2lkIHNldFRvSU9QaW4oY29uc3QgY2hhciogaW5zdCk7Ci0gIHZvaWQgc2V0TWluKGRvdWJsZSBtaW4sIGRvdWJsZSBtYXgpOwotICB2b2lkIHNldE1heChkb3VibGUgbWluLCBkb3VibGUgbWF4KTsKLSAgdm9pZCBhZGRQaW4oY29uc3QgY2hhciogbmFtZSk7Ci0gIHZvaWQgYWRkUmlzZU1pbihkb3VibGUgZCk7Ci0gIHZvaWQgYWRkUmlzZU1heChkb3VibGUgZCk7Ci0gIHZvaWQgYWRkRmFsbE1pbihkb3VibGUgZCk7Ci0gIHZvaWQgYWRkRmFsbE1heChkb3VibGUgZCk7Ci0gIHZvaWQgYWRkUmlzZU1pblJhbmdlKGRvdWJsZSBsLCBkb3VibGUgaCk7Ci0gIHZvaWQgYWRkUmlzZU1heFJhbmdlKGRvdWJsZSBsLCBkb3VibGUgaCk7Ci0gIHZvaWQgYWRkRmFsbE1pblJhbmdlKGRvdWJsZSBsLCBkb3VibGUgaCk7Ci0gIHZvaWQgYWRkRmFsbE1heFJhbmdlKGRvdWJsZSBsLCBkb3VibGUgaCk7Ci0KLSAgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0OwotICBjaGFyIGRpcmVjdGlvbigpIGNvbnN0OwotICBjb25zdCBjaGFyKiBpdGVtVHlwZSgpIGNvbnN0OyAgLy8gIkNMT0NLIiBvciAiSU8iIG9yICJDT01QIgotICBjb25zdCBjaGFyKiBwaW5OYW1lKCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIGluc3ROYW1lKCkgY29uc3Q7Ci0KLSAgaW50IG51bVBpbnMoKSBjb25zdDsKLSAgY29uc3QgY2hhciogcGluKGludCBpbmRleCkgY29uc3Q7Ci0KLSAgaW50IGlzU2V0dXBSaXNlKCkgY29uc3Q7Ci0gIGludCBpc1NldHVwRmFsbCgpIGNvbnN0OwotICBpbnQgaXNIb2xkUmlzZSgpIGNvbnN0OwotICBpbnQgaXNIb2xkRmFsbCgpIGNvbnN0OwotICBpbnQgaGFzTWluKCkgY29uc3Q7Ci0gIGludCBoYXNNYXgoKSBjb25zdDsKLSAgaW50IGhhc1Jpc2VNaW4oKSBjb25zdDsKLSAgaW50IGhhc0ZhbGxNaW4oKSBjb25zdDsKLSAgaW50IGhhc1Jpc2VNYXgoKSBjb25zdDsKLSAgaW50IGhhc0ZhbGxNYXgoKSBjb25zdDsKLSAgaW50IGhhc1Jpc2VNaW5SYW5nZSgpIGNvbnN0OwotICBpbnQgaGFzRmFsbE1pblJhbmdlKCkgY29uc3Q7Ci0gIGludCBoYXNSaXNlTWF4UmFuZ2UoKSBjb25zdDsKLSAgaW50IGhhc0ZhbGxNYXhSYW5nZSgpIGNvbnN0OwotCi0gIGRvdWJsZSBwYXJ0aXRpb25NaW4oKSBjb25zdDsKLSAgZG91YmxlIHBhcnRpdGlvbk1heCgpIGNvbnN0OwotCi0gIGRvdWJsZSByaXNlTWluKCkgY29uc3Q7Ci0gIGRvdWJsZSBmYWxsTWluKCkgY29uc3Q7Ci0gIGRvdWJsZSByaXNlTWF4KCkgY29uc3Q7Ci0gIGRvdWJsZSBmYWxsTWF4KCkgY29uc3Q7Ci0KLSAgZG91YmxlIHJpc2VNaW5MZWZ0KCkgY29uc3Q7Ci0gIGRvdWJsZSBmYWxsTWluTGVmdCgpIGNvbnN0OwotICBkb3VibGUgcmlzZU1heExlZnQoKSBjb25zdDsKLSAgZG91YmxlIGZhbGxNYXhMZWZ0KCkgY29uc3Q7Ci0gIGRvdWJsZSByaXNlTWluUmlnaHQoKSBjb25zdDsKLSAgZG91YmxlIGZhbGxNaW5SaWdodCgpIGNvbnN0OwotICBkb3VibGUgcmlzZU1heFJpZ2h0KCkgY29uc3Q7Ci0gIGRvdWJsZSBmYWxsTWF4UmlnaHQoKSBjb25zdDsKLQotICAvLyBkZWJ1ZyBwcmludAotICB2b2lkIHByaW50KEZJTEUqIGYpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gIGNoYXIqIG5hbWVfOwotICBpbnQgbmFtZUxlbmd0aF87Ci0gIGNoYXIgc2V0dXBfOwotICBjaGFyIGhvbGRfOwotICBjaGFyIGhhc01pbl87Ci0gIGNoYXIgaGFzTWF4XzsKLSAgY2hhciBkaXJlY3Rpb25fOyAgIC8vICdGJyBvciAnVCcKLSAgY2hhciB0eXBlXzsgICAgICAgIC8vICdMJy1jbG9jayAgICdJJy1JTyAgJ0MnLWNvbXAKLSAgY2hhciogaW5zdF87Ci0gIGludCBpbnN0TGVuZ3RoXzsKLSAgY2hhciogcGluXzsKLSAgaW50IHBpbkxlbmd0aF87Ci0gIGRvdWJsZSBtaW5fLCBtYXhfOwotCi0gIGludCBudW1QaW5zXzsKLSAgaW50IHBpbnNBbGxvY2F0ZWRfOwotICBjaGFyKiogcGluc187Ci0KLSAgY2hhciBoYXNSaXNlTWluXzsKLSAgY2hhciBoYXNGYWxsTWluXzsKLSAgY2hhciBoYXNSaXNlTWF4XzsKLSAgY2hhciBoYXNGYWxsTWF4XzsKLSAgY2hhciBoYXNSaXNlTWluUmFuZ2VfOwotICBjaGFyIGhhc0ZhbGxNaW5SYW5nZV87Ci0gIGNoYXIgaGFzUmlzZU1heFJhbmdlXzsKLSAgY2hhciBoYXNGYWxsTWF4UmFuZ2VfOwotICBkb3VibGUgcmlzZU1pbl87Ci0gIGRvdWJsZSBmYWxsTWluXzsKLSAgZG91YmxlIHJpc2VNYXhfOwotICBkb3VibGUgZmFsbE1heF87Ci0gIGRvdWJsZSByaXNlTWluTGVmdF87Ci0gIGRvdWJsZSBmYWxsTWluTGVmdF87Ci0gIGRvdWJsZSByaXNlTWF4TGVmdF87Ci0gIGRvdWJsZSBmYWxsTWF4TGVmdF87Ci0gIGRvdWJsZSByaXNlTWluUmlnaHRfOwotICBkb3VibGUgZmFsbE1pblJpZ2h0XzsKLSAgZG91YmxlIHJpc2VNYXhSaWdodF87Ci0gIGRvdWJsZSBmYWxsTWF4UmlnaHRfOwotCi0gIGRlZnJEYXRhICpkZWZEYXRhOwotfTsKLQotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotVVNFX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpUGF0aC5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlQYXRoLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg2YzQwZS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlQYXRoLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU2MyArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEzIC0gMjAxNiwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJkZWZpUGF0aC5ocHAiCi0jaW5jbHVkZSAiZGVmaURlYnVnLmhwcCIKLSNpbmNsdWRlICJsZXguaCIKLSNpbmNsdWRlICJkZWZpVXRpbC5ocHAiCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLWRlZmlQYXRoOjpkZWZpUGF0aChkZWZyRGF0YSAqZGF0YSkKLTogZGVmRGF0YShkYXRhKSwKLWtleXNfKE5VTEwpLAotZGF0YV8oTlVMTCksCi1wb2ludGVyXyhOVUxMKSwKLW51bVVzZWRfKDApLAotbnVtQWxsb2NhdGVkXygwKSwKLW51bVhfKDApLCAgICAgIAotbnVtWV8oMCksCi1zdGVwWF8oMCksCi1zdGVwWV8oMCksCi1kZWx0YVhfKDApLAotZGVsdGFZXygwKSwKLW1hc2tfKDApCi17fQotCi0KLWRlZmlQYXRoOjpkZWZpUGF0aChkZWZpUGF0aCAqZGVmaVBhdGhSZWYpIAotewotICAgICp0aGlzID0gKmRlZmlQYXRoUmVmOwotCi0gICAgZGVmaVBhdGhSZWYtPnBvaW50ZXJfID0gTlVMTDsKLSAgICBkZWZpUGF0aFJlZi0+a2V5c18gPSBOVUxMOwotICAgIGRlZmlQYXRoUmVmLT5kYXRhXyA9IE5VTEw7ICAgIAotfQotCi0KLWRlZmlQYXRoOjp+ZGVmaVBhdGgoKSB7Ci0gIERlc3Ryb3koKTsKLX0KLQotCi12b2lkIGRlZmlQYXRoOjpJbml0KCkgewotICAvLyBTaG91bGQgZG8gbm90aGluZyBpbiBjb25zdHJ1Y3RvciBjYXNlLiAKLSAgRGVzdHJveSgpOwotCi0gIG51bVVzZWRfID0gMDsKLSAgbnVtQWxsb2NhdGVkXyA9IDA7Ci0gIHBvaW50ZXJfID0gbmV3IGludDsKLSAgKnBvaW50ZXJfID0gLTE7Ci0KLSAgbnVtWF8gPSAwOyAgICAgIAotICBudW1ZXyA9IDA7Ci0gIHN0ZXBYXyA9IDA7Ci0gIHN0ZXBZXyA9IDA7Ci0gIGRlbHRhWF8gPSAwOwotICBkZWx0YVlfID0gMDsKLSAgbWFza18gPSAwOwotCi0gIGJ1bXBTaXplKDE2KTsKLX0KLQotCi12b2lkIGRlZmlQYXRoOjpjbGVhcigpIHsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IG51bVVzZWRfOyBpKyspIHsKLSAgICBmcmVlKGRhdGFfW2ldKTsKLSAgICBkYXRhX1tpXSA9IE5VTEw7Ci0gIH0KLQotICBudW1Vc2VkXyA9IDA7Ci0KLSAgZGVsZXRlIHBvaW50ZXJfOwotICBwb2ludGVyXyA9IE5VTEw7Ci19Ci0KLQotdm9pZCBkZWZpUGF0aDo6RGVzdHJveSgpIHsKLQotICBpZiAoa2V5c18pCi0gICAgIGZyZWUoKGNoYXIqKShrZXlzXykpOwotICAgICBrZXlzXyA9IE5VTEw7Ci0gIGlmIChkYXRhXykgewotICAgICBjbGVhcigpOwotICAgICBmcmVlKChjaGFyKikoZGF0YV8pKTsKLSAgICAgZGF0YV8gPSBOVUxMOwotICB9Ci19Ci0KLQotdm9pZCBkZWZpUGF0aDo6cmV2ZXJzZU9yZGVyKCkgewotICBpbnQgb25lID0gMDsKLSAgaW50IHR3byA9IG51bVVzZWRfIC0gMTsKLSAgaW50IHQ7Ci0gIHZvaWQgKnRwdHI7Ci0gIHdoaWxlIChvbmUgPCB0d28pIHsKLSAgICB0ID0ga2V5c19bb25lXTsKLSAgICBrZXlzX1tvbmVdID0ga2V5c19bdHdvXTsKLSAgICBrZXlzX1t0d29dID0gdDsKLSAgICB0cHRyID0gZGF0YV9bb25lXTsKLSAgICBkYXRhX1tvbmVdID0gZGF0YV9bdHdvXTsKLSAgICBkYXRhX1t0d29dID0gdHB0cjsKLSAgICBvbmUrKzsKLSAgICB0d28tLTsKLSAgfQotfQotCi0KLXZvaWQgZGVmaVBhdGg6OmluaXRUcmF2ZXJzZSgpIGNvbnN0IHsKLSAgKihwb2ludGVyXykgPSAtMTsKLX0KLQotCi12b2lkIGRlZmlQYXRoOjppbml0VHJhdmVyc2VCYWNrd2FyZHMoKSBjb25zdCB7Ci0gICoocG9pbnRlcl8pID0gbnVtVXNlZF87Ci19Ci0KLQotaW50IAotZGVmaVBhdGg6OmN1cnJlbnRUeXBlKCkgY29uc3QKLXsKLSAgICBpZiAoKihwb2ludGVyXykgPj0gMCAmJiAqKHBvaW50ZXJfKSA8IG51bVVzZWRfKSB7Ci0gICAgICAgIHN3aXRjaCAoa2V5c19bKihwb2ludGVyXyldKSB7Ci0gICAgICAgICAgICBjYXNlICdMJzogcmV0dXJuIERFRklQQVRIX0xBWUVSOwotICAgICAgICAgICAgY2FzZSAnVic6IHJldHVybiBERUZJUEFUSF9WSUE7Ci0gICAgICAgICAgICBjYXNlICdXJzogcmV0dXJuIERFRklQQVRIX1dJRFRIOwotICAgICAgICAgICAgY2FzZSAnUCc6IHJldHVybiBERUZJUEFUSF9QT0lOVDsKLSAgICAgICAgICAgIGNhc2UgJ0YnOiByZXR1cm4gREVGSVBBVEhfRkxVU0hQT0lOVDsKLSAgICAgICAgICAgIGNhc2UgJ1QnOiByZXR1cm4gREVGSVBBVEhfVEFQRVI7Ci0gICAgICAgICAgICBjYXNlICdSJzogcmV0dXJuIERFRklQQVRIX1RBUEVSUlVMRTsKLSAgICAgICAgICAgIGNhc2UgJ1MnOiByZXR1cm4gREVGSVBBVEhfU0hBUEU7Ci0gICAgICAgICAgICBjYXNlICdZJzogcmV0dXJuIERFRklQQVRIX1NUWUxFOwotICAgICAgICAgICAgY2FzZSAnTyc6IHJldHVybiBERUZJUEFUSF9WSUFST1RBVElPTjsKLSAgICAgICAgICAgIGNhc2UgJ0UnOiByZXR1cm4gREVGSVBBVEhfUkVDVDsKLSAgICAgICAgICAgIGNhc2UgJ0QnOiByZXR1cm4gREVGSVBBVEhfVklBREFUQTsKLSAgICAgICAgICAgIGNhc2UgJ1UnOiByZXR1cm4gREVGSVBBVEhfVklSVFVBTFBPSU5UOwotICAgICAgICAgICAgY2FzZSAnTSc6IHJldHVybiBERUZJUEFUSF9NQVNLOwotICAgICAgICAgICAgY2FzZSAnQyc6IHJldHVybiBERUZJUEFUSF9WSUFNQVNLOwotICAgICAgICAgICAgZGVmYXVsdCA6IHJldHVybiBERUZJUEFUSF9ET05FOwotICAgICAgICB9IAotICAgIH0KLQotICAgIHJldHVybiBERUZJUEFUSF9ET05FOwotfQotCi1pbnQgZGVmaVBhdGg6Om5leHQoKSBjb25zdCAKLXsKLSAgICAoKihwb2ludGVyXykpKys7Ci0KLSAgICByZXR1cm4gY3VycmVudFR5cGUoKTsKLX0KLQotCi1pbnQgZGVmaVBhdGg6OnByZXYoKSAgY29uc3R7Ci0gICgqKHBvaW50ZXJfKSktLTsKLQotICByZXR1cm4gY3VycmVudFR5cGUoKTsKLX0KLQotaW50IGRlZmlQYXRoOjpnZXRUYXBlcigpIGNvbnN0IHsKLSAgaWYgKGtleXNfWyoocG9pbnRlcl8pXSAhPSAnVCcpIHJldHVybiAwOwotICByZXR1cm4gMTsKLX0KLQotY29uc3QgY2hhciogZGVmaVBhdGg6OmdldFRhcGVyUnVsZSgpIGNvbnN0IHsKLSAgaWYgKGtleXNfWyoocG9pbnRlcl8pXSAhPSAnUicpIHJldHVybiAwOwotICByZXR1cm4gKGNoYXIqKShkYXRhX1sqKHBvaW50ZXJfKV0pOwotfQotCi1jb25zdCBjaGFyKiBkZWZpUGF0aDo6Z2V0TGF5ZXIoKSBjb25zdCB7Ci0gIGlmIChrZXlzX1sqKHBvaW50ZXJfKV0gIT0gJ0wnKSByZXR1cm4gMDsKLSAgcmV0dXJuIChjaGFyKikoZGF0YV9bKihwb2ludGVyXyldKTsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpUGF0aDo6Z2V0VmlhKCkgY29uc3QgewotICBpZiAoa2V5c19bKihwb2ludGVyXyldICE9ICdWJykgcmV0dXJuIDA7Ci0gIHJldHVybiAoY2hhciopKGRhdGFfWyoocG9pbnRlcl8pXSk7Ci19Ci0KLQotY29uc3QgY2hhciogZGVmaVBhdGg6OmdldFNoYXBlKCkgY29uc3QgewotICBpZiAoa2V5c19bKihwb2ludGVyXyldICE9ICdTJykgcmV0dXJuIDA7Ci0gIHJldHVybiAoY2hhciopKGRhdGFfWyoocG9pbnRlcl8pXSk7Ci19Ci0KLQotaW50IGRlZmlQYXRoOjpnZXRTdHlsZSgpIGNvbnN0IHsKLSAgaW50ICpzdHlsZTsKLSAgaWYgKGtleXNfWyoocG9pbnRlcl8pXSAhPSAnWScpIHJldHVybiAwOwotICBzdHlsZSA9IChpbnQqKShkYXRhX1sqKHBvaW50ZXJfKV0pOwotICByZXR1cm4gKnN0eWxlOwotfQotCi0KLWludCBkZWZpUGF0aDo6Z2V0V2lkdGgoKSBjb25zdCB7Ci0gIGludCAqd3B0cjsKLSAgaWYgKGtleXNfWyoocG9pbnRlcl8pXSAhPSAnVycpIHJldHVybiAwOwotICB3cHRyID0gKGludCopKGRhdGFfWyoocG9pbnRlcl8pXSk7Ci0gIHJldHVybiAqd3B0cjsKLX0KLQotaW50IGRlZmlQYXRoOjpnZXRWaWFSb3RhdGlvbigpIGNvbnN0IHsKLSAgaW50ICp3cHRyOwotICBpZiAoa2V5c19bKihwb2ludGVyXyldICE9ICdPJykgcmV0dXJuIDA7Ci0gIHdwdHIgPSAoaW50KikoZGF0YV9bKihwb2ludGVyXyldKTsKLSAgcmV0dXJuICp3cHRyOwotfQotCi1pbnQgZGVmaVBhdGg6OmdldE1hc2soKSBjb25zdCB7Ci0gICAgaW50ICp3cHRyOwotICAgIGlmIChrZXlzX1sqKHBvaW50ZXJfKV0gIT0gJ00nKSByZXR1cm4gMDsKLSAgICB3cHRyID0gKGludCopKGRhdGFfWyoocG9pbnRlcl8pXSk7Ci0gICAgcmV0dXJuICp3cHRyOwotfQotCi1pbnQgZGVmaVBhdGg6OmdldFZpYUJvdHRvbU1hc2soKSBjb25zdCB7Ci0gICAgaW50ICp3cHRyOwotICAgIGlmIChrZXlzX1sqKHBvaW50ZXJfKV0gIT0gJ0MnKSByZXR1cm4gMDsKLSAgICB3cHRyID0gKGludCopKGRhdGFfWyoocG9pbnRlcl8pXSk7Ci0KLSAgICBpbnQgdmlhTWFzayA9ICp3cHRyOwotCi0gICAgcmV0dXJuIHZpYU1hc2sgJSAxMDsKLX0KLQotaW50IGRlZmlQYXRoOjpnZXRWaWFDdXRNYXNrKCkgY29uc3QgewotICAgIGludCAqd3B0cjsKLSAgICBpZiAoa2V5c19bKihwb2ludGVyXyldICE9ICdDJykgcmV0dXJuIDA7Ci0gICAgd3B0ciA9IChpbnQqKShkYXRhX1sqKHBvaW50ZXJfKV0pOwotCi0gICAgaW50IHZpYU1hc2sgPSAqd3B0cjsKLQotICAgIHJldHVybiB2aWFNYXNrIC8gMTAgJSAxMDsKLX0KLQotaW50IGRlZmlQYXRoOjpnZXRWaWFUb3BNYXNrKCkgY29uc3QgewotICAgIGludCAqd3B0cjsKLSAgICBpZiAoa2V5c19bKihwb2ludGVyXyldICE9ICdDJykgcmV0dXJuIDA7Ci0gICAgd3B0ciA9IChpbnQqKShkYXRhX1sqKHBvaW50ZXJfKV0pOwotCi0gICAgaW50IHZpYU1hc2sgPSAqd3B0cjsKLQotICAgIHJldHVybiB2aWFNYXNrIC8gMTAwOwotfQotCi1jb25zdCBjaGFyKiBkZWZpUGF0aDo6Z2V0VmlhUm90YXRpb25TdHIoKSBjb25zdCB7Ci0gIGludCAqd3B0cjsKLSAgaWYgKGtleXNfWyoocG9pbnRlcl8pXSAhPSAnTycpIHJldHVybiAwOwotICB3cHRyID0gKGludCopKGRhdGFfWyoocG9pbnRlcl8pXSk7Ci0gIHJldHVybiBkZWZpT3JpZW50U3RyKCp3cHRyKTsKLX0KLQotdm9pZCBkZWZpUGF0aDo6Z2V0VmlhUmVjdChpbnQqIGRlbHRhWDEsIGludCogZGVsdGFZMSwgaW50KiBkZWx0YVgyLCBpbnQqIGRlbHRhWTIpIGNvbnN0IHsKLSAgICBpZiAoa2V5c19bKihwb2ludGVyXyldICE9ICdFJykgcmV0dXJuIDsKLSAgICAqZGVsdGFYMSA9ICgoc3RydWN0IGRlZmlWaWFSZWN0KikoZGF0YV9bKihwb2ludGVyXyldKSktPmRlbHRhWDE7Ci0gICAgKmRlbHRhWTEgPSAoKHN0cnVjdCBkZWZpVmlhUmVjdCopKGRhdGFfWyoocG9pbnRlcl8pXSkpLT5kZWx0YVkxOwotICAgICpkZWx0YVgyID0gKChzdHJ1Y3QgZGVmaVZpYVJlY3QqKShkYXRhX1sqKHBvaW50ZXJfKV0pKS0+ZGVsdGFYMjsKLSAgICAqZGVsdGFZMiA9ICgoc3RydWN0IGRlZmlWaWFSZWN0KikoZGF0YV9bKihwb2ludGVyXyldKSktPmRlbHRhWTI7Ci19Ci0KLXZvaWQgZGVmaVBhdGg6OmdldFZpYURhdGEoaW50KiBudW1YLCBpbnQqIG51bVksIGludCogc3RlcFgsIGludCogc3RlcFkpIGNvbnN0IHsKLSAgaWYgKGtleXNfWyoocG9pbnRlcl8pXSAhPSAnRCcpIHJldHVybiA7Ci0gICpudW1YID0gKChzdHJ1Y3QgZGVmaVZpYURhdGEqKShkYXRhX1sqKHBvaW50ZXJfKV0pKS0+bnVtWDsKLSAgKm51bVkgPSAoKHN0cnVjdCBkZWZpVmlhRGF0YSopKGRhdGFfWyoocG9pbnRlcl8pXSkpLT5udW1ZOwotICAqc3RlcFggPSAoKHN0cnVjdCBkZWZpVmlhRGF0YSopKGRhdGFfWyoocG9pbnRlcl8pXSkpLT5zdGVwWDsKLSAgKnN0ZXBZID0gKChzdHJ1Y3QgZGVmaVZpYURhdGEqKShkYXRhX1sqKHBvaW50ZXJfKV0pKS0+c3RlcFk7Ci19Ci0KLQotdm9pZCBkZWZpUGF0aDo6Z2V0Rmx1c2hQb2ludChpbnQqIHgsIGludCogeSwgaW50KiBleHQpIGNvbnN0IHsKLSAgaWYgKGtleXNfWyoocG9pbnRlcl8pXSAhPSAnRicpIHJldHVybiA7Ci0gICp4ID0gKChzdHJ1Y3QgZGVmaVBudCopKGRhdGFfWyoocG9pbnRlcl8pXSkpLT54OwotICAqeSA9ICgoc3RydWN0IGRlZmlQbnQqKShkYXRhX1sqKHBvaW50ZXJfKV0pKS0+eTsKLSAgKmV4dCA9ICgoc3RydWN0IGRlZmlQbnQqKShkYXRhX1sqKHBvaW50ZXJfKV0pKS0+ZXh0OwotfQotCi12b2lkIGRlZmlQYXRoOjpnZXRWaXJ0dWFsUG9pbnQoaW50KiB4LCBpbnQqIHkpIGNvbnN0IHsKLSAgICBpZiAoa2V5c19bKihwb2ludGVyXyldICE9ICdVJykgcmV0dXJuIDsKLSAgICAqeCA9ICgoc3RydWN0IGRlZmlQbnQqKShkYXRhX1sqKHBvaW50ZXJfKV0pKS0+eDsKLSAgICAqeSA9ICgoc3RydWN0IGRlZmlQbnQqKShkYXRhX1sqKHBvaW50ZXJfKV0pKS0+eTsKLX0KLQotdm9pZCBkZWZpUGF0aDo6Z2V0UG9pbnQoaW50KiB4LCBpbnQqIHkpIGNvbnN0IHsKLSAgaWYgKGtleXNfWyoocG9pbnRlcl8pXSAhPSAnUCcpIHJldHVybiA7Ci0gICp4ID0gKChzdHJ1Y3QgZGVmaVBudCopKGRhdGFfWyoocG9pbnRlcl8pXSkpLT54OwotICAqeSA9ICgoc3RydWN0IGRlZmlQbnQqKShkYXRhX1sqKHBvaW50ZXJfKV0pKS0+eTsKLX0KLQotCi12b2lkIGRlZmlQYXRoOjphZGRXaWR0aChpbnQgdykgewotICBpbnQgKiB3VmFsdWU7Ci0gIGlmIChudW1Vc2VkXyA9PSBudW1BbGxvY2F0ZWRfKQotICAgIGJ1bXBTaXplKG51bUFsbG9jYXRlZF8gKiAyKTsKLSAgd1ZhbHVlID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKTsKLSAgKndWYWx1ZSA9IHc7Ci0gIGtleXNfW251bVVzZWRfXSA9ICdXJzsKLSAgZGF0YV9bbnVtVXNlZF9dID0gd1ZhbHVlOwotICAobnVtVXNlZF8pKys7Ci19Ci0KLQotdm9pZCBkZWZpUGF0aDo6YWRkVmlhKGNvbnN0IGNoYXIqIGwpIHsKLSAgaW50IGxlbiA9IHN0cmxlbihsKSsxOwotICBpZiAobnVtVXNlZF8gPT0gbnVtQWxsb2NhdGVkXykKLSAgICBidW1wU2l6ZShudW1BbGxvY2F0ZWRfICogMik7Ci0gIGtleXNfW251bVVzZWRfXSA9ICdWJzsKLSAgZGF0YV9bbnVtVXNlZF9dID0gbWFsbG9jKGxlbik7Ci0gIHN0cmNweSgoY2hhciopKGRhdGFfW251bVVzZWRfXSksIGRlZkRhdGEtPkRFRkNBU0UobCkpOwotICAobnVtVXNlZF8pKys7Ci19Ci0KLQotdm9pZCBkZWZpUGF0aDo6YWRkVmlhUm90YXRpb24oaW50IG8pIHsKLSAgaW50ICogb3JpZW50OwotICBpZiAobnVtVXNlZF8gPT0gbnVtQWxsb2NhdGVkXykKLSAgICBidW1wU2l6ZShudW1BbGxvY2F0ZWRfICogMik7Ci0gIG9yaWVudCA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSk7Ci0gICpvcmllbnQgPSBvOwotICBrZXlzX1tudW1Vc2VkX10gPSAnTyc7Ci0gIGRhdGFfW251bVVzZWRfXSA9IG9yaWVudDsKLSAgKG51bVVzZWRfKSsrOwotfQotCi0KLXZvaWQgZGVmaVBhdGg6OmFkZFZpYVJlY3QoaW50IGRlbHRhWDEsIGludCBkZWx0YVkxLCBpbnQgZGVsdGFYMiwgaW50IGRlbHRhWTIpIHsKLSAgICBpZiAobnVtVXNlZF8gPT0gbnVtQWxsb2NhdGVkXykKLSAgICAgICAgYnVtcFNpemUobnVtQWxsb2NhdGVkXyAqIDIpOwotICAgIGtleXNfW251bVVzZWRfXSA9ICdFJzsgIC8vIFJFQ1QKLSAgICBkYXRhX1tudW1Vc2VkX10gPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZWZpVmlhUmVjdCkpOwotICAgICgoc3RydWN0IGRlZmlWaWFSZWN0KikoZGF0YV9bbnVtVXNlZF9dKSktPmRlbHRhWDEgPSBkZWx0YVgxOwotICAgICgoc3RydWN0IGRlZmlWaWFSZWN0KikoZGF0YV9bbnVtVXNlZF9dKSktPmRlbHRhWTEgPSBkZWx0YVkxOwotICAgICgoc3RydWN0IGRlZmlWaWFSZWN0KikoZGF0YV9bbnVtVXNlZF9dKSktPmRlbHRhWDIgPSBkZWx0YVgyOwotICAgICgoc3RydWN0IGRlZmlWaWFSZWN0KikoZGF0YV9bbnVtVXNlZF9dKSktPmRlbHRhWTIgPSBkZWx0YVkyOwotICAgIChudW1Vc2VkXykrKzsKLX0KLQotCi12b2lkIGRlZmlQYXRoOjphZGRWaWFEYXRhKGludCBudW1YLCBpbnQgbnVtWSwgaW50IHN0ZXBYLCBpbnQgc3RlcFkpIHsKLSAgaWYgKG51bVVzZWRfID09IG51bUFsbG9jYXRlZF8pCi0gICAgYnVtcFNpemUobnVtQWxsb2NhdGVkXyAqIDIpOwotICBrZXlzX1tudW1Vc2VkX10gPSAnRCc7Ci0gIGRhdGFfW251bVVzZWRfXSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGRlZmlWaWFEYXRhKSk7Ci0gICgoc3RydWN0IGRlZmlWaWFEYXRhKikoZGF0YV9bbnVtVXNlZF9dKSktPm51bVggPSBudW1YOwotICAoKHN0cnVjdCBkZWZpVmlhRGF0YSopKGRhdGFfW251bVVzZWRfXSkpLT5udW1ZID0gbnVtWTsKLSAgKChzdHJ1Y3QgZGVmaVZpYURhdGEqKShkYXRhX1tudW1Vc2VkX10pKS0+c3RlcFggPSBzdGVwWDsKLSAgKChzdHJ1Y3QgZGVmaVZpYURhdGEqKShkYXRhX1tudW1Vc2VkX10pKS0+c3RlcFkgPSBzdGVwWTsKLSAgKG51bVVzZWRfKSsrOwotfQotCi0KLXZvaWQgZGVmaVBhdGg6OmFkZExheWVyKGNvbnN0IGNoYXIqIGwpIHsKLSAgaW50IGxlbiA9IHN0cmxlbihsKSsxOwotICBpZiAobnVtVXNlZF8gPT0gbnVtQWxsb2NhdGVkXykKLSAgICBidW1wU2l6ZShudW1BbGxvY2F0ZWRfICogMik7Ci0gIGtleXNfW251bVVzZWRfXSA9ICdMJyA7Ci0gIGRhdGFfW251bVVzZWRfXSA9IG1hbGxvYyhsZW4pOwotICBzdHJjcHkoKGNoYXIqKShkYXRhX1tudW1Vc2VkX10pLCBkZWZEYXRhLT5ERUZDQVNFKGwpKTsKLSAgKG51bVVzZWRfKSsrOwotfQotCi0KLXZvaWQgZGVmaVBhdGg6OmFkZFRhcGVyUnVsZShjb25zdCBjaGFyKiBsKSB7Ci0gIGludCBsZW4gPSBzdHJsZW4obCkrMTsKLSAgaWYgKG51bVVzZWRfID09IG51bUFsbG9jYXRlZF8pCi0gICAgYnVtcFNpemUobnVtQWxsb2NhdGVkXyAqIDIpOwotICBrZXlzX1tudW1Vc2VkX10gPSAnUicgOwotICBkYXRhX1tudW1Vc2VkX10gPSBtYWxsb2MobGVuKTsKLSAgc3RyY3B5KChjaGFyKikoZGF0YV9bbnVtVXNlZF9dKSwgZGVmRGF0YS0+REVGQ0FTRShsKSk7Ci0gIChudW1Vc2VkXykrKzsKLX0KLQotCi12b2lkIGRlZmlQYXRoOjphZGRQb2ludChpbnQgeCwgaW50IHkpIHsKLSAgaWYgKG51bVVzZWRfID09IG51bUFsbG9jYXRlZF8pCi0gICAgYnVtcFNpemUobnVtQWxsb2NhdGVkXyAqIDIpOwotICBrZXlzX1tudW1Vc2VkX10gPSAnUCc7Ci0gIGRhdGFfW251bVVzZWRfXSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGRlZmlQbnQpKTsKLSAgKChzdHJ1Y3QgZGVmaVBudCopKGRhdGFfW251bVVzZWRfXSkpIC0+IHggPSB4OwotICAoKHN0cnVjdCBkZWZpUG50KikoZGF0YV9bbnVtVXNlZF9dKSkgLT4geSA9IHk7Ci0gIChudW1Vc2VkXykrKzsKLX0KLQotdm9pZCBkZWZpUGF0aDo6YWRkTWFzayhpbnQgY29sb3JNYXNrKSB7Ci0gICAgaW50KiBtYXNrOwotICAgIGlmIChudW1Vc2VkXyA9PSBudW1BbGxvY2F0ZWRfKQotICAgICAgICBidW1wU2l6ZShudW1BbGxvY2F0ZWRfICogMik7Ci0gICAgbWFzayA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSk7Ci0gICAgKm1hc2sgPSBjb2xvck1hc2s7Ci0gICAga2V5c19bbnVtVXNlZF9dID0gJ00nOyAgLy9NYXNrIGZvciBwb2ludHMKLSAgICBkYXRhX1tudW1Vc2VkX10gPSBtYXNrOwotICAgIChudW1Vc2VkXykrKzsKLX0KLQotdm9pZCBkZWZpUGF0aDo6YWRkVmlhTWFzayhpbnQgY29sb3JNYXNrKSB7Ci0gICAgaW50KiBtYXNrOwotICAgIGlmIChudW1Vc2VkXyA9PSBudW1BbGxvY2F0ZWRfKQotICAgICAgICBidW1wU2l6ZShudW1BbGxvY2F0ZWRfICogMik7Ci0gICAgbWFzayA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSk7Ci0gICAgKm1hc2sgPSBjb2xvck1hc2s7Ci0gICAga2V5c19bbnVtVXNlZF9dID0gJ0MnOyAgLy92aWFNYXNrCi0gICAgZGF0YV9bbnVtVXNlZF9dID0gbWFzazsKLSAgICAobnVtVXNlZF8pKys7Ci19Ci0KLXZvaWQgZGVmaVBhdGg6OmFkZEZsdXNoUG9pbnQoaW50IHgsIGludCB5LCBpbnQgZXh0KSB7Ci0gIGlmIChudW1Vc2VkXyA9PSBudW1BbGxvY2F0ZWRfKQotICAgIGJ1bXBTaXplKG51bUFsbG9jYXRlZF8gKiAyKTsKLSAga2V5c19bbnVtVXNlZF9dID0gJ0YnOwotICBkYXRhX1tudW1Vc2VkX10gPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZWZpUG50KSk7Ci0gICgoc3RydWN0IGRlZmlQbnQqKShkYXRhX1tudW1Vc2VkX10pKSAtPiB4ID0geDsKLSAgKChzdHJ1Y3QgZGVmaVBudCopKGRhdGFfW251bVVzZWRfXSkpIC0+IHkgPSB5OwotICAoKHN0cnVjdCBkZWZpUG50KikoZGF0YV9bbnVtVXNlZF9dKSkgLT4gZXh0ID0gZXh0OwotICAobnVtVXNlZF8pKys7Ci19Ci0KLXZvaWQgZGVmaVBhdGg6OmFkZFZpcnR1YWxQb2ludChpbnQgeCwgaW50IHkpIHsKLSAgICBpZiAobnVtVXNlZF8gPT0gbnVtQWxsb2NhdGVkXykKLSAgICAgICAgYnVtcFNpemUobnVtQWxsb2NhdGVkXyAqIDIpOwotICAgIGtleXNfW251bVVzZWRfXSA9ICdVJzsKLSAgICBkYXRhX1tudW1Vc2VkX10gPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZWZpUG50KSk7Ci0gICAgKChzdHJ1Y3QgZGVmaVBudCopKGRhdGFfW251bVVzZWRfXSkpIC0+IHggPSB4OwotICAgICgoc3RydWN0IGRlZmlQbnQqKShkYXRhX1tudW1Vc2VkX10pKSAtPiB5ID0geTsKLSAgICAobnVtVXNlZF8pKys7Ci19Ci0KLXZvaWQgZGVmaVBhdGg6OnNldFRhcGVyKCkgewotICBpZiAobnVtVXNlZF8gPT0gbnVtQWxsb2NhdGVkXykKLSAgICBidW1wU2l6ZShudW1BbGxvY2F0ZWRfICogMik7Ci0gIGtleXNfW251bVVzZWRfXSA9ICdUJzsKLSAgZGF0YV9bbnVtVXNlZF9dID0gMDsKLSAgKG51bVVzZWRfKSsrOwotfQotCi0KLXZvaWQgZGVmaVBhdGg6OmFkZFNoYXBlKGNvbnN0IGNoYXIqIGwpIHsKLSAgaW50IGxlbiA9IHN0cmxlbihsKSsxOwotICBpZiAobnVtVXNlZF8gPT0gbnVtQWxsb2NhdGVkXykKLSAgICBidW1wU2l6ZShudW1BbGxvY2F0ZWRfICogMik7Ci0gIGtleXNfW251bVVzZWRfXSA9ICdTJyA7Ci0gIGRhdGFfW251bVVzZWRfXSA9IG1hbGxvYyhsZW4pOwotICBzdHJjcHkoKGNoYXIqKShkYXRhX1tudW1Vc2VkX10pLCBkZWZEYXRhLT5ERUZDQVNFKGwpKTsKLSAgKG51bVVzZWRfKSsrOwotfQotCi12b2lkIGRlZmlQYXRoOjphZGRTdHlsZShpbnQgcykgewotICBpbnQgKnN0eWxlOwotICBpZiAobnVtVXNlZF8gPT0gbnVtQWxsb2NhdGVkXykKLSAgICBidW1wU2l6ZShudW1BbGxvY2F0ZWRfICogMik7Ci0gIHN0eWxlID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKTsKLSAgKnN0eWxlID0gczsKLSAga2V5c19bbnVtVXNlZF9dID0gJ1knIDsKLSAgZGF0YV9bbnVtVXNlZF9dID0gc3R5bGU7Ci0gIChudW1Vc2VkXykrKzsKLX0KLQotCi12b2lkIGRlZmlQYXRoOjpwcmludChGSUxFKiBmb3V0KSBjb25zdCB7Ci0gIGludCBpOwotICBpbnQgKndwdHI7Ci0gIGlmIChmb3V0ID09IDApIGZvdXQgPSBzdGRvdXQ7Ci0gIGZwcmludGYoZm91dCwgIlBhdGg6XG4iKTsKLSAgZm9yIChpID0gMDsgaSA8IG51bVVzZWRfOyBpKyspIHsKLSAgICBpZiAoa2V5c19baV0gPT0gJ0wnKSB7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIiBsYXllciAlc1xuIiwgKGNoYXIqKShkYXRhX1tpXSkpOwotICAgIH0gZWxzZSBpZiAoa2V5c19baV0gPT0gJ1InKSB7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIiB0YXBlcnJ1bGUgJXNcbiIsIGRhdGFfW2ldID8gKGNoYXIqKShkYXRhX1tpXSkgOiAiIiApOwotICAgIH0gZWxzZSBpZiAoa2V5c19baV0gPT0gJ1QnKSB7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIiB0YXBlciAlc1xuIiwgZGF0YV9baV0gPyAoY2hhciopKGRhdGFfW2ldKSA6ICIiICk7Ci0gICAgfSBlbHNlIGlmIChrZXlzX1tpXSA9PSAnUycpIHsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiIHNoYXBlICVzXG4iLCBkYXRhX1tpXSA/IChjaGFyKikoZGF0YV9baV0pIDogIiIgKTsKLSAgICB9IGVsc2UgaWYgKGtleXNfW2ldID09ICdWJykgewotICAgICAgICBmcHJpbnRmKGZvdXQsICIgdmlhICVzXG4iLCBkYXRhX1tpXSA/IChjaGFyKikoZGF0YV9baV0pIDogIiIgKTsKLSAgICB9IGVsc2UgaWYgKGtleXNfW2ldID09ICdPJykgewotICAgICAgICBmcHJpbnRmKGZvdXQsICIgdmlhIHJvdGF0aW9uICVzXG4iLAotICAgICAgICAgICAgICAgIGRhdGFfW2ldID8gKGNoYXIqKShkYXRhX1tpXSkgOiAiIiApOwotICAgIH0gZWxzZSBpZiAoa2V5c19baV0gPT0gJ00nKSB7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIiBtYXNrICVkXG4iLCBnZXRNYXNrKCkgKTsKLSAgICB9IGVsc2UgaWYgKGtleXNfW2ldID09ICdFJykgewotICAgICAgICBmcHJpbnRmKGZvdXQsICIgcmVjdCAlZCwlZCwlZCwlZFxuIiwKLSAgICAgICAgICAgICAgICAoKHN0cnVjdCBkZWZpVmlhUmVjdCopKGRhdGFfW2ldKSktPmRlbHRhWDEsCi0gICAgICAgICAgICAgICAgKChzdHJ1Y3QgZGVmaVZpYVJlY3QqKShkYXRhX1tpXSkpLT5kZWx0YVkxLAotICAgICAgICAgICAgICAgICgoc3RydWN0IGRlZmlWaWFSZWN0KikoZGF0YV9baV0pKS0+ZGVsdGFYMiwKLSAgICAgICAgICAgICAgICAoKHN0cnVjdCBkZWZpVmlhUmVjdCopKGRhdGFfW2ldKSktPmRlbHRhWTIpOwotICAgIH0gZWxzZSBpZiAoa2V5c19baV0gPT0gJ1cnKSB7Ci0gICAgICAgIHdwdHIgPSAoaW50KikoZGF0YV9baV0pOwotICAgICAgICBmcHJpbnRmKGZvdXQsICIgd2lkdGggJWRcbiIsICp3cHRyKTsKLSAgICB9IGVsc2UgaWYgKGtleXNfW2ldID09ICdQJykgewotICAgICAgICBmcHJpbnRmKGZvdXQsICIgcG9pbnQgJWQsJWRcbiIsCi0gICAgICAgICAgICAgICAgKChzdHJ1Y3QgZGVmaVBudCopKGRhdGFfW2ldKSktPngsCi0gICAgICAgICAgICAgICAgKChzdHJ1Y3QgZGVmaVBudCopKGRhdGFfW2ldKSktPnkpOwotICAgIH0gZWxzZSBpZiAoa2V5c19baV0gPT0gJ0YnKSB7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIiBmbHVzaHBvaW50ICVkLCVkLCVkXG4iLAotICAgICAgICAgICAgICAgICgoc3RydWN0IGRlZmlQbnQqKShkYXRhX1tpXSkpLT54LAotICAgICAgICAgICAgICAgICgoc3RydWN0IGRlZmlQbnQqKShkYXRhX1tpXSkpLT55LAotICAgICAgICAgICAgICAgICgoc3RydWN0IGRlZmlQbnQqKShkYXRhX1tpXSkpLT5leHQpOwotICAgIH0gZWxzZSBpZiAoa2V5c19baV0gPT0gJ1UnKSB7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIiB2aXJ0dWFscG9pbnQgJWQsJWRcbiIsCi0gICAgICAgICAgICAoKHN0cnVjdCBkZWZpUG50KikoZGF0YV9baV0pKS0+eCwKLSAgICAgICAgICAgICgoc3RydWN0IGRlZmlQbnQqKShkYXRhX1tpXSkpLT55KTsKLSAgICB9IGVsc2UgaWYgKGtleXNfW2ldID09ICdEJykgewotICAgICAgZnByaW50Zihmb3V0LCAiIERPICVkIEJZICVkIFNURVAgJWQgJWRcbiIsCi0gICAgICAgICAgICAgICgoc3RydWN0IGRlZmlWaWFEYXRhKikoZGF0YV9baV0pKS0+bnVtWCwKLSAgICAgICAgICAgICAgKChzdHJ1Y3QgZGVmaVZpYURhdGEqKShkYXRhX1tpXSkpLT5udW1ZLAotICAgICAgICAgICAgICAoKHN0cnVjdCBkZWZpVmlhRGF0YSopKGRhdGFfW2ldKSktPnN0ZXBYLAotICAgICAgICAgICAgICAoKHN0cnVjdCBkZWZpVmlhRGF0YSopKGRhdGFfW2ldKSktPnN0ZXBZKTsKLSAgICB9IGVsc2UgewotICAgICAgZnByaW50Zihmb3V0LCAiIEVSUk9SXG4iKTsKLSAgICB9Ci0gIH0KLX0KLQotCi12b2lkIGRlZmlQYXRoOjpidW1wU2l6ZShpbnQgc2l6ZSkgewotICBpbnQgaTsKLSAgaW50KiBuZXdLZXlzID0gKGludCopbWFsbG9jKHNpemUgKiBzaXplb2YoaW50KikpOwotICB2b2lkKiogbmV3RGF0YSA9ICh2b2lkKiopbWFsbG9jKHNpemUgKiBzaXplb2Yodm9pZCopKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgbnVtVXNlZF87IGkrKykgewotICAgIG5ld0tleXNbaV0gPSBrZXlzX1tpXTsKLSAgICBuZXdEYXRhW2ldID0gZGF0YV9baV07Ci0gIH0KLQotICBpZiAoa2V5c18pIGZyZWUoKGNoYXIqKShrZXlzXykpOwotICBpZiAoZGF0YV8pIGZyZWUoKGNoYXIqKShkYXRhXykpOwotCi0gIGtleXNfID0gbmV3S2V5czsKLSAgZGF0YV8gPSBuZXdEYXRhOwotICBudW1BbGxvY2F0ZWRfID0gc2l6ZTsKLX0KLQotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpUGF0aC5ocHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlQYXRoLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNiNDQyNS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlQYXRoLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEzLTIwMTQsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaWZuZGVmIGRlZmlQYXRoX2gKLSNkZWZpbmUgZGVmaVBhdGhfaAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJkZWZpS1JEZWZzLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotLy8gVFhfRElSOlRSQU5TTEFUSU9OIE9OCi0KLWNsYXNzIGRlZnJEYXRhOwotCi1zdHJ1Y3QgZGVmaVBudCB7Ci0gIGludCB4OwotICBpbnQgeTsKLSAgaW50IGV4dDsKLX07Ci0KLS8vIDUuNC4xIDEtRCAmIDItRCBBcnJheXMgb2YgVmlhcyBpbiBTUEVDSUFMTkVUIFNlY3Rpb24KLXN0cnVjdCBkZWZpVmlhRGF0YSB7Ci0gIGludCBudW1YOwotICBpbnQgbnVtWTsKLSAgaW50IHN0ZXBYOwotICBpbnQgc3RlcFk7Ci19OwotCi1zdHJ1Y3QgZGVmaVZpYVJlY3QgewotICBpbnQgZGVsdGFYMTsKLSAgaW50IGRlbHRhWTE7Ci0gIGludCBkZWx0YVgyOwotICBpbnQgZGVsdGFZMjsKLX07Ci0KLS8vIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBuZXh0KCkgcm91dGluZS4KLWVudW0gZGVmaVBhdGhfZSB7Ci0gIERFRklQQVRIX0RPTkUgPSAwLAotICBERUZJUEFUSF9MQVlFUiwKLSAgREVGSVBBVEhfVklBLAotICBERUZJUEFUSF9WSUFST1RBVElPTiwKLSAgREVGSVBBVEhfV0lEVEgsCi0gIERFRklQQVRIX1BPSU5ULAotICBERUZJUEFUSF9GTFVTSFBPSU5ULAotICBERUZJUEFUSF9UQVBFUiwKLSAgREVGSVBBVEhfU0hBUEUsCi0gIERFRklQQVRIX1NUWUxFLAotICBERUZJUEFUSF9UQVBFUlJVTEUsCi0gIERFRklQQVRIX1ZJQURBVEEsCi0gIERFRklQQVRIX1JFQ1QsCi0gIERFRklQQVRIX1ZJUlRVQUxQT0lOVCwKLSAgREVGSVBBVEhfTUFTSywKLSAgREVGSVBBVEhfVklBTUFTSwotICB9IDsKLQotCi1jbGFzcyBkZWZpUGF0aCB7Ci1wdWJsaWM6Ci0gIGRlZmlQYXRoKGRlZnJEYXRhICpkYXRhKTsKLSAgLy8gVGhpcyBpcyAnZGF0YSBvd25lcnNoaXAgdHJhbnNmZXInIGNvbnN0cnVjdG9yLgotICBkZWZpUGF0aChkZWZpUGF0aCAqZGVmaVBhdGhSZWYpOwotCi0gIHZvaWQgSW5pdCgpOwotCi0gIHZvaWQgRGVzdHJveSgpOwotICB+ZGVmaVBhdGgoKTsKLQotICB2b2lkIGNsZWFyKCk7Ci0gIHZvaWQgcmV2ZXJzZU9yZGVyKCk7Ci0KLSAgLy8gVG8gdHJhdmVyc2UgdGhlIHBhdGggYW5kIGdldCB0aGUgcGFydHMuCi0gIHZvaWQgaW5pdFRyYXZlcnNlKCkgY29uc3Q7ICAgLy8gSW5pdGlhbGl6ZSB0aGUgdHJhdmVyc2UuCi0gIHZvaWQgaW5pdFRyYXZlcnNlQmFja3dhcmRzKCkgY29uc3Q7ICAgLy8gSW5pdGlhbGl6ZSB0aGUgdHJhdmVyc2UgaW4gcmV2ZXJzZS4KLSAgaW50IG5leHQoKSBjb25zdDsgICAgICAgICAgICAvLyBHZXQgdGhlIG5leHQgZWxlbWVudC4KLSAgaW50IHByZXYoKSBjb25zdDsgICAgICAgICAgICAvLyBHZXQgdGhlIG5leHQgZWxlbWVudCBpbiByZXZlcnNlLgotICBjb25zdCBjaGFyKiBnZXRMYXllcigpIGNvbnN0Oy8vIEdldCB0aGUgbGF5ZXIuCi0gIGNvbnN0IGNoYXIqIGdldFRhcGVyUnVsZSgpIGNvbnN0Oy8vIEdldCB0aGUgcnVsZS4KLSAgY29uc3QgY2hhciogZ2V0VmlhKCkgY29uc3Q7ICAvLyBHZXQgdGhlIHZpYS4KLSAgY29uc3QgY2hhciogZ2V0U2hhcGUoKSBjb25zdDsvLyBHZXQgdGhlIHNoYXBlLgotICBpbnQgIGdldFRhcGVyKCkgY29uc3Q7Ly8gR2V0IHRoZSB0YXBlci4KLSAgaW50ICBnZXRTdHlsZSgpIGNvbnN0Oy8vIEdldCB0aGUgc3R5bGUuCi0gIGludCAgZ2V0VmlhUm90YXRpb24oKSBjb25zdDsgIC8vIEdldCB0aGUgdmlhIHJvdGF0aW9uLgotICB2b2lkIGdldFZpYVJlY3QoaW50KiBkZWx0YVgxLCBpbnQqIGRlbHRhWTEsIGludCogZGVsdGFYMiwgaW50KiBkZWx0YVkyKSBjb25zdDsKLSAgY29uc3QgY2hhciogZ2V0VmlhUm90YXRpb25TdHIoKSBjb25zdDsgICAvLyBSZXR1cm4gdmlhIHJvdGF0aW9uIGluIHN0cmluZyBmb3JtYXQKLSAgdm9pZCBnZXRWaWFEYXRhKGludCogbnVtWCwgaW50KiBudW1ZLCBpbnQqIHN0ZXBYLCBpbnQqIHN0ZXBZKSBjb25zdDsgIC8vIDUuNC4xCi0gIGludCAgZ2V0V2lkdGgoKSBjb25zdDsgICAgICAgIC8vIEdldCB0aGUgd2lkdGguCi0gIHZvaWQgZ2V0UG9pbnQoaW50KiB4LCBpbnQqIHkpIGNvbnN0Oy8vIEdldCB0aGUgcG9pbnQuCi0gIHZvaWQgZ2V0Rmx1c2hQb2ludChpbnQqIHgsIGludCogeSwgaW50KiBleHQpIGNvbnN0Oy8vIEdldCB0aGUgcG9pbnQuCi0gIHZvaWQgZ2V0VmlydHVhbFBvaW50KGludCogeCwgaW50KiB5KSBjb25zdDsKLSAgaW50ICBnZXRNYXNrKCkgY29uc3Q7Ci0gIGludCAgZ2V0VmlhVG9wTWFzaygpIGNvbnN0OwotICBpbnQgIGdldFZpYUN1dE1hc2soKSBjb25zdDsKLSAgaW50ICBnZXRWaWFCb3R0b21NYXNrKCkgY29uc3Q7Ci0gIGludCAgZ2V0UmVjdE1hc2soKSBjb25zdDsKLQotCi0gIC8vIFRoZXNlIHJvdXRpbmVzIGFyZSBjYWxsZWQgYnkgdGhlIHBhcnNlciB0byBmaWxsIHRoZSBwYXRoLgotICB2b2lkIGFkZFdpZHRoKGludCB3KTsKLSAgdm9pZCBhZGRQb2ludChpbnQgeCwgaW50IHkpOwotICB2b2lkIGFkZEZsdXNoUG9pbnQoaW50IHgsIGludCB5LCBpbnQgZXh0KTsKLSAgdm9pZCBhZGRWaXJ0dWFsUG9pbnQoaW50IHgsIGludCB5KTsKLSAgdm9pZCBhZGRMYXllcihjb25zdCBjaGFyKiBsYXllcik7Ci0gIHZvaWQgYWRkVmlhKGNvbnN0IGNoYXIqIG5hbWUpOwotICB2b2lkIGFkZFZpYVJvdGF0aW9uKGludCBvcmllbnQpOwotICB2b2lkIGFkZFZpYVJlY3QoaW50IGRlbHRhWDEsIGludCBkZWx0YVkxLCBpbnQgZGVsdGFYMiwgaW50IGRlbHRhWTIpOwotICB2b2lkIGFkZE1hc2soaW50IGNvbG9yTWFzayk7Ci0gIHZvaWQgYWRkVmlhTWFzayhpbnQgY29sb3JNYXNrKTsKLSAgdm9pZCBhZGRWaWFEYXRhKGludCBudW1YLCBpbnQgbnVtWSwgaW50IHN0ZXBYLCBpbnQgc3RlcFkpOyAgIC8vIDUuNC4xCi0gIHZvaWQgc2V0VGFwZXIoKTsKLSAgdm9pZCBhZGRUYXBlclJ1bGUoY29uc3QgY2hhciogcnVsZSk7Ci0gIHZvaWQgYWRkU2hhcGUoY29uc3QgY2hhciogc2hhcGUpOwotICB2b2lkIGFkZFN0eWxlKGludCBzdHlsZSk7Ci0KLSAgLy8gZGVidWcgcHJpbnRpbmcKLSAgdm9pZCBwcmludChGSUxFKiBmb3V0KSBjb25zdDsKLQotICB2b2lkIGJ1bXBTaXplKGludCBzaXplKTsKLQotcHJvdGVjdGVkOgotICBpbnQgY3VycmVudFR5cGUoKSBjb25zdDsKLQotICBpbnQqIGtleXNfOyAgICAgICAgICAgLy8gdHlwZSBvZiBpdGVtIGluIHBhdGgKLSAgdm9pZCoqIGRhdGFfOyAgICAgICAgIC8vIGV4dHJhIGRhdGEKLSAgaW50IG51bVVzZWRfOyAgICAgICAgIC8vIG51bWJlciBvZiBpdGVtcyB1c2VkIGluIGFycmF5Ci0gIGludCBudW1BbGxvY2F0ZWRfOyAgICAvLyBhbGxvY2F0ZWQgc2l6ZSBvZiBrZXlzIGFuZCBkYXRhCi0gIGludCogcG9pbnRlcl87ICAgICAgICAvLyB0cmF2ZXJzYWwgcG9pbnRlciwgYWxsb2NhdGVkIGJlY2F1c2UgdXNlZAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgaXRlcmF0b3IgaW4gY29uc3QgdHJhdmVyc2FsIGZ1bmN0aW9ucy4KLSAgaW50IG51bVhfOyAgICAgIAotICBpbnQgbnVtWV87Ci0gIGludCBzdGVwWF87Ci0gIGludCBzdGVwWV87Ci0gIGludCBkZWx0YVhfOwotICBpbnQgZGVsdGFZXzsKLSAgaW50IG1hc2tfOwotCi0gIGRlZnJEYXRhICpkZWZEYXRhOwotfTsKLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLVVTRV9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaVBpbkNhcC5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlQaW5DYXAuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjNlMzBmLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaVBpbkNhcC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUyICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTMgLSAyMDE1LCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgImRlZmlQaW5DYXAuaHBwIgotI2luY2x1ZGUgImRlZmlDb21wb25lbnQuaHBwIgotI2luY2x1ZGUgImRlZmlEZWJ1Zy5ocHAiCi0jaW5jbHVkZSAibGV4LmgiCi0jaW5jbHVkZSAiZGVmaVV0aWwuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyAgICAgZGVmaVBpbkNhcAotLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0KLXZvaWQgZGVmaVBpbkNhcDo6c2V0UGluKGludCBwKSB7Ci0gIHBpbl8gPSBwOwotfQotCi0KLXZvaWQgZGVmaVBpbkNhcDo6c2V0Q2FwKGRvdWJsZSBkKSB7Ci0gIGNhcF8gPSBkOwotfQotCi0KLWludCBkZWZpUGluQ2FwOjpwaW4oKSBjb25zdCB7Ci0gIHJldHVybiBwaW5fOwotfQotCi0KLWRvdWJsZSBkZWZpUGluQ2FwOjpjYXAoKSBjb25zdCB7Ci0gIHJldHVybiBjYXBfOwotfQotCi0KLXZvaWQgZGVmaVBpbkNhcDo6cHJpbnQoRklMRSogZikgY29uc3QgewotICBmcHJpbnRmKGYsICJQaW5DYXAgICVkICU1LjJmXG4iLCBwaW5fLCBjYXBfKTsKLX0KLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyAgICAgZGVmaVBpbkFudGVubmFNb2RlbAotLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1kZWZpUGluQW50ZW5uYU1vZGVsOjpkZWZpUGluQW50ZW5uYU1vZGVsKGRlZnJEYXRhICpkYXRhKQotIDogb3hpZGVfKDApLAotICAgZGVmRGF0YShkYXRhKQotewotICBJbml0KCk7Ci19Ci0KLQotdm9pZCBkZWZpUGluQW50ZW5uYU1vZGVsOjpJbml0KCkgewotICBudW1BUGluR2F0ZUFyZWFfID0gMDsgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNAotICBBUGluR2F0ZUFyZWFBbGxvY2F0ZWRfID0gMDsgICAgICAgICAgICAgICAgIC8vIDUuNAotICBBUGluR2F0ZUFyZWFfID0gMDsKLSAgQVBpbkdhdGVBcmVhTGF5ZXJfID0gMDsKLSAgbnVtQVBpbk1heEFyZWFDYXJfID0gMDsgICAgICAgICAgICAgICAgICAgICAvLyA1LjQKLSAgQVBpbk1heEFyZWFDYXJBbGxvY2F0ZWRfID0gMDsgICAgICAgICAgICAgICAvLyA1LjQKLSAgQVBpbk1heEFyZWFDYXJfID0gMDsKLSAgQVBpbk1heEFyZWFDYXJMYXllcl8gPSAwOwotICBudW1BUGluTWF4U2lkZUFyZWFDYXJfID0gMDsgICAgICAgICAgICAgICAgIC8vIDUuNAotICBBUGluTWF4U2lkZUFyZWFDYXJBbGxvY2F0ZWRfID0gMDsgICAgICAgICAgIC8vIDUuNAotICBBUGluTWF4U2lkZUFyZWFDYXJfID0gMDsKLSAgQVBpbk1heFNpZGVBcmVhQ2FyTGF5ZXJfID0gMDsKLSAgbnVtQVBpbk1heEN1dENhcl8gPSAwOyAgICAgICAgICAgICAgICAgICAgICAvLyA1LjQKLSAgQVBpbk1heEN1dENhckFsbG9jYXRlZF8gPSAwOyAgICAgICAgICAgICAgICAvLyA1LjQKLSAgQVBpbk1heEN1dENhcl8gPSAwOwotICBBUGluTWF4Q3V0Q2FyTGF5ZXJfID0gMDsKLX0KLQotZGVmaVBpbkFudGVubmFNb2RlbDo6fmRlZmlQaW5BbnRlbm5hTW9kZWwoKSB7Ci0gIERlc3Ryb3koKTsKLX0KLQotCi12b2lkIGRlZmlQaW5BbnRlbm5hTW9kZWw6OmNsZWFyKCkgewotICBpbnQgaTsKLQotICBpZiAob3hpZGVfKQotICAgIGZyZWUoKGNoYXIqKShveGlkZV8pKTsKLSAgb3hpZGVfID0gMDsKLQotICBmb3IgKGkgPSAwOyBpIDwgbnVtQVBpbkdhdGVBcmVhXzsgaSsrKSB7Ci0gICAgaWYgKEFQaW5HYXRlQXJlYUxheWVyX1tpXSkKLSAgICAgICBmcmVlKEFQaW5HYXRlQXJlYUxheWVyX1tpXSk7Ci0gIH0KLSAgbnVtQVBpbkdhdGVBcmVhXyA9IDA7Ci0KLSAgZm9yIChpID0gMDsgaSA8IG51bUFQaW5NYXhBcmVhQ2FyXzsgaSsrKSB7Ci0gICAgaWYgKEFQaW5NYXhBcmVhQ2FyTGF5ZXJfW2ldKQotICAgICAgIGZyZWUoQVBpbk1heEFyZWFDYXJMYXllcl9baV0pOwotICB9Ci0gIG51bUFQaW5NYXhBcmVhQ2FyXyA9IDA7Ci0KLSAgZm9yIChpID0gMDsgaSA8IG51bUFQaW5NYXhTaWRlQXJlYUNhcl87IGkrKykgewotICAgIGlmIChBUGluTWF4U2lkZUFyZWFDYXJMYXllcl9baV0pCi0gICAgICAgZnJlZShBUGluTWF4U2lkZUFyZWFDYXJMYXllcl9baV0pOwotICB9Ci0gIG51bUFQaW5NYXhTaWRlQXJlYUNhcl8gPSAwOwotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1BUGluTWF4Q3V0Q2FyXzsgaSsrKSB7Ci0gICAgaWYgKEFQaW5NYXhDdXRDYXJMYXllcl9baV0pCi0gICAgICAgZnJlZShBUGluTWF4Q3V0Q2FyTGF5ZXJfW2ldKTsKLSAgfQotICBudW1BUGluTWF4Q3V0Q2FyXyA9IDA7Ci19Ci0KLXZvaWQgZGVmaVBpbkFudGVubmFNb2RlbDo6RGVzdHJveSgpIHsKLSAgY2xlYXIoKTsKLSAgaWYgKEFQaW5HYXRlQXJlYV8pCi0gICAgIGZyZWUoKGNoYXIqKShBUGluR2F0ZUFyZWFfKSk7Ci0gIGlmIChBUGluR2F0ZUFyZWFMYXllcl8pCi0gICAgIGZyZWUoKGNoYXIqKShBUGluR2F0ZUFyZWFMYXllcl8pKTsKLSAgaWYgKEFQaW5NYXhBcmVhQ2FyXykKLSAgICAgZnJlZSgoY2hhciopKEFQaW5NYXhBcmVhQ2FyXykpOwotICBpZiAoQVBpbk1heEFyZWFDYXJMYXllcl8pCi0gICAgIGZyZWUoKGNoYXIqKShBUGluTWF4QXJlYUNhckxheWVyXykpOwotICBpZiAoQVBpbk1heFNpZGVBcmVhQ2FyXykKLSAgICAgZnJlZSgoY2hhciopKEFQaW5NYXhTaWRlQXJlYUNhcl8pKTsKLSAgaWYgKEFQaW5NYXhTaWRlQXJlYUNhckxheWVyXykKLSAgICAgZnJlZSgoY2hhciopKEFQaW5NYXhTaWRlQXJlYUNhckxheWVyXykpOwotICBpZiAoQVBpbk1heEN1dENhcl8pCi0gICAgIGZyZWUoKGNoYXIqKShBUGluTWF4Q3V0Q2FyXykpOwotICBpZiAoQVBpbk1heEN1dENhckxheWVyXykKLSAgICAgZnJlZSgoY2hhciopKEFQaW5NYXhDdXRDYXJMYXllcl8pKTsKLX0KLQotLy8gNS41Ci12b2lkIGRlZmlQaW5BbnRlbm5hTW9kZWw6OnNldEFudGVubmFNb2RlbChpbnQgYU94aWRlKSB7Ci0gIHN3aXRjaCAoYU94aWRlKSB7Ci0gICAgIGNhc2UgMjoKLSAgICAgICAgICAgb3hpZGVfID0gc3RyZHVwKCJPWElERTIiKTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgIGNhc2UgMzoKLSAgICAgICAgICAgb3hpZGVfID0gc3RyZHVwKCJPWElERTMiKTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgIGNhc2UgNDoKLSAgICAgICAgICAgb3hpZGVfID0gc3RyZHVwKCJPWElERTQiKTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgIG94aWRlXyA9IHN0cmR1cCgiT1hJREUxIik7Ci0gICAgICAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgZGVmaVBpbkFudGVubmFNb2RlbDo6YWRkQVBpbkdhdGVBcmVhKGludCB2YWx1ZSwgY29uc3QgY2hhciogbGF5ZXIpIHsKLSAgaWYgKG51bUFQaW5HYXRlQXJlYV8gPT0gQVBpbkdhdGVBcmVhQWxsb2NhdGVkXykgewotICAgICBpbnQgaTsKLSAgICAgaW50IG1heDsKLSAgICAgaW50IGxpbSA9IG51bUFQaW5HYXRlQXJlYV87Ci0gICAgIGludCogbmQ7Ci0gICAgIGNoYXIqKiAgbmw7Ci0KLSAgICAgaWYgKEFQaW5HYXRlQXJlYUFsbG9jYXRlZF8gPT0gMCkKLSAgICAgICAgbWF4ID0gQVBpbkdhdGVBcmVhQWxsb2NhdGVkXyA9IDI7Ci0gICAgIGVsc2UKLSAgICAgICAgbWF4ID0gQVBpbkdhdGVBcmVhQWxsb2NhdGVkXyAqPSAyOwotICAgICBuZCA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSptYXgpOwotICAgICBubCA9IChjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikqbWF4KTsKLSAgICAgZm9yIChpID0gMDsgaSA8IGxpbTsgaSsrKSB7Ci0gICAgICAgIG5kW2ldID0gQVBpbkdhdGVBcmVhX1tpXTsKLSAgICAgICAgbmxbaV0gPSBBUGluR2F0ZUFyZWFMYXllcl9baV07Ci0gICAgIH0KLSAgICAgZnJlZSgoY2hhciopKEFQaW5HYXRlQXJlYV8pKTsKLSAgICAgZnJlZSgoY2hhciopKEFQaW5HYXRlQXJlYUxheWVyXykpOwotICAgICBBUGluR2F0ZUFyZWFfID0gbmQ7Ci0gICAgIEFQaW5HYXRlQXJlYUxheWVyXyA9IG5sOwotCi0gIH0KLSAgQVBpbkdhdGVBcmVhX1tudW1BUGluR2F0ZUFyZWFfXSA9IHZhbHVlOwotICBpZiAobGF5ZXIpIHsKLSAgICBBUGluR2F0ZUFyZWFMYXllcl9bbnVtQVBpbkdhdGVBcmVhX10gPQotICAgICAgIChjaGFyKiltYWxsb2Moc3RybGVuKGxheWVyKSsxKTsKLSAgICBzdHJjcHkoQVBpbkdhdGVBcmVhTGF5ZXJfW251bUFQaW5HYXRlQXJlYV9dLAotICAgICAgIGRlZkRhdGEtPkRFRkNBU0UobGF5ZXIpKTsKLSAgfSBlbHNlCi0gICAgQVBpbkdhdGVBcmVhTGF5ZXJfW251bUFQaW5HYXRlQXJlYV9dID0gTlVMTDsKLSAgbnVtQVBpbkdhdGVBcmVhXyArPSAxOwotfQotCi12b2lkIGRlZmlQaW5BbnRlbm5hTW9kZWw6OmFkZEFQaW5NYXhBcmVhQ2FyKGludCB2YWx1ZSwgY29uc3QgY2hhciogbGF5ZXIpIHsKLSAgaWYgKG51bUFQaW5NYXhBcmVhQ2FyXyA9PSBBUGluTWF4QXJlYUNhckFsbG9jYXRlZF8pIHsKLSAgICAgaW50IGk7Ci0gICAgIGludCBtYXg7Ci0gICAgIGludCBsaW0gPSBudW1BUGluTWF4QXJlYUNhcl87Ci0gICAgIGludCogbmQ7Ci0gICAgIGNoYXIqKiAgbmw7Ci0KLSAgICAgaWYgKEFQaW5NYXhBcmVhQ2FyQWxsb2NhdGVkXyA9PSAwKQotICAgICAgICBtYXggPSBBUGluTWF4QXJlYUNhckFsbG9jYXRlZF8gPSAyOwotICAgICBlbHNlCi0gICAgICAgIG1heCA9IEFQaW5NYXhBcmVhQ2FyQWxsb2NhdGVkXyAqPSAyOwotICAgICBuZCA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSptYXgpOwotICAgICBubCA9IChjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikqbWF4KTsKLSAgICAgZm9yIChpID0gMDsgaSA8IGxpbTsgaSsrKSB7Ci0gICAgICAgIG5kW2ldID0gQVBpbk1heEFyZWFDYXJfW2ldOwotICAgICAgICBubFtpXSA9IEFQaW5NYXhBcmVhQ2FyTGF5ZXJfW2ldOwotICAgICB9Ci0gICAgIGZyZWUoKGNoYXIqKShBUGluTWF4QXJlYUNhcl8pKTsKLSAgICAgZnJlZSgoY2hhciopKEFQaW5NYXhBcmVhQ2FyTGF5ZXJfKSk7Ci0gICAgIEFQaW5NYXhBcmVhQ2FyXyA9IG5kOwotICAgICBBUGluTWF4QXJlYUNhckxheWVyXyA9IG5sOwotCi0gIH0KLSAgQVBpbk1heEFyZWFDYXJfW251bUFQaW5NYXhBcmVhQ2FyX10gPSB2YWx1ZTsKLSAgaWYgKGxheWVyKSB7Ci0gICAgQVBpbk1heEFyZWFDYXJMYXllcl9bbnVtQVBpbk1heEFyZWFDYXJfXSA9Ci0gICAgICAgKGNoYXIqKW1hbGxvYyhzdHJsZW4obGF5ZXIpKzEpOwotICAgIHN0cmNweShBUGluTWF4QXJlYUNhckxheWVyX1tudW1BUGluTWF4QXJlYUNhcl9dLAotICAgICAgIGRlZkRhdGEtPkRFRkNBU0UobGF5ZXIpKTsKLSAgfSBlbHNlCi0gICAgQVBpbk1heEFyZWFDYXJMYXllcl9bbnVtQVBpbk1heEFyZWFDYXJfXSA9IE5VTEw7Ci0gIG51bUFQaW5NYXhBcmVhQ2FyXyArPSAxOwotfQotCi12b2lkIGRlZmlQaW5BbnRlbm5hTW9kZWw6OmFkZEFQaW5NYXhTaWRlQXJlYUNhcihpbnQgdmFsdWUsIGNvbnN0IGNoYXIqIGxheWVyKSB7Ci0gIGlmIChudW1BUGluTWF4U2lkZUFyZWFDYXJfID09IEFQaW5NYXhTaWRlQXJlYUNhckFsbG9jYXRlZF8pIHsKLSAgICAgaW50IGk7Ci0gICAgIGludCBtYXg7Ci0gICAgIGludCBsaW0gPSBudW1BUGluTWF4U2lkZUFyZWFDYXJfOwotICAgICBpbnQqIG5kOwotICAgICBjaGFyKiogIG5sOwotCi0gICAgIGlmIChBUGluTWF4U2lkZUFyZWFDYXJBbGxvY2F0ZWRfID09IDApCi0gICAgICAgIG1heCA9IEFQaW5NYXhTaWRlQXJlYUNhckFsbG9jYXRlZF8gPSAyOwotICAgICBlbHNlCi0gICAgICAgIG1heCA9IEFQaW5NYXhTaWRlQXJlYUNhckFsbG9jYXRlZF8gKj0gMjsKLSAgICAgbmQgPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkqbWF4KTsKLSAgICAgbmwgPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKm1heCk7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBsaW07IGkrKykgewotICAgICAgICBuZFtpXSA9IEFQaW5NYXhTaWRlQXJlYUNhcl9baV07Ci0gICAgICAgIG5sW2ldID0gQVBpbk1heFNpZGVBcmVhQ2FyTGF5ZXJfW2ldOwotICAgICB9Ci0gICAgIGZyZWUoKGNoYXIqKShBUGluTWF4U2lkZUFyZWFDYXJfKSk7Ci0gICAgIGZyZWUoKGNoYXIqKShBUGluTWF4U2lkZUFyZWFDYXJMYXllcl8pKTsKLSAgICAgQVBpbk1heFNpZGVBcmVhQ2FyXyA9IG5kOwotICAgICBBUGluTWF4U2lkZUFyZWFDYXJMYXllcl8gPSBubDsKLQotICB9Ci0gIEFQaW5NYXhTaWRlQXJlYUNhcl9bbnVtQVBpbk1heFNpZGVBcmVhQ2FyX10gPSB2YWx1ZTsKLSAgaWYgKGxheWVyKSB7Ci0gICAgQVBpbk1heFNpZGVBcmVhQ2FyTGF5ZXJfW251bUFQaW5NYXhTaWRlQXJlYUNhcl9dID0KLSAgICAgICAoY2hhciopbWFsbG9jKHN0cmxlbihsYXllcikrMSk7Ci0gICAgc3RyY3B5KEFQaW5NYXhTaWRlQXJlYUNhckxheWVyX1tudW1BUGluTWF4U2lkZUFyZWFDYXJfXSwKLSAgICAgICBkZWZEYXRhLT5ERUZDQVNFKGxheWVyKSk7Ci0gIH0gZWxzZQotICAgIEFQaW5NYXhTaWRlQXJlYUNhckxheWVyX1tudW1BUGluTWF4U2lkZUFyZWFDYXJfXSA9IE5VTEw7Ci0gIG51bUFQaW5NYXhTaWRlQXJlYUNhcl8gKz0gMTsKLX0KLQotdm9pZCBkZWZpUGluQW50ZW5uYU1vZGVsOjphZGRBUGluTWF4Q3V0Q2FyKGludCB2YWx1ZSwgY29uc3QgY2hhciogbGF5ZXIpIHsKLSAgaWYgKG51bUFQaW5NYXhDdXRDYXJfID09IEFQaW5NYXhDdXRDYXJBbGxvY2F0ZWRfKSB7Ci0gICAgIGludCBpOwotICAgICBpbnQgbWF4OwotICAgICBpbnQgbGltID0gbnVtQVBpbk1heEN1dENhcl87Ci0gICAgIGludCogbmQ7Ci0gICAgIGNoYXIqKiAgbmw7Ci0KLSAgICAgaWYgKEFQaW5NYXhDdXRDYXJBbGxvY2F0ZWRfID09IDApCi0gICAgICAgIG1heCA9IEFQaW5NYXhDdXRDYXJBbGxvY2F0ZWRfID0gMjsKLSAgICAgZWxzZQotICAgICAgICBtYXggPSBBUGluTWF4Q3V0Q2FyQWxsb2NhdGVkXyAqPSAyOwotICAgICBuZCA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSptYXgpOwotICAgICBubCA9IChjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikqbWF4KTsKLSAgICAgZm9yIChpID0gMDsgaSA8IGxpbTsgaSsrKSB7Ci0gICAgICAgIG5kW2ldID0gQVBpbk1heEN1dENhcl9baV07Ci0gICAgICAgIG5sW2ldID0gQVBpbk1heEN1dENhckxheWVyX1tpXTsKLSAgICAgfQotICAgICBmcmVlKChjaGFyKikoQVBpbk1heEN1dENhcl8pKTsKLSAgICAgZnJlZSgoY2hhciopKEFQaW5NYXhDdXRDYXJMYXllcl8pKTsKLSAgICAgQVBpbk1heEN1dENhcl8gPSBuZDsKLSAgICAgQVBpbk1heEN1dENhckxheWVyXyA9IG5sOwotCi0gIH0KLSAgQVBpbk1heEN1dENhcl9bbnVtQVBpbk1heEN1dENhcl9dID0gdmFsdWU7Ci0gIGlmIChsYXllcikgewotICAgIEFQaW5NYXhDdXRDYXJMYXllcl9bbnVtQVBpbk1heEN1dENhcl9dID0KLSAgICAgICAoY2hhciopbWFsbG9jKHN0cmxlbihsYXllcikrMSk7Ci0gICAgc3RyY3B5KEFQaW5NYXhDdXRDYXJMYXllcl9bbnVtQVBpbk1heEN1dENhcl9dLAotICAgICAgIGRlZkRhdGEtPkRFRkNBU0UobGF5ZXIpKTsKLSAgfSBlbHNlCi0gICAgQVBpbk1heEN1dENhckxheWVyX1tudW1BUGluTWF4Q3V0Q2FyX10gPSBOVUxMOwotICBudW1BUGluTWF4Q3V0Q2FyXyArPSAxOwotfQotCi0vLyA1LjUKLWNoYXIqIGRlZmlQaW5BbnRlbm5hTW9kZWw6OmFudGVubmFPeGlkZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG94aWRlXzsKLX0KLQotaW50IGRlZmlQaW5BbnRlbm5hTW9kZWw6Omhhc0FQaW5HYXRlQXJlYSgpIGNvbnN0IHsKLSAgcmV0dXJuIG51bUFQaW5HYXRlQXJlYV8gPyAxIDogMCA7Ci19Ci0KLWludCBkZWZpUGluQW50ZW5uYU1vZGVsOjpoYXNBUGluTWF4QXJlYUNhcigpIGNvbnN0IHsKLSAgcmV0dXJuIG51bUFQaW5NYXhBcmVhQ2FyXyA/IDEgOiAwIDsKLX0KLQotaW50IGRlZmlQaW5BbnRlbm5hTW9kZWw6Omhhc0FQaW5NYXhTaWRlQXJlYUNhcigpIGNvbnN0IHsKLSAgcmV0dXJuIG51bUFQaW5NYXhTaWRlQXJlYUNhcl8gPyAxIDogMCA7Ci19Ci0KLWludCBkZWZpUGluQW50ZW5uYU1vZGVsOjpoYXNBUGluTWF4Q3V0Q2FyKCkgY29uc3QgewotICByZXR1cm4gbnVtQVBpbk1heEN1dENhcl8gPyAxIDogMCA7Ci19Ci0KLWludCBkZWZpUGluQW50ZW5uYU1vZGVsOjpudW1BUGluR2F0ZUFyZWEoKSBjb25zdCB7Ci0gIHJldHVybiBudW1BUGluR2F0ZUFyZWFfOwotfQotCi1pbnQgZGVmaVBpbkFudGVubmFNb2RlbDo6bnVtQVBpbk1heEFyZWFDYXIoKSBjb25zdCB7Ci0gIHJldHVybiBudW1BUGluTWF4QXJlYUNhcl87Ci19Ci0KLWludCBkZWZpUGluQW50ZW5uYU1vZGVsOjpudW1BUGluTWF4U2lkZUFyZWFDYXIoKSBjb25zdCB7Ci0gIHJldHVybiBudW1BUGluTWF4U2lkZUFyZWFDYXJfOwotfQotCi1pbnQgZGVmaVBpbkFudGVubmFNb2RlbDo6bnVtQVBpbk1heEN1dENhcigpIGNvbnN0IHsKLSAgcmV0dXJuIG51bUFQaW5NYXhDdXRDYXJfOwotfQotCi1pbnQgZGVmaVBpbkFudGVubmFNb2RlbDo6QVBpbkdhdGVBcmVhKGludCBpKSBjb25zdCB7Ci0gIHJldHVybiBBUGluR2F0ZUFyZWFfW2ldOwotfQotCi1pbnQgZGVmaVBpbkFudGVubmFNb2RlbDo6aGFzQVBpbkdhdGVBcmVhTGF5ZXIoaW50IGkpIGNvbnN0IHsKLSAgcmV0dXJuIChBUGluR2F0ZUFyZWFMYXllcl9baV0gJiYgKihBUGluR2F0ZUFyZWFMYXllcl9baV0pKSA/Ci0gICAgICAgICAgMSA6IDA7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlQaW5BbnRlbm5hTW9kZWw6OkFQaW5HYXRlQXJlYUxheWVyKGludCBpKSBjb25zdCB7Ci0gIHJldHVybiBBUGluR2F0ZUFyZWFMYXllcl9baV07Ci19Ci0KLWludCBkZWZpUGluQW50ZW5uYU1vZGVsOjpBUGluTWF4QXJlYUNhcihpbnQgaSkgY29uc3QgewotICByZXR1cm4gQVBpbk1heEFyZWFDYXJfW2ldOwotfQotCi1pbnQgZGVmaVBpbkFudGVubmFNb2RlbDo6aGFzQVBpbk1heEFyZWFDYXJMYXllcihpbnQgaSkgY29uc3QgewotICByZXR1cm4gKEFQaW5NYXhBcmVhQ2FyTGF5ZXJfW2ldICYmICooQVBpbk1heEFyZWFDYXJMYXllcl9baV0pKSA/Ci0gICAgICAgICAgMSA6IDA7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlQaW5BbnRlbm5hTW9kZWw6OkFQaW5NYXhBcmVhQ2FyTGF5ZXIoaW50IGkpIGNvbnN0IHsKLSAgcmV0dXJuIEFQaW5NYXhBcmVhQ2FyTGF5ZXJfW2ldOwotfQotCi1pbnQgZGVmaVBpbkFudGVubmFNb2RlbDo6QVBpbk1heFNpZGVBcmVhQ2FyKGludCBpKSBjb25zdCB7Ci0gIHJldHVybiBBUGluTWF4U2lkZUFyZWFDYXJfW2ldOwotfQotCi1pbnQgZGVmaVBpbkFudGVubmFNb2RlbDo6aGFzQVBpbk1heFNpZGVBcmVhQ2FyTGF5ZXIoaW50IGkpIGNvbnN0IHsKLSAgcmV0dXJuIChBUGluTWF4U2lkZUFyZWFDYXJMYXllcl9baV0gJiYKLSAgICAgICAgICAqKEFQaW5NYXhTaWRlQXJlYUNhckxheWVyX1tpXSkpID8gMSA6IDA7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlQaW5BbnRlbm5hTW9kZWw6OkFQaW5NYXhTaWRlQXJlYUNhckxheWVyKGludCBpKSBjb25zdCB7Ci0gIHJldHVybiBBUGluTWF4U2lkZUFyZWFDYXJMYXllcl9baV07Ci19Ci0KLWludCBkZWZpUGluQW50ZW5uYU1vZGVsOjpBUGluTWF4Q3V0Q2FyKGludCBpKSBjb25zdCB7Ci0gIHJldHVybiBBUGluTWF4Q3V0Q2FyX1tpXTsKLX0KLQotaW50IGRlZmlQaW5BbnRlbm5hTW9kZWw6Omhhc0FQaW5NYXhDdXRDYXJMYXllcihpbnQgaSkgY29uc3QgewotICByZXR1cm4gKEFQaW5NYXhDdXRDYXJMYXllcl9baV0gJiYKLSAgICAgICAgICAqKEFQaW5NYXhDdXRDYXJMYXllcl9baV0pKSA/IDEgOiAwOwotfQotCi1jb25zdCBjaGFyKiBkZWZpUGluQW50ZW5uYU1vZGVsOjpBUGluTWF4Q3V0Q2FyTGF5ZXIoaW50IGkpIGNvbnN0IHsKLSAgcmV0dXJuIEFQaW5NYXhDdXRDYXJMYXllcl9baV07Ci19Ci0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gICAgIGRlZmlQaW5Qb3J0Ci0vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLWRlZmlQaW5Qb3J0OjpkZWZpUGluUG9ydChkZWZyRGF0YSAqZGF0YSkKLTogZGVmRGF0YShkYXRhKQotewotICBJbml0KCk7Ci19Ci0KLXZvaWQgZGVmaVBpblBvcnQ6OkluaXQoKSB7Ci0gIGxheWVyc0FsbG9jYXRlZF8gPSAwOwotICBudW1MYXllcnNfID0gMDsKLSAgbGF5ZXJzXyA9IDA7Ci0gIGxheWVyTWluU3BhY2luZ18gPSAwOwotICBsYXllck1hc2tfID0gMDsKLSAgbGF5ZXJFZmZlY3RpdmVXaWR0aF8gPSAwOwotICB4bF8gPSAwOwotICB5bF8gPSAwOwotICB4aF8gPSAwOwotICB5aF8gPSAwOwotICBwb2x5c0FsbG9jYXRlZF8gPSAwOwotICBudW1Qb2x5c18gPSAwOwotICBwb2x5Z29uTmFtZXNfID0gMDsKLSAgcG9seU1pblNwYWNpbmdfID0gMDsKLSAgcG9seU1hc2tfID0gMDsKLSAgcG9seUVmZmVjdGl2ZVdpZHRoXyA9IDA7Ci0gIHBvbHlnb25zXyA9IDA7Ci0gIHZpYXNBbGxvY2F0ZWRfID0gMDsKLSAgbnVtVmlhc18gPSAwOwotICB2aWFOYW1lc18gPSAwOwotICB2aWFYXyA9IDA7Ci0gIHZpYVlfID0gMDsKLSAgdmlhTWFza18gPSAwOwotICBwbGFjZVR5cGVfID0gMDsKLSAgeF8gPSAwOwotICAgeV8gPSAwOwotICBvcmllbnRfID0gMDsKLX0KLQotZGVmaVBpblBvcnQ6On5kZWZpUGluUG9ydCgpIHsKLSAgY2xlYXIoKTsKLX0KLQotdm9pZCBkZWZpUGluUG9ydDo6Y2xlYXIoKSB7Ci0gIGludCBpOwotCi0gIHBsYWNlVHlwZV8gPSAwOwotICBvcmllbnRfID0gMDsKLSAgeF8gPSAwOwotICB5XyA9IDA7Ci0KLSAgaWYgKGxheWVyc18pIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTGF5ZXJzXzsgaSsrKQotICAgICAgaWYgKGxheWVyc19baV0pIGZyZWUobGF5ZXJzX1tpXSk7Ci0gICAgZnJlZSgoY2hhciopKGxheWVyc18pKTsKLSAgICBmcmVlKChjaGFyKikoeGxfKSk7Ci0gICAgZnJlZSgoY2hhciopKHlsXykpOwotICAgIGZyZWUoKGNoYXIqKSh4aF8pKTsKLSAgICBmcmVlKChjaGFyKikoeWhfKSk7Ci0gICAgZnJlZSgoY2hhciopKGxheWVyTWluU3BhY2luZ18pKTsKLSAgICBmcmVlKChjaGFyKikobGF5ZXJNYXNrXykpOwotICAgIGZyZWUoKGNoYXIqKShsYXllckVmZmVjdGl2ZVdpZHRoXykpOwotICB9Ci0gIGxheWVyc18gPSAwOwotICBsYXllck1pblNwYWNpbmdfID0gMDsKLSAgbGF5ZXJFZmZlY3RpdmVXaWR0aF8gPSAwOwotICBsYXllck1hc2tfID0gMDsKLSAgbnVtTGF5ZXJzXyA9IDA7Ci0gIGxheWVyc0FsbG9jYXRlZF8gPSAwOwotICBpZiAocG9seWdvbk5hbWVzXykgewotICAgIHN0cnVjdCBkZWZpUG9pbnRzKiBwOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1Qb2x5c187IGkrKykgewotICAgICAgaWYgKHBvbHlnb25OYW1lc19baV0pIGZyZWUoKGNoYXIqKShwb2x5Z29uTmFtZXNfW2ldKSk7Ci0gICAgICBwID0gcG9seWdvbnNfW2ldOwotICAgICAgZnJlZSgoY2hhciopKHAtPngpKTsKLSAgICAgIGZyZWUoKGNoYXIqKShwLT55KSk7Ci0gICAgICBmcmVlKChjaGFyKikocG9seWdvbnNfW2ldKSk7Ci0gICAgfQotICAgIGZyZWUoKGNoYXIqKShwb2x5Z29uTmFtZXNfKSk7Ci0gICAgZnJlZSgoY2hhciopKHBvbHlnb25zXykpOwotICAgIGZyZWUoKGNoYXIqKShwb2x5TWluU3BhY2luZ18pKTsKLSAgICBmcmVlKChjaGFyKikocG9seU1hc2tfKSk7Ci0gICAgZnJlZSgoY2hhciopKHBvbHlFZmZlY3RpdmVXaWR0aF8pKTsKLSAgICBwb2x5Z29uTmFtZXNfID0gMDsKLSAgICBwb2x5Z29uc18gPSAwOwotICAgIHBvbHlNaW5TcGFjaW5nXyA9IDA7Ci0gICAgcG9seUVmZmVjdGl2ZVdpZHRoXyA9IDA7Ci0gICAgcG9seU1hc2tfID0gMDsKLSAgfQotICBudW1Qb2x5c18gPSAwOwotICBwb2x5c0FsbG9jYXRlZF8gPSAwOwotICBpZiAodmlhTmFtZXNfKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bVZpYXNfOyBpKyspCi0gICAgICBpZiAodmlhTmFtZXNfW2ldKSBmcmVlKHZpYU5hbWVzX1tpXSk7Ci0gICAgZnJlZSgoY2hhciopKHZpYU5hbWVzXykpOwotICAgIGZyZWUoKGNoYXIqKSh2aWFYXykpOwotICAgIGZyZWUoKGNoYXIqKSh2aWFZXykpOwotICAgIGZyZWUoKGNoYXIqKSh2aWFNYXNrXykpOwotICB9Ci0gIHZpYU5hbWVzXyA9IDA7Ci0gIG51bVZpYXNfID0gMDsKLSAgdmlhc0FsbG9jYXRlZF8gPSAwOwotICB2aWFNYXNrXyA9IDA7Ci19Ci0KLXZvaWQgZGVmaVBpblBvcnQ6OmFkZExheWVyKGNvbnN0IGNoYXIqIGxheWVyKSB7Ci0gIGlmIChudW1MYXllcnNfID49IGxheWVyc0FsbG9jYXRlZF8pIHsKLSAgICBpbnQgaTsKLSAgICBjaGFyKiogbmV3bDsKLSAgICBpbnQgKm54bCwgKm55bCwgKm54aCwgKm55aDsKLSAgICBpbnQgKmxtcywgKmxldywgKmxtOwotCi0gICAgbGF5ZXJzQWxsb2NhdGVkXyA9IGxheWVyc0FsbG9jYXRlZF8gPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcnNBbGxvY2F0ZWRfICogMiA6IDg7Ci0gICAgbmV3bCA9IChjaGFyKiopbWFsbG9jKGxheWVyc0FsbG9jYXRlZF8gKiBzaXplb2YoY2hhciopKTsKLSAgICBueGwgPSAoaW50KiltYWxsb2MobGF5ZXJzQWxsb2NhdGVkXyAqIHNpemVvZihpbnQpKTsKLSAgICBueWwgPSAoaW50KiltYWxsb2MobGF5ZXJzQWxsb2NhdGVkXyAqIHNpemVvZihpbnQpKTsKLSAgICBueGggPSAoaW50KiltYWxsb2MobGF5ZXJzQWxsb2NhdGVkXyAqIHNpemVvZihpbnQpKTsKLSAgICBueWggPSAoaW50KiltYWxsb2MobGF5ZXJzQWxsb2NhdGVkXyAqIHNpemVvZihpbnQpKTsKLSAgICBsbXMgPSAoaW50KiltYWxsb2MobGF5ZXJzQWxsb2NhdGVkXyAqIHNpemVvZihpbnQpKTsKLSAgICBsZXcgPSAoaW50KiltYWxsb2MobGF5ZXJzQWxsb2NhdGVkXyAqIHNpemVvZihpbnQpKTsKLSAgICBsbSA9IChpbnQqKW1hbGxvYyhsYXllcnNBbGxvY2F0ZWRfICogc2l6ZW9mKGludCkpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG51bUxheWVyc187IGkrKykgewotICAgICAgIG5ld2xbaV0gPSBsYXllcnNfW2ldOwotICAgICAgIG54bFtpXSA9IHhsX1tpXTsKLSAgICAgICBueWxbaV0gPSB5bF9baV07Ci0gICAgICAgbnhoW2ldID0geGhfW2ldOwotICAgICAgIG55aFtpXSA9IHloX1tpXTsKLSAgICAgICBsbXNbaV0gPSBsYXllck1pblNwYWNpbmdfW2ldOwotICAgICAgIGxld1tpXSA9IGxheWVyRWZmZWN0aXZlV2lkdGhfW2ldOwotICAgICAgIGxtW2ldID0gbGF5ZXJNYXNrX1tpXTsKLSAgICB9Ci0gICAgaWYgKG51bUxheWVyc18gPiAwKSB7Ci0gICAgICAgZnJlZSgoY2hhciopbGF5ZXJzXyk7Ci0gICAgICAgZnJlZSgoY2hhciopeGxfKTsKLSAgICAgICBmcmVlKChjaGFyKil5bF8pOwotICAgICAgIGZyZWUoKGNoYXIqKXhoXyk7Ci0gICAgICAgZnJlZSgoY2hhciopeWhfKTsKLSAgICAgICBmcmVlKChjaGFyKilsYXllck1pblNwYWNpbmdfKTsKLSAgICAgICBmcmVlKChjaGFyKilsYXllckVmZmVjdGl2ZVdpZHRoXyk7Ci0gICAgICAgZnJlZSgoY2hhciopbGF5ZXJNYXNrXyk7Ci0gICAgfQotICAgIGxheWVyc18gPSBuZXdsOwotICAgIHhsXyA9IG54bDsKLSAgICB5bF8gPSBueWw7Ci0gICAgeGhfID0gbnhoOwotICAgIHloXyA9IG55aDsKLSAgICBsYXllck1pblNwYWNpbmdfID0gbG1zOwotICAgIGxheWVyRWZmZWN0aXZlV2lkdGhfID0gbGV3OwotICAgIGxheWVyTWFza18gPSBsbTsKLSAgfQotICBsYXllcnNfW251bUxheWVyc19dID0gKGNoYXIqKW1hbGxvYyhzdHJsZW4obGF5ZXIpKzEpOwotICBzdHJjcHkobGF5ZXJzX1tudW1MYXllcnNfXSwgZGVmRGF0YS0+REVGQ0FTRShsYXllcikpOwotICB4bF9bbnVtTGF5ZXJzX10gPSAwOwotICB5bF9bbnVtTGF5ZXJzX10gPSAwOwotICB4aF9bbnVtTGF5ZXJzX10gPSAwOwotICB5aF9bbnVtTGF5ZXJzX10gPSAwOwotICBsYXllck1pblNwYWNpbmdfW251bUxheWVyc19dID0gLTE7Ci0gIGxheWVyRWZmZWN0aXZlV2lkdGhfW251bUxheWVyc19dID0gLTE7Ci0gIGxheWVyTWFza19bbnVtTGF5ZXJzX10gPSAwOwotICBudW1MYXllcnNfICs9IDE7Ci19Ci0KLXZvaWQgZGVmaVBpblBvcnQ6OmFkZExheWVyU3BhY2luZyhpbnQgbWluU3BhY2luZykgewotICBsYXllck1pblNwYWNpbmdfW251bUxheWVyc18tMV0gPSBtaW5TcGFjaW5nOwotfQotCi12b2lkIGRlZmlQaW5Qb3J0OjphZGRMYXllck1hc2soaW50IG1hc2spIHsKLSAgbGF5ZXJNYXNrX1tudW1MYXllcnNfLTFdID0gbWFzazsKLX0KLQotdm9pZCBkZWZpUGluUG9ydDo6YWRkTGF5ZXJEZXNpZ25SdWxlV2lkdGgoaW50IGVmZmVjdGl2ZVdpZHRoKSB7Ci0gIGxheWVyRWZmZWN0aXZlV2lkdGhfW251bUxheWVyc18tMV0gPSBlZmZlY3RpdmVXaWR0aDsKLX0KLQotdm9pZCBkZWZpUGluUG9ydDo6YWRkTGF5ZXJQdHMoaW50IHhsLCBpbnQgeWwsIGludCB4aCwgaW50IHloKSB7Ci0gIHhsX1tudW1MYXllcnNfLTFdID0geGw7Ci0gIHlsX1tudW1MYXllcnNfLTFdID0geWw7Ci0gIHhoX1tudW1MYXllcnNfLTFdID0geGg7Ci0gIHloX1tudW1MYXllcnNfLTFdID0geWg7Ci19Ci0KLXZvaWQgZGVmaVBpblBvcnQ6OmFkZFBvbHlnb24oY29uc3QgY2hhciogbGF5ZXJOYW1lKSB7Ci0gIGludCAqcG1zLCAqcGR3LCAqcG07Ci0gIGludCBpOwotCi0gIGlmIChudW1Qb2x5c18gPT0gcG9seXNBbGxvY2F0ZWRfKSB7Ci0gICAgY2hhcioqIG5ld247Ci0gICAgc3RydWN0IGRlZmlQb2ludHMqKiBwb2x5OwotICAgIHBvbHlzQWxsb2NhdGVkXyA9IChwb2x5c0FsbG9jYXRlZF8gPT0gMCkgPwotICAgICAgICAgIDIgOiBwb2x5c0FsbG9jYXRlZF8gKiAyOwotICAgIG5ld24gPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopICogcG9seXNBbGxvY2F0ZWRfKTsKLSAgICBwb2x5ID0gKHN0cnVjdCBkZWZpUG9pbnRzKiopbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGVmaVBvaW50cyopICoKLSAgICAgICAgICAgIHBvbHlzQWxsb2NhdGVkXyk7Ci0gICAgcG1zID0gKGludCopbWFsbG9jKHBvbHlzQWxsb2NhdGVkXyAqIHNpemVvZihpbnQpKTsKLSAgICBwZHcgPSAoaW50KiltYWxsb2MocG9seXNBbGxvY2F0ZWRfICogc2l6ZW9mKGludCkpOwotICAgIHBtID0gKGludCopbWFsbG9jKHBvbHlzQWxsb2NhdGVkXyAqIHNpemVvZihpbnQpKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBudW1Qb2x5c187IGkrKykgewotICAgICAgbmV3bltpXSA9IHBvbHlnb25OYW1lc19baV07Ci0gICAgICBwb2x5W2ldID0gcG9seWdvbnNfW2ldOwotICAgICAgcG1zW2ldICA9IHBvbHlNaW5TcGFjaW5nX1tpXTsKLSAgICAgIHBkd1tpXSAgPSBwb2x5RWZmZWN0aXZlV2lkdGhfW2ldOwotICAgICAgcG1baV0gPSBwb2x5TWFza19baV07Ci0gICAgfQotICAgIGlmIChudW1Qb2x5c18gPiAwKSB7Ci0gICAgICBmcmVlKChjaGFyKikocG9seWdvbnNfKSk7Ci0gICAgICBmcmVlKChjaGFyKikocG9seWdvbk5hbWVzXykpOwotICAgICAgZnJlZSgoY2hhciopKHBvbHlNaW5TcGFjaW5nXykpOwotICAgICAgZnJlZSgoY2hhciopKHBvbHlFZmZlY3RpdmVXaWR0aF8pKTsKLSAgICAgIGZyZWUoKGNoYXIqKShwb2x5TWFza18pKTsKLSAgICB9Ci0gICAgcG9seWdvbk5hbWVzXyA9IG5ld247Ci0gICAgcG9seWdvbnNfID0gcG9seTsKLSAgICBwb2x5TWluU3BhY2luZ18gPSBwbXM7Ci0gICAgcG9seUVmZmVjdGl2ZVdpZHRoXyA9IHBkdzsKLSAgICBwb2x5TWFza18gPSBwbTsKLSAgfQotICBwb2x5Z29uTmFtZXNfW251bVBvbHlzX10gPSBzdHJkdXAobGF5ZXJOYW1lKTsKLSAgcG9seWdvbnNfW251bVBvbHlzX10gPSAwOwotICBwb2x5TWluU3BhY2luZ19bbnVtUG9seXNfXSA9IC0xOwotICBwb2x5RWZmZWN0aXZlV2lkdGhfW251bVBvbHlzX10gPSAtMTsKLSAgcG9seU1hc2tfW251bVBvbHlzX10gPSAwOwotICBudW1Qb2x5c18gKz0gMTsKLX0KLQotdm9pZCBkZWZpUGluUG9ydDo6YWRkUG9seVNwYWNpbmcoaW50IG1pblNwYWNpbmcpIHsKLSAgcG9seU1pblNwYWNpbmdfW251bVBvbHlzXy0xXSA9IG1pblNwYWNpbmc7Ci19Ci0KLXZvaWQgZGVmaVBpblBvcnQ6OmFkZFBvbHlNYXNrKGludCBjb2xvcikgewotICAgIHBvbHlNYXNrX1tudW1Qb2x5c18tMV0gPSBjb2xvcjsKLX0KLQotdm9pZCBkZWZpUGluUG9ydDo6YWRkUG9seURlc2lnblJ1bGVXaWR0aChpbnQgZWZmZWN0aXZlV2lkdGgpIHsKLSAgcG9seUVmZmVjdGl2ZVdpZHRoX1tudW1Qb2x5c18tMV0gPSBlZmZlY3RpdmVXaWR0aDsKLX0KLQotdm9pZCBkZWZpUGluUG9ydDo6YWRkUG9seWdvblB0cyhkZWZpR2VvbWV0cmllcyogZ2VvbSkgewotICBzdHJ1Y3QgZGVmaVBvaW50cyogcDsKLSAgaW50IHgsIHk7Ci0gIGludCBpOwotCi0gIHAgPSAoc3RydWN0IGRlZmlQb2ludHMqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGRlZmlQb2ludHMpKTsKLSAgcC0+bnVtUG9pbnRzID0gZ2VvbS0+bnVtUG9pbnRzKCk7Ci0gIHAtPnggPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkqcC0+bnVtUG9pbnRzKTsKLSAgcC0+eSA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSpwLT5udW1Qb2ludHMpOwotICBmb3IgKGkgPSAwOyBpIDwgcC0+bnVtUG9pbnRzOyBpKyspIHsKLSAgICBnZW9tLT5wb2ludHMoaSwgJngsICZ5KTsKLSAgICBwLT54W2ldID0geDsKLSAgICBwLT55W2ldID0geTsKLSAgfQotICBwb2x5Z29uc19bbnVtUG9seXNfLTFdID0gcDsKLX0KLQotCi12b2lkIGRlZmlQaW5Qb3J0OjphZGRWaWEoY29uc3QgY2hhciogdmlhTmFtZSwgaW50IHB0WCwgaW50IHB0WSwgaW50IGNvbG9yKSB7Ci0gIGlmIChudW1WaWFzXyA+PSB2aWFzQWxsb2NhdGVkXykgewotICAgIGludCBpOwotICAgIGNoYXIqKiBuZXdsOwotICAgIGludCAqbngsICpueSwgKm5tOwotCi0gICAgdmlhc0FsbG9jYXRlZF8gPSB2aWFzQWxsb2NhdGVkXyA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB2aWFzQWxsb2NhdGVkXyAqIDIgOiA4OwotICAgIG5ld2wgPSAoY2hhcioqKW1hbGxvYyh2aWFzQWxsb2NhdGVkXyAqIHNpemVvZihjaGFyKikpOwotICAgIG54ID0gKGludCopbWFsbG9jKHZpYXNBbGxvY2F0ZWRfICogc2l6ZW9mKGludCkpOwotICAgIG55ID0gKGludCopbWFsbG9jKHZpYXNBbGxvY2F0ZWRfICogc2l6ZW9mKGludCkpOwotICAgIG5tID0gKGludCopbWFsbG9jKHZpYXNBbGxvY2F0ZWRfICogc2l6ZW9mKGludCkpOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1WaWFzXzsgaSsrKSB7Ci0gICAgICAgbmV3bFtpXSA9IHZpYU5hbWVzX1tpXTsKLSAgICAgICBueFtpXSA9IHZpYVhfW2ldOwotICAgICAgIG55W2ldID0gdmlhWV9baV07Ci0gICAgICAgbm1baV0gPSB2aWFNYXNrX1tpXTsKLSAgICB9Ci0gICAgaWYgKG51bVZpYXNfID4gMCkgewotICAgICAgIGZyZWUoKGNoYXIqKXZpYU5hbWVzXyk7Ci0gICAgICAgZnJlZSgoY2hhciopdmlhWF8pOwotICAgICAgIGZyZWUoKGNoYXIqKXZpYVlfKTsKLSAgICAgICBmcmVlKChjaGFyKil2aWFNYXNrXyk7Ci0gICAgfQotICAgIHZpYU5hbWVzXyA9IG5ld2w7Ci0gICAgdmlhWF8gPSBueDsKLSAgICB2aWFZXyA9IG55OwotICAgIHZpYU1hc2tfID0gbm07Ci0gIH0KLSAgdmlhTmFtZXNfW251bVZpYXNfXSA9IChjaGFyKiltYWxsb2Moc3RybGVuKHZpYU5hbWUpKzEpOwotICBzdHJjcHkodmlhTmFtZXNfW251bVZpYXNfXSwgZGVmRGF0YS0+REVGQ0FTRSh2aWFOYW1lKSk7Ci0gIHZpYVhfW251bVZpYXNfXSA9IHB0WDsKLSAgdmlhWV9bbnVtVmlhc19dID0gcHRZOwotICB2aWFNYXNrX1tudW1WaWFzX10gPSBjb2xvcjsKLSAgbnVtVmlhc18gKz0gMTsKLX0KLQotdm9pZCBkZWZpUGluUG9ydDo6c2V0UGxhY2VtZW50KGludCB0eXAsIGludCB4LCBpbnQgeSwgaW50IG9yaWVudCkgewotICB4XyA9IHg7Ci0gIHlfID0geTsKLSAgb3JpZW50XyA9IG9yaWVudDsKLSAgcGxhY2VUeXBlXyA9IHR5cDsKLX0KLQotaW50IGRlZmlQaW5Qb3J0OjpudW1MYXllcigpIGNvbnN0IHsKLSAgcmV0dXJuIG51bUxheWVyc187Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlQaW5Qb3J0OjpsYXllcihpbnQgaW5kZXgpIGNvbnN0IHsKLSAgcmV0dXJuIGxheWVyc19baW5kZXhdOwotfQotCi12b2lkIGRlZmlQaW5Qb3J0Ojpib3VuZHMoaW50IGluZGV4LCBpbnQqIHhsLCBpbnQqIHlsLCBpbnQqIHhoLCBpbnQqIHloKSBjb25zdCB7Ci0gIGlmICh4bCkgKnhsID0geGxfW2luZGV4XTsKLSAgaWYgKHlsKSAqeWwgPSB5bF9baW5kZXhdOwotICBpZiAoeGgpICp4aCA9IHhoX1tpbmRleF07Ci0gIGlmICh5aCkgKnloID0geWhfW2luZGV4XTsKLX0KLQotaW50IGRlZmlQaW5Qb3J0OjpoYXNMYXllclNwYWNpbmcoaW50IGluZGV4KSBjb25zdHsKLSAgaWYgKGxheWVyTWluU3BhY2luZ19baW5kZXhdID09IC0xKQotICAgIHJldHVybiAwOwotICByZXR1cm4gMTsKLX0KLQotaW50IGRlZmlQaW5Qb3J0OjpoYXNMYXllckRlc2lnblJ1bGVXaWR0aChpbnQgaW5kZXgpIGNvbnN0ewotICBpZiAobGF5ZXJFZmZlY3RpdmVXaWR0aF9baW5kZXhdID09IC0xKQotICAgIHJldHVybiAwOwotICByZXR1cm4gMTsKLX0KLQotaW50IGRlZmlQaW5Qb3J0OjpsYXllclNwYWNpbmcoaW50IGluZGV4KSBjb25zdCB7Ci0gIHJldHVybiBsYXllck1pblNwYWNpbmdfW2luZGV4XTsKLX0KLQotaW50IGRlZmlQaW5Qb3J0OjpsYXllck1hc2soaW50IGluZGV4KSBjb25zdCB7Ci0gICAgcmV0dXJuIGxheWVyTWFza19baW5kZXhdOwotfQotCi1pbnQgZGVmaVBpblBvcnQ6OmxheWVyRGVzaWduUnVsZVdpZHRoKGludCBpbmRleCkgY29uc3QgewotICByZXR1cm4gbGF5ZXJFZmZlY3RpdmVXaWR0aF9baW5kZXhdOwotfQotCi1pbnQgZGVmaVBpblBvcnQ6Om51bVBvbHlnb25zKCkgY29uc3QgewotICByZXR1cm4gbnVtUG9seXNfOwotfQotCi1jb25zdCBjaGFyKiBkZWZpUGluUG9ydDo6cG9seWdvbk5hbWUoaW50IGluZGV4KSBjb25zdCB7Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBudW1Qb2x5c18pIHsKLSAgICBkZWZpRXJyb3IoMSwgMCwgImluZGV4IG91dCBvZiBib3VuZHMiLCBkZWZEYXRhKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gcG9seWdvbk5hbWVzX1tpbmRleF07Ci19Ci0KLXN0cnVjdCBkZWZpUG9pbnRzIGRlZmlQaW5Qb3J0OjpnZXRQb2x5Z29uKGludCBpbmRleCkgY29uc3QgewotICByZXR1cm4gKihwb2x5Z29uc19baW5kZXhdKTsKLX0KLQotaW50IGRlZmlQaW5Qb3J0OjpoYXNQb2x5Z29uU3BhY2luZyhpbnQgaW5kZXgpIGNvbnN0ewotICBpZiAocG9seU1pblNwYWNpbmdfW2luZGV4XSA9PSAtMSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIDE7Ci19Ci0KLWludCBkZWZpUGluUG9ydDo6aGFzUG9seWdvbkRlc2lnblJ1bGVXaWR0aChpbnQgaW5kZXgpIGNvbnN0ewotICBpZiAocG9seUVmZmVjdGl2ZVdpZHRoX1tpbmRleF0gPT0gLTEpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiAxOwotfQotCi1pbnQgZGVmaVBpblBvcnQ6OnBvbHlnb25TcGFjaW5nKGludCBpbmRleCkgY29uc3QgewotICByZXR1cm4gcG9seU1pblNwYWNpbmdfW2luZGV4XTsKLX0KLQotaW50IGRlZmlQaW5Qb3J0Ojpwb2x5Z29uTWFzayhpbnQgaW5kZXgpIGNvbnN0IHsKLSAgICByZXR1cm4gcG9seU1hc2tfW2luZGV4XTsKLX0KLQotaW50IGRlZmlQaW5Qb3J0Ojpwb2x5Z29uRGVzaWduUnVsZVdpZHRoKGludCBpbmRleCkgY29uc3QgewotICByZXR1cm4gcG9seUVmZmVjdGl2ZVdpZHRoX1tpbmRleF07Ci19Ci0KLWludCBkZWZpUGluUG9ydDo6bnVtVmlhcygpIGNvbnN0IHsKLSAgICByZXR1cm4gbnVtVmlhc187Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlQaW5Qb3J0Ojp2aWFOYW1lKGludCBpbmRleCkgY29uc3QgewotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gbnVtVmlhc18pIHsKLSAgICBkZWZpRXJyb3IoMSwgMCwgImluZGV4IG91dCBvZiBib3VuZHMiLCBkZWZEYXRhKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gdmlhTmFtZXNfW2luZGV4XTsKLX0KLQotaW50IGRlZmlQaW5Qb3J0Ojp2aWFQdFgoaW50IGluZGV4KSBjb25zdCB7Ci0gIHJldHVybiB2aWFYX1tpbmRleF07Ci19Ci0KLWludCBkZWZpUGluUG9ydDo6dmlhUHRZKGludCBpbmRleCkgY29uc3QgewotICByZXR1cm4gdmlhWV9baW5kZXhdOwotfQotCi1pbnQgZGVmaVBpblBvcnQ6OnZpYUJvdHRvbU1hc2soaW50IGluZGV4KSBjb25zdCB7Ci0gICAgcmV0dXJuIHZpYU1hc2tfW2luZGV4XSAlIDEwOwotfQotCi1pbnQgZGVmaVBpblBvcnQ6OnZpYVRvcE1hc2soaW50IGluZGV4KSBjb25zdCB7Ci0gICAgcmV0dXJuIHZpYU1hc2tfW2luZGV4XSAvIDEwMDsKLX0KLQotaW50IGRlZmlQaW5Qb3J0Ojp2aWFDdXRNYXNrKGludCBpbmRleCkgY29uc3QgewotICAgIHJldHVybiB2aWFNYXNrX1tpbmRleF0gLyAxMCAlIDEwOwotfQotCi1pbnQgZGVmaVBpblBvcnQ6Omhhc1BsYWNlbWVudCgpIGNvbnN0IHsKLSAgcmV0dXJuIHBsYWNlVHlwZV8gPT0gMCA/IDAgOiAxIDsKLX0KLQotaW50IGRlZmlQaW5Qb3J0Ojppc1BsYWNlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIHBsYWNlVHlwZV8gPT0gREVGSV9DT01QT05FTlRfUExBQ0VEID8gMSA6IDAgOwotfQotCi1pbnQgZGVmaVBpblBvcnQ6OmlzQ292ZXIoKSBjb25zdCB7Ci0gIHJldHVybiBwbGFjZVR5cGVfID09IERFRklfQ09NUE9ORU5UX0NPVkVSID8gMSA6IDAgOwotfQotCi1pbnQgZGVmaVBpblBvcnQ6OmlzRml4ZWQoKSBjb25zdCB7Ci0gIHJldHVybiBwbGFjZVR5cGVfID09IERFRklfQ09NUE9ORU5UX0ZJWEVEID8gMSA6IDAgOwotfQotCi1pbnQgZGVmaVBpblBvcnQ6OnBsYWNlbWVudFgoKSBjb25zdCB7Ci0gIHJldHVybiB4XzsKLX0KLQotaW50IGRlZmlQaW5Qb3J0OjpwbGFjZW1lbnRZKCkgY29uc3QgewotICByZXR1cm4geV87Ci19Ci0KLWludCBkZWZpUGluUG9ydDo6b3JpZW50KCkgY29uc3QgewotICByZXR1cm4gb3JpZW50XzsKLX0KLQotY29uc3QgY2hhciogZGVmaVBpblBvcnQ6Om9yaWVudFN0cigpIGNvbnN0IHsKLSAgcmV0dXJuIChkZWZpT3JpZW50U3RyKG9yaWVudF8pKTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gICAgIGRlZmlQaW4KLS8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotZGVmaVBpbjo6ZGVmaVBpbihkZWZyRGF0YSAqZGF0YSkKLTogZGVmRGF0YShkYXRhKQotewotICBJbml0KCk7Ci19Ci0KLQotdm9pZCBkZWZpUGluOjpJbml0KCkgewotICBwaW5OYW1lTGVuZ3RoXyA9IDA7Ci0gIHBpbk5hbWVfID0gMDsKLSAgbmV0TmFtZUxlbmd0aF8gPSAwOwotICBuZXROYW1lXyA9IDA7Ci0gIHVzZUxlbmd0aF8gPSAwOwotICB1c2VfID0gMDsKLSAgZGlyZWN0aW9uTGVuZ3RoXyA9IDA7Ci0gIGRpcmVjdGlvbl8gPSAwOwotICBoYXNEaXJlY3Rpb25fID0gMDsKLSAgaGFzVXNlXyA9IDA7Ci0gIHBsYWNlVHlwZV8gPSAwOwotICBvcmllbnRfID0gMDsKLSAgeGxfID0gMDsKLSAgeWxfID0gMDsKLSAgeGhfID0gMDsKLSAgeWhfID0gMDsKLSAgeF8gPSAwOwotICB5XyA9IDA7Ci0gIG5ldEV4cHJMZW5ndGhfID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIG5ldEV4cHJfID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIGhhc05ldEV4cHJfID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIHN1cHBseVNlbnNMZW5ndGhfID0gMDsgICAgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIHN1cHBseVNlbnNfID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIGhhc1N1cHBseVNlbnNfID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIGdyb3VuZFNlbnNMZW5ndGhfID0gMDsgICAgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIGdyb3VuZFNlbnNfID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIGhhc0dyb3VuZFNlbnNfID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIGxheWVyc18gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIGxheWVyc0FsbG9jYXRlZF8gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIG51bUxheWVyc18gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIHBvbHlnb25OYW1lc18gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIG51bVBvbHlzXyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIHBvbHlzQWxsb2NhdGVkXyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIHBvbHlnb25zXyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIG51bUFQaW5QYXJ0aWFsTWV0YWxBcmVhXyA9IDA7ICAgICAgICAgICAgICAgLy8gNS40Ci0gIEFQaW5QYXJ0aWFsTWV0YWxBcmVhQWxsb2NhdGVkXyA9IDA7ICAgICAgICAgLy8gNS40Ci0gIEFQaW5QYXJ0aWFsTWV0YWxBcmVhXyA9IDA7Ci0gIEFQaW5QYXJ0aWFsTWV0YWxBcmVhTGF5ZXJfID0gMDsKLSAgbnVtQVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhXyA9IDA7ICAgICAgICAgICAvLyA1LjQKLSAgQVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhQWxsb2NhdGVkXyA9IDA7ICAgICAvLyA1LjQKLSAgQVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhXyA9IDA7Ci0gIEFQaW5QYXJ0aWFsTWV0YWxTaWRlQXJlYUxheWVyXyA9IDA7Ci0gIG51bUFQaW5EaWZmQXJlYV8gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgLy8gNS40Ci0gIEFQaW5EaWZmQXJlYUFsbG9jYXRlZF8gPSAwOyAgICAgICAgICAgICAgICAgLy8gNS40Ci0gIEFQaW5EaWZmQXJlYV8gPSAwOwotICBBUGluRGlmZkFyZWFMYXllcl8gPSAwOwotICBudW1BUGluUGFydGlhbEN1dEFyZWFfID0gMDsgICAgICAgICAgICAgICAgIC8vIDUuNAotICBBUGluUGFydGlhbEN1dEFyZWFBbGxvY2F0ZWRfID0gMDsgICAgICAgICAgIC8vIDUuNAotICBBUGluUGFydGlhbEN1dEFyZWFfID0gMDsKLSAgQVBpblBhcnRpYWxDdXRBcmVhTGF5ZXJfID0gMDsKLSAgYW50ZW5uYU1vZGVsXyA9IDA7Ci0gIHZpYU5hbWVzXyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIHZpYXNBbGxvY2F0ZWRfID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIG51bVZpYXNfID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIHZpYVhfID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIHZpYVlfID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIG51bVBvcnRzXyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIHBpblBvcnRfID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIG51bUFudGVubmFNb2RlbF8gPSAwOwotICBhbnRlbm5hTW9kZWxBbGxvY2F0ZWRfID0gMDsKLX0KLQotCi1kZWZpUGluOjp+ZGVmaVBpbigpIHsKLSAgRGVzdHJveSgpOwotfQotCi0KLXZvaWQgZGVmaVBpbjo6Y2xlYXIoKSB7Ci0gIGludCBpOwotCi0gIGhhc0RpcmVjdGlvbl8gPSAwOwotICBoYXNOZXRFeHByXyA9IDA7Ci0gIGhhc1N1cHBseVNlbnNfID0gMDsKLSAgaGFzR3JvdW5kU2Vuc18gPSAwOwotICBoYXNVc2VfID0gMDsKLSAgaGFzU3BlY2lhbF8gPSAwOwotICBwbGFjZVR5cGVfID0gMDsKLSAgb3JpZW50XyA9IDA7Ci0gIHhfID0gMDsKLSAgeV8gPSAwOwotCi0gIGlmIChsYXllcnNfKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bUxheWVyc187IGkrKykKLSAgICAgIGlmIChsYXllcnNfW2ldKSBmcmVlKGxheWVyc19baV0pOwotICAgIGZyZWUoKGNoYXIqKShsYXllcnNfKSk7Ci0gICAgZnJlZSgoY2hhciopKHhsXykpOwotICAgIGZyZWUoKGNoYXIqKSh5bF8pKTsKLSAgICBmcmVlKChjaGFyKikoeGhfKSk7Ci0gICAgZnJlZSgoY2hhciopKHloXykpOwotICAgIGZyZWUoKGNoYXIqKShsYXllck1pblNwYWNpbmdfKSk7Ci0gICAgZnJlZSgoY2hhciopKGxheWVyTWFza18pKTsKLSAgICBmcmVlKChjaGFyKikobGF5ZXJFZmZlY3RpdmVXaWR0aF8pKTsKLSAgfQotICBsYXllcnNfID0gMDsKLSAgbGF5ZXJNaW5TcGFjaW5nXyA9IDA7Ci0gIGxheWVyTWFza18gPSAwOwotICBsYXllckVmZmVjdGl2ZVdpZHRoXyA9IDA7Ci0gIG51bUxheWVyc18gPSAwOwotICBsYXllcnNBbGxvY2F0ZWRfID0gMDsKLSAgLy8gNS42Ci0gIGlmIChwb2x5Z29uTmFtZXNfKSB7Ci0gICAgc3RydWN0IGRlZmlQb2ludHMqIHA7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bVBvbHlzXzsgaSsrKSB7Ci0gICAgICBpZiAocG9seWdvbk5hbWVzX1tpXSkgZnJlZSgoY2hhciopKHBvbHlnb25OYW1lc19baV0pKTsKLSAgICAgIHAgPSBwb2x5Z29uc19baV07Ci0gICAgICBmcmVlKChjaGFyKikocC0+eCkpOwotICAgICAgZnJlZSgoY2hhciopKHAtPnkpKTsKLSAgICAgIGZyZWUoKGNoYXIqKShwb2x5Z29uc19baV0pKTsgCi0gICAgfQotICAgIGZyZWUoKGNoYXIqKShwb2x5Z29uTmFtZXNfKSk7Ci0gICAgZnJlZSgoY2hhciopKHBvbHlnb25zXykpOyAKLSAgICBmcmVlKChjaGFyKikocG9seU1pblNwYWNpbmdfKSk7IAotICAgIGZyZWUoKGNoYXIqKShwb2x5TWFza18pKTsKLSAgICBmcmVlKChjaGFyKikocG9seUVmZmVjdGl2ZVdpZHRoXykpOyAKLSAgICBwb2x5Z29uTmFtZXNfID0gMDsKLSAgICBwb2x5Z29uc18gPSAwOwotICAgIHBvbHlNaW5TcGFjaW5nXyA9IDA7Ci0gICAgcG9seU1hc2tfID0gMDsKLSAgICBwb2x5RWZmZWN0aXZlV2lkdGhfID0gMDsKLSAgfQotICBudW1Qb2x5c18gPSAwOwotICBwb2x5c0FsbG9jYXRlZF8gPSAwOwotICAvLyA1LjcKLSAgaWYgKHZpYU5hbWVzXykgewotICAgIGZvciAoaSA9IDA7IGkgPCBudW1WaWFzXzsgaSsrKQotICAgICAgaWYgKHZpYU5hbWVzX1tpXSkgZnJlZSh2aWFOYW1lc19baV0pOwotICAgIGZyZWUoKGNoYXIqKSh2aWFOYW1lc18pKTsKLSAgICBmcmVlKChjaGFyKikodmlhWF8pKTsKLSAgICBmcmVlKChjaGFyKikodmlhWV8pKTsKLSAgICBmcmVlKChjaGFyKikodmlhTWFza18pKTsKLSAgfQotICB2aWFOYW1lc18gPSAwOwotICBudW1WaWFzXyA9IDA7Ci0gIHZpYU1hc2tfID0gMDsKLSAgdmlhc0FsbG9jYXRlZF8gPSAwOwotICAvLyA1LjcKLSAgaWYgKHBpblBvcnRfKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bVBvcnRzXzsgaSsrKSB7Ci0gICAgICBpZiAocGluUG9ydF9baV0pIHsKLSAgICAgICAgIHBpblBvcnRfW2ldLT5jbGVhcigpOwotICAgICAgICAgZGVsZXRlIHBpblBvcnRfW2ldOwotICAgICAgfQotICAgIH0KLSAgICBmcmVlKHBpblBvcnRfKTsKLSAgfQotICBwaW5Qb3J0XyA9IDA7Ci0gIG51bVBvcnRzXyA9IDA7Ci0gIHBvcnRzQWxsb2NhdGVkXyA9IDA7Ci0KLSAgZm9yIChpID0gMDsgaSA8IG51bUFQaW5QYXJ0aWFsTWV0YWxBcmVhXzsgaSsrKSB7Ci0gICAgaWYgKEFQaW5QYXJ0aWFsTWV0YWxBcmVhTGF5ZXJfW2ldKQotICAgICAgIGZyZWUoQVBpblBhcnRpYWxNZXRhbEFyZWFMYXllcl9baV0pOwotICB9Ci0gIG51bUFQaW5QYXJ0aWFsTWV0YWxBcmVhXyA9IDA7Ci0KLSAgZm9yIChpID0gMDsgaSA8IG51bUFQaW5QYXJ0aWFsTWV0YWxTaWRlQXJlYV87IGkrKykgewotICAgIGlmIChBUGluUGFydGlhbE1ldGFsU2lkZUFyZWFMYXllcl9baV0pCi0gICAgICAgZnJlZShBUGluUGFydGlhbE1ldGFsU2lkZUFyZWFMYXllcl9baV0pOwotICB9Ci0gIG51bUFQaW5QYXJ0aWFsTWV0YWxTaWRlQXJlYV8gPSAwOwotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1BUGluRGlmZkFyZWFfOyBpKyspIHsKLSAgICBpZiAoQVBpbkRpZmZBcmVhTGF5ZXJfW2ldKQotICAgICAgIGZyZWUoQVBpbkRpZmZBcmVhTGF5ZXJfW2ldKTsKLSAgfQotICBudW1BUGluRGlmZkFyZWFfID0gMDsKLQotICBmb3IgKGkgPSAwOyBpIDwgbnVtQVBpblBhcnRpYWxDdXRBcmVhXzsgaSsrKSB7Ci0gICAgaWYgKEFQaW5QYXJ0aWFsQ3V0QXJlYUxheWVyX1tpXSkKLSAgICAgICBmcmVlKEFQaW5QYXJ0aWFsQ3V0QXJlYUxheWVyX1tpXSk7Ci0gIH0KLSAgbnVtQVBpblBhcnRpYWxDdXRBcmVhXyA9IDA7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGFudGVubmFNb2RlbEFsbG9jYXRlZF87IGkrKykgeyAvLyA1LjUKLSAgICBkZWxldGUgYW50ZW5uYU1vZGVsX1tpXTsKLSAgfQotCi0gIG51bUFudGVubmFNb2RlbF8gPSAwOwotICBhbnRlbm5hTW9kZWxBbGxvY2F0ZWRfID0gMDsKLX0KLQotCi12b2lkIGRlZmlQaW46OkRlc3Ryb3koKSB7Ci0gIGlmIChwaW5OYW1lXykgZnJlZShwaW5OYW1lXyk7Ci0gIGlmIChuZXROYW1lXykgZnJlZShuZXROYW1lXyk7Ci0gIGlmICh1c2VfKSBmcmVlKHVzZV8pOwotICBpZiAoZGlyZWN0aW9uXykgZnJlZShkaXJlY3Rpb25fKTsKLSAgaWYgKG5ldEV4cHJfKSBmcmVlKG5ldEV4cHJfKTsKLSAgaWYgKHN1cHBseVNlbnNfKSBmcmVlKHN1cHBseVNlbnNfKTsKLSAgaWYgKGdyb3VuZFNlbnNfKSBmcmVlKGdyb3VuZFNlbnNfKTsKLSAgcGluTmFtZV8gPSAwOwotICBuZXROYW1lXyA9IDA7Ci0gIHVzZV8gPSAwOwotICBkaXJlY3Rpb25fID0gMDsKLSAgbmV0RXhwcl8gPSAwOwotICBzdXBwbHlTZW5zXyA9IDA7Ci0gIGdyb3VuZFNlbnNfID0gMDsKLSAgcGluTmFtZUxlbmd0aF8gPSAwOwotICBuZXROYW1lTGVuZ3RoXyA9IDA7Ci0gIHVzZUxlbmd0aF8gPSAwOwotICBkaXJlY3Rpb25MZW5ndGhfID0gMDsKLSAgbmV0RXhwckxlbmd0aF8gPSAwOwotICBzdXBwbHlTZW5zTGVuZ3RoXyA9IDA7Ci0gIGdyb3VuZFNlbnNMZW5ndGhfID0gMDsKLSAgbGF5ZXJzQWxsb2NhdGVkXyA9IDA7Ci0gIGNsZWFyKCk7Ci0KLSAgLy8gNS40Ci0gIGlmIChBUGluUGFydGlhbE1ldGFsQXJlYV8pCi0gICAgIGZyZWUoKGNoYXIqKShBUGluUGFydGlhbE1ldGFsQXJlYV8pKTsKLSAgaWYgKEFQaW5QYXJ0aWFsTWV0YWxBcmVhTGF5ZXJfKQotICAgICBmcmVlKChjaGFyKikoQVBpblBhcnRpYWxNZXRhbEFyZWFMYXllcl8pKTsKLSAgaWYgKEFQaW5QYXJ0aWFsTWV0YWxTaWRlQXJlYV8pCi0gICAgIGZyZWUoKGNoYXIqKShBUGluUGFydGlhbE1ldGFsU2lkZUFyZWFfKSk7Ci0gIGlmIChBUGluUGFydGlhbE1ldGFsU2lkZUFyZWFMYXllcl8pCi0gICAgIGZyZWUoKGNoYXIqKShBUGluUGFydGlhbE1ldGFsU2lkZUFyZWFMYXllcl8pKTsKLSAgaWYgKEFQaW5EaWZmQXJlYV8pCi0gICAgIGZyZWUoKGNoYXIqKShBUGluRGlmZkFyZWFfKSk7Ci0gIGlmIChBUGluRGlmZkFyZWFMYXllcl8pCi0gICAgIGZyZWUoKGNoYXIqKShBUGluRGlmZkFyZWFMYXllcl8pKTsKLSAgaWYgKEFQaW5QYXJ0aWFsQ3V0QXJlYV8pCi0gICAgIGZyZWUoKGNoYXIqKShBUGluUGFydGlhbEN1dEFyZWFfKSk7Ci0gIGlmIChBUGluUGFydGlhbEN1dEFyZWFMYXllcl8pCi0gICAgIGZyZWUoKGNoYXIqKShBUGluUGFydGlhbEN1dEFyZWFMYXllcl8pKTsKLSAgaWYgKGFudGVubmFNb2RlbF8pCi0gICAgIGZyZWUoKGNoYXIqKShhbnRlbm5hTW9kZWxfKSk7Ci19Ci0KLQotdm9pZCBkZWZpUGluOjpTZXR1cChjb25zdCBjaGFyKiBwaW5OYW1lLCBjb25zdCBjaGFyKiBuZXROYW1lKSB7Ci0gIGludCBsZW4gPSBzdHJsZW4ocGluTmFtZSkgKyAxOwotICBpZiAocGluTmFtZUxlbmd0aF8gPCBsZW4pIHsKLSAgICBpZiAocGluTmFtZV8pIGZyZWUocGluTmFtZV8pOwotICAgIHBpbk5hbWVfID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICAgIHBpbk5hbWVMZW5ndGhfID0gbGVuOwotICB9Ci0gIHN0cmNweShwaW5OYW1lXywgZGVmRGF0YS0+REVGQ0FTRShwaW5OYW1lKSk7Ci0KLSAgbGVuID0gc3RybGVuKG5ldE5hbWUpICsgMTsKLSAgaWYgKG5ldE5hbWVMZW5ndGhfIDwgbGVuKSB7Ci0gICAgaWYgKG5ldE5hbWVfKSBmcmVlKG5ldE5hbWVfKTsKLSAgICBuZXROYW1lXyA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgICBuZXROYW1lTGVuZ3RoXyA9IGxlbjsKLSAgfQotICBzdHJjcHkobmV0TmFtZV8sIGRlZkRhdGEtPkRFRkNBU0UobmV0TmFtZSkpOwotCi0gIGNsZWFyKCk7Ci0KLX0KLQotCi12b2lkIGRlZmlQaW46OnNldERpcmVjdGlvbihjb25zdCBjaGFyKiBkaXIpIHsKLSAgaW50IGxlbiA9IHN0cmxlbihkaXIpICsgMTsKLSAgaWYgKGRpcmVjdGlvbkxlbmd0aF8gPCBsZW4pIHsKLSAgICBpZiAoZGlyZWN0aW9uXykgZnJlZShkaXJlY3Rpb25fKTsKLSAgICBkaXJlY3Rpb25fID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICAgIGRpcmVjdGlvbkxlbmd0aF8gPSBsZW47Ci0gIH0KLSAgc3RyY3B5KGRpcmVjdGlvbl8sIGRlZkRhdGEtPkRFRkNBU0UoZGlyKSk7Ci0gIGhhc0RpcmVjdGlvbl8gPSAxOwotfQotCi0KLXZvaWQgZGVmaVBpbjo6c2V0TmV0RXhwcihjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIGludCBsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotICBpZiAobmV0RXhwckxlbmd0aF8gPCBsZW4pIHsKLSAgICBpZiAobmV0RXhwcl8pIGZyZWUobmV0RXhwcl8pOwotICAgIG5ldEV4cHJfID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICAgIG5ldEV4cHJMZW5ndGhfID0gbGVuOwotICB9Ci0gIHN0cmNweShuZXRFeHByXywgZGVmRGF0YS0+REVGQ0FTRShuYW1lKSk7Ci0gIGhhc05ldEV4cHJfID0gMTsKLX0KLQotCi12b2lkIGRlZmlQaW46OnNldFN1cHBseVNlbnMoY29uc3QgY2hhciogbmFtZSkgewotICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLSAgaWYgKHN1cHBseVNlbnNMZW5ndGhfIDwgbGVuKSB7Ci0gICAgaWYgKHN1cHBseVNlbnNfKSBmcmVlKHN1cHBseVNlbnNfKTsKLSAgICBzdXBwbHlTZW5zXyA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgICBzdXBwbHlTZW5zTGVuZ3RoXyA9IGxlbjsKLSAgfQotICBzdHJjcHkoc3VwcGx5U2Vuc18sIGRlZkRhdGEtPkRFRkNBU0UobmFtZSkpOwotICBoYXNTdXBwbHlTZW5zXyA9IDE7Ci19Ci0KLQotdm9pZCBkZWZpUGluOjpzZXRHcm91bmRTZW5zKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgaW50IGxlbiA9IHN0cmxlbihuYW1lKSArIDE7Ci0gIGlmIChncm91bmRTZW5zTGVuZ3RoXyA8IGxlbikgewotICAgIGlmIChncm91bmRTZW5zXykgZnJlZShncm91bmRTZW5zXyk7Ci0gICAgZ3JvdW5kU2Vuc18gPSAoY2hhciopbWFsbG9jKGxlbik7Ci0gICAgZ3JvdW5kU2Vuc0xlbmd0aF8gPSBsZW47Ci0gIH0KLSAgc3RyY3B5KGdyb3VuZFNlbnNfLCBkZWZEYXRhLT5ERUZDQVNFKG5hbWUpKTsKLSAgaGFzR3JvdW5kU2Vuc18gPSAxOwotfQotCi0KLXZvaWQgZGVmaVBpbjo6c2V0VXNlKGNvbnN0IGNoYXIqIHVzZSkgewotICBpbnQgbGVuID0gc3RybGVuKHVzZSkgKyAxOwotICBpZiAodXNlTGVuZ3RoXyA8IGxlbikgewotICAgIGlmICh1c2VfKSBmcmVlKHVzZV8pOwotICAgIHVzZV8gPSAoY2hhciopbWFsbG9jKGxlbik7Ci0gICAgdXNlTGVuZ3RoXyA9IGxlbjsKLSAgfQotICBzdHJjcHkodXNlXywgZGVmRGF0YS0+REVGQ0FTRSh1c2UpKTsKLSAgaGFzVXNlXyA9IDE7Ci19Ci0KLQotLy8gNS42LCByZW5hbWVkIGZyb20gc2V0TGF5ZXIgdG8gYWRkTGF5ZXIgZm9yIG11bHRpcGxlIGxheWVycyBhbGxvd2VkCi12b2lkIGRlZmlQaW46OmFkZExheWVyKGNvbnN0IGNoYXIqIGxheWVyKSB7Ci0KLSAgaWYgKG51bUxheWVyc18gPj0gbGF5ZXJzQWxsb2NhdGVkXykgewotICAgIGludCBpOwotICAgIGNoYXIqKiBuZXdsOwotICAgIGludCAqbnhsLCAqbnlsLCAqbnhoLCAqbnloOwotICAgIGludCAqbG1zLCAqbGV3LCAqbG07Ci0KLSAgICBsYXllcnNBbGxvY2F0ZWRfID0gbGF5ZXJzQWxsb2NhdGVkXyA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyc0FsbG9jYXRlZF8gKiAyIDogODsKLSAgICBuZXdsID0gKGNoYXIqKiltYWxsb2MobGF5ZXJzQWxsb2NhdGVkXyAqIHNpemVvZihjaGFyKikpOwotICAgIG54bCA9IChpbnQqKW1hbGxvYyhsYXllcnNBbGxvY2F0ZWRfICogc2l6ZW9mKGludCkpOwotICAgIG55bCA9IChpbnQqKW1hbGxvYyhsYXllcnNBbGxvY2F0ZWRfICogc2l6ZW9mKGludCkpOwotICAgIG54aCA9IChpbnQqKW1hbGxvYyhsYXllcnNBbGxvY2F0ZWRfICogc2l6ZW9mKGludCkpOwotICAgIG55aCA9IChpbnQqKW1hbGxvYyhsYXllcnNBbGxvY2F0ZWRfICogc2l6ZW9mKGludCkpOwotICAgIGxtcyA9IChpbnQqKW1hbGxvYyhsYXllcnNBbGxvY2F0ZWRfICogc2l6ZW9mKGludCkpOwotICAgIGxldyA9IChpbnQqKW1hbGxvYyhsYXllcnNBbGxvY2F0ZWRfICogc2l6ZW9mKGludCkpOwotICAgIGxtID0gKGludCopbWFsbG9jKGxheWVyc0FsbG9jYXRlZF8gKiBzaXplb2YoaW50KSk7Ci0gCi0gICAgZm9yIChpID0gMDsgaSA8IG51bUxheWVyc187IGkrKykgewotICAgICAgIG5ld2xbaV0gPSBsYXllcnNfW2ldOwotICAgICAgIG54bFtpXSA9IHhsX1tpXTsKLSAgICAgICBueWxbaV0gPSB5bF9baV07Ci0gICAgICAgbnhoW2ldID0geGhfW2ldOwotICAgICAgIG55aFtpXSA9IHloX1tpXTsKLSAgICAgICBsbXNbaV0gPSBsYXllck1pblNwYWNpbmdfW2ldOwotICAgICAgIGxld1tpXSA9IGxheWVyRWZmZWN0aXZlV2lkdGhfW2ldOwotICAgICAgIGxtW2ldID0gbGF5ZXJNYXNrX1tpXTsKLSAgICB9Ci0gICAgaWYgKG51bUxheWVyc18gPiAwKSB7Ci0gICAgICAgZnJlZSgoY2hhciopbGF5ZXJzXyk7Ci0gICAgICAgZnJlZSgoY2hhciopeGxfKTsKLSAgICAgICBmcmVlKChjaGFyKil5bF8pOwotICAgICAgIGZyZWUoKGNoYXIqKXhoXyk7Ci0gICAgICAgZnJlZSgoY2hhciopeWhfKTsKLSAgICAgICBmcmVlKChjaGFyKilsYXllck1pblNwYWNpbmdfKTsKLSAgICAgICBmcmVlKChjaGFyKilsYXllck1hc2tfKTsKLSAgICAgICBmcmVlKChjaGFyKilsYXllckVmZmVjdGl2ZVdpZHRoXyk7Ci0gICAgfQotICAgIGxheWVyc18gPSBuZXdsOwotICAgIHhsXyA9IG54bDsKLSAgICB5bF8gPSBueWw7Ci0gICAgeGhfID0gbnhoOwotICAgIHloXyA9IG55aDsKLSAgICBsYXllck1pblNwYWNpbmdfID0gbG1zOwotICAgIGxheWVyRWZmZWN0aXZlV2lkdGhfID0gbGV3OwotICAgIGxheWVyTWFza18gPSBsbTsKLSAgfQotICBsYXllcnNfW251bUxheWVyc19dID0gKGNoYXIqKW1hbGxvYyhzdHJsZW4obGF5ZXIpKzEpOwotICBzdHJjcHkobGF5ZXJzX1tudW1MYXllcnNfXSwgZGVmRGF0YS0+REVGQ0FTRShsYXllcikpOwotICB4bF9bbnVtTGF5ZXJzX10gPSAwOwotICB5bF9bbnVtTGF5ZXJzX10gPSAwOwotICB4aF9bbnVtTGF5ZXJzX10gPSAwOwotICB5aF9bbnVtTGF5ZXJzX10gPSAwOwotICBsYXllck1pblNwYWNpbmdfW251bUxheWVyc19dID0gLTE7Ci0gIGxheWVyTWFza19bbnVtTGF5ZXJzX10gPSAwOwotICBsYXllckVmZmVjdGl2ZVdpZHRoX1tudW1MYXllcnNfXSA9IC0xOwotICBudW1MYXllcnNfICs9IDE7Ci19Ci0KLS8vIDUuNgotdm9pZCBkZWZpUGluOjphZGRMYXllclB0cyhpbnQgeGwsIGludCB5bCwgaW50IHhoLCBpbnQgeWgpIHsKLSAgeGxfW251bUxheWVyc18tMV0gPSB4bDsKLSAgeWxfW251bUxheWVyc18tMV0gPSB5bDsKLSAgeGhfW251bUxheWVyc18tMV0gPSB4aDsKLSAgeWhfW251bUxheWVyc18tMV0gPSB5aDsKLX0KLQotLy8gNS42Ci12b2lkIGRlZmlQaW46OmFkZExheWVyU3BhY2luZyhpbnQgbWluU3BhY2luZykgewotICBsYXllck1pblNwYWNpbmdfW251bUxheWVyc18tMV0gPSBtaW5TcGFjaW5nOwotfQotCi12b2lkIGRlZmlQaW46OmFkZExheWVyTWFzayhpbnQgbWFzaykgewotICAgIGxheWVyTWFza19bbnVtTGF5ZXJzXy0xXSA9IG1hc2s7Ci19Ci0KLS8vIDUuNgotdm9pZCBkZWZpUGluOjphZGRMYXllckRlc2lnblJ1bGVXaWR0aChpbnQgZWZmZWN0aXZlV2lkdGgpIHsKLSAgbGF5ZXJFZmZlY3RpdmVXaWR0aF9bbnVtTGF5ZXJzXy0xXSA9IGVmZmVjdGl2ZVdpZHRoOwotfQotCi0KLXZvaWQgZGVmaVBpbjo6c2V0UGxhY2VtZW50KGludCB0eXAsIGludCB4LCBpbnQgeSwgaW50IG9yaWVudCkgewotICB4XyA9IHg7Ci0gIHlfID0geTsKLSAgb3JpZW50XyA9IG9yaWVudDsKLSAgcGxhY2VUeXBlXyA9IHR5cDsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpUGluOjpwaW5OYW1lKCkgY29uc3QgewotICByZXR1cm4gcGluTmFtZV87Ci19Ci0KLQotY29uc3QgY2hhciogZGVmaVBpbjo6bmV0TmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG5ldE5hbWVfOwotfQotCi0KLXZvaWQgZGVmaVBpbjo6Y2hhbmdlUGluTmFtZShjb25zdCBjaGFyKiBwaW5OYW1lKSB7Ci0gIGludCBsZW4gPSBzdHJsZW4ocGluTmFtZSkgKyAxOwotICBpZiAocGluTmFtZUxlbmd0aF8gPCBsZW4pIHsKLSAgICBpZiAocGluTmFtZV8pIGZyZWUocGluTmFtZV8pOwotICAgIHBpbk5hbWVfID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICAgIHBpbk5hbWVMZW5ndGhfID0gbGVuOwotICB9Ci0gIHN0cmNweShwaW5OYW1lXywgZGVmRGF0YS0+REVGQ0FTRShwaW5OYW1lKSk7Ci19Ci0KLQotaW50IGRlZmlQaW46Omhhc0RpcmVjdGlvbigpIGNvbnN0IHsKLSAgcmV0dXJuIChpbnQpKGhhc0RpcmVjdGlvbl8pOwotfQotCi0KLWludCBkZWZpUGluOjpoYXNVc2UoKSBjb25zdCB7Ci0gIHJldHVybiAoaW50KShoYXNVc2VfKTsKLX0KLQotCi1pbnQgZGVmaVBpbjo6aGFzTGF5ZXIoKSBjb25zdCB7Ci0gIGlmIChudW1MYXllcnNfIHx8IG51bVBvbHlzXykgIC8vIDUuNiwgZWl0aGVyIGxheWVyIG9yIHBvbHlnb24gaXMKLSAgICByZXR1cm4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uLXplcm8KLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0KLWludCBkZWZpUGluOjpoYXNQbGFjZW1lbnQoKSBjb25zdCB7Ci0gIHJldHVybiBwbGFjZVR5cGVfID09IDAgPyAwIDogMSA7Ci19Ci0KLQotaW50IGRlZmlQaW46OmlzVW5wbGFjZWQoKSBjb25zdCB7Ci0gIHJldHVybiBwbGFjZVR5cGVfID09IERFRklfQ09NUE9ORU5UX1VOUExBQ0VEID8gMSA6IDAgOwotfQotCi0KLWludCBkZWZpUGluOjppc1BsYWNlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIHBsYWNlVHlwZV8gPT0gREVGSV9DT01QT05FTlRfUExBQ0VEID8gMSA6IDAgOwotfQotCi0KLWludCBkZWZpUGluOjppc0NvdmVyKCkgY29uc3QgewotICByZXR1cm4gcGxhY2VUeXBlXyA9PSBERUZJX0NPTVBPTkVOVF9DT1ZFUiA/IDEgOiAwIDsKLX0KLQotCi1pbnQgZGVmaVBpbjo6aXNGaXhlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIHBsYWNlVHlwZV8gPT0gREVGSV9DT01QT05FTlRfRklYRUQgPyAxIDogMCA7Ci19Ci0KLQotaW50IGRlZmlQaW46OnBsYWNlbWVudFgoKSBjb25zdCB7Ci0gIHJldHVybiB4XzsKLX0KLQotCi1pbnQgZGVmaVBpbjo6cGxhY2VtZW50WSgpIGNvbnN0IHsKLSAgcmV0dXJuIHlfOwotfQotCi0KLWNvbnN0IGNoYXIqIGRlZmlQaW46OmRpcmVjdGlvbigpIGNvbnN0IHsKLSAgcmV0dXJuIGRpcmVjdGlvbl87Ci19Ci0KLQotY29uc3QgY2hhciogZGVmaVBpbjo6dXNlKCkgY29uc3QgewotICByZXR1cm4gdXNlXzsKLX0KLQotCi1pbnQgZGVmaVBpbjo6bnVtTGF5ZXIoKSBjb25zdCB7Ci0gIHJldHVybiBudW1MYXllcnNfOwotfQotCi1jb25zdCBjaGFyKiBkZWZpUGluOjpsYXllcihpbnQgaW5kZXgpIGNvbnN0IHsKLSAgcmV0dXJuIGxheWVyc19baW5kZXhdOwotfQotCi0KLXZvaWQgZGVmaVBpbjo6Ym91bmRzKGludCBpbmRleCwgaW50KiB4bCwgaW50KiB5bCwgaW50KiB4aCwgaW50KiB5aCkgY29uc3QgewotICBpZiAoeGwpICp4bCA9IHhsX1tpbmRleF07Ci0gIGlmICh5bCkgKnlsID0geWxfW2luZGV4XTsKLSAgaWYgKHhoKSAqeGggPSB4aF9baW5kZXhdOwotICBpZiAoeWgpICp5aCA9IHloX1tpbmRleF07Ci19Ci0KLS8vIDUuNgotaW50IGRlZmlQaW46Omhhc0xheWVyU3BhY2luZyhpbnQgaW5kZXgpIGNvbnN0ewotICBpZiAobGF5ZXJNaW5TcGFjaW5nX1tpbmRleF0gPT0gLTEpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiAxOwotfQotCi0vLyA1LjYKLWludCBkZWZpUGluOjpoYXNMYXllckRlc2lnblJ1bGVXaWR0aChpbnQgaW5kZXgpIGNvbnN0ewotICBpZiAobGF5ZXJFZmZlY3RpdmVXaWR0aF9baW5kZXhdID09IC0xKQotICAgIHJldHVybiAwOwotICByZXR1cm4gMTsKLX0KLQotLy8gNS42Ci1pbnQgZGVmaVBpbjo6bGF5ZXJTcGFjaW5nKGludCBpbmRleCkgY29uc3QgewotICByZXR1cm4gbGF5ZXJNaW5TcGFjaW5nX1tpbmRleF07Ci19Ci0KLWludCBkZWZpUGluOjpsYXllck1hc2soaW50IGluZGV4KSBjb25zdCB7Ci0gICAgcmV0dXJuIGxheWVyTWFza19baW5kZXhdOwotfQotCi0vLyA1LjYKLWludCBkZWZpUGluOjpsYXllckRlc2lnblJ1bGVXaWR0aChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgcmV0dXJuIGxheWVyRWZmZWN0aXZlV2lkdGhfW2luZGV4XTsKLX0KLQotaW50IGRlZmlQaW46Om9yaWVudCgpIGNvbnN0IHsKLSAgcmV0dXJuIG9yaWVudF87Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlQaW46Om9yaWVudFN0cigpIGNvbnN0IHsKLSAgcmV0dXJuIChkZWZpT3JpZW50U3RyKG9yaWVudF8pKTsKLX0KLQotCi12b2lkIGRlZmlQaW46OnNldFNwZWNpYWwoKSB7Ci0gIGhhc1NwZWNpYWxfID0gMTsKLX0KLQotLy8gNS41Ci12b2lkIGRlZmlQaW46OmFkZEFudGVubmFNb2RlbChpbnQgb3hpZGUpIHsKLSAgLy8gRm9yIHZlcnNpb24gNS41IG9ubHkgT1hJREUxLCBPWElERTIsIE9YSURFMywgJiBPWElERTQKLSAgLy8gYXJlIGRlZmluZWQgd2l0aGluIGEgcGluCi0gIGRlZmlQaW5BbnRlbm5hTW9kZWwqIGFtbzsKLSAgaW50IGk7Ci0KLSAgaWYgKG51bUFudGVubmFNb2RlbF8gPT0gMCkgeyAgIC8vIGRvZXMgbm90IGhhdmUgYW50ZW5uYU1vZGVsCi0gICAgIGlmICghYW50ZW5uYU1vZGVsXykgICAgICAgICAvLyBvbmx5IG5lZWQgdG8gbWFsbG9jIGlmIGl0IGlzIG5pbGwKLSAgICAgICAgYW50ZW5uYU1vZGVsXyA9IChkZWZpUGluQW50ZW5uYU1vZGVsKiopCi0gICAgICAgICAgICAgICAgIG1hbGxvYyhzaXplb2YoZGVmaVBpbkFudGVubmFNb2RlbCopKjQpOwotICAgICBhbnRlbm5hTW9kZWxBbGxvY2F0ZWRfID0gNDsKLSAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgYW50ZW5uYU1vZGVsX1tpXSA9ICBuZXcgZGVmaVBpbkFudGVubmFNb2RlbChkZWZEYXRhKTsKLSAgICAgfQotICAgICBudW1BbnRlbm5hTW9kZWxfKys7Ci0gICAgIGFudGVubmFNb2RlbEFsbG9jYXRlZF8gPSA0OwotICAgICBhbW8gPSBhbnRlbm5hTW9kZWxfWzBdOwotICB9IGVsc2UgewotICAgICBhbW8gPSBhbnRlbm5hTW9kZWxfW251bUFudGVubmFNb2RlbF9dOwotICAgICBudW1BbnRlbm5hTW9kZWxfKys7Ci0gIH0KLSAgYW1vLT5Jbml0KCk7Ci0gIGFtby0+c2V0QW50ZW5uYU1vZGVsKG94aWRlKTsKLSAgcmV0dXJuOwotfQotCi0vLyA1LjUKLWludCBkZWZpUGluOjpudW1BbnRlbm5hTW9kZWwoKSBjb25zdCB7Ci0gIHJldHVybiBudW1BbnRlbm5hTW9kZWxfOwotfQotCi0vLyA1LjUKLWRlZmlQaW5BbnRlbm5hTW9kZWwqIGRlZmlQaW46OmFudGVubmFNb2RlbChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgcmV0dXJuIGFudGVubmFNb2RlbF9baW5kZXhdOwotfQotCi12b2lkIGRlZmlQaW46OmFkZEFQaW5QYXJ0aWFsTWV0YWxBcmVhKGludCB2YWx1ZSwgY29uc3QgY2hhciogbGF5ZXIpIHsKLSAgaWYgKG51bUFQaW5QYXJ0aWFsTWV0YWxBcmVhXyA9PSBBUGluUGFydGlhbE1ldGFsQXJlYUFsbG9jYXRlZF8pIHsKLSAgICAgaW50IGk7Ci0gICAgIGludCBtYXg7Ci0gICAgIGludCBsaW0gPSBudW1BUGluUGFydGlhbE1ldGFsQXJlYV87Ci0gICAgIGludCogbmQ7Ci0gICAgIGNoYXIqKiAgbmw7Ci0KLSAgICAgaWYgKEFQaW5QYXJ0aWFsTWV0YWxBcmVhQWxsb2NhdGVkXyA9PSAwKQotICAgICAgICBtYXggPSBBUGluUGFydGlhbE1ldGFsQXJlYUFsbG9jYXRlZF8gPSAyOwotICAgICBlbHNlCi0gICAgICAgIG1heCA9IEFQaW5QYXJ0aWFsTWV0YWxBcmVhQWxsb2NhdGVkXyAqPSAyOwotICAgICBuZCA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSptYXgpOwotICAgICBubCA9IChjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikqbWF4KTsKLSAgICAgZm9yIChpID0gMDsgaSA8IGxpbTsgaSsrKSB7Ci0gICAgICAgIG5kW2ldID0gQVBpblBhcnRpYWxNZXRhbEFyZWFfW2ldOwotICAgICAgICBubFtpXSA9IEFQaW5QYXJ0aWFsTWV0YWxBcmVhTGF5ZXJfW2ldOwotICAgICB9Ci0gICAgIGZyZWUoKGNoYXIqKShBUGluUGFydGlhbE1ldGFsQXJlYV8pKTsKLSAgICAgZnJlZSgoY2hhciopKEFQaW5QYXJ0aWFsTWV0YWxBcmVhTGF5ZXJfKSk7Ci0gICAgIEFQaW5QYXJ0aWFsTWV0YWxBcmVhXyA9IG5kOwotICAgICBBUGluUGFydGlhbE1ldGFsQXJlYUxheWVyXyA9IG5sOwotIAotICB9Ci0gIEFQaW5QYXJ0aWFsTWV0YWxBcmVhX1tudW1BUGluUGFydGlhbE1ldGFsQXJlYV9dID0gdmFsdWU7Ci0gIGlmIChsYXllcikgewotICAgIEFQaW5QYXJ0aWFsTWV0YWxBcmVhTGF5ZXJfW251bUFQaW5QYXJ0aWFsTWV0YWxBcmVhX10gPQotICAgICAgIChjaGFyKiltYWxsb2Moc3RybGVuKGxheWVyKSsxKTsKLSAgICBzdHJjcHkoQVBpblBhcnRpYWxNZXRhbEFyZWFMYXllcl9bbnVtQVBpblBhcnRpYWxNZXRhbEFyZWFfXSwKLSAgICAgICBkZWZEYXRhLT5ERUZDQVNFKGxheWVyKSk7Ci0gIH0gZWxzZQotICAgIEFQaW5QYXJ0aWFsTWV0YWxBcmVhTGF5ZXJfW251bUFQaW5QYXJ0aWFsTWV0YWxBcmVhX10gPSBOVUxMOwotICBudW1BUGluUGFydGlhbE1ldGFsQXJlYV8gKz0gMTsKLX0KLQotCi12b2lkIGRlZmlQaW46OmFkZEFQaW5QYXJ0aWFsTWV0YWxTaWRlQXJlYShpbnQgdmFsdWUsIGNvbnN0IGNoYXIqIGxheWVyKSB7Ci0gIGlmIChudW1BUGluUGFydGlhbE1ldGFsU2lkZUFyZWFfID09IEFQaW5QYXJ0aWFsTWV0YWxTaWRlQXJlYUFsbG9jYXRlZF8pIHsKLSAgICAgaW50IGk7Ci0gICAgIGludCBtYXg7Ci0gICAgIGludCBsaW0gPSBudW1BUGluUGFydGlhbE1ldGFsU2lkZUFyZWFfOwotICAgICBpbnQqIG5kOwotICAgICBjaGFyKiogIG5sOwotCi0gICAgIGlmIChBUGluUGFydGlhbE1ldGFsU2lkZUFyZWFBbGxvY2F0ZWRfID09IDApCi0gICAgICAgIG1heCA9IEFQaW5QYXJ0aWFsTWV0YWxTaWRlQXJlYUFsbG9jYXRlZF8gPSAyOwotICAgICBlbHNlCi0gICAgICAgIG1heCA9IEFQaW5QYXJ0aWFsTWV0YWxTaWRlQXJlYUFsbG9jYXRlZF8gKj0gMjsKLSAgICAgbmQgPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkqbWF4KTsKLSAgICAgbmwgPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKm1heCk7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBsaW07IGkrKykgewotICAgICAgICBuZFtpXSA9IEFQaW5QYXJ0aWFsTWV0YWxTaWRlQXJlYV9baV07Ci0gICAgICAgIG5sW2ldID0gQVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhTGF5ZXJfW2ldOwotICAgICB9Ci0gICAgIGZyZWUoKGNoYXIqKShBUGluUGFydGlhbE1ldGFsU2lkZUFyZWFfKSk7Ci0gICAgIGZyZWUoKGNoYXIqKShBUGluUGFydGlhbE1ldGFsU2lkZUFyZWFMYXllcl8pKTsKLSAgICAgQVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhXyA9IG5kOwotICAgICBBUGluUGFydGlhbE1ldGFsU2lkZUFyZWFMYXllcl8gPSBubDsKLQotICB9Ci0gIEFQaW5QYXJ0aWFsTWV0YWxTaWRlQXJlYV9bbnVtQVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhX10gPSB2YWx1ZTsKLSAgaWYgKGxheWVyKSB7Ci0gICAgQVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhTGF5ZXJfW251bUFQaW5QYXJ0aWFsTWV0YWxTaWRlQXJlYV9dID0KLSAgICAgICAoY2hhciopbWFsbG9jKHN0cmxlbihsYXllcikrMSk7Ci0gICAgc3RyY3B5KEFQaW5QYXJ0aWFsTWV0YWxTaWRlQXJlYUxheWVyX1tudW1BUGluUGFydGlhbE1ldGFsU2lkZUFyZWFfXSwKLSAgICAgICBkZWZEYXRhLT5ERUZDQVNFKGxheWVyKSk7Ci0gIH0gZWxzZQotICAgIEFQaW5QYXJ0aWFsTWV0YWxTaWRlQXJlYUxheWVyX1tudW1BUGluUGFydGlhbE1ldGFsU2lkZUFyZWFfXSA9IE5VTEw7Ci0gIG51bUFQaW5QYXJ0aWFsTWV0YWxTaWRlQXJlYV8gKz0gMTsKLX0KLQotCi12b2lkIGRlZmlQaW46OmFkZEFQaW5HYXRlQXJlYShpbnQgdmFsdWUsIGNvbnN0IGNoYXIqIGxheWVyKSB7Ci0gIGlmIChudW1BbnRlbm5hTW9kZWxfID09IDApICAgIC8vIGhhdmVuJ3QgY3JlYXRlZCBhbnkgYW50ZW5uYU1vZGVsIHlldAotICAgICBhZGRBbnRlbm5hTW9kZWwoMSk7Ci0gIGFudGVubmFNb2RlbF9bbnVtQW50ZW5uYU1vZGVsXy0xXS0+YWRkQVBpbkdhdGVBcmVhKHZhbHVlLCBsYXllcik7Ci19Ci0KLQotdm9pZCBkZWZpUGluOjphZGRBUGluRGlmZkFyZWEoaW50IHZhbHVlLCBjb25zdCBjaGFyKiBsYXllcikgewotICBpZiAobnVtQVBpbkRpZmZBcmVhXyA9PSBBUGluRGlmZkFyZWFBbGxvY2F0ZWRfKSB7Ci0gICAgIGludCBpOwotICAgICBpbnQgbWF4OwotICAgICBpbnQgbGltID0gbnVtQVBpbkRpZmZBcmVhXzsKLSAgICAgaW50KiBuZDsKLSAgICAgY2hhcioqICBubDsKLQotICAgICBpZiAoQVBpbkRpZmZBcmVhQWxsb2NhdGVkXyA9PSAwKQotICAgICAgICBtYXggPSBBUGluRGlmZkFyZWFBbGxvY2F0ZWRfID0gMjsKLSAgICAgZWxzZQotICAgICAgICBtYXggPSBBUGluRGlmZkFyZWFBbGxvY2F0ZWRfICo9IDI7Ci0gICAgIG5kID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKm1heCk7Ci0gICAgIG5sID0gKGNoYXIqKiltYWxsb2Moc2l6ZW9mKGNoYXIqKSptYXgpOwotICAgICBmb3IgKGkgPSAwOyBpIDwgbGltOyBpKyspIHsKLSAgICAgICAgbmRbaV0gPSBBUGluRGlmZkFyZWFfW2ldOwotICAgICAgICBubFtpXSA9IEFQaW5EaWZmQXJlYUxheWVyX1tpXTsKLSAgICAgfQotICAgICBmcmVlKChjaGFyKikoQVBpbkRpZmZBcmVhXykpOwotICAgICBmcmVlKChjaGFyKikoQVBpbkRpZmZBcmVhTGF5ZXJfKSk7Ci0gICAgIEFQaW5EaWZmQXJlYV8gPSBuZDsKLSAgICAgQVBpbkRpZmZBcmVhTGF5ZXJfID0gbmw7Ci0KLSAgfQotICBBUGluRGlmZkFyZWFfW251bUFQaW5EaWZmQXJlYV9dID0gdmFsdWU7Ci0gIGlmIChsYXllcikgewotICAgIEFQaW5EaWZmQXJlYUxheWVyX1tudW1BUGluRGlmZkFyZWFfXSA9Ci0gICAgICAgKGNoYXIqKW1hbGxvYyhzdHJsZW4obGF5ZXIpKzEpOwotICAgIHN0cmNweShBUGluRGlmZkFyZWFMYXllcl9bbnVtQVBpbkRpZmZBcmVhX10sCi0gICAgICAgZGVmRGF0YS0+REVGQ0FTRShsYXllcikpOwotICB9IGVsc2UKLSAgICBBUGluRGlmZkFyZWFMYXllcl9bbnVtQVBpbkRpZmZBcmVhX10gPSBOVUxMOwotICBudW1BUGluRGlmZkFyZWFfICs9IDE7Ci19Ci0KLQotdm9pZCBkZWZpUGluOjphZGRBUGluTWF4QXJlYUNhcihpbnQgdmFsdWUsIGNvbnN0IGNoYXIqIGxheWVyKSB7Ci0gIGlmIChudW1BbnRlbm5hTW9kZWxfID09IDApICAgIC8vIGhhdmVuJ3QgY3JlYXRlZCBhbnkgYW50ZW5uYU1vZGVsIHlldAotICAgICBhZGRBbnRlbm5hTW9kZWwoMSk7Ci0gIGFudGVubmFNb2RlbF9bbnVtQW50ZW5uYU1vZGVsXy0xXS0+YWRkQVBpbk1heEFyZWFDYXIodmFsdWUsIGxheWVyKTsKLX0KLQotCi12b2lkIGRlZmlQaW46OmFkZEFQaW5NYXhTaWRlQXJlYUNhcihpbnQgdmFsdWUsIGNvbnN0IGNoYXIqIGxheWVyKSB7Ci0gIGlmIChudW1BbnRlbm5hTW9kZWxfID09IDApICAgIC8vIGhhdmVuJ3QgY3JlYXRlZCBhbnkgYW50ZW5uYU1vZGVsIHlldAotICAgICBhZGRBbnRlbm5hTW9kZWwoMSk7Ci0gIGFudGVubmFNb2RlbF9bbnVtQW50ZW5uYU1vZGVsXy0xXS0+YWRkQVBpbk1heFNpZGVBcmVhQ2FyKHZhbHVlLCBsYXllcik7Ci19Ci0KLQotdm9pZCBkZWZpUGluOjphZGRBUGluUGFydGlhbEN1dEFyZWEoaW50IHZhbHVlLCBjb25zdCBjaGFyKiBsYXllcikgewotICBpZiAobnVtQVBpblBhcnRpYWxDdXRBcmVhXyA9PSBBUGluUGFydGlhbEN1dEFyZWFBbGxvY2F0ZWRfKSB7Ci0gICAgIGludCBpOwotICAgICBpbnQgbWF4OwotICAgICBpbnQgbGltID0gbnVtQVBpblBhcnRpYWxDdXRBcmVhXzsKLSAgICAgaW50KiBuZDsKLSAgICAgY2hhcioqICBubDsKLQotICAgICBpZiAoQVBpblBhcnRpYWxDdXRBcmVhQWxsb2NhdGVkXyA9PSAwKQotICAgICAgICBtYXggPSBBUGluUGFydGlhbEN1dEFyZWFBbGxvY2F0ZWRfID0gMjsKLSAgICAgZWxzZQotICAgICAgICBtYXggPSBBUGluUGFydGlhbEN1dEFyZWFBbGxvY2F0ZWRfICo9IDI7Ci0gICAgIG5kID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKm1heCk7Ci0gICAgIG5sID0gKGNoYXIqKiltYWxsb2Moc2l6ZW9mKGNoYXIqKSptYXgpOwotICAgICBmb3IgKGkgPSAwOyBpIDwgbGltOyBpKyspIHsKLSAgICAgICAgbmRbaV0gPSBBUGluUGFydGlhbEN1dEFyZWFfW2ldOwotICAgICAgICBubFtpXSA9IEFQaW5QYXJ0aWFsQ3V0QXJlYUxheWVyX1tpXTsKLSAgICAgfQotICAgICBmcmVlKChjaGFyKikoQVBpblBhcnRpYWxDdXRBcmVhXykpOwotICAgICBmcmVlKChjaGFyKikoQVBpblBhcnRpYWxDdXRBcmVhTGF5ZXJfKSk7Ci0gICAgIEFQaW5QYXJ0aWFsQ3V0QXJlYV8gPSBuZDsKLSAgICAgQVBpblBhcnRpYWxDdXRBcmVhTGF5ZXJfID0gbmw7Ci0KLSAgfQotICBBUGluUGFydGlhbEN1dEFyZWFfW251bUFQaW5QYXJ0aWFsQ3V0QXJlYV9dID0gdmFsdWU7Ci0gIGlmIChsYXllcikgewotICAgIEFQaW5QYXJ0aWFsQ3V0QXJlYUxheWVyX1tudW1BUGluUGFydGlhbEN1dEFyZWFfXSA9Ci0gICAgICAgKGNoYXIqKW1hbGxvYyhzdHJsZW4obGF5ZXIpKzEpOwotICAgIHN0cmNweShBUGluUGFydGlhbEN1dEFyZWFMYXllcl9bbnVtQVBpblBhcnRpYWxDdXRBcmVhX10sCi0gICAgICAgZGVmRGF0YS0+REVGQ0FTRShsYXllcikpOwotICB9IGVsc2UKLSAgICBBUGluUGFydGlhbEN1dEFyZWFMYXllcl9bbnVtQVBpblBhcnRpYWxDdXRBcmVhX10gPSBOVUxMOwotICBudW1BUGluUGFydGlhbEN1dEFyZWFfICs9IDE7Ci19Ci0KLQotdm9pZCBkZWZpUGluOjphZGRBUGluTWF4Q3V0Q2FyKGludCB2YWx1ZSwgY29uc3QgY2hhciogbGF5ZXIpIHsKLSAgaWYgKG51bUFudGVubmFNb2RlbF8gPT0gMCkgICAgLy8gaGF2ZW4ndCBjcmVhdGVkIGFueSBhbnRlbm5hTW9kZWwgeWV0Ci0gICAgIGFkZEFudGVubmFNb2RlbCgxKTsKLSAgYW50ZW5uYU1vZGVsX1tudW1BbnRlbm5hTW9kZWxfLTFdLT5hZGRBUGluTWF4Q3V0Q2FyKHZhbHVlLCBsYXllcik7Ci19Ci0KLQotaW50IGRlZmlQaW46Omhhc1NwZWNpYWwoKSBjb25zdCB7Ci0gIHJldHVybiAoaW50KWhhc1NwZWNpYWxfOwotfQotCi0KLWludCBkZWZpUGluOjpoYXNBUGluUGFydGlhbE1ldGFsQXJlYSgpIGNvbnN0IHsKLSAgcmV0dXJuIG51bUFQaW5QYXJ0aWFsTWV0YWxBcmVhXyA/IDEgOiAwIDsKLX0KLQotCi1pbnQgZGVmaVBpbjo6aGFzQVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhKCkgY29uc3QgewotICByZXR1cm4gbnVtQVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhXyA/IDEgOiAwIDsKLX0KLQotCi1pbnQgZGVmaVBpbjo6aGFzQVBpbkRpZmZBcmVhKCkgY29uc3QgewotICByZXR1cm4gbnVtQVBpbkRpZmZBcmVhXyA/IDEgOiAwIDsKLX0KLQotCi1pbnQgZGVmaVBpbjo6aGFzQVBpblBhcnRpYWxDdXRBcmVhKCkgY29uc3QgewotICByZXR1cm4gbnVtQVBpblBhcnRpYWxDdXRBcmVhXyA/IDEgOiAwIDsKLX0KLQotCi1pbnQgZGVmaVBpbjo6bnVtQVBpblBhcnRpYWxNZXRhbEFyZWEoKSBjb25zdCB7Ci0gIHJldHVybiBudW1BUGluUGFydGlhbE1ldGFsQXJlYV87Ci19Ci0KLQotaW50IGRlZmlQaW46Om51bUFQaW5QYXJ0aWFsTWV0YWxTaWRlQXJlYSgpIGNvbnN0IHsKLSAgcmV0dXJuIG51bUFQaW5QYXJ0aWFsTWV0YWxTaWRlQXJlYV87Ci19Ci0KLQotaW50IGRlZmlQaW46Om51bUFQaW5EaWZmQXJlYSgpIGNvbnN0IHsKLSAgcmV0dXJuIG51bUFQaW5EaWZmQXJlYV87Ci19Ci0KLQotaW50IGRlZmlQaW46Om51bUFQaW5QYXJ0aWFsQ3V0QXJlYSgpIGNvbnN0IHsKLSAgcmV0dXJuIG51bUFQaW5QYXJ0aWFsQ3V0QXJlYV87Ci19Ci0KLQotaW50IGRlZmlQaW46OkFQaW5QYXJ0aWFsTWV0YWxBcmVhKGludCBpKSBjb25zdCB7Ci0gIHJldHVybiBBUGluUGFydGlhbE1ldGFsQXJlYV9baV07Ci19Ci0KLQotaW50IGRlZmlQaW46Omhhc0FQaW5QYXJ0aWFsTWV0YWxBcmVhTGF5ZXIoaW50IGkpIGNvbnN0IHsKLSAgcmV0dXJuIChBUGluUGFydGlhbE1ldGFsQXJlYUxheWVyX1tpXSAmJgotICAgICAgICAgICooQVBpblBhcnRpYWxNZXRhbEFyZWFMYXllcl9baV0pKSA/IDEgOiAwIDsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpUGluOjpBUGluUGFydGlhbE1ldGFsQXJlYUxheWVyKGludCBpKSBjb25zdCB7Ci0gIHJldHVybiBBUGluUGFydGlhbE1ldGFsQXJlYUxheWVyX1tpXTsKLX0KLQotCi1pbnQgZGVmaVBpbjo6QVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhKGludCBpKSBjb25zdCB7Ci0gIHJldHVybiBBUGluUGFydGlhbE1ldGFsU2lkZUFyZWFfW2ldOwotfQotCi0KLWludCBkZWZpUGluOjpoYXNBUGluUGFydGlhbE1ldGFsU2lkZUFyZWFMYXllcihpbnQgaSkgY29uc3QgewotICByZXR1cm4gKEFQaW5QYXJ0aWFsTWV0YWxTaWRlQXJlYUxheWVyX1tpXSAmJgotICAgICAgICAgICooQVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhTGF5ZXJfW2ldKSkgPyAxIDogMCA7Ci19Ci0KLQotY29uc3QgY2hhciogZGVmaVBpbjo6QVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhTGF5ZXIoaW50IGkpIGNvbnN0IHsKLSAgcmV0dXJuIEFQaW5QYXJ0aWFsTWV0YWxTaWRlQXJlYUxheWVyX1tpXTsKLX0KLQotCi1pbnQgZGVmaVBpbjo6QVBpbkRpZmZBcmVhKGludCBpKSBjb25zdCB7Ci0gIHJldHVybiBBUGluRGlmZkFyZWFfW2ldOwotfQotCi0KLWludCBkZWZpUGluOjpoYXNBUGluRGlmZkFyZWFMYXllcihpbnQgaSkgY29uc3QgewotICByZXR1cm4gKEFQaW5EaWZmQXJlYUxheWVyX1tpXSAmJiAqKEFQaW5EaWZmQXJlYUxheWVyX1tpXSkpID8KLSAgICAgICAgICAxIDogMCA7Ci19Ci0KLQotY29uc3QgY2hhciogZGVmaVBpbjo6QVBpbkRpZmZBcmVhTGF5ZXIoaW50IGkpIGNvbnN0IHsKLSAgcmV0dXJuIEFQaW5EaWZmQXJlYUxheWVyX1tpXTsKLX0KLQotCi1pbnQgZGVmaVBpbjo6QVBpblBhcnRpYWxDdXRBcmVhKGludCBpKSBjb25zdCB7Ci0gIHJldHVybiBBUGluUGFydGlhbEN1dEFyZWFfW2ldOwotfQotCi0KLWludCBkZWZpUGluOjpoYXNBUGluUGFydGlhbEN1dEFyZWFMYXllcihpbnQgaSkgY29uc3QgewotICByZXR1cm4gKEFQaW5QYXJ0aWFsQ3V0QXJlYUxheWVyX1tpXSAmJgotICAgICAgICAgICooQVBpblBhcnRpYWxDdXRBcmVhTGF5ZXJfW2ldKSkgPyAxIDogMCA7Ci19Ci0KLQotY29uc3QgY2hhciogZGVmaVBpbjo6QVBpblBhcnRpYWxDdXRBcmVhTGF5ZXIoaW50IGkpIGNvbnN0IHsKLSAgcmV0dXJuIEFQaW5QYXJ0aWFsQ3V0QXJlYUxheWVyX1tpXTsKLX0KLQotCi0vLyA1LjYKLXZvaWQgZGVmaVBpbjo6YWRkUG9seWdvbihjb25zdCBjaGFyKiBsYXllck5hbWUpIHsKLSAgaW50ICpwbXMsICpwZHcsICpwbTsKLSAgaW50IGk7Ci0KLSAgaWYgKG51bVBvbHlzXyA9PSBwb2x5c0FsbG9jYXRlZF8pIHsKLSAgICBjaGFyKiogbmV3bjsKLSAgICBzdHJ1Y3QgZGVmaVBvaW50cyoqIHBvbHk7Ci0gICAgcG9seXNBbGxvY2F0ZWRfID0gKHBvbHlzQWxsb2NhdGVkXyA9PSAwKSA/Ci0gICAgICAgICAgMiA6IHBvbHlzQWxsb2NhdGVkXyAqIDI7Ci0gICAgbmV3biA9IChjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikgKiBwb2x5c0FsbG9jYXRlZF8pOwotICAgIHBvbHkgPSAoc3RydWN0IGRlZmlQb2ludHMqKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZWZpUG9pbnRzKikgKgotICAgICAgICAgICAgcG9seXNBbGxvY2F0ZWRfKTsKLSAgICBwbXMgPSAoaW50KiltYWxsb2MocG9seXNBbGxvY2F0ZWRfICogc2l6ZW9mKGludCkpOwotICAgIHBkdyA9IChpbnQqKW1hbGxvYyhwb2x5c0FsbG9jYXRlZF8gKiBzaXplb2YoaW50KSk7Ci0gICAgcG0gPSAoaW50KiltYWxsb2MocG9seXNBbGxvY2F0ZWRfICogc2l6ZW9mKGludCkpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG51bVBvbHlzXzsgaSsrKSB7Ci0gICAgICBuZXduW2ldID0gcG9seWdvbk5hbWVzX1tpXTsKLSAgICAgIHBvbHlbaV0gPSBwb2x5Z29uc19baV07Ci0gICAgICBwbXNbaV0gID0gcG9seU1pblNwYWNpbmdfW2ldOwotICAgICAgcGR3W2ldICA9IHBvbHlFZmZlY3RpdmVXaWR0aF9baV07Ci0gICAgICBwbVtpXSA9IHBvbHlNYXNrX1tpXTsKLSAgICB9Ci0gICAgaWYgKG51bVBvbHlzXyA+IDApIHsKLSAgICAgIGZyZWUoKGNoYXIqKShwb2x5Z29uc18pKTsKLSAgICAgIGZyZWUoKGNoYXIqKShwb2x5Z29uTmFtZXNfKSk7Ci0gICAgICBmcmVlKChjaGFyKikocG9seU1pblNwYWNpbmdfKSk7Ci0gICAgICBmcmVlKChjaGFyKikocG9seUVmZmVjdGl2ZVdpZHRoXykpOwotICAgICAgZnJlZSgoY2hhciopKHBvbHlNYXNrXykpOwotICAgIH0KLSAgICBwb2x5Z29uTmFtZXNfID0gbmV3bjsKLSAgICBwb2x5Z29uc18gPSBwb2x5OwotICAgIHBvbHlNaW5TcGFjaW5nXyA9IHBtczsKLSAgICBwb2x5RWZmZWN0aXZlV2lkdGhfID0gcGR3OwotICAgIHBvbHlNYXNrXz0gcG07Ci0gIH0KLSAgcG9seWdvbk5hbWVzX1tudW1Qb2x5c19dID0gc3RyZHVwKGxheWVyTmFtZSk7Ci0gIHBvbHlnb25zX1tudW1Qb2x5c19dID0gMDsKLSAgcG9seU1pblNwYWNpbmdfW251bVBvbHlzX10gPSAtMTsKLSAgcG9seUVmZmVjdGl2ZVdpZHRoX1tudW1Qb2x5c19dID0gLTE7Ci0gIHBvbHlNYXNrX1tudW1Qb2x5c19dID0gMDsKLSAgbnVtUG9seXNfICs9IDE7Ci19Ci0KLQotLy8gNS42Ci12b2lkIGRlZmlQaW46OmFkZFBvbHlnb25QdHMoZGVmaUdlb21ldHJpZXMqIGdlb20pIHsKLSAgc3RydWN0IGRlZmlQb2ludHMqIHA7Ci0gIGludCB4LCB5OwotICBpbnQgaTsKLQotICBwID0gKHN0cnVjdCBkZWZpUG9pbnRzKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZWZpUG9pbnRzKSk7Ci0gIHAtPm51bVBvaW50cyA9IGdlb20tPm51bVBvaW50cygpOwotICBwLT54ID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKnAtPm51bVBvaW50cyk7Ci0gIHAtPnkgPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkqcC0+bnVtUG9pbnRzKTsKLSAgZm9yIChpID0gMDsgaSA8IHAtPm51bVBvaW50czsgaSsrKSB7Ci0gICAgZ2VvbS0+cG9pbnRzKGksICZ4LCAmeSk7Ci0gICAgcC0+eFtpXSA9IHg7Ci0gICAgcC0+eVtpXSA9IHk7Ci0gIH0KLSAgcG9seWdvbnNfW251bVBvbHlzXy0xXSA9IHA7Ci19Ci0KLQotLy8gNS42Ci12b2lkIGRlZmlQaW46OmFkZFBvbHlTcGFjaW5nKGludCBtaW5TcGFjaW5nKSB7Ci0gIHBvbHlNaW5TcGFjaW5nX1tudW1Qb2x5c18tMV0gPSBtaW5TcGFjaW5nOwotfQotCi12b2lkIGRlZmlQaW46OmFkZFBvbHlNYXNrKGludCBjb2xvcikgewotICAgIHBvbHlNYXNrX1tudW1Qb2x5c18tMV0gPSBjb2xvcjsKLX0KLQotLy8gNS42Ci12b2lkIGRlZmlQaW46OmFkZFBvbHlEZXNpZ25SdWxlV2lkdGgoaW50IGVmZmVjdGl2ZVdpZHRoKSB7Ci0gIHBvbHlFZmZlY3RpdmVXaWR0aF9bbnVtUG9seXNfLTFdID0gZWZmZWN0aXZlV2lkdGg7Ci19Ci0KLQotLy8gNS42Ci1pbnQgZGVmaVBpbjo6bnVtUG9seWdvbnMoKSBjb25zdCB7Ci0gIHJldHVybiBudW1Qb2x5c187Ci19Ci0KLQotLy8gNS42Ci1jb25zdCBjaGFyKiBkZWZpUGluOjpwb2x5Z29uTmFtZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IG51bVBvbHlzXykgewotICAgIGRlZmlFcnJvcigxLCAwLCAiaW5kZXggb3V0IG9mIGJvdW5kcyIsIGRlZkRhdGEpOwotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBwb2x5Z29uTmFtZXNfW2luZGV4XTsKLX0KLQotLy8gNS42Ci1zdHJ1Y3QgZGVmaVBvaW50cyBkZWZpUGluOjpnZXRQb2x5Z29uKGludCBpbmRleCkgY29uc3QgewotICByZXR1cm4gKihwb2x5Z29uc19baW5kZXhdKTsKLX0KLQotLy8gNS42Ci1pbnQgZGVmaVBpbjo6aGFzUG9seWdvblNwYWNpbmcoaW50IGluZGV4KSBjb25zdHsKLSAgaWYgKHBvbHlNaW5TcGFjaW5nX1tpbmRleF0gPT0gLTEpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiAxOwotfQotCi0vLyA1LjYKLWludCBkZWZpUGluOjpoYXNQb2x5Z29uRGVzaWduUnVsZVdpZHRoKGludCBpbmRleCkgY29uc3R7Ci0gIGlmIChwb2x5RWZmZWN0aXZlV2lkdGhfW2luZGV4XSA9PSAtMSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8vIDUuNgotaW50IGRlZmlQaW46OnBvbHlnb25TcGFjaW5nKGludCBpbmRleCkgY29uc3QgewotICByZXR1cm4gcG9seU1pblNwYWNpbmdfW2luZGV4XTsKLX0KLQotaW50IGRlZmlQaW46OnBvbHlnb25NYXNrKGludCBpbmRleCkgY29uc3QgewotICAgIHJldHVybiBwb2x5TWFza19baW5kZXhdOwotfQotCi0vLyA1LjYKLWludCBkZWZpUGluOjpwb2x5Z29uRGVzaWduUnVsZVdpZHRoKGludCBpbmRleCkgY29uc3QgewotICByZXR1cm4gcG9seUVmZmVjdGl2ZVdpZHRoX1tpbmRleF07Ci19Ci0KLS8vIDUuNgotaW50IGRlZmlQaW46Omhhc05ldEV4cHIoKSBjb25zdCB7Ci0gIHJldHVybiAoaW50KShoYXNOZXRFeHByXyk7Ci19Ci0KLS8vIDUuNgotY29uc3QgY2hhciogZGVmaVBpbjo6bmV0RXhwcigpIGNvbnN0IHsKLSAgcmV0dXJuIG5ldEV4cHJfOwotfQotCi0vLyA1LjYKLWludCBkZWZpUGluOjpoYXNTdXBwbHlTZW5zaXRpdml0eSgpIGNvbnN0IHsKLSAgcmV0dXJuIChpbnQpKGhhc1N1cHBseVNlbnNfKTsKLX0KLQotLy8gNS42Ci1jb25zdCBjaGFyKiBkZWZpUGluOjpzdXBwbHlTZW5zaXRpdml0eSgpIGNvbnN0IHsKLSAgcmV0dXJuIHN1cHBseVNlbnNfOwotfQotCi0vLyA1LjYKLWludCBkZWZpUGluOjpoYXNHcm91bmRTZW5zaXRpdml0eSgpIGNvbnN0IHsKLSAgcmV0dXJuIChpbnQpKGhhc0dyb3VuZFNlbnNfKTsKLX0KLQotLy8gNS42Ci1jb25zdCBjaGFyKiBkZWZpUGluOjpncm91bmRTZW5zaXRpdml0eSgpIGNvbnN0IHsKLSAgcmV0dXJuIGdyb3VuZFNlbnNfOwotfQotCi0vLyA1LjcKLXZvaWQgZGVmaVBpbjo6YWRkVmlhKGNvbnN0IGNoYXIqIHZpYU5hbWUsIGludCBwdFgsIGludCBwdFksIGludCBjb2xvcikgewotCi0gIGlmIChudW1WaWFzXyA+PSB2aWFzQWxsb2NhdGVkXykgewotICAgIGludCBpOwotICAgIGNoYXIqKiBuZXdsOwotICAgIGludCAqbngsICpueSwgKm5tOwotCi0gICAgdmlhc0FsbG9jYXRlZF8gPSB2aWFzQWxsb2NhdGVkXyA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB2aWFzQWxsb2NhdGVkXyAqIDIgOiA4OwotICAgIG5ld2wgPSAoY2hhcioqKW1hbGxvYyh2aWFzQWxsb2NhdGVkXyAqIHNpemVvZihjaGFyKikpOwotICAgIG54ID0gKGludCopbWFsbG9jKHZpYXNBbGxvY2F0ZWRfICogc2l6ZW9mKGludCkpOwotICAgIG55ID0gKGludCopbWFsbG9jKHZpYXNBbGxvY2F0ZWRfICogc2l6ZW9mKGludCkpOwotICAgIG5tID0gKGludCopbWFsbG9jKHZpYXNBbGxvY2F0ZWRfICogc2l6ZW9mKGludCkpOwotIAotICAgIGZvciAoaSA9IDA7IGkgPCBudW1WaWFzXzsgaSsrKSB7Ci0gICAgICAgbmV3bFtpXSA9IHZpYU5hbWVzX1tpXTsKLSAgICAgICBueFtpXSA9IHZpYVhfW2ldOwotICAgICAgIG55W2ldID0gdmlhWV9baV07Ci0gICAgICAgbm1baV0gPSB2aWFNYXNrX1tpXTsKLSAgICB9Ci0gICAgaWYgKG51bVZpYXNfID4gMCkgewotICAgICAgIGZyZWUoKGNoYXIqKXZpYU5hbWVzXyk7Ci0gICAgICAgZnJlZSgoY2hhciopdmlhWF8pOwotICAgICAgIGZyZWUoKGNoYXIqKXZpYVlfKTsKLSAgICAgICBmcmVlKChjaGFyKil2aWFNYXNrXyk7Ci0gICAgfQotICAgIHZpYU5hbWVzXyA9IG5ld2w7Ci0gICAgdmlhWF8gPSBueDsKLSAgICB2aWFZXyA9IG55OwotICAgIHZpYU1hc2tfID0gbm07Ci0gIH0KLSAgdmlhTmFtZXNfW251bVZpYXNfXSA9IChjaGFyKiltYWxsb2Moc3RybGVuKHZpYU5hbWUpKzEpOwotICBzdHJjcHkodmlhTmFtZXNfW251bVZpYXNfXSwgZGVmRGF0YS0+REVGQ0FTRSh2aWFOYW1lKSk7Ci0gIHZpYVhfW251bVZpYXNfXSA9IHB0WDsKLSAgdmlhWV9bbnVtVmlhc19dID0gcHRZOwotICB2aWFNYXNrX1tudW1WaWFzX10gPSBjb2xvcjsKLSAgbnVtVmlhc18gKz0gMTsKLX0KLQotLy8gNS43Ci1pbnQgZGVmaVBpbjo6bnVtVmlhcygpIGNvbnN0IHsKLSAgICByZXR1cm4gbnVtVmlhc187Ci19Ci0KLS8vIDUuNwotY29uc3QgY2hhciogZGVmaVBpbjo6dmlhTmFtZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IG51bVZpYXNfKSB7Ci0gICAgZGVmaUVycm9yKDEsIDAsICJpbmRleCBvdXQgb2YgYm91bmRzIiwgZGVmRGF0YSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIHZpYU5hbWVzX1tpbmRleF07Ci19Ci0KLS8vIDUuNwotaW50IGRlZmlQaW46OnZpYVB0WChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgcmV0dXJuIHZpYVhfW2luZGV4XTsKLX0KLQotLy8gNS43Ci1pbnQgZGVmaVBpbjo6dmlhUHRZKGludCBpbmRleCkgY29uc3QgewotICByZXR1cm4gdmlhWV9baW5kZXhdOwotfQotCi1pbnQgZGVmaVBpbjo6dmlhVG9wTWFzayhpbnQgaW5kZXgpIGNvbnN0IHsKLSAgICBpbnQgY3V0TWFza051bSA9IHZpYU1hc2tfW2luZGV4XSAvIDEwOwotCi0gICAgaWYgKGN1dE1hc2tOdW0pIHsKLSAgICAgICAgcmV0dXJuIGN1dE1hc2tOdW0gLz0gMTA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi1pbnQgZGVmaVBpbjo6dmlhQ3V0TWFzayhpbnQgaW5kZXgpIGNvbnN0IHsKLSAgICBpbnQgY3V0TWFza051bSA9IHZpYU1hc2tfW2luZGV4XSAvIDEwOwotCi0gICAgaWYgKGN1dE1hc2tOdW0pIHsKLSAgICAgICAgcmV0dXJuIGN1dE1hc2tOdW0gJSAxMDsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLWludCBkZWZpUGluOjp2aWFCb3R0b21NYXNrKGludCBpbmRleCkgY29uc3QgewotICAgIHJldHVybiB2aWFNYXNrX1tpbmRleF0gJSAxMDsKLX0KLS8vIDUuNwotdm9pZCBkZWZpUGluOjphZGRQb3J0KCkgewotICBkZWZpUGluUG9ydCoqIHBwOwotICBkZWZpUGluUG9ydCogcHY7Ci0gIGludCBpOwotCi0gIGlmIChudW1Qb3J0c18gPj0gcG9ydHNBbGxvY2F0ZWRfKSB7Ci0gICAgIGlmIChwb3J0c0FsbG9jYXRlZF8gPT0gMCkgewotICAgICAgICBwaW5Qb3J0XyA9IChkZWZpUGluUG9ydCoqKSBtYWxsb2Moc2l6ZW9mKGRlZmlQaW5Qb3J0KikqNCk7Ci0gICAgICAgIHBvcnRzQWxsb2NhdGVkXyA9IDQ7Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgIHBvcnRzQWxsb2NhdGVkXyA9IHBvcnRzQWxsb2NhdGVkXyAqIDI7Ci0gICAgICAgIHBwID0gKGRlZmlQaW5Qb3J0KiopIG1hbGxvYyhzaXplb2YoZGVmaVBpblBvcnQqKSAqCi0gICAgICAgICAgICAgcG9ydHNBbGxvY2F0ZWRfKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVBvcnRzXzsgaSsrKQotICAgICAgICAgICBwcFtpXSA9IHBpblBvcnRfW2ldOwotICAgICAgICBmcmVlKChjaGFyKikocGluUG9ydF8pKTsKLSAgICAgICAgcGluUG9ydF8gPSBwcDsKLSAgICAgfQotICB9Ci0gIHB2ID0gbmV3IGRlZmlQaW5Qb3J0KGRlZkRhdGEpOwotICBwdi0+SW5pdCgpOwotICBwaW5Qb3J0X1tudW1Qb3J0c19dID0gcHY7Ci0gIG51bVBvcnRzXyArPSAxOwotfQotCi0vLyA1LjcKLXZvaWQgZGVmaVBpbjo6YWRkUG9ydExheWVyKGNvbnN0IGNoYXIqIGxheWVyKSB7Ci0gIGludCBpID0gbnVtUG9ydHNfIC0gMTsKLSAgcGluUG9ydF9baV0tPmFkZExheWVyKGxheWVyKTsKLX0KLQotLy8gNS43Ci12b2lkIGRlZmlQaW46OmFkZFBvcnRMYXllclNwYWNpbmcoaW50IG1pblNwYWNpbmcpIHsKLSAgaW50IGkgPSBudW1Qb3J0c18gLSAxOwotICBwaW5Qb3J0X1tpXS0+YWRkTGF5ZXJTcGFjaW5nKG1pblNwYWNpbmcpOwotfQotCi12b2lkIGRlZmlQaW46OmFkZFBvcnRMYXllck1hc2soaW50IGNvbG9yKSB7Ci0gICAgaW50IGkgPSBudW1Qb3J0c18gLSAxOwotICAgIHBpblBvcnRfW2ldLT5hZGRMYXllck1hc2soY29sb3IpOwotfQotCi0vLyA1LjcKLXZvaWQgZGVmaVBpbjo6YWRkUG9ydExheWVyRGVzaWduUnVsZVdpZHRoKGludCBlZmZlY3RpdmVXaWR0aCkgewotICBpbnQgaSA9IG51bVBvcnRzXyAtIDE7Ci0gIHBpblBvcnRfW2ldLT5hZGRMYXllckRlc2lnblJ1bGVXaWR0aChlZmZlY3RpdmVXaWR0aCk7Ci19Ci0KLS8vIDUuNwotdm9pZCBkZWZpUGluOjphZGRQb3J0TGF5ZXJQdHMoaW50IHhsLCBpbnQgeWwsIGludCB4aCwgaW50IHloKSB7Ci0gIGludCBpID0gbnVtUG9ydHNfIC0gMTsKLSAgcGluUG9ydF9baV0tPmFkZExheWVyUHRzKHhsLCB5bCwgeGgsIHloKTsKLX0KLQotLy8gNS43Ci12b2lkIGRlZmlQaW46OmFkZFBvcnRQb2x5Z29uKGNvbnN0IGNoYXIqIGxheWVyTmFtZSkgewotICBpbnQgaSA9IG51bVBvcnRzXyAtIDE7Ci0gIHBpblBvcnRfW2ldLT5hZGRQb2x5Z29uKGxheWVyTmFtZSk7Ci19Ci0KLS8vIDUuNwotdm9pZCBkZWZpUGluOjphZGRQb3J0UG9seVNwYWNpbmcoaW50IG1pblNwYWNpbmcpIHsKLSAgaW50IGkgPSBudW1Qb3J0c18gLSAxOwotICBwaW5Qb3J0X1tpXS0+YWRkUG9seVNwYWNpbmcobWluU3BhY2luZyk7Ci19Ci0KLXZvaWQgZGVmaVBpbjo6YWRkUG9ydFBvbHlNYXNrKGludCBjb2xvcikgewotICAgIGludCBpID0gbnVtUG9ydHNfIC0gMTsKLSAgICBwaW5Qb3J0X1tpXS0+YWRkUG9seU1hc2soY29sb3IpOwotfQotCi0vLyA1LjcKLXZvaWQgZGVmaVBpbjo6YWRkUG9ydFBvbHlEZXNpZ25SdWxlV2lkdGgoaW50IGVmZmVjdGl2ZVdpZHRoKSB7Ci0gIGludCBpID0gbnVtUG9ydHNfIC0gMTsKLSAgcGluUG9ydF9baV0tPmFkZFBvbHlEZXNpZ25SdWxlV2lkdGgoIGVmZmVjdGl2ZVdpZHRoKTsKLX0KLQotLy8gNS43Ci12b2lkIGRlZmlQaW46OmFkZFBvcnRQb2x5Z29uUHRzKGRlZmlHZW9tZXRyaWVzKiBnZW9tKSB7Ci0gIGludCBpID0gbnVtUG9ydHNfIC0gMTsKLSAgcGluUG9ydF9baV0tPmFkZFBvbHlnb25QdHMoZ2VvbSk7Ci19Ci0KLS8vIDUuNwotdm9pZCBkZWZpUGluOjphZGRQb3J0VmlhKGNvbnN0IGNoYXIqIHZpYSwgaW50IHZpYVgsIGludCB2aWFZLCBpbnQgY29sb3IpIHsKLSAgaW50IGkgPSBudW1Qb3J0c18gLSAxOwotICBwaW5Qb3J0X1tpXS0+YWRkVmlhKHZpYSwgdmlhWCwgdmlhWSwgY29sb3IpOwotfQotCi0vLyA1LjcKLXZvaWQgZGVmaVBpbjo6c2V0UG9ydFBsYWNlbWVudChpbnQgdHlwLCBpbnQgeCwgaW50IHksIGludCBvcmllbnQpIHsKLSAgaW50IGkgPSBudW1Qb3J0c18gLSAxOwotICBwaW5Qb3J0X1tpXS0+c2V0UGxhY2VtZW50KHR5cCwgeCwgeSwgb3JpZW50KTsKLX0KLQotLy8gNS43Ci1pbnQgZGVmaVBpbjo6aGFzUG9ydCgpIGNvbnN0IHsKLSAgcmV0dXJuIG51bVBvcnRzXzsKLX0KLQotLy8gNS43Ci1pbnQgZGVmaVBpbjo6bnVtUG9ydHMoKSBjb25zdCB7Ci0gIHJldHVybiBudW1Qb3J0c187Ci19Ci0KLS8vIDUuNwotZGVmaVBpblBvcnQqIGRlZmlQaW46OnBpblBvcnQoaW50IGluZGV4KSBjb25zdCB7Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBudW1Qb3J0c18pIHsKLSAgICBkZWZpRXJyb3IoMSwgMCwgImluZGV4IG91dCBvZiBib3VuZHMiLCBkZWZEYXRhKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gcGluUG9ydF9baW5kZXhdOwotfQotCi12b2lkIGRlZmlQaW46OnByaW50KEZJTEUqIGYpIGNvbnN0IHsKLSAgaW50IHhsLCB5bCwgeGgseWg7Ci0gIGludCBpOwotCi0gIGZwcmludGYoZiwgIlBJTlMgJyVzJyBvbiBuZXQgJyVzJ1xuIiwgcGluTmFtZSgpLAotICAgICAgbmV0TmFtZSgpKTsKLSAgaWYgKGhhc0RpcmVjdGlvbigpKQotICAgIGZwcmludGYoZiwgIisgRElSRUNUSU9OICclcydcbiIsIGRpcmVjdGlvbigpKTsKLSAgaWYgKGhhc05ldEV4cHIoKSkKLSAgICBmcHJpbnRmKGYsICIrIE5FVEVYUFIgJyVzJ1xuIiwgbmV0RXhwcigpKTsKLSAgaWYgKGhhc1N1cHBseVNlbnNpdGl2aXR5KCkpCi0gICAgZnByaW50ZihmLCAiKyBTVVBQTFlTRU5TSVRJVklUWSAnJXMnXG4iLAotICAgICAgICAgICAgICAgc3VwcGx5U2Vuc2l0aXZpdHkoKSk7Ci0gIGlmIChoYXNHcm91bmRTZW5zaXRpdml0eSgpKQotICAgIGZwcmludGYoZiwgIisgR1JPVU5EU0VOU0lUSVZJVFkgJyVzJ1xuIiwKLSAgICAgICAgICAgICAgIGdyb3VuZFNlbnNpdGl2aXR5KCkpOwotICBpZiAoaGFzVXNlKCkpCi0gICAgZnByaW50ZihmLCAiKyBVU0UgJyVzJ1xuIiwgdXNlKCkpOwotICBpZiAoaGFzTGF5ZXIoKSkgewotICAgIGZvciAoaSA9IDA7IGkgPCBudW1MYXllcigpOyBpKyspIHsKLSAgICAgICBib3VuZHMoaSwgJnhsLCAmeWwsICZ4aCwgJnloKTsKLSAgICAgICBmcHJpbnRmKGYsICIrIExBWUVSICclcycgJWQgJWQgJWQgJWRcbiIsCi0gICAgICAgICAgICBsYXllcihpKSwgeGwsIHlsLCB4aCwgeWgpOwotICAgIH0KLSAgfQotICBmb3IgKGkgPSAwOyBpIDwgbnVtUG9seWdvbnMoKTsgaSsrKSB7Ci0gICAgZnByaW50ZihmLCAiKyBQT0xZR09OICVzIiwgcG9seWdvbk5hbWUoaSkpOwotICAgIGlmIChoYXNQb2x5Z29uU3BhY2luZyhpKSkgewotICAgICAgZnByaW50ZihmLCAiIFNQQUNJTkcgJWQiLCBwb2x5Z29uU3BhY2luZyhpKSk7Ci0gICAgfQotICAgIGlmIChoYXNQb2x5Z29uRGVzaWduUnVsZVdpZHRoKGkpKSB7Ci0gICAgICBmcHJpbnRmKGYsICIgREVTSUdOUlVMRVdJRFRIICVkIiwKLSAgICAgICAgICAgICAgcG9seWdvbkRlc2lnblJ1bGVXaWR0aChpKSk7Ci0gICAgfQotICAgIGZwcmludGYoZiwgIlxuIik7Ci0gIH0KLSAgZm9yIChpID0gMDsgaSA8IG51bVZpYXMoKTsgaSsrKSB7Ci0gICAgZnByaW50ZihmLCAiKyBWSUEgJXMgJWQgJWRcbiIsIHZpYU5hbWUoaSksCi0gICAgICAgICAgICB2aWFQdFgoaSksIHZpYVB0WShpKSk7Ci0gIH0KLSAgaWYgKGhhc1BsYWNlbWVudCgpKQotICAgIGZwcmludGYoZiwgIiAgUExBQ0VEICVzJXMlZCAlZFxuIiwKLSAgICBpc0ZpeGVkKCkgPyAiIEZJWEVEIiA6ICIiLAotICAgIGlzQ292ZXIoKSA/ICIgQ09WRVIiIDogIiIsCi0gICAgcGxhY2VtZW50WCgpLAotICAgIHBsYWNlbWVudFkoKSk7Ci0gIGlmIChoYXNTcGVjaWFsKCkpCi0gICAgZnByaW50ZihmLCAiKyBTUEVDSUFMXG4iKTsKLX0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlQaW5DYXAuaHBwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpUGluQ2FwLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU2NWEwNS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlQaW5DYXAuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNDMwICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaWZuZGVmIGRlZmlQaW5DYXBfaAotI2RlZmluZSBkZWZpUGluQ2FwX2gKLQotCi0jaW5jbHVkZSAiZGVmaUtSRGVmcy5ocHAiCi0jaW5jbHVkZSAiZGVmaU1pc2MuaHBwIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLWNsYXNzIGRlZnJEYXRhOwotCi1jbGFzcyBkZWZpUGluQ2FwIHsKLXB1YmxpYzoKLQotICB2b2lkIHNldFBpbihpbnQgcCk7Ci0gIHZvaWQgc2V0Q2FwKGRvdWJsZSBkKTsKLQotICBpbnQgcGluKCkgY29uc3Q7Ci0gIGRvdWJsZSBjYXAoKSBjb25zdDsKLQotICB2b2lkIHByaW50KEZJTEUqIGYpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gIGludCBwaW5fOyAgICAgICAgLy8gcGluIG51bQotICBkb3VibGUgY2FwXzsgICAgIC8vIGNhcGFjaXRhbmNlCi19OwotCi0KLS8vIDUuNQotY2xhc3MgZGVmaVBpbkFudGVubmFNb2RlbCB7Ci1wdWJsaWM6Ci0gIGRlZmlQaW5BbnRlbm5hTW9kZWwoZGVmckRhdGEgKmRhdGEpOwotICB2b2lkIEluaXQoKTsKLQotICB+ZGVmaVBpbkFudGVubmFNb2RlbCgpOwotICB2b2lkIGNsZWFyKCk7Ci0gIHZvaWQgRGVzdHJveSgpOwotCi0gIHZvaWQgc2V0QW50ZW5uYU1vZGVsKGludCBveGlkZSk7Ci0gIHZvaWQgYWRkQVBpbkdhdGVBcmVhKGludCB2YWx1ZSwgY29uc3QgY2hhciogbGF5ZXIpOwotICB2b2lkIGFkZEFQaW5NYXhBcmVhQ2FyKGludCB2YWx1ZSwgY29uc3QgY2hhciogbGF5ZXIpOwotICB2b2lkIGFkZEFQaW5NYXhTaWRlQXJlYUNhcihpbnQgdmFsdWUsIGNvbnN0IGNoYXIqIGxheWVyKTsKLSAgdm9pZCBhZGRBUGluTWF4Q3V0Q2FyKGludCB2YWx1ZSwgY29uc3QgY2hhciogbGF5ZXIpOwotCi0gIGNoYXIqIGFudGVubmFPeGlkZSgpIGNvbnN0OwotCi0gIGludCBoYXNBUGluR2F0ZUFyZWEoKSBjb25zdDsgICAgICAgICAgICAgICAvLyBBTlRFTk5BUElOR0FURUFSRUEKLSAgaW50IG51bUFQaW5HYXRlQXJlYSgpIGNvbnN0OwotICBpbnQgQVBpbkdhdGVBcmVhKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCBoYXNBUGluR2F0ZUFyZWFMYXllcihpbnQgaW5kZXgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBBUGluR2F0ZUFyZWFMYXllcihpbnQgaW5kZXgpIGNvbnN0OwotCi0gIGludCBoYXNBUGluTWF4QXJlYUNhcigpIGNvbnN0OyAgICAgICAgICAgICAvLyBBTlRFTk5BUElOTUFYQVJFQUNBUgotICBpbnQgbnVtQVBpbk1heEFyZWFDYXIoKSBjb25zdDsKLSAgaW50IEFQaW5NYXhBcmVhQ2FyKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCBoYXNBUGluTWF4QXJlYUNhckxheWVyKGludCBpbmRleCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIEFQaW5NYXhBcmVhQ2FyTGF5ZXIoaW50IGluZGV4KSBjb25zdDsKLQotICBpbnQgaGFzQVBpbk1heFNpZGVBcmVhQ2FyKCkgY29uc3Q7ICAgICAgICAgLy8gQU5URU5OQVBJTk1BWFNJREVBUkVBQ0FSCi0gIGludCBudW1BUGluTWF4U2lkZUFyZWFDYXIoKSBjb25zdDsKLSAgaW50IEFQaW5NYXhTaWRlQXJlYUNhcihpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgaGFzQVBpbk1heFNpZGVBcmVhQ2FyTGF5ZXIoaW50IGluZGV4KSBjb25zdDsKLSAgY29uc3QgY2hhciogQVBpbk1heFNpZGVBcmVhQ2FyTGF5ZXIoaW50IGluZGV4KSBjb25zdDsKLQotICBpbnQgaGFzQVBpbk1heEN1dENhcigpIGNvbnN0OyAgICAgICAgICAgICAgLy8gQU5URU5OQVBJTk1BWENVVENBUgotICBpbnQgbnVtQVBpbk1heEN1dENhcigpIGNvbnN0OwotICBpbnQgQVBpbk1heEN1dENhcihpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgaGFzQVBpbk1heEN1dENhckxheWVyKGludCBpbmRleCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIEFQaW5NYXhDdXRDYXJMYXllcihpbnQgaW5kZXgpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gIGNoYXIqIG94aWRlXzsKLQotICBpbnQgbnVtQVBpbkdhdGVBcmVhXzsgICAgICAgICAgICAgICAgICAvLyA1LjQKLSAgaW50IEFQaW5HYXRlQXJlYUFsbG9jYXRlZF87Ci0gIGludCogQVBpbkdhdGVBcmVhXzsgICAgICAgICAgICAgICAgICAgIC8vIDUuNCBBbnRlbm5hUGluR2F0ZUFyZWEKLSAgY2hhcioqIEFQaW5HYXRlQXJlYUxheWVyXzsgICAgICAgICAgICAgLy8gNS40IExheWVyCi0KLSAgaW50IG51bUFQaW5NYXhBcmVhQ2FyXzsgICAgICAgICAgICAgICAgLy8gNS40Ci0gIGludCBBUGluTWF4QXJlYUNhckFsbG9jYXRlZF87Ci0gIGludCogQVBpbk1heEFyZWFDYXJfOyAgICAgICAgICAgICAgICAgIC8vIDUuNCBBbnRlbm5hUGluTWF4QXJlYUNhcgotICBjaGFyKiogQVBpbk1heEFyZWFDYXJMYXllcl87ICAgICAgICAgICAvLyA1LjQgTGF5ZXIKLQotICBpbnQgbnVtQVBpbk1heFNpZGVBcmVhQ2FyXzsgICAgICAgICAgICAvLyA1LjQKLSAgaW50IEFQaW5NYXhTaWRlQXJlYUNhckFsbG9jYXRlZF87Ci0gIGludCogQVBpbk1heFNpZGVBcmVhQ2FyXzsgICAgICAgICAgICAgIC8vIDUuNCBBbnRlbm5hUGluTWF4U2lkZUFyZWFDYXIKLSAgY2hhcioqIEFQaW5NYXhTaWRlQXJlYUNhckxheWVyXzsgICAgICAgLy8gNS40IExheWVyCi0KLSAgaW50IG51bUFQaW5NYXhDdXRDYXJfOyAgICAgICAgICAgICAgICAgLy8gNS40Ci0gIGludCBBUGluTWF4Q3V0Q2FyQWxsb2NhdGVkXzsKLSAgaW50KiBBUGluTWF4Q3V0Q2FyXzsgICAgICAgICAgICAgICAgICAgLy8gNS40IEFudGVubmFQaW5NYXhDdXRDYXIKLSAgY2hhcioqIEFQaW5NYXhDdXRDYXJMYXllcl87ICAgICAgICAgICAgLy8gNS40IExheWVyCi0KLSAgZGVmckRhdGEgKmRlZkRhdGE7Ci19OwotCi1jbGFzcyBkZWZpUGluUG9ydCB7ICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNwotcHVibGljOgotICBkZWZpUGluUG9ydChkZWZyRGF0YSAqZGF0YSk7Ci0gIHZvaWQgSW5pdCgpOwotCi0gIH5kZWZpUGluUG9ydCgpOwotCi0gIHZvaWQgY2xlYXIoKTsKLQotICB2b2lkIGFkZExheWVyKGNvbnN0IGNoYXIqIGxheWVyKTsKLSAgdm9pZCBhZGRMYXllclNwYWNpbmcoaW50IG1pblNwYWNpbmcpOwotICB2b2lkIGFkZExheWVyTWFzayhpbnQgbWFzayk7Ci0gIHZvaWQgYWRkTGF5ZXJEZXNpZ25SdWxlV2lkdGgoaW50IGVmZmVjdGl2ZVdpZHRoKTsKLSAgdm9pZCBhZGRMYXllclB0cyhpbnQgeGwsIGludCB5bCwgaW50IHhoLCBpbnQgeWgpOwotICB2b2lkIGFkZFBvbHlnb24oY29uc3QgY2hhciogbGF5ZXJOYW1lKTsKLSAgdm9pZCBhZGRQb2x5U3BhY2luZyhpbnQgbWluU3BhY2luZyk7Ci0gIHZvaWQgYWRkUG9seU1hc2soaW50IG1hc2spOwotICB2b2lkIGFkZFBvbHlEZXNpZ25SdWxlV2lkdGgoaW50IGVmZmVjdGl2ZVdpZHRoKTsKLSAgdm9pZCBhZGRQb2x5Z29uUHRzKGRlZmlHZW9tZXRyaWVzKiBnZW9tKTsKLSAgdm9pZCBhZGRWaWEoY29uc3QgY2hhciogdmlhLCBpbnQgdmlhWCwgaW50IHZpYVksIGludCBjb2xvciA9IDApOwotICB2b2lkIHNldFBsYWNlbWVudChpbnQgdHlwLCBpbnQgeCwgaW50IHksIGludCBvcmllbnQpOwotCi0gIGludCAgIG51bUxheWVyKCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIGxheWVyKGludCBpbmRleCkgY29uc3Q7Ci0gIHZvaWQgIGJvdW5kcyhpbnQgaW5kZXgsIGludCogeGwsIGludCogeWwsIGludCogeGgsIGludCogeWgpIGNvbnN0OwotICBpbnQgICBoYXNMYXllclNwYWNpbmcoaW50IGluZGV4KSBjb25zdDsKLSAgaW50ICAgaGFzTGF5ZXJEZXNpZ25SdWxlV2lkdGgoaW50IGluZGV4KSBjb25zdDsKLSAgaW50ICAgbGF5ZXJTcGFjaW5nKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCAgIGxheWVyTWFzayhpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgICBsYXllckRlc2lnblJ1bGVXaWR0aChpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgICBudW1Qb2x5Z29ucygpIGNvbnN0OwotICBjb25zdCBjaGFyKiBwb2x5Z29uTmFtZShpbnQgaW5kZXgpIGNvbnN0OwotICBkZWZpUG9pbnRzIGdldFBvbHlnb24oaW50IGluZGV4KSBjb25zdDsKLSAgaW50ICAgaGFzUG9seWdvblNwYWNpbmcoaW50IGluZGV4KSBjb25zdDsKLSAgaW50ICAgaGFzUG9seWdvbkRlc2lnblJ1bGVXaWR0aChpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgICBwb2x5Z29uU3BhY2luZyhpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgICBwb2x5Z29uRGVzaWduUnVsZVdpZHRoKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCAgIHBvbHlnb25NYXNrKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCAgIG51bVZpYXMoKSBjb25zdDsKLSAgY29uc3QgY2hhciogdmlhTmFtZShpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgICB2aWFQdFggKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCAgIHZpYVB0WSAoaW50IGluZGV4KSBjb25zdDsKLSAgaW50ICAgdmlhVG9wTWFzayAoaW50IGluZGV4KSBjb25zdDsKLSAgaW50ICAgdmlhQ3V0TWFzayAoaW50IGluZGV4KSBjb25zdDsKLSAgaW50ICAgdmlhQm90dG9tTWFzayAoaW50IGluZGV4KSBjb25zdDsKLSAgaW50ICAgaGFzUGxhY2VtZW50KCkgY29uc3Q7Ci0gIGludCAgIGlzUGxhY2VkKCkgY29uc3Q7Ci0gIGludCAgIGlzQ292ZXIoKSBjb25zdDsKLSAgaW50ICAgaXNGaXhlZCgpIGNvbnN0OwotICBpbnQgICBwbGFjZW1lbnRYKCkgY29uc3Q7Ci0gIGludCAgIHBsYWNlbWVudFkoKSBjb25zdDsKLSAgaW50ICAgb3JpZW50KCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIG9yaWVudFN0cigpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gIGludCAgICBsYXllcnNBbGxvY2F0ZWRfOwotICBpbnQgICAgbnVtTGF5ZXJzXzsKLSAgY2hhcioqIGxheWVyc187Ci0gIGludCAgICAqbGF5ZXJNaW5TcGFjaW5nXzsKLSAgaW50ICAgICpsYXllckVmZmVjdGl2ZVdpZHRoXzsKLSAgaW50ICAgICp4bF8sICp5bF8sICp4aF8sICp5aF87Ci0gIGludCAgICAqbGF5ZXJNYXNrXzsKLSAgaW50ICAgIHBvbHlzQWxsb2NhdGVkXzsKLSAgaW50ICAgIG51bVBvbHlzXzsKLSAgY2hhcioqIHBvbHlnb25OYW1lc187Ci0gIGludCAgICAqcG9seU1pblNwYWNpbmdfOwotICBpbnQgICAgKnBvbHlNYXNrXzsKLSAgaW50ICAgICpwb2x5RWZmZWN0aXZlV2lkdGhfOwotICBkZWZpUG9pbnRzKiogcG9seWdvbnNfOwotICBpbnQgICAgdmlhc0FsbG9jYXRlZF87Ci0gIGludCAgICBudW1WaWFzXzsKLSAgY2hhcioqIHZpYU5hbWVzXzsKLSAgaW50ICAgICp2aWFYXzsKLSAgaW50ICAgICp2aWFZXzsKLSAgaW50ICAgICp2aWFNYXNrXzsKLSAgY2hhciAgIHBsYWNlVHlwZV87Ci0gIGludCAgICB4XywgeV87Ci0gIGNoYXIgICBvcmllbnRfOwotCi0gIGRlZnJEYXRhICpkZWZEYXRhOwotfTsKLQotY2xhc3MgZGVmaVBpbiB7Ci1wdWJsaWM6Ci0gIGRlZmlQaW4oZGVmckRhdGEgKmRhdGEpOwotICB2b2lkIEluaXQoKTsKLQotICB+ZGVmaVBpbigpOwotICB2b2lkIERlc3Ryb3koKTsKLQotICB2b2lkIFNldHVwKGNvbnN0IGNoYXIqIHBpbk5hbWUsIGNvbnN0IGNoYXIqIG5ldE5hbWUpOwotICB2b2lkIHNldERpcmVjdGlvbihjb25zdCBjaGFyKiBkaXIpOwotICB2b2lkIHNldFVzZShjb25zdCBjaGFyKiB1c2UpOwotICAvLyA1LjYgc2V0TGF5ZXIgaXMgY2hhbmdlZCB0byBhZGRMYXllciBkdWUgdG8gbXVsdGlwbGUgTEFZRVIgYXJlIGFsbG93ZWQKLSAgLy8gaW4gNS42Ci0gIHZvaWQgYWRkTGF5ZXIoY29uc3QgY2hhciogbGF5ZXIpOwotICB2b2lkIGFkZExheWVyTWFzayhpbnQgbWFzayk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS44Ci0gIHZvaWQgYWRkTGF5ZXJTcGFjaW5nKGludCBtaW5TcGFjaW5nKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjYKLSAgdm9pZCBhZGRMYXllckRlc2lnblJ1bGVXaWR0aChpbnQgZWZmZWN0aXZlV2lkdGgpOyAgICAgICAgICAgICAgIC8vIDUuNgotICB2b2lkIGFkZExheWVyUHRzKGludCB4bCwgaW50IHlsLCBpbnQgeGgsIGludCB5aCk7Ci0gIHZvaWQgYWRkUG9seWdvbihjb25zdCBjaGFyKiBsYXllck5hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjYKLSAgdm9pZCBhZGRQb2x5TWFzayhpbnQgbWFzayk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuOAotICB2b2lkIGFkZFBvbHlTcGFjaW5nKGludCBtaW5TcGFjaW5nKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIHZvaWQgYWRkUG9seURlc2lnblJ1bGVXaWR0aChpbnQgZWZmZWN0aXZlV2lkdGgpOyAgICAgICAgICAgICAgICAvLyA1LjYKLSAgdm9pZCBhZGRQb2x5Z29uUHRzKGRlZmlHZW9tZXRyaWVzKiBnZW9tKTsgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNgotICB2b2lkIHNldE5ldEV4cHIoY29uc3QgY2hhciogbmV0RXhwcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIHZvaWQgc2V0U3VwcGx5U2Vucyhjb25zdCBjaGFyKiBwaW5OYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjYKLSAgdm9pZCBzZXRHcm91bmRTZW5zKGNvbnN0IGNoYXIqIHBpbk5hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNgotICB2b2lkIHNldFBsYWNlbWVudChpbnQgdHlwLCBpbnQgeCwgaW50IHksIGludCBvcmllbnQpOwotICB2b2lkIHNldFNwZWNpYWwoKTsKLSAgdm9pZCBhZGRBbnRlbm5hTW9kZWwoaW50IG94aWRlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNQotICB2b2lkIGFkZEFQaW5QYXJ0aWFsTWV0YWxBcmVhKGludCB2YWx1ZSwgY29uc3QgY2hhciogbGF5ZXIpOwotICB2b2lkIGFkZEFQaW5QYXJ0aWFsTWV0YWxTaWRlQXJlYShpbnQgdmFsdWUsIGNvbnN0IGNoYXIqIGxheWVyKTsKLSAgdm9pZCBhZGRBUGluR2F0ZUFyZWEoaW50IHZhbHVlLCBjb25zdCBjaGFyKiBsYXllcik7Ci0gIHZvaWQgYWRkQVBpbkRpZmZBcmVhKGludCB2YWx1ZSwgY29uc3QgY2hhciogbGF5ZXIpOwotICB2b2lkIGFkZEFQaW5NYXhBcmVhQ2FyKGludCB2YWx1ZSwgY29uc3QgY2hhciogbGF5ZXIpOwotICB2b2lkIGFkZEFQaW5NYXhTaWRlQXJlYUNhcihpbnQgdmFsdWUsIGNvbnN0IGNoYXIqIGxheWVyKTsKLSAgdm9pZCBhZGRBUGluUGFydGlhbEN1dEFyZWEoaW50IHZhbHVlLCBjb25zdCBjaGFyKiBsYXllcik7Ci0gIHZvaWQgYWRkQVBpbk1heEN1dENhcihpbnQgdmFsdWUsIGNvbnN0IGNoYXIqIGxheWVyKTsKLSAgdm9pZCBhZGRWaWEoY29uc3QgY2hhciogdmlhLCBpbnQgdmlhWCwgaW50IHZpYVksIGludCBjb2xvciA9IDApOyAgICAgICAgICAgICAgIC8vIDUuNwotICAvLyA1LjcgcG9ydCBzdGF0ZW1lbnRzLCB3aGljaCBtYXkgaGF2ZSBMQVlFUiwgUE9MWUdPTiwgJnwgVklBCi0gIHZvaWQgYWRkUG9ydCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgdm9pZCBhZGRQb3J0TGF5ZXIoY29uc3QgY2hhciogbGF5ZXIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNwotICB2b2lkIGFkZFBvcnRMYXllclNwYWNpbmcoaW50IG1pblNwYWNpbmcpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIHZvaWQgYWRkUG9ydExheWVyRGVzaWduUnVsZVdpZHRoKGludCBlZmZlY3RpdmVXaWR0aCk7ICAgICAgICAgICAvLyA1LjcKLSAgdm9pZCBhZGRQb3J0TGF5ZXJQdHMoaW50IHhsLCBpbnQgeWwsIGludCB4aCwgaW50IHloKTsgICAgICAgICAgIC8vIDUuNwotICB2b2lkIGFkZFBvcnRMYXllck1hc2soaW50IGNvbG9yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS44Ci0gIHZvaWQgYWRkUG9ydFBvbHlnb24oY29uc3QgY2hhciogbGF5ZXJOYW1lKTsgICAgICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgdm9pZCBhZGRQb3J0UG9seVNwYWNpbmcoaW50IG1pblNwYWNpbmcpOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNwotICB2b2lkIGFkZFBvcnRQb2x5RGVzaWduUnVsZVdpZHRoKGludCBlZmZlY3RpdmVXaWR0aCk7ICAgICAgICAgICAgLy8gNS43Ci0gIHZvaWQgYWRkUG9ydFBvbHlnb25QdHMoZGVmaUdlb21ldHJpZXMqIGdlb20pOyAgICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgdm9pZCBhZGRQb3J0UG9seU1hc2soaW50IGNvbG9yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuOAotICB2b2lkIGFkZFBvcnRWaWEoY29uc3QgY2hhciogdmlhLCBpbnQgdmlhWCwgaW50IHZpYVksIGludCBjb2xvciA9IDApOyAgICAgICAgICAgLy8gNS43Ci0gIHZvaWQgc2V0UG9ydFBsYWNlbWVudChpbnQgdHlwLCBpbnQgeCwgaW50IHksIGludCBvcmllbnQpOyAgICAgICAvLyA1LjcgLSA1LjgKLQotICB2b2lkIGNsZWFyKCk7Ci0KLSAgdm9pZCBjaGFuZ2VQaW5OYW1lKGNvbnN0IGNoYXIqIHBpbk5hbWUpOyAgICAgICAvLyBGb3IgT0EgdG8gbW9kaWZ5IHRoZSBwaW5OYW1lCi0KLSAgY29uc3QgY2hhciogcGluTmFtZSgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBuZXROYW1lKCkgY29uc3Q7Ci0gIC8vIG9wdGlvbmFsIHBhcnRzCi0gIGludCBoYXNEaXJlY3Rpb24oKSBjb25zdDsKLSAgaW50IGhhc1VzZSgpIGNvbnN0OwotICBpbnQgaGFzTGF5ZXIoKSBjb25zdDsKLSAgaW50IGhhc1BsYWNlbWVudCgpIGNvbnN0OwotICBpbnQgaXNVbnBsYWNlZCgpIGNvbnN0OwotICBpbnQgaXNQbGFjZWQoKSBjb25zdDsKLSAgaW50IGlzQ292ZXIoKSBjb25zdDsKLSAgaW50IGlzRml4ZWQoKSBjb25zdDsKLSAgaW50IHBsYWNlbWVudFgoKSBjb25zdDsKLSAgaW50IHBsYWNlbWVudFkoKSBjb25zdDsKLSAgY29uc3QgY2hhciogZGlyZWN0aW9uKCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIHVzZSgpIGNvbnN0OwotICBpbnQgbnVtTGF5ZXIoKSBjb25zdDsKLSAgY29uc3QgY2hhciogbGF5ZXIoaW50IGluZGV4KSBjb25zdDsKLSAgdm9pZCBib3VuZHMoaW50IGluZGV4LCBpbnQqIHhsLCBpbnQqIHlsLCBpbnQqIHhoLCBpbnQqIHloKSBjb25zdDsKLSAgaW50IGxheWVyTWFzayhpbnQgaW5kZXgpIGNvbnN0OyAgICAgICAgICAgICAgICAgICAgIC8vIDUuOAotICBpbnQgaGFzTGF5ZXJTcGFjaW5nKGludCBpbmRleCkgY29uc3Q7ICAgICAgICAgICAgICAgLy8gNS42Ci0gIGludCBoYXNMYXllckRlc2lnblJ1bGVXaWR0aChpbnQgaW5kZXgpIGNvbnN0OyAgICAgICAvLyA1LjYKLSAgaW50IGxheWVyU3BhY2luZyhpbnQgaW5kZXgpIGNvbnN0OyAgICAgICAgICAgICAgICAgIC8vIDUuNgotICBpbnQgbGF5ZXJEZXNpZ25SdWxlV2lkdGgoaW50IGluZGV4KSBjb25zdDsgICAgICAgICAgLy8gNS42Ci0gIGludCAgbnVtUG9seWdvbnMoKSBjb25zdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjYKLSAgY29uc3QgIGNoYXIqIHBvbHlnb25OYW1lKGludCBpbmRleCkgY29uc3Q7ICAgICAgICAgIC8vIDUuNgotICBkZWZpUG9pbnRzIGdldFBvbHlnb24oaW50IGluZGV4KSBjb25zdDsgICAgICAvLyA1LjYKLSAgaW50IHBvbHlnb25NYXNrKGludCBpbmRleCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgICAgIC8vIDUuOAotICBpbnQgaGFzUG9seWdvblNwYWNpbmcoaW50IGluZGV4KSBjb25zdDsgICAgICAgICAgICAgLy8gNS42Ci0gIGludCBoYXNQb2x5Z29uRGVzaWduUnVsZVdpZHRoKGludCBpbmRleCkgY29uc3Q7ICAgICAvLyA1LjYKLSAgaW50IHBvbHlnb25TcGFjaW5nKGludCBpbmRleCkgY29uc3Q7ICAgICAgICAgICAgICAgIC8vIDUuNgotICBpbnQgcG9seWdvbkRlc2lnblJ1bGVXaWR0aChpbnQgaW5kZXgpIGNvbnN0OyAgICAgICAgLy8gNS42Ci0gIGludCAgaGFzTmV0RXhwcigpIGNvbnN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjYKLSAgaW50ICBoYXNTdXBwbHlTZW5zaXRpdml0eSgpIGNvbnN0OyAgICAgICAgICAgICAgICAgIC8vIDUuNgotICBpbnQgIGhhc0dyb3VuZFNlbnNpdGl2aXR5KCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIGNvbnN0IGNoYXIqIG5ldEV4cHIoKSBjb25zdDsgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjYKLSAgY29uc3QgY2hhciogc3VwcGx5U2Vuc2l0aXZpdHkoKSBjb25zdDsgICAgICAgICAgICAgIC8vIDUuNgotICBjb25zdCBjaGFyKiBncm91bmRTZW5zaXRpdml0eSgpIGNvbnN0OyAgICAgICAgICAgICAgLy8gNS42Ci0gIGludCBvcmllbnQoKSBjb25zdDsKLSAgY29uc3QgY2hhciogb3JpZW50U3RyKCkgY29uc3Q7Ci0gIGludCBoYXNTcGVjaWFsKCkgY29uc3Q7Ci0gIGludCBudW1WaWFzKCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgY29uc3QgY2hhciogdmlhTmFtZShpbnQgaW5kZXgpIGNvbnN0OyAgICAgICAgICAgICAgIC8vIDUuNwotICBpbnQgdmlhVG9wTWFzayhpbnQgaW5kZXgpIGNvbnN0OyAgICAgICAgICAgICAgICAgICAgLy8gNS44Ci0gIGludCB2aWFDdXRNYXNrKGludCBpbmRleCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgICAvLyA1LjgKLSAgaW50IHZpYUJvdHRvbU1hc2soaW50IGluZGV4KSBjb25zdDsgICAgICAgICAgICAgICAgIC8vIDUuOAotICBpbnQgdmlhUHRYIChpbnQgaW5kZXgpIGNvbnN0OyAgICAgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIGludCB2aWFQdFkgKGludCBpbmRleCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjcKLQotICAvLyA1LjQKLSAgaW50IGhhc0FQaW5QYXJ0aWFsTWV0YWxBcmVhKCkgY29uc3Q7ICAgICAgIC8vIEFOVEVOTkFQSU5QQVJUSUFMTUVUQUxBUkVBCi0gIGludCBudW1BUGluUGFydGlhbE1ldGFsQXJlYSgpIGNvbnN0OwotICBpbnQgQVBpblBhcnRpYWxNZXRhbEFyZWEoaW50IGluZGV4KSBjb25zdDsKLSAgaW50IGhhc0FQaW5QYXJ0aWFsTWV0YWxBcmVhTGF5ZXIoaW50IGluZGV4KSBjb25zdDsKLSAgY29uc3QgY2hhciogQVBpblBhcnRpYWxNZXRhbEFyZWFMYXllcihpbnQgaW5kZXgpIGNvbnN0OwotCi0gIGludCBoYXNBUGluUGFydGlhbE1ldGFsU2lkZUFyZWEoKSBjb25zdDsgICAvLyBBTlRFTk5BUElOUEFSVElBTE1FVEFMU0lERUFSRUEKLSAgaW50IG51bUFQaW5QYXJ0aWFsTWV0YWxTaWRlQXJlYSgpIGNvbnN0OwotICBpbnQgQVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCBoYXNBUGluUGFydGlhbE1ldGFsU2lkZUFyZWFMYXllcihpbnQgaW5kZXgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBBUGluUGFydGlhbE1ldGFsU2lkZUFyZWFMYXllcihpbnQgaW5kZXgpIGNvbnN0OwotCi0gIGludCBoYXNBUGluRGlmZkFyZWEoKSBjb25zdDsgICAgICAgICAgICAgICAvLyBBTlRFTk5BUElORElGRkFSRUEKLSAgaW50IG51bUFQaW5EaWZmQXJlYSgpIGNvbnN0OwotICBpbnQgQVBpbkRpZmZBcmVhKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCBoYXNBUGluRGlmZkFyZWFMYXllcihpbnQgaW5kZXgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBBUGluRGlmZkFyZWFMYXllcihpbnQgaW5kZXgpIGNvbnN0OwotCi0gIGludCBoYXNBUGluUGFydGlhbEN1dEFyZWEoKSBjb25zdDsgICAgICAgICAvLyBBTlRFTk5BUElOUEFSVElBTENVVEFSRUEKLSAgaW50IG51bUFQaW5QYXJ0aWFsQ3V0QXJlYSgpIGNvbnN0OwotICBpbnQgQVBpblBhcnRpYWxDdXRBcmVhKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCBoYXNBUGluUGFydGlhbEN1dEFyZWFMYXllcihpbnQgaW5kZXgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBBUGluUGFydGlhbEN1dEFyZWFMYXllcihpbnQgaW5kZXgpIGNvbnN0OwotCi0gIC8vIDUuNQotICBpbnQgbnVtQW50ZW5uYU1vZGVsKCkgY29uc3Q7Ci0gIGRlZmlQaW5BbnRlbm5hTW9kZWwqIGFudGVubmFNb2RlbChpbnQgaW5kZXgpIGNvbnN0OwotCi0gIC8vIDUuNwotICBpbnQgIGhhc1BvcnQoKSBjb25zdDsKLSAgaW50ICBudW1Qb3J0cygpIGNvbnN0OwotICBkZWZpUGluUG9ydCogcGluUG9ydChpbnQgaW5kZXgpIGNvbnN0OwotICB2b2lkIHByaW50KEZJTEUqIGYpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gIGludCBwaW5OYW1lTGVuZ3RoXzsgICAgLy8gYWxsb2NhdGVkIHNpemUgb2YgcGluIG5hbWUKLSAgY2hhciogcGluTmFtZV87Ci0gIGludCBuZXROYW1lTGVuZ3RoXzsgICAgLy8gYWxsb2NhdGVkIHNpemUgb2YgbmV0IG5hbWUKLSAgY2hhciogbmV0TmFtZV87Ci0gIGNoYXIgaGFzRGlyZWN0aW9uXzsKLSAgY2hhciBoYXNVc2VfOwotICBjaGFyIHBsYWNlVHlwZV87Ci0gIGNoYXIgb3JpZW50XzsgICAgICAgICAgLy8gb3JpZW50IDAtNwotICBpbnQgdXNlTGVuZ3RoXzsgICAgICAgIC8vIGFsbG9jYXRlZCBzaXplIG9mIGxlbmd0aAotICBjaGFyKiB1c2VfOwotICBpbnQgZGlyZWN0aW9uTGVuZ3RoXzsgIC8vIGFsbG9jYXRlZCBzaXplIG9mIGRpcmVjdGlvbgotICBjaGFyKiBkaXJlY3Rpb25fOwotICBjaGFyKiogbGF5ZXJzXzsgICAgICAgICAgICAgICAgICAgLy8gNS42LCBjaGFuZ2VkIHRvIGFycmF5Ci0gIGludCAqeGxfLCAqeWxfLCAqeGhfLCAqeWhfOyAgICAgICAvLyA1LjYsIGNoYW5nZWQgdG8gYXJyYXlzCi0gIGludCAqbGF5ZXJNaW5TcGFjaW5nXzsgICAgICAgICAgICAvLyA1LjYsIFNQQUNJTkcgaW4gTEFZRVIKLSAgaW50ICpsYXllckVmZmVjdGl2ZVdpZHRoXzsgICAgICAgIC8vIDUuNiwgREVTSUdOUlVMRVdJRFRIIGluIExBWUVSCi0gIGludCBsYXllcnNBbGxvY2F0ZWRfOyAgICAgICAgICAgICAvLyA1LjYKLSAgaW50IG51bUxheWVyc187ICAgICAgICAgICAgICAgICAgIC8vIDUuNgotICBpbnQgKmxheWVyTWFza187ICAgICAgICAgICAgICAgICAgLy8gNS44Ci0gIGNoYXIqKiBwb2x5Z29uTmFtZXNfOyAgICAgICAgICAgICAvLyA1LjYgbGF5ZXJOYW1lIGZvciBQT0xZR09OCi0gIGludCAqcG9seU1pblNwYWNpbmdfOyAgICAgICAgICAgICAvLyA1LjYsIFNQQUNJTkcgaW4gUE9MWUdPTgotICBpbnQgKnBvbHlFZmZlY3RpdmVXaWR0aF87ICAgICAgICAgLy8gNS42LCBERVNJR05SVUxFV0lEVEggaW4gUE9MWUdPTgotICBpbnQgKnBvbHlNYXNrXzsgICAgICAgICAgICAgICAgICAgLy8gNS44Ci0gIGludCBudW1Qb2x5c187ICAgICAgICAgICAgICAgICAgICAvLyA1LjYKLSAgaW50IHBvbHlzQWxsb2NhdGVkXzsgICAgICAgICAgICAgIC8vIDUuNgotICBkZWZpUG9pbnRzKiogcG9seWdvbnNfOyAgICAvLyA1LjYgCi0gIGludCB4XywgeV87ICAgICAgICAgICAgLy8gcGxhY2VtZW50Ci0gIGludCBoYXNTcGVjaWFsXzsKLSAgaW50IG51bVZpYXNfOyAgICAgICAgICAgICAgICAgICAgIC8vIDUuNwotICBpbnQgdmlhc0FsbG9jYXRlZF87ICAgICAgICAgICAgICAgLy8gNS43Ci0gIGNoYXIqKiB2aWFOYW1lc187ICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgaW50ICp2aWFYXzsgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNwotICBpbnQgKnZpYVlfOyAgICAgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIGludCAqdmlhTWFza187ICAgICAgICAgICAgICAgICAgICAvLyA1LjgKLSAgaW50IG51bVBvcnRzXzsgICAgICAgICAgICAgICAgICAgIC8vIDUuNwotICBpbnQgcG9ydHNBbGxvY2F0ZWRfOyAgICAgICAgICAgICAgLy8gNS43Ci0gIGRlZmlQaW5Qb3J0ICoqIHBpblBvcnRfOyAgICAgICAgICAvLyA1LjcKLQotICAvLyA1LjUgQW50ZW5uYU1vZGVsCi0gIGludCBudW1BbnRlbm5hTW9kZWxfOwotICBpbnQgYW50ZW5uYU1vZGVsQWxsb2NhdGVkXzsKLSAgZGVmaVBpbkFudGVubmFNb2RlbCoqIGFudGVubmFNb2RlbF87Ci0KLSAgaW50IG51bUFQaW5QYXJ0aWFsTWV0YWxBcmVhXzsgICAgICAgICAgLy8gNS40Ci0gIGludCBBUGluUGFydGlhbE1ldGFsQXJlYUFsbG9jYXRlZF87Ci0gIGludCogQVBpblBhcnRpYWxNZXRhbEFyZWFfOyAgICAgICAgICAgIC8vIDUuNCBBbnRlbm5hUGluUGFydGlhbE1ldGFsQXJlYQotICBjaGFyKiogQVBpblBhcnRpYWxNZXRhbEFyZWFMYXllcl87ICAgICAvLyA1LjQgTGF5ZXIKLQotICBpbnQgbnVtQVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhXzsgICAgICAvLyA1LjQKLSAgaW50IEFQaW5QYXJ0aWFsTWV0YWxTaWRlQXJlYUFsbG9jYXRlZF87Ci0gIGludCogQVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhXzsgICAgICAgIC8vIDUuNCBBbnRlbm5hUGluUGFydGlhbE1ldGFsU2lkZUFyZWEKLSAgY2hhcioqIEFQaW5QYXJ0aWFsTWV0YWxTaWRlQXJlYUxheWVyXzsgLy8gNS40IExheWVyCi0KLSAgaW50IG51bUFQaW5EaWZmQXJlYV87ICAgICAgICAgICAgICAgICAgLy8gNS40Ci0gIGludCBBUGluRGlmZkFyZWFBbGxvY2F0ZWRfOwotICBpbnQqIEFQaW5EaWZmQXJlYV87ICAgICAgICAgICAgICAgICAgICAvLyA1LjQgQW50ZW5uYVBpbkRpZmZBcmVhCi0gIGNoYXIqKiBBUGluRGlmZkFyZWFMYXllcl87ICAgICAgICAgICAgIC8vIDUuNCBMYXllcgotCi0gIGludCBudW1BUGluUGFydGlhbEN1dEFyZWFfOyAgICAgICAgICAgIC8vIDUuNAotICBpbnQgQVBpblBhcnRpYWxDdXRBcmVhQWxsb2NhdGVkXzsKLSAgaW50KiBBUGluUGFydGlhbEN1dEFyZWFfOyAgICAgICAgICAgICAgLy8gNS40IEFudGVubmFQaW5QYXJ0aWFsQ3V0QXJlYQotICBjaGFyKiogQVBpblBhcnRpYWxDdXRBcmVhTGF5ZXJfOyAgICAgICAvLyA1LjQgTGF5ZXIKLQotICBpbnQgbmV0RXhwckxlbmd0aF87ICAgICAgICAgICAgICAgICAgICAvLyA1LjYKLSAgY2hhciBoYXNOZXRFeHByXzsgICAgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIGNoYXIqIG5ldEV4cHJfOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNgotICBpbnQgc3VwcGx5U2Vuc0xlbmd0aF87ICAgICAgICAgICAgICAgICAvLyA1LjYKLSAgY2hhciBoYXNTdXBwbHlTZW5zXzsgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIGNoYXIqIHN1cHBseVNlbnNfOyAgICAgICAgICAgICAgICAgICAgIC8vIDUuNgotICBpbnQgZ3JvdW5kU2Vuc0xlbmd0aF87ICAgICAgICAgICAgICAgICAvLyA1LjYKLSAgY2hhciBoYXNHcm91bmRTZW5zXzsgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIGNoYXIqIGdyb3VuZFNlbnNfOyAgICAgICAgICAgICAgICAgICAgIC8vIDUuNgotCi0gIGRlZnJEYXRhICpkZWZEYXRhOwotfTsKLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLVVTRV9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaVBpblByb3AuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpUGluUHJvcC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYjVmYTAuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpUGluUHJvcC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMyAtIDIwMTUsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSAibGV4LmgiCi0jaW5jbHVkZSAiZGVmaURlYnVnLmhwcCIKLSNpbmNsdWRlICJkZWZpUGluUHJvcC5ocHAiCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vICAgICAgICBkZWZpUGluUHJvcAotLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCi0KLWRlZmlQaW5Qcm9wOjpkZWZpUGluUHJvcChkZWZyRGF0YSAqZGF0YSkKLTogZGVmRGF0YShkYXRhKQotewotICBJbml0KCk7Ci19Ci0KLQotdm9pZCBkZWZpUGluUHJvcDo6SW5pdCgpIHsKLSAgaW5zdE5hbWVfID0gKGNoYXIqKW1hbGxvYygxNik7Ci0gIHBpbk5hbWVfID0gKGNoYXIqKW1hbGxvYygxNik7Ci0gIHBpbk5hbWVTaXplXyA9IDE2OwotICBpbnN0TmFtZVNpemVfID0gMTY7Ci0gIGlzUGluXyA9IDA7Ci0gIG51bVByb3BzXyA9IDA7Ci0gIHByb3BzQWxsb2NhdGVkXyA9IDI7Ci0gIHByb3BOYW1lc18gICA9IChjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikqMik7Ci0gIHByb3BWYWx1ZXNfICA9IChjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikqMik7Ci0gIHByb3BEVmFsdWVzXyA9IChkb3VibGUqKW1hbGxvYyhzaXplb2YoZG91YmxlKSoyKTsKLSAgcHJvcFR5cGVzXyAgID0gKGNoYXIqKW1hbGxvYyhzaXplb2YoY2hhcikqMik7Ci19Ci0KLQotZGVmaVBpblByb3A6On5kZWZpUGluUHJvcCgpIHsKLSAgRGVzdHJveSgpOwotfQotCi0KLXZvaWQgZGVmaVBpblByb3A6OkRlc3Ryb3koKSB7Ci0gIGNsZWFyKCk7Ci0gIGZyZWUoaW5zdE5hbWVfKTsKLSAgZnJlZShwaW5OYW1lXyk7Ci0gIGZyZWUoKGNoYXIqKShwcm9wTmFtZXNfKSk7Ci0gIGZyZWUoKGNoYXIqKShwcm9wVmFsdWVzXykpOwotICBmcmVlKChjaGFyKikocHJvcERWYWx1ZXNfKSk7Ci0gIGZyZWUoKGNoYXIqKShwcm9wVHlwZXNfKSk7Ci19Ci0KLQotdm9pZCBkZWZpUGluUHJvcDo6Y2xlYXIoKSB7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgbnVtUHJvcHNfOyBpKyspIHsKLSAgICBmcmVlKHByb3BOYW1lc19baV0pOwotICAgIGZyZWUocHJvcFZhbHVlc19baV0pOwotICAgIHByb3BEVmFsdWVzX1tpXSA9IDA7Ci0gIH0KLSAgbnVtUHJvcHNfID0gMDsKLSAgaXNQaW5fID0gMDsKLX0KLQotCi12b2lkIGRlZmlQaW5Qcm9wOjpzZXROYW1lKGNvbnN0IGNoYXIqIGluc3QsIGNvbnN0IGNoYXIqIHBpbikgewotICBpbnQgbGVuID0gc3RybGVuKGluc3QpICsgMTsKLQotICBpZiAoKHN0cmNtcChpbnN0LCAiUElOIikgPT0gMCkgfHwgKHN0cmNtcChpbnN0LCJwaW4iKSA9PSAwKSkgewotICAgICBpc1Bpbl8gPSAxOwotICAgICBpbnN0TmFtZV9bMF0gPSAnXDAnOyAvKiBtYWtlIHN1cmUgdG8gY2xlYXIgYW55IHByZXYgaW5zdCAqLwotICB9IGVsc2UgewotICAgICBpZiAoaW5zdE5hbWVTaXplXyA8IGxlbikgewotICAgICAgIGluc3ROYW1lU2l6ZV8gPSBsZW47Ci0gICAgICAgZnJlZShpbnN0TmFtZV8pOwotICAgICAgIGluc3ROYW1lXyA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgICAgfQotICAgICBzdHJjcHkoaW5zdE5hbWVfLCBkZWZEYXRhLT5ERUZDQVNFKGluc3QpKTsKLSAgfQotCi0gIGxlbiA9IHN0cmxlbihwaW4pICsgMTsKLSAgaWYgKHBpbk5hbWVTaXplXyA8IGxlbikgewotICAgIHBpbk5hbWVTaXplXyA9IGxlbjsKLSAgICBmcmVlKHBpbk5hbWVfKTsKLSAgICBwaW5OYW1lXyA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgfQotICBzdHJjcHkocGluTmFtZV8sIGRlZkRhdGEtPkRFRkNBU0UocGluKSk7Ci19Ci0KLQotaW50IGRlZmlQaW5Qcm9wOjppc1BpbigpIGNvbnN0IHsKLSAgcmV0dXJuIGlzUGluXyA/IDEgOiAwOwotfQotCi0KLWNvbnN0IGNoYXIqIGRlZmlQaW5Qcm9wOjppbnN0TmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGluc3ROYW1lXzsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpUGluUHJvcDo6cGluTmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHBpbk5hbWVfOwotfQotCi0KLXZvaWQgZGVmaVBpblByb3A6OmFkZFByb3BlcnR5KGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciB0eXBlKSB7Ci0gIGludCBsZW47Ci0gIGlmIChudW1Qcm9wc18gPT0gcHJvcHNBbGxvY2F0ZWRfKSB7Ci0gICAgaW50IGk7Ci0gICAgY2hhcioqICBubjsKLSAgICBjaGFyKiogIG52OwotICAgIGRvdWJsZSogbmQ7Ci0gICAgY2hhciogICBudDsKLQotICAgIHByb3BzQWxsb2NhdGVkXyAqPSAyOwotICAgIG5uID0gKGNoYXIqKiltYWxsb2Moc2l6ZW9mKGNoYXIqKSpwcm9wc0FsbG9jYXRlZF8pOwotICAgIG52ID0gKGNoYXIqKiltYWxsb2Moc2l6ZW9mKGNoYXIqKSpwcm9wc0FsbG9jYXRlZF8pOwotICAgIG5kID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpKnByb3BzQWxsb2NhdGVkXyk7Ci0gICAgbnQgPSAoY2hhciopbWFsbG9jKHNpemVvZihjaGFyKSpwcm9wc0FsbG9jYXRlZF8pOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1Qcm9wc187IGkrKykgewotICAgICAgbm5baV0gPSBwcm9wTmFtZXNfW2ldOwotICAgICAgbnZbaV0gPSBwcm9wVmFsdWVzX1tpXTsKLSAgICAgIG5kW2ldID0gcHJvcERWYWx1ZXNfW2ldOwotICAgICAgbnRbaV0gPSBwcm9wVHlwZXNfW2ldOwotICAgIH0KLSAgICBmcmVlKChjaGFyKikocHJvcE5hbWVzXykpOwotICAgIGZyZWUoKGNoYXIqKShwcm9wVmFsdWVzXykpOwotICAgIGZyZWUoKGNoYXIqKShwcm9wRFZhbHVlc18pKTsKLSAgICBmcmVlKChjaGFyKikocHJvcFR5cGVzXykpOwotICAgIHByb3BOYW1lc18gICA9IG5uOwotICAgIHByb3BWYWx1ZXNfICA9IG52OwotICAgIHByb3BEVmFsdWVzXyA9IG5kOwotICAgIHByb3BUeXBlc18gICA9IG50OwotICB9Ci0gIGxlbiA9IHN0cmxlbihuYW1lKSArIDE7Ci0gIHByb3BOYW1lc19bbnVtUHJvcHNfXSA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgc3RyY3B5KHByb3BOYW1lc19bbnVtUHJvcHNfXSwgZGVmRGF0YS0+REVGQ0FTRShuYW1lKSk7Ci0gIGxlbiA9IHN0cmxlbih2YWx1ZSkgKyAxOwotICBwcm9wVmFsdWVzX1tudW1Qcm9wc19dID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICBzdHJjcHkocHJvcFZhbHVlc19bbnVtUHJvcHNfXSwgZGVmRGF0YS0+REVGQ0FTRSh2YWx1ZSkpOwotICBwcm9wRFZhbHVlc19bbnVtUHJvcHNfXSA9IDA7Ci0gIHByb3BUeXBlc19bbnVtUHJvcHNfXSA9IHR5cGU7Ci0gIG51bVByb3BzXyArPSAxOwotfQotCi0KLXZvaWQgZGVmaVBpblByb3A6OmFkZE51bVByb3BlcnR5KGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGRvdWJsZSBkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFsdWUsIGNvbnN0IGNoYXIgdHlwZSkgewotICBpbnQgbGVuOwotICBpZiAobnVtUHJvcHNfID09IHByb3BzQWxsb2NhdGVkXykgewotICAgIGludCBpOwotICAgIGNoYXIqKiAgbm47Ci0gICAgY2hhcioqICBudjsKLSAgICBkb3VibGUqIG5kOwotICAgIGNoYXIqICAgbnQ7Ci0KLSAgICBwcm9wc0FsbG9jYXRlZF8gKj0gMjsKLSAgICBubiA9IChjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikqcHJvcHNBbGxvY2F0ZWRfKTsKLSAgICBudiA9IChjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikqcHJvcHNBbGxvY2F0ZWRfKTsKLSAgICBuZCA9IChkb3VibGUqKW1hbGxvYyhzaXplb2YoZG91YmxlKSpwcm9wc0FsbG9jYXRlZF8pOwotICAgIG50ID0gKGNoYXIqKW1hbGxvYyhzaXplb2YoY2hhcikqcHJvcHNBbGxvY2F0ZWRfKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUHJvcHNfOyBpKyspIHsKLSAgICAgIG5uW2ldID0gcHJvcE5hbWVzX1tpXTsKLSAgICAgIG52W2ldID0gcHJvcFZhbHVlc19baV07Ci0gICAgICBuZFtpXSA9IHByb3BEVmFsdWVzX1tpXTsKLSAgICAgIG50W2ldID0gcHJvcFR5cGVzX1tpXTsKLSAgICB9Ci0gICAgZnJlZSgoY2hhciopKHByb3BOYW1lc18pKTsKLSAgICBmcmVlKChjaGFyKikocHJvcFZhbHVlc18pKTsKLSAgICBmcmVlKChjaGFyKikocHJvcERWYWx1ZXNfKSk7Ci0gICAgZnJlZSgoY2hhciopKHByb3BUeXBlc18pKTsKLSAgICBwcm9wTmFtZXNfICAgPSBubjsKLSAgICBwcm9wVmFsdWVzXyAgPSBudjsKLSAgICBwcm9wRFZhbHVlc18gPSBuZDsKLSAgICBwcm9wVHlwZXNfICAgPSBudDsKLSAgfQotICBsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotICBwcm9wTmFtZXNfW251bVByb3BzX10gPSAoY2hhciopbWFsbG9jKGxlbik7Ci0gIHN0cmNweShwcm9wTmFtZXNfW251bVByb3BzX10sIGRlZkRhdGEtPkRFRkNBU0UobmFtZSkpOwotICBsZW4gPSBzdHJsZW4odmFsdWUpICsgMTsKLSAgcHJvcFZhbHVlc19bbnVtUHJvcHNfXSA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgc3RyY3B5KHByb3BWYWx1ZXNfW251bVByb3BzX10sIGRlZkRhdGEtPkRFRkNBU0UodmFsdWUpKTsKLSAgcHJvcERWYWx1ZXNfW251bVByb3BzX10gPSBkOwotICBwcm9wVHlwZXNfW251bVByb3BzX10gPSB0eXBlOwotICBudW1Qcm9wc18gKz0gMTsKLX0KLQotCi1pbnQgZGVmaVBpblByb3A6Om51bVByb3BzKCkgY29uc3QgewotICByZXR1cm4gbnVtUHJvcHNfOwotfQotCi0KLWNvbnN0IGNoYXIqIGRlZmlQaW5Qcm9wOjpwcm9wTmFtZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgY2hhciBtc2dbMTYwXTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1Qcm9wc18pIHsKLSAgICAgc3ByaW50ZiAobXNnLCAiRVJST1IgKERFRlBBUlMtNjEyMCk6IFRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgUElOIFBST1BFUlRZIGlzIGludmFsaWRlLlxuVmFsaWQgaW5kZXggbnVtYmVyIGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgICAgaW5kZXgsIG51bVByb3BzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MTIwLCBtc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gcHJvcE5hbWVzX1tpbmRleF07Ci19Ci0KLQotY29uc3QgY2hhciogZGVmaVBpblByb3A6OnByb3BWYWx1ZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgY2hhciBtc2dbMTYwXTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1Qcm9wc18pIHsKLSAgICAgc3ByaW50ZiAobXNnLCAiRVJST1IgKERFRlBBUlMtNjEyMCk6IFRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgUElOIFBST1BFUlRZIGlzIGludmFsaWRlLlxuVmFsaWQgaW5kZXggbnVtYmVyIGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgICAgaW5kZXgsIG51bVByb3BzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MTIwLCBtc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gcHJvcFZhbHVlc19baW5kZXhdOwotfQotCi0KLWRvdWJsZSBkZWZpUGluUHJvcDo6cHJvcE51bWJlcihpbnQgaW5kZXgpIGNvbnN0IHsKLSAgY2hhciBtc2dbMTYwXTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1Qcm9wc18pIHsKLSAgICAgc3ByaW50ZiAobXNnLCAiRVJST1IgKERFRlBBUlMtNjEyMCk6IFRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgUElOIFBST1BFUlRZIGlzIGludmFsaWRlLlxuVmFsaWQgaW5kZXggbnVtYmVyIGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgICAgaW5kZXgsIG51bVByb3BzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MTIwLCBtc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gcHJvcERWYWx1ZXNfW2luZGV4XTsKLX0KLQotCi1jb25zdCBjaGFyIGRlZmlQaW5Qcm9wOjpwcm9wVHlwZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgY2hhciBtc2dbMTYwXTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1Qcm9wc18pIHsKLSAgICAgc3ByaW50ZiAobXNnLCAiRVJST1IgKERFRlBBUlMtNjEyMCk6IFRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgUElOIFBST1BFUlRZIGlzIGludmFsaWRlLlxuVmFsaWQgaW5kZXggbnVtYmVyIGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgICAgaW5kZXgsIG51bVByb3BzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MTIwLCBtc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gcHJvcFR5cGVzX1tpbmRleF07Ci19Ci0KLQotaW50IGRlZmlQaW5Qcm9wOjpwcm9wSXNOdW1iZXIoaW50IGluZGV4KSBjb25zdCB7Ci0gIGNoYXIgbXNnWzE2MF07Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtUHJvcHNfKSB7Ci0gICAgIHNwcmludGYgKG1zZywgIkVSUk9SIChERUZQQVJTLTYxMjApOiBUaGUgaW5kZXggbnVtYmVyICVkIHNwZWNpZmllZCBmb3IgdGhlIFBJTiBQUk9QRVJUWSBpcyBpbnZhbGlkZS5cblZhbGlkIGluZGV4IG51bWJlciBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIsCi0gICAgICAgICAgICAgIGluZGV4LCBudW1Qcm9wc18pOwotICAgICBkZWZpRXJyb3IoMCwgNjEyMCwgbXNnLCBkZWZEYXRhKTsKLSAgICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIHByb3BEVmFsdWVzX1tpbmRleF0gPyAxIDogMDsKLX0KLQotCi1pbnQgZGVmaVBpblByb3A6OnByb3BJc1N0cmluZyhpbnQgaW5kZXgpIGNvbnN0IHsKLSAgY2hhciBtc2dbMTYwXTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1Qcm9wc18pIHsKLSAgICAgc3ByaW50ZiAobXNnLCAiRVJST1IgKERFRlBBUlMtNjEyMCk6IFRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgUElOIFBST1BFUlRZIGlzIGludmFsaWRlLlxuVmFsaWQgaW5kZXggbnVtYmVyIGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgICAgaW5kZXgsIG51bVByb3BzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MTIwLCBtc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gcHJvcERWYWx1ZXNfW2luZGV4XSA/IDAgOiAxOwotfQotCi0KLXZvaWQgZGVmaVBpblByb3A6OnByaW50KEZJTEUqIGYpIGNvbnN0IHsKLSAgaW50IGk7Ci0KLSAgZnByaW50ZihmLCAiUGluUHJvcCAlcyAlc1xuIiwgaW5zdE5hbWUoKSwKLSAgICAgcGluTmFtZSgpKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgbnVtUHJvcHMoKTsgaSsrKSB7Ci0gICAgZnByaW50ZihmLCAiICAgICVzICVzXG4iLCBwcm9wTmFtZShpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BWYWx1ZShpKSk7Ci0gIH0KLX0KLQotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpUGluUHJvcC5ocHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlQaW5Qcm9wLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFiYWQ3NC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlQaW5Qcm9wLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaWZuZGVmIGRlZmlQaW5Qcm9wX2gKLSNkZWZpbmUgZGVmaVBpblByb3BfaAotCi0jaW5jbHVkZSAiZGVmaUtSRGVmcy5ocHAiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotY2xhc3MgZGVmckRhdGE7Ci0KLWNsYXNzIGRlZmlQaW5Qcm9wIHsKLXB1YmxpYzoKLSAgZGVmaVBpblByb3AoZGVmckRhdGEgKmRhdGEpOwotICB2b2lkIEluaXQoKTsKLQotICB+ZGVmaVBpblByb3AoKTsKLSAgdm9pZCBEZXN0cm95KCk7Ci0KLSAgdm9pZCBjbGVhcigpOwotCi0gIHZvaWQgc2V0TmFtZShjb25zdCBjaGFyKiBpbnN0LCBjb25zdCBjaGFyKiBwaW4pOwotICB2b2lkIGFkZFByb3BlcnR5KGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHZhbHVlLCBjb25zdCBjaGFyIHR5cGUpOwotICB2b2lkIGFkZE51bVByb3BlcnR5KGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGRvdWJsZSBkLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhbHVlLCBjb25zdCBjaGFyIHR5cGUpOwotCi0gIGludCBpc1BpbigpIGNvbnN0OwotICBjb25zdCBjaGFyKiBpbnN0TmFtZSgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBwaW5OYW1lKCkgY29uc3Q7Ci0KLSAgaW50IG51bVByb3BzKCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqICBwcm9wTmFtZShpbnQgaW5kZXgpIGNvbnN0OwotICBjb25zdCBjaGFyKiAgcHJvcFZhbHVlKGludCBpbmRleCkgY29uc3Q7Ci0gIGRvdWJsZSBwcm9wTnVtYmVyKGludCBpbmRleCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIgICBwcm9wVHlwZShpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgICAgcHJvcElzTnVtYmVyKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCAgICBwcm9wSXNTdHJpbmcoaW50IGluZGV4KSBjb25zdDsKLQotICB2b2lkIHByaW50KEZJTEUqIGYpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gIGNoYXIgaXNQaW5fOwotICBpbnQgaW5zdE5hbWVTaXplXzsKLSAgY2hhciogaW5zdE5hbWVfOwotICBpbnQgcGluTmFtZVNpemVfOwotICBjaGFyKiBwaW5OYW1lXzsKLQotICBpbnQgbnVtUHJvcHNfOwotICBpbnQgcHJvcHNBbGxvY2F0ZWRfOwotICBjaGFyKiogIHByb3BOYW1lc187Ci0gIGNoYXIqKiAgcHJvcFZhbHVlc187Ci0gIGRvdWJsZSogcHJvcERWYWx1ZXNfOwotICBjaGFyKiAgIHByb3BUeXBlc187Ci0KLSAgZGVmckRhdGEgKmRlZkRhdGE7Ci19OwotCi0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1VU0VfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlQcm9wLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaVByb3AuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDMwOTEzLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaVByb3AuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTMgLSAyMDE1LCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgImxleC5oIgotI2luY2x1ZGUgImRlZmlQcm9wLmhwcCIKLSNpbmNsdWRlICJkZWZpRGVidWcuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1kZWZpUHJvcDo6ZGVmaVByb3AoZGVmckRhdGEgKmRhdGEpCi06IGRlZkRhdGEoZGF0YSkKLXsKLSAgSW5pdCgpOwotfQotCi0KLXZvaWQgZGVmaVByb3A6OkluaXQoKSB7Ci0gIHN0cmluZ0xlbmd0aF8gPSAxNjsKLSAgc3RyaW5nRGF0YV8gPSAoY2hhciopbWFsbG9jKDE2KTsKLSAgbmFtZVNpemVfID0gMTY7Ci0gIHByb3BOYW1lXyA9IChjaGFyKiltYWxsb2MoMTYpOwotICBjbGVhcigpOwotfQotCi0KLXZvaWQgZGVmaVByb3A6OkRlc3Ryb3koKSB7Ci0gIGZyZWUoc3RyaW5nRGF0YV8pOwotICBmcmVlKHByb3BOYW1lXyk7Ci19Ci0KLQotZGVmaVByb3A6On5kZWZpUHJvcCgpIHsKLSAgRGVzdHJveSgpOwotfQotCi0KLXZvaWQgZGVmaVByb3A6OnNldFByb3BUeXBlKGNvbnN0IGNoYXIqIHR5cCwgY29uc3QgY2hhciogc3RyaW5nKSB7Ci0gIGludCBsZW47Ci0gIHByb3BUeXBlXyA9IChjaGFyKil0eXA7Ci0gIGlmICgobGVuID0gc3RybGVuKHN0cmluZykrMSkgPiBuYW1lU2l6ZV8pCi0gICAgYnVtcE5hbWUobGVuKTsKLSAgc3RyY3B5KHByb3BOYW1lXywgZGVmRGF0YS0+REVGQ0FTRShzdHJpbmcpKTsKLX0KLQotCi12b2lkIGRlZmlQcm9wOjpzZXRSYW5nZShkb3VibGUgbGVmdCwgZG91YmxlIHJpZ2h0KSB7Ci0gIGhhc1JhbmdlXyA9IDE7Ci0gIGxlZnRfID0gbGVmdDsKLSAgcmlnaHRfID0gcmlnaHQ7Ci19Ci0KLQotdm9pZCBkZWZpUHJvcDo6c2V0TnVtYmVyKGRvdWJsZSBkKSB7Ci0gIGhhc051bWJlcl8gPSAxOwotICBkXyA9IGQ7Ci19Ci0KLQotdm9pZCBkZWZpUHJvcDo6c2V0UHJvcEludGVnZXIoKSB7Ci0gIGRhdGFUeXBlXyA9ICdJJzsKLX0KLQotCi12b2lkIGRlZmlQcm9wOjpzZXRQcm9wUmVhbCgpIHsKLSAgZGF0YVR5cGVfID0gJ1InOwotfQotCi0KLXZvaWQgZGVmaVByb3A6OnNldFByb3BTdHJpbmcoKSB7Ci0gIGRhdGFUeXBlXyA9ICdTJzsKLX0KLQotCi12b2lkIGRlZmlQcm9wOjpzZXRQcm9wTmFtZU1hcFN0cmluZyhjb25zdCBjaGFyKiBzdHJpbmcpIHsKLSAgaW50IGxlbjsKLSAgZGF0YVR5cGVfID0gJ04nOwotICBoYXNOYW1lTWFwU3RyaW5nXyA9IDE7Ci0gIGlmICgobGVuID0gc3RybGVuKHN0cmluZykrMSkgPiBzdHJpbmdMZW5ndGhfKQotICAgIGJ1bXBTaXplKGxlbik7Ci0gIHN0cmNweShzdHJpbmdEYXRhXywgZGVmRGF0YS0+REVGQ0FTRShzdHJpbmcpKTsKLX0KLQotCi12b2lkIGRlZmlQcm9wOjpzZXRQcm9wUVN0cmluZyhjb25zdCBjaGFyKiBzdHJpbmcpIHsKLSAgaW50IGxlbjsKLSAgZGF0YVR5cGVfID0gJ1EnOwotICBpZiAoKGxlbiA9IHN0cmxlbihzdHJpbmcpKzEpID4gc3RyaW5nTGVuZ3RoXykKLSAgICBidW1wU2l6ZShsZW4pOwotICBzdHJjcHkoc3RyaW5nRGF0YV8sIGRlZkRhdGEtPkRFRkNBU0Uoc3RyaW5nKSk7Ci19Ci0KLQotY29uc3QgY2hhciogZGVmaVByb3A6OnN0cmluZygpIGNvbnN0IHsKLSAgcmV0dXJuIHN0cmluZ0RhdGFfOwotfQotCi0KLWNvbnN0IGNoYXIqIGRlZmlQcm9wOjpwcm9wVHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHByb3BUeXBlXzsKLX0KLQotCi1pbnQgZGVmaVByb3A6Omhhc05hbWVNYXBTdHJpbmcoKSBjb25zdCB7Ci0gIHJldHVybiAoaW50KShoYXNOYW1lTWFwU3RyaW5nXyk7Ci19Ci0KLQotaW50IGRlZmlQcm9wOjpoYXNOdW1iZXIoKSBjb25zdCB7Ci0gIHJldHVybiAoaW50KShoYXNOdW1iZXJfKTsKLX0KLQotCi1pbnQgZGVmaVByb3A6Omhhc1JhbmdlKCkgY29uc3QgewotICByZXR1cm4gKGludCkoaGFzUmFuZ2VfKTsKLX0KLQotCi1kb3VibGUgZGVmaVByb3A6Om51bWJlcigpIGNvbnN0IHsKLSAgcmV0dXJuIGRfOwotfQotCi0KLWRvdWJsZSBkZWZpUHJvcDo6bGVmdCgpIGNvbnN0IHsKLSAgcmV0dXJuIGxlZnRfOwotfQotCi0KLWRvdWJsZSBkZWZpUHJvcDo6cmlnaHQoKSBjb25zdCB7Ci0gIHJldHVybiByaWdodF87Ci19Ci0KLQotdm9pZCBkZWZpUHJvcDo6YnVtcFNpemUoaW50IHNpemUpIHsKLSAgZnJlZShzdHJpbmdEYXRhXyk7Ci0gIHN0cmluZ0RhdGFfID0gKGNoYXIqKW1hbGxvYyhzaXplKTsKLSAgc3RyaW5nTGVuZ3RoXyA9IHNpemU7Ci0gICooc3RyaW5nRGF0YV8pID0gJ1wwJzsKLX0KLQotCi12b2lkIGRlZmlQcm9wOjpidW1wTmFtZShpbnQgc2l6ZSkgewotICBmcmVlKHByb3BOYW1lXyk7Ci0gIHByb3BOYW1lXyA9IChjaGFyKiltYWxsb2Moc2l6ZSk7Ci0gIG5hbWVTaXplXyA9IHNpemU7Ci0gICoocHJvcE5hbWVfKSA9ICdcMCc7Ci19Ci0KLQotCi12b2lkIGRlZmlQcm9wOjpjbGVhcigpIHsKLSAgaWYgKHN0cmluZ0RhdGFfKQotICAgICAqKHN0cmluZ0RhdGFfKSA9ICdcMCc7Ci0gIGlmIChwcm9wTmFtZV8pCi0gICAgICoocHJvcE5hbWVfKSA9ICdcMCc7Ci0gIHByb3BUeXBlXyA9IDA7Ci0gIGhhc1JhbmdlXyA9IDA7Ci0gIGhhc051bWJlcl8gPSAwOwotICBoYXNOYW1lTWFwU3RyaW5nXyA9IDA7Ci0gIGRhdGFUeXBlXyA9ICdCJzsgLyogYm9ndXMgKi8KLSAgZF8gPSBsZWZ0XyA9IHJpZ2h0XyA9IDAuMDsKLX0KLQotCi1pbnQgZGVmaVByb3A6Omhhc1N0cmluZygpIGNvbnN0IHsKLSAgcmV0dXJuICooc3RyaW5nRGF0YV8pID8gMSA6IDAgOwotfQotCi0KLWNvbnN0IGNoYXIqIGRlZmlQcm9wOjpwcm9wTmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIChwcm9wTmFtZV8pOwotfQotCi0KLWNoYXIgZGVmaVByb3A6OmRhdGFUeXBlKCkgY29uc3QgewotICByZXR1cm4gKGRhdGFUeXBlXyk7Ci19Ci0KLQotdm9pZCBkZWZpUHJvcDo6cHJpbnQoRklMRSogZikgY29uc3QgewotICBmcHJpbnRmKGYsICJQcm9wIHR5cGUgJyVzJ1xuIiwgcHJvcFR5cGUoKSk7Ci0gIGlmIChoYXNTdHJpbmcoKSkgewotICAgIGZwcmludGYoZiwgIiAgc3RyaW5nICclcydcbiIsIHN0cmluZygpKTsKLSAgfQotICBpZiAoaGFzTnVtYmVyKCkpIHsKLSAgICBmcHJpbnRmKGYsICIgIG51bWJlciAlNS4yZlxuIiwgbnVtYmVyKCkpOwotICB9Ci0gIGlmIChoYXNSYW5nZSgpKSB7Ci0gICAgZnByaW50ZihmLCAiICByYW5nZSAlNS4yZiAtICU1LjJmXG4iLAotICAgICAgbGVmdCgpLCByaWdodCgpKTsKLSAgfQotfQotCi0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlQcm9wLmhwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaVByb3AuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2I0Y2Q0Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaVByb3AuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMywgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpZm5kZWYgZGVmaVByb3BfaAotI2RlZmluZSBkZWZpUHJvcF9oCi0KLSNpbmNsdWRlICJkZWZpS1JEZWZzLmhwcCIKLSNpbmNsdWRlIDxzdGRpby5oPgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1jbGFzcyBkZWZyRGF0YTsKLQotLy8gU3RydWN0IGhvbGRzIHRoZSBkYXRhIGZvciBvbmUgcHJvcGVydHkuCi1jbGFzcyBkZWZpUHJvcCB7Ci1wdWJsaWM6Ci0gIGRlZmlQcm9wKGRlZnJEYXRhICpkYXRhKTsKLSAgdm9pZCBJbml0KCk7Ci0KLSAgdm9pZCBEZXN0cm95KCk7Ci0gIH5kZWZpUHJvcCgpOwotCi0gIHZvaWQgc2V0UHJvcFR5cGUoY29uc3QgY2hhciogdHlwLCBjb25zdCBjaGFyKiBzdHJpbmcpOwotICB2b2lkIHNldFJhbmdlKGRvdWJsZSBsZWZ0LCBkb3VibGUgcmlnaHQpOwotICB2b2lkIHNldE51bWJlcihkb3VibGUgbnVtKTsKLSAgdm9pZCBzZXRQcm9wSW50ZWdlcigpOwotICB2b2lkIHNldFByb3BSZWFsKCk7Ci0gIHZvaWQgc2V0UHJvcFN0cmluZygpOwotICB2b2lkIHNldFByb3BRU3RyaW5nKGNvbnN0IGNoYXIqIHN0cmluZyk7Ci0gIHZvaWQgc2V0UHJvcE5hbWVNYXBTdHJpbmcoY29uc3QgY2hhciogc3RyaW5nKTsKLSAgdm9pZCBjbGVhcigpOwotCi0gIGNvbnN0IGNoYXIqIHN0cmluZygpIGNvbnN0OwotICBjb25zdCBjaGFyKiBwcm9wVHlwZSgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBwcm9wTmFtZSgpIGNvbnN0OwotICBjaGFyICBkYXRhVHlwZSgpIGNvbnN0OwotICAgICAgIC8vIGVpdGhlciBJOmludGVnZXIgUjpyZWFsIFM6c3RyaW5nIFE6cXVvdGVkc3RyaW5nIE46bmFtZU1hcFN0cmluZwotICBpbnQgaGFzTnVtYmVyKCkgY29uc3Q7Ci0gIGludCBoYXNSYW5nZSgpIGNvbnN0OwotICBpbnQgaGFzU3RyaW5nKCkgY29uc3Q7Ci0gIGludCBoYXNOYW1lTWFwU3RyaW5nKCkgY29uc3Q7Ci0gIGRvdWJsZSBudW1iZXIoKSBjb25zdDsKLSAgZG91YmxlIGxlZnQoKSBjb25zdDsKLSAgZG91YmxlIHJpZ2h0KCkgY29uc3Q7Ci0KLSAgdm9pZCBidW1wU2l6ZShpbnQgc2l6ZSk7Ci0gIHZvaWQgYnVtcE5hbWUoaW50IHNpemUpOwotCi0gIHZvaWQgcHJpbnQoRklMRSogZikgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgY2hhciogcHJvcFR5cGVfOyAgICAgIC8vICJkZXNpZ24iIC4uLgotICBjaGFyKiBwcm9wTmFtZV87ICAgICAgLy8gbmFtZS4KLSAgaW50IG5hbWVTaXplXzsgICAgICAgIC8vIGFsbG9jYXRlZCBzaXplIG9mIG5hbWUuCi0gIGNoYXIgaGFzUmFuZ2VfOyAgICAgICAvLyBlaXRoZXIgMDpOTyBvciAxOllFUy4KLSAgY2hhciBoYXNOdW1iZXJfOyAgICAgIC8vIGVpdGhlciAwOk5PIG9yIDE6WUVTLgotICBjaGFyIGhhc05hbWVNYXBTdHJpbmdfOwotICBjaGFyIGRhdGFUeXBlXzsgICAgICAgLy8gZWl0aGVyIEk6aW50ZWdlciBSOnJlYWwgUzpzdHJpbmcgUTpxdW90ZWRzdHJpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIE46bmFtZU1hcFN0cmluZwotICBjaGFyKiBzdHJpbmdEYXRhXzsgICAgLy8gaWYgaXQgaXMgYSBzdHJpbmcgdGhlIGRhdGEgaXMgaGVyZS4KLSAgaW50IHN0cmluZ0xlbmd0aF87ICAgIC8vIGFsbG9jYXRlZCBzaXplIG9mIHN0cmluZ0RhdGEuCi0gIGRvdWJsZSBsZWZ0XywgcmlnaHRfOyAvLyBpZiBpdCBoYXMgYSByYW5nZSB0aGUgbnVtYmVycyBhcmUgaGVyZS4KLSAgZG91YmxlIGRfOyAgICAgICAgICAgIC8vIGlmIGl0IGlzIGEgcmVhbCBvciBpbnQgdGhlIG51bWJlciBpcyBoZXJlLgotCi0gIGRlZnJEYXRhICpkZWZEYXRhOwotfTsKLQotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotVVNFX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpUHJvcFR5cGUuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpUHJvcFR5cGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGEyODVjLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaVByb3BUeXBlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEzIC0gMjAxNSwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJsZXguaCIKLSNpbmNsdWRlICJkZWZpUHJvcFR5cGUuaHBwIgotI2luY2x1ZGUgImRlZmlEZWJ1Zy5ocHAiCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLQotZGVmaVByb3BUeXBlOjpkZWZpUHJvcFR5cGUoKSB7Ci0gIEluaXQoKTsKLX0KLQotCi12b2lkIGRlZmlQcm9wVHlwZTo6SW5pdCgpIHsKLSAgbnVtUHJvcGVydGllc18gPSAwOwotICBwcm9wZXJ0aWVzQWxsb2NhdGVkXyA9IDA7Ci0gIHByb3BOYW1lc18gPSAwOwotICBwcm9wVHlwZXNfID0gMDsKLX0KLQotCi12b2lkIGRlZmlQcm9wVHlwZTo6Q2xlYXIoKSB7Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1Qcm9wZXJ0aWVzXzsgaSsrKSB7Ci0gICAgZnJlZShwcm9wTmFtZXNfW2ldKTsKLSAgfQotICBudW1Qcm9wZXJ0aWVzXyA9IDA7Ci0gIHByb3BlcnRpZXNBbGxvY2F0ZWRfID0gMDsKLX0KLQotCi12b2lkIGRlZmlQcm9wVHlwZTo6RGVzdHJveSgpIHsKLSAgQ2xlYXIoKTsKLSAgaWYgKHByb3BOYW1lc18pCi0gICAgIGZyZWUocHJvcE5hbWVzXyk7Ci0gIGlmIChwcm9wVHlwZXNfKQotICAgICBmcmVlKHByb3BUeXBlc18pOwotfQotCi0KLWRlZmlQcm9wVHlwZTo6fmRlZmlQcm9wVHlwZSgpIHsKLSAgRGVzdHJveSgpOwotfQotCi0KLXZvaWQgZGVmaVByb3BUeXBlOjpzZXRQcm9wVHlwZShjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyIHR5cGUpIHsKLSAgaW50IGxlbjsKLQotICBpZiAobnVtUHJvcGVydGllc18gPT0gcHJvcGVydGllc0FsbG9jYXRlZF8pCi0gICAgYnVtcFByb3BzKCk7Ci0gIGxlbiA9IHN0cmxlbihuYW1lKSArIDE7Ci0gIHByb3BOYW1lc19bbnVtUHJvcGVydGllc19dID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICBzdHJjcHkocHJvcE5hbWVzX1tudW1Qcm9wZXJ0aWVzX10sIG5hbWUpOwotICBwcm9wVHlwZXNfW251bVByb3BlcnRpZXNfXSA9IHR5cGU7Ci0gIG51bVByb3BlcnRpZXNfICs9IDE7Ci19Ci0KLQotdm9pZCBkZWZpUHJvcFR5cGU6OmJ1bXBQcm9wcygpIHsKLSAgaW50IGxpbSA9IHByb3BlcnRpZXNBbGxvY2F0ZWRfOwotICBpbnQgbmV3cyA7Ci0gIGNoYXIqKiBuZXdwbjsKLSAgY2hhciogICBuZXd0OwotIAotICBuZXdzID0gbGltID8gbGltICsgbGltIDogMjsKLSAKLSAgbmV3cG4gPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKm5ld3MpOwotICBuZXd0ID0gKGNoYXIqKW1hbGxvYyhzaXplb2YoY2hhcikqbmV3cyk7Ci0gCi0gIGxpbSA9IHByb3BlcnRpZXNBbGxvY2F0ZWRfID0gbmV3czsKLSAKLSAgaWYgKGxpbSA+IDIpIHsKLSAgICAgaW50IGk7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBudW1Qcm9wZXJ0aWVzXzsgaSsrKSB7Ci0gICAgICAgbmV3cG5baV0gPSBwcm9wTmFtZXNfW2ldOwotICAgICAgIG5ld3RbaV0gPSBwcm9wVHlwZXNfW2ldOwotICAgICB9Ci0gICAgIGZyZWUoKGNoYXIqKShwcm9wTmFtZXNfKSk7Ci0gICAgIGZyZWUoKGNoYXIqKShwcm9wVHlwZXNfKSk7Ci0gIH0KLSAgcHJvcE5hbWVzXyA9IG5ld3BuOwotICBwcm9wVHlwZXNfID0gbmV3dDsKLX0KLQotCi1jb25zdCBjaGFyIGRlZmlQcm9wVHlwZTo6cHJvcFR5cGUoY2hhciogbmFtZSkgY29uc3QgewotICBpbnQgaTsKLQotICAvLyBOYW1lIGlzIE5VTEwsIGVycm9yCi0gIGlmICghbmFtZSkKLSAgICAgcmV0dXJuKCdOJyk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IG51bVByb3BlcnRpZXNfOyBpKyspIHsKLSAgICAgaWYgKHN0cmNtcChuYW1lLCBwcm9wTmFtZXNfW2ldKSA9PSAwKQotICAgICAgICByZXR1cm4ocHJvcFR5cGVzX1tpXSk7ICAvLyBmb3VuZCB0aGUgcHJvcCBuYW1lCi0gIH0KLSAgcmV0dXJuKCdOJyk7IC8vIENhbid0IGZvdW5kIHRoZSBuYW1lCi19Ci1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpUHJvcFR5cGUuaHBwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpUHJvcFR5cGUuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWNkNjJlLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaVByb3BUeXBlLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaWZuZGVmIGRlZmlQcm9wVHlwZV9oCi0jZGVmaW5lIGRlZmlQcm9wVHlwZV9oCi0KLSNpbmNsdWRlICJkZWZpS1JEZWZzLmhwcCIKLSNpbmNsdWRlIDxzdGRpby5oPgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0vLyBTdHJ1Y3QgaG9sZHMgdGhlIGRhdGEgdHlwZSBmb3Igb25lIHByb3BlcnR5LCBpZiB0aGUgcHJvcGVydHkgaXMKLS8vIGVpdGhlciBSRUFMIG9yIElOVEVHRVIuCi1jbGFzcyBkZWZpUHJvcFR5cGUgewotcHVibGljOgotICBkZWZpUHJvcFR5cGUoKTsKLSAgdm9pZCBJbml0KCk7Ci0KLSAgdm9pZCBEZXN0cm95KCk7Ci0gIH5kZWZpUHJvcFR5cGUoKTsKLQotICB2b2lkIHNldFByb3BUeXBlKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIgdHlwZSk7Ci0gIHZvaWQgQ2xlYXIoKTsKLQotICBjb25zdCBjaGFyIHByb3BUeXBlKGNoYXIqIG5hbWUpIGNvbnN0OwotICB2b2lkIGJ1bXBQcm9wcygpOwotCi1wcm90ZWN0ZWQ6Ci0gIGludCAgICBudW1Qcm9wZXJ0aWVzXzsKLSAgaW50ICAgIHByb3BlcnRpZXNBbGxvY2F0ZWRfOwotICBjaGFyKiogcHJvcE5hbWVzXzsgICAgICAvLyBuYW1lLgotICBjaGFyKiAgcHJvcFR5cGVzXzsgICAgICAvLyAnUicgPT0gIlJFQUwiLCAnSScgPT0gIklOVEVHRVIiCi19OwotCi0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1VU0VfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlSZWdpb24uY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpUmVnaW9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZkZGE0NS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlSZWdpb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDA5ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTMgLSAyMDE1LCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgImxleC5oIgotI2luY2x1ZGUgImRlZmlSZWdpb24uaHBwIgotI2luY2x1ZGUgImRlZmlEZWJ1Zy5ocHAiCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vICAgZGVmaVJlZ2lvbgotLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCi1kZWZpUmVnaW9uOjpkZWZpUmVnaW9uKGRlZnJEYXRhICpkYXRhKQotOiBkZWZEYXRhKGRhdGEpCi17Ci0gIEluaXQoKTsKLX0KLQotCi12b2lkIGRlZmlSZWdpb246OkluaXQoKSB7Ci0gIG5hbWVfID0gMDsKLSAgbmFtZUxlbmd0aF8gPSAwOwotICB0eXBlXyA9IDA7Ci0gIHhsXyA9IDA7Ci0gIHlsXyA9IDA7Ci0gIHhoXyA9IDA7Ci0gIHloXyA9IDA7Ci0gIG51bVByb3BzXyA9IDA7Ci0gIHByb3BzQWxsb2NhdGVkXyA9IDI7Ci0gIHByb3BOYW1lc18gPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKjIpOwotICBwcm9wVmFsdWVzXyA9IChjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikqMik7Ci0gIHByb3BEVmFsdWVzXyA9IChkb3VibGUqKW1hbGxvYyhzaXplb2YoZG91YmxlKSoyKTsKLSAgcHJvcFR5cGVzXyA9IChjaGFyKiltYWxsb2Moc2l6ZW9mKGNoYXIpKjIpOwotICBjbGVhcigpOwotICBudW1SZWN0YW5nbGVzXyA9IDA7Ci0gIHJlY3RhbmdsZXNBbGxvY2F0ZWRfID0gMTsKLSAgeGxfID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKjEpOwotICB5bF8gPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkqMSk7Ci0gIHhoXyA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSoxKTsKLSAgeWhfID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKjEpOwotfQotCi0KLWRlZmlSZWdpb246On5kZWZpUmVnaW9uKCkgewotICBEZXN0cm95KCk7Ci19Ci0KLQotdm9pZCBkZWZpUmVnaW9uOjpjbGVhcigpIHsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBudW1Qcm9wc187IGkrKykgewotICAgIGZyZWUocHJvcE5hbWVzX1tpXSk7Ci0gICAgZnJlZShwcm9wVmFsdWVzX1tpXSk7Ci0gICAgcHJvcERWYWx1ZXNfW2ldID0gMDsKLSAgfQotICBudW1Qcm9wc18gPSAwOwotICBudW1SZWN0YW5nbGVzXyA9IDA7Ci0gIGlmICh0eXBlXykgZnJlZSh0eXBlXyk7Ci0gIHR5cGVfID0gMDsKLX0KLQotCi12b2lkIGRlZmlSZWdpb246OkRlc3Ryb3koKSB7Ci0gIGlmIChuYW1lXykgZnJlZShuYW1lXyk7Ci0gIGNsZWFyKCk7Ci0gIG5hbWVfID0gMDsKLSAgbmFtZUxlbmd0aF8gPSAwOwotICBmcmVlKChjaGFyKikoeGxfKSk7Ci0gIGZyZWUoKGNoYXIqKSh5bF8pKTsKLSAgZnJlZSgoY2hhciopKHhoXykpOwotICBmcmVlKChjaGFyKikoeWhfKSk7Ci0gIGZyZWUoKGNoYXIqKShwcm9wTmFtZXNfKSk7Ci0gIGZyZWUoKGNoYXIqKShwcm9wVmFsdWVzXykpOwotICBmcmVlKChjaGFyKikocHJvcERWYWx1ZXNfKSk7Ci0gIGZyZWUoKGNoYXIqKShwcm9wVHlwZXNfKSk7Ci19Ci0KLQotdm9pZCBkZWZpUmVnaW9uOjphZGRSZWN0KGludCB4bCwgaW50IHlsLCBpbnQgeGgsIGludCB5aCkgewotICBpZiAobnVtUmVjdGFuZ2xlc18gPT0gcmVjdGFuZ2xlc0FsbG9jYXRlZF8pIHsKLSAgICBpbnQgaTsKLSAgICBpbnQgbWF4ID0gcmVjdGFuZ2xlc0FsbG9jYXRlZF8gPSByZWN0YW5nbGVzQWxsb2NhdGVkXyAqIDI7Ci0gICAgaW50KiBuZXd4bCA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSptYXgpOwotICAgIGludCogbmV3eWwgPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkqbWF4KTsKLSAgICBpbnQqIG5ld3hoID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKm1heCk7Ci0gICAgaW50KiBuZXd5aCA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSptYXgpOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1SZWN0YW5nbGVzXzsgaSsrKSB7Ci0gICAgICBuZXd4bFtpXSA9IHhsX1tpXTsKLSAgICAgIG5ld3lsW2ldID0geWxfW2ldOwotICAgICAgbmV3eGhbaV0gPSB4aF9baV07Ci0gICAgICBuZXd5aFtpXSA9IHloX1tpXTsKLSAgICB9Ci0gICAgZnJlZSgoY2hhciopKHhsXykpOwotICAgIGZyZWUoKGNoYXIqKSh5bF8pKTsKLSAgICBmcmVlKChjaGFyKikoeGhfKSk7Ci0gICAgZnJlZSgoY2hhciopKHloXykpOwotICAgIHhsXyA9IG5ld3hsOwotICAgIHlsXyA9IG5ld3lsOwotICAgIHhoXyA9IG5ld3hoOwotICAgIHloXyA9IG5ld3loOwotICB9Ci0gIHhsX1tudW1SZWN0YW5nbGVzX10gPSB4bDsKLSAgeWxfW251bVJlY3RhbmdsZXNfXSA9IHlsOwotICB4aF9bbnVtUmVjdGFuZ2xlc19dID0geGg7Ci0gIHloX1tudW1SZWN0YW5nbGVzX10gPSB5aDsKLSAgbnVtUmVjdGFuZ2xlc18gKz0gMTsKLX0KLQotCi12b2lkIGRlZmlSZWdpb246OnNldHVwKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgaW50IGxlbiA9IHN0cmxlbihuYW1lKSArIDE7Ci0KLSAgY2xlYXIoKTsKLQotICBpZiAobGVuID4gbmFtZUxlbmd0aF8pIHsKLSAgICBpZiAobmFtZV8pIGZyZWUobmFtZV8pOwotICAgIG5hbWVMZW5ndGhfID0gbGVuOwotICAgIG5hbWVfID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICB9Ci0KLSAgc3RyY3B5KG5hbWVfLCBkZWZEYXRhLT5ERUZDQVNFKG5hbWUpKTsKLQotfQotCi12b2lkIGRlZmlSZWdpb246OmFkZFByb3BlcnR5KGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIHR5cGUpIHsKLSAgaW50IGxlbjsKLSAgaWYgKG51bVByb3BzXyA9PSBwcm9wc0FsbG9jYXRlZF8pIHsKLSAgICBpbnQgaTsKLSAgICBjaGFyKiogIG5uOwotICAgIGNoYXIqKiAgbnY7Ci0gICAgZG91YmxlKiBuZDsKLSAgICBjaGFyKiAgIG50OwotCi0gICAgcHJvcHNBbGxvY2F0ZWRfICo9IDI7Ci0gICAgbm4gPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKnByb3BzQWxsb2NhdGVkXyk7Ci0gICAgbnYgPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKnByb3BzQWxsb2NhdGVkXyk7Ci0gICAgbmQgPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkqcHJvcHNBbGxvY2F0ZWRfKTsKLSAgICBudCA9IChjaGFyKiltYWxsb2Moc2l6ZW9mKGNoYXIpKnByb3BzQWxsb2NhdGVkXyk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bVByb3BzXzsgaSsrKSB7Ci0gICAgICBubltpXSA9IHByb3BOYW1lc19baV07Ci0gICAgICBudltpXSA9IHByb3BWYWx1ZXNfW2ldOwotICAgICAgbmRbaV0gPSBwcm9wRFZhbHVlc19baV07Ci0gICAgICBudFtpXSA9IHByb3BUeXBlc19baV07Ci0gICAgfQotICAgIGZyZWUoKGNoYXIqKShwcm9wTmFtZXNfKSk7Ci0gICAgZnJlZSgoY2hhciopKHByb3BWYWx1ZXNfKSk7Ci0gICAgZnJlZSgoY2hhciopKHByb3BEVmFsdWVzXykpOwotICAgIGZyZWUoKGNoYXIqKShwcm9wVHlwZXNfKSk7Ci0gICAgcHJvcE5hbWVzXyA9IG5uOwotICAgIHByb3BWYWx1ZXNfID0gbnY7Ci0gICAgcHJvcERWYWx1ZXNfID0gbmQ7Ci0gICAgcHJvcFR5cGVzXyA9IG50OwotICB9Ci0gIGxlbiA9IHN0cmxlbihuYW1lKSArIDE7Ci0gIHByb3BOYW1lc19bbnVtUHJvcHNfXSA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgc3RyY3B5KHByb3BOYW1lc19bbnVtUHJvcHNfXSwgZGVmRGF0YS0+REVGQ0FTRShuYW1lKSk7Ci0gIGxlbiA9IHN0cmxlbih2YWx1ZSkgKyAxOwotICBwcm9wVmFsdWVzX1tudW1Qcm9wc19dID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICBzdHJjcHkocHJvcFZhbHVlc19bbnVtUHJvcHNfXSwgZGVmRGF0YS0+REVGQ0FTRSh2YWx1ZSkpOwotICBwcm9wRFZhbHVlc19bbnVtUHJvcHNfXSA9IDA7Ci0gIHByb3BUeXBlc19bbnVtUHJvcHNfXSA9IHR5cGU7Ci0gIG51bVByb3BzXyArPSAxOwotfQotCi12b2lkIGRlZmlSZWdpb246OmFkZE51bVByb3BlcnR5KGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGRvdWJsZSBkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YWx1ZSwgY29uc3QgY2hhciB0eXBlKSB7Ci0gIGludCBsZW47Ci0gIGlmIChudW1Qcm9wc18gPT0gcHJvcHNBbGxvY2F0ZWRfKSB7Ci0gICAgaW50IGk7Ci0gICAgY2hhcioqICBubjsKLSAgICBjaGFyKiogIG52OwotICAgIGRvdWJsZSogbmQ7Ci0gICAgY2hhciogICBudDsKLQotICAgIHByb3BzQWxsb2NhdGVkXyAqPSAyOwotICAgIG5uID0gKGNoYXIqKiltYWxsb2Moc2l6ZW9mKGNoYXIqKSpwcm9wc0FsbG9jYXRlZF8pOwotICAgIG52ID0gKGNoYXIqKiltYWxsb2Moc2l6ZW9mKGNoYXIqKSpwcm9wc0FsbG9jYXRlZF8pOwotICAgIG5kID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpKnByb3BzQWxsb2NhdGVkXyk7Ci0gICAgbnQgPSAoY2hhciopbWFsbG9jKHNpemVvZihjaGFyKSpwcm9wc0FsbG9jYXRlZF8pOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1Qcm9wc187IGkrKykgewotICAgICAgbm5baV0gPSBwcm9wTmFtZXNfW2ldOwotICAgICAgbnZbaV0gPSBwcm9wVmFsdWVzX1tpXTsKLSAgICAgIG5kW2ldID0gcHJvcERWYWx1ZXNfW2ldOwotICAgICAgbnRbaV0gPSBwcm9wVHlwZXNfW2ldOwotICAgIH0KLSAgICBmcmVlKChjaGFyKikocHJvcE5hbWVzXykpOwotICAgIGZyZWUoKGNoYXIqKShwcm9wVmFsdWVzXykpOwotICAgIGZyZWUoKGNoYXIqKShwcm9wRFZhbHVlc18pKTsKLSAgICBmcmVlKChjaGFyKikocHJvcFR5cGVzXykpOwotICAgIHByb3BOYW1lc18gPSBubjsKLSAgICBwcm9wVmFsdWVzXyA9IG52OwotICAgIHByb3BEVmFsdWVzXyA9IG5kOwotICAgIHByb3BUeXBlc18gPSBudDsKLSAgfQotICBsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotICBwcm9wTmFtZXNfW251bVByb3BzX10gPSAoY2hhciopbWFsbG9jKGxlbik7Ci0gIHN0cmNweShwcm9wTmFtZXNfW251bVByb3BzX10sIGRlZkRhdGEtPkRFRkNBU0UobmFtZSkpOwotICBsZW4gPSBzdHJsZW4odmFsdWUpICsgMTsKLSAgcHJvcFZhbHVlc19bbnVtUHJvcHNfXSA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgc3RyY3B5KHByb3BWYWx1ZXNfW251bVByb3BzX10sIGRlZkRhdGEtPkRFRkNBU0UodmFsdWUpKTsKLSAgcHJvcERWYWx1ZXNfW251bVByb3BzX10gPSBkOwotICBwcm9wVHlwZXNfW251bVByb3BzX10gPSB0eXBlOwotICBudW1Qcm9wc18gKz0gMTsKLX0KLQotCi12b2lkIGRlZmlSZWdpb246OnNldFR5cGUoY29uc3QgY2hhciogdHlwZSkgewotICBpbnQgbGVuOwotICBpZiAodHlwZV8pIGZyZWUodHlwZV8pOwotICBsZW4gPSBzdHJsZW4odHlwZSkgKyAxOwotICB0eXBlXyA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgc3RyY3B5KHR5cGVfLCBkZWZEYXRhLT5ERUZDQVNFKHR5cGUpKTsKLX0KLQotCi1pbnQgZGVmaVJlZ2lvbjo6aGFzVHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHR5cGVfID8gMSA6IDA7Ci19Ci0KLQotY29uc3QgY2hhciogZGVmaVJlZ2lvbjo6dHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHR5cGVfOwotfQotCi0KLWludCBkZWZpUmVnaW9uOjpudW1SZWN0YW5nbGVzKCkgY29uc3QgewotICByZXR1cm4gbnVtUmVjdGFuZ2xlc187Ci19Ci0KLQotaW50IGRlZmlSZWdpb246Om51bVByb3BzKCkgY29uc3QgewotICByZXR1cm4gbnVtUHJvcHNfOwotfQotCi0KLWNvbnN0IGNoYXIqIGRlZmlSZWdpb246OnByb3BOYW1lKGludCBpbmRleCkgY29uc3QgewotICBjaGFyIG1zZ1sxNjBdOwotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVByb3BzXykgewotICAgICBzcHJpbnRmIChtc2csICJFUlJPUiAoREVGUEFSUy02MTMwKTogVGhlIGluZGV4IG51bWJlciAlZCBzcGVjaWZpZWQgZm9yIHRoZSBSRUdJT04gUFJPUEVSVFkgaXMgaW52YWxpZGUuXG5WYWxpZCBpbmRleCBudW1iZXIgaXMgZnJvbSAwIHRvICVkLiBTcGVjaWZ5IGEgdmFsaWQgaW5kZXggbnVtYmVyIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLAotICAgICAgICAgICAgICBpbmRleCwgbnVtUHJvcHNfKTsKLSAgICAgZGVmaUVycm9yKDAsIDYxMzAsIG1zZywgZGVmRGF0YSk7Ci0gICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBwcm9wTmFtZXNfW2luZGV4XTsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpUmVnaW9uOjpwcm9wVmFsdWUoaW50IGluZGV4KSBjb25zdCB7Ci0gIGNoYXIgbXNnWzE2MF07Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtUHJvcHNfKSB7Ci0gICAgIHNwcmludGYgKG1zZywgIkVSUk9SIChERUZQQVJTLTYxMzApOiBUaGUgaW5kZXggbnVtYmVyICVkIHNwZWNpZmllZCBmb3IgdGhlIFJFR0lPTiBQUk9QRVJUWSBpcyBpbnZhbGlkZS5cblZhbGlkIGluZGV4IG51bWJlciBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIsCi0gICAgICAgICAgICAgIGluZGV4LCBudW1Qcm9wc18pOwotICAgICBkZWZpRXJyb3IoMCwgNjEzMCwgbXNnLCBkZWZEYXRhKTsKLSAgICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIHByb3BWYWx1ZXNfW2luZGV4XTsKLX0KLQotCi1kb3VibGUgZGVmaVJlZ2lvbjo6cHJvcE51bWJlcihpbnQgaW5kZXgpIGNvbnN0IHsKLSAgY2hhciBtc2dbMTYwXTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1Qcm9wc18pIHsKLSAgICAgc3ByaW50ZiAobXNnLCAiRVJST1IgKERFRlBBUlMtNjEzMCk6IFRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgUkVHSU9OIFBST1BFUlRZIGlzIGludmFsaWRlLlxuVmFsaWQgaW5kZXggbnVtYmVyIGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgICAgaW5kZXgsIG51bVByb3BzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MTMwLCBtc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gcHJvcERWYWx1ZXNfW2luZGV4XTsKLX0KLQotCi1jb25zdCBjaGFyIGRlZmlSZWdpb246OnByb3BUeXBlKGludCBpbmRleCkgY29uc3QgewotICBjaGFyIG1zZ1sxNjBdOwotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVByb3BzXykgewotICAgICBzcHJpbnRmIChtc2csICJFUlJPUiAoREVGUEFSUy02MTMwKTogVGhlIGluZGV4IG51bWJlciAlZCBzcGVjaWZpZWQgZm9yIHRoZSBSRUdJT04gUFJPUEVSVFkgaXMgaW52YWxpZGUuXG5WYWxpZCBpbmRleCBudW1iZXIgaXMgZnJvbSAwIHRvICVkLiBTcGVjaWZ5IGEgdmFsaWQgaW5kZXggbnVtYmVyIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLAotICAgICAgICAgICAgICBpbmRleCwgbnVtUHJvcHNfKTsKLSAgICAgZGVmaUVycm9yKDAsIDYxMzAsIG1zZywgZGVmRGF0YSk7Ci0gICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBwcm9wVHlwZXNfW2luZGV4XTsKLX0KLQotaW50IGRlZmlSZWdpb246OnByb3BJc051bWJlcihpbnQgaW5kZXgpIGNvbnN0IHsKLSAgY2hhciBtc2dbMTYwXTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1Qcm9wc18pIHsKLSAgICAgc3ByaW50ZiAobXNnLCAiRVJST1IgKERFRlBBUlMtNjEzMCk6IFRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgUkVHSU9OIFBST1BFUlRZIGlzIGludmFsaWRlLlxuVmFsaWQgaW5kZXggbnVtYmVyIGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgICAgaW5kZXgsIG51bVByb3BzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MTMwLCBtc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gcHJvcERWYWx1ZXNfW2luZGV4XSA/IDEgOiAwOwotfQotCi1pbnQgZGVmaVJlZ2lvbjo6cHJvcElzU3RyaW5nKGludCBpbmRleCkgY29uc3QgewotICBjaGFyIG1zZ1sxNjBdOwotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVByb3BzXykgewotICAgICBzcHJpbnRmIChtc2csICJFUlJPUiAoREVGUEFSUy02MTMwKTogVGhlIGluZGV4IG51bWJlciAlZCBzcGVjaWZpZWQgZm9yIHRoZSBSRUdJT04gUFJPUEVSVFkgaXMgaW52YWxpZGUuXG5WYWxpZCBpbmRleCBudW1iZXIgaXMgZnJvbSAwIHRvICVkLiBTcGVjaWZ5IGEgdmFsaWQgaW5kZXggbnVtYmVyIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLAotICAgICAgICAgICAgICBpbmRleCwgbnVtUHJvcHNfKTsKLSAgICAgZGVmaUVycm9yKDAsIDYxMzAsIG1zZywgZGVmRGF0YSk7Ci0gICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBwcm9wRFZhbHVlc19baW5kZXhdID8gMCA6IDE7Ci19Ci0KLWNvbnN0IGNoYXIqIGRlZmlSZWdpb246Om5hbWUoKSBjb25zdCB7Ci0gIHJldHVybiBuYW1lXzsKLX0KLQotCi1pbnQgZGVmaVJlZ2lvbjo6eGwoaW50IGluZGV4KSBjb25zdCB7Ci0gIGNoYXIgbXNnWzE2MF07Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtUmVjdGFuZ2xlc18pIHsKLSAgICAgc3ByaW50ZiAobXNnLCAiRVJST1IgKERFRlBBUlMtNjEzMSk6IFRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgUkVHSU9OIFJFQ1RBTkdMRSBpcyBpbnZhbGlkZS5cblZhbGlkIGluZGV4IG51bWJlciBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIsCi0gICAgICAgICAgICAgIGluZGV4LCBudW1SZWN0YW5nbGVzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MTMxLCBtc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4geGxfW2luZGV4XTsKLX0KLQotCi1pbnQgZGVmaVJlZ2lvbjo6eWwoaW50IGluZGV4KSBjb25zdCB7Ci0gIGNoYXIgbXNnWzE2MF07Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtUmVjdGFuZ2xlc18pIHsKLSAgICAgc3ByaW50ZiAobXNnLCAiRVJST1IgKERFRlBBUlMtNjEzMSk6IFRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgUkVHSU9OIFJFQ1RBTkdMRSBpcyBpbnZhbGlkZS5cblZhbGlkIGluZGV4IG51bWJlciBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIsCi0gICAgICAgICAgICAgIGluZGV4LCBudW1SZWN0YW5nbGVzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MTMxLCBtc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4geWxfW2luZGV4XTsKLX0KLQotCi1pbnQgZGVmaVJlZ2lvbjo6eGgoaW50IGluZGV4KSBjb25zdCB7Ci0gIGNoYXIgbXNnWzE2MF07Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtUmVjdGFuZ2xlc18pIHsKLSAgICAgc3ByaW50ZiAobXNnLCAiRVJST1IgKERFRlBBUlMtNjEzMSk6IFRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgUkVHSU9OIFJFQ1RBTkdMRSBpcyBpbnZhbGlkZS5cblZhbGlkIGluZGV4IG51bWJlciBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIsCi0gICAgICAgICAgICAgIGluZGV4LCBudW1SZWN0YW5nbGVzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MTMxLCBtc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4geGhfW2luZGV4XTsKLX0KLQotCi1pbnQgZGVmaVJlZ2lvbjo6eWgoaW50IGluZGV4KSBjb25zdCB7Ci0gIGNoYXIgbXNnWzE2MF07Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtUmVjdGFuZ2xlc18pIHsKLSAgICAgc3ByaW50ZiAobXNnLCAiRVJST1IgKERFRlBBUlMtNjEzMSk6IFRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgUkVHSU9OIFJFQ1RBTkdMRSBpcyBpbnZhbGlkZS5cblZhbGlkIGluZGV4IG51bWJlciBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIsCi0gICAgICAgICAgICAgIGluZGV4LCBudW1SZWN0YW5nbGVzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MTMxLCBtc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4geWhfW2luZGV4XTsKLX0KLQotCi12b2lkIGRlZmlSZWdpb246OnByaW50KEZJTEUqIGYpIGNvbnN0IHsKLSAgaW50IGk7Ci0gIGZwcmludGYoZiwgIlJlZ2lvbiAnJXMnIiwgbmFtZSgpKTsKLSAgZm9yIChpID0gMDsgaSA8IG51bVJlY3RhbmdsZXMoKTsgaSsrKSB7Ci0gICAgZnByaW50ZihmLCAiICVkICVkICVkICVkIiwKLSAgICAgIHhsKGkpLAotICAgICAgeWwoaSksCi0gICAgICB4aChpKSwKLSAgICAgIHloKGkpKTsKLSAgfQotICBmcHJpbnRmKGYsICJcbiIpOwotfQotCi0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlSZWdpb24uaHBwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpUmVnaW9uLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZlMjE1MC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlSZWdpb24uaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaWZuZGVmIGRlZmlSZWdpb25faAotI2RlZmluZSBkZWZpUmVnaW9uX2gKLQotI2luY2x1ZGUgImRlZmlLUkRlZnMuaHBwIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLWNsYXNzIGRlZnJEYXRhOwotCi0vLyBTdHJ1Y3QgaG9sZHMgdGhlIGRhdGEgZm9yIG9uZSBwcm9wZXJ0eS4KLWNsYXNzIGRlZmlSZWdpb24gewotcHVibGljOgotICBkZWZpUmVnaW9uKGRlZnJEYXRhICpkYXRhKTsKLSAgdm9pZCBJbml0KCk7Ci0KLSAgdm9pZCBEZXN0cm95KCk7Ci0gIH5kZWZpUmVnaW9uKCk7Ci0KLSAgdm9pZCBjbGVhcigpOwotICB2b2lkIHNldHVwKGNvbnN0IGNoYXIqIG5hbWUpOwotICB2b2lkIGFkZFJlY3QoaW50IHhsLCBpbnQgeWwsIGludCB4aCwgaW50IHloKTsKLSAgdm9pZCBhZGRQcm9wZXJ0eShjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSwgY29uc3QgY2hhciB0eXBlKTsKLSAgdm9pZCBhZGROdW1Qcm9wZXJ0eShjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBkb3VibGUgZCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YWx1ZSwgY29uc3QgY2hhciB0eXBlKTsKLSAgdm9pZCBzZXRUeXBlKGNvbnN0IGNoYXIqIHR5cGUpOyAgICAgICAgIC8vIDUuNC4xCi0KLSAgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0OwotCi0gIGludCBudW1Qcm9wcygpIGNvbnN0OwotICBjb25zdCBjaGFyKiAgcHJvcE5hbWUoaW50IGluZGV4KSBjb25zdDsKLSAgY29uc3QgY2hhciogIHByb3BWYWx1ZShpbnQgaW5kZXgpIGNvbnN0OwotICBkb3VibGUgcHJvcE51bWJlcihpbnQgaW5kZXgpIGNvbnN0OwotICBjb25zdCBjaGFyICAgcHJvcFR5cGUoaW50IGluZGV4KSBjb25zdDsKLSAgaW50IHByb3BJc051bWJlcihpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgcHJvcElzU3RyaW5nKGludCBpbmRleCkgY29uc3Q7Ci0KLSAgaW50IGhhc1R5cGUoKSBjb25zdDsgICAgICAgICAgICAgICAgICAgIC8vIDUuNC4xCi0gIGNvbnN0IGNoYXIqIHR5cGUoKSBjb25zdDsgICAgICAgICAgICAgICAvLyA1LjQuMQotCi0gIGludCBudW1SZWN0YW5nbGVzKCkgY29uc3Q7Ci0gIGludCB4bChpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgeWwoaW50IGluZGV4KSBjb25zdDsKLSAgaW50IHhoKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCB5aChpbnQgaW5kZXgpIGNvbnN0OwotCi0gIHZvaWQgcHJpbnQoRklMRSogZikgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgY2hhciogbmFtZV87Ci0gIGludCBuYW1lTGVuZ3RoXzsKLQotICBpbnQgbnVtUmVjdGFuZ2xlc187Ci0gIGludCByZWN0YW5nbGVzQWxsb2NhdGVkXzsKLSAgaW50KiB4bF87Ci0gIGludCogeWxfOwotICBpbnQqIHhoXzsKLSAgaW50KiB5aF87Ci0KLSAgaW50IG51bVByb3BzXzsKLSAgaW50IHByb3BzQWxsb2NhdGVkXzsKLSAgY2hhcioqICBwcm9wTmFtZXNfOwotICBjaGFyKiogIHByb3BWYWx1ZXNfOwotICBkb3VibGUqIHByb3BEVmFsdWVzXzsKLSAgY2hhciogICBwcm9wVHlwZXNfOwotCi0gIGNoYXIqIHR5cGVfOwotCi0gIGRlZnJEYXRhICpkZWZEYXRhOwotfTsKLQotCi0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1VU0VfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlSb3dUcmFjay5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlSb3dUcmFjay5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZWUwMzEuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpUm93VHJhY2suY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjI2ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTMgLSAyMDE1LCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgImRlZmlSb3dUcmFjay5ocHAiCi0jaW5jbHVkZSAiZGVmaURlYnVnLmhwcCIKLSNpbmNsdWRlICJsZXguaCIKLSNpbmNsdWRlICJkZWZpVXRpbC5ocHAiCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyAgIGRlZmlSb3cKLS8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQotZGVmaVJvdzo6ZGVmaVJvdyhkZWZyRGF0YSAqZGF0YSkKLSA6IGRlZkRhdGEoZGF0YSkKLXsKLSAgSW5pdCgpOwotfQotCi0KLXZvaWQgZGVmaVJvdzo6SW5pdCgpIHsKLSAgbmFtZUxlbmd0aF8gPSAwOwotICBuYW1lXyA9IDA7Ci0gIG1hY3JvTGVuZ3RoXyA9IDA7Ci0gIG1hY3JvXyA9IDA7Ci0gIG9yaWVudF8gPSAwOwotICB4XyA9IDAuMDsKLSAgeV8gPSAwLjA7Ci0gIHhTdGVwXyA9IDAuMDsKLSAgeVN0ZXBfID0gMC4wOwotICB4TnVtXyA9IDAuMDsKLSAgeU51bV8gPSAwLjA7Ci0gIGhhc0RvXyA9IDA7Ci0gIGhhc0RvU3RlcF8gPSAwOwotICBudW1Qcm9wc18gPSAwOwotICBwcm9wc0FsbG9jYXRlZF8gPSAyOwotICBwcm9wTmFtZXNfID0gKGNoYXIqKiltYWxsb2Moc2l6ZW9mKGNoYXIqKSoyKTsKLSAgcHJvcFZhbHVlc18gPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKjIpOwotICBwcm9wRFZhbHVlc18gPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkqMik7Ci0gIHByb3BUeXBlc18gPSAoY2hhciopbWFsbG9jKHNpemVvZihjaGFyKSoyKTsKLX0KLQotCi1kZWZpUm93Ojp+ZGVmaVJvdygpIHsKLSAgRGVzdHJveSgpOwotfQotCi0KLXZvaWQgZGVmaVJvdzo6RGVzdHJveSgpIHsKLSAgY2xlYXIoKTsKLSAgaWYgKG5hbWVfKSBmcmVlKG5hbWVfKTsKLSAgaWYgKG1hY3JvXykgZnJlZShtYWNyb18pOwotICBmcmVlKChjaGFyKikocHJvcE5hbWVzXykpOwotICBmcmVlKChjaGFyKikocHJvcFZhbHVlc18pKTsKLSAgZnJlZSgoY2hhciopKHByb3BEVmFsdWVzXykpOwotICBmcmVlKChjaGFyKikocHJvcFR5cGVzXykpOwotfQotCi0KLXZvaWQgZGVmaVJvdzo6Y2xlYXIoKSB7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgbnVtUHJvcHNfOyBpKyspIHsKLSAgICBmcmVlKHByb3BOYW1lc19baV0pOwotICAgIGZyZWUocHJvcFZhbHVlc19baV0pOwotICAgIHByb3BEVmFsdWVzX1tpXSA9IDA7Ci0gIH0KLSAgaGFzRG9fID0gMDsKLSAgaGFzRG9TdGVwXyA9IDA7Ci0gIG51bVByb3BzXyA9IDA7Ci19Ci0KLQotdm9pZCBkZWZpUm93OjpzZXR1cChjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiBtYWNybywgZG91YmxlIHgsIGRvdWJsZSB5LAotCQkgaW50IG9yaWVudCkgewotICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLQotICBjbGVhcigpOwotCi0gIGlmIChsZW4gPiBuYW1lTGVuZ3RoXykgewotICAgIGlmIChuYW1lXykgZnJlZShuYW1lXyk7Ci0gICAgbmFtZUxlbmd0aF8gPSBsZW47Ci0gICAgbmFtZV8gPSAoY2hhciopbWFsbG9jKGxlbik7Ci0gIH0KLSAgc3RyY3B5KG5hbWVfLCBkZWZEYXRhLT5ERUZDQVNFKG5hbWUpKTsKLQotICBsZW4gPSBzdHJsZW4obWFjcm8pICsgMTsKLSAgaWYgKGxlbiA+IG1hY3JvTGVuZ3RoXykgewotICAgIGlmIChtYWNyb18pIGZyZWUobWFjcm9fKTsKLSAgICBtYWNyb0xlbmd0aF8gPSBsZW47Ci0gICAgbWFjcm9fID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICB9Ci0gIHN0cmNweShtYWNyb18sIGRlZkRhdGEtPkRFRkNBU0UobWFjcm8pKTsKLQotICB4XyA9IHg7Ci0gIHlfID0geTsKLSAgeFN0ZXBfID0gMC4wOwotICB5U3RlcF8gPSAwLjA7Ci0gIHhOdW1fID0gMC4wOwotICB5TnVtXyA9IDAuMDsKLSAgb3JpZW50XyA9IG9yaWVudDsKLQotfQotCi0KLXZvaWQgZGVmaVJvdzo6c2V0RG8oZG91YmxlIHhfbnVtLCBkb3VibGUgeV9udW0sCi0JCSAgICBkb3VibGUgeF9zdGVwLCBkb3VibGUgeV9zdGVwKSB7Ci0gIHhTdGVwXyA9IHhfc3RlcDsKLSAgeVN0ZXBfID0geV9zdGVwOwotICB4TnVtXyA9IHhfbnVtOwotICB5TnVtXyA9IHlfbnVtOwotICBoYXNEb18gPSAxOwotfQotCi0KLXZvaWQgZGVmaVJvdzo6c2V0SGFzRG9TdGVwKCkgewotICBoYXNEb1N0ZXBfID0gMTsKLX0KLQotCi12b2lkIGRlZmlSb3c6OmFkZFByb3BlcnR5KGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHZhbHVlLCBjb25zdCBjaGFyIHR5cGUpIAotewotICBpbnQgbGVuOwotICBpZiAobnVtUHJvcHNfID09IHByb3BzQWxsb2NhdGVkXykgewotICAgIGludCBpOwotICAgIGNoYXIqKiAgbm47Ci0gICAgY2hhcioqICBudjsKLSAgICBkb3VibGUqIG5kOwotICAgIGNoYXIqICAgbnQ7Ci0gICAgcHJvcHNBbGxvY2F0ZWRfICo9IDI7Ci0gICAgbm4gPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKnByb3BzQWxsb2NhdGVkXyk7Ci0gICAgbnYgPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKnByb3BzQWxsb2NhdGVkXyk7Ci0gICAgbmQgPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkqcHJvcHNBbGxvY2F0ZWRfKTsKLSAgICBudCA9IChjaGFyKiltYWxsb2Moc2l6ZW9mKGNoYXIpKnByb3BzQWxsb2NhdGVkXyk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bVByb3BzXzsgaSsrKSB7Ci0gICAgICBubltpXSA9IHByb3BOYW1lc19baV07Ci0gICAgICBudltpXSA9IHByb3BWYWx1ZXNfW2ldOwotICAgICAgbmRbaV0gPSBwcm9wRFZhbHVlc19baV07Ci0gICAgICBudFtpXSA9IHByb3BUeXBlc19baV07Ci0gICAgfQotICAgIGZyZWUoKGNoYXIqKShwcm9wTmFtZXNfKSk7Ci0gICAgZnJlZSgoY2hhciopKHByb3BWYWx1ZXNfKSk7Ci0gICAgZnJlZSgoY2hhciopKHByb3BEVmFsdWVzXykpOwotICAgIGZyZWUoKGNoYXIqKShwcm9wVHlwZXNfKSk7Ci0gICAgcHJvcE5hbWVzXyA9IG5uOwotICAgIHByb3BWYWx1ZXNfID0gbnY7Ci0gICAgcHJvcERWYWx1ZXNfID0gbmQ7Ci0gICAgcHJvcFR5cGVzXyA9IG50OwotICB9Ci0gIGxlbiA9IHN0cmxlbihuYW1lKSArIDE7Ci0gIHByb3BOYW1lc19bbnVtUHJvcHNfXSA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgc3RyY3B5KHByb3BOYW1lc19bbnVtUHJvcHNfXSwgZGVmRGF0YS0+REVGQ0FTRShuYW1lKSk7Ci0gIGxlbiA9IHN0cmxlbih2YWx1ZSkgKyAxOwotICBwcm9wVmFsdWVzX1tudW1Qcm9wc19dID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICBzdHJjcHkocHJvcFZhbHVlc19bbnVtUHJvcHNfXSwgZGVmRGF0YS0+REVGQ0FTRSh2YWx1ZSkpOwotICBwcm9wRFZhbHVlc19bbnVtUHJvcHNfXSA9IDA7Ci0gIHByb3BUeXBlc19bbnVtUHJvcHNfXSA9IHR5cGU7Ci0gIG51bVByb3BzXyArPSAxOwotfQotCi0KLXZvaWQgZGVmaVJvdzo6YWRkTnVtUHJvcGVydHkoY29uc3QgY2hhciogbmFtZSwgY29uc3QgZG91YmxlIGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhbHVlLCBjb25zdCBjaGFyIHR5cGUpIAotewotICBpbnQgbGVuOwotICBpZiAobnVtUHJvcHNfID09IHByb3BzQWxsb2NhdGVkXykgewotICAgIGludCBpOwotICAgIGNoYXIqKiBubjsKLSAgICBjaGFyKiogbnY7Ci0gICAgZG91YmxlKiBuZDsKLSAgICBjaGFyKiAgbnQ7Ci0gICAgcHJvcHNBbGxvY2F0ZWRfICo9IDI7Ci0gICAgbm4gPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKnByb3BzQWxsb2NhdGVkXyk7Ci0gICAgbnYgPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKnByb3BzQWxsb2NhdGVkXyk7Ci0gICAgbmQgPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkqcHJvcHNBbGxvY2F0ZWRfKTsKLSAgICBudCA9IChjaGFyKiltYWxsb2Moc2l6ZW9mKGNoYXIpKnByb3BzQWxsb2NhdGVkXyk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bVByb3BzXzsgaSsrKSB7Ci0gICAgICBubltpXSA9IHByb3BOYW1lc19baV07Ci0gICAgICBudltpXSA9IHByb3BWYWx1ZXNfW2ldOwotICAgICAgbmRbaV0gPSBwcm9wRFZhbHVlc19baV07Ci0gICAgICBudFtpXSA9IHByb3BUeXBlc19baV07Ci0gICAgfQotICAgIGZyZWUoKGNoYXIqKShwcm9wTmFtZXNfKSk7Ci0gICAgZnJlZSgoY2hhciopKHByb3BWYWx1ZXNfKSk7Ci0gICAgZnJlZSgoY2hhciopKHByb3BEVmFsdWVzXykpOwotICAgIGZyZWUoKGNoYXIqKShwcm9wVHlwZXNfKSk7Ci0gICAgcHJvcE5hbWVzXyA9IG5uOwotICAgIHByb3BWYWx1ZXNfID0gbnY7Ci0gICAgcHJvcERWYWx1ZXNfID0gbmQ7Ci0gICAgcHJvcFR5cGVzXyA9IG50OwotICB9Ci0gIGxlbiA9IHN0cmxlbihuYW1lKSArIDE7Ci0gIHByb3BOYW1lc19bbnVtUHJvcHNfXSA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgc3RyY3B5KHByb3BOYW1lc19bbnVtUHJvcHNfXSwgZGVmRGF0YS0+REVGQ0FTRShuYW1lKSk7Ci0gIGxlbiA9IHN0cmxlbih2YWx1ZSkgKyAxOwotICBwcm9wVmFsdWVzX1tudW1Qcm9wc19dID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICBzdHJjcHkocHJvcFZhbHVlc19bbnVtUHJvcHNfXSwgZGVmRGF0YS0+REVGQ0FTRSh2YWx1ZSkpOwotICBwcm9wRFZhbHVlc19bbnVtUHJvcHNfXSA9IGQ7Ci0gIHByb3BUeXBlc19bbnVtUHJvcHNfXSA9IHR5cGU7Ci0gIG51bVByb3BzXyArPSAxOwotfQotCi0KLWludCBkZWZpUm93OjpudW1Qcm9wcygpIGNvbnN0IHsKLSAgcmV0dXJuIG51bVByb3BzXzsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpUm93Ojpwcm9wTmFtZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgY2hhciBtc2dbMTYwXTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1Qcm9wc18pIHsKLSAgICAgc3ByaW50ZiAobXNnLCAiRVJST1IgKERFRlBBUlMtNjE0MCk6IFRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgVklBIExBWUVSIFJFQ1RBTkdMRSBpcyBpbnZhbGlkZS5cblZhbGlkIGluZGV4IG51bWJlciBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIsCi0gICAgICAgICAgICAgIGluZGV4LCBudW1Qcm9wc18pOwotICAgICBkZWZpRXJyb3IoMCwgNjE0MCwgbXNnLCBkZWZEYXRhKTsKLSAgICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIHByb3BOYW1lc19baW5kZXhdOwotfQotCi0KLWNvbnN0IGNoYXIqIGRlZmlSb3c6OnByb3BWYWx1ZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgY2hhciBtc2dbMTYwXTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1Qcm9wc18pIHsKLSAgICAgc3ByaW50ZiAobXNnLCAiRVJST1IgKERFRlBBUlMtNjE0MCk6IFRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgVklBIExBWUVSIFJFQ1RBTkdMRSBpcyBpbnZhbGlkZS5cblZhbGlkIGluZGV4IG51bWJlciBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIsCi0gICAgICAgICAgICAgIGluZGV4LCBudW1Qcm9wc18pOwotICAgICBkZWZpRXJyb3IoMCwgNjE0MCwgbXNnLCBkZWZEYXRhKTsKLSAgICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIHByb3BWYWx1ZXNfW2luZGV4XTsKLX0KLQotZG91YmxlIGRlZmlSb3c6OnByb3BOdW1iZXIoaW50IGluZGV4KSBjb25zdCB7Ci0gIGNoYXIgbXNnWzE2MF07Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtUHJvcHNfKSB7Ci0gICAgIHNwcmludGYgKG1zZywgIkVSUk9SIChERUZQQVJTLTYxNDApOiBUaGUgaW5kZXggbnVtYmVyICVkIHNwZWNpZmllZCBmb3IgdGhlIFZJQSBMQVlFUiBSRUNUQU5HTEUgaXMgaW52YWxpZGUuXG5WYWxpZCBpbmRleCBudW1iZXIgaXMgZnJvbSAwIHRvICVkLiBTcGVjaWZ5IGEgdmFsaWQgaW5kZXggbnVtYmVyIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLAotICAgICAgICAgICAgICBpbmRleCwgbnVtUHJvcHNfKTsKLSAgICAgZGVmaUVycm9yKDAsIDYxNDAsIG1zZywgZGVmRGF0YSk7Ci0gICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBwcm9wRFZhbHVlc19baW5kZXhdOwotfQotCi1jb25zdCBjaGFyIGRlZmlSb3c6OnByb3BUeXBlKGludCBpbmRleCkgY29uc3QgewotICBjaGFyIG1zZ1sxNjBdOwotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVByb3BzXykgewotICAgICBzcHJpbnRmIChtc2csICJFUlJPUiAoREVGUEFSUy02MTQwKTogVGhlIGluZGV4IG51bWJlciAlZCBzcGVjaWZpZWQgZm9yIHRoZSBWSUEgTEFZRVIgUkVDVEFOR0xFIGlzIGludmFsaWRlLlxuVmFsaWQgaW5kZXggbnVtYmVyIGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgICAgaW5kZXgsIG51bVByb3BzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MTQwLCBtc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gcHJvcFR5cGVzX1tpbmRleF07Ci19Ci0KLWludCBkZWZpUm93Ojpwcm9wSXNOdW1iZXIoaW50IGluZGV4KSBjb25zdCB7Ci0gIGNoYXIgbXNnWzE2MF07Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtUHJvcHNfKSB7Ci0gICAgIHNwcmludGYgKG1zZywgIkVSUk9SIChERUZQQVJTLTYxNDApOiBUaGUgaW5kZXggbnVtYmVyICVkIHNwZWNpZmllZCBmb3IgdGhlIFZJQSBMQVlFUiBSRUNUQU5HTEUgaXMgaW52YWxpZGUuXG5WYWxpZCBpbmRleCBudW1iZXIgaXMgZnJvbSAwIHRvICVkLiBTcGVjaWZ5IGEgdmFsaWQgaW5kZXggbnVtYmVyIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLAotICAgICAgICAgICAgICBpbmRleCwgbnVtUHJvcHNfKTsKLSAgICAgZGVmaUVycm9yKDAsIDYxNDAsIG1zZywgZGVmRGF0YSk7Ci0gICAgIHJldHVybiAwOwotICB9IAotICByZXR1cm4gcHJvcERWYWx1ZXNfW2luZGV4XSA/IDEgOiAwOwotfQotCi1pbnQgZGVmaVJvdzo6cHJvcElzU3RyaW5nKGludCBpbmRleCkgY29uc3QgewotICBjaGFyIG1zZ1sxNjBdOwotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVByb3BzXykgewotICAgICBzcHJpbnRmIChtc2csICJFUlJPUiAoREVGUEFSUy02MTQwKTogVGhlIGluZGV4IG51bWJlciAlZCBzcGVjaWZpZWQgZm9yIHRoZSBWSUEgTEFZRVIgUkVDVEFOR0xFIGlzIGludmFsaWRlLlxuVmFsaWQgaW5kZXggbnVtYmVyIGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgICAgaW5kZXgsIG51bVByb3BzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MTQwLCBtc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfSAKLSAgcmV0dXJuIHByb3BEVmFsdWVzX1tpbmRleF0gPyAwIDogMTsKLX0KLQotY29uc3QgY2hhciogZGVmaVJvdzo6bmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG5hbWVfOwotfQotCi0KLWNvbnN0IGNoYXIqIGRlZmlSb3c6Om1hY3JvKCkgY29uc3QgewotICByZXR1cm4gbWFjcm9fOwotfQotCi0KLWRvdWJsZSBkZWZpUm93Ojp4KCkgY29uc3QgewotICByZXR1cm4geF87Ci19Ci0KLQotZG91YmxlIGRlZmlSb3c6OnkoKSBjb25zdCB7Ci0gIHJldHVybiB5XzsKLX0KLQotCi1kb3VibGUgZGVmaVJvdzo6eE51bSgpIGNvbnN0IHsKLSAgcmV0dXJuIHhOdW1fOwotfQotCi0KLWRvdWJsZSBkZWZpUm93Ojp5TnVtKCkgY29uc3QgewotICByZXR1cm4geU51bV87Ci19Ci0KLQotaW50IGRlZmlSb3c6Om9yaWVudCgpIGNvbnN0IHsKLSAgcmV0dXJuIG9yaWVudF87Ci19Ci0KLQotY29uc3QgY2hhciogZGVmaVJvdzo6b3JpZW50U3RyKCkgY29uc3QgewotICByZXR1cm4gKGRlZmlPcmllbnRTdHIob3JpZW50XykpOwotfQotCi0KLWludCBkZWZpUm93OjpoYXNEbygpIGNvbnN0IHsKLSAgcmV0dXJuIGhhc0RvXzsKLX0KLQotCi1pbnQgZGVmaVJvdzo6aGFzRG9TdGVwKCkgY29uc3QgewotICByZXR1cm4gaGFzRG9TdGVwXzsKLX0KLQotCi1kb3VibGUgZGVmaVJvdzo6eFN0ZXAoKSBjb25zdCB7Ci0gIHJldHVybiB4U3RlcF87Ci19Ci0KLQotZG91YmxlIGRlZmlSb3c6OnlTdGVwKCkgY29uc3QgewotICByZXR1cm4geVN0ZXBfOwotfQotCi0KLXZvaWQgZGVmaVJvdzo6cHJpbnQoRklMRSogZikgY29uc3QgewotICBmcHJpbnRmKGYsICJSb3cgJyVzJyAnJXMnICVnLCVnICBvcmllbnQgJXNcbiIsCi0gICAgICBuYW1lKCksIG1hY3JvKCksCi0gICAgICB4KCksIHkoKSwgb3JpZW50U3RyKCkpOwotICBmcHJpbnRmKGYsICIgIERPIFggJWcgU1RFUCAlZ1xuIiwgeE51bSgpLAotICAgICAgeFN0ZXAoKSk7Ci0gIGZwcmludGYoZiwgIiAgRE8gWSAlZyBTVEVQICVnXG4iLCB5TnVtKCksCi0gICAgICB5U3RlcCgpKTsKLX0KLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gICBkZWZpVHJhY2sKLS8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQotZGVmaVRyYWNrOjpkZWZpVHJhY2soZGVmckRhdGEgKmRhdGEpCi0gOiBkZWZEYXRhKGRhdGEpCi17Ci0gIEluaXQoKTsKLX0KLQotCi12b2lkIGRlZmlUcmFjazo6SW5pdCgpIHsKLSAgbWFjcm9fID0gMDsKLSAgbWFjcm9MZW5ndGhfID0gMDsKLSAgeF8gPSAwLjA7Ci0gIHhOdW1fID0gMC4wOwotICB4U3RlcF8gPSAwLjA7Ci0gIGxheWVyc0xlbmd0aF8gPSAwOwotICBudW1MYXllcnNfID0gMDsKLSAgbGF5ZXJzXyA9IDA7Ci0gIGZpcnN0VHJhY2tNYXNrXz0wOwotICBzYW1lbWFza18gPSAwOwotfQotCi1kZWZpVHJhY2s6On5kZWZpVHJhY2soKSB7Ci0gIERlc3Ryb3koKTsKLX0KLQotCi12b2lkIGRlZmlUcmFjazo6RGVzdHJveSgpIHsKLSAgaW50IGk7Ci0KLSAgaWYgKG1hY3JvXykgZnJlZShtYWNyb18pOwotCi0gIGlmIChsYXllcnNfKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bUxheWVyc187IGkrKykKLSAgICAgIGlmIChsYXllcnNfW2ldKSBmcmVlKGxheWVyc19baV0pOwotICAgIGZyZWUoKGNoYXIqKShsYXllcnNfKSk7Ci0gIH0KLX0KLQotCi12b2lkIGRlZmlUcmFjazo6c2V0dXAoY29uc3QgY2hhciogbWFjcm8pIHsKLSAgaW50IGk7Ci0gIGludCBsZW4gPSBzdHJsZW4obWFjcm8pICsgMTsKLQotICBpZiAobGVuID4gbWFjcm9MZW5ndGhfKSB7Ci0gICAgaWYgKG1hY3JvXykgZnJlZShtYWNyb18pOwotICAgIG1hY3JvTGVuZ3RoXyA9IGxlbjsKLSAgICBtYWNyb18gPSAoY2hhciopbWFsbG9jKGxlbik7Ci0gIH0KLSAgc3RyY3B5KG1hY3JvXywgZGVmRGF0YS0+REVGQ0FTRShtYWNybykpOwotCi0gIGlmIChsYXllcnNfKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bUxheWVyc187IGkrKykKLSAgICAgIGlmIChsYXllcnNfW2ldKSB7Ci0gICAgICAgIGZyZWUobGF5ZXJzX1tpXSk7Ci0gICAgICAgIGxheWVyc19baV0gPSAwOwotICAgICAgfQotICB9Ci0gIG51bUxheWVyc18gPSAwOwotICB4XyA9IDAuMDsKLSAgeFN0ZXBfID0gMC4wOwotICB4TnVtXyA9IDAuMDsKLQotICBmaXJzdFRyYWNrTWFza189MDsKLSAgc2FtZW1hc2tfPTA7Ci19Ci0KLQotdm9pZCBkZWZpVHJhY2s6OnNldERvKGRvdWJsZSB4LCBkb3VibGUgeF9udW0sIGRvdWJsZSB4X3N0ZXApIHsKLSAgeF8gPSB4OwotICB4U3RlcF8gPSB4X3N0ZXA7Ci0gIHhOdW1fID0geF9udW07Ci19Ci0KLQotdm9pZCBkZWZpVHJhY2s6OmFkZExheWVyKGNvbnN0IGNoYXIqIGxheWVyKSB7Ci0gIGNoYXIqIGw7Ci0gIGludCBsZW47Ci0KLSAgaWYgKG51bUxheWVyc18gPj0gbGF5ZXJzTGVuZ3RoXykgewotICAgIGludCBpOwotICAgIGNoYXIqKiBuZXdsOwotICAgIGxheWVyc0xlbmd0aF8gPSBsYXllcnNMZW5ndGhfID8gMiAqIGxheWVyc0xlbmd0aF8gOiA4OwotICAgIG5ld2wgPSAoY2hhcioqKW1hbGxvYyhsYXllcnNMZW5ndGhfKiBzaXplb2YoY2hhciopKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTGF5ZXJzXzsgaSsrKQotICAgICAgbmV3bFtpXSA9IGxheWVyc19baV07Ci0gICAgaWYgKGxheWVyc18pIGZyZWUoKGNoYXIqKShsYXllcnNfKSk7Ci0gICAgbGF5ZXJzXyA9IG5ld2w7Ci0gIH0KLQotICBsZW4gPSBzdHJsZW4obGF5ZXIpICsgMTsKLSAgbCA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgc3RyY3B5KGwsIGRlZkRhdGEtPkRFRkNBU0UobGF5ZXIpKTsKLSAgbGF5ZXJzX1tudW1MYXllcnNfKytdID0gbDsKLX0KLQotdm9pZCBkZWZpVHJhY2s6OmFkZE1hc2soaW50IGNvbG9yTWFzaywgaW50IHNhbWVNYXNrKSB7Ci0gICBzYW1lbWFza189c2FtZU1hc2s7Ci0gICBmaXJzdFRyYWNrTWFza189IGNvbG9yTWFzazsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpVHJhY2s6Om1hY3JvKCkgY29uc3QgewotICByZXR1cm4gbWFjcm9fOwotfQotCi0KLWRvdWJsZSBkZWZpVHJhY2s6OngoKSBjb25zdCB7Ci0gIHJldHVybiB4XzsKLX0KLQotCi1kb3VibGUgZGVmaVRyYWNrOjp4TnVtKCkgY29uc3QgewotICByZXR1cm4geE51bV87Ci19Ci0KLQotZG91YmxlIGRlZmlUcmFjazo6eFN0ZXAoKSBjb25zdCB7Ci0gIHJldHVybiB4U3RlcF87Ci19Ci0KLQotaW50IGRlZmlUcmFjazo6bnVtTGF5ZXJzKCkgY29uc3QgewotICByZXR1cm4gbnVtTGF5ZXJzXzsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpVHJhY2s6OmxheWVyKGludCBpbmRleCkgY29uc3QgewotICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IG51bUxheWVyc18pIHsKLSAgICByZXR1cm4gbGF5ZXJzX1tpbmRleF07Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotaW50IGRlZmlUcmFjazo6Zmlyc3RUcmFja01hc2soKSBjb25zdCB7Ci0gICAgcmV0dXJuIGZpcnN0VHJhY2tNYXNrXzsKLX0KLQotaW50IGRlZmlUcmFjazo6c2FtZU1hc2soKSBjb25zdCB7Ci0gICAgcmV0dXJuIHNhbWVtYXNrXzsKLX0KLQotdm9pZCBkZWZpVHJhY2s6OnByaW50KEZJTEUqIGYpIGNvbnN0IHsKLSAgaW50IGk7Ci0KLSAgZnByaW50ZihmLCAiVHJhY2sgJyVzJ1xuIiwgbWFjcm8oKSk7Ci0gIGZwcmludGYoZiwgIiAgRE8gJWcgJWcgU1RFUCAlZ1xuIiwKLSAgICAgIHgoKSwKLSAgICAgIHhOdW0oKSwKLSAgICAgIHhTdGVwKCkpOwotICBmcHJpbnRmKGYsICIgICVkIGxheWVycyAiLCBudW1MYXllcnMoKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBudW1MYXllcnMoKTsgaSsrKSB7Ci0gICAgZnByaW50ZihmLCAiICclcyciLCBsYXllcihpKSk7Ci0gIH0KLSAgZnByaW50ZihmLCAiXG4iKTsKLX0KLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gICBkZWZpR2NlbGxHcmlkCi0vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0KLWRlZmlHY2VsbEdyaWQ6OmRlZmlHY2VsbEdyaWQoZGVmckRhdGEgKmRhdGEpCi0gOiBkZWZEYXRhKGRhdGEpCi17Ci0gIEluaXQoKTsKLX0KLQotCi12b2lkIGRlZmlHY2VsbEdyaWQ6OkluaXQoKSB7Ci0gIG1hY3JvXyA9IDA7Ci0gIG1hY3JvTGVuZ3RoXyA9IDA7Ci0gIHhfID0gMDsKLSAgeE51bV8gPSAwOwotICB4U3RlcF8gPSAwOwotfQotCi0KLWRlZmlHY2VsbEdyaWQ6On5kZWZpR2NlbGxHcmlkKCkgewotICBEZXN0cm95KCk7Ci19Ci0KLQotdm9pZCBkZWZpR2NlbGxHcmlkOjpEZXN0cm95KCkgewotICBpZiAobWFjcm9fKSBmcmVlKG1hY3JvXyk7Ci19Ci0KLQotdm9pZCBkZWZpR2NlbGxHcmlkOjpzZXR1cChjb25zdCBjaGFyKiBtYWNybywgaW50IHgsIGludCB4TnVtLCBkb3VibGUgeFN0ZXApIHsKLSAgaW50IGxlbiA9IHN0cmxlbihtYWNybykgKyAxOwotICBpZiAobGVuID4gbWFjcm9MZW5ndGhfKSB7Ci0gICAgaWYgKG1hY3JvXykgZnJlZShtYWNyb18pOwotICAgIG1hY3JvTGVuZ3RoXyA9IGxlbjsKLSAgICBtYWNyb18gPSAoY2hhciopbWFsbG9jKGxlbik7Ci0gIH0KLSAgc3RyY3B5KG1hY3JvXywgZGVmRGF0YS0+REVGQ0FTRShtYWNybykpOwotCi0gIHhfID0geDsKLSAgeE51bV8gPSB4TnVtOwotICB4U3RlcF8gPSB4U3RlcDsKLX0KLQotCi1pbnQgZGVmaUdjZWxsR3JpZDo6eCgpIGNvbnN0IHsKLSAgcmV0dXJuIHhfOwotfQotCi0KLWludCBkZWZpR2NlbGxHcmlkOjp4TnVtKCkgY29uc3QgewotICByZXR1cm4geE51bV87Ci19Ci0KLQotZG91YmxlIGRlZmlHY2VsbEdyaWQ6OnhTdGVwKCkgY29uc3QgewotICByZXR1cm4geFN0ZXBfOwotfQotCi0KLWNvbnN0IGNoYXIqIGRlZmlHY2VsbEdyaWQ6Om1hY3JvKCkgY29uc3QgewotICByZXR1cm4gbWFjcm9fOwotfQotCi0KLXZvaWQgZGVmaUdjZWxsR3JpZDo6cHJpbnQoRklMRSogZikgY29uc3QgewotICBmcHJpbnRmKGYsICJHY2VsbEdyaWQgJyVzJ1xuIiwgbWFjcm8oKSk7Ci0gIGZwcmludGYoZiwgIiAgRE8gJWQgJWQgU1RFUCAlNS4xZlxuIiwKLSAgICAgIHgoKSwKLSAgICAgIHhOdW0oKSwKLSAgICAgIHhTdGVwKCkpOwotfQotCi0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlSb3dUcmFjay5ocHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlSb3dUcmFjay5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNWViYjAuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpUm93VHJhY2suaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaWZuZGVmIGRlZmlSb3dUcmFja19oCi0jZGVmaW5lIGRlZmlSb3dUcmFja19oCi0KLSNpbmNsdWRlICJkZWZpS1JEZWZzLmhwcCIKLSNpbmNsdWRlIDxzdGRpby5oPgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1jbGFzcyBkZWZyRGF0YTsKLQotY2xhc3MgZGVmaVJvd3sKLXB1YmxpYzoKLQotICBkZWZpUm93KGRlZnJEYXRhICpkYXRhKTsKLSAgdm9pZCBJbml0KCk7Ci0KLSAgfmRlZmlSb3coKTsKLSAgdm9pZCBEZXN0cm95KCk7Ci0gIHZvaWQgY2xlYXIoKTsKLQotICB2b2lkIHNldHVwKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIG1hY3JvLAotCSAgICAgZG91YmxlIHgsIGRvdWJsZSB5LCBpbnQgb3JpZW50KTsKLSAgdm9pZCBzZXREbyhkb3VibGUgeF9udW0sIGRvdWJsZSB5X251bSwKLQkgICAgIGRvdWJsZSB4X3N0ZXAsIGRvdWJsZSB5X3N0ZXApOwotICB2b2lkIHNldEhhc0RvU3RlcCgpOwotICB2b2lkIGFkZFByb3BlcnR5KGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHZhbHVlLCBjb25zdCBjaGFyIHR5cGUpOwotICB2b2lkIGFkZE51bVByb3BlcnR5KGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGRvdWJsZSBkLCAKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YWx1ZSwgY29uc3QgY2hhciB0eXBlKTsKLQotICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIG1hY3JvKCkgY29uc3Q7Ci0gIGRvdWJsZSB4KCkgY29uc3Q7Ci0gIGRvdWJsZSB5KCkgY29uc3Q7Ci0gIGludCBvcmllbnQoKSBjb25zdDsKLSAgY29uc3QgY2hhciogb3JpZW50U3RyKCkgY29uc3Q7Ci0gIGludCBoYXNEbygpIGNvbnN0OyAgICAgICAgICAgICAgIC8vIDUuNiwgRE8gaXMgb3B0aW9uYWwKLSAgZG91YmxlIHhOdW0oKSBjb25zdDsKLSAgZG91YmxlIHlOdW0oKSBjb25zdDsKLSAgaW50IGhhc0RvU3RlcCgpIGNvbnN0OyAgICAgICAgICAgLy8gNS42LCBTVEVQIGlzIG9wdGlvbmFsIGluIERPCi0gIGRvdWJsZSB4U3RlcCgpIGNvbnN0OwotICBkb3VibGUgeVN0ZXAoKSBjb25zdDsKLQotICBpbnQgbnVtUHJvcHMoKSBjb25zdDsKLSAgY29uc3QgY2hhciogIHByb3BOYW1lKGludCBpbmRleCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqICBwcm9wVmFsdWUoaW50IGluZGV4KSBjb25zdDsKLSAgZG91YmxlIHByb3BOdW1iZXIoaW50IGluZGV4KSBjb25zdDsKLSAgY29uc3QgY2hhciAgIHByb3BUeXBlKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCBwcm9wSXNOdW1iZXIoaW50IGluZGV4KSBjb25zdDsKLSAgaW50IHByb3BJc1N0cmluZyhpbnQgaW5kZXgpIGNvbnN0OwotCi0gIHZvaWQgcHJpbnQoRklMRSogZikgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgaW50IG5hbWVMZW5ndGhfOwotICBjaGFyKiBuYW1lXzsKLSAgaW50IG1hY3JvTGVuZ3RoXzsKLSAgY2hhciogbWFjcm9fOwotICBkb3VibGUgeF87Ci0gIGRvdWJsZSB5XzsKLSAgZG91YmxlIHhOdW1fOwotICBkb3VibGUgeU51bV87Ci0gIGludCBvcmllbnRfOwotICBkb3VibGUgeFN0ZXBfOwotICBkb3VibGUgeVN0ZXBfOwotICBpbnQgICAgaGFzRG9fOwotICBpbnQgICAgaGFzRG9TdGVwXzsKLQotICBpbnQgbnVtUHJvcHNfOwotICBpbnQgcHJvcHNBbGxvY2F0ZWRfOwotICBjaGFyKiogIHByb3BOYW1lc187Ci0gIGNoYXIqKiAgcHJvcFZhbHVlc187Ci0gIGRvdWJsZSogcHJvcERWYWx1ZXNfOwotICBjaGFyKiAgIHByb3BUeXBlc187Ci0KLSAgZGVmckRhdGEgKmRlZkRhdGE7Ci19OwotCi0KLQotY2xhc3MgZGVmaVRyYWNrewotcHVibGljOgotCi0gIGRlZmlUcmFjayhkZWZyRGF0YSAqZGF0YSk7Ci0gIHZvaWQgSW5pdCgpOwotCi0gIH5kZWZpVHJhY2soKTsKLSAgdm9pZCBEZXN0cm95KCk7Ci0KLSAgdm9pZCBzZXR1cChjb25zdCBjaGFyKiBtYWNybyk7Ci0gIHZvaWQgc2V0RG8oZG91YmxlIHgsIGRvdWJsZSB4X251bSwgZG91YmxlIHhfc3RlcCk7Ci0gIHZvaWQgYWRkTGF5ZXIoY29uc3QgY2hhciogbGF5ZXIpOwotICB2b2lkIGFkZE1hc2soaW50IGNvbG9yTWFzaywgaW50IHNhbWVNYXNrKTsKLQotICBjb25zdCBjaGFyKiBtYWNybygpIGNvbnN0OwotICBkb3VibGUgeCgpIGNvbnN0OwotICBkb3VibGUgeE51bSgpIGNvbnN0OwotICBkb3VibGUgeFN0ZXAoKSBjb25zdDsKLSAgaW50IG51bUxheWVycygpIGNvbnN0OwotICBjb25zdCBjaGFyKiBsYXllcihpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgZmlyc3RUcmFja01hc2soKSBjb25zdDsKLSAgaW50IHNhbWVNYXNrKCkgY29uc3Q7Ci0KLSAgdm9pZCBwcmludChGSUxFKiBmKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICBpbnQgbWFjcm9MZW5ndGhfOyAgLy8gYWxsb2NhdGVkIHNpemUgb2YgbWFjcm9fOwotICBjaGFyKiBtYWNyb187Ci0gIGRvdWJsZSB4XzsKLSAgZG91YmxlIHhOdW1fOwotICBkb3VibGUgeFN0ZXBfOwotICBpbnQgbGF5ZXJzTGVuZ3RoXzsgIC8vIGFsbG9jYXRlZCBzaXplIG9mIGxheWVyc18KLSAgaW50IG51bUxheWVyc187ICAvLyBudW1iZXIgb2YgcGxhY2VzIHVzZWQgaW4gbGF5ZXJzXwotICBjaGFyKiogbGF5ZXJzXzsKLSAgaW50IGZpcnN0VHJhY2tNYXNrXzsKLSAgaW50IHNhbWVtYXNrXzsKLQotICBkZWZyRGF0YSAqZGVmRGF0YTsKLX07Ci0KLQotCi1jbGFzcyBkZWZpR2NlbGxHcmlkIHsKLXB1YmxpYzoKLQotICBkZWZpR2NlbGxHcmlkKGRlZnJEYXRhICpkYXRhKTsKLSAgdm9pZCBJbml0KCk7Ci0KLSAgfmRlZmlHY2VsbEdyaWQoKTsKLSAgdm9pZCBEZXN0cm95KCk7Ci0KLSAgdm9pZCBzZXR1cChjb25zdCBjaGFyKiBtYWNybywgaW50IHgsIGludCB4TnVtLCBkb3VibGUgeFN0ZXApOwotCi0gIGNvbnN0IGNoYXIqIG1hY3JvKCkgY29uc3Q7Ci0gIGludCB4KCkgY29uc3Q7Ci0gIGludCB4TnVtKCkgY29uc3Q7Ci0gIGRvdWJsZSB4U3RlcCgpIGNvbnN0OwotCi0gIHZvaWQgcHJpbnQoRklMRSogZikgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgaW50IG1hY3JvTGVuZ3RoXzsKLSAgY2hhciogbWFjcm9fOwotICBpbnQgeF87Ci0gIGludCB4TnVtXzsKLSAgZG91YmxlIHhTdGVwXzsKLQotICBkZWZyRGF0YSAqZGVmRGF0YTsKLX07Ci0KLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLVVTRV9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaVNjYW5jaGFpbi5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlTY2FuY2hhaW4uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjA4OWU3Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaVNjYW5jaGFpbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1OTAgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMyAtIDIwMTUsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlICJsZXguaCIKLSNpbmNsdWRlICJkZWZpU2NhbmNoYWluLmhwcCIKLSNpbmNsdWRlICJkZWZpRGVidWcuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1kZWZpT3JkZXJlZDo6ZGVmaU9yZGVyZWQoZGVmckRhdGEgKmRhdGEpCi06IGRlZkRhdGEoZGF0YSkKLXt9Ci0KLWRlZmlPcmRlcmVkOjp+ZGVmaU9yZGVyZWQoKQotewotICAgIERlc3Ryb3koKTsKLX0KLQotdm9pZCBkZWZpT3JkZXJlZDo6Y2xlYXIoKSB7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgbnVtXzsgaSsrKSB7Ci0gICAgZnJlZSgoY2hhciopKGluc3RfW2ldKSk7Ci0gICAgaWYgKGluX1tpXSkgZnJlZSgoY2hhciopKGluX1tpXSkpOwotICAgIGlmIChvdXRfW2ldKSBmcmVlKChjaGFyKikob3V0X1tpXSkpOwotICB9Ci0gIG51bV8gPSAwOwotfQotCi0KLXZvaWQgZGVmaU9yZGVyZWQ6OkRlc3Ryb3koKSB7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgbnVtXzsgaSsrKSB7Ci0gICAgIGZyZWUoKGNoYXIqKShpbnN0X1tpXSkpOwotICAgICBmcmVlKChjaGFyKikoaW5fW2ldKSk7Ci0gICAgIGZyZWUoKGNoYXIqKShvdXRfW2ldKSk7Ci0gIH0KLSAgZnJlZSgoY2hhciopKGluc3RfKSk7Ci0gIGZyZWUoKGNoYXIqKShpbl8pKTsKLSAgZnJlZSgoY2hhciopKG91dF8pKTsKLSAgZnJlZSgoY2hhciopKGJpdHNfKSk7Ci19Ci0KLQotdm9pZCBkZWZpT3JkZXJlZDo6SW5pdCgpIHsKLSAgbnVtXyA9IDA7Ci0gIGFsbG9jYXRlZF8gPSAzMjsKLSAgaW5zdF8gPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKjMyKTsKLSAgaW5fICAgPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKjMyKTsKLSAgb3V0XyAgPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKjMyKTsKLSAgYml0c18gPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkqMzIpOwotfQotCi0KLXZvaWQgZGVmaU9yZGVyZWQ6OmJ1bXAoKSB7Ci0gIGludCBtYXggPSBhbGxvY2F0ZWRfICogMjsKLSAgaW50IGk7Ci0gIGNoYXIqKiBuaW4gPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKm1heCk7Ci0gIGNoYXIqKiBub3V0ID0gKGNoYXIqKiltYWxsb2Moc2l6ZW9mKGNoYXIqKSptYXgpOwotICBjaGFyKiogbmluc3QgPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKm1heCk7Ci0gIGludCogICBuYml0cyA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSptYXgpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fOyBpKyspIHsKLSAgICBuaW5baV0gID0gaW5fW2ldOwotICAgIG5vdXRbaV0gID0gb3V0X1tpXTsKLSAgICBuaW5zdFtpXSA9IGluc3RfW2ldOwotICAgIG5iaXRzW2ldID0gYml0c19baV07Ci0gIH0KLSAgZnJlZSgoY2hhciopKGluc3RfKSk7Ci0gIGZyZWUoKGNoYXIqKShpbl8pKTsKLSAgZnJlZSgoY2hhciopKG91dF8pKTsKLSAgZnJlZSgoY2hhciopKGJpdHNfKSk7Ci0gIGFsbG9jYXRlZF8gPSBtYXg7Ci0gIGluc3RfID0gbmluc3Q7Ci0gIGluXyA9IG5pbjsKLSAgb3V0XyA9IG5vdXQ7Ci0gIGJpdHNfID0gbmJpdHM7Ci19Ci0KLQotdm9pZCBkZWZpT3JkZXJlZDo6YWRkT3JkZXJlZChjb25zdCBjaGFyKiBpbnN0KSB7Ci0gIGlmIChudW1fID09IGFsbG9jYXRlZF8pIGJ1bXAoKTsKLSAgaW5zdF9bbnVtX10gPSAoY2hhciopbWFsbG9jKHN0cmxlbihpbnN0KSsxKTsKLSAgc3RyY3B5KGluc3RfW251bV9dLCBkZWZEYXRhLT5ERUZDQVNFKGluc3QpKTsKLSAgaW5fW251bV9dICAgPSAwOwotICBvdXRfW251bV9dICA9IDA7Ci0gIGJpdHNfW251bV9dID0gLTE7Ci0gIG51bV8gKz0gMTsKLX0KLQotCi12b2lkIGRlZmlPcmRlcmVkOjphZGRJbihjb25zdCBjaGFyKiBwaW4pIHsKLSAgaW5fW251bV8tMV0gPSAoY2hhciopbWFsbG9jKHN0cmxlbihwaW4pKzEpOwotICBzdHJjcHkoaW5fW251bV8tMV0sIGRlZkRhdGEtPkRFRkNBU0UocGluKSk7Ci19Ci0KLQotdm9pZCBkZWZpT3JkZXJlZDo6YWRkT3V0KGNvbnN0IGNoYXIqIHBpbikgewotICBvdXRfW251bV8tMV0gPSAoY2hhciopbWFsbG9jKHN0cmxlbihwaW4pKzEpOwotICBzdHJjcHkob3V0X1tudW1fLTFdLCBkZWZEYXRhLT5ERUZDQVNFKHBpbikpOwotfQotCi0KLXZvaWQgZGVmaU9yZGVyZWQ6OnNldE9yZGVyZWRCaXRzKGludCBiaXRzKSB7Ci0gIGJpdHNfW251bV8tMV0gPSBiaXRzOwotfQotCi0KLWludCBkZWZpT3JkZXJlZDo6bnVtKCkgY29uc3QgewotICByZXR1cm4gbnVtXzsKLX0KLQotCi1jaGFyKiogZGVmaU9yZGVyZWQ6Omluc3QoKSBjb25zdCB7Ci0gIHJldHVybiBpbnN0XzsKLX0KLQotCi1jaGFyKiogZGVmaU9yZGVyZWQ6OmluKCkgY29uc3QgewotICByZXR1cm4gaW5fOwotfQotCi0KLWNoYXIqKiBkZWZpT3JkZXJlZDo6b3V0KCkgY29uc3QgewotICByZXR1cm4gb3V0XzsKLX0KLQotCi1pbnQqIGRlZmlPcmRlcmVkOjpiaXRzKCkgY29uc3QgewotICByZXR1cm4gYml0c187Ci19Ci0KLQotZGVmaVNjYW5jaGFpbjo6ZGVmaVNjYW5jaGFpbihkZWZyRGF0YSAqZGF0YSkKLSA6IGRlZkRhdGEoZGF0YSkKLXsKLSAgSW5pdCgpOwotfQotCi0KLXZvaWQgZGVmaVNjYW5jaGFpbjo6SW5pdCgpIHsKLSAgbmFtZV8gPSAoY2hhciopbWFsbG9jKDMyKTsKLSAgbmFtZUxlbmd0aF8gPSAzMjsKLQotICBudW1PcmRlcmVkXyA9IDA7Ci0gIG51bU9yZGVyZWRBbGxvY2F0ZWRfID0gNDsKLSAgb3JkZXJlZF8gPSAoZGVmaU9yZGVyZWQqKiltYWxsb2Moc2l6ZW9mKGRlZmlPcmRlcmVkKikqNCk7Ci0KLSAgbnVtRmxvYXRpbmdfID0gMDsKLSAgbnVtRmxvYXRpbmdBbGxvY2F0ZWRfID0gNDsKLSAgZmxvYXRJbnN0XyA9IChjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikqNCk7Ci0gIGZsb2F0SW5fICAgPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKjQpOwotICBmbG9hdE91dF8gID0gKGNoYXIqKiltYWxsb2Moc2l6ZW9mKGNoYXIqKSo0KTsKLSAgZmxvYXRCaXRzXyA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSo0KTsKLQotICBzdG9wSW5zdF8gICAgID0gMDsKLSAgc3RvcFBpbl8gICAgICA9IDA7Ci0gIHN0YXJ0SW5zdF8gICAgPSAwOwotICBzdGFydFBpbl8gICAgID0gMDsKLSAgaGFzU3RhcnRfICAgICA9IDA7Ci0gIGhhc1N0b3BfICAgICAgPSAwOwotICBjb21tb25JblBpbl8gID0gMDsKLSAgY29tbW9uT3V0UGluXyA9IDA7Ci0gIGhhc1BhcnRpdGlvbl8gPSAwOwotICBwYXJ0TmFtZV8gICAgID0gMDsKLSAgbWF4Qml0c18gICAgICA9IC0xOwotfQotCi0KLXZvaWQgZGVmaVNjYW5jaGFpbjo6Y2xlYXIoKSB7Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1PcmRlcmVkXzsgaSsrKSB7Ci0gICAgZGVsZXRlIG9yZGVyZWRfW2ldOwotICAgIG9yZGVyZWRfW2ldID0gMDsKLSAgfQotCi0gIG51bU9yZGVyZWRfID0gMDsKLQotICBmb3IgKGkgPSAwOyBpIDwgbnVtRmxvYXRpbmdfOyBpKyspIHsKLSAgICBpZiAoZmxvYXRJbl9baV0pIGZyZWUoZmxvYXRJbl9baV0pOwotICAgIGlmIChmbG9hdE91dF9baV0pIGZyZWUoZmxvYXRPdXRfW2ldKTsKLSAgICBmcmVlKGZsb2F0SW5zdF9baV0pOwotICAgIGZsb2F0SW5zdF9baV0gPSAwOwotICAgIGZsb2F0Qml0c19baV0gPSAtMTsKLSAgfQotICBudW1GbG9hdGluZ18gPSAwOwotCi0gIGlmIChzdG9wSW5zdF8pIGZyZWUoc3RvcEluc3RfKTsKLSAgaWYgKHN0b3BQaW5fKSBmcmVlKHN0b3BQaW5fKTsKLSAgaWYgKHN0YXJ0SW5zdF8pIGZyZWUoc3RhcnRJbnN0Xyk7Ci0gIGlmIChzdGFydFBpbl8pIGZyZWUoc3RhcnRQaW5fKTsKLSAgaWYgKGNvbW1vbkluUGluXykgZnJlZShjb21tb25JblBpbl8pOwotICBpZiAoY29tbW9uT3V0UGluXykgZnJlZShjb21tb25PdXRQaW5fKTsKLQotICBzdG9wSW5zdF8gPSAwOwotICBzdG9wUGluXyA9IDA7Ci0gIHN0YXJ0SW5zdF8gPSAwOwotICBzdGFydFBpbl8gPSAwOwotICBoYXNTdGFydF8gPSAwOwotICBoYXNTdG9wXyA9IDA7Ci0gIGNvbW1vbkluUGluXyA9IDA7Ci0gIGNvbW1vbk91dFBpbl8gPSAwOwotICBoYXNQYXJ0aXRpb25fID0gMDsKLSAgaWYgKHBhcnROYW1lXykKLSAgICBmcmVlKChjaGFyKikocGFydE5hbWVfKSk7Ci0gIHBhcnROYW1lXyA9IDA7Ci0gIG1heEJpdHNfICA9IC0xOyAKLX0KLQotCi12b2lkIGRlZmlTY2FuY2hhaW46OkRlc3Ryb3koKSB7Ci0gIGNsZWFyKCk7Ci0gIGZyZWUobmFtZV8pOwotICBmcmVlKChjaGFyKikob3JkZXJlZF8pKTsKLSAgZnJlZSgoY2hhciopKGZsb2F0SW5zdF8pKTsKLSAgZnJlZSgoY2hhciopKGZsb2F0SW5fKSk7Ci0gIGZyZWUoKGNoYXIqKShmbG9hdE91dF8pKTsKLSAgZnJlZSgoY2hhciopKGZsb2F0Qml0c18pKTsKLX0KLQotCi1kZWZpU2NhbmNoYWluOjp+ZGVmaVNjYW5jaGFpbigpIHsKLSAgRGVzdHJveSgpOwotfQotCi0KLXZvaWQgZGVmaVNjYW5jaGFpbjo6c2V0TmFtZShjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIGludCBsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotCi0gIGNsZWFyKCk7Ci0KLSAgaWYgKGxlbiA+IG5hbWVMZW5ndGhfKSB7Ci0gICAgZnJlZShuYW1lXyk7Ci0gICAgbmFtZV8gPSAoY2hhciopbWFsbG9jKGxlbik7Ci0gICAgbmFtZUxlbmd0aF8gPSBsZW47Ci0gIH0KLSAgc3RyY3B5KG5hbWVfLCBkZWZEYXRhLT5ERUZDQVNFKG5hbWUpKTsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpU2NhbmNoYWluOjpuYW1lKCkgY29uc3QgewotICByZXR1cm4gbmFtZV87Ci19Ci0KLQotdm9pZCBkZWZpU2NhbmNoYWluOjphZGRGbG9hdGluZ0luc3QoY29uc3QgY2hhciogbmFtZSkgewotCi0gIGlmIChudW1GbG9hdGluZ18gPj0gbnVtRmxvYXRpbmdBbGxvY2F0ZWRfKSB7Ci0gICAgaW50IG1heCA9IDIgKiBudW1GbG9hdGluZ0FsbG9jYXRlZF87Ci0gICAgaW50IGk7Ci0gICAgY2hhcioqIG5pbnN0ID0gKGNoYXIqKiltYWxsb2Moc2l6ZW9mKGNoYXIqKSptYXgpOwotICAgIGNoYXIqKiBuaW4gPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKm1heCk7Ci0gICAgY2hhcioqIG5vdXQgPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKm1heCk7Ci0gICAgaW50KiAgIG5iaXRzID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKm1heCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bUZsb2F0aW5nXzsgaSsrKSB7Ci0gICAgICBuaW5zdFtpXSA9IGZsb2F0SW5zdF9baV07Ci0gICAgICBuaW5baV0gPSBmbG9hdEluX1tpXTsKLSAgICAgIG5vdXRbaV0gPSBmbG9hdE91dF9baV07Ci0gICAgICBuYml0c1tpXSA9IGZsb2F0Qml0c19baV07Ci0gICAgfQotICAgIGZyZWUoKGNoYXIqKShmbG9hdEluc3RfKSk7Ci0gICAgZnJlZSgoY2hhciopKGZsb2F0SW5fKSk7Ci0gICAgZnJlZSgoY2hhciopKGZsb2F0T3V0XykpOwotICAgIGZyZWUoKGNoYXIqKShmbG9hdEJpdHNfKSk7Ci0gICAgZmxvYXRJbnN0XyA9IG5pbnN0OwotICAgIGZsb2F0T3V0XyA9IG5vdXQ7Ci0gICAgZmxvYXRJbl8gPSBuaW47Ci0gICAgZmxvYXRCaXRzXyA9IG5iaXRzOwotICAgIG51bUZsb2F0aW5nQWxsb2NhdGVkXyA9IG1heDsKLSAgfQotCi0gIGZsb2F0SW5zdF9bbnVtRmxvYXRpbmdfXSA9Ci0gICAgIChjaGFyKiltYWxsb2Moc3RybGVuKG5hbWUpICsgMSk7Ci0gIHN0cmNweShmbG9hdEluc3RfW251bUZsb2F0aW5nX10sIGRlZkRhdGEtPkRFRkNBU0UobmFtZSkpOwotICBmbG9hdEluX1tudW1GbG9hdGluZ19dID0gMDsKLSAgZmxvYXRPdXRfW251bUZsb2F0aW5nX10gPSAwOwotICBmbG9hdEJpdHNfW251bUZsb2F0aW5nX10gPSAtMTsKLSAgbnVtRmxvYXRpbmdfICs9IDE7Ci19Ci0KLQotdm9pZCBkZWZpU2NhbmNoYWluOjphZGRGbG9hdGluZ0luKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgaW50IGxlbiA9IHN0cmxlbihuYW1lKSArIDE7Ci0gIGZsb2F0SW5fW251bUZsb2F0aW5nXy0xXSA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgc3RyY3B5KGZsb2F0SW5fW251bUZsb2F0aW5nXy0xXSwgZGVmRGF0YS0+REVGQ0FTRShuYW1lKSk7Ci19Ci0KLQotdm9pZCBkZWZpU2NhbmNoYWluOjphZGRGbG9hdGluZ091dChjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIGludCBsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotICBmbG9hdE91dF9bbnVtRmxvYXRpbmdfLTFdID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICBzdHJjcHkoZmxvYXRPdXRfW251bUZsb2F0aW5nXy0xXSwgZGVmRGF0YS0+REVGQ0FTRShuYW1lKSk7Ci19Ci0KLQotdm9pZCBkZWZpU2NhbmNoYWluOjpzZXRGbG9hdGluZ0JpdHMoaW50IGJpdHMpIHsKLSAgZmxvYXRCaXRzX1tudW1GbG9hdGluZ18tMV0gPSBiaXRzOwotfQotCi0KLXZvaWQgZGVmaVNjYW5jaGFpbjo6YWRkT3JkZXJlZEluKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgZGVmaU9yZGVyZWQqIG8gPSBvcmRlcmVkX1tudW1PcmRlcmVkXy0xXTsKLSAgby0+YWRkSW4obmFtZSk7Ci19Ci0KLQotdm9pZCBkZWZpU2NhbmNoYWluOjphZGRPcmRlcmVkT3V0KGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgZGVmaU9yZGVyZWQqIG8gPSBvcmRlcmVkX1tudW1PcmRlcmVkXy0xXTsKLSAgby0+YWRkT3V0KG5hbWUpOwotfQotCi0KLXZvaWQgZGVmaVNjYW5jaGFpbjo6YWRkT3JkZXJlZEluc3QoY29uc3QgY2hhciogbmFtZSkgewotICBkZWZpT3JkZXJlZCogbyA9IG9yZGVyZWRfW251bU9yZGVyZWRfLTFdOwotICBvLT5hZGRPcmRlcmVkKG5hbWUpOwotfQotCi0KLXZvaWQgZGVmaVNjYW5jaGFpbjo6c2V0T3JkZXJlZEJpdHMoaW50IGJpdHMpIHsKLSAgZGVmaU9yZGVyZWQqIG8gPSBvcmRlcmVkX1tudW1PcmRlcmVkXy0xXTsKLSAgby0+c2V0T3JkZXJlZEJpdHMoYml0cyk7Ci19Ci0KLQotdm9pZCBkZWZpU2NhbmNoYWluOjphZGRPcmRlcmVkTGlzdCgpIHsKLSAgZGVmaU9yZGVyZWQqIG87Ci0KLSAgaWYgKG51bU9yZGVyZWRfID09IG51bU9yZGVyZWRBbGxvY2F0ZWRfKSB7Ci0gICAgaW50IG1heCA9IDIgKiBudW1PcmRlcmVkQWxsb2NhdGVkXzsKLSAgICBpbnQgaTsKLSAgICBkZWZpT3JkZXJlZCoqIG5vID0gKGRlZmlPcmRlcmVkKiopbWFsbG9jKHNpemVvZihkZWZpT3JkZXJlZCopKm1heCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bU9yZGVyZWRfOyBpKyspIHsKLSAgICAgIG5vW2ldID0gb3JkZXJlZF9baV07Ci0gICAgfQotICAgIGZyZWUoKGNoYXIqKShvcmRlcmVkXykpOwotICAgIG9yZGVyZWRfID0gbm87Ci0gICAgbnVtT3JkZXJlZEFsbG9jYXRlZF8gPSBtYXg7Ci0gIH0KLQotICBvID0gbmV3IGRlZmlPcmRlcmVkKGRlZkRhdGEpOwotICBvcmRlcmVkX1tudW1PcmRlcmVkX10gPSBvOwotICBvLT5Jbml0KCk7Ci0gIG51bU9yZGVyZWRfICs9IDE7Ci19Ci0KLQotdm9pZCBkZWZpU2NhbmNoYWluOjpzZXRTdGFydChjb25zdCBjaGFyKiBpbnN0LCBjb25zdCBjaGFyKiBwaW4pIHsKLSAgIGludCBsZW47Ci0gICBpZiAoc3RhcnRJbnN0XykKLSAgICAgIGRlZmlFcnJvcigwLCA2MTUwLCAiRVJST1IgKERFRlBBUlMtNjE1MCk6IFRoZSBTVEFSVCBzdGF0ZW1lbnQgaW4gdGhlIFNDQU5DSEFJTlMgaGFzIGRlZmluZWQgbW9yZSB0aGFuIG9uZSB0aW1lIGluIHRoZSBTQ0FOQ0hBSU5TIHN0YXRlbWVudC5cblVwZGF0ZSB0aGUgREVGIGZpbGUgdG8gb25seSBvbmUgU1RBUlQgc3RhdGVtZW50IGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLCBkZWZEYXRhKTsKLSAgIGxlbiA9IHN0cmxlbihpbnN0KSArIDE7Ci0gICBzdGFydEluc3RfID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICAgc3RyY3B5KHN0YXJ0SW5zdF8sIGRlZkRhdGEtPkRFRkNBU0UoaW5zdCkpOwotICAgbGVuID0gc3RybGVuKHBpbikgKyAxOwotICAgc3RhcnRQaW5fID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICAgc3RyY3B5KHN0YXJ0UGluXywgZGVmRGF0YS0+REVGQ0FTRShwaW4pKTsKLSAgIGhhc1N0YXJ0XyA9IDE7Ci19Ci0KLQotdm9pZCBkZWZpU2NhbmNoYWluOjpzZXRTdG9wKGNvbnN0IGNoYXIqIGluc3QsIGNvbnN0IGNoYXIqIHBpbikgewotICAgaW50IGxlbjsKLSAgIGlmIChzdG9wSW5zdF8pCi0gICAgICBkZWZpRXJyb3IoMCwgNjE1MSwgIkVSUk9SIChERUZQQVJTLTYxNTEpOiBUaGUgU1RPUCBzdGF0bWVudCBpbiB0aGUgU0NBTkNIQUlOUyBoYXMgZGVmaW5lZCBtb3JlIHRoYW4gb25lIHRpbWUgaW4gdGhlIFNDQU5DSEFJTlMgc3RhdGVtZW50LlxuVXBkYXRlIHRoZSBERUYgZmlsZSB0byBvbmx5IG9uZSBTVE9QIHN0YXRlbWVudCBhbmQgdGhlbiB0cnkgYWdhaW4uIiwgZGVmRGF0YSk7Ci0gICBsZW4gPSBzdHJsZW4oaW5zdCkgKyAxOwotICAgc3RvcEluc3RfID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICAgc3RyY3B5KHN0b3BJbnN0XywgZGVmRGF0YS0+REVGQ0FTRShpbnN0KSk7Ci0gICBsZW4gPSBzdHJsZW4ocGluKSArIDE7Ci0gICBzdG9wUGluXyA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgIHN0cmNweShzdG9wUGluXywgZGVmRGF0YS0+REVGQ0FTRShwaW4pKTsKLSAgIGhhc1N0b3BfID0gMTsKLX0KLQotCi0vLyA1LjQuMQotdm9pZCBkZWZpU2NhbmNoYWluOjpzZXRQYXJ0aXRpb24oY29uc3QgY2hhciogcGFydE5hbWUsIGludCBtYXhCaXRzKSB7Ci0gIGlmIChwYXJ0TmFtZV8pCi0gICAgIGZyZWUocGFydE5hbWVfKTsKLSAgcGFydE5hbWVfID0gKGNoYXIqKW1hbGxvYyhzdHJsZW4ocGFydE5hbWUpICsgMSk7Ci0gIHN0cmNweShwYXJ0TmFtZV8sIGRlZkRhdGEtPkRFRkNBU0UocGFydE5hbWUpKTsKLSAgbWF4Qml0c18gPSBtYXhCaXRzOwotICBoYXNQYXJ0aXRpb25fID0gMTsKLX0KLQotCi1pbnQgZGVmaVNjYW5jaGFpbjo6aGFzU3RhcnQoKSBjb25zdCB7Ci0gIHJldHVybiAoaW50KShoYXNTdGFydF8pOwotfQotCi0KLWludCBkZWZpU2NhbmNoYWluOjpoYXNTdG9wKCkgY29uc3QgewotICByZXR1cm4gKGludCkoaGFzU3RvcF8pOwotfQotCi0KLWludCBkZWZpU2NhbmNoYWluOjpoYXNGbG9hdGluZygpIGNvbnN0IHsKLSAgcmV0dXJuIG51bUZsb2F0aW5nXyA/IDEgOiAwIDsKLX0KLQotCi1pbnQgZGVmaVNjYW5jaGFpbjo6aGFzT3JkZXJlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIG51bU9yZGVyZWRfID8gMSA6IDAgOwotfQotCi0KLS8vIDUuNC4xCi1pbnQgZGVmaVNjYW5jaGFpbjo6aGFzUGFydGl0aW9uKCkgY29uc3QgewotICByZXR1cm4gaGFzUGFydGl0aW9uXzsKLX0KLQotCi0vLyA1LjQuMQotaW50IGRlZmlTY2FuY2hhaW46Omhhc1BhcnRpdGlvbk1heEJpdHMoKSBjb25zdCB7Ci0gIHJldHVybiAobWF4Qml0c18gIT0gLTEpID8gMSA6IDA7Ci19Ci0KLQotLy8gNS40LjEKLWNvbnN0IGNoYXIqIGRlZmlTY2FuY2hhaW46OnBhcnRpdGlvbk5hbWUoKSBjb25zdCB7Ci0gIHJldHVybiBwYXJ0TmFtZV87Ci19Ci0KLQotLy8gNS40LjEKLWludCBkZWZpU2NhbmNoYWluOjpwYXJ0aXRpb25NYXhCaXRzKCkgY29uc3QgewotICByZXR1cm4gbWF4Qml0c187Ci19Ci0KLQotdm9pZCBkZWZpU2NhbmNoYWluOjpzdGFydChjaGFyKiogaW5zdCwgY2hhcioqIHBpbikgY29uc3QgewotICBpZiAoaW5zdCkgKmluc3QgPSBzdGFydEluc3RfOwotICBpZiAocGluKSAqcGluID0gc3RhcnRQaW5fOwotfQotCi0KLXZvaWQgZGVmaVNjYW5jaGFpbjo6c3RvcChjaGFyKiogaW5zdCwgY2hhcioqIHBpbikgY29uc3QgewotICBpZiAoaW5zdCkgKmluc3QgPSBzdG9wSW5zdF87Ci0gIGlmIChwaW4pICpwaW4gPSBzdG9wUGluXzsKLX0KLQotCi1pbnQgZGVmaVNjYW5jaGFpbjo6bnVtT3JkZXJlZExpc3RzKCkgY29uc3QgewotICByZXR1cm4gbnVtT3JkZXJlZF87Ci19Ci0KLQotdm9pZCBkZWZpU2NhbmNoYWluOjpvcmRlcmVkKGludCBpbmRleCwgaW50KiBzaXplLCBjaGFyKioqIGluc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyKioqIGluUGluLCBjaGFyKioqIG91dFBpbiwgaW50KiogYml0cykgY29uc3QgewotICBkZWZpT3JkZXJlZCogbzsKLSAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPD0gbnVtT3JkZXJlZF8pIHsKLSAgICBvID0gb3JkZXJlZF9baW5kZXhdOwotICAgICpzaXplICAgPSBvLT5udW0oKTsKLSAgICAqaW5zdCAgID0gby0+aW5zdCgpOwotICAgICppblBpbiAgPSBvLT5pbigpOwotICAgICpvdXRQaW4gPSBvLT5vdXQoKTsKLSAgICAqYml0cyAgID0gby0+Yml0cygpOwotICB9IGVsc2UgewotICAgICpzaXplID0gMTA7Ci0gICAgKmluc3QgPSAwOwotICB9Ci19Ci0KLQotdm9pZCBkZWZpU2NhbmNoYWluOjpmbG9hdGluZyhpbnQqIHNpemUsIGNoYXIqKiogaW5zdCwKLSAgICAgICAgICAgICAgICAgY2hhcioqKiBpblBpbiwgY2hhcioqKiBvdXRQaW4sIGludCoqIGJpdHMpIGNvbnN0IHsKLSAgKnNpemUgICA9IG51bUZsb2F0aW5nXzsKLSAgKmluc3QgICA9IGZsb2F0SW5zdF87Ci0gICppblBpbiAgPSBmbG9hdEluXzsKLSAgKm91dFBpbiA9IGZsb2F0T3V0XzsKLSAgKmJpdHMgICA9IGZsb2F0Qml0c187Ci19Ci0KLQotdm9pZCBkZWZpU2NhbmNoYWluOjpzZXRDb21tb25PdXQoY29uc3QgY2hhciogcGluKSB7Ci0gIGludCBsZW4gPSBzdHJsZW4ocGluKSArIDE7Ci0gIGNvbW1vbk91dFBpbl8gPSAoY2hhciopbWFsbG9jKGxlbik7Ci0gIHN0cmNweShjb21tb25PdXRQaW5fLCBkZWZEYXRhLT5ERUZDQVNFKHBpbikpOwotfQotCi0KLXZvaWQgZGVmaVNjYW5jaGFpbjo6c2V0Q29tbW9uSW4oY29uc3QgY2hhciogcGluKSB7Ci0gIGludCBsZW4gPSBzdHJsZW4ocGluKSArIDE7Ci0gIGNvbW1vbkluUGluXyA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgc3RyY3B5KGNvbW1vbkluUGluXywgZGVmRGF0YS0+REVGQ0FTRShwaW4pKTsKLX0KLQotCi1pbnQgZGVmaVNjYW5jaGFpbjo6aGFzQ29tbW9uSW5QaW4oKSBjb25zdCB7Ci0gIHJldHVybiBjb21tb25JblBpbl8gPyAxIDogMDsKLX0KLQotCi1pbnQgZGVmaVNjYW5jaGFpbjo6aGFzQ29tbW9uT3V0UGluKCkgY29uc3QgewotICByZXR1cm4gY29tbW9uT3V0UGluXyA/IDEgOiAwOwotfQotCi0KLWNvbnN0IGNoYXIqIGRlZmlTY2FuY2hhaW46OmNvbW1vbkluUGluKCkgY29uc3QgewotICByZXR1cm4gY29tbW9uSW5QaW5fOwotfQotCi0KLWNvbnN0IGNoYXIqIGRlZmlTY2FuY2hhaW46OmNvbW1vbk91dFBpbigpIGNvbnN0IHsKLSAgcmV0dXJuIGNvbW1vbk91dFBpbl87Ci19Ci0KLQotdm9pZCBkZWZpU2NhbmNoYWluOjpwcmludChGSUxFKiBmKSBjb25zdCB7Ci0gIGNoYXIqIGE7Ci0gIGNoYXIqIGI7Ci0KLSAgY2hhcioqIGluc3Q7Ci0gIGNoYXIqKiBpbjsKLSAgY2hhcioqIG91dDsKLSAgaW50KiAgIGJpdHM7Ci0gIGludCBudW07Ci0gIGludCBpOwotICBpbnQgaDsKLQotICBmcHJpbnRmKGYsICJTY2FuIGNoYWluICclcycgICVkIHRoaW5nc1xuIiwKLSAgICAgIG5hbWUoKSwKLSAgICAgIGhhc1N0YXJ0KCkgKwotICAgICAgaGFzU3RvcCgpICsKLSAgICAgIG51bUZsb2F0aW5nXyArCi0gICAgICBudW1PcmRlcmVkTGlzdHMoKSk7Ci0KLSAgaWYgKGhhc1N0YXJ0KCkpIHsKLSAgICBzdGFydCgmYSwgJmIpOwotICAgIGZwcmludGYoZiwgIiAgc3RhcnQgaW5zdCAnJXMnIHBpbiAnJXMnXG4iLCBhLCBiKTsKLSAgfQotCi0gIGlmIChoYXNTdG9wKCkpIHsKLSAgICBzdG9wKCZhLCAmYik7Ci0gICAgZnByaW50ZihmLCAiICBzdG9wIGluc3QgJyVzJyBwaW4gJyVzJ1xuIiwgYSwgYik7Ci0gIH0KLQotICBmbG9hdGluZygmbnVtLCAmaW5zdCwgJmluLCAmb3V0LCAmYml0cyk7Ci0gIGZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewotICAgIGZwcmludGYoZiwgIiAgZmxvYXRpbmcgJyVzJyBJTj0lcyAgT1VUPSVzIEJJVFM9JWRcbiIsIGluc3RbaV0sCi0gICAgICAgaW5baV0/aW5baV06Ik5JTCIsIG91dFtpXT9vdXRbaV06Ik5JTCIsIGJpdHNbaV0/Yml0c1tpXTowKTsKLSAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1PcmRlcmVkTGlzdHMoKTsgaSsrKSB7Ci0gICAgb3JkZXJlZChpLCAmbnVtLCAmaW5zdCwgJmluLCAmb3V0LCAmYml0cyk7Ci0gICAgZnByaW50ZihmLCAiICAlZCBvcmRlcmVkXG4iLCBpKTsKLSAgICBmb3IgKGggPSAwOyBoIDwgbnVtOyBoKyspIHsKLSAgICAgIGZwcmludGYoZiwgIiAgICAgICAgJyVzJyBJTj0lcyBPVVQ9JXMgQklUUz0lZFxuIiwgaW5zdFtoXSwKLSAgICAgICBpbltoXT9pbltoXToiTklMIiwgb3V0W2hdP291dFtoXToiTklMIiwgYml0c1toXT9iaXRzW2hdOjApOwotICAgIH0KLSAgfQotCi0gIGlmIChoYXNDb21tb25JblBpbigpKQotICAgIGZwcmludGYoZiwgIiAgY29tbW9uIGluIHBpbiAlc1xuIiwgY29tbW9uSW5QaW4oKSk7Ci0KLSAgaWYgKGhhc0NvbW1vbk91dFBpbigpKQotICAgIGZwcmludGYoZiwgIiAgY29tbW9uIG91dCBwaW4gJXNcbiIsIGNvbW1vbk91dFBpbigpKTsKLX0KLQotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpU2NhbmNoYWluLmhwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaVNjYW5jaGFpbi5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NmU0NzYuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpU2NhbmNoYWluLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2lmbmRlZiBkZWZpU2NhbmNoYWluX2gKLSNkZWZpbmUgZGVmaVNjYW5jaGFpbl9oCi0KLSNpbmNsdWRlICJkZWZpS1JEZWZzLmhwcCIKLSNpbmNsdWRlIDxzdGRpby5oPgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1jbGFzcyBkZWZyRGF0YTsKLQotY2xhc3MgZGVmaU9yZGVyZWQgewotcHVibGljOgotICBkZWZpT3JkZXJlZChkZWZyRGF0YSAqZGF0YSk7Ci0gIH5kZWZpT3JkZXJlZCgpOwotCi0gIHZvaWQgYWRkT3JkZXJlZChjb25zdCBjaGFyKiBpbnN0KTsKLSAgdm9pZCBhZGRJbihjb25zdCBjaGFyKiBwaW4pOwotICB2b2lkIGFkZE91dChjb25zdCBjaGFyKiBwaW4pOwotICB2b2lkIHNldE9yZGVyZWRCaXRzKGludCBiaXRzKTsgICAgICAgIC8vIDUuNC4xCi0gIHZvaWQgYnVtcCgpOwotICB2b2lkIEluaXQoKTsKLSAgdm9pZCBEZXN0cm95KCk7Ci0gIHZvaWQgY2xlYXIoKTsKLQotICBpbnQgbnVtKCkgY29uc3Q7Ci0gIGNoYXIqKiBpbnN0KCkgY29uc3Q7Ci0gIGNoYXIqKiBpbigpIGNvbnN0OwotICBjaGFyKiogb3V0KCkgY29uc3Q7Ci0gIGludCogICBiaXRzKCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgLy8gNS40LjEKLQotcHJvdGVjdGVkOgotICBpbnQgbnVtXzsKLSAgaW50IGFsbG9jYXRlZF87Ci0gIGNoYXIqKiBpbnN0XzsKLSAgY2hhcioqIGluXzsKLSAgY2hhcioqIG91dF87Ci0gIGludCogICBiaXRzXzsgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNC4xCi0gICAgCi0gIGRlZnJEYXRhICpkZWZEYXRhOwotfTsKLQotCi0vLyBTdHJ1Y3QgaG9sZHMgdGhlIGRhdGEgZm9yIG9uZSBTY2FuIGNoYWluLgotLy8KLWNsYXNzIGRlZmlTY2FuY2hhaW4gewotcHVibGljOgotICBkZWZpU2NhbmNoYWluKGRlZnJEYXRhICpkYXRhKTsKLSAgdm9pZCBJbml0KCk7Ci0KLSAgdm9pZCBEZXN0cm95KCk7Ci0gIH5kZWZpU2NhbmNoYWluKCk7Ci0KLSAgdm9pZCBzZXROYW1lKGNvbnN0IGNoYXIqIG5hbWUpOwotICB2b2lkIGNsZWFyKCk7Ci0KLSAgdm9pZCBhZGRPcmRlcmVkTGlzdCgpOwotICB2b2lkIGFkZE9yZGVyZWRJbnN0KGNvbnN0IGNoYXIqIGluc3QpOwotICB2b2lkIGFkZE9yZGVyZWRJbihjb25zdCBjaGFyKiBpblBpbik7Ci0gIHZvaWQgYWRkT3JkZXJlZE91dChjb25zdCBjaGFyKiBvdXRQaW4pOwotICB2b2lkIHNldE9yZGVyZWRCaXRzKGludCBiaXRzKTsgICAgICAvLyA1LjQuMQotCi0gIHZvaWQgYWRkRmxvYXRpbmdJbnN0KGNvbnN0IGNoYXIqIGluc3QpOwotICB2b2lkIGFkZEZsb2F0aW5nSW4oY29uc3QgY2hhciogaW5QaW4pOwotICB2b2lkIGFkZEZsb2F0aW5nT3V0KGNvbnN0IGNoYXIqIG91dFBpbik7Ci0gIHZvaWQgc2V0RmxvYXRpbmdCaXRzKGludCBiaXRzKTsgICAgIC8vIDUuNC4xCi0KLSAgdm9pZCBzZXRTdGFydChjb25zdCBjaGFyKiBpbnN0LCBjb25zdCBjaGFyKiBwaW4pOwotICB2b2lkIHNldFN0b3AoY29uc3QgY2hhciogaW5zdCwgY29uc3QgY2hhciogcGluKTsKLSAgdm9pZCBzZXRDb21tb25Jbihjb25zdCBjaGFyKiBwaW4pOwotICB2b2lkIHNldENvbW1vbk91dChjb25zdCBjaGFyKiBwaW4pOwotICB2b2lkIHNldFBhcnRpdGlvbihjb25zdCBjaGFyKiBwYXJ0TmFtZSwgaW50IG1heEJpdHMpOyAgICAvLyA1LjQuMQotCi0gIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdDsKLSAgaW50IGhhc1N0YXJ0KCkgY29uc3Q7Ci0gIGludCBoYXNTdG9wKCkgY29uc3Q7Ci0gIGludCBoYXNGbG9hdGluZygpIGNvbnN0OwotICBpbnQgaGFzT3JkZXJlZCgpIGNvbnN0OwotICBpbnQgaGFzQ29tbW9uSW5QaW4oKSBjb25zdDsKLSAgaW50IGhhc0NvbW1vbk91dFBpbigpIGNvbnN0OwotICBpbnQgaGFzUGFydGl0aW9uKCkgY29uc3Q7ICAgICAgICAgICAvLyA1LjQuMQotICBpbnQgaGFzUGFydGl0aW9uTWF4Qml0cygpIGNvbnN0OyAgICAvLyA1LjQuMQotCi0gIC8vIElmIHRoZSBwaW4gcGFydCBvZiB0aGVzZSByb3V0aW5lcyB3ZXJlIG5vdCBzdXBwbGllZCBpbiB0aGUgREVGCi0gIC8vIHRoZW4gYSBOVUxMIHBvaW50ZXIgd2lsbCBiZSByZXR1cm5lZC4KLSAgdm9pZCBzdGFydChjaGFyKiogaW5zdCwgY2hhcioqIHBpbikgY29uc3Q7Ci0gIHZvaWQgc3RvcChjaGFyKiogaW5zdCwgY2hhcioqIHBpbikgY29uc3Q7Ci0KLSAgLy8gVGhlcmUgY291bGQgYmUgbWFueSBPUkRFUkVEIGNvbnN0cnVjdHMgaW4gdGhlIERFRi4gIFRoZSBkYXRhIGluCi0gIC8vIGVhY2ggT1JERVJFRCBjb25zdHJ1Y3QgaXMgc3RvcmVkIGluIGl0cyBvd24gYXJyYXkuICBUaGUgbnVtT3JkZXJlZExpc3RzKCkKLSAgLy8gcm91dGluZSB0ZWxscyBob3cgbWFueSBsaXN0cyB0aGVyZSBhcmUuCi0gIGludCBudW1PcmRlcmVkTGlzdHMoKSBjb25zdDsKLQotICAvLyBUaGlzIHJvdXRpbmUgd2lsbCByZXR1cm4gYW4gYXJyYXkgb2YgaW5zdGFuY2VzIGFuZAotICAvLyBhbiBhcnJheSBvZiBpbiBhbmQgb3V0IHBpbnMuCi0gIC8vIFRoZSBudW1iZXIgaWYgdGhpbmdzIGluIHRoZSBhcnJheXMgaXMgcmV0dXJuZWQgaW4gc2l6ZS4KLSAgLy8gVGhlIGluUGluIGFuZCBvdXRQaW4gZW50cnkgaXMgb3B0aW9uYWwgZm9yIGVhY2ggaW5zdGFuY2UuCi0gIC8vIElmIGFuIGVudHJ5IGlzIG5vdCBnaXZlbiwgdGhlbiB0aGF0IGNoYXIqIGlzIE5VTEwuCi0gIC8vIEZvciBleGFtcGxlIGlmIHRoZSBzZWNvbmQgaW5zdGFuY2UgaGFzCi0gIC8vIGluc3RuYW09ICJGT08iIGFuZCBJTj0iQSIsIGJ1dCBubyBPVVQgZ2l2ZW4sIHRoZW4gaW5zdFsxXSBwb2ludHMKLSAgLy8gdG8gIkZPTyIgIGluUGluWzFdIHBvaW50cyB0byAiQSIgYW5kIG91dFBpblsxXSBpcyBhIE5VTEwgcG9pbnRlci4KLSAgdm9pZCBvcmRlcmVkKGludCBpbmRleCwgaW50KiBzaXplLCBjaGFyKioqIGluc3QsIGNoYXIqKiogaW5QaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqKiogb3V0UGluLCBpbnQqKiBiaXRzKSBjb25zdDsKLQotICAvLyBBbGwgb2YgdGhlIGZsb2F0aW5nIGNvbnN0cnVjdHMgaW4gdGhlIHNjYW4gY2hhaW4gYXJlCi0gIC8vIHN0b3JlZCBpbiB0aGlzIG9uZSBhcnJheS4KLSAgLy8gSWYgdGhlIElOIG9yIE9VVCBvZiBhbiBlbnRyeSBpcyBub3Qgc3VwcGxpZWQgdGhlbiB0aGUgYXJyYXkgd2lsbCBoYXZlCi0gIC8vIGEgTlVMTCBwb2ludGVyIGluIHRoYXQgcGxhY2UuCi0gIHZvaWQgZmxvYXRpbmcoaW50KiBzaXplLCBjaGFyKioqIGluc3QsIGNoYXIqKiogaW5QaW4sIGNoYXIqKiogb3V0UGluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqKiBiaXRzKSBjb25zdDsKLQotICBjb25zdCBjaGFyKiBjb21tb25JblBpbigpIGNvbnN0OwotICBjb25zdCBjaGFyKiBjb21tb25PdXRQaW4oKSBjb25zdDsKLQotICBjb25zdCBjaGFyKiBwYXJ0aXRpb25OYW1lKCkgY29uc3Q7ICAgICAgICAvLyA1LjQuMQotICBpbnQgcGFydGl0aW9uTWF4Qml0cygpIGNvbnN0OyAgICAgICAgICAgICAvLyA1LjQuMQotCi0gIHZvaWQgcHJpbnQoRklMRSogZikgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgY2hhciogbmFtZV87Ci0gIGNoYXIgaGFzU3RhcnRfOwotICBjaGFyIGhhc1N0b3BfOwotICBpbnQgbmFtZUxlbmd0aF87Ci0KLSAgaW50IG51bU9yZGVyZWRBbGxvY2F0ZWRfOwotICBpbnQgbnVtT3JkZXJlZF87Ci0gIGRlZmlPcmRlcmVkKiogb3JkZXJlZF87IAotCi0gIGludCBudW1GbG9hdGluZ0FsbG9jYXRlZF87Ci0gIGludCBudW1GbG9hdGluZ187Ci0gIGNoYXIqKiBmbG9hdEluc3RfOyAgICAvLyBBcnJheSBvZiBmbG9hdGluZyBuYW1lcwotICBjaGFyKiogZmxvYXRJbl87Ci0gIGNoYXIqKiBmbG9hdE91dF87Ci0gIGludCogICBmbG9hdEJpdHNfOyAgICAvLyA1LjQuMQotCi0gIGNoYXIqIHN0b3BJbnN0XzsKLSAgY2hhciogc3RvcFBpbl87Ci0KLSAgY2hhciogc3RhcnRJbnN0XzsKLSAgY2hhciogc3RhcnRQaW5fOwotCi0gIGNoYXIqIGNvbW1vbkluUGluXzsKLSAgY2hhciogY29tbW9uT3V0UGluXzsKLQotICBjaGFyICBoYXNQYXJ0aXRpb25fOyAgLy8gNS40LjEKLSAgY2hhciogcGFydE5hbWVfOyAgICAgIC8vIDUuNC4xCi0gIGludCAgIG1heEJpdHNfOyAgICAgICAvLyA1LjQuMQotCi0gIGRlZnJEYXRhICpkZWZEYXRhOwotfTsKLQotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotVVNFX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpU2l0ZS5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlTaXRlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RiNGNkOS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlTaXRlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEzIC0gMjAxNSwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlICJkZWZpU2l0ZS5ocHAiCi0jaW5jbHVkZSAiZGVmaURlYnVnLmhwcCIKLSNpbmNsdWRlICJsZXguaCIKLSNpbmNsdWRlICJkZWZpVXRpbC5ocHAiCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyAgICAgZGVmaVNpdGUKLS8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQotZGVmaVNpdGU6OmRlZmlTaXRlKGRlZnJEYXRhICpkYXRhKQotIDogZGVmRGF0YShkYXRhKQotewotICBJbml0KCk7Ci19Ci0KLQotZGVmaVNpdGU6On5kZWZpU2l0ZSgpIHsKLSAgRGVzdHJveSgpOwotfQotCi0KLXZvaWQgZGVmaVNpdGU6OkluaXQoKSB7Ci0gIHNpdGVOYW1lXyA9IChjaGFyKiltYWxsb2MoMzIpOwotICBuYW1lU2l6ZV8gPSAzMjsKLSAgY2xlYXIoKTsKLX0KLQotCi12b2lkIGRlZmlTaXRlOjpEZXN0cm95KCkgewotICBmcmVlKHNpdGVOYW1lXyk7Ci19Ci0KLQotdm9pZCBkZWZpU2l0ZTo6Y2xlYXIoKSB7Ci0gIGlmIChzaXRlTmFtZV8pCi0gICAgICpzaXRlTmFtZV8gPSAnXDAnOwotICB4X251bV8gPSAwLjA7Ci0gIHlfbnVtXyA9IDAuMDsKLSAgeF9zdGVwXyA9IDAuMDsKLSAgeV9zdGVwXyA9IDAuMDsKLSAgb3JpZW50XyA9IDA7Ci19Ci0KLQotdm9pZCBkZWZpU2l0ZTo6c2V0TmFtZShjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIGludCBsZW4gPSAxOwotICBjaGFyKiBmcm9tID0gKGNoYXIqKW5hbWU7Ci0gIGNsZWFyKCk7Ci0gIHdoaWxlICgqZnJvbSsrKSBsZW4rKzsKLSAgaWYgKG5hbWVTaXplXyA8IGxlbikgYnVtcE5hbWUobGVuKTsKLSAgc3RyY3B5KHNpdGVOYW1lXywgZGVmRGF0YS0+REVGQ0FTRShuYW1lKSk7Ci19Ci0KLQotdm9pZCBkZWZpU2l0ZTo6c2V0TG9jYXRpb24oZG91YmxlIHhvcmcsIGRvdWJsZSB5b3JnKSB7Ci0gIHhfb3JpZ18gPSB4b3JnOwotICB5X29yaWdfID0geW9yZzsKLX0KLQotCi12b2lkIGRlZmlTaXRlOjpzZXRPcmllbnQoaW50IG9yaWVudCkgewotICBvcmllbnRfID0gb3JpZW50OwotfQotCi0KLXZvaWQgZGVmaVNpdGU6OnNldERvKGRvdWJsZSB4X251bSwgZG91YmxlIHlfbnVtLCBkb3VibGUgeF9zdGVwLCBkb3VibGUgeV9zdGVwKSB7Ci0gIHhfbnVtXyA9IHhfbnVtOwotICB5X251bV8gPSB5X251bTsKLSAgeF9zdGVwXyA9IHhfc3RlcDsKLSAgeV9zdGVwXyA9IHlfc3RlcDsKLX0KLQotCi1kb3VibGUgZGVmaVNpdGU6OnhfbnVtKCkgY29uc3QgewotICByZXR1cm4geF9udW1fOwotfQotCi0KLWRvdWJsZSBkZWZpU2l0ZTo6eV9udW0oKSBjb25zdCB7Ci0gIHJldHVybiB5X251bV87Ci19Ci0KLQotZG91YmxlIGRlZmlTaXRlOjp4X3N0ZXAoKSBjb25zdCB7Ci0gIHJldHVybiB4X3N0ZXBfOwotfQotCi0KLWRvdWJsZSBkZWZpU2l0ZTo6eV9zdGVwKCkgY29uc3QgewotICByZXR1cm4geV9zdGVwXzsKLX0KLQotCi1kb3VibGUgZGVmaVNpdGU6Onhfb3JpZygpIGNvbnN0IHsKLSAgcmV0dXJuIHhfb3JpZ187Ci19Ci0KLQotZG91YmxlIGRlZmlTaXRlOjp5X29yaWcoKSBjb25zdCB7Ci0gIHJldHVybiB5X29yaWdfOwotfQotCi0KLWludCBkZWZpU2l0ZTo6b3JpZW50KCkgY29uc3QgewotICByZXR1cm4gb3JpZW50XzsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpU2l0ZTo6b3JpZW50U3RyKCkgY29uc3QgewotICByZXR1cm4gKGRlZmlPcmllbnRTdHIob3JpZW50XykpOwotfQotCi0KLWNvbnN0IGNoYXIqIGRlZmlTaXRlOjpuYW1lKCkgY29uc3QgewotICByZXR1cm4gc2l0ZU5hbWVfOwotfQotCi0KLXZvaWQgZGVmaVNpdGU6OmJ1bXBOYW1lKGludCBzaXplKSB7Ci0gIGZyZWUoc2l0ZU5hbWVfKTsKLSAgc2l0ZU5hbWVfID0gKGNoYXIqKW1hbGxvYyhzaXplKTsKLSAgbmFtZVNpemVfID0gc2l6ZTsKLSAgKnNpdGVOYW1lXyA9ICdcMCc7Ci19Ci0KLQotdm9pZCBkZWZpU2l0ZTo6cHJpbnQoRklMRSogZikgY29uc3QgewotICBmcHJpbnRmKGYsICJTaXRlICclcCcgJXNcbiIsIG5hbWUoKSwKLSAgICAgb3JpZW50U3RyKCkpOwotICBmcHJpbnRmKGYsICIgIERPIFggJWcgJWcgQlkgJWdcbiIsCi0gICAgIHhfb3JpZygpLAotICAgICB4X251bSgpLAotICAgICB4X3N0ZXAoKSk7Ci0gIGZwcmludGYoZiwgIiAgRE8gWSAlZyAlZyBCWSAlZ1xuIiwKLSAgICAgeV9vcmlnKCksCi0gICAgIHlfbnVtKCksCi0gICAgIHlfc3RlcCgpKTsKLQotfQotCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyAgICAgZGVmaUJveAotLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotZGVmaUJveDo6ZGVmaUJveCgpIHsKLSAgSW5pdCgpOwotfQotCi12b2lkIGRlZmlCb3g6OkluaXQoKSB7Ci0gIHhsXyA9IDA7Ci0gIHlsXyA9IDA7Ci0gIHhoXyA9IDA7Ci0gIHloXyA9IDA7Ci0gIHBvaW50c18gPSAwOwotfQotCi1kZWZpQm94Ojp+ZGVmaUJveCgpIHsKLSAgRGVzdHJveSgpOwotfQotCi12b2lkIGRlZmlCb3g6OkRlc3Ryb3koKSB7Ci0gIHN0cnVjdCBkZWZpUG9pbnRzKiBwOwotCi0gIHAgPSBwb2ludHNfOwotICBpZiAocCkgewotICAgIGZyZWUoKGNoYXIqKShwLT54KSk7Ci0gICAgZnJlZSgoY2hhciopKHAtPnkpKTsKLSAgICBmcmVlKChjaGFyKikocG9pbnRzXykpOwotICB9Ci19Ci0KLXZvaWQgZGVmaUJveDo6YWRkUG9pbnQoZGVmaUdlb21ldHJpZXMqIGdlb20pIHsKLSAgc3RydWN0IGRlZmlQb2ludHMqIHA7Ci0gIHN0cnVjdCBkZWZpUG9pbnRzKiB0cDsKLSAgaW50IHgsIHk7Ci0gIGludCBpOwotCi0gIHAgPSAoc3RydWN0IGRlZmlQb2ludHMqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGRlZmlQb2ludHMpKTsKLSAgcC0+bnVtUG9pbnRzID0gZ2VvbS0+bnVtUG9pbnRzKCk7Ci0gIHAtPnggPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkqcC0+bnVtUG9pbnRzKTsKLSAgcC0+eSA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSpwLT5udW1Qb2ludHMpOwotICBmb3IgKGkgPSAwOyBpIDwgcC0+bnVtUG9pbnRzOyBpKyspIHsKLSAgICBnZW9tLT5wb2ludHMoaSwgJngsICZ5KTsKLSAgICBwLT54W2ldID0geDsKLSAgICBwLT55W2ldID0geTsKLSAgICAvLyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBhc3NpZ24gdGhlIGZpcnN0IDIgcG9pbnRzIHRvIHhsLCB5bCwgeGggJiB5aAotICAgIGlmIChpID09IDApIHsKLSAgICAgIHhsXyA9IHg7Ci0gICAgICB5bF8gPSB5OwotICAgIH0gZWxzZSBpZiAoaSA9PSAxKSB7Ci0gICAgICB4aF8gPSB4OwotICAgICAgeWhfID0geTsKLSAgICB9Ci0gIH0KLSAgaWYgKHBvaW50c18pIHsKLSAgICAgdHAgPSBwb2ludHNfOwotICAgICBmcmVlKChjaGFyKikodHAtPngpKTsKLSAgICAgZnJlZSgoY2hhciopKHRwLT55KSk7Ci0gICAgIGZyZWUoKGNoYXIqKSh0cCkpOwotICB9Ci0gIHBvaW50c18gPSBwOwotfQotCi1pbnQgZGVmaUJveDo6eGwoKSBjb25zdCB7Ci0gIHJldHVybiB4bF87Ci19Ci0KLQotaW50IGRlZmlCb3g6OnlsKCkgY29uc3QgewotICByZXR1cm4geWxfOwotfQotCi0KLWludCBkZWZpQm94Ojp4aCgpIGNvbnN0IHsKLSAgcmV0dXJuIHhoXzsKLX0KLQotCi1pbnQgZGVmaUJveDo6eWgoKSBjb25zdCB7Ci0gIHJldHVybiB5aF87Ci19Ci0KLQotc3RydWN0IGRlZmlQb2ludHMgZGVmaUJveDo6Z2V0UG9pbnQoKSBjb25zdCB7Ci0gIHJldHVybiAqKHBvaW50c18pOwotfQotCi12b2lkIGRlZmlCb3g6OnByaW50KEZJTEUqIGYpIGNvbnN0IHsKLSAgZnByaW50ZihmLCAiQm94ICVkLCVkICVkICVkXG4iLAotICAgIHhsKCksCi0gICAgeWwoKSwKLSAgICB4aCgpLAotICAgIHloKCkpOwotfQotCi0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlTaXRlLmhwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaVNpdGUuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzFiMTVmLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaVNpdGUuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaWZuZGVmIGRlZmlTaXRlX2gKLSNkZWZpbmUgZGVmaVNpdGVfaAotCi0jaW5jbHVkZSAiZGVmaUtSRGVmcy5ocHAiCi0jaW5jbHVkZSAiZGVmaU1pc2MuaHBwIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLWNsYXNzIGRlZnJEYXRhOwotCi0vKgotICogU3RydWN0IGhvbGRzIHRoZSBkYXRhIGZvciBvbmUgc2l0ZS4KLSAqIEl0IGlzIGFsc28gdXNlZCBmb3IgYSBjYW5wbGFjZSBhbmQgY2Fubm90b2NjdXB5LgotICovCi1jbGFzcyBkZWZpU2l0ZSB7Ci1wdWJsaWM6Ci0gIGRlZmlTaXRlKGRlZnJEYXRhICpkYXRhKTsKLSAgdm9pZCBJbml0KCk7Ci0KLSAgfmRlZmlTaXRlKCk7Ci0gIHZvaWQgRGVzdHJveSgpOwotCi0gIHZvaWQgY2xlYXIoKTsKLQotICB2b2lkIHNldE5hbWUoY29uc3QgY2hhciogbmFtZSk7Ci0gIHZvaWQgc2V0TG9jYXRpb24oZG91YmxlIHhvcmcsIGRvdWJsZSB5b3JnKTsKLSAgdm9pZCBzZXRPcmllbnQoaW50IG9yaWVudCk7Ci0gIHZvaWQgc2V0RG8oZG91YmxlIHhfbnVtLCBkb3VibGUgeV9udW0sIGRvdWJsZSB4X3N0ZXAsIGRvdWJsZSB5X3N0ZXApOwotCi0gIGRvdWJsZSB4X251bSgpIGNvbnN0OwotICBkb3VibGUgeV9udW0oKSBjb25zdDsKLSAgZG91YmxlIHhfc3RlcCgpIGNvbnN0OwotICBkb3VibGUgeV9zdGVwKCkgY29uc3Q7Ci0gIGRvdWJsZSB4X29yaWcoKSBjb25zdDsKLSAgZG91YmxlIHlfb3JpZygpIGNvbnN0OwotICBpbnQgb3JpZW50KCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIG9yaWVudFN0cigpIGNvbnN0OwotICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3Q7Ci0KLSAgdm9pZCBwcmludChGSUxFKiBmKSBjb25zdDsKLQotICB2b2lkIGJ1bXBOYW1lKGludCBzaXplKTsKLQotcHJvdGVjdGVkOgotICBjaGFyKiBzaXRlTmFtZV87ICAgICAvLyBOYW1lIG9mIHRoaXMuCi0gIGludCBuYW1lU2l6ZV87ICAgICAgIC8vIGFsbG9jYXRlZCBzaXplIG9mIHNpdGVOYW1lXwotICBkb3VibGUgeF9vcmlnXywgeV9vcmlnXzsgIC8vIE9yaWdpbgotICBkb3VibGUgeF9zdGVwXywgeV9zdGVwXzsgIC8vIEFycmF5IHN0ZXAgc2l6ZS4KLSAgZG91YmxlIHhfbnVtXywgeV9udW1fOyAKLSAgaW50IG9yaWVudF87ICAgICAgICAgLy8gb3JpZW50YXRpb24KLQotICBkZWZyRGF0YSAqZGVmRGF0YTsKLX07Ci0KLQotCi0vKiBTdHJ1Y3QgaG9sZHMgdGhlIGRhdGEgZm9yIGEgQm94ICovCi1jbGFzcyBkZWZpQm94IHsKLXB1YmxpYzoKLSAgLy8gVXNlIHRoZSBkZWZhdWx0IGRlc3RydWN0b3IgYW5kIGNvbnN0cnVjdG9yLgotICAvLyA1LjYgY2hhbmdlZCB0byB1c2UgaXQgb3duIGNvbnN0cnVjdG9yICYgZGVzdHJ1Y3RvcgotCi0gIGRlZmlCb3goKTsKLSAgdm9pZCBJbml0KCk7Ci0gIHZvaWQgRGVzdHJveSgpOwotICB+ZGVmaUJveCgpOwotCi0gIC8vIE5PVEU6IDUuNgotICAvLyBUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIHN0aWxsIGhlcmUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKLSAgLy8gRm9yIG5ldyByZWFkZXIgdGhleSBzaG91bGQgdXNlIG51bVBvaW50cyAmIGdldFBvaW50IHRvIGdldCB0aGUKLSAgLy8gZGF0YS4KLSAgaW50IHhsKCkgY29uc3Q7Ci0gIGludCB5bCgpIGNvbnN0OwotICBpbnQgeGgoKSBjb25zdDsKLSAgaW50IHloKCkgY29uc3Q7Ci0KLSAgdm9pZCBhZGRQb2ludChkZWZpR2VvbWV0cmllcyogZ2VvbSk7Ci0gIGRlZmlQb2ludHMgZ2V0UG9pbnQoKSBjb25zdDsKLQotICB2b2lkIHByaW50KEZJTEUqIGYpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gIGludCB4bF8sIHlsXzsKLSAgaW50IHhoXywgeWhfOwotICBkZWZpUG9pbnRzKiBwb2ludHNfOyAgICAvLyA1LjYKLX07Ci0KLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLVVTRV9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaVNsb3QuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpU2xvdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZWM2MzUuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpU2xvdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMyAtIDIwMTUsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlICJsZXguaCIKLSNpbmNsdWRlICJkZWZpU2xvdC5ocHAiCi0jaW5jbHVkZSAiZGVmaURlYnVnLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vICAgIGRlZmlTbG90Ci0vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1kZWZpU2xvdDo6ZGVmaVNsb3QoZGVmckRhdGEgKmRhdGEpCi0gOiBkZWZEYXRhKGRhdGEpCi17Ci0gIEluaXQoKTsKLX0KLQotCi12b2lkIGRlZmlTbG90OjpJbml0KCkgewotICBudW1Qb2x5c18gPSAwOwotICBjbGVhcigpOwotICBsYXllck5hbWVMZW5ndGhfID0gMDsKLSAgeGxfID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKjEpOwotICB5bF8gPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkqMSk7Ci0gIHhoXyA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSoxKTsKLSAgeWhfID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKjEpOwotICByZWN0c0FsbG9jYXRlZF8gPSAxOyAgICAgIC8vIEF0IGxlYXN0IDEgcmVjdGFuZ2xlIHdpbGwgZGVmaW5lCi0gIHBvbHlzQWxsb2NhdGVkXyA9IDA7Ci0gIHBvbHlnb25zXyA9IDA7Ci0gIGxheWVyTmFtZV8gPSAwOwotfQotCi1kZWZpU2xvdDo6fmRlZmlTbG90KCkgewotICBEZXN0cm95KCk7Ci19Ci0KLXZvaWQgZGVmaVNsb3Q6OmNsZWFyKCkgewotICBoYXNMYXllcl8gPSAwOwotICBudW1SZWN0YW5nbGVzXyA9IDA7Ci19Ci0KLXZvaWQgZGVmaVNsb3Q6OmNsZWFyUG9seSgpIHsKLSAgc3RydWN0IGRlZmlQb2ludHMqIHA7Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1Qb2x5c187IGkrKykgewotICAgIHAgPSBwb2x5Z29uc19baV07Ci0gICAgZnJlZSgoY2hhciopKHAtPngpKTsKLSAgICBmcmVlKChjaGFyKikocC0+eSkpOwotICAgIGZyZWUoKGNoYXIqKShwb2x5Z29uc19baV0pKTsKLSAgfQotICBudW1Qb2x5c18gPSAwOwotfQotCi12b2lkIGRlZmlTbG90OjpEZXN0cm95KCkgewotICBpZiAobGF5ZXJOYW1lXykgZnJlZShsYXllck5hbWVfKTsKLSAgZnJlZSgoY2hhciopKHhsXykpOwotICBmcmVlKChjaGFyKikoeWxfKSk7Ci0gIGZyZWUoKGNoYXIqKSh4aF8pKTsKLSAgZnJlZSgoY2hhciopKHloXykpOwotICByZWN0c0FsbG9jYXRlZF8gPSAwOwotICB4bF8gPSAwOwotICB5bF8gPSAwOwotICB4aF8gPSAwOwotICB5aF8gPSAwOwotICBjbGVhclBvbHkoKTsKLSAgaWYgKHBvbHlnb25zXykgZnJlZSgoY2hhciopKHBvbHlnb25zXykpOwotICBwb2x5Z29uc18gPSAwOwotICBjbGVhcigpOwotfQotCi0KLXZvaWQgZGVmaVNsb3Q6OnNldExheWVyKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgaW50IGxlbiA9IHN0cmxlbihuYW1lKSArIDE7Ci0gIGlmIChsYXllck5hbWVMZW5ndGhfIDwgbGVuKSB7Ci0gICAgaWYgKGxheWVyTmFtZV8pIGZyZWUobGF5ZXJOYW1lXyk7Ci0gICAgbGF5ZXJOYW1lXyA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgICBsYXllck5hbWVMZW5ndGhfID0gbGVuOwotICB9Ci0gIHN0cmNweShsYXllck5hbWVfLCBkZWZEYXRhLT5ERUZDQVNFKG5hbWUpKTsKLSAgaGFzTGF5ZXJfID0gMTsKLX0KLQotCi12b2lkIGRlZmlTbG90OjphZGRSZWN0KGludCB4bCwgaW50IHlsLCBpbnQgeGgsIGludCB5aCkgewotICBpZiAobnVtUmVjdGFuZ2xlc18gPT0gcmVjdHNBbGxvY2F0ZWRfKSB7Ci0gICAgaW50IGk7Ci0gICAgaW50IG1heCA9IHJlY3RzQWxsb2NhdGVkXyA9IHJlY3RzQWxsb2NhdGVkXyAqIDI7Ci0gICAgaW50KiBuZXd4bCA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSptYXgpOwotICAgIGludCogbmV3eWwgPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkqbWF4KTsKLSAgICBpbnQqIG5ld3hoID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKm1heCk7Ci0gICAgaW50KiBuZXd5aCA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSptYXgpOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1SZWN0YW5nbGVzXzsgaSsrKSB7Ci0gICAgICBuZXd4bFtpXSA9IHhsX1tpXTsKLSAgICAgIG5ld3lsW2ldID0geWxfW2ldOwotICAgICAgbmV3eGhbaV0gPSB4aF9baV07Ci0gICAgICBuZXd5aFtpXSA9IHloX1tpXTsKLSAgICB9Ci0gICAgZnJlZSgoY2hhciopKHhsXykpOwotICAgIGZyZWUoKGNoYXIqKSh5bF8pKTsKLSAgICBmcmVlKChjaGFyKikoeGhfKSk7Ci0gICAgZnJlZSgoY2hhciopKHloXykpOwotICAgIHhsXyA9IG5ld3hsOwotICAgIHlsXyA9IG5ld3lsOwotICAgIHhoXyA9IG5ld3hoOwotICAgIHloXyA9IG5ld3loOwotICB9Ci0gIHhsX1tudW1SZWN0YW5nbGVzX10gPSB4bDsKLSAgeWxfW251bVJlY3RhbmdsZXNfXSA9IHlsOwotICB4aF9bbnVtUmVjdGFuZ2xlc19dID0geGg7Ci0gIHloX1tudW1SZWN0YW5nbGVzX10gPSB5aDsKLSAgbnVtUmVjdGFuZ2xlc18gKz0gMTsKLX0KLQotLy8gNS42Ci12b2lkIGRlZmlTbG90OjphZGRQb2x5Z29uKGRlZmlHZW9tZXRyaWVzKiBnZW9tKSB7Ci0gIHN0cnVjdCBkZWZpUG9pbnRzKiBwOwotICBpbnQgeCwgeTsKLSAgaW50IGk7Ci0KLSAgaWYgKG51bVBvbHlzXyA9PSBwb2x5c0FsbG9jYXRlZF8pIHsKLSAgICBzdHJ1Y3QgZGVmaVBvaW50cyoqIHBvbHk7Ci0gICAgcG9seXNBbGxvY2F0ZWRfID0gKHBvbHlzQWxsb2NhdGVkXyA9PSAwKSA/Ci0gICAgICAgICAgMiA6IHBvbHlzQWxsb2NhdGVkXyAqIDI7Ci0gICAgcG9seSA9IChzdHJ1Y3QgZGVmaVBvaW50cyoqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGRlZmlQb2ludHMqKSAqCi0gICAgICAgICAgICBwb2x5c0FsbG9jYXRlZF8pOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1Qb2x5c187IGkrKykKLSAgICAgIHBvbHlbaV0gPSBwb2x5Z29uc19baV07Ci0gICAgaWYgKHBvbHlnb25zXykKLSAgICAgIGZyZWUoKGNoYXIqKShwb2x5Z29uc18pKTsKLSAgICBwb2x5Z29uc18gPSBwb2x5OwotICB9Ci0gIHAgPSAoc3RydWN0IGRlZmlQb2ludHMqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGRlZmlQb2ludHMpKTsKLSAgcC0+bnVtUG9pbnRzID0gZ2VvbS0+bnVtUG9pbnRzKCk7Ci0gIHAtPnggPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkqcC0+bnVtUG9pbnRzKTsKLSAgcC0+eSA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSpwLT5udW1Qb2ludHMpOwotICBmb3IgKGkgPSAwOyBpIDwgcC0+bnVtUG9pbnRzOyBpKyspIHsKLSAgICBnZW9tLT5wb2ludHMoaSwgJngsICZ5KTsKLSAgICBwLT54W2ldID0geDsKLSAgICBwLT55W2ldID0geTsKLSAgfQotICBwb2x5Z29uc19bbnVtUG9seXNfXSA9IHA7Ci0gIG51bVBvbHlzXyArPSAxOwotfQotCi1pbnQgZGVmaVNsb3Q6Omhhc0xheWVyKCkgY29uc3QgewotICByZXR1cm4gaGFzTGF5ZXJfOwotfQotCi0KLWNvbnN0IGNoYXIqIGRlZmlTbG90OjpsYXllck5hbWUoKSBjb25zdCB7Ci0gIHJldHVybiBsYXllck5hbWVfOwotfQotCi0KLWludCBkZWZpU2xvdDo6bnVtUmVjdGFuZ2xlcygpIGNvbnN0IHsKLSAgcmV0dXJuIG51bVJlY3RhbmdsZXNfOwotfQotCi0KLWludCBkZWZpU2xvdDo6eGwoaW50IGluZGV4KSBjb25zdCB7Ci0gIGNoYXIgbXNnWzE2MF07Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtUmVjdGFuZ2xlc18pIHsKLSAgICAgc3ByaW50ZiAobXNnLCAiRVJST1IgKERFRlBBUlMtNjE2MCk6IFRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgU0xPVCBSRUNUQU5HTEUgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IG51bWJlciBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIsCi0gICAgICAgICAgICAgIGluZGV4LCBudW1SZWN0YW5nbGVzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MTYwLCBtc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4geGxfW2luZGV4XTsKLX0KLQotCi1pbnQgZGVmaVNsb3Q6OnlsKGludCBpbmRleCkgY29uc3QgewotICBjaGFyIG1zZ1sxNjBdOwotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVJlY3RhbmdsZXNfKSB7Ci0gICAgIHNwcmludGYgKG1zZywgIkVSUk9SIChERUZQQVJTLTYxNjApOiBUaGUgaW5kZXggbnVtYmVyICVkIHNwZWNpZmllZCBmb3IgdGhlIFNMT1QgUkVDVEFOR0xFIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBudW1iZXIgaXMgZnJvbSAwIHRvICVkLiBTcGVjaWZ5IGEgdmFsaWQgaW5kZXggbnVtYmVyIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLAotICAgICAgICAgICAgICBpbmRleCwgbnVtUmVjdGFuZ2xlc18pOwotICAgICBkZWZpRXJyb3IoMCwgNjE2MCwgbXNnLCBkZWZEYXRhKTsKLSAgICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIHlsX1tpbmRleF07Ci19Ci0KLQotaW50IGRlZmlTbG90Ojp4aChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgY2hhciBtc2dbMTYwXTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1SZWN0YW5nbGVzXykgewotICAgICBzcHJpbnRmIChtc2csICJFUlJPUiAoREVGUEFSUy02MTYwKTogVGhlIGluZGV4IG51bWJlciAlZCBzcGVjaWZpZWQgZm9yIHRoZSBTTE9UIFJFQ1RBTkdMRSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggbnVtYmVyIGlzIGZyb20gMCB0byAlZC4gU3BlY2lmeSBhIHZhbGlkIGluZGV4IG51bWJlciBhbmQgdGhlbiB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgICAgaW5kZXgsIG51bVJlY3RhbmdsZXNfKTsKLSAgICAgZGVmaUVycm9yKDAsIDYxNjAsIG1zZywgZGVmRGF0YSk7Ci0gICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiB4aF9baW5kZXhdOwotfQotCi0KLWludCBkZWZpU2xvdDo6eWgoaW50IGluZGV4KSBjb25zdCB7Ci0gIGNoYXIgbXNnWzE2MF07Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtUmVjdGFuZ2xlc18pIHsKLSAgICAgc3ByaW50ZiAobXNnLCAiRVJST1IgKERFRlBBUlMtNjE2MCk6IFRoZSBpbmRleCBudW1iZXIgJWQgc3BlY2lmaWVkIGZvciB0aGUgU0xPVCBSRUNUQU5HTEUgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IG51bWJlciBpcyBmcm9tIDAgdG8gJWQuIFNwZWNpZnkgYSB2YWxpZCBpbmRleCBudW1iZXIgYW5kIHRoZW4gdHJ5IGFnYWluLiIsCi0gICAgICAgICAgICAgIGluZGV4LCBudW1SZWN0YW5nbGVzXyk7Ci0gICAgIGRlZmlFcnJvcigwLCA2MTYwLCBtc2csIGRlZkRhdGEpOwotICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4geWhfW2luZGV4XTsKLX0KLQotLy8gNS42Ci1pbnQgZGVmaVNsb3Q6Om51bVBvbHlnb25zKCkgY29uc3QgewotICByZXR1cm4gbnVtUG9seXNfOwotfQotCi0vLyA1LjYKLXN0cnVjdCBkZWZpUG9pbnRzIGRlZmlTbG90OjpnZXRQb2x5Z29uKGludCBpbmRleCkgY29uc3QgewotICByZXR1cm4gKihwb2x5Z29uc19baW5kZXhdKTsKLX0KLQotdm9pZCBkZWZpU2xvdDo6cHJpbnQoRklMRSogZikgY29uc3QgewotICBpbnQgaSwgajsKLSAgc3RydWN0IGRlZmlQb2ludHMgcG9pbnRzOwotCi0gIGlmIChoYXNMYXllcigpKQotICAgIGZwcmludGYoZiwgIi0gTEFZRVIgJXNcbiIsIGxheWVyTmFtZSgpKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgbnVtUmVjdGFuZ2xlcygpOyBpKyspIHsKLSAgICBmcHJpbnRmKGYsICIgICBSRUNUICVkICVkICVkICVkXG4iLCB4bChpKSwKLSAgICAgICAgICAgIHlsKGkpLCB4aChpKSwKLSAgICAgICAgICAgIHloKGkpKTsKLSAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1Qb2x5Z29ucygpOyBpKyspIHsKLSAgICBmcHJpbnRmKGYsICIgICBQT0xZR09OICIpOwotICAgIHBvaW50cyA9IGdldFBvbHlnb24oaSk7Ci0gICAgZm9yIChqID0gMDsgaiA8IHBvaW50cy5udW1Qb2ludHM7IGorKykKLSAgICAgIGZwcmludGYoZiwgIiVkICVkICIsIHBvaW50cy54W2pdLCBwb2ludHMueVtqXSk7Ci0gICAgZnByaW50ZihmLCAiXG4iKTsKLSAgfQotICBmcHJpbnRmKGYsIlxuIik7Ci19Ci1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpU2xvdC5ocHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlTbG90LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgzYWIwZi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlTbG90LmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaWZuZGVmIGRlZmlTTE9UX2gKLSNkZWZpbmUgZGVmaVNMT1RfaAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJkZWZpS1JEZWZzLmhwcCIKLSNpbmNsdWRlICJkZWZpTWlzYy5ocHAiCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLWNsYXNzIGRlZnJEYXRhOwotCi1jbGFzcyBkZWZpU2xvdCB7Ci1wdWJsaWM6Ci0gIGRlZmlTbG90KGRlZnJEYXRhICpkYXRhKTsKLSAgdm9pZCBJbml0KCk7Ci0KLSAgdm9pZCBEZXN0cm95KCk7Ci0gIH5kZWZpU2xvdCgpOwotCi0gIHZvaWQgY2xlYXIoKTsKLSAgdm9pZCBjbGVhclBvbHkoKTsKLQotICB2b2lkIHNldExheWVyKGNvbnN0IGNoYXIqIG5hbWUpOwotICB2b2lkIGFkZFJlY3QoaW50IHhsLCBpbnQgeWwsIGludCB4aCwgaW50IHloKTsKLSAgdm9pZCBhZGRQb2x5Z29uKGRlZmlHZW9tZXRyaWVzKiBnZW9tKTsKLQotICBpbnQgaGFzTGF5ZXIoKSBjb25zdDsKLSAgY29uc3QgY2hhciogbGF5ZXJOYW1lKCkgY29uc3Q7Ci0KLSAgaW50IG51bVJlY3RhbmdsZXMoKSBjb25zdDsKLSAgaW50IHhsKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCB5bChpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgeGgoaW50IGluZGV4KSBjb25zdDsKLSAgaW50IHloKGludCBpbmRleCkgY29uc3Q7Ci0KLSAgaW50IG51bVBvbHlnb25zKCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIGRlZmlQb2ludHMgZ2V0UG9seWdvbihpbnQgaW5kZXgpIGNvbnN0OyAgLy8gNS42Ci0KLSAgdm9pZCBwcmludChGSUxFKiBmKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICBpbnQgICBoYXNMYXllcl87Ci0gIGNoYXIqIGxheWVyTmFtZV87Ci0gIGludCAgIGxheWVyTmFtZUxlbmd0aF87Ci0gIGludCAgIG51bVJlY3RhbmdsZXNfOwotICBpbnQgICByZWN0c0FsbG9jYXRlZF87Ci0gIGludCogIHhsXzsKLSAgaW50KiAgeWxfOwotICBpbnQqICB4aF87Ci0gIGludCogIHloXzsKLSAgaW50ICAgbnVtUG9seXNfOyAgICAgICAgICAgICAgICAgIC8vIDUuNgotICBpbnQgICBwb2x5c0FsbG9jYXRlZF87ICAgICAgICAgICAgLy8gNS42Ci0gIGRlZmlQb2ludHMqKiBwb2x5Z29uc187ICAgIC8vIDUuNgotCi0gIGRlZnJEYXRhICpkZWZEYXRhOwotfTsKLQotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotVVNFX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpVGltaW5nRGlzYWJsZS5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlUaW1pbmdEaXNhYmxlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MzZWU4Mi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlUaW1pbmdEaXNhYmxlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEzIC0gMjAxNSwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlICJsZXguaCIKLSNpbmNsdWRlICJkZWZpVGltaW5nRGlzYWJsZS5ocHAiCi0jaW5jbHVkZSAiZGVmaURlYnVnLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gICBkZWZpVGltaW5nRGlzYWJsZQotLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCi1kZWZpVGltaW5nRGlzYWJsZTo6ZGVmaVRpbWluZ0Rpc2FibGUoZGVmckRhdGEgKmRhdGEpCi0gOiBkZWZEYXRhKGRhdGEpCi17Ci0gIEluaXQoKTsKLX0KLQotCi12b2lkIGRlZmlUaW1pbmdEaXNhYmxlOjpJbml0KCkgewotICBmcm9tSW5zdF8gPSAwOwotICBmcm9tSW5zdExlbmd0aF8gPSAwOwotICB0b0luc3RfID0gMDsKLSAgdG9JbnN0TGVuZ3RoXyA9IDA7Ci0gIHRvUGluXyA9IDA7Ci0gIHRvUGluTGVuZ3RoXyA9IDA7Ci0gIGZyb21QaW5fID0gMDsKLSAgZnJvbVBpbkxlbmd0aF8gPSAwOwotfQotCi0KLWRlZmlUaW1pbmdEaXNhYmxlOjp+ZGVmaVRpbWluZ0Rpc2FibGUoKSB7Ci0gIERlc3Ryb3koKTsKLX0KLQotCi12b2lkIGRlZmlUaW1pbmdEaXNhYmxlOjpEZXN0cm95KCkgewotCi0gIGNsZWFyKCk7Ci0KLSAgaWYgKGZyb21JbnN0XykgZnJlZShmcm9tSW5zdF8pOwotICBmcm9tSW5zdF8gPSAwOwotICBmcm9tSW5zdExlbmd0aF8gPSAwOwotCi0gIGlmICh0b0luc3RfKSBmcmVlKHRvSW5zdF8pOwotICB0b0luc3RfID0gMDsKLSAgdG9JbnN0TGVuZ3RoXyA9IDA7Ci0KLSAgaWYgKHRvUGluXykgZnJlZSh0b1Bpbl8pOwotICB0b1Bpbl8gPSAwOwotICB0b1Bpbkxlbmd0aF8gPSAwOwotCi0gIGlmIChmcm9tUGluXykgZnJlZShmcm9tUGluXyk7Ci0gIGZyb21QaW5fID0gMDsKLSAgZnJvbVBpbkxlbmd0aF8gPSAwOwotCi19Ci0KLQotdm9pZCBkZWZpVGltaW5nRGlzYWJsZTo6Y2xlYXIoKSB7Ci0gIGhhc0Zyb21Ub18gPSAwOwotICBoYXNUaHJ1XyA9IDA7Ci0gIGhhc01hY3JvXyA9IDA7Ci0gIGhhc1JlZW50cmFudFBhdGhzRmxhZ18gPSAwOwotfQotCi0KLXZvaWQgZGVmaVRpbWluZ0Rpc2FibGU6OnNldFJlZW50cmFudFBhdGhzRmxhZygpIHsKLSAgaGFzUmVlbnRyYW50UGF0aHNGbGFnXyA9IDE7Ci19Ci0KLQotdm9pZCBkZWZpVGltaW5nRGlzYWJsZTo6c2V0RnJvbVRvKGNvbnN0IGNoYXIqIGZyb21JbnN0LCBjb25zdCBjaGFyKiBmcm9tUGluLAotCSBjb25zdCBjaGFyKiB0b0luc3QsIGNvbnN0IGNoYXIqIHRvUGluKSB7Ci0gIGludCBsZW47Ci0KLSAgY2xlYXIoKTsKLSAgaGFzRnJvbVRvXyA9IDE7Ci0KLSAgbGVuID0gc3RybGVuKGZyb21JbnN0KSArIDE7Ci0gIGlmIChsZW4gPiBmcm9tSW5zdExlbmd0aF8pIHsKLSAgICBpZiAoZnJvbUluc3RfKSBmcmVlKGZyb21JbnN0Xyk7Ci0gICAgZnJvbUluc3RMZW5ndGhfID0gbGVuOwotICAgIGZyb21JbnN0XyA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgfQotICBzdHJjcHkoZnJvbUluc3RfLGRlZkRhdGEtPkRFRkNBU0UoZnJvbUluc3QpKTsKLQotICBsZW4gPSBzdHJsZW4oZnJvbVBpbikgKyAxOwotICBpZiAobGVuID4gZnJvbVBpbkxlbmd0aF8pIHsKLSAgICBpZiAoZnJvbVBpbl8pIGZyZWUoZnJvbVBpbl8pOwotICAgIGZyb21QaW5MZW5ndGhfID0gbGVuOwotICAgIGZyb21QaW5fID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICB9Ci0gIHN0cmNweShmcm9tUGluXyxkZWZEYXRhLT5ERUZDQVNFKGZyb21QaW4pKTsKLQotICBsZW4gPSBzdHJsZW4odG9JbnN0KSArIDE7Ci0gIGlmIChsZW4gPiB0b0luc3RMZW5ndGhfKSB7Ci0gICAgaWYgKHRvSW5zdF8pIGZyZWUodG9JbnN0Xyk7Ci0gICAgdG9JbnN0TGVuZ3RoXyA9IGxlbjsKLSAgICB0b0luc3RfID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICB9Ci0gIHN0cmNweSh0b0luc3RfLCB0b0luc3QpOwotCi0gIGxlbiA9IHN0cmxlbih0b1BpbikgKyAxOwotICBpZiAobGVuID4gdG9QaW5MZW5ndGhfKSB7Ci0gICAgaWYgKHRvUGluXykgZnJlZSh0b1Bpbl8pOwotICAgIHRvUGluTGVuZ3RoXyA9IGxlbjsKLSAgICB0b1Bpbl8gPSAoY2hhciopbWFsbG9jKGxlbik7Ci0gIH0KLSAgc3RyY3B5KHRvUGluXywgdG9QaW4pOwotCi19Ci0KLQotdm9pZCBkZWZpVGltaW5nRGlzYWJsZTo6c2V0VGhydShjb25zdCBjaGFyKiBmcm9tSW5zdCwgY29uc3QgY2hhciogZnJvbVBpbikgewotICBpbnQgbGVuOwotCi0gIGNsZWFyKCk7Ci0gIGhhc1RocnVfID0gMTsKLQotICBsZW4gPSBzdHJsZW4oZnJvbUluc3QpICsgMTsKLSAgaWYgKGxlbiA+IGZyb21JbnN0TGVuZ3RoXykgewotICAgIGlmIChmcm9tSW5zdF8pIGZyZWUoZnJvbUluc3RfKTsKLSAgICBmcm9tSW5zdExlbmd0aF8gPSBsZW47Ci0gICAgZnJvbUluc3RfID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICB9Ci0gIHN0cmNweShmcm9tSW5zdF8sZGVmRGF0YS0+REVGQ0FTRShmcm9tSW5zdCkpOwotCi0gIGxlbiA9IHN0cmxlbihmcm9tUGluKSArIDE7Ci0gIGlmIChsZW4gPiBmcm9tUGluTGVuZ3RoXykgewotICAgIGlmIChmcm9tUGluXykgZnJlZShmcm9tUGluXyk7Ci0gICAgZnJvbVBpbkxlbmd0aF8gPSBsZW47Ci0gICAgZnJvbVBpbl8gPSAoY2hhciopbWFsbG9jKGxlbik7Ci0gIH0KLSAgc3RyY3B5KGZyb21QaW5fLGRlZkRhdGEtPkRFRkNBU0UoZnJvbVBpbikpOwotCi19Ci0KLQotdm9pZCBkZWZpVGltaW5nRGlzYWJsZTo6c2V0TWFjcm9Gcm9tVG8oY29uc3QgY2hhciogZnJvbVBpbiwgY29uc3QgY2hhciogdG9QaW4pIHsKLSAgaW50IGxlbjsKLQotICBjbGVhcigpOwotICBoYXNGcm9tVG9fID0gMTsKLQotICBsZW4gPSBzdHJsZW4oZnJvbVBpbikgKyAxOwotICBpZiAobGVuID4gZnJvbVBpbkxlbmd0aF8pIHsKLSAgICBpZiAoZnJvbVBpbl8pIGZyZWUoZnJvbVBpbl8pOwotICAgIGZyb21QaW5MZW5ndGhfID0gbGVuOwotICAgIGZyb21QaW5fID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICB9Ci0gIHN0cmNweShmcm9tUGluXyxkZWZEYXRhLT5ERUZDQVNFKGZyb21QaW4pKTsKLQotICBsZW4gPSBzdHJsZW4odG9QaW4pICsgMTsKLSAgaWYgKGxlbiA+IHRvUGluTGVuZ3RoXykgewotICAgIGlmICh0b1Bpbl8pIGZyZWUodG9QaW5fKTsKLSAgICB0b1Bpbkxlbmd0aF8gPSBsZW47Ci0gICAgdG9QaW5fID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICB9Ci0gIHN0cmNweSh0b1Bpbl8sZGVmRGF0YS0+REVGQ0FTRSh0b1BpbikpOwotCi19Ci0KLQotdm9pZCBkZWZpVGltaW5nRGlzYWJsZTo6c2V0TWFjcm9UaHJ1KGNvbnN0IGNoYXIqIHRocnUpIHsKLSAgaW50IGxlbjsKLQotICBjbGVhcigpOwotCi0gIGhhc1RocnVfID0gMTsKLQotICBsZW4gPSBzdHJsZW4odGhydSkgKyAxOwotICBpZiAobGVuID4gZnJvbVBpbkxlbmd0aF8pIHsKLSAgICBpZiAoZnJvbVBpbl8pIGZyZWUoZnJvbVBpbl8pOwotICAgIGZyb21QaW5MZW5ndGhfID0gbGVuOwotICAgIGZyb21QaW5fID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICB9Ci0gIHN0cmNweShmcm9tUGluXyxkZWZEYXRhLT5ERUZDQVNFKHRocnUpKTsKLQotfQotCi0KLXZvaWQgZGVmaVRpbWluZ0Rpc2FibGU6OnNldE1hY3JvKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgaW50IGxlbjsKLQotICAvLyBoYXNUaHJ1XyBvciBoYXNGcm9tVG9fIHdhcyBhbHJlYWR5IHNldC4KLSAgLy8gY2xlYXIoKSB3YXMgYWxyZWFkeSBjYWxsZWQuCi0gIGhhc01hY3JvXyA9IDE7Ci0KLSAgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLSAgaWYgKGxlbiA+IGZyb21JbnN0TGVuZ3RoXykgewotICAgIGlmIChmcm9tSW5zdF8pIGZyZWUoZnJvbUluc3RfKTsKLSAgICBmcm9tSW5zdExlbmd0aF8gPSBsZW47Ci0gICAgZnJvbUluc3RfID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICB9Ci0gIHN0cmNweShmcm9tSW5zdF8sZGVmRGF0YS0+REVGQ0FTRShuYW1lKSk7Ci19Ci0KLQotdm9pZCBkZWZpVGltaW5nRGlzYWJsZTo6cHJpbnQoRklMRSogZikgY29uc3QgewotCi0gIGlmIChoYXNNYWNyb0Zyb21UbygpKSB7Ci0gICAgZnByaW50ZihmLCAiVGltaW5nRGlzYWJsZSBtYWNybyAnJXMnIHRocnUgJyVzJ1xuIiwKLQlmcm9tSW5zdF8sIGZyb21QaW5fKTsKLQotICB9IGVsc2UgaWYgKGhhc01hY3JvVGhydSgpKSB7Ci0gICAgZnByaW50ZihmLCAiVGltaW5nRGlzYWJsZSBtYWNybyAnJXMnIGZyb20gJyVzJyB0byAnJXMnXG4iLAotCWZyb21JbnN0XywgZnJvbVBpbl8sIHRvUGluXyk7Ci0KLSAgfSBlbHNlIGlmIChoYXNGcm9tVG8oKSkgewotICAgIGZwcmludGYoZiwgIlRpbWluZ0Rpc2FibGUgZnJvbSAnJXMnICclcycgIHRvICclcycgJyVzJ1xuIiwKLSAgICAgIGZyb21JbnN0XywgZnJvbVBpbl8sIHRvSW5zdF8sIHRvUGluXyk7Ci0KLSAgfSBlbHNlIGlmIChoYXNUaHJ1KCkpIHsKLSAgICBmcHJpbnRmKGYsICJUaW1pbmdEaXNhYmxlIHRocnUgJyVzJyAnJXMnXG4iLAotICAgICAgZnJvbUluc3RfLCBmcm9tUGluXyk7Ci0KLSAgfSBlbHNlIHsKLSAgICBkZWZpRXJyb3IoMCwgNjE3MCwgIkVSUk9SIChERUZQQVJTLTYxNzApOiBUaGUgVGltaW5nRGlzYWJsZSB0eXBlIGlzIGludmFsaWQuIFRoZSB2YWxpZCB0eXBlcyBhcmUgRlJPTVBJTiwgJiBUSFJVUElOLiBTcGVjaWZ5IHRoZSB2YWxpZCB0eXBlIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLCBkZWZEYXRhKTsKLSAgfQotfQotCi0KLWludCBkZWZpVGltaW5nRGlzYWJsZTo6aGFzUmVlbnRyYW50UGF0aHNGbGFnKCkgY29uc3QgewotICByZXR1cm4gaGFzUmVlbnRyYW50UGF0aHNGbGFnXzsKLX0KLQotCi1pbnQgZGVmaVRpbWluZ0Rpc2FibGU6Omhhc01hY3JvRnJvbVRvKCkgY29uc3QgewotICByZXR1cm4gKGhhc01hY3JvXyAmJiBoYXNGcm9tVG9fKSA/IDEgOiAwOwotfQotCi0KLWludCBkZWZpVGltaW5nRGlzYWJsZTo6aGFzTWFjcm9UaHJ1KCkgY29uc3QgewotICByZXR1cm4gKGhhc01hY3JvXyAmJiBoYXNUaHJ1XykgPyAxIDogMDsKLX0KLQotCi1pbnQgZGVmaVRpbWluZ0Rpc2FibGU6Omhhc1RocnUoKSBjb25zdCB7Ci0gIHJldHVybiAoaGFzTWFjcm9fID09IDAgJiYgaGFzVGhydV8pID8gMSA6IDA7Ci19Ci0KLQotaW50IGRlZmlUaW1pbmdEaXNhYmxlOjpoYXNGcm9tVG8oKSBjb25zdCB7Ci0gIHJldHVybiAoaGFzTWFjcm9fID09IDAgJiYgaGFzRnJvbVRvXykgPyAxIDogMDsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpVGltaW5nRGlzYWJsZTo6dG9QaW4oKSBjb25zdCB7Ci0gIHJldHVybiB0b1Bpbl87Ci19Ci0KLQotY29uc3QgY2hhciogZGVmaVRpbWluZ0Rpc2FibGU6OmZyb21QaW4oKSBjb25zdCB7Ci0gIHJldHVybiBmcm9tUGluXzsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpVGltaW5nRGlzYWJsZTo6dG9JbnN0KCkgY29uc3QgewotICByZXR1cm4gdG9JbnN0XzsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpVGltaW5nRGlzYWJsZTo6ZnJvbUluc3QoKSBjb25zdCB7Ci0gIHJldHVybiBmcm9tSW5zdF87Ci19Ci0KLQotY29uc3QgY2hhciogZGVmaVRpbWluZ0Rpc2FibGU6Om1hY3JvTmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGZyb21JbnN0XzsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWZpVGltaW5nRGlzYWJsZTo6dGhydVBpbigpIGNvbnN0IHsKLSAgcmV0dXJuIGZyb21QaW5fOwotfQotCi0KLWNvbnN0IGNoYXIqIGRlZmlUaW1pbmdEaXNhYmxlOjp0aHJ1SW5zdCgpIGNvbnN0IHsKLSAgcmV0dXJuIGZyb21JbnN0XzsKLX0KLQotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpVGltaW5nRGlzYWJsZS5ocHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlUaW1pbmdEaXNhYmxlLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNhMWE1Ny4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlUaW1pbmdEaXNhYmxlLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2lmbmRlZiBkZWZpVGltaW5nRGlzYWJsZV9oCi0jZGVmaW5lIGRlZmlUaW1pbmdEaXNhYmxlX2gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiZGVmaUtSRGVmcy5ocHAiCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLS8vIEEgVGltaW5nIGRpc2FibGUgY2FuIGJlIGEgZnJvbS10byAgb3IgYSB0aHJ1IG9yIGEgbWFjcm8uCi0vLyAgIEEgbWFjcm8gaXMgZWl0aGVyIGEgZnJvbXRvIG1hY3JvIG9yIGEgdGhydSBtYWNyby4KLWNsYXNzIGRlZnJEYXRhOwotCi0KLWNsYXNzIGRlZmlUaW1pbmdEaXNhYmxlIHsKLXB1YmxpYzoKLSAgZGVmaVRpbWluZ0Rpc2FibGUoZGVmckRhdGEgKmRhdGEpOwotICB2b2lkIEluaXQoKTsKLQotICB2b2lkIERlc3Ryb3koKTsKLSAgfmRlZmlUaW1pbmdEaXNhYmxlKCk7Ci0KLSAgdm9pZCBjbGVhcigpOwotCi0gIHZvaWQgc2V0RnJvbVRvKGNvbnN0IGNoYXIqIGZyb21JbnN0LCBjb25zdCBjaGFyKiBmcm9tUGluLAotCQkgY29uc3QgY2hhciogdG9JbnN0LCBjb25zdCBjaGFyKiB0b1Bpbik7Ci0gIHZvaWQgc2V0VGhydShjb25zdCBjaGFyKiBmcm9tSW5zdCwgY29uc3QgY2hhciogZnJvbVBpbik7Ci0gIHZvaWQgc2V0TWFjcm8oY29uc3QgY2hhciogbmFtZSk7Ci0gIHZvaWQgc2V0TWFjcm9UaHJ1KGNvbnN0IGNoYXIqIHRocnUpOwotICB2b2lkIHNldE1hY3JvRnJvbVRvKGNvbnN0IGNoYXIqIGZyb21QaW4sIGNvbnN0IGNoYXIqIHRvUGluKTsKLSAgdm9pZCBzZXRSZWVudHJhbnRQYXRoc0ZsYWcoKTsKLQotICBpbnQgaGFzTWFjcm9UaHJ1KCkgY29uc3Q7Ci0gIGludCBoYXNNYWNyb0Zyb21UbygpIGNvbnN0OwotICBpbnQgaGFzVGhydSgpIGNvbnN0OwotICBpbnQgaGFzRnJvbVRvKCkgY29uc3Q7Ci0gIGludCBoYXNSZWVudHJhbnRQYXRoc0ZsYWcoKSBjb25zdDsKLQotICBjb25zdCBjaGFyKiBmcm9tUGluKCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIHRvUGluKCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIGZyb21JbnN0KCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIHRvSW5zdCgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBtYWNyb05hbWUoKSBjb25zdDsKLSAgY29uc3QgY2hhciogdGhydVBpbigpIGNvbnN0OyAgICAvLyBBbHNvIG1hY3JvIHRocnUKLSAgY29uc3QgY2hhciogdGhydUluc3QoKSBjb25zdDsKLQotICAvLyBkZWJ1ZyBwcmludAotICB2b2lkIHByaW50KEZJTEUqIGYpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gIGNoYXIqIGZyb21JbnN0XzsgIC8vIGFsc28gbWFjcm8gbmFtZSBhbmQgdGhydSBpbnN0Ci0gIGludCBmcm9tSW5zdExlbmd0aF87Ci0gIGNoYXIqIHRvSW5zdF87Ci0gIGludCB0b0luc3RMZW5ndGhfOwotICBjaGFyKiBmcm9tUGluXzsgIC8vIGFsc28gbWFjcm8gdGhydSBhbmQgdGhydSBwaW4KLSAgaW50IGZyb21QaW5MZW5ndGhfOwotICBjaGFyKiB0b1Bpbl87Ci0gIGludCB0b1Bpbkxlbmd0aF87Ci0KLSAgaW50IGhhc0Zyb21Ub187Ci0gIGludCBoYXNUaHJ1XzsKLSAgaW50IGhhc01hY3JvXzsKLSAgaW50IGhhc1JlZW50cmFudFBhdGhzRmxhZ187Ci0KLSAgZGVmckRhdGEgKmRlZkRhdGE7Ci19OwotCi0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1VU0VfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlVc2VyLmhwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaVVzZXIuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTg2MzVlLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaVVzZXIuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMywgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLS8qCi0gKiBVc2VyIGhlYWRlciBmaWxlIGZvciB0aGUgREVGIEludGVyZmFjZS4gIFRoaXMgaW5jbHVkZXMKLSAqIGFsbCBvZiB0aGUgaGVhZGVyIGZpbGVzIHdoaWNoIGFyZSByZWxldmFudCB0byBib3RoIHRoZQotICogcmVhZGVyIGFuZCB0aGUgd3JpdGVyLgotICoKLSAqIGRlZnJSZWFkZXIuaCBhbmQgZGVmd1dyaXRlci5oIGluY2x1ZGUgdGhpcyBmaWxlLCBzbyB0aGF0Ci0gKiBhbiBhcHBsaWNhdGlvbiBvbmx5IG5lZWRzIHRvIGluY2x1ZGUgZWl0aGVyIGRlZndSZWFkZXIuaAotICogb3IgZGVmd1dyaXRlci5oLgotICovCi0KLSNpZm5kZWYgREVGSV9VU0VSX0gKLSNkZWZpbmUgREVGSV9VU0VSX0gKLQotLyogR2VuZXJhbCB1dGlsaXRpZXMuICovCi0vKiAjaW5jbHVkZSAiZGVmaU1hbGxvYy5ocHAiICovCi0vKiAjaW5jbHVkZSAiZGVmaVV0aWxzLmhwcCIgKi8KLQotLyoKLSAqIEFQSSBvYmplY3RzCi0gKi8KLSNpbmNsdWRlICJkZWZpRGVidWcuaHBwIgotI2luY2x1ZGUgImRlZmlQcm9wLmhwcCIKLSNpbmNsdWRlICJkZWZpU2l0ZS5ocHAiCi0jaW5jbHVkZSAiZGVmaUNvbXBvbmVudC5ocHAiCi0jaW5jbHVkZSAiZGVmaU5ldC5ocHAiCi0jaW5jbHVkZSAiZGVmaVBhdGguaHBwIgotI2luY2x1ZGUgImRlZmlQaW5DYXAuaHBwIgotI2luY2x1ZGUgImRlZmlSb3dUcmFjay5ocHAiCi0jaW5jbHVkZSAiZGVmaVZpYS5ocHAiCi0jaW5jbHVkZSAiZGVmaVJlZ2lvbi5ocHAiCi0jaW5jbHVkZSAiZGVmaUdyb3VwLmhwcCIKLSNpbmNsdWRlICJkZWZpQXNzZXJ0aW9uLmhwcCIKLSNpbmNsdWRlICJkZWZpU2NhbmNoYWluLmhwcCIKLSNpbmNsdWRlICJkZWZpSU9UaW1pbmcuaHBwIgotI2luY2x1ZGUgImRlZmlGUEMuaHBwIgotI2luY2x1ZGUgImRlZmlUaW1pbmdEaXNhYmxlLmhwcCIKLSNpbmNsdWRlICJkZWZpUGFydGl0aW9uLmhwcCIKLSNpbmNsdWRlICJkZWZpUGluUHJvcC5ocHAiCi0jaW5jbHVkZSAiZGVmaUJsb2NrYWdlLmhwcCIKLSNpbmNsdWRlICJkZWZpU2xvdC5ocHAiCi0jaW5jbHVkZSAiZGVmaUZpbGwuaHBwIgotI2luY2x1ZGUgImRlZmlOb25EZWZhdWx0LmhwcCIKLSNpbmNsdWRlICJkZWZpUHJvcFR5cGUuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0vKiBORVcgQ0FMTEJBQ0sgLSBJZiB5b3UgYXJlIGNyZWF0aW5nIGEgbmV3IC5jcHAgYW5kIC5ocHAgZmlsZSB0bwotICogZGVzY3JpYmUgYSBuZXcgY2xhc3Mgb2Ygb2JqZWN0IGluIHRoZSBwYXJzZXIsIHRoZW4gYWRkIGEgcmVmZXJlbmNlCi0gKiB0byB0aGUgLmhwcCBoZXJlLgotICoKLSAqICBZb3UgbXVzdCBhbHNvIGFkZCBhbiBlbnRyeSBmb3IgdGhlIC5oIGFuZCB0aGUgLmhwcCBpbiB0aGUgcGFja2FnZV9saXN0Ci0gKiBmaWxlIG9mIHRoZSAuLi8uLi8uLi9yZWxlYXNlIGRpcmVjdG9yeS4gKi8KLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLVVTRV9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaVV0aWwuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpVXRpbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNWVmNjQuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpVXRpbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMywgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIFdJTjMyCi0jICAgaW5jbHVkZSA8dGltZS5oPgotI2Vsc2UgLyogbm90IFdJTjMyICovCi0jICAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNlbmRpZgotI2lmIGlibXJzCi0jaW5jbHVkZSA8dGltZS5oPgotI2VuZGlmCi0KLQotI2luY2x1ZGUgImRlZmlLUkRlZnMuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0vKiBOb3QgbmVlZGVkCi10aW1lX3QgZGVmaUNhbGNUaW1lKCkgewotICAgICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgZm9yIHRoZSBnaXZlbiBkYXRlCi0gICAgKiBUaGUgZGF0ZSBpcyA1LzEvOTkKLQotICAgICogVXNlZCB0byBjYWxjdWxhdGUgdGhlIFVUQyBmb3IgYSB0aW1lIGJvbWIgZGF0ZSBpbiBsaWJjYWkuYQotICAgICogc2VlIGNhaUluaXRXb3JrKCkgZnVuY3Rpb24KLSAgICAqCi0gICAgc3RydWN0IHRtCXRzOwotCi0gICAgdHMudG1fc2VjID0gMDsKLSAgICB0cy50bV9taW4gPSAwOwotICAgIHRzLnRtX2hvdXIgPSAwOwotICAgIHRzLnRtX21kYXkgPSAxOwotICAgIHRzLnRtX21vbiA9IDU7Ci0gICAgdHMudG1feWVhciA9IDE5OTkgLSAxOTAwOwotICAgIHRzLnRtX3dkYXkgPSAwOwotICAgIHRzLnRtX3lkYXkgPSAwOwotICAgIHRzLnRtX2lzZHN0ID0gMDsKLQotKgotICAgIHByaW50ZigiTWF5IDEsIDE5OTkgaW4gVVRDIGlzICVkXG4iLCBta3RpbWUoJnRzKSk7Ci0gICAgdHMudG1fbWRheSA9IDI7Ci0gICAgcHJpbnRmKCJNYXkgMiwgMTk5OSBpbiBVVEMgaXMgJWRcbiIsIG1rdGltZSgmdHMpKTsKLQotICAgIHByaW50ZigiUmlnaHQgbm93IGlzICVkXG4iLCB0aW1lKDApKTsKLSoKLSAgICByZXR1cm4obWt0aW1lKCZ0cykpOwotfQotKi8KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vICAgIGRlZmlUaW1lQm9tYgotLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotLy8gQ2hlY2sgdGhlIGN1cnJlbnQgZGF0ZSBhZ2FpbnN0IHRoZSBkYXRlIGdpdmVuCi0vKgotaW50IGRlZmlWYWxpZFRpbWUoKSB7Ci0gICAgdGltZV90CWJvbWJUaW1lID0gZGVmaUNhbGNUaW1lKCk7Ci0gICAgdGltZV90CWN1clRpbWU7Ci0KLSAgICBjdXJUaW1lID0gdGltZSgodGltZV90ICopTlVMTCk7Ci0gICAgaWYgKGN1clRpbWUgPT0gLTEgfHwgY3VyVGltZSA+IGJvbWJUaW1lKQotICAgIHsKLQkodm9pZClwcmludGYoIlRoZSBkZW1vbnN0cmF0aW9uIHZlcnNpb24gb2YgdGhpcyBjb2RlIGlzIG5vIGxvbmdlclxuIgotCQkgICAgICJhdmFpbGFibGUuICBQbGVhc2UgY29udGFjdCB5b3VyIExlZi9EZWYgUGFyc2VyXG4iCi0JCSAgICAgInNvZnR3YXJlIHByb3ZpZGVyIGZvciB1cCB0byBkYXRlIGNvZGUuXG4iKTsKLQlyZXR1cm4oMCk7Ci0gICAgfQotICAgIHJldHVybiAoMSk7Ci19Ci0qLwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gICAgQ29udmVydCB0aGUgb3JpZW50IGZyb20gaW50ZWdlciB0byBzdHJpbmcKLS8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1jb25zdCBjaGFyKiBkZWZpT3JpZW50U3RyKGludCBvcmllbnQpIHsKLSAgc3dpdGNoIChvcmllbnQpIHsKLSAgICAgIGNhc2UgMDogcmV0dXJuICgoY2hhciopIk4iKTsKLSAgICAgIGNhc2UgMTogcmV0dXJuICgoY2hhciopIlciKTsKLSAgICAgIGNhc2UgMjogcmV0dXJuICgoY2hhciopIlMiKTsKLSAgICAgIGNhc2UgMzogcmV0dXJuICgoY2hhciopIkUiKTsKLSAgICAgIGNhc2UgNDogcmV0dXJuICgoY2hhciopIkZOIik7Ci0gICAgICBjYXNlIDU6IHJldHVybiAoKGNoYXIqKSJGVyIpOwotICAgICAgY2FzZSA2OiByZXR1cm4gKChjaGFyKikiRlMiKTsKLSAgICAgIGNhc2UgNzogcmV0dXJuICgoY2hhciopIkZFIik7Ci0gIH07Ci0gIHJldHVybiAoKGNoYXIqKSIiKTsKLX0KLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlVdGlsLmhwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaVV0aWwuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTliODU4Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaVV0aWwuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMywgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpZm5kZWYgZGVmaVV0aWxfaAotI2RlZmluZSBkZWZpVXRpbF9oCi0KLSNpbmNsdWRlICJkZWZpS1JEZWZzLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotLyogUmV0dXJuIGNvZGVzIE9yaWVudCBhbmQgUm90YXRpb24gKi8KLSNkZWZpbmUgREVGX09SSUVOVF9OICAwCi0jZGVmaW5lIERFRl9PUklFTlRfVyAgMQotI2RlZmluZSBERUZfT1JJRU5UX1MgIDIKLSNkZWZpbmUgREVGX09SSUVOVF9FICAzCi0jZGVmaW5lIERFRl9PUklFTlRfRk4gNAotI2RlZmluZSBERUZfT1JJRU5UX0ZXIDUKLSNkZWZpbmUgREVGX09SSUVOVF9GUyA2Ci0jZGVmaW5lIERFRl9PUklFTlRfRkUgNwotCi1jb25zdCBjaGFyKiBkZWZpT3JpZW50U3RyKGludCBvcmllbnQpOwotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaVZpYS5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlWaWEuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmVjYzE2Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmaVZpYS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MDggKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMyAtIDIwMTYsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSAibGV4LmgiCi0jaW5jbHVkZSAiZGVmaVZpYS5ocHAiCi0jaW5jbHVkZSAiZGVmaURlYnVnLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gICBkZWZpVmlhCi0vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0KLWRlZmlWaWE6OmRlZmlWaWEoZGVmckRhdGEgKmRhdGEpIAotIDogZGVmRGF0YShkYXRhKQotewotICBJbml0KCk7Ci19Ci0KLQotdm9pZCBkZWZpVmlhOjpJbml0KCkgewotICBuYW1lXyA9IDA7Ci0gIG5hbWVMZW5ndGhfID0gMDsKLSAgcGF0dGVybl8gPSAwOwotICBwYXR0ZXJuTGVuZ3RoXyA9IDA7Ci0gIHhsXyA9IDA7Ci0gIHlsXyA9IDA7Ci0gIHhoXyA9IDA7Ci0gIHloXyA9IDA7Ci0gIGxheWVyc0xlbmd0aF8gPSAwOwotICBsYXllcnNfID0gMDsKLSAgdmlhUnVsZV8gPSAwOwotICB2aWFSdWxlTGVuZ3RoXyA9IDA7Ci0gIHhTaXplXyA9IDA7Ci0gIHlTaXplXyA9IDA7Ci0gIGJvdExheWVyXyA9IDA7Ci0gIGN1dExheWVyXyA9IDA7Ci0gIHRvcExheWVyXyA9IDA7Ci0gIGJvdExheWVyTGVuZ3RoXyA9IDA7Ci0gIGN1dExheWVyTGVuZ3RoXyA9IDA7Ci0gIHRvcExheWVyTGVuZ3RoXyA9IDA7Ci0gIHhDdXRTcGFjaW5nXyA9IDA7Ci0gIHlDdXRTcGFjaW5nXyA9IDA7Ci0gIHhCb3RFbmNfID0gMDsKLSAgeUJvdEVuY18gPSAwOwotICB4VG9wRW5jXyA9IDA7Ci0gIHlUb3BFbmNfID0gMDsKLSAgY3V0UGF0dGVybl8gPSAwOwotICBjdXRQYXR0ZXJuTGVuZ3RoXyA9IDA7Ci0gIG51bUxheWVyc18gPSAwOwotICBudW1Qb2x5c18gPSAwOwotICBwb2x5Z29uc18gPSAwOwotICBwb2x5c0FsbG9jYXRlZF8gPSAwOwotICBwb2x5Z29uTmFtZXNfID0gMDsKLSAgcmVjdE1hc2tfID0gMDsKLSAgcG9seU1hc2tfID0gMDsKLSAgY2xlYXIoKTsKLX0KLQotdm9pZCBkZWZpVmlhOjpjbGVhcigpIHsKLSAgaW50IGk7Ci0KLSAgaGFzUGF0dGVybl8gPSAwOwotICBoYXNWaWFSdWxlXyA9IDA7Ci0gIHJvd3NfID0gMDsKLSAgY29sc18gPSAwOwotICB4T2Zmc2V0XyA9IDA7Ci0gIHlPZmZzZXRfID0gMDsKLSAgeEJvdE9mZnNldF8gPSAwOwotICB5Qm90T2Zmc2V0XyA9IDA7Ci0gIHhUb3BPZmZzZXRfID0gMDsKLSAgeVRvcE9mZnNldF8gPSAwOwotICBoYXNDdXRQYXR0ZXJuXyA9IDA7Ci0gIAotICBpZiAocG9seWdvbk5hbWVzXykgewotICAgIHN0cnVjdCBkZWZpUG9pbnRzKiBwOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1Qb2x5c187IGkrKykgewotICAgICAgICBmcmVlKHBvbHlnb25OYW1lc19baV0pOwotCi0gICAgICAgIHAgPSBwb2x5Z29uc19baV07Ci0gICAgICAgIGZyZWUocC0+eCk7Ci0gICAgICAgIGZyZWUocC0+eSk7Ci0gICAgICAgIGZyZWUocCk7Ci0gICAgfQotCi0gICAgZnJlZShwb2x5Z29uTmFtZXNfKTsKLSAgICBmcmVlKHBvbHlnb25zXyk7Ci0gICAgZnJlZShwb2x5TWFza18pOwotCi0gICAgcG9seWdvbk5hbWVzXyA9IE5VTEw7Ci0gICAgcG9seWdvbnNfID0gTlVMTDsKLSAgICBwb2x5TWFza18gPSBOVUxMOwotICB9Ci0KLSAgbnVtUG9seXNfID0gMDsKLSAgcG9seXNBbGxvY2F0ZWRfID0gMDsKLX0KLQotZGVmaVZpYTo6fmRlZmlWaWEoKSB7Ci0gIERlc3Ryb3koKTsKLX0KLQotCi12b2lkIGRlZmlWaWE6OkRlc3Ryb3koKSB7Ci0gIGludCBpOwotCi0gIGZyZWUobmFtZV8pOwotICBuYW1lXyA9IE5VTEw7Ci0KLSAgZnJlZShwYXR0ZXJuXyk7Ci0gIHBhdHRlcm5fID0gTlVMTDsKLQotICBpZiAobGF5ZXJzXykgewotICAgIGZvciAoaSA9IDA7IGkgPCBudW1MYXllcnNfOyBpKyspIHsKLSAgICAgICAgZnJlZShsYXllcnNfW2ldKTsKLSAgICB9Ci0KLSAgICBmcmVlKGxheWVyc18pOwotICAgIGxheWVyc18gPSBOVUxMOwotCi0gICAgZnJlZSh4bF8pOwotICAgIHhsXyA9IE5VTEw7Ci0KLSAgICBmcmVlKHlsXyk7Ci0gICAgeWxfID0gTlVMTDsKLQotICAgIGZyZWUoeGhfKTsKLSAgICB4aF8gPSBOVUxMOwotCi0gICAgZnJlZSh5aF8pOwotICAgIHloXyA9IE5VTEw7Ci0KLSAgICBmcmVlKHJlY3RNYXNrXyk7Ci0gICAgcmVjdE1hc2tfID0gTlVMTDsKLQotICAgIGZyZWUocG9seU1hc2tfKTsKLSAgICBwb2x5TWFza18gPSBOVUxMOwotICB9Ci0KLSAgZnJlZSh2aWFSdWxlXyk7Ci0gIHZpYVJ1bGVfID0gTlVMTDsKLQotICBmcmVlKGJvdExheWVyXyk7Ci0gIGJvdExheWVyXyA9IE5VTEw7Ci0KLSAgZnJlZShjdXRMYXllcl8pOwotICBjdXRMYXllcl8gPSBOVUxMOwotCi0gIGZyZWUodG9wTGF5ZXJfKTsKLSAgdG9wTGF5ZXJfID0gTlVMTDsKLQotICBmcmVlKGN1dFBhdHRlcm5fKTsKLSAgY3V0UGF0dGVybl8gPSBOVUxMOwotCi0gIGNsZWFyKCk7Ci19Ci0KLQotdm9pZCBkZWZpVmlhOjpzZXR1cChjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIGludCBpOwotICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLSAgaWYgKGxlbiA+IG5hbWVMZW5ndGhfKSB7Ci0gICAgbmFtZUxlbmd0aF8gPSBsZW47Ci0gICAgbmFtZV8gPSAoY2hhciopcmVhbGxvYyhuYW1lXywgbGVuKTsKLSAgfQotICBzdHJjcHkobmFtZV8sIGRlZkRhdGEtPkRFRkNBU0UobmFtZSkpOwotICBpZiAocGF0dGVybl8pICoocGF0dGVybl8pID0gMDsKLSAgaWYgKGxheWVyc18pIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTGF5ZXJzXzsgaSsrKSB7Ci0gICAgICAgIGZyZWUobGF5ZXJzX1tpXSk7Ci0gICAgICAgIGxheWVyc19baV0gPSAwOwotICAgIH0KLSAgfQotCi0gIG51bUxheWVyc18gPSAwOwotfQotCi0KLXZvaWQgZGVmaVZpYTo6YWRkUGF0dGVybihjb25zdCBjaGFyKiBwYXR0ZXJuKSB7Ci0gIGludCBsZW4gPSBzdHJsZW4ocGF0dGVybikgKyAxOwotICBpZiAobGVuID4gcGF0dGVybkxlbmd0aF8pIHsKLSAgICBwYXR0ZXJuTGVuZ3RoXyA9IGxlbjsKLSAgICBwYXR0ZXJuXyA9IChjaGFyKilyZWFsbG9jKHBhdHRlcm5fLCBsZW4pOwotICB9Ci0gIHN0cmNweShwYXR0ZXJuXywgZGVmRGF0YS0+REVGQ0FTRShwYXR0ZXJuKSk7Ci0gIGhhc1BhdHRlcm5fID0gMTsKLX0KLQotCi12b2lkIGRlZmlWaWE6OmFkZExheWVyKGNvbnN0IGNoYXIqIGxheWVyLCBpbnQgeGwsIGludCB5bCwgaW50IHhoLCBpbnQgeWgsIGludCBjb2xvck1hc2spIHsKLSAgY2hhciogbDsKLSAgaW50IGxlbjsKLQotICBpZiAobnVtTGF5ZXJzXyA+PSBsYXllcnNMZW5ndGhfKSB7Ci0gICAgaW50IGk7Ci0gICAgY2hhcioqIG5ld2w7Ci0gICAgaW50KiBpbnRzOwotICAgIGxheWVyc0xlbmd0aF8gPSBsYXllcnNMZW5ndGhfID8gMiAqIGxheWVyc0xlbmd0aF8gOiA4OwotCi0gICAgbmV3bCA9IChjaGFyKiopbWFsbG9jKGxheWVyc0xlbmd0aF8gKiBzaXplb2YoY2hhciopKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTGF5ZXJzXzsgaSsrKQotICAgICAgbmV3bFtpXSA9IGxheWVyc19baV07Ci0gICAgaWYgKGxheWVyc18pIGZyZWUoKGNoYXIqKShsYXllcnNfKSk7Ci0gICAgbGF5ZXJzXyA9IG5ld2w7Ci0KLSAgICBpbnRzID0gKGludCopbWFsbG9jKGxheWVyc0xlbmd0aF8gKiBzaXplb2YoaW50KSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bUxheWVyc187IGkrKykKLSAgICAgIGludHNbaV0gPSB4bF9baV07Ci0gICAgaWYgKHhsXykgZnJlZSgoY2hhciopKHhsXykpOwotICAgIHhsXyA9IGludHM7Ci0KLSAgICBpbnRzID0gKGludCopbWFsbG9jKGxheWVyc0xlbmd0aF8gKiBzaXplb2YoaW50KSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bUxheWVyc187IGkrKykKLSAgICAgIGludHNbaV0gPSB5bF9baV07Ci0gICAgaWYgKHlsXykgZnJlZSgoY2hhciopKHlsXykpOwotICAgIHlsXyA9IGludHM7Ci0KLSAgICBpbnRzID0gKGludCopbWFsbG9jKGxheWVyc0xlbmd0aF8gKiBzaXplb2YoaW50KSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bUxheWVyc187IGkrKykKLSAgICAgIGludHNbaV0gPSB4aF9baV07Ci0gICAgaWYgKHhoXykgZnJlZSgoY2hhciopKHhoXykpOwotICAgIHhoXyA9IGludHM7Ci0KLSAgICBpbnRzID0gKGludCopbWFsbG9jKGxheWVyc0xlbmd0aF8gKiBzaXplb2YoaW50KSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bUxheWVyc187IGkrKykKLSAgICAgIGludHNbaV0gPSB5aF9baV07Ci0gICAgaWYgKHloXykgZnJlZSgoY2hhciopKHloXykpOwotICAgIHloXyA9IGludHM7Ci0KLSAgICBpbnRzID0gKGludCopbWFsbG9jKGxheWVyc0xlbmd0aF8gKiBzaXplb2YoaW50KSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bUxheWVyc187IGkrKykKLSAgICAgICAgaW50c1tpXSA9IHJlY3RNYXNrX1tpXTsKLSAgICBpZiAocmVjdE1hc2tfKSBmcmVlKChjaGFyKikocmVjdE1hc2tfKSk7Ci0gICAgcmVjdE1hc2tfID0gaW50czsKLSAgfQotCi0gIGxlbiA9IHN0cmxlbihsYXllcikgKyAxOwotICBsID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICBzdHJjcHkobCwgZGVmRGF0YS0+REVGQ0FTRShsYXllcikpOwotICBsYXllcnNfW251bUxheWVyc19dID0gbDsKLSAgeGxfW251bUxheWVyc19dID0geGw7Ci0gIHlsX1tudW1MYXllcnNfXSA9IHlsOwotICB4aF9bbnVtTGF5ZXJzX10gPSB4aDsKLSAgeWhfW251bUxheWVyc19dID0geWg7Ci0gIHJlY3RNYXNrX1tudW1MYXllcnNfXSA9IGNvbG9yTWFzazsKLSAgbnVtTGF5ZXJzXysrOwotfQotCi0vLyA1LjYKLXZvaWQgZGVmaVZpYTo6YWRkUG9seWdvbihjb25zdCBjaGFyKiBsYXllciwgZGVmaUdlb21ldHJpZXMqIGdlb20sIGludCBjb2xvck1hc2spIHsKLSAgc3RydWN0IGRlZmlQb2ludHMqIHA7Ci0gIGludCB4LCB5OwotICBpbnQgaTsKLQotICBpZiAobnVtUG9seXNfID09IHBvbHlzQWxsb2NhdGVkXykgewotICAgIGNoYXIqKiBuZXduOwotICAgIGludCogbWFza3M7Ci0gICAgc3RydWN0IGRlZmlQb2ludHMqKiBwb2x5OwotICAgIHBvbHlzQWxsb2NhdGVkXyA9IChwb2x5c0FsbG9jYXRlZF8gPT0gMCkgPwotICAgICAgICAgIDIgOiBwb2x5c0FsbG9jYXRlZF8gKiAyOwotICAgIG5ld24gPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopICogcG9seXNBbGxvY2F0ZWRfKTsKLSAgICBwb2x5ID0gKHN0cnVjdCBkZWZpUG9pbnRzKiopbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGVmaVBvaW50cyopICoKLSAgICAgICAgICAgIHBvbHlzQWxsb2NhdGVkXyk7Ci0gICAgbWFza3MgPSAoaW50KiltYWxsb2MocG9seXNBbGxvY2F0ZWRfICogc2l6ZW9mKGludCkpOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1Qb2x5c187IGkrKykgewotICAgICAgbmV3bltpXSA9IHBvbHlnb25OYW1lc19baV07Ci0gICAgICBwb2x5W2ldID0gcG9seWdvbnNfW2ldOwotICAgICAgbWFza3NbaV0gPSBwb2x5TWFza19baV07Ci0gICAgfQotICAgIGlmIChwb2x5Z29uc18pCi0gICAgICBmcmVlKChjaGFyKikocG9seWdvbnNfKSk7Ci0gICAgaWYgKHBvbHlnb25OYW1lc18pCi0gICAgICBmcmVlKChjaGFyKikocG9seWdvbk5hbWVzXykpOwotICAgIGlmIChwb2x5TWFza18pIAotICAgICAgZnJlZSgoY2hhciopKHBvbHlNYXNrXykpOwotICAgIHBvbHlnb25OYW1lc18gPSBuZXduOwotICAgIHBvbHlnb25zXyA9IHBvbHk7Ci0gICAgcG9seU1hc2tfID0gbWFza3M7Ci0gIH0KLSAgcG9seWdvbk5hbWVzX1tudW1Qb2x5c19dID0gc3RyZHVwKGxheWVyKTsKLSAgcCA9IChzdHJ1Y3QgZGVmaVBvaW50cyopbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGVmaVBvaW50cykpOwotICBwLT5udW1Qb2ludHMgPSBnZW9tLT5udW1Qb2ludHMoKTsKLSAgcC0+eCA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSpwLT5udW1Qb2ludHMpOwotICBwLT55ID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKnAtPm51bVBvaW50cyk7Ci0gIGZvciAoaSA9IDA7IGkgPCBwLT5udW1Qb2ludHM7IGkrKykgewotICAgIGdlb20tPnBvaW50cyhpLCAmeCwgJnkpOwotICAgIHAtPnhbaV0gPSB4OwotICAgIHAtPnlbaV0gPSB5OwotICB9Ci0gIHBvbHlnb25zX1tudW1Qb2x5c19dID0gcDsKLSAgcG9seU1hc2tfW251bVBvbHlzX10gPSBjb2xvck1hc2s7Ci0gIG51bVBvbHlzXyArPSAxOwotfQotCi12b2lkIGRlZmlWaWE6OmFkZFZpYVJ1bGUoY2hhciogdmlhUnVsZU5hbWUsIGludCB4U2l6ZSwgaW50IHlTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGJvdExheWVyLCBjaGFyKiBjdXRMYXllciwgY2hhciogdG9wTGF5ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhTcGFjaW5nLCBpbnQgeVNwYWNpbmcsIGludCB4Qm90RW5jLCBpbnQgeUJvdEVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeFRvcEVuYywgaW50IHlUb3BFbmMpIHsKLSAgaW50IGxlbjsKLQotICBsZW4gPSBzdHJsZW4odmlhUnVsZU5hbWUpICsgMTsKLSAgaWYgKGxlbiA+IHZpYVJ1bGVMZW5ndGhfKSB7Ci0gICAgaWYgKHZpYVJ1bGVfKQotICAgICAgZnJlZSh2aWFSdWxlXyk7Ci0gICAgdmlhUnVsZV8gPSAoY2hhciopbWFsbG9jKHN0cmxlbih2aWFSdWxlTmFtZSkrMSk7Ci0gIH0KLSAgc3RyY3B5KHZpYVJ1bGVfLCBkZWZEYXRhLT5ERUZDQVNFKHZpYVJ1bGVOYW1lKSk7Ci0gIHhTaXplXyA9IHhTaXplOwotICB5U2l6ZV8gPSB5U2l6ZTsKLSAgbGVuID0gc3RybGVuKGJvdExheWVyKSArIDE7Ci0gIGlmIChsZW4gPiBib3RMYXllckxlbmd0aF8pIHsKLSAgICBpZiAoYm90TGF5ZXJfKQotICAgICAgZnJlZShib3RMYXllcl8pOwotICAgIGJvdExheWVyXyA9IChjaGFyKiltYWxsb2Moc3RybGVuKGJvdExheWVyKSsxKTsKLSAgICBib3RMYXllckxlbmd0aF8gPSBsZW47Ci0gIH0KLSAgc3RyY3B5KGJvdExheWVyXywgZGVmRGF0YS0+REVGQ0FTRShib3RMYXllcikpOwotICBsZW4gPSBzdHJsZW4oY3V0TGF5ZXIpICsgMTsKLSAgaWYgKGxlbiA+IGN1dExheWVyTGVuZ3RoXykgewotICAgIGlmIChjdXRMYXllcl8pCi0gICAgICBmcmVlKGN1dExheWVyXyk7Ci0gICAgY3V0TGF5ZXJfID0gKGNoYXIqKW1hbGxvYyhzdHJsZW4oY3V0TGF5ZXIpKzEpOwotICAgIGN1dExheWVyTGVuZ3RoXyA9IGxlbjsKLSAgfQotICBzdHJjcHkoY3V0TGF5ZXJfLCBkZWZEYXRhLT5ERUZDQVNFKGN1dExheWVyKSk7Ci0gIGxlbiA9IHN0cmxlbih0b3BMYXllcikgKyAxOwotICBpZiAobGVuID4gdG9wTGF5ZXJMZW5ndGhfKSB7Ci0gICAgaWYgKHRvcExheWVyXykKLSAgICAgIGZyZWUodG9wTGF5ZXJfKTsKLSAgICB0b3BMYXllcl8gPSAoY2hhciopbWFsbG9jKHN0cmxlbih0b3BMYXllcikrMSk7Ci0gICAgdG9wTGF5ZXJMZW5ndGhfID0gbGVuOwotICB9Ci0gIHN0cmNweSh0b3BMYXllcl8sIGRlZkRhdGEtPkRFRkNBU0UodG9wTGF5ZXIpKTsKLSAgeEN1dFNwYWNpbmdfID0geFNwYWNpbmc7Ci0gIHlDdXRTcGFjaW5nXyA9IHlTcGFjaW5nOwotICB4Qm90RW5jXyA9IHhCb3RFbmM7Ci0gIHlCb3RFbmNfID0geUJvdEVuYzsKLSAgeFRvcEVuY18gPSB4VG9wRW5jOwotICB5VG9wRW5jXyA9IHlUb3BFbmM7Ci0gIGhhc1ZpYVJ1bGVfID0gMTsKLX0KLQotdm9pZCBkZWZpVmlhOjphZGRSb3dDb2woaW50IG51bUN1dFJvd3MsIGludCBudW1DdXRDb2xzKSB7Ci0gIHJvd3NfID0gbnVtQ3V0Um93czsKLSAgY29sc18gPSBudW1DdXRDb2xzOwotfQotCi12b2lkIGRlZmlWaWE6OmFkZE9yaWdpbihpbnQgeE9mZnNldCwgaW50IHlPZmZzZXQpIHsKLSAgeE9mZnNldF8gPSB4T2Zmc2V0OwotICB5T2Zmc2V0XyA9IHlPZmZzZXQ7Ci19Ci0KLXZvaWQgZGVmaVZpYTo6YWRkT2Zmc2V0KGludCB4Qm90T3MsIGludCB5Qm90T3MsIGludCB4VG9wT3MsIGludCB5VG9wT3MpIHsKLSAgeEJvdE9mZnNldF8gPSB4Qm90T3M7Ci0gIHlCb3RPZmZzZXRfID0geUJvdE9zOwotICB4VG9wT2Zmc2V0XyA9IHhUb3BPczsKLSAgeVRvcE9mZnNldF8gPSB5VG9wT3M7Ci19Ci0KLXZvaWQgZGVmaVZpYTo6YWRkQ3V0UGF0dGVybihjaGFyKiBjdXRQYXR0ZXJuKSB7Ci0gIGludCBsZW47Ci0KLSAgbGVuID0gc3RybGVuKGN1dFBhdHRlcm4pICsgMTsKLSAgaWYgKGxlbiA+IGN1dFBhdHRlcm5MZW5ndGhfKSB7Ci0gICAgaWYgKGN1dFBhdHRlcm5fKQotICAgICAgZnJlZShjdXRQYXR0ZXJuXyk7Ci0gICAgY3V0UGF0dGVybl8gPSAoY2hhciopbWFsbG9jKHN0cmxlbihjdXRQYXR0ZXJuKSsxKTsKLSAgICBjdXRQYXR0ZXJuTGVuZ3RoXyA9IGxlbjsKLSAgfQotICBzdHJjcHkoY3V0UGF0dGVybl8sIGRlZkRhdGEtPkRFRkNBU0UoY3V0UGF0dGVybikpOwotICBoYXNDdXRQYXR0ZXJuXyA9IDE7Ci19Ci0KLWludCBkZWZpVmlhOjpoYXNQYXR0ZXJuKCkgY29uc3QgewotICByZXR1cm4gaGFzUGF0dGVybl87Ci19Ci0KLQotY29uc3QgY2hhciogZGVmaVZpYTo6cGF0dGVybigpIGNvbnN0IHsKLSAgcmV0dXJuIHBhdHRlcm5fOwotfQotCi0KLWNvbnN0IGNoYXIqIGRlZmlWaWE6Om5hbWUoKSBjb25zdCB7Ci0gIHJldHVybiBuYW1lXzsKLX0KLQotCi1pbnQgZGVmaVZpYTo6bnVtTGF5ZXJzKCkgY29uc3QgewotICByZXR1cm4gbnVtTGF5ZXJzXzsKLX0KLQotaW50IGRlZmlWaWE6OnJlY3RNYXNrKGludCBpbmRleCkgY29uc3QgewotICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgbnVtTGF5ZXJzXykgewotICAgICAgICByZXR1cm4gcmVjdE1hc2tfW2luZGV4XTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGRlZmlWaWE6OnBvbHlNYXNrKGludCBpbmRleCkgY29uc3QgewotICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgbnVtUG9seXNfKSB7Ci0gICAgICAgIHJldHVybiBwb2x5TWFza19baW5kZXhdOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi12b2lkIGRlZmlWaWE6OmxheWVyKGludCBpbmRleCwgY2hhcioqIGxheWVyLCBpbnQqIHhsLCBpbnQqIHlsLCAKLSAgICAgIGludCogeGgsIGludCogeWgpIGNvbnN0IHsKLSAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBudW1MYXllcnNfKSB7Ci0gICAgaWYgKGxheWVyKSAqbGF5ZXIgPSBsYXllcnNfW2luZGV4XTsKLSAgICBpZiAoeGwpICp4bCA9IHhsX1tpbmRleF07Ci0gICAgaWYgKHlsKSAqeWwgPSB5bF9baW5kZXhdOwotICAgIGlmICh4aCkgKnhoID0geGhfW2luZGV4XTsKLSAgICBpZiAoeWgpICp5aCA9IHloX1tpbmRleF07Ci0gIH0KLX0KLQotLy8gVGhlIGZvbGxvd2luZyBjb2RlIGlzIGZvciA1LjYKLQotaW50IGRlZmlWaWE6Om51bVBvbHlnb25zKCkgY29uc3QgewotICByZXR1cm4gbnVtUG9seXNfOwotfQotCi1jb25zdCBjaGFyKiBkZWZpVmlhOjpwb2x5Z29uTmFtZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgY2hhciBtc2dbMTYwXTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IG51bVBvbHlzXykgewotICAgICBzcHJpbnRmIChtc2csICJFUlJPUiAoREVGUEFSUy02MTgwKTogVGhlIGluZGV4IG51bWJlciAlZCBzcGVjaWZpZWQgZm9yIHRoZSBWSUEgUE9MWUdPTiBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiBTcGVjaWZ5IGEgdmFsaWQgaW5kZXggbnVtYmVyIGFuZCB0aGVuIHRyeSBhZ2FpbiIsCi0gICAgICAgICAgICAgIGluZGV4LCBudW1Qb2x5c18pOwotICAgICBkZWZpRXJyb3IoMCwgNjE4MCwgbXNnLCBkZWZEYXRhKTsKLSAgICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIHBvbHlnb25OYW1lc19baW5kZXhdOwotfQotCi1zdHJ1Y3QgZGVmaVBvaW50cyBkZWZpVmlhOjpnZXRQb2x5Z29uKGludCBpbmRleCkgY29uc3QgewotICByZXR1cm4gKihwb2x5Z29uc19baW5kZXhdKTsKLX0KLQotaW50IGRlZmlWaWE6Omhhc1ZpYVJ1bGUoKSBjb25zdCB7Ci0gIHJldHVybiBoYXNWaWFSdWxlXzsKLX0KLQotdm9pZCBkZWZpVmlhOjp2aWFSdWxlKGNoYXIqKiB2aWFSdWxlTmFtZSwgaW50KiB4U2l6ZSwgaW50KiB5U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICBjaGFyKiogYm90TGF5ZXIsIGNoYXIqKiBjdXRMYXllciwgY2hhcioqIHRvcExheWVyLAotICAgICAgICAgICAgICAgICAgICAgIGludCogeEN1dFNwYWNpbmcsIGludCogeUN1dFNwYWNpbmcsIGludCogeEJvdEVuYywKLSAgICAgICAgICAgICAgICAgICAgICBpbnQqIHlCb3RFbmMsIGludCogeFRvcEVuYywgaW50KiB5VG9wRW5jKSBjb25zdCB7Ci0gICp2aWFSdWxlTmFtZSA9IHZpYVJ1bGVfOwotICAqeFNpemUgPSB4U2l6ZV87Ci0gICp5U2l6ZSA9IHlTaXplXzsKLSAgKmJvdExheWVyID0gYm90TGF5ZXJfOwotICAqY3V0TGF5ZXIgPSBjdXRMYXllcl87Ci0gICp0b3BMYXllciA9IHRvcExheWVyXzsKLSAgKnhDdXRTcGFjaW5nID0geEN1dFNwYWNpbmdfOwotICAqeUN1dFNwYWNpbmcgPSB5Q3V0U3BhY2luZ187Ci0gICp4Qm90RW5jID0geEJvdEVuY187Ci0gICp5Qm90RW5jID0geUJvdEVuY187Ci0gICp4VG9wRW5jID0geFRvcEVuY187Ci0gICp5VG9wRW5jID0geVRvcEVuY187Ci19Ci0KLWludCBkZWZpVmlhOjpoYXNSb3dDb2woKSBjb25zdCB7Ci0gIGlmIChyb3dzXykKLSAgICByZXR1cm4gcm93c187IAotICBlbHNlCi0gICAgcmV0dXJuIGNvbHNfOyAKLX0KLQotdm9pZCBkZWZpVmlhOjpyb3dDb2woaW50KiBudW1DdXRSb3dzLCBpbnQqIG51bUN1dENvbHMpIGNvbnN0IHsKLSAgKm51bUN1dFJvd3MgPSByb3dzXzsKLSAgKm51bUN1dENvbHMgPSBjb2xzXzsKLX0KLQotaW50IGRlZmlWaWE6Omhhc09yaWdpbigpIGNvbnN0IHsKLSAgaWYgKHhPZmZzZXRfKQotICAgIHJldHVybiB4T2Zmc2V0XzsKLSAgZWxzZQotICAgIHJldHVybiB5T2Zmc2V0XzsKLX0KLQotdm9pZCBkZWZpVmlhOjpvcmlnaW4oaW50KiB4T2Zmc2V0LCBpbnQqIHlPZmZzZXQpIGNvbnN0IHsKLSAgKnhPZmZzZXQgPSB4T2Zmc2V0XzsKLSAgKnlPZmZzZXQgPSB5T2Zmc2V0XzsKLX0KLQotaW50IGRlZmlWaWE6Omhhc09mZnNldCgpIGNvbnN0IHsKLSAgaWYgKHhCb3RPZmZzZXRfKQotICAgIHJldHVybiB4Qm90T2Zmc2V0XzsKLSAgZWxzZSBpZiAoeUJvdE9mZnNldF8pCi0gICAgcmV0dXJuIHlCb3RPZmZzZXRfOwotICBlbHNlIGlmICh4VG9wT2Zmc2V0XykKLSAgICByZXR1cm4geFRvcE9mZnNldF87Ci0gIGVsc2UgCi0gICAgcmV0dXJuIHlUb3BPZmZzZXRfOwotfQotCi12b2lkIGRlZmlWaWE6Om9mZnNldChpbnQqIHhCb3RPZmZzZXQsIGludCogeUJvdE9mZnNldCwgaW50KiB4VG9wT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgaW50KiB5VG9wT2Zmc2V0KSBjb25zdCB7Ci0gICp4Qm90T2Zmc2V0ID0geEJvdE9mZnNldF87Ci0gICp5Qm90T2Zmc2V0ID0geUJvdE9mZnNldF87Ci0gICp4VG9wT2Zmc2V0ID0geFRvcE9mZnNldF87Ci0gICp5VG9wT2Zmc2V0ID0geVRvcE9mZnNldF87Ci19Ci0KLWludCBkZWZpVmlhOjpoYXNDdXRQYXR0ZXJuKCkgY29uc3QgewotICByZXR1cm4gaGFzQ3V0UGF0dGVybl87Ci19Ci0KLWludCBkZWZpVmlhOjpoYXNSZWN0TWFzayhpbnQgaW5kZXgpIGNvbnN0IHsKLSAgICBpZiAoaW5kZXggPiAwIHx8IGluZGV4IDwgbnVtTGF5ZXJzXykgewotICAgICAgICByZXR1cm4gcmVjdE1hc2tfW2luZGV4XTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGRlZmlWaWE6Omhhc1BvbHlNYXNrKGludCBpbmRleCkgY29uc3QgewotICAgIGlmIChpbmRleCA+IDAgfHwgaW5kZXggPCBudW1Qb2x5c18pIHsKLSAgICAgICAgcmV0dXJuIHBvbHlNYXNrX1tpbmRleF07Ci0gICAgfQotICAgIAotICAgIHJldHVybiAwOwotfQotCi1jb25zdCBjaGFyKiBkZWZpVmlhOjpjdXRQYXR0ZXJuKCkgY29uc3QgewotICByZXR1cm4gY3V0UGF0dGVybl87Ci19Ci0KLXZvaWQgZGVmaVZpYTo6cHJpbnQoRklMRSogZikgY29uc3QgewotICBpbnQgaTsKLSAgaW50IHhsLCB5bCwgeGgsIHloOwotICBjaGFyKiBjOwotICBjaGFyKiB2cm47Ci0gIGNoYXIgKmJsLCAqY2wsICp0bDsKLSAgaW50IHhzLCB5cywgeGNzLCB5Y3MsIHhiZSwgeWJlLCB4dGUsIHl0ZTsKLSAgaW50IGNyLCBjYywgeG8sIHlvLCB4Ym8sIHlibywgeHRvLCB5dG87Ci0KLSAgZnByaW50ZihmLCAidmlhICclcydcbiIsIG5hbWUoKSk7Ci0KLSAgaWYgKGhhc1BhdHRlcm4oKSkKLSAgICBmcHJpbnRmKGYsICIgIHBhdHRlcm4gJyVzJ1xuIiwgcGF0dGVybigpKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgbnVtTGF5ZXJzKCk7IGkrKykgewotICAgIGxheWVyKGksICZjLCAmeGwsICZ5bCwgJnhoLCAmeWgpOwotICAgIGZwcmludGYoZiwgIiAgbGF5ZXIgJyVzJyAlZCwlZCAlZCwlZFxuIiwgYywgeGwsIHlsLCB4aCwgeWgpOwotICB9Ci0KLSAgaWYgKGhhc1ZpYVJ1bGUoKSkgewotICAgIHZpYVJ1bGUoJnZybiwgJnhzLCAmeXMsICZibCwgJmNsLCAmdGwsICZ4Y3MsICZ5Y3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeGJlLCAmeWJlLCAmeHRlLCAmeXRlKTsKLSAgICBmcHJpbnRmKGYsICIgIHZpYXJ1bGUgJyVzJ1xuIiwgdnJuKTsKLSAgICBmcHJpbnRmKGYsICIgICAgY3V0c2l6ZSAlZCAlZFxuIiwgeHMsIHlzKTsKLSAgICBmcHJpbnRmKGYsICIgICAgbGF5ZXJzICVzICVzICVzXG4iLCBibCwgY2wsIHRsKTsKLSAgICBmcHJpbnRmKGYsICIgICAgY3V0c3BhY2luZyAlZCAlZFxuIiwgeGNzLCB5Y3MpOwotICAgIGZwcmludGYoZiwgIiAgICBlbmNsb3N1cmUgJWQgJWQgJWQgJWRcbiIsIHhiZSwgeWJlLCB4dGUsIHl0ZSk7Ci0gICAgaWYgKGhhc1Jvd0NvbCgpKSB7Ci0gICAgICAgcm93Q29sKCZjciwgJmNjKTsKLSAgICAgICBmcHJpbnRmKGYsICIgICAgcm93Y29sICVkICVkXG4iLCBjciwgY2MpOwotICAgIH0KLSAgICBpZiAoaGFzT3JpZ2luKCkpIHsKLSAgICAgICBvcmlnaW4oJnhvLCAmeW8pOwotICAgICAgIGZwcmludGYoZiwgIiAgICBvcmlnaW4gJWQgJWRcbiIsIHhvLCB5byk7Ci0gICAgfQotICAgIGlmIChoYXNPZmZzZXQoKSkgewotICAgICAgIG9mZnNldCgmeGJvLCAmeWJvLCAmeHRvLCAmeXRvKTsKLSAgICAgICBmcHJpbnRmKGYsICIgICAgb2Zmc2V0ICVkICVkICVkICVkXG4iLCB4Ym8sIHlibywgeHRvLCB5dG8pOwotICAgIH0KLSAgICBpZiAoaGFzQ3V0UGF0dGVybigpKQotICAgICAgIGZwcmludGYoZiwgIiAgICBwYXR0ZXJuICclcydcbiIsIGN1dFBhdHRlcm4oKSk7Ci0gIH0KLX0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlWaWEuaHBwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZpVmlhLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FlNTdiYy4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZmlWaWEuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaWZuZGVmIGRlZmlWaWFfaAotI2RlZmluZSBkZWZpVmlhX2gKLQotI2luY2x1ZGUgImRlZmlLUkRlZnMuaHBwIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiZGVmaU1pc2MuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1jbGFzcyBkZWZyRGF0YTsKLQotLy8gU3RydWN0IGhvbGRzIHRoZSBkYXRhIGZvciBvbmUgcHJvcGVydHkuCi1jbGFzcyBkZWZpVmlhIHsKLXB1YmxpYzoKLSAgZGVmaVZpYShkZWZyRGF0YSAqZGF0YSk7Ci0gIHZvaWQgSW5pdCgpOwotCi0gIHZvaWQgY2xlYXIoKTsKLSAgdm9pZCBEZXN0cm95KCk7Ci0gIH5kZWZpVmlhKCk7Ci0KLSAgdm9pZCBzZXR1cChjb25zdCBjaGFyKiBuYW1lKTsKLSAgdm9pZCBhZGRQYXR0ZXJuKGNvbnN0IGNoYXIqIHBhdHQpOwotICB2b2lkIGFkZExheWVyKGNvbnN0IGNoYXIqIGxheWVyLCBpbnQgeGwsIGludCB5bCwgaW50IHhoLCBpbnQgeWgsIGludCBjb2xvck1hc2sgPSAwKTsKLSAgLy8gNS42Ci0gIHZvaWQgYWRkUG9seWdvbihjb25zdCBjaGFyKiBsYXllciwgZGVmaUdlb21ldHJpZXMqIGdlb20sIGludCBjb2xvck1hc2sgPSAwKTsKLSAgdm9pZCBhZGRWaWFSdWxlKGNoYXIqIHZpYVJ1bGVOYW1lLCBpbnQgeFNpemUsIGludCB5U2l6ZSwgY2hhciogYm90TGF5ZXIsCi0gICAgICAgICAgICAgICAgICBjaGFyKiBjdXRMYXllciwgY2hhciogdG9wTGF5ZXIsIGludCB4U3BhY2luZywgaW50IHlTcGFjaW5nLAotICAgICAgICAgICAgICAgICAgaW50IHhCb3RFbmMsIGludCB5Qm90RW5jLCBpbnQgeFRvcEVuYywgaW50IHlUb3BFbmMpOwotICB2b2lkIGFkZFJvd0NvbChpbnQgbnVtQ3V0Um93cywgaW50IG51bUN1dENvbHMpOwotICB2b2lkIGFkZE9yaWdpbihpbnQgeE9mZnNldCwgaW50IHlPZmZzZXQpOwotICB2b2lkIGFkZE9mZnNldChpbnQgeEJvdE9zLCBpbnQgeUJvdE9zLCBpbnQgeFRvcE9zLCBpbnQgeVRvcE9zKTsKLSAgdm9pZCBhZGRDdXRQYXR0ZXJuKGNoYXIqIGN1dFBhdHRlcm4pOwotICAKLSAgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBwYXR0ZXJuKCkgY29uc3Q7Ci0gIGludCBoYXNQYXR0ZXJuKCkgY29uc3Q7Ci0gIGludCBudW1MYXllcnMoKSBjb25zdDsKLSAgdm9pZCBsYXllcihpbnQgaW5kZXgsIGNoYXIqKiBsYXllciwgaW50KiB4bCwgaW50KiB5bCwgaW50KiB4aCwgaW50KiB5aCkgY29uc3Q7Ci0gIGludCBudW1Qb2x5Z29ucygpIGNvbnN0OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNgotICBjb25zdCBjaGFyKiBwb2x5Z29uTmFtZShpbnQgaW5kZXgpIGNvbnN0OyAgICAgICAvLyA1LjYKLSAgZGVmaVBvaW50cyBnZXRQb2x5Z29uKGludCBpbmRleCkgY29uc3Q7ICAvLyA1LjYKLSAgaW50IGhhc1ZpYVJ1bGUoKSBjb25zdDsKLSAgdm9pZCB2aWFSdWxlKGNoYXIqKiB2aWFSdWxlTmFtZSwgaW50KiB4U2l6ZSwgaW50KiB5U2l6ZSwgY2hhcioqIGJvdExheWVyLAotICAgICAgICAgICAgICAgY2hhcioqIGN1dExheWVyLCBjaGFyKiogdG9wTGF5ZXIsIGludCogeEN1dFNwYWNpbmcsCi0gICAgICAgICAgICAgICBpbnQqIHlDdXRTcGFjaW5nLCBpbnQqIHhCb3RFbmMsIGludCogeUJvdEVuYywgaW50KiB4VG9wRW5jLAotICAgICAgICAgICAgICAgaW50KiB5VG9wRW5jKSBjb25zdDsKLSAgaW50IGhhc1Jvd0NvbCgpIGNvbnN0OwotICB2b2lkIHJvd0NvbChpbnQqIG51bUN1dFJvd3MsIGludCogbnVtQ3V0Q29scykgY29uc3Q7Ci0gIGludCBoYXNPcmlnaW4oKSBjb25zdDsKLSAgdm9pZCBvcmlnaW4oaW50KiB4T2Zmc2V0LCBpbnQqIHlPZmZzZXQpIGNvbnN0OwotICBpbnQgaGFzT2Zmc2V0KCkgY29uc3Q7Ci0gIHZvaWQgb2Zmc2V0KGludCogeEJvdE9mZnNldCwgaW50KiB5Qm90T2Zmc2V0LCBpbnQqIHhUb3BPZmZzZXQsCi0gICAgICAgICAgICAgIGludCogeVRvcE9mZnNldCkgY29uc3Q7Ci0gIGludCBoYXNDdXRQYXR0ZXJuKCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIGN1dFBhdHRlcm4oKSBjb25zdDsKLSAgaW50IGhhc1JlY3RNYXNrKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCByZWN0TWFzayhpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgaGFzUG9seU1hc2soaW50IGluZGV4KSBjb25zdDsKLSAgaW50IHBvbHlNYXNrKGludCBpbmRleCkgY29uc3Q7Ci0KLSAgdm9pZCBwcmludChGSUxFKiBmKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICBjaGFyKiBuYW1lXzsKLSAgaW50IG5hbWVMZW5ndGhfOwotICBjaGFyKiBwYXR0ZXJuXzsKLSAgaW50IHBhdHRlcm5MZW5ndGhfOwotICBjaGFyKiogbGF5ZXJzXzsKLSAgaW50IGhhc1BhdHRlcm5fOwotICBpbnQqIHhsXzsKLSAgaW50KiB5bF87Ci0gIGludCogeGhfOwotICBpbnQqIHloXzsKLSAgaW50IGxheWVyc0xlbmd0aF87Ci0gIGludCBudW1MYXllcnNfOwotICBpbnQgbnVtUG9seXNfOyAgICAgICAgICAgIC8vIDUuNgotICBjaGFyKiogcG9seWdvbk5hbWVzXzsgICAgIC8vIDUuNiBsYXllck5hbWUgZm9yIFBPTFlHT04KLSAgaW50IHBvbHlzQWxsb2NhdGVkXzsgICAgICAvLyA1LjYKLSAgZGVmaVBvaW50cyoqIHBvbHlnb25zXzsgLy8gNS42Ci0gIGNoYXIqIHZpYVJ1bGVfOyAgICAgICAgICAgLy8gNS42Ci0gIGludCAgIHZpYVJ1bGVMZW5ndGhfOyAgICAgLy8gNS42Ci0gIGludCAgIGhhc1ZpYVJ1bGVfOyAgICAgICAgLy8gNS42Ci0gIGludCB4U2l6ZV87ICAgICAgICAgICAgICAgLy8gNS42Ci0gIGludCB5U2l6ZV87ICAgICAgICAgICAgICAgLy8gNS42Ci0gIGNoYXIqIGJvdExheWVyXzsgICAgICAgICAgLy8gNS42Ci0gIGNoYXIqIGN1dExheWVyXzsgICAgICAgICAgLy8gNS42Ci0gIGNoYXIqIHRvcExheWVyXzsgICAgICAgICAgLy8gNS42Ci0gIGludCAgIGJvdExheWVyTGVuZ3RoXzsgICAgLy8gNS42Ci0gIGludCAgIGN1dExheWVyTGVuZ3RoXzsgICAgLy8gNS42Ci0gIGludCAgIHRvcExheWVyTGVuZ3RoXzsgICAgLy8gNS42Ci0gIGludCAgIHhDdXRTcGFjaW5nXzsgICAgICAgLy8gNS42Ci0gIGludCAgIHlDdXRTcGFjaW5nXzsgICAgICAgLy8gNS42Ci0gIGludCAgIHhCb3RFbmNfOyAgICAgICAgICAgLy8gNS42Ci0gIGludCAgIHlCb3RFbmNfOyAgICAgICAgICAgLy8gNS42Ci0gIGludCAgIHhUb3BFbmNfOyAgICAgICAgICAgLy8gNS42Ci0gIGludCAgIHlUb3BFbmNfOyAgICAgICAgICAgLy8gNS42Ci0gIGludCAgIHJvd3NfOyAgICAgICAgICAgICAgLy8gNS42Ci0gIGludCAgIGNvbHNfOyAgICAgICAgICAgICAgLy8gNS42Ci0gIGludCAgIHhPZmZzZXRfOyAgICAgICAgICAgLy8gNS42Ci0gIGludCAgIHlPZmZzZXRfOyAgICAgICAgICAgLy8gNS42Ci0gIGludCAgIHhCb3RPZmZzZXRfOyAgICAgICAgLy8gNS42Ci0gIGludCAgIHlCb3RPZmZzZXRfOyAgICAgICAgLy8gNS42Ci0gIGludCAgIHhUb3BPZmZzZXRfOyAgICAgICAgLy8gNS42Ci0gIGludCAgIHlUb3BPZmZzZXRfOyAgICAgICAgLy8gNS42Ci0gIGNoYXIqIGN1dFBhdHRlcm5fOyAgICAgICAgLy8gNS42Ci0gIGludCAgIGN1dFBhdHRlcm5MZW5ndGhfOyAgLy8gNS42Ci0gIGludCAgIGhhc0N1dFBhdHRlcm5fOyAgICAgLy8gNS42Ci0gIGludCogIHJlY3RNYXNrXzsgICAgICAgICAgLy8gNS44Ci0gIGludCogIHBvbHlNYXNrXzsgICAgICAgICAgLy8gNS44Ci0gIAotICBkZWZyRGF0YSAqZGVmRGF0YTsKLX07Ci0KLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLVVTRV9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmckNhbGxCYWNrcy5ocHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZnJDYWxsQmFja3MuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTVhYTk5Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmckNhbGxCYWNrcy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMywgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpZm5kZWYgREVGUkNBTExCQUNLU19ICi0jZGVmaW5lIERFRlJDQUxMQkFDS1NfSCAxCi0KLSNpbmNsdWRlICJkZWZpS1JEZWZzLmhwcCIKLQotI2luY2x1ZGUgImRlZnJSZWFkZXIuaHBwIgotCi0jaW5jbHVkZSAiZGVmclJlYWRlci5ocHAiCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLWNsYXNzIGRlZnJDYWxsYmFja3MgewotcHVibGljOgotICAgIGRlZnJDYWxsYmFja3MoKTsKLQotICAgIHZvaWQgU2V0VW51c2VkQ2FsbGJhY2tzKGRlZnJWb2lkQ2JrRm5UeXBlIGYpOwotCi0gICAgZGVmclN0cmluZ0Nia0ZuVHlwZSBEZXNpZ25DYms7Ci0gICAgZGVmclN0cmluZ0Nia0ZuVHlwZSBUZWNobm9sb2d5Q2JrOwotICAgIGRlZnJWb2lkQ2JrRm5UeXBlIERlc2lnbkVuZENiazsKLSAgICBkZWZyUHJvcENia0ZuVHlwZSBQcm9wQ2JrOwotICAgIGRlZnJWb2lkQ2JrRm5UeXBlIFByb3BEZWZFbmRDYms7Ci0gICAgZGVmclZvaWRDYmtGblR5cGUgUHJvcERlZlN0YXJ0Q2JrOwotICAgIGRlZnJTdHJpbmdDYmtGblR5cGUgQXJyYXlOYW1lQ2JrOwotICAgIGRlZnJTdHJpbmdDYmtGblR5cGUgRmxvb3JQbGFuTmFtZUNiazsKLSAgICBkZWZyRG91YmxlQ2JrRm5UeXBlIFVuaXRzQ2JrOwotICAgIGRlZnJTdHJpbmdDYmtGblR5cGUgRGl2aWRlckNiazsKLSAgICBkZWZyU3RyaW5nQ2JrRm5UeXBlIEJ1c0JpdENiazsKLSAgICBkZWZyU2l0ZUNia0ZuVHlwZSBTaXRlQ2JrOwotICAgIGRlZnJTaXRlQ2JrRm5UeXBlIENhbnBsYWNlQ2JrOwotICAgIGRlZnJTaXRlQ2JrRm5UeXBlIENhbm5vdE9jY3VweUNiazsKLSAgICBkZWZySW50ZWdlckNia0ZuVHlwZSBDb21wb25lbnRTdGFydENiazsKLSAgICBkZWZyVm9pZENia0ZuVHlwZSBDb21wb25lbnRFbmRDYms7Ci0gICAgZGVmckNvbXBvbmVudENia0ZuVHlwZSBDb21wb25lbnRDYms7Ci0gICAgZGVmckNvbXBvbmVudE1hc2tTaGlmdExheWVyQ2JrRm5UeXBlIENvbXBvbmVudE1hc2tTaGlmdExheWVyQ2JrOwotICAgIGRlZnJJbnRlZ2VyQ2JrRm5UeXBlIE5ldFN0YXJ0Q2JrOwotICAgIGRlZnJWb2lkQ2JrRm5UeXBlIE5ldEVuZENiazsKLSAgICBkZWZyTmV0Q2JrRm5UeXBlIE5ldENiazsKLSAgICBkZWZyU3RyaW5nQ2JrRm5UeXBlIE5ldE5hbWVDYms7Ci0gICAgZGVmclN0cmluZ0Nia0ZuVHlwZSBOZXRTdWJuZXROYW1lQ2JrOwotICAgIGRlZnJTdHJpbmdDYmtGblR5cGUgTmV0Tm9uRGVmYXVsdFJ1bGVDYms7Ci0gICAgZGVmck5ldENia0ZuVHlwZSBOZXRQYXJ0aWFsUGF0aENiazsKLSAgICBkZWZyUGF0aENia0ZuVHlwZSBQYXRoQ2JrOwotICAgIGRlZnJEb3VibGVDYmtGblR5cGUgVmVyc2lvbkNiazsKLSAgICBkZWZyU3RyaW5nQ2JrRm5UeXBlIFZlcnNpb25TdHJDYms7Ci0gICAgZGVmclN0cmluZ0Nia0ZuVHlwZSBQaW5FeHRDYms7Ci0gICAgZGVmclN0cmluZ0Nia0ZuVHlwZSBDb21wb25lbnRFeHRDYms7Ci0gICAgZGVmclN0cmluZ0Nia0ZuVHlwZSBWaWFFeHRDYms7Ci0gICAgZGVmclN0cmluZ0Nia0ZuVHlwZSBOZXRDb25uZWN0aW9uRXh0Q2JrOwotICAgIGRlZnJTdHJpbmdDYmtGblR5cGUgTmV0RXh0Q2JrOwotICAgIGRlZnJTdHJpbmdDYmtGblR5cGUgR3JvdXBFeHRDYms7Ci0gICAgZGVmclN0cmluZ0Nia0ZuVHlwZSBTY2FuQ2hhaW5FeHRDYms7Ci0gICAgZGVmclN0cmluZ0Nia0ZuVHlwZSBJb1RpbWluZ3NFeHRDYms7Ci0gICAgZGVmclN0cmluZ0Nia0ZuVHlwZSBQYXJ0aXRpb25zRXh0Q2JrOwotICAgIGRlZnJTdHJpbmdDYmtGblR5cGUgSGlzdG9yeUNiazsKLSAgICBkZWZyQm94Q2JrRm5UeXBlIERpZUFyZWFDYms7Ci0gICAgZGVmclBpbkNhcENia0ZuVHlwZSBQaW5DYXBDYms7Ci0gICAgZGVmclBpbkNia0ZuVHlwZSBQaW5DYms7Ci0gICAgZGVmckludGVnZXJDYmtGblR5cGUgU3RhcnRQaW5zQ2JrOwotICAgIGRlZnJWb2lkQ2JrRm5UeXBlIFBpbkVuZENiazsKLSAgICBkZWZySW50ZWdlckNia0ZuVHlwZSBEZWZhdWx0Q2FwQ2JrOwotICAgIGRlZnJSb3dDYmtGblR5cGUgUm93Q2JrOwotICAgIGRlZnJUcmFja0Nia0ZuVHlwZSBUcmFja0NiazsKLSAgICBkZWZyR2NlbGxHcmlkQ2JrRm5UeXBlIEdjZWxsR3JpZENiazsKLSAgICBkZWZySW50ZWdlckNia0ZuVHlwZSBWaWFTdGFydENiazsKLSAgICBkZWZyVm9pZENia0ZuVHlwZSBWaWFFbmRDYms7Ci0gICAgZGVmclZpYUNia0ZuVHlwZSBWaWFDYms7Ci0gICAgZGVmckludGVnZXJDYmtGblR5cGUgUmVnaW9uU3RhcnRDYms7Ci0gICAgZGVmclZvaWRDYmtGblR5cGUgUmVnaW9uRW5kQ2JrOwotICAgIGRlZnJSZWdpb25DYmtGblR5cGUgUmVnaW9uQ2JrOwotICAgIGRlZnJJbnRlZ2VyQ2JrRm5UeXBlIFNOZXRTdGFydENiazsKLSAgICBkZWZyVm9pZENia0ZuVHlwZSBTTmV0RW5kQ2JrOwotICAgIGRlZnJOZXRDYmtGblR5cGUgU05ldENiazsKLSAgICBkZWZyTmV0Q2JrRm5UeXBlIFNOZXRQYXJ0aWFsUGF0aENiazsKLSAgICBkZWZyTmV0Q2JrRm5UeXBlIFNOZXRXaXJlQ2JrOwotICAgIGRlZnJJbnRlZ2VyQ2JrRm5UeXBlIEdyb3Vwc1N0YXJ0Q2JrOwotICAgIGRlZnJWb2lkQ2JrRm5UeXBlIEdyb3Vwc0VuZENiazsKLSAgICBkZWZyU3RyaW5nQ2JrRm5UeXBlIEdyb3VwTmFtZUNiazsKLSAgICBkZWZyU3RyaW5nQ2JrRm5UeXBlIEdyb3VwTWVtYmVyQ2JrOwotICAgIGRlZnJHcm91cENia0ZuVHlwZSBHcm91cENiazsKLSAgICBkZWZySW50ZWdlckNia0ZuVHlwZSBBc3NlcnRpb25zU3RhcnRDYms7Ci0gICAgZGVmclZvaWRDYmtGblR5cGUgQXNzZXJ0aW9uc0VuZENiazsKLSAgICBkZWZyQXNzZXJ0aW9uQ2JrRm5UeXBlIEFzc2VydGlvbkNiazsKLSAgICBkZWZySW50ZWdlckNia0ZuVHlwZSBDb25zdHJhaW50c1N0YXJ0Q2JrOwotICAgIGRlZnJWb2lkQ2JrRm5UeXBlIENvbnN0cmFpbnRzRW5kQ2JrOwotICAgIGRlZnJBc3NlcnRpb25DYmtGblR5cGUgQ29uc3RyYWludENiazsKLSAgICBkZWZySW50ZWdlckNia0ZuVHlwZSBTY2FuY2hhaW5zU3RhcnRDYms7Ci0gICAgZGVmclZvaWRDYmtGblR5cGUgU2NhbmNoYWluc0VuZENiazsKLSAgICBkZWZyU2NhbmNoYWluQ2JrRm5UeXBlIFNjYW5jaGFpbkNiazsKLSAgICBkZWZySW50ZWdlckNia0ZuVHlwZSBJT1RpbWluZ3NTdGFydENiazsKLSAgICBkZWZyVm9pZENia0ZuVHlwZSBJT1RpbWluZ3NFbmRDYms7Ci0gICAgZGVmcklPVGltaW5nQ2JrRm5UeXBlIElPVGltaW5nQ2JrOwotICAgIGRlZnJJbnRlZ2VyQ2JrRm5UeXBlIEZQQ1N0YXJ0Q2JrOwotICAgIGRlZnJWb2lkQ2JrRm5UeXBlIEZQQ0VuZENiazsKLSAgICBkZWZyRlBDQ2JrRm5UeXBlIEZQQ0NiazsKLSAgICBkZWZySW50ZWdlckNia0ZuVHlwZSBUaW1pbmdEaXNhYmxlc1N0YXJ0Q2JrOwotICAgIGRlZnJWb2lkQ2JrRm5UeXBlIFRpbWluZ0Rpc2FibGVzRW5kQ2JrOwotICAgIGRlZnJUaW1pbmdEaXNhYmxlQ2JrRm5UeXBlIFRpbWluZ0Rpc2FibGVDYms7Ci0gICAgZGVmckludGVnZXJDYmtGblR5cGUgUGFydGl0aW9uc1N0YXJ0Q2JrOwotICAgIGRlZnJWb2lkQ2JrRm5UeXBlIFBhcnRpdGlvbnNFbmRDYms7Ci0gICAgZGVmclBhcnRpdGlvbkNia0ZuVHlwZSBQYXJ0aXRpb25DYms7Ci0gICAgZGVmckludGVnZXJDYmtGblR5cGUgUGluUHJvcFN0YXJ0Q2JrOwotICAgIGRlZnJWb2lkQ2JrRm5UeXBlIFBpblByb3BFbmRDYms7Ci0gICAgZGVmclBpblByb3BDYmtGblR5cGUgUGluUHJvcENiazsKLSAgICBkZWZySW50ZWdlckNia0ZuVHlwZSBDYXNlU2Vuc2l0aXZlQ2JrOwotICAgIGRlZnJJbnRlZ2VyQ2JrRm5UeXBlIEJsb2NrYWdlU3RhcnRDYms7Ci0gICAgZGVmclZvaWRDYmtGblR5cGUgQmxvY2thZ2VFbmRDYms7Ci0gICAgZGVmckJsb2NrYWdlQ2JrRm5UeXBlIEJsb2NrYWdlQ2JrOwotICAgIGRlZnJJbnRlZ2VyQ2JrRm5UeXBlIFNsb3RTdGFydENiazsKLSAgICBkZWZyVm9pZENia0ZuVHlwZSBTbG90RW5kQ2JrOwotICAgIGRlZnJTbG90Q2JrRm5UeXBlIFNsb3RDYms7Ci0gICAgZGVmckludGVnZXJDYmtGblR5cGUgRmlsbFN0YXJ0Q2JrOwotICAgIGRlZnJWb2lkQ2JrRm5UeXBlIEZpbGxFbmRDYms7Ci0gICAgZGVmckZpbGxDYmtGblR5cGUgRmlsbENiazsKLSAgICBkZWZySW50ZWdlckNia0ZuVHlwZSBOb25EZWZhdWx0U3RhcnRDYms7Ci0gICAgZGVmclZvaWRDYmtGblR5cGUgTm9uRGVmYXVsdEVuZENiazsKLSAgICBkZWZyTm9uRGVmYXVsdENia0ZuVHlwZSBOb25EZWZhdWx0Q2JrOwotICAgIGRlZnJJbnRlZ2VyQ2JrRm5UeXBlIFN0eWxlc1N0YXJ0Q2JrOwotICAgIGRlZnJWb2lkQ2JrRm5UeXBlIFN0eWxlc0VuZENiazsKLSAgICBkZWZyU3R5bGVzQ2JrRm5UeXBlIFN0eWxlc0NiazsKLSAgICBkZWZyU3RyaW5nQ2JrRm5UeXBlIEV4dGVuc2lvbkNiazsKLQotCi19OwotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotVVNFX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZyQ2FsbGJhY2tzLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmckNhbGxiYWNrcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MzBmYmEuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZyQ2FsbGJhY2tzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM1MSArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGFyYWtobWFuICQKLS8vICAkUmV2aXNpb246ICM1ICQKLS8vICAkRGF0ZTogMjAxMy8wMy8xMyAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpbmNsdWRlICJkZWZyQ2FsbEJhY2tzLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotZGVmckNhbGxiYWNrczo6ZGVmckNhbGxiYWNrcygpCi06IERlc2lnbkNiayhOVUxMKSwKLSAgVGVjaG5vbG9neUNiayhOVUxMKSwKLSAgRGVzaWduRW5kQ2JrKE5VTEwpLAotICBQcm9wQ2JrKE5VTEwpLAotICBQcm9wRGVmRW5kQ2JrKE5VTEwpLAotICBQcm9wRGVmU3RhcnRDYmsoTlVMTCksCi0gIEFycmF5TmFtZUNiayhOVUxMKSwKLSAgRmxvb3JQbGFuTmFtZUNiayhOVUxMKSwKLSAgVW5pdHNDYmsoTlVMTCksCi0gIERpdmlkZXJDYmsoTlVMTCksCi0gIEJ1c0JpdENiayhOVUxMKSwKLSAgU2l0ZUNiayhOVUxMKSwKLSAgQ2FucGxhY2VDYmsoTlVMTCksCi0gIENhbm5vdE9jY3VweUNiayhOVUxMKSwKLSAgQ29tcG9uZW50U3RhcnRDYmsoTlVMTCksCi0gIENvbXBvbmVudEVuZENiayhOVUxMKSwKLSAgQ29tcG9uZW50Q2JrKE5VTEwpLAotICBOZXRTdGFydENiayhOVUxMKSwKLSAgTmV0RW5kQ2JrKE5VTEwpLAotICBOZXRDYmsoTlVMTCksCi0gIE5ldE5hbWVDYmsoTlVMTCksCi0gIE5ldFN1Ym5ldE5hbWVDYmsoTlVMTCksCi0gIE5ldE5vbkRlZmF1bHRSdWxlQ2JrKE5VTEwpLAotICBOZXRQYXJ0aWFsUGF0aENiayhOVUxMKSwKLSAgUGF0aENiayhOVUxMKSwKLSAgVmVyc2lvbkNiayhOVUxMKSwKLSAgVmVyc2lvblN0ckNiayhOVUxMKSwKLSAgUGluRXh0Q2JrKE5VTEwpLAotICBDb21wb25lbnRFeHRDYmsoTlVMTCksCi0gIFZpYUV4dENiayhOVUxMKSwKLSAgTmV0Q29ubmVjdGlvbkV4dENiayhOVUxMKSwKLSAgTmV0RXh0Q2JrKE5VTEwpLAotICBHcm91cEV4dENiayhOVUxMKSwKLSAgU2NhbkNoYWluRXh0Q2JrKE5VTEwpLAotICBJb1RpbWluZ3NFeHRDYmsoTlVMTCksCi0gIFBhcnRpdGlvbnNFeHRDYmsoTlVMTCksCi0gIEhpc3RvcnlDYmsoTlVMTCksCi0gIERpZUFyZWFDYmsoTlVMTCksCi0gIFBpbkNhcENiayhOVUxMKSwKLSAgUGluQ2JrKE5VTEwpLAotICBTdGFydFBpbnNDYmsoTlVMTCksCi0gIFBpbkVuZENiayhOVUxMKSwKLSAgRGVmYXVsdENhcENiayhOVUxMKSwKLSAgUm93Q2JrKE5VTEwpLAotICBUcmFja0NiayhOVUxMKSwKLSAgR2NlbGxHcmlkQ2JrKE5VTEwpLAotICBWaWFTdGFydENiayhOVUxMKSwKLSAgVmlhRW5kQ2JrKE5VTEwpLAotICBWaWFDYmsoTlVMTCksCi0gIFJlZ2lvblN0YXJ0Q2JrKE5VTEwpLAotICBSZWdpb25FbmRDYmsoTlVMTCksCi0gIFJlZ2lvbkNiayhOVUxMKSwKLSAgU05ldFN0YXJ0Q2JrKE5VTEwpLAotICBTTmV0RW5kQ2JrKE5VTEwpLAotICBTTmV0Q2JrKE5VTEwpLAotICBTTmV0UGFydGlhbFBhdGhDYmsoTlVMTCksCi0gIFNOZXRXaXJlQ2JrKE5VTEwpLAotICBHcm91cHNTdGFydENiayhOVUxMKSwKLSAgR3JvdXBzRW5kQ2JrKE5VTEwpLAotICBHcm91cE5hbWVDYmsoTlVMTCksCi0gIEdyb3VwTWVtYmVyQ2JrKE5VTEwpLAotICBDb21wb25lbnRNYXNrU2hpZnRMYXllckNiayhOVUxMKSwKLSAgR3JvdXBDYmsoTlVMTCksCi0gIEFzc2VydGlvbnNTdGFydENiayhOVUxMKSwKLSAgQXNzZXJ0aW9uc0VuZENiayhOVUxMKSwKLSAgQXNzZXJ0aW9uQ2JrKE5VTEwpLAotICBDb25zdHJhaW50c1N0YXJ0Q2JrKE5VTEwpLAotICBDb25zdHJhaW50c0VuZENiayhOVUxMKSwKLSAgQ29uc3RyYWludENiayhOVUxMKSwKLSAgU2NhbmNoYWluc1N0YXJ0Q2JrKE5VTEwpLAotICBTY2FuY2hhaW5zRW5kQ2JrKE5VTEwpLAotICBTY2FuY2hhaW5DYmsoTlVMTCksCi0gIElPVGltaW5nc1N0YXJ0Q2JrKE5VTEwpLAotICBJT1RpbWluZ3NFbmRDYmsoTlVMTCksCi0gIElPVGltaW5nQ2JrKE5VTEwpLAotICBGUENTdGFydENiayhOVUxMKSwKLSAgRlBDRW5kQ2JrKE5VTEwpLAotICBGUENDYmsoTlVMTCksCi0gIFRpbWluZ0Rpc2FibGVzU3RhcnRDYmsoTlVMTCksCi0gIFRpbWluZ0Rpc2FibGVzRW5kQ2JrKE5VTEwpLAotICBUaW1pbmdEaXNhYmxlQ2JrKE5VTEwpLAotICBQYXJ0aXRpb25zU3RhcnRDYmsoTlVMTCksCi0gIFBhcnRpdGlvbnNFbmRDYmsoTlVMTCksCi0gIFBhcnRpdGlvbkNiayhOVUxMKSwKLSAgUGluUHJvcFN0YXJ0Q2JrKE5VTEwpLAotICBQaW5Qcm9wRW5kQ2JrKE5VTEwpLAotICBQaW5Qcm9wQ2JrKE5VTEwpLAotICBDYXNlU2Vuc2l0aXZlQ2JrKE5VTEwpLAotICBCbG9ja2FnZVN0YXJ0Q2JrKE5VTEwpLAotICBCbG9ja2FnZUVuZENiayhOVUxMKSwKLSAgQmxvY2thZ2VDYmsoTlVMTCksCi0gIFNsb3RTdGFydENiayhOVUxMKSwKLSAgU2xvdEVuZENiayhOVUxMKSwKLSAgU2xvdENiayhOVUxMKSwKLSAgRmlsbFN0YXJ0Q2JrKE5VTEwpLAotICBGaWxsRW5kQ2JrKE5VTEwpLAotICBGaWxsQ2JrKE5VTEwpLAotICBOb25EZWZhdWx0U3RhcnRDYmsoTlVMTCksCi0gIE5vbkRlZmF1bHRFbmRDYmsoTlVMTCksCi0gIE5vbkRlZmF1bHRDYmsoTlVMTCksCi0gIFN0eWxlc1N0YXJ0Q2JrKE5VTEwpLAotICBTdHlsZXNFbmRDYmsoTlVMTCksCi0gIFN0eWxlc0NiayhOVUxMKSwKLSAgRXh0ZW5zaW9uQ2JrKE5VTEwpCi17Ci19Ci0KLQotdm9pZAotZGVmckNhbGxiYWNrczo6U2V0VW51c2VkQ2FsbGJhY2tzKGRlZnJWb2lkQ2JrRm5UeXBlIGYpCi17Ci0gICAgaWYgKCFEZXNpZ25DYmspCi0gICAgICAgIERlc2lnbkNiayA9IChkZWZyU3RyaW5nQ2JrRm5UeXBlKSBmOwotICAgIGlmICghVGVjaG5vbG9neUNiaykKLSAgICAgICAgVGVjaG5vbG9neUNiayA9IChkZWZyU3RyaW5nQ2JrRm5UeXBlKSBmOwotICAgIGlmICghRGVzaWduRW5kQ2JrKQotICAgICAgICBEZXNpZ25FbmRDYmsgPSAoZGVmclZvaWRDYmtGblR5cGUpIGY7Ci0gICAgaWYgKCFQcm9wQ2JrKQotICAgICAgICBQcm9wQ2JrID0gKGRlZnJQcm9wQ2JrRm5UeXBlKSBmOwotICAgIGlmICghUHJvcERlZkVuZENiaykKLSAgICAgICAgUHJvcERlZkVuZENiayA9IChkZWZyVm9pZENia0ZuVHlwZSkgZjsKLSAgICBpZiAoIVByb3BEZWZTdGFydENiaykKLSAgICAgICAgUHJvcERlZlN0YXJ0Q2JrID0gKGRlZnJWb2lkQ2JrRm5UeXBlKSBmOwotICAgIGlmICghQXJyYXlOYW1lQ2JrKQotICAgICAgICBBcnJheU5hbWVDYmsgPSAoZGVmclN0cmluZ0Nia0ZuVHlwZSkgZjsKLSAgICBpZiAoIUZsb29yUGxhbk5hbWVDYmspCi0gICAgICAgIEZsb29yUGxhbk5hbWVDYmsgPSAoZGVmclN0cmluZ0Nia0ZuVHlwZSkgZjsKLSAgICBpZiAoIVVuaXRzQ2JrKQotICAgICAgICBVbml0c0NiayA9IChkZWZyRG91YmxlQ2JrRm5UeXBlKSBmOwotICAgIGlmICghRGl2aWRlckNiaykKLSAgICAgICAgRGl2aWRlckNiayA9IChkZWZyU3RyaW5nQ2JrRm5UeXBlKSBmOwotICAgIGlmICghQnVzQml0Q2JrKQotICAgICAgICBCdXNCaXRDYmsgPSAoZGVmclN0cmluZ0Nia0ZuVHlwZSkgZjsKLSAgICBpZiAoIVNpdGVDYmspCi0gICAgICAgIFNpdGVDYmsgPSAoZGVmclNpdGVDYmtGblR5cGUpIGY7Ci0gICAgaWYgKCFDYW5wbGFjZUNiaykKLSAgICAgICAgQ2FucGxhY2VDYmsgPSAoZGVmclNpdGVDYmtGblR5cGUpIGY7Ci0gICAgaWYgKCFDYW5ub3RPY2N1cHlDYmspCi0gICAgICAgIENhbm5vdE9jY3VweUNiayA9IChkZWZyU2l0ZUNia0ZuVHlwZSkgZjsKLSAgICBpZiAoIUNvbXBvbmVudFN0YXJ0Q2JrKQotICAgICAgICBDb21wb25lbnRTdGFydENiayA9IChkZWZySW50ZWdlckNia0ZuVHlwZSkgZjsKLSAgICBpZiAoIUNvbXBvbmVudEVuZENiaykKLSAgICAgICAgQ29tcG9uZW50RW5kQ2JrID0gKGRlZnJWb2lkQ2JrRm5UeXBlKSBmOwotICAgIGlmICghQ29tcG9uZW50Q2JrKQotICAgICAgICBDb21wb25lbnRDYmsgPSAoZGVmckNvbXBvbmVudENia0ZuVHlwZSkgZjsKLSAgICBpZiAoIU5ldFN0YXJ0Q2JrKQotICAgICAgICBOZXRTdGFydENiayA9IChkZWZySW50ZWdlckNia0ZuVHlwZSkgZjsKLSAgICBpZiAoIU5ldEVuZENiaykKLSAgICAgICAgTmV0RW5kQ2JrID0gKGRlZnJWb2lkQ2JrRm5UeXBlKSBmOwotICAgIGlmICghTmV0Q2JrKQotICAgICAgICBOZXRDYmsgPSAoZGVmck5ldENia0ZuVHlwZSkgZjsKLSAgICAvLyAgaWYgKCEgZGVmck5ldFBhcnRpYWxQYXRoQ2JrKSBkZWZyTmV0UGFydGlhbFBhdGhDYmsgPSAoZGVmck5ldENia0ZuVHlwZSlmOwotICAgIGlmICghUGF0aENiaykKLSAgICAgICAgUGF0aENiayA9IChkZWZyUGF0aENia0ZuVHlwZSkgZjsKLSAgICBpZiAoKCFWZXJzaW9uQ2JrKSAmJiAoIVZlcnNpb25TdHJDYmspKSB7Ci0gICAgICAgIC8vIGJvdGggdmVyc2lvbiBjYWxsYmFja3Mgd2VyZW4ndCBzZXQsIGlmIGVpdGhlciBvbmUgaXMgc2V0LCBpdCBpcyBvawotICAgICAgICBWZXJzaW9uQ2JrID0gKGRlZnJEb3VibGVDYmtGblR5cGUpIGY7Ci0gICAgICAgIFZlcnNpb25TdHJDYmsgPSAoZGVmclN0cmluZ0Nia0ZuVHlwZSkgZjsKLSAgICB9Ci0gICAgaWYgKCFQaW5FeHRDYmspCi0gICAgICAgIFBpbkV4dENiayA9IChkZWZyU3RyaW5nQ2JrRm5UeXBlKSBmOwotICAgIGlmICghQ29tcG9uZW50RXh0Q2JrKQotICAgICAgICBDb21wb25lbnRFeHRDYmsgPSAoZGVmclN0cmluZ0Nia0ZuVHlwZSkgZjsKLSAgICBpZiAoIVZpYUV4dENiaykKLSAgICAgICAgVmlhRXh0Q2JrID0gKGRlZnJTdHJpbmdDYmtGblR5cGUpIGY7Ci0gICAgaWYgKCFOZXRDb25uZWN0aW9uRXh0Q2JrKQotICAgICAgICBOZXRDb25uZWN0aW9uRXh0Q2JrID0gKGRlZnJTdHJpbmdDYmtGblR5cGUpIGY7Ci0gICAgaWYgKCFOZXRFeHRDYmspCi0gICAgICAgIE5ldEV4dENiayA9IChkZWZyU3RyaW5nQ2JrRm5UeXBlKSBmOwotICAgIGlmICghR3JvdXBFeHRDYmspCi0gICAgICAgIEdyb3VwRXh0Q2JrID0gKGRlZnJTdHJpbmdDYmtGblR5cGUpIGY7Ci0gICAgaWYgKCFTY2FuQ2hhaW5FeHRDYmspCi0gICAgICAgIFNjYW5DaGFpbkV4dENiayA9IChkZWZyU3RyaW5nQ2JrRm5UeXBlKSBmOwotICAgIGlmICghSW9UaW1pbmdzRXh0Q2JrKQotICAgICAgICBJb1RpbWluZ3NFeHRDYmsgPSAoZGVmclN0cmluZ0Nia0ZuVHlwZSkgZjsKLSAgICBpZiAoIVBhcnRpdGlvbnNFeHRDYmspCi0gICAgICAgIFBhcnRpdGlvbnNFeHRDYmsgPSAoZGVmclN0cmluZ0Nia0ZuVHlwZSkgZjsKLSAgICBpZiAoIUhpc3RvcnlDYmspCi0gICAgICAgIEhpc3RvcnlDYmsgPSAoZGVmclN0cmluZ0Nia0ZuVHlwZSkgZjsKLSAgICBpZiAoIURpZUFyZWFDYmspCi0gICAgICAgIERpZUFyZWFDYmsgPSAoZGVmckJveENia0ZuVHlwZSkgZjsKLSAgICBpZiAoIVBpbkNhcENiaykKLSAgICAgICAgUGluQ2FwQ2JrID0gKGRlZnJQaW5DYXBDYmtGblR5cGUpIGY7Ci0gICAgaWYgKCFQaW5DYmspCi0gICAgICAgIFBpbkNiayA9IChkZWZyUGluQ2JrRm5UeXBlKSBmOwotICAgIGlmICghU3RhcnRQaW5zQ2JrKQotICAgICAgICBTdGFydFBpbnNDYmsgPSAoZGVmckludGVnZXJDYmtGblR5cGUpIGY7Ci0gICAgaWYgKCFQaW5FbmRDYmspCi0gICAgICAgIFBpbkVuZENiayA9IChkZWZyVm9pZENia0ZuVHlwZSkgZjsKLSAgICBpZiAoIURlZmF1bHRDYXBDYmspCi0gICAgICAgIERlZmF1bHRDYXBDYmsgPSAoZGVmckludGVnZXJDYmtGblR5cGUpIGY7Ci0gICAgaWYgKCFSb3dDYmspCi0gICAgICAgIFJvd0NiayA9IChkZWZyUm93Q2JrRm5UeXBlKSBmOwotICAgIGlmICghVHJhY2tDYmspCi0gICAgICAgIFRyYWNrQ2JrID0gKGRlZnJUcmFja0Nia0ZuVHlwZSkgZjsKLSAgICBpZiAoIUdjZWxsR3JpZENiaykKLSAgICAgICAgR2NlbGxHcmlkQ2JrID0gKGRlZnJHY2VsbEdyaWRDYmtGblR5cGUpIGY7Ci0gICAgaWYgKCFWaWFTdGFydENiaykKLSAgICAgICAgVmlhU3RhcnRDYmsgPSAoZGVmckludGVnZXJDYmtGblR5cGUpIGY7Ci0gICAgaWYgKCFWaWFFbmRDYmspCi0gICAgICAgIFZpYUVuZENiayA9IChkZWZyVm9pZENia0ZuVHlwZSkgZjsKLSAgICBpZiAoIVZpYUNiaykKLSAgICAgICAgVmlhQ2JrID0gKGRlZnJWaWFDYmtGblR5cGUpIGY7Ci0gICAgaWYgKCFSZWdpb25TdGFydENiaykKLSAgICAgICAgUmVnaW9uU3RhcnRDYmsgPSAoZGVmckludGVnZXJDYmtGblR5cGUpIGY7Ci0gICAgaWYgKCFSZWdpb25FbmRDYmspCi0gICAgICAgIFJlZ2lvbkVuZENiayA9IChkZWZyVm9pZENia0ZuVHlwZSkgZjsKLSAgICBpZiAoIVJlZ2lvbkNiaykKLSAgICAgICAgUmVnaW9uQ2JrID0gKGRlZnJSZWdpb25DYmtGblR5cGUpIGY7Ci0gICAgaWYgKCFTTmV0U3RhcnRDYmspCi0gICAgICAgIFNOZXRTdGFydENiayA9IChkZWZySW50ZWdlckNia0ZuVHlwZSkgZjsKLSAgICBpZiAoIVNOZXRFbmRDYmspCi0gICAgICAgIFNOZXRFbmRDYmsgPSAoZGVmclZvaWRDYmtGblR5cGUpIGY7Ci0gICAgaWYgKCFTTmV0Q2JrKQotICAgICAgICBTTmV0Q2JrID0gKGRlZnJOZXRDYmtGblR5cGUpIGY7Ci0gICAgLy8gIGlmKCEgZGVmclNOZXRQYXJ0aWFsUGF0aENiaykgZGVmclNOZXRQYXJ0aWFsUGF0aENiayA9IChkZWZyTmV0Q2JrRm5UeXBlKWY7Ci0gICAgLy8gIGlmKCEgZGVmclNOZXRXaXJlQ2JrKSBkZWZyU05ldFdpcmVDYmsgPSAoZGVmck5ldENia0ZuVHlwZSlmOwotICAgIGlmICghR3JvdXBzU3RhcnRDYmspCi0gICAgICAgIEdyb3Vwc1N0YXJ0Q2JrID0gKGRlZnJJbnRlZ2VyQ2JrRm5UeXBlKSBmOwotICAgIGlmICghR3JvdXBzRW5kQ2JrKQotICAgICAgICBHcm91cHNFbmRDYmsgPSAoZGVmclZvaWRDYmtGblR5cGUpIGY7Ci0gICAgaWYgKCFHcm91cE5hbWVDYmspCi0gICAgICAgIEdyb3VwTmFtZUNiayA9IChkZWZyU3RyaW5nQ2JrRm5UeXBlKSBmOwotICAgIGlmICghR3JvdXBNZW1iZXJDYmspCi0gICAgICAgIEdyb3VwTWVtYmVyQ2JrID0gKGRlZnJTdHJpbmdDYmtGblR5cGUpIGY7Ci0gICAgaWYgKCFDb21wb25lbnRNYXNrU2hpZnRMYXllckNiaykKLSAgICAgICAgQ29tcG9uZW50TWFza1NoaWZ0TGF5ZXJDYmsgPSAoZGVmckNvbXBvbmVudE1hc2tTaGlmdExheWVyQ2JrRm5UeXBlKSBmOwotICAgIGlmICghR3JvdXBDYmspCi0gICAgICAgIEdyb3VwQ2JrID0gKGRlZnJHcm91cENia0ZuVHlwZSkgZjsKLSAgICBpZiAoIUFzc2VydGlvbnNTdGFydENiaykKLSAgICAgICAgQXNzZXJ0aW9uc1N0YXJ0Q2JrID0gKGRlZnJJbnRlZ2VyQ2JrRm5UeXBlKSBmOwotICAgIGlmICghQXNzZXJ0aW9uc0VuZENiaykKLSAgICAgICAgQXNzZXJ0aW9uc0VuZENiayA9IChkZWZyVm9pZENia0ZuVHlwZSkgZjsKLSAgICBpZiAoIUFzc2VydGlvbkNiaykKLSAgICAgICAgQXNzZXJ0aW9uQ2JrID0gKGRlZnJBc3NlcnRpb25DYmtGblR5cGUpIGY7Ci0gICAgaWYgKCFDb25zdHJhaW50c1N0YXJ0Q2JrKQotICAgICAgICBDb25zdHJhaW50c1N0YXJ0Q2JrID0gKGRlZnJJbnRlZ2VyQ2JrRm5UeXBlKSBmOwotICAgIGlmICghQ29uc3RyYWludHNFbmRDYmspCi0gICAgICAgIENvbnN0cmFpbnRzRW5kQ2JrID0gKGRlZnJWb2lkQ2JrRm5UeXBlKSBmOwotICAgIGlmICghQ29uc3RyYWludENiaykKLSAgICAgICAgQ29uc3RyYWludENiayA9IChkZWZyQXNzZXJ0aW9uQ2JrRm5UeXBlKSBmOwotICAgIGlmICghU2NhbmNoYWluc1N0YXJ0Q2JrKQotICAgICAgICBTY2FuY2hhaW5zU3RhcnRDYmsgPSAoZGVmckludGVnZXJDYmtGblR5cGUpIGY7Ci0gICAgaWYgKCFTY2FuY2hhaW5zRW5kQ2JrKQotICAgICAgICBTY2FuY2hhaW5zRW5kQ2JrID0gKGRlZnJWb2lkQ2JrRm5UeXBlKSBmOwotICAgIGlmICghU2NhbmNoYWluQ2JrKQotICAgICAgICBTY2FuY2hhaW5DYmsgPSAoZGVmclNjYW5jaGFpbkNia0ZuVHlwZSkgZjsKLSAgICBpZiAoIUlPVGltaW5nc1N0YXJ0Q2JrKQotICAgICAgICBJT1RpbWluZ3NTdGFydENiayA9IChkZWZySW50ZWdlckNia0ZuVHlwZSkgZjsKLSAgICBpZiAoIUlPVGltaW5nc0VuZENiaykKLSAgICAgICAgSU9UaW1pbmdzRW5kQ2JrID0gKGRlZnJWb2lkQ2JrRm5UeXBlKSBmOwotICAgIGlmICghSU9UaW1pbmdDYmspCi0gICAgICAgIElPVGltaW5nQ2JrID0gKGRlZnJJT1RpbWluZ0Nia0ZuVHlwZSkgZjsKLSAgICBpZiAoIUZQQ1N0YXJ0Q2JrKQotICAgICAgICBGUENTdGFydENiayA9IChkZWZySW50ZWdlckNia0ZuVHlwZSkgZjsKLSAgICBpZiAoIUZQQ0VuZENiaykKLSAgICAgICAgRlBDRW5kQ2JrID0gKGRlZnJWb2lkQ2JrRm5UeXBlKSBmOwotICAgIGlmICghRlBDQ2JrKQotICAgICAgICBGUENDYmsgPSAoZGVmckZQQ0Nia0ZuVHlwZSkgZjsKLSAgICBpZiAoIVRpbWluZ0Rpc2FibGVzU3RhcnRDYmspCi0gICAgICAgIFRpbWluZ0Rpc2FibGVzU3RhcnRDYmsgPSAoZGVmckludGVnZXJDYmtGblR5cGUpIGY7Ci0gICAgaWYgKCFUaW1pbmdEaXNhYmxlc0VuZENiaykKLSAgICAgICAgVGltaW5nRGlzYWJsZXNFbmRDYmsgPSAoZGVmclZvaWRDYmtGblR5cGUpIGY7Ci0gICAgaWYgKCFUaW1pbmdEaXNhYmxlQ2JrKQotICAgICAgICBUaW1pbmdEaXNhYmxlQ2JrID0gKGRlZnJUaW1pbmdEaXNhYmxlQ2JrRm5UeXBlKSBmOwotICAgIGlmICghUGFydGl0aW9uc1N0YXJ0Q2JrKQotICAgICAgICBQYXJ0aXRpb25zU3RhcnRDYmsgPSAoZGVmckludGVnZXJDYmtGblR5cGUpIGY7Ci0gICAgaWYgKCFQYXJ0aXRpb25zRW5kQ2JrKQotICAgICAgICBQYXJ0aXRpb25zRW5kQ2JrID0gKGRlZnJWb2lkQ2JrRm5UeXBlKSBmOwotICAgIGlmICghUGFydGl0aW9uQ2JrKQotICAgICAgICBQYXJ0aXRpb25DYmsgPSAoZGVmclBhcnRpdGlvbkNia0ZuVHlwZSkgZjsKLSAgICBpZiAoIVBpblByb3BTdGFydENiaykKLSAgICAgICAgUGluUHJvcFN0YXJ0Q2JrID0gKGRlZnJJbnRlZ2VyQ2JrRm5UeXBlKSBmOwotICAgIGlmICghUGluUHJvcEVuZENiaykKLSAgICAgICAgUGluUHJvcEVuZENiayA9IChkZWZyVm9pZENia0ZuVHlwZSkgZjsKLSAgICBpZiAoIVBpblByb3BDYmspCi0gICAgICAgIFBpblByb3BDYmsgPSAoZGVmclBpblByb3BDYmtGblR5cGUpIGY7Ci0gICAgaWYgKCFDYXNlU2Vuc2l0aXZlQ2JrKQotICAgICAgICBDYXNlU2Vuc2l0aXZlQ2JrID0gKGRlZnJJbnRlZ2VyQ2JrRm5UeXBlKSBmOwotICAgIGlmICghQmxvY2thZ2VTdGFydENiaykKLSAgICAgICAgQmxvY2thZ2VTdGFydENiayA9IChkZWZySW50ZWdlckNia0ZuVHlwZSkgZjsKLSAgICBpZiAoIUJsb2NrYWdlRW5kQ2JrKQotICAgICAgICBCbG9ja2FnZUVuZENiayA9IChkZWZyVm9pZENia0ZuVHlwZSkgZjsKLSAgICBpZiAoIUJsb2NrYWdlQ2JrKQotICAgICAgICBCbG9ja2FnZUNiayA9IChkZWZyQmxvY2thZ2VDYmtGblR5cGUpIGY7Ci0gICAgaWYgKCFTbG90U3RhcnRDYmspCi0gICAgICAgIFNsb3RTdGFydENiayA9IChkZWZySW50ZWdlckNia0ZuVHlwZSkgZjsKLSAgICBpZiAoIVNsb3RFbmRDYmspCi0gICAgICAgIFNsb3RFbmRDYmsgPSAoZGVmclZvaWRDYmtGblR5cGUpIGY7Ci0gICAgaWYgKCFTbG90Q2JrKQotICAgICAgICBTbG90Q2JrID0gKGRlZnJTbG90Q2JrRm5UeXBlKSBmOwotICAgIGlmICghRmlsbFN0YXJ0Q2JrKQotICAgICAgICBGaWxsU3RhcnRDYmsgPSAoZGVmckludGVnZXJDYmtGblR5cGUpIGY7Ci0gICAgaWYgKCFGaWxsRW5kQ2JrKQotICAgICAgICBGaWxsRW5kQ2JrID0gKGRlZnJWb2lkQ2JrRm5UeXBlKSBmOwotICAgIGlmICghRmlsbENiaykKLSAgICAgICAgRmlsbENiayA9IChkZWZyRmlsbENia0ZuVHlwZSkgZjsKLSAgICBpZiAoIU5vbkRlZmF1bHRTdGFydENiaykKLSAgICAgICAgTm9uRGVmYXVsdFN0YXJ0Q2JrID0gKGRlZnJJbnRlZ2VyQ2JrRm5UeXBlKSBmOwotICAgIGlmICghTm9uRGVmYXVsdEVuZENiaykKLSAgICAgICAgTm9uRGVmYXVsdEVuZENiayA9IChkZWZyVm9pZENia0ZuVHlwZSkgZjsKLSAgICBpZiAoIU5vbkRlZmF1bHRDYmspCi0gICAgICAgIE5vbkRlZmF1bHRDYmsgPSAoZGVmck5vbkRlZmF1bHRDYmtGblR5cGUpIGY7Ci0gICAgaWYgKCFTdHlsZXNTdGFydENiaykKLSAgICAgICAgU3R5bGVzU3RhcnRDYmsgPSAoZGVmckludGVnZXJDYmtGblR5cGUpIGY7Ci0gICAgaWYgKCFTdHlsZXNFbmRDYmspCi0gICAgICAgIFN0eWxlc0VuZENiayA9IChkZWZyVm9pZENia0ZuVHlwZSkgZjsKLSAgICBpZiAoIVN0eWxlc0NiaykKLSAgICAgICAgU3R5bGVzQ2JrID0gKGRlZnJTdHlsZXNDYmtGblR5cGUpIGY7Ci0gICAgaWYgKCFFeHRlbnNpb25DYmspCi0gICAgICAgIEV4dGVuc2lvbkNiayA9IChkZWZyU3RyaW5nQ2JrRm5UeXBlKSBmOwotCi0gICAgLyogTkVXIENBTExCQUNLIC0gRWFjaCBuZXcgY2FsbGJhY2sgbXVzdCBoYXZlIGFuIGVudHJ5IGhlcmUuICovCi19Ci0KLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZnJEYXRhLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmckRhdGEuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzUyNDVlLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmckRhdGEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTA2ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTMtMjAxNCwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBhcmFraG1hbiAkCi0vLyAgJFJldmlzaW9uOiAjNiAkCi0vLyAgJERhdGU6IDIwMTMvMDgvMDkgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiZGVmckRhdGEuaHBwIgotI2luY2x1ZGUgImRlZnJTZXR0aW5ncy5ocHAiCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLWRlZnJEYXRhOjpkZWZyRGF0YShjb25zdCBkZWZyQ2FsbGJhY2tzICpwQ2FsbGJhY2tzLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZnJTZXR0aW5ncyAgKnBTZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICBkZWZyU2Vzc2lvbiAgICAgICAgICpwU2Vzc2lvbikKLTogY2FsbGJhY2tzKHBDYWxsYmFja3MpLAotICBzZXR0aW5ncyhwU2V0dGluZ3MpLAotICBzZXNzaW9uKHBTZXNzaW9uKSwKLSAgU3VibmV0KDApLAotICBhT3hpZGUoMCksCi0gIGFzc2VydGlvbldhcm5pbmdzKDApLAotICBiaXRfaXNfa2V5d29yZCgwKSwKLSAgYml0c051bSgwKSwKLSAgYmxvY2thZ2VXYXJuaW5ncygwKSwKLSAgYnlfaXNfa2V5d29yZCgwKSwKLSAgY2FzZVNlbnNpdGl2ZVdhcm5pbmdzKDApLAotICBjaChOVUxMKSwKLSAgY29tcG9uZW50V2FybmluZ3MoMCksCi0gIGNvbnN0cmFpbnRXYXJuaW5ncygwKSwKLSAgY292ZXJfaXNfa2V5d29yZCgwKSwKLSAgZGVmSWdub3JlVmVyc2lvbigwKSwKLSAgZGVmSW52YWxpZENoYXIoMCksCi0gIGRlZk1zZyhOVUxMKSwKLSAgZGVmTXNnQ250KDU1MDApLAotICBkZWZNc2dQcmludGVkKDApLAotICBkZWZQcmludFRva2VucygwKSwKLSAgZGVmUHJvcERlZlR5cGUoJ1wwJyksCi0gIGRlZlJldFZhbCgwKSwKLSAgZGVmX3dhcm5pbmdzKDApLAotICBkZWZhdWx0Q2FwV2FybmluZ3MoMCksCi0gIGRlZnJMb2coMCksCi0gIGRvX2lzX2tleXdvcmQoMCksCi0gIGR1bWJfbW9kZSgwKSwKLSAgZXJyb3JzKDApLAotICBmaWxsV2FybmluZ3MoMCksCi0gIGZpcnN0X2J1ZmZlcigwKSwKLSAgZml4ZWRfaXNfa2V5d29yZCgwKSwKLSAgZ2NlbGxHcmlkV2FybmluZ3MoMCksCi0gIGhhc0Jsa0xheWVyQ29tcCgwKSwKLSAgaGFzQmxrTGF5ZXJTcGFjKDApLAotICBoYXNCbGtMYXllclR5cGVDb21wKDApLAotICBoYXNCbGtQbGFjZUNvbXAoMCksCi0gIGhhc0Jsa1BsYWNlVHlwZUNvbXAoMCksCi0gIGhhc0J1c0JpdCgwKSwKLSAgaGFzRGVzKDApLAotICBoYXNEaXZDaGFyKDApLAotICBoYXNEb1N0ZXAoMCksCi0gIGhhc05hbWVDYXNlKDApLAotICBoYXNPcGVuZWREZWZMb2dGaWxlKDApLAotICBoYXNQb3J0KDApLAotICBoYXNWZXIoMCksCi0gIGhhc0ZhdGFsRXJyb3IoMCksCi0gIGlPVGltaW5nV2FybmluZ3MoMCksCi0gIGlucHV0X2xldmVsKC0xKSwKLSAgbGFzdChOVUxMKSwKLSAgbWFnaWMoKGNoYXIqKW1hbGxvYygxKSksCi0gIG1hc2tfaXNfa2V5d29yZCgwKSwKLSAgbXVzdGpvaW5faXNfa2V5d29yZCgwKSwKLSAgbmFtZXNfY2FzZV9zZW5zaXRpdmUoMSksCi0gIG5lZWROUENiaygwKSwKLSAgbmVlZFNOUENiaygwKSwKLSAgbmV0T3NuZXQoMCksCi0gIG5ldFdhcm5pbmdzKDApLAotICBuZXdfaXNfa2V5d29yZCgwKSwKLSAgbmV4dChOVUxMKSwKLSAgbmxpbmVzKDEpLAotICBubF90b2tlbihGQUxTRSksCi0gIG5vX251bSgwKSwKLSAgbm9uRGVmYXVsdFdhcm5pbmdzKDApLAotICBub25kZWZfaXNfa2V5d29yZCgwKSwKLSAgbnRva2VucygwKSwKLSAgb3JpZW50X2lzX2tleXdvcmQoMCksCi0gIHBpbkV4dFdhcm5pbmdzKDApLAotICBwaW5XYXJuaW5ncygwKSwKLSAgcmVhbF9udW0oMCksCi0gIHJlY3RfaXNfa2V5d29yZCgwKSwKLSAgcmVnVHlwZURlZigwKSwKLSAgcmVnaW9uV2FybmluZ3MoMCksCi0gIHJpbmdQbGFjZSgwKSwKLSAgcm91dGVkX2lzX2tleXdvcmQoMCksCi0gIHJvd05hbWUoTlVMTCksCi0gIHJvd1dhcm5pbmdzKDApLAotICBzTmV0V2FybmluZ3MoMCksCi0gIHNhdmVfeCgwLjApLAotICBzYXZlX3koMC4wKSwKLSAgc2NhbmNoYWluV2FybmluZ3MoMCksCi0gIHNoaWVsZChGQUxTRSksCi0gIHNoaWVsZE5hbWUoTlVMTCksCi0gIHNoaWZ0QnVmKDApLAotICBzaGlmdEJ1Zkxlbmd0aCgwKSwKLSAgc3BlY2lhbFdpcmVfbWFzaygwKSwKLSAgc3RlcF9pc19rZXl3b3JkKDApLAotICBzdHlsZXNXYXJuaW5ncygwKSwKLSAgdHJhY2tXYXJuaW5ncygwKSwKLSAgdW5pdHNXYXJuaW5ncygwKSwKLSAgdmVyc2lvbldhcm5pbmdzKDApLAotICB2aWFSdWxlKDApLAotICB2aWFXYXJuaW5ncygwKSwKLSAgdmlydHVhbF9pc19rZXl3b3JkKDApLAotICBkZWZ0b2tlbkxlbmd0aChUT0tFTl9TSVpFKSwKLSAgd2FybmluZ01zZyhOVUxMKSwKLSAgc3BlY2lhbFdpcmVfcm91dGVTdGF0dXMoKGNoYXIqKSAiUk9VVEVEIiksCi0gIHNwZWNpYWxXaXJlX3JvdXRlU3RhdHVzTmFtZSgoY2hhciAqKSIiKSwKLSAgc3BlY2lhbFdpcmVfc2hhcGVUeXBlKChjaGFyKikiIiksCi0gIFZlcnNpb25OdW0oNS43KSwKLSAgeFN0ZXAoMCksCi0gIHlTdGVwKDApLAotICBsVmFsKDAuMCksCi0gIHJWYWwoMC4wKSwKLSAgLy8gZGVmclJlYWRlciB2YXJzCi0gIFBhdGhPYmoodGhpcyksCi0gIFByb3AodGhpcyksCi0gIFNpdGUodGhpcyksCi0gIENvbXBvbmVudCh0aGlzKSwKLSAgQ29tcG9uZW50TWFza1NoaWZ0TGF5ZXIodGhpcyksCi0gIE5ldCh0aGlzKSwKLSAgUGluQ2FwKCksCi0gIENhbm5vdE9jY3VweSh0aGlzKSwKLSAgQ2FucGxhY2UodGhpcyksCi0gIERpZUFyZWEoKSwKLSAgUGluKHRoaXMpLAotICBSb3codGhpcyksCi0gIFRyYWNrKHRoaXMpLAotICBHY2VsbEdyaWQodGhpcyksCi0gIFZpYSh0aGlzKSwKLSAgUmVnaW9uKHRoaXMpLAotICBHcm91cCh0aGlzKSwKLSAgQXNzZXJ0aW9uKHRoaXMpLAotICBTY2FuY2hhaW4odGhpcyksCi0gIElPVGltaW5nKHRoaXMpLAotICBGUEModGhpcyksCi0gIFRpbWluZ0Rpc2FibGUodGhpcyksCi0gIFBhcnRpdGlvbih0aGlzKSwKLSAgUGluUHJvcCh0aGlzKSwKLSAgQmxvY2thZ2UodGhpcyksCi0gIFNsb3QodGhpcyksCi0gIEZpbGwodGhpcyksCi0gIE5vbkRlZmF1bHQodGhpcyksCi0gIFN0eWxlcygpLAotICBHZW9tZXRyaWVzKHRoaXMpLAotICBkb25lRGVzaWduKDApLAotICBOZWVkUGF0aERhdGEoMCksCi0gIGRlZnRva2VuKChjaGFyKiltYWxsb2MoVE9LRU5fU0laRSkpLAotICB1Y190b2tlbigoY2hhciopbWFsbG9jKFRPS0VOX1NJWkUpKSwKLSAgcHZfZGVmdG9rZW4oKGNoYXIqKW1hbGxvYyhUT0tFTl9TSVpFKSksCi0gIEZpbGUoMCkKLXsKLSAgICBtYWdpY1swXSA9ICdcMCc7Ci0gICAgZGVmdG9rZW5bMF0gPSAnXDAnOwotICAgIEhpc3RvcnlfdGV4dC5wdXNoX2JhY2soJ1wwJyk7Ci0KLSAgICBtZW1zZXQobXNnTGltaXQsIDAsIERFRl9NU0dTICogc2l6ZW9mKGludCkpOwotICAgIG1lbXNldChidWZmZXIsIDAsIElOX0JVRl9TSVpFICogc2l6ZW9mKGNoYXIpKTsKLSAgICBtZW1zZXQocmluZywgMCwgUklOR19TSVpFICogc2l6ZW9mKGNoYXIqKSk7Ci0gICAgbWVtc2V0KHJpbmdTaXplcywgMCwgUklOR19TSVpFICogc2l6ZW9mKGludCkpOwotICAgIG1lbXNldChsaW5lQnVmZmVyLCAwLCBNU0dfU0laRSAqIHNpemVvZihjaGFyKSk7Ci0KLSAgICAvLyBpbml0UmluZ0J1ZmZlcgotICAgIGludCBpOwotICAgIHJpbmdQbGFjZSA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IFJJTkdfU0laRTsgaSsrKSB7Ci0gICAgICAgIHJpbmdbaV0gPSAoY2hhciopbWFsbG9jKFRPS0VOX1NJWkUpOwotICAgICAgICByaW5nU2l6ZXNbaV0gPSBUT0tFTl9TSVpFOwotICAgIH0KLQotICAgIG5saW5lcyA9IDE7Ci0gICAgbGFzdCA9IGJ1ZmZlci0xOwotICAgIG5leHQgPSBidWZmZXI7Ci0gICAgZmlyc3RfYnVmZmVyID0gMTsKLQotICAgIGxWYWwgPSBzdHJ0b2QoIi0yMTQ3NDgzNjQ4IiwgJmNoKTsKLSAgICByVmFsID0gc3RydG9kKCIyMTQ3NDgzNjQ3IiwgJmNoKTsKLX0KLQotCi1kZWZyRGF0YTo6fmRlZnJEYXRhKCkKLXsKLSAgICAvLyBsZXhfdW5faW5pdC4KLSAgICAvKiBDbG9zZSB0aGUgZmlsZSAqLwotICAgIGlmIChkZWZyTG9nKSB7Ci0gICAgICAgIGZjbG9zZShkZWZyTG9nKTsKLSAgICAgICAgZGVmckxvZyA9IDA7Ci0gICAgfQotCi0gICAgZnJlZShkZWZ0b2tlbik7Ci0gICAgZnJlZSh1Y190b2tlbik7Ci0gICAgZnJlZShwdl9kZWZ0b2tlbik7Ci0gICAgZnJlZShtYWdpYyk7Ci0KLSAgICAvLyBmcmVlUmluZ0J1ZmZlci4KLSAgICBpbnQgaTsKLQotICAgIHJpbmdQbGFjZSA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IFJJTkdfU0laRTsgaSsrKSB7Ci0gICAgICAgIGZyZWUocmluZ1tpXSk7Ci0gICAgfQotfQotCi12b2lkIAotZGVmckRhdGE6OmRlZmlFcnJvcihpbnQgY2hlY2ssIGludCBtc2dOdW0sIGNvbnN0IGNoYXIqIG1lc3MpIAotewotICAvKiBjaGVjayBpcyAxIGlmIHRoZSBjYWxsZXIgZnVuY3Rpb24gaGFzIGNoZWNrZWQgdG90YWxNc2dMaW1pdCwgZXRjLiAqLwotCi0gIGlmICghY2hlY2spIHsKLSAgICAgaWYgKChzZXR0aW5ncy0+dG90YWxEZWZNc2dMaW1pdCA+IDApICYmIChkZWZNc2dQcmludGVkID49IHNldHRpbmdzLT50b3RhbERlZk1zZ0xpbWl0KSkKLSAgICAgICAgcmV0dXJuOwotICAgICBpZiAoc2V0dGluZ3MtPk1zZ0xpbWl0W21zZ051bS01MDAwXSA+IDApIHsKLSAgICAgICAgaWYgKG1zZ0xpbWl0W21zZ051bS01MDAwXSA+PSBzZXR0aW5ncy0+TXNnTGltaXRbbXNnTnVtLTUwMDBdKQotICAgICAgICAgICByZXR1cm47ICAgIC8qb3ZlciB0aGUgbGltaXQqLwotICAgICAgICBtc2dMaW1pdFttc2dOdW0tNTAwMF0gPSBtc2dMaW1pdFttc2dOdW0tNTAwMF0gKyAxOwotICAgICB9Ci0gICAgIGRlZk1zZ1ByaW50ZWQrKzsKLSAgfQotCi0KLSAgaWYgKHNldHRpbmdzLT5Db250ZXh0RXJyb3JMb2dGdW5jdGlvbikgewotICAgICAgKCooc2V0dGluZ3MtPkNvbnRleHRFcnJvckxvZ0Z1bmN0aW9uKSkoc2Vzc2lvbi0+VXNlckRhdGEsIG1lc3MpOwotICB9IGVsc2UgaWYgKHNldHRpbmdzLT5FcnJvckxvZ0Z1bmN0aW9uKSB7Ci0gICAgKCooc2V0dGluZ3MtPkVycm9yTG9nRnVuY3Rpb24pKShtZXNzKTsKLSAgfSBlbHNlIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgbWVzcyk7Ci0gIH0KLX0KLQotY29uc3QgY2hhciogCi1kZWZyRGF0YTo6dXBwZXJDYXNlKGNvbnN0IGNoYXIqIHN0cikgCi17Ci0gICAgY29uc3Qgc3RhdGljIGNoYXIgZGVmaVNoaWZ0IFtdID0gewotICAgICAnXDAnLCAnXDAnLCAnXDAnLCAnXDAnLCAnXDAnLCAnXDAnLCAnXDAnLCAnXDAnLAotICAgICAnXDAnLCAnXDAnLCAnXDAnLCAnXDAnLCAnXDAnLCAnXDAnLCAnXDAnLCAnXDAnLAotICAgICAnXDAnLCAnXDAnLCAnXDAnLCAnXDAnLCAnXDAnLCAnXDAnLCAnXDAnLCAnXDAnLAotICAgICAnXDAnLCAnXDAnLCAnXDAnLCAnXDAnLCAnXDAnLCAnXDAnLCAnXDAnLCAnXDAnLAotICAgICAgJyAnLCAgJyEnLCAgJyInLCAgJyMnLCAgJyQnLCAgJyUnLCAgJyYnLCAnXCcnLCAKLSAgICAgICcoJywgICcpJywgICcqJywgICcrJywgICcsJywgICctJywgICcuJywgICcvJywgCi0gICAgICAnMCcsICAnMScsICAnMicsICAnMycsICAnNCcsICAnNScsICAnNicsICAnNycsIAotICAgICAgJzgnLCAgJzknLCAgJzonLCAgJzsnLCAgJzwnLCAgJz0nLCAgJz4nLCAgJz8nLCAKLSAgICAgICdAJywgICdBJywgICdCJywgICdDJywgICdEJywgICdFJywgICdGJywgICdHJywgCi0gICAgICAnSCcsICAnSScsICAnSicsICAnSycsICAnTCcsICAnTScsICAnTicsICAnTycsIAotICAgICAgJ1AnLCAgJ1EnLCAgJ1InLCAgJ1MnLCAgJ1QnLCAgJ1UnLCAgJ1YnLCAgJ1cnLCAKLSAgICAgICdYJywgICdZJywgICdaJywgICdbJywgJ1xcJywgICddJywgICdeJywgICdfJywgCi0gICAgICAnYCcsICAnQScsICAnQicsICAnQycsICAnRCcsICAnRScsICAnRicsICAnRycsIAotICAgICAgJ0gnLCAgJ0knLCAgJ0onLCAgJ0snLCAgJ2wnLCAgJ00nLCAgJ04nLCAgJ08nLCAKLSAgICAgICdQJywgICdRJywgICdSJywgICdTJywgICdUJywgICdVJywgICdWJywgICdXJywgCi0gICAgICAnWCcsICAnWScsICAnWicsICAneycsICAnfCcsICAnfScsICAnficsICdcMCcsCi0gICAgICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsCi0gICAgICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsCi0gICAgICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsCi0gICAgICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsCi0gICAgICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsCi0gICAgICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsCi0gICAgICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsCi0gICAgICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsCi0gICAgICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsCi0gICAgICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsCi0gICAgICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsCi0gICAgICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsCi0gICAgICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsCi0gICAgICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsCi0gICAgICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsCi0gICAgICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcsICdcMCcKLSAgICB9OwotCi0gIGNoYXIqIHBsYWNlID0gKGNoYXIqKXN0cjsKLSAgY2hhciogdG87Ci0gIGludCBsZW4gPSBzdHJsZW4oc3RyKSArIDE7Ci0KLSAgaWYgKGxlbiA+IHNoaWZ0QnVmTGVuZ3RoKSB7Ci0gICAgaWYgKHNoaWZ0QnVmID09IDApIHsKLSAgICAgIGxlbiA9IGxlbiA8IDY0ID8gNjQgOiBsZW47Ci0gICAgICBzaGlmdEJ1ZiA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgICAgIHNoaWZ0QnVmTGVuZ3RoID0gbGVuOwotICAgIH0gZWxzZSB7Ci0gICAgICBmcmVlKHNoaWZ0QnVmKTsKLSAgICAgIHNoaWZ0QnVmID0gKGNoYXIqKW1hbGxvYyhsZW4pOwotICAgICAgc2hpZnRCdWZMZW5ndGggPSBsZW47Ci0gICAgfQotICB9Ci0KLSAgdG8gPSBzaGlmdEJ1ZjsKLSAgd2hpbGUgKCpwbGFjZSkgewotICAgICAgaW50IGkgPSAoaW50KSpwbGFjZTsKLSAgICAgIHBsYWNlKys7Ci0gICAgKnRvKysgPSBkZWZpU2hpZnRbaV07Ci0gIH0KLSAgKnRvID0gJ1wwJzsKLQotICByZXR1cm4gc2hpZnRCdWY7Ci19Ci0KLWludCAKLWRlZnJEYXRhOjp2YWxpZGF0ZU1hc2tJbnB1dChpbnQgaW5wdXQsIGludCB3YXJuaW5nSW5kZXgsIGludCBnZXRXYXJuaW5nc0luZGV4KSAKLXsKLSAgICBpZiAoVmVyc2lvbk51bSA8IDUuOCAmJiBpbnB1dCA+IDApIHsKLSAgICAgIGlmICh3YXJuaW5nSW5kZXgrKyA8IGdldFdhcm5pbmdzSW5kZXgpIHsKLSAgICAgICAgICBkZWZNc2cgPSAoY2hhciopbWFsbG9jKDEwMDApOwotICAgICAgICAgIHNwcmludGYgKGRlZk1zZywKLSAgICAgICAgICAgICAiVGhlIE1BU0sgc3RhdGVtZW50IGlzIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDUuOCBhbmQgbGF0ZXIuXG5Ib3dldmVyLCB5b3VyIERFRiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnIiwgVmVyc2lvbk51bSk7Ci0gICAgICAgICAgZGVmRXJyb3IoNzQxNSwgZGVmTXNnKTsKLSAgICAgICAgICBmcmVlKGRlZk1zZyk7Ci0gICAgICAgICAgaWYgKGNoZWNrRXJyb3JzKCkpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfSAgIAotICAgIAotICAgIHJldHVybiAxOyAKLX0KLQotaW50IAotZGVmckRhdGE6OnZhbGlkYXRlTWFza1NoaWZ0SW5wdXQoY29uc3QgY2hhciogc2hpZnRNYXNrLCBpbnQgd2FybmluZ0luZGV4LCBpbnQgZ2V0V2FybmluZ3NJbmRleCkgCi17Ci0gICAgaW50IHNoaWZ0TWFza0xlbmd0aCA9IHN0cmxlbihzaGlmdE1hc2spOwotICAgIGludCBoYXNTaGlmdERhdGEgPSAwOwotICAgIGludCBoYXNFcnJvciA9IDA7Ci0KLSAgICAvLyBWZXJpZmljYXRpb24gb2YgdGhlIG1hc2sgc3RyaW5nCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaGlmdE1hc2tMZW5ndGg7IGkrKykgewotICAgICAgICBpbnQgY3VyU2hpZnQgPSBzaGlmdE1hc2tbaV07Ci0gICAgICAgIAotICAgICAgICBpZiAoY3VyU2hpZnQgPCAnMCcgfHwgY3VyU2hpZnQgPiAnOScpIHsKLSAgICAgICAgICAgIGhhc0Vycm9yID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjdXJTaGlmdCA+ICcwJykgewotICAgICAgICAgICAgaGFzU2hpZnREYXRhID0gMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChoYXNFcnJvcikgewotICAgICAgICBjaGFyICptc2cgPSAoY2hhciopbWFsbG9jKDEwMDApOwotCi0gICAgICAgIHNwcmludGYobXNnLCAKLSAgICAgICAgICAgICAgICAiVGhlIE1BU0tTSElGVCB2YWx1ZSAnJXMnIGlzIG5vdCB2YWxpZC4gVGhlIHZhbHVlIHNob3VsZCBiZSBhIHN0cmluZyBjb25zaXN0aW5nIG9mIGRlY2ltYWwgZGlnaXRzICgnMCcgLSAnOScpLiIsIAotICAgICAgICAgICAgICAgIHNoaWZ0TWFzayk7Ci0gICAgICAgIGRlZkVycm9yKDc0MTYsIG1zZyk7Ci0gICAgICAgIGZyZWUobXNnKTsKLQotICAgICAgICBpZiAoY2hlY2tFcnJvcnMoKSkgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoVmVyc2lvbk51bSA8IDUuOCAmJiBoYXNTaGlmdERhdGEpIHsKLSAgICAgICAgaWYgKHdhcm5pbmdJbmRleCsrIDwgZ2V0V2FybmluZ3NJbmRleCkgewotICAgICAgICAgICAgY2hhciAqbXNnID0gKGNoYXIqKW1hbGxvYygxMDAwKTsKLQotICAgICAgICAgICAgc3ByaW50ZiAobXNnLCAKLSAgICAgICAgICAgICAgICAgICAgICJUaGUgTUFTS1NISUZUIHN0YXRlbWVudCBjYW4gYmUgdXNlZCBvbmx5IGluIERFRiB2ZXJzaW9uIDUuOCBhbmQgbGF0ZXIuIFRoaXMgREVGIGZpbGUgdmVyc2lvbiBpcyAnJWcnLiIsIAotICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbk51bSk7Ci0gICAgICAgICAgICBkZWZFcnJvcig3NDE3LCBtc2cpOwotICAgICAgICAgICAgZnJlZShtc2cpOyAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGNoZWNrRXJyb3JzKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICByZXR1cm4gMDsKLSAgICB9ICAgCi0gICAgCi0gICAgcmV0dXJuIDE7IAotfQotCi1kb3VibGUKLWRlZnJEYXRhOjpjb252ZXJ0X2RlZm5hbWUybnVtKGNoYXIgKnZlcnNpb25OYW1lKQotewotICAgIGNoYXIgbWFqb3JObVs4MF07Ci0gICAgY2hhciBtaW5vck5tWzgwXTsKLSAgICBjaGFyICpzdWJNaW5vck5tID0gTlVMTDsKLSAgICBjaGFyICp2ZXJzaW9uTm0gPSBzdHJkdXAodmVyc2lvbk5hbWUpOwotCi0gICAgZG91YmxlIG1ham9yID0gMCwgbWlub3IgPSAwLCBzdWJNaW5vciA9IDA7Ci0gICAgZG91YmxlIHZlcnNpb247Ci0KLSAgICBzc2NhbmYodmVyc2lvbk5tLCAiJVteLl0uJXMiLCBtYWpvck5tLCBtaW5vck5tKTsKLSAgICAKLSAgICBjaGFyICpwMSA9IHN0cmNocihtaW5vck5tLCAnLicpOwotICAgIGlmIChwMSkgewotICAgICAgIHN1Yk1pbm9yTm0gPSBwMSsxOwotICAgICAgICpwMSA9ICdcMCc7Ci0gICAgfQotICAgIG1ham9yID0gYXRvZihtYWpvck5tKTsKLSAgICBtaW5vciA9IGF0b2YobWlub3JObSk7Ci0gICAgaWYgKHN1Yk1pbm9yTm0pCi0gICAgICAgc3ViTWlub3IgPSBhdG9mKHN1Yk1pbm9yTm0pOwotCi0gICAgdmVyc2lvbiA9IG1ham9yOwotCi0gICAgaWYgKG1pbm9yID4gMCkKLSAgICAgICB2ZXJzaW9uID0gbWFqb3IgKyBtaW5vci8xMDsKLQotICAgIGlmIChzdWJNaW5vciA+IDApCi0gICAgICAgdmVyc2lvbiA9IHZlcnNpb24gKyBzdWJNaW5vci8xMDAwOwotCi0gICAgZnJlZSh2ZXJzaW9uTm0pOwotICAgIHJldHVybiB2ZXJzaW9uOwotfQotCi1pbnQKLWRlZnJEYXRhOjpudW1Jc0ludCAoY2hhciogdm9sdCkgewotICAgIGlmIChzdHJjaHIodm9sdCwgJy4nKSkgIC8vIGEgZmxvYXRpbmcgcG9pbnQKLSAgICAgICByZXR1cm4gMDsKLSAgICBlbHNlCi0gICAgICAgcmV0dXJuIDE7Ci19Ci0KLWludCAKLWRlZnJEYXRhOjpkZWZWYWxpZE51bShpbnQgdmFsdWVzKSB7Ci0gICAgY2hhciAqb3V0TXNnOwotICAgIHN3aXRjaCAodmFsdWVzKSB7Ci0gICAgICAgIGNhc2UgMTAwOgotICAgICAgICBjYXNlIDIwMDoKLSAgICAgICAgY2FzZSAxMDAwOgotICAgICAgICBjYXNlIDIwMDA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIGNhc2UgNDAwOgotICAgICAgICBjYXNlIDgwMDoKLSAgICAgICAgY2FzZSA0MDAwOgotICAgICAgICBjYXNlIDgwMDA6Ci0gICAgICAgIGNhc2UgMTAwMDA6Ci0gICAgICAgIGNhc2UgMjAwMDA6Ci0gICAgICAgICAgICAgaWYgKFZlcnNpb25OdW0gPCA1LjYpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tzLT5Vbml0c0NiaykgewotICAgICAgICAgICAgICAgICAgaWYgKHVuaXRzV2FybmluZ3MrKyA8IHNldHRpbmdzLT5Vbml0c1dhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dE1zZyA9IChjaGFyKiltYWxsb2MoMTAwMCk7Ci0gICAgICAgICAgICAgICAgICAgIHNwcmludGYgKG91dE1zZywKLSAgICAgICAgICAgICAgICAgICAgIkFuIGVycm9yIGhhcyBiZWVuIGZvdW5kIHdoaWxlIHByb2Nlc3NpbmcgdGhlIERFRiBmaWxlICclcydcblVuaXQgJWQgaXMgYSA1LjYgb3IgbGF0ZXIgc3ludGF4LiBEZWZpbmUgdGhlIERFRiBmaWxlIGFzIDUuNiBhbmQgdGhlbiB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+RmlsZU5hbWUsIHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgICAgIGRlZkVycm9yKDY1MDEsIG91dE1zZyk7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUob3V0TXNnKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgICB9Ci0gICAgfQotICAgIGlmIChjYWxsYmFja3MtPlVuaXRzQ2JrKSB7Ci0gICAgICBpZiAodW5pdHNXYXJuaW5ncysrIDwgc2V0dGluZ3MtPlVuaXRzV2FybmluZ3MpIHsKLSAgICAgICAgb3V0TXNnID0gKGNoYXIqKW1hbGxvYygxMDAwMCk7Ci0gICAgICAgIHNwcmludGYgKG91dE1zZywKLSAgICAgICAgICAiVGhlIHZhbHVlICVkIGRlZmluZWQgZm9yIERFRiBVTklUUyBESVNUQU5DRSBNSUNST04gaXMgaW52YWxpZFxuLiBUaGUgdmFsaWQgdmFsdWVzIGFyZSAxMDAsIDIwMCwgNDAwLCA4MDAsIDEwMDAsIDIwMDAsIDQwMDAsIDgwMDAsIDEwMDAwLCBvciAyMDAwMC4gU3BlY2lmeSBhIHZhbGlkIHZhbHVlIGFuZCB0aGVuIHRyeSBhZ2Fpbi4iLCB2YWx1ZXMpOwotICAgICAgICBkZWZFcnJvcig2NTAyLCBvdXRNc2cpOwotICAgICAgICBmcmVlKG91dE1zZyk7Ci0gICAgICAgIGlmIChjaGVja0Vycm9ycygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotZGVmckNvbnRleHQ6OmRlZnJDb250ZXh0KGludCBvd25Db25mKQotOiBjYWxsYmFja3MoMCksCi1zZXR0aW5ncygwKSwKLXNlc3Npb24oMCksCi1kYXRhKDApLAotb3duQ29uZmlnKG93bkNvbmYpLAotaW5pdF9jYWxsX2Z1bmMoMCkKLXsKLX0KLQotZGVmckNvbnRleHQgZGVmQ29udGV4dDsKLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZnJEYXRhLmhwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmckRhdGEuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTdmNWQxLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmckRhdGEuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTMgLSAyMDE1LCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGFyYWtobWFuICQKLS8vICAkUmV2aXNpb246ICM2ICQKLS8vICAkRGF0ZTogMjAxMy8wOC8wOSAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiZGVmclJlYWRlci5ocHAiCi0jaW5jbHVkZSAiZGVmckNhbGxCYWNrcy5ocHAiCi0jaW5jbHVkZSAiZGVmclNldHRpbmdzLmhwcCIKLQotI2lmbmRlZiBkZWZyRGF0YV9oCi0jZGVmaW5lIGRlZnJEYXRhX2gKLQotI2RlZmluZSBDVVJSRU5UX1ZFUlNJT04gNS44Ci0jZGVmaW5lIFJJTkdfU0laRSAxMAotI2RlZmluZSBJTl9CVUZfU0laRSAxNjM4NAotI2RlZmluZSBUT0tFTl9TSVpFIDQwOTYKLSNkZWZpbmUgTVNHX1NJWkUgMTAwCi0KLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotc3RydWN0IGRlZkNvbXBhcmVTdHJpbmdzIAotewotICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnN0cmluZyAmbGhzLCBjb25zdCBzdGQ6OnN0cmluZyAmcmhzKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBzdGQ6OnN0cmNtcChsaHMuY19zdHIoKSwgcmhzLmNfc3RyKCkpIDwgMDsKLSAgICB9Ci19OwotCi10eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgZGVmQ29tcGFyZVN0cmluZ3M+IGRlZkFsaWFzTWFwOwotdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIGRlZkNvbXBhcmVTdHJpbmdzPiBkZWZEZWZpbmVNYXA7Ci0KLXR5cGVkZWYgdW5pb24gewotICAgICAgICBkb3VibGUgZHZhbCA7Ci0gICAgICAgIGludCAgICBpbnRlZ2VyIDsKLSAgICAgICAgY2hhciAqIHN0cmluZyA7Ci0gICAgICAgIGludCAgICBrZXl3b3JkIDsgIC8vIHJlYWxseSBqdXN0IGEgbm9wIAotICAgICAgICBzdHJ1Y3QgZGVmcG9pbnQgcHQ7Ci0gICAgICAgIGRlZlRPS0VOICp0azsKLX0gWVlTVFlQRTsKLQotI2RlZmluZSBZWVNUWVBFX0lTX0RFQ0xBUkVECi0KLWNsYXNzIGRlZnJEYXRhIHsKLQotcHVibGljOgotICAgIGRlZnJEYXRhKGNvbnN0IGRlZnJDYWxsYmFja3MgKnBDYWxsYmFja3MsCi0gICAgICAgICAgICAgY29uc3QgZGVmclNldHRpbmdzICAqcFNldHRpbmdzLAotICAgICAgICAgICAgIGRlZnJTZXNzaW9uICAgICAgICAgKnBTZXNzaW9uKTsKLSAgICB+ZGVmckRhdGEoKTsKLQotICAgIGlubGluZSBpbnQgICAgICAgICAgZGVmR2V0S2V5d29yZChjb25zdCBjaGFyKiBuYW1lLCBpbnQgKnJlc3VsdCk7Ci0gICAgaW5saW5lIGludCAgICAgICAgICBkZWZHZXRBbGlhcyhjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgc3RkOjpzdHJpbmcgJnJlc3VsdCk7Ci0gICAgaW5saW5lIGludCAgICAgICAgICBkZWZHZXREZWZpbmUoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIHN0ZDo6c3RyaW5nICZyZXN1bHQpOwotICAgIHZvaWQgICAgICAgICAgICAgICAgcmVsb2FkX2J1ZmZlcigpOyAKLSAgICBpbnQgICAgICAgICAgICAgICAgIEdFVEMoKTsKLQotICAgIHZvaWQgICAgICAgICAgICAgICAgVU5HRVRDKGNoYXIgY2gpOwotICAgIGNoYXIqICAgICAgICAgICAgICAgcmluZ0NvcHkoY29uc3QgY2hhciogc3RyaW5nKTsKLSAgICBpbnQgICAgICAgICAgICAgICAgIERlZkdldFRva2VuRnJvbVN0YWNrKGNoYXIgKnMpOwotICAgIGlubGluZSB2b2lkICAgICAgICAgcHJpbnRfbGluZXMobG9uZyBsb25nIGxpbmVzKTsKLSAgICBjb25zdCBjaGFyICogICAgICAgIGxpbmVzMnN0cihsb25nIGxvbmcgbGluZXMpOwotICAgIHN0YXRpYyBpbmxpbmUgdm9pZCAgSW5jQ3VyUG9zKGNoYXIgKipjdXJQb3MsIGNoYXIgKipidWZmZXIsIGludCAqYnVmZmVyU2l6ZSk7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBEZWZHZXRUb2tlbihjaGFyICoqYnVmZmVyLCBpbnQgKmJ1ZmZlclNpemUpOwotICAgIHN0YXRpYyB2b2lkICAgICAgICAgdWNfYXJyYXkoY2hhciAqc291cmNlLCBjaGFyICpkZXN0KTsKLSAgICB2b2lkICAgICAgICAgICAgICAgIFN0b3JlQWxpYXMoKTsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGRlZnl5bGV4KFlZU1RZUEUgKnBZeWx2YWwpOwotICAgIGludCAgICAgICAgICAgICAgICAgc3VibGV4KFlZU1RZUEUgKnBZeWx2YWwpOwotICAgIGludCAgICAgICAgICAgICAgICAgYW1wZXJfbG9va3VwKFlZU1RZUEUgKnBZeWx2YWwsIGNoYXIgKnRrbik7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICBkZWZFcnJvcihpbnQgbXNnTnVtLCBjb25zdCBjaGFyICpzKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgIGRlZnl5ZXJyb3IoY29uc3QgY2hhciAqcyk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICBkZWZJbmZvKGludCBtc2dOdW0sIGNvbnN0IGNoYXIgKnMpOwotICAgIHZvaWQgICAgICAgICAgICAgICAgZGVmV2FybmluZyhpbnQgbXNnTnVtLCBjb25zdCBjaGFyICpzKTsKLQotICAgIHZvaWQgICAgICAgICAgICAgICAgZGVmaUVycm9yKGludCBjaGVjaywgaW50IG1zZ051bSwgY29uc3QgY2hhciogbWVzcyk7Ci0gICAgY29uc3QgY2hhciAgICAgICAgICAqREVGQ0FTRShjb25zdCBjaGFyKiBjaCk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICBwYXRoSXNEb25lKGludCBzaGllbGQsIGludCByZXNldCwgaW50IG5ldE9zbmV0LCBpbnQgKm5lZWRDYmspOwotICAgIGNvbnN0IGNoYXIgICAgICAgICAgKnVwcGVyQ2FzZShjb25zdCBjaGFyKiBzdHIpOwotCi0gICAgaW5saW5lIGludCAgICAgICAgICBjaGVja0Vycm9ycygpOwotICAgIGludCAgICAgICAgICAgICAgICAgdmFsaWRhdGVNYXNrSW5wdXQoaW50IGlucHV0LCBpbnQgd2FybmluZ0luZGV4LCBpbnQgZ2V0V2FybmluZ3NJbmRleCk7Ci0gICAgaW50ICAgICAgICAgICAgICAgICB2YWxpZGF0ZU1hc2tTaGlmdElucHV0KGNvbnN0IGNoYXIqIHNoaWZ0TWFzaywgaW50IHdhcm5pbmdJbmRleCwgaW50IGdldFdhcm5pbmdzSW5kZXgpOwotCi0gICAgc3RhdGljIGRvdWJsZSAgICAgICBjb252ZXJ0X2RlZm5hbWUybnVtKGNoYXIgKnZlcnNpb25OYW1lKTsKLQotICAgIHN0YXRpYyBpbnQgICAgICAgICAgbnVtSXNJbnQgKGNoYXIqIHZvbHQpOwotICAgIGludCAgICAgICAgICAgICAgICAgZGVmVmFsaWROdW0oaW50IHZhbHVlcyk7Ci0KLSAgICBpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgICAqZGVma3l3ZChpbnQgbnVtKTsKLQotICAgIEZJTEUqICBkZWZyTG9nOyAKLSAgICBjaGFyICAgZGVmUHJvcERlZlR5cGU7IC8vIHNhdmUgdGhlIGN1cnJlbnQgdHlwZSBvZiB0aGUgcHJvcGVydHkKLSAgICBjaGFyKiAgY2g7IAotICAgIGNoYXIqICBkZWZNc2c7IAotICAgIGNoYXIqICBkZWZ0b2tlbjsgCi0gICAgY2hhciogIHVjX3Rva2VuOwotICAgIGNoYXIqICBsYXN0OyAKLSAgICBjaGFyKiAgbWFnaWM7IAotICAgIGNoYXIqICBuZXh0OyAKLSAgICBjaGFyKiAgcHZfZGVmdG9rZW47IAotICAgIGNoYXIqICByb3dOYW1lOyAvLyB0byBob2xkIHRoZSByb3dOYW1lIGZvciBtZXNzYWdlCi0gICAgY2hhciogIHNoaWVsZE5hbWU7IC8vIHRvIGhvbGQgdGhlIHNoaWVsZE5ldE5hbWUKLSAgICBjaGFyKiAgc2hpZnRCdWY7IAotICAgIGNoYXIqICB3YXJuaW5nTXNnOyAKLSAgICBkb3VibGUgc2F2ZV94OyAKLSAgICBkb3VibGUgc2F2ZV95OyAKLSAgICBkb3VibGUgbFZhbDsKLSAgICBkb3VibGUgclZhbDsKLSAgICBpbnQgIGFPeGlkZTsgLy8ga2VlcCB0cmFjayBmb3Igb3hpZGUKLSAgICBpbnQgIGFzc2VydGlvbldhcm5pbmdzOyAKLSAgICBpbnQgIGJpdF9pc19rZXl3b3JkOyAKLSAgICBpbnQgIGJpdHNOdW07IC8vIFNjYW5jaGFpbiBCaXRzIHZhbHVlCi0gICAgaW50ICBibG9ja2FnZVdhcm5pbmdzOyAKLSAgICBpbnQgIGJ5X2lzX2tleXdvcmQ7IAotICAgIGludCAgY2FzZVNlbnNpdGl2ZVdhcm5pbmdzOyAKLSAgICBpbnQgIGNvbXBvbmVudFdhcm5pbmdzOyAKLSAgICBpbnQgIGNvbnN0cmFpbnRXYXJuaW5nczsgCi0gICAgaW50ICBjb3Zlcl9pc19rZXl3b3JkOyAKLSAgICBpbnQgIGRlZklnbm9yZVZlcnNpb247IC8vIGlnbm9yZSBjaGVja2luZyB2ZXJzaW9uIG51bWJlcgotICAgIGludCAgZGVmSW52YWxpZENoYXI7IAotICAgIGludCAgZGVmTXNnQ250OyAKLSAgICBpbnQgIGRlZk1zZ1ByaW50ZWQ7IC8vIG51bWJlciBvZiBtc2dzIG91dHB1dCBzbyBmYXIKLSAgICBpbnQgIGRlZlByaW50VG9rZW5zOyAKLSAgICBpbnQgIGRlZlJldFZhbDsgCi0gICAgaW50ICBkZWZfd2FybmluZ3M7IAotICAgIGludCAgZGVmYXVsdENhcFdhcm5pbmdzOyAKLSAgICBpbnQgIGRvX2lzX2tleXdvcmQ7IAotICAgIGludCAgZHVtYl9tb2RlOyAKLSAgICBpbnQgIGVycm9yczsgCi0gICAgaW50ICBmaWxsV2FybmluZ3M7IAotICAgIGludCAgZmlyc3RfYnVmZmVyOyAKLSAgICBpbnQgIGZpeGVkX2lzX2tleXdvcmQ7IAotICAgIGludCAgZ2NlbGxHcmlkV2FybmluZ3M7IAotICAgIGludCAgaGFzQmxrTGF5ZXJDb21wOyAvLyBvbmx5IDEgQkxPQ0tBR0UvTEFZRVIvQ09NUAotICAgIGludCAgaGFzQmxrTGF5ZXJTcGFjOyAvLyBvbmx5IDEgQkxPQ0tBR0UvTEFZRVIvU1BBQ0lORwotICAgIGludCAgaGFzQmxrTGF5ZXJUeXBlQ29tcDsgLy8gU0xPVFMgb3IgRklMTFMKLSAgICBpbnQgIGhhc0Jsa1BsYWNlQ29tcDsgLy8gb25seSAxIEJMT0NLQUdFL1BMQUNFTUVOVC9DT01QCi0gICAgaW50ICBoYXNCbGtQbGFjZVR5cGVDb21wOyAvLyBTT0ZUIG9yIFBBUlRJQUwKLSAgICBpbnQgIGhhc0J1c0JpdDsgLy8ga2VlcCB0cmFjayBCVVNCSVRDSEFSUyBpcyBpbiB0aGUgZmlsZQotICAgIGludCAgaGFzRGVzOyAvLyBrZWVwIHRyYWNrIERFU0lHTiBpcyBpbiB0aGUgZmlsZQotICAgIGludCAgaGFzRGl2Q2hhcjsgLy8ga2VlcCB0cmFjayBESVZJREVSQ0hBUiBpcyBpbiB0aGUgZmlsZQotICAgIGludCAgaGFzRG9TdGVwOyAKLSAgICBpbnQgIGhhc05hbWVDYXNlOyAvLyBrZWVwIHRyYWNrIE5BTUVTQ0FTRVNFTlNJVElWRSBpcyBpbiB0aGUgZmlsZQotICAgIGludCAgaGFzT3BlbmVkRGVmTG9nRmlsZTsgCi0gICAgaW50ICBoYXNQb3J0OyAvLyBrZWVwIHRyYWNrIGlzIHBvcnQgZGVmaW5lZCBpbiBhIFBpbgotICAgIGludCAgaGFzVmVyOyAvLyBrZWVwIHRyYWNrIFZFUlNJT04gaXMgaW4gdGhlIGZpbGUKLSAgICBpbnQgIGhhc0ZhdGFsRXJyb3I7IC8vIGRvbid0IHJlcG9ydCBlcnJvcnMgYWZ0ZXIgdGhlIGZpbGUgZW5kLgotICAgIGludCAgaU9UaW1pbmdXYXJuaW5nczsgCi0gICAgaW50ICBpbnB1dF9sZXZlbDsgCi0gICAgaW50ICBtYXNrX2lzX2tleXdvcmQ7IAotICAgIGludCAgbXVzdGpvaW5faXNfa2V5d29yZDsgCi0gICAgaW50ICBuYW1lc19jYXNlX3NlbnNpdGl2ZTsgLy8gYWx3YXlzIHRydWUgaW4gNS42Ci0gICAgaW50ICBuZWVkTlBDYms7IC8vIGlmIGNiayBmb3IgbmV0IHBhdGggaXMgbmVlZGVkCi0gICAgaW50ICBuZWVkU05QQ2JrOyAvLyBpZiBjYmsgZm9yIHNuZXQgcGF0aCBpcyBuZWVkZWQKLSAgICBpbnQgIG5ldE9zbmV0OyAvLyBuZXQgPSAxICYgc25ldCA9IDIKLSAgICBpbnQgIG5ldFdhcm5pbmdzOyAKLSAgICBpbnQgIG5ld19pc19rZXl3b3JkOyAKLSAgICBpbnQgIG5sX3Rva2VuOyAKLSAgICBpbnQgIG5vX251bTsgCi0gICAgaW50ICBub25EZWZhdWx0V2FybmluZ3M7IAotICAgIGludCAgbm9uZGVmX2lzX2tleXdvcmQ7IAotICAgIGludCAgbnRva2VuczsgCi0gICAgaW50ICBvcmllbnRfaXNfa2V5d29yZDsgCi0gICAgaW50ICBwaW5FeHRXYXJuaW5nczsgCi0gICAgaW50ICBwaW5XYXJuaW5nczsgCi0gICAgaW50ICByZWFsX251bTsgCi0gICAgaW50ICByZWN0X2lzX2tleXdvcmQ7IAotICAgIGludCAgcmVnVHlwZURlZjsgLy8ga2VlcCB0cmFjayB0aGF0IHJlZ2lvbiB0eXBlIGlzIGRlZmluZWQgCi0gICAgaW50ICByZWdpb25XYXJuaW5nczsgCi0gICAgaW50ICByaW5nUGxhY2U7IAotICAgIGludCAgcm91dGVkX2lzX2tleXdvcmQ7IAotICAgIGludCAgcm93V2FybmluZ3M7IAotICAgIGludCAgc05ldFdhcm5pbmdzOyAKLSAgICBpbnQgIHNjYW5jaGFpbldhcm5pbmdzOyAKLSAgICBpbnQgIHNoaWVsZDsgLy8gVG8gaWRlbnRpZnkgaWYgdGhlIHBhdGggaXMgc2hpZWxkIGZvciA1LjMKLSAgICBpbnQgIHNoaWZ0QnVmTGVuZ3RoOyAKLSAgICBpbnQgIHNwZWNpYWxXaXJlX21hc2s7IAotICAgIGludCAgc3RlcF9pc19rZXl3b3JkOyAKLSAgICBpbnQgIHN0eWxlc1dhcm5pbmdzOyAKLSAgICBpbnQgIHRyYWNrV2FybmluZ3M7IAotICAgIGludCAgdW5pdHNXYXJuaW5nczsgCi0gICAgaW50ICB2ZXJzaW9uV2FybmluZ3M7IAotICAgIGludCAgdmlhUnVsZTsgLy8ga2VlcCB0cmFjayB0aGUgdmlhcnVsZSBoYXMgY2FsbGVkIGZpcnN0Ci0gICAgaW50ICB2aWFXYXJuaW5nczsgCi0gICAgaW50ICB2aXJ0dWFsX2lzX2tleXdvcmQ7IAotICAgIGludCAgZGVmdG9rZW5MZW5ndGg7Ci0gICAgbG9uZyBsb25nIG5saW5lczsKLQotICAgIHN0ZDo6dmVjdG9yPGNoYXI+ICBIaXN0b3J5X3RleHQ7IAotICAgIGRlZkFsaWFzTWFwICAgICAgICBkZWZfYWxpYXNfc2V0OyAKLSAgICBkZWZEZWZpbmVNYXAgICAgICAgZGVmX2RlZmluZXNfc2V0OwotCi0gICAgY2hhciogIHNwZWNpYWxXaXJlX3JvdXRlU3RhdHVzOwotICAgIGNoYXIqICBzcGVjaWFsV2lyZV9yb3V0ZVN0YXR1c05hbWU7Ci0gICAgY2hhciogIHNwZWNpYWxXaXJlX3NoYXBlVHlwZTsKLSAgICBkb3VibGUgVmVyc2lvbk51bTsKLSAgICBkb3VibGUgeFN0ZXA7Ci0gICAgZG91YmxlIHlTdGVwOwotICAgICAgICAKLSAgICAvL2RlZnJQYXJzZXIgdmFycy4KLSAgICBkZWZpUGF0aCBQYXRoT2JqOwotICAgIGRlZmlQcm9wIFByb3A7Ci0gICAgZGVmaVNpdGUgU2l0ZTsKLSAgICBkZWZpQ29tcG9uZW50IENvbXBvbmVudDsKLSAgICBkZWZpQ29tcG9uZW50TWFza1NoaWZ0TGF5ZXIgQ29tcG9uZW50TWFza1NoaWZ0TGF5ZXI7Ci0gICAgZGVmaU5ldCBOZXQ7Ci0gICAgZGVmaVBpbkNhcCBQaW5DYXA7Ci0gICAgZGVmaVNpdGUgQ2Fubm90T2NjdXB5OwotICAgIGRlZmlTaXRlIENhbnBsYWNlOwotICAgIGRlZmlCb3ggRGllQXJlYTsKLSAgICBkZWZpUGluIFBpbjsKLSAgICBkZWZpUm93IFJvdzsKLSAgICBkZWZpVHJhY2sgVHJhY2s7Ci0gICAgZGVmaUdjZWxsR3JpZCBHY2VsbEdyaWQ7Ci0gICAgZGVmaVZpYSBWaWE7Ci0gICAgZGVmaVJlZ2lvbiBSZWdpb247Ci0gICAgZGVmaUdyb3VwIEdyb3VwOwotICAgIGRlZmlBc3NlcnRpb24gQXNzZXJ0aW9uOwotICAgIGRlZmlTY2FuY2hhaW4gU2NhbmNoYWluOwotICAgIGRlZmlJT1RpbWluZyBJT1RpbWluZzsKLSAgICBkZWZpRlBDIEZQQzsKLSAgICBkZWZpVGltaW5nRGlzYWJsZSBUaW1pbmdEaXNhYmxlOwotICAgIGRlZmlQYXJ0aXRpb24gUGFydGl0aW9uOwotICAgIGRlZmlQaW5Qcm9wIFBpblByb3A7Ci0gICAgZGVmaUJsb2NrYWdlIEJsb2NrYWdlOwotICAgIGRlZmlTbG90IFNsb3Q7Ci0gICAgZGVmaUZpbGwgRmlsbDsKLSAgICBkZWZpTm9uRGVmYXVsdCBOb25EZWZhdWx0OwotICAgIGRlZmlTdHlsZXMgU3R5bGVzOwotICAgIGRlZmlHZW9tZXRyaWVzIEdlb21ldHJpZXM7Ci0gICAgaW50IGRvbmVEZXNpZ247ICAgICAgLy8ga2VlcCB0cmFjayBpZiB0aGUgRGVzaWduIGlzIGRvbmUgcGFyc2luZwotICAgIAotICAgIC8vIEZsYWdzIHRvIGNvbnRyb2wgd2hhdCBoYXBwZW5zCi0gICAgaW50IE5lZWRQYXRoRGF0YTsKLQotICAgIGRlZmlTdWJuZXQqIFN1Ym5ldDsKLSAgICBpbnQgbXNnTGltaXRbREVGX01TR1NdOwotICAgIGNoYXIgYnVmZmVyW0lOX0JVRl9TSVpFXTsKLSAgICBjaGFyKiByaW5nW1JJTkdfU0laRV07Ci0gICAgaW50IHJpbmdTaXplc1tSSU5HX1NJWkVdOwotICAgIHN0ZDo6c3RyaW5nIHN0YWNrWzIwXTsgIC8qIHRoZSBzdGFjayBpdHNlbGYgKi8KLQotICAgIFlZU1RZUEUgeXlsdmFsOwotICAgIGNvbnN0IGRlZnJDYWxsYmFja3MgKmNhbGxiYWNrczsKLSAgICBjb25zdCBkZWZyU2V0dGluZ3MgICpzZXR0aW5nczsKLSAgICBkZWZyU2Vzc2lvbiAgICAgICAgICpzZXNzaW9uOwotICAgIGNoYXIgICAgICAgICAgICAgICAgbGluZUJ1ZmZlcltNU0dfU0laRV07Ci0KLSAgICBGSUxFKiBGaWxlOwotfTsKLQotY2xhc3MgZGVmckNvbnRleHQgewotcHVibGljOgotICAgIGRlZnJDb250ZXh0KGludCBvd25Db25mID0gMCk7Ci0KLSAgICBkZWZyU2V0dGluZ3MgICAgICAgICAgKnNldHRpbmdzOwotICAgIGRlZnJDYWxsYmFja3MgICAgICAgICAqY2FsbGJhY2tzOwotICAgIGRlZnJTZXNzaW9uICAgICAgICAgICAqc2Vzc2lvbjsKLSAgICBkZWZyRGF0YSAgICAgICAgICAgICAgKmRhdGE7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgIG93bkNvbmZpZzsKLSAgICBjb25zdCBjaGFyICAgICAgICAgICAgKmluaXRfY2FsbF9mdW5jOwotfTsKLQotaW50IAotZGVmckRhdGE6OmNoZWNrRXJyb3JzKCkKLXsKLSAgICBpZiAoZXJyb3JzID4gMjApIHsKLSAgICAgICAgZGVmRXJyb3IoNjAxMSwgIlRvbyBtYW55IHN5bnRheCBlcnJvcnMgaGF2ZSBiZWVuIHJlcG9ydGVkLiIpOyAKLSAgICAgICAgZXJyb3JzID0gMDsgCi0gICAgICAgIHJldHVybiAxOyAKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZnJSZWFkZXIuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZyUmVhZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUyNTU3Ni4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZnJSZWFkZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjUzOCArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEzIC0gMjAxNywgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBpY2Z0Y20gJAotLy8gICRSZXZpc2lvbjogIzIgJAotLy8gICREYXRlOiAyMDE3LzA2LzA3ICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2luY2x1ZGUgImRlZnJSZWFkZXIuaHBwIgotI2luY2x1ZGUgImRlZmlQcm9wLmhwcCIKLSNpbmNsdWRlICJkZWZpUHJvcFR5cGUuaHBwIgotI2luY2x1ZGUgImRlZnJDYWxsQmFja3MuaHBwIgotI2luY2x1ZGUgImRlZmlEZWJ1Zy5ocHAiCi0jaW5jbHVkZSAiZGVmaU1pc2MuaHBwIgotI2luY2x1ZGUgImRlZnJEYXRhLmhwcCIKLSNpbmNsdWRlICJkZWZyU2V0dGluZ3MuaHBwIgotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJsZXguaCIKLSNpbmNsdWRlICJkZWZpVXRpbC5ocHAiCi0jaW5jbHVkZSAiZGVmckNhbGxCYWNrcy5ocHAiCi0KLSNkZWZpbmUgTk9ERUZNU0cgNDAxMyAgICAgLy8gKDkwMTIgKyAxKSAtIDUwMDAsIGRlZiBtc2cgc3RhcnRzIGF0IDUwMDAKLQotIyBkZWZpbmUgREVGX0lOSVQgZGVmX2luaXQoX19GVU5DVElPTl9fKQotCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLWV4dGVybiBkZWZyQ29udGV4dCBkZWZDb250ZXh0OwotCi12b2lkCi1kZWZfaW5pdChjb25zdCBjaGFyICAqZnVuYykKLXsKLSAgICAvLyBOZWVkIGZvciBkZWJ1Z2dpbmcgY29uZmlnIHJlLW93bmluZzsKLSAgICBpZiAoZGVmQ29udGV4dC5vd25Db25maWcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotCi0gICAgaWYgKGRlZkNvbnRleHQuc2V0dGluZ3MgPT0gTlVMTCkgewotICAgICAgICBkZWZDb250ZXh0LnNldHRpbmdzID0gbmV3IGRlZnJTZXR0aW5ncygpOwotICAgICAgICBkZWZDb250ZXh0LmluaXRfY2FsbF9mdW5jID0gZnVuYzsKLSAgICB9Ci0KLSAgICBpZiAoZGVmQ29udGV4dC5jYWxsYmFja3MgPT0gTlVMTCkgewotICAgICAgICBkZWZDb250ZXh0LmNhbGxiYWNrcyA9IG5ldyBkZWZyQ2FsbGJhY2tzKCk7Ci0gICAgICAgIGRlZkNvbnRleHQuaW5pdF9jYWxsX2Z1bmMgPSBmdW5jOwotICAgIH0KLQotICAgIGlmIChkZWZDb250ZXh0LnNlc3Npb24gPT0gTlVMTCkgewotICAgICAgICBkZWZDb250ZXh0LnNlc3Npb24gPSBuZXcgZGVmclNlc3Npb24oKTsKLSAgICAgICAgZGVmQ29udGV4dC5pbml0X2NhbGxfZnVuYyA9IGZ1bmM7Ci0gICAgfQotfQotCi0KLWludAotZGVmckNvdW50VW51c2VkKGRlZnJDYWxsYmFja1R5cGVfZSAgZSwKLSAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICp2LAotICAgICAgICAgICAgICAgIGRlZmlVc2VyRGF0YSAgICAgICAgZCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBpbnQgaTsKLSAgICBpZiAoZGVmaURlYnVnKDIzKSkKLSAgICAgICAgcHJpbnRmKCJDb3VudCAlZCwgMHglcCwgMHglcFxuIiwgKGludCkgZSwgdiwgZCk7Ci0gICAgaSA9IChpbnQpIGU7Ci0gICAgaWYgKGkgPD0gMCB8fCBpID49IENCTUFYKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIGRlZkNvbnRleHQuc2V0dGluZ3MtPlVudXNlZENhbGxiYWNrc1tpXSArPSAxOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotY29uc3QgY2hhciAqCi10eXBlVG9TdHJpbmcoZGVmckNhbGxiYWNrVHlwZV9lIG51bSkKLXsKLSAgICBzd2l0Y2ggKChpbnQpIG51bSkgewotCi0gICAgY2FzZSBkZWZyVW5zcGVjaWZpZWRDYmtUeXBlOgotICAgICAgICByZXR1cm4gIlVuc3BlY2lmaWVkIjsKLSAgICBjYXNlIGRlZnJEZXNpZ25TdGFydENia1R5cGU6Ci0gICAgICAgIHJldHVybiAiRGVzaWduIFN0YXJ0IjsKLSAgICBjYXNlIGRlZnJUZWNoTmFtZUNia1R5cGU6Ci0gICAgICAgIHJldHVybiAiVGVjaCBOYW1lIjsKLSAgICBjYXNlIGRlZnJQcm9wQ2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJQcm9wZXJ0eSI7Ci0gICAgY2FzZSBkZWZyUHJvcERlZkVuZENia1R5cGU6Ci0gICAgICAgIHJldHVybiAiUHJvcGVydHkgRGVmaW5pdGlvbnMgU2VjdGlvbiBFbmQiOwotICAgIGNhc2UgZGVmclByb3BEZWZTdGFydENia1R5cGU6Ci0gICAgICAgIHJldHVybiAiUHJvcGVydHkgRGVmaW5pdGlvbnMgU2VjdGlvbiBTdGFydCI7Ci0gICAgY2FzZSBkZWZyRmxvb3JQbGFuTmFtZUNia1R5cGU6Ci0gICAgICAgIHJldHVybiAiRmxvb3JQbGFuTmFtZSI7Ci0gICAgY2FzZSBkZWZyQXJyYXlOYW1lQ2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJBcnJheSBOYW1lIjsKLSAgICBjYXNlIGRlZnJVbml0c0Nia1R5cGU6Ci0gICAgICAgIHJldHVybiAiVW5pdHMiOwotICAgIGNhc2UgZGVmckRpdmlkZXJDYmtUeXBlOgotICAgICAgICByZXR1cm4gIkRpdmlkZXIiOwotICAgIGNhc2UgZGVmckJ1c0JpdENia1R5cGU6Ci0gICAgICAgIHJldHVybiAiQnVzQml0IENoYXJhY3RlciI7Ci0gICAgY2FzZSBkZWZyU2l0ZUNia1R5cGU6Ci0gICAgICAgIHJldHVybiAiU2l0ZSI7Ci0gICAgY2FzZSBkZWZyQ29tcG9uZW50TWFza1NoaWZ0TGF5ZXJDYmtUeXBlOgotICAgICAgICByZXR1cm4gIkNvbXBvbmVudE1hc2tTaGlmdExheWVyIjsKLSAgICBjYXNlIGRlZnJDb21wb25lbnRTdGFydENia1R5cGU6Ci0gICAgICAgIHJldHVybiAiQ29tcG9uZW50cyBTZWN0aW9uIFN0YXJ0IjsKLSAgICBjYXNlIGRlZnJDb21wb25lbnRDYmtUeXBlOgotICAgICAgICByZXR1cm4gIkNvbXBvbmVudCI7Ci0gICAgY2FzZSBkZWZyQ29tcG9uZW50RW5kQ2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJDb21wb25lbnRzIFNlY3Rpb24gRW5kIjsKLSAgICBjYXNlIGRlZnJOZXRTdGFydENia1R5cGU6Ci0gICAgICAgIHJldHVybiAiTmV0cyBTZWN0aW9uIFN0YXJ0IjsKLSAgICBjYXNlIGRlZnJOZXRDYmtUeXBlOgotICAgICAgICByZXR1cm4gIk5ldCI7Ci0gICAgY2FzZSBkZWZyTmV0TmFtZUNia1R5cGU6Ci0gICAgICAgIHJldHVybiAiTmV0IE5hbWUiOwotICAgIGNhc2UgZGVmck5ldE5vbkRlZmF1bHRSdWxlQ2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJOZXQgTm9uZGVmYXVsdHJ1bGUiOwotICAgIGNhc2UgZGVmck5ldFN1Ym5ldE5hbWVDYmtUeXBlOgotICAgICAgICByZXR1cm4gIk5ldCBTdWJuZXQgTmFtZSI7Ci0gICAgY2FzZSBkZWZyTmV0RW5kQ2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJOZXRzIFNlY3Rpb24gRW5kIjsKLSAgICBjYXNlIGRlZnJQYXRoQ2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJQYXRoIjsKLSAgICBjYXNlIGRlZnJWZXJzaW9uQ2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJWZXJzaW9uIjsKLSAgICBjYXNlIGRlZnJWZXJzaW9uU3RyQ2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJWZXJzaW9uIjsKLSAgICBjYXNlIGRlZnJDb21wb25lbnRFeHRDYmtUeXBlOgotICAgICAgICByZXR1cm4gIkNvbXBvbmVudCBVc2VyIEV4dGVudGlvbiI7Ci0gICAgY2FzZSBkZWZyUGluRXh0Q2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJQaW4gVXNlciBFeHRlbnNpb24iOwotICAgIGNhc2UgZGVmclZpYUV4dENia1R5cGU6Ci0gICAgICAgIHJldHVybiAiVmlhIFVzZXIgRXh0ZW5zaW9uIjsKLSAgICBjYXNlIGRlZnJOZXRDb25uZWN0aW9uRXh0Q2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJOZXRDb25uZWN0aW9uIFVzZXIgRXh0ZW50aW9uIjsKLSAgICBjYXNlIGRlZnJOZXRFeHRDYmtUeXBlOgotICAgICAgICByZXR1cm4gIk5ldCBVc2VyIEV4dGVuc2lvbiI7Ci0gICAgY2FzZSBkZWZyR3JvdXBFeHRDYmtUeXBlOgotICAgICAgICByZXR1cm4gIkdyb3VwIFVzZXIgRXh0ZW5zaW9uIjsKLSAgICBjYXNlIGRlZnJTY2FuQ2hhaW5FeHRDYmtUeXBlOgotICAgICAgICByZXR1cm4gIlNjYW5DaGFpbiBVc2VyIEV4dGVuc2lvbiI7Ci0gICAgY2FzZSBkZWZySW9UaW1pbmdzRXh0Q2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJJb1RpbWluZ3MgVXNlciBFeHRlbnNpb24iOwotICAgIGNhc2UgZGVmclBhcnRpdGlvbnNFeHRDYmtUeXBlOgotICAgICAgICByZXR1cm4gIlBhcnRpdGlvbnMgVXNlciBFeHRlbnNpb24iOwotICAgIGNhc2UgZGVmckhpc3RvcnlDYmtUeXBlOgotICAgICAgICByZXR1cm4gIkhpc3RvcnkiOwotICAgIGNhc2UgZGVmckRpZUFyZWFDYmtUeXBlOgotICAgICAgICByZXR1cm4gIkRpZUFyZWEiOwotICAgIGNhc2UgZGVmckNhbnBsYWNlQ2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJDYW5wbGFjZSI7Ci0gICAgY2FzZSBkZWZyQ2Fubm90T2NjdXB5Q2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJDYW5ub3RPY2N1cHkiOwotICAgIGNhc2UgZGVmclBpbkNhcENia1R5cGU6Ci0gICAgICAgIHJldHVybiAiUGluQ2FwIjsKLSAgICBjYXNlIGRlZnJEZWZhdWx0Q2FwQ2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJEZWZhdWx0Q2FwIjsKLSAgICBjYXNlIGRlZnJTdGFydFBpbnNDYmtUeXBlOgotICAgICAgICByZXR1cm4gIlN0YXJ0IFBpbnMgU2VjdGlvbiI7Ci0gICAgY2FzZSBkZWZyUGluQ2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJQaW4iOwotICAgIGNhc2UgZGVmclBpbkVuZENia1R5cGU6Ci0gICAgICAgIHJldHVybiAiRW5kIFBpbnMgU2VjdGlvbiI7Ci0gICAgY2FzZSBkZWZyUm93Q2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJSb3ciOwotICAgIGNhc2UgZGVmclRyYWNrQ2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJUcmFjayI7Ci0gICAgY2FzZSBkZWZyR2NlbGxHcmlkQ2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJHY2VsbEdyaWQiOwotICAgIGNhc2UgZGVmclZpYVN0YXJ0Q2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJTdGFydCBWaWFzIFNlY3Rpb24iOwotICAgIGNhc2UgZGVmclZpYUNia1R5cGU6Ci0gICAgICAgIHJldHVybiAiVmlhIjsKLSAgICBjYXNlIGRlZnJWaWFFbmRDYmtUeXBlOgotICAgICAgICByZXR1cm4gIkVuZCBWaWFzIFNlY3Rpb24iOwotICAgIGNhc2UgZGVmclJlZ2lvblN0YXJ0Q2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJSZWdpb24gU2VjdGlvbiBTdGFydCI7Ci0gICAgY2FzZSBkZWZyUmVnaW9uQ2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJSZWdpb24iOwotICAgIGNhc2UgZGVmclJlZ2lvbkVuZENia1R5cGU6Ci0gICAgICAgIHJldHVybiAiUmVnaW9uIFNlY3Rpb24gRW5kIjsKLSAgICBjYXNlIGRlZnJTTmV0U3RhcnRDYmtUeXBlOgotICAgICAgICByZXR1cm4gIlNwZWNpYWwgTmV0IFNlY3Rpb24gU3RhcnQiOwotICAgIGNhc2UgZGVmclNOZXRDYmtUeXBlOgotICAgICAgICByZXR1cm4gIlNwZWNpYWwgTmV0IjsKLSAgICBjYXNlIGRlZnJTTmV0RW5kQ2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJTcGVjaWFsIE5ldCBTZWN0aW9uIEVuZCI7Ci0gICAgY2FzZSBkZWZyR3JvdXBzU3RhcnRDYmtUeXBlOgotICAgICAgICByZXR1cm4gIkdyb3VwcyBTZWN0aW9uIFN0YXJ0IjsKLSAgICBjYXNlIGRlZnJHcm91cE5hbWVDYmtUeXBlOgotICAgICAgICByZXR1cm4gIkdyb3VwIE5hbWUiOwotICAgIGNhc2UgZGVmckdyb3VwTWVtYmVyQ2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJHcm91cCBNZW1iZXIiOwotICAgIGNhc2UgZGVmckdyb3VwQ2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJHcm91cCI7Ci0gICAgY2FzZSBkZWZyR3JvdXBzRW5kQ2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJHcm91cHMgU2VjdGlvbiBFbmQiOwotICAgIGNhc2UgZGVmckFzc2VydGlvbnNTdGFydENia1R5cGU6Ci0gICAgICAgIHJldHVybiAiQXNzZXJ0aW9ucyBTZWN0aW9uIFN0YXJ0IjsKLSAgICBjYXNlIGRlZnJBc3NlcnRpb25DYmtUeXBlOgotICAgICAgICByZXR1cm4gIkFzc2VydGlvbiI7Ci0gICAgY2FzZSBkZWZyQXNzZXJ0aW9uc0VuZENia1R5cGU6Ci0gICAgICAgIHJldHVybiAiQXNzZXJ0aW9ucyBTZWN0aW9uIEVuZCI7Ci0gICAgY2FzZSBkZWZyQ29uc3RyYWludHNTdGFydENia1R5cGU6Ci0gICAgICAgIHJldHVybiAiQ29uc3RyYWludHMgU2VjdGlvbiBTdGFydCI7Ci0gICAgY2FzZSBkZWZyQ29uc3RyYWludENia1R5cGU6Ci0gICAgICAgIHJldHVybiAiQ29uc3RyYWludCI7Ci0gICAgY2FzZSBkZWZyQ29uc3RyYWludHNFbmRDYmtUeXBlOgotICAgICAgICByZXR1cm4gIkNvbnN0cmFpbnRzIFNlY3Rpb24gRW5kIjsKLSAgICBjYXNlIGRlZnJTY2FuY2hhaW5zU3RhcnRDYmtUeXBlOgotICAgICAgICByZXR1cm4gIlNjYW5jaGFpbnMgU2VjdGlvbiBTdGFydCI7Ci0gICAgY2FzZSBkZWZyU2NhbmNoYWluQ2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJTY2FuY2hhaW4iOwotICAgIGNhc2UgZGVmclNjYW5jaGFpbnNFbmRDYmtUeXBlOgotICAgICAgICByZXR1cm4gIlNjYW5jaGFpbnMgU2VjdGlvbiBFbmQiOwotICAgIGNhc2UgZGVmcklPVGltaW5nc1N0YXJ0Q2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJJT1RpbWluZ3MgU2VjdGlvbiBTdGFydCI7Ci0gICAgY2FzZSBkZWZySU9UaW1pbmdDYmtUeXBlOgotICAgICAgICByZXR1cm4gIklPVGltaW5nIjsKLSAgICBjYXNlIGRlZnJJT1RpbWluZ3NFbmRDYmtUeXBlOgotICAgICAgICByZXR1cm4gIklPVGltaW5ncyBTZWN0aW9uIEVuZCI7Ci0gICAgY2FzZSBkZWZyRlBDU3RhcnRDYmtUeXBlOgotICAgICAgICByZXR1cm4gIkZsb29yIFBsYW4gQ29uc3RyYWludHMgU2VjdGlvbiBTdGFydCI7Ci0gICAgY2FzZSBkZWZyRlBDQ2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJGbG9vciBQbGFuIENvbnN0cmFpbnQiOwotICAgIGNhc2UgZGVmckZQQ0VuZENia1R5cGU6Ci0gICAgICAgIHJldHVybiAiRmxvb3IgUGxhbiBDb25zdHJhaW50cyBTZWN0aW9uIEVuZCI7Ci0gICAgY2FzZSBkZWZyVGltaW5nRGlzYWJsZXNTdGFydENia1R5cGU6Ci0gICAgICAgIHJldHVybiAiVGltaW5nRGlzYWJsZXMgU2VjdGlvbiBTdGFydCI7Ci0gICAgY2FzZSBkZWZyVGltaW5nRGlzYWJsZUNia1R5cGU6Ci0gICAgICAgIHJldHVybiAiVGltaW5nRGlzYWJsZSI7Ci0gICAgY2FzZSBkZWZyVGltaW5nRGlzYWJsZXNFbmRDYmtUeXBlOgotICAgICAgICByZXR1cm4gIlRpbWluZ0Rpc2FibGVzIFNlY3Rpb24gRW5kIjsKLSAgICBjYXNlIGRlZnJQYXJ0aXRpb25zU3RhcnRDYmtUeXBlOgotICAgICAgICByZXR1cm4gIlBhcnRpdGlvbnMgU2VjdGlvbiBTdGFydCI7Ci0gICAgY2FzZSBkZWZyUGFydGl0aW9uQ2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJQYXJ0aXRpb24iOwotICAgIGNhc2UgZGVmclBhcnRpdGlvbnNFbmRDYmtUeXBlOgotICAgICAgICByZXR1cm4gIlBhcnRpdGlvbnMgU2VjdGlvbiBFbmQiOwotICAgIGNhc2UgZGVmclBpblByb3BTdGFydENia1R5cGU6Ci0gICAgICAgIHJldHVybiAiUGluUHJvcCBTZWN0aW9uIFN0YXJ0IjsKLSAgICBjYXNlIGRlZnJQaW5Qcm9wQ2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJQaW5Qcm9wIjsKLSAgICBjYXNlIGRlZnJQaW5Qcm9wRW5kQ2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJQaW5Qcm9wIFNlY3Rpb24gRW5kIjsKLSAgICBjYXNlIGRlZnJDYXNlU2Vuc2l0aXZlQ2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJDYXNlU2Vuc2l0aXZlIjsKLSAgICBjYXNlIGRlZnJCbG9ja2FnZVN0YXJ0Q2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJCbG9ja2FnZSBTZWN0aW9uIFN0YXJ0IjsKLSAgICBjYXNlIGRlZnJCbG9ja2FnZUNia1R5cGU6Ci0gICAgICAgIHJldHVybiAiQmxvY2thZ2UiOwotICAgIGNhc2UgZGVmckJsb2NrYWdlRW5kQ2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJCbG9ja2FnZSBTZWN0aW9uIEVuZCI7Ci0gICAgY2FzZSBkZWZyU2xvdFN0YXJ0Q2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJTbG90cyBTZWN0aW9uIFN0YXJ0IjsKLSAgICBjYXNlIGRlZnJTbG90Q2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJTbG90cyI7Ci0gICAgY2FzZSBkZWZyU2xvdEVuZENia1R5cGU6Ci0gICAgICAgIHJldHVybiAiU2xvdHMgU2VjdGlvbiBFbmQiOwotICAgIGNhc2UgZGVmckZpbGxTdGFydENia1R5cGU6Ci0gICAgICAgIHJldHVybiAiRmlsbHMgU2VjdGlvbiBTdGFydCI7Ci0gICAgY2FzZSBkZWZyRmlsbENia1R5cGU6Ci0gICAgICAgIHJldHVybiAiRmlsbHMiOwotICAgIGNhc2UgZGVmckZpbGxFbmRDYmtUeXBlOgotICAgICAgICByZXR1cm4gIkZpbGxzIFNlY3Rpb24gRW5kIjsKLSAgICBjYXNlIGRlZnJOb25EZWZhdWx0U3RhcnRDYmtUeXBlOgotICAgICAgICByZXR1cm4gIk5vbkRlZmF1bHRSdWxlIFNlY3Rpb24gU3RhcnQiOwotICAgIGNhc2UgZGVmck5vbkRlZmF1bHRDYmtUeXBlOgotICAgICAgICByZXR1cm4gIk5vbkRlZmF1bHQiOwotICAgIGNhc2UgZGVmck5vbkRlZmF1bHRFbmRDYmtUeXBlOgotICAgICAgICByZXR1cm4gIk5vbkRlZmF1bHRSdWxlIFNlY3Rpb24gRW5kIjsKLSAgICBjYXNlIGRlZnJTdHlsZXNTdGFydENia1R5cGU6Ci0gICAgICAgIHJldHVybiAiU3R5bGVzIFNlY3Rpb24gU3RhcnQiOwotICAgIGNhc2UgZGVmclN0eWxlc0Nia1R5cGU6Ci0gICAgICAgIHJldHVybiAiU3R5bGVzIjsKLSAgICBjYXNlIGRlZnJTdHlsZXNFbmRDYmtUeXBlOgotICAgICAgICByZXR1cm4gIlN0eWxlcyBTZWN0aW9uIEVuZCI7Ci0gICAgY2FzZSBkZWZyRXh0ZW5zaW9uQ2JrVHlwZToKLSAgICAgICAgcmV0dXJuICJFeHRlbnNpb24iOwotCi0gICAgICAgIC8vIE5FVyBDQUxMQkFDSyAtIElmIHlvdSBjcmVhdGVkIGEgbmV3IGNhbGxiYWNrIHRoZW4gYWRkIHRoZQotICAgICAgICAvLyB0eXBlIGVudW1zIHRoYXQgeW91IGNyZWF0ZWQgaGVyZSBmb3IgZGVidWcgcHJpbnRpbmcuICAgICAKLQotICAgIGNhc2UgZGVmckRlc2lnbkVuZENia1R5cGU6Ci0gICAgICAgIHJldHVybiAiRGVzaWduRW5kIjsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuICJCT0dVUyI7Ci19Ci0KLWludAotZGVmckNhdGNoQWxsKGRlZnJDYWxsYmFja1R5cGVfZSB0eXAsIHZvaWQqLCBkZWZpVXNlckRhdGEpCi17Ci0gICAgREVGX0lOSVQ7Ci0KLSAgICBpZiAoKGludCkgdHlwID49IDAgJiYgKGludCkgdHlwIDwgQ0JNQVgpIHsKLSAgICAgICAgZGVmQ29udGV4dC5zZXR0aW5ncy0+VW51c2VkQ2FsbGJhY2tzWyhpbnQpIHR5cF0gKz0gMTsKLSAgICB9IGVsc2UgewotICAgICAgICBkZWZDb250ZXh0LnNldHRpbmdzLT5VbnVzZWRDYWxsYmFja3NbMF0gKz0gMTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBXcmFwcGVyIGZ1bmN0aW9ucy4KLS8vCi0vLyBUaGVzZSBmdW5jdGlvbnMgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIGNsYXNzIG1lbWJlciBmdW5jdGlvbnMKLS8vIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgcGFyc2VyIGtpdHMuIFJldHVybnMgbm9uLXplcm8KLS8vIHN0YXR1cyBpZiB0aGUgaW5pdGlhbGl6YXRpb24gaXMgZmFpbGVkLiAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1pbnQgCi1kZWZySW5pdCgpCi17Ci0gICAgcmV0dXJuIGRlZnJJbml0U2Vzc2lvbigwKTsKLX0KLQotaW50Ci1kZWZySW5pdFNlc3Npb24oaW50IHN0YXJ0U2Vzc2lvbikKLXsKLSAgICBpZiAoc3RhcnRTZXNzaW9uKSB7IAotICAgICAgICBpZiAoZGVmQ29udGV4dC5pbml0X2NhbGxfZnVuYyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBBdHRlbXB0IHRvIGNhbGwgY29uZmlndXJhdGlvbiBmdW5jdGlvbiAnJXMnIGluIERFRiBwYXJzZXIgYmVmb3JlIGRlZnJJbml0KCkgY2FsbCBpbiBzZXNzaW9uLWJhc2VkIG1vZGUuXG4iLCBkZWZDb250ZXh0LmluaXRfY2FsbF9mdW5jKTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVsZXRlIGRlZkNvbnRleHQuc2V0dGluZ3M7Ci0gICAgICAgIGRlZkNvbnRleHQuc2V0dGluZ3MgPSBuZXcgZGVmclNldHRpbmdzKCk7Ci0KLSAgICAgICAgZGVsZXRlIGRlZkNvbnRleHQuY2FsbGJhY2tzOwotICAgICAgICBkZWZDb250ZXh0LmNhbGxiYWNrcyA9IG5ldyBkZWZyQ2FsbGJhY2tzKCk7Ci0KLSAgICAgICAgZGVsZXRlIGRlZkNvbnRleHQuc2Vzc2lvbjsKLSAgICAgICAgZGVmQ29udGV4dC5zZXNzaW9uID0gbmV3IGRlZnJTZXNzaW9uKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGRlZkNvbnRleHQuY2FsbGJhY2tzID09IE5VTEwpIHsKLSAgICAgICAgICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzID0gbmV3IGRlZnJDYWxsYmFja3MoKTsKLSAgICAgICAgfQotICAgIAotICAgICAgICBpZiAoZGVmQ29udGV4dC5zZXR0aW5ncyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBkZWZDb250ZXh0LnNldHRpbmdzID0gbmV3IGRlZnJTZXR0aW5ncygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRlZkNvbnRleHQuc2Vzc2lvbiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBkZWZDb250ZXh0LnNlc3Npb24gPSBuZXcgZGVmclNlc3Npb24oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1lbXNldChkZWZDb250ZXh0LnNldHRpbmdzLT5VbnVzZWRDYWxsYmFja3MsIDAsIENCTUFYICogc2l6ZW9mKGludCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZGVmQ29udGV4dC5vd25Db25maWcgPSAwOwotICAgIGRlZkNvbnRleHQuaW5pdF9jYWxsX2Z1bmMgPSAwOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8vIG9ic29sZXRlZCBub3cgCi1pbnQKLWRlZnJSZXNldCgpCi17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCAKLWRlZnJDbGVhcigpCi17Ci0gICAgZGVsZXRlIGRlZkNvbnRleHQuY2FsbGJhY2tzOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzID0gTlVMTDsKLQotICAgIGRlbGV0ZSBkZWZDb250ZXh0LnNldHRpbmdzOwotICAgIGRlZkNvbnRleHQuc2V0dGluZ3MgPSBOVUxMOwotCi0gICAgZGVsZXRlIGRlZkNvbnRleHQuc2Vzc2lvbjsKLSAgICBkZWZDb250ZXh0LnNlc3Npb24gPSBOVUxMOwotCi0gICAgZGVsZXRlIGRlZkNvbnRleHQuZGF0YTsKLSAgICBkZWZDb250ZXh0LmRhdGEgPSBOVUxMOwotCi0gICAgZGVmQ29udGV4dC5pbml0X2NhbGxfZnVuYyA9IE5VTEw7Ci0gICAgZGVmQ29udGV4dC5vd25Db25maWcgPSAwOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotdm9pZAotZGVmclNldFJlZ2lzdGVyVW51c2VkQ2FsbGJhY2tzKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZyU2V0VW51c2VkQ2FsbGJhY2tzKGRlZnJDb3VudFVudXNlZCk7Ci19Ci0KLXZvaWQKLWRlZnJTZXRVbnVzZWRDYWxsYmFja3MoZGVmclZvaWRDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+U2V0VW51c2VkQ2FsbGJhY2tzKGYpOwotfQotCi12b2lkCi1kZWZyVW5zZXRDYWxsYmFja3MoKQotewotICAgIERFRl9JTklUOwotICAgIGRlbGV0ZSBkZWZDb250ZXh0LmNhbGxiYWNrczsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcyA9IG5ldyBkZWZyQ2FsbGJhY2tzKCk7Ci19Ci0KLXZvaWQKLWRlZnJQcmludFVudXNlZENhbGxiYWNrcyhGSUxFICpsb2cpCi17Ci0gICAgaW50IGk7Ci0gICAgaW50IGZpcnN0ID0gMTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBDQk1BWDsgaSsrKSB7Ci0gICAgICAgIGlmIChkZWZDb250ZXh0LnNldHRpbmdzLT5VbnVzZWRDYWxsYmFja3NbaV0pIHsKLSAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgIGZwcmludGYobG9nLAotICAgICAgICAgICAgICAgICAgICAgICAgIldBUk5JTkcgKERFRlBBUlMtNTAwMSk6IERFRiBzdGF0ZW1lbnQgZm91bmQgaW4gdGhlIGRlZiBmaWxlIHdpdGggbm8gY2FsbGJhY2sgc2V0LlxuIik7Ci0gICAgICAgICAgICAgICAgZmlyc3QgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnByaW50Zihsb2csICIlNWQgJXNcbiIsIGRlZkNvbnRleHQuc2V0dGluZ3MtPlVudXNlZENhbGxiYWNrc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgdHlwZVRvU3RyaW5nKChkZWZyQ2FsbGJhY2tUeXBlX2UpIGkpKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gb2Jzb2xldGVkCi1pbnQKLWRlZnJSZWxlYXNlTlJlc2V0TWVtb3J5KCkKLXsKLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZAotZGVmclVuc2V0QXJyYXlOYW1lQ2JrKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+QXJyYXlOYW1lQ2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0QXNzZXJ0aW9uQ2JrKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+QXNzZXJ0aW9uQ2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0QXNzZXJ0aW9uc1N0YXJ0Q2JrKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+QXNzZXJ0aW9uc1N0YXJ0Q2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0QXNzZXJ0aW9uc0VuZENiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPkFzc2VydGlvbnNFbmRDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRCbG9ja2FnZUNiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPkJsb2NrYWdlQ2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0QmxvY2thZ2VTdGFydENiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPkJsb2NrYWdlU3RhcnRDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRCbG9ja2FnZUVuZENiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPkJsb2NrYWdlRW5kQ2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0QnVzQml0Q2JrKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+QnVzQml0Q2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0Q2Fubm90T2NjdXB5Q2JrKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+Q2Fubm90T2NjdXB5Q2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0Q2FucGxhY2VDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5DYW5wbGFjZUNiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldENhc2VTZW5zaXRpdmVDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5DYXNlU2Vuc2l0aXZlQ2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0Q29tcG9uZW50Q2JrKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+Q29tcG9uZW50Q2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0Q29tcG9uZW50RXh0Q2JrKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+Q29tcG9uZW50RXh0Q2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0Q29tcG9uZW50U3RhcnRDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5Db21wb25lbnRTdGFydENiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldENvbXBvbmVudEVuZENiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPkNvbXBvbmVudEVuZENiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldENvbnN0cmFpbnRDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5Db25zdHJhaW50Q2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0Q29uc3RyYWludHNTdGFydENiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPkNvbnN0cmFpbnRzU3RhcnRDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRDb25zdHJhaW50c0VuZENiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPkNvbnN0cmFpbnRzRW5kQ2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0RGVmYXVsdENhcENiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPkRlZmF1bHRDYXBDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXREZXNpZ25DYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5EZXNpZ25DYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXREZXNpZ25FbmRDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5EZXNpZ25FbmRDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXREaWVBcmVhQ2JrKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+RGllQXJlYUNiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldERpdmlkZXJDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5EaXZpZGVyQ2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0RXh0ZW5zaW9uQ2JrKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+RXh0ZW5zaW9uQ2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0RmlsbENiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPkZpbGxDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRGaWxsU3RhcnRDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5GaWxsU3RhcnRDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRGaWxsRW5kQ2JrKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+RmlsbEVuZENiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldEZQQ0NiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPkZQQ0NiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldEZQQ1N0YXJ0Q2JrKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+RlBDU3RhcnRDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRGUENFbmRDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5GUENFbmRDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRGbG9vclBsYW5OYW1lQ2JrKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+Rmxvb3JQbGFuTmFtZUNiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldEdjZWxsR3JpZENiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPkdjZWxsR3JpZENiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldEdyb3VwQ2JrKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+R3JvdXBDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRHcm91cEV4dENiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPkdyb3VwRXh0Q2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0R3JvdXBNZW1iZXJDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5Hcm91cE1lbWJlckNiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldENvbXBvbmVudE1hc2tTaGlmdExheWVyQ2JrKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+Q29tcG9uZW50TWFza1NoaWZ0TGF5ZXJDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRHcm91cE5hbWVDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5Hcm91cE5hbWVDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRHcm91cHNTdGFydENiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPkdyb3Vwc1N0YXJ0Q2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0R3JvdXBzRW5kQ2JrKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+R3JvdXBzRW5kQ2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0SGlzdG9yeUNiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPkhpc3RvcnlDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRJT1RpbWluZ0NiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPklPVGltaW5nQ2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0SU9UaW1pbmdzU3RhcnRDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5JT1RpbWluZ3NTdGFydENiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldElPVGltaW5nc0VuZENiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPklPVGltaW5nc0VuZENiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldElPVGltaW5nc0V4dENiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPklvVGltaW5nc0V4dENiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldE5ldENiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPk5ldENiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldE5ldE5hbWVDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5OZXROYW1lQ2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0TmV0Tm9uRGVmYXVsdFJ1bGVDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5OZXROb25EZWZhdWx0UnVsZUNiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldE5ldENvbm5lY3Rpb25FeHRDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5OZXRDb25uZWN0aW9uRXh0Q2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0TmV0RXh0Q2JrKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+TmV0RXh0Q2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0TmV0UGFydGlhbFBhdGhDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5OZXRQYXJ0aWFsUGF0aENiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldE5ldFN1Ym5ldE5hbWVDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5OZXRTdWJuZXROYW1lQ2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0TmV0U3RhcnRDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5OZXRTdGFydENiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldE5ldEVuZENiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPk5ldEVuZENiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldE5vbkRlZmF1bHRDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5Ob25EZWZhdWx0Q2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0Tm9uRGVmYXVsdFN0YXJ0Q2JrKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+Tm9uRGVmYXVsdFN0YXJ0Q2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0Tm9uRGVmYXVsdEVuZENiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPk5vbkRlZmF1bHRFbmRDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRQYXJ0aXRpb25DYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5QYXJ0aXRpb25DYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRQYXJ0aXRpb25zRXh0Q2JrKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+UGFydGl0aW9uc0V4dENiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldFBhcnRpdGlvbnNTdGFydENiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPlBhcnRpdGlvbnNTdGFydENiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldFBhcnRpdGlvbnNFbmRDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5QYXJ0aXRpb25zRW5kQ2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0UGF0aENiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPlBhdGhDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRQaW5DYXBDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5QaW5DYXBDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRQaW5DYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5QaW5DYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRQaW5FbmRDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5QaW5FbmRDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRQaW5FeHRDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5QaW5FeHRDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRQaW5Qcm9wQ2JrKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+UGluUHJvcENiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldFBpblByb3BTdGFydENiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPlBpblByb3BTdGFydENiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldFBpblByb3BFbmRDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5QaW5Qcm9wRW5kQ2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0UHJvcENiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPlByb3BDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRQcm9wRGVmRW5kQ2JrKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+UHJvcERlZkVuZENiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldFByb3BEZWZTdGFydENiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPlByb3BEZWZTdGFydENiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldFJlZ2lvbkNiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPlJlZ2lvbkNiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldFJlZ2lvblN0YXJ0Q2JrKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+UmVnaW9uU3RhcnRDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRSZWdpb25FbmRDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5SZWdpb25FbmRDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRSb3dDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5Sb3dDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRTY2FuQ2hhaW5FeHRDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5TY2FuQ2hhaW5FeHRDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRTY2FuY2hhaW5DYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5TY2FuY2hhaW5DYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRTY2FuY2hhaW5zU3RhcnRDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5TY2FuY2hhaW5zU3RhcnRDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRTY2FuY2hhaW5zRW5kQ2JrKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+U2NhbmNoYWluc0VuZENiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldFNpdGVDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5TaXRlQ2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0U2xvdENiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPlNsb3RDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRTbG90U3RhcnRDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5TbG90U3RhcnRDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRTbG90RW5kQ2JrKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+U2xvdEVuZENiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldFNOZXRXaXJlQ2JrKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+U05ldFdpcmVDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRTTmV0Q2JrKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+U05ldENiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldFNOZXRTdGFydENiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPlNOZXRTdGFydENiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldFNOZXRFbmRDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5TTmV0RW5kQ2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0U05ldFBhcnRpYWxQYXRoQ2JrKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+U05ldFBhcnRpYWxQYXRoQ2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0U3RhcnRQaW5zQ2JrKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+U3RhcnRQaW5zQ2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0U3R5bGVzQ2JrKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+U3R5bGVzQ2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0U3R5bGVzU3RhcnRDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5TdHlsZXNTdGFydENiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldFN0eWxlc0VuZENiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPlN0eWxlc0VuZENiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldFRlY2hub2xvZ3lDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5UZWNobm9sb2d5Q2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0VGltaW5nRGlzYWJsZUNiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPlRpbWluZ0Rpc2FibGVDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRUaW1pbmdEaXNhYmxlc1N0YXJ0Q2JrKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+VGltaW5nRGlzYWJsZXNTdGFydENiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldFRpbWluZ0Rpc2FibGVzRW5kQ2JrKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+VGltaW5nRGlzYWJsZXNFbmRDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRUcmFja0NiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPlRyYWNrQ2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0VW5pdHNDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5Vbml0c0NiayA9IE5VTEw7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldFZlcnNpb25DYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5WZXJzaW9uQ2JrID0gTlVMTDsKLX0KLQotdm9pZAotZGVmclVuc2V0VmVyc2lvblN0ckNiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPlZlcnNpb25TdHJDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRWaWFDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5WaWFDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRWaWFFeHRDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5WaWFFeHRDYmsgPSBOVUxMOwotfQotCi12b2lkCi1kZWZyVW5zZXRWaWFTdGFydENiaygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPlZpYVN0YXJ0Q2JrID0gTlVMTDsKLX0KLQotCi12b2lkCi1kZWZyVW5zZXRWaWFFbmRDYmsoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5WaWFFbmRDYmsgPSBOVUxMOwotfQotCi1pbnQgKgotZGVmVW51c2VkQ2FsbGJhY2tDb3VudCgpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgcmV0dXJuIGRlZkNvbnRleHQuc2V0dGluZ3MtPlVudXNlZENhbGxiYWNrczsKLX0KLQotCi1jb25zdCBjaGFyICoKLWRlZnJGTmFtZSgpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgCi1kZWZyQ2xlYXJTZXNzaW9uKCkKLXsKLSAgICBpZiAoZGVmQ29udGV4dC5zZXNzaW9uKSB7Ci0gICAgICAgIGRlbGV0ZSBkZWZDb250ZXh0LnNlc3Npb247Ci0gICAgICAgIGRlZkNvbnRleHQuc2Vzc2lvbiA9IG5ldyBkZWZyU2Vzc2lvbigpOwotICAgIH0KLX0KLQotaW50Ci1kZWZyUmVhZChGSUxFICAgICAgICAgICAqZiwKLSAgICAgICAgIGNvbnN0IGNoYXIgICAgICpmTmFtZSwKLSAgICAgICAgIGRlZmlVc2VyRGF0YSAgIHVEYXRhLAotICAgICAgICAgaW50ICAgICAgICAgICAgY2FzZV9zZW5zaXRpdmUpCi17Ci0KLSAgICBpbnQgc3RhdHVzOwotCi0gICAgZGVsZXRlIGRlZkNvbnRleHQuZGF0YTsKLQotICAgIGRlZnJEYXRhICpkZWZEYXRhID0gbmV3IGRlZnJEYXRhKGRlZkNvbnRleHQuY2FsbGJhY2tzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZDb250ZXh0LnNldHRpbmdzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZDb250ZXh0LnNlc3Npb24pOwotCi0gICAgZGVmQ29udGV4dC5kYXRhID0gZGVmRGF0YTsKLQotICAgIC8vIGxleF9pbml0Ci0gICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLQotICAgIC8qIDQvMTEvMjAwMyAtIFJlbW92ZSBmaWxlIGxlZnJSV2FybmluZy5sb2cgZnJvbSBkaXJlY3RvcnkgaWYgaXQgZXhpc3QgKi8KLSAgICAvKiBwY3IgNTY5NzI5ICovCi0gICAgaWYgKHN0YXQoImRlZlJXYXJuaW5nLmxvZyIsICZzdGF0YnVmKSAhPSAtMSkgewotICAgICAgICAvKiBmaWxlIGV4aXN0LCByZW1vdmUgaXQgKi8KLSAgICAgICAgaWYgKCFkZWZDb250ZXh0LnNldHRpbmdzLT5Mb2dGaWxlQXBwZW5kKSB7Ci0gICAgICAgICAgICByZW1vdmUoImRlZlJXYXJuaW5nLmxvZyIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUHJvcGFnYXRlIFNldHRpbmdzIHBhcmFtZXRlciB0byBEYXRhLgotICAgIGlmIChkZWZEYXRhLT5zZXR0aW5ncy0+cmVhZGVyX2Nhc2Vfc2Vuc2l0aXZlX3NldCkgewotICAgICAgICBkZWZEYXRhLT5uYW1lc19jYXNlX3NlbnNpdGl2ZSA9IGRlZkRhdGEtPnNlc3Npb24tPnJlYWRlcl9jYXNlX3NlbnNpdGl2ZTsKLSAgICB9IGVsc2UgaWYgKGRlZkRhdGEtPlZlcnNpb25OdW0gPiA1LjUpIHsKLSAgICAgICAgZGVmRGF0YS0+bmFtZXNfY2FzZV9zZW5zaXRpdmUgPSB0cnVlOwotICAgIH0KLQotICAgIGRlZkRhdGEtPnNlc3Npb24tPkZpbGVOYW1lID0gKGNoYXIqKSBmTmFtZTsKLSAgICBkZWZEYXRhLT5GaWxlID0gZjsKLSAgICBkZWZEYXRhLT5zZXNzaW9uLT5Vc2VyRGF0YSA9IHVEYXRhOwotICAgIGRlZkRhdGEtPnNlc3Npb24tPnJlYWRlcl9jYXNlX3NlbnNpdGl2ZSA9IGNhc2Vfc2Vuc2l0aXZlOwotCi0gICAgLy8gQ3JlYXRlIGEgcGF0aCBwb2ludGVyIHRoYXQgaXMgYWxsIHJlYWR5IHRvIGdvIGp1c3QgaW4gY2FzZQotICAgIC8vIHdlIG5lZWQgaXQgbGF0ZXIuCi0KLSAgICBkZWZEYXRhLT5OZWVkUGF0aERhdGEgPSAoCi0gICAgICAgICgoZGVmRGF0YS0+Y2FsbGJhY2tzLT5OZXRDYmsgfHwgZGVmRGF0YS0+Y2FsbGJhY2tzLT5TTmV0Q2JrKSAmJiBkZWZEYXRhLT5zZXR0aW5ncy0+QWRkUGF0aFRvTmV0KSB8fCBkZWZEYXRhLT5jYWxsYmFja3MtPlBhdGhDYmspID8gMSA6IDA7Ci0gICAgaWYgKGRlZkRhdGEtPk5lZWRQYXRoRGF0YSkgewotICAgICAgICBkZWZEYXRhLT5QYXRoT2JqLkluaXQoKTsKLSAgICB9Ci0KLSAgICBzdGF0dXMgPSBkZWZ5eXBhcnNlKGRlZkRhdGEpOwotCi0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotdm9pZAotZGVmclNldFVzZXJEYXRhKGRlZmlVc2VyRGF0YSB1ZCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LnNlc3Npb24tPlVzZXJEYXRhID0gdWQ7Ci19Ci0KLQotZGVmaVVzZXJEYXRhCi1kZWZyR2V0VXNlckRhdGEoKQotewotICAgIHJldHVybiBkZWZDb250ZXh0LnNlc3Npb24tPlVzZXJEYXRhOwotfQotCi0KLXZvaWQKLWRlZnJTZXREZXNpZ25DYmsoZGVmclN0cmluZ0Nia0ZuVHlwZSBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5EZXNpZ25DYmsgPSBmOwotfQotCi0KLXZvaWQKLWRlZnJTZXRUZWNobm9sb2d5Q2JrKGRlZnJTdHJpbmdDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+VGVjaG5vbG9neUNiayA9IGY7Ci19Ci0KLQotdm9pZAotZGVmclNldERlc2lnbkVuZENiayhkZWZyVm9pZENia0ZuVHlwZSBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5EZXNpZ25FbmRDYmsgPSBmOwotfQotCi0KLXZvaWQKLWRlZnJTZXRQcm9wQ2JrKGRlZnJQcm9wQ2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPlByb3BDYmsgPSBmOwotfQotCi0KLXZvaWQKLWRlZnJTZXRQcm9wRGVmRW5kQ2JrKGRlZnJWb2lkQ2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPlByb3BEZWZFbmRDYmsgPSBmOwotfQotCi0KLXZvaWQKLWRlZnJTZXRQcm9wRGVmU3RhcnRDYmsoZGVmclZvaWRDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+UHJvcERlZlN0YXJ0Q2JrID0gZjsKLX0KLQotCi12b2lkCi1kZWZyU2V0QXJyYXlOYW1lQ2JrKGRlZnJTdHJpbmdDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+QXJyYXlOYW1lQ2JrID0gZjsKLX0KLQotCi12b2lkCi1kZWZyU2V0Rmxvb3JQbGFuTmFtZUNiayhkZWZyU3RyaW5nQ2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPkZsb29yUGxhbk5hbWVDYmsgPSBmOwotfQotCi0KLXZvaWQKLWRlZnJTZXRVbml0c0NiayhkZWZyRG91YmxlQ2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPlVuaXRzQ2JrID0gZjsKLX0KLQotCi12b2lkCi1kZWZyU2V0VmVyc2lvbkNiayhkZWZyRG91YmxlQ2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPlZlcnNpb25DYmsgPSBmOwotfQotCi0KLXZvaWQKLWRlZnJTZXRWZXJzaW9uU3RyQ2JrKGRlZnJTdHJpbmdDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+VmVyc2lvblN0ckNiayA9IGY7Ci19Ci0KLQotdm9pZAotZGVmclNldERpdmlkZXJDYmsoZGVmclN0cmluZ0Nia0ZuVHlwZSBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5EaXZpZGVyQ2JrID0gZjsKLX0KLQotCi12b2lkCi1kZWZyU2V0QnVzQml0Q2JrKGRlZnJTdHJpbmdDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+QnVzQml0Q2JrID0gZjsKLX0KLQotCi12b2lkCi1kZWZyU2V0U2l0ZUNiayhkZWZyU2l0ZUNia0ZuVHlwZSBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5TaXRlQ2JrID0gZjsKLX0KLQotCi12b2lkCi1kZWZyU2V0Q2FucGxhY2VDYmsoZGVmclNpdGVDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+Q2FucGxhY2VDYmsgPSBmOwotfQotCi0KLXZvaWQKLWRlZnJTZXRDYW5ub3RPY2N1cHlDYmsoZGVmclNpdGVDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+Q2Fubm90T2NjdXB5Q2JrID0gZjsKLX0KLQotCi12b2lkCi1kZWZyU2V0Q29tcG9uZW50U3RhcnRDYmsoZGVmckludGVnZXJDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+Q29tcG9uZW50U3RhcnRDYmsgPSBmOwotfQotCi0KLXZvaWQKLWRlZnJTZXRDb21wb25lbnRFbmRDYmsoZGVmclZvaWRDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+Q29tcG9uZW50RW5kQ2JrID0gZjsKLX0KLQotdm9pZAotZGVmclNldENvbXBvbmVudENiayhkZWZyQ29tcG9uZW50Q2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPkNvbXBvbmVudENiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXROZXRTdGFydENiayhkZWZySW50ZWdlckNia0ZuVHlwZSBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5OZXRTdGFydENiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXROZXRFbmRDYmsoZGVmclZvaWRDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+TmV0RW5kQ2JrID0gZjsKLX0KLQotdm9pZAotZGVmclNldE5ldENiayhkZWZyTmV0Q2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPk5ldENiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXROZXROYW1lQ2JrKGRlZnJTdHJpbmdDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+TmV0TmFtZUNiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXROZXRTdWJuZXROYW1lQ2JrKGRlZnJTdHJpbmdDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+TmV0U3VibmV0TmFtZUNiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXROZXROb25EZWZhdWx0UnVsZUNiayhkZWZyU3RyaW5nQ2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPk5ldE5vbkRlZmF1bHRSdWxlQ2JrID0gZjsKLX0KLQotdm9pZAotZGVmclNldE5ldFBhcnRpYWxQYXRoQ2JrKGRlZnJOZXRDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+TmV0UGFydGlhbFBhdGhDYmsgPSBmOwotfQotCi12b2lkCi1kZWZyU2V0U05ldFN0YXJ0Q2JrKGRlZnJJbnRlZ2VyQ2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPlNOZXRTdGFydENiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXRTTmV0RW5kQ2JrKGRlZnJWb2lkQ2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPlNOZXRFbmRDYmsgPSBmOwotfQotCi12b2lkCi1kZWZyU2V0U05ldENiayhkZWZyTmV0Q2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPlNOZXRDYmsgPSBmOwotfQotCi12b2lkCi1kZWZyU2V0U05ldFBhcnRpYWxQYXRoQ2JrKGRlZnJOZXRDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+U05ldFBhcnRpYWxQYXRoQ2JrID0gZjsKLX0KLQotdm9pZAotZGVmclNldFNOZXRXaXJlQ2JrKGRlZnJOZXRDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+U05ldFdpcmVDYmsgPSBmOwotfQotCi12b2lkCi1kZWZyU2V0UGF0aENiayhkZWZyUGF0aENia0ZuVHlwZSBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5QYXRoQ2JrID0gZjsKLX0KLQotdm9pZAotZGVmclNldEFkZFBhdGhUb05ldCgpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5zZXR0aW5ncy0+QWRkUGF0aFRvTmV0ID0gMTsKLX0KLQotdm9pZAotZGVmclNldEFsbG93Q29tcG9uZW50TmV0cygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5zZXR0aW5ncy0+QWxsb3dDb21wb25lbnROZXRzID0gMTsKLX0KLQotaW50Ci1kZWZyR2V0QWxsb3dDb21wb25lbnROZXRzKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICByZXR1cm4gZGVmQ29udGV4dC5zZXR0aW5ncy0+QWxsb3dDb21wb25lbnROZXRzOwotfQotCi0KLXZvaWQKLWRlZnJTZXRDb21wb25lbnRFeHRDYmsoZGVmclN0cmluZ0Nia0ZuVHlwZSBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5Db21wb25lbnRFeHRDYmsgPSBmOwotfQotCi12b2lkCi1kZWZyU2V0UGluRXh0Q2JrKGRlZnJTdHJpbmdDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+UGluRXh0Q2JrID0gZjsKLX0KLQotdm9pZAotZGVmclNldFZpYUV4dENiayhkZWZyU3RyaW5nQ2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPlZpYUV4dENiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXROZXRDb25uZWN0aW9uRXh0Q2JrKGRlZnJTdHJpbmdDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+TmV0Q29ubmVjdGlvbkV4dENiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXROZXRFeHRDYmsoZGVmclN0cmluZ0Nia0ZuVHlwZSBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5OZXRFeHRDYmsgPSBmOwotfQotCi12b2lkCi1kZWZyU2V0R3JvdXBFeHRDYmsoZGVmclN0cmluZ0Nia0ZuVHlwZSBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5Hcm91cEV4dENiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXRTY2FuQ2hhaW5FeHRDYmsoZGVmclN0cmluZ0Nia0ZuVHlwZSBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5TY2FuQ2hhaW5FeHRDYmsgPSBmOwotfQotCi12b2lkCi1kZWZyU2V0SW9UaW1pbmdzRXh0Q2JrKGRlZnJTdHJpbmdDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+SW9UaW1pbmdzRXh0Q2JrID0gZjsKLX0KLQotdm9pZAotZGVmclNldFBhcnRpdGlvbnNFeHRDYmsoZGVmclN0cmluZ0Nia0ZuVHlwZSBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5QYXJ0aXRpb25zRXh0Q2JrID0gZjsKLX0KLQotdm9pZAotZGVmclNldEhpc3RvcnlDYmsoZGVmclN0cmluZ0Nia0ZuVHlwZSBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5IaXN0b3J5Q2JrID0gZjsKLX0KLQotdm9pZAotZGVmclNldERpZUFyZWFDYmsoZGVmckJveENia0ZuVHlwZSBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5EaWVBcmVhQ2JrID0gZjsKLX0KLQotdm9pZAotZGVmclNldFBpbkNhcENiayhkZWZyUGluQ2FwQ2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPlBpbkNhcENiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXRQaW5FbmRDYmsoZGVmclZvaWRDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+UGluRW5kQ2JrID0gZjsKLX0KLQotdm9pZAotZGVmclNldFN0YXJ0UGluc0NiayhkZWZySW50ZWdlckNia0ZuVHlwZSBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5TdGFydFBpbnNDYmsgPSBmOwotfQotCi12b2lkCi1kZWZyU2V0RGVmYXVsdENhcENiayhkZWZySW50ZWdlckNia0ZuVHlwZSBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5EZWZhdWx0Q2FwQ2JrID0gZjsKLX0KLQotdm9pZAotZGVmclNldFBpbkNiayhkZWZyUGluQ2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPlBpbkNiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXRSb3dDYmsoZGVmclJvd0Nia0ZuVHlwZSBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5Sb3dDYmsgPSBmOwotfQotCi12b2lkCi1kZWZyU2V0VHJhY2tDYmsoZGVmclRyYWNrQ2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPlRyYWNrQ2JrID0gZjsKLX0KLQotdm9pZAotZGVmclNldEdjZWxsR3JpZENiayhkZWZyR2NlbGxHcmlkQ2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPkdjZWxsR3JpZENiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXRWaWFTdGFydENiayhkZWZySW50ZWdlckNia0ZuVHlwZSBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5WaWFTdGFydENiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXRWaWFFbmRDYmsoZGVmclZvaWRDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+VmlhRW5kQ2JrID0gZjsKLX0KLQotdm9pZAotZGVmclNldFZpYUNiayhkZWZyVmlhQ2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPlZpYUNiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXRSZWdpb25TdGFydENiayhkZWZySW50ZWdlckNia0ZuVHlwZSBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5SZWdpb25TdGFydENiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXRSZWdpb25FbmRDYmsoZGVmclZvaWRDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+UmVnaW9uRW5kQ2JrID0gZjsKLX0KLQotdm9pZAotZGVmclNldFJlZ2lvbkNiayhkZWZyUmVnaW9uQ2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPlJlZ2lvbkNiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXRHcm91cHNTdGFydENiayhkZWZySW50ZWdlckNia0ZuVHlwZSBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5Hcm91cHNTdGFydENiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXRHcm91cHNFbmRDYmsoZGVmclZvaWRDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+R3JvdXBzRW5kQ2JrID0gZjsKLX0KLQotdm9pZAotZGVmclNldEdyb3VwTmFtZUNiayhkZWZyU3RyaW5nQ2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPkdyb3VwTmFtZUNiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXRHcm91cE1lbWJlckNiayhkZWZyU3RyaW5nQ2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPkdyb3VwTWVtYmVyQ2JrID0gZjsKLX0KLQotdm9pZAotZGVmclNldENvbXBvbmVudE1hc2tTaGlmdExheWVyQ2JrKGRlZnJDb21wb25lbnRNYXNrU2hpZnRMYXllckNia0ZuVHlwZSBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5Db21wb25lbnRNYXNrU2hpZnRMYXllckNiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXRHcm91cENiayhkZWZyR3JvdXBDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+R3JvdXBDYmsgPSBmOwotfQotCi12b2lkCi1kZWZyU2V0QXNzZXJ0aW9uc1N0YXJ0Q2JrKGRlZnJJbnRlZ2VyQ2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPkFzc2VydGlvbnNTdGFydENiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXRBc3NlcnRpb25zRW5kQ2JrKGRlZnJWb2lkQ2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPkFzc2VydGlvbnNFbmRDYmsgPSBmOwotfQotCi12b2lkCi1kZWZyU2V0QXNzZXJ0aW9uQ2JrKGRlZnJBc3NlcnRpb25DYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+QXNzZXJ0aW9uQ2JrID0gZjsKLX0KLQotdm9pZAotZGVmclNldENvbnN0cmFpbnRzU3RhcnRDYmsoZGVmckludGVnZXJDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+Q29uc3RyYWludHNTdGFydENiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXRDb25zdHJhaW50c0VuZENiayhkZWZyVm9pZENia0ZuVHlwZSBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5Db25zdHJhaW50c0VuZENiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXRDb25zdHJhaW50Q2JrKGRlZnJBc3NlcnRpb25DYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+Q29uc3RyYWludENiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXRTY2FuY2hhaW5zU3RhcnRDYmsoZGVmckludGVnZXJDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+U2NhbmNoYWluc1N0YXJ0Q2JrID0gZjsKLX0KLQotdm9pZAotZGVmclNldFNjYW5jaGFpbnNFbmRDYmsoZGVmclZvaWRDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+U2NhbmNoYWluc0VuZENiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXRTY2FuY2hhaW5DYmsoZGVmclNjYW5jaGFpbkNia0ZuVHlwZSBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5TY2FuY2hhaW5DYmsgPSBmOwotfQotCi12b2lkCi1kZWZyU2V0SU9UaW1pbmdzU3RhcnRDYmsoZGVmckludGVnZXJDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+SU9UaW1pbmdzU3RhcnRDYmsgPSBmOwotfQotCi12b2lkCi1kZWZyU2V0SU9UaW1pbmdzRW5kQ2JrKGRlZnJWb2lkQ2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPklPVGltaW5nc0VuZENiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXRJT1RpbWluZ0NiayhkZWZySU9UaW1pbmdDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+SU9UaW1pbmdDYmsgPSBmOwotfQotCi12b2lkCi1kZWZyU2V0RlBDU3RhcnRDYmsoZGVmckludGVnZXJDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+RlBDU3RhcnRDYmsgPSBmOwotfQotCi12b2lkCi1kZWZyU2V0RlBDRW5kQ2JrKGRlZnJWb2lkQ2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPkZQQ0VuZENiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXRGUENDYmsoZGVmckZQQ0Nia0ZuVHlwZSBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5GUENDYmsgPSBmOwotfQotCi12b2lkCi1kZWZyU2V0VGltaW5nRGlzYWJsZXNTdGFydENiayhkZWZySW50ZWdlckNia0ZuVHlwZSBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5UaW1pbmdEaXNhYmxlc1N0YXJ0Q2JrID0gZjsKLX0KLQotdm9pZAotZGVmclNldFRpbWluZ0Rpc2FibGVzRW5kQ2JrKGRlZnJWb2lkQ2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPlRpbWluZ0Rpc2FibGVzRW5kQ2JrID0gZjsKLX0KLQotdm9pZAotZGVmclNldFRpbWluZ0Rpc2FibGVDYmsoZGVmclRpbWluZ0Rpc2FibGVDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+VGltaW5nRGlzYWJsZUNiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXRQYXJ0aXRpb25zU3RhcnRDYmsoZGVmckludGVnZXJDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+UGFydGl0aW9uc1N0YXJ0Q2JrID0gZjsKLX0KLQotdm9pZAotZGVmclNldFBhcnRpdGlvbnNFbmRDYmsoZGVmclZvaWRDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+UGFydGl0aW9uc0VuZENiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXRQYXJ0aXRpb25DYmsoZGVmclBhcnRpdGlvbkNia0ZuVHlwZSBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5QYXJ0aXRpb25DYmsgPSBmOwotfQotCi12b2lkCi1kZWZyU2V0UGluUHJvcFN0YXJ0Q2JrKGRlZnJJbnRlZ2VyQ2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPlBpblByb3BTdGFydENiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXRQaW5Qcm9wRW5kQ2JrKGRlZnJWb2lkQ2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPlBpblByb3BFbmRDYmsgPSBmOwotfQotCi12b2lkCi1kZWZyU2V0UGluUHJvcENiayhkZWZyUGluUHJvcENia0ZuVHlwZSBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5QaW5Qcm9wQ2JrID0gZjsKLX0KLQotdm9pZAotZGVmclNldENhc2VTZW5zaXRpdmVDYmsoZGVmckludGVnZXJDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+Q2FzZVNlbnNpdGl2ZUNiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXRCbG9ja2FnZVN0YXJ0Q2JrKGRlZnJJbnRlZ2VyQ2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPkJsb2NrYWdlU3RhcnRDYmsgPSBmOwotfQotCi12b2lkCi1kZWZyU2V0QmxvY2thZ2VFbmRDYmsoZGVmclZvaWRDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+QmxvY2thZ2VFbmRDYmsgPSBmOwotfQotCi12b2lkCi1kZWZyU2V0QmxvY2thZ2VDYmsoZGVmckJsb2NrYWdlQ2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPkJsb2NrYWdlQ2JrID0gZjsKLX0KLQotdm9pZAotZGVmclNldFNsb3RTdGFydENiayhkZWZySW50ZWdlckNia0ZuVHlwZSBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5TbG90U3RhcnRDYmsgPSBmOwotfQotCi12b2lkCi1kZWZyU2V0U2xvdEVuZENiayhkZWZyVm9pZENia0ZuVHlwZSBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5TbG90RW5kQ2JrID0gZjsKLX0KLQotdm9pZAotZGVmclNldFNsb3RDYmsoZGVmclNsb3RDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+U2xvdENiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXRGaWxsU3RhcnRDYmsoZGVmckludGVnZXJDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+RmlsbFN0YXJ0Q2JrID0gZjsKLX0KLQotdm9pZAotZGVmclNldEZpbGxFbmRDYmsoZGVmclZvaWRDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+RmlsbEVuZENiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXRGaWxsQ2JrKGRlZnJGaWxsQ2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPkZpbGxDYmsgPSBmOwotfQotCi12b2lkCi1kZWZyU2V0Tm9uRGVmYXVsdFN0YXJ0Q2JrKGRlZnJJbnRlZ2VyQ2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPk5vbkRlZmF1bHRTdGFydENiayA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXROb25EZWZhdWx0RW5kQ2JrKGRlZnJWb2lkQ2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPk5vbkRlZmF1bHRFbmRDYmsgPSBmOwotfQotCi12b2lkCi1kZWZyU2V0Tm9uRGVmYXVsdENiayhkZWZyTm9uRGVmYXVsdENia0ZuVHlwZSBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5Ob25EZWZhdWx0Q2JrID0gZjsKLX0KLQotdm9pZAotZGVmclNldFN0eWxlc1N0YXJ0Q2JrKGRlZnJJbnRlZ2VyQ2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPlN0eWxlc1N0YXJ0Q2JrID0gZjsKLX0KLQotdm9pZAotZGVmclNldFN0eWxlc0VuZENiayhkZWZyVm9pZENia0ZuVHlwZSBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuY2FsbGJhY2tzLT5TdHlsZXNFbmRDYmsgPSBmOwotfQotCi12b2lkCi1kZWZyU2V0U3R5bGVzQ2JrKGRlZnJTdHlsZXNDYmtGblR5cGUgZikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LmNhbGxiYWNrcy0+U3R5bGVzQ2JrID0gZjsKLX0KLQotdm9pZAotZGVmclNldEV4dGVuc2lvbkNiayhkZWZyU3RyaW5nQ2JrRm5UeXBlIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5jYWxsYmFja3MtPkV4dGVuc2lvbkNiayA9IGY7Ci19Ci0KLS8vIE5FVyBDQUxMQkFDSyAtIFB1dCB0aGUgc2V0IGZ1bmN0aW9ucyBmb3IgdGhlIG5ldyBjYWxsYmFja3MgaGVyZS4gCi0KLXZvaWQKLWRlZnJTZXRBc3NlcnRpb25XYXJuaW5ncyhpbnQgd2FybikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LnNldHRpbmdzLT5Bc3NlcnRpb25XYXJuaW5ncyA9IHdhcm47Ci19Ci0KLQotdm9pZAotZGVmclNldEJsb2NrYWdlV2FybmluZ3MoaW50IHdhcm4pCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5zZXR0aW5ncy0+QmxvY2thZ2VXYXJuaW5ncyA9IHdhcm47Ci19Ci0KLQotdm9pZAotZGVmclNldENhc2VTZW5zaXRpdmVXYXJuaW5ncyhpbnQgd2FybikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LnNldHRpbmdzLT5DYXNlU2Vuc2l0aXZlV2FybmluZ3MgPSB3YXJuOwotfQotCi0KLXZvaWQKLWRlZnJTZXRDb21wb25lbnRXYXJuaW5ncyhpbnQgd2FybikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LnNldHRpbmdzLT5Db21wb25lbnRXYXJuaW5ncyA9IHdhcm47Ci19Ci0KLQotdm9pZAotZGVmclNldENvbnN0cmFpbnRXYXJuaW5ncyhpbnQgd2FybikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LnNldHRpbmdzLT5Db25zdHJhaW50V2FybmluZ3MgPSB3YXJuOwotfQotCi0KLXZvaWQKLWRlZnJTZXREZWZhdWx0Q2FwV2FybmluZ3MoaW50IHdhcm4pCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5zZXR0aW5ncy0+RGVmYXVsdENhcFdhcm5pbmdzID0gd2FybjsKLX0KLQotCi12b2lkCi1kZWZyU2V0R2NlbGxHcmlkV2FybmluZ3MoaW50IHdhcm4pCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5zZXR0aW5ncy0+R2NlbGxHcmlkV2FybmluZ3MgPSB3YXJuOwotfQotCi0KLXZvaWQKLWRlZnJTZXRJT1RpbWluZ1dhcm5pbmdzKGludCB3YXJuKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuc2V0dGluZ3MtPklPVGltaW5nV2FybmluZ3MgPSB3YXJuOwotfQotCi0KLXZvaWQKLWRlZnJTZXROZXRXYXJuaW5ncyhpbnQgd2FybikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LnNldHRpbmdzLT5OZXRXYXJuaW5ncyA9IHdhcm47Ci19Ci0KLQotdm9pZAotZGVmclNldE5vbkRlZmF1bHRXYXJuaW5ncyhpbnQgd2FybikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LnNldHRpbmdzLT5Ob25EZWZhdWx0V2FybmluZ3MgPSB3YXJuOwotfQotCi0KLXZvaWQKLWRlZnJTZXRQaW5FeHRXYXJuaW5ncyhpbnQgd2FybikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LnNldHRpbmdzLT5QaW5FeHRXYXJuaW5ncyA9IHdhcm47Ci19Ci0KLQotdm9pZAotZGVmclNldFBpbldhcm5pbmdzKGludCB3YXJuKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuc2V0dGluZ3MtPlBpbldhcm5pbmdzID0gd2FybjsKLX0KLQotCi12b2lkCi1kZWZyU2V0UmVnaW9uV2FybmluZ3MoaW50IHdhcm4pCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5zZXR0aW5ncy0+UmVnaW9uV2FybmluZ3MgPSB3YXJuOwotfQotCi0KLXZvaWQKLWRlZnJTZXRSb3dXYXJuaW5ncyhpbnQgd2FybikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LnNldHRpbmdzLT5Sb3dXYXJuaW5ncyA9IHdhcm47Ci19Ci0KLQotdm9pZAotZGVmclNldFNjYW5jaGFpbldhcm5pbmdzKGludCB3YXJuKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuc2V0dGluZ3MtPlNjYW5jaGFpbldhcm5pbmdzID0gd2FybjsKLX0KLQotCi12b2lkCi1kZWZyU2V0U05ldFdhcm5pbmdzKGludCB3YXJuKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuc2V0dGluZ3MtPlNOZXRXYXJuaW5ncyA9IHdhcm47Ci19Ci0KLQotdm9pZAotZGVmclNldFN0eWxlc1dhcm5pbmdzKGludCB3YXJuKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuc2V0dGluZ3MtPlN0eWxlc1dhcm5pbmdzID0gd2FybjsKLX0KLQotCi12b2lkCi1kZWZyU2V0VHJhY2tXYXJuaW5ncyhpbnQgd2FybikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LnNldHRpbmdzLT5UcmFja1dhcm5pbmdzID0gd2FybjsKLX0KLQotCi12b2lkCi1kZWZyU2V0VW5pdHNXYXJuaW5ncyhpbnQgd2FybikKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LnNldHRpbmdzLT5Vbml0c1dhcm5pbmdzID0gd2FybjsKLX0KLQotCi12b2lkCi1kZWZyU2V0VmVyc2lvbldhcm5pbmdzKGludCB3YXJuKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuc2V0dGluZ3MtPlZlcnNpb25XYXJuaW5ncyA9IHdhcm47Ci19Ci0KLQotdm9pZAotZGVmclNldFZpYVdhcm5pbmdzKGludCB3YXJuKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuc2V0dGluZ3MtPlZpYVdhcm5pbmdzID0gd2FybjsKLX0KLQotCi12b2lkCi1kZWZyRGlzYWJsZVBhcnNlck1zZ3MoaW50ICAgbk1zZywKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgICAqbXNncykKLXsKLSAgICBERUZfSU5JVDsKLSAgICBpbnQgaSwgajsKLSAgICBpbnQgKnRtcDsKLQotICAgIGlmIChkZWZDb250ZXh0LnNldHRpbmdzLT5uRERNc2dzID09IDApIHsKLSAgICAgICAgZGVmQ29udGV4dC5zZXR0aW5ncy0+bkRETXNncyA9IG5Nc2c7Ci0gICAgICAgIGRlZkNvbnRleHQuc2V0dGluZ3MtPmRpc2FibGVETXNncyA9IChpbnQqKSBtYWxsb2Moc2l6ZW9mKGludCkgKiBuTXNnKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG5Nc2c7IGkrKykKLSAgICAgICAgICAgIGRlZkNvbnRleHQuc2V0dGluZ3MtPmRpc2FibGVETXNnc1tpXSA9IG1zZ3NbaV07Ci0gICAgfSBlbHNlIHsgIC8vIGFkZCB0aGUgbGlzdCB0byB0aGUgZXhpc3RpbmcgbGlzdCAKLSAgICAgICAgLy8gMXN0IGNoZWNrIGlmIHRoZSBtc2dJZCBpcyBhbHJlYWR5IG9uIHRoZSBsaXN0IGJlZm9yZSBhZGRpbmcgaXQgb24gCi0gICAgICAgIHRtcCA9IChpbnQqKSBtYWxsb2Moc2l6ZW9mKGludCkgKiAobk1zZyArIGRlZkNvbnRleHQuc2V0dGluZ3MtPm5ERE1zZ3MpKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGRlZkNvbnRleHQuc2V0dGluZ3MtPm5ERE1zZ3M7IGkrKykgIC8vIGNvcHkgdGhlIGV4aXN0aW5nIHRvIHRoZSBuZXcgbGlzdCAKLSAgICAgICAgICAgIHRtcFtpXSA9IGRlZkNvbnRleHQuc2V0dGluZ3MtPmRpc2FibGVETXNnc1tpXTsKLSAgICAgICAgZnJlZSgoaW50KikgKGRlZkNvbnRleHQuc2V0dGluZ3MtPmRpc2FibGVETXNncykpOwotICAgICAgICBkZWZDb250ZXh0LnNldHRpbmdzLT5kaXNhYmxlRE1zZ3MgPSB0bXA7ICAgICAgICAgICAvLyBzZXQgZGlzYWJsZURNc2dzIHRvIHRoZSBuZXcgbGlzdCAKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG5Nc2c7IGkrKykgeyAvLyBtZXJnZSB0aGUgbmV3IGxpc3Qgd2l0aCB0aGUgZXhpc3RpbmcgCi0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZGVmQ29udGV4dC5zZXR0aW5ncy0+bkRETXNnczsgaisrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlZkNvbnRleHQuc2V0dGluZ3MtPmRpc2FibGVETXNnc1tqXSA9PSBtc2dzW2ldKQotICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgLy8gbXNnSWQgYWxyZWFkeSBvbiB0aGUgbGlzdCAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChqID09IGRlZkNvbnRleHQuc2V0dGluZ3MtPm5ERE1zZ3MpICAgICAgICAgICAvLyBtc2dJZCBub3Qgb24gdGhlIGxpc3QsIGFkZCBpdCBvbiAKLSAgICAgICAgICAgICAgICBkZWZDb250ZXh0LnNldHRpbmdzLT5kaXNhYmxlRE1zZ3NbZGVmQ29udGV4dC5zZXR0aW5ncy0+bkRETXNncysrXSA9IG1zZ3NbaV07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi0KLXZvaWQKLWRlZnJFbmFibGVQYXJzZXJNc2dzKGludCAgICBuTXNnLAotICAgICAgICAgICAgICAgICAgICAgaW50ICAgICptc2dzKQotewotICAgIERFRl9JTklUOwotICAgIGludCBpLCBqOwotCi0gICAgaWYgKGRlZkNvbnRleHQuc2V0dGluZ3MtPm5ERE1zZ3MgPT0gMCkKLSAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdCBpcyBlbXB0eSwgbm90aGluZyB0byByZW1vdmUgCi0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbk1zZzsgaSsrKSB7ICAgICAvLyBsb29wIHRocm91Z2ggdGhlIGdpdmVuIGxpc3QgCi0gICAgICAgIGZvciAoaiA9IDA7IGogPCBkZWZDb250ZXh0LnNldHRpbmdzLT5uRERNc2dzOyBqKyspIHsKLSAgICAgICAgICAgIGlmIChkZWZDb250ZXh0LnNldHRpbmdzLT5kaXNhYmxlRE1zZ3Nbal0gPT0gbXNnc1tpXSkgewotICAgICAgICAgICAgICAgIGRlZkNvbnRleHQuc2V0dGluZ3MtPmRpc2FibGVETXNnc1tqXSA9IC0xOyAgICAvLyB0ZW1wIGFzc2lnbiBhIC0xIG9uIHRoYXQgc2xvdCAKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAvLyBmaWxsIHVwIHRoZSBlbXB0eSBzbG90IHdpdGggdGhlIG5leHQgbm9uIC0xIG1zZ0lkIAotICAgIGZvciAoaSA9IDA7IGkgPCBkZWZDb250ZXh0LnNldHRpbmdzLT5uRERNc2dzOyBpKyspIHsKLSAgICAgICAgaWYgKGRlZkNvbnRleHQuc2V0dGluZ3MtPmRpc2FibGVETXNnc1tpXSA9PSAtMSkgewotICAgICAgICAgICAgaiA9IGkgKyAxOwotICAgICAgICAgICAgd2hpbGUgKGogPCBkZWZDb250ZXh0LnNldHRpbmdzLT5uRERNc2dzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlZkNvbnRleHQuc2V0dGluZ3MtPmRpc2FibGVETXNnc1tqXSAhPSAtMSkKLSAgICAgICAgICAgICAgICAgICAgZGVmQ29udGV4dC5zZXR0aW5ncy0+ZGlzYWJsZURNc2dzW2krK10gPSBkZWZDb250ZXh0LnNldHRpbmdzLT5kaXNhYmxlRE1zZ3NbaisrXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOyAgICAgLy8gYnJlYWsgb3V0IHRoZSBmb3IgbG9vcCwgdGhlIGxpc3Qgc2hvdWxkIGFsbCBtb3ZlZCAKLSAgICAgICAgfQotICAgIH0KLSAgICAvLyBDb3VudCBob3cgbWFueSBtZXNzYWdlSWQgbGVmdCBhbmQgY2hhbmdlIGFsbCAtMSB0byAwIAotICAgIGZvciAoaiA9IGk7IGogPCBkZWZDb250ZXh0LnNldHRpbmdzLT5uRERNc2dzOyBqKyspIHsKLSAgICAgICAgZGVmQ29udGV4dC5zZXR0aW5ncy0+ZGlzYWJsZURNc2dzW2pdID0gMDsgICAgIC8vIHNldCB0byAwIAotICAgIH0KLSAgICBkZWZDb250ZXh0LnNldHRpbmdzLT5uRERNc2dzID0gaTsKLSAgICByZXR1cm47Ci19Ci0KLQotdm9pZAotZGVmckVuYWJsZUFsbE1zZ3MoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuc2V0dGluZ3MtPm5ERE1zZ3MgPSAwOwotICAgIGZyZWUoKGludCopIChkZWZDb250ZXh0LnNldHRpbmdzLT5kaXNhYmxlRE1zZ3MpKTsKLX0KLQotCi12b2lkCi1kZWZyU2V0VG90YWxNc2dMaW1pdChpbnQgdG90TnVtTXNncykKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LnNldHRpbmdzLT50b3RhbERlZk1zZ0xpbWl0ID0gdG90TnVtTXNnczsKLX0KLQotCi12b2lkCi1kZWZyU2V0TGltaXRQZXJNc2coaW50ICBtc2dJZCwKLSAgICAgICAgICAgICAgICAgICBpbnQgIG51bU1zZykKLXsKLSAgICBERUZfSU5JVDsKLSAgICBjaGFyIG1zZ1N0clsxMF07Ci0KLSAgICBpZiAoKG1zZ0lkIDw9IDApIHx8ICgobXNnSWQgLSA1MDAwKSA+PSBOT0RFRk1TRykpIHsgICAvLyBEZWYgc3RhcnRzIGF0IDUwMDAKLSAgICAgICAgc3ByaW50Zihtc2dTdHIsICIlZCIsIG1zZ0lkKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBkZWZDb250ZXh0LnNldHRpbmdzLT5Nc2dMaW1pdFttc2dJZCAtIDUwMDBdID0gbnVtTXNnOwotICAgIHJldHVybjsKLX0KLQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gVXRpbGl0eSBmdW5jdGlvbnMKLS8vCi0vLyBUaGVzZSBhcmUgdXRpbGl0eSBmdW5jdGlvbnMuIE5vdGU6IHRoaXMgcGFydCBzdGlsbCBjb250YWlucyBzb21lCi0vLyBnbG9iYWwgdmFyaWFibGVzLiBJZGVhbGx5IHRoZXkgd291bGQgYmUgcGFydCBvZiB0aGUgbWFpbiBjbGFzcy4KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLXZvaWQKLWRlZnJTZXRNYWdpY0NvbW1lbnRGb3VuZEZ1bmN0aW9uKERFRklfTUFHSUNfQ09NTUVOVF9GT1VORF9GVU5DVElPTiBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuc2V0dGluZ3MtPk1hZ2ljQ29tbWVudEZvdW5kRnVuY3Rpb24gPSBmOwotfQotCi0KLXZvaWQKLWRlZnJTZXRNYWdpY0NvbW1lbnRTdHJpbmcoY2hhciAqcykKLXsKLSAgICBERUZfSU5JVDsKLQotICAgIGZyZWUoZGVmQ29udGV4dC5kYXRhLT5tYWdpYyk7Ci0gICAgZGVmQ29udGV4dC5kYXRhLT5tYWdpYyA9IHN0cmR1cChzKTsKLX0KLQotdm9pZAotZGVmclNldExvZ0Z1bmN0aW9uKERFRklfTE9HX0ZVTkNUSU9OIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5zZXR0aW5ncy0+RXJyb3JMb2dGdW5jdGlvbiA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXRXYXJuaW5nTG9nRnVuY3Rpb24oREVGSV9XQVJOSU5HX0xPR19GVU5DVElPTiBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuc2V0dGluZ3MtPldhcm5pbmdMb2dGdW5jdGlvbiA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXRDb250ZXh0TG9nRnVuY3Rpb24oREVGSV9DT05URVhUX0xPR19GVU5DVElPTiBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuc2V0dGluZ3MtPkNvbnRleHRFcnJvckxvZ0Z1bmN0aW9uID0gZjsKLX0KLQotdm9pZAotZGVmclNldENvbnRleHRXYXJuaW5nTG9nRnVuY3Rpb24oREVGSV9DT05URVhUX1dBUk5JTkdfTE9HX0ZVTkNUSU9OIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5zZXR0aW5ncy0+Q29udGV4dFdhcm5pbmdMb2dGdW5jdGlvbiA9IGY7Ci19Ci0KLQotdm9pZAotZGVmclNldE1hbGxvY0Z1bmN0aW9uKERFRklfTUFMTE9DX0ZVTkNUSU9OIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5zZXR0aW5ncy0+TWFsbG9jRnVuY3Rpb24gPSBmOwotfQotCi12b2lkCi1kZWZyU2V0UmVhbGxvY0Z1bmN0aW9uKERFRklfUkVBTExPQ19GVU5DVElPTiBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuc2V0dGluZ3MtPlJlYWxsb2NGdW5jdGlvbiA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJTZXRGcmVlRnVuY3Rpb24oREVGSV9GUkVFX0ZVTkNUSU9OIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5zZXR0aW5ncy0+RnJlZUZ1bmN0aW9uID0gZjsKLX0KLQotdm9pZAotZGVmclNldExpbmVOdW1iZXJGdW5jdGlvbihERUZJX0xJTkVfTlVNQkVSX0ZVTkNUSU9OIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5zZXR0aW5ncy0+TGluZU51bWJlckZ1bmN0aW9uID0gZjsKLX0KLQotdm9pZAotZGVmclNldExvbmdMaW5lTnVtYmVyRnVuY3Rpb24oREVGSV9MT05HX0xJTkVfTlVNQkVSX0ZVTkNUSU9OIGYpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5zZXR0aW5ncy0+TG9uZ0xpbmVOdW1iZXJGdW5jdGlvbiA9IGY7Ci19Ci0KLQotdm9pZAotZGVmclNldERlbHRhTnVtYmVyTGluZXMoaW50IG51bUxpbmVzKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuc2V0dGluZ3MtPmRlZmlEZWx0YU51bWJlckxpbmVzID0gbnVtTGluZXM7Ci19Ci0KLQotdm9pZAotZGVmclNldENvbW1lbnRDaGFyKGNoYXIgYykKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LnNldHRpbmdzLT5Db21tZW50Q2hhciA9IGM7Ci19Ci0KLXZvaWQKLWRlZnJTZXRDYXNlU2Vuc2l0aXZpdHkoaW50IGNhc2VTZW5zZSkKLXsKLSAgICBERUZfSU5JVDsKLQotICAgIGRlZkNvbnRleHQuc2V0dGluZ3MtPnJlYWRlcl9jYXNlX3NlbnNpdGl2ZV9zZXQgPSAxOwotICAgIGRlZkNvbnRleHQuc2Vzc2lvbi0+cmVhZGVyX2Nhc2Vfc2Vuc2l0aXZlID0gY2FzZVNlbnNlOwotICAgIGlmIChkZWZDb250ZXh0LmRhdGEpIHsKLSAgICAgICAgZGVmQ29udGV4dC5kYXRhLT5uYW1lc19jYXNlX3NlbnNpdGl2ZSA9IGNhc2VTZW5zZTsKLSAgICB9Ci19Ci0KLQotdm9pZAotZGVmckFkZEFsaWFzKGNvbnN0IGNoYXIgICAgICprZXksCi0gICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnZhbHVlLAotICAgICAgICAgICAgIGludCAgICAgICAgICAgIG1hcmtlZCkKLXsKLSAgICAvLyBTaW5jZSB0aGUgYWxpYXMgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIGhhc2ggdGFibGUsIHRoZSBoYXNoIHRhYmxlCi0gICAgLy8gb25seSB0YWtlcyB0aGUga2V5IGFuZCB0aGUgZGF0YSwgdGhlIG1hcmtlZCBkYXRhIHdpbGwgYmUgc3RvcmVkCi0gICAgLy8gYXQgdGhlIGVuZCBvZiB0aGUgdmFsdWUgZGF0YQotCi0gICAgZGVmckRhdGEgKmRlZkRhdGEgPSBkZWZDb250ZXh0LmRhdGEgOwotCi0gICAgY2hhciAgICAqazE7Ci0gICAgY2hhciAgICAqdjE7Ci0gICAgaW50ICAgICBsZW4gPSBzdHJsZW4oa2V5KSArIDE7Ci0gICAgazEgPSAoY2hhciopIG1hbGxvYyhsZW4pOwotICAgIHN0cmNweShrMSwga2V5KTsKLSAgICBsZW4gPSBzdHJsZW4odmFsdWUpICsgMSArIDE7ICAgLy8gMSBmb3IgdGhlIG1hcmtlZAotICAgIHYxID0gKGNoYXIqKSBtYWxsb2MobGVuKTsKLSAgICAvL3N0cmNweSh2MSwgdmFsdWUpOwotICAgIGlmIChtYXJrZWQgIT0gMCkKLSAgICAgICAgbWFya2VkID0gMTsgICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBvbmx5IDEgZGlnaXQKLSAgICBzcHJpbnRmKHYxLCAiJWQlcyIsIG1hcmtlZCwgdmFsdWUpOwotCi0gICAgZGVmRGF0YS0+ZGVmX2FsaWFzX3NldFtrMV0gPSB2MTsKLX0KLQotdm9pZAotZGVmclNldE9wZW5Mb2dGaWxlQXBwZW5kKCkKLXsKLSAgICBERUZfSU5JVDsKLSAgICBkZWZDb250ZXh0LnNldHRpbmdzLT5Mb2dGaWxlQXBwZW5kID0gVFJVRTsKLX0KLQotdm9pZAotZGVmclVuc2V0T3BlbkxvZ0ZpbGVBcHBlbmQoKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuc2V0dGluZ3MtPkxvZ0ZpbGVBcHBlbmQgPSBGQUxTRTsKLX0KLQotCi12b2lkCi1kZWZyU2V0UmVhZEZ1bmN0aW9uKERFRklfUkVBRF9GVU5DVElPTiBmKQotewotICAgIERFRl9JTklUOwotICAgIGRlZkNvbnRleHQuc2V0dGluZ3MtPlJlYWRGdW5jdGlvbiA9IGY7Ci19Ci0KLXZvaWQKLWRlZnJVbnNldFJlYWRGdW5jdGlvbigpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5zZXR0aW5ncy0+UmVhZEZ1bmN0aW9uID0gMDsKLX0KLQotdm9pZAotZGVmckRpc2FibGVQcm9wU3RyUHJvY2VzcygpCi17Ci0gICAgREVGX0lOSVQ7Ci0gICAgZGVmQ29udGV4dC5zZXR0aW5ncy0+RGlzUHJvcFN0clByb2Nlc3MgPSAxOwotfQotCi12b2lkCi1kZWZyU2V0TkxpbmVzKGxvbmcgbG9uZyBuKQotewotICAgIGRlZnJEYXRhICpkZWZEYXRhID0gZGVmQ29udGV4dC5kYXRhOwotCi0gICAgZGVmRGF0YS0+bmxpbmVzID0gbjsKLX0KLQotaW50IGRlZnJMaW5lTnVtYmVyKCkgCi17ICAgIAotICAgIC8vIENvbXBhdGliaWxpdHkgZmVhdHVyZTogaW4gb2xkIHZlcnNpb25zIHRoZSB0cmFuc2xhdG9ycywgIAotICAgIC8vIHRoZSBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGJlZm9yZSBkZWZEYXRhIGluaXRpYWxpemF0aW9uLiAKLSAgICBpZiAoZGVmQ29udGV4dC5kYXRhKSB7Ci0gICAgICAgIHJldHVybiAoaW50KWRlZkNvbnRleHQuZGF0YS0+bmxpbmVzOyAKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotbG9uZyBsb25nIGRlZnJMb25nTGluZU51bWJlcigpIHsKLSAgICAvLyBDb21wYXRpYmlsaXR5IGZlYXR1cmU6IGluIG9sZCB2ZXJzaW9ucyB0aGUgdHJhbnNsYXRvcnMsICAKLSAgICAvLyB0aGUgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBiZWZvcmUgZGVmRGF0YSBpbml0aWFsaXphdGlvbi4gCi0gICAgCi0gICAgaWYgKGRlZkNvbnRleHQuZGF0YSkgewotICAgICAgICByZXR1cm4gZGVmQ29udGV4dC5kYXRhLT5ubGluZXM7IAotICAgIH0KLQotICAgIHJldHVybiAobG9uZyAgbG9uZykgMDsgCi19Ci0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZnJSZWFkZXIuaHBwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZyUmVhZGVyLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4MGIyMC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZnJSZWFkZXIuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNzIzICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTMtMjAxNiwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpZm5kZWYgREVGUlJFQURFUl9ICi0jZGVmaW5lIERFRlJSRUFERVJfSAotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLSNpbmNsdWRlICJkZWZpS1JEZWZzLmhwcCIKLSNpbmNsdWRlICJkZWZpRGVmcy5ocHAiCi0jaW5jbHVkZSAiZGVmaVVzZXIuaHBwIgotCi0jZGVmaW5lIERFRl9NU0dTIDQwMTMKLSNkZWZpbmUgQ0JNQVggMTUwICAgIC8vIE51bWJlciBvZiBjYWxsYmFja3MuCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLS8vIEFuIGVudW0gZGVzY3JpYmluZyBhbGwgb2YgdGhlIHR5cGVzIG9mIHJlYWRlciBjYWxsYmFja3MuCi10eXBlZGVmIGVudW0gewotICBkZWZyVW5zcGVjaWZpZWRDYmtUeXBlID0gMCwKLSAgZGVmckRlc2lnblN0YXJ0Q2JrVHlwZSwKLSAgZGVmclRlY2hOYW1lQ2JrVHlwZSwKLSAgZGVmclByb3BDYmtUeXBlLAotICBkZWZyUHJvcERlZkVuZENia1R5cGUsCi0gIGRlZnJQcm9wRGVmU3RhcnRDYmtUeXBlLAotICBkZWZyRmxvb3JQbGFuTmFtZUNia1R5cGUsCi0gIGRlZnJBcnJheU5hbWVDYmtUeXBlLAotICBkZWZyVW5pdHNDYmtUeXBlLAotICBkZWZyRGl2aWRlckNia1R5cGUsCi0gIGRlZnJCdXNCaXRDYmtUeXBlLAotICBkZWZyU2l0ZUNia1R5cGUsCi0gIGRlZnJDb21wb25lbnRTdGFydENia1R5cGUsCi0gIGRlZnJDb21wb25lbnRDYmtUeXBlLAotICBkZWZyQ29tcG9uZW50RW5kQ2JrVHlwZSwKLSAgZGVmck5ldFN0YXJ0Q2JrVHlwZSwKLSAgZGVmck5ldENia1R5cGUsCi0gIGRlZnJOZXROYW1lQ2JrVHlwZSwKLSAgZGVmck5ldE5vbkRlZmF1bHRSdWxlQ2JrVHlwZSwKLSAgZGVmck5ldFN1Ym5ldE5hbWVDYmtUeXBlLAotICBkZWZyTmV0RW5kQ2JrVHlwZSwKLSAgZGVmclBhdGhDYmtUeXBlLAotICBkZWZyVmVyc2lvbkNia1R5cGUsCi0gIGRlZnJWZXJzaW9uU3RyQ2JrVHlwZSwKLSAgZGVmckNvbXBvbmVudEV4dENia1R5cGUsCi0gIGRlZnJQaW5FeHRDYmtUeXBlLAotICBkZWZyVmlhRXh0Q2JrVHlwZSwKLSAgZGVmck5ldENvbm5lY3Rpb25FeHRDYmtUeXBlLAotICBkZWZyTmV0RXh0Q2JrVHlwZSwKLSAgZGVmckdyb3VwRXh0Q2JrVHlwZSwKLSAgZGVmclNjYW5DaGFpbkV4dENia1R5cGUsCi0gIGRlZnJJb1RpbWluZ3NFeHRDYmtUeXBlLAotICBkZWZyUGFydGl0aW9uc0V4dENia1R5cGUsCi0gIGRlZnJIaXN0b3J5Q2JrVHlwZSwKLSAgZGVmckRpZUFyZWFDYmtUeXBlLAotICBkZWZyQ2FucGxhY2VDYmtUeXBlLAotICBkZWZyQ2Fubm90T2NjdXB5Q2JrVHlwZSwKLSAgZGVmclBpbkNhcENia1R5cGUsCi0gIGRlZnJEZWZhdWx0Q2FwQ2JrVHlwZSwKLSAgZGVmclN0YXJ0UGluc0Nia1R5cGUsCi0gIGRlZnJQaW5DYmtUeXBlLAotICBkZWZyUGluRW5kQ2JrVHlwZSwKLSAgZGVmclJvd0Nia1R5cGUsCi0gIGRlZnJUcmFja0Nia1R5cGUsCi0gIGRlZnJHY2VsbEdyaWRDYmtUeXBlLAotICBkZWZyVmlhU3RhcnRDYmtUeXBlLAotICBkZWZyVmlhQ2JrVHlwZSwKLSAgZGVmclZpYUVuZENia1R5cGUsCi0gIGRlZnJSZWdpb25TdGFydENia1R5cGUsCi0gIGRlZnJSZWdpb25DYmtUeXBlLAotICBkZWZyUmVnaW9uRW5kQ2JrVHlwZSwKLSAgZGVmclNOZXRTdGFydENia1R5cGUsCi0gIGRlZnJTTmV0Q2JrVHlwZSwKLSAgZGVmclNOZXRQYXJ0aWFsUGF0aENia1R5cGUsCi0gIGRlZnJTTmV0V2lyZUNia1R5cGUsCi0gIGRlZnJTTmV0RW5kQ2JrVHlwZSwKLSAgZGVmckdyb3Vwc1N0YXJ0Q2JrVHlwZSwKLSAgZGVmckdyb3VwTmFtZUNia1R5cGUsCi0gIGRlZnJHcm91cE1lbWJlckNia1R5cGUsCi0gIGRlZnJHcm91cENia1R5cGUsCi0gIGRlZnJHcm91cHNFbmRDYmtUeXBlLAotICBkZWZyQXNzZXJ0aW9uc1N0YXJ0Q2JrVHlwZSwKLSAgZGVmckFzc2VydGlvbkNia1R5cGUsCi0gIGRlZnJBc3NlcnRpb25zRW5kQ2JrVHlwZSwKLSAgZGVmckNvbnN0cmFpbnRzU3RhcnRDYmtUeXBlLAotICBkZWZyQ29uc3RyYWludENia1R5cGUsCi0gIGRlZnJDb25zdHJhaW50c0VuZENia1R5cGUsCi0gIGRlZnJTY2FuY2hhaW5zU3RhcnRDYmtUeXBlLAotICBkZWZyU2NhbmNoYWluQ2JrVHlwZSwKLSAgZGVmclNjYW5jaGFpbnNFbmRDYmtUeXBlLAotICBkZWZySU9UaW1pbmdzU3RhcnRDYmtUeXBlLAotICBkZWZySU9UaW1pbmdDYmtUeXBlLAotICBkZWZySU9UaW1pbmdzRW5kQ2JrVHlwZSwKLSAgZGVmckZQQ1N0YXJ0Q2JrVHlwZSwKLSAgZGVmckZQQ0Nia1R5cGUsCi0gIGRlZnJGUENFbmRDYmtUeXBlLAotICBkZWZyVGltaW5nRGlzYWJsZXNTdGFydENia1R5cGUsCi0gIGRlZnJUaW1pbmdEaXNhYmxlQ2JrVHlwZSwKLSAgZGVmclRpbWluZ0Rpc2FibGVzRW5kQ2JrVHlwZSwKLSAgZGVmclBhcnRpdGlvbnNTdGFydENia1R5cGUsCi0gIGRlZnJQYXJ0aXRpb25DYmtUeXBlLAotICBkZWZyUGFydGl0aW9uc0VuZENia1R5cGUsCi0gIGRlZnJQaW5Qcm9wU3RhcnRDYmtUeXBlLAotICBkZWZyUGluUHJvcENia1R5cGUsCi0gIGRlZnJQaW5Qcm9wRW5kQ2JrVHlwZSwKLSAgZGVmckJsb2NrYWdlU3RhcnRDYmtUeXBlLAotICBkZWZyQmxvY2thZ2VDYmtUeXBlLAotICBkZWZyQmxvY2thZ2VFbmRDYmtUeXBlLAotICBkZWZyU2xvdFN0YXJ0Q2JrVHlwZSwKLSAgZGVmclNsb3RDYmtUeXBlLAotICBkZWZyU2xvdEVuZENia1R5cGUsCi0gIGRlZnJGaWxsU3RhcnRDYmtUeXBlLAotICBkZWZyRmlsbENia1R5cGUsCi0gIGRlZnJGaWxsRW5kQ2JrVHlwZSwKLSAgZGVmckNhc2VTZW5zaXRpdmVDYmtUeXBlLAotICBkZWZyTm9uRGVmYXVsdFN0YXJ0Q2JrVHlwZSwKLSAgZGVmck5vbkRlZmF1bHRDYmtUeXBlLAotICBkZWZyTm9uRGVmYXVsdEVuZENia1R5cGUsCi0gIGRlZnJTdHlsZXNTdGFydENia1R5cGUsCi0gIGRlZnJTdHlsZXNDYmtUeXBlLAotICBkZWZyU3R5bGVzRW5kQ2JrVHlwZSwKLSAgZGVmckV4dGVuc2lvbkNia1R5cGUsCi0KLSAgLy8gTkVXIENBTExCQUNLIC0gSWYgeW91IGFyZSBjcmVhdGluZyBhIG5ldyBjYWxsYmFjaywgeW91IG11c3QgYWRkCi0gIC8vIGEgdW5pcXVlIGl0ZW0gdG8gdGhpcyBlbnVtIGZvciBlYWNoIGNhbGxiYWNrIHJvdXRpbmUuIFdoZW4gdGhlCi0gIC8vIGNhbGxiYWNrIGlzIGNhbGxlZCBpbiBkZWYueSB5b3UgaGF2ZSB0byBzdXBwbHkgdGhpcyBlbnVtIGl0ZW0KLSAgLy8gYXMgYW4gYXJndW1lbnQgaW4gdGhlIGNhbGwuCi0KLSAgZGVmckNvbXBvbmVudE1hc2tTaGlmdExheWVyQ2JrVHlwZSwKLSAgZGVmckRlc2lnbkVuZENia1R5cGUKLX0gZGVmckNhbGxiYWNrVHlwZV9lOwotIAotIAotLy8gRGVjbGFyYXRpb25zIG9mIGZ1bmN0aW9uIHNpZ25hdHVyZXMgZm9yIGVhY2ggdHlwZSBvZiBjYWxsYmFjay4KLS8vIFRoZXNlIGRlY2xhcmF0aW9ucyBhcmUgdHlwZS1zYWZlIHdoZW4gY29tcGlsaW5nIHdpdGggQU5TSSBDCi0vLyBvciBDKys7IHlvdSB3aWxsIG9ubHkgYmUgYWJsZSB0byByZWdpc3RlciBhIGZ1bmN0aW9uIHBvaW50ZXIKLS8vIHdpdGggdGhlIGNvcnJlY3Qgc2lnbmF0dXJlIGZvciBhIGdpdmVuIHR5cGUgb2YgY2FsbGJhY2suCi0vLwotLy8gRWFjaCBjYWxsYmFjayBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byByZXR1cm4gMCBpZiBzdWNjZXNzZnVsLgotLy8gQSBub24temVybyByZXR1cm4gY29kZSB3aWxsIGNhdXNlIHRoZSByZWFkZXIgdG8gYWJvcnQuCi0vLwotLy8gVGhlIGRlZnJEZXNpZ25TdGFydCBhbmQgZGVmckRlc2lnbkVuZCBjYWxsYmFjayBpcyBvbmx5IGNhbGxlZCBvbmNlLgotLy8gT3RoZXIgY2FsbGJhY2tzIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMsIGVhY2ggdGltZSB3aXRoIGEgZGlmZmVyZW50Ci0vLyBzZXQgb2YgZGF0YS4KLS8vCi0vLyBGb3IgZWFjaCBjYWxsYmFjaywgdGhlIERlZiBBUEkgd2lsbCBtYWtlIHRoZSBjYWxsYmFjayB0byB0aGUKLS8vIGZ1bmN0aW9uIHN1cHBsaWVkIGJ5IHRoZSBjbGllbnQsIHdoaWNoIHNob3VsZCBlaXRoZXIgbWFrZSBhIGNvcHkKLS8vIG9mIHRoZSBEZWYgb2JqZWN0LCBvciBzdG9yZSB0aGUgZGF0YSBpbiB0aGUgY2xpZW50J3Mgb3duIGRhdGEgc3RydWN0dXJlcy4KLS8vIFRoZSBEZWYgQVBJIHdpbGwgZGVsZXRlIG9yIHJldXNlIGVhY2ggb2JqZWN0IGFmdGVyIG1ha2luZyB0aGUgY2FsbGJhY2ssCi0vLyBzbyB0aGUgY2xpZW50IHNob3VsZCBub3Qga2VlcCBhIHBvaW50ZXIgdG8gaXQuCi0vLwotLy8gQWxsIGNhbGxiYWNrcyBwYXNzIHRoZSB1c2VyIGRhdGEgcG9pbnRlciBwcm92aWRlZCBpbiBkZWZyUmVhZCgpCi0vLyBvciBkZWZyU2V0VXNlckRhdGEoKSBiYWNrIHRvIHRoZSBjbGllbnQ7IHRoaXMgY2FuIGJlIHVzZWQgYnkgdGhlCi0vLyBjbGllbnQgdG8gb2J0YWluIGFjY2VzcyB0byB0aGUgcmVzdCBvZiB0aGUgY2xpZW50J3MgZGF0YSBzdHJ1Y3R1cmVzLgotLy8KLS8vIFRoZSB1c2VyIGRhdGEgcG9pbnRlciBpcyBvYnRhaW5lZCB1c2luZyBkZWZyR2V0VXNlckRhdGEoKSBpbW1lZGlhdGVseQotLy8gcHJpb3IgdG8gbWFraW5nIGVhY2ggY2FsbGJhY2ssIHNvIHRoZSBjbGllbnQgaXMgZnJlZSB0byBjaGFuZ2UgdGhlCi0vLyB1c2VyIGRhdGEgb24gdGhlIGZseSBpZiBuZWNlc3NhcnkuCi0vLwotLy8gQ2FsbGJhY2tzIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGFyZSBwYXNzZWQgYSBjYWxsYmFjayB0eXBlCi0vLyBwYXJhbWV0ZXIsIHdoaWNoIGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byB3cml0ZSBhIHNpbmdsZSBjYWxsYmFjawotLy8gZnVuY3Rpb24sIHJlZ2lzdGVyIHRoYXQgZnVuY3Rpb24gZm9yIG11bHRpcGxlIGNhbGxiYWNrcywgdGhlbgotLy8gc3dpdGNoIGJhc2VkIG9uIHRoZSBjYWxsYmFjayB0eXBlIHRvIGhhbmRsZSB0aGUgYXBwcm9wcmlhdGUgdHlwZSBvZgotLy8gZGF0YS4KLSAKLQotLy8gQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gbm90aGluZy4gICAgIAotdHlwZWRlZiBpbnQgKCpkZWZyVm9pZENia0ZuVHlwZSkgKGRlZnJDYWxsYmFja1R5cGVfZSwgdm9pZCogdiwgZGVmaVVzZXJEYXRhKTsKLQotLy8gQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBzdHJpbmcuICAgICAKLXR5cGVkZWYgaW50ICgqZGVmclN0cmluZ0Nia0ZuVHlwZSkgKGRlZnJDYWxsYmFja1R5cGVfZSwgY29uc3QgY2hhciAqc3RyaW5nLCBkZWZpVXNlckRhdGEpOwotIAotLy8gQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBpbnRlZ2VyLiAgICAgCi10eXBlZGVmIGludCAoKmRlZnJJbnRlZ2VyQ2JrRm5UeXBlKSAoZGVmckNhbGxiYWNrVHlwZV9lLCBpbnQgbnVtYmVyLCBkZWZpVXNlckRhdGEpOwotIAotLy8gQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBkb3VibGUuICAgICAKLXR5cGVkZWYgaW50ICgqZGVmckRvdWJsZUNia0ZuVHlwZSkgKGRlZnJDYWxsYmFja1R5cGVfZSwgZG91YmxlIG51bWJlciwgZGVmaVVzZXJEYXRhKTsKLSAKLS8vIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgZGVmaVByb3AuICAgICAKLXR5cGVkZWYgaW50ICgqZGVmclByb3BDYmtGblR5cGUpIChkZWZyQ2FsbGJhY2tUeXBlX2UsIGRlZmlQcm9wICpwcm9wLCBkZWZpVXNlckRhdGEpOwotIAotLy8gQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBkZWZpU2l0ZS4gICAgIAotdHlwZWRlZiBpbnQgKCpkZWZyU2l0ZUNia0ZuVHlwZSkgKGRlZnJDYWxsYmFja1R5cGVfZSwgZGVmaVNpdGUgKnNpdGUsIGRlZmlVc2VyRGF0YSk7Ci0gCi0vLyBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBhIGRlZkNvbXBvbmVudC4gICAgIAotdHlwZWRlZiBpbnQgKCpkZWZyQ29tcG9uZW50Q2JrRm5UeXBlKSAoZGVmckNhbGxiYWNrVHlwZV9lLCBkZWZpQ29tcG9uZW50ICpjb21wLCBkZWZpVXNlckRhdGEpOwotCi0vLyBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBhIGRlZkNvbXBvbmVudE1hc2tTaGlmdExheWVyLiAgICAgCi10eXBlZGVmIGludCAoKmRlZnJDb21wb25lbnRNYXNrU2hpZnRMYXllckNia0ZuVHlwZSkgKGRlZnJDYWxsYmFja1R5cGVfZSwgZGVmaUNvbXBvbmVudE1hc2tTaGlmdExheWVyICpjb21wLCBkZWZpVXNlckRhdGEpOwotIAotLy8gQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBkZWZOZXQuICAgICAKLXR5cGVkZWYgaW50ICgqZGVmck5ldENia0ZuVHlwZSkgKGRlZnJDYWxsYmFja1R5cGVfZSwgZGVmaU5ldCAqbmV0LCBkZWZpVXNlckRhdGEpOwotCi0vLyBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBhIGRlZlBhdGguICAgICAKLXR5cGVkZWYgaW50ICgqZGVmclBhdGhDYmtGblR5cGUpIChkZWZyQ2FsbGJhY2tUeXBlX2UsIGRlZmlQYXRoICpwYXRoLCBkZWZpVXNlckRhdGEpOwotIAotLy8gQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBkZWZpQm94LiAgICAgCi10eXBlZGVmIGludCAoKmRlZnJCb3hDYmtGblR5cGUpIChkZWZyQ2FsbGJhY2tUeXBlX2UsIGRlZmlCb3ggKmJveCwgZGVmaVVzZXJEYXRhKTsKLSAKLQotLy8gQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBkZWZpUGluQ2FwLiAgICAgCi10eXBlZGVmIGludCAoKmRlZnJQaW5DYXBDYmtGblR5cGUpIChkZWZyQ2FsbGJhY2tUeXBlX2UsIGRlZmlQaW5DYXAgKnBpbmNhcCwgZGVmaVVzZXJEYXRhKTsKLSAKLQotLy8gQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBkZWZpUGluLiAgICAgCi10eXBlZGVmIGludCAoKmRlZnJQaW5DYmtGblR5cGUpIChkZWZyQ2FsbGJhY2tUeXBlX2UsIGRlZmlQaW4gKnBpbiwgZGVmaVVzZXJEYXRhKTsKLSAKLQotLy8gQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBkZWZpUm93LiAgICAgCi10eXBlZGVmIGludCAoKmRlZnJSb3dDYmtGblR5cGUpIChkZWZyQ2FsbGJhY2tUeXBlX2UsIGRlZmlSb3cgKnJvdywgZGVmaVVzZXJEYXRhKTsKLSAKLQotLy8gQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBkZWZpVHJhY2suICAgICAKLXR5cGVkZWYgaW50ICgqZGVmclRyYWNrQ2JrRm5UeXBlKSAoZGVmckNhbGxiYWNrVHlwZV9lLCBkZWZpVHJhY2sgKnRyYWNrLCBkZWZpVXNlckRhdGEpOwotIAotCi0vLyBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBhIGRlZmlHY2VsbEdyaWQuICAgICAKLXR5cGVkZWYgaW50ICgqZGVmckdjZWxsR3JpZENia0ZuVHlwZSkgKGRlZnJDYWxsYmFja1R5cGVfZSwgZGVmaUdjZWxsR3JpZCAqZ3JpZCwgZGVmaVVzZXJEYXRhKTsKLSAKLQotLy8gQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBkZWZpVmlhLiAgICAgCi10eXBlZGVmIGludCAoKmRlZnJWaWFDYmtGblR5cGUpIChkZWZyQ2FsbGJhY2tUeXBlX2UsIGRlZmlWaWEgKiwgZGVmaVVzZXJEYXRhKTsKLSAKLQotLy8gQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBkZWZpUmVnaW9uLiAgICAgCi10eXBlZGVmIGludCAoKmRlZnJSZWdpb25DYmtGblR5cGUpIChkZWZyQ2FsbGJhY2tUeXBlX2UsIGRlZmlSZWdpb24gKiwgZGVmaVVzZXJEYXRhKTsKLSAKLQotLy8gQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBkZWZpR3JvdXAuICAgICAKLXR5cGVkZWYgaW50ICgqZGVmckdyb3VwQ2JrRm5UeXBlKSAoZGVmckNhbGxiYWNrVHlwZV9lLCBkZWZpR3JvdXAgKiwgZGVmaVVzZXJEYXRhKTsKLSAKLQotLy8gQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBkZWZpQXNzZXJ0aW9uLiAKLXR5cGVkZWYgaW50ICgqZGVmckFzc2VydGlvbkNia0ZuVHlwZSkgKGRlZnJDYWxsYmFja1R5cGVfZSwgZGVmaUFzc2VydGlvbiAqLCBkZWZpVXNlckRhdGEpOwotIAotCi0vLyBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBhIGRlZmlTY2FuQ2hhaW4uIAotdHlwZWRlZiBpbnQgKCpkZWZyU2NhbmNoYWluQ2JrRm5UeXBlKSAoZGVmckNhbGxiYWNrVHlwZV9lLCBkZWZpU2NhbmNoYWluICosIGRlZmlVc2VyRGF0YSk7Ci0gCi0KLS8vIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgZGVmaUlPVGltaW5nLiAKLXR5cGVkZWYgaW50ICgqZGVmcklPVGltaW5nQ2JrRm5UeXBlKSAoZGVmckNhbGxiYWNrVHlwZV9lLCBkZWZpSU9UaW1pbmcgKiwgZGVmaVVzZXJEYXRhKTsKLSAKLQotLy8gQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBkZWZpRlBDLiAKLXR5cGVkZWYgaW50ICgqZGVmckZQQ0Nia0ZuVHlwZSkgKGRlZnJDYWxsYmFja1R5cGVfZSwgZGVmaUZQQyAqLCBkZWZpVXNlckRhdGEpOwotIAotCi0vLyBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBhIGRlZmlUaW1pbmdEaXNhYmxlLiAKLXR5cGVkZWYgaW50ICgqZGVmclRpbWluZ0Rpc2FibGVDYmtGblR5cGUpIChkZWZyQ2FsbGJhY2tUeXBlX2UsIGRlZmlUaW1pbmdEaXNhYmxlICosIGRlZmlVc2VyRGF0YSk7Ci0gCi0KLS8vIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgZGVmaVBhcnRpdGlvbi4gCi10eXBlZGVmIGludCAoKmRlZnJQYXJ0aXRpb25DYmtGblR5cGUpIChkZWZyQ2FsbGJhY2tUeXBlX2UsIGRlZmlQYXJ0aXRpb24gKiwgZGVmaVVzZXJEYXRhKTsKLSAKLS8vIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgZGVmaVBpblByb3AuIAotdHlwZWRlZiBpbnQgKCpkZWZyUGluUHJvcENia0ZuVHlwZSkgKGRlZnJDYWxsYmFja1R5cGVfZSwgZGVmaVBpblByb3AgKiwgZGVmaVVzZXJEYXRhKTsKLQotLy8gQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBkZWZpQmxvY2thZ2UuIAotdHlwZWRlZiBpbnQgKCpkZWZyQmxvY2thZ2VDYmtGblR5cGUpIChkZWZyQ2FsbGJhY2tUeXBlX2UsIGRlZmlCbG9ja2FnZSAqLCBkZWZpVXNlckRhdGEpOwotCi0vLyBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBhIGRlZmlTbG90LiAKLXR5cGVkZWYgaW50ICgqZGVmclNsb3RDYmtGblR5cGUpIChkZWZyQ2FsbGJhY2tUeXBlX2UsIGRlZmlTbG90ICosIGRlZmlVc2VyRGF0YSk7Ci0KLS8vIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgZGVmaUZpbGwuIAotdHlwZWRlZiBpbnQgKCpkZWZyRmlsbENia0ZuVHlwZSkgKGRlZnJDYWxsYmFja1R5cGVfZSwgZGVmaUZpbGwgKiwgZGVmaVVzZXJEYXRhKTsKLQotLy8gQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBkZWZpTm9uRGVmYXVsdC4KLXR5cGVkZWYgaW50ICgqZGVmck5vbkRlZmF1bHRDYmtGblR5cGUpIChkZWZyQ2FsbGJhY2tUeXBlX2UsIGRlZmlOb25EZWZhdWx0ICosIGRlZmlVc2VyRGF0YSk7Ci0KLS8vIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgZGVmaVN0eWxlcy4gCi10eXBlZGVmIGludCAoKmRlZnJTdHlsZXNDYmtGblR5cGUpIChkZWZyQ2FsbGJhY2tUeXBlX2UsIGRlZmlTdHlsZXMgKiwgZGVmaVVzZXJEYXRhKTsKLQotLy8gTkVXIENBTExCQUNLIC0gRWFjaCBjYWxsYmFjayBtdXN0IHJldHVybiB1c2VyIGRhdGEsIGVudW0sIGFuZAotLy8gICBPVVItREFUQSBpdGVtLiAgV2UgbXVzdCBkZWZpbmUgYSBjYWxsYmFjayBmdW5jdGlvbiB0eXBlIGZvcgotLy8gICBlYWNoIHR5cGUgb2YgT1VSLURBVEEuICBTb21lIHJvdXRpbmVzIHJldHVybiBhIHN0cmluZywgc29tZQotLy8gICByZXR1cm4gYW4gaW50ZWdlciwgYW5kIHNvbWUgcmV0dXJuIGEgcG9pbnRlciB0byBhIGNsYXNzLgotLy8gICBJZiB5b3UgY3JlYXRlIGEgbmV3IGNsYXNzLCB0aGVuIHlvdSBtdXN0IGNyZWF0ZSBhIG5ldyBmdW5jdGlvbgotLy8gICB0eXBlIGhlcmUgdG8gcmV0dXJuIHRoYXQgY2xhc3MgdG8gdGhlIHVzZXIuIAotCi0vLyBUaGUgcmVhZGVyIGluaXRpYWxpemF0aW9uLiAgTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGRlZnJSZWFkKCkuCi1leHRlcm4gaW50IGRlZnJJbml0ICgpOwotZXh0ZXJuIGludCBkZWZySW5pdFNlc3Npb24gKGludCBzdGFydFNlc3Npb24gPSAxKTsKLQotLy8gb2Jzb2xldGVkIG5vdy4KLWV4dGVybiBpbnQgZGVmclJlc2V0ICgpOwotCi0vL1NldHMgYWxsIHBhcnNlciBtZW1vcnkgaW50byBpbml0IHN0YXRlLgotZXh0ZXJuIGludCBkZWZyQ2xlYXIoKTsKLQotLy8gQ2hhbmdlIHRoZSBjb21tZW50IGNoYXJhY3RlciBpbiB0aGUgREVGIGZpbGUuICBUaGUgZGVmYXVsdAotLy8gaXMgJyMnIAotZXh0ZXJuIHZvaWQgZGVmclNldENvbW1lbnRDaGFyIChjaGFyIGMpOwotCi0vLyBGdW5jdGlvbnMgdG8gY2FsbCB0byBzZXQgc3BlY2lmaWMgYWN0aW9ucyBpbiB0aGUgcGFyc2VyLgotZXh0ZXJuIHZvaWQgZGVmclNldEFkZFBhdGhUb05ldCAoKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRBbGxvd0NvbXBvbmVudE5ldHMgKCk7Ci1leHRlcm4gaW50IGRlZnJHZXRBbGxvd0NvbXBvbmVudE5ldHMgKCk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0Q2FzZVNlbnNpdGl2aXR5IChpbnQgY2FzZVNlbnNlKTsKLQotLy8gRnVuY3Rpb25zIHRvIGtlZXAgdHJhY2sgb2YgY2FsbGJhY2tzIHRoYXQgdGhlIHVzZXIgZGlkIG5vdAotLy8gc3VwcGx5LiAgTm9ybWFsbHkgYWxsIHBhcnRzIG9mIHRoZSBERUYgZmlsZSB0aGF0IHRoZSB1c2VyCi0vLyBkb2VzIG5vdCBzdXBwbHkgYSBjYWxsYmFjayBmb3Igd2lsbCBiZSBpZ25vcmVkLiAgVGhlc2UKLS8vIHJvdXRpbmVzIHRlbGwgdGhlIHBhcnNlciBjb3VudCB0aGUgREVGIGNvbnN0cnVjdHMgdGhhdCBhcmUKLS8vIHByZXNlbnQgaW4gdGhlIGlucHV0IGZpbGUsIGJ1dCBkaWQgbm90IHRyaWdnZXIgYSBjYWxsYmFjay4KLS8vIFRoaXMgc2hvdWxkIGhlbHAgeW91IGZpbmQgYW55ICJpbXBvcnRhbnQiIERFRiBjb25zdHJ1Y3RzIHRoYXQKLS8vIHlvdSBhcmUgaWdub3JpbmcuCi1leHRlcm4gdm9pZCBkZWZyU2V0UmVnaXN0ZXJVbnVzZWRDYWxsYmFja3MgKCk7Ci1leHRlcm4gdm9pZCBkZWZyUHJpbnRVbnVzZWRDYWxsYmFja3MgKEZJTEUqIGxvZyk7Ci0vLyBPYnNvbGV0ZWQgbm93LgotZXh0ZXJuIGludCAgZGVmclJlbGVhc2VOUmVzZXRNZW1vcnkgKCk7Ci0KLS8vIFRoaXMgZnVuY3Rpb24gY2xlYXIgc2Vzc2lvbiBkYXRhLgotZXh0ZXJuIHZvaWQgZGVmckNsZWFyU2Vzc2lvbigpOwotCi0vLyBUaGUgbWFpbiByZWFkZXIgZnVuY3Rpb24uCi0vLyBUaGUgZmlsZSBzaG91bGQgYWxyZWFkeSBiZSBvcGVuZWQuICBUaGlzIHJlcXVpcmVtZW50IGFsbG93cwotLy8gdGhlIHJlYWRlciB0byBiZSB1c2VkIHdpdGggc3RkaW4gb3IgYSBwaXBlLiAgVGhlIGZpbGUgbmFtZQotLy8gaXMgb25seSB1c2VkIGZvciBlcnJvciBtZXNzYWdlcy4KLWV4dGVybiBpbnQgZGVmclJlYWQgKEZJTEUgKmZpbGUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVOYW1lLAotICAgICAgICAgICAgICAgICAgICBkZWZpVXNlckRhdGEgdXNlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgIGludCBjYXNlX3NlbnNpdGl2ZSk7Ci0KLS8vIFNldC9nZXQgdGhlIGNsaWVudC1wcm92aWRlZCB1c2VyIGRhdGEuICBkZWZpIGRvZXNuJ3QgbG9vayBhdAotLy8gdGhpcyBkYXRhIGF0IGFsbCwgaXQgc2ltcGx5IHBhc3NlcyB0aGUgb3BhcXVlIGRlZmlVc2VyRGF0YSBwb2ludGVyCi0vLyBiYWNrIHRvIHRoZSBhcHBsaWNhdGlvbiB3aXRoIGVhY2ggY2FsbGJhY2suICBUaGUgY2xpZW50IGNhbgotLy8gY2hhbmdlIHRoZSBkYXRhIGF0IGFueSB0aW1lLCBhbmQgaXQgd2lsbCB0YWtlIGVmZmVjdCBvbiB0aGUKLS8vIG5leHQgY2FsbGJhY2suICBUaGUgZGVmaSByZWFkZXIgYW5kIHdyaXRlciBtYWludGFpbiBzZXBhcmF0ZQotLy8gdXNlciBkYXRhIHBvaW50ZXJzLgotZXh0ZXJuIHZvaWQgZGVmclNldFVzZXJEYXRhIChkZWZpVXNlckRhdGEpOwotZXh0ZXJuIGRlZmlVc2VyRGF0YSBkZWZyR2V0VXNlckRhdGEgKCk7Ci0KLSAKLS8vIEZ1bmN0aW9ucyB0byBjYWxsIHRvIHJlZ2lzdGVyIGEgY2FsbGJhY2sgZnVuY3Rpb24gb3IgZ2V0IHRoZSBmdW5jdGlvbgotLy9wb2ludGVyIGFmdGVyIGl0IGhhcyBiZWVuIHJlZ2lzdGVyZWQuCi0vLwotCi0vLyBSZWdpc3RlciBvbmUgZnVuY3Rpb24gZm9yIGFsbCBjYWxsYmFja3Mgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgCi1leHRlcm4gdm9pZCBkZWZyU2V0QXJyYXlOYW1lQ2JrIChkZWZyU3RyaW5nQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRBc3NlcnRpb25DYmsgKGRlZnJBc3NlcnRpb25DYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldEFzc2VydGlvbnNTdGFydENiayAoZGVmckludGVnZXJDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldEFzc2VydGlvbnNFbmRDYmsgKGRlZnJWb2lkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRCbG9ja2FnZUNiayAoZGVmckJsb2NrYWdlQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRCbG9ja2FnZVN0YXJ0Q2JrIChkZWZySW50ZWdlckNia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0QmxvY2thZ2VFbmRDYmsgKGRlZnJWb2lkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRCdXNCaXRDYmsgKGRlZnJTdHJpbmdDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldENhbm5vdE9jY3VweUNiayAoZGVmclNpdGVDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldENhbnBsYWNlQ2JrIChkZWZyU2l0ZUNia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0Q2FzZVNlbnNpdGl2ZUNiayAoZGVmckludGVnZXJDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldENvbXBvbmVudENiayAoZGVmckNvbXBvbmVudENia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0Q29tcG9uZW50RXh0Q2JrIChkZWZyU3RyaW5nQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRDb21wb25lbnRTdGFydENiayAoZGVmckludGVnZXJDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldENvbXBvbmVudEVuZENiayAoZGVmclZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldENvbnN0cmFpbnRDYmsgKGRlZnJBc3NlcnRpb25DYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldENvbnN0cmFpbnRzU3RhcnRDYmsgKGRlZnJJbnRlZ2VyQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRDb25zdHJhaW50c0VuZENiayAoZGVmclZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldERlZmF1bHRDYXBDYmsgKGRlZnJJbnRlZ2VyQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXREZXNpZ25DYmsgKGRlZnJTdHJpbmdDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldERlc2lnbkVuZENiayAoZGVmclZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldERpZUFyZWFDYmsgKGRlZnJCb3hDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldERpdmlkZXJDYmsgKGRlZnJTdHJpbmdDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldEV4dGVuc2lvbkNiayAoZGVmclN0cmluZ0Nia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0RmlsbENiayAoZGVmckZpbGxDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldEZpbGxTdGFydENiayAoZGVmckludGVnZXJDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldEZpbGxFbmRDYmsgKGRlZnJWb2lkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRGUENDYmsgKGRlZnJGUENDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldEZQQ1N0YXJ0Q2JrIChkZWZySW50ZWdlckNia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0RlBDRW5kQ2JrIChkZWZyVm9pZENia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0Rmxvb3JQbGFuTmFtZUNiayAoZGVmclN0cmluZ0Nia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0R2NlbGxHcmlkQ2JrIChkZWZyR2NlbGxHcmlkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRHcm91cE5hbWVDYmsgKGRlZnJTdHJpbmdDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldEdyb3VwTWVtYmVyQ2JrIChkZWZyU3RyaW5nQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRDb21wb25lbnRNYXNrU2hpZnRMYXllckNiayAoZGVmckNvbXBvbmVudE1hc2tTaGlmdExheWVyQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRHcm91cENiayAoZGVmckdyb3VwQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRHcm91cEV4dENiayAoZGVmclN0cmluZ0Nia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0R3JvdXBzU3RhcnRDYmsgKGRlZnJJbnRlZ2VyQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRHcm91cHNFbmRDYmsgKGRlZnJWb2lkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRIaXN0b3J5Q2JrIChkZWZyU3RyaW5nQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRJT1RpbWluZ0NiayAoZGVmcklPVGltaW5nQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRJT1RpbWluZ3NTdGFydENiayAoZGVmckludGVnZXJDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldElPVGltaW5nc0VuZENiayAoZGVmclZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldElvVGltaW5nc0V4dENiayAoZGVmclN0cmluZ0Nia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0TmV0Q2JrIChkZWZyTmV0Q2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXROZXROYW1lQ2JrIChkZWZyU3RyaW5nQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXROZXROb25EZWZhdWx0UnVsZUNiayAoZGVmclN0cmluZ0Nia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0TmV0Q29ubmVjdGlvbkV4dENiayAoZGVmclN0cmluZ0Nia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0TmV0RXh0Q2JrIChkZWZyU3RyaW5nQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXROZXRQYXJ0aWFsUGF0aENiayAoZGVmck5ldENia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0TmV0U3VibmV0TmFtZUNiayAoZGVmclN0cmluZ0Nia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0TmV0U3RhcnRDYmsgKGRlZnJJbnRlZ2VyQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXROZXRFbmRDYmsgKGRlZnJWb2lkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXROb25EZWZhdWx0Q2JrIChkZWZyTm9uRGVmYXVsdENia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0Tm9uRGVmYXVsdFN0YXJ0Q2JrIChkZWZySW50ZWdlckNia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0Tm9uRGVmYXVsdEVuZENiayAoZGVmclZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldFBhcnRpdGlvbkNiayAoZGVmclBhcnRpdGlvbkNia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0UGFydGl0aW9uc0V4dENiayAoZGVmclN0cmluZ0Nia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0UGFydGl0aW9uc1N0YXJ0Q2JrIChkZWZySW50ZWdlckNia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0UGFydGl0aW9uc0VuZENiayAoZGVmclZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldFBhdGhDYmsgKGRlZnJQYXRoQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRQaW5DYXBDYmsgKGRlZnJQaW5DYXBDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldFBpbkNiayAoZGVmclBpbkNia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0UGluRXh0Q2JrIChkZWZyU3RyaW5nQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRQaW5Qcm9wQ2JrIChkZWZyUGluUHJvcENia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0UGluUHJvcFN0YXJ0Q2JrIChkZWZySW50ZWdlckNia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0UGluUHJvcEVuZENiayAoZGVmclZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldFByb3BDYmsgKGRlZnJQcm9wQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRQcm9wRGVmRW5kQ2JrIChkZWZyVm9pZENia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0UHJvcERlZlN0YXJ0Q2JrIChkZWZyVm9pZENia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0UmVnaW9uQ2JrIChkZWZyUmVnaW9uQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRSZWdpb25TdGFydENiayAoZGVmckludGVnZXJDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldFJlZ2lvbkVuZENiayAoZGVmclZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldFJvd0NiayAoZGVmclJvd0Nia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0U05ldENiayAoZGVmck5ldENia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0U05ldFN0YXJ0Q2JrIChkZWZySW50ZWdlckNia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0U05ldEVuZENiayAoZGVmclZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldFNOZXRQYXJ0aWFsUGF0aENiayAoZGVmck5ldENia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0U05ldFdpcmVDYmsgKGRlZnJOZXRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldFNjYW5DaGFpbkV4dENiayAoZGVmclN0cmluZ0Nia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0U2NhbmNoYWluQ2JrIChkZWZyU2NhbmNoYWluQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRTY2FuY2hhaW5zU3RhcnRDYmsgKGRlZnJJbnRlZ2VyQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRTY2FuY2hhaW5zRW5kQ2JrIChkZWZyVm9pZENia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0U2l0ZUNiayAoZGVmclNpdGVDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldFNsb3RDYmsgKGRlZnJTbG90Q2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRTbG90U3RhcnRDYmsgKGRlZnJJbnRlZ2VyQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRTbG90RW5kQ2JrIChkZWZyVm9pZENia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0U3RhcnRQaW5zQ2JrIChkZWZySW50ZWdlckNia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0U3R5bGVzQ2JrIChkZWZyU3R5bGVzQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRTdHlsZXNTdGFydENiayAoZGVmckludGVnZXJDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldFN0eWxlc0VuZENiayAoZGVmclZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldFBpbkVuZENiayAoZGVmclZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldFRlY2hub2xvZ3lDYmsgKGRlZnJTdHJpbmdDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldFRpbWluZ0Rpc2FibGVDYmsgKGRlZnJUaW1pbmdEaXNhYmxlQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRUaW1pbmdEaXNhYmxlc1N0YXJ0Q2JrIChkZWZySW50ZWdlckNia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0VGltaW5nRGlzYWJsZXNFbmRDYmsgKGRlZnJWb2lkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRUcmFja0NiayAoZGVmclRyYWNrQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRVbml0c0NiayAoZGVmckRvdWJsZUNia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0VmVyc2lvbkNiayAoZGVmckRvdWJsZUNia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0VmVyc2lvblN0ckNiayAoZGVmclN0cmluZ0Nia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0VmlhQ2JrIChkZWZyVmlhQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRWaWFFeHRDYmsgKGRlZnJTdHJpbmdDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmclNldFZpYVN0YXJ0Q2JrIChkZWZySW50ZWdlckNia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0VmlhRW5kQ2JrIChkZWZyVm9pZENia0ZuVHlwZSk7Ci0KLS8vIE5FVyBDQUxMQkFDSyAtIEZvciBlYWNoIG5ldyBjYWxsYmFjayB5b3UgY3JlYXRlLCB5b3UgbXVzdAotLy8gY3JlYXRlIGEgcm91dGluZSB0aGF0IGFsbG93cyB0aGUgdXNlciB0byBzZXQgaXQuICBBZGQgdGhlCi0vLyBzZXR0aW5nIHJvdXRpbmVzIGhlcmUuIAotCi0vL1NldCBhbGwgb2YgdGhlIGNhbGxiYWNrcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIHNldCB0byB0aGUgZm9sbG93aW5nCi0vL2Z1bmN0aW9uLiAgVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBjaGVjayB0byBzZWUKLS8vaWYgeW91IGZvcmdvdCBhbnl0aGluZy4KLWV4dGVybiB2b2lkIGRlZnJVbnNldENhbGxiYWNrcyAoKTsKLQotLy8gRnVuY3Rpb25zIHRvIGNhbGwgdG8gdW5yZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uLgotZXh0ZXJuIHZvaWQgZGVmclVuc2V0QXJyYXlOYW1lQ2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0QXNzZXJ0aW9uQ2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0QXNzZXJ0aW9uc1N0YXJ0Q2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0QXNzZXJ0aW9uc0VuZENiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldEJsb2NrYWdlQ2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0QmxvY2thZ2VTdGFydENiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldEJsb2NrYWdlRW5kQ2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0QnVzQml0Q2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0Q2Fubm90T2NjdXB5Q2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0Q2FucGxhY2VDYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXRDYXNlU2Vuc2l0aXZlQ2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0Q29tcG9uZW50Q2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0Q29tcG9uZW50RXh0Q2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0Q29tcG9uZW50U3RhcnRDYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXRDb21wb25lbnRFbmRDYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXRDb25zdHJhaW50Q2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0Q29uc3RyYWludHNTdGFydENiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldENvbnN0cmFpbnRzRW5kQ2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0RGVmYXVsdENhcENiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldERlc2lnbkNiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldERlc2lnbkVuZENiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldERpZUFyZWFDYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXREaXZpZGVyQ2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0RXh0ZW5zaW9uQ2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0RmlsbENiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldEZpbGxTdGFydENiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldEZpbGxFbmRDYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXRGUENDYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXRGUENTdGFydENiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldEZQQ0VuZENiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldEZsb29yUGxhbk5hbWVDYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXRHY2VsbEdyaWRDYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXRHcm91cENiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldEdyb3VwRXh0Q2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0R3JvdXBNZW1iZXJDYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXRDb21wb25lbnRNYXNrU2hpZnRMYXllckNiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldEdyb3VwTmFtZUNiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldEdyb3Vwc1N0YXJ0Q2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0R3JvdXBzRW5kQ2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0SGlzdG9yeUNiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldElPVGltaW5nQ2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0SU9UaW1pbmdzU3RhcnRDYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXRJT1RpbWluZ3NFbmRDYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXRJT1RpbWluZ3NFeHRDYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXROZXRDYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXROZXROYW1lQ2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0TmV0Tm9uRGVmYXVsdFJ1bGVDYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXROZXRDb25uZWN0aW9uRXh0Q2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0TmV0RXh0Q2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0TmV0UGFydGlhbFBhdGhDYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXROZXRTdWJuZXROYW1lQ2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0TmV0U3RhcnRDYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXROZXRFbmRDYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXROb25EZWZhdWx0Q2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0Tm9uRGVmYXVsdFN0YXJ0Q2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0Tm9uRGVmYXVsdEVuZENiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldFBhcnRpdGlvbkNiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldFBhcnRpdGlvbnNFeHRDYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXRQYXJ0aXRpb25zU3RhcnRDYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXRQYXJ0aXRpb25zRW5kQ2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0UGF0aENiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldFBpbkNhcENiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldFBpbkNiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldFBpbkVuZENiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldFBpbkV4dENiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldFBpblByb3BDYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXRQaW5Qcm9wU3RhcnRDYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXRQaW5Qcm9wRW5kQ2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0UHJvcENiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldFByb3BEZWZFbmRDYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXRQcm9wRGVmU3RhcnRDYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXRSZWdpb25DYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXRSZWdpb25TdGFydENiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldFJlZ2lvbkVuZENiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldFJvd0NiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldFNjYW5DaGFpbkV4dENiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldFNjYW5jaGFpbkNiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldFNjYW5jaGFpbnNTdGFydENiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldFNjYW5jaGFpbnNFbmRDYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXRTaXRlQ2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0U2xvdENiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldFNsb3RTdGFydENiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldFNsb3RFbmRDYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXRTTmV0V2lyZUNiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldFNOZXRDYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXRTTmV0U3RhcnRDYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXRTTmV0RW5kQ2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0U05ldFBhcnRpYWxQYXRoQ2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0U3RhcnRQaW5zQ2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0U3R5bGVzQ2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0U3R5bGVzU3RhcnRDYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXRTdHlsZXNFbmRDYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXRUZWNobm9sb2d5Q2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0VGltaW5nRGlzYWJsZUNiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldFRpbWluZ0Rpc2FibGVzU3RhcnRDYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXRUaW1pbmdEaXNhYmxlc0VuZENiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldFRyYWNrQ2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0VW5pdHNDYmsgKCk7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXRWZXJzaW9uQ2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0VmVyc2lvblN0ckNiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldFZpYUNiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldFZpYUV4dENiayAoKTsKLWV4dGVybiB2b2lkIGRlZnJVbnNldFZpYVN0YXJ0Q2JrICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0VmlhRW5kQ2JrICgpOwotCi0vLyBSb3V0aW5lIHRvIHNldCBhbGwgdW51c2VkIGNhbGxiYWNrcy4gVGhpcyBpcyB1c2VmdWwgZm9yIGNoZWNraW5nCi0vL3RvIHNlZSBpZiB5b3UgbWlzc2VkIHNvbWV0aGluZy4gCi1leHRlcm4gdm9pZCBkZWZyU2V0VW51c2VkQ2FsbGJhY2tzIChkZWZyVm9pZENia0ZuVHlwZSBmdW5jKTsKLQotLy8gUmV0dXJuIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyIGluIHRoZSBpbnB1dCBmaWxlLiAKLWV4dGVybiBpbnQgZGVmckxpbmVOdW1iZXIgKCk7Ci1leHRlcm4gbG9uZyBsb25nIGRlZnJMb25nTGluZU51bWJlciAoKTsKLQotLy8gUm91dGluZSB0byBzZXQgdGhlIG1lc3NhZ2UgbG9nZ2luZyByb3V0aW5lIGZvciBlcnJvcnMgCi0jaWZuZGVmIERFRklfTE9HX0ZVTkNUSU9OCi0gICAgdHlwZWRlZiB2b2lkICgqREVGSV9MT0dfRlVOQ1RJT04pIChjb25zdCBjaGFyKik7Ci0jZW5kaWYKLWV4dGVybiB2b2lkIGRlZnJTZXRMb2dGdW5jdGlvbihERUZJX0xPR19GVU5DVElPTik7Ci0KLS8vIFJvdXRpbmUgdG8gc2V0IHRoZSBtZXNzYWdlIGxvZ2dpbmcgcm91dGluZSBmb3Igd2FybmluZ3MgCi0jaWZuZGVmIERFRklfV0FSTklOR19MT0dfRlVOQ1RJT04KLSAgICB0eXBlZGVmIHZvaWQgKCpERUZJX1dBUk5JTkdfTE9HX0ZVTkNUSU9OKSAoY29uc3QgY2hhciopOwotI2VuZGlmCi1leHRlcm4gdm9pZCBkZWZyU2V0V2FybmluZ0xvZ0Z1bmN0aW9uKERFRklfV0FSTklOR19MT0dfRlVOQ1RJT04pOwotCi0vLyBSb3V0aW5lIHRvIHNldCB0aGUgbWVzc2FnZSBsb2dnaW5nIHJvdXRpbmUgZm9yIGVycm9ycyAKLS8vIFVzZWQgaW4gcmUtZW50ZXJhYmxlIGVudmlyb25tZW50LgotI2lmbmRlZiBERUZJX0xPR19GVU5DVElPTgotICAgIHR5cGVkZWYgdm9pZCAoKkRFRklfQ09OVEVYVF9MT0dfRlVOQ1RJT04pIChkZWZpVXNlckRhdGEgdXNlckRhdGEsIGNvbnN0IGNoYXIqKTsKLSNlbmRpZgotZXh0ZXJuIHZvaWQgZGVmclNldENvbnRleHRMb2dGdW5jdGlvbihERUZJX0NPTlRFWFRfTE9HX0ZVTkNUSU9OKTsKLQotLy8gUm91dGluZSB0byBzZXQgdGhlIG1lc3NhZ2UgbG9nZ2luZyByb3V0aW5lIGZvciB3YXJuaW5ncyAKLS8vIFVzZWQgaW4gcmUtZW50ZXJhYmxlIGVudmlyb25tZW50LgotI2lmbmRlZiBERUZJX1dBUk5JTkdfTE9HX0ZVTkNUSU9OCi0gICAgdHlwZWRlZiB2b2lkICgqREVGSV9DT05URVhUX1dBUk5JTkdfTE9HX0ZVTkNUSU9OKSAoZGVmaVVzZXJEYXRhIHVzZXJEYXRhLCBjb25zdCBjaGFyKik7Ci0jZW5kaWYKLWV4dGVybiB2b2lkIGRlZnJTZXRDb250ZXh0V2FybmluZ0xvZ0Z1bmN0aW9uKERFRklfQ09OVEVYVF9XQVJOSU5HX0xPR19GVU5DVElPTik7Ci0KLS8vIFJvdXRpbmUgdG8gc2V0IHRoZSB1c2VyIGRlZmluZWQgbWFsbG9jIHJvdXRpbmUgCi10eXBlZGVmIHZvaWQqICgqREVGSV9NQUxMT0NfRlVOQ1RJT04pIChzaXplX3QpOwotZXh0ZXJuIHZvaWQgZGVmclNldE1hbGxvY0Z1bmN0aW9uKERFRklfTUFMTE9DX0ZVTkNUSU9OKTsKLQotLy8gUm91dGluZSB0byBzZXQgdGhlIHVzZXIgZGVmaW5lZCByZWFsbG9jIHJvdXRpbmUgCi10eXBlZGVmIHZvaWQqICgqREVGSV9SRUFMTE9DX0ZVTkNUSU9OKSAodm9pZCosIHNpemVfdCk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0UmVhbGxvY0Z1bmN0aW9uKERFRklfUkVBTExPQ19GVU5DVElPTik7Ci0KLS8vIFJvdXRpbmUgdG8gc2V0IHRoZSB1c2VyIGRlZmluZWQgZnJlZSByb3V0aW5lIAotdHlwZWRlZiB2b2lkICgqREVGSV9GUkVFX0ZVTkNUSU9OKSAodm9pZCAqKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRGcmVlRnVuY3Rpb24oREVGSV9GUkVFX0ZVTkNUSU9OKTsKLQotLy8gUm91dGluZSB0byBzZXQgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBmaWxlIHRoYXQgaXMgcGFyc2luZyByb3V0aW5lICh0YWtlcyBpbnQpCi10eXBlZGVmIHZvaWQgKCpERUZJX0xJTkVfTlVNQkVSX0ZVTkNUSU9OKSAgKGludCk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0TGluZU51bWJlckZ1bmN0aW9uKERFRklfTElORV9OVU1CRVJfRlVOQ1RJT04pOwotCi0vLyBSb3V0aW5lIHRvIHNldCB0aGUgbGluZSBudW1iZXIgb2YgdGhlIGZpbGUgdGhhdCBpcyBwYXJzaW5nIHJvdXRpbmUgKHRha2VzIGxvbmcgbG9uZykKLXR5cGVkZWYgdm9pZCAoKkRFRklfTE9OR19MSU5FX05VTUJFUl9GVU5DVElPTikgIChsb25nIGxvbmcpOwotZXh0ZXJuIHZvaWQgZGVmclNldExvbmdMaW5lTnVtYmVyRnVuY3Rpb24oREVGSV9MT05HX0xJTkVfTlVNQkVSX0ZVTkNUSU9OKTsKLQotLy8gUm91dGluZSB0byBzZXQgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBmaWxlIHRoYXQgaXMgcGFyc2luZyByb3V0aW5lICh0YWtlcyBpbnQpCi0vLyBVc2VkIGluIHJlLWVudGVyYWJsZSBlbnZpcm9ubWVudC4KLXR5cGVkZWYgdm9pZCAoKkRFRklfQ09OVEVYVF9MSU5FX05VTUJFUl9GVU5DVElPTikgIChkZWZpVXNlckRhdGEgdXNlckRhdGEsIGludCk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0Q29udGV4dExpbmVOdW1iZXJGdW5jdGlvbihERUZJX0NPTlRFWFRfTElORV9OVU1CRVJfRlVOQ1RJT04pOwotCi0vLyBSb3V0aW5lIHRvIHNldCB0aGUgbGluZSBudW1iZXIgb2YgdGhlIGZpbGUgdGhhdCBpcyBwYXJzaW5nIHJvdXRpbmUgKHRha2VzIGxvbmcgbG9uZwotLy8gVXNlZCBpbiByZS1lbnRlcmFibGUgZW52aXJvbm1lbnQuCi10eXBlZGVmIHZvaWQgKCpERUZJX0NPTlRFWFRfTE9OR19MSU5FX05VTUJFUl9GVU5DVElPTikgIChkZWZpVXNlckRhdGEgdXNlckRhdGEsIGxvbmcgbG9uZyk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0Q29udGV4dExvbmdMaW5lTnVtYmVyRnVuY3Rpb24oREVGSV9DT05URVhUX0xPTkdfTElORV9OVU1CRVJfRlVOQ1RJT04pOwotCi0vLyBTZXQgdGhlIG51bWJlciBvZiBsaW5lcyBiZWZvcmUgY2FsbGluZyB0aGUgbGluZSBmdW5jdGlvbiBjYWxsYmFjayByb3V0aW5lIAotLy8gRGVmYXVsdCBpcyAxMDAwMCAKLWV4dGVybiB2b2lkIGRlZnJTZXREZWx0YU51bWJlckxpbmVzICAoaW50KTsKLQotLy8gUm91dGluZSB0byBzZXQgdGhlIHJlYWQgZnVuY3Rpb24gCi10eXBlZGVmIHNpemVfdCAoKkRFRklfUkVBRF9GVU5DVElPTikgIChGSUxFKiwgY2hhciosIHNpemVfdCk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0UmVhZEZ1bmN0aW9uKERFRklfUkVBRF9GVU5DVElPTik7Ci1leHRlcm4gdm9pZCBkZWZyVW5zZXRSZWFkRnVuY3Rpb24gKCk7Ci0KLS8vIFJvdXRpbmUgdG8gc2V0IHRoZSBkZWZyV2FybmluZy5sb2cgdG8gb3BlbiBhcyBhcHBlbmQgaW5zdGVhZCBmb3Igd3JpdGUgCi0vLyBOZXcgaW4gNS43IAotZXh0ZXJuIHZvaWQgZGVmclNldE9wZW5Mb2dGaWxlQXBwZW5kICgpOwotZXh0ZXJuIHZvaWQgZGVmclVuc2V0T3BlbkxvZ0ZpbGVBcHBlbmQgKCk7Ci0KLS8vIFJvdXRpbmUgdG8gc2V0IHRoZSBtYWdpYyBjb21tZW50IGZvdW5kIHJvdXRpbmUgCi10eXBlZGVmIHZvaWQgKCpERUZJX01BR0lDX0NPTU1FTlRfRk9VTkRfRlVOQ1RJT04pICgpOwotZXh0ZXJuIHZvaWQgZGVmclNldE1hZ2ljQ29tbWVudEZvdW5kRnVuY3Rpb24oREVGSV9NQUdJQ19DT01NRU5UX0ZPVU5EX0ZVTkNUSU9OKTsKLQotLy8gUm91dGluZSB0byBzZXQgdGhlIG1hZ2ljIGNvbW1lbnQgc3RyaW5nIAotZXh0ZXJuIHZvaWQgZGVmclNldE1hZ2ljQ29tbWVudFN0cmluZyhjaGFyICopOwotCi0vLyBSb3V0aW5lIHRvIGRpc2FibGUgc3RyaW5nIHByb3BlcnR5IHZhbHVlIHByb2Nlc3MsIGRlZmF1bHQgaXQgd2lsbCBwcm9jZXNzIAotLy8gdGhlIHZhbHVlIHN0cmluZyAKLWV4dGVybiB2b2lkIGRlZnJEaXNhYmxlUHJvcFN0clByb2Nlc3MgKCk7Ci0KLS8vIFRlc3RpbmcgcHVycG9zZXMgb25seSAKLWV4dGVybiB2b2lkIGRlZnJTZXROTGluZXMobG9uZyBsb25nIG4pOwotCi0vLyBSb3V0aW5lIHRvIHNldCB0aGUgbWF4IG51bWJlciBvZiB3YXJuaW5ncyBmb3IgYSBwZXJ0aWN1bGFyIHNlY3Rpb24gCi0KLWV4dGVybiB2b2lkIGRlZnJTZXRBc3NlcnRpb25XYXJuaW5ncyhpbnQgd2Fybik7Ci1leHRlcm4gdm9pZCBkZWZyU2V0QmxvY2thZ2VXYXJuaW5ncyhpbnQgd2Fybik7Ci1leHRlcm4gdm9pZCBkZWZyU2V0Q2FzZVNlbnNpdGl2ZVdhcm5pbmdzKGludCB3YXJuKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRDb21wb25lbnRXYXJuaW5ncyhpbnQgd2Fybik7Ci1leHRlcm4gdm9pZCBkZWZyU2V0Q29uc3RyYWludFdhcm5pbmdzKGludCB3YXJuKTsKLWV4dGVybiB2b2lkIGRlZnJTZXREZWZhdWx0Q2FwV2FybmluZ3MoaW50IHdhcm4pOwotZXh0ZXJuIHZvaWQgZGVmclNldEdjZWxsR3JpZFdhcm5pbmdzKGludCB3YXJuKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRJT1RpbWluZ1dhcm5pbmdzKGludCB3YXJuKTsKLWV4dGVybiB2b2lkIGRlZnJTZXROZXRXYXJuaW5ncyhpbnQgd2Fybik7Ci1leHRlcm4gdm9pZCBkZWZyU2V0Tm9uRGVmYXVsdFdhcm5pbmdzKGludCB3YXJuKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRQaW5FeHRXYXJuaW5ncyhpbnQgd2Fybik7Ci1leHRlcm4gdm9pZCBkZWZyU2V0UGluV2FybmluZ3MoaW50IHdhcm4pOwotZXh0ZXJuIHZvaWQgZGVmclNldFJlZ2lvbldhcm5pbmdzKGludCB3YXJuKTsKLWV4dGVybiB2b2lkIGRlZnJTZXRSb3dXYXJuaW5ncyhpbnQgd2Fybik7Ci1leHRlcm4gdm9pZCBkZWZyU2V0U2NhbmNoYWluV2FybmluZ3MoaW50IHdhcm4pOwotZXh0ZXJuIHZvaWQgZGVmclNldFNOZXRXYXJuaW5ncyhpbnQgd2Fybik7Ci1leHRlcm4gdm9pZCBkZWZyU2V0U3R5bGVzV2FybmluZ3MoaW50IHdhcm4pOwotZXh0ZXJuIHZvaWQgZGVmclNldFRyYWNrV2FybmluZ3MoaW50IHdhcm4pOwotZXh0ZXJuIHZvaWQgZGVmclNldFVuaXRzV2FybmluZ3MoaW50IHdhcm4pOwotZXh0ZXJuIHZvaWQgZGVmclNldFZlcnNpb25XYXJuaW5ncyhpbnQgd2Fybik7Ci1leHRlcm4gdm9pZCBkZWZyU2V0VmlhV2FybmluZ3MoaW50IHdhcm4pOwotCi0vLyBIYW5kbGluZyBvdXRwdXQgbWVzc2FnZXMgCi1leHRlcm4gdm9pZCBkZWZyRGlzYWJsZVBhcnNlck1zZ3MoaW50IG5Nc2csIGludCogbXNncyk7Ci1leHRlcm4gdm9pZCBkZWZyRW5hYmxlUGFyc2VyTXNncyhpbnQgbk1zZywgaW50KiBtc2dzKTsKLWV4dGVybiB2b2lkIGRlZnJFbmFibGVBbGxNc2dzKCk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0VG90YWxNc2dMaW1pdChpbnQgdG90TnVtTXNncyk7Ci1leHRlcm4gdm9pZCBkZWZyU2V0TGltaXRQZXJNc2coaW50IG1zZ0lkLCBpbnQgbnVtTXNnKTsKLQotLy8gUmV0dXJuIGNvZGVzIGZvciB0aGUgdXNlciBjYWxsYmFja3MuCi0vL1RoZSB1c2VyIHNob3VsZCByZXR1cm4gb25lIG9mIHRoZXNlIHZhbHVlcy4gCi0jZGVmaW5lIFBBUlNFX09LIDAgICAgICAvLyBjb250aW51ZSBwYXJzaW5nIAotI2RlZmluZSBTVE9QX1BBUlNFIDEgICAgLy8gc3RvcCBwYXJzaW5nIHdpdGggbm8gZXJyb3IgbWVzc2FnZSAKLSNkZWZpbmUgUEFSU0VfRVJST1IgMiAgIC8vIHN0b3AgcGFyc2luZywgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSAKLQotLy8gQWRkIHRoaXMgYWxpYXMgdG8gdGhlIGxpc3QgZm9yIHRoZSBwYXJzZXIgICAgIAotZXh0ZXJuIHZvaWQgZGVmckFkZEFsaWFzIChjb25zdCBjaGFyKiBrZXksIAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hcmtlZCk7Ci0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1VU0VfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZnJTZXR0aW5ncy5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZnJTZXR0aW5ncy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1Njg5MWIuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZyU2V0dGluZ3MuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTMgLSAyMDE0LCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGFyYWtobWFuICQKLS8vICAkUmV2aXNpb246ICM2ICQKLS8vICAkRGF0ZTogMjAxMy8wOC8wOSAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jaW5jbHVkZSAiZGVmclNldHRpbmdzLmhwcCIKLSNpbmNsdWRlICJkZWYudGFiLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLWRlZnJTZXR0aW5ncyAqZGVmU2V0dGluZ3MgPSBOVUxMOwotCi1kZWZyU2V0dGluZ3M6OmRlZnJTZXR0aW5ncygpCi06IGRlZmlEZWx0YU51bWJlckxpbmVzKDEwMDAwKSwKLSAgQXNzZXJ0aW9uV2FybmluZ3MoOTk5KSwKLSAgQmxvY2thZ2VXYXJuaW5ncyg5OTkpLAotICBDYXNlU2Vuc2l0aXZlV2FybmluZ3MoOTk5KSwKLSAgQ29tcG9uZW50V2FybmluZ3MoOTk5KSwKLSAgQ29uc3RyYWludFdhcm5pbmdzKDk5OSksCi0gIERlZmF1bHRDYXBXYXJuaW5ncyg5OTkpLAotICBGaWxsV2FybmluZ3MoOTk5KSwKLSAgR2NlbGxHcmlkV2FybmluZ3MoOTk5KSwKLSAgSU9UaW1pbmdXYXJuaW5ncyg5OTkpLAotICBOZXRXYXJuaW5ncyg5OTkpLAotICBOb25EZWZhdWx0V2FybmluZ3MoOTk5KSwKLSAgUGluRXh0V2FybmluZ3MoOTk5KSwKLSAgUGluV2FybmluZ3MoOTk5KSwKLSAgUmVnaW9uV2FybmluZ3MoOTk5KSwKLSAgUm93V2FybmluZ3MoOTk5KSwKLSAgVHJhY2tXYXJuaW5ncyg5OTkpLAotICBTY2FuY2hhaW5XYXJuaW5ncyg5OTkpLAotICBTTmV0V2FybmluZ3MoOTk5KSwKLSAgU3R5bGVzV2FybmluZ3MoOTk5KSwKLSAgVW5pdHNXYXJuaW5ncyg5OTkpLAotICBWZXJzaW9uV2FybmluZ3MoOTk5KSwKLSAgVmlhV2FybmluZ3MoOTk5KSwKLSAgbkRETXNncygwKSwKLSAgZGlzYWJsZURNc2dzKE5VTEwpLAotICByZWFkZXJfY2FzZV9zZW5zaXRpdmVfc2V0KDApLAotICB0b3RhbERlZk1zZ0xpbWl0KDApLAotICBBZGRQYXRoVG9OZXQoMCksCi0gIEFsbG93Q29tcG9uZW50TmV0cygwKSwKLSAgQ29tbWVudENoYXIoJyMnKSwKLSAgRGlzUHJvcFN0clByb2Nlc3MoMCksCi0gIExvZ0ZpbGVBcHBlbmQoMCksCi0gIFJlYWRGdW5jdGlvbihOVUxMKSwKLSAgRXJyb3JMb2dGdW5jdGlvbihOVUxMKSwKLSAgV2FybmluZ0xvZ0Z1bmN0aW9uKE5VTEwpLAotICBDb250ZXh0RXJyb3JMb2dGdW5jdGlvbihOVUxMKSwKLSAgQ29udGV4dFdhcm5pbmdMb2dGdW5jdGlvbihOVUxMKSwKLSAgTWFnaWNDb21tZW50Rm91bmRGdW5jdGlvbihOVUxMKSwKLSAgTWFsbG9jRnVuY3Rpb24oTlVMTCksCi0gIFJlYWxsb2NGdW5jdGlvbihOVUxMKSwKLSAgRnJlZUZ1bmN0aW9uKE5VTEwpLAotICBMaW5lTnVtYmVyRnVuY3Rpb24oTlVMTCksCi0gIExvbmdMaW5lTnVtYmVyRnVuY3Rpb24oTlVMTCksCi0gIENvbnRleHRMaW5lTnVtYmVyRnVuY3Rpb24oTlVMTCksCi0gIENvbnRleHRMb25nTGluZU51bWJlckZ1bmN0aW9uKE5VTEwpCi17Ci0gICAgbWVtc2V0KE1zZ0xpbWl0LCAwLCBERUZfTVNHUyAqIHNpemVvZihpbnQpKTsKLSAgICBtZW1zZXQoVW51c2VkQ2FsbGJhY2tzLCAwLCBDQk1BWCAqIHNpemVvZihpbnQpKTsKLQotICAgIGluaXRfc3ltYm9sX3RhYmxlKCk7Ci19Ci0KLQotdm9pZCAKLWRlZnJTZXR0aW5nczo6aW5pdF9zeW1ib2xfdGFibGUoKQotewotICAgIEtleXdvcmRfc2V0WyJBTElHTiJdID0gS19BTElHTjsKLSAgICBLZXl3b3JkX3NldFsiQU5BTE9HIl0gPSBLX0FOQUxPRzsKLSAgICBLZXl3b3JkX3NldFsiQU5URU5OQU1PREVMIl0gPSBLX0FOVEVOTkFNT0RFTDsKLSAgICBLZXl3b3JkX3NldFsiQU5URU5OQVBJTkdBVEVBUkVBIl0gPSBLX0FOVEVOTkFQSU5HQVRFQVJFQTsKLSAgICBLZXl3b3JkX3NldFsiQU5URU5OQVBJTkRJRkZBUkVBIl0gPSBLX0FOVEVOTkFQSU5ESUZGQVJFQTsKLSAgICBLZXl3b3JkX3NldFsiQU5URU5OQVBJTk1BWEFSRUFDQVIiXSA9IEtfQU5URU5OQVBJTk1BWEFSRUFDQVI7Ci0gICAgS2V5d29yZF9zZXRbIkFOVEVOTkFQSU5NQVhDVVRDQVIiXSA9IEtfQU5URU5OQVBJTk1BWENVVENBUjsKLSAgICBLZXl3b3JkX3NldFsiQU5URU5OQVBJTk1BWFNJREVBUkVBQ0FSIl0gPSBLX0FOVEVOTkFQSU5NQVhTSURFQVJFQUNBUjsKLSAgICBLZXl3b3JkX3NldFsiQU5URU5OQVBJTlBBUlRJQUxDVVRBUkVBIl0gPSBLX0FOVEVOTkFQSU5QQVJUSUFMQ1VUQVJFQTsKLSAgICBLZXl3b3JkX3NldFsiQU5URU5OQVBJTlBBUlRJQUxNRVRBTEFSRUEiXSA9IEtfQU5URU5OQVBJTlBBUlRJQUxNRVRBTEFSRUE7Ci0gICAgS2V5d29yZF9zZXRbIkFOVEVOTkFQSU5QQVJUSUFMTUVUQUxTSURFQVJFQSJdID0gS19BTlRFTk5BUElOUEFSVElBTE1FVEFMU0lERUFSRUE7Ci0gICAgS2V5d29yZF9zZXRbIkFSUkFZIl0gPSBLX0FSUkFZOwotICAgIEtleXdvcmRfc2V0WyJBU1NFUlRJT05TIl0gPSBLX0FTU0VSVElPTlM7Ci0gICAgS2V5d29yZF9zZXRbIkJBTEFOQ0VEIl0gPSBLX0JBTEFOQ0VEOwotICAgIEtleXdvcmRfc2V0WyJCRUdJTkVYVCJdID0gS19CRUdJTkVYVDsKLSAgICBLZXl3b3JkX3NldFsiQkxPQ0tBR0VTIl0gPSBLX0JMT0NLQUdFUzsKLSAgICBLZXl3b3JkX3NldFsiQkxPQ0tBR0VXSVJFIl0gPSBLX0JMT0NLQUdFV0lSRTsKLSAgICBLZXl3b3JkX3NldFsiQkxPQ0tSSU5HIl0gPSBLX0JMT0NLUklORzsKLSAgICBLZXl3b3JkX3NldFsiQkxPQ0tXSVJFIl0gPSBLX0JMT0NLV0lSRTsKLSAgICBLZXl3b3JkX3NldFsiQk9UVE9NTEVGVCJdID0gS19CT1RUT01MRUZUOwotICAgIEtleXdvcmRfc2V0WyJCVVNCSVRDSEFSUyJdID0gS19CVVNCSVRDSEFSUzsKLSAgICBLZXl3b3JkX3NldFsiQlkiXSA9IEtfQlk7Ci0gICAgS2V5d29yZF9zZXRbIkNBTk5PVE9DQ1VQWSJdID0gS19DQU5OT1RPQ0NVUFk7Ci0gICAgS2V5d29yZF9zZXRbIkNBTlBMQUNFIl0gPSBLX0NBTlBMQUNFOwotICAgIEtleXdvcmRfc2V0WyJDQVBBQ0lUQU5DRSJdID0gS19DQVBBQ0lUQU5DRTsKLSAgICBLZXl3b3JkX3NldFsiQ0xPQ0siXSA9IEtfQ0xPQ0s7Ci0gICAgS2V5d29yZF9zZXRbIkNPTU1PTlNDQU5QSU5TIl0gPSBLX0NPTU1PTlNDQU5QSU5TOwotICAgIEtleXdvcmRfc2V0WyJDT01QT05FTlQiXSA9IEtfQ09NUE9ORU5UOwotICAgIEtleXdvcmRfc2V0WyJDT01QT05FTlRQSU4iXSA9IEtfQ09NUE9ORU5UUElOOwotICAgIEtleXdvcmRfc2V0WyJDT01QT05FTlRTIl0gPSBLX0NPTVBTOwotICAgIEtleXdvcmRfc2V0WyJDT01QT05FTlRNQVNLU0hJRlQiXSA9IEtfQ09NUFNNQVNLU0hJRlQ7Ci0gICAgS2V5d29yZF9zZXRbIkNPTlNUUkFJTlRTIl0gPSBLX0NPTlNUUkFJTlRTOwotICAgIEtleXdvcmRfc2V0WyJDT1JFV0lSRSJdID0gS19DT1JFV0lSRTsKLSAgICBLZXl3b3JkX3NldFsiQ09WRVIiXSA9IEtfQ09WRVI7Ci0gICAgS2V5d29yZF9zZXRbIkNVVFNJWkUiXSA9IEtfQ1VUU0laRTsKLSAgICBLZXl3b3JkX3NldFsiQ1VUU1BBQ0lORyJdID0gS19DVVRTUEFDSU5HOwotICAgIEtleXdvcmRfc2V0WyJERUZBVUxUQ0FQIl0gPSBLX0RFRkFVTFRDQVA7Ci0gICAgS2V5d29yZF9zZXRbIkRFU0lHTiJdID0gS19ERVNJR047Ci0gICAgS2V5d29yZF9zZXRbIkRFU0lHTlJVTEVXSURUSCJdID0gS19ERVNJR05SVUxFV0lEVEg7Ci0gICAgS2V5d29yZF9zZXRbIkRJQUdXSURUSCJdID0gS19ESUFHV0lEVEg7Ci0gICAgS2V5d29yZF9zZXRbIkRJRUFSRUEiXSA9IEtfRElFQVJFQTsKLSAgICBLZXl3b3JkX3NldFsiRElGRiJdID0gS19ESUZGOwotICAgIEtleXdvcmRfc2V0WyJESVJFQ1RJT04iXSA9IEtfRElSRUNUSU9OOwotICAgIEtleXdvcmRfc2V0WyJESVNUIl0gPSBLX0RJU1Q7Ci0gICAgS2V5d29yZF9zZXRbIkRJU1RBTkNFIl0gPSBLX0RJU1RBTkNFOwotICAgIEtleXdvcmRfc2V0WyJESVZJREVSQ0hBUiJdID0gS19ESVZJREVSQ0hBUjsKLSAgICBLZXl3b3JkX3NldFsiRE8iXSA9IEtfRE87Ci0gICAgS2V5d29yZF9zZXRbIkRSQ0ZJTEwiXSA9IEtfRFJDRklMTDsKLSAgICBLZXl3b3JkX3NldFsiRFJJVkVDRUxMIl0gPSBLX0RSSVZFQ0VMTDsKLSAgICBLZXl3b3JkX3NldFsiRSJdID0gS19FOwotICAgIEtleXdvcmRfc2V0WyJFRVFNQVNURVIiXSA9IEtfRUVRTUFTVEVSOwotICAgIEtleXdvcmRfc2V0WyJFTkNMT1NVUkUiXSA9IEtfRU5DTE9TVVJFOwotICAgIEtleXdvcmRfc2V0WyJFTkQiXSA9IEtfRU5EOwotICAgIEtleXdvcmRfc2V0WyJFTkRFWFQiXSA9IEtfRU5ERVhUOwotICAgIEtleXdvcmRfc2V0WyJFUVVBTCJdID0gS19FUVVBTDsKLSAgICBLZXl3b3JkX3NldFsiRVhDRVBUUEdORVQiXSA9IEtfRVhDRVBUUEdORVQ7Ci0gICAgS2V5d29yZF9zZXRbIkVTVENBUCJdID0gS19FU1RDQVA7Ci0gICAgS2V5d29yZF9zZXRbIkZBTEwiXSA9IEtfRkFMTDsKLSAgICBLZXl3b3JkX3NldFsiRkFMTE1BWCJdID0gS19GQUxMTUFYOwotICAgIEtleXdvcmRfc2V0WyJGQUxMTUlOIl0gPSBLX0ZBTExNSU47Ci0gICAgS2V5d29yZF9zZXRbIkZFIl0gPSBLX0ZFOwotICAgIEtleXdvcmRfc2V0WyJGRU5DRSJdID0gS19GRU5DRTsKLSAgICBLZXl3b3JkX3NldFsiRklMTFMiXSA9IEtfRklMTFM7Ci0gICAgS2V5d29yZF9zZXRbIkZJTExXSVJFIl0gPSBLX0ZJTExXSVJFOwotICAgIEtleXdvcmRfc2V0WyJGSUxMV0lSRU9QQyJdID0gS19GSUxMV0lSRU9QQzsKLSAgICBLZXl3b3JkX3NldFsiRklYRUQiXSA9IEtfRklYRUQ7Ci0gICAgS2V5d29yZF9zZXRbIkZJWEVEQlVNUCJdID0gS19GSVhFREJVTVA7Ci0gICAgS2V5d29yZF9zZXRbIkZMT0FUSU5HIl0gPSBLX0ZMT0FUSU5HOwotICAgIEtleXdvcmRfc2V0WyJGTE9PUlBMQU5DT05TVFJBSU5UUyJdID0gS19GUEM7Ci0gICAgS2V5d29yZF9zZXRbIkZOIl0gPSBLX0ZOOwotICAgIEtleXdvcmRfc2V0WyJGT0xMT1dQSU4iXSA9IEtfRk9MTE9XUElOOwotICAgIEtleXdvcmRfc2V0WyJGT1JFSUdOIl0gPSBLX0ZPUkVJR047Ci0gICAgS2V5d29yZF9zZXRbIkZSRVFVRU5DWSJdID0gS19GUkVRVUVOQ1k7Ci0gICAgS2V5d29yZF9zZXRbIkZST01DTE9DS1BJTiJdID0gS19GUk9NQ0xPQ0tQSU47Ci0gICAgS2V5d29yZF9zZXRbIkZST01DT01QUElOIl0gPSBLX0ZST01DT01QUElOOwotICAgIEtleXdvcmRfc2V0WyJGUk9NSU9QSU4iXSA9IEtfRlJPTUlPUElOOwotICAgIEtleXdvcmRfc2V0WyJGUk9NUElOIl0gPSBLX0ZST01QSU47Ci0gICAgS2V5d29yZF9zZXRbIkZTIl0gPSBLX0ZTOwotICAgIEtleXdvcmRfc2V0WyJGVyJdID0gS19GVzsKLSAgICBLZXl3b3JkX3NldFsiR0NFTExHUklEIl0gPSBLX0dDRUxMR1JJRDsKLSAgICBLZXl3b3JkX3NldFsiR0VORVJBVEUiXSA9IEtfQ09NUF9HRU47Ci0gICAgS2V5d29yZF9zZXRbIkdVSURFIl0gPSBLX0dVSURFOwotICAgIEtleXdvcmRfc2V0WyJHUk9VTkQiXSA9IEtfR1JPVU5EOwotICAgIEtleXdvcmRfc2V0WyJHUk9VTkRTRU5TSVRJVklUWSJdID0gS19HUk9VTkRTRU5TSVRJVklUWTsKLSAgICBLZXl3b3JkX3NldFsiR1JPVVAiXSA9IEtfR1JPVVA7Ci0gICAgS2V5d29yZF9zZXRbIkdST1VQUyJdID0gS19HUk9VUFM7Ci0gICAgS2V5d29yZF9zZXRbIkZMT09SUExBTiJdID0gS19GTE9PUlBMQU47Ci0gICAgS2V5d29yZF9zZXRbIkhBTE8iXSA9IEtfSEFMTzsKLSAgICBLZXl3b3JkX3NldFsiSEFSRFNQQUNJTkciXSA9IEtfSEFSRFNQQUNJTkc7Ci0gICAgS2V5d29yZF9zZXRbIkhJU1RPUlkiXSA9IEtfSElTVE9SWTsKLSAgICBLZXl3b3JkX3NldFsiSE9MRFJJU0UiXSA9IEtfSE9MRFJJU0U7Ci0gICAgS2V5d29yZF9zZXRbIkhPTERGQUxMIl0gPSBLX0hPTERGQUxMOwotICAgIEtleXdvcmRfc2V0WyJIT1JJWk9OVEFMIl0gPSBLX0hPUklaT05UQUw7Ci0gICAgS2V5d29yZF9zZXRbIklOIl0gPSBLX0lOOwotICAgIEtleXdvcmRfc2V0WyJJTlRFR0VSIl0gPSBLX0lOVEVHRVI7Ci0gICAgS2V5d29yZF9zZXRbIklPVElNSU5HUyJdID0gS19JT1RJTUlOR1M7Ci0gICAgS2V5d29yZF9zZXRbIklPV0lSRSJdID0gS19JT1dJUkU7Ci0gICAgS2V5d29yZF9zZXRbIkxBWUVSIl0gPSBLX0xBWUVSOwotICAgIEtleXdvcmRfc2V0WyJMQVlFUlMiXSA9IEtfTEFZRVJTOwotICAgIEtleXdvcmRfc2V0WyJNQVNLIl0gPSBLX01BU0s7Ci0gICAgS2V5d29yZF9zZXRbIk1BU0tTSElGVCJdID0gS19NQVNLU0hJRlQ7Ci0gICAgS2V5d29yZF9zZXRbIk1BWCJdID0gS19NQVg7Ci0gICAgS2V5d29yZF9zZXRbIk1BWEJJVFMiXSA9IEtfTUFYQklUUzsKLSAgICBLZXl3b3JkX3NldFsiTUFYRElTVCJdID0gS19NQVhESVNUOwotICAgIEtleXdvcmRfc2V0WyJNQVhIQUxGUEVSSU1FVEVSIl0gPSBLX01BWEhBTEZQRVJJTUVURVI7Ci0gICAgS2V5d29yZF9zZXRbIk1BWFgiXSA9IEtfTUFYWDsKLSAgICBLZXl3b3JkX3NldFsiTUFYWSJdID0gS19NQVhZOwotICAgIEtleXdvcmRfc2V0WyJNSUNST05TIl0gPSBLX01JQ1JPTlM7Ci0gICAgS2V5d29yZF9zZXRbIk1JTiJdID0gS19NSU47Ci0gICAgS2V5d29yZF9zZXRbIk1JTkNVVFMiXSA9IEtfTUlOQ1VUUzsKLSAgICBLZXl3b3JkX3NldFsiTUlOUElOUyJdID0gS19NSU5QSU5TOwotICAgIEtleXdvcmRfc2V0WyJNVVNUSk9JTiJdID0gS19NVVNUSk9JTjsKLSAgICBLZXl3b3JkX3NldFsiTiJdID0gS19OOwotICAgIEtleXdvcmRfc2V0WyJOQU1FU0NBU0VTRU5TSVRJVkUiXSA9IEtfTkFNRVNDQVNFU0VOU0lUSVZFOwotICAgIEtleXdvcmRfc2V0WyJOQU1FTUFQU1RSSU5HIl0gPSBLX05BTUVNQVBTVFJJTkc7Ci0gICAgS2V5d29yZF9zZXRbIk5FVCJdID0gS19ORVQ7Ci0gICAgS2V5d29yZF9zZXRbIk5FVEVYUFIiXSA9IEtfTkVURVhQUjsKLSAgICBLZXl3b3JkX3NldFsiTkVUUyJdID0gS19ORVRTOwotICAgIEtleXdvcmRfc2V0WyJORVRMSVNUIl0gPSBLX05FVExJU1Q7Ci0gICAgS2V5d29yZF9zZXRbIk5FVyJdID0gS19ORVc7Ci0gICAgS2V5d29yZF9zZXRbIk5PTkRFRkFVTFRSVUxFIl0gPSBLX05PTkRFRkFVTFRSVUxFOwotICAgIEtleXdvcmRfc2V0WyJOT05ERUZBVUxUUlVMRVMiXSA9IEtfTk9OREVGQVVMVFJVTEVTOwotICAgIEtleXdvcmRfc2V0WyJOT1NISUVMRCJdID0gS19OT1NISUVMRDsKLSAgICBLZXl3b3JkX3NldFsiT04iXSA9IEtfT047Ci0gICAgS2V5d29yZF9zZXRbIk9GRiJdID0gS19PRkY7Ci0gICAgS2V5d29yZF9zZXRbIk9GRlNFVCJdID0gS19PRkZTRVQ7Ci0gICAgS2V5d29yZF9zZXRbIk9QQyJdID0gS19PUEM7Ci0gICAgS2V5d29yZF9zZXRbIk9SREVSRUQiXSA9IEtfT1JERVJFRDsKLSAgICBLZXl3b3JkX3NldFsiT1JJR0lOIl0gPSBLX09SSUdJTjsKLSAgICBLZXl3b3JkX3NldFsiT1JJR0lOQUwiXSA9IEtfT1JJR0lOQUw7Ci0gICAgS2V5d29yZF9zZXRbIk9VVCJdID0gS19PVVQ7Ci0gICAgS2V5d29yZF9zZXRbIk9YSURFMSJdID0gS19PWElERTE7Ci0gICAgS2V5d29yZF9zZXRbIk9YSURFMiJdID0gS19PWElERTI7Ci0gICAgS2V5d29yZF9zZXRbIk9YSURFMyJdID0gS19PWElERTM7Ci0gICAgS2V5d29yZF9zZXRbIk9YSURFNCJdID0gS19PWElERTQ7Ci0gICAgS2V5d29yZF9zZXRbIlBBRFJJTkciXSA9IEtfUEFEUklORzsKLSAgICBLZXl3b3JkX3NldFsiUEFSVElBTCJdID0gS19QQVJUSUFMOwotICAgIEtleXdvcmRfc2V0WyJQQVJUSVRJT04iXSA9IEtfUEFSVElUSU9OOwotICAgIEtleXdvcmRfc2V0WyJQQVJBTExFTCJdID0gS19QQVJBTExFTDsKLSAgICBLZXl3b3JkX3NldFsiUEFSVElUSU9OUyJdID0gS19QQVJUSVRJT05TOwotICAgIEtleXdvcmRfc2V0WyJQQVRIIl0gPSBLX1BBVEg7Ci0gICAgS2V5d29yZF9zZXRbIlBBVFRFUk4iXSA9IEtfUEFUVEVSTjsKLSAgICBLZXl3b3JkX3NldFsiUEFUVEVSTk5BTUUiXSA9IEtfUEFUVEVSTk5BTUU7Ci0gICAgS2V5d29yZF9zZXRbIlBJTiJdID0gS19QSU47Ci0gICAgS2V5d29yZF9zZXRbIlBJTlBST1BFUlRJRVMiXSA9IEtfUElOUFJPUEVSVElFUzsKLSAgICBLZXl3b3JkX3NldFsiUElOUyJdID0gS19QSU5TOwotICAgIEtleXdvcmRfc2V0WyJQTEFDRUQiXSA9IEtfUExBQ0VEOwotICAgIEtleXdvcmRfc2V0WyJQTEFDRU1FTlQiXSA9IEtfUExBQ0VNRU5UOwotICAgIEtleXdvcmRfc2V0WyJQT0xZR09OIl0gPSBLX1BPTFlHT047Ci0gICAgS2V5d29yZF9zZXRbIlBPUlQiXSA9IEtfUE9SVDsKLSAgICBLZXl3b3JkX3NldFsiUE9XRVIiXSA9IEtfUE9XRVI7Ci0gICAgS2V5d29yZF9zZXRbIlBST1BFUlRZIl0gPSBLX1BST1BFUlRZOwotICAgIEtleXdvcmRfc2V0WyJQUk9QRVJUWURFRklOSVRJT05TIl0gPSBLX1BST1BFUlRZREVGSU5JVElPTlM7Ci0gICAgS2V5d29yZF9zZXRbIlBVU0hET1dOIl0gPSBLX1BVU0hET1dOOwotICAgIEtleXdvcmRfc2V0WyJSQU5HRSJdID0gS19SQU5HRTsKLSAgICBLZXl3b3JkX3NldFsiUkVBTCJdID0gS19SRUFMOwotICAgIEtleXdvcmRfc2V0WyJSRUNUIl0gPSBLX1JFQ1Q7Ci0gICAgS2V5d29yZF9zZXRbIlJFRU5UUkFOVFBBVEhTIl0gPSBLX1JFRU5UUkFOVFBBVEhTOwotICAgIEtleXdvcmRfc2V0WyJSRUdJT04iXSA9IEtfUkVHSU9OOwotICAgIEtleXdvcmRfc2V0WyJSRUdJT05TIl0gPSBLX1JFR0lPTlM7Ci0gICAgS2V5d29yZF9zZXRbIlJFU0VUIl0gPSBLX1JFU0VUOwotICAgIEtleXdvcmRfc2V0WyJSSU5HIl0gPSBLX1JJTkc7Ci0gICAgS2V5d29yZF9zZXRbIlJJU0UiXSA9IEtfUklTRTsKLSAgICBLZXl3b3JkX3NldFsiUklTRU1BWCJdID0gS19SSVNFTUFYOwotICAgIEtleXdvcmRfc2V0WyJSSVNFTUlOIl0gPSBLX1JJU0VNSU47Ci0gICAgS2V5d29yZF9zZXRbIlJPVVRFRCJdID0gS19ST1VURUQ7Ci0gICAgS2V5d29yZF9zZXRbIlJPVVRFSEFMTyJdID0gS19ST1VURUhBTE87Ci0gICAgS2V5d29yZF9zZXRbIlJPVyJdID0gS19ST1c7Ci0gICAgS2V5d29yZF9zZXRbIlJPV0NPTCJdID0gS19ST1dDT0w7Ci0gICAgS2V5d29yZF9zZXRbIlJPV1MiXSA9IEtfUk9XUzsKLSAgICBLZXl3b3JkX3NldFsiUyJdID0gS19TOwotICAgIEtleXdvcmRfc2V0WyJTQU1FTUFTSyJdID0gS19TQU1FTUFTSzsKLSAgICBLZXl3b3JkX3NldFsiU0NBTiJdID0gS19TQ0FOOwotICAgIEtleXdvcmRfc2V0WyJTQ0FOQ0hBSU5TIl0gPSBLX1NDQU5DSEFJTlM7Ci0gICAgS2V5d29yZF9zZXRbIlNFVFVQRkFMTCJdID0gS19TRVRVUEZBTEw7Ci0gICAgS2V5d29yZF9zZXRbIlNFVFVQUklTRSJdID0gS19TRVRVUFJJU0U7Ci0gICAgS2V5d29yZF9zZXRbIlNIQVBFIl0gPSBLX1NIQVBFOwotICAgIEtleXdvcmRfc2V0WyJTSElFTEQiXSA9IEtfU0hJRUxEOwotICAgIEtleXdvcmRfc2V0WyJTSElFTERORVQiXSA9IEtfU0hJRUxETkVUOwotICAgIEtleXdvcmRfc2V0WyJTSUdOQUwiXSA9IEtfU0lHTkFMOwotICAgIEtleXdvcmRfc2V0WyJTSVRFIl0gPSBLX1NJVEU7Ci0gICAgS2V5d29yZF9zZXRbIlNMRVdSQVRFIl0gPSBLX1NMRVdSQVRFOwotICAgIEtleXdvcmRfc2V0WyJTTE9UUyJdID0gS19TTE9UUzsKLSAgICBLZXl3b3JkX3NldFsiU09GVCJdID0gS19TT0ZUOwotICAgIEtleXdvcmRfc2V0WyJTT1VSQ0UiXSA9IEtfU09VUkNFOwotICAgIEtleXdvcmRfc2V0WyJTUEFDSU5HIl0gPSBLX1NQQUNJTkc7Ci0gICAgS2V5d29yZF9zZXRbIlNQRUNJQUwiXSA9IEtfU1BFQ0lBTDsKLSAgICBLZXl3b3JkX3NldFsiU1BFQ0lBTE5FVCJdID0gS19TTkVUOwotICAgIEtleXdvcmRfc2V0WyJTUEVDSUFMTkVUUyJdID0gS19TTkVUUzsKLSAgICBLZXl3b3JkX3NldFsiU1RBUlQiXSA9IEtfU1RBUlQ7Ci0gICAgS2V5d29yZF9zZXRbIlNURUlORVIiXSA9IEtfU1RFSU5FUjsKLSAgICBLZXl3b3JkX3NldFsiU1RFUCJdID0gS19TVEVQOwotICAgIEtleXdvcmRfc2V0WyJTVE9QIl0gPSBLX1NUT1A7Ci0gICAgS2V5d29yZF9zZXRbIlNUUklORyJdID0gS19TVFJJTkc7Ci0gICAgS2V5d29yZF9zZXRbIlNUUklQRSJdID0gS19TVFJJUEU7Ci0gICAgS2V5d29yZF9zZXRbIlNUWUxFIl0gPSBLX1NUWUxFOwotICAgIEtleXdvcmRfc2V0WyJTVFlMRVMiXSA9IEtfU1RZTEVTOwotICAgIEtleXdvcmRfc2V0WyJTVUJORVQiXSA9IEtfU1VCTkVUOwotICAgIEtleXdvcmRfc2V0WyJTVU0iXSA9IEtfU1VNOwotICAgIEtleXdvcmRfc2V0WyJTVVBQTFlTRU5TSVRJVklUWSJdID0gS19TVVBQTFlTRU5TSVRJVklUWTsKLSAgICBLZXl3b3JkX3NldFsiU1lOVEhFU0laRUQiXSA9IEtfU1lOVEhFU0laRUQ7Ci0gICAgS2V5d29yZF9zZXRbIlRBUEVSIl0gPSBLX1RBUEVSOwotICAgIEtleXdvcmRfc2V0WyJUQVBFUlJVTEUiXSA9IEtfVEFQRVJSVUxFOwotICAgIEtleXdvcmRfc2V0WyJURUNITk9MT0dZIl0gPSBLX1RFQ0g7Ci0gICAgS2V5d29yZF9zZXRbIlRFU1QiXSA9IEtfVEVTVDsKLSAgICBLZXl3b3JkX3NldFsiVElFT0ZGIl0gPSBLX1RJRU9GRjsKLSAgICBLZXl3b3JkX3NldFsiVElNSU5HIl0gPSBLX1RJTUlORzsKLSAgICBLZXl3b3JkX3NldFsiVElNSU5HRElTQUJMRVMiXSA9IEtfVElNSU5HRElTQUJMRVM7Ci0gICAgS2V5d29yZF9zZXRbIlRPQ0xPQ0tQSU4iXSA9IEtfVE9DTE9DS1BJTjsKLSAgICBLZXl3b3JkX3NldFsiVE9DT01QUElOIl0gPSBLX1RPQ09NUFBJTjsKLSAgICBLZXl3b3JkX3NldFsiVE9JT1BJTiJdID0gS19UT0lPUElOOwotICAgIEtleXdvcmRfc2V0WyJUT1BJTiJdID0gS19UT1BJTjsKLSAgICBLZXl3b3JkX3NldFsiVE9QUklHSFQiXSA9IEtfVE9QUklHSFQ7Ci0gICAgS2V5d29yZF9zZXRbIlRSQUNLUyJdID0gS19UUkFDS1M7Ci0gICAgS2V5d29yZF9zZXRbIlRSVU5LIl0gPSBLX1RSVU5LOwotICAgIEtleXdvcmRfc2V0WyJUVVJOT0ZGIl0gPSBLX1RVUk5PRkY7Ci0gICAgS2V5d29yZF9zZXRbIlRZUEUiXSA9IEtfVFlQRTsKLSAgICBLZXl3b3JkX3NldFsiVU5JVFMiXSA9IEtfVU5JVFM7Ci0gICAgS2V5d29yZF9zZXRbIlVOUExBQ0VEIl0gPSBLX1VOUExBQ0VEOwotICAgIEtleXdvcmRfc2V0WyJVU0UiXSA9IEtfVVNFOwotICAgIEtleXdvcmRfc2V0WyJVU0VSIl0gPSBLX1VTRVI7Ci0gICAgS2V5d29yZF9zZXRbIlZBUklBQkxFIl0gPSBLX1ZBUklBQkxFOwotICAgIEtleXdvcmRfc2V0WyJWRVJTSU9OIl0gPSBLX1ZFUlNJT047Ci0gICAgS2V5d29yZF9zZXRbIlZFUlRJQ0FMIl0gPSBLX1ZFUlRJQ0FMOwotICAgIEtleXdvcmRfc2V0WyJWSUEiXSA9IEtfVklBOwotICAgIEtleXdvcmRfc2V0WyJWSUFSVUxFIl0gPSBLX1ZJQVJVTEU7Ci0gICAgS2V5d29yZF9zZXRbIlZJQVMiXSA9IEtfVklBUzsKLSAgICBLZXl3b3JkX3NldFsiVklSVFVBTCJdID0gS19WSVJUVUFMOwotICAgIEtleXdvcmRfc2V0WyJWT0xUQUdFIl0gPSBLX1ZPTFRBR0U7Ci0gICAgS2V5d29yZF9zZXRbIlZQSU4iXSA9IEtfVlBJTjsKLSAgICBLZXl3b3JkX3NldFsiVyJdID0gS19XOwotICAgIEtleXdvcmRfc2V0WyJXRUlHSFQiXSA9IEtfV0VJR0hUOwotICAgIEtleXdvcmRfc2V0WyJXSURUSCJdID0gS19XSURUSDsKLSAgICBLZXl3b3JkX3NldFsiV0lSRUNBUCJdID0gS19XSVJFQ0FQOwotICAgIEtleXdvcmRfc2V0WyJXSVJFRVhUIl0gPSBLX1dJUkVFWFQ7Ci0gICAgS2V5d29yZF9zZXRbIldJUkVETE9HSUMiXSA9IEtfV0lSRURMT0dJQzsKLSAgICBLZXl3b3JkX3NldFsiWCJdID0gS19YOwotICAgIEtleXdvcmRfc2V0WyJYVEFMSyJdID0gS19YVEFMSzsKLSAgICBLZXl3b3JkX3NldFsiWSJdID0gS19ZOwotfQotCi1kZWZyU2Vzc2lvbjo6ZGVmclNlc3Npb24oKSAKLTogcmVhZGVyX2Nhc2Vfc2Vuc2l0aXZlKDApLAotICBGaWxlTmFtZSgwKSwKLSAgVXNlckRhdGEoTlVMTCkKLXsKLX0KLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZnJTZXR0aW5ncy5ocHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZnJTZXR0aW5ncy5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYTc4MzEuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZyU2V0dGluZ3MuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTMtMjAxNCwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBhcmFraG1hbiAkCi0vLyAgJFJldmlzaW9uOiAjNiAkCi0vLyAgJERhdGU6IDIwMTMvMDgvMDkgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaWZuZGVmIGRlZnJTZXR0aW5nc19oCi0jZGVmaW5lIGRlZnJTZXR0aW5nc19oCi0KLSNpbmNsdWRlICJkZWZyUmVhZGVyLmhwcCIKLQotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPG1hcD4KLQotI2RlZmluZSBERUZfREVCVUdfSURTIDEwMAotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1zdHJ1Y3QgZGVmQ29tcGFyZUNTdHJpbmdzIAotewotICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBsaHMsIGNvbnN0IGNoYXIqIHJocykgY29uc3QgewotICAgICAgICByZXR1cm4gc3RkOjpzdHJjbXAobGhzLCByaHMpIDwgMDsKLSAgICB9Ci19OwotCi10eXBlZGVmIHN0ZDo6bWFwPGNvbnN0IGNoYXIqLCBpbnQsIGRlZkNvbXBhcmVDU3RyaW5ncz4gIGRlZktleXdvcmRNYXA7Ci0KLWNsYXNzIGRlZnJTZXR0aW5ncyB7Ci1wdWJsaWM6Ci0gICAgZGVmclNldHRpbmdzKCk7Ci0KLSAgICB2b2lkIGluaXRfc3ltYm9sX3RhYmxlKCk7Ci0KLSAgICBkZWZLZXl3b3JkTWFwIEtleXdvcmRfc2V0OyAKLQotICAgIGludCBkZWZpRGVsdGFOdW1iZXJMaW5lczsKLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vCi0gICAgLy8gICAgICAgRmxhZ3MgdG8gY29udHJvbCBudW1iZXIgb2Ygd2FybmluZ3MgdG8gcHJpbnQgb3V0LCBtYXggd2lsbCBiZSA5OTkKLSAgICAvLwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgaW50IEFzc2VydGlvbldhcm5pbmdzOwotICAgIGludCBCbG9ja2FnZVdhcm5pbmdzOwotICAgIGludCBDYXNlU2Vuc2l0aXZlV2FybmluZ3M7Ci0gICAgaW50IENvbXBvbmVudFdhcm5pbmdzOwotICAgIGludCBDb25zdHJhaW50V2FybmluZ3M7Ci0gICAgaW50IERlZmF1bHRDYXBXYXJuaW5nczsKLSAgICBpbnQgRmlsbFdhcm5pbmdzOwotICAgIGludCBHY2VsbEdyaWRXYXJuaW5nczsKLSAgICBpbnQgSU9UaW1pbmdXYXJuaW5nczsKLSAgICBpbnQgTG9nRmlsZUFwcGVuZDsgCi0gICAgaW50IE5ldFdhcm5pbmdzOwotICAgIGludCBOb25EZWZhdWx0V2FybmluZ3M7Ci0gICAgaW50IFBpbkV4dFdhcm5pbmdzOwotICAgIGludCBQaW5XYXJuaW5nczsKLSAgICBpbnQgUmVnaW9uV2FybmluZ3M7Ci0gICAgaW50IFJvd1dhcm5pbmdzOwotICAgIGludCBUcmFja1dhcm5pbmdzOwotICAgIGludCBTY2FuY2hhaW5XYXJuaW5nczsKLSAgICBpbnQgU05ldFdhcm5pbmdzOwotICAgIGludCBTdHlsZXNXYXJuaW5nczsKLSAgICBpbnQgVW5pdHNXYXJuaW5nczsKLSAgICBpbnQgVmVyc2lvbldhcm5pbmdzOwotICAgIGludCBWaWFXYXJuaW5nczsKLQotICAgIGludCAgbkRETXNnczsgCi0gICAgaW50KiBkaXNhYmxlRE1zZ3M7Ci0gICAgaW50ICB0b3RhbERlZk1zZ0xpbWl0OyAvLyB0byBzYXZlIHRoZSB1c2VyIHNldCB0b3RhbCBtc2cgbGltaXQgdG8gb3V0cHV0Ci0gICAgaW50IEFkZFBhdGhUb05ldDsKLSAgICBpbnQgQWxsb3dDb21wb25lbnROZXRzOwotICAgIGNoYXIgQ29tbWVudENoYXI7Ci0gICAgaW50IERpc1Byb3BTdHJQcm9jZXNzOyAKLQotICAgIGludCByZWFkZXJfY2FzZV9zZW5zaXRpdmVfc2V0OwotCi0gICAgREVGSV9SRUFEX0ZVTkNUSU9OIFJlYWRGdW5jdGlvbjsKLSAgICBERUZJX0xPR19GVU5DVElPTiBFcnJvckxvZ0Z1bmN0aW9uOwotICAgIERFRklfV0FSTklOR19MT0dfRlVOQ1RJT04gV2FybmluZ0xvZ0Z1bmN0aW9uOwotICAgIERFRklfQ09OVEVYVF9MT0dfRlVOQ1RJT04gQ29udGV4dEVycm9yTG9nRnVuY3Rpb247Ci0gICAgREVGSV9DT05URVhUX1dBUk5JTkdfTE9HX0ZVTkNUSU9OIENvbnRleHRXYXJuaW5nTG9nRnVuY3Rpb247Ci0gICAgREVGSV9NQUdJQ19DT01NRU5UX0ZPVU5EX0ZVTkNUSU9OIE1hZ2ljQ29tbWVudEZvdW5kRnVuY3Rpb247Ci0gICAgREVGSV9NQUxMT0NfRlVOQ1RJT04gTWFsbG9jRnVuY3Rpb247Ci0gICAgREVGSV9SRUFMTE9DX0ZVTkNUSU9OIFJlYWxsb2NGdW5jdGlvbjsKLSAgICBERUZJX0ZSRUVfRlVOQ1RJT04gRnJlZUZ1bmN0aW9uOwotICAgIERFRklfTElORV9OVU1CRVJfRlVOQ1RJT04gTGluZU51bWJlckZ1bmN0aW9uOwotICAgIERFRklfTE9OR19MSU5FX05VTUJFUl9GVU5DVElPTiBMb25nTGluZU51bWJlckZ1bmN0aW9uOwotICAgIERFRklfQ09OVEVYVF9MSU5FX05VTUJFUl9GVU5DVElPTiBDb250ZXh0TGluZU51bWJlckZ1bmN0aW9uOwotICAgIERFRklfQ09OVEVYVF9MT05HX0xJTkVfTlVNQkVSX0ZVTkNUSU9OIENvbnRleHRMb25nTGluZU51bWJlckZ1bmN0aW9uOwotCi0gICAgaW50IFVudXNlZENhbGxiYWNrc1tDQk1BWF07Ci0gICAgaW50IE1zZ0xpbWl0W0RFRl9NU0dTXTsKLX07Ci0KLQotY2xhc3MgZGVmclNlc3Npb24gewotcHVibGljOgotICAgIGRlZnJTZXNzaW9uKCk7Ci0KLSAgICBjaGFyKiAgICAgICAgICAgRmlsZU5hbWU7Ci0gICAgaW50ICAgICAgICAgICAgIHJlYWRlcl9jYXNlX3NlbnNpdGl2ZTsKLSAgICBkZWZpVXNlckRhdGEgICAgVXNlckRhdGE7Ci0KLSAgICBkZWZpUHJvcFR5cGUgICAgQ29tcFByb3A7Ci0gICAgZGVmaVByb3BUeXBlICAgIENvbXBQaW5Qcm9wOwotICAgIGRlZmlQcm9wVHlwZSAgICBEZXNpZ25Qcm9wOwotICAgIGRlZmlQcm9wVHlwZSAgICBHcm91cFByb3A7Ci0gICAgZGVmaVByb3BUeXBlICAgIE5EZWZQcm9wOwotICAgIGRlZmlQcm9wVHlwZSAgICBOZXRQcm9wOwotICAgIGRlZmlQcm9wVHlwZSAgICBSZWdpb25Qcm9wOwotICAgIGRlZmlQcm9wVHlwZSAgICBSb3dQcm9wOwotICAgIGRlZmlQcm9wVHlwZSAgICBTTmV0UHJvcDsKLX07Ci0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmd1dyaXRlci5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZndXcml0ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjI3NmI1Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvZGVmd1dyaXRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2OTE4ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0KLS8vIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIGZvciBpbXBsZW1lbnRpbmcgdGhlIGRlZndyaXRlciA1LjMKLS8vIEl0IGhhcyBhbGwgdGhlIGZ1bmN0aW9ucyB1c2VyIGNhbiBjYWxsIGluIHRoZWlyIGNhbGxiYWNrcyBvcgotLy8ganVzdCB0aGVpciB3cml0ZXIgdG8gd3JpdGUgb3V0IHRoZSBjb3JyZWN0IGxlZiBzeW50YXguCi0vLwotLy8gQXV0aG9yOiBXYW5kYSBkYSBSb3NhCi0vLyBEYXRlOiAgIFN1bW1lciwgMTk5OAotLy8KLS8vIFJldmlzaW9uczogMTEvMjUvMjAwMiAtIGJ1ZyBmaXg6IHN1Ym1pdHRlZCBieSBDcmFpZyBGaWxlcwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgKGNmaWxlc0BmdGMuYWdpbGVudC5jb20pCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VkIGFsbCAoIW5hbWUgJiYgISpuYW1lKSB0bwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgKCFuYW1lIHx8ICEqbmFtZSkKLQotI2luY2x1ZGUgImRlZndXcml0ZXIuaHBwIgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlICJkZWZpVXRpbC5ocHAiCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLS8vIFN0YXRlcyBvZiB0aGUgd3JpdGVyLgotI2RlZmluZSBERUZXX1VOSU5JVCAgICAgICAgICAgIDAKLSNkZWZpbmUgREVGV19JTklUICAgICAgICAgICAgICAxCi0jZGVmaW5lIERFRldfVkVSU0lPTiAgICAgICAgICAgMgotI2RlZmluZSBERUZXX0NBU0VTRU5TSVRJVkUgICAgIDMKLSNkZWZpbmUgREVGV19ESVZJREVSICAgICAgICAgICA0Ci0jZGVmaW5lIERFRldfQlVTQklUICAgICAgICAgICAgNQotI2RlZmluZSBERUZXX0RFU0lHTiAgICAgICAgICAgIDYKLSNkZWZpbmUgREVGV19URUNITk9MT0dZICAgICAgICA3Ci0jZGVmaW5lIERFRldfQVJSQVkgICAgICAgICAgICAgOAotI2RlZmluZSBERUZXX0ZMT09SUExBTiAgICAgICAgIDkKLSNkZWZpbmUgREVGV19VTklUUyAgICAgICAgICAgIDEwCi0jZGVmaW5lIERFRldfSElTVE9SWSAgICAgICAgICAxMQotI2RlZmluZSBERUZXX1BST1BfU1RBUlQgICAgICAgMTIKLSNkZWZpbmUgREVGV19QUk9QICAgICAgICAgICAgIDEzCi0jZGVmaW5lIERFRldfUFJPUF9FTkQgICAgICAgICAxNAotI2RlZmluZSBERUZXX0RJRV9BUkVBICAgICAgICAgMTUKLSNkZWZpbmUgREVGV19ST1cgICAgICAgICAgICAgIDE2Ci0jZGVmaW5lIERFRldfVFJBQ0tTICAgICAgICAgICAxNwotI2RlZmluZSBERUZXX0dDRUxMX0dSSUQgICAgICAgMTgKLSNkZWZpbmUgREVGV19ERUZBVUxUQ0FQX1NUQVJUIDE5Ci0jZGVmaW5lIERFRldfREVGQVVMVENBUCAgICAgICAyMAotI2RlZmluZSBERUZXX0RFRkFVTFRDQVBfRU5EICAgMjEKLSNkZWZpbmUgREVGV19DQU5QTEFDRSAgICAgICAgIDIyCi0jZGVmaW5lIERFRldfQ0FOTk9UT0NDVVBZICAgICAyMwotI2RlZmluZSBERUZXX1ZJQV9TVEFSVCAgICAgICAgMjQKLSNkZWZpbmUgREVGV19WSUEgICAgICAgICAgICAgIDI1Ci0jZGVmaW5lIERFRldfVklBVklBUlVMRSAgICAgICAyNgotI2RlZmluZSBERUZXX1ZJQU9ORV9FTkQgICAgICAgMjcKLSNkZWZpbmUgREVGV19WSUFfRU5EICAgICAgICAgIDI4Ci0jZGVmaW5lIERFRldfUkVHSU9OX1NUQVJUICAgICAyOQotI2RlZmluZSBERUZXX1JFR0lPTiAgICAgICAgICAgMzAKLSNkZWZpbmUgREVGV19SRUdJT05fRU5EICAgICAgIDMxCi0jZGVmaW5lIERFRldfQ09NUE9ORU5UX01BU0tTSElGVExBWUVSUyAzMgotI2RlZmluZSBERUZXX0NPTVBPTkVOVF9TVEFSVCAgMzMKLSNkZWZpbmUgREVGV19DT01QT05FTlQgICAgICAgIDM0Ci0jZGVmaW5lIERFRldfQ09NUE9ORU5UX0VORCAgICAzNQotI2RlZmluZSBERUZXX1BJTl9TVEFSVCAgICAgICAgMzYKLSNkZWZpbmUgREVGV19QSU4gICAgICAgICAgICAgIDM3Ci0jZGVmaW5lIERFRldfUElOX1BPUlQgICAgICAgICAzOAotI2RlZmluZSBERUZXX1BJTl9FTkQgICAgICAgICAgMzkKLSNkZWZpbmUgREVGV19QSU5QUk9QX1NUQVJUICAgIDQwCi0jZGVmaW5lIERFRldfUElOUFJPUCAgICAgICAgICA0MQotI2RlZmluZSBERUZXX1BJTlBST1BfRU5EICAgICAgNDIKLSNkZWZpbmUgREVGV19CTE9DS0FHRV9TVEFSVCAgIDQzCi0jZGVmaW5lIERFRldfQkxPQ0tBR0VfTEFZRVIgICA0NAotI2RlZmluZSBERUZXX0JMT0NLQUdFX1BMQUNFICAgNDUKLSNkZWZpbmUgREVGV19CTE9DS0FHRV9SRUNUICAgIDQ2Ci0jZGVmaW5lIERFRldfQkxPQ0tBR0VfUE9MWUdPTiA0NwotI2RlZmluZSBERUZXX0JMT0NLQUdFX0VORCAgICAgNDgKLSNkZWZpbmUgREVGV19TTkVUX1NUQVJUICAgICAgIDQ5Ci0jZGVmaW5lIERFRldfU05FVCAgICAgICAgICAgICA1MAotI2RlZmluZSBERUZXX1NORVRfT1BUSU9OUyAgICAgNTEKLSNkZWZpbmUgREVGV19TTkVUX0VORE5FVCAgICAgIDUyCi0jZGVmaW5lIERFRldfU05FVF9FTkQgICAgICAgICA1MwotI2RlZmluZSBERUZXX1BBVEhfU1RBUlQgICAgICAgNTQKLSNkZWZpbmUgREVGV19QQVRIICAgICAgICAgICAgIDU1Ci0jZGVmaW5lIERFRldfU0hJRUxEICAgICAgICAgICA1NgotI2RlZmluZSBERUZXX05FVF9TVEFSVCAgICAgICAgNTcKLSNkZWZpbmUgREVGV19ORVQgICAgICAgICAgICAgIDU4Ci0jZGVmaW5lIERFRldfTkVUX09QVElPTlMgICAgICA1OQotI2RlZmluZSBERUZXX05FVF9FTkRORVQgICAgICAgNjAKLSNkZWZpbmUgREVGV19ORVRfRU5EICAgICAgICAgIDYxCi0jZGVmaW5lIERFRldfU1VCTkVUICAgICAgICAgICA2MgotI2RlZmluZSBERUZXX05PU0hJRUxEICAgICAgICAgNjMKLSNkZWZpbmUgREVGV19JT1RJTUlOR19TVEFSVCAgIDY0Ci0jZGVmaW5lIERFRldfSU9USU1JTkcgICAgICAgICA2NQotI2RlZmluZSBERUZXX0lPVElNSU5HX0VORCAgICAgNjYKLSNkZWZpbmUgREVGV19TQ0FOQ0hBSU5fU1RBUlQgIDY3Ci0jZGVmaW5lIERFRldfU0NBTkNIQUlOICAgICAgICA2OAotI2RlZmluZSBERUZXX1NDQU5fRkxPQVRJTkcgICAgNjkKLSNkZWZpbmUgREVGV19TQ0FOX09SREVSRUQgICAgIDcwCi0jZGVmaW5lIERFRldfU0NBTkNIQUlOX0VORCAgICA3MQotI2RlZmluZSBERUZXX0ZQQ19TVEFSVCAgICAgICAgNzIKLSNkZWZpbmUgREVGV19GUEMgICAgICAgICAgICAgIDczCi0jZGVmaW5lIERFRldfRlBDX09QRVIgICAgICAgICA3NAotI2RlZmluZSBERUZXX0ZQQ19PUEVSX1NVTSAgICAgNzUKLSNkZWZpbmUgREVGV19GUENfRU5EICAgICAgICAgIDc2Ci0jZGVmaW5lIERFRldfR1JPVVBfU1RBUlQgICAgICA3NwotI2RlZmluZSBERUZXX0dST1VQICAgICAgICAgICAgNzgKLSNkZWZpbmUgREVGV19HUk9VUF9FTkQgICAgICAgIDc5Ci0jZGVmaW5lIERFRldfU0xPVF9TVEFSVCAgICAgICA4MAotI2RlZmluZSBERUZXX1NMT1RfTEFZRVIgICAgICAgODEKLSNkZWZpbmUgREVGV19TTE9UX1JFQ1QgICAgICAgIDgyCi0jZGVmaW5lIERFRldfU0xPVF9FTkQgICAgICAgICA4MwotI2RlZmluZSBERUZXX0ZJTExfU1RBUlQgICAgICAgODQKLSNkZWZpbmUgREVGV19GSUxMX0xBWUVSICAgICAgIDg1Ci0jZGVmaW5lIERFRldfRklMTF9WSUEgICAgICAgICA4NgotI2RlZmluZSBERUZXX0ZJTExfT1BDICAgICAgICAgODcKLSNkZWZpbmUgREVGV19GSUxMX1JFQ1QgICAgICAgIDg4Ci0jZGVmaW5lIERFRldfRklMTF9FTkQgICAgICAgICA4OQotI2RlZmluZSBERUZXX05EUl9TVEFSVCAgICAgICAgOTAKLSNkZWZpbmUgREVGV19ORFIgICAgICAgICAgICAgIDkxCi0jZGVmaW5lIERFRldfTkRSX0VORCAgICAgICAgICA5MgotI2RlZmluZSBERUZXX1NUWUxFU19TVEFSVCAgICAgOTMKLSNkZWZpbmUgREVGV19TVFlMRVMgICAgICAgICAgIDk0Ci0jZGVmaW5lIERFRldfU1RZTEVTX0VORCAgICAgICA5NQotI2RlZmluZSBERUZXX0JFR0lORVhUX1NUQVJUICAgOTYKLSNkZWZpbmUgREVGV19CRUdJTkVYVCAgICAgICAgIDk3Ci0jZGVmaW5lIERFRldfQkVHSU5FWFRfRU5EICAgICA5OAotI2RlZmluZSBERUZXX0ZJTExfTEFZRVJNQVNLICAgOTkKLSNkZWZpbmUgREVGV19GSUxMX1ZJQU1BU0sgICAgMTAwCi0jZGVmaW5lIERFRldfQkxPQ0tBR0VfTUFTSyAgIDEwMQotCi0jZGVmaW5lIERFRldfRU5EICAgICAgICAgICAgIDEwMgotCi0jZGVmaW5lIERFRldfRE9ORSAgICAgICAgICAgIDk5OQotCi0jZGVmaW5lIE1BWFNZTiAgICAgICAgICAgICAgIDEwMwotCi0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAgICAgICAgR2xvYmFsIFZhcmlhYmxlcwotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUZJTEUgKmRlZndGaWxlID0gMDsgICAvLyBGaWxlIHRvIHdyaXRlIHRvLgotaW50IGRlZndMaW5lcyA9IDA7ICAgIC8vIG51bWJlciBvZiBsaW5lcyB3cml0dGVuCi1pbnQgZGVmd1N0YXRlID0gREVGV19VTklOSVQ7ICAvLyBDdXJyZW50IHN0YXRlIG9mIHdyaXRlcgotaW50IGRlZndGdW5jID0gREVGV19VTklOSVQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLWludCBkZWZ3RGlkTmV0cyA9IDA7ICAvLyByZXF1aXJlZCBzZWN0aW9uCi1pbnQgZGVmd0RpZENvbXBvbmVudHMgPSAwOyAgLy8gcmVxdWlyZWQgc2VjdGlvbgotaW50IGRlZndEaWRJbml0ID0gMDsgIC8vIHJlcXVpcmVkIHNlY3Rpb24KLWludCBkZWZ3Q291bnRlciA9IDA7ICAvLyBudW1iZXIgb2YgbmV0cywgY29tcG9uZW50cyBpbiBzZWN0aW9uCi1pbnQgZGVmd0xpbmVJdGVtQ291bnRlciA9IDA7IC8vIG51bWJlciBvZiBpdGVtcyBvbiBjdXJyZW50IGxpbmUKLWludCBkZWZ3RlBDID0gMDsgIC8vIEN1cnJlbnQgbnVtYmVyIG9mIGl0ZW1zIGluIGNvbnN0cmFpbnRzL29wZXJhbmQvc3VtCi1pbnQgZGVmd0hhc0luaXQgPSAwOyAgICAvLyBmb3IgZGVmd0luaXQgaGFzIGNhbGxlZAotaW50IGRlZndIYXNJbml0Q2JrID0gMDsgLy8gZm9yIGRlZndJbml0Q2JrIGhhcyBjYWxsZWQKLWludCBkZWZ3U3BOZXRTaGllbGQgPSAwOyAvLyBmb3Igc3BlY2lhbCBuZXQgc2hpZWxkTmV0TmFtZQotc3RhdGljIGRvdWJsZSBkZWZWZXJzaW9uTnVtID0gNS43OyAgLy8gZGVmYXVsdCB0byA1LjcKLXN0YXRpYyBpbnQgZGVmd09ic29sZXRlTnVtID0gLTE7IC8vIGtlZXAgdHJhY2sgdGhlIG9ic29sZXRlIHN5bnRheCBmb3IgZXJyb3IKLXN0YXRpYyBpbnQgZGVmd1ZpYUhhc1ZhbCA9IDA7ICAgIC8vIGtlZXAgdHJhY2sgb25seSBWaWFSdWxlfFBhdHRlcm4KLXN0YXRpYyBpbnQgZGVmd0Jsb2NrYWdlSGFzU0QgPSAwOy8vIGtlZXAgdHJhY2sgb25seSBTcGFjaW5nfERlc2lnbnJ1bGV3aWR0aAotc3RhdGljIGludCBkZWZ3QmxvY2thZ2VIYXNTRiA9IDA7Ly8ga2VlcCB0cmFjayBvbmx5IFNMT1RTfEZJTExTCi1zdGF0aWMgaW50IGRlZndCbG9ja2FnZUhhc1NQID0gMDsvLyBrZWVwIHRyYWNrIG9ubHkgU09GVHxQQVJUSUFMCi0KLWNoYXIgZGVmd1N0YXRlU3RyW01BWFNZTl0gWzgwXSA9IHsKLSAgICAiVU5JTklUSUFMSVpFIiwgICAgICAgICAvLyAgMAotICAgICJJTklUSUFMSVpFIiwgICAgICAgICAgIC8vICAxCi0gICAgIlZFUlNJT04iLCAgICAgICAgICAgICAgLy8gIDIKLSAgICAiQ0FTRVNFTlNJVElWRSIsICAgICAgICAvLyAgMwotICAgICJCVVNCSVQiLCAgICAgICAgICAgICAgIC8vICA0Ci0gICAgIkRJVklERVIiLCAgICAgICAgICAgICAgLy8gIDUKLSAgICAiREVTSUdOIiwgICAgICAgICAgICAgICAvLyAgNgotICAgICJURUNITk9MT0dZIiwgICAgICAgICAgIC8vICA3Ci0gICAgIkFSUkFZIiwgICAgICAgICAgICAgICAgLy8gIDgKLSAgICAiRkxPT1JQTEFOIiwgICAgICAgICAgICAvLyAgOQotICAgICJVTklUUyIsICAgICAgICAgICAgICAgIC8vIDEwCi0gICAgIkhJU1RPUlkiLCAgICAgICAgICAgICAgLy8gMTEKLSAgICAiUFJPUEVSVFlERUZJTklUSU9OUyIsICAvLyAxMgotICAgICJQUk9QRVJUWURFRklOSVRJT05TIiwgIC8vIDEzCi0gICAgIlBST1BFUlRZREVGSU5JVElPTlMiLCAgLy8gMTQKLSAgICAiRElFQVJFQSIsICAgICAgICAgICAgICAvLyAxNQotICAgICJST1ciLCAgICAgICAgICAgICAgICAgIC8vIDE2Ci0gICAgIlRSQUNLUyIsICAgICAgICAgICAgICAgLy8gMTcKLSAgICAiR0NFTExHUklEIiwgICAgICAgICAgICAvLyAxOAotICAgICJERUZBVUxUQ0FQIiwgICAgICAgICAgIC8vIDE5Ci0gICAgIkRFRkFVTFRDQVAiLCAgICAgICAgICAgLy8gMjAKLSAgICAiREVGQVVMVENBUCIsICAgICAgICAgICAvLyAyMQotICAgICJDQU5QTEFDRSIsICAgICAgICAgICAgIC8vIDIyCi0gICAgIkNBTk5PVE9DQ1VQWSIsICAgICAgICAgLy8gMjMKLSAgICAiVklBIiwgICAgICAgICAgICAgICAgICAvLyAyNAotICAgICJWSUEiLCAgICAgICAgICAgICAgICAgIC8vIDI1Ci0gICAgIlZJQSIsICAgICAgICAgICAgICAgICAgLy8gMjYKLSAgICAiVklBIiwgICAgICAgICAgICAgICAgICAvLyAyNwotICAgICJWSUEiLCAgICAgICAgICAgICAgICAgIC8vIDI4Ci0gICAgIlJFR0lPTiIsICAgICAgICAgICAgICAgLy8gMjkKLSAgICAiUkVHSU9OIiwgICAgICAgICAgICAgICAvLyAzMAotICAgICJSRUdJT04iLCAgICAgICAgICAgICAgIC8vIDMxCi0gICAgIkNPTVBPTkVOVCIsICAgICAgICAgICAgLy8gMzIKLSAgICAiQ09NUE9ORU5UIiwgICAgICAgICAgICAvLyAzMwotICAgICJDT01QT05FTlQiLCAgICAgICAgICAgIC8vIDM0Ci0gICAgIkNPTVBPTkVOVCIsICAgICAgICAgICAgLy8gMzUKLSAgICAiUElOIiwgICAgICAgICAgICAgICAgICAvLyAzNgotICAgICJQSU4iLCAgICAgICAgICAgICAgICAgIC8vIDM3Ci0gICAgIlBJTiIsICAgICAgICAgICAgICAgICAgLy8gMzgKLSAgICAiUElOIiwgICAgICAgICAgICAgICAgICAvLyAzOQotICAgICJQSU5QUk9QRVJUWSIsICAgICAgICAgIC8vIDQwIAotICAgICJQSU5QUk9QRVJUWSIsICAgICAgICAgIC8vIDQxCi0gICAgIlBJTlBST1BFUlRZIiwgICAgICAgICAgLy8gNDIKLSAgICAiU05FVCIsICAgICAgICAgICAgICAgICAvLyA0MwotICAgICJTTkVUIiwgICAgICAgICAgICAgICAgIC8vIDQ0Ci0gICAgIlNORVQiLCAgICAgICAgICAgICAgICAgLy8gNDUKLSAgICAiU05FVCIsICAgICAgICAgICAgICAgICAvLyA0NgotICAgICJTTkVUIiwgICAgICAgICAgICAgICAgIC8vIDQ3Ci0gICAgIlBBVEgiLCAgICAgICAgICAgICAgICAgLy8gNDgKLSAgICAiUEFUSCIsICAgICAgICAgICAgICAgICAvLyA0OQotICAgICJTSElFTEQiLCAgICAgICAgICAgICAgIC8vIDUwIAotICAgICJORVQiLCAgICAgICAgICAgICAgICAgIC8vIDUxCi0gICAgIk5FVCIsICAgICAgICAgICAgICAgICAgLy8gNTIKLSAgICAiTkVUIiwgICAgICAgICAgICAgICAgICAvLyA1MwotICAgICJORVQiLCAgICAgICAgICAgICAgICAgIC8vIDU0Ci0gICAgIk5FVCIsICAgICAgICAgICAgICAgICAgLy8gNTUKLSAgICAiU1VCTkVUIiwgICAgICAgICAgICAgICAvLyA1NgotICAgICJOT1NISUVMRCIsICAgICAgICAgICAgIC8vIDU3Ci0gICAgIklPVElNSU5HIiwgICAgICAgICAgICAgLy8gNTgKLSAgICAiSU9USU1JTkciLCAgICAgICAgICAgICAvLyA1OQotICAgICJJT1RJTUlORyIsICAgICAgICAgICAgIC8vIDYwIAotICAgICJTQ0FOQ0hBSU4iLCAgICAgICAgICAgIC8vIDYxCi0gICAgIlNDQU5DSEFJTiIsICAgICAgICAgICAgLy8gNjIKLSAgICAiU0NBTiBGTE9BVElORyIsICAgICAgICAvLyA2MwotICAgICJTQ0FOIE9SREVSRUQiLCAgICAgICAgIC8vIDY0Ci0gICAgIlNDQU5DSEFJTiIsICAgICAgICAgICAgLy8gNjUKLSAgICAiQ09OU1RSQUlOVFMiLCAgICAgICAgICAvLyA2NgotICAgICJDT05TVFJBSU5UUyIsICAgICAgICAgIC8vIDY3Ci0gICAgIkNPTlNUUkFJTlRTIiwgICAgICAgICAgLy8gNjgKLSAgICAiQ09OU1RSQUlOVFMiLCAgICAgICAgICAvLyA2OQotICAgICJDT05TVFJBSU5UUyIsICAgICAgICAgIC8vIDcwIAotICAgICJHUk9VUCIsICAgICAgICAgICAgICAgIC8vIDcxCi0gICAgIkdST1VQIiwgICAgICAgICAgICAgICAgLy8gNzEKLSAgICAiR1JPVVAiLCAgICAgICAgICAgICAgICAvLyA3MgotICAgICJCTE9DS0FHRSIsICAgICAgICAgICAgIC8vIDczCi0gICAgIkJMT0NLQUdFIExBWUVSIiwgICAgICAgLy8gNzQKLSAgICAiQkxPQ0tBR0UgUExBQ0VNRU5UIiwgICAvLyA3NQotICAgICJCTE9DS0FHRSBSRUNUIiwgICAgICAgIC8vIDc2Ci0gICAgIkJMT0NLQUdFIFBPTFlHT04iLCAgICAgLy8gNzcKLSAgICAiQkxPQ0tBR0UiLCAgICAgICAgICAgICAvLyA3OAotICAgICJTTE9UIiwgICAgICAgICAgICAgICAgIC8vIDc5Ci0gICAgIlNMT1QiLCAgICAgICAgICAgICAgICAgLy8gODAKLSAgICAiU0xPVCIsICAgICAgICAgICAgICAgICAvLyA4MQotICAgICJTTE9UIiwgICAgICAgICAgICAgICAgIC8vIDgyCi0gICAgIkZJTEwiLCAgICAgICAgICAgICAgICAgLy8gODMKLSAgICAiRklMTCIsICAgICAgICAgICAgICAgICAvLyA4NAotICAgICJGSUxMIiwgICAgICAgICAgICAgICAgIC8vIDg1Ci0gICAgIkZJTEwiLCAgICAgICAgICAgICAgICAgLy8gODYKLSAgICAiRklMTCIsICAgICAgICAgICAgICAgICAvLyA4NwotICAgICJGSUxMIiwgICAgICAgICAgICAgICAgIC8vIDg4Ci0gICAgIk5EUiIsICAgICAgICAgICAgICAgICAgLy8gODkKLSAgICAiTkRSIiwgICAgICAgICAgICAgICAgICAvLyA5MAotICAgICJORFIiLCAgICAgICAgICAgICAgICAgIC8vIDkxCi0gICAgIlNUWUxFUyIsICAgICAgICAgICAgICAgLy8gOTIKLSAgICAiU1RZTEVTIiwgICAgICAgICAgICAgICAvLyA5MwotICAgICJTVFlMRVMiLCAgICAgICAgICAgICAgIC8vIDk0Ci0gICAgIkJFR0lORVhUIiwgICAgICAgICAgICAgLy8gOTUKLSAgICAiQkVHSU5FWFQiLCAgICAgICAgICAgICAvLyA5NgotICAgICJCRUdJTkVYVCIsICAgICAgICAgICAgIC8vIDk3Ci0gICAgIkRFU0lHTiBFTkQiLCAgICAgICAgICAgLy8gOTgKLSAgICAiRklMTF9MQVlFUk1BU0siLCAgICAgICAvLyA5OQotICAgICJGSUxMX1ZJQU1BU0siLCAgICAgICAgIC8vIDEwMCAKLSAgICAiQkxPQ0tBR0VfTUFTSyIgICAgICAgICAvLyAxMDEKLQotfTsKLQotCi1zdGF0aWMgaW50IHByaW50UG9pbnRzTnVtID0gMDsKLXN0YXRpYyB2b2lkIHByaW50UG9pbnRzKEZJTEUgKmZpbGUsIGRvdWJsZSB4LCBkb3VibGUgeSwgCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwcmVmaXgsIGNvbnN0IGNoYXIqIHN1ZmZpeCkKLXsKLSAgICBzdGF0aWMgZG91YmxlIHhfb2xkID0gMDsKLSAgICBzdGF0aWMgZG91YmxlIHlfb2xkID0gMDsKLQotICAgIGZwcmludGYoZmlsZSwgIiVzIiwgcHJlZml4KTsKLQotICAgIGlmIChwcmludFBvaW50c051bSsrID09IDApIHsKLSAgICAgICAgZnByaW50ZihmaWxlLCAiKCAlLjExZyAlLjExZyApIiwgeCwgeSk7Ci0gICAgfSBlbHNlIGlmICh4X29sZCA9PSB4KSB7Ci0gICAgICAgIGlmICh5X29sZCA9PSB5KSB7Ci0gICAgICAgICAgICBmcHJpbnRmKGZpbGUsICIoICogKiApIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmcHJpbnRmKGZpbGUsICIoICogJS4xMWcgKSIsIHkpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICh5X29sZCA9PSB5KSB7Ci0gICAgICAgIGZwcmludGYoZmlsZSwgIiggJS4xMWcgKiApIiwgeCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihmaWxlLCAiKCAlLjExZyAlLjExZyApIiwgeCwgeSk7Ci0gICAgfQotCi0gICAgZnByaW50ZihmaWxlLCAiJXMiLCBzdWZmaXgpOwotCi0gICAgeF9vbGQgPSB4OwotICAgIHlfb2xkID0geTsKLX0KLQotCi0KLWludAotZGVmd05ld0xpbmUoKQotewotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4iKTsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi0vLyB0aGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIHRvIGJlIGNhbGxlZCBmaXJzdCB0byBpbml0aWFsaXplIHRoZSByZXF1aXJlZAotLy8gc2VjdGlvbnMuCi0vLyBFaXRoZXIgdGhpcyBmdW5jdGlvbiBvciBkZWZ3SW5pdENiayBjYW4gYmUgY2FsbGVkLCBjYW5ub3QgYmUgYm90aAotaW50Ci1kZWZ3SW5pdChGSUxFICAgICAgICpmLAotICAgICAgICAgaW50ICAgICAgICB2ZXJzMSwKLSAgICAgICAgIGludCAgICAgICAgdmVyczIsCi0gICAgICAgICBjb25zdCBjaGFyICpjYXNlU2Vuc2l0aXZlLAotICAgICAgICAgY29uc3QgY2hhciAqZGl2aWRlckNoYXIsCi0gICAgICAgICBjb25zdCBjaGFyICpidXNCaXRDaGFycywKLSAgICAgICAgIGNvbnN0IGNoYXIgKmRlc2lnbk5hbWUsCi0gICAgICAgICBjb25zdCBjaGFyICp0ZWNobm9sb2d5LCAgLy8gb3B0aW9uYWwgCi0gICAgICAgICBjb25zdCBjaGFyICphcnJheSwgICAgICAgLy8gb3B0aW9uYWwgCi0gICAgICAgICBjb25zdCBjaGFyICpmbG9vcnBsYW4sICAgLy8gb3B0aW9uYWwgCi0gICAgICAgICBkb3VibGUgICAgIHVuaXRzICAgICAgICAgICAgIC8vIG9wdGlvbmFsICAoc2V0IHRvIC0xIHRvIGlnbm9yZSkgCi0gICAgICAgICApCi17Ci0KLSAgICAvL2lmIChkZWZ3RmlsZSkgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGRlZndGaWxlID0gZjsKLSAgICBpZiAoZGVmd0hhc0luaXRDYmsgPT0gMSkgeyAgLy8gZGVmd0luaXRDYmsgaGFzIGFscmVhZHkgY2FsbGVkLCBpc3N1ZSBhbiBlcnJvcgotICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICAgICAiRVJST1IgKERFRldSSVQtOTAwMCk6IFRoZSBERUYgd3JpdGVyIGhhcyBkZXRlY3RlZCB0aGF0IHRoZSBmdW5jdGlvbiBkZWZ3SW5pdENiayBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBhbmQgeW91IGFyZSB0cnlpbmcgdG8gY2FsbCBkZWZ3SW5pdC5cbk9ubHkgZGVmd0luaXRDYmsgb3IgZGVmd0luaXQgY2FuIGJlIGNhbGxlZCBidXQgbm90IGJvdGguXG5VcGRhdGUgeW91ciBwcm9ncmFtIGFuZCB0aGVuIHRyeSBhZ2Fpbi5cbiIpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldyaXRlciBFeGl0LlxuIik7Ci0gICAgICAgIGV4aXQoREVGV19CQURfT1JERVIpOwotICAgIH0KLQotICAgIGRlZndTdGF0ZSA9IERFRldfVU5JTklUOyAgLy8gQ3VycmVudCBzdGF0ZSBvZiB3cml0ZXIKLSAgICBkZWZ3RnVuYyA9IERFRldfVU5JTklUOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgZGVmd0RpZE5ldHMgPSAwOyAgLy8gcmVxdWlyZWQgc2VjdGlvbgotICAgIGRlZndEaWRDb21wb25lbnRzID0gMDsgIC8vIHJlcXVpcmVkIHNlY3Rpb24KLSAgICBkZWZ3RGlkSW5pdCA9IDA7ICAvLyByZXF1aXJlZCBzZWN0aW9uCi0KLSAgICBpZiAodmVyczEpIHsgIC8vIG9wdGlvbmFsIGluIDUuNiBvbgotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiVkVSU0lPTiAlZC4lZCA7XG4iLCB2ZXJzMSwgdmVyczIpOwotICAgICAgICBkZWZ3TGluZXMrKzsKLSAgICB9Ci0KLSAgICBpZiAoKHZlcnMxID09IDUpICYmICh2ZXJzMiA8IDYpKSB7ICAvLyBGb3IgdmVyc2lvbiBiZWZvcmUgNS42Ci0gICAgICAgIGlmIChjYXNlU2Vuc2l0aXZlID09IDAgfHwgKmNhc2VTZW5zaXRpdmUgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiTkFNRVNDQVNFU0VOU0lUSVZFICVzIDtcbiIsIGNhc2VTZW5zaXRpdmUpOwotICAgIH0KLQotICAgIGlmIChkaXZpZGVyQ2hhcikgeyAgLy8gb3B0aW9uYWwgaW4gNS42IG9uCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJESVZJREVSQ0hBUiBcIiVzXCIgO1xuIiwgZGl2aWRlckNoYXIpOwotICAgICAgICBkZWZ3TGluZXMrKzsKLSAgICB9Ci0KLSAgICBpZiAoYnVzQml0Q2hhcnMpIHsgIC8vIG9wdGlvbmFsIGluIDUuNiBvbgotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiQlVTQklUQ0hBUlMgXCIlc1wiIDtcbiIsIGJ1c0JpdENoYXJzKTsKLSAgICAgICAgZGVmd0xpbmVzKys7Ci0gICAgfQotCi0gICAgaWYgKGRlc2lnbk5hbWUgPT0gMCB8fCAqZGVzaWduTmFtZSA9PSAwKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiREVTSUdOICVzIDtcbiIsIGRlc2lnbk5hbWUpOwotICAgIGRlZndMaW5lcysrOwotCi0gICAgaWYgKHRlY2hub2xvZ3kpIHsKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlRFQ0hOT0xPR1kgJXMgO1xuIiwgdGVjaG5vbG9neSk7Ci0gICAgICAgIGRlZndMaW5lcysrOwotICAgIH0KLQotICAgIGlmIChhcnJheSkgewotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiQVJSQVkgJXMgO1xuIiwgYXJyYXkpOwotICAgICAgICBkZWZ3TGluZXMrKzsKLSAgICB9Ci0KLSAgICBpZiAoZmxvb3JwbGFuKSB7Ci0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJGTE9PUlBMQU4gJXMgO1xuIiwgZmxvb3JwbGFuKTsKLSAgICAgICAgZGVmd0xpbmVzKys7Ci0gICAgfQotCi0gICAgaWYgKHVuaXRzICE9IC0xLjApIHsKLSAgICAgICAgaW50IHVuaXRzVmFsID0gKGludCkgdW5pdHM7Ci0gICAgICAgIHN3aXRjaCAodW5pdHNWYWwpIHsKLSAgICAgICAgY2FzZSAxMDA6Ci0gICAgICAgIGNhc2UgMjAwOgotICAgICAgICBjYXNlIDEwMDA6Ci0gICAgICAgIGNhc2UgMjAwMDoKLSAgICAgICAgY2FzZSA0MDAwOgotICAgICAgICBjYXNlIDgwMDA6Ci0gICAgICAgIGNhc2UgMTAwMDA6Ci0gICAgICAgIGNhc2UgMTYwMDA6Ci0gICAgICAgIGNhc2UgMjAwMDA6Ci0gICAgICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiVU5JVFMgRElTVEFOQ0UgTUlDUk9OUyAlZCA7XG4iLCBST1VORCh1bml0cykpOwotICAgICAgICAgICAgZGVmd0xpbmVzKys7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZGVmd0RpZEluaXQgPSAxOwotICAgIGRlZndTdGF0ZSA9IERFRldfREVTSUdOOwotICAgIGRlZndIYXNJbml0ID0gMTsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi0vLyB0aGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIHRvIGJlIGNhbGxlZCBmaXJzdCB0byBpbml0aWFsaXplIHRoZSB2YXJpYWJsZXMKLS8vIEVpdGhlciB0aGlzIGZ1bmN0aW9uIG9yIGRlZndJbml0IGNhbiBiZSBjYWxsZWQsIGNhbm5vdCBiZSBib3RoCi1pbnQKLWRlZndJbml0Q2JrKEZJTEUgKmYpCi17Ci0KLSAgICBkZWZ3RmlsZSA9IGY7Ci0gICAgaWYgKGRlZndIYXNJbml0ID09IDEpIHsgIC8vIGRlZndJbml0IGhhcyBhbHJlYWR5IGNhbGxlZCwgaXNzdWUgYW4gZXJyb3IKLSAgICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAgICAgIkVSUk9SIChERUZXUklULTkwMDEpOiBUaGUgREVGIHdyaXRlciBoYXMgZGV0ZWN0ZWQgdGhhdCB0aGUgZnVuY3Rpb24gZGVmd0luaXQgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgYW5kIHlvdSBhcmUgdHJ5aW5nIHRvIGNhbGwgZGVmd0luaXRDYmsuXG5Pbmx5IGRlZndJbml0Q2JrIG9yIGRlZndJbml0IGNhbiBiZSBjYWxsZWQgYnV0IG5vdCBib3RoLlxuVXBkYXRlIHlvdXIgcHJvZ3JhbSBhbmQgdGhlbiB0cnkgYWdhaW4uXG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJXcml0ZXIgRXhpdC5cbiIpOwotICAgICAgICBleGl0KERFRldfQkFEX09SREVSKTsKLSAgICB9Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX1VOSU5JVDsgIC8vIEN1cnJlbnQgc3RhdGUgb2Ygd3JpdGVyCi0gICAgZGVmd0Z1bmMgPSBERUZXX1VOSU5JVDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGRlZndEaWROZXRzID0gMDsgIC8vIHJlcXVpcmVkIHNlY3Rpb24KLSAgICBkZWZ3RGlkQ29tcG9uZW50cyA9IDA7ICAvLyByZXF1aXJlZCBzZWN0aW9uCi0gICAgZGVmd0RpZEluaXQgPSAwOyAgLy8gcmVxdWlyZWQgc2VjdGlvbgotCi0gICAgZGVmd0RpZEluaXQgPSAxOwotICAgIGRlZndTdGF0ZSA9IERFRldfSU5JVDsKLSAgICBkZWZ3SGFzSW5pdENiayA9IDE7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd1ZlcnNpb24oaW50IHZlcnMxLAotICAgICAgICAgICAgaW50IHZlcnMyKQotewotICAgIGRlZndGdW5jID0gREVGV19WRVJTSU9OOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWRlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX0lOSVQpICAvLyB2ZXJzaW9uIGZvbGxvd3MgaW5pdCAKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGZwcmludGYoZGVmd0ZpbGUsICJWRVJTSU9OICVkLiVkIDtcbiIsIHZlcnMxLCB2ZXJzMik7Ci0gICAgaWYgKHZlcnMyID49IDEwKQotICAgICAgICBkZWZWZXJzaW9uTnVtID0gdmVyczEgKyAodmVyczIgLyAxMDAuMCk7Ci0gICAgZWxzZQotICAgICAgICBkZWZWZXJzaW9uTnVtID0gdmVyczEgKyAodmVyczIgLyAxMC4wKTsKLSAgICBkZWZ3TGluZXMrKzsKLQotICAgIGRlZndTdGF0ZSA9IERFRldfVkVSU0lPTjsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotaW50Ci1kZWZ3Q2FzZVNlbnNpdGl2ZShjb25zdCBjaGFyICpjYXNlU2Vuc2l0aXZlKQotewotICAgIGRlZndPYnNvbGV0ZU51bSA9IERFRldfQ0FTRVNFTlNJVElWRTsKLSAgICBkZWZ3RnVuYyA9IERFRldfQ0FTRVNFTlNJVElWRTsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFkZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmIChkZWZWZXJzaW9uTnVtID49IDUuNikKLSAgICAgICAgcmV0dXJuIERFRldfT0JTT0xFVEU7Ci0gICAgLy8gQ2hlY2sgZm9yIHJlcGVhdGVkIGNhc2VzZW5zaXRpdmUKLSAgICBpZiAoZGVmd1N0YXRlID09IERFRldfQ0FTRVNFTlNJVElWRSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmIChzdHJjbXAoY2FzZVNlbnNpdGl2ZSwgIk9OIikgJiYgc3RyY21wKGNhc2VTZW5zaXRpdmUsICJPRkYiKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7ICAgICAvLyBoYXMgdG8gYmUgZWl0aGVyIE9OIG9yIE9GRgotICAgIGZwcmludGYoZGVmd0ZpbGUsICJOQU1FU0NBU0VTRU5TSVRJVkUgJXMgO1xuIiwgY2FzZVNlbnNpdGl2ZSk7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX0NBU0VTRU5TSVRJVkU7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd0J1c0JpdENoYXJzKGNvbnN0IGNoYXIgKmJ1c0JpdENoYXJzKQotewotICAgIGRlZndGdW5jID0gREVGV19CVVNCSVQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghZGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICAvLyBDaGVjayBmb3IgcmVwZWF0ZWQgY2FzZXNlbnNpdGl2ZQotICAgIGlmIChkZWZ3U3RhdGUgPT0gREVGV19CVVNCSVQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoYnVzQml0Q2hhcnMgJiYgYnVzQml0Q2hhcnMgIT0gMCAmJiAqYnVzQml0Q2hhcnMgIT0gMCkgewotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiQlVTQklUQ0hBUlMgXCIlc1wiIDtcbiIsIGJ1c0JpdENoYXJzKTsKLSAgICAgICAgZGVmd0xpbmVzKys7Ci0gICAgfQotCi0gICAgZGVmd1N0YXRlID0gREVGV19CVVNCSVQ7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd0RpdmlkZXJDaGFyKGNvbnN0IGNoYXIgKmRpdmlkZXJDaGFyKQotewotICAgIGRlZndGdW5jID0gREVGV19ESVZJREVSOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWRlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgLy8gQ2hlY2sgZm9yIHJlcGVhdGVkIGJ1c2JpdAotICAgIGlmIChkZWZ3U3RhdGUgPT0gREVGV19ESVZJREVSKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKGRpdmlkZXJDaGFyICYmIGRpdmlkZXJDaGFyICE9IDAgJiYgKmRpdmlkZXJDaGFyICE9IDApIHsKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIkRJVklERVJDSEFSIFwiJXNcIiA7XG4iLCBkaXZpZGVyQ2hhcik7Ci0gICAgICAgIGRlZndMaW5lcysrOwotICAgIH0KLQotICAgIGRlZndTdGF0ZSA9IERFRldfRElWSURFUjsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotaW50Ci1kZWZ3RGVzaWduTmFtZShjb25zdCBjaGFyICpuYW1lKQotewotICAgIGRlZndGdW5jID0gREVGV19ERVNJR047ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghZGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICAvLyBDaGVjayBmb3IgcmVwZWF0ZWQgZGVzaWduCi0gICAgaWYgKGRlZndTdGF0ZSA9PSBERUZXX0RFU0lHTikKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmIChuYW1lICYmIG5hbWUgIT0gMCAmJiAqbmFtZSAhPSAwKSB7Ci0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJERVNJR04gJXMgO1xuIiwgbmFtZSk7Ci0gICAgICAgIGRlZndMaW5lcysrOwotICAgIH0KLQotICAgIGRlZndTdGF0ZSA9IERFRldfREVTSUdOOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi1pbnQKLWRlZndUZWNobm9sb2d5KGNvbnN0IGNoYXIgKnRlY2hub2xvZ3kpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1RFQ0hOT0xPR1k7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghZGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAodGVjaG5vbG9neSAmJiB0ZWNobm9sb2d5ICE9IDAgJiYgKnRlY2hub2xvZ3kgIT0gMCkgewotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiVEVDSE5PTE9HWSAlcyA7XG4iLCB0ZWNobm9sb2d5KTsKLSAgICAgICAgZGVmd0xpbmVzKys7Ci0gICAgfQotCi0gICAgZGVmd1N0YXRlID0gREVGV19URUNITk9MT0dZOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi1pbnQKLWRlZndBcnJheShjb25zdCBjaGFyICphcnJheSkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfQVJSQVk7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghZGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoZGVmd1N0YXRlID09IERFRldfQVJSQVkpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsgICAgIC8vIGNoZWNrIGZvciByZXBlYXRlZCBhcnJheQotICAgIGlmIChhcnJheSAmJiBhcnJheSAhPSAwICYmICphcnJheSAhPSAwKSB7Ci0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJBUlJBWSAlcyA7XG4iLCBhcnJheSk7Ci0gICAgICAgIGRlZndMaW5lcysrOwotICAgIH0KLQotICAgIGRlZndTdGF0ZSA9IERFRldfQVJSQVk7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd0Zsb29ycGxhbihjb25zdCBjaGFyICpmbG9vcnBsYW4pCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX0ZMT09SUExBTjsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFkZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmIChkZWZ3U3RhdGUgPT0gREVGV19GTE9PUlBMQU4pCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsgICAgIC8vIENoZWNrIGZvciByZXBlYXRlZCBmbG9vcnBsYW4KLSAgICBpZiAoZmxvb3JwbGFuICYmIGZsb29ycGxhbiAhPSAwICYmICpmbG9vcnBsYW4gIT0gMCkgewotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiRkxPT1JQTEFOICVzIDtcbiIsIGZsb29ycGxhbik7Ci0gICAgICAgIGRlZndMaW5lcysrOwotICAgIH0KLQotICAgIGRlZndTdGF0ZSA9IERFRldfRkxPT1JQTEFOOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi1pbnQKLWRlZndVbml0cyhpbnQgdW5pdHMpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1VOSVRTOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWRlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKGRlZndTdGF0ZSA9PSBERUZXX1VOSVRTKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7ICAgICAvLyBDaGVjayBmb3IgcmVwZWF0ZWQgdW5pdHMKLSAgICBpZiAodW5pdHMgIT0gMCkgewotICAgICAgICBzd2l0Y2ggKHVuaXRzKSB7Ci0gICAgICAgIGNhc2UgMTAwOgotICAgICAgICBjYXNlIDIwMDoKLSAgICAgICAgY2FzZSAxMDAwOgotICAgICAgICBjYXNlIDIwMDA6Ci0gICAgICAgIGNhc2UgMTAwMDA6Ci0gICAgICAgIGNhc2UgMjAwMDA6Ci0gICAgICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiVU5JVFMgRElTVEFOQ0UgTUlDUk9OUyAlZCA7XG4iLCB1bml0cyk7Ci0gICAgICAgICAgICBkZWZ3TGluZXMrKzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX1VOSVRTOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi1pbnQKLWRlZndIaXN0b3J5KGNvbnN0IGNoYXIgKnN0cmluZykKLXsKLSAgICBjaGFyICpjOwotICAgIGRlZndGdW5jID0gREVGV19ISVNUT1JZOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWRlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKHN0cmluZyA9PSAwIHx8ICpzdHJpbmcgPT0gMCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0KLSAgICBmb3IgKGMgPSAoY2hhciopIHN0cmluZzsgKmM7IGMrKykKLSAgICAgICAgaWYgKCpjID09ICdcbicpCi0gICAgICAgICAgICBkZWZ3TGluZXMrKzsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJISVNUT1JZICVzIDtcbiIsIHN0cmluZyk7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX0hJU1RPUlk7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd1N0YXJ0UHJvcERlZigpCi17Ci0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWRlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKChkZWZ3U3RhdGUgPj0gREVGV19QUk9QX1NUQVJUKSAmJiAoZGVmd1N0YXRlIDw9IERFRldfUFJPUF9FTkQpKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiUFJPUEVSVFlERUZJTklUSU9OU1xuIik7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX1BST1BfU1RBUlQ7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3SXNQcm9wT2JqVHlwZShjb25zdCBjaGFyICpvYmpUeXBlKQotewotICAgIGlmIChzdHJjbXAob2JqVHlwZSwgIkRFU0lHTiIpICYmIHN0cmNtcChvYmpUeXBlLCAiQ09NUE9ORU5UIikgJiYKLSAgICAgICAgc3RyY21wKG9ialR5cGUsICJORVQiKSAmJiBzdHJjbXAob2JqVHlwZSwgIlNQRUNJQUxORVQiKSAmJgotICAgICAgICBzdHJjbXAob2JqVHlwZSwgIkdST1VQIikgJiYgc3RyY21wKG9ialR5cGUsICJST1ciKSAmJgotICAgICAgICBzdHJjbXAob2JqVHlwZSwgIkNPTVBPTkVOVFBJTiIpICYmIHN0cmNtcChvYmpUeXBlLCAiUkVHSU9OIikgJiYKLSAgICAgICAgc3RyY21wKG9ialR5cGUsICJOT05ERUZBVUxUUlVMRSIpKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gMTsKLX0KLQotaW50Ci1kZWZ3SW50UHJvcERlZihjb25zdCBjaGFyICAgKm9ialR5cGUsCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKnByb3BOYW1lLAotICAgICAgICAgICAgICAgZG91YmxlICAgICAgIGxlZnRSYW5nZSwKLSAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICByaWdodFJhbmdlLCAgICAvLyBvcHRpb25hbCAKLSAgICAgICAgICAgICAgIGludCAgICAgICAgICBwcm9wVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcHRpb25hbCAKLSAgICAgICAgICAgICAgICkKLXsKLQotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1BST1BfU1RBUlQgJiYKLSAgICAgICAgZGVmd1N0YXRlICE9IERFRldfUFJPUCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmICgoIW9ialR5cGUgfHwgISpvYmpUeXBlKSB8fCAoIXByb3BOYW1lIHx8ICEqcHJvcE5hbWUpKSAvLyByZXF1aXJlCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0gICAgaWYgKCFkZWZ3SXNQcm9wT2JqVHlwZShvYmpUeXBlKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICAgJXMgJXMgSU5URUdFUiAiLCBvYmpUeXBlLCBwcm9wTmFtZSk7Ci0gICAgaWYgKGxlZnRSYW5nZSB8fCByaWdodFJhbmdlKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiUkFOR0UgJS4xMWcgJS4xMWcgIiwgbGVmdFJhbmdlLCByaWdodFJhbmdlKTsKLQotICAgIGlmIChwcm9wVmFsdWUpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIlZCAiLCBwcm9wVmFsdWUpOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIjtcbiIpOwotCi0gICAgZGVmd0xpbmVzKys7Ci0gICAgZGVmd1N0YXRlID0gREVGV19QUk9QOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd1JlYWxQcm9wRGVmKGNvbnN0IGNoYXIgICpvYmpUeXBlLAotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpwcm9wTmFtZSwKLSAgICAgICAgICAgICAgICBkb3VibGUgICAgICBsZWZ0UmFuZ2UsCi0gICAgICAgICAgICAgICAgZG91YmxlICAgICAgcmlnaHRSYW5nZSwgICAgLy8gb3B0aW9uYWwgCi0gICAgICAgICAgICAgICAgZG91YmxlICAgICAgcHJvcFZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwgCi0gICAgICAgICAgICAgICAgKQotewotCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfUFJPUF9TVEFSVCAmJgotICAgICAgICBkZWZ3U3RhdGUgIT0gREVGV19QUk9QKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKCghb2JqVHlwZSB8fCAhKm9ialR5cGUpIHx8ICghcHJvcE5hbWUgfHwgISpwcm9wTmFtZSkpIC8vIHJlcXVpcmUKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0KLSAgICBpZiAoIWRlZndJc1Byb3BPYmpUeXBlKG9ialR5cGUpKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgICAlcyAlcyBSRUFMICIsIG9ialR5cGUsIHByb3BOYW1lKTsKLSAgICBpZiAobGVmdFJhbmdlIHx8IHJpZ2h0UmFuZ2UpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJSQU5HRSAlLjExZyAlLjExZyAiLCBsZWZ0UmFuZ2UsIHJpZ2h0UmFuZ2UpOwotCi0gICAgaWYgKHByb3BWYWx1ZSkKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiUuMTFnICIsIHByb3BWYWx1ZSk7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiO1xuIik7Ci0KLSAgICBkZWZ3TGluZXMrKzsKLSAgICBkZWZ3U3RhdGUgPSBERUZXX1BST1A7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3U3RyaW5nUHJvcERlZihjb25zdCBjaGFyICAgICpvYmpUeXBlLAotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqcHJvcE5hbWUsCi0gICAgICAgICAgICAgICAgICBkb3VibGUgICAgICAgIGxlZnRSYW5nZSwKLSAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICAgcmlnaHRSYW5nZSwgICAgLy8gb3B0aW9uYWwgCi0gICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpwcm9wVmFsdWUgICAgICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwgCi0gICAgICAgICAgICAgICAgICApCi17Ci0KLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19QUk9QX1NUQVJUICYmCi0gICAgICAgIGRlZndTdGF0ZSAhPSBERUZXX1BST1ApCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoKCFvYmpUeXBlIHx8ICEqb2JqVHlwZSkgfHwgKCFwcm9wTmFtZSB8fCAhKnByb3BOYW1lKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0KLSAgICBpZiAoIWRlZndJc1Byb3BPYmpUeXBlKG9ialR5cGUpKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgICAlcyAlcyBTVFJJTkcgIiwgb2JqVHlwZSwgcHJvcE5hbWUpOwotICAgIGlmIChsZWZ0UmFuZ2UgfHwgcmlnaHRSYW5nZSkKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlJBTkdFICUuMTFnICUuMTFnICIsIGxlZnRSYW5nZSwgcmlnaHRSYW5nZSk7Ci0KLSAgICBpZiAocHJvcFZhbHVlKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXCIlc1wiICIsIHByb3BWYWx1ZSk7ICAvLyBzdHJpbmcsIHNldCBxdW90ZXMKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICI7XG4iKTsKLQotICAgIGRlZndMaW5lcysrOwotICAgIGRlZndTdGF0ZSA9IERFRldfUFJPUDsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndFbmRQcm9wRGVmKCkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfUFJPUF9FTkQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19QUk9QX1NUQVJUICYmCi0gICAgICAgIGRlZndTdGF0ZSAhPSBERUZXX1BST1ApCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJFTkQgUFJPUEVSVFlERUZJTklUSU9OU1xuXG4iKTsKLSAgICBkZWZ3TGluZXMrKzsKLQotICAgIGRlZndTdGF0ZSA9IERFRldfUFJPUF9FTkQ7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd0lzUHJvcFN0YXRlKCkKLXsKLSAgICBpZiAoKGRlZndTdGF0ZSAhPSBERUZXX1JPVykgJiYgKGRlZndTdGF0ZSAhPSBERUZXX1JFR0lPTikgJiYKLSAgICAgICAgKGRlZndTdGF0ZSAhPSBERUZXX0NPTVBPTkVOVCkgJiYgKGRlZndTdGF0ZSAhPSBERUZXX1BJTikgJiYKLSAgICAgICAgKGRlZndTdGF0ZSAhPSBERUZXX1NORVQpICYmIChkZWZ3U3RhdGUgIT0gREVGV19ORVQpICYmCi0gICAgICAgIChkZWZ3U3RhdGUgIT0gREVGV19HUk9VUCkgJiYgKGRlZndTdGF0ZSAhPSBERUZXX1BJTlBST1ApICYmCi0gICAgICAgIChkZWZ3U3RhdGUgIT0gREVGV19TTkVUX09QVElPTlMpICYmIChkZWZ3U3RhdGUgIT0gREVGV19ORVRfT1BUSU9OUykgJiYKLSAgICAgICAgKGRlZndTdGF0ZSAhPSBERUZXX05EUikgJiYgKGRlZndTdGF0ZSAhPSBERUZXX0JFR0lORVhUKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLWludAotZGVmd1N0cmluZ1Byb3BlcnR5KGNvbnN0IGNoYXIgICAqcHJvcE5hbWUsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICpwcm9wVmFsdWUpCi17Ci0gICAgaWYgKCFkZWZ3SXNQcm9wU3RhdGUoKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgLy8gbmV3IGxpbmUgZm9yIHRoZSBkZWZ3Um93IG9mIHRoZSBwcmV2aW91cyBsaW5lCi0gICAgLy8gZG8gbm90IGVuZCB3aXRoIG5ld2xpbmUsIG1heSBoYXZlIG1vcmUgdGhhbiBvbiBwcm9wZXJ0aWVzCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBQUk9QRVJUWSAlcyBcIiVzXCIgIiwgcHJvcE5hbWUsIHByb3BWYWx1ZSk7Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3UmVhbFByb3BlcnR5KGNvbnN0IGNoYXIgKnByb3BOYW1lLAotICAgICAgICAgICAgICAgICBkb3VibGUgICAgIHByb3BWYWx1ZSkKLXsKLSAgICBpZiAoIWRlZndJc1Byb3BTdGF0ZSgpKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICAvLyBuZXcgbGluZSBmb3IgdGhlIGRlZndSb3cgb2YgdGhlIHByZXZpb3VzIGxpbmUKLSAgICAvLyBkbyBub3QgZW5kIHdpdGggbmV3bGluZSwgbWF5IGhhdmUgbW9yZSB0aGFuIG9uIHByb3BlcnRpZXMKLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArIFBST1BFUlRZICVzICUuMTFnICIsIHByb3BOYW1lLCBwcm9wVmFsdWUpOwotICAgIGRlZndMaW5lcysrOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd0ludFByb3BlcnR5KGNvbnN0IGNoYXIgICpwcm9wTmFtZSwKLSAgICAgICAgICAgICAgICBpbnQgICAgICAgICBwcm9wVmFsdWUpCi17Ci0gICAgaWYgKCFkZWZ3SXNQcm9wU3RhdGUoKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgLy8gbmV3IGxpbmUgZm9yIHRoZSBkZWZ3Um93IG9mIHRoZSBwcmV2aW91cyBsaW5lCi0gICAgLy8gZG8gbm90IGVuZCB3aXRoIG5ld2xpbmUsIG1heSBoYXZlIG1vcmUgdGhhbiBvbiBwcm9wZXJ0aWVzCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBQUk9QRVJUWSAlcyAlZCAiLCBwcm9wTmFtZSwgcHJvcFZhbHVlKTsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndEaWVBcmVhKGludCB4bCwKLSAgICAgICAgICAgIGludCB5bCwKLSAgICAgICAgICAgIGludCB4aCwKLSAgICAgICAgICAgIGludCB5aCkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfRElFX0FSRUE7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghZGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoZGVmd1N0YXRlID09IERFRldfRElFX0FSRUEpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoeGwgPiB4aCB8fCB5bCA+IHloKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJESUVBUkVBICggJWQgJWQgKSAoICVkICVkICkgO1xuIiwgeGwsIHlsLCB4aCwgeWgpOwotICAgIGRlZndMaW5lcysrOwotCi0gICAgZGVmd1N0YXRlID0gREVGV19ESUVfQVJFQTsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndEaWVBcmVhTGlzdChpbnQgbnVtX3BvaW50cywKLSAgICAgICAgICAgICAgICBpbnQgKnhsLAotICAgICAgICAgICAgICAgIGludCAqeWwpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBkZWZ3RnVuYyA9IERFRldfRElFX0FSRUE7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghZGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoZGVmd1N0YXRlID09IERFRldfRElFX0FSRUEpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoZGVmVmVyc2lvbk51bSA8IDUuNikKLSAgICAgICAgcmV0dXJuIERFRldfV1JPTkdfVkVSU0lPTjsKLSAgICBpZiAobnVtX3BvaW50cyA8IDQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIkRJRUFSRUEgIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bV9wb2ludHM7IGkrKykgewotICAgICAgICBpZiAoaSA9PSAwKQotICAgICAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiggJWQgJWQgKSAiLCAqeGwrKywgKnlsKyspOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmICgoaSAlIDUpID09IDApIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICAgICggJWQgJWQgKSAiLCAqeGwrKywgKnlsKyspOwotICAgICAgICAgICAgICAgIGRlZndMaW5lcysrOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiggJWQgJWQgKSAiLCAqeGwrKywgKnlsKyspOwotICAgICAgICB9Ci0gICAgfQotICAgIGZwcmludGYoZGVmd0ZpbGUsICI7XG4iKTsKLSAgICBkZWZ3TGluZXMrKzsKLQotICAgIGRlZndTdGF0ZSA9IERFRldfRElFX0FSRUE7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotY2hhciAqCi1kZWZ3QWRkcihjb25zdCBjaGFyICp4KQotewotICAgIHJldHVybiAoY2hhciopIHg7Ci19Ci0KLQotY2hhciAqCi1kZWZ3T3JpZW50KGludCBudW0pCi17Ci0gICAgc3dpdGNoIChudW0pIHsKLSAgICBjYXNlIDA6Ci0gICAgICAgIHJldHVybiBkZWZ3QWRkcigiTiIpOwotICAgIGNhc2UgMToKLSAgICAgICAgcmV0dXJuIGRlZndBZGRyKCJXIik7Ci0gICAgY2FzZSAyOgotICAgICAgICByZXR1cm4gZGVmd0FkZHIoIlMiKTsKLSAgICBjYXNlIDM6Ci0gICAgICAgIHJldHVybiBkZWZ3QWRkcigiRSIpOwotICAgIGNhc2UgNDoKLSAgICAgICAgcmV0dXJuIGRlZndBZGRyKCJGTiIpOwotICAgIGNhc2UgNToKLSAgICAgICAgcmV0dXJuIGRlZndBZGRyKCJGVyIpOwotICAgIGNhc2UgNjoKLSAgICAgICAgcmV0dXJuIGRlZndBZGRyKCJGUyIpOwotICAgIGNhc2UgNzoKLSAgICAgICAgcmV0dXJuIGRlZndBZGRyKCJGRSIpOwotICAgIH07Ci0gICAgcmV0dXJuIGRlZndBZGRyKCJCT0dVUyAiKTsKLX0KLQotCi1pbnQKLWRlZndSb3coY29uc3QgY2hhciAgKnJvd05hbWUsCi0gICAgICAgIGNvbnN0IGNoYXIgICpyb3dUeXBlLAotICAgICAgICBpbnQgICAgICAgICB4X29yaWcsCi0gICAgICAgIGludCAgICAgICAgIHlfb3JpZywKLSAgICAgICAgaW50ICAgICAgICAgb3JpZW50LAotICAgICAgICBpbnQgICAgICAgICBkb19jb3VudCwKLSAgICAgICAgaW50ICAgICAgICAgZG9faW5jcmVtZW50LAotICAgICAgICBpbnQgICAgICAgICBkb194LAotICAgICAgICBpbnQgICAgICAgICBkb195KQotewotICAgIGRlZndGdW5jID0gREVGV19ST1c7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghZGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGlmIChkZWZ3U3RhdGUgPT0gREVGV19ST1cpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICI7XG4iKTsvLyBhZGQgdGhlIDsgYW5kIG5ld2xpbmUgZm9yIHRoZSBwcmV2aW91cyByb3cuCi0KLSAgICAvLyByZXF1aXJlZAotICAgIGlmICgocm93TmFtZSA9PSAwKSB8fCAoKnJvd05hbWUgPT0gMCkgfHwgKHJvd1R5cGUgPT0gMCkgfHwgKCpyb3dUeXBlID09IDApKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLQotICAgIC8vIGRvIG5vdCBoYXZlIDsgYmVjYXVzZSB0aGUgcm93IG1heSBoYXZlIHByb3BlcnRpZXMKLSAgICAvLyBkbyBub3QgZW5kIHdpdGggbmV3bGluZSwgaWYgdGhlcmUgaXMgbm8gcHJvcGVydHksIDsgbmVlZCB0byBiZSBjb25jYXQuCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIlJPVyAlcyAlcyAlZCAlZCAlcyAiLCByb3dOYW1lLCByb3dUeXBlLCB4X29yaWcsIHlfb3JpZywKLSAgICAgICAgICAgIGRlZndPcmllbnQob3JpZW50KSk7Ci0gICAgaWYgKChkb19jb3VudCAhPSAwKSB8fCAoZG9faW5jcmVtZW50ICE9IDApKSB7Ci0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJETyAlZCBCWSAlZCAiLCBkb19jb3VudCwgZG9faW5jcmVtZW50KTsKLSAgICAgICAgaWYgKChkb194ICE9IDApIHx8IChkb195ICE9IDApKQotICAgICAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlNURVAgJWQgJWQgIiwgZG9feCwgZG9feSk7Ci0gICAgfQotICAgIGRlZndMaW5lcysrOwotCi0gICAgZGVmd1N0YXRlID0gREVGV19ST1c7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3Um93U3RyKGNvbnN0IGNoYXIgICAqcm93TmFtZSwKLSAgICAgICAgICAgY29uc3QgY2hhciAgICpyb3dUeXBlLAotICAgICAgICAgICBpbnQgICAgICAgICAgeF9vcmlnLAotICAgICAgICAgICBpbnQgICAgICAgICAgeV9vcmlnLAotICAgICAgICAgICBjb25zdCBjaGFyICAgKm9yaWVudCwKLSAgICAgICAgICAgaW50ICAgICAgICAgIGRvX2NvdW50LAotICAgICAgICAgICBpbnQgICAgICAgICAgZG9faW5jcmVtZW50LAotICAgICAgICAgICBpbnQgICAgICAgICAgZG9feCwKLSAgICAgICAgICAgaW50ICAgICAgICAgIGRvX3kpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1JPVzsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFkZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgaWYgKGRlZndTdGF0ZSA9PSBERUZXX1JPVykKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIjtcbiIpOy8vIGFkZCB0aGUgOyBhbmQgbmV3bGluZSBmb3IgdGhlIHByZXZpb3VzIHJvdy4KLQotICAgIGlmICgoIXJvd05hbWUgfHwgISpyb3dOYW1lKSB8fCAoIXJvd1R5cGUgfHwgISpyb3dUeXBlKSkgLy8gcmVxdWlyZWQKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0KLSAgICAvLyBkbyBub3QgaGF2ZSA7IGJlY2F1c2UgdGhlIHJvdyBtYXkgaGF2ZSBwcm9wZXJ0aWVzCi0gICAgLy8gZG8gbm90IGVuZCB3aXRoIG5ld2xpbmUsIGlmIHRoZXJlIGlzIG5vIHByb3BlcnR5LCA7IG5lZWQgdG8gYmUgY29uY2F0LgotICAgIGZwcmludGYoZGVmd0ZpbGUsICJST1cgJXMgJXMgJWQgJWQgJXMgIiwgcm93TmFtZSwgcm93VHlwZSwgeF9vcmlnLCB5X29yaWcsCi0gICAgICAgICAgICBvcmllbnQpOwotICAgIGlmICgoZG9fY291bnQgIT0gMCkgfHwgKGRvX2luY3JlbWVudCAhPSAwKSkgewotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiRE8gJWQgQlkgJWQgIiwgZG9fY291bnQsIGRvX2luY3JlbWVudCk7Ci0gICAgICAgIGlmICgoZG9feCAhPSAwKSB8fCAoZG9feSAhPSAwKSkKLSAgICAgICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJTVEVQICVkICVkICIsIGRvX3gsIGRvX3kpOwotICAgIH0KLSAgICBkZWZ3TGluZXMrKzsKLQotICAgIGRlZndTdGF0ZSA9IERFRldfUk9XOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd1RyYWNrcyhjb25zdCBjaGFyICAgKm1hc3RlciwKLSAgICAgICAgICAgaW50ICAgICAgICAgIGRvX3N0YXJ0LAotICAgICAgICAgICBpbnQgICAgICAgICAgZG9fY250LAotICAgICAgICAgICBpbnQgICAgICAgICAgZG9fc3RlcCwKLSAgICAgICAgICAgaW50ICAgICAgICAgIG51bV9sYXllcnMsCi0gICAgICAgICAgIGNvbnN0IGNoYXIgICAqKmxheWVycywKLSAgICAgICAgICAgaW50ICAgICAgICAgIG1hc2ssCi0gICAgICAgICAgIGludCAgICAgICAgICBzYW1lTWFzaykKLXsKLSAgICBpbnQgaTsKLQotICAgIGRlZndGdW5jID0gREVGV19UUkFDS1M7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghZGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGlmIChkZWZ3U3RhdGUgPT0gREVGV19ST1cpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICI7XG5cbiIpOyAgLy8gYWRkIHRoZSA7IGFuZCBcbiBmb3IgdGhlIHByZXZpb3VzIHJvdwotCi0gICAgaWYgKCFtYXN0ZXIgfHwgISptYXN0ZXIpIC8vIHJlcXVpcmVkCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgIGlmIChzdHJjbXAobWFzdGVyLCAiWCIpICYmIHN0cmNtcChtYXN0ZXIsICJZIikpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0KLSAgICBpZiAobWFzaykgewotICAgICAgICBpZiAoZGVmVmVyc2lvbk51bSA8IDUuOCkgewotICAgICAgICAgICAgcmV0dXJuIERFRldfV1JPTkdfVkVSU0lPTjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzYW1lTWFzaykgewotICAgICAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlRSQUNLUyAlcyAlZCBETyAlZCBTVEVQICVkIE1BU0sgJWQgU0FNRU1BU0sgTEFZRVIiLAotICAgICAgICAgICAgICAgICAgICBtYXN0ZXIsIGRvX3N0YXJ0LCBkb19jbnQsIGRvX3N0ZXAsIG1hc2spOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlRSQUNLUyAlcyAlZCBETyAlZCBTVEVQICVkIE1BU0sgJWQgTEFZRVIiLAotICAgICAgICAgICAgICAgICAgICBtYXN0ZXIsIGRvX3N0YXJ0LCBkb19jbnQsIGRvX3N0ZXAsIG1hc2spOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlRSQUNLUyAlcyAlZCBETyAlZCBTVEVQICVkIExBWUVSIiwKLSAgICAgICAgICAgICAgICBtYXN0ZXIsIGRvX3N0YXJ0LCBkb19jbnQsIGRvX3N0ZXApOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBudW1fbGF5ZXJzOyBpKyspIHsKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiAlcyIsIGxheWVyc1tpXSk7Ci0gICAgfQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgO1xuIik7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX1RSQUNLUzsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndHY2VsbEdyaWQoY29uc3QgY2hhciAgICAqbWFzdGVyLAotICAgICAgICAgICAgICBpbnQgICAgICAgICAgIGRvX3N0YXJ0LAotICAgICAgICAgICAgICBpbnQgICAgICAgICAgIGRvX2NudCwKLSAgICAgICAgICAgICAgaW50ICAgICAgICAgICBkb19zdGVwKQotewotICAgIGRlZndGdW5jID0gREVGV19HQ0VMTF9HUklEOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWRlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBpZiAoZGVmd1N0YXRlID09IERFRldfUk9XKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiO1xuXG4iKTsgIC8vIGFkZCB0aGUgOyBhbmQgXG4gZm9yIHRoZSBwcmV2aW91cyByb3cuCi0KLSAgICBpZiAoIW1hc3RlciB8fCAhKm1hc3RlcikgLy8gcmVxdWlyZWQKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgaWYgKHN0cmNtcChtYXN0ZXIsICJYIikgJiYgc3RyY21wKG1hc3RlciwgIlkiKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiR0NFTExHUklEICVzICVkIERPICVkIFNURVAgJWQgO1xuIiwgbWFzdGVyLCBkb19zdGFydCwKLSAgICAgICAgICAgIGRvX2NudCwgZG9fc3RlcCk7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX0dDRUxMX0dSSUQ7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3U3RhcnREZWZhdWx0Q2FwKGludCBjb3VudCkKLXsKLSAgICBkZWZ3T2Jzb2xldGVOdW0gPSBERUZXX0RFRkFVTFRDQVBfU1RBUlQ7Ci0gICAgZGVmd0Z1bmMgPSBERUZXX0RFRkFVTFRDQVBfU1RBUlQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghZGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoKGRlZndTdGF0ZSA+PSBERUZXX0RFRkFVTFRDQVBfU1RBUlQpICYmCi0gICAgICAgIChkZWZ3U3RhdGUgPD0gREVGV19ERUZBVUxUQ0FQX0VORCkpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoZGVmVmVyc2lvbk51bSA+PSA1LjQpCi0gICAgICAgIHJldHVybiBERUZXX09CU09MRVRFOwotCi0gICAgaWYgKGRlZndTdGF0ZSA9PSBERUZXX1JPVykKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIjtcblxuIik7ICAvLyBhZGQgdGhlIDsgYW5kIFxuIGZvciB0aGUgcHJldmlvdXMgcm93LgotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIkRFRkFVTFRDQVAgJWRcbiIsIGNvdW50KTsKLSAgICBkZWZ3TGluZXMrKzsKLQotICAgIGRlZndDb3VudGVyID0gY291bnQ7Ci0gICAgZGVmd1N0YXRlID0gREVGV19ERUZBVUxUQ0FQX1NUQVJUOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd0RlZmF1bHRDYXAoaW50ICAgICAgcGlucywKLSAgICAgICAgICAgICAgIGRvdWJsZSAgIGNhcCkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfREVGQVVMVENBUDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX0RFRkFVTFRDQVBfU1RBUlQgJiYKLSAgICAgICAgZGVmd1N0YXRlICE9IERFRldfREVGQVVMVENBUCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiAgIE1JTlBJTlMgJWQgV0lSRUNBUCAlZiA7XG4iLCBwaW5zLCBjYXApOwotICAgIGRlZndMaW5lcysrOwotICAgIGRlZndDb3VudGVyLS07Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX0RFRkFVTFRDQVA7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3RW5kRGVmYXVsdENhcCgpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX0RFRkFVTFRDQVBfRU5EOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfREVGQVVMVENBUF9TVEFSVCAmJgotICAgICAgICBkZWZ3U3RhdGUgIT0gREVGV19ERUZBVUxUQ0FQKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKGRlZndDb3VudGVyID4gMCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgZWxzZSBpZiAoZGVmd0NvdW50ZXIgPCAwKQotICAgICAgICByZXR1cm4gREVGV19UT09fTUFOWV9TVE1TOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIkVORCBERUZBVUxUQ0FQXG5cbiIpOwotICAgIGRlZndMaW5lcysrOwotCi0gICAgZGVmd1N0YXRlID0gREVGV19ERUZBVUxUQ0FQX0VORDsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndDYW5QbGFjZShjb25zdCBjaGFyICptYXN0ZXIsCi0gICAgICAgICAgICAgaW50ICAgICAgICB4T3JpZywKLSAgICAgICAgICAgICBpbnQgICAgICAgIHlPcmlnLAotICAgICAgICAgICAgIGludCAgICAgICAgb3JpZW50LAotICAgICAgICAgICAgIGludCAgICAgICAgZG9DbnQsCi0gICAgICAgICAgICAgaW50ICAgICAgICBkb0luYywKLSAgICAgICAgICAgICBpbnQgICAgICAgIHhTdGVwLAotICAgICAgICAgICAgIGludCAgICAgICAgeVN0ZXApCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX0NBTlBMQUNFOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWRlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBpZiAoZGVmd1N0YXRlID09IERFRldfUk9XKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiO1xuXG4iKTsgIC8vIGFkZCB0aGUgOyBhbmQgXG4gZm9yIHRoZSBwcmV2aW91cyByb3cuCi0KLSAgICBpZiAoKG1hc3RlciA9PSAwKSB8fCAoKm1hc3RlciA9PSAwKSkgLy8gcmVxdWlyZWQKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgZnByaW50ZihkZWZ3RmlsZSwgIkNBTlBMQUNFICVzICVkICVkICVzIERPICVkIEJZICVkIFNURVAgJWQgJWQgO1xuIiwKLSAgICAgICAgICAgIG1hc3RlciwgeE9yaWcsIHlPcmlnLCBkZWZ3T3JpZW50KG9yaWVudCksCi0gICAgICAgICAgICBkb0NudCwgZG9JbmMsIHhTdGVwLCB5U3RlcCk7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX0NBTlBMQUNFOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd0NhblBsYWNlU3RyKGNvbnN0IGNoYXIgICptYXN0ZXIsCi0gICAgICAgICAgICAgICAgaW50ICAgICAgICAgeE9yaWcsCi0gICAgICAgICAgICAgICAgaW50ICAgICAgICAgeU9yaWcsCi0gICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKm9yaWVudCwKLSAgICAgICAgICAgICAgICBpbnQgICAgICAgICBkb0NudCwKLSAgICAgICAgICAgICAgICBpbnQgICAgICAgICBkb0luYywKLSAgICAgICAgICAgICAgICBpbnQgICAgICAgICB4U3RlcCwKLSAgICAgICAgICAgICAgICBpbnQgICAgICAgICB5U3RlcCkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfQ0FOUExBQ0U7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghZGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGlmIChkZWZ3U3RhdGUgPT0gREVGV19ST1cpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICI7XG5cbiIpOyAgLy8gYWRkIHRoZSA7IGFuZCBcbiBmb3IgdGhlIHByZXZpb3VzIHJvdy4KLQotICAgIGlmICghbWFzdGVyIHx8ICEqbWFzdGVyKSAvLyByZXF1aXJlZAotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiQ0FOUExBQ0UgJXMgJWQgJWQgJXMgRE8gJWQgQlkgJWQgU1RFUCAlZCAlZCA7XG4iLAotICAgICAgICAgICAgbWFzdGVyLCB4T3JpZywgeU9yaWcsIG9yaWVudCwKLSAgICAgICAgICAgIGRvQ250LCBkb0luYywgeFN0ZXAsIHlTdGVwKTsKLSAgICBkZWZ3TGluZXMrKzsKLQotICAgIGRlZndTdGF0ZSA9IERFRldfQ0FOUExBQ0U7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3Q2Fubm90T2NjdXB5KGNvbnN0IGNoYXIgKm1hc3RlciwKLSAgICAgICAgICAgICAgICAgaW50ICAgICAgICB4T3JpZywKLSAgICAgICAgICAgICAgICAgaW50ICAgICAgICB5T3JpZywKLSAgICAgICAgICAgICAgICAgaW50ICAgICAgICBvcmllbnQsCi0gICAgICAgICAgICAgICAgIGludCAgICAgICAgZG9DbnQsCi0gICAgICAgICAgICAgICAgIGludCAgICAgICAgZG9JbmMsCi0gICAgICAgICAgICAgICAgIGludCAgICAgICAgeFN0ZXAsCi0gICAgICAgICAgICAgICAgIGludCAgICAgICAgeVN0ZXApCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX0NBTk5PVE9DQ1VQWTsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFkZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgaWYgKChtYXN0ZXIgPT0gMCkgfHwgKCptYXN0ZXIgPT0gMCkpIC8vIHJlcXVpcmVkCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgIGZwcmludGYoZGVmd0ZpbGUsICJDQU5OT1RPQ0NVUFkgJXMgJWQgJWQgJXMgRE8gJWQgQlkgJWQgU1RFUCAlZCAlZCA7XG4iLAotICAgICAgICAgICAgbWFzdGVyLCB4T3JpZywgeU9yaWcsIGRlZndPcmllbnQob3JpZW50KSwKLSAgICAgICAgICAgIGRvQ250LCBkb0luYywgeFN0ZXAsIHlTdGVwKTsKLSAgICBkZWZ3TGluZXMrKzsKLQotICAgIGRlZndTdGF0ZSA9IERFRldfQ0FOTk9UT0NDVVBZOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd0Nhbm5vdE9jY3VweVN0cihjb25zdCBjaGFyICAqbWFzdGVyLAotICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICB4T3JpZywKLSAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgeU9yaWcsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpvcmllbnQsCi0gICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGRvQ250LAotICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBkb0luYywKLSAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgeFN0ZXAsCi0gICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIHlTdGVwKQotewotICAgIGRlZndGdW5jID0gREVGV19DQU5OT1RPQ0NVUFk7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghZGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGlmICghbWFzdGVyIHx8ICEqbWFzdGVyKSAvLyByZXF1aXJlZAotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiQ0FOTk9UT0NDVVBZICVzICVkICVkICVzIERPICVkIEJZICVkIFNURVAgJWQgJWQgO1xuIiwKLSAgICAgICAgICAgIG1hc3RlciwgeE9yaWcsIHlPcmlnLCBvcmllbnQsCi0gICAgICAgICAgICBkb0NudCwgZG9JbmMsIHhTdGVwLCB5U3RlcCk7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX0NBTk5PVE9DQ1VQWTsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndTdGFydFZpYXMoaW50IGNvdW50KQotewotICAgIGRlZndGdW5jID0gREVGV19WSUFfU1RBUlQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghZGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoKGRlZndTdGF0ZSA+PSBERUZXX1ZJQV9TVEFSVCkgJiYgKGRlZndTdGF0ZSA8PSBERUZXX1ZJQV9FTkQpKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBpZiAoZGVmd1N0YXRlID09IERFRldfUk9XKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiO1xuXG4iKTsgIC8vIGFkZCB0aGUgOyBhbmQgXG4gZm9yIHRoZSBwcmV2aW91cyByb3cuCi0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiVklBUyAlZCA7XG4iLCBjb3VudCk7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICBkZWZ3Q291bnRlciA9IGNvdW50OwotICAgIGRlZndTdGF0ZSA9IERFRldfVklBX1NUQVJUOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd1ZpYU5hbWUoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfVklBOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfVklBX1NUQVJUICYmCi0gICAgICAgIGRlZndTdGF0ZSAhPSBERUZXX1ZJQU9ORV9FTkQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBkZWZ3Q291bnRlci0tOwotCi0gICAgaWYgKCFuYW1lIHx8ICEqbmFtZSkgLy8gcmVxdWlyZWQKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiAgIC0gJXMiLCBuYW1lKTsKLQotICAgIGRlZndTdGF0ZSA9IERFRldfVklBOwotICAgIGRlZndWaWFIYXNWYWwgPSAwOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd1ZpYVBhdHRlcm4oY29uc3QgY2hhciAqcGF0dGVybikKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfVklBOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfVklBKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7ICAvLyBhZnRlciBkZWZ3VmlhTmFtZQotCi0gICAgaWYgKGRlZndWaWFIYXNWYWwpCi0gICAgICAgIHJldHVybiBERUZXX0FMUkVBRFlfREVGSU5FRDsgIC8vIGVpdGhlciBQYXR0ZXJuTmFtZSBvcgotICAgIC8vIFZpYVJ1bGUgaGFzIGRlZmluZWQKLSAgICBpZiAoIXBhdHRlcm4gfHwgISpwYXR0ZXJuKSAvLyByZXF1aXJlZAotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICsgUEFUVEVSTk5BTUUgJXMiLCBwYXR0ZXJuKTsKLQotICAgIGRlZndTdGF0ZSA9IERFRldfVklBOwotICAgIGRlZndWaWFIYXNWYWwgPSAxOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd1ZpYVJlY3QoY29uc3QgY2hhciAgKmxheWVyTmFtZXMsCi0gICAgICAgICAgICBpbnQgICAgICAgICB4bCwKLSAgICAgICAgICAgIGludCAgICAgICAgIHlsLAotICAgICAgICAgICAgaW50ICAgICAgICAgeGgsCi0gICAgICAgICAgICBpbnQgICAgICAgICB5aCwKLSAgICAgICAgICAgIGludCAgICAgICAgIG1hc2spCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1ZJQTsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1ZJQSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgaWYgKCFsYXllck5hbWVzIHx8ICEqbGF5ZXJOYW1lcykgLy8gcmVxdWlyZWQKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgaWYgKCFtYXNrKSB7Ci0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgUkVDVCAlcyAoICVkICVkICkgKCAlZCAlZCApIiwgbGF5ZXJOYW1lcywKLSAgICAgICAgICAgICAgICB4bCwgeWwsIHhoLCB5aCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGRlZlZlcnNpb25OdW0gPCA1LjgpIHsKLSAgICAgICAgICAgIHJldHVybiBERUZXX1dST05HX1ZFUlNJT047Ci0gICAgICAgIH0KLQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArIFJFQ1QgJXMgKyBNQVNLICVkICggJWQgJWQgKSAoICVkICVkICkiLAotICAgICAgICAgICAgICAgIGxheWVyTmFtZXMsIG1hc2ssIHhsLCB5bCwgeGgsIHloKTsKLSAgICB9Ci0gICAgZGVmd0xpbmVzKys7Ci0KLQotICAgIGRlZndTdGF0ZSA9IERFRldfVklBOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi1pbnQKLWRlZndWaWFQb2x5Z29uKGNvbnN0IGNoYXIgICAqbGF5ZXJOYW1lLAotICAgICAgICAgICAgICAgaW50ICAgICAgICAgIG51bV9wb2x5cywKLSAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICAqeGwsCi0gICAgICAgICAgICAgICBkb3VibGUgICAgICAgKnlsLAotICAgICAgICAgICAgICAgaW50ICAgICAgICAgIG1hc2spCi17Ci0gICAgaW50IGk7Ci0KLSAgICBkZWZ3RnVuYyA9IERFRldfVklBOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfVklBKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBpZiAoZGVmVmVyc2lvbk51bSA8IDUuNikKLSAgICAgICAgcmV0dXJuIERFRldfV1JPTkdfVkVSU0lPTjsKLQotICAgIGlmICghbWFzaykgewotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArIFBPTFlHT04gJXMgIiwgbGF5ZXJOYW1lKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoZGVmVmVyc2lvbk51bSA8IDUuOCkgewotICAgICAgICAgICAgcmV0dXJuIERFRldfV1JPTkdfVkVSU0lPTjsKLSAgICAgICAgfQotCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgUE9MWUdPTiAlcyArIE1BU0sgJWQgIiwgbGF5ZXJOYW1lLCBtYXNrKTsKLSAgICB9Ci0KLSAgICBwcmludFBvaW50c051bSA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bV9wb2x5czsgaSsrKSB7Ci0gICAgICAgIGlmICgoaSA9PSAwKSB8fCAoKGkgJSA1KSAhPSAwKSkKLSAgICAgICAgICAgIHByaW50UG9pbnRzKGRlZndGaWxlLCAqeGwrKywgKnlsKyssICIiLCAiICIpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHByaW50UG9pbnRzKGRlZndGaWxlLCAqeGwrKywgKnlsKyssICJcbiAgICAgICAgICAgICAgICAiLCAiICIpOwotICAgICAgICAgICAgZGVmd0xpbmVzKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd1ZpYVZpYXJ1bGUoY29uc3QgY2hhciAgICp2aWFSdWxlTmFtZSwKLSAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICB4Q3V0U2l6ZSwKLSAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICB5Q3V0U2l6ZSwKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAqYm90TWV0YWxMYXllciwKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAqY3V0TGF5ZXIsCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKnRvcE1ldGFsTGF5ZXIsCi0gICAgICAgICAgICAgICBkb3VibGUgICAgICAgeEN1dFNwYWNpbmcsCi0gICAgICAgICAgICAgICBkb3VibGUgICAgICAgeUN1dFNwYWNpbmcsCi0gICAgICAgICAgICAgICBkb3VibGUgICAgICAgeEJvdEVuYywKLSAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICB5Qm90RW5jLAotICAgICAgICAgICAgICAgZG91YmxlICAgICAgIHhUb3BFbmMsCi0gICAgICAgICAgICAgICBkb3VibGUgICAgICAgeVRvcEVuYykKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfVklBOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfVklBKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKGRlZndWaWFIYXNWYWwpCi0gICAgICAgIHJldHVybiBERUZXX0FMUkVBRFlfREVGSU5FRDsgIC8vIGVpdGhlciBQYXR0ZXJuTmFtZSBvcgotICAgIC8vIFZpYVJ1bGUgaGFzIGRlZmluZWQKLSAgICBpZiAoZGVmVmVyc2lvbk51bSA8IDUuNikKLSAgICAgICAgcmV0dXJuIERFRldfV1JPTkdfVkVSU0lPTjsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgKyBWSUFSVUxFICVzXG4iLCB2aWFSdWxlTmFtZSk7Ci0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiAgICAgICsgQ1VUU0laRSAlLjExZyAlLjExZ1xuIiwgeEN1dFNpemUsIHlDdXRTaXplKTsKLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICAgICAgKyBMQVlFUlMgJXMgJXMgJXNcbiIsIGJvdE1ldGFsTGF5ZXIsCi0gICAgICAgICAgICBjdXRMYXllciwgdG9wTWV0YWxMYXllcik7Ci0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiAgICAgICsgQ1VUU1BBQ0lORyAlLjExZyAlLjExZ1xuIiwKLSAgICAgICAgICAgIHhDdXRTcGFjaW5nLCB5Q3V0U3BhY2luZyk7Ci0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiAgICAgICsgRU5DTE9TVVJFICUuMTFnICUuMTFnICUuMTFnICUuMTFnIiwKLSAgICAgICAgICAgIHhCb3RFbmMsIHlCb3RFbmMsIHhUb3BFbmMsIHlUb3BFbmMpOwotICAgIGRlZndMaW5lcyArPSA1OwotICAgIGRlZndTdGF0ZSA9IERFRldfVklBVklBUlVMRTsKLSAgICBkZWZ3VmlhSGFzVmFsID0gMTsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotaW50Ci1kZWZ3VmlhVmlhcnVsZVJvd0NvbChpbnQgICAgbnVtQ3V0Um93cywKLSAgICAgICAgICAgICAgICAgICAgIGludCAgICBudW1DdXRDb2xzKQotewotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1ZJQVZJQVJVTEUpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgUk9XQ09MICVkICVkIiwgbnVtQ3V0Um93cywgbnVtQ3V0Q29scyk7Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd1ZpYVZpYXJ1bGVPcmlnaW4oaW50ICAgIHhPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgICAgeU9mZnNldCkKLXsKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19WSUFWSUFSVUxFKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArIE9SSUdJTiAlZCAlZCIsIHhPZmZzZXQsIHlPZmZzZXQpOwotICAgIGRlZndMaW5lcysrOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi1pbnQKLWRlZndWaWFWaWFydWxlT2Zmc2V0KGludCAgICB4Qm90T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgaW50ICAgIHlCb3RPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgICAgeFRvcE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgIGludCAgICB5VG9wT2Zmc2V0KQotewotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1ZJQVZJQVJVTEUpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgT0ZGU0VUICVkICVkICVkICVkIiwKLSAgICAgICAgICAgIHhCb3RPZmZzZXQsIHlCb3RPZmZzZXQsIHhUb3BPZmZzZXQsIHlUb3BPZmZzZXQpOwotICAgIGRlZndMaW5lcysrOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi1pbnQKLWRlZndWaWFWaWFydWxlUGF0dGVybihjb25zdCBjaGFyICpjdXRQYXR0ZXJuKQotewotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1ZJQVZJQVJVTEUpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgUEFUVEVSTiAlcyIsIGN1dFBhdHRlcm4pOwotICAgIGRlZndMaW5lcysrOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi1pbnQKLWRlZndPbmVWaWFFbmQoKQotewotICAgIGRlZndGdW5jID0gREVGV19WSUE7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICgoZGVmd1N0YXRlICE9IERFRldfVklBKSAmJiAoZGVmd1N0YXRlICE9IERFRldfVklBVklBUlVMRSkpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgO1xuIik7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX1ZJQU9ORV9FTkQ7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3RW5kVmlhcygpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1ZJQV9FTkQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19WSUFfU1RBUlQgJiYKLSAgICAgICAgZGVmd1N0YXRlICE9IERFRldfVklBT05FX0VORCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmIChkZWZ3Q291bnRlciA+IDApCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgIGVsc2UgaWYgKGRlZndDb3VudGVyIDwgMCkKLSAgICAgICAgcmV0dXJuIERFRldfVE9PX01BTllfU1RNUzsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJFTkQgVklBU1xuXG4iKTsKLSAgICBkZWZ3TGluZXMrKzsKLQotICAgIGRlZndTdGF0ZSA9IERFRldfVklBX0VORDsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndTdGFydFJlZ2lvbnMoaW50IGNvdW50KQotewotICAgIGRlZndGdW5jID0gREVGV19SRUdJT05fU1RBUlQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghZGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoKGRlZndTdGF0ZSA+PSBERUZXX1JFR0lPTl9TVEFSVCkgJiYgKGRlZndTdGF0ZSA8PSBERUZXX1JFR0lPTl9FTkQpKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBpZiAoZGVmd1N0YXRlID09IERFRldfUk9XKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiO1xuXG4iKTsgIC8vIGFkZCB0aGUgOyBhbmQgXG4gZm9yIHRoZSBwcmV2aW91cyByb3cuCi0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiUkVHSU9OUyAlZCA7XG4iLCBjb3VudCk7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICBkZWZ3Q291bnRlciA9IGNvdW50OwotICAgIGRlZndTdGF0ZSA9IERFRldfUkVHSU9OX1NUQVJUOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd1JlZ2lvbk5hbWUoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfUkVHSU9OOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfUkVHSU9OX1NUQVJUICYmCi0gICAgICAgIGRlZndTdGF0ZSAhPSBERUZXX1JFR0lPTikKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGRlZndDb3VudGVyLS07Ci0KLSAgICBpZiAoZGVmd1N0YXRlID09IERFRldfUkVHSU9OKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiO1xuIik7ICAvLyBhZGQgdGhlIDsgYW5kIFxuIGZvciB0aGUgcHJldmlvdXMgcm93LgotCi0gICAgaWYgKCFuYW1lIHx8ICEqbmFtZSkgLy8gcmVxdWlyZWQKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiAgIC0gJXMgIiwgbmFtZSk7Ci0gICAgZGVmd1N0YXRlID0gREVGV19SRUdJT047Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3UmVnaW9uUG9pbnRzKGludCAgICB4bCwKLSAgICAgICAgICAgICAgICAgaW50ICAgIHlsLAotICAgICAgICAgICAgICAgICBpbnQgICAgeGgsCi0gICAgICAgICAgICAgICAgIGludCAgICB5aCkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfUkVHSU9OOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfUkVHSU9OKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7ICAvLyBhZnRlciBSZWdpb25OYW1lCi0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICAgICAgKCAlZCAlZCApICggJWQgJWQgKSAiLCB4bCwgeWwsIHhoLCB5aCk7Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX1JFR0lPTjsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndSZWdpb25UeXBlKGNvbnN0IGNoYXIgKnR5cGUpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1JFR0lPTjsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1JFR0lPTikKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOyAgLy8gYWZ0ZXIgUmVnaW9uTmFtZQotCi0gICAgaWYgKCF0eXBlIHx8ICEqdHlwZSkgLy8gcmVxdWlyZWQKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgaWYgKHN0cmNtcCh0eXBlLCAiRkVOQ0UiKSAmJiBzdHJjbXAodHlwZSwgIkdVSURFIikpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiAgICAgICAgICsgVFlQRSAlcyAiLCB0eXBlKTsKLQotICAgIGRlZndTdGF0ZSA9IERFRldfUkVHSU9OOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd0VuZFJlZ2lvbnMoKQotewotICAgIGRlZndGdW5jID0gREVGV19SRUdJT05fRU5EOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfUkVHSU9OX1NUQVJUICYmCi0gICAgICAgIGRlZndTdGF0ZSAhPSBERUZXX1JFR0lPTikKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmIChkZWZ3Q291bnRlciA+IDApCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgIGVsc2UgaWYgKGRlZndDb3VudGVyIDwgMCkKLSAgICAgICAgcmV0dXJuIERFRldfVE9PX01BTllfU1RNUzsKLQotICAgIGlmIChkZWZ3U3RhdGUgPT0gREVGV19SRUdJT04pCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICI7XG5FTkQgUkVHSU9OU1xuXG4iKTsgIC8vIDsgZm9yIHRoZSBwcmV2aW91cyBzdGF0ZW1lbnQKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJFTkQgUkVHSU9OU1xuXG4iKTsgIC8vIDsgZm9yIHRoZSBwcmV2aW91cyBzdGF0ZW1lbnQKLSAgICBkZWZ3TGluZXMrKzsKLQotICAgIGRlZndTdGF0ZSA9IERFRldfUkVHSU9OX0VORDsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndDb21wb25lbnRNYXNrU2hpZnRMYXllcnMoY29uc3QgY2hhciAqKmxheWVyTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgbnVtTGF5ZXJOYW1lKQotewotICAgIGlmIChkZWZWZXJzaW9uTnVtIDwgNS44KSB7Ci0gICAgICAgIHJldHVybiBERUZXX1dST05HX1ZFUlNJT047Ci0gICAgfQotCi0gICAgZGVmd0Z1bmMgPSBERUZXX0NPTVBPTkVOVF9NQVNLU0hJRlRMQVlFUlM7Ci0KLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotCi0gICAgaWYgKGRlZndTdGF0ZSA9PSBERUZXX0NPTVBPTkVOVF9NQVNLU0hJRlRMQVlFUlMpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJDT01QT05FTlRNQVNLU0hJRlQgIik7Ci0KLSAgICBpZiAobnVtTGF5ZXJOYW1lKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtTGF5ZXJOYW1lOyBpKyspCi0gICAgICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiJXMgIiwgbGF5ZXJOYW1lc1tpXSk7Ci0gICAgfQotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIjtcblxuIik7Ci0KLSAgICBkZWZ3TGluZXMrKzsKLQotICAgIGRlZndTdGF0ZSA9IERFRldfQ09NUE9ORU5UX01BU0tTSElGVExBWUVSUzsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndTdGFydENvbXBvbmVudHMoaW50IGNvdW50KQotewotICAgIGRlZndGdW5jID0gREVGV19DT01QT05FTlRfU1RBUlQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghZGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoKGRlZndTdGF0ZSA+PSBERUZXX0NPTVBPTkVOVF9TVEFSVCkgJiYgKGRlZndTdGF0ZSA8PSBERUZXX0NPTVBPTkVOVF9FTkQpKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBpZiAoZGVmd1N0YXRlID09IERFRldfUk9XKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiO1xuXG4iKTsgIC8vIGFkZCB0aGUgOyBhbmQgXG4gZm9yIHRoZSBwcmV2aW91cyByb3cuCi0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiQ09NUE9ORU5UUyAlZCA7XG4iLCBjb3VudCk7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICBkZWZ3Q291bnRlciA9IGNvdW50OwotICAgIGRlZndTdGF0ZSA9IERFRldfQ09NUE9ORU5UX1NUQVJUOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd0NvbXBvbmVudChjb25zdCBjaGFyICAgICppbnN0YW5jZSwKLSAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqbWFzdGVyLAotICAgICAgICAgICAgICBpbnQgICAgICAgICAgIG51bU5ldE5hbWUsCi0gICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKipuZXROYW1lcywKLSAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqZWVxLAotICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpnZW5OYW1lLAotICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpnZW5QYXJlbWV0ZXJzLAotICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpzb3VyY2UsCi0gICAgICAgICAgICAgIGludCAgICAgICAgICAgbnVtRm9yZWlnbiwKLSAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqKmZvcmVpZ25zLAotICAgICAgICAgICAgICBpbnQgICAgICAgICAgICpmb3JlaWduWCwKLSAgICAgICAgICAgICAgaW50ICAgICAgICAgICAqZm9yZWlnblksCi0gICAgICAgICAgICAgIGludCAgICAgICAgICAgKmZvcmVpZ25PcmllbnRzLAotICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpzdGF0dXMsCi0gICAgICAgICAgICAgIGludCAgICAgICAgICAgc3RhdHVzWCwKLSAgICAgICAgICAgICAgaW50ICAgICAgICAgICBzdGF0dXNZLAotICAgICAgICAgICAgICBpbnQgICAgICAgICAgIHN0YXR1c09yaWVudCwKLSAgICAgICAgICAgICAgZG91YmxlICAgICAgICB3ZWlnaHQsCi0gICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKnJlZ2lvbiwKLSAgICAgICAgICAgICAgaW50ICAgICAgICAgICB4bCwKLSAgICAgICAgICAgICAgaW50ICAgICAgICAgICB5bCwKLSAgICAgICAgICAgICAgaW50ICAgICAgICAgICB4aCwKLSAgICAgICAgICAgICAgaW50ICAgICAgICAgICB5aCkKLXsKLQotICAgIGludCBpOwotICAgIGludCB1cGxhY2UgPSAwOwotCi0gICAgZGVmd0Z1bmMgPSBERUZXX0NPTVBPTkVOVDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfQ09NUE9ORU5UX1NUQVJUICYmCi0gICAgICAgIGRlZndTdGF0ZSAhPSBERUZXX0NPTVBPTkVOVCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgZGVmd0NvdW50ZXItLTsKLQotICAgIC8vIHJlcXVpcmVkCi0gICAgaWYgKChpbnN0YW5jZSA9PSAwKSB8fCAoKmluc3RhbmNlID09IDApIHx8IChtYXN0ZXIgPT0gMCkgfHwgKCptYXN0ZXIgPT0gMCkpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0gICAgaWYgKHNvdXJjZSAmJiBzdHJjbXAoc291cmNlLCAiTkVUTElTVCIpICYmIHN0cmNtcChzb3VyY2UsICJESVNUIikgJiYKLSAgICAgICAgc3RyY21wKHNvdXJjZSwgIlVTRVIiKSAmJiBzdHJjbXAoc291cmNlLCAiVElNSU5HIikpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBpZiAoc3RyY21wKHN0YXR1cywgIlVOUExBQ0VEIikgPT0gMCkgewotICAgICAgICAgICAgdXBsYWNlID0gMTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoc3RhdHVzLCAiQ09WRVIiKSAmJiBzdHJjbXAoc3RhdHVzLCAiRklYRUQiKSAmJgotICAgICAgICAgICAgICAgICAgIHN0cmNtcChzdGF0dXMsICJQTEFDRUQiKSkKLSAgICAgICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgIH0KLQotICAgIC8vIG9ubHkgZWl0aGVyIHJlZ2lvbiBvciB4bCwgeWwsIHhoLCB5aAotICAgIGlmIChyZWdpb24gJiYgKHhsIHx8IHlsIHx8IHhoIHx8IHloKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0KLSAgICBpZiAoZGVmd1N0YXRlID09IERFRldfQ09NUE9ORU5UKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiO1xuIik7ICAgICAgIC8vIG5ld2xpbmUgZm9yIHRoZSBwcmV2aW91cyBjb21wb25lbnQKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgICAtICVzICVzICIsIGluc3RhbmNlLCBtYXN0ZXIpOwotICAgIGlmIChudW1OZXROYW1lKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1OZXROYW1lOyBpKyspCi0gICAgICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiJXMgIiwgbmV0TmFtZXNbaV0pOwotICAgIH0KLSAgICBkZWZ3TGluZXMrKzsKLSAgICAvLyBzaW5jZSB0aGUgcmVzdCBpcyBvcHRpb25hbHMsIG5ldyBsaW5lIGlzIHBsYWNlZCBiZWZvcmUgdGhlIG9wdGlvbnMKLSAgICBpZiAoZWVxKSB7Ci0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgRUVRTUFTVEVSICVzICIsIGVlcSk7Ci0gICAgICAgIGRlZndMaW5lcysrOwotICAgIH0KLSAgICBpZiAoZ2VuTmFtZSkgewotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArIEdFTkVSQVRFICVzICIsIGdlbk5hbWUpOwotICAgICAgICBpZiAoZ2VuUGFyZW1ldGVycykKLSAgICAgICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgJXMgIiwgZ2VuUGFyZW1ldGVycyk7Ci0gICAgICAgIGRlZndMaW5lcysrOwotICAgIH0KLSAgICBpZiAoc291cmNlKSB7Ci0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgU09VUkNFICVzICIsIHNvdXJjZSk7Ci0gICAgICAgIGRlZndMaW5lcysrOwotICAgIH0KLSAgICBpZiAobnVtRm9yZWlnbikgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtRm9yZWlnbjsgaSsrKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArIEZPUkVJR04gJXMgKCAlZCAlZCApICVzICIsIGZvcmVpZ25zW2ldLAotICAgICAgICAgICAgICAgICAgICBmb3JlaWduWFtpXSwgZm9yZWlnbllbaV0sIGRlZndPcmllbnQoZm9yZWlnbk9yaWVudHNbaV0pKTsKLSAgICAgICAgICAgIGRlZndMaW5lcysrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChzdGF0dXMgJiYgKHVwbGFjZSA9PSAwKSkgewotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArICVzICggJWQgJWQgKSAlcyAiLCBzdGF0dXMsIHN0YXR1c1gsIHN0YXR1c1ksCi0gICAgICAgICAgICAgICAgZGVmd09yaWVudChzdGF0dXNPcmllbnQpKTsKLSAgICB9IGVsc2UgaWYgKHVwbGFjZSkgewotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArICVzICIsIHN0YXR1cyk7Ci0gICAgfQotICAgIGRlZndMaW5lcysrOwotICAgIGlmICh3ZWlnaHQpIHsKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBXRUlHSFQgJS4xMWcgIiwgd2VpZ2h0KTsKLSAgICAgICAgZGVmd0xpbmVzKys7Ci0gICAgfQotICAgIGlmIChyZWdpb24pIHsKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBSRUdJT04gJXMgIiwgcmVnaW9uKTsKLSAgICAgICAgZGVmd0xpbmVzKys7Ci0gICAgfSBlbHNlIGlmICh4bCB8fCB5bCB8fCB4aCB8fCB5aCkgewotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArIFJFR0lPTiAoICVkICVkICkgKCAlZCAlZCApICIsCi0gICAgICAgICAgICAgICAgeGwsIHlsLCB4aCwgeWgpOwotICAgICAgICBkZWZ3TGluZXMrKzsKLSAgICB9Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX0NPTVBPTkVOVDsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndDb21wb25lbnRTdHIoY29uc3QgY2hhciAqaW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1hc3RlciwKLSAgICAgICAgICAgICAgICAgaW50ICAgICAgICBudW1OZXROYW1lLAotICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqbmV0TmFtZXMsCi0gICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVlcSwKLSAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZ2VuTmFtZSwKLSAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZ2VuUGFyZW1ldGVycywKLSAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc291cmNlLAotICAgICAgICAgICAgICAgICBpbnQgICAgICAgIG51bUZvcmVpZ24sCi0gICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipmb3JlaWducywKLSAgICAgICAgICAgICAgICAgaW50ICAgICAgICAqZm9yZWlnblgsCi0gICAgICAgICAgICAgICAgIGludCAgICAgICAgKmZvcmVpZ25ZLAotICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqZm9yZWlnbk9yaWVudHMsCi0gICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0YXR1cywKLSAgICAgICAgICAgICAgICAgaW50ICAgICAgICBzdGF0dXNYLAotICAgICAgICAgICAgICAgICBpbnQgICAgICAgIHN0YXR1c1ksCi0gICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0YXR1c09yaWVudCwKLSAgICAgICAgICAgICAgICAgZG91YmxlICAgICB3ZWlnaHQsCi0gICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlZ2lvbiwKLSAgICAgICAgICAgICAgICAgaW50ICAgICAgICB4bCwKLSAgICAgICAgICAgICAgICAgaW50ICAgICAgICB5bCwKLSAgICAgICAgICAgICAgICAgaW50ICAgICAgICB4aCwKLSAgICAgICAgICAgICAgICAgaW50ICAgICAgICB5aCkKLXsKLQotICAgIGludCBpOwotICAgIGludCB1cGxhY2UgPSAwOwotCi0gICAgZGVmd0Z1bmMgPSBERUZXX0NPTVBPTkVOVDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfQ09NUE9ORU5UX1NUQVJUICYmCi0gICAgICAgIGRlZndTdGF0ZSAhPSBERUZXX0NPTVBPTkVOVCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgZGVmd0NvdW50ZXItLTsKLQotICAgIGlmICgoIWluc3RhbmNlIHx8ICEqaW5zdGFuY2UpIHx8ICghbWFzdGVyIHx8ICEqbWFzdGVyKSkgLy8gcmVxdWlyZWQKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0KLSAgICBpZiAoc291cmNlICYmIHN0cmNtcChzb3VyY2UsICJORVRMSVNUIikgJiYgc3RyY21wKHNvdXJjZSwgIkRJU1QiKSAmJgotICAgICAgICBzdHJjbXAoc291cmNlLCAiVVNFUiIpICYmIHN0cmNtcChzb3VyY2UsICJUSU1JTkciKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0KLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIGlmIChzdHJjbXAoc3RhdHVzLCAiVU5QTEFDRUQiKSA9PSAwKSB7Ci0gICAgICAgICAgICB1cGxhY2UgPSAxOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChzdGF0dXMsICJDT1ZFUiIpICYmIHN0cmNtcChzdGF0dXMsICJGSVhFRCIpICYmCi0gICAgICAgICAgICAgICAgICAgc3RyY21wKHN0YXR1cywgIlBMQUNFRCIpKQotICAgICAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgfQotCi0gICAgLy8gb25seSBlaXRoZXIgcmVnaW9uIG9yIHhsLCB5bCwgeGgsIHloCi0gICAgaWYgKHJlZ2lvbiAmJiAoeGwgfHwgeWwgfHwgeGggfHwgeWgpKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLQotICAgIGlmIChkZWZ3U3RhdGUgPT0gREVGV19DT01QT05FTlQpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICI7XG4iKTsgICAgICAgLy8gbmV3bGluZSBmb3IgdGhlIHByZXZpb3VzIGNvbXBvbmVudAotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiAgIC0gJXMgJXMgIiwgaW5zdGFuY2UsIG1hc3Rlcik7Ci0gICAgaWYgKG51bU5ldE5hbWUpIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bU5ldE5hbWU7IGkrKykKLSAgICAgICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIlcyAiLCBuZXROYW1lc1tpXSk7Ci0gICAgfQotICAgIGRlZndMaW5lcysrOwotICAgIC8vIHNpbmNlIHRoZSByZXN0IGlzIG9wdGlvbmFscywgbmV3IGxpbmUgaXMgcGxhY2VkIGJlZm9yZSB0aGUgb3B0aW9ucwotICAgIGlmIChlZXEpIHsKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBFRVFNQVNURVIgJXMgIiwgZWVxKTsKLSAgICAgICAgZGVmd0xpbmVzKys7Ci0gICAgfQotICAgIGlmIChnZW5OYW1lKSB7Ci0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgR0VORVJBVEUgJXMgIiwgZ2VuTmFtZSk7Ci0gICAgICAgIGlmIChnZW5QYXJlbWV0ZXJzKQotICAgICAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiAlcyAiLCBnZW5QYXJlbWV0ZXJzKTsKLSAgICAgICAgZGVmd0xpbmVzKys7Ci0gICAgfQotICAgIGlmIChzb3VyY2UpIHsKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBTT1VSQ0UgJXMgIiwgc291cmNlKTsKLSAgICAgICAgZGVmd0xpbmVzKys7Ci0gICAgfQotICAgIGlmIChudW1Gb3JlaWduKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1Gb3JlaWduOyBpKyspIHsKLSAgICAgICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgRk9SRUlHTiAlcyAoICVkICVkICkgJXMgIiwgZm9yZWlnbnNbaV0sCi0gICAgICAgICAgICAgICAgICAgIGZvcmVpZ25YW2ldLCBmb3JlaWduWVtpXSwgZm9yZWlnbk9yaWVudHNbaV0pOwotICAgICAgICAgICAgZGVmd0xpbmVzKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHN0YXR1cyAmJiAodXBsYWNlID09IDApKSB7Ci0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgJXMgKCAlZCAlZCApICVzICIsIHN0YXR1cywgc3RhdHVzWCwgc3RhdHVzWSwKLSAgICAgICAgICAgICAgICBzdGF0dXNPcmllbnQpOwotICAgIH0gZWxzZSBpZiAodXBsYWNlKSB7Ci0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgJXMgIiwgc3RhdHVzKTsKLSAgICB9Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgaWYgKHdlaWdodCkgewotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArIFdFSUdIVCAlLjExZyAiLCB3ZWlnaHQpOwotICAgICAgICBkZWZ3TGluZXMrKzsKLSAgICB9Ci0gICAgaWYgKHJlZ2lvbikgewotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArIFJFR0lPTiAlcyAiLCByZWdpb24pOwotICAgICAgICBkZWZ3TGluZXMrKzsKLSAgICB9IGVsc2UgaWYgKHhsIHx8IHlsIHx8IHhoIHx8IHloKSB7Ci0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgUkVHSU9OICggJWQgJWQgKSAoICVkICVkICkgIiwKLSAgICAgICAgICAgICAgICB4bCwgeWwsIHhoLCB5aCk7Ci0gICAgICAgIGRlZndMaW5lcysrOwotICAgIH0KLQotICAgIGRlZndTdGF0ZSA9IERFRldfQ09NUE9ORU5UOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi1pbnQKLWRlZndDb21wb25lbnRNYXNrU2hpZnQoaW50IHNoaWZ0TGF5ZXJNYXNrcykKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfQ09NUE9ORU5UOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmVmVyc2lvbk51bSA8IDUuOCkgewotICAgICAgICByZXR1cm4gREVGV19XUk9OR19WRVJTSU9OOwotICAgIH0KLQotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19DT01QT05FTlQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgTUFTS1NISUZUICVkICIsIHNoaWZ0TGF5ZXJNYXNrcyk7Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd0NvbXBvbmVudEhhbG8oaW50ICAgbGVmdCwKLSAgICAgICAgICAgICAgICAgIGludCAgIGJvdHRvbSwKLSAgICAgICAgICAgICAgICAgIGludCAgIHJpZ2h0LAotICAgICAgICAgICAgICAgICAgaW50ICAgdG9wKQotewotICAgIGRlZndGdW5jID0gREVGV19DT01QT05FTlQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZWZXJzaW9uTnVtIDwgNS42KQotICAgICAgICByZXR1cm4gREVGV19XUk9OR19WRVJTSU9OOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19DT01QT05FTlQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgSEFMTyAlZCAlZCAlZCAlZCAiLCBsZWZ0LCBib3R0b20sIHJpZ2h0LCB0b3ApOwotICAgIGRlZndMaW5lcysrOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0vLyA1LjcKLWludAotZGVmd0NvbXBvbmVudEhhbG9Tb2Z0KGludCAgIGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgaW50ICAgYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgIGludCAgIHJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgIGludCAgIHRvcCkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfQ09NUE9ORU5UOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmVmVyc2lvbk51bSA8IDUuNykKLSAgICAgICAgcmV0dXJuIERFRldfV1JPTkdfVkVSU0lPTjsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfQ09NUE9ORU5UKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArIEhBTE8gU09GVCAlZCAlZCAlZCAlZCAiLCBsZWZ0LCBib3R0b20sCi0gICAgICAgICAgICByaWdodCwgdG9wKTsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotLy8gNS43Ci1pbnQKLWRlZndDb21wb25lbnRSb3V0ZUhhbG8oaW50ICAgICAgICAgIGhhbG9EaXN0LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKm1pbkxheWVyLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKm1heExheWVyKQotewotICAgIGRlZndGdW5jID0gREVGV19DT01QT05FTlQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZWZXJzaW9uTnVtIDwgNS43KQotICAgICAgICByZXR1cm4gREVGV19XUk9OR19WRVJTSU9OOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19DT01QT05FTlQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgUk9VVEVIQUxPICVkICVzICVzICIsIGhhbG9EaXN0LCBtaW5MYXllciwKLSAgICAgICAgICAgIG1heExheWVyKTsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndFbmRDb21wb25lbnRzKCkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfQ09NUE9ORU5UX0VORDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX0NPTVBPTkVOVF9TVEFSVCAmJgotICAgICAgICBkZWZ3U3RhdGUgIT0gREVGV19DT01QT05FTlQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoZGVmd0NvdW50ZXIgPiAwKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICBlbHNlIGlmIChkZWZ3Q291bnRlciA8IDApCi0gICAgICAgIHJldHVybiBERUZXX1RPT19NQU5ZX1NUTVM7Ci0KLSAgICBkZWZ3RGlkQ29tcG9uZW50cyA9IDE7Ci0KLSAgICBpZiAoZGVmd1N0YXRlID09IERFRldfQ09NUE9ORU5UKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiO1xuRU5EIENPTVBPTkVOVFNcblxuIik7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiRU5EIENPTVBPTkVOVFNcblxuIik7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX0NPTVBPTkVOVF9FTkQ7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3U3RhcnRQaW5zKGludCBjb3VudCkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfUElOX1NUQVJUOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWRlZndEaWRDb21wb25lbnRzKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKChkZWZ3U3RhdGUgPj0gREVGV19QSU5fU1RBUlQpICYmIChkZWZ3U3RhdGUgPD0gREVGV19QSU5fRU5EKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIlBJTlMgJWQiLCBjb3VudCk7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICBkZWZ3Q291bnRlciA9IGNvdW50OwotICAgIGRlZndTdGF0ZSA9IERFRldfUElOX1NUQVJUOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd1Bpbihjb25zdCBjaGFyICAqbmFtZSwKLSAgICAgICAgY29uc3QgY2hhciAgKm5ldCwKLSAgICAgICAgaW50ICAgICAgICAgc3BlY2lhbCwgICAgICAgLy8gb3B0aW9uYWwgMC1pZ25vcmUgMS1zcGVjaWFsIAotICAgICAgICBjb25zdCBjaGFyICAqZGlyZWN0aW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcHRpb25hbCAKLSAgICAgICAgY29uc3QgY2hhciAgKnVzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwgCi0gICAgICAgIGNvbnN0IGNoYXIgICpzdGF0dXMsCi0gICAgICAgIGludCAgICAgICAgIHhvLAotICAgICAgICBpbnQgICAgICAgICB5bywKLSAgICAgICAgaW50ICAgICAgICAgb3JpZW50LCAgIC8vIG9wdGlvbmFsIAotICAgICAgICBjb25zdCBjaGFyICAqbGF5ZXIsCi0gICAgICAgIGludCAgICAgICAgIHhsLAotICAgICAgICBpbnQgICAgICAgICB5bCwKLSAgICAgICAgaW50ICAgICAgICAgeGgsCi0gICAgICAgIGludCAgICAgICAgIHloIC8vIG9wdGlvbmFsIAotICAgICAgICApCi17Ci0KLSAgICBkZWZ3RnVuYyA9IERFRldfUElOOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0KLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19QSU5fU1RBUlQgJiYgZGVmd1N0YXRlICE9IERFRldfUElOKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBkZWZ3Q291bnRlci0tOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiA7XG4gICAtICVzICsgTkVUICVzIiwgbmFtZSwgbmV0KTsKLQotICAgIGlmIChzcGVjaWFsKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArIFNQRUNJQUwiKTsKLSAgICBpZiAoZGlyZWN0aW9uKSB7Ci0gICAgICAgIGlmIChzdHJjbXAoZGlyZWN0aW9uLCAiSU5QVVQiKSAmJiBzdHJjbXAoZGlyZWN0aW9uLCAiT1VUUFVUIikgJiYKLSAgICAgICAgICAgIHN0cmNtcChkaXJlY3Rpb24sICJJTk9VVCIpICYmIHN0cmNtcChkaXJlY3Rpb24sICJGRUVEVEhSVSIpKQotICAgICAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgRElSRUNUSU9OICVzIiwgZGlyZWN0aW9uKTsKLSAgICB9Ci0gICAgaWYgKHVzZSkgewotICAgICAgICBpZiAoc3RyY21wKHVzZSwgIlNJR05BTCIpICYmIHN0cmNtcCh1c2UsICJQT1dFUiIpICYmCi0gICAgICAgICAgICBzdHJjbXAodXNlLCAiR1JPVU5EIikgJiYgc3RyY21wKHVzZSwgIkNMT0NLIikgJiYKLSAgICAgICAgICAgIHN0cmNtcCh1c2UsICJUSUVPRkYiKSAmJiBzdHJjbXAodXNlLCAiQU5BTE9HIikgJiYKLSAgICAgICAgICAgIHN0cmNtcCh1c2UsICJTQ0FOIikgJiYgc3RyY21wKHVzZSwgIlJFU0VUIikpCi0gICAgICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBVU0UgJXMiLCB1c2UpOwotICAgIH0KLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIGlmIChzdHJjbXAoc3RhdHVzLCAiRklYRUQiKSAmJiBzdHJjbXAoc3RhdHVzLCAiUExBQ0VEIikgJiYKLSAgICAgICAgICAgIHN0cmNtcChzdGF0dXMsICJDT1ZFUiIpKQotICAgICAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0KLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyAlcyAoICVkICVkICkgJXMiLCBzdGF0dXMsIHhvLCB5bywKLSAgICAgICAgICAgICAgICBkZWZ3T3JpZW50KG9yaWVudCkpOwotICAgIH0KLSAgICAvLyBJbiA1LjYsIHVzZXIgc2hvdWxkIHVzZSBkZWZQaW5MYXllciB0byB3cml0ZSBvdXQgbGF5ZXIgY29uc3RydWN0IAotICAgIGlmIChsYXllcikgewotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArIExBWUVSICVzICggJWQgJWQgKSAoICVkICVkICkiLAotICAgICAgICAgICAgICAgIGxheWVyLCB4bCwgeWwsIHhoLCB5aCk7Ci0gICAgfQotCi0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX1BJTjsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndQaW5TdHIoY29uc3QgY2hhciAgICpuYW1lLAotICAgICAgICAgICBjb25zdCBjaGFyICAgKm5ldCwKLSAgICAgICAgICAgaW50ICAgICAgICAgIHNwZWNpYWwsICAgICAgIC8vIG9wdGlvbmFsIDAtaWdub3JlIDEtc3BlY2lhbCAKLSAgICAgICAgICAgY29uc3QgY2hhciAgICpkaXJlY3Rpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwgCi0gICAgICAgICAgIGNvbnN0IGNoYXIgICAqdXNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsIAotICAgICAgICAgICBjb25zdCBjaGFyICAgKnN0YXR1cywKLSAgICAgICAgICAgaW50ICAgICAgICAgIHhvLAotICAgICAgICAgICBpbnQgICAgICAgICAgeW8sCi0gICAgICAgICAgIGNvbnN0IGNoYXIgICAqb3JpZW50LCAgIC8vIG9wdGlvbmFsIAotICAgICAgICAgICBjb25zdCBjaGFyICAgKmxheWVyLAotICAgICAgICAgICBpbnQgICAgICAgICAgeGwsCi0gICAgICAgICAgIGludCAgICAgICAgICB5bCwKLSAgICAgICAgICAgaW50ICAgICAgICAgIHhoLAotICAgICAgICAgICBpbnQgICAgICAgICAgeWggLy8gb3B0aW9uYWwgCi0gICAgICAgICAgICkKLXsKLQotICAgIGRlZndGdW5jID0gREVGV19QSU47ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLQotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1BJTl9TVEFSVCAmJiBkZWZ3U3RhdGUgIT0gREVGV19QSU4pCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGRlZndDb3VudGVyLS07Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiIDtcbiAgIC0gJXMgKyBORVQgJXMiLCBuYW1lLCBuZXQpOwotCi0gICAgaWYgKHNwZWNpYWwpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgU1BFQ0lBTCIpOwotICAgIGlmIChkaXJlY3Rpb24pIHsKLSAgICAgICAgaWYgKHN0cmNtcChkaXJlY3Rpb24sICJJTlBVVCIpICYmIHN0cmNtcChkaXJlY3Rpb24sICJPVVRQVVQiKSAmJgotICAgICAgICAgICAgc3RyY21wKGRpcmVjdGlvbiwgIklOT1VUIikgJiYgc3RyY21wKGRpcmVjdGlvbiwgIkZFRURUSFJVIikpCi0gICAgICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBESVJFQ1RJT04gJXMiLCBkaXJlY3Rpb24pOwotICAgIH0KLSAgICBpZiAodXNlKSB7Ci0gICAgICAgIGlmIChzdHJjbXAodXNlLCAiU0lHTkFMIikgJiYgc3RyY21wKHVzZSwgIlBPV0VSIikgJiYKLSAgICAgICAgICAgIHN0cmNtcCh1c2UsICJHUk9VTkQiKSAmJiBzdHJjbXAodXNlLCAiQ0xPQ0siKSAmJgotICAgICAgICAgICAgc3RyY21wKHVzZSwgIlRJRU9GRiIpICYmIHN0cmNtcCh1c2UsICJBTkFMT0ciKSAmJgotICAgICAgICAgICAgc3RyY21wKHVzZSwgIlNDQU4iKSAmJiBzdHJjbXAodXNlLCAiUkVTRVQiKSkKLSAgICAgICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArIFVTRSAlcyIsIHVzZSk7Ci0gICAgfQotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgaWYgKHN0cmNtcChzdGF0dXMsICJGSVhFRCIpICYmIHN0cmNtcChzdGF0dXMsICJQTEFDRUQiKSAmJgotICAgICAgICAgICAgc3RyY21wKHN0YXR1cywgIkNPVkVSIikpCi0gICAgICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArICVzICggJWQgJWQgKSAlcyIsIHN0YXR1cywgeG8sIHlvLAotICAgICAgICAgICAgICAgIG9yaWVudCk7Ci0gICAgfQotICAgIC8vIEluIDUuNiwgdXNlciBzaG91bGQgdXNlIGRlZlBpbkxheWVyIHRvIHdyaXRlIG91dCBsYXllciBjb25zdHJ1Y3QgCi0gICAgaWYgKGxheWVyKSB7Ci0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgTEFZRVIgJXMgKCAlZCAlZCApICggJWQgJWQgKSIsCi0gICAgICAgICAgICAgICAgbGF5ZXIsIHhsLCB5bCwgeGgsIHloKTsKLSAgICB9Ci0KLSAgICBkZWZ3TGluZXMrKzsKLQotICAgIGRlZndTdGF0ZSA9IERFRldfUElOOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi1pbnQKLWRlZndQaW5MYXllcihjb25zdCBjaGFyICpsYXllck5hbWUsCi0gICAgICAgICAgICAgaW50ICAgICAgICBzcGFjaW5nLAotICAgICAgICAgICAgIGludCAgICAgICAgZGVzaWduUnVsZVdpZHRoLAotICAgICAgICAgICAgIGludCAgICAgICAgeGwsCi0gICAgICAgICAgICAgaW50ICAgICAgICB5bCwKLSAgICAgICAgICAgICBpbnQgICAgICAgIHhoLAotICAgICAgICAgICAgIGludCAgICAgICAgeWgsCi0gICAgICAgICAgICAgaW50ICAgICAgICBtYXNrKQotewotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1BJTikKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmIChkZWZWZXJzaW9uTnVtIDwgNS42KQotICAgICAgICByZXR1cm4gREVGV19XUk9OR19WRVJTSU9OOwotICAgIGlmIChzcGFjaW5nICYmIGRlc2lnblJ1bGVXaWR0aCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7ICAvLyBvbmx5IG9uZSwgc3BhY2luZwotICAgIC8vIG9yIGRlc2lnblJ1bGVXaWR0aCBjYW4gYmUgZGVmaW5lZCwgbm90IGJvdGgKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgTEFZRVIgJXMgIiwgbGF5ZXJOYW1lKTsKLQotICAgIGlmIChtYXNrKSB7Ci0gICAgICAgIGlmIChkZWZWZXJzaW9uTnVtIDwgNS44KSB7Ci0gICAgICAgICAgICByZXR1cm4gREVGV19XUk9OR19WRVJTSU9OOwotICAgICAgICB9Ci0KLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgICBNQVNLICVkIiwgbWFzayk7Ci0gICAgfQotCi0gICAgaWYgKHNwYWNpbmcpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICAgU1BBQ0lORyAlZCIsIHNwYWNpbmcpOwotICAgIGVsc2UgaWYgKGRlc2lnblJ1bGVXaWR0aCkgICAgICAgIC8vIGNhbiBiZSBib3RoIDAKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgICBERVNJR05SVUxFV0lEVEggICVkIiwgZGVzaWduUnVsZVdpZHRoKTsKLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICAgICggJWQgJWQgKSAoICVkICVkICkiLCB4bCwgeWwsIHhoLCB5aCk7Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX1BJTjsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotaW50Ci1kZWZ3UGluUG9seWdvbihjb25zdCBjaGFyICAgKmxheWVyTmFtZSwKLSAgICAgICAgICAgICAgIGludCAgICAgICAgICBzcGFjaW5nLAotICAgICAgICAgICAgICAgaW50ICAgICAgICAgIGRlc2lnblJ1bGVXaWR0aCwKLSAgICAgICAgICAgICAgIGludCAgICAgICAgICBudW1fcG9seXMsCi0gICAgICAgICAgICAgICBkb3VibGUgICAgICAgKnhsLAotICAgICAgICAgICAgICAgZG91YmxlICAgICAgICp5bCwKLSAgICAgICAgICAgICAgIGludCAgICAgICAgICBtYXNrKQotewotICAgIGludCBpOwotCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfUElOKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKGRlZlZlcnNpb25OdW0gPCA1LjYpCi0gICAgICAgIHJldHVybiBERUZXX1dST05HX1ZFUlNJT047Ci0gICAgaWYgKHNwYWNpbmcgJiYgZGVzaWduUnVsZVdpZHRoKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsgLy8gb25seSBvbmUsIHNwYWNpbmcKLSAgICAvLyBvciBkZXNpZ25SdWxlV2lkdGggY2FuIGJlIGRlZmluZWQsIG5vdCBib3RoCi0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArIFBPTFlHT04gJXMgIiwgbGF5ZXJOYW1lKTsKLQotICAgIGlmIChtYXNrKSB7Ci0gICAgICAgIGlmIChkZWZWZXJzaW9uTnVtIDwgNS44KSB7Ci0gICAgICAgICAgICByZXR1cm4gREVGV19XUk9OR19WRVJTSU9OOwotICAgICAgICB9Ci0KLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgICBNQVNLICVkIiwgbWFzayk7Ci0gICAgfQotCi0gICAgaWYgKHNwYWNpbmcpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICAgU1BBQ0lORyAlZCIsIHNwYWNpbmcpOwotICAgIGVsc2UgaWYgKGRlc2lnblJ1bGVXaWR0aCkgICAgICAgIC8vIGNhbiBiZSBib3RoIDAKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgICBERVNJR05SVUxFV0lEVEggICVkIiwgZGVzaWduUnVsZVdpZHRoKTsKLQotICAgIHByaW50UG9pbnRzTnVtID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcG9seXM7IGkrKykgewotICAgICAgICBpZiAoKGkgPT0gMCkgfHwgKChpICUgNSkgPT0gMCkpIHsKLSAgICAgICAgICAgIHByaW50UG9pbnRzKGRlZndGaWxlLCAqeGwrKywgKnlsKyssICJcbiAgICAgICAgIiwgIiAiKTsKLSAgICAgICAgICAgIGRlZndMaW5lcysrOyAKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBwcmludFBvaW50cyhkZWZ3RmlsZSwgKnhsKyssICp5bCsrLCAiIiwgIiAiKTsKLSAgICB9Ci0gICAKLSAgICBkZWZ3U3RhdGUgPSBERUZXX1BJTjsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotLy8gNS43Ci1pbnQKLWRlZndQaW5WaWEoY29uc3QgY2hhciAgICp2aWFOYW1lLAotICAgICAgICAgICBpbnQgICAgICAgICAgeGwsCi0gICAgICAgICAgIGludCAgICAgICAgICB5bCwKLSAgICAgICAgICAgaW50ICAgICAgICAgIG1hc2spCi17Ci0KLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19QSU4pCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoZGVmVmVyc2lvbk51bSA8IDUuNykKLSAgICAgICAgcmV0dXJuIERFRldfV1JPTkdfVkVSU0lPTjsKLQotICAgIGlmIChtYXNrKSB7Ci0gICAgICAgIGlmIChkZWZWZXJzaW9uTnVtIDwgNS44KSB7Ci0gICAgICAgICAgICByZXR1cm4gREVGV19XUk9OR19WRVJTSU9OOwotICAgICAgICB9Ci0KLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBWSUEgJXMgTUFTSyAlZCAoICVkICVkICkgIiwgdmlhTmFtZSwgbWFzaywgeGwsIHlsKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArIFZJQSAlcyAoICVkICVkICkgIiwgdmlhTmFtZSwgeGwsIHlsKTsKLSAgICB9Ci0KLSAgICBkZWZ3TGluZXMrKzsKLSAgICBkZWZ3U3RhdGUgPSBERUZXX1BJTjsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi0vLyA1LjcKLWludAotZGVmd1BpblBvcnQoKQotewotCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfUElOKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKGRlZlZlcnNpb25OdW0gPCA1LjcpCi0gICAgICAgIHJldHVybiBERUZXX1dST05HX1ZFUlNJT047Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArIFBPUlQiKTsKLQotICAgIGRlZndMaW5lcysrOwotICAgIGRlZndTdGF0ZSA9IERFRldfUElOX1BPUlQ7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLS8vIDUuNwotaW50Ci1kZWZ3UGluUG9ydExheWVyKGNvbnN0IGNoYXIgKmxheWVyTmFtZSwKLSAgICAgICAgICAgICAgICAgaW50ICAgICAgICBzcGFjaW5nLAotICAgICAgICAgICAgICAgICBpbnQgICAgICAgIGRlc2lnblJ1bGVXaWR0aCwKLSAgICAgICAgICAgICAgICAgaW50ICAgICAgICB4bCwKLSAgICAgICAgICAgICAgICAgaW50ICAgICAgICB5bCwKLSAgICAgICAgICAgICAgICAgaW50ICAgICAgICB4aCwKLSAgICAgICAgICAgICAgICAgaW50ICAgICAgICB5aCwKLSAgICAgICAgICAgICAgICAgaW50ICAgICAgICBtYXNrKQotewotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1BJTiAmJiBkZWZ3U3RhdGUgIT0gREVGV19QSU5fUE9SVCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmIChkZWZWZXJzaW9uTnVtIDwgNS43KQotICAgICAgICByZXR1cm4gREVGV19XUk9OR19WRVJTSU9OOwotICAgIGlmIChzcGFjaW5nICYmIGRlc2lnblJ1bGVXaWR0aCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7ICAvLyBvbmx5IG9uZSwgc3BhY2luZwotICAgIC8vIG9yIGRlc2lnblJ1bGVXaWR0aCBjYW4gYmUgZGVmaW5lZCwgbm90IGJvdGgKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICAgKyBMQVlFUiAlcyAiLCBsYXllck5hbWUpOwotCi0gICAgaWYgKG1hc2spIHsKLSAgICAgICAgaWYgKGRlZlZlcnNpb25OdW0gPCA1LjgpIHsKLSAgICAgICAgICAgIHJldHVybiBERUZXX1dST05HX1ZFUlNJT047Ci0gICAgICAgIH0KLQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICAgICAgTUFTSyAlZCIsIG1hc2spOwotICAgIH0KLQotICAgIGlmIChzcGFjaW5nKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICAgICAgU1BBQ0lORyAlZCIsIHNwYWNpbmcpOwotICAgIGVsc2UgaWYgKGRlc2lnblJ1bGVXaWR0aCkgICAgICAgIC8vIGNhbiBiZSBib3RoIDAKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgICAgIERFU0lHTlJVTEVXSURUSCAgJWQiLCBkZXNpZ25SdWxlV2lkdGgpOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgICAoICVkICVkICkgKCAlZCAlZCApIiwgeGwsIHlsLCB4aCwgeWgpOwotCi0gICAgZGVmd1N0YXRlID0gREVGV19QSU47Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLS8vIDUuNwotaW50Ci1kZWZ3UGluUG9ydFBvbHlnb24oY29uc3QgY2hhciAgICpsYXllck5hbWUsCi0gICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHNwYWNpbmcsCi0gICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIGRlc2lnblJ1bGVXaWR0aCwKLSAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgbnVtX3BvbHlzLAotICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICAqeGwsCi0gICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgICp5bCwKLSAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgbWFzaykKLXsKLSAgICBpbnQgaTsKLQotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1BJTiAmJiBkZWZ3U3RhdGUgIT0gREVGV19QSU5fUE9SVCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmIChkZWZWZXJzaW9uTnVtIDwgNS43KQotICAgICAgICByZXR1cm4gREVGV19XUk9OR19WRVJTSU9OOwotICAgIGlmIChzcGFjaW5nICYmIGRlc2lnblJ1bGVXaWR0aCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7IC8vIG9ubHkgb25lLCBzcGFjaW5nCi0gICAgLy8gb3IgZGVzaWduUnVsZVdpZHRoIGNhbiBiZSBkZWZpbmVkLCBub3QgYm90aAotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgICArIFBPTFlHT04gJXMgIiwgbGF5ZXJOYW1lKTsKLQotICAgIGlmIChtYXNrKSB7Ci0gICAgICAgIGlmIChkZWZWZXJzaW9uTnVtIDwgNS44KSB7Ci0gICAgICAgICAgICByZXR1cm4gREVGV19XUk9OR19WRVJTSU9OOwotICAgICAgICB9Ci0KLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgICAgIE1BU0sgJWQiLCBtYXNrKTsKLSAgICB9Ci0KLSAgICBpZiAoc3BhY2luZykKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgICAgIFNQQUNJTkcgJWQiLCBzcGFjaW5nKTsKLSAgICBlbHNlIGlmIChkZXNpZ25SdWxlV2lkdGgpICAgICAgICAvLyBjYW4gYmUgYm90aCAwCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICAgICBERVNJR05SVUxFV0lEVEggICVkIiwgZGVzaWduUnVsZVdpZHRoKTsKLQotICAgIHByaW50UG9pbnRzTnVtID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BvbHlzOyBpKyspIHsKLSAgICAgICAgaWYgKChpID09IDApIHx8ICgoaSAlIDUpID09IDApKSB7Ci0gICAgICAgICAgICBwcmludFBvaW50cyhkZWZ3RmlsZSwgKnhsKyssICp5bCsrLCAiXG4gICAgICAgICAgIiwgIiAiKTsKLSAgICAgICAgICAgIGRlZndMaW5lcysrOyAKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBwcmludFBvaW50cyhkZWZ3RmlsZSwgKnhsKyssICp5bCsrLCAiIiwgIiAiKTsKLSAgICB9Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX1BJTjsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotLy8gNS43Ci1pbnQKLWRlZndQaW5Qb3J0VmlhKGNvbnN0IGNoYXIgICAqdmlhTmFtZSwKLSAgICAgICAgICAgICAgIGludCAgICAgICAgICB4bCwKLSAgICAgICAgICAgICAgIGludCAgICAgICAgICB5bCwKLSAgICAgICAgICAgICAgIGludCAgICAgICAgICBtYXNrKQotewotCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfUElOICYmIGRlZndTdGF0ZSAhPSBERUZXX1BJTl9QT1JUKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKGRlZlZlcnNpb25OdW0gPCA1LjcpCi0gICAgICAgIHJldHVybiBERUZXX1dST05HX1ZFUlNJT047Ci0KLSAgICBpZiAobWFzaykgewotICAgICAgICBpZiAoZGVmVmVyc2lvbk51bSA8IDUuOCkgewotICAgICAgICAgICAgcmV0dXJuIERFRldfV1JPTkdfVkVSU0lPTjsKLSAgICAgICAgfQotCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICAgKyBWSUEgJXMgTUFTSyAlZCAoICVkICVkICkgIiwgdmlhTmFtZSwgbWFzaywgeGwsIHlsKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICAgICsgVklBICVzICggJWQgJWQgKSAiLCB2aWFOYW1lLCB4bCwgeWwpOwotICAgIH0KLQotICAgIGRlZndMaW5lcysrOwotICAgIGRlZndTdGF0ZSA9IERFRldfUElOOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0vLyA1LjcKLWludAotZGVmd1BpblBvcnRMb2NhdGlvbihjb25zdCBjaGFyICAqc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBzdGF0dXNYLAotICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBzdGF0dXNZLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqb3JpZW50KQotewotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1BJTiAmJiBkZWZ3U3RhdGUgIT0gREVGV19QSU5fUE9SVCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmIChkZWZWZXJzaW9uTnVtIDwgNS43KQotICAgICAgICByZXR1cm4gREVGV19XUk9OR19WRVJTSU9OOwotCi0gICAgaWYgKHN0cmNtcChzdGF0dXMsICJGSVhFRCIpICYmIHN0cmNtcChzdGF0dXMsICJQTEFDRUQiKSAmJgotICAgICAgICBzdHJjbXAoc3RhdHVzLCAiQ09WRVIiKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgICArICVzICggJWQgJWQgKSAlcyAiLCBzdGF0dXMsIHN0YXR1c1gsIHN0YXR1c1ksCi0gICAgICAgICAgICBvcmllbnQpOwotICAgIGRlZndTdGF0ZSA9IERFRldfUElOOwotICAgIGRlZndMaW5lcysrOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi1pbnQKLWRlZndQaW5OZXRFeHByKGNvbnN0IGNoYXIgKnBpbkV4cHIpCi17Ci0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfUElOKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKGRlZlZlcnNpb25OdW0gPCA1LjYpCi0gICAgICAgIHJldHVybiBERUZXX1dST05HX1ZFUlNJT047Ci0gICAgaWYgKHBpbkV4cHIgJiYgcGluRXhwciAhPSAwICYmICpwaW5FeHByICE9IDApCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgTkVURVhQUiBcIiVzXCIiLCBwaW5FeHByKTsKLQotICAgIGRlZndMaW5lcysrOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd1BpblN1cHBseVNlbnNpdGl2aXR5KGNvbnN0IGNoYXIgKnBpbk5hbWUpCi17Ci0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfUElOKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKGRlZlZlcnNpb25OdW0gPCA1LjYpCi0gICAgICAgIHJldHVybiBERUZXX1dST05HX1ZFUlNJT047Ci0gICAgaWYgKHBpbk5hbWUgJiYgcGluTmFtZSAhPSAwICYmICpwaW5OYW1lICE9IDApCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgU1VQUExZU0VOU0lUSVZJVFkgJXMiLCBwaW5OYW1lKTsKLQotICAgIGRlZndMaW5lcysrOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd1Bpbkdyb3VuZFNlbnNpdGl2aXR5KGNvbnN0IGNoYXIgKnBpbk5hbWUpCi17Ci0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfUElOKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKGRlZlZlcnNpb25OdW0gPCA1LjYpCi0gICAgICAgIHJldHVybiBERUZXX1dST05HX1ZFUlNJT047Ci0gICAgaWYgKHBpbk5hbWUgJiYgcGluTmFtZSAhPSAwICYmICpwaW5OYW1lICE9IDApCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgR1JPVU5EU0VOU0lUSVZJVFkgJXMiLCBwaW5OYW1lKTsKLQotICAgIGRlZndMaW5lcysrOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd1BpbkFudGVubmFQaW5QYXJ0aWFsTWV0YWxBcmVhKGludCAgICAgICAgICAgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqbGF5ZXJOYW1lKQotewotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1BJTikKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmIChkZWZWZXJzaW9uTnVtIDwgNS40KQotICAgICAgICByZXR1cm4gREVGV19XUk9OR19WRVJTSU9OOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBBTlRFTk5BUElOUEFSVElBTE1FVEFMQVJFQSAlZCIsIHZhbHVlKTsKLSAgICBpZiAobGF5ZXJOYW1lKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiIExBWUVSICVzIiwgbGF5ZXJOYW1lKTsKLSAgICBkZWZ3TGluZXMrKzsKLQotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd1BpbkFudGVubmFQaW5QYXJ0aWFsTWV0YWxTaWRlQXJlYShpbnQgICAgICAgICAgIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpsYXllck5hbWUpCi17Ci0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfUElOKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKGRlZlZlcnNpb25OdW0gPCA1LjQpCi0gICAgICAgIHJldHVybiBERUZXX1dST05HX1ZFUlNJT047Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArIEFOVEVOTkFQSU5QQVJUSUFMTUVUQUxTSURFQVJFQSAlZCIsIHZhbHVlKTsKLSAgICBpZiAobGF5ZXJOYW1lKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiIExBWUVSICVzIiwgbGF5ZXJOYW1lKTsKLSAgICBkZWZ3TGluZXMrKzsKLQotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd1BpbkFudGVubmFQaW5QYXJ0aWFsQ3V0QXJlYShpbnQgICAgICAgICB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmxheWVyTmFtZSkKLXsKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19QSU4pCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoZGVmVmVyc2lvbk51bSA8IDUuNCkKLSAgICAgICAgcmV0dXJuIERFRldfV1JPTkdfVkVSU0lPTjsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgQU5URU5OQVBJTlBBUlRJQUxDVVRBUkVBICVkIiwgdmFsdWUpOwotICAgIGlmIChsYXllck5hbWUpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgTEFZRVIgJXMiLCBsYXllck5hbWUpOwotICAgIGRlZndMaW5lcysrOwotCi0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3UGluQW50ZW5uYU1vZGVsKGNvbnN0IGNoYXIgKm94aWRlKQotewotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1BJTikKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmIChkZWZWZXJzaW9uTnVtIDwgNS40KQotICAgICAgICByZXR1cm4gREVGV19XUk9OR19WRVJTSU9OOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBBTlRFTk5BTU9ERUwgJXMiLCBveGlkZSk7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndQaW5BbnRlbm5hUGluRGlmZkFyZWEoaW50ICAgICAgICAgICB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqbGF5ZXJOYW1lKQotewotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1BJTikKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmIChkZWZWZXJzaW9uTnVtIDwgNS40KQotICAgICAgICByZXR1cm4gREVGV19XUk9OR19WRVJTSU9OOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBBTlRFTk5BUElORElGRkFSRUEgJWQiLCB2YWx1ZSk7Ci0gICAgaWYgKGxheWVyTmFtZSkKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiBMQVlFUiAlcyIsIGxheWVyTmFtZSk7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndQaW5BbnRlbm5hUGluR2F0ZUFyZWEoaW50ICAgICAgICAgICB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqbGF5ZXJOYW1lKQotewotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1BJTikKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmIChkZWZWZXJzaW9uTnVtIDwgNS40KQotICAgICAgICByZXR1cm4gREVGV19XUk9OR19WRVJTSU9OOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBBTlRFTk5BUElOR0FURUFSRUEgJWQiLCB2YWx1ZSk7Ci0gICAgaWYgKGxheWVyTmFtZSkKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiBMQVlFUiAlcyIsIGxheWVyTmFtZSk7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndQaW5BbnRlbm5hUGluTWF4QXJlYUNhcihpbnQgICAgICAgICB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqbGF5ZXJOYW1lKQotewotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1BJTikKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmIChkZWZWZXJzaW9uTnVtIDwgNS40KQotICAgICAgICByZXR1cm4gREVGV19XUk9OR19WRVJTSU9OOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBBTlRFTk5BUElOTUFYQVJFQUNBUiAlZCIsIHZhbHVlKTsKLSAgICBpZiAoIWxheWVyTmFtZSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7ICAvLyBsYXllck5hbWUgaXMgcmVxdWlyZWQgCi0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiIExBWUVSICVzIiwgbGF5ZXJOYW1lKTsKLSAgICBkZWZ3TGluZXMrKzsKLQotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd1BpbkFudGVubmFQaW5NYXhTaWRlQXJlYUNhcihpbnQgICAgICAgICB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmxheWVyTmFtZSkKLXsKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19QSU4pCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoZGVmVmVyc2lvbk51bSA8IDUuNCkKLSAgICAgICAgcmV0dXJuIERFRldfV1JPTkdfVkVSU0lPTjsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgQU5URU5OQVBJTk1BWFNJREVBUkVBQ0FSICVkIiwgdmFsdWUpOwotICAgIGlmICghbGF5ZXJOYW1lKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsgIC8vIGxheWVyTmFtZSBpcyByZXF1aXJlZCAKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgTEFZRVIgJXMiLCBsYXllck5hbWUpOwotICAgIGRlZndMaW5lcysrOwotCi0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3UGluQW50ZW5uYVBpbk1heEN1dENhcihpbnQgICAgICAgICAgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKmxheWVyTmFtZSkKLXsKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19QSU4pCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoZGVmVmVyc2lvbk51bSA8IDUuNCkKLSAgICAgICAgcmV0dXJuIERFRldfV1JPTkdfVkVSU0lPTjsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgQU5URU5OQVBJTk1BWENVVENBUiAlZCIsIHZhbHVlKTsKLSAgICBpZiAoIWxheWVyTmFtZSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiIExBWUVSICVzIiwgbGF5ZXJOYW1lKTsKLSAgICBkZWZ3TGluZXMrKzsKLQotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd0VuZFBpbnMoKQotewotICAgIGRlZndGdW5jID0gREVGV19QSU5fRU5EOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfUElOX1NUQVJUICYmIGRlZndTdGF0ZSAhPSBERUZXX1BJTikKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmIChkZWZ3Q291bnRlciA+IDApCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgIGVsc2UgaWYgKGRlZndDb3VudGVyIDwgMCkKLSAgICAgICAgcmV0dXJuIERFRldfVE9PX01BTllfU1RNUzsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgO1xuRU5EIFBJTlNcblxuIik7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX1BJTl9FTkQ7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3U3RhcnRQaW5Qcm9wZXJ0aWVzKGludCBjb3VudCkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfUElOUFJPUF9TVEFSVDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKChkZWZ3U3RhdGUgPj0gREVGV19QSU5QUk9QX1NUQVJUKSAmJiAoZGVmd1N0YXRlIDw9IERFRldfUElOUFJPUF9FTkQpKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiUElOUFJPUEVSVElFUyAlZCA7XG4iLCBjb3VudCk7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICBkZWZ3Q291bnRlciA9IGNvdW50OwotICAgIGRlZndTdGF0ZSA9IERFRldfUElOUFJPUF9TVEFSVDsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndQaW5Qcm9wZXJ0eShjb25zdCBjaGFyICAqbmFtZSwKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqcGluTmFtZSkKLXsKLQotICAgIGRlZndGdW5jID0gREVGV19QSU5QUk9QOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0KLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19QSU5QUk9QX1NUQVJUICYmCi0gICAgICAgIGRlZndTdGF0ZSAhPSBERUZXX1BJTlBST1ApCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGRlZndDb3VudGVyLS07Ci0gICAgaWYgKCghbmFtZSB8fCAhKm5hbWUpIHx8ICghcGluTmFtZSB8fCAhKnBpbk5hbWUpKSAvLyByZXF1aXJlZAotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLQotICAgIGlmIChkZWZ3U3RhdGUgPT0gREVGV19QSU5QUk9QKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiO1xuIik7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICAgLSAlcyAlcyAiLCBuYW1lLCBwaW5OYW1lKTsKLSAgICBkZWZ3TGluZXMrKzsKLQotICAgIGRlZndTdGF0ZSA9IERFRldfUElOUFJPUDsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndFbmRQaW5Qcm9wZXJ0aWVzKCkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfUElOX0VORDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1BJTlBST1BfU1RBUlQgJiYKLSAgICAgICAgZGVmd1N0YXRlICE9IERFRldfUElOUFJPUCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmIChkZWZ3Q291bnRlciA+IDApCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgIGVsc2UgaWYgKGRlZndDb3VudGVyIDwgMCkKLSAgICAgICAgcmV0dXJuIERFRldfVE9PX01BTllfU1RNUzsKLQotICAgIGlmIChkZWZ3U3RhdGUgPT0gREVGV19QSU5QUk9QX1NUQVJUKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiRU5EIFBJTlBST1BFUlRJRVNcblxuIik7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiO1xuRU5EIFBJTlBST1BFUlRJRVNcblxuIik7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX1BJTlBST1BfRU5EOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd1N0YXJ0U3BlY2lhbE5ldHMoaW50IGNvdW50KQotewotICAgIGRlZndGdW5jID0gREVGV19TTkVUX1NUQVJUOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoKGRlZndTdGF0ZSA+PSBERUZXX1NORVRfU1RBUlQpICYmIChkZWZ3U3RhdGUgPD0gREVGV19TTkVUX0VORCkpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJTUEVDSUFMTkVUUyAlZCA7XG4iLCBjb3VudCk7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICBkZWZ3Q291bnRlciA9IGNvdW50OwotICAgIGRlZndTdGF0ZSA9IERFRldfU05FVF9TVEFSVDsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndTcGVjaWFsTmV0T3B0aW9ucygpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1NORVQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoZGVmd1N0YXRlID09IERFRldfU05FVCkgewotICAgICAgICBkZWZ3U3RhdGUgPSBERUZXX1NORVRfT1BUSU9OUzsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGlmIChkZWZ3U3RhdGUgPT0gREVGV19TTkVUX09QVElPTlMpCi0gICAgICAgIHJldHVybiAxOwotICAgIHJldHVybiAwOwotfQotCi0KLWludAotZGVmd1NwZWNpYWxOZXQoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfU05FVDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1NORVRfU1RBUlQgJiYKLSAgICAgICAgZGVmd1N0YXRlICE9IERFRldfU05FVF9FTkRORVQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBkZWZ3U3RhdGUgPSBERUZXX1NORVQ7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICAgLSAlcyIsIG5hbWUpOwotICAgIGRlZndMaW5lSXRlbUNvdW50ZXIgPSAwOwotICAgIGRlZndDb3VudGVyLS07Ci0KLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndTcGVjaWFsTmV0Q29ubmVjdGlvbihjb25zdCBjaGFyICppbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIHN5bnRoZXNpemVkKQotewotICAgIGRlZndGdW5jID0gREVGV19TTkVUOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfU05FVCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgaWYgKCgrK2RlZndMaW5lSXRlbUNvdW50ZXIgJiAzKSA9PSAwKSB7IC8vIHNpbmNlIGEgbmV0IGNhbiBoYXZlIG1vcmUgdGhhbgotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICIpOyAgLy8gb25lIGluc3QgcGluIGNvbm5lY3Rpb24sIGRvbid0IHByaW50Ci0gICAgICAgIGRlZndMaW5lcysrOyAgICAgICAgICAgICAvLyBuZXdsaW5lIHVudGlsIHRoZSBsaW5lIGlzIGNlcnRhaW4gbGVuZ3RoCi0gICAgfQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgKCAlcyAlcyAiLCBpbnN0LCBwaW4pOwotICAgIGlmIChzeW50aGVzaXplZCkKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiArIFNZTlRIRVNJWkVEICIpOwotICAgIGZwcmludGYoZGVmd0ZpbGUsICIpICIpOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd1NwZWNpYWxOZXRGaXhlZGJ1bXAoKQotewotICAgIGRlZndGdW5jID0gREVGV19TTkVUOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWRlZndTcGVjaWFsTmV0T3B0aW9ucygpKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArIEZJWEVEQlVNUCIpOwotICAgIGRlZndMaW5lcysrOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi1pbnQKLWRlZndTcGVjaWFsTmV0Vm9sdGFnZShkb3VibGUgZCkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfU05FVDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFkZWZ3U3BlY2lhbE5ldE9wdGlvbnMoKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgaW50IHYgPSAoaW50KShkICogMTAwMCk7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArIFZPTFRBR0UgJWQiLCB2KTsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndTcGVjaWFsTmV0U3BhY2luZyhjb25zdCBjaGFyICAgICpsYXllciwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgIHNwYWNpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgICBtaW53aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICAgIG1heHdpZHRoKQotewotICAgIGRlZndGdW5jID0gREVGV19TTkVUOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWRlZndTcGVjaWFsTmV0T3B0aW9ucygpKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArIFNQQUNJTkcgJXMgJWQiLCBsYXllciwgc3BhY2luZyk7Ci0gICAgaWYgKG1pbndpZHRoIHx8IG1heHdpZHRoKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiIFJBTkdFICUuMTFnICUuMTFnIiwgbWlud2lkdGgsIG1heHdpZHRoKTsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndTcGVjaWFsTmV0V2lkdGgoY29uc3QgY2hhciAgKmxheWVyLAotICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICB3KQotewotICAgIGRlZndGdW5jID0gREVGV19TTkVUOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWRlZndTcGVjaWFsTmV0T3B0aW9ucygpKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArIFdJRFRIICVzICVkIiwgbGF5ZXIsIHcpOwotICAgIGRlZndMaW5lcysrOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd1NwZWNpYWxOZXRTb3VyY2UoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfU05FVDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFkZWZ3U3BlY2lhbE5ldE9wdGlvbnMoKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBTT1VSQ0UgJXMiLCBuYW1lKTsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndTcGVjaWFsTmV0T3JpZ2luYWwoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfU05FVDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFkZWZ3U3BlY2lhbE5ldE9wdGlvbnMoKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBPUklHSU5BTCAlcyIsIG5hbWUpOwotICAgIGRlZndMaW5lcysrOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd1NwZWNpYWxOZXRQYXR0ZXJuKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1NORVQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghZGVmd1NwZWNpYWxOZXRPcHRpb25zKCkpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgUEFUVEVSTiAlcyIsIG5hbWUpOwotICAgIGRlZndMaW5lcysrOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd1NwZWNpYWxOZXRVc2UoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfU05FVDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFkZWZ3U3BlY2lhbE5ldE9wdGlvbnMoKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgaWYgKHN0cmNtcChuYW1lLCAiU0lHTkFMIikgJiYgc3RyY21wKG5hbWUsICJQT1dFUiIpICYmCi0gICAgICAgIHN0cmNtcChuYW1lLCAiR1JPVU5EIikgJiYgc3RyY21wKG5hbWUsICJDTE9DSyIpICYmCi0gICAgICAgIHN0cmNtcChuYW1lLCAiVElFT0ZGIikgJiYgc3RyY21wKG5hbWUsICJBTkFMT0ciKSAmJgotICAgICAgICBzdHJjbXAobmFtZSwgIlNDQU4iKSAmJiBzdHJjbXAobmFtZSwgIlJFU0VUIikpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBVU0UgJXMiLCBuYW1lKTsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndTcGVjaWFsTmV0V2VpZ2h0KGRvdWJsZSBkKQotewotICAgIGRlZndGdW5jID0gREVGV19TTkVUOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWRlZndTcGVjaWFsTmV0T3B0aW9ucygpKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArIFdFSUdIVCAlLjExZyIsIGQpOwotICAgIGRlZndMaW5lcysrOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd1NwZWNpYWxOZXRFc3RDYXAoZG91YmxlIGQpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1NORVQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghZGVmd1NwZWNpYWxOZXRPcHRpb25zKCkpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgRVNUQ0FQICUuMTFnIiwgZCk7Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd1NwZWNpYWxOZXRQYXRoU3RhcnQoY29uc3QgY2hhciAqdHlwKQotewotICAgIGRlZndGdW5jID0gREVGV19QQVRIOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWRlZndTcGVjaWFsTmV0T3B0aW9ucygpICYmCi0gICAgICAgIChkZWZ3U3RhdGUgIT0gREVGV19TVUJORVQpICYmIC8vIHBhdGggaW4gc3VibmV0IAotICAgICAgICAoZGVmd1N0YXRlICE9IERFRldfUEFUSCkpICAgLy8gTkVXIGluIHRoZSBwYXRoLCBwYXRoIGhhc24ndCBlbmQgeWV0IAotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBpZiAoc3RyY21wKHR5cCwgIk5FVyIpICYmIHN0cmNtcCh0eXAsICJGSVhFRCIpICYmIHN0cmNtcCh0eXAsICJDT1ZFUiIpICYmCi0gICAgICAgIHN0cmNtcCh0eXAsICJST1VURUQiKSAmJiBzdHJjbXAodHlwLCAiU0hJRUxEIikpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0gICAgZGVmd1NwTmV0U2hpZWxkID0gMDsKLQotICAgIC8vIFRoZSBzZWNvbmQgdGltZSBhcm91bmQgZm9yIGEgcGF0aCBvbiB0aGlzIG5ldCwgd2UKLSAgICAvLyBtdXN0IHN0YXJ0IGl0IHdpdGggYSBuZXcgaW5zdGVhZCBvZiBhIGZpeGVkLi4uCi0gICAgaWYgKHN0cmNtcCh0eXAsICJORVciKSA9PSAwKSB7Ci0gICAgICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19QQVRIKQotICAgICAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgTkVXIik7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAodHlwLCAiU0hJRUxEIikgPT0gMCkgewotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArICVzIiwgdHlwKTsKLSAgICAgICAgZGVmd1NwTmV0U2hpZWxkID0gMTsKLSAgICB9IGVsc2UKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyAlcyIsIHR5cCk7Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX1BBVEhfU1RBUlQ7Ci0gICAgZGVmd0xpbmVJdGVtQ291bnRlciA9IDA7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3U3BlY2lhbE5ldFNoaWVsZE5ldE5hbWUoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfUEFUSDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1BBVEhfU1RBUlQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoKCsrZGVmd0xpbmVJdGVtQ291bnRlciAmIDMpID09IDApIHsKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAiKTsKLSAgICAgICAgZGVmd0xpbmVzKys7Ci0gICAgfQotICAgIGlmIChkZWZ3U3BOZXRTaGllbGQpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgJXMiLCBuYW1lKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndTcGVjaWFsTmV0UGF0aFdpZHRoKGludCB3KQotewotICAgIGRlZndGdW5jID0gREVGV19QQVRIOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfUEFUSCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmICgoKytkZWZ3TGluZUl0ZW1Db3VudGVyICYgMykgPT0gMCkgewotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICIpOwotICAgICAgICBkZWZ3TGluZXMrKzsKLSAgICB9Ci0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiAlZCIsIHcpOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd1NwZWNpYWxOZXRQYXRoTGF5ZXIoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfUEFUSDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1BBVEhfU1RBUlQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoKCsrZGVmd0xpbmVJdGVtQ291bnRlciAmIDMpID09IDApIHsKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAiKTsKLSAgICAgICAgZGVmd0xpbmVzKys7Ci0gICAgfQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgJXMiLCBuYW1lKTsKLSAgICBkZWZ3U3RhdGUgPSBERUZXX1BBVEg7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3U3BlY2lhbE5ldFBhdGhTdHlsZShpbnQgc3R5bGVOdW0pCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1BBVEg7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19QQVRIKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBpZiAoKCsrZGVmd0xpbmVJdGVtQ291bnRlciAmIDMpID09IDApIHsKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAiKTsKLSAgICAgICAgZGVmd0xpbmVzKys7Ci0gICAgfQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgU1RZTEUgJWQiLCBzdHlsZU51bSk7Ci0gICAgZGVmd1N0YXRlID0gREVGV19QQVRIOwotICAgIGRlZndMaW5lSXRlbUNvdW50ZXIgPSAwOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd1NwZWNpYWxOZXRQYXRoU2hhcGUoY29uc3QgY2hhciAqdHlwKQotewotICAgIGRlZndGdW5jID0gREVGV19QQVRIOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfUEFUSCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgaWYgKHN0cmNtcCh0eXAsICJSSU5HIikgJiYgc3RyY21wKHR5cCwgIlNUUklQRSIpICYmIHN0cmNtcCh0eXAsICJGT0xMT1dQSU4iKSAmJgotICAgICAgICBzdHJjbXAodHlwLCAiSU9XSVJFIikgJiYgc3RyY21wKHR5cCwgIkNPUkVXSVJFIikgJiYKLSAgICAgICAgc3RyY21wKHR5cCwgIkJMT0NLV0lSRSIpICYmIHN0cmNtcCh0eXAsICJGSUxMV0lSRSIpICYmCi0gICAgICAgIHN0cmNtcCh0eXAsICJCTE9DS0FHRVdJUkUiKSAmJiBzdHJjbXAodHlwLCAiUEFEUklORyIpICYmCi0gICAgICAgIHN0cmNtcCh0eXAsICJCTE9DS1JJTkciKSAmJiBzdHJjbXAodHlwLCAiRFJDRklMTCIpICYmCi0gICAgICAgIHN0cmNtcCh0eXAsICJGSUxMV0lSRU9QQyIpKSAgICAgIC8vIDUuNwotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLQotICAgIGlmICgoKytkZWZ3TGluZUl0ZW1Db3VudGVyICYgMykgPT0gMCkgewotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICIpOwotICAgICAgICBkZWZ3TGluZXMrKzsKLSAgICB9Ci0gICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBTSEFQRSAlcyIsIHR5cCk7Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX1BBVEg7Ci0gICAgZGVmd0xpbmVJdGVtQ291bnRlciA9IDA7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd1NwZWNpYWxOZXRQYXRoTWFzayhpbnQgY29sb3JNYXNrKQotewotICAgIGlmIChkZWZWZXJzaW9uTnVtIDwgNS44KSB7Ci0gICAgICAgIHJldHVybiBERUZXX1dST05HX1ZFUlNJT047Ci0gICAgfQotCi0gICAgZGVmd0Z1bmMgPSBERUZXX1BBVEg7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLQotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1BBVEgpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoKCsrZGVmd0xpbmVJdGVtQ291bnRlciAmIDMpID09IDApIHsKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAiKTsKLSAgICAgICAgZGVmd0xpbmVzKys7Ci0gICAgfQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgTUFTSyAlZCIsIGNvbG9yTWFzayk7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd1NwZWNpYWxOZXRQYXRoUG9pbnQoaW50ICAgICBudW1QdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICpwb2ludHgsCi0gICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICpwb2ludHkpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBkZWZ3RnVuYyA9IERFRldfUEFUSDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1BBVEgpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIHByaW50UG9pbnRzTnVtID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUHRzOyBpKyspIHsKLSAgICAgICAgICBpZiAoKCsrZGVmd0xpbmVJdGVtQ291bnRlciAmIDMpID09IDApIHsKLSAgICAgICAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAiKTsKLSAgICAgICAgICAgICAgZGVmd0xpbmVzKys7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgcHJpbnRQb2ludHMoZGVmd0ZpbGUsIHBvaW50eFtpXSwgcG9pbnR5W2ldLCAiICIsICIiKTsKLSAgICAgIH0KLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndTcGVjaWFsTmV0UGF0aFZpYShjb25zdCBjaGFyICpuYW1lKQotewotICAgIGRlZndGdW5jID0gREVGV19QQVRIOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfUEFUSCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmICgoKytkZWZ3TGluZUl0ZW1Db3VudGVyICYgMykgPT0gMCkgewotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICIpOwotICAgICAgICBkZWZ3TGluZXMrKzsKLSAgICB9Ci0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiAlcyIsIG5hbWUpOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd1NwZWNpYWxOZXRQYXRoVmlhRGF0YShpbnQgICBudW1YLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICBudW1ZLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICBzdGVwWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgc3RlcFkpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1BBVEg7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19QQVRIKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKCgrK2RlZndMaW5lSXRlbUNvdW50ZXIgJiAzKSA9PSAwKSB7Ci0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgIik7Ci0gICAgICAgIGRlZndMaW5lcysrOwotICAgIH0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiIERPICVkIEJZICVkIFNURVAgJWQgJWQiLCBudW1YLCBudW1ZLCBzdGVwWCwgc3RlcFkpOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd1NwZWNpYWxOZXRQYXRoUG9pbnRXaXRoV2lyZUV4dChpbnQgICAgICBudW1QdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICpwb2ludHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICpwb2ludHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICpvcHRWYWx1ZSkKLXsKLSAgICBpbnQgaTsKLSAgICBkZWZ3RnVuYyA9IERFRldfUEFUSDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1BBVEgpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUHRzOyBpKyspIHsKLSAgICAgICAgaWYgKCgrK2RlZndMaW5lSXRlbUNvdW50ZXIgJiAzKSA9PSAwKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICAgICIpOwotICAgICAgICAgICAgZGVmd0xpbmVzKys7Ci0gICAgICAgIH0KLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiAoICUuMTFnICUuMTFnICIsIHBvaW50eFtpXSwgcG9pbnR5W2ldKTsKLSAgICAgICAgaWYgKG9wdFZhbHVlW2ldKQotICAgICAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiUuMTFnICIsIG9wdFZhbHVlW2ldKTsKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIikiKTsKLSAgICB9Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3U3BlY2lhbE5ldFBhdGhFbmQoKQotewotICAgIGRlZndGdW5jID0gREVGV19TTkVUX09QVElPTlM7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19QQVRIKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgZGVmd1N0YXRlID0gREVGV19TTkVUX09QVElPTlM7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50IAotZGVmd1NwZWNpYWxOZXRQb2x5Z29uKGNvbnN0IGNoYXIqIGxheWVyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcG9seXMsIAotICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB4bCwgZG91YmxlKiB5bCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZndGdW5jID0gREVGV19TTkVUX09QVElPTlM7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIGRlZndTcGVjaWFsTmV0T3B0aW9ucygpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZndTdGF0ZSAhPSBERUZXX1BBVEgpKSAgLy8gbm90IGluc2lkZSBhIHBhdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWZWZXJzaW9uTnVtIDwgNS42KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBERUZXX1dST05HX1ZFUlNJT047Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgUE9MWUdPTiAlcyAiLCBsYXllck5hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludFBvaW50c051bSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BvbHlzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGkgPT0gMCkgfHwgKChpICUgNSkgIT0gMCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UG9pbnRzKGRlZndGaWxlLCAqeGwrKywgKnlsKyssICIiLCAiICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludFBvaW50cyhkZWZ3RmlsZSwgICp4bCsrLCAqeWwrKywgIlxuICAgICAgICAgICAgICAgICIsICIgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZndMaW5lcysrOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZ3TGluZXMrKzsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndTcGVjaWFsTmV0UmVjdChjb25zdCBjaGFyICAgKmxheWVyTmFtZSwKLSAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgeGwsCi0gICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHlsLAotICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB4aCwKLSAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgeWgpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1NORVRfT1BUSU9OUzsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd1NwZWNpYWxOZXRPcHRpb25zKCkgJiYKLSAgICAgICAgKGRlZndTdGF0ZSAhPSBERUZXX1BBVEgpKSAgLy8gbm90IGluc2lkZSBhIHBhdGgKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgaWYgKGRlZlZlcnNpb25OdW0gPCA1LjYpCi0gICAgICAgIHJldHVybiBERUZXX1dST05HX1ZFUlNJT047Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArIFJFQ1QgJXMgKCAlZCAlZCApICggJWQgJWQgKSAiLCBsYXllck5hbWUsCi0gICAgICAgICAgICB4bCwgeWwsIHhoLCB5aCk7Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3U3BlY2lhbE5ldFZpYShjb25zdCBjaGFyICpsYXllck5hbWUpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1NORVRfT1BUSU9OUzsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd1NwZWNpYWxOZXRPcHRpb25zKCkgJiYKLSAgICAgICAgKGRlZndTdGF0ZSAhPSBERUZXX1BBVEgpKSAgLy8gbm90IGluc2lkZSBhIHBhdGgKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgaWYgKGRlZlZlcnNpb25OdW0gPCA1LjgpCi0gICAgICAgIHJldHVybiBERUZXX1dST05HX1ZFUlNJT047Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArIFZJQSAlcyAiLCBsYXllck5hbWUpOwotICAgIGRlZndMaW5lcysrOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd1NwZWNpYWxOZXRWaWFXaXRoT3JpZW50KGNvbnN0IGNoYXIgICpsYXllck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgb3JpZW50KQotewotICAgIGRlZndGdW5jID0gREVGV19TTkVUX09QVElPTlM7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndTcGVjaWFsTmV0T3B0aW9ucygpICYmCi0gICAgICAgIChkZWZ3U3RhdGUgIT0gREVGV19QQVRIKSkgIC8vIG5vdCBpbnNpZGUgYSBwYXRoCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGlmIChkZWZWZXJzaW9uTnVtIDwgNS44KQotICAgICAgICByZXR1cm4gREVGV19XUk9OR19WRVJTSU9OOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBWSUEgJXMgJXMiLCBsYXllck5hbWUsIGRlZndPcmllbnQob3JpZW50KSk7Ci0KLSAgICBkZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndTcGVjaWFsTmV0VmlhUG9pbnRzKGludCAgICAgbnVtX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgKnhsLAotICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAqeWwpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1NORVRfT1BUSU9OUzsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd1NwZWNpYWxOZXRPcHRpb25zKCkgJiYKLSAgICAgICAgKGRlZndTdGF0ZSAhPSBERUZXX1BBVEgpKSAgLy8gbm90IGluc2lkZSBhIHBhdGgKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgaWYgKGRlZlZlcnNpb25OdW0gPCA1LjgpCi0gICAgICAgIHJldHVybiBERUZXX1dST05HX1ZFUlNJT047Ci0KLQotICAgIHByaW50UG9pbnRzTnVtID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9wb2ludHM7IGkrKykgewotICAgICAgICBpZiAoKGkgPT0gMCkgfHwgKChpICUgNSkgIT0gMCkpCi0gICAgICAgICAgICBwcmludFBvaW50cyhkZWZ3RmlsZSwgKnhsKyssICp5bCsrLCAiIiwgIiAiKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBwcmludFBvaW50cyhkZWZ3RmlsZSwgKnhsKyssICp5bCsrLCAiXG4gICAgICAgICAgICAgIiwgIiAiKTsKLSAgICAgICAgICAgIGRlZndMaW5lcysrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci0KLX0KLQotCi1pbnQKLWRlZndTcGVjaWFsTmV0U2hpZWxkU3RhcnQoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfU0hJRUxEOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWRlZndTcGVjaWFsTmV0T3B0aW9ucygpKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICAvLyBUaGUgc2Vjb25kIHRpbWUgYXJvdW5kIGZvciBhIHNoaWVsZCBvbiB0aGlzIG5ldCwgd2UKLSAgICAvLyBtdXN0IHN0YXJ0IGl0IHdpdGggYSBuZXcgaW5zdGVhZCBvZiB0aGUgbmFtZSAuLi4KLSAgICBpZiAoc3RyY21wKG5hbWUsICJORVciKSA9PSAwKSB7Ci0gICAgICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19TSElFTEQpCi0gICAgICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiBORVciKTsKLSAgICB9IGVsc2UKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBTSElFTEQgJXMiLCBuYW1lKTsKLQotICAgIGRlZndTdGF0ZSA9IERFRldfU0hJRUxEOwotICAgIGRlZndMaW5lSXRlbUNvdW50ZXIgPSAwOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd1NwZWNpYWxOZXRTaGllbGRXaWR0aChpbnQgdykKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfU0hJRUxEOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfU0hJRUxEKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKCgrK2RlZndMaW5lSXRlbUNvdW50ZXIgJiAzKSA9PSAwKSB7Ci0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgIik7Ci0gICAgICAgIGRlZndMaW5lcysrOwotICAgIH0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICVkIiwgdyk7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3U3BlY2lhbE5ldFNoaWVsZExheWVyKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1NISUVMRDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1NISUVMRCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmICgoKytkZWZ3TGluZUl0ZW1Db3VudGVyICYgMykgPT0gMCkgewotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICIpOwotICAgICAgICBkZWZ3TGluZXMrKzsKLSAgICB9Ci0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiAlcyIsIG5hbWUpOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd1NwZWNpYWxOZXRTaGllbGRTaGFwZShjb25zdCBjaGFyICp0eXApCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1NISUVMRDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1NISUVMRCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgaWYgKHN0cmNtcCh0eXAsICJSSU5HIikgJiYgc3RyY21wKHR5cCwgIlNUUklQRSIpICYmIHN0cmNtcCh0eXAsICJGT0xMT1dQSU4iKSAmJgotICAgICAgICBzdHJjbXAodHlwLCAiSU9XSVJFIikgJiYgc3RyY21wKHR5cCwgIkNPUkVXSVJFIikgJiYKLSAgICAgICAgc3RyY21wKHR5cCwgIkJMT0NLV0lSRSIpICYmIHN0cmNtcCh0eXAsICJGSUxMV0lSRSIpICYmCi0gICAgICAgIHN0cmNtcCh0eXAsICJCTE9DS0FHRVdJUkUiKSAmJiBzdHJjbXAodHlwLCAiRFJDRklMTCIpKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLQotICAgIGlmICgoKytkZWZ3TGluZUl0ZW1Db3VudGVyICYgMykgPT0gMCkgewotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICIpOwotICAgICAgICBkZWZ3TGluZXMrKzsKLSAgICB9Ci0gICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBTSEFQRSAlcyIsIHR5cCk7Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX1NISUVMRDsKLSAgICBkZWZ3TGluZUl0ZW1Db3VudGVyID0gMDsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndTcGVjaWFsTmV0U2hpZWxkUG9pbnQoaW50ICAgICAgIG51bVB0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICpwb2ludHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAqcG9pbnR5KQotewotICAgIGludCBpOwotCi0gICAgZGVmd0Z1bmMgPSBERUZXX1NISUVMRDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1NISUVMRCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgcHJpbnRQb2ludHNOdW0gPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1QdHM7IGkrKykgewotICAgICAgICBpZiAoKCsrZGVmd0xpbmVJdGVtQ291bnRlciAmIDMpID09IDApIHsKLSAgICAgICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgIik7Ci0gICAgICAgICAgICBkZWZ3TGluZXMrKzsKLSAgICAgICAgfQotICAgICBwcmludFBvaW50cyhkZWZ3RmlsZSwgcG9pbnR4W2ldLCBwb2ludHlbaV0sICIgIiwgIiIpOwotICAgIH0KLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndTcGVjaWFsTmV0U2hpZWxkVmlhKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1NISUVMRDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1NISUVMRCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmICgoKytkZWZ3TGluZUl0ZW1Db3VudGVyICYgMykgPT0gMCkgewotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICIpOwotICAgICAgICBkZWZ3TGluZXMrKzsKLSAgICB9Ci0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiAlcyIsIG5hbWUpOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd1NwZWNpYWxOZXRTaGllbGRWaWFEYXRhKGludCBudW1YLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1ZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGVwWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcFkpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1NISUVMRDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1NISUVMRCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmICgoKytkZWZ3TGluZUl0ZW1Db3VudGVyICYgMykgPT0gMCkgewotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICIpOwotICAgICAgICBkZWZ3TGluZXMrKzsKLSAgICB9Ci0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiBETyAlZCBCWSAlZCBTVEVQICVkICVkIiwgbnVtWCwgbnVtWSwgc3RlcFgsIHN0ZXBZKTsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotaW50Ci1kZWZ3U3BlY2lhbE5ldFNoaWVsZEVuZCgpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1NORVRfT1BUSU9OUzsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1NISUVMRCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGRlZndTdGF0ZSA9IERFRldfU05FVF9PUFRJT05TOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd1NwZWNpYWxOZXRFbmRPbmVOZXQoKQotewotICAgIGRlZndGdW5jID0gREVGV19TTkVUX0VORE5FVDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFkZWZ3U3BlY2lhbE5ldE9wdGlvbnMoKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiA7XG4iKTsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICBkZWZ3U3RhdGUgPSBERUZXX1NORVRfRU5ETkVUOwotCi0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3RW5kU3BlY2lhbE5ldHMoKQotewotICAgIGRlZndGdW5jID0gREVGV19TTkVUX0VORDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1NORVRfU1RBUlQgJiYgZGVmd1N0YXRlICE9IERFRldfU05FVF9PUFRJT05TICYmCi0gICAgICAgIGRlZndTdGF0ZSAhPSBERUZXX1NORVRfRU5ETkVUICYmICAgLy8gbGFzdCBzdGF0ZSBpcyBzcGVjaWFsIG5ldAotICAgICAgICBkZWZ3U3RhdGUgIT0gREVGV19TTkVUKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKGRlZndDb3VudGVyID4gMCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgZWxzZSBpZiAoZGVmd0NvdW50ZXIgPCAwKQotICAgICAgICByZXR1cm4gREVGV19UT09fTUFOWV9TVE1TOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIkVORCBTUEVDSUFMTkVUU1xuXG4iKTsKLSAgICBkZWZ3TGluZXMrKzsKLQotICAgIGRlZndTdGF0ZSA9IERFRldfU05FVF9FTkQ7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3U3RhcnROZXRzKGludCBjb3VudCkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfTkVUX1NUQVJUOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoKGRlZndTdGF0ZSA+PSBERUZXX05FVF9TVEFSVCkgJiYgKGRlZndTdGF0ZSA8PSBERUZXX05FVF9FTkQpKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiTkVUUyAlZCA7XG4iLCBjb3VudCk7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICBkZWZ3Q291bnRlciA9IGNvdW50OwotICAgIGRlZndTdGF0ZSA9IERFRldfTkVUX1NUQVJUOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd05ldE9wdGlvbnMoKQotewotICAgIGRlZndGdW5jID0gREVGV19ORVQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoZGVmd1N0YXRlID09IERFRldfTkVUKSB7Ci0gICAgICAgIGRlZndTdGF0ZSA9IERFRldfTkVUX09QVElPTlM7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBpZiAoZGVmd1N0YXRlID09IERFRldfTkVUX09QVElPTlMpCi0gICAgICAgIHJldHVybiAxOwotICAgIHJldHVybiAwOwotfQotCi0KLWludAotZGVmd05ldChjb25zdCBjaGFyICpuYW1lKQotewotICAgIGRlZndGdW5jID0gREVGV19ORVQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19ORVRfU1RBUlQgJiYKLSAgICAgICAgZGVmd1N0YXRlICE9IERFRldfTkVUX0VORE5FVCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGRlZndTdGF0ZSA9IERFRldfTkVUOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiAgIC0gJXMiLCBuYW1lKTsKLSAgICBkZWZ3TGluZUl0ZW1Db3VudGVyID0gMDsKLSAgICBkZWZ3Q291bnRlci0tOwotCi0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3TmV0Q29ubmVjdGlvbihjb25zdCBjaGFyICAgICppbnN0LAotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqcGluLAotICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICBzeW50aGVzaXplZCkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfTkVUOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfTkVUKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBpZiAoKCsrZGVmd0xpbmVJdGVtQ291bnRlciAmIDMpID09IDApIHsgIC8vIHNpbmNlIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuIik7IC8vIGluc3QgJiBwaW4gY29ubmVjdGlvbiwgZG9uJ3QgcHJpbnQgbmV3bGluZQotICAgICAgICBkZWZ3TGluZXMrKzsgICAgICAgICAgICAgLy8gdW50aWwgdGhlIGxpbmUgaXMgY2VydGFpbiBsZW5ndGggbG9uZwotICAgIH0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICggJXMgJXMiLCBpbnN0LCBwaW4pOwotICAgIGlmIChzeW50aGVzaXplZCkKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiArIFNZTlRIRVNJWkVEICkgIik7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiICkgIik7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3TmV0TXVzdGpvaW5Db25uZWN0aW9uKGNvbnN0IGNoYXIgICAgKmluc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKnBpbikKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfTkVUOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfTkVUX0VORE5FVCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgaWYgKCgrK2RlZndMaW5lSXRlbUNvdW50ZXIgJiAzKSA9PSAwKSB7Ci0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgIik7Ci0gICAgICAgIGRlZndMaW5lcysrOwotICAgIH0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiIC0gTVVTVEpPSU4gKCAlcyAlcyApIiwgaW5zdCwgcGluKTsKLQotICBkZWZ3U3RhdGUgPSBERUZXX05FVDsKLSAgCi0gIGRlZndDb3VudGVyLS07Ci0KLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndOZXRGaXhlZGJ1bXAoKQotewotICAgIGRlZndGdW5jID0gREVGV19ORVQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghZGVmd05ldE9wdGlvbnMoKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBGSVhFREJVTVAiKTsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndOZXRGcmVxdWVuY3koZG91YmxlIGZyZXF1ZW5jeSkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfTkVUOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWRlZndOZXRPcHRpb25zKCkpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgRlJFUVVFTkNZICUuMTFnIiwgZnJlcXVlbmN5KTsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndOZXRTb3VyY2UoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfTkVUOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWRlZndOZXRPcHRpb25zKCkpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgU09VUkNFICVzIiwgbmFtZSk7Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3TmV0WHRhbGsoaW50IHh0YWxrKQotewotICAgIGRlZndGdW5jID0gREVGV19ORVQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghZGVmd05ldE9wdGlvbnMoKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBYVEFMSyAlZCIsIHh0YWxrKTsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndOZXRWcGluKGNvbnN0IGNoYXIgICp2cGluTmFtZSwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgICpsYXllck5hbWUsCi0gICAgICAgICAgICBpbnQgICAgICAgICBsYXllclhsLAotICAgICAgICAgICAgaW50ICAgICAgICAgbGF5ZXJZbCwKLSAgICAgICAgICAgIGludCAgICAgICAgIGxheWVyWGgsCi0gICAgICAgICAgICBpbnQgICAgICAgICBsYXllclloLAotICAgICAgICAgICAgY29uc3QgY2hhciAgKnN0YXR1cywKLSAgICAgICAgICAgIGludCAgICAgICAgIHN0YXR1c1gsCi0gICAgICAgICAgICBpbnQgICAgICAgICBzdGF0dXNZLAotICAgICAgICAgICAgaW50ICAgICAgICAgb3JpZW50KQotewotICAgIGRlZndGdW5jID0gREVGV19ORVQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghZGVmd05ldE9wdGlvbnMoKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmICgodnBpbk5hbWUgPT0gMCkgfHwgKCp2cGluTmFtZSA9PSAwKSkgLy8gcmVxdWlyZWQKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0KLSAgICBpZiAoc3RhdHVzICYmIHN0cmNtcChzdGF0dXMsICJQTEFDRUQiKSAmJiBzdHJjbXAoc3RhdHVzLCAiRklYRUQiKSAmJgotICAgICAgICBzdHJjbXAoc3RhdHVzLCAiQ09WRVIiKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgaWYgKHN0YXR1cyAmJiAob3JpZW50ID09IDEpKSAgLy8gcmVxdWlyZSBpZiBzdGF0dXMgaXMgc2V0Ci0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBWUElOICVzIiwgdnBpbk5hbWUpOwotICAgIGlmIChsYXllck5hbWUpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgTEFZRVIgJXMiLCBsYXllck5hbWUpOwotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgKCAlZCAlZCApICggJWQgJWQgKVxuIiwgbGF5ZXJYbCwgbGF5ZXJZbCwgbGF5ZXJYaCwKLSAgICAgICAgICAgIGxheWVyWWgpOwotICAgIGRlZndMaW5lcysrOwotCi0gICAgaWYgKHN0YXR1cykKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiAgICAgICAgICVzICggJWQgJWQgKSAlcyIsIHN0YXR1cywgc3RhdHVzWCwgc3RhdHVzWSwKLSAgICAgICAgICAgICAgICBkZWZ3T3JpZW50KG9yaWVudCkpOwotICAgIGRlZndMaW5lcysrOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd05ldFZwaW5TdHIoY29uc3QgY2hhciAgICp2cGluTmFtZSwKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAqbGF5ZXJOYW1lLAotICAgICAgICAgICAgICAgaW50ICAgICAgICAgIGxheWVyWGwsCi0gICAgICAgICAgICAgICBpbnQgICAgICAgICAgbGF5ZXJZbCwKLSAgICAgICAgICAgICAgIGludCAgICAgICAgICBsYXllclhoLAotICAgICAgICAgICAgICAgaW50ICAgICAgICAgIGxheWVyWWgsCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKnN0YXR1cywKLSAgICAgICAgICAgICAgIGludCAgICAgICAgICBzdGF0dXNYLAotICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHN0YXR1c1ksCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKm9yaWVudCkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfTkVUOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWRlZndOZXRPcHRpb25zKCkpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIXZwaW5OYW1lIHx8ICEqdnBpbk5hbWUpIC8vIHJlcXVpcmVkCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0gICAgaWYgKHN0YXR1cyAmJiBzdHJjbXAoc3RhdHVzLCAiUExBQ0VEIikgJiYgc3RyY21wKHN0YXR1cywgIkZJWEVEIikgJiYKLSAgICAgICAgc3RyY21wKHN0YXR1cywgIkNPVkVSIikpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgIGlmIChzdGF0dXMgJiYgb3JpZW50ICYmICpvcmllbnQgPT0gJ1wwJykgIC8vIHJlcXVpcmUgaWYgc3RhdHVzIGlzIHNldAotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgVlBJTiAlcyIsIHZwaW5OYW1lKTsKLSAgICBpZiAobGF5ZXJOYW1lKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiIExBWUVSICVzIiwgbGF5ZXJOYW1lKTsKLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICggJWQgJWQgKSAoICVkICVkIClcbiIsIGxheWVyWGwsIGxheWVyWWwsIGxheWVyWGgsCi0gICAgICAgICAgICBsYXllclloKTsKLSAgICBkZWZ3TGluZXMrKzsKLQotICAgIGlmIChzdGF0dXMpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgICAgICAgICAlcyAoICVkICVkICkgJXMiLCBzdGF0dXMsIHN0YXR1c1gsIHN0YXR1c1ksCi0gICAgICAgICAgICAgICAgb3JpZW50KTsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndOZXRPcmlnaW5hbChjb25zdCBjaGFyICpuYW1lKQotewotICAgIGRlZndGdW5jID0gREVGV19ORVQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghZGVmd05ldE9wdGlvbnMoKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBPUklHSU5BTCAlcyIsIG5hbWUpOwotICAgIGRlZndMaW5lcysrOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd05ldFBhdHRlcm4oY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfTkVUOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWRlZndOZXRPcHRpb25zKCkpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgUEFUVEVSTiAlcyIsIG5hbWUpOwotICAgIGRlZndMaW5lcysrOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd05ldFVzZShjb25zdCBjaGFyICpuYW1lKQotewotICAgIGRlZndGdW5jID0gREVGV19ORVQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghZGVmd05ldE9wdGlvbnMoKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgaWYgKHN0cmNtcChuYW1lLCAiU0lHTkFMIikgJiYgc3RyY21wKG5hbWUsICJQT1dFUiIpICYmCi0gICAgICAgIHN0cmNtcChuYW1lLCAiR1JPVU5EIikgJiYgc3RyY21wKG5hbWUsICJDTE9DSyIpICYmCi0gICAgICAgIHN0cmNtcChuYW1lLCAiVElFT0ZGIikgJiYgc3RyY21wKG5hbWUsICJBTkFMT0ciKSAmJgotICAgICAgICBzdHJjbXAobmFtZSwgIlNDQU4iKSAmJiBzdHJjbXAobmFtZSwgIlJFU0VUIikpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBVU0UgJXMiLCBuYW1lKTsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndOZXROb25kZWZhdWx0UnVsZShjb25zdCBjaGFyICpuYW1lKQotewotICAgIGRlZndGdW5jID0gREVGV19ORVQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICgoZGVmd1N0YXRlICE9IERFRldfTkVUKSAmJiAoZGVmd1N0YXRlICE9IERFRldfTkVUX09QVElPTlMpICYmCi0gICAgICAgIChkZWZ3U3RhdGUgIT0gREVGV19TVUJORVQpKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBpZiAoZGVmd1N0YXRlID09IERFRldfU1VCTkVUKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICAgICBOT05ERUZBVUxUUlVMRSAlcyIsIG5hbWUpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBOT05ERUZBVUxUUlVMRSAlcyIsIG5hbWUpOwotICAgIGRlZndMaW5lcysrOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd05ldFdlaWdodChkb3VibGUgZCkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfTkVUOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWRlZndOZXRPcHRpb25zKCkpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgV0VJR0hUICUuMTFnIiwgZCk7Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3TmV0RXN0Q2FwKGRvdWJsZSBkKQotewotICAgIGRlZndGdW5jID0gREVGV19ORVQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghZGVmd05ldE9wdGlvbnMoKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBFU1RDQVAgJS4xMWciLCBkKTsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndOZXRTaGllbGRuZXQoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfTkVUOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWRlZndOZXRPcHRpb25zKCkpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgU0hJRUxETkVUICVzIiwgbmFtZSk7Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3TmV0Tm9zaGllbGRTdGFydChjb25zdCBjaGFyICpuYW1lKQotewotICAgIGRlZndGdW5jID0gREVGV19OT1NISUVMRDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFkZWZ3TmV0T3B0aW9ucygpKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBOT1NISUVMRCAlcyIsIG5hbWUpOwotCi0gICAgZGVmd1N0YXRlID0gREVGV19OT1NISUVMRDsKLSAgICBkZWZ3TGluZUl0ZW1Db3VudGVyID0gMDsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndOZXROb3NoaWVsZFBvaW50KGludCAgICAgICAgbnVtUHRzLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKnBvaW50eCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipwb2ludHkpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBkZWZ3RnVuYyA9IERFRldfTk9TSElFTEQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19OT1NISUVMRCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1QdHM7IGkrKykgewotICAgICAgICBpZiAoKCsrZGVmd0xpbmVJdGVtQ291bnRlciAmIDMpID09IDApIHsKLSAgICAgICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgIik7Ci0gICAgICAgICAgICBkZWZ3TGluZXMrKzsKLSAgICAgICAgfQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiICggJXMgJXMgKSIsIHBvaW50eFtpXSwgcG9pbnR5W2ldKTsKLSAgICB9Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3TmV0Tm9zaGllbGRWaWEoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfTk9TSElFTEQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19OT1NISUVMRCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmICgoKytkZWZ3TGluZUl0ZW1Db3VudGVyICYgMykgPT0gMCkgewotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICIpOwotICAgICAgICBkZWZ3TGluZXMrKzsKLSAgICB9Ci0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiAlcyIsIG5hbWUpOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd05ldE5vc2hpZWxkRW5kKCkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfTkVUOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfTk9TSElFTEQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBkZWZ3U3RhdGUgPSBERUZXX05FVDsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndOZXRTdWJuZXRTdGFydChjb25zdCBjaGFyICpuYW1lKQotewotICAgIGRlZndGdW5jID0gREVGV19TVUJORVQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghZGVmd05ldE9wdGlvbnMoKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmICghbmFtZSB8fCAhKm5hbWUpIC8vIHJlcXVpcmVkCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBTVUJORVQgJXMiLCBuYW1lKTsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICBkZWZ3U3RhdGUgPSBERUZXX1NVQk5FVDsKLSAgICBkZWZ3TGluZUl0ZW1Db3VudGVyID0gMDsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndOZXRTdWJuZXRQaW4oY29uc3QgY2hhciAqY29tcE5hbWUsCi0gICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBpbk5hbWUpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1NVQk5FVDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1NVQk5FVCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmICgoIWNvbXBOYW1lIHx8ICEqY29tcE5hbWUpIHx8ICghcGluTmFtZSB8fCAhKnBpbk5hbWUpKSAvLyByZXF1aXJlZAotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICBpZiAoKCsrZGVmd0xpbmVJdGVtQ291bnRlciAmIDMpID09IDApIHsKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgICAiKTsKLSAgICAgICAgZGVmd0xpbmVzKys7Ci0gICAgfQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgKCAlcyAlcyApIiwgY29tcE5hbWUsIHBpbk5hbWUpOwotICAgIGRlZndMaW5lcysrOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd05ldFN1Ym5ldEVuZCgpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1NVQk5FVDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKChkZWZ3U3RhdGUgIT0gREVGV19TVUJORVQpICYmICAgIC8vIHN1Ym5ldCBkb2VzIG5vdCBoYXZlIHBhdGggCi0gICAgICAgIChkZWZ3U3RhdGUgIT0gREVGV19ORVRfT1BUSU9OUykpIC8vIHN1Ym5ldCBoYXMgcGF0aCBhbmQgcGF0aCBqdXN0IGVuZGVkIAotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgZGVmd1N0YXRlID0gREVGV19ORVRfT1BUSU9OUzsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndOZXRQYXRoU3RhcnQoY29uc3QgY2hhciAqdHlwKQotewotICAgIGRlZndGdW5jID0gREVGV19QQVRIOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWRlZndOZXRPcHRpb25zKCkgJiYgKGRlZndTdGF0ZSAhPSBERUZXX1NVQk5FVCkgJiYgLy8gcGF0aCBpbiBzdWJuZXQgCi0gICAgICAgIChkZWZ3U3RhdGUgIT0gREVGV19QQVRIKSkgICAgICAvLyBORVcgaW4gdGhlIHBhdGgsIHBhdGggaGFzbid0IGVuZCB5ZXQgCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGlmIChzdHJjbXAodHlwLCAiTkVXIikgJiYgc3RyY21wKHR5cCwgIkZJWEVEIikgJiYgc3RyY21wKHR5cCwgIkNPVkVSIikgJiYKLSAgICAgICAgc3RyY21wKHR5cCwgIlJPVVRFRCIpICYmIHN0cmNtcCh0eXAsICJOT1NISUVMRCIpKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLQotICAgIC8vIFRoZSBzZWNvbmQgdGltZSBhcm91bmQgZm9yIGEgcGF0aCBvbiB0aGlzIG5ldCwgd2UKLSAgICAvLyBtdXN0IHN0YXJ0IGl0IHdpdGggYSBuZXcgaW5zdGVhZCBvZiBhIGZpeGVkLi4uCi0gICAgaWYgKHN0cmNtcCh0eXAsICJORVciKSA9PSAwKSB7Ci0gICAgICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19QQVRIKQotICAgICAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICAgIE5FVyIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChkZWZ3U3RhdGUgPT0gREVGV19TVUJORVQpCi0gICAgICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICAlcyIsIHR5cCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgJXMiLCB0eXApOwotICAgIH0KLQotICAgIGRlZndTdGF0ZSA9IERFRldfUEFUSF9TVEFSVDsKLSAgICBkZWZ3TGluZUl0ZW1Db3VudGVyID0gMDsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndOZXRQYXRoV2lkdGgoaW50IHcpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1BBVEg7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19QQVRIKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKCgrK2RlZndMaW5lSXRlbUNvdW50ZXIgJiAzKSA9PSAwKSB7Ci0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICAgICIpOwotICAgICAgICBkZWZ3TGluZXMrKzsKLSAgICB9Ci0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiAlZCIsIHcpOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd05ldFBhdGhMYXllcihjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICBpbnQgICAgICAgIGlzVGFwZXIsCi0gICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJ1bGVOYW1lKQotewotICAgIGRlZndGdW5jID0gREVGV19QQVRIOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfUEFUSF9TVEFSVCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgLy8gb25seSBvbmUsIGVpdGhlciBpc1RhcGVyIG9yIHJ1bGVOYW1lIGNhbiBiZSBzZXQKLSAgICBpZiAoaXNUYXBlciAmJiBydWxlTmFtZSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgaWYgKCgrK2RlZndMaW5lSXRlbUNvdW50ZXIgJiAzKSA9PSAwKSB7Ci0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICAgIik7Ci0gICAgICAgIGRlZndMaW5lcysrOwotICAgIH0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICVzIiwgbmFtZSk7Ci0gICAgaWYgKGlzVGFwZXIpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgVEFQRVIiKTsKLSAgICBlbHNlIGlmIChydWxlTmFtZSkKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiBUQVBFUlJVTEUgJXMiLCBydWxlTmFtZSk7Ci0gICAgZGVmd1N0YXRlID0gREVGV19QQVRIOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd05ldFBhdGhTdHlsZShpbnQgc3R5bGVOdW0pCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1BBVEg7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19QQVRIKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiIFNUWUxFICVkIiwgc3R5bGVOdW0pOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd05ldFBhdGhQb2ludChpbnQgICAgbnVtUHRzLAotICAgICAgICAgICAgICAgICBkb3VibGUgKnBvaW50eCwKLSAgICAgICAgICAgICAgICAgZG91YmxlICpwb2ludHkpCi17Ci0gICAgaW50IGk7Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1BBVEg7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19QQVRIKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBwcmludFBvaW50c051bSA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bVB0czsgaSsrKSB7Ci0gICAgICAgIGlmICgoKytkZWZ3TGluZUl0ZW1Db3VudGVyICYgMykgPT0gMCkgewotICAgICAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgICAiKTsKLSAgICAgICAgICAgIGRlZndMaW5lcysrOwotICAgICAgICB9Ci0gICAgICAgIHByaW50UG9pbnRzKGRlZndGaWxlLCBwb2ludHhbaV0sIHBvaW50eVtpXSwgIiAiLCAiIik7Ci0gICAgfQotICAgIHJldHVybiBERUZXX09LOwotfQotCi1pbnQKLWRlZndOZXRQYXRoUG9pbnRXaXRoRXh0KGludCAgICAgbnVtUHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAqcG9pbnR4LAotICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAqcG9pbnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAqb3B0VmFsdWUpCi17Ci0gICAgaW50IGk7Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1BBVEg7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19QQVRIKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bVB0czsgaSsrKSB7Ci0gICAgICAgIGlmICgoKytkZWZ3TGluZUl0ZW1Db3VudGVyICYgMykgPT0gMCkgewotICAgICAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgICAiKTsKLSAgICAgICAgICAgIGRlZndMaW5lcysrOwotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgKCAlLjExZyAlLjExZyAlLjExZyApIiwgcG9pbnR4W2ldLCBwb2ludHlbaV0sIG9wdFZhbHVlW2ldKTsKLSAgICB9Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd05ldFBhdGhWaWEoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfUEFUSDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1BBVEgpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoKCsrZGVmd0xpbmVJdGVtQ291bnRlciAmIDMpID09IDApIHsKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgICAiKTsKLSAgICAgICAgZGVmd0xpbmVzKys7Ci0gICAgfQotICAgIGlmICghbmFtZSB8fCAhKm5hbWUpIC8vIHJlcXVpcmVkCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiAlcyIsIG5hbWUpOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd05ldFBhdGhWaWFXaXRoT3JpZW50KGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBvcmllbnQpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1BBVEg7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19QQVRIKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKCgrK2RlZndMaW5lSXRlbUNvdW50ZXIgJiAzKSA9PSAwKSB7Ci0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICAgIik7Ci0gICAgICAgIGRlZndMaW5lcysrOwotICAgIH0KLQotICAgIGlmICghbmFtZSB8fCAhKm5hbWUpIC8vIHJlcXVpcmVkCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0gICAgaWYgKG9yaWVudCA9PSAtMSkKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiAlcyIsIG5hbWUpOwotICAgIGVsc2UgaWYgKG9yaWVudCA+PSAwICYmIG9yaWVudCA8PSA3KQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiICVzICVzIiwgbmFtZSwgZGVmd09yaWVudChvcmllbnQpKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd05ldFBhdGhWaWFXaXRoT3JpZW50U3RyKGNvbnN0IGNoYXIgICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpvcmllbnQpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1BBVEg7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19QQVRIKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKCgrK2RlZndMaW5lSXRlbUNvdW50ZXIgJiAzKSA9PSAwKSB7Ci0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICAgIik7Ci0gICAgICAgIGRlZndMaW5lcysrOwotICAgIH0KLQotICAgIGlmICghbmFtZSB8fCAhKm5hbWUpIC8vIHJlcXVpcmVkCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0gICAgaWYgKCFvcmllbnQgfHwgISpvcmllbnQpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgJXMiLCBuYW1lKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgJXMgJXMiLCBuYW1lLCBvcmllbnQpOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi1pbnQKLWRlZndOZXRQYXRoTWFzayhpbnQgY29sb3JNYXNrKQotewotICAgIGlmIChkZWZWZXJzaW9uTnVtIDwgNS44KSB7Ci0gICAgICAgIHJldHVybiBERUZXX1dST05HX1ZFUlNJT047Ci0gICAgfQotCi0gICAgZGVmd0Z1bmMgPSBERUZXX1BBVEg7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19QQVRIKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKCgrK2RlZndMaW5lSXRlbUNvdW50ZXIgJiAzKSA9PSAwKSB7Ci0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgIik7Ci0gICAgICAgIGRlZndMaW5lcysrOwotICAgIH0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiIE1BU0sgJWQiLCBjb2xvck1hc2spOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi1pbnQKLWRlZndOZXRQYXRoUmVjdChpbnQgZGVsdGFYMSwKLSAgICAgICAgICAgICAgICBpbnQgZGVsdGFZMSwKLSAgICAgICAgICAgICAgICBpbnQgZGVsdGFYMiwKLSAgICAgICAgICAgICAgICBpbnQgZGVsdGFZMikKLXsKLSAgICBpZiAoZGVmVmVyc2lvbk51bSA8IDUuOCkKLSAgICAgICAgcmV0dXJuIERFRldfV1JPTkdfVkVSU0lPTjsKLQotICAgIGRlZndGdW5jID0gREVGV19QQVRIOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfUEFUSCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgaWYgKCgrK2RlZndMaW5lSXRlbUNvdW50ZXIgJiAzKSA9PSAwKSB7Ci0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgIik7Ci0gICAgICAgIGRlZndMaW5lcysrOwotICAgIH0KLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgUkVDVCAoICVkICVkICVkICVkICkiLCBkZWx0YVgxLCBkZWx0YVkxLCBkZWx0YVgyLCBkZWx0YVkyKTsKLQotICAgIHJldHVybiBERUZXX09LOwotfQotCi1pbnQKLWRlZndOZXRQYXRoVmlydHVhbChpbnQgIHgsCi0gICAgICAgICAgICAgICAgICAgaW50ICB5KQotewotICAgIGlmIChkZWZWZXJzaW9uTnVtIDwgNS44KQotICAgICAgICByZXR1cm4gREVGV19XUk9OR19WRVJTSU9OOwotCi0gICAgZGVmd0Z1bmMgPSBERUZXX1BBVEg7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19QQVRIKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKCgrK2RlZndMaW5lSXRlbUNvdW50ZXIgJiAzKSA9PSAwKSB7Ci0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgIik7Ci0gICAgICAgIGRlZndMaW5lcysrOwotICAgIH0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiIFZJUlRVQUwgKCAlZCAlZCApIiwgeCwgeSk7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd05ldFBhdGhFbmQoKQotewotICAgIGRlZndGdW5jID0gREVGV19QQVRIOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfUEFUSCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGRlZndTdGF0ZSA9IERFRldfTkVUX09QVElPTlM7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3TmV0RW5kT25lTmV0KCkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfTkVUX0VORE5FVDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFkZWZ3TmV0T3B0aW9ucygpKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiIDtcbiIpOwotICAgIGRlZndMaW5lcysrOwotICAgIGRlZndTdGF0ZSA9IERFRldfTkVUX0VORE5FVDsKLQotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd0VuZE5ldHMoKQotewotICAgIGRlZndGdW5jID0gREVGV19ORVRfRU5EOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfTkVUX1NUQVJUICYmIGRlZndTdGF0ZSAhPSBERUZXX05FVF9PUFRJT05TICYmCi0gICAgICAgIGRlZndTdGF0ZSAhPSBERUZXX05FVCAmJgotICAgICAgICBkZWZ3U3RhdGUgIT0gREVGV19ORVRfRU5ETkVUKSAvLyBsYXN0IHN0YXRlIGlzIGEgbmV0IAotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKGRlZndDb3VudGVyID4gMCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgZWxzZSBpZiAoZGVmd0NvdW50ZXIgPCAwKQotICAgICAgICByZXR1cm4gREVGV19UT09fTUFOWV9TVE1TOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIkVORCBORVRTXG5cbiIpOwotICAgIGRlZndMaW5lcysrOwotCi0gICAgZGVmd1N0YXRlID0gREVGV19ORVRfRU5EOwotICAgIGRlZndEaWROZXRzID0gMTsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndTdGFydElPVGltaW5ncyhpbnQgY291bnQpCi17Ci0gICAgZGVmd09ic29sZXRlTnVtID0gREVGV19JT1RJTUlOR19TVEFSVDsKLSAgICBkZWZ3RnVuYyA9IERFRldfSU9USU1JTkdfU1RBUlQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghZGVmd0RpZE5ldHMpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoKGRlZndTdGF0ZSA+PSBERUZXX0lPVElNSU5HX1NUQVJUKSAmJgotICAgICAgICAoZGVmd1N0YXRlID49IERFRldfSU9USU1JTkdfRU5EKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmIChkZWZWZXJzaW9uTnVtID49IDUuNCkKLSAgICAgICAgcmV0dXJuIERFRldfT0JTT0xFVEU7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiSU9USU1JTkdTICVkIDtcbiIsIGNvdW50KTsKLSAgICBkZWZ3TGluZXMrKzsKLQotICAgIGRlZndDb3VudGVyID0gY291bnQ7Ci0gICAgZGVmd1N0YXRlID0gREVGV19JT1RJTUlOR19TVEFSVDsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndJT1RpbWluZyhjb25zdCBjaGFyICppbnN0YW5jZSwKLSAgICAgICAgICAgICBjb25zdCBjaGFyICpwaW4pCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX0lPVElNSU5HOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfSU9USU1JTkdfU1RBUlQgJiYKLSAgICAgICAgZGVmd1N0YXRlICE9IERFRldfSU9USU1JTkcpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGlmIChkZWZ3U3RhdGUgPT0gREVGV19JT1RJTUlORykKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiA7XG4iKTsgICAvLyBmcm9tIHByZXZpb3VzIHN0YXRlbWVudAotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgICAtICggJXMgJXMgKVxuIiwgaW5zdGFuY2UsIHBpbik7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICBkZWZ3Q291bnRlci0tOwotICAgIGRlZndTdGF0ZSA9IERFRldfSU9USU1JTkc7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd0lPVGltaW5nVmFyaWFibGUoY29uc3QgY2hhciAqcmlzZUZhbGwsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIG51bTEsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIG51bTIpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX0lPVElNSU5HOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfSU9USU1JTkcpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGlmIChzdHJjbXAocmlzZUZhbGwsICJSSVNFIikgJiYKLSAgICAgICAgc3RyY21wKHJpc2VGYWxsLCAiRkFMTCIpKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgICAgICArICVzIFZBUklBQkxFICVkICVkXG4iLCByaXNlRmFsbCwKLSAgICAgICAgICAgIG51bTEsIG51bTIpOwotICAgIGRlZndMaW5lcysrOwotCi0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd0lPVGltaW5nU2xld3JhdGUoY29uc3QgY2hhciAqcmlzZUZhbGwsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIG51bTEsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIG51bTIpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX0lPVElNSU5HOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfSU9USU1JTkcpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGlmIChzdHJjbXAocmlzZUZhbGwsICJSSVNFIikgJiYKLSAgICAgICAgc3RyY21wKHJpc2VGYWxsLCAiRkFMTCIpKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgICAgICArICVzIFNMRVdSQVRFICVkICVkXG4iLCByaXNlRmFsbCwKLSAgICAgICAgICAgIG51bTEsIG51bTIpOwotICAgIGRlZndMaW5lcysrOwotCi0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd0lPVGltaW5nRHJpdmVjZWxsKGNvbnN0IGNoYXIgICAgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqZnJvbVBpbiwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICp0b1BpbiwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgIG51bURyaXZlcnMpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX0lPVElNSU5HOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfSU9USU1JTkcpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIW5hbWUgfHwgISpuYW1lKSAvLyByZXF1aXJlZAotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgICAgICArIERSSVZFQ0VMTCAlcyAiLCBuYW1lKTsKLSAgICBpZiAoZnJvbVBpbiAmJiAoIXRvUGluIHx8ICEqdG9QaW4pKSAvLyBpZiBoYXZlIGZyb21QaW4sIHRvUGluIGlzIHJlcXVpcmVkCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgIGlmIChmcm9tUGluKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiRlJPTVBJTiAlcyAiLCBmcm9tUGluKTsKLSAgICBpZiAodG9QaW4pCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJUT1BJTiAlcyAiLCB0b1Bpbik7Ci0gICAgaWYgKG51bURyaXZlcnMpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJQQVJBTExFTCAlZCAiLCBudW1Ecml2ZXJzKTsKLSAgICBkZWZ3TGluZXMrKzsKLQotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd0lPVGltaW5nQ2FwYWNpdGFuY2UoZG91YmxlIG51bSkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfSU9USU1JTkc7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19JT1RJTUlORykKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiAgICAgICsgQ0FQQUNJVEFOQ0UgJS4xMWciLCBudW0pOwotICAgIGRlZndMaW5lcysrOwotCi0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd0VuZElPVGltaW5ncygpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX0lPVElNSU5HX0VORDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX0lPVElNSU5HX1NUQVJUICYmIGRlZndTdGF0ZSAhPSBERUZXX0lPVElNSU5HKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKGRlZndDb3VudGVyID4gMCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgZWxzZSBpZiAoZGVmd0NvdW50ZXIgPCAwKQotICAgICAgICByZXR1cm4gREVGV19UT09fTUFOWV9TVE1TOwotCi0gICAgaWYgKGRlZndTdGF0ZSA9PSBERUZXX0lPVElNSU5HKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiIDtcbiIpOyAgIC8vIGZyb20gcHJldmlvdXMgc3RhdGVtZW50Ci0gICAgZnByaW50ZihkZWZ3RmlsZSwgIkVORCBJT1RJTUlOR1NcblxuIik7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX0lPVElNSU5HX0VORDsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndTdGFydFNjYW5jaGFpbnMoaW50IGNvdW50KQotewotICAgIGRlZndGdW5jID0gREVGV19TQ0FOQ0hBSU5fU1RBUlQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghZGVmd0RpZE5ldHMpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoKGRlZndTdGF0ZSA+PSBERUZXX1NDQU5DSEFJTl9TVEFSVCkgJiYKLSAgICAgICAgKGRlZndTdGF0ZSA8PSBERUZXX1NDQU5DSEFJTl9FTkQpKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiU0NBTkNIQUlOUyAlZCA7XG4iLCBjb3VudCk7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX1NDQU5DSEFJTl9TVEFSVDsKLSAgICBkZWZ3Q291bnRlciA9IGNvdW50OwotICAgIHJldHVybiBERUZXX09LOwotfQotCi1pbnQKLWRlZndTY2FuY2hhaW4oY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfU0NBTkNIQUlOOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfU0NBTkNIQUlOX1NUQVJUICYmIGRlZndTdGF0ZSAhPSBERUZXX1NDQU5DSEFJTiAmJgotICAgICAgICBkZWZ3U3RhdGUgIT0gREVGV19TQ0FOX0ZMT0FUSU5HICYmIGRlZndTdGF0ZSAhPSBERUZXX1NDQU5fT1JERVJFRCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgaWYgKGRlZndTdGF0ZSA9PSBERUZXX1NDQU5DSEFJTiB8fCBkZWZ3U3RhdGUgPT0gREVGV19TQ0FOX0ZMT0FUSU5HIHx8Ci0gICAgICAgIGRlZndTdGF0ZSA9PSBERUZXX1NDQU5fT1JERVJFRCkgLy8gcHV0IGEgOyBmb3IgdGhlIHByZXZpb3VzIHNjYW5jaGFpbgotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiIDtcbiIpOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiAgIC0gJXMiLCBuYW1lKTsKLSAgICBkZWZ3TGluZXMrKzsKLQotICAgIGRlZndDb3VudGVyLS07Ci0gICAgZGVmd1N0YXRlID0gREVGV19TQ0FOQ0hBSU47Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd1NjYW5jaGFpbkNvbW1vbnNjYW5waW5zKGNvbnN0IGNoYXIgICppbnN0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqcGluMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqaW5zdDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKnBpbjIpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1NDQU5DSEFJTjsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1NDQU5DSEFJTl9TVEFSVCAmJiBkZWZ3U3RhdGUgIT0gREVGV19TQ0FOQ0hBSU4gJiYKLSAgICAgICAgZGVmd1N0YXRlICE9IERFRldfU0NBTl9GTE9BVElORyAmJiBkZWZ3U3RhdGUgIT0gREVGV19TQ0FOX09SREVSRUQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGlmICghaW5zdDEpIHsgICAgIC8vIGlmIGluc3QxIGlzIG51bGwsIG5vdGhpbmcgd2lsbCBiZSB3cml0dGVuCi0gICAgICAgIGRlZndTdGF0ZSA9IERFRldfU0NBTkNIQUlOOwotICAgICAgICByZXR1cm4gREVGV19PSzsKLSAgICB9Ci0KLSAgICBpZiAoaW5zdDEgJiYgc3RyY21wKGluc3QxLCAiSU4iKSAmJiBzdHJjbXAoaW5zdDEsICJPVVQiKSkgLy8gSU4gfCBPVVQKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0KLSAgICBpZiAoaW5zdDEgJiYgIXBpbjEpICAgICAgICAvLyBwaW4xIGNhbid0IGJlIE5VTEwgaWYgaW5zdDEgaXMgbm90Ci0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBDT01NT05TQ0FOUElOUyAoICVzICVzICkiLCBpbnN0MSwgcGluMSk7Ci0KLSAgICBpZiAoaW5zdDIgJiYgIXBpbjIpICAgICAgICAvLyBwaW4yIGNhbid0IGJlIE5VTEwgaWYgaW5zdDIgaXMgbm90Ci0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0gICAgaWYgKGluc3QyICYmIHN0cmNtcChpbnN0MiwgIklOIikgJiYgc3RyY21wKGluc3QyLCAiT1VUIikpIC8vIElOIHwgT1VUCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0gICAgaWYgKGluc3QyKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiICggJXMgJXMgKSIsIGluc3QyLCBwaW4yKTsKLQotICAgIGRlZndMaW5lcysrOwotCi0gICAgZGVmd1N0YXRlID0gREVGV19TQ0FOQ0hBSU47Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd1NjYW5jaGFpblBhcnRpdGlvbihjb25zdCBjaGFyICAgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICBtYXhCaXRzKQotewotICAgIGRlZndGdW5jID0gREVGV19TQ0FOQ0hBSU47ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19TQ0FOQ0hBSU5fU1RBUlQgJiYgZGVmd1N0YXRlICE9IERFRldfU0NBTkNIQUlOICYmCi0gICAgICAgIGRlZndTdGF0ZSAhPSBERUZXX1NDQU5fRkxPQVRJTkcgJiYgZGVmd1N0YXRlICE9IERFRldfU0NBTl9PUkRFUkVEKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBpZiAoIW5hbWUgfHwgISpuYW1lKSAgICAgICAgLy8gcmVxdWlyZQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgUEFSVElUSU9OICVzIiwgbmFtZSk7Ci0gICAgaWYgKG1heEJpdHMgIT0gLTEpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgTUFYQklUUyAlZCIsIG1heEJpdHMpOwotICAgIGRlZndMaW5lcysrOwotCi0gICAgZGVmd1N0YXRlID0gREVGV19TQ0FOQ0hBSU47Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd1NjYW5jaGFpblN0YXJ0KGNvbnN0IGNoYXIgICAqaW5zdCwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKnBpbikKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfU0NBTkNIQUlOOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfU0NBTkNIQUlOX1NUQVJUICYmIGRlZndTdGF0ZSAhPSBERUZXX1NDQU5DSEFJTiAmJgotICAgICAgICBkZWZ3U3RhdGUgIT0gREVGV19TQ0FOX0ZMT0FUSU5HICYmIGRlZndTdGF0ZSAhPSBERUZXX1NDQU5fT1JERVJFRCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgaWYgKCFpbnN0IHx8ICEqaW5zdCkgICAgICAgIC8vIHJlcXVpcmUKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArIFNUQVJUICVzIiwgaW5zdCk7Ci0gICAgaWYgKHBpbikKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiAlcyIsIHBpbik7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX1NDQU5DSEFJTjsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndTY2FuY2hhaW5TdG9wKGNvbnN0IGNoYXIgICAgKmluc3QsCi0gICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpwaW4pCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1NDQU5DSEFJTjsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1NDQU5DSEFJTl9TVEFSVCAmJiBkZWZ3U3RhdGUgIT0gREVGV19TQ0FOQ0hBSU4gJiYKLSAgICAgICAgZGVmd1N0YXRlICE9IERFRldfU0NBTl9GTE9BVElORyAmJiBkZWZ3U3RhdGUgIT0gREVGV19TQ0FOX09SREVSRUQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGlmICghaW5zdCB8fCAhKmluc3QpICAgICAgICAvLyByZXF1aXJlCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBTVE9QICVzIiwgaW5zdCk7Ci0gICAgaWYgKHBpbikKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiAlcyIsIHBpbik7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX1NDQU5DSEFJTjsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotaW50Ci1kZWZ3U2NhbmNoYWluRmxvYXRpbmcoY29uc3QgY2hhciAgICAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICppbnN0MSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpwaW4xLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKmluc3QyLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKnBpbjIpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1NDQU5fRkxPQVRJTkc7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19TQ0FOQ0hBSU5fU1RBUlQgJiYgZGVmd1N0YXRlICE9IERFRldfU0NBTkNIQUlOICYmCi0gICAgICAgIGRlZndTdGF0ZSAhPSBERUZXX1NDQU5fRkxPQVRJTkcgJiYgZGVmd1N0YXRlICE9IERFRldfU0NBTl9PUkRFUkVEKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBpZiAoIW5hbWUgfHwgISpuYW1lKSAgICAgICAgLy8gcmVxdWlyZQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICBpZiAoaW5zdDEgJiYgc3RyY21wKGluc3QxLCAiSU4iKSAmJiBzdHJjbXAoaW5zdDEsICJPVVQiKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgaWYgKGluc3QyICYmIHN0cmNtcChpbnN0MiwgIklOIikgJiYgc3RyY21wKGluc3QyLCAiT1VUIikpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgIGlmIChpbnN0MSAmJiAhcGluMSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgaWYgKGluc3QyICYmICFwaW4yKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLQotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19TQ0FOX0ZMT0FUSU5HKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArIEZMT0FUSU5HIik7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICAgICAiKTsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgJXMiLCBuYW1lKTsKLSAgICBpZiAoaW5zdDEpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgKCAlcyAlcyApIiwgaW5zdDEsIHBpbjEpOwotICAgIGlmIChpbnN0MikKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiAoICVzICVzICkiLCBpbnN0MiwgcGluMik7Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX1NDQU5fRkxPQVRJTkc7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotaW50Ci1kZWZ3U2NhbmNoYWluRmxvYXRpbmdCaXRzKGNvbnN0IGNoYXIgICAgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKmluc3QxLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpwaW4xLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICppbnN0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqcGluMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICBiaXRzKQotewotICAgIGRlZndGdW5jID0gREVGV19TQ0FOX0ZMT0FUSU5HOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfU0NBTkNIQUlOX1NUQVJUICYmIGRlZndTdGF0ZSAhPSBERUZXX1NDQU5DSEFJTiAmJgotICAgICAgICBkZWZ3U3RhdGUgIT0gREVGV19TQ0FOX0ZMT0FUSU5HICYmIGRlZndTdGF0ZSAhPSBERUZXX1NDQU5fT1JERVJFRCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgaWYgKCFuYW1lIHx8ICEqbmFtZSkgICAgICAgIC8vIHJlcXVpcmUKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgaWYgKGluc3QxICYmIHN0cmNtcChpbnN0MSwgIklOIikgJiYgc3RyY21wKGluc3QxLCAiT1VUIikpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgIGlmIChpbnN0MiAmJiBzdHJjbXAoaW5zdDIsICJJTiIpICYmIHN0cmNtcChpbnN0MiwgIk9VVCIpKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICBpZiAoaW5zdDEgJiYgIXBpbjEpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgIGlmIChpbnN0MiAmJiAhcGluMikKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0KLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfU0NBTl9GTE9BVElORykKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBGTE9BVElORyIpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgICAgIik7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICVzIiwgbmFtZSk7Ci0gICAgaWYgKGluc3QxKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiICggJXMgJXMgKSIsIGluc3QxLCBwaW4xKTsKLSAgICBpZiAoaW5zdDIpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgKCAlcyAlcyApIiwgaW5zdDIsIHBpbjIpOwotICAgIGlmIChiaXRzICE9IC0xKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiICggQklUUyAlZCApIiwgYml0cyk7Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX1NDQU5fRkxPQVRJTkc7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICByZXR1cm4gREVGV19PSzsKLX0KLWludAotZGVmd1NjYW5jaGFpbk9yZGVyZWQoY29uc3QgY2hhciAqbmFtZTEsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICppbnN0MSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBpbjEsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICppbnN0MiwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBpbjIsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lMiwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmluc3QzLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGluMywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmluc3Q0LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGluNCkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfU0NBTl9PUkRFUkVEOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfU0NBTkNIQUlOX1NUQVJUICYmIGRlZndTdGF0ZSAhPSBERUZXX1NDQU5DSEFJTiAmJgotICAgICAgICBkZWZ3U3RhdGUgIT0gREVGV19TQ0FOX0ZMT0FUSU5HICYmIGRlZndTdGF0ZSAhPSBERUZXX1NDQU5fT1JERVJFRCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgaWYgKCFuYW1lMSB8fCAhKm5hbWUxKSAgICAgICAgLy8gcmVxdWlyZQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICBpZiAoaW5zdDEgJiYgc3RyY21wKGluc3QxLCAiSU4iKSAmJiBzdHJjbXAoaW5zdDEsICJPVVQiKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgaWYgKGluc3QyICYmIHN0cmNtcChpbnN0MiwgIklOIikgJiYgc3RyY21wKGluc3QyLCAiT1VUIikpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgIGlmIChpbnN0MSAmJiAhcGluMSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgaWYgKGluc3QyICYmICFwaW4yKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfU0NBTl9PUkRFUkVEKSB7ICAvLyAxc3QgdGltZSByZXF1aXJlIGJvdGggbmFtZTEgJiBuYW1lMgotICAgICAgICBpZiAoIW5hbWUyIHx8ICEqbmFtZTIpICAgICAgICAvLyByZXF1aXJlCi0gICAgICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICAgICAgaWYgKGluc3QzICYmIHN0cmNtcChpbnN0MywgIklOIikgJiYgc3RyY21wKGluc3QzLCAiT1VUIikpCi0gICAgICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICAgICAgaWYgKGluc3Q0ICYmIHN0cmNtcChpbnN0NCwgIklOIikgJiYgc3RyY21wKGluc3Q0LCAiT1VUIikpCi0gICAgICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICAgICAgaWYgKGluc3QzICYmICFwaW4zKQotICAgICAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgICAgIGlmIChpbnN0NCAmJiAhcGluNCkKLSAgICAgICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgIH0KLQotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19TQ0FOX09SREVSRUQpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgT1JERVJFRCIpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgICAgIik7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICVzIiwgbmFtZTEpOwotICAgIGlmIChpbnN0MSkKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiAoICVzICVzICkiLCBpbnN0MSwgcGluMSk7Ci0gICAgaWYgKGluc3QyKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiICggJXMgJXMgKSIsIGluc3QyLCBwaW4yKTsKLSAgICBkZWZ3TGluZXMrKzsKLQotICAgIGlmIChuYW1lMikgewotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICAgICAgJXMiLCBuYW1lMik7Ci0gICAgICAgIGlmIChpbnN0MykKLSAgICAgICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgKCAlcyAlcyApIiwgaW5zdDMsIHBpbjMpOwotICAgICAgICBpZiAoaW5zdDQpCi0gICAgICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiICggJXMgJXMgKSIsIGluc3Q0LCBwaW40KTsKLSAgICAgICAgZGVmd0xpbmVzKys7Ci0gICAgfQotCi0gICAgZGVmd1N0YXRlID0gREVGV19TQ0FOX09SREVSRUQ7Ci0KLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotaW50Ci1kZWZ3U2NhbmNoYWluT3JkZXJlZEJpdHMoY29uc3QgY2hhciAqbmFtZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaW5zdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGluMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICppbnN0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwaW4yLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgYml0czEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaW5zdDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGluMywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICppbnN0NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwaW40LAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgYml0czIpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1NDQU5fT1JERVJFRDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1NDQU5DSEFJTl9TVEFSVCAmJiBkZWZ3U3RhdGUgIT0gREVGV19TQ0FOQ0hBSU4gJiYKLSAgICAgICAgZGVmd1N0YXRlICE9IERFRldfU0NBTl9GTE9BVElORyAmJiBkZWZ3U3RhdGUgIT0gREVGV19TQ0FOX09SREVSRUQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGlmICghbmFtZTEgfHwgISpuYW1lMSkgICAgICAgIC8vIHJlcXVpcmUKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgaWYgKGluc3QxICYmIHN0cmNtcChpbnN0MSwgIklOIikgJiYgc3RyY21wKGluc3QxLCAiT1VUIikpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgIGlmIChpbnN0MiAmJiBzdHJjbXAoaW5zdDIsICJJTiIpICYmIHN0cmNtcChpbnN0MiwgIk9VVCIpKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICBpZiAoaW5zdDEgJiYgIXBpbjEpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgIGlmIChpbnN0MiAmJiAhcGluMikKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1NDQU5fT1JERVJFRCkgeyAgLy8gMXN0IHRpbWUgcmVxdWlyZSBib3RoIG5hbWUxICYgbmFtZTIKLSAgICAgICAgaWYgKCFuYW1lMiB8fCAhKm5hbWUyKSAgICAgICAgLy8gcmVxdWlyZQotICAgICAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgICAgIGlmIChpbnN0MyAmJiBzdHJjbXAoaW5zdDMsICJJTiIpICYmIHN0cmNtcChpbnN0MywgIk9VVCIpKQotICAgICAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgICAgIGlmIChpbnN0NCAmJiBzdHJjbXAoaW5zdDQsICJJTiIpICYmIHN0cmNtcChpbnN0NCwgIk9VVCIpKQotICAgICAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgICAgIGlmIChpbnN0MyAmJiAhcGluMykKLSAgICAgICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgICAgICBpZiAoaW5zdDQgJiYgIXBpbjQpCi0gICAgICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICB9Ci0KLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfU0NBTl9PUkRFUkVEKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArIE9SREVSRUQiKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICAgICIpOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiAlcyIsIG5hbWUxKTsKLSAgICBpZiAoaW5zdDEpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgKCAlcyAlcyApIiwgaW5zdDEsIHBpbjEpOwotICAgIGlmIChpbnN0MikKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiAoICVzICVzICkiLCBpbnN0MiwgcGluMik7Ci0gICAgaWYgKGJpdHMxICE9IC0xKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiICggQklUUyAlZCApIiwgYml0czEpOwotICAgIGRlZndMaW5lcysrOwotCi0gICAgaWYgKG5hbWUyKSB7Ci0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICAgICAlcyIsIG5hbWUyKTsKLSAgICAgICAgaWYgKGluc3QzKQotICAgICAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiAoICVzICVzICkiLCBpbnN0MywgcGluMyk7Ci0gICAgICAgIGlmIChpbnN0NCkKLSAgICAgICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgKCAlcyAlcyApIiwgaW5zdDQsIHBpbjQpOwotICAgICAgICBpZiAoYml0czIgIT0gLTEpCi0gICAgICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiICggQklUUyAlZCApIiwgYml0czIpOwotICAgICAgICBkZWZ3TGluZXMrKzsKLSAgICB9Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX1NDQU5fT1JERVJFRDsKLQotICAgIHJldHVybiBERUZXX09LOwotfQotCi1pbnQKLWRlZndFbmRTY2FuY2hhaW4oKQotewotICAgIGRlZndGdW5jID0gREVGV19TQ0FOQ0hBSU5fRU5EOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfU0NBTkNIQUlOX1NUQVJUICYmIGRlZndTdGF0ZSAhPSBERUZXX1NDQU5fT1JERVJFRCAmJgotICAgICAgICBkZWZ3U3RhdGUgIT0gREVGV19TQ0FOX0ZMT0FUSU5HICYmIGRlZndTdGF0ZSAhPSBERUZXX1NDQU5DSEFJTikKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX1NDQU5DSEFJTl9TVEFSVCkgIC8vIGZyb20gcHJldmlvdXMgc3RhdGVtZW50Ci0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgO1xuIik7Ci0KLSAgICBpZiAoZGVmd0NvdW50ZXIgPiAwKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICBlbHNlIGlmIChkZWZ3Q291bnRlciA8IDApCi0gICAgICAgIHJldHVybiBERUZXX1RPT19NQU5ZX1NUTVM7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiRU5EIFNDQU5DSEFJTlNcblxuIik7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX1NDQU5DSEFJTl9FTkQ7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd1N0YXJ0Q29uc3RyYWludHMoaW50IGNvdW50KQotewotICAgIGRlZndPYnNvbGV0ZU51bSA9IERFRldfRlBDX1NUQVJUOwotICAgIGRlZndGdW5jID0gREVGV19GUENfU1RBUlQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICgoZGVmd1N0YXRlID49IERFRldfRlBDX1NUQVJUKSAmJiAoZGVmd1N0YXRlIDw9IERFRldfRlBDX0VORCkpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoZGVmVmVyc2lvbk51bSA+PSA1LjQpCi0gICAgICAgIHJldHVybiBERUZXX09CU09MRVRFOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIkNPTlNUUkFJTlRTICVkIDtcbiIsIGNvdW50KTsKLSAgICBkZWZ3TGluZXMrKzsKLQotICAgIGRlZndTdGF0ZSA9IERFRldfRlBDX1NUQVJUOwotICAgIGRlZndDb3VudGVyID0gY291bnQ7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd0NvbnN0cmFpbnRPcGVyYW5kKCkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfRlBDX09QRVI7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19GUENfU1RBUlQgJiYgZGVmd1N0YXRlICE9IERFRldfRlBDKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICAgLSIpOwotICAgIGRlZndDb3VudGVyLS07Ci0gICAgZGVmd0ZQQyA9IDA7Ci0gICAgZGVmd1N0YXRlID0gREVGV19GUENfT1BFUjsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotaW50Ci1kZWZ3Q29uc3RyYWludE9wZXJhbmROZXQoY29uc3QgY2hhciAqbmV0TmFtZSkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfRlBDX09QRVI7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19GUENfT1BFUiAmJiBkZWZ3U3RhdGUgIT0gREVGV19GUENfT1BFUl9TVU0pCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsgICAgICAgICAgLy8gbmV0IGNhbiBiZSB3aXRoaW4gU1VNCi0KLSAgICBpZiAoIW5ldE5hbWUgfHwgISpuZXROYW1lKSAgICAgICAgLy8gcmVxdWlyZQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICBpZiAoZGVmd0ZQQyA+IDApCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgLCIpOwotICAgIGlmIChkZWZ3U3RhdGUgPT0gREVGV19GUENfT1BFUl9TVU0pCi0gICAgICAgIGRlZndGUEMrKzsKLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiIE5FVCAlcyIsIG5ldE5hbWUpOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi1pbnQKLWRlZndDb25zdHJhaW50T3BlcmFuZFBhdGgoY29uc3QgY2hhciAgICAqY29tcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKmZyb21QaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKmNvbXAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICp0b1BpbikKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfRlBDX09QRVI7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19GUENfT1BFUiAmJiBkZWZ3U3RhdGUgIT0gREVGV19GUENfT1BFUl9TVU0pCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsgICAgICAgICAgLy8gcGF0aCBjYW4gYmUgd2l0aGluIFNVTQotCi0gICAgaWYgKChjb21wMSA9PSAwKSB8fCAoKmNvbXAxID09IDApIHx8IChmcm9tUGluID09IDApIHx8ICgqZnJvbVBpbiA9PSAwKSB8fAotICAgICAgICAoY29tcDIgPT0gMCkgfHwgKCpjb21wMiA9PSAwKSB8fCAodG9QaW4gPT0gMCkgfHwgKCp0b1BpbiA9PSAwKSkgLy8gcmVxdWlyZQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICBpZiAoZGVmd0ZQQyA+IDApCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgLCIpOwotICAgIGlmIChkZWZ3U3RhdGUgPT0gREVGV19GUENfT1BFUl9TVU0pCi0gICAgICAgIGRlZndGUEMrKzsKLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiIFBBVEggJXMgJXMgJXMgJXMiLCBjb21wMSwgZnJvbVBpbiwgY29tcDIsIHRvUGluKTsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotaW50Ci1kZWZ3Q29uc3RyYWludE9wZXJhbmRTdW0oKQotewotICAgIGRlZndGdW5jID0gREVGV19GUENfT1BFUjsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX0ZQQ19PUEVSICYmIGRlZndTdGF0ZSAhPSBERUZXX0ZQQ19PUEVSX1NVTSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOyAgICAgICAgICAvLyBzdW0gY2FuIGJlIHdpdGhpbiBTVU0KLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgU1VNICgiKTsKLSAgICBkZWZ3U3RhdGUgPSBERUZXX0ZQQ19PUEVSX1NVTTsKLSAgICBkZWZ3RlBDID0gMDsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotaW50Ci1kZWZ3Q29uc3RyYWludE9wZXJhbmRTdW1FbmQoKQotewotICAgIGRlZndGdW5jID0gREVGV19GUENfT1BFUjsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX0ZQQ19PUEVSX1NVTSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgKSIpOwotICAgIGRlZndTdGF0ZSA9IERFRldfRlBDX09QRVI7Ci0gICAgZGVmd0ZQQyA9IDA7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd0NvbnN0cmFpbnRPcGVyYW5kVGltZShjb25zdCBjaGFyICAgICp0aW1lVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICB0aW1lKQotewotICAgIGRlZndGdW5jID0gREVGV19GUENfT1BFUjsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX0ZQQ19PUEVSKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKHRpbWVUeXBlICYmIHN0cmNtcCh0aW1lVHlwZSwgIlJJU0VNQVgiKSAmJiBzdHJjbXAodGltZVR5cGUsICJGQUxMTUFYIikgJiYKLSAgICAgICAgc3RyY21wKHRpbWVUeXBlLCAiUklTRU1JTiIpICYmIHN0cmNtcCh0aW1lVHlwZSwgIkZBTExNSU4iKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiArICVzICVkIiwgdGltZVR5cGUsIHRpbWUpOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi1pbnQKLWRlZndDb25zdHJhaW50T3BlcmFuZEVuZCgpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX0ZQQ19PUEVSOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfRlBDX09QRVIpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiIDtcbiIpOwotICAgIGRlZndTdGF0ZSA9IERFRldfRlBDOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi1pbnQKLWRlZndDb25zdHJhaW50V2lyZWRsb2dpYyhjb25zdCBjaGFyICpuZXROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgZGlzdGFuY2UpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX0ZQQzsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX0ZQQ19TVEFSVCAmJiBkZWZ3U3RhdGUgIT0gREVGV19GUEMpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGlmICghbmV0TmFtZSB8fCAhKm5ldE5hbWUpICAgICAgICAvLyByZXF1aXJlCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgICAtIFdJUkVETE9HSUMgJXMgTUFYRElTVCAlZCA7XG4iLCBuZXROYW1lLCBkaXN0YW5jZSk7Ci0gICAgZGVmd0NvdW50ZXItLTsKLSAgICBkZWZ3U3RhdGUgPSBERUZXX0ZQQzsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotaW50Ci1kZWZ3RW5kQ29uc3RyYWludHMoKQotewotICAgIGRlZndGdW5jID0gREVGV19GUENfRU5EOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfRlBDX1NUQVJUICYmIGRlZndTdGF0ZSAhPSBERUZXX0ZQQykKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmIChkZWZ3Q291bnRlciA+IDApCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgIGVsc2UgaWYgKGRlZndDb3VudGVyIDwgMCkKLSAgICAgICAgcmV0dXJuIERFRldfVE9PX01BTllfU1RNUzsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJFTkQgQ09OU1RSQUlOVFNcblxuIik7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX0ZQQ19FTkQ7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd1N0YXJ0R3JvdXBzKGludCBjb3VudCkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfR1JPVVBfU1RBUlQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICgoZGVmd1N0YXRlID49IERFRldfR1JPVVBfU1RBUlQpICYmIChkZWZ3U3RhdGUgPD0gREVGV19HUk9VUF9FTkQpKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiR1JPVVBTICVkIDtcbiIsIGNvdW50KTsKLSAgICBkZWZ3TGluZXMrKzsKLQotICAgIGRlZndTdGF0ZSA9IERFRldfR1JPVVBfU1RBUlQ7Ci0gICAgZGVmd0NvdW50ZXIgPSBjb3VudDsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotaW50Ci1kZWZ3R3JvdXAoY29uc3QgY2hhciAgICAqZ3JvdXBOYW1lLAotICAgICAgICAgIGludCAgICAgICAgICAgbnVtRXhwciwKLSAgICAgICAgICBjb25zdCBjaGFyICAgICoqZ3JvdXBFeHByKQotewotICAgIGludCBpOwotCi0gICAgZGVmd0Z1bmMgPSBERUZXX0dST1VQOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfR1JPVVBfU1RBUlQgJiYgZGVmd1N0YXRlICE9IERFRldfR1JPVVApCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGlmICgoZ3JvdXBOYW1lID09IDApIHx8ICgqZ3JvdXBOYW1lID09IDApIHx8IChncm91cEV4cHIgPT0gMCkgfHwKLSAgICAgICAgKCpncm91cEV4cHIgPT0gMCkpICAvLyByZXF1aXJlCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgIGlmIChkZWZ3U3RhdGUgPT0gREVGV19HUk9VUCkKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiA7XG4iKTsgICAgICAgICAgLy8gYWRkIDsgZm9yIHRoZSBwcmV2aW91cyBncm91cAotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgICAtICVzIiwgZ3JvdXBOYW1lKTsKLSAgICBpZiAobnVtRXhwcikgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtRXhwcjsgaSsrKQotICAgICAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiAlcyIsIGdyb3VwRXhwcltpXSk7Ci0gICAgfQotICAgIGRlZndDb3VudGVyLS07Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgZGVmd1N0YXRlID0gREVGV19HUk9VUDsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndHcm91cFNvZnQoY29uc3QgY2hhciAgICAqdHlwZTEsCi0gICAgICAgICAgICAgIGRvdWJsZSAgICAgICAgdmFsdWUxLAotICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICp0eXBlMiwKLSAgICAgICAgICAgICAgZG91YmxlICAgICAgICB2YWx1ZTIsCi0gICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKnR5cGUzLAotICAgICAgICAgICAgICBkb3VibGUgICAgICAgIHZhbHVlMykKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfR1JPVVA7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19HUk9VUCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgaWYgKHR5cGUxICYmIHN0cmNtcCh0eXBlMSwgIk1BWEhBTEZQRVJJTUVURVIiKSAmJiBzdHJjbXAodHlwZTEsICJNQVhYIikgJiYKLSAgICAgICAgc3RyY21wKHR5cGUxLCAiTUFYWSIpKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICBpZiAodHlwZTIgJiYgc3RyY21wKHR5cGUyLCAiTUFYSEFMRlBFUklNRVRFUiIpICYmIHN0cmNtcCh0eXBlMiwgIk1BWFgiKSAmJgotICAgICAgICBzdHJjbXAodHlwZTIsICJNQVhZIikpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgIGlmICh0eXBlMyAmJiBzdHJjbXAodHlwZTMsICJNQVhIQUxGUEVSSU1FVEVSIikgJiYgc3RyY21wKHR5cGUzLCAiTUFYWCIpICYmCi0gICAgICAgIHN0cmNtcCh0eXBlMywgIk1BWFkiKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgaWYgKHR5cGUxKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICsgU09GVCAlcyAlLjExZyIsIHR5cGUxLCB2YWx1ZTEpOwotICAgIGlmICh0eXBlMikKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiAlcyAlLjExZyIsIHR5cGUyLCB2YWx1ZTIpOwotICAgIGlmICh0eXBlMykKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiAlcyAlLjExZyIsIHR5cGUzLCB2YWx1ZTMpOwotICAgIGRlZndMaW5lcysrOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi1pbnQKLWRlZndHcm91cFJlZ2lvbihpbnQgICAgICAgICB4bCwKLSAgICAgICAgICAgICAgICBpbnQgICAgICAgICB5bCwKLSAgICAgICAgICAgICAgICBpbnQgICAgICAgICB4aCwKLSAgICAgICAgICAgICAgICBpbnQgICAgICAgICB5aCwKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqcmVnaW9uTmFtZSkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfR1JPVVA7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19HUk9VUCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgaWYgKCh4bCB8fCB5bCB8fCB4aCB8fCB5aCkgJiYgKHJlZ2lvbk5hbWUpKSAgLy8gZXRoZXIgcHRzIG9yIHJlZ2lvbk5hbWUKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0KLSAgICBpZiAocmVnaW9uTmFtZSkKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBSRUdJT04gJXMiLCByZWdpb25OYW1lKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgUkVHSU9OICggJWQgJWQgKSAoICVkICVkICkiLAotICAgICAgICAgICAgICAgIHhsLCB5bCwgeGgsIHloKTsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotaW50Ci1kZWZ3RW5kR3JvdXBzKCkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfR1JPVVBfRU5EOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfR1JPVVBfU1RBUlQgJiYgZGVmd1N0YXRlICE9IERFRldfR1JPVVApCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoZGVmd0NvdW50ZXIgPiAwKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICBlbHNlIGlmIChkZWZ3Q291bnRlciA8IDApCi0gICAgICAgIHJldHVybiBERUZXX1RPT19NQU5ZX1NUTVM7Ci0KLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfR1JPVVBfU1RBUlQpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgO1xuIik7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiRU5EIEdST1VQU1xuXG4iKTsKLSAgICBkZWZ3TGluZXMrKzsKLQotICAgIGRlZndTdGF0ZSA9IERFRldfR1JPVVBfRU5EOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd1N0YXJ0QmxvY2thZ2VzKGludCBjb3VudCkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfQkxPQ0tBR0VfU1RBUlQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICgoZGVmd1N0YXRlID49IERFRldfQkxPQ0tBR0VfU1RBUlQpICYmIChkZWZ3U3RhdGUgPD0gREVGV19CTE9DS0FHRV9FTkQpKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKGRlZlZlcnNpb25OdW0gPCA1LjQpCi0gICAgICAgIHJldHVybiBERUZXX1dST05HX1ZFUlNJT047Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiQkxPQ0tBR0VTICVkIDtcbiIsIGNvdW50KTsKLSAgICBkZWZ3TGluZXMrKzsKLQotICAgIGRlZndTdGF0ZSA9IERFRldfQkxPQ0tBR0VfU1RBUlQ7Ci0gICAgZGVmd0NvdW50ZXIgPSBjb3VudDsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotaW50Ci1kZWZ3QmxvY2thZ2VzTGF5ZXIoY29uc3QgY2hhciAqbGF5ZXJOYW1lKQotewotICAgIGRlZndGdW5jID0gREVGV19CTE9DS0FHRV9MQVlFUjsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0KLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfQkxPQ0tBR0VfU1RBUlQgJiYgKChkZWZ3U3RhdGUgPT0gREVGV19CTE9DS0FHRV9QTEFDRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChkZWZ3U3RhdGUgPT0gREVGV19CTE9DS0FHRV9MQVlFUikpKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBpZiAoIWxheWVyTmFtZSB8fCAhKmxheWVyTmFtZSkgIC8vIHJlcXVpcmUKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0KLSAgICBpZiAoZGVmd1N0YXRlID09IERFRldfQkxPQ0tBR0VfUkVDVCkKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiA7XG4iKTsgICAvLyBlbmQgdGhlIHByZXZpb3VzIHJlY3RhbmdsZQotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiAgIC0gTEFZRVIgJXMiLCBsYXllck5hbWUpOwotICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiIpOwotICAgIGRlZndDb3VudGVyLS07Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgZGVmd1N0YXRlID0gREVGV19CTE9DS0FHRV9MQVlFUjsKLSAgICBkZWZ3QmxvY2thZ2VIYXNTRCA9IDA7Ci0gICAgZGVmd0Jsb2NrYWdlSGFzU0YgPSAwOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi1pbnQKLWRlZndCbG9ja2FnZXNMYXllclNsb3RzKCkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfQkxPQ0tBR0VfTEFZRVI7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotCi0gICAgaWYgKChkZWZ3U3RhdGUgIT0gREVGV19CTE9DS0FHRV9MQVlFUikgJiYgKGRlZndTdGF0ZSAhPSBERUZXX0JMT0NLQUdFX1JFQ1QpKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBpZiAoZGVmd0Jsb2NrYWdlSGFzU0YpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0gICAgaWYgKGRlZndTdGF0ZSA9PSBERUZXX0JMT0NLQUdFX1JFQ1QpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgO1xuIik7ICAgLy8gZW5kIHRoZSBwcmV2aW91cyByZWN0YW5nbGUKLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICAgICAgKyBTTE9UU1xuIik7Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgZGVmd1N0YXRlID0gREVGV19CTE9DS0FHRV9MQVlFUjsKLSAgICBkZWZ3QmxvY2thZ2VIYXNTRiA9IDE7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd0Jsb2NrYWdlc0xheWVyRmlsbHMoKQotewotICAgIGRlZndGdW5jID0gREVGV19CTE9DS0FHRV9MQVlFUjsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0KLSAgICBpZiAoKGRlZndTdGF0ZSAhPSBERUZXX0JMT0NLQUdFX0xBWUVSKSAmJiAoZGVmd1N0YXRlICE9IERFRldfQkxPQ0tBR0VfUkVDVCkpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGlmIChkZWZ3QmxvY2thZ2VIYXNTRikKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0KLSAgICBpZiAoZGVmd1N0YXRlID09IERFRldfQkxPQ0tBR0VfUkVDVCkKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiA7XG4iKTsgICAvLyBlbmQgdGhlIHByZXZpb3VzIHJlY3RhbmdsZQotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiAgICAgKyBGSUxMU1xuIik7Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgZGVmd1N0YXRlID0gREVGV19CTE9DS0FHRV9MQVlFUjsKLSAgICBkZWZ3QmxvY2thZ2VIYXNTRiA9IDE7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd0Jsb2NrYWdlc0xheWVyQ29tcG9uZW50KGNvbnN0IGNoYXIgKmNvbXBOYW1lKQotewotICAgIGRlZndGdW5jID0gREVGV19CTE9DS0FHRV9MQVlFUjsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0KLSAgICBpZiAoKGRlZndTdGF0ZSAhPSBERUZXX0JMT0NLQUdFX0xBWUVSKSAmJiAoZGVmd1N0YXRlICE9IERFRldfQkxPQ0tBR0VfUkVDVCkpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGlmICgoY29tcE5hbWUgPT0gMCkgfHwgKCpjb21wTmFtZSA9PSAwKSkgIC8vIHJlcXVpcmUKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0KLSAgICBpZiAoZGVmd1N0YXRlID09IERFRldfQkxPQ0tBR0VfUkVDVCkKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiA7XG4iKTsgICAvLyBlbmQgdGhlIHByZXZpb3VzIHJlY3RhbmdsZQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgICAgICsgQ09NUE9ORU5UICVzXG4iLCBjb21wTmFtZSk7Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgZGVmd1N0YXRlID0gREVGV19CTE9DS0FHRV9MQVlFUjsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotaW50Ci1kZWZ3QmxvY2thZ2VzTGF5ZXJQdXNoZG93bigpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX0JMT0NLQUdFX0xBWUVSOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLQotICAgIGlmICgoZGVmd1N0YXRlICE9IERFRldfQkxPQ0tBR0VfTEFZRVIpICYmIChkZWZ3U3RhdGUgIT0gREVGV19CTE9DS0FHRV9SRUNUKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgaWYgKGRlZndTdGF0ZSA9PSBERUZXX0JMT0NLQUdFX1JFQ1QpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgO1xuIik7ICAgLy8gZW5kIHRoZSBwcmV2aW91cyByZWN0YW5nbGUKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgICAgICsgUFVTSERPV05cbiIpOwotICAgIGRlZndMaW5lcysrOwotICAgIGRlZndTdGF0ZSA9IERFRldfQkxPQ0tBR0VfTEFZRVI7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLS8vIDUuNwotaW50Ci1kZWZ3QmxvY2thZ2VzTGF5ZXJFeGNlcHRwZ25ldCgpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX0JMT0NLQUdFX0xBWUVSOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLQotICAgIGlmICgoZGVmd1N0YXRlICE9IERFRldfQkxPQ0tBR0VfTEFZRVIpICYmIChkZWZ3U3RhdGUgIT0gREVGV19CTE9DS0FHRV9SRUNUKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgaWYgKGRlZndTdGF0ZSA9PSBERUZXX0JMT0NLQUdFX1JFQ1QpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgO1xuIik7ICAgLy8gZW5kIHRoZSBwcmV2aW91cyByZWN0YW5nbGUKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgICAgICsgRVhDRVBUUEdORVRcbiIpOwotICAgIGRlZndMaW5lcysrOwotICAgIGRlZndTdGF0ZSA9IERFRldfQkxPQ0tBR0VfTEFZRVI7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd0Jsb2NrYWdlc0xheWVyU3BhY2luZyhpbnQgbWluU3BhY2luZykKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfQkxPQ0tBR0VfTEFZRVI7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotCi0gICAgaWYgKChkZWZ3U3RhdGUgIT0gREVGV19CTE9DS0FHRV9MQVlFUikgJiYgKGRlZndTdGF0ZSAhPSBERUZXX0JMT0NLQUdFX1JFQ1QpKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKGRlZndCbG9ja2FnZUhhc1NEKSAgICAvLyBFaXRoZXIgc3BhY2luZyBvciBkZXNpZ25ydWxld2lkdGggaGFzIGRlZmluZWQKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICAgICArIFNQQUNJTkcgJWRcbiIsIG1pblNwYWNpbmcpOwotICAgIGRlZndMaW5lcysrOwotICAgIGRlZndCbG9ja2FnZUhhc1NEID0gMTsKLSAgICBkZWZ3U3RhdGUgPSBERUZXX0JMT0NLQUdFX0xBWUVSOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi1pbnQKLWRlZndCbG9ja2FnZXNMYXllckRlc2lnblJ1bGVXaWR0aChpbnQgZWZmZWN0aXZlV2lkdGgpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX0JMT0NLQUdFX0xBWUVSOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLQotICAgIGlmICgoZGVmd1N0YXRlICE9IERFRldfQkxPQ0tBR0VfTEFZRVIpICYmIChkZWZ3U3RhdGUgIT0gREVGV19CTE9DS0FHRV9SRUNUKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmIChkZWZ3QmxvY2thZ2VIYXNTRCkgICAgLy8gRWl0aGVyIHNwYWNpbmcgb3IgZGVzaWducnVsZXdpZHRoIGhhcyBkZWZpbmVkCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiAgICAgKyBERVNJR05SVUxFV0lEVEggJWRcbiIsIGVmZmVjdGl2ZVdpZHRoKTsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICBkZWZ3QmxvY2thZ2VIYXNTRCA9IDE7Ci0gICAgZGVmd1N0YXRlID0gREVGV19CTE9DS0FHRV9MQVlFUjsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotaW50Ci1kZWZ3QmxvY2thZ2VzTGF5ZXJNYXNrKGludCBjb2xvck1hc2spCi17Ci0gICAgaWYgKGRlZlZlcnNpb25OdW0gPCA1LjgpIHsKLSAgICAgICAgcmV0dXJuIERFRldfV1JPTkdfVkVSU0lPTjsKLSAgICB9Ci0KLSAgICBkZWZ3RnVuYyA9IERFRldfQkxPQ0tBR0VfTUFTSzsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0KLSAgICBpZiAoKGRlZndTdGF0ZSAhPSBERUZXX0JMT0NLQUdFX0xBWUVSKSAmJiAoZGVmd1N0YXRlICE9IERFRldfQkxPQ0tBR0VfUkVDVCkpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGlmIChkZWZ3U3RhdGUgPT0gREVGV19CTE9DS0FHRV9SRUNUKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4iKTsgICAvLyBzZXQgYSBuZXdsaW5lIGZvciB0aGUgcHJldmlvdXMgcmVjdGFuZ2xlCi0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICAgICArIE1BU0sgJWQiLCBjb2xvck1hc2spOwotICAgIGRlZndMaW5lcysrOwotICAgIGRlZndTdGF0ZSA9IERFRldfQkxPQ0tBR0VfTEFZRVI7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLS8vVG8gYmUgcmVtb3ZlZCwgcmVwbGFjZWQgYnkgZGVmd0Jsb2NrYWdlc0xheWVyCi1pbnQKLWRlZndCbG9ja2FnZUxheWVyKGNvbnN0IGNoYXIgICAgKmxheWVyTmFtZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKmNvbXBOYW1lKQoteyAgICAgIC8vIG9wdGlvbmFsKE5VTEwpIAotICAgIGRlZndGdW5jID0gREVGV19CTE9DS0FHRV9MQVlFUjsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgLy8gTWF5IGJlIHVzZXIgYWxyZWFkeSBkZWZpbmUgY29tcG9uZW50IG9yIGxheWVyIHNsb3RzIG9yIGZpbGxzCi0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX0JMT0NLQUdFX1NUQVJUICYmICgoZGVmd1N0YXRlID09IERFRldfQkxPQ0tBR0VfUExBQ0UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoZGVmd1N0YXRlID09IERFRldfQkxPQ0tBR0VfTEFZRVIpKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0KLSAgICBpZiAoIWxheWVyTmFtZSB8fCAhKmxheWVyTmFtZSkgIC8vIHJlcXVpcmUKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgaWYgKGRlZndTdGF0ZSA9PSBERUZXX0JMT0NLQUdFX1JFQ1QpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgO1xuIik7ICAgLy8gZW5kIHRoZSBwcmV2aW91cyByZWN0YW5nbGUKLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICAgLSBMQVlFUiAlcyAiLCBsYXllck5hbWUpOwotICAgIGlmIChjb21wTmFtZSAmJiAqY29tcE5hbWUgIT0gMCkgIC8vIG9wdGlvbmFsCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIrIENPTVBPTkVOVCAlcyAiLCBjb21wTmFtZSk7Ci0gICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuIik7Ci0gICAgZGVmd0NvdW50ZXItLTsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICBkZWZ3U3RhdGUgPSBERUZXX0JMT0NLQUdFX0xBWUVSOwotICAgIGRlZndCbG9ja2FnZUhhc1NEID0gMDsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotLy9UbyBiZSByZW1vdmVkLCByZXBsYWNlZCBieSBkZWZ3QmxvY2thZ2VzTGF5ZXJTbG90cwotaW50Ci1kZWZ3QmxvY2thZ2VMYXllclNsb3RzKGNvbnN0IGNoYXIgKmxheWVyTmFtZSkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfQkxPQ0tBR0VfTEFZRVI7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIC8vIE1heSBiZSB1c2VyIGFscmVhZHkgZGVmaW5lIGNvbXBvbmVudCBvciBsYXllciBvciBsYXllciBmaWxscwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19CTE9DS0FHRV9TVEFSVCAmJiAoKGRlZndTdGF0ZSA9PSBERUZXX0JMT0NLQUdFX1BMQUNFKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGRlZndTdGF0ZSA9PSBERUZXX0JMT0NLQUdFX0xBWUVSKSkpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0gICAgaWYgKCFsYXllck5hbWUgfHwgISpsYXllck5hbWUpICAvLyByZXF1aXJlCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgIGlmIChkZWZ3U3RhdGUgPT0gREVGV19CTE9DS0FHRV9SRUNUKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiIDtcbiIpOyAgIC8vIGVuZCB0aGUgcHJldmlvdXMgcmVjdGFuZ2xlCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiAgIC0gTEFZRVIgJXMgKyBTTE9UU1xuIiwgbGF5ZXJOYW1lKTsKLSAgICBkZWZ3Q291bnRlci0tOwotICAgIGRlZndMaW5lcysrOwotICAgIGRlZndTdGF0ZSA9IERFRldfQkxPQ0tBR0VfTEFZRVI7Ci0gICAgZGVmd0Jsb2NrYWdlSGFzU0QgPSAwOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0vL1RvIGJlIHJlbW92ZWQsIHJlcGxhY2VkIGJ5IGRlZndCbG9ja2FnZXNMYXllckZpbGxzCi1pbnQKLWRlZndCbG9ja2FnZUxheWVyRmlsbHMoY29uc3QgY2hhciAqbGF5ZXJOYW1lKQotewotICAgIGRlZndGdW5jID0gREVGV19CTE9DS0FHRV9MQVlFUjsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgLy8gTWF5IGJlIHVzZXIgYWxyZWFkeSBkZWZpbmUgY29tcG9uZW50IG9yIGxheWVyIG9yIGxheWVyIHNsb3RzCi0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX0JMT0NLQUdFX1NUQVJUICYmICgoZGVmd1N0YXRlID09IERFRldfQkxPQ0tBR0VfUExBQ0UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoZGVmd1N0YXRlID09IERFRldfQkxPQ0tBR0VfTEFZRVIpKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0KLSAgICBpZiAoIWxheWVyTmFtZSB8fCAhKmxheWVyTmFtZSkgIC8vIHJlcXVpcmUKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgaWYgKGRlZndTdGF0ZSA9PSBERUZXX0JMT0NLQUdFX1JFQ1QpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgO1xuIik7ICAgLy8gZW5kIHRoZSBwcmV2aW91cyByZWN0YW5nbGUKLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICAgLSBMQVlFUiAlcyArIEZJTExTXG4iLCBsYXllck5hbWUpOwotICAgIGRlZndDb3VudGVyLS07Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgZGVmd1N0YXRlID0gREVGV19CTE9DS0FHRV9MQVlFUjsKLSAgICBkZWZ3QmxvY2thZ2VIYXNTRCA9IDA7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLS8vVG8gYmUgcmVtb3ZlZCwgcmVwbGFjZWQgYnkgZGVmd0Jsb2NrYWdlc0xheWVyUHVzaGRvd24KLWludAotZGVmd0Jsb2NrYWdlTGF5ZXJQdXNoZG93bihjb25zdCBjaGFyICpsYXllck5hbWUpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX0JMT0NLQUdFX0xBWUVSOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICAvLyBNYXkgYmUgdXNlciBhbHJlYWR5IGRlZmluZSBjb21wb25lbnQgb3IgbGF5ZXIgb3IgbGF5ZXIgc2xvdHMKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfQkxPQ0tBR0VfU1RBUlQgJiYgKChkZWZ3U3RhdGUgPT0gREVGV19CTE9DS0FHRV9QTEFDRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChkZWZ3U3RhdGUgPT0gREVGV19CTE9DS0FHRV9MQVlFUikpKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLQotICAgIGlmICgobGF5ZXJOYW1lID09IDApIHx8ICgqbGF5ZXJOYW1lID09IDApKSAgLy8gcmVxdWlyZQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICBpZiAoZGVmd1N0YXRlID09IERFRldfQkxPQ0tBR0VfUkVDVCkKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiA7XG4iKTsgICAvLyBlbmQgdGhlIHByZXZpb3VzIHJlY3RhbmdsZQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgICAtIExBWUVSICVzICsgUFVTSERPV05cbiIsIGxheWVyTmFtZSk7Ci0gICAgZGVmd0NvdW50ZXItLTsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICBkZWZ3U3RhdGUgPSBERUZXX0JMT0NLQUdFX0xBWUVSOwotICAgIGRlZndCbG9ja2FnZUhhc1NEID0gMDsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotLy9UbyBiZSByZW1vdmVkLCByZXBsYWNlZCBieSBkZWZ3QmxvY2thZ2VzTGF5ZXJFeGNlcHRwZ25ldAotaW50Ci1kZWZ3QmxvY2thZ2VMYXllckV4Y2VwdHBnbmV0KGNvbnN0IGNoYXIgKmxheWVyTmFtZSkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfQkxPQ0tBR0VfTEFZRVI7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIC8vIE1heSBiZSB1c2VyIGFscmVhZHkgZGVmaW5lIGNvbXBvbmVudCBvciBsYXllciBvciBsYXllciBzbG90cwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19CTE9DS0FHRV9TVEFSVCAmJiAoKGRlZndTdGF0ZSA9PSBERUZXX0JMT0NLQUdFX1BMQUNFKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGRlZndTdGF0ZSA9PSBERUZXX0JMT0NLQUdFX0xBWUVSKSkpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0gICAgaWYgKChsYXllck5hbWUgPT0gMCkgfHwgKCpsYXllck5hbWUgPT0gMCkpICAvLyByZXF1aXJlCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgIGlmIChkZWZ3U3RhdGUgPT0gREVGV19CTE9DS0FHRV9SRUNUKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiIDtcbiIpOyAgIC8vIGVuZCB0aGUgcHJldmlvdXMgcmVjdGFuZ2xlCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiAgIC0gTEFZRVIgJXMgKyBFWENFUFRQR05FVFxuIiwgbGF5ZXJOYW1lKTsKLSAgICBkZWZ3Q291bnRlci0tOwotICAgIGRlZndMaW5lcysrOwotICAgIGRlZndTdGF0ZSA9IERFRldfQkxPQ0tBR0VfTEFZRVI7Ci0gICAgZGVmd0Jsb2NrYWdlSGFzU0QgPSAwOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0vL1RvIGJlIHJlbW92ZWQsIHJlcGxhY2VkIGJ5IGRlZndCbG9ja2FnZXNMYXllclNwYWNpbmcKLWludAotZGVmd0Jsb2NrYWdlU3BhY2luZyhpbnQgbWluU3BhY2luZykKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfQkxPQ0tBR0VfTEFZRVI7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIC8vIENoZWNrZWQgaWYgZGVmd0Jsb2NrYWdlRGVzaWduUnVsZVdpZHRoIGhhcyBhbHJlYWR5IGNhbGxlZAotICAgIGlmICgoZGVmd1N0YXRlICE9IERFRldfQkxPQ0tBR0VfTEFZRVIpICYmIChkZWZ3U3RhdGUgIT0gREVGV19CTE9DS0FHRV9SRUNUKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgaWYgKGRlZndCbG9ja2FnZUhhc1NEKSAgICAvLyBFaXRoZXIgc3BhY2luZyBvciBkZXNpZ25ydWxld2lkdGggaGFzIGRlZmluZWQKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICAgICArIFNQQUNJTkcgJWRcbiIsIG1pblNwYWNpbmcpOwotICAgIGRlZndMaW5lcysrOwotICAgIGRlZndCbG9ja2FnZUhhc1NEID0gMTsKLSAgICBkZWZ3U3RhdGUgPSBERUZXX0JMT0NLQUdFX0xBWUVSOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0vL1RvIGJlIHJlbW92ZWQsIHJlcGxhY2VkIGJ5IGRlZndCbG9ja2FnZXNMYXllckRlc2lnblJ1bGVXaWR0aAotaW50Ci1kZWZ3QmxvY2thZ2VEZXNpZ25SdWxlV2lkdGgoaW50IGVmZmVjdGl2ZVdpZHRoKQotewotICAgIGRlZndGdW5jID0gREVGV19CTE9DS0FHRV9MQVlFUjsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgLy8gQ2hlY2tlZCBpZiBkZWZ3QmxvY2thZ2VEZXNpZ25SdWxlV2lkdGggaGFzIGFscmVhZHkgY2FsbGVkCi0gICAgaWYgKChkZWZ3U3RhdGUgIT0gREVGV19CTE9DS0FHRV9MQVlFUikgJiYgKGRlZndTdGF0ZSAhPSBERUZXX0JMT0NLQUdFX1JFQ1QpKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICBpZiAoZGVmd0Jsb2NrYWdlSGFzU0QpICAgIC8vIEVpdGhlciBzcGFjaW5nIG9yIGRlc2lnbnJ1bGV3aWR0aCBoYXMgZGVmaW5lZAotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgICAgICsgREVTSUdOUlVMRVdJRFRIICVkXG4iLCBlZmZlY3RpdmVXaWR0aCk7Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgZGVmd0Jsb2NrYWdlSGFzU0QgPSAxOwotICAgIGRlZndTdGF0ZSA9IERFRldfQkxPQ0tBR0VfTEFZRVI7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd0Jsb2NrYWdlc1BsYWNlbWVudCgpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX0JMT0NLQUdFX1BMQUNFOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLQotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19CTE9DS0FHRV9TVEFSVCAmJiAoKGRlZndTdGF0ZSA9PSBERUZXX0JMT0NLQUdFX0xBWUVSKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGRlZndTdGF0ZSA9PSBERUZXX0JMT0NLQUdFX1BMQUNFKSkpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0gICAgaWYgKGRlZndTdGF0ZSA9PSBERUZXX0JMT0NLQUdFX1JFQ1QpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgO1xuIik7ICAgLy8gZW5kIHRoZSBwcmV2aW91cyByZWN0YW5nbGUKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgICAtIFBMQUNFTUVOVFxuIik7Ci0gICAgZGVmd0NvdW50ZXItLTsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICBkZWZ3U3RhdGUgPSBERUZXX0JMT0NLQUdFX1BMQUNFOwotICAgIGRlZndCbG9ja2FnZUhhc1NQID0gMDsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndCbG9ja2FnZXNQbGFjZW1lbnRDb21wb25lbnQoY29uc3QgY2hhciAqY29tcE5hbWUpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX0JMT0NLQUdFX1BMQUNFOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLQotICAgIGlmICgoZGVmd1N0YXRlICE9IERFRldfQkxPQ0tBR0VfUExBQ0UpICYmIChkZWZ3U3RhdGUgIT0gREVGV19CTE9DS0FHRV9SRUNUKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgaWYgKChjb21wTmFtZSA9PSAwKSB8fCAoKmNvbXBOYW1lID09IDApKSAgLy8gcmVxdWlyZQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICBpZiAoZGVmd1N0YXRlID09IERFRldfQkxPQ0tBR0VfUkVDVCkKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiA7XG4iKTsgICAvLyBlbmQgdGhlIHByZXZpb3VzIHJlY3RhbmdsZQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgICAgICsgQ09NUE9ORU5UICVzXG4iLCBjb21wTmFtZSk7Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgZGVmd1N0YXRlID0gREVGV19CTE9DS0FHRV9QTEFDRTsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndCbG9ja2FnZXNQbGFjZW1lbnRQdXNoZG93bigpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX0JMT0NLQUdFX1BMQUNFOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLQotICAgIGlmICgoZGVmd1N0YXRlICE9IERFRldfQkxPQ0tBR0VfUExBQ0UpICYmIChkZWZ3U3RhdGUgIT0gREVGV19CTE9DS0FHRV9SRUNUKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgaWYgKGRlZndTdGF0ZSA9PSBERUZXX0JMT0NLQUdFX1JFQ1QpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgO1xuIik7ICAgLy8gZW5kIHRoZSBwcmV2aW91cyByZWN0YW5nbGUKLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICAgICArIFBVU0hET1dOXG4iKTsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICBkZWZ3U3RhdGUgPSBERUZXX0JMT0NLQUdFX1BMQUNFOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0vLyA1LjcKLWludAotZGVmd0Jsb2NrYWdlc1BsYWNlbWVudFNvZnQoKQotewotICAgIGRlZndGdW5jID0gREVGV19CTE9DS0FHRV9QTEFDRTsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0KLSAgICBpZiAoKGRlZndTdGF0ZSAhPSBERUZXX0JMT0NLQUdFX1BMQUNFKSAmJiAoZGVmd1N0YXRlICE9IERFRldfQkxPQ0tBR0VfUkVDVCkpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGlmIChkZWZ3QmxvY2thZ2VIYXNTUCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0KLSAgICBpZiAoZGVmd1N0YXRlID09IERFRldfQkxPQ0tBR0VfUkVDVCkKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiA7XG4iKTsgICAvLyBlbmQgdGhlIHByZXZpb3VzIHJlY3RhbmdsZQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgICAgICsgU09GVFxuIik7Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgZGVmd1N0YXRlID0gREVGV19CTE9DS0FHRV9QTEFDRTsKLSAgICBkZWZ3QmxvY2thZ2VIYXNTUCA9IDE7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLS8vIDUuNwotaW50Ci1kZWZ3QmxvY2thZ2VzUGxhY2VtZW50UGFydGlhbChkb3VibGUgbWF4RGVuc2l0eSkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfQkxPQ0tBR0VfUExBQ0U7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotCi0gICAgaWYgKChkZWZ3U3RhdGUgIT0gREVGV19CTE9DS0FHRV9QTEFDRSkgJiYgKGRlZndTdGF0ZSAhPSBERUZXX0JMT0NLQUdFX1JFQ1QpKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBpZiAoZGVmd0Jsb2NrYWdlSGFzU1ApCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0gICAgaWYgKGRlZndTdGF0ZSA9PSBERUZXX0JMT0NLQUdFX1JFQ1QpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgO1xuIik7ICAgLy8gZW5kIHRoZSBwcmV2aW91cyByZWN0YW5nbGUKLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICAgICArIFBBUlRJQUwgJS4xMWdcbiIsIG1heERlbnNpdHkpOwotICAgIGRlZndMaW5lcysrOwotICAgIGRlZndTdGF0ZSA9IERFRldfQkxPQ0tBR0VfUExBQ0U7Ci0gICAgZGVmd0Jsb2NrYWdlSGFzU1AgPSAxOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi1pbnQKLWRlZndCbG9ja2FnZXNSZWN0KGludCAgIHhsLAotICAgICAgICAgICAgICAgICAgaW50ICAgeWwsCi0gICAgICAgICAgICAgICAgICBpbnQgICB4aCwKLSAgICAgICAgICAgICAgICAgIGludCAgIHloKQotewotICAgIGRlZndGdW5jID0gREVGV19CTE9DS0FHRV9SRUNUOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICAvLyBNYXkgYmUgdXNlciBhbHJlYWR5IGRlZmluZSBsYXllcgotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19CTE9DS0FHRV9QTEFDRSAmJiBkZWZ3U3RhdGUgIT0gREVGV19CTE9DS0FHRV9MQVlFUiAmJgotICAgICAgICBkZWZ3U3RhdGUgIT0gREVGV19CTE9DS0FHRV9SRUNUKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLQotICAgIGlmIChkZWZ3U3RhdGUgPT0gREVGV19CTE9DS0FHRV9SRUNUKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4iKTsgICAvLyBzZXQgYSBuZXdsaW5lIGZvciB0aGUgcHJldmlvdXMgcmVjdGFuZ2xlCi0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICAgICBSRUNUICggJWQgJWQgKSAoICVkICVkICkiLCB4bCwgeWwsIHhoLCB5aCk7Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgZGVmd1N0YXRlID0gREVGV19CTE9DS0FHRV9SRUNUOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd0Jsb2NrYWdlc1BvbHlnb24oaW50ICAgIG51bV9wb2x5cywKLSAgICAgICAgICAgICAgICAgICAgIGludCAgICAqeGwsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgICAgKnlsKQotewotICAgIGludCBpOwotCi0gICAgZGVmd0Z1bmMgPSBERUZXX0JMT0NLQUdFX1JFQ1Q7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIC8vIE1heSBiZSB1c2VyIGFscmVhZHkgZGVmaW5lIGxheWVyCi0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX0JMT0NLQUdFX0xBWUVSICYmIGRlZndTdGF0ZSAhPSBERUZXX0JMT0NLQUdFX1JFQ1QpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0gICAgaWYgKGRlZndTdGF0ZSA9PSBERUZXX0JMT0NLQUdFX1JFQ1QpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiIpOyAgIC8vIHNldCBhIG5ld2xpbmUgZm9yIHRoZSBwcmV2aW91cyByZWN0YW5nbGUKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgICAgIFBPTFlHT04gIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bV9wb2x5czsgaSsrKSB7Ci0gICAgICAgIGlmICgoaSA9PSAwKSB8fCAoKGkgJSA1KSAhPSAwKSkKLSAgICAgICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIoICVkICVkICkgIiwgKnhsKyssICp5bCsrKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICAgICAgICAgKCAlZCAlZCApICIsICp4bCsrLCAqeWwrKyk7Ci0gICAgICAgICAgICBkZWZ3TGluZXMrKzsKLSAgICAgICAgfQotICAgIH0KLSAgICBkZWZ3TGluZXMrKzsKLSAgICBkZWZ3U3RhdGUgPSBERUZXX0JMT0NLQUdFX1JFQ1Q7ICAvLyB1c2UgcmVjdCBmbGFnLiAgSXQgd29ya3MgdGhlIHNhbWUgZm9yIHBvbHkKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotLy8gVG8gYmUgcmVtb3ZlZC4gV2lsbCByZXBsYWNlIGJ5IGRlZndCbGNva2FnZXNQbGFjZW1lbnQKLS8vIGJ1ZyBmaXg6IHN1Ym1pdHRlZCBieSBDcmFpZyBGaWxlcyAoY2ZpbGVzQGZ0Yy5hZ2lsZW50LmNvbSkKLWludAotZGVmd0Jsb2NrYWdlUGxhY2VtZW50KCkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfQkxPQ0tBR0VfUExBQ0U7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIC8vIE1heSBiZSB1c2VyIGFscmVhZHkgZGVmaW5lIGxheWVyCi0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX0JMT0NLQUdFX1NUQVJUICYmICgoZGVmd1N0YXRlID09IERFRldfQkxPQ0tBR0VfTEFZRVIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoZGVmd1N0YXRlID09IERFRldfQkxPQ0tBR0VfUExBQ0UpKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0KLSAgICBpZiAoZGVmd1N0YXRlID09IERFRldfQkxPQ0tBR0VfUkVDVCkKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiA7XG4iKTsgICAvLyBlbmQgdGhlIHByZXZpb3VzIHJlY3RhbmdsZQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgICAtIFBMQUNFTUVOVFxuIik7Ci0gICAgZGVmd0NvdW50ZXItLTsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICBkZWZ3U3RhdGUgPSBERUZXX0JMT0NLQUdFX1BMQUNFOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0vLyBUbyBiZSByZW1vdmVkLiBXaWxsIHJlcGxhY2UgYnkgZGVmd0JsY29rYWdlc1BsYWNlbWVudENvbXBvbmVudAotaW50Ci1kZWZ3QmxvY2thZ2VQbGFjZW1lbnRDb21wb25lbnQoY29uc3QgY2hhciAqY29tcE5hbWUpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX0JMT0NLQUdFX1BMQUNFOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICAvLyBNYXkgYmUgdXNlciBhbHJlYWR5IGRlZmluZSBsYXllcgotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19CTE9DS0FHRV9TVEFSVCAmJiAoKGRlZndTdGF0ZSA9PSBERUZXX0JMT0NLQUdFX0xBWUVSKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGRlZndTdGF0ZSA9PSBERUZXX0JMT0NLQUdFX1BMQUNFKSkpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0gICAgaWYgKChjb21wTmFtZSA9PSAwKSB8fCAoKmNvbXBOYW1lID09IDApKSAgLy8gcmVxdWlyZQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICBpZiAoZGVmd1N0YXRlID09IERFRldfQkxPQ0tBR0VfUkVDVCkKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiA7XG4iKTsgICAvLyBlbmQgdGhlIHByZXZpb3VzIHJlY3RhbmdsZQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgICAtIFBMQUNFTUVOVCArIENPTVBPTkVOVCAlc1xuIiwgY29tcE5hbWUpOwotICAgIGRlZndDb3VudGVyLS07Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgZGVmd1N0YXRlID0gREVGV19CTE9DS0FHRV9QTEFDRTsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotLy8gVG8gYmUgcmVtb3ZlZC4gV2lsbCByZXBsYWNlIGJ5IGRlZndCbGNva2FnZXNQbGFjZW1lbnRQdXNoZG93bgotaW50Ci1kZWZ3QmxvY2thZ2VQbGFjZW1lbnRQdXNoZG93bigpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX0JMT0NLQUdFX1BMQUNFOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICAvLyBNYXkgYmUgdXNlciBhbHJlYWR5IGRlZmluZSBsYXllcgotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19CTE9DS0FHRV9TVEFSVCAmJiAoKGRlZndTdGF0ZSA9PSBERUZXX0JMT0NLQUdFX0xBWUVSKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGRlZndTdGF0ZSA9PSBERUZXX0JMT0NLQUdFX1BMQUNFKSkpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgIGlmIChkZWZ3U3RhdGUgPT0gREVGV19CTE9DS0FHRV9SRUNUKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiIDtcbiIpOyAgIC8vIGVuZCB0aGUgcHJldmlvdXMgcmVjdGFuZ2xlCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiAgIC0gUExBQ0VNRU5UICsgUFVTSERPV05cbiIpOwotICAgIGRlZndDb3VudGVyLS07Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgZGVmd1N0YXRlID0gREVGV19CTE9DS0FHRV9QTEFDRTsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotLy8gVG8gYmUgcmVtb3ZlZC4gV2lsbCByZXBsYWNlIGJ5IGRlZndCbGNva2FnZXNQbGFjZW1lbnRTb2Z0Ci1pbnQKLWRlZndCbG9ja2FnZVBsYWNlbWVudFNvZnQoKQotewotICAgIGRlZndGdW5jID0gREVGV19CTE9DS0FHRV9QTEFDRTsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgLy8gTWF5IGJlIHVzZXIgYWxyZWFkeSBkZWZpbmUgbGF5ZXIKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfQkxPQ0tBR0VfU1RBUlQgJiYgKChkZWZ3U3RhdGUgPT0gREVGV19CTE9DS0FHRV9MQVlFUikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChkZWZ3U3RhdGUgPT0gREVGV19CTE9DS0FHRV9QTEFDRSkpKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICBpZiAoZGVmd1N0YXRlID09IERFRldfQkxPQ0tBR0VfUkVDVCkKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiA7XG4iKTsgICAvLyBlbmQgdGhlIHByZXZpb3VzIHJlY3RhbmdsZQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgICAtIFBMQUNFTUVOVCArIFNPRlRcbiIpOwotICAgIGRlZndDb3VudGVyLS07Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgZGVmd1N0YXRlID0gREVGV19CTE9DS0FHRV9QTEFDRTsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotLy8gVG8gYmUgcmVtb3ZlZC4gV2lsbCByZXBsYWNlIGJ5IGRlZndCbGNva2FnZXNQbGFjZW1lbnRQYXJ0aWFsCi1pbnQKLWRlZndCbG9ja2FnZVBsYWNlbWVudFBhcnRpYWwoZG91YmxlIG1heERlbnNpdHkpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX0JMT0NLQUdFX1BMQUNFOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICAvLyBNYXkgYmUgdXNlciBhbHJlYWR5IGRlZmluZSBsYXllcgotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19CTE9DS0FHRV9TVEFSVCAmJiAoKGRlZndTdGF0ZSA9PSBERUZXX0JMT0NLQUdFX0xBWUVSKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGRlZndTdGF0ZSA9PSBERUZXX0JMT0NLQUdFX1BMQUNFKSkpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0gICAgaWYgKGRlZndTdGF0ZSA9PSBERUZXX0JMT0NLQUdFX1JFQ1QpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgO1xuIik7ICAgLy8gZW5kIHRoZSBwcmV2aW91cyByZWN0YW5nbGUKLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICAgLSBQTEFDRU1FTlQgKyBQQVJUSUFMICUuMTFnXG4iLCBtYXhEZW5zaXR5KTsKLSAgICBkZWZ3Q291bnRlci0tOwotICAgIGRlZndMaW5lcysrOwotICAgIGRlZndTdGF0ZSA9IERFRldfQkxPQ0tBR0VfUExBQ0U7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLS8vIFRvIGJlIHJlbW92ZWQuIFdpbGwgcmVwbGFjZSBieSBkZWZ3QmxvY2thZ2VzTGF5ZXJNYXNrCi1pbnQKLWRlZndCbG9ja2FnZU1hc2soaW50IGNvbG9yTWFzaykKLXsKLSAgICBpZiAoZGVmVmVyc2lvbk51bSA8IDUuOCkgewotICAgICAgICByZXR1cm4gREVGV19XUk9OR19WRVJTSU9OOwotICAgIH0KLQotICAgIGRlZndGdW5jID0gREVGV19CTE9DS0FHRV9NQVNLOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICAvLyBNYXkgYmUgdXNlciBhbHJlYWR5IGRlZmluZSBsYXllcgotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19CTE9DS0FHRV9QTEFDRSAmJiBkZWZ3U3RhdGUgIT0gREVGV19CTE9DS0FHRV9MQVlFUiAmJgotICAgICAgICBkZWZ3U3RhdGUgIT0gREVGV19CTE9DS0FHRV9SRUNUKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLQotICAgIGlmIChkZWZ3U3RhdGUgPT0gREVGV19CTE9DS0FHRV9SRUNUKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4iKTsgICAvLyBzZXQgYSBuZXdsaW5lIGZvciB0aGUgcHJldmlvdXMgcmVjdGFuZ2xlCi0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICAgICArIE1BU0sgJWQiLCBjb2xvck1hc2spOwotICAgIGRlZndMaW5lcysrOwotICAgIGRlZndTdGF0ZSA9IERFRldfQkxPQ0tBR0VfTEFZRVI7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLS8vIFRvYmUgcmVtb3ZlZC4gV2lsbCBiZSByZXBsYWNlZCBieSBkZWZ3QmxvY2thZ2VzUmVjdC4KLWludAotZGVmd0Jsb2NrYWdlUmVjdChpbnQgICAgeGwsCi0gICAgICAgICAgICAgICAgIGludCAgICB5bCwKLSAgICAgICAgICAgICAgICAgaW50ICAgIHhoLAotICAgICAgICAgICAgICAgICBpbnQgICAgeWgpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX0JMT0NLQUdFX1JFQ1Q7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIC8vIE1heSBiZSB1c2VyIGFscmVhZHkgZGVmaW5lIGxheWVyCi0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX0JMT0NLQUdFX1BMQUNFICYmIGRlZndTdGF0ZSAhPSBERUZXX0JMT0NLQUdFX0xBWUVSICYmCi0gICAgICAgIGRlZndTdGF0ZSAhPSBERUZXX0JMT0NLQUdFX1JFQ1QgJiYgZGVmd1N0YXRlICE9IERFRldfQkxPQ0tBR0VfTUFTSykKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0KLSAgICBpZiAoZGVmd1N0YXRlID09IERFRldfQkxPQ0tBR0VfUkVDVCkKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuIik7ICAgLy8gc2V0IGEgbmV3bGluZSBmb3IgdGhlIHByZXZpb3VzIHJlY3RhbmdsZQotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiAgICAgUkVDVCAoICVkICVkICkgKCAlZCAlZCApIiwgeGwsIHlsLCB4aCwgeWgpOwotICAgIGRlZndMaW5lcysrOwotICAgIGRlZndTdGF0ZSA9IERFRldfQkxPQ0tBR0VfUkVDVDsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotLy8gVG9iZSByZW1vdmVkLiBXaWxsIGJlIHJlcGxhY2VkIGJ5IGRlZndCbG9ja2FnZXNQb2x5Z29uLgotaW50Ci1kZWZ3QmxvY2thZ2VQb2x5Z29uKGludCBudW1fcG9seXMsCi0gICAgICAgICAgICAgICAgICAgIGludCAqeGwsCi0gICAgICAgICAgICAgICAgICAgIGludCAqeWwpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBkZWZ3RnVuYyA9IERFRldfQkxPQ0tBR0VfUkVDVDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgLy8gTWF5IGJlIHVzZXIgYWxyZWFkeSBkZWZpbmUgbGF5ZXIKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfQkxPQ0tBR0VfTEFZRVIgJiYgZGVmd1N0YXRlICE9IERFRldfQkxPQ0tBR0VfUkVDVAotICAgICAgICAmJiBkZWZ3U3RhdGUgIT0gREVGV19CTE9DS0FHRV9NQVNLKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLQotICAgIGlmIChkZWZ3U3RhdGUgPT0gREVGV19CTE9DS0FHRV9SRUNUKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4iKTsgICAvLyBzZXQgYSBuZXdsaW5lIGZvciB0aGUgcHJldmlvdXMgcmVjdGFuZ2xlCi0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICAgICBQT0xZR09OICIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcG9seXM7IGkrKykgewotICAgICAgICBpZiAoKGkgPT0gMCkgfHwgKChpICUgNSkgIT0gMCkpCi0gICAgICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiKCAlZCAlZCApICIsICp4bCsrLCAqeWwrKyk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgICAgICAgICggJWQgJWQgKSAiLCAqeGwrKywgKnlsKyspOwotICAgICAgICAgICAgZGVmd0xpbmVzKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgZGVmd1N0YXRlID0gREVGV19CTE9DS0FHRV9SRUNUOyAgLy8gdXNlIHJlY3QgZmxhZy4gIEl0IHdvcmtzIHRoZSBzYW1lIGZvciBwb2x5Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3RW5kQmxvY2thZ2VzKCkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfQkxPQ0tBR0VfRU5EOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfQkxPQ0tBR0VfUkVDVCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmIChkZWZ3Q291bnRlciA+IDApCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgIGVsc2UgaWYgKGRlZndDb3VudGVyIDwgMCkKLSAgICAgICAgcmV0dXJuIERFRldfVE9PX01BTllfU1RNUzsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgO1xuIik7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiRU5EIEJMT0NLQUdFU1xuXG4iKTsKLSAgICBkZWZ3TGluZXMrKzsKLQotICAgIGRlZndTdGF0ZSA9IERFRldfQkxPQ0tBR0VfRU5EOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd1N0YXJ0U2xvdHMoaW50IGNvdW50KQotewotICAgIGRlZndGdW5jID0gREVGV19TTE9UX1NUQVJUOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoKGRlZndTdGF0ZSA+PSBERUZXX1NMT1RfU1RBUlQpICYmIChkZWZ3U3RhdGUgPD0gREVGV19TTE9UX0VORCkpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoZGVmVmVyc2lvbk51bSA8IDUuNCkKLSAgICAgICAgcmV0dXJuIERFRldfV1JPTkdfVkVSU0lPTjsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJTTE9UUyAlZCA7XG4iLCBjb3VudCk7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX1NMT1RfU1RBUlQ7Ci0gICAgZGVmd0NvdW50ZXIgPSBjb3VudDsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotaW50Ci1kZWZ3U2xvdExheWVyKGNvbnN0IGNoYXIgKmxheWVyTmFtZSkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfU0xPVF9MQVlFUjsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgLy8gTWF5IGJlIHVzZXIgYWxyZWFkeSBkZWZpbmUgbGF5ZXIKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfU0xPVF9TVEFSVCAmJiBkZWZ3U3RhdGUgPT0gREVGV19TTE9UX0xBWUVSKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLQotICAgIGlmICghbGF5ZXJOYW1lIHx8ICEqbGF5ZXJOYW1lKSAgLy8gcmVxdWlyZQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICBpZiAoZGVmd1N0YXRlID09IERFRldfU0xPVF9SRUNUKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiIDtcbiIpOyAgIC8vIGVuZCB0aGUgcHJldmlvdXMgcmVjdGFuZ2xlCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiAgIC0gTEFZRVIgJXMgXG4iLCBsYXllck5hbWUpOwotICAgIGRlZndDb3VudGVyLS07Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgZGVmd1N0YXRlID0gREVGV19TTE9UX0xBWUVSOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd1Nsb3RSZWN0KGludCAgICB4bCwKLSAgICAgICAgICAgICBpbnQgICAgeWwsCi0gICAgICAgICAgICAgaW50ICAgIHhoLAotICAgICAgICAgICAgIGludCAgICB5aCkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfU0xPVF9SRUNUOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICAvLyBNYXkgYmUgdXNlciBhbHJlYWR5IGRlZmluZSBsYXllcgotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19TTE9UX0xBWUVSICYmIGRlZndTdGF0ZSAhPSBERUZXX1NMT1RfUkVDVCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0KLSAgICBpZiAoZGVmd1N0YXRlID09IERFRldfU0xPVF9SRUNUKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4iKTsgICAvLyBzZXQgYSBuZXdsaW5lIGZvciB0aGUgcHJldmlvdXMgcmVjdGFuZ2xlCi0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICAgICBSRUNUICggJWQgJWQgKSAoICVkICVkICkiLCB4bCwgeWwsIHhoLCB5aCk7Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgZGVmd1N0YXRlID0gREVGV19TTE9UX1JFQ1Q7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3U2xvdFBvbHlnb24oaW50ICAgICBudW1fcG9seXMsCi0gICAgICAgICAgICAgICAgZG91YmxlICAqeGwsCi0gICAgICAgICAgICAgICAgZG91YmxlICAqeWwpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBkZWZ3RnVuYyA9IERFRldfU0xPVF9SRUNUOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICAvLyBNYXkgYmUgdXNlciBhbHJlYWR5IGRlZmluZSBsYXllcgotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19TTE9UX0xBWUVSICYmIGRlZndTdGF0ZSAhPSBERUZXX1NMT1RfUkVDVCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0KLSAgICBpZiAoZGVmd1N0YXRlID09IERFRldfU0xPVF9SRUNUKQotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4iKTsgICAvLyBzZXQgYSBuZXdsaW5lIGZvciB0aGUgcHJldmlvdXMgcmVjdGFuZ2xlCi0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICAgICBQT0xZR09OICIpOwotCi0gICAgcHJpbnRQb2ludHNOdW0gPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcG9seXM7IGkrKykgewotICAgICAgICBpZiAoKGkgPT0gMCkgfHwgKChpICUgNSkgIT0gMCkpCi0gICAgICAgICAgICBwcmludFBvaW50cyhkZWZ3RmlsZSwgKnhsKyssICp5bCsrLCAiIiwgIiAiKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBwcmludFBvaW50cyhkZWZ3RmlsZSwgKnhsKyssICp5bCsrLCAiXG4gICAgICAgICAgICAgIiwgIiAiKTsKLSAgICAgICAgICAgIGRlZndMaW5lcysrOwotICAgICAgICB9Ci0gICAgfQotICAgIGRlZndMaW5lcysrOwotICAgIGRlZndTdGF0ZSA9IERFRldfU0xPVF9SRUNUOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd0VuZFNsb3RzKCkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfU0xPVF9FTkQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19TTE9UX1JFQ1QpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoZGVmd0NvdW50ZXIgPiAwKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICBlbHNlIGlmIChkZWZ3Q291bnRlciA8IDApCi0gICAgICAgIHJldHVybiBERUZXX1RPT19NQU5ZX1NUTVM7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiIDtcbiIpOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIkVORCBTTE9UU1xuXG4iKTsKLSAgICBkZWZ3TGluZXMrKzsKLQotICAgIGRlZndTdGF0ZSA9IERFRldfU0xPVF9FTkQ7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3U3RhcnRGaWxscyhpbnQgY291bnQpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX0ZJTExfU1RBUlQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICgoZGVmd1N0YXRlID49IERFRldfRklMTF9TVEFSVCkgJiYgKGRlZndTdGF0ZSA8PSBERUZXX0ZJTExfRU5EKSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmIChkZWZWZXJzaW9uTnVtIDwgNS40KQotICAgICAgICByZXR1cm4gREVGV19XUk9OR19WRVJTSU9OOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIkZJTExTICVkIDtcbiIsIGNvdW50KTsKLSAgICBkZWZ3TGluZXMrKzsKLQotICAgIGRlZndTdGF0ZSA9IERFRldfRklMTF9TVEFSVDsKLSAgICBkZWZ3Q291bnRlciA9IGNvdW50OwotICAgIHJldHVybiBERUZXX09LOwotfQotCi1pbnQKLWRlZndGaWxsTGF5ZXIoY29uc3QgY2hhciAqbGF5ZXJOYW1lKQotewotICAgIGRlZndGdW5jID0gREVGV19GSUxMX0xBWUVSOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICAvLyBNYXkgYmUgdXNlciBhbHJlYWR5IGRlZmluZSBsYXllcgotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19GSUxMX1NUQVJUICYmIGRlZndTdGF0ZSA9PSBERUZXX0ZJTExfTEFZRVIpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0gICAgaWYgKCFsYXllck5hbWUgfHwgISpsYXllck5hbWUpICAvLyByZXF1aXJlCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgIGlmIChkZWZ3U3RhdGUgPT0gREVGV19GSUxMX1JFQ1QpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgO1xuIik7ICAgLy8gZW5kIHRoZSBwcmV2aW91cyByZWN0YW5nbGUKLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICAgLSBMQVlFUiAlcyBcbiIsIGxheWVyTmFtZSk7Ci0gICAgZGVmd0NvdW50ZXItLTsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICBkZWZ3U3RhdGUgPSBERUZXX0ZJTExfTEFZRVI7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd0ZpbGxMYXllck1hc2soaW50IGNvbG9yTWFzaykKLXsKLSAgICBpZiAoZGVmVmVyc2lvbk51bSA8IDUuOCkgewotICAgICAgICByZXR1cm4gREVGV19XUk9OR19WRVJTSU9OOwotICAgIH0KLQotICAgIGRlZndGdW5jID0gREVGV19GSUxMX0xBWUVSTUFTSzsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgLy8gTWF5IGJlIHVzZXIgYWxyZWFkeSBkZWZpbmUgbGF5ZXIKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfRklMTF9MQVlFUikKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICAgICArIE1BU0sgJWQiLCBjb2xvck1hc2spOwotICAgIGRlZndMaW5lcysrOwotICAgIGRlZndTdGF0ZSA9IERFRldfRklMTF9MQVlFUk1BU0s7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotLy8gNS43MQotaW50Ci1kZWZ3RmlsbExheWVyT1BDKCkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfRklMTF9PUEM7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIC8vIE1heSBiZSB1c2VyIGFscmVhZHkgZGVmaW5lIGxheWVyCi0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX0ZJTExfTEFZRVIgJiYgZGVmd1N0YXRlICE9IERFRldfRklMTF9MQVlFUk1BU0spCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiAgICAgKyBPUEMiKTsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICBkZWZ3U3RhdGUgPSBERUZXX0ZJTExfT1BDOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi1pbnQKLWRlZndGaWxsUmVjdChpbnQgICAgeGwsCi0gICAgICAgICAgICAgaW50ICAgIHlsLAotICAgICAgICAgICAgIGludCAgICB4aCwKLSAgICAgICAgICAgICBpbnQgICAgeWgpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX0ZJTExfUkVDVDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgLy8gTWF5IGJlIHVzZXIgYWxyZWFkeSBkZWZpbmUgbGF5ZXIKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfRklMTF9MQVlFUiAmJiBkZWZ3U3RhdGUgIT0gREVGV19GSUxMX1JFQ1QgJiYKLSAgICAgICAgZGVmd1N0YXRlICE9IERFRldfRklMTF9PUEMgJiYgZGVmd1N0YXRlICE9IERFRldfRklMTF9MQVlFUk1BU0spCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0gICAgaWYgKGRlZndTdGF0ZSA9PSBERUZXX0ZJTExfUkVDVCkKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuIik7ICAgLy8gc2V0IGEgbmV3bGluZSBmb3IgdGhlIHByZXZpb3VzIHJlY3RhbmdsZQotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiAgICAgUkVDVCAoICVkICVkICkgKCAlZCAlZCApIiwgeGwsIHlsLCB4aCwgeWgpOwotICAgIGRlZndMaW5lcysrOwotICAgIGRlZndTdGF0ZSA9IERFRldfRklMTF9SRUNUOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd0ZpbGxQb2x5Z29uKGludCAgICAgbnVtX3BvbHlzLAotICAgICAgICAgICAgICAgIGRvdWJsZSAgKnhsLAotICAgICAgICAgICAgICAgIGRvdWJsZSAgKnlsKQotewotICAgIGludCBpOwotCi0gICAgZGVmd0Z1bmMgPSBERUZXX0ZJTExfUkVDVDsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgLy8gTWF5IGJlIHVzZXIgYWxyZWFkeSBkZWZpbmUgbGF5ZXIKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfRklMTF9MQVlFUiAmJiBkZWZ3U3RhdGUgIT0gREVGV19GSUxMX1JFQ1QgJiYKLSAgICAgICAgZGVmd1N0YXRlICE9IERFRldfRklMTF9PUEMgJiYgZGVmd1N0YXRlICE9IERFRldfRklMTF9MQVlFUk1BU0spCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotCi0gICAgaWYgKGRlZndTdGF0ZSA9PSBERUZXX0ZJTExfUkVDVCkKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuIik7ICAgLy8gc2V0IGEgbmV3bGluZSBmb3IgdGhlIHByZXZpb3VzIHJlY3RhbmdsZQotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiAgICAgUE9MWUdPTiAiKTsKLSAgICBwcmludFBvaW50c051bSA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bV9wb2x5czsgaSsrKSB7Ci0gICAgICAgIGlmICgoaSA9PSAwKSB8fCAoKGkgJSA1KSAhPSAwKSkKLSAgICAgICAgICAgIHByaW50UG9pbnRzKGRlZndGaWxlLCAqeGwrKywgKnlsKyssICIiLCAiICIpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHByaW50UG9pbnRzKGRlZndGaWxlLCAqeGwrKywgKnlsKyssICAiXG4gICAgICAgICAgICAgIiwgIiAiKTsKLSAgICAgICAgICAgIGRlZndMaW5lcysrOwotICAgICAgICB9Ci0gICAgfQotICAgIGRlZndMaW5lcysrOwotICAgIGRlZndTdGF0ZSA9IERFRldfRklMTF9SRUNUOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0vLyA1LjcKLWludAotZGVmd0ZpbGxWaWEoY29uc3QgY2hhciAqdmlhTmFtZSkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfRklMTF9MQVlFUjsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgLy8gTWF5IGJlIHVzZXIgYWxyZWFkeSBkZWZpbmUgbGF5ZXIKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfRklMTF9TVEFSVCAmJiBkZWZ3U3RhdGUgPT0gREVGV19GSUxMX0xBWUVSKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLQotICAgIGlmICghdmlhTmFtZSB8fCAhKnZpYU5hbWUpICAvLyByZXF1aXJlCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgIGlmIChkZWZ3U3RhdGUgPT0gREVGV19GSUxMX1JFQ1QpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgO1xuIik7ICAgLy8gZW5kIHRoZSBwcmV2aW91cyByZWN0YW5nbGUKLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICAgLSBWSUEgJXMgXG4iLCB2aWFOYW1lKTsKLSAgICBkZWZ3Q291bnRlci0tOwotICAgIGRlZndMaW5lcysrOwotICAgIGRlZndTdGF0ZSA9IERFRldfRklMTF9WSUE7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd0ZpbGxWaWFNYXNrKGludCBtYXNrQ29sb3IpCi17Ci0gICAgaWYgKGRlZlZlcnNpb25OdW0gPCA1LjgpIHsKLSAgICAgICAgcmV0dXJuIERFRldfV1JPTkdfVkVSU0lPTjsKLSAgICB9Ci0KLSAgICBkZWZ3RnVuYyA9IERFRldfRklMTF9WSUFNQVNLOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICAvLyBNYXkgYmUgdXNlciBhbHJlYWR5IGRlZmluZSBsYXllcgotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19GSUxMX1ZJQSkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICAgICArIE1BU0sgJWQiLCBtYXNrQ29sb3IpOwotICAgIGRlZndMaW5lcysrOwotICAgIGRlZndTdGF0ZSA9IERFRldfRklMTF9WSUFNQVNLOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLS8vIDUuNzEKLWludAotZGVmd0ZpbGxWaWFPUEMoKQotewotICAgIGRlZndGdW5jID0gREVGV19GSUxMX09QQzsgICAvLyBDdXJyZW50IGZ1bmN0aW9uIG9mIHdyaXRlcgotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgLy8gTWF5IGJlIHVzZXIgYWxyZWFkeSBkZWZpbmUgbGF5ZXIKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfRklMTF9WSUEgJiYgZGVmd1N0YXRlICE9IERFRldfRklMTF9WSUFNQVNLKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgICAgICsgT1BDIik7Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgZGVmd1N0YXRlID0gREVGV19GSUxMX09QQzsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndGaWxsUG9pbnRzKGludCAgICAgIG51bV9wb2ludHMsCi0gICAgICAgICAgICAgICBkb3VibGUgICAqeGwsCi0gICAgICAgICAgICAgICBkb3VibGUgICAqeWwpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBkZWZ3RnVuYyA9IERFRldfRklMTF9SRUNUOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICAvLyBNYXkgYmUgdXNlciBhbHJlYWR5IGRlZmluZSBsYXllcgotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19GSUxMX1ZJQSAmJiBkZWZ3U3RhdGUgIT0gREVGV19GSUxMX1JFQ1QgJiYKLSAgICAgICAgZGVmd1N0YXRlICE9IERFRldfRklMTF9PUEMgJiYgZGVmd1N0YXRlICE9IERFRldfRklMTF9WSUFNQVNLKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLQotICAgIGlmIChkZWZ3U3RhdGUgPT0gREVGV19GSUxMX1JFQ1QpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiIpOyAgIC8vIHNldCBhIG5ld2xpbmUgZm9yIHRoZSBwcmV2aW91cyByZWN0YW5nbGUKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgICAgICIpOwotICAgIHByaW50UG9pbnRzTnVtID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcG9pbnRzOyBpKyspIHsKLSAgICAgICAgaWYgKChpID09IDApIHx8ICgoaSAlIDUpICE9IDApKQotICAgICAgICAgICAgcHJpbnRQb2ludHMoZGVmd0ZpbGUsICp4bCsrLCAqeWwrKywgIiIsICIgIik7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcHJpbnRQb2ludHMoZGVmd0ZpbGUsICp4bCsrLCAqeWwrKywgIlxuICAgICAgICAgICAgICIsICIgIik7Ci0gICAgICAgICAgICBkZWZ3TGluZXMrKzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGRlZndMaW5lcysrOwotICAgIGRlZndTdGF0ZSA9IERFRldfRklMTF9SRUNUOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi0KLWludAotZGVmd0VuZEZpbGxzKCkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfRklMTF9FTkQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19GSUxMX1JFQ1QgJiYgZGVmd1N0YXRlICE9IERFRldfRklMTF9PUEMpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoZGVmd0NvdW50ZXIgPiAwKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICBlbHNlIGlmIChkZWZ3Q291bnRlciA8IDApCi0gICAgICAgIHJldHVybiBERUZXX1RPT19NQU5ZX1NUTVM7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiIDtcbiIpOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIkVORCBGSUxMU1xuXG4iKTsKLSAgICBkZWZ3TGluZXMrKzsKLQotICAgIGRlZndTdGF0ZSA9IERFRldfRklMTF9FTkQ7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3U3RhcnROb25EZWZhdWx0UnVsZXMoaW50IGNvdW50KQotewotICAgIGRlZndGdW5jID0gREVGV19ORFJfU1RBUlQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICgoZGVmd1N0YXRlID49IERFRldfTkRSX1NUQVJUKSAmJiAoZGVmd1N0YXRlIDw9IERFRldfTkRSX0VORCkpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoZGVmVmVyc2lvbk51bSA8IDUuNikKLSAgICAgICAgcmV0dXJuIERFRldfV1JPTkdfVkVSU0lPTjsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJOT05ERUZBVUxUUlVMRVMgJWQgO1xuIiwgY291bnQpOwotICAgIGRlZndMaW5lcysrOwotCi0gICAgZGVmd1N0YXRlID0gREVGV19ORFJfU1RBUlQ7Ci0gICAgZGVmd0NvdW50ZXIgPSBjb3VudDsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotaW50Ci1kZWZ3Tm9uRGVmYXVsdFJ1bGUoY29uc3QgY2hhciAgICpydWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgaGFyZFNwYWNpbmcpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX05EUjsKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIC8vIE1heSBiZSB1c2VyIGFscmVhZHkgZGVmaW5lIGxheWVyCi0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX05EUl9TVEFSVCAmJiBkZWZ3U3RhdGUgIT0gREVGV19ORFIpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGlmICghcnVsZU5hbWUgfHwgISpydWxlTmFtZSkgIC8vIHJlcXVpcmUKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgaWYgKGRlZndTdGF0ZSA9PSBERUZXX05EUikKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIjtcbiIpOwotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgICAtICVzIiwgcnVsZU5hbWUpOwotICAgIGlmIChoYXJkU3BhY2luZykKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBIQVJEU1BBQ0lORyIpOwotICAgIGRlZndDb3VudGVyLS07Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgZGVmd1N0YXRlID0gREVGV19ORFI7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3Tm9uRGVmYXVsdFJ1bGVMYXllcihjb25zdCBjaGFyICAqbGF5ZXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBkaWFnV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBzcGFjaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgd2lyZUV4dCkKLXsKLSAgICBkZWZ3RnVuYyA9IERFRldfTkRSOwotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgLy8gTWF5IGJlIHVzZXIgYWxyZWFkeSBkZWZpbmUgbGF5ZXIKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfTkRSKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0KLSAgICBpZiAoIWxheWVyTmFtZSB8fCAhKmxheWVyTmFtZSkgIC8vIHJlcXVpcmUKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgICAgKyBMQVlFUiAlcyAiLCBsYXllck5hbWUpOwotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgV0lEVEggJWQgIiwgd2lkdGgpOwotICAgIGlmIChkaWFnV2lkdGgpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgRElBR1dJRFRIICVkICIsIGRpYWdXaWR0aCk7Ci0gICAgaWYgKHNwYWNpbmcpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIgU1BBQ0lORyAlZCAiLCBzcGFjaW5nKTsKLSAgICBpZiAod2lyZUV4dCkKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiBXSVJFRVhUICVkICIsIHdpcmVFeHQpOwotICAgIGRlZndMaW5lcysrOwotICAgIGRlZndTdGF0ZSA9IERFRldfTkRSOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi1pbnQKLWRlZndOb25EZWZhdWx0UnVsZVZpYShjb25zdCBjaGFyICp2aWFOYW1lKQotewotICAgIGRlZndGdW5jID0gREVGV19ORFI7Ci0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICAvLyBNYXkgYmUgdXNlciBhbHJlYWR5IGRlZmluZSBsYXllcgotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19ORFIpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIGlmICghdmlhTmFtZSB8fCAhKnZpYU5hbWUpICAvLyByZXF1aXJlCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgVklBICVzICIsIHZpYU5hbWUpOwotICAgIGRlZndMaW5lcysrOwotICAgIGRlZndTdGF0ZSA9IERFRldfTkRSOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi1pbnQKLWRlZndOb25EZWZhdWx0UnVsZVZpYVJ1bGUoY29uc3QgY2hhciAqdmlhUnVsZU5hbWUpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX05EUjsKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIC8vIE1heSBiZSB1c2VyIGFscmVhZHkgZGVmaW5lIGxheWVyCi0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX05EUikKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgaWYgKCh2aWFSdWxlTmFtZSA9PSAwKSB8fCAoKnZpYVJ1bGVOYW1lID09IDApKSAgLy8gcmVxdWlyZQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiXG4gICAgICArIFZJQVJVTEUgJXMgIiwgdmlhUnVsZU5hbWUpOwotICAgIGRlZndMaW5lcysrOwotICAgIGRlZndTdGF0ZSA9IERFRldfTkRSOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi1pbnQKLWRlZndOb25EZWZhdWx0UnVsZU1pbkN1dHMoY29uc3QgY2hhciAgICAqY3V0TGF5ZXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgIG51bUN1dHMpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX05EUjsKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIC8vIE1heSBiZSB1c2VyIGFscmVhZHkgZGVmaW5lIGxheWVyCi0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX05EUikKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgaWYgKChjdXRMYXllck5hbWUgPT0gMCkgfHwgKCpjdXRMYXllck5hbWUgPT0gMCkpICAvLyByZXF1aXJlCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgICAgICsgTUlOQ1VUUyAlcyAlZCAiLCBjdXRMYXllck5hbWUsIG51bUN1dHMpOwotICAgIGRlZndMaW5lcysrOwotICAgIGRlZndTdGF0ZSA9IERFRldfTkRSOwotICAgIHJldHVybiBERUZXX09LOwotfQotCi1pbnQKLWRlZndFbmROb25EZWZhdWx0UnVsZXMoKQotewotICAgIGRlZndGdW5jID0gREVGV19ORFJfRU5EOyAgIC8vIEN1cnJlbnQgZnVuY3Rpb24gb2Ygd3JpdGVyCi0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfTkRSKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKGRlZndDb3VudGVyID4gMCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX0RBVEE7Ci0gICAgZWxzZSBpZiAoZGVmd0NvdW50ZXIgPCAwKQotICAgICAgICByZXR1cm4gREVGV19UT09fTUFOWV9TVE1TOwotCi0gICAgZnByaW50ZihkZWZ3RmlsZSwgIjtcbkVORCBOT05ERUZBVUxUUlVMRVNcblxuIik7Ci0gICAgZGVmd0xpbmVzKys7Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX05EUl9FTkQ7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3U3RhcnRTdHlsZXMoaW50IGNvdW50KQotewotICAgIGRlZndGdW5jID0gREVGV19TVFlMRVNfU1RBUlQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICgoZGVmd1N0YXRlID49IERFRldfU1RZTEVTX1NUQVJUKSAmJiAoZGVmd1N0YXRlIDw9IERFRldfU1RZTEVTX0VORCkpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoZGVmVmVyc2lvbk51bSA8IDUuNikKLSAgICAgICAgcmV0dXJuIERFRldfV1JPTkdfVkVSU0lPTjsKLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJTVFlMRVMgJWQgO1xuIiwgY291bnQpOwotICAgIGRlZndMaW5lcysrOwotCi0gICAgZGVmd1N0YXRlID0gREVGV19TVFlMRVNfU1RBUlQ7Ci0gICAgZGVmd0NvdW50ZXIgPSBjb3VudDsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotaW50Ci1kZWZ3U3R5bGVzKGludCAgICAgIHN0eWxlTnVtcywKLSAgICAgICAgICAgaW50ICAgICAgbnVtX3BvaW50cywKLSAgICAgICAgICAgZG91YmxlICAgKnhwLAotICAgICAgICAgICBkb3VibGUgICAqeXApCi17Ci0gICAgaW50IGk7Ci0KLSAgICBkZWZ3RnVuYyA9IERFRldfU1RZTEVTOwotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgLy8gTWF5IGJlIHVzZXIgYWxyZWFkeSBkZWZpbmUgbGF5ZXIKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfU1RZTEVTX1NUQVJUICYmIGRlZndTdGF0ZSAhPSBERUZXX1NUWUxFUykKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotCi0gICAgaWYgKHN0eWxlTnVtcyA8IDApICAvLyByZXF1aXJlCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgICAtIFNUWUxFICVkICIsIHN0eWxlTnVtcyk7Ci0KLSAgICBwcmludFBvaW50c051bSA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bV9wb2ludHM7IGkrKykgewotICAgICAgICBpZiAoKGkgPT0gMCkgfHwgKChpICUgNSkgIT0gMCkpCi0gICAgICAgICAgICBwcmludFBvaW50cyhkZWZ3RmlsZSwgKnhwKyssICp5cCsrLCAiIiwgIiAiKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBwcmludFBvaW50cyhkZWZ3RmlsZSwgKnhwKyssICp5cCsrLCAiXG4gICAgICAgIiwgIiAiKTsKLSAgICAgICAgICAgIGRlZndMaW5lcysrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZGVmd0NvdW50ZXItLTsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiO1xuIik7Ci0gICAgZGVmd1N0YXRlID0gREVGV19TVFlMRVM7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd0VuZFN0eWxlcygpCi17Ci0gICAgZGVmd0Z1bmMgPSBERUZXX1NUWUxFU19FTkQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19TVFlMRVMpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoZGVmd0NvdW50ZXIgPiAwKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICBlbHNlIGlmIChkZWZ3Q291bnRlciA8IDApCi0gICAgICAgIHJldHVybiBERUZXX1RPT19NQU5ZX1NUTVM7Ci0KLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiRU5EIFNUWUxFU1xuXG4iKTsKLSAgICBkZWZ3TGluZXMrKzsKLQotICAgIGRlZndTdGF0ZSA9IERFRldfU1RZTEVTX0VORDsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndTdGFydEJlZ2luZXh0KGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWRlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKGRlZndTdGF0ZSA9PSBERUZXX0JFR0lORVhUX1NUQVJUIHx8Ci0gICAgICAgIGRlZndTdGF0ZSA9PSBERUZXX0JFR0lORVhUKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFuYW1lIHx8IG5hbWUgPT0gMCB8fCAqbmFtZSA9PSAwKQotICAgICAgICByZXR1cm4gREVGV19CQURfREFUQTsKLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiQkVHSU5FWFQgXCIlc1wiXG4iLCBuYW1lKTsKLQotICAgIGRlZndTdGF0ZSA9IERFRldfQkVHSU5FWFRfU1RBUlQ7Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLWludAotZGVmd0JlZ2luZXh0Q3JlYXRvcihjb25zdCBjaGFyICpjcmVhdG9yTmFtZSkKLXsKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghZGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfQkVHSU5FWFRfU1RBUlQgJiYKLSAgICAgICAgZGVmd1N0YXRlICE9IERFRldfQkVHSU5FWFQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWNyZWF0b3JOYW1lIHx8IGNyZWF0b3JOYW1lID09IDAgfHwgKmNyZWF0b3JOYW1lID09IDApCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9EQVRBOwotICAgIGZwcmludGYoZGVmd0ZpbGUsICIgICBDUkVBVE9SIFwiJXNcIlxuIiwgY3JlYXRvck5hbWUpOwotCi0gICAgZGVmd1N0YXRlID0gREVGV19CRUdJTkVYVDsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndCZWdpbmV4dERhdGUoKQotewotICAgIHRpbWVfdCAgdG9kYXlUaW1lOwotICAgIGNoYXIgICAgKnJldHRpbWU7Ci0KLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gREVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghZGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoZGVmd1N0YXRlICE9IERFRldfQkVHSU5FWFRfU1RBUlQgJiYKLSAgICAgICAgZGVmd1N0YXRlICE9IERFRldfQkVHSU5FWFQpCi0gICAgICAgIHJldHVybiBERUZXX0JBRF9PUkRFUjsKLQotICAgIHRvZGF5VGltZSA9IHRpbWUoTlVMTCk7ICAgICAgICAgICAgIC8vIHRpbWUgaW4gVVRDIAotICAgIHJldHRpbWUgPSBjdGltZSgmdG9kYXlUaW1lKTsgICAgICAgIC8vIGNvbnZlcnQgdG8gc3RyaW5nCi0gICAgcmV0dGltZVtzdHJsZW4ocmV0dGltZSkgLSAxXSA9ICdcMCc7ICAvLyByZXBsYWNlIFxuIHdpdGggXDAKLSAgICBmcHJpbnRmKGRlZndGaWxlLCAiICAgREFURSBcIiVzXCIiLCByZXR0aW1lKTsKLQotICAgIGRlZndTdGF0ZSA9IERFRldfQkVHSU5FWFQ7Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3QmVnaW5leHRSZXZpc2lvbihpbnQgICAgdmVyczEsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgICAgdmVyczIpCi17Ci0gICAgaWYgKCFkZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIERFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWRlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgaWYgKGRlZndTdGF0ZSAhPSBERUZXX0JFR0lORVhUX1NUQVJUICYmCi0gICAgICAgIGRlZndTdGF0ZSAhPSBERUZXX0JFR0lORVhUKQotICAgICAgICByZXR1cm4gREVGV19CQURfT1JERVI7Ci0gICAgZnByaW50ZihkZWZ3RmlsZSwgIlxuICAgUkVWSVNJT04gJWQuJWQiLCB2ZXJzMSwgdmVyczIpOwotCi0gICAgZGVmd1N0YXRlID0gREVGV19CRUdJTkVYVDsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndCZWdpbmV4dFN5bnRheChjb25zdCBjaGFyICAgKnRpdGxlLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAqc3RyaW5nKQotewotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFkZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19CRUdJTkVYVF9TVEFSVCAmJgotICAgICAgICBkZWZ3U3RhdGUgIT0gREVGV19CRUdJTkVYVCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGZwcmludGYoZGVmd0ZpbGUsICJcbiAgIC0gJXMgJXMiLCB0aXRsZSwgc3RyaW5nKTsKLQotICAgIGRlZndTdGF0ZSA9IERFRldfQkVHSU5FWFQ7Ci0gICAgZGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIERFRldfT0s7Ci19Ci0KLQotaW50Ci1kZWZ3RW5kQmVnaW5leHQoKQotewotICAgIGlmICghZGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBERUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFkZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGlmIChkZWZ3U3RhdGUgIT0gREVGV19CRUdJTkVYVF9TVEFSVCAmJgotICAgICAgICBkZWZ3U3RhdGUgIT0gREVGV19CRUdJTkVYVCkKLSAgICAgICAgcmV0dXJuIERFRldfQkFEX09SREVSOwotICAgIGZwcmludGYoZGVmd0ZpbGUsICI7XG5FTkRFWFRcblxuIik7Ci0KLSAgICBkZWZ3U3RhdGUgPSBERUZXX0JFR0lORVhUX0VORDsKLSAgICBkZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndFbmQoKQotewotICAgIGRlZndGdW5jID0gREVGV19FTkQ7ICAgLy8gQ3VycmVudCBmdW5jdGlvbiBvZiB3cml0ZXIKLSAgICBpZiAoIWRlZndGaWxlKQotICAgICAgICByZXR1cm4gMTsKLQotICAgIGlmIChkZWZ3U3RhdGUgPT0gREVGV19ST1cpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICI7XG5cbiIpOyAgLy8gYWRkIHRoZSA7IGFuZCBcbiBmb3IgdGhlIHByZXZpb3VzIHJvdy4KLQotICAgIGZwcmludGYoZGVmd0ZpbGUsICJFTkQgREVTSUdOXG5cbiIpOwotICAgIGRlZndMaW5lcysrOwotICAgIC8vZGVmd0ZpbGUgPSAwOwotICAgIGRlZndTdGF0ZSA9IERFRldfRE9ORTsKLSAgICByZXR1cm4gREVGV19PSzsKLX0KLQotCi1pbnQKLWRlZndDdXJyZW50TGluZU51bWJlcigpCi17Ci0gICAgcmV0dXJuIGRlZndMaW5lczsKLX0KLQotCi12b2lkCi1kZWZ3UHJpbnRFcnJvcihpbnQgc3RhdHVzKQotewotICAgIHN3aXRjaCAoc3RhdHVzKSB7Ci0gICAgY2FzZSBERUZXX09LOgotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiTm8gRXJyb3IuXG4iKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUZXX1VOSU5JVElBTElaRUQ6Ci0gICAgICAgIHByaW50ZigiTmVlZCB0byBjYWxsIGRlZndJbml0IGZpcnN0LlxuIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgREVGV19CQURfT1JERVI6Ci0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIlcyAtIEluY29ycmVjdCBvcmRlciBvZiBkYXRhLlxuIiwKLSAgICAgICAgICAgICAgICBkZWZ3U3RhdGVTdHJbZGVmd0Z1bmNdKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUZXX0JBRF9EQVRBOgotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiJXMgLSBJbnZhbGlkIGRhdGEuXG4iLAotICAgICAgICAgICAgICAgIGRlZndTdGF0ZVN0cltkZWZ3RnVuY10pOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIERFRldfQUxSRUFEWV9ERUZJTkVEOgotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiJXMgLSBTZWN0aW9uIGlzIGFsbG93ZWQgdG8gZGVmaW5lIG9ubHkgb25jZS5cbiIsCi0gICAgICAgICAgICAgICAgZGVmd1N0YXRlU3RyW2RlZndGdW5jXSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgREVGV19XUk9OR19WRVJTSU9OOgotICAgICAgICBmcHJpbnRmKGRlZndGaWxlLCAiJXMgLSBWZXJzaW9uIG51bWJlciBpcyBzZXQgYmVmb3JlIDUuNiwgYnV0IDUuNiBBUEkgaXMgdXNlZC5cbiIsCi0gICAgICAgICAgICAgICAgZGVmd1N0YXRlU3RyW2RlZndGdW5jXSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgREVGV19PQlNPTEVURToKLSAgICAgICAgZnByaW50ZihkZWZ3RmlsZSwgIiVzIC0gaXMgbm8gbG9uZ2VyIHZhbGlkIGluIDUuNi5cbiIsCi0gICAgICAgICAgICAgICAgZGVmd1N0YXRlU3RyW2RlZndPYnNvbGV0ZU51bV0pOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi0KLXZvaWQKLWRlZndBZGRDb21tZW50KGNvbnN0IGNoYXIgKmNvbW1lbnQpCi17Ci0gICAgaWYgKGNvbW1lbnQpCi0gICAgICAgIGZwcmludGYoZGVmd0ZpbGUsICIjICVzXG4iLCBjb21tZW50KTsKLSAgICByZXR1cm47Ci19Ci0KLQotdm9pZAotZGVmd0FkZEluZGVudCgpCi17Ci0gICAgZnByaW50ZihkZWZ3RmlsZSwgIiAgICIpOwotICAgIHJldHVybjsKLX0KLQotCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gICBRdWVzdGlvbnM6Ci0vLyAtIElzIG9ubHkgb25lIHJvdyBydWxlIGFsbG93ZWQKLS8vIC0gSXMgb25seSBvbmUgdHJhY2tzIHJ1bGUgYWxsb3dlZAotLy8gLSBJbiB0aGUgZGllIGFyZWEgaXMgYSB6ZXJvIGFyZWEgYWxsb3dlZD8gb3ZlcmxhcHM/Ci0vLyAtIFdoYXQgdHlwZSBvZiBjaGVja2luZyBpcyBuZWVkZWQgZm9yIHRoZSByb3dzIGFuZCB0cmFja3MgZG8gbG9vcD8KLS8vIC0gQ2FuIHlvdSBoYXZlIGEgZGVmYXVsdCBwcm9wIHdpdGggYSBudW1iZXIgQU5EIGEgcmFuZ2U/Ci0vLyAtIFdoYXQgaXMgdGhlIHBpbiBwcm9wZXJ0aWVzIHNlY3Rpb24gbWVudGlvbmVkIGluIHRoZSA1LjEgc3BlYz8KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZndXcml0ZXIuaHBwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZ3V3JpdGVyLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhZjQzYS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZndXcml0ZXIuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTc1MiArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2lmbmRlZiBERUZXX1dSSVRFUl9ICi0jZGVmaW5lIERFRldfV1JJVEVSX0gKLQotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJkZWZpS1JEZWZzLmhwcCIKLSNpbmNsdWRlICJkZWZpRGVmcy5ocHAiCi0jaW5jbHVkZSAiZGVmaVVzZXIuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0vKiBSZXR1cm4gY29kZXMgZm9yIHdyaXRpbmcgZnVuY3Rpb25zOiAqLwotI2RlZmluZSBERUZXX09LICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgREVGV19VTklOSVRJQUxJWkVEICAgICAxCi0jZGVmaW5lIERFRldfQkFEX09SREVSICAgICAgICAgMgotI2RlZmluZSBERUZXX0JBRF9EQVRBICAgICAgICAgIDMKLSNkZWZpbmUgREVGV19BTFJFQURZX0RFRklORUQgICA0Ci0jZGVmaW5lIERFRldfV1JPTkdfVkVSU0lPTiAgICAgNQotI2RlZmluZSBERUZXX09CU09MRVRFICAgICAgICAgIDYKLSNkZWZpbmUgREVGV19UT09fTUFOWV9TVE1TICAgICA3ICAvLyB0aGUgbnVtYmVyIGRlZmluZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWN0aW9uIGlzIHNtYWxsZXIgdGhhbiB0aGUgYWN0dWFsIG51bWJlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHN0YXRlbWVudHMgZGVmaW5lZCBpbiB0aGF0IHNlY3Rpb24gCi0KLS8qIG9yaWVudAotICAgMCA9IE4KLSAgIDEgPSBXCi0gICAyID0gUwotICAgMyA9IEUKLSAgIDQgPSBGTgotICAgNSA9IEZXCi0gICA2ID0gRlMKLSAgIDcgPSBGRQotKi8KLQotLyogVGhpcyByb3V0aW5lIHdpbGwgd3JpdGUgYSBuZXcgbGluZSAqLwotZXh0ZXJuIGludCBkZWZ3TmV3TGluZSgpOwotCi0vKiBUaGUgREVGIHdyaXRlciBpbml0aWFsaXphdGlvbi4gIE11c3QgYmUgY2FsbGVkIGZpcnN0LgotICogRWl0aGVyIHRoaXMgcm91dGluZSBvciBkZWZ3SW5pdENiayBzaG91bGQgYmUgY2FsbCBvbmx5LgotICogQ2FuJ3QgY2FsbCBib3RoIHJvdXRpbmVzIGluIG9uZSBwcm9ncmFtLgotICogVGhpcyByb3V0aW5lIGlzIGZvciB1c2VyIHdobyBkb2VzIG5vdCB3YW50IHRvIHVzZSB0aGUgY2FsbGJhY2sgbWFjaGFuaXNtLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICovCi1leHRlcm4gaW50IGRlZndJbml0ICggRklMRSogZiwgaW50IHZlcnMxLCBpbnQgdmVyc2lvbjIsCi0JICAgICAgY29uc3QgY2hhciogY2FzZVNlbnNpdGl2ZSwgIC8qIE5BTUVTQ0FTRVNFTlNJVElWRSAqLwotCSAgICAgIGNvbnN0IGNoYXIqIGRpdmlkZXJDaGFyLCAgICAvKiBESVZJREVSQ0hBUiAqLwotCSAgICAgIGNvbnN0IGNoYXIqIGJ1c0JpdENoYXJzLCAgICAvKiBCVVNCSVRDSEFSUyAqLwotCSAgICAgIGNvbnN0IGNoYXIqIGRlc2lnbk5hbWUsICAgICAvKiBERVNJR04gKi8KLQkgICAgICBjb25zdCBjaGFyKiB0ZWNobm9sb2d5LCAgICAgLyogb3B0aW9uYWwoTlVMTCkgLSBURUNITk9MT0dZICovCi0JICAgICAgY29uc3QgY2hhciogYXJyYXksICAgICAgICAgIC8qIG9wdGlvbmFsKE5VTEwpIC0gQVJSQVlOQU1FICovCi0JICAgICAgY29uc3QgY2hhciogZmxvb3JwbGFuLCAgICAgIC8qIG9wdGlvbmFsKE5VTEwpIC0gRkxPT1JQTEFOICovCi0JICAgICAgZG91YmxlIHVuaXRzICk7ICAgICAgICAgICAgIC8qIG9wdGlvbmFsICAoc2V0IHRvIC0xIHRvIGlnbm9yZSkgKi8KLQotLyogVGhlIERFRiB3cml0ZXIgaW5pdGlhbGl6YXRpb24uICBNdXN0IGJlIGNhbGxlZCBmaXJzdC4KLSAqIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgZGVmd0luaXQgc2hvdWxkIGJlIGNhbGwgb25seS4KLSAqIENhbid0IGNhbGwgYm90aCByb3V0aW5lcyBpbiBvbmUgcHJvZ3JhbS4KLSAqIFRoaXMgcm91dGluZSBpcyBmb3IgdXNlciB3aG8gY2hvb3NlIHRvIHVzZSB0aGUgY2FsbGJhY2sgbWFjaGFuaXNtLgotICogSWYgdXNlciB1c2VzIHRoZSBjYWxsYmFjayBmb3IgdGhlIHdyaXRlciwgdGhleSBuZWVkIHRvIHByb3ZpZGUKLSAqIGNhbGxiYWNrcyBmb3IgVmVyc2lvbiwgTmFtZXNDYXNlU2Vuc2l0aXZlLCBCdXNCaXRDaGFycyBhbmQgRGl2aWRlckNoYXIuCi0gKiBUaGVzZSBzZWN0aW9ucyBhcmUgcmVxdWlyZWQgYnkgdGhlIGRlZi4gIElmIGFueSBvZiB0aGVzZSBjYWxsYmFja3MKLSAqIGFyZSBtaXNzaW5nLCBkZWZhdWx0cyB3aWxsIGJlIHVzZWQuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gKi8KLWV4dGVybiBpbnQgZGVmd0luaXRDYmsgKEZJTEUqIGYpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGRlZndJbml0LgotICogVGhpcyByb3V0aW5lIGlzIHJlcXVpcmVkLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gKi8KLWV4dGVybiBpbnQgZGVmd1ZlcnNpb24gKGludCB2ZXJzMSwgaW50IHZlcnMyKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBkZWZ3SW5pdC4KLSAqIFRoaXMgcm91dGluZSBpcyByZXF1aXJlZC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICovCi1leHRlcm4gaW50IGRlZndDYXNlU2Vuc2l0aXZlICggY29uc3QgY2hhciogY2FzZVNlbnNpdGl2ZSApOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGRlZndJbml0LgotICogVGhpcyByb3V0aW5lIGlzIHJlcXVpcmVkLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gKi8KLWV4dGVybiBpbnQgZGVmd0J1c0JpdENoYXJzICggY29uc3QgY2hhciogYnVzQml0Q2hhcnMgKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBkZWZ3SW5pdC4KLSAqIFRoaXMgcm91dGluZSBpcyByZXF1aXJlZC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICovCi1leHRlcm4gaW50IGRlZndEaXZpZGVyQ2hhciAoIGNvbnN0IGNoYXIqIGRpdmlkZXJDaGFyICk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgZGVmd0luaXQuCi0gKiBUaGlzIHJvdXRpbmUgaXMgcmVxdWlyZWQuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAqLwotZXh0ZXJuIGludCBkZWZ3RGVzaWduTmFtZSAoIGNvbnN0IGNoYXIqIG5hbWUgKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBkZWZ3SW5pdC4KLSAqIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICovCi1leHRlcm4gaW50IGRlZndUZWNobm9sb2d5ICggY29uc3QgY2hhciogdGVjaG5vbG9neSApOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGRlZndJbml0LgotICogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gKi8KLWV4dGVybiBpbnQgZGVmd0FycmF5ICggY29uc3QgY2hhciogYXJyYXkgKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBkZWZ3SW5pdC4KLSAqIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICovCi1leHRlcm4gaW50IGRlZndGbG9vcnBsYW4gKCBjb25zdCBjaGFyKiBmbG9vcnBsYW4gKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBkZWZ3SW5pdC4KLSAqIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICovCi1leHRlcm4gaW50IGRlZndVbml0cyAoIGludCB1bml0cyApOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGRlZndJbml0LgotICogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIDAgdG8gbWFueSB0aW1lcy4gKi8KLWV4dGVybiBpbnQgZGVmd0hpc3RvcnkgKCBjb25zdCBjaGFyKiBzdHJpbmcgKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBoaXN0b3J5IHJvdXRpbmVzIChpZiBhbnkpLgotICogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gKi8KLWV4dGVybiBpbnQgZGVmd1N0YXJ0UHJvcERlZiAoIHZvaWQgKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGRlZndTdGFydFByb3BEZWYuCi0gKiBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KLSAqIEl0IGFkZHMgaW50ZWdlciBwcm9wZXJ0eSBkZWZpbml0aW9uIHRvIHRoZSBzdGF0ZW1lbnQuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bGwuCi0gKiBUaGUgb2JqVHlwZSBjYW4gYmUgTElCUkFSWSBvciBWSUEgb3IgTUFDUk8gb3IgUElOLiAqLwotZXh0ZXJuIGludCBkZWZ3SW50UHJvcERlZigKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG9ialR5cGUsICAgLy8gTElCUkFSWSB8IExBWUVSIHwgVklBIHwgVklBUlVMRSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PTkRFRkFVTFRSVUxFIHwgTUFDUk8gfCBQSU4gCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwcm9wTmFtZSwKLSAgICAgICAgICAgICAgIGRvdWJsZSBsZWZ0UmFuZ2UsICAgICAgLyogb3B0aW9uYWwoMCkgLSBSQU5HRSAqLwotICAgICAgICAgICAgICAgZG91YmxlIHJpZ2h0UmFuZ2UsICAgICAvKiBvcHRpb25hbCgwKSAqLwotICAgICAgICAgICAgICAgaW50ICAgIHByb3BWYWx1ZSk7ICAgICAvKiBvcHRpb25hbChOVUxMKSAqLwotIAotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGRlZndTdGFydFByb3BEZWYuCi0gKiBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KLSAqIEl0IGFkZHMgcmVhbCBwcm9wZXJ0eSBkZWZpbml0aW9uIHRvIHRoZSBzdGF0ZW1lbnQuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bGwuCi0gKiBUaGUgb2JqVHlwZSBjYW4gYmUgTElCUkFSWSBvciBWSUEgb3IgTUFDUk8gb3IgUElOLiAqLwotZXh0ZXJuIGludCBkZWZ3UmVhbFByb3BEZWYoCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyKiBvYmpUeXBlLCAgIC8vIExJQlJBUlkgfCBMQVlFUiB8IFZJQSB8IFZJQVJVTEUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOT05ERUZBVUxUUlVMRSB8IE1BQ1JPIHwgUElOIAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogcHJvcE5hbWUsCi0gICAgICAgICAgICAgICBkb3VibGUgbGVmdFJhbmdlLCAgICAgIC8qIG9wdGlvbmFsKDApIC0gUkFOR0UgKi8KLSAgICAgICAgICAgICAgIGRvdWJsZSByaWdodFJhbmdlLCAgICAgLyogb3B0aW9uYWwoMCkgKi8KLSAgICAgICAgICAgICAgIGRvdWJsZSBwcm9wVmFsdWUpOyAgICAgLyogb3B0aW9uYWwoTlVMTCkgKi8KLSAKLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBkZWZ3U3RhcnRQcm9wRGVmLgotICogVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCi0gKiBJdCBhZGRzIHN0cmluZyBwcm9wZXJ0eSBkZWZpbml0aW9uIHRvIHRoZSBzdGF0ZW1lbnQuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bGwuCi0gKiBUaGUgb2JqVHlwZSBjYW4gYmUgTElCUkFSWSBvciBWSUEgb3IgTUFDUk8gb3IgUElOLiAqLwotZXh0ZXJuIGludCBkZWZ3U3RyaW5nUHJvcERlZigKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG9ialR5cGUsICAgIC8vIExJQlJBUlkgfCBMQVlFUiB8IFZJQSB8IFZJQVJVTEUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9OREVGQVVMVFJVTEUgfCBNQUNSTyB8IFBJTgotICAgICAgICAgICAgICAgY29uc3QgY2hhciogcHJvcE5hbWUsCi0gICAgICAgICAgICAgICBkb3VibGUgbGVmdFJhbmdlLCAgICAgICAvKiBvcHRpb25hbCgwKSAtIFJBTkdFICovCi0gICAgICAgICAgICAgICBkb3VibGUgcmlnaHRSYW5nZSwgICAgICAvKiBvcHRpb25hbCgwKSAqLwotICAgICAgICAgICAgICAgY29uc3QgY2hhciogcHJvcFZhbHVlKTsgLyogb3B0aW9uYWwoTlVMTCkgKi8KLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGFsbCB0aGUgcHJvcGVydGllcyBoYXZlIGJlZW4KLSAqIGFkZGVkIHRvIHRoZSBmaWxlLgotICogSWYgeW91IGNhbGxlZCBkZWZ3UHJvcGVydHlEZWZpbml0aW9ucyB0aGVuIHRoaXMgcm91dGluZSBpcyBOT1Qgb3B0aW9uYWwuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAqLwotZXh0ZXJuIGludCBkZWZ3RW5kUHJvcERlZiAoIHZvaWQgKTsKLQotLyogVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgYWZ0ZXIgZGVmd1JvdywgZGVmd1JlZ2lvbiwgZGVmd0NvbXBvbmVudCwKLSAqIGRlZndQaW4sIGRlZndTcGVjaWFsTmV0LCBkZWZ3TmV0LCBhbmQgZGVmd0dyb3VwCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwsIGl0IGFkZHMgc3RyaW5nIHByb3BlcnR5IHRvIHRoZSBzdGF0ZW1lbnQuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIDAgdG8gbWFueSB0aW1lcyAqLwotZXh0ZXJuIGludCBkZWZ3U3RyaW5nUHJvcGVydHkoY29uc3QgY2hhciogcHJvcE5hbWUsIGNvbnN0IGNoYXIqIHByb3BWYWx1ZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIGFmdGVyIGRlZndSb3csIGRlZndSZWdpb24sIGRlZndDb21wb25lbnQsCi0gKiBkZWZ3UGluLCBkZWZ3U3BlY2lhbE5ldCwgZGVmd05ldCwgYW5kIGRlZndHcm91cAotICogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLCBpdCBhZGRzIHJlYWwgcHJvcGVydHkgdG8gdGhlIHN0YXRlbWVudC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgMCB0byBtYW55IHRpbWVzICovCi1leHRlcm4gaW50IGRlZndSZWFsUHJvcGVydHkoY29uc3QgY2hhciogcHJvcE5hbWUsIGRvdWJsZSBwcm9wVmFsdWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBhZnRlciBkZWZ3Um93LCBkZWZ3UmVnaW9uLCBkZWZ3Q29tcG9uZW50LAotICogZGVmd1BpbiwgZGVmd1NwZWNpYWxOZXQsIGRlZndOZXQsIGFuZCBkZWZ3R3JvdXAKLSAqIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCwgaXQgYWRkcyBpbnQgcHJvcGVydHkgdG8gdGhlIHN0YXRlbWVudC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgMCB0byBtYW55IHRpbWVzICovCi1leHRlcm4gaW50IGRlZndJbnRQcm9wZXJ0eShjb25zdCBjaGFyKiBwcm9wTmFtZSwgaW50IHByb3BWYWx1ZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbnMgKGlmIGFueSkuCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAqLwotZXh0ZXJuIGludCBkZWZ3RGllQXJlYSAoIGludCB4bCwgICAgICAgICAgICAvKiBwb2ludDEgLSB4ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlsLCAgICAgICAgICAgIC8qIHBvaW50MSAtIHkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeGgsICAgICAgICAgICAgLyogcG9pbnQyIC0geCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5aCApOyAgICAgICAgICAvKiBwb2ludDIgLSB5ICovCi0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbnMgKGlmIGFueSkuCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0gKiBUaGlzIHJvdXRpbmUgaXMgdGhlIHNhbWUgYXMgZGVmd0RpZUFyZWEsIGJ1dCBhY2NlcHQgbW9yZSB0aGFuIDIgcG9pbnRzCi0gKiBUaGlzIGlzIGEgNS42IHN5bnRheAotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gKi8KLWV4dGVybiBpbnQgZGVmd0RpZUFyZWFMaXN0ICggaW50IG51bV9wb2ludHMsIC8qIG51bWJlciBvZiBwb2ludHMgb24gbGlzdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHhsLCAgICAgICAgLyogYWxsIHRoZSB4IHBvaW50cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHloKTsgICAgICAgLyogYWxsIHRoZSB5IHBvaW50cyAqLwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIERpZSBBcmVhIChpZiBhbnkpLgotICogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGUgaW50ZWdlciAib3JpZW50IiBhbmQgb3BlcmF0aW9uIG9mIHRoZSBkbyBpcyBleHBsYWluZWQgaW4KLSAqIHRoZSBkb2N1bWVudGF0aW9uLgotICogSW4gNS42LCB0aGUgRE8gc3ludGF4IGlzIG9wdGlvbmFsIGFuZCB0aGUgU1RFUCBzeW50YXggaXMgb3B0aW9uYWwgaW4gRE8gKi8KLWV4dGVybiBpbnQgZGVmd1JvdyAoIGNvbnN0IGNoYXIqIHJvd05hbWUsIGNvbnN0IGNoYXIqIHJvd1R5cGUsCi0JCSAgICAgaW50IHhfb3JpZywgaW50IHlfb3JpZywgaW50IG9yaWVudCwKLQkJICAgICBpbnQgZG9fY291bnQsICAgICAgICAgICAgLyogb3B0aW9uYWwgKDApICovCi0gICAgICAgICAgICAgICAgICAgICBpbnQgZG9faW5jcmVtZW50LCAgICAgICAgLyogb3B0aW9uYWwgKDApICovCi0gICAgICAgICAgICAgICAgICAgICBpbnQgeHN0ZXAsICAgICAgICAgICAgICAgLyogb3B0aW9uYWwgKDApICovCi0gICAgICAgICAgICAgICAgICAgICBpbnQgeXN0ZXApOyAgICAgICAgICAgICAgLyogb3B0aW9uYWwgKDApICovCi0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgRGllIEFyZWEgKGlmIGFueSkuCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoaXMgcm91dGluZSBpcyB0aGUgc2FtZSBhcyBkZWZ3Um93LCBleGNwZXQgb3JpZW50IGlzIGEgY2hhciogKi8KLWV4dGVybiBpbnQgZGVmd1Jvd1N0ciAoIGNvbnN0IGNoYXIqIHJvd05hbWUsIGNvbnN0IGNoYXIqIHJvd1R5cGUsCi0JCSAgICAgICAgaW50IHhfb3JpZywgaW50IHlfb3JpZywgY29uc3QgY2hhciogb3JpZW50LAotCQkgICAgICAgIGludCBkb19jb3VudCwgICAgICAgICAvKiBvcHRpb25hbCAoMCkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBkb19pbmNyZW1lbnQsICAgICAvKiBvcHRpb25hbCAoMCkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB4c3RlcCwgICAgICAgICAgICAvKiBvcHRpb25hbCAoMCkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB5c3RlcCk7ICAgICAgICAgICAvKiBvcHRpb25hbCAoMCkgKi8KLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBkZWZ3Um93IChpZiBhbnkpLgotICogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGUgb3BlcmF0aW9uIG9mIHRoZSBkbyBpcyBleHBsYWluZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uICovCi1leHRlcm4gaW50IGRlZndUcmFja3MgKCBjb25zdCBjaGFyKiBtYXN0ZXIsICAgLyogWCB8IFkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBkb1N0YXJ0LCAgICAgICAgICAvKiBzdGFydCAqLwotCSAgICAgICAgICAgICAgICBpbnQgZG9Db3VudCwgICAgICAgICAgLyogbnVtVHJhY2tzICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZG9TdGVwLCAgICAgICAgICAgLyogc3BhY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1MYXllcnMsICAgICAgICAvKiBudW1iZXIgb2YgbGF5ZXJzICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiogbGF5ZXJzLCAgLyogbGlzdCBvZiBsYXllcnMgKi8KLQkJCWludCBtYXNrID0gMCwgICAgICAgICAvKiBvcHRpb25hbCAqLwotCQkJaW50IHNhbWVNYXNrID0gMCk7ICAgIC8qIG9wdGlvbmFsICovCi0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgZGVmd1RyYWNrcyAoaWYgYW55KS4KLSAqIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhlIG9wZXJhdGlvbiBvZiB0aGUgZG8gaXMgZXhwbGFpbmVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiAqLwotZXh0ZXJuIGludCBkZWZ3R2NlbGxHcmlkICggY29uc3QgY2hhciogbWFzdGVyLCAvKiBYIHwgWSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRvU3RhcnQsICAgICAgICAvKiBzdGFydCAqLwotCSAgICAgICAgICAgICAgICAgICBpbnQgZG9Db3VudCwgICAgICAgIC8qIG51bUNvbHVtbnMgfCBudW1Sb3dzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZG9TdGVwKTsgICAgICAgIC8qIHNwYWNlICovCi0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgZGVmd1RyYWNrcyAoaWYgYW55KS4KLSAqIFRoaXMgc2VjdGlvbiBvZiByb3V0aW5lcyBpcyBvcHRpb25hbC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhlIHJvdXRpbmUgc3RhcnRzIHRoZSBkZWZhdWx0IGNhcGFjaXRhbmNlIHNlY3Rpb24uICAgQWxsIG9mIHRoZQotICogY2FwYWNpdGFuY2VzIG11c3QgZm9sbG93LgotICogVGhlIGNvdW50IGlzIHRoZSBudW1iZXIgb2YgZGVmd0RlZmF1bHRDYXAgY2FsbHMgdG8gZm9sbG93LgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0gKiBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuICovCi1leHRlcm4gaW50IGRlZndTdGFydERlZmF1bHRDYXAgKCBpbnQgY291bnQgKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBvbmNlIGZvciBlYWNoIGRlZmF1bHQgY2FwLiAgVGhlIGNhbGxzIG11c3QKLSAqIGJlIHByZWNlZWRlZCBieSBhIGNhbGwgdG8gZGVmd1N0YXJ0RGVmYXVsdENhcCBhbmQgbXVzdCBiZQotICogdGVybWluYXRlZCBieSBhIGNhbGwgdG8gZGVmd0VuZERlZmF1bHRDYXAuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gKi8KLWV4dGVybiBpbnQgZGVmd0RlZmF1bHRDYXAgKCBpbnQgcGlucywgICAgICAgICAgIC8qIE1JTlBJTlMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgY2FwKTsgICAgICAgIC8qIFdJUkVDQVAgKi8KLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBkZWZ3RGVmYXVsdENhcCBjYWxscyAoaWYgYW55KS4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogSWYgdGhlIGNvdW50IGluIFN0YXJ0RGVmYXVsdENhcCBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZgotICogY2FsbHMgdG8gRGVmYXVsdENhcCB0aGVuIERFRldfQkFEX0RBVEEgd2lsbCByZXR1cm4gcmV0dXJuZWQuCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4KLSAqIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gKi8KLWV4dGVybiBpbnQgZGVmd0VuZERlZmF1bHRDYXAgKCB2b2lkICk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgZGVmd0RlZmF1bHRDYXAgY2FsbHMgKGlmIGFueSkuCi0gKiBUaGUgb3BlcmF0aW9uIG9mIHRoZSBkbyBpcyBleHBsYWluZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbWFueSB0aW1lcy4gKi8KLWV4dGVybiBpbnQgZGVmd0NhblBsYWNlKGNvbnN0IGNoYXIqIG1hc3RlciwgICAgIC8qIHNpdGVuYW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgeE9yaWcsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgeU9yaWcsCi0JICAgICAgICAgICAgICAgIGludCBvcmllbnQsICAgICAgICAgICAgIC8qIDAgdG8gNyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRvQ250LCAgICAgICAgICAgICAgLyogbnVtWCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRvSW5jLCAgICAgICAgICAgICAgLyogbnVtWSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhTdGVwLCAgICAgICAgICAgICAgLyogc3BhY2VYICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgeVN0ZXApOyAgICAgICAgICAgICAvKiBzcGFjZVkgKi8KLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBkZWZ3RGVmYXVsdENhcCBjYWxscyAoaWYgYW55KS4KLSAqIFRoZSBvcGVyYXRpb24gb2YgdGhlIGRvIGlzIGV4cGxhaW5lZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KLSAqIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtYW55IHRpbWVzLgotICogVGhpcyByb3V0aW5lIGlzIHRoZSBzYW1lIGFzIGRlZndDYW5QbGFjZSwgZXhjZXB0IG9yaWVudCBpcyBhIGNoYXIqICovCi1leHRlcm4gaW50IGRlZndDYW5QbGFjZVN0cihjb25zdCBjaGFyKiBtYXN0ZXIsICAgICAvKiBzaXRlbmFtZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhPcmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlPcmlnLAotCSAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBvcmllbnQsICAgICAvKiAwIHRvIDcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkb0NudCwgICAgICAgICAgICAgIC8qIG51bVggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkb0luYywgICAgICAgICAgICAgIC8qIG51bVkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4U3RlcCwgICAgICAgICAgICAgIC8qIHNwYWNlWCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlTdGVwKTsgICAgICAgICAgICAgLyogc3BhY2VZICovCi0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgZGVmd0NhblBsYWNlIGNhbGxzIChpZiBhbnkpLgotICogVGhlIG9wZXJhdGlvbiBvZiB0aGUgZG8gaXMgZXhwbGFpbmVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgotICogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG1hbnkgdGltZXMuICovCi1leHRlcm4gaW50IGRlZndDYW5ub3RPY2N1cHkoY29uc3QgY2hhciogbWFzdGVyLCAgLyogc2l0ZW5hbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeE9yaWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlPcmlnLAotCSAgICAgICAgICAgICAgICAgICAgaW50IG9yaWVudCwgICAgICAgICAgLyogMCB0byA3ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRvQ250LCAgICAgICAgICAgLyogbnVtWCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkb0luYywgICAgICAgICAgIC8qIG51bVkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeFN0ZXAsICAgICAgICAgICAvKiBzcGFjZVggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeVN0ZXApOyAgICAgICAgICAvKiBzcGFjZVkgKi8KLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBkZWZ3Q2FuUGxhY2UgY2FsbHMgKGlmIGFueSkuCi0gKiBUaGUgb3BlcmF0aW9uIG9mIHRoZSBkbyBpcyBleHBsYWluZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbWFueSB0aW1lcy4KLSAqIFRoaXMgcm91dGluZSBpcyB0aGUgc2FtZSBhcyBkZWZ3Q2Fubm90T2NjdXB5LCBleGNlcHQgb3JpZW50IGlzIGEgY2hhciogKi8KLWV4dGVybiBpbnQgZGVmd0Nhbm5vdE9jY3VweVN0cihjb25zdCBjaGFyKiBtYXN0ZXIsICAvKiBzaXRlbmFtZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4T3JpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeU9yaWcsCi0JICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBvcmllbnQsICAvKiAwIHRvIDcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZG9DbnQsICAgICAgICAgICAvKiBudW1YICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRvSW5jLCAgICAgICAgICAgLyogbnVtWSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4U3RlcCwgICAgICAgICAgIC8qIHNwYWNlWCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5U3RlcCk7ICAgICAgICAgIC8qIHNwYWNlWSAqLwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgZGVmd0Nhbm5vdE9jY3VweSAoaWYgYW55KS4KLSAqIFRoaXMgc2VjdGlvbiBvZiByb3V0aW5lcyBpcyBvcHRpb25hbC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhlIHJvdXRpbmUgc3RhcnRzIHRoZSB2aWEgc2VjdGlvbi4gICBBbGwgb2YgdGhlIHZpYXMgbXVzdCBmb2xsb3cuCi0gKiBUaGUgY291bnQgaXMgdGhlIG51bWJlciBvZiBkZWZ3VmlhIGNhbGxzIHRvIGZvbGxvdy4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAqLwotZXh0ZXJuIGludCBkZWZ3U3RhcnRWaWFzKCBpbnQgY291bnQgKTsKLQotLyogVGhlc2Ugcm91dGluZXMgZW50ZXIgZWFjaCB2aWEgaW50byB0aGUgZmlsZS4KLSAqIFRoZXNlIHJvdXRpbmVzIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBkZWZ3U3RhcnRWaWFzIGNhbGwuCi0gKiBkZWZ3VmlhTmFtZSBzaG91bGQgYmUgY2FsbGVkIGZpcnN0LCBmb2xsb3cgZWl0aGVyIGJ5IGRlZndWaWFQYXR0ZXJuIG9yCi0gKiBkZWZ3VmlhTGF5ZXIuICBBdCB0aGUgZW5kIG9mIGVhY2ggdmlhLCBkZWZ3T25lVmlhRW5kIHNob3VsZCBiZSBjYWxsZWQKLSAqIFRoZXNlIHJvdXRpbmVzIGFyZSBmb3IgWy0gdmlhTmFtZSBbKyBQQVRURVJOTkFNRSBwYXR0ZXJuTmFtZSArIFJFQ1QgbGF5ZXJOYW1lCi0gKiBwdCBwdF0uLi47XS4uLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGUgcm91dGluZXMgY2FuIGJlIGNhbGxlZCBtYW55IHRpbWVzLiAqLwotZXh0ZXJuIGludCBkZWZ3VmlhTmFtZShjb25zdCBjaGFyKiBuYW1lKTsKLQotZXh0ZXJuIGludCBkZWZ3VmlhUGF0dGVybihjb25zdCBjaGFyKiBwYXR0ZXJuTmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAqLwotLyogbWFzayBpcyA1Ljggc3ludGF4ICovCi1leHRlcm4gaW50IGRlZndWaWFSZWN0KGNvbnN0IGNoYXIqIGxheWVyTmFtZSwKLSAgICAgICAgICAgICAgICAgICBpbnQgeGwsICAgICAgICAgLyogeGwgZnJvbSB0aGUgUkVDVCAqLwotICAgICAgICAgICAgICAgICAgIGludCB5bCwgICAgICAgICAvKiB5bCBmcm9tIHRoZSBSRUNUICovCi0gICAgICAgICAgICAgICAgICAgaW50IHhoLCAgICAgICAgIC8qIHhoIGZyb20gdGhlIFJFQ1QgKi8KLSAgICAgICAgICAgICAgICAgICBpbnQgeWgsICAgICAgICAgLyogeWggZnJvbSB0aGUgUkVDVCAqLwotCQkgICBpbnQgbWFzayA9IDApOyAgLyogb3B0aW9uYWwgKi8KLQotLyogVGhpcyBpcyBhIDUuNiBzeW50YXgKLSAqIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAqLwotLyogbWFzayBpcyA1Ljggc3ludGF4ICovCi1leHRlcm4gaW50IGRlZndWaWFQb2x5Z29uKGNvbnN0IGNoYXIqIGxheWVyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9wb2x5cywgCi0JCQkgIGRvdWJsZSogeGwsIAotCQkJICBkb3VibGUqIHlsLCAKLQkJCSAgaW50IG1hc2sgPSAwKTsKLQotLyogVGhlc2Ugcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBkZWZ3VmlhTmFtZS4KLSAqIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgZGVmd1ZpYVBhdHRlcm4gY2FuIGJlIGNhbGxlZCBhZnRlciBlYWNoCi0gKiBkZWZ3VmlhTmFtZSBpcyBjYWxsZWQuCi0gKiBUaGlzIGlzIGEgNS42IHN5bnRheAotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwKLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBkZWZ3VmlhTmFtZSBjYWxsZWQuICovCi1leHRlcm4gaW50IGRlZndWaWFWaWFydWxlKGNvbnN0IGNoYXIqIHZpYVJ1bGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeEN1dFNpemUsIGRvdWJsZSB5Q3V0U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYm90TWV0YWxMYXllciwgY29uc3QgY2hhciogY3V0TGF5ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRvcE1ldGFsTGF5ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB4Q3V0U3BhY2luZywgZG91YmxlIHlDdXRTcGFjaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeEJvdEVuYywgZG91YmxlIHlCb3RFbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB4VG9wRW5jLCBkb3VibGUgeVRvcEVuYyk7Ci0KLS8qIFRoaXMgcm91dGluZSBjYW4gY2FsbCBvbmx5IGFmdGVyIGRlZndWaWFWaWFydWxlLgotICogSXQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuCi0gKiBUaGlzIGlzIGEgNS42IHN5bnRheC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAqLwotZXh0ZXJuIGludCBkZWZ3VmlhVmlhcnVsZVJvd0NvbChpbnQgbnVtQ3V0Um93cywgaW50IG51bUN1dENvbHMpOwotCi0vKiBUaGlzIHJvdXRpbmUgY2FuIGNhbGwgb25seSBhZnRlciBkZWZ3VmlhVmlhcnVsZS4KLSAqIEl0IGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLgotICogVGhpcyBpcyBhIDUuNiBzeW50YXguCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gKi8KLWV4dGVybiBpbnQgZGVmd1ZpYVZpYXJ1bGVPcmlnaW4oaW50IHhPZmZzZXQsIGludCB5T2Zmc2V0KTsKLQotLyogVGhpcyByb3V0aW5lIGNhbiBjYWxsIG9ubHkgYWZ0ZXIgZGVmd1ZpYVZpYXJ1bGUuCi0gKiBJdCBjYW4gb25seSBiZSBjYWxsZWQgb25jZS4KLSAqIFRoaXMgaXMgYSA1LjYgc3ludGF4LgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICovCi1leHRlcm4gaW50IGRlZndWaWFWaWFydWxlT2Zmc2V0KGludCB4Qm90T2Zmc2V0LCBpbnQgeUJvdE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhUb3BPZmZzZXQsIGludCB5VG9wT2Zmc2V0KTsKLQotLyogVGhpcyByb3V0aW5lIGNhbiBjYWxsIG9ubHkgYWZ0ZXIgZGVmd1ZpYVZpYXJ1bGUuCi0gKiBJdCBjYW4gb25seSBiZSBjYWxsZWQgb25jZS4KLSAqIFRoaXMgaXMgYSA1LjYgc3ludGF4LgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICovCi1leHRlcm4gaW50IGRlZndWaWFWaWFydWxlUGF0dGVybihjb25zdCBjaGFyKiBjdXRQYXR0ZXJuKTsKLQotZXh0ZXJuIGludCBkZWZ3T25lVmlhRW5kKCk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgZGVmd1ZpYSBjYWxscy4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogSWYgdGhlIGNvdW50IGluIFN0YXJ0VmlhcyBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZgotICogY2FsbHMgdG8gVmlhIG9yIFZpYVBhdHRlcm4gdGhlbiBERUZXX0JBRF9EQVRBIHdpbGwgcmV0dXJuIHJldHVybmVkLgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICovCi1leHRlcm4gaW50IGRlZndFbmRWaWFzKCB2b2lkICk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB2aWEgc2VjdGlvbiAoaWYgYW55KS4KLSAqIFRoaXMgc2VjdGlvbiBvZiByb3V0aW5lcyBpcyBvcHRpb25hbC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhlIHJvdXRpbmUgc3RhcnRzIHRoZSByZWdpb24gc2VjdGlvbi4gICBBbGwgb2YgdGhlIHJlZ2lvbnMgbXVzdCBmb2xsb3cuCi0gKiBUaGUgY291bnQgaXMgdGhlIG51bWJlciBvZiBkZWZ3UmVnaW9uIGNhbGxzIHRvIGZvbGxvdy4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAqLwotZXh0ZXJuIGludCBkZWZ3U3RhcnRSZWdpb25zKCBpbnQgY291bnQgKTsKLQotLyogVGhpcyByb3V0aW5lIGVudGVyIGVhY2ggcmVnaW9uIGludG8gdGhlIGZpbGUuCi0gKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGRlZndTdGFydFJlZ2lvbnMgY2FsbC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtYW55IHRpbWVzLiAqLwotZXh0ZXJuIGludCBkZWZ3UmVnaW9uTmFtZShjb25zdCBjaGFyKiBuYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGVudGVyIHRoZSByZWdpb24gcG9pbnQgdG8gdGhlIHJlZ2lvbiBuYW1lLgotICogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBkZWZ3UmVnaW9uTmFtZSBjYWxsLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG1hbnkgdGltZXMuICovCi1leHRlcm4gaW50IGRlZndSZWdpb25Qb2ludHMoaW50IHhsLCBpbnQgeWwsIGludCB4aCwgaW50IHloKTsKLQotLyogVGhpcyByb3V0aW5lIGVudGVyIHRoZSByZWdpb24gdHlwZSwgRkVOQ0UgfCBHVUlERS4KLSAqIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgZGVmd1JlZ2lvbk5hbWUgY2FsbC4KLSAqIFRoaXMgaXMgYSA1LjQuMSBzeW50YXguCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAqLwotZXh0ZXJuIGludCBkZWZ3UmVnaW9uVHlwZShjb25zdCBjaGFyKiB0eXBlKTsgIC8qIEZFTkNFIHwgR1VJREUgKi8KLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBkZWZ3UmVnaW9uIGNhbGxzLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBJZiB0aGUgY291bnQgaW4gU3RhcnRSZWdpb25zIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mCi0gKiBjYWxscyB0byBSZWdpb24gb3IgUmVnaW9uUGF0dGVybiB0aGVuIERFRldfQkFEX0RBVEEgd2lsbCByZXR1cm4gcmV0dXJuZWQuCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gKi8KLWV4dGVybiBpbnQgZGVmd0VuZFJlZ2lvbnMoIHZvaWQgKTsKLQotLyogVGhpcyBpcyBhIDUuOCBzeW50YXguCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAqLwotZXh0ZXJuIGludCBkZWZ3Q29tcG9uZW50TWFza1NoaWZ0TGF5ZXJzKGNvbnN0IGNoYXIqKiBsYXllck5hbWVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIG51bUxheWVyTmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgcmVnaW9ucyBzZWN0aW9uIChpZiBhbnkpLgotICogVGhpcyBzZWN0aW9uIG9mIHJvdXRpbmVzIGlzIE5PVCBvcHRpb25hbC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhlIHJvdXRpbmUgc3RhcnRzIHRoZSBjb21wb25lbnRzIHNlY3Rpb24uIEFsbCBvZiB0aGUgY29tcG9uZW50cwotICogbXVzdCBmb2xsb3cuCi0gKiBUaGUgY291bnQgaXMgdGhlIG51bWJlciBvZiBkZWZ3Q29tcG9uZW50IGNhbGxzIHRvIGZvbGxvdy4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAqLwotZXh0ZXJuIGludCBkZWZ3U3RhcnRDb21wb25lbnRzKCBpbnQgY291bnQgKTsKLQotLyogVGhpcyByb3V0aW5lIGVudGVyIGVhY2ggY29tcG9uZW50IGludG8gdGhlIGZpbGUuCi0gKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGRlZndTdGFydENvbXBvbmVudHMgY2FsbC4KLSAqIFRoZSBvcHRpb25hbCBmaWVsZHMgd2lsbCBiZSBpZ25vcmVkIGlmIHRoZXkgYXJlIHNldCB0byB6ZXJvCi0gKiAoZXhjZXB0IGZvciB3ZWlnaHQgd2hpY2ggbXVzdCBiZSBzZXQgdG8gLTEuMCkuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbWFueSB0aW1lcy4gKi8KLWV4dGVybiBpbnQgZGVmd0NvbXBvbmVudChjb25zdCBjaGFyKiBpbnN0YW5jZSwgIC8qIGNvbXBOYW1lICovCi0gICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1hc3RlciwgICAgICAgICAgIC8qIG1vZGVsTmFtZSAqLwotICAgICAgICAgICAgICBpbnQgICBudW1OZXROYW1lLCAgICAgICAgICAgICAvLyBvcHRpb25hbCgwKSAtICMgbmV0TmFtZXMgZGVmaW5lZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgY29uc3QgY2hhcioqIG5ldE5hbWVzLCAgICAgICAgLyogb3B0aW9uYWwoTlVMTCkgLSBsaXN0ICovCi0gICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGVlcSwgICAgICAgICAgICAgIC8qIG9wdGlvbmFsKE5VTEwpIC0gRUVRTUFTVEVSICovCi0gICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGdlbk5hbWUsICAgICAgICAgIC8qIG9wdGlvbmFsKE5VTEwpIC0gR0VORVJBVEUgKi8KLSAgICAgICAgICAgICAgY29uc3QgY2hhciogZ2VuUGFyZW1ldGVycywgICAgLyogb3B0aW9uYWwoTlVMTCkgLSBwYXJhbWV0ZXJzICovCi0gICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNvdXJjZSwgICAgICAgICAgIC8vIG9wdGlvbmFsKE5VTEwpIC0gTkVUTElTVCB8IERJU1QgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVU0VSIHwgVElNSU5HIAotICAgICAgICAgICAgICBpbnQgbnVtRm9yZWlnbiwgICAgICAgICAgICAgICAvLyBvcHRpb25hbCgwKSAtICMgZm9yZWlnbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmVpZ254LCBmb3JlaWdueSAmIG9yaWVudHMKLSAgICAgICAgICAgICAgY29uc3QgY2hhcioqIGZvcmVpZ25zLCAgICAgICAgLyogb3B0aW9uYWwoTlVMTCkgLSBsaXN0ICovCi0gICAgICAgICAgICAgIGludCogZm9yZWlnblgsIGludCogZm9yZWlnblksIC8qIG9wdGlvbmFsKDApIC0gbGlzdCBmb3JlaWduIHB0cyAqLwotICAgICAgICAgICAgICBpbnQqIGZvcmVpZ25PcmllbnRzLCAgICAgICAgICAvKiBvcHRpb25hbCgtMSkgLSAwIHRvIDcgKi8KLSAgICAgICAgICAgICAgY29uc3QgY2hhciogc3RhdHVzLCAgICAgICAgICAgLy8gb3B0aW9uYWwoTlVMTCkgLSBGSVhFRCB8IENPVkVSIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIFBMQUNFRCB8IFVOUExBQ0VECi0gICAgICAgICAgICAgIGludCBzdGF0dXNYLCBpbnQgc3RhdHVzWSwgICAgIC8qIG9wdGlvbmFsKDApIC0gc3RhdHVzIHB0ICovCi0gICAgICAgICAgICAgIGludCBzdGF0dXNPcmllbnQsICAgICAgICAgICAgIC8qIG9wdGlvbmFsKC0xKSAtIDAgdG8gNyAqLwotICAgICAgICAgICAgICBkb3VibGUgd2VpZ2h0LCAgICAgICAgICAgICAgICAvKiBvcHRpb25hbCgwKSAqLwotICAgICAgICAgICAgICBjb25zdCBjaGFyKiByZWdpb24sICAgICAgICAgICAvLyBvcHRpb25hbChOVUxMKSAtIGVpdGhlciB4bCwgeWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHhoLCB5aCBvciByZWdpb24gCi0gICAgICAgICAgICAgIGludCB4bCwgaW50IHlsLCAgICAgICAgICAgICAgIC8qIG9wdGlvbmFsKDApIC0gcmVnaW9uIHB0MSAqLwotICAgICAgICAgICAgICBpbnQgeGgsIGludCB5aCk7ICAgICAgICAgICAgICAvKiBvcHRpb25hbCgwKSAtIHJlZ2lvbiBwdDIgKi8KLQotCi0vKiBUaGlzIHJvdXRpbmUgZW50ZXIgZWFjaCBjb21wb25lbnQgaW50byB0aGUgZmlsZS4KLSAqIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgZGVmd1N0YXJ0Q29tcG9uZW50cyBjYWxsLgotICogVGhlIG9wdGlvbmFsIGZpZWxkcyB3aWxsIGJlIGlnbm9yZWQgaWYgdGhleSBhcmUgc2V0IHRvIHplcm8KLSAqIChleGNlcHQgZm9yIHdlaWdodCB3aGljaCBtdXN0IGJlIHNldCB0byAtMS4wKS4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtYW55IHRpbWVzLiAKLSAqIFRoaXMgcm91dGluZSBpcyB0aGUgc2FtZSBhcyBkZWZ3Q29tcG9uZW50LCBleGNlcHQgb3JpZW50IGlzIGEgY2hhcioqICovCi1leHRlcm4gaW50IGRlZndDb21wb25lbnRTdHIoY29uc3QgY2hhciogaW5zdGFuY2UsICAvKiBjb21wTmFtZSAqLwotICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtYXN0ZXIsICAgICAgICAgICAvKiBtb2RlbE5hbWUgKi8KLSAgICAgICAgICAgICAgaW50ICAgbnVtTmV0TmFtZSwgICAgICAgICAgICAgLy8gb3B0aW9uYWwoMCkgLSAjIG5ldE5hbWVzIGRlZmluZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgY29uc3QgY2hhcioqIG5ldE5hbWVzLCAgICAgICAgLyogb3B0aW9uYWwoTlVMTCkgLSBsaXN0ICovCi0gICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGVlcSwgICAgICAgICAgICAgIC8qIG9wdGlvbmFsKE5VTEwpIC0gRUVRTUFTVEVSICovCi0gICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGdlbk5hbWUsICAgICAgICAgIC8qIG9wdGlvbmFsKE5VTEwpIC0gR0VORVJBVEUgKi8KLSAgICAgICAgICAgICAgY29uc3QgY2hhciogZ2VuUGFyZW1ldGVycywgICAgLyogb3B0aW9uYWwoTlVMTCkgLSBwYXJhbWV0ZXJzICovCi0gICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNvdXJjZSwgICAgICAgICAgIC8vIG9wdGlvbmFsKE5VTEwpIC0gTkVUTElTVCB8IERJU1QgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVU0VSIHwgVElNSU5HIAotICAgICAgICAgICAgICBpbnQgbnVtRm9yZWlnbiwgICAgICAgICAgICAgICAvLyBvcHRpb25hbCgwKSAtICMgZm9yZWlnbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmVpZ254LCBmb3JlaWdueSAmIG9yaWVudHMKLSAgICAgICAgICAgICAgY29uc3QgY2hhcioqIGZvcmVpZ25zLCAgICAgICAgLyogb3B0aW9uYWwoTlVMTCkgLSBsaXN0ICovCi0gICAgICAgICAgICAgIGludCogZm9yZWlnblgsIGludCogZm9yZWlnblksIC8qIG9wdGlvbmFsKDApIC0gbGlzdCBmb3JlaWduIHB0cyAqLwotICAgICAgICAgICAgICBjb25zdCBjaGFyKiogZm9yZWlnbk9yaWVudHMsICAvKiBvcHRpb25hbChOVUxMKSAqLwotICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdGF0dXMsICAgICAgICAgICAvLyBvcHRpb25hbChOVUxMKSAtIEZJWEVEIHwgQ09WRVIgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQTEFDRUQgfCBVTlBMQUNFRCAKLSAgICAgICAgICAgICAgaW50IHN0YXR1c1gsIGludCBzdGF0dXNZLCAgICAgLyogb3B0aW9uYWwoMCkgLSBzdGF0dXMgcHQgKi8KLSAgICAgICAgICAgICAgY29uc3QgY2hhciogc3RhdHVzT3JpZW50LCAgICAgLyogb3B0aW9uYWwoTlVMTCkgKi8KLSAgICAgICAgICAgICAgZG91YmxlIHdlaWdodCwgICAgICAgICAgICAgICAgLyogb3B0aW9uYWwoMCkgKi8KLSAgICAgICAgICAgICAgY29uc3QgY2hhciogcmVnaW9uLCAgICAgICAgICAgLy8gb3B0aW9uYWwoTlVMTCkgLSBlaXRoZXIgeGwsIHlsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB4aCwgeWggb3IgcmVnaW9uIAotICAgICAgICAgICAgICBpbnQgeGwsIGludCB5bCwgICAgICAgICAgICAgICAvKiBvcHRpb25hbCgwKSAtIHJlZ2lvbiBwdDEgKi8KLSAgICAgICAgICAgICAgaW50IHhoLCBpbnQgeWgpOyAgICAgICAgICAgICAgLyogb3B0aW9uYWwoMCkgLSByZWdpb24gcHQyICovCi0KLS8qIFRoaXMgaXMgYSA1Ljggc3ludGF4LgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gKi8KLWV4dGVybiBpbnQgZGVmd0NvbXBvbmVudE1hc2tTaGlmdChpbnQgc2hpZnRMYXllck1hc2tzKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGVpdGhlciB0aGUgZGVmd0NvbXBvbmVudCBvcgotICogZGVmd0NvbXBvbmVudFN0ci4KLSAqIFRoaXMgcm91dGluZSBjYW4gb25seSBjYWxsZWQgb25jZSBwZXIgY29tcG9uZW50LgotICogRWl0aGVyIHRoaXMgcm91dGluZSBvciBkZWZ3Q29tcG9uZW50SGFsb1NvZnQgY2FuIGJlIGNhbGxlZCwgYnV0IG5vdCBib3RoCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0gKiBUaGlzIGlzIGEgNS42IHN5bnRheC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgKi8KLWV4dGVybiBpbnQgZGVmd0NvbXBvbmVudEhhbG8oaW50IGxlZnQsIGludCBib3R0b20sIGludCByaWdodCwgaW50IHRvcCk7Ci0gCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgZWl0aGVyIHRoZSBkZWZ3Q29tcG9uZW50IG9yCi0gKiBkZWZ3Q29tcG9uZW50U3RyLgotICogVGhpcyByb3V0aW5lIGNhbiBvbmx5IGNhbGxlZCBvbmNlIHBlciBjb21wb25lbnQuCi0gKiBUaGlzIHJvdXRpbmUgaXMganVzdCBsaWtlIGRlZndDb21wb25lbnRIYWxvLCBleGNlcHQgaXQgd3JpdGVzIHRoZSBvcHRpb24gU09GVAotICogRWl0aGVyIHRoaXMgcm91dGluZSBvciBkZWZ3Q29tcG9uZW50SGFsbyBjYW4gYmUgY2FsbGVkLCBidXQgbm90IGJvdGgKLSAqIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4KLSAqIFRoaXMgaXMgYSA1Ljcgc3ludGF4LgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAqLwotZXh0ZXJuIGludCBkZWZ3Q29tcG9uZW50SGFsb1NvZnQoaW50IGxlZnQsIGludCBib3R0b20sIGludCByaWdodCwgaW50IHRvcCk7Ci0gCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgZWl0aGVyIHRoZSBkZWZ3Q29tcG9uZW50IG9yCi0gKiBkZWZ3Q29tcG9uZW50U3RyLgotICogVGhpcyByb3V0aW5lIGNhbiBvbmx5IGNhbGxlZCBvbmNlIHBlciBjb21wb25lbnQuCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0gKiBUaGlzIGlzIGEgNS43IHN5bnRheC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgKi8KLWV4dGVybiBpbnQgZGVmd0NvbXBvbmVudFJvdXRlSGFsbyhpbnQgaGFsb0Rpc3QsIGNvbnN0IGNoYXIqIG1pbkxheWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1heExheWVyKTsKLSAKLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgZGVmd0NvbXBvbmVudCBjYWxscy4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogSWYgdGhlIGNvdW50IGluIFN0YXJ0Q29tcG9uZW50cyBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZgotICogY2FsbHMgdG8gQ29tcG9uZW50IHRoZW4gREVGV19CQURfREFUQSB3aWxsIHJldHVybiByZXR1cm5lZC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAqLwotZXh0ZXJuIGludCBkZWZ3RW5kQ29tcG9uZW50cyggdm9pZCApOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGNvbXBvbmVudHMgc2VjdGlvbiAoaWYgYW55KS4KLSAqIFRoaXMgc2VjdGlvbiBvZiByb3V0aW5lcyBpcyBvcHRpb25hbC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhlIHJvdXRpbmUgc3RhcnRzIHRoZSBwaW5zIHNlY3Rpb24uIEFsbCBvZiB0aGUgcGlucyBtdXN0IGZvbGxvdy4KLSAqIFRoZSBjb3VudCBpcyB0aGUgbnVtYmVyIG9mIGRlZndQaW4gY2FsbHMgdG8gZm9sbG93LgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICovCi1leHRlcm4gaW50IGRlZndTdGFydFBpbnMoIGludCBjb3VudCApOwotCi0vKiBUaGlzIHJvdXRpbmUgZW50ZXIgZWFjaCBwaW4gaW50byB0aGUgZmlsZS4KLSAqIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgZGVmd1N0YXJ0UGlucyBjYWxsLgotICogVGhlIG9wdGlvbmFsIGZpZWxkcyB3aWxsIGJlIGlnbm9yZWQgaWYgdGhleSBhcmUgc2V0IHRvIHplcm8uCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbWFueSB0aW1lcy4KLSAqIE5PVEU6IFVzZSBkZWZ3UGluTGF5ZXIgdG8gd3JpdGUgb3V0IGxheWVyIHdpdGggU1BBQ0lORyBvciBERVNJR05SVUxFV0lEVEggKi8KLWV4dGVybiBpbnQgZGVmd1Bpbihjb25zdCBjaGFyKiBuYW1lLCAgICAgLyogcGluTmFtZSAqLwotICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuZXQsICAgICAgICAgICAvKiBuZXROYW1lICovCi0gICAgICAgICAgICAgIGludCBzcGVjaWFsLCAgICAgICAgICAgICAgIC8qIDAgLSBpZ25vcmUsIDEgLSBzcGVjaWFsICovCi0gICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRpcmVjdGlvbiwgICAgIC8vIG9wdGlvbmFsKE5VTEwpIC0gSU5QVVQgfCBPVVRQVVQgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJTk9VVCB8IEZFRURUSFJVIAotICAgICAgICAgICAgICBjb25zdCBjaGFyKiB1c2UsICAgICAgICAgICAvLyBvcHRpb25hbChOVUxMKSAtIFNJR05BTCB8IFBPV0VSIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR1JPVU5EIHwgQ0xPQ0sgfCBUSUVPRkYgfCBBTkFMT0cgCi0gICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN0YXR1cywgICAgICAgIC8vIG9wdGlvbmFsKE5VTEwpIC0gRklYRUQgfCBQTEFDRUQgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDT1ZFUiAKLSAgICAgICAgICAgICAgaW50IHN0YXR1c1gsIGludCBzdGF0dXNZLCAgLyogb3B0aW9uYWwoMCkgLSBzdGF0dXMgcG9pbnQgKi8KLSAgICAgICAgICAgICAgaW50IG9yaWVudCwgICAgICAgICAgICAgICAgLyogb3B0aW9uYWwoLTEpIC0gc3RhdHVzIG9yaWVudCAqLwotICAgICAgICAgICAgICBjb25zdCBjaGFyKiBsYXllciwgICAgICAgICAvKiBvcHRpb25hbChOVUxMKSAtIGxheWVyTmFtZSAqLwotICAgICAgICAgICAgICBpbnQgeGwsIGludCB5bCwgICAgICAgICAgICAvKiBvcHRpb25hbCgwKSAtIGxheWVyIHBvaW50MSAqLwotICAgICAgICAgICAgICBpbnQgeGgsIGludCB5aCk7ICAgICAgICAgICAvKiBvcHRpb25hbCgwKSAtIGxheWVyIHBvaW50MiAqLwotCi0vKiBUaGlzIHJvdXRpbmUgZW50ZXIgZWFjaCBwaW4gaW50byB0aGUgZmlsZS4KLSAqIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgZGVmd1N0YXJ0UGlucyBjYWxsLgotICogVGhlIG9wdGlvbmFsIGZpZWxkcyB3aWxsIGJlIGlnbm9yZWQgaWYgdGhleSBhcmUgc2V0IHRvIHplcm8uCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbWFueSB0aW1lcy4KLSAqIFRoaXMgcm91dGluZSBpcyB0aGUgc2FtZSBhcyBkZWZ3UGluLCBleGNlcHQgb3JpZW50IGlzIGEgY2hhcioKLSAqIE5PVEU6IFVzZSBkZWZ3UGluTGF5ZXIgdG8gd3JpdGUgb3V0IGxheWVyIHdpdGggU1BBQ0lORyBvciBERVNJR05SVUxFV0lEVEggKi8KLWV4dGVybiBpbnQgZGVmd1BpblN0cihjb25zdCBjaGFyKiBuYW1lLCAgICAgLyogcGluTmFtZSAqLwotICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuZXQsICAgICAgICAgICAvKiBuZXROYW1lICovCi0gICAgICAgICAgICAgIGludCBzcGVjaWFsLCAgICAgICAgICAgICAgIC8qIDAgLSBpZ25vcmUsIDEgLSBzcGVjaWFsICovCi0gICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRpcmVjdGlvbiwgICAgIC8vIG9wdGlvbmFsKE5VTEwpIC0gSU5QVVQgfCBPVVRQVVQgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJTk9VVCB8IEZFRURUSFJVIAotICAgICAgICAgICAgICBjb25zdCBjaGFyKiB1c2UsICAgICAgICAgICAvLyBvcHRpb25hbChOVUxMKSAtIFNJR05BTCB8IFBPV0VSIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR1JPVU5EIHwgQ0xPQ0sgfCBUSUVPRkYgfCBBTkFMT0cgCi0gICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN0YXR1cywgICAgICAgIC8vIG9wdGlvbmFsKE5VTEwpIC0gRklYRUQgfCBQTEFDRUQgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDT1ZFUgotICAgICAgICAgICAgICBpbnQgc3RhdHVzWCwgaW50IHN0YXR1c1ksICAvKiBvcHRpb25hbCgwKSAtIHN0YXR1cyBwb2ludCAqLwotICAgICAgICAgICAgICBjb25zdCBjaGFyKiBvcmllbnQsICAgICAgICAvKiBvcHRpb25hbChOVUxMKSAqLwotICAgICAgICAgICAgICBjb25zdCBjaGFyKiBsYXllciwgICAgICAgICAvKiBvcHRpb25hbChOVUxMKSAtIGxheWVyTmFtZSAqLwotICAgICAgICAgICAgICBpbnQgeGwsIGludCB5bCwgICAgICAgICAgICAvKiBvcHRpb25hbCgwKSAtIGxheWVyIHBvaW50MSAqLwotICAgICAgICAgICAgICBpbnQgeGgsIGludCB5aCk7ICAgICAgICAgICAvKiBvcHRpb25hbCgwKSAtIGxheWVyIHBvaW50MiAqLwotCi0vKiBUaGlzIHJvdXRpbmUgc2hvdWxkIGJlIGNhbGxlZCBpZiB0aGUgbGF5ZXIgaGFzIGVpdGhlciBTUEFDSU5HIG9yCi0gKiBERVNJR05SVUxFV0lEVEguICBJZiB0aGlzIHJvdXRpbmUgaXMgdXNlZCBhbmQgdGhlIHBpbiBoYXMgb25seSBvbmUKLSAqIGxheWVyLCB0aGUgbGF5ZXIgaW4gZGVmd1BpbiBvciBkZWZ3UGluU3RyIGhhcyB0byBiZSBudWxsLCBvdGhlcndpc2UKLSAqIHRoZSBsYXllciB3aWxsIGJlIHdyaXR0ZW4gb3V0IHR3aWNlLgotICogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGRlZndQaW4gb3IgZGVmd1BpblN0ci4KLSAqIFRoaXMgaXMgYSA1LjYgc3ludGF4LgotICogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gYSBwaW4uICovCi1leHRlcm4gaW50IGRlZndQaW5MYXllcihjb25zdCBjaGFyKiBsYXllck5hbWUsCi0gICAgICAgICAgICAgIGludCBzcGFjaW5nLCAgICAgICAgIC8qIG9wdGlvbmFsKDApIC0gU1BBQ0lORyAmIERFU0lHTlJVTEVXSURUSCAqLwotICAgICAgICAgICAgICBpbnQgZGVzaWduUnVsZVdpZHRoLCAvKiBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlICovCi0gICAgICAgICAgICAgIGludCB4bCwgaW50IHlsLAotICAgICAgICAgICAgICBpbnQgeGgsIGludCB5aCwKLSAgICAgICAgICAgICAgaW50IG1hc2sgPSAwKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGRlZndQaW4gb3IgZGVmd1BpblN0ci4KLSAqIFRoaXMgcm91dGluZSBpcyB0byB3cml0ZSBvdXQgbGF5ZXIgd2l0aCBwb2x5Z29uLgotICogVGhpcyBpcyBhIDUuNiBzeW50YXguCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgcGluLiAqLwotZXh0ZXJuIGludCBkZWZ3UGluUG9seWdvbihjb25zdCBjaGFyKiBsYXllck5hbWUsCi0gICAgICAgICAgICAgIGludCBzcGFjaW5nLCAgICAgICAgIC8qIG9wdGlvbmFsKDApIC0gU1BBQ0lORyAmIERFU0lHTlJVTEVXSURUSCAqLwotICAgICAgICAgICAgICBpbnQgZGVzaWduUnVsZVdpZHRoLCAvKiBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlICovCi0gICAgICAgICAgICAgIGludCBudW1fcG9seXMsIGRvdWJsZSogeGwsIGRvdWJsZSogeWwsCi0gICAgICAgICAgICAgIGludCBtYXNrID0gMCk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBkZWZ3UGluIG9yIGRlZndQaW5TdHIuCi0gKiBUaGlzIHJvdXRpbmUgaXMgdG8gd3JpdGUgb3V0IGxheWVyIHdpdGggdmlhLgotICogVGhpcyBpcyBhIDUuNyBzeW50YXguCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgcGluLiAqLwotZXh0ZXJuIGludCBkZWZ3UGluVmlhKGNvbnN0IGNoYXIqIHZpYU5hbWUsIGludCB4bCwgaW50IHlsLCBpbnQgbWFzayA9IDApOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgZGVmd1BpbiBvciBkZWZ3UGluU3RyLgotICogVGhpcyByb3V0aW5lIGlzIHRvIHdyaXRlIG91dCBwaW4gd2l0aCBwb3J0LgotICogVGhpcyBpcyBhIDUuNyBzeW50YXguCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgcGluLiAqLwotZXh0ZXJuIGludCBkZWZ3UGluUG9ydCgpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGRlZndQaW5Qb3J0LiAKLSAqIFRoaXMgaXMgYSA1Ljcgc3ludGF4LgotICogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gYSBwaW4uICovCi1leHRlcm4gaW50IGRlZndQaW5Qb3J0TGF5ZXIoY29uc3QgY2hhciogbGF5ZXJOYW1lLAotICAgICAgICAgICAgICBpbnQgc3BhY2luZywgICAgICAgICAvKiBvcHRpb25hbCgwKSAtIFNQQUNJTkcgJiBERVNJR05SVUxFV0lEVEggKi8KLSAgICAgICAgICAgICAgaW50IGRlc2lnblJ1bGVXaWR0aCwgLyogYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSAqLwotICAgICAgICAgICAgICBpbnQgeGwsIGludCB5bCwKLSAgICAgICAgICAgICAgaW50IHhoLCBpbnQgeWgsCi0gICAgICAgICAgICAgIGludCBtYXNrID0gMCk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBkZWZ3UGluUG9ydC4KLSAqIFRoaXMgaXMgYSA1Ljcgc3ludGF4LgotICogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHdpdGhpbiBhIHBpbi4gKi8KLWV4dGVybiBpbnQgZGVmd1BpblBvcnRQb2x5Z29uKGNvbnN0IGNoYXIqIGxheWVyTmFtZSwKLSAgICAgICAgICAgICAgaW50IHNwYWNpbmcsICAgICAgICAgLyogb3B0aW9uYWwoMCkgLSBTUEFDSU5HICYgREVTSUdOUlVMRVdJRFRIICovCi0gICAgICAgICAgICAgIGludCBkZXNpZ25SdWxlV2lkdGgsIC8qIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgKi8KLSAgICAgICAgICAgICAgaW50IG51bV9wb2x5cywgZG91YmxlKiB4bCwgZG91YmxlKiB5bCwKLSAgICAgICAgICAgICAgaW50IG1hc2sgPSAwKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGRlZndQaW5Qb3J0LgotICogVGhpcyBpcyBhIDUuNyBzeW50YXguCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgcGluLiAqLwotZXh0ZXJuIGludCBkZWZ3UGluUG9ydFZpYShjb25zdCBjaGFyKiB2aWFOYW1lLCBpbnQgeGwsIGludCB5bCwgaW50IG1hc2sgPSAwKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGRlZndQaW5Qb3J0LgotICogVGhpcyBpcyBhIDUuNyBzeW50YXguCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbWFueSB0aW1lcy4KLSAqIE5PVEU6IFVzZSBkZWZ3UGluTGF5ZXIgdG8gd3JpdGUgb3V0IGxheWVyIHdpdGggU1BBQ0lORyBvciBERVNJR05SVUxFV0lEVEggKi8KLWV4dGVybiBpbnQgZGVmd1BpblBvcnRMb2NhdGlvbigKLSAgICAgICAgICAgICAgY29uc3QgY2hhciogc3RhdHVzLCAgICAgICAgLyogRklYRUQgfCBQTEFDRUQgfCBDT1ZFUiAqLwotICAgICAgICAgICAgICBpbnQgc3RhdHVzWCwgaW50IHN0YXR1c1ksICAvKiBzdGF0dXMgcG9pbnQgKi8KLSAgICAgICAgICAgICAgY29uc3QgY2hhciogb3JpZW50KTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGRlZndQaW4uCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoaXMgaXMgYSA1LjYgc3ludGF4LgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UgcGVyIHBpbi4gKi8KLWV4dGVybiBpbnQgZGVmd1Bpbk5ldEV4cHIoY29uc3QgY2hhciogcGluRXhwcik7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBkZWZ3UGluLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGlzIGlzIGEgNS42IHN5bnRheC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBwaW4uICovCi1leHRlcm4gaW50IGRlZndQaW5TdXBwbHlTZW5zaXRpdml0eShjb25zdCBjaGFyKiBwaW5OYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGRlZndQaW4uCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoaXMgaXMgYSA1LjYgc3ludGF4LgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UgcGVyIHBpbi4gKi8KLWV4dGVybiBpbnQgZGVmd1Bpbkdyb3VuZFNlbnNpdGl2aXR5KGNvbnN0IGNoYXIqIHBpbk5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgZGVmd1Bpbi4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhpcyBpcyBhIDUuNCBzeW50YXguCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAqLwotZXh0ZXJuIGludCBkZWZ3UGluQW50ZW5uYVBpblBhcnRpYWxNZXRhbEFyZWEoaW50IHZhbHVlLAotICAgICAgICAgICAgICBjb25zdCBjaGFyKiBsYXllck5hbWUpOyAgICAvKiBvcHRpb25hbChOVUxMKSAqLwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgZGVmd1Bpbi4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhpcyBpcyBhIDUuNCBzeW50YXguCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAqLwotZXh0ZXJuIGludCBkZWZ3UGluQW50ZW5uYVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhKGludCB2YWx1ZSwKLSAgICAgICAgICAgICAgY29uc3QgY2hhciogbGF5ZXJOYW1lKTsgICAgLyogb3B0aW9uYWwoTlVMTCkgKi8KLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGRlZndQaW4uCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoaXMgaXMgYSA1LjQgc3ludGF4LgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gKi8KLWV4dGVybiBpbnQgZGVmd1BpbkFudGVubmFQaW5QYXJ0aWFsQ3V0QXJlYShpbnQgdmFsdWUsCi0gICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGxheWVyTmFtZSk7ICAgIC8qIG9wdGlvbmFsKE5VTEwpICovCi0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBkZWZ3UGluLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGlzIGlzIGEgNS40IHN5bnRheC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuICovCi1leHRlcm4gaW50IGRlZndQaW5BbnRlbm5hUGluRGlmZkFyZWEoaW50IHZhbHVlLAotICAgICAgICAgICAgICBjb25zdCBjaGFyKiBsYXllck5hbWUpOyAgICAvKiBvcHRpb25hbChOVUxMKSAqLwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgZGVmd1Bpbi4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhpcyBpcyBhIDUuNSBzeW50YXguCi0gKiBUaGUgb3hpZGUgY2FuIGJlIGVpdGhlciBPWElERTEsIE9YSURFMiwgT1hJREUzLCBvciBPWElERTQuCi0gKiBFYWNoIG94aWRlIHZhbHVlIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGRlZndQaW4uICovCi1leHRlcm4gaW50IGRlZndQaW5BbnRlbm5hTW9kZWwoY29uc3QgY2hhciogb3hpZGUpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgZGVmd1Bpbi4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhpcyBpcyBhIDUuNCBzeW50YXguCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAqLwotZXh0ZXJuIGludCBkZWZ3UGluQW50ZW5uYVBpbkdhdGVBcmVhKGludCB2YWx1ZSwKLSAgICAgICAgICAgICAgY29uc3QgY2hhciogbGF5ZXJOYW1lKTsgICAgLyogb3B0aW9uYWwoTlVMTCkgKi8KLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGRlZndQaW4uCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoaXMgaXMgYSA1LjQgc3ludGF4LgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gKi8KLWV4dGVybiBpbnQgZGVmd1BpbkFudGVubmFQaW5NYXhBcmVhQ2FyKGludCB2YWx1ZSwKLSAgICAgICAgICAgICAgY29uc3QgY2hhciogbGF5ZXJOYW1lKTsgICAgLyogb3B0aW9uYWwoTlVMTCkgKi8KLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGRlZndQaW4uCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoaXMgaXMgYSA1LjQgc3ludGF4LgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gKi8KLWV4dGVybiBpbnQgZGVmd1BpbkFudGVubmFQaW5NYXhTaWRlQXJlYUNhcihpbnQgdmFsdWUsCi0gICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGxheWVyTmFtZSk7ICAgIC8qIG9wdGlvbmFsKE5VTEwpICovCi0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBkZWZ3UGluLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBUaGlzIGlzIGEgNS40IHN5bnRheC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuICovCi1leHRlcm4gaW50IGRlZndQaW5BbnRlbm5hUGluTWF4Q3V0Q2FyKGludCB2YWx1ZSwKLSAgICAgICAgICAgICAgY29uc3QgY2hhciogbGF5ZXJOYW1lKTsgICAgLyogb3B0aW9uYWwoTlVMTCkgKi8KLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBkZWZ3UGluIGNhbGxzLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBJZiB0aGUgY291bnQgaW4gU3RhcnRQaW5zIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mCi0gKiBjYWxscyB0byBQaW4gdGhlbiBERUZXX0JBRF9EQVRBIHdpbGwgcmV0dXJuIHJldHVybmVkLgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICovCi1leHRlcm4gaW50IGRlZndFbmRQaW5zKCB2b2lkICk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgcGluIHNlY3Rpb24gKGlmIGFueSkuCi0gKiBUaGlzIHNlY3Rpb24gb2Ygcm91dGluZXMgaXMgb3B0aW9uYWwuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIHN0YXJ0cyB0aGUgcGlucHJvcGVydGllcyBzZWN0aW9uLiBBbGwgb2YgdGhlIHBpbnByb3BlcnRpZXMKLSAqIG11c3QgZm9sbG93LgotICogVGhlIGNvdW50IGlzIHRoZSBudW1iZXIgb2YgZGVmd1BpblByb3AgY2FsbHMgdG8gZm9sbG93LgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICovCi1leHRlcm4gaW50IGRlZndTdGFydFBpblByb3BlcnRpZXMoIGludCBjb3VudCApOwotCi0vKiBUaGlzIHJvdXRpbmUgZW50ZXIgZWFjaCBwaW5wcm9wZXJ0eSBpbnRvIHRoZSBmaWxlLgotICogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBkZWZ3U3RhcnRQaW5Qcm9wZXJ0aWVzIGNhbGwuCi0gKiBUaGUgb3B0aW9uYWwgZmllbGRzIHdpbGwgYmUgaWdub3JlZCBpZiB0aGV5IGFyZSBzZXQgdG8gemVyby4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtYW55IHRpbWVzLiAqLwotZXh0ZXJuIGludCBkZWZ3UGluUHJvcGVydHkoY29uc3QgY2hhciogbmFtZSwgICAgIC8qIGNvbXBOYW1lIHwgUElOICovCi0gICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBpbk5hbWUpOyAgICAgICAgICAgICAgLyogcGluTmFtZSAqLwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGRlZndQaW5Qcm9wZXJ0eSBjYWxscy4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotICogSWYgdGhlIGNvdW50IGluIFN0YXJ0UGlucyBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZgotICogY2FsbHMgdG8gUGluIHRoZW4gREVGV19CQURfREFUQSB3aWxsIHJldHVybiByZXR1cm5lZC4KLSAqIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAqLwotZXh0ZXJuIGludCBkZWZ3RW5kUGluUHJvcGVydGllcyggdm9pZCApOwotCi0vKiBSb3V0aW5lcyB0byBlbnRlciBhIHNwZWNpYWwgbmV0IG9yIG5ldHMgaW50byB0aGUgZmlsZS4KLSAqIFlvdSBtdXN0IGZpcnN0IGNhbGwgZGVmd1N0YXJ0U3BlY2lhbE5ldHMgd2l0aCB0aGUgbnVtYmVyIG9mCi0gKiBuZXRzLiBUaGlzIHNlY3Rpb24gaXMgcmVxdWlyZWQsIGV2ZW4gaWYgeW91IGRvIG5vdCBoYXZlIGFueSBuZXRzLgotICogRm9yIGVhY2ggbmV0IHlvdSBzaG91bGQgY2FsbCBkZWZ3U3BlY2lhbE5ldCBmb2xsb3dlZCBieQotICogb25lIG9yIG1vcmUgZGVmd1NwZWNpYWxOZXRDb25uZWN0aW9uIGNhbGxzLgotICogQWZ0ZXIgdGhlIGNvbm5lY3Rpb25zIGNvbWUgdGhlIG9wdGlvbnMuICBPcHRpb25zIGFyZQotICogTk9UIHJlcXVpcmVkLgotICogRWFjaCBuZXQgaXMgY29tcGxldGVkIGJ5IGNhbGxpbmcgZGVmd1NwZWNpYWxOZXRFbmRPbmVOZXQoKS4KLSAqIFRoZSBuZXRzIHNlY3Rpb24gaXMgZmluaXNoZWQgYnkgY2FsbGluZyBkZWZ3RW5kTmV0cygpLiAqLwotZXh0ZXJuIGludCBkZWZ3U3RhcnRTcGVjaWFsTmV0cyhpbnQgY291bnQpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGRlZndTdGFydFNwZWNpYWxOZXRzIGl0IGlzIGZvcgotICogLSBuZXROYW1lICovCi1leHRlcm4gaW50IGRlZndTcGVjaWFsTmV0KGNvbnN0IGNoYXIqIG5hbWUpOyAgIC8qIG5ldE5hbWUgKi8KLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciBjb21wTmFtZVJlZ0V4cHIsIHBpbk5hbWUsIGFuZCBTWU5USEVTSVpFRCAqLwotLyogSXQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyAqLwotZXh0ZXJuIGludCBkZWZ3U3BlY2lhbE5ldENvbm5lY3Rpb24oY29uc3QgY2hhciogaW5zdCwgICAgLyogY29tcE5hbWVSZWdFeHByICovCi0gICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGluLCAgICAgICAvKiBwaW5OYW1lICovCi0gICAgICAgICAgICAgICAgICAgaW50IHN5bnRoZXNpemVkKTsgICAgIC8qIDAgLSBpZ25vcmUsIDEgLSBTWU5USEVTSVpFRCAgKi8KLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciArIEZJWEVEQlVNUAotICogVGhpcyBpcyBhIDUuNC4xIHN5bnRheCAqLwotZXh0ZXJuIGludCBkZWZ3U3BlY2lhbE5ldEZpeGVkYnVtcCgpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yICsgVk9MVEFHRSB2b2x0cyAqLwotZXh0ZXJuIGludCBkZWZ3U3BlY2lhbE5ldFZvbHRhZ2UoZG91YmxlIHYpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yICsgU1BBQ0lORyBsYXllck5hbWUgc3BhY2luZyBbUkFOR0UgbWlud2lkdGggbWF4d2lkdGggKi8KLWV4dGVybiBpbnQgZGVmd1NwZWNpYWxOZXRTcGFjaW5nKGNvbnN0IGNoYXIqIGxheWVyLCAgLyogbGF5ZXJOYW1lICovCi0gICAgICAgICAgICAgICAgICAgIGludCBzcGFjaW5nLCAgICAgICAgICAvKiBzcGFjaW5nICovCi0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtaW53aWR0aCwgICAgICAvKiBvcHRpb25hbCgwKSAtIG1pbndpZHRoICovCi0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtYXh3aWR0aCk7ICAgICAvKiBvcHRpb25hbCgwKSAtIG1heHdpZHRoICovCi0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgKyBXSURUSCBsYXllck5hbWUgd2lkdGggKi8KLWV4dGVybiBpbnQgZGVmd1NwZWNpYWxOZXRXaWR0aChjb25zdCBjaGFyKiBsYXllciwgLyogbGF5ZXJOYW1lICovCi0gICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCk7ICAgICAgICAgICAgICAgICAgIC8qIHdpZHRoICovCi0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgKyBTT1VSQ0Uge05FVExJU1QgfCBESVNUIHwgVVNFUiB8IFRJTUlOR30gKi8KLWV4dGVybiBpbnQgZGVmd1NwZWNpYWxOZXRTb3VyY2UoY29uc3QgY2hhciogbmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgKyBPUklHSU5BTCBuZXROYW1lICovCi1leHRlcm4gaW50IGRlZndTcGVjaWFsTmV0T3JpZ2luYWwoY29uc3QgY2hhciogbmFtZSk7ICAgLyogbmV0TmFtZSAqLwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yICsgUEFUVEVSTiB7U1RFSU5FUiB8IEJBTEFOQ0VEIHwgV0lSRURMT0dJQyB8IFRSVU5LfSAqLwotZXh0ZXJuIGludCBkZWZ3U3BlY2lhbE5ldFBhdHRlcm4oY29uc3QgY2hhciogbmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgKyBVU0Uge1NJR05BTCB8IFBPV0VSIHwgR1JPVU5EIHwgQ0xPQ0sgfCBUSUVPRkYgfAotICAgQU5BTE9HIHwgU0NBTiB8IFJFU0VUfSAqLwotZXh0ZXJuIGludCBkZWZ3U3BlY2lhbE5ldFVzZShjb25zdCBjaGFyKiBuYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciArIFdFSUdIVCB3ZWlnaHQgKi8KLWV4dGVybiBpbnQgZGVmd1NwZWNpYWxOZXRXZWlnaHQoZG91YmxlIHZhbHVlKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciArIEVTVENBUCB3aXJlQ2FwYWNpdGFuY2UgKi8KLWV4dGVybiBpbnQgZGVmd1NwZWNpYWxOZXRFc3RDYXAoZG91YmxlIHZhbHVlKTsKLQotLyogUGF0aHMgYXJlIGEgc3BlY2lhbCB0eXBlIG9mIG9wdGlvbi4gIEEgcGF0aCBtdXN0IGJlZ2luCi0gKiB3aXRoIGEgZGVmd1NwZWNpYWxOZXRQYXRoU3RhcnQgYW5kIGVuZCB3aXRoIGEgZGVmd1NwZWNpYWxOZXRQYXRoRW5kKCkuCi0gKiBUaGUgaW5kaXZpZHVhbCBwYXJ0cyBvZiB0aGUgcGF0aCBjYW4gYmUgZW50ZXJlZCBpbgotICogYW55IG9yZGVyLiAqLwotZXh0ZXJuIGludCBkZWZ3U3BlY2lhbE5ldFBhdGhTdGFydChjb25zdCBjaGFyKiB0eXApOyAvLyBST1VURUQgfCBGSVhFRCB8IENPVkVSIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU0hJRUxEIHwgTkVXIAotZXh0ZXJuIGludCBkZWZ3U3BlY2lhbE5ldFNoaWVsZE5ldE5hbWUoY29uc3QgY2hhciogbmFtZSk7IC8qIHNoaWVsZE5ldE5hbWUgKi8KLQotZXh0ZXJuIGludCBkZWZ3U3BlY2lhbE5ldFBhdGhMYXllcihjb25zdCBjaGFyKiBuYW1lKTsgLyogbGF5ZXJOYW1lICovCi0KLWV4dGVybiBpbnQgZGVmd1NwZWNpYWxOZXRQYXRoV2lkdGgoaW50IHdpZHRoKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLgotICogVGhpcyBpcyBhIDUuNiBzeW50YXguICovCi1leHRlcm4gaW50IGRlZndTcGVjaWFsTmV0UGF0aFN0eWxlKGludCBzdHlsZU51bSk7Ci0KLWV4dGVybiBpbnQgZGVmd1NwZWNpYWxOZXRQYXRoU2hhcGUoY29uc3QgY2hhciogc2hhcGVUeXBlKTsgLy8gUklORyB8IFNUUklQRSB8Ci0gICAgICAgIC8vIEZPTExPV1BJTiB8IElPV0lSRSB8IENPUkVXSVJFIHwgQkxPQ0tXSVJFIHwgRklMTFdJUkUgfCBCTE9DS0FHRVdJUkUgCi0KLQotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLgotICAgVGhpcyBpcyBhIDUuOCBzeW50YXguCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gKi8KLWV4dGVybiBpbnQgZGVmd1NwZWNpYWxOZXRQYXRoTWFzayhpbnQgY29sb3JNYXNrKTsKLQotLyogeCBhbmQgeSBsb2NhdGlvbiBvZiB0aGUgcGF0aCAqLwotZXh0ZXJuIGludCBkZWZ3U3BlY2lhbE5ldFBhdGhQb2ludChpbnQgbnVtUHRzLCAgLyogbnVtYmVyIG9mIGNvbm5lY3RlZCBwb2ludHMgKi8KLSAgICAgICAgICAgICAgICAgICBkb3VibGUqIHBvaW50eCwgICAgIC8qIHBvaW50IHggbGlzdCAqLwotICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcG9pbnR5KTsgICAgLyogcG9pbnQgeSBsaXN0ICovCi1leHRlcm4gaW50IGRlZndTcGVjaWFsTmV0UGF0aFZpYShjb25zdCBjaGFyKiBuYW1lKTsgICAvKiB2aWFOYW1lICovCi0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgZGVmd1NwZWNpYWxOZXRQYXRoCi0gKiBUaGlzIGlzIGEgNS40LjEgc3ludGF4ICovCi1leHRlcm4gaW50IGRlZndTcGVjaWFsTmV0UGF0aFZpYURhdGEoaW50IG51bVgsIGludCBudW1ZLCBpbnQgc3RlcFgsIGludCBzdGVwWSk7Ci0KLS8qIHggYW5kIHkgbG9jYXRpb24gb2YgdGhlIHBhdGggKi8KLWV4dGVybiBpbnQgZGVmd1NwZWNpYWxOZXRQYXRoUG9pbnRXaXRoV2lyZUV4dCgKLSAgICAgICAgICAgICAgICAgICBpbnQgbnVtUHRzLCAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29ubmVjdGVkIHBvaW50cyAqLwotICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcG9pbnR4LCAgICAgICAvKiBwb2ludCB4IGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICBkb3VibGUqIHBvaW50eSwgICAgICAgLyogcG9pbnQgeSBsaXN0ICovCi0gICAgICAgICAgICAgICAgICAgZG91YmxlKiBvcHRWYWx1ZSk7ICAgICAgIC8qIG9wdGlvbmFsKE5VTEwpIHZhbHVlICovCi0KLWV4dGVybiBpbnQgZGVmd1NwZWNpYWxOZXRQYXRoRW5kKCk7Ci0KLS8qIFRoaXMgaXMgYSA1LjYgc3ludGF4Ci0gKiBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gKi8KLWV4dGVybiBpbnQgZGVmd1NwZWNpYWxOZXRQb2x5Z29uKGNvbnN0IGNoYXIqIGxheWVyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcG9seXMsIGRvdWJsZSogeGwsIGRvdWJsZSogeWwpOwotCi0vKiBUaGlzIGlzIGEgNS42IHN5bnRheAotICogVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuICovCi1leHRlcm4gaW50IGRlZndTcGVjaWFsTmV0UmVjdChjb25zdCBjaGFyKiBsYXllck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeGwsIGludCB5bCwgaW50IHhoLCBpbnQgeWgpOwotCi1leHRlcm4gaW50IGRlZndTcGVjaWFsTmV0VmlhKGNvbnN0IGNoYXIqIGxheWVyTmFtZSk7Ci0KLWV4dGVybiBpbnQgZGVmd1NwZWNpYWxOZXRWaWFXaXRoT3JpZW50KGNvbnN0IGNoYXIqIGxheWVyTmFtZSwgaW50IG9yaWVudCk7Ci0KLWV4dGVybiBpbnQgZGVmd1NwZWNpYWxOZXRWaWFQb2ludHMoaW50IG51bV9wb2ludHMsIGRvdWJsZSogeGwsIGRvdWJsZSogeWwpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGF0IHRoZSBlbmQgb2YgZWFjaCBuZXQgKi8KLWV4dGVybiBpbnQgZGVmd1NwZWNpYWxOZXRFbmRPbmVOZXQoKTsKLQotLyogNS4zIGZvciBzcGVjaWFsIG5ldCAqLwotLyogU2hpZWxkcyBhcmUgYSBzcGVjaWFsIHR5cGUgb2Ygb3B0aW9uLiAgQSBzaGllbGQgbXVzdCBiZWdpbgotICogd2l0aCBhIGRlZndTcGVjaWFsTmV0U2hpZWxkU3RhcnQgYW5kIGVuZCB3aXRoIGEgZGVmd1NwZWNpYWxOZXRTaGllbGRFbmQoKS4KLSAqIFRoZSBpbmRpdmlkdWFsIHBhcnRzIG9mIHRoZSBzaGllbGQgY2FuIGJlIGVudGVyZWQgaW4KLSAqIGFueSBvcmRlci4gKi8KLWV4dGVybiBpbnQgZGVmd1NwZWNpYWxOZXRTaGllbGRTdGFydChjb25zdCBjaGFyKiBuYW1lKTsKLQotZXh0ZXJuIGludCBkZWZ3U3BlY2lhbE5ldFNoaWVsZExheWVyKGNvbnN0IGNoYXIqIG5hbWUpOyAvKiBsYXllck5hbWUgKi8KLWV4dGVybiBpbnQgZGVmd1NwZWNpYWxOZXRTaGllbGRXaWR0aChpbnQgd2lkdGgpOyAgICAgICAgLyogd2lkdGggKi8KLWV4dGVybiBpbnQgZGVmd1NwZWNpYWxOZXRTaGllbGRTaGFwZShjb25zdCBjaGFyKiBzaGFwZVR5cGUpOyAvLyBSSU5HIHwgU1RSSVBFIHwKLSAgICAgICAgLy8gRk9MTE9XUElOIHwgSU9XSVJFIHwgQ09SRVdJUkUgfCBCTE9DS1dJUkUgfCBGSUxMV0lSRSB8IEJMT0NLQUdFV0lSRQotIAotLyogeCBhbmQgeSBsb2NhdGlvbiBvZiB0aGUgcGF0aCAqLwotZXh0ZXJuIGludCBkZWZ3U3BlY2lhbE5ldFNoaWVsZFBvaW50KGludCBudW1QdHMsIC8qICMgb2YgY29ubmVjdGVkIHBvaW50cyAqLwotICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcG9pbnR4LCAgICAgLyogcG9pbnQgeCBsaXN0ICovCi0gICAgICAgICAgICAgICAgICAgZG91YmxlKiBwb2ludHkpOyAgICAvKiBwb2ludCB5IGxpc3QgKi8KLWV4dGVybiBpbnQgZGVmd1NwZWNpYWxOZXRTaGllbGRWaWEoY29uc3QgY2hhciogbmFtZSk7ICAgLyogdmlhTmFtZSAqLwotCi0vKiBBIDUuNC4xIHN5bnRheCAqLwotZXh0ZXJuIGludCBkZWZ3U3BlY2lhbE5ldFNoaWVsZFZpYURhdGEoaW50IG51bVgsIGludCBudW1ZLCBpbnQgc3RlcFgsIGludCBzdGVwWSk7Ci1leHRlcm4gaW50IGRlZndTcGVjaWFsTmV0U2hpZWxkRW5kKCk7Ci0vKiBlbmQgNS4zICovCi0gCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGF0IHRoZSBlbmQgb2YgdGhlIHNwZWNpYWwgbmV0IHNlY3Rpb24gKi8KLWV4dGVybiBpbnQgZGVmd0VuZFNwZWNpYWxOZXRzKCk7Ci0KLS8qIFJvdXRpbmVzIHRvIGVudGVyIGEgbmV0IG9yIG5ldHMgaW50byB0aGUgZmlsZS4KLSAqIFlvdSBtdXN0IGZpcnN0IGNhbGwgZGVmd05ldHMgd2l0aCB0aGUgbnVtYmVyIG9mIG5ldHMuCi0gKiBUaGlzIHNlY3Rpb24gaXMgcmVxdWlyZWQsIGV2ZW4gaWYgeW91IGRvIG5vdCBoYXZlIGFueSBuZXRzLgotICogRm9yIGVhY2ggbmV0IHlvdSBzaG91bGQgY2FsbCBkZWZ3TmV0IGZvbGxvd2VkIGJ5IG9uZSBvcgotICogbW9yZSBkZWZ3TmV0Q29ubmVjdGlvbiBjYWxscy4KLSAqIEFmdGVyIHRoZSBjb25uZWN0aW9ucyBjb21lIHRoZSBvcHRpb25zLiAgT3B0aW9ucyBhcmUKLSAqIE5PVCByZXF1aXJlZC4KLSAqIEVhY2ggbmV0IGlzIGNvbXBsZXRlZCBieSBjYWxsaW5nIGRlZndOZXRFbmRPbmVOZXQoKS4KLSAqIFRoZSBuZXRzIHNlY3Rpb24gaXMgZmluaXNoZWQgYnkgY2FsbGluZyBkZWZ3RW5kTmV0cygpLiAqLwotZXh0ZXJuIGludCBkZWZ3U3RhcnROZXRzKGludCBjb3VudCk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgZGVmd1N0YXJ0TmV0cywgaXQgaXMgZm9yIC0gbmV0TmFtZSAqLwotZXh0ZXJuIGludCBkZWZ3TmV0KGNvbnN0IGNoYXIqIG5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yIHsgY29tcE5hbWUgfCBQSU4gfSBwaW5OYW1lIFsrIFNZTlRIRVNJWkVEXSAqLwotLyogSXQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyAqLwotZXh0ZXJuIGludCBkZWZ3TmV0Q29ubmVjdGlvbihjb25zdCBjaGFyKiBpbnN0LCAgICAvKiBjb21wTmFtZSAqLwotICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBpbiwgICAgICAvKiBwaW5OYW1lICovCi0gICAgICAgICAgICAgICAgICAgaW50IHN5bnRoZXNpemVkKTsgICAgLyogMCAtIGlnbm9yZSwgMSAtIFNZTlRIRVNJWkVEICovCi0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgTVVTVEpPSU4sIGNvbXBOYW1lLCBwaW5OYW1lICovCi1leHRlcm4gaW50IGRlZndOZXRNdXN0am9pbkNvbm5lY3Rpb24oY29uc3QgY2hhciogaW5zdCwgIC8qIGNvbXBOYW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGluKTsgICAgIC8qIHBpbk5hbWUgKi8KLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciArIFZQSU4gdnBpbk5hbWUgW0xBWUVSIGxheWVyTmFtZSBwdCBwdAotICogW3sgUExBQ0VEIHwgRklYRUQgfCBDT1ZFUiB9IHB0IG9yaWVudF0gKi8KLWV4dGVybiBpbnQgZGVmd05ldFZwaW4oY29uc3QgY2hhciogdnBpbk5hbWUsCi0gICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGxheWVyTmFtZSwgICAgIC8qIG9wdGlvbmFsKE5VTEwpICovCi0gICAgICAgICAgICAgICAgIGludCBsYXllclhsLCBpbnQgbGF5ZXJZbCwgIC8qIGxheWVyIHBvaW50MSAqLwotICAgICAgICAgICAgICAgICBpbnQgbGF5ZXJYaCwgaW50IGxheWVyWWgsICAvKiBsYXllciBwb2ludDIgKi8KLSAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3RhdHVzLCAgICAgICAgLyogb3B0aW9uYWwoTlVMTCkgKi8KLSAgICAgICAgICAgICAgICAgaW50IHN0YXR1c1gsIGludCBzdGF0dXNZLCAgLyogb3B0aW9uYWwoMCkgLSBzdGF0dXMgcG9pbnQgKi8KLSAgICAgICAgICAgICAgICAgaW50IG9yaWVudCk7ICAgICAgICAgICAgICAgLyogb3B0aW9uYWwoLTEpICovCi0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgKyBWUElOIHZwaW5OYW1lIFtMQVlFUiBsYXllck5hbWUgcHQgcHQKLSAqIFt7IFBMQUNFRCB8IEZJWEVEIHwgQ09WRVIgfSBwdCBvcmllbnRdCi0gKiBUaGlzIHJvdXRpbmUgaXMgdGhlIHNhbWUgYXMgZGVmd05ldFZwaW4sIGV4Y2VwdCBvcmllbnQgaXMgYSBjaGFyKiAqLwotZXh0ZXJuIGludCBkZWZ3TmV0VnBpblN0cihjb25zdCBjaGFyKiB2cGluTmFtZSwKLSAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbGF5ZXJOYW1lLCAgICAgLyogb3B0aW9uYWwoTlVMTCkgKi8KLSAgICAgICAgICAgICAgICAgaW50IGxheWVyWGwsIGludCBsYXllcllsLCAgLyogbGF5ZXIgcG9pbnQxICovCi0gICAgICAgICAgICAgICAgIGludCBsYXllclhoLCBpbnQgbGF5ZXJZaCwgIC8qIGxheWVyIHBvaW50MiAqLwotICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdGF0dXMsICAgICAgICAvKiBvcHRpb25hbChOVUxMKSAqLwotICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzWCwgaW50IHN0YXR1c1ksICAvKiBvcHRpb25hbCgwKSAtIHN0YXR1cyBwb2ludCAqLwotICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBvcmllbnQpOyAgICAgICAvKiBvcHRpb25hbChOVUxMKSAqLwotCi0vKiBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBlaXRoZXIgd2l0aGluIG5ldCBvciBzdWJuZXQuCi0gKiBpdCBpcyBmb3IgTk9OREVGQVVMVFJVTEUgcnVsZW5hbWUgKi8KLWV4dGVybiBpbnQgZGVmd05ldE5vbmRlZmF1bHRSdWxlKGNvbnN0IGNoYXIqIG5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yICsgWFRBTEsgbnVtICovCi1leHRlcm4gaW50IGRlZndOZXRYdGFsayhpbnQgeHRhbGspOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yICsgRklYRURCVU1QCi0gKiBUaGlzIGlzIGEgNS40LjEgc3ludGF4ICovCi1leHRlcm4gaW50IGRlZndOZXRGaXhlZGJ1bXAoKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciArIEZSRVFVRU5DWQotICogVGhpcyBpcyBhIDUuNC4xIHN5bnRheCAqLwotZXh0ZXJuIGludCBkZWZ3TmV0RnJlcXVlbmN5KGRvdWJsZSBmcmVxdWVuY3kpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yICsgU09VUkNFIHtORVRMSVNUIHwgRElTVCB8IFVTRVIgfCBURVNUIHwgVElNSU5HfSAqLwotZXh0ZXJuIGludCBkZWZ3TmV0U291cmNlKGNvbnN0IGNoYXIqIG5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yICsgT1JJR0lOQUwgbmV0bmFtZSAqLwotZXh0ZXJuIGludCBkZWZ3TmV0T3JpZ2luYWwoY29uc3QgY2hhciogbmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgKyBVU0Uge1NJR05BTCB8IFBPV0VSIHwgR1JPVU5EIHwgQ0xPQ0sgfCBUSUVPRkYgfCAKLSAqIEFOQUxPR30gKi8KLWV4dGVybiBpbnQgZGVmd05ldFVzZShjb25zdCBjaGFyKiBuYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciArIFBBVFRFUk4ge1NURUlORVIgfCBCQUxBTkNFRCB8IFdJUkVETE9HSUN9ICovCi1leHRlcm4gaW50IGRlZndOZXRQYXR0ZXJuKGNvbnN0IGNoYXIqIG5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yICsgRVNUQ0FQIHdpcmVDYXBhY2l0YW5jZSAqLwotZXh0ZXJuIGludCBkZWZ3TmV0RXN0Q2FwKGRvdWJsZSB2YWx1ZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgKyBXRUlHSFQgd2VpZ2h0ICovCi1leHRlcm4gaW50IGRlZndOZXRXZWlnaHQoZG91YmxlIHZhbHVlKTsKLQotLyogNS4zIGZvciBuZXQgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgKyBTSElFTERORVQgd2VpZ2h0ICovCi1leHRlcm4gaW50IGRlZndOZXRTaGllbGRuZXQoY29uc3QgY2hhciogbmFtZSk7Ci0KLS8qIE5vc2hpZWxkIGFyZSBhIHNwZWNpYWwgdHlwZSBvZiBvcHRpb24uICBBIG5vc2hpZWxkIG11c3QgYmVnaW4KLSAqIHdpdGggYSBkZWZ3TmV0Tm9zaGllbGRTdGFydCBhbmQgZW5kIHdpdGggYSBkZWZ3TmV0Tm9zaGllbGRFbmQoKS4KLSAqIFRoZSBpbmRpdmlkdWFsIHBhcnRzIG9mIHRoZSBub3NoaWVsZCBjYW4gYmUgZW50ZXJlZCBpbgotICogYW55IG9yZGVyLiAqLwotZXh0ZXJuIGludCBkZWZ3TmV0Tm9zaGllbGRTdGFydChjb25zdCBjaGFyKiBuYW1lKTsKLQotLyogeCBhbmQgeSBsb2NhdGlvbiBvZiB0aGUgcGF0aCAqLwotZXh0ZXJuIGludCBkZWZ3TmV0Tm9zaGllbGRQb2ludChpbnQgbnVtUHRzLCAvKiBudW1iZXIgb2YgY29ubmVjdGVkIHBvaW50cyAqLwotICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiBwb2ludHgsICAgICAvKiBwb2ludCB4IGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiogcG9pbnR5KTsgICAgLyogcG9pbnQgeSBsaXN0ICovCi1leHRlcm4gaW50IGRlZndOZXROb3NoaWVsZFZpYShjb25zdCBjaGFyKiBuYW1lKTsgICAvKiB2aWFOYW1lICovCi1leHRlcm4gaW50IGRlZndOZXROb3NoaWVsZEVuZCgpOwotLyogZW5kIDUuMyAqLwotCi0vKiBTdWJuZXQgYXJlIGEgc3BlY2lhbCB0eXBlIG9mIG9wdGlvbi4gQSBzdWJuZXQgbXVzdCBiZWdpbgotICogd2l0aCBhIGRlZndOZXRTdWJuZXRTdGFydCBhbmQgZW5kIHdpdGggYSBkZWZ3TmV0U3VibmV0RW5kKCkuCi0gKiBSb3V0aW5lcyB0byBjYWxsIHdpdGhpbiB0aGUgc3VibmV0IGFyZTogZGVmd05ldFN1Ym5ldFBpbiwKLSAqIGRlZndOZXROb25kZWZhdWx0UnVsZSBhbmQgZGVmd05ldFBhdGhTdGFydC4uLiAqLwotZXh0ZXJuIGludCBkZWZ3TmV0U3VibmV0U3RhcnQoY29uc3QgY2hhciogbmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGRlZndOZXRTdWJuZXQsIGl0IGlzIGZvcgotICogWyh7Y29tcE5hbWUgfCBQSU59IHBpbk5hbWUpIHwgKFZQSU4gdnBpbk5hbWUpXS4uLiAqLwotZXh0ZXJuIGludCBkZWZ3TmV0U3VibmV0UGluKGNvbnN0IGNoYXIqIGNvbXBOYW1lLCAgLyogY29tcE5hbWUgfCBQSU4gfCBWUElOICovCi0gICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBpbk5hbWUpOyAgICAvKiBwaW5OYW1lIHwgdnBpbk5hbWUgKi8KLQotZXh0ZXJuIGludCBkZWZ3TmV0U3VibmV0RW5kKCk7Ci0KLS8qIFBhdGhzIGFyZSBhIHNwZWNpYWwgdHlwZSBvZiBvcHRpb24uICBBIHBhdGggbXVzdCBiZWdpbgotICogd2l0aCBhIGRlZndOZXRQYXRoU3RhcnQgYW5kIGVuZCB3aXRoIGEgZGVmd1BhdGhFbmQoKS4KLSAqIFRoZSBpbmRpdmlkdWFsIHBhcnRzIG9mIHRoZSBwYXRoIGNhbiBiZSBlbnRlcmVkIGluCi0gKiBhbnkgb3JkZXIuICovCi1leHRlcm4gaW50IGRlZndOZXRQYXRoU3RhcnQoY29uc3QgY2hhciogdHlwKTsgLy8gUk9VVEVEIHwgRklYRUQgfCBDT1ZFUiB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9TSElFTEQgfCBORVcgCi1leHRlcm4gaW50IGRlZndOZXRQYXRoV2lkdGgoaW50IHcpOyAgICAgICAgICAgLyogd2lkdGggKi8KLWV4dGVybiBpbnQgZGVmd05ldFBhdGhMYXllcihjb25zdCBjaGFyKiBuYW1lLCAvKiBsYXllck5hbWUgKi8KLSAgICAgICAgICAgICAgICAgaW50IGlzVGFwZXIsICAgICAgICAgICAgICAgICAvKiAwIC0gaWdub3JlLCAxIC0gVEFQRVIgKi8KLSAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcnVsZW5hbWUpOyAgICAgICAvKiBvbmx5IG9uZSwgaXNUYXBlciBvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcnVsZW5hbWUgY2FuIGJlIGFzc2lnbmVkICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0gKiBUaGlzIGlzIGEgNS42IHN5bnRheC4gKi8KLWV4dGVybiBpbnQgZGVmd05ldFBhdGhTdHlsZShpbnQgc3R5bGVOdW0pOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0gKiBUaGlzIGlzIGEgNS44IHN5bnRheC4gKi8KLWV4dGVybiBpbnQgZGVmd05ldFBhdGhNYXNrKGludCBtYXNrTnVtKTsKLQotZXh0ZXJuIGludCBkZWZ3TmV0UGF0aFJlY3QoaW50IGRlbHRhWDEsIGludCBkZWx0YVkxLCBpbnQgZGVsdGFYMiwgaW50IGRlbHRhWTIpOwotCi1leHRlcm4gaW50IGRlZndOZXRQYXRoVmlydHVhbChpbnQgeCwgaW50IHkpOwotCi0vKiB4IGFuZCB5IGxvY2F0aW9uIG9mIHRoZSBwYXRoICovCi1leHRlcm4gaW50IGRlZndOZXRQYXRoUG9pbnQoaW50IG51bVB0cywgICAgICAgLyogbnVtYmVyIG9mIGNvbm5lY3RlZCBwb2ludHMgKi8KLSAgICAgICAgICAgICAgICAgICBkb3VibGUqIHBvaW50eCwgICAgICAgLyogcG9pbnQgeCBsaXN0ICovCi0gICAgICAgICAgICAgICAgICAgZG91YmxlKiBwb2ludHkpOyAgICAgIC8qIHBvaW50IHkgbGlzdCAqLwotCi1leHRlcm4gaW50IGRlZndOZXRQYXRoUG9pbnRXaXRoRXh0KGludCBudW1QdHMsCi0JCQkJICAgZG91YmxlKiBwb2ludHgsCi0JCQkJICAgZG91YmxlKiBwb2ludHksCi0JCQkJICAgZG91YmxlKiBvcHRWYWx1ZSk7Ci0KLWV4dGVybiBpbnQgZGVmd05ldFBhdGhWaWEoY29uc3QgY2hhciogbmFtZSk7ICAvKiB2aWFOYW1lICovCi0KLWV4dGVybiBpbnQgZGVmd05ldFBhdGhWaWFXaXRoT3JpZW50KGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3JpZW50KTsgIC8qIG9wdGlvbmFsKC0xKSAqLwotCi1leHRlcm4gaW50IGRlZndOZXRQYXRoVmlhV2l0aE9yaWVudFN0cihjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogb3JpZW50KTsgLyogb3B0aW9uYWwoTnVsbCkgKi8KLWV4dGVybiBpbnQgZGVmd05ldFBhdGhFbmQoKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhdCB0aGUgZW5kIG9mIGVhY2ggbmV0ICovCi1leHRlcm4gaW50IGRlZndOZXRFbmRPbmVOZXQoKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSBuZXQgc2VjdGlvbiAqLwotZXh0ZXJuIGludCBkZWZ3RW5kTmV0cygpOwotCi0vKiBUaGlzIHNlY3Rpb24gb2Ygcm91dGluZXMgaXMgb3B0aW9uYWwuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLSAqIFRoZSByb3V0aW5lIHN0YXJ0cyB0aGUgSS9PIFRpbWluZyBzZWN0aW9uLiBBbGwgb2YgdGhlIGlvdGltaW5ncyBvcHRpb25zCi0gKiBtdXN0IGZvbGxvdy4KLSAqIFRoZSBjb3VudCBpcyB0aGUgbnVtYmVyIG9mIGRlZndJT1RpbWluZyBjYWxscyB0byBmb2xsb3cuCi0gKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4KLSAqIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gKi8KLWV4dGVybiBpbnQgZGVmd1N0YXJ0SU9UaW1pbmdzKGludCBjb3VudCk7Ci0KLS8qIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIGFmdGVyIGRlZndTdGFyYXRJT1RpbWluZwotICogSXQgaXMgZm9yIC0gLSB7KGNvbXAgcGluKSB8IChQSU4gbmFtZSl9Ci0gKiBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuICovCi1leHRlcm4gaW50IGRlZndJT1RpbWluZyhjb25zdCBjaGFyKiBpbnN0LCAgICAgIC8qIGNvbXBOYW1lIHwgUElOICovCi0gICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGluKTsgICAgICAgICAgIC8qIHBpbk5hbWUgKi8KLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciArIHsgUklTRSB8IEZBTEwgfSBWQVJJQUJMRSBtaW4gbWF4Ci0gKiBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuICovCi1leHRlcm4gaW50IGRlZndJT1RpbWluZ1ZhcmlhYmxlKGNvbnN0IGNoYXIqIHJpc2VGYWxsLCAgLyogUklTRSB8IEZBTEwgKi8KLSAgICAgICAgICAgICAgICAgICBpbnQgbnVtMSwgICAgICAgICAgICAgICAgICAgLyogbWluICovCi0gICAgICAgICAgICAgICAgICAgaW50IG51bTIpOyAgICAgICAgICAgICAgICAgIC8qIG1heCAqLwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yICsgeyBSSVNFIHwgRkFMTCB9IFNMRVdSQVRFIG1pbiBtYXgKLSAqIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gKi8KLWV4dGVybiBpbnQgZGVmd0lPVGltaW5nU2xld3JhdGUoY29uc3QgY2hhciogcmlzZUZhbGwsICAvKiBSSVNFIHwgRkFMTCAqLwotICAgICAgICAgICAgICAgICAgIGludCBudW0xLCAgICAgICAgICAgICAgICAgICAvKiBtaW4gKi8KLSAgICAgICAgICAgICAgICAgICBpbnQgbnVtMik7ICAgICAgICAgICAgICAgICAgLyogbWF4ICovCi0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgKyBEUklWRUNFTEwgbWFjcm9OYW1lIFtbRlJPTVBJTiBwaW5OYW1lXSBUT1BJTiBwaW5OYW1lXQotICogW1BBUkFMTEVMIG51bURyaXZlcnNdCi0gKiBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuICovCi1leHRlcm4gaW50IGRlZndJT1RpbWluZ0RyaXZlY2VsbChjb25zdCBjaGFyKiBuYW1lLCAgIC8qIG1hY3JvTmFtZSovCi0gICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZnJvbVBpbiwgICAgICAgIC8qIG9wdGlvbmFsKE5VTEwpICovCi0gICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdG9QaW4sICAgICAgICAgIC8qIG9wdGlvbmFsKE5VTEwpICovCi0gICAgICAgICAgICAgICAgICAgaW50IG51bURyaXZlcnMpOyAgICAgICAgICAgIC8qIG9wdGlvbmFsKDApICovCi0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgKyBDQVBBQ0lUQU5DRSBjYXBhY2l0YW5jZQotICogVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAqLwotZXh0ZXJuIGludCBkZWZ3SU9UaW1pbmdDYXBhY2l0YW5jZShkb3VibGUgbnVtKTsKLQotLyogVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAqLwotZXh0ZXJuIGludCBkZWZ3RW5kSU9UaW1pbmdzKCk7Ci0KLS8qIFJvdXRpbmVzIHRvIGVudGVyIHNjYW4gY2hhaW5zLiAgVGhpcyBzZWN0aW9uIGlzIG9wdGlvbmFsCi0gKiBUaGUgc2VjdGlvbiBtdXN0IHN0YXJ0IHdpdGggYSBkZWZ3U3RhcnRTY2FuY2hhaW5zKCkgY2FsbCBhbmQKLSAqIGVuZCB3aXRoIGEgZGVmd0VuZFNjYW5jaGFpbigpIGNhbGwuCi0gKiBFYWNoIHNjYW4gY2hhaW4gYmVnaW5zIHdpdGggYSBkZWZ3U2NhbmNoYWluKCkgY2FsbC4KLSAqIFRoZSByZXN0IG9mIHRoZSBjYWxscyBmb2xsb3cuICAqLwotZXh0ZXJuIGludCBkZWZ3U3RhcnRTY2FuY2hhaW5zKGludCBjb3VudCk7Ci0KLS8qIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIGFmdGVyIGRlZndTdGFydFNjYW5jaGFpbnMKLSAqIEl0IGlzIGZvciAtIGNoYWluTmFtZSAqLwotZXh0ZXJuIGludCBkZWZ3U2NhbmNoYWluKGNvbnN0IGNoYXIqIG5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yICsgQ09NTU9OU0NBTlBJTlMgW0lOIHBpbl0gW09VVCBwaW5dICovCi1leHRlcm4gaW50IGRlZndTY2FuY2hhaW5Db21tb25zY2FucGlucygKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGluc3QxLCAgICAgIC8qIG9wdGlvbmFsKE5VTEwpIC0gSU4gfCBPVVQqLwotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGluMSwgICAgICAgLyogY2FuJ3QgYmUgbnVsbCBpZiBpbnN0MSBpcyBzZXQgKi8KLQkgICAgICAgICAgY29uc3QgY2hhciogaW5zdDIsICAgICAgLyogb3B0aW9uYWwoTlVMTCkgLSBJTiB8IE9VVCAqLwotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGluMik7ICAgICAgLyogY2FuJ3QgYmUgbnVsbCBpZiBpbnN0MiBpcyBzZXQgKi8KLQotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yICsgUEFSVElUSU9OIHBhcmF0aXRpb25OYW1lIFtNQVhCSVRTIG1heEJpdHNdICovCi0vKiBUaGlzIGlzIDUuNC4xIHN5bnRheCAqLwotZXh0ZXJuIGludCBkZWZ3U2NhbmNoYWluUGFydGl0aW9uKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICBpbnQgbWF4Qml0cyk7ICAgICAgICAgICAvKiBvcHRpb25hbCgtMSkgKi8KLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciArIFNUQVJUIHtmaXhlZEluQ29tcCB8IFBJTiB9IFtvdXRQaW5dICovCi1leHRlcm4gaW50IGRlZndTY2FuY2hhaW5TdGFydChjb25zdCBjaGFyKiBpbnN0LCAgIC8qIGZpeGVkSW5Db21wIHwgUElOICovCi0gICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwaW4pOyAgICAgICAgICAgICAgIC8qIG91dFBpbiAqLwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yICsgU1RPUCB7Zml4ZWRPdXRDb21wIHwgUElOIH0gW2luUGluXSAqLwotZXh0ZXJuIGludCBkZWZ3U2NhbmNoYWluU3RvcChjb25zdCBjaGFyKiBpbnN0LCAgICAvKiBmaXhlZE91dENvbXAgfCBQSU4gKi8KLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBpbik7ICAgICAgICAgICAgICAgLyogaW5QaW4gKi8KLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciArIEZMT0FUSU5HIHtmbG9hdGluZ0NvbXAgW0lOIHBpbl0gW09VVCBwaW5dfQotICogVGhpcyBpcyBhIDUuNC4xIHN5bnRheCAqLwotZXh0ZXJuIGludCBkZWZ3U2NhbmNoYWluRmxvYXRpbmcoY29uc3QgY2hhciogbmFtZSwgICAvKiBmbG9hdGluZ0NvbXAgKi8KLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGluc3QxLCAgICAgIC8qIG9wdGlvbmFsKE5VTEwpIC0gSU4gfCBPVVQgKi8KLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBpbjEsICAgICAgIC8qIGNhbid0IGJlIG51bGwgaWYgaW5zdDEgaXMgc2V0ICovCi0JICAgICAgICAgIGNvbnN0IGNoYXIqIGluc3QyLCAgICAgIC8qIG9wdGlvbmFsKE5VTEwpIC0gSU4gfCBPVVQgKi8KLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBpbjIpOyAgICAgIC8qIGNhbid0IGJlIG51bGwgaWYgaW5zdDIgaXMgc2V0ICovCi0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgKyBGTE9BVElORyB7ZmxvYXRpbmdDb21wIFtJTiBwaW5dIFtPVVQgcGluXX0KLSAqIFRoaXMgaXMgYSA1LjQuMSBzeW50YXguCi0gKiBUaGlzIHJvdXRpbmUgaXMgdGhlIHNhbWUgYXMgZGVmd1NjYW5jaGFpbkZsb2F0aW5nLiAgQnV0IGFsc28gYWRkZWQKLSAqIHRoZSBvcHRpb24gQklUUy4gKi8KLWV4dGVybiBpbnQgZGVmd1NjYW5jaGFpbkZsb2F0aW5nQml0cyhjb25zdCBjaGFyKiBuYW1lLCAgIC8qIGZsb2F0aW5nQ29tcCAqLwotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogaW5zdDEsICAgICAgLyogb3B0aW9uYWwoTlVMTCkgLSBJTiB8IE9VVCAqLwotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGluMSwgICAgICAgLyogY2FuJ3QgYmUgbnVsbCBpZiBpbnN0MSBpcyBzZXQgKi8KLQkgICAgICAgICAgY29uc3QgY2hhciogaW5zdDIsICAgICAgLyogb3B0aW9uYWwoTlVMTCkgLSBJTiB8IE9VVCAqLwotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGluMiwgICAgICAgLyogY2FuJ3QgYmUgbnVsbCBpZiBpbnN0MiBpcyBzZXQgKi8KLSAgICAgICAgICAgICAgICAgIGludCAgIGJpdHMpOyAgICAgICAgICAgIC8qIG9wdGlvbmFsICgtMSkgKi8KLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciArIE9SREVSRUQge2ZpeGVkQ29tcCBbSU4gcGluXSBbT1VUIHBpbl0KLSAqIGZpeGVkQ29tcCBbSU4gcGluXSBbT1VUIHBpbl0uCi0gKiBXaGVuIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgZm9yIHRoZSAxc3QgdGltZSB3aXRoaW4gYSBzY2FuY2hhaW4sIAotICogYm90aCBuYW1lMSBhbmQgbmFtZTIgYXJlIHJlcXVpcmVkLiAgT25seSBuYW1lMSBpcyByZXF1aXJlZCBpcyB0aGUKLSAqIHJvdXRpbmUgaXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLiAqLwotZXh0ZXJuIGludCBkZWZ3U2NhbmNoYWluT3JkZXJlZChjb25zdCBjaGFyKiBuYW1lMSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGluc3QxLCAgICAgIC8qIG9wdGlvbmFsKE5VTEwpIC0gSU4gfCBPVVQgKi8KLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBpbjEsICAgICAgIC8qIGNhbid0IGJlIG51bGwgaWYgaW5zdDEgaXMgc2V0ICovCi0JICAgICAgICAgIGNvbnN0IGNoYXIqIGluc3QyLCAgICAgIC8qIG9wdGlvbmFsKE5VTEwpIC0gSU4gfCBPVVQgKi8KLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBpbjIsICAgICAgIC8qIGNhbid0IGJlIG51bGwgaWYgaW5zdDIgaXMgc2V0ICovCi0gICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lMiwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGluc3QzLCAgICAgIC8qIG9wdGlvbmFsKE5VTEwpIC0gSU4gfCBPVVQgKi8KLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBpbjMsICAgICAgIC8qIGNhbid0IGJlIG51bGwgaWYgaW5zdDMgaXMgc2V0ICovCi0JICAgICAgICAgIGNvbnN0IGNoYXIqIGluc3Q0LCAgICAgIC8qIG9wdGlvbmFsKE5VTEwpIC0gSU4gfCBPVVQgKi8KLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBpbjQpOyAgICAgIC8qIGNhbid0IGJlIG51bGwgaWYgaW5zdDQgaXMgc2V0ICovCi0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgKyBPUkRFUkVEIHtmaXhlZENvbXAgW0lOIHBpbl0gW09VVCBwaW5dCi0gKiBmaXhlZENvbXAgW0lOIHBpbl0gW09VVCBwaW5dLgotICogV2hlbiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZvciB0aGUgMXN0IHRpbWUgd2l0aGluIGEgc2NhbmNoYWluLCAKLSAqIGJvdGggbmFtZTEgYW5kIG5hbWUyIGFyZSByZXF1aXJlZC4gIE9ubHkgbmFtZTEgaXMgcmVxdWlyZWQgaXMgdGhlCi0gKiByb3V0aW5lIGlzIGNhbGxlZCBtb3JlIHRoYW4gb25jZS4KLSAqIFRoaXMgaXMgYSA1LjQuMSBzeW50YXguCi0gKiBUaGlzIHJvdXRpbmUgaXMgdGhlIHNhbWUgYXMgZGVmd1NjYW5jaGFpbk9yZGVyZWQuICBCdXQgYWxzbyBhZGRlZAotICogdGhlIG9wdGlvbiBCSVRTICovCi1leHRlcm4gaW50IGRlZndTY2FuY2hhaW5PcmRlcmVkQml0cyhjb25zdCBjaGFyKiBuYW1lMSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGluc3QxLCAgICAgIC8qIG9wdGlvbmFsKE5VTEwpIC0gSU4gfCBPVVQgKi8KLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBpbjEsICAgICAgIC8qIGNhbid0IGJlIG51bGwgaWYgaW5zdDEgaXMgc2V0ICovCi0JICAgICAgICAgIGNvbnN0IGNoYXIqIGluc3QyLCAgICAgIC8qIG9wdGlvbmFsKE5VTEwpIC0gSU4gfCBPVVQgKi8KLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBpbjIsICAgICAgIC8qIGNhbid0IGJlIG51bGwgaWYgaW5zdDIgaXMgc2V0ICovCi0gICAgICAgICAgICAgICAgICBpbnQgICBiaXRzMSwgICAgICAgICAgICAvKiBvcHRpb25hbCgtMSkgKi8KLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUyLAotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogaW5zdDMsICAgICAgLyogb3B0aW9uYWwoTlVMTCkgLSBJTiB8IE9VVCAqLwotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGluMywgICAgICAgLyogY2FuJ3QgYmUgbnVsbCBpZiBpbnN0MyBpcyBzZXQgKi8KLQkgICAgICAgICAgY29uc3QgY2hhciogaW5zdDQsICAgICAgLyogb3B0aW9uYWwoTlVMTCkgLSBJTiB8IE9VVCAqLwotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGluNCwgICAgICAgLyogY2FuJ3QgYmUgbnVsbCBpZiBpbnN0NCBpcyBzZXQgKi8KLSAgICAgICAgICAgICAgICAgIGludCAgIGJpdHMyKTsgICAgICAgICAgIC8qIG9wdGlvbmFsKC0xKSAqLwotCi1leHRlcm4gaW50IGRlZndFbmRTY2FuY2hhaW4oKTsKLQotLyogUm91dGluZXMgdG8gZW50ZXIgY29uc3RyYWludHMuICBUaGlzIHNlY3Rpb24gaXMgb3B0aW9uYWwKLSAqIFRoZSBzZWN0aW9uIG11c3Qgc3RhcnQgd2l0aCBhIGRlZndTdGFydENvbnN0cmFpbnMoKSBjYWxsIGFuZAotICogZW5kIHdpdGggYSBkZWZ3RW5kQ29uc3RyYWludHMoKSBjYWxsLgotICogRWFjaCBjb250cmFpbnQgd2lsbCBjYWxsIHRoZSBkZWZ3Q29uc3RyYWludC4uLigpLgotICogVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAqLwotZXh0ZXJuIGludCBkZWZ3U3RhcnRDb25zdHJhaW50cyAoaW50IGNvdW50KTsgIC8qIG9wdGlvbmFsICovCi0KLS8qIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgYXJlIGZvciAtIHtvcGVyYW5kIFsrIFJJU0VNQVggdGltZV0gWysgRkFMTE1BWCB0aW1lXQotICogWysgUklTRU1JTiB0aW1lXSBbKyBGQUxMTUlOIHRpbWVdIHwgV0lSRURMT0dJQyBuZXROYW1lIE1BWERJU1QgZGlzdGFuY2UgfTt9Ci0gKiBvcGVyYW5kIC0gTkVUIG5ldE5hbWUgfCBQQVRIIGNvbXAgZnJvbVBpbiBjb21wIHRvUGluIHwgU1VNIChvcGVyYW5kLCAuLi4pCi0gKiBUaGUgZm9sbG93aW5nIGFwaXMgYXJlIG9ic29sZXRlIGluIDUuNC4gKi8gCi1leHRlcm4gaW50IGRlZndDb25zdHJhaW50T3BlcmFuZCgpOyAgICAgICAgICAvKiBiZWdpbiBhbiBvcGVyYW5kICovCi1leHRlcm4gaW50IGRlZndDb25zdHJhaW50T3BlcmFuZE5ldChjb25zdCBjaGFyKiBuZXROYW1lKTsgIC8qIE5FVCAqLwotZXh0ZXJuIGludCBkZWZ3Q29uc3RyYWludE9wZXJhbmRQYXRoKGNvbnN0IGNoYXIqIGNvbXAxLCAgICAvKiBQQVRIIC0gY29tcHxQSU4gKi8KLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZyb21QaW4sCi0gICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb21wMiwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRvUGluKTsKLWV4dGVybiBpbnQgZGVmd0NvbnN0cmFpbnRPcGVyYW5kU3VtKCk7ICAgICAgICAvKiBTVU0gKi8KLWV4dGVybiBpbnQgZGVmd0NvbnN0cmFpbnRPcGVyYW5kU3VtRW5kKCk7ICAgICAvKiBtYXJrIHRoZSBlbmQgb2YgU1VNICovCi1leHRlcm4gaW50IGRlZndDb25zdHJhaW50T3BlcmFuZFRpbWUoY29uc3QgY2hhciogdGltZVR5cGUsIC8vICBSSVNFTUFYIHwgRkFMTE1BWCB8IFJJU0VNSU4gfCBGQUxMTUlOCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWUpOwotZXh0ZXJuIGludCBkZWZ3Q29uc3RyYWludE9wZXJhbmRFbmQoKTsgICAgICAgIC8qIG1hcmsgdGhlIGVuZCBvZiBvcGVyYW5kICovCi0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgLSBXSVJFTE9HSUMgbmV0TmFtZSBNQVhESVNUIGRpc3RhbmNlICovCi1leHRlcm4gaW50IGRlZndDb25zdHJhaW50V2lyZWRsb2dpYyhjb25zdCBjaGFyKiBuZXROYW1lLAotICAgICAgICAgICAgICAgICAgaW50IGRpc3RhbmNlKTsKLQotZXh0ZXJuIGludCBkZWZ3RW5kQ29uc3RyYWludHMgKCk7Ci0KLS8qIFJvdXRpbmVzIHRvIGVudGVyIGdyb3Vwcy4gIFRoaXMgc2VjdGlvbiBpcyBvcHRpb25hbAotICogVGhlIHNlY3Rpb24gbXVzdCBzdGFydCB3aXRoIGEgZGVmd1N0YXJ0R3JvdXBzKCkgY2FsbCBhbmQKLSAqIGVuZCB3aXRoIGEgZGVmd0VuZEdyb3VwcygpIGNhbGwuCi0gKiBFYWNoIGdyb3VwIHdpbGwgY2FsbCB0aGUgZGVmd0dyb3VwLi4uKCkuICovCi1leHRlcm4gaW50IGRlZndTdGFydEdyb3VwcyAoaW50IGNvdW50KTsgIC8qIG9wdGlvbmFsICovCi0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgLSBncm91cE5hbWUgY29tcE5hbWVSZWdFeHByIC4uLiAqLwotZXh0ZXJuIGludCBkZWZ3R3JvdXAoY29uc3QgY2hhciogZ3JvdXBOYW1lLAotICAgICAgICAgICAgICAgICAgIGludCBudW1FeHByLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiBncm91cEV4cHIpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yICsgU09GVCBbTUFYSEFMRlBFUklNRVRFUiB2YWx1ZV0gW01BWFggdmFsdWVdCi0gKiBbTUFYWSB2YWx1ZV0gKi8KLWV4dGVybiBpbnQgZGVmd0dyb3VwU29mdChjb25zdCBjaGFyKiB0eXBlMSwgLyogTUFYSEFMRlBFUklNRVRFUiB8IE1BWFggfCBNQVhZICovCi0gICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbHVlMSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0eXBlMiwKLSAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsdWUyLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHR5cGUzLAotICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZTMpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yICsgUkVHSU9OIHtwdCBwdCB8IHJlZ2lvbk5hbWV9ICovCi1leHRlcm4gaW50IGRlZndHcm91cFJlZ2lvbihpbnQgeGwsIGludCB5bCwgICAvKiBlaXRoZXIgdGhlIHggJiB5IG9yICAgICovCi0gICAgICAgICAgICAgICAgICAgaW50IHhoLCBpbnQgeWgsICAgICAgICAgICAvKiByZWdpb25OYW1lIG9ubHksIGNhbid0ICovCi0gICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcmVnaW9uTmFtZSk7ICAvKiBiZSBib3RoICovCi0KLWV4dGVybiBpbnQgZGVmd0VuZEdyb3VwcygpOwotCi0vKiBSb3V0aW5lcyB0byBlbnRlciBCbG9ja2FnZXMuICBUaGlzIHNlY3Rpb24gaXMgb3B0aW9uYWwKLSAqIFRoZSBzZWN0aW9uIG11c3Qgc3RhcnQgd2l0aCBhIGRlZndTdGFydEJsb2NrYWdlcygpIGNhbGwgYW5kCi0gKiBlbmQgd2l0aCBhIGRlZndFbmRCbG9ja2FnZXMoKSBjYWxsLgotICogRWFjaCBibG9ja2FnZSB3aWxsIGNhbGwgdGhlIGRlZndCbG9ja2FnZXMuLi4oKS4KLSAqIFRoaXMgaXMgYSA1LjQgc3ludGF4LiAqLwotZXh0ZXJuIGludCBkZWZ3U3RhcnRCbG9ja2FnZXMoaW50IGNvdW50KTsgICAvKiBjb3VudCA9IG51bUJsb2NrYWdlcyAqLwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yIC0gbGF5ZXJOYW1lCi0qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgcGVyIGVudHJ5IHdpdGhpbiBhIGJsb2NrYWdlIGZvciBsYXllci4KLSogVGhpcyBpcyBhIDUuNCBzeW50YXguICovCi1leHRlcm4gaW50IGRlZndCbG9ja2FnZXNMYXllcihjb25zdCBjaGFyKiBsYXllck5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yIC0gc2xvdHMgCi0qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgcGVyIGVudHJ5IHdpdGhpbiBhIGJsb2NrYWdlIGxheWVyLCBjYW4ndCBiZSBtb3JlIHRoZW4gb25lLgotKiBUaGlzIGlzIGEgNS40IHN5bnRheC4gKi8KLWV4dGVybiBpbnQgZGVmd0Jsb2NrYWdlc0xheWVyU2xvdHMoKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciAtIGZpbGxzCi0qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgcGVyIGVudHJ5IHdpdGhpbiBhIGJsb2NrYWdlIGxheWVyLCBjYW4ndCBiZSBtb3JlIHRoZW4gb25lLgotKiBUaGlzIGlzIGEgNS40IHN5bnRheC4gKi8KLWV4dGVybiBpbnQgZGVmd0Jsb2NrYWdlc0xheWVyRmlsbHMoKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciAtIHB1c2hkb3duCi0qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgcGVyIGVudHJ5IHdpdGhpbiBhIGJsb2NrYWdlIGxheWVyLCBjYW4ndCBiZSBtb3JlIHRoZW4gb25lLgotKiBUaGlzIGlzIGEgNS40IHN5bnRheC4gKi8KLWV4dGVybiBpbnQgZGVmd0Jsb2NrYWdlc0xheWVyUHVzaGRvd24oKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciAtIGV4Y2VwdHBnbmV0Ci0qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgcGVyIGVudHJ5IHdpdGhpbiBhIGJsb2NrYWdlIGxheWVyLCBjYW4ndCBiZSBtb3JlIHRoZW4gb25lLgotKiBUaGlzIGlzIGEgNS43IHN5bnRheC4gKi8KLWV4dGVybiBpbnQgZGVmd0Jsb2NrYWdlc0xheWVyRXhjZXB0cGduZXQoKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciAtIGNvbXBvbmVudAotKiBUaGlzIHJvdXRpbmUgY2FsbGVkIHBlciBlbnRyeSB3aXRoaW4gYSBibG9ja2FnZSBsYXllciwgY2FuJ3QgYmUgbW9yZSB0aGFuIG9uZS4KLSogVGhpcyBpcyBhIDUuNiBzeW50YXguICovCi1leHRlcm4gaW50IGRlZndCbG9ja2FnZXNMYXllckNvbXBvbmVudChjb25zdCBjaGFyKiBjb21wTmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgLSBzcGFjaW5nCi0qIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgZGVmd0Jsb2NrYWdlc0Rlc2lnblJ1bGVXaWR0aCBpcyBjYWxsZWQgcGVyIGVudHJ5Ci0qIHdpdGhpbiBhIGJsb2NrYWdlIGxheWVyLCBjYW4ndCBiZSBtb3JlIHRoYW4gb25lLgotKiBUaGlzIGlzIGEgNS42IHN5bnRheC4gKi8KLWV4dGVybiBpbnQgZGVmd0Jsb2NrYWdlc0xheWVyU3BhY2luZyhpbnQgbWluU3BhY2luZyk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgLSBkZXNpZ25ydWxld2lkdGgKLSogRWl0aGVyIHRoaXMgcm91dGluZSBvciBkZWZ3QmxvY2thZ2VzU3BhY2luZyBpcyBjYWxsZWQgcGVyIGVudHJ5Ci0qIHdpdGhpbiBhIGJsb2NrYWdlIGxheWVyLCBjYW4ndCBiZSBtb3JlIHRoYW4gb25lLgotKiBUaGlzIGlzIGEgNS42IHN5bnRheC4gKi8KLWV4dGVybiBpbnQgZGVmd0Jsb2NrYWdlc0xheWVyRGVzaWduUnVsZVdpZHRoKGludCBlZmZlY3RpdmVXaWR0aCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgLSBtYXNrLgotKiBUaGlzIHJvdXRpbmUgY2FsbGVkIHBlciBlbnRyeSB3aXRoaW4gYSBibG9ja2FnZSBsYXllciwgY2FuJ3QgYmUgbW9yZSB0aGFuIG9uZS4KLSogVGhpcyBpcyBhIDUuOCBzeW50YXguICovCi1leHRlcm4gaW50IGRlZndCbG9ja2FnZXNMYXllck1hc2soaW50IG1hc2tDb2xvcik7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgLSBsYXllck5hbWUgJiBjb21wTmFtZQotICogRWl0aGVyIHRoaXMgcm91dGluZSwgZGVmQmxvY2thZ2VMYXllclNsb3RzLCBkZWZCbG9ja2FnZUxheWVyRmlsbHMsCi0gKiBvciBkZWZ3QmxvY2thZ2VQbGFjZW1lbnQgaXMgY2FsbGVkIHBlciBlbnRyeSB3aXRoaW4KLSAqIGEgYmxvY2thZ2UsIGNhbid0IGJlIG1vcmUgdGhlbiBvbmUuCi0gKiBUaGlzIGlzIGEgNS40IHN5bnRheC4gKi8KLWV4dGVybiBpbnQgZGVmd0Jsb2NrYWdlTGF5ZXIoY29uc3QgY2hhciogbGF5ZXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb21wTmFtZSk7ICAgLyogb3B0aW9uYWwoTlVMTCkgKi8KLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciAtIGxheWVyTmFtZSAmIHNsb3RzIAotICogRWl0aGVyIHRoaXMgcm91dGluZSwgZGVmQmxvY2thZ2VMYXllciwgZGVmQmxvY2thZ2VMYXllckZpbGxzLAotICogZGVmd0Jsb2NrYWdlUGxhY2VtZW50LCBvciBkZWZ3QmxvY2thZ2VQdXNoZG93biBpcyBjYWxsZWQgcGVyIGVudHJ5IHdpdGhpbgotICogYSBibG9ja2FnZSwgY2FuJ3QgYmUgbW9yZSB0aGVuIG9uZS4KLSAqIFRoaXMgaXMgYSA1LjQgc3ludGF4LiAqLwotZXh0ZXJuIGludCBkZWZ3QmxvY2thZ2VMYXllclNsb3RzKGNvbnN0IGNoYXIqIGxheWVyTmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgLSBsYXllck5hbWUgJiBmaWxscwotICogRWl0aGVyIHRoaXMgcm91dGluZSwgZGVmQmxvY2thZ2VMYXllciwgZGVmQmxvY2thZ2VMYXllclNsb3RzLAotICogZGVmd0Jsb2NrYWdlUGxhY2VtZW50LCBvciBkZWZ3QmxvY2thZ2VQdXNoZG93biBpcyBjYWxsZWQgcGVyIGVudHJ5IHdpdGhpbgotICogYSBibG9ja2FnZSwgY2FuJ3QgYmUgbW9yZSB0aGVuIG9uZS4KLSAqIFRoaXMgaXMgYSA1LjQgc3ludGF4LiAqLwotZXh0ZXJuIGludCBkZWZ3QmxvY2thZ2VMYXllckZpbGxzKGNvbnN0IGNoYXIqIGxheWVyTmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgLSBsYXllck5hbWUgJiBwdXNoZG93bgotICogRWl0aGVyIHRoaXMgcm91dGluZSwgZGVmQmxvY2thZ2VMYXllciwgZGVmQmxvY2thZ2VMYXllclNsb3RzLAotICogZGVmd0Jsb2NrYWdlUGxhY2VtZW50LCBvciBkZWZ3QmxvY2thZ2VGaWxscyBpcyBjYWxsZWQgcGVyIGVudHJ5IHdpdGhpbgotICogYSBibG9ja2FnZSwgY2FuJ3QgYmUgbW9yZSB0aGVuIG9uZS4KLSAqIFRoaXMgaXMgYSA1LjQgc3ludGF4LiAqLwotZXh0ZXJuIGludCBkZWZ3QmxvY2thZ2VMYXllclB1c2hkb3duKGNvbnN0IGNoYXIqIGxheWVyTmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgLSBleGNlcHRwZ25ldAotICogRWl0aGVyIHRoaXMgcm91dGluZSwgZGVmQmxvY2thZ2VMYXllciwgZGVmQmxvY2thZ2VMYXllclNsb3RzLAotICogZGVmd0Jsb2NrYWdlUGxhY2VtZW50LCBvciBkZWZ3QmxvY2thZ2VGaWxscyBpcyBjYWxsZWQgcGVyIGVudHJ5IHdpdGhpbgotICogYSBibG9ja2FnZSwgY2FuJ3QgYmUgbW9yZSB0aGVuIG9uZS4KLSAqIFRoaXMgaXMgYSA1Ljcgc3ludGF4LiAqLwotZXh0ZXJuIGludCBkZWZ3QmxvY2thZ2VMYXllckV4Y2VwdHBnbmV0KGNvbnN0IGNoYXIqIGxheWVyTmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgLSBzcGFjaW5nCi0gKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGRlZndCbG9ja2FnZURlc2lnblJ1bGVXaWR0aCBpcyBjYWxsZWQgcGVyIGVudHJ5Ci0gKiB3aXRoaW4gYSBibG9ja2FnZSwgY2FuJ3QgYmUgbW9yZSB0aGFuIG9uZS4KLSAqIFRoaXMgaXMgYSA1LjYgc3ludGF4LiAqLwotZXh0ZXJuIGludCBkZWZ3QmxvY2thZ2VTcGFjaW5nKGludCBtaW5TcGFjaW5nKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciAtIGRlc2lnbnJ1bGV3aWR0aAotICogRWl0aGVyIHRoaXMgcm91dGluZSBvciBkZWZ3QmxvY2thZ2VTcGFjaW5nIGlzIGNhbGxlZCBwZXIgZW50cnkKLSAqIHdpdGhpbiBhIGJsb2NrYWdlLCBjYW4ndCBiZSBtb3JlIHRoYW4gb25lLgotICogVGhpcyBpcyBhIDUuNiBzeW50YXguICovCi1leHRlcm4gaW50IGRlZndCbG9ja2FnZURlc2lnblJ1bGVXaWR0aChpbnQgZWZmZWN0aXZlV2lkdGgpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yIC0gcGxhY2VtZW50Ci0gKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHBlciBlbnRyeSB3aXRoaW4gYmxvY2thZ2UgZm9yIHBsYWNlbWVudC4KLSAqIFRoaXMgaXMgYSA1LjQgc3ludGF4LgotICogMTEvMjUvMjAwMiAtIGJ1ZyBmaXg6IHN1Ym1pdHRlZCBieSBDcmFpZyBGaWxlcyAoY2ZpbGVzQGZ0Yy5hZ2lsZW50LmNvbSkKLSAqIHRoaXMgcm91dGluZSBhbGxvd3MgdG8gY2FsbCBibG9ja2FnZSB3aXRob3V0IGEgY29tcG9uZW50LiAqLwotZXh0ZXJuIGludCBkZWZ3QmxvY2thZ2VzUGxhY2VtZW50KCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgLSBjb21wb25lbnQKLSogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBwZXIgZW50cnkgd2l0aGluIGJsb2NrYWdlIHBsYWNlbWVudCwgY2FuJ3QgYmUgbW9yZSB0aGVuIG9uZS4KLSogVGhpcyBpcyBhIDUuNCBzeW50YXguICovCi1leHRlcm4gaW50IGRlZndCbG9ja2FnZXNQbGFjZW1lbnRDb21wb25lbnQoY29uc3QgY2hhciogY29tcE5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yIC0gUHVzaGRvd24KLSogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBwZXIgZW50cnkgd2l0aGluIGJsb2NrYWdlIHBsYWNlbWVudCwgY2FuJ3QgYmUgbW9yZSB0aGVuIG9uZS4KLSogVGhpcyBpcyBhIDUuNCBzeW50YXguICovCi1leHRlcm4gaW50IGRlZndCbG9ja2FnZXNQbGFjZW1lbnRQdXNoZG93bigpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yIC0gc29mdAotKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGRlZndCbG9ja2FnZXNQbGFjZW1lbnRQYXJ0aWFsCi0qIGlzIGNhbGxlZCBwZXIgZW50cnkgd2l0aGluIGJsb2NrYWdlIHBsYWNlbWVudCwgY2FuJ3QgYmUgbW9yZSB0aGVuIG9uZS4KLSogVGhpcyBpcyBhIDUuNyBzeW50YXguICovCi1leHRlcm4gaW50IGRlZndCbG9ja2FnZXNQbGFjZW1lbnRTb2Z0KCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgLSBQYXJ0aWFsCi0qIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgZGVmd0Jsb2NrYWdlc1BsYWNlbWVudFNvZnQKLSogaXMgY2FsbGVkIHBlciBlbnRyeSB3aXRoaW4gYmxvY2thZ2UgcGxhY2VtZW50LCBjYW4ndCBiZSBtb3JlIHRoZW4gb25lLgotKiBUaGlzIGlzIGEgNS43IHN5bnRheC4gKi8KLWV4dGVybiBpbnQgZGVmd0Jsb2NrYWdlc1BsYWNlbWVudFBhcnRpYWwoZG91YmxlIG1heERlbnNpdHkpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yIHJlY3RhbmdsZS4KLSogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWUuIAotKiBUaGlzIGlzIGEgNS40IHN5bnRheC4gKi8KLWV4dGVybiBpbnQgZGVmd0Jsb2NrYWdlc1JlY3QoaW50IHhsLCBpbnQgeWwsIGludCB4aCwgaW50IHloKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciBwb2x5Z29uLgotKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZS4gCi0qIFRoaXMgaXMgYSA1LjYgc3ludGF4LiAqLwotZXh0ZXJuIGludCBkZWZ3QmxvY2thZ2VzUG9seWdvbihpbnQgbnVtX3BvbHlzLCBpbnQqIHhsLCBpbnQqIHlsKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciAtIHBsYWNlbWVudAotKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGRlZkJsb2NrYWdlTGF5ZXIKLSogaXMgY2FsbGVkIHBlciBlbnRyeSB3aXRoaW4gYmxvY2thZ2UsIGNhbid0IGJlIG1vcmUgdGhlbiBvbmUuCi0qIFRoaXMgaXMgYSA1LjQgc3ludGF4LgotKiAxMS8yNS8yMDAyIC0gYnVnIGZpeDogc3VibWl0dGVkIGJ5IENyYWlnIEZpbGVzIChjZmlsZXNAZnRjLmFnaWxlbnQuY29tKQotKiB0aGlzIHJvdXRpbmUgYWxsb3dzIHRvIGNhbGwgYmxvY2thZ2Ugd2l0aG91dCBhIGNvbXBvbmVudC4gKi8KLWV4dGVybiBpbnQgZGVmd0Jsb2NrYWdlUGxhY2VtZW50KCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgLSBwbGFjZW1lbnQgJiBjb21wb25lbnQKLSAqIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgZGVmd0Jsb2NrYWdlUGxhY2VtZW50UHVzaGRvd24KLSAqIGlzIGNhbGxlZCBwZXIgZW50cnkgd2l0aGluIGJsb2NrYWdlLCBjYW4ndCBiZSBtb3JlIHRoZW4gb25lLgotICogVGhpcyBpcyBhIDUuNCBzeW50YXguICovCi1leHRlcm4gaW50IGRlZndCbG9ja2FnZVBsYWNlbWVudENvbXBvbmVudChjb25zdCBjaGFyKiBjb21wTmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgLSBwbGFjZW1lbnQgJiBQdXNoZG93bgotICogRWl0aGVyIHRoaXMgcm91dGluZSBvciBkZWZ3QmxvY2thZ2VQbGFjZW1lbnRDb21wb25lbnQKLSAqIGlzIGNhbGxlZCBwZXIgZW50cnkgd2l0aGluIGJsb2NrYWdlLCBjYW4ndCBiZSBtb3JlIHRoZW4gb25lLgotICogVGhpcyBpcyBhIDUuNCBzeW50YXguICovCi1leHRlcm4gaW50IGRlZndCbG9ja2FnZVBsYWNlbWVudFB1c2hkb3duKCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgLSBwbGFjZW1lbnQgJiBzb2Z0Ci0gKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGRlZndCbG9ja2FnZVBsYWNlbWVudFB1c2hkb3duCi0gKiBpcyBjYWxsZWQgcGVyIGVudHJ5IHdpdGhpbiBibG9ja2FnZSwgY2FuJ3QgYmUgbW9yZSB0aGVuIG9uZS4KLSAqIFRoaXMgaXMgYSA1Ljcgc3ludGF4LiAqLwotZXh0ZXJuIGludCBkZWZ3QmxvY2thZ2VQbGFjZW1lbnRTb2Z0KCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgLSBwbGFjZW1lbnQgJiBQYXJ0aWFsCi0gKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGRlZndCbG9ja2FnZVBsYWNlbWVudENvbXBvbmVudAotICogaXMgY2FsbGVkIHBlciBlbnRyeSB3aXRoaW4gYmxvY2thZ2UsIGNhbid0IGJlIG1vcmUgdGhlbiBvbmUuCi0gKiBUaGlzIGlzIGEgNS43IHN5bnRheC4gKi8KLWV4dGVybiBpbnQgZGVmd0Jsb2NrYWdlUGxhY2VtZW50UGFydGlhbChkb3VibGUgbWF4RGVuc2l0eSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4KLSAqIFRoaXMgaXMgYSA1Ljggc3ludGF4LiAqLwotZXh0ZXJuIGludCBkZWZ3QmxvY2thZ2VNYXNrKGludCBtYXNrQ29sb3IpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yIHJlY3RhbmdsZS4KLSAqIFRoaXMgaXMgYSA1LjQgc3ludGF4LiAqLwotZXh0ZXJuIGludCBkZWZ3QmxvY2thZ2VSZWN0KGludCB4bCwgaW50IHlsLCBpbnQgeGgsIGludCB5aCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgcG9seWdvbi4KLSAqIFRoaXMgcm91dGluZSBpcyBvcHRpbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWUuIAotICogVGhpcyBpcyBhIDUuNiBzeW50YXguICovCi1leHRlcm4gaW50IGRlZndCbG9ja2FnZVBvbHlnb24oaW50IG51bV9wb2x5cywgaW50KiB4bCwgaW50KiB5bCk7Ci0KLS8qIFRoaXMgaXMgYSA1LjQgc3ludGF4LiAqLwotZXh0ZXJuIGludCBkZWZ3RW5kQmxvY2thZ2VzKCk7Ci0KLS8qIFJvdXRpbmVzIHRvIGVudGVyIFNsb3RzLiAgVGhpcyBzZWN0aW9uIGlzIG9wdGlvbmFsCi0gKiBUaGUgc2VjdGlvbiBtdXN0IHN0YXJ0IHdpdGggYSBkZWZ3U3RhcnRTbG90cygpIGNhbGwgYW5kCi0gKiBlbmQgd2l0aCBhIGRlZndFbmRTbG90cygpIGNhbGwuCi0gKiBFYWNoIHNsb3RzIHdpbGwgY2FsbCB0aGUgZGVmd1Nsb3RzLi4uKCkuCi0gKiBUaGlzIGlzIGEgNS40IHN5bnRheC4gKi8KLWV4dGVybiBpbnQgZGVmd1N0YXJ0U2xvdHMoaW50IGNvdW50KTsgICAvKiBjb3VudCA9IG51bVNsb3RzICovCi0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgLSBsYXllck5hbWUgJiBjb21wTmFtZQotICogRWl0aGVyIHRoaXMgcm91dGluZSwgZGVmU2xvdHMsIGRlZlNsb3RzTGF5ZXJGaWxscywKLSAqIG9yIGRlZndTbG90c1BsYWNlbWVudCBpcyBjYWxsZWQgcGVyIGVudHJ5IHdpdGhpbgotICogYSBzbG90LCBjYW4ndCBiZSBtb3JlIHRoZW4gb25lLgotICogVGhpcyBpcyBhIDUuNCBzeW50YXguICovCi1leHRlcm4gaW50IGRlZndTbG90TGF5ZXIoY29uc3QgY2hhciogbGF5ZXJOYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciByZWN0YW5nbGUKLSAqIFRoaXMgaXMgYSA1LjQgc3ludGF4LiAqLwotZXh0ZXJuIGludCBkZWZ3U2xvdFJlY3QoaW50IHhsLCBpbnQgeWwsIGludCB4aCwgaW50IHloKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciByZWN0YW5nbGUKLSAqIFRoaXMgaXMgYSA1LjYgc3ludGF4IGFuZCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWUuICovCi1leHRlcm4gaW50IGRlZndTbG90UG9seWdvbihpbnQgbnVtX3BvbHlzLCBkb3VibGUqIHhsLCBkb3VibGUqIHlsKTsKLQotLyogVGhpcyBpcyBhIDUuNCBzeW50YXguICovCi1leHRlcm4gaW50IGRlZndFbmRTbG90cygpOwotCi0vKiBSb3V0aW5lcyB0byBlbnRlciBGaWxscy4gIFRoaXMgc2VjdGlvbiBpcyBvcHRpb25hbAotICogVGhlIHNlY3Rpb24gbXVzdCBzdGFydCB3aXRoIGEgZGVmd1N0YXJ0RmlsbHMoKSBjYWxsIGFuZAotICogZW5kIHdpdGggYSBkZWZ3RW5kRmlsbHMoKSBjYWxsLgotICogRWFjaCBmaWxscyB3aWxsIGNhbGwgdGhlIGRlZndGaWxscy4uLigpLgotICogVGhpcyBpcyBhIDUuNCBzeW50YXguICovCi1leHRlcm4gaW50IGRlZndTdGFydEZpbGxzKGludCBjb3VudCk7ICAgLyogY291bnQgPSBudW1GaWxscyAqLwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgZm9yIC0gbGF5ZXJOYW1lICYgY29tcE5hbWUKLSAqIEVpdGhlciB0aGlzIHJvdXRpbmUsIGRlZkZpbGxzLCBkZWZGaWxsc0xheWVyRmlsbHMsCi0gKiBvciBkZWZ3RmlsbHNQbGFjZW1lbnQgaXMgY2FsbGVkIHBlciBlbnRyeSB3aXRoaW4KLSAqIGEgZmlsbCwgY2FuJ3QgYmUgbW9yZSB0aGVuIG9uZS4KLSAqIFRoaXMgaXMgYSA1LjQgc3ludGF4LiAqLwotZXh0ZXJuIGludCBkZWZ3RmlsbExheWVyKGNvbnN0IGNoYXIqIGxheWVyTmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4KLSAqIFRoaXMgaXMgYSA1Ljggc3ludGF4LiAqLwotZXh0ZXJuIGludCBkZWZ3RmlsbExheWVyTWFzayhpbnQgbWFza0NvbG9yKTsKLQotLyogVGhpcyByb3V0aW5lIGhhcyB0byBiZSBjYWxsZWQgYWZ0ZXIgZGVmd0ZpbGxMYXllcgotICogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLgotICogVGhpcyBpcyBhIDUuNyBzeW50YXguICovCi1leHRlcm4gaW50IGRlZndGaWxsTGF5ZXJPUEMoKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciByZWN0YW5nbGUuCi0gKiBUaGlzIGlzIGEgNS40IHN5bnRheC4gKi8KLWV4dGVybiBpbnQgZGVmd0ZpbGxSZWN0KGludCB4bCwgaW50IHlsLCBpbnQgeGgsIGludCB5aCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgcG9seWdvbi4KLSAqIFRoaXMgaXMgYSA1LjYgc3ludGF4IGFuZCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWUuICovCi1leHRlcm4gaW50IGRlZndGaWxsUG9seWdvbihpbnQgbnVtX3BvbHlzLCBkb3VibGUqIHhsLCBkb3VibGUqIHlsKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciB2aWEuCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0gKiBUaGlzIGlzIGEgNS43IHN5bnRheCBhbmQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lLiAqLwotZXh0ZXJuIGludCBkZWZ3RmlsbFZpYShjb25zdCBjaGFyKiB2aWFOYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLgotICogVGhpcyBpcyBhIDUuOCBzeW50YXguICovCi1leHRlcm4gaW50IGRlZndGaWxsVmlhTWFzayhpbnQgY29sb3JNYXNrKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciB2aWEgT1BDLgotICogVGhpcyByb3V0aW5lIGNhbiBvbmx5IGJlIGNhbGxlZCBhZnRlciBkZWZ3RmlsbFZpYS4KLSAqIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4KLSAqIFRoaXMgaXMgYSA1Ljcgc3ludGF4IGFuZCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWUuICovCi1leHRlcm4gaW50IGRlZndGaWxsVmlhT1BDKCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgdmlhIE9QQy4KLSAqIFRoaXMgcm91dGluZSBjYW4gb25seSBiZSBjYWxsZWQgYWZ0ZXIgZGVmd0ZpbGxWaWEuCi0gKiBUaGlzIHJvdXRpbmUgaXMgcmVxdWlyZWQgZm9sbG93aW5nIGRlZndGaWxsVmlhLgotICogVGhpcyBpcyBhIDUuNyBzeW50YXggYW5kIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZS4gKi8KLWV4dGVybiBpbnQgZGVmd0ZpbGxQb2ludHMoaW50IG51bV9wb2ludHMsIGRvdWJsZSogeGwsIGRvdWJsZSogeWwpOwotCi0vKiBUaGlzIGlzIGEgNS40IHN5bnRheC4gKi8KLWV4dGVybiBpbnQgZGVmd0VuZEZpbGxzKCk7Ci0KLS8qIFJvdXRpbmVzIHRvIGVudGVyIE5PTkRFRkFVTFRSVUxFUy4gIFRoaXMgc2VjdGlvbiBpcyByZXF1aXJlZAotICogVGhlIHNlY3Rpb24gbXVzdCBzdGFydCB3aXRoIGEgZGVmd1N0YXJ0Tm9uRGVmYXVsdFJ1bGVzKCkgYW5kCi0gKiBlbmQgd2l0aCBkZWZ3RW5kTm9uRGVmYXVsdFJ1bGVzKCkgY2FsbC4KLSAqIFRoaXMgaXMgYSA1LjYgc3ludGF4LiAqLwotZXh0ZXJuIGludCBkZWZ3U3RhcnROb25EZWZhdWx0UnVsZXMoaW50IGNvdW50KTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGZvciBMYXllciB3aXRoaW4gdGhlIE5PTkRFRkFVTFRSVUxFUwotICogVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuICBJdCBpcyByZXF1aXJlZC4KLSAqIFRoaXMgaXMgYSA1LjYgc3ludGF4LgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICovCi1leHRlcm4gaW50IGRlZndOb25EZWZhdWx0UnVsZShjb25zdCBjaGFyKiBydWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYXJkU3BhY2luZyk7ICAgLyogb3B0aW9uYWwoMCkgKi8KLQotLyogUm91dGluZXMgdG8gZW50ZXIgTk9OREVGQVVMVFJVTEVTLiAgVGhpcyBzZWN0aW9uIGlzIHJlcXVpcmVkCi0gKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGRlZndOb25EZWZhdWx0UnVsZS4gCi0gKiBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KLSAqIFRoaXMgaXMgYSA1LjYgc3ludGF4LgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICovCi1leHRlcm4gaW50IGRlZndOb25EZWZhdWx0UnVsZUxheWVyKGNvbnN0IGNoYXIqIGxheWVyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlhZ1dpZHRoLCAgICAvKiBvcHRpb25hbCgwKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3BhY2luZywgICAgICAvKiBvcHRpb25hbCgwKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lyZUV4dCk7ICAgICAvKiBvcHRpb25hbCgwKSAqLwotCi0vKiBSb3V0aW5lcyB0byBlbnRlciBOT05ERUZBVUxUUlVMRVMuICBUaGlzIHNlY3Rpb24gaXMgb3B0aW9uYWwuCi0gKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGRlZndOb25EZWZhdWx0UnVsZS4gCi0gKiBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KLSAqIFRoaXMgaXMgYSA1LjYgc3ludGF4LgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICovCi1leHRlcm4gaW50IGRlZndOb25EZWZhdWx0UnVsZVZpYShjb25zdCBjaGFyKiB2aWFOYW1lKTsKLQotLyogUm91dGluZXMgdG8gZW50ZXIgTk9OREVGQVVMVFJVTEVTLiAgVGhpcyBzZWN0aW9uIGlzIG9wdGlvbmFsLgotICogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBkZWZ3Tm9uRGVmYXVsdFJ1bGUuIAotICogVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCi0gKiBUaGlzIGlzIGEgNS42IHN5bnRheC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAqLwotZXh0ZXJuIGludCBkZWZ3Tm9uRGVmYXVsdFJ1bGVWaWFSdWxlKGNvbnN0IGNoYXIqIHZpYVJ1bGVOYW1lKTsKLQotLyogUm91dGluZXMgdG8gZW50ZXIgTk9OREVGQVVMVFJVTEVTLiAgVGhpcyBzZWN0aW9uIGlzIG9wdGlvbmFsLgotICogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBkZWZ3Tm9uRGVmYXVsdFJ1bGUuIAotICogVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCi0gKiBUaGlzIGlzIGEgNS42IHN5bnRheC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAqLwotZXh0ZXJuIGludCBkZWZ3Tm9uRGVmYXVsdFJ1bGVNaW5DdXRzKGNvbnN0IGNoYXIqIGN1dExheWVyTmFtZSwgaW50IG51bUN1dFMpOwotCi0vKiBUaGlzIGlzIGEgNS40IHN5bnRheC4gKi8KLWV4dGVybiBpbnQgZGVmd0VuZE5vbkRlZmF1bHRSdWxlcygpOwotCi0vKiBSb3V0aW5lcyB0byBlbnRlciBTVFlMRVMuICBUaGlzIHNlY3Rpb24gaXMgcmVxdWlyZWQKLSAqIFRoZSBzZWN0aW9uIG11c3Qgc3RhcnQgd2l0aCBhIGRlZndTdGFydFN0eWxlcygpIGFuZAotICogZW5kIHdpdGggZGVmd0VuZFN0eWxlcygpIGNhbGwuCi0gKiBUaGlzIGlzIGEgNS42IHN5bnRheC4gKi8KLWV4dGVybiBpbnQgZGVmd1N0YXJ0U3R5bGVzKGludCBjb3VudCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBmb3IgTGF5ZXIgd2l0aGluIHRoZSBOT05ERUZBVUxUUlVMRVMKLSAqIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAgSXQgaXMgcmVxdWlyZWQuCi0gKiBUaGlzIGlzIGEgNS42IHN5bnRheC4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAqLwotZXh0ZXJuIGludCBkZWZ3U3R5bGVzKGludCBzdHlsZU51bXMsIGludCBudW1fcG9pbnRzLCBkb3VibGUqIHhwLCBkb3VibGUqIHlwKTsKLQotLyogVGhpcyBpcyBhIDUuNCBzeW50YXguICovCi1leHRlcm4gaW50IGRlZndFbmRTdHlsZXMoKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBkZWZ3SW5pdC4KLSAqIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgaXQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gKi8KLWV4dGVybiBpbnQgZGVmd1N0YXJ0QmVnaW5leHQoY29uc3QgY2hhciogbmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgZGVmd0JlZ2luZXh0LgotICogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLCBpdCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAqLwotZXh0ZXJuIGludCBkZWZ3QmVnaW5leHRDcmVhdG9yIChjb25zdCBjaGFyKiBjcmVhdG9yTmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgZGVmd0JlZ2luZXh0LgotICogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLCBpdCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4KLSAqIEl0IGdldHMgdGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUgYW5kIGRhdGUuCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gKi8KLWV4dGVybiBpbnQgZGVmd0JlZ2luZXh0RGF0ZSAoKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBkZWZ3QmVnaW5leHQuCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwsIGl0IGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICovCi1leHRlcm4gaW50IGRlZndCZWdpbmV4dFJldmlzaW9uIChpbnQgdmVyczEsIGludCB2ZXJzMik7ICAgLyogdmVyczEudmVyczIgKi8KLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBkZWZ3QmVnaW5leHQuCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwsIGl0IGNhbiBiZSBjYWxsZWQgbWFueSB0aW1lcy4KLSAqIEl0IGFsbG93cyB1c2VyIHRvIGN1c3RvbWl6ZSB0aGVpciBvd24gc3ludGF4LgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICovCi1leHRlcm4gaW50IGRlZndCZWdpbmV4dFN5bnRheCAoY29uc3QgY2hhciogdGl0bGUsIGNvbnN0IGNoYXIqIHN0cmluZyk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgZGVmd0luaXQuCi0gKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGl0IGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICovCi1leHRlcm4gaW50IGRlZndFbmRCZWdpbmV4dCgpOwotCi0vKiBFbmQgdGhlIERFRiBmaWxlLgotICogVGhpcyByb3V0aW5lIElTIE5PVCBPUFRJT05BTC4KLSAqIFRoZSByb3V0aW5lIG11c3QgYmUgY2FsbGVkIExBU1QuICovCi1leHRlcm4gaW50IGRlZndFbmQgKCB2b2lkICk7Ci0KLS8qIEdlbmVyYWwgcm91dGluZXMgdGhhdCBjYW4gYmUgY2FsbGVkIGFueXRpbWUgYWZ0ZXIgdGhlIEluaXQgaXMgY2FsbGVkLgotICovCi1leHRlcm4gaW50IGRlZndDdXJyZW50TGluZU51bWJlciAoIHZvaWQgKTsKLQotLyoKLSAqIGV4dGVybiB2b2lkIGRlZndFcnJvciAoIGNvbnN0IGNoYXIgKiwgLi4uICk7Ci0gKiBleHRlcm4gdm9pZCBkZWZ3V2FybmluZyAoIGNvbnN0IGNoYXIgKiwgLi4uICk7Ci0gKiBleHRlcm4gdm9pZCBkZWZ3VkVycm9yICggY29uc3QgY2hhciAqLCB2YV9saXN0ICk7Ci0gKiBleHRlcm4gdm9pZCBkZWZ3Vldhcm5pbmcgKCBjb25zdCBjaGFyICosIHZhX2xpc3QgKTsKLSAqIGV4dGVybiBpbnQgIGRlZndHZXRDdXJyZW50TGluZU51bWJlciAodm9pZCk7Ci0gKiBleHRlcm4gY29uc3QgY2hhciAqZGVmd0dldEN1cnJlbnRGaWxlTmFtZSAodm9pZCk7Ci0gKi8KLSAKLS8qIFRoaXMgcm91dGluZSB3aWxsIHByaW50IHRoZSBlcnJvciBtZXNzYWdlLiAqLwotZXh0ZXJuIHZvaWQgZGVmd1ByaW50RXJyb3IoaW50IHN0YXR1cyk7Ci0KLS8qIFRoaXMgcm91dGluZSB3aWxsIGFsbG93IHVzZXIgdG8gd3JpdGUgdGhlaXIgb3duIGNvbWVtbnQuICBJdCB3aWxsCi0gKiBhdXRvbWFjdGljYWxseSBhZGQgYSAjIGluZnJvbnQgb2YgdGhlIGxpbmUuCi0gKi8KLWV4dGVybiB2b2lkIGRlZndBZGRDb21tZW50KGNvbnN0IGNoYXIqIGNvbW1lbnQpOwotIAotLyogVGhpcyByb3V0aW5lIHdpbGwgaW5kZW50IDMgYmxhbmsgc3BhY2VzICovCi1leHRlcm4gdm9pZCBkZWZ3QWRkSW5kZW50KCk7Ci0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1VU0VfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZndXcml0ZXJDYWxscy5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZndXcml0ZXJDYWxscy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYjc2MjcuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZ3V3JpdGVyQ2FsbHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjEzICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0KLS8vIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIGZvciBpbXBsZW1lbnRpbmcgdGhlIGRlZndyaXRlciA1LjMKLS8vIEl0IGhhcyBmdW5jdGlvbnMgdG8gc2V0IHRoZSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9ucy4gIElmIGZ1bmN0aW9ucwotLy8gYXJlIHNldCwgdGhlIGRlZndyaXRlciB3aWxsIGNhbGwgdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb25zIHdoZW4KLS8vIGl0IGNvbWVzIHRvIHRoZSBzZWN0aW9uLiAgSWYgdGhlIHNlY3Rpb24gaXMgcmVxdWlyZWQsIGJ1dCB1c2VyCi0vLyBkb2VzIG5vdCBzZXQgYW55IGNhbGxiYWNrIGZ1bmN0aW9ucywgYSB3YXJuaW5nIHdpbGwgYmUgcHJpbnRlZAotLy8gYm90aCBvbiBzdGRlcnIgYW5kIG9uIHRoZSBvdXRwdXQgZmlsZSBpZiB0aGVyZSBpcyBvbmUuCi0vLyBEZWYgd3JpdGVyIHByb3ZpZGVzIGRlZmF1bHQgY2FsbGJhY2sgcm91dGluZXMgZm9yIHNvbWUgYnV0IG5vdCBhbGwKLS8vIHJlcXVpcmVkIHNlY3Rpb25zLgotLy8gU2VjdGlvbnMgdGhlIHdyaXRlciBwcm92aWRlcyBkZWZhdWx0IGNhbGxiYWNrcyBhcmU6Ci0vLyAgICBWZXJzaW9uIC0tIGRlZmF1bHQgdG8gNS4zCi0vLyAgICBOYW1lc0Nhc2VTZW5zaXRpdmUgLS0gZGVmYXVsdCB0byBPRkYKLS8vICAgIEJ1c0JpdENoYXJzIC0tIGRlZmF1bHQgdG8gIltdIgotLy8gICAgRGl2aWRlckNoYXIgLS0gZGVmYXVsdCB0byAiLyI7IC8vCi0vLyBBdXRob3I6IFdhbmRhIGRhIFJvc2EKLS8vIERhdGU6ICAgMDUvMTQvOTkgCi0vLwotLy8gUmV2aXNpb25zOgotCi0jaW5jbHVkZSAiZGVmd1dyaXRlckNhbGxzLmhwcCIKLSNpbmNsdWRlICJkZWZ3V3JpdGVyLmhwcCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJsZXguaCIKLSNpbmNsdWRlICJkZWZpRGVidWcuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0jZGVmaW5lIE1BWENCUyAgICAzMwotCi0jZGVmaW5lIGRlZndWZXJzaW9uQ2JrIDAKLSNkZWZpbmUgZGVmd0Nhc2VTZW5zaXRpdmVDYmsgMQotI2RlZmluZSBkZWZ3RGl2aWRlckNiayAyCi0jZGVmaW5lIGRlZndCdXNCaXRDYmsgMwotI2RlZmluZSBkZWZ3RGVzaWduQ2JrIDQKLSNkZWZpbmUgZGVmd1RlY2hDYmsgNQotI2RlZmluZSBkZWZ3QXJyYXlDYmsgNgotI2RlZmluZSBkZWZ3Rmxvb3JQbGFuQ2JrIDcgCi0jZGVmaW5lIGRlZndVbml0c0NiayA4Ci0jZGVmaW5lIGRlZndIaXN0b3J5Q2JrIDkKLSNkZWZpbmUgZGVmd1Byb3BEZWZDYmsgMTAKLSNkZWZpbmUgZGVmd0RpZUFyZWFDYmsgMTEKLSNkZWZpbmUgZGVmd1Jvd0NiayAxMgotI2RlZmluZSBkZWZ3VHJhY2tDYmsgMTMKLSNkZWZpbmUgZGVmd0djZWxsR3JpZENiayAxNAotI2RlZmluZSBkZWZ3RGVmYXVsdENhcENiayAxNQotI2RlZmluZSBkZWZ3Q2FucGxhY2VDYmsgMTYKLSNkZWZpbmUgZGVmd0Nhbm5vdE9jY3VweUNiayAxNwotI2RlZmluZSBkZWZ3VmlhQ2JrIDE4Ci0jZGVmaW5lIGRlZndSZWdpb25DYmsgMTkKLSNkZWZpbmUgZGVmd0NvbXBvbmVudENiayAyMAotI2RlZmluZSBkZWZ3UGluQ2JrIDIxCi0jZGVmaW5lIGRlZndQaW5Qcm9wQ2JrIDIyCi0jZGVmaW5lIGRlZndTTmV0Q2JrIDIzCi0jZGVmaW5lIGRlZndOZXRDYmsgMjQKLSNkZWZpbmUgZGVmd0lPVGltaW5nQ2JrIDI1Ci0jZGVmaW5lIGRlZndTY2FuY2hhaW5DYmsgMjYKLSNkZWZpbmUgZGVmd0NvbnN0cmFpbnRDYmsgMjcKLSNkZWZpbmUgZGVmd0Fzc2VydGlvbkNiayAyOCAgICAvKiBwcmUgNS4yICovCi0jZGVmaW5lIGRlZndHcm91cENiayAyOQotI2RlZmluZSBkZWZ3QmxvY2thZ2VDYmsgMzAKLSNkZWZpbmUgZGVmd0V4dENiayAzMQotI2RlZmluZSBkZWZ3RGVzaWduRW5kQ2JrIDMyCi0KLS8qIE5FVyBDQUxMQkFDSyAtIHRoZW4gcGxhY2UgaXQgaGVyZS4gKi8KLQotaW50IGRlZldSZXRWYWw7Ci1leHRlcm4gaW50IGRlZndIYXNJbml0OwotZXh0ZXJuIGludCBkZWZ3SGFzSW5pdENiazsKLQotREVGSV9MT0dfRlVOQ1RJT04gZGVmd0Vycm9yTG9nRnVuY3Rpb247Ci1ERUZJX1dBUk5JTkdfTE9HX0ZVTkNUSU9OIGRlZndXYXJuaW5nTG9nRnVuY3Rpb247Ci0KLSNkZWZpbmUgV1JJVEVSX0NBTExCQUNLKGZ1bmMsIHR5cGUpIFwKLSAgaWYgKChkZWZXUmV0VmFsID0gKCpmdW5jKSh0eXBlLCBkZWZ3VXNlckRhdGEpKSA9PSAwKSB7IFwKLSAgfSBlbHNlIHsgXAotICAgIHJldHVybiBkZWZXUmV0VmFsOyBcCi0gIH0KLQotI2RlZmluZSBDSEVDS19ERUZfU1RBVFVTKHN0YXR1cykgXAotICBpZiAoc3RhdHVzKSB7ICAgICAgICAgICAgICBcCi0gICAgIGRlZndQcmludEVycm9yKHN0YXR1cyk7IFwKLSAgICAgcmV0dXJuKHN0YXR1cyk7ICAgICAgICAgXAotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vICAgR2xvYmFsIHZhcmlhYmxlcwotLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotZGVmaVVzZXJEYXRhIGRlZndVc2VyRGF0YSA9IDA7Ci1zdGF0aWMgY2hhciogZGVmd0ZpbGVOYW1lID0gMDsKLXN0YXRpYyBpbnQgZGVmd1JlZ2lzdGVyVW51c2VkID0gMDsKLQotZXh0ZXJuIEZJTEUqIGRlZndGaWxlOwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyAgICAgICBMaXN0IG9mIGNhbGwgYmFjayByb3V0aW5lcwotLy8gIFRoZXNlIGFyZSBmaWxsZWQgaW4gYnkgdGhlIHVzZXIuICBTZWUgdGhlCi0vLyAgICJzZXQiIHJvdXRpbmVzIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUKLS8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBUaGUgY2FsbGJhY2sgcm91dGluZXMKLWRlZndWb2lkQ2JrRm5UeXBlIGRlZndDYWxsYmFja3NTZXFbTUFYQ0JTXSA9IHswLCAgLy8gZGVmd1ZlcnNpb25DYmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgLy8gZGVmd0Nhc2VTZW5zaXRpdmVDYmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgLy8gZGVmd0RpdmlkZXJDYmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgLy8gZGVmd0J1c0JpdENiawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBkZWZ3RGVzaWduQ2JrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIC8vIGRlZndUZWNoQ2JrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIC8vIGRlZndBcnJheUNiawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBkZWZ3Rmxvb3JQbGFuQ2JrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIC8vIGRlZndVbml0c0NiawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBkZWZ3SGlzdG9yeUNiawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBkZWZ3UHJvcERlZkNiawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBkZWZ3RGllQXJlYUNiawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBkZWZ3Um93Q2JrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIC8vIGRlZndUcmFja0NiawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBkZWZ3R2NlbGxHcmlkQ2JrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIC8vIGRlZndEZWZhdWx0Q2FwQ2JrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIC8vIGRlZndDYW5wbGFjZUNiawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBkZWZ3Q2Fubm90T2NjdXB5Q2JrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIC8vIGRlZndWaWFDYmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgLy8gZGVmd1JlZ2lvbkNiawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBkZWZ3Q29tcG9uZW50Q2JrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIC8vIGRlZndQaW5DYmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgLy8gZGVmd1BpblByb3BDYmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgLy8gZGVmd1NOZXRDYmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgLy8gZGVmd05ldENiawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBkZWZ3SU9UaW1pbmdDYmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgLy8gZGVmd1NjYW5jaGFpbkNiawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBkZWZ3Q29uc3RyYWludENiawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBkZWZ3QXNzZXJ0aW9uQ2JrIHByZSA1LjIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgLy8gZGVmd0dyb3VwQ2JrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIC8vIGRlZndCbG9ja2FnZUNiayA1LjQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgLy8gZGVmd0V4dENiawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBkZWZ3RGVzaWduRW5kQ2JrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCBORVcgQ0FMTEJBQ0sgaGVyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLS8vIHRoZSBvcHRpb25hbCBhbmQgcmVxdWlyZWQgY2FsbGJhY2tzIGFuZAotLy8gaWYgZGVmYXVsdCByb3V0aW5lcyBhcmUgYXZhaWxhYmxlCi1pbnQgZGVmd0NhbGxiYWNrc1JlcVtNQVhDQlNdWzJdID0ge3swLCAwfSwgIC8vIFZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIDB9LCAgLy8gQ2FzZVNlbnNpdGl2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMH0sICAvLyBEaXZpZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCAwfSwgIC8vIEJ1c0JpdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MSwgMH0sICAvLyBEZXNpZ24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIDB9LCAgLy8gVGVjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMH0sICAvLyBBcnJheQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMH0sICAvLyBGbG9vclBsYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIDB9LCAgLy8gVW5pdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIDB9LCAgLy8gSGlzdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMH0sICAvLyBQcm9wRGVmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCAwfSwgIC8vIERpZUFyZWEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIDB9LCAgLy8gUm93Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCAwfSwgIC8vIFRyYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCAwfSwgIC8vIEdjZWxsR3JpZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMH0sICAvLyBEZWZhdWx0Q2FwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCAwfSwgIC8vIENhbnBsYWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCAwfSwgIC8vIENhbm5vdE9jY3VweQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMH0sICAvLyBWaWEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIDB9LCAgLy8gUmVnaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCAwfSwgIC8vIENvbXBvbmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMH0sICAvLyBQaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIDB9LCAgLy8gUGluUHJvcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMH0sICAvLyBTTmV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCAwfSwgIC8vIE5ldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMH0sICAvLyBJT1RpbWluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMH0sICAvLyBTY2FuY2hhaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIDB9LCAgLy8gQ29uc3RyYWludAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMH0sICAvLyBBc3NlcnRpb24gcHJlIDUuMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMH0sICAvLyBHcm91cAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMH0sICAvLyBCbG9ja2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMH0sICAvLyBFeHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEsIDB9LCAgLy8gRGVzaWduRW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIE5FVyBDQUxMQkFDSyBoZXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotLy8gVGhlIHNlY3Rpb24gbmFtZXMKLWNoYXIgZGVmd1NlY3Rpb25OYW1lc1tNQVhDQlNdIFs4MF0gPSB7IlZlcnNpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FzZVNlbnNpdGl2ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXZpZGVyIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCdXNCaXQiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlc2lnbiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVjaCIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJyYXkiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZsb29yUGxhbiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5pdHMiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhpc3RvcnkiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb3BlcnR5RGVmaW5pdGlvbiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGllQXJlYSIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUm93IiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUcmFjayIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2NlbGxHcmlkIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZWZhdWx0Q2FwIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5wbGFjZSIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90T2NjdXB5IiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWaWEiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ2lvbiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcG9uZW50IiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQaW4iLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBpblByb3AiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNwZWNpYWxOZXQiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5ldCIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU9UaW1pbmciLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNjYW5jaGFpbiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29uc3RyYWludCIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXNzZXJ0aW9uIiwgICAgLy8gcHJlIDUuMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR3JvdXAiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJsb2NrYWdlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4dGVuc2lvbiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVzaWduRW5kIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIE5FVyBDQUxMQkFDSyBoZXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotLy8gdGhlIGNhbGwgYmFjayB0eXBlcyBmcm9tIHRoZSBkZWZ3Q2FsbGJhY2tUeXBlX2UKLWRlZndDYWxsYmFja1R5cGVfZSBkZWZ3Q2FsbGJhY2tzVHlwZVtNQVhDQlNdID0ge2RlZndWZXJzaW9uQ2JrVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZndDYXNlU2Vuc2l0aXZlQ2JrVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZndEaXZpZGVyQ2JrVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZndCdXNCaXRDYmtUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmd0Rlc2lnbkNia1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZ3VGVjaENia1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZ3QXJyYXlDYmtUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmd0Zsb29yUGxhbkNia1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZ3VW5pdHNDYmtUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmd0hpc3RvcnlDYmtUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmd1Byb3BEZWZDYmtUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmd0RpZUFyZWFDYmtUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmd1Jvd0Nia1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZ3VHJhY2tDYmtUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmd0djZWxsR3JpZENia1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZ3RGVmYXVsdENhcENia1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZ3Q2FucGxhY2VDYmtUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmd0Nhbm5vdE9jY3VweUNia1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZ3VmlhQ2JrVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZndSZWdpb25DYmtUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmd0NvbXBvbmVudENia1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZ3UGluQ2JrVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZndQaW5Qcm9wQ2JrVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZndTTmV0Q2JrVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZndOZXRDYmtUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmd0lPVGltaW5nQ2JrVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZndTY2FuY2hhaW5DYmtUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmd0NvbnN0cmFpbnRDYmtUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmd0Fzc2VydGlvbkNia1R5cGUsIC8vIHByZSA1LjIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZndHcm91cENia1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZ3QmxvY2thZ2VDYmtUeXBlLCAgLy8gNS40Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZ3RXh0Q2JrVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZndEZXNpZ25FbmRDYmtUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgTkVXIFRZUEVTIGhlcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyAgIFJvdXRpbmVzIGZvciB0aGUgY2FsbGJhY2tzCi0vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotY29uc3QgY2hhciogZGVmd0ZOYW1lKCkgewotICByZXR1cm4gZGVmd0ZpbGVOYW1lOwotfQotIAotCi1pbnQgZGVmd1dyaXRlKEZJTEUqIGYsIGNvbnN0IGNoYXIqIGZOYW1lLCBkZWZpVXNlckRhdGEgdURhdGEpIHsKLSAgaW50IGk7Ci0KLSAgaWYgKGRlZndIYXNJbml0ID09IDAgJiYgZGVmd0hhc0luaXRDYmsgPT0gMCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgREVGV1JJVC05MDEwKTogVGhlIGZ1bmN0aW9uIGRlZndXcml0ZSBpcyBjYWxsZWQgYmVmb3JlIHRoZSBmdW5jdGlvbiBkZWZ3SW5pdENiay5cbllvdSBuZWVkIHRvIGNhbGwgZGVmd0luaXRDYmsgYmVmb3JlIGNhbGxpbmcgYW55IG90aGVyIGZ1bmN0aW9ucy5cblVwZGF0ZSB5b3VyIHByb2dyYW0gYW5kIHRoZW4gdHJ5IGFnYWluLiIpOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIGlmIChkZWZ3SGFzSW5pdCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgREVGV1JJVC05MDExKTogWW91IHByb2dyYW0gaGFzIGNhbGxlZCB0aGUgZnVuY3Rpb24gZGVmd0luaXQgdG8gaW5pdGlhbGl6ZSB0aGUgd3JpdGVyLlxuSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBjYWxsYmFjayBvcHRpb24geW91IG5lZWQgdG8gdXNlIHRoZSBmdW5jdGlvbiBkZWZ3SW5pdENiay4iKTsKLSAgfQotCi0gIGRlZndGaWxlTmFtZSA9IChjaGFyKilmTmFtZTsKLSAgZGVmd0ZpbGUgPSBmOwotICBkZWZ3VXNlckRhdGEgPSB1RGF0YTsKLQotICAvLyBMb29wIHRocm91Z2ggdGhlIGxpc3Qgb2YgY2FsbGJhY2tzIGFuZCBjYWxsIHRoZSB1c2VyIGRlZmluZQotICAvLyBjYWxsYmFjayByb3V0aW5lcyBpZiBhbnkgYXJlIHNldAotCi0gIGZvciAoaSA9IDA7IGkgPCBNQVhDQlM7IGkrKykgewotICAgICBpZiAoZGVmd0NhbGxiYWNrc1NlcVtpXSAhPSAwKSB7ICAgLy8gdXNlciBoYXMgc2V0IGEgY2FsbGJhY2sgZnVuY3Rpb24KLSAgICAgICAgV1JJVEVSX0NBTExCQUNLKGRlZndDYWxsYmFja3NTZXFbaV0sIGRlZndDYWxsYmFja3NUeXBlW2ldKTsKLSAgICAgfSBlbHNlIGlmICgoZGVmd0NhbGxiYWNrc1JlcVtpXVswXSkgJiYgKGRlZndDYWxsYmFja3NSZXFbaV1bMV0gPT0gMCkpIHsgCi0gICAgICAgIC8vIGl0IGlzIHJlcXVpcmVkIGJ1dCB1c2VyIGhhc24ndCBzZXQgdXAgY2FsbGJhY2sgYW5kIHRoZXJlIGlzbid0IGEKLSAgICAgICAgLy8gZGVmYXVsdCByb3V0aW5lCi0gICAgICAgIGZwcmludGYoZiwKLSAgICAgICAgICAgICIjIFdBUk5JTkc6IENhbGxiYWNrIGZvciAlcyBpcyByZXF1aXJlZCwgYnV0IGlzIG5vdCBkZWZpbmVkXG5cbiIsCi0gICAgICAgICAgICBkZWZ3U2VjdGlvbk5hbWVzW2ldKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAiV0FSTklORzogQ2FsbGJhY2sgZm9yICVzIGlzIHJlcXVpcmVkLCBidXQgaXMgbm90IGRlZmluZWRcblxuIiwKLSAgICAgICAgICAgIGRlZndTZWN0aW9uTmFtZXNbaV0pOwotICAgICB9Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotdm9pZCBkZWZ3U2V0VW51c2VkQ2FsbGJhY2tzKGRlZndWb2lkQ2JrRm5UeXBlIGZ1bmMpIHsKLSAgLy8gU2V0IGFsbCBvZiB0aGUgY2FsbGJhY2tzIHRoYXQgaGF2ZSBub3QgYmVlbiBzZXQgeWV0IHRvCi0gIC8vIHRoZSBnaXZlbiBmdW5jdGlvbi4KLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IE1BWENCUzsgaSsrKSB7Ci0gICAgIGlmIChkZWZ3Q2FsbGJhY2tzU2VxW2ldID09IDApCi0gICAgICAgICBkZWZ3Q2FsbGJhY2tzU2VxW2ldID0gKGRlZndWb2lkQ2JrRm5UeXBlKWZ1bmM7Ci0gIH0KLX0KLQotCi0vKiBUaGVzZSBjb3VudCB1cCB0aGUgbnVtYmVyIG9mIHRpbWVzIGFuIHVuc2V0IGNhbGxiYWNrIGlzIGNhbGxlZC4uLiAqLwotc3RhdGljIGludCBkZWZ3VW51c2VkQ291bnRbMTAwXTsKLQotCi1pbnQgZGVmd0NvdW50RnVuYyhkZWZ3Q2FsbGJhY2tUeXBlX2UgZSwgZGVmaVVzZXJEYXRhIGQpIHsKLSAgaW50IGkgPSAoaW50KWU7Ci0gIGlmIChkZWZpRGVidWcoMjMpKSBwcmludGYoImNvdW50ICVkIDB4JXhcbiIsIChpbnQpZSwgZCk7Ci0gIGlmIChpID49IDAgJiYgaSA8IDEwMCkgewotICAgIGRlZndVbnVzZWRDb3VudFtpXSArPSAxOwotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiAxOwotfQotCi0KLXZvaWQgZGVmd1NldFJlZ2lzdGVyVW51c2VkQ2FsbGJhY2tzKCkgewotICBpbnQgaTsKLSAgZGVmd1JlZ2lzdGVyVW51c2VkID0gMTsKLSAgZGVmd1NldFVudXNlZENhbGxiYWNrcyhkZWZ3Q291bnRGdW5jKTsKLSAgZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKQotICAgIGRlZndVbnVzZWRDb3VudFtpXSA9IDA7Ci19Ci0KLQotdm9pZCBkZWZ3UHJpbnRVbnVzZWRDYWxsYmFja3MoRklMRSogZikgewotICBpbnQgaTsKLSAgaW50IGZpcnN0ID0gMTsKLQotICBpZiAoZGVmd1JlZ2lzdGVyVW51c2VkID09IDApIHsKLSAgICBmcHJpbnRmKGYsCi0gICAgIkVSUk9SIERFRldSSVQtOTAxMik6IFlvdSBhcmUgY2FsbGluZyB0aGUgZnVuY3Rpb24gZGVmd1ByaW50VW51c2VkQ2FsbGJhY2tzIGJ1dCB5b3UgZGlkIGNhbGwgdGhlIGZ1bmN0aW9uIGRlZndTZXRSZWdpc3RlclVudXNlZENhbGxiYWNrcyB3aGljaCBpcyByZXF1aXJlZCBiZWZvcmUgeW91IGNhbiBjYWxsIGRlZndQcmludFVudXNlZENhbGxiYWNrcy4iKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLSAgICBpZiAoZGVmd1VudXNlZENvdW50W2ldKSB7Ci0gICAgICBpZiAoZmlyc3QpCi0JZnByaW50ZihmLAotCSJERUYgaXRlbXMgdGhhdCB3ZXJlIHByZXNlbnQgYnV0IGlnbm9yZWQgYmVjYXVzZSBvZiBubyBjYWxsYmFjazpcbiIpOwotICAgICAgZmlyc3QgPSAwOwotICAgICAgc3dpdGNoICgoZGVmd0NhbGxiYWNrVHlwZV9lKSBpKSB7Ci0gICAgY2FzZSBkZWZ3VmVyc2lvbkNia1R5cGU6IGZwcmludGYoZiwgIlZlcnNpb24iKTsgYnJlYWs7Ci0gICAgY2FzZSBkZWZ3Q2FzZVNlbnNpdGl2ZUNia1R5cGU6IGZwcmludGYoZiwgIkNhc2VTZW5zaXRpdmUiKTsgYnJlYWs7Ci0gICAgY2FzZSBkZWZ3RGl2aWRlckNia1R5cGU6IGZwcmludGYoZiwgIkRpdmlkZXIiKTsgYnJlYWs7Ci0gICAgY2FzZSBkZWZ3QnVzQml0Q2JrVHlwZTogZnByaW50ZihmLCAiQnVzQml0Iik7IGJyZWFrOwotICAgIGNhc2UgZGVmd0Rlc2lnbkNia1R5cGU6IGZwcmludGYoZiwgIkRlc2lnbiIpOyBicmVhazsKLSAgICBjYXNlIGRlZndUZWNoQ2JrVHlwZTogZnByaW50ZihmLCAiVGVjaG5vbG9neSIpOyBicmVhazsKLSAgICBjYXNlIGRlZndBcnJheUNia1R5cGU6IGZwcmludGYoZiwgIkFycmF5Iik7IGJyZWFrOwotICAgIGNhc2UgZGVmd0Zsb29yUGxhbkNia1R5cGU6IGZwcmludGYoZiwgIkZsb29yUGxhbiIpOyBicmVhazsKLSAgICBjYXNlIGRlZndVbml0c0Nia1R5cGU6IGZwcmludGYoZiwgIlVuaXRzIik7IGJyZWFrOwotICAgIGNhc2UgZGVmd0hpc3RvcnlDYmtUeXBlOiBmcHJpbnRmKGYsICJIaXN0b3J5Iik7IGJyZWFrOwotICAgIGNhc2UgZGVmd1Byb3BEZWZDYmtUeXBlOiBmcHJpbnRmKGYsICJQcm9wZXJ0eURlZmluaXRpb24iKTsgYnJlYWs7Ci0gICAgY2FzZSBkZWZ3RGllQXJlYUNia1R5cGU6IGZwcmludGYoZiwgIkRpZUFyZWEiKTsgYnJlYWs7Ci0gICAgY2FzZSBkZWZ3Um93Q2JrVHlwZTogZnByaW50ZihmLCAiUm93Iik7IGJyZWFrOwotICAgIGNhc2UgZGVmd1RyYWNrQ2JrVHlwZTogZnByaW50ZihmLCAiVHJhY2siKTsgYnJlYWs7Ci0gICAgY2FzZSBkZWZ3R2NlbGxHcmlkQ2JrVHlwZTogZnByaW50ZihmLCAiR2NlbGxHcmlkIik7IGJyZWFrOwotICAgIGNhc2UgZGVmd0RlZmF1bHRDYXBDYmtUeXBlOiBmcHJpbnRmKGYsICJEZWZhdWx0Q2FwIik7IGJyZWFrOwotICAgIGNhc2UgZGVmd0NhbnBsYWNlQ2JrVHlwZTogZnByaW50ZihmLCAiQ2FucGxhY2UiKTsgYnJlYWs7Ci0gICAgY2FzZSBkZWZ3Q2Fubm90T2NjdXB5Q2JrVHlwZTogZnByaW50ZihmLCAiQ2Fubm90T2NjdXB5Iik7IGJyZWFrOwotICAgIGNhc2UgZGVmd1ZpYUNia1R5cGU6IGZwcmludGYoZiwgIlZpYSIpOyBicmVhazsKLSAgICBjYXNlIGRlZndSZWdpb25DYmtUeXBlOiBmcHJpbnRmKGYsICJSZWdpb24iKTsgYnJlYWs7Ci0gICAgY2FzZSBkZWZ3Q29tcG9uZW50Q2JrVHlwZTogZnByaW50ZihmLCAiQ29tcG9uZW50Iik7IGJyZWFrOwotICAgIGNhc2UgZGVmd1BpbkNia1R5cGU6IGZwcmludGYoZiwgIlBpbiIpOyBicmVhazsKLSAgICBjYXNlIGRlZndQaW5Qcm9wQ2JrVHlwZTogZnByaW50ZihmLCAiUGluUHJvcGVydHkiKTsgYnJlYWs7Ci0gICAgY2FzZSBkZWZ3U05ldENia1R5cGU6IGZwcmludGYoZiwgIlNwZWNpYWxOZXQiKTsgYnJlYWs7Ci0gICAgY2FzZSBkZWZ3TmV0Q2JrVHlwZTogZnByaW50ZihmLCAiTmV0Iik7IGJyZWFrOwotICAgIGNhc2UgZGVmd0lPVGltaW5nQ2JrVHlwZTogZnByaW50ZihmLCAiSU9UaW1pbmciKTsgYnJlYWs7Ci0gICAgY2FzZSBkZWZ3U2NhbmNoYWluQ2JrVHlwZTogZnByaW50ZihmLCAiU2NhbmNoYWluIik7IGJyZWFrOwotICAgIGNhc2UgZGVmd0NvbnN0cmFpbnRDYmtUeXBlOiBmcHJpbnRmKGYsICJDb25zdHJhaW50Iik7IGJyZWFrOwotICAgIGNhc2UgZGVmd0Fzc2VydGlvbkNia1R5cGU6IGZwcmludGYoZiwgIkFzc2VydGlvbiIpOyBicmVhazsKLSAgICBjYXNlIGRlZndHcm91cENia1R5cGU6IGZwcmludGYoZiwgIkdyb3VwIik7IGJyZWFrOwotICAgIGNhc2UgZGVmd0Jsb2NrYWdlQ2JrVHlwZTogZnByaW50ZihmLCAiQmxvY2thZ2VzIik7IGJyZWFrOwotICAgIGNhc2UgZGVmd0V4dENia1R5cGU6IGZwcmludGYoZiwgIkV4dGVuc2lvbiIpOyBicmVhazsKLSAgICBjYXNlIGRlZndEZXNpZ25FbmRDYmtUeXBlOiBmcHJpbnRmKGYsICJEZXNpZ25FbmQiKTsgYnJlYWs7Ci0gICAgICAvKiBORVcgQ0FMTEJBQ0sgIGFkZCB0aGUgcHJpbnQgaGVyZSAqLwotICAgICAgZGVmYXVsdDogZnByaW50ZihmLCAiQk9HVVMgRU5UUlkiKTsgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBmcHJpbnRmKGYsICIgJWRcbiIsIGRlZndVbnVzZWRDb3VudFtpXSk7Ci0gICAgfQotICB9Ci19Ci0KLQotdm9pZCBkZWZ3U2V0VXNlckRhdGEoZGVmaVVzZXJEYXRhIGQpIHsKLSAgZGVmd1VzZXJEYXRhID0gZDsKLX0KLQotCi1kZWZpVXNlckRhdGEgZGVmd0dldFVzZXJEYXRhKCkgewotICByZXR1cm4gZGVmd1VzZXJEYXRhOwotfQotCi0KLXZvaWQgZGVmd1NldEFycmF5Q2JrKGRlZndWb2lkQ2JrRm5UeXBlIGYpIHsKLSAgZGVmd0NhbGxiYWNrc1NlcVtkZWZ3QXJyYXlDYmtdID0gZjsKLX0KLQotCi12b2lkIGRlZndTZXRBc3NlcnRpb25DYmsoZGVmd1ZvaWRDYmtGblR5cGUgZikgewotICBkZWZ3Q2FsbGJhY2tzU2VxW2RlZndBc3NlcnRpb25DYmtdID0gZjsKLX0KLQotCi12b2lkIGRlZndTZXRCbG9ja2FnZUNiayhkZWZ3Vm9pZENia0ZuVHlwZSBmKSB7Ci0gIGRlZndDYWxsYmFja3NTZXFbZGVmd0Jsb2NrYWdlQ2JrXSA9IGY7Ci19Ci0KLQotdm9pZCBkZWZ3U2V0QnVzQml0Q2JrKGRlZndWb2lkQ2JrRm5UeXBlIGYpIHsKLSAgZGVmd0NhbGxiYWNrc1NlcVtkZWZ3QnVzQml0Q2JrXSA9IGY7Ci19Ci0KLQotdm9pZCBkZWZ3U2V0Q2Fubm90T2NjdXB5Q2JrKGRlZndWb2lkQ2JrRm5UeXBlIGYpIHsKLSAgZGVmd0NhbGxiYWNrc1NlcVtkZWZ3Q2Fubm90T2NjdXB5Q2JrXSA9IGY7Ci19Ci0KLQotdm9pZCBkZWZ3U2V0Q2FucGxhY2VDYmsoZGVmd1ZvaWRDYmtGblR5cGUgZikgewotICBkZWZ3Q2FsbGJhY2tzU2VxW2RlZndDYW5wbGFjZUNia10gPSBmOwotfQotCi0KLXZvaWQgZGVmd1NldENhc2VTZW5zaXRpdmVDYmsoZGVmd1ZvaWRDYmtGblR5cGUgZikgewotICBkZWZ3Q2FsbGJhY2tzU2VxW2RlZndDYXNlU2Vuc2l0aXZlQ2JrXSA9IGY7Ci19Ci0KLQotdm9pZCBkZWZ3U2V0Q29tcG9uZW50Q2JrKGRlZndWb2lkQ2JrRm5UeXBlIGYpIHsKLSAgZGVmd0NhbGxiYWNrc1NlcVtkZWZ3Q29tcG9uZW50Q2JrXSA9IGY7Ci19Ci0KLQotdm9pZCBkZWZ3U2V0Q29uc3RyYWludENiayhkZWZ3Vm9pZENia0ZuVHlwZSBmKSB7Ci0gIGRlZndDYWxsYmFja3NTZXFbZGVmd0NvbnN0cmFpbnRDYmtdID0gZjsKLX0KLQotCi12b2lkIGRlZndTZXREZWZhdWx0Q2FwQ2JrKGRlZndWb2lkQ2JrRm5UeXBlIGYpIHsKLSAgZGVmd0NhbGxiYWNrc1NlcVtkZWZ3RGVmYXVsdENhcENia10gPSBmOwotfQotCi0KLXZvaWQgZGVmd1NldERlc2lnbkNiayhkZWZ3Vm9pZENia0ZuVHlwZSBmKSB7Ci0gIGRlZndDYWxsYmFja3NTZXFbZGVmd0Rlc2lnbkNia10gPSBmOwotfQotCi0KLXZvaWQgZGVmd1NldERlc2lnbkVuZENiayhkZWZ3Vm9pZENia0ZuVHlwZSBmKSB7Ci0gIGRlZndDYWxsYmFja3NTZXFbZGVmd0Rlc2lnbkVuZENia10gPSBmOwotfQotCi0KLXZvaWQgZGVmd1NldERpZUFyZWFDYmsoZGVmd1ZvaWRDYmtGblR5cGUgZikgewotICBkZWZ3Q2FsbGJhY2tzU2VxW2RlZndEaWVBcmVhQ2JrXSA9IGY7Ci19Ci0KLQotdm9pZCBkZWZ3U2V0RGl2aWRlckNiayhkZWZ3Vm9pZENia0ZuVHlwZSBmKSB7Ci0gIGRlZndDYWxsYmFja3NTZXFbZGVmd0RpdmlkZXJDYmtdID0gZjsKLX0KLQotCi12b2lkIGRlZndTZXRFeHRDYmsoZGVmd1ZvaWRDYmtGblR5cGUgZikgewotICBkZWZ3Q2FsbGJhY2tzU2VxW2RlZndFeHRDYmtdID0gZjsKLX0KLQotCi12b2lkIGRlZndTZXRGbG9vclBsYW5DYmsoZGVmd1ZvaWRDYmtGblR5cGUgZikgewotICBkZWZ3Q2FsbGJhY2tzU2VxW2RlZndGbG9vclBsYW5DYmtdID0gZjsKLX0KLQotCi12b2lkIGRlZndTZXRHY2VsbEdyaWRDYmsoZGVmd1ZvaWRDYmtGblR5cGUgZikgewotICBkZWZ3Q2FsbGJhY2tzU2VxW2RlZndHY2VsbEdyaWRDYmtdID0gZjsKLX0KLQotCi12b2lkIGRlZndTZXRHcm91cENiayhkZWZ3Vm9pZENia0ZuVHlwZSBmKSB7Ci0gIGRlZndDYWxsYmFja3NTZXFbZGVmd0dyb3VwQ2JrXSA9IGY7Ci19Ci0KLQotdm9pZCBkZWZ3U2V0SGlzdG9yeUNiayhkZWZ3Vm9pZENia0ZuVHlwZSBmKSB7Ci0gIGRlZndDYWxsYmFja3NTZXFbZGVmd0hpc3RvcnlDYmtdID0gZjsKLX0KLQotCi12b2lkIGRlZndTZXRJT1RpbWluZ0NiayhkZWZ3Vm9pZENia0ZuVHlwZSBmKSB7Ci0gIGRlZndDYWxsYmFja3NTZXFbZGVmd0lPVGltaW5nQ2JrXSA9IGY7Ci19Ci0KLQotdm9pZCBkZWZ3U2V0TmV0Q2JrKGRlZndWb2lkQ2JrRm5UeXBlIGYpIHsKLSAgZGVmd0NhbGxiYWNrc1NlcVtkZWZ3TmV0Q2JrXSA9IGY7Ci19Ci0KLQotdm9pZCBkZWZ3U2V0UGluQ2JrKGRlZndWb2lkQ2JrRm5UeXBlIGYpIHsKLSAgZGVmd0NhbGxiYWNrc1NlcVtkZWZ3UGluQ2JrXSA9IGY7Ci19Ci0KLQotdm9pZCBkZWZ3U2V0UGluUHJvcENiayhkZWZ3Vm9pZENia0ZuVHlwZSBmKSB7Ci0gIGRlZndDYWxsYmFja3NTZXFbZGVmd1BpblByb3BDYmtdID0gZjsKLX0KLQotCi12b2lkIGRlZndTZXRQcm9wRGVmQ2JrKGRlZndWb2lkQ2JrRm5UeXBlIGYpIHsKLSAgZGVmd0NhbGxiYWNrc1NlcVtkZWZ3UHJvcERlZkNia10gPSBmOwotfQotCi0KLXZvaWQgZGVmd1NldFJlZ2lvbkNiayhkZWZ3Vm9pZENia0ZuVHlwZSBmKSB7Ci0gIGRlZndDYWxsYmFja3NTZXFbZGVmd1JlZ2lvbkNia10gPSBmOwotfQotCi0KLXZvaWQgZGVmd1NldFJvd0NiayhkZWZ3Vm9pZENia0ZuVHlwZSBmKSB7Ci0gIGRlZndDYWxsYmFja3NTZXFbZGVmd1Jvd0Nia10gPSBmOwotfQotCi0KLXZvaWQgZGVmd1NldFNOZXRDYmsoZGVmd1ZvaWRDYmtGblR5cGUgZikgewotICBkZWZ3Q2FsbGJhY2tzU2VxW2RlZndTTmV0Q2JrXSA9IGY7Ci19Ci0KLQotdm9pZCBkZWZ3U2V0U2NhbmNoYWluQ2JrKGRlZndWb2lkQ2JrRm5UeXBlIGYpIHsKLSAgZGVmd0NhbGxiYWNrc1NlcVtkZWZ3U2NhbmNoYWluQ2JrXSA9IGY7Ci19Ci0KLQotdm9pZCBkZWZ3U2V0VGVjaG5vbG9neUNiayhkZWZ3Vm9pZENia0ZuVHlwZSBmKSB7Ci0gIGRlZndDYWxsYmFja3NTZXFbZGVmd1RlY2hDYmtdID0gZjsKLX0KLQotCi12b2lkIGRlZndTZXRUcmFja0NiayhkZWZ3Vm9pZENia0ZuVHlwZSBmKSB7Ci0gIGRlZndDYWxsYmFja3NTZXFbZGVmd1RyYWNrQ2JrXSA9IGY7Ci19Ci0KLQotdm9pZCBkZWZ3U2V0VW5pdHNDYmsoZGVmd1ZvaWRDYmtGblR5cGUgZikgewotICBkZWZ3Q2FsbGJhY2tzU2VxW2RlZndVbml0c0Nia10gPSBmOwotfQotCi0KLXZvaWQgZGVmd1NldFZlcnNpb25DYmsoZGVmd1ZvaWRDYmtGblR5cGUgZikgewotICBkZWZ3Q2FsbGJhY2tzU2VxW2RlZndWZXJzaW9uQ2JrXSA9IGY7Ci19Ci0KLQotdm9pZCBkZWZ3U2V0VmlhQ2JrKGRlZndWb2lkQ2JrRm5UeXBlIGYpIHsKLSAgZGVmd0NhbGxiYWNrc1NlcVtkZWZ3VmlhQ2JrXSA9IGY7Ci19Ci0KLQotLyogTkVXIENBTExCQUNLIC0gRWFjaCBjYWxsYmFjayByb3V0aW5lIG11c3QgaGF2ZSBhIHJvdXRpbmUgdGhhdCBhbGxvd3MKLSAqIHRoZSB1c2VyIHRvIHNldCBpdC4gIFRoZSBzZXQgcm91dGluZXMgZ28gaGVyZS4gKi8KLQotCi12b2lkIGRlZndTZXRMb2dGdW5jdGlvbihERUZJX0xPR19GVU5DVElPTiBmKSB7Ci0gIGRlZndFcnJvckxvZ0Z1bmN0aW9uID0gZjsKLX0KLQotdm9pZCBkZWZ3U2V0V2FybmluZ0xvZ0Z1bmN0aW9uKERFRklfV0FSTklOR19MT0dfRlVOQ1RJT04gZikgewotICBkZWZ3V2FybmluZ0xvZ0Z1bmN0aW9uID0gZjsKLX0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZndXcml0ZXJDYWxscy5ocHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmL2RlZndXcml0ZXJDYWxscy5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MGM0NWYuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9kZWZ3V3JpdGVyQ2FsbHMuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTMtMjAxNCwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpZm5kZWYgREVGSV9XUklURVJfSAotI2RlZmluZSBERUZJX1dSSVRFUl9ICi0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotIAotI2luY2x1ZGUgImRlZmlLUkRlZnMuaHBwIgotI2luY2x1ZGUgImRlZmlEZWZzLmhwcCIKLSNpbmNsdWRlICJkZWZpVXNlci5ocHAiCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLS8qCi0gKiBUaGUgbWFpbiB3cml0ZXIgZnVuY3Rpb24uCi0gKiBUaGUgZmlsZSBzaG91bGQgYWxyZWFkeSBiZSBvcGVuZWQuICBUaGlzIHJlcXVpcmVtZW50IGFsbG93cwotICogdGhlIHdyaXRlciB0byBiZSB1c2VkIHdpdGggc3RkaW4gb3IgYSBwaXBlLiAgVGhlIGZpbGUgbmFtZQotICogaXMgb25seSB1c2VkIGZvciBlcnJvciBtZXNzYWdlcy4gIFRoZSBpbmNsdWRlU2VhcmNoUGF0aCBpcwotICogYSBjb2xvbi1kZWxpbWl0ZWQgbGlzdCBvZiBkaXJlY3RvcmllcyBpbiB3aGljaCB0byBmaW5kCi0gKiBpbmNsdWRlIGZpbGVzLgotICovCi1leHRlcm4gaW50IGRlZndXcml0ZSAoICBGSUxFICpmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZpVXNlckRhdGEgdXNlckRhdGEgKTsKLQotLyoKLSAqIFNldCBhbGwgb2YgdGhlIGNhbGxiYWNrcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIHNldCB0byBhIGZ1bmN0aW9uCi0gKiB0aGF0IHdpbGwgYWRkIHVwIGhvdyBtYW55IHRpbWVzIGEgZ2l2ZW4gZGVmIGRhdGEgdHlwZSB3YXMgaWdub3JlZAotICogKGllIG5vIGNhbGxiYWNrIHdhcyBkb25lKS4gIFRoZSBzdGF0aXN0aWNzIGNhbiBsYXRlciBiZSBwcmludGVkIG91dC4KLSAqLwotZXh0ZXJuIHZvaWQgZGVmd1NldFJlZ2lzdGVyVW51c2VkQ2FsbGJhY2tzICh2b2lkKTsKLWV4dGVybiB2b2lkIGRlZndQcmludFVudXNlZENhbGxiYWNrcyAoRklMRSogbG9nKTsKLQotLyoKLSAqIFNldC9nZXQgdGhlIGNsaWVudC1wcm92aWRlZCB1c2VyIGRhdGEuICBkZWZpIGRvZXNuJ3QgbG9vayBhdAotICogdGhpcyBkYXRhIGF0IGFsbCwgaXQgc2ltcGx5IHBhc3NlcyB0aGUgb3BhcXVlIGRlZmlVc2VyRGF0YSBwb2ludGVyCi0gKiBiYWNrIHRvIHRoZSBhcHBsaWNhdGlvbiB3aXRoIGVhY2ggY2FsbGJhY2suICBUaGUgY2xpZW50IGNhbgotICogY2hhbmdlIHRoZSBkYXRhIGF0IGFueSB0aW1lLCBhbmQgaXQgd2lsbCB0YWtlIGVmZmVjdCBvbiB0aGUKLSAqIG5leHQgY2FsbGJhY2suICBUaGUgZGVmaSB3cml0ZXIgYW5kIHdyaXRlciBtYWludGFpbiBzZXBhcmF0ZQotICogdXNlciBkYXRhIHBvaW50ZXJzLgotICovCi1leHRlcm4gdm9pZCBkZWZ3U2V0VXNlckRhdGEgKCBkZWZpVXNlckRhdGEgKTsKLWV4dGVybiBkZWZpVXNlckRhdGEgZGVmd0dldFVzZXJEYXRhICggdm9pZCApOwotIAotLyoKLSAqIEFuIGVudW0gZGVzY3JpYmluZyBhbGwgb2YgdGhlIHR5cGVzIG9mIHdyaXRlciBjYWxsYmFja3MuCi0gKi8KLXR5cGVkZWYgZW51bSB7Ci0gIGRlZndVbnNwZWNpZmllZENia1R5cGUgPSAwLAotICBkZWZ3VmVyc2lvbkNia1R5cGUsCi0gIGRlZndDYXNlU2Vuc2l0aXZlQ2JrVHlwZSwKLSAgZGVmd0J1c0JpdENia1R5cGUsCi0gIGRlZndEaXZpZGVyQ2JrVHlwZSwKLSAgZGVmd0Rlc2lnbkNia1R5cGUsCi0gIGRlZndUZWNoQ2JrVHlwZSwKLSAgZGVmd0FycmF5Q2JrVHlwZSwKLSAgZGVmd0Zsb29yUGxhbkNia1R5cGUsCi0gIGRlZndVbml0c0Nia1R5cGUsCi0gIGRlZndIaXN0b3J5Q2JrVHlwZSwKLSAgZGVmd1Byb3BEZWZDYmtUeXBlLAotICBkZWZ3RGllQXJlYUNia1R5cGUsCi0gIGRlZndSb3dDYmtUeXBlLAotICBkZWZ3VHJhY2tDYmtUeXBlLAotICBkZWZ3R2NlbGxHcmlkQ2JrVHlwZSwKLSAgZGVmd0RlZmF1bHRDYXBDYmtUeXBlLAotICBkZWZ3Q2FucGxhY2VDYmtUeXBlLAotICBkZWZ3Q2Fubm90T2NjdXB5Q2JrVHlwZSwKLSAgZGVmd1ZpYUNia1R5cGUsCi0gIGRlZndSZWdpb25DYmtUeXBlLAotICBkZWZ3Q29tcG9uZW50Q2JrVHlwZSwKLSAgZGVmd1BpbkNia1R5cGUsCi0gIGRlZndQaW5Qcm9wQ2JrVHlwZSwKLSAgZGVmd1NOZXRDYmtUeXBlLAotICBkZWZ3TmV0Q2JrVHlwZSwKLSAgZGVmd0lPVGltaW5nQ2JrVHlwZSwKLSAgZGVmd1NjYW5jaGFpbkNia1R5cGUsCi0gIGRlZndDb25zdHJhaW50Q2JrVHlwZSwKLSAgZGVmd0Fzc2VydGlvbkNia1R5cGUsICAgIC8vIHByZSA1LjIKLSAgZGVmd0dyb3VwQ2JrVHlwZSwKLSAgZGVmd0Jsb2NrYWdlQ2JrVHlwZSwgICAgIC8vIDUuNAotICBkZWZ3RXh0Q2JrVHlwZSwKLSAgZGVmd0Rlc2lnbkVuZENia1R5cGUKLQotICAvKiBORVcgQ0FMTEJBQ0tTIC0gZWFjaCBjYWxsYmFjayBoYXMgaXRzIG93biB0eXBlLiAgRm9yIGVhY2ggY2FsbGJhY2sKLSAgICogdGhhdCB5b3UgYWRkLCB5b3UgbXVzdCBhZGQgYW4gaXRlbSB0byB0aGlzIGVudW0uICovCi0KLX0gZGVmd0NhbGxiYWNrVHlwZV9lOwotIAotIAotLyogRGVjbGFyYXRpb25zIG9mIGZ1bmN0aW9uIHNpZ25hdHVyZXMgZm9yIGVhY2ggdHlwZSBvZiBjYWxsYmFjay4KLSAqIFRoZXNlIGRlY2xhcmF0aW9ucyBhcmUgdHlwZS1zYWZlIHdoZW4gY29tcGlsaW5nIHdpdGggQU5TSSBDCi0gKiBvciBDKys7IHlvdSB3aWxsIG9ubHkgYmUgYWJsZSB0byByZWdpc3RlciBhIGZ1bmN0aW9uIHBvaW50ZXIKLSAqIHdpdGggdGhlIGNvcnJlY3Qgc2lnbmF0dXJlIGZvciBhIGdpdmVuIHR5cGUgb2YgY2FsbGJhY2suCi0gKgotICogRWFjaCBjYWxsYmFjayBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byByZXR1cm4gMCBpZiBzdWNjZXNzZnVsLgotICogQSBub24temVybyByZXR1cm4gY29kZSB3aWxsIGNhdXNlIHRoZSB3cml0ZXIgdG8gYWJvcnQuCi0gKgotICogVGhlIGRlZndEZXNpZ25TdGFydCBhbmQgZGVmd0Rlc2lnbkVuZCBjYWxsYmFjayBpcyBvbmx5IGNhbGxlZCBvbmNlLgotICogT3RoZXIgY2FsbGJhY2tzIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMsIGVhY2ggdGltZSB3aXRoIGEgZGlmZmVyZW50Ci0gKiBzZXQgb2YgZGF0YS4KLSAqCi0gKiBGb3IgZWFjaCBjYWxsYmFjaywgdGhlIERlZiBBUEkgd2lsbCBtYWtlIHRoZSBjYWxsYmFjayB0byB0aGUKLSAqIGZ1bmN0aW9uIHN1cHBsaWVkIGJ5IHRoZSBjbGllbnQsIHdoaWNoIHNob3VsZCBlaXRoZXIgbWFrZSBhIGNvcHkKLSAqIG9mIHRoZSBEZWYgb2JqZWN0LCBvciBzdG9yZSB0aGUgZGF0YSBpbiB0aGUgY2xpZW50J3Mgb3duIGRhdGEgc3RydWN0dXJlcy4KLSAqIFRoZSBEZWYgQVBJIHdpbGwgZGVsZXRlIG9yIHJldXNlIGVhY2ggb2JqZWN0IGFmdGVyIG1ha2luZyB0aGUgY2FsbGJhY2ssCi0gKiBzbyB0aGUgY2xpZW50IHNob3VsZCBub3Qga2VlcCBhIHBvaW50ZXIgdG8gaXQuCi0gKgotICogQWxsIGNhbGxiYWNrcyBwYXNzIHRoZSB1c2VyIGRhdGEgcG9pbnRlciBwcm92aWRlZCBpbiBkZWZ3UmVhZCgpCi0gKiBvciBkZWZ3U2V0VXNlckRhdGEoKSBiYWNrIHRvIHRoZSBjbGllbnQ7IHRoaXMgY2FuIGJlIHVzZWQgYnkgdGhlCi0gKiBjbGllbnQgdG8gb2J0YWluIGFjY2VzcyB0byB0aGUgcmVzdCBvZiB0aGUgY2xpZW50J3MgZGF0YSBzdHJ1Y3R1cmVzLgotICoKLSAqIFRoZSB1c2VyIGRhdGEgcG9pbnRlciBpcyBvYnRhaW5lZCB1c2luZyBkZWZ3R2V0VXNlckRhdGEoKSBpbW1lZGlhdGVseQotICogcHJpb3IgdG8gbWFraW5nIGVhY2ggY2FsbGJhY2ssIHNvIHRoZSBjbGllbnQgaXMgZnJlZSB0byBjaGFuZ2UgdGhlCi0gKiB1c2VyIGRhdGEgb24gdGhlIGZseSBpZiBuZWNlc3NhcnkuCi0gKgotICogQ2FsbGJhY2tzIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGFyZSBwYXNzZWQgYSBjYWxsYmFjayB0eXBlCi0gKiBwYXJhbWV0ZXIsIHdoaWNoIGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byB3cml0ZSBhIHNpbmdsZSBjYWxsYmFjawotICogZnVuY3Rpb24sIHJlZ2lzdGVyIHRoYXQgZnVuY3Rpb24gZm9yIG11bHRpcGxlIGNhbGxiYWNrcywgdGhlbgotICogc3dpdGNoIGJhc2VkIG9uIHRoZSBjYWxsYmFjayB0eXBlIHRvIGhhbmRsZSB0aGUgYXBwcm9wcmlhdGUgdHlwZSBvZgotICogZGF0YS4KLSAqLwotIAotCi0vKiBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBub3RoaW5nLiAqLwotdHlwZWRlZiBpbnQgKCpkZWZ3Vm9pZENia0ZuVHlwZSkgKCBkZWZ3Q2FsbGJhY2tUeXBlX2UsIGRlZmlVc2VyRGF0YSApOwotCi0vKiBGdW5jdGlvbnMgdG8gY2FsbCB0byByZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uLgotICovCi1leHRlcm4gdm9pZCBkZWZ3U2V0QXJyYXlDYmsgKGRlZndWb2lkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZndTZXRBc3NlcnRpb25DYmsgKGRlZndWb2lkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZndTZXRCbG9ja2FnZUNiayAoZGVmd1ZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmd1NldEJ1c0JpdENiayAoZGVmd1ZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmd1NldENhbm5vdE9jY3VweUNiayAoZGVmd1ZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmd1NldENhbnBsYWNlQ2JrIChkZWZ3Vm9pZENia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZ3U2V0Q2FzZVNlbnNpdGl2ZUNiayAoZGVmd1ZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmd1NldENvbXBvbmVudENiayAoZGVmd1ZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmd1NldENvbnN0cmFpbnRDYmsgKGRlZndWb2lkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZndTZXREZWZhdWx0Q2FwQ2JrIChkZWZ3Vm9pZENia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZ3U2V0RGVzaWduQ2JrIChkZWZ3Vm9pZENia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZ3U2V0RGVzaWduRW5kQ2JrIChkZWZ3Vm9pZENia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZ3U2V0RGllQXJlYUNiayAoZGVmd1ZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmd1NldERpdmlkZXJDYmsgKGRlZndWb2lkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZndTZXRFeHRDYmsgKGRlZndWb2lkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZndTZXRGbG9vclBsYW5DYmsgKGRlZndWb2lkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZndTZXRHY2VsbEdyaWRDYmsgKGRlZndWb2lkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZndTZXRHcm91cENiayAoZGVmd1ZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmd1NldEhpc3RvcnlDYmsgKGRlZndWb2lkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZndTZXRJT1RpbWluZ0NiayAoZGVmd1ZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmd1NldE5ldENiayAoZGVmd1ZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmd1NldFBpbkNiayAoZGVmd1ZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmd1NldFBpblByb3BDYmsgKGRlZndWb2lkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZndTZXRQcm9wRGVmQ2JrIChkZWZ3Vm9pZENia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZ3U2V0UmVnaW9uQ2JrIChkZWZ3Vm9pZENia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZ3U2V0Um93Q2JrIChkZWZ3Vm9pZENia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZ3U2V0U05ldENiayAoZGVmd1ZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmd1NldFNjYW5jaGFpbkNiayAoZGVmd1ZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmd1NldFRlY2hub2xvZ3lDYmsgKGRlZndWb2lkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGRlZndTZXRUcmFja0NiayAoZGVmd1ZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmd1NldFVuaXRzQ2JrIChkZWZ3Vm9pZENia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBkZWZ3U2V0VmVyc2lvbkNiayAoZGVmd1ZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgZGVmd1NldFZpYUNiayAoZGVmd1ZvaWRDYmtGblR5cGUpOwotCi0vKiBORVcgQ0FMTEJBQ0sgLSBlYWNoIGNhbGxiYWNrIG11c3QgaGF2ZSBhIGZ1bmN0aW9uIHRvIGFsbG93IHRoZSB1c2VyCi0gKiB0byBzZXQgaXQuICBBZGQgdGhlIGZ1bmN0aW9uIGhlcmUuICovCi0KLQotLyoKLSAqIFNldCBhbGwgb2YgdGhlIGNhbGxiYWNrcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIHNldCB0byB0aGUgZm9sbG93aW5nCi0gKiBmdW5jdGlvbi4gIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgaWYgeW91IHdhbnQgdG8gY2hlY2sgdG8gc2VlCi0gKiBpZiB5b3UgZm9yZ290IGFueXRoaW5nLgotICovCi1leHRlcm4gdm9pZCBkZWZ3U2V0VW51c2VkQ2FsbGJhY2tzIChkZWZ3Vm9pZENia0ZuVHlwZSBmdW5jKTsKLQotLyogUm91dGluZSB0byBzZXQgdGhlIG1lc3NhZ2UgbG9nZ2luZyByb3V0aW5lIGZvciBlcnJvcnMgKi8KLSNpZm5kZWYgREVGSV9MT0dfRlVOQ1RJT04KLSAgICB0eXBlZGVmIHZvaWQgKCpERUZJX0xPR19GVU5DVElPTikgKGNvbnN0IGNoYXIqKTsKLSNlbmRpZgotCi1leHRlcm4gdm9pZCBkZWZ3U2V0TG9nRnVuY3Rpb24gKCBERUZJX0xPR19GVU5DVElPTiApOwotCi0vKiBSb3V0aW5lIHRvIHNldCB0aGUgbWVzc2FnZSBsb2dnaW5nIHJvdXRpbmUgZm9yIHdhcm5pbmdzICovCi0jaWZuZGVmIERFRklfV0FSTklOR19MT0dfRlVOQ1RJT04KLSAgICB0eXBlZGVmIHZvaWQgKCpERUZJX1dBUk5JTkdfTE9HX0ZVTkNUSU9OKShjb25zdCBjaGFyKik7Ci0jZW5kaWYKLQotZXh0ZXJuIHZvaWQgZGVmd1NldFdhcm5pbmdMb2dGdW5jdGlvbiggREVGSV9XQVJOSU5HX0xPR19GVU5DVElPTiApOwotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotVVNFX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9sZXguaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWYvbGV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNDgyMGEuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZi9sZXguaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IDIwMTQsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLSAqIAotICogVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLSAqIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotICogICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogCi0gKiBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotICogY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAotICogICRBdXRob3I6IGRlbGwgJAotICogICRSZXZpc2lvbjogIzEgJAotICogICREYXRlOiAyMDE3LzA2LzA2ICQKLSAqICAkU3RhdGU6ICAkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiZGVmaUtSRGVmcy5ocHAiCi0jaW5jbHVkZSAiZGVmckRhdGEuaHBwIgotCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLWV4dGVybiB2b2lkIGxleF9pbml0KCk7Ci1leHRlcm4gdm9pZCBsZXhfdW5faW5pdCgpOwotZXh0ZXJuIGludCBkZWZ5eXBhcnNlKGRlZnJEYXRhICpkYXRhKTsKLQotdm9pZCBBZGRTdHJpbmdEZWZpbmUoY2hhciAqdG9rZW4sIGNoYXIgKnN0cmluZyk7Ci12b2lkIEFkZEJvb2xlYW5EZWZpbmUoY2hhciAqdG9rZW4sIGludCB2YWwpOwotdm9pZCBBZGROdW1EZWZpbmUoY2hhciAqdG9rZW4sIGRvdWJsZSB2YWwpOwotCi1pbnQgZmFrZV9mdGVsbCgpOwotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWZkaWZmL2RpZmZEZWZSVy5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmZGlmZi9kaWZmRGVmUlcuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmViMDg4Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWZkaWZmL2RpZmZEZWZSVy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUzICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTQgLSAyMDE1LCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3IkCi0vLyAgJFJldmlzaW9uJAotLy8gICREYXRlJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIAotLy8gVGhpcyBwcm9ncmFtIGlzIHRoZSBkaWZmRGVmIGNvcmUgcHJvZ3JhbS4gIEl0IGhhcyBhbGwgdGhlIGNhbGxiYWNrCi0vLyByb3V0aW5lcyBhbmQgd3JpdGUgaXQgb3V0IHRvIGEgdGVtcG9yYXJ5IGZpbGUuCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaWZuZGVmIFdJTjMyCi0jICAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYgLyogbm90IFdJTjMyICovCi0jaW5jbHVkZSAiZGVmclJlYWRlci5ocHAiCi0KLQotY2hhciBkZWZhdWx0TmFtZVs2NF07Ci1jaGFyIGRlZmF1bHRPdXRbNjRdOwotc3RhdGljIGludCBpZ25vcmVQRSA9IDA7Ci1zdGF0aWMgaW50IGlnbm9yZVJOID0gMDsKLXN0YXRpYyBpbnQgaWdub3JlVk4gPSAwOwotc3RhdGljIGludCBuZXRTZUNtcCA9IDA7Ci0KLS8vIEdsb2JhbCB2YXJpYWJsZXMKLUZJTEUqIGZvdXQ7Ci12b2lkICAqdXNlckRhdGE7Ci1pbnQgbnVtT2JqczsKLWludCBpc1N1bVNldDsgICAgICAvLyB0byBrZWVwIHRyYWNrIGlmIHdpdGhpbiBTVU0KLWludCBpc1Byb3AgPSAwOyAgICAvLyBmb3IgUFJPUERFRgotaW50IGJlZ09wZXJhbmQ7ICAgIC8vIHRvIGtlZXAgdHJhY2sgZm9yIGNvbnN0cmFpbnQsIHRvIHByaW50IC0gYXMgdGhlIDFzdCBjaGFyCi1zdGF0aWMgZG91YmxlIGN1clZlciA9IDUuNzsKLQotLy8gVFhfRElSOlRSQU5TTEFUSU9OIE9OCi0KLXZvaWQgZGF0YUVycm9yKCkgewotICBmcHJpbnRmKGZvdXQsICJFUlJPUjogcmV0dXJuZWQgdXNlciBkYXRhIGlzIG5vdCBjb3JyZWN0IVxuIik7Ci19Ci0KLQotdm9pZCBjaGVja1R5cGUoZGVmckNhbGxiYWNrVHlwZV9lIGMpIHsKLSAgaWYgKGMgPj0gMCAmJiBjIDw9IGRlZnJEZXNpZ25FbmRDYmtUeXBlKSB7Ci0gICAgLy8gT0sKLSAgfSBlbHNlIHsKLSAgICBmcHJpbnRmKGZvdXQsICJFUlJPUjogY2FsbGJhY2sgdHlwZSBpcyBvdXQgb2YgYm91bmRzIVxuIik7Ci0gIH0KLX0KLQotLy8gMDUvMjQvMjAwMSAtIFdhbmRhIGRhIFJvc2EuICBQQ1IgMzczMTcwCi0vLyBUaGlzIGZ1bmN0aW9uIGlzIGFkZGVkIGR1ZSB0byB0aGUgcm91bmRpbmcgYmV0d2VlbiBtYWNoaW5lcyBhcmUKLS8vIGRpZmZlcmVudC4gIEZvciBhIDUsIHNvbGFyaWVzIHdpbGwgcm91bmQgZG93biB3aGlsZSBocHBhIHdpbGwgcm91bmR1cC4KLS8vIFRoaXMgZnVuY3Rpb24gd2lsbCBtYWtlIHN1cmUgaXQgcm91bmQgdXAgZm9yIGFsbCB0aGUgbWFjaGluZQotZG91YmxlIGNoZWNrRG91YmxlKGRvdWJsZSBudW0pIHsKLSAgbG9uZyB0ZW1wTnVtOwotICBpZiAoKG51bSA+IDEwMDAwMDQpIHx8IChudW0gPCAtMTAwMDAwNCkpIHsKLSAgICAgdGVtcE51bSA9IChsb25nKW51bTsKLSAgICAgaWYgKCh0ZW1wTnVtJTUpID09IDApCi0gICAgICAgIHJldHVybiBudW0gKyAzOwotICB9Ci0gIHJldHVybiBudW07Ci19Ci0KLWludCBjb21wTVNMKGRlZnJDYWxsYmFja1R5cGVfZSBjLCBkZWZpQ29tcG9uZW50TWFza1NoaWZ0TGF5ZXIqIGNvLCBkZWZpVXNlckRhdGEgdWQpIHsKLSAgaW50IGk7Ci0KLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotCi0gICAgaWYgKGNvLT5udW1NYXNrU2hpZnRMYXllcnMoKSkgewotCWZwcmludGYoZm91dCwgIlxuQ09NUE9ORU5UTUFTS1NISUZUICIpOwotCQotCWZvciAoaSA9IDA7IGkgPCBjby0+bnVtTWFza1NoaWZ0TGF5ZXJzKCk7IGkrKykgewotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAiLCBjby0+bWFza1NoaWZ0TGF5ZXIoaSkpOwotCX0KLQlmcHJpbnRmKGZvdXQsICI7XG4iKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLy8gQ29tcG9uZW50Ci1pbnQgY29tcGYoZGVmckNhbGxiYWNrVHlwZV9lIGMsIGRlZmlDb21wb25lbnQqIGNvLCBkZWZpVXNlckRhdGEgdWQpIHsKLSAgaW50IGk7Ci0KLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotLy8gIG1pc3NpbmcgR0VORVJBVEUsIEZPUkVJR04KLSAgICBmcHJpbnRmKGZvdXQsICJDT01QICVzICVzIiwgY28tPmlkKCksIGNvLT5uYW1lKCkpOwotICAgIGlmIChjby0+aGFzTmV0cygpKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjby0+bnVtTmV0cygpOyBpKyspCi0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVzIiwgY28tPm5ldChpKSk7Ci0gICAgICAgIGZwcmludGYoZm91dCwiXG4iKTsKLSAgICB9IGVsc2UKLSAgICAgICAgZnByaW50Zihmb3V0LCJcbiIpOwotICAgIGlmIChjby0+aXNGaXhlZCgpKSAKLSAgICAgICAgZnByaW50Zihmb3V0LCAiQ09NUCAlcyBGSVhFRCAoICVkICVkICkgJXNcbiIsIGNvLT5pZCgpLAotICAgICAgICAgICAgICAgIGNvLT5wbGFjZW1lbnRYKCksIGNvLT5wbGFjZW1lbnRZKCksIGNvLT5wbGFjZW1lbnRPcmllbnRTdHIoKSk7Ci0gICAgaWYgKGNvLT5pc0NvdmVyKCkpIAotICAgICAgICBmcHJpbnRmKGZvdXQsICJDT01QICVzIENPVkVSICggJWQgJWQgKSAlc1xuIiwgY28tPmlkKCksCi0gICAgICAgICAgICAgICAgY28tPnBsYWNlbWVudFgoKSwgY28tPnBsYWNlbWVudFkoKSwgY28tPnBsYWNlbWVudE9yaWVudFN0cigpKTsKLSAgICBpZiAoY28tPmlzUGxhY2VkKCkpIAotICAgICAgICBmcHJpbnRmKGZvdXQsIkNPTVAgJXMgUExBQ0VEICggJWQgJWQgKSAlc1xuIiwgY28tPmlkKCksCi0gICAgICAgICAgICAgICAgY28tPnBsYWNlbWVudFgoKSwgY28tPnBsYWNlbWVudFkoKSwgY28tPnBsYWNlbWVudE9yaWVudFN0cigpKTsKLSAgICBpZiAoY28tPmlzVW5wbGFjZWQoKSkgCi0gICAgICAgIGZwcmludGYoZm91dCwiQ09NUCAlcyBVTlBMQUNFRFxuIiwgY28tPmlkKCkpOwotICAgIGlmIChjby0+aGFzU291cmNlKCkpCi0gICAgICAgIGZwcmludGYoZm91dCwgIkNPTVAgJXMgU09VUkNFICVzXG4iLCBjby0+aWQoKSwgY28tPnNvdXJjZSgpKTsKLSAgICBpZiAoY28tPmhhc0dlbmVyYXRlKCkpCi0gICAgICAgIGZwcmludGYoZm91dCwgIkNPTVAgJXMgR0VORVJBVEUgJXMgJXNcbiIsIGNvLT5pZCgpLAotICAgICAgICAgICAgICAgIGNvLT5nZW5lcmF0ZU5hbWUoKSwgY28tPm1hY3JvTmFtZSgpKTsKLSAgICBpZiAoY28tPmhhc0hhbG8oKSkgewotICAgICAgICBpbnQgbGVmdCwgYm90dG9tLCByaWdodCwgdG9wOwotICAgICAgICAodm9pZCkgY28tPmhhbG9FZGdlcygmbGVmdCwgJmJvdHRvbSwgJnJpZ2h0LCAmdG9wKTsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiQ09NUCAlcyBIQUxPIiwgY28tPmlkKCkpOwotICAgICAgICBpZiAoY28tPmhhc0hhbG9Tb2Z0KCkpCi0gICAgICAgICAgIGZwcmludGYoZm91dCwgIiBTT0ZUIik7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIiAlZCAlZCAlZCAlZFxuIiwgbGVmdCwgYm90dG9tLCByaWdodCwgdG9wKTsKLSAgICAgICAgCi0gICAgfQotICAgIGlmIChjby0+aGFzUm91dGVIYWxvKCkpIHsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiQ09NUCAlcyBST1VURUhBTE8gJWQgJXMgJXNcbiIsIGNvLT5pZCgpLAotICAgICAgICAgICAgICAgIGNvLT5oYWxvRGlzdCgpLCBjby0+bWluTGF5ZXIoKSwgY28tPm1heExheWVyKCkpOwotICAgIH0KLSAgICBpZiAoY28tPmhhc0ZvcmVpZ25OYW1lKCkpCi0gICAgICAgIGZwcmludGYoZm91dCwgIkNPTVAgJXMgRk9SRUlHTiAlcyAlZCAlZCAlc1xuIiwgY28tPmlkKCksCi0gICAgICAgICAgICAgICAgY28tPmZvcmVpZ25OYW1lKCksIGNvLT5mb3JlaWduWCgpLCBjby0+Zm9yZWlnblkoKSwKLSAgICAgICAgICAgICAgICBjby0+Zm9yZWlnbk9yaSgpKTsKLSAgICBpZiAoY28tPmhhc1dlaWdodCgpKQotICAgICAgICBmcHJpbnRmKGZvdXQsICJDT01QICVzIFdFSUdIVCAlZFxuIiwgY28tPmlkKCksIGNvLT53ZWlnaHQoKSk7Ci0gICAgaWYgKGNvLT5oYXNFRVEoKSkKLSAgICAgICAgZnByaW50Zihmb3V0LCAiQ09NUCAlcyBFRVFNQVNURVIgJXNcbiIsIGNvLT5pZCgpLCBjby0+RUVRKCkpOwotICAgIGlmIChjby0+aGFzUmVnaW9uTmFtZSgpKQotICAgICAgICBmcHJpbnRmKGZvdXQsICJDT01QICVzIFJFR0lPTiAlc1xuIiwgY28tPmlkKCksIGNvLT5yZWdpb25OYW1lKCkpOwotICAgIGlmIChjby0+aGFzUmVnaW9uQm91bmRzKCkpIHsKLSAgICAgICAgaW50ICp4bCwgKnlsLCAqeGgsICp5aDsKLSAgICAgICAgaW50IHNpemU7Ci0gICAgICAgIGNvLT5yZWdpb25Cb3VuZHMoJnNpemUsICZ4bCwgJnlsLCAmeGgsICZ5aCk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsgCi0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJDT01QICVzIFJFR0lPTiAoICVkICVkICkgKCAlZCAlZCApXG4iLCBjby0+aWQoKSwKLSAgICAgICAgICAgICAgICAgICAgeGxbaV0sIHlsW2ldLCB4aFtpXSwgeWhbaV0pOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChjby0+bWFza1NoaWZ0U2l6ZSgpKSB7Ci0JZnByaW50Zihmb3V0LCAiTUFTS1NISUZUICIpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSBjby0+bWFza1NoaWZ0U2l6ZSgpLTE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlZCIsIGNvLT5tYXNrU2hpZnQoaSkpOwotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgfQotICAgIGlmIChjby0+bnVtUHJvcHMoKSkgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY28tPm51bVByb3BzKCk7IGkrKykgewotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiQ09NUCAlcyBQUk9QICVzICVzICIsIGNvLT5pZCgpLAotICAgICAgICAgICAgICAgICAgICBjby0+cHJvcE5hbWUoaSksCi0gICAgICAgICAgICAgICAgICAgIGNvLT5wcm9wVmFsdWUoaSkpOwotICAgICAgICAgICAgc3dpdGNoIChjby0+cHJvcFR5cGUoaSkpIHsKLSAgICAgICAgICAgICAgIGNhc2UgJ1InOiBmcHJpbnRmKGZvdXQsICJSRUFMICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAnSSc6IGZwcmludGYoZm91dCwgIklOVCAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgJ1MnOiBmcHJpbnRmKGZvdXQsICJTVFIgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlICdRJzogZnByaW50Zihmb3V0LCAiUVNUUiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgJ04nOiBmcHJpbnRmKGZvdXQsICJOVU0gIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLS1udW1PYmpzOwotICByZXR1cm4gMDsKLX0KLQotLy8gTmV0Ci1pbnQgbmV0ZihkZWZyQ2FsbGJhY2tUeXBlX2UgYywgZGVmaU5ldCogbmV0LCBkZWZpVXNlckRhdGEgdWQpIHsKLSAgLy8gRm9yIG5ldCBhbmQgc3BlY2lhbCBuZXQuCi0gIGludCAgICAgICAgIGksIGosIGssIHcsIHgsIHksIHosIHB4LCBweSwgcHo7Ci0gIGRlZmlQYXRoKiAgIHA7Ci0gIGRlZmlTdWJuZXQqIHM7Ci0gIGludCAgICAgICAgIHBhdGg7Ci0gIGRlZmlWcGluICAgKnZwaW47Ci0gIGRlZmlTaGllbGQqIG5vU2hpZWxkOwotICBkZWZpV2lyZSogICB3aXJlOwotICBpbnQgICAgICAgICBubGluZTsKLSAgY29uc3QgY2hhciogbGF5ZXJOYW1lID0gIk4vQSI7Ci0KLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBpZiAoYyAhPSBkZWZyTmV0Q2JrVHlwZSkKLSAgICAgIGZwcmludGYoZm91dCwgIkJPR1VTIE5FVCBUWVBFICAiKTsKLSAgaWYgKG5ldC0+cGluSXNNdXN0Sm9pbigwKSkKLSAgICAgIGZwcmludGYoZm91dCwgIk5FVCBNVVNUSk9JTiAiKTsKLSAgZWxzZQotICAgICAgZnByaW50Zihmb3V0LCAiTkVUICVzICIsIG5ldC0+bmFtZSgpKTsKLSAKLSAgLy8gY29tcE5hbWUgJiBwaW5OYW1lCi0gIGZvciAoaSA9IDA7IGkgPCBuZXQtPm51bUNvbm5lY3Rpb25zKCk7IGkrKykgewotICAgICAgZnByaW50Zihmb3V0LCAiXG5ORVQgJXMgKCAlcyAlcyApICIsIG5ldC0+bmFtZSgpLCBuZXQtPmluc3RhbmNlKGkpLAotICAgICAgICAgICAgICBuZXQtPnBpbihpKSk7Ci0gIH0KLQotICBpZiAobmV0LT5oYXNOb25EZWZhdWx0UnVsZSgpKQotICAgICAgZnByaW50Zihmb3V0LCAiXG5ORVQgJXMgTk9OREVGQVVMVFJVTEUgJXMiLCBuZXQtPm5hbWUoKSwKLSAgICAgICAgICAgICAgbmV0LT5ub25EZWZhdWx0UnVsZSgpKTsKLSAKLSAgZm9yIChpID0gMDsgaSA8IG5ldC0+bnVtVnBpbnMoKTsgaSsrKSB7Ci0gICAgICB2cGluID0gbmV0LT52cGluKGkpOwotICAgICAgZnByaW50Zihmb3V0LCAiXG5ORVQgJXMgJXMiLCBuZXQtPm5hbWUoKSwgdnBpbi0+bmFtZSgpKTsKLSAgICAgIGlmICh2cGluLT5sYXllcigpKQotICAgICAgICAgIGZwcmludGYoZm91dCwgIiAlcyIsIHZwaW4tPmxheWVyKCkpOwotICAgICAgZnByaW50Zihmb3V0LCAiICVkICVkICVkICVkIiwgdnBpbi0+eGwoKSwgdnBpbi0+eWwoKSwgdnBpbi0+eGgoKSwKLSAgICAgICAgICAgICAgdnBpbi0+eWgoKSk7Ci0gICAgICBpZiAodnBpbi0+c3RhdHVzKCkgIT0gJyAnKSB7Ci0gICAgICAgICAgc3dpdGNoICh2cGluLT5zdGF0dXMoKSkgewotICAgICAgICAgICAgICBjYXNlICdQJzoKLSAgICAgICAgICAgICAgY2FzZSAncCc6Ci0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIFBMQUNFRCIpOyAKLSAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSAnRic6Ci0gICAgICAgICAgICAgIGNhc2UgJ2YnOgotICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBGSVhFRCIpOyAKLSAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSAnQyc6Ci0gICAgICAgICAgICAgIGNhc2UgJ2MnOgotICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBDT1ZFUiIpOyAKLSAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZnByaW50Zihmb3V0LCAiICVkICVkIiwgdnBpbi0+eExvYygpLCB2cGluLT55TG9jKCkpOwotICAgICAgICAgIGlmICh2cGluLT5vcmllbnQoKSAhPSAtMSkKLSAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVzIiwgdnBpbi0+b3JpZW50U3RyKCkpOwotICAgICAgfQotICB9Ci0KLSAgLy8gcmVndWxhcldpcmluZwotICBpZiAobmV0LT5udW1XaXJlcygpKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IG5ldC0+bnVtV2lyZXMoKTsgaSsrKSB7Ci0gICAgICB3aXJlID0gbmV0LT53aXJlKGkpOwotICAgICAgZm9yIChqID0gMDsgaiA8IHdpcmUtPm51bVBhdGhzKCk7IGorKykgewotICAgICAgICBwID0gd2lyZS0+cGF0aChqKTsKLSAgICAgICAgcC0+aW5pdFRyYXZlcnNlKCk7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIlxuTkVUICVzICVzIiwgbmV0LT5uYW1lKCksIHdpcmUtPndpcmVUeXBlKCkpOwotICAgICAgICBubGluZSA9IDA7Ci0gICAgICAgIHdoaWxlICgocGF0aCA9IChpbnQpcC0+bmV4dCgpKSAhPSBERUZJUEFUSF9ET05FKSB7Ci0gICAgICAgICAgc3dpdGNoIChwYXRoKSB7Ci0gICAgICAgICAgICBjYXNlIERFRklQQVRIX0xBWUVSOgotICAgICAgICAgICAgICAgICBpZiAoIW5ldFNlQ21wKQotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgJXMiLCBwLT5nZXRMYXllcigpKTsKLSAgICAgICAgICAgICAgICAgbGF5ZXJOYW1lID0gcC0+Z2V0TGF5ZXIoKTsKLSAgICAgICAgICAgICAgICAgcHggPSBweSA9IHB6ID0gLTk5OyAgICAgLy8gcmVzZXQgdGhlIDEgc2V0IG9mIHBvaW50IHRvIDAKLSAgICAgICAgICAgICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgREVGSVBBVEhfTUFTSzoKLQkJIGZwcmludGYoZm91dCwgIk1BU0sgJWQgIiwgcC0+Z2V0TWFzaygpKTsKLSAgICAgICAgICAgICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgREVGSVBBVEhfVklBTUFTSzoKLSAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIk1BU0sgJWQlZCVkICIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRWaWFUb3BNYXNrKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRWaWFDdXRNYXNrKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmdldFZpYUJvdHRvbU1hc2soKSk7Ci0gICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9WSUE6Ci0gICAgICAgICAgICAgICAgIGlmICghbmV0U2VDbXApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpZ25vcmVWTikKLSAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVzIiwgcC0+Z2V0VmlhKCkpOwotICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAobmxpbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpZ25vcmVWTikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG5ORVQgJXMgJXMgKCAlZCAlZCApICVzIiwgbmV0LT5uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lyZS0+d2lyZVR5cGUoKSwgcHgsIHB5LCBwLT5nZXRWaWEoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG5ORVQgJXMgJXMgKCAlZCAlZCApIiwgbmV0LT5uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lyZS0+d2lyZVR5cGUoKSwgcHgsIHB5KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpZ25vcmVWTikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICggJWQgJWQgKSAlcyIsIHB4LCBweSwgcC0+Z2V0VmlhKCkpOwotICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAoICVkICVkICkiLCBweCwgcHkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHB4ID0gcHkgPSBweiA9IC05OTsgICAgIC8vIHJlc2V0IHRoZSAxIHNldCBvZiBwb2ludCB0byAwCi0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgbmxpbmUgPSAxOwotICAgICAgICAgICAgICAgICBicmVhazsKLQkgICAgY2FzZSBERUZJUEFUSF9SRUNUOgotCQkgcC0+Z2V0VmlhUmVjdCgmdywgJngsICZ5LCAmeik7Ci0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlJFQ1QgKCAlZCAlZCAlZCAlZCApICIsIHcsIHgsIHksIHopOwotICAgICAgICAgICAgICAgICBicmVhazsKLQkgICAgY2FzZSBERUZJUEFUSF9WSVJUVUFMUE9JTlQ6Ci0JICAgICAgICAgcC0+Z2V0VmlydHVhbFBvaW50KCZ4LCAmeSk7Ci0JCSBmcHJpbnRmKGZvdXQsICJWSVJUVUFMICggJWQgJWQgKSAiLCB4LCB5KTsKLSAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIERFRklQQVRIX1ZJQVJPVEFUSU9OOgotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlZCAiLHAtPmdldFZpYVJvdGF0aW9uKCkpOwotICAgICAgICAgICAgICAgICBubGluZSA9IDE7Ci0gICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9XSURUSDoKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVkICIsIHAtPmdldFdpZHRoKCkpOwotICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfUE9JTlQ6Ci0gICAgICAgICAgICAgICAgIHAtPmdldFBvaW50KCZ4LCAmeSk7Ci0gICAgICAgICAgICAgICAgIGlmICghbmV0U2VDbXApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFubGluZSkgewotICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgKCAlZCAlZCApIiwgeCwgeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIG5saW5lID0gMTsgCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuTkVUICVzICVzICVzICggJWQgJWQgKSIsIG5ldC0+bmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpcmUtPndpcmVUeXBlKCksIGxheWVyTmFtZSwgeCwgeSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChweCA9PSAtOTkpICYmIChweSA9PSAtOTkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHB4ID0geDsKLSAgICAgICAgICAgICAgICAgICAgICAgcHkgPSB5OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICBpZiAobmxpbmUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuTkVUICVzICVzICVzIiwgbmV0LT5uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lyZS0+d2lyZVR5cGUoKSwgbGF5ZXJOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB4IDwgeCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmIChmb3V0LCAiICggJWQgJWQgKSAoICVkICVkICkiLCBweCwgcHksIHgsIHkpOwotICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHB4ID09IHgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB5IDwgeSkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmIChmb3V0LCAiICggJWQgJWQgKSAoICVkICVkICkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHgsIHB5LCB4LCB5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZiAoZm91dCwgIiAoICVkICVkICkgKCAlZCAlZCApIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHksIHB4LCBweSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAvLyBweCA+IHgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZiAoZm91dCwgIiAoICVkICVkICkgKCAlZCAlZCApIiwgeCwgeSwgcHgsIHB5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICBweCA9IHg7Ci0gICAgICAgICAgICAgICAgICAgICAgIHB5ID0geTsKLSAgICAgICAgICAgICAgICAgICAgICAgbmxpbmUgPSAxOyAKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9GTFVTSFBPSU5UOgotICAgICAgICAgICAgICAgICBwLT5nZXRGbHVzaFBvaW50KCZ4LCAmeSwgJnopOwotICAgICAgICAgICAgICAgICBpZiAoIW5ldFNlQ21wKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbmxpbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICggJWQgJWQgJWQgKSIsIHgsIHksIHopOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbk5FVCAlcyAlcyAlcyAoICVkICVkICVkICkiLCBuZXQtPm5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXJlLT53aXJlVHlwZSgpLCBsYXllck5hbWUsIHgsIHksIHopOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgocHggPT0gLTk5KSAmJiAocHkgPT0gLTk5KSAmJiAocHogPT0gLTk5KSkgewotICAgICAgICAgICAgICAgICAgICAgICBweCA9IHg7Ci0gICAgICAgICAgICAgICAgICAgICAgIHB5ID0geTsKLSAgICAgICAgICAgICAgICAgICAgICAgcHogPSB6OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICBpZiAobmxpbmUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuTkVUICVzICVzICVzIiwgbmV0LT5uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lyZS0+d2lyZVR5cGUoKSwgbGF5ZXJOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB4IDwgeCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHogIT0gLTk5KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmIChmb3V0LCAiICggJWQgJWQgJWQgKSAoICVkICVkICVkICkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweCwgcHksIHB6LCB4LCB5LCB6KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmIChmb3V0LCAiICggJWQgJWQgKSAoICVkICVkICVkICkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweCwgcHksIHgsIHksIHopOwotICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHB4ID09IHgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB5IDwgeSkgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB6ICE9IC05OSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZiAoZm91dCwgIiAoICVkICVkICVkICkgKCAlZCAlZCAlZCApIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHgsIHB5LCBweiwgeCwgeSwgeik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZiAoZm91dCwgIiAoICVkICVkICkgKCAlZCAlZCAlZCApIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHgsIHB5LCB4LCB5LCB6KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB6ICE9IC05OSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZiAoZm91dCwgIiAoICVkICVkICVkICkgKCAlZCAlZCAlZCApIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgeSwgeiwgcHgsIHB5LCBweik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZiAoZm91dCwgIiAoICVkICVkICVkICkgKCAlZCAlZCApIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgeSwgeiwgcHgsIHB5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgLy8gcHggPiB4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChweiAhPSAtOTkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYgKGZvdXQsICIgKCAlZCAlZCAlZCApICggJWQgJWQgJWQgKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHksIHosIHB4LCBweSwgcHopOwotICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYgKGZvdXQsICIgKCAlZCAlZCAlZCApICggJWQgJWQgKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHksIHosIHB4LCBweSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgcHggPSB4OwotICAgICAgICAgICAgICAgICAgICAgICBweSA9IHk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHB6ID0gejsKLSAgICAgICAgICAgICAgICAgICAgICAgbmxpbmUgPSAxOyAKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9UQVBFUjoKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIFRBUEVSIik7Ci0gICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9UQVBFUlJVTEU6Ci0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBUQVBFUlJVTEUgJXMiLHAtPmdldFRhcGVyUnVsZSgpKTsKLSAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gc2hpZWxkbmV0Ci0gIGlmIChuZXQtPm51bVNoaWVsZE5ldHMoKSkgewotICAgICBmb3IgKGkgPSAwOyBpIDwgbmV0LT5udW1TaGllbGROZXRzKCk7IGkrKykKLSAgICAgICAgIGZwcmludGYoZm91dCwgIlxuTkVUICVzIFNISUVMRE5FVCAlcyAiLCBuZXQtPm5hbWUoKSwKLSAgICAgICAgICAgICAgICAgbmV0LT5zaGllbGROZXQoaSkpOwotICB9Ci0gIGlmIChuZXQtPm51bU5vU2hpZWxkcygpKSB7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBuZXQtPm51bU5vU2hpZWxkcygpOyBpKyspIHsKLSAgICAgICAgIG5vU2hpZWxkID0gbmV0LT5ub1NoaWVsZChpKTsKLSAgICAgICAgIGZvciAoaiA9IDA7IGogPCBub1NoaWVsZC0+bnVtUGF0aHMoKTsgaisrKSB7Ci0gICAgICAgICAgICBwID0gbm9TaGllbGQtPnBhdGgoaik7Ci0gICAgICAgICAgICBwLT5pbml0VHJhdmVyc2UoKTsKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuTkVUICVzIE5PU0hJRUxEIiwgbmV0LT5uYW1lKCkpOwotICAgICAgICAgICAgbmxpbmUgPSAwOwotICAgICAgICAgICAgd2hpbGUgKChwYXRoID0gKGludClwLT5uZXh0KCkpICE9IERFRklQQVRIX0RPTkUpIHsKLSAgICAgICAgICAgICAgIHN3aXRjaCAocGF0aCkgewotICAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX0xBWUVSOgotICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAlcyIsIHAtPmdldExheWVyKCkpOwotICAgICAgICAgICAgICAgICAgICAgIGxheWVyTmFtZSA9IHAtPmdldExheWVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0JCQkJIGNhc2UgREVGSVBBVEhfTUFTSzoKLQkJCQkJICBmcHJpbnRmKGZvdXQsICJNQVNLICVkICIsIHAtPmdldE1hc2soKSk7Ci0JCQkJCSAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfVklBTUFTSzoKLSAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJNQVNLICVkJWQlZCAiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmdldFZpYVRvcE1hc2soKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRWaWFDdXRNYXNrKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRWaWFCb3R0b21NYXNrKCkpOwotICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1ZJQToKLSAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlnbm9yZVZOKQotICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAlcyIsIHAtPmdldFZpYSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICBubGluZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfVklBUk9UQVRJT046Ci0gICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVkIiwgcC0+Z2V0VmlhUm90YXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgbmxpbmUgPSAxOwotICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1dJRFRIOgotICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAlZCIsIHAtPmdldFdpZHRoKCkpOwotICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1BPSU5UOgotICAgICAgICAgICAgICAgICAgICAgIHAtPmdldFBvaW50KCZ4LCAmeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKCFubGluZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAoICVkICVkICkiLCB4LCB5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBubGluZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbk5FVCAlcyAlcyAoICVkICVkICkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0LT5uYW1lKCksIGxheWVyTmFtZSwgeCwgeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgbmxpbmUgPSAxOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9GTFVTSFBPSU5UOgotICAgICAgICAgICAgICAgICAgICAgIHAtPmdldEZsdXNoUG9pbnQoJngsICZ5LCAmeik7Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKCFubGluZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAoICVkICVkICkiLCB4LCB5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBubGluZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbk5FVCAlcyAlcyAoICVkICVkICkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0LT5uYW1lKCksIGxheWVyTmFtZSwgeCwgeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgbmxpbmUgPSAxOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9UQVBFUjoKLSAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgVEFQRVIiKTsKLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9UQVBFUlJVTEU6Ci0gICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIFRBUEVSUlVMRSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRUYXBlclJ1bGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgIH0KLSAgfQotCi0gIGlmIChuZXQtPmhhc1N1Ym5ldHMoKSkgewotICAgIGZvciAoaSA9IDA7IGkgPCBuZXQtPm51bVN1Ym5ldHMoKTsgaSsrKSB7Ci0gICAgICBzID0gbmV0LT5zdWJuZXQoaSk7Ci0gCi0gICAgICBpZiAocy0+bnVtQ29ubmVjdGlvbnMoKSkgewotICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzLT5udW1Db25uZWN0aW9ucygpOyBqKyspIHsKLSAgICAgICAgICAgICAgaWYgKHMtPnBpbklzTXVzdEpvaW4oMCkpCi0gICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbk5FVCBNVVNUSk9JTiIpOwotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbk5FVCAlcyIsIHMtPm5hbWUoKSk7Ci0gICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAoICVzICVzICkiLCBzLT5pbnN0YW5jZShqKSwgcy0+cGluKGopKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gCi0gICAgICBmb3IgKGogPSAwOyBqIDwgcy0+bnVtV2lyZXMoKTsgaisrKSB7Ci0gICAgICAgIHdpcmUgPSBzLT53aXJlKGopOwotICAgICAgICBpZiAocy0+bnVtUGF0aHMoKSkgewotICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgd2lyZS0+bnVtUGF0aHMoKTsgaysrKSB7Ci0gICAgICAgICAgICAgaW50IGVsZW07Ci0gICAgICAgICAgICAgcCA9IHdpcmUtPnBhdGgoayk7Ci0gICAgICAgICAgICAgcC0+aW5pdFRyYXZlcnNlKCk7Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG5ORVQgJXMgJXMiLCBzLT5uYW1lKCksIHdpcmUtPndpcmVUeXBlKCkpOyAKLSAgICAgICAgICAgICBubGluZSA9IDA7Ci0gICAgICAgICAgICAgZWxlbSA9IHAtPm5leHQoKTsKLSAgICAgICAgICAgICB3aGlsZSAoZWxlbSkgeyAKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGVsZW0pIHsKLSAgICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfTEFZRVI6Ci0gICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBMQVlFUiAlcyIsICBwLT5nZXRMYXllcigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJOYW1lID0gcC0+Z2V0TGF5ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0JCSAgY2FzZSBERUZJUEFUSF9NQVNLOgotCQkgICAgICAgZnByaW50Zihmb3V0LCAiTUFTSyAlZCAiLCBwLT5nZXRNYXNrKCkpOwotCQkgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1ZJQU1BU0s6Ci0gICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIk1BU0sgJWQlZCVkICIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmdldFZpYVRvcE1hc2soKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+Z2V0VmlhQ3V0TWFzaygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmdldFZpYUJvdHRvbU1hc2soKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9WSUE6Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmICghaWdub3JlVk4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBWSUEgJXMiLCBwLT5nZXRWaWEoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIG5saW5lID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1ZJQVJPVEFUSU9OOgotICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgVklBUk9UQVRJT04gJWQiLCBwLT5nZXRWaWFSb3RhdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgbmxpbmUgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfV0lEVEg6Ci0gICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBXSURUSCAlZCIsIHAtPmdldFdpZHRoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfUE9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgIHAtPmdldFBvaW50KCZ4LCAmeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmICghbmxpbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIFBPSU5UICVkICVkIiwgeCwgeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG5saW5lID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG5ORVQgJXMgJXMgJXMgUE9JTlQgJWQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm5hbWUoKSwgd2lyZS0+d2lyZVR5cGUoKSwgbGF5ZXJOYW1lLCB4LCB5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmxpbmUgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgLy9jYXNlIERFRklQQVRIX0ZMVVNIUE9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgIC8vbCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgIC8vcC0+Z2V0Rmx1c2hQb2ludChpMSwgaTIsIGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIC8vd2hpbGUgKGkxW2xdICYmIGkyW2xdICYmIGV4dFtsXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZwcmludGYoZm91dCwgIk5FVCAlcyBGTFVTSFBPSU5UICVkICVkICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcy0+bmFtZSgpLCBpMVtsXSwgaTJbbF0sIGV4dFtsXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vbCsrOwotICAgICAgICAgICAgICAgICAgICAgICAvL30KLSAgICAgICAgICAgICAgICAgICAgICAgLy9icmVhazsKLSAgICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfVEFQRVJSVUxFOgotICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgVEFQRVJSVUxFICVzIiwgcC0+Z2V0VGFwZXJSdWxlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfU0hBUEU6Ci0gICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBTSEFQRSAlcyIsIHAtPmdldFNoYXBlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfU1RZTEU6Ci0gICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBTVFlMRSAlZCIsIHAtPmdldFN0eWxlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsZW0gPSBwLT5uZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogUHV0IHRoZSBmb2xsb3dpbmcgYWxsIGluIG9uZSBsaW5lICovCi0gIGlmIChuZXQtPmhhc1dlaWdodCgpIHx8IG5ldC0+aGFzQ2FwKCkgfHwgbmV0LT5oYXNTb3VyY2UoKSB8fAotICAgICAgbmV0LT5oYXNQYXR0ZXJuKCkgfHwgbmV0LT5oYXNPcmlnaW5hbCgpIHx8IG5ldC0+aGFzVXNlKCkpIHsKLSAgICAgIGZwcmludGYoZm91dCwgIlxuTkVUICVzICIsIG5ldC0+bmFtZSgpKTsKLQotICAgICBpZiAobmV0LT5oYXNXZWlnaHQoKSkKLSAgICAgICBmcHJpbnRmKGZvdXQsICJXRUlHSFQgJWQgIiwgbmV0LT53ZWlnaHQoKSk7Ci0gICAgIGlmIChuZXQtPmhhc0NhcCgpKQotICAgICAgIGZwcmludGYoZm91dCwgIkVTVENBUCAlZyAiLCBjaGVja0RvdWJsZShuZXQtPmNhcCgpKSk7Ci0gICAgIGlmIChuZXQtPmhhc1NvdXJjZSgpKQotICAgICAgIGZwcmludGYoZm91dCwgIlNPVVJDRSAlcyAiLCBuZXQtPnNvdXJjZSgpKTsKLSAgICAgaWYgKG5ldC0+aGFzRml4ZWRidW1wKCkpCi0gICAgICAgZnByaW50Zihmb3V0LCAiRklYRURCVU1QICIpOwotICAgICBpZiAobmV0LT5oYXNGcmVxdWVuY3koKSkKLSAgICAgICBmcHJpbnRmKGZvdXQsICJGUkVRVUVOQ1kgJWcgIiwgbmV0LT5mcmVxdWVuY3koKSk7Ci0gICAgIGlmIChuZXQtPmhhc1BhdHRlcm4oKSkKLSAgICAgICBmcHJpbnRmKGZvdXQsICJQQVRURVJOICVzICIsIG5ldC0+cGF0dGVybigpKTsKLSAgICAgaWYgKG5ldC0+aGFzT3JpZ2luYWwoKSkKLSAgICAgICBmcHJpbnRmKGZvdXQsICJPUklHSU5BTCAlcyAiLCBuZXQtPm9yaWdpbmFsKCkpOwotICAgICBpZiAobmV0LT5oYXNVc2UoKSkKLSAgICAgICBmcHJpbnRmKGZvdXQsICJVU0UgJXMgIiwgbmV0LT51c2UoKSk7Ci0gIH0KLQotICBmcHJpbnRmIChmb3V0LCAiXG4iKTsKLSAgLS1udW1PYmpzOwotICByZXR1cm4gMDsKLX0KLQotCi0vLyBTcGVjaWFsIE5ldAotaW50IHNuZXRmKGRlZnJDYWxsYmFja1R5cGVfZSBjLCBkZWZpTmV0KiBuZXQsIGRlZmlVc2VyRGF0YSB1ZCkgewotICAvLyBGb3IgbmV0IGFuZCBzcGVjaWFsIG5ldC4KLSAgaW50ICAgICAgICBpLCBqLCB4LCB5LCB6OwotICBjaGFyICAgICAgICpsYXllck5hbWU7Ci0gIGRvdWJsZSAgICAgZGlzdCwgbGVmdCwgcmlnaHQ7Ci0gIGRlZmlQYXRoICAgKnA7Ci0gIGRlZmlTdWJuZXQgKnM7Ci0gIGludCAgICAgICAgcGF0aDsKLSAgZGVmaVNoaWVsZCogc2hpZWxkOwotICBkZWZpV2lyZSAgICp3aXJlOwotICBpbnQgICAgICAgIG5saW5lOwotICBjb25zdCBjaGFyKiBzTkxheWVyTmFtZSA9ICJOL0EiOwotICBpbnQgICAgICAgIG51bVgsIG51bVksIHN0ZXBYLCBzdGVwWTsKLQotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGlmIChjICE9IGRlZnJTTmV0Q2JrVHlwZSkKLSAgICAgIGZwcmludGYoZm91dCwgIkJPR1VTIE5FVCBUWVBFICAiKTsKLQotICAvLyBjb21wTmFtZSAmIHBpbk5hbWUKLSAgaWYgKG5ldC0+bnVtQ29ubmVjdGlvbnMoKSA+IDApIHsKLSAgICAgZm9yIChpID0gMDsgaSA8IG5ldC0+bnVtQ29ubmVjdGlvbnMoKTsgaSsrKQotICAgICAgICAgZnByaW50ZiAoZm91dCwgIlNORVQgJXMgKCAlcyAlcyApXG4iLCBuZXQtPm5hbWUoKSwgbmV0LT5pbnN0YW5jZShpKSwKLSAgICAgICAgICAgICAgICAgIG5ldC0+cGluKGkpKTsKLSAgfQotCi0gIGlmIChuZXQtPm51bVJlY3RhbmdsZXMoKSkgeyAgLy8gNS42Ci0KLSAgICAgZm9yIChpID0gMDsgaSA8IG5ldC0+bnVtUmVjdGFuZ2xlcygpOyBpKyspIHsKLSAgICAgICBpZiAoY3VyVmVyID49IDUuOCApIHsKLSAgICAgICAgIGZwcmludGYgKGZvdXQsICJcblNORVQgJXMgIiwgbmV0LT5uYW1lKCkpOwotCSBpZiAoc3RyY21wKG5ldC0+cmVjdFJvdXRlU3RhdHVzKGkpLCAiIikgIT0gMCkgewotCSAgIGZwcmludGYoZm91dCwgIiVzICIsIG5ldC0+cmVjdFJvdXRlU3RhdHVzKGkpKTsKLQkgICBpZiAoc3RyY21wKG5ldC0+cmVjdFJvdXRlU3RhdHVzKGkpLCAiU0hJRUxEIikgPT0gMCkgewotCSAgICAgIGZwcmludGYoZm91dCwgIiVzICIsIG5ldC0+cmVjdFJvdXRlU3RhdHVzU2hpZWxkTmFtZShpKSk7Ci0JICAgfQotICAgICAgICAgfQotICAgICAgICAgaWYgKHN0cmNtcChuZXQtPnJlY3RTaGFwZVR5cGUoaSksICIiKSAhPSAwKSB7Ci0JICAgZnByaW50Zihmb3V0LCAiU0hBUEUgJXMgIiwgbmV0LT5yZWN0U2hhcGVUeXBlKGkpKTsKLSAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgICAgaWYgKG5ldC0+cmVjdE1hc2soaSkpIHsKLQkgIGZwcmludGYoZm91dCwgIk1BU0sgJWQgUkVDVCAlcyAlZCAlZCAlZCAlZCIsIAotCQkgIG5ldC0+cmVjdE1hc2soaSksIG5ldC0+cmVjdE5hbWUoaSksCi0JCSAgbmV0LT54bChpKSwgbmV0LT55bChpKSwgbmV0LT54aChpKSwKLSAgICAgICAgICAgICAgICAgIG5ldC0+eWgoaSkpOwotICAgICAgIH0gZWxzZSB7Ci0JICBmcHJpbnRmKGZvdXQsICJSRUNUICVzICVkICVkICVkICVkIiwgbmV0LT5uYW1lKCksCi0gICAgICAgICAgICAgICBuZXQtPnhsKGkpLCBuZXQtPnlsKGkpLCBuZXQtPnhoKGkpLAotICAgICAgICAgICAgICAgbmV0LT55aChpKSk7Ci0gICAgICAgfQotICAgICB9Ci0gIH0KLQotICBpZiAobmV0LT5udW1Qb2x5Z29ucygpKSB7ICAKLSAgICBzdHJ1Y3QgZGVmaVBvaW50cyBwb2ludHM7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbmV0LT5udW1Qb2x5Z29ucygpOyBpKyspIHsKLSAgICAgIGZwcmludGYgKGZvdXQsICJcblNORVQgJXMgIiwgbmV0LT5uYW1lKCkpOwotICAgICAgaWYgKGN1clZlciA+PSA1LjggKSB7Ci0JIGlmIChzdHJjbXAobmV0LT5wb2x5Um91dGVTdGF0dXMoaSksICIiKSAhPSAwKSB7Ci0JICAgZnByaW50Zihmb3V0LCAiJXMgIiwgbmV0LT5wb2x5Um91dGVTdGF0dXMoaSkpOwotCSAgIGlmIChzdHJjbXAobmV0LT5wb2x5Um91dGVTdGF0dXMoaSksICJTSElFTEQiKSA9PSAwKSB7Ci0JICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgbmV0LT5wb2x5Um91dGVTdGF0dXNTaGllbGROYW1lKGkpKTsKLQkgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoc3RyY21wKG5ldC0+cG9seVNoYXBlVHlwZShpKSwgIiIpICE9IDApIHsKLQkgICBmcHJpbnRmKGZvdXQsICJTSEFQRSAlcyAiLCBuZXQtPnBvbHlTaGFwZVR5cGUoaSkpOwotICAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKG5ldC0+cG9seU1hc2soaSkpIHsKLQkgIGZwcmludGYoZm91dCwgIk1BU0sgJWQgUE9MWUdPTiAlIHMgIiwgCi0JCSAgbmV0LT5wb2x5TWFzayhpKSwKLQkJICBuZXQtPnBvbHlnb25OYW1lKGkpKTsKLSAgICAgIH0gZWxzZSB7Ci0JICBmcHJpbnRmKGZvdXQsICJQT0xZR09OICVzIiwgbmV0LT5wb2x5Z29uTmFtZShpKSk7Ci0gICAgICB9Ci0KLSAgICAgIHBvaW50cyA9IG5ldC0+Z2V0UG9seWdvbihpKTsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBwb2ludHMubnVtUG9pbnRzOyBqKyspCi0gICAgICAgIGZwcmludGYoZm91dCwgIiAlZCAlZCIsIHBvaW50cy54W2pdLCBwb2ludHMueVtqXSk7Ci0gICAgfQotICB9Ci0KLSAgIGlmIChjdXJWZXIgPj0gNS44ICYmIG5ldC0+bnVtVmlhU3BlY3MoKSkgewotICAgICBmb3IgKGkgPSAwOyBpIDwgbmV0LT5udW1WaWFTcGVjcygpOyBpKyspIHsKLSAgICAgICBmcHJpbnRmIChmb3V0LCAiXG5TTkVUICVzICIsIG5ldC0+bmFtZSgpKTsKLSAgICAgICBpZiAoc3RyY21wKG5ldC0+dmlhUm91dGVTdGF0dXMoaSksICIiKSAhPSAwKSB7Ci0JZnByaW50Zihmb3V0LCAiJXMgIiwgbmV0LT52aWFSb3V0ZVN0YXR1cyhpKSk7Ci0JaWYgKHN0cmNtcChuZXQtPnZpYVJvdXRlU3RhdHVzKGkpLCAiU0hJRUxEIikgPT0gMCkgewotCSAgICAgIGZwcmludGYoZm91dCwgIiVzICIsIG5ldC0+dmlhUm91dGVTdGF0dXNTaGllbGROYW1lKGkpKTsKLQkgICB9Ci0gICAgICAgfQotICAgICAgIGlmIChzdHJjbXAobmV0LT52aWFTaGFwZVR5cGUoaSksICIiKSAhPSAwKSB7Ci0JZnByaW50Zihmb3V0LCAiU0hBUEUgJXMgIiwgbmV0LT52aWFTaGFwZVR5cGUoaSkpOwotICAgICAgIH0KLSAgICAgICBpZiAobmV0LT50b3BNYXNrTnVtKGkpIHx8IG5ldC0+Y3V0TWFza051bShpKSB8fCBuZXQtPmJvdHRvbU1hc2tOdW0oaSkpIHsKLQlmcHJpbnRmKGZvdXQsICJNQVNLICVkJWQlZCBWSUEgJXMgIiwgbmV0LT50b3BNYXNrTnVtKGkpLCAKLSAgICAgICAgICAgICAgICBuZXQtPmN1dE1hc2tOdW0oaSksCi0gICAgICAgICAgICAgICAgbmV0LT5ib3R0b21NYXNrTnVtKGkpLAotCQluZXQtPnZpYU5hbWUoaSkpOwotICAgICAgIH0gZWxzZSB7Ci0JZnByaW50Zihmb3V0LCAiXG4gIFZJQSAlcyAiLCBuZXQtPnZpYU5hbWUoaSkpOwotICAgICAgIH0KLSAgICAgICBmcHJpbnRmKGZvdXQsICIgJXMiLCBuZXQtPnZpYU9yaWVudFN0cihpKSk7Ci0gICAgICAKLSAgICAgICBkZWZpUG9pbnRzIHBvaW50cyA9IG5ldC0+Z2V0VmlhUHRzKGkpOwotCi0gICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwb2ludHMubnVtUG9pbnRzOyBqKyspIHsKLSAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgJWQgJWQiLCBwb2ludHMueFtqXSwgcG9pbnRzLnlbal0pOwotICAgICAgIH0KLSAgICAgICBmcHJpbnRmKGZvdXQsICI7XG4iKTsgCi0gICAgIH0KLSAgfSAKLQotCi0gIC8vIHNwZWNpYWxXaXJpbmcKLSAgaWYgKG5ldC0+bnVtV2lyZXMoKSkgewotICAgICBmb3IgKGkgPSAwOyBpIDwgbmV0LT5udW1XaXJlcygpOyBpKyspIHsKLSAgICAgICAgd2lyZSA9IG5ldC0+d2lyZShpKTsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpcmUtPm51bVBhdGhzKCk7IGorKykgewotICAgICAgICAgICBwID0gd2lyZS0+cGF0aChqKTsKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG5TTkVUICVzICVzIiwgbmV0LT5uYW1lKCksIHdpcmUtPndpcmVUeXBlKCkpOwotICAgICAgICAgICBubGluZSA9IDA7Ci0gICAgICAgICAgIHAtPmluaXRUcmF2ZXJzZSgpOwotICAgICAgICAgICB3aGlsZSAoKHBhdGggPSAoaW50KXAtPm5leHQoKSkgIT0gREVGSVBBVEhfRE9ORSkgewotICAgICAgICAgICAgICBzd2l0Y2ggKHBhdGgpIHsKLSAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX0xBWUVSOgotICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVzIiwgcC0+Z2V0TGF5ZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICBzTkxheWVyTmFtZSA9IHAtPmdldExheWVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLQkJY2FzZSBERUZJUEFUSF9NQVNLOgotCQkgICAgIGZwcmludGYoZm91dCwgIk1BU0sgJWQgIiwgcC0+Z2V0TWFzaygpKTsKLQkJICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1ZJQU1BU0s6Ci0gICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJNQVNLICVkJWQlZCAiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+Z2V0VmlhVG9wTWFzaygpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+Z2V0VmlhQ3V0TWFzaygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRWaWFCb3R0b21NYXNrKCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1ZJQToKLSAgICAgICAgICAgICAgICAgICAgIGlmICghaWdub3JlVk4pCi0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgJXMiLCBwLT5nZXRWaWEoKSk7Ci0gICAgICAgICAgICAgICAgICAgICBubGluZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1ZJQVJPVEFUSU9OOgotICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVkIiwgcC0+Z2V0VmlhUm90YXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgICBubGluZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1ZJQURBVEE6Ci0gICAgICAgICAgICAgICAgICAgICBwLT5nZXRWaWFEYXRhKCZudW1YLCAmbnVtWSwgJnN0ZXBYLCAmc3RlcFkpOwotICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIERPICVkIEJZICVkIFNURVAgJWQgJWQiLCBudW1YLCBudW1ZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwWCwgc3RlcFkpOwotICAgICAgICAgICAgICAgICAgICAgbmxpbmUgPSAxOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9XSURUSDoKLSAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAlZCIsIHAtPmdldFdpZHRoKCkpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9QT0lOVDoKLSAgICAgICAgICAgICAgICAgICAgIHAtPmdldFBvaW50KCZ4LCAmeSk7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoIW5saW5lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgKCAlZCAlZCApICIsIHgsIHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmxpbmUgPSAxOwotICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuU05FVCAlcyAlcyAlcyAoICVkICVkICkiLCBuZXQtPm5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lyZS0+d2lyZVR5cGUoKSwgc05MYXllck5hbWUsIHgsIHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmxpbmUgPSAxOwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9GTFVTSFBPSU5UOgotICAgICAgICAgICAgICAgICAgICAgcC0+Z2V0Rmx1c2hQb2ludCgmeCwgJnksICZ6KTsKLSAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiggJWQgJWQgJWQgKSAiLCB4LCB5LCB6KTsKLSAgICAgICAgICAgICAgICAgICAgIG5saW5lID0gMTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfVEFQRVI6Ci0gICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgVEFQRVIiKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfU0hBUEU6Ci0gICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgKyBTSEFQRSAlcyIsIHAtPmdldFNoYXBlKCkpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9TVFlMRToKLSAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiArIFNUWUxFICVkIiwgcC0+Z2V0U3R5bGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgfQotICB9Ci0KLSAgaWYgKG5ldC0+aGFzU3VibmV0cygpKSB7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBuZXQtPm51bVN1Ym5ldHMoKTsgaSsrKSB7Ci0gICAgICAgcyA9IG5ldC0+c3VibmV0KGkpOwotICAgICAgIGlmIChzLT5udW1Db25uZWN0aW9ucygpKSB7Ci0gICAgICAgICAgIGlmIChzLT5waW5Jc011c3RKb2luKDApKQotICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG5TTkVUICVzIE1VU1RKT0lOIiwgbmV0LT5uYW1lKCkpOwotICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcblNORVQgJXMiLCBuZXQtPm5hbWUoKSk7Ci0gICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzLT5udW1Db25uZWN0aW9ucygpOyBqKyspIHsKLSAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiggJXMgJXMgKSAiLCBzLT5pbnN0YW5jZShqKSwgcy0+cGluKGopKTsKLSAgICAgICAgICAgfQotICAgICAgfQotIAotICAgICAgLy8gcmVndWxhcldpcmluZwotICAgICAgaWYgKHMtPm51bVdpcmVzKCkpIHsKLSAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5udW1XaXJlcygpOyBpKyspIHsKLSAgICAgICAgICAgIHdpcmUgPSBzLT53aXJlKGkpOwotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpcmUtPm51bVBhdGhzKCk7IGorKykgewotICAgICAgICAgICAgICBwID0gd2lyZS0+cGF0aChqKTsKLSAgICAgICAgICAgICAgcC0+aW5pdFRyYXZlcnNlKCk7Ci0gICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuU05FVCAlcyAlcyIsIG5ldC0+bmFtZSgpLCB3aXJlLT53aXJlVHlwZSgpKTsKLSAgICAgICAgICAgICAgbmxpbmUgPSAwOwotICAgICAgICAgICAgICB3aGlsZSAoKHBhdGggPSAoaW50KXAtPm5leHQoKSkgIT0gREVGSVBBVEhfRE9ORSkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAocGF0aCkgewotICAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9MQVlFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVzIiwgcC0+Z2V0TGF5ZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHNOTGF5ZXJOYW1lID0gcC0+Z2V0TGF5ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1ZJQToKLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpZ25vcmVWTikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVzIiwgcC0+Z2V0VmlhKCkpOwotICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQkJICBjYXNlIERFRklQQVRIX01BU0s6Ci0JCSAgICAgICBmcHJpbnRmKGZvdXQsICJNQVNLICVkICIsIHAtPmdldE1hc2soKSk7Ci0JCSAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfVklBTUFTSzoKLSAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTUFTSyAlZCVkJWQgIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRWaWFUb3BNYXNrKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+Z2V0VmlhQ3V0TWFzaygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+Z2V0VmlhQm90dG9tTWFzaygpKTsKLSAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9WSUFST1RBVElPTjoKLSAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVkIiwgcC0+Z2V0VmlhUm90YXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9XSURUSDoKLSAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVkIiwgcC0+Z2V0V2lkdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9QT0lOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgcC0+Z2V0UG9pbnQoJngsICZ5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFubGluZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIoICVkICVkICkgIiwgeCwgeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG5saW5lID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG5TTkVUICVzICVzICVzICggJWQgJWQgKSAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldC0+bmFtZSgpLCB3aXJlLT53aXJlVHlwZSgpLCBzTkxheWVyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCB5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmxpbmUgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9UQVBFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIFRBUEVSIik7Ci0gICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotIAotICBpZiAobmV0LT5udW1Qcm9wcygpKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IG5ldC0+bnVtUHJvcHMoKTsgaSsrKSB7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIlxuU05FVCAlcyBQUk9QICVzICVzICIsIG5ldC0+bmFtZSgpLAotICAgICAgICAgICAgICAgIG5ldC0+cHJvcE5hbWUoaSksIG5ldC0+cHJvcFZhbHVlKGkpKTsKLSAgICAgICAgc3dpdGNoIChuZXQtPnByb3BUeXBlKGkpKSB7Ci0gICAgICAgICAgIGNhc2UgJ1InOiBmcHJpbnRmKGZvdXQsICJSRUFMICIpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIGNhc2UgJ0knOiBmcHJpbnRmKGZvdXQsICJJTlQgIik7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgY2FzZSAnUyc6IGZwcmludGYoZm91dCwgIlNUUiAiKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICBjYXNlICdRJzogZnByaW50Zihmb3V0LCAiUVNUUiAiKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICBjYXNlICdOJzogZnByaW50Zihmb3V0LCAiTlVNICIpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBTSElFTEQKLSAgLy8gdGVzdGluZyB0aGUgU0hJRUxEIGZvciA1LjMKLSAgaWYgKG5ldC0+bnVtU2hpZWxkcygpKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IG5ldC0+bnVtU2hpZWxkcygpOyBpKyspIHsKLSAgICAgICBzaGllbGQgPSBuZXQtPnNoaWVsZChpKTsKLSAgICAgICBmb3IgKGogPSAwOyBqIDwgc2hpZWxkLT5udW1QYXRocygpOyBqKyspIHsKLSAgICAgICAgICBwID0gc2hpZWxkLT5wYXRoKGopOwotICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuU05FVCAlcyBTSElFTEQgJXMiLCBuZXQtPm5hbWUoKSwKLSAgICAgICAgICAgICAgICAgIHNoaWVsZC0+c2hpZWxkTmFtZSgpKTsKLSAgICAgICAgICBwLT5pbml0VHJhdmVyc2UoKTsKLSAgICAgICAgICB3aGlsZSAoKHBhdGggPSAoaW50KXAtPm5leHQoKSkgIT0gREVGSVBBVEhfRE9ORSkgewotICAgICAgICAgICAgIHN3aXRjaCAocGF0aCkgewotICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9MQVlFUjoKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVzIiwgcC0+Z2V0TGF5ZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHNOTGF5ZXJOYW1lID0gcC0+Z2V0TGF5ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1ZJQToKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpZ25vcmVWTikKLSAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVzIiwgcC0+Z2V0VmlhKCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQkgICAgICAgY2FzZSBERUZJUEFUSF9NQVNLOgotCQkgICAgZnByaW50Zihmb3V0LCAiTUFTSyAlZCAiLCBwLT5nZXRNYXNrKCkpOwotCQkgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1ZJQU1BU0s6Ci0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTUFTSyAlZCVkJWQgIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRWaWFUb3BNYXNrKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+Z2V0VmlhQ3V0TWFzaygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+Z2V0VmlhQm90dG9tTWFzaygpKTsKLSAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfVklBUk9UQVRJT046Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAlZCIsIHAtPmdldFZpYVJvdGF0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfV0lEVEg6Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAlZCIsIHAtPmdldFdpZHRoKCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfUE9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgIHAtPmdldFBvaW50KCZ4LCAmeSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbmxpbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKCAlZCAlZCApICIsIHgsIHkpOwotICAgICAgICAgICAgICAgICAgICAgICBubGluZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG5TTkVUICVzIFNISUVMRCAlcyAlcyAoICVkICVkICkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0LT5uYW1lKCksIHNoaWVsZC0+c2hpZWxkTmFtZSgpLCBzTkxheWVyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9UQVBFUjoKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIFRBUEVSIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIGxheWVyTmFtZSB3aWR0aAotICBpZiAobmV0LT5oYXNXaWR0aFJ1bGVzKCkpIHsKLSAgICBmcHJpbnRmKGZvdXQsICJcblNORVQgJXMiLCBuZXQtPm5hbWUoKSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG5ldC0+bnVtV2lkdGhSdWxlcygpOyBpKyspIHsKLSAgICAgICAgbmV0LT53aWR0aFJ1bGUoaSwgJmxheWVyTmFtZSwgJmRpc3QpOwotICAgICAgICBmcHJpbnRmIChmb3V0LCAiIFdJRFRIICVzICVnICIsIGxheWVyTmFtZSwgY2hlY2tEb3VibGUoZGlzdCkpOwotICAgIH0KLSAgfQotCi0gIC8vIGxheWVyTmFtZSBzcGFjaW5nCi0gIGlmIChuZXQtPmhhc1NwYWNpbmdSdWxlcygpKSB7Ci0gICAgZnByaW50Zihmb3V0LCAiXG5TTkVUICVzIiwgbmV0LT5uYW1lKCkpOwotICAgIGZvciAoaSA9IDA7IGkgPCBuZXQtPm51bVNwYWNpbmdSdWxlcygpOyBpKyspIHsKLSAgICAgICAgbmV0LT5zcGFjaW5nUnVsZShpLCAmbGF5ZXJOYW1lLCAmZGlzdCwgJmxlZnQsICZyaWdodCk7Ci0gICAgICAgIGlmIChsZWZ0ID09IHJpZ2h0KQotICAgICAgICAgICAgZnByaW50ZiAoZm91dCwgIiBTUEFDSU5HICVzICVnICIsIGxheWVyTmFtZSwgY2hlY2tEb3VibGUoZGlzdCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmIChmb3V0LCAiIFNQQUNJTkcgJXMgJWcgUkFOR0UgJWcgJWcgIiwKLSAgICAgICAgICAgICAgICAgICAgIGxheWVyTmFtZSwgY2hlY2tEb3VibGUoZGlzdCksIGNoZWNrRG91YmxlKGxlZnQpLAotICAgICAgICAgICAgICAgICAgICAgY2hlY2tEb3VibGUocmlnaHQpKTsKLSAgICB9Ci0gIH0KLQotICBpZiAobmV0LT5oYXNWb2x0YWdlKCkgfHwgbmV0LT5oYXNXZWlnaHQoKSB8fCBuZXQtPmhhc0NhcCgpIHx8Ci0gICAgICBuZXQtPmhhc1NvdXJjZSgpIHx8IG5ldC0+aGFzUGF0dGVybigpIHx8IG5ldC0+aGFzT3JpZ2luYWwoKSB8fAotICAgICAgbmV0LT5oYXNVc2UoKSkgewotICAgIGZwcmludGYoZm91dCwgIlxuU05FVCAlcyIsIG5ldC0+bmFtZSgpKTsKLSAgICBpZiAobmV0LT5oYXNWb2x0YWdlKCkpCi0gICAgICBmcHJpbnRmKGZvdXQsICIgVk9MVEFHRSAlZyIsIGNoZWNrRG91YmxlKG5ldC0+dm9sdGFnZSgpKSk7Ci0gICAgaWYgKG5ldC0+aGFzV2VpZ2h0KCkpCi0gICAgICBmcHJpbnRmKGZvdXQsICIgV0VJR0hUICVkIiwgbmV0LT53ZWlnaHQoKSk7Ci0gICAgaWYgKG5ldC0+aGFzQ2FwKCkpCi0gICAgICBmcHJpbnRmKGZvdXQsICIgRVNUQ0FQICVnIiwgY2hlY2tEb3VibGUobmV0LT5jYXAoKSkpOwotICAgIGlmIChuZXQtPmhhc1NvdXJjZSgpKQotICAgICAgZnByaW50Zihmb3V0LCAiIFNPVVJDRSAlcyIsIG5ldC0+c291cmNlKCkpOwotICAgIGlmIChuZXQtPmhhc1BhdHRlcm4oKSkKLSAgICAgIGZwcmludGYoZm91dCwgIiBQQVRURVJOICVzIiwgbmV0LT5wYXR0ZXJuKCkpOwotICAgIGlmIChuZXQtPmhhc09yaWdpbmFsKCkpCi0gICAgICBmcHJpbnRmKGZvdXQsICIgT1JJR0lOQUwgJXMiLCBuZXQtPm9yaWdpbmFsKCkpOwotICAgIGlmIChuZXQtPmhhc1VzZSgpKQotICAgICAgZnByaW50Zihmb3V0LCAiIFVTRSAlcyIsIG5ldC0+dXNlKCkpOwotICB9Ci0KLSAgZnByaW50Zihmb3V0LCJcbiIpOwotICAtLW51bU9ianM7Ci0gIHJldHVybiAwOwotfQotCi1pbnQgbmRyKGRlZnJDYWxsYmFja1R5cGVfZSBjLCBkZWZpTm9uRGVmYXVsdCogbmQsIGRlZmlVc2VyRGF0YSB1ZCkgewotICAvLyBGb3Igbm9uZGVmYXVsdHJ1bGUKLSAgaW50IGk7Ci0KLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBpZiAoYyAhPSBkZWZyTm9uRGVmYXVsdENia1R5cGUpCi0gICAgICBmcHJpbnRmKGZvdXQsICJCT0dVUyBOT05ERUZBVUxUUlVMRSBUWVBFICAiKTsKLSAgZnByaW50Zihmb3V0LCAiTkRSICVzIiwgbmQtPm5hbWUoKSk7Ci0gIGlmIChuZC0+aGFzSGFyZHNwYWNpbmcoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiIEhBUkRTUEFDSU5HXG4iKTsKLSAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgZm9yIChpID0gMDsgaSA8IG5kLT5udW1MYXllcnMoKTsgaSsrKSB7Ci0gICAgZnByaW50Zihmb3V0LCAiTkRSICVzIExBWUVSICVzIiwgbmQtPm5hbWUoKSwgbmQtPmxheWVyTmFtZShpKSk7Ci0gICAgZnByaW50Zihmb3V0LCAiIFdJRFRIICVkIiwgbmQtPmxheWVyV2lkdGhWYWwoaSkpOwotICAgIGlmIChuZC0+aGFzTGF5ZXJEaWFnV2lkdGgoaSkpCi0gICAgICBmcHJpbnRmKGZvdXQsICIgRElBR1dJRFRIICVkIiwKLSAgICAgICAgICAgICAgbmQtPmxheWVyRGlhZ1dpZHRoVmFsKGkpKTsKLSAgICBpZiAobmQtPmhhc0xheWVyU3BhY2luZyhpKSkKLSAgICAgIGZwcmludGYoZm91dCwgIiBTUEFDSU5HICVkIiwgbmQtPmxheWVyU3BhY2luZ1ZhbChpKSk7Ci0gICAgaWYgKG5kLT5oYXNMYXllcldpcmVFeHQoaSkpCi0gICAgICBmcHJpbnRmKGZvdXQsICIgV0lSRUVYVCAlZCIsIG5kLT5sYXllcldpcmVFeHRWYWwoaSkpOwotICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gIH0KLSAgZm9yIChpID0gMDsgaSA8IG5kLT5udW1WaWFzKCk7IGkrKykKLSAgICBmcHJpbnRmKGZvdXQsICJORFIgJXMgVklBICVzXG4iLCBuZC0+bmFtZSgpLCBuZC0+dmlhTmFtZShpKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBuZC0+bnVtVmlhUnVsZXMoKTsgaSsrKQotICAgIGZwcmludGYoZm91dCwgIk5EUiAlcyBWSUFSVUxFICVzXG4iLCBuZC0+bmFtZSgpLCBuZC0+dmlhUnVsZU5hbWUoaSkpOwotICBmb3IgKGkgPSAwOyBpIDwgbmQtPm51bU1pbkN1dHMoKTsgaSsrKQotICAgIGZwcmludGYoZm91dCwgIk5EUiAlcyBNSU5DVVRTICVzICVkXG4iLCBuZC0+bmFtZSgpLCBuZC0+Y3V0TGF5ZXJOYW1lKGkpLAotICAgICAgICAgICAgbmQtPm51bUN1dHMoaSkpOwotICBmb3IgKGkgPSAwOyBpIDwgbmQtPm51bVByb3BzKCk7IGkrKykKLSAgICBmcHJpbnRmKGZvdXQsICJORFIgJXMgUFJPUEVSVFkgJXMgJXNcbiIsIG5kLT5uYW1lKCksIG5kLT5wcm9wTmFtZShpKSwKLSAgICAgICAgICAgICAgbmQtPnByb3BWYWx1ZShpKSk7Ci0gIC0tbnVtT2JqczsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIFRlY2hub2xvZ3kKLWludCB0bmFtZShkZWZyQ2FsbGJhY2tUeXBlX2UgYywgY29uc3QgY2hhciogc3RyaW5nLCBkZWZpVXNlckRhdGEgdWQpIHsKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBmcHJpbnRmKGZvdXQsICJURUNITk9MT0dZICVzXG4iLCBzdHJpbmcpOwotICByZXR1cm4gMDsKLX0KLQotLy8gRGVzaWduCi1pbnQgZG5hbWUoZGVmckNhbGxiYWNrVHlwZV9lIGMsIGNvbnN0IGNoYXIqIHN0cmluZywgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgZnByaW50Zihmb3V0LCAiREVTSUdOICVzXG4iLCBzdHJpbmcpOwotCi0gIHJldHVybiAwOwotfQotCi0KLWNoYXIqIGFkZHJlc3MoY29uc3QgY2hhciogaW4pIHsKLSAgcmV0dXJuICgoY2hhciopaW4pOwotfQotCi0vLyBBc3NlcnRpb24gb3IgQ29uc3RyYWludHMKLXZvaWQgb3BlcmFuZChkZWZyQ2FsbGJhY2tUeXBlX2UgYywgZGVmaUFzc2VydGlvbiogYSwgaW50IGluZCkgewotICBpbnQgaSwgZmlyc3QgPSAxOwotICBjaGFyKiBuZXROYW1lOwotICBjaGFyKiBmcm9tSW5zdCwgKiBmcm9tUGluLCAqIHRvSW5zdCwgKiB0b1BpbjsKLQotICBpZiAoYS0+aXNTdW0oKSkgewotICAgICAgLy8gU3VtIGluIG9wZXJhbmQsIHJlY3Vyc2l2ZWx5IGNhbGwgb3BlcmFuZAotICAgICAgZnByaW50Zihmb3V0LCAiQVNTRVJUSU9OUy9DT05TVFJBSU5UUyBTVU0gKCAiKTsKLSAgICAgIGEtPnVuc2V0U3VtKCk7Ci0gICAgICBpc1N1bVNldCA9IDE7Ci0gICAgICBiZWdPcGVyYW5kID0gMDsKLSAgICAgIG9wZXJhbmQgKGMsIGEsIGluZCk7Ci0gICAgICBmcHJpbnRmKGZvdXQsICIpICIpOwotICB9IGVsc2UgewotICAgICAgLy8gb3BlcmFuZAotICAgICAgaWYgKGluZCA+PSBhLT5udW1JdGVtcygpKSB7Ci0gICAgICAgICAgZnByaW50Zihmb3V0LCAiRVJST1I6IHdoZW4gd3JpdGluZyBvdXQgU1VNIGluIENvbnN0cmFpbnRzLlxuIik7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgIH0KLSAgICAgIGlmIChiZWdPcGVyYW5kKSB7Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICJBU1NSVC9DT05TVFIgIik7Ci0gICAgICAgICBiZWdPcGVyYW5kID0gMDsKLSAgICAgIH0KLSAgICAgIGZvciAoaSA9IGluZDsgaSA8IGEtPm51bUl0ZW1zKCk7IGkrKykgewotICAgICAgICAgIGlmIChhLT5pc05ldChpKSkgewotICAgICAgICAgICAgICBhLT5uZXQoaSwgJm5ldE5hbWUpOwotICAgICAgICAgICAgICBpZiAoIWZpcnN0KQotICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiLCAiKTsgLy8gcHJpbnQgLCBhcyBzZXBhcmF0b3IKLSAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTkVUICVzICIsIG5ldE5hbWUpOyAKLSAgICAgICAgICB9IGVsc2UgaWYgKGEtPmlzUGF0aChpKSkgewotICAgICAgICAgICAgICBhLT5wYXRoKGksICZmcm9tSW5zdCwgJmZyb21QaW4sICZ0b0luc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvUGluKTsKLSAgICAgICAgICAgICAgaWYgKCFmaXJzdCkKLSAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiwgIik7Ci0gICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlBBVEggJXMgJXMgJXMgJXMgIiwgZnJvbUluc3QsIGZyb21QaW4sIHRvSW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICB0b1Bpbik7Ci0gICAgICAgICAgfSBlbHNlIGlmIChpc1N1bVNldCkgewotICAgICAgICAgICAgICAvLyBTVU0gd2l0aGluIFNVTSwgcmVzZXQgdGhlIGZsYWcKLSAgICAgICAgICAgICAgYS0+c2V0U3VtKCk7Ci0gICAgICAgICAgICAgIG9wZXJhbmQoYywgYSwgaSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGZpcnN0ID0gMDsKLSAgICAgIH0gCi0gICAgICAKLSAgfQotfQotCi0vLyBBc3NlcnRpb24gb3IgQ29uc3RyYWludHMKLWludCBjb25zdHJhaW50KGRlZnJDYWxsYmFja1R5cGVfZSBjLCBkZWZpQXNzZXJ0aW9uKiBhLCBkZWZpVXNlckRhdGEgdWQpIHsKLSAgLy8gSGFuZGxlcyBib3RoIGNvbnN0cmFpbnRzIGFuZCBhc3NlcnRpb25zCi0KLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBpZiAoYS0+aXNXaXJlZGxvZ2ljKCkpCi0gICAgICAvLyBXaXJlbG9naWMKLSAgICAgIGZwcmludGYoZm91dCwgIkFTU1JUL0NPTlNUUiBXSVJFRExPR0lDICVzICsgTUFYRElTVCAlZ1xuIiwKLSAgICAgICAgICAgICAgYS0+bmV0TmFtZSgpLCBjaGVja0RvdWJsZShhLT5mYWxsTWF4KCkpKTsKLSAgZWxzZSB7Ci0gICAgICAvLyBDYWxsIHRoZSBvcGVyYW5kIGZ1bmN0aW9uCi0gICAgICBpc1N1bVNldCA9IDA7ICAgIC8vIHJlc2V0IHRoZSBnbG9iYWwgdmFyaWFibGUKLSAgICAgIGJlZ09wZXJhbmQgPSAxOwotICAgICAgb3BlcmFuZCAoYywgYSwgMCk7Ci0gICAgICAvLyBHZXQgdGhlIFJpc2UgYW5kIEZhbGwKLSAgICAgIGlmIChhLT5oYXNSaXNlTWF4KCkpCi0gICAgICAgICAgZnByaW50Zihmb3V0LCAiIFJJU0VNQVggJWcgIiwgY2hlY2tEb3VibGUoYS0+cmlzZU1heCgpKSk7Ci0gICAgICBpZiAoYS0+aGFzRmFsbE1heCgpKQotICAgICAgICAgIGZwcmludGYoZm91dCwgIiBGQUxMTUFYICVnICIsIGNoZWNrRG91YmxlKGEtPmZhbGxNYXgoKSkpOwotICAgICAgaWYgKGEtPmhhc1Jpc2VNaW4oKSkKLSAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgUklTRU1JTiAlZyAiLCBjaGVja0RvdWJsZShhLT5yaXNlTWluKCkpKTsKLSAgICAgIGlmIChhLT5oYXNGYWxsTWluKCkpCi0gICAgICAgICAgZnByaW50Zihmb3V0LCAiIEZBTExNSU4gJWcgIiwgY2hlY2tEb3VibGUoYS0+ZmFsbE1pbigpKSk7Ci0gICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICB9Ci0gIC0tbnVtT2JqczsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLy8gUHJvcGVydHkgZGVmaW5pdGlvbnMKLWludCBwcm9wKGRlZnJDYWxsYmFja1R5cGVfZSBjLCBkZWZpUHJvcCogcCwgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgaWYgKHN0cmNtcChwLT5wcm9wVHlwZSgpLCAiZGVzaWduIikgPT0gMCkKLSAgICAgIGZwcmludGYoZm91dCwgIlBST1BERUYgREVTSUdOICVzICIsIHAtPnByb3BOYW1lKCkpOwotICBlbHNlIGlmIChzdHJjbXAocC0+cHJvcFR5cGUoKSwgIm5ldCIpID09IDApCi0gICAgICBmcHJpbnRmKGZvdXQsICJQUk9QREVGIE5FVCAlcyAiLCBwLT5wcm9wTmFtZSgpKTsKLSAgZWxzZSBpZiAoc3RyY21wKHAtPnByb3BUeXBlKCksICJjb21wb25lbnQiKSA9PSAwKQotICAgICAgZnByaW50Zihmb3V0LCAiUFJPUERFRiBDT01QICVzICIsIHAtPnByb3BOYW1lKCkpOwotICBlbHNlIGlmIChzdHJjbXAocC0+cHJvcFR5cGUoKSwgInNwZWNpYWxuZXQiKSA9PSAwKQotICAgICAgZnByaW50Zihmb3V0LCAiUFJPUERFRiBTTkVUICVzICIsIHAtPnByb3BOYW1lKCkpOwotICBlbHNlIGlmIChzdHJjbXAocC0+cHJvcFR5cGUoKSwgImdyb3VwIikgPT0gMCkKLSAgICAgIGZwcmludGYoZm91dCwgIlBST1BERUYgR1JPVVAgJXMgIiwgcC0+cHJvcE5hbWUoKSk7Ci0gIGVsc2UgaWYgKHN0cmNtcChwLT5wcm9wVHlwZSgpLCAicm93IikgPT0gMCkKLSAgICAgIGZwcmludGYoZm91dCwgIlBST1BERUYgUk9XICVzICIsIHAtPnByb3BOYW1lKCkpOwotICBlbHNlIGlmIChzdHJjbXAocC0+cHJvcFR5cGUoKSwgImNvbXBvbmVudHBpbiIpID09IDApCi0gICAgICBmcHJpbnRmKGZvdXQsICJQUk9QREVGIENPTVBQSU4gJXMgIiwgcC0+cHJvcE5hbWUoKSk7Ci0gIGVsc2UgaWYgKHN0cmNtcChwLT5wcm9wVHlwZSgpLCAicmVnaW9uIikgPT0gMCkKLSAgICAgIGZwcmludGYoZm91dCwgIlBST1BERUYgUkVHSU9OICVzICIsIHAtPnByb3BOYW1lKCkpOwotICBlbHNlIGlmIChzdHJjbXAocC0+cHJvcFR5cGUoKSwgIm5vbmRlZmF1bHRydWxlIikgPT0gMCkKLSAgICAgIGZwcmludGYoZm91dCwgIlBST1BERUYgTk9OREVGQVVMVFJVTEUgJXMgIiwgcC0+cHJvcE5hbWUoKSk7Ci0gIGlmIChwLT5kYXRhVHlwZSgpID09ICdJJykKLSAgICAgIGZwcmludGYoZm91dCwgIklOVCAiKTsKLSAgaWYgKHAtPmRhdGFUeXBlKCkgPT0gJ1InKQotICAgICAgZnByaW50Zihmb3V0LCAiUkVBTCAiKTsKLSAgaWYgKHAtPmRhdGFUeXBlKCkgPT0gJ1MnKQotICAgICAgZnByaW50Zihmb3V0LCAiU1RSICIpOwotICBpZiAocC0+ZGF0YVR5cGUoKSA9PSAnUScpCi0gICAgICBmcHJpbnRmKGZvdXQsICJTVFIgIik7Ci0gIGlmIChwLT5oYXNSYW5nZSgpKSB7Ci0gICAgICBmcHJpbnRmKGZvdXQsICJSQU5HRSAlZyAlZyAiLCBjaGVja0RvdWJsZShwLT5sZWZ0KCkpLAotICAgICAgICAgICAgICAgICAgICBjaGVja0RvdWJsZShwLT5yaWdodCgpKSk7Ci0gIH0KLSAgaWYgKHAtPmhhc051bWJlcigpKQotICAgICAgZnByaW50Zihmb3V0LCAiJWcgIiwgY2hlY2tEb3VibGUocC0+bnVtYmVyKCkpKTsKLSAgaWYgKHAtPmhhc1N0cmluZygpKQotICAgICAgZnByaW50Zihmb3V0LCAiXCIlc1wiICIsIHAtPnN0cmluZygpKTsKLSAgZnByaW50Zihmb3V0LCAiXG4iKTsKLQotICByZXR1cm4gMDsKLX0KLQotCi0vLyBIaXN0b3J5Ci1pbnQgaGlzdChkZWZyQ2FsbGJhY2tUeXBlX2UgYywgY29uc3QgY2hhciogaCwgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgZnByaW50Zihmb3V0LCAiSElTVCAlc1xuIiwgaCk7Ci0gIHJldHVybiAwOwotfQotCi0KLS8vIEJ1c2JpdGNoYXJzCi1pbnQgYmJuKGRlZnJDYWxsYmFja1R5cGVfZSBjLCBjb25zdCBjaGFyKiBoLCBkZWZpVXNlckRhdGEgdWQpIHsKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBmcHJpbnRmKGZvdXQsICJCVVNCSVRDSEFSUyBcIiVzXCIgXG4iLCBoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLy8gVmVyc2lvbgotaW50IHZlcnMoZGVmckNhbGxiYWNrVHlwZV9lIGMsIGRvdWJsZSBkLCBkZWZpVXNlckRhdGEgdWQpIHsKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBmcHJpbnRmKGZvdXQsICJWRVJTSU9OICVnXG4iLCBkKTsKLQotICBjdXJWZXIgPSBkOwotICByZXR1cm4gMDsKLX0KLQotCi0vLyBVbml0cwotaW50IHVuaXRzKGRlZnJDYWxsYmFja1R5cGVfZSBjLCBkb3VibGUgZCwgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgZnByaW50Zihmb3V0LCAiVU5JVFMgRElTVEFOQ0UgTUlDUk9OUyAlZ1xuIiwgY2hlY2tEb3VibGUoZCkpOwotICByZXR1cm4gMDsKLX0KLQotCi0vLyBDYXNlc2Vuc2l0aXZlCi1pbnQgY2FzZXNlbnMoZGVmckNhbGxiYWNrVHlwZV9lIGMsIGludCBkLCBkZWZpVXNlckRhdGEgdWQpIHsKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBpZiAoZCA9PSAxKQotICAgICBmcHJpbnRmKGZvdXQsICJOQU1FU0NBU0VTRU5TSVRJVkUgT0ZGXG4iLCBkKTsKLSAgZWxzZQotICAgICBmcHJpbnRmKGZvdXQsICJOQU1FU0NBU0VTRU5TSVRJVkUgT05cbiIsIGQpOwotICByZXR1cm4gMDsKLX0KLQotCi0vLyBTaXRlLCBDYW5wbGFjZSwgQ2Fubm90b2NjdXB5LCBEaWVhcmVhLCBQaW4sIFBpbmNhcCwgRGVmYXVsdENhcCwKLS8vIFJvdywgR2NlbGxncmlkLCBUcmFjaywgVmlhLCBTY2FuY2hhaW4sIElPdGltaW5nLCBGbG9vcGxhbiwKLS8vIFJlZ2lvbiwgR3JvdXAsIFRpbWluRGlzYWJsZSwgUGluIHByb3BlcnR5Ci1pbnQgY2xzKGRlZnJDYWxsYmFja1R5cGVfZSBjLCB2b2lkKiBjbCwgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGRlZmlTaXRlKiBzaXRlOyAgLy8gU2l0ZSBhbmQgQ2FucGxhY2UgYW5kIENhbm5vdE9jY3VweQotICBkZWZpQm94KiBib3g7ICAvLyBEaWVBcmVhIGFuZCAKLSAgZGVmaVBpbkNhcCogcGM7Ci0gIGRlZmlQaW4qIHBpbjsKLSAgaW50IGksIGosIGs7Ci0gIGRlZmlSb3cqIHJvdzsKLSAgZGVmaVRyYWNrKiB0cmFjazsKLSAgZGVmaUdjZWxsR3JpZCogZ2NnOwotICBkZWZpVmlhKiB2aWE7Ci0gIGRlZmlSZWdpb24qIHJlOwotICBkZWZpR3JvdXAqIGdyb3VwOwotICBkZWZpQ29tcG9uZW50TWFza1NoaWZ0TGF5ZXIqIG1hc2tTaGlmdExheWVyID0gTlVMTDsKLSAgZGVmaVNjYW5jaGFpbiogc2M7Ci0gIGRlZmlJT1RpbWluZyogaW90OwotICBkZWZpRlBDKiBmcGM7Ci0gIGRlZmlUaW1pbmdEaXNhYmxlKiB0ZDsKLSAgZGVmaVBhcnRpdGlvbiogcGFydDsKLSAgZGVmaVBpblByb3AqIHBwcm9wOwotICBkZWZpQmxvY2thZ2UqIGJsb2NrOwotICBkZWZpU2xvdCogc2xvdDsKLSAgZGVmaUZpbGwqIGZpbGw7Ci0gIGRlZmlTdHlsZXMqIHN0eWxlczsKLSAgaW50IHhsLCB5bCwgeGgsIHloOwotICBjaGFyICpuYW1lLCAqYTEsICpiMTsKLSAgY2hhciAqKmluc3QsICoqaW5QaW4sICoqb3V0UGluOwotICBpbnQgICpiaXRzOwotICBpbnQgIHNpemU7Ci0gIGludCBjb3JuZXIsIHR5cDsKLSAgY29uc3QgY2hhciAqaXRlbVQ7Ci0gIGNoYXIgZGlyOwotICBkZWZpUGluQW50ZW5uYU1vZGVsKiBhTW9kZWw7Ci0gIGNoYXIgKnRtcFBpbk5hbWUgPSBOVUxMOwotICBjaGFyICpleHRyYVBpbk5hbWUgPSBOVUxMOwotICBjaGFyICpwTmFtZSA9IE5VTEw7Ci0gIGNoYXIgKnRtcE5hbWUgPSBOVUxMOwotICBzdHJ1Y3QgZGVmaVBvaW50cyBwb2ludHM7Ci0KLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBzd2l0Y2ggKGMpIHsKLQotICBjYXNlIGRlZnJTaXRlQ2JrVHlwZSA6Ci0gICAgICAgICBzaXRlID0gKGRlZmlTaXRlKiljbDsKLSAgICAgICAgIGZwcmludGYoZm91dCwgIlNJVEUgJXMgJWcgJWcgJXMgIiwgc2l0ZS0+bmFtZSgpLAotICAgICAgICAgICAgICAgICBjaGVja0RvdWJsZShzaXRlLT54X29yaWcoKSksIGNoZWNrRG91YmxlKHNpdGUtPnlfb3JpZygpKSwKLSAgICAgICAgICAgICAgICAgc2l0ZS0+b3JpZW50U3RyKCkpOwotICAgICAgICAgZnByaW50Zihmb3V0LCAiRE8gJWcgQlkgJWcgU1RFUCAlZyAlZ1xuIiwKLSAgICAgICAgICAgICAgICAgY2hlY2tEb3VibGUoc2l0ZS0+eF9udW0oKSksIGNoZWNrRG91YmxlKHNpdGUtPnlfbnVtKCkpLAotICAgICAgICAgICAgICAgICBjaGVja0RvdWJsZShzaXRlLT54X3N0ZXAoKSksIGNoZWNrRG91YmxlKHNpdGUtPnlfc3RlcCgpKSk7Ci0gICAgICAgICBicmVhazsKLSAgY2FzZSBkZWZyQ2FucGxhY2VDYmtUeXBlIDoKLSAgICAgICAgIHNpdGUgPSAoZGVmaVNpdGUqKWNsOwotICAgICAgICAgZnByaW50Zihmb3V0LCAiQ0FOUExBQ0UgJXMgJWcgJWcgJXMgIiwgc2l0ZS0+bmFtZSgpLAotICAgICAgICAgICAgICAgICBjaGVja0RvdWJsZShzaXRlLT54X29yaWcoKSksIGNoZWNrRG91YmxlKHNpdGUtPnlfb3JpZygpKSwKLSAgICAgICAgICAgICAgICAgc2l0ZS0+b3JpZW50U3RyKCkpOwotICAgICAgICAgZnByaW50Zihmb3V0LCAiRE8gJWcgQlkgJWcgU1RFUCAlZyAlZ1xuIiwKLSAgICAgICAgICAgICAgICAgY2hlY2tEb3VibGUoc2l0ZS0+eF9udW0oKSksIGNoZWNrRG91YmxlKHNpdGUtPnlfbnVtKCkpLAotICAgICAgICAgICAgICAgICBjaGVja0RvdWJsZShzaXRlLT54X3N0ZXAoKSksIGNoZWNrRG91YmxlKHNpdGUtPnlfc3RlcCgpKSk7Ci0gICAgICAgICBicmVhazsKLSAgY2FzZSBkZWZyQ2Fubm90T2NjdXB5Q2JrVHlwZSA6IAotICAgICAgICAgc2l0ZSA9IChkZWZpU2l0ZSopY2w7Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICJDQU5OT1RPQ0NVUFkgJXMgJWcgJWcgJXMgIiwKLSAgICAgICAgICAgICAgICAgc2l0ZS0+bmFtZSgpLCBjaGVja0RvdWJsZShzaXRlLT54X29yaWcoKSksCi0gICAgICAgICAgICAgICAgIGNoZWNrRG91YmxlKHNpdGUtPnlfb3JpZygpKSwgc2l0ZS0+b3JpZW50U3RyKCkpOwotICAgICAgICAgZnByaW50Zihmb3V0LCAiRE8gJWcgQlkgJWcgU1RFUCAlZyAlZ1xuIiwKLSAgICAgICAgICAgICAgICAgY2hlY2tEb3VibGUoc2l0ZS0+eF9udW0oKSksIGNoZWNrRG91YmxlKHNpdGUtPnlfbnVtKCkpLAotICAgICAgICAgICAgICAgICBjaGVja0RvdWJsZShzaXRlLT54X3N0ZXAoKSksIGNoZWNrRG91YmxlKHNpdGUtPnlfc3RlcCgpKSk7Ci0gICAgICAgICBicmVhazsKLSAgY2FzZSBkZWZyRGllQXJlYUNia1R5cGUgOgotICAgICAgICAgYm94ID0gKGRlZmlCb3gqKWNsOwotICAgICAgICAgZnByaW50Zihmb3V0LCAiRElFQVJFQSIpOwotICAgICAgICAgcG9pbnRzID0gYm94LT5nZXRQb2ludCgpOwotICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBvaW50cy5udW1Qb2ludHM7IGkrKykKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVkICVkIiwgcG9pbnRzLnhbaV0sIHBvaW50cy55W2ldKTsKLSAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgICAgICBicmVhazsKLSAgY2FzZSBkZWZyUGluQ2FwQ2JrVHlwZSA6Ci0gICAgICAgICBwYyA9IChkZWZpUGluQ2FwKiljbDsKLSAgICAgICAgIGZwcmludGYoZm91dCwgIkRFRkNBUCBNSU5QSU5TICVkIFdJUkVDQVAgJWdcbiIsIHBjLT5waW4oKSwKLSAgICAgICAgICAgICAgICAgY2hlY2tEb3VibGUocGMtPmNhcCgpKSk7Ci0gICAgICAgICAtLW51bU9ianM7Ci0gICAgICAgICBicmVhazsKLSAgY2FzZSBkZWZyUGluQ2JrVHlwZSA6Ci0gICAgICAgICBwaW4gPSAoZGVmaVBpbiopY2w7Ci0gICAgICAgICBwTmFtZSA9IHN0cmR1cCgoY2hhciopcGluLT5waW5OYW1lKCkpOyAgIC8vIGdldCB0aGUgcGluTmFtZQotICAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaGFzIC5leHRyYTxuPiBpbiB0aGUgcE5hbWUgYW5kIGlnbm9yZVBFCi0gICAgICAgICAvLyBpcyBzZXQgdG8gMSAKLSAgICAgICAgIGlmIChpZ25vcmVQRSkgewotICAgICAgICAgICAgLy8gY2hlY2sgaWYgLmV4dHJhIGlzIGluIHRoZSBuYW1lLCBpZiBpdCBpcywgaWdub3JlIGl0Ci0gICAgICAgICAgICBpZiAoKGV4dHJhUGluTmFtZSA9IHN0cnN0cihwTmFtZSwgIi5leHRyYSIpKSA9PSBOVUxMKQotICAgICAgICAgICAgICAgdG1wUGluTmFtZSA9IHBOYW1lOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgbmFtZSBlbmRzIHdpdGggLmV4dHJhTk5OCi0gICAgICAgICAgICAgICB0bXBOYW1lID0gZXh0cmFQaW5OYW1lOwotICAgICAgICAgICAgICAgZXh0cmFQaW5OYW1lID0gZXh0cmFQaW5OYW1lICsgNjsKLSAgICAgICAgICAgICAgICp0bXBOYW1lID0gJ1wwJzsKLSAgICAgICAgICAgICAgIHRtcFBpbk5hbWUgPSBwTmFtZTsKLSAgICAgICAgICAgICAgIGlmIChleHRyYVBpbk5hbWUgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgd2hpbGUgKCpleHRyYVBpbk5hbWUgIT0gJ1wwJyAmJiAqZXh0cmFQaW5OYW1lICE9ICdcbicpIHsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChpc2RpZ2l0KCpleHRyYVBpbk5hbWUrKykpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgIGVsc2UgeyAgIC8vIE5hbWUgZG9lcyBub3QgZW5kIG9ubHkgLmV4dHJhTk5OCi0gICAgICAgICAgICAgICAgICAgICAgICB0bXBQaW5OYW1lID0gc3RyZHVwKHBpbi0+cGluTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICB0bXBQaW5OYW1lID0gcE5hbWU7Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICJQSU4gJXMgKyBORVQgJXMgIiwgdG1wUGluTmFtZSwKLSAgICAgICAgICAgICAgICAgcGluLT5uZXROYW1lKCkpOwotICAgICAgICAgaWYgKHBpbi0+aGFzRGlyZWN0aW9uKCkpCi0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBESVJFQ1RJT04gJXMgIiwgcGluLT5kaXJlY3Rpb24oKSk7Ci0gICAgICAgICBpZiAocGluLT5oYXNVc2UoKSkKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIFVTRSAlcyAiLCBwaW4tPnVzZSgpKTsKLSAgICAgICAgIGlmIChwaW4tPmhhc05ldEV4cHIoKSkKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIE5FVEVYUFIgJXMiLCBwaW4tPm5ldEV4cHIoKSk7Ci0gICAgICAgICBpZiAocGluLT5oYXNTdXBwbHlTZW5zaXRpdml0eSgpKQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgU1VQUExZU0VOU0lUSVZJVFkgJXMgIiwgcGluLT5zdXBwbHlTZW5zaXRpdml0eSgpKTsKLSAgICAgICAgIGlmIChwaW4tPmhhc0dyb3VuZFNlbnNpdGl2aXR5KCkpCi0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBHUk9VTkRTRU5TSVRJVklUWSAlcyAiLCBwaW4tPmdyb3VuZFNlbnNpdGl2aXR5KCkpOwotICAgICAgICAgaWYgKHBpbi0+aGFzTGF5ZXIoKSkgewotICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaW4tPm51bUxheWVyKCk7IGkrKykgewotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIExBWUVSICVzICIsIHBpbi0+bGF5ZXIoaSkpOwotCQkgaWYgKHBpbi0+bGF5ZXJNYXNrKGkpKSAKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTUFTSyAlZCAiLAotCQkJICAgIHBpbi0+bGF5ZXJNYXNrKGkpKTsKLSAgICAgICAgICAgICAgICAgaWYgKHBpbi0+aGFzTGF5ZXJTcGFjaW5nKGkpKQotICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlNQQUNJTkcgJWQgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbi0+bGF5ZXJTcGFjaW5nKGkpKTsKLSAgICAgICAgICAgICAgICAgaWYgKHBpbi0+aGFzTGF5ZXJEZXNpZ25SdWxlV2lkdGgoaSkpCi0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiREVTSUdOUlVMRVdJRFRIICVkICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwaW4tPmxheWVyRGVzaWduUnVsZVdpZHRoKGkpKTsKLSAgICAgICAgICAgICAgICAgcGluLT5ib3VuZHMoaSwgJnhsLCAmeWwsICZ4aCwgJnloKTsKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKCAlZCAlZCApICggJWQgJWQgKSAiLCB4bCwgeWwsIHhoLCB5aCk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaW4tPm51bVBvbHlnb25zKCk7IGkrKykgewotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIFBPTFlHT04gJXMiLCBwaW4tPnBvbHlnb25OYW1lKGkpKTsKLQkJIGlmIChwaW4tPnBvbHlnb25NYXNrKGkpKQotICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTUFTSyAlZCAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwaW4tPnBvbHlnb25NYXNrKGkpKTsKLSAgICAgICAgICAgICAgICAgaWYgKHBpbi0+aGFzUG9seWdvblNwYWNpbmcoaSkpCi0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiU1BBQ0lORyAlZCAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcGluLT5wb2x5Z29uU3BhY2luZyhpKSk7Ci0gICAgICAgICAgICAgICAgIGlmIChwaW4tPmhhc1BvbHlnb25EZXNpZ25SdWxlV2lkdGgoaSkpCi0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiREVTSUdOUlVMRVdJRFRIICVkICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwaW4tPnBvbHlnb25EZXNpZ25SdWxlV2lkdGgoaSkpOwotICAgICAgICAgICAgICAgICBwb2ludHMgPSBwaW4tPmdldFBvbHlnb24oaSk7Ci0gICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBwb2ludHMubnVtUG9pbnRzOyBrKyspCi0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAlZCAlZCIsIHBvaW50cy54W2tdLCBwb2ludHMueVtrXSk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaW4tPm51bVZpYXMoKTsgaSsrKSB7Ci0JCSBpZiAocGluLT52aWFUb3BNYXNrKGkpIHx8IHBpbi0+dmlhQ3V0TWFzayhpKSB8fCBwaW4tPnZpYUJvdHRvbU1hc2soaSkpIHsKLSAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuVklBICVzIE1BU0sgJWQlZCVkICVkICVkICIsIAotICAgICAgICAgICAgICAgICAgICAgICAgIHBpbi0+dmlhTmFtZShpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwaW4tPnZpYVRvcE1hc2soaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGluLT52aWFDdXRNYXNrKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBpbi0+dmlhQm90dG9tTWFzayhpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwaW4tPnZpYVB0WChpKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGluLT52aWFQdFkoaSkpOwotICAgICAgICAgICAgICAgICB9IGVsc2UgewotCQkgICAgZnByaW50Zihmb3V0LCAiXG5WSUEgJXMgJWQgJWQgIiwgcGluLT52aWFOYW1lKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBpbi0+dmlhUHRYKGkpLCBwaW4tPnZpYVB0WShpKSk7Ci0JCSB9Ci0gICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgaWYgKHBpbi0+aGFzUGxhY2VtZW50KCkpIHsKLSAgICAgICAgICAgICBpZiAocGluLT5pc1BsYWNlZCgpKQotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgUExBQ0VEICIpOwotICAgICAgICAgICAgIGlmIChwaW4tPmlzQ292ZXIoKSkKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIENPVkVSICIpOwotICAgICAgICAgICAgIGlmIChwaW4tPmlzRml4ZWQoKSkKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIEZJWEVEICIpOwotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiggJWQgJWQgKSAlcyAiLCBwaW4tPnBsYWNlbWVudFgoKSwKLSAgICAgICAgICAgICAgICAgICAgIHBpbi0+cGxhY2VtZW50WSgpLCBwaW4tPm9yaWVudFN0cigpKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmIChwaW4tPmhhc1NwZWNpYWwoKSkKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgU1BFQ0lBTCAiKTsKLSAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0KLSAgICAgICAgIGlmIChwaW4tPmhhc1BvcnQoKSkgewotICAgICAgICAgICAgIHN0cnVjdCBkZWZpUG9pbnRzIHBvaW50czsKLSAgICAgICAgICAgICBkZWZpUGluUG9ydCogcG9ydDsKLSAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcGluLT5udW1Qb3J0cygpOyBqKyspIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJQSU4gJXMiLCB0bXBQaW5OYW1lKTsKLSAgICAgICAgICAgICAgICBwb3J0ID0gcGluLT5waW5Qb3J0KGopOwotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiArIFBPUlQiKTsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcG9ydC0+bnVtTGF5ZXIoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBMQVlFUiAlcyIsIHBvcnQtPmxheWVyKGkpKTsKLQkJICAgaWYgKHBvcnQtPmxheWVyTWFzayhpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTUFTSyAlZCAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQtPmxheWVyTWFzayhpKSk7Ci0gICAgICAgICAgICAgICAgICAgaWYgKHBvcnQtPmhhc0xheWVyU3BhY2luZyhpKSkKLSAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBTUEFDSU5HICVkIiwgcG9ydC0+bGF5ZXJTcGFjaW5nKGkpKTsKLSAgICAgICAgICAgICAgICAgICBpZiAocG9ydC0+aGFzTGF5ZXJEZXNpZ25SdWxlV2lkdGgoaSkpCi0gICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgREVTSUdOUlVMRVdJRFRIICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LT5sYXllckRlc2lnblJ1bGVXaWR0aChpKSk7Ci0gICAgICAgICAgICAgICAgICAgcG9ydC0+Ym91bmRzKGksICZ4bCwgJnlsLCAmeGgsICZ5aCk7Ci0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVkICVkICVkICVkIiwgeGwsIHlsLCB4aCwgeWgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcG9ydC0+bnVtUG9seWdvbnMoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICsgUE9MWUdPTiAlcyIsIHBvcnQtPnBvbHlnb25OYW1lKGkpKTsKLQkJICAgaWYgKHBvcnQtPnBvbHlnb25NYXNrKGkpKQotICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTUFTSyAlZCAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LT5wb2x5Z29uTWFzayhpKSk7Ci0gICAgICAgICAgICAgICAgICAgaWYgKHBvcnQtPmhhc1BvbHlnb25TcGFjaW5nKGkpKQotICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIFNQQUNJTkcgJWQiLCBwb3J0LT5wb2x5Z29uU3BhY2luZyhpKSk7Ci0gICAgICAgICAgICAgICAgICAgaWYgKHBvcnQtPmhhc1BvbHlnb25EZXNpZ25SdWxlV2lkdGgoaSkpCi0gICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgREVTSUdOUlVMRVdJRFRIICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LT5wb2x5Z29uRGVzaWduUnVsZVdpZHRoKGkpKTsKLSAgICAgICAgICAgICAgICAgICBwb2ludHMgPSBwb3J0LT5nZXRQb2x5Z29uKGkpOwotICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBwb2ludHMubnVtUG9pbnRzOyBrKyspCi0gICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgJWQgJWQiLCBwb2ludHMueFtrXSwgcG9pbnRzLnlba10pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcG9ydC0+bnVtVmlhcygpOyBpKyspIHsKLQkJICAgaWYgKHBvcnQtPnZpYVRvcE1hc2soaSkgfHwgcG9ydC0+dmlhQ3V0TWFzayhpKSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBvcnQtPnZpYUJvdHRvbU1hc2soaSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuICAgIFZJQSAlcyBNQVNLICVkJWQlZCAoICVkICVkICkgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LT52aWFOYW1lKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQtPnZpYVRvcE1hc2soaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC0+dmlhQ3V0TWFzayhpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LT52aWFCb3R0b21NYXNrKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQtPnZpYVB0WChpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LT52aWFQdFkoaSkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotCQkJZnByaW50Zihmb3V0LCAiIFZJQSAlcyAoICVkICVkICkgIiwgcG9ydC0+dmlhTmFtZShpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQtPnZpYVB0WChpKSwgcG9ydC0+dmlhUHRZKGkpKTsKLQkJICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBvcnQtPmhhc1BsYWNlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgaWYgKHBvcnQtPmlzUGxhY2VkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgKyBQTEFDRUQiKTsKLSAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgJWQgJWQgJWQgIiwgcG9ydC0+cGxhY2VtZW50WCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQtPnBsYWNlbWVudFkoKSwgcG9ydC0+b3JpZW50KCkpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBpZiAocG9ydC0+aXNDb3ZlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICsgQ09WRVIiKTsKLSAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgJWQgJWQgJWQgIiwgcG9ydC0+cGxhY2VtZW50WCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQtPnBsYWNlbWVudFkoKSwgcG9ydC0+b3JpZW50KCkpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBpZiAocG9ydC0+aXNGaXhlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICsgRklYRUQiKTsKLSAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgJWQgJWQgJWQiLCBwb3J0LT5wbGFjZW1lbnRYKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC0+cGxhY2VtZW50WSgpLCBwb3J0LT5vcmllbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAocGluLT5oYXNBUGluUGFydGlhbE1ldGFsQXJlYSgpKSB7Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiUElOICVzICsgTkVUICVzICIsIHRtcFBpbk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICBwaW4tPm5ldE5hbWUoKSk7Ci0gICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBpbi0+bnVtQVBpblBhcnRpYWxNZXRhbEFyZWEoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBBTlRQSU5QQVJUSUFMTUVUQUxBUkVBICVkICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGluLT5BUGluUGFydGlhbE1ldGFsQXJlYShpKSk7Ci0gICAgICAgICAgICAgICAgIGlmICgqKHBpbi0+QVBpblBhcnRpYWxNZXRhbEFyZWFMYXllcihpKSkpCi0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAlcyAiLCBwaW4tPkFQaW5QYXJ0aWFsTWV0YWxBcmVhTGF5ZXIoaSkpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgfQotICAgICAgICAgaWYgKHBpbi0+aGFzQVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhKCkpIHsKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJQSU4gJXMgKyBORVQgJXMgIiwgdG1wUGluTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIHBpbi0+bmV0TmFtZSgpKTsKLSAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGluLT5udW1BUGluUGFydGlhbE1ldGFsU2lkZUFyZWEoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiQU5UUElOUEFSVElBTE1FVEFMU0lERUFSRUEgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgcGluLT5BUGluUGFydGlhbE1ldGFsU2lkZUFyZWEoaSkpOwotICAgICAgICAgICAgICAgIGlmICgqKHBpbi0+QVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhTGF5ZXIoaSkpKQotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgJXMiLCBwaW4tPkFQaW5QYXJ0aWFsTWV0YWxTaWRlQXJlYUxheWVyKGkpKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmIChwaW4tPmhhc0FQaW5QYXJ0aWFsQ3V0QXJlYSgpKSB7Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiUElOICVzICsgTkVUICVzICIsIHRtcFBpbk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICBwaW4tPm5ldE5hbWUoKSk7Ci0gICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBpbi0+bnVtQVBpblBhcnRpYWxDdXRBcmVhKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkFOVFBJTlBBUlRJQUxDVVRBUkVBICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBpbi0+QVBpblBhcnRpYWxDdXRBcmVhKGkpKTsKLSAgICAgICAgICAgICAgICBpZiAoKihwaW4tPkFQaW5QYXJ0aWFsQ3V0QXJlYUxheWVyKGkpKSkKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVzIiwgcGluLT5BUGluUGFydGlhbEN1dEFyZWFMYXllcihpKSk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAocGluLT5oYXNBUGluRGlmZkFyZWEoKSkgewotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlBJTiAlcyArIE5FVCAlcyAiLCB0bXBQaW5OYW1lLAotICAgICAgICAgICAgICAgICAgICAgcGluLT5uZXROYW1lKCkpOwotICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaW4tPm51bUFQaW5EaWZmQXJlYSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJBTlRQSU5ESUZGQVJFQSAlZCIsIHBpbi0+QVBpbkRpZmZBcmVhKGkpKTsKLSAgICAgICAgICAgICAgICBpZiAoKihwaW4tPkFQaW5EaWZmQXJlYUxheWVyKGkpKSkKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVzIiwgcGluLT5BUGluRGlmZkFyZWFMYXllcihpKSk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwaW4tPm51bUFudGVubmFNb2RlbCgpOyBqKyspIHsKLSAgICAgICAgICAgICBhTW9kZWwgPSBwaW4tPmFudGVubmFNb2RlbChqKTsKLQotICAgICAgICAgICAgIGlmIChhTW9kZWwtPmhhc0FQaW5HYXRlQXJlYSgpKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiUElOICVzICsgTkVUICVzICVzICIsIHRtcFBpbk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBwaW4tPm5ldE5hbWUoKSwgYU1vZGVsLT5hbnRlbm5hT3hpZGUoKSk7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFNb2RlbC0+bnVtQVBpbkdhdGVBcmVhKCk7Ci0gICAgICAgICAgICAgICAgICAgICBpKyspIHsKLSAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJBTlRQSU5HQVRFQVJFQSAlZCIsIGFNb2RlbC0+QVBpbkdhdGVBcmVhKGkpKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKihhTW9kZWwtPkFQaW5HYXRlQXJlYUxheWVyKGkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVzIiwgYU1vZGVsLT5BUGluR2F0ZUFyZWFMYXllcihpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGlmIChhTW9kZWwtPmhhc0FQaW5NYXhBcmVhQ2FyKCkpIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJQSU4gJXMgKyBORVQgJXMgJXMgIiwgdG1wUGluTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBpbi0+bmV0TmFtZSgpLCBhTW9kZWwtPmFudGVubmFPeGlkZSgpKTsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwKLSAgICAgICAgICAgICAgICAgICAgIGFNb2RlbC0+bnVtQVBpbk1heEFyZWFDYXIoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiQU5UUElOTUFYQVJFQUNBUiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhTW9kZWwtPkFQaW5NYXhBcmVhQ2FyKGkpKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKihhTW9kZWwtPkFQaW5NYXhBcmVhQ2FyTGF5ZXIoaSkpKQotICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgJXMiLCBhTW9kZWwtPkFQaW5NYXhBcmVhQ2FyTGF5ZXIoaSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBpZiAoYU1vZGVsLT5oYXNBUGluTWF4U2lkZUFyZWFDYXIoKSkgewotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlBJTiAlcyArIE5FVCAlcyAlcyAiLCB0bXBQaW5OYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgcGluLT5uZXROYW1lKCksIGFNb2RlbC0+YW50ZW5uYU94aWRlKCkpOwotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICBpIDwgYU1vZGVsLT5udW1BUGluTWF4U2lkZUFyZWFDYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgIGkrKykgewotICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkFOVFBJTk1BWFNJREVBUkVBQ0FSICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFNb2RlbC0+QVBpbk1heFNpZGVBcmVhQ2FyKGkpKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKihhTW9kZWwtPkFQaW5NYXhTaWRlQXJlYUNhckxheWVyKGkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVzIiwgYU1vZGVsLT5BUGluTWF4U2lkZUFyZWFDYXJMYXllcihpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGlmIChhTW9kZWwtPmhhc0FQaW5NYXhDdXRDYXIoKSkgewotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlBJTiAlcyArIE5FVCAlcyAlcyAiLCB0bXBQaW5OYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgcGluLT5uZXROYW1lKCksIGFNb2RlbC0+YW50ZW5uYU94aWRlKCkpOwotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhTW9kZWwtPm51bUFQaW5NYXhDdXRDYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgIGkrKykgewotICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkFOVFBJTk1BWENVVENBUiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhTW9kZWwtPkFQaW5NYXhDdXRDYXIoaSkpOwotICAgICAgICAgICAgICAgICAgIGlmICgqKGFNb2RlbC0+QVBpbk1heEN1dENhckxheWVyKGkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVzIiwgYU1vZGVsLT5BUGluTWF4Q3V0Q2FyTGF5ZXIoaSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIGlmICh0bXBQaW5OYW1lKQotICAgICAgICAgICAgIGZyZWUodG1wUGluTmFtZSk7Ci0gICAgICAgICAtLW51bU9ianM7Ci0gICAgICAgICBicmVhazsKLSAgY2FzZSBkZWZyRGVmYXVsdENhcENia1R5cGUgOgotICAgICAgICAgaSA9IChsb25nKWNsOwotICAgICAgICAgZnByaW50Zihmb3V0LCAiREVGQVVMVENBUCAlZFxuIiwgaSk7Ci0gICAgICAgICBudW1PYmpzID0gaTsKLSAgICAgICAgIGJyZWFrOwotICBjYXNlIGRlZnJSb3dDYmtUeXBlIDoKLSAgICAgICAgIHJvdyA9IChkZWZpUm93KiljbDsKLSAgICAgICAgIGlmIChpZ25vcmVSTikgIC8vIFBDUiA3MTY3NTksIGlmIGZsYWcgaXMgc2V0IGRvbid0IGJvdGhlciB3aXRoIG5hbWUKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlJPVyAlcyAlZyAlZyAlZCIsCi0gICAgICAgICAgICAgICAgICAgIHJvdy0+bWFjcm8oKSwgY2hlY2tEb3VibGUocm93LT54KCkpLCBjaGVja0RvdWJsZShyb3ctPnkoKSksCi0gICAgICAgICAgICAgICAgICAgIHJvdy0+b3JpZW50KCkpOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiUk9XICVzICVzICVnICVnICVkIiwgcm93LT5uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIHJvdy0+bWFjcm8oKSwgY2hlY2tEb3VibGUocm93LT54KCkpLCBjaGVja0RvdWJsZShyb3ctPnkoKSksCi0gICAgICAgICAgICAgICAgICAgIHJvdy0+b3JpZW50KCkpOwotICAgICAgICAgaWYgKHJvdy0+aGFzRG8oKSkgewotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIERPICVnIEJZICVnIiwKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tEb3VibGUocm93LT54TnVtKCkpLCBjaGVja0RvdWJsZShyb3ctPnlOdW0oKSkpOwotICAgICAgICAgICAgaWYgKHJvdy0+aGFzRG9TdGVwKCkpIAotICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIFNURVAgJWcgJWdcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIGNoZWNrRG91YmxlKHJvdy0+eFN0ZXAoKSksIGNoZWNrRG91YmxlKHJvdy0+eVN0ZXAoKSkpOwotICAgICAgICAgfQotICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgIGlmIChyb3ctPm51bVByb3BzKCkgPiAwKSB7Ci0gICAgICAgICAgICBpZiAoaWdub3JlUk4pIHsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93LT5udW1Qcm9wcygpOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlJPVyBQUk9QICVzICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdy0+cHJvcE5hbWUoaSksIHJvdy0+cHJvcFZhbHVlKGkpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvdy0+bnVtUHJvcHMoKTsgaSsrKQotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJST1cgJXMgUFJPUCAlcyAlc1xuIiwgcm93LT5uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93LT5wcm9wTmFtZShpKSwgcm93LT5wcm9wVmFsdWUoaSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0gIGNhc2UgZGVmclRyYWNrQ2JrVHlwZSA6Ci0gICAgICAgICB0cmFjayA9IChkZWZpVHJhY2sqKWNsOwotCSAvKmlmICh0cmFjay0+Zmlyc3RUcmFja01hc2soKSkgewotCSAgICBpZiAodHJhY2stPnNhbWVNYXNrKCkpIHsKLQkJZnByaW50Zihmb3V0LCAiVFJBQ0tTICVzICVnIERPICVnIFNURVAgJWcgTUFTSyAlZCBTQU1FTUFTSyBMQVlFUiAiLAotICAgICAgICAgICAgICAgICB0cmFjay0+bWFjcm8oKSwgdHJhY2stPngoKSwKLSAgICAgICAgICAgICAgICAgdHJhY2stPnhOdW0oKSwgdHJhY2stPnhTdGVwKCksCi0JICAgICAgICAgdHJhY2stPmZpcnN0VHJhY2tNYXNrKCkpOwotCSAgICB9IGVsc2UgewotCQlmcHJpbnRmKGZvdXQsICJUUkFDS1MgJXMgJWcgRE8gJWcgU1RFUCAlZyBNQVNLICVkIExBWUVSICIsCi0gICAgICAgICAgICAgICAgIHRyYWNrLT5tYWNybygpLCB0cmFjay0+eCgpLAotICAgICAgICAgICAgICAgICB0cmFjay0+eE51bSgpLCB0cmFjay0+eFN0ZXAoKSwKLQkgICAgICAgICB0cmFjay0+Zmlyc3RUcmFja01hc2soKSk7Ci0JICAgIH0KLQkgfSBlbHNlIHsKLQkgICAgZnByaW50Zihmb3V0LCAiVFJBQ0tTICVzICVnIERPICVnIFNURVAgJWcgTEFZRVIgIiwKLSAgICAgICAgICAgICAgICAgdHJhY2stPm1hY3JvKCksIHRyYWNrLT54KCksCi0gICAgICAgICAgICAgICAgIHRyYWNrLT54TnVtKCksIHRyYWNrLT54U3RlcCgpKTsKLQkgfSAqLwotICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRyYWNrLT5udW1MYXllcnMoKTsgaSsrKSB7Ci0JICAgIGlmICh0cmFjay0+Zmlyc3RUcmFja01hc2soKSkgewotCQlpZiAodHJhY2stPnNhbWVNYXNrKCkpIHsKLQkJICAgIGZwcmludGYoZm91dCwgIlRSQUNLUyAlcyAlZyBETyAlZyBTVEVQICVnIE1BU0sgJWQgU0FNRU1BU0sgTEFZRVIgJXNcbiIsCi0JCQkgICAgdHJhY2stPm1hY3JvKCksIHRyYWNrLT54KCksCi0JCQkgICAgdHJhY2stPnhOdW0oKSwgdHJhY2stPnhTdGVwKCksCi0JCQkgICAgdHJhY2stPmZpcnN0VHJhY2tNYXNrKCksIHRyYWNrLT5sYXllcihpKSk7Ci0JCX0gZWxzZSB7Ci0JCSAgICBmcHJpbnRmKGZvdXQsICJUUkFDS1MgJXMgJWcgRE8gJWcgU1RFUCAlZyBNQVNLICVkIExBWUVSICVzXG4iLAotCQkJICAgIHRyYWNrLT5tYWNybygpLCB0cmFjay0+eCgpLAotCQkJICAgIHRyYWNrLT54TnVtKCksIHRyYWNrLT54U3RlcCgpLAotCQkJICAgIHRyYWNrLT5maXJzdFRyYWNrTWFzaygpLAotCQkJICAgIHRyYWNrLT5sYXllcihpKSk7Ci0JCX0gCi0JICAgIH0gZWxzZSB7Ci0JCSAgICBmcHJpbnRmKGZvdXQsICJUUkFDS1MgJXMgJWcgRE8gJWcgU1RFUCAlZyBMQVlFUiAlc1xuIiwKLQkJCSAgICB0cmFjay0+bWFjcm8oKSwgdHJhY2stPngoKSwKLQkJCSAgICB0cmFjay0+eE51bSgpLCB0cmFjay0+eFN0ZXAoKSwKLQkJCSAgICB0cmFjay0+bGF5ZXIoaSkpOwotCSAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICBicmVhazsKLSAgY2FzZSBkZWZyR2NlbGxHcmlkQ2JrVHlwZSA6Ci0gICAgICAgICBnY2cgPSAoZGVmaUdjZWxsR3JpZCopY2w7Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICJHQ0VMTEdSSUQgJXMgJWQgRE8gJWQgU1RFUCAlZ1xuIiwKLSAgICAgICAgICAgICAgICAgZ2NnLT5tYWNybygpLCBnY2ctPngoKSwKLSAgICAgICAgICAgICAgICAgZ2NnLT54TnVtKCksCi0gICAgICAgICAgICAgICAgIGNoZWNrRG91YmxlKGdjZy0+eFN0ZXAoKSkpOwotICAgICAgICAgYnJlYWs7Ci0gIGNhc2UgZGVmclZpYUNia1R5cGUgOgotICAgICAgICAgdmlhID0gKGRlZmlWaWEqKWNsOwotICAgICAgICAgZnByaW50Zihmb3V0LCAiVklBICVzICIsIHZpYS0+bmFtZSgpKTsKLSAgICAgICAgIGlmICh2aWEtPmhhc1BhdHRlcm4oKSkKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgUEFUVEVSTk5BTUUgJXNcbiIsIHZpYS0+cGF0dGVybigpKTsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgZm9yIChpID0gMDsgaSA8IHZpYS0+bnVtTGF5ZXJzKCk7IGkrKykgewotICAgICAgICAgICAgIHZpYS0+bGF5ZXIoaSwgJm5hbWUsICZ4bCwgJnlsLCAmeGgsICZ5aCk7Ci0JICAgICBpbnQgcmVjdE1hc2sgPSB2aWEtPnJlY3RNYXNrKGkpOwotCi0JICAgICBpZiAocmVjdE1hc2spIHsKLQkJZnByaW50Zihmb3V0LCAiVklBICVzIFJFQ1QgJXMgIE1BU0sgJWQgKCAlZCAlZCApICggJWQgJWQgKSBcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICB2aWEtPm5hbWUoKSwgbmFtZSwgcmVjdE1hc2ssIHhsLCB5bCwgeGgsIHloKTsKLQkgICAgIH0gZWxzZSB7Ci0JCWZwcmludGYoZm91dCwgIlZJQSAlcyBSRUNUICVzICggJWQgJWQgKSAoICVkICVkICkgXG4iLCB2aWEtPm5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHhsLCB5bCwgeGgsIHloKTsKLQkgICAgIH0KLSAgICAgICAgIH0KLQkgLy8gUE9MWUdPTgotICAgICAgICAgaWYgKHZpYS0+bnVtUG9seWdvbnMoKSkgewotICAgICAgICAgICBzdHJ1Y3QgZGVmaVBvaW50cyBwb2ludHM7Ci0gICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB2aWEtPm51bVBvbHlnb25zKCk7IGkrKykgewotCSAgICAgaW50IHBvbHlNYXNrID0gdmlhLT5wb2x5TWFzayhpKTsKLQotCSAgICAgaWYgKHBvbHlNYXNrKSB7Ci0JCWZwcmludGYoZm91dCwgIlxuICBQT0xZR09OICVzIE1BU0sgJWQgIiwgCi0JCQl2aWEtPnBvbHlnb25OYW1lKGkpLCBwb2x5TWFzayk7Ci0JICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuICBQT0xZR09OICVzICIsIHZpYS0+cG9seWdvbk5hbWUoaSkpOwotCSAgICAgfQotICAgICAgICAgICAgIHBvaW50cyA9IHZpYS0+Z2V0UG9seWdvbihpKTsKLSAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcG9pbnRzLm51bVBvaW50czsgaisrKQotICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJWQgJWQgIiwgcG9pbnRzLnhbal0sIHBvaW50cy55W2pdKTsKLSAgICAgICAgICAgfQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgXG4iKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgaWYgKHZpYS0+aGFzVmlhUnVsZSgpKSB7Ci0gICAgICAgICAgICAgY2hhciAqdnJuLCAqYmwsICpjbCwgKnRsOwotICAgICAgICAgICAgIGludCB4cywgeXMsIHhjcywgeWNzLCB4YmUsIHliZSwgeHRlLCB5dGU7Ci0gICAgICAgICAgICAgaW50IGNyLCBjYywgeG8sIHlvLCB4Ym8sIHlibywgeHRvLCB5dG87Ci0gICAgICAgICAgICAgKHZvaWQpdmlhLT52aWFSdWxlKCZ2cm4sICZ4cywgJnlzLCAmYmwsICZjbCwgJnRsLCAmeGNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeWNzLCAmeGJlLCAmeWJlLCAmeHRlLCAmeXRlKTsKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJWSUEgJXMgVklBUlVMRSAlcyBDVVRTSVpFICVkICVkIExBWUVSUyAlcyAlcyAlcyIsCi0gICAgICAgICAgICAgICAgICAgICB2aWEtPm5hbWUoKSwgdnJuLCB4cywgeXMsIGJsLCBjbCwgdGwpOwotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBDVVRTUEFDSU5HICVkICVkIEVOQ0xPU1VSRSAlZCAlZCAlZCAlZCIsIHhjcywgeWNzLAotICAgICAgICAgICAgICAgICAgICAgeGJlLCB5YmUsIHh0ZSwgeXRlKTsKLSAgICAgICAgICAgICBpZiAodmlhLT5oYXNSb3dDb2woKSkgewotICAgICAgICAgICAgICAgICh2b2lkKXZpYS0+cm93Q29sKCZjciwgJmNjKTsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgUk9XQ09MICVkICVkIiwgY3IsIGNjKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgaWYgKHZpYS0+aGFzT3JpZ2luKCkpIHsKLSAgICAgICAgICAgICAgICAodm9pZCl2aWEtPm9yaWdpbigmeG8sICZ5byk7Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIE9SSUdJTiAlZCAlZCIsIHhvLCB5byk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGlmICh2aWEtPmhhc09mZnNldCgpKSB7Ci0gICAgICAgICAgICAgICAgKHZvaWQpdmlhLT5vZmZzZXQoJnhibywgJnlibywgJnh0bywgJnl0byk7Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIE9GRlNFVCAlZCAlZCAlZCAlZCIsIHhibywgeWJvLCB4dG8sIHl0byk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGlmICh2aWEtPmhhc0N1dFBhdHRlcm4oKSkKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgUEFUVEVSTiAlcyIsIHZpYS0+Y3V0UGF0dGVybigpKTsKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgfQotICAgICAgICAgLS1udW1PYmpzOwotICAgICAgICAgYnJlYWs7Ci0gIGNhc2UgZGVmclJlZ2lvbkNia1R5cGUgOgotICAgICAgICAgcmUgPSAoZGVmaVJlZ2lvbiopY2w7Ci0gICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmUtPm51bVJlY3RhbmdsZXMoKTsgaSsrKQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlJFR0lPTiAlcyAoICVkICVkICkgKCAlZCAlZCApXG4iLHJlLT5uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICByZS0+eGwoaSksIHJlLT55bChpKSwgcmUtPnhoKGkpLCByZS0+eWgoaSkpOwotICAgICAgICAgaWYgKHJlLT5oYXNUeXBlKCkpCi0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiUkVHSU9OICVzIFRZUEUgJXNcbiIscmUtPm5hbWUoKSwgcmUtPnR5cGUoKSk7Ci0gICAgICAgICAtLW51bU9ianM7Ci0gICAgICAgICBicmVhazsKLSAgY2FzZSBkZWZyR3JvdXBDYmtUeXBlIDoKLSAgICAgICAgIGdyb3VwID0gKGRlZmlHcm91cCopY2w7Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICJHUk9VUCAlcyAiLCBncm91cC0+bmFtZSgpKTsKLSAgICAgICAgIGlmIChncm91cC0+aGFzTWF4WCgpIHwgZ3JvdXAtPmhhc01heFkoKQotICAgICAgICAgICAgIHwgZ3JvdXAtPmhhc1BlcmltKCkpIHsKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJTT0ZUICIpOwotICAgICAgICAgICAgIGlmIChncm91cC0+aGFzUGVyaW0oKSkgCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIk1BWEhBTEZQRVJJTUVURVIgJWQgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBncm91cC0+cGVyaW0oKSk7Ci0gICAgICAgICAgICAgaWYgKGdyb3VwLT5oYXNNYXhYKCkpCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIk1BWFggJWQgIiwgZ3JvdXAtPm1heFgoKSk7Ci0gICAgICAgICAgICAgaWYgKGdyb3VwLT5oYXNNYXhZKCkpIAotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJNQVhZICVkICIsIGdyb3VwLT5tYXhZKCkpOwotICAgICAgICAgfSAKLSAgICAgICAgIGlmIChncm91cC0+aGFzUmVnaW9uTmFtZSgpKQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlJFR0lPTiAlcyAiLCBncm91cC0+cmVnaW9uTmFtZSgpKTsKLSAgICAgICAgIGlmIChncm91cC0+aGFzUmVnaW9uQm94KCkpIHsKLSAgICAgICAgICAgICBpbnQgKmd4bCwgKmd5bCwgKmd4aCwgKmd5aDsKLSAgICAgICAgICAgICBpbnQgc2l6ZTsKLSAgICAgICAgICAgICBncm91cC0+cmVnaW9uUmVjdHMoJnNpemUsICZneGwsICZneWwsICZneGgsICZneWgpOwotICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlJFR0lPTiAoJWQgJWQpICglZCAlZCkgIiwgZ3hsW2ldLCBneWxbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ3hoW2ldLCBneWhbaV0pOwotICAgICAgICAgfQotICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgIC0tbnVtT2JqczsKLSAgICAgICAgIGJyZWFrOwotICBjYXNlIGRlZnJDb21wb25lbnRNYXNrU2hpZnRMYXllckNia1R5cGUgOgotCSBmcHJpbnRmKGZvdXQsICJDT01QT05FTlRNQVNLU0hJRlQgIik7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWFza1NoaWZ0TGF5ZXItPm51bU1hc2tTaGlmdExheWVycygpOyBpKyspIHsKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgbWFza1NoaWZ0TGF5ZXItPm1hc2tTaGlmdExheWVyKGkpKTsKLSAgICAgICAgfSAKLSAgICAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0JIGJyZWFrOwotICBjYXNlIGRlZnJTY2FuY2hhaW5DYmtUeXBlIDoKLSAgICAgICAgIHNjID0gKGRlZmlTY2FuY2hhaW4qKWNsOwotICAgICAgICAgZnByaW50Zihmb3V0LCAiU0NBTkNIQUlOUyAlcyIsIHNjLT5uYW1lKCkpOwotICAgICAgICAgaWYgKHNjLT5oYXNTdGFydCgpKSB7Ci0gICAgICAgICAgICAgc2MtPnN0YXJ0KCZhMSwgJmIxKTsKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgU1RBUlQgJXMgJXMiLCBzYy0+bmFtZSgpLCBhMSwgYjEpOwotICAgICAgICAgfQotICAgICAgICAgaWYgKHNjLT5oYXNTdG9wKCkpIHsKLSAgICAgICAgICAgICBzYy0+c3RvcCgmYTEsICZiMSk7Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIFNUT1AgJXMgJXMiLCBzYy0+bmFtZSgpLCBhMSwgYjEpOwotICAgICAgICAgfQotICAgICAgICAgaWYgKHNjLT5oYXNDb21tb25JblBpbigpIHx8Ci0gICAgICAgICAgICAgc2MtPmhhc0NvbW1vbk91dFBpbigpKSB7Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIENPTU1PTlNDQU5QSU5TICIsIHNjLT5uYW1lKCkpOwotICAgICAgICAgICAgIGlmIChzYy0+aGFzQ29tbW9uSW5QaW4oKSkKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgKCBJTiAlcyApIiwgc2MtPmNvbW1vbkluUGluKCkpOwotICAgICAgICAgICAgIGlmIChzYy0+aGFzQ29tbW9uT3V0UGluKCkpCi0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICggT1VUICVzICkiLHNjLT5jb21tb25PdXRQaW4oKSk7Ci0gICAgICAgICB9Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgaWYgKHNjLT5oYXNGbG9hdGluZygpKSB7Ci0gICAgICAgICAgICBzYy0+ZmxvYXRpbmcoJnNpemUsICZpbnN0LCAmaW5QaW4sICZvdXRQaW4sICZiaXRzKTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJTQ0FOQ0hBSU5TICVzIEZMT0FUSU5HICVzIiwgc2MtPm5hbWUoKSwgaW5zdFtpXSk7Ci0gICAgICAgICAgICAgICAgaWYgKGluUGluW2ldKQotICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBJTiAlcyIsIGluUGluW2ldKTsKLSAgICAgICAgICAgICAgICBpZiAob3V0UGluW2ldKQotICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBPVVQgJXMiLCBvdXRQaW5baV0pOwotICAgICAgICAgICAgICAgIGlmIChiaXRzW2ldICE9IC0xKQotICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBCSVRTICVkIiwgYml0c1tpXSk7Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLQotICAgICAgICAgaWYgKHNjLT5oYXNPcmRlcmVkKCkpIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzYy0+bnVtT3JkZXJlZExpc3RzKCk7IGkrKykgewotICAgICAgICAgICAgICAgIHNjLT5vcmRlcmVkKGksICZzaXplLCAmaW5zdCwgJmluUGluLCAmb3V0UGluLCAmYml0cyk7Ci0gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHNpemU7IGorKykgewotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJTQ0FOQ0hBSU5TICVzIE9SREVSRUQgJXMiLCBzYy0+bmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3Rbal0pOyAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluUGluW2pdKQotICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgSU4gJXMiLCBpblBpbltqXSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvdXRQaW5bal0pCi0gICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBPVVQgJXMiLCBvdXRQaW5bal0pOwotICAgICAgICAgICAgICAgICAgICBpZiAoYml0c1tqXSAhPSAtMSkKLSAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIEJJVFMgJWQiLCBiaXRzW2pdKTsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGlmIChzYy0+aGFzUGFydGl0aW9uKCkpIHsKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlNDQU5DSEFJTlMgJXMgUEFSVElUSU9OICVzIiwgc2MtPm5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgc2MtPnBhcnRpdGlvbk5hbWUoKSk7Ci0gICAgICAgICAgICBpZiAoc2MtPmhhc1BhcnRpdGlvbk1heEJpdHMoKSkKLSAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIE1BWEJJVFMgJWQiLCBzYy0+cGFydGl0aW9uTWF4Qml0cygpKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgICAgICAtLW51bU9ianM7Ci0gICAgICAgICBicmVhazsKLSAgY2FzZSBkZWZySU9UaW1pbmdDYmtUeXBlIDoKLSAgICAgICAgIGlvdCA9IChkZWZpSU9UaW1pbmcqKWNsOwotICAgICAgICAgZnByaW50Zihmb3V0LCAiSU9USU1JTkcgKCAlcyAlcyApXG4iLCBpb3QtPmluc3QoKSwgaW90LT5waW4oKSk7Ci0gICAgICAgICBpZiAoaW90LT5oYXNTbGV3UmlzZSgpKQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIklPVElNSU5HICVzIFJJU0UgU0xFV1JBVEUgJWcgJWdcbiIsIGlvdC0+aW5zdCgpLAotICAgICAgICAgICAgICAgICAgICAgY2hlY2tEb3VibGUoaW90LT5zbGV3UmlzZU1pbigpKSwKLSAgICAgICAgICAgICAgICAgICAgIGNoZWNrRG91YmxlKGlvdC0+c2xld1Jpc2VNYXgoKSkpOwotICAgICAgICAgaWYgKGlvdC0+aGFzU2xld0ZhbGwoKSkKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJJT1RJTUlORyAlcyBGQUxMIFNMRVdSQVRFICVnICVnXG4iLCBpb3QtPmluc3QoKSwKLSAgICAgICAgICAgICAgICAgICAgIGNoZWNrRG91YmxlKGlvdC0+c2xld0ZhbGxNaW4oKSksCi0gICAgICAgICAgICAgICAgICAgICBjaGVja0RvdWJsZShpb3QtPnNsZXdGYWxsTWF4KCkpKTsKLSAgICAgICAgIGlmIChpb3QtPmhhc1ZhcmlhYmxlUmlzZSgpKQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIklPVElNSU5HICVzIFJJU0UgVkFSSUFCTEUgJWcgJWdcbiIsIGlvdC0+aW5zdCgpLAotICAgICAgICAgICAgICAgICAgICAgY2hlY2tEb3VibGUoaW90LT52YXJpYWJsZVJpc2VNaW4oKSksCi0gICAgICAgICAgICAgICAgICAgICBjaGVja0RvdWJsZShpb3QtPnZhcmlhYmxlUmlzZU1heCgpKSk7Ci0gICAgICAgICBpZiAoaW90LT5oYXNWYXJpYWJsZUZhbGwoKSkKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJJT1RJTUlORyAlcyBGQUxMIFZBUklBQkxFICVnICVnXG4iLCBpb3QtPmluc3QoKSwKLSAgICAgICAgICAgICAgICAgICAgIGNoZWNrRG91YmxlKGlvdC0+dmFyaWFibGVGYWxsTWluKCkpLAotICAgICAgICAgICAgICAgICAgICAgY2hlY2tEb3VibGUoaW90LT52YXJpYWJsZUZhbGxNYXgoKSkpOwotICAgICAgICAgaWYgKGlvdC0+aGFzQ2FwYWNpdGFuY2UoKSkKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJJT1RJTUlORyAlcyBDQVBBQ0lUQU5DRSAlZ1xuIiwgaW90LT5pbnN0KCksCi0gICAgICAgICAgICAgICAgICAgICBjaGVja0RvdWJsZShpb3QtPmNhcGFjaXRhbmNlKCkpKTsKLSAgICAgICAgIGlmIChpb3QtPmhhc0RyaXZlQ2VsbCgpKSB7Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiSU9USU1JTkcgJXMgRFJJVkVDRUxMICVzICIsIGlvdC0+aW5zdCgpLAotICAgICAgICAgICAgICAgICAgICAgaW90LT5kcml2ZUNlbGwoKSk7Ci0gICAgICAgICAgICAgaWYgKGlvdC0+aGFzRnJvbSgpKQotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgRlJPTVBJTiAlcyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGlvdC0+ZnJvbSgpKTsKLSAgICAgICAgICAgICBpZiAoaW90LT5oYXNUbygpKQotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgVE9QSU4gJXMgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpb3QtPnRvKCkpOwotICAgICAgICAgICAgIGlmIChpb3QtPmhhc1BhcmFsbGVsKCkpCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlBBUkFMTEVMICVnIiwgY2hlY2tEb3VibGUoaW90LT5wYXJhbGxlbCgpKSk7Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgIH0KLSAgICAgICAgIC0tbnVtT2JqczsKLSAgICAgICAgIGJyZWFrOwotICBjYXNlIGRlZnJGUENDYmtUeXBlIDoKLSAgICAgICAgIGZwYyA9IChkZWZpRlBDKiljbDsKLSAgICAgICAgIGZwcmludGYoZm91dCwgIkZMT09SUExBTiAlcyAiLCBmcGMtPm5hbWUoKSk7Ci0gICAgICAgICBpZiAoZnBjLT5pc1ZlcnRpY2FsKCkpCi0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiVkVSVElDQUwgIik7Ci0gICAgICAgICBpZiAoZnBjLT5pc0hvcml6b250YWwoKSkKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJIT1JJWk9OVEFMICIpOwotICAgICAgICAgaWYgKGZwYy0+aGFzQWxpZ24oKSkKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJBTElHTiAiKTsKLSAgICAgICAgIGlmIChmcGMtPmhhc01heCgpKQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVnICIsIGNoZWNrRG91YmxlKGZwYy0+YWxpZ25NYXgoKSkpOwotICAgICAgICAgaWYgKGZwYy0+aGFzTWluKCkpCi0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJWcgIiwgY2hlY2tEb3VibGUoZnBjLT5hbGlnbk1pbigpKSk7Ci0gICAgICAgICBpZiAoZnBjLT5oYXNFcXVhbCgpKQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVnICIsIGNoZWNrRG91YmxlKGZwYy0+ZXF1YWwoKSkpOwotICAgICAgICAgZm9yIChpID0gMDsgaSA8IGZwYy0+bnVtUGFydHMoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgZnBjLT5nZXRQYXJ0KGksICZjb3JuZXIsICZ0eXAsICZuYW1lKTsKLSAgICAgICAgICAgICBpZiAoY29ybmVyID09ICdCJykKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiQk9UVE9NTEVGVCAiKTsKLSAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlRPUFJJR0hUICIpOwotICAgICAgICAgICAgIGlmICh0eXAgPT0gJ1InKQotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJST1dTICVzICIsIG5hbWUpOwotICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiQ09NUFMgJXMgIiwgbmFtZSk7Ci0gICAgICAgICB9Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgLS1udW1PYmpzOwotICAgICAgICAgYnJlYWs7Ci0gIGNhc2UgZGVmclRpbWluZ0Rpc2FibGVDYmtUeXBlIDoKLSAgICAgICAgIHRkID0gKGRlZmlUaW1pbmdEaXNhYmxlKiljbDsKLSAgICAgICAgIGlmICh0ZC0+aGFzRnJvbVRvKCkpIGZwcmludGYoZm91dCwgIlRJTUlOR0RJU0FCTEUgRlJPTVBJTiAlcyAlcyAiLCB0ZC0+ZnJvbUluc3QoKSwgdGQtPmZyb21QaW4oKSwgdGQtPnRvSW5zdCgpLCB0ZC0+dG9QaW4oKSk7IGlmICh0ZC0+aGFzVGhydSgpKQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBUSFJVUElOICVzICVzICIsIHRkLT50aHJ1SW5zdCgpLCB0ZC0+dGhydVBpbigpKTsKLSAgICAgICAgIGlmICh0ZC0+aGFzTWFjcm9Gcm9tVG8oKSkKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgTUFDUk8gJXMgRlJPTVBJTiAlcyAlcyAiLCB0ZC0+bWFjcm9OYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICB0ZC0+ZnJvbVBpbigpLCB0ZC0+dG9QaW4oKSk7Ci0gICAgICAgICBpZiAodGQtPmhhc01hY3JvVGhydSgpKQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBNQUNSTyAlcyBUSFJVUElOICVzICVzICIsIHRkLT5tYWNyb05hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgIHRkLT5mcm9tUGluKCkpOwotICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgIGJyZWFrOwotICBjYXNlIGRlZnJQYXJ0aXRpb25DYmtUeXBlIDoKLSAgICAgICAgIHBhcnQgPSAoZGVmaVBhcnRpdGlvbiopY2w7Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICJQQVJUSVRJT04gJXMgIiwgcGFydC0+bmFtZSgpKTsKLSAgICAgICAgIGlmIChwYXJ0LT5pc1NldHVwUmlzZSgpIHwgcGFydC0+aXNTZXR1cEZhbGwoKSB8IHBhcnQtPmlzSG9sZFJpc2UoKSB8Ci0gICAgICAgICAgICAgcGFydC0+aXNIb2xkRmFsbCgpKSB7Ci0gICAgICAgICAgICAgLy8gaGFzIHR1cm5vZmYgCi0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiVFVSTk9GRiAiKTsgCi0gICAgICAgICAgICAgaWYgKHBhcnQtPmlzU2V0dXBSaXNlKCkpCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlNFVFVQUklTRSAiKTsgCi0gICAgICAgICAgICAgaWYgKHBhcnQtPmlzU2V0dXBGYWxsKCkpCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlNFVFVQRkFMTCAiKTsgCi0gICAgICAgICAgICAgaWYgKHBhcnQtPmlzSG9sZFJpc2UoKSkKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiSE9MRFJJU0UgIik7IAotICAgICAgICAgICAgIGlmIChwYXJ0LT5pc0hvbGRGYWxsKCkpCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkhPTERGQUxMICIpOyAKLSAgICAgICAgIH0KLSAgICAgICAgIGl0ZW1UID0gcGFydC0+aXRlbVR5cGUoKTsKLSAgICAgICAgIGRpciA9IHBhcnQtPmRpcmVjdGlvbigpOwotICAgICAgICAgaWYgKHN0cmNtcChpdGVtVCwgIkNMT0NLIikgPT0gMCkgewotICAgICAgICAgICAgIGlmIChkaXIgPT0gJ1QnKSAgICAvLyB0b2Nsb2NrcGluCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBUT0NMT0NLUElOICVzICVzICIsIHBhcnQtPmluc3ROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGFydC0+cGluTmFtZSgpKTsKLSAgICAgICAgICAgICBpZiAoZGlyID09ICdGJykgICAgLy8gZnJvbWNsb2NrcGluCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBGUk9NQ0xPQ0tQSU4gJXMgJXMgIiwgcGFydC0+aW5zdE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LT5waW5OYW1lKCkpOwotICAgICAgICAgICAgIGlmIChwYXJ0LT5oYXNNaW4oKSkKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTUlOICVnICVnICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tEb3VibGUocGFydC0+cGFydGl0aW9uTWluKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrRG91YmxlKHBhcnQtPnBhcnRpdGlvbk1heCgpKSk7Ci0gICAgICAgICAgICAgaWYgKHBhcnQtPmhhc01heCgpKQotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJNQVggJWcgJWcgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0RvdWJsZShwYXJ0LT5wYXJ0aXRpb25NaW4oKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tEb3VibGUocGFydC0+cGFydGl0aW9uTWF4KCkpKTsKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJQSU5TICIpOwotICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXJ0LT5udW1QaW5zKCk7IGkrKykKLSAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzICIsIHBhcnQtPnBpbihpKSk7Ci0gICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChpdGVtVCwgIklPIikgPT0gMCkgewotICAgICAgICAgICAgIGlmIChkaXIgPT0gJ1QnKSAgICAvLyB0b2lvcGluCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBUT0lPUElOICVzICVzICIsIHBhcnQtPmluc3ROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGFydC0+cGluTmFtZSgpKTsKLSAgICAgICAgICAgICBpZiAoZGlyID09ICdGJykgICAgLy8gZnJvbWlvcGluCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBGUk9NSU9QSU4gJXMgJXMgIiwgcGFydC0+aW5zdE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LT5waW5OYW1lKCkpOwotICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoaXRlbVQsICJDT01QIikgPT0gMCkgewotICAgICAgICAgICAgIGlmIChkaXIgPT0gJ1QnKSAgICAvLyB0b2NvbXBwaW4KLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIFRPQ09NUFBJTiAlcyAlcyAiLCBwYXJ0LT5pbnN0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQtPnBpbk5hbWUoKSk7Ci0gICAgICAgICAgICAgaWYgKGRpciA9PSAnRicpICAgIC8vIGZyb21jb21wcGluCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBGUk9NQ09NUFBJTiAlcyAlcyAiLCBwYXJ0LT5pbnN0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQtPnBpbk5hbWUoKSk7Ci0gICAgICAgICB9Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgLS1udW1PYmpzOwotICAgICAgICAgYnJlYWs7Ci0KLSAgY2FzZSBkZWZyUGluUHJvcENia1R5cGUgOgotICAgICAgICAgcHByb3AgPSAoZGVmaVBpblByb3AqKWNsOwotICAgICAgICAgaWYgKHBwcm9wLT5pc1BpbigpKQotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiUElOUFJPUCBQSU4gJXMgIiwgcHByb3AtPnBpbk5hbWUoKSk7Ci0gICAgICAgICBlbHNlIAotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiUElOUFJPUCAlcyAlcyAiLCBwcHJvcC0+aW5zdE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgcHByb3AtPnBpbk5hbWUoKSk7Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgaWYgKHBwcm9wLT5udW1Qcm9wcygpID4gMCkgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBwcm9wLT5udW1Qcm9wcygpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJQSU5QUk9QIFBJTiAlcyBQUk9QICVzICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgcHByb3AtPnBpbk5hbWUoKSwgcHByb3AtPnByb3BOYW1lKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgcHByb3AtPnByb3BWYWx1ZShpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICAtLW51bU9ianM7Ci0gICAgICAgICBicmVhazsKLQotICBjYXNlIGRlZnJCbG9ja2FnZUNia1R5cGUgOgotICAgICAgICAgYmxvY2sgPSAoZGVmaUJsb2NrYWdlKiljbDsKLSAgICAgICAgIGlmIChibG9jay0+aGFzTGF5ZXIoKSkgewotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiQkxPQ0tBR0UgTEFZRVIgJXMiLCBibG9jay0+bGF5ZXJOYW1lKCkpOwotICAgICAgICAgICAgaWYgKGJsb2NrLT5oYXNDb21wb25lbnQoKSkKLSAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBDT01QICVzIiwgYmxvY2stPmxheWVyQ29tcG9uZW50TmFtZSgpKTsKLSAgICAgICAgICAgIGlmIChibG9jay0+aGFzU2xvdHMoKSkKLSAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBTTE9UUyIpOwotICAgICAgICAgICAgaWYgKGJsb2NrLT5oYXNGaWxscygpKQotICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIEZJTExTIik7Ci0gICAgICAgICAgICBpZiAoYmxvY2stPmhhc1B1c2hkb3duKCkpCi0gICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgUFVTSERPV04iKTsKLSAgICAgICAgICAgIGlmIChibG9jay0+aGFzRXhjZXB0cGduZXQoKSkKLSAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBFWENFUFRQR05FVCIpOwotCSAgICBpZiAoYmxvY2stPmhhc01hc2soKSkKLQkgICAgICAgZnByaW50Zihmb3V0LCAiIE1BU0sgJWQiLCBibG9jay0+bWFzaygpKTsKLSAgICAgICAgICAgIGlmIChibG9jay0+aGFzU3BhY2luZygpKQotICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIFNQQUNJTkcgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICBibG9jay0+bWluU3BhY2luZygpKTsKLSAgICAgICAgICAgIGlmIChibG9jay0+aGFzRGVzaWduUnVsZVdpZHRoKCkpCi0gICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgREVTSUdOUlVMRVdJRFRIICVkIiwgYmxvY2stPmRlc2lnblJ1bGVXaWR0aCgpKTsKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2stPm51bVJlY3RhbmdsZXMoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJCTE9DS0FHRSBMQVlFUiAlcyBSRUNUICVkICVkICVkICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICBibG9jay0+bGF5ZXJOYW1lKCksIGJsb2NrLT54bChpKSwgYmxvY2stPnlsKGkpLAotICAgICAgICAgICAgICAgICAgICAgICBibG9jay0+eGgoaSksIGJsb2NrLT55aChpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2stPm51bVBvbHlnb25zKCk7IGkrKykgewotICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiQkxPQ0tBR0UgTEFZRVIgJXMgUE9MWUdPTiIsIGJsb2NrLT5sYXllck5hbWUoKSk7Ci0gICAgICAgICAgICAgICBwb2ludHMgPSBibG9jay0+Z2V0UG9seWdvbihpKTsKLSAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwb2ludHMubnVtUG9pbnRzOyBqKyspCi0gICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlZCAlZCAiLCBwb2ludHMueFtqXSwgcG9pbnRzLnlbal0pOwotICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UgaWYgKGJsb2NrLT5oYXNQbGFjZW1lbnQoKSkgewotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiQkxPQ0tBR0UgUExBQ0VNRU5UIik7Ci0gICAgICAgICAgICBpZiAoYmxvY2stPmhhc1NvZnQoKSkKLSAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBTT0ZUIik7Ci0gICAgICAgICAgICBpZiAoYmxvY2stPmhhc1BhcnRpYWwoKSkKLSAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBQQVJUSUFMICVnIiwgYmxvY2stPnBsYWNlbWVudE1heERlbnNpdHkoKSk7Ci0gICAgICAgICAgICBpZiAoYmxvY2stPmhhc0NvbXBvbmVudCgpKQotICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIENPTVAgJXMiLCBibG9jay0+bGF5ZXJDb21wb25lbnROYW1lKCkpOwotICAgICAgICAgICAgaWYgKGJsb2NrLT5oYXNQdXNoZG93bigpKQotICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIFBVU0hET1dOIik7Ci0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGJsb2NrLT5udW1SZWN0YW5nbGVzKCk7IGkrKykgewotICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiQkxPQ0tBR0UgUExBQ0VNRU5UIFJFQ1QgJWQgJWQgJWQgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLT54bChpKSwgYmxvY2stPnlsKGkpLAotICAgICAgICAgICAgICAgICAgICAgICBibG9jay0+eGgoaSksIGJsb2NrLT55aChpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICAtLW51bU9ianM7Ci0gICAgICAgICBicmVhazsKLQotICBjYXNlIGRlZnJTbG90Q2JrVHlwZSA6Ci0gICAgICAgICBzbG90ID0gKGRlZmlTbG90KiljbDsKLSAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzbG90LT5udW1SZWN0YW5nbGVzKCk7IGkrKykgewotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiU0xPVCBMQVlFUiAlcyIsIHNsb3QtPmxheWVyTmFtZSgpKTsKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBSRUNUICVkICVkICVkICVkXG4iLAotICAgICAgICAgICAgICAgICAgICBzbG90LT54bChpKSwgc2xvdC0+eWwoaSksCi0gICAgICAgICAgICAgICAgICAgIHNsb3QtPnhoKGkpLCBzbG90LT55aChpKSk7Ci0gICAgICAgICB9Ci0gICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2xvdC0+bnVtUG9seWdvbnMoKTsgaSsrKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJTTE9UIExBWUVSICVzIFBPTFlHT04iKTsKLSAgICAgICAgICAgIHBvaW50cyA9IHNsb3QtPmdldFBvbHlnb24oaSk7Ci0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcG9pbnRzLm51bVBvaW50czsgaisrKQotICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgJWQgJWQiLCBwb2ludHMueFtqXSwgcG9pbnRzLnlbal0pOwotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgIH0KLSAgICAgICAgIC0tbnVtT2JqczsKLSAgICAgICAgIGJyZWFrOwotCi0gIGNhc2UgZGVmckZpbGxDYmtUeXBlIDoKLSAgICAgICAgIGZpbGwgPSAoZGVmaUZpbGwqKWNsOwotICAgICAgICAgZm9yIChpID0gMDsgaSA8IGZpbGwtPm51bVJlY3RhbmdsZXMoKTsgaSsrKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJGSUxMIExBWUVSICVzIiwgZmlsbC0+bGF5ZXJOYW1lKCkpOwotCSAgICBpZiAoZmlsbC0+bGF5ZXJNYXNrKCkpIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgTUFTSyAlZCIsIGZpbGwtPmxheWVyTWFzaygpKTsKLQkgICAgfQotICAgICAgICAgICAgaWYgKGZpbGwtPmhhc0xheWVyT3BjKCkpCi0gICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgT1BDIik7Ci0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgUkVDVCAlZCAlZCAlZCAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgZmlsbC0+eGwoaSksIGZpbGwtPnlsKGkpLAotICAgICAgICAgICAgICAgICAgICBmaWxsLT54aChpKSwgZmlsbC0+eWgoaSkpOwotICAgICAgICAgfQotICAgICAgICAgZm9yIChpID0gMDsgaSA8IGZpbGwtPm51bVBvbHlnb25zKCk7IGkrKykgewotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiRklMTCBMQVlFUiAlcyBQT0xZR09OIiwgZmlsbC0+bGF5ZXJOYW1lKCkpOwotICAgICAgICAgICAgcG9pbnRzID0gZmlsbC0+Z2V0UG9seWdvbihpKTsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwb2ludHMubnVtUG9pbnRzOyBqKyspCi0gICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAlZCAlZCIsIHBvaW50cy54W2pdLCBwb2ludHMueVtqXSk7Ci0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgfQotICAgICAgICAgaWYgKGZpbGwtPmhhc1ZpYSgpKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJGSUxMIFZJQSAlcyIsIGZpbGwtPnZpYU5hbWUoKSk7Ci0JICAgIGlmIChmaWxsLT52aWFUb3BNYXNrKCkgfHwgZmlsbC0+dmlhQ3V0TWFzaygpCi0gICAgICAgICAgICAgICAgfHwgZmlsbC0+dmlhQm90dG9tTWFzaygpKSB7Ci0JICAgICAgIGZwcmludGYoZm91dCwgIiBNQVNLICVkJWQlZCIsIAotCQkgICAgICAgZmlsbC0+dmlhVG9wTWFzaygpLAotICAgICAgICAgICAgICAgICAgICAgICBmaWxsLT52aWFDdXRNYXNrKCksCi0gICAgICAgICAgICAgICAgICAgICAgIGZpbGwtPnZpYUJvdHRvbU1hc2soKSk7Ci0JICAgIH0KLSAgICAgICAgICAgIGlmIChmaWxsLT5oYXNWaWFPcGMoKSkKLSAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBPUENcbiIpOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGZpbGwtPm51bVZpYVB0cygpOyBpKyspIHsKLSAgICAgICAgICAgICAgIHBvaW50cyA9IGZpbGwtPmdldFZpYVB0cyhpKTsKLSAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwb2ludHMubnVtUG9pbnRzOyBqKyspCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAlZCAlZCIsIHBvaW50cy54W2pdLCBwb2ludHMueVtqXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgfQotICAgICAgICAgLS1udW1PYmpzOwotICAgICAgICAgYnJlYWs7Ci0KLSAgY2FzZSBkZWZyU3R5bGVzQ2JrVHlwZSA6Ci0gICAgICAgICBzdHJ1Y3QgZGVmaVBvaW50cyBwb2ludHM7Ci0gICAgICAgICBzdHlsZXMgPSAoZGVmaVN0eWxlcyopY2w7Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICJTVFlMRSAlZCIsIHN0eWxlcy0+c3R5bGUoKSk7Ci0gICAgICAgICBwb2ludHMgPSBzdHlsZXMtPmdldFBvbHlnb24oKTsKLSAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwb2ludHMubnVtUG9pbnRzOyBqKyspCi0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgJWQgJWQiLCBwb2ludHMueFtqXSwgcG9pbnRzLnlbal0pOwotICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgIC0tbnVtT2JqczsKLSAgICAgICAgIGJyZWFrOwotCi0gIGRlZmF1bHQ6IGZwcmludGYoZm91dCwgIkJPR1VTIGNhbGxiYWNrIHRvIGNscy5cbiIpOyByZXR1cm4gMTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotCi1pbnQgZG4oZGVmckNhbGxiYWNrVHlwZV9lIGMsIGNvbnN0IGNoYXIqIGgsIGRlZmlVc2VyRGF0YSB1ZCkgewotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGZwcmludGYoZm91dCwgIkRJVklERVJDSEFSIFwiJXNcIiBcbiIsaCk7Ci0gIHJldHVybiAwOwotfQotCi0KLWludCBleHQoZGVmckNhbGxiYWNrVHlwZV9lIHQsIGNvbnN0IGNoYXIqIGMsIGRlZmlVc2VyRGF0YSB1ZCkgewotICBjaGFyKiBuYW1lOwotCi0gIGNoZWNrVHlwZSh0KTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLQotICBzd2l0Y2ggKHQpIHsKLSAgY2FzZSBkZWZyTmV0RXh0Q2JrVHlwZSA6IG5hbWUgPSBhZGRyZXNzKCJuZXQiKTsgYnJlYWs7Ci0gIGNhc2UgZGVmckNvbXBvbmVudEV4dENia1R5cGUgOiBuYW1lID0gYWRkcmVzcygiY29tcG9uZW50Iik7IGJyZWFrOwotICBjYXNlIGRlZnJQaW5FeHRDYmtUeXBlIDogbmFtZSA9IGFkZHJlc3MoInBpbiIpOyBicmVhazsKLSAgY2FzZSBkZWZyVmlhRXh0Q2JrVHlwZSA6IG5hbWUgPSBhZGRyZXNzKCJ2aWEiKTsgYnJlYWs7Ci0gIGNhc2UgZGVmck5ldENvbm5lY3Rpb25FeHRDYmtUeXBlIDogbmFtZSA9IGFkZHJlc3MoIm5ldCBjb25uZWN0aW9uIik7IGJyZWFrOwotICBjYXNlIGRlZnJHcm91cEV4dENia1R5cGUgOiBuYW1lID0gYWRkcmVzcygiZ3JvdXAiKTsgYnJlYWs7Ci0gIGNhc2UgZGVmclNjYW5DaGFpbkV4dENia1R5cGUgOiBuYW1lID0gYWRkcmVzcygic2NhbmNoYWluIik7IGJyZWFrOwotICBjYXNlIGRlZnJJb1RpbWluZ3NFeHRDYmtUeXBlIDogbmFtZSA9IGFkZHJlc3MoImlvIHRpbWluZyIpOyBicmVhazsKLSAgY2FzZSBkZWZyUGFydGl0aW9uc0V4dENia1R5cGUgOiBuYW1lID0gYWRkcmVzcygicGFydGl0aW9uIik7IGJyZWFrOwotICBkZWZhdWx0OiBuYW1lID0gYWRkcmVzcygiQk9HVVMiKTsgcmV0dXJuIDE7Ci0gIH0KLSAgZnByaW50Zihmb3V0LCAiRVhURU5TSU9OICVzICVzXG4iLCBuYW1lLCBjKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8vPT09PT09PT0KLQotaW50IGRpZmZEZWZSZWFkRmlsZShjaGFyKiBpbkZpbGUsIGNoYXIqIG91dEZpbGUsIGNoYXIqIGlnbm9yZVBpbkV4dHJhLAotICAgICAgICAgICAgICAgICBjaGFyKiBpZ25vcmVSb3dOYW1lLCBjaGFyKiBpZ25vcmVWaWFOYW1lLCBjaGFyKiBuZXRTZWdDb21wKSB7Ci0gIEZJTEUqIGY7Ci0gIGludCAgIHJlczsKLQotICB1c2VyRGF0YSA9ICh2b2lkKikweDAxMDIwMzA0OwotICBkZWZySW5pdCgpOwotCi0gIGRlZnJTZXREZXNpZ25DYmsoZG5hbWUpOwotICBkZWZyU2V0VGVjaG5vbG9neUNiayh0bmFtZSk7Ci0gIGRlZnJTZXRQcm9wQ2JrKHByb3ApOwotICBkZWZyU2V0TmV0Q2JrKG5ldGYpOwotICBkZWZyU2V0U05ldENiayhzbmV0Zik7Ci0gIGRlZnJTZXRDb21wb25lbnRNYXNrU2hpZnRMYXllckNiayhjb21wTVNMKTsKLSAgZGVmclNldENvbXBvbmVudENiayhjb21wZik7Ci0gIGRlZnJTZXRBZGRQYXRoVG9OZXQoKTsKLSAgZGVmclNldEhpc3RvcnlDYmsoaGlzdCk7Ci0gIGRlZnJTZXRDb25zdHJhaW50Q2JrKGNvbnN0cmFpbnQpOwotICBkZWZyU2V0QXNzZXJ0aW9uQ2JrKGNvbnN0cmFpbnQpOwotICBkZWZyU2V0RGl2aWRlckNiayhkbik7Ci0gIGRlZnJTZXRCdXNCaXRDYmsoYmJuKTsKLSAgZGVmclNldE5vbkRlZmF1bHRDYmsobmRyKTsKLQotICAvLyBBbGwgb2YgdGhlIGV4dGVuc2lvbnMgcG9pbnQgdG8gdGhlIHNhbWUgZnVuY3Rpb24uCi0gIGRlZnJTZXROZXRFeHRDYmsoZXh0KTsKLSAgZGVmclNldENvbXBvbmVudEV4dENiayhleHQpOwotICBkZWZyU2V0UGluRXh0Q2JrKGV4dCk7Ci0gIGRlZnJTZXRWaWFFeHRDYmsoZXh0KTsKLSAgZGVmclNldE5ldENvbm5lY3Rpb25FeHRDYmsoZXh0KTsKLSAgZGVmclNldEdyb3VwRXh0Q2JrKGV4dCk7Ci0gIGRlZnJTZXRTY2FuQ2hhaW5FeHRDYmsoZXh0KTsKLSAgZGVmclNldElvVGltaW5nc0V4dENiayhleHQpOwotICBkZWZyU2V0UGFydGl0aW9uc0V4dENiayhleHQpOwotCi0gIGRlZnJTZXRVbml0c0Niayh1bml0cyk7Ci0gIGRlZnJTZXRWZXJzaW9uQ2JrKHZlcnMpOwotICBkZWZyU2V0Q2FzZVNlbnNpdGl2ZUNiayhjYXNlc2Vucyk7Ci0KLSAgLy8gVGhlIGZvbGxvd2luZyBjYWxscyBhcmUgYW4gZXhhbXBsZSBvZiB1c2luZyBvbmUgZnVuY3Rpb24gImNscyIKLSAgLy8gdG8gYmUgdGhlIGNhbGxiYWNrIGZvciBtYW55IERJRkZFUkVOVCB0eXBlcyBvZiBjb25zdHJ1Y3RzLgotICAvLyBXZSBoYXZlIHRvIGNhc3QgdGhlIGZ1bmN0aW9uIHR5cGUgdG8gbWVldCB0aGUgcmVxdWlyZW1lbnRzCi0gIC8vIG9mIGVhY2ggZGlmZmVyZW50IHNldCBmdW5jdGlvbi4KLSAgZGVmclNldFNpdGVDYmsoKGRlZnJTaXRlQ2JrRm5UeXBlKWNscyk7Ci0gIGRlZnJTZXRDYW5wbGFjZUNiaygoZGVmclNpdGVDYmtGblR5cGUpY2xzKTsKLSAgZGVmclNldENhbm5vdE9jY3VweUNiaygoZGVmclNpdGVDYmtGblR5cGUpY2xzKTsKLSAgZGVmclNldERpZUFyZWFDYmsoKGRlZnJCb3hDYmtGblR5cGUpY2xzKTsKLSAgZGVmclNldFBpbkNhcENiaygoZGVmclBpbkNhcENia0ZuVHlwZSljbHMpOwotICBkZWZyU2V0UGluQ2JrKChkZWZyUGluQ2JrRm5UeXBlKWNscyk7Ci0gIGRlZnJTZXRQaW5Qcm9wQ2JrKChkZWZyUGluUHJvcENia0ZuVHlwZSljbHMpOwotICBkZWZyU2V0RGVmYXVsdENhcENiaygoZGVmckludGVnZXJDYmtGblR5cGUpY2xzKTsKLSAgZGVmclNldFJvd0NiaygoZGVmclJvd0Nia0ZuVHlwZSljbHMpOwotICBkZWZyU2V0VHJhY2tDYmsoKGRlZnJUcmFja0Nia0ZuVHlwZSljbHMpOwotICBkZWZyU2V0R2NlbGxHcmlkQ2JrKChkZWZyR2NlbGxHcmlkQ2JrRm5UeXBlKWNscyk7Ci0gIGRlZnJTZXRWaWFDYmsoKGRlZnJWaWFDYmtGblR5cGUpY2xzKTsKLSAgZGVmclNldFJlZ2lvbkNiaygoZGVmclJlZ2lvbkNia0ZuVHlwZSljbHMpOwotICBkZWZyU2V0R3JvdXBDYmsoKGRlZnJHcm91cENia0ZuVHlwZSljbHMpOwotICBkZWZyU2V0U2NhbmNoYWluQ2JrKChkZWZyU2NhbmNoYWluQ2JrRm5UeXBlKWNscyk7Ci0gIGRlZnJTZXRJT1RpbWluZ0NiaygoZGVmcklPVGltaW5nQ2JrRm5UeXBlKWNscyk7Ci0gIGRlZnJTZXRGUENDYmsoKGRlZnJGUENDYmtGblR5cGUpY2xzKTsKLSAgZGVmclNldFRpbWluZ0Rpc2FibGVDYmsoKGRlZnJUaW1pbmdEaXNhYmxlQ2JrRm5UeXBlKWNscyk7Ci0gIGRlZnJTZXRQYXJ0aXRpb25DYmsoKGRlZnJQYXJ0aXRpb25DYmtGblR5cGUpY2xzKTsKLSAgZGVmclNldEJsb2NrYWdlQ2JrKChkZWZyQmxvY2thZ2VDYmtGblR5cGUpY2xzKTsKLSAgZGVmclNldFNsb3RDYmsoKGRlZnJTbG90Q2JrRm5UeXBlKWNscyk7Ci0gIGRlZnJTZXRGaWxsQ2JrKChkZWZyRmlsbENia0ZuVHlwZSljbHMpOwotCi0gIGlmIChzdHJjbXAoaWdub3JlUGluRXh0cmEsICIwIikgIT0gMCkKLSAgICAgaWdub3JlUEUgPSAxOwotCi0gIGlmIChzdHJjbXAoaWdub3JlUm93TmFtZSwgIjAiKSAhPSAwKQotICAgICBpZ25vcmVSTiA9IDE7Ci0KLSAgaWYgKHN0cmNtcChpZ25vcmVWaWFOYW1lLCAiMCIpICE9IDApCi0gICAgIGlnbm9yZVZOID0gMTsKLQotICBpZiAoc3RyY21wKG5ldFNlZ0NvbXAsICIwIikgIT0gMCkKLSAgICAgbmV0U2VDbXAgPSAxOwotCi0gIGlmICgoZiA9IGZvcGVuKGluRmlsZSwiciIpKSA9PSAwKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsIkNvdWxkbid0IG9wZW4gaW5wdXQgZmlsZSAnJXMnXG4iLCBpbkZpbGUpOwotICAgIHJldHVybigyKTsKLSAgfQotIAotICBpZiAoKGZvdXQgPSBmb3BlbihvdXRGaWxlLCAidyIpKSA9PSAwKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBvcGVuIG91dHB1dCBmaWxlICclcydcbiIsIG91dEZpbGUpOwotICAgIGZjbG9zZShmKTsKLSAgICByZXR1cm4oMik7Ci0gIH0KLQotICByZXMgPSBkZWZyUmVhZChmLCBpbkZpbGUsIHVzZXJEYXRhLCAxKTsKLQotICBmY2xvc2UoZik7Ci0gIGZjbG9zZShmb3V0KTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWZkaWZmL2RpZmZEZWZSVy5ocHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmZGlmZi9kaWZmRGVmUlcuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjMwNWVkLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWZkaWZmL2RpZmZEZWZSVy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3IkCi0vLyAgJFJldmlzaW9uJAotLy8gICREYXRlJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaWZuZGVmIERJRkZERUZSV19ICi0jZGVmaW5lIERJRkZERUZSV19ICi0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi1pbnQgZGlmZkRlZlJlYWRGaWxlKGNoYXIqIGluRmlsZSwgY2hhciogb3V0RmlsZSwgY2hhciogaWdub3JlUGluRXh0cmEsCi0gICAgICAgICAgICAgICAgICAgIGNoYXIqIGlnbm9yZVJvd05hbWUsIGNoYXIqIGlnbm9yZVZpYU5hbWUsIGNoYXIqIG5ldFNlZ0NvbXApOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWZkaWZmL2RpZmZlckRlZi5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmZGlmZi9kaWZmZXJEZWYuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWQ5YzEzLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWZkaWZmL2RpZmZlckRlZi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyIC0gMjAxNiwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yJAotLy8gICRSZXZpc2lvbiQKLS8vICAkRGF0ZSQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAKLSAKLS8vIFRoaXMgcHJvZ3JhbSB3aWxsIGRpZmYgdHdvIGxlZiBmaWxlcyBvciB0d28gZGVmIGZpbGVzIGFuZCBsaXN0IHRoZQotLy8gZGlmZmVyZW50IGJldHdlZW4gdGhlIHR3byBmaWxlcy4gIFRoaXMgcHJvYmxlbSBpcyBub3QgaW50ZW5kIHRvCi0vLyBkaWZmIGEgcmVhbCBkZXNpZ24uICBJZiB1c2VyIHJ1bnMgdGhpcyBwcm9ncmFtIHdpbGwgYSBiaWcgZGVzaWduLAotLy8gdGhleSBtYXkgZXhwZXJpZW5jZSBsb25nIGV4ZWN1dGlvbiB0aW1lIGFuZCBtYXkgZXZlbiByYW4gb3V0IG9mCi0vLyBtZW1vcnkuCi0vLwotLy8gVGhpcyBwcm9ncmFtIGlzIHRvIGdpdmUgdXNlciBhIGZlZWwgb2Ygd2hldGhlciB0aGV5IGFyZSB1c2luZyB0aGUKLS8vIHBhcnNlciBjb3JyZWN0bHkuICBBZnRlciB0aGV5IHJlYWQgdGhlIGxlZi9kZWYgZmlsZSBpbiwgYW5kCi0vLyB3cml0ZSB0aGVtIGJhY2sgb3V0IGluIGxlZi9kZWYgZm9ybWF0LgotLy8KLS8vIFRoaXMgcHJvZ3JhbSBzdXBwb3J0IGxlZi9kZWYgNS42LgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpZmRlZiBpYm1ycwotIyAgIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2lmbmRlZiBXSU4zMgotIyAgIGluY2x1ZGUgPHVuaXN0ZC5oPgotZXh0ZXJuIGNoYXIgVmVyc2lvbklkZW50W107Ci0jZWxzZQotY2hhciogVmVyc2lvbklkZW50ID0gIk4vQSI7Ci0jZW5kaWYgLyogbm90IFdJTjMyICovCi0jaW5jbHVkZSAiZGVmclJlYWRlci5ocHAiCi0jaW5jbHVkZSAiZGlmZkRlZlJXLmhwcCIKLQotY2hhciAqIGV4ZU5hbWU7ICAgLy8gdXNlIHRvIHNhdmUgdGhlIGV4ZWN1dGFibGUgbmFtZQotCi0vLyBUaGlzIHByb2dyYW0gcmVxdWlyZXMgMyBpbnB1dCwgdGhlIHR5cGUgb2YgdGhlIGZpbGUsIGxlZiBvciBkZWYKLS8vIGZpbGVOYW1lMSBhbmQgZmlsZU5hbWUyCi12b2lkIGRpZmZVc2FnZSgpIHsKLSAgIHByaW50ZigiVXNhZ2U6IGxlZmRlZmRpZmYgLWxlZnwtZGVmIGZpbGVOYW1lMSBmaWxlTmFtZTIgWy1vIG91dHB1dEZpbGVOYW1lXVxuIik7Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICBjaGFyICpmaWxlTmFtZTEsICpmaWxlTmFtZTI7ICAgLy8gRm9yIHRoZSBmaWxlbmFtZXMgdG8gY29tcGFyZQotICBjaGFyICpkZWZPdXQxLCAqZGVmT3V0MjsgICAgICAgLy8gRm9yIHRoZSB0bXAgb3V0cHV0IGZpbGVzCi0gIAotI2lmZGVmIFdJTjMyCi0gICAgLy8gRW5hYmxlIHR3by1kaWdpdCBleHBvbmVudCBmb3JtYXQKLSAgICBfc2V0X291dHB1dF9mb3JtYXQoX1RXT19ESUdJVF9FWFBPTkVOVCk7Ci0jZW5kaWYKLQotICBleGVOYW1lID0gYXJndlswXTsKLQotICBpZiAoYXJnYyAhPSA5KSB7ICAgICAgICAgICAgICAgLy8gSWYgcGFzcyBpbiBmcm9tIGxlZmRlZmRpZmYsIGFyZ2MgaXMKLSAgICAgIGRpZmZVc2FnZSgpOyAgICAgICAgICAgICAgIC8vIGFsd2F5cyA5OiBkZWZkaWZmIGZpbGUxIGZpbGUyIG91dDEgb3V0MgotICAgICAgcmV0dXJuKDEpOyAgICAgICAgICAgICAgICAgLy8gaWdub3JlUGluRXh0cmEgaWdub3JlUm93TmFtZSBpZ25vcmVWaWFOYW1lCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdTZWdDbXAKLQotICBmaWxlTmFtZTEgPSBhcmd2WzFdOwotICBmaWxlTmFtZTIgPSBhcmd2WzJdOwotCi0gIC8vIFRlbXBvcmFyeSBvdXRwdXQgZmlsZXMsIHRvIHdob2xlIHRoZSBkZWYgZmlsZSBpbmZvcm1hdGlvbiBhcwotICAvLyB0aGV5IGFyZSByZWFkIGluLiAgTGF0ZXIgdGhlc2UgZmlsZXMgd2lsbCBiZSBzb3J0ZWQgZm9yIGNvbXBhcmUKLSAgZGVmT3V0MSA9IGFyZ3ZbM107Ci0gIGRlZk91dDIgPSBhcmd2WzRdOwotCi0gIC8vIGRlZiBmaWxlcwotICBwcmludGYoIlJlYWRpbmcgZmlsZTogJXNcbiIsIGZpbGVOYW1lMSk7Ci0gIGlmIChkaWZmRGVmUmVhZEZpbGUoZmlsZU5hbWUxLCBkZWZPdXQxLCBhcmd2WzVdLCBhcmd2WzZdLCBhcmd2WzddLCBhcmd2WzhdKSAhPSAwKQotICAgICAgcmV0dXJuKDEpOwotICBwcmludGYoIlJlYWRpbmcgZmlsZTogJXNcbiIsIGZpbGVOYW1lMik7Ci0gIGlmIChkaWZmRGVmUmVhZEZpbGUoZmlsZU5hbWUyLCBkZWZPdXQyLCBhcmd2WzVdLCBhcmd2WzZdLCBhcmd2WzddLCBhcmd2WzhdKSAhPSAwKQotICAgICAgcmV0dXJuKDEpOyAKLQotICByZXR1cm4gKDApOwotfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZnJ3L2RlZnJ3LmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWZydy9kZWZydy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMDg3NDkuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZnJ3L2RlZnJ3LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMzOTUgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiAtIDIwMTcsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvciQKLS8vICAkUmV2aXNpb24kCi0vLyAgJERhdGUkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpZm5kZWYgV0lOMzIKLSMgICBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZiAvKiBub3QgV0lOMzIgKi8KLSNpbmNsdWRlICJkZWZyUmVhZGVyLmhwcCIKLSNpbmNsdWRlICJkZWZpQWxpYXMuaHBwIgotCi1jaGFyIGRlZmF1bHROYW1lWzY0XTsKLWNoYXIgZGVmYXVsdE91dFs2NF07Ci0KLS8vIEdsb2JhbCB2YXJpYWJsZXMKLUZJTEUqIGZvdXQ7Ci12b2lkKiB1c2VyRGF0YTsKLWludCBudW1PYmpzOwotaW50IGlzU3VtU2V0OyAgICAgIC8vIHRvIGtlZXAgdHJhY2sgaWYgd2l0aGluIFNVTQotaW50IGlzUHJvcCA9IDA7ICAgIC8vIGZvciBQUk9QRVJUWURFRklOSVRJT05TCi1pbnQgYmVnT3BlcmFuZDsgICAgLy8gdG8ga2VlcCB0cmFjayBmb3IgY29uc3RyYWludCwgdG8gcHJpbnQgLSBhcyB0aGUgMXN0IGNoYXIKLXN0YXRpYyBkb3VibGUgY3VyVmVyID0gMDsKLXN0YXRpYyBpbnQgc2V0U05ldFdpcmVDYmsgPSAwOwotc3RhdGljIGludCBpc1Nlc3Npb25sZXNzID0gMDsKLXN0YXRpYyBpbnQgaWdub3JlUm93TmFtZXMgPSAwOwotc3RhdGljIGludCBpZ25vcmVWaWFOYW1lcyA9IDA7Ci1zdGF0aWMgaW50IHRlc3REZWJ1Z1ByaW50ID0gMDsgIC8vIHRlc3QgZm9yIGNjcjE0ODg2OTYKLQotLy8gVFhfRElSOlRSQU5TTEFUSU9OIE9OCi0KLXZvaWQgbXlMb2dGdW5jdGlvbihjb25zdCBjaGFyKiBlcnJNc2cpewotICAgZnByaW50Zihmb3V0LCAiRVJST1I6IGZvdW5kIGVycm9yOiAlc1xuIiwgZXJyTXNnKTsKLX0KLQotdm9pZCBteVdhcm5pbmdMb2dGdW5jdGlvbihjb25zdCBjaGFyKiBlcnJNc2cpewotICAgZnByaW50Zihmb3V0LCAiV0FSTklORzogZm91bmQgZXJyb3I6ICVzXG4iLCBlcnJNc2cpOwotfQotCi12b2lkIGRhdGFFcnJvcigpIHsKLSAgZnByaW50Zihmb3V0LCAiRVJST1I6IHJldHVybmVkIHVzZXIgZGF0YSBpcyBub3QgY29ycmVjdCFcbiIpOwotfQotCi12b2lkIGNoZWNrVHlwZShkZWZyQ2FsbGJhY2tUeXBlX2UgYykgewotICBpZiAoYyA+PSAwICYmIGMgPD0gZGVmckRlc2lnbkVuZENia1R5cGUpIHsKLSAgICAvLyBPSwotICB9IGVsc2UgewotICAgIGZwcmludGYoZm91dCwgIkVSUk9SOiBjYWxsYmFjayB0eXBlIGlzIG91dCBvZiBib3VuZHMhXG4iKTsKLSAgfQotfQotCi0KLWludCBkb25lKGRlZnJDYWxsYmFja1R5cGVfZSBjLCB2b2lkKiwgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgZnByaW50Zihmb3V0LCAiRU5EIERFU0lHTlxuIik7Ci0gIHJldHVybiAwOwotfQotCi1pbnQgZW5kZnVuYyhkZWZyQ2FsbGJhY2tUeXBlX2UgYywgdm9pZCosIGRlZmlVc2VyRGF0YSB1ZCkgewotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIHJldHVybiAwOwotfQotCi0KLWNoYXIqIG9yaWVudFN0cihpbnQgb3JpZW50KSB7Ci0gIHN3aXRjaCAob3JpZW50KSB7Ci0gICAgICBjYXNlIDA6IHJldHVybiAoKGNoYXIqKSJOIik7Ci0gICAgICBjYXNlIDE6IHJldHVybiAoKGNoYXIqKSJXIik7Ci0gICAgICBjYXNlIDI6IHJldHVybiAoKGNoYXIqKSJTIik7Ci0gICAgICBjYXNlIDM6IHJldHVybiAoKGNoYXIqKSJFIik7Ci0gICAgICBjYXNlIDQ6IHJldHVybiAoKGNoYXIqKSJGTiIpOwotICAgICAgY2FzZSA1OiByZXR1cm4gKChjaGFyKikiRlciKTsKLSAgICAgIGNhc2UgNjogcmV0dXJuICgoY2hhciopIkZTIik7Ci0gICAgICBjYXNlIDc6IHJldHVybiAoKGNoYXIqKSJGRSIpOwotICB9OwotICByZXR1cm4gKChjaGFyKikiQk9HVVMiKTsKLX0KLQotaW50IGNvbXBNU0woZGVmckNhbGxiYWNrVHlwZV9lIGMsIGRlZmlDb21wb25lbnRNYXNrU2hpZnRMYXllciogY28sIGRlZmlVc2VyRGF0YSB1ZCkgewotICBpbnQgaTsKLQotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0KLSAgICBpZiAoY28tPm51bU1hc2tTaGlmdExheWVycygpKSB7Ci0JZnByaW50Zihmb3V0LCAiXG5DT01QT05FTlRNQVNLU0hJRlQgIik7Ci0JCi0JZm9yIChpID0gMDsgaSA8IGNvLT5udW1NYXNrU2hpZnRMYXllcnMoKTsgaSsrKSB7Ci0gICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzICIsIGNvLT5tYXNrU2hpZnRMYXllcihpKSk7Ci0JfQotCWZwcmludGYoZm91dCwgIjtcbiIpOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotaW50IGNvbXBmKGRlZnJDYWxsYmFja1R5cGVfZSBjLCBkZWZpQ29tcG9uZW50KiBjbywgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGlmICh0ZXN0RGVidWdQcmludCkgewotICAgICAgY28tPnByaW50KGZvdXQpOwotICB9IGVsc2UgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGNoZWNrVHlwZShjKTsKLSAgICAgIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gICAgLy8gIG1pc3NpbmcgR0VORVJBVEUsIEZPUkVJR04KLSAgICAgICAgZnByaW50Zihmb3V0LCAiLSAlcyAlcyAiLCBjby0+aWQoKSwKLSAgICAgICAgICAgICAgICBjby0+bmFtZSgpKTsKLSAgICAvLyAgICBjby0+Y2hhbmdlSWRBbmROYW1lKCJpZE5hbWUiLCAibW9kZWxOYW1lIik7Ci0gICAgLy8gICAgZnByaW50Zihmb3V0LCAiJXMgJXMgIiwgY28tPmlkKCksCi0gICAgLy8gICAgICAgICAgICBjby0+bmFtZSgpKTsKLSAgICAgICAgaWYgKGNvLT5oYXNOZXRzKCkpIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjby0+bnVtTmV0cygpOyBpKyspCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzICIsIGNvLT5uZXQoaSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjby0+aXNGaXhlZCgpKSAKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgRklYRUQgJWQgJWQgJXMgIiwKLSAgICAgICAgICAgICAgICAgICAgY28tPnBsYWNlbWVudFgoKSwKLSAgICAgICAgICAgICAgICAgICAgY28tPnBsYWNlbWVudFkoKSwKLSAgICAgICAgICAgICAgICAgICAgLy9vcmllbnRTdHIoY28tPnBsYWNlbWVudE9yaWVudCgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvLT5wbGFjZW1lbnRPcmllbnRTdHIoKSk7Ci0gICAgICAgIGlmIChjby0+aXNDb3ZlcigpKSAKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgQ09WRVIgJWQgJWQgJXMgIiwKLSAgICAgICAgICAgICAgICAgICAgY28tPnBsYWNlbWVudFgoKSwKLSAgICAgICAgICAgICAgICAgICAgY28tPnBsYWNlbWVudFkoKSwKLSAgICAgICAgICAgICAgICAgICAgb3JpZW50U3RyKGNvLT5wbGFjZW1lbnRPcmllbnQoKSkpOwotICAgICAgICBpZiAoY28tPmlzUGxhY2VkKCkpIAotICAgICAgICAgICAgZnByaW50Zihmb3V0LCIrIFBMQUNFRCAlZCAlZCAlcyAiLAotICAgICAgICAgICAgICAgICAgICBjby0+cGxhY2VtZW50WCgpLAotICAgICAgICAgICAgICAgICAgICBjby0+cGxhY2VtZW50WSgpLAotICAgICAgICAgICAgICAgICAgICBvcmllbnRTdHIoY28tPnBsYWNlbWVudE9yaWVudCgpKSk7Ci0gICAgICAgIGlmIChjby0+aXNVbnBsYWNlZCgpKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsIisgVU5QTEFDRUQgIik7Ci0gICAgICAgICAgICBpZiAoKGNvLT5wbGFjZW1lbnRYKCkgIT0gLTEpIHx8Ci0gICAgICAgICAgICAgICAgKGNvLT5wbGFjZW1lbnRZKCkgIT0gLTEpKQotICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCIlZCAlZCAlcyAiLAotICAgICAgICAgICAgICAgICAgICAgICBjby0+cGxhY2VtZW50WCgpLAotICAgICAgICAgICAgICAgICAgICAgICBjby0+cGxhY2VtZW50WSgpLAotICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRTdHIoY28tPnBsYWNlbWVudE9yaWVudCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvLT5oYXNTb3VyY2UoKSkKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgU09VUkNFICVzICIsIGNvLT5zb3VyY2UoKSk7Ci0gICAgICAgIGlmIChjby0+aGFzR2VuZXJhdGUoKSkgewotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBHRU5FUkFURSAlcyAiLCBjby0+Z2VuZXJhdGVOYW1lKCkpOwotICAgICAgICAgICAgaWYgKGNvLT5tYWNyb05hbWUoKSAmJgotICAgICAgICAgICAgICAgICooY28tPm1hY3JvTmFtZSgpKSkKLSAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzICIsIGNvLT5tYWNyb05hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvLT5oYXNXZWlnaHQoKSkKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgV0VJR0hUICVkICIsIGNvLT53ZWlnaHQoKSk7Ci0gICAgICAgIGlmIChjby0+aGFzRUVRKCkpCi0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIEVFUU1BU1RFUiAlcyAiLCBjby0+RUVRKCkpOwotICAgICAgICBpZiAoY28tPmhhc1JlZ2lvbk5hbWUoKSkKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgUkVHSU9OICVzICIsIGNvLT5yZWdpb25OYW1lKCkpOwotICAgICAgICBpZiAoY28tPmhhc1JlZ2lvbkJvdW5kcygpKSB7Ci0gICAgICAgICAgICBpbnQgKnhsLCAqeWwsICp4aCwgKnloOwotICAgICAgICAgICAgaW50IHNpemU7Ci0gICAgICAgICAgICBjby0+cmVnaW9uQm91bmRzKCZzaXplLCAmeGwsICZ5bCwgJnhoLCAmeWgpOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeyAKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIFJFR0lPTiAlZCAlZCAlZCAlZCBcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICB4bFtpXSwgeWxbaV0sIHhoW2ldLCB5aFtpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvLT5tYXNrU2hpZnRTaXplKCkpIHsKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgTUFTS1NISUZUICIpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gY28tPm1hc2tTaGlmdFNpemUoKS0xOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVkIiwgY28tPm1hc2tTaGlmdChpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjby0+aGFzSGFsbygpKSB7Ci0gICAgICAgICAgICBpbnQgbGVmdCwgYm90dG9tLCByaWdodCwgdG9wOwotICAgICAgICAgICAgKHZvaWQpIGNvLT5oYWxvRWRnZXMoJmxlZnQsICZib3R0b20sICZyaWdodCwgJnRvcCk7Ci0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIEhBTE8gIik7Ci0gICAgICAgICAgICBpZiAoY28tPmhhc0hhbG9Tb2Z0KCkpCi0gICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJTT0ZUICIpOwotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJWQgJWQgJWQgJWRcbiIsIGxlZnQsIGJvdHRvbSwgcmlnaHQsIHRvcCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvLT5oYXNSb3V0ZUhhbG8oKSkgewotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBST1VURUhBTE8gJWQgJXMgJXNcbiIsIGNvLT5oYWxvRGlzdCgpLAotICAgICAgICAgICAgICAgICAgICBjby0+bWluTGF5ZXIoKSwgY28tPm1heExheWVyKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjby0+aGFzRm9yZWlnbk5hbWUoKSkgewotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBGT1JFSUdOICVzICVkICVkICVzICVkICIsCi0gICAgICAgICAgICAgICAgICAgIGNvLT5mb3JlaWduTmFtZSgpLCBjby0+Zm9yZWlnblgoKSwKLSAgICAgICAgICAgICAgICAgICAgY28tPmZvcmVpZ25ZKCksIGNvLT5mb3JlaWduT3JpKCksCi0gICAgICAgICAgICAgICAgICAgIGNvLT5mb3JlaWduT3JpZW50KCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjby0+bnVtUHJvcHMoKSkgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvLT5udW1Qcm9wcygpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIFBST1BFUlRZICVzICVzICIsIGNvLT5wcm9wTmFtZShpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvLT5wcm9wVmFsdWUoaSkpOwotICAgICAgICAgICAgICAgIHN3aXRjaCAoY28tPnByb3BUeXBlKGkpKSB7Ci0gICAgICAgICAgICAgICAgICAgY2FzZSAnUic6IGZwcmludGYoZm91dCwgIlJFQUwgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgIGNhc2UgJ0knOiBmcHJpbnRmKGZvdXQsICJJTlRFR0VSICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICBjYXNlICdTJzogZnByaW50Zihmb3V0LCAiU1RSSU5HICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICBjYXNlICdRJzogZnByaW50Zihmb3V0LCAiUVVPVEVTVFJJTkcgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgIGNhc2UgJ04nOiBmcHJpbnRmKGZvdXQsICJOVU1CRVIgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmcHJpbnRmKGZvdXQsICI7XG4iKTsKLSAgICAgICAgLS1udW1PYmpzOwotICAgICAgICBpZiAobnVtT2JqcyA8PSAwKQotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiRU5EIENPTVBPTkVOVFNcbiIpOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi0KLWludCBuZXRwYXRoKGRlZnJDYWxsYmFja1R5cGVfZSwgZGVmaU5ldCosIGRlZmlVc2VyRGF0YSkgewotICBmcHJpbnRmKGZvdXQsICJcbiIpOwotCi0gIGZwcmludGYgKGZvdXQsICJDYWxsYmFjayBvZiBwYXJ0aWFsIHBhdGggZm9yIG5ldFxuIik7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotaW50IG5ldE5hbWVmKGRlZnJDYWxsYmFja1R5cGVfZSBjLCBjb25zdCBjaGFyKiBuZXROYW1lLCBkZWZpVXNlckRhdGEgdWQpIHsKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICAgIGZwcmludGYoZm91dCwgIi0gJXMgIiwgbmV0TmFtZSk7Ci0gIHJldHVybiAwOwotfQotCi1pbnQgc3VibmV0TmFtZWYoZGVmckNhbGxiYWNrVHlwZV9lIGMsIGNvbnN0IGNoYXIqIHN1Ym5ldE5hbWUsIGRlZmlVc2VyRGF0YSB1ZCkgewotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gICAgaWYgKGN1clZlciA+PSA1LjYpCi0gICAgICBmcHJpbnRmKGZvdXQsICIgICArIFNVQk5FVCBDQksgJXMgIiwgc3VibmV0TmFtZSk7Ci0gIHJldHVybiAwOwotfQotCi1pbnQgbm9uZGVmUnVsZWYoZGVmckNhbGxiYWNrVHlwZV9lIGMsIGNvbnN0IGNoYXIqIHJ1bGVOYW1lLCBkZWZpVXNlckRhdGEgdWQpIHsKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICAgIGlmIChjdXJWZXIgPj0gNS42KQotICAgICAgZnByaW50Zihmb3V0LCAiICAgKyBOT05ERUZBVUxUUlVMRSBDQksgJXMgIiwgcnVsZU5hbWUpOwotICByZXR1cm4gMDsKLX0KLQotaW50IG5ldGYoZGVmckNhbGxiYWNrVHlwZV9lIGMsIGRlZmlOZXQqIG5ldCwgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIC8vIEZvciBuZXQgYW5kIHNwZWNpYWwgbmV0LgotICBpbnQgICAgICAgIGksIGosIGssIHcsIHgsIHksIHosIGNvdW50LCBuZXdMYXllcjsKLSAgZGVmaVBhdGgqICBwOwotICBkZWZpU3VibmV0ICpzOwotICBpbnQgICAgICAgIHBhdGg7Ci0gIGRlZmlWcGluICAgKnZwaW47Ci0gIC8vIGRlZmlTaGllbGQgKm5vU2hpZWxkOwotICBkZWZpV2lyZSAgICp3aXJlOwotCi0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgaWYgKGMgIT0gZGVmck5ldENia1R5cGUpCi0gICAgICBmcHJpbnRmKGZvdXQsICJCT0dVUyBORVQgVFlQRSAgIik7Ci0gIGlmIChuZXQtPnBpbklzTXVzdEpvaW4oMCkpCi0gICAgICBmcHJpbnRmKGZvdXQsICItIE1VU1RKT0lOICIpOwotLy8gNS82LzIwMDQgLSBkb24ndCBuZWVkIHNpbmNlIEkgaGF2ZSBhIGNhbGxiYWNrIGZvciB0aGUgbmFtZQotLy8gIGVsc2UKLS8vICAgICAgZnByaW50Zihmb3V0LCAiLSAlcyAiLCBuZXQtPm5hbWUoKSk7Ci0gCi0vLyAgbmV0LT5jaGFuZ2VOZXROYW1lKCJuZXdOZXROYW1lIik7Ci0vLyAgZnByaW50Zihmb3V0LCAiJXMgIiwgbmV0LT5uYW1lKCkpOwotICBjb3VudCA9IDA7Ci0gIC8vIGNvbXBOYW1lICYgcGluTmFtZQotICBmb3IgKGkgPSAwOyBpIDwgbmV0LT5udW1Db25uZWN0aW9ucygpOyBpKyspIHsKLSAgICAgIC8vIHNldCB0aGUgbGltaXQgb2Ygb25seSA1IGl0ZW1zIHBlciBsaW5lCi0gICAgICBjb3VudCsrOwotICAgICAgaWYgKGNvdW50ID49IDUpIHsKLSAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgIGNvdW50ID0gMDsKLSAgICAgIH0KLSAgICAgIGZwcmludGYoZm91dCwgIiggJXMgJXMgKSAiLCBuZXQtPmluc3RhbmNlKGkpLAotICAgICAgICAgICAgICBuZXQtPnBpbihpKSk7Ci0vLyAgICAgIG5ldC0+Y2hhbmdlSW5zdGFuY2UoIm5ld0luc3RhbmNlIiwgaSk7Ci0vLyAgICAgIG5ldC0+Y2hhbmdlUGluKCJuZXdQaW4iLCBpKTsKLS8vICAgICAgZnByaW50Zihmb3V0LCAiKCAlcyAlcyApICIsIG5ldC0+aW5zdGFuY2UoaSksCi0vLyAgICAgICAgICAgICAgbmV0LT5waW4oaSkpOwotICAgICAgaWYgKG5ldC0+cGluSXNTeW50aGVzaXplZChpKSkKLSAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIFNZTlRIRVNJWkVEICIpOwotICB9Ci0KLSAgaWYgKG5ldC0+aGFzTm9uRGVmYXVsdFJ1bGUoKSkKLSAgICAgIGZwcmludGYoZm91dCwgIisgTk9OREVGQVVMVFJVTEUgJXNcbiIsIG5ldC0+bm9uRGVmYXVsdFJ1bGUoKSk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IG5ldC0+bnVtVnBpbnMoKTsgaSsrKSB7Ci0gICAgICB2cGluID0gbmV0LT52cGluKGkpOwotICAgICAgZnByaW50Zihmb3V0LCAiICArICVzIiwgdnBpbi0+bmFtZSgpKTsKLSAgICAgIGlmICh2cGluLT5sYXllcigpKSAKLSAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgJXMiLCB2cGluLT5sYXllcigpKTsKLSAgICAgIGZwcmludGYoZm91dCwgIiAlZCAlZCAlZCAlZCIsIHZwaW4tPnhsKCksIHZwaW4tPnlsKCksIHZwaW4tPnhoKCksCi0gICAgICAgICAgICAgIHZwaW4tPnloKCkpOwotICAgICAgaWYgKHZwaW4tPnN0YXR1cygpICE9ICcgJykgewotICAgICAgICAgIGZwcmludGYoZm91dCwgIiAlYyIsIHZwaW4tPnN0YXR1cygpKTsKLSAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgJWQgJWQiLCB2cGluLT54TG9jKCksIHZwaW4tPnlMb2MoKSk7Ci0gICAgICAgICAgaWYgKHZwaW4tPm9yaWVudCgpICE9IC0xKQotICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgJXMiLCBvcmllbnRTdHIodnBpbi0+b3JpZW50KCkpKTsKLSAgICAgIH0KLSAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gIH0KLQotICAvLyByZWd1bGFyV2lyaW5nCi0gIGlmIChuZXQtPm51bVdpcmVzKCkpIHsKLSAgICAgZm9yIChpID0gMDsgaSA8IG5ldC0+bnVtV2lyZXMoKTsgaSsrKSB7Ci0gICAgICAgIG5ld0xheWVyID0gMDsKLSAgICAgICAgd2lyZSA9IG5ldC0+d2lyZShpKTsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiXG4gICsgJXMgIiwgd2lyZS0+d2lyZVR5cGUoKSk7Ci0gICAgICAgIGNvdW50ID0gMDsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpcmUtPm51bVBhdGhzKCk7IGorKykgewotICAgICAgICAgICBwID0gd2lyZS0+cGF0aChqKTsKLSAgICAgICAgICAgcC0+aW5pdFRyYXZlcnNlKCk7Ci0gICAgICAgICAgIHdoaWxlICgocGF0aCA9IChpbnQpcC0+bmV4dCgpKSAhPSBERUZJUEFUSF9ET05FKSB7Ci0gICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgIC8vIERvbid0IHdhbnQgdGhlIGxpbmUgdG8gYmUgdG9vIGxvbmcKLSAgICAgICAgICAgICAgaWYgKGNvdW50ID49IDUpIHsKLSAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgICAgICAgICAgICAgICBjb3VudCA9IDA7Ci0gICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAgIHN3aXRjaCAocGF0aCkgewotICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfTEFZRVI6Ci0gICAgICAgICAgICAgICAgICAgICBpZiAobmV3TGF5ZXIgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzICIsIHAtPmdldExheWVyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xheWVyID0gMTsKLSAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIk5FVyAlcyAiLCBwLT5nZXRMYXllcigpKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCQljYXNlIERFRklQQVRIX01BU0s6Ci0JCSAgICAgZnByaW50Zihmb3V0LCAiTUFTSyAlZCAiLCBwLT5nZXRNYXNrKCkpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9WSUFNQVNLOgotICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTUFTSyAlZCVkJWQgIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmdldFZpYVRvcE1hc2soKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmdldFZpYUN1dE1hc2soKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+Z2V0VmlhQm90dG9tTWFzaygpKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfVklBOgotICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgaWdub3JlVmlhTmFtZXMgPyAiWFhYIiA6IHAtPmdldFZpYSgpKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfVklBUk9UQVRJT046Ci0gICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50U3RyKHAtPmdldFZpYVJvdGF0aW9uKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCQljYXNlIERFRklQQVRIX1JFQ1Q6Ci0JCSAgICAgcC0+Z2V0VmlhUmVjdCgmdywgJngsICZ5LCAmeik7Ci0gICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJSRUNUICggJWQgJWQgJWQgJWQgKSAiLCB3LCB4LCB5LCB6KTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCQljYXNlIERFRklQQVRIX1ZJUlRVQUxQT0lOVDoKLQkJICAgICBwLT5nZXRWaXJ0dWFsUG9pbnQoJngsICZ5KTsKLQkJICAgICBmcHJpbnRmKGZvdXQsICJWSVJUVUFMICggJWQgJWQgKSAiLCB4LCB5KTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfV0lEVEg6Ci0gICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlZCAiLCBwLT5nZXRXaWR0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfUE9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgICBwLT5nZXRQb2ludCgmeCwgJnkpOwotICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKCAlZCAlZCApICIsIHgsIHkpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9GTFVTSFBPSU5UOgotICAgICAgICAgICAgICAgICAgICAgcC0+Z2V0Rmx1c2hQb2ludCgmeCwgJnksICZ6KTsKLSAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiggJWQgJWQgJWQgKSAiLCB4LCB5LCB6KTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfVEFQRVI6Ci0gICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJUQVBFUiAiKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfVEFQRVJSVUxFOgotICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiVEFQRVJSVUxFICVzICIscC0+Z2V0VGFwZXJSdWxlKCkpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9TVFlMRToKLSAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlNUWUxFICVkICIscC0+Z2V0U3R5bGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgY291bnQgPSAwOwotICAgICB9Ci0gIH0KLQotICAvLyBTSElFTERORVQKLSAgaWYgKG5ldC0+bnVtU2hpZWxkTmV0cygpKSB7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBuZXQtPm51bVNoaWVsZE5ldHMoKTsgaSsrKSAKLSAgICAgICAgIGZwcmludGYoZm91dCwgIlxuICArIFNISUVMRE5FVCAlcyIsIG5ldC0+c2hpZWxkTmV0KGkpKTsKLSAgfQotLyogb2Jzb2xldGUgaW4gNS40Ci0gIGlmIChuZXQtPm51bU5vU2hpZWxkcygpKSB7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBuZXQtPm51bU5vU2hpZWxkcygpOyBpKyspIHsgCi0gICAgICAgICBub1NoaWVsZCA9IG5ldC0+bm9TaGllbGQoaSk7IAotICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4gICsgTk9TSElFTEQgIik7Ci0gICAgICAgICBuZXdMYXllciA9IDA7Ci0gICAgICAgICBmb3IgKGogPSAwOyBqIDwgbm9TaGllbGQtPm51bVBhdGhzKCk7IGorKykgewotICAgICAgICAgICAgcCA9IG5vU2hpZWxkLT5wYXRoKGopOwotICAgICAgICAgICAgcC0+aW5pdFRyYXZlcnNlKCk7Ci0gICAgICAgICAgICB3aGlsZSAoKHBhdGggPSAoaW50KXAtPm5leHQoKSkgIT0gREVGSVBBVEhfRE9ORSkgewotICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgIC8vIERvbid0IHdhbnQgdGhlIGxpbmUgdG8gYmUgdG9vIGxvbmcKLSAgICAgICAgICAgICAgIGlmIChjb3VudCA+PSA1KSB7Ci0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgICAgICAgICAgICBjb3VudCA9IDA7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBzd2l0Y2ggKHBhdGgpIHsKLSAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9MQVlFUjoKLSAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3TGF5ZXIgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAiLCBwLT5nZXRMYXllcigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGF5ZXIgPSAxOwotICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJORVcgJXMgIiwgcC0+Z2V0TGF5ZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfVklBOgotICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzICIsIHAtPmdldFZpYSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9WSUFST1RBVElPTjoKLSAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50U3RyKHAtPmdldFZpYVJvdGF0aW9uKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9XSURUSDoKLSAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlZCAiLCBwLT5nZXRXaWR0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9QT0lOVDoKLSAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRQb2ludCgmeCwgJnkpOwotICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiggJWQgJWQgKSAiLCB4LCB5KTsKLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9GTFVTSFBPSU5UOgotICAgICAgICAgICAgICAgICAgICAgIHAtPmdldEZsdXNoUG9pbnQoJngsICZ5LCAmeik7Ci0gICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKCAlZCAlZCAlZCApICIsIHgsIHksIHopOwotICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1RBUEVSOgotICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlRBUEVSICIpOwotICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1RBUEVSUlVMRToKLSAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJUQVBFUlJVTEUgJXMgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmdldFRhcGVyUnVsZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgfQotICB9Ci0qLwotCi0gIGlmIChuZXQtPmhhc1N1Ym5ldHMoKSkgewotICAgICBmb3IgKGkgPSAwOyBpIDwgbmV0LT5udW1TdWJuZXRzKCk7IGkrKykgewotICAgICAgICBzID0gbmV0LT5zdWJuZXQoaSk7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gCi0gICAgICAgIGlmIChzLT5udW1Db25uZWN0aW9ucygpKSB7Ci0gICAgICAgICAgIGlmIChzLT5waW5Jc011c3RKb2luKDApKQotICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICItIE1VU1RKT0lOICIpOwotICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgKyBTVUJORVQgJXMgIiwgcy0+bmFtZSgpKTsKLSAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHMtPm51bUNvbm5lY3Rpb25zKCk7IGorKykKLSAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICggJXMgJXMgKVxuIiwgcy0+aW5zdGFuY2UoaiksCi0gICAgICAgICAgICAgICAgICAgICAgcy0+cGluKGopKTsKLQotICAgICAgICAgICAvLyByZWd1bGFyV2lyaW5nCi0gICAgICAgICAgIGlmIChzLT5udW1XaXJlcygpKSB7Ci0gICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBzLT5udW1XaXJlcygpOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgbmV3TGF5ZXIgPSAwOwotICAgICAgICAgICAgICAgICB3aXJlID0gcy0+d2lyZShrKTsKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICAlcyAiLCB3aXJlLT53aXJlVHlwZSgpKTsKLSAgICAgICAgICAgICAgICAgY291bnQgPSAwOwotICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lyZS0+bnVtUGF0aHMoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHAgPSB3aXJlLT5wYXRoKGopOwotICAgICAgICAgICAgICAgICAgICBwLT5pbml0VHJhdmVyc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChwYXRoID0gKGludClwLT5uZXh0KCkpICE9IERFRklQQVRIX0RPTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3Qgd2FudCB0aGUgbGluZSB0byBiZSB0b28gbG9uZwotICAgICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQgPj0gNSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwYXRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9MQVlFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdMYXllciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgcC0+Z2V0TGF5ZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGF5ZXIgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTkVXICVzICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRMYXllcigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfVklBOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgaWdub3JlVmlhTmFtZXMgPyAiWFhYIiA6IHAtPmdldFZpYSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfVklBUk9UQVRJT046Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRWaWFSb3RhdGlvblN0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfV0lEVEg6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlZCAiLCBwLT5nZXRXaWR0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfUE9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRQb2ludCgmeCwgJnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKCAlZCAlZCApICIsIHgsIHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9GTFVTSFBPSU5UOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+Z2V0Rmx1c2hQb2ludCgmeCwgJnksICZ6KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiggJWQgJWQgJWQgKSAiLCB4LCB5LCB6KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfVEFQRVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJUQVBFUiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfVEFQRVJSVUxFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiVEFQRVJSVUxFICAlcyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRUYXBlclJ1bGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1NUWUxFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiU1RZTEUgICVkICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmdldFN0eWxlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgfQotCi0gIGlmIChuZXQtPm51bVByb3BzKCkpIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbmV0LT5udW1Qcm9wcygpOyBpKyspIHsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiICArIFBST1BFUlRZICVzICIsIG5ldC0+cHJvcE5hbWUoaSkpOwotICAgICAgICBzd2l0Y2ggKG5ldC0+cHJvcFR5cGUoaSkpIHsKLSAgICAgICAgICAgY2FzZSAnUic6IGZwcmludGYoZm91dCwgIiVnIFJFQUwgIiwgbmV0LT5wcm9wTnVtYmVyKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICBjYXNlICdJJzogZnByaW50Zihmb3V0LCAiJWcgSU5URUdFUiAiLCBuZXQtPnByb3BOdW1iZXIoaSkpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIGNhc2UgJ1MnOiBmcHJpbnRmKGZvdXQsICIlcyBTVFJJTkcgIiwgbmV0LT5wcm9wVmFsdWUoaSkpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIGNhc2UgJ1EnOiBmcHJpbnRmKGZvdXQsICIlcyBRVU9URVNUUklORyAiLCBuZXQtPnByb3BWYWx1ZShpKSk7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgY2FzZSAnTic6IGZwcmludGYoZm91dCwgIiVnIE5VTUJFUiAiLCBuZXQtPnByb3BOdW1iZXIoaSkpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICB9Ci0gIH0KLQotICBpZiAobmV0LT5oYXNXZWlnaHQoKSkKLSAgICBmcHJpbnRmKGZvdXQsICIrIFdFSUdIVCAlZCAiLCBuZXQtPndlaWdodCgpKTsKLSAgaWYgKG5ldC0+aGFzQ2FwKCkpCi0gICAgZnByaW50Zihmb3V0LCAiKyBFU1RDQVAgJWcgIiwgbmV0LT5jYXAoKSk7Ci0gIGlmIChuZXQtPmhhc1NvdXJjZSgpKQotICAgIGZwcmludGYoZm91dCwgIisgU09VUkNFICVzICIsIG5ldC0+c291cmNlKCkpOwotICBpZiAobmV0LT5oYXNGaXhlZGJ1bXAoKSkKLSAgICBmcHJpbnRmKGZvdXQsICIrIEZJWEVEQlVNUCAiKTsKLSAgaWYgKG5ldC0+aGFzRnJlcXVlbmN5KCkpCi0gICAgZnByaW50Zihmb3V0LCAiKyBGUkVRVUVOQ1kgJWcgIiwgbmV0LT5mcmVxdWVuY3koKSk7Ci0gIGlmIChuZXQtPmhhc1BhdHRlcm4oKSkKLSAgICBmcHJpbnRmKGZvdXQsICIrIFBBVFRFUk4gJXMgIiwgbmV0LT5wYXR0ZXJuKCkpOwotICBpZiAobmV0LT5oYXNPcmlnaW5hbCgpKQotICAgIGZwcmludGYoZm91dCwgIisgT1JJR0lOQUwgJXMgIiwgbmV0LT5vcmlnaW5hbCgpKTsKLSAgaWYgKG5ldC0+aGFzVXNlKCkpCi0gICAgZnByaW50Zihmb3V0LCAiKyBVU0UgJXMgIiwgbmV0LT51c2UoKSk7Ci0KLSAgZnByaW50ZiAoZm91dCwgIjtcbiIpOwotICAtLW51bU9ianM7Ci0gIGlmIChudW1PYmpzIDw9IDApCi0gICAgICBmcHJpbnRmKGZvdXQsICJFTkQgTkVUU1xuIik7Ci0gIHJldHVybiAwOwotfQotCi0KLWludCBzbmV0cGF0aChkZWZyQ2FsbGJhY2tUeXBlX2UgYywgZGVmaU5ldCogcHBhdGgsIGRlZmlVc2VyRGF0YSB1ZCkgewotICBpbnQgICAgICAgICBpLCBqLCB4LCB5LCB6LCBjb3VudCwgbmV3TGF5ZXI7Ci0gIGNoYXIqICAgICAgIGxheWVyTmFtZTsKLSAgZG91YmxlICAgICAgZGlzdCwgbGVmdCwgcmlnaHQ7Ci0gIGRlZmlQYXRoKiAgIHA7Ci0gIGRlZmlTdWJuZXQgICpzOwotICBpbnQgICAgICAgICBwYXRoOwotICBkZWZpU2hpZWxkKiBzaGllbGQ7Ci0gIGRlZmlXaXJlKiAgIHdpcmU7Ci0gIGludCAgICAgICAgIG51bVgsIG51bVksIHN0ZXBYLCBzdGVwWTsKLQotICBpZiAoYyAhPSBkZWZyU05ldFBhcnRpYWxQYXRoQ2JrVHlwZSkKLSAgICAgIHJldHVybiAxOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotCi0gIGZwcmludGYgKGZvdXQsICJTUEVDSUFMTkVUIHBhcnRpYWwgZGF0YVxuIik7Ci0KLSAgZnByaW50Zihmb3V0LCAiLSAlcyAiLCBwcGF0aC0+bmFtZSgpKTsKLQotICBjb3VudCA9IDA7Ci0gIC8vIGNvbXBOYW1lICYgcGluTmFtZQotICBmb3IgKGkgPSAwOyBpIDwgcHBhdGgtPm51bUNvbm5lY3Rpb25zKCk7IGkrKykgewotICAgICAgLy8gc2V0IHRoZSBsaW1pdCBvZiBvbmx5IDUgaXRlbXMgcHJpbnQgb3V0IGluIG9uZSBsaW5lCi0gICAgICBjb3VudCsrOwotICAgICAgaWYgKGNvdW50ID49IDUpIHsKLSAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgIGNvdW50ID0gMDsKLSAgICAgIH0KLSAgICAgIGZwcmludGYgKGZvdXQsICIoICVzICVzICkgIiwgcHBhdGgtPmluc3RhbmNlKGkpLAotICAgICAgICAgICAgICAgcHBhdGgtPnBpbihpKSk7Ci0gICAgICBpZiAocHBhdGgtPnBpbklzU3ludGhlc2l6ZWQoaSkpCi0gICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBTWU5USEVTSVpFRCAiKTsKLSAgfQotCi0gIC8vIHNwZWNpYWxXaXJpbmcKLSAgLy8gUE9MWUdPTgotICBpZiAocHBhdGgtPm51bVBvbHlnb25zKCkpIHsKLSAgICAgc3RydWN0IGRlZmlQb2ludHMgcG9pbnRzOwotICAgIGZvciAoaSA9IDA7IGkgPCBwcGF0aC0+bnVtUG9seWdvbnMoKTsgaSsrKSB7Ci0gICAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBQT0xZR09OICVzICIsIHBwYXRoLT5wb2x5Z29uTmFtZShpKSk7Ci0gICAgICBwb2ludHMgPSBwcGF0aC0+Z2V0UG9seWdvbihpKTsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBwb2ludHMubnVtUG9pbnRzOyBqKyspCi0gICAgICAgIGZwcmludGYoZm91dCwgIiVkICVkICIsIHBvaW50cy54W2pdLCBwb2ludHMueVtqXSk7Ci0gICAgfQotICB9Ci0gIC8vIFJFQ1QKLSAgaWYgKHBwYXRoLT5udW1SZWN0YW5nbGVzKCkpIHsKLSAgICAgZm9yIChpID0gMDsgaSA8IHBwYXRoLT5udW1SZWN0YW5nbGVzKCk7IGkrKykgewotICAgICAgIGZwcmludGYoZm91dCwgIlxuICArIFJFQ1QgJXMgJWQgJWQgJWQgJWQiLCBwcGF0aC0+cmVjdE5hbWUoaSksCi0gICAgICAgICAgICAgICBwcGF0aC0+eGwoaSksIHBwYXRoLT55bChpKSwKLSAgICAgICAgICAgICAgIHBwYXRoLT54aChpKSwgcHBhdGgtPnloKGkpKTsKLSAgICAgfQotICB9Ci0KLSAgLy8gQ09WRVIsIEZJWEVELCBST1VURUQgb3IgU0hJRUxECi0gIGlmIChwcGF0aC0+bnVtV2lyZXMoKSkgewotICAgICBuZXdMYXllciA9IDA7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBwcGF0aC0+bnVtV2lyZXMoKTsgaSsrKSB7Ci0gICAgICAgIG5ld0xheWVyID0gMDsKLSAgICAgICAgd2lyZSA9IHBwYXRoLT53aXJlKGkpOwotICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyAlcyAiLCB3aXJlLT53aXJlVHlwZSgpKTsKLSAgICAgICAgaWYgKHN0cmNtcCAod2lyZS0+d2lyZVR5cGUoKSwgIlNISUVMRCIpID09IDApCi0gICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzICIsIHdpcmUtPndpcmVTaGllbGROZXROYW1lKCkpOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lyZS0+bnVtUGF0aHMoKTsgaisrKSB7Ci0gICAgICAgICAgIHAgPSB3aXJlLT5wYXRoKGopOwotICAgICAgICAgICBwLT5pbml0VHJhdmVyc2UoKTsKLSAgICAgICAgICAgd2hpbGUgKChwYXRoID0gKGludClwLT5uZXh0KCkpICE9IERFRklQQVRIX0RPTkUpIHsKLSAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgLy8gRG9uJ3Qgd2FudCB0aGUgbGluZSB0byBiZSB0b28gbG9uZwotICAgICAgICAgICAgICBpZiAoY291bnQgPj0gNSkgewotICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgICAgICAgICAgIGNvdW50ID0gMDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBzd2l0Y2ggKHBhdGgpIHsKLSAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX0xBWUVSOgotICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0xheWVyID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAiLCBwLT5nZXRMYXllcigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMYXllciA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJORVcgJXMgIiwgcC0+Z2V0TGF5ZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1ZJQToKLSAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzICIsIGlnbm9yZVZpYU5hbWVzID8gIlhYWCIgOiBwLT5nZXRWaWEoKSk7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1ZJQVJPVEFUSU9OOgotICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50U3RyKHAtPmdldFZpYVJvdGF0aW9uKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfVklBREFUQToKLSAgICAgICAgICAgICAgICAgICAgIHAtPmdldFZpYURhdGEoJm51bVgsICZudW1ZLCAmc3RlcFgsICZzdGVwWSk7Ci0gICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJETyAlZCBCWSAlZCBTVEVQICVkICVkICIsIG51bVgsIG51bVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBYLCBzdGVwWSk7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1dJRFRIOgotICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJWQgIiwgcC0+Z2V0V2lkdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLQkJY2FzZSBERUZJUEFUSF9NQVNLOgotCQkgICAgIGZwcmludGYoZm91dCwgIk1BU0sgJWQgIiwgcC0+Z2V0TWFzaygpKTsKLQkJICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1ZJQU1BU0s6Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIk1BU0sgJWQlZCVkICIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmdldFZpYVRvcE1hc2soKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+Z2V0VmlhQ3V0TWFzaygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmdldFZpYUJvdHRvbU1hc2soKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfUE9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgICBwLT5nZXRQb2ludCgmeCwgJnkpOwotICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKCAlZCAlZCApICIsIHgsIHkpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9GTFVTSFBPSU5UOgotICAgICAgICAgICAgICAgICAgICAgcC0+Z2V0Rmx1c2hQb2ludCgmeCwgJnksICZ6KTsKLSAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiggJWQgJWQgJWQgKSAiLCB4LCB5LCB6KTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfVEFQRVI6Ci0gICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJUQVBFUiAiKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfU0hBUEU6Ci0gICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIFNIQVBFICVzICIsIHAtPmdldFNoYXBlKCkpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9TVFlMRToKLSAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgU1RZTEUgJWQgIiwgcC0+Z2V0U3R5bGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgY291bnQgPSAwOwotICAgICB9Ci0gIH0KLQotICBpZiAocHBhdGgtPmhhc1N1Ym5ldHMoKSkgewotICAgIGZvciAoaSA9IDA7IGkgPCBwcGF0aC0+bnVtU3VibmV0cygpOyBpKyspIHsKLSAgICAgIHMgPSBwcGF0aC0+c3VibmV0KGkpOwotICAgICAgaWYgKHMtPm51bUNvbm5lY3Rpb25zKCkpIHsKLSAgICAgICAgICBpZiAocy0+cGluSXNNdXN0Sm9pbigwKSkKLSAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiLSBNVVNUSk9JTiAiKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIi0gJXMgIiwgcy0+bmFtZSgpKTsKLSAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcy0+bnVtQ29ubmVjdGlvbnMoKTsgaisrKSB7Ci0gICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAoICVzICVzIClcbiIsIHMtPmluc3RhbmNlKGopLAotICAgICAgICAgICAgICAgICAgICAgIHMtPnBpbihqKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gcmVndWxhcldpcmluZwotICAgICAgaWYgKHMtPm51bVdpcmVzKCkpIHsKLSAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5udW1XaXJlcygpOyBpKyspIHsKLSAgICAgICAgICAgIHdpcmUgPSBzLT53aXJlKGkpOwotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICArICVzICIsIHdpcmUtPndpcmVUeXBlKCkpOwotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpcmUtPm51bVBhdGhzKCk7IGorKykgewotICAgICAgICAgICAgICBwID0gd2lyZS0+cGF0aChqKTsKLSAgICAgICAgICAgICAgcC0+cHJpbnQoZm91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKHBwYXRoLT5udW1Qcm9wcygpKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IHBwYXRoLT5udW1Qcm9wcygpOyBpKyspIHsKLSAgICAgICAgaWYgKHBwYXRoLT5wcm9wSXNTdHJpbmcoaSkpCi0gICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgKyBQUk9QRVJUWSAlcyAlcyAiLCBwcGF0aC0+cHJvcE5hbWUoaSksCi0gICAgICAgICAgICAgICAgICAgcHBhdGgtPnByb3BWYWx1ZShpKSk7Ci0gICAgICAgIGlmIChwcGF0aC0+cHJvcElzTnVtYmVyKGkpKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICsgUFJPUEVSVFkgJXMgJWcgIiwgcHBhdGgtPnByb3BOYW1lKGkpLAotICAgICAgICAgICAgICAgICAgIHBwYXRoLT5wcm9wTnVtYmVyKGkpKTsKLSAgICAgICAgc3dpdGNoIChwcGF0aC0+cHJvcFR5cGUoaSkpIHsKLSAgICAgICAgICAgY2FzZSAnUic6IGZwcmludGYoZm91dCwgIlJFQUwgIik7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgY2FzZSAnSSc6IGZwcmludGYoZm91dCwgIklOVEVHRVIgIik7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgY2FzZSAnUyc6IGZwcmludGYoZm91dCwgIlNUUklORyAiKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICBjYXNlICdRJzogZnByaW50Zihmb3V0LCAiUVVPVEVTVFJJTkcgIik7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgY2FzZSAnTic6IGZwcmludGYoZm91dCwgIk5VTUJFUiAiKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgfQotICB9Ci0KLSAgLy8gU0hJRUxECi0gIGNvdW50ID0gMDsKLSAgLy8gdGVzdGluZyB0aGUgU0hJRUxEIGZvciA1LjMsIG9ic29sZXRlIGluIDUuNAotICBpZiAocHBhdGgtPm51bVNoaWVsZHMoKSkgewotICAgIGZvciAoaSA9IDA7IGkgPCBwcGF0aC0+bnVtU2hpZWxkcygpOyBpKyspIHsKLSAgICAgICBzaGllbGQgPSBwcGF0aC0+c2hpZWxkKGkpOwotICAgICAgIGZwcmludGYoZm91dCwgIlxuICArIFNISUVMRCAlcyAiLCBzaGllbGQtPnNoaWVsZE5hbWUoKSk7Ci0gICAgICAgbmV3TGF5ZXIgPSAwOwotICAgICAgIGZvciAoaiA9IDA7IGogPCBzaGllbGQtPm51bVBhdGhzKCk7IGorKykgewotICAgICAgICAgIHAgPSBzaGllbGQtPnBhdGgoaik7Ci0gICAgICAgICAgcC0+aW5pdFRyYXZlcnNlKCk7Ci0gICAgICAgICAgd2hpbGUgKChwYXRoID0gKGludClwLT5uZXh0KCkpICE9IERFRklQQVRIX0RPTkUpIHsKLSAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgIC8vIERvbid0IHdhbnQgdGhlIGxpbmUgdG8gYmUgdG9vIGxvbmcKLSAgICAgICAgICAgICBpZiAoY291bnQgPj0gNSkgewotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgICAgICAgICBjb3VudCA9IDA7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIHN3aXRjaCAocGF0aCkgewotICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9MQVlFUjoKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0xheWVyID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzICIsIHAtPmdldExheWVyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGF5ZXIgPSAxOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIk5FVyAlcyAiLCBwLT5nZXRMYXllcigpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1ZJQToKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgaWdub3JlVmlhTmFtZXMgPyAiWFhYIiA6IHAtPmdldFZpYSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1ZJQVJPVEFUSU9OOgotICAgICAgICAgICAgICAgICAgICBpZiAobmV3TGF5ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50U3RyKHAtPmdldFZpYVJvdGF0aW9uKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJTdHIgJXMgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRWaWFSb3RhdGlvblN0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1dJRFRIOgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlZCAiLCBwLT5nZXRXaWR0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0JICAgICAgIGNhc2UgREVGSVBBVEhfTUFTSzoKLQkJICAgIGZwcmludGYoZm91dCwgIk1BU0sgJWQgIiwgcC0+Z2V0TWFzaygpKTsKLQkJICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9WSUFNQVNLOgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJNQVNLICVkJWQlZCAiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRWaWFUb3BNYXNrKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmdldFZpYUN1dE1hc2soKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRWaWFCb3R0b21NYXNrKCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfUE9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgIHAtPmdldFBvaW50KCZ4LCAmeSk7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiggJWQgJWQgKSAiLCB4LCB5KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX0ZMVVNIUE9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgIHAtPmdldEZsdXNoUG9pbnQoJngsICZ5LCAmeik7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiggJWQgJWQgJWQgKSAiLCB4LCB5LCB6KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1RBUEVSOgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJUQVBFUiAiKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1NIQVBFOgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIFNIQVBFICVzICIsIHAtPmdldFNoYXBlKCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfU1RZTEU6Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgU1RZTEUgJWQgIiwgcC0+Z2V0U3R5bGUoKSk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gbGF5ZXJOYW1lIHdpZHRoCi0gIGlmIChwcGF0aC0+aGFzV2lkdGhSdWxlcygpKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IHBwYXRoLT5udW1XaWR0aFJ1bGVzKCk7IGkrKykgewotICAgICAgICBwcGF0aC0+d2lkdGhSdWxlKGksICZsYXllck5hbWUsICZkaXN0KTsKLSAgICAgICAgZnByaW50ZiAoZm91dCwgIlxuICArIFdJRFRIICVzICVnICIsIGxheWVyTmFtZSwgZGlzdCk7Ci0gICAgfQotICB9Ci0KLSAgLy8gbGF5ZXJOYW1lIHNwYWNpbmcKLSAgaWYgKHBwYXRoLT5oYXNTcGFjaW5nUnVsZXMoKSkgewotICAgIGZvciAoaSA9IDA7IGkgPCBwcGF0aC0+bnVtU3BhY2luZ1J1bGVzKCk7IGkrKykgewotICAgICAgICBwcGF0aC0+c3BhY2luZ1J1bGUoaSwgJmxheWVyTmFtZSwgJmRpc3QsICZsZWZ0LCAmcmlnaHQpOwotICAgICAgICBpZiAobGVmdCA9PSByaWdodCkKLSAgICAgICAgICAgIGZwcmludGYgKGZvdXQsICJcbiAgKyBTUEFDSU5HICVzICVnICIsIGxheWVyTmFtZSwgZGlzdCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZwcmludGYgKGZvdXQsICJcbiAgKyBTUEFDSU5HICVzICVnIFJBTkdFICVnICVnICIsCi0gICAgICAgICAgICAgICAgICAgICBsYXllck5hbWUsIGRpc3QsIGxlZnQsIHJpZ2h0KTsKLSAgICB9Ci0gIH0KLQotICBpZiAocHBhdGgtPmhhc0ZpeGVkYnVtcCgpKQotICAgIGZwcmludGYoZm91dCwgIlxuICArIEZJWEVEQlVNUCAiKTsKLSAgaWYgKHBwYXRoLT5oYXNGcmVxdWVuY3koKSkKLSAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBGUkVRVUVOQ1kgJWcgIiwgcHBhdGgtPmZyZXF1ZW5jeSgpKTsKLSAgaWYgKHBwYXRoLT5oYXNWb2x0YWdlKCkpCi0gICAgZnByaW50Zihmb3V0LCAiXG4gICsgVk9MVEFHRSAlZyAiLCBwcGF0aC0+dm9sdGFnZSgpKTsKLSAgaWYgKHBwYXRoLT5oYXNXZWlnaHQoKSkKLSAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBXRUlHSFQgJWQgIiwgcHBhdGgtPndlaWdodCgpKTsKLSAgaWYgKHBwYXRoLT5oYXNDYXAoKSkKLSAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBFU1RDQVAgJWcgIiwgcHBhdGgtPmNhcCgpKTsKLSAgaWYgKHBwYXRoLT5oYXNTb3VyY2UoKSkKLSAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBTT1VSQ0UgJXMgIiwgcHBhdGgtPnNvdXJjZSgpKTsKLSAgaWYgKHBwYXRoLT5oYXNQYXR0ZXJuKCkpCi0gICAgZnByaW50Zihmb3V0LCAiXG4gICsgUEFUVEVSTiAlcyAiLCBwcGF0aC0+cGF0dGVybigpKTsKLSAgaWYgKHBwYXRoLT5oYXNPcmlnaW5hbCgpKQotICAgIGZwcmludGYoZm91dCwgIlxuICArIE9SSUdJTkFMICVzICIsIHBwYXRoLT5vcmlnaW5hbCgpKTsKLSAgaWYgKHBwYXRoLT5oYXNVc2UoKSkKLSAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBVU0UgJXMgIiwgcHBhdGgtPnVzZSgpKTsKLQotICBmcHJpbnRmKGZvdXQsICJcbiIpOwotCi0gIHJldHVybiAwOwotfQotCi0KLWludCBzbmV0d2lyZShkZWZyQ2FsbGJhY2tUeXBlX2UgYywgZGVmaU5ldCogcHBhdGgsIGRlZmlVc2VyRGF0YSB1ZCkgewotICBpbnQgICAgICAgICBpLCBqLCB4LCB5LCB6LCBjb3VudCA9IDAsIG5ld0xheWVyOwotICBkZWZpUGF0aCogICBwOwotICBpbnQgICAgICAgICBwYXRoOwotICBkZWZpV2lyZSogICB3aXJlOwotICBkZWZpU2hpZWxkKiBzaGllbGQ7Ci0gIGludCAgICAgICAgIG51bVgsIG51bVksIHN0ZXBYLCBzdGVwWTsKLQotICBpZiAoYyAhPSBkZWZyU05ldFdpcmVDYmtUeXBlKQotICAgICAgcmV0dXJuIDE7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0KLSAgZnByaW50ZiAoZm91dCwgIlNQRUNJQUxORVQgd2lyZSBkYXRhXG4iKTsKLQotICBmcHJpbnRmKGZvdXQsICItICVzICIsIHBwYXRoLT5uYW1lKCkpOwotCi0gIC8vIFBPTFlHT04KLSAgaWYgKHBwYXRoLT5udW1Qb2x5Z29ucygpKSB7Ci0Jc3RydWN0IGRlZmlQb2ludHMgcG9pbnRzOwotCWZvciAoaSA9IDA7IGkgPCBwcGF0aC0+bnVtUG9seWdvbnMoKTsgaSsrKSB7Ci0JICAgIGZwcmludGYoZm91dCwgIlxuICArIFBPTFlHT04gJXMgIiwgcHBhdGgtPnBvbHlnb25OYW1lKGkpKTsKLQotCSAgICBwb2ludHMgPSBwcGF0aC0+Z2V0UG9seWdvbihpKTsKLQotCSAgICBmb3IgKGogPSAwOyBqIDwgcG9pbnRzLm51bVBvaW50czsgaisrKSB7Ci0JCWZwcmludGYoZm91dCwgIiVkICVkICIsIHBvaW50cy54W2pdLCBwb2ludHMueVtqXSk7Ci0JICAgIH0KLQl9Ci0gIC8vIFJFQ1QKLSAgfSAKLSAgaWYgKHBwYXRoLT5udW1SZWN0YW5nbGVzKCkpIHsKLQlmb3IgKGkgPSAwOyBpIDwgcHBhdGgtPm51bVJlY3RhbmdsZXMoKTsgaSsrKSB7Ci0JICAgIGZwcmludGYoZm91dCwgIlxuICArIFJFQ1QgJXMgJWQgJWQgJWQgJWQiLCBwcGF0aC0+cmVjdE5hbWUoaSksCi0gICAgICAgICAgICBwcGF0aC0+eGwoaSksIHBwYXRoLT55bChpKSwKLSAgICAgICAgICAgIHBwYXRoLT54aChpKSwgcHBhdGgtPnloKGkpKTsKLQl9Ci0gIH0KLSAgLy8gVklBCi0gIGlmIChwcGF0aC0+bnVtVmlhU3BlY3MoKSkgewotCWZvciAoaSA9IDA7IGkgPCBwcGF0aC0+bnVtVmlhU3BlY3MoKTsgaSsrKSB7Ci0JICAgIGZwcmludGYoZm91dCwgIlxuICArIFZJQSAlcyAiLCBwcGF0aC0+dmlhTmFtZShpKSksCi0JICAgIGZwcmludGYoZm91dCwgIiAlcyIsIHBwYXRoLT52aWFPcmllbnRTdHIoaSkpOwotCi0JICAgIGRlZmlQb2ludHMgcG9pbnRzID0gcHBhdGgtPmdldFZpYVB0cyhpKTsKLQotCSAgICBmb3IgKGludCBqID0gMDsgaiA8IHBvaW50cy5udW1Qb2ludHM7IGorKykgewotCQlmcHJpbnRmKGZvdXQsICIgJWQgJWQiLCBwb2ludHMueFtqXSwgcG9pbnRzLnlbal0pOwotCSAgICB9Ci0JfQotICB9Ci0KLSAgLy8gc3BlY2lhbFdpcmluZwotICBpZiAocHBhdGgtPm51bVdpcmVzKCkpIHsKLSAgICAgbmV3TGF5ZXIgPSAwOwotICAgICBmb3IgKGkgPSAwOyBpIDwgcHBhdGgtPm51bVdpcmVzKCk7IGkrKykgewotICAgICAgICBuZXdMYXllciA9IDA7Ci0gICAgICAgIHdpcmUgPSBwcGF0aC0+d2lyZShpKTsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiXG4gICsgJXMgIiwgd2lyZS0+d2lyZVR5cGUoKSk7Ci0gICAgICAgIGlmIChzdHJjbXAgKHdpcmUtPndpcmVUeXBlKCksICJTSElFTEQiKSA9PSAwKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAiLCB3aXJlLT53aXJlU2hpZWxkTmV0TmFtZSgpKTsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpcmUtPm51bVBhdGhzKCk7IGorKykgewotICAgICAgICAgICBwID0gd2lyZS0+cGF0aChqKTsKLSAgICAgICAgICAgcC0+aW5pdFRyYXZlcnNlKCk7Ci0gICAgICAgICAgIHdoaWxlICgocGF0aCA9IChpbnQpcC0+bmV4dCgpKSAhPSBERUZJUEFUSF9ET05FKSB7Ci0gICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgIC8vIERvbid0IHdhbnQgdGhlIGxpbmUgdG8gYmUgdG9vIGxvbmcKLSAgICAgICAgICAgICAgaWYgKGNvdW50ID49IDUpIHsKLSAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgICAgICAgICAgICAgICBjb3VudCA9IDA7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgc3dpdGNoIChwYXRoKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9MQVlFUjoKLSAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdMYXllciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgcC0+Z2V0TGF5ZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGF5ZXIgPSAxOwotICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTkVXICVzICIsIHAtPmdldExheWVyKCkpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9WSUE6Ci0gICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAiLCBpZ25vcmVWaWFOYW1lcyA/ICJYWFgiIDogcC0+Z2V0VmlhKCkpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9WSUFST1RBVElPTjoKLSAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudFN0cihwLT5nZXRWaWFSb3RhdGlvbigpKSk7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1ZJQURBVEE6Ci0gICAgICAgICAgICAgICAgICAgICBwLT5nZXRWaWFEYXRhKCZudW1YLCAmbnVtWSwgJnN0ZXBYLCAmc3RlcFkpOwotICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiRE8gJWQgQlkgJWQgU1RFUCAlZCAlZCAiLCBudW1YLCBudW1ZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwWCwgc3RlcFkpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9XSURUSDoKLSAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVkICIsIHAtPmdldFdpZHRoKCkpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0JCWNhc2UgREVGSVBBVEhfTUFTSzoKLQkJICAgICBmcHJpbnRmKGZvdXQsICJNQVNLICVkICIsIHAtPmdldE1hc2soKSk7Ci0JCSAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9WSUFNQVNLOgotICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTUFTSyAlZCVkJWQgIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmdldFZpYVRvcE1hc2soKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmdldFZpYUN1dE1hc2soKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+Z2V0VmlhQm90dG9tTWFzaygpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9QT0lOVDoKLSAgICAgICAgICAgICAgICAgICAgIHAtPmdldFBvaW50KCZ4LCAmeSk7Ci0gICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIoICVkICVkICkgIiwgeCwgeSk7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX0ZMVVNIUE9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgICBwLT5nZXRGbHVzaFBvaW50KCZ4LCAmeSwgJnopOwotICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKCAlZCAlZCAlZCApICIsIHgsIHksIHopOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9UQVBFUjoKLSAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlRBUEVSICIpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9TSEFQRToKLSAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgU0hBUEUgJXMgIiwgcC0+Z2V0U2hhcGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1NUWUxFOgotICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBTVFlMRSAlZCAiLCBwLT5nZXRTdHlsZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICBjb3VudCA9IDA7Ci0gICAgIH0KLSAgfSBlbHNlIGlmIChwcGF0aC0+bnVtU2hpZWxkcygpKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IHBwYXRoLT5udW1TaGllbGRzKCk7IGkrKykgewotICAgICAgIHNoaWVsZCA9IHBwYXRoLT5zaGllbGQoaSk7Ci0gICAgICAgZnByaW50Zihmb3V0LCAiXG4gICsgU0hJRUxEICVzICIsIHNoaWVsZC0+c2hpZWxkTmFtZSgpKTsKLSAgICAgICBuZXdMYXllciA9IDA7Ci0gICAgICAgZm9yIChqID0gMDsgaiA8IHNoaWVsZC0+bnVtUGF0aHMoKTsgaisrKSB7Ci0gICAgICAgICAgcCA9IHNoaWVsZC0+cGF0aChqKTsKLSAgICAgICAgICBwLT5pbml0VHJhdmVyc2UoKTsKLSAgICAgICAgICB3aGlsZSAoKHBhdGggPSAoaW50KXAtPm5leHQoKSkgIT0gREVGSVBBVEhfRE9ORSkgewotICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgLy8gRG9uJ3Qgd2FudCB0aGUgbGluZSB0byBiZSB0b28gbG9uZwotICAgICAgICAgICAgIGlmIChjb3VudCA+PSA1KSB7Ci0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgICAgICAgICAgICAgIGNvdW50ID0gMDsKLSAgICAgICAgICAgICB9IAotICAgICAgICAgICAgIHN3aXRjaCAocGF0aCkgewotICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9MQVlFUjoKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0xheWVyID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzICIsIHAtPmdldExheWVyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGF5ZXIgPSAxOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIk5FVyAlcyAiLCBwLT5nZXRMYXllcigpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1ZJQToKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgaWdub3JlVmlhTmFtZXMgPyAiWFhYIiA6IHAtPmdldFZpYSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1ZJQVJPVEFUSU9OOgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRTdHIocC0+Z2V0VmlhUm90YXRpb24oKSkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfV0lEVEg6Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVkICIsIHAtPmdldFdpZHRoKCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQkgICAgICAgY2FzZSBERUZJUEFUSF9NQVNLOgotCQkgICAgZnByaW50Zihmb3V0LCAiTUFTSyAlZCAiLCBwLT5nZXRNYXNrKCkpOwotCQkgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1ZJQU1BU0s6Ci0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTUFTSyAlZCVkJWQgIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRWaWFUb3BNYXNrKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+Z2V0VmlhQ3V0TWFzaygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+Z2V0VmlhQm90dG9tTWFzaygpKTsKLSAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfUE9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgIHAtPmdldFBvaW50KCZ4LCAmeSk7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiggJWQgJWQgKSAiLCB4LCB5KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX0ZMVVNIUE9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgIHAtPmdldEZsdXNoUG9pbnQoJngsICZ5LCAmeik7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiggJWQgJWQgJWQgKSAiLCB4LCB5LCB6KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1RBUEVSOgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJUQVBFUiAiKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1NIQVBFOgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIFNIQVBFICVzICIsIHAtPmdldFNoYXBlKCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfU1RZTEU6Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgU1RZTEUgJWQgIiwgcC0+Z2V0U3R5bGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgfQotICAgIH0gCi0gIH0KLQotICBmcHJpbnRmKGZvdXQsICJcbiIpOwotCi0gIHJldHVybiAwOwotfQotCi1pbnQgc25ldGYoZGVmckNhbGxiYWNrVHlwZV9lIGMsIGRlZmlOZXQqIG5ldCwgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIC8vIEZvciBuZXQgYW5kIHNwZWNpYWwgbmV0LgotICBpbnQgICAgICAgICBpLCBqLCB4LCB5LCB6LCBjb3VudCwgbmV3TGF5ZXI7Ci0gIGNoYXIqICAgICAgIGxheWVyTmFtZTsKLSAgZG91YmxlICAgICAgZGlzdCwgbGVmdCwgcmlnaHQ7Ci0gIGRlZmlQYXRoKiAgIHA7Ci0gIGRlZmlTdWJuZXQgICpzOwotICBpbnQgICAgICAgICBwYXRoOwotICBkZWZpU2hpZWxkKiBzaGllbGQ7Ci0gIGRlZmlXaXJlKiAgIHdpcmU7Ci0gIGludCAgICAgICAgIG51bVgsIG51bVksIHN0ZXBYLCBzdGVwWTsKLQotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGlmIChjICE9IGRlZnJTTmV0Q2JrVHlwZSkKLSAgICAgIGZwcmludGYoZm91dCwgIkJPR1VTIE5FVCBUWVBFICAiKTsKLQotLy8gNS82LzIwMDQgLSBkb24ndCBuZWVkIHNpbmNlIEkgaGF2ZSBhIGNhbGxiYWNrIGZvciB0aGUgbmFtZQotLy8gIGZwcmludGYoZm91dCwgIi0gJXMgIiwgbmV0LT5uYW1lKCkpOwotCi0gIGNvdW50ID0gMDsKLSAgLy8gY29tcE5hbWUgJiBwaW5OYW1lCi0gIGZvciAoaSA9IDA7IGkgPCBuZXQtPm51bUNvbm5lY3Rpb25zKCk7IGkrKykgewotICAgICAgLy8gc2V0IHRoZSBsaW1pdCBvZiBvbmx5IDUgaXRlbXMgcHJpbnQgb3V0IGluIG9uZSBsaW5lCi0gICAgICBjb3VudCsrOwotICAgICAgaWYgKGNvdW50ID49IDUpIHsKLSAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgIGNvdW50ID0gMDsKLSAgICAgIH0KLSAgICAgIGZwcmludGYgKGZvdXQsICIoICVzICVzICkgIiwgbmV0LT5pbnN0YW5jZShpKSwKLSAgICAgICAgICAgICAgIG5ldC0+cGluKGkpKTsKLSAgICAgIGlmIChuZXQtPnBpbklzU3ludGhlc2l6ZWQoaSkpCi0gICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBTWU5USEVTSVpFRCAiKTsKLSAgfQotCi0gIC8vIHNwZWNpYWxXaXJpbmcKLSAgaWYgKG5ldC0+bnVtV2lyZXMoKSkgewotICAgICBuZXdMYXllciA9IDA7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBuZXQtPm51bVdpcmVzKCk7IGkrKykgewotICAgICAgICBuZXdMYXllciA9IDA7Ci0gICAgICAgIHdpcmUgPSBuZXQtPndpcmUoaSk7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIlxuICArICVzICIsIHdpcmUtPndpcmVUeXBlKCkpOwotICAgICAgICBpZiAoc3RyY21wICh3aXJlLT53aXJlVHlwZSgpLCAiU0hJRUxEIikgPT0gMCkKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgd2lyZS0+d2lyZVNoaWVsZE5ldE5hbWUoKSk7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCB3aXJlLT5udW1QYXRocygpOyBqKyspIHsKLSAgICAgICAgICAgIHAgPSB3aXJlLT5wYXRoKGopOwotICAgICAgICAgICAgcC0+aW5pdFRyYXZlcnNlKCk7Ci0gICAgICAgICAgICBpZiAodGVzdERlYnVnUHJpbnQpIHsKLSAgICAgICAgICAgICAgICBwLT5wcmludChmb3V0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKChwYXRoID0gKGludClwLT5uZXh0KCkpICE9IERFRklQQVRIX0RPTkUpIHsKLSAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAvLyBEb24ndCB3YW50IHRoZSBsaW5lIHRvIGJlIHRvbyBsb25nCi0gICAgICAgICAgICAgICAgICBpZiAoY291bnQgPj0gNSkgewotICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgY291bnQgPSAwOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgc3dpdGNoIChwYXRoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfTEFZRVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0xheWVyID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgcC0+Z2V0TGF5ZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xheWVyID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTkVXICVzICIsIHAtPmdldExheWVyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1ZJQToKLSAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAiLCBpZ25vcmVWaWFOYW1lcyA/ICJYWFgiIDogcC0+Z2V0VmlhKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1ZJQVJPVEFUSU9OOgotICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzICIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50U3RyKHAtPmdldFZpYVJvdGF0aW9uKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9WSUFEQVRBOgotICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmdldFZpYURhdGEoJm51bVgsICZudW1ZLCAmc3RlcFgsICZzdGVwWSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiRE8gJWQgQlkgJWQgU1RFUCAlZCAlZCAiLCBudW1YLCBudW1ZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFgsIHN0ZXBZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9XSURUSDoKLSAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlZCAiLCBwLT5nZXRXaWR0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9NQVNLOgotICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIk1BU0sgJWQgIiwgcC0+Z2V0TWFzaygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9WSUFNQVNLOgotICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIk1BU0sgJWQlZCVkICIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+Z2V0VmlhVG9wTWFzaygpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmdldFZpYUN1dE1hc2soKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmdldFZpYUJvdHRvbU1hc2soKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9QT0lOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRQb2ludCgmeCwgJnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiggJWQgJWQgKSAiLCB4LCB5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9GTFVTSFBPSU5UOgotICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmdldEZsdXNoUG9pbnQoJngsICZ5LCAmeik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKCAlZCAlZCAlZCApICIsIHgsIHksIHopOwotICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1RBUEVSOgotICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlRBUEVSICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1NIQVBFOgotICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgU0hBUEUgJXMgIiwgcC0+Z2V0U2hhcGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfU1RZTEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBTVFlMRSAlZCAiLCBwLT5nZXRTdHlsZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICBjb3VudCA9IDA7Ci0gICAgIH0KLSAgfQotCi0gIC8vIFBPTFlHT04KLSAgaWYgKG5ldC0+bnVtUG9seWdvbnMoKSkgewotICAgIHN0cnVjdCBkZWZpUG9pbnRzIHBvaW50czsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBuZXQtPm51bVBvbHlnb25zKCk7IGkrKykgewotICAgICAgaWYgKGN1clZlciA+PSA1LjggKSB7Ci0JIGlmIChzdHJjbXAobmV0LT5wb2x5Um91dGVTdGF0dXMoaSksICIiKSAhPSAwKSB7Ci0JICAgZnByaW50Zihmb3V0LCAiXG4gICsgJXMgIiwgbmV0LT5wb2x5Um91dGVTdGF0dXMoaSkpOwotCSAgIGlmIChzdHJjbXAobmV0LT5wb2x5Um91dGVTdGF0dXMoaSksICJTSElFTEQiKSA9PSAwKSB7Ci0JICAgICAgZnByaW50Zihmb3V0LCAiXG4gICsgJXMgIiwgbmV0LT5wb2x5Um91dGVTdGF0dXNTaGllbGROYW1lKGkpKTsKLQkgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoc3RyY21wKG5ldC0+cG9seVNoYXBlVHlwZShpKSwgIiIpICE9IDApIHsKLQkgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBTSEFQRSAlcyAiLCBuZXQtPnBvbHlTaGFwZVR5cGUoaSkpOwotICAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKG5ldC0+cG9seU1hc2soaSkpIHsKLQkgIGZwcmludGYoZm91dCwgIlxuICArIE1BU0sgJWQgKyBQT0xZR09OICUgcyAiLCBuZXQtPnBvbHlNYXNrKGkpLAotCQkgIG5ldC0+cG9seWdvbk5hbWUoaSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBQT0xZR09OICVzICIsIG5ldC0+cG9seWdvbk5hbWUoaSkpOwotICAgICAgfQotICAgICAgcG9pbnRzID0gbmV0LT5nZXRQb2x5Z29uKGkpOwotICAgICAgZm9yIChqID0gMDsgaiA8IHBvaW50cy5udW1Qb2ludHM7IGorKykKLSAgICAgICAgZnByaW50Zihmb3V0LCAiJWQgJWQgIiwgcG9pbnRzLnhbal0sIHBvaW50cy55W2pdKTsKLSAgICB9Ci0gIH0KLSAgLy8gUkVDVAotICBpZiAobmV0LT5udW1SZWN0YW5nbGVzKCkpIHsKLQotICAgICBmb3IgKGkgPSAwOyBpIDwgbmV0LT5udW1SZWN0YW5nbGVzKCk7IGkrKykgewotICAgICAgIGlmIChjdXJWZXIgPj0gNS44ICkgewotCSBpZiAoc3RyY21wKG5ldC0+cmVjdFJvdXRlU3RhdHVzKGkpLCAiIikgIT0gMCkgewotCSAgIGZwcmludGYoZm91dCwgIlxuICArICVzICIsIG5ldC0+cmVjdFJvdXRlU3RhdHVzKGkpKTsKLQkgICBpZiAoc3RyY21wKG5ldC0+cmVjdFJvdXRlU3RhdHVzKGkpLCAiU0hJRUxEIikgPT0gMCkgewotCSAgICAgIGZwcmludGYoZm91dCwgIlxuICArICVzICIsIG5ldC0+cmVjdFJvdXRlU3RhdHVzU2hpZWxkTmFtZShpKSk7Ci0JICAgfQotICAgICAgICAgfQotICAgICAgICAgaWYgKHN0cmNtcChuZXQtPnJlY3RTaGFwZVR5cGUoaSksICIiKSAhPSAwKSB7Ci0JICAgZnByaW50Zihmb3V0LCAiXG4gICsgU0hBUEUgJXMgIiwgbmV0LT5yZWN0U2hhcGVUeXBlKGkpKTsKLSAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgICAgaWYgKG5ldC0+cmVjdE1hc2soaSkpIHsKLQkgIGZwcmludGYoZm91dCwgIlxuICArIE1BU0sgJWQgKyBSRUNUICVzICVkICVkICVkICVkIiwgCi0JCSAgbmV0LT5yZWN0TWFzayhpKSwgbmV0LT5yZWN0TmFtZShpKSwKLQkJICBuZXQtPnhsKGkpLCBuZXQtPnlsKGkpLCBuZXQtPnhoKGkpLAotICAgICAgICAgICAgICAgICAgbmV0LT55aChpKSk7Ci0gICAgICAgfSBlbHNlIHsKLQkgICAgZnByaW50Zihmb3V0LCAiXG4gICsgUkVDVCAlcyAlZCAlZCAlZCAlZCIsIAotCQkgICAgbmV0LT5yZWN0TmFtZShpKSwKLSAgICAgICAgICAgICAgICAgICAgbmV0LT54bChpKSwgCi0JCSAgICBuZXQtPnlsKGkpLCAKLQkJICAgIG5ldC0+eGgoaSksCi0gICAgICAgICAgICAgICAgICAgIG5ldC0+eWgoaSkpOwotICAgICAgfQotICAgICB9Ci0gIH0KLSAgLy8gVklBCi0gIGlmIChjdXJWZXIgPj0gNS44ICYmIG5ldC0+bnVtVmlhU3BlY3MoKSkgewotICAgICBmb3IgKGkgPSAwOyBpIDwgbmV0LT5udW1WaWFTcGVjcygpOyBpKyspIHsKLSAgICAgICBpZiAoc3RyY21wKG5ldC0+dmlhUm91dGVTdGF0dXMoaSksICIiKSAhPSAwKSB7Ci0JZnByaW50Zihmb3V0LCAiXG4gICsgJXMgIiwgbmV0LT52aWFSb3V0ZVN0YXR1cyhpKSk7Ci0JaWYgKHN0cmNtcChuZXQtPnZpYVJvdXRlU3RhdHVzKGkpLCAiU0hJRUxEIikgPT0gMCkgewotCSAgICAgIGZwcmludGYoZm91dCwgIlxuICArICVzICIsIG5ldC0+dmlhUm91dGVTdGF0dXNTaGllbGROYW1lKGkpKTsKLQkgICB9Ci0gICAgICAgfQotICAgICAgIGlmIChzdHJjbXAobmV0LT52aWFTaGFwZVR5cGUoaSksICIiKSAhPSAwKSB7Ci0JZnByaW50Zihmb3V0LCAiXG4gICsgU0hBUEUgJXMgIiwgbmV0LT52aWFTaGFwZVR5cGUoaSkpOwotICAgICAgIH0KLSAgICAgICBpZiAobmV0LT50b3BNYXNrTnVtKGkpIHx8IG5ldC0+Y3V0TWFza051bShpKSB8fCBuZXQtPmJvdHRvbU1hc2tOdW0oaSkpIHsKLQlmcHJpbnRmKGZvdXQsICJcbiAgKyBNQVNLICVkJWQlZCArIFZJQSAlcyAiLCBuZXQtPnRvcE1hc2tOdW0oaSksIAotICAgICAgICAgICAgICAgIG5ldC0+Y3V0TWFza051bShpKSwKLSAgICAgICAgICAgICAgICBuZXQtPmJvdHRvbU1hc2tOdW0oaSksCi0JCW5ldC0+dmlhTmFtZShpKSk7Ci0gICAgICAgfSBlbHNlIHsKLQlmcHJpbnRmKGZvdXQsICJcbiAgKyBWSUEgJXMgIiwgbmV0LT52aWFOYW1lKGkpKTsKLSAgICAgICB9Ci0gICAgICAgZnByaW50Zihmb3V0LCAiICVzIiwgbmV0LT52aWFPcmllbnRTdHIoaSkpOwotICAgICAgCi0gICAgICAgZGVmaVBvaW50cyBwb2ludHMgPSBuZXQtPmdldFZpYVB0cyhpKTsKLQotICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcG9pbnRzLm51bVBvaW50czsgaisrKSB7Ci0gICAgICAgICAgZnByaW50Zihmb3V0LCAiICVkICVkIiwgcG9pbnRzLnhbal0sIHBvaW50cy55W2pdKTsKLSAgICAgICB9Ci0gICAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7IAotCi0gICAgIH0KLSAgfQotCi0gIGlmIChuZXQtPmhhc1N1Ym5ldHMoKSkgewotICAgIGZvciAoaSA9IDA7IGkgPCBuZXQtPm51bVN1Ym5ldHMoKTsgaSsrKSB7Ci0gICAgICBzID0gbmV0LT5zdWJuZXQoaSk7Ci0gICAgICBpZiAocy0+bnVtQ29ubmVjdGlvbnMoKSkgewotICAgICAgICAgIGlmIChzLT5waW5Jc011c3RKb2luKDApKQotICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICItIE1VU1RKT0lOICIpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiLSAlcyAiLCBzLT5uYW1lKCkpOwotICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzLT5udW1Db25uZWN0aW9ucygpOyBqKyspIHsKLSAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICggJXMgJXMgKVxuIiwgcy0+aW5zdGFuY2UoaiksCi0gICAgICAgICAgICAgICAgICAgICAgcy0+cGluKGopKTsKLSAgICAgICAgfQotICAgICAgfQotIAotICAgICAgLy8gcmVndWxhcldpcmluZwotICAgICAgaWYgKHMtPm51bVdpcmVzKCkpIHsKLSAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5udW1XaXJlcygpOyBpKyspIHsKLSAgICAgICAgICAgIHdpcmUgPSBzLT53aXJlKGkpOwotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICArICVzICIsIHdpcmUtPndpcmVUeXBlKCkpOwotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpcmUtPm51bVBhdGhzKCk7IGorKykgewotICAgICAgICAgICAgICBwID0gd2lyZS0+cGF0aChqKTsKLSAgICAgICAgICAgICAgcC0+cHJpbnQoZm91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKG5ldC0+bnVtUHJvcHMoKSkgewotICAgIGZvciAoaSA9IDA7IGkgPCBuZXQtPm51bVByb3BzKCk7IGkrKykgewotICAgICAgICBpZiAobmV0LT5wcm9wSXNTdHJpbmcoaSkpCi0gICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgKyBQUk9QRVJUWSAlcyAlcyAiLCBuZXQtPnByb3BOYW1lKGkpLAotICAgICAgICAgICAgICAgICAgIG5ldC0+cHJvcFZhbHVlKGkpKTsKLSAgICAgICAgaWYgKG5ldC0+cHJvcElzTnVtYmVyKGkpKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICsgUFJPUEVSVFkgJXMgJWcgIiwgbmV0LT5wcm9wTmFtZShpKSwKLSAgICAgICAgICAgICAgICAgICBuZXQtPnByb3BOdW1iZXIoaSkpOwotICAgICAgICBzd2l0Y2ggKG5ldC0+cHJvcFR5cGUoaSkpIHsKLSAgICAgICAgICAgY2FzZSAnUic6IGZwcmludGYoZm91dCwgIlJFQUwgIik7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgY2FzZSAnSSc6IGZwcmludGYoZm91dCwgIklOVEVHRVIgIik7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgY2FzZSAnUyc6IGZwcmludGYoZm91dCwgIlNUUklORyAiKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICBjYXNlICdRJzogZnByaW50Zihmb3V0LCAiUVVPVEVTVFJJTkcgIik7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgY2FzZSAnTic6IGZwcmludGYoZm91dCwgIk5VTUJFUiAiKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgfQotICB9Ci0KLSAgLy8gU0hJRUxECi0gIGNvdW50ID0gMDsKLSAgLy8gdGVzdGluZyB0aGUgU0hJRUxEIGZvciA1LjMsIG9ic29sZXRlIGluIDUuNAotICBpZiAobmV0LT5udW1TaGllbGRzKCkpIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbmV0LT5udW1TaGllbGRzKCk7IGkrKykgewotICAgICAgIHNoaWVsZCA9IG5ldC0+c2hpZWxkKGkpOwotICAgICAgIGZwcmludGYoZm91dCwgIlxuICArIFNISUVMRCAlcyAiLCBzaGllbGQtPnNoaWVsZE5hbWUoKSk7Ci0gICAgICAgbmV3TGF5ZXIgPSAwOwotICAgICAgIGZvciAoaiA9IDA7IGogPCBzaGllbGQtPm51bVBhdGhzKCk7IGorKykgewotICAgICAgICAgIHAgPSBzaGllbGQtPnBhdGgoaik7Ci0gICAgICAgICAgcC0+aW5pdFRyYXZlcnNlKCk7Ci0gICAgICAgICAgd2hpbGUgKChwYXRoID0gKGludClwLT5uZXh0KCkpICE9IERFRklQQVRIX0RPTkUpIHsKLSAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgIC8vIERvbid0IHdhbnQgdGhlIGxpbmUgdG8gYmUgdG9vIGxvbmcKLSAgICAgICAgICAgICBpZiAoY291bnQgPj0gNSkgewotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgICAgICAgICBjb3VudCA9IDA7Ci0gICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICBzd2l0Y2ggKHBhdGgpIHsKLSAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfTEFZRVI6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXdMYXllciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAiLCBwLT5nZXRMYXllcigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xheWVyID0gMTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJORVcgJXMgIiwgcC0+Z2V0TGF5ZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9WSUE6Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzICIsIGlnbm9yZVZpYU5hbWVzID8gIlhYWCIgOiBwLT5nZXRWaWEoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9WSUFST1RBVElPTjoKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50U3RyKHAtPmdldFZpYVJvdGF0aW9uKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1dJRFRIOgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlZCAiLCBwLT5nZXRXaWR0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0JICAgICAgIGNhc2UgREVGSVBBVEhfTUFTSzoKLQkJICAgIGZwcmludGYoZm91dCwgIk1BU0sgJWQgIiwgcC0+Z2V0TWFzaygpKTsKLQkJICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9WSUFNQVNLOgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJNQVNLICVkJWQlZCAiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRWaWFUb3BNYXNrKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmdldFZpYUN1dE1hc2soKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRWaWFCb3R0b21NYXNrKCkpOwotICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9QT0lOVDoKLSAgICAgICAgICAgICAgICAgICAgcC0+Z2V0UG9pbnQoJngsICZ5KTsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKCAlZCAlZCApICIsIHgsIHkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfRkxVU0hQT0lOVDoKLSAgICAgICAgICAgICAgICAgICAgcC0+Z2V0Rmx1c2hQb2ludCgmeCwgJnksICZ6KTsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKCAlZCAlZCAlZCApICIsIHgsIHksIHopOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfVEFQRVI6Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlRBUEVSICIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfU0hBUEU6Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgU0hBUEUgJXMgIiwgcC0+Z2V0U2hhcGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9TVFlMRToKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBTVFlMRSAlZCAiLCBwLT5nZXRTdHlsZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gbGF5ZXJOYW1lIHdpZHRoCi0gIGlmIChuZXQtPmhhc1dpZHRoUnVsZXMoKSkgewotICAgIGZvciAoaSA9IDA7IGkgPCBuZXQtPm51bVdpZHRoUnVsZXMoKTsgaSsrKSB7Ci0gICAgICAgIG5ldC0+d2lkdGhSdWxlKGksICZsYXllck5hbWUsICZkaXN0KTsKLSAgICAgICAgZnByaW50ZiAoZm91dCwgIlxuICArIFdJRFRIICVzICVnICIsIGxheWVyTmFtZSwgZGlzdCk7Ci0gICAgfQotICB9Ci0KLSAgLy8gbGF5ZXJOYW1lIHNwYWNpbmcKLSAgaWYgKG5ldC0+aGFzU3BhY2luZ1J1bGVzKCkpIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbmV0LT5udW1TcGFjaW5nUnVsZXMoKTsgaSsrKSB7Ci0gICAgICAgIG5ldC0+c3BhY2luZ1J1bGUoaSwgJmxheWVyTmFtZSwgJmRpc3QsICZsZWZ0LCAmcmlnaHQpOwotICAgICAgICBpZiAobGVmdCA9PSByaWdodCkKLSAgICAgICAgICAgIGZwcmludGYgKGZvdXQsICJcbiAgKyBTUEFDSU5HICVzICVnICIsIGxheWVyTmFtZSwgZGlzdCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZwcmludGYgKGZvdXQsICJcbiAgKyBTUEFDSU5HICVzICVnIFJBTkdFICVnICVnICIsCi0gICAgICAgICAgICAgICAgICAgICBsYXllck5hbWUsIGRpc3QsIGxlZnQsIHJpZ2h0KTsKLSAgICB9Ci0gIH0KLQotICBpZiAobmV0LT5oYXNGaXhlZGJ1bXAoKSkKLSAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBGSVhFREJVTVAgIik7Ci0gIGlmIChuZXQtPmhhc0ZyZXF1ZW5jeSgpKQotICAgIGZwcmludGYoZm91dCwgIlxuICArIEZSRVFVRU5DWSAlZyAiLCBuZXQtPmZyZXF1ZW5jeSgpKTsKLSAgaWYgKG5ldC0+aGFzVm9sdGFnZSgpKQotICAgIGZwcmludGYoZm91dCwgIlxuICArIFZPTFRBR0UgJWcgIiwgbmV0LT52b2x0YWdlKCkpOwotICBpZiAobmV0LT5oYXNXZWlnaHQoKSkKLSAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBXRUlHSFQgJWQgIiwgbmV0LT53ZWlnaHQoKSk7Ci0gIGlmIChuZXQtPmhhc0NhcCgpKQotICAgIGZwcmludGYoZm91dCwgIlxuICArIEVTVENBUCAlZyAiLCBuZXQtPmNhcCgpKTsKLSAgaWYgKG5ldC0+aGFzU291cmNlKCkpCi0gICAgZnByaW50Zihmb3V0LCAiXG4gICsgU09VUkNFICVzICIsIG5ldC0+c291cmNlKCkpOwotICBpZiAobmV0LT5oYXNQYXR0ZXJuKCkpCi0gICAgZnByaW50Zihmb3V0LCAiXG4gICsgUEFUVEVSTiAlcyAiLCBuZXQtPnBhdHRlcm4oKSk7Ci0gIGlmIChuZXQtPmhhc09yaWdpbmFsKCkpCi0gICAgZnByaW50Zihmb3V0LCAiXG4gICsgT1JJR0lOQUwgJXMgIiwgbmV0LT5vcmlnaW5hbCgpKTsKLSAgaWYgKG5ldC0+aGFzVXNlKCkpCi0gICAgZnByaW50Zihmb3V0LCAiXG4gICsgVVNFICVzICIsIG5ldC0+dXNlKCkpOwotCi0gIGZwcmludGYgKGZvdXQsICI7XG4iKTsKLSAgLS1udW1PYmpzOwotICBpZiAobnVtT2JqcyA8PSAwKQotICAgICAgZnByaW50Zihmb3V0LCAiRU5EIFNQRUNJQUxORVRTXG4iKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotaW50IG5kcihkZWZyQ2FsbGJhY2tUeXBlX2UgYywgZGVmaU5vbkRlZmF1bHQqIG5kLCBkZWZpVXNlckRhdGEgdWQpIHsKLSAgLy8gRm9yIG5vbmRlZmF1bHRydWxlCi0gIGludCBpOwotCi0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgaWYgKGMgIT0gZGVmck5vbkRlZmF1bHRDYmtUeXBlKQotICAgICAgZnByaW50Zihmb3V0LCAiQk9HVVMgTk9OREVGQVVMVFJVTEUgVFlQRSAgIik7Ci0gIGZwcmludGYoZm91dCwgIi0gJXNcbiIsIG5kLT5uYW1lKCkpOwotICBpZiAobmQtPmhhc0hhcmRzcGFjaW5nKCkpCi0gICAgICBmcHJpbnRmKGZvdXQsICIgICArIEhBUkRTUEFDSU5HXG4iKTsKLSAgZm9yIChpID0gMDsgaSA8IG5kLT5udW1MYXllcnMoKTsgaSsrKSB7Ci0gICAgZnByaW50Zihmb3V0LCAiICAgKyBMQVlFUiAlcyIsIG5kLT5sYXllck5hbWUoaSkpOwotICAgIGZwcmludGYoZm91dCwgIiBXSURUSCAlZCIsIG5kLT5sYXllcldpZHRoVmFsKGkpKTsKLSAgICBpZiAobmQtPmhhc0xheWVyRGlhZ1dpZHRoKGkpKSAKLSAgICAgIGZwcmludGYoZm91dCwgIiBESUFHV0lEVEggJWQiLAotICAgICAgICAgICAgICBuZC0+bGF5ZXJEaWFnV2lkdGhWYWwoaSkpOwotICAgIGlmIChuZC0+aGFzTGF5ZXJTcGFjaW5nKGkpKSAKLSAgICAgIGZwcmludGYoZm91dCwgIiBTUEFDSU5HICVkIiwgbmQtPmxheWVyU3BhY2luZ1ZhbChpKSk7Ci0gICAgaWYgKG5kLT5oYXNMYXllcldpcmVFeHQoaSkpIAotICAgICAgZnByaW50Zihmb3V0LCAiIFdJUkVFWFQgJWQiLCBuZC0+bGF5ZXJXaXJlRXh0VmFsKGkpKTsKLSAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICB9Ci0gIGZvciAoaSA9IDA7IGkgPCBuZC0+bnVtVmlhcygpOyBpKyspCi0gICAgZnByaW50Zihmb3V0LCAiICAgKyBWSUEgJXNcbiIsIG5kLT52aWFOYW1lKGkpKTsKLSAgZm9yIChpID0gMDsgaSA8IG5kLT5udW1WaWFSdWxlcygpOyBpKyspCi0gICAgZnByaW50Zihmb3V0LCAiICAgKyBWSUFSVUxFICVzXG4iLCBpZ25vcmVWaWFOYW1lcyA/ICJYWFgiIDogbmQtPnZpYVJ1bGVOYW1lKGkpKTsKLSAgZm9yIChpID0gMDsgaSA8IG5kLT5udW1NaW5DdXRzKCk7IGkrKykKLSAgICBmcHJpbnRmKGZvdXQsICIgICArIE1JTkNVVFMgJXMgJWRcbiIsIG5kLT5jdXRMYXllck5hbWUoaSksCi0gICAgICAgICAgICBuZC0+bnVtQ3V0cyhpKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBuZC0+bnVtUHJvcHMoKTsgaSsrKSB7Ci0gICAgZnByaW50Zihmb3V0LCAiICAgKyBQUk9QRVJUWSAlcyAlcyAiLCBuZC0+cHJvcE5hbWUoaSksCi0gICAgICAgICAgICBuZC0+cHJvcFZhbHVlKGkpKTsKLSAgICBzd2l0Y2ggKG5kLT5wcm9wVHlwZShpKSkgewotICAgICAgY2FzZSAnUic6IGZwcmludGYoZm91dCwgIlJFQUxcbiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnSSc6IGZwcmludGYoZm91dCwgIklOVEVHRVJcbiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnUyc6IGZwcmludGYoZm91dCwgIlNUUklOR1xuIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdRJzogZnByaW50Zihmb3V0LCAiUVVPVEVTVFJJTkdcbiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnTic6IGZwcmludGYoZm91dCwgIk5VTUJFUlxuIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIC0tbnVtT2JqczsKLSAgaWYgKG51bU9ianMgPD0gMCkKLSAgICBmcHJpbnRmKGZvdXQsICJFTkQgTk9OREVGQVVMVFJVTEVTXG4iKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludCB0bmFtZShkZWZyQ2FsbGJhY2tUeXBlX2UgYywgY29uc3QgY2hhciogc3RyaW5nLCBkZWZpVXNlckRhdGEgdWQpIHsKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBmcHJpbnRmKGZvdXQsICJURUNITk9MT0dZICVzIDtcbiIsIHN0cmluZyk7Ci0gIHJldHVybiAwOwotfQotCi1pbnQgZG5hbWUoZGVmckNhbGxiYWNrVHlwZV9lIGMsIGNvbnN0IGNoYXIqIHN0cmluZywgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgZnByaW50Zihmb3V0LCAiREVTSUdOICVzIDtcbiIsIHN0cmluZyk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotY2hhciogYWRkcmVzcyhjb25zdCBjaGFyKiBpbikgewotICByZXR1cm4gKChjaGFyKilpbik7Ci19Ci0KLWludCBjcyhkZWZyQ2FsbGJhY2tUeXBlX2UgYywgaW50IG51bSwgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGNoYXIqIG5hbWU7Ci0KLSAgY2hlY2tUeXBlKGMpOwotCi0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0KLSAgc3dpdGNoIChjKSB7Ci0gIGNhc2UgZGVmckNvbXBvbmVudFN0YXJ0Q2JrVHlwZSA6IG5hbWUgPSBhZGRyZXNzKCJDT01QT05FTlRTIik7IGJyZWFrOwotICBjYXNlIGRlZnJOZXRTdGFydENia1R5cGUgOiBuYW1lID0gYWRkcmVzcygiTkVUUyIpOyBicmVhazsKLSAgY2FzZSBkZWZyU3RhcnRQaW5zQ2JrVHlwZSA6IG5hbWUgPSBhZGRyZXNzKCJQSU5TIik7IGJyZWFrOwotICBjYXNlIGRlZnJWaWFTdGFydENia1R5cGUgOiBuYW1lID0gYWRkcmVzcygiVklBUyIpOyBicmVhazsKLSAgY2FzZSBkZWZyUmVnaW9uU3RhcnRDYmtUeXBlIDogbmFtZSA9IGFkZHJlc3MoIlJFR0lPTlMiKTsgYnJlYWs7Ci0gIGNhc2UgZGVmclNOZXRTdGFydENia1R5cGUgOiBuYW1lID0gYWRkcmVzcygiU1BFQ0lBTE5FVFMiKTsgYnJlYWs7Ci0gIGNhc2UgZGVmckdyb3Vwc1N0YXJ0Q2JrVHlwZSA6IG5hbWUgPSBhZGRyZXNzKCJHUk9VUFMiKTsgYnJlYWs7Ci0gIGNhc2UgZGVmclNjYW5jaGFpbnNTdGFydENia1R5cGUgOiBuYW1lID0gYWRkcmVzcygiU0NBTkNIQUlOUyIpOyBicmVhazsKLSAgY2FzZSBkZWZySU9UaW1pbmdzU3RhcnRDYmtUeXBlIDogbmFtZSA9IGFkZHJlc3MoIklPVElNSU5HUyIpOyBicmVhazsKLSAgY2FzZSBkZWZyRlBDU3RhcnRDYmtUeXBlIDogbmFtZSA9IGFkZHJlc3MoIkZMT09SUExBTkNPTlNUUkFJTlRTIik7IGJyZWFrOwotICBjYXNlIGRlZnJUaW1pbmdEaXNhYmxlc1N0YXJ0Q2JrVHlwZSA6IG5hbWUgPSBhZGRyZXNzKCJUSU1JTkcgRElTQUJMRVMiKTsgYnJlYWs7Ci0gIGNhc2UgZGVmclBhcnRpdGlvbnNTdGFydENia1R5cGUgOiBuYW1lID0gYWRkcmVzcygiUEFSVElUSU9OUyIpOyBicmVhazsKLSAgY2FzZSBkZWZyUGluUHJvcFN0YXJ0Q2JrVHlwZSA6IG5hbWUgPSBhZGRyZXNzKCJQSU5QUk9QRVJUSUVTIik7IGJyZWFrOwotICBjYXNlIGRlZnJCbG9ja2FnZVN0YXJ0Q2JrVHlwZSA6IG5hbWUgPSBhZGRyZXNzKCJCTE9DS0FHRVMiKTsgYnJlYWs7Ci0gIGNhc2UgZGVmclNsb3RTdGFydENia1R5cGUgOiBuYW1lID0gYWRkcmVzcygiU0xPVFMiKTsgYnJlYWs7Ci0gIGNhc2UgZGVmckZpbGxTdGFydENia1R5cGUgOiBuYW1lID0gYWRkcmVzcygiRklMTFMiKTsgYnJlYWs7Ci0gIGNhc2UgZGVmck5vbkRlZmF1bHRTdGFydENia1R5cGUgOiBuYW1lID0gYWRkcmVzcygiTk9OREVGQVVMVFJVTEVTIik7IGJyZWFrOwotICBjYXNlIGRlZnJTdHlsZXNTdGFydENia1R5cGUgOiBuYW1lID0gYWRkcmVzcygiU1RZTEVTIik7IGJyZWFrOwotICBkZWZhdWx0IDogbmFtZSA9IGFkZHJlc3MoIkJPR1VTIik7IHJldHVybiAxOwotICB9Ci0gIGZwcmludGYoZm91dCwgIlxuJXMgJWQgO1xuIiwgbmFtZSwgbnVtKTsKLSAgbnVtT2JqcyA9IG51bTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBjb25zdHJhaW50c3QoZGVmckNhbGxiYWNrVHlwZV9lIGMsIGludCBudW0sIGRlZmlVc2VyRGF0YSB1ZCkgewotICAvLyBIYW5kbGVzIGJvdGggY29uc3RyYWludHMgYW5kIGFzc2VydGlvbnMKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBpZiAoYyA9PSBkZWZyQ29uc3RyYWludHNTdGFydENia1R5cGUpCi0gICAgICBmcHJpbnRmKGZvdXQsICJcbkNPTlNUUkFJTlRTICVkIDtcblxuIiwgbnVtKTsKLSAgZWxzZQotICAgICAgZnByaW50Zihmb3V0LCAiXG5BU1NFUlRJT05TICVkIDtcblxuIiwgbnVtKTsKLSAgbnVtT2JqcyA9IG51bTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgb3BlcmFuZChkZWZyQ2FsbGJhY2tUeXBlX2UgYywgZGVmaUFzc2VydGlvbiogYSwgaW50IGluZCkgewotICBpbnQgaSwgZmlyc3QgPSAxOwotICBjaGFyKiBuZXROYW1lOwotICBjaGFyKiBmcm9tSW5zdCwgKiBmcm9tUGluLCAqIHRvSW5zdCwgKiB0b1BpbjsKLQotICBpZiAoYS0+aXNTdW0oKSkgewotICAgICAgLy8gU3VtIGluIG9wZXJhbmQsIHJlY3Vyc2l2ZWx5IGNhbGwgb3BlcmFuZAotICAgICAgZnByaW50Zihmb3V0LCAiLSBTVU0gKCAiKTsKLSAgICAgIGEtPnVuc2V0U3VtKCk7Ci0gICAgICBpc1N1bVNldCA9IDE7Ci0gICAgICBiZWdPcGVyYW5kID0gMDsKLSAgICAgIG9wZXJhbmQgKGMsIGEsIGluZCk7Ci0gICAgICBmcHJpbnRmKGZvdXQsICIpICIpOwotICB9IGVsc2UgewotICAgICAgLy8gb3BlcmFuZAotICAgICAgaWYgKGluZCA+PSBhLT5udW1JdGVtcygpKSB7Ci0gICAgICAgICAgZnByaW50Zihmb3V0LCAiRVJST1I6IHdoZW4gd3JpdGluZyBvdXQgU1VNIGluIENvbnN0cmFpbnRzLlxuIik7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgIH0KLSAgICAgIGlmIChiZWdPcGVyYW5kKSB7Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICItICIpOwotICAgICAgICAgYmVnT3BlcmFuZCA9IDA7Ci0gICAgICB9Ci0gICAgICBmb3IgKGkgPSBpbmQ7IGkgPCBhLT5udW1JdGVtcygpOyBpKyspIHsKLSAgICAgICAgICBpZiAoYS0+aXNOZXQoaSkpIHsKLSAgICAgICAgICAgICAgYS0+bmV0KGksICZuZXROYW1lKTsKLSAgICAgICAgICAgICAgaWYgKCFmaXJzdCkKLSAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiwgIik7IC8vIHByaW50ICwgYXMgc2VwYXJhdG9yCi0gICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIk5FVCAlcyAiLCBuZXROYW1lKTsgCi0gICAgICAgICAgfSBlbHNlIGlmIChhLT5pc1BhdGgoaSkpIHsKLSAgICAgICAgICAgICAgYS0+cGF0aChpLCAmZnJvbUluc3QsICZmcm9tUGluLCAmdG9JbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b1Bpbik7Ci0gICAgICAgICAgICAgIGlmICghZmlyc3QpCi0gICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIsICIpOwotICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJQQVRIICVzICVzICVzICVzICIsIGZyb21JbnN0LCBmcm9tUGluLCB0b0luc3QsCi0gICAgICAgICAgICAgICAgICAgICAgdG9QaW4pOwotICAgICAgICAgIH0gZWxzZSBpZiAoaXNTdW1TZXQpIHsKLSAgICAgICAgICAgICAgLy8gU1VNIHdpdGhpbiBTVU0sIHJlc2V0IHRoZSBmbGFnCi0gICAgICAgICAgICAgIGEtPnNldFN1bSgpOwotICAgICAgICAgICAgICBvcGVyYW5kKGMsIGEsIGkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBmaXJzdCA9IDA7Ci0gICAgICB9IAotICAgICAgCi0gIH0KLX0KLQotaW50IGNvbnN0cmFpbnQoZGVmckNhbGxiYWNrVHlwZV9lIGMsIGRlZmlBc3NlcnRpb24qIGEsIGRlZmlVc2VyRGF0YSB1ZCkgewotICAvLyBIYW5kbGVzIGJvdGggY29uc3RyYWludHMgYW5kIGFzc2VydGlvbnMKLQotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGlmIChhLT5pc1dpcmVkbG9naWMoKSkKLSAgICAgIC8vIFdpcmVsb2dpYwotICAgICAgZnByaW50Zihmb3V0LCAiLSBXSVJFRExPR0lDICVzICsgTUFYRElTVCAlZyA7XG4iLAotLy8gV2lyZWRsb2dpYyBkaXN0IGlzIGFsc28gc3RvcmUgaW4gZmFsbE1heAotLy8gICAgICAgICAgICAgIGEtPm5ldE5hbWUoKSwgYS0+ZGlzdGFuY2UoKSk7Ci0gICAgICAgICAgICAgIGEtPm5ldE5hbWUoKSwgYS0+ZmFsbE1heCgpKTsKLSAgZWxzZSB7Ci0gICAgICAvLyBDYWxsIHRoZSBvcGVyYW5kIGZ1bmN0aW9uCi0gICAgICBpc1N1bVNldCA9IDA7ICAgIC8vIHJlc2V0IHRoZSBnbG9iYWwgdmFyaWFibGUKLSAgICAgIGJlZ09wZXJhbmQgPSAxOwotICAgICAgb3BlcmFuZCAoYywgYSwgMCk7Ci0gICAgICAvLyBHZXQgdGhlIFJpc2UgYW5kIEZhbGwKLSAgICAgIGlmIChhLT5oYXNSaXNlTWF4KCkpCi0gICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBSSVNFTUFYICVnICIsIGEtPnJpc2VNYXgoKSk7Ci0gICAgICBpZiAoYS0+aGFzRmFsbE1heCgpKQotICAgICAgICAgIGZwcmludGYoZm91dCwgIisgRkFMTE1BWCAlZyAiLCBhLT5mYWxsTWF4KCkpOwotICAgICAgaWYgKGEtPmhhc1Jpc2VNaW4oKSkKLSAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIFJJU0VNSU4gJWcgIiwgYS0+cmlzZU1pbigpKTsKLSAgICAgIGlmIChhLT5oYXNGYWxsTWluKCkpCi0gICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBGQUxMTUlOICVnICIsIGEtPmZhbGxNaW4oKSk7Ci0gICAgICBmcHJpbnRmKGZvdXQsICI7XG4iKTsKLSAgfQotICAtLW51bU9ianM7Ci0gIGlmIChudW1PYmpzIDw9IDApIHsKLSAgICAgIGlmIChjID09IGRlZnJDb25zdHJhaW50Q2JrVHlwZSkKLSAgICAgICAgICBmcHJpbnRmKGZvdXQsICJFTkQgQ09OU1RSQUlOVFNcbiIpOwotICAgICAgZWxzZSAKLSAgICAgICAgICBmcHJpbnRmKGZvdXQsICJFTkQgQVNTRVJUSU9OU1xuIik7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotaW50IHByb3BzdGFydChkZWZyQ2FsbGJhY2tUeXBlX2UgYywgdm9pZCosIGRlZmlVc2VyRGF0YSkgewotICBjaGVja1R5cGUoYyk7Ci0gIGZwcmludGYoZm91dCwgIlxuUFJPUEVSVFlERUZJTklUSU9OU1xuIik7Ci0gIGlzUHJvcCA9IDE7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotaW50IHByb3AoZGVmckNhbGxiYWNrVHlwZV9lIGMsIGRlZmlQcm9wKiBwLCBkZWZpVXNlckRhdGEgdWQpIHsKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBpZiAoc3RyY21wKHAtPnByb3BUeXBlKCksICJkZXNpZ24iKSA9PSAwKQotICAgICAgZnByaW50Zihmb3V0LCAiREVTSUdOICVzICIsIHAtPnByb3BOYW1lKCkpOwotICBlbHNlIGlmIChzdHJjbXAocC0+cHJvcFR5cGUoKSwgIm5ldCIpID09IDApCi0gICAgICBmcHJpbnRmKGZvdXQsICJORVQgJXMgIiwgcC0+cHJvcE5hbWUoKSk7Ci0gIGVsc2UgaWYgKHN0cmNtcChwLT5wcm9wVHlwZSgpLCAiY29tcG9uZW50IikgPT0gMCkKLSAgICAgIGZwcmludGYoZm91dCwgIkNPTVBPTkVOVCAlcyAiLCBwLT5wcm9wTmFtZSgpKTsKLSAgZWxzZSBpZiAoc3RyY21wKHAtPnByb3BUeXBlKCksICJzcGVjaWFsbmV0IikgPT0gMCkKLSAgICAgIGZwcmludGYoZm91dCwgIlNQRUNJQUxORVQgJXMgIiwgcC0+cHJvcE5hbWUoKSk7Ci0gIGVsc2UgaWYgKHN0cmNtcChwLT5wcm9wVHlwZSgpLCAiZ3JvdXAiKSA9PSAwKQotICAgICAgZnByaW50Zihmb3V0LCAiR1JPVVAgJXMgIiwgcC0+cHJvcE5hbWUoKSk7Ci0gIGVsc2UgaWYgKHN0cmNtcChwLT5wcm9wVHlwZSgpLCAicm93IikgPT0gMCkKLSAgICAgIGZwcmludGYoZm91dCwgIlJPVyAlcyAiLCBwLT5wcm9wTmFtZSgpKTsKLSAgZWxzZSBpZiAoc3RyY21wKHAtPnByb3BUeXBlKCksICJjb21wb25lbnRwaW4iKSA9PSAwKQotICAgICAgZnByaW50Zihmb3V0LCAiQ09NUE9ORU5UUElOICVzICIsIHAtPnByb3BOYW1lKCkpOwotICBlbHNlIGlmIChzdHJjbXAocC0+cHJvcFR5cGUoKSwgInJlZ2lvbiIpID09IDApCi0gICAgICBmcHJpbnRmKGZvdXQsICJSRUdJT04gJXMgIiwgcC0+cHJvcE5hbWUoKSk7Ci0gIGVsc2UgaWYgKHN0cmNtcChwLT5wcm9wVHlwZSgpLCAibm9uZGVmYXVsdHJ1bGUiKSA9PSAwKQotICAgICAgZnByaW50Zihmb3V0LCAiTk9OREVGQVVMVFJVTEUgJXMgIiwgcC0+cHJvcE5hbWUoKSk7Ci0gIGlmIChwLT5kYXRhVHlwZSgpID09ICdJJykKLSAgICAgIGZwcmludGYoZm91dCwgIklOVEVHRVIgIik7Ci0gIGlmIChwLT5kYXRhVHlwZSgpID09ICdSJykKLSAgICAgIGZwcmludGYoZm91dCwgIlJFQUwgIik7Ci0gIGlmIChwLT5kYXRhVHlwZSgpID09ICdTJykKLSAgICAgIGZwcmludGYoZm91dCwgIlNUUklORyAiKTsKLSAgaWYgKHAtPmRhdGFUeXBlKCkgPT0gJ1EnKQotICAgICAgZnByaW50Zihmb3V0LCAiU1RSSU5HICIpOwotICBpZiAocC0+aGFzUmFuZ2UoKSkgewotICAgICAgZnByaW50Zihmb3V0LCAiUkFOR0UgJWcgJWcgIiwgcC0+bGVmdCgpLAotICAgICAgICAgICAgICBwLT5yaWdodCgpKTsKLSAgfQotICBpZiAocC0+aGFzTnVtYmVyKCkpCi0gICAgICBmcHJpbnRmKGZvdXQsICIlZyAiLCBwLT5udW1iZXIoKSk7Ci0gIGlmIChwLT5oYXNTdHJpbmcoKSkKLSAgICAgIGZwcmludGYoZm91dCwgIlwiJXNcIiAiLCBwLT5zdHJpbmcoKSk7Ci0gIGZwcmludGYoZm91dCwgIjtcbiIpOwotCi0gIHJldHVybiAwOwotfQotCi0KLWludCBwcm9wZW5kKGRlZnJDYWxsYmFja1R5cGVfZSBjLCB2b2lkKiwgZGVmaVVzZXJEYXRhKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKGlzUHJvcCkgewotICAgICAgZnByaW50Zihmb3V0LCAiRU5EIFBST1BFUlRZREVGSU5JVElPTlNcblxuIik7Ci0gICAgICBpc1Byb3AgPSAwOwotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotaW50IGhpc3QoZGVmckNhbGxiYWNrVHlwZV9lIGMsIGNvbnN0IGNoYXIqIGgsIGRlZmlVc2VyRGF0YSB1ZCkgewotICBjaGVja1R5cGUoYyk7Ci0gIGRlZnJTZXRDYXNlU2Vuc2l0aXZpdHkoMCk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGZwcmludGYoZm91dCwgIkhJU1RPUlkgJXMgO1xuIiwgaCk7Ci0gIGRlZnJTZXRDYXNlU2Vuc2l0aXZpdHkoMSk7Ci0gIHJldHVybiAwOwotfQotCi0KLWludCBhbihkZWZyQ2FsbGJhY2tUeXBlX2UgYywgY29uc3QgY2hhciogaCwgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgZnByaW50Zihmb3V0LCAiQVJSQVkgJXMgO1xuIiwgaCk7Ci0gIHJldHVybiAwOwotfQotCi0KLWludCBmbihkZWZyQ2FsbGJhY2tUeXBlX2UgYywgY29uc3QgY2hhciogaCwgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgZnByaW50Zihmb3V0LCAiRkxPT1JQTEFOICVzIDtcbiIsIGgpOwotICByZXR1cm4gMDsKLX0KLQotCi1pbnQgYmJuKGRlZnJDYWxsYmFja1R5cGVfZSBjLCBjb25zdCBjaGFyKiBoLCBkZWZpVXNlckRhdGEgdWQpIHsKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBmcHJpbnRmKGZvdXQsICJCVVNCSVRDSEFSUyBcIiVzXCIgO1xuIiwgaCk7Ci0gIHJldHVybiAwOwotfQotCi0KLWludCB2ZXJzKGRlZnJDYWxsYmFja1R5cGVfZSBjLCBkb3VibGUgZCwgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSAKLSAgICAgIGRhdGFFcnJvcigpOwotICBmcHJpbnRmKGZvdXQsICJWRVJTSU9OICVnIDtcbiIsIGQpOyAgCi0gIGN1clZlciA9IGQ7Ci0KLSAgZnByaW50Zihmb3V0LCAiQUxJQVMgYWxpYXMxIGFsaWFzVmFsdWUxIDEgO1xuIik7Ci0gIGZwcmludGYoZm91dCwgIkFMSUFTIGFsaWFzMiBhbGlhc1ZhbHVlMiAwIDtcbiIpOwotCi0gIHJldHVybiAwOwotfQotCi0KLWludCB2ZXJzU3RyKGRlZnJDYWxsYmFja1R5cGVfZSBjLCBjb25zdCBjaGFyKiB2ZXJzaW9uTmFtZSwgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgZnByaW50Zihmb3V0LCAiVkVSU0lPTiAlcyA7XG4iLCB2ZXJzaW9uTmFtZSk7Ci0gIHJldHVybiAwOwotfQotCi0KLWludCB1bml0cyhkZWZyQ2FsbGJhY2tUeXBlX2UgYywgZG91YmxlIGQsIGRlZmlVc2VyRGF0YSB1ZCkgewotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGZwcmludGYoZm91dCwgIlVOSVRTIERJU1RBTkNFIE1JQ1JPTlMgJWcgO1xuIiwgZCk7Ci0gIHJldHVybiAwOwotfQotCi0KLWludCBjYXNlc2VucyhkZWZyQ2FsbGJhY2tUeXBlX2UgYywgaW50IGQsIGRlZmlVc2VyRGF0YSB1ZCkgewotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGlmIChkID09IDEpCi0gICAgIGZwcmludGYoZm91dCwgIk5BTUVTQ0FTRVNFTlNJVElWRSBPTiA7XG4iLCBkKTsKLSAgZWxzZQotICAgICBmcHJpbnRmKGZvdXQsICJOQU1FU0NBU0VTRU5TSVRJVkUgT0ZGIDtcbiIsIGQpOwotICByZXR1cm4gMDsKLX0KLQotCi1pbnQgY2xzKGRlZnJDYWxsYmFja1R5cGVfZSBjLCB2b2lkKiBjbCwgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGRlZmlTaXRlKiBzaXRlOyAgLy8gU2l0ZSBhbmQgQ2FucGxhY2UgYW5kIENhbm5vdE9jY3VweQotICBkZWZpQm94KiBib3g7ICAvLyBEaWVBcmVhIGFuZCAKLSAgZGVmaVBpbkNhcCogcGM7Ci0gIGRlZmlQaW4qIHBpbjsKLSAgaW50IGksIGosIGs7Ci0gIGRlZmlSb3cqIHJvdzsKLSAgZGVmaVRyYWNrKiB0cmFjazsKLSAgZGVmaUdjZWxsR3JpZCogZ2NnOwotICBkZWZpVmlhKiB2aWE7Ci0gIGRlZmlSZWdpb24qIHJlOwotICBkZWZpR3JvdXAqIGdyb3VwOwotICBkZWZpQ29tcG9uZW50TWFza1NoaWZ0TGF5ZXIqIG1hc2tTaGlmdExheWVyID0gTlVMTDsKLSAgZGVmaVNjYW5jaGFpbiogc2M7Ci0gIGRlZmlJT1RpbWluZyogaW90OwotICBkZWZpRlBDKiBmcGM7Ci0gIGRlZmlUaW1pbmdEaXNhYmxlKiB0ZDsKLSAgZGVmaVBhcnRpdGlvbiogcGFydDsKLSAgZGVmaVBpblByb3AqIHBwcm9wOwotICBkZWZpQmxvY2thZ2UqIGJsb2NrOwotICBkZWZpU2xvdCogc2xvdHM7Ci0gIGRlZmlGaWxsKiBmaWxsczsKLSAgZGVmaVN0eWxlcyogc3R5bGVzOwotICBpbnQgeGwsIHlsLCB4aCwgeWg7Ci0gIGNoYXIgKm5hbWUsICphMSwgKmIxOwotICBjaGFyICoqaW5zdCwgKippblBpbiwgKipvdXRQaW47Ci0gIGludCAgKmJpdHM7Ci0gIGludCAgc2l6ZTsKLSAgaW50IGNvcm5lciwgdHlwOwotICBjb25zdCBjaGFyICppdGVtVDsKLSAgY2hhciBkaXI7Ci0gIGRlZmlQaW5BbnRlbm5hTW9kZWwqIGFNb2RlbDsKLSAgc3RydWN0IGRlZmlQb2ludHMgcG9pbnRzOwotCi0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgc3dpdGNoIChjKSB7Ci0KLSAgY2FzZSBkZWZyU2l0ZUNia1R5cGUgOgotICAgICAgICAgc2l0ZSA9IChkZWZpU2l0ZSopY2w7Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICJTSVRFICVzICVnICVnICVzICIsIHNpdGUtPm5hbWUoKSwKLSAgICAgICAgICAgICAgICAgc2l0ZS0+eF9vcmlnKCksIHNpdGUtPnlfb3JpZygpLAotICAgICAgICAgICAgICAgICBvcmllbnRTdHIoc2l0ZS0+b3JpZW50KCkpKTsKLSAgICAgICAgIGZwcmludGYoZm91dCwgIkRPICVnIEJZICVnIFNURVAgJWcgJWcgO1xuIiwKLSAgICAgICAgICAgICAgICAgc2l0ZS0+eF9udW0oKSwgc2l0ZS0+eV9udW0oKSwKLSAgICAgICAgICAgICAgICAgc2l0ZS0+eF9zdGVwKCksIHNpdGUtPnlfc3RlcCgpKTsKLSAgICAgICAgIGJyZWFrOwotICBjYXNlIGRlZnJDYW5wbGFjZUNia1R5cGUgOgotICAgICAgICAgc2l0ZSA9IChkZWZpU2l0ZSopY2w7Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICJDQU5QTEFDRSAlcyAlZyAlZyAlcyAiLCBzaXRlLT5uYW1lKCksCi0gICAgICAgICAgICAgICAgIHNpdGUtPnhfb3JpZygpLCBzaXRlLT55X29yaWcoKSwKLSAgICAgICAgICAgICAgICAgb3JpZW50U3RyKHNpdGUtPm9yaWVudCgpKSk7Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICJETyAlZyBCWSAlZyBTVEVQICVnICVnIDtcbiIsCi0gICAgICAgICAgICAgICAgIHNpdGUtPnhfbnVtKCksIHNpdGUtPnlfbnVtKCksCi0gICAgICAgICAgICAgICAgIHNpdGUtPnhfc3RlcCgpLCBzaXRlLT55X3N0ZXAoKSk7Ci0gICAgICAgICBicmVhazsKLSAgY2FzZSBkZWZyQ2Fubm90T2NjdXB5Q2JrVHlwZSA6IAotICAgICAgICAgc2l0ZSA9IChkZWZpU2l0ZSopY2w7Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICJDQU5OT1RPQ0NVUFkgJXMgJWcgJWcgJXMgIiwKLSAgICAgICAgICAgICAgICAgc2l0ZS0+bmFtZSgpLCBzaXRlLT54X29yaWcoKSwKLSAgICAgICAgICAgICAgICAgc2l0ZS0+eV9vcmlnKCksIG9yaWVudFN0cihzaXRlLT5vcmllbnQoKSkpOwotICAgICAgICAgZnByaW50Zihmb3V0LCAiRE8gJWcgQlkgJWcgU1RFUCAlZyAlZyA7XG4iLAotICAgICAgICAgICAgICAgICBzaXRlLT54X251bSgpLCBzaXRlLT55X251bSgpLAotICAgICAgICAgICAgICAgICBzaXRlLT54X3N0ZXAoKSwgc2l0ZS0+eV9zdGVwKCkpOwotICAgICAgICAgYnJlYWs7Ci0gIGNhc2UgZGVmckRpZUFyZWFDYmtUeXBlIDoKLSAgICAgICAgIGJveCA9IChkZWZpQm94KiljbDsKLSAgICAgICAgIGZwcmludGYoZm91dCwgIkRJRUFSRUEgJWQgJWQgJWQgJWQgO1xuIiwKLSAgICAgICAgICAgICAgICAgYm94LT54bCgpLCBib3gtPnlsKCksIGJveC0+eGgoKSwKLSAgICAgICAgICAgICAgICAgYm94LT55aCgpKTsKLSAgICAgICAgIGZwcmludGYoZm91dCwgIkRJRUFSRUEgIik7Ci0gICAgICAgICBwb2ludHMgPSBib3gtPmdldFBvaW50KCk7Ci0gICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcG9pbnRzLm51bVBvaW50czsgaSsrKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlZCAlZCAiLCBwb2ludHMueFtpXSwgcG9pbnRzLnlbaV0pOwotICAgICAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0gICAgICAgICBicmVhazsKLSAgY2FzZSBkZWZyUGluQ2FwQ2JrVHlwZSA6Ci0gICAgICAgICBwYyA9IChkZWZpUGluQ2FwKiljbDsKLSAgICAgICAgIGlmICh0ZXN0RGVidWdQcmludCkgewotICAgICAgICAgICAgIHBjLT5wcmludChmb3V0KTsKLSAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTUlOUElOUyAlZCBXSVJFQ0FQICVnIDtcbiIsCi0gICAgICAgICAgICAgICAgICAgICBwYy0+cGluKCksIHBjLT5jYXAoKSk7Ci0gICAgICAgICAgICAgLS1udW1PYmpzOwotICAgICAgICAgICAgIGlmIChudW1PYmpzIDw9IDApCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkVORCBERUZBVUxUQ0FQXG4iKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGJyZWFrOwotICBjYXNlIGRlZnJQaW5DYmtUeXBlIDoKLSAgICAgICAgIHBpbiA9IChkZWZpUGluKiljbDsKLSAgICAgICAgIGlmICh0ZXN0RGVidWdQcmludCkgewotICAgICAgICAgICAgIHBpbi0+cHJpbnQoZm91dCk7Ci0gICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIi0gJXMgKyBORVQgJXMgIiwgcGluLT5waW5OYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICBwaW4tPm5ldE5hbWUoKSk7Ci0gICAgLy8gICAgICAgICBwaW4tPmNoYW5nZVBpbk5hbWUoInBpbk5hbWUiKTsKLSAgICAvLyAgICAgICAgIGZwcmludGYoZm91dCwgIiVzICIsIHBpbi0+cGluTmFtZSgpKTsKLSAgICAgICAgICAgICBpZiAocGluLT5oYXNEaXJlY3Rpb24oKSkKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBESVJFQ1RJT04gJXMgIiwgcGluLT5kaXJlY3Rpb24oKSk7Ci0gICAgICAgICAgICAgaWYgKHBpbi0+aGFzVXNlKCkpCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgVVNFICVzICIsIHBpbi0+dXNlKCkpOwotICAgICAgICAgICAgIGlmIChwaW4tPmhhc05ldEV4cHIoKSkKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBORVRFWFBSIFwiJXNcIiAiLCBwaW4tPm5ldEV4cHIoKSk7Ci0gICAgICAgICAgICAgaWYgKHBpbi0+aGFzU3VwcGx5U2Vuc2l0aXZpdHkoKSkKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBTVVBQTFlTRU5TSVRJVklUWSAlcyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBpbi0+c3VwcGx5U2Vuc2l0aXZpdHkoKSk7Ci0gICAgICAgICAgICAgaWYgKHBpbi0+aGFzR3JvdW5kU2Vuc2l0aXZpdHkoKSkKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBHUk9VTkRTRU5TSVRJVklUWSAlcyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBpbi0+Z3JvdW5kU2Vuc2l0aXZpdHkoKSk7Ci0gICAgICAgICAgICAgaWYgKHBpbi0+aGFzTGF5ZXIoKSkgewotICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGVmaVBvaW50cyBwb2ludHM7Ci0gICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaW4tPm51bUxheWVyKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBMQVlFUiAlcyAiLCBwaW4tPmxheWVyKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBpbi0+bGF5ZXJNYXNrKGkpKSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIk1BU0sgJWQgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBpbi0+bGF5ZXJNYXNrKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBpbi0+aGFzTGF5ZXJTcGFjaW5nKGkpKQotICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlNQQUNJTkcgJWQgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGluLT5sYXllclNwYWNpbmcoaSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGluLT5oYXNMYXllckRlc2lnblJ1bGVXaWR0aChpKSkKLSAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJERVNJR05SVUxFV0lEVEggJWQgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGluLT5sYXllckRlc2lnblJ1bGVXaWR0aChpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHBpbi0+Ym91bmRzKGksICZ4bCwgJnlsLCAmeGgsICZ5aCk7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVkICVkICVkICVkICIsIHhsLCB5bCwgeGgsIHloKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGluLT5udW1Qb2x5Z29ucygpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4gICsgUE9MWUdPTiAlcyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbi0+cG9seWdvbk5hbWUoaSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGluLT5wb2x5Z29uTWFzayhpKSkKLSAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJNQVNLICVkICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaW4tPnBvbHlnb25NYXNrKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBpbi0+aGFzUG9seWdvblNwYWNpbmcoaSkpCi0gICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiU1BBQ0lORyAlZCAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaW4tPnBvbHlnb25TcGFjaW5nKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBpbi0+aGFzUG9seWdvbkRlc2lnblJ1bGVXaWR0aChpKSkKLSAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJERVNJR05SVUxFV0lEVEggJWQgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGluLT5wb2x5Z29uRGVzaWduUnVsZVdpZHRoKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgcG9pbnRzID0gcGluLT5nZXRQb2x5Z29uKGkpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcG9pbnRzLm51bVBvaW50czsgaisrKQotICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVkICVkICIsIHBvaW50cy54W2pdLCBwb2ludHMueVtqXSk7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBpbi0+bnVtVmlhcygpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChwaW4tPnZpYVRvcE1hc2soaSkgfHwgcGluLT52aWFDdXRNYXNrKGkpIHx8IHBpbi0+dmlhQm90dG9tTWFzayhpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuICArIFZJQSAlcyBNQVNLICVkJWQlZCAlZCAlZCAiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGluLT52aWFOYW1lKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaW4tPnZpYVRvcE1hc2soaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbi0+dmlhQ3V0TWFzayhpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGluLT52aWFCb3R0b21NYXNrKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaW4tPnZpYVB0WChpKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbi0+dmlhUHRZKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4gICsgVklBICVzICVkICVkICIsIHBpbi0+dmlhTmFtZShpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbi0+dmlhUHRYKGkpLCBwaW4tPnZpYVB0WShpKSk7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgaWYgKHBpbi0+aGFzUG9ydCgpKSB7Ci0gICAgICAgICAgICAgICAgIHN0cnVjdCBkZWZpUG9pbnRzIHBvaW50czsKLSAgICAgICAgICAgICAgICAgZGVmaVBpblBvcnQqIHBvcnQ7Ci0gICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwaW4tPm51bVBvcnRzKCk7IGorKykgewotICAgICAgICAgICAgICAgICAgICBwb3J0ID0gcGluLT5waW5Qb3J0KGopOwotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBQT1JUIik7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwb3J0LT5udW1MYXllcigpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4gICAgICsgTEFZRVIgJXMgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LT5sYXllcihpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3J0LT5sYXllck1hc2soaSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJNQVNLICVkICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQtPmxheWVyTWFzayhpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3J0LT5oYXNMYXllclNwYWNpbmcoaSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiU1BBQ0lORyAlZCAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC0+bGF5ZXJTcGFjaW5nKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnQtPmhhc0xheWVyRGVzaWduUnVsZVdpZHRoKGkpKQotICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkRFU0lHTlJVTEVXSURUSCAlZCAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC0+bGF5ZXJEZXNpZ25SdWxlV2lkdGgoaSkpOwotICAgICAgICAgICAgICAgICAgICAgICBwb3J0LT5ib3VuZHMoaSwgJnhsLCAmeWwsICZ4aCwgJnloKTsKLSAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJWQgJWQgJWQgJWQgIiwgeGwsIHlsLCB4aCwgeWgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwb3J0LT5udW1Qb2x5Z29ucygpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4gICAgICsgUE9MWUdPTiAlcyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQtPnBvbHlnb25OYW1lKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnQtPnBvbHlnb25NYXNrKGkpKQotICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIk1BU0sgJWQgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQtPnBvbHlnb25NYXNrKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnQtPmhhc1BvbHlnb25TcGFjaW5nKGkpKQotICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlNQQUNJTkcgJWQgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC0+cG9seWdvblNwYWNpbmcoaSkpOwotICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9ydC0+aGFzUG9seWdvbkRlc2lnblJ1bGVXaWR0aChpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJERVNJR05SVUxFV0lEVEggJWQgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC0+cG9seWdvbkRlc2lnblJ1bGVXaWR0aChpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHBvaW50cyA9IHBvcnQtPmdldFBvbHlnb24oaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBwb2ludHMubnVtUG9pbnRzOyBrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKCAlZCAlZCApICIsIHBvaW50cy54W2tdLCBwb2ludHMueVtrXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBvcnQtPm51bVZpYXMoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9ydC0+dmlhVG9wTWFzayhpKSB8fCBwb3J0LT52aWFDdXRNYXNrKGkpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBvcnQtPnZpYUJvdHRvbU1hc2soaSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiAgICAgKyBWSUEgJXMgTUFTSyAlZCVkJWQgKCAlZCAlZCApICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQtPnZpYU5hbWUoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQtPnZpYVRvcE1hc2soaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQtPnZpYUN1dE1hc2soaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQtPnZpYUJvdHRvbU1hc2soaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQtPnZpYVB0WChpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC0+dmlhUHRZKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4gICAgICsgVklBICVzICggJWQgJWQgKSAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQtPnZpYU5hbWUoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC0+dmlhUHRYKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQtPnZpYVB0WShpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnQtPmhhc1BsYWNlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3J0LT5pc1BsYWNlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuICAgICArIFBMQUNFRCAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKCAlZCAlZCApICVzICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQtPnBsYWNlbWVudFgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC0+cGxhY2VtZW50WSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRTdHIocG9ydC0+b3JpZW50KCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9ydC0+aXNDb3ZlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuICAgICArIENPVkVSICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIoICVkICVkICkgJXMgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC0+cGxhY2VtZW50WCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LT5wbGFjZW1lbnRZKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudFN0cihwb3J0LT5vcmllbnQoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3J0LT5pc0ZpeGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4gICAgICsgRklYRUQgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiggJWQgJWQgKSAlcyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LT5wbGFjZW1lbnRYKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQtPnBsYWNlbWVudFkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50U3RyKHBvcnQtPm9yaWVudCgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgaWYgKHBpbi0+aGFzUGxhY2VtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgaWYgKHBpbi0+aXNQbGFjZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBQTEFDRUQgIik7Ci0gICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIoICVkICVkICkgJXMgIiwgcGluLT5wbGFjZW1lbnRYKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGluLT5wbGFjZW1lbnRZKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudFN0cihwaW4tPm9yaWVudCgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICBpZiAocGluLT5pc0NvdmVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgQ09WRVIgIik7Ci0gICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIoICVkICVkICkgJXMgIiwgcGluLT5wbGFjZW1lbnRYKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGluLT5wbGFjZW1lbnRZKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudFN0cihwaW4tPm9yaWVudCgpKSk7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgaWYgKHBpbi0+aXNGaXhlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIEZJWEVEICIpOwotICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKCAlZCAlZCApICVzICIsIHBpbi0+cGxhY2VtZW50WCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBpbi0+cGxhY2VtZW50WSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRTdHIocGluLT5vcmllbnQoKSkpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIGlmIChwaW4tPmlzVW5wbGFjZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgVU5QTEFDRUQgIik7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGlmIChwaW4tPmhhc1NwZWNpYWwoKSkgewotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIFNQRUNJQUwgIik7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGlmIChwaW4tPmhhc0FQaW5QYXJ0aWFsTWV0YWxBcmVhKCkpIHsKLSAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBpbi0+bnVtQVBpblBhcnRpYWxNZXRhbEFyZWEoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkFOVEVOTkFQSU5QQVJUSUFMTUVUQUxBUkVBICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaW4tPkFQaW5QYXJ0aWFsTWV0YWxBcmVhKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCoocGluLT5BUGluUGFydGlhbE1ldGFsQXJlYUxheWVyKGkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBMQVlFUiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbi0+QVBpblBhcnRpYWxNZXRhbEFyZWFMYXllcihpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgaWYgKHBpbi0+aGFzQVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhKCkpIHsKLSAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBpbi0+bnVtQVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJBTlRFTk5BUElOUEFSVElBTE1FVEFMU0lERUFSRUEgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbi0+QVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCoocGluLT5BUGluUGFydGlhbE1ldGFsU2lkZUFyZWFMYXllcihpKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgTEFZRVIgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbi0+QVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhTGF5ZXIoaSkpOwotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGlmIChwaW4tPmhhc0FQaW5EaWZmQXJlYSgpKSB7Ci0gICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaW4tPm51bUFQaW5EaWZmQXJlYSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiQU5URU5OQVBJTkRJRkZBUkVBICVkIiwgcGluLT5BUGluRGlmZkFyZWEoaSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKihwaW4tPkFQaW5EaWZmQXJlYUxheWVyKGkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBMQVlFUiAlcyIsIHBpbi0+QVBpbkRpZmZBcmVhTGF5ZXIoaSkpOwotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGlmIChwaW4tPmhhc0FQaW5QYXJ0aWFsQ3V0QXJlYSgpKSB7Ci0gICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaW4tPm51bUFQaW5QYXJ0aWFsQ3V0QXJlYSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiQU5URU5OQVBJTlBBUlRJQUxDVVRBUkVBICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaW4tPkFQaW5QYXJ0aWFsQ3V0QXJlYShpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgqKHBpbi0+QVBpblBhcnRpYWxDdXRBcmVhTGF5ZXIoaSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIExBWUVSICVzIiwgcGluLT5BUGluUGFydGlhbEN1dEFyZWFMYXllcihpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcGluLT5udW1BbnRlbm5hTW9kZWwoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgYU1vZGVsID0gcGluLT5hbnRlbm5hTW9kZWwoaik7Ci0gCi0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiQU5URU5OQU1PREVMICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgYU1vZGVsLT5hbnRlbm5hT3hpZGUoKSk7IAotIAotICAgICAgICAgICAgICAgIGlmIChhTW9kZWwtPmhhc0FQaW5HYXRlQXJlYSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhTW9kZWwtPm51bUFQaW5HYXRlQXJlYSgpOwotICAgICAgICAgICAgICAgICAgICAgICBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiQU5URU5OQVBJTkdBVEVBUkVBICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhTW9kZWwtPkFQaW5HYXRlQXJlYShpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmIChhTW9kZWwtPmhhc0FQaW5HYXRlQXJlYUxheWVyKGkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIExBWUVSICVzIiwgYU1vZGVsLT5BUGluR2F0ZUFyZWFMYXllcihpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGFNb2RlbC0+aGFzQVBpbk1heEFyZWFDYXIoKSkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICBpIDwgYU1vZGVsLT5udW1BUGluTWF4QXJlYUNhcigpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiQU5URU5OQVBJTk1BWEFSRUFDQVIgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFNb2RlbC0+QVBpbk1heEFyZWFDYXIoaSkpOwotICAgICAgICAgICAgICAgICAgICAgICBpZiAoYU1vZGVsLT5oYXNBUGluTWF4QXJlYUNhckxheWVyKGkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgTEFZRVIgJXMiLCBhTW9kZWwtPkFQaW5NYXhBcmVhQ2FyTGF5ZXIoaSkpOwotICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhTW9kZWwtPmhhc0FQaW5NYXhTaWRlQXJlYUNhcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaSA8IGFNb2RlbC0+bnVtQVBpbk1heFNpZGVBcmVhQ2FyKCk7IAotICAgICAgICAgICAgICAgICAgICAgICAgIGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJBTlRFTk5BUElOTUFYU0lERUFSRUFDQVIgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFNb2RlbC0+QVBpbk1heFNpZGVBcmVhQ2FyKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFNb2RlbC0+aGFzQVBpbk1heFNpZGVBcmVhQ2FyTGF5ZXIoaSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBMQVlFUiAlcyIsIGFNb2RlbC0+QVBpbk1heFNpZGVBcmVhQ2FyTGF5ZXIoaSkpOwotICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhTW9kZWwtPmhhc0FQaW5NYXhDdXRDYXIoKSkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYU1vZGVsLT5udW1BUGluTWF4Q3V0Q2FyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJBTlRFTk5BUElOTUFYQ1VUQ0FSICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFNb2RlbC0+QVBpbk1heEN1dENhcihpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmIChhTW9kZWwtPmhhc0FQaW5NYXhDdXRDYXJMYXllcihpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBMQVlFUiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhTW9kZWwtPkFQaW5NYXhDdXRDYXJMYXllcihpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIjtcbiIpOwotICAgICAgICAgICAgIC0tbnVtT2JqczsKLSAgICAgICAgICAgICBpZiAobnVtT2JqcyA8PSAwKQotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJFTkQgUElOU1xuIik7Ci0gICAgICAgICB9Ci0gICAgICAgICBicmVhazsKLSAgY2FzZSBkZWZyRGVmYXVsdENhcENia1R5cGUgOgotICAgICAgICAgaSA9IChsb25nKWNsOwotICAgICAgICAgZnByaW50Zihmb3V0LCAiREVGQVVMVENBUCAlZFxuIiwgaSk7Ci0gICAgICAgICBudW1PYmpzID0gaTsKLSAgICAgICAgIGJyZWFrOwotICBjYXNlIGRlZnJSb3dDYmtUeXBlIDoKLSAgICAgICAgIHJvdyA9IChkZWZpUm93KiljbDsKLSAgICAgICAgIGZwcmludGYoZm91dCwgIlJPVyAlcyAlcyAlZyAlZyAlcyAiLCBpZ25vcmVSb3dOYW1lcyA/ICJYWFgiIDogcm93LT5uYW1lKCksCi0gICAgICAgICAgICAgICAgIHJvdy0+bWFjcm8oKSwgcm93LT54KCksIHJvdy0+eSgpLAotICAgICAgICAgICAgICAgICBvcmllbnRTdHIocm93LT5vcmllbnQoKSkpOwotICAgICAgICAgaWYgKHJvdy0+aGFzRG8oKSkgewotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkRPICVnIEJZICVnICIsCi0gICAgICAgICAgICAgICAgICAgICByb3ctPnhOdW0oKSwgcm93LT55TnVtKCkpOwotICAgICAgICAgICAgIGlmIChyb3ctPmhhc0RvU3RlcCgpKQotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJTVEVQICVnICVnIDtcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcm93LT54U3RlcCgpLCByb3ctPnlTdGVwKCkpOwotICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0gICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIjtcbiIpOwotICAgICAgICAgaWYgKHJvdy0+bnVtUHJvcHMoKSA+IDApIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3ctPm51bVByb3BzKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgKyBQUk9QRVJUWSAlcyAlcyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgcm93LT5wcm9wTmFtZShpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvdy0+cHJvcFZhbHVlKGkpKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHJvdy0+cHJvcFR5cGUoaSkpIHsKLSAgICAgICAgICAgICAgICAgICBjYXNlICdSJzogZnByaW50Zihmb3V0LCAiUkVBTCAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgY2FzZSAnSSc6IGZwcmludGYoZm91dCwgIklOVEVHRVIgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgIGNhc2UgJ1MnOiBmcHJpbnRmKGZvdXQsICJTVFJJTkcgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgIGNhc2UgJ1EnOiBmcHJpbnRmKGZvdXQsICJRVU9URVNUUklORyAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgY2FzZSAnTic6IGZwcmludGYoZm91dCwgIk5VTUJFUiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0gICAgICAgICB9Ci0gICAgICAgICBicmVhazsKLSAgY2FzZSBkZWZyVHJhY2tDYmtUeXBlIDoKLSAgICAgICAgIHRyYWNrID0gKGRlZmlUcmFjayopY2w7Ci0JIGlmICh0cmFjay0+Zmlyc3RUcmFja01hc2soKSkgewotCSAgICBpZiAodHJhY2stPnNhbWVNYXNrKCkpIHsKLQkJZnByaW50Zihmb3V0LCAiVFJBQ0tTICVzICVnIERPICVnIFNURVAgJWcgTUFTSyAlZCBTQU1FTUFTSyBMQVlFUiAiLAotICAgICAgICAgICAgICAgICB0cmFjay0+bWFjcm8oKSwgdHJhY2stPngoKSwKLSAgICAgICAgICAgICAgICAgdHJhY2stPnhOdW0oKSwgdHJhY2stPnhTdGVwKCksCi0JICAgICAgICAgdHJhY2stPmZpcnN0VHJhY2tNYXNrKCkpOwotCSAgICB9IGVsc2UgewotCQlmcHJpbnRmKGZvdXQsICJUUkFDS1MgJXMgJWcgRE8gJWcgU1RFUCAlZyBNQVNLICVkIExBWUVSICIsCi0gICAgICAgICAgICAgICAgIHRyYWNrLT5tYWNybygpLCB0cmFjay0+eCgpLAotICAgICAgICAgICAgICAgICB0cmFjay0+eE51bSgpLCB0cmFjay0+eFN0ZXAoKSwKLQkgICAgICAgICB0cmFjay0+Zmlyc3RUcmFja01hc2soKSk7Ci0JICAgIH0KLQkgfSBlbHNlIHsKLQkgICAgZnByaW50Zihmb3V0LCAiVFJBQ0tTICVzICVnIERPICVnIFNURVAgJWcgTEFZRVIgIiwKLSAgICAgICAgICAgICAgICAgdHJhY2stPm1hY3JvKCksIHRyYWNrLT54KCksCi0gICAgICAgICAgICAgICAgIHRyYWNrLT54TnVtKCksIHRyYWNrLT54U3RlcCgpKTsKLQkgfQotICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRyYWNrLT5udW1MYXllcnMoKTsgaSsrKQotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgdHJhY2stPmxheWVyKGkpKTsKLSAgICAgICAgIGZwcmludGYoZm91dCwgIjtcbiIpOyAKLSAgICAgICAgIGJyZWFrOwotICBjYXNlIGRlZnJHY2VsbEdyaWRDYmtUeXBlIDoKLSAgICAgICAgIGdjZyA9IChkZWZpR2NlbGxHcmlkKiljbDsKLSAgICAgICAgIGZwcmludGYoZm91dCwgIkdDRUxMR1JJRCAlcyAlZCBETyAlZCBTVEVQICVnIDtcbiIsCi0gICAgICAgICAgICAgICAgIGdjZy0+bWFjcm8oKSwgZ2NnLT54KCksCi0gICAgICAgICAgICAgICAgIGdjZy0+eE51bSgpLCBnY2ctPnhTdGVwKCkpOwotICAgICAgICAgYnJlYWs7Ci0gIGNhc2UgZGVmclZpYUNia1R5cGUgOgotICAgICAgICAgdmlhID0gKGRlZmlWaWEqKWNsOwotICAgICAgICAgaWYgKHRlc3REZWJ1Z1ByaW50KSB7Ci0gICAgICAgICAgICAgdmlhLT5wcmludChmb3V0KTsKLSAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiLSAlcyAiLCB2aWEtPm5hbWUoKSk7Ci0gICAgICAgICAgICAgaWYgKHZpYS0+aGFzUGF0dGVybigpKQotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIFBBVFRFUk5OQU1FICVzICIsIHZpYS0+cGF0dGVybigpKTsKLSAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdmlhLT5udW1MYXllcnMoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgIHZpYS0+bGF5ZXIoaSwgJm5hbWUsICZ4bCwgJnlsLCAmeGgsICZ5aCk7Ci0gICAgICAgICAgICAgICAgIGludCByZWN0TWFzayA9IHZpYS0+cmVjdE1hc2soaSk7Ci0KLSAgICAgICAgICAgICAgICAgaWYgKHJlY3RNYXNrKSB7Ci0gICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIFJFQ1QgJXMgKyBNQVNLICVkICVkICVkICVkICVkIFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgcmVjdE1hc2ssIHhsLCB5bCwgeGgsIHloKTsKLSAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgUkVDVCAlcyAlZCAlZCAlZCAlZCBcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHhsLCB5bCwgeGgsIHloKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAvLyBQT0xZR09OCi0gICAgICAgICAgICAgaWYgKHZpYS0+bnVtUG9seWdvbnMoKSkgewotICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGVmaVBvaW50cyBwb2ludHM7Ci0gICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB2aWEtPm51bVBvbHlnb25zKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgaW50IHBvbHlNYXNrID0gdmlhLT5wb2x5TWFzayhpKTsKLQotICAgICAgICAgICAgICAgICAgICAgaWYgKHBvbHlNYXNrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4gICsgUE9MWUdPTiAlcyArIE1BU0sgJWQgIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWEtPnBvbHlnb25OYW1lKGkpLCBwb2x5TWFzayk7Ci0gICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuICArIFBPTFlHT04gJXMgIiwgdmlhLT5wb2x5Z29uTmFtZShpKSk7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICBwb2ludHMgPSB2aWEtPmdldFBvbHlnb24oaSk7Ci0gICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcG9pbnRzLm51bVBvaW50czsgaisrKQotICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVkICVkICIsIHBvaW50cy54W2pdLCBwb2ludHMueVtqXSk7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIDtcbiIpOwotICAgICAgICAgICAgIGlmICh2aWEtPmhhc1ZpYVJ1bGUoKSkgewotICAgICAgICAgICAgICAgICBjaGFyICp2cm4sICpibCwgKmNsLCAqdGw7Ci0gICAgICAgICAgICAgICAgIGludCB4cywgeXMsIHhjcywgeWNzLCB4YmUsIHliZSwgeHRlLCB5dGU7Ci0gICAgICAgICAgICAgICAgIGludCBjciwgY2MsIHhvLCB5bywgeGJvLCB5Ym8sIHh0bywgeXRvOwotICAgICAgICAgICAgICAgICAodm9pZCl2aWEtPnZpYVJ1bGUoJnZybiwgJnhzLCAmeXMsICZibCwgJmNsLCAmdGwsICZ4Y3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeWNzLCAmeGJlLCAmeWJlLCAmeHRlLCAmeXRlKTsKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBWSUFSVUxFICclcydcbiIsIGlnbm9yZVZpYU5hbWVzID8gIlhYWCIgOiB2cm4pOwotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICsgQ1VUU0laRSAlZCAlZFxuIiwgeHMsIHlzKTsKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICArIExBWUVSUyAlcyAlcyAlc1xuIiwgYmwsIGNsLCB0bCk7Ci0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgKyBDVVRTUEFDSU5HICVkICVkXG4iLCB4Y3MsIHljcyk7Ci0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgKyBFTkNMT1NVUkUgJWQgJWQgJWQgJWRcbiIsIHhiZSwgeWJlLCB4dGUsIHl0ZSk7Ci0gICAgICAgICAgICAgICAgIGlmICh2aWEtPmhhc1Jvd0NvbCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICh2b2lkKXZpYS0+cm93Q29sKCZjciwgJmNjKTsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICArIFJPV0NPTCAlZCAlZFxuIiwgY3IsIGNjKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICBpZiAodmlhLT5oYXNPcmlnaW4oKSkgewotICAgICAgICAgICAgICAgICAgICAodm9pZCl2aWEtPm9yaWdpbigmeG8sICZ5byk7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgKyBPUklHSU4gJWQgJWRcbiIsIHhvLCB5byk7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgaWYgKHZpYS0+aGFzT2Zmc2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQpdmlhLT5vZmZzZXQoJnhibywgJnlibywgJnh0bywgJnl0byk7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgKyBPRkZTRVQgJWQgJWQgJWQgJWRcbiIsIHhibywgeWJvLCB4dG8sIHl0byk7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgaWYgKHZpYS0+aGFzQ3V0UGF0dGVybigpKQotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICsgUEFUVEVSTiAnJXMnXG4iLCB2aWEtPmN1dFBhdHRlcm4oKSk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIC0tbnVtT2JqczsKLSAgICAgICAgICAgICBpZiAobnVtT2JqcyA8PSAwKQotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJFTkQgVklBU1xuIik7Ci0gICAgICAgICB9Ci0gICAgICAgICBicmVhazsKLSAgY2FzZSBkZWZyUmVnaW9uQ2JrVHlwZSA6Ci0gICAgICAgICByZSA9IChkZWZpUmVnaW9uKiljbDsKLSAgICAgICAgIGZwcmludGYoZm91dCwgIi0gJXMgIiwgcmUtPm5hbWUoKSk7Ci0gICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmUtPm51bVJlY3RhbmdsZXMoKTsgaSsrKQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVkICVkICVkICVkIFxuIiwgcmUtPnhsKGkpLAotICAgICAgICAgICAgICAgICAgICAgcmUtPnlsKGkpLCByZS0+eGgoaSksCi0gICAgICAgICAgICAgICAgICAgICByZS0+eWgoaSkpOwotICAgICAgICAgaWYgKHJlLT5oYXNUeXBlKCkpCi0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBUWVBFICVzXG4iLCByZS0+dHlwZSgpKTsKLSAgICAgICAgIGlmIChyZS0+bnVtUHJvcHMoKSkgewotICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByZS0+bnVtUHJvcHMoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgUFJPUEVSVFkgJXMgJXMgIiwgcmUtPnByb3BOYW1lKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHJlLT5wcm9wVmFsdWUoaSkpOwotICAgICAgICAgICAgICAgICBzd2l0Y2ggKHJlLT5wcm9wVHlwZShpKSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlICdSJzogZnByaW50Zihmb3V0LCAiUkVBTCAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlICdJJzogZnByaW50Zihmb3V0LCAiSU5URUdFUiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlICdTJzogZnByaW50Zihmb3V0LCAiU1RSSU5HICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1EnOiBmcHJpbnRmKGZvdXQsICJRVU9URVNUUklORyAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlICdOJzogZnByaW50Zihmb3V0LCAiTlVNQkVSICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICI7XG4iKTsgCi0gICAgICAgICAtLW51bU9ianM7Ci0gICAgICAgICBpZiAobnVtT2JqcyA8PSAwKSB7Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiRU5EIFJFR0lPTlNcbiIpOwotICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0gIGNhc2UgZGVmckdyb3VwTmFtZUNia1R5cGUgOgotICAgICAgICAgaWYgKChjaGFyKiljbCkgewotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIi0gJXMiLCAoY2hhciopY2wpOwotICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0gIGNhc2UgZGVmckdyb3VwTWVtYmVyQ2JrVHlwZSA6Ci0gICAgICAgICBpZiAoKGNoYXIqKWNsKSB7Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVzIiwgKGNoYXIqKWNsKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGJyZWFrOwotICBjYXNlIGRlZnJDb21wb25lbnRNYXNrU2hpZnRMYXllckNia1R5cGUgOgotCSBmcHJpbnRmKGZvdXQsICJDT01QT05FTlRNQVNLU0hJRlQgIik7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWFza1NoaWZ0TGF5ZXItPm51bU1hc2tTaGlmdExheWVycygpOyBpKyspIHsKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgbWFza1NoaWZ0TGF5ZXItPm1hc2tTaGlmdExheWVyKGkpKTsKLSAgICAgICAgfSAKLSAgICAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0JIGJyZWFrOwotICBjYXNlIGRlZnJHcm91cENia1R5cGUgOgotICAgICAgICAgZ3JvdXAgPSAoZGVmaUdyb3VwKiljbDsKLSAgICAgICAgIGlmIChncm91cC0+aGFzTWF4WCgpIHwgZ3JvdXAtPmhhc01heFkoKQotICAgICAgICAgICAgIHwgZ3JvdXAtPmhhc1BlcmltKCkpIHsKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBTT0ZUICIpOwotICAgICAgICAgICAgIGlmIChncm91cC0+aGFzUGVyaW0oKSkgCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIk1BWEhBTEZQRVJJTUVURVIgJWQgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBncm91cC0+cGVyaW0oKSk7Ci0gICAgICAgICAgICAgaWYgKGdyb3VwLT5oYXNNYXhYKCkpCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIk1BWFggJWQgIiwgZ3JvdXAtPm1heFgoKSk7Ci0gICAgICAgICAgICAgaWYgKGdyb3VwLT5oYXNNYXhZKCkpIAotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJNQVhZICVkICIsIGdyb3VwLT5tYXhZKCkpOwotICAgICAgICAgfSAKLSAgICAgICAgIGlmIChncm91cC0+aGFzUmVnaW9uTmFtZSgpKQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuICArIFJFR0lPTiAlcyAiLCBncm91cC0+cmVnaW9uTmFtZSgpKTsKLSAgICAgICAgIGlmIChncm91cC0+aGFzUmVnaW9uQm94KCkpIHsKLSAgICAgICAgICAgICBpbnQgKmd4bCwgKmd5bCwgKmd4aCwgKmd5aDsKLSAgICAgICAgICAgICBpbnQgc2l6ZTsKLSAgICAgICAgICAgICBncm91cC0+cmVnaW9uUmVjdHMoJnNpemUsICZneGwsICZneWwsICZneGgsICZneWgpOwotICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlJFR0lPTiAlZCAlZCAlZCAlZCAiLCBneGxbaV0sIGd5bFtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBneGhbaV0sIGd5aFtpXSk7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoZ3JvdXAtPm51bVByb3BzKCkpIHsKLSAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXAtPm51bVByb3BzKCk7IGkrKykgewotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBQUk9QRVJUWSAlcyAlcyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLT5wcm9wTmFtZShpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBncm91cC0+cHJvcFZhbHVlKGkpKTsKLSAgICAgICAgICAgICAgICAgc3dpdGNoIChncm91cC0+cHJvcFR5cGUoaSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnUic6IGZwcmludGYoZm91dCwgIlJFQUwgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnSSc6IGZwcmludGYoZm91dCwgIklOVEVHRVIgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnUyc6IGZwcmludGYoZm91dCwgIlNUUklORyAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlICdRJzogZnByaW50Zihmb3V0LCAiUVVPVEVTVFJJTkcgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnTic6IGZwcmludGYoZm91dCwgIk5VTUJFUiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgZnByaW50Zihmb3V0LCAiIDtcbiIpOwotICAgICAgICAgLS1udW1PYmpzOwotICAgICAgICAgaWYgKG51bU9ianMgPD0gMCkKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJFTkQgR1JPVVBTXG4iKTsKLSAgICAgICAgIGJyZWFrOwotICBjYXNlIGRlZnJTY2FuY2hhaW5DYmtUeXBlIDoKLSAgICAgICAgIHNjID0gKGRlZmlTY2FuY2hhaW4qKWNsOwotICAgICAgICAgZnByaW50Zihmb3V0LCAiLSAlc1xuIiwgc2MtPm5hbWUoKSk7Ci0gICAgICAgICBpZiAoc2MtPmhhc1N0YXJ0KCkpIHsKLSAgICAgICAgICAgICBzYy0+c3RhcnQoJmExLCAmYjEpOwotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgKyBTVEFSVCAlcyAlc1xuIiwgYTEsIGIxKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmIChzYy0+aGFzU3RvcCgpKSB7Ci0gICAgICAgICAgICAgc2MtPnN0b3AoJmExLCAmYjEpOwotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgKyBTVE9QICVzICVzXG4iLCBhMSwgYjEpOwotICAgICAgICAgfQotICAgICAgICAgaWYgKHNjLT5oYXNDb21tb25JblBpbigpIHx8Ci0gICAgICAgICAgICAgc2MtPmhhc0NvbW1vbk91dFBpbigpKSB7Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICArIENPTU1PTlNDQU5QSU5TICIpOwotICAgICAgICAgICAgIGlmIChzYy0+aGFzQ29tbW9uSW5QaW4oKSkKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgKCBJTiAlcyApICIsIHNjLT5jb21tb25JblBpbigpKTsKLSAgICAgICAgICAgICBpZiAoc2MtPmhhc0NvbW1vbk91dFBpbigpKQotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAoIE9VVCAlcyApICIsc2MtPmNvbW1vbk91dFBpbigpKTsKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgfQotICAgICAgICAgaWYgKHNjLT5oYXNGbG9hdGluZygpKSB7Ci0gICAgICAgICAgICBzYy0+ZmxvYXRpbmcoJnNpemUsICZpbnN0LCAmaW5QaW4sICZvdXRQaW4sICZiaXRzKTsKLSAgICAgICAgICAgIGlmIChzaXplID4gMCkKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICsgRkxPQVRJTkdcbiIpOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgICAlcyAiLCBpbnN0W2ldKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5QaW5baV0pCi0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKCBJTiAlcyApICIsIGluUGluW2ldKTsKLSAgICAgICAgICAgICAgICBpZiAob3V0UGluW2ldKQotICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiggT1VUICVzICkgIiwgb3V0UGluW2ldKTsKLSAgICAgICAgICAgICAgICBpZiAoYml0c1tpXSAhPSAtMSkKLSAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIoIEJJVFMgJWQgKSAiLCBiaXRzW2ldKTsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotCi0gICAgICAgICBpZiAoc2MtPmhhc09yZGVyZWQoKSkgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNjLT5udW1PcmRlcmVkTGlzdHMoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc2MtPm9yZGVyZWQoaSwgJnNpemUsICZpbnN0LCAmaW5QaW4sICZvdXRQaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJpdHMpOwotICAgICAgICAgICAgICAgIGlmIChzaXplID4gMCkKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICArIE9SREVSRURcbiIpOwotICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzaXplOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICAgICVzICIsIGluc3Rbal0pOyAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluUGluW2pdKQotICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIoIElOICVzICkgIiwgaW5QaW5bal0pOwotICAgICAgICAgICAgICAgICAgICBpZiAob3V0UGluW2pdKQotICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIoIE9VVCAlcyApICIsIG91dFBpbltqXSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiaXRzW2pdICE9IC0xKQotICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIoIEJJVFMgJWQgKSAiLCBiaXRzW2pdKTsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGlmIChzYy0+aGFzUGFydGl0aW9uKCkpIHsKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgKyBQQVJUSVRJT04gJXMgIiwKLSAgICAgICAgICAgICAgICAgICAgc2MtPnBhcnRpdGlvbk5hbWUoKSk7Ci0gICAgICAgICAgICBpZiAoc2MtPmhhc1BhcnRpdGlvbk1heEJpdHMoKSkKLSAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTUFYQklUUyAlZCAiLAotICAgICAgICAgICAgICAgICAgICAgIHNjLT5wYXJ0aXRpb25NYXhCaXRzKCkpOwotICAgICAgICAgfQotICAgICAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0gICAgICAgICAtLW51bU9ianM7Ci0gICAgICAgICBpZiAobnVtT2JqcyA8PSAwKQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkVORCBTQ0FOQ0hBSU5TXG4iKTsKLSAgICAgICAgIGJyZWFrOwotICBjYXNlIGRlZnJJT1RpbWluZ0Nia1R5cGUgOgotICAgICAgICAgaW90ID0gKGRlZmlJT1RpbWluZyopY2w7Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICItICggJXMgJXMgKVxuIiwgaW90LT5pbnN0KCksCi0gICAgICAgICAgICAgICAgIGlvdC0+cGluKCkpOwotICAgICAgICAgaWYgKGlvdC0+aGFzU2xld1Jpc2UoKSkKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICsgUklTRSBTTEVXUkFURSAlZyAlZ1xuIiwKLSAgICAgICAgICAgICAgICAgICAgIGlvdC0+c2xld1Jpc2VNaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgIGlvdC0+c2xld1Jpc2VNYXgoKSk7Ci0gICAgICAgICBpZiAoaW90LT5oYXNTbGV3RmFsbCgpKQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgKyBGQUxMIFNMRVdSQVRFICVnICVnXG4iLAotICAgICAgICAgICAgICAgICAgICAgaW90LT5zbGV3RmFsbE1pbigpLAotICAgICAgICAgICAgICAgICAgICAgaW90LT5zbGV3RmFsbE1heCgpKTsKLSAgICAgICAgIGlmIChpb3QtPmhhc1ZhcmlhYmxlUmlzZSgpKQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgKyBSSVNFIFZBUklBQkxFICVnICVnXG4iLAotICAgICAgICAgICAgICAgICAgICAgaW90LT52YXJpYWJsZVJpc2VNaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgIGlvdC0+dmFyaWFibGVSaXNlTWF4KCkpOwotICAgICAgICAgaWYgKGlvdC0+aGFzVmFyaWFibGVGYWxsKCkpCi0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICArIEZBTEwgVkFSSUFCTEUgJWcgJWdcbiIsCi0gICAgICAgICAgICAgICAgICAgICBpb3QtPnZhcmlhYmxlRmFsbE1pbigpLAotICAgICAgICAgICAgICAgICAgICAgaW90LT52YXJpYWJsZUZhbGxNYXgoKSk7Ci0gICAgICAgICBpZiAoaW90LT5oYXNDYXBhY2l0YW5jZSgpKQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgKyBDQVBBQ0lUQU5DRSAlZ1xuIiwKLSAgICAgICAgICAgICAgICAgICAgIGlvdC0+Y2FwYWNpdGFuY2UoKSk7Ci0gICAgICAgICBpZiAoaW90LT5oYXNEcml2ZUNlbGwoKSkgewotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgKyBEUklWRUNFTEwgJXMgIiwKLSAgICAgICAgICAgICAgICAgICAgIGlvdC0+ZHJpdmVDZWxsKCkpOwotICAgICAgICAgICAgIGlmIChpb3QtPmhhc0Zyb20oKSkKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICBGUk9NUElOICVzICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW90LT5mcm9tKCkpOwotICAgICAgICAgICAgIGlmIChpb3QtPmhhc1RvKCkpCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgVE9QSU4gJXMgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpb3QtPnRvKCkpOwotICAgICAgICAgICAgIGlmIChpb3QtPmhhc1BhcmFsbGVsKCkpCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlBBUkFMTEVMICVnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpb3QtPnBhcmFsbGVsKCkpOwotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgICAgICB9Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICI7XG4iKTsKLSAgICAgICAgIC0tbnVtT2JqczsKLSAgICAgICAgIGlmIChudW1PYmpzIDw9IDApCi0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiRU5EIElPVElNSU5HU1xuIik7Ci0gICAgICAgICBicmVhazsKLSAgY2FzZSBkZWZyRlBDQ2JrVHlwZSA6Ci0gICAgICAgICBmcGMgPSAoZGVmaUZQQyopY2w7Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICItICVzICIsIGZwYy0+bmFtZSgpKTsKLSAgICAgICAgIGlmIChmcGMtPmlzVmVydGljYWwoKSkKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJWRVJUSUNBTCAiKTsKLSAgICAgICAgIGlmIChmcGMtPmlzSG9yaXpvbnRhbCgpKQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkhPUklaT05UQUwgIik7Ci0gICAgICAgICBpZiAoZnBjLT5oYXNBbGlnbigpKQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkFMSUdOICIpOwotICAgICAgICAgaWYgKGZwYy0+aGFzTWF4KCkpCi0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJWcgIiwgZnBjLT5hbGlnbk1heCgpKTsKLSAgICAgICAgIGlmIChmcGMtPmhhc01pbigpKQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVnICIsIGZwYy0+YWxpZ25NaW4oKSk7Ci0gICAgICAgICBpZiAoZnBjLT5oYXNFcXVhbCgpKQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVnICIsIGZwYy0+ZXF1YWwoKSk7Ci0gICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZnBjLT5udW1QYXJ0cygpOyBpKyspIHsKLSAgICAgICAgICAgICBmcGMtPmdldFBhcnQoaSwgJmNvcm5lciwgJnR5cCwgJm5hbWUpOwotICAgICAgICAgICAgIGlmIChjb3JuZXIgPT0gJ0InKQotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJCT1RUT01MRUZUICIpOwotICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiVE9QUklHSFQgIik7Ci0gICAgICAgICAgICAgaWYgKHR5cCA9PSAnUicpCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlJPV1MgJXMgIiwgbmFtZSk7Ci0gICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJDT01QUyAlcyAiLCBuYW1lKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGZwcmludGYoZm91dCwgIjtcbiIpOwotICAgICAgICAgLS1udW1PYmpzOwotICAgICAgICAgaWYgKG51bU9ianMgPD0gMCkKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJFTkQgRkxPT1JQTEFOQ09OU1RSQUlOVFNcbiIpOwotICAgICAgICAgYnJlYWs7Ci0gIGNhc2UgZGVmclRpbWluZ0Rpc2FibGVDYmtUeXBlIDoKLSAgICAgICAgIHRkID0gKGRlZmlUaW1pbmdEaXNhYmxlKiljbDsKLSAgICAgICAgIGlmICh0ZC0+aGFzRnJvbVRvKCkpCi0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiLSBGUk9NUElOICVzICVzICIsCi0gICAgICAgICAgICAgICAgICAgICB0ZC0+ZnJvbUluc3QoKSwKLSAgICAgICAgICAgICAgICAgICAgIHRkLT5mcm9tUGluKCksCi0gICAgICAgICAgICAgICAgICAgICB0ZC0+dG9JbnN0KCksCi0gICAgICAgICAgICAgICAgICAgICB0ZC0+dG9QaW4oKSk7Ci0gICAgICAgICBpZiAodGQtPmhhc1RocnUoKSkKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICItIFRIUlVQSU4gJXMgJXMgIiwKLSAgICAgICAgICAgICAgICAgICAgIHRkLT50aHJ1SW5zdCgpLAotICAgICAgICAgICAgICAgICAgICAgdGQtPnRocnVQaW4oKSk7Ci0gICAgICAgICBpZiAodGQtPmhhc01hY3JvRnJvbVRvKCkpCi0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiLSBNQUNSTyAlcyBGUk9NUElOICVzICVzICIsCi0gICAgICAgICAgICAgICAgICAgICB0ZC0+bWFjcm9OYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICB0ZC0+ZnJvbVBpbigpLAotICAgICAgICAgICAgICAgICAgICAgdGQtPnRvUGluKCkpOwotICAgICAgICAgaWYgKHRkLT5oYXNNYWNyb1RocnUoKSkKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICItIE1BQ1JPICVzIFRIUlVQSU4gJXMgJXMgIiwKLSAgICAgICAgICAgICAgICAgICAgIHRkLT5tYWNyb05hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgIHRkLT5mcm9tUGluKCkpOwotICAgICAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0gICAgICAgICBicmVhazsKLSAgY2FzZSBkZWZyUGFydGl0aW9uQ2JrVHlwZSA6Ci0gICAgICAgICBwYXJ0ID0gKGRlZmlQYXJ0aXRpb24qKWNsOwotICAgICAgICAgZnByaW50Zihmb3V0LCAiLSAlcyAiLCBwYXJ0LT5uYW1lKCkpOwotICAgICAgICAgaWYgKHBhcnQtPmlzU2V0dXBSaXNlKCkgfAotICAgICAgICAgICAgIHBhcnQtPmlzU2V0dXBGYWxsKCkgfAotICAgICAgICAgICAgIHBhcnQtPmlzSG9sZFJpc2UoKSB8Ci0gICAgICAgICAgICAgcGFydC0+aXNIb2xkRmFsbCgpKSB7Ci0gICAgICAgICAgICAgLy8gaGFzIHR1cm5vZmYgCi0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiVFVSTk9GRiAiKTsgCi0gICAgICAgICAgICAgaWYgKHBhcnQtPmlzU2V0dXBSaXNlKCkpCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlNFVFVQUklTRSAiKTsgCi0gICAgICAgICAgICAgaWYgKHBhcnQtPmlzU2V0dXBGYWxsKCkpCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlNFVFVQRkFMTCAiKTsgCi0gICAgICAgICAgICAgaWYgKHBhcnQtPmlzSG9sZFJpc2UoKSkKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiSE9MRFJJU0UgIik7IAotICAgICAgICAgICAgIGlmIChwYXJ0LT5pc0hvbGRGYWxsKCkpCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkhPTERGQUxMICIpOyAKLSAgICAgICAgIH0KLSAgICAgICAgIGl0ZW1UID0gcGFydC0+aXRlbVR5cGUoKTsKLSAgICAgICAgIGRpciA9IHBhcnQtPmRpcmVjdGlvbigpOwotICAgICAgICAgaWYgKHN0cmNtcChpdGVtVCwgIkNMT0NLIikgPT0gMCkgewotICAgICAgICAgICAgIGlmIChkaXIgPT0gJ1QnKSAgICAvLyB0b2Nsb2NrcGluCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgVE9DTE9DS1BJTiAlcyAlcyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQtPmluc3ROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGFydC0+cGluTmFtZSgpKTsKLSAgICAgICAgICAgICBpZiAoZGlyID09ICdGJykgICAgLy8gZnJvbWNsb2NrcGluCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgRlJPTUNMT0NLUElOICVzICVzICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGFydC0+aW5zdE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LT5waW5OYW1lKCkpOwotICAgICAgICAgICAgIGlmIChwYXJ0LT5oYXNNaW4oKSkKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTUlOICVnICVnICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGFydC0+cGFydGl0aW9uTWluKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGFydC0+cGFydGl0aW9uTWF4KCkpOwotICAgICAgICAgICAgIGlmIChwYXJ0LT5oYXNNYXgoKSkKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTUFYICVnICVnICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGFydC0+cGFydGl0aW9uTWluKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGFydC0+cGFydGl0aW9uTWF4KCkpOwotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlBJTlMgIik7Ci0gICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhcnQtPm51bVBpbnMoKTsgaSsrKQotICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgcGFydC0+cGluKGkpKTsKLSAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGl0ZW1ULCAiSU8iKSA9PSAwKSB7Ci0gICAgICAgICAgICAgaWYgKGRpciA9PSAnVCcpICAgIC8vIHRvaW9waW4KLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBUT0lPUElOICVzICVzICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGFydC0+aW5zdE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LT5waW5OYW1lKCkpOwotICAgICAgICAgICAgIGlmIChkaXIgPT0gJ0YnKSAgICAvLyBmcm9taW9waW4KLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBGUk9NSU9QSU4gJXMgJXMgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LT5pbnN0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQtPnBpbk5hbWUoKSk7Ci0gICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChpdGVtVCwgIkNPTVAiKSA9PSAwKSB7Ci0gICAgICAgICAgICAgaWYgKGRpciA9PSAnVCcpICAgIC8vIHRvY29tcHBpbgotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIFRPQ09NUFBJTiAlcyAlcyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQtPmluc3ROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGFydC0+cGluTmFtZSgpKTsKLSAgICAgICAgICAgICBpZiAoZGlyID09ICdGJykgICAgLy8gZnJvbWNvbXBwaW4KLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBGUk9NQ09NUFBJTiAlcyAlcyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQtPmluc3ROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGFydC0+cGluTmFtZSgpKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGZwcmludGYoZm91dCwgIjtcbiIpOwotICAgICAgICAgLS1udW1PYmpzOwotICAgICAgICAgaWYgKG51bU9ianMgPD0gMCkKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJFTkQgUEFSVElUSU9OU1xuIik7Ci0gICAgICAgICBicmVhazsKLQotICBjYXNlIGRlZnJQaW5Qcm9wQ2JrVHlwZSA6Ci0gICAgICAgICBwcHJvcCA9IChkZWZpUGluUHJvcCopY2w7Ci0gICAgICAgICBpZiAocHByb3AtPmlzUGluKCkpCi0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICItIFBJTiAlcyAiLCBwcHJvcC0+cGluTmFtZSgpKTsKLSAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICItICVzICVzICIsCi0gICAgICAgICAgICAgICAgICAgIHBwcm9wLT5pbnN0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICBwcHJvcC0+cGluTmFtZSgpKTsKLSAgICAgICAgIGZwcmludGYoZm91dCwgIjtcbiIpOwotICAgICAgICAgaWYgKHBwcm9wLT5udW1Qcm9wcygpID4gMCkgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBwcm9wLT5udW1Qcm9wcygpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICsgUFJPUEVSVFkgJXMgJXMgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBwcm9wLT5wcm9wTmFtZShpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBwcm9wLT5wcm9wVmFsdWUoaSkpOwotICAgICAgICAgICAgICAgIHN3aXRjaCAocHByb3AtPnByb3BUeXBlKGkpKSB7Ci0gICAgICAgICAgICAgICAgICAgY2FzZSAnUic6IGZwcmludGYoZm91dCwgIlJFQUwgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgIGNhc2UgJ0knOiBmcHJpbnRmKGZvdXQsICJJTlRFR0VSICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICBjYXNlICdTJzogZnByaW50Zihmb3V0LCAiU1RSSU5HICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICBjYXNlICdRJzogZnByaW50Zihmb3V0LCAiUVVPVEVTVFJJTkcgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgIGNhc2UgJ04nOiBmcHJpbnRmKGZvdXQsICJOVU1CRVIgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIjtcbiIpOwotICAgICAgICAgfQotICAgICAgICAgLS1udW1PYmpzOwotICAgICAgICAgaWYgKG51bU9ianMgPD0gMCkKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJFTkQgUElOUFJPUEVSVElFU1xuIik7Ci0gICAgICAgICBicmVhazsKLSAgY2FzZSBkZWZyQmxvY2thZ2VDYmtUeXBlIDoKLSAgICAgICAgIGJsb2NrID0gKGRlZmlCbG9ja2FnZSopY2w7Ci0gICAgICAgICBpZiAodGVzdERlYnVnUHJpbnQpIHsKLSAgICAgICAgICAgICBibG9jay0+cHJpbnQoZm91dCk7Ci0gICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgIGlmIChibG9jay0+aGFzTGF5ZXIoKSkgewotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIi0gTEFZRVIgJXNcbiIsIGJsb2NrLT5sYXllck5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJsb2NrLT5oYXNDb21wb25lbnQoKSkKLSAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICArIENPTVBPTkVOVCAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLT5sYXllckNvbXBvbmVudE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJsb2NrLT5oYXNTbG90cygpKQotICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgICsgU0xPVFNcbiIpOwotICAgICAgICAgICAgICAgIGlmIChibG9jay0+aGFzRmlsbHMoKSkKLSAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICArIEZJTExTXG4iKTsKLSAgICAgICAgICAgICAgICBpZiAoYmxvY2stPmhhc1B1c2hkb3duKCkpCi0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICAgKyBQVVNIRE9XTlxuIik7Ci0gICAgICAgICAgICAgICAgaWYgKGJsb2NrLT5oYXNFeGNlcHRwZ25ldCgpKQotICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgICsgRVhDRVBUUEdORVRcbiIpOwotICAgICAgICAgICAgICAgIGlmIChibG9jay0+aGFzTWFzaygpKQotICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgICsgTUFTSyAlZFxuIiwgYmxvY2stPm1hc2soKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJsb2NrLT5oYXNTcGFjaW5nKCkpCi0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICAgKyBTUEFDSU5HICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2stPm1pblNwYWNpbmcoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJsb2NrLT5oYXNEZXNpZ25SdWxlV2lkdGgoKSkKLSAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICArIERFU0lHTlJVTEVXSURUSCAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLT5kZXNpZ25SdWxlV2lkdGgoKSk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGVsc2UgaWYgKGJsb2NrLT5oYXNQbGFjZW1lbnQoKSkgewotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIi0gUExBQ0VNRU5UXG4iKTsKLSAgICAgICAgICAgICAgICBpZiAoYmxvY2stPmhhc1NvZnQoKSkKLSAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICArIFNPRlRcbiIpOwotICAgICAgICAgICAgICAgIGlmIChibG9jay0+aGFzUGFydGlhbCgpKQotICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgICsgUEFSVElBTCAlZ1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLT5wbGFjZW1lbnRNYXhEZW5zaXR5KCkpOwotICAgICAgICAgICAgICAgIGlmIChibG9jay0+aGFzQ29tcG9uZW50KCkpCi0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICAgKyBDT01QT05FTlQgJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jay0+cGxhY2VtZW50Q29tcG9uZW50TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoYmxvY2stPmhhc1B1c2hkb3duKCkpCi0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICAgKyBQVVNIRE9XTlxuIik7Ci0gICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGJsb2NrLT5udW1SZWN0YW5nbGVzKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgIFJFQ1QgJWQgJWQgJWQgJWRcbiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2stPnhsKGkpLCBibG9jay0+eWwoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICBibG9jay0+eGgoaSksIGJsb2NrLT55aChpKSk7Ci0gICAgICAgICAgICAgfSAKLQotICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBibG9jay0+bnVtUG9seWdvbnMoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICAgUE9MWUdPTiAiKTsKLSAgICAgICAgICAgICAgICBwb2ludHMgPSBibG9jay0+Z2V0UG9seWdvbihpKTsKLSAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcG9pbnRzLm51bVBvaW50czsgaisrKQotICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVkICVkICIsIHBvaW50cy54W2pdLCBwb2ludHMueVtqXSk7Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0gICAgICAgICAgICAgLS1udW1PYmpzOwotICAgICAgICAgICAgIGlmIChudW1PYmpzIDw9IDApCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkVORCBCTE9DS0FHRVNcbiIpOwotICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0gIGNhc2UgZGVmclNsb3RDYmtUeXBlIDoKLSAgICAgICAgIHNsb3RzID0gKGRlZmlTbG90KiljbDsKLSAgICAgICAgIGlmIChzbG90cy0+aGFzTGF5ZXIoKSkKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIi0gTEFZRVIgJXNcbiIsIHNsb3RzLT5sYXllck5hbWUoKSk7Ci0KLSAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzbG90cy0+bnVtUmVjdGFuZ2xlcygpOyBpKyspIHsKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgIFJFQ1QgJWQgJWQgJWQgJWRcbiIsIAotICAgICAgICAgICAgICAgICAgICBzbG90cy0+eGwoaSksIHNsb3RzLT55bChpKSwKLSAgICAgICAgICAgICAgICAgICAgc2xvdHMtPnhoKGkpLCBzbG90cy0+eWgoaSkpOwotICAgICAgICAgfSAKLSAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzbG90cy0+bnVtUG9seWdvbnMoKTsgaSsrKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICBQT0xZR09OICIpOwotICAgICAgICAgICAgcG9pbnRzID0gc2xvdHMtPmdldFBvbHlnb24oaSk7Ci0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcG9pbnRzLm51bVBvaW50czsgaisrKQotICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlZCAlZCAiLCBwb2ludHMueFtqXSwgcG9pbnRzLnlbal0pOwotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0gICAgICAgICB9Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICI7XG4iKTsKLSAgICAgICAgIC0tbnVtT2JqczsKLSAgICAgICAgIGlmIChudW1PYmpzIDw9IDApCi0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiRU5EIFNMT1RTXG4iKTsKLSAgICAgICAgIGJyZWFrOwotICBjYXNlIGRlZnJGaWxsQ2JrVHlwZSA6Ci0gICAgICAgICBmaWxscyA9IChkZWZpRmlsbCopY2w7Ci0gICAgICAgICBpZiAodGVzdERlYnVnUHJpbnQpIHsKLSAgICAgICAgICAgICAgZmlsbHMtPnByaW50KGZvdXQpOwotICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICBpZiAoZmlsbHMtPmhhc0xheWVyKCkpIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICItIExBWUVSICVzIiwgZmlsbHMtPmxheWVyTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsbHMtPmxheWVyTWFzaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiArIE1BU0sgJWQiLCBmaWxscy0+bGF5ZXJNYXNrKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZmlsbHMtPmhhc0xheWVyT3BjKCkpCi0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICsgT1BDIik7Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmaWxscy0+bnVtUmVjdGFuZ2xlcygpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICBSRUNUICVkICVkICVkICVkXG4iLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxzLT54bChpKSwgZmlsbHMtPnlsKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbHMtPnhoKGkpLCBmaWxscy0+eWgoaSkpOwotICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGZpbGxzLT5udW1Qb2x5Z29ucygpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICBQT0xZR09OICIpOyAKLSAgICAgICAgICAgICAgICAgICBwb2ludHMgPSBmaWxscy0+Z2V0UG9seWdvbihpKTsKLSAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcG9pbnRzLm51bVBvaW50czsgaisrKQotICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJWQgJWQgIiwgcG9pbnRzLnhbal0sIHBvaW50cy55W2pdKTsKLSAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICI7XG4iKTsKLSAgICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIjtcbiIpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAtLW51bU9ianM7Ci0gICAgICAgICAgICAgaWYgKGZpbGxzLT5oYXNWaWEoKSkgewotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIi0gVklBICVzIiwgZmlsbHMtPnZpYU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGxzLT52aWFUb3BNYXNrKCkgfHwgZmlsbHMtPnZpYUN1dE1hc2soKQotICAgICAgICAgICAgICAgICAgICB8fCBmaWxscy0+dmlhQm90dG9tTWFzaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiArIE1BU0sgJWQlZCVkIiwgCi0gICAgICAgICAgICAgICAgICAgIGZpbGxzLT52aWFUb3BNYXNrKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxscy0+dmlhQ3V0TWFzaygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbHMtPnZpYUJvdHRvbU1hc2soKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChmaWxscy0+aGFzVmlhT3BjKCkpCi0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICsgT1BDIik7Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmaWxscy0+bnVtVmlhUHRzKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgIHBvaW50cyA9IGZpbGxzLT5nZXRWaWFQdHMoaSk7Ci0gICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBvaW50cy5udW1Qb2ludHM7IGorKykKLSAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgJWQgJWQiLCBwb2ludHMueFtqXSwgcG9pbnRzLnlbal0pOwotICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIjtcbiIpOyAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGlmIChudW1PYmpzIDw9IDApCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkVORCBGSUxMU1xuIik7Ci0gICAgICAgICB9Ci0gICAgICAgICBicmVhazsKLSAgY2FzZSBkZWZyU3R5bGVzQ2JrVHlwZSA6Ci0gICAgICAgICBzdHJ1Y3QgZGVmaVBvaW50cyBwb2ludHM7Ci0gICAgICAgICBzdHlsZXMgPSAoZGVmaVN0eWxlcyopY2w7Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICItIFNUWUxFICVkICIsIHN0eWxlcy0+c3R5bGUoKSk7Ci0gICAgICAgICBwb2ludHMgPSBzdHlsZXMtPmdldFBvbHlnb24oKTsKLSAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwb2ludHMubnVtUG9pbnRzOyBqKyspCi0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlZCAlZCAiLCBwb2ludHMueFtqXSwgcG9pbnRzLnlbal0pOwotICAgICAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0gICAgICAgICAtLW51bU9ianM7Ci0gICAgICAgICBpZiAobnVtT2JqcyA8PSAwKQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkVORCBTVFlMRVNcbiIpOwotICAgICAgICAgYnJlYWs7Ci0KLSAgZGVmYXVsdDogZnByaW50Zihmb3V0LCAiQk9HVVMgY2FsbGJhY2sgdG8gY2xzLlxuIik7IHJldHVybiAxOwotICB9Ci0gIHJldHVybiAwOwotfQotCi0KLWludCBkbihkZWZyQ2FsbGJhY2tUeXBlX2UgYywgY29uc3QgY2hhciogaCwgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgZnByaW50Zihmb3V0LCAiRElWSURFUkNIQVIgXCIlc1wiIDtcbiIsaCk7Ci0gIHJldHVybiAwOwotfQotCi0KLWludCBleHQoZGVmckNhbGxiYWNrVHlwZV9lIHQsIGNvbnN0IGNoYXIqIGMsIGRlZmlVc2VyRGF0YSB1ZCkgewotICBjaGFyKiBuYW1lOwotCi0gIGNoZWNrVHlwZSh0KTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLQotICBzd2l0Y2ggKHQpIHsKLSAgY2FzZSBkZWZyTmV0RXh0Q2JrVHlwZSA6IG5hbWUgPSBhZGRyZXNzKCJuZXQiKTsgYnJlYWs7Ci0gIGNhc2UgZGVmckNvbXBvbmVudEV4dENia1R5cGUgOiBuYW1lID0gYWRkcmVzcygiY29tcG9uZW50Iik7IGJyZWFrOwotICBjYXNlIGRlZnJQaW5FeHRDYmtUeXBlIDogbmFtZSA9IGFkZHJlc3MoInBpbiIpOyBicmVhazsKLSAgY2FzZSBkZWZyVmlhRXh0Q2JrVHlwZSA6IG5hbWUgPSBhZGRyZXNzKCJ2aWEiKTsgYnJlYWs7Ci0gIGNhc2UgZGVmck5ldENvbm5lY3Rpb25FeHRDYmtUeXBlIDogbmFtZSA9IGFkZHJlc3MoIm5ldCBjb25uZWN0aW9uIik7IGJyZWFrOwotICBjYXNlIGRlZnJHcm91cEV4dENia1R5cGUgOiBuYW1lID0gYWRkcmVzcygiZ3JvdXAiKTsgYnJlYWs7Ci0gIGNhc2UgZGVmclNjYW5DaGFpbkV4dENia1R5cGUgOiBuYW1lID0gYWRkcmVzcygic2NhbmNoYWluIik7IGJyZWFrOwotICBjYXNlIGRlZnJJb1RpbWluZ3NFeHRDYmtUeXBlIDogbmFtZSA9IGFkZHJlc3MoImlvIHRpbWluZyIpOyBicmVhazsKLSAgY2FzZSBkZWZyUGFydGl0aW9uc0V4dENia1R5cGUgOiBuYW1lID0gYWRkcmVzcygicGFydGl0aW9uIik7IGJyZWFrOwotICBkZWZhdWx0OiBuYW1lID0gYWRkcmVzcygiQk9HVVMiKTsgcmV0dXJuIDE7Ci0gIH0KLSAgZnByaW50Zihmb3V0LCAiICAlcyBleHRlbnNpb24gJXNcbiIsIG5hbWUsIGMpOwotICByZXR1cm4gMDsKLX0KLQotaW50IGV4dGVuc2lvbihkZWZyQ2FsbGJhY2tUeXBlX2UgYywgY29uc3QgY2hhciogZXh0c24sIGRlZmlVc2VyRGF0YSB1ZCkgewotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGZwcmludGYoZm91dCwgIkJFR0lORVhUICVzXG4iLCBleHRzbik7Ci0gIHJldHVybiAwOwotfQotCi12b2lkKiBtYWxsb2NDQihzaXplX3Qgc2l6ZSkgewotICByZXR1cm4gbWFsbG9jKHNpemUpOwotfQotCi12b2lkKiByZWFsbG9jQ0Iodm9pZCogbmFtZSwgc2l6ZV90IHNpemUpIHsKLSAgcmV0dXJuIHJlYWxsb2MobmFtZSwgc2l6ZSk7Ci19Ci0KLXZvaWQgZnJlZUNCKHZvaWQqIG5hbWUpIHsKLSAgZnJlZShuYW1lKTsKLSAgcmV0dXJuOwotfQotCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi1leHRlcm4gbG9uZyBsb25nIG5saW5lczsKLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotc3RhdGljIGludCBjY3IxMTMxNDQ0ID0gMDsKLQotdm9pZCBsaW5lTnVtYmVyQ0IobG9uZyBsb25nIGxpbmVObykgewotCi0gICAgLy8gVGhlIENDUiAxMTMxNDQ0IHRlc3RzIGFiaWxpdHkgb2YgdGhlIERFRiBwYXJzZXIgdG8gY291bnQgCi0gICAgLy8gaW5wdXQgbGluZSBudW1iZXJzIG91dCBvZiAzMi1iaXQgaW50IHJhbmdlLiBPbiB0aGUgZmlyc3QgY2FsbGJhY2sgCi0gICAgLy8gY2FsbCAxMEcgbGluZXMgd2lsbCBiZSBhZGRlZCB0byBsaW5lIGNvdW50ZXIuIEl0IHNob3VsZCBiZSAKLSAgICAvLyByZWZsZWN0ZWQgaW4gb3V0cHV0LgotICAgIGlmIChjY3IxMTMxNDQ0KSB7Ci0gICAgICAgIGxpbmVObyArPSAxMDAwMDAwMDAwMExMOwotICAgICAgICBkZWZyU2V0TkxpbmVzKGxpbmVObyk7Ci0gICAgICAgIGNjcjExMzE0NDQgPSAwOwotICAgIH0KLQotI2lmZGVmIF9XSU4zMgotICBmcHJpbnRmKGZvdXQsICJQYXJzZWQgJUk2NGQgbnVtYmVyIG9mIGxpbmVzISFcbiIsIGxpbmVObyk7Ci0jZWxzZSAKLSAgZnByaW50Zihmb3V0LCAiUGFyc2VkICVsbGQgbnVtYmVyIG9mIGxpbmVzISFcbiIsIGxpbmVObyk7Ci0jZW5kaWYKLX0KLQotaW50IHVuVXNlZENCKGRlZnJDYWxsYmFja1R5cGVfZSwgdm9pZCosIGRlZmlVc2VyRGF0YSkgewotICBmcHJpbnRmKGZvdXQsICJUaGlzIGNhbGxiYWNrIGlzIG5vdCB1c2VkLlxuIik7Ci0gIHJldHVybiAwOwotfQotCi12b2lkIHByaW50V2FybmluZyhjb25zdCBjaGFyICpzdHIpCi17Ci0gICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgc3RyKTsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gIGludCBudW0gPSA5OTsKLSAgY2hhciogaW5GaWxlWzZdOwotICBjaGFyKiBvdXRGaWxlOwotICBGSUxFKiBmOwotICBpbnQgcmVzOwotICBpbnQgbm9DYWxscyA9IDA7Ci0vLyAgbG9uZyBzdGFydF9tZW07Ci0gIGludCByZXRTdHIgPSAwOwotICBpbnQgbnVtSW5GaWxlID0gMDsKLSAgaW50IGZpbGVDdCA9IDA7Ci0gIGludCB0ZXN0MSA9IDA7Ci0gIGludCB0ZXN0MiA9IDA7Ci0gIGludCBub05ldENiID0gMDsKLSAgaW50IGNjcjc0OTg1MyA9IDA7Ci0gIGludCBsaW5lX251bV9wcmludF9pbnRlcnZhbCA9IDUwOwotCi0jaWZkZWYgV0lOMzIKLSAgICAvLyBFbmFibGUgdHdvLWRpZ2l0IGV4cG9uZW50IGZvcm1hdAotICAgIF9zZXRfb3V0cHV0X2Zvcm1hdChfVFdPX0RJR0lUX0VYUE9ORU5UKTsKLSNlbmRpZgotCi0vLyAgc3RhcnRfbWVtID0gKGxvbmcpc2JyaygwKTsKLQotICBzdHJjcHkoZGVmYXVsdE5hbWUsICJkZWYuaW4iKTsKLSAgc3RyY3B5KGRlZmF1bHRPdXQsICJsaXN0Iik7Ci0gIGluRmlsZVswXSA9IGRlZmF1bHROYW1lOwotICBvdXRGaWxlID0gZGVmYXVsdE91dDsKLSAgZm91dCA9IHN0ZG91dDsKLSAgdXNlckRhdGEgPSAodm9pZCopIDB4MDEwMjAzMDQ7Ci0gIGFyZ2MtLTsKLSAgYXJndisrOwotCi0gIGlmIChhcmdjID09IDApIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlR5cGUgJ2RlZnJ3IC0taGVscCcgZm9yIHRoZSBoZWxwLlxuIik7Ci0gICAgcmV0dXJuIDI7Ci0gIH0KLQotICB3aGlsZSAoYXJnYy0tKSB7Ci0gICAgaWYgKHN0cmNtcCgqYXJndiwgIi1kIikgPT0gMCkgewotICAgICAgYXJndisrOwotICAgICAgYXJnYy0tOwotICAgICAgc3NjYW5mKCphcmd2LCAiJWQiLCAmbnVtKTsKLSAgICAgIGRlZmlTZXREZWJ1ZyhudW0sIDEpOwotICAgIH0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLW5jIikgPT0gMCkgewotICAgICAgbm9DYWxscyA9IDE7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItbyIpID09IDApIHsKLSAgICAgIGFyZ3YrKzsKLSAgICAgIGFyZ2MtLTsKLSAgICAgIG91dEZpbGUgPSAqYXJndjsKLSAgICAgIGlmICgoZm91dCA9IGZvcGVuKG91dEZpbGUsICJ3IikpID09IDApIHsKLQkgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IGNvdWxkIG5vdCBvcGVuIG91dHB1dCBmaWxlXG4iKTsKLQkgICAgICAgIHJldHVybiAyOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItdmVyU3RyIikgPT0gMCkgewotICAgICAgICAvKiBOZXcgdG8gc2V0IHRoZSB2ZXJzaW9uIGNhbGxiYWNrIHJvdXRpbmUgdG8gcmV0dXJuIGEgc3RyaW5nICAgICovCi0gICAgICAgIC8qIGluc3RlYWQgb2YgZG91YmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgcmV0U3RyID0gMTsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1pIikgPT0gMCkgewotICAgICAgICBhcmd2Kys7Ci0gICAgICAgIGFyZ2MtLTsKLSAgICAgICAgbGluZV9udW1fcHJpbnRfaW50ZXJ2YWwgPSBhdG9pKCphcmd2KTsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi10ZXN0MSIpID09IDApIHsKLSAgICAgIHRlc3QxID0gMTsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi10ZXN0MiIpID09IDApIHsKLSAgICAgIHRlc3QyID0gMTsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1ub05ldCIpID09IDApIHsKLSAgICAgIG5vTmV0Q2IgPSAxOwotICAgIH0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLWNjcjc0OTg1MyIpID09IDApIHsKLSAgICAgIGNjcjc0OTg1MyA9IDE7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItY2NyMTEzMTQ0NCIpID09IDApIHsKLSAgICAgICAgY2NyMTEzMTQ0NCA9IDE7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItdGVzdERlYnVnUHJpbnQiKSA9PSAwKSB7Ci0gICAgICAgIHRlc3REZWJ1Z1ByaW50ID0gMTsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1zZXNzaW9ubGVzcyIpID09IDApIHsKLSAgICAgICAgaXNTZXNzaW9ubGVzcyA9IDE7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItaWdub3JlUm93TmFtZXMiKSA9PSAwKSB7Ci0gICAgICAgIGlnbm9yZVJvd05hbWVzID0gMTsKLQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1pZ25vcmVWaWFOYW1lcyIpID09IDApIHsKLSAgICAgICAgaWdub3JlVmlhTmFtZXMgPSAxOwotCX0gZWxzZSBpZiAoYXJndlswXVswXSAhPSAnLScpIHsKLSAgICAgIGlmIChudW1JbkZpbGUgPj0gNikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiB0b28gbWFueSBpbnB1dCBmaWxlcywgbWF4ID0gNi5cbiIpOwotICAgICAgICByZXR1cm4gMjsKLSAgICAgIH0KLSAgICAgIGluRmlsZVtudW1JbkZpbGUrK10gPSAqYXJndjsKLSAgICB9IGVsc2UgaWYgKChzdHJjbXAoKmFyZ3YsICItaCIpID09IDApIHx8IChzdHJjbXAoKmFyZ3YsICItLWhlbHAiKSA9PSAwKSkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogZGVmcncgKDxvcHRpb24+fDxmaWxlPikqIFxuIik7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIkZpbGVzOlxuIik7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIlx0dXB0byA2IERFRiBmaWxlcyBtYW55IGJlIHN1cHBsaWVkLlxuIik7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIlx0aWYgPGRlZkZpbGVOYW1lPiBpcyBzZXQgdG8gJ1NURElOJyAtIHRha2VzIGRhdGEgZnJvbSBzdGRpbi5cbiIpOwotICAgICAgZnByaW50ZihzdGRlcnIsICJPcHRpb25zOlxuIik7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIlx0LWkgPG51bV9saW5lcz4gLS0gc2V0cyBwcm9jZXNzaW5nIG1zZyBpbnRlcnZhbCAoZGVmYXVsdDogNTAgbGluZXMpLlxuIik7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIlx0LW5jICAgICAgICAgICAgLS0gbm8gZnVuY3Rpb25hbCBjYWxsYmFja3Mgd2lsbCBiZSBjYWxsZWQuXG4iKTsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiXHQtbyA8b3V0X2ZpbGU+ICAtLSB3cml0ZSBvdXRwdXQgdG8gdGhlIGZpbGUuXG4iKTsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiXHQtaWdub3JlUm93TmFtZXMgICAtLSBkb24ndCBvdXRwdXQgcm93IG5hbWVzLlxuIik7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIlx0LWlnbm9yZVZpYU5hbWVzICAgLS0gZG9uJ3Qgb3V0cHV0IHZpYSBuYW1lcy5cbiIpOwotICAgICAgcmV0dXJuIDI7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItc2V0U05ldFdpcmVDYmsiKSA9PSAwKSB7Ci0gICAgICBzZXRTTmV0V2lyZUNiayA9IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IElsbGVnYWwgY29tbWFuZCBsaW5lIG9wdGlvbjogJyVzJ1xuIiwgKmFyZ3YpOwotICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0gICAgYXJndisrOwotICB9Ci0KLSAgLy9kZWZyU2V0TG9nRnVuY3Rpb24obXlMb2dGdW5jdGlvbik7Ci0gIC8vZGVmclNldFdhcm5pbmdMb2dGdW5jdGlvbihteVdhcm5pbmdMb2dGdW5jdGlvbik7Ci0KLSAgaWYgKGlzU2Vzc2lvbmxlc3MpIHsKLSAgICAgIGRlZnJJbml0U2Vzc2lvbigwKTsKLQkgIGRlZnJTZXRMb25nTGluZU51bWJlckZ1bmN0aW9uKGxpbmVOdW1iZXJDQik7Ci0JICBkZWZyU2V0RGVsdGFOdW1iZXJMaW5lcyhsaW5lX251bV9wcmludF9pbnRlcnZhbCk7Ci0gIH0KLQotICBkZWZySW5pdFNlc3Npb24oaXNTZXNzaW9ubGVzcyA/IDAgOiAxKTsKLQotICBpZiAobm9DYWxscyA9PSAwKSB7Ci0KLSAgICBkZWZyU2V0V2FybmluZ0xvZ0Z1bmN0aW9uKHByaW50V2FybmluZyk7Ci0KLQotICAgIGRlZnJTZXRVc2VyRGF0YSgodm9pZCopMyk7Ci0gICAgZGVmclNldERlc2lnbkNiayhkbmFtZSk7Ci0gICAgZGVmclNldFRlY2hub2xvZ3lDYmsodG5hbWUpOwotICAgIGRlZnJTZXRFeHRlbnNpb25DYmsoZXh0ZW5zaW9uKTsKLSAgICBkZWZyU2V0RGVzaWduRW5kQ2JrKGRvbmUpOwotICAgIGRlZnJTZXRQcm9wRGVmU3RhcnRDYmsocHJvcHN0YXJ0KTsKLSAgICBkZWZyU2V0UHJvcENiayhwcm9wKTsKLSAgICBkZWZyU2V0UHJvcERlZkVuZENiayhwcm9wZW5kKTsKLSAgICAvKiBUZXN0IGZvciBDQ1IgNzY2Mjg5Ki8KLSAgICBpZiAoIW5vTmV0Q2IpCi0gICAgICBkZWZyU2V0TmV0Q2JrKG5ldGYpOwotICAgIGRlZnJTZXROZXROYW1lQ2JrKG5ldE5hbWVmKTsKLSAgICBkZWZyU2V0TmV0Tm9uRGVmYXVsdFJ1bGVDYmsobm9uZGVmUnVsZWYpOwotICAgIGRlZnJTZXROZXRTdWJuZXROYW1lQ2JrKHN1Ym5ldE5hbWVmKTsKLSAgICBkZWZyU2V0TmV0UGFydGlhbFBhdGhDYmsobmV0cGF0aCk7Ci0gICAgZGVmclNldFNOZXRDYmsoc25ldGYpOwotICAgIGRlZnJTZXRTTmV0UGFydGlhbFBhdGhDYmsoc25ldHBhdGgpOwotICAgIGlmIChzZXRTTmV0V2lyZUNiaykKLSAgICAgIGRlZnJTZXRTTmV0V2lyZUNiayhzbmV0d2lyZSk7Ci0gICAgZGVmclNldENvbXBvbmVudE1hc2tTaGlmdExheWVyQ2JrKGNvbXBNU0wpOwotICAgIGRlZnJTZXRDb21wb25lbnRDYmsoY29tcGYpOwotICAgIGRlZnJTZXRBZGRQYXRoVG9OZXQoKTsKLSAgICBkZWZyU2V0SGlzdG9yeUNiayhoaXN0KTsKLSAgICBkZWZyU2V0Q29uc3RyYWludENiayhjb25zdHJhaW50KTsKLSAgICBkZWZyU2V0QXNzZXJ0aW9uQ2JrKGNvbnN0cmFpbnQpOwotICAgIGRlZnJTZXRBcnJheU5hbWVDYmsoYW4pOwotICAgIGRlZnJTZXRGbG9vclBsYW5OYW1lQ2JrKGZuKTsKLSAgICBkZWZyU2V0RGl2aWRlckNiayhkbik7Ci0gICAgZGVmclNldEJ1c0JpdENiayhiYm4pOwotICAgIGRlZnJTZXROb25EZWZhdWx0Q2JrKG5kcik7Ci0KLSAgICBkZWZyU2V0QXNzZXJ0aW9uc1N0YXJ0Q2JrKGNvbnN0cmFpbnRzdCk7Ci0gICAgZGVmclNldENvbnN0cmFpbnRzU3RhcnRDYmsoY29uc3RyYWludHN0KTsKLSAgICBkZWZyU2V0Q29tcG9uZW50U3RhcnRDYmsoY3MpOwotICAgIGRlZnJTZXRQaW5Qcm9wU3RhcnRDYmsoY3MpOwotICAgIGRlZnJTZXROZXRTdGFydENiayhjcyk7Ci0gICAgZGVmclNldFN0YXJ0UGluc0Niayhjcyk7Ci0gICAgZGVmclNldFZpYVN0YXJ0Q2JrKGNzKTsKLSAgICBkZWZyU2V0UmVnaW9uU3RhcnRDYmsoY3MpOwotICAgIGRlZnJTZXRTTmV0U3RhcnRDYmsoY3MpOwotICAgIGRlZnJTZXRHcm91cHNTdGFydENiayhjcyk7Ci0gICAgZGVmclNldFNjYW5jaGFpbnNTdGFydENiayhjcyk7Ci0gICAgZGVmclNldElPVGltaW5nc1N0YXJ0Q2JrKGNzKTsKLSAgICBkZWZyU2V0RlBDU3RhcnRDYmsoY3MpOwotICAgIGRlZnJTZXRUaW1pbmdEaXNhYmxlc1N0YXJ0Q2JrKGNzKTsKLSAgICBkZWZyU2V0UGFydGl0aW9uc1N0YXJ0Q2JrKGNzKTsKLSAgICBkZWZyU2V0QmxvY2thZ2VTdGFydENiayhjcyk7Ci0gICAgZGVmclNldFNsb3RTdGFydENiayhjcyk7Ci0gICAgZGVmclNldEZpbGxTdGFydENiayhjcyk7Ci0gICAgZGVmclNldE5vbkRlZmF1bHRTdGFydENiayhjcyk7Ci0gICAgZGVmclNldFN0eWxlc1N0YXJ0Q2JrKGNzKTsKLQotICAgIC8vIEFsbCBvZiB0aGUgZXh0ZW5zaW9ucyBwb2ludCB0byB0aGUgc2FtZSBmdW5jdGlvbi4KLSAgICBkZWZyU2V0TmV0RXh0Q2JrKGV4dCk7Ci0gICAgZGVmclNldENvbXBvbmVudEV4dENiayhleHQpOwotICAgIGRlZnJTZXRQaW5FeHRDYmsoZXh0KTsKLSAgICBkZWZyU2V0VmlhRXh0Q2JrKGV4dCk7Ci0gICAgZGVmclNldE5ldENvbm5lY3Rpb25FeHRDYmsoZXh0KTsKLSAgICBkZWZyU2V0R3JvdXBFeHRDYmsoZXh0KTsKLSAgICBkZWZyU2V0U2NhbkNoYWluRXh0Q2JrKGV4dCk7Ci0gICAgZGVmclNldElvVGltaW5nc0V4dENiayhleHQpOwotICAgIGRlZnJTZXRQYXJ0aXRpb25zRXh0Q2JrKGV4dCk7Ci0KLSAgICBkZWZyU2V0VW5pdHNDYmsodW5pdHMpOwotICAgIGlmICghcmV0U3RyKQotICAgICAgIGRlZnJTZXRWZXJzaW9uQ2JrKHZlcnMpOwotICAgIGVsc2UKLSAgICAgICBkZWZyU2V0VmVyc2lvblN0ckNiayh2ZXJzU3RyKTsKLSAgICBkZWZyU2V0Q2FzZVNlbnNpdGl2ZUNiayhjYXNlc2Vucyk7Ci0KLSAgICAvLyBUaGUgZm9sbG93aW5nIGNhbGxzIGFyZSBhbiBleGFtcGxlIG9mIHVzaW5nIG9uZSBmdW5jdGlvbiAiY2xzIgotICAgIC8vIHRvIGJlIHRoZSBjYWxsYmFjayBmb3IgbWFueSBESUZGRVJFTlQgdHlwZXMgb2YgY29uc3RydWN0cy4KLSAgICAvLyBXZSBoYXZlIHRvIGNhc3QgdGhlIGZ1bmN0aW9uIHR5cGUgdG8gbWVldCB0aGUgcmVxdWlyZW1lbnRzCi0gICAgLy8gb2YgZWFjaCBkaWZmZXJlbnQgc2V0IGZ1bmN0aW9uLgotICAgIGRlZnJTZXRTaXRlQ2JrKChkZWZyU2l0ZUNia0ZuVHlwZSljbHMpOwotICAgIGRlZnJTZXRDYW5wbGFjZUNiaygoZGVmclNpdGVDYmtGblR5cGUpY2xzKTsKLSAgICBkZWZyU2V0Q2Fubm90T2NjdXB5Q2JrKChkZWZyU2l0ZUNia0ZuVHlwZSljbHMpOwotICAgIGRlZnJTZXREaWVBcmVhQ2JrKChkZWZyQm94Q2JrRm5UeXBlKWNscyk7Ci0gICAgZGVmclNldFBpbkNhcENiaygoZGVmclBpbkNhcENia0ZuVHlwZSljbHMpOwotICAgIGRlZnJTZXRQaW5DYmsoKGRlZnJQaW5DYmtGblR5cGUpY2xzKTsKLSAgICBkZWZyU2V0UGluUHJvcENiaygoZGVmclBpblByb3BDYmtGblR5cGUpY2xzKTsKLSAgICBkZWZyU2V0RGVmYXVsdENhcENiaygoZGVmckludGVnZXJDYmtGblR5cGUpY2xzKTsKLSAgICBkZWZyU2V0Um93Q2JrKChkZWZyUm93Q2JrRm5UeXBlKWNscyk7Ci0gICAgZGVmclNldFRyYWNrQ2JrKChkZWZyVHJhY2tDYmtGblR5cGUpY2xzKTsKLSAgICBkZWZyU2V0R2NlbGxHcmlkQ2JrKChkZWZyR2NlbGxHcmlkQ2JrRm5UeXBlKWNscyk7Ci0gICAgZGVmclNldFZpYUNiaygoZGVmclZpYUNia0ZuVHlwZSljbHMpOwotICAgIGRlZnJTZXRSZWdpb25DYmsoKGRlZnJSZWdpb25DYmtGblR5cGUpY2xzKTsKLSAgICBkZWZyU2V0R3JvdXBOYW1lQ2JrKChkZWZyU3RyaW5nQ2JrRm5UeXBlKWNscyk7Ci0gICAgZGVmclNldEdyb3VwTWVtYmVyQ2JrKChkZWZyU3RyaW5nQ2JrRm5UeXBlKWNscyk7Ci0gICAgZGVmclNldEdyb3VwQ2JrKChkZWZyR3JvdXBDYmtGblR5cGUpY2xzKTsKLSAgICBkZWZyU2V0U2NhbmNoYWluQ2JrKChkZWZyU2NhbmNoYWluQ2JrRm5UeXBlKWNscyk7Ci0gICAgZGVmclNldElPVGltaW5nQ2JrKChkZWZySU9UaW1pbmdDYmtGblR5cGUpY2xzKTsKLSAgICBkZWZyU2V0RlBDQ2JrKChkZWZyRlBDQ2JrRm5UeXBlKWNscyk7Ci0gICAgZGVmclNldFRpbWluZ0Rpc2FibGVDYmsoKGRlZnJUaW1pbmdEaXNhYmxlQ2JrRm5UeXBlKWNscyk7Ci0gICAgZGVmclNldFBhcnRpdGlvbkNiaygoZGVmclBhcnRpdGlvbkNia0ZuVHlwZSljbHMpOwotICAgIGRlZnJTZXRCbG9ja2FnZUNiaygoZGVmckJsb2NrYWdlQ2JrRm5UeXBlKWNscyk7Ci0gICAgZGVmclNldFNsb3RDYmsoKGRlZnJTbG90Q2JrRm5UeXBlKWNscyk7Ci0gICAgZGVmclNldEZpbGxDYmsoKGRlZnJGaWxsQ2JrRm5UeXBlKWNscyk7Ci0gICAgZGVmclNldFN0eWxlc0NiaygoZGVmclN0eWxlc0Nia0ZuVHlwZSljbHMpOwotCi0gICAgZGVmclNldEFzc2VydGlvbnNFbmRDYmsoZW5kZnVuYyk7Ci0gICAgZGVmclNldENvbXBvbmVudEVuZENiayhlbmRmdW5jKTsKLSAgICBkZWZyU2V0Q29uc3RyYWludHNFbmRDYmsoZW5kZnVuYyk7Ci0gICAgZGVmclNldE5ldEVuZENiayhlbmRmdW5jKTsKLSAgICBkZWZyU2V0RlBDRW5kQ2JrKGVuZGZ1bmMpOwotICAgIGRlZnJTZXRGUENFbmRDYmsoZW5kZnVuYyk7Ci0gICAgZGVmclNldEdyb3Vwc0VuZENiayhlbmRmdW5jKTsKLSAgICBkZWZyU2V0SU9UaW1pbmdzRW5kQ2JrKGVuZGZ1bmMpOwotICAgIGRlZnJTZXROZXRFbmRDYmsoZW5kZnVuYyk7Ci0gICAgZGVmclNldFBhcnRpdGlvbnNFbmRDYmsoZW5kZnVuYyk7Ci0gICAgZGVmclNldFJlZ2lvbkVuZENiayhlbmRmdW5jKTsKLSAgICBkZWZyU2V0U05ldEVuZENiayhlbmRmdW5jKTsKLSAgICBkZWZyU2V0U2NhbmNoYWluc0VuZENiayhlbmRmdW5jKTsKLSAgICBkZWZyU2V0UGluRW5kQ2JrKGVuZGZ1bmMpOwotICAgIGRlZnJTZXRUaW1pbmdEaXNhYmxlc0VuZENiayhlbmRmdW5jKTsKLSAgICBkZWZyU2V0VmlhRW5kQ2JrKGVuZGZ1bmMpOwotICAgIGRlZnJTZXRQaW5Qcm9wRW5kQ2JrKGVuZGZ1bmMpOwotICAgIGRlZnJTZXRCbG9ja2FnZUVuZENiayhlbmRmdW5jKTsKLSAgICBkZWZyU2V0U2xvdEVuZENiayhlbmRmdW5jKTsKLSAgICBkZWZyU2V0RmlsbEVuZENiayhlbmRmdW5jKTsKLSAgICBkZWZyU2V0Tm9uRGVmYXVsdEVuZENiayhlbmRmdW5jKTsKLSAgICBkZWZyU2V0U3R5bGVzRW5kQ2JrKGVuZGZ1bmMpOwotCi0gICAgZGVmclNldE1hbGxvY0Z1bmN0aW9uKG1hbGxvY0NCKTsKLSAgICBkZWZyU2V0UmVhbGxvY0Z1bmN0aW9uKHJlYWxsb2NDQik7Ci0gICAgZGVmclNldEZyZWVGdW5jdGlvbihmcmVlQ0IpOwotCi0gICAgLy9kZWZyU2V0UmVnaXN0ZXJVbnVzZWRDYWxsYmFja3MoKTsKLQotICAgIC8vIFRlc3RpbmcgdG8gc2V0IHRoZSBudW1iZXIgb2Ygd2FybmluZ3MKLSAgICBkZWZyU2V0QXNzZXJ0aW9uV2FybmluZ3MoMyk7Ci0gICAgZGVmclNldEJsb2NrYWdlV2FybmluZ3MoMyk7Ci0gICAgZGVmclNldENhc2VTZW5zaXRpdmVXYXJuaW5ncygzKTsKLSAgICBkZWZyU2V0Q29tcG9uZW50V2FybmluZ3MoMyk7Ci0gICAgZGVmclNldENvbnN0cmFpbnRXYXJuaW5ncygwKTsKLSAgICBkZWZyU2V0RGVmYXVsdENhcFdhcm5pbmdzKDMpOwotICAgIGRlZnJTZXRHY2VsbEdyaWRXYXJuaW5ncygzKTsKLSAgICBkZWZyU2V0SU9UaW1pbmdXYXJuaW5ncygzKTsKLSAgICBkZWZyU2V0TmV0V2FybmluZ3MoMyk7Ci0gICAgZGVmclNldE5vbkRlZmF1bHRXYXJuaW5ncygzKTsKLSAgICBkZWZyU2V0UGluRXh0V2FybmluZ3MoMyk7Ci0gICAgZGVmclNldFBpbldhcm5pbmdzKDMpOwotICAgIGRlZnJTZXRSZWdpb25XYXJuaW5ncygzKTsKLSAgICBkZWZyU2V0Um93V2FybmluZ3MoMyk7Ci0gICAgZGVmclNldFNjYW5jaGFpbldhcm5pbmdzKDMpOwotICAgIGRlZnJTZXRTTmV0V2FybmluZ3MoMyk7Ci0gICAgZGVmclNldFN0eWxlc1dhcm5pbmdzKDMpOwotICAgIGRlZnJTZXRUcmFja1dhcm5pbmdzKDMpOwotICAgIGRlZnJTZXRVbml0c1dhcm5pbmdzKDMpOwotICAgIGRlZnJTZXRWZXJzaW9uV2FybmluZ3MoMyk7Ci0gICAgZGVmclNldFZpYVdhcm5pbmdzKDMpOwotICB9Ci0KLSAgaWYgKCEgaXNTZXNzaW9ubGVzcykgewotCSAgZGVmclNldExvbmdMaW5lTnVtYmVyRnVuY3Rpb24obGluZU51bWJlckNCKTsKLQkgIGRlZnJTZXREZWx0YU51bWJlckxpbmVzKGxpbmVfbnVtX3ByaW50X2ludGVydmFsKTsKLSAgfQotCi0gICh2b2lkKSBkZWZyU2V0T3BlbkxvZ0ZpbGVBcHBlbmQoKTsKLQotICBpZiAoY2NyNzQ5ODUzKSB7Ci0gICAgZGVmclNldFRvdGFsTXNnTGltaXQgKDUpOwotICAgIGRlZnJTZXRMaW1pdFBlck1zZyAoNjAwOCwgMik7Ci0KLSAgfSAKLQotICBpZiAodGVzdDEpIHsgIC8vIGZvciBzcGVjaWFsIHRlc3RzCi0gICAgIGZvciAoZmlsZUN0ID0gMDsgZmlsZUN0IDwgbnVtSW5GaWxlOyBmaWxlQ3QrKykgewotICAgICAgIGlmICgoZiA9IGZvcGVuKGluRmlsZVtmaWxlQ3RdLCJyIikpID09IDApIHsKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCJDb3VsZG4ndCBvcGVuIGlucHV0IGZpbGUgJyVzJ1xuIiwgaW5GaWxlW2ZpbGVDdF0pOwotICAgICAgICAgcmV0dXJuKDIpOwotICAgICAgIH0KLSAgICAgICAvLyBTZXQgY2FzZSBzZW5zaXRpdmUgdG8gMCB0byBzdGFydCB3aXRoLCBpbiBIaXN0b3J5ICYgUHJvcGVydHlEZWZpbml0aW9uCi0gICAgICAgLy8gcmVzZXQgaXQgdG8gMS4KLSAgICAgICByZXMgPSBkZWZyUmVhZChmLCBpbkZpbGVbZmlsZUN0XSwgdXNlckRhdGEsIDEpOwotCi0gICAgICAgaWYgKHJlcykKLSAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlJlYWRlciByZXR1cm5zIGJhZCBzdGF0dXMuXG4iLCBpbkZpbGVbZmlsZUN0XSk7Ci0KLSAgICAgICAodm9pZClkZWZyUHJpbnRVbnVzZWRDYWxsYmFja3MoZm91dCk7Ci0gICAgICAgKHZvaWQpZGVmclJlbGVhc2VOUmVzZXRNZW1vcnkoKTsKLSAgICAgICAodm9pZClkZWZyVW5zZXROb25EZWZhdWx0Q2JrKCk7IAotICAgICAgICh2b2lkKWRlZnJVbnNldE5vbkRlZmF1bHRTdGFydENiaygpOyAKLSAgICAgICAodm9pZClkZWZyVW5zZXROb25EZWZhdWx0RW5kQ2JrKCk7IAotICAgICB9Ci0gIH0KLSAgZWxzZSBpZiAodGVzdDIpIHsgIC8vIGZvciBzcGVjaWFsIHRlc3RzCi0gICAgLy8gdGhpcyB0ZXN0IGlzIGRlc2lnbiB0byB0ZXN0IHRoZSAzIEFQSXMsIGRlZnJEaXNhYmxlUGFyc2VyTXNncywKLSAgICAvLyBkZWZyRW5hYmxlUGFyc2VyTXNncyAmIGRlZnJFbmFibGVBbGxNc2dzCi0gICAgLy8gSXQgdXNlcyB0aGUgZmlsZSBjY3I1MjM4NzkuZGVmLiAgVGhpcyBmaWxlIHdpbGwgcGFyc2VyIDMgdGltZXMKLSAgICAvLyAxc3QgaXQgd2lsbCBoYXZlIGRlZnJEaXNhYmxlUGFyc2VyTXNncyBzZXQgdG8gYm90aCA3MDEwICYgNzAxNgotICAgIC8vIDJuZCB3aWxsIGVuYWJsZSA3MDE2IGJ5IGNhbGxpbmcgZGVmckVuYWJsZVBhcnNlck1zZ3MKLSAgICAvLyAzcmQgZW5hYmxlIGFsbCBtc2dzIGJ5IGNhbGwgZGVmckVuYWJsZUFsbE1zZ3MKLQotICAgIGludCBuTXNncyA9IDI7Ci0gICAgaW50IGRNc2dzWzJdOwotCi0gICAgZm9yIChmaWxlQ3QgPSAwOyBmaWxlQ3QgPCBudW1JbkZpbGU7IGZpbGVDdCsrKSB7Ci0gICAgICAgaWYgKGZpbGVDdCA9PSAwKSB7Ci0gICAgICAgICAgZE1zZ3NbMF0gPSA3MDEwOwotICAgICAgICAgIGRNc2dzWzFdID0gNzAxNjsKLSAgICAgICAgICBkZWZyRGlzYWJsZVBhcnNlck1zZ3MgKDIsIChpbnQqKWRNc2dzKTsKLSAgICAgICB9IGVsc2UgaWYgKGZpbGVDdCA9PSAxKSB7Ci0gICAgICAgICAgZE1zZ3NbMF0gPSA3MDE2OwotICAgICAgICAgIGRlZnJFbmFibGVQYXJzZXJNc2dzICgxLCAoaW50KilkTXNncyk7Ci0gICAgICAgfSBlbHNlCi0gICAgICAgICAgZGVmckVuYWJsZUFsbE1zZ3MoKTsKLSAKLSAgICAgICBpZiAoKGYgPSBmb3BlbihpbkZpbGVbZmlsZUN0XSwiciIpKSA9PSAwKSB7Ci0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwiQ291bGRuJ3Qgb3BlbiBpbnB1dCBmaWxlICclcydcbiIsIGluRmlsZVtmaWxlQ3RdKTsKLSAgICAgICAgIHJldHVybigyKTsKLSAgICAgICB9Ci0gCi0gICAgICAgcmVzID0gZGVmclJlYWQoZiwgaW5GaWxlW2ZpbGVDdF0sIHVzZXJEYXRhLCAxKTsKLSAKLSAgICAgICBpZiAocmVzKQotICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUmVhZGVyIHJldHVybnMgYmFkIHN0YXR1cy5cbiIsIGluRmlsZVtmaWxlQ3RdKTsKLSAKLSAgICAgICAodm9pZClkZWZyUHJpbnRVbnVzZWRDYWxsYmFja3MoZm91dCk7Ci0gICAgICAgKHZvaWQpZGVmclJlbGVhc2VOUmVzZXRNZW1vcnkoKTsKLSAgICAgICAodm9pZClkZWZyVW5zZXROb25EZWZhdWx0Q2JrKCk7Ci0gICAgICAgKHZvaWQpZGVmclVuc2V0Tm9uRGVmYXVsdFN0YXJ0Q2JrKCk7Ci0gICAgICAgKHZvaWQpZGVmclVuc2V0Tm9uRGVmYXVsdEVuZENiaygpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAgZm9yIChmaWxlQ3QgPSAwOyBmaWxlQ3QgPCBudW1JbkZpbGU7IGZpbGVDdCsrKSB7Ci0gICAgICAgaWYgKHN0cmNtcChpbkZpbGVbZmlsZUN0XSwgIlNURElOIikgPT0gMCkgewotICAgICAgICAgICAgZiA9IHN0ZGluOwotICAgICAgIH0gZWxzZSBpZiAoKGYgPSBmb3BlbihpbkZpbGVbZmlsZUN0XSwiciIpKSA9PSAwKSB7Ci0gICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIkNvdWxkbid0IG9wZW4gaW5wdXQgZmlsZSAnJXMnXG4iLCBpbkZpbGVbZmlsZUN0XSk7Ci0gICAgICAgICAgICAgcmV0dXJuKDIpOwotICAgICAgIH0KLSAgICAgICAvLyBTZXQgY2FzZSBzZW5zaXRpdmUgdG8gMCB0byBzdGFydCB3aXRoLCBpbiBIaXN0b3J5ICYgUHJvcGVydHlEZWZpbml0aW9uCi0gICAgICAgLy8gcmVzZXQgaXQgdG8gMS4KLQotICAgICAgIHJlcyA9IGRlZnJSZWFkKGYsIGluRmlsZVtmaWxlQ3RdLCB1c2VyRGF0YSwgMSk7Ci0KLSAgICAgICBpZiAocmVzKQotICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlJlYWRlciByZXR1cm5zIGJhZCBzdGF0dXMuXG4iLCBpbkZpbGVbZmlsZUN0XSk7Ci0KLSAgICAgICAvLyBUZXN0aW5nIHRoZSBhbGlhc2VzIEFQSS4KLSAgICAgICBkZWZyQWRkQWxpYXMgKCJhbGlhczEiLCAiYWxpYXNWYWx1ZTEiLCAxKTsKLQotICAgICAgIGRlZmlBbGlhc19pdHIgYWxpYXNTdG9yZTsKLSAgICAgICBjb25zdCBjaGFyICAgICphbGlhczFWYWx1ZSA9IE5VTEw7Ci0KLSAgICAgICB3aGlsZSAoYWxpYXNTdG9yZS5OZXh0KCkpIHsKLSAgICAgICAgICAgaWYgKHN0cmNtcChhbGlhc1N0b3JlLktleSgpLCAiYWxpYXMxIikgPT0gMCkgewotICAgICAgICAgICAgICAgIGFsaWFzMVZhbHVlID0gYWxpYXNTdG9yZS5EYXRhKCk7Ci0gICAgICAgICAgIH0KLSAgICAgICB9IAotCi0gICAgICAgaWYgKCFhbGlhczFWYWx1ZSB8fCBzdHJjbXAoYWxpYXMxVmFsdWUsICJhbGlhc1ZhbHVlMSIpKSB7Ci0gICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogQWxpYXNlcyBkb24ndCB3b3JrXG4iKTsKLSAgICAgICB9Ci0KLSAgICAgICAodm9pZClkZWZyUHJpbnRVbnVzZWRDYWxsYmFja3MoZm91dCk7Ci0gICAgICAgKHZvaWQpZGVmclJlbGVhc2VOUmVzZXRNZW1vcnkoKTsKLSAgICB9Ci0gICAgKHZvaWQpZGVmclVuc2V0Q2FsbGJhY2tzKCk7Ci0gICAgKHZvaWQpZGVmclNldFVudXNlZENhbGxiYWNrcyh1blVzZWRDQik7Ci0gIH0KLQotICAvLyBVbnNldCBhbGwgdGhlIGNhbGxiYWNrcwotICBkZWZyVW5zZXRBcnJheU5hbWVDYmsgKCk7Ci0gIGRlZnJVbnNldEFzc2VydGlvbkNiayAoKTsKLSAgZGVmclVuc2V0QXNzZXJ0aW9uc1N0YXJ0Q2JrICgpOwotICBkZWZyVW5zZXRBc3NlcnRpb25zRW5kQ2JrICgpOwotICBkZWZyVW5zZXRCbG9ja2FnZUNiayAoKTsKLSAgZGVmclVuc2V0QmxvY2thZ2VTdGFydENiayAoKTsKLSAgZGVmclVuc2V0QmxvY2thZ2VFbmRDYmsgKCk7Ci0gIGRlZnJVbnNldEJ1c0JpdENiayAoKTsKLSAgZGVmclVuc2V0Q2Fubm90T2NjdXB5Q2JrICgpOwotICBkZWZyVW5zZXRDYW5wbGFjZUNiayAoKTsKLSAgZGVmclVuc2V0Q2FzZVNlbnNpdGl2ZUNiayAoKTsKLSAgZGVmclVuc2V0Q29tcG9uZW50Q2JrICgpOwotICBkZWZyVW5zZXRDb21wb25lbnRFeHRDYmsgKCk7Ci0gIGRlZnJVbnNldENvbXBvbmVudFN0YXJ0Q2JrICgpOwotICBkZWZyVW5zZXRDb21wb25lbnRFbmRDYmsgKCk7Ci0gIGRlZnJVbnNldENvbnN0cmFpbnRDYmsgKCk7Ci0gIGRlZnJVbnNldENvbnN0cmFpbnRzU3RhcnRDYmsgKCk7Ci0gIGRlZnJVbnNldENvbnN0cmFpbnRzRW5kQ2JrICgpOwotICBkZWZyVW5zZXREZWZhdWx0Q2FwQ2JrICgpOwotICBkZWZyVW5zZXREZXNpZ25DYmsgKCk7Ci0gIGRlZnJVbnNldERlc2lnbkVuZENiayAoKTsKLSAgZGVmclVuc2V0RGllQXJlYUNiayAoKTsKLSAgZGVmclVuc2V0RGl2aWRlckNiayAoKTsKLSAgZGVmclVuc2V0RXh0ZW5zaW9uQ2JrICgpOwotICBkZWZyVW5zZXRGaWxsQ2JrICgpOwotICBkZWZyVW5zZXRGaWxsU3RhcnRDYmsgKCk7Ci0gIGRlZnJVbnNldEZpbGxFbmRDYmsgKCk7Ci0gIGRlZnJVbnNldEZQQ0NiayAoKTsKLSAgZGVmclVuc2V0RlBDU3RhcnRDYmsgKCk7Ci0gIGRlZnJVbnNldEZQQ0VuZENiayAoKTsKLSAgZGVmclVuc2V0Rmxvb3JQbGFuTmFtZUNiayAoKTsKLSAgZGVmclVuc2V0R2NlbGxHcmlkQ2JrICgpOwotICBkZWZyVW5zZXRHcm91cENiayAoKTsKLSAgZGVmclVuc2V0R3JvdXBFeHRDYmsgKCk7Ci0gIGRlZnJVbnNldEdyb3VwTWVtYmVyQ2JrICgpOwotICBkZWZyVW5zZXRDb21wb25lbnRNYXNrU2hpZnRMYXllckNiayAoKTsKLSAgZGVmclVuc2V0R3JvdXBOYW1lQ2JrICgpOwotICBkZWZyVW5zZXRHcm91cHNTdGFydENiayAoKTsKLSAgZGVmclVuc2V0R3JvdXBzRW5kQ2JrICgpOwotICBkZWZyVW5zZXRIaXN0b3J5Q2JrICgpOwotICBkZWZyVW5zZXRJT1RpbWluZ0NiayAoKTsKLSAgZGVmclVuc2V0SU9UaW1pbmdzU3RhcnRDYmsgKCk7Ci0gIGRlZnJVbnNldElPVGltaW5nc0VuZENiayAoKTsKLSAgZGVmclVuc2V0SU9UaW1pbmdzRXh0Q2JrICgpOwotICBkZWZyVW5zZXROZXRDYmsgKCk7Ci0gIGRlZnJVbnNldE5ldE5hbWVDYmsgKCk7Ci0gIGRlZnJVbnNldE5ldE5vbkRlZmF1bHRSdWxlQ2JrICgpOwotICBkZWZyVW5zZXROZXRDb25uZWN0aW9uRXh0Q2JrICgpOwotICBkZWZyVW5zZXROZXRFeHRDYmsgKCk7Ci0gIGRlZnJVbnNldE5ldFBhcnRpYWxQYXRoQ2JrICgpOwotICBkZWZyVW5zZXROZXRTdWJuZXROYW1lQ2JrICgpOwotICBkZWZyVW5zZXROZXRTdGFydENiayAoKTsKLSAgZGVmclVuc2V0TmV0RW5kQ2JrICgpOwotICBkZWZyVW5zZXROb25EZWZhdWx0Q2JrICgpOwotICBkZWZyVW5zZXROb25EZWZhdWx0U3RhcnRDYmsgKCk7Ci0gIGRlZnJVbnNldE5vbkRlZmF1bHRFbmRDYmsgKCk7Ci0gIGRlZnJVbnNldFBhcnRpdGlvbkNiayAoKTsKLSAgZGVmclVuc2V0UGFydGl0aW9uc0V4dENiayAoKTsKLSAgZGVmclVuc2V0UGFydGl0aW9uc1N0YXJ0Q2JrICgpOwotICBkZWZyVW5zZXRQYXJ0aXRpb25zRW5kQ2JrICgpOwotICBkZWZyVW5zZXRQYXRoQ2JrICgpOwotICBkZWZyVW5zZXRQaW5DYXBDYmsgKCk7Ci0gIGRlZnJVbnNldFBpbkNiayAoKTsKLSAgZGVmclVuc2V0UGluRW5kQ2JrICgpOwotICBkZWZyVW5zZXRQaW5FeHRDYmsgKCk7Ci0gIGRlZnJVbnNldFBpblByb3BDYmsgKCk7Ci0gIGRlZnJVbnNldFBpblByb3BTdGFydENiayAoKTsKLSAgZGVmclVuc2V0UGluUHJvcEVuZENiayAoKTsKLSAgZGVmclVuc2V0UHJvcENiayAoKTsKLSAgZGVmclVuc2V0UHJvcERlZkVuZENiayAoKTsKLSAgZGVmclVuc2V0UHJvcERlZlN0YXJ0Q2JrICgpOwotICBkZWZyVW5zZXRSZWdpb25DYmsgKCk7Ci0gIGRlZnJVbnNldFJlZ2lvblN0YXJ0Q2JrICgpOwotICBkZWZyVW5zZXRSZWdpb25FbmRDYmsgKCk7Ci0gIGRlZnJVbnNldFJvd0NiayAoKTsKLSAgZGVmclVuc2V0U2NhbkNoYWluRXh0Q2JrICgpOwotICBkZWZyVW5zZXRTY2FuY2hhaW5DYmsgKCk7Ci0gIGRlZnJVbnNldFNjYW5jaGFpbnNTdGFydENiayAoKTsKLSAgZGVmclVuc2V0U2NhbmNoYWluc0VuZENiayAoKTsKLSAgZGVmclVuc2V0U2l0ZUNiayAoKTsKLSAgZGVmclVuc2V0U2xvdENiayAoKTsKLSAgZGVmclVuc2V0U2xvdFN0YXJ0Q2JrICgpOwotICBkZWZyVW5zZXRTbG90RW5kQ2JrICgpOwotICBkZWZyVW5zZXRTTmV0V2lyZUNiayAoKTsKLSAgZGVmclVuc2V0U05ldENiayAoKTsKLSAgZGVmclVuc2V0U05ldFN0YXJ0Q2JrICgpOwotICBkZWZyVW5zZXRTTmV0RW5kQ2JrICgpOwotICBkZWZyVW5zZXRTTmV0UGFydGlhbFBhdGhDYmsgKCk7Ci0gIGRlZnJVbnNldFN0YXJ0UGluc0NiayAoKTsKLSAgZGVmclVuc2V0U3R5bGVzQ2JrICgpOwotICBkZWZyVW5zZXRTdHlsZXNTdGFydENiayAoKTsKLSAgZGVmclVuc2V0U3R5bGVzRW5kQ2JrICgpOwotICBkZWZyVW5zZXRUZWNobm9sb2d5Q2JrICgpOwotICBkZWZyVW5zZXRUaW1pbmdEaXNhYmxlQ2JrICgpOwotICBkZWZyVW5zZXRUaW1pbmdEaXNhYmxlc1N0YXJ0Q2JrICgpOwotICBkZWZyVW5zZXRUaW1pbmdEaXNhYmxlc0VuZENiayAoKTsKLSAgZGVmclVuc2V0VHJhY2tDYmsgKCk7Ci0gIGRlZnJVbnNldFVuaXRzQ2JrICgpOwotICBkZWZyVW5zZXRWZXJzaW9uQ2JrICgpOwotICBkZWZyVW5zZXRWZXJzaW9uU3RyQ2JrICgpOwotICBkZWZyVW5zZXRWaWFDYmsgKCk7Ci0gIGRlZnJVbnNldFZpYUV4dENiayAoKTsKLSAgZGVmclVuc2V0VmlhU3RhcnRDYmsgKCk7Ci0gIGRlZnJVbnNldFZpYUVuZENiayAoKTsKLQotICBmY2xvc2UoZm91dCk7Ci0KLSAgLy8gUmVsZWFzZSBhbGxvY2F0ZWQgc2luZ2xldG9uIGRhdGEuCi0gIGRlZnJDbGVhcigpOwotCi0gIHJldHVybiByZXM7Ci19Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWZ3cml0ZS9kZWZ3cml0ZS5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmd3JpdGUvZGVmd3JpdGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWU4ODcyLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWZ3cml0ZS9kZWZ3cml0ZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMjk0ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTIgLSAyMDE2LCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3IkCi0vLyAgJFJldmlzaW9uJAotLy8gICREYXRlJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpZm5kZWYgV0lOMzIKLSMgICBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZiAvKiBub3QgV0lOMzIgKi8KLSNpbmNsdWRlICJkZWZ3V3JpdGVyLmhwcCIKLSAKLWNoYXIgZGVmYXVsdE91dFsxMjhdOwotIAotLy8gR2xvYmFsIHZhcmlhYmxlcwotRklMRSogZm91dDsKLSAKLSNkZWZpbmUgQ0hFQ0tfU1RBVFVTKHN0YXR1cykgXAotICBpZiAoc3RhdHVzKSB7ICAgICAgICAgICAgICBcCi0gICAgIGRlZndQcmludEVycm9yKHN0YXR1cyk7IFwKLSAgICAgcmV0dXJuKHN0YXR1cyk7ICAgICAgICAgXAotICB9Ci0gCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgY2hhciogb3V0ZmlsZTsKLSAgaW50ICAgc3RhdHVzOyAgICAvLyByZXR1cm4gY29kZSwgaWYgbm9uZSAwIG1lYW5zIGVycm9yCi0gIGludCAgIGxpbmVOdW1iZXIgPSAwOwotCi0gIGNvbnN0IGNoYXIqKiBsYXllcnM7Ci0gIGNvbnN0IGNoYXIqKiBmb3JlaWduczsKLSAgY29uc3QgY2hhcioqIHNoaWZ0TGF5ZXJzOwotICBpbnQgKmZvcmVpZ25YLCAqZm9yZWlnblksICpmb3JlaWduT3JpZW50OwotICBjb25zdCBjaGFyKiogZm9yZWlnbk9yaWVudFN0cjsKLSAgZG91YmxlICpjb29yWCwgKmNvb3JZOwotICBkb3VibGUgKmNvb3JWYWx1ZTsKLSAgY29uc3QgY2hhciAqKmdyb3VwRXhwcjsKLSAgaW50ICp4UG9pbnRzLCAqeVBvaW50czsKLSAgZG91YmxlICp4UCwgKnlQOwotICBjb25zdCBjaGFyKiogY29vclhTTiwgKipjb29yWVNOOwotICBib29sIGdyb3VwSW5pdCA9IGZhbHNlOwotIAotCi0jaWZkZWYgV0lOMzIKLSAgICAvLyBFbmFibGUgdHdvLWRpZ2l0IGV4cG9uZW50IGZvcm1hdAotICAgIF9zZXRfb3V0cHV0X2Zvcm1hdChfVFdPX0RJR0lUX0VYUE9ORU5UKTsKLSNlbmRpZgotCi0gIC8vIGFzc2lnbiB0aGUgZGVmYXVsdAotICBzdHJjcHkoZGVmYXVsdE91dCwgImRlZi5pbiIpOwotICBvdXRmaWxlID0gZGVmYXVsdE91dDsKLSAgZm91dCA9IHN0ZG91dDsKLSAKLSAgYXJnYy0tOwotICBhcmd2Kys7Ci0gIHdoaWxlIChhcmdjLS0pIHsKLSAgICAgaWYgKHN0cmNtcCgqYXJndiwgIi1vIikgPT0gMCkgeyAgIC8vIG91dHB1dCBmaWxlbmFtZQotICAgICAgICBhcmd2Kys7Ci0gICAgICAgIGFyZ2MtLTsKLSAgICAgICAgb3V0ZmlsZSA9ICphcmd2OwotICAgICAgICBpZiAoKGZvdXQgPSBmb3BlbihvdXRmaWxlLCAidyIpKSA9PSAwKSB7Ci0gICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IGNvdWxkIG5vdCBvcGVuIG91dHB1dCBmaWxlXG4iKTsKLSAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgIH0KLSAgICAgfSBlbHNlIGlmIChzdHJuY21wKCphcmd2LCAgIi1oIiwgMikgPT0gMCkgeyAgLy8gY29tcGFyZSB3aXRoIC1oW2VscF0KLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogZGVmd3JpdGUgWy1vIDxmaWxlbmFtZT5dIFstaGVscF1cbiIpOwotICAgICAgICByZXR1cm4gMTsKLSAgICAgfSBlbHNlIGlmIChzdHJuY21wKCphcmd2LCAgIi1nIiwgMikgPT0gMCkgeyAgLy8gdGVzdCBvZiBncm91cCBpbml0IGZ1bmN0aW9uLgotICAgICAgICAgICAgZ3JvdXBJbml0ID0gMTsKLSAgICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogSWxsZWdhbCBjb21tYW5kIGxpbmUgb3B0aW9uOiAnJXMnXG4iLCAqYXJndik7Ci0gICAgICAgIHJldHVybiAyOwotICAgICB9Ci0gICAgIGFyZ3YrKzsKLSAgfQotCi0gIGlmICghZ3JvdXBJbml0KSB7Ci0gICAgICBzdGF0dXMgPSBkZWZ3SW5pdENiayhmb3V0KTsKLSAgICAgIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICAgICAgc3RhdHVzID0gZGVmd1ZlcnNpb24gKDUsIDgpOwotICAgICAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gICAgICBzdGF0dXMgPSBkZWZ3RGl2aWRlckNoYXIoIjoiKTsKLSAgICAgIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICAgICAgc3RhdHVzID0gZGVmd0J1c0JpdENoYXJzKCJbXSIpOwotICAgICAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gICAgICBzdGF0dXMgPSBkZWZ3RGVzaWduTmFtZSgibXVrIik7Ci0gICAgICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgICAgIHN0YXR1cyA9IGRlZndUZWNobm9sb2d5KCJtdWsiKTsKLSAgICAgIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICAgICAgc3RhdHVzID0gZGVmd0FycmF5KCJjb3JlX2FycmF5Iik7Ci0gICAgICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgICAgIHN0YXR1cyA9IGRlZndGbG9vcnBsYW4oIkRFRkFVTFQiKTsKLSAgICAgIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICAgICAgc3RhdHVzID0gZGVmd1VuaXRzKDEwMCk7Ci0gICAgICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgfSBlbHNlIHsKLSAgICAgIC8vIGluaXRhbGl6ZQotICAgICAgc3RhdHVzID0gZGVmd0luaXQoZm91dCwgNSwgOCwgIk9OIiwgIjoiLCAiW10iLCAibXVrIiwgIm11ayIsICJjb3JlX2FycmF5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJERUZBVUxUIiwgMTAwKTsKLSAgICAgIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICB9Ci0KLSAgc3RhdHVzID0gZGVmd05ld0xpbmUoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgLy8gaGlzdG9yeQotICBzdGF0dXMgPSBkZWZ3SGlzdG9yeSgiQ29ycmVjdGVkIFNURVAgZm9yIFJPV185IGFuZCBhZGRlZCBST1dfMTAgb2YgU0lURSBDT1JFMSAoZGVmKSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0hpc3RvcnkoIlJlbW92ZWQgTk9OREVGQVVMVFJVTEUgZnJvbSB0aGUgbmV0IFhYMTAwIChkZWYpIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3SGlzdG9yeSgiQ2hhbmdlZCBzb21lIGNlbGwgb3JpZW50YXRpb25zIChkZWYpIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV3TGluZSgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICAvLyBGSUxMUyAoYWRkIGFub3RoZXIgRklMTFMgaXMgaGVyZSBmb3IgQ0NSIDc0NjQ2MgotICB4UCA9IChkb3VibGUqKW1hbGxvYyhzaXplb2YoZG91YmxlKSo3KTsKLSAgeVAgPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkqNyk7Ci0gIHhQWzBdID0gMi4xOwotICB5UFswXSA9IDIuMTsKLSAgeFBbMV0gPSAzLjE7Ci0gIHlQWzFdID0gMy4xOwotICB4UFsyXSA9IDQuMTsKLSAgeVBbMl0gPSA0LjE7Ci0gIHhQWzNdID0gNS4xOwotICB5UFszXSA9IDUuMTsKLSAgeFBbNF0gPSA2LjE7Ci0gIHlQWzRdID0gNi4xOwotICB4UFs1XSA9IDcuMTsKLSAgeVBbNV0gPSA3LjE7Ci0gIHhQWzZdID0gOC4xOwotICB5UFs2XSA9IDguMTsKLSAgc3RhdHVzID0gZGVmd1N0YXJ0RmlsbHMoNSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3RmlsbExheWVyKCJNRVQxIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3RmlsbFJlY3QoMTAwMCwgMjAwMCwgMTUwMCwgNDAwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3RmlsbFBvbHlnb24oNSwgeFAsIHlQKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndGaWxsUmVjdCgyMDAwLCAyMDAwLCAyNTAwLCA0MDAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndGaWxsUG9seWdvbig3LCB4UCwgeVApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ZpbGxSZWN0KDMwMDAsIDIwMDAsIDM1MDAsIDQwMDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ZpbGxMYXllcigiTUVUMiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ZpbGxSZWN0KDEwMDAsIDIwMDAsIDE1MDAsIDQwMDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ZpbGxSZWN0KDEwMDAsIDQ1MDAsIDE1MDAsIDY1MDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ZpbGxSZWN0KDEwMDAsIDcwMDAsIDE1MDAsIDkwMDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ZpbGxSZWN0KDEwMDAsIDk1MDAsIDE1MDAsIDExNTAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndGaWxsUG9seWdvbig3LCB4UCwgeVApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ZpbGxQb2x5Z29uKDYsIHhQLCB5UCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3RmlsbExheWVyKCJtZXRhbDEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndGaWxsTGF5ZXJNYXNrKDEpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ZpbGxMYXllck9QQygpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ZpbGxSZWN0KDEwMCwgMjAwLCAxNTAsIDQwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3RmlsbFJlY3QoMzAwLCAyMDAsIDM1MCwgNDAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndGaWxsVmlhKCJ2aWEyOCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ZpbGxWaWFNYXNrKDIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ZpbGxWaWFPUEMoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndGaWxsUG9pbnRzKDEsIHhQLCB5UCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3RmlsbFZpYSgidmlhMjYiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndGaWxsUG9pbnRzKDMsIHhQLCB5UCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3RW5kRmlsbHMoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXdMaW5lKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBmcmVlKChjaGFyKil4UCk7Ci0gIGZyZWUoKGNoYXIqKXlQKTsKLQotICAvLyBQUk9QRVJUWURFRklOSVRJT05TCi0gIHN0YXR1cyA9IGRlZndTdGFydFByb3BEZWYoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGRlZndBZGRDb21tZW50KCJkZWZ3UHJvcERlZiBpcyBicm9rZW4gaW50byAzIHJvdXRpbmVzLCBkZWZ3U3RyaW5nUHJvcERlZiIpOwotICBkZWZ3QWRkQ29tbWVudCgiZGVmd0ludFByb3BEZWYsIGFuZCBkZWZ3UmVhbFByb3BEZWYiKTsKLSAgc3RhdHVzID0gZGVmd1N0cmluZ1Byb3BEZWYoIlJFR0lPTiIsICJzY3VtIiwgMCwgMCwgMCApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ludFByb3BEZWYoIlJFR0lPTiIsICJjZW50ZXIiLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndSZWFsUHJvcERlZigiUkVHSU9OIiwgImFyZWEiLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTdHJpbmdQcm9wRGVmKCJHUk9VUCIsICJnZ3JwIiwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3SW50UHJvcERlZigiR1JPVVAiLCAic2l0ZSIsIDAsIDI1LCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndSZWFsUHJvcERlZigiR1JPVVAiLCAibWF4YXJlYSIsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1N0cmluZ1Byb3BEZWYoIkNPTVBPTkVOVCIsICJjYyIsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ludFByb3BEZWYoIkNPTVBPTkVOVCIsICJpbmRleCIsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1JlYWxQcm9wRGVmKCJDT01QT05FTlQiLCAic2l6ZSIsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ludFByb3BEZWYoIk5FVCIsICJhbHQiLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTdHJpbmdQcm9wRGVmKCJORVQiLCAibGFzdE5hbWUiLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndSZWFsUHJvcERlZigiTkVUIiwgImxlbmd0aCIsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1N0cmluZ1Byb3BEZWYoIlNQRUNJQUxORVQiLCAiY29udHlwZSIsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ludFByb3BEZWYoIlNQRUNJQUxORVQiLCAiaW5kIiwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UmVhbFByb3BEZWYoIlNQRUNJQUxORVQiLCAibWF4bGVuZ3RoIiwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3RyaW5nUHJvcERlZigiREVTSUdOIiwgInRpdGxlIiwgMCwgMCwgIkJ1ZmZlciIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ludFByb3BEZWYoIkRFU0lHTiIsICJwcmlvcml0eSIsIDAsIDAsIDE0KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndSZWFsUHJvcERlZigiREVTSUdOIiwgImhvd2JpZyIsIDAsIDAsIDE1LjE2KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndSZWFsUHJvcERlZigiUk9XIiwgIm1pbmxlbmd0aCIsIDEuMCwgMTAwLjAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1N0cmluZ1Byb3BEZWYoIlJPVyIsICJmaXJzdE5hbWUiLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndJbnRQcm9wRGVmKCJST1ciLCAiaWR4IiwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3SW50UHJvcERlZigiQ09NUE9ORU5UUElOIiwgImRwSWdub3JlVGVybSIsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1N0cmluZ1Byb3BEZWYoIkNPTVBPTkVOVFBJTiIsICJkcEJpdCIsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1JlYWxQcm9wRGVmKCJDT01QT05FTlRQSU4iLCAicmVhbFByb3BlcnR5IiwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3RyaW5nUHJvcERlZigiTkVUIiwgIklHTk9SRU9QVElNSVpBVElPTiIsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1N0cmluZ1Byb3BEZWYoIlNQRUNJQUxORVQiLCAiSUdOT1JFT1BUSU1JWkFUSU9OIiwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UmVhbFByb3BEZWYoIk5FVCIsICJGUkVRVUVOQ1kiLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndSZWFsUHJvcERlZigiU1BFQ0lBTE5FVCIsICJGUkVRVUVOQ1kiLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTdHJpbmdQcm9wRGVmKCJOT05ERUZBVUxUUlVMRSIsICJuZHByb3AxIiwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3SW50UHJvcERlZigiTk9OREVGQVVMVFJVTEUiLCAibmRwcm9wMiIsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1JlYWxQcm9wRGVmKCJOT05ERUZBVUxUUlVMRSIsICJuZHByb3AzIiwgMCwgMCwgMC4wMDkpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1JlYWxQcm9wRGVmKCJOT05ERUZBVUxUUlVMRSIsICJuZHByb3A0IiwgLjEsIDEuMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3RW5kUHJvcERlZigpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICAvLyBESUVBUkVBCi0vKgotICBzdGF0dXMgPSBkZWZ3RGllQXJlYSgtMTkwMDAwLCAtMTIwMDAwLCAxOTAwMDAsIDcwMDAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0qLwotICB4UG9pbnRzID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKjYpOwotICB5UG9pbnRzID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKjYpOwotICB4UG9pbnRzWzBdID0gMjAwMDsKLSAgeVBvaW50c1swXSA9IDIwMDA7Ci0gIHhQb2ludHNbMV0gPSAzMDAwOwotICB5UG9pbnRzWzFdID0gMzAwMDsKLSAgeFBvaW50c1syXSA9IDQwMDA7Ci0gIHlQb2ludHNbMl0gPSA0MDAwOwotICB4UG9pbnRzWzNdID0gNTAwMDsKLSAgeVBvaW50c1szXSA9IDUwMDA7Ci0gIHhQb2ludHNbNF0gPSA2MDAwOwotICB5UG9pbnRzWzRdID0gNjAwMDsKLSAgeFBvaW50c1s1XSA9IDcwMDA7Ci0gIHlQb2ludHNbNV0gPSA3MDAwOwotICBzdGF0dXMgPSBkZWZ3RGllQXJlYUxpc3QoNiwgeFBvaW50cywgeVBvaW50cyk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBmcmVlKChjaGFyKil4UG9pbnRzKTsKLSAgZnJlZSgoY2hhciopeVBvaW50cyk7Ci0KLSAgc3RhdHVzID0gZGVmd05ld0xpbmUoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgLy8gUk9XCi0gIHN0YXR1cyA9IGRlZndSb3coIlJPV185IiwgIkNPUkUiLCAtMTc3MzIwLCAtMTExMjUwLCA2LCA5MTEsIDEsIDM2MCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UmVhbFByb3BlcnR5KCJtaW5sZW5ndGgiLCA1MC41KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTdHJpbmdQcm9wZXJ0eSgiZmlyc3ROYW1lIiwgIk9ubHkiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndJbnRQcm9wZXJ0eSgiaWR4IiwgMSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3Um93U3RyKCJST1dfMTAiLCAiQ09SRTEiLCAtMTkwMDAsIC0xMTAwMCwgIkZOIiwgMSwgMTAwLCAwLCA2MDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1Jvd1N0cigiUk9XXzExIiwgIkNPUkUxIiwgLTE5MDAwLCAtMTEwMDAsICJGTiIsIDEsIDEwMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3Um93KCJST1dfMTIiLCAiQ09SRTEiLCAtMTkwMDAsIC0xMTAwMCwgMywgMCwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3Um93U3RyKCJST1dfMTMiLCAiQ09SRTEiLCAtMTkwMDAsIC0xMTAwMCwgIkZOIiwgMCwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIC8vIFRSQUNLUwotICBsYXllcnMgPSAoY29uc3QgY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKjEpOwotICBsYXllcnNbMF0gPSBzdHJkdXAoIk0xIik7Ci0gIHN0YXR1cyA9IGRlZndUcmFja3MoIlgiLCAzMDAwLCA0MCwgMTIwLCAxLCBsYXllcnMsIDIsIDEpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgZnJlZSgoY2hhciopbGF5ZXJzWzBdKTsKLSAgbGF5ZXJzWzBdID0gc3RyZHVwKCJNMiIpOwotICBzdGF0dXMgPSBkZWZ3VHJhY2tzKCJZIiwgNTAwMCwgMTAsIDIwLCAxLGxheWVycyk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBmcmVlKChjaGFyKilsYXllcnNbMF0pOwotICBmcmVlKChjaGFyKilsYXllcnMpOwotICBzdGF0dXMgPSBkZWZ3TmV3TGluZSgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgCi0gIC8vIEdDRUxMR1JJRAotICBzdGF0dXMgPSBkZWZ3R2NlbGxHcmlkKCJYIiwgMCwgMTAwLCA2MDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0djZWxsR3JpZCgiWSIsIDEwLCAxMjAsIDQwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV3TGluZSgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICAvLyBERUZBVUxUQ0FQCi0gIC8qIG9ic29sZXRlIGluIDUuNAotICBzdGF0dXMgPSBkZWZ3U3RhcnREZWZhdWx0Q2FwKDQpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0RlZmF1bHRDYXAoMiwgMyk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3RGVmYXVsdENhcCg0LCA2KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndEZWZhdWx0Q2FwKDgsIDkpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0RlZmF1bHRDYXAoMTAsIDEyKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndFbmREZWZhdWx0Q2FwKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICAqLwotCi0gIC8vIENBTlBMQUNFCi0gIHN0YXR1cyA9IGRlZndDYW5QbGFjZVN0cigiZHAiLCA0NSwgNjQsICJOIiwgMzUsIDEsIDM5LCAxKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgc3RhdHVzID0gZGVmd0NhblBsYWNlKCJkcCIsIDQ1LCA2NCwgMSwgMzUsIDEsIDM5LCAxKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgLy8gQ0FOTk9UT0NDVVBZCi0gIHN0YXR1cyA9IGRlZndDYW5ub3RPY2N1cHlTdHIoImRwIiwgNTQsIDQ0LCAiUyIsIDU1LCAyLCA0NSwgMyk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIC8vIFZJQVMKLSAgc3RhdHVzID0gZGVmd1N0YXJ0Vmlhcyg3KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndWaWFOYW1lKCJWSUFfQVJSQVkiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndWaWFQYXR0ZXJuKCJQMS00MzUtNTQzLUlKMUZTIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3VmlhUmVjdCgiTTEiLCAtNDAsIC00MCwgNDAsIDQwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndWaWFSZWN0KCJWMSIsIC00MCwgLTQwLCA0MCwgNDAsIDMpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1ZpYVJlY3QoIk0yIiwgLTUwLCAtNTAsIDUwLCA1MCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3T25lVmlhRW5kKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3VmlhTmFtZSgiVklBX0FSUkFZMSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1ZpYVJlY3QoIk0xIiwgLTQwLCAtNDAsIDQwLCA0MCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3VmlhUmVjdCgiVjEiLCAtNDAsIC00MCwgNDAsIDQwLCAyKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndWaWFSZWN0KCJNMiIsIC01MCwgLTUwLCA1MCwgNTApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd09uZVZpYUVuZCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1ZpYU5hbWUoIm15VW5zaGlmdGVkVmlhIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3VmlhVmlhcnVsZSgibXlWaWFSdWxlIiwgMjAsIDIwLCAibWV0YWwxIiwgImN1dDEyIiwgIm1ldGFsMiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDUsIDUsIDAsIDQsIDAsIDEpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1ZpYVZpYXJ1bGVSb3dDb2woMiwgMyk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3T25lVmlhRW5kKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3VmlhTmFtZSgidmlhMiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1ZpYVZpYXJ1bGUoInZpYVJ1bGUyIiwgNSwgNiwgImJvdExheWVyMiIsICJjdXRMYXllcjIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAidG9wTGF5ZXIyIiwgNiwgNiwgMSwgNCwgMSwgNCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3VmlhVmlhcnVsZU9yaWdpbigxMCwgLTEwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndWaWFWaWFydWxlT2Zmc2V0KDAsIDAsIDIwLCAtMjApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1ZpYVZpYXJ1bGVQYXR0ZXJuKCIyX0YwXzJfRjhfMV83OCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd09uZVZpYUVuZCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICBzdGF0dXMgPSBkZWZ3VmlhTmFtZSgidmlhMyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1ZpYVBhdHRlcm4oIlAyLTQzNS01NDMtSUoxRlMiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndWaWFSZWN0KCJNMiIsIC00MCwgLTQwLCA0MCwgNDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd09uZVZpYUVuZCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICB4UCA9IChkb3VibGUqKW1hbGxvYyhzaXplb2YoZG91YmxlKSo2KTsKLSAgeVAgPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkqNik7Ci0gIHhQWzBdID0gLTIuMTsKLSAgeVBbMF0gPSAtMS4wOwotICB4UFsxXSA9IC0yOwotICB5UFsxXSA9IDE7Ci0gIHhQWzJdID0gMi4xOwotICB5UFsyXSA9IDEuMDsKLSAgeFBbM10gPSAyLjA7Ci0gIHlQWzNdID0gLTEuMDsKLSAgc3RhdHVzID0gZGVmd1ZpYU5hbWUoInZpYTQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndWaWFQb2x5Z29uKCJNMyIsIDQsIHhQLCB5UCwgMik7IAotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1ZpYVJlY3QoIk00IiwgLTQwLCAtNDAsIDQwLCA0MCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICB4UFswXSA9IDEwMDsKLSAgeVBbMF0gPSAxMDA7Ci0gIHhQWzFdID0gMjAwOwotICB5UFsxXSA9IDIwMDsKLSAgeFBbMl0gPSAzMDA7Ci0gIHlQWzJdID0gMzAwOwotICB4UFszXSA9IDQwMDsKLSAgeVBbM10gPSA0MDA7Ci0gIHhQWzRdID0gNTAwOwotICB5UFs0XSA9IDUwMDsKLSAgeFBbNV0gPSA2MDA7Ci0gIHlQWzVdID0gNjAwOwotICBzdGF0dXMgPSBkZWZ3VmlhUG9seWdvbigiTTUiLCA2LCB4UCwgeVAsIDMpOyAKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndPbmVWaWFFbmQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgeFBbMF0gPSAyMDA7Ci0gIHlQWzBdID0gMjAwOwotICB4UFsxXSA9IDMwMDsKLSAgeVBbMV0gPSAzMDA7Ci0gIHhQWzJdID0gNDAwOwotICB5UFsyXSA9IDUwMDsKLSAgeFBbM10gPSAxMDA7Ci0gIHlQWzNdID0gMzAwOwotICB4UFs0XSA9IDMwMDsKLSAgeVBbNF0gPSAyMDA7Ci0gIHN0YXR1cyA9IGRlZndWaWFOYW1lKCJ2aWE1Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3VmlhUG9seWdvbigiTTYiLCA1LCB4UCwgeVApOyAKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndPbmVWaWFFbmQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGZyZWUoKGNoYXIqKXhQKTsKLSAgZnJlZSgoY2hhciopeVApOwotICBzdGF0dXMgPSBkZWZ3RW5kVmlhcygpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICAvLyBSRUdJT05TCi0gIHN0YXR1cyA9IGRlZndTdGFydFJlZ2lvbnMoMik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UmVnaW9uTmFtZSgicmVnaW9uMSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1JlZ2lvblBvaW50cygtNTAwLCAtNTAwLCAzMDAsIDEwMCk7IAotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1JlZ2lvblBvaW50cyg1MDAsIDUwMCwgMTAwMCwgMTAwMCk7IAotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1JlZ2lvblR5cGUoIkZFTkNFIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3RyaW5nUHJvcGVydHkoInNjdW0iLCAib24gdG9wIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3SW50UHJvcGVydHkoImNlbnRlciIsIDI1MCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3SW50UHJvcGVydHkoImFyZWEiLCA3MzAwMDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1JlZ2lvbk5hbWUoInJlZ2lvbjIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndSZWdpb25Qb2ludHMoNDAwMCwgMCwgNTAwMCwgMTAwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3RyaW5nUHJvcGVydHkoInNjdW0iLCAib24gYm90dG9tIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3RW5kUmVnaW9ucygpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICAvLyBDT01QT05FTlRNQVNLU0hJRlRMQVlFUgotICBzaGlmdExheWVycyA9IChjb25zdCBjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikqMik7Ci0gIHNoaWZ0TGF5ZXJzWzBdID0gc3RyZHVwKCJNMyIpOwotICBzaGlmdExheWVyc1sxXSA9IHN0cmR1cCgiTTIiKTsKLQotICBzdGF0dXMgPSBkZWZ3Q29tcG9uZW50TWFza1NoaWZ0TGF5ZXJzKHNoaWZ0TGF5ZXJzLCAyKTsKLQotICBmcmVlKChjaGFyKilzaGlmdExheWVyc1swXSk7Ci0gIGZyZWUoKGNoYXIqKXNoaWZ0TGF5ZXJzWzFdKTsKLSAgZnJlZSgoY2hhciopc2hpZnRMYXllcnMpOwotCi0gIC8vIENPTVBPTkVOVFMKLSAgZm9yZWlnbnMgPSAoY29uc3QgY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKjIpOwotICBmb3JlaWduWCA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSoyKTsKLSAgZm9yZWlnblkgPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkqMik7Ci0gIGZvcmVpZ25PcmllbnQgPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkqMik7Ci0gIGZvcmVpZ25PcmllbnRTdHIgPSAoY29uc3QgY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKjIpOwotICBzdGF0dXMgPSBkZWZ3U3RhcnRDb21wb25lbnRzKDExKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndDb21wb25lbnQoIlozOEEwMSIsICJERkYzIiwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAiUExBQ0VEIiwgMTg1OTIsIDU0MDAsIDYsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3Q29tcG9uZW50TWFza1NoaWZ0KDEyMyk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3Q29tcG9uZW50SGFsbygxMDAsIDAsIDUwLCAyMDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0NvbXBvbmVudFN0cigiWjM4QTAzIiwgIkRGRjMiLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsICJQTEFDRUQiLCAxNjU3NiwgNDU2MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIkZTIiwgMCwgTlVMTCwgMCwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3Q29tcG9uZW50SGFsbygyMDAsIDIsIDYwLCAzMDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0NvbXBvbmVudCgiWjM4QTA1IiwgIkRGRjMiLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsICJQTEFDRUQiLCA1MTUyMCwgOTYwMCwgNiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndDb21wb25lbnQoInxpMCIsICJJTlZfQiIsIDAsIE5VTEwsICJJTlYiLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIDAsIC0xLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICJyZWdpb24xIiwgMCwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3Q29tcG9uZW50SGFsb1NvZnQoMTAwLCAwLCA1MCwgMjAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndDb21wb25lbnQoInxpMSIsICJJTlZfQiIsIDAsIE5VTEwsICJJTlYiLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsICJVTlBMQUNFRCIsIDEwMDAsIDEwMDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCwgMCwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3Q29tcG9uZW50KCJjZWxsMSIsICJDSE02QSIsIDAsIE5VTEwsIE5VTEwsICJnZW5lcmF0b3IiLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICJVU0VSIiwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgIkZJWEVEIiwgMCwgMTAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgMTAwLjQ1MzQ1MzUsIE5VTEwsIDAsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0NvbXBvbmVudCgiY2VsbDIiLCAiQ0hNNkEiLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICJORVRMSVNUIiwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgIkNPVkVSIiwgMTIwLAotICAgICAgICAgICAgICAgICAgICAgICAgIDEwLCA0LCAyLCBOVUxMLCAwLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGZvcmVpZ25zWzBdID0gc3RyZHVwKCJnZHMybmFtZSIpOwotICBmb3JlaWduWFswXSA9IC01MDA7Ci0gIGZvcmVpZ25ZWzBdID0gLTUwMDsKLSAgZm9yZWlnbk9yaWVudFswXSA9IDM7Ci0gIHN0YXR1cyA9IGRlZndDb21wb25lbnQoImNlbGwzIiwgIkNITTZBIiwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiVElNSU5HIiwgMSwgZm9yZWlnbnMsIGZvcmVpZ25YLCBmb3JlaWduWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduT3JpZW50LCAiUExBQ0VEIiwgMjQwLAotICAgICAgICAgICAgICAgICAgICAgICAgIDEwLCAwLCAwLCAicmVnaW9uMSIsIDAsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0NvbXBvbmVudFJvdXRlSGFsbygxMDAsICJtZXRhbDEiLCAibWV0YWwzIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBmcmVlKChjaGFyKilmb3JlaWduc1swXSk7Ci0gIGZvcmVpZ25zWzBdID0gc3RyZHVwKCJnZHMzbmFtZSIpOwotICBmb3JlaWduWFswXSA9IC01MDA7Ci0gIGZvcmVpZ25ZWzBdID0gLTUwMDsKLSAgZm9yZWlnbk9yaWVudFN0clswXSA9IHN0cmR1cCgiRlciKTsKLSAgZm9yZWlnbnNbMV0gPSBzdHJkdXAoImdkczRuYW1lIik7Ci0gIGZvcmVpZ25YWzFdID0gLTMwMDsKLSAgZm9yZWlnbllbMV0gPSAtMzAwOwotICBmb3JlaWduT3JpZW50U3RyWzFdID0gc3RyZHVwKCJGUyIpOwotICBzdGF0dXMgPSBkZWZ3Q29tcG9uZW50U3RyKCJjZWxsNCIsICJDSE0zQSIsIDAsIE5VTEwsICJDSE02QSIsIE5VTEwsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIkRJU1QiLCAyLCBmb3JlaWducywgZm9yZWlnblgsIGZvcmVpZ25ZLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduT3JpZW50U3RyLCAiUExBQ0VEIiwgMzYwLAotICAgICAgICAgICAgICAgICAgICAgICAgIDEwLCAiVyIsIDAsICJyZWdpb24yIiwgMCwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3Q29tcG9uZW50SGFsb1NvZnQoMTAwLCAwLCA1MCwgMjAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTdHJpbmdQcm9wZXJ0eSgiY2MiLCAiVGhpcyBpcyB0aGUgY29weSBsaXN0Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3SW50UHJvcGVydHkoImluZGV4IiwgOSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UmVhbFByb3BlcnR5KCJzaXplIiwgNy44KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndDb21wb25lbnQoInNjYW5jZWxsMSIsICJDSEszQSIsIDAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgIlBMQUNFRCIsIDUwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAxMCwgNywgMCwgTlVMTCwgMCwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3Q29tcG9uZW50KCJzY2FuY2VsbDIiLCAiQ0hLM0EiLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsICJQTEFDRUQiLCA3MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgMTAsIDYsIDAsIE5VTEwsIDAsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0VuZENvbXBvbmVudHMoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGZyZWUoKGNoYXIqKWZvcmVpZ25zWzBdKTsKLSAgZnJlZSgoY2hhciopZm9yZWlnbnNbMV0pOwotICBmcmVlKChjaGFyKilmb3JlaWducyk7Ci0gIGZyZWUoKGNoYXIqKWZvcmVpZ25YKTsKLSAgZnJlZSgoY2hhciopZm9yZWlnblkpOwotICBmcmVlKChjaGFyKilmb3JlaWduT3JpZW50KTsKLSAgZnJlZSgoY2hhciopZm9yZWlnbk9yaWVudFN0clswXSk7Ci0gIGZyZWUoKGNoYXIqKWZvcmVpZ25PcmllbnRTdHJbMV0pOwotICBmcmVlKChjaGFyKilmb3JlaWduT3JpZW50U3RyKTsKLQotICB4UCA9IChkb3VibGUqKW1hbGxvYyhzaXplb2YoZG91YmxlKSo2KTsKLSAgeVAgPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkqNik7Ci0gIHhQWzBdID0gMi4xOwotICB5UFswXSA9IDIuMTsKLSAgeFBbMV0gPSAzLjE7Ci0gIHlQWzFdID0gMy4xOwotICB4UFsyXSA9IDQuMTsKLSAgeVBbMl0gPSA0LjE7Ci0gIHhQWzNdID0gNS4xOwotICB5UFszXSA9IDUuMTsKLSAgeFBbNF0gPSA2LjE7Ci0gIHlQWzRdID0gNi4xOwotICB4UFs1XSA9IDcuMTsKLSAgeVBbNV0gPSA3LjE7Ci0KLSAgLy8gUElOUwotICBzdGF0dXMgPSBkZWZ3U3RhcnRQaW5zKDExKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndQaW4oInNjYW5waW4iLCAibmV0MSIsIDAsICJJTlBVVCIsIE5VTEwsIE5VTEwsIDAsIDAsIC0xLCBOVUxMLAotICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1BpblBvbHlnb24oIm1ldGFsMSIsIDAsIDEwMDAsIDYsIHhQLCB5UCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UGluTmV0RXhwcigicG93ZXIxIFZERDEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndQaW4oInBpbjAiLCAibmV0MSIsIDAsICJJTlBVVCIsICJTQ0FOIiwgTlVMTCwgMCwgMCwgLTEsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UGluU3RyKCJwaW4wLjUiLCAibmV0MSIsIDAsICJJTlBVVCIsICJSRVNFVCIsICJGSVhFRCIsIDAsIDAsICJTIiwKLSAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndQaW5Qb2x5Z29uKCJtZXRhbDIiLCAwLCAwLCA0LCB4UCwgeVApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1BpbkxheWVyKCJtZXRhbDMiLCA1MDAsIDAsIC01MDAwLCAtMTAwLCAtNDk1MCwgLTkwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndQaW4oInBpbjEiLCAibmV0MSIsIDEsIE5VTEwsICJQT1dFUiIsIE5VTEwsIDAsIDAsIC0xLCAiTTEiLAotICAgICAgICAgICAgICAgICAgIC01MDAwLCAtMTAwLCAtNDk1MCwgLTkwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndQaW5BbnRlbm5hUGluUGFydGlhbE1ldGFsQXJlYSg0NTgwLCAiTTEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndQaW5BbnRlbm5hUGluUGFydGlhbE1ldGFsQXJlYSg0NTgwLCAiTTExIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UGluQW50ZW5uYVBpblBhcnRpYWxNZXRhbEFyZWEoNDU4MCwgIk0xMiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1BpbkFudGVubmFQaW5HYXRlQXJlYSg0NTgwLCAiTTIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndQaW5BbnRlbm5hUGluRGlmZkFyZWEoNDU4MCwgIk0zIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UGluQW50ZW5uYVBpbkRpZmZBcmVhKDQ1ODAsICJNMzEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndQaW5BbnRlbm5hUGluTWF4QXJlYUNhcig1MDAwLCAiTDEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndQaW5BbnRlbm5hUGluTWF4U2lkZUFyZWFDYXIoNTAwMCwgIk00Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UGluQW50ZW5uYVBpblBhcnRpYWxDdXRBcmVhKDQ1ODAsICJNNCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1BpbkFudGVubmFQaW5NYXhDdXRDYXIoNTAwMCwgIkwxIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UGluKCJwaW4yIiwgIm5ldDIiLCAwLCAiSU5QVVQiLCAiU0lHTkFMIiwgTlVMTCwgMCwgMCwgLTEsICJNMSIsCi0gICAgICAgICAgICAgICAgICAgLTUwMDAsIDAsIC00OTUwLCAxMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UGluTGF5ZXIoIk0xIiwgNTAwLCAwLCAtNTAwMCwgMCwgLTQ5NTAsIDEwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndQaW5Qb2x5Z29uKCJNMiIsIDAsIDAsIDQsIHhQLCB5UCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UGluUG9seWdvbigiTTMiLCAwLCAwLCAzLCB4UCwgeVApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1BpbkxheWVyKCJNNCIsIDAsIDUwMCwgMCwgMTAwLCAtNDAwLCAxMDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1BpblN1cHBseVNlbnNpdGl2aXR5KCJ2ZGRwaW4xIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UGluR3JvdW5kU2Vuc2l0aXZpdHkoImduZHBpbjEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndQaW5BbnRlbm5hUGluUGFydGlhbE1ldGFsQXJlYSg1MDAwLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndQaW5BbnRlbm5hUGluUGFydGlhbE1ldGFsU2lkZUFyZWEoNDU4MCwgIk0yIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UGluQW50ZW5uYVBpbkdhdGVBcmVhKDUwMDAsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1BpbkFudGVubmFQaW5QYXJ0aWFsQ3V0QXJlYSg1MDAwLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndQaW4oIklOQlVTWzFdIiwgInxJTkJVU1sxXSIsIDAsICJJTlBVVCIsICJTSUdOQUwiLCAiRklYRUQiLAotICAgICAgICAgICAgICAgICAgIDQ1LCAtMjE2MCwgMCwgIk0yIiwgMCwgMCwgMzAsIDEzNSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UGluTGF5ZXIoIk0yIiwgMCwgMCwgMCwgMCwgMzAsIDEzNSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UGluQW50ZW5uYVBpblBhcnRpYWxNZXRhbEFyZWEoMSwgIk0xIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UGluQW50ZW5uYVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhKDIsICJNMSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1BpbkFudGVubmFQaW5EaWZmQXJlYSg0LCAiTTIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndQaW5BbnRlbm5hUGluUGFydGlhbEN1dEFyZWEoNSwgIlYxIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UGluQW50ZW5uYU1vZGVsKCJPWElERTEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndQaW5BbnRlbm5hUGluR2F0ZUFyZWEoMywgIk0xIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UGluQW50ZW5uYVBpbk1heEFyZWFDYXIoNiwgIk0yIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UGluQW50ZW5uYVBpbk1heFNpZGVBcmVhQ2FyKDcsICJNMiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1BpbkFudGVubmFQaW5NYXhDdXRDYXIoOCwgIlYxIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UGluQW50ZW5uYU1vZGVsKCJPWElERTIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndQaW5BbnRlbm5hUGluR2F0ZUFyZWEoMzAsICJNMSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1BpbkFudGVubmFQaW5NYXhBcmVhQ2FyKDYwLCAiTTIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndQaW5BbnRlbm5hUGluTWF4U2lkZUFyZWFDYXIoNzAsICJNMiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1BpbkFudGVubmFQaW5NYXhDdXRDYXIoODAsICJWMSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1BpbigiSU5CVVM8MD4iLCAifElOQlVTPDA+IiwgMCwgIklOUFVUIiwgIlNJR05BTCIsICJQTEFDRUQiLAotICAgICAgICAgICAgICAgICAgIC00NSwgMjE2MCwgMSwgIk0yIiwgMCwgMCwgMzAsIDEzNCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UGluTGF5ZXIoIk0yIiwgMCwgMTAwMCwgMCwgMCwgMzAsIDEzNCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UGluKCJPVVRCVVM8MT4iLCAifE9VVEJVUzwxPiIsIDAsICJPVVRQVVQiLCAiU0lHTkFMIiwgIkNPVkVSIiwKLSAgICAgICAgICAgICAgICAgICAyMTYwLCA2NDUsIDIsICJNMSIsIDAsIDAsIDMwLCAxMzUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1BpbkxheWVyKCJNMSIsIDAsIDAsIDAsIDAsIDMwLCAxMzQpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1Bpbk5ldEV4cHIoImduZDEgR05EIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UGluKCJWREQiLCAiVkREIiwgMSwgIklOT1VUIiwgIlBPV0VSIiwgTlVMTCwgMCwgMCwgLTEsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UGluKCJCVVNBWzBdIiwgIkJVU0FbMF0iLCAwLCAiSU5QVVQiLCAiU0lHTkFMIiwgIlBMQUNFRCIsCi0gICAgICAgICAgICAgICAgICAgMCwgMjUwMCwgMSwgTlVMTCwgMCwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UGluTGF5ZXIoIk0xIiwgMCwgMCwgLTI1LCAwLCAyNSwgNTApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1BpbkxheWVyKCJNMiIsIDAsIDAsIC0xMCwgMCwgMTAsIDc1KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndQaW5WaWEoInZpYTEyIiwgMCwgMjUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1BpbigiVkREIiwgIlZERCIsIDEsICJJTk9VVCIsICJQT1dFUiIsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgMCwgMCwgLTEsIE5VTEwsIDAsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1BpblBvcnQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndQaW5Qb3J0TGF5ZXIoIk0yIiwgMCwgMCwgLTI1LCAwLCAyNSwgNTApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1BpblBvcnRMb2NhdGlvbigiUExBQ0VEIiwgMCwgMjUwMCwgIlMiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndQaW5Qb3J0KCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UGluUG9ydExheWVyKCJNMSIsIDAsIDAsIC0yNSwgMCwgMjUsIDUwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndQaW5Qb3J0TG9jYXRpb24oIkNPVkVSIiwgMCwgMjUwMCwgIlMiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndQaW5Qb3J0KCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UGluUG9ydExheWVyKCJNMSIsIDAsIDAsIC0yNSwgMCwgMjUsIDUwLCAyKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndQaW5Qb3J0TG9jYXRpb24oIkZJWEVEIiwgMCwgMjUwMCwgIlMiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndQaW5Qb3J0UG9seWdvbigiTTEiLCAwLCAyLCA2LCB4UCwgeVApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1BpblBvcnRQb2x5Z29uKCJNMiIsIDUsIDAsIDYsIHhQLCB5UCwgMSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UGluUG9ydFZpYSgiTTIiLCA1LCA0LCAxMTIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICBzdGF0dXMgPSBkZWZ3RW5kUGlucygpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICBmcmVlKChjaGFyKil4UCk7Ci0gIGZyZWUoKGNoYXIqKXlQKTsKLQotICAvLyBQSU5QUk9QRVJUSUVTCi0gIHN0YXR1cyA9IGRlZndTdGFydFBpblByb3BlcnRpZXMoMik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UGluUHJvcGVydHkoImNlbGwxIiwgIlBCMSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1N0cmluZ1Byb3BlcnR5KCJkcEJpdCIsICIxIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UmVhbFByb3BlcnR5KCJyZWFsUHJvcGVydHkiLCAzLjQpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1BpblByb3BlcnR5KCJjZWxsMiIsICJ2ZGQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndJbnRQcm9wZXJ0eSgiZHBJZ25vcmVUZXJtIiwgMik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3RW5kUGluUHJvcGVydGllcygpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICAvLyBTUEVDSUFMTkVUUwotICBzdGF0dXMgPSBkZWZ3U3RhcnRTcGVjaWFsTmV0cyg3KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0KCJuZXQxIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldENvbm5lY3Rpb24oImNlbGwxIiwgIlZERCIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRDb25uZWN0aW9uKCJjZWxsMiIsICJWREQiLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0Q29ubmVjdGlvbigiY2VsbDMiLCAiVkREIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldENvbm5lY3Rpb24oImNlbGw0IiwgIlZERCIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRXaWR0aCgiTTEiLCAyMDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRXaWR0aCgiTTIiLCAzMDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRWb2x0YWdlKDMuMik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFNwYWNpbmcoIk0xIiwgMjAwLCAxOTAsIDIxMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFNvdXJjZSgiVElNSU5HIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldE9yaWdpbmFsKCJWREQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0VXNlKCJQT1dFUiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRXZWlnaHQoMzApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1N0cmluZ1Byb3BlcnR5KCJjb250eXBlIiwgInN0YXIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndJbnRQcm9wZXJ0eSgiaW5kIiwgMSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UmVhbFByb3BlcnR5KCJtYXhsZW5ndGgiLCAxMi4xMyk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldEVuZE9uZU5ldCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXQoIlZTUyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRDb25uZWN0aW9uKCJjZWxsMSIsICJHTkQiLCAxKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0Q29ubmVjdGlvbigiY2VsbDIiLCAiR05EIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldENvbm5lY3Rpb24oImNlbGwzIiwgIkdORCIsIDEpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRDb25uZWN0aW9uKCJjZWxsNCIsICJHTkQiLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0VXNlKCJTQ0FOIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFBhdGhTdGFydCgiUk9VVEVEIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFBhdGhMYXllcigiTTEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0UGF0aFdpZHRoKDI1MCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFBhdGhTaGFwZSgiSU9XSVJFIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjb29yWCA9IChkb3VibGUqKW1hbGxvYyhzaXplb2YoZG91YmxlKSo2KTsKLSAgY29vclkgPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkqNik7Ci0gIGNvb3JWYWx1ZSA9IChkb3VibGUqKW1hbGxvYyhzaXplb2YoZG91YmxlKSo2KTsKLSAgY29vclhbMF0gPSA1LjA7Ci0gIGNvb3JZWzBdID0gMTUuMDsKLSAgY29vclZhbHVlWzBdID0gMDsKLSAgY29vclhbMV0gPSAxMjUuMDsKLSAgY29vcllbMV0gPSAxNS4wOwotICBjb29yVmFsdWVbMV0gPSAyMzUuMDsKLSAgY29vclhbMl0gPSAyNDUuMDsKLSAgY29vcllbMl0gPSAxNS4wOwotICBjb29yVmFsdWVbMl0gPSAyNTUuMDsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRQYXRoUG9pbnRXaXRoV2lyZUV4dCgzLCBjb29yWCwgY29vclksIGNvb3JWYWx1ZSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFBhdGhFbmQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0U2hpZWxkU3RhcnQoIm15X25ldCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRTaGllbGRMYXllcigiTTIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0U2hpZWxkV2lkdGgoOTApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRTaGllbGRTaGFwZSgiU1RSSVBFIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjb29yWFswXSA9IDE0MTAwLjA7Ci0gIGNvb3JZWzBdID0gMzQyNDQwLjA7Ci0gIGNvb3JYWzFdID0gMTM5MjAuMDsKLSAgY29vcllbMV0gPSAzNDI0NDAuMDsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRTaGllbGRQb2ludCgyLCBjb29yWCwgY29vclkpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRTaGllbGRWaWEoIk0yX1RVUk4iKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gMTQxMDAuMDsKLSAgY29vcllbMF0gPSAyNjMyMDAuMDsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRTaGllbGRQb2ludCgxLCBjb29yWCwgY29vclkpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRTaGllbGRWaWEoIk0xX00yIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFNoaWVsZFZpYURhdGEoMTAsIDIwLCAxMDAwLCAyMDAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gMjQwMC4wOwotICBjb29yWVswXSA9IDI2MzIwMC4wOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFNoaWVsZFBvaW50KDEsIGNvb3JYLCBjb29yWSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFNoaWVsZEVuZCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRTaGllbGRTdGFydCgibXlfbmV0MSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRTaGllbGRMYXllcigiTTIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0U2hpZWxkV2lkdGgoOTApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY29vclhbMF0gPSAxNDEwMC4wOwotICBjb29yWVswXSA9IDM0MjQ0MC4wOwotICBjb29yWFsxXSA9IDEzOTIwLjA7Ci0gIGNvb3JZWzFdID0gMzQyNDQwLjA7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0U2hpZWxkUG9pbnQoMiwgY29vclgsIGNvb3JZKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0U2hpZWxkVmlhKCJNMl9UVVJOIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjb29yWFswXSA9IDEzOTIwLjA7Ci0gIGNvb3JZWzBdID0gMjYzMjAwLjA7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0U2hpZWxkUG9pbnQoMSwgY29vclgsIGNvb3JZKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0U2hpZWxkVmlhKCJNMV9NMiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY29vclhbMF0gPSAyNDAwLjA7Ci0gIGNvb3JZWzBdID0gMjYzMjAwLjA7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0U2hpZWxkUG9pbnQoMSwgY29vclgsIGNvb3JZKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0U2hpZWxkRW5kKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFBhdHRlcm4oIlNURUlORVIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0RXN0Q2FwKDEwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldEVuZE9uZU5ldCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXQoIlZERCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRDb25uZWN0aW9uKCIqIiwgIlZERCIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRQYXRoU3RhcnQoIlJPVVRFRCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRQYXRoTGF5ZXIoIm1ldGFsMiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRQYXRoV2lkdGgoMTAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0UGF0aFNoYXBlKCJSSU5HIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFBhdGhTdHlsZSgxKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gMC4wOwotICBjb29yWVswXSA9IDAuMDsKLSAgY29vclhbMV0gPSAxMDAuMDsKLSAgY29vcllbMV0gPSAxMDAuMDsKLSAgY29vclhbMl0gPSAyMDAuMDsKLSAgY29vcllbMl0gPSAxMDAuMDsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRQYXRoUG9pbnQoMywgY29vclgsIGNvb3JZKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0UGF0aFN0YXJ0KCJORVciKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0UGF0aExheWVyKCJNMiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRQYXRoV2lkdGgoMjcwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0UGF0aFNoYXBlKCJQQURSSU5HIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjb29yWFswXSA9IC00NS4wOwotICBjb29yWVswXSA9IDEzNTAuMDsKLSAgY29vclhbMV0gPSA0NDg2NS4wOwotICBjb29yWVsxXSA9IDEzNTAuMDsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRQYXRoUG9pbnQoMiwgY29vclgsIGNvb3JZKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0UGF0aFN0YXJ0KCJORVciKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0UGF0aExheWVyKCJNMiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRQYXRoV2lkdGgoMjcwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gLTQ1LjA7Ci0gIGNvb3JZWzBdID0gMTM1MC4wOwotICBjb29yWFsxXSA9IDQ0ODY1LjA7Ci0gIGNvb3JZWzFdID0gMTM1MC4wOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFBhdGhQb2ludCgyLCBjb29yWCwgY29vclkpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRQYXRoRW5kKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldEVuZE9uZU5ldCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXQoIkNMT0NLIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFBhdGhTdGFydCgiUk9VVEVEIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFBhdGhMYXllcigiTTIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0UGF0aFdpZHRoKDIwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFBhdGhTaGFwZSgiQkxPQ0tSSU5HIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjb29yWFswXSA9IC00NS4wOwotICBjb29yWVswXSA9IDEzNTAuMDsKLSAgY29vclhbMV0gPSA0NDg2NS4wOwotICBjb29yWVsxXSA9IDEzNTAuMDsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRQYXRoUG9pbnQoMiwgY29vclgsIGNvb3JZKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0UGF0aFN0YXJ0KCJORVciKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0UGF0aExheWVyKCJNMiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRQYXRoV2lkdGgoMjcwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gLTQ1LjA7Ci0gIGNvb3JZWzBdID0gMTM1MC4wOwotICBjb29yWFsxXSA9IDQ0ODY1LjA7Ci0gIGNvb3JZWzFdID0gMTM1MC4wOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFBhdGhQb2ludCgyLCBjb29yWCwgY29vclkpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRQYXRoRW5kKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldEVuZE9uZU5ldCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXQoIlZDQyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLS8qCi0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0U2hpZWxkTmV0TmFtZSgiU2hpZWxkTmFtZSIpOwotKi8KLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRQYXRoU3RhcnQoIlJPVVRFRCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRQYXRoTGF5ZXIoIk0yIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFBhdGhXaWR0aCgyMDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRQYXRoU2hhcGUoIkRSQ0ZJTEwiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gLTQ1LjA7Ci0gIGNvb3JZWzBdID0gMTM1MC4wOwotICBjb29yWFsxXSA9IDQ0ODY1LjA7Ci0gIGNvb3JZWzFdID0gMTM1MC4wOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFBhdGhQb2ludCgyLCBjb29yWCwgY29vclkpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRQYXRoU3RhcnQoIk5FVyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRQYXRoTGF5ZXIoIk0yIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFBhdGhXaWR0aCgyNzApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRQYXRoU2hhcGUoIlNUUklQRSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY29vclhbMF0gPSAtNDUuMDsKLSAgY29vcllbMF0gPSAxMzUwLjA7Ci0gIGNvb3JYWzFdID0gNDQ4NjUuMDsKLSAgY29vcllbMV0gPSAxMzUwLjA7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0UGF0aFBvaW50KDIsIGNvb3JYLCBjb29yWSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFBhdGhNYXNrKDMxKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0UGF0aFZpYSgiVklBR0VOMjFfMiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRQYXRoVmlhRGF0YSgxMCwgMjAsIDEwMDAwLCAyMDAwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFBhdGhFbmQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0RW5kT25lTmV0KCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldCgibjEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0Q29ubmVjdGlvbigiUElOIiwgIm4xIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldENvbm5lY3Rpb24oImRyaXZlcjEiLCAiaW4iLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0Q29ubmVjdGlvbigiYnVtcGExIiwgImJ1bXBwaW4iLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0Rml4ZWRidW1wKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFBhdGhTdGFydCgiUk9VVEVEIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFBhdGhMYXllcigiTTIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0UGF0aFdpZHRoKDIwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFBhdGhTaGFwZSgiRklMTFdJUkVPUEMiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gLTQ1LjA7Ci0gIGNvb3JZWzBdID0gMTM1MC4wOwotICBjb29yWFsxXSA9IDQ0ODY1LjA7Ci0gIGNvb3JZWzFdID0gMTM1MC4wOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFBhdGhQb2ludCgyLCBjb29yWCwgY29vclkpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRQYXRoRW5kKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldEVuZE9uZU5ldCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgZnJlZSgoY2hhciopY29vclgpOwotICBmcmVlKChjaGFyKiljb29yWSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JWYWx1ZSk7Ci0KLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXQoIlZTUzEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0VXNlKCJQT1dFUiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgeFAgPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkqNik7Ci0gIHlQID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpKjYpOwotICB4UFswXSA9IDIuMTsKLSAgeVBbMF0gPSAyLjE7Ci0gIHhQWzFdID0gMy4xOwotICB5UFsxXSA9IDMuMTsKLSAgeFBbMl0gPSA0LjE7Ci0gIHlQWzJdID0gNC4xOwotICB4UFszXSA9IDUuMTsKLSAgeVBbM10gPSA1LjE7Ci0gIHhQWzRdID0gNi4xOwotICB5UFs0XSA9IDYuMTsKLSAgeFBbNV0gPSA3LjE7Ci0gIHlQWzVdID0gNy4xOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFBvbHlnb24oIm1ldGFsMSIsIDQsIHhQLCB5UCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFBvbHlnb24oIm1ldGFsMSIsIDYsIHhQLCB5UCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFJlY3QoIm1ldGFsMSIsIDAsIDAsIDEwMCwgMjAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0UmVjdCgibWV0YWwyIiwgMSwgMSwgMTAwLCAyMDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRWaWEoIm1ldGFsMiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRWaWFQb2ludHMoNCwgeFAsIHlQKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0RW5kT25lTmV0KCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBmcmVlKChjaGFyKil4UCk7Ci0gIGZyZWUoKGNoYXIqKXlQKTsKLSAgc3RhdHVzID0gZGVmd0VuZFNwZWNpYWxOZXRzKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICAKLSAgLy8gTkVUUwotICBzdGF0dXMgPSBkZWZ3U3RhcnROZXRzKDEzKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXQoIm5ldDEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRDb25uZWN0aW9uKCJaMzhBMDEiLCAiUSIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldENvbm5lY3Rpb24oIlozOEEwMyIsICJRIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0Q29ubmVjdGlvbigiWjM4QTA1IiwgIlEiLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRFbmRPbmVOZXQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgc3RhdHVzID0gZGVmd05ldCgibmV0MiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldENvbm5lY3Rpb24oImNlbGwxIiwgIlBCMSIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldENvbm5lY3Rpb24oImNlbGwyIiwgIlBCMSIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldENvbm5lY3Rpb24oImNlbGwzIiwgIlBCMSIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldEVzdENhcCgyMDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFdlaWdodCgyKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRWcGluKCJQMSIsIE5VTEwsIDAsIDAsIDAsIDAsICJQTEFDRUQiLCA1NCwgNjQsIDMpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldEVuZE9uZU5ldCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICBzdGF0dXMgPSBkZWZ3TmV0KCJuZXQzIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0Q29ubmVjdGlvbigiY2VsbDQiLCAiUEEzIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0Q29ubmVjdGlvbigiY2VsbDIiLCAiUDEwIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0WHRhbGsoMzApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldE9yaWdpbmFsKCJleHRyYV9jcmlzcHkiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRTb3VyY2UoIlVTRVIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRVc2UoIlNJR05BTCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldEZyZXF1ZW5jeSgxMDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ludFByb3BlcnR5KCJhbHQiLCAzNyk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3RyaW5nUHJvcGVydHkoImxhc3ROYW1lIiwgIlVua25vd24iKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndSZWFsUHJvcGVydHkoImxlbmd0aCIsIDEwLjExKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXR0ZXJuKCJCQUxBTkNFRCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFZwaW5TdHIoIlAyIiwgIkwxIiwgNDUsIDU0LCAzLCA0NiwgIkZJWEVEIiwgMjMsIDEyLCAiRk4iKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRFbmRPbmVOZXQoKTsgCi0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIGNvb3JYID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpKjMpOwotICBjb29yWSA9IChkb3VibGUqKW1hbGxvYyhzaXplb2YoZG91YmxlKSozKTsKLSAgc3RhdHVzID0gZGVmd05ldCgibXlfbmV0Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0Q29ubmVjdGlvbigiSTEiLCAiQSIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldENvbm5lY3Rpb24oIkJVRiIsICJaIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0Tm9uZGVmYXVsdFJ1bGUoIlJVTEUxIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0VXNlKCJSRVNFVCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFNoaWVsZG5ldCgiVlNTIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0U2hpZWxkbmV0KCJWREQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoU3RhcnQoIlJPVVRFRCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhMYXllcigiTTIiLCAwLCBOVUxMKTsgCi0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFN0eWxlKDIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY29vclhbMF0gPSAxNDAwMC4wOwotICBjb29yWVswXSA9IDM0MTQ0MC4wOwotICBjb29yWFsxXSA9IDk2MDAuMDsKLSAgY29vcllbMV0gPSAzNDE0NDAuMDsKLSAgY29vclhbMl0gPSA5NjAwLjA7Ci0gIGNvb3JZWzJdID0gMjgyNDAwLjA7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoUG9pbnQoMywgY29vclgsIGNvb3JZKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoVmlhKCJuZDFWSUExMiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY29vclhbMF0gPSAyNDAwOwotICBjb29yWVswXSA9IDI0MDA7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoUG9pbnQoMSwgY29vclgsIGNvb3JZKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoU3RhcnQoIk5FVyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhMYXllcigiTTEiLCAxLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoU3R5bGUoNCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjb29yWFswXSA9IDI0MDAuMDsKLSAgY29vcllbMF0gPSAyODI0MDAuMDsKLSAgY29vclhbMV0gPSAyNDAuMDsKLSAgY29vcllbMV0gPSAyODI0MDAuMDsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhQb2ludCgyLCBjb29yWCwgY29vclkpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgZnJlZSgoY2hhciopY29vclgpOwotICBmcmVlKChjaGFyKiljb29yWSk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoRW5kKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0Tm9zaGllbGRTdGFydCgiTTIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYU04gPSAoY29uc3QgY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKjIpOwotICBjb29yWVNOID0gKGNvbnN0IGNoYXIqKiltYWxsb2Moc2l6ZW9mKGNoYXIqKSoyKTsKLSAgY29vclhTTlswXSA9IHN0cmR1cCgiMTQxMDAiKTsKLSAgY29vcllTTlswXSA9IHN0cmR1cCgiMzQxNDQwIik7Ci0gIGNvb3JYU05bMV0gPSBzdHJkdXAoIjE0MDAwIik7Ci0gIGNvb3JZU05bMV0gPSBzdHJkdXAoIjM0MTQ0MCIpOwotICBzdGF0dXMgPSBkZWZ3TmV0Tm9zaGllbGRQb2ludCgyLCBjb29yWFNOLCBjb29yWVNOKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXROb3NoaWVsZFZpYSgiVklBNCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldE5vc2hpZWxkRW5kKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0RW5kT25lTmV0KCk7IAotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICBzdGF0dXMgPSBkZWZ3TmV0KCJ8SU5CVVNbMV0iKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRDb25uZWN0aW9uKCJ8aTEiLCAiQSIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldEVuZE9uZU5ldCgpOyAKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgc3RhdHVzID0gZGVmd05ldCgifElOQlVTPDA+Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0Q29ubmVjdGlvbigifGkwIiwgIkEiLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRFbmRPbmVOZXQoKTsgCi0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIHN0YXR1cyA9IGRlZndOZXQoInxPVVRCVVM8MT4iKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRDb25uZWN0aW9uKCJ8aTAiLCAiWiIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldEVuZE9uZU5ldCgpOyAKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgc3RhdHVzID0gZGVmd05ldCgiTVVTVEpPSU4iKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRDb25uZWN0aW9uKCJjZWxsNCIsICJQQTEiLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRFbmRPbmVOZXQoKTsgCi0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIHN0YXR1cyA9IGRlZndOZXQoIlhYMTAwIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0Q29ubmVjdGlvbigiWjM4QTA1IiwgIkciLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRDb25uZWN0aW9uKCJaMzhBMDMiLCAiRyIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldENvbm5lY3Rpb24oIlozOEEwMSIsICJHIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0VnBpbigiVl9TVUIzX1hYMTAwIiwgTlVMTCwgLTMzMywgLTMzMywgMzMzLCAzMzMsICJQTEFDRUQiLAotICAgICAgICAgICAgICAgICAgICAgICAxODk1NjAsIDI3MzAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRWcGluKCJWX1NVQjJfWFgxMDAiLCBOVUxMLCAtMzMzLCAtMzMzLCAzMzMsIDMzMywgIlBMQUNFRCIsCi0gICAgICAgICAgICAgICAgICAgICAgIDE2OTQwMCwgNjQ1MDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFZwaW4oIlZfU1VCMV9YWDEwMCIsIE5VTEwsIC0zMzMsIC0zMzMsIDMzMywgMzMzLCAiUExBQ0VEIiwKLSAgICAgICAgICAgICAgICAgICAgICAgNTUxNjAsIDMxNTAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRTdWJuZXRTdGFydCgiU1VCMV9YWDEwMCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFN1Ym5ldFBpbigiWjM4QTA1IiwgIkciKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRTdWJuZXRQaW4oIlZQSU4iLCAiVl9TVUIxX1hYMTAwIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFN0YXJ0KCJST1VURUQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoTGF5ZXIoIk0xIiwgMCwgIlJVTEUxIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBmcmVlKChjaGFyKiljb29yWFNOWzBdKTsKLSAgZnJlZSgoY2hhciopY29vcllTTlswXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JYU05bMV0pOwotICBmcmVlKChjaGFyKiljb29yWVNOWzFdKTsKLSAgZnJlZSgoY2hhciopY29vclhTTik7Ci0gIGZyZWUoKGNoYXIqKWNvb3JZU04pOwotICBjb29yWCA9IChkb3VibGUqKW1hbGxvYyhzaXplb2YoZG91YmxlKSo1KTsKLSAgY29vclkgPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkqNSk7Ci0gIGNvb3JWYWx1ZSA9IChkb3VibGUqKW1hbGxvYyhzaXplb2YoZG91YmxlKSo1KTsKLSAgY29vclhbMF0gPSA1NDA0MC4wOwotICBjb29yWVswXSA9IDMwMzAwLjA7Ci0gIGNvb3JYWzFdID0gNTQwNDAuMDsKLSAgY29vcllbMV0gPSAzMDkwMC4wOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFBvaW50KDIsIGNvb3JYLCBjb29yWSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFZpYSgibmQxVklBMTIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gNTQwNDAuMDsKLSAgY29vcllbMF0gPSAzMDkwMC4wOwotICBjb29yWFsxXSA9IDU2MjgwLjA7Ci0gIGNvb3JZWzFdID0gMzA5MDAuMDsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhQb2ludCgyLCBjb29yWCwgY29vclkpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhWaWFXaXRoT3JpZW50KCJuZDFWSUEyMyIsIDYpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY29vclhbMF0gPSA1NjI4MC4wOwotICBjb29yWVswXSA9IDMxNTAwLjA7Ci0gIGNvb3JYWzFdID0gNTUxNjAuMDsKLSAgY29vcllbMV0gPSAzMTUwMC4wOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFBvaW50KDIsIGNvb3JYLCBjb29yWSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aEVuZCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFN1Ym5ldEVuZCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFN1Ym5ldFN0YXJ0KCJTVUIyX1hYMTAwIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0U3VibmV0UGluKCJaMzhBMDMiLCAiRyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFN1Ym5ldFBpbigiVlBJTiIsICJWX1NVQjJfWFgxMDAiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoU3RhcnQoIlJPVVRFRCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhMYXllcigiTTEiLCAwLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gMTY4MjgwLjA7Ci0gIGNvb3JZWzBdID0gNjMzMDAuMDsKLSAgY29vclZhbHVlWzBdID0gNy4wOwotICBjb29yWFsxXSA9IDE2ODI4MC4wOwotICBjb29yWVsxXSA9IDY0NTAwLjA7Ci0gIGNvb3JWYWx1ZVsxXSA9IDA7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoUG9pbnRXaXRoRXh0KDIsIGNvb3JYLCBjb29yWSwgY29vclZhbHVlKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoVmlhKCJNMV9NMiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY29vclhbMF0gPSAxNjk0MDAuMDsKLSAgY29vcllbMF0gPSA2NDUwMC4wOwotICBjb29yVmFsdWVbMF0gPSA4LjA7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoUG9pbnRXaXRoRXh0KDEsIGNvb3JYLCBjb29yWSwgY29vclZhbHVlKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoVmlhV2l0aE9yaWVudFN0cigiTTJfTTMiLCAiU0UiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoRW5kKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0U3VibmV0RW5kKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0U3VibmV0U3RhcnQoIlNVQjNfWFgxMDAiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRTdWJuZXRQaW4oIlozOEEwMSIsICJHIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0U3VibmV0UGluKCJWUElOIiwgIlZfU1VCM19YWDEwMCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhTdGFydCgiUk9VVEVEIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aExheWVyKCJNMSIsIDAsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY29vclhbMF0gPSAxODg0MDAuMDsKLSAgY29vcllbMF0gPSAyNjEwMC4wOwotICBjb29yWFsxXSA9IDE4ODQwMC4wOwotICBjb29yWVsxXSA9IDI3MzAwLjA7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoUG9pbnQoMiwgY29vclgsIGNvb3JZKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoVmlhKCJNMV9NMiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY29vclhbMF0gPSAxODk1NjAuMDsKLSAgY29vcllbMF0gPSAyNzMwMC4wOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFBvaW50KDEsIGNvb3JYLCBjb29yWSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFZpYSgiTTFfTTIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoRW5kKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0U3VibmV0RW5kKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0U3VibmV0U3RhcnQoIlNVQjBfWFgxMDAiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRTdWJuZXRQaW4oIlZQSU4iLCAiVl9TVUIxX1hYMTAwIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0U3VibmV0UGluKCJWUElOIiwgIlZfU1VCMl9YWDEwMCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFN1Ym5ldFBpbigiVlBJTiIsICJWX1NVQjNfWFgxMDAiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXROb25kZWZhdWx0UnVsZSgiUlVMRTEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoU3RhcnQoIlJPVVRFRCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhMYXllcigiTTMiLCAwLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gMjY5NDAwLjA7Ci0gIGNvb3JZWzBdID0gNjQ1MDAuMDsKLSAgY29vclhbMV0gPSAyNjk0MDAuMDsKLSAgY29vcllbMV0gPSA1NDkwMC4wOwotICBjb29yWFsyXSA9IDE3MDUyMC4wOwotICBjb29yWVsyXSA9IDU0OTAwLjA7Ci0gIGNvb3JYWzNdID0gMTcwNTIwLjA7Ci0gIGNvb3JZWzNdID0gMzc1MDAuMDsKLSAgY29vclhbNF0gPSAxNzA1MjAuMDsKLSAgY29vcllbNF0gPSAzMDMwMC4wOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFBvaW50KDUsIGNvb3JYLCBjb29yWSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFZpYSgibmQxVklBMjMiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gMTcxMDgwLjA7Ci0gIGNvb3JZWzBdID0gMzAzMDAuMDsKLSAgY29vclhbMV0gPSAxNzQ0MC4wOwotICBjb29yWVsxXSA9IDAuMDsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhQb2ludCgyLCBjb29yWCwgY29vclkpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhWaWEoIm5kMVZJQTIzIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjb29yWFswXSA9IDE3NDQwLjA7Ci0gIGNvb3JZWzBdID0gMC4wOwotICBjb29yVmFsdWVbMF0gPSAwOwotICBjb29yWFsxXSA9IDE3NDQwLjA7Ci0gIGNvb3JZWzFdID0gMjY3MDAuMDsKLSAgY29vclZhbHVlWzFdID0gOC4wOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFBvaW50V2l0aEV4dCgyLCBjb29yWCwgY29vclksIGNvb3JWYWx1ZSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFZpYSgibmQxVklBMjMiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gMTc3ODAwLjA7Ci0gIGNvb3JZWzBdID0gMjY3MDAuMDsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhQb2ludCgxLCBjb29yWCwgY29vclkpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhWaWEoIm5kMVZJQTIzIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjb29yWFswXSA9IDE3NzgwMC4wOwotICBjb29yWVswXSA9IDI2NzAwLjA7Ci0gIGNvb3JWYWx1ZVswXSA9IDguMDsKLSAgY29vclhbMV0gPSAxNzc4MDAuMDsKLSAgY29vcllbMV0gPSAzMDMwMC4wOwotICBjb29yVmFsdWVbMV0gPSA4LjA7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoUG9pbnRXaXRoRXh0KDIsIGNvb3JYLCBjb29yWSwgY29vclZhbHVlKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoVmlhKCJuZDFWSUEyMyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhWaWEoIm5kMVZJQTIzIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjb29yWFswXSA9IDE4OTU2MC4wOwotICBjb29yWVswXSA9IDMwMzAwLjA7OwotICBjb29yVmFsdWVbMF0gPSA4LjA7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoUG9pbnRXaXRoRXh0KDEsIGNvb3JYLCBjb29yWSwgY29vclZhbHVlKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoVmlhKCJuZDFWSUExMiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY29vclhbMF0gPSAxODk1NjAuMDsKLSAgY29vcllbMF0gPSAyNzMwMC4wOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFBvaW50KDEsIGNvb3JYLCBjb29yWSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFN0YXJ0KCJORVciKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoTGF5ZXIoIk0zIiwgMSwgTlVMTCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjb29yWFswXSA9IDU1MTYwLjA7Ci0gIGNvb3JZWzBdID0gMzE1MDAuMDsKLSAgY29vclZhbHVlWzBdID0gOC4wOwotICBjb29yWFsxXSA9IDU1MTYwLjA7Ci0gIGNvb3JZWzFdID0gMzQ1MDAuMDsKLSAgY29vclZhbHVlWzFdID0gMC4wOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFBvaW50V2l0aEV4dCgyLCBjb29yWCwgY29vclksIGNvb3JWYWx1ZSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFZpYSgiTTJfTTMiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gMTQ5ODAwLjA7Ci0gIGNvb3JZWzBdID0gMzQ1MDAuMDsKLSAgY29vclZhbHVlWzBdID0gOC4wOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFBvaW50V2l0aEV4dCgxLCBjb29yWCwgY29vclksIGNvb3JWYWx1ZSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFZpYSgiTTJfTTMiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gMTQ5ODAwLjA7Ci0gIGNvb3JZWzBdID0gMzU3MDAuMDsKLSAgY29vclhbMV0gPSAxNDk4MDAuMDsKLSAgY29vcllbMV0gPSAzNTcwMC4wOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFBvaW50KDIsIGNvb3JYLCBjb29yWSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFZpYSgiTTJfTTMiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gMTQ5ODAwLjA7Ci0gIGNvb3JZWzBdID0gMzc1MDAuMDsKLSAgY29vclZhbHVlWzBdID0gOC4wOzsKLSAgY29vclhbMV0gPSAxNzA1MjAuMDsKLSAgY29vcllbMV0gPSAzNzUwMC4wOwotICBjb29yVmFsdWVbMV0gPSAwLjA7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoUG9pbnRXaXRoRXh0KDIsIGNvb3JYLCBjb29yWSwgY29vclZhbHVlKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoVmlhKCJNMl9NMyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhFbmQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRFbmRPbmVOZXQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgc3RhdHVzID0gZGVmd05ldCgiU0NBTiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldENvbm5lY3Rpb24oInNjYW5jZWxsMSIsICJQMTAiLCAxKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRDb25uZWN0aW9uKCJzY2FuY2VsbDIiLCAiUEEwIiwgMSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0U291cmNlKCJURVNUIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0RW5kT25lTmV0KCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIHN0YXR1cyA9IGRlZndOZXQoInRlc3RCdWciKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRDb25uZWN0aW9uKCJaMzhBMDUiLCAiRyIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldENvbm5lY3Rpb24oIlozOEEwMyIsICJHIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0Q29ubmVjdGlvbigiWjM4QTAxIiwgIkciLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoU3RhcnQoIlJPVVRFRCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhMYXllcigiTTIiLCAwLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gMTAwLjA7Ci0gIGNvb3JZWzBdID0gMTAwLjA7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoUG9pbnQoMSwgY29vclgsIGNvb3JZKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gNTAwLjA7Ci0gIGNvb3JZWzBdID0gMTAwLjA7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoUG9pbnQoMSwgY29vclgsIGNvb3JZKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoVmlydHVhbCg3MDAsIDEwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aE1hc2soMik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFJlY3QoLTMwMCwgMTAwLCAtMTAwLCAzMDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY29vclhbMF0gPSA3MDAuMDsKLSAgY29vcllbMF0gPSA3MDAuMDsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhQb2ludCgxLCBjb29yWCwgY29vclkpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhFbmQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoU3RhcnQoIlJPVVRFRCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhMYXllcigiTTEiLCAwLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gMTI4ODIxMC4wOwotICBjb29yWVswXSA9IDU4MDkzMC4wOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFBvaW50KDEsIGNvb3JYLCBjb29yWSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aE1hc2soMzEpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhWaWEoIkdFVEgxVzFXMSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY29vclhbMF0gPSAxMjg4MjEwLjA7Ci0gIGNvb3JZWzBdID0gNTgyODIwLjA7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoUG9pbnQoMSwgY29vclgsIGNvb3JZKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoVmlhKCJHRVRIMlcxVzEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoU3RhcnQoIk5FVyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhMYXllcigiTTMiLCAwLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gMTE0MTM1MC4wOwotICBjb29yWVswXSA9IDU4MjgyMC4wOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFBvaW50KDEsIGNvb3JYLCBjb29yWSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aE1hc2soMyk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFZpYSgiR0VUSDJXMVcxIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjb29yWFswXSA9IDExNDEzNTAuMDsKLSAgY29vcllbMF0gPSA1ODA5MzAuMDsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhQb2ludCgxLCBjb29yWCwgY29vclkpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhWaWEoIkdFVEgxVzFXMSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhTdGFydCgiTkVXIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aExheWVyKCJNMSIsIDAsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY29vclhbMF0gPSAxMjc4NDEwLjA7Ci0gIGNvb3JZWzBdID0gMjc1MTcwLjA7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoUG9pbnQoMSwgY29vclgsIGNvb3JZKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoU3RhcnQoIk5FVyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhMYXllcigiTTEiLCAwLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gMTE0MTIxMC4wOwotICBjb29yWVswXSA9IDI3MTI1MC4wOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFBvaW50KDEsIGNvb3JYLCBjb29yWSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFZpYSgiR0VUSDFXMVcxIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjb29yWFswXSA9IDExNDEyMTAuMDsKLSAgY29vcllbMF0gPSAyNzE0NjAuMDsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhQb2ludCgxLCBjb29yWCwgY29vclkpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhWaWEoIkdFVEgyVzFXMSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY29vclhbMF0gPSAxMTQyODIwLjA7Ci0gIGNvb3JZWzBdID0gMjcxNDYwLjA7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoUG9pbnQoMSwgY29vclgsIGNvb3JZKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoVmlhKCJHRVRIM1cxVzEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoRW5kKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0RW5kT25lTmV0KCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBmcmVlKChjaGFyKiljb29yWCk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JZKTsKLSAgZnJlZSgoY2hhciopY29vclZhbHVlKTsKLQotICBzdGF0dXMgPSBkZWZ3TmV0KCJuMSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldENvbm5lY3Rpb24oIlBJTiIsICJuMSIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldENvbm5lY3Rpb24oImRyaXZlcjEiLCAiaW4iLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRDb25uZWN0aW9uKCJidW1wYTEiLCAiYnVtcHBpbiIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldEZpeGVkYnVtcCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldEVuZE9uZU5ldCgpOyAKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgc3RhdHVzID0gZGVmd05ldE11c3Rqb2luQ29ubmVjdGlvbigiUElOMiIsICJuMiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldEVuZE9uZU5ldCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICBzdGF0dXMgPSBkZWZ3RW5kTmV0cygpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICAvLyBJT1RJTUlOR1MKLSAgLyogb2Jzb2xldGUgaW4gNS40Ci0gIHN0YXR1cyA9IGRlZndTdGFydElPVGltaW5ncygzKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndJT1RpbWluZygiUElOIiwgIklOQlVTPDA+Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3SU9UaW1pbmdWYXJpYWJsZSgiUklTRSIsIDYxMDAwMDAsIDcxMDAwMDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0lPVGltaW5nVmFyaWFibGUoIkZBTEwiLCAzMTAwMDAwLCAzMTAwMDAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndJT1RpbWluZ1NsZXdyYXRlKCJSSVNFIiwgMTEwLCAxMTApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0lPVGltaW5nU2xld3JhdGUoIkZBTEwiLCAyOTAsIDI5MCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3SU9UaW1pbmdDYXBhY2l0YW5jZSgwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndJT1RpbWluZygiUElOIiwgIklOQlVTWzFdIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3SU9UaW1pbmdEcml2ZWNlbGwoIklOViIsICJBIiwgIloiLCAyKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndJT1RpbWluZ1NsZXdyYXRlKCJSSVNFIiwgMTEwLCAxMTApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0lPVGltaW5nU2xld3JhdGUoIkZBTEwiLCAyOTAsIDI5MCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3SU9UaW1pbmdDYXBhY2l0YW5jZSgwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndJT1RpbWluZygiUElOIiwgIk9VVFBVUzwxPiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0lPVGltaW5nQ2FwYWNpdGFuY2UoMTIwMDAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndFbmRJT1RpbWluZ3MoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gICovCi0KLSAgLy8gU0NBTkNIQUlOCi0gIHN0YXR1cyA9IGRlZndTdGFydFNjYW5jaGFpbnMoNCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U2NhbmNoYWluKCJ0aGVfY2hhaW4iKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTY2FuY2hhaW5Db21tb25zY2FucGlucygiSU4iLCAiUEExIiwgIk9VVCIsICJQQTIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTY2FuY2hhaW5TdGFydCgiUElOIiwgInNjYW5waW4iKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTY2FuY2hhaW5TdG9wKCJjZWxsNCIsICJQQTIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTY2FuY2hhaW5PcmRlcmVkKCJjZWxsMiIsICJJTiIsICJQQTAiLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2VsbDEiLCAiT1VUIiwgIlAxMCIsIE5VTEwsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NjYW5jaGFpbkZsb2F0aW5nKCJzY2FuY2VsbDEiLCAiSU4iLCAiUEEwIiwgTlVMTCwgTlVMTCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U2NhbmNoYWluRmxvYXRpbmcoInNjYW5jZWxsMiIsICJPVVQiLCAiUDEwIiwgTlVMTCwgTlVMTCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U2NhbmNoYWluKCJjaGFpbjFfY2xvY2sxIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U2NhbmNoYWluUGFydGl0aW9uKCJjbG9jazEiLCAtMSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U2NhbmNoYWluU3RhcnQoImJsb2NrMS9jdXJyZW50X3N0YXRlX3JlZ18wX1FaIiwgTlVMTCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U2NhbmNoYWluRmxvYXRpbmcoImJsb2NrMS9wZ21fY2dtX2VuX3JlZyIsICJJTiIsICJTRCIsICJPVVQiLCAiUVoiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTY2FuY2hhaW5GbG9hdGluZygiYmxvY2sxL3N0YXJ0X3Jlc2V0X2RkX3JlZyIsICJJTiIsICJTRCIsICJPVVQiLCAiUVoiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTY2FuY2hhaW5TdG9wKCJibG9jazEvc3RhcnRfcmVzZXRfZF9yZWciLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTY2FuY2hhaW4oImNoYWluMl9jbG9jazIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTY2FuY2hhaW5QYXJ0aXRpb24oImNsb2NrMiIsIDEwMDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NjYW5jaGFpblN0YXJ0KCJibG9jazEvY3VycmVudF9zdGF0ZV9yZWdfMF9RWiIsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NjYW5jaGFpbkZsb2F0aW5nKCJibG9jazEvcG9ydDJfcGh5X2FkZHJfcmVnXzBfIiwgIklOIiwgIlNEIiwgIk9VVCIsICJRWiAiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTY2FuY2hhaW5GbG9hdGluZygiYmxvY2sxL3BvcnQyX3BoeV9hZGRyX3JlZ180XyIsICJJTiIsICJTRCIsICJPVVQiLCAiUVoiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTY2FuY2hhaW5GbG9hdGluZ0JpdHMoImJsb2NrMS9wb3J0M19pbnRmYyIsICJJTiIsICJTRCIsICJPVVQiLCAiUVoiLCA0KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTY2FuY2hhaW5PcmRlcmVkQml0cygiYmxvY2sxL211eDEiLCAiSU4iLCAiQSIsICJPVVQiLCAiWCIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmxvY2sxL2ZmMiIsICJJTiIsICJTRCIsICJPVVQiLCAiUSIsIC0xKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTY2FuY2hhaW4oImNoYWluNF9jbG9jazMiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTY2FuY2hhaW5QYXJ0aXRpb24oImNsb2NrMyIsIC0xKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTY2FuY2hhaW5TdGFydCgiYmxvY2sxL3ByZXNjYWxlcl9JTy9sZnNyX3JlZzEiLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTY2FuY2hhaW5GbG9hdGluZygiYmxvY2sxL2RwMV90aW1lcnMiLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTY2FuY2hhaW5GbG9hdGluZ0JpdHMoImJsb2NrMS9idXM4IiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgOCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U2NhbmNoYWluT3JkZXJlZEJpdHMoImJsb2NrMS9kc2wvZmZsIiwgIklOIiwgIlNEIiwgIk9VVCIsICJRIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgImJsb2NrMS9kc2wvbXV4MSIsICJJTiIsICJCIiwgIk9VVCIsICJZIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U2NhbmNoYWluT3JkZXJlZEJpdHMoImJsb2NrMS9kc2wvZmYyIiwgIklOIiwgIlNEIiwgIk9VVCIsICJRIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgImJsb2NrMS9kc2wvbXV4MiIsICJJTiIsICJCIiwgIk9VVCIsICJZIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U2NhbmNoYWluU3RvcCgiYmxvY2sxL3N0YXJ0X3Jlc2V0X2RfcmVnIiwgTlVMTCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIHN0YXR1cyA9IGRlZndFbmRTY2FuY2hhaW4oKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgLy8gQ09OU1RSQUlOVFMKLSAgLyogb2Jzb2xldGUgaW4gNS40Ci0gIHN0YXR1cyA9IGRlZndTdGFydENvbnN0cmFpbnRzKDMpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0NvbnN0cmFpbnRPcGVyYW5kKCk7ICAvLyB0aGUgZm9sbG93aW5nIGFyZSBvcGVyYW5kCi0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3Q29uc3RyYWludE9wZXJhbmRQYXRoKCJjZWxsMSIsICJWREQiLCAiY2VsbDIiLCAiVkREIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3Q29uc3RyYWludE9wZXJhbmRUaW1lKCJSSVNFTUFYIiwgNjAwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3Q29uc3RyYWludE9wZXJhbmRUaW1lKCJGQUxMTUlOIiwgOTAwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3Q29uc3RyYWludE9wZXJhbmRFbmQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndDb25zdHJhaW50T3BlcmFuZCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0NvbnN0cmFpbnRPcGVyYW5kU3VtKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3Q29uc3RyYWludE9wZXJhbmROZXQoIm5ldDIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndDb25zdHJhaW50T3BlcmFuZE5ldCgibmV0MyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0NvbnN0cmFpbnRPcGVyYW5kU3VtRW5kKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3Q29uc3RyYWludE9wZXJhbmRUaW1lKCJSSVNFTUFYIiwgMjAwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3Q29uc3RyYWludE9wZXJhbmRUaW1lKCJGQUxMTUlOIiwgNTAwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3Q29uc3RyYWludE9wZXJhbmRFbmQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndDb25zdHJhaW50V2lyZWRsb2dpYygibmV0MSIsIDEwMDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0VuZENvbnN0cmFpbnRzKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICAqLwotCi0gIC8vIEdST1VQUwotICBncm91cEV4cHIgPSAoY29uc3QgY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKjIpOwotICBzdGF0dXMgPSBkZWZ3U3RhcnRHcm91cHMoMik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBncm91cEV4cHJbMF0gPSBzdHJkdXAoImNlbGwyIik7IAotICBncm91cEV4cHJbMV0gPSBzdHJkdXAoImNlbGwzIik7IAotICBzdGF0dXMgPSBkZWZ3R3JvdXAoImdyb3VwMSIsIDIsIGdyb3VwRXhwcik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBmcmVlKChjaGFyKilncm91cEV4cHJbMF0pOwotICBmcmVlKChjaGFyKilncm91cEV4cHJbMV0pOwotICBzdGF0dXMgPSBkZWZ3R3JvdXBSZWdpb24oMCwgMCwgMCwgMCwgInJlZ2lvbjEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTdHJpbmdQcm9wZXJ0eSgiZ2dycCIsICJ4eCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ludFByb3BlcnR5KCJzaWRlIiwgMik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UmVhbFByb3BlcnR5KCJtYXhhcmVhIiwgNS42KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGdyb3VwRXhwclswXSA9IHN0cmR1cCgiY2VsbDEiKTsgCi0gIHN0YXR1cyA9IGRlZndHcm91cCgiZ3JvdXAyIiwgMSwgZ3JvdXBFeHByKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGZyZWUoKGNoYXIqKWdyb3VwRXhwclswXSk7Ci0gIHN0YXR1cyA9IGRlZndHcm91cFJlZ2lvbigwLCAxMCwgMTAwMCwgMTAxMCwgTlVMTCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3RyaW5nUHJvcGVydHkoImdncnAiLCAiYWZ0ZXIgdGhlIGZhbGwiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndHcm91cFNvZnQoIk1BWEhBTEZQRVJJTUVURVIiLCA0MDAwLCAiTUFYWCIsIDEwMDAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndFbmRHcm91cHMoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGZyZWUoKGNoYXIqKWdyb3VwRXhwcik7Ci0gIHN0YXR1cyA9IGRlZndOZXdMaW5lKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIC8vIEJMT0NLQUdFUwotICBpbnQgKnhQQiwgKnlQQjsKLSAgeFBCID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKjcpOwotICB5UEIgPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkqNyk7Ci0gIHhQQlswXSA9IDI7Ci0gIHlQQlswXSA9IDI7Ci0gIHhQQlsxXSA9IDM7Ci0gIHlQQlsxXSA9IDM7Ci0gIHhQQlsyXSA9IDQ7Ci0gIHlQQlsyXSA9IDQ7Ci0gIHhQQlszXSA9IDU7Ci0gIHlQQlszXSA9IDU7Ci0gIHhQQls0XSA9IDY7Ci0gIHlQQls0XSA9IDY7Ci0gIHhQQls1XSA9IDc7Ci0gIHlQQls1XSA9IDc7Ci0gIHhQQls2XSA9IDg7Ci0gIHlQQls2XSA9IDg7Ci0KLSAgc3RhdHVzID0gZGVmd1N0YXJ0QmxvY2thZ2VzKDEzKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndCbG9ja2FnZXNMYXllcigibTEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndCbG9ja2FnZXNMYXllckNvbXBvbmVudCgiY29tcDEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndCbG9ja2FnZXNSZWN0KDM0NTYsIDQ1MzUsIDMwMDAsIDQwMDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0Jsb2NrYWdlc1JlY3QoNDUwMCwgNjUwMCwgNTUwMCwgNjAwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3QmxvY2thZ2VzUG9seWdvbig3LCB4UEIsIHlQQik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3QmxvY2thZ2VzUG9seWdvbig2LCB4UEIsIHlQQik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3QmxvY2thZ2VzUmVjdCg1MDAwLCA2MDAwLCA0MDAwLCA1MDAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndCbG9ja2FnZXNQbGFjZW1lbnQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndCbG9ja2FnZXNQbGFjZW1lbnRDb21wb25lbnQoIm0yIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3QmxvY2thZ2VzUmVjdCg0MDAwLCA2MDAwLCA4MDAwLCA0MDAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndCbG9ja2FnZXNSZWN0KDgwMDAsIDQwMCwgNjAwLCA4MDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0Jsb2NrYWdlc0xheWVyKCJtMyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0Jsb2NrYWdlc0xheWVyU3BhY2luZygxMDAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndCbG9ja2FnZXNSZWN0KDMwMDAsIDQwMDAsIDYwMDAsIDUwMDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0Jsb2NrYWdlc0xheWVyKCJtNCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0Jsb2NrYWdlc0xheWVyU3BhY2luZygxMDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0Jsb2NrYWdlc0xheWVyRXhjZXB0cGduZXQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndCbG9ja2FnZXNMYXllckNvbXBvbmVudCgiVTI3MjYiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndCbG9ja2FnZXNMYXllclB1c2hkb3duKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3QmxvY2thZ2VzTGF5ZXJNYXNrKDMpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0Jsb2NrYWdlc1JlY3QoMzAwMCwgNDAwMCwgNjAwMCwgNTAwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3QmxvY2thZ2VzTGF5ZXIoIm00Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3QmxvY2thZ2VzTGF5ZXJDb21wb25lbnQoIlUyNzI2Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3QmxvY2thZ2VzTGF5ZXJQdXNoZG93bigpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0Jsb2NrYWdlc0xheWVyRGVzaWduUnVsZVdpZHRoKDEwMDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0Jsb2NrYWdlc1JlY3QoMzAwMCwgNDAwMCwgNjAwMCwgNTAwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3QmxvY2thZ2VzTGF5ZXIoIm01Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3QmxvY2thZ2VzTGF5ZXJGaWxscygpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0Jsb2NrYWdlc1JlY3QoMzAwMCwgNDAwMCwgNjAwMCwgNTAwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3QmxvY2thZ2VzTGF5ZXIoIm02Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3QmxvY2thZ2VzTGF5ZXJQdXNoZG93bigpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0Jsb2NrYWdlc1JlY3QoMzAwMCwgNDAwMCwgNjAwMCwgNTAwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3QmxvY2thZ2VzUG9seWdvbig3LCB4UEIsIHlQQik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3QmxvY2thZ2VzUGxhY2VtZW50KCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3QmxvY2thZ2VzUGxhY2VtZW50Q29tcG9uZW50KCJtNyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0Jsb2NrYWdlc1JlY3QoMzAwMCwgNDAwMCwgNjAwMCwgNTAwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3QmxvY2thZ2VzUGxhY2VtZW50KCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3QmxvY2thZ2VzUGxhY2VtZW50UHVzaGRvd24oKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndCbG9ja2FnZXNSZWN0KDMwMDAsIDQwMDAsIDYwMDAsIDUwMDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0Jsb2NrYWdlc1BsYWNlbWVudCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0Jsb2NrYWdlc1JlY3QoMzAwMCwgNDAwMCwgNjAwMCwgNTAwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3QmxvY2thZ2VzUGxhY2VtZW50KCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3QmxvY2thZ2VzUGxhY2VtZW50U29mdCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0Jsb2NrYWdlc1BsYWNlbWVudENvbXBvbmVudCgiVTI3MjkiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndCbG9ja2FnZXNQbGFjZW1lbnRQdXNoZG93bigpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0Jsb2NrYWdlc1JlY3QoNDAwMCwgNjAwMCwgODAwMCwgNDAwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3QmxvY2thZ2VzUGxhY2VtZW50KCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3QmxvY2thZ2VzUGxhY2VtZW50UGFydGlhbCgxLjEpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0Jsb2NrYWdlc1JlY3QoNDAwMCwgNjAwMCwgODAwMCwgNDAwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3QmxvY2thZ2VzTGF5ZXIoIm1ldGFsMSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gIGRlZndCbG9ja2FnZXNMYXllckV4Y2VwdHBnbmV0KCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3QmxvY2thZ2VzTGF5ZXJTcGFjaW5nKDQpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0Jsb2NrYWdlc1BvbHlnb24oMywgeFBCLCB5UEIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0VuZEJsb2NrYWdlcygpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ld0xpbmUoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGZyZWUoKGNoYXIqKXhQQik7Ci0gIGZyZWUoKGNoYXIqKXlQQik7Ci0KLSAgLy8gU0xPVFMKLSAgeFAgPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkqNyk7Ci0gIHlQID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpKjcpOwotICB4UFswXSA9IDIuMTsKLSAgeVBbMF0gPSAyLjE7Ci0gIHhQWzFdID0gMy4xOwotICB5UFsxXSA9IDMuMTsKLSAgeFBbMl0gPSA0LjE7Ci0gIHlQWzJdID0gNC4xOwotICB4UFszXSA9IDUuMTsKLSAgeVBbM10gPSA1LjE7Ci0gIHhQWzRdID0gNi4xOwotICB5UFs0XSA9IDYuMTsKLSAgeFBbNV0gPSA3LjE7Ci0gIHlQWzVdID0gNy4xOwotICB4UFs2XSA9IDguMTsKLSAgeVBbNl0gPSA4LjE7Ci0gIHN0YXR1cyA9IGRlZndTdGFydFNsb3RzKDIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1Nsb3RMYXllcigiTUVUMSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1Nsb3RQb2x5Z29uKDcsIHhQLCB5UCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U2xvdFBvbHlnb24oMywgeFAsIHlQKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTbG90UmVjdCgxMDAwLCAyMDAwLCAxNTAwLCA0MDAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTbG90UmVjdCgyMDAwLCAyMDAwLCAyNTAwLCA0MDAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTbG90UmVjdCgzMDAwLCAyMDAwLCAzNTAwLCA0MDAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTbG90TGF5ZXIoIk1FVDIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTbG90UmVjdCgxMDAwLCAyMDAwLCAxNTAwLCA0MDAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTbG90UG9seWdvbig2LCB4UCwgeVApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0VuZFNsb3RzKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV3TGluZSgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgZnJlZSgoY2hhciopeFApOwotICBmcmVlKChjaGFyKil5UCk7Ci0KLSAgLy8gRklMTFMKLSAgeFAgPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkqNyk7Ci0gIHlQID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpKjcpOwotICB4UFswXSA9IDIuMTsKLSAgeVBbMF0gPSAyLjE7Ci0gIHhQWzFdID0gMy4xOwotICB5UFsxXSA9IDMuMTsKLSAgeFBbMl0gPSA0LjE7Ci0gIHlQWzJdID0gNC4xOwotICB4UFszXSA9IDUuMTsKLSAgeVBbM10gPSA1LjE7Ci0gIHhQWzRdID0gNi4xOwotICB5UFs0XSA9IDYuMTsKLSAgeFBbNV0gPSA3LjE7Ci0gIHlQWzVdID0gNy4xOwotICB4UFs2XSA9IDguMTsKLSAgeVBbNl0gPSA4LjE7Ci0gIHN0YXR1cyA9IGRlZndTdGFydEZpbGxzKDUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ZpbGxMYXllcigiTUVUMSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ZpbGxSZWN0KDEwMDAsIDIwMDAsIDE1MDAsIDQwMDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ZpbGxQb2x5Z29uKDUsIHhQLCB5UCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3RmlsbFJlY3QoMjAwMCwgMjAwMCwgMjUwMCwgNDAwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3RmlsbFBvbHlnb24oNywgeFAsIHlQKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndGaWxsUmVjdCgzMDAwLCAyMDAwLCAzNTAwLCA0MDAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndGaWxsTGF5ZXIoIk1FVDIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndGaWxsUmVjdCgxMDAwLCAyMDAwLCAxNTAwLCA0MDAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndGaWxsUmVjdCgxMDAwLCA0NTAwLCAxNTAwLCA2NTAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndGaWxsUmVjdCgxMDAwLCA3MDAwLCAxNTAwLCA5MDAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndGaWxsUmVjdCgxMDAwLCA5NTAwLCAxNTAwLCAxMTUwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3RmlsbFBvbHlnb24oNywgeFAsIHlQKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndGaWxsUG9seWdvbig2LCB4UCwgeVApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ZpbGxMYXllcigibWV0YWwxIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3RmlsbExheWVyT1BDKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3RmlsbFJlY3QoMTAwLCAyMDAsIDE1MCwgNDAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndGaWxsUmVjdCgzMDAsIDIwMCwgMzUwLCA0MDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ZpbGxWaWEoInZpYTI4Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3RmlsbFZpYU9QQygpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ZpbGxQb2ludHMoMSwgeFAsIHlQKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndGaWxsVmlhKCJ2aWEyNiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ZpbGxQb2ludHMoMywgeFAsIHlQKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndFbmRGaWxscygpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ld0xpbmUoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGZyZWUoKGNoYXIqKXhQKTsKLSAgZnJlZSgoY2hhciopeVApOwotCi0gIC8vIFNMT1RTCi0gIHhQID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpKjcpOwotICB5UCA9IChkb3VibGUqKW1hbGxvYyhzaXplb2YoZG91YmxlKSo3KTsKLSAgeFBbMF0gPSAyLjE7Ci0gIHlQWzBdID0gMi4xOwotICB4UFsxXSA9IDMuMTsKLSAgeVBbMV0gPSAzLjE7Ci0gIHhQWzJdID0gNC4xOwotICB5UFsyXSA9IDQuMTsKLSAgeFBbM10gPSA1LjE7Ci0gIHlQWzNdID0gNS4xOwotICB4UFs0XSA9IDYuMTsKLSAgeVBbNF0gPSA2LjE7Ci0gIHhQWzVdID0gNy4xOwotICB5UFs1XSA9IDcuMTsKLSAgeFBbNl0gPSA4LjE7Ci0gIHlQWzZdID0gOC4xOwotICBzdGF0dXMgPSBkZWZ3U3RhcnRTbG90cygyKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTbG90TGF5ZXIoIk1FVDEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTbG90UmVjdCgxMDAwLCAyMDAwLCAxNTAwLCA0MDAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTbG90UG9seWdvbig1LCB4UCwgeVApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1Nsb3RSZWN0KDIwMDAsIDIwMDAsIDI1MDAsIDQwMDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1Nsb3RQb2x5Z29uKDcsIHhQLCB5UCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U2xvdFJlY3QoMzAwMCwgMjAwMCwgMzUwMCwgNDAwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U2xvdExheWVyKCJNRVQyIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U2xvdFJlY3QoMTAwMCwgMjAwMCwgMTUwMCwgNDAwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U2xvdFJlY3QoMTAwMCwgNDUwMCwgMTUwMCwgNjUwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U2xvdFJlY3QoMTAwMCwgNzAwMCwgMTUwMCwgOTAwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U2xvdFJlY3QoMTAwMCwgOTUwMCwgMTUwMCwgMTE1MDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1Nsb3RQb2x5Z29uKDcsIHhQLCB5UCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U2xvdFBvbHlnb24oNiwgeFAsIHlQKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndFbmRTbG90cygpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ld0xpbmUoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGZyZWUoKGNoYXIqKXhQKTsKLSAgZnJlZSgoY2hhciopeVApOwotCi0gIC8vIE5PTkRFRkFVTFRSVUxFUwotICBzdGF0dXMgPSBkZWZ3U3RhcnROb25EZWZhdWx0UnVsZXMoNCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3Tm9uRGVmYXVsdFJ1bGUoImRvdWJsZVNwYWNlUnVsZSIsIDEpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05vbkRlZmF1bHRSdWxlTGF5ZXIoIm1ldGFsMSIsIDIsIDAsIDEsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05vbkRlZmF1bHRSdWxlTGF5ZXIoIm1ldGFsMiIsIDIsIDAsIDEsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05vbkRlZmF1bHRSdWxlTGF5ZXIoIm1ldGFsMyIsIDIsIDAsIDEsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05vbkRlZmF1bHRSdWxlKCJsb3dlclJlc2lzdGFuY2UiLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOb25EZWZhdWx0UnVsZUxheWVyKCJtZXRhbDEiLCA2LCAwLCAwLCA1KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOb25EZWZhdWx0UnVsZUxheWVyKCJtZXRhbDIiLCA1LCAxLCA2LCA0KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOb25EZWZhdWx0UnVsZUxheWVyKCJtZXRhbDMiLCA1LCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOb25EZWZhdWx0UnVsZU1pbkN1dHMoImN1dDEyIiwgMik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3Tm9uRGVmYXVsdFJ1bGVNaW5DdXRzKCJjdXQyMyIsIDIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05vbkRlZmF1bHRSdWxlKCJteVJ1bGUiLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOb25EZWZhdWx0UnVsZUxheWVyKCJtZXRhbDEiLCAyLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOb25EZWZhdWx0UnVsZUxheWVyKCJtZXRhbDIiLCAyLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOb25EZWZhdWx0UnVsZUxheWVyKCJtZXRhbDMiLCAyLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOb25EZWZhdWx0UnVsZVZpYVJ1bGUoIm15dmlhMTJydWxlIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3Tm9uRGVmYXVsdFJ1bGVWaWFSdWxlKCJteXZpYTIzcnVsZSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1JlYWxQcm9wZXJ0eSgibWlubGVuZ3RoIiwgNTAuNSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3RyaW5nUHJvcGVydHkoImZpcnN0TmFtZSIsICJPbmx5Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3SW50UHJvcGVydHkoImlkeCIsIDEpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05vbkRlZmF1bHRSdWxlKCJteUN1c3RvbVJ1bGUiLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOb25EZWZhdWx0UnVsZUxheWVyKCJtZXRhbDEiLCA1LCAwLCAxLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOb25EZWZhdWx0UnVsZUxheWVyKCJtZXRhbDIiLCA1LCAwLCAxLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOb25EZWZhdWx0UnVsZUxheWVyKCJtZXRhbDMiLCA1LCAwLCAxLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOb25EZWZhdWx0UnVsZVZpYSgibXl2aWExMl9jdXN0b20xIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3Tm9uRGVmYXVsdFJ1bGVWaWEoIm15dmlhMTJfY3VzdG9tMiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05vbkRlZmF1bHRSdWxlVmlhKCJteXZpYTIzX2N1c3RvbTEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOb25EZWZhdWx0UnVsZVZpYSgibXl2aWEyM19jdXN0b20yIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3RW5kTm9uRGVmYXVsdFJ1bGVzKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV3TGluZSgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICAvLyBTVFlMRVMKLSAgc3RhdHVzID0gZGVmd1N0YXJ0U3R5bGVzKDMpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgeFAgPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkqNik7Ci0gIHlQID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpKjYpOwotICB4UFswXSA9IDMwOwotICB5UFswXSA9IDEwOwotICB4UFsxXSA9IDEwOwotICB5UFsxXSA9IDMwOwotICB4UFsyXSA9IC0xMDsKLSAgeVBbMl0gPSAzMDsKLSAgeFBbM10gPSAtMzA7Ci0gIHlQWzNdID0gMTA7Ci0gIHhQWzRdID0gLTMwOwotICB5UFs0XSA9IC0xMDsKLSAgeFBbNV0gPSAtMTA7Ci0gIHlQWzVdID0gLTMwOwotICBzdGF0dXMgPSBkZWZ3U3R5bGVzKDEsIDYsIHhQLCB5UCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3R5bGVzKDIsIDUsIHhQLCB5UCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBmcmVlKChjaGFyKil4UCk7Ci0gIGZyZWUoKGNoYXIqKXlQKTsKLSAgeFAgPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkqOCk7Ci0gIHlQID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpKjgpOwotICB4UFswXSA9IDMwOwotICB5UFswXSA9IDEwOwotICB4UFsxXSA9IDEwOwotICB5UFsxXSA9IDMwOwotICB4UFsyXSA9IC0xMDsKLSAgeVBbMl0gPSAzMDsKLSAgeFBbM10gPSAtMzA7Ci0gIHlQWzNdID0gMTA7Ci0gIHhQWzRdID0gLTMwOwotICB5UFs0XSA9IC0xMDsKLSAgeFBbNV0gPSAtMTA7Ci0gIHlQWzVdID0gLTMwOwotICB4UFs2XSA9IDEwOwotICB5UFs2XSA9IC0zMDsKLSAgeFBbN10gPSAzMDsKLSAgeVBbN10gPSAtMTA7Ci0gIHN0YXR1cyA9IGRlZndTdHlsZXMoMywgOCwgeFAsIHlQKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndFbmRTdHlsZXMoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGZyZWUoKGNoYXIqKXhQKTsKLSAgZnJlZSgoY2hhciopeVApOwotICBzdGF0dXMgPSBkZWZ3TmV3TGluZSgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICAvLyBCRUdJTkVYVAotICBzdGF0dXMgPSBkZWZ3U3RhcnRCZWdpbmV4dCgidGFnIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICAgZGVmd0FkZEluZGVudCgpOwotICBzdGF0dXMgPSBkZWZ3QmVnaW5leHRDcmVhdG9yKCJDQURFTkNFIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICAvLyBzaW5jZSB0aGUgZGF0ZSBpcyBkaWZmZXJlbnQgZWFjaCB0aW1lLAotICAvLyBpdCB3aWxsIGNhdXNlIHRoZSBxdWljayB0ZXN0IHRvIGZhaWwKLSAgLy8gc3RhdHVzID0gZGVmd0JlZ2luZXh0RGF0ZSgpOwotICAvLyBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0JlZ2luZXh0UmV2aXNpb24oNSwgNyk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3QmVnaW5leHRTeW50YXgoIk9UVEVSIiwgImZ1cnJ5Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3RyaW5nUHJvcGVydHkoImFycmciLCAibGF0ZXIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndCZWdpbmV4dFN5bnRheCgiU0VBTCIsICJjb3VzaW4gdG8gV0FMUlVTIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3RW5kQmVnaW5leHQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLQotICBzdGF0dXMgPSBkZWZ3RW5kKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIGxpbmVOdW1iZXIgPSBkZWZ3Q3VycmVudExpbmVOdW1iZXIoKTsKLSAgaWYgKGxpbmVOdW1iZXIgPT0gMCkKLSAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogbm90aGluZyBoYXMgYmVlbiByZWFkLlxuIik7Ci0KLSAgZmNsb3NlKGZvdXQpOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZndyaXRlL2RlZndyaXRlQ2JzLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWZ3cml0ZS9kZWZ3cml0ZUNicy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NmQzNWQuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RlZndyaXRlL2RlZndyaXRlQ2JzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0MjQgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yJAotLy8gICRSZXZpc2lvbiQKLS8vICAkRGF0ZSQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaWZuZGVmIFdJTjMyCi0jICAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYgLyogbm90IFdJTjMyICovCi0jaW5jbHVkZSAiZGVmd1dyaXRlci5ocHAiCi0jaW5jbHVkZSAiZGVmd1dyaXRlckNhbGxzLmhwcCIKLQotLy8gR2xvYmFsIHZhcmlhYmxlcwotY2hhciAgZGVmYXVsdE91dFsxMjhdOwotRklMRSogZm91dDsKLWludCAgIHVzZXJEYXRhOwotCi0jZGVmaW5lIENIRUNLX1NUQVRVUyhzdGF0dXMpIFwKLSAgaWYgKHN0YXR1cykgeyAgICAgICAgICAgICAgXAotICAgICBkZWZ3UHJpbnRFcnJvcihzdGF0dXMpOyBcCi0gICAgIHJldHVybihzdGF0dXMpOyAgICAgICAgIFwKLSAgfQotCi12b2lkIGRhdGFFcnJvcigpIHsKLSAgZnByaW50Zihmb3V0LCAiRVJST1I6IHJldHVybmVkIHVzZXIgZGF0YSBpcyBub3QgY29ycmVjdCFcbiIpOwotfQotCi12b2lkIGNoZWNrVHlwZShkZWZ3Q2FsbGJhY2tUeXBlX2UgYykgewotICBpZiAoYyA+PSAwICYmIGMgPD0gZGVmd0Rlc2lnbkVuZENia1R5cGUpIHsKLSAgICAvLyBPSwotICB9IGVsc2UgewotICAgIGZwcmludGYoZm91dCwgIkVSUk9SOiBjYWxsYmFjayB0eXBlIGlzIG91dCBvZiBib3VuZHMhXG4iKTsKLSAgfQotfQotCi1pbnQgdmVyc2lvbkNCKGRlZndDYWxsYmFja1R5cGVfZSBjLCBkZWZpVXNlckRhdGEgdWQpIHsKLSAgaW50IHN0YXR1czsKLQotICBjaGVja1R5cGUoYyk7Ci0gIGlmICgoaW50KXVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgc3RhdHVzID0gZGVmd1ZlcnNpb24oNSwgNik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICByZXR1cm4gMDsKLQotfQotIAotaW50IGRpdmlkZXJDQihkZWZ3Q2FsbGJhY2tUeXBlX2UgYywgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGludCBzdGF0dXM7Ci0KLSAgY2hlY2tUeXBlKGMpOwotICBpZiAoKGludCl1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIHN0YXR1cyA9IGRlZndEaXZpZGVyQ2hhcigiLyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgcmV0dXJuIDA7Ci0KLX0KLSAKLWludCBidXNiaXRDQihkZWZ3Q2FsbGJhY2tUeXBlX2UgYywgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGludCBzdGF0dXM7Ci0KLSAgY2hlY2tUeXBlKGMpOwotICBpZiAoKGludCl1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIHN0YXR1cyA9IGRlZndCdXNCaXRDaGFycygiW10iKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHJldHVybiAwOwotCi19Ci0gCi1pbnQgZGVzaWduQ0IoZGVmd0NhbGxiYWNrVHlwZV9lIGMsIGRlZmlVc2VyRGF0YSB1ZCkgewotICBpbnQgc3RhdHVzOwotCi0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKChpbnQpdWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBzdGF0dXMgPSBkZWZ3RGVzaWduTmFtZSgibXVrIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICByZXR1cm4gMDsKLQotfQotIAotaW50IHRlY2hub2xvZ3lDQihkZWZ3Q2FsbGJhY2tUeXBlX2UgYywgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGludCBzdGF0dXM7Ci0KLSAgY2hlY2tUeXBlKGMpOwotICBpZiAoKGludCl1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIHN0YXR1cyA9IGRlZndUZWNobm9sb2d5KCJtdWsiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHJldHVybiAwOwotCi19Ci0gCi1pbnQgYXJyYXlDQihkZWZ3Q2FsbGJhY2tUeXBlX2UgYywgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGludCBzdGF0dXM7Ci0KLSAgY2hlY2tUeXBlKGMpOwotICBpZiAoKGludCl1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIHN0YXR1cyA9IGRlZndBcnJheSgiY29yZV9hcnJheSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgcmV0dXJuIDA7Ci0KLX0KLSAKLWludCBmbG9vcnBsYW5DQihkZWZ3Q2FsbGJhY2tUeXBlX2UgYywgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGludCBzdGF0dXM7Ci0KLSAgY2hlY2tUeXBlKGMpOwotICBpZiAoKGludCl1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIHN0YXR1cyA9IGRlZndGbG9vcnBsYW4oIkRFRkFVTFQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHJldHVybiAwOwotfQotIAotaW50IHVuaXRzQ0IoZGVmd0NhbGxiYWNrVHlwZV9lIGMsIGRlZmlVc2VyRGF0YSB1ZCkgewotICBpbnQgc3RhdHVzOwotCi0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKChpbnQpdWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBzdGF0dXMgPSBkZWZ3VW5pdHMoMTAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXdMaW5lKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICByZXR1cm4gMDsKLX0KLQotLy8gaGlzdG9yeQotaW50IGhpc3RvcnlDQihkZWZ3Q2FsbGJhY2tUeXBlX2UgYywgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGludCBzdGF0dXM7Ci0KLSAgY2hlY2tUeXBlKGMpOwotICBpZiAoKGludCl1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIHN0YXR1cyA9IGRlZndIaXN0b3J5KCJDb3JyZWN0ZWQgU1RFUCBmb3IgUk9XXzkgYW5kIGFkZGVkIFJPV18xMCBvZiBTSVRFIENPUkUxIChkZWYpIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3SGlzdG9yeSgiUmVtb3ZlZCBOT05ERUZBVUxUUlVMRSBmcm9tIHRoZSBuZXQgWFgxMDAgKGRlZikiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndIaXN0b3J5KCJDaGFuZ2VkIHNvbWUgY2VsbCBvcmllbnRhdGlvbnMgKGRlZikiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXdMaW5lKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICByZXR1cm4gMDsKLX0KLSAKLS8vIFBST1BFUlRZREVGSU5JVElPTlMKLWludCBwcm9wZGVmQ0IoZGVmd0NhbGxiYWNrVHlwZV9lIGMsIGRlZmlVc2VyRGF0YSB1ZCkgewotICBpbnQgc3RhdHVzOwotCi0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKChpbnQpdWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBzdGF0dXMgPSBkZWZ3U3RhcnRQcm9wRGVmKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBkZWZ3QWRkQ29tbWVudCgiZGVmd1Byb3BEZWYgaXMgYnJva2VuIGludG8gMyByb3V0aW5lcywgZGVmd1N0cmluZ1Byb3BEZWYiKTsKLSAgZGVmd0FkZENvbW1lbnQoImRlZndJbnRQcm9wRGVmLCBhbmQgZGVmd1JlYWxQcm9wRGVmIik7Ci0gIHN0YXR1cyA9IGRlZndTdHJpbmdQcm9wRGVmKCJSRUdJT04iLCAic2N1bSIsIDAsIDAsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ludFByb3BEZWYoIlJFR0lPTiIsICJjZW50ZXIiLCAwLCAwLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndSZWFsUHJvcERlZigiUkVHSU9OIiwgImFyZWEiLCAwLCAwLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTdHJpbmdQcm9wRGVmKCJHUk9VUCIsICJnZ3JwIiwgMCwgMCwgTlVMTCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3SW50UHJvcERlZigiR1JPVVAiLCAic2l0ZSIsIDAsIDI1LCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndSZWFsUHJvcERlZigiR1JPVVAiLCAibWF4YXJlYSIsIDAsIDAsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1N0cmluZ1Byb3BEZWYoIkNPTVBPTkVOVCIsICJjYyIsIDAsIDAsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ludFByb3BEZWYoIkNPTVBPTkVOVCIsICJpbmRleCIsIDAsIDAsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1JlYWxQcm9wRGVmKCJDT01QT05FTlQiLCAic2l6ZSIsIDAsIDAsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ludFByb3BEZWYoIk5FVCIsICJhbHQiLCAwLCAwLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTdHJpbmdQcm9wRGVmKCJORVQiLCAibGFzdE5hbWUiLCAwLCAwLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndSZWFsUHJvcERlZigiTkVUIiwgImxlbmd0aCIsIDAsIDAsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1N0cmluZ1Byb3BEZWYoIlNQRUNJQUxORVQiLCAiY29udHlwZSIsIDAsIDAsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ludFByb3BEZWYoIlNQRUNJQUxORVQiLCAiaW5kIiwgMCwgMCwgTlVMTCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UmVhbFByb3BEZWYoIlNQRUNJQUxORVQiLCAibWF4bGVuZ3RoIiwgMCwgMCwgTlVMTCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3RyaW5nUHJvcERlZigiREVTSUdOIiwgInRpdGxlIiwgMCwgMCwgIkJ1ZmZlciIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ludFByb3BEZWYoIkRFU0lHTiIsICJwcmlvcml0eSIsIDAsIDAsIDE0KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndSZWFsUHJvcERlZigiREVTSUdOIiwgImhvd2JpZyIsIDAsIDAsIDE1LjE2KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndSZWFsUHJvcERlZigiUk9XIiwgIm1pbmxlbmd0aCIsIDEuMCwgMTAwLjAsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1N0cmluZ1Byb3BEZWYoIlJPVyIsICJmaXJzdE5hbWUiLCAwLCAwLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndJbnRQcm9wRGVmKCJST1ciLCAiaWR4IiwgMCwgMCwgTlVMTCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3SW50UHJvcERlZigiQ09NUE9ORU5UUElOIiwgImRwSWdub3JlVGVybSIsIDAsIDAsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1N0cmluZ1Byb3BEZWYoIkNPTVBPTkVOVFBJTiIsICJkcEJpdCIsIDAsIDAsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1JlYWxQcm9wRGVmKCJDT01QT05FTlRQSU4iLCAicmVhbFByb3BlcnR5IiwgMCwgMCwgTlVMTCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3RyaW5nUHJvcERlZigiTkVUIiwgIklHTk9SRU9QVElNSVpBVElPTiIsIDAsIDAsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1N0cmluZ1Byb3BEZWYoIlNQRUNJQUxORVQiLCAiSUdOT1JFT1BUSU1JWkFUSU9OIiwgMCwgMCwgTlVMTCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UmVhbFByb3BEZWYoIk5FVCIsICJGUkVRVUVOQ1kiLCAwLCAwLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndSZWFsUHJvcERlZigiU1BFQ0lBTE5FVCIsICJGUkVRVUVOQ1kiLCAwLCAwLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndFbmRQcm9wRGVmKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICByZXR1cm4gMDsKLX0KLSAKLS8vIERJRUFSRUEKLWludCBkaWVhcmVhQ0IoZGVmd0NhbGxiYWNrVHlwZV9lIGMsIGRlZmlVc2VyRGF0YSB1ZCkgewotICBpbnQgc3RhdHVzOwotCi0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKChpbnQpdWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBzdGF0dXMgPSBkZWZ3RGllQXJlYSgtMTkwMDAwLCAtMTIwMDAwLCAxOTAwMDAsIDcwMDAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXdMaW5lKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICByZXR1cm4gMDsKLX0KLSAKLS8vIFJPVwotaW50IHJvd0NCKGRlZndDYWxsYmFja1R5cGVfZSBjLCBkZWZpVXNlckRhdGEgdWQpIHsKLSAgaW50IHN0YXR1czsKLQotICBjaGVja1R5cGUoYyk7Ci0gIGlmICgoaW50KXVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgc3RhdHVzID0gZGVmd1JvdygiUk9XXzkiLCAiQ09SRSIsIC0xNzczMjAsIC0xMTEyNTAsIDUsIDkxMSwgMSwgMzYwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndSZWFsUHJvcGVydHkoIm1pbmxlbmd0aCIsIDUwLjUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1N0cmluZ1Byb3BlcnR5KCJmaXJzdE5hbWUiLCAiT25seSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ludFByb3BlcnR5KCJpZHgiLCAxKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndSb3coIlJPV18xMCIsICJDT1JFMSIsIC0xOTAwMCwgLTExMDAwLCA2LCAxLCAxMDAsIDAsIDYwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICByZXR1cm4gMDsKLX0KLSAKLS8vIFRSQUNLUwotaW50IHRyYWNrQ0IoZGVmd0NhbGxiYWNrVHlwZV9lIGMsIGRlZmlVc2VyRGF0YSB1ZCkgewotICBpbnQgc3RhdHVzOwotICBjb25zdCBjaGFyKiogbGF5ZXJzOwotCi0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKChpbnQpdWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBsYXllcnMgPSAoY29uc3QgY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKjEpOwotICBsYXllcnNbMF0gPSBzdHJkdXAoIk0xIik7Ci0gIHN0YXR1cyA9IGRlZndUcmFja3MoIlgiLCAzMDAwLCA0MCwgMTIwLCAxLCBsYXllcnMpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgZnJlZSgoY2hhciopbGF5ZXJzWzBdKTsKLSAgbGF5ZXJzWzBdID0gc3RyZHVwKCJNMiIpOwotICBzdGF0dXMgPSBkZWZ3VHJhY2tzKCJZIiwgNTAwMCwgMTAsIDIwLCAxLGxheWVycyk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBmcmVlKChjaGFyKilsYXllcnNbMF0pOwotICBmcmVlKChjaGFyKilsYXllcnMpOwotICBzdGF0dXMgPSBkZWZ3TmV3TGluZSgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgcmV0dXJuIDA7Ci19Ci0gCi0vLyBHQ0VMTEdSSUQKLWludCBnY2VsbGdyaWRDQihkZWZ3Q2FsbGJhY2tUeXBlX2UgYywgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGludCBzdGF0dXM7Ci0KLSAgY2hlY2tUeXBlKGMpOwotICBpZiAoKGludCl1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIHN0YXR1cyA9IGRlZndHY2VsbEdyaWQoIlgiLCAwLCAxMDAsIDYwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3R2NlbGxHcmlkKCJZIiwgMTAsIDEyMCwgNDAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXdMaW5lKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICByZXR1cm4gMDsKLX0KLSAKLS8vIFZJQVMKLWludCB2aWFDQihkZWZ3Q2FsbGJhY2tUeXBlX2UgYywgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGludCBzdGF0dXM7Ci0KLSAgY2hlY2tUeXBlKGMpOwotICBpZiAoKGludCl1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIHN0YXR1cyA9IGRlZndTdGFydFZpYXMoMik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3VmlhTmFtZSgiVklBX0FSUkFZIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3VmlhUmVjdCgiTTEiLCAtNDAsIC00MCwgNDAsIDQwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndWaWFSZWN0KCJWMSIsIC00MCwgLTQwLCA0MCwgNDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1ZpYVJlY3QoIk0yIiwgLTUwLCAtNTAsIDUwLCA1MCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3T25lVmlhRW5kKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3VmlhTmFtZSgiVklBX0FSUkFZMSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1ZpYVJlY3QoIk0xIiwgLTQwLCAtNDAsIDQwLCA0MCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3VmlhUmVjdCgiVjEiLCAtNDAsIC00MCwgNDAsIDQwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndWaWFSZWN0KCJNMiIsIC01MCwgLTUwLCA1MCwgNTApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd09uZVZpYUVuZCgpOwotIAotICBzdGF0dXMgPSBkZWZ3RW5kVmlhcygpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgcmV0dXJuIDA7Ci19Ci0gCi0vLyBSRUdJT05TCi1pbnQgcmVnaW9uQ0IoZGVmd0NhbGxiYWNrVHlwZV9lIGMsIGRlZmlVc2VyRGF0YSB1ZCkgewotICBpbnQgc3RhdHVzOwotCi0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKChpbnQpdWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBzdGF0dXMgPSBkZWZ3U3RhcnRSZWdpb25zKDIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1JlZ2lvbk5hbWUoInJlZ2lvbjEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndSZWdpb25Qb2ludHMoLTUwMCwgLTUwMCwgMzAwLCAxMDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1JlZ2lvblBvaW50cyg1MDAsIDUwMCwgMTAwMCwgMTAwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3RyaW5nUHJvcGVydHkoInNjdW0iLCAib24gdG9wIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3SW50UHJvcGVydHkoImNlbnRlciIsIDI1MCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3SW50UHJvcGVydHkoImFyZWEiLCA3MzAwMDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1JlZ2lvbk5hbWUoInJlZ2lvbjIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndSZWdpb25Qb2ludHMoNDAwMCwgMCwgNTAwMCwgMTAwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3RyaW5nUHJvcGVydHkoInNjdW0iLCAib24gYm90dG9tIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3RW5kUmVnaW9ucygpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgcmV0dXJuIDA7Ci19Ci0gCi0vLyBDT01QT05FTlRTCi1pbnQgY29tcG9uZW50Q0IoZGVmd0NhbGxiYWNrVHlwZV9lIGMsIGRlZmlVc2VyRGF0YSB1ZCkgewotICBpbnQgc3RhdHVzOwotICBjb25zdCBjaGFyKiogZm9yZWlnbnM7Ci0gIGludCAqZm9yZWlnblgsICpmb3JlaWduWSwgKmZvcmVpZ25PcmllbnQ7Ci0KLSAgY2hlY2tUeXBlKGMpOwotICBpZiAoKGludCl1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGZvcmVpZ25zID0gKGNvbnN0IGNoYXIqKiltYWxsb2Moc2l6ZW9mKGNoYXIqKSoxKTsKLSAgZm9yZWlnblggPSAoaW50KiltYWxsb2Moc2l6ZW9mKGludCkqMSk7Ci0gIGZvcmVpZ25ZID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKjEpOwotICBmb3JlaWduT3JpZW50ID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKjEpOwotICBzdGF0dXMgPSBkZWZ3U3RhcnRDb21wb25lbnRzKDExKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndDb21wb25lbnQoIlozOEEwMSIsICJERkYzIiwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAiUExBQ0VEIiwgMTg1OTIsIDU0MDAsIDYsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3Q29tcG9uZW50KCJaMzhBMDMiLCAiREZGMyIsIDAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgIlBMQUNFRCIsIDE2NTc2LCA0NTYwMCwgNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMLCAwLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndDb21wb25lbnQoIlozOEEwNSIsICJERkYzIiwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAiUExBQ0VEIiwgNTE1MjAsIDk2MDAsIDYsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3Q29tcG9uZW50KCJ8aTAiLCAiSU5WX0IiLCAwLCBOVUxMLCAiSU5WIiwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwLCAwLCAtMSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAicmVnaW9uMSIsIDAsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0NvbXBvbmVudCgifGkxIiwgIklOVl9CIiwgMCwgTlVMTCwgIklOViIsIE5VTEwsIE5VTEwsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgIlVOUExBQ0VEIiwgMTAwMCwgMTAwMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMLCAwLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndDb21wb25lbnQoImNlbGwxIiwgIkNITTZBIiwgMCwgTlVMTCwgTlVMTCwgImdlbmVyYXRvciIsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIlVTRVIiLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAiRklYRUQiLCAwLCAxMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAxMDAsIE5VTEwsIDAsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0NvbXBvbmVudCgiY2VsbDIiLCAiQ0hNNkEiLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICJORVRMSVNUIiwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgIkNPVkVSIiwgMTIwLAotICAgICAgICAgICAgICAgICAgICAgICAgIDEwLCA0LCAyLCBOVUxMLCAwLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGZvcmVpZ25zWzBdID0gc3RyZHVwKCJnZHMybmFtZSIpOwotICBmb3JlaWduWFswXSA9IC01MDA7Ci0gIGZvcmVpZ25ZWzBdID0gLTUwMDsKLSAgZm9yZWlnbk9yaWVudFswXSA9IDM7Ci0gIHN0YXR1cyA9IGRlZndDb21wb25lbnQoImNlbGwzIiwgIkNITTZBIiwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiVElNSU5HIiwgMSwgZm9yZWlnbnMsIGZvcmVpZ25YLCBmb3JlaWduWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduT3JpZW50LCAiUExBQ0VEIiwgMjQwLAotICAgICAgICAgICAgICAgICAgICAgICAgIDEwLCAwLCAwLCAicmVnaW9uMSIsIDAsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0NvbXBvbmVudCgiY2VsbDQiLCAiQ0hNM0EiLCAwLCBOVUxMLCAiQ0hNNkEiLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICJESVNUIiwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgIlBMQUNFRCIsIDM2MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAxMCwgMSwgMCwgInJlZ2lvbjIiLCAwLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTdHJpbmdQcm9wZXJ0eSgiY2MiLCAiVGhpcyBpcyB0aGUgY29weSBsaXN0Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3SW50UHJvcGVydHkoImluZGV4IiwgOSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UmVhbFByb3BlcnR5KCJzaXplIiwgNy44KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndDb21wb25lbnQoInNjYW5jZWxsMSIsICJDSEszQSIsIDAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgIlBMQUNFRCIsIDUwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAxMCwgNywgMCwgTlVMTCwgMCwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3Q29tcG9uZW50KCJzY2FuY2VsbDIiLCAiQ0hLM0EiLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsICJQTEFDRUQiLCA3MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgMTAsIDYsIDAsIE5VTEwsIDAsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0VuZENvbXBvbmVudHMoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGZyZWUoKGNoYXIqKWZvcmVpZ25zWzBdKTsKLSAgZnJlZSgoY2hhciopZm9yZWlnbnMpOwotICBmcmVlKChjaGFyKilmb3JlaWduWCk7Ci0gIGZyZWUoKGNoYXIqKWZvcmVpZ25ZKTsKLSAgZnJlZSgoY2hhciopZm9yZWlnbk9yaWVudCk7Ci0gIHJldHVybiAwOwotfQotIAotLy8gUElOUwotaW50IHBpbkNCKGRlZndDYWxsYmFja1R5cGVfZSBjLCBkZWZpVXNlckRhdGEgdWQpIHsKLSAgaW50IHN0YXR1czsKLQotICBjaGVja1R5cGUoYyk7Ci0gIGlmICgoaW50KXVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgc3RhdHVzID0gZGVmd1N0YXJ0UGlucyg2KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndQaW4oInNjYW5waW4iLCAiU0NBTiIsIDAsICJJTlBVVCIsIE5VTEwsIE5VTEwsIDAsIDAsIC0xLCBOVUxMLAotICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1BpbigicGluMSIsICJuZXQxIiwgMSwgTlVMTCwgIlBPV0VSIiwgTlVMTCwgMCwgMCwgLTEsICJNMSIsCi0gICAgICAgICAgICAgICAgICAgLTUwMDAsIC0xMDAsIC00OTUwLCAtOTApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1BpbigicGluMiIsICJuZXQyIiwgMCwgIklOUFVUIiwgIlNJR05BTCIsIE5VTEwsIDAsIDAsIC0xLCAiTTEiLAotICAgICAgICAgICAgICAgICAgIC01MDAwLCAwLCAtNDk1MCwgMTApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1BpbigiSU5CVVNbMV0iLCAifElOQlVTWzFdIiwgMCwgIklOUFVUIiwgIlNJR05BTCIsICJGSVhFRCIsCi0gICAgICAgICAgICAgICAgICAgNDUsIC0yMTYwLCAwLCAiTTIiLCAwLCAwLCAzMCwgMTM1KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndQaW4oIklOQlVTPDA+IiwgInxJTkJVUzwwPiIsIDAsICJJTlBVVCIsICJTSUdOQUwiLCAiUExBQ0VEIiwKLSAgICAgICAgICAgICAgICAgICAtNDUsIDIxNjAsIDEsICJNMiIsIDAsIDAsIDMwLCAxMzQpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1BpbigiT1VUQlVTPDE+IiwgInxPVVRCVVM8MT4iLCAwLCAiT1VUUFVUIiwgIlNJR05BTCIsICJDT1ZFUiIsCi0gICAgICAgICAgICAgICAgICAgMjE2MCwgNjQ1LCAyLCAiTTEiLCAwLCAwLCAzMCwgMTM1KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndFbmRQaW5zKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICByZXR1cm4gMDsKLX0KLSAKLS8vIFBJTlBST1BFUlRJRVMKLWludCBwaW5wcm9wQ0IoZGVmd0NhbGxiYWNrVHlwZV9lIGMsIGRlZmlVc2VyRGF0YSB1ZCkgewotICBpbnQgc3RhdHVzOwotCi0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKChpbnQpdWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBzdGF0dXMgPSBkZWZ3U3RhcnRQaW5Qcm9wZXJ0aWVzKDIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1BpblByb3BlcnR5KCJjZWxsMSIsICJQQjEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTdHJpbmdQcm9wZXJ0eSgiZHBCaXQiLCAiMSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1JlYWxQcm9wZXJ0eSgicmVhbFByb3BlcnR5IiwgMy40KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndQaW5Qcm9wZXJ0eSgiY2VsbDIiLCAidmRkIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3SW50UHJvcGVydHkoImRwSWdub3JlVGVybSIsIDIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0VuZFBpblByb3BlcnRpZXMoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHJldHVybiAwOwotfQotIAotLy8gU1BFQ0lBTE5FVFMKLWludCBzbmV0Q0IoZGVmd0NhbGxiYWNrVHlwZV9lIGMsIGRlZmlVc2VyRGF0YSB1ZCkgewotICBpbnQgc3RhdHVzOwotICBjb25zdCBjaGFyICoqY29vclgsICoqY29vclk7Ci0KLSAgY2hlY2tUeXBlKGMpOwotICBpZiAoKGludCl1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIHN0YXR1cyA9IGRlZndTdGFydFNwZWNpYWxOZXRzKDIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXQoIm5ldDEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0Q29ubmVjdGlvbigiY2VsbDEiLCAiVkREIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldENvbm5lY3Rpb24oImNlbGwyIiwgIlZERCIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRDb25uZWN0aW9uKCJjZWxsMyIsICJWREQiLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0Q29ubmVjdGlvbigiY2VsbDQiLCAiVkREIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFdpZHRoKCJNMSIsIDIwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFdpZHRoKCJNMiIsIDMwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFZvbHRhZ2UoMy4yKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0U3BhY2luZygiTTEiLCAyMDAsIDE5MCwgMjEwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0U291cmNlKCJUSU1JTkciKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0T3JpZ2luYWwoIlZERCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRVc2UoIlBPV0VSIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFdlaWdodCgzMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3RyaW5nUHJvcGVydHkoImNvbnR5cGUiLCAic3RhciIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ludFByb3BlcnR5KCJpbmQiLCAxKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndSZWFsUHJvcGVydHkoIm1heGxlbmd0aCIsIDEyLjEzKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0RW5kT25lTmV0KCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldCgiVlNTIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldENvbm5lY3Rpb24oImNlbGwxIiwgIkdORCIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRDb25uZWN0aW9uKCJjZWxsMiIsICJHTkQiLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0Q29ubmVjdGlvbigiY2VsbDMiLCAiR05EIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldENvbm5lY3Rpb24oImNlbGw0IiwgIkdORCIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRQYXRoU3RhcnQoIlJPVVRFRCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRQYXRoTGF5ZXIoIk0xIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFBhdGhXaWR0aCgyNTApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRQYXRoU2hhcGUoIklPV0lSRSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY29vclggPSAoY29uc3QgY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKjMpOwotICBjb29yWSA9IChjb25zdCBjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikqMyk7Ci0gIGNvb3JYWzBdID0gc3RyZHVwKCI1Iik7Ci0gIGNvb3JZWzBdID0gc3RyZHVwKCIxNSIpOwotICBjb29yWFsxXSA9IHN0cmR1cCgiMTI1Iik7Ci0gIGNvb3JZWzFdID0gc3RyZHVwKCIqIik7Ci0gIGNvb3JYWzJdID0gc3RyZHVwKCIyNDUiKTsKLSAgY29vcllbMl0gPSBzdHJkdXAoIioiKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRQYXRoUG9pbnQoMywgY29vclgsIGNvb3JZKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0UGF0aEVuZCgpOwotICBmcmVlKChjaGFyKiljb29yWFswXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JZWzBdKTsKLSAgZnJlZSgoY2hhciopY29vclhbMV0pOwotICBmcmVlKChjaGFyKiljb29yWVsxXSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFNoaWVsZFN0YXJ0KCJteV9uZXQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0U2hpZWxkTGF5ZXIoIk0yIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFNoaWVsZFdpZHRoKDkwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gc3RyZHVwKCIxNDEwMCIpOwotICBjb29yWVswXSA9IHN0cmR1cCgiMzQyNDQwIik7Ci0gIGNvb3JYWzFdID0gc3RyZHVwKCIxMzkyMCIpOwotICBjb29yWVsxXSA9IHN0cmR1cCgiKiIpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFNoaWVsZFBvaW50KDIsIGNvb3JYLCBjb29yWSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFNoaWVsZFZpYSgiTTJfVFVSTiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgZnJlZSgoY2hhciopY29vclhbMF0pOwotICBmcmVlKChjaGFyKiljb29yWVswXSk7Ci0gIGNvb3JYWzBdID0gc3RyZHVwKCIqIik7Ci0gIGNvb3JZWzBdID0gc3RyZHVwKCIyNjMyMDAiKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRTaGllbGRQb2ludCgxLCBjb29yWCwgY29vclkpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRTaGllbGRWaWEoIk0xX00yIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBmcmVlKChjaGFyKiljb29yWFswXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JZWzBdKTsKLSAgY29vclhbMF0gPSBzdHJkdXAoIjI0MDAiKTsKLSAgY29vcllbMF0gPSBzdHJkdXAoIioiKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRTaGllbGRQb2ludCgxLCBjb29yWCwgY29vclkpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRTaGllbGRFbmQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0U2hpZWxkU3RhcnQoIm15X25ldDEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0U2hpZWxkTGF5ZXIoIk0yIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFNoaWVsZFdpZHRoKDkwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JYWzBdKTsKLSAgZnJlZSgoY2hhciopY29vcllbMF0pOwotICBmcmVlKChjaGFyKiljb29yWFsxXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JZWzFdKTsKLSAgY29vclhbMF0gPSBzdHJkdXAoIjE0MTAwIik7Ci0gIGNvb3JZWzBdID0gc3RyZHVwKCIzNDI0NDAiKTsKLSAgY29vclhbMV0gPSBzdHJkdXAoIjEzOTIwIik7Ci0gIGNvb3JZWzFdID0gc3RyZHVwKCIqIik7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0U2hpZWxkUG9pbnQoMiwgY29vclgsIGNvb3JZKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTcGVjaWFsTmV0U2hpZWxkVmlhKCJNMl9UVVJOIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBmcmVlKChjaGFyKiljb29yWFswXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JZWzBdKTsKLSAgY29vclhbMF0gPSBzdHJkdXAoIioiKTsKLSAgY29vcllbMF0gPSBzdHJkdXAoIjI2MzIwMCIpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFNoaWVsZFBvaW50KDEsIGNvb3JYLCBjb29yWSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFNoaWVsZFZpYSgiTTFfTTIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JYWzBdKTsKLSAgZnJlZSgoY2hhciopY29vcllbMF0pOwotICBjb29yWFswXSA9IHN0cmR1cCgiMjQwMCIpOwotICBjb29yWVswXSA9IHN0cmR1cCgiKiIpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFNoaWVsZFBvaW50KDEsIGNvb3JYLCBjb29yWSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldFNoaWVsZEVuZCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRQYXR0ZXJuKCJTVEVJTkVSIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3BlY2lhbE5ldEVzdENhcCgxMDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd1NwZWNpYWxOZXRFbmRPbmVOZXQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JYWzBdKTsKLSAgZnJlZSgoY2hhciopY29vcllbMF0pOwotICBmcmVlKChjaGFyKiljb29yWFsxXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JZWzFdKTsKLSAgZnJlZSgoY2hhciopY29vclhbMl0pOwotICBmcmVlKChjaGFyKiljb29yWVsyXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JYKTsKLSAgZnJlZSgoY2hhciopY29vclkpOwotICBzdGF0dXMgPSBkZWZ3RW5kU3BlY2lhbE5ldHMoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHJldHVybiAwOwotfQotIAotLy8gTkVUUwotaW50IG5ldENCKGRlZndDYWxsYmFja1R5cGVfZSBjLCBkZWZpVXNlckRhdGEgdWQpIHsKLSAgaW50IHN0YXR1czsKLSAgY29uc3QgY2hhciAqKmNvb3JYLCAqKmNvb3JZOwotICBjb25zdCBjaGFyICoqY29vclZhbHVlOwotCi0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKChpbnQpdWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBzdGF0dXMgPSBkZWZ3U3RhcnROZXRzKDExKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXQoIm5ldDEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRDb25uZWN0aW9uKCJaMzhBMDEiLCAiUSIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldENvbm5lY3Rpb24oIlozOEEwMyIsICJRIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0Q29ubmVjdGlvbigiWjM4QTA1IiwgIlEiLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRFbmRPbmVOZXQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gCi0gIHN0YXR1cyA9IGRlZndOZXQoIm5ldDIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRDb25uZWN0aW9uKCJjZWxsMSIsICJQQjEiLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRDb25uZWN0aW9uKCJjZWxsMiIsICJQQjEiLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRDb25uZWN0aW9uKCJjZWxsMyIsICJQQjEiLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRFc3RDYXAoMjAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRXZWlnaHQoMik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0RW5kT25lTmV0KCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotIAotICBzdGF0dXMgPSBkZWZ3TmV0KCJuZXQzIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0Q29ubmVjdGlvbigiY2VsbDQiLCAiUEEzIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0Q29ubmVjdGlvbigiY2VsbDIiLCAiUDEwIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0WHRhbGsoMzApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldE9yaWdpbmFsKCJleHRyYV9jcmlzcHkiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRTb3VyY2UoIlVTRVIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRVc2UoIlNJR05BTCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ludFByb3BlcnR5KCJhbHQiLCAzNyk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3U3RyaW5nUHJvcGVydHkoImxhc3ROYW1lIiwgIlVua25vd24iKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndSZWFsUHJvcGVydHkoImxlbmd0aCIsIDEwLjExKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXR0ZXJuKCJCQUxBTkNFRCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldEVuZE9uZU5ldCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAKLSAgY29vclggPSAoY29uc3QgY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKjUpOwotICBjb29yWSA9IChjb25zdCBjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikqNSk7Ci0gIGNvb3JWYWx1ZSA9IChjb25zdCBjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikqNSk7Ci0gIHN0YXR1cyA9IGRlZndOZXQoIm15X25ldCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldENvbm5lY3Rpb24oIkkxIiwgIkEiLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRDb25uZWN0aW9uKCJCVUYiLCAiWiIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldE5vbmRlZmF1bHRSdWxlKCJSVUxFMSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFNoaWVsZG5ldCgiVlNTIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0U2hpZWxkbmV0KCJWREQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoU3RhcnQoIlJPVVRFRCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhMYXllcigiTTIiLCAwLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gc3RyZHVwKCIxNDAwMCIpOwotICBjb29yWVswXSA9IHN0cmR1cCgiMzQxNDQwIik7Ci0gIGNvb3JWYWx1ZVswXSA9IE5VTEw7Ci0gIGNvb3JYWzFdID0gc3RyZHVwKCI5NjAwIik7Ci0gIGNvb3JZWzFdID0gc3RyZHVwKCIqIik7Ci0gIGNvb3JWYWx1ZVsxXSA9IE5VTEw7Ci0gIGNvb3JYWzJdID0gc3RyZHVwKCIqIik7Ci0gIGNvb3JZWzJdID0gc3RyZHVwKCIyODI0MDAiKTsKLSAgY29vclZhbHVlWzJdID0gTlVMTDsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhQb2ludCgzLCBjb29yWCwgY29vclksIGNvb3JWYWx1ZSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBmcmVlKChjaGFyKiljb29yWFswXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JZWzBdKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhWaWEoIm5kMVZJQTEyIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjb29yWFswXSA9IHN0cmR1cCgiMjQwMCIpOwotICBjb29yWVswXSA9IHN0cmR1cCgiKiIpOwotICBjb29yVmFsdWVbMF0gPSBOVUxMOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFBvaW50KDEsIGNvb3JYLCBjb29yWSwgY29vclZhbHVlKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JYWzBdKTsKLSAgZnJlZSgoY2hhciopY29vcllbMF0pOwotICBmcmVlKChjaGFyKiljb29yWFsxXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JZWzFdKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhTdGFydCgiTkVXIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aExheWVyKCJNMSIsIDEsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY29vclhbMF0gPSBzdHJkdXAoIjI0MDAiKTsKLSAgY29vcllbMF0gPSBzdHJkdXAoIjI4MjQwMCIpOwotICBjb29yVmFsdWVbMF0gPSBOVUxMOwotICBjb29yWFsxXSA9IHN0cmR1cCgiMjQwIik7Ci0gIGNvb3JZWzFdID0gc3RyZHVwKCIqIik7Ci0gIGNvb3JWYWx1ZVsxXSA9IE5VTEw7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoUG9pbnQoMiwgY29vclgsIGNvb3JZLCBjb29yVmFsdWUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgZnJlZSgoY2hhciopY29vclhbMF0pOwotICBmcmVlKChjaGFyKiljb29yWVswXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JYWzFdKTsKLSAgZnJlZSgoY2hhciopY29vcllbMV0pOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aEVuZCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldE5vc2hpZWxkU3RhcnQoIk0yIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjb29yWFswXSA9IHN0cmR1cCgiMTQxMDAiKTsKLSAgY29vcllbMF0gPSBzdHJkdXAoIjM0MTQ0MCIpOwotICBjb29yWFsxXSA9IHN0cmR1cCgiMTQwMDAiKTsKLSAgY29vcllbMV0gPSBzdHJkdXAoIioiKTsKLSAgc3RhdHVzID0gZGVmd05ldE5vc2hpZWxkUG9pbnQoMiwgY29vclgsIGNvb3JZKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXROb3NoaWVsZEVuZCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldEVuZE9uZU5ldCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAKLSAgc3RhdHVzID0gZGVmd05ldCgifElOQlVTWzFdIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0Q29ubmVjdGlvbigifGkxIiwgIkEiLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRFbmRPbmVOZXQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gCi0gIHN0YXR1cyA9IGRlZndOZXQoInxJTkJVUzwwPiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldENvbm5lY3Rpb24oInxpMCIsICJBIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0RW5kT25lTmV0KCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotIAotICBzdGF0dXMgPSBkZWZ3TmV0KCJ8T1VUQlVTPDE+Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0Q29ubmVjdGlvbigifGkwIiwgIloiLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRFbmRPbmVOZXQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gCi0gIHN0YXR1cyA9IGRlZndOZXQoIk1VU1RKT0lOIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0Q29ubmVjdGlvbigiY2VsbDQiLCAiUEExIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0RW5kT25lTmV0KCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotIAotICBzdGF0dXMgPSBkZWZ3TmV0KCJYWDEwMCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldENvbm5lY3Rpb24oIlozOEEwNSIsICJHIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0Q29ubmVjdGlvbigiWjM4QTAzIiwgIkciLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRDb25uZWN0aW9uKCJaMzhBMDEiLCAiRyIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFZwaW4oIlZfU1VCM19YWDEwMCIsIE5VTEwsIC0zMzMsIC0zMzMsIDMzMywgMzMzLCAiUExBQ0VEIiwKLSAgICAgICAgICAgICAgICAgICAgICAgMTg5NTYwLCAyNzMwMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0VnBpbigiVl9TVUIyX1hYMTAwIiwgTlVMTCwgLTMzMywgLTMzMywgMzMzLCAzMzMsICJQTEFDRUQiLAotICAgICAgICAgICAgICAgICAgICAgICAxNjk0MDAsIDY0NTAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRWcGluKCJWX1NVQjFfWFgxMDAiLCBOVUxMLCAtMzMzLCAtMzMzLCAzMzMsIDMzMywgIlBMQUNFRCIsCi0gICAgICAgICAgICAgICAgICAgICAgIDU1MTYwLCAzMTUwMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0U3VibmV0U3RhcnQoIlNVQjFfWFgxMDAiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRTdWJuZXRQaW4oIlozOEEwNSIsICJHIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0U3VibmV0UGluKCJWUElOIiwgIlZfU1VCMV9YWDEwMCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhTdGFydCgiUk9VVEVEIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aExheWVyKCJNMSIsIDAsICJSVUxFMSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY29vclhbMF0gPSBzdHJkdXAoIjU0MDQwIik7Ci0gIGNvb3JZWzBdID0gc3RyZHVwKCIzMDMwMCIpOwotICBjb29yVmFsdWVbMF0gPSBzdHJkdXAoIjAiKTsKLSAgY29vclhbMV0gPSBzdHJkdXAoIioiKTsKLSAgY29vcllbMV0gPSBzdHJkdXAoIjMwOTAwIik7Ci0gIGNvb3JWYWx1ZVsxXSA9IE5VTEw7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoUG9pbnQoMiwgY29vclgsIGNvb3JZLCBjb29yVmFsdWUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgZnJlZSgoY2hhciopY29vclhbMF0pOwotICBmcmVlKChjaGFyKiljb29yWVswXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JWYWx1ZVswXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JYWzFdKTsKLSAgZnJlZSgoY2hhciopY29vcllbMV0pOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFZpYSgibmQxVklBMTIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gc3RyZHVwKCIqIik7Ci0gIGNvb3JZWzBdID0gc3RyZHVwKCIqIik7Ci0gIGNvb3JWYWx1ZVswXSA9IHN0cmR1cCgiMCIpOwotICBjb29yWFsxXSA9IHN0cmR1cCgiNTYyODAiKTsKLSAgY29vcllbMV0gPSBzdHJkdXAoIioiKTsKLSAgY29vclZhbHVlWzFdID0gTlVMTDsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhQb2ludCgyLCBjb29yWCwgY29vclksIGNvb3JWYWx1ZSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBmcmVlKChjaGFyKiljb29yWFswXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JZWzBdKTsKLSAgZnJlZSgoY2hhciopY29vclZhbHVlWzBdKTsKLSAgZnJlZSgoY2hhciopY29vclhbMV0pOwotICBmcmVlKChjaGFyKiljb29yWVsxXSk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoVmlhKCJuZDFWSUEyMyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY29vclhbMF0gPSBzdHJkdXAoIioiKTsKLSAgY29vcllbMF0gPSBzdHJkdXAoIjMxNTAwIik7Ci0gIGNvb3JWYWx1ZVswXSA9IE5VTEw7Ci0gIGNvb3JYWzFdID0gc3RyZHVwKCI1NTE2MCIpOwotICBjb29yWVsxXSA9IHN0cmR1cCgiKiIpOwotICBjb29yVmFsdWVbMV0gPSBOVUxMOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFBvaW50KDIsIGNvb3JYLCBjb29yWSwgY29vclZhbHVlKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JYWzBdKTsKLSAgZnJlZSgoY2hhciopY29vcllbMF0pOwotICBmcmVlKChjaGFyKiljb29yWFsxXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JZWzFdKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhFbmQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRTdWJuZXRFbmQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRTdWJuZXRTdGFydCgiU1VCMl9YWDEwMCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFN1Ym5ldFBpbigiWjM4QTAzIiwgIkciKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRTdWJuZXRQaW4oIlZQSU4iLCAiVl9TVUIyX1hYMTAwIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFN0YXJ0KCJST1VURUQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoTGF5ZXIoIk0xIiwgMCwgTlVMTCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjb29yWFswXSA9IHN0cmR1cCgiMTY4MjgwIik7Ci0gIGNvb3JZWzBdID0gc3RyZHVwKCI2MzMwMCIpOwotICBjb29yVmFsdWVbMF0gPSBzdHJkdXAoIjciKTsKLSAgY29vclhbMV0gPSBzdHJkdXAoIioiKTsKLSAgY29vcllbMV0gPSBzdHJkdXAoIjY0NTAwIik7Ci0gIGNvb3JWYWx1ZVsxXSA9IE5VTEw7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoUG9pbnQoMiwgY29vclgsIGNvb3JZLCBjb29yVmFsdWUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgZnJlZSgoY2hhciopY29vclhbMF0pOwotICBmcmVlKChjaGFyKiljb29yWVswXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JWYWx1ZVswXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JYWzFdKTsKLSAgZnJlZSgoY2hhciopY29vcllbMV0pOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFZpYSgiTTFfTTIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gc3RyZHVwKCIxNjk0MDAiKTsKLSAgY29vcllbMF0gPSBzdHJkdXAoIioiKTsKLSAgY29vclZhbHVlWzBdID0gc3RyZHVwKCI4Iik7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoUG9pbnQoMSwgY29vclgsIGNvb3JZLCBjb29yVmFsdWUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhWaWEoIk0yX00zIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBmcmVlKChjaGFyKiljb29yWFswXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JZWzBdKTsKLSAgZnJlZSgoY2hhciopY29vclhbMV0pOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aEVuZCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFN1Ym5ldEVuZCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFN1Ym5ldFN0YXJ0KCJTVUIzX1hYMTAwIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0U3VibmV0UGluKCJaMzhBMDEiLCAiRyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFN1Ym5ldFBpbigiVlBJTiIsICJWX1NVQjNfWFgxMDAiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoU3RhcnQoIlJPVVRFRCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhMYXllcigiTTEiLCAwLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gc3RyZHVwKCIxODg0MDAiKTsKLSAgY29vcllbMF0gPSBzdHJkdXAoIjI2MTAwIik7Ci0gIGNvb3JWYWx1ZVswXSA9IHN0cmR1cCgiMCIpOwotICBjb29yWFsxXSA9IHN0cmR1cCgiKiIpOwotICBjb29yWVsxXSA9IHN0cmR1cCgiMjczMDAiKTsKLSAgY29vclZhbHVlWzFdID0gc3RyZHVwKCIwIik7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoUG9pbnQoMiwgY29vclgsIGNvb3JZLCBjb29yVmFsdWUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgZnJlZSgoY2hhciopY29vclhbMF0pOwotICBmcmVlKChjaGFyKiljb29yWVswXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JWYWx1ZVswXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JYWzFdKTsKLSAgZnJlZSgoY2hhciopY29vcllbMV0pOwotICBmcmVlKChjaGFyKiljb29yVmFsdWVbMV0pOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFZpYSgiTTFfTTIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gc3RyZHVwKCIxODk1NjAiKTsKLSAgY29vcllbMF0gPSBzdHJkdXAoIioiKTsKLSAgY29vclZhbHVlWzBdID0gc3RyZHVwKCIwIik7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoUG9pbnQoMSwgY29vclgsIGNvb3JZLCBjb29yVmFsdWUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgZnJlZSgoY2hhciopY29vclhbMF0pOwotICBmcmVlKChjaGFyKiljb29yWVswXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JWYWx1ZVswXSk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoVmlhKCJNMV9NMiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhFbmQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRTdWJuZXRFbmQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRTdWJuZXRTdGFydCgiU1VCMF9YWDEwMCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFN1Ym5ldFBpbigiVlBJTiIsICJWX1NVQjFfWFgxMDAiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRTdWJuZXRQaW4oIlZQSU4iLCAiVl9TVUIyX1hYMTAwIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0U3VibmV0UGluKCJWUElOIiwgIlZfU1VCM19YWDEwMCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldE5vbmRlZmF1bHRSdWxlKCJSVUxFMSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhTdGFydCgiUk9VVEVEIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aExheWVyKCJNMyIsIDAsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY29vclhbMF0gPSBzdHJkdXAoIjI2OTQwMCIpOwotICBjb29yWVswXSA9IHN0cmR1cCgiNjQ1MDAiKTsKLSAgY29vclZhbHVlWzBdID0gc3RyZHVwKCIwIik7Ci0gIGNvb3JYWzFdID0gc3RyZHVwKCIqIik7Ci0gIGNvb3JZWzFdID0gc3RyZHVwKCI1NDkwMCIpOwotICBjb29yVmFsdWVbMV0gPSBOVUxMOwotICBjb29yWFsyXSA9IHN0cmR1cCgiMTcwNTIwIik7Ci0gIGNvb3JZWzJdID0gc3RyZHVwKCIqIik7Ci0gIGNvb3JWYWx1ZVsyXSA9IE5VTEw7Ci0gIGNvb3JYWzNdID0gc3RyZHVwKCIqIik7Ci0gIGNvb3JZWzNdID0gc3RyZHVwKCIzNzUwMCIpOwotICBjb29yVmFsdWVbM10gPSBOVUxMOwotICBjb29yWFs0XSA9IHN0cmR1cCgiKiIpOwotICBjb29yWVs0XSA9IHN0cmR1cCgiMzAzMDAiKTsKLSAgY29vclZhbHVlWzRdID0gTlVMTDsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhQb2ludCg1LCBjb29yWCwgY29vclksIGNvb3JWYWx1ZSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBmcmVlKChjaGFyKiljb29yWFswXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JZWzBdKTsKLSAgZnJlZSgoY2hhciopY29vclZhbHVlWzBdKTsKLSAgZnJlZSgoY2hhciopY29vclhbMV0pOwotICBmcmVlKChjaGFyKiljb29yWVsxXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JYWzJdKTsKLSAgZnJlZSgoY2hhciopY29vcllbMl0pOwotICBmcmVlKChjaGFyKiljb29yWFszXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JZWzNdKTsKLSAgZnJlZSgoY2hhciopY29vclhbNF0pOwotICBmcmVlKChjaGFyKiljb29yWVs0XSk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoVmlhKCJuZDFWSUEyMyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY29vclhbMF0gPSBzdHJkdXAoIjE3MTA4MCIpOwotICBjb29yWVswXSA9IHN0cmR1cCgiKiIpOwotICBjb29yVmFsdWVbMF0gPSBOVUxMOwotICBjb29yWFsxXSA9IHN0cmR1cCgiMTc0NDAiKTsKLSAgY29vcllbMV0gPSBzdHJkdXAoIjAiKTsKLSAgY29vclZhbHVlWzFdID0gc3RyZHVwKCIwIik7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoUG9pbnQoMiwgY29vclgsIGNvb3JZLCBjb29yVmFsdWUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgZnJlZSgoY2hhciopY29vclhbMF0pOwotICBmcmVlKChjaGFyKiljb29yWVswXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JYWzFdKTsKLSAgZnJlZSgoY2hhciopY29vcllbMV0pOwotICBmcmVlKChjaGFyKiljb29yVmFsdWVbMV0pOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFZpYSgibmQxVklBMjMiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gc3RyZHVwKCIqIik7Ci0gIGNvb3JZWzBdID0gc3RyZHVwKCIqIik7Ci0gIGNvb3JWYWx1ZVswXSA9IE5VTEw7Ci0gIGNvb3JYWzFdID0gc3RyZHVwKCIqIik7Ci0gIGNvb3JZWzFdID0gc3RyZHVwKCIyNjcwMCIpOwotICBjb29yVmFsdWVbMV0gPSBzdHJkdXAoIjgiKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhQb2ludCgyLCBjb29yWCwgY29vclksIGNvb3JWYWx1ZSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBmcmVlKChjaGFyKiljb29yWFswXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JZWzBdKTsKLSAgZnJlZSgoY2hhciopY29vclhbMV0pOwotICBmcmVlKChjaGFyKiljb29yWVsxXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JWYWx1ZVsxXSk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoVmlhKCJuZDFWSUEyMyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY29vclhbMF0gPSBzdHJkdXAoIjE3NzgwMCIpOwotICBjb29yWVswXSA9IHN0cmR1cCgiKiIpOwotICBjb29yVmFsdWVbMF0gPSBOVUxMOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFBvaW50KDEsIGNvb3JYLCBjb29yWSwgY29vclZhbHVlKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JYWzBdKTsKLSAgZnJlZSgoY2hhciopY29vcllbMF0pOwotICBmcmVlKChjaGFyKiljb29yVmFsdWVbMV0pOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFZpYSgibmQxVklBMjMiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gc3RyZHVwKCIqIik7Ci0gIGNvb3JZWzBdID0gc3RyZHVwKCIqIik7Ci0gIGNvb3JWYWx1ZVswXSA9IHN0cmR1cCgiOCIpOwotICBjb29yWFsxXSA9IHN0cmR1cCgiKiIpOwotICBjb29yWVsxXSA9IHN0cmR1cCgiMzAzMDAiKTsKLSAgY29vclZhbHVlWzFdID0gc3RyZHVwKCI4Iik7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoUG9pbnQoMiwgY29vclgsIGNvb3JZLCBjb29yVmFsdWUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhWaWEoIm5kMVZJQTIzIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBmcmVlKChjaGFyKiljb29yWFswXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JZWzBdKTsKLSAgZnJlZSgoY2hhciopY29vclZhbHVlWzBdKTsKLSAgZnJlZSgoY2hhciopY29vclhbMV0pOwotICBmcmVlKChjaGFyKiljb29yWVsxXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JWYWx1ZVsxXSk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoVmlhKCJuZDFWSUEyMyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY29vclhbMF0gPSBzdHJkdXAoIjE4OTU2MCIpOwotICBjb29yWVswXSA9IHN0cmR1cCgiKiIpOwotICBjb29yVmFsdWVbMF0gPSBzdHJkdXAoIjgiKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhQb2ludCgxLCBjb29yWCwgY29vclksIGNvb3JWYWx1ZSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBmcmVlKChjaGFyKiljb29yWFswXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JZWzBdKTsKLSAgZnJlZSgoY2hhciopY29vclZhbHVlWzFdKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhWaWEoIm5kMVZJQTEyIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjb29yWFswXSA9IHN0cmR1cCgiKiIpOwotICBjb29yWVswXSA9IHN0cmR1cCgiMjczMDAiKTsKLSAgY29vclZhbHVlWzBdID0gc3RyZHVwKCIwIik7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoUG9pbnQoMSwgY29vclgsIGNvb3JZLCBjb29yVmFsdWUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgZnJlZSgoY2hhciopY29vclhbMF0pOwotICBmcmVlKChjaGFyKiljb29yWVswXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JWYWx1ZVswXSk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoU3RhcnQoIk5FVyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhMYXllcigiTTMiLCAxLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gc3RyZHVwKCI1NTE2MCIpOwotICBjb29yWVswXSA9IHN0cmR1cCgiMzE1MDAiKTsKLSAgY29vclZhbHVlWzBdID0gc3RyZHVwKCI4Iik7Ci0gIGNvb3JYWzFdID0gc3RyZHVwKCIqIik7Ci0gIGNvb3JZWzFdID0gc3RyZHVwKCIzNDUwMCIpOwotICBjb29yVmFsdWVbMV0gPSBzdHJkdXAoIjAiKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhQb2ludCgyLCBjb29yWCwgY29vclksIGNvb3JWYWx1ZSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBmcmVlKChjaGFyKiljb29yWFswXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JZWzBdKTsKLSAgZnJlZSgoY2hhciopY29vclZhbHVlWzBdKTsKLSAgZnJlZSgoY2hhciopY29vclhbMV0pOwotICBmcmVlKChjaGFyKiljb29yWVsxXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JWYWx1ZVsxXSk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoVmlhKCJNMl9NMyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY29vclhbMF0gPSBzdHJkdXAoIjE0OTgwMCIpOwotICBjb29yWVswXSA9IHN0cmR1cCgiKiIpOwotICBjb29yVmFsdWVbMF0gPSBzdHJkdXAoIjgiKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhQb2ludCgxLCBjb29yWCwgY29vclksIGNvb3JWYWx1ZSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBmcmVlKChjaGFyKiljb29yWFswXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JZWzBdKTsKLSAgZnJlZSgoY2hhciopY29vclZhbHVlWzBdKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhWaWEoIk0yX00zIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjb29yWFswXSA9IHN0cmR1cCgiKiIpOwotICBjb29yWVswXSA9IHN0cmR1cCgiMzU3MDAiKTsKLSAgY29vclZhbHVlWzBdID0gTlVMTDsKLSAgY29vclhbMV0gPSBzdHJkdXAoIioiKTsKLSAgY29vcllbMV0gPSBzdHJkdXAoIjM3NTAwIik7Ci0gIGNvb3JWYWx1ZVsxXSA9IE5VTEw7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoUG9pbnQoMiwgY29vclgsIGNvb3JZLCBjb29yVmFsdWUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgZnJlZSgoY2hhciopY29vclhbMF0pOwotICBmcmVlKChjaGFyKiljb29yWVswXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JYWzFdKTsKLSAgZnJlZSgoY2hhciopY29vcllbMV0pOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFZpYSgiTTJfTTMiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gc3RyZHVwKCIqIik7Ci0gIGNvb3JZWzBdID0gc3RyZHVwKCIqIik7Ci0gIGNvb3JWYWx1ZVswXSA9IHN0cmR1cCgiOCIpOzsKLSAgY29vclhbMV0gPSBzdHJkdXAoIjE3MDUyMCIpOwotICBjb29yWVsxXSA9IHN0cmR1cCgiKiIpOwotICBjb29yVmFsdWVbMV0gPSBzdHJkdXAoIjAiKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhQb2ludCgyLCBjb29yWCwgY29vclksIGNvb3JWYWx1ZSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBmcmVlKChjaGFyKiljb29yWFswXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JZWzBdKTsKLSAgZnJlZSgoY2hhciopY29vclZhbHVlWzBdKTsKLSAgZnJlZSgoY2hhciopY29vclhbMV0pOwotICBmcmVlKChjaGFyKiljb29yWVsxXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JWYWx1ZVsxXSk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoVmlhKCJNMl9NMyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhFbmQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRFbmRPbmVOZXQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gCi0gIHN0YXR1cyA9IGRlZndOZXQoIlNDQU4iKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRDb25uZWN0aW9uKCJzY2FuY2VsbDEiLCAiUDEwIiwgMSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0Q29ubmVjdGlvbigic2NhbmNlbGwyIiwgIlBBMCIsIDEpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFNvdXJjZSgiVEVTVCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldEVuZE9uZU5ldCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAKLSAgc3RhdHVzID0gZGVmd05ldCgidGVzdEJ1ZyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldENvbm5lY3Rpb24oIlozOEEwNSIsICJHIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0Q29ubmVjdGlvbigiWjM4QTAzIiwgIkciLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRDb25uZWN0aW9uKCJaMzhBMDEiLCAiRyIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhTdGFydCgiUk9VVEVEIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aExheWVyKCJNMSIsIDAsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY29vclhbMF0gPSBzdHJkdXAoIjEyODgyMTAiKTsKLSAgY29vcllbMF0gPSBzdHJkdXAoIjU4MDkzMCIpOwotICBjb29yVmFsdWVbMF0gPSBOVUxMOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFBvaW50KDEsIGNvb3JYLCBjb29yWSwgY29vclZhbHVlKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JYWzBdKTsKLSAgZnJlZSgoY2hhciopY29vcllbMF0pOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFZpYSgiR0VUSDFXMVcxIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjb29yWFswXSA9IHN0cmR1cCgiKiIpOwotICBjb29yWVswXSA9IHN0cmR1cCgiNTgyODIwIik7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoUG9pbnQoMSwgY29vclgsIGNvb3JZLCBjb29yVmFsdWUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgZnJlZSgoY2hhciopY29vclhbMF0pOwotICBmcmVlKChjaGFyKiljb29yWVswXSk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoVmlhKCJHRVRIMlcxVzEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoU3RhcnQoIk5FVyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhMYXllcigiTTMiLCAwLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gc3RyZHVwKCIxMTQxMzUwIik7Ci0gIGNvb3JZWzBdID0gc3RyZHVwKCI1ODI4MjAiKTsKLSAgY29vclZhbHVlWzBdID0gTlVMTDsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhQb2ludCgxLCBjb29yWCwgY29vclksIGNvb3JWYWx1ZSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBmcmVlKChjaGFyKiljb29yWFswXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JZWzBdKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhWaWEoIkdFVEgyVzFXMSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY29vclhbMF0gPSBzdHJkdXAoIioiKTsKLSAgY29vcllbMF0gPSBzdHJkdXAoIjU4MDkzMCIpOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFBvaW50KDEsIGNvb3JYLCBjb29yWSwgY29vclZhbHVlKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JYWzBdKTsKLSAgZnJlZSgoY2hhciopY29vcllbMF0pOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFZpYSgiR0VUSDFXMVcxIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFN0YXJ0KCJORVciKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoTGF5ZXIoIk0xIiwgMCwgTlVMTCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjb29yWFswXSA9IHN0cmR1cCgiMTI3ODQxMCIpOwotICBjb29yWVswXSA9IHN0cmR1cCgiMjc1MTcwIik7Ci0gIGNvb3JWYWx1ZVswXSA9IE5VTEw7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoUG9pbnQoMSwgY29vclgsIGNvb3JZLCBjb29yVmFsdWUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgZnJlZSgoY2hhciopY29vclhbMF0pOwotICBmcmVlKChjaGFyKiljb29yWVswXSk7Ci0gIHN0YXR1cyA9IGRlZndOZXRQYXRoU3RhcnQoIk5FVyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhMYXllcigiTTEiLCAwLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGNvb3JYWzBdID0gc3RyZHVwKCIxMTQxMjEwIik7Ci0gIGNvb3JZWzBdID0gc3RyZHVwKCIyNzEyNTAiKTsKLSAgY29vclZhbHVlWzBdID0gTlVMTDsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhQb2ludCgxLCBjb29yWCwgY29vclksIGNvb3JWYWx1ZSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBmcmVlKChjaGFyKiljb29yWFswXSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JZWzBdKTsKLSAgc3RhdHVzID0gZGVmd05ldFBhdGhWaWEoIkdFVEgxVzFXMSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY29vclhbMF0gPSBzdHJkdXAoIioiKTsKLSAgY29vcllbMF0gPSBzdHJkdXAoIjI3MTQ2MCIpOwotICBjb29yVmFsdWVbMF0gPSBOVUxMOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFBvaW50KDEsIGNvb3JYLCBjb29yWSwgY29vclZhbHVlKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JYWzBdKTsKLSAgZnJlZSgoY2hhciopY29vcllbMF0pOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFZpYSgiR0VUSDJXMVcxIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjb29yWFswXSA9IHN0cmR1cCgiMTE0MjgyMCIpOwotICBjb29yWVswXSA9IHN0cmR1cCgiKiIpOwotICBjb29yVmFsdWVbMF0gPSBOVUxMOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFBvaW50KDEsIGNvb3JYLCBjb29yWSwgY29vclZhbHVlKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JYWzBdKTsKLSAgZnJlZSgoY2hhciopY29vcllbMF0pOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aFZpYSgiR0VUSDNXMVcxIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3TmV0UGF0aEVuZCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd05ldEVuZE9uZU5ldCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgZnJlZSgoY2hhciopY29vclgpOwotICBmcmVlKChjaGFyKiljb29yWSk7Ci0gIGZyZWUoKGNoYXIqKWNvb3JWYWx1ZSk7Ci0gIHN0YXR1cyA9IGRlZndFbmROZXRzKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICByZXR1cm4gMDsKLX0KLQotLy8gR1JPVVBTCi1pbnQgZ3JvdXBDQihkZWZ3Q2FsbGJhY2tUeXBlX2UgYywgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGludCBzdGF0dXM7Ci0gIGNvbnN0IGNoYXIgKipncm91cEV4cHI7Ci0KLSAgY2hlY2tUeXBlKGMpOwotICBpZiAoKGludCl1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGdyb3VwRXhwciA9IChjb25zdCBjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikqMik7Ci0gIHN0YXR1cyA9IGRlZndTdGFydEdyb3VwcygyKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGdyb3VwRXhwclswXSA9IHN0cmR1cCgiY2VsbDIiKTsKLSAgZ3JvdXBFeHByWzFdID0gc3RyZHVwKCJjZWxsMyIpOwotICBzdGF0dXMgPSBkZWZ3R3JvdXAoImdyb3VwMSIsIDIsIGdyb3VwRXhwcik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBmcmVlKChjaGFyKilncm91cEV4cHJbMF0pOwotICBmcmVlKChjaGFyKilncm91cEV4cHJbMV0pOwotICBzdGF0dXMgPSBkZWZ3R3JvdXBSZWdpb24oMCwgMCwgMCwgMCwgInJlZ2lvbjEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTdHJpbmdQcm9wZXJ0eSgiZ2dycCIsICJ4eCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0ludFByb3BlcnR5KCJzaWRlIiwgMik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBkZWZ3UmVhbFByb3BlcnR5KCJtYXhhcmVhIiwgNS42KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGdyb3VwRXhwclswXSA9IHN0cmR1cCgiY2VsbDEiKTsKLSAgc3RhdHVzID0gZGVmd0dyb3VwKCJncm91cDIiLCAxLCBncm91cEV4cHIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgZnJlZSgoY2hhciopZ3JvdXBFeHByWzBdKTsKLSAgc3RhdHVzID0gZGVmd0dyb3VwUmVnaW9uKDAsIDEwLCAxMDAwLCAxMDEwLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTdHJpbmdQcm9wZXJ0eSgiZ2dycCIsICJhZnRlciB0aGUgZmFsbCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0dyb3VwU29mdCgiTUFYSEFMRlBFUklNRVRFUiIsIDQwMDAsICJNQVhYIiwgMTAwMDAsIE5VTEwsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0VuZEdyb3VwcygpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgZnJlZSgoY2hhciopZ3JvdXBFeHByKTsKLSAgc3RhdHVzID0gZGVmd05ld0xpbmUoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHJldHVybiAwOwotfQotIAotLy8gQkVHSU5FWFQKLWludCBleHRlbnNpb25DQihkZWZ3Q2FsbGJhY2tUeXBlX2UgYywgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGludCBzdGF0dXM7Ci0KLSAgY2hlY2tUeXBlKGMpOwotICBpZiAoKGludCl1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIHN0YXR1cyA9IGRlZndTdGFydEJlZ2luZXh0KCJ0YWciKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndCZWdpbmV4dENyZWF0b3IoIkNBREVOQ0UiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndCZWdpbmV4dERhdGUoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndCZWdpbmV4dFN5bnRheCgiT1RURVIiLCAiZnVycnkiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndTdHJpbmdQcm9wZXJ0eSgiYXJyZyIsICJsYXRlciIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gZGVmd0JlZ2luZXh0U3ludGF4KCJTRUFMIiwgImNvdXNpbiB0byBXQUxSVVMiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGRlZndFbmRCZWdpbmV4dCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgcmV0dXJuIDA7Ci19Ci0gCi1zdGF0aWMgaW50IGRlc2lnbmVuZENCKGRlZndDYWxsYmFja1R5cGVfZSBjLCBkZWZpVXNlckRhdGEgdWQpIHsKLSAgaW50IHN0YXR1czsKLQotICBjaGVja1R5cGUoYyk7Ci0gIGlmICgoaW50KXVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgc3RhdHVzID0gZGVmd0VuZCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLW1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gIGNoYXIqIG91dGZpbGU7Ci0gIGludCAgIHN0YXR1czsgICAgLy8gcmV0dXJuIGNvZGUsIGlmIG5vbmUgMCBtZWFucyBlcnJvcgotICBpbnQgICByZXM7Ci0KLSAgLy8gYXNzaWduIHRoZSBkZWZhdWx0Ci0gIHN0cmNweShkZWZhdWx0T3V0LCAiZGVmLmluIik7Ci0gIG91dGZpbGUgID0gZGVmYXVsdE91dDsKLSAgZm91dCAgICAgPSBzdGRvdXQ7Ci0gIHVzZXJEYXRhID0gMHgwMTAyMDMwNDsKLQotICBkb3VibGUqIGF4aXM7Ci0gIGRvdWJsZSogbnVtMTsKLSAgZG91YmxlKiBudW0yOwotICBkb3VibGUqIG51bTM7Ci0KLSAgYXJnYy0tOwotICBhcmd2Kys7Ci0gIHdoaWxlIChhcmdjLS0pIHsKLSAgICAgaWYgKHN0cmNtcCgqYXJndiwgIi1vIikgPT0gMCkgeyAgIC8vIG91dHB1dCBmaWxlbmFtZQotICAgICAgICBhcmd2Kys7Ci0gICAgICAgIGFyZ2MtLTsKLSAgICAgICAgb3V0ZmlsZSA9ICphcmd2OwotICAgICAgICBpZiAoKGZvdXQgPSBmb3BlbihvdXRmaWxlLCAidyIpKSA9PSAwKSB7Ci0gICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IGNvdWxkIG5vdCBvcGVuIG91dHB1dCBmaWxlXG4iKTsKLSAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgIH0KLSAgICAgfSBlbHNlIGlmIChzdHJuY21wKCphcmd2LCAgIi1oIiwgMikgPT0gMCkgeyAgLy8gY29tcGFyZSB3aXRoIC1oW2VscF0KLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogZGVmd3JpdGUgWy1vIDxmaWxlbmFtZT5dIFstaGVscF1cbiIpOwotICAgICAgICByZXR1cm4gMTsKLSAgICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogSWxsZWdhbCBjb21tYW5kIGxpbmUgb3B0aW9uOiAnJXMnXG4iLCAqYXJndik7Ci0gICAgICAgIHJldHVybiAyOwotICAgICB9Ci0gICAgIGFyZ3YrKzsKLSAgfQotCi0gIC8vIGluaXRhbGl6ZQotICBzdGF0dXMgPSBkZWZ3SW5pdENiayhmb3V0KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgLy8gc2V0IHRoZSBjYWxsYmFjayBmdW5jdGlvbnMKLSAgZGVmd1NldEFycmF5Q2JrIChhcnJheUNCKTsKLSAgZGVmd1NldEJ1c0JpdENiayAoYnVzYml0Q0IpOwotICBkZWZ3U2V0RGl2aWRlckNiayAoZGl2aWRlckNCKTsKLSAgZGVmd1NldENvbXBvbmVudENiayAoY29tcG9uZW50Q0IpOwotICBkZWZ3U2V0RGVzaWduQ2JrIChkZXNpZ25DQik7Ci0gIGRlZndTZXREZXNpZ25FbmRDYmsgKChkZWZ3Vm9pZENia0ZuVHlwZSlkZXNpZ25lbmRDQik7Ci0gIGRlZndTZXREaWVBcmVhQ2JrIChkaWVhcmVhQ0IpOwotICBkZWZ3U2V0RXh0Q2JrIChleHRlbnNpb25DQik7Ci0gIGRlZndTZXRGbG9vclBsYW5DYmsgKGZsb29ycGxhbkNCKTsKLSAgZGVmd1NldEdjZWxsR3JpZENiayAoZ2NlbGxncmlkQ0IpOwotICBkZWZ3U2V0R3JvdXBDYmsgKGdyb3VwQ0IpOwotICBkZWZ3U2V0SGlzdG9yeUNiayAoaGlzdG9yeUNCKTsKLSAgZGVmd1NldE5ldENiayAobmV0Q0IpOwotICBkZWZ3U2V0UGluQ2JrIChwaW5DQik7Ci0gIGRlZndTZXRQaW5Qcm9wQ2JrIChwaW5wcm9wQ0IpOwotICBkZWZ3U2V0UHJvcERlZkNiayAocHJvcGRlZkNCKTsKLSAgZGVmd1NldFJlZ2lvbkNiayAocmVnaW9uQ0IpOwotICBkZWZ3U2V0Um93Q2JrIChyb3dDQik7Ci0gIGRlZndTZXRTTmV0Q2JrIChzbmV0Q0IpOwotICBkZWZ3U2V0VGVjaG5vbG9neUNiayAodGVjaG5vbG9neUNCKTsKLSAgZGVmd1NldFRyYWNrQ2JrICh0cmFja0NCKTsKLSAgZGVmd1NldFVuaXRzQ2JrICh1bml0c0NCKTsKLSAgZGVmd1NldFZpYUNiayAodmlhQ0IpOwotCi0gIHJlcyA9IGRlZndXcml0ZShmb3V0LCBvdXRmaWxlLCAodm9pZCopdXNlckRhdGEpOwotCi0gIGZjbG9zZShmb3V0KTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmemxpYi9kZWZ6bGliLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWZ6bGliL2RlZnpsaWIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjg3ZjlmLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWZ6bGliL2RlZnpsaWIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiAtIDIwMTUsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgInpsaWIuaCIKLSNpbmNsdWRlICJkZWZ6bGliLmhwcCIKLSNpbmNsdWRlICJkZWZyUmVhZGVyLmhwcCIKLQotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0vKgotICogUHJpdmF0ZSBmdW5jdGlvbnM6Ci0gKi8KLXNpemVfdCBkZWZHWmlwX3JlYWQoRklMRSogZmlsZSwgY2hhciogYnVmLCBzaXplX3QgbGVuKSB7Ci0gIHJldHVybiAoZ3pyZWFkKChnekZpbGUpZmlsZSwgYnVmLCBsZW4pKTsKLX0KLQotLyoKLSAqIFB1YmxpYyBmdW5jdGlvbnM6Ci0gKi8KLWRlZkdaRmlsZSAKLWRlZkdaaXBPcGVuKGNvbnN0IGNoYXIgKmd6aXBQYXRoLCBjb25zdCBjaGFyKiBtb2RlKSB7Ci0KLSAgaWYgKCFnemlwUGF0aCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBkZWZHWkZpbGUgZnB0ciAgPSBnem9wZW4oZ3ppcFBhdGgsIG1vZGUpOwotCi0gIGlmIChmcHRyKSB7Ci0gICAgLyogc3VjY2Vzc2Z1bGx5IG9wZW4gdGhlIGd6aXAgZmlsZSAqLwotICAgIC8qIHNldCB0aGUgcmVhZCBmdW5jdGlvbiB0byByZWFkIGZyb20gYSBjb21wcmVzc2VkIGZpbGUgKi8KLSAgICBkZWZyU2V0UmVhZEZ1bmN0aW9uKGRlZkdaaXBfcmVhZCk7Ci0gICAgcmV0dXJuIChkZWZHWkZpbGUpZnB0cjsKLSAgfSBlbHNlCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLWludCBkZWZHWmlwQ2xvc2UoZGVmR1pGaWxlIGZpbGVQdHIpIHsKLSAgZGVmclVuc2V0UmVhZEZ1bmN0aW9uKCk7Ci0gIHJldHVybiAoZ3pjbG9zZSgoZ3pGaWxlKWZpbGVQdHIpKTsKLX0KLQotaW50IGRlZnJSZWFkR1ppcChkZWZHWkZpbGUgZmlsZSwgY29uc3QgY2hhciogZ3ppcEZpbGUsIGRlZmlVc2VyRGF0YSB1RGF0YSkgewotICByZXR1cm4gZGVmclJlYWQoKEZJTEUqKWZpbGUsIGd6aXBGaWxlLCB1RGF0YSwgMSk7Ci19Ci0KLXZvaWQKLWRlZnJTZXRHWmlwUmVhZEZ1bmN0aW9uKCkKLXsKLSAgZGVmclNldFJlYWRGdW5jdGlvbihkZWZHWmlwX3JlYWQpOwotfQotCi1kZWZHWkZpbGUgCi1kZWZyR1ppcE9wZW4oY29uc3QgY2hhciAqZ3ppcFBhdGgsIGNvbnN0IGNoYXIqIG1vZGUpCi17Ci0gIGlmICghZ3ppcFBhdGgpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0dXJuIGd6b3BlbihnemlwUGF0aCwgbW9kZSk7Ci19Ci0KLWludCBkZWZyR1ppcENsb3NlKGRlZkdaRmlsZSBmaWxlUHRyKSB7Ci0gIHJldHVybiAoZ3pjbG9zZSgoZ3pGaWxlKWZpbGVQdHIpKTsKLX0KLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9kZWYvNS44LXAwMjkvZGVmemxpYi9kZWZ6bGliLmhwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWZ6bGliL2RlZnpsaWIuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDE2YWEwLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kZWZ6bGliL2RlZnpsaWIuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiAtIDIwMTUsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaWZuZGVmIExFRkRFRlpJUF9ICi0jZGVmaW5lIExFRkRFRlpJUF9ICi0KLSNpbmNsdWRlICJkZWZpRGVmcy5ocHAiCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLXR5cGVkZWYgdm9pZCogZGVmR1pGaWxlOwotY2xhc3MgZGVmckNvbnRleHQ7Ci0KLS8vCi0vLyBOYW1lOiBkZWZyU2V0UmVhZEdaaXBGdW5jdGlvbgotLy8gRGVzY3JpcHRpb246IFNldHMgR1ppcCByZWFkIGZ1bmN0aW9uIGZvciB0aGUgcGFyc2VyCi0vLyBSZXR1cm5zOiAwIGlmIG5vIGVycm9ycwotLy8KLWV4dGVybiB2b2lkIGRlZnJTZXRHWmlwUmVhZEZ1bmN0aW9uKCk7Ci0KLS8vCi0vLyBOYW1lOiBkZWZPcGVuR1ppcAotLy8gRGVzY3JpcHRpb246IE9wZW4gYSBnemlwIGZpbGUKLS8vIFJldHVybnM6IEEgZmlsZSBwb2ludGVyCi0vLwotZXh0ZXJuIGRlZkdaRmlsZSBkZWZyR1ppcE9wZW4oY29uc3QgY2hhciogZ3ppcEZpbGUsIGNvbnN0IGNoYXIqIG1vZGUpOwotCi0vLyAKLS8vIE5hbWU6IGRlZkNsb3NlR1ppcAotLy8gRGVzY3JpcHRpb246IENsb3NlIGEgZ3ppcCBmaWxlCi0vLyBSZXR1cm5zOiAwIGlmIG5vIGVycm9ycwotLy8KLWV4dGVybiBpbnQgZGVmckdaaXBDbG9zZShkZWZHWkZpbGUgZmlsZVB0cik7Ci0KLS8vCi0vLyBOYW1lOiBkZWZyUmVhZEdaaXAKLS8vIERlc2NyaXB0aW9uOiBQYXJzZSBhIGRlZiBnemlwIGZpbGUKLS8vIFJldHVybnM6IDAgaWYgbm8gZXJyb3JzCi0vLwotZXh0ZXJuIGludCBkZWZyUmVhZEdaaXAoZGVmR1pGaWxlIGZpbGUsIGNvbnN0IGNoYXIqIGd6aXBGaWxlLCB2b2lkKiB1RGF0YSk7Ci0KLS8vCi0vLyBGVU5DVElPTlMgVE8gQkUgT0JTT0xFVEVELgotLy8gVGhlIEFQSSBpcyBrZXB0IG9ubHkgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucy4KLS8vCi0KLS8vCi0vLyBOYW1lOiBkZWZHWmlwT3BlbgotLy8gRGVzY3JpcHRpb246IE9wZW4gYSBnemlwIGZpbGUKLS8vIFJldHVybnM6IEEgZmlsZSBwb2ludGVyCi0vLwotZXh0ZXJuIGRlZkdaRmlsZSBkZWZHWmlwT3Blbihjb25zdCBjaGFyKiBnemlwRmlsZSwgY29uc3QgY2hhciogbW9kZSk7Ci0KLS8vIAotLy8gTmFtZTogZGVmR1ppcENsb3NlCi0vLyBEZXNjcmlwdGlvbjogQ2xvc2UgYSBnemlwIGZpbGUKLS8vIFJldHVybnM6IDAgaWYgbm8gZXJyb3JzCi0vLwotZXh0ZXJuIGludCBkZWZHWmlwQ2xvc2UoZGVmR1pGaWxlIGZpbGVQdHIpOwotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotVVNFX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RvYy9kZWZhcGkucGRmIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RvYy9kZWZhcGkucGRmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzllOTA5Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kb2MvZGVmYXBpLnBkZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2RlZi81LjgtcDAyOS9kb2MvZGVmYXBpV04ucGRmIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RvYy9kZWZhcGlXTi5wZGYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YjIwYjMuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvZGVmLzUuOC1wMDI5L2RvYy9kZWZhcGlXTi5wZGYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvLmdpdGlnbm9yZSBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS8uZ2l0aWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTBiOTA3Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS8uZ2l0aWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotYmluLwotYmluL2xlZmRpZmYKLWJpbi9sZWZydwotYmluL2xlZndyaXRlCi1sZWYvKi5vdXRwdXQKLWxlZi8qLnRhYi5oCi1sZWYvKi50YWIuY3BwCi1sZWZkaWZmL2xlZmRpZmYKLWxlZnJ3L2xlZnJ3Ci1sZWZ3cml0ZS9sZWZ3cml0ZQotbGVmemxpYi8qLmEKLWluY2x1ZGUvKi5oCi1pbmNsdWRlLyouaHBwCi1saWIvKi5hCi0qLmEKLSoqLyouYQotCi1NYWtlZmlsZQotQ01ha2VDYWNoZS50eHQKLSouY21ha2UKLUNNYWtlRmlsZXMKLWluc3RhbGxfbWFuaWZlc3QudHh0CmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvQ01ha2VMaXN0cy50eHQgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvQ01ha2VMaXN0cy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NWU3OTQuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L0NNYWtlTGlzdHMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLSMgTEVGIFBBUlNFUiBDTUFLRSBDb21waWxlIFNldHRpbmdzCi1wcm9qZWN0KExFRl9QQVJTRVIgCi0gIExBTkdVQUdFUyBDWFggCi0pCi0KLWNtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjYpCi0KLXNldChMRUZMSUJfSE9NRSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0pCi1tZXNzYWdlKFNUQVRVUyAibGVmbGliX2hvbWU6ICR7TEVGTElCX0hPTUV9IikKLQotc2V0KENNQUtFX0NYWF9GTEFHU19ERUJVRyAiLWcgLWdnZGIiKQotc2V0KENNQUtFX0NYWF9GTEFHU19SRUxFQVNFICItTzMiKQotCi0jIEJJU09OIGFuZCBaTElCIGlzIHJlcXVpcmVkIHRvIGNvbXBpbGUgTEVGL0xFRiBQYXJzZXJzLgotZmluZF9wYWNrYWdlKEJJU09OKQotZmluZF9wYWNrYWdlKFpMSUIpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDcmVhdGUgYSBsaWJyYXJ5IGZvciBMRUYKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc2V0KCBMRUZMSUJfTEVGX1NSQwotICBsZWYvY3J5cHQuY3BwCi0gIGxlZi9sZWZpQXJyYXkuY3BwCi0gIGxlZi9sZWZpQ3Jvc3NUYWxrLmNwcAotICBsZWYvbGVmaURlYnVnLmNwcAotICBsZWYvbGVmaUVuY3J5cHRJbnQuY3BwCi0gIGxlZi9sZWZpTGF5ZXIuY3BwCi0gIGxlZi9sZWZpTWFjcm8uY3BwCi0gIGxlZi9sZWZpTWlzYy5jcHAKLSAgbGVmL2xlZmlOb25EZWZhdWx0LmNwcAotICBsZWYvbGVmaVByb3AuY3BwCi0gIGxlZi9sZWZpUHJvcFR5cGUuY3BwCi0gIGxlZi9sZWZpVEJFeHQuY3BwCi0gIGxlZi9sZWZpVW5pdHMuY3BwCi0gIGxlZi9sZWZpVmlhLmNwcAotICBsZWYvbGVmaVZpYVJ1bGUuY3BwCi0gIGxlZi9sZWZfa2V5d29yZHMuY3BwCi0gIGxlZi9sZWZyQ2FsbGJhY2tzLmNwcAotICBsZWYvbGVmckRhdGEuY3BwCi0gIGxlZi9sZWZyUmVhZGVyLmNwcAotICBsZWYvbGVmclNldHRpbmdzLmNwcAotICBsZWYvbGVmLnRhYi5jcHAKLSAgbGVmL2xlZndXcml0ZXJDYWxscy5jcHAKLSAgbGVmL2xlZndXcml0ZXIuY3BwCi0gICkKLQotc2V0KCBMRUZMSUJfTEVGWkxJQl9TUkMgCi0gIGxlZnpsaWIvbGVmemxpYi5jcHAKLSAgKQotCi1zZXQgKCBMRUZMSUJfQ0xFRl9TUkMgCi0gIGNsZWYvbGVmaUVuY3J5cHRFeHQuYwotICBjbGVmL2xlZmlUQkludC5jCi0gIGNsZWYveGxlZmlBcnJheS5jcHAKLSAgY2xlZi94bGVmaUNyb3NzVGFsay5jcHAKLSAgY2xlZi94bGVmaURlYnVnLmNwcAotICBjbGVmL3hsZWZpRW5jcnlwdEludC5jcHAKLSAgY2xlZi94bGVmaUxheWVyLmNwcAotICBjbGVmL3hsZWZpTWFjcm8uY3BwCi0gIGNsZWYveGxlZmlNaXNjLmNwcAotICBjbGVmL3hsZWZpTm9uRGVmYXVsdC5jcHAKLSAgY2xlZi94bGVmaVByb3AuY3BwCi0gIGNsZWYveGxlZmlQcm9wVHlwZS5jcHAKLSAgY2xlZi94bGVmaVVuaXRzLmNwcAotICBjbGVmL3hsZWZpVXRpbC5jcHAKLSAgY2xlZi94bGVmaVZpYS5jcHAKLSAgY2xlZi94bGVmaVZpYVJ1bGUuY3BwCi0gIGNsZWYveGxlZnJSZWFkZXIuY3BwCi0gIGNsZWYveGxlZndXcml0ZXJDYWxscy5jcHAKLSAgY2xlZi94bGVmd1dyaXRlci5jcHAKLSkKLQotc2V0IChMRUZMSUJfQ0xFRlpMSUJfU1JDCi0gIGNsZWZ6bGliL2NsZWZ6bGliLmMKLSAgKQotCi1zZXQgKExFRkxJQl9IRUFERVJTCi0gIGxlZi9sZWYudGFiLmgKLSAgbGVmL2xleC5oCi0gIGxlZi9jcnlwdC5ocHAKLSAgbGVmL2xlZmlBcnJheS5ocHAKLSAgbGVmL2xlZmlDcm9zc1RhbGsuaHBwCi0gIGxlZi9sZWZpRGVidWcuaHBwCi0gIGxlZi9sZWZpRGVmcy5ocHAKLSAgbGVmL2xlZmlFbmNyeXB0SW50LmhwcAotICBsZWYvbGVmaUtSRGVmcy5ocHAKLSAgbGVmL2xlZmlMYXllci5ocHAKLSAgbGVmL2xlZmlNYWNyby5ocHAKLSAgbGVmL2xlZmlNaXNjLmhwcAotICBsZWYvbGVmaU5vbkRlZmF1bHQuaHBwCi0gIGxlZi9sZWZpUHJvcC5ocHAKLSAgbGVmL2xlZmlQcm9wVHlwZS5ocHAKLSAgbGVmL2xlZmlVbml0cy5ocHAKLSAgbGVmL2xlZmlVc2VyLmhwcAotICBsZWYvbGVmaVV0aWwuaHBwCi0gIGxlZi9sZWZpVmlhLmhwcAotICBsZWYvbGVmaVZpYVJ1bGUuaHBwCi0gIGxlZi9sZWZyQ2FsbEJhY2tzLmhwcAotICBsZWYvbGVmckRhdGEuaHBwCi0gIGxlZi9sZWZyUmVhZGVyLmhwcAotICBsZWYvbGVmclNldHRpbmdzLmhwcAotICBsZWYvbGVmd1dyaXRlckNhbGxzLmhwcAotICBsZWYvbGVmd1dyaXRlci5ocHAKLQotICBsZWZ6bGliL2xlZnpsaWIuaHBwCi0KLSAgY2xlZi9sZWZpQXJyYXkuaAotICBjbGVmL2xlZmlDcm9zc1RhbGsuaAotICBjbGVmL2xlZmlEZWJ1Zy5oCi0gIGNsZWYvbGVmaUVuY3J5cHRJbnQuaAotICBjbGVmL2xlZmlMYXllci5oCi0gIGNsZWYvbGVmaU1hY3JvLmgKLSAgY2xlZi9sZWZpTWlzYy5oCi0gIGNsZWYvbGVmaU5vbkRlZmF1bHQuaAotICBjbGVmL2xlZmlQcm9wLmgKLSAgY2xlZi9sZWZpUHJvcFR5cGUuaAotICBjbGVmL2xlZmlUeXBlZGVmcy5oCi0gIGNsZWYvbGVmaVVuaXRzLmgKLSAgY2xlZi9sZWZpVXNlci5oCi0gIGNsZWYvbGVmaVV0aWwuaAotICBjbGVmL2xlZmlWaWEuaAotICBjbGVmL2xlZmlWaWFSdWxlLmgKLSAgY2xlZi9sZWZNc2dUYWJsZS5oCi0gIGNsZWYvbGVmclJlYWRlci5oCi0gIGNsZWYvbGVmd1dyaXRlckNhbGxzLmgKLSAgY2xlZi9sZWZ3V3JpdGVyLmgKLQotICBjbGVmemxpYi9sZWZ6bGliLmgKLSkKLQotCi0jIEJJU09OIGRlcGVuZGVuY2llcwotYWRkX2N1c3RvbV9jb21tYW5kKCAKLSAgT1VUUFVUICR7TEVGTElCX0hPTUV9L2xlZi9sZWYudGFiLmNwcAotICBDT01NQU5EICR7QklTT05fRVhFQ1VUQUJMRX0gLXYgLXBsZWZ5eSAtZCAke0xFRkxJQl9IT01FfS9sZWYvbGVmLnkgCi0gIENPTU1BTkQgbXYgbGVmLnRhYi5oICR7TEVGTElCX0hPTUV9L2xlZi9sZWYudGFiLmgKLSAgQ09NTUFORCBtdiBsZWYudGFiLmMgJHtMRUZMSUJfSE9NRX0vbGVmL2xlZi50YWIuY3BwCi0pCi1hZGRfY3VzdG9tX3RhcmdldChMZWZCaXNvblRhcmdldCBBTEwgREVQRU5EUyBsZWYvbGVmLnRhYi5jcHApCi0KLQotYWRkX2xpYnJhcnkoIGxlZiBTVEFUSUMgJHtMRUZMSUJfTEVGX1NSQ30gKQotYWRkX2xpYnJhcnkoIGxlZnpsaWIgU1RBVElDICR7TEVGTElCX0xFRlpMSUJfU1JDfSApCi0KLWFkZF9saWJyYXJ5KCBjbGVmIFNUQVRJQyAke0xFRkxJQl9DTEVGX1NSQ30gKQotYWRkX2xpYnJhcnkoIGNsZWZ6bGliIFNUQVRJQyAke0xFRkxJQl9DTEVGWkxJQl9TUkN9KQotCi0KLXNldF90YXJnZXRfcHJvcGVydGllcyggbGVmCi0gIFBST1BFUlRJRVMKLSAgQVJDSElWRV9PVVRQVVRfRElSRUNUT1JZICR7TEVGTElCX0hPTUV9L2xpYgotICBMSUJSQVJZX09VVFBVVF9ESVJFQ1RPUlkgJHtMRUZMSUJfSE9NRX0vbGliCi0gIFJVTlRJTUVfT1VUUFVUX0RJUkVDVE9SWSAke0xFRkxJQl9IT01FfS9saWIKLSkKLQotc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCBsZWZ6bGliCi0gIFBST1BFUlRJRVMKLSAgQVJDSElWRV9PVVRQVVRfRElSRUNUT1JZICR7TEVGTElCX0hPTUV9L2xpYgotICBMSUJSQVJZX09VVFBVVF9ESVJFQ1RPUlkgJHtMRUZMSUJfSE9NRX0vbGliCi0gIFJVTlRJTUVfT1VUUFVUX0RJUkVDVE9SWSAke0xFRkxJQl9IT01FfS9saWIKLSkKLQotc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCBjbGVmCi0gIFBST1BFUlRJRVMKLSAgQVJDSElWRV9PVVRQVVRfRElSRUNUT1JZICR7TEVGTElCX0hPTUV9L2xpYgotICBMSUJSQVJZX09VVFBVVF9ESVJFQ1RPUlkgJHtMRUZMSUJfSE9NRX0vbGliCi0gIFJVTlRJTUVfT1VUUFVUX0RJUkVDVE9SWSAke0xFRkxJQl9IT01FfS9saWIKLSkKLQotc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCBjbGVmemxpYiAKLSAgUFJPUEVSVElFUyAKLSAgQVJDSElWRV9PVVRQVVRfRElSRUNUT1JZICR7TEVGTElCX0hPTUV9L2xpYgotICBMSUJSQVJZX09VVFBVVF9ESVJFQ1RPUlkgJHtMRUZMSUJfSE9NRX0vbGliCi0gIFJVTlRJTUVfT1VUUFVUX0RJUkVDVE9SWSAke0xFRkxJQl9IT01FfS9saWIKLSAgTElOS0VSX0xBTkdVQUdFIENYWCAKLSkKLQotIyBpbmNsdWRlIGRpcmVjdG9yeSBzZXR0aW5ncwotdGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMoIGxlZgotICBQVUJMSUMKLSAgbGVmLwotICApCi0KLXRhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzKCBsZWZ6bGliCi0gIFBVQkxJQwotICBsZWYvCi0gIGxlZnpsaWIvCi0gICkKLQotdGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMoIGNsZWYgCi0gIFBVQkxJQwotICBsZWYvCi0gIGNsZWYvCi0gICkKLQotdGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMoIGNsZWZ6bGliCi0gIFBVQkxJQwotICBsZWYvCi0gIGxlZnpsaWIvCi0gIGNsZWYvCi0gIGNsZWZ6bGliLwotICApCi0KLWFkZF9kZXBlbmRlbmNpZXMoIGNsZWYgbGVmICkKLWFkZF9kZXBlbmRlbmNpZXMoIGxlZiBMZWZCaXNvblRhcmdldCApCi1hZGRfZGVwZW5kZW5jaWVzKCBsZWZ6bGliIGxlZiApCi1hZGRfZGVwZW5kZW5jaWVzKCBjbGVmemxpYiBjbGVmICkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGluc3RhbGwKLQotaW5zdGFsbChGSUxFUyAke0xFRkxJQl9IRUFERVJTfSBERVNUSU5BVElPTiBpbmNsdWRlKQotaW5zdGFsbChUQVJHRVRTIGxlZiBsZWZ6bGliIGNsZWYgY2xlZnpsaWIgREVTVElOQVRJT04gbGliKQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvTElDRU5TRS5UWFQgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvTElDRU5TRS5UWFQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ODAyYTQuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L0xJQ0VOU0UuVFhUCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotQ29weXJpZ2h0IDIwMTIgLSAyMDE3LCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0gCi1MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLXlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLVlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIAotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIAotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9URVNUL2NvbXBsZXRlLjUuOC5sZWYgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvVEVTVC9jb21wbGV0ZS41LjgubGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWEyMTA4Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9URVNUL2NvbXBsZXRlLjUuOC5sZWYKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYyICswLDAgQEAKLVZFUlNJT04gNS44IDsKLU5BTUVTQ0FTRVNFTlNJVElWRSBPTiA7Ci1GSVhFRE1BU0sgOwotTk9XSVJFRVhURU5TSU9OQVRQSU4gT04gOwotQlVTQklUQ0hBUlMgIjw+IiA7Ci1ESVZJREVSQ0hBUiAiOiIgOwotVVNFTUlOU1BBQ0lORyBPQlMgT0ZGIDsKLVVTRU1JTlNQQUNJTkcgUElOIE9OIDsKLUNMRUFSQU5DRU1FQVNVUkUgRVVDTElERUFOIDsKLUNMRUFSQU5DRU1FQVNVUkUgTUFYWFkgOwotCi0mZGVmaW5lcyAmVkREL0dORF9zaXRlID0gIlZEREdORCIgOwotJmRlZmluZXMgJlZERC9HTkRfc2l0ZSA9ICJWRERHTkQxIiA7Ci0KLVVOSVRTCi0gICBUSU1FIE5BTk9TRUNPTkRTIDEwMCA7Ci0gICBDQVBBQ0lUQU5DRSBQSUNPRkFSQURTIDEwIDsKLSAgIFJFU0lTVEFOQ0UgT0hNUyAxMDAwMCA7Ci0gICBQT1dFUiBNSUxMSVdBVFRTIDEwMDAwIDsKLSAgIENVUlJFTlQgTUlMTElBTVBTIDEwMDAwIDsKLSAgIFZPTFRBR0UgVk9MVFMgMTAwMCA7Ci0gICBEQVRBQkFTRSBNSUNST05TIDIwMDAwIDsKLSAgIEZSRVFVRU5DWSBNRUdBSEVSVFogMTAgOwotRU5EIFVOSVRTCi0KLU1BTlVGQUNUVVJJTkdHUklEIDMuNSA7Ci0KLVBST1BFUlRZREVGSU5JVElPTlMKLSAgIExJQlJBUlkgTkFNRSBTVFJJTkcgIkNhZGVuY2U5NiIgOwotICAgTElCUkFSWSBpbnROdW0gIElOVEVHRVIgMjAgOwotICAgTElCUkFSWSByZWFsTnVtIFJFQUwgMjEuMjIgOwotICAgTElCUkFSWSBMRUY1N19NQVhGTE9BVElOR0FSRUFHQVRFIFNUUklORyAiTUFYRkxPQVRJTkdBUkVBIEdBVEVJU0dST1VORDsiIDsKLSAgIExBWUVSIGxzcCBTVFJJTkcgOwotICAgTEFZRVIgbGlwIElOVEVHRVIgOwotICAgTEFZRVIgbHJwIFJFQUwgOwotICAgTEFZRVIgTEVGNTdfU1BBQ0lORyBTVFJJTkcgOwotICAgTEFZRVIgTEVGNTdfU1BBQ0lOR0FESkFDRU5UQ1VUUyBTVFJJTkcgOwotICAgTEFZRVIgTEVGNTdfTUFYRkxPQVRJTkdBUkVBIFNUUklORyA7Ci0gICBMQVlFUiBMRUY1N19BUlJBWVNQQUNJTkcgU1RSSU5HIDsKLSAgIExBWUVSIExFRjU3X1NQQUNJTkdTQU1FTkVUIFNUUklORyA7Ci0gICBMQVlFUiBMRUY1N19NSU5TVEVQIFNUUklORyA7Ci0gICBMQVlFUiBMRUY1N19BTlRFTk5BR0FURVBMVVNESUZGIFNUUklORyA7Ci0gICBMQVlFUiBMRUY1N19BTlRFTk5BQ1VNUk9VVElOR1BMVVNDVVQgU1RSSU5HIDsKLSAgIExBWUVSIExFRjU3X0FOVEVOTkFBUkVBTUlOVVNESUZGIFNUUklORyA7Ci0gICBMQVlFUiBMRUY1N19BTlRFTk5BQVJFQURJRkZSRURVQ0VQV0wgU1RSSU5HIDsKLSAgIExBWUVSIExFRjU3X0VOQ0xPU1VSRSBTVFJJTkcgOwotICAgVklBIHN0cmluZ1Byb3BlcnR5IFNUUklORyA7Ci0gICBWSUEgcmVhbFByb3BlcnR5IFJFQUwgOwotICAgVklBIENPVU5UIElOVEVHRVIgUkFOR0UgMSAxMDAgOwotICAgVklBUlVMRSB2cnNwIFNUUklORyA7Ci0gICBWSUFSVUxFIHZyaXAgSU5URUdFUiA7Ci0gICBWSUFSVUxFIHZycnAgUkVBTCA7Ci0gICBOT05ERUZBVUxUUlVMRSBuZHJzcCBTVFJJTkcgOwotICAgTk9OREVGQVVMVFJVTEUgbmRyaXAgSU5URUdFUiA7Ci0gICBOT05ERUZBVUxUUlVMRSBuZHJycCBSRUFMIDsKLSAgIE1BQ1JPIHN0cmluZ1Byb3AgU1RSSU5HIDsKLSAgIE1BQ1JPIGludGVnZXJQcm9wIElOVEVHRVIgOwotICAgTUFDUk8gV0VJR0hUIFJFQUwgUkFOR0UgMS4wIDEwMC4wIDsKLSAgIFBJTiBUWVBFIFNUUklORyA7Ci0gICBQSU4gaW50UHJvcCBJTlRFR0VSIDsKLSAgIFBJTiByZWFsUHJvcCBSRUFMIDsKLUVORCBQUk9QRVJUWURFRklOSVRJT05TCi0KLUxBWUVSIFBPTFlTCi0gICBUWVBFIE1BU1RFUlNMSUNFIDsKLSAgIFBST1BFUlRZIGxzcCAidG9wIiBsaXAgMSBscnAgMi4zIDsKLUVORCBQT0xZUwotCi1MQVlFUiBQT0xZUzAxCi0gICBUWVBFIE1BU1RFUlNMSUNFIDsKLUVORCBQT0xZUzAxCi0KLUxBWUVSIENVVDAxCi0gICBUWVBFIENVVCA7Ci0gICBTUEFDSU5HIDAuMzUgQURKQUNFTlRDVVRTIDMgV0lUSElOIDAuMjUgOwotICAgRElBR1BJVENIIDYuNSA7Ci0gICBPRkZTRVQgMC41IC42IDsKLSAgIFBJVENIIDEuMiAxLjMgOwotICAgUFJPUEVSVFkgbGlwIDUgOwotICAgUFJPUEVSVFkgTEVGNTdfU1BBQ0lORyAiU1BBQ0lORyAxLjUgUEFSQUxMRUxPVkVSTEFQIDsiIDsKLSAgIFBST1BFUlRZIExFRjU3X0FSUkFZU1BBQ0lORyAiQVJSQVlTUEFDSU5HICBXSURUSCAyLjAgQ1VUU1BBQ0lORyAwLjIgQVJSQVlDVVRTIDMgU1BBQ0lORyAxLjAgOyIgOwotICAgUFJPUEVSVFkgTEVGNTdfRU5DTE9TVVJFICJFTkNMT1NVUkUgQUJPVkUgLjAxIC4wNSA7IiA7Ci0gICBQUk9QRVJUWSBMRUY1N19FTkNMT1NVUkUgIkVOQ0xPU1VSRSBBQk9WRSAuMDIgLjA1IFdJRFRIIDMuMSBFWENFUFRFWFRSQUNVVCAxLjUgTk9TSEFSRURFREdFIDsiIDsKLSAgIFBST1BFUlRZIExFRjU3X0VOQ0xPU1VSRSAiRU5DTE9TVVJFIEJFTE9XIC4wMyAuMDUgV0lEVEggMy4xIEVYQ0VQVEVYVFJBQ1VUIDEuNSA7IiA7Ci0gICBQUk9QRVJUWSBMRUY1N19FTkNMT1NVUkUgIkVOQ0xPU1VSRSAuMDUgLjA1IDsiIDsKLSAgIFBST1BFUlRZIExFRjU3X0VOQ0xPU1VSRSAiRU5DTE9TVVJFIEJFTE9XIC4wOCAuMDUgV0lEVEggMy4xIEVYQ0VQVEVYVFJBQ1VUIDEuNSBOT1NIQVJFREVER0UgOyIgOwotRU5EIENVVDAxCi0KLUxBWUVSIFJYCi0gICBUWVBFIFJPVVRJTkcgOwotICAgTUFTSyAyIDsKLSAgIFBJVENIIDEuOCA7Ci0gICBPRkZTRVQgMC45IDsKLSAgIFdJRFRIIDEgOwotICAgQVJFQSAzNC4xIDsKLSAgIE1JTklNVU1DVVQgMiBXSURUSCAyLjUgOwotICAgU1BBQ0lORyAwLjYgOwotICAgU1BBQ0lORyAwLjE4IExFTkdUSFRIUkVTSE9MRCAwLjkgOwotICAgU1BBQ0lORyAwLjQgUkFOR0UgMC4xIDAuMTIgOwotICAgU1BBQ0lORyAwLjMyIFJBTkdFIDEuMDEgMjAwMC4wIFVTRUxFTkdUSFRIUkVTSE9MRCA7Ci0gICBTUEFDSU5HIDAuMSBSQU5HRSAwLjEgMC4xIElORkxVRU5DRSAyLjAxIFJBTkdFIDIuMSAxMDAwMC4wIDsKLSAgIFNQQUNJTkcgMC40NCBSQU5HRSAxLjAgMS4wIElORkxVRU5DRSAxLjAxIDsKLSAgIFNQQUNJTkcgMC4zMyBSQU5HRSAxLjAxIDIwLjAgSU5GTFVFTkNFIDEuMDEgOwotICAgU1BBQ0lORyAwLjcgUkFOR0UgMC4zIDAuMTUgVVNFTEVOR1RIVEhSRVNIT0xEIDsKLSAgIFNQQUNJTkcgMC41IDsKLSAgIFNQQUNJTkcgMC42IFJBTkdFIDQuNSA2LjEyIFJBTkdFIDMuMCAzLjEgOwotICAgU1BBQ0lORyA0LjMgUkFOR0UgMC4xIDAuMSBJTkZMVUVOQ0UgMy44MSBSQU5HRSAwLjEgMC4yIDsKLSAgIFNQQUNJTkcgMC41MyBMRU5HVEhUSFJFU0hPTEQgMC40NSBSQU5HRSAwIDAuMSA7Ci0gICBQUk9QRVJUWSBMRUY1N19TUEFDSU5HICJTUEFDSU5HIDIuMiBFTkRPRkxJTkUgMi4zIFdJVEhJTiAxLjYgOyIgOwotICAgUFJPUEVSVFkgTEVGNTdfQVJSQVlTUEFDSU5HICJBUlJBWVNQQUNJTkcgTE9OR0FSUkFZIENVVFNQQUNJTkcgMC4yIEFSUkFZQ1VUUyAzIFNQQUNJTkcgMS4wIEFSUkFZQ1VUUyA0IFNQQUNJTkcgMS41IEFSUkFZQ1VUUyA1IFNQQUNJTkcgMi4wIDsiIDsKLSAgIERJUkVDVElPTiBIT1JJWk9OVEFMIDsKLSAgIFdJUkVFWFRFTlNJT04gMC43NSA7Ci0gICBSRVNJU1RBTkNFIFJQRVJTUSAwLjEwMyA7Ci0gICBDQVBBQ0lUQU5DRSBDUEVSU1FESVNUIDAuMDAwMTU2IDsKLSAgIEhFSUdIVCA5IDsKLSAgIFRISUNLTkVTUyAxIDsKLSAgIFNIUklOS0FHRSAwLjEgOwotICAgU0xPVFdJUkVXSURUSCA1IDsKLSAgIFNMT1RXSVJFTEVOR1RIIDQgOwotICAgU0xPVFdJRFRIIDYgOwotICAgU0xPVExFTkdUSCA1IDsKLSAgIE1BWEFESkFDRU5UU0xPVFNQQUNJTkcgNDUgOwotICAgTUFYQ09BWElBTFNMT1RTUEFDSU5HIDU1IDsKLSAgIFNQTElUV0lSRVdJRFRIIDUgOwotICAgTUlOSU1VTURFTlNJVFkgNCA7Ci0gICBNQVhJTVVNREVOU0lUWSAxMCA7Ci0jICAgREVOU0lUWUNIRUNLV0lORE9XIDQgNSA7Ci0gICBERU5TSVRZQ0hFQ0tTVEVQIDIgOwotICAgRklMTEFDVElWRVNQQUNJTkcgNCA7Ci0gICBDQVBNVUxUSVBMSUVSIDEgOwotICAgRURHRUNBUEFDSVRBTkNFIDAuMDAwMDUgOwotICAgQU5URU5OQU1PREVMIE9YSURFMSA7Ci0gICBBTlRFTk5BQVJFQUZBQ1RPUiAxIDsKLSAgIEFOVEVOTkFNT0RFTCBPWElERTIgOwotICAgQU5URU5OQUFSRUFSQVRJTyA0LjYgOwotICAgQU5URU5OQUFSRUFSQVRJTyA3LjYgOwotICAgQU5URU5OQURJRkZBUkVBUkFUSU8gNC43IDsKLSAgIEFOVEVOTkFESUZGQVJFQVJBVElPIFBXTCAoICggNS40IDUuNCApICggNi41IDYuNSApICggNy41IDcuNSApICkgOwotICAgQU5URU5OQUNVTUFSRUFSQVRJTyA2LjcgOyAgICAgICAgICAgICAjIDUuNwotICAgQU5URU5OQUFSRUFGQUNUT1IgMTAgOyAgICAgICAgICAgICAgICAjIDUuNwotICAgQU5URU5OQUNVTVJPVVRJTkdQTFVTQ1VUIDsgICAgICAgICAgICAjIDUuNwotICAgQU5URU5OQUFSRUFNSU5VU0RJRkYgMTAwLjAgOyAgICAgICAgICAjIDUuNwotICAgQU5URU5OQUdBVEVQTFVTRElGRiAyLjAgOyAgICAgICAgICAgICAjIDUuNwotICAgQU5URU5OQUNVTURJRkZBUkVBUkFUSU8gMTAwMCA7ICAgICAgICAjIDUuNwotICAgQU5URU5OQUFSRUFESUZGUkVEVUNFUFdMICggKCAwLjAgMS4wICkgKCAwLjA5OTk5IDEuMCApICggMC4xIDAuMiApICggMS4wIDAuMSApICggMTAwMC4wIDAuMSApICkgOwotICAgQU5URU5OQUNVTURJRkZBUkVBUkFUSU8gMTAwMCA7ICAgICAgICAjIDUuNwotICAgUFJPUEVSVFkgTEVGNTdfQU5URU5OQUNVTVJPVVRJTkdQTFVTQ1VUICJBTlRFTk5BQ1VNUk9VVElOR1BMVVNDVVQgOyIgOwotICAgUFJPUEVSVFkgTEVGNTdfQU5URU5OQUFSRUFNSU5VU0RJRkYgIkFOVEVOTkFBUkVBTUlOVVNESUZGIDEwMC4wIDsiIDsKLSAgIFBST1BFUlRZIExFRjU3X0FOVEVOTkFHQVRFUExVU0RJRkYgIkFOVEVOTkFHQVRFUExVU0RJRkYgMi4wIDsiIDsKLSAgIFBST1BFUlRZIExFRjU3X0FOVEVOTkFBUkVBRElGRlJFRFVDRVBXTCAiQU5URU5OQUFSRUFESUZGUkVEVUNFUFdMICggKCAwLjAgMS4wICkgKCAwLjA5OTkgMS4wICkgKCAwLjEgMC4yICkgKCAxLjAgMC4xICkgKCAxMDAwLjAgMC4xICkgKSA7IiA7Ci0gICBBTlRFTk5BQ1VNRElGRkFSRUFSQVRJTyA0LjUgOwotICAgQU5URU5OQUNVTURJRkZBUkVBUkFUSU8gUFdMICggKCA1LjQgNS40ICkgKCA2LjUgNi41ICkgKCA3LjUgNy41ICkgKSA7Ci0gICBBTlRFTk5BQVJFQUZBQ1RPUiA2LjUgOwotICAgQU5URU5OQUFSRUFGQUNUT1IgNi41IERJRkZVU0VPTkxZIDsKLSAgIEFOVEVOTkFTSURFQVJFQVJBVElPIDYuNSA7Ci0gICBBTlRFTk5BRElGRlNJREVBUkVBUkFUSU8gNi41IDsKLSAgIEFOVEVOTkFESUZGU0lERUFSRUFSQVRJTyBQV0wgKCAoIDUuNCA1LjQgKSAoIDYuNSA2LjUgKSAoIDcuNSA3LjUgKSApIDsKLSAgIEFOVEVOTkFDVU1TSURFQVJFQVJBVElPIDQuNSA7Ci0gICBBTlRFTk5BQ1VNU0lERUFSRUFSQVRJTyA3LjUgOwotICAgQU5URU5OQUNVTURJRkZTSURFQVJFQVJBVElPIDQuNiA7IAotICAgQU5URU5OQUNVTURJRkZTSURFQVJFQVJBVElPIFBXTCAoICggNS40IDUuNCApICggNi41IDYuNSApICggNy41IDcuNSApICkgOwotICAgQU5URU5OQVNJREVBUkVBRkFDVE9SIDYuNSA7Ci0gICBBTlRFTk5BU0lERUFSRUFGQUNUT1IgNy41IERJRkZVU0VPTkxZIDsKLSAgIEFOVEVOTkFNT0RFTCBPWElERTMgOwotICAgQU5URU5OQU1PREVMIE9YSURFNCA7Ci0gICBQUk9QRVJUWSBsc3AgInJ4bGF5IiBsaXAgMyBscnAgMS4yIDsKLSAgIENVUlJFTlRERU4gMUUzIDsKLSMgICBDVVJSRU5UREVOICggMUUzIDRFNSApIDsKLSAgIEFDQ1VSUkVOVERFTlNJVFkgUEVBSwotICAgICAgRlJFUVVFTkNZIDFFNiAxMDBFNiA7Ci0gICBUQUJMRUVOVFJJRVMgMC41RS02IDAuNEUtNiA7Ci0gICBBQ0NVUlJFTlRERU5TSVRZIEFWRVJBR0UgNS41IDsKLSAgIEFDQ1VSUkVOVERFTlNJVFkgUk1TCi0gICAgICBGUkVRVUVOQ1kgMTAwRTYgNDAwRTYgODAwRTYgOwotICAgV0lEVEggICAgIDAuNCAwLjggMTAuMCA1MC4wIDEwMC4wIDsKLSAgIFRBQkxFRU5UUklFUwotICAgICAgMi4wRS02IDEuOUUtNiAxLjhFLTYgMS43RS02IDEuNUUtNgotICAgICAgMS40RS02IDEuM0UtNiAxLjJFLTYgMS4xRS02IDEuMEUtNgotICAgICAgMC45RS02IDAuOEUtNiAwLjdFLTYgMC42RS02IDAuNEUtNiA7Ci0gICBEQ0NVUlJFTlRERU5TSVRZIEFWRVJBR0UKLSAgICAgIFdJRFRIIDIwLjAgNTAuMCA7Ci0gICBUQUJMRUVOVFJJRVMgMC42RS02IDAuNUUtNiA7Ci1FTkQgUlgKLQotTEFZRVIgQ1VUMTIKLVRZUEUgQ1VUIDsKLSAgIERJQUdQSVRDSCAxLjUgMS43IDsKLSAgIERJQUdXSURUSCAxLjYgOwotICAgRElBR1NQQUNJTkcgMC41IDsKLSAgIFNQQUNJTkcgMC43IExBWUVSIFJYIDsKLSAgIFNQQUNJTkcgMC4yMiBBREpBQ0VOVENVVFMgNCBXSVRISU4gMC4yNSA7Ci0gICBTUEFDSU5HIDEuNSBQQVJBTExFTE9WRVJMQVAgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyA1LjcKLSAgIFNQQUNJTkcgMS4yIEFESkFDRU5UQ1VUUyAyIFdJVEhJTiAxLjUgRVhDRVBUU0FNRVBHTkVUIDsgICAjIDUuNwotICAgIyA1LjQKLSAgIEFOVEVOTkFNT0RFTCBPWElERTEgOwotICAgQU5URU5OQU1PREVMIE9YSURFMiA7Ci0gICBBTlRFTk5BTU9ERUwgT1hJREUzIDsKLSAgIEFOVEVOTkFNT0RFTCBPWElERTQgOwotICAgQU5URU5OQUFSRUFGQUNUT1IgNS40IDsKLSAgIEFOVEVOTkFDVU1ST1VUSU5HUExVU0NVVCA7ICAgICAgICAgICAgIyA1LjcKLSAgIEFOVEVOTkFBUkVBTUlOVVNESUZGIDEwMC4wIDsgICAgICAgICAgIyA1LjcKLSAgIEFOVEVOTkFHQVRFUExVU0RJRkYgMi4wIDsgICAgICAgICAgICAgIyA1LjcKLSAgIEFOVEVOTkFESUZGQVJFQVJBVElPIDEwMDAgOyAgICAgICAgICAgIyA1LjcKLSAgIEFOVEVOTkFDVU1ESUZGQVJFQVJBVElPIDUwMDAgOyAgICAgICAgIyA1LjcKLSAgIEFOVEVOTkFESUZGQVJFQVJBVElPIDYuNSA7Ci0gICBBTlRFTk5BQVJFQURJRkZSRURVQ0VQV0wgKCAoIDAuMCAxLjAgKSAoIDAuMDk5OTkgMS4wICkgKCAwLjEgMC4yICkgKCAxLjAgMC4xICkgKCAxMDAwLjAgMC4xICkgKSA7ICAgICAgICAgICAgICAgICAgICAgIyA1LjcKLSAgIEFOVEVOTkFESUZGQVJFQVJBVElPIFBXTCAoICggNS40IDUuNCApICggNi41IDYuNSApICggNy41IDcuNSApICkgOwotICAgQU5URU5OQUNVTURJRkZBUkVBUkFUSU8gUFdMICggKCA1LjQgNS40ICkgKCA2LjUgNi41ICkgKCA3LjUgNy41ICkgKSA7Ci0gICBBTlRFTk5BQ1VNRElGRkFSRUFSQVRJTyA1LjYgOwotICAgQU5URU5OQUFSRUFSQVRJTyA1LjYgOwotICAgQU5URU5OQUNVTUFSRUFSQVRJTyA2LjcgOwotICAgQUNDVVJSRU5UREVOU0lUWSBQRUFLCi0gICBGUkVRVUVOQ1kgMUU2IDEwMEU2IDsKLSAgIFRBQkxFRU5UUklFUyAwLjVFLTYgMC40RS02IDsKLSAgIEFDQ1VSUkVOVERFTlNJVFkgQVZFUkFHRSA1LjUgOwotICAgQUNDVVJSRU5UREVOU0lUWSBSTVMKLSAgIEZSRVFVRU5DWSAxMDBFNiA0MDBFNiA4MDBFNiA7Ci0gICBDVVRBUkVBICAgICAwLjQgMC44IDEwLjAgNTAuMCAxMDAuMCA7Ci0gICBUQUJMRUVOVFJJRVMKLSAgICAgIDIuMEUtNiAxLjlFLTYgMS44RS02IDEuN0UtNiAxLjVFLTYKLSAgICAgIDEuNEUtNiAxLjNFLTYgMS4yRS02IDEuMUUtNiAxLjBFLTYKLSAgICAgIDAuOUUtNiAwLjhFLTYgMC43RS02IDAuNkUtNiAwLjRFLTYgOwotICAgRENDVVJSRU5UREVOU0lUWSBBVkVSQUdFCi0gICBDVVRBUkVBIDIuMCA1LjAgOyAKLSAgIFRBQkxFRU5UUklFUyAwLjVFLTYgMC40RS02IDsKLSAgIERDQ1VSUkVOVERFTlNJVFkgQVZFUkFHRSA0LjkgOwotRU5EIENVVDEyCi0KLUxBWUVSIFBDCi0gICBUWVBFIFJPVVRJTkcgOwotICAgV0lEVEggMSA7Ci0gICBXSVJFRVhURU5TSU9OIDAuNCA7ICNzaG91bGQgYmUgaWdub3JlZAotICAgUElUQ0ggMy44IDMuNSA7Ci0gICBESUFHUElUQ0ggMS40IDsKLSAgIFNQQUNJTkcgMC42IDsKLSAgIFNQQUNJTkcgMS4yIEVORE9GTElORSAxLjMgV0lUSElOIDAuNiA7ICAjIDUuNwotICAgU1BBQ0lORyAxLjMgRU5ET0ZMSU5FIDEuNCBXSVRISU4gMC43IFBBUkFMTEVMRURHRSAxLjEgV0lUSElOIDAuNSBUV09FREdFUyA7Ci0gICBTUEFDSU5HIDEuNCBFTkRPRkxJTkUgMS41IFdJVEhJTiAwLjggUEFSQUxMRUxFREdFIDEuMiBXSVRISU4gMC42IDsgICMgNS43Ci0gICBESVJFQ1RJT04gVkVSVElDQUwgOwotICAgUkVTSVNUQU5DRSBSUEVSU1EgUFdMICggKCAxIDAuMTAzICkgKCAxMCA0LjcgKSApIDsKLSAgIENBUEFDSVRBTkNFIENQRVJTUURJU1QgUFdMICggKCAxIDAuMDAwMTU2ICkgKCAxMCAwLjAwMSApICkgOwotICAgQU5URU5OQUFSRUFSQVRJTyA1LjQgOwotICAgQU5URU5OQURJRkZBUkVBUkFUSU8gNi41IDsKLSAgIEFOVEVOTkFDVU1BUkVBUkFUSU8gNy41IDsKLSAgIEFOVEVOTkFDVU1ESUZGQVJFQVJBVElPIFBXTCAoICggNS4wIDUuMSApICggNi4wIDYuMSApICkgOwotICAgQU5URU5OQUFSRUFGQUNUT1IgNC41IDsKLSAgIEFOVEVOTkFTSURFQVJFQVJBVElPIDYuNSA7Ci0gICBBTlRFTk5BRElGRlNJREVBUkVBUkFUSU8gUFdMICggKCA3LjAgNy4xICkgKCA3LjIgNy4zICkgKSA7ICAKLSAgIEFOVEVOTkFDVU1TSURFQVJFQVJBVElPIDcuNCA7Ci0gICBBTlRFTk5BQ1VNRElGRlNJREVBUkVBUkFUSU8gUFdMICggKCA4LjAgOC4xICkgKCA4LjIgOC4zICkgKCA4LjQgOC41ICkKLSAgICAgICAgKCA4LjYgOC43ICkgKSA7Ci0gICBBTlRFTk5BU0lERUFSRUFGQUNUT1IgOS4wIERJRkZVU0VPTkxZIDsKLQotICAgQUNDVVJSRU5UREVOU0lUWSBQRUFLCi0gICAgICBGUkVRVUVOQ1kgMUU2IDEwMEU2IDsKLSAgICAgIFdJRFRIIDUuNiA4LjUgOC4xIDQuNSA7Ci0gICAgICBUQUJMRUVOVFJJRVMgMC41RS02IDAuNEUtNiA7Ci0gICBEQ0NVUlJFTlRERU5TSVRZIEFWRVJBR0UKLSAgIFdJRFRIIDIwLjAgNTAuMCAxMDAuMCA7Ci0gICBUQUJMRUVOVFJJRVMgMS4wRS02IDAuN0UtNiAwLjVFLTYgOwotRU5EIFBDCi0KLUxBWUVSIENBCi0gICBUWVBFIENVVCA7Ci0gICBEQ0NVUlJFTlRERU5TSVRZIEFWRVJBR0UKLSAgIENVVEFSRUEgICAyLjAgNS4wIDEwLjAgOwotICAgVEFCTEVFTlRSSUVTIDAuNkUtNiAwLjVFLTYgMC40RS02IDsgCi1FTkQgQ0EKLQotTEFZRVIgTTEKLSAgIFRZUEUgUk9VVElORyA7Ci0gICBXSURUSCAxIDsKLSAgIFdJUkVFWFRFTlNJT04gNyA7Ci0gICBQSVRDSCAxLjggOwotICAgRElSRUNUSU9OIEhPUklaT05UQUwgOwotICAgUkVTSVNUQU5DRSBSUEVSU1EgMC4xMDMgOwotICAgQ0FQQUNJVEFOQ0UgQ1BFUlNRRElTVCAwLjAwMDE1NiA7Ci0gICBBTlRFTk5BQ1VNQVJFQVJBVElPIDMwMCA7Ci0gICBBTlRFTk5BQ1VNRElGRkFSRUFSQVRJTyA2MDAgOwotICAgQU5URU5OQUdBVEVQTFVTRElGRiAyLjAgOyAgICAgICAgICAgICAjIDUuNwotICAgQU5URU5OQURJRkZBUkVBUkFUSU8gMTAwMCA7ICAgICAgICAgICAjIDUuNwotICAgQU5URU5OQUNVTURJRkZBUkVBUkFUSU8gNTAwMCA7ICAgICAgICAjIDUuNwotICAgU1BBQ0lOR1RBQkxFCi0gICAgICBQQVJBTExFTFJVTkxFTkdUSCAwLjAwIDAuNTAgMy4wMCA1LjAwCi0gICAgICAgICBXSURUSCAwLjAwICAgICAgMC4xNSAwLjE1IDAuMTUgMC4xNQotICAgICAgICAgV0lEVEggMC4yNSAgICAgIDAuMTUgMC4yMCAwLjIwIDAuMjAKLSAgICAgICAgIFdJRFRIIDEuNTAgICAgICAwLjE1IDAuNTAgMC41MCAwLjUwCi0gICAgICAgICBXSURUSCAzLjAwICAgICAgMC4xNSAwLjUwIDEuMDAgMS4wMAotICAgICAgICAgV0lEVEggNS4wMCAgICAgIDAuMTUgMC41MCAxLjAwIDIuMDAgOwotICAgU1BBQ0lOR1RBQkxFCi0gICAgICBJTkZMVUVOQ0UKLSAgICAgICAgIFdJRFRIIDEuNSBXSVRISU4gMC41IFNQQUNJTkcgMC41Ci0gICAgICAgICBXSURUSCAzLjAgV0lUSElOIDEuMCBTUEFDSU5HIDEuMAotICAgICAgICAgV0lEVEggNS4wIFdJVEhJTiAyLjAgU1BBQ0lORyAyLjAgOwotICAgQUNDVVJSRU5UREVOU0lUWSBBVkVSQUdFIDUuNSA7Ci0gICBEQ0NVUlJFTlRERU5TSVRZIEFWRVJBR0UgNC45IDsKLUVORCBNMQotCi1MQVlFUiBWMQotICAgVFlQRSBDVVQgOwotICAgU1BBQ0lORyAwLjYgTEFZRVIgQ0EgOwotRU5EIFYxCi0KLUxBWUVSIE0yCi0gICBUWVBFIFJPVVRJTkcgOwotICAgV0lEVEggMC45IDsKLSAgIFdJUkVFWFRFTlNJT04gOCA7Ci0gICBQSVRDSCAxLjggOwotICAgU1BBQ0lORyAwLjkgOwotICAgU1BBQ0lORyAwLjI4IDsKLSAgIFNQQUNJTkcgMC4yNCBMRU5HVEhUSFJFU0hPTEQgMS4wIDsKLSAgIFNQQUNJTkcgMC4zMiBSQU5HRSAxLjAxIDkuOTkgVVNFTEVOR1RIVEhSRVNIT0xEIDsKLSAgIFNQQUNJTkcgMC41IFJBTkdFIDEwLjAgMTAwMC4wIDsKLSAgIFNQQUNJTkcgMC41IFJBTkdFIDEwLjAgMTAwMC4wIElORkxVRU5DRSAxLjAwIDsKLSAgIFNQQUNJTkcgMC41IFJBTkdFIDEwLjAgMTAwMC4wIElORkxVRU5DRSAxLjAgUkFOR0UgLjI4IDEuMCA7Ci0gICBTUEFDSU5HIDAuNSBSQU5HRSAzLjAxIDQuMCBSQU5HRSA0LjAxIDUuMCA7Ci0gICBTUEFDSU5HIDAuNCBSQU5HRSAzLjAxIDQuMCBSQU5HRSA1LjAxIDEwMDAuMCA7Ci0gICBTUEFDSU5HIDEuMCBTQU1FTkVUIFBHT05MWSA7ICAgICAgICAgICMgNS43Ci0gICBTUEFDSU5HIDEuMSBTQU1FTkVUIDsgICAgICAgICAgICAgICAgICMgNS43Ci0gICBQUk9QRVJUWSBMRUY1N19TUEFDSU5HICJTUEFDSU5HIDEuMiBFTkRPRkxJTkUgMS4zIFdJVEhJTiAwLjYgUEFSQUxMRUxFREdFIDIuMSBXSVRISU4gMS41IFRXT0VER0VTIDsiIDsKLSAgIFBST1BFUlRZIExFRjU3X1NQQUNJTkcgIlNQQUNJTkcgMS41IEVORE9GTElORSAyLjMgV0lUSElOIDEuNiBQQVJBTExFTEVER0UgMS4xIFdJVEhJTiAwLjUgOyIgOwotICAgRElSRUNUSU9OIERJQUc0NSA7Ci0gICBSRVNJU1RBTkNFIFJQRVJTUSAwLjA2MDggOwotICAgQ0FQQUNJVEFOQ0UgQ1BFUlNRRElTVCAwLjAwMDE4NCA7Ci0gICBQUk9QRVJUWSBMRUY1N19NQVhGTE9BVElOR0FSRUEgIk1BWEZMT0FUSU5HQVJFQSAxMDAwIDsiIDsKLSAgIEFOVEVOTkFNT0RFTCBPWElERTEgOwotICAgQU5URU5OQUNVTUFSRUFSQVRJTyA1MDAwIDsKLSAgIEFOVEVOTkFDVU1ESUZGQVJFQVJBVElPIDgwMDAgOwotICAgQU5URU5OQU1PREVMIE9YSURFMiA7Ci0gICBBTlRFTk5BQ1VNQVJFQVJBVElPIDUwMCA7Ci0gICBBTlRFTk5BQ1VNRElGRkFSRUFSQVRJTyA4MDAgOwotICAgQU5URU5OQU1PREVMIE9YSURFMyA7Ci0gICBBTlRFTk5BQ1VNQVJFQVJBVElPIDMwMCA7Ci0gICBBTlRFTk5BQ1VNRElGRkFSRUFSQVRJTyA2MDAgOwotRU5EIE0yCi0KLUxBWUVSIFYyCi0gICBUWVBFIENVVCA7Ci1FTkQgVjIKLQotTEFZRVIgTTMKLSAgIFRZUEUgUk9VVElORyA7Ci0gICBXSURUSCAwLjkgOwotICAgV0lSRUVYVEVOU0lPTiA4IDsKLSAgIFBJVENIIDEuOCA7Ci0gICBTUEFDSU5HIDAuOSA7Ci0gICBESVJFQ1RJT04gSE9SSVpPTlRBTCA7Ci0gICBSRVNJU1RBTkNFIFJQRVJTUSAwLjA2MDggOwotICAgQ0FQQUNJVEFOQ0UgQ1BFUlNRRElTVCAwLjAwMDE4NCA7Ci0gICBBTlRFTk5BTU9ERUwgT1hJREUzIDsKLSAgIEFOVEVOTkFDVU1BUkVBUkFUSU8gNTAwMCA7Ci0gICBBTlRFTk5BQ1VNRElGRkFSRUFSQVRJTyA4MDAwIDsKLSAgIEFOVEVOTkFNT0RFTCBPWElERTQgOwotICAgQU5URU5OQUNVTUFSRUFSQVRJTyA1MDAgOwotICAgQU5URU5OQUNVTURJRkZBUkVBUkFUSU8gODAwIDsKLSAgIEFOVEVOTkFNT0RFTCBPWElERTEgOwotICAgQU5URU5OQUNVTUFSRUFSQVRJTyAzMDAgOwotICAgQU5URU5OQUNVTURJRkZBUkVBUkFUSU8gNjAwIDsKLSAgIFBST1BFUlRZIExFRjU3X01JTlNURVAgIk1JTlNURVAgMS4wIE1BWEVER0VTIDIgOyIgOwotRU5EIE0zCi0KLUxBWUVSIE00Ci0gICBUWVBFIFJPVVRJTkcgOwotICAgUElUQ0ggNS40IDsKLSAgIFdJRFRIIDUuNCA7Ci0gICBESVJFQ1RJT04gVkVSVElDQUwgOwotICAgRElSRUNUSU9OIEhPUklaT05UQUwgOwotICAgIyAyIHZpYSBjdXRzIHJlcXVpcmVkIGZvciBtNCA+IDAuNTAgdW0gd2hlbiBjb25uZWN0aW5nIGZyb20gbTMKLSAgIE1JTklNVU1DVVQgMiBXSURUSCAwLjUwIDsKLSAgICMgMiB2aWEgY3V0cyByZXF1aXJlZCBmb3IgbTQgPiAwLjcwIHVtIHdoZW4gY29ubmVjdGluZyBmcm9tIG01Ci0gICBNSU5JTVVNQ1VUIDIgV0lEVEggMC43MCBGUk9NQkVMT1cgOwotICAgTUlOSU1VTUNVVCAzIFdJRFRIIDAuODAgV0lUSElOIDAuMyA7ICAgICAgICMgNS43Ci0gICBNSU5JTVVNQ1VUIDIgV0lEVEggMS4wMCBGUk9NQkVMT1cgTEVOR1RIIDIwLjAgV0lUSElOIDUuMCA7Ci0gICAjIDQgdmlhIGN1dHMgYXJlIHJlcXVpcmVkIGZvciBtNCA+IDEuMCB1bSB3aGVuIGNvbm5lY3RpbmcgZnJvbSBtMyBvciBtNQotICAgTUlOSU1VTUNVVCA0IFdJRFRIIDEuMCBGUk9NQUJPVkUgOwotICAgIyAyIHZpYSBjdXRzIGFyZSByZXF1aXJlZCBpZiBtNCA+IDEuMSB1bSB3aWRlIGFuZCBtNCA+IDIwLjAgdW0gbG9uZywKLSAgICMgYW5kIHRoZSB2aWEgY3V0IGlzIDwgNS4wIHVtIGF3YXkgZnJvbSB0aGUgd2lkZSB3aXJlCi0gICBNSU5JTVVNQ1VUIDIgV0lEVEggMS4xIExFTkdUSCAyMC4wIFdJVEhJTiA1LjAgOwotICAgTUlOSU1VTUNVVCAyIFdJRFRIIDEuMSBGUk9NQUJPVkUgTEVOR1RIIDIwLjAgV0lUSElOIDUuMCA7Ci0gICBNSU5FTkNMT1NFREFSRUEgMC4zMCA7ICMgZG9udXQgaG9sZSBtdXN0IGJlID49IDAuMzAgdW1eMgotICAgTUlORU5DTE9TRURBUkVBIDAuNDAgV0lEVEggMC4xNSA7ICMgaG9sZSBhcmVhID49IDAuNDAgdW1eMiB3aGVuIHc8PTAuMTUKLSAgIE1JTkVOQ0xPU0VEQVJFQSAwLjgwIFdJRFRIIDAuNTAgOyAjIGhvbGUgYXJlYSA+PSAwLjgwIHVtXjIgd2hlbiB3PD0wLjU1Ci0gICBNQVhXSURUSCAxMC4wIDsKLSAgIE1JTldJRFRIIDAuMTUgOwotICAgUFJPVFJVU0lPTldJRFRIIDAuMzAgTEVOR1RIIDAuNjAgV0lEVEggMS4yMCA7Ci0gICBNSU5TVEVQIC4yMCA7Ci1FTkQgTTQKLQotTEFZRVIgTTUKLSAgIFRZUEUgUk9VVElORyA7Ci0gICBQSVRDSCA1LjQgOwotICAgV0lEVEggNC4wIDsKLSAgIERJUkVDVElPTiBESUFHMTM1IDsKLSAgIE1JTlNURVAgMC4wNSA7Ci0gICBNSU5TVEVQIDAuMDQgOwotICAgTUlOU1RFUCAwLjA1IExFTkdUSFNVTSAwLjA4IDsKLSAgIE1JTlNURVAgMC4wNSBMRU5HVEhTVU0gMC4xNiA7Ci0gICBNSU5TVEVQIDAuMDUgSU5TSURFQ09STkVSIDsKLSAgIE1JTlNURVAgMC4wNSBJTlNJREVDT1JORVIgTEVOR1RIU1VNIDAuMTUgOwotICAgTUlOU1RFUCAxLjAgTUFYRURHRVMgMiA7ICAgICAgICAgICAgICAgICAjIDUuNwotICAgTUlOSU1VTUNVVCAyIFdJRFRIIDAuNzAgOwotICAgTUlOSU1VTUNVVCA0IFdJRFRIIDEuMCBGUk9NQUJPVkUgOwotICAgTUlOSU1VTUNVVCAyIFdJRFRIIDEuMSBMRU5HVEggMjAuMCBXSVRISU4gNS4wIDsKLSAgIE1JTklNVU1DVVQgNSBXSURUSCAwLjUgIDsKLSAgIEFOVEVOTkFNT0RFTCBPWElERTMgOwotICAgQU5URU5OQUNVTUFSRUFSQVRJTyA1MDAwIDsKLSAgIEFOVEVOTkFDVU1ESUZGQVJFQVJBVElPIDgwMDAgOwotICAgQU5URU5OQU1PREVMIE9YSURFMyA7Ci0gICBBTlRFTk5BQ1VNQVJFQVJBVElPIDUwMCA7Ci0gICBBTlRFTk5BQ1VNRElGRkFSRUFSQVRJTyA4MDAgOwotICAgQU5URU5OQU1PREVMIE9YSURFMyA7Ci0gICBBTlRFTk5BQ1VNQVJFQVJBVElPIDMwMCA7Ci0gICBBTlRFTk5BQ1VNRElGRkFSRUFSQVRJTyA2MDAgOwotRU5EIE01Ci0KLUxBWUVSIGltcGxhbnQxCi0gICBUWVBFIElNUExBTlQgOwotICAgV0lEVEggMC41MCA7Ci0gICBTUEFDSU5HIDAuNTAgOwotICAgUFJPUEVSVFkgbHJwIDUuNCA7Ci1FTkQgaW1wbGFudDEKLSAgICAgICAgCi1MQVlFUiBpbXBsYW50MgotICAgVFlQRSBJTVBMQU5UIDsKLSAgIFdJRFRIIDAuNTAgOwotICAgU1BBQ0lORyAwLjUwIDsKLSAgIFBST1BFUlRZIGxzcCAiYm90dG9tIiA7Ci1FTkQgaW1wbGFudDIKLQotTEFZRVIgVjMKLSAgIFRZUEUgQ1VUIDsKLUVORCBWMwotCi1MQVlFUiBNVAotICAgVFlQRSBST1VUSU5HIDsKLSAgIFdJRFRIIDAuOSA7Ci0gICBQSVRDSCAxLjggOwotICAgU1BBQ0lORyAwLjkgOwotICAgRElSRUNUSU9OIFZFUlRJQ0FMIDsKLSAgIFJFU0lTVEFOQ0UgUlBFUlNRIDAuMDYwOCA7Ci0gICBDQVBBQ0lUQU5DRSBDUEVSU1FESVNUIDAuMDAwMTg0IDsKLSAgIE1JTlNURVAgMC4wNSBTVEVQIDsKLSAgIE1JTlNURVAgMC4wNSBTVEVQIExFTkdUSFNVTSAwLjA4IDsKLSAgIE1JTlNURVAgMC4wNCBTVEVQIDsKLSAgIERJQUdNSU5FREdFTEVOR1RIIC4wNzUgOwotRU5EIE1UCi0KLWxheWVyIE9WRVJMQVAKLSAgIFRZUEUgT1ZFUkxBUCA7Ci0gICBQUk9QRVJUWSBsaXAgNSBsc3AgInRvcCIgOwotICAgUFJPUEVSVFkgbHJwIDUuNSBsc3AgImJvdHRvbSIgOwotRU5EIE9WRVJMQVAKLQotTEFZRVIgdmlhMTIKLSAgIFRZUEUgQ1VUIDsKLSAgIFdJRFRIIDAuMjAgOyAgICAgICAgICAgICNjdXRzIC4yMCB4IC4yMCBzcXVhcmVzCi0gICBTUEFDSU5HIDAuMTUgQ0VOVEVSVE9DRU5URVIgOyAgI3ZpYTEyIGNlbnRlci10by1jZW50ZXIgc3BhY2luZyBpcyAwLjE1Ci0gICBFTkNMT1NVUkUgQkVMT1cgLjAzIC4wMSA7ICAgICNtMTsgMC4wMyBvbiB0d28gc2lkZXMsIDAuMDEgb24gb3RoZXIgc2lkZXMKLSAgIEVOQ0xPU1VSRSBBQk9WRSAuMDUgLjAxIDsgICAgI20yOyAwLjA1IG9uIHR3byBzaWRlcywgMC4wMSBvbiBvdGhlciBzaWRlcwotICAgRU5DTE9TVVJFIEFCT1ZFIC4wNCAuMDkgOyAgICAjbTM7IDAuMDQgb24gdHdvIHNpZGVzLCAwLjA5IG9uIG90aGVyIHNpZGVzCi0gICBQUkVGRVJFTkNMT1NVUkUgQkVMT1cgMC4wNiAwLjAxIDsKLSAgIFBSRUZFUkVOQ0xPU1VSRSBBQk9WRSAwLjA4IDAuMiA7Ci0gICBSRVNJU1RBTkNFIDEwLjAgOyAgICAgICAgICAgICMxMC4wIG9obXMgcGVyIGN1dAotRU5EIHZpYTEyCi0KLUxBWUVSIG1ldGFsMQotICAgVFlQRSBST1VUSU5HIDsKLSAgIFdJRFRIIDAuOSA7Ci0gICBQSVRDSCAxLjggOwotICAgRElSRUNUSU9OIFZFUlRJQ0FMIDsKLSAgIE1JTlNJWkUgMC4xNCAwLjMwIDAuNSAwLjU2IDAuMDEgMC4wNSAgOwotRU5EIG1ldGFsMQotCi1MQVlFUiB2aWEyMwotICAgVFlQRSBDVVQgOwotICAgV0lEVEggMC4yMCA7ICAgICAgICAgICAgI2N1dHMgLjIwIHggLjIwIHNxdWFyZXMKLSAgIFNQQUNJTkcgMC4xNSA7ICAgICAgICAgICN2aWEyMyBlZGdlLXRvLWVkZ2Ugc3BhY2luZyBpcyAwLjE1Ci0gICBFTkNMT1NVUkUgLjA1IC4wMSA7ICAgICAjbTIsIG0zOjAuMDUgb24gdHdvIHNpZGVzLCAwLjAxIG9uIG90aGVyIHNpZGVzCi0gICBFTkNMT1NVUkUgLjAyIC4wMiBXSURUSCAxLjAgOyAjbTIgbmVlZHMgMC4wMiBvbiBhbGwgc2lkZXMgaWYgbTIgd2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICM+PSAxLjAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICNtMyBuZWVkcyAwLjAyIG9uIGFsbCBzaWRlcyBpZiBtMyB3aWR0aCA+PSAxLjAKLSAgIEVOQ0xPU1VSRSAuMDUgLjA1IFdJRFRIIDIuMCA7ICNtMiBuZWVkcyAwLjA1IG9uIGFsbCBzaWRlcyBpZiBtMiB3aWR0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICM+PSAyLjAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICNtMyBuZWVkcyAwLjAyIG9uIGFsbCBzaWRlcyBpZiBtMyB3aWR0aCA+PSAzLjAKLSAgIFJFU0lTVEFOQ0UgMTAuMCA7ICAgICAgICMxMC4wIG9obXMgcGVyIGN1dAotRU5EIHZpYTIzCi0KLUxBWUVSIHZpYTM0Ci0gICBUWVBFIENVVCA7Ci0gICBXSURUSCAwLjI1IDsgICAgICAgICAgICAjY3V0cyAuMjUgeCAuMjUgc3F1YXJlcwotICAgU1BBQ0lORyAwLjEwIENFTlRFUlRPQ0VOVEVSIDsgICAgICAjIDUuNwotICAgRU5DTE9TVVJFIC4wNSAuMDEgOyAgICAgI20zLCBtNCBtdXN0IG1lZXQgdGhlIGVuY2xvc3VyZSBydWxlCi0gICBFTkNMT1NVUkUgLjA1IDAuMCBMRU5HVEggMC43IDsgICAgICMgNS43Ci0gICBFTkNMT1NVUkUgQkVMT1cgLjA3IC4wNyBXSURUSCAxLjAgOyAjbTMgbmVlZHMgLjA3dW0gb24gYWxsIHNpZGVzIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdGhlIG0zIHdpZHRoIGlzID49IDEuMHVtCi0gICBFTkNMT1NVUkUgQUJPVkUgLjA5IC4wOSBXSURUSCAxLjAgOyAjbTQgbmVlZHMgLjA5dW0gb24gYWxsIHNpZGVzIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdGhlIG00IHdpZHRoIGlzID49IDEuMHVtIAotICAgRU5DTE9TVVJFIDAuMDMgMC4wMyBXSURUSCAxLjAgRVhDRVBURVhUUkFDVVQgMC4yIDsgICAjIDUuNwotICAgUkVTSVNUQU5DRSA4LjAgOyAgICAgICAgICAgICAgICAgICAgIzguMCBvaG1zIHBlciBjdXQKLUVORCB2aWEzNAotCi1MQVlFUiBjdXQyMyAgICAgICAgICAgICAgICAjIDUuNwotICAgVFlQRSBDVVQgOwotICAgU1BBQ0lORyAwLjIwIFNBTUVORVQgTEFZRVIgY3V0MTIgU1RBQ0sgOwotICAgU1BBQ0lORyAwLjMwIENFTlRFUlRPQ0VOVEVSIFNBTUVORVQgQVJFQSAwLjAyIDsKLSAgIFNQQUNJTkcgMC40MCBBUkVBIDAuNSA7Ci0gICBTUEFDSU5HIDAuMTAgOwotICAgU1BBQ0lOR1RBQkxFIE9SVEhPR09OQUwKLSAgICAgIFdJVEhJTiAwLjE1IFNQQUNJTkcgMC4xMQotICAgICAgV0lUSElOIDAuMTMgU1BBQ0lORyAwLjEzCi0gICAgICBXSVRISU4gMC4xMSBTUEFDSU5HIDAuMTUgOwotICAgQVJSQVlTUEFDSU5HIExPTkdBUlJBWSBDVVRTUEFDSU5HIDAuMgotICAgICAgQVJSQVlDVVRTIDMgU1BBQ0lORyAxLjAKLSAgICAgIEFSUkFZQ1VUUyA0IFNQQUNJTkcgMS41Ci0gICAgICBBUlJBWUNVVFMgNSBTUEFDSU5HIDIuMCA7Ci1FTkQgY3V0MjMKLQotTEFZRVIgY3V0MjQgICAgICAgICAgICAgICAgIyA1LjcKLSAgIFRZUEUgUk9VVElORyA7Ci0gICBXSURUSCAxIDsKLSAgIFBJVENIIDEuOCA7Ci0gICBESVJFQ1RJT04gSE9SSVpPTlRBTCA7Ci0gICBTUEFDSU5HIDAuMTAgOwotICAgU1BBQ0lORyAwLjEyIE5PVENITEVOR1RIIDAuMTUgOwotICAgU1BBQ0lORyAwLjE0IEVORE9GTk9UQ0hXSURUSCAwLjE1IE5PVENIU1BBQ0lORyAwLjE2IE5PVENITEVOR1RIIDAuMDggOwotICAgQVJSQVlTUEFDSU5HIFdJRFRIIDIuMCBDVVRTUEFDSU5HIDAuMiBBUlJBWUNVVFMgMyBTUEFDSU5HIDEuMCA7Ci1FTkQgY3V0MjQKLQotTEFZRVIgY3V0MjUgICAgICAgICAgICAgICAgIyA1LjcKLSAgIFRZUEUgUk9VVElORyA7Ci0gICBXSURUSCAxIDsKLSAgIFdJUkVFWFRFTlNJT04gNyA7Ci0gICBQSVRDSCAxLjggOwotICAgRElSRUNUSU9OIEhPUklaT05UQUwgOwotICAgU1BBQ0lOR1RBQkxFCi0gICAgICBUV09XSURUSFMKLSAgICAgICAgIFdJRFRIIDAuMDAgICAgICAgICAgMC4xNSAwLjIwIDAuNTAgMS4wMAotICAgICAgICAgV0lEVEggMC4yNSBQUkwgMC4wICAwLjIwIDAuMjUgMC41MCAxLjAwCi0gICAgICAgICBXSURUSCAxLjUwIFBSTCAxLjUwIDAuNTAgMC41MCAwLjYwIDEuMDAKLSAgICAgICAgIFdJRFRIIDMuMDAgUFJMIDMuMDAgMS4wMCAxLjAwIDEuMDAgMS4yMCA7Ci1FTkQgY3V0MjUKLQotTUFYVklBU1RBQ0sgNCBSQU5HRSBtMSBtNyA7Ci0KLSNsYXllciBWSVJUVUFMCi0jICAgVFlQRSBPVklSVFVBTCA7Ci0jRU5EIFZJUlRVQUwKLQotVklBIElOMVgKLSAgIFRPUE9GU1RBQ0tPTkxZIAotICAgRk9SRUlHTiBJTjFYIDsKLSAgIFJFU0lTVEFOQ0UgMiA7Ci0gICBMQVlFUiBSWCA7IFJFQ1QgLTAuNyAtMC43IDAuNyAwLjcgOyBSRUNUIDAuMCAwIDIuMSAyLjMgOyBSRUNUIDUuNyAwIDk1LjcgMi4zIDsgUkVDVCAxMDEuOSAwIDExOS42IDIuMyA7Ci0gICBMQVlFUiBDVVQxMiA7Ci0gICAgICBSRUNUIC0wLjI1IC0wLjI1IDAuMjUgMC4yNSA7Ci0gICBMQVlFUiBQQyA7Ci0gICAgICBSRUNUIC0wLjYgLTAuNiAwLjYgMC42IDsKLSAgIFBST1BFUlRZIHN0cmluZ1Byb3BlcnR5ICJERUZBVUxUIiByZWFsUHJvcGVydHkgMzIuMzMgQ09VTlQgMzQgOwotRU5EIElOMVgKLQotVklBIE0xX00yIERFRkFVTFQKLSAgIFJFU0lTVEFOQ0UgMS41IDsKLSAgIExBWUVSIE0xIDsKLSAgICAgIFJFQ1QgTUFTSyAxIC0wLjYgLTAuNiAwLjYgMC42IDsKLSAgIExBWUVSIFYxIDsKLSAgICAgIFJFQ1QgTUFTSyAyIC0wLjQ1IC0wLjQ1IDAuNDUgMC40NSA7Ci0gICBMQVlFUiBNMiA7Ci0gICAgICBSRUNUIE1BU0sgMyAtMC40NSAtMC40NSAwLjQ1IDAuNDUgOwotICAgICAgUkVDVCBNQVNLIDEgLTAuOSAtMC40NSAwLjkgMC40NSA7Ci1FTkQgTTFfTTIKLQotVklBIE0yX00zIERFRkFVTFQKLSAgIFJFU0lTVEFOQ0UgMS41IDsKLSAgIExBWUVSIE0yIDsKLSAgICAgIFJFQ1QgLTAuNDUgLTAuOSAwLjQ1IDAuOSA7Ci0gICBMQVlFUiBWMiA7Ci0gICAgICBSRUNUIC0wLjQ1IC0wLjQ1IDAuNDUgMC40NSA7Ci0gICBMQVlFUiBNMyA7Ci0gICAgICBSRUNUIC0wLjQ1IC0wLjQ1IDAuNDUgMC40NSA7Ci1FTkQgTTJfTTMKLQotVklBIE0yX00zX1BXUiBHRU5FUkFURUQKLSAgIFJFU0lTVEFOQ0UgMC40IDsKLSAgIExBWUVSIE0yIDsKLSAgICAgIFJFQ1QgLTEuMzUgLTEuMzUgMS4zNSAxLjM1IDsKLSAgIExBWUVSIFYyIDsKLSAgICAgIFJFQ1QgLTEuMzUgLTEuMzUgLTAuNDUgMS4zNSA7Ci0gICAgICBSRUNUIDAuNDUgLTEuMzUgMS4zNSAtMC40NSA7Ci0gICAgICBSRUNUIDAuNDUgMC40NSAxLjM1IDEuMzUgOwotICAgTEFZRVIgTTMgOwotICAgICAgUkVDVCAtMS4zNSAtMS4zNSAxLjM1IDEuMzUgOwotRU5EIE0yX00zX1BXUgotCi1WSUEgTTNfTVQgREVGQVVMVAotICAgUkVTSVNUQU5DRSAxLjUgOwotICAgTEFZRVIgTTMgOwotICAgICAgUkVDVCBNQVNLIDEgLTAuOSAtMC40NSAwLjkgMC40NSA7Ci0gICBMQVlFUiBWMyA7Ci0gICAgICBSRUNUIE1BU0sgMiAtMC40NSAtMC40NSAwLjQ1IDAuNDUgOwotICAgTEFZRVIgTVQgOwotICAgICAgUkVDVCBNQVNLIDMgLTAuNDUgLTAuNDUgMC40NSAwLjQ1IDsKLUVORCBNM19NVAotCi1WSUEgbXlCbG9ja1ZpYTAKLSAgIFZJQVJVTEUgdmlhTmFtZTAgOwotICAgQ1VUU0laRSAwLjEgMC4xIDsKLSAgIExBWUVSUyBtZXRhbDEgdmlhMTIgbWV0YWwyIDsKLSAgIENVVFNQQUNJTkcgMC4xIDAuMSA7Ci0gICBFTkNMT1NVUkUgMC4wNSAwLjAxIDAuMDEgMC4wNSA7Ci0gICBST1dDT0wgNSAxNCA7Ci0gICBQQVRURVJOIDJfRkY3MF8zX1I0RiA7Ci1FTkQgbXlCbG9ja1ZpYTAKLQotVklBIFZJQUNFTlRFUjEyCi0gICBMQVlFUiBNMSA7Ci0gICAgICBSRUNUIC00LjYgLTIuMiA0LjYgMi4yIDsKLSAgIExBWUVSIFYxIDsKLSAgICAgIFJFQ1QgLTMuMSAtMC44IC0xLjkgMC44IDsKLSAgICAgIFJFQ1QgMS45IC0wLjggMy4xIDAuOCA7Ci0gICBMQVlFUiBNMiA7Ci0gICAgICBSRUNUIC00LjQgLTIuMCA0LjQgMi4wIDsKLSAgIFJFU0lTVEFOQ0UgMC4yNCA7IAotRU5EIFZJQUNFTlRFUjEyCi0KLVZJQSBNMl9UVVJOIAotICAgTEFZRVIgTTIgOwotICAgICAgUkVDVCAtMC40NSAtMC40NSAwLjQ1IDAuNDUgOwotICAgICAgUkVDVCAtNC40IC0yLjAgNC40IDIuMCA7Ci1FTkQgTTJfVFVSTgotCi1WSUEgbXlWaWEyMwotICAgTEFZRVIgbWV0YWwyIDsKLSAgICAgIFBPTFlHT04gTUFTSyAxIC0yLjEgLTEuMCAtMC4yIDEuMCAyLjEgMS4wIDAuMiAtMS4wIDsKLSAgICAgIFBPTFlHT04gTUFTSyAyIC0xLjEgLTIuMCAtMC4xIDIuMCAxLjEgMi4wIDAuMSAtMi4wIDsKLSAgICAgIFBPTFlHT04gTUFTSyAzIC0zLjEgLTIuMCAtMC4zIDIuMCAzLjEgMi4wIDAuMyAtMi4wIDsKLSAgICAgIFBPTFlHT04gTUFTSyAxIC00LjEgLTIuMCAtMC40IDIuMCA0LjEgMi4wIDAuNCAtMi4wIDsKLSAgIExBWUVSIGN1dDIzIDsKLSAgICAgIFJFQ1QgTUFTSyAyIC0wLjQgLTAuNCAwLjQgMC40IDsKLSAgICAgIFBPTFlHT04gTUFTSyAzIC0yLjEgLTEuMCAtMC4yIDEuMCAyLjEgMS4wIDAuMiAtMS4wIDsKLSAgIExBWUVSIG1ldGFsMyA7Ci0gICAgICBQT0xZR09OIE1BU0sgMSAtMC4yIC0xLjAgLTIuMSAxLjAgMC4yIDEuMCAyLjEgLTEuMCA7Ci0gICBMQVlFUiBjdXQzMyA7Ci0gICAgICBSRUNUIE1BU0sgMSAtMC40IC0wLjQgMC40IDAuNCA7Ci0gICAgICBQT0xZR09OIE1BU0sgMiAtMi4xIC0xLjAgLTAuMiAxLjAgMi4xIDEuMCAwLjIgLTEuMCA7Ci0gICAgICBQT0xZR09OIE1BU0sgMiAtMS4xIC0yLjAgLTAuMSAyLjAgMS4xIDIuMCAwLjEgLTIuMCA7Ci0gICAgICBSRUNUIE1BU0sgMSAtMC41IC0wLjUgMC41IDAuNSA7Ci0gICAgICBSRUNUIE1BU0sgMiAtMC4zIC0wLjMgMC4zIDAuMyA7Ci0gICAgICBQT0xZR09OIE1BU0sgMyAtMy4xIC0yLjAgLTAuMyAyLjAgMy4xIDIuMCAwLjMgLTIuMCA7Ci0gICAgICBQT0xZR09OIE1BU0sgMSAtNC4xIC0yLjAgLTAuNCAyLjAgNC4xIDIuMCAwLjQgLTIuMCA7Ci0gICAgICBSRUNUIE1BU0sgMSAtMC4yIC0wLjIgMC4yIDAuMiA7Ci0gICAgICBSRUNUIE1BU0sgMiAtMC4xIC0wLjEgMC4xIDAuMSA7Ci1FTkQgbXlWaWEyMwotCi1WSUEgbXlCbG9ja1ZpYQotICAgVklBUlVMRSBERUZBVUxUIDsKLSAgIENVVFNJWkUgMC4xIDAuMSA7Ci0gICBMQVlFUlMgbWV0YWwxIHZpYTEyIG1ldGFsMiA7Ci0gICBDVVRTUEFDSU5HIDAuMSAwLjEgOwotICAgRU5DTE9TVVJFIDAuMDUgMC4wMSAwLjAxIDAuMDUgOwotICAgT1JJR0lOIC4xIC4yIDsKLSAgIE9GRlNFVCA1LjEgNC4xIDMuMSAyLjEgOwotICAgUk9XQ09MIDEgMiA7Ci1FTkQgbXlCbG9ja1ZpYQotCi1WSUFSVUxFIFZJQUxJU1QxMgotICAgTEFZRVIgTTEgOwotICAgICAgRElSRUNUSU9OIFZFUlRJQ0FMIDsKLSMgICAgICBPVkVSSEFORyA0LjUgOwotICAgICAgV0lEVEggOS4wIFRPIDkuNiA7Ci0jICAgICAgTUVUQUxPVkVSSEFORyAwLjQgOwotICAgTEFZRVIgTTIgOwotICAgICAgRElSRUNUSU9OIEhPUklaT05UQUwgOwotICAgICAgV0lEVEggMy4wIFRPIDMuMCA7Ci0jICAgICAgTUVUQUxPVkVSSEFORyAwLjMgOwotICAgVklBIFZJQUNFTlRFUjEyIDsKLSAgIFBST1BFUlRZIHZyc3AgIm5ldyIgdnJpcCAxIHZycnAgNC41IDsKLUVORCBWSUFMSVNUMTIKLQotVklBUlVMRSBWSUFMSVNUMQotICAgTEFZRVIgTTEgOwotICAgICAgRElSRUNUSU9OIFZFUlRJQ0FMIDsKLSAgICAgIFdJRFRIIDkuMCBUTyA5LjYgOwotIyAgICAgIE9WRVJIQU5HIDQuNSA7Ci0jICAgICAgTUVUQUxPVkVSSEFORyAwLjUgOwotICAgTEFZRVIgTTEgOwotICAgICAgRElSRUNUSU9OIEhPUklaT05UQUwgOwotICAgICAgV0lEVEggMy4wIFRPIDMuMCA7Ci0jICAgICAgT1ZFUkhBTkcgNS41IDsKLSMgICAgICBNRVRBTE9WRVJIQU5HIDAuNiA7Ci0jICAgVklBIFZJQUNFTlRFUjEyIDsKLUVORCBWSUFMSVNUMQotIAotCi1WSUFSVUxFIFZJQUdFTjEyIEdFTkVSQVRFIAotICAgTEFZRVIgTTEgOwotICAgICAgRElSRUNUSU9OIFZFUlRJQ0FMIDsKLSAgICAgIFdJRFRIIDAuMSBUTyAxOSA7Ci0gICAgICBPVkVSSEFORyAxLjQgOwotICAgICAgTUVUQUxPVkVSSEFORyAxLjAgOwotICAgTEFZRVIgTTIgOwotICAgICAgRElSRUNUSU9OIEhPUklaT05UQUwgOwotICAgICAgT1ZFUkhBTkcgMS41IDsKLSAgICAgIE1FVEFMT1ZFUkhBTkcgMS4wIDsKLSAgICAgIFdJRFRIIDAuMiBUTyAxLjkgOwotICAgTEFZRVIgTTMgOwotICAgICAgUkVDVCAtMC4zIC0wLjMgMC4zIDAuMyA7Ci0gICAgICBTUEFDSU5HIDUuNiBCWSA3LjAgOwotICAgICAgUkVTSVNUQU5DRSAwLjUgOyAKLSAgIFBST1BFUlRZIHZyc3AgIm5ldyIgdnJpcCAxIHZycnAgNS41IDsKLUVORCBWSUFHRU4xMgotCi1WSUFSVUxFIFZJQUdFTjEgR0VORVJBVEUgCi0gICBMQVlFUiBNMSA7Ci0gICAgICBESVJFQ1RJT04gSE9SSVpPTlRBTCA7Ci0gICAgICBPVkVSSEFORyAxLjQgOwotICAgICAgTUVUQUxPVkVSSEFORyAxLjEgOwotICAgICAgV0lEVEggMC4xIFRPIDEuOSA7Ci0gICBMQVlFUiBNMiA7Ci0gICAgICBESVJFQ1RJT04gVkVSVElDQUwgOwotICAgICAgT1ZFUkhBTkcgMS41IDsKLSAgICAgIE1FVEFMT1ZFUkhBTkcgMS41IDsKLSAgICAgIFdJRFRIIDAuMiBUTyAyLjkgOwotIyAgIExBWUVSIE0zIDsKLSMgICAgICBSRUNUICggMSAxICkgKCAxIDEgKSA7Ci0jICAgICAgU1BBQ0lORyAwLjMgQlkgNC41IDsKLSAgIFBST1BFUlRZIHZyc3AgIm5ldyIgdnJpcCAxIHZycnAgNS41IDsKLUVORCBWSUFHRU4xCi0KLVZJQVJVTEUgdmlhMTAgR0VORVJBVEUKLSAgIExBWUVSIE0xIDsKLSAgICAgIERJUkVDVElPTiBIT1JJWk9OVEFMIDsKLSAgICAgIE9WRVJIQU5HIDEuMSA7Ci0gICAgICBXSURUSCAwLjEgVE8gMS45IDsKLSAgIExBWUVSIE0yIDsKLSAgICAgIERJUkVDVElPTiBWRVJUSUNBTCA7Ci0gICAgICBPVkVSSEFORyAxLjIgOwotICAgICAgV0lEVEggMC4yIFRPIDIuOSA7Ci0gICBMQVlFUiBNMyA7Ci0gICAgICBSRUNUICggMSAxICkgKCAxIDEgKSA7Ci0gICAgICBTUEFDSU5HIDAuMyBCWSA0LjUgOwotICAgUFJPUEVSVFkgdnJzcCAibmV3IiB2cmlwIDEgdnJycCA1LjUgOwotRU5EIHZpYTEwCi0KLVZJQVJVTEUgdmlhMTEgR0VORVJBVEUKLSAgIExBWUVSIE0xIDsKLSAgICAgIERJUkVDVElPTiBIT1JJWk9OVEFMIDsKLSAgICAgIFdJRFRIIDAuMSBUTyAxLjkgOwotICAgTEFZRVIgTTIgOwotICAgICAgRElSRUNUSU9OIFZFUlRJQ0FMIDsKLSAgICAgIFdJRFRIIDAuMiBUTyAyLjkgOwotICAgTEFZRVIgTTMgOwotICAgICAgUkVDVCAoIDEgMSApICggMSAxICkgOwotICAgICAgU1BBQ0lORyAwLjMgQlkgNC41IDsKLSAgIFBST1BFUlRZIHZyc3AgIm5ldyIgdnJpcCAxIHZycnAgNS41IDsKLUVORCB2aWExMQotCi1WSUFSVUxFIHZpYTEyIEdFTkVSQVRFIERFRkFVTFQKLSAgIExBWUVSIG0xIDsKLSAgICAgIEVOQ0xPU1VSRSAwLjAzIDAuMDEgOyAgICAjIDIgc2lkZXMgbmVlZCA+PSAwLjAzLCAyIG90aGVyIHNpZGVzID49IDAuMDEKLSAgIExBWUVSIG0yIDsKLSAgICAgIEVOQ0xPU1VSRSAwLjA1IDAuMDEgOyAgICAjIDIgc2lkZXMgbmVlZCA+PSAwLjA1LCAyIG90aGVyIHNpZGVzID49IDAuMDEKLSAgIExBWUVSIGN1dDEyIDsKLSAgICAgIFJFQ1QgLTAuMSAtMC4xIDAuMSAwLjEgOyAjIGN1dCBpcyAuMjAgYnkgLjIwCi0gICAgICBTUEFDSU5HIDAuNDAgQlkgMC40MCA7ICAgIyBjZW50ZXItdG8tY2VudGVyIHNwYWNpbmcKLSAgICAgIFJFU0lTVEFOQ0UgMjAgOyAgICAgICAgICAjIG9obXMgcGVyIGN1dAotRU5EIHZpYTEyCi0KLVZJQVJVTEUgdmlhMTMgR0VORVJBVEUKLSAgIExBWUVSIG0xIDsKLSAgICAgIEVOQ0xPU1VSRSAwLjA1IDAuMDA1IDsgIyAyIHNpZGVzIG5lZWQgPj0gMC4wNSwgMiBvdGhlciBzaWRlcyA+PSAwLjAwNQotICAgICAgV0lEVEggMS4wIFRPIDEwMC4wIDsgICAjIGZvciBtMSBiZXR3ZWVuIDEgdG8gMTAwIHVtIHdpZGUKLSAgIExBWUVSIG0yIDsKLSAgICAgIEVOQ0xPU1VSRSAwLjA1IDAuMDA1IDsgIyAyIHNpZGVzIG5lZWQgPj0gMC4wNSwgMiBvdGhlciBzaWRlcyA+PSAwLjAwNQotICAgICAgV0lEVEggMS4wIFRPIDEwMC4wIDsgICAjIGZvciBtMSBiZXR3ZWVuIDEgdG8gMTAwIHVtIHdpZGUKLSAgIExBWUVSIGN1dDEyIDsKLSAgICAgIFJFQ1QgLTAuMDcgLTAuMDcgMC4wNyAwLjA3IDsgIyBjdXQgaXMgLjE0IGJ5IC4xNAotICAgICAgU1BBQ0lORyAwLjE2IEJZIDAuMTYgOwotRU5EIHZpYTEzCi0KLQotVklBUlVMRSB2aWExNAotICAgTEFZRVIgbTEgOwotICAgICAgRElSRUNUSU9OIEhPUklaT05UQUwgOwotIyAgICAgIEVOQ0xPU1VSRSAwLjA1IDAuMDA1IDsgIDIgc2lkZXMgbmVlZCA+PSAwLjA1LCAyIG90aGVyIHNpZGVzID49IDAuMDA1Ci0gICAgICBXSURUSCAxLjAgVE8gMTAwLjAgOyAgICMgZm9yIG0xIGJldHdlZW4gMSB0byAxMDAgdW0gd2lkZQotICAgTEFZRVIgbTIgOwotIyAgICAgIEVOQ0xPU1VSRSAwLjA1IDAuMDA1IDsgIDIgc2lkZXMgbmVlZCA+PSAwLjA1LCAyIG90aGVyIHNpZGVzID49IDAuMDA1Ci0gICAgICBESVJFQ1RJT04gVkVSVElDQUwgOwotICAgICAgV0lEVEggMS4wIFRPIDEwMC4wIDsgICAjIGZvciBtMSBiZXR3ZWVuIDEgdG8gMTAwIHVtIHdpZGUKLSAgIHZpYSBuYW1lMSA7Ci1FTkQgdmlhMTQKLQotVklBUlVMRSBUVVJOTTMgR0VORVJBVEUKLSAgIExBWUVSIG0zIDsKLSAgICAgIERJUkVDVElPTiBWRVJUSUNBTCA7Ci0gICBMQVlFUiBtMyA7Ci0gICAgICBESVJFQ1RJT04gSE9SSVpPTlRBTCA7Ci1FTkQgVFVSTk0zCi0KLVZJQVJVTEUgVklBR0VOM1QgR0VORVJBVEUKLSAgIExBWUVSIG0zIDsKLSAgICAgIERJUkVDVElPTiBIT1JJWk9OVEFMIDsKLSAgICAgIE9WRVJIQU5HIDAuMiA7Ci0gICAgICBNRVRBTE9WRVJIQU5HIDAuMCA7Ci0gICBMQVlFUiB2MyA7Ci0gICAgICBSRUNUIC0wLjQ1IC0wLjQ1IDAuNDUgMC40NSA7Ci0gICAgICBTUEFDSU5HIDEuODAgYnkgMS44MCA7Ci0gICBMQVlFUiBtdCA7Ci0gICAgICBESVJFQ1RJT04gVkVSVElDQUwgOwotICAgICAgT1ZFUkhBTkcgMC4yIDsKLSAgICAgIE1FVEFMT1ZFUkhBTkcgMC4wIDsKLUVORCBWSUFHRU4zVAotCi1OT05ERUZBVUxUUlVMRSBSVUxFMQotICAgTEFZRVIgUlgKLSAgICAgIFdJRFRIIDEwLjAgOwotICAgICAgU1BBQ0lORyAyLjIgOwotICAgICAgV0lSRUVYVEVOU0lPTiA2IDsKLSAgICAgIFJFU0lTVEFOQ0UgUlBFUlNRIDYuNSA7Ci0gICAgICBDQVBBQ0lUQU5DRSBDUEVSU1FESVNUIDYuNSA7Ci0gICAgICBFREdFQ0FQQUNJVEFOQ0UgNi41IDsKLSAgIEVORCBSWAotICAgTEFZRVIgUEMKLSAgICAgIFdJRFRIIDEwLjAgOwotICAgICAgU1BBQ0lORyAyLjIgOwotICAgICAgQ0FQQUNJVEFOQ0UgQ1BFUlNRRElTVCA2LjUgOwotICAgRU5EIFBDCi0KLSAgIExBWUVSIE0xCi0gICAgICBXSURUSCAxMC4wIDsKLSAgICAgIFNQQUNJTkcgMi4yIDsKLSAgICAgIFJFU0lTVEFOQ0UgUlBFUlNRIDYuNSA7Ci0gICBFTkQgTTEKLQotICAgTEFZRVIgZncKLSAgICAgIFdJRFRIIDQuODAwIDsKLSAgICAgIFNQQUNJTkcgNC44MDAgOwotICAgRU5EIGZ3Ci0gICAgIAotICAgVklBIG5kMVZJQVJYMAotICAgICAgREVGQVVMVAotICAgICAgVE9QT0ZTVEFDS09OTFkKLSAgICAgIEZPUkVJR04gSU4xWCA7Ci0gICAgICBSRVNJU1RBTkNFIDAuMiA7Ci0gICAgICBQUk9QRVJUWSByZWFsUHJvcGVydHkgMi4zIDsKLSAgICAgIExBWUVSIFJYIDsKLSAgICAgICAgIFJFQ1QgLTMgLTMgMyAzIDsKLSAgICAgIExBWUVSIENVVDEyIDsKLSAgICAgICAgIFJFQ1QgLTEuMCAtMS4wIDEuMCAxLjAgOwotICAgICAgTEFZRVIgUEMgOwotICAgICAgICAgUkVDVCAtMyAtMyAzIDMgOwotICAgRU5EIG5kMVZJQVJYMAotCi0gICBWSUEgbmQxVklBMDEKLSAgICAgIEZPUkVJR04gSU4xWCA1LjYgNS4zIEUgOwotICAgICAgUkVTSVNUQU5DRSAwLjIgOwotICAgICAgTEFZRVIgUEMgOwotICAgICAgICAgUkVDVCAtMyAtMyAzIDMgOwotICAgICAgICAgUkVDVCAtNSAtNSA1IDUgOwotICAgICAgTEFZRVIgQ0EgOwotICAgICAgICAgUkVDVCAtMS4wIC0xLjAgMS4wIDEuMCA7Ci0gICAgICBMQVlFUiBNMSA7Ci0gICAgICAgICBSRUNUIC0zIC0zIDMgMyA7Ci0gICBFTkQgbmQxVklBMDEKLQotICAgVklBIG5kMVZJQTEyCi0gICAgICBSRVNJU1RBTkNFIDAuMiA7Ci0gICAgICBMQVlFUiBNMSA7Ci0gICAgICAgICBSRUNUIC0zIC0zIDMgMyA7Ci0gICAgICBMQVlFUiBWMSA7Ci0gICAgICAgICBSRUNUIC0xLjAgLTEuMCAxLjAgMS4wIDsKLSAgICAgIExBWUVSIE0yIDsKLSAgICAgICAgIFJFQ1QgLTMgLTMgMyAzIDsKLSAgIEVORCBuZDFWSUExMgotICAgICAgICAKLSAgIFNQQUNJTkcKLSAgICAgIFNBTUVORVQKLSAgICAgIENVVDAxIFJYIDAuMSBTVEFDSyA7Ci0gICBFTkQgU1BBQ0lORwotICAgUFJPUEVSVFkgbmRyc3AgInNpbmdsZSIgbmRyaXAgMSBuZHJycCA2LjcgOwotRU5EIFJVTEUxCi0KLU5PTkRFRkFVTFRSVUxFIHdpZGUxXzV4Ci0gICBMQVlFUiBtZXRhbDEKLSAgICAgIFdJRFRIIDEuNSA7ICAgICMgbWV0YWwxIGhhcyAxLjV1bSB3aWR0aAotICAgRU5EIG1ldGFsMQotICAgTEFZRVIgbWV0YWwyCi0gICAgICBXSURUSCAxLjUgOwotICAgRU5EIG1ldGFsMgotICAgTEFZRVIgbWV0YWwzCi0gICAgICBXSURUSCAxLjUgOwotICAgRU5EIG1ldGFsMwotRU5EIHdpZGUxXzV4Ci0KLU5PTkRFRkFVTFRSVUxFIHdpZGUzeAotICAgTEFZRVIgbWV0YWwxCi0gICAgICBXSURUSCAzLjAgOyAgICMgbWV0YWwxIGhhcyAzLjB1bSB3aWR0aAotICAgRU5EIG1ldGFsMQotICAgTEFZRVIgbWV0YWwyCi0gICAgICBXSURUSCAzLjAgOwotICAgRU5EIG1ldGFsMgotICAgTEFZRVIgbWV0YWwzCi0gICAgICBXSURUSCAzLjAgOwotICAgRU5EIG1ldGFsMwotICAgI3ZpYTEycnVsZSBhbmQgdmlhMjNydWxlIGFyZSB1c2VkIGltcGxpY2l0bHkKLSAgIE1JTkNVVFMgY3V0MTIgMiA7ICMgYXQgbGVhc3QgdHdvLWN1dCB2aWFzIGZvciBjdXQxMiByZXF1aXJlZAotICAgTUlOQ1VUUyBjdXQyMyAyIDsKLUVORCB3aWRlM3gKLQotTk9OREVGQVVMVFJVTEUgYW5hbG9nX3J1bGUKLSAgIEhBUkRTUEFDSU5HIDsgICAgICMgZG9uJ3QgbGV0IGFueSBvdGhlciBzaWduYWwgY2xvc2UgdG8gdGhpcyBvbmUKLSAgIExBWUVSIG1ldGFsMQotICAgICAgV0lEVEggMS41IDsgICAjIG1ldGFsMSBoYXMgMS41dW0gd2lkdGgKLSAgICAgIFNQQUNJTkcgMy4wIDsgIyBleHRyYSBzcGFjaW5nIG9mIDMuMHVtCi0gICAgICBESUFHV0lEVEggNS41IDsKLSAgIEVORCBtZXRhbDEKLSAgIExBWUVSIG1ldGFsMgotICAgICAgV0lEVEggMS41IDsKLSAgICAgIFNQQUNJTkcgMy4wIDsKLSAgIEVORCBtZXRhbDIKLSAgIExBWUVSIG1ldGFsMwotICAgICAgV0lEVEggMS41IDsKLSAgICAgIFNQQUNJTkcgMy4wIDsKLSAgIEVORCBtZXRhbDMKLSAgICN1c2UgcHJlLWRlZmluZWQgImFuYWxvZyB2aWFzIgotICAgI3RoZSBERUZBVUxUIFZJQVJVTEVzIHdpbGwgTk9UIGJlIGluaGVyaXRlZAotICAgVVNFVklBIHZpYTEyX2ZpeGVkX2FuYWxvZ192aWEgOwotICAgVVNFVklBIHZpYTIzX2ZpeGVkX2FuYWxvZ192aWEgOwotICAgVVNFVklBUlVMRSB2aWFydWxlMTRfZml4ZWRfYW5hbG9nIDsKLUVORCBhbmFsb2dfcnVsZQotCi1OT05ERUZBVUxUUlVMRSBjbG9jazEKLSAgIExBWUVSIG1ldGFsMQotICAgICAgV0lEVEggMS41IDsgICAgIyBtZXRhbDEgaGFzIDEuNXVtIHdpZHRoCi0gICBFTkQgbWV0YWwxCi0gICBMQVlFUiBtZXRhbDIKLSAgICAgV0lEVEggMS41IDsKLSAgIEVORCBtZXRhbDIKLSAgIExBWUVSIG1ldGFsMwotICAgICBXSURUSCAxLjUgOwotICAgRU5EIG1ldGFsMwotRU5EIGNsb2NrMQotTk9OREVGQVVMVFJVTEUgY2xvY2syCi0gICBMQVlFUiBtZXRhbDEKLSAgICAgIFdJRFRIIDEuNSA7ICAgICMgbWV0YWwxIGhhcyAxLjV1bSB3aWR0aAotICAgRU5EIG1ldGFsMQotICAgTEFZRVIgbWV0YWwyCi0gICAgICBXSURUSCAxLjUgOwotICAgRU5EIG1ldGFsMgotICAgTEFZRVIgbWV0YWwzCi0gICAgICBXSURUSCAxLjUgOwotICAgRU5EIG1ldGFsMwotRU5ECi1OT05ERUZBVUxUUlVMRSBjbG9jawotICAgTEFZRVIgbWV0YWwxCi0gICAgICBXSURUSCAxLjUgOyAgICAjIG1ldGFsMSBoYXMgMS41dW0gd2lkdGgKLSAgIEVORCBtZXRhbDEKLSAgIExBWUVSIG1ldGFsMgotICAgICAgV0lEVEggMS41IDsKLSAgIEVORCBtZXRhbDIKLSAgIExBWUVSIG1ldGFsMwotICAgICAgV0lEVEggMS41IDsKLSAgIEVORCBtZXRhbDMKLUVORCBjbG9jawotCi1VTklWRVJTQUxOT0lTRU1BUkdJTiAwLjEgMjAgOwotRURHRVJBVEVUSFJFU0hPTEQxIDAuMSA7Ci1FREdFUkFURVRIUkVTSE9MRDIgMC45IDsKLUVER0VSQVRFU0NBTEVGQUNUT1IgMS4wIDsKLQotTk9JU0VUQUJMRSAxIDsKLSAgIEVER0VSQVRFIDIwIDsKLSAgIE9VVFBVVFJFU0lTVEFOQ0UgMyA7Ci0gICBWSUNUSU1MRU5HVEggMjUgOwotICAgVklDVElNTk9JU0UgMTAgOwotIyAgIENPUlJFQ1RJT05GQUNUT1IgMyA7Ci0jICAgT1VUUFVUUkVTSVNUQU5DRSA1IDsKLUVORCBOT0lTRVRBQkxFCi0KLSNDT1JSRUNUSU9OVEFCTEUgMSA7Ci0jICAgRURHRVJBVEUgMjAgOwotIyAgIE9VVFBVVFJFU0lTVEFOQ0UgMyA7Ci0jICAgVklDVElNTEVOR1RIIDI1IDsKLSMgICBDT1JSRUNUSU9ORkFDVE9SIDEwLjUgOwotIyAgIE9VVFBVVFJFU0lTVEFOQ0UgNS40IDsKLSNFTkQgQ09SUkVDVElPTlRBQkxFCi0KLVNQQUNJTkcKLSAgIFNBTUVORVQgQ1VUMDEgQ0EgMS41IDsKLSAgIFNBTUVORVQgQ0EgVjEgMS41IFNUQUNLIDsKLSAgIFNBTUVORVQgTTEgTTEgMy41IFNUQUNLIDsKLSAgIFNBTUVORVQgVjEgVjIgMS41IFNUQUNLIDsKLSAgIFNBTUVORVQgTTIgTTIgMy41IFNUQUNLIDsKLSAgIFNBTUVORVQgVjIgVjMgMS41IFNUQUNLIDsKLUVORCBTUEFDSU5HCi0KLU1JTkZFQVRVUkUgMC4xIDAuMSA7Ci0KLURJRUxFQ1RSSUMgMC4wMDAzNDUgOwotCi1JUkRST1AgCi0gICBUQUJMRSBEUkVTSEkKLSAgICAgIDAuMDAwMSAtMC43IDAuMDAxIC0wLjggMC4wMSAtMC45IDAuMSAtMS4wIDsKLSAgIFRBQkxFIERSRVNMTwotICAgICAgMC4wMDAxIC0xLjcgMC4wMDEgLTEuNiAwLjAxIC0xLjUgMC4xIC0xLjMgOwotICAgVEFCTEUgRE5PUkVTSEkKLSAgICAgIDAuMDAwMSAtMC42IDAuMDAxIC0wLjcgMC4wMSAtMC45IDAuMSAtMS4xIDsKLSAgIFRBQkxFIEROT1JFU0xPCi0gICAgICAwLjAwMDEgLTEuNSAwLjAwMSAtMS41IDAuMDEgLTEuNCAwLjEgLTEuNCA7Ci1FTkQgSVJEUk9QCi0KLVNJVEUgIENPVkVSCi0gICBDTEFTUyBQQUQgOwotICAgU1lNTUVUUlkgUjkwIDsKLSAgIFNJWkUgMTAuMDAwIEJZIDEwLjAwMCA7Ci1FTkQgIENPVkVSCi0KLVNJVEUgIElPCi0gICBDTEFTUyBQQUQgOwotICAgU0laRSA4MC4wMDAgQlkgNTYwLjAwMCA7Ci1FTkQgIElPCi0KLVNJVEUgIENPUkUKLSAgIENMQVNTIENPUkUgOwotICAgU0laRSAwLjcwMCBCWSA4LjQwMCA7Ci1FTkQgIENPUkUKLQotU0lURSBDT1JFMQotICAgQ0xBU1MgQ09SRSA7Ci0gICBTWU1NRVRSWSBYIDsKLSAgIFNJWkUgNjcuMiBCWSA2IDsKLUVORCBDT1JFMQotCi1TSVRFIE1SQ09SRQotIyAgIENMQVNTIFZJUlRVQUwgOwotICAgQ0xBU1MgQ09SRSA7Ci0gICBTSVpFIDMuNiBCWSAyOC44IDsKLSAgIFNZTU1FVFJZICBZICA7Ci1FTkQgTVJDT1JFCi0KLVNJVEUgSU9XSVJFRAotICAgQ0xBU1MgUEFEIDsKLSAgIFNJWkUgNTcuNiBCWSA0MzIgOwotRU5EIElPV0lSRUQKLQotU0lURSBJTUFHRQotICAgQ0xBU1MgQ09SRSA7Ci0gICBST1dQQVRURVJOIEZzaXRlMSBOIExzaXRlMSBOIExzaXRlMSBGUyA7Ci0gICBTSVpFIDEgQlkgMSA7Ci1FTkQgSU1BR0UKLQotU0lURSBGc2l0ZQotICAgQ0xBU1MgQ09SRSA7Ci0gICBTSVpFIDQuMCBCWSA3LjAgOyAgICMgNC4wIHVtIHdpZGUsIDcuMCB1bSBoaWdoCi1FTkQgRnNpdGUKLQotU0lURSBMc2l0ZQotICAgQ0xBU1MgQ09SRSA7Ci0gICBTSVpFIDYuMCBCWSA3LjAgOyAgICMgNi4wIHVtIHdpZGUsIDcuMCB1bSBoaWdoCi1FTkQgTHNpdGUKLQotU0lURSBteVNpdGUKLSAgIENMQVNTIENPUkUgOwotICAgUk9XUEFUVEVSTiBGc2l0ZSBOIExzaXRlIE4gTHNpdGUgRlMgOyAjIGEgcGF0dGVybiBvZiBGICsgTCArIGZsaXBwZWQgTAotICAgU0laRSAxNi4wIEJZIDcuMCA7ICAgICAgICAgICAgICAgICAgICAjIHdpZHRoID0gd2lkdGgoRiArIEwgKyBMKQotRU5EIG15U2l0ZQotCi1BUlJBWSBNN0U0WFhYCi0gICBTSVRFIENPUkUgICAgICAgICAtNTAyMS40NTAgLTQ5OTguMDAwIE4gRE8gMTQzNDYgQlkgNTk1IFNURVAgMC43MDAgMTYuODAwIDsKLSAgIFNJVEUgQ09SRSAgICAgICAgIC01MDIxLjQ1MCAtNDk4OS42MDAgRlMgRE8gMTQzNDYgQlkgNTk1IFNURVAgMC43MDAgMTYuODAwIDsKLSAgIFNJVEUgSU8gICAgICAgICAgIDYxNDguODAwIDU4MDAuMDAwIEUgRE8gMSBCWSAxIFNURVAgMC4wMDAgMC4wMDAgOwotICAgU0lURSBJTyAgICAgICAgICAgNjE0OC44MDAgMzI0MC4wMDAgRSBETyAxIEJZIDEgU1RFUCAwLjAwMCAwLjAwMCA7Ci0gICBTSVRFIENPVkVSICAgICAgICAtNzMxNS4wMDAgLTczMTUuMDAwIE4gRE8gMSBCWSAxIFNURVAgMC4wMDAgMC4wMDAgOwotICAgU0lURSBDT1ZFUiAgICAgICAgNzMwNS4wMDAgNzMwNS4wMDAgTiBETyAxIEJZIDEgU1RFUCAwLjAwMCAwLjAwMCA7Ci0gICBDQU5QTEFDRSBDT1ZFUiAgICAtNzMxNS4wMDAgLTczMTUuMDAwIE4gRE8gMSBCWSAxIFNURVAgMC4wMDAgMC4wMDAgOwotICAgQ0FOUExBQ0UgQ09WRVIgICAgLTcyNTAuMDAwIC03MjUwLjAwMCBOIERPIDUgQlkgMSBTVEVQIDQwLjAwMCAwLjAwMCA7Ci0gICBDQU5QTEFDRSBDT1ZFUiAgICAtNzI1MC4wMDAgLTcyNTAuMDAwIE4gRE8gNSBCWSAxIFNURVAgNDAuMDAwIDAuMDAwIDsKLSAgIENBTk5PVE9DQ1VQWSBDT1JFIC01MDIxLjQ1MCAtNDk4OS42MDAgRlMgRE8gMTAwIEJZIDU5NSBTVEVQIDAuNzAwIDE2LjgwMCA7Ci0gICBDQU5OT1RPQ0NVUFkgQ09SRSAtNTAyMS40NTAgLTQ5OTguMDAwIE4gRE8gMTAwIEJZIDU5NSBTVEVQIDAuNzAwIDE2LjgwMCA7Ci0gICBDQU5OT1RPQ0NVUFkgQ09SRSAtNTAyMS40NTAgLTQ5OTguMDAwIE4gRE8gMTAwIEJZIDU5NSBTVEVQIDAuNzAwIDE2LjgwMCA7Ci0gICBUUkFDS1MgWCAtNjE0OC44MDAgRE8gMTc1NjkgU1RFUCAwLjcwMCBMQVlFUiBSWCA7Ci0gICBUUkFDS1MgWSAtNjE0OC44MDAgRE8gMjA0OTcgU1RFUCAwLjYwMCBMQVlFUiBSWCA7Ci0gICBUUkFDS1MgWSAtNjE0OC44MDAgRE8gMjA0OTcgU1RFUCAwLjYwMCBMQVlFUiBSWCA7Ci0KLSAgIEZMT09SUExBTiAxMDAlCi0gICAgICBDQU5QTEFDRSBDT1ZFUiAgLTczMTUuMDAwIC03MzE1LjAwMCBOIERPIDEgQlkgMSBTVEVQIDAuMDAwIDAuMDAwIDsKLSAgICAgIENBTlBMQUNFIENPVkVSICAtNzI1MC4wMDAgLTcyNTAuMDAwIE4gRE8gNSBCWSAxIFNURVAgNDAuMDAwIDAuMDAwIDsKLSAgICAgIENBTlBMQUNFIENPUkUgICAtNTAyMS40NTAgLTQ5OTguMDAwIE4gRE8gMTQzNDYgQlkgNTk1IFNURVAgMC43MDAgMTYuODAwIDsKLSAgICAgIENBTlBMQUNFIENPUkUgICAtNTAyMS40NTAgLTQ5ODkuNjAwIEZTIERPIDE0MzQ2IEJZIDU5NSBTVEVQIDAuNzAwIDE2LjgwMCA7Ci0gICAgICBDQU5OT1RPQ0NVUFkgQ09SRSAtNTAyMS40NTAgLTQ5ODkuNjAwIEZTIERPIDEwMCBCWSA1OTUgU1RFUCAwLjcwMCAxNi44MDAgOwotICAgICAgQ0FOTk9UT0NDVVBZIENPUkUgLTUwMjEuNDUwIC00OTk4LjAwMCBOIERPIDEwMCBCWSA1OTUgU1RFUCAwLjcwMCAxNi44MDAgOwotICAgRU5EIDEwMCUKLSAgIEdDRUxMR1JJRCBYICAtNjE1Ny4yMDAgRE8gMTQ2NyBTVEVQIDguNDAwIDsKLSAgIEdDRUxMR1JJRCBZICAtNjE1Ny4yMDAgRE8gMTQ2NyBTVEVQIDguNDAwIDsKLSAgIEdDRUxMR1JJRCBZICAtNjE1Ny4yMDAgRE8gMTQ2NyBTVEVQIDguNDAwIDsKLUVORCBNN0U0WFhYCi0KLU1BQ1JPIENISzNBCi1DTEFTUyBSSU5HIDsKLSAgIEZJWEVETUFTSyA7Ci0gICBTT1VSQ0UgVVNFUiA7Ci0gICBGT1JFSUdOIENIS1MgMCAwIEZOIDsKLSAgIE9SSUdJTiAwLjkgMC45IDsKLSAgIEVFUSBDSEsxIDsgCi0gICBMRVEgQ0hLMiA7IAotICAgU0laRSAxMC44IEJZIDI4LjggOwotIyAgZm9yIHRlc3RpbmcgdGhlIGxlZnJXYXJuaW5nLmxvZyBmaWxlCi0jICAgICBTSVRFIENPUkUgOwotICAgU1lNTUVUUlkgWCBZIFI5MCAgOwotICAgU0lURSBDT1JFIDsKLSAgIFBPV0VSIDEuMCA7Ci0gICBQUk9QRVJUWSBzdHJpbmdQcm9wICJmaXJzdCIgaW50ZWdlclByb3AgMSBXRUlHSFQgMzAuMzEgOwotCi0gICBQSU4gR05ECi0gICAgICBUQVBFUlJVTEUgUlVMRTEgOwotICAgICAgRk9SRUlHTiBHUk9VTkQgKCAwIDAgKSBFIDsKLSAgICAgIEZPUkVJR04gQ0hLUyAoIDUgNCApIE4gOwotICAgICAgRk9SRUlHTiBWQ0MgKCA2IDUgKSBGRSA7Ci0gICAgICBGT1JFSUdOIENISzEgKCA3IDYgKSBXIDsKLSAgICAgIExFUSAgQSA7Ci0gICAgICBESVJFQ1RJT04gSU5PVVQgOwotICAgICAgVVNFIEdST1VORCA7Ci0gICAgICBTSEFQRSBBQlVUTUVOVCA7Ci0gICAgICBJTlBVVE5PSVNFTUFSR0lOICA2LjEgMi4zIDsKLSAgICAgIE9VVFBVVE5PSVNFTUFSR0lOIDUuMCAgNC42IDsKLSAgICAgIE9VVFBVVFJFU0lTVEFOQ0UgNy40IDUuNCA7Ci0gICAgICBQT1dFUiAyLjAgOwotICAgICAgTEVBS0FHRSAxLjAgOwotICAgICAgQ0FQQUNJVEFOQ0UgMC4xIDsgICAgICAgIAotICAgICAgUkVTSVNUQU5DRSAwLjIgOwotICAgICAgUFVMTERPV05SRVMgMC41IDsKLSAgICAgIFRJRU9GRlIgMC44IDsgCi0gICAgICBWSEkgNSA7ICAgICAgICAKLSAgICAgIFZMTyAwIDsgICAgICAgIAotICAgICAgUklTRVZPTFRBR0VUSFJFU0hPTEQgMi4wIDsKLSAgICAgIEZBTExWT0xUQUdFVEhSRVNIT0xEIDIuMCA7Ci0gICAgICBSSVNFVEhSRVNIIDIyIDsgICAgICAgIAotICAgICAgRkFMTFRIUkVTSCAxMDAgOyAgICAgICAgCi0gICAgICBSSVNFU0FUQ1VSIDQgOyAgICAgICAgCi0gICAgICBGQUxMU0FUQ1VSIC41IDsgICAgICAgIAotICAgICAgQ1VSUkVOVFNPVVJDRSBBQ1RJVkUgOyAgICAgICAgICAgIAotIyAgICAgIEFOVEVOTkFTSVpFIDAuNiBMQVlFUiBSWCA7Ci0jICAgICAgTkFNRVRBTEFSRUEgMyBMQVlFUiBNMSA7Ci0jICAgICAgQU5URU5OQU1FVEFMQVJFQSA0IExBWUVSIE0yIDsKLSMgICAgICBBTlRFTk5BTUVUQUxMRU5HVEggNSBMQVlFUiBNMSA7Ci0jICAgICAgQU5URU5OQU1FVEFMTEVOR1RIIDYgTEFZRVIgTTIgOwotICAgICAgUklTRVNMRVdMSU1JVCAwLjAxIDsKLSAgICAgIEZBTExTTEVXTElNSVQgMC4wMiA7Ci0gICAgICBNQVhERUxBWSAyMSA7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBNQVhMT0FEIDAuMSA7Ci0gICAgICBQUk9QRVJUWSBUWVBFICJzcGVjaWFsIiBpbnRQcm9wIDIzIHJlYWxQcm9wIDI0LjI1IDsKLSAgICAgIElWX1RBQkxFUyBMT1dUIEhJR0hUIDsKLQotICAgICAgUE9SVAotICAgICAgICAgQ0xBU1MgQ09SRSA7Ci0gICAgICAgICBMQVlFUiBNMSBTUEFDSU5HIDAuMDUgOwotICAgICAgICAgV0lEVEggMS4wIDsKLSAgICAgICAgIFJFQ1QgLTAuOSAzIDkuOSA2IDsKLSAgICAgICAgIFZJQSAxMDAgMzAwIElOMVggOwotICAgICAgRU5ECi0gICAgICBQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyA1LjcKLSAgICAgICAgIENMQVNTIEJVTVAgOyAgICAgICAgICAgICAgICAgICAjIDUuNwotICAgICAgICAgTEFZRVIgTTIgU1BBQ0lORyAwLjA2IDsgICAgICAgICMgNS43Ci0gICAgICBFTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyA1LjcKLSAgIEVORCBHTkQKLSAgIFBJTiBWREQKLSAgICAgIERJUkVDVElPTiBJTk9VVCA7Ci0gICAgICBGT1JFSUdOIEdST1VORCAgU1RSVUNUVVJFICggMCAwICkgRSA7Ci0gICAgICBVU0UgUE9XRVIgOwotICAgICAgU0hBUEUgQUJVVE1FTlQgOwotICAgICAgUE9SVAotICAgICAgRU5ECi0gICAgICBQT1JUCi0gICAgICAgICBDTEFTUyBOT05FIDsKLSAgICAgICAgIExBWUVSIE0xIDsKLSAgICAgICAgICAgIFJFQ1QgSVRFUkFURSAtMC45IDIxIDkuOSAyNCAKLSAgICAgICAgICAgICAgIERPIDEgQlkgMiBTVEVQIDEgMSA7Ci0gICAgICAgICAgICBWSUEgSVRFUkFURSAxMDAgMzAwIG5kMVZJQTEyIAotICAgICAgICAgICAgICAgRE8gMSBCWSAyIFNURVAgMSAyIDsKLSAgICAgIEVORAotIyAgICAgIEFOVEVOTkFNRVRBTEFSRUEgMyBMQVlFUiBNMSA7Ci0jICAgICAgQU5URU5OQU1FVEFMQVJFQSA0IExBWUVSIE0yIDsKLSMgICAgICBBTlRFTk5BTUVUQUxMRU5HVEggNSBMQVlFUiBNMSA7Ci0jICAgICAgQU5URU5OQU1FVEFMTEVOR1RIIDYgTEFZRVIgTTIgOwotICAgICAgIyBUZXN0IGZvciBjb21iaW5hdGlvbiBvZiBib3RoIDUuMyAmIDUuNCwgd2hpY2ggaXMgbm90IGFsbG93ZWQKLSAgICAgICMgQU5URU5OQVBBUlRJQUxNRVRBTEFSRUEgNCBMQVlFUiBNMSA7Ci0gICAgICBBTlRFTk5BUEFSVElBTENVVEFSRUEgNC44MjE2IExBWUVSIFYxIDsKLSAgICAgIEFOVEVOTkFNT0RFTCBPWElERTEgOwotICAgICAgQU5URU5OQUdBVEVBUkVBIDI5Ny4wMTMwIExBWUVSIE0yIDsKLSAgICAgIEFOVEVOTkFNT0RFTCBPWElERTMgOwotICAgICAgQU5URU5OQUdBVEVBUkVBIDE2Mi40ODAwIExBWUVSIE0yIDsKLSAgICAgIEFOVEVOTkFESUZGQVJFQSA1MDA4LjQ2MDAgTEFZRVIgTTIgOwotICAgICAgQU5URU5OQVBBUlRJQUxNRVRBTEFSRUEgMTA2MTEuMjAwMiBMQVlFUiBNMiA7Ci0gICAgICBBTlRFTk5BUEFSVElBTENVVEFSRUEgMTg1LjczMDAgTEFZRVIgVjIgOwotICAgICAgQU5URU5OQU1PREVMIE9YSURFMSA7Ci0gICAgICBBTlRFTk5BR0FURUFSRUEgMjk3LjIxNDAgTEFZRVIgTTMgOwotICAgICAgQU5URU5OQURJRkZBUkVBIDUxNjMuODc5OSBMQVlFUiBNMyA7Ci0gICAgICBBTlRFTk5BUEFSVElBTE1FVEFMQVJFQSAyNDUwLjI2MDAgTEFZRVIgTTMgOwotICAgICAgTEVBS0FHRSAxLjAgOwotICAgICAgRkFMTFZPTFRBR0VUSFJFU0hPTEQgMi4wIDsKLSAgICAgIFJJU0VWT0xUQUdFVEhSRVNIT0xEIDIuMCA7Ci0gICAgICBDVVJSRU5UU09VUkNFIEFDVElWRSA7Ci0gICBFTkQgVkRECi0gICBQSU4gUEEzCi0gICAgICBESVJFQ1RJT04gSU5QVVQgOwotICAgICAgIyA1LjQKLSAgICAgIEFOVEVOTkFQQVJUSUFMTUVUQUxBUkVBIDQgTEFZRVIgTTEgOwotICAgICAgQU5URU5OQVBBUlRJQUxNRVRBTEFSRUEgNSBMQVlFUiBNMiA7Ci0gICAgICBBTlRFTk5BUEFSVElBTE1FVEFMU0lERUFSRUEgNSBMQVlFUiBNMiA7Ci0gICAgICBBTlRFTk5BUEFSVElBTE1FVEFMU0lERUFSRUEgNiBMQVlFUiBNMiA7Ci0gICAgICBBTlRFTk5BUEFSVElBTE1FVEFMU0lERUFSRUEgNyBMQVlFUiBNMiA7Ci0gICAgICBBTlRFTk5BR0FURUFSRUEgMSBMQVlFUiBNMSA7Ci0gICAgICBBTlRFTk5BR0FURUFSRUEgMiA7Ci0gICAgICBBTlRFTk5BR0FURUFSRUEgMyBMQVlFUiBNMyA7Ci0gICAgICBBTlRFTk5BRElGRkFSRUEgMSBMQVlFUiBNMSA7Ci0gICAgICBBTlRFTk5BTUFYQVJFQUNBUiAxIExBWUVSIEwxIDsKLSAgICAgIEFOVEVOTkFNQVhBUkVBQ0FSIDIgTEFZRVIgTDIgOwotICAgICAgQU5URU5OQU1BWEFSRUFDQVIgMyBMQVlFUiBMMyA7Ci0gICAgICBBTlRFTk5BTUFYQVJFQUNBUiA0IExBWUVSIEw0IDsKLSAgICAgIEFOVEVOTkFNQVhTSURFQVJFQUNBUiAxIExBWUVSIEwxIDsKLSAgICAgIEFOVEVOTkFNQVhTSURFQVJFQUNBUiAyIExBWUVSIEwyIDsKLSAgICAgIEFOVEVOTkFQQVJUSUFMQ1VUQVJFQSAxIDsKLSAgICAgIEFOVEVOTkFQQVJUSUFMQ1VUQVJFQSAyIExBWUVSIE0yIDsKLSAgICAgIEFOVEVOTkFQQVJUSUFMQ1VUQVJFQSAzIDsKLSAgICAgIEFOVEVOTkFQQVJUSUFMQ1VUQVJFQSA0IExBWUVSIE00IDsKLSAgICAgIEFOVEVOTkFNQVhDVVRDQVIgMSBMQVlFUiBMMSA7Ci0gICAgICBBTlRFTk5BTUFYQ1VUQ0FSIDIgTEFZRVIgTDIgOwotICAgICAgQU5URU5OQU1BWENVVENBUiAzIExBWUVSIEwzIDsKLSAgICAgICMgVGVzdCBmb3IgY29tYmluYXRpb24gb2YgYm90aCA1LjMgJiA1LjQsIHdoaWNoIGlzIG5vdCBhbGxvd2VkCi0gICAgICAjIEFOVEVOTkFNRVRBTExFTkdUSCA1IExBWUVSIE0xIDsKLSAgICAgIFBPUlQKLSAgICAgICAgIExBWUVSIE0xIFNQQUNJTkcgMC4wMiA7Ci0gICAgICAgICAgICBSRUNUIDEuMzUgLTAuNDUgMi4yNSAwLjQ1IDsKLSAgICAgICAgICAgIFJFQ1QgLTAuNDUgLTAuNDUgMC40NSAwLjQ1IDsKLSAgICAgIEVORAotICAgICAgUE9SVAotICAgICAgICAgTEFZRVIgUEMgREVTSUdOUlVMRVdJRFRIIDAuMDUgOwotICAgICAgICAgICAgUkVDVCAtMC40NSAxMi4xNSAwLjQ1IDEzLjA1IDsKLSAgICAgIEVORAotICAgICAgUE9SVAotICAgICAgICBMQVlFUiBQQyA7Ci0gICAgICAgICAgICBSRUNUIC0wLjQ1IDI0Ljc1IDAuNDUgMjUuNjUgOwotICAgICAgRU5ECi0gICAgICBQT1JUCi0gICAgICBFTkQKLSAgIEVORCBQQTMKLSAgIFBJTiBQQTAKLSAgICAgIERJUkVDVElPTiBJTlBVVCA7Ci0gICAgICBNVVNUSk9JTiBQQTMgOwotICAgICAgUE9SVAotICAgICAgICAgQ0xBU1MgTk9ORSA7Ci0gICAgICAgICBMQVlFUiBNMSA7Ci0gICAgICAgICAgICBSRUNUIDguNTUgOC41NSA5LjQ1IDkuNDUgOwotICAgICAgICAgICAgUkVDVCA2Ljc1IDYuNzUgNy42NSA3LjY1IDsKLSAgICAgICAgICAgIFJFQ1QgNi43NSA4LjU1IDcuNjUgOS40NSA7Ci0gICAgICAgICAgICBSRUNUIDYuNzUgMTAuMzUgNy42NSAxMS4yNSA7Ci0gICAgICBFTkQKLSAgICAgIFBPUlQKLSAgICAgICAgIENMQVNTIENPUkUgOwotICAgICAgICAgTEFZRVIgUEMgOwotICAgICAgICAgICAgUkVDVCA4LjU1IDI0Ljc1IDkuNDUgMjUuNjUgOwotICAgICAgRU5ECi0gICAgICBQT1JUCi0gICAgICAgICBMQVlFUiBQQyA7Ci0gICAgICAgICAgICBSRUNUIDYuNzUgMS4zNSA3LjY1IDIuMjUgOwotICAgICAgRU5ECi0gICAgICBQT1JUCi0gICAgICAgICBMQVlFUiBQQyA7Ci0gICAgICAgICAgICBSRUNUIDYuNzUgMjQuNzUgNy42NSAyNS42NSA7Ci0gICAgICBFTkQKLSAgICAgIFBPUlQKLSAgICAgICAgIExBWUVSIFBDIDsKLSAgICAgICAgICAgIFJFQ1QgNC45NSAxLjM1IDUuODUgMi4yNSA7Ci0gICAgICBFTkQKLSAgIEVORCBQQTAKLSAgIFBJTiBQQTEKLSAgICAgIERJUkVDVElPTiBJTlBVVCA7Ci0gICAgICBQT1JUCi0gICAgICAgICBMQVlFUiBNMSA7Ci0gICAgICAgICAgICBSRUNUIDguNTUgLTAuNDUgOS40NSAwLjQ1IDsKLSAgICAgICAgICAgIFJFQ1QgNi43NSAtMC40NSA3LjY1IDAuNDUgOwotICAgICAgRU5ECi0gICAgICBQT1JUCi0gICAgICAgICBMQVlFUiBNMSA7Ci0gICAgICAgICAgICBSRUNUIDguNTUgMTIuMTUgOS40NSAxMy4wNSA7Ci0gICAgICAgICAgICBSRUNUIDYuNzUgMTIuMTUgNy42NSAxMy4wNSA7Ci0gICAgICAgICAgICBSRUNUIDQuOTUgMTIuMTUgNS44NSAxMy4wNSA7Ci0gICAgICBFTkQKLSAgICAgIFBPUlQKLSAgICAgICAgIExBWUVSIFBDIDsKLSAgICAgICAgICAgIFJFQ1QgNC45NSAyNC43NSA1Ljg1IDI1LjY1IDsKLSAgICAgIEVORAotICAgICAgUE9SVAotICAgICAgICAgTEFZRVIgUEMgOwotICAgICAgICAgICAgUkVDVCAzLjE1IDI0Ljc1IDQuMDUgMjUuNjUgOwotICAgICAgRU5ECi0gICBFTkQgUEExCi0gICBQSU4gUEEyMAotICAgICAgRElSRUNUSU9OIElOUFVUIDsKLSAgICAgIFBPUlQKLSAgICAgICAgIExBWUVSIE0xIDsKLSAgICAgICAgICAgIFBPTFlHT04gMTUgMzUgMTUgNjAgNjUgNjAgNjUgMzUgMTUgMzUgOwotICAgICAgRU5ECi0gICAgICBQT1JUCi0gICAgICAgICBMQVlFUiBNMSA7Ci0gICAgICAgICAgICBQQVRIIDguNTUgMTIuMTUgOS40NSAxMy4wNSA7Ci0gICAgICBFTkQKLSAgIEVORCBQQTIwCi0gICBQSU4gUEEyMQotICAgICAgRElSRUNUSU9OIE9VVFBVVCBUUklTVEFURSA7Ci0gICAgICBQT1JUCi0gICAgICAgICBMQVlFUiBNMSA7Ci0gICAgICAgICAgICBQT0xZR09OIElURVJBVEUgMjAgMzUgMjAgNjAgNzAgNjAgNzAgMzUgRE8gMSBCWSAyIFNURVAgNSA1IDsKLSAgICAgIEVORAotICAgICAgUE9SVAotICAgICAgICAgTEFZRVIgTTEgOwotICAgICAgICAgICAgUEFUSCBJVEVSQVRFIDUuNTUgMTIuMTUgMTAuNDUgMTMuMDUgRE8gMSBCWSAyIFNURVAgMiAyIDsKLSAgICAgIEVORAotICAgRU5EIFBBMjEKLSAgIE9CUwotICAgICAgTEFZRVIgTTEgU1BBQ0lORyA1LjYgOwotICAgICAgICAgUkVDVCA2LjYgLTAuNiA5LjYgMC42IDsKLSAgICAgICAgIFJFQ1QgNC44IDEyIDkuNiAxMy4yIDsKLSAgICAgICAgIFJFQ1QgMyAxMy44IDcuOCAxNi44IDsKLSAgICAgICAgIFJFQ1QgMyAtMC42IDYgMC42IDsKLSAgICAgICAgIFJFQ1QgMyA4LjQgNiAxMS40IDsKLSAgICAgICAgIFJFQ1QgMyA4LjQgNC4yIDE2LjggOwotICAgICAgICAgUkVDVCAtMC42IDEzLjggNC4yIDE2LjggOwotICAgICAgICAgUkVDVCAtMC42IC0wLjYgMi40IDAuNiA7Ci0gICAgICAgICBSRUNUIDYuNiA2LjYgOS42IDExLjQgOwotICAgICAgICAgUkVDVCA2LjYgNi42IDcuOCAxMS40IDsKLSAgIEVORCAKLSAgIFRJTUlORwotICAgICAgRlJPTVBJTiBQQTIxIDsKLSAgICAgIFRPUElOIFBBMjAgOwotICAgICAgUklTRSBJTlRSSU5TSUMgLjM5IC40MSAxLjIgLjI1IC4yOSAxLjggLjY3IC44NyAyLjIKLSAgICAgICAgIFZBUklBQkxFIDAuMTIgMC4xMyA7Ci0gICAgICBGQUxMIElOVFJJTlNJQyAuMjQgLjI5IDEuMyAuMjYgLjMxIDEuNyAuNiAuOCAyLjEKLSAgICAgICAgIFZBUklBQkxFIDAuMTEgMC4xNCA7Ci0gICAgICBSSVNFUlMgODMuMTc4IDkwLjEwOSA7Ci0gICAgICBGQUxMUlMgNzYuMjQ2IDk3LjA0MSA7Ci0gICAgICBSSVNFQ1MgMC43NTEgMC43NTEgOwotICAgICAgRkFMTENTIDAuNzUxIDAuNzUxIDsKLSAgICAgIFJJU0VUMCAwLjY1NDkzIDAuNjU0OTMgOwotICAgICAgRkFMTFQwIDAuMzggMC4zOCA7Ci0gICAgICBSSVNFU0FUVDEgMCAwIDsKLSAgICAgIEZBTExTQVRUMSAwLjE1IDAuMTUgOwotICAgICAgVU5BVEVORVNTIElOVkVSVCA7Ci0gICBFTkQgVElNSU5HCi1FTkQgQ0hLM0EKLQotTUFDUk8gSU5WCi0gICBDTEFTUyBDT1JFIDsKLSAgIFNPVVJDRSBCTE9DSyA7Ci0gICBGT1JFSUdOIElOVlMgOwotICAgUE9XRVIgMS4wIDsKLSAgIFNJWkUgNjcuMiBCWSAyNCA7Ci0gICBTWU1NRVRSWSBYIFkgUjkwIDsKLSAgIFNJVEUgQ09SRTEgOwotCi0gICBQSU4gWiBESVJFQ1RJT04gT1VUUFVUIDsKLSAgICAgIFVTRSBTSUdOQUwgOwotICAgICAgUklTRVRIUkVTSCAyMiA7Ci0gICAgICBGQUxMVEhSRVNIIDEwMCA7Ci0gICAgICBSSVNFU0FUQ1VSIDQgOwotICAgICAgRkFMTFNBVENVUiAuNSA7Ci0gICAgICBWTE8gMCA7Ci0gICAgICBWSEkgNSA7Ci0gICAgICBDQVBBQ0lUQU5DRSAwLjEgOwotICAgICAgTUFYREVMQVkgMjEgOwotICAgICAgUE9XRVIgMC4xIDsKLSAgICAgIEFOVEVOTkFQQVJUSUFMQ1VUQVJFQSA0LjgyMTYgTEFZRVIgVjEgOwotICAgICAgQU5URU5OQU1PREVMIE9YSURFMSA7Ci0gICAgICBBTlRFTk5BR0FURUFSRUEgMjk3LjAxMzAgTEFZRVIgTTIgOwotICAgICAgQU5URU5OQU1PREVMIE9YSURFMiA7Ci0gICAgICBBTlRFTk5BTU9ERUwgT1hJREUzIDsKLSAgICAgIEFOVEVOTkFHQVRFQVJFQSAxNjIuNDgwMCBMQVlFUiBNMiA7Ci0gICAgICBBTlRFTk5BRElGRkFSRUEgNTAwOC40NjAwIExBWUVSIE0yIDsKLSAgICAgIEFOVEVOTkFQQVJUSUFMTUVUQUxBUkVBIDEwNjExLjIwMDIgTEFZRVIgTTIgOwotICAgICAgQU5URU5OQVBBUlRJQUxDVVRBUkVBIDE4NS43MzAwIExBWUVSIFYyIDsKLSAgICAgIEFOVEVOTkFNT0RFTCBPWElERTEgOwotICAgICAgQU5URU5OQUdBVEVBUkVBIDI5Ny4yMTQwIExBWUVSIE0zIDsKLSAgICAgIEFOVEVOTkFESUZGQVJFQSA1MTYzLjg3OTkgTEFZRVIgTTMgOwotICAgICAgQU5URU5OQVBBUlRJQUxNRVRBTEFSRUEgMjQ1MC4yNjAwIExBWUVSIE0zIDsKLSAgICAgIFBPUlQKLSAgICAgICAgIExBWUVSIE0yIDsKLSAgICAgICAgICAgIFBBVEggMzAuOCA5IDQyIDkgOwotICAgICAgRU5ECi0gICBFTkQgWgotCi0gICBQSU4gQSBESVJFQ1RJT04gSU5QVVQgOwotICAgICAgVVNFIEFOQUxPRyA7Ci0gICAgICBSSVNFVEhSRVNIIDIyIDsKLSAgICAgIEZBTExUSFJFU0ggMTAwIDsKLSAgICAgIFJJU0VTQVRDVVIgNCA7Ci0gICAgICBGQUxMU0FUQ1VSIC41IDsKLSAgICAgIFZMTyAwIDsKLSAgICAgIFZISSA1IDsKLSAgICAgIENBUEFDSVRBTkNFIDAuMDggOwotICAgICAgTUFYREVMQVkgMjEgOwotICAgICAgUE9SVAotICAgICAgICAgTEFZRVIgTTEgOwotICAgICAgICAgICAgUEFUSCAyNS4yIDE1IDsKLSAgICAgIEVORAotICAgRU5EIEEKLQotICAgUElOIFZERCBESVJFQ1RJT04gSU5PVVQgOwotICAgICAgU0hBUEUgQUJVVE1FTlQgOwotICAgICAgUE9XRVIgMC4xIDsKLSAgICAgIEFOVEVOTkFQQVJUSUFMQ1VUQVJFQSA0LjgyMTYgTEFZRVIgVjEgOwotICAgICAgQU5URU5OQU1PREVMIE9YSURFMSA7Ci0gICAgICBBTlRFTk5BR0FURUFSRUEgMjk3LjAxMzAgTEFZRVIgTTIgOwotICAgICAgQU5URU5OQU1PREVMIE9YSURFMyA7Ci0gICAgICBBTlRFTk5BR0FURUFSRUEgMTYyLjQ4MDAgTEFZRVIgTTIgOwotICAgICAgQU5URU5OQURJRkZBUkVBIDUwMDguNDYwMCBMQVlFUiBNMiA7Ci0gICAgICBBTlRFTk5BUEFSVElBTE1FVEFMQVJFQSAxMDYxMS4yMDAyIExBWUVSIE0yIDsKLSAgICAgIEFOVEVOTkFQQVJUSUFMQ1VUQVJFQSAxODUuNzMwMCBMQVlFUiBWMiA7Ci0gICAgICBBTlRFTk5BTU9ERUwgT1hJREUxIDsKLSAgICAgIEFOVEVOTkFHQVRFQVJFQSAyOTcuMjE0MCBMQVlFUiBNMyA7Ci0gICAgICBBTlRFTk5BRElGRkFSRUEgNTE2My44Nzk5IExBWUVSIE0zIDsKLSAgICAgIEFOVEVOTkFQQVJUSUFMTUVUQUxBUkVBIDI0NTAuMjYwMCBMQVlFUiBNMyA7Ci0gICAgICBBTlRFTk5BTU9ERUwgT1hJREUyIDsKLSAgICAgIFBPUlQKLSAgICAgICAgIExBWUVSIE0xIDsKLSAgICAgICAgICAgIFdJRFRIIDUuNiA7Ci0gICAgICAgICAgICBQQVRIIDUwLjQgMi44IDUwLjQgMjEuMiA7Ci0gICAgICBFTkQKLSAgIEVORCBWREQKLQotICAgUElOIFZTUyBESVJFQ1RJT04gSU5PVVQgOwotICAgICAgU0hBUEUgQUJVVE1FTlQgOwotICAgICAgUE9XRVIgMC4xIDsKLSAgICAgIFBPUlQKLSAgICAgICAgIExBWUVSIE0xIDsKLSAgICAgICAgICAgIFdJRFRIIDUuNiA7Ci0gICAgICAgICAgICBQQVRIIDE2LjggMi44IDE2LjggMjEuMiA7Ci0gICAgICBFTkQKLSAgIEVORCBWU1MKLQotICAgVElNSU5HCi0gICAgICBGUk9NUElOIEEgOwotICAgICAgVE9QSU4gWiA7Ci0gICAgICBSSVNFIElOVFJJTlNJQyAuMzkgLjQxIDEuMiAuMjUgLjI5IDEuOCAuNjcgLjg3IDIuMgotICAgICAgICAgVkFSSUFCTEUgMC4xMiAwLjEzIDsKLSAgICAgIEZBTEwgSU5UUklOU0lDIC4yNCAuMjkgMS4zIC4yNiAuMzEgMS43IC42IC44IDIuMQotICAgICAgICAgVkFSSUFCTEUgMC4xMSAwLjE0IDsKLSAgICAgIFJJU0VSUyA4My4xNzggOTAuMTA5IDsKLSAgICAgIEZBTExSUyA3Ni4yNDYgOTcuMDQxIDsKLSAgICAgIFJJU0VDUyAwLjc1MSAwLjc1MSA7Ci0gICAgICBGQUxMQ1MgMC43NTEgMC43NTEgOwotICAgICAgUklTRVQwIDAuNjU0OTMgMC42NTQ5MyA7Ci0gICAgICBGQUxMVDAgMC4zOCAwLjM4IDsKLSAgICAgIFJJU0VTQVRUMSAwIDAgOwotICAgICAgRkFMTFNBVFQxIDAuMTUgMC4xNSA7Ci0gICAgICBVTkFURU5FU1MgSU5WRVJUIDsKLSAgIEVORCBUSU1JTkcKLQotICAgT0JTCi0gICAgICBMQVlFUiBNMSBERVNJR05SVUxFV0lEVEggNC41IDsKLSAgICAgICAgIFdJRFRIIDAuMSA7Ci0gICAgICAgICBSRUNUIE1BU0sgMiAyNC4xIDEuNSA0My41IDE2LjUgOwotICAgICAgICAgUkVDVCBNQVNLIDIgSVRFUkFURSAyNC4xIDEuNSA0My41IDE2LjUKLSAgICAgICAgICAgIERPIDIgQlkgMSBTVEVQIDIwLjAgMCA7Ci0gICAgICAgICBQQVRIIE1BU0sgMyBJVEVSQVRFIDUzMi4wIDUzNCAxOTk5LjIgNTM0Ci0gICAgICAgICAgICBETyAxIEJZIDIgU1RFUCAwIDE0NDYgOwotICAgICAgICAgVklBIElURVJBVEUgTUFTSyAxMjMgNDcwLjQgNDc1IFZJQUJJR1BPV0VSMTIKLSAgICAgICAgICAgIERPIDIgQlkgMiBTVEVQIDE1OTAuNCAxNTY1IDsKLSAgICAgICAgIFBBVEggTUFTSyAzIDUzMi4wIDUzNCAxOTk5LjIgNTM0IDsKLSAgICAgICAgIFBBVEggTUFTSyAzIDUzMi4wIDE5ODAgMTk5OS4yIDE5ODAgOwotICAgICAgICAgVklBIE1BU0sgMTAzIDQ3MC40IDQ3NSBWSUFCSUdQT1dFUjEyIDsKLSAgICAgICAgIFZJQSBNQVNLIDEzMiAyMDYwLjggNDc1IFZJQUJJR1BPV0VSMTIgOwotICAgICAgICAgVklBIE1BU0sgMTEyIDQ3MC40IDIwNDAgVklBQklHUE9XRVIxMiA7Ci0gICAgICAgICBWSUEgTUFTSyAxMjMgMjA2MC44IDIwNDAgVklBQklHUE9XRVIxMiA7Ci0gICAgICAgICBSRUNUIDQ0LjEgMS41IDYzLjUgMTYuNSA7Ci0gICBFTkQKLQotICAgREVOU0lUWQotICAgICAgTEFZRVIgbWV0YWwxIDsKLSAgICAgICAgIFJFQ1QgMCAwIDEwMCAxMDAgNDUuNSA7ICAjcmVjIGZyb20gKDAsMCkgdG8gKDEwMCwxMDApLCBkZW5zaXR5IG9mIDQ1LjUlCi0gICAgICAgICBSRUNUIDEwMCAwIDIwMCAxMDAgNDIuMiA7IAotICAgICAgTEFZRVIgbWV0YWwyIDsKLSAgICAgICAgIFJFQ1QgMCAwIDI1MCAxNDAgMjAuNSA7IAotICAgICAgICAgUkVDVCAxIDEgMjUwIDE0MCAyMC41IDsgCi0gICAgICAgICBSRUNUIDIgMiAyNTAgMTQwIDIwLjUgOyAKLSAgICAgIExBWUVSIG1ldGFsMyA7Ci0gICAgICAgICBSRUNUIDEwIDEwIDQwIDQwIDQuNSA7Ci0gICBFTkQKLUVORCBJTlYKLQotTUFDUk8gSU5WX0IKLSAgIEVFUSBJTlYgOwotICAgQ0xBU1MgQ09SRSBTUEFDRVIgOwotICAgRk9SRUlHTiBJTlZTICggNCA1ICkgOwotICAgRk9SRUlHTiBJTlYxICggNSA2ICkgUyA7Ci0gICBGT1JFSUdOIElOVjIgKCA2IDcgKSBOIDsKLSAgIEZPUkVJR04gSU5WMyAoIDcgOCApIDsKLSAgIFBPV0VSIDEuMCA7Ci0gICBTSVpFIDY3LjIgQlkgMjQgOwotICAgU1lNTUVUUlkgWCBZIFI5MCA7Ci0gICBTSVRFIENPUkUxIDsKLSAgIFBJTiBaIERJUkVDVElPTiBPVVRQVVQgOwotICAgICAgVVNFIENMT0NLIDsKLSAgICAgIFJJU0VUSFJFU0ggMjIgOwotICAgICAgRkFMTFRIUkVTSCAxMDAgOwotICAgICAgUklTRVNBVENVUiA0IDsKLSAgICAgIEZBTExTQVRDVVIgLjUgOwotICAgICAgVkxPIDAgOwotICAgICAgVkhJIDUgOwotICAgICAgQ0FQQUNJVEFOQ0UgMC4xIDsKLSAgICAgIE1BWERFTEFZIDIxIDsKLSAgICAgIFBPV0VSIDAuMSA7Ci0gICAgICBQT1JUCi0gICAgICAgICBMQVlFUiBNMSA7Ci0gICAgICAgICAgICBXSURUSCAxIDsKLSAgICAgICAgICAgIFBBVEggTUFTSyAyICggLTAuNiAtMC42ICkgKCAwLjYgLTAuNiApICggMC43IC0wLjYgKSA7Ci0gICAgICAgICBMQVlFUiBNMiA7Ci0gICAgICAgICAgICBXSURUSCAxIDsKLSAgICAgICAgICAgIFJFQ1QgTUFTSyAxICggLTAuNiAtMC42ICkgKCAwLjYgMC42ICkgOwotICAgICAgICAgTEFZRVIgTTMgOwotICAgICAgICAgICAgV0lEVEggMSA7Ci0gICAgICAgICAgICBSRUNUIE1BU0sgMiBJVEVSQVRFICggLTAuNiAtMC42ICkgKCAwLjYgMC42ICkKLSAgICAgICAgICAgIERPIDEgQlkgMiBTVEVQIDIgMSA7Ci0gICAgICAgICBMQVlFUiBNNCA7Ci0gICAgICAgICAgICBQQVRIIE1BU0sgMSAzMC44IDkgNDIgOSA7Ci0JIFZJQSBNQVNLIDEwMyA0NzAuNCA0NzUgVklBQklHUE9XRVIxMiA7Ci0gICAgICAgICBWSUEgTUFTSyAxMzAgMjA2MC44IDQ3NSBWSUFCSUdQT1dFUjEyIDsKLSAgICAgICAgIFZJQSBNQVNLIDExMyA0NzAuNCAyMDQwIFZJQUJJR1BPV0VSMTIgOwotICAgICAgICAgVklBIE1BU0sgMTIxIDIwNjAuOCAyMDQwIFZJQUJJR1BPV0VSMTIgOwotICAgICAgRU5ECi0gICBFTkQgWgotCi0gICBQSU4gQSBESVJFQ1RJT04gRkVFRFRIUlUgOwotICAgICAgVVNFIFNJR05BTCA7Ci0gICAgICBSSVNFVEhSRVNIIDIyIDsKLSAgICAgIEZBTExUSFJFU0ggMTAwIDsKLSAgICAgIFJJU0VTQVRDVVIgNCA7Ci0gICAgICBGQUxMU0FUQ1VSIC41IDsKLSAgICAgIFZMTyAwIDsKLSAgICAgIFZISSA1IDsKLSAgICAgIENBUEFDSVRBTkNFIDAuMDggOwotICAgICAgTUFYREVMQVkgMjEgOwotICAgICAgUE9SVAotICAgICAgICAgTEFZRVIgTTEgOwotICAgICAgICAgICAgUEFUSCAyNS4yIDE1IDsKLSAgICAgIEVORAotICAgRU5EIEEKLQotICAgUElOIFZERCBESVJFQ1RJT04gSU5PVVQgOwotICAgICAgU0hBUEUgQUJVVE1FTlQgOwotICAgICAgUE9XRVIgMC4xIDsKLSAgICAgIFBPUlQKLSAgICAgICAgIExBWUVSIE0xIDsKLSAgICAgICAgICAgIFdJRFRIIDUuNiA7Ci0gICAgICAgICAgICBQQVRIIDUwLjQgMi44IDUwLjQgMjEuMiA7Ci0gICAgICBFTkQKLSAgIEVORCBWREQKLQotICAgUElOIFZTUyBESVJFQ1RJT04gSU5PVVQgOwotICAgICAgU0hBUEUgQUJVVE1FTlQgOwotICAgICAgUE9XRVIgMC4xIDsKLSAgICAgIFBPUlQKLSAgICAgICAgIExBWUVSIE0xIDsKLSAgICAgICAgICAgIFdJRFRIIDUuNiA7Ci0gICAgICAgICAgICBQQVRIIDE2LjggMi44IDE2LjggMjEuMiA7Ci0gICAgICBFTkQKLSAgIEVORCBWU1MKLQotICAgVElNSU5HCi0gICAgICBGUk9NUElOIEEgOwotICAgICAgVE9QSU4gWiA7Ci0gICAgICBSSVNFIElOVFJJTlNJQyAuMzkgLjQxIDEuMiAuMjUgLjI5IDEuOCAuNjcgLjg3IDIuMgotICAgICAgICAgVkFSSUFCTEUgMC4xMiAwLjEzIDsKLSAgICAgIEZBTEwgSU5UUklOU0lDIC4yNCAuMjkgMS4zIC4yNiAuMzEgMS43IC42IC44IDIuMQotICAgICAgICAgVkFSSUFCTEUgMC4xMSAwLjE0IDsKLSAgICAgIFJJU0VSUyA4My4xNzggOTAuMTA5IDsKLSAgICAgIEZBTExSUyA3Ni4yNDYgOTcuMDQxIDsKLSAgICAgIFJJU0VDUyAwLjc1MSAwLjc1MSA7Ci0gICAgICBGQUxMQ1MgMC43NTEgMC43NTEgOwotICAgICAgUklTRVQwIDAuNjU0OTMgMC42NTQ5MyA7Ci0gICAgICBGQUxMVDAgMC4zOCAwLjM4IDsKLSAgICAgIFJJU0VTQVRUMSAwIDAgOwotICAgICAgRkFMTFNBVFQxIDAuMTUgMC4xNSA7Ci0gICAgICBVTkFURU5FU1MgSU5WRVJUIDsKLSAgIEVORCBUSU1JTkcKLQotICAgT0JTCi0gICAgICBMQVlFUiBNMSA7Ci0gICAgICAgICBSRUNUIDI0LjEgMS41IDQzLjUgMTYuNSA7Ci0gICBFTkQKLUVORCBJTlZfQgotCi1NQUNSTyBERkYzCi0gICBDTEFTUyBDT1JFIEFOVEVOTkFDRUxMIDsKLSAgIEZPUkVJR04gREZGM1MgOwotICAgUE9XRVIgNC4wIDsKLSAgIFNJWkUgNjcuMiBCWSAyMTAgOwotICAgU1lNTUVUUlkgWCBZIFI5MCA7Ci0gICBTSVRFIENPUkUgMzQgNTQgRkUgRE8gMzAgQlkgMyBTVEVQIDEgMSA7Ci0gICBTSVRFIENPUkUxIDIxIDY4IFMgRE8gMzAgQlkgMyBTVEVQIDIgMiA7Ci0KLSAgIFBJTiBRIERJUkVDVElPTiBPVVRQVVQgOwotICAgICAgVVNFIFNJR05BTCA7Ci0gICAgICBSSVNFVEhSRVNIIDIyIDsKLSAgICAgIEZBTExUSFJFU0ggMTAwIDsKLSAgICAgIFJJU0VTQVRDVVIgNCA7Ci0gICAgICBGQUxMU0FUQ1VSIC41IDsKLSAgICAgIFZMTyAwIDsKLSAgICAgIFZISSA1IDsKLSAgICAgIENBUEFDSVRBTkNFIDAuMTIgOwotICAgICAgTUFYREVMQVkgMjAgOwotICAgICAgUE9XRVIgMC40IDsKLSAgICAgIFBPUlQKLSAgICAgICAgIExBWUVSIE0yIDsKLSAgICAgICAgICAgIFBBVEggMTkuNiA5OSA0Ny42IDk5IDsKLSAgICAgIEVORAotICAgRU5EIFEKLQotICAgUElOIFFOIERJUkVDVElPTiBPVVRQVVQgOwotICAgICAgVVNFIFNJR05BTCA7Ci0gICAgICBSSVNFVEhSRVNIIDIyIDsKLSAgICAgIEZBTExUSFJFU0ggMTAwIDsKLSAgICAgIFJJU0VTQVRDVVIgNCA7Ci0gICAgICBGQUxMU0FUQ1VSIC41IDsKLSAgICAgIFZMTyAwIDsKLSAgICAgIFZISSA1IDsKLSAgICAgIENBUEFDSVRBTkNFIDAuMTEgOwotICAgICAgTUFYREVMQVkgMjAgOwotICAgICAgUE9XRVIgMC40IDsKLSAgICAgIFBPUlQKLSAgICAgICAgIExBWUVSIE0yIDsKLSAgICAgICAgICAgIFBBVEggTUFTSyAxIDI1LjIgMTIzIDQyIDEyMyA7Ci0JICAgIFJFQ1QgTUFTSyAyIDI0LjEgMS41IDQzLjUgMjA4LjUgOwotICAgICAgRU5ECi0gICBFTkQgUU4KLQotICAgUElOIEQgRElSRUNUSU9OIElOUFVUIDsKLSAgICAgIFVTRSBTSUdOQUwgOwotICAgICAgUklTRVRIUkVTSCAyMiA7Ci0gICAgICBGQUxMVEhSRVNIIDEwMCA7Ci0gICAgICBSSVNFU0FUQ1VSIDQgOwotICAgICAgRkFMTFNBVENVUiAuNSA7Ci0gICAgICBWTE8gMCA7Ci0gICAgICBWSEkgNSA7Ci0gICAgICBDQVBBQ0lUQU5DRSAwLjEzIDsKLSAgICAgIE1BWERFTEFZIDIwIDsKLSAgICAgIFBPV0VSIDAuNCA7Ci0gICAgICBQT1JUCi0gICAgICAgICBMQVlFUiBNMSA7Ci0gICAgICAgICAgICBQQVRIIDMwLjggNTEgOwotICAgICAgRU5ECi0gICBFTkQgRAotCi0gICBQSU4gRyBESVJFQ1RJT04gSU5QVVQgOwotICAgICAgVVNFIFNJR05BTCA7Ci0gICAgICBSSVNFVEhSRVNIIDIyIDsKLSAgICAgIEZBTExUSFJFU0ggMTAwIDsKLSAgICAgIFJJU0VTQVRDVVIgNCA7Ci0gICAgICBGQUxMU0FUQ1VSIC41IDsKLSAgICAgIFZMTyAwIDsKLSAgICAgIFZISSA1IDsKLSAgICAgIENBUEFDSVRBTkNFIDAuMTEgOwotICAgICAgTUFYREVMQVkgMjAgOwotICAgICAgUE9XRVIgMC40IDsKLSAgICAgIFBPUlQKLSAgICAgICAgIExBWUVSIE0xIDsKLSAgICAgICAgICAgIFBBVEggMjUuMiAzIDsKLSAgICAgIEVORAotICAgRU5EIEcKLQotICAgUElOIENEIERJUkVDVElPTiBJTlBVVCA7Ci0gICAgICBVU0UgQ0xPQ0sgOwotICAgICAgUklTRVRIUkVTSCAyMiA7Ci0gICAgICBGQUxMVEhSRVNIIDEwMCA7Ci0gICAgICBSSVNFU0FUQ1VSIDQgOwotICAgICAgRkFMTFNBVENVUiAuNSA7Ci0gICAgICBWTE8gMCA7Ci0gICAgICBWSEkgNSA7Ci0gICAgICBDQVBBQ0lUQU5DRSAwLjEgOwotICAgICAgTUFYREVMQVkgMjAgOwotICAgICAgUE9XRVIgMC40IDsKLSAgICAgIFBPUlQKLSAgICAgICAgIExBWUVSIE0xIDsKLSAgICAgICAgICAgIFBBVEggMzYuNCA3NSA7Ci0gICAgICBFTkQKLSAgIEVORCBDRAotCi0gICBQSU4gVkREIERJUkVDVElPTiBJTk9VVCA7Ci0gICAgICBTSEFQRSBSSU5HIDsKLSAgICAgIFBPV0VSIDAuNCA7Ci0gICAgICBQT1JUCi0gICAgICAgICBMQVlFUiBNMSA7Ci0gICAgICAgICAgICBXSURUSCA1LjYgOwotICAgICAgICAgICAgUEFUSCA1MC40IDIuOCA1MC40IDIwNy4yIDsKLSAgICAgIEVORAotICAgRU5EIFZERAotCi0gICBQSU4gVlNTIERJUkVDVElPTiBJTk9VVCA7Ci0gICAgICBTSEFQRSBGRUVEVEhSVSA7Ci0gICAgICBQT1dFUiAwLjQgOwotICAgICAgUE9SVAotICAgICAgICAgTEFZRVIgTTEgOwotICAgICAgICAgICAgV0lEVEggNS42IDsKLSAgICAgICAgICAgIFBBVEggMTYuOCAyLjggMTYuOCAyMDcuMiA7Ci0gICAgICBFTkQKLSAgIEVORCBWU1MKLQotICAgVElNSU5HCi0gICAgICBGUk9NUElOIEQgOwotICAgICAgVE9QSU4gUSA7Ci0gICAgICBSSVNFIElOVFJJTlNJQyAuNTEgLjYgMS40IC4zNyAuNDUgMS43IC42IC44MSAyLjEKLSAgICAgICAgIFZBUklBQkxFIDAuMDYgMC4xIDsKLSAgICAgIEZBTEwgSU5UUklOU0lDIDEgMS4yIDEuNCAxLjc3IDEuODUgMS44IC41NiAuODEgMi40Ci0gICAgICAgICBWQVJJQUJMRSAwLjA4IDAuMDkgOwotICAgICAgUklTRVJTIDQxLjU4OSA2OS4zMTUgOwotICAgICAgRkFMTFJTIDU1LjQ1MiA2Mi4zODMgOwotICAgICAgUklTRUNTIDAuMTEzIDAuMTEzIDsKLSAgICAgIEZhbGxDUyAwLjExMyAwLjExMyA7Ci0gICAgICBSSVNFVDAgMC4wMjM5MjkgMC4wMjM5MjkgOwotICAgICAgRkFMTFQwIDAuMzggMC4zOCA7Ci0gICAgICBSSVNFU0FUVDEgMCAwIDsKLSAgICAgIEZBTExTQVRUMSAwLjE1IDAuMTUgOwotICAgICAgVU5BVEVORVNTICAgICAgTk9OSU5WRVJUIDsKLSAgIEVORCBUSU1JTkcKLQotICAgT0JTCi0gICAgICBMQVlFUiBNMSBERVNJR05SVUxFV0lEVEggMC4xNSA7Ci0gICAgICAgICBSRUNUIDI0LjEgMS41IDQzLjUgMjA4LjUgOwotICAgICAgICAgUEFUSCA4LjQgMyA4LjQgMTIzIDsKLSAgICAgICAgIFBBVEggNTguOCAzIDU4LjggMTIzIDsKLSAgICAgICAgIFBBVEggNjQuNCAzIDY0LjQgMTIzIDsKLSAgIEVORAotCi0gICBERU5TSVRZCi0gICAgICBMQVlFUiBtZXRhbDQgOwotICAgICAgICAgUkVDVCAyNC4xIDEuNSA0My41IDIwOC41IDUuNSA7Ci0gICBFTkQKLUVORCBERkYzCi0KLU1BQ1JPIEJVRjEKLSAgIENMQVNTIEVORENBUCBCT1RUT01MRUZUIDsKLSAgIFBJTiBJTgotICAgICAgQU5URU5OQUdBVEVBUkVBIDEgOwotICAgICAgQU5URU5OQUdBVEVBUkVBIDMgOwotICAgICAgQU5URU5OQURJRkZBUkVBIDAgOwotICAgICAgQU5URU5OQU1PREVMIE9YSURFMiA7Ci0gICAgICBBTlRFTk5BR0FURUFSRUEgMiA7Ci0gICAgICBBTlRFTk5BR0FURUFSRUEgNCA7Ci0gICAgICBBTlRFTk5BRElGRkFSRUEgMCA7Ci0gICBFTkQgSU4KLSAgIFBJTiBJTjIKLSAgICAgIEFOVEVOTkFHQVRFQVJFQSAxIDsKLSAgIEVORCBJTjIKLSAgIFBJTiBJTjMKLSAgICAgIFNIQVBFIEFCVVRNRU5UIDsKLSAgIEVORCBJTjMKLSAgIFBJTiBHTkQKLSAgICAgIFVTRSBHUk9VTkQgOwotICAgICAgUE9SVAotICAgICAgICAgTEFZRVIgbWV0YWwxIDsKLSAgICAgICAgIFBPTFlHT04gMCAwIDAgMS4wIDEuMCAwIDIuMCAyLjAgMi4wIDAgOwotICAgICAgICAgUkVDVCAyLjAgMy4wIDQuMCA1LjAgOwotICAgICAgRU5ECi0gICBFTkQgR05ECi0gICBPQlMKLSAgICAgIExBWUVSIG1ldGFsMiBFWENFUFRQR05FVCA7ICAgICAgICAgICAgICMgNS43Ci0gICAgICBQT0xZR09OIDAgMCAwIDEuMCAxLjAgMCAyLjAgMi4wIDIuMCAwIDsKLSAgICAgIFJFQ1QgMi4wIDMuMCA0LjAgNS4wIDsKLSAgIEVORAotRU5EIEJVRjEKLQotTUFDUk8gREZGNAotICAgQ0xBU1MgQ09WRVIgQlVNUCA7Ci0gICBGT1JFSUdOIERGRjNTIDsKLSAgIFBPV0VSIDQuMCA7Ci1FTkQgREZGNAotCi1NQUNSTyBERkY1Ci0gICBDTEFTUyBDT1ZFUiA7Ci0gICBGT1JFSUdOIERGRjNTIDsKLUVORCBERkY1Ci0KLU1BQ1JPIG15ZHJpdmVyCi0gICBDTEFTUyBQQUQgQVJFQUlPIDsKLSAgIEZPUkVJR04gREZGM1MgOwotRU5EIG15ZHJpdmVyCi0KLU1BQ1JPIG15YmxhY2tib3gKLSAgIENMQVNTIEJMT0NLIEJMQUNLQk9YIDsKLSAgIEZPUkVJR04gREZGM1MgOwotRU5EIG15YmxhY2tib3gKLQotTUFDUk8gRldIU1FDTjY5MFYxNQotICAgQ0xBU1MgQ09SRSA7Ci0gICBGT1JFSUdOIEZXSFNRQ042OTAgMC4wMCAwLjAwIDsKLSAgIFNJWkUgMTUuMzYgQlkgNC44MCA7Ci0gICBTWU1NRVRSWSBZIFggOwotICAgT1JJR0lOIDAuMCAwLjAgOwotICAgU0lURSBDT1JFIDsKLSAgIFBJTiBSIERJUkVDVElPTiBJTlBVVCA7Ci0gICAgICBDQVBBQ0lUQU5DRSAwLjAwNDg3MiA7Ci0gICAgICBVU0UgU0lHTkFMIDsKLSAgICAgIFBPUlQKLSAgICAgICAgIExBWUVSIGExc2lnIDsKLSAgICAgICAgIFJFQ1QgMTEuNDMgMC44MCAxMS43MSAxLjIwIDsKLSAgICAgICAgIFJFQ1QgOS45NCAwLjgwIDExLjQzIDEuMDQgOwotICAgICAgICAgTEFZRVIgYTFzaWcgOwotICAgICAgICAgUkVDVCA5LjQ5IDAuODAgOS43MSAwLjgyIDsKLSAgICAgICAgIFJFQ1QgOS43MSAwLjgwIDkuOTMgMS4wNCA7Ci0gICAgICAgICBSRUNUIDkuOTIgMC44MCA5Ljk0IDEuMDQgOwotICAgICAgICAgUkVDVCA5LjAwIDIuMDYgOS43MiAyLjA4IDsKLSAgICAgICAgIFJFQ1QgOS4zOSAwLjgwIDkuNDcgMS43OCA7Ci0gICAgICAgICBSRUNUIDkuNDYgMC44MCA5LjQ4IDEuNzggOwotICAgICAgICAgUkVDVCA5LjQ3IDAuODAgOS40OSAxLjc3IDsKLSAgICAgICAgIFJFQ1QgOS40OCAwLjgxIDkuNzIgMi4wNyA7Ci0gICAgICAgICBSRUNUIDkuMDAgMS43NyA5LjQ4IDIuMDcgOwotICAgICAgRU5ECi0gICBFTkQgUgotICAgUElOIFNJIERJUkVDVElPTiBJTlBVVCA7Ci0gICAgICBDQVBBQ0lUQU5DRSAwLjAwMjIxMyA7Ci0gICAgICBVU0UgU0lHTkFMIDsKLSAgICAgIFBPUlQKLSAgICAgICAgIExBWUVSIGExc2lnIDsKLSMgICAgICAgICBSRUNUIDQuMDAgMi4wNyA0LjIwIDIuMzYgOwotIyAgICAgICAgIFJFQ1QgNC4xOSAyLjA3IDQuMjEgMi4zNiA7Ci0jICAgICAgICAgUkVDVCA0LjIxIDIuMDcgNC40NCAyLjI1IDsKLSMgICAgICAgICBSRUNUIDQuMjEgMi4yNCA0LjQ0IDIuMjYgOwotIyAgICAgICAgIFJFQ1QgNC4yMCAyLjI1IDQuNDQgMy4wMyA7Ci0gICAgICBFTkQKLSAgIEVORCBTSQotICAgUElOIFNNIERJUkVDVElPTiBJTlBVVCA7Ci0gICAgICBDQVBBQ0lUQU5DRSAwLjAwMjMwNyA7Ci0gICAgICBVU0UgU0lHTkFMIDsKLSAgICAgIFBPUlQKLSAgICAgICAgIExBWUVSIGExc2lnIDsKLSAgICAgICAgIFJFQ1QgMC44MiAzLjUxIDEuMDggMy44OSA7Ci0gICAgICAgICBMQVlFUiBhMXNpZyA7Ci0gICAgICAgICBSRUNUIDAuMzYgMy41MSAwLjU5IDMuNjkgOwotICAgICAgICAgUkVDVCAwLjM2IDMuNjggMC41OSAzLjcwIDsKLSAgICAgICAgIFJFQ1QgMC41OSAzLjUxIDAuODEgMy44OSA7Ci0gICAgICAgICBSRUNUIDAuNTkgMy41MSAwLjgxIDMuODkgOwotICAgICAgICAgUkVDVCAwLjgwIDMuNTEgMC44MiAzLjg5IDsKLSAgICAgICAgIFJFQ1QgMC4zNiAzLjY5IDAuNjAgMy45OSA7Ci0gICAgICAgICBMQVlFUiBhMXNpZyA7Ci0gICAgICBFTkQKLSAgIEVORCBTTQotICAgUElOIFQgRElSRUNUSU9OIElOUFVUIDsKLSAgICAgIENBUEFDSVRBTkNFIDAuMDAyMjYwIDsKLSAgICAgIFVTRSBTSUdOQUwgOwotICAgICAgUE9SVAotICAgICAgICAgTEFZRVIgYTFzaWcgOwotIyAgICAgICAgUkVDVCA1LjE0IDMuNTEgNS4xNSAzLjk5IDsKLSAgICAgICAgIExBWUVSIGExc2lnIDsKLSAgICAgICAgIFJFQ1QgNC44NSAzLjUxIDQuOTEgMy43MCA7Ci0gICAgICAgICBSRUNUIDQuOTEgMy41MSA1LjEzIDMuOTkgOwotICAgICAgICAgUkVDVCA1LjEyIDMuNTEgNS4xNCAzLjk5IDsKLSAgICAgICAgIFJFQ1QgNC4yMCAzLjY5IDQuOTIgMy45OSA7Ci0gICAgICBFTkQKLSAgIEVORCBUCi0gICBPQlMKLSAgICAgIExBWUVSIGExc2lnIFNQQUNJTkcgMCA7Ci0gICAgICBSRUNUIDAuMTEgMC43NCAwLjgxIDMuNDcgOwotICAgICAgUkVDVCAwLjgwIDAuNzQgMC44MiAzLjQ3IDsKLSAgICAgIFJFQ1QgMC44MiAwLjc0IDIuNTQgNC4wNiA7Ci0gICAgICBSRUNUIDIuNTQgMC43NCAzLjcwIDMuNDcgOwotICAgICAgUkVDVCAzLjcwIDAuNzQgMy45OCA0LjA2IDsKLSAgICAgIFJFQ1QgMy45OCAwLjc0IDUuMTQgMy40NyA7Ci0gICAgICBSRUNUIDUuMTQgMC43NCA4Ljc4IDQuMDYgOwotICAgICAgUkVDVCA4Ljc4IDAuNzQgOS45NCAxLjU0IDsKLSAgICAgIFJFQ1QgOC43OCAxLjUzIDkuOTQgMS41NSA7Ci0gICAgICBSRUNUIDguNzggMi4yOSA5Ljk0IDQuMDYgOwotICAgICAgUkVDVCA5Ljk0IDAuNzQgMTQuMDYgNC4wNiA7Ci0gICAgICBSRUNUIDE0LjA2IDAuNzQgMTUuMjQgMi41MSA7Ci0gICAgICBSRUNUIDE1LjIzIDAuNzQgMTUuMjUgMi41MSA7Ci0gICAgICBSRUNUIDE0LjA2IDMuMjUgMTUuMjUgNC4wNSA7Ci0gICAgICBSRUNUIDE0LjA2IDQuMDQgMTUuMjUgNC4wNiA7Ci0gICBFTkQKLUVORCBGV0hTUUNONjkwVjE1Ci0KLU1BQ1JPIG15c29mdAotICAgQ0xBU1MgQkxPQ0sgU09GVCA7Ci0gICBGT1JFSUdOIERGRjNTIDsKLSAgIE9CUwotICAgICAgTEFZRVIgYTFzaWcgREVTSUdOUlVMRVdJRFRIIDAgOwotICAgICAgUkVDVCAwLjExIDAuNzQgMC44MSAzLjQ3IDsKLSAgIEVORAotRU5EIG15c29mdAotCi1NQUNSTyBteWNvcmV3ZWxsdGFwCi0gICBDTEFTUyBDT1JFIFdFTExUQVAgOwotICAgRk9SRUlHTiBERkYzUyA7Ci1FTkQgbXljb3Jld2VsbHRhcAotCi1NQUNSTyBteVRlc3QKLSAgIENMQVNTIENPUkUgOwotICAgU0laRSAxMC4wIEJZIDE0LjAgOyAjdXNlcyB0d28gRiBhbmQgb25lIEwgc2l0ZSwgaXMgRitMIHdpZGUsYW5kIGRvdWJsZSBoZWlnaHQKLSAgIFNZTU1FVFJZIFggOyAgICAgICAgI2NhbiBmbGlwIGFib3V0IFgtYXhpcwotICAgU0lURSBGc2l0ZSAwIDAgTiA7ICAjdGhlIGxvd2VyLCBsZWZ0IEZzaXRlIGF0IDAsMAotICAgU0lURSBGc2l0ZSAwIDcuMCBGUyA7ICAjdGhlIGZsaXBwZWQtc291dGggRnNpdGUgYWJvdmUgdGhlIGZpcnN0IEZzaXRlIGF0IDAsNwotICAgU0lURSBMc2l0ZSA0LjAgMCBOIDsgICAjdGhlIExzaXRlIHRvIHRoZSByaWdodCBvZiB0aGUgZmlyc3QgRnNpdGUgYXQgNCwwCi0gICBTSVRFIExzaXRlIDAgMCBTIERPIDIgQlkgMSBTVEVQIDQgNSA7Ci0gICBTSVRFIEZzaXRlIDQuMCAwIEUgOwotICAgU0lURSBGc2l0ZSA7Ci0gICBTSVRFIExzaXRlIDAuMyAwIFMgRE8gMiBCWSAxIFNURVAgNCA1IDsKLSAgIFNJVEUgRnNpdGUgMCAwIE4gRE8gMiBCWSAxIFNURVAgNC4wIDAgOwotRU5EIG15VGVzdAotCi1NQUNSTyBteU1hYwotICAgQ0xBU1MgQ09SRSA7Ci0gICBTSVpFIDEwLjAgQlkgMTQuMCA7Ci0gICBTWU1NRVRSWSBYIDsKLSAgIFBJTiBJbjEKLSAgICAgIFVTRSBTSUdOQUwgOwotICAgICAgU1VQUExZU0VOU0lUSVZJVFkgdmRkcGluMSA7ICNpZiBpbjEgaXMgMSdiMSwgdXNlIG5ldCBjb25uZWN0ZWQgdG8gdmRkcGluMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI25vdGUsIG5vIEdST1VORFNFTlNJVElWSVRZIGlzIG5lZWRlZCBiZWNhdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjb25seSBvbmUgZ3JvdW5kIHBpbiBleGlzdHMsIHNvIDEnYjAgaW1wbGljaXRseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI21lYW5zIG5ldCBmcm9tIHBpbiBnbmRwaW4KLSAgICAgIENBUEFDSVRBTkNFIDAuMTIgOwotICAgICAgTUFYREVMQVkgMjAgOwotICAgRU5EIEluMQotICAgUElOIHZkZHBpbjEKLSAgICAgIFVTRSBTSUdOQUwgOwotICAgICAgQ0FQQUNJVEFOQ0UgMC4xMSA7Ci0gICAgICBNQVhERUxBWSAyMCA7Ci0gICAgICBORVRFWFBSICJwb3dlcjEgVkREMSIgOyAgICAjaWYgcG93ZXIxIGlzIGRlZmluZWQgaW4gdGhlIG5ldGxpc3QsIHVzZSBpdCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2ZpbmQgdGhlIG5ldCBjb25uZWN0aW9uLCBlbHNlIHVzZSBuZXQgVkREMQotICAgICAgUE9XRVIgMC40IDsKLSAgIEVORCB2ZGRwaW4xCi0gICBQSU4gdmRkcGluMgotICAgICAgVVNFIFNJR05BTCA7Ci0gICAgICBNQVhERUxBWSAyMCA7Ci0gICAgICBORVRFWFBSICJwb3dlcjIgVkREMiIgOyAgICAjaWYgcG93ZXIyIGlzIGRlZmluZWQgaW4gdGhlIG5ldGxpc3QsIHVzZSBpdCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2ZpbmQgdGhlIG5ldCBjb25uZWN0aW9uLCBlbHNlIHVzZSBuZXQgVkREMgotICAgICAgUE9XRVIgMC40IDsKLSAgIEVORCB2ZGRwaW4yCi0gICBQSU4gZ25kcGluCi0gICAgICBVU0UgU0lHTkFMIDsKLSAgICAgIE5FVEVYUFIgImduZDEgR05EIiA7ICAgICAgICNpZiBnbmQxIGlzIGRlZmluZWQgaW4gdGhlIG5ldGxpc3QsIHVzZSBpdCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2ZpbmQgdGhlIG5ldCBjb25uZWN0aW9uLCBlbHNlIHVzZSBuZXQgR05ECi0gICAgICBNQVhERUxBWSAyMCA7Ci0gICAgICBQT1dFUiAwLjQgOwotICAgRU5EIGduZHBpbgotICAgUElOIEluMgotICAgICAgVVNFIFNJR05BTCA7Ci0gICAgICBHUk9VTkRTRU5TSVRJVklUWSBnbmRwaW4gOwotICAgICAgUE9XRVIgMC42IDsKLSAgIEVORCBJbjIKLUVORCBteU1hYwotCi1BTlRFTk5BSU5QVVRHQVRFQVJFQSA0NSA7Ci1BTlRFTk5BSU5PVVRESUZGQVJFQSA2NSA7Ci1BTlRFTk5BT1VUUFVURElGRkFSRUEgNTUgOwotCi0jSU5QVVRQSU5BTlRFTk5BU0laRSAxIDsKLSNPVVRQVVRQSU5BTlRFTk5BU0laRSAtMSA7Ci0jSU5PVVRQSU5BTlRFTk5BU0laRSAtMSA7Ci0KLUJFR0lORVhUICJTSUdOQVRVUkUiCi0gICBDUkVBVE9SICJDQURFTkNFIgotICAgREFURSAiMDQvMTQvOTgiCi1FTkRFWFQKLQotI0VORCBMSUJSQVJZICAgVGhpcyBpcyBvcHRpb25hbCBpbiA1LjYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9URVNUL2NvbXBsZXRlLjUuOC5sZWYuYXUgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvVEVTVC9jb21wbGV0ZS41LjgubGVmLmF1CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTAwNzYxLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9URVNUL2NvbXBsZXRlLjUuOC5sZWYuYXUKKysrIC9kZXYvbnVsbApAQCAtMSwxNTc0ICswLDAgQEAKLVZFUlNJT04gNS44IDsKLUZJWEVETUFTSyA7Ci1CVVNCSVRDSEFSUyAiPD4iIDsKLURJVklERVIgOiA7Ci1VU0VNSU5TUEFDSU5HIE9CUyBPRkYgOwotQ0xFQVJBTkNFTUVBU1VSRSBFVUNMSURFQU4gOwotQ0xFQVJBTkNFTUVBU1VSRSBNQVhYWSA7Ci1VTklUUwotICBEQVRBQkFTRSBNSUNST05TIDIwMDAwIDsKLSAgQ0FQQUNJVEFOQ0UgUElDT0ZBUkFEUyAxMCA7Ci0gIFJFU0lTVEFOQ0UgT0hNUyAxMDAwMCA7Ci0gIFBPV0VSIE1JTExJV0FUVFMgMTAwMDAgOwotICBDVVJSRU5UIE1JTExJQU1QUyAxMDAwMCA7Ci0gIFZPTFRBR0UgVk9MVFMgMTAwMCA7Ci0gIEZSRVFVRU5DWSBNRUdBSEVSVFogMTAgOwotRU5EIFVOSVRTCi1NQU5VRkFDVFVSSU5HR1JJRCAzLjUgOwotUFJPUEVSVFlERUZJTklUSU9OUwotIGxpYnJhcnkgTkFNRSBDYWRlbmNlOTYKLSBsaWJyYXJ5IGludE51bSBJTlRFR0VSIDIwCi0gbGlicmFyeSByZWFsTnVtIFJFQUwgMjEuMjIKLSBsaWJyYXJ5IExFRjU3X01BWEZMT0FUSU5HQVJFQUdBVEUgTUFYRkxPQVRJTkdBUkVBIEdBVEVJU0dST1VORDsKLSBsYXllciBsc3AgU1RSSU5HCi0gbGF5ZXIgbGlwIElOVEVHRVIKLSBsYXllciBscnAgUkVBTAotIGxheWVyIExFRjU3X1NQQUNJTkcgU1RSSU5HCi0gbGF5ZXIgTEVGNTdfU1BBQ0lOR0FESkFDRU5UQ1VUUyBTVFJJTkcKLSBsYXllciBMRUY1N19NQVhGTE9BVElOR0FSRUEgU1RSSU5HCi0gbGF5ZXIgTEVGNTdfQVJSQVlTUEFDSU5HIFNUUklORwotIGxheWVyIExFRjU3X1NQQUNJTkdTQU1FTkVUIFNUUklORwotIGxheWVyIExFRjU3X01JTlNURVAgU1RSSU5HCi0gbGF5ZXIgTEVGNTdfQU5URU5OQUdBVEVQTFVTRElGRiBTVFJJTkcKLSBsYXllciBMRUY1N19BTlRFTk5BQ1VNUk9VVElOR1BMVVNDVVQgU1RSSU5HCi0gbGF5ZXIgTEVGNTdfQU5URU5OQUFSRUFNSU5VU0RJRkYgU1RSSU5HCi0gbGF5ZXIgTEVGNTdfQU5URU5OQUFSRUFESUZGUkVEVUNFUFdMIFNUUklORwotIGxheWVyIExFRjU3X0VOQ0xPU1VSRSBTVFJJTkcKLSB2aWEgc3RyaW5nUHJvcGVydHkgU1RSSU5HCi0gdmlhIHJlYWxQcm9wZXJ0eSBSRUFMCi0gdmlhIENPVU5UIElOVEVHRVIgUkFOR0UgMSAxMDAKLVBhcnNlZCA1MCBudW1iZXIgb2YgbGluZXMhIQotIHZpYXJ1bGUgdnJzcCBTVFJJTkcKLSB2aWFydWxlIHZyaXAgSU5URUdFUgotIHZpYXJ1bGUgdnJycCBSRUFMCi0gbm9uZGVmYXVsdHJ1bGUgbmRyc3AgU1RSSU5HCi0gbm9uZGVmYXVsdHJ1bGUgbmRyaXAgSU5URUdFUgotIG5vbmRlZmF1bHRydWxlIG5kcnJwIFJFQUwKLSBtYWNybyBzdHJpbmdQcm9wIFNUUklORwotIG1hY3JvIGludGVnZXJQcm9wIElOVEVHRVIKLSBtYWNybyBXRUlHSFQgUkVBTCBSQU5HRSAxIDEwMAotIHBpbiBUWVBFIFNUUklORwotIHBpbiBpbnRQcm9wIElOVEVHRVIKLSBwaW4gcmVhbFByb3AgUkVBTAotRU5EIFBST1BFUlRZREVGSU5JVElPTlMKLUxBWUVSIFBPTFlTCi0gIFRZUEUgTUFTVEVSU0xJQ0UgOwotICBQUk9QRVJUWSBsc3AgdG9wIFNUUklORyBsaXAgMSBJTlRFR0VSIGxycCAyLjMgUkVBTCA7Ci1FTkQgUE9MWVMKLUxBWUVSIFBPTFlTMDEKLSAgVFlQRSBNQVNURVJTTElDRSA7Ci1FTkQgUE9MWVMwMQotTEFZRVIgQ1VUMDEKLSAgVFlQRSBDVVQgOwotICBQSVRDSCAxLjIgMS4zIDsKLSAgT0ZGU0VUIDAuNSAwLjYgOwotICBESUFHUElUQ0ggNi41IDsKLSAgQVJSQVlTUEFDSU5HIFdJRFRIIDIgQ1VUU1BBQ0lORyAwLjIKLQlBUlJBWUNVVFMgMyBTUEFDSU5HIDEgOwotICBTUEFDSU5HIDAuMzUgQURKQUNFTlRDVVRTIDMgV0lUSElOIDAuMjUgOwotICBTUEFDSU5HIDEuNSBQQVJBTExFTE9WRVJMQVAgOwotRU5DTE9TVVJFIEFCT1ZFIDAuMDEgMC4wNSA7Ci1FTkNMT1NVUkUgQkVMT1cgMC4wMyAwLjA1IFdJRFRIIDMuMSBFWENFUFRFWFRSQUNVVCAxLjUgOwotRU5DTE9TVVJFIDAuMDUgMC4wNSA7Ci0gIFBST1BFUlRZIGxpcCA1IElOVEVHRVIgTEVGNTdfU1BBQ0lORyBTUEFDSU5HIDEuNSBQQVJBTExFTE9WRVJMQVAgOyBTVFJJTkcgTEVGNTdfQVJSQVlTUEFDSU5HIEFSUkFZU1BBQ0lORyAgV0lEVEggMi4wIENVVFNQQUNJTkcgMC4yIEFSUkFZQ1VUUyAzIFNQQUNJTkcgMS4wIDsgU1RSSU5HIExFRjU3X0VOQ0xPU1VSRSBFTkNMT1NVUkUgQUJPVkUgLjAxIC4wNSA7IFNUUklORyBMRUY1N19FTkNMT1NVUkUgRU5DTE9TVVJFIEFCT1ZFIC4wMiAuMDUgV0lEVEggMy4xIEVYQ0VQVEVYVFJBQ1VUIDEuNSBOT1NIQVJFREVER0UgOyBTVFJJTkcgTEVGNTdfRU5DTE9TVVJFIEVOQ0xPU1VSRSBCRUxPVyAuMDMgLjA1IFdJRFRIIDMuMSBFWENFUFRFWFRSQUNVVCAxLjUgOyBTVFJJTkcgTEVGNTdfRU5DTE9TVVJFIEVOQ0xPU1VSRSAuMDUgLjA1IDsgU1RSSU5HIExFRjU3X0VOQ0xPU1VSRSBFTkNMT1NVUkUgQkVMT1cgLjA4IC4wNSBXSURUSCAzLjEgRVhDRVBURVhUUkFDVVQgMS41IE5PU0hBUkVERURHRSA7IFNUUklORyA7Ci1FTkQgQ1VUMDEKLVBhcnNlZCAxMDAgbnVtYmVyIG9mIGxpbmVzISEKLVBhcnNlZCAxNTAgbnVtYmVyIG9mIGxpbmVzISEKLUxBWUVSIFJYCi0gIFRZUEUgUk9VVElORyA7Ci0gIE1BU0sgMiA7Ci0gIFBJVENIIDEuOCA7Ci0gIE9GRlNFVCAwLjkgOwotICBXSURUSCAxIDsKLSAgQVJFQSAzNC4xIDsKLSAgQVJSQVlTUEFDSU5HIExPTkdBUlJBWSBDVVRTUEFDSU5HIDAuMgotCUFSUkFZQ1VUUyAzIFNQQUNJTkcgMQotCUFSUkFZQ1VUUyA0IFNQQUNJTkcgMS41Ci0JQVJSQVlDVVRTIDUgU1BBQ0lORyAyIDsKLSAgU1BMSVRXSVJFV0lEVEggNSA7Ci0gIE1JTklNVU1ERU5TSVRZIDQgOwotICBNQVhJTVVNREVOU0lUWSAxMCA7Ci0gIERFTlNJVFlDSEVDS1NURVAgMiA7Ci0gIEZJTExBQ1RJVkVTUEFDSU5HIDQgOwotICBNSU5JTVVNQ1VUIDIgV0lEVEggMi41IDsKLSAgU1BBQ0lORyAwLjYgOwotICBTUEFDSU5HIDAuMTggTEVOR1RIVEhSRVNIT0xEIDAuOSA7Ci0gIFNQQUNJTkcgMC40IFJBTkdFIDAuMSAwLjEyIDsKLSAgU1BBQ0lORyAwLjMyIFJBTkdFIDEuMDEgMjAwMCBVU0VMRU5HVEhUSFJFU0hPTEQgOwotICBTUEFDSU5HIDAuMSBSQU5HRSAwLjEgMC4xIElORkxVRU5DRSAyLjAxIFJBTkdFIDIuMSAxMDAwMCA7Ci0gIFNQQUNJTkcgMC40NCBSQU5HRSAxIDEgSU5GTFVFTkNFIDEuMDEgOwotICBTUEFDSU5HIDAuMzMgUkFOR0UgMS4wMSAyMCBJTkZMVUVOQ0UgMS4wMSA7Ci0gIFNQQUNJTkcgMC43IFJBTkdFIDAuMyAwLjE1IFVTRUxFTkdUSFRIUkVTSE9MRCA7Ci0gIFNQQUNJTkcgMC41IDsKLSAgU1BBQ0lORyAwLjYgUkFOR0UgNC41IDYuMTIgUkFOR0UgMyAzLjEgOwotICBTUEFDSU5HIDQuMyBSQU5HRSAwLjEgMC4xIElORkxVRU5DRSAzLjgxIFJBTkdFIDAuMSAwLjIgOwotICBTUEFDSU5HIDAuNTMgTEVOR1RIVEhSRVNIT0xEIDAuNDUgUkFOR0UgMCAwLjE7Ci0gIFNQQUNJTkcgMi4yIEVORE9GTElORSAyLjMgV0lUSElOIDEuNiA7Ci0gIERJUkVDVElPTiBIT1JJWk9OVEFMIDsKLSAgUkVTSVNUQU5DRSBSUEVSU1EgMC4xMDMgOwotICBDQVBBQ0lUQU5DRSBDUEVSU1FESVNUIDAuMDAwMTU2IDsKLSAgRURHRUNBUEFDSVRBTkNFIDVlLTA1IDsKLSAgVFlQRSA5IDsKLSAgVEhJQ0tORVNTIDEgOwotICBXSVJFRVhURU5TSU9OIDAuNzUgOwotICBTSFJJTktBR0UgMC4xIDsKLSAgQ0FQTVVMVElQTElFUiAxIDsKLSAgQU5URU5OQU1PREVMIE9YSURFMSA7Ci0gIEFOVEVOTkFBUkVBRkFDVE9SIDEgOwotICBBTlRFTk5BTU9ERUwgT1hJREUyIDsKLSAgQU5URU5OQUFSRUFSQVRJTyA3LjYgOwotICBBTlRFTk5BRElGRkFSRUFSQVRJTyA0LjcgOwotICBBTlRFTk5BQ1VNQVJFQVJBVElPIDYuNyA7Ci0gIEFOVEVOTkFDVU1ESUZGQVJFQVJBVElPIDQuNQotICBBTlRFTk5BQ1VNRElGRkFSRUFSQVRJTyBQV0wgKCAoIDUuNCA1LjQgKSAoIDYuNSA2LjUgKSAoIDcuNSA3LjUgKSApIDsKLSAgQU5URU5OQUFSRUFGQUNUT1IgNi41ICAgRElGRlVTRU9OTFkgOwotICBBTlRFTk5BU0lERUFSRUFSQVRJTyA2LjUgOwotICBBTlRFTk5BRElGRlNJREVBUkVBUkFUSU8gNi41Ci0gIEFOVEVOTkFDVU1TSURFQVJFQVJBVElPIDcuNSA7Ci0gIEFOVEVOTkFDVU1ESUZGU0lERUFSRUFSQVRJTyA0LjYKLSAgQU5URU5OQVNJREVBUkVBRkFDVE9SIDcuNSAgIERJRkZVU0VPTkxZIDsKLSAgQU5URU5OQUNVTVJPVVRJTkdQTFVTQ1VUIDsKLSAgQU5URU5OQUdBVEVQTFVTRElGRiAyIDsKLSAgQU5URU5OQUFSRUFNSU5VU0RJRkYgMTAwIDsKLSAgQU5URU5OQUFSRUFESUZGUkVEVUNFUFdMICggKCAwIDEgKSAoIDAuMDk5OTkgMSApICggMC4xIDAuMiApICggMSAwLjEgKSAoIDEwMDAgMC4xICkgKSA7Ci0gIEFOVEVOTkFNT0RFTCBPWElERTMgOwotICBBTlRFTk5BTU9ERUwgT1hJREU0IDsKLSAgQU5URU5OQUNVTVJPVVRJTkdQTFVTQ1VUIDsKLSAgQU5URU5OQUdBVEVQTFVTRElGRiAyIDsKLSAgQU5URU5OQUFSRUFNSU5VU0RJRkYgMTAwIDsKLSAgQU5URU5OQUFSRUFESUZGUkVEVUNFUFdMICggKCAwIDEgKSAoIDAuMDk5OSAxICkgKCAwLjEgMC4yICkgKCAxIDAuMSApICggMTAwMCAwLjEgKSApIDsKLSAgQUNDVVJSRU5UREVOU0lUWSBQRUFLCi0gICAgRlJFUVVFTkNZIDFlKzA2IDFlKzA4IDsKLSAgICBUQUJMRUVOVFJJRVMKLSAgICAgNWUtMDcgNGUtMDcgOwotICBBQ0NVUlJFTlRERU5TSVRZIEFWRVJBR0UgNS41IDsKLSAgQUNDVVJSRU5UREVOU0lUWSBSTVMKLSAgICBGUkVRVUVOQ1kgMWUrMDggNGUrMDggOGUrMDggOwotICAgIFdJRFRIIDAuNCAwLjggMTAgNTAgMTAwIDsKLSAgICBUQUJMRUVOVFJJRVMKLSAgICAgMmUtMDYgMS45ZS0wNiAxLjhlLTA2IDEuN2UtMDYgMS41ZS0wNgotICAgICAxLjRlLTA2IDEuM2UtMDYgMS4yZS0wNiAxLjFlLTA2IDFlLTA2Ci0gICAgIDllLTA3IDhlLTA3IDdlLTA3IDZlLTA3IDRlLTA3IDsKLSAgRENDVVJSRU5UREVOU0lUWSBBVkVSQUdFCi0gICAgV0lEVEggMjAgNTAgOwotICAgIFRBQkxFRU5UUklFUyA2ZS0wNyA1ZS0wNyA7Ci0gIFBST1BFUlRZIExFRjU3X1NQQUNJTkcgU1BBQ0lORyAyLjIgRU5ET0ZMSU5FIDIuMyBXSVRISU4gMS42IDsgU1RSSU5HIExFRjU3X0FSUkFZU1BBQ0lORyBBUlJBWVNQQUNJTkcgTE9OR0FSUkFZIENVVFNQQUNJTkcgMC4yIEFSUkFZQ1VUUyAzIFNQQUNJTkcgMS4wIEFSUkFZQ1VUUyA0IFNQQUNJTkcgMS41IEFSUkFZQ1VUUyA1IFNQQUNJTkcgMi4wIDsgU1RSSU5HIExFRjU3X0FOVEVOTkFDVU1ST1VUSU5HUExVU0NVVCBBTlRFTk5BQ1VNUk9VVElOR1BMVVNDVVQgOyBTVFJJTkcgTEVGNTdfQU5URU5OQUFSRUFNSU5VU0RJRkYgQU5URU5OQUFSRUFNSU5VU0RJRkYgMTAwLjAgOyBTVFJJTkcgTEVGNTdfQU5URU5OQUdBVEVQTFVTRElGRiBBTlRFTk5BR0FURVBMVVNESUZGIDIuMCA7IFNUUklORyBMRUY1N19BTlRFTk5BQVJFQURJRkZSRURVQ0VQV0wgQU5URU5OQUFSRUFESUZGUkVEVUNFUFdMICggKCAwLjAgMS4wICkgKCAwLjA5OTkgMS4wICkgKCAwLjEgMC4yICkgKCAxLjAgMC4xICkgKCAxMDAwLjAgMC4xICkgKSA7IFNUUklORyBsc3AgcnhsYXkgU1RSSU5HIGxpcCAzIElOVEVHRVIgbHJwIDEuMiBSRUFMIDsKLUVORCBSWAotUGFyc2VkIDIwMCBudW1iZXIgb2YgbGluZXMhIQotTEFZRVIgQ1VUMTIKLSAgVFlQRSBDVVQgOwotICBESUFHUElUQ0ggMS41IDEuNyA7Ci0gIERJQUdXSURUSCAxLjYgOwotICBESUFHU1BBQ0lORyAwLjUgOwotICBTUEFDSU5HIDAuNyBMQVlFUiBSWCA7Ci0gIFNQQUNJTkcgMC4yMiBBREpBQ0VOVENVVFMgNCBXSVRISU4gMC4yNSA7Ci0gIFNQQUNJTkcgMS41IFBBUkFMTEVMT1ZFUkxBUCA7Ci0gIFNQQUNJTkcgMS4yIEFESkFDRU5UQ1VUUyAyIFdJVEhJTiAxLjUgRVhDRVBUU0FNRVBHTkVUIDsKLSAgQU5URU5OQU1PREVMIE9YSURFMSA7Ci0gIEFOVEVOTkFNT0RFTCBPWElERTIgOwotICBBTlRFTk5BTU9ERUwgT1hJREUzIDsKLSAgQU5URU5OQU1PREVMIE9YSURFNCA7Ci0gIEFOVEVOTkFBUkVBUkFUSU8gNS42IDsKLSAgQU5URU5OQURJRkZBUkVBUkFUSU8gNi41IDsKLSAgQU5URU5OQUNVTUFSRUFSQVRJTyA2LjcgOwotICBBTlRFTk5BQ1VNRElGRkFSRUFSQVRJTyA1LjYKLSAgQU5URU5OQUNVTURJRkZBUkVBUkFUSU8gUFdMICggKCA1LjQgNS40ICkgKCA2LjUgNi41ICkgKCA3LjUgNy41ICkgKSA7Ci0gIEFOVEVOTkFBUkVBRkFDVE9SIDUuNCA7Ci0gIEFOVEVOTkFDVU1ST1VUSU5HUExVU0NVVCA7Ci0gIEFOVEVOTkFHQVRFUExVU0RJRkYgMiA7Ci0gIEFOVEVOTkFBUkVBTUlOVVNESUZGIDEwMCA7Ci0gIEFOVEVOTkFBUkVBRElGRlJFRFVDRVBXTCAoICggMCAxICkgKCAwLjA5OTk5IDEgKSAoIDAuMSAwLjIgKSAoIDEgMC4xICkgKCAxMDAwIDAuMSApICkgOwotICBBQ0NVUlJFTlRERU5TSVRZIFBFQUsKLSAgICBGUkVRVUVOQ1kgMWUrMDYgMWUrMDggOwotICAgIFRBQkxFRU5UUklFUwotICAgICA1ZS0wNyA0ZS0wNyA7Ci0gIEFDQ1VSUkVOVERFTlNJVFkgQVZFUkFHRSA1LjUgOwotICBBQ0NVUlJFTlRERU5TSVRZIFJNUwotICAgIEZSRVFVRU5DWSAxZSswOCA0ZSswOCA4ZSswOCA7Ci0gICAgQ1VUQVJFQSAwLjQgMC44IDEwIDUwIDEwMCA7Ci0gICAgVEFCTEVFTlRSSUVTCi0gICAgIDJlLTA2IDEuOWUtMDYgMS44ZS0wNiAxLjdlLTA2IDEuNWUtMDYKLSAgICAgMS40ZS0wNiAxLjNlLTA2IDEuMmUtMDYgMS4xZS0wNiAxZS0wNgotICAgICA5ZS0wNyA4ZS0wNyA3ZS0wNyA2ZS0wNyA0ZS0wNyA7Ci0gIERDQ1VSUkVOVERFTlNJVFkgQVZFUkFHRQotICAgIENVVEFSRUEgMiA1IDsKLSAgICBUQUJMRUVOVFJJRVMgNWUtMDcgNGUtMDcgOwotICBEQ0NVUlJFTlRERU5TSVRZIEFWRVJBR0UgNC45IDsKLUVORCBDVVQxMgotUGFyc2VkIDI1MCBudW1iZXIgb2YgbGluZXMhIQotTEFZRVIgUEMKLSAgVFlQRSBST1VUSU5HIDsKLSAgUElUQ0ggMy44IDMuNSA7Ci0gIERJQUdQSVRDSCAxLjQgOwotICBXSURUSCAxIDsKLSAgU1BBQ0lORyAwLjYgOwotICBTUEFDSU5HIDEuMiBFTkRPRkxJTkUgMS4zIFdJVEhJTiAwLjYgOwotICBTUEFDSU5HIDEuMyBFTkRPRkxJTkUgMS40IFdJVEhJTiAwLjcgUEFSQUxMRUxFREdFIDEuMSBXSVRISU4gMC41IFRXT0VER0VTIDsKLSAgU1BBQ0lORyAxLjQgRU5ET0ZMSU5FIDEuNSBXSVRISU4gMC44IFBBUkFMTEVMRURHRSAxLjIgV0lUSElOIDAuNiA7Ci0gIERJUkVDVElPTiBWRVJUSUNBTCA7Ci0gIFdJUkVFWFRFTlNJT04gMC40IDsKLSAgQU5URU5OQU1PREVMIE9YSURFMSA7Ci0gIEFOVEVOTkFBUkVBUkFUSU8gNS40IDsKLSAgQU5URU5OQURJRkZBUkVBUkFUSU8gNi41IDsKLSAgQU5URU5OQUNVTUFSRUFSQVRJTyA3LjUgOwotICBBTlRFTk5BQ1VNRElGRkFSRUFSQVRJTyBQV0wgKCAoIDUgNS4xICkgKCA2IDYuMSApICkgOwotICBBTlRFTk5BQVJFQUZBQ1RPUiA0LjUgOwotICBBTlRFTk5BU0lERUFSRUFSQVRJTyA2LjUgOwotICBBTlRFTk5BRElGRlNJREVBUkVBUkFUSU8gUFdMICggKCA3IDcuMSApICggNy4yIDcuMyApICkgOwotICBBTlRFTk5BQ1VNU0lERUFSRUFSQVRJTyA3LjQgOwotICBBTlRFTk5BQ1VNRElGRlNJREVBUkVBUkFUSU8gUFdMICggKCA4IDguMSApICggOC4yIDguMyApICggOC40IDguNSApICggOC42IDguNyApICkgOwotICBBTlRFTk5BU0lERUFSRUFGQUNUT1IgOSAgIERJRkZVU0VPTkxZIDsKLSAgQUNDVVJSRU5UREVOU0lUWSBQRUFLCi0gICAgRlJFUVVFTkNZIDFlKzA2IDFlKzA4IDsKLSAgICBXSURUSCA1LjYgOC41IDguMSA0LjUgOwotICAgIFRBQkxFRU5UUklFUwotICAgICA1ZS0wNyA0ZS0wNyA7Ci0gIERDQ1VSUkVOVERFTlNJVFkgQVZFUkFHRQotICAgIFdJRFRIIDIwIDUwIDEwMCA7Ci0gICAgVEFCTEVFTlRSSUVTIDFlLTA2IDdlLTA3IDVlLTA3IDsKLUVORCBQQwotTEFZRVIgQ0EKLSAgVFlQRSBDVVQgOwotICBEQ0NVUlJFTlRERU5TSVRZIEFWRVJBR0UKLSAgICBDVVRBUkVBIDIgNSAxMCA7Ci0gICAgVEFCTEVFTlRSSUVTIDZlLTA3IDVlLTA3IDRlLTA3IDsKLUVORCBDQQotTEFZRVIgTTEKLSAgVFlQRSBST1VUSU5HIDsKLSAgUElUQ0ggMS44IDsKLSAgV0lEVEggMSA7Ci0gIERJUkVDVElPTiBIT1JJWk9OVEFMIDsKLSAgUkVTSVNUQU5DRSBSUEVSU1EgMC4xMDMgOwotICBDQVBBQ0lUQU5DRSBDUEVSU1FESVNUIDAuMDAwMTU2IDsKLSAgV0lSRUVYVEVOU0lPTiA3IDsKLSAgQU5URU5OQU1PREVMIE9YSURFMSA7Ci0gIEFOVEVOTkFESUZGQVJFQVJBVElPIDEwMDAgOwotICBBTlRFTk5BQ1VNQVJFQVJBVElPIDMwMCA7Ci0gIEFOVEVOTkFDVU1ESUZGQVJFQVJBVElPIDUwMDAKLSAgQU5URU5OQUdBVEVQTFVTRElGRiAyIDsKLSAgQUNDVVJSRU5UREVOU0lUWSBBVkVSQUdFIDUuNSA7Ci0gIERDQ1VSUkVOVERFTlNJVFkgQVZFUkFHRSA0LjkgOwotICAgU1BBQ0lOR1RBQkxFCi0gICAgICBQQVJBTExFTFJVTkxFTkdUSCAwIDAuNSAzIDUKLSAgICAgICAgICBXSURUSCAwIDAuMTUgMC4xNSAwLjE1IDAuMTUKLSAgICAgICAgICBXSURUSCAwLjI1IDAuMTUgMC4yIDAuMiAwLjIKLSAgICAgICAgICBXSURUSCAxLjUgMC4xNSAwLjUgMC41IDAuNQotICAgICAgICAgIFdJRFRIIDMgMC4xNSAwLjUgMSAxCi0gICAgICAgICAgV0lEVEggNSAwLjE1IDAuNSAxIDIgOwotICAgU1BBQ0lOR1RBQkxFCi0gICAgICBJTkZMVUVOQ0UKLSAgICAgICAgICBXSURUSCAxLjUgV0lUSElOIDAuNSBTUEFDSU5HIDAuNQotICAgICAgICAgIFdJRFRIIDMgV0lUSElOIDEgU1BBQ0lORyAxCi0gICAgICAgICAgV0lEVEggNSBXSVRISU4gMiBTUEFDSU5HIDIgOwotRU5EIE0xCi1QYXJzZWQgMzAwIG51bWJlciBvZiBsaW5lcyEhCi1MQVlFUiBWMQotICBUWVBFIENVVCA7Ci0gIFNQQUNJTkcgMC42IExBWUVSIENBIDsKLUVORCBWMQotTEFZRVIgTTIKLSAgVFlQRSBST1VUSU5HIDsKLSAgUElUQ0ggMS44IDsKLSAgV0lEVEggMC45IDsKLSAgU1BBQ0lORyAwLjkgOwotICBTUEFDSU5HIDAuMjggOwotICBTUEFDSU5HIDAuMjQgTEVOR1RIVEhSRVNIT0xEIDEgOwotICBTUEFDSU5HIDAuMzIgUkFOR0UgMS4wMSA5Ljk5IFVTRUxFTkdUSFRIUkVTSE9MRCA7Ci0gIFNQQUNJTkcgMC41IFJBTkdFIDEwIDEwMDAgOwotICBTUEFDSU5HIDAuNSBSQU5HRSAxMCAxMDAwIElORkxVRU5DRSAxIDsKLSAgU1BBQ0lORyAwLjUgUkFOR0UgMTAgMTAwMCBJTkZMVUVOQ0UgMSBSQU5HRSAwLjI4IDEgOwotICBTUEFDSU5HIDAuNSBSQU5HRSAzLjAxIDQgUkFOR0UgNC4wMSA1IDsKLSAgU1BBQ0lORyAwLjQgUkFOR0UgMy4wMSA0IFJBTkdFIDUuMDEgMTAwMCA7Ci0gIFNQQUNJTkcgMSBTQU1FTkVUIFBHT05MWSA7Ci0gIFNQQUNJTkcgMS4xIFNBTUVORVQgOwotICBTUEFDSU5HIDEuMiBFTkRPRkxJTkUgMS4zIFdJVEhJTiAwLjYgUEFSQUxMRUxFREdFIDIuMSBXSVRISU4gMS41IFRXT0VER0VTIDsKLSAgU1BBQ0lORyAxLjUgRU5ET0ZMSU5FIDIuMyBXSVRISU4gMS42IFBBUkFMTEVMRURHRSAxLjEgV0lUSElOIDAuNSA7Ci0gIERJUkVDVElPTiBESUFHNDUgOwotICBSRVNJU1RBTkNFIFJQRVJTUSAwLjA2MDggOwotICBDQVBBQ0lUQU5DRSBDUEVSU1FESVNUIDAuMDAwMTg0IDsKLSAgV0lSRUVYVEVOU0lPTiA4IDsKLSAgQU5URU5OQU1PREVMIE9YSURFMSA7Ci0gIEFOVEVOTkFDVU1BUkVBUkFUSU8gNTAwMCA7Ci0gIEFOVEVOTkFDVU1ESUZGQVJFQVJBVElPIDgwMDAKLSAgQU5URU5OQU1PREVMIE9YSURFMiA7Ci0gIEFOVEVOTkFDVU1BUkVBUkFUSU8gNTAwIDsKLSAgQU5URU5OQUNVTURJRkZBUkVBUkFUSU8gODAwCi0gIEFOVEVOTkFNT0RFTCBPWElERTMgOwotICBBTlRFTk5BQ1VNQVJFQVJBVElPIDMwMCA7Ci0gIEFOVEVOTkFDVU1ESUZGQVJFQVJBVElPIDYwMAotICBQUk9QRVJUWSBMRUY1N19TUEFDSU5HIFNQQUNJTkcgMS4yIEVORE9GTElORSAxLjMgV0lUSElOIDAuNiBQQVJBTExFTEVER0UgMi4xIFdJVEhJTiAxLjUgVFdPRURHRVMgOyBTVFJJTkcgTEVGNTdfU1BBQ0lORyBTUEFDSU5HIDEuNSBFTkRPRkxJTkUgMi4zIFdJVEhJTiAxLjYgUEFSQUxMRUxFREdFIDEuMSBXSVRISU4gMC41IDsgU1RSSU5HIExFRjU3X01BWEZMT0FUSU5HQVJFQSBNQVhGTE9BVElOR0FSRUEgMTAwMCA7IFNUUklORyA7Ci1FTkQgTTIKLUxBWUVSIFYyCi0gIFRZUEUgQ1VUIDsKLUVORCBWMgotUGFyc2VkIDM1MCBudW1iZXIgb2YgbGluZXMhIQotTEFZRVIgTTMKLSAgVFlQRSBST1VUSU5HIDsKLSAgUElUQ0ggMS44IDsKLSAgV0lEVEggMC45IDsKLSAgTUlOU1RFUCAxIE1BWEVER0VTIDIgOwotICBTUEFDSU5HIDAuOSA7Ci0gIERJUkVDVElPTiBIT1JJWk9OVEFMIDsKLSAgUkVTSVNUQU5DRSBSUEVSU1EgMC4wNjA4IDsKLSAgQ0FQQUNJVEFOQ0UgQ1BFUlNRRElTVCAwLjAwMDE4NCA7Ci0gIFdJUkVFWFRFTlNJT04gOCA7Ci0gIEFOVEVOTkFNT0RFTCBPWElERTEgOwotICBBTlRFTk5BQ1VNQVJFQVJBVElPIDMwMCA7Ci0gIEFOVEVOTkFDVU1ESUZGQVJFQVJBVElPIDYwMAotICBBTlRFTk5BTU9ERUwgT1hJREUyIDsKLSAgQU5URU5OQU1PREVMIE9YSURFMyA7Ci0gIEFOVEVOTkFDVU1BUkVBUkFUSU8gNTAwMCA7Ci0gIEFOVEVOTkFDVU1ESUZGQVJFQVJBVElPIDgwMDAKLSAgQU5URU5OQU1PREVMIE9YSURFNCA7Ci0gIEFOVEVOTkFDVU1BUkVBUkFUSU8gNTAwIDsKLSAgQU5URU5OQUNVTURJRkZBUkVBUkFUSU8gODAwCi0gIFBST1BFUlRZIExFRjU3X01JTlNURVAgTUlOU1RFUCAxLjAgTUFYRURHRVMgMiA7IFNUUklORyA7Ci1FTkQgTTMKLUxBWUVSIE00Ci0gIFRZUEUgUk9VVElORyA7Ci0gIFBJVENIIDUuNCA7Ci0gIFdJRFRIIDUuNCA7Ci0gIE1JTklNVU1DVVQgMiBXSURUSCAwLjUgOwotICBNSU5JTVVNQ1VUIDIgV0lEVEggMC43IEZST01CRUxPVyA7Ci0gIE1JTklNVU1DVVQgMyBXSURUSCAwLjggV0lUSElOIDAuMyA7Ci0gIE1JTklNVU1DVVQgMiBXSURUSCAxIEZST01CRUxPVyBMRU5HVEggMjAgV0lUSElOIDUgOwotICBNSU5JTVVNQ1VUIDQgV0lEVEggMSBGUk9NQUJPVkUgOwotICBNSU5JTVVNQ1VUIDIgV0lEVEggMS4xIExFTkdUSCAyMCBXSVRISU4gNSA7Ci0gIE1JTklNVU1DVVQgMiBXSURUSCAxLjEgRlJPTUFCT1ZFIExFTkdUSCAyMCBXSVRISU4gNSA7Ci0gIE1BWFdJRFRIIDEwIDsKLSAgTUlOV0lEVEggMC4xNSA7Ci0gIE1JTkVOQ0xPU0VEQVJFQSAwLjMgOwotICBNSU5FTkNMT1NFREFSRUEgMC40IE1JTkVOQ0xPU0VEQVJFQVdJRFRIIDAuMTUgOwotICBNSU5FTkNMT1NFREFSRUEgMC44IE1JTkVOQ0xPU0VEQVJFQVdJRFRIIDAuNSA7Ci0gIE1JTlNURVAgMC4yIDsKLSAgUFJPVFJVU0lPTldJRFRIIDAuMyBMRU5HVEggMC42IFdJRFRIIDEuMiA7Ci0gIERJUkVDVElPTiBIT1JJWk9OVEFMIDsKLUVORCBNNAotUGFyc2VkIDQwMCBudW1iZXIgb2YgbGluZXMhIQotTEFZRVIgTTUKLSAgVFlQRSBST1VUSU5HIDsKLSAgUElUQ0ggNS40IDsKLSAgV0lEVEggNCA7Ci0gIE1JTklNVU1DVVQgMiBXSURUSCAwLjcgOwotICBNSU5JTVVNQ1VUIDQgV0lEVEggMSBGUk9NQUJPVkUgOwotICBNSU5JTVVNQ1VUIDIgV0lEVEggMS4xIExFTkdUSCAyMCBXSVRISU4gNSA7Ci0gIE1JTklNVU1DVVQgNSBXSURUSCAwLjUgOwotICBNSU5TVEVQIDAuMDUgOwotICBNSU5TVEVQIDAuMDQgOwotICBNSU5TVEVQIDAuMDUgTEVOR1RIU1VNIDAuMDggOwotICBNSU5TVEVQIDAuMDUgTEVOR1RIU1VNIDAuMTYgOwotICBNSU5TVEVQIDAuMDUgSU5TSURFQ09STkVSIDsKLSAgTUlOU1RFUCAwLjA1IElOU0lERUNPUk5FUiBMRU5HVEhTVU0gMC4xNSA7Ci0gIE1JTlNURVAgMSBNQVhFREdFUyAyIDsKLSAgRElSRUNUSU9OIERJQUcxMzUgOwotICBBTlRFTk5BTU9ERUwgT1hJREUxIDsKLSAgQU5URU5OQU1PREVMIE9YSURFMiA7Ci0gIEFOVEVOTkFNT0RFTCBPWElERTMgOwotICBBTlRFTk5BQ1VNQVJFQVJBVElPIDMwMCA7Ci0gIEFOVEVOTkFDVU1ESUZGQVJFQVJBVElPIDYwMAotRU5EIE01Ci1MQVlFUiBpbXBsYW50MQotICBUWVBFIElNUExBTlQgOwotICBXSURUSCAwLjUgOwotICBTUEFDSU5HIDAuNSA7Ci0gIFBST1BFUlRZIGxycCA1LjQgUkVBTCA7Ci1FTkQgaW1wbGFudDEKLUxBWUVSIGltcGxhbnQyCi0gIFRZUEUgSU1QTEFOVCA7Ci0gIFdJRFRIIDAuNSA7Ci0gIFNQQUNJTkcgMC41IDsKLSAgUFJPUEVSVFkgbHNwIGJvdHRvbSBTVFJJTkcgOwotRU5EIGltcGxhbnQyCi1MQVlFUiBWMwotICBUWVBFIENVVCA7Ci1FTkQgVjMKLUxBWUVSIE1UCi0gIFRZUEUgUk9VVElORyA7Ci0gIFBJVENIIDEuOCA7Ci0gIFdJRFRIIDAuOSA7Ci0gIE1JTlNURVAgMC4wNSBTVEVQIDsKLSAgTUlOU1RFUCAwLjA1IFNURVAgTEVOR1RIU1VNIDAuMDggOwotICBNSU5TVEVQIDAuMDQgU1RFUCA7Ci0gIFNQQUNJTkcgMC45IDsKLSAgRElSRUNUSU9OIFZFUlRJQ0FMIDsKLSAgUkVTSVNUQU5DRSBSUEVSU1EgMC4wNjA4IDsKLSAgQ0FQQUNJVEFOQ0UgQ1BFUlNRRElTVCAwLjAwMDE4NCA7Ci0gIERJQUdNSU5FREdFTEVOR1RIIDAuMDc1IDsKLUVORCBNVAotUGFyc2VkIDQ1MCBudW1iZXIgb2YgbGluZXMhIQotTEFZRVIgT1ZFUkxBUAotICBUWVBFIE9WRVJMQVAgOwotICBQUk9QRVJUWSBsaXAgNSBJTlRFR0VSIGxzcCB0b3AgU1RSSU5HIGxycCA1LjUgUkVBTCBsc3AgYm90dG9tIFNUUklORyA7Ci1FTkQgT1ZFUkxBUAotTEFZRVIgdmlhMTIKLSAgVFlQRSBDVVQgOwotICBXSURUSCAwLjIgOwotICBTUEFDSU5HIDAuMTUgQ0VOVEVSVE9DRU5URVIgOwotRU5DTE9TVVJFIEJFTE9XIDAuMDMgMC4wMSA7Ci1FTkNMT1NVUkUgQUJPVkUgMC4wNSAwLjAxIDsKLUVOQ0xPU1VSRSBBQk9WRSAwLjA0IDAuMDkgOwotUFJFRkVSRU5DTE9TVVJFIEJFTE9XIDAuMDYgMC4wMSA7Ci1QUkVGRVJFTkNMT1NVUkUgQUJPVkUgMC4wOCAwLjIgOwotICBSRVNJU1RBTkNFIDEwIDsKLUVORCB2aWExMgotTEFZRVIgbWV0YWwxCi0gIFRZUEUgUk9VVElORyA7Ci0gIFBJVENIIDEuOCA7Ci0gIFdJRFRIIDAuOSA7Ci0gIERJUkVDVElPTiBWRVJUSUNBTCA7Ci0gIE1JTlNJWkUgMC4xNCAwLjMgMC41IDAuNTYgMC4wMSAwLjA1IDsKLUVORCBtZXRhbDEKLUxBWUVSIHZpYTIzCi0gIFRZUEUgQ1VUIDsKLSAgV0lEVEggMC4yIDsKLSAgU1BBQ0lORyAwLjE1IDsKLUVOQ0xPU1VSRSAwLjA1IDAuMDEgOwotRU5DTE9TVVJFIDAuMDIgMC4wMiBXSURUSCAxIDsKLUVOQ0xPU1VSRSAwLjA1IDAuMDUgV0lEVEggMiA7Ci0gIFJFU0lTVEFOQ0UgMTAgOwotRU5EIHZpYTIzCi1QYXJzZWQgNTAwIG51bWJlciBvZiBsaW5lcyEhCi1MQVlFUiB2aWEzNAotICBUWVBFIENVVCA7Ci0gIFdJRFRIIDAuMjUgOwotICBTUEFDSU5HIDAuMSBDRU5URVJUT0NFTlRFUiA7Ci1FTkNMT1NVUkUgMC4wNSAwLjAxIDsKLUVOQ0xPU1VSRSAwLjA1IDAgTEVOR1RIIDAuNyA7Ci1FTkNMT1NVUkUgQkVMT1cgMC4wNyAwLjA3IFdJRFRIIDEgOwotRU5DTE9TVVJFIEFCT1ZFIDAuMDkgMC4wOSBXSURUSCAxIDsKLUVOQ0xPU1VSRSAwLjAzIDAuMDMgV0lEVEggMSBFWENFUFRFWFRSQUNVVCAwLjIgOwotICBSRVNJU1RBTkNFIDggOwotRU5EIHZpYTM0Ci1MQVlFUiBjdXQyMwotICBUWVBFIENVVCA7Ci0gIEFSUkFZU1BBQ0lORyBMT05HQVJSQVkgQ1VUU1BBQ0lORyAwLjIKLQlBUlJBWUNVVFMgMyBTUEFDSU5HIDEKLQlBUlJBWUNVVFMgNCBTUEFDSU5HIDEuNQotCUFSUkFZQ1VUUyA1IFNQQUNJTkcgMiA7Ci0gIFNQQUNJTkcgMC4yIExBWUVSIGN1dDEyIFNUQUNLIFNBTUVORVQgOwotICBTUEFDSU5HIDAuMyBDRU5URVJUT0NFTlRFUiBTQU1FTkVUIEFSRUEgMC4wMiA7Ci0gIFNQQUNJTkcgMC40IEFSRUEgMC41IDsKLSAgU1BBQ0lORyAwLjEgOwotU1BBQ0lOR1RBQkxFIE9SVEhPR09OQUwKLSAgIFdJVEhJTiAwLjE1IFNQQUNJTkcgMC4xMQotICAgV0lUSElOIDAuMTMgU1BBQ0lORyAwLjEzCi0gICBXSVRISU4gMC4xMSBTUEFDSU5HIDAuMTU7Ci1FTkQgY3V0MjMKLUxBWUVSIGN1dDI0Ci0gIFRZUEUgUk9VVElORyA7Ci0gIFBJVENIIDEuOCA7Ci0gIFdJRFRIIDEgOwotICBBUlJBWVNQQUNJTkcgV0lEVEggMiBDVVRTUEFDSU5HIDAuMgotCUFSUkFZQ1VUUyAzIFNQQUNJTkcgMSA7Ci0gIFNQQUNJTkcgMC4xIDsKLSAgU1BBQ0lORyAwLjEyIE5PVENITEVOR1RIIDAuMTU7Ci0gIFNQQUNJTkcgMC4xNCBFTkRPRk5PVENIV0lEVEggMC4xNSBOT1RDSFNQQUNJTkcgMC4xNiwgTk9UQ0hMRU5HVEggMC4wODsKLSAgRElSRUNUSU9OIEhPUklaT05UQUwgOwotRU5EIGN1dDI0Ci1MQVlFUiBjdXQyNQotICBUWVBFIFJPVVRJTkcgOwotICBQSVRDSCAxLjggOwotICBXSURUSCAxIDsKLSAgRElSRUNUSU9OIEhPUklaT05UQUwgOwotICBXSVJFRVhURU5TSU9OIDcgOwotICAgU1BBQ0lOR1RBQkxFCi0gICAgICBUV09XSURUSFMKLSAgICAgICAgICBXSURUSCAwIDAuMTUgMC4yIDAuNSAxIAotICAgICAgICAgIFdJRFRIIDAuMjUgUFJMIDAgMC4yIDAuMjUgMC41IDEgCi0gICAgICAgICAgV0lEVEggMS41IFBSTCAxLjUgMC41IDAuNSAwLjYgMSAKLSAgICAgICAgICBXSURUSCAzIFBSTCAzIDEgMSAxIDEuMiAgOwotRU5EIGN1dDI1Ci1NQVhWSUFTVEFDSyA0IFJBTkdFIG0xIG03IDsKLVBhcnNlZCA1NTAgbnVtYmVyIG9mIGxpbmVzISEKLVZJQSBJTjFYIAotICBQUk9QRVJUWSBzdHJpbmdQcm9wZXJ0eSBERUZBVUxUIFNUUklORyByZWFsUHJvcGVydHkgMzIuMzMgUkVBTCBDT1VOVCAzNCBJTlRFR0VSIDsKLSAgUkVTSVNUQU5DRSAyIDsKLSAgTEFZRVIgUlgKLSAgICBSRUNUICggLTAuNzAwMDAwIC0wLjcwMDAwMCApICggMC43MDAwMDAgMC43MDAwMDAgKSA7Ci0gICAgUkVDVCAoIDAuMDAwMDAwIDAuMDAwMDAwICkgKCAyLjEwMDAwMCAyLjMwMDAwMCApIDsKLSAgICBSRUNUICggNS43MDAwMDAgMC4wMDAwMDAgKSAoIDk1LjcwMDAwMCAyLjMwMDAwMCApIDsKLSAgICBSRUNUICggMTAxLjkwMDAwMCAwLjAwMDAwMCApICggMTE5LjYwMDAwMCAyLjMwMDAwMCApIDsKLSAgTEFZRVIgQ1VUMTIKLSAgICBSRUNUICggLTAuMjUwMDAwIC0wLjI1MDAwMCApICggMC4yNTAwMDAgMC4yNTAwMDAgKSA7Ci0gIExBWUVSIFBDCi0gICAgUkVDVCAoIC0wLjYwMDAwMCAtMC42MDAwMDAgKSAoIDAuNjAwMDAwIDAuNjAwMDAwICkgOwotRU5EIElOMVgKLVZJQSBNMV9NMiBERUZBVUxUCi0gIFJFU0lTVEFOQ0UgMS41IDsKLSAgTEFZRVIgTTEKLSAgICBSRUNUIE1BU0sgMSAoIC0wLjYwMDAwMCAtMC42MDAwMDAgKSAoIDAuNjAwMDAwIDAuNjAwMDAwICkgOwotICBMQVlFUiBWMQotICAgIFJFQ1QgTUFTSyAyICggLTAuNDUwMDAwIC0wLjQ1MDAwMCApICggMC40NTAwMDAgMC40NTAwMDAgKSA7Ci0gIExBWUVSIE0yCi0gICAgUkVDVCBNQVNLIDMgKCAtMC40NTAwMDAgLTAuNDUwMDAwICkgKCAwLjQ1MDAwMCAwLjQ1MDAwMCApIDsKLSAgICBSRUNUIE1BU0sgMSAoIC0wLjkwMDAwMCAtMC40NTAwMDAgKSAoIDAuOTAwMDAwIDAuNDUwMDAwICkgOwotRU5EIE0xX00yCi1WSUEgTTJfTTMgREVGQVVMVAotICBSRVNJU1RBTkNFIDEuNSA7Ci0gIExBWUVSIE0yCi0gICAgUkVDVCAoIC0wLjQ1MDAwMCAtMC45MDAwMDAgKSAoIDAuNDUwMDAwIDAuOTAwMDAwICkgOwotICBMQVlFUiBWMgotICAgIFJFQ1QgKCAtMC40NTAwMDAgLTAuNDUwMDAwICkgKCAwLjQ1MDAwMCAwLjQ1MDAwMCApIDsKLSAgTEFZRVIgTTMKLSAgICBSRUNUICggLTAuNDUwMDAwIC0wLjQ1MDAwMCApICggMC40NTAwMDAgMC40NTAwMDAgKSA7Ci1FTkQgTTJfTTMKLVZJQSBNMl9NM19QV1IgR0VORVJBVEVECi0gIFJFU0lTVEFOQ0UgMC40IDsKLSAgTEFZRVIgTTIKLSAgICBSRUNUICggLTEuMzUwMDAwIC0xLjM1MDAwMCApICggMS4zNTAwMDAgMS4zNTAwMDAgKSA7Ci0gIExBWUVSIFYyCi0gICAgUkVDVCAoIC0xLjM1MDAwMCAtMS4zNTAwMDAgKSAoIC0wLjQ1MDAwMCAxLjM1MDAwMCApIDsKLSAgICBSRUNUICggMC40NTAwMDAgLTEuMzUwMDAwICkgKCAxLjM1MDAwMCAtMC40NTAwMDAgKSA7Ci0gICAgUkVDVCAoIDAuNDUwMDAwIDAuNDUwMDAwICkgKCAxLjM1MDAwMCAxLjM1MDAwMCApIDsKLSAgTEFZRVIgTTMKLSAgICBSRUNUICggLTEuMzUwMDAwIC0xLjM1MDAwMCApICggMS4zNTAwMDAgMS4zNTAwMDAgKSA7Ci1FTkQgTTJfTTNfUFdSCi1QYXJzZWQgNjAwIG51bWJlciBvZiBsaW5lcyEhCi1WSUEgTTNfTVQgREVGQVVMVAotICBSRVNJU1RBTkNFIDEuNSA7Ci0gIExBWUVSIE0zCi0gICAgUkVDVCBNQVNLIDEgKCAtMC45MDAwMDAgLTAuNDUwMDAwICkgKCAwLjkwMDAwMCAwLjQ1MDAwMCApIDsKLSAgTEFZRVIgVjMKLSAgICBSRUNUIE1BU0sgMiAoIC0wLjQ1MDAwMCAtMC40NTAwMDAgKSAoIDAuNDUwMDAwIDAuNDUwMDAwICkgOwotICBMQVlFUiBNVAotICAgIFJFQ1QgTUFTSyAzICggLTAuNDUwMDAwIC0wLjQ1MDAwMCApICggMC40NTAwMDAgMC40NTAwMDAgKSA7Ci1FTkQgTTNfTVQKLVZJQSBteUJsb2NrVmlhMCAKLSAgVklBUlVMRSB2aWFOYW1lMCA7Ci0gICAgQ1VUU0laRSAwLjEgMC4xIDsKLSAgICBMQVlFUlMgbWV0YWwxIHZpYTEyIG1ldGFsMiA7Ci0gICAgQ1VUU1BBQ0lORyAwLjEgMC4xIDsKLSAgICBFTkNMT1NVUkUgMC4wNSAwLjAxIDAuMDEgMC4wNSA7Ci0gICAgUk9XQ09MIDUgMTQgOwotICAgIFBBVFRFUk4gMl9GRjcwXzNfUjRGIDsKLUVORCBteUJsb2NrVmlhMAotVklBIFZJQUNFTlRFUjEyIAotICBSRVNJU1RBTkNFIDAuMjQgOwotICBMQVlFUiBNMQotICAgIFJFQ1QgKCAtNC42MDAwMDAgLTIuMjAwMDAwICkgKCA0LjYwMDAwMCAyLjIwMDAwMCApIDsKLSAgTEFZRVIgVjEKLSAgICBSRUNUICggLTMuMTAwMDAwIC0wLjgwMDAwMCApICggLTEuOTAwMDAwIDAuODAwMDAwICkgOwotICAgIFJFQ1QgKCAxLjkwMDAwMCAtMC44MDAwMDAgKSAoIDMuMTAwMDAwIDAuODAwMDAwICkgOwotICBMQVlFUiBNMgotICAgIFJFQ1QgKCAtNC40MDAwMDAgLTIuMDAwMDAwICkgKCA0LjQwMDAwMCAyLjAwMDAwMCApIDsKLUVORCBWSUFDRU5URVIxMgotVklBIE0yX1RVUk4gCi0gIExBWUVSIE0yCi0gICAgUkVDVCAoIC0wLjQ1MDAwMCAtMC40NTAwMDAgKSAoIDAuNDUwMDAwIDAuNDUwMDAwICkgOwotICAgIFJFQ1QgKCAtNC40MDAwMDAgLTIuMDAwMDAwICkgKCA0LjQwMDAwMCAyLjAwMDAwMCApIDsKLUVORCBNMl9UVVJOCi1QYXJzZWQgNjUwIG51bWJlciBvZiBsaW5lcyEhCi1WSUEgbXlWaWEyMyAKLSAgTEFZRVIgbWV0YWwyCi0gICAgUE9MWUdPTiBNQVNLIDEgLTIuMSAtMSAgLTAuMiAxICAyLjEgMSAgMC4yIC0xIDsKLSAgICBQT0xZR09OIE1BU0sgMiAtMS4xIC0yICAtMC4xIDIgIDEuMSAyICAwLjEgLTIgOwotICAgIFBPTFlHT04gTUFTSyAzIC0zLjEgLTIgIC0wLjMgMiAgMy4xIDIgIDAuMyAtMiA7Ci0gICAgUE9MWUdPTiBNQVNLIDEgLTQuMSAtMiAgLTAuNCAyICA0LjEgMiAgMC40IC0yIDsKLSAgTEFZRVIgY3V0MjMKLSAgICBSRUNUIE1BU0sgMiAoIC0wLjQwMDAwMCAtMC40MDAwMDAgKSAoIDAuNDAwMDAwIDAuNDAwMDAwICkgOwotICAgIFBPTFlHT04gTUFTSyAzIC0yLjEgLTEgIC0wLjIgMSAgMi4xIDEgIDAuMiAtMSA7Ci0gIExBWUVSIG1ldGFsMwotICAgIFBPTFlHT04gTUFTSyAxIC0wLjIgLTEgIC0yLjEgMSAgMC4yIDEgIDIuMSAtMSA7Ci0gIExBWUVSIGN1dDMzCi0gICAgUkVDVCBNQVNLIDEgKCAtMC40MDAwMDAgLTAuNDAwMDAwICkgKCAwLjQwMDAwMCAwLjQwMDAwMCApIDsKLSAgICBSRUNUIE1BU0sgMSAoIC0wLjUwMDAwMCAtMC41MDAwMDAgKSAoIDAuNTAwMDAwIDAuNTAwMDAwICkgOwotICAgIFJFQ1QgTUFTSyAyICggLTAuMzAwMDAwIC0wLjMwMDAwMCApICggMC4zMDAwMDAgMC4zMDAwMDAgKSA7Ci0gICAgUkVDVCBNQVNLIDEgKCAtMC4yMDAwMDAgLTAuMjAwMDAwICkgKCAwLjIwMDAwMCAwLjIwMDAwMCApIDsKLSAgICBSRUNUIE1BU0sgMiAoIC0wLjEwMDAwMCAtMC4xMDAwMDAgKSAoIDAuMTAwMDAwIDAuMTAwMDAwICkgOwotICAgIFBPTFlHT04gTUFTSyAyIC0yLjEgLTEgIC0wLjIgMSAgMi4xIDEgIDAuMiAtMSA7Ci0gICAgUE9MWUdPTiBNQVNLIDIgLTEuMSAtMiAgLTAuMSAyICAxLjEgMiAgMC4xIC0yIDsKLSAgICBQT0xZR09OIE1BU0sgMyAtMy4xIC0yICAtMC4zIDIgIDMuMSAyICAwLjMgLTIgOwotICAgIFBPTFlHT04gTUFTSyAxIC00LjEgLTIgIC0wLjQgMiAgNC4xIDIgIDAuNCAtMiA7Ci1FTkQgbXlWaWEyMwotVklBIG15QmxvY2tWaWEgCi0gIFZJQVJVTEUgREVGQVVMVCA7Ci0gICAgQ1VUU0laRSAwLjEgMC4xIDsKLSAgICBMQVlFUlMgbWV0YWwxIHZpYTEyIG1ldGFsMiA7Ci0gICAgQ1VUU1BBQ0lORyAwLjEgMC4xIDsKLSAgICBFTkNMT1NVUkUgMC4wNSAwLjAxIDAuMDEgMC4wNSA7Ci0gICAgUk9XQ09MIDEgMiA7Ci0gICAgT1JJR0lOIDAuMSAwLjIgOwotICAgIE9GRlNFVCA1LjEgNC4xIDMuMSAyLjEgOwotRU5EIG15QmxvY2tWaWEKLVZJQVJVTEUgVklBTElTVDEyCi0gIExBWUVSIE0xIDsKLSAgICBESVJFQ1RJT04gVkVSVElDQUwgOwotICAgIFdJRFRIIDkgVE8gOS42IDsKLSAgTEFZRVIgTTIgOwotICAgIERJUkVDVElPTiBIT1JJWk9OVEFMIDsKLSAgICBXSURUSCAzIFRPIDMgOwotICBWSUEgVklBQ0VOVEVSMTIgOwotICBQUk9QRVJUWSB2cnNwIG5ldyBTVFJJTkcgdnJpcCAxIElOVEVHRVIgdnJycCA0LjUgUkVBTCA7Ci1FTkQgVklBTElTVDEyCi1WSUFSVUxFIFZJQUxJU1QxCi0gIExBWUVSIE0xIDsKLSAgICBESVJFQ1RJT04gVkVSVElDQUwgOwotICAgIFdJRFRIIDkgVE8gOS42IDsKLSAgTEFZRVIgTTEgOwotICAgIERJUkVDVElPTiBIT1JJWk9OVEFMIDsKLSAgICBXSURUSCAzIFRPIDMgOwotU2hvdWxkIGhhdmUgdmlhIG5hbWVzIGluIFZJQVJVTEUuCi1FTkQgVklBTElTVDEKLVBhcnNlZCA3MDAgbnVtYmVyIG9mIGxpbmVzISEKLVZJQVJVTEUgVklBR0VOMTIgR0VORVJBVEUKLSAgTEFZRVIgTTEgOwotICAgIEVOQ0xPU1VSRSAxLjQgMS41IDsKLSAgICBXSURUSCAwLjEgVE8gMTkgOwotICBMQVlFUiBNMiA7Ci0gICAgRU5DTE9TVVJFIDEuNCAxLjUgOwotICAgIFdJRFRIIDAuMiBUTyAxLjkgOwotICBMQVlFUiBNMyA7Ci0gICAgUkVTSVNUQU5DRSAwLjUgOwotICAgIFNQQUNJTkcgNS42IEJZIDcgOwotICAgIFJFQ1QgKCAtMC4zMDAwMDAgLTAuMzAwMDAwICkgKCAwLjMwMDAwMCAwLjMwMDAwMCApIDsKLSAgUFJPUEVSVFkgdnJzcCBuZXcgU1RSSU5HIHZyaXAgMSBJTlRFR0VSIHZycnAgNS41IFJFQUwgOwotRU5EIFZJQUdFTjEyCi1WSUFSVUxFIHZpYTEwIEdFTkVSQVRFCi0gIExBWUVSIE0xIDsKLSAgICBFTkNMT1NVUkUgMS4xIDEuMiA7Ci0gICAgV0lEVEggMC4xIFRPIDEuOSA7Ci0gIExBWUVSIE0yIDsKLSAgICBFTkNMT1NVUkUgMS4xIDEuMiA7Ci0gICAgV0lEVEggMC4yIFRPIDIuOSA7Ci0gIExBWUVSIE0zIDsKLSAgICBTUEFDSU5HIDAuMyBCWSA0LjUgOwotICAgIFJFQ1QgKCAxLjAwMDAwMCAxLjAwMDAwMCApICggMS4wMDAwMDAgMS4wMDAwMDAgKSA7Ci0gIFBST1BFUlRZIHZyc3AgbmV3IFNUUklORyB2cmlwIDEgSU5URUdFUiB2cnJwIDUuNSBSRUFMIDsKLUVORCB2aWExMAotUGFyc2VkIDc1MCBudW1iZXIgb2YgbGluZXMhIQotVklBUlVMRSB2aWExMSBHRU5FUkFURQotICBMQVlFUiBNMSA7Ci0gICAgV0lEVEggMC4xIFRPIDEuOSA7Ci0gIExBWUVSIE0yIDsKLSAgICBXSURUSCAwLjIgVE8gMi45IDsKLSAgTEFZRVIgTTMgOwotICAgIFNQQUNJTkcgMC4zIEJZIDQuNSA7Ci0gICAgUkVDVCAoIDEuMDAwMDAwIDEuMDAwMDAwICkgKCAxLjAwMDAwMCAxLjAwMDAwMCApIDsKLSAgUFJPUEVSVFkgdnJzcCBuZXcgU1RSSU5HIHZyaXAgMSBJTlRFR0VSIHZycnAgNS41IFJFQUwgOwotRU5EIHZpYTExCi1WSUFSVUxFIHZpYTEyIEdFTkVSQVRFIERFRkFVTFQKLSAgTEFZRVIgbTEgOwotICAgIEVOQ0xPU1VSRSAwLjAzIDAuMDEgOwotICBMQVlFUiBtMiA7Ci0gICAgRU5DTE9TVVJFIDAuMDUgMC4wMSA7Ci0gIExBWUVSIGN1dDEyIDsKLSAgICBSRVNJU1RBTkNFIDIwIDsKLSAgICBTUEFDSU5HIDAuNCBCWSAwLjQgOwotICAgIFJFQ1QgKCAtMC4xMDAwMDAgLTAuMTAwMDAwICkgKCAwLjEwMDAwMCAwLjEwMDAwMCApIDsKLUVORCB2aWExMgotVklBUlVMRSB2aWExMyBHRU5FUkFURQotICBMQVlFUiBtMSA7Ci0gICAgRU5DTE9TVVJFIDAuMDUgMC4wMDUgOwotICAgIFdJRFRIIDEgVE8gMTAwIDsKLSAgTEFZRVIgbTIgOwotICAgIEVOQ0xPU1VSRSAwLjA1IDAuMDA1IDsKLSAgICBXSURUSCAxIFRPIDEwMCA7Ci0gIExBWUVSIGN1dDEyIDsKLSAgICBTUEFDSU5HIDAuMTYgQlkgMC4xNiA7Ci0gICAgUkVDVCAoIC0wLjA3MDAwMCAtMC4wNzAwMDAgKSAoIDAuMDcwMDAwIDAuMDcwMDAwICkgOwotRU5EIHZpYTEzCi1WSUFSVUxFIHZpYTE0Ci0gIExBWUVSIG0xIDsKLSAgICBESVJFQ1RJT04gSE9SSVpPTlRBTCA7Ci0gICAgV0lEVEggMSBUTyAxMDAgOwotICBMQVlFUiBtMiA7Ci0gICAgRElSRUNUSU9OIFZFUlRJQ0FMIDsKLSAgICBXSURUSCAxIFRPIDEwMCA7Ci0gIFZJQSBuYW1lMSA7Ci1FTkQgdmlhMTQKLVBhcnNlZCA4MDAgbnVtYmVyIG9mIGxpbmVzISEKLVZJQVJVTEUgVklBR0VOM1QgR0VORVJBVEUKLSAgTEFZRVIgbTMgOwotICAgIEVOQ0xPU1VSRSAwLjIgMC4yIDsKLSAgTEFZRVIgdjMgOwotICAgIEVOQ0xPU1VSRSAwLjIgMC4yIDsKLSAgICBTUEFDSU5HIDEuOCBCWSAxLjggOwotICAgIFJFQ1QgKCAtMC40NTAwMDAgLTAuNDUwMDAwICkgKCAwLjQ1MDAwMCAwLjQ1MDAwMCApIDsKLSAgTEFZRVIgbXQgOwotRU5EIFZJQUdFTjNUCi1QYXJzZWQgODUwIG51bWJlciBvZiBsaW5lcyEhCi1OT05ERUZBVUxUUlVMRSBSVUxFMQotICBMQVlFUiBSWAotICAgIFdJRFRIIDEwIDsKLSAgICBTUEFDSU5HIDIuMiA7Ci0gICAgV0lSRUVYVEVOU0lPTiA2IDsKLSAgRU5EIFJYCi0gIExBWUVSIFBDCi0gICAgV0lEVEggMTAgOwotICAgIFNQQUNJTkcgMi4yIDsKLSAgRU5EIFBDCi0gIExBWUVSIE0xCi0gICAgV0lEVEggMTAgOwotICAgIFNQQUNJTkcgMi4yIDsKLSAgRU5EIE0xCi0gIExBWUVSIGZ3Ci0gICAgV0lEVEggNC44IDsKLSAgICBTUEFDSU5HIDQuOCA7Ci0gIEVORCBmdwotVklBIG5kMVZJQVJYMCBERUZBVUxUCi0gIFBST1BFUlRZIHJlYWxQcm9wZXJ0eSAyLjMgUkVBTCA7Ci0gIFJFU0lTVEFOQ0UgMC4yIDsKLSAgTEFZRVIgUlgKLSAgICBSRUNUICggLTMuMDAwMDAwIC0zLjAwMDAwMCApICggMy4wMDAwMDAgMy4wMDAwMDAgKSA7Ci0gIExBWUVSIENVVDEyCi0gICAgUkVDVCAoIC0xLjAwMDAwMCAtMS4wMDAwMDAgKSAoIDEuMDAwMDAwIDEuMDAwMDAwICkgOwotICBMQVlFUiBQQwotICAgIFJFQ1QgKCAtMy4wMDAwMDAgLTMuMDAwMDAwICkgKCAzLjAwMDAwMCAzLjAwMDAwMCApIDsKLUVORCBuZDFWSUFSWDAKLVZJQSBuZDFWSUEwMSAKLSAgUkVTSVNUQU5DRSAwLjIgOwotICBMQVlFUiBQQwotICAgIFJFQ1QgKCAtMy4wMDAwMDAgLTMuMDAwMDAwICkgKCAzLjAwMDAwMCAzLjAwMDAwMCApIDsKLSAgICBSRUNUICggLTUuMDAwMDAwIC01LjAwMDAwMCApICggNS4wMDAwMDAgNS4wMDAwMDAgKSA7Ci0gIExBWUVSIENBCi0gICAgUkVDVCAoIC0xLjAwMDAwMCAtMS4wMDAwMDAgKSAoIDEuMDAwMDAwIDEuMDAwMDAwICkgOwotICBMQVlFUiBNMQotICAgIFJFQ1QgKCAtMy4wMDAwMDAgLTMuMDAwMDAwICkgKCAzLjAwMDAwMCAzLjAwMDAwMCApIDsKLUVORCBuZDFWSUEwMQotVklBIG5kMVZJQTEyIAotICBSRVNJU1RBTkNFIDAuMiA7Ci0gIExBWUVSIE0xCi0gICAgUkVDVCAoIC0zLjAwMDAwMCAtMy4wMDAwMDAgKSAoIDMuMDAwMDAwIDMuMDAwMDAwICkgOwotICBMQVlFUiBWMQotICAgIFJFQ1QgKCAtMS4wMDAwMDAgLTEuMDAwMDAwICkgKCAxLjAwMDAwMCAxLjAwMDAwMCApIDsKLSAgTEFZRVIgTTIKLSAgICBSRUNUICggLTMuMDAwMDAwIC0zLjAwMDAwMCApICggMy4wMDAwMDAgMy4wMDAwMDAgKSA7Ci1FTkQgbmQxVklBMTIKLSAgIFBST1BFUlRZIG5kcnNwIHNpbmdsZSBTVFJJTkcgbmRyaXAgMSBJTlRFR0VSIG5kcnJwIDYuNyBSRUFMIDsKLUVORCBSVUxFMSA7Ci1OT05ERUZBVUxUUlVMRSB3aWRlMV81eAotICBMQVlFUiBtZXRhbDEKLSAgICBXSURUSCAxLjUgOwotICBFTkQgbWV0YWwxCi0gIExBWUVSIG1ldGFsMgotICAgIFdJRFRIIDEuNSA7Ci0gIEVORCBtZXRhbDIKLSAgTEFZRVIgbWV0YWwzCi0gICAgV0lEVEggMS41IDsKLSAgRU5EIG1ldGFsMwotRU5EIHdpZGUxXzV4IDsKLVBhcnNlZCA5MDAgbnVtYmVyIG9mIGxpbmVzISEKLU5PTkRFRkFVTFRSVUxFIHdpZGUzeAotICBMQVlFUiBtZXRhbDEKLSAgICBXSURUSCAzIDsKLSAgRU5EIG1ldGFsMQotICBMQVlFUiBtZXRhbDIKLSAgICBXSURUSCAzIDsKLSAgRU5EIG1ldGFsMgotICBMQVlFUiBtZXRhbDMKLSAgICBXSURUSCAzIDsKLSAgRU5EIG1ldGFsMwotICAgTUlOQ1VUUyBjdXQxMiAyIDsKLSAgIE1JTkNVVFMgY3V0MjMgMiA7Ci1FTkQgd2lkZTN4IDsKLU5PTkRFRkFVTFRSVUxFIGFuYWxvZ19ydWxlCi0gIEhBUkRTUEFDSU5HIDsKLSAgTEFZRVIgbWV0YWwxCi0gICAgV0lEVEggMS41IDsKLSAgICBTUEFDSU5HIDMgOwotICAgIERJQUdXSURUSCA1LjUgOwotICBFTkQgbWV0YWwxCi0gIExBWUVSIG1ldGFsMgotICAgIFdJRFRIIDEuNSA7Ci0gICAgU1BBQ0lORyAzIDsKLSAgRU5EIG1ldGFsMgotICBMQVlFUiBtZXRhbDMKLSAgICBXSURUSCAxLjUgOwotICAgIFNQQUNJTkcgMyA7Ci0gIEVORCBtZXRhbDMKLSAgICBVU0VWSUEgdmlhMTJfZml4ZWRfYW5hbG9nX3ZpYSA7Ci0gICAgVVNFVklBIHZpYTIzX2ZpeGVkX2FuYWxvZ192aWEgOwotICAgIFVTRVZJQVJVTEUgdmlhcnVsZTE0X2ZpeGVkX2FuYWxvZyA7Ci1FTkQgYW5hbG9nX3J1bGUgOwotTk9OREVGQVVMVFJVTEUgY2xvY2sxCi0gIExBWUVSIG1ldGFsMQotICAgIFdJRFRIIDEuNSA7Ci0gIEVORCBtZXRhbDEKLSAgTEFZRVIgbWV0YWwyCi0gICAgV0lEVEggMS41IDsKLSAgRU5EIG1ldGFsMgotICBMQVlFUiBtZXRhbDMKLSAgICBXSURUSCAxLjUgOwotICBFTkQgbWV0YWwzCi1FTkQgY2xvY2sxIDsKLVBhcnNlZCA5NTAgbnVtYmVyIG9mIGxpbmVzISEKLU5PTkRFRkFVTFRSVUxFIGNsb2NrMgotICBMQVlFUiBtZXRhbDEKLSAgICBXSURUSCAxLjUgOwotICBFTkQgbWV0YWwxCi0gIExBWUVSIG1ldGFsMgotICAgIFdJRFRIIDEuNSA7Ci0gIEVORCBtZXRhbDIKLSAgTEFZRVIgbWV0YWwzCi0gICAgV0lEVEggMS41IDsKLSAgRU5EIG1ldGFsMwotRU5EIGNsb2NrMiA7Ci1OT05ERUZBVUxUUlVMRSBjbG9jawotICBMQVlFUiBtZXRhbDEKLSAgICBXSURUSCAxLjUgOwotICBFTkQgbWV0YWwxCi0gIExBWUVSIG1ldGFsMgotICAgIFdJRFRIIDEuNSA7Ci0gIEVORCBtZXRhbDIKLSAgTEFZRVIgbWV0YWwzCi0gICAgV0lEVEggMS41IDsKLSAgRU5EIG1ldGFsMwotRU5EIGNsb2NrIDsKLVBhcnNlZCAxMDAwIG51bWJlciBvZiBsaW5lcyEhCi1TSVRFIENPVkVSCi0gIENMQVNTIFBBRCA7Ci0gIFNZTU1FVFJZIFI5MCA7Ci0gIFNJWkUgMTAgQlkgMTAgOwotRU5EIENPVkVSCi1TSVRFIElPCi0gIENMQVNTIFBBRCA7Ci0gIFNJWkUgODAgQlkgNTYwIDsKLUVORCBJTwotU0lURSBDT1JFCi0gIENMQVNTIENPUkUgOwotICBTSVpFIDAuNyBCWSA4LjQgOwotRU5EIENPUkUKLVNJVEUgQ09SRTEKLSAgQ0xBU1MgQ09SRSA7Ci0gIFNZTU1FVFJZIFggOwotICBTSVpFIDY3LjIgQlkgNiA7Ci1FTkQgQ09SRTEKLVNJVEUgTVJDT1JFCi0gIENMQVNTIENPUkUgOwotICBTWU1NRVRSWSBZIDsKLSAgU0laRSAzLjYgQlkgMjguOCA7Ci1FTkQgTVJDT1JFCi1TSVRFIElPV0lSRUQKLSAgQ0xBU1MgUEFEIDsKLSAgU0laRSA1Ny42IEJZIDQzMiA7Ci1FTkQgSU9XSVJFRAotUGFyc2VkIDEwNTAgbnVtYmVyIG9mIGxpbmVzISEKLVNJVEUgSU1BR0UKLSAgQ0xBU1MgQ09SRSA7Ci0gIFNJWkUgMSBCWSAxIDsKLSAgUk9XUEFUVEVSTiAgIEZzaXRlMSBOICAgTHNpdGUxIE4gICBMc2l0ZTEgRlMgOwotRU5EIElNQUdFCi1TSVRFIEZzaXRlCi0gIENMQVNTIENPUkUgOwotICBTSVpFIDQgQlkgNyA7Ci1FTkQgRnNpdGUKLVNJVEUgTHNpdGUKLSAgQ0xBU1MgQ09SRSA7Ci0gIFNJWkUgNiBCWSA3IDsKLUVORCBMc2l0ZQotU0lURSBteVNpdGUKLSAgQ0xBU1MgQ09SRSA7Ci0gIFNJWkUgMTYgQlkgNyA7Ci0gIFJPV1BBVFRFUk4gICBGc2l0ZSBOICAgTHNpdGUgTiAgIExzaXRlIEZTIDsKLUVORCBteVNpdGUKLUFSUkFZIE03RTRYWFgKLSAgIFNJVEUgQ09SRSAtNTAyMS40NSAtNDk5OCBOIERPIDE0MzQ2IEJZIDU5NSBTVEVQIDAuNyAxNi44IDsKLSAgIFNJVEUgQ09SRSAtNTAyMS40NSAtNDk4OS42IEZTIERPIDE0MzQ2IEJZIDU5NSBTVEVQIDAuNyAxNi44IDsKLSAgIFNJVEUgSU8gNjE0OC44IDU4MDAgRSBETyAxIEJZIDEgU1RFUCAwIDAgOwotICAgU0lURSBJTyA2MTQ4LjggMzI0MCBFIERPIDEgQlkgMSBTVEVQIDAgMCA7Ci0gICBTSVRFIENPVkVSIC03MzE1IC03MzE1IE4gRE8gMSBCWSAxIFNURVAgMCAwIDsKLSAgIFNJVEUgQ09WRVIgNzMwNSA3MzA1IE4gRE8gMSBCWSAxIFNURVAgMCAwIDsKLSAgIENBTlBMQUNFIENPVkVSIC03MzE1IC03MzE1IE4gRE8gMSBCWSAxIFNURVAgMCAwIDsKLSAgIENBTlBMQUNFIENPVkVSIC03MjUwIC03MjUwIE4gRE8gNSBCWSAxIFNURVAgNDAgMCA7Ci0gICBDQU5QTEFDRSBDT1ZFUiAtNzI1MCAtNzI1MCBOIERPIDUgQlkgMSBTVEVQIDQwIDAgOwotICAgQ0FOTk9UT0NDVVBZIENPUkUgLTUwMjEuNDUgLTQ5ODkuNiBGUyBETyAxMDAgQlkgNTk1IFNURVAgMC43IDE2LjggOwotICAgQ0FOTk9UT0NDVVBZIENPUkUgLTUwMjEuNDUgLTQ5OTggTiBETyAxMDAgQlkgNTk1IFNURVAgMC43IDE2LjggOwotICAgQ0FOTk9UT0NDVVBZIENPUkUgLTUwMjEuNDUgLTQ5OTggTiBETyAxMDAgQlkgNTk1IFNURVAgMC43IDE2LjggOwotICBUUkFDS1MgWCwgLTYxNDguOCBETyAxNzU2OSBTVEVQIDAuNwotICBMQVlFUiBSWCA7Ci0gIFRSQUNLUyBZLCAtNjE0OC44IERPIDIwNDk3IFNURVAgMC42Ci0gIExBWUVSIFJYIDsKLSAgVFJBQ0tTIFksIC02MTQ4LjggRE8gMjA0OTcgU1RFUCAwLjYKLSAgTEFZRVIgUlggOwotICBHQ0VMTEdSSUQgWCwgLTYxNTcuMiBETyAxNDY3IFNURVAgOC40Ci0gIEdDRUxMR1JJRCBZLCAtNjE1Ny4yIERPIDE0NjcgU1RFUCA4LjQKLSAgR0NFTExHUklEIFksIC02MTU3LjIgRE8gMTQ2NyBTVEVQIDguNAotICAgRkxPT1JQTEFOIDEwMCUKLSAgICAgIENBTlBMQUNFIENPVkVSIC03MzE1IC03MzE1IE4gRE8gMSBCWSAxIFNURVAgMCAwIDsKLSAgICAgIENBTlBMQUNFIENPVkVSIC03MjUwIC03MjUwIE4gRE8gNSBCWSAxIFNURVAgNDAgMCA7Ci0gICAgICBDQU5QTEFDRSBDT1JFIC01MDIxLjQ1IC00OTk4IE4gRE8gMTQzNDYgQlkgNTk1IFNURVAgMC43IDE2LjggOwotICAgICAgQ0FOUExBQ0UgQ09SRSAtNTAyMS40NSAtNDk4OS42IEZTIERPIDE0MzQ2IEJZIDU5NSBTVEVQIDAuNyAxNi44IDsKLSAgICAgIENBTk5PVE9DQ1VQWSBDT1JFIC01MDIxLjQ1IC00OTg5LjYgRlMgRE8gMTAwIEJZIDU5NSBTVEVQIDAuNyAxNi44IDsKLSAgICAgIENBTk5PVE9DQ1VQWSBDT1JFIC01MDIxLjQ1IC00OTk4IE4gRE8gMTAwIEJZIDU5NSBTVEVQIDAuNyAxNi44IDsKLSAgIEVORCAxMDAlCi0KLUVORCBNN0U0WFhYCi0KLU1BQ1JPIENISzNBCi1NQUNSTyBDTEFTUyBSSU5HCi1QYXJzZWQgMTEwMCBudW1iZXIgb2YgbGluZXMhIQotUGFyc2VkIDExNTAgbnVtYmVyIG9mIGxpbmVzISEKLSAgUElOIEdORAotICAgIERJUkVDVElPTiBJTk9VVCA7Ci0gICAgVVNFIEdST1VORCA7Ci0gICAgU0hBUEUgQUJVVE1FTlQgOwotICAgIE1BWExPQUQgMC4xIDsKLSAgICBSSVNFU0xFV0xJTUlUIDAuMDEgOwotICAgIEZBTExTTEVXTElNSVQgMC4wMiA7Ci0gICAgVEFQRVJSVUxFIFJVTEUxIDsKLSAgICBQUk9QRVJUWSBUWVBFIHNwZWNpYWwgU1RSSU5HIGludFByb3AgMjMgSU5URUdFUiByZWFsUHJvcCAyNC4yNSBSRUFMIDsKLSAgICBQT1JUCi1DTEFTUyBDT1JFICAgICAgIExBWUVSIE0xIDsKLSAgICAgIFNQQUNJTkcgMC4wNSA7Ci0gICAgICBXSURUSCAxIDsKLSAgICAgIFJFQ1QgKCAtMC45MDAwMDAgMy4wMDAwMDAgKSAoIDkuOTAwMDAwIDYuMDAwMDAwICkgOwotICAgICAgVklBICggMTAwIDMwMCApIElOMVggOwotICAgIEVORAotICAgIFBPUlQKLUNMQVNTIEJVTVAgICAgICAgTEFZRVIgTTIgOwotICAgICAgU1BBQ0lORyAwLjA2IDsKLSAgICBFTkQKLSAgRU5EIEdORAotUGFyc2VkIDEyMDAgbnVtYmVyIG9mIGxpbmVzISEKLSAgUElOIFZERAotICAgIERJUkVDVElPTiBJTk9VVCA7Ci0gICAgVVNFIFBPV0VSIDsKLSAgICBTSEFQRSBBQlVUTUVOVCA7Ci0gICAgQU5URU5OQVBBUlRJQUxNRVRBTEFSRUEgMTA2MTEuMiBMQVlFUiBNMiA7Ci0gICAgQU5URU5OQVBBUlRJQUxNRVRBTEFSRUEgMjQ1MC4yNiBMQVlFUiBNMyA7Ci0gICAgQU5URU5OQVBBUlRJQUxDVVRBUkVBIDQuODIxNiBMQVlFUiBWMSA7Ci0gICAgQU5URU5OQVBBUlRJQUxDVVRBUkVBIDE4NS43MyBMQVlFUiBWMiA7Ci0gICAgQU5URU5OQURJRkZBUkVBIDUwMDguNDYgTEFZRVIgTTIgOwotICAgIEFOVEVOTkFESUZGQVJFQSA1MTYzLjg4IExBWUVSIE0zIDsKLSAgICBBTlRFTk5BTU9ERUwgT1hJREUxIDsKLSAgICBBTlRFTk5BR0FURUFSRUEgMjk3LjIxNCBMQVlFUiBNMyA7Ci0gICAgQU5URU5OQU1PREVMIE9YSURFMiA7Ci0gICAgQU5URU5OQU1PREVMIE9YSURFMyA7Ci0gICAgQU5URU5OQUdBVEVBUkVBIDE2Mi40OCBMQVlFUiBNMiA7Ci0gICAgUE9SVAotICAgIEVORAotICAgIFBPUlQKLUNMQVNTIE5PTkUgICAgICAgTEFZRVIgTTEgOwotICAgICAgUkVDVCBJVEVSQVRFICggLTAuOTAwMDAwIDIxLjAwMDAwMCApICggOS45MDAwMDAgMjQuMDAwMDAwICkKLSAgICAgIERPIDEgQlkgMiBTVEVQIDEgMSA7Ci0gICAgICBWSUEgSVRFUkFURSAoIDEwMCAzMDAgKSBuZDFWSUExMgotICAgICAgRE8gMSBCWSAyIFNURVAgMSAyIDsKLSAgICBFTkQKLSAgRU5EIFZERAotICBQSU4gUEEzCi0gICAgRElSRUNUSU9OIElOUFVUIDsKLSAgICBBTlRFTk5BUEFSVElBTE1FVEFMQVJFQSA0IExBWUVSIE0xIDsKLSAgICBBTlRFTk5BUEFSVElBTE1FVEFMQVJFQSA1IExBWUVSIE0yIDsKLSAgICBBTlRFTk5BUEFSVElBTE1FVEFMU0lERUFSRUEgNSBMQVlFUiBNMiA7Ci0gICAgQU5URU5OQVBBUlRJQUxNRVRBTFNJREVBUkVBIDYgTEFZRVIgTTIgOwotICAgIEFOVEVOTkFQQVJUSUFMTUVUQUxTSURFQVJFQSA3IExBWUVSIE0yIDsKLSAgICBBTlRFTk5BUEFSVElBTENVVEFSRUEgMSA7Ci0gICAgQU5URU5OQVBBUlRJQUxDVVRBUkVBIDIgTEFZRVIgTTIgOwotICAgIEFOVEVOTkFQQVJUSUFMQ1VUQVJFQSAzIDsKLSAgICBBTlRFTk5BUEFSVElBTENVVEFSRUEgNCBMQVlFUiBNNCA7Ci0gICAgQU5URU5OQURJRkZBUkVBIDEgTEFZRVIgTTEgOwotICAgIEFOVEVOTkFNT0RFTCBPWElERTEgOwotICAgIEFOVEVOTkFHQVRFQVJFQSAxIExBWUVSIE0xIDsKLSAgICBBTlRFTk5BR0FURUFSRUEgMiA7Ci0gICAgQU5URU5OQUdBVEVBUkVBIDMgTEFZRVIgTTMgOwotICAgIEFOVEVOTkFNQVhBUkVBQ0FSIDEgTEFZRVIgTDEgOwotICAgIEFOVEVOTkFNQVhBUkVBQ0FSIDIgTEFZRVIgTDIgOwotICAgIEFOVEVOTkFNQVhBUkVBQ0FSIDMgTEFZRVIgTDMgOwotICAgIEFOVEVOTkFNQVhBUkVBQ0FSIDQgTEFZRVIgTDQgOwotICAgIEFOVEVOTkFNQVhTSURFQVJFQUNBUiAxIExBWUVSIEwxIDsKLSAgICBBTlRFTk5BTUFYU0lERUFSRUFDQVIgMiBMQVlFUiBMMiA7Ci0gICAgQU5URU5OQU1BWENVVENBUiAxIExBWUVSIEwxIDsKLSAgICBBTlRFTk5BTUFYQ1VUQ0FSIDIgTEFZRVIgTDIgOwotICAgIEFOVEVOTkFNQVhDVVRDQVIgMyBMQVlFUiBMMyA7Ci0gICAgUE9SVAotICAgICAgTEFZRVIgTTEgOwotICAgICAgU1BBQ0lORyAwLjAyIDsKLSAgICAgIFJFQ1QgKCAxLjM1MDAwMCAtMC40NTAwMDAgKSAoIDIuMjUwMDAwIDAuNDUwMDAwICkgOwotICAgICAgUkVDVCAoIC0wLjQ1MDAwMCAtMC40NTAwMDAgKSAoIDAuNDUwMDAwIDAuNDUwMDAwICkgOwotICAgIEVORAotICAgIFBPUlQKLSAgICAgIExBWUVSIFBDIDsKLSAgICAgIERFU0lHTlJVTEVXSURUSCAwLjA1IDsKLSAgICAgIFJFQ1QgKCAtMC40NTAwMDAgMTIuMTUwMDAwICkgKCAwLjQ1MDAwMCAxMy4wNTAwMDAgKSA7Ci0gICAgRU5ECi0gICAgUE9SVAotICAgICAgTEFZRVIgUEMgOwotICAgICAgUkVDVCAoIC0wLjQ1MDAwMCAyNC43NTAwMDAgKSAoIDAuNDUwMDAwIDI1LjY1MDAwMCApIDsKLSAgICBFTkQKLSAgICBQT1JUCi0gICAgRU5ECi0gIEVORCBQQTMKLVBhcnNlZCAxMjUwIG51bWJlciBvZiBsaW5lcyEhCi0gIFBJTiBQQTAKLSAgICBESVJFQ1RJT04gSU5QVVQgOwotICAgIE1VU1RKT0lOIFBBMyA7Ci0gICAgUE9SVAotQ0xBU1MgTk9ORSAgICAgICBMQVlFUiBNMSA7Ci0gICAgICBSRUNUICggOC41NTAwMDAgOC41NTAwMDAgKSAoIDkuNDUwMDAwIDkuNDUwMDAwICkgOwotICAgICAgUkVDVCAoIDYuNzUwMDAwIDYuNzUwMDAwICkgKCA3LjY1MDAwMCA3LjY1MDAwMCApIDsKLSAgICAgIFJFQ1QgKCA2Ljc1MDAwMCA4LjU1MDAwMCApICggNy42NTAwMDAgOS40NTAwMDAgKSA7Ci0gICAgICBSRUNUICggNi43NTAwMDAgMTAuMzUwMDAwICkgKCA3LjY1MDAwMCAxMS4yNTAwMDAgKSA7Ci0gICAgRU5ECi0gICAgUE9SVAotQ0xBU1MgQ09SRSAgICAgICBMQVlFUiBQQyA7Ci0gICAgICBSRUNUICggOC41NTAwMDAgMjQuNzUwMDAwICkgKCA5LjQ1MDAwMCAyNS42NTAwMDAgKSA7Ci0gICAgRU5ECi0gICAgUE9SVAotICAgICAgTEFZRVIgUEMgOwotICAgICAgUkVDVCAoIDYuNzUwMDAwIDEuMzUwMDAwICkgKCA3LjY1MDAwMCAyLjI1MDAwMCApIDsKLSAgICBFTkQKLSAgICBQT1JUCi0gICAgICBMQVlFUiBQQyA7Ci0gICAgICBSRUNUICggNi43NTAwMDAgMjQuNzUwMDAwICkgKCA3LjY1MDAwMCAyNS42NTAwMDAgKSA7Ci0gICAgRU5ECi0gICAgUE9SVAotICAgICAgTEFZRVIgUEMgOwotICAgICAgUkVDVCAoIDQuOTUwMDAwIDEuMzUwMDAwICkgKCA1Ljg1MDAwMCAyLjI1MDAwMCApIDsKLSAgICBFTkQKLSAgRU5EIFBBMAotICBQSU4gUEExCi0gICAgRElSRUNUSU9OIElOUFVUIDsKLSAgICBQT1JUCi0gICAgICBMQVlFUiBNMSA7Ci0gICAgICBSRUNUICggOC41NTAwMDAgLTAuNDUwMDAwICkgKCA5LjQ1MDAwMCAwLjQ1MDAwMCApIDsKLSAgICAgIFJFQ1QgKCA2Ljc1MDAwMCAtMC40NTAwMDAgKSAoIDcuNjUwMDAwIDAuNDUwMDAwICkgOwotICAgIEVORAotICAgIFBPUlQKLSAgICAgIExBWUVSIE0xIDsKLSAgICAgIFJFQ1QgKCA4LjU1MDAwMCAxMi4xNTAwMDAgKSAoIDkuNDUwMDAwIDEzLjA1MDAwMCApIDsKLSAgICAgIFJFQ1QgKCA2Ljc1MDAwMCAxMi4xNTAwMDAgKSAoIDcuNjUwMDAwIDEzLjA1MDAwMCApIDsKLSAgICAgIFJFQ1QgKCA0Ljk1MDAwMCAxMi4xNTAwMDAgKSAoIDUuODUwMDAwIDEzLjA1MDAwMCApIDsKLSAgICBFTkQKLSAgICBQT1JUCi0gICAgICBMQVlFUiBQQyA7Ci0gICAgICBSRUNUICggNC45NTAwMDAgMjQuNzUwMDAwICkgKCA1Ljg1MDAwMCAyNS42NTAwMDAgKSA7Ci0gICAgRU5ECi0gICAgUE9SVAotICAgICAgTEFZRVIgUEMgOwotICAgICAgUkVDVCAoIDMuMTUwMDAwIDI0Ljc1MDAwMCApICggNC4wNTAwMDAgMjUuNjUwMDAwICkgOwotICAgIEVORAotICBFTkQgUEExCi1QYXJzZWQgMTMwMCBudW1iZXIgb2YgbGluZXMhIQotICBQSU4gUEEyMAotICAgIERJUkVDVElPTiBJTlBVVCA7Ci0gICAgUE9SVAotICAgICAgTEFZRVIgTTEgOwotICAgICAgUE9MWUdPTiAgICAgICAoIDE1IDM1ICkKLSAgICAgICggMTUgNjAgKQotICAgICAgKCA2NSA2MCApCi0gICAgICAoIDY1IDM1ICkKLSAgICAgICggMTUgMzUgKSA7Ci0gICAgRU5ECi0gICAgUE9SVAotICAgICAgTEFZRVIgTTEgOwotICAgICAgUEFUSCAgICAgICAoIDguNTUgMTIuMTUgKQotICAgICAgKCA5LjQ1IDEzLjA1ICkgOwotICAgIEVORAotICBFTkQgUEEyMAotICBQSU4gUEEyMQotICAgIERJUkVDVElPTiBPVVRQVVQgVFJJU1RBVEUgOwotICAgIFBPUlQKLSAgICAgIExBWUVSIE0xIDsKLSAgICAgIFBPTFlHT04gSVRFUkFURSAgICAgICggMjAgMzUgKQotICAgICAgKCAyMCA2MCApCi0gICAgICAoIDcwIDYwICkKLSAgICAgICggNzAgMzUgKQotICAgICAgRE8gMSBCWSAyIFNURVAgNSA1IDsKLSAgICBFTkQKLSAgICBQT1JUCi0gICAgICBMQVlFUiBNMSA7Ci0gICAgICBQQVRIIElURVJBVEVEICAgICAgICggNS41NSAxMi4xNSApCi0gICAgICAoIDEwLjQ1IDEzLjA1ICkKLSAgICAgIERPIDEgQlkgMiBTVEVQIDIgMiA7Ci0gICAgRU5ECi0gIEVORCBQQTIxCi0gIE9CUwotICAgICAgTEFZRVIgTTEgOwotICAgICAgU1BBQ0lORyA1LjYgOwotICAgICAgUkVDVCAoIDYuNjAwMDAwIC0wLjYwMDAwMCApICggOS42MDAwMDAgMC42MDAwMDAgKSA7Ci0gICAgICBSRUNUICggNC44MDAwMDAgMTIuMDAwMDAwICkgKCA5LjYwMDAwMCAxMy4yMDAwMDAgKSA7Ci0gICAgICBSRUNUICggMy4wMDAwMDAgMTMuODAwMDAwICkgKCA3LjgwMDAwMCAxNi44MDAwMDAgKSA7Ci0gICAgICBSRUNUICggMy4wMDAwMDAgLTAuNjAwMDAwICkgKCA2LjAwMDAwMCAwLjYwMDAwMCApIDsKLSAgICAgIFJFQ1QgKCAzLjAwMDAwMCA4LjQwMDAwMCApICggNi4wMDAwMDAgMTEuNDAwMDAwICkgOwotICAgICAgUkVDVCAoIDMuMDAwMDAwIDguNDAwMDAwICkgKCA0LjIwMDAwMCAxNi44MDAwMDAgKSA7Ci0gICAgICBSRUNUICggLTAuNjAwMDAwIDEzLjgwMDAwMCApICggNC4yMDAwMDAgMTYuODAwMDAwICkgOwotICAgICAgUkVDVCAoIC0wLjYwMDAwMCAtMC42MDAwMDAgKSAoIDIuNDAwMDAwIDAuNjAwMDAwICkgOwotICAgICAgUkVDVCAoIDYuNjAwMDAwIDYuNjAwMDAwICkgKCA5LjYwMDAwMCAxMS40MDAwMDAgKSA7Ci0gICAgICBSRUNUICggNi42MDAwMDAgNi42MDAwMDAgKSAoIDcuODAwMDAwIDExLjQwMDAwMCApIDsKLSAgRU5ECi1QYXJzZWQgMTM1MCBudW1iZXIgb2YgbGluZXMhIQotICBDTEFTUyBSSU5HIDsKLSAgRklYRURNQVNLIDsKLSAgRUVRIENISzEgOwotICBTWU1NRVRSWSBYIFkgUjkwIDsKLSAgU0lURSBDT1JFIDsKLSAgU0laRSAxMC44IEJZIDI4LjggOwotICBGT1JFSUdOIENIS1MgKCAwIDAgKSBGTiA7Ci0gIE9SSUdJTiAoIDAuOSAwLjkgKSA7Ci0gIFBST1BFUlRZIHN0cmluZ1Byb3AgZmlyc3QgU1RSSU5HIGludGVnZXJQcm9wIDEgSU5URUdFUiBXRUlHSFQgMzAuMzEgUkVBTCA7Ci1FTkQgQ0hLM0EKLU1BQ1JPIElOVgotTUFDUk8gQ0xBU1MgQ09SRQotICBQSU4gWgotICAgIERJUkVDVElPTiBPVVRQVVQgOwotICAgIFVTRSBTSUdOQUwgOwotICAgIEFOVEVOTkFQQVJUSUFMTUVUQUxBUkVBIDEwNjExLjIgTEFZRVIgTTIgOwotICAgIEFOVEVOTkFQQVJUSUFMTUVUQUxBUkVBIDI0NTAuMjYgTEFZRVIgTTMgOwotICAgIEFOVEVOTkFQQVJUSUFMQ1VUQVJFQSA0LjgyMTYgTEFZRVIgVjEgOwotICAgIEFOVEVOTkFQQVJUSUFMQ1VUQVJFQSAxODUuNzMgTEFZRVIgVjIgOwotICAgIEFOVEVOTkFESUZGQVJFQSA1MDA4LjQ2IExBWUVSIE0yIDsKLSAgICBBTlRFTk5BRElGRkFSRUEgNTE2My44OCBMQVlFUiBNMyA7Ci0gICAgQU5URU5OQU1PREVMIE9YSURFMSA7Ci0gICAgQU5URU5OQUdBVEVBUkVBIDI5Ny4yMTQgTEFZRVIgTTMgOwotICAgIEFOVEVOTkFNT0RFTCBPWElERTIgOwotICAgIEFOVEVOTkFNT0RFTCBPWElERTMgOwotICAgIEFOVEVOTkFHQVRFQVJFQSAxNjIuNDggTEFZRVIgTTIgOwotICAgIFBPUlQKLSAgICAgIExBWUVSIE0yIDsKLSAgICAgIFBBVEggICAgICAgKCAzMC44IDkgKQotICAgICAgKCA0MiA5ICkgOwotICAgIEVORAotICBFTkQgWgotUGFyc2VkIDE0MDAgbnVtYmVyIG9mIGxpbmVzISEKLSAgUElOIEEKLSAgICBESVJFQ1RJT04gSU5QVVQgOwotICAgIFVTRSBBTkFMT0cgOwotICAgIFBPUlQKLSAgICAgIExBWUVSIE0xIDsKLSAgICAgIFBBVEggICAgICAgKCAyNS4yIDE1ICkgOwotICAgIEVORAotICBFTkQgQQotICBQSU4gVkRECi0gICAgRElSRUNUSU9OIElOT1VUIDsKLSAgICBTSEFQRSBBQlVUTUVOVCA7Ci0gICAgQU5URU5OQVBBUlRJQUxNRVRBTEFSRUEgMTA2MTEuMiBMQVlFUiBNMiA7Ci0gICAgQU5URU5OQVBBUlRJQUxNRVRBTEFSRUEgMjQ1MC4yNiBMQVlFUiBNMyA7Ci0gICAgQU5URU5OQVBBUlRJQUxDVVRBUkVBIDQuODIxNiBMQVlFUiBWMSA7Ci0gICAgQU5URU5OQVBBUlRJQUxDVVRBUkVBIDE4NS43MyBMQVlFUiBWMiA7Ci0gICAgQU5URU5OQURJRkZBUkVBIDUwMDguNDYgTEFZRVIgTTIgOwotICAgIEFOVEVOTkFESUZGQVJFQSA1MTYzLjg4IExBWUVSIE0zIDsKLSAgICBBTlRFTk5BTU9ERUwgT1hJREUxIDsKLSAgICBBTlRFTk5BR0FURUFSRUEgMjk3LjIxNCBMQVlFUiBNMyA7Ci0gICAgQU5URU5OQU1PREVMIE9YSURFMiA7Ci0gICAgQU5URU5OQU1PREVMIE9YSURFMyA7Ci0gICAgQU5URU5OQUdBVEVBUkVBIDE2Mi40OCBMQVlFUiBNMiA7Ci0gICAgUE9SVAotICAgICAgTEFZRVIgTTEgOwotICAgICAgV0lEVEggNS42IDsKLSAgICAgIFBBVEggICAgICAgKCA1MC40IDIuOCApCi0gICAgICAoIDUwLjQgMjEuMiApIDsKLSAgICBFTkQKLSAgRU5EIFZERAotICBQSU4gVlNTCi0gICAgRElSRUNUSU9OIElOT1VUIDsKLSAgICBTSEFQRSBBQlVUTUVOVCA7Ci0gICAgUE9SVAotICAgICAgTEFZRVIgTTEgOwotICAgICAgV0lEVEggNS42IDsKLSAgICAgIFBBVEggICAgICAgKCAxNi44IDIuOCApCi0gICAgICAoIDE2LjggMjEuMiApIDsKLSAgICBFTkQKLSAgRU5EIFZTUwotUGFyc2VkIDE0NTAgbnVtYmVyIG9mIGxpbmVzISEKLSAgT0JTCi0gICAgICBMQVlFUiBNMSA7Ci0gICAgICBERVNJR05SVUxFV0lEVEggNC41IDsKLSAgICAgIFdJRFRIIDAuMSA7Ci0gICAgICBSRUNUIE1BU0sgMiAoIDI0LjEwMDAwMCAxLjUwMDAwMCApICggNDMuNTAwMDAwIDE2LjUwMDAwMCApIDsKLSAgICAgIFJFQ1QgTUFTSyAyIElURVJBVEUgKCAyNC4xMDAwMDAgMS41MDAwMDAgKSAoIDQzLjUwMDAwMCAxNi41MDAwMDAgKQotICAgICAgRE8gMiBCWSAxIFNURVAgMjAgMCA7Ci0gICAgICBQQVRIIE1BU0sgMyBJVEVSQVRFRCAgICAgICAoIDUzMiA1MzQgKQotICAgICAgKCAxOTk5LjIgNTM0ICkKLSAgICAgIERPIDEgQlkgMiBTVEVQIDAgMTQ0NiA7Ci0gICAgICBWSUEgSVRFUkFURSBNQVNLIDEyMyAoIDQ3MC40IDQ3NSApIFZJQUJJR1BPV0VSMTIKLSAgICAgIERPIDIgQlkgMiBTVEVQIDE1OTAuNCAxNTY1IDsKLSAgICAgIFBBVEggTUFTSyAzICAgICAgICggNTMyIDUzNCApCi0gICAgICAoIDE5OTkuMiA1MzQgKSA7Ci0gICAgICBQQVRIIE1BU0sgMyAgICAgICAoIDUzMiAxOTgwICkKLSAgICAgICggMTk5OS4yIDE5ODAgKSA7Ci0gICAgICBWSUEgTUFTSyAxMDMgKCA0NzAuNCA0NzUgKSBWSUFCSUdQT1dFUjEyIDsKLSAgICAgIFZJQSBNQVNLIDEzMiAoIDIwNjAuOCA0NzUgKSBWSUFCSUdQT1dFUjEyIDsKLSAgICAgIFZJQSBNQVNLIDExMiAoIDQ3MC40IDIwNDAgKSBWSUFCSUdQT1dFUjEyIDsKLSAgICAgIFZJQSBNQVNLIDEyMyAoIDIwNjAuOCAyMDQwICkgVklBQklHUE9XRVIxMiA7Ci0gICAgICBSRUNUICggNDQuMTAwMDAwIDEuNTAwMDAwICkgKCA2My41MDAwMDAgMTYuNTAwMDAwICkgOwotICBFTkQKLSAgREVOU0lUWQotICAgIExBWUVSIG1ldGFsMSA7Ci0gICAgICBSRUNUIDAgMCAxMDAgMTAwIDQ1LjUgOwotICAgICAgUkVDVCAxMDAgMCAyMDAgMTAwIDQyLjIgOwotICAgIExBWUVSIG1ldGFsMiA7Ci0gICAgICBSRUNUIDAgMCAyNTAgMTQwIDIwLjUgOwotICAgICAgUkVDVCAxIDEgMjUwIDE0MCAyMC41IDsKLSAgICAgIFJFQ1QgMiAyIDI1MCAxNDAgMjAuNSA7Ci0gICAgTEFZRVIgbWV0YWwzIDsKLSAgICAgIFJFQ1QgMTAgMTAgNDAgNDAgNC41IDsKLSAgRU5ECi0gIENMQVNTIENPUkUgOwotICBTWU1NRVRSWSBYIFkgUjkwIDsKLSAgU0lURSBDT1JFMSA7Ci0gIFNJWkUgNjcuMiBCWSAyNCA7Ci0gIEZPUkVJR04gSU5WUyA7Ci1FTkQgSU5WCi1NQUNSTyBJTlZfQgotTUFDUk8gQ0xBU1MgQ09SRSBTUEFDRVIKLVBhcnNlZCAxNTAwIG51bWJlciBvZiBsaW5lcyEhCi0gIFBJTiBaCi0gICAgRElSRUNUSU9OIE9VVFBVVCA7Ci0gICAgVVNFIENMT0NLIDsKLSAgICBQT1JUCi0gICAgICBMQVlFUiBNMSA7Ci0gICAgICBXSURUSCAxIDsKLSAgICAgIFBBVEggTUFTSyAyICAgICAgICggLTAuNiAtMC42ICkKLSAgICAgICggMC42IC0wLjYgKQotICAgICAgKCAwLjcgLTAuNiApIDsKLSAgICAgIExBWUVSIE0yIDsKLSAgICAgIFdJRFRIIDEgOwotICAgICAgUkVDVCBNQVNLIDEgKCAtMC42MDAwMDAgLTAuNjAwMDAwICkgKCAwLjYwMDAwMCAwLjYwMDAwMCApIDsKLSAgICAgIExBWUVSIE0zIDsKLSAgICAgIFdJRFRIIDEgOwotICAgICAgUkVDVCBNQVNLIDIgSVRFUkFURSAoIC0wLjYwMDAwMCAtMC42MDAwMDAgKSAoIDAuNjAwMDAwIDAuNjAwMDAwICkKLSAgICAgIERPIDEgQlkgMiBTVEVQIDIgMSA7Ci0gICAgICBMQVlFUiBNNCA7Ci0gICAgICBQQVRIIE1BU0sgMSAgICAgICAoIDMwLjggOSApCi0gICAgICAoIDQyIDkgKSA7Ci0gICAgICBWSUEgTUFTSyAxMDMgKCA0NzAuNCA0NzUgKSBWSUFCSUdQT1dFUjEyIDsKLSAgICAgIFZJQSBNQVNLIDEzMCAoIDIwNjAuOCA0NzUgKSBWSUFCSUdQT1dFUjEyIDsKLSAgICAgIFZJQSBNQVNLIDExMyAoIDQ3MC40IDIwNDAgKSBWSUFCSUdQT1dFUjEyIDsKLSAgICAgIFZJQSBNQVNLIDEyMSAoIDIwNjAuOCAyMDQwICkgVklBQklHUE9XRVIxMiA7Ci0gICAgRU5ECi0gIEVORCBaCi0gIFBJTiBBCi0gICAgRElSRUNUSU9OIEZFRURUSFJVIDsKLSAgICBVU0UgU0lHTkFMIDsKLSAgICBQT1JUCi0gICAgICBMQVlFUiBNMSA7Ci0gICAgICBQQVRIICAgICAgICggMjUuMiAxNSApIDsKLSAgICBFTkQKLSAgRU5EIEEKLVBhcnNlZCAxNTUwIG51bWJlciBvZiBsaW5lcyEhCi0gIFBJTiBWREQKLSAgICBESVJFQ1RJT04gSU5PVVQgOwotICAgIFNIQVBFIEFCVVRNRU5UIDsKLSAgICBQT1JUCi0gICAgICBMQVlFUiBNMSA7Ci0gICAgICBXSURUSCA1LjYgOwotICAgICAgUEFUSCAgICAgICAoIDUwLjQgMi44ICkKLSAgICAgICggNTAuNCAyMS4yICkgOwotICAgIEVORAotICBFTkQgVkRECi0gIFBJTiBWU1MKLSAgICBESVJFQ1RJT04gSU5PVVQgOwotICAgIFNIQVBFIEFCVVRNRU5UIDsKLSAgICBQT1JUCi0gICAgICBMQVlFUiBNMSA7Ci0gICAgICBXSURUSCA1LjYgOwotICAgICAgUEFUSCAgICAgICAoIDE2LjggMi44ICkKLSAgICAgICggMTYuOCAyMS4yICkgOwotICAgIEVORAotICBFTkQgVlNTCi0gIE9CUwotICAgICAgTEFZRVIgTTEgOwotICAgICAgUkVDVCAoIDI0LjEwMDAwMCAxLjUwMDAwMCApICggNDMuNTAwMDAwIDE2LjUwMDAwMCApIDsKLSAgRU5ECi0gIENMQVNTIENPUkUgU1BBQ0VSIDsKLSAgRUVRIElOViA7Ci0gIFNZTU1FVFJZIFggWSBSOTAgOwotICBTSVRFIENPUkUxIDsKLSAgU0laRSA2Ny4yIEJZIDI0IDsKLSAgRk9SRUlHTiBJTlZTICggNCA1ICkgOwotICBGT1JFSUdOIElOVjEgKCA1IDYgKSBTIDsKLSAgRk9SRUlHTiBJTlYyICggNiA3ICkgTiA7Ci0gIEZPUkVJR04gSU5WMyAoIDcgOCApIDsKLUVORCBJTlZfQgotTUFDUk8gREZGMwotTUFDUk8gQ0xBU1MgQ09SRSBBTlRFTk5BQ0VMTAotUGFyc2VkIDE2MDAgbnVtYmVyIG9mIGxpbmVzISEKLSAgUElOIFEKLSAgICBESVJFQ1RJT04gT1VUUFVUIDsKLSAgICBVU0UgU0lHTkFMIDsKLSAgICBQT1JUCi0gICAgICBMQVlFUiBNMiA7Ci0gICAgICBQQVRIICAgICAgICggMTkuNiA5OSApCi0gICAgICAoIDQ3LjYgOTkgKSA7Ci0gICAgRU5ECi0gIEVORCBRCi0gIFBJTiBRTgotICAgIERJUkVDVElPTiBPVVRQVVQgOwotICAgIFVTRSBTSUdOQUwgOwotICAgIFBPUlQKLSAgICAgIExBWUVSIE0yIDsKLSAgICAgIFBBVEggTUFTSyAxICAgICAgICggMjUuMiAxMjMgKQotICAgICAgKCA0MiAxMjMgKSA7Ci0gICAgICBSRUNUIE1BU0sgMiAoIDI0LjEwMDAwMCAxLjUwMDAwMCApICggNDMuNTAwMDAwIDIwOC41MDAwMDAgKSA7Ci0gICAgRU5ECi0gIEVORCBRTgotUGFyc2VkIDE2NTAgbnVtYmVyIG9mIGxpbmVzISEKLSAgUElOIEQKLSAgICBESVJFQ1RJT04gSU5QVVQgOwotICAgIFVTRSBTSUdOQUwgOwotICAgIFBPUlQKLSAgICAgIExBWUVSIE0xIDsKLSAgICAgIFBBVEggICAgICAgKCAzMC44IDUxICkgOwotICAgIEVORAotICBFTkQgRAotICBQSU4gRwotICAgIERJUkVDVElPTiBJTlBVVCA7Ci0gICAgVVNFIFNJR05BTCA7Ci0gICAgUE9SVAotICAgICAgTEFZRVIgTTEgOwotICAgICAgUEFUSCAgICAgICAoIDI1LjIgMyApIDsKLSAgICBFTkQKLSAgRU5EIEcKLSAgUElOIENECi0gICAgRElSRUNUSU9OIElOUFVUIDsKLSAgICBVU0UgQ0xPQ0sgOwotICAgIFBPUlQKLSAgICAgIExBWUVSIE0xIDsKLSAgICAgIFBBVEggICAgICAgKCAzNi40IDc1ICkgOwotICAgIEVORAotICBFTkQgQ0QKLSAgUElOIFZERAotICAgIERJUkVDVElPTiBJTk9VVCA7Ci0gICAgU0hBUEUgUklORyA7Ci0gICAgUE9SVAotICAgICAgTEFZRVIgTTEgOwotICAgICAgV0lEVEggNS42IDsKLSAgICAgIFBBVEggICAgICAgKCA1MC40IDIuOCApCi0gICAgICAoIDUwLjQgMjA3LjIgKSA7Ci0gICAgRU5ECi0gIEVORCBWREQKLVBhcnNlZCAxNzAwIG51bWJlciBvZiBsaW5lcyEhCi0gIFBJTiBWU1MKLSAgICBESVJFQ1RJT04gSU5PVVQgOwotICAgIFNIQVBFIEZFRURUSFJVIDsKLSAgICBQT1JUCi0gICAgICBMQVlFUiBNMSA7Ci0gICAgICBXSURUSCA1LjYgOwotICAgICAgUEFUSCAgICAgICAoIDE2LjggMi44ICkKLSAgICAgICggMTYuOCAyMDcuMiApIDsKLSAgICBFTkQKLSAgRU5EIFZTUwotICBPQlMKLSAgICAgIExBWUVSIE0xIDsKLSAgICAgIERFU0lHTlJVTEVXSURUSCAwLjE1IDsKLSAgICAgIFJFQ1QgKCAyNC4xMDAwMDAgMS41MDAwMDAgKSAoIDQzLjUwMDAwMCAyMDguNTAwMDAwICkgOwotICAgICAgUEFUSCAgICAgICAoIDguNCAzICkKLSAgICAgICggOC40IDEyMyApIDsKLSAgICAgIFBBVEggICAgICAgKCA1OC44IDMgKQotICAgICAgKCA1OC44IDEyMyApIDsKLSAgICAgIFBBVEggICAgICAgKCA2NC40IDMgKQotICAgICAgKCA2NC40IDEyMyApIDsKLSAgRU5ECi0gIERFTlNJVFkKLSAgICBMQVlFUiBtZXRhbDQgOwotICAgICAgUkVDVCAyNC4xIDEuNSA0My41IDIwOC41IDUuNSA7Ci0gIEVORAotICBDTEFTUyBDT1JFIEFOVEVOTkFDRUxMIDsKLSAgU1lNTUVUUlkgWCBZIFI5MCA7Ci0gIFNJVEUgQ09SRSAzNCA1NCBGRSBETyAzMCBCWSAzIFNURVAgMSAxIDsKLSAgU0lURSBDT1JFMSAyMSA2OCBTIERPIDMwIEJZIDMgU1RFUCAyIDIgOwotICBTSVpFIDY3LjIgQlkgMjEwIDsKLSAgRk9SRUlHTiBERkYzUyA7Ci1FTkQgREZGMwotTUFDUk8gQlVGMQotTUFDUk8gQ0xBU1MgRU5EQ0FQIEJPVFRPTUxFRlQKLSAgUElOIElOCi0gICAgQU5URU5OQURJRkZBUkVBIDAgOwotICAgIEFOVEVOTkFESUZGQVJFQSAwIDsKLSAgICBBTlRFTk5BTU9ERUwgT1hJREUxIDsKLSAgICBBTlRFTk5BR0FURUFSRUEgMSA7Ci0gICAgQU5URU5OQUdBVEVBUkVBIDMgOwotICAgIEFOVEVOTkFNT0RFTCBPWElERTIgOwotICAgIEFOVEVOTkFHQVRFQVJFQSAyIDsKLSAgICBBTlRFTk5BR0FURUFSRUEgNCA7Ci0gIEVORCBJTgotUGFyc2VkIDE3NTAgbnVtYmVyIG9mIGxpbmVzISEKLSAgUElOIElOMgotICAgIEFOVEVOTkFNT0RFTCBPWElERTEgOwotICAgIEFOVEVOTkFHQVRFQVJFQSAxIDsKLSAgRU5EIElOMgotICBQSU4gSU4zCi0gICAgU0hBUEUgQUJVVE1FTlQgOwotICBFTkQgSU4zCi0gIFBJTiBHTkQKLSAgICBVU0UgR1JPVU5EIDsKLSAgICBQT1JUCi0gICAgICBMQVlFUiBtZXRhbDEgOwotICAgICAgUE9MWUdPTiAgICAgICAoIDAgMCApCi0gICAgICAoIDAgMSApCi0gICAgICAoIDEgMCApCi0gICAgICAoIDIgMiApCi0gICAgICAoIDIgMCApIDsKLSAgICAgIFJFQ1QgKCAyLjAwMDAwMCAzLjAwMDAwMCApICggNC4wMDAwMDAgNS4wMDAwMDAgKSA7Ci0gICAgRU5ECi0gIEVORCBHTkQKLSAgT0JTCi0gICAgICBMQVlFUiBtZXRhbDIgOwotICAgICAgRVhDRVBUUEdORVQgOwotICAgICAgUE9MWUdPTiAgICAgICAoIDAgMCApCi0gICAgICAoIDAgMSApCi0gICAgICAoIDEgMCApCi0gICAgICAoIDIgMiApCi0gICAgICAoIDIgMCApIDsKLSAgICAgIFJFQ1QgKCAyLjAwMDAwMCAzLjAwMDAwMCApICggNC4wMDAwMDAgNS4wMDAwMDAgKSA7Ci0gIEVORAotICBDTEFTUyBFTkRDQVAgQk9UVE9NTEVGVCA7Ci1FTkQgQlVGMQotTUFDUk8gREZGNAotTUFDUk8gQ0xBU1MgQ09WRVIgQlVNUAotICBDTEFTUyBDT1ZFUiBCVU1QIDsKLSAgRk9SRUlHTiBERkYzUyA7Ci1FTkQgREZGNAotTUFDUk8gREZGNQotTUFDUk8gQ0xBU1MgQ09WRVIKLSAgQ0xBU1MgQ09WRVIgOwotICBGT1JFSUdOIERGRjNTIDsKLUVORCBERkY1Ci1NQUNSTyBteWRyaXZlcgotTUFDUk8gQ0xBU1MgUEFEIEFSRUFJTwotICBDTEFTUyBQQUQgQVJFQUlPIDsKLSAgRk9SRUlHTiBERkYzUyA7Ci1FTkQgbXlkcml2ZXIKLU1BQ1JPIG15YmxhY2tib3gKLU1BQ1JPIENMQVNTIEJMT0NLIEJMQUNLQk9YCi0gIENMQVNTIEJMT0NLIEJMQUNLQk9YIDsKLSAgRk9SRUlHTiBERkYzUyA7Ci1FTkQgbXlibGFja2JveAotTUFDUk8gRldIU1FDTjY5MFYxNQotTUFDUk8gQ0xBU1MgQ09SRQotUGFyc2VkIDE4MDAgbnVtYmVyIG9mIGxpbmVzISEKLSAgUElOIFIKLSAgICBESVJFQ1RJT04gSU5QVVQgOwotICAgIFVTRSBTSUdOQUwgOwotICAgIFBPUlQKLSAgICAgIExBWUVSIGExc2lnIDsKLSAgICAgIFJFQ1QgKCAxMS40MzAwMDAgMC44MDAwMDAgKSAoIDExLjcxMDAwMCAxLjIwMDAwMCApIDsKLSAgICAgIFJFQ1QgKCA5Ljk0MDAwMCAwLjgwMDAwMCApICggMTEuNDMwMDAwIDEuMDQwMDAwICkgOwotICAgICAgTEFZRVIgYTFzaWcgOwotICAgICAgUkVDVCAoIDkuNDkwMDAwIDAuODAwMDAwICkgKCA5LjcxMDAwMCAwLjgyMDAwMCApIDsKLSAgICAgIFJFQ1QgKCA5LjcxMDAwMCAwLjgwMDAwMCApICggOS45MzAwMDAgMS4wNDAwMDAgKSA7Ci0gICAgICBSRUNUICggOS45MjAwMDAgMC44MDAwMDAgKSAoIDkuOTQwMDAwIDEuMDQwMDAwICkgOwotICAgICAgUkVDVCAoIDkuMDAwMDAwIDIuMDYwMDAwICkgKCA5LjcyMDAwMCAyLjA4MDAwMCApIDsKLSAgICAgIFJFQ1QgKCA5LjM5MDAwMCAwLjgwMDAwMCApICggOS40NzAwMDAgMS43ODAwMDAgKSA7Ci0gICAgICBSRUNUICggOS40NjAwMDAgMC44MDAwMDAgKSAoIDkuNDgwMDAwIDEuNzgwMDAwICkgOwotICAgICAgUkVDVCAoIDkuNDcwMDAwIDAuODAwMDAwICkgKCA5LjQ5MDAwMCAxLjc3MDAwMCApIDsKLSAgICAgIFJFQ1QgKCA5LjQ4MDAwMCAwLjgxMDAwMCApICggOS43MjAwMDAgMi4wNzAwMDAgKSA7Ci0gICAgICBSRUNUICggOS4wMDAwMDAgMS43NzAwMDAgKSAoIDkuNDgwMDAwIDIuMDcwMDAwICkgOwotICAgIEVORAotICBFTkQgUgotICBQSU4gU0kKLSAgICBESVJFQ1RJT04gSU5QVVQgOwotICAgIFVTRSBTSUdOQUwgOwotICAgIFBPUlQKLSAgICAgIExBWUVSIGExc2lnIDsKLSAgICBFTkQKLSAgRU5EIFNJCi0gIFBJTiBTTQotICAgIERJUkVDVElPTiBJTlBVVCA7Ci0gICAgVVNFIFNJR05BTCA7Ci0gICAgUE9SVAotICAgICAgTEFZRVIgYTFzaWcgOwotICAgICAgUkVDVCAoIDAuODIwMDAwIDMuNTEwMDAwICkgKCAxLjA4MDAwMCAzLjg5MDAwMCApIDsKLSAgICAgIExBWUVSIGExc2lnIDsKLSAgICAgIFJFQ1QgKCAwLjM2MDAwMCAzLjUxMDAwMCApICggMC41OTAwMDAgMy42OTAwMDAgKSA7Ci0gICAgICBSRUNUICggMC4zNjAwMDAgMy42ODAwMDAgKSAoIDAuNTkwMDAwIDMuNzAwMDAwICkgOwotICAgICAgUkVDVCAoIDAuNTkwMDAwIDMuNTEwMDAwICkgKCAwLjgxMDAwMCAzLjg5MDAwMCApIDsKLSAgICAgIFJFQ1QgKCAwLjU5MDAwMCAzLjUxMDAwMCApICggMC44MTAwMDAgMy44OTAwMDAgKSA7Ci0gICAgICBSRUNUICggMC44MDAwMDAgMy41MTAwMDAgKSAoIDAuODIwMDAwIDMuODkwMDAwICkgOwotICAgICAgUkVDVCAoIDAuMzYwMDAwIDMuNjkwMDAwICkgKCAwLjYwMDAwMCAzLjk5MDAwMCApIDsKLSAgICAgIExBWUVSIGExc2lnIDsKLSAgICBFTkQKLSAgRU5EIFNNCi1QYXJzZWQgMTg1MCBudW1iZXIgb2YgbGluZXMhIQotICBQSU4gVAotICAgIERJUkVDVElPTiBJTlBVVCA7Ci0gICAgVVNFIFNJR05BTCA7Ci0gICAgUE9SVAotICAgICAgTEFZRVIgYTFzaWcgOwotICAgICAgTEFZRVIgYTFzaWcgOwotICAgICAgUkVDVCAoIDQuODUwMDAwIDMuNTEwMDAwICkgKCA0LjkxMDAwMCAzLjcwMDAwMCApIDsKLSAgICAgIFJFQ1QgKCA0LjkxMDAwMCAzLjUxMDAwMCApICggNS4xMzAwMDAgMy45OTAwMDAgKSA7Ci0gICAgICBSRUNUICggNS4xMjAwMDAgMy41MTAwMDAgKSAoIDUuMTQwMDAwIDMuOTkwMDAwICkgOwotICAgICAgUkVDVCAoIDQuMjAwMDAwIDMuNjkwMDAwICkgKCA0LjkyMDAwMCAzLjk5MDAwMCApIDsKLSAgICBFTkQKLSAgRU5EIFQKLSAgT0JTCi0gICAgICBMQVlFUiBhMXNpZyA7Ci0gICAgICBTUEFDSU5HIDAgOwotICAgICAgUkVDVCAoIDAuMTEwMDAwIDAuNzQwMDAwICkgKCAwLjgxMDAwMCAzLjQ3MDAwMCApIDsKLSAgICAgIFJFQ1QgKCAwLjgwMDAwMCAwLjc0MDAwMCApICggMC44MjAwMDAgMy40NzAwMDAgKSA7Ci0gICAgICBSRUNUICggMC44MjAwMDAgMC43NDAwMDAgKSAoIDIuNTQwMDAwIDQuMDYwMDAwICkgOwotICAgICAgUkVDVCAoIDIuNTQwMDAwIDAuNzQwMDAwICkgKCAzLjcwMDAwMCAzLjQ3MDAwMCApIDsKLSAgICAgIFJFQ1QgKCAzLjcwMDAwMCAwLjc0MDAwMCApICggMy45ODAwMDAgNC4wNjAwMDAgKSA7Ci0gICAgICBSRUNUICggMy45ODAwMDAgMC43NDAwMDAgKSAoIDUuMTQwMDAwIDMuNDcwMDAwICkgOwotICAgICAgUkVDVCAoIDUuMTQwMDAwIDAuNzQwMDAwICkgKCA4Ljc4MDAwMCA0LjA2MDAwMCApIDsKLSAgICAgIFJFQ1QgKCA4Ljc4MDAwMCAwLjc0MDAwMCApICggOS45NDAwMDAgMS41NDAwMDAgKSA7Ci0gICAgICBSRUNUICggOC43ODAwMDAgMS41MzAwMDAgKSAoIDkuOTQwMDAwIDEuNTUwMDAwICkgOwotICAgICAgUkVDVCAoIDguNzgwMDAwIDIuMjkwMDAwICkgKCA5Ljk0MDAwMCA0LjA2MDAwMCApIDsKLSAgICAgIFJFQ1QgKCA5Ljk0MDAwMCAwLjc0MDAwMCApICggMTQuMDYwMDAwIDQuMDYwMDAwICkgOwotICAgICAgUkVDVCAoIDE0LjA2MDAwMCAwLjc0MDAwMCApICggMTUuMjQwMDAwIDIuNTEwMDAwICkgOwotICAgICAgUkVDVCAoIDE1LjIzMDAwMCAwLjc0MDAwMCApICggMTUuMjUwMDAwIDIuNTEwMDAwICkgOwotICAgICAgUkVDVCAoIDE0LjA2MDAwMCAzLjI1MDAwMCApICggMTUuMjUwMDAwIDQuMDUwMDAwICkgOwotICAgICAgUkVDVCAoIDE0LjA2MDAwMCA0LjA0MDAwMCApICggMTUuMjUwMDAwIDQuMDYwMDAwICkgOwotICBFTkQKLSAgQ0xBU1MgQ09SRSA7Ci0gIFNZTU1FVFJZIFggWSA7Ci0gIFNJVEUgQ09SRSA7Ci0gIFNJWkUgMTUuMzYgQlkgNC44IDsKLSAgRk9SRUlHTiBGV0hTUUNONjkwICggMCAwICkgOwotICBPUklHSU4gKCAwIDAgKSA7Ci1FTkQgRldIU1FDTjY5MFYxNQotTUFDUk8gbXlzb2Z0Ci1NQUNSTyBDTEFTUyBCTE9DSyBTT0ZUCi0gIE9CUwotICAgICAgTEFZRVIgYTFzaWcgOwotICAgICAgREVTSUdOUlVMRVdJRFRIIDAgOwotICAgICAgUkVDVCAoIDAuMTEwMDAwIDAuNzQwMDAwICkgKCAwLjgxMDAwMCAzLjQ3MDAwMCApIDsKLSAgRU5ECi0gIENMQVNTIEJMT0NLIFNPRlQgOwotICBGT1JFSUdOIERGRjNTIDsKLUVORCBteXNvZnQKLU1BQ1JPIG15Y29yZXdlbGx0YXAKLU1BQ1JPIENMQVNTIENPUkUgV0VMTFRBUAotICBDTEFTUyBDT1JFIFdFTExUQVAgOwotICBGT1JFSUdOIERGRjNTIDsKLUVORCBteWNvcmV3ZWxsdGFwCi1NQUNSTyBteVRlc3QKLU1BQ1JPIENMQVNTIENPUkUKLVBhcnNlZCAxOTAwIG51bWJlciBvZiBsaW5lcyEhCi0gIENMQVNTIENPUkUgOwotICBTWU1NRVRSWSBYIDsKLSAgU0lURSBGc2l0ZSA7Ci0gIFNJVEUgRnNpdGUgMCAwIE4gOwotICBTSVRFIEZzaXRlIDAgNyBGUyA7Ci0gIFNJVEUgTHNpdGUgNCAwIE4gOwotICBTSVRFIExzaXRlIDAgMCBTIERPIDIgQlkgMSBTVEVQIDQgNSA7Ci0gIFNJVEUgRnNpdGUgNCAwIEUgOwotICBTSVRFIExzaXRlIDAuMyAwIFMgRE8gMiBCWSAxIFNURVAgNCA1IDsKLSAgU0lURSBGc2l0ZSAwIDAgTiBETyAyIEJZIDEgU1RFUCA0IDAgOwotICBTSVpFIDEwIEJZIDE0IDsKLUVORCBteVRlc3QKLU1BQ1JPIG15TWFjCi1NQUNSTyBDTEFTUyBDT1JFCi0gIFBJTiBJbjEKLSAgICBVU0UgU0lHTkFMIDsKLSAgICBTVVBQTFlTRU5TSVRJVklUWSB2ZGRwaW4xIDsKLSAgRU5EIEluMQotICBQSU4gdmRkcGluMQotICAgIFVTRSBTSUdOQUwgOwotICAgIE5FVEVYUFIgInBvd2VyMSBWREQxIiA7Ci0gIEVORCB2ZGRwaW4xCi0gIFBJTiB2ZGRwaW4yCi0gICAgVVNFIFNJR05BTCA7Ci0gICAgTkVURVhQUiAicG93ZXIyIFZERDIiIDsKLSAgRU5EIHZkZHBpbjIKLSAgUElOIGduZHBpbgotICAgIFVTRSBTSUdOQUwgOwotICAgIE5FVEVYUFIgImduZDEgR05EIiA7Ci0gIEVORCBnbmRwaW4KLSAgUElOIEluMgotICAgIFVTRSBTSUdOQUwgOwotICAgIEdST1VORFNFTlNJVElWSVRZIGduZHBpbiA7Ci0gIEVORCBJbjIKLSAgQ0xBU1MgQ09SRSA7Ci0gIFNZTU1FVFJZIFggOwotICBTSVpFIDEwIEJZIDE0IDsKLUVORCBteU1hYwotQU5URU5OQUlOUFVUR0FURUFSRUEgNDUgOwotUGFyc2VkIDE5NTAgbnVtYmVyIG9mIGxpbmVzISEKLUFOVEVOTkFJTk9VVERJRkZBUkVBIDY1IDsKLUFOVEVOTkFPVVRQVVRESUZGQVJFQSA1NSA7Ci1CRUdJTkVYVCAgIlNJR05BVFVSRSIKLSAgIENSRUFUT1IgIkNBREVOQ0UiCi0gICBEQVRFICIwNC8xNC85OCIKLUVOREVYVCA7CmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi9sZWZNc2dUYWJsZS5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYvbGVmTXNnVGFibGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ1ZWZlNy4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi9sZWZNc2dUYWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDA4ICswLDAgQEAKLQotLyoKLSAqIGVtc01rRXJyb3I6Ci0qLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJlbXMuaCIKLQotI2lmZGVmIFRTSVpFCi0jdW5kZWYgVFNJWkUKLSNkZWZpbmUgVFNJWkUgMjA0OAotI2VuZGlmCi0KLWVtc0Vycm9yX3QgTEVGRW1zTXNnVGFibGVbXSA9Ci17Ci0gICAgezEwMCAgICAsIEVNU19OT05FLCAibGVmclJlYWQgY2FsbGVkIGJlZm9yZSBsZWZySW5pdFxuIiwgLTEsIDB9LAotICAgIHsxMDEgICAgLCBFTVNfTk9ORSwgImxlZnJTZXRSZWdpc3RlclVudXNlZENhbGxiYWNrcyB3YXMgbm90IGNhbGxlZCB0byBzZXR1cCB0aGlzIGRhdGEuXG4iLCAtMSwgMH0sCi0gICAgezIwMSAgICAsIEVNU19OT05FLCAiTEVGIGl0ZW1zIHRoYXQgd2VyZSBwcmVzZW50IGJ1dCBpZ25vcmVkIGJlY2F1c2Ugb2Ygbm8gY2FsbGJhY2s6XG4iLCAtMSwgMH0sCi0gICAgezIwMyAgICAsIEVNU19OT05FLCAiTnVtYmVyIGhhcyBleGNlZWRlZCB0aGUgbGltaXQgZm9yIGFuIGludGVnZXIuIFNlZSBmaWxlICVzIGF0IGxpbmUgJWQuXG4iLCAtMSwgMH0sCi0gICAgezEwMDAgICAsIEVNU19OT05FLCAiRXhwZWN0aW5nICc9JyIsIC0xLCAwfSwKLSAgICB7MTAwMSAgICwgRU1TX05PTkUsICJFbmQgb2YgZmlsZSBpbiAmQUxJQVMiLCAtMSwgMH0sCi0gICAgezEwMDIgICAsIEVNU19OT05FLCAiSW5jb21wbGV0ZSBsZWYgZmlsZSIsIC0xLCAwfSwKLSAgICB7MTAwMyAgICwgRU1TX05PTkUsICJ0YWcgaXMgbWlzc2luZyBmb3IgQkVHSU5FWFQiLCAtMSwgMH0sCi0gICAgezEwMDQgICAsIEVNU19OT05FLCAiVGFnIGZvciBCRUdJTkVYVCBpcyBlbXB0eSIsIC0xLCAwfSwKLSAgICB7MTAwNSAgICwgRU1TX05PTkUsICJcIiBpcyBtaXNzaW5nIGluIHRhZyIsIC0xLCAwfSwKLSAgICB7MTAwNiAgICwgRU1TX05PTkUsICJFbmRpbmcgXCIgaXMgbWlzc2luZyIsIC0xLCAwfSwKLSAgICB7MTAwNyAgICwgRU1TX05PTkUsICJFTkRFWFQgaXMgbWlzc2luZyIsIC0xLCAwfSwKLSAgICB7MTAwOCAgICwgRU1TX05PTkUsICJJbnZhbGlkIGNoYXJhY3RlcnMgZm91bmQgaW4gXCclc1wnLlxuVGhlc2UgY2hhcmFjdGVycyBtaWdodCBoYXZlIGNyZWF0ZWQgYnkgY2hhcmFjdGVyIHR5cGVzIG90aGVyIHRoYW4gRW5nbGlzaC4iLCAtMSwgMH0sCi0gICAgezEwMTEgICAsIEVNU19OT05FLCAiJXMsIHNlZSBmaWxlICVzIGF0IGxpbmUgJWQuXG5MYXN0IHRva2VuIHdhcyA8JXNcIj47IHNwYWNlIGlzIG1pc3NpbmcgYmV0d2VlbiB0aGUgY2xvc2luZyBcIiBvZiB0aGUgc3RyaW5nIGFuZCA7LlxuIiwgLTEsIDB9LAotICAgIHsxMDIwICAgLCBFTVNfTk9ORSwgIlRvbyBtYW55IHN5bnRheCBlcnJvcnMuIiwgLTEsIDB9LAotICAgIHsxMzAwICAgLCBFTVNfTk9ORSwgIlRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBsYXllciBwcm9wZXJ0eSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgLTEsIDB9LAotICAgIHsxMzAxICAgLCBFTVNfTk9ORSwgIlRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBsYXllciBNSU5TSVpFIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWRcbiIsIC0xLCAwfSwKLSAgICB7MTMwMiAgICwgRU1TX05PTkUsICJUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgbGF5ZXIgTUlOU1RFUCBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgLTEsIDB9LAotICAgIHsxMzAzICAgLCBFTVNfTk9ORSwgIlRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBsYXllciBBUlJBWUNVVFMgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIC0xLCAwfSwKLSAgICB7MTMwNCAgICwgRU1TX05PTkUsICJUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgbGF5ZXIgU1BBQ0lORyBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgLTEsIDB9LAotICAgIHsxMzA1ICAgLCBFTVNfTk9ORSwgIkluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfU1BBQ0lORzogJXMuXG5Db3JyZWN0IHN5bnRheCBpcyBlaXRoZXIgXCJTUEFDSU5HIG1pblNwYWNpbmcgW0NFTlRFUlRPQ0VOVEVSXVwiXG5cIltMQVlFUiBzZWNvbmRMYXllck5hbWUgfCBBREpBQ0VOVENVVFMgezJ8M3w0fSBXSVRISU4gY3V0V2l0aGluIHwgUEFSQUxMRUxPVkVSTEFQIHwgQVJFQSBjdXRBcmVhXVwiIG9yXG5cIlNQQUNJTkcgZW9sU3BhY2UgRU5ET0ZMSU5FIGVvbFdpZHRoIFdJVEhJTiBlb2xXSVRISU4gW1BBUkFMTEVMRURHRSBwYXJTcGFjZSBXSVRISU4gcGFyV2l0aGluIFtUT1dFREdFU11dXCJcbiIsIC0xLCAwfSwKLSAgICB7MTMwNiAgICwgRU1TX05PTkUsICJJbmNvcnJlY3Qgc3ludGF4IGRlZmluZWQgZm9yIHByb3BlcnR5IExFRjU3X01BWEZMT0FUSU5HQVJFQTogJXMuXG5Db3JyZWN0IHN5bnRheCBpcyBcIk1BWEZMT0FUSU5HQVJFQSBtYXhBcmVhXCJcbiIsIC0xLCAwfSwKLSAgICB7MTMwNyAgICwgRU1TX05PTkUsICJJbmNvcnJlY3Qgc3ludGF4IGRlZmluZWQgZm9yIHByb3BlcnR5IExFRjU3X0FSUkFZU1BBQ0lORzogJXMuXG5Db3JyZWN0IHN5bnRheCBpcyBBUlJBWVNQQUNJTkcgW0xPTkdBUlJBWV0gW1dJRFRIIHZpYVdpZHRoXSBDVVRTUEFDSU5HIGN1dFNwYWNpbmdcblx0QVJSQVlDVVRTIGFycmF5Q3V0cyBTUEFDSU5HIGFycmF5U3BhY2luZyAuLi5cbiIsIC0xLCAwfSwKLSAgICB7MTMwOCAgICwgRU1TX05PTkUsICJJbmNvcnJlY3Qgc3ludGF4IGRlZmluZWQgZm9yIHByb3BlcnR5IExFRjU3X0FSUkFZU1BBQ0lORzogJXMuXG5MT05HQVJSQVkgaXMgZGVmaW5lZCBhZnRlciBDVVRTUEFDSU5HLlxuQ29ycmVjdCBzeW50YXggaXMgQVJSQVlTUEFDSU5HIFtMT05HQVJSQVldIFtXSURUSCB2aWFXaWR0aF0gQ1VUU1BBQ0lORyBjdXRTcGFjaW5nXG5cdEFSUkFZQ1VUUyBhcnJheUN1dHMgU1BBQ0lORyBhcnJheVNwYWNpbmcgLi4uXG4iLCAtMSwgMH0sCi0gICAgezEzMDkgICAsIEVNU19OT05FLCAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19BUlJBWVNQQUNJTkc6ICVzLlxuV0lEVEggaXMgZGVmaW5lZCBhZnRlciBDVVRTUEFDSU5HLlxuQ29ycmVjdCBzeW50YXggaXMgQVJSQVlTUEFDSU5HIFtMT05HQVJSQVldIFtXSURUSCB2aWFXaWR0aF0gQ1VUU1BBQ0lORyBjdXRTcGFjaW5nXG5cdEFSUkFZQ1VUUyBhcnJheUN1dHMgU1BBQ0lORyBhcnJheVNwYWNpbmcgLi4uXG4iLCAtMSwgMH0sCi0gICAgezEzMTAgICAsIEVNU19OT05FLCAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19BUlJBWVNQQUNJTkc6ICVzLlxuQ1VUU1BBQ0lORyBoYXMgZGVmaW5lZCBtb3JlIHRoYW4gb25jZS5cbkNvcnJlY3Qgc3ludGF4IGlzIEFSUkFZU1BBQ0lORyBbTE9OR0FSUkFZXSBbV0lEVEggdmlhV2lkdGhdIENVVFNQQUNJTkcgY3V0U3BhY2luZ1xuXHRBUlJBWUNVVFMgYXJyYXlDdXRzIFNQQUNJTkcgYXJyYXlTcGFjaW5nIC4uLlxuIiwgLTEsIDB9LAotICAgIHsxMzExICAgLCBFTVNfTk9ORSwgIkluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfQVJSQVlTUEFDSU5HOiAlcy5cbkNVVFNQQUNJTkcgd2hpY2ggaXMgcmVxdWlyZWQgaXMgZWl0aGVyIGhhcyBub3QgYmVlbiBkZWZpbmVkIG9yIGRlZmluZWQgaW4gYSB3cm9uZyBsb2NhdGlvbi5cbkNvcnJlY3Qgc3ludGF4IGlzIEFSUkFZU1BBQ0lORyBbTE9OR0FSUkFZXSBbV0lEVEggdmlhV2lkdGhdIENVVFNQQUNJTkcgY3V0U3BhY2luZ1xuXHRBUlJBWUNVVFMgYXJyYXlDdXRzIFNQQUNJTkcgYXJyYXkgU3BhY2luZyAuLi5cbiIsIC0xLCAwfSwKLSAgICB7MTMxMiAgICwgRU1TX05PTkUsICJJbmNvcnJlY3Qgc3ludGF4IGRlZmluZWQgZm9yIHByb3BlcnR5IExFRjU3X0FSUkFZU1BBQ0lORzogJXMuXG5TUEFDSU5HIHNob3VsZCBiZSBkZWZpbmVkIHdpdGggQVJSQVlDVVRTLlxuQ29ycmVjdCBzeW50YXggaXMgQVJSQVlTUEFDSU5HIFtMT05HQVJSQVldIFtXSURUSCB2aWFXaWR0aF0gQ1VUU1BBQ0lORyBjdXRTcGFjaW5nXG5cdEFSUkFZQ1VUUyBhcnJheUN1dHMgU1BBQ0lORyBhcnJheVNwYWNpbmcgLi4uXG4iLCAtMSwgMH0sCi0gICAgezEzMTMgICAsIEVNU19OT05FLCAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19BUlJBWVNQQUNJTkc6ICVzLlxuQ29ycmVjdCBzeW50YXggaXMgQVJSQVlTUEFDSU5HIFtMT05HQVJSQVldIFtXSURUSCB2aWFXaWR0aF0gQ1VUU1BBQ0lORyBjdXRTcGFjaW5nXG5cdEFSUkFZQ1VUUyBhcnJheUN1dHMgU1BBQ0lORyBhcnJheVNwYWNpbmcgLi4uXG4iLCAtMSwgMH0sCi0gICAgezEzMTQgICAsIEVNU19OT05FLCAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19BUlJBWVNQQUNJTkc6ICVzLlxuQVJSQVlDVVRTIGlzIHJlcXVpcmVkIGJ1dCBoYXMgbm90IGJlZW4gZGVmaW5lZC5cbkNvcnJlY3Qgc3ludGF4IGlzIEFSUkFZU1BBQ0lORyBbTE9OR0FSUkFZXSBbV0lEVEggdmlhV2lkdGhdIENVVFNQQUNJTkcgY3V0U3BhY2luZ1xuXHRBUlJBWUNVVFMgYXJyYXlDdXRzIFNQQUNJTkcgYXJyYXlTcGFjaW5nIC4uLlxuIiwgLTEsIDB9LAotICAgIHsxMzE1ICAgLCBFTVNfTk9ORSwgIkluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfTUlOU1RFUDogJXMuXG5Db3JyZWN0IHN5bnRheCBpcyBcIk1JTlNURVAgbWluU3RlcExlbmd0aCBbTUFYRURHRVMgbWF4RWRnZXNdIFtNSU5BREpBQ0VOVExFTkdUSCBtaW5BZGpMZW5ndGggfCBNSU5CRVRXRUVOTEVOR1RIIG1pbkJldHdlZW5MZW5ndGggW0VYQ0VQVFNBTUVDT1JORVJTXV0gO1wiXG4iLCAtMSwgMH0sCi0gICAgezEzMTYgICAsIEVNU19OT05FLCAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19BTlRFTk5BQ1VNUk9VVElOR1BMVVNDVVQ6ICVzLlxuQ29ycmVjdCBzeW50YXggaXMgXCJBTlRBTk5BQ1VNUk9VVElOR1BMVVNDVVRcIlxuIiwgLTEsIDB9LAotICAgIHsxMzE3ICAgLCBFTVNfTk9ORSwgIkluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfQU5URU5OQUdBVEVQTFVTRElGRjogJXMuXG5Db3JyZWN0IHN5bnRheCBpcyBcIkFOVEVOTkFHQVRFUExVU0RJRkYgcGx1c0RpZmZGYWN0b3JcIlxuIiwgLTEsIDB9LAotICAgIHsxMzE4ICAgLCBFTVNfTk9ORSwgIkluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfQU5URU5OQUFSRUFNSU5VU0RJRkY6ICVzLlxuQ29ycmVjdCBzeW50YXggaXMgXCJBTlRFTk5BQVJFQU1JTlVTRElGRiBtaW51c0RpZmZGYWN0b3JcIlxuIiwgLTEsIDB9LAotICAgIHsxMzE5ICAgLCBFTVNfTk9ORSwgIkluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfQU5URU5OQUFSRUFESUZGUkVEVUNFUFdMOiAlcy5cbkNvcnJlY3Qgc3ludGF4IGlzIFwiQU5URU5OQUFSRUFESUZGUkVEVUNFUFdMICgoIGRpZmZBcmVhMSBtZXRhbERpZmZGYWN0b3IxICkgKCBkaWZmQXJlYTIgbWV0YWxEaWZmRmFjdG9yMiApLi4uKVwiXG4iLCAtMSwgMH0sCi0gICAgezEzMjAgICAsIEVNU19OT05FLCAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19TUEFDSU5HOiAlcy5cbkNvcnJlY3Qgc3ludGF4IGlzIFwiU1BBQ0lORyBjdXRTcGFjaW5nIFtDRU5URVJUT0NFTlRFUl1bU0FNRU5FVF1cblx0W0xBWUVSIHNlY29uZExheWVyTmFtZVtTVEFDS11cblx0fCBBREpBQ0VOVENVVFMgezIgfCAzIHwgNH0gV0lUSElOIGN1dFdpdGhpbiBbRVhDRVBUU0FNRVBHTkVUXVxuXHR8IFBBUkFMTEVMT1ZFUkxBUFxuXHR8IEFSRUEgY3V0QXJlYSA7XCIiLCAtMSwgMH0sCi0gICAgezEzMjEgICAsIEVNU19OT05FLCAiVGhlIHByb3BlcnR5IExFRjU3X1NQQUNJTkcgd2l0aCB2YWx1ZSAlcyBpcyBmb3IgVFlQRSBDVVQgb25seS5cblRoZSBjdXJyZW50IGxheWVyIGhhcyB0aGUgVFlQRSAlcy5cblVwZGF0ZSB0aGUgcHJvcGVydHkgb2YgeW91ciBsZWYgZmlsZSB3aXRoIHRoZSBjb3JyZWN0IHN5bnRheCBvciByZW1vdmUgdGhpcyBwcm9wZXJ0eSBmcm9tIHlvdXIgbGVmIGZpbGUiLCAtMSwgMH0sCi0gICAgezEzMjIgICAsIEVNU19OT05FLCAiVGhlIHByb3BlcnR5IExFRjU3X1NQQUNJTkcgd2l0aCB2YWx1ZSAlcyBpcyBmb3IgVFlQRSBST1VUSU5HIG9ubHkuXG5UaGUgY3VycmVudCBsYXllciBoYXMgdGhlIFRZUEUgJXMuXG5VcGRhdGUgdGhlIHByb3BlcnR5IG9mIHlvdXIgbGVmIGZpbGUgd2l0aCB0aGUgY29ycmVjdCBzeW50YXggb3IgcmVtb3ZlIHRoaXMgcHJvcGVydHkgZnJvbSB5b3VyIGxlZiBmaWxlLiIsIC0xLCAwfSwKLSAgICB7MTMyMyAgICwgRU1TX05PTkUsICJUaGUgcHJvcGVydHkgTEVGNTdfTUlOU1RFUCB3aXRoIHZhbHVlICVzIGlzIGZvciBUWVBFIFJPVVRJTkcgb25seS5cblRoZSBjdXJyZW50IGxheWVyIGhhcyB0aGUgVFlQRSAlcy5cblVwZGF0ZSB0aGUgcHJvcGVydHkgb2YgeW91ciBsZWYgZmlsZSB3aXRoIHRoZSBjb3JyZWN0IHN5bnRheCBvciByZW1vdmUgdGhpcyBwcm9wZXJ0eSBmcm9tIHlvdXIgbGVmIGZpbGUuIiwgLTEsIDB9LAotICAgIHsxMzI0ICAgLCBFTVNfTk9ORSwgIkluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgdGhlIHN0YXRlbWVudCBUV09XSURUSFMuXG5TcGFjaW5nLCB3aGljaCBpcyByZXF1aXJlZCwgaXMgbm90IGRlZmluZWQuIiwgLTEsIDB9LAotICAgIHsxMzI1ICAgLCBFTVNfTk9ORSwgIlByb3BlcnR5IExFRjU4X1RZUEUgd2FzIGFkZGVkIGluIGluY29ycmVjdCBsYXllciB0eXBlLlxuSXQgaGFzIHRoZSB2YWx1ZSAlcyB3aGljaCBpcyBmb3IgbGF5ZXIgdHlwZSBST1VUSU5HLlxuVGhlIGxheWVyIHR5cGUgaXMgJXMuXG4iLCAtMSwgMH0sCi0gICAgezEzMjYgICAsIEVNU19OT05FLCAiUHJvcGVydHkgTEVGNThfVFlQRSB3YXMgYWRkZWQgaW4gaW5jb3JyZWN0IGxheWVyIHR5cGUuXG5JdCBoYXMgdGhlIHZhbHVlICVzIHdoaWNoIGlzIGZvciBsYXllciB0eXBlIENVVC5cblRoZSBsYXllciB0eXBlIGlzICVzLlxuIiwgLTEsIDB9LAotICAgIHsxMzI3ICAgLCBFTVNfTk9ORSwgIlByb3BlcnR5IExFRjU4X1RZUEUgd2FzIGFkZGVkIGluIGluY29ycmVjdCBsYXllciB0eXBlLlxuSXQgaGFzIHRoZSB2YWx1ZSAlcyB3aGljaCBpcyBmb3IgbGF5ZXIgdHlwZSBNQVNURVJTTElDRS5cblRoZSBsYXllciB0eXBlIGlzICVzLlxuIiwgLTEsIDB9LAotICAgIHsxMzI4ICAgLCBFTVNfTk9ORSwgIlByb3BlcnR5IExFRjU4X1RZUEUgaGFzIGluY29ycmVjdCBsYXllciB0eXBlICVzLlxuVmFsdWUgbGF5ZXIgdHlwZSBhcmU6IFBPTFlST1VUSU5HLCBNSU1DQVAsIFRTViwgUEFTU0lWQVRJT04sIE5XRUxMIG9yIFBXRUxMLlxuIiwgLTEsIDB9LAotICAgIHsxMzI5ICAgLCBFTVNfTk9ORSwgIkluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNThfVFlQRTogJXNcbkNvcnJlY3Qgc3ludGF4IGlzIFwiVFlQRSBQT0xZUk9VVElORyB8IE1JTkNBUCB8IFRTViB8IFBBU1NJVkFUSU9OIHwgTldFTEwgfCBQV0VMTCA7XCJcbiIsIC0xLCAwfSwKLSAgICB7MTMzMCAgICwgRU1TX05PTkUsICJJbmNvcnJlY3Qgc3ludGF4IGRlZmluZWQgZm9yIHByb3BlcnR5IExFRjU3X0VOQ0xPU1VSRTogJXNcbkNvcnJlY3Qgc3ludGF4IGlzIFwiRU5DTE9TVVJFIFtBQk9WRXxCRUxPV10gb3ZlcmhhbmcxIG92ZXJoYW5nMlxuXHRbV0lEVEggbWluV2lkdGggW0VYQ0VQVEVYVFJBQ1VUIGN1dFdpdGhpbl1cblx0fExFTkdUSCBtaW5MZW5ndGhdIDtcIlxuIiwgLTEsIDB9LAotICAgIHsxMzMxICAgLCBFTVNfTk9ORSwgIlRoZSBwcm9wZXJ0eSBMRUY1N19FTkNMT1NVUkUgd2l0aCB2YWx1ZSAlcyBpcyBmb3IgVFlQRSBDVVQgb25seS5cblRoZSBjdXJyZW50IGxheWVyIGhhcyB0aGUgVFlQRSAlcy5cblVwZGF0ZSB0aGUgcHJvcGVydHkgb2YgeW91ciBsZWYgZmlsZSB3aXRoIHRoZSBjb3JyZWN0IHN5bnRheCBvciByZW1vdmUgdGhpcyBwcm9wZXJ0eSBmcm9tIHlvdXIgbGVmIGZpbGUuXG4iLCAtMSwgMH0sCi0gICAgezEzNTAgICAsIEVNU19OT05FLCAiVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIG1hY3JvIFBJTiBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgLTEsIDB9LAotICAgIHsxMzUxICAgLCBFTVNfTk9ORSwgIlRoZXJlIGlzIGFuIHVuZXhwZWN0ZWQgbGVmIHBhcnNlciBidWcgd2hpY2ggY2F1c2UgaXQgdW5hYmxlIHRvIHJldHJpZXZlIEFOVEVOTkFNT0RFTCBkYXRhIHdpdGggdGhlIGdpdmVuIGluZGV4LiIsIC0xLCAwfSwKLSAgICB7MTM1MiAgICwgRU1TX05PTkUsICJUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgbWFjcm8gcHJvcGVydHkgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIC0xLCAwfSwKLSAgICB7MTM2MCAgICwgRU1TX05PTkUsICJUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgZ2VvbWV0cnkgaXRlbSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiIsIC0xLCAwfSwKLSAgICB7MTM2MSAgICwgRU1TX05PTkUsICJUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgZ2VvbWV0cnkgUkVDVEFOR0xFIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIiwgLTEsIDB9LAotICAgIHsxMzYyICAgLCBFTVNfTk9ORSwgIlRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBnZW9tZXRyeSBSRUNUQU5HTEUgSVRFUkFURSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiIsIC0xLCAwfSwKLSAgICB7MTM2MyAgICwgRU1TX05PTkUsICJUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgZ2VvbWV0cnkgUEFUSCBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiIsIC0xLCAwfSwKLSAgICB7MTM2NCAgICwgRU1TX05PTkUsICJUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgZ2VvbWV0cnkgUEFUSCBJVEVSQVRFIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIiwgLTEsIDB9LAotICAgIHsxMzY1ICAgLCBFTVNfTk9ORSwgIlRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBnZW9tZXRyeSBMQVlFUiBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiIsIC0xLCAwfSwKLSAgICB7MTM2NiAgICwgRU1TX05PTkUsICJUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgZ2VvbWV0cnkgTEFZRVIgRVhDRVBUIFBHIE5FVCBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiIsIC0xLCAwfSwKLSAgICB7MTM2NyAgICwgRU1TX05PTkUsICJUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgZ2VvbWV0cnkgTEFZRVIgTUlOU1BBQ0lORyBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiIsIC0xLCAwfSwKLSAgICB7MTM2OCAgICwgRU1TX05PTkUsICJUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgZ2VvbWV0cnkgTEFZRVIgUlVMRSBXSURUSCBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiIsIC0xLCAwfSwKLSAgICB7MTM2OSAgICwgRU1TX05PTkUsICJUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgZ2VvbWV0cnkgV0lEVEggaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4iLCAtMSwgMH0sCi0gICAgezEzNzAgICAsIEVNU19OT05FLCAiVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIGdlb21ldHJ5IFBPTFlHT04gaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4iLCAtMSwgMH0sCi0gICAgezEzNzEgICAsIEVNU19OT05FLCAiVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIGdlb21ldHJ5IFBPTFlHT04gSVRFUkFURSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiIsIC0xLCAwfSwKLSAgICB7MTM3MiAgICwgRU1TX05PTkUsICJUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgZ2VvbWV0cnkgQ0xBU1MgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4iLCAtMSwgMH0sCi0gICAgezEzNzMgICAsIEVNU19OT05FLCAiVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIGdlb21ldHJ5IFZJQSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiIsIC0xLCAwfSwKLSAgICB7MTM3NCAgICwgRU1TX05PTkUsICJUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgZ2VvbWV0cnkgVklBIElURVJBVEUgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4iLCAtMSwgMH0sCi0gICAgezEzNzUgICAsIEVNU19OT05FLCAidW5rbm93biBnZW9tZXRyeSB0eXBlLiIsIC0xLCAwfSwKLSAgICB7MTM3NiAgICwgRU1TX05PTkUsICJUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgSVJEUk9QIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIiwgLTEsIDB9LAotICAgIHsxMzc3ICAgLCBFTVNfTk9ORSwgIlRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBUUkFDSyBQQVRURVJOICBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiIsIC0xLCAwfSwKLSAgICB7MTQwMCAgICwgRU1TX05PTkUsICJJbnZhbGlkIG5vbmRlZmF1bHR2aWEgY2FsbGJhY2suIiwgLTEsIDB9LAotICAgIHsxNDAxICAgLCBFTVNfTk9ORSwgIkludmFsaWQgbm9uZGVmYXVsdHNwYWNpbmcgY2FsbGJhY2suIiwgLTEsIDB9LAotICAgIHsxNDAyICAgLCBFTVNfTk9ORSwgIlRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBOT05ERUZBVUxUIExBWUVSIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIiwgLTEsIDB9LAotICAgIHsxNDAzICAgLCBFTVNfTk9ORSwgIlRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBOT05ERUZBVUxUIFZJQSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiIsIC0xLCAwfSwKLSAgICB7MTQwNCAgICwgRU1TX05PTkUsICJUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgTk9OREVGQVVMVCBTUEFDSU5HIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIiwgLTEsIDB9LAotICAgIHsxNDA1ICAgLCBFTVNfTk9ORSwgIlRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBOT05ERUZBVUxUIFVTRSBWSUEgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4iLCAtMSwgMH0sCi0gICAgezE0MDYgICAsIEVNU19OT05FLCAiVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIE5PTkRFRkFVTFQgVVNFIFZJQVJVTEUgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4iLCAtMSwgMH0sCi0gICAgezE0MDcgICAsIEVNU19OT05FLCAiVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIE5PTkRFRkFVTFQgQ1VUIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIiwgLTEsIDB9LAotICAgIHsxNDA4ICAgLCBFTVNfTk9ORSwgIlRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBOT05ERUZBVUxUIFBST1BFUlRZIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIiwgLTEsIDB9LAotICAgIHsxNDIwICAgLCBFTVNfTk9ORSwgIlRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBWSUEgTEFZRVIgUkVDVEFOR0xFIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIiwgLTEsIDB9LAotICAgIHsxNDIxICAgLCBFTVNfTk9ORSwgIlRoZSBsYXllciBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBWSUEgTEFZRVIgaXMgaW52YWxpZC5cblZhbGlkIG51bWJlciBpcyBmcm9tIDAgdG8gJWQuIiwgLTEsIDB9LAotICAgIHsxNDIyICAgLCBFTVNfTk9ORSwgIlRoZSBsYXllciBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBWSUEgUFJPUEVSVFkgaXMgaW52YWxpZC5cblZhbGlkIG51bWJlciBpcyBmcm9tIDAgdG8gJWQuIiwgLTEsIDB9LAotICAgIHsxNDMwICAgLCBFTVNfTk9ORSwgInRvbyBtYW55IHZpYSBydWxlIGxheWVycy4iLCAtMSwgMH0sCi0gICAgezE0MzEgICAsIEVNU19OT05FLCAiVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIFZJQVJVTEUgUFJPUEVSVFkgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4iLCAtMSwgMH0sCi0gICAgezE1MDEgICAsIEVNU19OT05FLCAiRXJyb3IgZm91bmQgd2hlbiBwcm9jZXNzaW5nIExFRiBmaWxlICclcydcblVuaXQgJWQgaXMgYSB2ZXJzaW9uIDUuNiBvciBsYXRlciBzeW50YXhcbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNTAyICAgLCBFTVNfTk9ORSwgIlRoZSB2YWx1ZSAlZCBkZWZpbmVkIGZvciBMRUYgVU5JVFMgREFUQUJBU0UgTUlDUk9OUyBpcyBpbnZhbGlkXG4uIENvcnJlY3QgdmFsdWUgaXMgMTAwLCAyMDAsIDEwMDAsIDIwMDAsIDEwMDAwLCBvciAyMDAwMCIsIC0xLCAwfSwKLSAgICB7MTUwMyAgICwgRU1TX05PTkUsICJMZWYgcGFyc2VyIDUuNyBkb2VzIG5vdCBzdXBwb3J0IGxlZiBmaWxlIHdpdGggdmVyc2lvbiAlcy4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIsIC0xLCAwfSwKLSAgICB7MTUwNCAgICwgRU1TX05PTkUsICJOQU1FU0NBU0VTRU5TSVRJVkUgc3RhdGVtZW50IGlzIHNldCB3aXRoIE9GRi5cblN0YXJ0aW5nIHZlcnNpb24gNS42LCBOQU1FU0NBU0VOU0lUSVZFIGlzIG9ic29sZXRlLFxuaWYgaXQgaXMgZGVmaW5lZCwgaXQgaGFzIHRvIGhhdmUgdGhlIE9OIHZhbHVlLlxuUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIsIC0xLCAwfSwKLSAgICB7MTUwNSAgICwgRU1TX05PTkUsICJNQU5VRkFDVFVSSU5HR1JJRCBzdGF0ZW1lbnQgd2FzIGRlZmluZWQgYmVmb3JlIFVOSVRTLlxuUmVmZXIgdG8gdGhlIExFRiBMYW5ndWFnZSBSZWZlcmVuY2UgbWFudWFsIGZvciB0aGUgb3JkZXIgb2YgTEVGIHN0YXRlbWVudHMuIiwgLTEsIDB9LAotICAgIHsxNTA2ICAgLCBFTVNfTk9ORSwgIkEgTUFYVklBU1RBQ0sgc3RhdGVtZW50IGlzIGRlZmluZWQgYmVmb3JlIHRoZSBMQVlFUiBzdGF0ZW1lbnQuXG5SZWZlciB0byB0aGUgTEVGIExhbmd1YWdlIFJlZmVyZW5jZSBtYW51YWwgZm9yIHRoZSBvcmRlciBvZiBMRUYgc3RhdGVtZW50cy4iLCAtMSwgMH0sCi0gICAgezE1MDcgICAsIEVNU19OT05FLCAiRU5EIExBWUVSIG5hbWUgJXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIExBWUVSIG5hbWUgJXMuXG5Db3JyZWN0IHRoZSBMRUYgZmlsZSBiZWZvcmUgcmVydW5uaW5nIGl0IHRocm91Z2ggdGhlIExFRiBwYXJzZXIuIiwgLTEsIDB9LAotICAgIHsxNTA4ICAgLCBFTVNfTk9ORSwgIlRZUEUgc3RhdGVtZW50IGlzIGEgcmVxdWlyZWQgc3RhdGVtZW50IGluIGEgTEFZRVIgYW5kIGl0IGlzIG5vdCBkZWZpbmVkLiIsIC0xLCAwfSwKLSAgICB7MTUwOSAgICwgRU1TX05PTkUsICJQSVRDSCBzdGF0ZW1lbnQgaXMgYSByZXF1aXJlZCBzdGF0ZW1lbnQgaW4gYSBMQVlFUiB3aXRoIFRZUEUgUk9VVElORyBhbmQgaXQgaXMgbm90IGRlZmluZWQuIiwgLTEsIDB9LAotICAgIHsxNTEwICAgLCBFTVNfTk9ORSwgIldJRFRIIHN0YXRlbWVudCBpcyBhIHJlcXVpcmVkIHN0YXRlbWVudCBpbiBhIExBWUVSIHdpdGggVFlQRSBST1VUSU5HIGFuZCBpdCBpcyBub3QgZGVmaW5lZC4iLCAtMSwgMH0sCi0gICAgezE1MTEgICAsIEVNU19OT05FLCAiVGhlIERJUkVDVElPTiBzdGF0ZW1lbnQgd2hpY2ggaXMgcmVxdWlyZWQgaW4gYSBMQVlFUiB3aXRoIFRZUEUgUk9VVElORyBpcyBub3QgZGVmaW5lZCBpbiBMQVlFUiAlcy5cblVwZGF0ZSB5b3VyIGxlZiBmaWxlIGFuZCBhZGQgdGhlIERJUkVDVElPTiBzdGF0ZW1lbnQgZm9yIGxheWVyICVzLiIsIC0xLCAwfSwKLSAgICB7MTUxMiAgICwgRU1TX05PTkUsICJJdCBpcyBpbmNvcnJlY3QgdG8gZGVmaW5lIGEgU1BBQ0lORyBzdGF0ZW1lbnQgaW4gTEFZRVIgd2l0aCBUWVBFIE1BU1RFUlNMSUNFIG9yIE9WRVJMQVAuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iLCAtMSwgMH0sCi0gICAgezE1MTMgICAsIEVNU19OT05FLCAiRElSRUNUSU9OIHN0YXRlbWVudCBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HLiBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIiwgLTEsIDB9LAotICAgIHsxNTE0ICAgLCBFTVNfTk9ORSwgIlJFU0lTVEFOQ0Ugc3RhdGVtZW50IGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iLCAtMSwgMH0sCi0gICAgezE1MTUgICAsIEVNU19OT05FLCAiUkVTSVNUQU5DRSBzdGF0ZW1lbnQgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgUk9VVElORy4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIsIC0xLCAwfSwKLSAgICB7MTUxNiAgICwgRU1TX05PTkUsICJDQVBBQ0lUQU5DRSBzdGF0ZW1lbnQgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgUk9VVElORy4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIsIC0xLCAwfSwKLSAgICB7MTUxNyAgICwgRU1TX05PTkUsICJDQVBBQ0lUQU5DRSBzdGF0ZW1lbnQgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgUk9VVElORy4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIsIC0xLCAwfSwKLSAgICB7MTUxOCAgICwgRU1TX05PTkUsICJIRUlHSFQgc3RhdGVtZW50IGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iLCAtMSwgMH0sCi0gICAgezE1MTkgICAsIEVNU19OT05FLCAiV0lSRUVYVEVOU0lPTiBzdGF0ZW1lbnQgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgUk9VVElORy4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIsIC0xLCAwfSwKLSAgICB7MTUyMCAgICwgRU1TX05PTkUsICJUSElDS05FU1Mgc3RhdGVtZW50IGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iLCAtMSwgMH0sCi0gICAgezE1MjEgICAsIEVNU19OT05FLCAiU0hSSU5LQUdFIHN0YXRlbWVudCBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HLiBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIiwgLTEsIDB9LAotICAgIHsxNTIyICAgLCBFTVNfTk9ORSwgIkNBUE1VTFRJUExJRVIgc3RhdGVtZW50IGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iLCAtMSwgMH0sCi0gICAgezE1MjMgICAsIEVNU19OT05FLCAiRURHRUNBUEFDSVRBTkNFIHN0YXRlbWVudCBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HLiBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIiwgLTEsIDB9LAotICAgIHsxNTI0ICAgLCBFTVNfTk9ORSwgIkFOVEVOTkFBUkVBRkFDVE9SIHN0YXRlbWVudCBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HLiBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIiwgLTEsIDB9LAotICAgIHsxNTI1ICAgLCBFTVNfTk9ORSwgIkFOVEVOTkFMRU5HVEhGQUNUT1Igc3RhdGVtZW50IGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iLCAtMSwgMH0sCi0gICAgezE1MjYgICAsIEVNU19OT05FLCAiQU5URU5OQUxFTkdUSEZBQ1RPUiBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuMyBvciBlYXJsaWVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgd2l0aCB2ZXJzaW9uICVnLCBoYXMgYm90aCBvbGQgYW5kIG5ldyBBTlRFTk5BTEVOR1RIRkFDVE9SIHN5bnRheCwgd2hpY2ggaXMgaW5jb3JyZWN0LiIsIC0xLCAwfSwKLSAgICB7MTUyNyAgICwgRU1TX05PTkUsICJBQ0NVUlJFTlRERU5TSVRZIHN0YXRlbWVudCBjYW4ndCBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBNQVNURVJTTElDRSBvciBPVkVSTEFQLiBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIiwgLTEsIDB9LAotICAgIHsxNTI4ICAgLCBFTVNfTk9ORSwgIkRDQ1VSUkVOVERFTlNJVFkgc3RhdGVtZW50IGNhbid0IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIE1BU1RFUlNMSUNFIG9yIE9WRVJMQVAuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iLCAtMSwgMH0sCi0gICAgezE1MjkgICAsIEVNU19OT05FLCAiQ1VUQVJFQSBzdGF0ZW1lbnQgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgQ1VULiBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIiwgLTEsIDB9LAotICAgIHsxNTMwICAgLCBFTVNfTk9ORSwgIldJRFRIIHN0YXRlbWVudCBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HLiBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIiwgLTEsIDB9LAotICAgIHsxNTMxICAgLCBFTVNfTk9ORSwgIkFOVEVOTkFBUkVBUkFUSU8gc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNTMyICAgLCBFTVNfTk9ORSwgIkFOVEVOTkFESUZGQVJFQVJBVElPIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IG9yIGVhcmxpZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSB3aXRoIHZlcnNpb24gJWcsIGhhcyBib3RoIG9sZCBhbmQgbmV3IEFOVEVOTkFBUkVBUkFUSU8gc3ludGF4LCB3aGljaCBpcyBpbmNvcnJlY3QuIiwgLTEsIDB9LAotICAgIHsxNTMzICAgLCBFTVNfTk9ORSwgIkFOVEVOTkFBUkVBUkFUSU8gc3RhdGVtZW50IGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcgb3IgQ1VULiBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIiwgLTEsIDB9LAotICAgIHsxNTM0ICAgLCBFTVNfTk9ORSwgIkFOVEVOTkFESUZGQVJFQVJBVElPIHN0YXRlbWVudCBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HIG9yIENVVC4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIsIC0xLCAwfSwKLSAgICB7MTUzNSAgICwgRU1TX05PTkUsICJBTlRFTk5BQ1VNQVJFQVJBVElPIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7MTUzNiAgICwgRU1TX05PTkUsICJBTlRFTk5BQ1VNQVJFQVJBVElPIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IG9yIGVhcmxpZXIgb2xkIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgd2l0aCB2ZXJzaW9uICVnLCBoYXMgYm90aCBvbGQgYW5kIG5ldyBBTlRFTk5BQ1VNQVJFQVJBVElPIHN5bnRheCwgd2hpY2ggaXMgaW5jb3JyZWN0LiIsIC0xLCAwfSwKLSAgICB7MTUzNyAgICwgRU1TX05PTkUsICJBTlRFTk5BQ1VNQVJFQVJBVElPIHN0YXRlbWVudCBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HIG9yIENVVC4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIsIC0xLCAwfSwKLSAgICB7MTUzOCAgICwgRU1TX05PTkUsICJBTlRFTk5BQ1VNRElGRkFSRUFSQVRJTyBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezE1MzkgICAsIEVNU19OT05FLCAiQU5URU5OQUNVTURJRkZBUkVBUkFUSU8gc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgb3IgZWFybGllciBvbGQgc3ludGF4LlxuWW91ciBsZWYgZmlsZSB3aXRoIHZlcnNpb24gJWcsIGhhcyBib3RoIG9sZCBhbmQgbmV3IEFOVEVOTkFDVU1ESUZGQVJFQVJBVElPIHN5bnRheCwgd2hpY2ggaXMgaW5jb3JyZWN0LiIsIC0xLCAwfSwKLSAgICB7MTU0MCAgICwgRU1TX05PTkUsICJBTlRFTk5BQ1VNRElGRkFSRUFSQVRJTyBzdGF0ZW1lbnQgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgUk9VVElORyBvciBDVVQuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iLCAtMSwgMH0sCi0gICAgezE1NDEgICAsIEVNU19OT05FLCAiQU5URU5OQUFSRUFGQUNUT1IgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgUk9VVElORyBvciBDVVQuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iLCAtMSwgMH0sCi0gICAgezE1NDIgICAsIEVNU19OT05FLCAiQU5URU5OQVNJREVBUkVBUkFUSU8gY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgUk9VVElORy4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIsIC0xLCAwfSwKLSAgICB7MTU0MyAgICwgRU1TX05PTkUsICJBTlRFTk5BU0lERUFSRUFSQVRJTyBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezE1NDQgICAsIEVNU19OT05FLCAiQU5URU5OQVNJREVBUkVBUkFUSU8gc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgb3IgZWFybGllciBvbGQgc3ludGF4LlxuWW91ciBsZWYgZmlsZSB3aXRoIHZlcnNpb24gJWcsIGhhcyBib3RoIG9sZCBhbmQgbmV3IEFOVEVOTkFTSURFQVJFQVJBVElPIHN5bnRheCwgd2hpY2ggaXMgaW5jb3JyZWN0LiIsIC0xLCAwfSwKLSAgICB7MTU0NSAgICwgRU1TX05PTkUsICJBTlRFTk5BRElGRlNJREVBUkVBUkFUSU8gY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgUk9VVElORy4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIsIC0xLCAwfSwKLSAgICB7MTU0NiAgICwgRU1TX05PTkUsICJBTlRFTk5BRElGRlNJREVBUkVBUkFUSU8gc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNTQ3ICAgLCBFTVNfTk9ORSwgIkFOVEVOTkFESUZGU0lERUFSRUFSQVRJTyBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBvciBlYXJsaWVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgd2l0aCB2ZXJzaW9uICVnLCBoYXMgYm90aCBvbGQgYW5kIG5ldyBBTlRFTk5BRElGRlNJREVBUkVBUkFUSU8gc3ludGF4LCB3aGljaCBpcyBpbmNvcnJlY3QuIiwgLTEsIDB9LAotICAgIHsxNTQ4ICAgLCBFTVNfTk9ORSwgIkFOVEVOTkFDVU1TSURFQVJFQVJBVElPIGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iLCAtMSwgMH0sCi0gICAgezE1NDkgICAsIEVNU19OT05FLCAiQU5URU5OQUNVTVNJREVBUkVBUkFUSU8gc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNTUwICAgLCBFTVNfTk9ORSwgIkFOVEVOTkFDVU1TSURFQVJFQVJBVElPIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IG9yIGVhcmxpZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSB3aXRoIHZlcnNpb24gJWcsIGhhcyBib3RoIG9sZCBhbmQgbmV3IEFOVEVOTkFDVU1TSURFQVJFQVJBVElPIHN5bnRheCwgd2hpY2ggaXMgaW5jb3JyZWN0LiIsIC0xLCAwfSwKLSAgICB7MTU1MSAgICwgRU1TX05PTkUsICJBTlRFTk5BQ1VNRElGRlNJREVBUkVBUkFUSU8gY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgUk9VVElORy4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIsIC0xLCAwfSwKLSAgICB7MTU1MiAgICwgRU1TX05PTkUsICJBTlRFTk5BQ1VNRElGRlNJREVBUkVBUkFUSU8gc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNTUzICAgLCBFTVNfTk9ORSwgIkFOVEVOTkFDVU1ESUZGU0lERUFSRUFSQVRJTyBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBvciBlYXJsaWVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgd2l0aCB2ZXJzaW9uICVnLCBoYXMgYm90aCBvbGQgYW5kIG5ldyBBTlRFTk5BQ1VNRElGRlNJREVBUkVBUkFUSU8gc3ludGF4LCB3aGljaCBpcyBpbmNvcnJlY3QuIiwgLTEsIDB9LAotICAgIHsxNTU0ICAgLCBFTVNfTk9ORSwgIkFOVEVOTkFTSURFQVJFQUZBQ1RPUiBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HLiBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIiwgLTEsIDB9LAotICAgIHsxNTU1ICAgLCBFTVNfTk9ORSwgIkFOVEVOTkFTSURFQVJFQUZBQ1RPUiBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezE1NTYgICAsIEVNU19OT05FLCAiQU5URU5OQVNJREVBUkVBRkFDVE9SIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IG9yIGVhcmxpZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSB3aXRoIHZlcnNpb24gJWcsIGhhcyBib3RoIG9sZCBhbmQgbmV3IEFOVEVOTkFTSURFQVJFQUZBQ1RPUiBzeW50YXgsIHdoaWNoIGlzIGluY29ycmVjdC4iLCAtMSwgMH0sCi0gICAgezE1NTcgICAsIEVNU19OT05FLCAiQU5URU5OQU1PREVMIGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iLCAtMSwgMH0sCi0gICAgezE1NTggICAsIEVNU19OT05FLCAiQU5URU5OQU1PREVMIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS41IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7MTU1OSAgICwgRU1TX05PTkUsICJBTlRFTk5BTU9ERUwgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgb3IgZWFybGllciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIHdpdGggdmVyc2lvbiAlZywgaGFzIGJvdGggb2xkIGFuZCBuZXcgQU5URU5OQU1PREVMIHN5bnRheCwgd2hpY2ggaXMgaW5jb3JyZWN0LiIsIC0xLCAwfSwKLSAgICB7MTU2MCAgICwgRU1TX05PTkUsICJBTlRFTk5BQ1VNUk9VVElOR1BMVVNDVVQgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgUk9VVElORyBvciBDVVQuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iLCAtMSwgMH0sCi0gICAgezE1NjEgICAsIEVNU19OT05FLCAiQU5URU5OQUdBVEVQTFVTRElGRiBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HIG9yIENVVC4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIsIC0xLCAwfSwKLSAgICB7MTU2MiAgICwgRU1TX05PTkUsICJBTlRFTk5BQVJFQU1JTlVTRElGRiBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HIG9yIENVVC4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIsIC0xLCAwfSwKLSAgICB7MTU2MyAgICwgRU1TX05PTkUsICJBTlRFTk5BQVJFQURJRkZSRURVQ0VQV0wgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgUk9VVElORyBvciBDVVQuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iLCAtMSwgMH0sCi0gICAgezE1NjQgICAsIEVNU19OT05FLCAiU0xPVFdJUkVXSURUSCBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezE1NjUgICAsIEVNU19OT05FLCAiU0xPVFdJUkVMRU5HVEggc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNTY2ICAgLCBFTVNfTk9ORSwgIlNMT1RXSURUSCBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezE1NjcgICAsIEVNU19OT05FLCAiU0xPVExFTkdUSCBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezE1NjggICAsIEVNU19OT05FLCAiTUFYQURKQUNFTlRTTE9UU1BBQ0lORyBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezE1NjkgICAsIEVNU19OT05FLCAiTUFYQ09BWElBTFNMT1RTUEFDSU5HIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7MTU3MCAgICwgRU1TX05PTkUsICJNQVhFREdFU0xPVFNQQUNJTkcgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNTcxICAgLCBFTVNfTk9ORSwgIlNQTElUV0lSRVdJRFRIIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IGFuZCBsYXRlciBzeW50YXguXG4gWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezE1NzIgICAsIEVNU19OT05FLCAiTUlOSU1VTURFTlNJVFkgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbiBZb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7MTU3MyAgICwgRU1TX05PTkUsICJNQVhJTVVNREVOU0lUWSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuIFlvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNTc0ICAgLCBFTVNfTk9ORSwgIkRFTlNJVFlDSEVDS1dJTkRPVyBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezE1NzUgICAsIEVNU19OT05FLCAiREVOU0lUWUNIRUNLU1RFUCBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezE1NzYgICAsIEVNU19OT05FLCAiRklMTEFDVElWRVNQQUNJTkcgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNTc3ICAgLCBFTVNfTk9ORSwgIk1BWFdJRFRIIHN0YXRlbWVudCBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HLiAgUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIsIC0xLCAwfSwKLSAgICB7MTU3OCAgICwgRU1TX05PTkUsICJNQVhXSURUSCBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNSBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezE1NzkgICAsIEVNU19OT05FLCAiTUlOV0lEVEggc3RhdGVtZW50IGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcuICBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIiwgLTEsIDB9LAotICAgIHsxNTgwICAgLCBFTVNfTk9ORSwgIk1JTldJRFRIIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS41IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7MTU4MSAgICwgRU1TX05PTkUsICJNSU5FTkNMT1NFREFSRUEgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjUgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNTgyICAgLCBFTVNfTk9ORSwgIlBST1RSVVNJT04gUlVMRSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNSBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezE1ODMgICAsIEVNU19OT05FLCAiU1BBQ0lOR1RBQkxFIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS41IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7MTU4NCAgICwgRU1TX05PTkUsICJFTkNMT1NVUkUgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjYgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNTg1ICAgLCBFTVNfTk9ORSwgIlBSRUZFUkVOQ0xPU1VSRSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezE1ODYgICAsIEVNU19OT05FLCAiUkVTSVNUQU5DRSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezE1ODcgICAsIEVNU19OT05FLCAiRElBR01JTkVER0VMRU5HVEggY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgUk9VVElORy4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIsIC0xLCAwfSwKLSAgICB7MTU4OCAgICwgRU1TX05PTkUsICJESUFHTUlORURHRUxFTkdUSCBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezE1ODkgICAsIEVNU19OT05FLCAiQW4gSU5GTFVFTkNFIHRhYmxlIHN0YXRlbWVudCB3YXMgZGVmaW5lZCBiZWZvcmUgdGhlIFBBUkFMTEVMUlVOTEVOR1RIIHRhYmxlIHN0YXRlbWVudC5cbklORkxVRU5DRSB0YWJsZSBzdGF0ZW1lbnQgc2hvdWxkIGJlIGRlZmluZWQgZm9sbG93aW5nIHRoZSBQQVJBTExFTFJVTkxFTkdUSC5cbkNoYW5nZSB0aGUgTEVGIGZpbGUgYW5kIHJlcnVubmluZyB0aGUgcGFyc2VyLiIsIC0xLCAwfSwKLSAgICB7MTU5MCAgICwgRU1TX05PTkUsICJUaGVyZSBpcyBtdWx0aXBsZSBQQVJBTExFTFJVTkxFTkdUSCB0YWJsZSBzdGF0ZW1lbnRzIGFyZSBkZWZpbmVkIHdpdGhpbiBhIGxheWVyLlxuQWNjb3JkaW5nIHRvIHRoZSBMRUYgUmVmZXJlbmNlIE1hbnVhbCwgb25seSBvbmUgUEFSQUxMRUxSVU5MRU5HVEggdGFibGUgc3RhdGVtZW50IGlzIGFsbG93ZWQgcGVyIGxheWVyLiIsIC0xLCAwfSwKLSAgICB7MTU5MSAgICwgRU1TX05PTkUsICJUaGUgdG90YWwgbnVtYmVyIG9mIGxlbmd0aHMgZGVmaW5lZCBpbiB0aGUgUEFSQUxMRUxSVU5MRU5HVEggc3RhdGVtZW50IGlzIG5vdCBlcXVhbCB0b1xudGhlICB0b3RhbCBudW1iZXIgb2Ygc3BhY2luZ3MgZGVmaW5lZCBpbiB0aGUgV0lEVEggc3RhdGVtZW50IGluIHRoZSBTUEFDSU5HVEFCTEUuIiwgLTEsIDB9LAotICAgIHsxNTkyICAgLCBFTVNfTk9ORSwgIkEgUEFSQUxMRUxSVU5MRU5HVEggc3RhdGVtZW50IHdhcyBhbHJlYWR5IGRlZmluZWQgaW4gdGhlIGxheWVyLlxuSXQgaXMgUEFSQUxMRUxSVU5MRU5HVEggb3IgVE9XV0lEVEhTIGlzIGFsbG93ZWQgcGVyIGxheWVyLiIsIC0xLCAwfSwKLSAgICB7MTU5MyAgICwgRU1TX05PTkUsICJBIFRXT1dJRFRIUyB0YWJsZSBzdGF0ZW1lbnQgd2FzIGFscmVhZHkgZGVmaW5lZCBpbiB0aGUgbGF5ZXIuXG5Pbmx5IG9uZSBUV09XSURUSFMgc3RhdGVtZW50IGlzIGFsbG93ZWQgcGVyIGxheWVyLiIsIC0xLCAwfSwKLSAgICB7MTU5NCAgICwgRU1TX05PTkUsICJBIElORkxVRU5DRSB0YWJsZSBzdGF0ZW1lbnQgd2FzIGFscmVhZHkgZGVmaW5lZCBpbiB0aGUgbGF5ZXIuXG5Pbmx5IG9uZSBJTkZMVUVOQ0Ugc3RhdGVtZW50IGlzIGFsbG93ZWQgcGVyIGxheWVyLiIsIC0xLCAwfSwKLSAgICB7MTU5NSAgICwgRU1TX05PTkUsICJBbiBJTkZMVUVOQ0UgdGFibGUgc3RhdGVtZW50IHdhcyBhbHJlYWR5IGRlZmluZWQgYmVmb3JlIHRoZSBsYXllci5cbklORkxVRU5DRSBzdGF0ZW1lbnQgaGFzIHRvIGJlIGRlZmluZWQgYWZ0ZXIgdGhlIFBBUkFMTEVMUlVOTEVOR1RIIHRhYmxlIHN0YXRlbWVudCBpbiB0aGUgbGF5ZXIuIiwgLTEsIDB9LAotICAgIHsxNTk2ICAgLCBFTVNfTk9ORSwgIkZST01BQk9WRSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNSBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezE1OTcgICAsIEVNU19OT05FLCAiRlJPTUJFTE9XIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS41IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7MTU5OCAgICwgRU1TX05PTkUsICJMRU5HVEggV0lUSElOIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS41IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7MTU5OSAgICwgRU1TX05PTkUsICJBTlRFTk5BQVJFQUZBQ1RPUiB3aXRoIERJRkZVU0VPTkxZIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7MTYwMCAgICwgRU1TX05PTkUsICJDVVRBUkVBIHN0YXRlbWVudCBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBDVVQuIiwgLTEsIDB9LAotICAgIHsxNjAxICAgLCBFTVNfTk9ORSwgIldJRFRIIGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcuIiwgLTEsIDB9LAotICAgIHsxNjAyICAgLCBFTVNfTk9ORSwgIk1BWFZJQVNUQUNLIHN0YXRlbWVudCBoYXMgdG8gYmUgZGVmaW5lZCBhZnRlciB0aGUgTEFZRVIgc3RhdGVtZW50LiIsIC0xLCAwfSwKLSAgICB7MTYwMyAgICwgRU1TX05PTkUsICJBIE1BWFZJQVNUQUNLIHdhcyBhbHJlYWR5IGRlZmluZWQuXG5Pbmx5IG9uZSBNQVhWSUFTVEFDSyBpcyBhbGxvd2VkIHBlciBsZWYgZmlsZS4iLCAtMSwgMH0sCi0gICAgezE2MDQgICAsIEVNU19OT05FLCAiTUFYVklBU1RBQ0sgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjUgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNjA1ICAgLCBFTVNfTk9ORSwgIkRFRkFVTFQgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjYgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNjA2ICAgLCBFTVNfTk9ORSwgIkEgTEFZRVIgc3RhdGVtZW50IGlzIG1pc3NpbmcgaW4gdGhlIFZJQSAlcy5cbkF0IGxlYXN0IG9uZSBMQVlFUiBpcyByZXF1aXJlZCBwZXIgVklBIHN0YXRlbWVudC4iLCAtMSwgMH0sCi0gICAgezE2MDcgICAsIEVNU19OT05FLCAiRU5EIFZJQSBuYW1lICVzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBWSUEgbmFtZSAlcy5cbkNvcnJlY3QgdGhlIExFRiBmaWxlIGJlZm9yZSByZXJ1bm5pbmcgaXQgdGhyb3VnaCB0aGUgTEVGIHBhcnNlci4iLCAtMSwgMH0sCi0gICAgezE2MDggICAsIEVNU19OT05FLCAiQSBWSUFSVUxFIHN0YXRlbWVudCByZXF1aXJlcyB0d28gbGF5ZXJzLiIsIC0xLCAwfSwKLSAgICB7MTYwOSAgICwgRU1TX05PTkUsICJBIERJUkVDVElPTiBzdGF0ZW1lbnQgd2FzIGFscmVhZHkgZGVmaW5lZCBpbiB0aGUgbGF5ZXIuXG5JdCBpcyBESVJFQ1RJT04gb3IgRU5DTE9TVVJFIGNhbiBiZSBzcGVjaWZpZWQgaW4gYSBsYXllci4iLCAtMSwgMH0sCi0gICAgezE2MTAgICAsIEVNU19OT05FLCAiQW4gT1ZFUkhBTkcgc3RhdGVtZW50IGlzIGRlZmluZWQsIGJ1dCB0aGUgcmVxdWlyZWQgRElSRUNUSU9OIHN0YXRlbWVudCBpcyBub3QgeWV0IGRlZmluZWQuXG5VcGRhdGUgdGhlIExFRiBmaWxlIHRvIGRlZmluZSB0aGUgRElSRUNUSU9OIHN0YXRlbWVudCBiZWZvcmUgdGhlIE9WRVJIQU5HLiIsIC0xLCAwfSwKLSAgICB7MTYxMSAgICwgRU1TX05PTkUsICJBbiBPVkVSSEFORyBzdGF0ZW1lbnQgaXMgZGVmaW5lZCBpbiBhIFZJQVJVTEUgc3RhdGVtZW50IG9ubHkuXG5PVkVSSEFORyBzdGF0ZW1lbnQgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBWSUFSVUxFIEdFTkVSQVRFLiIsIC0xLCAwfSwKLSAgICB7MTYxMiAgICwgRU1TX05PTkUsICJBbiBNRVRBTE9WRVJIQU5HIHN0YXRlbWVudCBpcyBkZWZpbmVkIGluIGEgVklBUlVMRSBzdGF0ZW1lbnQgb25seS5cbk9WRVJIQU5HIHN0YXRlbWVudCBjYW4gb25seSBiZSBkZWZpbmVkIGluIFZJQVJVTEUgR0VORVJBVEUuIiwgLTEsIDB9LAotICAgIHsxNjEzICAgLCBFTVNfTk9ORSwgIkFuIE1FVEFMT1ZFUkhBTkcgc3RhdGVtZW50IGlzIGRlZmluZWQsIGJ1dCB0aGUgcmVxdWlyZWQgRElSRUNUSU9OIHN0YXRlbWVudCBpcyBub3QgeWV0IGRlZmluZWQuXG5VcGRhdGUgdGhlIExFRiBmaWxlIHRvIGRlZmluZSB0aGUgRElSRUNUSU9OIHN0YXRlbWVudCBiZWZvcmUgdGhlIE9WRVJIQU5HLiIsIC0xLCAwfSwKLSAgICB7MTYxNCAgICwgRU1TX05PTkUsICJBbiBFTkNMT1NVUkUgc3RhdGVtZW50IGlzIGRlZmluZWQgaW4gYSBWSUFSVUxFIHN0YXRlbWVudCBvbmx5LlxuT1ZFUkhBTkcgc3RhdGVtZW50IGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gVklBUlVMRSBHRU5FUkFURS4iLCAtMSwgMH0sCi0gICAgezE2MTUgICAsIEVNU19OT05FLCAiRU5EIFZJQVJVTEUgbmFtZSAlcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgVklBUlVMRSBuYW1lICVzLlxuQ29ycmVjdCB0aGUgTEVGIGZpbGUgYmVmb3JlIHJlcnVubmluZyBpdCB0aHJvdWdoIHRoZSBMRUYgcGFyc2VyLiIsIC0xLCAwfSwKLSAgICB7MTYxNiAgICwgRU1TX05PTkUsICJTQU1FTkVUIHN0YXRlbWVudCBpcyByZXF1aXJlZCBpbnNpZGUgU1BBQ0lORyBmb3IgYW55IGxlZiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgYW5kIGVhcmxpZXIsIGJ1dCBpcyBub3QgZGVmaW5lZCBpbiB0aGUgcGFyc2VkIGxlZiBmaWxlLiIsIC0xLCAwfSwKLSAgICB7MTYxNyAgICwgRU1TX05PTkUsICJOT05ERUZBVUxUUlVMRSBzdGF0ZW1lbnQgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIExBWUVSIHN0YXRlbWVudC4iLCAtMSwgMH0sCi0gICAgezE2MTggICAsIEVNU19OT05FLCAiTk9OREVGQVVMVFJVTEUgc3RhdGVtZW50IHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBWSUEgc3RhdGVtZW50LiIsIC0xLCAwfSwKLSAgICB7MTYxOSAgICwgRU1TX05PTkUsICJFTkQgTk9OREVGQVVMVFJVTEUgbmFtZSAlcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgTk9OREVGQVVMVFJVTEUgbmFtZSAlcy5cbkNvcnJlY3QgdGhlIExFRiBmaWxlIGJlZm9yZSByZXJ1bm5pbmcgaXQgdGhyb3VnaCB0aGUgTEVGIHBhcnNlci4iLCAtMSwgMH0sCi0gICAgezE2MjAgICAsIEVNU19OT05FLCAiSEFSRFNQQUNJTkcgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjYgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNjIxICAgLCBFTVNfTk9ORSwgIlVTRVZJQSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezE2MjIgICAsIEVNU19OT05FLCAiVVNFVklBUlVMRSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezE2MjMgICAsIEVNU19OT05FLCAiTUlOQ1VUUyBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezE2MjQgICAsIEVNU19OT05FLCAiRU5EIExBWUVSIG5hbWUgJXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIExBWUVSIG5hbWUgJXMuXG5Db3JyZWN0IHRoZSBMRUYgZmlsZSBiZWZvcmUgcmVydW5uaW5nIGl0IHRocm91Z2ggdGhlIExFRiBwYXJzZXIuIiwgLTEsIDB9LAotICAgIHsxNjI1ICAgLCBFTVNfTk9ORSwgIkEgV0lEVEggc3RhdGVtZW50IGlzIHJlcXVpcmVkIGluIHRoZSBMQVlFUiBzdGF0ZW1lbnQgaW4gTk9OREVGQVVMVFJVTEUuIiwgLTEsIDB9LAotICAgIHsxNjI2ICAgLCBFTVNfTk9ORSwgIkEgU1BBQ0lORyBzdGF0ZW1lbnQgaXMgcmVxdWlyZWQgaW4gdGhlIExBWUVSIHN0YXRlbWVudCBpbiBOT05ERUZBVUxUUlVMRSBmb3IgbGVmIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNSBhbmQgZWFybGllci5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIFVwZGF0ZSB5b3VyIGxlZiB0byBhZGQgYSBMQVlFUiBzdGF0ZW1lbnQgYW5kIHRyeSBhZ2Fpbi4iLCAtMSwgMH0sCi0gICAgezE2MjcgICAsIEVNU19OT05FLCAiUkVTSVNUQU5DRSBSUEVSU1Egc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNjI4ICAgLCBFTVNfTk9ORSwgIkNBUEFDSVRBTkNFIENQRVJTUURJU1Qgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNjI5ICAgLCBFTVNfTk9ORSwgIkVER0VDQVBBQ0lUQU5DRSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuIFlvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNjMwICAgLCBFTVNfTk9ORSwgIkRJQUdXSURUSCBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezE2MzEgICAsIEVNU19OT05FLCAiRU5EIFNJVEUgbmFtZSAlcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgU0lURSBuYW1lICVzLlxuQ29ycmVjdCB0aGUgTEVGIGZpbGUgYmVmb3JlIHJlcnVubmluZyBpdCB0aHJvdWdoIHRoZSBMRUYgcGFyc2VyLiIsIC0xLCAwfSwKLSAgICB7MTYzMiAgICwgRU1TX05PTkUsICJBIENMQVNTIHN0YXRlbWVudCBpcyByZXF1aXJlZCBpbiB0aGUgU0lURSBzdGF0ZW1lbnQuIiwgLTEsIDB9LAotICAgIHsxNjMzICAgLCBFTVNfTk9ORSwgIkEgU0laRSAgc3RhdGVtZW50IGlzIHJlcXVpcmVkIGluIHRoZSBTSVRFIHN0YXRlbWVudC4iLCAtMSwgMH0sCi0gICAgezE2MzQgICAsIEVNU19OT05FLCAiRU5EIE1BQ1JPIG5hbWUgJXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIE1BQ1JPIG5hbWUgJXMuXG5Db3JyZWN0IHRoZSBMRUYgZmlsZSBiZWZvcmUgcmVydW5uaW5nIGl0IHRocm91Z2ggdGhlIExFRiBwYXJzZXIuIiwgLTEsIDB9LAotICAgIHsxNjM1ICAgLCBFTVNfTk9ORSwgIkNPVkVSIEJVTVAgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjUgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNjM2ICAgLCBFTVNfTk9ORSwgIkJMT0NLIEJMQUNLQk9YIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS41IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7MTYzNyAgICwgRU1TX05PTkUsICJCTE9DSyBTT0ZUIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS42IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7MTYzOCAgICwgRU1TX05PTkUsICJQQUQgQVJFQUlPIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS41IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7MTYzOSAgICwgRU1TX05PTkUsICJTUEFDRVIgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNjQwICAgLCBFTVNfTk9ORSwgIkFOVEVOTkFDRUxMIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7MTY0MSAgICwgRU1TX05PTkUsICJXRUxMVEFQIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS42IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7MTY0MiAgICwgRU1TX05PTkUsICJPUklHSU4gc3RhdGVtZW50IGhhcyBiZWVuIGRlZmluZWQgbW9yZSB0aGFuIG9uY2UgaW4gYSBNQUNSTyBzdGF0ZW1lbnQuXG5Pbmx5IG9uZSBPUklHSU4gc3RhdGVtZW50IGNhbiBiZSBkZWZpbmVkIGluIGEgTWFjcm8uXG5QYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIiwgLTEsIDB9LAotICAgIHsxNjQzICAgLCBFTVNfTk9ORSwgIkVORCBQSU4gbmFtZSAlcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgUElOIG5hbWUgJXMuXG5Db3JyZWN0IHRoZSBMRUYgZmlsZSBiZWZvcmUgcmVydW5uaW5nIGl0IHRocm91Z2ggdGhlIExFRiBwYXJzZXIuIiwgLTEsIDB9LAotICAgIHsxNjQ0ICAgLCBFTVNfTk9ORSwgIkFOVEVOTkFTSVpFIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS4zIGFuZCBlYXJsaWVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNjQ1ICAgLCBFTVNfTk9ORSwgIkFOVEVOTkFNRVRBTEFSRUEgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjMgYW5kIGVhcmxpZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezE2NDYgICAsIEVNU19OT05FLCAiQU5URU5OQU1FVEFMTEVOR1RIIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS4zIGFuZCBlYXJsaWVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNjQ3ICAgLCBFTVNfTk9ORSwgIkFOVEVOTkFQQVJUSUFMTUVUQUxBUkVBIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7MTY0OCAgICwgRU1TX05PTkUsICJBTlRFTk5BUEFSVElBTE1FVEFMU0lERUFSRUEgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNjQ5ICAgLCBFTVNfTk9ORSwgIkFOVEVOTkFQQVJUSUFMQ1VUQVJFQSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezE2NTAgICAsIEVNU19OT05FLCAiQU5URU5OQURJRkZBUkVBIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7MTY1MSAgICwgRU1TX05PTkUsICJBTlRFTk5BR0FURUFSRUEgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNjUyICAgLCBFTVNfTk9ORSwgIkFOVEVOTkFNQVhBUkVBQ0FSIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7MTY1MyAgICwgRU1TX05PTkUsICJBTlRFTk5BTUFYU0lERUFSRUFDQVIgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNjU0ICAgLCBFTVNfTk9ORSwgIkFOVEVOTkFNQVhDVVRDQVIgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNjU1ICAgLCBFTVNfTk9ORSwgIkFOVEVOTkFNT0RFTCBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNSBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezE2NTYgICAsIEVNU19OT05FLCAiTkVURVhQUiBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezE2NTcgICAsIEVNU19OT05FLCAiU1VQUExZU0VOU0lUSVZJVFkgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjYgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNjU4ICAgLCBFTVNfTk9ORSwgIkdST1VORFNFTlNJVElWSVRZIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS42IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7MTY1OSAgICwgRU1TX05PTkUsICJUSEUgU1BBQ0lORyBzdGF0ZW1lbnQgaGFzIHRoZSB2YWx1ZSAlZyBpbiBNQUNSTyBPQlMuXG5WYWx1ZSBoYXMgdG8gYmUgMCBvciBncmVhdGVyLiIsIC0xLCAwfSwKLSAgICB7MTY2MCAgICwgRU1TX05PTkUsICJUSEUgREVTSUdOUlVMRVdJRFRIIHN0YXRlbWVudCBoYXMgdGhlIHZhbHVlICVnIGluIE1BQ1JPIE9CUy5cblZhbHVlIGhhcyB0byBiZSAwIG9yIGdyZWF0ZXIuIiwgLTEsIDB9LAotICAgIHsxNjYxICAgLCBFTVNfTk9ORSwgIkRFTlNJVFkgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjYgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNjYyICAgLCBFTVNfTk9ORSwgIkVORCBBUlJBWSBuYW1lICVzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBBUlJBWSBuYW1lICVzLlxuQ29ycmVjdCB0aGUgTEVGIGZpbGUgYmVmb3JlIHJlcnVubmluZyBpdCB0aHJvdWdoIHRoZSBMRUYgcGFyc2VyLiIsIC0xLCAwfSwKLSAgICB7MTY2MyAgICwgRU1TX05PTkUsICJBIENFTlRFUlRPQ0VOVEVSIHN0YXRlbWVudCB3YXMgYWxyZWFkeSBkZWZpbmVkIGluIFNQQUNJTkdcbkNFTlRFUlRPQ0VOVEVSIGNhbiBvbmx5IGJlIGRlZmluZWQgb25jZSBwZXIgTEFZRVIgQ1VUIFNQQUNJTkcuIiwgLTEsIDB9LAotICAgIHsxNjY0ICAgLCBFTVNfTk9ORSwgIkNFTlRFUlRPQ0VOVEVSIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS42IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7MTY2NSAgICwgRU1TX05PTkUsICJBIFNBTUVORVQgc3RhdGVtZW50IHdhcyBhbHJlYWR5IGRlZmluZWQgaW4gU1BBQ0lOR1xuU0FNRU5FVCBjYW4gb25seSBiZSBkZWZpbmVkIG9uY2UgcGVyIExBWUVSIENVVCBTUEFDSU5HLiIsIC0xLCAwfSwKLSAgICB7MTY2NiAgICwgRU1TX05PTkUsICJBIFBBUkFMTEVMT1ZFUkxBUCBzdGF0ZW1lbnQgd2FzIGFscmVhZHkgZGVmaW5lZCBpbiBTUEFDSU5HXG5QQVJBTExFTE9WRVJMQVAgY2FuIG9ubHkgYmUgZGVmaW5lZCBvbmNlIHBlciBMQVlFUiBDVVQgU1BBQ0lORy4iLCAtMSwgMH0sCi0gICAgezE2NjcgICAsIEVNU19OT05FLCAiQSBTQU1FTkVUIHN0YXRlbWVudCB3YXMgYWxyZWFkeSBkZWZpbmVkIGluIFNQQUNJTkdcbkVpdGhlciBTQU1FTkVUIG9yIExBWUVSIGNhbiBiZSBkZWZpbmVkLCBidXQgbm90IGJvdGguIiwgLTEsIDB9LAotICAgIHsxNjY4ICAgLCBFTVNfTk9ORSwgIkFESkFDRU5UQ1VUUyBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNSBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezE2NjkgICAsIEVNU19OT05FLCAiQSBTQU1FTkVUIHN0YXRlbWVudCB3YXMgYWxyZWFkeSBkZWZpbmVkIGluIFNQQUNJTkdcbkVpdGhlciBTQU1FTkVUIG9yIEFESkFDRU5UQ1VUUyBjYW4gYmUgZGVmaW5lZCwgYnV0IG5vdCBib3RoLiIsIC0xLCAwfSwKLSAgICB7MTY3MCAgICwgRU1TX05PTkUsICJBIFNBTUVORVQgc3RhdGVtZW50IHdhcyBhbHJlYWR5IGRlZmluZWQgaW4gU1BBQ0lOR1xuRWl0aGVyIFNBTUVORVQgb3IgQVJFQSBjYW4gYmUgZGVmaW5lZCwgYnV0IG5vdCBib3RoLiIsIC0xLCAwfSwKLSAgICB7MTY3MSAgICwgRU1TX05PTkUsICJJTlBVVFBJTkFOVEVOTkFTSVpFIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS4zIG9yIGVhcmxpZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSB3aXRoIHZlcnNpb24gJWcsIGhhcyBib3RoIG9sZCBhbmQgbmV3IElOUFVUUElOQU5URU5OQVNJWkUgc3ludGF4LCB3aGljaCBpcyBpbmNvcnJlY3QuIiwgLTEsIDB9LAotICAgIHsxNjcyICAgLCBFTVNfTk9ORSwgIk9VVFBVVFBJTkFOVEVOTkFTSVpFIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS4zIG9yIGVhcmxpZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSB3aXRoIHZlcnNpb24gJWcsIGhhcyBib3RoIG9sZCBhbmQgbmV3IE9VVFBVVFBJTkFOVEVOTkFTSVpFIHN5bnRheCwgd2hpY2ggaXMgaW5jb3JyZWN0LiIsIC0xLCAwfSwKLSAgICB7MTY3MyAgICwgRU1TX05PTkUsICJJTk9VVFBJTkFOVEVOTkFTSVpFIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS4zIG9yIGVhcmxpZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSB3aXRoIHZlcnNpb24gJWcsIGhhcyBib3RoIG9sZCBhbmQgbmV3IElOT1VUUElOQU5URU5OQVNJWkUgc3ludGF4LCB3aGljaCBpcyBpbmNvcnJlY3QuIiwgLTEsIDB9LAotICAgIHsxNjc0ICAgLCBFTVNfTk9ORSwgIkFOVEVOTkFJTlBVVEdBVEVBUkVBIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLlxuRWl0aGVyIHVwZGF0ZSB5b3VyIFZFUlNJT04gbnVtYmVyIHRvIDUuNCBvciBsYXRlciwgb3IgdXNlIHRoZSA1LjMgc3ludGF4OlxueyBJTlBVVElOQVRFTk5BU0laRSB8IE9VVFBVVFBJTkFOVEVOTkFTSVpFIHwgSU5PVVRQSU5BTlRFTk5BU0laRSB9IHZhbHVlLiIsIC0xLCAwfSwKLSAgICB7MTY3NSAgICwgRU1TX05PTkUsICJBTlRFTk5BSU5QVVRHQVRFQVJFQSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBvciBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIHdpdGggdmVyc2lvbiAlZywgaGFzIGJvdGggb2xkIGFuZCBuZXcgQU5URU5OQUlOUFVUR0FURUFSRUEgc3ludGF4LCB3aGljaCBpcyBpbmNvcnJlY3QuIiwgLTEsIDB9LAotICAgIHsxNjc2ICAgLCBFTVNfTk9ORSwgIkFOVEVOTkFJTk9VVERJRkZBUkVBIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLlxuRWl0aGVyIHVwZGF0ZSB5b3VyIFZFUlNJT04gbnVtYmVyIHRvIDUuNCBvciBsYXRlciwgb3IgdXNlIHRoZSA1LjMgc3ludGF4OlxueyBJTlBVVElOQVRFTk5BU0laRSB8IE9VVFBVVFBJTkFOVEVOTkFTSVpFIHwgSU5PVVRQSU5BTlRFTk5BU0laRSB9IHZhbHVlLiIsIC0xLCAwfSwKLSAgICB7MTY3NyAgICwgRU1TX05PTkUsICJBTlRFTk5BSU5PVVRESUZGQVJFQSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBvciBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIHdpdGggdmVyc2lvbiAlZywgaGFzIGJvdGggb2xkIGFuZCBuZXcgQU5URU5OQUlOT1VURElGRkFSRUEgc3ludGF4LCB3aGljaCBpcyBpbmNvcnJlY3QuIiwgLTEsIDB9LAotICAgIHsxNjc4ICAgLCBFTVNfTk9ORSwgIkFOVEVOTkFPVVRQVVRESUZGQVJFQSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy5cbkVpdGhlciB1cGRhdGUgeW91ciBWRVJTSU9OIG51bWJlciB0byA1LjQgb3IgbGF0ZXIsIG9yIHVzZSB0aGUgNS4zIHN5bnRheDpcbnsgSU5QVVRJTkFURU5OQVNJWkUgfCBPVVRQVVRQSU5BTlRFTk5BU0laRSB8IElOT1VUUElOQU5URU5OQVNJWkUgfSB2YWx1ZS4uIiwgLTEsIDB9LAotICAgIHsxNjc5ICAgLCBFTVNfTk9ORSwgIkFOVEVOTkFPVVRQVVRESUZGQVJFQSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBvciBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIHdpdGggdmVyc2lvbiAlZywgaGFzIGJvdGggb2xkIGFuZCBuZXcgQU5URU5OQU9VVFBVVERJRkZBUkVBIHN5bnRheCwgd2hpY2ggaXMgaW5jb3JyZWN0LiIsIC0xLCAwfSwKLSAgICB7MTY4MCAgICwgRU1TX05PTkUsICJQQVJBTExFTE9WRVJMQVAgaXMgYSB2ZXJzaW9uIDUuNyBvciBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7MTY4MSAgICwgRU1TX05PTkUsICJFTkRPRkxJTkUgaXMgYSB2ZXJzaW9uIDUuNyBvciBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7MTY4MiAgICwgRU1TX05PTkUsICJOT1RDSExFTkdUSCBpcyBhIHZlcnNpb24gNS43IG9yIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNjgzICAgLCBFTVNfTk9ORSwgIkVYQ0VQVFNBTUVQR05FVCBpcyBhIHZlcnNpb24gNS43IG9yIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNjg0ICAgLCBFTVNfTk9ORSwgIlNBTUVORVQgaXMgYSB2ZXJzaW9uIDUuNyBvciBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7MTY4NSAgICwgRU1TX05PTkUsICJBUlJBWVNQQUNJTkcgaXMgYSB2ZXJzaW9uIDUuNyBvciBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7MTY4NiAgICwgRU1TX05PTkUsICJBTlRFTk5BQ1VNUk9VVElOR1BMVVNDVVQgaXMgYSB2ZXJzaW9uIDUuNyBvciBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7MTY4NyAgICwgRU1TX05PTkUsICJBTlRFTk5BR0FURVBMVVNESUZGIGlzIGEgdmVyc2lvbiA1Ljcgb3IgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezE2ODggICAsIEVNU19OT05FLCAiQU5URU5OQUFSRUFNSU5VU0RJRkYgaXMgYSB2ZXJzaW9uIDUuNyBvciBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7MTY4OSAgICwgRU1TX05PTkUsICJBTlRFTk5BQVJFQURJRkZSRURVQ0VQV0wgaXMgYSB2ZXJzaW9uIDUuNyBvciBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7MTY5MCAgICwgRU1TX05PTkUsICJFWENFUFRFWFRSQUNVVCBpcyBhIHZlcnNpb24gNS43IG9yIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNjkxICAgLCBFTVNfTk9ORSwgIkxFTkdUSCBpcyBhIHZlcnNpb24gNS43IG9yIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNjkzICAgLCBFTVNfTk9ORSwgIkFSRUEgaXMgYSB2ZXJzaW9uIDUuNyBvciBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7MTY5NCAgICwgRU1TX05PTkUsICJTUEFDSU5HVEFCTEUgT1JUSE9HT05BTCBpcyBhIHZlcnNpb24gNS43IG9yIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNjk2ICAgLCBFTVNfTk9ORSwgIkVORE9GTk9UQ0hXSURUSCBpcyBhIHZlcnNpb24gNS43IG9yIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNjk3ICAgLCBFTVNfTk9ORSwgIlRXT1dJRFRIUyBpcyBhIHZlcnNpb24gNS43IG9yIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNjk4ICAgLCBFTVNfTk9ORSwgIkJVTVAgaXMgYSB2ZXJzaW9uIDUuNyBvciBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIC0xLCAwfSwKLSAgICB7MTY5OSAgICwgRU1TX05PTkUsICJFWENFUFRQR05FVCBpcyBhIHZlcnNpb24gNS43IG9yIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNzAwICAgLCBFTVNfTk9ORSwgIk1JTklNVU1DVVQgV0lUSElOIGlzIGEgdmVyc2lvbiA1Ljcgb3IgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezE3MDEgICAsIEVNU19OT05FLCAiQSBMQVlFUiBzdGF0ZW1lbnQgaXMgbWlzc2luZyBpbiBHZW9tZXRyeS5cbkxBWUVSIGlzIGEgcmVxdWlyZWQgc3RhdGVtZW50IGJlZm9yZSBhbnkgZ2VvbWV0cnkgY2FuIGJlIGRlZmluZWQuIiwgLTEsIDB9LAotICAgIHsxNzAyICAgLCBFTVNfTk9ORSwgIkNVUlJFTlRERU4gc3RhdGVtZW50IGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iLCAtMSwgMH0sCi0gICAgezE3MDMgICAsIEVNU19OT05FLCAiQU5URU5OQURJRkZBUkVBUkFUSU8gc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNzA0ICAgLCBFTVNfTk9ORSwgIkFOVEVOTkFESUZGQVJFQVJBVElPIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IG9yIGVhcmxpZXIgb2xkIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgd2l0aCB2ZXJzaW9uICVnLCBoYXMgYm90aCBvbGQgYW5kIG5ldyBBTlRFTk5BRElGRkFSRUFSQVRJTyBzeW50YXgsIHdoaWNoIGlzIGluY29ycmVjdC4iLCAtMSwgMH0sCi0gICAgezE3MDUgICAsIEVNU19OT05FLCAiVklBUlVMRSBzdGF0ZW1lbnQgaW4gYSBsYXllciwgcmVxdWlyZXMgYSBESVJFQ1RJT04gY29uc3RydWN0IHN0YXRlbWVudC4iLCAtMSwgMH0sCi0gICAgezE3MDYgICAsIEVNU19OT05FLCAiQW4gRU5DTE9TVVJFIHN0YXRlbWVudCB3YXMgYWxyZWFkeSBkZWZpbmVkIGluIHRoZSBsYXllci5cbkl0IGlzIERJUkVDVElPTiBvciBFTkNMT1NVUkUgY2FuIGJlIHNwZWNpZmllZCBpbiBhIGxheWVyLiIsIC0xLCAwfSwKLSAgICB7MTcwNyAgICwgRU1TX05PTkUsICJFTkNMT1NVUkUgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjUgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNzA4ICAgLCBFTVNfTk9ORSwgIkEgVklBUlVMRSBHRU5FUkFURSByZXF1aXJlcyB0aHJlZSBsYXllcnMuIiwgLTEsIDB9LAotICAgIHsxNzA5ICAgLCBFTVNfTk9ORSwgIlZJQVJVTEUgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjYgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNzEwICAgLCBFTVNfTk9ORSwgIk1BWEVER0VTIGlzIGEgdmVyc2lvbiA1Ljcgb3IgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCAtMSwgMH0sCi0gICAgezE3MTEgICAsIEVNU19OT05FLCAiTk9TSEFSRURFREdFIGluIExBWUVSIEVOQ0xPU1VSRSBpcyBhIHZlcnNpb24gNS44IG9yIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgLTEsIDB9LAotICAgIHsxNzEyICAgLCBFTVNfTk9ORSwgIk1JTkZFQVRVUkUgc3RhdGVtZW50IHdhcyBkZWZpbmVkIGJlZm9yZSBVTklUUy5cblJlZmVyIHRoZSBMRUYgTGFuZ3VhZ2UgUmVmZXJlbmNlIG1hbnVhbCBmb3IgdGhlIG9yZGVyIG9mIExFRiBzdGF0ZW1lbnRzLiIsIC0xLCAwfSwKLSAgICB7MjAwMCAgICwgRU1TX05PTkUsICJTdHJpbmcgaGFzIGV4Y2VlZGVkIDQwOTYgY2hhcmFjdGVycywgZXh0cmEgY2hhcmFjdGVycyBhcmUgdHJ1bmNhdGVkLiIsIC0xLCAwfSwKLSAgICB7MjAwMSAgICwgRU1TX05PTkUsICJWRVJTSU9OIGlzIGEgcmVxdWlyZWQgc3RhdGVtZW50IG9uIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjUgYW5kIGVhcmxpZXIuXG5XaXRob3V0IFZFUlNJT04gZGVmaW5lZCwgdGhlIExFRiBmaWxlIGlzIHRlY2huaWNhbGx5IGluY29ycmVjdC5cblJlZmVyIHRvIHRoZSBMRUYvREVGIDUuNSBvciBlYXJsaWVyIExhbmd1YWdlIFJlZmVyZW5jZSBtYW51YWwgb24gaG93IHRvIGRlZmluZWQgdGhpcyBzdGF0ZW1lbnQuIiwgLTEsIDB9LAotICAgIHsyMDAyICAgLCBFTVNfTk9ORSwgIk5BTUVTQ0FTRVNFTlNJVElWRSBpcyBhIHJlcXVpcmVkIHN0YXRlbWVudCBvbiBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS41IGFuZCBlYXJsaWVyLlxuV2l0aG91dCBOQU1FU0NBU0VTRU5TSVRJVkUgZGVmaW5lZCwgdGhlIExFRiBmaWxlIGlzIHRlY2huaWNhbGx5IGluY29ycmVjdC5cblJlZmVyIHRvIHRoZSBMRUYvREVGIDUuNSBvciBlYXJsaWVyIExhbmd1YWdlIFJlZmVyZW5jZSBtYW51YWwgb24gaG93IHRvIGRlZmluZSB0aGlzIHN0YXRlbWVudC4iLCAtMSwgMH0sCi0gICAgezIwMDMgICAsIEVNU19OT05FLCAiQlVTQklUQ0hBUlMgaXMgYSByZXF1aXJlZCBzdGF0ZW1lbnQgb24gTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNSBhbmQgZWFybGllci5cbldpdGhvdXQgQlVTQklUQ0hBUlMgZGVmaW5lZCwgdGhlIExFRiBmaWxlIGlzIHRlY2huaWNhbGx5IGluY29ycmVjdC5cblJlZmVyIHRvIHRoZSBMRUYvREVGIDUuNSBvciBlYXJsaWVyIExhbmd1YWdlIFJlZmVyZW5jZSBtYW51YWwgb24gaG93IHRvIGRlZmluZSB0aGlzIHN0YXRlbWVudC4iLCAtMSwgMH0sCi0gICAgezIwMDQgICAsIEVNU19OT05FLCAiRElWSURFUkNIQVIgaXMgYSByZXF1aXJlZCBzdGF0ZW1lbnQgb24gTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNSBhbmQgZWFybGllci5cbldpdGhvdXQgRElWSURFQ0hBUiBkZWZpbmVkLCB0aGUgTEVGIGZpbGUgaXMgdGVjaG5pY2FsbHkgaW5jb3JyZWN0LlxuUmVmZXIgdG8gdGhlIExFRi9ERUYgNS41IG9yIGVhcmxpZXIgTGFuZ3VhZ2UgUmVmZXJlbmNlIG1hbnVhbCBvbiBob3cgdG8gZGVmaW5lIHRoaXMgc3RhdGVtZW50LiIsIC0xLCAwfSwKLSAgICB7MjAwNSAgICwgRU1TX05PTkUsICJESVZJREVSQ0hBUiBoYXMgYW4gaW52YWxpZCBudWxsIHZhbHVlLiBWYWx1ZSBpcyBzZXQgdG8gZGVmYXVsdCAvIiwgLTEsIDB9LAotICAgIHsyMDA2ICAgLCBFTVNfTk9ORSwgIkJVU0JJVENIQVIgaGFzIGFuIGludmFsaWQgbnVsbCB2YWx1ZS4gVmFsdWUgaXMgc2V0IHRvIGRlZmF1bHQgW10iLCAtMSwgMH0sCi0gICAgezIwMDcgICAsIEVNU19OT05FLCAiTkFNRVNDQVNFU0VOU0lUSVZFIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNiBvciBsYXRlci4iLCAtMSwgMH0sCi0gICAgezIwMDggICAsIEVNU19OT05FLCAiTk9XSVJFRVhURU5TSU9OQVRQSU4gc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS42IG9yIGxhdGVyLlxuVGhlIE5PV0lSRUVYVEVOU0lPTkFUUElOIHN0YXRlbWVudCB3aWxsIGJlIGlnbm9yZWQuIiwgLTEsIDB9LAotICAgIHsyMDA5ICAgLCBFTVNfTk9ORSwgIlVTRU1JTlNQQUNJTkcgUElOIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNiBvciBsYXRlci5cbiBUaGUgVVNFTUlOU1BBQ0lORyBQSU4gc3RhdGVtZW50IHdpbGwgYmUgaWdub3JlZC4iLCAtMSwgMH0sCi0gICAgezIwMTAgICAsIEVNU19OT05FLCAiSXQgaXMgaW5jb3JyZWN0IHRvIGhhdmUgYm90aCBTUEFDSU5HIHJ1bGVzICYgU1BBQ0lOR1RBQkxFIHJ1bGVzIHdpdGhpbiBhIFJPVVRJTkcgbGF5ZXIuIiwgLTEsIDB9LAotICAgIHsyMDExICAgLCBFTVNfTk9ORSwgIlNMT1RXSVJFV0lEVEggc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS43IG9yIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1Ljcgb3IgbGF0ZXIuIiwgLTEsIDB9LAotICAgIHsyMDEyICAgLCBFTVNfTk9ORSwgIlNMT1RXSVJFTEVOR1RIIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNyBvciBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS43IG9yIGxhdGVyLiIsIC0xLCAwfSwKLSAgICB7MjAxMyAgICwgRU1TX05PTkUsICJTTE9UV0lEVEggc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS43IG9yIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1Ljcgb3IgbGF0ZXIuIiwgLTEsIDB9LAotICAgIHsyMDE0ICAgLCBFTVNfTk9ORSwgIlNMT1RMRU5HVEggc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS43IG9yIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1Ljcgb3IgbGF0ZXIuIiwgLTEsIDB9LAotICAgIHsyMDE1ICAgLCBFTVNfTk9ORSwgIk1BWEFESkFDRU5UU0xPVFNQQUNJTkcgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS43IG9yIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1Ljcgb3IgbGF0ZXIuIiwgLTEsIDB9LAotICAgIHsyMDE2ICAgLCBFTVNfTk9ORSwgIk1BWENPQVhJQUxTTE9UU1BBQ0lORyBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1Ljcgb3IgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNyBvciBsYXRlci4iLCAtMSwgMH0sCi0gICAgezIwMTcgICAsIEVNU19OT05FLCAiTUFYRURHRVNMT1RTUEFDSU5HIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNyBvciBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS43IG9yIGxhdGVyLiIsIC0xLCAwfSwKLSAgICB7MjAxOCAgICwgRU1TX05PTkUsICJTUExJVFdJUkVXSURUSCBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1Ljcgb3IgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNyBvciBsYXRlci4iLCAtMSwgMH0sCi0gICAgezIwMTkgICAsIEVNU19OT05FLCAiVE9QT0ZTVEFDS09OTFkgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS42IG9yIGxhdGVyLiIsIC0xLCAwfSwKLSAgICB7MjAyMCAgICwgRU1TX05PTkUsICJGT1JFSUdOIHN0YXRlbWVudCBpbiBWSUEgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjYgb3IgbGF0ZXIuIiwgLTEsIDB9LAotICAgIHsyMDIxICAgLCBFTVNfTk9ORSwgInR1cm4tdmlhIGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cbiBUaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNiBvciBsYXRlci4iLCAtMSwgMH0sCi0gICAgezIwMjIgICAsIEVNU19OT05FLCAiRElSRUNUSU9OIHN0YXRlbWVudCBpbiBWSUFSVUxFIGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS42IG9yIGxhdGVyLiIsIC0xLCAwfSwKLSAgICB7MjAyMyAgICwgRU1TX05PTkUsICJPVkVSSEFORyBzdGF0ZW1lbnQgd2lsbCBiZSB0cmFuc2xhdGVkIGludG8gc2ltaWxhciBFTkNMT1NVUkUgcnVsZSIsIC0xLCAwfSwKLSAgICB7MjAyNCAgICwgRU1TX05PTkUsICJNRVRBTE9WRVJIQU5HIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNiBvciBsYXRlci4iLCAtMSwgMH0sCi0gICAgezIwMjUgICAsIEVNU19OT05FLCAiU0FNRU5FVCBzdGF0ZW1lbnQgaW4gTk9OREVGQVVMVFJVTEUgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjYgb3IgbGF0ZXIuIiwgLTEsIDB9LAotICAgIHsyMDI2ICAgLCBFTVNfTk9ORSwgIklSRFJPUCBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIiwgLTEsIDB9LAotICAgIHsyMDI3ICAgLCBFTVNfTk9ORSwgIk1JTkZFQVRVUkUgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS40IG9yIGxhdGVyLiIsIC0xLCAwfSwKLSAgICB7MjAyOCAgICwgRU1TX05PTkUsICJESUVMRUNUUklDIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iLCAtMSwgMH0sCi0gICAgezIwMjkgICAsIEVNU19OT05FLCAiUkVTSVNUQU5DRSBSUEVSU1Egc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS42IG9yIGxhdGVyLiIsIC0xLCAwfSwKLSAgICB7MjAzMCAgICwgRU1TX05PTkUsICJDQVBBQ0lUQU5DRSBDUEVSU1FESVNUIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNiBvciBsYXRlci4iLCAtMSwgMH0sCi0gICAgezIwMzEgICAsIEVNU19OT05FLCAiRURHRUNBUEFDSVRBTkNFIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNiBvciBsYXRlci4iLCAtMSwgMH0sCi0gICAgezIwMzIgICAsIEVNU19OT05FLCAiQSBTSVRFIHN0YXRlbWVudCBpcyBkZWZpbmVkIGJlZm9yZSBTWU1NRVRSWSBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgZGVmaW5lIFNJVEUgYWZ0ZXIgU1lNTUVUUlkuIiwgLTEsIDB9LAotICAgIHsyMDMzICAgLCBFTVNfTk9ORSwgIlRoZSBzdGF0ZW1lbnQgQ09WRVIgQlVNUCBpcyBhIExFRiB2ZXJzaW9uIDUuNSBzeW50YXguXG5Zb3VyIExFRiBmaWxlIGlzIHZlcnNpb24gNS40IG9yIGVhcmxpZXIgd2hpY2ggaXMgaW5jb3JyZWN0IGJ1dCB3aWxsIGJlIGFsbG93ZWRcbmJlY2F1c2UgdGhpcyBhcHBsaWNhdGlvbiBkb2VzIG5vdCBlbmZvcmNlIHN0cmljdCB2ZXJzaW9uIGNoZWNraW5nLlxuT3RoZXIgdG9vbHMgdGhhdCBlbmZvcmNlIHN0cmljdCBjaGVja2luZyB3aWxsIGhhdmUgYSBzeW50YXggZXJyb3Igd2hlbiByZWFkaW5nIHRoaXMgZmlsZS5cbllvdSBjYW4gY2hhbmdlIHRoZSBWRVJTSU9OIHN0YXRlbWVudCBpbiB0aGlzIExFRiBmaWxlIHRvIDUuNSBvciBoaWdoZXIgdG8gc3RvcCB0aGlzIHdhcm5pbmcuIiwgLTEsIDB9LAotICAgIHsyMDM0ICAgLCBFTVNfTk9ORSwgIlRoZSBzdGF0ZW1lbnQgQkxPQ0sgQkxBQ0tCT1ggaXMgYSBMRUYgdmVyaW9uIDUuNSBzeW50YXguXG5Zb3VyIExFRiBmaWxlIGlzIHZlcnNpb24gNS40IG9yIGVhcmxpZXIgd2hpY2ggaXMgaW5jb3JyZWN0IGJ1dCB3aWxsIGJlIGFsbG93ZWRcbmJlY2F1c2UgdGhpcyBhcHBsaWNhdGlvbiBkb2VzIG5vdCBlbmZvcmNlIHN0cmljdCB2ZXJzaW9uIGNoZWNraW5nLlxuT3RoZXIgdG9vbHMgdGhhdCBlbmZvcmNlIHN0cmljdCBjaGVja2luZyB3aWxsIGhhdmUgYSBzeW50YXggZXJyb3Igd2hlbiByZWFkaW5nIHRoaXMgZmlsZS5cbllvdSBjYW4gY2hhbmdlIHRoZSBWRVJTSU9OIHN0YXRlbWVudCBpbiB0aGlzIExFRiBmaWxlIHRvIDUuNSBvciBoaWdoZXIgdG8gc3RvcCB0aGlzIHdhcm5pbmcuIiwgLTEsIDB9LAotICAgIHsyMDM1ICAgLCBFTVNfTk9ORSwgIlRoZSBzdGF0ZW1lbnQgUEFEIEFSRUFJTyBpcyBhIExFRiB2ZXJpb24gNS41IHN5bnRheC5cbllvdXIgTEVGIGZpbGUgaXMgdmVyc2lvbiA1LjQgb3IgZWFybGllciB3aGljaCBpcyBpbmNvcnJlY3QgYnV0IHdpbGwgYmUgYWxsb3dlZFxuYmVjYXVzZSB0aGlzIGFwcGxpY2F0aW9uIGRvZXMgbm90IGVuZm9yY2Ugc3RyaWN0IHZlcnNpb24gY2hlY2tpbmcuXG5PdGhlciB0b29scyB0aGF0IGVuZm9yY2Ugc3RyaWN0IGNoZWNraW5nIHdpbGwgaGF2ZSBhIHN5bnRheCBlcnJvciB3aGVuIHJlYWRpbmcgdGhpcyBmaWxlLlxuWW91IGNhbiBjaGFuZ2UgdGhlIFZFUlNJT04gc3RhdGVtZW50IGluIHRoaXMgTEVGIGZpbGUgdG8gNS41IG9yIGhpZ2hlciB0byBzdG9wIHRoaXMgd2FybmluZy4iLCAtMSwgMH0sCi0gICAgezIwMzYgICAsIEVNU19OT05FLCAiU09VUkNFIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNiBvciBsYXRlci4iLCAtMSwgMH0sCi0gICAgezIwMzcgICAsIEVNU19OT05FLCAiU09VUkNFIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNiBvciBsYXRlci4iLCAtMSwgMH0sCi0gICAgezIwMzggICAsIEVNU19OT05FLCAiTUFDUk8gUE9XRVIgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS40IG9yIGxhdGVyLiIsIC0xLCAwfSwKLSAgICB7MjAzOSAgICwgRU1TX05PTkUsICJBIFNJVEUgc3RhdGVtZW50IGlzIGRlZmluZWQgYmVmb3JlIE9SSUdJTiBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgZGVmaW5lIFNJVEUgYWZ0ZXIgT1JJR0lOLiIsIC0xLCAwfSwKLSAgICB7MjA0MCAgICwgRU1TX05PTkUsICJBIFBJTiBzdGF0ZW1lbnQgaXMgZGVmaW5lZCBiZWZvcmUgT1JJR0lOIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCBkZWZpbmUgUElOIGFmdGVyIE9SSUdJTi4iLCAtMSwgMH0sCi0gICAgezIwNDEgICAsIEVNU19OT05FLCAiQSBPQlMgc3RhdGVtZW50IGlzIGRlZmluZWQgYmVmb3JlIE9SSUdJTiBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgZGVmaW5lIE9CUyBhZnRlciBPUklHSU4uIiwgLTEsIDB9LAotICAgIHsyMDQyICAgLCBFTVNfTk9ORSwgIkxFUSBzdGF0ZW1lbnQgaW4gTUFDUk8gaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjYgb3IgbGF0ZXIuIiwgLTEsIDB9LAotICAgIHsyMDQzICAgLCBFTVNfTk9ORSwgIkZPUkVJR04gc3RhdGVtZW50IGluIE1BQ1JPIFBJTiBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNiBvciBsYXRlci4iLCAtMSwgMH0sCi0gICAgezIwNDQgICAsIEVNU19OT05FLCAiTEVRIHN0YXRlbWVudCBpbiBNQUNSTyBQSU4gaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjYgb3IgbGF0ZXIuIiwgLTEsIDB9LAotICAgIHsyMDQ1ICAgLCBFTVNfTk9ORSwgIk1BQ1JPIFBPV0VSIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iLCAtMSwgMH0sCi0gICAgezIwNDYgICAsIEVNU19OT05FLCAiTUFDUk8gTEVBS0FHRSBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIiwgLTEsIDB9LAotICAgIHsyMDQ3ICAgLCBFTVNfTk9ORSwgIk1BQ1JPIFJJU0VUSFJFU0ggc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS40IG9yIGxhdGVyLiIsIC0xLCAwfSwKLSAgICB7MjA0OCAgICwgRU1TX05PTkUsICJNQUNSTyBGQUxMVEhSRVNIIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iLCAtMSwgMH0sCi0gICAgezIwNDkgICAsIEVNU19OT05FLCAiTUFDUk8gUklTRVNBVENVUiBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIiwgLTEsIDB9LAotICAgIHsyMDUwICAgLCBFTVNfTk9ORSwgIk1BQ1JPIEZBTExTQVRDVVIgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS40IG9yIGxhdGVyLiIsIC0xLCAwfSwKLSAgICB7MjA1MSAgICwgRU1TX05PTkUsICJNQUNSTyBWTE8gc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS40IG9yIGxhdGVyLiIsIC0xLCAwfSwKLSAgICB7MjA1MiAgICwgRU1TX05PTkUsICJNQUNSTyBWSEkgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS40IG9yIGxhdGVyLiIsIC0xLCAwfSwKLSAgICB7MjA1MyAgICwgRU1TX05PTkUsICJNQUNSTyBUSUVPRkZSIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iLCAtMSwgMH0sCi0gICAgezIwNTQgICAsIEVNU19OT05FLCAiTUFDUk8gT1VUUFVUTk9JU0VNQVJHSU4gc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS40IG9yIGxhdGVyLiIsIC0xLCAwfSwKLSAgICB7MjA1NSAgICwgRU1TX05PTkUsICJNQUNSTyBPVVRQVVRSRVNJU1RBTkNFIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iLCAtMSwgMH0sCi0gICAgezIwNTYgICAsIEVNU19OT05FLCAiTUFDUk8gSU5QVVROT0lTRU1BUkdJTiBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIiwgLTEsIDB9LAotICAgIHsyMDU3ICAgLCBFTVNfTk9ORSwgIk1BQ1JPIENBUEFDSVRBTkNFIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iLCAtMSwgMH0sCi0gICAgezIwNTggICAsIEVNU19OT05FLCAiTUFDUk8gUkVTSVNUQU5DRSBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIiwgLTEsIDB9LAotICAgIHsyMDU5ICAgLCBFTVNfTk9ORSwgIk1BQ1JPIFBVTExET1dOUkVTIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iLCAtMSwgMH0sCi0gICAgezIwNjAgICAsIEVNU19OT05FLCAiTUFDUk8gQ1VSUkVOVFNPVVJDRSBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIiwgLTEsIDB9LAotICAgIHsyMDYxICAgLCBFTVNfTk9ORSwgIk1BQ1JPIENVUlJFTlRTT1VSQ0Ugc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS40IG9yIGxhdGVyLiIsIC0xLCAwfSwKLSAgICB7MjA2MiAgICwgRU1TX05PTkUsICJNQUNSTyBSSVNFVk9MVEFHRVRIUkVTSE9MRCBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIiwgLTEsIDB9LAotICAgIHsyMDYzICAgLCBFTVNfTk9ORSwgIk1BQ1JPIEZBTExWT0xUQUdFVEhSRVNIT0xEIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iLCAtMSwgMH0sCi0gICAgezIwNjQgICAsIEVNU19OT05FLCAiTUFDUk8gSVZfVEFCTEVTIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iLCAtMSwgMH0sCi0gICAgezIwNjUgICAsIEVNU19OT05FLCAiRWl0aGVyIFBBVEgsIFJFQ1Qgb3IgUE9MWUdPTiBzdGF0ZW1lbnQgaXMgYSByZXF1aXJlZCBpbiBNQUNSTy9QSU4vUE9SVC4iLCAtMSwgMH0sCi0gICAgezIwNjYgICAsIEVNU19OT05FLCAiTUFDUk8gVElNSU5HIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iLCAtMSwgMH0sCi0gICAgezIwNjcgICAsIEVNU19OT05FLCAiREVGSU5FIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNiBvciBsYXRlci4iLCAtMSwgMH0sCi0gICAgezIwNjggICAsIEVNU19OT05FLCAiREVGSU5FUyBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjYgb3IgbGF0ZXIuIiwgLTEsIDB9LAotICAgIHsyMDY5ICAgLCBFTVNfTk9ORSwgIkRFRklORUIgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS42IG9yIGxhdGVyLiIsIC0xLCAwfSwKLSAgICB7MjA3MCAgICwgRU1TX05PTkUsICJVTklWRVJTQUxOT0lTRU1BUkdJTiBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIiwgLTEsIDB9LAotICAgIHsyMDcxICAgLCBFTVNfTk9ORSwgIkVER0VSQVRFVEhSRVNIT0xEMSBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIiwgLTEsIDB9LAotICAgIHsyMDcyICAgLCBFTVNfTk9ORSwgIkVER0VSQVRFVEhSRVNIT0xEMiBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIiwgLTEsIDB9LAotICAgIHsyMDczICAgLCBFTVNfTk9ORSwgIkVER0VSQVRFU0NBTEVGQUNUT1Igc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS40IG9yIGxhdGVyLiIsIC0xLCAwfSwKLSAgICB7MjA3NCAgICwgRU1TX05PTkUsICJOT0lTRVRBQkxFIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iLCAtMSwgMH0sCi0gICAgezIwNzUgICAsIEVNU19OT05FLCAiQ09SUkVDVElPTlRBQkxFIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iLCAtMSwgMH0sCi0gICAgezIwNzYgICAsIEVNU19OT05FLCAiRWl0aGVyIFBBVEgsIFJFQ1Qgb3IgUE9MWUdPTiBzdGF0ZW1lbnQgaXMgcmVxdWlyZWQgaW4gTUFDUk8vT0JTLiIsIC0xLCAwfSwKLSAgICB7MjA3NyAgICwgRU1TX05PTkUsICJBIFNQQUNJTkcgU0FNRU5FVCBzZWN0aW9uIGlzIGRlZmluZWQgYnV0IGl0IGlzIG5vdCBsZWdhbCBpbiBhIExFRiA1LjcgdmVyc2lvbiBmaWxlLlxuSXQgd2lsbCBiZSBpZ25vcmVkIHdoaWNoIHdpbGwgcHJvYmFibHkgY2F1c2UgcmVhbCBEUkMgdmlvbGF0aW9ucyB0byBiZSBpZ25vcmVkLCBhbmQgbWF5XG5jYXVzZSBmYWxzZSBEUkMgdmlvbGF0aW9ucyB0byBvY2N1ci5cblxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nLCBhbmQgY29ycmVjdGx5IGhhbmRsZSB0aGVzZSBEUkMgcnVsZXMsIHlvdSBzaG91bGQgbW9kaWZ5IHlvdXJcbkxFRiB0byB1c2UgdGhlIGFwcHJvcHJpYXRlIFNBTUVORVQga2V5d29yZHMgYXMgZGVzY3JpYmVkIGluIHRoZSBMRUYvREVGIDUuN1xubWFudWFsIHVuZGVyIHRoZSBTUEFDSU5HIHN0YXRlbWVudHMgaW4gdGhlIExBWUVSIChSb3V0aW5nKSBhbmQgTEFZRVIgKEN1dClcbnNlY3Rpb25zIGxpc3RlZCBpbiB0aGUgTEVGIFRhYmxlIG9mIENvbnRlbnRzLiIsIC0xLCAwfSwKLSAgICB7MjA3OCAgICwgRU1TX05PTkUsICJJdCBpcyBpbGxlZ2FsIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBTUEFDSU5HVEFCTEUgcnVsZXMgd2l0aGluIGEgUk9VVElORyBsYXllciIsIC0xLCAwfSwKLSAgICB7MjA3OSAgICwgRU1TX05PTkUsICJDVVJSRU5UREVOIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuMiBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuMiBvciBsYXRlci4iLCAtMSwgMH0sCi0gICAgezIwODAgICAsIEVNU19OT05FLCAiVGhlIG51bWJlciBvZiBjdXQgdmFsdWVzIGluIG11bHRpcGxlIEFSUkFZU1BBQ0lORyBBUlJBWUNVVFMgYXJlIG5vdCBpbiBpbmNyZWFzaW5nIG9yZGVyLlxuVG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSBkb2N1bWVudGF0aW9uLCB1cGRhdGUgdGhlIGN1dCB2YWx1ZXMgdG8gaW5jcmVhc2luZyBvcmRlci4iLCAtMSwgMH0sCi0gICAgezI1MDIgICAsIEVNU19OT05FLCAiTWVzc2FnZSAlcyBoYXMgYmVlbiBzdXBwcmVzc2VkIGZyb20gb3V0cHV0IiwgLTEsIDB9LAotICAgIHsyNTAzICAgLCBFTVNfTk9ORSwgIk1lc3NhZ2UgJXMgaGFzIGV4Y2VlZGVkIHRoZSBtZXNzYWdlIGRpc3BsYXkgbGltaXQgb2YgJWQuIiwgLTEsIDB9LAotICAgIHszMDAwICAgLCBFTVNfTk9ORSwgIlRoZXJlIGFyZSBzdGlsbCBkYXRhIGFmdGVyIHRoZSBFTkQgTElCUkFSWSIsIC0xLCAwfSwKLSAgICB7NDAwMCAgICwgRU1TX05PTkUsICJsZWZ3SW5pdENiayB3YXMgYWxyZWFkeSBjYWxsZWQsIGNhbm5vdCBjYWxsIGxlZndJbml0IGFnYWluLlxuV3JpdGVyIEV4aXQuXG4iLCAtMSwgMH0sCi0gICAgezQwMDEgICAsIEVNU19OT05FLCAibGVmd0luaXQgd2FzIGFscmVhZHkgY2FsbGVkLCBjYW5ub3QgY2FsbCBsZWZ3SW5pdENiayBhZ2Fpbi5cbldyaXRlciBFeGl0LlxuIiwgLTEsIDB9LAotICAgIHs0MDAyICAgLCBFTVNfTk9ORSwgImxlZndJbml0IHdhcyBhbHJlYWR5IGNhbGxlZCwgY2Fubm90IGNhbGwgbGVmd0luaXRDYmsgYWdhaW4uXG5Xcml0ZXIgRXhpdC5cbiIsIC0xLCAwfSwKLSAgICB7NDAwMyAgICwgRU1TX05PTkUsICJsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ1VzZUxlbmd0aFRocmVzaG9sZCBjYW5ub3QgYmUgY2FsbGVkIGlmXG5cdGxlZndMYXllclJvdXRpbmdTcGFjaW5nUmFuZ2UgaGFzIG5vdCBiZWVuIGNhbGxlZC5cbiIsIC0xLCAwfSwKLSAgICB7NDAwNCAgICwgRU1TX05PTkUsICJsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ0luZmx1ZW5jZSBjYW5ub3QgYmUgY2FsbGVkIGlmXG5cdGxlZlJhbmdlIGFuZCByaWdodFJhbmdlIGluIGxlZndMYXllclJvdXRpbmdTcGFjaW5nIGFyZSBib3RoIHplcm8uXG4iLCAtMSwgMH0sCi0gICAgezQwMDUgICAsIEVNU19OT05FLCAibGVmd0xheWVyUm91dGluZ1NwYWNpbmdJbmZsdWVuY2UgY2Fubm90IGJlIGNhbGxlZCBpZlxuXHRsZWZSYW5nZSBhbmQgcmlnaHRSYW5nZSBpbiBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZyBhcmUgYm90aCB6ZXJvLiIsIC0xLCAwfSwKLSAgICB7NDAwNiAgICwgRU1TX05PTkUsICJOZWVkIGFuIG91dHB1dCBmaWxlIGlmIHdyaXRpbmcgaW4gZW5jcnlwdGVkIGZvcm1hdC5cbiIsIC0xLCAwfSwKLSAgICB7NDEwMCAgICwgRU1TX05PTkUsICJsZWZ3V3JpdGUgY2FsbGVkIGJlZm9yZSBsZWZ3SW5pdENiay5cbiIsIC0xLCAwfSwKLSAgICB7NDEwMSAgICwgRU1TX05PTkUsICJsZWZ3U2V0UmVnaXN0ZXJVbnVzZWRDYWxsYmFja3Mgd2FzIG5vdCBjYWxsZWQgdG8gc2V0dXAgdGhpcyBkYXRhLlxuIiwgLTEsIDB9LAotICAgIHs0NTAwICAgLCBFTVNfTk9ORSwgIkNhbGxiYWNrIGZvciAlcyBpcyByZXF1aXJlZCwgYnV0IGlzIG5vdCBkZWZpbmVkLlxuXG4iLCAtMSwgMH0sCi0gICAgezQ3MDAgICAsIEVNU19OT05FLCAiTEVGIGl0ZW1zIHRoYXQgd2VyZSBwcmVzZW50IGJ1dCBpZ25vcmVkIGJlY2F1c2Ugb2Ygbm8gY2FsbGJhY2tzIHdlcmUgc2V0LlxuIiwgLTEsIDB9LAotICAgIHstMSAgICAgLCBFTVNfTk9ORSwgIiIsIC0xLCAwfQotfTsKLQotLyoKLSAqIEVuZCBtYWNoaW5lIGdlbmVyYXRlZCB0YWJsZS4KLSovCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi9sZWZpQXJyYXkuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL2xlZmlBcnJheS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzU0ZDAxLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL2xlZmlBcnJheS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBBVFRFTlRJT046IFRISVMgSVMgQU4gQVVUTy1HRU5FUkFURUQgRklMRS4gRE8gTk9UIENIQU5HRSBJVCEgICAgICAgICAgICAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBDb3B5cmlnaHQgMjAxMiAtIDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlICAgICAgICAgICAgICovCi0vKiBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAgICAgICAgICAgICovCi0vKiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICAgICAgICAqLwotLyogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICovCi0vKiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAgICAgICAqLwotLyogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgICAgKi8KLS8qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgICAgICovCi0vKiAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksICAgICAgICAgICovCi0vKiBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkQXV0aG9yOiBkZWxsICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRSZXZpc2lvbjogIzEgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICREYXRlOiAyMDE3LzA2LzA2ICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJFN0YXRlOiAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLQotI2lmbmRlZiBDTEVGSUFSUkFZX0gKLSNkZWZpbmUgQ0xFRklBUlJBWV9ICi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImxlZmlUeXBlZGVmcy5oIgotCi1FWFRFUk4gaW50IGxlZmlBcnJheUZsb29yUGxhbl9udW1QYXR0ZXJucyAoY29uc3QgbGVmaUFycmF5Rmxvb3JQbGFuKiBvYmopOwotRVhURVJOIGNvbnN0IGxlZmlTaXRlUGF0dGVybiogbGVmaUFycmF5Rmxvb3JQbGFuX3BhdHRlcm4gKGNvbnN0IGxlZmlBcnJheUZsb29yUGxhbiogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBjaGFyKiBsZWZpQXJyYXlGbG9vclBsYW5fdHlwIChjb25zdCBsZWZpQXJyYXlGbG9vclBsYW4qIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY29uc3QgY2hhciogbGVmaUFycmF5Rmxvb3JQbGFuX25hbWUgKGNvbnN0IGxlZmlBcnJheUZsb29yUGxhbiogb2JqKTsKLQotRVhURVJOIGludCBsZWZpQXJyYXlfbnVtU2l0ZVBhdHRlcm4gKGNvbnN0IGxlZmlBcnJheSogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaUFycmF5X251bUNhblBsYWNlIChjb25zdCBsZWZpQXJyYXkqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlBcnJheV9udW1DYW5ub3RPY2N1cHkgKGNvbnN0IGxlZmlBcnJheSogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaUFycmF5X251bVRyYWNrIChjb25zdCBsZWZpQXJyYXkqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlBcnJheV9udW1HY2VsbCAoY29uc3QgbGVmaUFycmF5KiBvYmopOwotRVhURVJOIGludCBsZWZpQXJyYXlfaGFzRGVmYXVsdENhcCAoY29uc3QgbGVmaUFycmF5KiBvYmopOwotCi1FWFRFUk4gY29uc3QgY2hhciogbGVmaUFycmF5X25hbWUgKGNvbnN0IGxlZmlBcnJheSogb2JqKTsKLUVYVEVSTiBjb25zdCBsZWZpU2l0ZVBhdHRlcm4qIGxlZmlBcnJheV9zaXRlUGF0dGVybiAoY29uc3QgbGVmaUFycmF5KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGNvbnN0IGxlZmlTaXRlUGF0dGVybiogbGVmaUFycmF5X2NhblBsYWNlIChjb25zdCBsZWZpQXJyYXkqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY29uc3QgbGVmaVNpdGVQYXR0ZXJuKiBsZWZpQXJyYXlfY2Fubm90T2NjdXB5IChjb25zdCBsZWZpQXJyYXkqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY29uc3QgbGVmaVRyYWNrUGF0dGVybiogbGVmaUFycmF5X3RyYWNrIChjb25zdCBsZWZpQXJyYXkqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY29uc3QgbGVmaUdjZWxsUGF0dGVybiogbGVmaUFycmF5X2djZWxsIChjb25zdCBsZWZpQXJyYXkqIG9iaiwgaW50ICBpbmRleCk7Ci0KLUVYVEVSTiBpbnQgbGVmaUFycmF5X3RhYmxlU2l6ZSAoY29uc3QgbGVmaUFycmF5KiBvYmopOwotRVhURVJOIGludCBsZWZpQXJyYXlfbnVtRGVmYXVsdENhcHMgKGNvbnN0IGxlZmlBcnJheSogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaUFycmF5X2RlZmF1bHRDYXBNaW5QaW5zIChjb25zdCBsZWZpQXJyYXkqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGxlZmlBcnJheV9kZWZhdWx0Q2FwIChjb25zdCBsZWZpQXJyYXkqIG9iaiwgaW50ICBpbmRleCk7Ci0KLUVYVEVSTiBpbnQgbGVmaUFycmF5X251bUZsb29yUGxhbnMgKGNvbnN0IGxlZmlBcnJheSogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBsZWZpQXJyYXlfZmxvb3JQbGFuTmFtZSAoY29uc3QgbGVmaUFycmF5KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBsZWZpQXJyYXlfbnVtU2l0ZXMgKGNvbnN0IGxlZmlBcnJheSogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBjb25zdCBjaGFyKiBsZWZpQXJyYXlfc2l0ZVR5cGUgKGNvbnN0IGxlZmlBcnJheSogb2JqLCBpbnQgIGZsb29ySW5kZXgsIGludCAgc2l0ZUluZGV4KTsKLUVYVEVSTiBjb25zdCBsZWZpU2l0ZVBhdHRlcm4qIGxlZmlBcnJheV9zaXRlIChjb25zdCBsZWZpQXJyYXkqIG9iaiwgaW50ICBmbG9vckluZGV4LCBpbnQgIHNpdGVJbmRleCk7Ci0KLSAgLyogRGVidWcgcHJpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gdm9pZCBsZWZpQXJyYXlfcHJpbnQgKGNvbnN0IGxlZmlBcnJheSogb2JqLCBGSUxFKiAgZik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYvbGVmaUNyb3NzVGFsay5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYvbGVmaUNyb3NzVGFsay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODYzZGJhLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL2xlZmlDcm9zc1RhbGsuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQ29weXJpZ2h0IDIwMTIgLSAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZSAgICAgICAgICAgICAqLwotLyogRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAqLwotLyogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgKi8KLS8qICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAqLwotLyogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgKi8KLS8qICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgICAgICovCi0vKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgICAgICAqLwotLyogICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LCAgICAgICAgICAqLwotLyogY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJEF1dGhvcjogZGVsbCAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkUmV2aXNpb246ICMxICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkRGF0ZTogMjAxNy8wNi8wNiAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRTdGF0ZTogICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0KLSNpZm5kZWYgQ0xFRklDUk9TU1RBTEtfSAotI2RlZmluZSBDTEVGSUNST1NTVEFMS19ICi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImxlZmlUeXBlZGVmcy5oIgotCi0vKiBTdHJ1Y3R1cmUgcmV0dXJuZWQgZm9yIHRoZSBub2lzZSBtYXJnaW4gY2FsbGJhY2suICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBsZWYgY29uc3RydWN0IGhhcyB0d28gZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotRVhURVJOIGRvdWJsZSBsZWZpTm9pc2VWaWN0aW1fbGVuZ3RoIChjb25zdCBsZWZpTm9pc2VWaWN0aW0qIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlOb2lzZVZpY3RpbV9udW1Ob2lzZXMgKGNvbnN0IGxlZmlOb2lzZVZpY3RpbSogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaU5vaXNlVmljdGltX25vaXNlIChjb25zdCBsZWZpTm9pc2VWaWN0aW0qIG9iaiwgaW50ICBpbmRleCk7Ci0KLUVYVEVSTiBpbnQgbGVmaU5vaXNlUmVzaXN0YW5jZV9udW1OdW1zIChjb25zdCBsZWZpTm9pc2VSZXNpc3RhbmNlKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpTm9pc2VSZXNpc3RhbmNlX251bSAoY29uc3QgbGVmaU5vaXNlUmVzaXN0YW5jZSogb2JqLCBpbnQgIGluZGV4KTsKLQotRVhURVJOIGludCBsZWZpTm9pc2VSZXNpc3RhbmNlX251bVZpY3RpbXMgKGNvbnN0IGxlZmlOb2lzZVJlc2lzdGFuY2UqIG9iaik7Ci1FWFRFUk4gY29uc3QgbGVmaU5vaXNlVmljdGltKiBsZWZpTm9pc2VSZXNpc3RhbmNlX3ZpY3RpbSAoY29uc3QgbGVmaU5vaXNlUmVzaXN0YW5jZSogb2JqLCBpbnQgIGluZGV4KTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi9sZWZpRGVidWcuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL2xlZmlEZWJ1Zy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDc3MzM3Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL2xlZmlEZWJ1Zy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBBVFRFTlRJT046IFRISVMgSVMgQU4gQVVUTy1HRU5FUkFURUQgRklMRS4gRE8gTk9UIENIQU5HRSBJVCEgICAgICAgICAgICAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBDb3B5cmlnaHQgMjAxMiAtIDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlICAgICAgICAgICAgICovCi0vKiBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAgICAgICAgICAgICovCi0vKiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICAgICAgICAqLwotLyogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICovCi0vKiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAgICAgICAqLwotLyogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgICAgKi8KLS8qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgICAgICovCi0vKiAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksICAgICAgICAgICovCi0vKiBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkQXV0aG9yOiBkZWxsICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRSZXZpc2lvbjogIzEgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICREYXRlOiAyMDE3LzA2LzA2ICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJFN0YXRlOiAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLQotI2lmbmRlZiBDTEVGSURFQlVHX0gKLSNkZWZpbmUgQ0xFRklERUJVR19ICi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImxlZmlUeXBlZGVmcy5oIgotCi0vKiBTZXQgZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIHZvaWQgbGVmaVNldERlYnVnIChpbnQgIG51bSwgaW50ICB2YWx1ZSk7Ci0KLS8qIFJlYWQgZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZmlEZWJ1ZyAoaW50ICBudW0pOwotCi0vKiBFcnJvciByZXBvcnRpbmcgcm91dGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIHZvaWQgbGVmaUVycm9yIChpbnQgIGNoZWNrLCBpbnQgIG1zZ051bSwgY29uc3QgY2hhciogIG1zZyk7Ci0KLUVYVEVSTiBjb25zdCBjaGFyKiBDQVNFIChjb25zdCBjaGFyICogeCk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYvbGVmaUVuY3J5cHRFeHQuYyBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL2xlZmlFbmNyeXB0RXh0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNiMGFkZTIuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYvbGVmaUVuY3J5cHRFeHQuYworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qCi0gKiBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotICogRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuNywgYW5kIGlzIHN1YmplY3QgdG8gdGhlIENhZGVuY2UgTEVGL0RFRgotICogT3BlbiBTb3VyY2UgTGljZW5zZSBBZ3JlZW1lbnQuICAgWW91ciAgY29udGludWVkICB1c2UgIG9mIHRoaXMgZmlsZQotICogY29uc3RpdHV0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZSB0ZXJtcyBvZiB0aGUgTEVGL0RFRiBPcGVuIFNvdXJjZQotICogTGljZW5zZSBhbmQgYW4gYWdyZWVtZW50IHRvIGFiaWRlIGJ5IGl0cyAgdGVybXMuICAgSWYgeW91ICBkb24ndCAgYWdyZWUKLSAqIHdpdGggIHRoaXMsIHlvdSBtdXN0IHJlbW92ZSB0aGlzIGFuZCBhbnkgb3RoZXIgZmlsZXMgd2hpY2ggYXJlIHBhcnQgb2YgdGhlCi0gKiBkaXN0cmlidXRpb24gYW5kICBkZXN0cm95IGFueSAgY29waWVzIG1hZGUuCi0gKiAKLSAqIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksIGNoZWNrCi0gKiB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0gKi8KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotLyoKLSAqIEdsb2JhbCB2YXJpYWJsZXMKLSAqLyBpbnQgbGVmclJlYWRFbmNyeXB0ZWQgPSAwOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYvbGVmaUVuY3J5cHRJbnQuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL2xlZmlFbmNyeXB0SW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYzE0M2IuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYvbGVmaUVuY3J5cHRJbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQ29weXJpZ2h0IDIwMTIgLSAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZSAgICAgICAgICAgICAqLwotLyogRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAqLwotLyogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgKi8KLS8qICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAqLwotLyogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgKi8KLS8qICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgICAgICovCi0vKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgICAgICAqLwotLyogICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LCAgICAgICAgICAqLwotLyogY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJEF1dGhvcjogZGVsbCAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkUmV2aXNpb246ICMxICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkRGF0ZTogMjAxNy8wNi8wNiAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRTdGF0ZTogICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0KLSNpZm5kZWYgQ0xFRklFTkNSWVBUSU5UX0gKLSNkZWZpbmUgQ0xFRklFTkNSWVBUSU5UX0gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAibGVmaVR5cGVkZWZzLmgiCi0KLS8qIFVuYWJsZSB0aGUgcmVhZGVyIHRvIHJlYWQgZW5jcnlwdGVkIGxlZiBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgbGVmclJlYWQoKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiB2b2lkIGxlZnJFbmFibGVSZWFkRW5jcnlwdGVkICgpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL2xlZmlMYXllci5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYvbGVmaUxheWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmODk5Y2EuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYvbGVmaUxheWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MzcgKzAsMCBAQAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBBVFRFTlRJT046IFRISVMgSVMgQU4gQVVUTy1HRU5FUkFURUQgRklMRS4gRE8gTk9UIENIQU5HRSBJVCEgICAgICAgICAgICAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBDb3B5cmlnaHQgMjAxMiAtIDIwMTUsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlICAgICAgICAgICAgICovCi0vKiBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAgICAgICAgICAgICovCi0vKiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICAgICAgICAqLwotLyogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICovCi0vKiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAgICAgICAqLwotLyogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgICAgKi8KLS8qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgICAgICovCi0vKiAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksICAgICAgICAgICovCi0vKiBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkQXV0aG9yOiBkZWxsICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkUmV2aXNpb246ICMxICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJERhdGU6IDIwMTcvMDYvMDYgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRTdGF0ZTogICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0KLSNpZm5kZWYgQ0xFRklMQVlFUl9ICi0jZGVmaW5lIENMRUZJTEFZRVJfSAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJsZWZpVHlwZWRlZnMuaCIKLQotdHlwZWRlZiBlbnVtIGxlZmlBbnRlbm5hRW51bSB7Ci0gIGxlZmlBbnRlbm5hQVIgPSAxLAotICBsZWZpQW50ZW5uYURBUiA9IDIsCi0gIGxlZmlBbnRlbm5hQ0FSID0gMywKLSAgbGVmaUFudGVubmFDREFSID0gNCwKLSAgbGVmaUFudGVubmFBRiA9IDUsCi0gIGxlZmlBbnRlbm5hU0FSID0gNiwKLSAgbGVmaUFudGVubmFEU0FSID0gNywKLSAgbGVmaUFudGVubmFDU0FSID0gOCwKLSAgbGVmaUFudGVubmFDRFNBUiA9IDksCi0gIGxlZmlBbnRlbm5hU0FGID0gMTAsCi0gIGxlZmlBbnRlbm5hTyA9IDExLAotICBsZWZpQW50ZW5uYUFEUiA9IDEyCi19IGxlZmlBbnRlbm5hRW51bTsKLQotRVhURVJOIGludCBsZWZpQW50ZW5uYVBXTF9udW1QV0wgKGNvbnN0IGxlZmlBbnRlbm5hUFdMKiBvYmopOwotCi1FWFRFUk4gY2hhciogbGVmaUxheWVyRGVuc2l0eV90eXBlIChjb25zdCBsZWZpTGF5ZXJEZW5zaXR5KiBvYmopOwotRVhURVJOIGludCBsZWZpTGF5ZXJEZW5zaXR5X2hhc09uZUVudHJ5IChjb25zdCBsZWZpTGF5ZXJEZW5zaXR5KiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJEZW5zaXR5X29uZUVudHJ5IChjb25zdCBsZWZpTGF5ZXJEZW5zaXR5KiBvYmopOwotRVhURVJOIGludCBsZWZpTGF5ZXJEZW5zaXR5X251bUZyZXF1ZW5jeSAoY29uc3QgbGVmaUxheWVyRGVuc2l0eSogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaUxheWVyRGVuc2l0eV9mcmVxdWVuY3kgKGNvbnN0IGxlZmlMYXllckRlbnNpdHkqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGxlZmlMYXllckRlbnNpdHlfbnVtV2lkdGhzIChjb25zdCBsZWZpTGF5ZXJEZW5zaXR5KiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJEZW5zaXR5X3dpZHRoIChjb25zdCBsZWZpTGF5ZXJEZW5zaXR5KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBsZWZpTGF5ZXJEZW5zaXR5X251bVRhYmxlRW50cmllcyAoY29uc3QgbGVmaUxheWVyRGVuc2l0eSogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaUxheWVyRGVuc2l0eV90YWJsZUVudHJ5IChjb25zdCBsZWZpTGF5ZXJEZW5zaXR5KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBsZWZpTGF5ZXJEZW5zaXR5X251bUN1dGFyZWFzIChjb25zdCBsZWZpTGF5ZXJEZW5zaXR5KiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJEZW5zaXR5X2N1dEFyZWEgKGNvbnN0IGxlZmlMYXllckRlbnNpdHkqIG9iaiwgaW50ICBpbmRleCk7Ci0KLS8qIDUuNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLUVYVEVSTiBpbnQgbGVmaVBhcmFsbGVsX251bUxlbmd0aCAoY29uc3QgbGVmaVBhcmFsbGVsKiBvYmopOwotRVhURVJOIGludCBsZWZpUGFyYWxsZWxfbnVtV2lkdGggKGNvbnN0IGxlZmlQYXJhbGxlbCogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaVBhcmFsbGVsX2xlbmd0aCAoY29uc3QgbGVmaVBhcmFsbGVsKiBvYmosIGludCAgaUxlbmd0aCk7Ci1FWFRFUk4gZG91YmxlIGxlZmlQYXJhbGxlbF93aWR0aCAoY29uc3QgbGVmaVBhcmFsbGVsKiBvYmosIGludCAgaVdpZHRoKTsKLUVYVEVSTiBkb3VibGUgbGVmaVBhcmFsbGVsX3dpZHRoU3BhY2luZyAoY29uc3QgbGVmaVBhcmFsbGVsKiBvYmosIGludCAgaVdpZHRoLCBpbnQgIGlXaWR0aFNwYWNpbmcpOwotCi0vKiA1LjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi1FWFRFUk4gaW50IGxlZmlJbmZsdWVuY2VfbnVtSW5mbHVlbmNlRW50cnkgKGNvbnN0IGxlZmlJbmZsdWVuY2UqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlJbmZsdWVuY2Vfd2lkdGggKGNvbnN0IGxlZmlJbmZsdWVuY2UqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGxlZmlJbmZsdWVuY2VfZGlzdGFuY2UgKGNvbnN0IGxlZmlJbmZsdWVuY2UqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGxlZmlJbmZsdWVuY2Vfc3BhY2luZyAoY29uc3QgbGVmaUluZmx1ZW5jZSogb2JqLCBpbnQgIGluZGV4KTsKLQotLyogNS43ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotRVhURVJOIGludCBsZWZpVHdvV2lkdGhzX251bVdpZHRoIChjb25zdCBsZWZpVHdvV2lkdGhzKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpVHdvV2lkdGhzX3dpZHRoIChjb25zdCBsZWZpVHdvV2lkdGhzKiBvYmosIGludCAgaVdpZHRoKTsKLUVYVEVSTiBpbnQgbGVmaVR3b1dpZHRoc19oYXNXaWR0aFBSTCAoY29uc3QgbGVmaVR3b1dpZHRocyogb2JqLCBpbnQgIGlXaWR0aCk7Ci1FWFRFUk4gZG91YmxlIGxlZmlUd29XaWR0aHNfd2lkdGhQUkwgKGNvbnN0IGxlZmlUd29XaWR0aHMqIG9iaiwgaW50ICBpV2lkdGgpOwotRVhURVJOIGludCBsZWZpVHdvV2lkdGhzX251bVdpZHRoU3BhY2luZyAoY29uc3QgbGVmaVR3b1dpZHRocyogb2JqLCBpbnQgIGlXaWR0aCk7Ci1FWFRFUk4gZG91YmxlIGxlZmlUd29XaWR0aHNfd2lkdGhTcGFjaW5nIChjb25zdCBsZWZpVHdvV2lkdGhzKiBvYmosIGludCAgaVdpZHRoLCBpbnQgIGlXaWR0aFNwYWNpbmcpOwotCi0vKiA1LjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi1FWFRFUk4gaW50IGxlZmlTcGFjaW5nVGFibGVfaXNJbmZsdWVuY2UgKGNvbnN0IGxlZmlTcGFjaW5nVGFibGUqIG9iaik7Ci1FWFRFUk4gY29uc3QgbGVmaUluZmx1ZW5jZSogbGVmaVNwYWNpbmdUYWJsZV9pbmZsdWVuY2UgKGNvbnN0IGxlZmlTcGFjaW5nVGFibGUqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlTcGFjaW5nVGFibGVfaXNQYXJhbGxlbCAoY29uc3QgbGVmaVNwYWNpbmdUYWJsZSogb2JqKTsKLUVYVEVSTiBjb25zdCBsZWZpUGFyYWxsZWwqIGxlZmlTcGFjaW5nVGFibGVfcGFyYWxsZWwgKGNvbnN0IGxlZmlTcGFjaW5nVGFibGUqIG9iaik7Ci1FWFRFUk4gY29uc3QgbGVmaVR3b1dpZHRocyogbGVmaVNwYWNpbmdUYWJsZV90d29XaWR0aHMgKGNvbnN0IGxlZmlTcGFjaW5nVGFibGUqIG9iaik7Ci0KLS8qIDUuNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLUVYVEVSTiBpbnQgbGVmaU9ydGhvZ29uYWxfbnVtT3J0aG9nb25hbCAoY29uc3QgbGVmaU9ydGhvZ29uYWwqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlPcnRob2dvbmFsX2N1dFdpdGhpbiAoY29uc3QgbGVmaU9ydGhvZ29uYWwqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGxlZmlPcnRob2dvbmFsX29ydGhvU3BhY2luZyAoY29uc3QgbGVmaU9ydGhvZ29uYWwqIG9iaiwgaW50ICBpbmRleCk7Ci0KLS8qIDUuNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLUVYVEVSTiBpbnQgbGVmaUFudGVubmFNb2RlbF9oYXNBbnRlbm5hQXJlYVJhdGlvIChjb25zdCBsZWZpQW50ZW5uYU1vZGVsKiBvYmopOwotRVhURVJOIGludCBsZWZpQW50ZW5uYU1vZGVsX2hhc0FudGVubmFEaWZmQXJlYVJhdGlvIChjb25zdCBsZWZpQW50ZW5uYU1vZGVsKiBvYmopOwotRVhURVJOIGludCBsZWZpQW50ZW5uYU1vZGVsX2hhc0FudGVubmFEaWZmQXJlYVJhdGlvUFdMIChjb25zdCBsZWZpQW50ZW5uYU1vZGVsKiBvYmopOwotRVhURVJOIGludCBsZWZpQW50ZW5uYU1vZGVsX2hhc0FudGVubmFDdW1BcmVhUmF0aW8gKGNvbnN0IGxlZmlBbnRlbm5hTW9kZWwqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlBbnRlbm5hTW9kZWxfaGFzQW50ZW5uYUN1bURpZmZBcmVhUmF0aW8gKGNvbnN0IGxlZmlBbnRlbm5hTW9kZWwqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlBbnRlbm5hTW9kZWxfaGFzQW50ZW5uYUN1bURpZmZBcmVhUmF0aW9QV0wgKGNvbnN0IGxlZmlBbnRlbm5hTW9kZWwqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlBbnRlbm5hTW9kZWxfaGFzQW50ZW5uYUFyZWFGYWN0b3IgKGNvbnN0IGxlZmlBbnRlbm5hTW9kZWwqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlBbnRlbm5hTW9kZWxfaGFzQW50ZW5uYUFyZWFGYWN0b3JEVU8gKGNvbnN0IGxlZmlBbnRlbm5hTW9kZWwqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlBbnRlbm5hTW9kZWxfaGFzQW50ZW5uYVNpZGVBcmVhUmF0aW8gKGNvbnN0IGxlZmlBbnRlbm5hTW9kZWwqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlBbnRlbm5hTW9kZWxfaGFzQW50ZW5uYURpZmZTaWRlQXJlYVJhdGlvIChjb25zdCBsZWZpQW50ZW5uYU1vZGVsKiBvYmopOwotRVhURVJOIGludCBsZWZpQW50ZW5uYU1vZGVsX2hhc0FudGVubmFEaWZmU2lkZUFyZWFSYXRpb1BXTCAoY29uc3QgbGVmaUFudGVubmFNb2RlbCogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaUFudGVubmFNb2RlbF9oYXNBbnRlbm5hQ3VtU2lkZUFyZWFSYXRpbyAoY29uc3QgbGVmaUFudGVubmFNb2RlbCogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaUFudGVubmFNb2RlbF9oYXNBbnRlbm5hQ3VtRGlmZlNpZGVBcmVhUmF0aW8gKGNvbnN0IGxlZmlBbnRlbm5hTW9kZWwqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlBbnRlbm5hTW9kZWxfaGFzQW50ZW5uYUN1bURpZmZTaWRlQXJlYVJhdGlvUFdMIChjb25zdCBsZWZpQW50ZW5uYU1vZGVsKiBvYmopOwotRVhURVJOIGludCBsZWZpQW50ZW5uYU1vZGVsX2hhc0FudGVubmFTaWRlQXJlYUZhY3RvciAoY29uc3QgbGVmaUFudGVubmFNb2RlbCogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaUFudGVubmFNb2RlbF9oYXNBbnRlbm5hU2lkZUFyZWFGYWN0b3JEVU8gKGNvbnN0IGxlZmlBbnRlbm5hTW9kZWwqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlBbnRlbm5hTW9kZWxfaGFzQW50ZW5uYUN1bVJvdXRpbmdQbHVzQ3V0IChjb25zdCBsZWZpQW50ZW5uYU1vZGVsKiBvYmopOwotRVhURVJOIGludCBsZWZpQW50ZW5uYU1vZGVsX2hhc0FudGVubmFHYXRlUGx1c0RpZmYgKGNvbnN0IGxlZmlBbnRlbm5hTW9kZWwqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlBbnRlbm5hTW9kZWxfaGFzQW50ZW5uYUFyZWFNaW51c0RpZmYgKGNvbnN0IGxlZmlBbnRlbm5hTW9kZWwqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlBbnRlbm5hTW9kZWxfaGFzQW50ZW5uYUFyZWFEaWZmUmVkdWNlUFdMIChjb25zdCBsZWZpQW50ZW5uYU1vZGVsKiBvYmopOwotCi1FWFRFUk4gY2hhciogbGVmaUFudGVubmFNb2RlbF9hbnRlbm5hT3hpZGUgKGNvbnN0IGxlZmlBbnRlbm5hTW9kZWwqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlBbnRlbm5hTW9kZWxfYW50ZW5uYUFyZWFSYXRpbyAoY29uc3QgbGVmaUFudGVubmFNb2RlbCogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaUFudGVubmFNb2RlbF9hbnRlbm5hRGlmZkFyZWFSYXRpbyAoY29uc3QgbGVmaUFudGVubmFNb2RlbCogb2JqKTsKLUVYVEVSTiBjb25zdCBsZWZpQW50ZW5uYVBXTCogbGVmaUFudGVubmFNb2RlbF9hbnRlbm5hRGlmZkFyZWFSYXRpb1BXTCAoY29uc3QgbGVmaUFudGVubmFNb2RlbCogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaUFudGVubmFNb2RlbF9hbnRlbm5hQ3VtQXJlYVJhdGlvIChjb25zdCBsZWZpQW50ZW5uYU1vZGVsKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpQW50ZW5uYU1vZGVsX2FudGVubmFDdW1EaWZmQXJlYVJhdGlvIChjb25zdCBsZWZpQW50ZW5uYU1vZGVsKiBvYmopOwotRVhURVJOIGNvbnN0IGxlZmlBbnRlbm5hUFdMKiBsZWZpQW50ZW5uYU1vZGVsX2FudGVubmFDdW1EaWZmQXJlYVJhdGlvUFdMIChjb25zdCBsZWZpQW50ZW5uYU1vZGVsKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpQW50ZW5uYU1vZGVsX2FudGVubmFBcmVhRmFjdG9yIChjb25zdCBsZWZpQW50ZW5uYU1vZGVsKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpQW50ZW5uYU1vZGVsX2FudGVubmFTaWRlQXJlYVJhdGlvIChjb25zdCBsZWZpQW50ZW5uYU1vZGVsKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpQW50ZW5uYU1vZGVsX2FudGVubmFEaWZmU2lkZUFyZWFSYXRpbyAoY29uc3QgbGVmaUFudGVubmFNb2RlbCogb2JqKTsKLUVYVEVSTiBjb25zdCBsZWZpQW50ZW5uYVBXTCogbGVmaUFudGVubmFNb2RlbF9hbnRlbm5hRGlmZlNpZGVBcmVhUmF0aW9QV0wgKGNvbnN0IGxlZmlBbnRlbm5hTW9kZWwqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlBbnRlbm5hTW9kZWxfYW50ZW5uYUN1bVNpZGVBcmVhUmF0aW8gKGNvbnN0IGxlZmlBbnRlbm5hTW9kZWwqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlBbnRlbm5hTW9kZWxfYW50ZW5uYUN1bURpZmZTaWRlQXJlYVJhdGlvIChjb25zdCBsZWZpQW50ZW5uYU1vZGVsKiBvYmopOwotRVhURVJOIGNvbnN0IGxlZmlBbnRlbm5hUFdMKiBsZWZpQW50ZW5uYU1vZGVsX2FudGVubmFDdW1EaWZmU2lkZUFyZWFSYXRpb1BXTCAoY29uc3QgbGVmaUFudGVubmFNb2RlbCogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaUFudGVubmFNb2RlbF9hbnRlbm5hU2lkZUFyZWFGYWN0b3IgKGNvbnN0IGxlZmlBbnRlbm5hTW9kZWwqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlBbnRlbm5hTW9kZWxfYW50ZW5uYUdhdGVQbHVzRGlmZiAoY29uc3QgbGVmaUFudGVubmFNb2RlbCogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaUFudGVubmFNb2RlbF9hbnRlbm5hQXJlYU1pbnVzRGlmZiAoY29uc3QgbGVmaUFudGVubmFNb2RlbCogb2JqKTsKLUVYVEVSTiBjb25zdCBsZWZpQW50ZW5uYVBXTCogbGVmaUFudGVubmFNb2RlbF9hbnRlbm5hQXJlYURpZmZSZWR1Y2VQV0wgKGNvbnN0IGxlZmlBbnRlbm5hTW9kZWwqIG9iaik7Ci0KLSAgLyogNS42IC0gbWluc3RlcCBzd2l0Y2ggdG8gbXVsdGlwbGUgYW5kIGFkZGVkIG1vcmUgb3B0aW9ucyAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogNS41IFNQQUNJTkdUQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogNS42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogNS44ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFBPTFlST1VUSU5HLCBNSU1DQVAsIFRTViwgUEFTU0lWQVRJT04sIE5XRUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi1FWFRFUk4gaW50IGxlZmlMYXllcl9oYXNUeXBlIChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlMYXllcl9oYXNMYXllclR5cGUgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgUk9VVElORyBjYW4gYmUgUE9MWVJPVVRJTkcgb3IgTUlNQ0FQICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIENVVCBjYW4gYmUgVFNWIG9yIFBBU1NJVkFUSU9OICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBNQVNURVJTTElDRSBjYW4gYmUgTldFTEwgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc01hc2sgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc1BpdGNoIChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlMYXllcl9oYXNYWVBpdGNoIChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlMYXllcl9oYXNPZmZzZXQgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc1hZT2Zmc2V0IChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlMYXllcl9oYXNXaWR0aCAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGludCBsZWZpTGF5ZXJfaGFzQXJlYSAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGludCBsZWZpTGF5ZXJfaGFzRGlhZ1BpdGNoIChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlMYXllcl9oYXNYWURpYWdQaXRjaCAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGludCBsZWZpTGF5ZXJfaGFzRGlhZ1dpZHRoIChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlMYXllcl9oYXNEaWFnU3BhY2luZyAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGludCBsZWZpTGF5ZXJfaGFzU3BhY2luZ051bWJlciAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGludCBsZWZpTGF5ZXJfaGFzU3BhY2luZ05hbWUgKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc1NwYWNpbmdMYXllclN0YWNrIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGxlZmlMYXllcl9oYXNTcGFjaW5nQWRqYWNlbnQgKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc1NwYWNpbmdDZW50ZXJUb0NlbnRlciAoY29uc3QgbGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBsZWZpTGF5ZXJfaGFzU3BhY2luZ1JhbmdlIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGxlZmlMYXllcl9oYXNTcGFjaW5nUmFuZ2VVc2VMZW5ndGhUaHJlc2hvbGQgKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc1NwYWNpbmdSYW5nZUluZmx1ZW5jZSAoY29uc3QgbGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBsZWZpTGF5ZXJfaGFzU3BhY2luZ1JhbmdlSW5mbHVlbmNlUmFuZ2UgKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc1NwYWNpbmdSYW5nZVJhbmdlIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGxlZmlMYXllcl9oYXNTcGFjaW5nTGVuZ3RoVGhyZXNob2xkIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGxlZmlMYXllcl9oYXNTcGFjaW5nTGVuZ3RoVGhyZXNob2xkUmFuZ2UgKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc1NwYWNpbmdQYXJhbGxlbE92ZXJsYXAgKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc1NwYWNpbmdBcmVhIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGxlZmlMYXllcl9oYXNTcGFjaW5nRW5kT2ZMaW5lIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGxlZmlMYXllcl9oYXNTcGFjaW5nUGFyZWxsZWxFZGdlIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGxlZmlMYXllcl9oYXNTcGFjaW5nVHdvRWRnZXMgKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc1NwYWNpbmdBZGphY2VudEV4Y2VwdCAoY29uc3QgbGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBsZWZpTGF5ZXJfaGFzU3BhY2luZ1NhbWVuZXQgKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc1NwYWNpbmdTYW1lbmV0UEdvbmx5IChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGxlZmlMYXllcl9oYXNTcGFjaW5nTm90Y2hMZW5ndGggKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc1NwYWNpbmdFbmRPZk5vdGNoV2lkdGggKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc0RpcmVjdGlvbiAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGludCBsZWZpTGF5ZXJfaGFzUmVzaXN0YW5jZSAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGludCBsZWZpTGF5ZXJfaGFzUmVzaXN0YW5jZUFycmF5IChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlMYXllcl9oYXNDYXBhY2l0YW5jZSAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGludCBsZWZpTGF5ZXJfaGFzQ2FwYWNpdGFuY2VBcnJheSAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGludCBsZWZpTGF5ZXJfaGFzSGVpZ2h0IChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlMYXllcl9oYXNUaGlja25lc3MgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc1dpcmVFeHRlbnNpb24gKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc1Nocmlua2FnZSAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGludCBsZWZpTGF5ZXJfaGFzQ2FwTXVsdGlwbGllciAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGludCBsZWZpTGF5ZXJfaGFzRWRnZUNhcCAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGludCBsZWZpTGF5ZXJfaGFzQW50ZW5uYUxlbmd0aCAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGludCBsZWZpTGF5ZXJfaGFzQW50ZW5uYUFyZWEgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc0N1cnJlbnREZW5zaXR5UG9pbnQgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc0N1cnJlbnREZW5zaXR5QXJyYXkgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc0FjY3VycmVudERlbnNpdHkgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc0RjY3VycmVudERlbnNpdHkgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLQotRVhURVJOIGludCBsZWZpTGF5ZXJfbnVtUHJvcHMgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBsZWZpTGF5ZXJfcHJvcE5hbWUgKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBjb25zdCBjaGFyKiBsZWZpTGF5ZXJfcHJvcFZhbHVlIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGxlZmlMYXllcl9wcm9wTnVtYmVyIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY29uc3QgY2hhciBsZWZpTGF5ZXJfcHJvcFR5cGUgKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX3Byb3BJc051bWJlciAoY29uc3QgbGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBsZWZpTGF5ZXJfcHJvcElzU3RyaW5nIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci0KLUVYVEVSTiBpbnQgbGVmaUxheWVyX251bVNwYWNpbmcgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLQotRVhURVJOIGNoYXIqIGxlZmlMYXllcl9uYW1lIChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogbGVmaUxheWVyX3R5cGUgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBsZWZpTGF5ZXJfbGF5ZXJUeXBlIChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlMYXllcl9waXRjaCAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGludCBsZWZpTGF5ZXJfbWFzayAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfcGl0Y2hYIChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlMYXllcl9waXRjaFkgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaUxheWVyX29mZnNldCAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfb2Zmc2V0WCAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfb2Zmc2V0WSAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfd2lkdGggKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaUxheWVyX2FyZWEgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaUxheWVyX2RpYWdQaXRjaCAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfZGlhZ1BpdGNoWCAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfZGlhZ1BpdGNoWSAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfZGlhZ1dpZHRoIChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlMYXllcl9kaWFnU3BhY2luZyAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfc3BhY2luZyAoY29uc3QgbGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGNoYXIqIGxlZmlMYXllcl9zcGFjaW5nTmFtZSAoY29uc3QgbGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBsZWZpTGF5ZXJfc3BhY2luZ0FkamFjZW50Q3V0cyAoY29uc3QgbGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfc3BhY2luZ0FkamFjZW50V2l0aGluIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGxlZmlMYXllcl9zcGFjaW5nQXJlYSAoY29uc3QgbGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfc3BhY2luZ1JhbmdlTWluIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGxlZmlMYXllcl9zcGFjaW5nUmFuZ2VNYXggKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBkb3VibGUgbGVmaUxheWVyX3NwYWNpbmdSYW5nZUluZmx1ZW5jZSAoY29uc3QgbGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfc3BhY2luZ1JhbmdlSW5mbHVlbmNlTWluIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGxlZmlMYXllcl9zcGFjaW5nUmFuZ2VJbmZsdWVuY2VNYXggKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBkb3VibGUgbGVmaUxheWVyX3NwYWNpbmdSYW5nZVJhbmdlTWluIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGxlZmlMYXllcl9zcGFjaW5nUmFuZ2VSYW5nZU1heCAoY29uc3QgbGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfc3BhY2luZ0xlbmd0aFRocmVzaG9sZCAoY29uc3QgbGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfc3BhY2luZ0xlbmd0aFRocmVzaG9sZFJhbmdlTWluIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGxlZmlMYXllcl9zcGFjaW5nTGVuZ3RoVGhyZXNob2xkUmFuZ2VNYXggKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLQotICAvKiA1LjcgU3BhY2luZyBlbmRvZmxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBkb3VibGUgbGVmaUxheWVyX3NwYWNpbmdFb2xXaWR0aCAoY29uc3QgbGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfc3BhY2luZ0VvbFdpdGhpbiAoY29uc3QgbGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfc3BhY2luZ1BhclNwYWNlIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGxlZmlMYXllcl9zcGFjaW5nUGFyV2l0aGluIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci0KLSAgLyogNS43IFNwYWNpbmcgTm90Y2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gZG91YmxlIGxlZmlMYXllcl9zcGFjaW5nTm90Y2hMZW5ndGggKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBkb3VibGUgbGVmaUxheWVyX3NwYWNpbmdFbmRPZk5vdGNoV2lkdGggKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBkb3VibGUgbGVmaUxheWVyX3NwYWNpbmdFbmRPZk5vdGNoU3BhY2luZyAoY29uc3QgbGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfc3BhY2luZ0VuZE9mTm90Y2hMZW5ndGggKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLQotICAvKiA1LjUgTWluaW11bSBjdXQgcnVsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmaUxheWVyX251bU1pbmltdW1jdXQgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX21pbmltdW1jdXQgKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBkb3VibGUgbGVmaUxheWVyX21pbmltdW1jdXRXaWR0aCAoY29uc3QgbGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBsZWZpTGF5ZXJfaGFzTWluaW11bWN1dFdpdGhpbiAoY29uc3QgbGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfbWluaW11bWN1dFdpdGhpbiAoY29uc3QgbGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBsZWZpTGF5ZXJfaGFzTWluaW11bWN1dENvbm5lY3Rpb24gKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBjb25zdCBjaGFyKiBsZWZpTGF5ZXJfbWluaW11bWN1dENvbm5lY3Rpb24gKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc01pbmltdW1jdXROdW1DdXRzIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGxlZmlMYXllcl9taW5pbXVtY3V0TGVuZ3RoIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGxlZmlMYXllcl9taW5pbXVtY3V0RGlzdGFuY2UgKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLQotRVhURVJOIGNvbnN0IGNoYXIqIGxlZmlMYXllcl9kaXJlY3Rpb24gKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaUxheWVyX3Jlc2lzdGFuY2UgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaUxheWVyX2NhcGFjaXRhbmNlIChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlMYXllcl9oZWlnaHQgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaUxheWVyX3dpcmVFeHRlbnNpb24gKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaUxheWVyX3RoaWNrbmVzcyAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfc2hyaW5rYWdlIChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlMYXllcl9jYXBNdWx0aXBsaWVyIChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlMYXllcl9lZGdlQ2FwIChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlMYXllcl9hbnRlbm5hTGVuZ3RoIChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlMYXllcl9hbnRlbm5hQXJlYSAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfY3VycmVudERlbnNpdHlQb2ludCAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIHZvaWQgbGVmaUxheWVyX2N1cnJlbnREZW5zaXR5QXJyYXkgKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQqICBudW1Qb2ludHMsIGRvdWJsZSoqICB3aWR0aHMsIGRvdWJsZSoqICBjdXJyZW50KTsKLUVYVEVSTiB2b2lkIGxlZmlMYXllcl9jYXBhY2l0YW5jZUFycmF5IChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50KiAgbnVtUG9pbnRzLCBkb3VibGUqKiAgd2lkdGhzLCBkb3VibGUqKiAgcmVzVmFsdWVzKTsKLUVYVEVSTiB2b2lkIGxlZmlMYXllcl9yZXNpc3RhbmNlQXJyYXkgKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQqICBudW1Qb2ludHMsIGRvdWJsZSoqICB3aWR0aHMsIGRvdWJsZSoqICBjYXBWYWx1ZXMpOwotCi1FWFRFUk4gaW50IGxlZmlMYXllcl9udW1BY2N1cnJlbnREZW5zaXR5IChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci1FWFRFUk4gY29uc3QgbGVmaUxheWVyRGVuc2l0eSogbGVmaUxheWVyX2FjY3VycmVudCAoY29uc3QgbGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBsZWZpTGF5ZXJfbnVtRGNjdXJyZW50RGVuc2l0eSAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGNvbnN0IGxlZmlMYXllckRlbnNpdHkqIGxlZmlMYXllcl9kY2N1cnJlbnQgKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLQotICAvKiAzLzIzLzIwMDAgLSBXYW5kYSBkYSBSb3NhLiAgVGhlIGZvbGxvd2luZyBhcmUgZm9yIDUuNCBBbnRlbm5hLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgT25seSA1LjQgb3IgNS4zIGFyZSBhbGxvd2VkIGluIGEgbGVmIGZpbGUsIGJ1dCBub3QgYm90aCAgICAgICovCi0KLSAgLyogNS41ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZmlMYXllcl9udW1BbnRlbm5hTW9kZWwgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBjb25zdCBsZWZpQW50ZW5uYU1vZGVsKiBsZWZpTGF5ZXJfYW50ZW5uYU1vZGVsIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci0KLSAgLyogVGhlIGZvbGxvd2luZyBpcyA4LzIxLzAxIDUuNCBlbmhhbmNlbWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc1Nsb3RXaXJlV2lkdGggKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc1Nsb3RXaXJlTGVuZ3RoIChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlMYXllcl9oYXNTbG90V2lkdGggKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc1Nsb3RMZW5ndGggKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc01heEFkamFjZW50U2xvdFNwYWNpbmcgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc01heENvYXhpYWxTbG90U3BhY2luZyAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGludCBsZWZpTGF5ZXJfaGFzTWF4RWRnZVNsb3RTcGFjaW5nIChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlMYXllcl9oYXNTcGxpdFdpcmVXaWR0aCAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGludCBsZWZpTGF5ZXJfaGFzTWluaW11bURlbnNpdHkgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc01heGltdW1EZW5zaXR5IChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlMYXllcl9oYXNEZW5zaXR5Q2hlY2tXaW5kb3cgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc0RlbnNpdHlDaGVja1N0ZXAgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc0ZpbGxBY3RpdmVTcGFjaW5nIChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlMYXllcl9oYXNNYXh3aWR0aCAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGludCBsZWZpTGF5ZXJfaGFzTWlud2lkdGggKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc01pbnN0ZXAgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc1Byb3RydXNpb24gKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLQotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfc2xvdFdpcmVXaWR0aCAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfc2xvdFdpcmVMZW5ndGggKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaUxheWVyX3Nsb3RXaWR0aCAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfc2xvdExlbmd0aCAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfbWF4QWRqYWNlbnRTbG90U3BhY2luZyAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfbWF4Q29heGlhbFNsb3RTcGFjaW5nIChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlMYXllcl9tYXhFZGdlU2xvdFNwYWNpbmcgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaUxheWVyX3NwbGl0V2lyZVdpZHRoIChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlMYXllcl9taW5pbXVtRGVuc2l0eSAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfbWF4aW11bURlbnNpdHkgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaUxheWVyX2RlbnNpdHlDaGVja1dpbmRvd0xlbmd0aCAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfZGVuc2l0eUNoZWNrV2luZG93V2lkdGggKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaUxheWVyX2RlbnNpdHlDaGVja1N0ZXAgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaUxheWVyX2ZpbGxBY3RpdmVTcGFjaW5nIChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlMYXllcl9tYXh3aWR0aCAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfbWlud2lkdGggKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaUxheWVyX3Byb3RydXNpb25XaWR0aDEgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaUxheWVyX3Byb3RydXNpb25MZW5ndGggKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaUxheWVyX3Byb3RydXNpb25XaWR0aDIgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLQotRVhURVJOIGludCBsZWZpTGF5ZXJfbnVtTWluc3RlcCAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfbWluc3RlcCAoY29uc3QgbGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBsZWZpTGF5ZXJfaGFzTWluc3RlcFR5cGUgKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBjaGFyKiBsZWZpTGF5ZXJfbWluc3RlcFR5cGUgKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc01pbnN0ZXBMZW5ndGhzdW0gKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBkb3VibGUgbGVmaUxheWVyX21pbnN0ZXBMZW5ndGhzdW0gKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc01pbnN0ZXBNYXhlZGdlcyAoY29uc3QgbGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBsZWZpTGF5ZXJfbWluc3RlcE1heGVkZ2VzIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGxlZmlMYXllcl9oYXNNaW5zdGVwTWluQWRqTGVuZ3RoIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGxlZmlMYXllcl9taW5zdGVwTWluQWRqTGVuZ3RoIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGxlZmlMYXllcl9oYXNNaW5zdGVwTWluQmV0TGVuZ3RoIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGxlZmlMYXllcl9taW5zdGVwTWluQmV0TGVuZ3RoIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGxlZmlMYXllcl9oYXNNaW5zdGVwWFNhbWVDb3JuZXJzIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci0KLSAgLyogNS41IE1JTkVOQ0xPU0VEQVJFQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZmlMYXllcl9udW1NaW5lbmNsb3NlZGFyZWEgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaUxheWVyX21pbmVuY2xvc2VkYXJlYSAoY29uc3QgbGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBsZWZpTGF5ZXJfaGFzTWluZW5jbG9zZWRhcmVhV2lkdGggKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBkb3VibGUgbGVmaUxheWVyX21pbmVuY2xvc2VkYXJlYVdpZHRoIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci0KLSAgLyogNS41IFNQQUNJTkdUQUJMRSBGT1IgTEFZRVIgUk9VVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogNS42IEVOQ0xPU1VSRSwgUFJFRkVSRU5DTE9TVVJFLCBSRVNJU1RBTkNFUEVSQ1VUICYgRElBR01JTkVER0VMRU5HVEggICAgICovCi1FWFRFUk4gaW50IGxlZmlMYXllcl9udW1FbmNsb3N1cmUgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc0VuY2xvc3VyZVJ1bGUgKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBkb3VibGUgbGVmaUxheWVyX2VuY2xvc3VyZU92ZXJoYW5nMSAoY29uc3QgbGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfZW5jbG9zdXJlT3ZlcmhhbmcyIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGxlZmlMYXllcl9oYXNFbmNsb3N1cmVXaWR0aCAoY29uc3QgbGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfZW5jbG9zdXJlTWluV2lkdGggKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc0VuY2xvc3VyZUV4Y2VwdEV4dHJhQ3V0IChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGxlZmlMYXllcl9lbmNsb3N1cmVFeGNlcHRFeHRyYUN1dCAoY29uc3QgbGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBsZWZpTGF5ZXJfaGFzRW5jbG9zdXJlTWluTGVuZ3RoIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGxlZmlMYXllcl9lbmNsb3N1cmVNaW5MZW5ndGggKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX251bVByZWZlckVuY2xvc3VyZSAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGludCBsZWZpTGF5ZXJfaGFzUHJlZmVyRW5jbG9zdXJlUnVsZSAoY29uc3QgbGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfcHJlZmVyRW5jbG9zdXJlT3ZlcmhhbmcxIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGxlZmlMYXllcl9wcmVmZXJFbmNsb3N1cmVPdmVyaGFuZzIgKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc1ByZWZlckVuY2xvc3VyZVdpZHRoIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGxlZmlMYXllcl9wcmVmZXJFbmNsb3N1cmVNaW5XaWR0aCAoY29uc3QgbGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBsZWZpTGF5ZXJfaGFzUmVzaXN0YW5jZVBlckN1dCAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfcmVzaXN0YW5jZVBlckN1dCAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGludCBsZWZpTGF5ZXJfaGFzRGlhZ01pbkVkZ2VMZW5ndGggKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaUxheWVyX2RpYWdNaW5FZGdlTGVuZ3RoIChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlMYXllcl9udW1NaW5TaXplIChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlMYXllcl9taW5TaXplV2lkdGggKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBkb3VibGUgbGVmaUxheWVyX21pblNpemVMZW5ndGggKGNvbnN0IGxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLQotICAvKiA1LjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc01heEZsb2F0aW5nQXJlYSAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfbWF4RmxvYXRpbmdBcmVhIChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlMYXllcl9oYXNBcnJheVNwYWNpbmcgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2hhc0xvbmdBcnJheSAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGludCBsZWZpTGF5ZXJfaGFzVmlhV2lkdGggKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaUxheWVyX3ZpYVdpZHRoIChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlMYXllcl9jdXRTcGFjaW5nIChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlMYXllcl9udW1BcnJheUN1dHMgKGNvbnN0IGxlZmlMYXllciogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2FycmF5Q3V0cyAoY29uc3QgbGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGRvdWJsZSBsZWZpTGF5ZXJfYXJyYXlTcGFjaW5nIChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGxlZmlMYXllcl9oYXNTcGFjaW5nVGFibGVPcnRobyAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotRVhURVJOIGNvbnN0IGxlZmlPcnRob2dvbmFsKiBsZWZpTGF5ZXJfb3J0aG9nb25hbCAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotCi1FWFRFUk4gZG91YmxlIGxlZmlMYXllcl9sZWY1OFdpZHRoVGFibGVPcnRobyAoY29uc3QgbGVmaUxheWVyKiBvYmosIGludCAgaWR4KTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2xlZjU4V2lkdGhUYWJsZU9ydGhvVmFsdWVzIChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlMYXllcl9sZWY1OFdpZHRoVGFibGVXcm9uZ0RpciAoY29uc3QgbGVmaUxheWVyKiBvYmosIGludCAgaWR4KTsKLUVYVEVSTiBpbnQgbGVmaUxheWVyX2xlZjU4V2lkdGhUYWJsZVdyb25nRGlyVmFsdWVzIChjb25zdCBsZWZpTGF5ZXIqIG9iaik7Ci0KLUVYVEVSTiBpbnQgbGVmaUxheWVyX25lZWQ1OFByb3BzUHJvY2Vzc2luZyAoY29uc3QgbGVmaUxheWVyKiBvYmopOwotCi0gIC8qIERlYnVnIHByaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIHZvaWQgbGVmaUxheWVyX3ByaW50IChjb25zdCBsZWZpTGF5ZXIqIG9iaiwgRklMRSogIGYpOwotCi0gIC8qIDUuNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFE6IHF1b3RlZHN0cmluZyAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIC8qIDMvMjMvMjAwMCAtIFdhbmRhIGRhIFJvc2EuICBUaGUgZm9sbG93aW5nIGlzIGZvciA1LjQgQU5URU5OQS4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICBFaXRoZXIgNS40IG9yIDUuMyBhcmUgYWxsb3dlZCwgbm90IGJvdGggICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAvKiA1LjUgQW50ZW5uYU1vZGVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAvKiA4LzI5LzIwMDEgLSBXYW5kYSBkYSBSb3NhLiAgVGhlIGZvbGxvd2luZyBpcyBmb3IgNS40IGVuaGFuY2VtZW50cy4gICAgICAgKi8KLQotICAvKiA1LjUgU1BBQ0lOR1RBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAvKiA1LjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAvKiA1LjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi9sZWZpTWFjcm8uaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL2xlZmlNYWNyby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWQ5NDc3Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL2xlZmlNYWNyby5oCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQ29weXJpZ2h0IDIwMTIgLSAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZSAgICAgICAgICAgICAqLwotLyogRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAqLwotLyogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgKi8KLS8qICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAqLwotLyogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgKi8KLS8qICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgICAgICovCi0vKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgICAgICAqLwotLyogICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LCAgICAgICAgICAqLwotLyogY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJEF1dGhvcjogZGVsbCAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkUmV2aXNpb246ICMxICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkRGF0ZTogMjAxNy8wNi8wNiAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRTdGF0ZTogICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0KLSNpZm5kZWYgQ0xFRklNQUNST19ICi0jZGVmaW5lIENMRUZJTUFDUk9fSAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJsZWZpVHlwZWRlZnMuaCIKLQotRVhURVJOIGNvbnN0IGxlZmlHZW9tZXRyaWVzKiBsZWZpT2JzdHJ1Y3Rpb25fZ2VvbWV0cmllcyAoY29uc3QgbGVmaU9ic3RydWN0aW9uKiBvYmopOwotCi1FWFRFUk4gdm9pZCBsZWZpT2JzdHJ1Y3Rpb25fcHJpbnQgKGNvbnN0IGxlZmlPYnN0cnVjdGlvbiogb2JqLCBGSUxFKiAgZik7Ci0KLS8qIDUuNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLUVYVEVSTiBpbnQgbGVmaVBpbkFudGVubmFNb2RlbF9oYXNBbnRlbm5hR2F0ZUFyZWEgKGNvbnN0IGxlZmlQaW5BbnRlbm5hTW9kZWwqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlQaW5BbnRlbm5hTW9kZWxfaGFzQW50ZW5uYU1heEFyZWFDYXIgKGNvbnN0IGxlZmlQaW5BbnRlbm5hTW9kZWwqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlQaW5BbnRlbm5hTW9kZWxfaGFzQW50ZW5uYU1heFNpZGVBcmVhQ2FyIChjb25zdCBsZWZpUGluQW50ZW5uYU1vZGVsKiBvYmopOwotRVhURVJOIGludCBsZWZpUGluQW50ZW5uYU1vZGVsX2hhc0FudGVubmFNYXhDdXRDYXIgKGNvbnN0IGxlZmlQaW5BbnRlbm5hTW9kZWwqIG9iaik7Ci0KLUVYVEVSTiBjaGFyKiBsZWZpUGluQW50ZW5uYU1vZGVsX2FudGVubmFPeGlkZSAoY29uc3QgbGVmaVBpbkFudGVubmFNb2RlbCogb2JqKTsKLQotRVhURVJOIGludCBsZWZpUGluQW50ZW5uYU1vZGVsX251bUFudGVubmFHYXRlQXJlYSAoY29uc3QgbGVmaVBpbkFudGVubmFNb2RlbCogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaVBpbkFudGVubmFNb2RlbF9hbnRlbm5hR2F0ZUFyZWEgKGNvbnN0IGxlZmlQaW5BbnRlbm5hTW9kZWwqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY29uc3QgY2hhciogbGVmaVBpbkFudGVubmFNb2RlbF9hbnRlbm5hR2F0ZUFyZWFMYXllciAoY29uc3QgbGVmaVBpbkFudGVubmFNb2RlbCogb2JqLCBpbnQgIGluZGV4KTsKLQotRVhURVJOIGludCBsZWZpUGluQW50ZW5uYU1vZGVsX251bUFudGVubmFNYXhBcmVhQ2FyIChjb25zdCBsZWZpUGluQW50ZW5uYU1vZGVsKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpUGluQW50ZW5uYU1vZGVsX2FudGVubmFNYXhBcmVhQ2FyIChjb25zdCBsZWZpUGluQW50ZW5uYU1vZGVsKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGNvbnN0IGNoYXIqIGxlZmlQaW5BbnRlbm5hTW9kZWxfYW50ZW5uYU1heEFyZWFDYXJMYXllciAoY29uc3QgbGVmaVBpbkFudGVubmFNb2RlbCogb2JqLCBpbnQgIGluZGV4KTsKLQotRVhURVJOIGludCBsZWZpUGluQW50ZW5uYU1vZGVsX251bUFudGVubmFNYXhTaWRlQXJlYUNhciAoY29uc3QgbGVmaVBpbkFudGVubmFNb2RlbCogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaVBpbkFudGVubmFNb2RlbF9hbnRlbm5hTWF4U2lkZUFyZWFDYXIgKGNvbnN0IGxlZmlQaW5BbnRlbm5hTW9kZWwqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY29uc3QgY2hhciogbGVmaVBpbkFudGVubmFNb2RlbF9hbnRlbm5hTWF4U2lkZUFyZWFDYXJMYXllciAoY29uc3QgbGVmaVBpbkFudGVubmFNb2RlbCogb2JqLCBpbnQgIGluZGV4KTsKLQotRVhURVJOIGludCBsZWZpUGluQW50ZW5uYU1vZGVsX251bUFudGVubmFNYXhDdXRDYXIgKGNvbnN0IGxlZmlQaW5BbnRlbm5hTW9kZWwqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlQaW5BbnRlbm5hTW9kZWxfYW50ZW5uYU1heEN1dENhciAoY29uc3QgbGVmaVBpbkFudGVubmFNb2RlbCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBjb25zdCBjaGFyKiBsZWZpUGluQW50ZW5uYU1vZGVsX2FudGVubmFNYXhDdXRDYXJMYXllciAoY29uc3QgbGVmaVBpbkFudGVubmFNb2RlbCogb2JqLCBpbnQgIGluZGV4KTsKLQotRVhURVJOIGludCBsZWZpUGluQW50ZW5uYU1vZGVsX2hhc1JldHVybiAoY29uc3QgbGVmaVBpbkFudGVubmFNb2RlbCogb2JqKTsKLQotRVhURVJOIGludCBsZWZpUGluX2hhc0ZvcmVpZ24gKGNvbnN0IGxlZmlQaW4qIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlQaW5faGFzRm9yZWlnbk9yaWVudCAoY29uc3QgbGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgbGVmaVBpbl9oYXNGb3JlaWduUG9pbnQgKGNvbnN0IGxlZmlQaW4qIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGxlZmlQaW5faGFzTEVRIChjb25zdCBsZWZpUGluKiBvYmopOwotRVhURVJOIGludCBsZWZpUGluX2hhc0RpcmVjdGlvbiAoY29uc3QgbGVmaVBpbiogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaVBpbl9oYXNVc2UgKGNvbnN0IGxlZmlQaW4qIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlQaW5faGFzU2hhcGUgKGNvbnN0IGxlZmlQaW4qIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlQaW5faGFzTXVzdGpvaW4gKGNvbnN0IGxlZmlQaW4qIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlQaW5faGFzT3V0TWFyZ2luIChjb25zdCBsZWZpUGluKiBvYmopOwotRVhURVJOIGludCBsZWZpUGluX2hhc091dFJlc2lzdGFuY2UgKGNvbnN0IGxlZmlQaW4qIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlQaW5faGFzSW5NYXJnaW4gKGNvbnN0IGxlZmlQaW4qIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlQaW5faGFzUG93ZXIgKGNvbnN0IGxlZmlQaW4qIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlQaW5faGFzTGVha2FnZSAoY29uc3QgbGVmaVBpbiogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaVBpbl9oYXNNYXhsb2FkIChjb25zdCBsZWZpUGluKiBvYmopOwotRVhURVJOIGludCBsZWZpUGluX2hhc01heGRlbGF5IChjb25zdCBsZWZpUGluKiBvYmopOwotRVhURVJOIGludCBsZWZpUGluX2hhc0NhcGFjaXRhbmNlIChjb25zdCBsZWZpUGluKiBvYmopOwotRVhURVJOIGludCBsZWZpUGluX2hhc1Jlc2lzdGFuY2UgKGNvbnN0IGxlZmlQaW4qIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlQaW5faGFzUHVsbGRvd25yZXMgKGNvbnN0IGxlZmlQaW4qIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlQaW5faGFzVGllb2ZmciAoY29uc3QgbGVmaVBpbiogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaVBpbl9oYXNWSEkgKGNvbnN0IGxlZmlQaW4qIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlQaW5faGFzVkxPIChjb25zdCBsZWZpUGluKiBvYmopOwotRVhURVJOIGludCBsZWZpUGluX2hhc1Jpc2VWb2x0YWdlIChjb25zdCBsZWZpUGluKiBvYmopOwotRVhURVJOIGludCBsZWZpUGluX2hhc0ZhbGxWb2x0YWdlIChjb25zdCBsZWZpUGluKiBvYmopOwotRVhURVJOIGludCBsZWZpUGluX2hhc1Jpc2VUaHJlc2ggKGNvbnN0IGxlZmlQaW4qIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlQaW5faGFzRmFsbFRocmVzaCAoY29uc3QgbGVmaVBpbiogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaVBpbl9oYXNSaXNlU2F0Y3VyIChjb25zdCBsZWZpUGluKiBvYmopOwotRVhURVJOIGludCBsZWZpUGluX2hhc0ZhbGxTYXRjdXIgKGNvbnN0IGxlZmlQaW4qIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlQaW5faGFzQ3VycmVudFNvdXJjZSAoY29uc3QgbGVmaVBpbiogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaVBpbl9oYXNUYWJsZXMgKGNvbnN0IGxlZmlQaW4qIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlQaW5faGFzQW50ZW5uYVNpemUgKGNvbnN0IGxlZmlQaW4qIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlQaW5faGFzQW50ZW5uYU1ldGFsQXJlYSAoY29uc3QgbGVmaVBpbiogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaVBpbl9oYXNBbnRlbm5hTWV0YWxMZW5ndGggKGNvbnN0IGxlZmlQaW4qIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlQaW5faGFzQW50ZW5uYVBhcnRpYWxNZXRhbEFyZWEgKGNvbnN0IGxlZmlQaW4qIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlQaW5faGFzQW50ZW5uYVBhcnRpYWxNZXRhbFNpZGVBcmVhIChjb25zdCBsZWZpUGluKiBvYmopOwotRVhURVJOIGludCBsZWZpUGluX2hhc0FudGVubmFQYXJ0aWFsQ3V0QXJlYSAoY29uc3QgbGVmaVBpbiogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaVBpbl9oYXNBbnRlbm5hRGlmZkFyZWEgKGNvbnN0IGxlZmlQaW4qIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlQaW5faGFzQW50ZW5uYU1vZGVsIChjb25zdCBsZWZpUGluKiBvYmopOwotRVhURVJOIGludCBsZWZpUGluX2hhc1RhcGVyUnVsZSAoY29uc3QgbGVmaVBpbiogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaVBpbl9oYXNSaXNlU2xld0xpbWl0IChjb25zdCBsZWZpUGluKiBvYmopOwotRVhURVJOIGludCBsZWZpUGluX2hhc0ZhbGxTbGV3TGltaXQgKGNvbnN0IGxlZmlQaW4qIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlQaW5faGFzTmV0RXhwciAoY29uc3QgbGVmaVBpbiogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaVBpbl9oYXNTdXBwbHlTZW5zaXRpdml0eSAoY29uc3QgbGVmaVBpbiogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaVBpbl9oYXNHcm91bmRTZW5zaXRpdml0eSAoY29uc3QgbGVmaVBpbiogb2JqKTsKLQotRVhURVJOIGNvbnN0IGNoYXIqIGxlZmlQaW5fbmFtZSAoY29uc3QgbGVmaVBpbiogb2JqKTsKLQotRVhURVJOIGludCBsZWZpUGluX251bVBvcnRzIChjb25zdCBsZWZpUGluKiBvYmopOwotRVhURVJOIGNvbnN0IGxlZmlHZW9tZXRyaWVzKiBsZWZpUGluX3BvcnQgKGNvbnN0IGxlZmlQaW4qIG9iaiwgaW50ICBpbmRleCk7Ci0KLUVYVEVSTiBpbnQgbGVmaVBpbl9udW1Gb3JlaWducyAoY29uc3QgbGVmaVBpbiogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBsZWZpUGluX2ZvcmVpZ25OYW1lIChjb25zdCBsZWZpUGluKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGNvbnN0IGNoYXIqIGxlZmlQaW5fdGFwZXJSdWxlIChjb25zdCBsZWZpUGluKiBvYmopOwotRVhURVJOIGludCBsZWZpUGluX2ZvcmVpZ25PcmllbnQgKGNvbnN0IGxlZmlQaW4qIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY29uc3QgY2hhciogbGVmaVBpbl9mb3JlaWduT3JpZW50U3RyIChjb25zdCBsZWZpUGluKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGRvdWJsZSBsZWZpUGluX2ZvcmVpZ25YIChjb25zdCBsZWZpUGluKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGRvdWJsZSBsZWZpUGluX2ZvcmVpZ25ZIChjb25zdCBsZWZpUGluKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGNvbnN0IGNoYXIqIGxlZmlQaW5fTEVRIChjb25zdCBsZWZpUGluKiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGxlZmlQaW5fZGlyZWN0aW9uIChjb25zdCBsZWZpUGluKiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGxlZmlQaW5fdXNlIChjb25zdCBsZWZpUGluKiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGxlZmlQaW5fc2hhcGUgKGNvbnN0IGxlZmlQaW4qIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogbGVmaVBpbl9tdXN0am9pbiAoY29uc3QgbGVmaVBpbiogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaVBpbl9vdXRNYXJnaW5IaWdoIChjb25zdCBsZWZpUGluKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpUGluX291dE1hcmdpbkxvdyAoY29uc3QgbGVmaVBpbiogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaVBpbl9vdXRSZXNpc3RhbmNlSGlnaCAoY29uc3QgbGVmaVBpbiogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaVBpbl9vdXRSZXNpc3RhbmNlTG93IChjb25zdCBsZWZpUGluKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpUGluX2luTWFyZ2luSGlnaCAoY29uc3QgbGVmaVBpbiogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaVBpbl9pbk1hcmdpbkxvdyAoY29uc3QgbGVmaVBpbiogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaVBpbl9wb3dlciAoY29uc3QgbGVmaVBpbiogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaVBpbl9sZWFrYWdlIChjb25zdCBsZWZpUGluKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpUGluX21heGxvYWQgKGNvbnN0IGxlZmlQaW4qIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlQaW5fbWF4ZGVsYXkgKGNvbnN0IGxlZmlQaW4qIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlQaW5fY2FwYWNpdGFuY2UgKGNvbnN0IGxlZmlQaW4qIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlQaW5fcmVzaXN0YW5jZSAoY29uc3QgbGVmaVBpbiogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaVBpbl9wdWxsZG93bnJlcyAoY29uc3QgbGVmaVBpbiogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaVBpbl90aWVvZmZyIChjb25zdCBsZWZpUGluKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpUGluX1ZISSAoY29uc3QgbGVmaVBpbiogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaVBpbl9WTE8gKGNvbnN0IGxlZmlQaW4qIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlQaW5fcmlzZVZvbHRhZ2UgKGNvbnN0IGxlZmlQaW4qIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlQaW5fZmFsbFZvbHRhZ2UgKGNvbnN0IGxlZmlQaW4qIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlQaW5fcmlzZVRocmVzaCAoY29uc3QgbGVmaVBpbiogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaVBpbl9mYWxsVGhyZXNoIChjb25zdCBsZWZpUGluKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpUGluX3Jpc2VTYXRjdXIgKGNvbnN0IGxlZmlQaW4qIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlQaW5fZmFsbFNhdGN1ciAoY29uc3QgbGVmaVBpbiogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaVBpbl9yaXNlU2xld0xpbWl0IChjb25zdCBsZWZpUGluKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpUGluX2ZhbGxTbGV3TGltaXQgKGNvbnN0IGxlZmlQaW4qIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogbGVmaVBpbl9jdXJyZW50U291cmNlIChjb25zdCBsZWZpUGluKiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGxlZmlQaW5fdGFibGVIaWdoTmFtZSAoY29uc3QgbGVmaVBpbiogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBsZWZpUGluX3RhYmxlTG93TmFtZSAoY29uc3QgbGVmaVBpbiogb2JqKTsKLQotRVhURVJOIGludCBsZWZpUGluX251bUFudGVubmFTaXplIChjb25zdCBsZWZpUGluKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpUGluX2FudGVubmFTaXplIChjb25zdCBsZWZpUGluKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGNvbnN0IGNoYXIqIGxlZmlQaW5fYW50ZW5uYVNpemVMYXllciAoY29uc3QgbGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KTsKLQotRVhURVJOIGludCBsZWZpUGluX251bUFudGVubmFNZXRhbEFyZWEgKGNvbnN0IGxlZmlQaW4qIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlQaW5fYW50ZW5uYU1ldGFsQXJlYSAoY29uc3QgbGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBjb25zdCBjaGFyKiBsZWZpUGluX2FudGVubmFNZXRhbEFyZWFMYXllciAoY29uc3QgbGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KTsKLQotRVhURVJOIGludCBsZWZpUGluX251bUFudGVubmFNZXRhbExlbmd0aCAoY29uc3QgbGVmaVBpbiogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaVBpbl9hbnRlbm5hTWV0YWxMZW5ndGggKGNvbnN0IGxlZmlQaW4qIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY29uc3QgY2hhciogbGVmaVBpbl9hbnRlbm5hTWV0YWxMZW5ndGhMYXllciAoY29uc3QgbGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KTsKLQotRVhURVJOIGludCBsZWZpUGluX251bUFudGVubmFQYXJ0aWFsTWV0YWxBcmVhIChjb25zdCBsZWZpUGluKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpUGluX2FudGVubmFQYXJ0aWFsTWV0YWxBcmVhIChjb25zdCBsZWZpUGluKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGNvbnN0IGNoYXIqIGxlZmlQaW5fYW50ZW5uYVBhcnRpYWxNZXRhbEFyZWFMYXllciAoY29uc3QgbGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KTsKLQotRVhURVJOIGludCBsZWZpUGluX251bUFudGVubmFQYXJ0aWFsTWV0YWxTaWRlQXJlYSAoY29uc3QgbGVmaVBpbiogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaVBpbl9hbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWEgKGNvbnN0IGxlZmlQaW4qIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY29uc3QgY2hhciogbGVmaVBpbl9hbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWFMYXllciAoY29uc3QgbGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KTsKLQotRVhURVJOIGludCBsZWZpUGluX251bUFudGVubmFQYXJ0aWFsQ3V0QXJlYSAoY29uc3QgbGVmaVBpbiogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaVBpbl9hbnRlbm5hUGFydGlhbEN1dEFyZWEgKGNvbnN0IGxlZmlQaW4qIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY29uc3QgY2hhciogbGVmaVBpbl9hbnRlbm5hUGFydGlhbEN1dEFyZWFMYXllciAoY29uc3QgbGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KTsKLQotRVhURVJOIGludCBsZWZpUGluX251bUFudGVubmFEaWZmQXJlYSAoY29uc3QgbGVmaVBpbiogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaVBpbl9hbnRlbm5hRGlmZkFyZWEgKGNvbnN0IGxlZmlQaW4qIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY29uc3QgY2hhciogbGVmaVBpbl9hbnRlbm5hRGlmZkFyZWFMYXllciAoY29uc3QgbGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KTsKLQotICAvKiA1LjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBjb25zdCBjaGFyKiBsZWZpUGluX25ldEV4cHIgKGNvbnN0IGxlZmlQaW4qIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogbGVmaVBpbl9zdXBwbHlTZW5zaXRpdml0eSAoY29uc3QgbGVmaVBpbiogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBsZWZpUGluX2dyb3VuZFNlbnNpdGl2aXR5IChjb25zdCBsZWZpUGluKiBvYmopOwotCi0gIC8qIDUuNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZpUGluX251bUFudGVubmFNb2RlbCAoY29uc3QgbGVmaVBpbiogb2JqKTsKLUVYVEVSTiBjb25zdCBsZWZpUGluQW50ZW5uYU1vZGVsKiBsZWZpUGluX2FudGVubmFNb2RlbCAoY29uc3QgbGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KTsKLQotRVhURVJOIGludCBsZWZpUGluX251bVByb3BlcnRpZXMgKGNvbnN0IGxlZmlQaW4qIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogbGVmaVBpbl9wcm9wTmFtZSAoY29uc3QgbGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBjb25zdCBjaGFyKiBsZWZpUGluX3Byb3BWYWx1ZSAoY29uc3QgbGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBkb3VibGUgbGVmaVBpbl9wcm9wTnVtIChjb25zdCBsZWZpUGluKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGNvbnN0IGNoYXIgbGVmaVBpbl9wcm9wVHlwZSAoY29uc3QgbGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgbGVmaVBpbl9wcm9wSXNOdW1iZXIgKGNvbnN0IGxlZmlQaW4qIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGxlZmlQaW5fcHJvcElzU3RyaW5nIChjb25zdCBsZWZpUGluKiBvYmosIGludCAgaW5kZXgpOwotCi1FWFRFUk4gdm9pZCBsZWZpUGluX3ByaW50IChjb25zdCBsZWZpUGluKiBvYmosIEZJTEUqICBmKTsKLQotICAvKiA1LjUgQW50ZW5uYU1vZGVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotLyogNS42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotRVhURVJOIGludCBsZWZpRGVuc2l0eV9udW1MYXllciAoY29uc3QgbGVmaURlbnNpdHkqIG9iaik7Ci1FWFRFUk4gY2hhciogbGVmaURlbnNpdHlfbGF5ZXJOYW1lIChjb25zdCBsZWZpRGVuc2l0eSogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgbGVmaURlbnNpdHlfbnVtUmVjdHMgKGNvbnN0IGxlZmlEZW5zaXR5KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIHN0cnVjdCBsZWZpR2VvbVJlY3QgbGVmaURlbnNpdHlfZ2V0UmVjdCAoY29uc3QgbGVmaURlbnNpdHkqIG9iaiwgaW50ICBpbmRleCwgaW50ICByZWN0SW5kZXgpOwotRVhURVJOIGRvdWJsZSBsZWZpRGVuc2l0eV9kZW5zaXR5VmFsdWUgKGNvbnN0IGxlZmlEZW5zaXR5KiBvYmosIGludCAgaW5kZXgsIGludCAgcmVjdEluZGV4KTsKLQotRVhURVJOIHZvaWQgbGVmaURlbnNpdHlfcHJpbnQgKGNvbnN0IGxlZmlEZW5zaXR5KiBvYmosIEZJTEUqICBmKTsKLQotICAvKiBvcmllbnQ9LTEgbWVhbnMgbm8gb3JpZW50IHdhcyBzcGVjaWZpZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotRVhURVJOIGludCBsZWZpTWFjcm9faGFzQ2xhc3MgKGNvbnN0IGxlZmlNYWNybyogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaU1hY3JvX2hhc0dlbmVyYXRvciAoY29uc3QgbGVmaU1hY3JvKiBvYmopOwotRVhURVJOIGludCBsZWZpTWFjcm9faGFzR2VuZXJhdGUgKGNvbnN0IGxlZmlNYWNybyogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaU1hY3JvX2hhc1Bvd2VyIChjb25zdCBsZWZpTWFjcm8qIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlNYWNyb19oYXNPcmlnaW4gKGNvbnN0IGxlZmlNYWNybyogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaU1hY3JvX2hhc0VFUSAoY29uc3QgbGVmaU1hY3JvKiBvYmopOwotRVhURVJOIGludCBsZWZpTWFjcm9faGFzTEVRIChjb25zdCBsZWZpTWFjcm8qIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlNYWNyb19oYXNTb3VyY2UgKGNvbnN0IGxlZmlNYWNybyogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaU1hY3JvX2hhc1hTeW1tZXRyeSAoY29uc3QgbGVmaU1hY3JvKiBvYmopOwotRVhURVJOIGludCBsZWZpTWFjcm9faGFzWVN5bW1ldHJ5IChjb25zdCBsZWZpTWFjcm8qIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlNYWNyb19oYXM5MFN5bW1ldHJ5IChjb25zdCBsZWZpTWFjcm8qIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlNYWNyb19oYXNTaXRlTmFtZSAoY29uc3QgbGVmaU1hY3JvKiBvYmopOwotRVhURVJOIGludCBsZWZpTWFjcm9faGFzU2l0ZVBhdHRlcm4gKGNvbnN0IGxlZmlNYWNybyogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaU1hY3JvX2hhc1NpemUgKGNvbnN0IGxlZmlNYWNybyogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaU1hY3JvX2hhc0ZvcmVpZ24gKGNvbnN0IGxlZmlNYWNybyogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaU1hY3JvX2hhc0ZvcmVpZ25PcmlnaW4gKGNvbnN0IGxlZmlNYWNybyogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgbGVmaU1hY3JvX2hhc0ZvcmVpZ25PcmllbnQgKGNvbnN0IGxlZmlNYWNybyogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgbGVmaU1hY3JvX2hhc0ZvcmVpZ25Qb2ludCAoY29uc3QgbGVmaU1hY3JvKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBsZWZpTWFjcm9faGFzQ2xvY2tUeXBlIChjb25zdCBsZWZpTWFjcm8qIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlNYWNyb19pc0J1ZmZlciAoY29uc3QgbGVmaU1hY3JvKiBvYmopOwotRVhURVJOIGludCBsZWZpTWFjcm9faXNJbnZlcnRlciAoY29uc3QgbGVmaU1hY3JvKiBvYmopOwotRVhURVJOIGludCBsZWZpTWFjcm9faXNGaXhlZE1hc2sgKGNvbnN0IGxlZmlNYWNybyogb2JqKTsKLQotRVhURVJOIGludCBsZWZpTWFjcm9fbnVtU2l0ZVBhdHRlcm4gKGNvbnN0IGxlZmlNYWNybyogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaU1hY3JvX251bVByb3BlcnRpZXMgKGNvbnN0IGxlZmlNYWNybyogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBsZWZpTWFjcm9fcHJvcE5hbWUgKGNvbnN0IGxlZmlNYWNybyogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBjb25zdCBjaGFyKiBsZWZpTWFjcm9fcHJvcFZhbHVlIChjb25zdCBsZWZpTWFjcm8qIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGxlZmlNYWNyb19wcm9wTnVtIChjb25zdCBsZWZpTWFjcm8qIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY29uc3QgY2hhciBsZWZpTWFjcm9fcHJvcFR5cGUgKGNvbnN0IGxlZmlNYWNybyogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgbGVmaU1hY3JvX3Byb3BJc051bWJlciAoY29uc3QgbGVmaU1hY3JvKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBsZWZpTWFjcm9fcHJvcElzU3RyaW5nIChjb25zdCBsZWZpTWFjcm8qIG9iaiwgaW50ICBpbmRleCk7Ci0KLUVYVEVSTiBjb25zdCBjaGFyKiBsZWZpTWFjcm9fbmFtZSAoY29uc3QgbGVmaU1hY3JvKiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGxlZmlNYWNyb19tYWNyb0NsYXNzIChjb25zdCBsZWZpTWFjcm8qIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogbGVmaU1hY3JvX2dlbmVyYXRvciAoY29uc3QgbGVmaU1hY3JvKiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGxlZmlNYWNyb19FRVEgKGNvbnN0IGxlZmlNYWNybyogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBsZWZpTWFjcm9fTEVRIChjb25zdCBsZWZpTWFjcm8qIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogbGVmaU1hY3JvX3NvdXJjZSAoY29uc3QgbGVmaU1hY3JvKiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGxlZmlNYWNyb19jbG9ja1R5cGUgKGNvbnN0IGxlZmlNYWNybyogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaU1hY3JvX29yaWdpblggKGNvbnN0IGxlZmlNYWNybyogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaU1hY3JvX29yaWdpblkgKGNvbnN0IGxlZmlNYWNybyogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaU1hY3JvX3Bvd2VyIChjb25zdCBsZWZpTWFjcm8qIG9iaik7Ci1FWFRFUk4gdm9pZCBsZWZpTWFjcm9fZ2VuZXJhdGUgKGNvbnN0IGxlZmlNYWNybyogb2JqLCBjaGFyKiogIG5hbWUxLCBjaGFyKiogIG5hbWUyKTsKLUVYVEVSTiBjb25zdCBsZWZpU2l0ZVBhdHRlcm4qIGxlZmlNYWNyb19zaXRlUGF0dGVybiAoY29uc3QgbGVmaU1hY3JvKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGNvbnN0IGNoYXIqIGxlZmlNYWNyb19zaXRlTmFtZSAoY29uc3QgbGVmaU1hY3JvKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpTWFjcm9fc2l6ZVggKGNvbnN0IGxlZmlNYWNybyogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaU1hY3JvX3NpemVZIChjb25zdCBsZWZpTWFjcm8qIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlNYWNyb19udW1Gb3JlaWducyAoY29uc3QgbGVmaU1hY3JvKiBvYmopOwotRVhURVJOIGludCBsZWZpTWFjcm9fZm9yZWlnbk9yaWVudCAoY29uc3QgbGVmaU1hY3JvKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGNvbnN0IGNoYXIqIGxlZmlNYWNyb19mb3JlaWduT3JpZW50U3RyIChjb25zdCBsZWZpTWFjcm8qIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGxlZmlNYWNyb19mb3JlaWduWCAoY29uc3QgbGVmaU1hY3JvKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGRvdWJsZSBsZWZpTWFjcm9fZm9yZWlnblkgKGNvbnN0IGxlZmlNYWNybyogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBjb25zdCBjaGFyKiBsZWZpTWFjcm9fZm9yZWlnbk5hbWUgKGNvbnN0IGxlZmlNYWNybyogb2JqLCBpbnQgIGluZGV4KTsKLQotICAvKiBEZWJ1ZyBwcmludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiB2b2lkIGxlZmlNYWNyb19wcmludCAoY29uc3QgbGVmaU1hY3JvKiBvYmosIEZJTEUqICBmKTsKLQotICAvKiBhZGRTREYyUGlucyAmIGFkZFNERjFQaW4gYXJlIGZvciA1LjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAvKiBUaGUgZm9sbG93aW5nIGFyZSBmb3IgNS4xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi9sZWZpTWlzYy5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYvbGVmaU1pc2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBhMzE5My4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi9sZWZpTWlzYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQ29weXJpZ2h0IDIwMTIgLSAyMDE0LCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZSAgICAgICAgICAgICAqLwotLyogRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAqLwotLyogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgKi8KLS8qICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAqLwotLyogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgKi8KLS8qICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgICAgICovCi0vKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgICAgICAqLwotLyogICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LCAgICAgICAgICAqLwotLyogY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJEF1dGhvcjogZGVsbCAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJFJldmlzaW9uOiAjMSAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICREYXRlOiAyMDE3LzA2LzA2ICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkU3RhdGU6ICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotCi0jaWZuZGVmIENMRUZJTUlTQ19ICi0jZGVmaW5lIENMRUZJTUlTQ19ICi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImxlZmlUeXBlZGVmcy5oIgotCi0vKiBUaGUgZGlmZmVyZW50IHR5cGVzIG9mIGl0ZW1zIGluIGEgZ2VvbWV0cnkgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi1lbnVtIGxlZmlHZW9tRW51bSB7Ci0gIGxlZmlHZW9tVW5rbm93biA9IDAsCi0gIGxlZmlHZW9tTGF5ZXJFID0gMSwKLSAgbGVmaUdlb21MYXllckV4Y2VwdFBnTmV0RSA9IDIsCi0gIGxlZmlHZW9tTGF5ZXJNaW5TcGFjaW5nRSA9IDMsCi0gIGxlZmlHZW9tTGF5ZXJSdWxlV2lkdGhFID0gNCwKLSAgbGVmaUdlb21XaWR0aEUgPSA1LAotICBsZWZpR2VvbVBhdGhFID0gNiwKLSAgbGVmaUdlb21QYXRoSXRlckUgPSA3LAotICBsZWZpR2VvbVJlY3RFID0gOCwKLSAgbGVmaUdlb21SZWN0SXRlckUgPSA5LAotICBsZWZpR2VvbVBvbHlnb25FID0gMTAsCi0gIGxlZmlHZW9tUG9seWdvbkl0ZXJFID0gMTEsCi0gIGxlZmlHZW9tVmlhRSA9IDEyLAotICBsZWZpR2VvbVZpYUl0ZXJFID0gMTMsCi0gIGxlZmlHZW9tQ2xhc3NFID0gMTQsCi0gIGxlZmlHZW9tRW5kID0gMTUKLX07Ci0KLS8qICBwY3IgNDgxNzgzICYgNTYwNTA0Ci0qLwotCi1FWFRFUk4gaW50IGxlZmlHZW9tZXRyaWVzX251bUl0ZW1zIChjb25zdCBsZWZpR2VvbWV0cmllcyogb2JqKTsKLUVYVEVSTiBlbnVtIGxlZmlHZW9tRW51bSBsZWZpR2VvbWV0cmllc19pdGVtVHlwZSAoY29uc3QgbGVmaUdlb21ldHJpZXMqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gc3RydWN0IGxlZmlHZW9tUmVjdCogbGVmaUdlb21ldHJpZXNfZ2V0UmVjdCAoY29uc3QgbGVmaUdlb21ldHJpZXMqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gc3RydWN0IGxlZmlHZW9tUmVjdEl0ZXIqIGxlZmlHZW9tZXRyaWVzX2dldFJlY3RJdGVyIChjb25zdCBsZWZpR2VvbWV0cmllcyogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBzdHJ1Y3QgbGVmaUdlb21QYXRoKiBsZWZpR2VvbWV0cmllc19nZXRQYXRoIChjb25zdCBsZWZpR2VvbWV0cmllcyogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBzdHJ1Y3QgbGVmaUdlb21QYXRoSXRlciogbGVmaUdlb21ldHJpZXNfZ2V0UGF0aEl0ZXIgKGNvbnN0IGxlZmlHZW9tZXRyaWVzKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBsZWZpR2VvbWV0cmllc19oYXNMYXllckV4Y2VwdFBnTmV0IChjb25zdCBsZWZpR2VvbWV0cmllcyogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBjaGFyKiBsZWZpR2VvbWV0cmllc19nZXRMYXllciAoY29uc3QgbGVmaUdlb21ldHJpZXMqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGxlZmlHZW9tZXRyaWVzX2dldExheWVyTWluU3BhY2luZyAoY29uc3QgbGVmaUdlb21ldHJpZXMqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGxlZmlHZW9tZXRyaWVzX2dldExheWVyUnVsZVdpZHRoIChjb25zdCBsZWZpR2VvbWV0cmllcyogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBkb3VibGUgbGVmaUdlb21ldHJpZXNfZ2V0V2lkdGggKGNvbnN0IGxlZmlHZW9tZXRyaWVzKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIHN0cnVjdCBsZWZpR2VvbVBvbHlnb24qIGxlZmlHZW9tZXRyaWVzX2dldFBvbHlnb24gKGNvbnN0IGxlZmlHZW9tZXRyaWVzKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIHN0cnVjdCBsZWZpR2VvbVBvbHlnb25JdGVyKiBsZWZpR2VvbWV0cmllc19nZXRQb2x5Z29uSXRlciAoY29uc3QgbGVmaUdlb21ldHJpZXMqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY2hhciogbGVmaUdlb21ldHJpZXNfZ2V0Q2xhc3MgKGNvbnN0IGxlZmlHZW9tZXRyaWVzKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIHN0cnVjdCBsZWZpR2VvbVZpYSogbGVmaUdlb21ldHJpZXNfZ2V0VmlhIChjb25zdCBsZWZpR2VvbWV0cmllcyogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBzdHJ1Y3QgbGVmaUdlb21WaWFJdGVyKiBsZWZpR2VvbWV0cmllc19nZXRWaWFJdGVyIChjb25zdCBsZWZpR2VvbWV0cmllcyogb2JqLCBpbnQgIGluZGV4KTsKLQotRVhURVJOIHZvaWQgbGVmaUdlb21ldHJpZXNfcHJpbnQgKGNvbnN0IGxlZmlHZW9tZXRyaWVzKiBvYmosIEZJTEUqICBmKTsKLQotRVhURVJOIGludCBsZWZpU3BhY2luZ19oYXNTdGFjayAoY29uc3QgbGVmaVNwYWNpbmcqIG9iaik7Ci0KLUVYVEVSTiBjb25zdCBjaGFyKiBsZWZpU3BhY2luZ19uYW1lMSAoY29uc3QgbGVmaVNwYWNpbmcqIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogbGVmaVNwYWNpbmdfbmFtZTIgKGNvbnN0IGxlZmlTcGFjaW5nKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpU3BhY2luZ19kaXN0YW5jZSAoY29uc3QgbGVmaVNwYWNpbmcqIG9iaik7Ci0KLSAgLyogRGVidWcgcHJpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gdm9pZCBsZWZpU3BhY2luZ19wcmludCAoY29uc3QgbGVmaVNwYWNpbmcqIG9iaiwgRklMRSogIGYpOwotCi1FWFRFUk4gY29uc3QgY2hhciogbGVmaUlSRHJvcF9uYW1lIChjb25zdCBsZWZpSVJEcm9wKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpSVJEcm9wX3ZhbHVlMSAoY29uc3QgbGVmaUlSRHJvcCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBkb3VibGUgbGVmaUlSRHJvcF92YWx1ZTIgKGNvbnN0IGxlZmlJUkRyb3AqIG9iaiwgaW50ICBpbmRleCk7Ci0KLUVYVEVSTiBpbnQgbGVmaUlSRHJvcF9udW1WYWx1ZXMgKGNvbnN0IGxlZmlJUkRyb3AqIG9iaik7Ci0KLSAgLyogRGVidWcgcHJpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gdm9pZCBsZWZpSVJEcm9wX3ByaW50IChjb25zdCBsZWZpSVJEcm9wKiBvYmosIEZJTEUqICBmKTsKLQotRVhURVJOIGRvdWJsZSBsZWZpTWluRmVhdHVyZV9vbmUgKGNvbnN0IGxlZmlNaW5GZWF0dXJlKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpTWluRmVhdHVyZV90d28gKGNvbnN0IGxlZmlNaW5GZWF0dXJlKiBvYmopOwotCi0gIC8qIERlYnVnIHByaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIHZvaWQgbGVmaU1pbkZlYXR1cmVfcHJpbnQgKGNvbnN0IGxlZmlNaW5GZWF0dXJlKiBvYmosIEZJTEUqICBmKTsKLQotRVhURVJOIGNvbnN0IGNoYXIqIGxlZmlTaXRlX25hbWUgKGNvbnN0IGxlZmlTaXRlKiBvYmopOwotRVhURVJOIGludCBsZWZpU2l0ZV9oYXNDbGFzcyAoY29uc3QgbGVmaVNpdGUqIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogbGVmaVNpdGVfc2l0ZUNsYXNzIChjb25zdCBsZWZpU2l0ZSogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaVNpdGVfc2l6ZVggKGNvbnN0IGxlZmlTaXRlKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpU2l0ZV9zaXplWSAoY29uc3QgbGVmaVNpdGUqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlTaXRlX2hhc1NpemUgKGNvbnN0IGxlZmlTaXRlKiBvYmopOwotRVhURVJOIGludCBsZWZpU2l0ZV9oYXNYU3ltbWV0cnkgKGNvbnN0IGxlZmlTaXRlKiBvYmopOwotRVhURVJOIGludCBsZWZpU2l0ZV9oYXNZU3ltbWV0cnkgKGNvbnN0IGxlZmlTaXRlKiBvYmopOwotRVhURVJOIGludCBsZWZpU2l0ZV9oYXM5MFN5bW1ldHJ5IChjb25zdCBsZWZpU2l0ZSogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaVNpdGVfaGFzUm93UGF0dGVybiAoY29uc3QgbGVmaVNpdGUqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlTaXRlX251bVNpdGVzIChjb25zdCBsZWZpU2l0ZSogb2JqKTsKLUVYVEVSTiBjaGFyKiBsZWZpU2l0ZV9zaXRlTmFtZSAoY29uc3QgbGVmaVNpdGUqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGxlZmlTaXRlX3NpdGVPcmllbnQgKGNvbnN0IGxlZmlTaXRlKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGNoYXIqIGxlZmlTaXRlX3NpdGVPcmllbnRTdHIgKGNvbnN0IGxlZmlTaXRlKiBvYmosIGludCAgaW5kZXgpOwotCi0gIC8qIERlYnVnIHByaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIHZvaWQgbGVmaVNpdGVfcHJpbnQgKGNvbnN0IGxlZmlTaXRlKiBvYmosIEZJTEUqICBmKTsKLQotRVhURVJOIGNvbnN0IGNoYXIqIGxlZmlTaXRlUGF0dGVybl9uYW1lIChjb25zdCBsZWZpU2l0ZVBhdHRlcm4qIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlTaXRlUGF0dGVybl9vcmllbnQgKGNvbnN0IGxlZmlTaXRlUGF0dGVybiogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBsZWZpU2l0ZVBhdHRlcm5fb3JpZW50U3RyIChjb25zdCBsZWZpU2l0ZVBhdHRlcm4qIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlTaXRlUGF0dGVybl94IChjb25zdCBsZWZpU2l0ZVBhdHRlcm4qIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlTaXRlUGF0dGVybl95IChjb25zdCBsZWZpU2l0ZVBhdHRlcm4qIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlTaXRlUGF0dGVybl9oYXNTdGVwUGF0dGVybiAoY29uc3QgbGVmaVNpdGVQYXR0ZXJuKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpU2l0ZVBhdHRlcm5feFN0YXJ0IChjb25zdCBsZWZpU2l0ZVBhdHRlcm4qIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlTaXRlUGF0dGVybl95U3RhcnQgKGNvbnN0IGxlZmlTaXRlUGF0dGVybiogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaVNpdGVQYXR0ZXJuX3hTdGVwIChjb25zdCBsZWZpU2l0ZVBhdHRlcm4qIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlTaXRlUGF0dGVybl95U3RlcCAoY29uc3QgbGVmaVNpdGVQYXR0ZXJuKiBvYmopOwotCi0gIC8qIERlYnVnIHByaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIHZvaWQgbGVmaVNpdGVQYXR0ZXJuX3ByaW50IChjb25zdCBsZWZpU2l0ZVBhdHRlcm4qIG9iaiwgRklMRSogIGYpOwotCi1FWFRFUk4gY29uc3QgY2hhciogbGVmaVRyYWNrUGF0dGVybl9uYW1lIChjb25zdCBsZWZpVHJhY2tQYXR0ZXJuKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpVHJhY2tQYXR0ZXJuX3N0YXJ0IChjb25zdCBsZWZpVHJhY2tQYXR0ZXJuKiBvYmopOwotRVhURVJOIGludCBsZWZpVHJhY2tQYXR0ZXJuX251bVRyYWNrcyAoY29uc3QgbGVmaVRyYWNrUGF0dGVybiogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaVRyYWNrUGF0dGVybl9zcGFjZSAoY29uc3QgbGVmaVRyYWNrUGF0dGVybiogb2JqKTsKLQotRVhURVJOIGludCBsZWZpVHJhY2tQYXR0ZXJuX251bUxheWVycyAoY29uc3QgbGVmaVRyYWNrUGF0dGVybiogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBsZWZpVHJhY2tQYXR0ZXJuX2xheWVyTmFtZSAoY29uc3QgbGVmaVRyYWNrUGF0dGVybiogb2JqLCBpbnQgIGluZGV4KTsKLQotICAvKiBEZWJ1ZyBwcmludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiB2b2lkIGxlZmlUcmFja1BhdHRlcm5fcHJpbnQgKGNvbnN0IGxlZmlUcmFja1BhdHRlcm4qIG9iaiwgRklMRSogIGYpOwotCi1FWFRFUk4gY29uc3QgY2hhciogbGVmaUdjZWxsUGF0dGVybl9uYW1lIChjb25zdCBsZWZpR2NlbGxQYXR0ZXJuKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpR2NlbGxQYXR0ZXJuX3N0YXJ0IChjb25zdCBsZWZpR2NlbGxQYXR0ZXJuKiBvYmopOwotRVhURVJOIGludCBsZWZpR2NlbGxQYXR0ZXJuX251bUNScyAoY29uc3QgbGVmaUdjZWxsUGF0dGVybiogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaUdjZWxsUGF0dGVybl9zcGFjZSAoY29uc3QgbGVmaUdjZWxsUGF0dGVybiogb2JqKTsKLQotICAvKiBEZWJ1ZyBwcmludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiB2b2lkIGxlZmlHY2VsbFBhdHRlcm5fcHJpbnQgKGNvbnN0IGxlZmlHY2VsbFBhdHRlcm4qIG9iaiwgRklMRSogIGYpOwotCi1FWFRFUk4gY29uc3QgY2hhciogbGVmaVVzZU1pblNwYWNpbmdfbmFtZSAoY29uc3QgbGVmaVVzZU1pblNwYWNpbmcqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlVc2VNaW5TcGFjaW5nX3ZhbHVlIChjb25zdCBsZWZpVXNlTWluU3BhY2luZyogb2JqKTsKLQotICAvKiBEZWJ1ZyBwcmludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiB2b2lkIGxlZmlVc2VNaW5TcGFjaW5nX3ByaW50IChjb25zdCBsZWZpVXNlTWluU3BhY2luZyogb2JqLCBGSUxFKiAgZik7Ci0KLS8qIDUuNSBmb3IgTWF4aW11bSBTdGFja2VkLXZpYSBydWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLUVYVEVSTiBpbnQgbGVmaU1heFN0YWNrVmlhX21heFN0YWNrVmlhIChjb25zdCBsZWZpTWF4U3RhY2tWaWEqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlNYXhTdGFja1ZpYV9oYXNNYXhTdGFja1ZpYVJhbmdlIChjb25zdCBsZWZpTWF4U3RhY2tWaWEqIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogbGVmaU1heFN0YWNrVmlhX21heFN0YWNrVmlhQm90dG9tTGF5ZXIgKGNvbnN0IGxlZmlNYXhTdGFja1ZpYSogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBsZWZpTWF4U3RhY2tWaWFfbWF4U3RhY2tWaWFUb3BMYXllciAoY29uc3QgbGVmaU1heFN0YWNrVmlhKiBvYmopOwotCi0gIC8qIERlYnVnIHByaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIHZvaWQgbGVmaU1heFN0YWNrVmlhX3ByaW50IChjb25zdCBsZWZpTWF4U3RhY2tWaWEqIG9iaiwgRklMRSogIGYpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL2xlZmlOb25EZWZhdWx0LmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi9sZWZpTm9uRGVmYXVsdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzIxMDcyLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL2xlZmlOb25EZWZhdWx0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qIEFUVEVOVElPTjogVEhJUyBJUyBBTiBBVVRPLUdFTkVSQVRFRCBGSUxFLiBETyBOT1QgQ0hBTkdFIElUISAgICAgICAgICAgICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qIENvcHlyaWdodCAyMDEyIC0gMjAxMywgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UgICAgICAgICAgICAgKi8KLS8qIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7ICAgICAgICAgICAgKi8KLS8qICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gICAgICAgICovCi0vKiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAgICAgKi8KLS8qICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsICAgICAgICovCi0vKiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICAgICAqLwotLyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICAgICAgKi8KLS8qICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwgICAgICAgICAgKi8KLS8qIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRBdXRob3I6IGRlbGwgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJFJldmlzaW9uOiAjMSAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJERhdGU6IDIwMTcvMDYvMDYgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkU3RhdGU6ICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotCi0jaWZuZGVmIENMRUZJTk9OREVGQVVMVF9ICi0jZGVmaW5lIENMRUZJTk9OREVGQVVMVF9ICi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImxlZmlUeXBlZGVmcy5oIgotCi1FWFRFUk4gY29uc3QgY2hhciogbGVmaU5vbkRlZmF1bHRfbmFtZSAoY29uc3QgbGVmaU5vbkRlZmF1bHQqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlOb25EZWZhdWx0X2hhc0hhcmRzcGFjaW5nIChjb25zdCBsZWZpTm9uRGVmYXVsdCogb2JqKTsKLQotRVhURVJOIGludCBsZWZpTm9uRGVmYXVsdF9udW1Qcm9wcyAoY29uc3QgbGVmaU5vbkRlZmF1bHQqIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogbGVmaU5vbkRlZmF1bHRfcHJvcE5hbWUgKGNvbnN0IGxlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGNvbnN0IGNoYXIqIGxlZmlOb25EZWZhdWx0X3Byb3BWYWx1ZSAoY29uc3QgbGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGxlZmlOb25EZWZhdWx0X3Byb3BOdW1iZXIgKGNvbnN0IGxlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGNvbnN0IGNoYXIgbGVmaU5vbkRlZmF1bHRfcHJvcFR5cGUgKGNvbnN0IGxlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBsZWZpTm9uRGVmYXVsdF9wcm9wSXNOdW1iZXIgKGNvbnN0IGxlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBsZWZpTm9uRGVmYXVsdF9wcm9wSXNTdHJpbmcgKGNvbnN0IGxlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpOwotCi0gIC8qIEEgbm9uIGRlZmF1bHQgcnVsZSBjYW4gaGF2ZSBvbmUgb3IgbW9yZSBsYXllcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbGF5ZXIgaW5mb3JtYXRpb24gaXMga2VwdCBpbiBhbiBhcnJheS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmaU5vbkRlZmF1bHRfbnVtTGF5ZXJzIChjb25zdCBsZWZpTm9uRGVmYXVsdCogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBsZWZpTm9uRGVmYXVsdF9sYXllck5hbWUgKGNvbnN0IGxlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBsZWZpTm9uRGVmYXVsdF9oYXNMYXllcldpZHRoIChjb25zdCBsZWZpTm9uRGVmYXVsdCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBkb3VibGUgbGVmaU5vbkRlZmF1bHRfbGF5ZXJXaWR0aCAoY29uc3QgbGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGxlZmlOb25EZWZhdWx0X2hhc0xheWVyU3BhY2luZyAoY29uc3QgbGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGxlZmlOb25EZWZhdWx0X2xheWVyU3BhY2luZyAoY29uc3QgbGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGxlZmlOb25EZWZhdWx0X2hhc0xheWVyV2lyZUV4dGVuc2lvbiAoY29uc3QgbGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGxlZmlOb25EZWZhdWx0X2xheWVyV2lyZUV4dGVuc2lvbiAoY29uc3QgbGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGxlZmlOb25EZWZhdWx0X2hhc0xheWVyUmVzaXN0YW5jZSAoY29uc3QgbGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGxlZmlOb25EZWZhdWx0X2xheWVyUmVzaXN0YW5jZSAoY29uc3QgbGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGxlZmlOb25EZWZhdWx0X2hhc0xheWVyQ2FwYWNpdGFuY2UgKGNvbnN0IGxlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGRvdWJsZSBsZWZpTm9uRGVmYXVsdF9sYXllckNhcGFjaXRhbmNlIChjb25zdCBsZWZpTm9uRGVmYXVsdCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgbGVmaU5vbkRlZmF1bHRfaGFzTGF5ZXJFZGdlQ2FwIChjb25zdCBsZWZpTm9uRGVmYXVsdCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBkb3VibGUgbGVmaU5vbkRlZmF1bHRfbGF5ZXJFZGdlQ2FwIChjb25zdCBsZWZpTm9uRGVmYXVsdCogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgbGVmaU5vbkRlZmF1bHRfaGFzTGF5ZXJEaWFnV2lkdGggKGNvbnN0IGxlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGRvdWJsZSBsZWZpTm9uRGVmYXVsdF9sYXllckRpYWdXaWR0aCAoY29uc3QgbGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCk7Ci0KLSAgLyogQSBub24gZGVmYXVsdCBydWxlIGNhbiBoYXZlIG9uZSBvciBtb3JlIHZpYXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZXNlIHJvdXRpbmVzIHJldHVybiB0aGUgdmlhIGluZm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZpTm9uRGVmYXVsdF9udW1WaWFzIChjb25zdCBsZWZpTm9uRGVmYXVsdCogb2JqKTsKLUVYVEVSTiBjb25zdCBsZWZpVmlhKiBsZWZpTm9uRGVmYXVsdF92aWFSdWxlIChjb25zdCBsZWZpTm9uRGVmYXVsdCogb2JqLCBpbnQgIGluZGV4KTsKLQotICAvKiBBIG5vbiBkZWZhdWx0IHJ1bGUgY2FuIGhhdmUgb25lIG9yIG1vcmUgc3BhY2luZyBydWxlcy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlc2Ugcm91dGluZXMgcmV0dXJuIHRoZSB0aGF0IGluZm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZmlOb25EZWZhdWx0X251bVNwYWNpbmdSdWxlcyAoY29uc3QgbGVmaU5vbkRlZmF1bHQqIG9iaik7Ci1FWFRFUk4gY29uc3QgbGVmaVNwYWNpbmcqIGxlZmlOb25EZWZhdWx0X3NwYWNpbmdSdWxlIChjb25zdCBsZWZpTm9uRGVmYXVsdCogb2JqLCBpbnQgIGluZGV4KTsKLQotRVhURVJOIGludCBsZWZpTm9uRGVmYXVsdF9udW1Vc2VWaWEgKGNvbnN0IGxlZmlOb25EZWZhdWx0KiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGxlZmlOb25EZWZhdWx0X3ZpYU5hbWUgKGNvbnN0IGxlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBsZWZpTm9uRGVmYXVsdF9udW1Vc2VWaWFSdWxlIChjb25zdCBsZWZpTm9uRGVmYXVsdCogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBsZWZpTm9uRGVmYXVsdF92aWFSdWxlTmFtZSAoY29uc3QgbGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGxlZmlOb25EZWZhdWx0X251bU1pbkN1dHMgKGNvbnN0IGxlZmlOb25EZWZhdWx0KiBvYmopOwotRVhURVJOIGNvbnN0IGNoYXIqIGxlZmlOb25EZWZhdWx0X2N1dExheWVyTmFtZSAoY29uc3QgbGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gaW50IGxlZmlOb25EZWZhdWx0X251bUN1dHMgKGNvbnN0IGxlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpOwotCi0gIC8qIERlYnVnIHByaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIC8qIExheWVyIGluZm9ybWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIC8qIDUuNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL2xlZmlQcm9wLmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi9sZWZpUHJvcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDA1NDEyLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL2xlZmlQcm9wLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qIEFUVEVOVElPTjogVEhJUyBJUyBBTiBBVVRPLUdFTkVSQVRFRCBGSUxFLiBETyBOT1QgQ0hBTkdFIElUISAgICAgICAgICAgICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qIENvcHlyaWdodCAyMDEyIC0gMjAxMywgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UgICAgICAgICAgICAgKi8KLS8qIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7ICAgICAgICAgICAgKi8KLS8qICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gICAgICAgICovCi0vKiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAgICAgKi8KLS8qICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsICAgICAgICovCi0vKiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICAgICAqLwotLyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICAgICAgKi8KLS8qICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwgICAgICAgICAgKi8KLS8qIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRBdXRob3I6IGRlbGwgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJFJldmlzaW9uOiAjMSAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJERhdGU6IDIwMTcvMDYvMDYgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkU3RhdGU6ICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotCi0jaWZuZGVmIENMRUZJUFJPUF9ICi0jZGVmaW5lIENMRUZJUFJPUF9ICi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImxlZmlUeXBlZGVmcy5oIgotCi0vKiBTdHJ1Y3QgaG9sZHMgdGhlIGRhdGEgZm9yIG9uZSBwcm9wZXJ0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi1FWFRFUk4gY29uc3QgY2hhciogbGVmaVByb3Bfc3RyaW5nIChjb25zdCBsZWZpUHJvcCogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBsZWZpUHJvcF9wcm9wVHlwZSAoY29uc3QgbGVmaVByb3AqIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogbGVmaVByb3BfcHJvcE5hbWUgKGNvbnN0IGxlZmlQcm9wKiBvYmopOwotRVhURVJOIGNoYXIgbGVmaVByb3BfZGF0YVR5cGUgKGNvbnN0IGxlZmlQcm9wKiBvYmopOwotICAgICAgLyogZWl0aGVyIEk6aW50ZWdlciBSOnJlYWwgUzpzdHJpbmcgUTpxdW90ZWRzdHJpbmcgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIE46cHJvcGVydHkgbmFtZSBpcyBub3QgZGVmaW5lZCBpbiB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbiBzZWN0aW9uICAgICovCi1FWFRFUk4gaW50IGxlZmlQcm9wX2hhc051bWJlciAoY29uc3QgbGVmaVByb3AqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlQcm9wX2hhc1JhbmdlIChjb25zdCBsZWZpUHJvcCogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaVByb3BfaGFzU3RyaW5nIChjb25zdCBsZWZpUHJvcCogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaVByb3BfaGFzTmFtZU1hcFN0cmluZyAoY29uc3QgbGVmaVByb3AqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlQcm9wX251bWJlciAoY29uc3QgbGVmaVByb3AqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlQcm9wX2xlZnQgKGNvbnN0IGxlZmlQcm9wKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpUHJvcF9yaWdodCAoY29uc3QgbGVmaVByb3AqIG9iaik7Ci0KLUVYVEVSTiB2b2lkIGxlZmlQcm9wX3ByaW50IChjb25zdCBsZWZpUHJvcCogb2JqLCBGSUxFKiAgZik7Ci0KLSAgICAgICAgICAgIC8qIE46cHJvcGVydHkgbmFtZSBpcyBub3QgZGVmaW5lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYvbGVmaVByb3BUeXBlLmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi9sZWZpUHJvcFR5cGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgyMzY2MS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi9sZWZpUHJvcFR5cGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQ29weXJpZ2h0IDIwMTIgLSAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZSAgICAgICAgICAgICAqLwotLyogRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAqLwotLyogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgKi8KLS8qICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAqLwotLyogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgKi8KLS8qICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgICAgICovCi0vKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgICAgICAqLwotLyogICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LCAgICAgICAgICAqLwotLyogY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJEF1dGhvcjogZGVsbCAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkUmV2aXNpb246ICMxICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkRGF0ZTogMjAxNy8wNi8wNiAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRTdGF0ZTogICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0KLSNpZm5kZWYgQ0xFRklQUk9QVFlQRV9ICi0jZGVmaW5lIENMRUZJUFJPUFRZUEVfSAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJsZWZpVHlwZWRlZnMuaCIKLQotLyogU3RydWN0IGhvbGRzIHRoZSBkYXRhIHR5cGUgZm9yIG9uZSBwcm9wZXJ0eSwgaWYgdGhlIHByb3BlcnR5IGlzICAgICAgICAgICAgKi8KLS8qIGVpdGhlciBSRUFMIG9yIElOVEVHRVIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLUVYVEVSTiBjb25zdCBjaGFyIGxlZmlQcm9wVHlwZV9wcm9wVHlwZSAoY29uc3QgbGVmaVByb3BUeXBlKiBvYmosIGNoYXIqICBuYW1lKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi9sZWZpVEJJbnQuYyBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL2xlZmlUQkludC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YzM1MDViLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL2xlZmlUQkludC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0gKiBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS43LCBhbmQgaXMgc3ViamVjdCB0byB0aGUgQ2FkZW5jZSBMRUYvREVGCi0gKiBPcGVuIFNvdXJjZSBMaWNlbnNlIEFncmVlbWVudC4gICBZb3VyICBjb250aW51ZWQgIHVzZSAgb2YgdGhpcyBmaWxlCi0gKiBjb25zdGl0dXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlIHRlcm1zIG9mIHRoZSBMRUYvREVGIE9wZW4gU291cmNlCi0gKiBMaWNlbnNlIGFuZCBhbiBhZ3JlZW1lbnQgdG8gYWJpZGUgYnkgaXRzICB0ZXJtcy4gICBJZiB5b3UgIGRvbid0ICBhZ3JlZQotICogd2l0aCAgdGhpcywgeW91IG11c3QgcmVtb3ZlIHRoaXMgYW5kIGFueSBvdGhlciBmaWxlcyB3aGljaCBhcmUgcGFydCBvZiB0aGUKLSAqIGRpc3RyaWJ1dGlvbiBhbmQgIGRlc3Ryb3kgYW55ICBjb3BpZXMgbWFkZS4KLSAqIAotICogRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwgY2hlY2sKLSAqIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLSAqLwotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0vKgotICogbGVmaVRpbWVCb21iCi0gKi8vKiBJbnRlcm5hbCB0aW1lIGJvbWIuICBBbHdheXMgcmV0dXJuIGRhdGUgY3VycmVudCAqLy8qIENoZWNrIHRoZSBjdXJyZW50Ci0gICAgZGF0ZSBhZ2FpbnN0IHRoZSBkYXRlIGdpdmVuICovIGludCAKLWxlZmlWYWxpZFRpbWUoKQotewotICByZXR1cm4gKDEpOwotfQotCi0vKgotICogSW50ZXJuYWwgY2hlY2ssIGFsd2F5cyByZXR1cm4gb2sKLSAqLy8qIENoZWNrIHRoZSBjdXJyZW50IGRhdGUgYWdhaW5zdCB0aGUgZGF0ZSBnaXZlbiAqLyBpbnQgCi1sZWZpVmFsaWRVc2VyKCkKLXsKLSAgcmV0dXJuICgxKTsKLX0KLQotLyoKLSAqIEludGVybmFsLCByZXR1cm4gQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotICovLyogQ2hlY2sgdGhlIGN1cnJlbnQgZGF0ZSBhZ2FpbnN0IHRoZSBkYXRlIGdpdmVuICovIGNoYXIgKgotbGVmaVVzZXIoKQotewotICByZXR1cm4gKChjaGFyICopICJDYWRlbmNlIERlc2lnbiBTeXN0ZW1zIik7Ci19CmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi9sZWZpVHlwZWRlZnMuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL2xlZmlUeXBlZGVmcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmRkYzc3Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL2xlZmlUeXBlZGVmcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLSAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0gLyogQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhICovCi0gLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLSAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotIC8qIENvcHlyaWdodCAyMDEyLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zICovCi0gLyogICovCi0gLyogVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UgKi8KLSAvKiBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAgKi8KLSAvKiAgKi8KLSAvKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyAqLwotIC8qICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gKi8KLSAvKiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgKi8KLSAvKiAgKi8KLSAvKiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICovCi0gLyogICovCi0gLyogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAqLwotIC8qICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywgKi8KLSAvKiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgKi8KLSAvKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgKi8KLSAvKiAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICovCi0gLyogICovCi0gLyogICovCi0gLyogRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwgKi8KLSAvKiBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuICovCi0gLyogICovCi0gLyogICRBdXRob3I6IGRlbGwgJCAqLwotIC8qICAkUmV2aXNpb246ICMxICQgKi8KLSAvKiAgJERhdGU6IDIwMTcvMDYvMDYgJCAqLwotIC8qICAkU3RhdGU6ICAkICAgKi8KLSAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLSNpZm5kZWYgQ0xFRklUWVBFREVGU19ICi0jZGVmaW5lIENMRUZJVFlQRURFRlNfSAotCi0jaWZuZGVmIEVYVEVSTgotI2RlZmluZSBFWFRFUk4gZXh0ZXJuCi0jZW5kaWYKLQotI2RlZmluZSBib29sIGludAotI2RlZmluZSBsZWZpVXNlckRhdGEgdm9pZCAqCi0jZGVmaW5lIGxlZmlVc2VyRGF0YUhhbmRsZSB2b2lkICoqCi0KLS8qIFR5cGVkZWZzICovCi10eXBlZGVmIHN0cnVjdCBsZWZpUG9pbnRzIGxlZmlOdW07Ci0KLS8qIFBvaW50ZXJzIHRvIEMrKyBjbGFzc2VzICovCi10eXBlZGVmIHZvaWQgKmxlZmlBcnJheUZsb29yUGxhbjsKLXR5cGVkZWYgdm9pZCAqbGVmaUxheWVyOwotdHlwZWRlZiB2b2lkICpsZWZpTm9pc2VFZGdlOwotdHlwZWRlZiB2b2lkICpsZWZpQW50ZW5uYU1vZGVsOwotdHlwZWRlZiB2b2lkICpsZWZpQ29ycmVjdGlvbkVkZ2U7Ci10eXBlZGVmIHZvaWQgKmxlZmlUcmFja1BhdHRlcm47Ci10eXBlZGVmIHZvaWQgKmxlZmlJUkRyb3A7Ci10eXBlZGVmIHZvaWQgKmxlZmlHZW9tZXRyaWVzOwotdHlwZWRlZiB2b2lkICpsZWZpU3BhY2luZ1RhYmxlOwotdHlwZWRlZiB2b2lkICpsZWZpTWluRmVhdHVyZTsKLXR5cGVkZWYgdm9pZCAqbGVmaUdjZWxsUGF0dGVybjsKLXR5cGVkZWYgdm9pZCAqbGVmaVRpbWluZzsKLXR5cGVkZWYgdm9pZCAqbGVmaU5vaXNlVGFibGU7Ci10eXBlZGVmIHZvaWQgKmxlZmlDb3JyZWN0aW9uVmljdGltOwotdHlwZWRlZiB2b2lkICpsZWZpUGluQW50ZW5uYU1vZGVsOwotdHlwZWRlZiB2b2lkICpsZWZpUHJvcDsKLXR5cGVkZWYgdm9pZCAqbGVmaVVzZU1pblNwYWNpbmc7Ci10eXBlZGVmIHZvaWQgKmxlZmlDb3JyZWN0aW9uUmVzaXN0YW5jZTsKLXR5cGVkZWYgdm9pZCAqbGVmaUFudGVubmFQV0w7Ci10eXBlZGVmIHZvaWQgKmxlZmlBcnJheTsKLXR5cGVkZWYgdm9pZCAqbGVmaU5vbkRlZmF1bHQ7Ci10eXBlZGVmIHZvaWQgKmxlZmlMYXllckRlbnNpdHk7Ci10eXBlZGVmIHZvaWQgKmxlZmlTaXRlUGF0dGVybjsKLXR5cGVkZWYgdm9pZCAqbGVmaU1hY3JvOwotdHlwZWRlZiB2b2lkICpsZWZpQ29ycmVjdGlvblRhYmxlOwotdHlwZWRlZiB2b2lkICpsZWZpT3J0aG9nb25hbDsKLXR5cGVkZWYgdm9pZCAqbGVmaVZpYTsKLXR5cGVkZWYgdm9pZCAqbGVmaVNpdGU7Ci10eXBlZGVmIHZvaWQgKmxlZmlWaWFMYXllcjsKLXR5cGVkZWYgdm9pZCAqbGVmaVBhcmFsbGVsOwotdHlwZWRlZiB2b2lkICpsZWZpTm9pc2VWaWN0aW07Ci10eXBlZGVmIHZvaWQgKmxlZmlTcGFjaW5nOwotdHlwZWRlZiB2b2lkICpsZWZpVmlhUnVsZTsKLXR5cGVkZWYgdm9pZCAqbGVmaVZpYVJ1bGVMYXllcjsKLXR5cGVkZWYgdm9pZCAqbGVmaVR3b1dpZHRoczsKLXR5cGVkZWYgdm9pZCAqbGVmaURlbnNpdHk7Ci10eXBlZGVmIHZvaWQgKmxlZmlQaW47Ci10eXBlZGVmIHZvaWQgKmxlZmlNYXhTdGFja1ZpYTsKLXR5cGVkZWYgdm9pZCAqbGVmaUluZmx1ZW5jZTsKLXR5cGVkZWYgdm9pZCAqbGVmaVVuaXRzOwotdHlwZWRlZiB2b2lkICpsZWZpUHJvcFR5cGU7Ci10eXBlZGVmIHZvaWQgKmxlZmlPYnN0cnVjdGlvbjsKLXR5cGVkZWYgdm9pZCAqbGVmaU5vaXNlUmVzaXN0YW5jZTsKLQotLyogRGF0YSBzdHJ1Y3R1cmVzIGRlZmluaXRpb25zICovCi1zdHJ1Y3QgbGVmaU5vaXNlTWFyZ2luIHsKLSAgZG91YmxlIGhpZ2g7Ci0gIGRvdWJsZSBsb3c7Ci19OwotCi1zdHJ1Y3QgbGVmaUdlb21SZWN0IHsKLSAgICAgIGRvdWJsZSB4bDsKLSAgICAgIGRvdWJsZSB5bDsKLSAgICAgIGRvdWJsZSB4aDsKLSAgICAgIGRvdWJsZSB5aDsKLSAgICAgIGludCAgICBjb2xvck1hc2s7Ci19OwotCi1zdHJ1Y3QgbGVmaUdlb21SZWN0SXRlciB7Ci0gIGRvdWJsZSB4bDsKLSAgZG91YmxlIHlsOwotICBkb3VibGUgeGg7Ci0gIGRvdWJsZSB5aDsKLSAgZG91YmxlIHhTdGFydDsKLSAgZG91YmxlIHlTdGFydDsKLSAgZG91YmxlIHhTdGVwOwotICBkb3VibGUgeVN0ZXA7Ci0gIGludCAgICBjb2xvck1hc2s7Ci19OwotCi1zdHJ1Y3QgbGVmaUdlb21QYXRoIHsKLSAgaW50ICAgICBudW1Qb2ludHM7Ci0gIGRvdWJsZSogeDsKLSAgZG91YmxlKiB5OwotICBpbnQgICAgIGNvbG9yTWFzazsKLX07Ci0KLXN0cnVjdCBsZWZpR2VvbVBhdGhJdGVyIHsKLSAgaW50ICAgICBudW1Qb2ludHM7Ci0gIGRvdWJsZSogeDsKLSAgZG91YmxlKiB5OwotICBkb3VibGUgeFN0YXJ0OwotICBkb3VibGUgeVN0YXJ0OwotICBkb3VibGUgeFN0ZXA7Ci0gIGRvdWJsZSB5U3RlcDsKLSAgaW50ICAgIGNvbG9yTWFzazsKLX07Ci0KLXN0cnVjdCBsZWZpR2VvbVBvbHlnb24gewotICBpbnQgICAgIG51bVBvaW50czsKLSAgZG91YmxlKiB4OwotICBkb3VibGUqIHk7Ci0gIGludCAgICAgY29sb3JNYXNrOwotfTsKLQotc3RydWN0IGxlZmlHZW9tUG9seWdvbkl0ZXIgewotICBpbnQgbnVtUG9pbnRzOwotICBkb3VibGUqIHg7Ci0gIGRvdWJsZSogeTsKLSAgZG91YmxlIHhTdGFydDsKLSAgZG91YmxlIHlTdGFydDsKLSAgZG91YmxlIHhTdGVwOwotICBkb3VibGUgeVN0ZXA7Ci0gIGludCAgICBjb2xvck1hc2s7Ci19OwotCi1zdHJ1Y3QgbGVmaUdlb21WaWEgewotICBjaGFyKiAgbmFtZTsKLSAgZG91YmxlIHg7Ci0gIGRvdWJsZSB5OwotICBpbnQgICAgdG9wTWFza051bTsKLSAgaW50ICAgIGN1dE1hc2tOdW07Ci0gIGludCAgICBib3R0b21NYXNrTnVtOwotfTsKLQotc3RydWN0IGxlZmlHZW9tVmlhSXRlciB7Ci0gIGNoYXIqICBuYW1lOwotICBkb3VibGUgeDsKLSAgZG91YmxlIHk7Ci0gIGRvdWJsZSB4U3RhcnQ7Ci0gIGRvdWJsZSB5U3RhcnQ7Ci0gIGRvdWJsZSB4U3RlcDsKLSAgZG91YmxlIHlTdGVwOwotICBpbnQgICAgdG9wTWFza051bTsKLSAgaW50ICAgIGN1dE1hc2tOdW07Ci0gIGludCAgICBib3R0b21NYXNrTnVtOwotfTsKLQotc3RydWN0IGxlZmlQb2ludHMgewotICBkb3VibGUgeDsKLSAgZG91YmxlIHk7Ci19OwotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYvbGVmaVVuaXRzLmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi9sZWZpVW5pdHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM5YTQ5Ni4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi9sZWZpVW5pdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQ29weXJpZ2h0IDIwMTIgLSAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZSAgICAgICAgICAgICAqLwotLyogRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAqLwotLyogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgKi8KLS8qICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAqLwotLyogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgKi8KLS8qICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgICAgICovCi0vKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgICAgICAqLwotLyogICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LCAgICAgICAgICAqLwotLyogY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJEF1dGhvcjogZGVsbCAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkUmV2aXNpb246ICMxICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkRGF0ZTogMjAxNy8wNi8wNiAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRTdGF0ZTogICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0KLSNpZm5kZWYgQ0xFRklVTklUU19ICi0jZGVmaW5lIENMRUZJVU5JVFNfSAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJsZWZpVHlwZWRlZnMuaCIKLQotRVhURVJOIGludCBsZWZpVW5pdHNfaGFzRGF0YWJhc2UgKGNvbnN0IGxlZmlVbml0cyogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaVVuaXRzX2hhc0NhcGFjaXRhbmNlIChjb25zdCBsZWZpVW5pdHMqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlVbml0c19oYXNSZXNpc3RhbmNlIChjb25zdCBsZWZpVW5pdHMqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlVbml0c19oYXNUaW1lIChjb25zdCBsZWZpVW5pdHMqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlVbml0c19oYXNQb3dlciAoY29uc3QgbGVmaVVuaXRzKiBvYmopOwotRVhURVJOIGludCBsZWZpVW5pdHNfaGFzQ3VycmVudCAoY29uc3QgbGVmaVVuaXRzKiBvYmopOwotRVhURVJOIGludCBsZWZpVW5pdHNfaGFzVm9sdGFnZSAoY29uc3QgbGVmaVVuaXRzKiBvYmopOwotRVhURVJOIGludCBsZWZpVW5pdHNfaGFzRnJlcXVlbmN5IChjb25zdCBsZWZpVW5pdHMqIG9iaik7Ci0KLUVYVEVSTiBjb25zdCBjaGFyKiBsZWZpVW5pdHNfZGF0YWJhc2VOYW1lIChjb25zdCBsZWZpVW5pdHMqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlVbml0c19kYXRhYmFzZU51bWJlciAoY29uc3QgbGVmaVVuaXRzKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpVW5pdHNfY2FwYWNpdGFuY2UgKGNvbnN0IGxlZmlVbml0cyogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaVVuaXRzX3Jlc2lzdGFuY2UgKGNvbnN0IGxlZmlVbml0cyogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaVVuaXRzX3RpbWUgKGNvbnN0IGxlZmlVbml0cyogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaVVuaXRzX3Bvd2VyIChjb25zdCBsZWZpVW5pdHMqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlVbml0c19jdXJyZW50IChjb25zdCBsZWZpVW5pdHMqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlVbml0c192b2x0YWdlIChjb25zdCBsZWZpVW5pdHMqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlVbml0c19mcmVxdWVuY3kgKGNvbnN0IGxlZmlVbml0cyogb2JqKTsKLQotICAvKiBEZWJ1ZyBwcmludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiB2b2lkIGxlZmlVbml0c19wcmludCAoY29uc3QgbGVmaVVuaXRzKiBvYmosIEZJTEUqICBmKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi9sZWZpVXNlci5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYvbGVmaVVzZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRmMDkxYy4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi9sZWZpVXNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBBVFRFTlRJT046IFRISVMgSVMgQU4gQVVUTy1HRU5FUkFURUQgRklMRS4gRE8gTk9UIENIQU5HRSBJVCEgICAgICAgICAgICAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBDb3B5cmlnaHQgMjAxMiAtIDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlICAgICAgICAgICAgICovCi0vKiBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAgICAgICAgICAgICovCi0vKiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICAgICAgICAqLwotLyogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICovCi0vKiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAgICAgICAqLwotLyogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgICAgKi8KLS8qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgICAgICovCi0vKiAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksICAgICAgICAgICovCi0vKiBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkQXV0aG9yOiBkZWxsICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRSZXZpc2lvbjogIzEgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICREYXRlOiAyMDE3LzA2LzA2ICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJFN0YXRlOiAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLS8qICBVc2VyIGhlYWRlciBmaWxlIGZvciB0aGUgTEVGIEludGVyZmFjZS4gIFRoaXMgaW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWxsIG9mIHRoZSBoZWFkZXIgZmlsZXMgd2hpY2ggYXJlIHJlbGV2YW50IHRvIGJvdGggdGhlICAgICAgICAgICAgICAgICAgICAqLwotLyogIHJlYWRlciBhbmQgdGhlIHdyaXRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgbGVmclJlYWRlci5oIGFuZCBsZWZ3V3JpdGVyLmggaW5jbHVkZSB0aGlzIGZpbGUsIHNvIHRoYXQgICAgICAgICAgICAgICAgICAqLwotLyogIGFuIGFwcGxpY2F0aW9uIG9ubHkgbmVlZHMgdG8gaW5jbHVkZSBlaXRoZXIgbGVmclJlYWRlci5oKHBwKSAgICAgICAgICAgICAgKi8KLS8qICBvciBsZWZ3V3JpdGVyLmgocHApLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0KLSNpZm5kZWYgQ0xFRklVU0VSX0gKLSNkZWZpbmUgQ0xFRklVU0VSX0gKLQotI2luY2x1ZGUgImxlZmlBcnJheS5oIgotI2luY2x1ZGUgImxlZmlDcm9zc1RhbGsuaCIKLSNpbmNsdWRlICJsZWZpRGVidWcuaCIKLSNpbmNsdWRlICJsZWZpRW5jcnlwdEludC5oIgotI2luY2x1ZGUgImxlZmlMYXllci5oIgotI2luY2x1ZGUgImxlZmlNYWNyby5oIgotI2luY2x1ZGUgImxlZmlNaXNjLmgiCi0jaW5jbHVkZSAibGVmaU5vbkRlZmF1bHQuaCIKLSNpbmNsdWRlICJsZWZpUHJvcC5oIgotI2luY2x1ZGUgImxlZmlQcm9wVHlwZS5oIgotI2luY2x1ZGUgImxlZmlVbml0cy5oIgotI2luY2x1ZGUgImxlZmlVdGlsLmgiCi0jaW5jbHVkZSAibGVmaVZpYS5oIgotI2luY2x1ZGUgImxlZmlWaWFSdWxlLmgiCi0KLQotLyogTkVXIENBTExCQUNLIGFkZCB0aGUgcmVmZXJlbmNlIGhlcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi9sZWZpVXRpbC5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYvbGVmaVV0aWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk1ZDhhMS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi9sZWZpVXRpbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBBVFRFTlRJT046IFRISVMgSVMgQU4gQVVUTy1HRU5FUkFURUQgRklMRS4gRE8gTk9UIENIQU5HRSBJVCEgICAgICAgICAgICAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBDb3B5cmlnaHQgMjAxMiAtIDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlICAgICAgICAgICAgICovCi0vKiBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAgICAgICAgICAgICovCi0vKiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICAgICAgICAqLwotLyogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICovCi0vKiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAgICAgICAqLwotLyogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgICAgKi8KLS8qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgICAgICovCi0vKiAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksICAgICAgICAgICovCi0vKiBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkQXV0aG9yOiBkZWxsICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRSZXZpc2lvbjogIzEgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICREYXRlOiAyMDE3LzA2LzA2ICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJFN0YXRlOiAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLQotI2lmbmRlZiBDTEVGSVVUSUxfSAotI2RlZmluZSBDTEVGSVVUSUxfSAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJsZWZpVHlwZWRlZnMuaCIKLQotLyogU3RydWN0dXJlIHRvIHJldHVybiBNYWNybyBkYXRhIHRvIEZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotLyppbnQgbGVmaVZhbGlkVGltZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmaVZhbGlkVXNlciAoKTsKLQotRVhURVJOIGNoYXIqIGxlZmlVc2VyICgpOwotCi1FWFRFUk4gY2hhciogbGVmaU9yaWVudFN0ciAoaW50ICBvcmllbnQpOwotCi1FWFRFUk4gZG91YmxlIGNvbnZlcnRfbmFtZTJudW0gKGNvbnN0IGNoYXIgKiB2ZXJzaW9uTmFtZSk7Ci0KLUVYVEVSTiBib29sICB2YWxpZGF0ZU1hc2tOdW1iZXIgKGludCAgbnVtKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi9sZWZpVmlhLmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi9sZWZpVmlhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNDAxZTUuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYvbGVmaVZpYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQ29weXJpZ2h0IDIwMTIgLSAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZSAgICAgICAgICAgICAqLwotLyogRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAqLwotLyogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgKi8KLS8qICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAqLwotLyogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgKi8KLS8qICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgICAgICovCi0vKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgICAgICAqLwotLyogICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LCAgICAgICAgICAqLwotLyogY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJEF1dGhvcjogZGVsbCAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkUmV2aXNpb246ICMxICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkRGF0ZTogMjAxNy8wNi8wNiAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRTdGF0ZTogICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0KLSNpZm5kZWYgQ0xFRklWSUFfSAotI2RlZmluZSBDTEVGSVZJQV9ICi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImxlZmlUeXBlZGVmcy5oIgotCi1FWFRFUk4gc3RydWN0IGxlZmlHZW9tUG9seWdvbiogbGVmaVZpYUxheWVyX2dldFBvbHlnb24gKGNvbnN0IGxlZmlWaWFMYXllciogb2JqLCBpbnQgIGluZGV4KTsKLQotICAvKiBzZXROYW1lIGNhbGxzIGNsZWFyIHRvIGluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogZGVmbHQ9MCBubyBkZWZhdWx0IHNwZWNpZmllZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIGRlZmx0PTEgZGVmYXVsdCBzcGVjaWZpZWQgaW4gbGVmIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIC8qIG9yaWVudD0tMSBtZWFucyBubyBvcmllbnQgd2FzIHNwZWNpZmllZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIC8qIG1ha2UgYSBuZXcgb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi1FWFRFUk4gaW50IGxlZmlWaWFfaGFzRGVmYXVsdCAoY29uc3QgbGVmaVZpYSogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaVZpYV9oYXNHZW5lcmF0ZWQgKGNvbnN0IGxlZmlWaWEqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlWaWFfaGFzRm9yZWlnbiAoY29uc3QgbGVmaVZpYSogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaVZpYV9oYXNGb3JlaWduUG50IChjb25zdCBsZWZpVmlhKiBvYmopOwotRVhURVJOIGludCBsZWZpVmlhX2hhc0ZvcmVpZ25PcmllbnQgKGNvbnN0IGxlZmlWaWEqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlWaWFfaGFzUHJvcGVydGllcyAoY29uc3QgbGVmaVZpYSogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaVZpYV9oYXNSZXNpc3RhbmNlIChjb25zdCBsZWZpVmlhKiBvYmopOwotRVhURVJOIGludCBsZWZpVmlhX2hhc1RvcE9mU3RhY2sgKGNvbnN0IGxlZmlWaWEqIG9iaik7Ci0KLUVYVEVSTiBpbnQgbGVmaVZpYV9udW1MYXllcnMgKGNvbnN0IGxlZmlWaWEqIG9iaik7Ci1FWFRFUk4gY2hhciogbGVmaVZpYV9sYXllck5hbWUgKGNvbnN0IGxlZmlWaWEqIG9iaiwgaW50ICBsYXllck51bSk7Ci1FWFRFUk4gaW50IGxlZmlWaWFfbnVtUmVjdHMgKGNvbnN0IGxlZmlWaWEqIG9iaiwgaW50ICBsYXllck51bSk7Ci1FWFRFUk4gZG91YmxlIGxlZmlWaWFfeGwgKGNvbnN0IGxlZmlWaWEqIG9iaiwgaW50ICBsYXllck51bSwgaW50ICByZWN0TnVtKTsKLUVYVEVSTiBkb3VibGUgbGVmaVZpYV95bCAoY29uc3QgbGVmaVZpYSogb2JqLCBpbnQgIGxheWVyTnVtLCBpbnQgIHJlY3ROdW0pOwotRVhURVJOIGRvdWJsZSBsZWZpVmlhX3hoIChjb25zdCBsZWZpVmlhKiBvYmosIGludCAgbGF5ZXJOdW0sIGludCAgcmVjdE51bSk7Ci1FWFRFUk4gZG91YmxlIGxlZmlWaWFfeWggKGNvbnN0IGxlZmlWaWEqIG9iaiwgaW50ICBsYXllck51bSwgaW50ICByZWN0TnVtKTsKLUVYVEVSTiBpbnQgbGVmaVZpYV9yZWN0Q29sb3JNYXNrIChjb25zdCBsZWZpVmlhKiBvYmosIGludCAgbGF5ZXJOdW0sIGludCAgcmVjdE51bSk7Ci1FWFRFUk4gaW50IGxlZmlWaWFfcG9seUNvbG9yTWFzayAoY29uc3QgbGVmaVZpYSogb2JqLCBpbnQgIGxheWVyTnVtLCBpbnQgIHBvbHlOdW0pOwotRVhURVJOIGludCBsZWZpVmlhX251bVBvbHlnb25zIChjb25zdCBsZWZpVmlhKiBvYmosIGludCAgbGF5ZXJOdW0pOwotRVhURVJOIHN0cnVjdCBsZWZpR2VvbVBvbHlnb24gbGVmaVZpYV9nZXRQb2x5Z29uIChjb25zdCBsZWZpVmlhKiBvYmosIGludCAgbGF5ZXJOdW0sIGludCAgcG9seU51bSk7Ci0KLUVYVEVSTiBjaGFyKiBsZWZpVmlhX25hbWUgKGNvbnN0IGxlZmlWaWEqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlWaWFfcmVzaXN0YW5jZSAoY29uc3QgbGVmaVZpYSogb2JqKTsKLQotICAvKiBHaXZlbiBhbiBpbmRleCBmcm9tIDAgdG8gbnVtUHJvcGVydGllcygpLTEgcmV0dXJuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogaW5mb3JtYXRpb24gYWJvdXQgdGhhdCBwcm9wZXJ0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZmlWaWFfbnVtUHJvcGVydGllcyAoY29uc3QgbGVmaVZpYSogb2JqKTsKLUVYVEVSTiBjaGFyKiBsZWZpVmlhX3Byb3BOYW1lIChjb25zdCBsZWZpVmlhKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGNoYXIqIGxlZmlWaWFfcHJvcFZhbHVlIChjb25zdCBsZWZpVmlhKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGRvdWJsZSBsZWZpVmlhX3Byb3BOdW1iZXIgKGNvbnN0IGxlZmlWaWEqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY2hhciBsZWZpVmlhX3Byb3BUeXBlIChjb25zdCBsZWZpVmlhKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBsZWZpVmlhX3Byb3BJc051bWJlciAoY29uc3QgbGVmaVZpYSogb2JqLCBpbnQgIGluZGV4KTsKLUVYVEVSTiBpbnQgbGVmaVZpYV9wcm9wSXNTdHJpbmcgKGNvbnN0IGxlZmlWaWEqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gY2hhciogbGVmaVZpYV9mb3JlaWduIChjb25zdCBsZWZpVmlhKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpVmlhX2ZvcmVpZ25YIChjb25zdCBsZWZpVmlhKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpVmlhX2ZvcmVpZ25ZIChjb25zdCBsZWZpVmlhKiBvYmopOwotRVhURVJOIGludCBsZWZpVmlhX2ZvcmVpZ25PcmllbnQgKGNvbnN0IGxlZmlWaWEqIG9iaik7Ci1FWFRFUk4gY2hhciogbGVmaVZpYV9mb3JlaWduT3JpZW50U3RyIChjb25zdCBsZWZpVmlhKiBvYmopOwotCi0gIC8qIDUuNiBWSUFSVUxFIGluc2lkZSBhIFZJQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZpVmlhX2hhc1ZpYVJ1bGUgKGNvbnN0IGxlZmlWaWEqIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogbGVmaVZpYV92aWFSdWxlTmFtZSAoY29uc3QgbGVmaVZpYSogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaVZpYV94Q3V0U2l6ZSAoY29uc3QgbGVmaVZpYSogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaVZpYV95Q3V0U2l6ZSAoY29uc3QgbGVmaVZpYSogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBsZWZpVmlhX2JvdE1ldGFsTGF5ZXIgKGNvbnN0IGxlZmlWaWEqIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogbGVmaVZpYV9jdXRMYXllciAoY29uc3QgbGVmaVZpYSogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBsZWZpVmlhX3RvcE1ldGFsTGF5ZXIgKGNvbnN0IGxlZmlWaWEqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlWaWFfeEN1dFNwYWNpbmcgKGNvbnN0IGxlZmlWaWEqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlWaWFfeUN1dFNwYWNpbmcgKGNvbnN0IGxlZmlWaWEqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlWaWFfeEJvdEVuYyAoY29uc3QgbGVmaVZpYSogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaVZpYV95Qm90RW5jIChjb25zdCBsZWZpVmlhKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpVmlhX3hUb3BFbmMgKGNvbnN0IGxlZmlWaWEqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlWaWFfeVRvcEVuYyAoY29uc3QgbGVmaVZpYSogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaVZpYV9oYXNSb3dDb2wgKGNvbnN0IGxlZmlWaWEqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlWaWFfbnVtQ3V0Um93cyAoY29uc3QgbGVmaVZpYSogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaVZpYV9udW1DdXRDb2xzIChjb25zdCBsZWZpVmlhKiBvYmopOwotRVhURVJOIGludCBsZWZpVmlhX2hhc09yaWdpbiAoY29uc3QgbGVmaVZpYSogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaVZpYV94T2Zmc2V0IChjb25zdCBsZWZpVmlhKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpVmlhX3lPZmZzZXQgKGNvbnN0IGxlZmlWaWEqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlWaWFfaGFzT2Zmc2V0IChjb25zdCBsZWZpVmlhKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpVmlhX3hCb3RPZmZzZXQgKGNvbnN0IGxlZmlWaWEqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlWaWFfeUJvdE9mZnNldCAoY29uc3QgbGVmaVZpYSogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaVZpYV94VG9wT2Zmc2V0IChjb25zdCBsZWZpVmlhKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpVmlhX3lUb3BPZmZzZXQgKGNvbnN0IGxlZmlWaWEqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlWaWFfaGFzQ3V0UGF0dGVybiAoY29uc3QgbGVmaVZpYSogb2JqKTsKLUVYVEVSTiBjb25zdCBjaGFyKiBsZWZpVmlhX2N1dFBhdHRlcm4gKGNvbnN0IGxlZmlWaWEqIG9iaik7Ci0KLSAgLyogRGVidWcgcHJpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gdm9pZCBsZWZpVmlhX3ByaW50IChjb25zdCBsZWZpVmlhKiBvYmosIEZJTEUqICBmKTsKLQotICAvKiBUaGUgcHJvcCB2YWx1ZSBpcyBzdG9yZWQgaW4gdGhlIHByb3BWYWx1ZV8gb3IgdGhlIHByb3BEVmFsdWVfLiAgICAgICAgICAgKi8KLSAgLyogSWYgaXQgaXMgYSBzdHJpbmcgaXQgaXMgaW4gcHJvcFZhbHVlXy4gIElmIGl0IGlzIGEgbnVtYmVyLCAgICAgICAgICAgICAgICovCi0gIC8qIHRoZW4gcHJvcFZhbHVlXyBpcyBOVUxMIGFuZCBpdCBpcyBzdG9yZWQgaW4gcHJvcERWYWx1ZV87ICAgICAgICAgICAgICAgICAqLwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL2xlZmlWaWFSdWxlLmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi9sZWZpVmlhUnVsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2JlMGI1Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL2xlZmlWaWFSdWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBBVFRFTlRJT046IFRISVMgSVMgQU4gQVVUTy1HRU5FUkFURUQgRklMRS4gRE8gTk9UIENIQU5HRSBJVCEgICAgICAgICAgICAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBDb3B5cmlnaHQgMjAxMiAtIDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlICAgICAgICAgICAgICovCi0vKiBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAgICAgICAgICAgICovCi0vKiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICAgICAgICAqLwotLyogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICovCi0vKiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAgICAgICAqLwotLyogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgICAgKi8KLS8qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgICAgICovCi0vKiAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksICAgICAgICAgICovCi0vKiBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkQXV0aG9yOiBkZWxsICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRSZXZpc2lvbjogIzEgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICREYXRlOiAyMDE3LzA2LzA2ICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJFN0YXRlOiAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLQotI2lmbmRlZiBDTEVGSVZJQVJVTEVfSAotI2RlZmluZSBDTEVGSVZJQVJVTEVfSAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJsZWZpVHlwZWRlZnMuaCIKLQotRVhURVJOIGludCBsZWZpVmlhUnVsZUxheWVyX2hhc0RpcmVjdGlvbiAoY29uc3QgbGVmaVZpYVJ1bGVMYXllciogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaVZpYVJ1bGVMYXllcl9oYXNFbmNsb3N1cmUgKGNvbnN0IGxlZmlWaWFSdWxlTGF5ZXIqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlWaWFSdWxlTGF5ZXJfaGFzV2lkdGggKGNvbnN0IGxlZmlWaWFSdWxlTGF5ZXIqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlWaWFSdWxlTGF5ZXJfaGFzUmVzaXN0YW5jZSAoY29uc3QgbGVmaVZpYVJ1bGVMYXllciogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaVZpYVJ1bGVMYXllcl9oYXNPdmVyaGFuZyAoY29uc3QgbGVmaVZpYVJ1bGVMYXllciogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaVZpYVJ1bGVMYXllcl9oYXNNZXRhbE92ZXJoYW5nIChjb25zdCBsZWZpVmlhUnVsZUxheWVyKiBvYmopOwotRVhURVJOIGludCBsZWZpVmlhUnVsZUxheWVyX2hhc1NwYWNpbmcgKGNvbnN0IGxlZmlWaWFSdWxlTGF5ZXIqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlWaWFSdWxlTGF5ZXJfaGFzUmVjdCAoY29uc3QgbGVmaVZpYVJ1bGVMYXllciogb2JqKTsKLQotRVhURVJOIGNoYXIqIGxlZmlWaWFSdWxlTGF5ZXJfbmFtZSAoY29uc3QgbGVmaVZpYVJ1bGVMYXllciogb2JqKTsKLUVYVEVSTiBpbnQgbGVmaVZpYVJ1bGVMYXllcl9pc0hvcml6b250YWwgKGNvbnN0IGxlZmlWaWFSdWxlTGF5ZXIqIG9iaik7Ci1FWFRFUk4gaW50IGxlZmlWaWFSdWxlTGF5ZXJfaXNWZXJ0aWNhbCAoY29uc3QgbGVmaVZpYVJ1bGVMYXllciogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaVZpYVJ1bGVMYXllcl9lbmNsb3N1cmVPdmVyaGFuZzEgKGNvbnN0IGxlZmlWaWFSdWxlTGF5ZXIqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlWaWFSdWxlTGF5ZXJfZW5jbG9zdXJlT3ZlcmhhbmcyIChjb25zdCBsZWZpVmlhUnVsZUxheWVyKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpVmlhUnVsZUxheWVyX3dpZHRoTWluIChjb25zdCBsZWZpVmlhUnVsZUxheWVyKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpVmlhUnVsZUxheWVyX3dpZHRoTWF4IChjb25zdCBsZWZpVmlhUnVsZUxheWVyKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpVmlhUnVsZUxheWVyX292ZXJoYW5nIChjb25zdCBsZWZpVmlhUnVsZUxheWVyKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpVmlhUnVsZUxheWVyX21ldGFsT3ZlcmhhbmcgKGNvbnN0IGxlZmlWaWFSdWxlTGF5ZXIqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlWaWFSdWxlTGF5ZXJfcmVzaXN0YW5jZSAoY29uc3QgbGVmaVZpYVJ1bGVMYXllciogb2JqKTsKLUVYVEVSTiBkb3VibGUgbGVmaVZpYVJ1bGVMYXllcl9zcGFjaW5nU3RlcFggKGNvbnN0IGxlZmlWaWFSdWxlTGF5ZXIqIG9iaik7Ci1FWFRFUk4gZG91YmxlIGxlZmlWaWFSdWxlTGF5ZXJfc3BhY2luZ1N0ZXBZIChjb25zdCBsZWZpVmlhUnVsZUxheWVyKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpVmlhUnVsZUxheWVyX3hsIChjb25zdCBsZWZpVmlhUnVsZUxheWVyKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpVmlhUnVsZUxheWVyX3lsIChjb25zdCBsZWZpVmlhUnVsZUxheWVyKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpVmlhUnVsZUxheWVyX3hoIChjb25zdCBsZWZpVmlhUnVsZUxheWVyKiBvYmopOwotRVhURVJOIGRvdWJsZSBsZWZpVmlhUnVsZUxheWVyX3loIChjb25zdCBsZWZpVmlhUnVsZUxheWVyKiBvYmopOwotCi0gIC8qIERlYnVnIHByaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIHZvaWQgbGVmaVZpYVJ1bGVMYXllcl9wcmludCAoY29uc3QgbGVmaVZpYVJ1bGVMYXllciogb2JqLCBGSUxFKiAgZik7Ci0KLSAgLyogVGhpcyBzaG91bGQgY2xlYXIgb3V0IGFsbCB0aGUgb2xkIHN0dWZmLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogQWRkIG9uZSBvZiBwb3NzaWJseSBtYW55IHZpYSBuYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogVGhlc2Ugcm91dGluZXMgc2V0IGEgcGFydCBvZiB0aGUgYWN0aXZlIGxheWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogVGhpcyByb3V0aW5lIHNldHMgYW5kIGNyZWF0ZXMgdGhlIGFjdGl2ZSBsYXllci4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLUVYVEVSTiBpbnQgbGVmaVZpYVJ1bGVfaGFzR2VuZXJhdGUgKGNvbnN0IGxlZmlWaWFSdWxlKiBvYmopOwotRVhURVJOIGludCBsZWZpVmlhUnVsZV9oYXNEZWZhdWx0IChjb25zdCBsZWZpVmlhUnVsZSogb2JqKTsKLUVYVEVSTiBjaGFyKiBsZWZpVmlhUnVsZV9uYW1lIChjb25zdCBsZWZpVmlhUnVsZSogb2JqKTsKLQotICAvKiBUaGVyZSBhcmUgMiBvciAzIGxheWVycyBpbiBhIHJ1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogbnVtTGF5ZXJzKCkgdGVsbHMgaG93IG1hbnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIElmIGEgdGhpcmQgbGF5ZXIgZXhpc3RzIHRoZW4gaXQgaXMgdGhlIGN1dCBsYXllci4gICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZpVmlhUnVsZV9udW1MYXllcnMgKGNvbnN0IGxlZmlWaWFSdWxlKiBvYmopOwotRVhURVJOIGNvbnN0IGxlZmlWaWFSdWxlTGF5ZXIqIGxlZmlWaWFSdWxlX2xheWVyIChjb25zdCBsZWZpVmlhUnVsZSogb2JqLCBpbnQgIGluZGV4KTsKLQotRVhURVJOIGludCBsZWZpVmlhUnVsZV9udW1WaWFzIChjb25zdCBsZWZpVmlhUnVsZSogb2JqKTsKLUVYVEVSTiBjaGFyKiBsZWZpVmlhUnVsZV92aWFOYW1lIChjb25zdCBsZWZpVmlhUnVsZSogb2JqLCBpbnQgIGluZGV4KTsKLQotRVhURVJOIGludCBsZWZpVmlhUnVsZV9udW1Qcm9wcyAoY29uc3QgbGVmaVZpYVJ1bGUqIG9iaik7Ci1FWFRFUk4gY29uc3QgY2hhciogbGVmaVZpYVJ1bGVfcHJvcE5hbWUgKGNvbnN0IGxlZmlWaWFSdWxlKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGNvbnN0IGNoYXIqIGxlZmlWaWFSdWxlX3Byb3BWYWx1ZSAoY29uc3QgbGVmaVZpYVJ1bGUqIG9iaiwgaW50ICBpbmRleCk7Ci1FWFRFUk4gZG91YmxlIGxlZmlWaWFSdWxlX3Byb3BOdW1iZXIgKGNvbnN0IGxlZmlWaWFSdWxlKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGNvbnN0IGNoYXIgbGVmaVZpYVJ1bGVfcHJvcFR5cGUgKGNvbnN0IGxlZmlWaWFSdWxlKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBsZWZpVmlhUnVsZV9wcm9wSXNOdW1iZXIgKGNvbnN0IGxlZmlWaWFSdWxlKiBvYmosIGludCAgaW5kZXgpOwotRVhURVJOIGludCBsZWZpVmlhUnVsZV9wcm9wSXNTdHJpbmcgKGNvbnN0IGxlZmlWaWFSdWxlKiBvYmosIGludCAgaW5kZXgpOwotCi0gIC8qIERlYnVnIHByaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIHZvaWQgbGVmaVZpYVJ1bGVfcHJpbnQgKGNvbnN0IGxlZmlWaWFSdWxlKiBvYmosIEZJTEUqICBmKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi9sZWZyUmVhZGVyLmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi9sZWZyUmVhZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjOTE3MTQuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYvbGVmclJlYWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTA5ICswLDAgQEAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQ29weXJpZ2h0IDIwMTIgLSAyMDE3LCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZSAgICAgICAgICAgICAqLwotLyogRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAqLwotLyogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgKi8KLS8qICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAqLwotLyogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgKi8KLS8qICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgICAgICovCi0vKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgICAgICAqLwotLyogICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LCAgICAgICAgICAqLwotLyogY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJEF1dGhvcjogZGVsbCAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRSZXZpc2lvbjogIzEgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkRGF0ZTogMjAxNy8wNi8wNiAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJFN0YXRlOiAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLQotI2lmbmRlZiBDTEVGUlJFQURFUl9ICi0jZGVmaW5lIENMRUZSUkVBREVSX0gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAibGVmaVR5cGVkZWZzLmgiCi0KLSNkZWZpbmUgTUFYX0xFRl9NU0dTIDQ3MDEKLQotLyogVGhlIHJlYWRlciBpbml0aWFsaXphdGlvbi4gIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBsZWZyUmVhZCgpLiAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmckluaXQgKCk7Ci1FWFRFUk4gaW50IGxlZnJJbml0U2Vzc2lvbiAoaW50ICBzdGFydFNlc3Npb24pOwotCi0vKiBvYnNvbHRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZyUmVzZXQgKCk7Ci0KLS8qIENsZWFycyBwYXJzZXIgY29uZmlndXJhdGlvbiBhbmQgcmV0dXJuIGl0IGluIGluaWFsIHN0YXRlLiAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZnJDbGVhciAoKTsKLQotLyogb2Jzb2xldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmclJlbGVhc2VOUmVzZXRNZW1vcnkgKCk7Ci0KLS8qIENoYW5nZSB0aGUgY29tbWVudCBjaGFyYWN0ZXIgaW4gTEVGLiAgVGhlIG5vcm1hbCBjaGFyYWN0ZXIgaXMgICAgICAgICAgICAgICovCi0vKiAnIycuICAgWW91IGNhbiBjaGFuZ2UgaXQgdG8gYW55dGhpbmcgeW91IHdhbnQsIGJ1dCBiZSBjYXJlZnVsLiAgICAgICAgICAgICAqLwotRVhURVJOIHZvaWQgbGVmclNldENvbW1lbnRDaGFyIChjaGFyICBjKTsKLQotLyogQWxsb3cgdGhlIHBhcnNlciB0byB1cHNoaWZ0IGFsbCBuYW1lcyBpZiB0aGUgTEVGICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGZpbGUgaXMgY2FzZSBpbnNlbnNpdGl2ZS4gIFRoZSBkZWZhdWx0IGlzIG5vIHNoaWZ0LCBzbyB0aGUgdXNlciAgICAgICAgICAgICovCi0vKiBtdXN0IGRvIGNhc2UgaW5zZW5zaXRpdmUgbWF0Y2hpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIHZvaWQgbGVmclNldFNoaWZ0Q2FzZSAoKTsKLQotLyogQWxsb3cgdGhlIHVzZXIgdG8gY2hhbmdlIHRoZSBjYXNlc2Vuc2l0aXZpdHkgYW55dGltZSBkdXJpbmcgICAgICAgICAgICAgICAgKi8KLS8qIHBhcnNpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBjYXNlU2VuID0gMCwgd2lsbCB0dXJuIG9mZiB0aGUgY2FzZXNlbnNpdGl2aXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogY2FzZVNlbiAhPSAwLCB3aWxsIHR1cm4gb24gdGhlIGNhc2VzZW5zaXRpdml0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotRVhURVJOIHZvaWQgbGVmclNldENhc2VTZW5zaXRpdml0eSAoaW50ICBjYXNlU2Vuc2UpOwotCi0vKiBUaGUgcmVhZGVyIHJlcXVlc3QgdGhlIGZpbGUgbmFtZSB0aGV5IGFyZSBwYXJzaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi1FWFRFUk4gY29uc3QgY2hhciAqIGxlZnJGTmFtZSAoKTsKLQotLyogIFRoZSBtYWluIHJlYWRlciBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGUgZmlsZSBzaG91bGQgYWxyZWFkeSBiZSBvcGVuZWQuICBUaGlzIHJlcXVpcmVtZW50IGFsbG93cyAgICAgICAgICAgICAgICovCi0vKiAgdGhlIHJlYWRlciB0byBiZSB1c2VkIHdpdGggc3RkaW4gb3IgYSBwaXBlLiAgVGhlIGZpbGUgbmFtZSAgICAgICAgICAgICAgICAqLwotLyogIGlzIG9ubHkgdXNlZCBmb3IgZXJyb3IgbWVzc2FnZXMuICBUaGUgaW5jbHVkZVNlYXJjaFBhdGggaXMgICAgICAgICAgICAgICAgKi8KLS8qICBhIGNvbG9uLWRlbGltaXRlZCBsaXN0IG9mIGRpcmVjdG9yaWVzIGluIHdoaWNoIHRvIGZpbmQgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaW5jbHVkZSBmaWxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi1FWFRFUk4gaW50IGxlZnJSZWFkIChGSUxFICogZmlsZSwgY29uc3QgY2hhciAqIGZpbGVOYW1lLCBsZWZpVXNlckRhdGEgIHVzZXJEYXRhKTsKLQotLyogIFNldCBhbGwgb2YgdGhlIGNhbGxiYWNrcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIHNldCB0byBhIGZ1bmN0aW9uICAgICAgICAgKi8KLS8qICB0aGF0IHdpbGwgYWRkIHVwIGhvdyBtYW55IHRpbWVzIGEgZ2l2ZW4gbGVmIGRhdGEgdHlwZSB3YXMgaWdub3JlZCAgICAgICAgICovCi0vKiAgKGllIG5vIGNhbGxiYWNrIHdhcyBkb25lKS4gIFRoZSBzdGF0aXN0aWNzIGNhbiBsYXRlciBiZSBwcmludGVkIG91dC4gICAgICAqLwotRVhURVJOIHZvaWQgbGVmclNldFJlZ2lzdGVyVW51c2VkQ2FsbGJhY2tzICgpOwotRVhURVJOIHZvaWQgbGVmclByaW50VW51c2VkQ2FsbGJhY2tzIChGSUxFKiAgZik7Ci0KLS8qIFNldC9nZXQgdGhlIGNsaWVudC1wcm92aWRlZCB1c2VyIGRhdGEuICBsZWZpIGRvZXNuJ3QgbG9vayBhdCAgICAgICAgICAgICAgICovCi0vKiB0aGlzIGRhdGEgYXQgYWxsLCBpdCBzaW1wbHkgcGFzc2VzIHRoZSBvcGFxdWUgbGVmaVVzZXJEYXRhIHBvaW50ZXIgICAgICAgICAqLwotLyogYmFjayB0byB0aGUgYXBwbGljYXRpb24gd2l0aCBlYWNoIGNhbGxiYWNrLiAgVGhlIGNsaWVudCBjYW4gICAgICAgICAgICAgICAgKi8KLS8qIGNoYW5nZSB0aGUgZGF0YSBhdCBhbnkgdGltZSwgYW5kIGl0IHdpbGwgdGFrZSBlZmZlY3Qgb24gdGhlICAgICAgICAgICAgICAgICovCi0vKiBuZXh0IGNhbGxiYWNrLiAgVGhlIGxlZmkgcmVhZGVyIGFuZCB3cml0ZXIgbWFpbnRhaW4gc2VwYXJhdGUgICAgICAgICAgICAgICAqLwotLyogdXNlciBkYXRhIHBvaW50ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiB2b2lkIGxlZnJTZXRVc2VyRGF0YSAobGVmaVVzZXJEYXRhIHAwKTsKLUVYVEVSTiBsZWZpVXNlckRhdGEgbGVmckdldFVzZXJEYXRhICgpOwotCi0vKiBBbiBlbnVtIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSB0eXBlcyBvZiByZWFkZXIgY2FsbGJhY2tzLiAgICAgICAgICAgICAgICAgICAqLwotdHlwZWRlZiBlbnVtIHsKLSAgbGVmclVuc3BlY2lmaWVkQ2JrVHlwZSA9IDAsCi0gIGxlZnJWZXJzaW9uQ2JrVHlwZSA9IDEsCi0gIGxlZnJWZXJzaW9uU3RyQ2JrVHlwZSA9IDIsCi0gIGxlZnJEaXZpZGVyQ2hhckNia1R5cGUgPSAzLAotICBsZWZyQnVzQml0Q2hhcnNDYmtUeXBlID0gNCwKLSAgbGVmclVuaXRzQ2JrVHlwZSA9IDUsCi0gIGxlZnJDYXNlU2Vuc2l0aXZlQ2JrVHlwZSA9IDYsCi0gIGxlZnJOb1dpcmVFeHRlbnNpb25DYmtUeXBlID0gNywKLSAgbGVmclByb3BCZWdpbkNia1R5cGUgPSA4LAotICBsZWZyUHJvcENia1R5cGUgPSA5LAotICBsZWZyUHJvcEVuZENia1R5cGUgPSAxMCwKLSAgbGVmckxheWVyQ2JrVHlwZSA9IDExLAotICBsZWZyVmlhQ2JrVHlwZSA9IDEyLAotICBsZWZyVmlhUnVsZUNia1R5cGUgPSAxMywKLSAgbGVmclNwYWNpbmdDYmtUeXBlID0gMTQsCi0gIGxlZnJJUkRyb3BDYmtUeXBlID0gMTUsCi0gIGxlZnJEaWVsZWN0cmljQ2JrVHlwZSA9IDE2LAotICBsZWZyTWluRmVhdHVyZUNia1R5cGUgPSAxNywKLSAgbGVmck5vbkRlZmF1bHRDYmtUeXBlID0gMTgsCi0gIGxlZnJTaXRlQ2JrVHlwZSA9IDE5LAotICBsZWZyTWFjcm9CZWdpbkNia1R5cGUgPSAyMCwKLSAgbGVmclBpbkNia1R5cGUgPSAyMSwKLSAgbGVmck1hY3JvQ2JrVHlwZSA9IDIyLAotICBsZWZyT2JzdHJ1Y3Rpb25DYmtUeXBlID0gMjMsCi0gIGxlZnJBcnJheUNia1R5cGUgPSAyNCwKLQotICAvKiBORVcgQ0FMTEJBQ0tTIC0gZWFjaCBjYWxsYmFjayBoYXMgaXRzIG93biB0eXBlLiAgRm9yIGVhY2ggY2FsbGJhY2sgICAgICAgKi8KLSAgLyogdGhhdCB5b3UgYWRkLCB5b3UgbXVzdCBhZGQgYW4gaXRlbSB0byB0aGlzIGVudW0uICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgbGVmclNwYWNpbmdCZWdpbkNia1R5cGUgPSAyNSwKLSAgbGVmclNwYWNpbmdFbmRDYmtUeXBlID0gMjYsCi0gIGxlZnJBcnJheUJlZ2luQ2JrVHlwZSA9IDI3LAotICBsZWZyQXJyYXlFbmRDYmtUeXBlID0gMjgsCi0gIGxlZnJJUkRyb3BCZWdpbkNia1R5cGUgPSAyOSwKLSAgbGVmcklSRHJvcEVuZENia1R5cGUgPSAzMCwKLSAgbGVmck5vaXNlTWFyZ2luQ2JrVHlwZSA9IDMxLAotICBsZWZyRWRnZVJhdGVUaHJlc2hvbGQxQ2JrVHlwZSA9IDMyLAotICBsZWZyRWRnZVJhdGVUaHJlc2hvbGQyQ2JrVHlwZSA9IDMzLAotICBsZWZyRWRnZVJhdGVTY2FsZUZhY3RvckNia1R5cGUgPSAzNCwKLSAgbGVmck5vaXNlVGFibGVDYmtUeXBlID0gMzUsCi0gIGxlZnJDb3JyZWN0aW9uVGFibGVDYmtUeXBlID0gMzYsCi0gIGxlZnJJbnB1dEFudGVubmFDYmtUeXBlID0gMzcsCi0gIGxlZnJPdXRwdXRBbnRlbm5hQ2JrVHlwZSA9IDM4LAotICBsZWZySW5vdXRBbnRlbm5hQ2JrVHlwZSA9IDM5LAotICBsZWZyQW50ZW5uYUlucHV0Q2JrVHlwZSA9IDQwLAotICBsZWZyQW50ZW5uYUlub3V0Q2JrVHlwZSA9IDQxLAotICBsZWZyQW50ZW5uYU91dHB1dENia1R5cGUgPSA0MiwKLSAgbGVmck1hbnVmYWN0dXJpbmdDYmtUeXBlID0gNDMsCi0gIGxlZnJVc2VNaW5TcGFjaW5nQ2JrVHlwZSA9IDQ0LAotICBsZWZyQ2xlYXJhbmNlTWVhc3VyZUNia1R5cGUgPSA0NSwKLSAgbGVmclRpbWluZ0Nia1R5cGUgPSA0NiwKLSAgbGVmck1hY3JvQ2xhc3NUeXBlQ2JrVHlwZSA9IDQ3LAotICBsZWZyTWFjcm9PcmlnaW5DYmtUeXBlID0gNDgsCi0gIGxlZnJNYWNyb1NpemVDYmtUeXBlID0gNDksCi0gIGxlZnJNYWNyb0ZpeGVkTWFza0Nia1R5cGUgPSA1MCwKLSAgbGVmck1hY3JvRW5kQ2JrVHlwZSA9IDUxLAotICBsZWZyTWF4U3RhY2tWaWFDYmtUeXBlID0gNTIsCi0gIGxlZnJFeHRlbnNpb25DYmtUeXBlID0gNTMsCi0gIGxlZnJEZW5zaXR5Q2JrVHlwZSA9IDU0LAotICBsZWZyRml4ZWRNYXNrQ2JrVHlwZSA9IDU1LAotICBsZWZyTWFjcm9TaXRlQ2JrVHlwZSA9IDU2LAotICBsZWZyTWFjcm9Gb3JlaWduQ2JrVHlwZSA9IDU3LAotCi0gIGxlZnJMaWJyYXJ5RW5kQ2JrVHlwZSA9IDU4Ci19IGxlZnJDYWxsYmFja1R5cGVfZTsKLQotLyogRGVjbGFyYXRpb25zIG9mIGZ1bmN0aW9uIHNpZ25hdHVyZXMgZm9yIGVhY2ggdHlwZSBvZiBjYWxsYmFjay4gICAgICAgICAgICAgKi8KLS8qIFRoZXNlIGRlY2xhcmF0aW9ucyBhcmUgdHlwZS1zYWZlIHdoZW4gY29tcGlsaW5nIHdpdGggQU5TSSBDICAgICAgICAgICAgICAgICovCi0vKiBvciBDKys7IHlvdSB3aWxsIG9ubHkgYmUgYWJsZSB0byByZWdpc3RlciBhIGZ1bmN0aW9uIHBvaW50ZXIgICAgICAgICAgICAgICAqLwotLyogd2l0aCB0aGUgY29ycmVjdCBzaWduYXR1cmUgZm9yIGEgZ2l2ZW4gdHlwZSBvZiBjYWxsYmFjay4gICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBFYWNoIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIHJldHVybiAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAqLwotLyogQSBub24temVybyByZXR1cm4gY29kZSB3aWxsIGNhdXNlIHRoZSByZWFkZXIgdG8gYWJvcnQuICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGUgbGVmckRlc2lnblN0YXJ0IGFuZCBsZWZyRGVzaWduRW5kIGNhbGxiYWNrIGlzIG9ubHkgY2FsbGVkIG9uY2UuICAgICAgICAqLwotLyogT3RoZXIgY2FsbGJhY2tzIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMsIGVhY2ggdGltZSB3aXRoIGEgZGlmZmVyZW50ICAgKi8KLS8qIHNldCBvZiBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRm9yIGVhY2ggY2FsbGJhY2ssIHRoZSBEZWYgQVBJIHdpbGwgbWFrZSB0aGUgY2FsbGJhY2sgdG8gdGhlICAgICAgICAgICAgICAgKi8KLS8qIGZ1bmN0aW9uIHN1cHBsaWVkIGJ5IHRoZSBjbGllbnQsIHdoaWNoIHNob3VsZCBlaXRoZXIgbWFrZSBhIGNvcHkgICAgICAgICAgICovCi0vKiBvZiB0aGUgRGVmIG9iamVjdCwgb3Igc3RvcmUgdGhlIGRhdGEgaW4gdGhlIGNsaWVudCdzIG93biBkYXRhIHN0cnVjdHVyZXMuICAqLwotLyogVGhlIERlZiBBUEkgd2lsbCBkZWxldGUgb3IgcmV1c2UgZWFjaCBvYmplY3QgYWZ0ZXIgbWFraW5nIHRoZSBjYWxsYmFjaywgICAgKi8KLS8qIHNvIHRoZSBjbGllbnQgc2hvdWxkIG5vdCBrZWVwIGEgcG9pbnRlciB0byBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogQWxsIGNhbGxiYWNrcyBwYXNzIHRoZSB1c2VyIGRhdGEgcG9pbnRlciBwcm92aWRlZCBpbiBsZWZyUmVhZCgpICAgICAgICAgICAgKi8KLS8qIG9yIGxlZnJTZXRVc2VyRGF0YSgpIGJhY2sgdG8gdGhlIGNsaWVudDsgdGhpcyBjYW4gYmUgdXNlZCBieSB0aGUgICAgICAgICAgICovCi0vKiBjbGllbnQgdG8gb2J0YWluIGFjY2VzcyB0byB0aGUgcmVzdCBvZiB0aGUgY2xpZW50J3MgZGF0YSBzdHJ1Y3R1cmVzLiAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoZSB1c2VyIGRhdGEgcG9pbnRlciBpcyBvYnRhaW5lZCB1c2luZyBsZWZyR2V0VXNlckRhdGEoKSBpbW1lZGlhdGVseSAgICAgICovCi0vKiBwcmlvciB0byBtYWtpbmcgZWFjaCBjYWxsYmFjaywgc28gdGhlIGNsaWVudCBpcyBmcmVlIHRvIGNoYW5nZSB0aGUgICAgICAgICAqLwotLyogdXNlciBkYXRhIG9uIHRoZSBmbHkgaWYgbmVjZXNzYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBDYWxsYmFja3Mgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgYXJlIHBhc3NlZCBhIGNhbGxiYWNrIHR5cGUgICAgICAgICAgICAgICAqLwotLyogcGFyYW1ldGVyLCB3aGljaCBhbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gd3JpdGUgYSBzaW5nbGUgY2FsbGJhY2sgICAgICAgICAgKi8KLS8qIGZ1bmN0aW9uLCByZWdpc3RlciB0aGF0IGZ1bmN0aW9uIGZvciBtdWx0aXBsZSBjYWxsYmFja3MsIHRoZW4gICAgICAgICAgICAgICovCi0vKiBzd2l0Y2ggYmFzZWQgb24gdGhlIGNhbGxiYWNrIHR5cGUgdG8gaGFuZGxlIHRoZSBhcHByb3ByaWF0ZSB0eXBlIG9mICAgICAgICAqLwotLyogZGF0YS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotLyogQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gbm90aGluZy4gICAgICAgKi8KLXR5cGVkZWYgaW50ICgqbGVmclZvaWRDYmtGblR5cGUpIChsZWZyQ2FsbGJhY2tUeXBlX2UsIHZvaWQqIG51bSwgbGVmaVVzZXJEYXRhKTsKLQotLyogQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBzdHJpbmcuICAgICAgKi8KLXR5cGVkZWYgaW50ICgqbGVmclN0cmluZ0Nia0ZuVHlwZSkgKGxlZnJDYWxsYmFja1R5cGVfZSwgY29uc3QgY2hhciAqc3RyaW5nLCBsZWZpVXNlckRhdGEpOwotCi0vKiBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBhIGludGVnZXIuICAgICAqLwotdHlwZWRlZiBpbnQgKCpsZWZySW50ZWdlckNia0ZuVHlwZSkgKGxlZnJDYWxsYmFja1R5cGVfZSwgaW50IG51bWJlciwgbGVmaVVzZXJEYXRhKTsKLQotLyogQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBkb3VibGUuICAgICAgKi8KLXR5cGVkZWYgaW50ICgqbGVmckRvdWJsZUNia0ZuVHlwZSkgKGxlZnJDYWxsYmFja1R5cGVfZSwgZG91YmxlIG51bWJlciwgbGVmaVVzZXJEYXRhKTsKLQotLyogQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBsZWZpVW5pdHMuICAgKi8KLXR5cGVkZWYgaW50ICgqbGVmclVuaXRzQ2JrRm5UeXBlKSAobGVmckNhbGxiYWNrVHlwZV9lLCBsZWZpVW5pdHMqIHVuaXRzLCBsZWZpVXNlckRhdGEpOwotCi0vKiBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBhIGxlZmlMYXllci4gICAqLwotdHlwZWRlZiBpbnQgKCpsZWZyTGF5ZXJDYmtGblR5cGUpIChsZWZyQ2FsbGJhY2tUeXBlX2UsIGxlZmlMYXllciogbCwgbGVmaVVzZXJEYXRhKTsKLQotLyogQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBsZWZpVmlhLiAgICAgKi8KLXR5cGVkZWYgaW50ICgqbGVmclZpYUNia0ZuVHlwZSkgKGxlZnJDYWxsYmFja1R5cGVfZSwgbGVmaVZpYSogbCwgbGVmaVVzZXJEYXRhKTsKLQotLyogQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBsZWZpVmlhUnVsZS4gKi8KLXR5cGVkZWYgaW50ICgqbGVmclZpYVJ1bGVDYmtGblR5cGUpIChsZWZyQ2FsbGJhY2tUeXBlX2UsIGxlZmlWaWFSdWxlKiBsLCBsZWZpVXNlckRhdGEpOwotCi0vKiBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBhIGxlZmlTcGFjaW5nLiAqLwotdHlwZWRlZiBpbnQgKCpsZWZyU3BhY2luZ0Nia0ZuVHlwZSkgKGxlZnJDYWxsYmFja1R5cGVfZSwgbGVmaVNwYWNpbmcqIGwsIGxlZmlVc2VyRGF0YSk7Ci0KLS8qIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgbGVmaUlSRHJvcC4gICovCi10eXBlZGVmIGludCAoKmxlZnJJUkRyb3BDYmtGblR5cGUpIChsZWZyQ2FsbGJhY2tUeXBlX2UsIGxlZmlJUkRyb3AqIGwsIGxlZmlVc2VyRGF0YSk7Ci0KLS8qIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgbGVmaU1pbkZlYXR1ICovCi10eXBlZGVmIGludCAoKmxlZnJNaW5GZWF0dXJlQ2JrRm5UeXBlKSAobGVmckNhbGxiYWNrVHlwZV9lLCBsZWZpTWluRmVhdHVyZSogbCwgbGVmaVVzZXJEYXRhKTsKLQotLyogQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBsZWZpTm9uRGVmYXUgKi8KLXR5cGVkZWYgaW50ICgqbGVmck5vbkRlZmF1bHRDYmtGblR5cGUpIChsZWZyQ2FsbGJhY2tUeXBlX2UsIGxlZmlOb25EZWZhdWx0KiBsLCBsZWZpVXNlckRhdGEpOwotCi0vKiBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBhIGxlZmlTaXRlLiAgICAqLwotdHlwZWRlZiBpbnQgKCpsZWZyU2l0ZUNia0ZuVHlwZSkgKGxlZnJDYWxsYmFja1R5cGVfZSwgbGVmaVNpdGUqIGwsIGxlZmlVc2VyRGF0YSk7Ci0KLS8qIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgbGVmaU1hY3JvLiAgICovCi10eXBlZGVmIGludCAoKmxlZnJNYWNyb0Nia0ZuVHlwZSkgKGxlZnJDYWxsYmFja1R5cGVfZSwgbGVmaU1hY3JvKiBsLCBsZWZpVXNlckRhdGEpOwotCi0vKiBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBhIGxlZmlQaW4uICAgICAqLwotdHlwZWRlZiBpbnQgKCpsZWZyUGluQ2JrRm5UeXBlKSAobGVmckNhbGxiYWNrVHlwZV9lLCBsZWZpUGluKiBsLCBsZWZpVXNlckRhdGEpOwotCi0vKiBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBhIGxlZmlPYnN0cnVjdCAqLwotdHlwZWRlZiBpbnQgKCpsZWZyT2JzdHJ1Y3Rpb25DYmtGblR5cGUpIChsZWZyQ2FsbGJhY2tUeXBlX2UsIGxlZmlPYnN0cnVjdGlvbiogbCwgbGVmaVVzZXJEYXRhKTsKLQotLyogQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBsZWZpQXJyYXkuICAgKi8KLXR5cGVkZWYgaW50ICgqbGVmckFycmF5Q2JrRm5UeXBlKSAobGVmckNhbGxiYWNrVHlwZV9lLCBsZWZpQXJyYXkqIGwsIGxlZmlVc2VyRGF0YSk7Ci0KLS8qIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgbGVmaVByb3AuICAgICovCi10eXBlZGVmIGludCAoKmxlZnJQcm9wQ2JrRm5UeXBlKSAobGVmckNhbGxiYWNrVHlwZV9lLCBsZWZpUHJvcCogcCwgbGVmaVVzZXJEYXRhKTsKLQotLyogQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBsZWZpTm9pc2VNYXIgKi8KLXR5cGVkZWYgaW50ICgqbGVmck5vaXNlTWFyZ2luQ2JrRm5UeXBlKSAobGVmckNhbGxiYWNrVHlwZV9lLCBzdHJ1Y3QgbGVmaU5vaXNlTWFyZ2luKiBwLCBsZWZpVXNlckRhdGEpOwotCi0vKiBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBhIGxlZmlOb2lzZVRhYiAqLwotdHlwZWRlZiBpbnQgKCpsZWZyTm9pc2VUYWJsZUNia0ZuVHlwZSkgKGxlZnJDYWxsYmFja1R5cGVfZSwgbGVmaU5vaXNlVGFibGUqIHAsIGxlZmlVc2VyRGF0YSk7Ci0KLS8qIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgbGVmaUNvcnJlY3RpICovCi10eXBlZGVmIGludCAoKmxlZnJDb3JyZWN0aW9uVGFibGVDYmtGblR5cGUpIChsZWZyQ2FsbGJhY2tUeXBlX2UsIGxlZmlDb3JyZWN0aW9uVGFibGUqIHAsIGxlZmlVc2VyRGF0YSk7Ci0KLS8qIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgbGVmaVRpbWluZy4gICovCi10eXBlZGVmIGludCAoKmxlZnJUaW1pbmdDYmtGblR5cGUpIChsZWZyQ2FsbGJhY2tUeXBlX2UsIGxlZmlUaW1pbmcqIHAsIGxlZmlVc2VyRGF0YSk7Ci0KLS8qIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgbGVmaVVzZU1pblNwICovCi10eXBlZGVmIGludCAoKmxlZnJVc2VNaW5TcGFjaW5nQ2JrRm5UeXBlKSAobGVmckNhbGxiYWNrVHlwZV9lLCBsZWZpVXNlTWluU3BhY2luZyogbCwgbGVmaVVzZXJEYXRhKTsKLQotICAvKiBORVcgQ0FMTEJBQ0sgLSBJZiB5b3VyIGNhbGxiYWNrIHJldHVybnMgYSBwb2ludGVyIHRvIGEgbmV3IGNsYXNzIHRoZW4gICAgKi8KLSAgLyogeW91IG11c3QgYWRkIGEgdHlwZSBmdW5jdGlvbiBoZXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLS8qIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgbGVmaU1heFN0YWNrICovCi10eXBlZGVmIGludCAoKmxlZnJNYXhTdGFja1ZpYUNia0ZuVHlwZSkgKGxlZnJDYWxsYmFja1R5cGVfZSwgbGVmaU1heFN0YWNrVmlhKiBsLCBsZWZpVXNlckRhdGEpOwotCi10eXBlZGVmIGludCAoKmxlZnJNYWNyb051bUNia0ZuVHlwZSkgKGxlZnJDYWxsYmFja1R5cGVfZSwgbGVmaU51bSBsLCBsZWZpVXNlckRhdGEpOwotCi0vKiA1LjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBsZWZpRGVuc2l0eS4gKi8KLXR5cGVkZWYgaW50ICgqbGVmckRlbnNpdHlDYmtGblR5cGUpIChsZWZyQ2FsbGJhY2tUeXBlX2UsIGxlZmlEZW5zaXR5KiBsLCBsZWZpVXNlckRhdGEpOwotCi0vKiBGdW5jdGlvbnMgdG8gY2FsbCB0byByZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIHZvaWQgbGVmclNldFVuaXRzQ2JrIChsZWZyVW5pdHNDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmclNldFZlcnNpb25DYmsgKGxlZnJEb3VibGVDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmclNldFZlcnNpb25TdHJDYmsgKGxlZnJTdHJpbmdDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmclNldERpdmlkZXJDaGFyQ2JrIChsZWZyU3RyaW5nQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXRCdXNCaXRDaGFyc0NiayAobGVmclN0cmluZ0Nia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBsZWZyU2V0Tm9XaXJlRXh0ZW5zaW9uQ2JrIChsZWZyU3RyaW5nQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXRDYXNlU2Vuc2l0aXZlQ2JrIChsZWZySW50ZWdlckNia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBsZWZyU2V0UHJvcEJlZ2luQ2JrIChsZWZyVm9pZENia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBsZWZyU2V0UHJvcENiayAobGVmclByb3BDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmclNldFByb3BFbmRDYmsgKGxlZnJWb2lkQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXRMYXllckNiayAobGVmckxheWVyQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXRWaWFDYmsgKGxlZnJWaWFDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmclNldFZpYVJ1bGVDYmsgKGxlZnJWaWFSdWxlQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXRTcGFjaW5nQ2JrIChsZWZyU3BhY2luZ0Nia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBsZWZyU2V0SVJEcm9wQ2JrIChsZWZySVJEcm9wQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXREaWVsZWN0cmljQ2JrIChsZWZyRG91YmxlQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXRNaW5GZWF0dXJlQ2JrIChsZWZyTWluRmVhdHVyZUNia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBsZWZyU2V0Tm9uRGVmYXVsdENiayAobGVmck5vbkRlZmF1bHRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmclNldFNpdGVDYmsgKGxlZnJTaXRlQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXRNYWNyb0JlZ2luQ2JrIChsZWZyU3RyaW5nQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXRQaW5DYmsgKGxlZnJQaW5DYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmclNldE9ic3RydWN0aW9uQ2JrIChsZWZyT2JzdHJ1Y3Rpb25DYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmclNldEFycmF5Q2JrIChsZWZyQXJyYXlDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmclNldE1hY3JvQ2JrIChsZWZyTWFjcm9DYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmclNldExpYnJhcnlFbmRDYmsgKGxlZnJWb2lkQ2JrRm5UeXBlIHAwKTsKLQotLyogTkVXIENBTExCQUNLIC0gZWFjaCBjYWxsYmFjayBtdXN0IGhhdmUgYSBmdW5jdGlvbiB0byBhbGxvdyB0aGUgdXNlciAgICAgICAgKi8KLS8qIHRvIHNldCBpdC4gIEFkZCB0aGUgZnVuY3Rpb24gaGVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLUVYVEVSTiB2b2lkIGxlZnJTZXRUaW1pbmdDYmsgKGxlZnJUaW1pbmdDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmclNldFNwYWNpbmdCZWdpbkNiayAobGVmclZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmclNldFNwYWNpbmdFbmRDYmsgKGxlZnJWb2lkQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXRBcnJheUJlZ2luQ2JrIChsZWZyU3RyaW5nQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXRBcnJheUVuZENiayAobGVmclN0cmluZ0Nia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBsZWZyU2V0SVJEcm9wQmVnaW5DYmsgKGxlZnJWb2lkQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXRJUkRyb3BFbmRDYmsgKGxlZnJWb2lkQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXROb2lzZU1hcmdpbkNiayAobGVmck5vaXNlTWFyZ2luQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXRFZGdlUmF0ZVRocmVzaG9sZDFDYmsgKGxlZnJEb3VibGVDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmclNldEVkZ2VSYXRlVGhyZXNob2xkMkNiayAobGVmckRvdWJsZUNia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBsZWZyU2V0RWRnZVJhdGVTY2FsZUZhY3RvckNiayAobGVmckRvdWJsZUNia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBsZWZyU2V0Tm9pc2VUYWJsZUNiayAobGVmck5vaXNlVGFibGVDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmclNldENvcnJlY3Rpb25UYWJsZUNiayAobGVmckNvcnJlY3Rpb25UYWJsZUNia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBsZWZyU2V0SW5wdXRBbnRlbm5hQ2JrIChsZWZyRG91YmxlQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXRPdXRwdXRBbnRlbm5hQ2JrIChsZWZyRG91YmxlQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXRJbm91dEFudGVubmFDYmsgKGxlZnJEb3VibGVDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmclNldEFudGVubmFJbnB1dENiayAobGVmckRvdWJsZUNia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBsZWZyU2V0QW50ZW5uYUlub3V0Q2JrIChsZWZyRG91YmxlQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXRBbnRlbm5hT3V0cHV0Q2JrIChsZWZyRG91YmxlQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXRDbGVhcmFuY2VNZWFzdXJlQ2JrIChsZWZyU3RyaW5nQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXRNYW51ZmFjdHVyaW5nQ2JrIChsZWZyRG91YmxlQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXRVc2VNaW5TcGFjaW5nQ2JrIChsZWZyVXNlTWluU3BhY2luZ0Nia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBsZWZyU2V0TWFjcm9DbGFzc1R5cGVDYmsgKGxlZnJTdHJpbmdDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmclNldE1hY3JvT3JpZ2luQ2JrIChsZWZyTWFjcm9OdW1DYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmclNldE1hY3JvU2l6ZUNiayAobGVmck1hY3JvTnVtQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXRNYWNyb0ZpeGVkTWFza0NiayAobGVmckludGVnZXJDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmclNldE1hY3JvRW5kQ2JrIChsZWZyU3RyaW5nQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXRNYXhTdGFja1ZpYUNiayAobGVmck1heFN0YWNrVmlhQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXRFeHRlbnNpb25DYmsgKGxlZnJTdHJpbmdDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmclNldERlbnNpdHlDYmsgKGxlZnJEZW5zaXR5Q2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXRGaXhlZE1hc2tDYmsgKGxlZnJJbnRlZ2VyQ2JrRm5UeXBlIHAwKTsKLQotLyogU2V0IGFsbCBvZiB0aGUgY2FsbGJhY2tzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gc2V0IHRvIHRoZSBmb2xsb3dpbmcgICAgICAgKi8KLS8qIGZ1bmN0aW9uLiAgVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBjaGVjayB0byBzZWUgICAgICAgICAgICovCi0vKiBpZiB5b3UgZm9yZ290IGFueXRoaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIHZvaWQgbGVmclNldFVudXNlZENhbGxiYWNrcyAobGVmclZvaWRDYmtGblR5cGUgIGZ1bmMpOwotCi0vKiBSZXNldCBhbGwgdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucyB0byBuaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIHZvaWQgbGVmclVuc2V0Q2FsbGJhY2tzICgpOwotCi0vKiBGdW5jdGlvbnMgdG8gY2FsbCB0byB1bnJlZ2lzdGVyIGEgY2FsbGJhY2sgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIHZvaWQgbGVmclVuc2V0QW50ZW5uYUlucHV0Q2JrICgpOwotRVhURVJOIHZvaWQgbGVmclVuc2V0QW50ZW5uYUlub3V0Q2JrICgpOwotRVhURVJOIHZvaWQgbGVmclVuc2V0QW50ZW5uYU91dHB1dENiayAoKTsKLUVYVEVSTiB2b2lkIGxlZnJVbnNldEFycmF5QmVnaW5DYmsgKCk7Ci1FWFRFUk4gdm9pZCBsZWZyVW5zZXRBcnJheUNiayAoKTsKLUVYVEVSTiB2b2lkIGxlZnJVbnNldEFycmF5RW5kQ2JrICgpOwotRVhURVJOIHZvaWQgbGVmclVuc2V0QnVzQml0Q2hhcnNDYmsgKCk7Ci1FWFRFUk4gdm9pZCBsZWZyVW5zZXRDYXNlU2Vuc2l0aXZlQ2JrICgpOwotRVhURVJOIHZvaWQgbGVmclVuc2V0Q2xlYXJhbmNlTWVhc3VyZUNiayAoKTsKLUVYVEVSTiB2b2lkIGxlZnJVbnNldENvcnJlY3Rpb25UYWJsZUNiayAoKTsKLUVYVEVSTiB2b2lkIGxlZnJVbnNldERlbnNpdHlDYmsgKCk7Ci1FWFRFUk4gdm9pZCBsZWZyVW5zZXREaWVsZWN0cmljQ2JrICgpOwotRVhURVJOIHZvaWQgbGVmclVuc2V0RGl2aWRlckNoYXJDYmsgKCk7Ci1FWFRFUk4gdm9pZCBsZWZyVW5zZXRFZGdlUmF0ZVNjYWxlRmFjdG9yQ2JrICgpOwotRVhURVJOIHZvaWQgbGVmclVuc2V0RWRnZVJhdGVUaHJlc2hvbGQxQ2JrICgpOwotRVhURVJOIHZvaWQgbGVmclVuc2V0RWRnZVJhdGVUaHJlc2hvbGQyQ2JrICgpOwotRVhURVJOIHZvaWQgbGVmclVuc2V0RXh0ZW5zaW9uQ2JrICgpOwotRVhURVJOIHZvaWQgbGVmclVuc2V0SW5vdXRBbnRlbm5hQ2JrICgpOwotRVhURVJOIHZvaWQgbGVmclVuc2V0SW5wdXRBbnRlbm5hQ2JrICgpOwotRVhURVJOIHZvaWQgbGVmclVuc2V0SVJEcm9wQmVnaW5DYmsgKCk7Ci1FWFRFUk4gdm9pZCBsZWZyVW5zZXRJUkRyb3BDYmsgKCk7Ci1FWFRFUk4gdm9pZCBsZWZyVW5zZXRJUkRyb3BFbmRDYmsgKCk7Ci1FWFRFUk4gdm9pZCBsZWZyVW5zZXRMYXllckNiayAoKTsKLUVYVEVSTiB2b2lkIGxlZnJVbnNldExpYnJhcnlFbmRDYmsgKCk7Ci1FWFRFUk4gdm9pZCBsZWZyVW5zZXRNYWNyb0JlZ2luQ2JrICgpOwotRVhURVJOIHZvaWQgbGVmclVuc2V0TWFjcm9DYmsgKCk7Ci1FWFRFUk4gdm9pZCBsZWZyVW5zZXRNYWNyb0NsYXNzVHlwZUNiayAoKTsKLUVYVEVSTiB2b2lkIGxlZnJVbnNldE1hY3JvRW5kQ2JrICgpOwotRVhURVJOIHZvaWQgbGVmclVuc2V0TWFjcm9PcmlnaW5DYmsgKCk7Ci1FWFRFUk4gdm9pZCBsZWZyVW5zZXRNYWNyb1NpemVDYmsgKCk7Ci1FWFRFUk4gdm9pZCBsZWZyVW5zZXRNYW51ZmFjdHVyaW5nQ2JrICgpOwotRVhURVJOIHZvaWQgbGVmclVuc2V0TWF4U3RhY2tWaWFDYmsgKCk7Ci1FWFRFUk4gdm9pZCBsZWZyVW5zZXRNaW5GZWF0dXJlQ2JrICgpOwotRVhURVJOIHZvaWQgbGVmclVuc2V0Tm9pc2VNYXJnaW5DYmsgKCk7Ci1FWFRFUk4gdm9pZCBsZWZyVW5zZXROb2lzZVRhYmxlQ2JrICgpOwotRVhURVJOIHZvaWQgbGVmclVuc2V0Tm9uRGVmYXVsdENiayAoKTsKLUVYVEVSTiB2b2lkIGxlZnJVbnNldE5vV2lyZUV4dGVuc2lvbkNiayAoKTsKLUVYVEVSTiB2b2lkIGxlZnJVbnNldE9ic3RydWN0aW9uQ2JrICgpOwotRVhURVJOIHZvaWQgbGVmclVuc2V0T3V0cHV0QW50ZW5uYUNiayAoKTsKLUVYVEVSTiB2b2lkIGxlZnJVbnNldFBpbkNiayAoKTsKLUVYVEVSTiB2b2lkIGxlZnJVbnNldFByb3BCZWdpbkNiayAoKTsKLUVYVEVSTiB2b2lkIGxlZnJVbnNldFByb3BDYmsgKCk7Ci1FWFRFUk4gdm9pZCBsZWZyVW5zZXRQcm9wRW5kQ2JrICgpOwotRVhURVJOIHZvaWQgbGVmclVuc2V0U2l0ZUNiayAoKTsKLUVYVEVSTiB2b2lkIGxlZnJVbnNldFNwYWNpbmdCZWdpbkNiayAoKTsKLUVYVEVSTiB2b2lkIGxlZnJVbnNldFNwYWNpbmdDYmsgKCk7Ci1FWFRFUk4gdm9pZCBsZWZyVW5zZXRTcGFjaW5nRW5kQ2JrICgpOwotRVhURVJOIHZvaWQgbGVmclVuc2V0VGltaW5nQ2JrICgpOwotRVhURVJOIHZvaWQgbGVmclVuc2V0VXNlTWluU3BhY2luZ0NiayAoKTsKLUVYVEVSTiB2b2lkIGxlZnJVbnNldFVuaXRzQ2JrICgpOwotRVhURVJOIHZvaWQgbGVmclVuc2V0VmVyc2lvbkNiayAoKTsKLUVYVEVSTiB2b2lkIGxlZnJVbnNldFZlcnNpb25TdHJDYmsgKCk7Ci1FWFRFUk4gdm9pZCBsZWZyVW5zZXRWaWFDYmsgKCk7Ci1FWFRFUk4gdm9pZCBsZWZyVW5zZXRWaWFSdWxlQ2JrICgpOwotCi0vKiBSZXR1cm4gdGhlIGN1cnJlbnQgbGluZSBudW1iZXIgaW4gdGhlIHBhcnNlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZyTGluZU51bWJlciAoKTsKLQotLyogUm91dGluZSB0byBzZXQgdGhlIG1lc3NhZ2UgbG9nZ2luZyByb3V0aW5lIGZvciBlcnJvcnMgICAgICAgICAgICAgICAgICAgICAgKi8KLXR5cGVkZWYgdm9pZCAoKkxFRklfTE9HX0ZVTkNUSU9OKSAoY29uc3QgY2hhciopOwotRVhURVJOIHZvaWQgbGVmclNldExvZ0Z1bmN0aW9uIChMRUZJX0xPR19GVU5DVElPTiBwMCk7Ci0KLS8qIFJvdXRpbmUgdG8gc2V0IHRoZSBtZXNzYWdlIGxvZ2dpbmcgcm91dGluZSBmb3Igd2FybmluZ3MgICAgICAgICAgICAgICAgICAgICovCi10eXBlZGVmIHZvaWQgKCpMRUZJX1dBUk5JTkdfTE9HX0ZVTkNUSU9OKSAoY29uc3QgY2hhciopOwotRVhURVJOIHZvaWQgbGVmclNldFdhcm5pbmdMb2dGdW5jdGlvbiAoTEVGSV9XQVJOSU5HX0xPR19GVU5DVElPTiBwMCk7Ci0KLS8qIFJvdXRpbmUgdG8gc2V0IHRoZSB1c2VyIGRlZmluZWQgbWFsbG9jIHJvdXRpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi10eXBlZGVmIHZvaWQqICgqTEVGSV9NQUxMT0NfRlVOQ1RJT04pIChpbnQpOwotRVhURVJOIHZvaWQgbGVmclNldE1hbGxvY0Z1bmN0aW9uIChMRUZJX01BTExPQ19GVU5DVElPTiBwMCk7Ci0KLS8qIFJvdXRpbmUgdG8gc2V0IHRoZSB1c2VyIGRlZmluZWQgcmVhbGxvYyByb3V0aW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi10eXBlZGVmIHZvaWQqICgqTEVGSV9SRUFMTE9DX0ZVTkNUSU9OKSAodm9pZCAqLCBpbnQpOwotRVhURVJOIHZvaWQgbGVmclNldFJlYWxsb2NGdW5jdGlvbiAoTEVGSV9SRUFMTE9DX0ZVTkNUSU9OIHAwKTsKLQotLyogUm91dGluZSB0byBzZXQgdGhlIHVzZXIgZGVmaW5lZCBmcmVlIHJvdXRpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLXR5cGVkZWYgdm9pZCAoKkxFRklfRlJFRV9GVU5DVElPTikgKHZvaWQgKik7Ci1FWFRFUk4gdm9pZCBsZWZyU2V0RnJlZUZ1bmN0aW9uIChMRUZJX0ZSRUVfRlVOQ1RJT04gcDApOwotCi0vKiBSb3V0aW5lIHRvIHNldCB0aGUgbGluZSBudW1iZXIgY2FsbGJhY2sgcm91dGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotdHlwZWRlZiB2b2lkICgqTEVGSV9MSU5FX05VTUJFUl9GVU5DVElPTikgKGludCk7Ci1FWFRFUk4gdm9pZCBsZWZyU2V0TGluZU51bWJlckZ1bmN0aW9uIChMRUZJX0xJTkVfTlVNQkVSX0ZVTkNUSU9OIHAwKTsKLQotLyogU2V0IHRoZSBudW1iZXIgb2YgbGluZXMgYmVmb3JlIGNhbGxpbmcgdGhlIGxpbmUgZnVuY3Rpb24gY2FsbGJhY2sgcm91dGluZSAgKi8KLS8qIERlZmF1bHQgaXMgMTAwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gdm9pZCBsZWZyU2V0RGVsdGFOdW1iZXJMaW5lcyAoaW50IHAwKTsKLQotLyogUENSIDU1MTIyOSAtIFNldCB0aGUgcGFyc2VyIHRvIGJlIG1vcmUgcmVsYXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgYXBpIGlzIHNwZWNpZmljIGZvciBQS1MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBXaGVuIGluIHJlbGF4IG1vZGUsIHRoZSBwYXJzZXIgd2lsbCBub3QgcmVxdWlyZSB3aWR0aCwgcGl0Y2gsICYgZGlyZWN0aW9uICAqLwotLyogaW4gcm91dGluZyBsYXllcnMuIEFsc28gdmlhcyBpbiBub25kZWZhdWx0IHJ1bGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiB2b2lkIGxlZnJTZXRSZWxheE1vZGUgKCk7Ci1FWFRFUk4gdm9pZCBsZWZyVW5zZXRSZWxheE1vZGUgKCk7Ci0KLS8qIFBDUiA1NjUyNzQgLSBMRUYvREVGIEFQSSBzaG91bGQgaGF2ZSB0aGUgQVBJIGNhbGwgdG8gb3ZlcndyaXRlIGRlZmF1bHQgICAgICovCi0vKiAgICAgICAgICAgICAgdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIHZvaWQgbGVmclNldFZlcnNpb25WYWx1ZSAoY29uc3QgIGNoYXIqICAgdmVyc2lvbik7Ci0KLS8qIFJvdXRpbmUgdG8gc2V0IHRoZSByZWFkIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi10eXBlZGVmIHNpemVfdCAoKkxFRklfUkVBRF9GVU5DVElPTikgKEZJTEUqLCBjaGFyKiwgc2l6ZV90KTsKLUVYVEVSTiB2b2lkIGxlZnJTZXRSZWFkRnVuY3Rpb24gKExFRklfUkVBRF9GVU5DVElPTiBwMCk7Ci1FWFRFUk4gdm9pZCBsZWZyVW5zZXRSZWFkRnVuY3Rpb24gKCk7Ci0KLS8qIFJvdXRpbmUgdG8gc2V0IHRoZSBsZWZyV2FybmluZy5sb2cgdG8gb3BlbiBhcyBhcHBlbmQgaW5zdGVhZCBmb3Igd3JpdGUgICAgICovCi0vKiBOZXcgaW4gNS43ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIHZvaWQgbGVmclNldE9wZW5Mb2dGaWxlQXBwZW5kICgpOwotRVhURVJOIHZvaWQgbGVmclVuc2V0T3BlbkxvZ0ZpbGVBcHBlbmQgKCk7Ci0KLS8qIFJvdXRpbmUgdG8gZGlzYWJsZSBzdHJpbmcgcHJvcGVydHkgdmFsdWUgcHJvY2VzcywgZGVmYXVsdCBpdCB3aWxsIHByb2Nlc3MgICovCi0vKiB0aGUgdmFsdWUgc3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIHZvaWQgbGVmckRpc2FibGVQcm9wU3RyUHJvY2VzcyAoKTsKLQotLyogUm91dGluZSB0byBzZXQgdGhlIG1heCBudW1iZXIgb2Ygd2FybmluZ3MgZm9yIGEgcGVydGljdWxhciBzZWN0aW9uICAgICAgICAgKi8KLQotRVhURVJOIHZvaWQgbGVmclNldEFudGVubmFJbm91dFdhcm5pbmdzIChpbnQgIHdhcm4pOwotRVhURVJOIHZvaWQgbGVmclNldEFudGVubmFJbnB1dFdhcm5pbmdzIChpbnQgIHdhcm4pOwotRVhURVJOIHZvaWQgbGVmclNldEFudGVubmFPdXRwdXRXYXJuaW5ncyAoaW50ICB3YXJuKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXRBcnJheVdhcm5pbmdzIChpbnQgIHdhcm4pOwotRVhURVJOIHZvaWQgbGVmclNldENhc2VTZW5zaXRpdmVXYXJuaW5ncyAoaW50ICB3YXJuKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXRDb3JyZWN0aW9uVGFibGVXYXJuaW5ncyAoaW50ICB3YXJuKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXREaWVsZWN0cmljV2FybmluZ3MgKGludCAgd2Fybik7Ci1FWFRFUk4gdm9pZCBsZWZyU2V0RWRnZVJhdGVUaHJlc2hvbGQxV2FybmluZ3MgKGludCAgd2Fybik7Ci1FWFRFUk4gdm9pZCBsZWZyU2V0RWRnZVJhdGVUaHJlc2hvbGQyV2FybmluZ3MgKGludCAgd2Fybik7Ci1FWFRFUk4gdm9pZCBsZWZyU2V0RWRnZVJhdGVTY2FsZUZhY3Rvcldhcm5pbmdzIChpbnQgIHdhcm4pOwotRVhURVJOIHZvaWQgbGVmclNldElub3V0QW50ZW5uYVdhcm5pbmdzIChpbnQgIHdhcm4pOwotRVhURVJOIHZvaWQgbGVmclNldElucHV0QW50ZW5uYVdhcm5pbmdzIChpbnQgIHdhcm4pOwotRVhURVJOIHZvaWQgbGVmclNldElSRHJvcFdhcm5pbmdzIChpbnQgIHdhcm4pOwotRVhURVJOIHZvaWQgbGVmclNldExheWVyV2FybmluZ3MgKGludCAgd2Fybik7Ci1FWFRFUk4gdm9pZCBsZWZyU2V0TWFjcm9XYXJuaW5ncyAoaW50ICB3YXJuKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXRNYXhTdGFja1ZpYVdhcm5pbmdzIChpbnQgIHdhcm4pOwotRVhURVJOIHZvaWQgbGVmclNldE1pbkZlYXR1cmVXYXJuaW5ncyAoaW50ICB3YXJuKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXROb2lzZU1hcmdpbldhcm5pbmdzIChpbnQgIHdhcm4pOwotRVhURVJOIHZvaWQgbGVmclNldE5vaXNlVGFibGVXYXJuaW5ncyAoaW50ICB3YXJuKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXROb25EZWZhdWx0V2FybmluZ3MgKGludCAgd2Fybik7Ci1FWFRFUk4gdm9pZCBsZWZyU2V0Tm9XaXJlRXh0ZW5zaW9uV2FybmluZ3MgKGludCAgd2Fybik7Ci1FWFRFUk4gdm9pZCBsZWZyU2V0T3V0cHV0QW50ZW5uYVdhcm5pbmdzIChpbnQgIHdhcm4pOwotRVhURVJOIHZvaWQgbGVmclNldFBpbldhcm5pbmdzIChpbnQgIHdhcm4pOwotRVhURVJOIHZvaWQgbGVmclNldFNpdGVXYXJuaW5ncyAoaW50ICB3YXJuKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXRTcGFjaW5nV2FybmluZ3MgKGludCAgd2Fybik7Ci1FWFRFUk4gdm9pZCBsZWZyU2V0VGltaW5nV2FybmluZ3MgKGludCAgd2Fybik7Ci1FWFRFUk4gdm9pZCBsZWZyU2V0VW5pdHNXYXJuaW5ncyAoaW50ICB3YXJuKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXRVc2VNaW5TcGFjaW5nV2FybmluZ3MgKGludCAgd2Fybik7Ci1FWFRFUk4gdm9pZCBsZWZyU2V0VmlhUnVsZVdhcm5pbmdzIChpbnQgIHdhcm4pOwotRVhURVJOIHZvaWQgbGVmclNldFZpYVdhcm5pbmdzIChpbnQgIHdhcm4pOwotCi0vKiBIYW5kbGluZyBvdXRwdXQgbWVzc2FnZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIHZvaWQgbGVmckRpc2FibGVQYXJzZXJNc2dzIChpbnQgIG5Nc2csIGludCogIG1zZ3MpOwotRVhURVJOIHZvaWQgbGVmckVuYWJsZVBhcnNlck1zZ3MgKGludCAgbk1zZywgaW50KiAgbXNncyk7Ci1FWFRFUk4gdm9pZCBsZWZyRW5hYmxlQWxsTXNncyAoKTsKLUVYVEVSTiB2b2lkIGxlZnJEaXNhYmxlQWxsTXNncyAoKTsKLUVYVEVSTiB2b2lkIGxlZnJTZXRUb3RhbE1zZ0xpbWl0IChpbnQgIHRvdE51bU1zZ3MpOwotRVhURVJOIHZvaWQgbGVmclNldExpbWl0UGVyTXNnIChpbnQgIG1zZ0lkLCBpbnQgIG51bU1zZyk7Ci0KLS8qIFJldHVybiBjb2RlcyBmb3IgdGhlIHVzZXIgY2FsbGJhY2tzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGUgdXNlciBzaG91bGQgcmV0dXJuIG9uZSBvZiB0aGVzZSB2YWx1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBQQVJTRV9PSyAwICAgICAgCi0jZGVmaW5lIFNUT1BfUEFSU0UgMSAgICAKLSNkZWZpbmUgUEFSU0VfRVJST1IgMiAgIAotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL2xlZndXcml0ZXIuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL2xlZndXcml0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNhNGY5Zi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi9sZWZ3V3JpdGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTI4ICswLDAgQEAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQ29weXJpZ2h0IDIwMTIgLSAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZSAgICAgICAgICAgICAqLwotLyogRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAqLwotLyogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgKi8KLS8qICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAqLwotLyogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgKi8KLS8qICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgICAgICovCi0vKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgICAgICAqLwotLyogICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LCAgICAgICAgICAqLwotLyogY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJEF1dGhvcjogZGVsbCAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkUmV2aXNpb246ICMxICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkRGF0ZTogMjAxNy8wNi8wNiAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRTdGF0ZTogICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0KLSNpZm5kZWYgQ0xFRldXUklURVJfSAotI2RlZmluZSBDTEVGV1dSSVRFUl9ICi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImxlZmlUeXBlZGVmcy5oIgotCi0vKiBSZXR1cm4gY29kZXMgZm9yIHdyaXRpbmcgZnVuY3Rpb25zOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBMRUZXX09LICAgICAgICAgICAgICAgMAotI2RlZmluZSBMRUZXX1VOSU5JVElBTElaRUQgICAgMQotI2RlZmluZSBMRUZXX0JBRF9PUkRFUiAgICAgICAgMgotI2RlZmluZSBMRUZXX0JBRF9EQVRBICAgICAgICAgMwotI2RlZmluZSBMRUZXX0FMUkVBRFlfREVGSU5FRCAgNAotI2RlZmluZSBMRUZXX1dST05HX1ZFUlNJT04gICAgNQotI2RlZmluZSBMRUZXX01JWF9WRVJTSU9OX0RBVEEgNgotI2RlZmluZSBMRUZXX09CU09MRVRFICAgICAgICAgNwotCi0vKiBvcmllbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAwID0gTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgMSA9IFcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIDIgPSBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAzID0gRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgNCA9IEZOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIDUgPSBGVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICA2ID0gRlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgNyA9IEZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLS8qIFRoZSBMRUYgd3JpdGVyIGluaXRpYWxpemF0aW9uLiAgTXVzdCBiZSBjYWxsZWQgZmlyc3QuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGxlZndJbml0Q2JrIHNob3VsZCBiZSBjYWxsIG9ubHksICAgICAgICAgICAgICAgICAgICAqLwotLyogQ2FuJ3QgY2FsbCBib3RoIHJvdXRpbmVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3SW5pdCAoRklMRSogIGYpOwotCi0vKiBUaGUgTEVGIHdyaXRlciBpbml0aWFsaXphdGlvbi4gIE11c3QgYmUgY2FsbGVkIGZpcnN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRWl0aGVyIHRoaXMgcm91dGluZSBvciBsZWZ3SW5pdCBzaG91bGQgYmUgY2FsbCBvbmx5LCAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIENhbid0IGNhbGwgYm90aCByb3V0aW5lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0luaXRDYmsgKEZJTEUqICBmKTsKLQotLyogVGhpcyByb3V0aW5lIHdpbGwgc2V0IHRoZSB3cml0ZXIgdG8gd3JpdGUgb3V0IGFuIGVuY3J5cHRlZCAgICAgICAgICAgICAgICAgKi8KLS8qIGxlZiBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlIGFuZCBoYXMgdG8gYmUgY2FsbGVkIGFmdGVyICAgICAgICAgICAqLwotLyogbGVmd0luaXQgb3IgbGVmd0luaXRDYmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5lZWQgdG8gY2FsbCBsZWZ3Q2xvc2VFbmNyeXB0IHRvIGRvIHNvbWUgY2xlYW5pbmcgaWYgdGhpcyByb3V0aW5lICAgICAgICAgICovCi0vKiBoYXMgY2FsbGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3RW5jcnlwdCAoKTsKLQotLyogVGhpcyByb3V0aW5lIG5lZWRzIHRvIGJlIGNhbGxlZCBpZiBsZWZ3RW5jcnlwdCBoYXMgY2FsbGVkLiAgICAgICAgICAgICAgICAgKi8KLS8qIEl0IHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBmY2xvc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBJdCBkb2VzIHNvbWUgaG91c2UgY2xlYW5pbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3Q2xvc2VFbmNyeXB0ICgpOwotCi0vKiBUaGlzIHJvdXRpbmUgd2lsbCB3cml0ZSBhIGJsYW5rIGxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi1FWFRFUk4gaW50IGxlZndOZXdMaW5lICgpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndJbml0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndWZXJzaW9uIChpbnQgIHZlcnMxLCBpbnQgIHZlcnMyKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3SW5pdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlIGNhc2VTZW5zaXRpdmUgY2FuIGJlIE9OIG9yIE9GRi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0Nhc2VTZW5zaXRpdmUgKGNvbnN0IGNoYXIqICBjYXNlU2Vuc2l0aXZlKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3SW5pdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlIG5vV2lyZUV4dGVuc2lvbkF0UGluIGNhbiBiZSBPTiBvciBPRkYuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd05vV2lyZUV4dGVuc2lvbkF0UGluIChjb25zdCBjaGFyKiAgbm9XaXJlRXh0KTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3SW5pdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgIGFscmVhZHkgaGF2ZSBvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd01pbmZlYXR1cmUgKGRvdWJsZSAgbWluRmVhdHVyZVgsIGRvdWJsZSAgbWluRmVhdHVyZVkpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndJbml0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndEaWVsZWN0cmljIChkb3VibGUgIGRpZWxlY3RyaWMpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndJbml0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndCdXNCaXRDaGFycyAoY29uc3QgY2hhciogIGJ1c0JpdENoYXJzKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3SW5pdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3RGl2aWRlckNoYXIgKGNvbnN0IGNoYXIqICBkaXZpZGVyQ2hhcik7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd0luaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNCBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNYW51ZmFjdHVyaW5nR3JpZCAoZG91YmxlICBncmlkKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3SW5pdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGlzIGEgNS44IHN5bnRheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0ZpeGVkTWFzayAoKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3SW5pdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGlzIGEgNS40IHN5bnRheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd1VzZU1pblNwYWNpbmcgKGNvbnN0IGNoYXIqICB0eXBlLCBjb25zdCBjaGFyKiAgb25PZmYpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndJbml0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgaXMgYSA1LjQgc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3Q2xlYXJhbmNlTWVhc3VyZSAoY29uc3QgY2hhciogIHR5cGUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndJbml0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgaXMgYSA1LjQgc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3QW50ZW5uYUlucHV0R2F0ZUFyZWEgKGRvdWJsZSAgaW5wdXRHYXRlQXJlYSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd0luaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNCBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndBbnRlbm5hSW5PdXREaWZmQXJlYSAoZG91YmxlICBpbk91dERpZmZBcmVhKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3SW5pdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGlzIGEgNS40IHN5bnRheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0FudGVubmFPdXRwdXREaWZmQXJlYSAoZG91YmxlICBvdXRwdXREaWZmQXJlYSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd0luaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgc2VjdGlvbiBvZiByb3V0aW5lcyBpcyBvcHRpb25hbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGUgcm91dGluZSBzdGFydHMgdGhlIHVuaXRzIHNlY3Rpb24uIEFsbCBvZiB0aGUgdW5pdHMgbXVzdCBmb2xsb3cuICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3U3RhcnRVbml0cyAoKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBvbmNlIGZvciBlYWNoIHVuaXQuICBUaGUgY2FsbCBtdXN0ICAgICAgICAgICAgICAgICAgKi8KLS8qIGJlIHByZWNlZWRlZCBieSBhIGNhbGwgdG8gbGVmd1N0YXJ0VW5pdHMgYW5kIG11c3QgYmUgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiB0ZXJtaW5hdGVkIGJ5IGEgY2FsbCB0byBsZWZ3RW5kVW5pdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd1VuaXRzIChkb3VibGUgIHRpbWUsIGRvdWJsZSAgY2FwYWNpdGFuY2UsIGRvdWJsZSAgcmVzaXN0YW5jZSwgZG91YmxlICBwb3dlciwgZG91YmxlICBjdXJyZW50LCBkb3VibGUgIHZvbHRhZ2UsIGRvdWJsZSAgZGF0YWJhc2UpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggdW5pdC4gIEl0IGlzIHNlcGFyYXRlZCBmcm9tICAgICAgICAgICAqLwotLyogbGVmd1VuaXRzIGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJsZSBmb3IgcHJlIDUuMy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndVbml0c0ZyZXF1ZW5jeSAoZG91YmxlICBmcmVxdWVuY3kpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxlZndVbml0cyBjYWxsIChpZiBhbnkpLiAgICAgICAgICAgICAqLwotLyogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndFbmRVbml0cyAoKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3SW5pdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nIG11c3QgYmUgY2FsbGVkLiAgICAgICAgICAgICAgICovCi0vKiBNdWx0aXBsZSBzZWN0aW9ucyBvZiBsZWZ3U3RhcnRMYXllciBjYW4gYmUgY2FsbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBzZWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGUgcm91dGluZSBzdGFydHMgdGhlIGxheWVyIHNlY3Rpb24uIEFsbCBvZiB0aGUgbGF5ZXJzIG11c3QgZm9sbG93LiAgICAgICAqLwotLyogVGhlIHR5cGUgY2FuIGJlIGVpdGhlciBDVVQgZm9yIEN1dCBMYXllciwgTUFTVEVSU0xJQ0Ugb3IgT1ZFUkxBUCBmb3IgICAgICAgKi8KLS8qIE1hc3RlcnNsaWNlIG9yIE92ZXJsYXkgTGF5ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndTdGFydExheWVyIChjb25zdCBjaGFyKiAgbGF5ZXJOYW1lLCBjb25zdCBjaGFyKiAgdHlwZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRMYXllci4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHNlY3Rpb24gb2Ygcm91dGluZXMgaXMgb3B0aW9uYWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgaXMgYSA1Ljggc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllck1hc2sgKGludCAgbWFza0NvbG9yKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydExheWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgc2VjdGlvbiBvZiByb3V0aW5lcyBpcyBvcHRpb25hbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNSBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgaWYgdGhlIGxheWVyIHR5cGUgaXMgSU1QTEFOVCB3aGVuICAgICAgICAgICAgICAgICAgICovCi0vKiBsZWZ3U3RhcnRMYXllciBpcyBjYWxsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TGF5ZXJXaWR0aCAoZG91YmxlICBtaW5XaWR0aCk7Ci0KLS8qIFRoZSBmb2xsb3dpbmcgQVBJcyBhcmUgZm9yIGxlZndyaXRlIDUuNyBMYXllciwgU3BhY2luZyB3aXRoIHR5cGUgQ1VUICAgICAgICovCi0vKiBEdWUgdG8gYWRkaW5nIG5ldyBjb25zdHJ1Y3RzLCBpdCBpcyBpbXBvc3NpYmxlIHRvIHVzZSB0aGUgcHJldmlvdXMgICAgICAgICAqLwotLyogQVBJcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoZSBmb2xsb3dpbmcgQVBJcyBhcmUgb2Jzb2xldGVkIGluIDUuNzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBsZWZ3TGF5ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgbGVmd0xheWVyU3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGxlZndMYXllclNwYWNpbmdBZGphY2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBsZWZ3TGF5ZXJTcGFjaW5nQ2VudGVyVG9DZW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIHN0YXJ0cyB0aGUgTGF5ZXIgVHlwZSBDdXQgU3BhY2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGUgcm91dGluZyBsZWZ3TGF5ZXJDdXRTcGFjaW5nRW5kIGhhcyB0byBjYWxsIGF0IHRoZSBlbmQgb2YgZWFjaCBzcGFjaW5nLiAqLwotLyogVGhpcyBpcyBhIDUuNyBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyQ3V0U3BhY2luZyAoZG91YmxlICBzcGFjaW5nKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndMYXllclNwYWNpbmcgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNyBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyQ3V0U3BhY2luZ0NlbnRlclRvQ2VudGVyICgpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd0xheWVyU3BhY2luZyAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGlzIGEgNS43IHN5bnRheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TGF5ZXJDdXRTcGFjaW5nU2FtZU5ldCAoKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndMYXllclNwYWNpbmcgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBFaXRoZXIgdGhpcyByb3V0aW5lLCBsZWZ3TGF5ZXJDdXRTcGFjaW5nQWRqYWNlbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogbGVmd0xheWVyQ3V0U3BhY2luZ1BhcmFsbGVsIG9yIGxlZndMYXllckN1dFNwYWNpbmdBcmVhIGlzIGNhbGxlZCBwZXIgU3BhY2kgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGlzIGEgNS43IHN5bnRheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TGF5ZXJDdXRTcGFjaW5nTGF5ZXIgKGNvbnN0IGNoYXIqICBuYW1lMiwgaW50ICBzdGFjayk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3TGF5ZXJTcGFjaW5nICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRWl0aGVyIHRoaXMgcm91dGluZSwgbGVmd0xheWVyQ3V0U3BhY2luZ0xheWVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGxlZndMYXllckN1dFNwYWNpbmdQYXJhbGxlbCBvciBsZWZ3TGF5ZXJDdXRTcGFjaW5nQXJlYSBpcyBjYWxsZWQgcGVyIFNwYWNpICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNyBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyQ3V0U3BhY2luZ0FkamFjZW50IChpbnQgIHZpYUN1dHMsIGRvdWJsZSAgZGlzdGFuY2UsIGludCAgc3RhY2spOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd0xheWVyU3BhY2luZyAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEVpdGhlciB0aGlzIHJvdXRpbmUsIGxlZndMYXllckN1dFNwYWNpbmdMYXllciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBsZWZ3TGF5ZXJDdXRTcGFjaW5nQWRqYWNlbnQgb3IgbGVmd0xheWVyQ3V0U3BhY2luZ0FyZWEgaXMgY2FsbGVkIHBlciBTcGFjaSAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgaXMgYSA1Ljcgc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllckN1dFNwYWNpbmdQYXJhbGxlbCAoKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndMYXllclNwYWNpbmcgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBFaXRoZXIgdGhpcyByb3V0aW5lLCBsZWZ3TGF5ZXJDdXRTcGFjaW5nTGF5ZXIsICogbGVmd0xheWVyQ3V0U3BhY2luZ0FkamFjZSAqLwotLyogb3IgbGVmd0xheWVyQ3V0U3BhY2luZ1BhcmFsbGVsIGlzIGNhbGxlZCBwZXIgU3BhY2luZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGlzIGEgNS43IHN5bnRheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TGF5ZXJDdXRTcGFjaW5nQXJlYSAoZG91YmxlICBjdXRBcmVhKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndMYXllclNwYWNpbmcgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBtYXJrcyB0aGUgZW5kIG9mIGEgTGF5ZXIgVHlwZSBDVVQgU3BhY2luZyAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNyBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyQ3V0U3BhY2luZ0VuZCAoKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydExheWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHNlY3Rpb24gb2Ygcm91dGluZXMgaXMgb3B0aW9uYWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNyBzeW50YXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGlmIHRoZSBsYXllciB0eXBlIGlzIENVVCB3aGVuICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogbGVmd1N0YXJ0TGF5ZXIgaXMgY2FsbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyQ3V0U3BhY2luZ1RhYmxlT3J0aG8gKGludCAgbnVtU3BhY2luZywgZG91YmxlKiAgY3V0V2l0aGlucywgZG91YmxlKiAgb3J0aG9TcGFjaW5ncyk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRMYXllci4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBzZWN0aW9uIG9mIHJvdXRpbmVzIGlzIG9wdGlvbmFsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgaXMgYSA1Ljcgc3ludGF4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBpZiB0aGUgbGF5ZXIgdHlwZSBpcyBDVVQgd2hlbiAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGxlZndTdGFydExheWVyIGlzIGNhbGxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllckFycmF5U3BhY2luZyAoaW50ICBsb25nQXJyYXksIGRvdWJsZSAgdmlhV2lkdGgsIGRvdWJsZSAgY3V0U3BhY2luZywgaW50ICBudW1BcnJheUN1dCwgaW50KiAgYXJyYXlDdXRzLCBkb3VibGUqICBhcnJheVNwYWNpbmdzKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydExheWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHNlY3Rpb24gb2Ygcm91dGluZXMgaXMgb3B0aW9uYWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNiBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGlmIHRoZSBsYXllciB0eXBlIGlzIENVVCB3aGVuICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogbGVmd1N0YXJ0TGF5ZXIgaXMgY2FsbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyRW5jbG9zdXJlIChjb25zdCBjaGFyKiAgbG9jYXRpb24sIGRvdWJsZSAgb3ZlcmhhbmcxLCBkb3VibGUgIG92ZXJoYW5nMiwgZG91YmxlICB3aWR0aCk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRMYXllci4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIHNpbWlsYXIgYXMgbGVmd0xheWVyRW5jbG9zdXJlLCBidXQgYWxsb3cgdXNlciB0byBhZGQgICAgICAgKi8KLS8qIEVYQ0VQVEVYVFJBQ1VUIG9wdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHNlY3Rpb24gb2Ygcm91dGluZXMgaXMgb3B0aW9uYWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNyBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGlmIHRoZSBsYXllciB0eXBlIGlzIENVVCB3aGVuICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogbGVmd1N0YXJ0TGF5ZXIgaXMgY2FsbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyRW5jbG9zdXJlV2lkdGggKGNvbnN0IGNoYXIqICBsb2NhdGlvbiwgZG91YmxlICBvdmVyaGFuZzEsIGRvdWJsZSAgb3ZlcmhhbmcyLCBkb3VibGUgIHdpZHRoLCBkb3VibGUgIGN1dFdpdGhpbik7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRMYXllci4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIHRvIHdyaXRlIG91dCBtaW5MZW5ndGggaW5zaWRlIEVOQ0xPU1VSRSBpbnN0ZWFkIG9mIFdJRFRIICAgKi8KLS8qIGFzIGluIHRoZSByb3V0aW5lIGxlZndMYXllckVuY2xvc3VyZSAmIGxlZndMYXllckVuY2xvc3VyZVdpZHRoLiAgICAgICAgICAgICovCi0vKiBUaGlzIHNlY3Rpb24gb2Ygcm91dGluZXMgaXMgb3B0aW9uYWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNyBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGlmIHRoZSBsYXllciB0eXBlIGlzIENVVCB3aGVuICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogbGVmd1N0YXJ0TGF5ZXIgaXMgY2FsbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyRW5jbG9zdXJlTGVuZ3RoIChjb25zdCBjaGFyKiAgbG9jYXRpb24sIGRvdWJsZSAgb3ZlcmhhbmcxLCBkb3VibGUgIG92ZXJoYW5nMiwgZG91YmxlICBtaW5MZW5ndGgpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgc2VjdGlvbiBvZiByb3V0aW5lcyBpcyBvcHRpb25hbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGlzIGEgNS42IHN5bnRheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgaWYgdGhlIGxheWVyIHR5cGUgaXMgQ1VUIHdoZW4gICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBsZWZ3U3RhcnRMYXllciBpcyBjYWxsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TGF5ZXJQcmVmZXJFbmNsb3N1cmUgKGNvbnN0IGNoYXIqICBsb2NhdGlvbiwgZG91YmxlICBvdmVyaGFuZzEsIGRvdWJsZSAgb3ZlcmhhbmcyLCBkb3VibGUgIHdpZHRoKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydExheWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgTGF5ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHNlY3Rpb24gb2Ygcm91dGluZXMgaXMgb3B0aW9uYWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNiBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGlmIHRoZSBsYXllciB0eXBlIGlzIENVVCB3aGVuICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogbGVmd1N0YXJ0TGF5ZXIgaXMgY2FsbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyUmVzaXN0YW5jZVBlckN1dCAoZG91YmxlICByZXNpc3RhbmNlKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBsZWZ3U3RhcnRMYXllciBjYWxsIChpZiBhbnkpLiAgICAgICAgKi8KLS8qIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBzZWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3RW5kTGF5ZXIgKGNvbnN0IGNoYXIqICBsYXllck5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndJbml0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRWl0aGVyIHRoaXMgcm91dGluZSBvciBsZWZ3U3RhcnRMYXllciBtdXN0IGJlIGNhbGxlZC4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE11bHRpcGxlIHNlY3Rpb24gb2YgbGVmd1N0YXJ0TGF5ZXIgY2FuIGJlIGNhbGxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgc2VjdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoZSByb3V0aW5lIHN0YXJ0cyB0aGUgbGF5ZXIgcm91dGluZyBzZWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBBbGwgb2YgdGhlIGxheWVycyBtdXN0IGZvbGxvdy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3U3RhcnRMYXllclJvdXRpbmcgKGNvbnN0IGNoYXIqICBsYXllck5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZy4gICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIHJlcXVpcmVkIGZvciBMYXllclJvdXRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBESUFHNDUgfCBESUFHMTM1ICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TGF5ZXJSb3V0aW5nIChjb25zdCBjaGFyKiAgZGlyZWN0aW9uLCBkb3VibGUgIHdpZHRoKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG9ubHkgb25jZSBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcuICAgICAgICAgKi8KLS8qIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgbGVmd0xheWVyUm91dGluZ1BpdGNoWFlEaXN0YW5jZSBjYW4gYmUgY2FsbGVkICAgICAgICovCi0vKiBidXQgbm90IGJvdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNiBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllclJvdXRpbmdQaXRjaCAoZG91YmxlICBwaXRjaCk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLiAgICAgICAgICovCi0vKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGxlZndMYXllclJvdXRpbmdQaXRjaCBjYW4gYmUgY2FsbGVkIGJ1dCBub3QgYm90aCAgICAqLwotLyogVGhpcyBpcyBhIDUuNiBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllclJvdXRpbmdQaXRjaFhZRGlzdGFuY2UgKGRvdWJsZSAgeERpc3RhbmNlLCBkb3VibGUgIHlEaXN0YW5jZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLiAgICAgICAgICovCi0vKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGxlZndMYXllclJvdXRpbmdEaWFnUGl0Y2hYWURpc3RhbmNlIGNhbiBiZSBjYWxsZWQgICAqLwotLyogYnV0IG5vdCBib3RoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgaXMgYSA1LjYgc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TGF5ZXJSb3V0aW5nRGlhZ1BpdGNoIChkb3VibGUgIGRpc3RhbmNlKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG9ubHkgb25jZSBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcuICAgICAgICAgKi8KLS8qIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgbGVmd0xheWVyUm91dGluZ0RpYWdQaXRjaCBjYW4gYmUgY2FsbGVkICAgICAgICAgICAgICovCi0vKiBidXQgbm90IGJvdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNiBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllclJvdXRpbmdEaWFnUGl0Y2hYWURpc3RhbmNlIChkb3VibGUgIGRpYWc0NURpc3RhbmNlLCBkb3VibGUgIGRpYWcxMzVEaXN0YW5jZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLiAgICAgICAgICovCi0vKiBUaGlzIGlzIGEgNS42IHN5bnRheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyUm91dGluZ0RpYWdXaWR0aCAoZG91YmxlICBkaWFnV2lkdGgpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZy4gICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNiBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllclJvdXRpbmdEaWFnU3BhY2luZyAoZG91YmxlICBkaWFnU3BhY2luZyk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLiAgICAgICAgICovCi0vKiBUaGlzIGlzIGEgNS42IHN5bnRheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyUm91dGluZ0RpYWdNaW5FZGdlTGVuZ3RoIChkb3VibGUgIGRpYWdMZW5ndGgpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZy4gICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgbGVmd0xheWVyUm91dGluZ09mZnNldFhZRGlzdGFuY2UgY2FuIGJlIGNhbGxlZCAgICAgICovCi0vKiBidXQgbm90IGJvdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyUm91dGluZ09mZnNldCAoZG91YmxlICBvZmZzZXQpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZy4gICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgbGVmd0xheWVyUm91dGluZ09mZnNldCBjYW4gYmUgY2FsbGVkIGJ1dCBub3QgYm90aCAgICovCi0vKiBUaGlzIGlzIGEgNS42IHN5bnRheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyUm91dGluZ09mZnNldFhZRGlzdGFuY2UgKGRvdWJsZSAgeERpc3RhbmNlLCBkb3VibGUgIHlEaXN0YW5jZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLiAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyUm91dGluZ0FyZWEgKGRvdWJsZSAgYXJlYSk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLiAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyUm91dGluZ01pbnNpemUgKGludCAgbnVtUmVjdCwgZG91YmxlKiAgbWluV2lkdGgsIGRvdWJsZSogIG1pbkxlbmd0aCk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLiAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyUm91dGluZ01pbmltdW1jdXQgKGRvdWJsZSAgbnVtQ3V0cywgZG91YmxlICBtaW5XaWR0aCk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLiAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgc2ltaWxhciBhcyBsZWZ3TGF5ZXJSb3V0aW5nTWluaW11bWN1dCwgYnV0IGFsbG93IHVzZXIgICAgICAqLwotLyogdG8gc3BlY2lmeSB2YWx1ZSBmb3IgV0lUSElOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgaXMgYSA1Ljcgc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyUm91dGluZ01pbmltdW1jdXRXaXRoaW4gKGRvdWJsZSAgbnVtQ3V0cywgZG91YmxlICBtaW5XaWR0aCwgZG91YmxlICBjdXREaXN0YW5jZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd0xheWVyUm91dGluZ01pbmltdW1jdXQuICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRGlyZWN0aW9uIGNhbiBiZSBlaXRoZXIgRlJPTUFCT1ZFIG9yIEZST01CRUxPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgaXMgYSA1LjUgc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TGF5ZXJSb3V0aW5nTWluaW11bWN1dENvbm5lY3Rpb25zIChjb25zdCBjaGFyKiAgZGlyZWN0aW9uKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG9ubHkgb25jZSBhZnRlciBsZWZ3TGF5ZXJSb3V0aW5nTWluaW11bWN1dC4gICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGlzIGEgNS41IHN5bnRheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyUm91dGluZ01pbmltdW1jdXRMZW5ndGhXaXRoaW4gKGRvdWJsZSAgbGVuZ3RoLCBkb3VibGUgIGRpc3RhbmNlKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWUgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLiAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZyAoZG91YmxlICBzcGFjaW5nKTsKLQotLyogRWl0aGVyIHRoaXMgcm91dGluZSwgbGVmd0xheWVyUm91dGluZ1NwYWNpbmdMZW5ndGhUaHJlc2hvbGQgb3IgICAgICAgICAgICAgKi8KLS8qIGxlZndMYXllclJvdXRpbmdTcGFjaW5nU2FtZU5ldCBjYW4gYmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGxlZndMYXllclJvdXRpbmdTcGFjaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllclJvdXRpbmdTcGFjaW5nUmFuZ2UgKGRvdWJsZSAgbWluV2lkdGgsIGRvdWJsZSAgbWF4V2lkdGgpOwotCi0vKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGxlZndMYXllclJvdXRpbmdTcGFjaW5nUmFuZ2VJbmZsdWVuY2Ugb3IgICAgICAgICAgICAqLwotLyogbGVmd0xheWVyUm91dGluZ1NwYWNpbmdSYW5nZVJhbmdlIGNhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGJlIGNhbGxlZCBvbmNlIGFmdGVyIGxsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ1JhbmdlLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgdmFsaWQgb25seSBpZiBlaXRoZXIgb3IgYm90aCBsZWZ0UmFuZ2UgYW5kIHJpZ2h0UmFuZ2UgICAgICAqLwotLyogaW4gbGVmd0xheWVyUm91dGluZ1NwYWNpbmcgYXJlIG5vbiB6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllclJvdXRpbmdTcGFjaW5nUmFuZ2VVc2VMZW5ndGhUaHJlc2hvbGQgKCk7Ci0KLS8qIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgbGVmd0xheWVyUm91dGluZ1NwYWNpbmdSYW5nZVVzZUxlbmd0aFRocmVzaG9sZCBvciAgICovCi0vKiBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ1JhbmdlUmFuZ2UgY2FuIGJlIGNhbGxlZCBvbmNlIGFmdGVyICAgICAgICAgICAgICAgICAqLwotLyogbGVmd0xheWVyUm91dGluZ1NwYWNpbmdSYW5nZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIHN1Yk1pbldpZHRoICYgc3ViTWF4V2lkdGggYXJlIG9wdGlvbmFsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ1JhbmdlSW5mbHVlbmNlIChkb3VibGUgIGluZlZhbHVlLCBkb3VibGUgIHN1Yk1pbldpZHRoLCBkb3VibGUgIHN1Yk1heFdpZHRoKTsKLQotLyogRWl0aGVyIHRoaXMgcm91dGluZSBvciBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ1JhbmdlVXNlTGVuZ3RoVGhyZXNob2xkIG9yICAgKi8KLS8qIGxlZndMYXllclJvdXRpbmdTcGFjaW5nUmFuZ2VJbmZsdWVuY2UgY2FuIGJlIGNhbGxlZCBvbmNlIGFmdGVyICAgICAgICAgICAgICovCi0vKiBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ1JhbmdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyUm91dGluZ1NwYWNpbmdSYW5nZVJhbmdlIChkb3VibGUgIG1pbldpZHRoLCBkb3VibGUgIG1heFdpZHRoKTsKLQotLyogRWl0aGVyIHRoaXMgcm91dGluZSwgbGVmd0xheWVyUm91dGluZ1NwYWNpbmdSYW5nZSBvciAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGxlZndMYXllclJvdXRpbmdTcGFjaW5nU2FtZU5ldCBjYW4gYmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBiZSBjYWxsZWQgb25jZSBhZnRlciBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogbWluV2lkdGggJiBtYXhXaWR0aCBhcmUgb3B0aW9uYWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllclJvdXRpbmdTcGFjaW5nTGVuZ3RoVGhyZXNob2xkIChkb3VibGUgIGxlbmd0aFZhbHVlLCBkb3VibGUgIG1pbldpZHRoLCBkb3VibGUgIG1heFdpZHRoKTsKLQotLyogRWl0aGVyIHRoaXMgcm91dGluZSwgbGVmd0xheWVyUm91dGluZ1NwYWNpbmdSYW5nZSBvciAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGxlZndMYXllclJvdXRpbmdTcGFjaW5nUmFuZ2UgY2FuIGJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBiZSBjYWxsZWQgb25jZSBhZnRlciBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNyByb3V0aW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllclJvdXRpbmdTcGFjaW5nU2FtZU5ldCAoaW50ICBQR09ubHkpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZy4gICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgaXMgYSA1Ljcgc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ0VuZE9mTGluZSAoZG91YmxlICBlb2xXaWR0aCwgZG91YmxlICBlb2xXaXRoaW4pOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGxlZndMYXllclJvdXRpbmdTcGFjaW5nRW5kT2ZMaSAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgaXMgYSA1Ljcgc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ0VPTFBhcmFsbGVsIChkb3VibGUgIHBhclNwYWNlLCBkb3VibGUgIHBhcldpdGhpbiwgaW50ICB0d29FZGdlcyk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLiAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNyBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllclJvdXRpbmdTcGFjaW5nTm90Y2hMZW5ndGggKGRvdWJsZSAgbWluTkxlbmd0aCk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLiAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNyBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllclJvdXRpbmdTcGFjaW5nRW5kT2ZOb3RjaFdpZHRoIChkb3VibGUgIGVvbldpZHRoLCBkb3VibGUgIG1pbk5TcGFjaW5nLCBkb3VibGUgIG1pbk5MZW5ndGgpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZy4gICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllclJvdXRpbmdXaXJlRXh0ZW5zaW9uIChkb3VibGUgIHdpcmVFeHRlbnNpb24pOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZy4gICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllclJvdXRpbmdSZXNpc3RhbmNlIChjb25zdCBjaGFyKiAgcmVzaXN0YW5jZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLiAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyUm91dGluZ0NhcGFjaXRhbmNlIChjb25zdCBjaGFyKiAgY2FwYWNpdGFuY2UpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZy4gICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllclJvdXRpbmdIZWlnaHQgKGRvdWJsZSAgaGVpZ2h0KTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG9ubHkgb25jZSBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcuICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TGF5ZXJSb3V0aW5nVGhpY2tuZXNzIChkb3VibGUgIHRoaWNrbmVzcyk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLiAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyUm91dGluZ1Nocmlua2FnZSAoZG91YmxlICBzaHJpbmthZ2UpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZy4gICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllclJvdXRpbmdDYXBNdWx0aXBsaWVyIChkb3VibGUgIGNhcE11bHRpcGxpZXIpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZy4gICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllclJvdXRpbmdFZGdlQ2FwIChkb3VibGUgIGVkZ2VDYXApOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZy4gICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllclJvdXRpbmdBbnRlbm5hQXJlYSAoZG91YmxlICBhbnRlbm5hQXJlYSk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLiAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyUm91dGluZ0FudGVubmFMZW5ndGggKGRvdWJsZSAgYW50ZW5uYUxlbmd0aCk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLiAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNSBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIHdpZHRoIGlzIHRoZSBtYXhpbXVtIHdpZHRoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TGF5ZXJSb3V0aW5nTWF4d2lkdGggKGRvdWJsZSAgd2lkdGgpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZy4gICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9uY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgaXMgYSA1LjUgc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiB3aWR0aCBpcyB0aGUgbWF4aW11bSB3aWR0aC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyUm91dGluZ01pbndpZHRoIChkb3VibGUgIHdpZHRoKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG9ubHkgb25jZSBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcuICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGlzIGEgNS41IHN5bnRheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogQXJlYSBpcyB0aGUgbWluaW11bSBhcmVhIHNpemUgbGltaXQgZm9yIG1ldGFsIHRoYXQgZW5jbG9zZXMgYW4gZW1wdHkgYXJlYS4gKi8KLS8qIFdpZHRoIGlzIG9wdGlvbmFsLCBpdCBzYXlzIHRoZSBydWxlIG9ubHkgYXBwbGllcyB3aGVuIGEgZG9udXQgaXMgY2FyZXRlZCAgICovCi0vKiBmcm9tIGEgd2lyZSBvZiB3aWR0aCA8PSB3aWR0aC4gIFRoZSBwYXJhbWV0ZXIgd2lkdGggaXMgcmVxdWlyZWQgZm9yIHRoZSAgICAqLwotLyogcm91dGluZSBsZWZ3TGF5ZXJSb3V0aW5lTWluZW5jbG9zZWRhcmVhLiAgSWYgd2lkdGggaXMgb3B0aW9uYWwsIGEgIjAiICAgICAgKi8KLS8qIHZhbHVlIGlzIGFzc2lnbmVkIGZvciB0aGF0IGluZGV4IHNsb3Qgb2YgdGhlIGFycmF5LiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TGF5ZXJSb3V0aW5nTWluZW5jbG9zZWRhcmVhIChpbnQgIG51bU1pbmVuY2xvc2VkLCBkb3VibGUqICBhcmVhLCBkb3VibGUqICB3aWR0aCk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLiAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNSBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllclJvdXRpbmdNaW5zdGVwIChkb3VibGUgIGRpc3RhbmNlKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG9ubHkgb25jZSBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcuICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgZXF1aXZhbGVudCB0byBsZWZ3TGF5ZXJSb3V0aW5nTWluc3RlcCwgZXhjZXB0IGl0IGFsc28gICAgICAqLwotLyogdGFrZXMgdGhlIG9wdGlvbnMgZm9yIHR5cGUgJiBMZW5ndGhzdW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgaXMgYSA1LjUgc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TGF5ZXJSb3V0aW5nTWluc3RlcFdpdGhPcHRpb25zIChkb3VibGUgIGRpc3RhbmNlLCBjb25zdCBjaGFyKiAgcnVsZSwgZG91YmxlICBtYXhMZW5ndGgpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZy4gICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9uY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBlcXVpdmFsZW50IHRvIGxlZndMYXllclJvdXRpbmdNaW5zdGVwLCBleGNlcHQgaXQgYWxzbyAgICAgICovCi0vKiB0YWtlcyB0aGUgb3B0aW9uIGZvciBNYXhFZGdlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNyBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllclJvdXRpbmdNaW5zdGVwTWF4RWRnZXMgKGRvdWJsZSAgZGlzdGFuY2UsIGRvdWJsZSAgbWF4RWRnZXMpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZy4gICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9uY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgaXMgYSA1LjUgc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TGF5ZXJSb3V0aW5nUHJvdHJ1c2lvbiAoZG91YmxlICB3aWR0aDEsIGRvdWJsZSAgbGVuZ3RoLCBkb3VibGUgIHdpZHRoMik7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZy4gICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNSBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIG51bUxlbmd0aCBoYXMgdGhlIHNpemUgb2YgdGhlIGFycmF5IGxlbmd0aC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBsZW5ndGggaXMgYW4gYXJyYXkgb2YgbGVuZ3RoIHZhbHVlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyUm91dGluZ1N0YXJ0U3BhY2luZ3RhYmxlUGFyYWxsZWwgKGludCAgbnVtTGVuZ3RoLCBkb3VibGUqICBsZW5ndGgpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBhZnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogbGVmd0xheWVyUm91dGluZ1N0YXJ0U3BhY2luZ3RhYmxlUGFyYWxsZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyByZXF1aXJlZCBhZnRlciBsZWZ3TGF5ZXJSb3V0aW5nU3RhcnRTcGFjaW5ndGFibGVQYXJhbGxlbC4gICovCi0vKiBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNSBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllclJvdXRpbmdTcGFjaW5ndGFibGVQYXJhbGxlbFdpZHRoIChkb3VibGUgIHdpZHRoLCBpbnQgIG51bVNwYWNpbmcsIGRvdWJsZSogIHNwYWNpbmcpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcuICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgaXMgYSA1LjUgc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TGF5ZXJSb3V0aW5nU3RhcnRTcGFjaW5ndGFibGVJbmZsdWVuY2UgKCk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IGFmdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBsZWZ3TGF5ZXJSb3V0aW5nU3RhcnRTcGFjaW5ndGFibGVJbmZsdWVuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIHJlcXVpcmVkIGFmdGVyIGxlZndMYXllclJvdXRpbmdTdGFydFNwYWNpbmd0YWJsZUluZmx1ZW5jZS4gKi8KLS8qIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGlzIGEgNS41IHN5bnRheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyUm91dGluZ1NwYWNpbmdJbmZsdWVuY2VXaWR0aCAoZG91YmxlICB3aWR0aCwgZG91YmxlICBkaXN0YW5jZSwgZG91YmxlICBzcGFjaW5nKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLiAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGlzIGEgNS43IHN5bnRheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyUm91dGluZ1N0YXJ0U3BhY2luZ3RhYmxlVHdvV2lkdGhzICgpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBhZnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogbGVmd0xheWVyUm91dGluZ1N0YXJ0U3BhY2luZ3RhYmxlSW5mbHVlbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyByZXF1aXJlZCBhZnRlciBsZWZ3TGF5ZXJSb3V0aW5nU3RhcnRTcGFjaW5ndGFibGVUd29XaWR0aHMuICovCi0vKiBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNyBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllclJvdXRpbmdTcGFjaW5ndGFibGVUd29XaWR0aHNXaWR0aCAoZG91YmxlICB3aWR0aCwgZG91YmxlICBydW5MZW5ndGgsIGludCAgbnVtU3BhY2luZywgZG91YmxlKiAgc3BhY2luZyk7Ci0KLS8qIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIGFmdGVyIGxlZndMYXllclJvdXRpbmdTdGFydFNwYWNpbmd0YWJsZVBhcmFsbGVsICovCi0vKiBvciBsZWZ3TGF5ZXJSb3V0aW5nU3RhcnRTcGFjaW5ndGFibGVJbmZsdWVuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogSXQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgaXMgYSA1LjUgc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TGF5ZXJSb3V0aW5lRW5kU3BhY2luZ3RhYmxlICgpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxlZndTdGFydExheWVyIGNhbGwgKGlmIGFueSkuICAgICAgICAqLwotLyogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UgcGVyIHNlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndFbmRMYXllclJvdXRpbmcgKGNvbnN0IGNoYXIqICBsYXllck5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nIG9yIGxlZndTdGFydExheWVyLiAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAgICAgICAgICAgICAgICAgKi8KLS8qIGlmIHRoZSB2YWx1ZSBmb3IgdGhlIHZhcmlhYmxlIHZhbHVlIGlzIG5vdCAwLCBvbmUgb2YgdGhlIGZvbGxvd2luZyAgICAgICAgICovCi0vKiByb3V0aW5lcyBoYXZlIHRvIGJlIGNhbGxlZDogbGVmd0xheWVyQUNGcmVxdWVuY3ksICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogbGVmd0xheWVyQUNXaWR0aCwgbGVmd0xheWVyQUNDdXRhcmVhLCBvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGxlZndMYXllckFDVGFibGVFbnRyaWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TGF5ZXJBQ0N1cnJlbnREZW5zaXR5IChjb25zdCBjaGFyKiAgdHlwZSwgZG91YmxlICB2YWx1ZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3TGF5ZXJBQ0N1cnJlbnREZW5zaXR5LiAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgcmVxdWlyZWQgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGVhY2ggICAgICAgICAgICAqLwotLyogbGVmd0xheWVyQUNDdXJyZW50RGVuc2l0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllckFDRnJlcXVlbmN5IChpbnQgIG51bUZyZXF1ZW5jeSwgZG91YmxlKiAgZnJlcXVlbmN5KTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndMYXllckFDQ3VycmVudERlbnNpdHkuICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgZWFjaCAgICAgICAgICAgICovCi0vKiBsZWZ3TGF5ZXJBQ0N1cnJlbnREZW5zaXR5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGNhbiBvbmx5IGJlIGNhbGxlZCBpbiBMYXllciBSb3V0aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllckFDV2lkdGggKGludCAgbnVtV2lkdGhzLCBkb3VibGUqICB3aWR0aHMpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd0xheWVyQUNDdXJyZW50RGVuc2l0eS4gICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSBhZnRlciBlYWNoICAgICAgICAgICAgKi8KLS8qIGxlZndMYXllckFDQ3VycmVudERlbnNpdHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgY2FuIG9ubHkgYmUgY2FsbGVkIGluIExheWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyQUNDdXRhcmVhIChpbnQgIG51bUN1dGFyZWFzLCBkb3VibGUqICBjdXRhcmVhcyk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3TGF5ZXJBQ0N1cnJlbnREZW5zaXR5LiAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgcmVxdWlyZWQgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGVhY2ggICAgICAgICAgICAqLwotLyogbGVmd0xheWVyQUNDdXJyZW50RGVuc2l0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllckFDVGFibGVFbnRyaWVzIChpbnQgIG51bUVudHJpZXMsIGRvdWJsZSogIGVudHJpZXMpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nIG9yIGxlZndTdGFydExheWVyLiAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAgICAgICAgICAgICAgICAgKi8KLS8qIGlmIHRoZSB2YWx1ZSBmb3IgdGhlIHZhcmlhYmxlIHZhbHVlIGlzIG5vdCAwLCBvbmUgb2YgdGhlIGZvbGxvd2luZyAgICAgICAgICovCi0vKiByb3V0aW5lcyBoYXZlIHRvIGJlIGNhbGxlZDogbGVmd0xheWVyRENXaWR0aCwgbGVmd0xheWVyRENDdXRhcmVhLCBvciAgICAgICAqLwotLyogbGVmd0xheWVyRENUYWJsZUVudHJpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllckRDQ3VycmVudERlbnNpdHkgKGNvbnN0IGNoYXIqICB0eXBlLCBkb3VibGUgIHZhbHVlKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndMYXllckRDQ3VycmVudERlbnNpdHkuICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgZWFjaCAgICAgICAgICAgICovCi0vKiBsZWZ3TGF5ZXJEQ0N1cnJlbnREZW5zaXR5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGNhbiBvbmx5IGJlIGNhbGxlZCBpbiBMYXllciBSb3V0aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllckRDV2lkdGggKGludCAgbnVtV2lkdGhzLCBkb3VibGUqICB3aWR0aHMpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd0xheWVyRENDdXJyZW50RGVuc2l0eS4gICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSBhZnRlciBlYWNoICAgICAgICAgICAgKi8KLS8qIGxlZndMYXllckRDQ3VycmVudERlbnNpdHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgY2FuIG9ubHkgYmUgY2FsbGVkIGluIExheWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyRENDdXRhcmVhIChpbnQgIG51bUN1dGFyZWFzLCBkb3VibGUqICBjdXRhcmVhcyk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3TGF5ZXJEQ0N1cnJlbnREZW5zaXR5LiAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgcmVxdWlyZWQgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGVhY2ggICAgICAgICAgICAqLwotLyogbGVmd0xheWVyRENDdXJyZW50RGVuc2l0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllckRDVGFibGVFbnRyaWVzIChpbnQgIG51bUVudHJpZXMsIGRvdWJsZSogIGVudHJpZXMpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nIG9yIGxlZndTdGFydExheWVyLiAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLiAgVGhlIG94aWRlIHZhbHVlLCBjYW4gYmUgZWl0aGVyIE9YSURFMSwgT1hJREUyLCAgKi8KLS8qIE9YSURFMywgb3IgT1hJREU0LiAgRWFjaCBjYW4gb25seSBiZSBjYWxsZWQgb25jZSB3aXRoaW4gYSBsYXllci4gICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgdmFsaWQgb25seSBpZiB0aGUgbGF5ZXIgdHlwZSBpcyBlaXRoZXIgUk9VVElORyBvciBDVVQuICAgICAqLwotLyogVGhpcyBpcyBhIDUuNSBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllckFudGVubmFNb2RlbCAoY29uc3QgY2hhciogIG94aWRlKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZyBvciBsZWZ3U3RhcnRMYXllci4gKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2Ugd2l0aGluIGEgbGF5ZXIgICAgICAgICovCi0vKiBhZnRlciBlYWNoIGxlZndMYXllckFudGVubmFNb2RlbCBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIHZhbGlkIG9ubHkgaWYgdGhlIGxheWVyIHR5cGUgaXMgZWl0aGVyIFJPVVRJTkcgb3IgQ1VULiAgICAgKi8KLS8qIFRoaXMgaXMgYSA1LjQgc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGxlZndMYXllclJvdXRpbmdBbnRlbm5hTGVuZ3RoIGlzIGFsbG93ZWQsIG5vdCBib3RoLiAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyQW50ZW5uYUFyZWFSYXRpbyAoZG91YmxlICB2YWx1ZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcgb3IgbGVmd1N0YXJ0TGF5ZXIuICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHdpdGhpbiBhIGxheWVyICAgICAgICAqLwotLyogYWZ0ZXIgZWFjaCBsZWZ3TGF5ZXJBbnRlbm5hTW9kZWwgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyB2YWxpZCBvbmx5IGlmIHRoZSBsYXllciB0eXBlIGlzIGVpdGhlciBST1VUSU5HIG9yIENVVC4gICAgICovCi0vKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGxlZndMYXllckFudGVubmFEaWZmQXJlYVJhdGlvUHdsIGNhbiBiZSBjYWxsZWQsIGJ1dCAqLwotLyogbm90IGJvdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgaXMgYSA1LjQgc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGxlZndMYXllclJvdXRpbmdBbnRlbm5hTGVuZ3RoIGlzIGFsbG93ZWQsIG5vdCBib3RoLiAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyQW50ZW5uYURpZmZBcmVhUmF0aW8gKGRvdWJsZSAgdmFsdWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nIG9yIGxlZndTdGFydExheWVyLiAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSB3aXRoaW4gYSBsYXllciAgICAgICAgKi8KLS8qIGFmdGVyIGVhY2ggbGVmd0xheWVyQW50ZW5uYU1vZGVsIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgdmFsaWQgb25seSBpZiB0aGUgbGF5ZXIgdHlwZSBpcyBlaXRoZXIgUk9VVElORyBvciBDVVQuICAgICAqLwotLyogRWl0aGVyIHRoaXMgcm91dGluZSBvciBsZWZ3TGF5ZXJBbnRlbm5hRGlmZkFyZWFSYXRpbyBjYW4gYmUgY2FsbGVkLCBidXQgICAgKi8KLS8qIG5vdCBib3RoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGlzIGEgNS40IHN5bnRheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRWl0aGVyIHRoaXMgcm91dGluZSBvciBsZWZ3TGF5ZXJSb3V0aW5nQW50ZW5uYUxlbmd0aCBpcyBhbGxvd2VkLCBub3QgYm90aC4gKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllckFudGVubmFEaWZmQXJlYVJhdGlvUHdsIChpbnQgIG51bVB3bHMsIGRvdWJsZSogIGRpZmZ1c2lvbnMsIGRvdWJsZSogIHJhdGlvcyk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcgb3IgbGVmd1N0YXJ0TGF5ZXIuICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHdpdGhpbiBhIGxheWVyICAgICAgICAqLwotLyogYWZ0ZXIgZWFjaCBsZWZ3TGF5ZXJBbnRlbm5hTW9kZWwgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyB2YWxpZCBvbmx5IGlmIHRoZSBsYXllciB0eXBlIGlzIGVpdGhlciBST1VUSU5HIG9yIENVVC4gICAgICovCi0vKiBUaGlzIGlzIGEgNS40IHN5bnRheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRWl0aGVyIHRoaXMgcm91dGluZSBvciBsZWZ3TGF5ZXJSb3V0aW5nQW50ZW5uYUxlbmd0aCBpcyBhbGxvd2VkLCBub3QgYm90aC4gKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllckFudGVubmFDdW1BcmVhUmF0aW8gKGRvdWJsZSAgdmFsdWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nIG9yIGxlZndTdGFydExheWVyLiAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSB3aXRoaW4gYSBsYXllciAgICAgICAgKi8KLS8qIGFmdGVyIGVhY2ggbGVmd0xheWVyQW50ZW5uYU1vZGVsIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgdmFsaWQgb25seSBpZiB0aGUgbGF5ZXIgdHlwZSBpcyBlaXRoZXIgUk9VVElORyBvciBDVVQuICAgICAqLwotLyogRWl0aGVyIHRoaXMgcm91dGluZSBvciBsZWZ3TGF5ZXJBbnRlbm5hQ3VtRGlmZkFyZWFSYXRpb1B3bCBjYW4gYmUgY2FsbGVkLCAgKi8KLS8qIGJ1dCBub3QgYm90aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGlzIGEgNS40IHN5bnRheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRWl0aGVyIHRoaXMgcm91dGluZSBvciBsZWZ3TGF5ZXJSb3V0aW5nQW50ZW5uYUxlbmd0aCBpcyBhbGxvd2VkLCBub3QgYm90aC4gKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllckFudGVubmFDdW1EaWZmQXJlYVJhdGlvIChkb3VibGUgIHZhbHVlKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZyBvciBsZWZ3U3RhcnRMYXllci4gKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2Ugd2l0aGluIGEgbGF5ZXIgICAgICAgICovCi0vKiBhZnRlciBlYWNoIGxlZndMYXllckFudGVubmFNb2RlbCBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIHZhbGlkIG9ubHkgaWYgdGhlIGxheWVyIHR5cGUgaXMgZWl0aGVyIFJPVVRJTkcgb3IgQ1VULiAgICAgKi8KLS8qIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgbGVmd0xheWVyQW50ZW5uYUN1bURpZmZBcmVhUmF0aW8gY2FuIGJlIGNhbGxlZCwgYnV0ICovCi0vKiBub3QgYm90aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNCBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgbGVmd0xheWVyUm91dGluZ0FudGVubmFMZW5ndGggaXMgYWxsb3dlZCwgbm90IGJvdGguICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TGF5ZXJBbnRlbm5hQ3VtRGlmZkFyZWFSYXRpb1B3bCAoaW50ICBudW1Qd2xzLCBkb3VibGUqICBkaWZmdXNpb25zLCBkb3VibGUqICByYXRpb3MpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nIG9yIGxlZndTdGFydExheWVyLiAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSB3aXRoaW4gYSBsYXllciAgICAgICAgKi8KLS8qIGFmdGVyIGVhY2ggbGVmd0xheWVyQW50ZW5uYU1vZGVsIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgdmFsaWQgb25seSBpZiB0aGUgbGF5ZXIgdHlwZSBpcyBlaXRoZXIgUk9VVElORyBvciBDVVQuICAgICAqLwotLyogVGhlIG9wdGlvbiBESUZGVVNFT05MWSBpcyBhIDUuNCBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIElmIERJRkZVU0VPTkxZLCBsZWZ3TGF5ZXJSb3V0aW5nQW50ZW5uYUxlbmd0aCBpcyBub3QgYWxsb3dlZC4gICAgICAgICAgICAgICovCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gbGVmd0xheWVyUm91dGluZ0FudGVubmFBcmVhICAgICAgICAgICAgICAgICAgICAqLwotLyogZGlmZlVzZU9ubHkgaGFzIHRvIGJlIERJRkZVU0VPTkxZLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllckFudGVubmFBcmVhRmFjdG9yIChkb3VibGUgIHZhbHVlLCBjb25zdCBjaGFyKiAgZGlmZlVzZU9ubHkpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nIG9yIGxlZndTdGFydExheWVyLiAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSB3aXRoaW4gYSBsYXllciAgICAgICAgKi8KLS8qIGFmdGVyIGVhY2ggbGVmd0xheWVyQW50ZW5uYU1vZGVsIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgdmFsaWQgb25seSBpZiB0aGUgbGF5ZXIgdHlwZSBpcyBlaXRoZXIgUk9VVElORy4gICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNCBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgbGVmd0xheWVyUm91dGluZ0FudGVubmFMZW5ndGggaXMgYWxsb3dlZCwgbm90IGJvdGguICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TGF5ZXJBbnRlbm5hU2lkZUFyZWFSYXRpbyAoZG91YmxlICB2YWx1ZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcgb3IgbGVmd1N0YXJ0TGF5ZXIuICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHdpdGhpbiBhIGxheWVyICAgICAgICAqLwotLyogYWZ0ZXIgZWFjaCBsZWZ3TGF5ZXJBbnRlbm5hTW9kZWwgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyB2YWxpZCBvbmx5IGlmIHRoZSBsYXllciB0eXBlIGlzIGVpdGhlciBST1VUSU5HLiAgICAgICAgICAgICovCi0vKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGxlZndMYXllckFudGVubmFEaWZmU2lkZUFyZWFSYXRpb1B3bCBjYW4gYmUgICAgICAgICAqLwotLyogY2FsbGVkLCBidXQgbm90IGJvdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgaXMgYSA1LjQgc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGxlZndMYXllclJvdXRpbmdBbnRlbm5hTGVuZ3RoIGlzIGFsbG93ZWQsIG5vdCBib3RoLiAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyQW50ZW5uYURpZmZTaWRlQXJlYVJhdGlvIChkb3VibGUgIHZhbHVlKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZyBvciBsZWZ3U3RhcnRMYXllci4gKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2Ugd2l0aGluIGEgbGF5ZXIgICAgICAgICovCi0vKiBhZnRlciBlYWNoIGxlZndMYXllckFudGVubmFNb2RlbCBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIHZhbGlkIG9ubHkgaWYgdGhlIGxheWVyIHR5cGUgaXMgZWl0aGVyIFJPVVRJTkcgb3IgQ1VULiAgICAgKi8KLS8qIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgbGVmd0xheWVyQW50ZW5uYURpZmZTaWRlQXJlYVJhdGlvIGNhbiBiZSBjYWxsZWQsICAgICovCi0vKiBidXQgbm90IGJvdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNCBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgbGVmd0xheWVyUm91dGluZ0FudGVubmFMZW5ndGggaXMgYWxsb3dlZCwgbm90IGJvdGguICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TGF5ZXJBbnRlbm5hRGlmZlNpZGVBcmVhUmF0aW9Qd2wgKGludCAgbnVtUHdscywgZG91YmxlKiAgZGlmZnVzaW9ucywgZG91YmxlKiAgcmF0aW9zKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZyBvciBsZWZ3U3RhcnRMYXllci4gKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2Ugd2l0aGluIGEgbGF5ZXIgICAgICAgICovCi0vKiBhZnRlciBlYWNoIGxlZndMYXllckFudGVubmFNb2RlbCBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIHZhbGlkIG9ubHkgaWYgdGhlIGxheWVyIHR5cGUgaXMgZWl0aGVyIFJPVVRJTkcuICAgICAgICAgICAgKi8KLS8qIFRoaXMgaXMgYSA1LjQgc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGxlZndMYXllclJvdXRpbmdBbnRlbm5hTGVuZ3RoIGlzIGFsbG93ZWQsIG5vdCBib3RoLiAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyQW50ZW5uYUN1bVNpZGVBcmVhUmF0aW8gKGRvdWJsZSAgdmFsdWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nIG9yIGxlZndTdGFydExheWVyLiAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSB3aXRoaW4gYSBsYXllciAgICAgICAgKi8KLS8qIGFmdGVyIGVhY2ggbGVmd0xheWVyQW50ZW5uYU1vZGVsIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgdmFsaWQgb25seSBpZiB0aGUgbGF5ZXIgdHlwZSBpcyBlaXRoZXIgUk9VVElORy4gICAgICAgICAgICAqLwotLyogRWl0aGVyIHRoaXMgcm91dGluZSBvciBsZWZ3TGF5ZXJBbnRlbm5hQ3VtRGlmZlNpZGVBcmVhUmF0aW9Qd2wgY2FuIGJlICAgICAgKi8KLS8qIGNhbGxlZCwgYnV0IG5vdCBib3RoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGlzIGEgNS40IHN5bnRheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRWl0aGVyIHRoaXMgcm91dGluZSBvciBsZWZ3TGF5ZXJSb3V0aW5nQW50ZW5uYUxlbmd0aCBpcyBhbGxvd2VkLCBub3QgYm90aC4gKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllckFudGVubmFDdW1EaWZmU2lkZUFyZWFSYXRpbyAoZG91YmxlICB2YWx1ZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcgb3IgbGVmd1N0YXJ0TGF5ZXIuICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHdpdGhpbiBhIGxheWVyICAgICAgICAqLwotLyogYWZ0ZXIgZWFjaCBsZWZ3TGF5ZXJBbnRlbm5hTW9kZWwgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyB2YWxpZCBvbmx5IGlmIHRoZSBsYXllciB0eXBlIGlzIGVpdGhlciBST1VUSU5HIG9yIENVVC4gICAgICovCi0vKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGxlZndMYXllckFudGVubmFDdW1EaWZmU2lkZUFyZWFSYXRpbyBjYW4gYmUgY2FsbGVkLCAqLwotLyogYnV0IG5vdCBib3RoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgaXMgYSA1LjQgc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGxlZndMYXllclJvdXRpbmdBbnRlbm5hTGVuZ3RoIGlzIGFsbG93ZWQsIG5vdCBib3RoLiAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyQW50ZW5uYUN1bURpZmZTaWRlQXJlYVJhdGlvUHdsIChpbnQgIG51bVB3bHMsIGRvdWJsZSogIGRpZmZ1c2lvbnMsIGRvdWJsZSogIHJhdGlvcyk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcgb3IgbGVmd1N0YXJ0TGF5ZXIuICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHdpdGhpbiBhIGxheWVyICAgICAgICAqLwotLyogYWZ0ZXIgZWFjaCBsZWZ3TGF5ZXJBbnRlbm5hTW9kZWwgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyB2YWxpZCBvbmx5IGlmIHRoZSBsYXllciB0eXBlIGlzIGVpdGhlciBST1VUSU5HLiAgICAgICAgICAgICovCi0vKiBUaGUgb3B0aW9uIERJRkZVU0VPTkxZIGlzIGEgNS40IHN5bnRheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZGlmZlVzZU9ubHkgaGFzIHRvIGJlIERJRkZVU0VPTkxZLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndMYXllckFudGVubmFTaWRlQXJlYUZhY3RvciAoZG91YmxlICB2YWx1ZSwgY29uc3QgY2hhciogIGRpZmZVc2VPbmx5KTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZyBvciBsZWZ3U3RhcnRMYXllci4gKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2Ugd2l0aGluIGEgbGF5ZXIgICAgICAgICovCi0vKiBhZnRlciBlYWNoIGxlZndMYXllckFudGVubmFNb2RlbCBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIHZhbGlkIG9ubHkgaWYgdGhlIGxheWVyIHR5cGUgaXMgZWl0aGVyIFJPVVRJTkcgb3IgQ1VULiAgICAgKi8KLS8qIFRoaXMgaXMgYSA1Ljcgcm91dGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TGF5ZXJBbnRlbm5hQ3VtUm91dGluZ1BsdXNDdXQgKCk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcgb3IgbGVmd1N0YXJ0TGF5ZXIuICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHdpdGhpbiBhIGxheWVyICAgICAgICAqLwotLyogYWZ0ZXIgZWFjaCBsZWZ3TGF5ZXJBbnRlbm5hTW9kZWwgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyB2YWxpZCBvbmx5IGlmIHRoZSBsYXllciB0eXBlIGlzIGVpdGhlciBST1VUSU5HIG9yIENVVC4gICAgICovCi0vKiBUaGlzIGlzIGEgNS43IHJvdXRpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyQW50ZW5uYUdhdGVQbHVzRGlmZiAoZG91YmxlICBwbHVzRGlmZkZhY3Rvcik7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcgb3IgbGVmd1N0YXJ0TGF5ZXIuICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHdpdGhpbiBhIGxheWVyICAgICAgICAqLwotLyogYWZ0ZXIgZWFjaCBsZWZ3TGF5ZXJBbnRlbm5hTW9kZWwgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyB2YWxpZCBvbmx5IGlmIHRoZSBsYXllciB0eXBlIGlzIGVpdGhlciBST1VUSU5HIG9yIENVVC4gICAgICovCi0vKiBUaGlzIGlzIGEgNS43IHJvdXRpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0xheWVyQW50ZW5uYUFyZWFNaW51c0RpZmYgKGRvdWJsZSAgbWludXNEaWZmRmFjdG9yKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZyBvciBsZWZ3U3RhcnRMYXllci4gKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2Ugd2l0aGluIGEgbGF5ZXIgICAgICAgICovCi0vKiBhZnRlciBlYWNoIGxlZndMYXllckFudGVubmFNb2RlbCBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIHZhbGlkIG9ubHkgaWYgdGhlIGxheWVyIHR5cGUgaXMgZWl0aGVyIFJPVVRJTkcgb3IgQ1VULiAgICAgKi8KLS8qIFRoaXMgaXMgYSA1Ljcgcm91dGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TGF5ZXJBbnRlbm5hQXJlYURpZmZSZWR1Y2VQd2wgKGludCAgbnVtUHdscywgZG91YmxlKiAgZGlmZkFyZWFzLCBkb3VibGUqICBtZXRhbERpZmZGYWN0b3JzKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG9ubHkgb25jZSBhZnRlciBsZWZ3U3RhcnRMYXllci4gICAgICAgICAgICAgICAgKi8KLS8qIFRoZSBvcHRpb24gTUlOSU1VTURFTlNJVFkgaXMgYSA1LjQgc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TWluaW11bURlbnNpdHkgKGRvdWJsZSAgbWluRGVuc2l0eSk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXIuICAgICAgICAgICAgICAgICovCi0vKiBUaGUgb3B0aW9uIE1BWElNVU1ERU5TSVRZIGlzIGEgNS40IHN5bnRheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd01heGltdW1EZW5zaXR5IChkb3VibGUgIG1heERlbnNpdHkpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGxlZndTdGFydExheWVyLiAgICAgICAgICAgICAgICAqLwotLyogVGhlIG9wdGlvbiBERU5TSVRZQ0hFQ0tXSU5ET1cgaXMgYSA1LjQgc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndEZW5zaXR5Q2hlY2tXaW5kb3cgKGRvdWJsZSAgY2hlY2tXaW5kb3dMZW5ndGgsIGRvdWJsZSAgY2hlY2tXaW5kb3dXaWR0aCk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXIuICAgICAgICAgICAgICAgICovCi0vKiBUaGUgb3B0aW9uIERFTlNJVFlDSEVDS1NURVAgaXMgYSA1LjQgc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0RlbnNpdHlDaGVja1N0ZXAgKGRvdWJsZSAgY2hlY2tTdGVwVmFsdWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGxlZndTdGFydExheWVyLiAgICAgICAgICAgICAgICAqLwotLyogVGhlIG9wdGlvbiBGSUxMQUNUSVZFU1BBQ0lORyBpcyBhIDUuNCBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndGaWxsQWN0aXZlU3BhY2luZyAoZG91YmxlICBmaWxsVG9BY3RpdmVTcGFjaW5nKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG9ubHkgb25jZSBhZnRlciBhbGwgdGhlIGxheWVycy4gICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGlzIGEgNS41IHN5bnRheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd01heHZpYXN0YWNrIChpbnQgIHZhbHVlLCBjb25zdCBjaGFyKiAgYm90dG9tTGF5ZXIsIGNvbnN0IGNoYXIqICB0b3BMYXllcik7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd0luaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHNlY3Rpb24gb2Ygcm91dGluZXMgaXMgb3B0aW9uYWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGUgcm91dGluZSBzdGFydHMgcHJvcGVydHlkZWZpbml0aW9ucyBzZWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3U3RhcnRQcm9wRGVmICgpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0UHJvcERlZi4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEl0IGFkZHMgaW50ZWdlciBwcm9wZXJ0eSBkZWZpbml0aW9uIHRvIHRoZSBzdGF0ZW1lbnQuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlIG9ialR5cGUgY2FuIGJlIExJQlJBUlkgb3IgVklBIG9yIE1BQ1JPIG9yIFBJTi4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTk9OREVGQVVMVFJVTEUgfCBNQUNSTyB8IFBJTiAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndJbnRQcm9wRGVmIChjb25zdCBjaGFyKiAgb2JqVHlwZSwgY29uc3QgY2hhciogIHByb3BOYW1lLCBkb3VibGUgIGxlZnRSYW5nZSwgZG91YmxlICByaWdodFJhbmdlLCBpbnQgICAgIHByb3BWYWx1ZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRQcm9wRGVmLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogSXQgYWRkcyByZWFsIHByb3BlcnR5IGRlZmluaXRpb24gdG8gdGhlIHN0YXRlbWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGUgb2JqVHlwZSBjYW4gYmUgTElCUkFSWSBvciBWSUEgb3IgTUFDUk8gb3IgUElOLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOT05ERUZBVUxUUlVMRSB8IE1BQ1JPIHwgUElOICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd1JlYWxQcm9wRGVmIChjb25zdCBjaGFyKiAgb2JqVHlwZSwgY29uc3QgY2hhciogIHByb3BOYW1lLCBkb3VibGUgIGxlZnRSYW5nZSwgZG91YmxlICByaWdodFJhbmdlLCBkb3VibGUgIHByb3BWYWx1ZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRQcm9wRGVmLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogSXQgYWRkcyBzdHJpbmcgcHJvcGVydHkgZGVmaW5pdGlvbiB0byB0aGUgc3RhdGVtZW50LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGUgb2JqVHlwZSBjYW4gYmUgTElCUkFSWSBvciBWSUEgb3IgTUFDUk8gb3IgUElOLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIE5PTkRFRkFVTFRSVUxFIHwgTUFDUk8gfCBQSU4gICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd1N0cmluZ1Byb3BEZWYgKGNvbnN0IGNoYXIqICBvYmpUeXBlLCBjb25zdCBjaGFyKiAgcHJvcE5hbWUsIGRvdWJsZSAgbGVmdFJhbmdlLCBkb3VibGUgIHJpZ2h0UmFuZ2UsIGNvbnN0IGNoYXIqICBwcm9wVmFsdWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxlZndTdGFydFByb3BEZWYgY2FsbCAoaWYgYW55KS4gICAgICAqLwotLyogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndFbmRQcm9wRGVmICgpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndJbml0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG9ubHkgb25jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGUgcm91dGluZSBzdGFydHMgdGhlIHZpYSBzZWN0aW9uLiBBbGwgb2YgdGhlIHZpYXMgbXVzdCBmb2xsb3cuICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3U3RhcnRWaWEgKGNvbnN0IGNoYXIqICB2aWFOYW1lLCBjb25zdCBjaGFyKiAgaXNEZWZhdWx0KTsKLQotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLCBpdCBjYWxsIG9ubHkgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydFZpYS4gICAgICAgKi8KLS8qIEl0IGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3VmlhVG9wb2ZzdGFja29ubHkgKCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCwgaXQgY2FsbCBvbmx5IGJlIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRWaWEuICAgICAgICovCi0vKiBJdCBjYW4gb25seSBiZSBjYWxsZWQgb25jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd1ZpYUZvcmVpZ24gKGNvbnN0IGNoYXIqICBmb3JlaWduTmFtZSwgZG91YmxlICB4bCwgZG91YmxlICB5bCwgaW50ICBvcmllbnQpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwsIGl0IGNhbGwgb25seSBiZSBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0VmlhLiAgICAgICAqLwotLyogSXQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgdGhlIHNhbWUgYXMgbGVmd1ZpYUZvcmVpZ24sIGV4Y2VwdCBvcmllbnQgaXMgYSBjaGFyKiAgICAgICAqLwotRVhURVJOIGludCBsZWZ3VmlhRm9yZWlnblN0ciAoY29uc3QgY2hhciogIGZvcmVpZ25OYW1lLCBkb3VibGUgIHhsLCBkb3VibGUgIHlsLCBjb25zdCBjaGFyKiAgb3JpZW50KTsKLQotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLCBpdCBjYWxsIG9ubHkgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydFZpYS4gICAgICAgKi8KLS8qIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgbGVmd1ZpYVZpYXJ1bGUgY2FuIGJlIGNhbGxlZCB3aXRoaW4gYSB2aWEuICAgICAgICAgICovCi0vKiBJdCBjYW4gb25seSBiZSBjYWxsZWQgb25jZSBpbiBhIHZpYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd1ZpYVJlc2lzdGFuY2UgKGRvdWJsZSAgcmVzaXN0YW5jZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRWaWEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBJdCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd1ZpYUxheWVyIChjb25zdCBjaGFyKiAgbGF5ZXJOYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGNhbiBjYWxsIG9ubHkgYWZ0ZXIgbGVmd1ZpYUxheWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgbGVmd1ZpYUxheWVyUG9seWdvbiBjYW4gYmUgY2FsbGVkIHdpdGhpbiBhIGxheWVyICAgICovCi0vKiBJdCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIG1hc2sgaXMgNS44IHN5bnRheCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndWaWFMYXllclJlY3QgKGRvdWJsZSAgeDFsLCBkb3VibGUgIHkxbCwgZG91YmxlICB4MmwsIGRvdWJsZSAgeTJsLCBpbnQgIG1hc2spOwotCi0vKiBUaGlzIHJvdXRpbmUgY2FuIGNhbGwgb25seSBhZnRlciBsZWZ3VmlhTGF5ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRWl0aGVyIHRoaXMgcm91dGluZSBvciBsZWZ3VmlhTGF5ZXJSZWN0IGNhbiBiZSBjYWxsZWQgd2l0aGluIGEgbGF5ZXIgICAgICAgKi8KLS8qIEl0IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGlzIGEgNS42IHN5bnRheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIG1hc2sgaXMgNS44IHN5bnRheCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndWaWFMYXllclBvbHlnb24gKGludCAgbnVtX3BvbHlzLCBkb3VibGUqICB4bCwgZG91YmxlKiAgeWwsIGludCAgbWFzayk7Ci0KLS8qIFRoaXMgcm91dGluZSBjYW4gY2FsbCBvbmx5IGFmdGVyIGxlZndTdGFydFZpYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGxlZndWaWFSZXNpc3RhbmNlIGNhbiBiZSBjYWxsZWQgd2l0aGluIGEgdmlhLiAgICAgICAqLwotLyogSXQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UgaW4gYSB2aWEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgaXMgYSA1LjYgc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3VmlhVmlhcnVsZSAoY29uc3QgY2hhciogIHZpYVJ1bGVOYW1lLCBkb3VibGUgIHhDdXRTaXplLCBkb3VibGUgIHlDdXRTaXplLCBjb25zdCBjaGFyKiAgYm90TWV0YWxMYXllciwgY29uc3QgY2hhciogIGN1dExheWVyLCBjb25zdCBjaGFyKiAgdG9wTWV0YWxMYXllciwgZG91YmxlICB4Q3V0U3BhY2luZywgZG91YmxlICB5Q3V0U3BhY2luZywgZG91YmxlICB4Qm90RW5jLCBkb3VibGUgIHlCb3RFbmMsIGRvdWJsZSAgeFRvcEVuYywgZG91YmxlICB5VG9wRW5jKTsKLQotLyogVGhpcyByb3V0aW5lIGNhbiBjYWxsIG9ubHkgYWZ0ZXIgbGVmd1ZpYVZpYXJ1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEl0IGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGlzIGEgNS42IHN5bnRheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd1ZpYVZpYXJ1bGVSb3dDb2wgKGludCAgbnVtQ3V0Um93cywgaW50ICBudW1DdXRDb2xzKTsKLQotLyogVGhpcyByb3V0aW5lIGNhbiBjYWxsIG9ubHkgYWZ0ZXIgbGVmd1ZpYVZpYXJ1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEl0IGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGlzIGEgNS42IHN5bnRheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd1ZpYVZpYXJ1bGVPcmlnaW4gKGRvdWJsZSAgeE9mZnNldCwgZG91YmxlICB5T2Zmc2V0KTsKLQotLyogVGhpcyByb3V0aW5lIGNhbiBjYWxsIG9ubHkgYWZ0ZXIgbGVmd1ZpYVZpYXJ1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEl0IGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGlzIGEgNS42IHN5bnRheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd1ZpYVZpYXJ1bGVPZmZzZXQgKGRvdWJsZSAgeEJvdE9mZnNldCwgZG91YmxlICB5Qm90T2Zmc2V0LCBkb3VibGUgIHhUb3BPZmZzZXQsIGRvdWJsZSAgeVRvcE9mZnNldCk7Ci0KLS8qIFRoaXMgcm91dGluZSBjYW4gY2FsbCBvbmx5IGFmdGVyIGxlZndWaWFWaWFydWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBJdCBjYW4gb25seSBiZSBjYWxsZWQgb25jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNiBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndWaWFWaWFydWxlUGF0dGVybiAoY29uc3QgY2hhciogIGN1dFBhdHRlcm4pOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndWaWEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLCBpdCBhZGRzIHN0cmluZyBwcm9wZXJ0eSB0byB0aGUgc3RhdGVtZW50LiAgICAgICAgKi8KLS8qIEl0IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3U3RyaW5nUHJvcGVydHkgKGNvbnN0IGNoYXIqICBwcm9wTmFtZSwgY29uc3QgY2hhciogIHByb3BWYWx1ZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1ZpYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwsIGl0IGFkZHMgcmVhbCBwcm9wZXJ0eSB0byB0aGUgc3RhdGVtZW50LiAgICAgICAgICAqLwotLyogSXQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndSZWFsUHJvcGVydHkgKGNvbnN0IGNoYXIqICBwcm9wTmFtZSwgZG91YmxlICBwcm9wVmFsdWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndWaWEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLCBpdCBhZGRzIGludCBwcm9wZXJ0eSB0byB0aGUgc3RhdGVtZW50LiAgICAgICAgICAgKi8KLS8qIEl0IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3SW50UHJvcGVydHkgKGNvbnN0IGNoYXIqICBwcm9wTmFtZSwgaW50ICBwcm9wVmFsdWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxlZndTdGFydFZpYSBjYWxsIChpZiBhbnkpLiAgICAgICAgICAqLwotLyogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndFbmRWaWEgKGNvbnN0IGNoYXIqICB2aWFOYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3SW5pdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhcyBhIHNldCB3aXRoIGxlZndWaWFSdWxlTGF5ZXIsIGxlZndWaWFSdWxlVmlhICovCi0vKiBhbmQgbGVmd0VuZFZpYVJ1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogbXVsdGlwbGUgdGltZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGUgcm91dGluZSBzdGFydHMgdGhlIHZpYSBydWxlIHNlY3Rpb24uIFRoZSB2aWEgcnVsZSBkYXRhIGFuZCBpdHMgcHJvcGVydCAqLwotLyogbXVzdCBmb2xsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd1N0YXJ0VmlhUnVsZSAoY29uc3QgY2hhciogIHZpYVJ1bGVOYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRWaWFSdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBoYXMgdG8gYmUgY2FsbGVkIDIgdGltZXMgZXhhY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlIGRpcmVjdGlvbjEgb3IgZGlyZWN0aW9uMiBjYW4gYmUgSE9SSVpPTlRBTCBvciBWRVJUSUNBTC4gICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd1ZpYVJ1bGVMYXllciAoY29uc3QgY2hhciogIGxheWVyTmFtZSwgY29uc3QgY2hhciogIGRpcmVjdGlvbiwgZG91YmxlICBtaW5XaWR0aCwgZG91YmxlICBtYXhXaWR0aCwgZG91YmxlICBvdmVyaGFuZywgZG91YmxlICBtZXRhbE92ZXJoYW5nKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3VmlhUnVsZUxheWVyIGlzIGNhbGxlZCB0d2ljZS4gICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyByZXF1aXJlZCBpbiBhIHZpYXJ1bGUgYW5kIGNhbiBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UuICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlIGRpcmVjdGlvbjEgb3IgZGlyZWN0aW9uMiBjYW4gYmUgSE9SSVpPTlRBTCBvciBWRVJUSUNBTC4gICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd1ZpYVJ1bGVWaWEgKGNvbnN0IGNoYXIqICB2aWFOYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBsZWZ3U3RhcnRWaWFSdWxlIGNhbGwgKGlmIGFueSkuICAgICAgKi8KLS8qIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBsZWZ3U3RhcnRWaWFSdWxlLiAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3RW5kVmlhUnVsZSAoY29uc3QgY2hhciogIHZpYVJ1bGVOYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3SW5pdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhcyBhIHNldCB3aXRoIGxlZndWaWFSdWxlR2VuTGF5ZXIsICAgICAgICAgICAgICovCi0vKiBsZWZ3VmlhUnVsZUdlbkxheWVyMywgYW5kIGxlZndFbmRWaWFSdWxlR2VuIG11bHRpcGxlIHRpbWVzLiAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoZSByb3V0aW5lIHN0YXJ0cyB0aGUgdmlhIHJ1bGUgc2VjdGlvbi4gVGhlIHZpYSBydWxlIGRhdGEgYW5kIGl0cyBwcm9wZXJ0ICovCi0vKiBtdXN0IGZvbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3U3RhcnRWaWFSdWxlR2VuIChjb25zdCBjaGFyKiAgdmlhUnVsZU5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTYXJ0VmlhUnVsZUdlbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndWaWFSdWxlR2VuRGVmYXVsdCAoKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRWaWFSdWxlR2VuLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBoYXMgdG8gYmUgY2FsbGVkIDIgdGltZXMgZXhhY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRWl0aGVyIHRoaXMgcm91dGluZSBvciBsZWZ3VmlhUnVsZUdlbkxheWVyRW5jbG9zdXJlLCBub3QgYm90aC4gICAgICAgICAgICAgKi8KLS8qIFRoZSBkaXJlY3Rpb24xIG9yIGRpcmVjdGlvbjIgY2FuIGJlIEhPUklaT05UQUwgb3IgVkVSVElDQUwuICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndWaWFSdWxlR2VuTGF5ZXIgKGNvbnN0IGNoYXIqICBsYXllck5hbWUsIGNvbnN0IGNoYXIqICBkaXJlY3Rpb24sIGRvdWJsZSAgbWluV2lkdGgsIGRvdWJsZSAgbWF4V2lkdGgsIGRvdWJsZSAgb3ZlcmhhbmcsIGRvdWJsZSAgbWV0YWxPdmVyaGFuZyk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0VmlhUnVsZUdlbi4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaGFzIHRvIGJlIGNhbGxlZCAyIHRpbWVzIGV4YWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyA1LjUgc3ludGF4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGxlZndWaWFSdWxlR2VuTGF5ZXIsIG5vdCBib3RoLiAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3VmlhUnVsZUdlbkxheWVyRW5jbG9zdXJlIChjb25zdCBjaGFyKiAgbGF5ZXJOYW1lLCBkb3VibGUgIG92ZXJoYW5nMSwgZG91YmxlICBvdmVyaGFuZzIsIGRvdWJsZSAgbWluV2lkdGgsIGRvdWJsZSAgbWF4V2lkdGgpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndWaWFSdWxlTGF5ZXJHZW4gaXMgY2FsbGVkIHR3aWNlLiAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGluIGEgdmlhcnVsZSBnZW5lcmF0ZSBhbmQgY2FuIGJlIGNhbGxlZCBvbmNlLiAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGUgZGlyZWN0aW9uMSBvciBkaXJlY3Rpb24yIGNhbiBiZSBIT1JJWk9OVEFMIG9yIFZFUlRJQ0FMLiAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3VmlhUnVsZUdlbkxheWVyMyAoY29uc3QgY2hhciogIGxheWVyTmFtZSwgZG91YmxlICB4bCwgZG91YmxlICB5bCwgZG91YmxlICB4aCwgZG91YmxlICB5aCwgZG91YmxlICB4U3BhY2luZywgZG91YmxlICB5U3BhY2luZywgZG91YmxlICByZXNpc3RhbmNlKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBsZWZ3U3RhcnRWaWFSdWxlR2VuIGNhbGwgKGlmIGFueSkuICAgKi8KLS8qIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBsZWZ3U3RhcnRWaWFSdWxlR2VuLiAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3RW5kVmlhUnVsZUdlbiAoY29uc3QgY2hhciogIHZpYVJ1bGVOYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3SW5pdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlIHJvdXRpbmUgc3RhcnRzIHRoZSBub25EZWZhdWx0UnVsZSBzZWN0aW9uLiBUaGUgbm9uRGVmYXVsdFJ1bGUgbGF5ZXJzICAgKi8KLS8qIG11c3QgZm9sbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndTdGFydE5vbkRlZmF1bHRSdWxlIChjb25zdCBjaGFyKiAgcnVsZU5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndJbml0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydE5vbkRlZmF1bHRSdWxlICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3Tm9uRGVmYXVsdFJ1bGVMYXllciAoY29uc3QgY2hhciogIHJvdXRpbmdMYXllck5hbWUsIGRvdWJsZSAgd2lkdGgsIGRvdWJsZSAgbWluU3BhY2luZywgZG91YmxlICB3aXJlRXh0ZW5zaW9uLCBkb3VibGUgIHJlc2lzdGFuY2UsIGRvdWJsZSAgY2FwYWNpdGFuY2UsIGRvdWJsZSAgZWRnZUNhcCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd0luaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0Tm9uRGVmYXVsdFJ1bGUgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBpdCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndOb25EZWZhdWx0UnVsZUhhcmRzcGFjaW5nICgpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE5vbkRlZmF1bHRSdWxlLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG9ubHkgb25jZSBmb3IgZWFjaCB2aWEgc2VjdGlvbi4gICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGUgcm91dGluZSBzdGFydHMgdGhlIG5vbmRlZmF1bHRydWxlIHZpYSBzZWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogQ2FsbCB0aGUgZm9sbG93aW5nIHZpYSBmdW5jdGlvbnMgZm9yIHRoZSByZXN0IG9mIE5PTkRFRkFVTFRSVUxFIFZJQTogICAgICAgKi8KLS8qICAgbGVmd1ZpYVRvcG9mc3RhY2tvbmx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIGxlZndWaWFGb3JlaWduICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBsZWZ3VmlhRm9yZWlnblN0ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgbGVmd1ZpYVJlc2lzdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIGxlZndWaWFMYXllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBsZWZ3VmlhTGF5ZXJSZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgbGVmd05vbkRlZmF1bHRSdWxlRW5kVmlhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndOb25EZWZhdWx0UnVsZVN0YXJ0VmlhIChjb25zdCBjaGFyKiAgdmlhTmFtZSwgY29uc3QgY2hhciogIGlzRGVmYXVsdCk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbGVmd05vbkRlZmF1bHRSdWxlU3RhcnRWaWEgY2FsbC4gICAgICovCi0vKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgdmlhIHNlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd05vbkRlZmF1bHRSdWxlRW5kVmlhIChjb25zdCBjaGFyKiAgdmlhTmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0Tm9uRGVmYXVsdFJ1bGUuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd05vbkRlZmF1bHRSdWxlVXNlVmlhIChjb25zdCBjaGFyKiAgdmlhTmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0Tm9uRGVmYXVsdFJ1bGUuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd05vbkRlZmF1bHRSdWxlVXNlVmlhUnVsZSAoY29uc3QgY2hhciogIHZpYVJ1bGVOYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnROb25EZWZhdWx0UnVsZS4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3Tm9uRGVmYXVsdFJ1bGVNaW5DdXRzIChjb25zdCBjaGFyKiAgbGF5ZXJOYW1lLCBpbnQgIG51bUN1dHMpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxlZndTdGFydE5vbkRlZmF1bHRSdWxlIGNhbGwgKGlmIGFueSAqLwotLyogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndFbmROb25EZWZhdWx0UnVsZSAoY29uc3QgY2hhciogIHJ1bGVOYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3SW5pdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgc2VjdGlvbiBvZiByb3V0aW5lcyBpcyBvcHRpb25hbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEl0IHN0YXJ0cyB0aGUgc3BhY2luZyBzZWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndTdGFydFNwYWNpbmcgKCk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRTcGFjaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBJdCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoZSBzdGFjayBoYXMgdG8gYmUgU1RBQ0suICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndTcGFjaW5nIChjb25zdCBjaGFyKiAgbGF5ZXJOYW1lMSwgY29uc3QgY2hhciogIGxheWVyTmFtZTIsIGRvdWJsZSAgbWluU3BhY2UsIGNvbnN0IGNoYXIqICBzdGFjayk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbGVmd1N0YXJ0U3BhY2luZyBjYWxsIChpZiBhbnkpLiAgICAgICovCi0vKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0VuZFNwYWNpbmcgKCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd0luaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGl0IGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndVbml2ZXJzYWxOb2lzZU1hcmdpbiAoZG91YmxlICBoaWdoLCBkb3VibGUgIGxvdyk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd0luaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGl0IGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndFZGdlUmF0ZVRocmVzaG9sZDEgKGRvdWJsZSAgbnVtKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3SW5pdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgaXQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0VkZ2VSYXRlVGhyZXNob2xkMiAoZG91YmxlICBudW0pOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndJbml0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBpdCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3RWRnZVJhdGVTY2FsZUZhY3RvciAoZG91YmxlICBudW0pOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndJbml0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBpdCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgc3RhcnRzIHRoZSBub2lzZXRhYmxlIHNlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd1N0YXJ0Tm9pc2VUYWJsZSAoaW50ICBudW0pOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE5vaXNlVGFibGUgb3IgbGVmd1N0YXJ0Q29ycmVjdFRhYmxlLiAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBpdCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3RWRnZVJhdGUgKGRvdWJsZSAgbnVtKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3RWRnZVJhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgaXQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UgaW5zaWRlIGxlZndFZGdlUmF0ICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd091dHB1dFJlc2lzdGFuY2UgKGludCAgbnVtUmVzaXN0cywgZG91YmxlKiAgcmVzaXN0YW5jZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd091dHB1dFJlc2lzdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGl0IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgaW5zaWRlICAgICAgICAqLwotLyogbGVmd091dHB1dFJlc2lzdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3VmljdGltcyAoaW50ICBsZW5ndGgsIGludCAgbnVtTm9pc2VzLCBkb3VibGUqICBub2lzZXMpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxlZndTdGFydE5vaXNlVGFibGUgY2FsbCAoaWYgYW55KS4gICAqLwotLyogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UgcGVyIHNlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3RW5kTm9pc2VUYWJsZSAoKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3SW5pdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgaXQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIHN0YXJ0cyB0aGUgY29ycmVjdFRhYmxlIHNlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndTdGFydENvcnJlY3RUYWJsZSAoaW50ICBudW0pOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxlZndTdGFydENvcnJlY3RUYWJsZSBjYWxsIChpZiBhbnkpLiAqLwotLyogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UgcGVyIHNlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3RW5kQ29ycmVjdFRhYmxlICgpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndJbml0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBpdCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNaW5GZWF0dXJlIChkb3VibGUgIHgsIGRvdWJsZSAgeSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd0luaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGl0IGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBleHRlcm4gaW50IGxlZndEaWVsZWN0cmljIChmbG9hdCBkaWVsZWN0cmljKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndJbml0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBpdCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgc3RhcnRzIHRoZSBpcmRyb3Agc2VjdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd1N0YXJ0SXJkcm9wICgpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0SXJkcm9wLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogSXQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGUgY3VycmVudHNOdm9sdHMgaXMgYSBsaXN0IG9mIGN1cnJlbnQgYW5kIHZvbHRzLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0lyZHJvcFRhYmxlIChjb25zdCBjaGFyKiAgdGFibGVOYW1lLCBjb25zdCBjaGFyKiAgY3VycmVudHNOdm9sdHMpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxlZndTdGFydElyZHJvcCBjYWxsIChpZiBhbnkpLiAgICAgICAqLwotLyogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3RW5kSXJkcm9wICgpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd0luaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogSXQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGUgY2xhc3NUeXBlIGNhbiBiZSBQQUQgb3IgQ09SRS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlIHN5bW1ldHJ5IGNhbiBiZSBhIGxpc3Qgb2YgWCBvciBZIG9yIFI5MC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd1NpdGUgKGNvbnN0IGNoYXIqICBzaXRlTmFtZSwgY29uc3QgY2hhciogIGNsYXNzVHlwZSwgY29uc3QgY2hhciogIHN5bW1ldHJ5LCBkb3VibGUgIHdpZHRoLCBkb3VibGUgIGhlaWdodCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U2l0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBJdCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNiBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndTaXRlUm93UGF0dGVybiAoY29uc3QgY2hhciogIHNpdGVOYW1lLCBpbnQgIG9yaWVudCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U2l0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBJdCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNiBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgdGhlIHNhbWUgYXMgbGVmd1NpdGVSb3dQYXR0ZXJuLCBleGNlcHQgb3JpZW50IGlzIGEgY2hhciogICAqLwotRVhURVJOIGludCBsZWZ3U2l0ZVJvd1BhdHRlcm5TdHIgKGNvbnN0IGNoYXIqICBzaXRlTmFtZSwgY29uc3QgY2hhciAqIG9yaWVudCk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbGVmd1NpdGUgY2FsbCAoaWYgYW55KS4gICAgICAgICAgICAgICovCi0vKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSBhZnRlciBsZWZ3U2l0ZS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNCBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndFbmRTaXRlIChjb25zdCBjaGFyKiAgc2l0ZU5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndJbml0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBpdCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgc3RhcnRzIHRoZSBhcnJheSBzZWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3U3RhcnRBcnJheSAoY29uc3QgY2hhciogIGFycmF5TmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0QXJyYXkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBFaXRoZXIgdGhpcyByb3V0aW5lLCBsZWZ3QXJyYXlDYW5wbGFjZSwgbGVmd0FycmF5Q2Fubm90b2NjdXB5LCAgICAgICAgICAgICAqLwotLyogbGVmd0FycmF5VHJhY2tzLCBvciBsZWZ3U3RhcnRBcnJheUZsb29ycGxhbiBtdXN0IGJlIGNhbGxlZCBhdCBsZWFzdCBvbmNlLiAgKi8KLS8qIEl0IGNhbiBiZSBjYWxsIG11bHRpcGxlIHRpbWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3QXJyYXlTaXRlIChjb25zdCBjaGFyKiAgbmFtZSwgZG91YmxlICBvcmlnWCwgZG91YmxlICBvcmlnWSwgaW50ICBvcmllbnQsIGRvdWJsZSAgbnVtWCwgZG91YmxlICBudW1ZLCBkb3VibGUgIHNwYWNlWCwgZG91YmxlICBzcGFjZVkpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydEFycmF5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRWl0aGVyIHRoaXMgcm91dGluZSwgbGVmd0FycmF5Q2FucGxhY2UsIGxlZndBcnJheUNhbm5vdG9jY3VweSwgICAgICAgICAgICAgKi8KLS8qIGxlZndBcnJheVRyYWNrcywgb3IgbGVmd1N0YXJ0QXJyYXlGbG9vcnBsYW4gbXVzdCBiZSBjYWxsZWQgYXQgbGVhc3Qgb25jZS4gICovCi0vKiBJdCBjYW4gYmUgY2FsbCBtdWx0aXBsZSB0aW1lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyB0aGUgc2FtZSBhcyBsZWZ3QXJyYXlTaXRlLCBleGNlcHQgb3JpZW50IGlzIGEgY2hhciogICAgICAgICovCi1FWFRFUk4gaW50IGxlZndBcnJheVNpdGVTdHIgKGNvbnN0IGNoYXIqICBuYW1lLCBkb3VibGUgIG9yaWdYLCBkb3VibGUgIG9yaWdZLCBjb25zdCBjaGFyICogb3JpZW50LCBkb3VibGUgIG51bVgsIGRvdWJsZSAgbnVtWSwgZG91YmxlICBzcGFjZVgsIGRvdWJsZSAgc3BhY2VZKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRBcnJheS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEVpdGhlciB0aGlzIHJvdXRpbmUsIGxlZndBcnJheVNpdGUsIGxlZndBcnJheUNhbm5vdG9jY3VweSwgICAgICAgICAgICAgICAgICovCi0vKiBsZWZ3QXJyYXlUcmFja3MsIG9yIGxlZndTdGFydEFycmF5Rmxvb3JwbGFuIG11c3QgYmUgY2FsbGVkIGF0IGxlYXN0IG9uY2UuICAqLwotLyogSXQgY2FuIGJlIGNhbGwgbXVsdGlwbGUgdGltZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndBcnJheUNhbnBsYWNlIChjb25zdCBjaGFyKiAgbmFtZSwgZG91YmxlICBvcmlnWCwgZG91YmxlICBvcmlnWSwgaW50ICBvcmllbnQsIGRvdWJsZSAgbnVtWCwgZG91YmxlICBudW1ZLCBkb3VibGUgIHNwYWNlWCwgZG91YmxlICBzcGFjZVkpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydEFycmF5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRWl0aGVyIHRoaXMgcm91dGluZSwgbGVmd0FycmF5U2l0ZSwgbGVmd0FycmF5Q2Fubm90b2NjdXB5LCAgICAgICAgICAgICAgICAgKi8KLS8qIGxlZndBcnJheVRyYWNrcywgb3IgbGVmd1N0YXJ0QXJyYXlGbG9vcnBsYW4gbXVzdCBiZSBjYWxsZWQgYXQgbGVhc3Qgb25jZS4gICovCi0vKiBJdCBjYW4gYmUgY2FsbCBtdWx0aXBsZSB0aW1lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyB0aGUgc2FtZSBhcyBsZWZ3QXJyYXlDYW5wbGFjZSwgZXhjZXB0IG9yaWVudCBpcyBhIGNoYXIqICAgICovCi1FWFRFUk4gaW50IGxlZndBcnJheUNhbnBsYWNlU3RyIChjb25zdCBjaGFyKiAgbmFtZSwgZG91YmxlICBvcmlnWCwgZG91YmxlICBvcmlnWSwgY29uc3QgY2hhciAqIG9yaWVudCwgZG91YmxlICBudW1YLCBkb3VibGUgIG51bVksIGRvdWJsZSAgc3BhY2VYLCBkb3VibGUgIHNwYWNlWSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0QXJyYXkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBFaXRoZXIgdGhpcyByb3V0aW5lLCBsZWZ3QXJyYXlTaXRlLCBsZWZ3QXJyYXlDYW5wbGFjZSwgICAgICAgICAgICAgICAgICAgICAqLwotLyogbGVmd0FycmF5VHJhY2tzLCBvciBsZWZ3U3RhcnRBcnJheUZsb29ycGxhbiBtdXN0IGJlIGNhbGxlZCBhdCBsZWFzdCBvbmNlLiAgKi8KLS8qIEl0IGNhbiBiZSBjYWxsIG11bHRpcGxlIHRpbWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3QXJyYXlDYW5ub3RvY2N1cHkgKGNvbnN0IGNoYXIqICBuYW1lLCBkb3VibGUgIG9yaWdYLCBkb3VibGUgIG9yaWdZLCBpbnQgIG9yaWVudCwgZG91YmxlICBudW1YLCBkb3VibGUgIG51bVksIGRvdWJsZSAgc3BhY2VYLCBkb3VibGUgIHNwYWNlWSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0QXJyYXkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBFaXRoZXIgdGhpcyByb3V0aW5lLCBsZWZ3QXJyYXlTaXRlLCBsZWZ3QXJyYXlDYW5wbGFjZSwgICAgICAgICAgICAgICAgICAgICAqLwotLyogbGVmd0FycmF5VHJhY2tzLCBvciBsZWZ3U3RhcnRBcnJheUZsb29ycGxhbiBtdXN0IGJlIGNhbGxlZCBhdCBsZWFzdCBvbmNlLiAgKi8KLS8qIEl0IGNhbiBiZSBjYWxsIG11bHRpcGxlIHRpbWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIHRoZSBzYW1lIGFzIGxlZndBcnJheVRyYWNrcywgZXhjZXB0IG9yaWVudCBpcyBhIGNoYXIqICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0FycmF5Q2Fubm90b2NjdXB5U3RyIChjb25zdCBjaGFyKiAgbmFtZSwgZG91YmxlICBvcmlnWCwgZG91YmxlICBvcmlnWSwgY29uc3QgY2hhciAqIG9yaWVudCwgZG91YmxlICBudW1YLCBkb3VibGUgIG51bVksIGRvdWJsZSAgc3BhY2VYLCBkb3VibGUgIHNwYWNlWSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0QXJyYXkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBFaXRoZXIgdGhpcyByb3V0aW5lLCBsZWZ3QXJyYXlTaXRlLCBsZWZ3QXJyYXlDYW5wbGFjZSwgbGVmd0FycmF5Q2Fubm90b2NjdSAqLwotLyogb3IgbGVmd1N0YXJ0QXJyYXlGbG9vcnBsYW4gbXVzdCBiZSBjYWxsZWQgYXQgbGVhc3Qgb25jZS4gICAgICAgICAgICAgICAgICAgKi8KLS8qIEl0IGNhbiBiZSBjYWxsIG11bHRpcGxlIHRpbWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3QXJyYXlUcmFja3MgKGNvbnN0IGNoYXIqICB4eSwgZG91YmxlICBzdGFydCwgaW50ICBudW1UcmFja3MsIGRvdWJsZSAgc3BhY2UsIGNvbnN0IGNoYXIqICBsYXllcnMpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydEFycmF5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRWl0aGVyIHRoaXMgcm91dGluZSwgbGVmd0FycmF5U2l0ZSwgbGVmd0FycmF5Q2FucGxhY2UsIGxlZndBcnJheUNhbm5vdG9jY3UgKi8KLS8qIG9yIGxlZndBcnJheVRyYWNrcyBtdXN0IGJlIGNhbGxlZCBhdCBsZWFzdCBvbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBJdCBjYW4gYmUgY2FsbCBtdWx0aXBsZSB0aW1lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoZSByb3V0aW5lIHN0YXJ0cyB0aGUgYXJyYXkgZmxvb3JwbGFuIHNlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndTdGFydEFycmF5Rmxvb3JwbGFuIChjb25zdCBjaGFyKiAgbmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRBcnJheUZsb29ycGxhbi4gICAgICAgICAgICAgICAgICovCi0vKiBJdCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoZSBzaXRlIGNhbiBiZSBDQU5QTEFDRSBvciBDQU5OT1RPQ0NVUFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndBcnJheUZsb29ycGxhbiAoY29uc3QgY2hhciogIHNpdGUsIGNvbnN0IGNoYXIqICBuYW1lLCBkb3VibGUgIG9yaWdYLCBkb3VibGUgIG9yaWdZLCBpbnQgIG9yaWVudCwgaW50ICBudW1YLCBpbnQgIG51bVksIGRvdWJsZSAgc3BhY2VYLCBkb3VibGUgIHNwYWNlWSk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRBcnJheUZsb29ycGxhbi4gICAgICAgICAgICAgICAgICovCi0vKiBJdCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoZSBzaXRlIGNhbiBiZSBDQU5QTEFDRSBvciBDQU5OT1RPQ0NVUFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgdGhlIHNhbWUgYXMgbGVmd0FycmF5Rmxvb3JwbGFuLCBleGNlcHQgb3JpZW50IGlzIGEgY2hhciogICAqLwotRVhURVJOIGludCBsZWZ3QXJyYXlGbG9vcnBsYW5TdHIgKGNvbnN0IGNoYXIqICBzaXRlLCBjb25zdCBjaGFyKiAgbmFtZSwgZG91YmxlICBvcmlnWCwgZG91YmxlICBvcmlnWSwgY29uc3QgY2hhciAqIG9yaWVudCwgaW50ICBudW1YLCBpbnQgIG51bVksIGRvdWJsZSAgc3BhY2VYLCBkb3VibGUgIHNwYWNlWSk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbGVmd1N0YXJ0QXJyYXlGbG9vcnBsYW4gY2FsbCAoaWYgYW55ICovCi0vKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgc2VjdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0VuZEFycmF5Rmxvb3JwbGFuIChjb25zdCBjaGFyKiAgbmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0QXJyYXkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogSXQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGUgeHkgY2FuIGJlIFggb3IgWS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3QXJyYXlHY2VsbGdyaWQgKGNvbnN0IGNoYXIqICB4eSwgZG91YmxlICBzdGFydFhZLCBpbnQgIGNvbFJvd3MsIGRvdWJsZSAgc3BhY2VYWSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0QXJyYXkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHNlY3Rpb24gb2Ygcm91dGluZXMgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsIG9ubHkgb25jZS4gICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoZSByb3V0aW5lIHN0YXJ0cyB0aGUgYXJyYXkgZGVmYXVsdGNhcCBzZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndTdGFydEFycmF5RGVmYXVsdENhcCAoaW50ICBzaXplKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydEFycmF5RGVmYXVsdENhcC4gICAgICAgICAgICAgICAgKi8KLS8qIEl0IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3QXJyYXlEZWZhdWx0Q2FwIChkb3VibGUgIG51bVBpbnMsIGRvdWJsZSAgY2FwKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBsZWZ3U3RhcnRBcnJheURlZmF1bHRDYXAgY2FsbCAoaWYgYW4gKi8KLS8qIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3RW5kQXJyYXlEZWZhdWx0Q2FwICgpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxlZndTdGFydEFycmF5IGNhbGwgKGlmIGFueSkuICAgICAgICAqLwotLyogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UgcGVyIHNlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndFbmRBcnJheSAoY29uc3QgY2hhciogIGFycmF5TmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3SW5pdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBzdGFydHMgdGhlIG1hY3JvIHNlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndTdGFydE1hY3JvIChjb25zdCBjaGFyKiAgbWFjcm9OYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UgcGVyIG1hY3JvIHNlY3Rpb24uICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlIHZhbHVlMSBjYW4gYmUgQ09WRVIsIFJJTkcsIEJMT0NLLCBQQUQsIENPUkUsIG9yIEVOQ0FQLiAgICAgICAgICAgICAgICAgKi8KLS8qIFRoZSB2YWx1ZTIgY2FuIGJlIEJVTVAgaWYgdmFsdWUxIGlzIENPVkVSLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBvciBCTEFDS0JPWCwgb3IgU09GVCBpZiB2YWx1ZTEgaXMgQkxPQ0ssICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogb3IgSU5QVVQsIE9VVFBVVCwgSU5PVVQsIFBPV0VSLCBvciBTUEFDRVIgaWYgdmFsdWUxIGlzIFBBRCwgICAgICAgICAgICAgICAgKi8KLS8qIG9yIEZFRURUSFJVLCBUSUVISUdILCBUSUVMT1csIFNQQUNFUiwgQU5URU5OQUNFTEwsIG9yIFdFTExUQVAgICAgICAgICAgICAgICovCi0vKiBpZiB2YWx1ZTEgaXMgQ09SRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogb3IgUFJFLCBQT1NULCBUT1BMRUZULCBUT1BSSUdIVCwgQk9PVE9NTEVGVCwgb3IgQk9UVE9NUklHSFQgaWYgdmFsdWUxIGlzICAgKi8KLS8qIEVOQ0FQLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb0NsYXNzIChjb25zdCBjaGFyKiAgdmFsdWUxLCBjb25zdCBjaGFyKiAgdmFsdWUyKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndJbml0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuOCBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd01hY3JvRml4ZWRNYXNrICgpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgbWFjcm8gc2VjdGlvbi4gICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGUgdmFsdWUxIGNhbiBiZSBVU0VSLCBHRU5FUkFURSwgb3IgQkxPQ0suICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TWFjcm9Tb3VyY2UgKGNvbnN0IGNoYXIqICB2YWx1ZTEpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHBlciBtYWNybyBzZWN0aW8gKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb0ZvcmVpZ24gKGNvbnN0IGNoYXIqICBuYW1lLCBkb3VibGUgIHhsLCBkb3VibGUgIHlsLCBpbnQgIG9yaWVudCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgcGVyIG1hY3JvIHNlY3RpbyAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyB0aGUgc2FtZSBhcyBsZWZ3TWFjcm9Gb3JlaWduLCBleGNlcHQgb3JpZW50IGlzIGEgY2hhciogICAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb0ZvcmVpZ25TdHIgKGNvbnN0IGNoYXIqICBuYW1lLCBkb3VibGUgIHhsLCBkb3VibGUgIHlsLCBjb25zdCBjaGFyICogb3JpZW50KTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UgcGVyIG1hY3JvIHNlY3Rpb24uICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TWFjcm9PcmlnaW4gKGRvdWJsZSAgeGwsIGRvdWJsZSAgeWwpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgbWFjcm8gc2VjdGlvbi4gICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb0VFUSAoY29uc3QgY2hhciogIG1hY3JvTmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBtYWNybyBzZWN0aW9uLiAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd01hY3JvTEVRIChjb25zdCBjaGFyKiAgbWFjcm9OYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgcGVyIG1hY3JvIHNlY3Rpb24uICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TWFjcm9TaXplIChkb3VibGUgIHdpZHRoLCBkb3VibGUgIGhlaWdodCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBtYWNybyBzZWN0aW9uLiAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoZSBzeW1tZXRyeSBjYW4gYmUgYSBsaXN0IG9mIFgsIFksIG9yIFI5MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb1N5bW1ldHJ5IChjb25zdCBjaGFyKiAgc3ltbWV0cnkpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgbWFjcm8gc2VjdGlvbi4gICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb1NpdGUgKGNvbnN0IGNoYXIqICBzaXRlTmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYXQgbGVhc3Qgb25jZSBwZXIgbWFjcm8gc2VjdGlvbi4gICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd01hY3JvU2l0ZVBhdHRlcm4gKGNvbnN0IGNoYXIqICBuYW1lLCBkb3VibGUgIG9yaWdYLCBkb3VibGUgIG9yaWdZLCBpbnQgIG9yaWVudCwgaW50ICBudW1YLCBpbnQgIG51bVksIGRvdWJsZSAgc3BhY2VYLCBkb3VibGUgIHNwYWNlWSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYXQgbGVhc3Qgb25jZSBwZXIgbWFjcm8gc2VjdGlvbi4gICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyB0aGUgc2FtZSBhcyBsZWZ3TWFjcm9TaXRlUGF0dGVybiwgZXhjZXB0IG9yaWVudCBpcyBhIGNoYXIqICovCi1FWFRFUk4gaW50IGxlZndNYWNyb1NpdGVQYXR0ZXJuU3RyIChjb25zdCBjaGFyKiAgbmFtZSwgZG91YmxlICBvcmlnWCwgZG91YmxlICBvcmlnWSwgY29uc3QgY2hhciAqIG9yaWVudCwgaW50ICBudW1YLCBpbnQgIG51bVksIGRvdWJsZSAgc3BhY2VYLCBkb3VibGUgIHNwYWNlWSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBtYWNybyBzZWN0aW9uLiAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb1Bvd2VyIChkb3VibGUgIHBvd2VyKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBsZWZ3U3RhcnRNYWNybyBjYWxsIChpZiBhbnkpLiAgICAgICAgKi8KLS8qIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBtYWNybyBzZWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3RW5kTWFjcm8gKGNvbnN0IGNoYXIqICBtYWNyb05hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgbWFjcm8gc2VjdGlvbi4gICAgKi8KLS8qIFRoaXMgaXMgYSA1LjYgc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3U3RhcnRNYWNyb0RlbnNpdHkgKGNvbnN0IGNoYXIqICBsYXllck5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvRGVuc2l0eS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgaXMgYSA1LjYgc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TWFjcm9EZW5zaXR5TGF5ZXJSZWN0IChkb3VibGUgIHgxLCBkb3VibGUgIHkxLCBkb3VibGUgIHgyLCBkb3VibGUgIHkyLCBkb3VibGUgIGRlbnNpdHlWYWx1ZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbGVmd1N0YXJ0TWFjcm9QaW4gY2FsbCAoaWYgYW55KS4gICAgICovCi0vKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgbWFjcm8gc2VjdGlvbi4gICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNiBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndFbmRNYWNyb0RlbnNpdHkgKCk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbGVmd1N0YXJ0TWFjcm8gY2FsbCAoaWYgYW55KS4gICAgICAgICovCi0vKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEl0IHN0YXJ0cyB0aGUgbWFjcm8gcGluIHNlY3Rpb24gd2l0aGluIG1hY3JvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndTdGFydE1hY3JvUGluIChjb25zdCBjaGFyKiAgcGluTmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9QaW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd01hY3JvUGluVGFwZXJSdWxlIChjb25zdCBjaGFyKiAgcnVsZU5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvUGluLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb1BpbkZvcmVpZ24gKGNvbnN0IGNoYXIqICBuYW1lLCBkb3VibGUgIHhsLCBkb3VibGUgIHlsLCBpbnQgIG9yaWVudCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9QaW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRocyByb3V0aW5lIGlzIHRoZSBzYW1lIGFzIGxlZndNYWNyb1BpbkZvcmVpZ24sIGV4Y2VwdCBvcmllbnQgaXMgYSBjaGFyKiAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb1BpbkZvcmVpZ25TdHIgKGNvbnN0IGNoYXIqICBuYW1lLCBkb3VibGUgIHhsLCBkb3VibGUgIHlsLCBjb25zdCBjaGFyKiAgb3JpZW50KTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TWFjcm9QaW5MRVEgKGNvbnN0IGNoYXIqICBwaW5OYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlIGRpcmVjdGlvbiBjYW4gYmUgSU5QVVQsIE9VVFBVVCwgT1VUUFVUIFRSSVNUQVRFLCBJTk9VVCwgb3IgRkVFRFRIUlUuICAgKi8KLUVYVEVSTiBpbnQgbGVmd01hY3JvUGluRGlyZWN0aW9uIChjb25zdCBjaGFyKiAgZGlyZWN0aW9uKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlIHVzZSBjYW4gYmUgU0lHTkFMLCBBTkFMT0csIFBPV0VSLCBHUk9VTkQsIG9yIENMT0NLLiAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd01hY3JvUGluVXNlIChjb25zdCBjaGFyKiAgdXNlKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlIG5hbWNlIGNhbiBiZSBBQlVUTUVOVCwgUklORywgb3IgRkVFRFRIUlUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd01hY3JvUGluU2hhcGUgKGNvbnN0IGNoYXIqICBuYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TWFjcm9QaW5NdXN0am9pbiAoY29uc3QgY2hhciogIG5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvUGluLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgaXMgYSA1LjYgc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TWFjcm9QaW5OZXRFeHByIChjb25zdCBjaGFyKiAgbmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9QaW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNiBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb1BpblN1cHBseVNlbnNpdGl2aXR5IChjb25zdCBjaGFyKiAgcGluTmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9QaW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNiBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb1Bpbkdyb3VuZFNlbnNpdGl2aXR5IChjb25zdCBjaGFyKiAgcGluTmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9QaW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb1Bpbk91dHB1dG5vaXNlbWFyZ2luIChpbnQgIGhpZ2gsIGludCAgbG93KTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd01hY3JvUGluT3V0cHV0cmVzaXN0YW5jZSAoaW50ICBoaWdoLCBpbnQgIGxvdyk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9QaW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb1BpbklucHV0bm9pc2VtYXJnaW4gKGludCAgaGlnaCwgaW50ICBsb3cpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvUGluLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TWFjcm9QaW5Qb3dlciAoZG91YmxlICBwb3dlcik7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9QaW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb1BpbkxlYWthZ2UgKGRvdWJsZSAgbGVha2FnZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9QaW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb1BpbkNhcGFjaXRhbmNlIChkb3VibGUgIGNhcGFjaXRhbmNlKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd01hY3JvUGluUmVzaXN0YW5jZSAoZG91YmxlICByZXNpc3RhbmNlKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd01hY3JvUGluUHVsbGRvd25yZXMgKGRvdWJsZSAgcmVzaXN0YW5jZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9QaW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb1BpblRpZW9mZnIgKGRvdWJsZSAgcmVzaXN0YW5jZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9QaW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb1BpblZISSAoZG91YmxlICB2b2x0YWdlKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd01hY3JvUGluVkxPIChkb3VibGUgIHZvbHRhZ2UpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvUGluLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TWFjcm9QaW5SaXNldm9sdGFnZXRocmVzaG9sZCAoZG91YmxlICB2b2x0YWdlKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd01hY3JvUGluRmFsbHZvbHRhZ2V0aHJlc2hvbGQgKGRvdWJsZSAgdm9sdGFnZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9QaW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb1BpblJpc2V0aHJlc2ggKGRvdWJsZSAgY2FwYWNpdGFuY2UpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvUGluLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TWFjcm9QaW5GYWxsdGhyZXNoIChkb3VibGUgIGNhcGFjaXRhbmNlKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd01hY3JvUGluUmlzZXNhdGN1ciAoZG91YmxlICBjdXJyZW50KTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd01hY3JvUGluRmFsbHNhdGN1ciAoZG91YmxlICBjdXJyZW50KTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlIG5hbWUgY2FuIGJlIEFDVElWRSBvciBSRVNJU1RJVkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb1BpbkN1cnJlbnRzb3VyY2UgKGNvbnN0IGNoYXIqICBuYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd01hY3JvUGluSVZfVGFibGVzIChjb25zdCBjaGFyKiAgbG93TmFtZSwgY29uc3QgY2hhciogIGhpZ2hOYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gICAgICAgICAgICAgICAgICovCi0vKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIDUuNCBBbnRlbm5hIHN5bnRheCwgY2Fubm90IGJlIGJvdGggICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd01hY3JvUGluQW50ZW5uYXNpemUgKGRvdWJsZSAgdmFsdWUsIGNvbnN0IGNoYXIqICBsYXllck5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvUGluLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAgICAgICAgICAgICAgICAgKi8KLS8qIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgNS40IEFudGVubmEgc3ludGF4LCBjYW5ub3QgYmUgYm90aCAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TWFjcm9QaW5BbnRlbm5hTWV0YWxBcmVhIChkb3VibGUgIHZhbHVlLCBjb25zdCBjaGFyKiAgbGF5ZXJOYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gICAgICAgICAgICAgICAgICovCi0vKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIDUuNCBBbnRlbm5hIHN5bnRheCwgY2Fubm90IGJlIGJvdGggICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd01hY3JvUGluQW50ZW5uYU1ldGFsTGVuZ3RoIChkb3VibGUgIHZhbHVlLCBjb25zdCBjaGFyKiAgbGF5ZXJOYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGlzIGEgNS40IHN5bnRheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRWl0aGVyIHRoaXMgcm91dGluZSBvciA1LjMgQW50ZW5uYSBzeW50YXgsIGNhbm5vdCBiZSBib3RoICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb1BpbkFudGVubmFQYXJ0aWFsTWV0YWxBcmVhIChkb3VibGUgIHZhbHVlLCBjb25zdCBjaGFyKiAgbGF5ZXJOYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGlzIGEgNS40IHN5bnRheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRWl0aGVyIHRoaXMgcm91dGluZSBvciA1LjMgQW50ZW5uYSBzeW50YXgsIGNhbm5vdCBiZSBib3RoICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb1BpbkFudGVubmFQYXJ0aWFsTWV0YWxTaWRlQXJlYSAoZG91YmxlICB2YWx1ZSwgY29uc3QgY2hhciogIGxheWVyTmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9QaW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNCBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgNS4zIEFudGVubmEgc3ludGF4LCBjYW5ub3QgYmUgYm90aCAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TWFjcm9QaW5BbnRlbm5hUGFydGlhbEN1dEFyZWEgKGRvdWJsZSAgdmFsdWUsIGNvbnN0IGNoYXIqICBsYXllck5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvUGluLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgaXMgYSA1LjQgc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIDUuMyBBbnRlbm5hIHN5bnRheCwgY2Fubm90IGJlIGJvdGggICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd01hY3JvUGluQW50ZW5uYURpZmZBcmVhIChkb3VibGUgIHZhbHVlLCBjb25zdCBjaGFyKiAgbGF5ZXJOYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoZSBveGlkZSB2YWx1ZSwgY2FuIGJlIGVpdGhlciBPWElERTEsIE9YSURFMiwgT1hJREUzLCBvciBPWElERTQuICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuIEVhY2ggb3hpZGUgdmFsdWUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UgICAgICAgICAqLwotLyogYWZ0ZXIgdGhlIGxlZndTdGFydE1hY3JvUGluLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgaXMgYSA1LjUgc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TWFjcm9QaW5BbnRlbm5hTW9kZWwgKGNvbnN0IGNoYXIqICBveGlkZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9QaW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNCBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgNS4zIEFudGVubmEgc3ludGF4LCBjYW5ub3QgYmUgYm90aCAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TWFjcm9QaW5BbnRlbm5hR2F0ZUFyZWEgKGRvdWJsZSAgdmFsdWUsIGNvbnN0IGNoYXIqICBsYXllck5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvUGluLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgaXMgYSA1LjQgc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIDUuMyBBbnRlbm5hIHN5bnRheCwgY2Fubm90IGJlIGJvdGggICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd01hY3JvUGluQW50ZW5uYU1heEFyZWFDYXIgKGRvdWJsZSAgdmFsdWUsIGNvbnN0IGNoYXIqICBsYXllck5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvUGluLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgaXMgYSA1LjQgc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIDUuMyBBbnRlbm5hIHN5bnRheCwgY2Fubm90IGJlIGJvdGggICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd01hY3JvUGluQW50ZW5uYU1heFNpZGVBcmVhQ2FyIChkb3VibGUgIHZhbHVlLCBjb25zdCBjaGFyKiAgbGF5ZXJOYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGlzIGEgNS40IHN5bnRheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRWl0aGVyIHRoaXMgcm91dGluZSBvciA1LjMgQW50ZW5uYSBzeW50YXgsIGNhbm5vdCBiZSBib3RoICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb1BpbkFudGVubmFNYXhDdXRDYXIgKGRvdWJsZSAgdmFsdWUsIGNvbnN0IGNoYXIqICBsYXllck5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxlZndTdGFydE1hY3JvUGluIGNhbGwgKGlmIGFueSkuICAgICAqLwotLyogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UgcGVyIG1hY3JvIHNlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndFbmRNYWNyb1BpbiAoY29uc3QgY2hhciogIHBpbk5hbWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxlZndTdGFydE1hY3JvUGluIGNhbGwgKGlmIGFueSkuICAgICAqLwotLyogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBJdCBzdGFydHMgdGhlIG1hY3JvIHBpbiBwb3J0IHNlY3Rpb24gd2l0aGluIG1hY3JvIHBpbi4gICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlIGNsYXNzVHlwZSBjYW4gYmUgTk9ORSBvciBDT1JFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd1N0YXJ0TWFjcm9QaW5Qb3J0IChjb25zdCBjaGFyKiAgY2xhc3NUeXBlKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1BpblBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgbGVmd01hY3JvUGluUG9ydERlc2lnblJ1bGVXaWR0aCBtdXN0IGJlIGNhbGxlZCwgICAgICovCi0vKiBidXQgY2FuJ3QgYmUgYm90aC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogU3BhY2luZyBpcyBvcHRpb25hbCBmb3IgbWluaW11bSBzcGFjaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb1BpblBvcnRMYXllciAoY29uc3QgY2hhciogIGxheWVyTmFtZSwgZG91YmxlICBzcGFjaW5nKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1BpblBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgbGVmd01hY3JvUGluUG9ydExheWVyIG11c3QgYmUgY2FsbGVkLCBidXQgY2FuJ3QgICAgICovCi0vKiBiZSBib3RoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogd2lkdGggaXMgb3B0aW9uYWwgZm9yIERlc2lnblJ1bGVXaWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgaXMgYSA1LjQgc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TWFjcm9QaW5Qb3J0RGVzaWduUnVsZVdpZHRoIChjb25zdCBjaGFyKiAgbGF5ZXJOYW1lLCBkb3VibGUgIHdpZHRoKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3TWFjcm9QaW5Qb3J0TGF5ZXIuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb1BpblBvcnRMYXllcldpZHRoIChkb3VibGUgIHdpZHRoKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1BpblBvcnRMYXllci4gICAgICAgICAgICAgICAgICAgKi8KLS8qIEVpdGhlciB0aGlzIHJvdXRpbmUsIGxlZndTdGFydE1hY3JvUGluUG9ydExheWVyUmVjdCwgb3IgICAgICAgICAgICAgICAgICAgICovCi0vKiBsZWZ3U3RhcnRNYWNyb1BpblBvcnRMYXllclBvbHlnb24gbXVzdCBiZSBjYWxsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd01hY3JvUGluUG9ydExheWVyUGF0aCAoaW50ICBudW1fcGF0aHMsIGRvdWJsZSogIHhsLCBkb3VibGUqICB5bCwgaW50ICBudW1YLCBpbnQgIG51bVksIGRvdWJsZSAgc3BhY2VYLCBkb3VibGUgIHNwYWNlWSwgaW50ICAgICBtYXNrKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1BpblBvcnRMYXllci4gICAgICAgICAgICAgICAgICAgKi8KLS8qIEVpdGhlciB0aGlzIHJvdXRpbmUsIGxlZndTdGFydE1hY3JvUGluUG9ydExheWVyUGF0aCwgb3IgICAgICAgICAgICAgICAgICAgICovCi0vKiBsZWZ3U3RhcnRNYWNyb1BpblBvcnRMYXllclBvbHlnb24gbXVzdCBiZSBjYWxsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd01hY3JvUGluUG9ydExheWVyUmVjdCAoZG91YmxlICB4bDEsIGRvdWJsZSAgeWwxLCBkb3VibGUgIHhsMiwgZG91YmxlICB5bDIsIGludCAgbnVtWCwgaW50ICBudW1ZLCBkb3VibGUgIHNwYWNlWCwgZG91YmxlICBzcGFjZVksIGludCAgbWFzayk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9QaW5Qb3J0TGF5ZXIuICAgICAgICAgICAgICAgICAgICovCi0vKiBFaXRoZXIgdGhpcyByb3V0aW5lLCBsZWZ3U3RhcnRNYWNyb1BpblBvcnRMYXllclBhdGgsIG9yICAgICAgICAgICAgICAgICAgICAqLwotLyogbGVmd1N0YXJ0TWFjcm9QaW5Qb3J0TGF5ZXJSZWN0IG11c3QgYmUgY2FsbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb1BpblBvcnRMYXllclBvbHlnb24gKGludCAgbnVtX3BvbHlzLCBkb3VibGUqICB4bCwgZG91YmxlKiAgeWwsIGludCAgbnVtWCwgaW50ICBudW1ZLCBkb3VibGUgIHNwYWNlWCwgZG91YmxlICBzcGFjZVksIGludCAgbWFzayk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9QaW5Qb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGxlZndTdGFydE1hY3JvUGluUG9ydExheWVyIG11c3QgYmUgY2FsbGVkLiAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd01hY3JvUGluUG9ydFZpYSAoZG91YmxlICB4bCwgZG91YmxlICB5bCwgY29uc3QgY2hhciogIHZpYU5hbWUsIGludCAgbnVtWCwgaW50ICBudW1ZLCBkb3VibGUgIHNwYWNlWCwgZG91YmxlICBzcGFjZVksIGludCAgbWFzayk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbGVmd1N0YXJ0TWFjcm9QaW5Qb3J0IGNhbGwgKGlmIGFueSkuICovCi0vKiBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgbWFjcm8gc2VjdGlvbi4gICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0VuZE1hY3JvUGluUG9ydCAoKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciB0aGUgbGVmd1N0YXJ0TWFjcm8gY2FsbCAoaWYgYW55KS4gICAgICAgICAgICAgKi8KLS8qIFRoZSByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogSXQgc3RhcnRzIHRoZSBtYWNybyBvYnMgc2VjdGlvbiB3aXRoaW4gbWFjcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd1N0YXJ0TWFjcm9PYnMgKCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9PYnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBFaXRoZXIgdGhpcyByb3V0aW5lLCBsZWZ3TWFjcm9PYnNEZXNpZ25SdWxlV2lkdGgsIGxlZndNYWNyb09ic1ZpYSBvciAgICAgICAqLwotLyogbGVmd01hY3JvRXhjZXB0UEdOZXQgbXVzdCBiZSBjYWxsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFNwYWNpbmcgaXMgb3B0aW9uYWwgZm9yIG1pbmltdW0gc3BhY2luZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TWFjcm9PYnNMYXllciAoY29uc3QgY2hhciogIGxheWVyTmFtZSwgZG91YmxlICBzcGFjaW5nKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb09icy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEVpdGhlciB0aGlzIHJvdXRpbmUsIGxlZndNYWNyb09ic0xheWVyLCBsZWZ3TWFjcm9PYnNWaWEgb3IgICAgICAgICAgICAgICAgICovCi0vKiBsZWZ3TWFjcm9FeGNlcHRQR05ldCBtdXN0IGJlIGNhbGxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogU3BhY2luZyBpcyBvcHRpb25hbCBmb3IgbWluaW11bSBzcGFjaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgaXMgYSA1LjQgc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TWFjcm9PYnNEZXNpZ25SdWxlV2lkdGggKGNvbnN0IGNoYXIqICBsYXllck5hbWUsIGRvdWJsZSAgd2lkdGgpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvT2JzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRWl0aGVyIHRoaXMgcm91dGluZSwgbGVmd01hY3JvT2JzTGF5ZXIsIGxlZndNYWNyb09ic1ZpYSBvciAgICAgICAgICAgICAgICAgKi8KLS8qIGxlZndNYWNyb09ic0Rlc2lnblJ1bGVXaWR0aCBtdXN0IGJlIGNhbGxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBTcGFjaW5nIGlzIG9wdGlvbmFsIGZvciBtaW5pbXVtIHNwYWNpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBpcyBhIDUuNCBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb0V4Y2VwdFBHTmV0IChjb25zdCBjaGFyKiAgbGF5ZXJOYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb09icy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb09ic0xheWVyV2lkdGggKGRvdWJsZSAgd2lkdGgpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvT2JzTGF5ZXIuICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRWl0aGVyIHRoaXMgcm91dGluZSwgbGVmd01hY3JvT2JzTGF5ZXJSZWN0LCBvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGxlZndTdGFydE1hY3JvT2JzTGF5ZXJQb2x5Z29uIG11c3QgYmUgY2FsbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TWFjcm9PYnNMYXllclBhdGggKGludCAgbnVtX3BhdGhzLCBkb3VibGUqICB4bCwgZG91YmxlKiAgeWwsIGludCAgbnVtWCwgaW50ICBudW1ZLCBkb3VibGUgIHNwYWNlWCwgZG91YmxlICBzcGFjZVksIGludCAgbWFzayk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9PYnNMYXllci4gICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBFaXRoZXIgdGhpcyByb3V0aW5lLCBsZWZ3TWFjcm9PYnNMYXllclBhdGgsIG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogbGVmd1N0YXJ0TWFjcm9PYnNMYXllclBvbHlnb24gbXVzdCBiZSBjYWxsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb09ic0xheWVyUmVjdCAoZG91YmxlICB4bDEsIGRvdWJsZSAgeWwxLCBkb3VibGUgIHhsMiwgZG91YmxlICB5bDIsIGludCAgbnVtWCwgaW50ICBudW1ZLCBkb3VibGUgIHNwYWNlWCwgZG91YmxlICBzcGFjZVksIGludCAgbWFzayk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9PYnNMYXllci4gICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBFaXRoZXIgdGhpcyByb3V0aW5lLCBsZWZ3TWFjcm9PYnNMYXllclBhdGgsIG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogbGVmd1N0YXJ0TWFjcm9PYnNMYXllclBhdGggbXVzdCBiZSBjYWxsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb09ic0xheWVyUG9seWdvbiAoaW50ICBudW1fcG9seXMsIGRvdWJsZSogIHhsLCBkb3VibGUqICB5bCwgaW50ICBudW1YLCBpbnQgIG51bVksIGRvdWJsZSAgc3BhY2VYLCBkb3VibGUgIHNwYWNlWSwgaW50ICBtYXNrKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb09icy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgbGVmd01hY3JvT2JzTGF5ZXJ8bGVmd01hY3JvT2JzRGVzaWduUnVsZVdpZHRoICAgICAgICovCi0vKiBtdXN0IGJlIGNhbGxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd01hY3JvT2JzVmlhIChkb3VibGUgIHhsLCBkb3VibGUgIHlsLCBjb25zdCBjaGFyKiAgdmlhTmFtZSwgaW50ICBudW1YLCBpbnQgIG51bVksIGRvdWJsZSAgc3BhY2VYLCBkb3VibGUgIHNwYWNlWSwgaW50ICBtYXNrKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBsZWZ3U3RhcnRNYWNyb09icyBjYWxsIChpZiBhbnkpLiAgICAgKi8KLS8qIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBtYWNybyBzZWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3RW5kTWFjcm9PYnMgKCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGxlZndTdGFydE1hY3JvIGNhbGwgKGlmIGFueSkuICAgICAgICAgICAgICovCi0vKiBUaGUgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEl0IHN0YXJ0cyB0aGUgbWFjcm8gdGltaW5nIHNlY3Rpb24gd2l0aGluIG1hY3JvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3U3RhcnRNYWNyb1RpbWluZyAoKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBsZWZ3U3RhcnRNYWNyb1RpbWluZy4gICAgICAgICAgICAgICAgKi8KLS8qIEl0IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIGZvciB7RlJPTVBJTiBwaW5OYW1lLi4uOyBbVE9QSU4gcGluTmFtZS4uLjtdIHwgRlJPTVBJTiAgICAgKi8KLS8qIHBpbk5hbWUuLi47fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmNlIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlIG51bV9mclBpbk5hbWVzIGNvbnRhaW5zIHRoZSBudW1iZXIgb2Ygb2JqZWN0IGluIHRoZSBhcnJheSBmcm9tUGlucy4gICAgKi8KLS8qIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb1RpbWluZ1BpbiAoY29uc3QgY2hhciogIGZyb21QaW4sIGNvbnN0IGNoYXIqICB0b1Bpbik7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbGVmd1N0YXJ0TWFjcm9UaW1pbmcuICAgICAgICAgICAgICAgICovCi0vKiBJdCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoZSByaXNlRmFsbCBjYW4gYmUgUklTRSBvciBGQUxMLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TWFjcm9UaW1pbmdJbnRyaW5zaWMgKGNvbnN0IGNoYXIqICByaXNlRmFsbCwgZG91YmxlICBtaW4sIGRvdWJsZSAgbWF4LCBkb3VibGUgIHNsZXdUMSwgZG91YmxlICBzbGV3VDFNaW4sIGRvdWJsZSAgc2xld1QxTWF4LCBkb3VibGUgIHNsZXdUMiwgZG91YmxlICBzbGV3VDJNaW4sIGRvdWJsZSAgc2xld1QyTWF4LCBkb3VibGUgIHNsZXdUMywgZG91YmxlICB2YXJNaW4sIGRvdWJsZSAgdmFyTWF4KTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBsZWZ3U3RhcnRNYWNyb1RpbWluZy4gICAgICAgICAgICAgICAgKi8KLS8qIEl0IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd01hY3JvVGltaW5nUmlzZXJzIChkb3VibGUgIG1pbiwgZG91YmxlICBtYXgpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxlZndTdGFydE1hY3JvVGltaW5nLiAgICAgICAgICAgICAgICAqLwotLyogSXQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TWFjcm9UaW1pbmdGYWxscnMgKGRvdWJsZSAgbWluLCBkb3VibGUgIG1heCk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbGVmd1N0YXJ0TWFjcm9UaW1pbmcuICAgICAgICAgICAgICAgICovCi0vKiBJdCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb1RpbWluZ1Jpc2VjcyAoZG91YmxlICBtaW4sIGRvdWJsZSAgbWF4KTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBsZWZ3U3RhcnRNYWNyb1RpbWluZy4gICAgICAgICAgICAgICAgKi8KLS8qIEl0IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd01hY3JvVGltaW5nRmFsbGNzIChkb3VibGUgIG1pbiwgZG91YmxlICBtYXgpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxlZndTdGFydE1hY3JvVGltaW5nLiAgICAgICAgICAgICAgICAqLwotLyogSXQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TWFjcm9UaW1pbmdSaXNlc2F0dDEgKGRvdWJsZSAgbWluLCBkb3VibGUgIG1heCk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbGVmd1N0YXJ0TWFjcm9UaW1pbmcuICAgICAgICAgICAgICAgICovCi0vKiBJdCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndNYWNyb1RpbWluZ0ZhbGxzYXR0MSAoZG91YmxlICBtaW4sIGRvdWJsZSAgbWF4KTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBsZWZ3U3RhcnRNYWNyb1RpbWluZy4gICAgICAgICAgICAgICAgKi8KLS8qIEl0IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd01hY3JvVGltaW5nUmlzZXQwIChkb3VibGUgIG1pbiwgZG91YmxlICBtYXgpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxlZndTdGFydE1hY3JvVGltaW5nLiAgICAgICAgICAgICAgICAqLwotLyogSXQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TWFjcm9UaW1pbmdGYWxsdDAgKGRvdWJsZSAgbWluLCBkb3VibGUgIG1heCk7Ci0KLS8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbGVmd1N0YXJ0TWFjcm9UaW1pbmcuICAgICAgICAgICAgICAgICovCi0vKiBJdCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoZSB1bmF0ZW5lc3MgY2FuIGJlIElOVkVSVCwgTk9OSU5WRVJUIG9yIE5PTlVOQVRFLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3TWFjcm9UaW1pbmdVbmF0ZW5lc3MgKGNvbnN0IGNoYXIqICB1bmF0ZW5lc3MpOwotCi0vKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxlZndTdGFydE1hY3JvVGltaW5nIGNhbGwgKGlmIGFueSkuICAqLwotLyogVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3RW5kTWFjcm9UaW1pbmcgKCk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd0luaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGl0IGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPVVRQVVRQSU5BTlRFTk5BU0laRSB8ICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSU5PVVRQSU5BTlRFTk5BU0laRSAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3QW50ZW5uYSAoY29uc3QgY2hhciogIHR5cGUsIGRvdWJsZSAgdmFsdWUpOwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndJbml0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBpdCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4gICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndTdGFydEJlZ2luZXh0IChjb25zdCBjaGFyKiAgbmFtZSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd0JlZ2luZXh0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwsIGl0IGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0JlZ2luZXh0Q3JlYXRvciAoY29uc3QgY2hhciogIGNyZWF0b3JOYW1lKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3QmVnaW5leHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCwgaXQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBJdCBnZXRzIHRoZSBjdXJyZW50IHN5c3RlbSB0aW1lIGFuZCBkYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLUVYVEVSTiBpbnQgbGVmd0JlZ2luZXh0RGF0ZSAoKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3QmVnaW5leHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCwgaXQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3QmVnaW5leHRSZXZpc2lvbiAoaW50ICB2ZXJzMSwgaW50ICB2ZXJzMik7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd0JlZ2luZXh0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwsIGl0IGNhbiBiZSBjYWxsZWQgbWFueSB0aW1lcy4gICAgICAgICAgICAgICAgICAgICAqLwotLyogSXQgYWxsb3dzIHVzZXIgdG8gY3VzdG9taXplIHRoZWlyIG93biBzeW50YXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gaW50IGxlZndCZWdpbmV4dFN5bnRheCAoY29uc3QgY2hhciogIHRpdGxlLCBjb25zdCBjaGFyKiAgc3RyaW5nKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3SW5pdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgaXQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3RW5kQmVnaW5leHQgKCk7Ci0KLS8qIEdlbmVyYWwgcm91dGluZXMgdGhhdCBjYW4gYmUgY2FsbGVkIGFueXRpbWUgYWZ0ZXIgdGhlIEluaXQgaXMgY2FsbGVkLiAgICAgICovCi1FWFRFUk4gaW50IGxlZndDdXJyZW50TGluZU51bWJlciAoKTsKLQotLyogVGhpcyByb3V0aW5lIG11c3QgY2FsbCBsYXN0LCBpdCBlbmRzIHRoZSBMZWYgbGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEl0IG11c3QgYmUgY2FsbGVkIG9ubHkgb25jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIGludCBsZWZ3RW5kICgpOwotCi0vKiBUaGlzIHJvdXRpbmUgd2lsbCBwcmludCB0aGUgZXJyb3IgbWVzc2FnZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIHZvaWQgbGVmd1ByaW50RXJyb3IgKGludCAgc3RhdHVzKTsKLQotLyogVGhpcyByb3V0aW5lIHdpbGwgYWxsb3cgdXNlciB0byB3cml0ZSB0aGVpciBvd24gY29tZW1udC4gIEl0IHdpbGwgICAgICAgICAgKi8KLS8qIGF1dG9tYWN0aWNhbGx5IGFkZCBhICMgaW5mcm9udCBvZiB0aGUgbGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1FWFRFUk4gdm9pZCBsZWZ3QWRkQ29tbWVudCAoY29uc3QgY2hhciogIGNvbW1lbnQpOwotCi0vKiBUaGlzIHJvdXRpbmUgd2lsbCBpbmRlbnQgMyBibGFuayBzcGFjZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotRVhURVJOIHZvaWQgbGVmd0FkZEluZGVudCAoKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi9sZWZ3V3JpdGVyQ2FsbHMuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL2xlZndXcml0ZXJDYWxscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmRjMmQ0Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL2xlZndXcml0ZXJDYWxscy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQ29weXJpZ2h0IDIwMTIgLSAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZSAgICAgICAgICAgICAqLwotLyogRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAqLwotLyogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgKi8KLS8qICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAqLwotLyogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgKi8KLS8qICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgICAgICovCi0vKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgICAgICAqLwotLyogICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LCAgICAgICAgICAqLwotLyogY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgJEF1dGhvcjogZGVsbCAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkUmV2aXNpb246ICMxICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAkRGF0ZTogMjAxNy8wNi8wNiAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICRTdGF0ZTogICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0KLSNpZm5kZWYgQ0xFRldXUklURVJDQUxMU19ICi0jZGVmaW5lIENMRUZXV1JJVEVSQ0FMTFNfSAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJsZWZpVHlwZWRlZnMuaCIKLQotLyoKLSAqIFRoZSBtYWluIHdyaXRlciBmdW5jdGlvbi4KLSAqIFRoZSBmaWxlIHNob3VsZCBhbHJlYWR5IGJlIG9wZW5lZC4gIFRoaXMgcmVxdWlyZW1lbnQgYWxsb3dzCi0gKiB0aGUgd3JpdGVyIHRvIGJlIHVzZWQgd2l0aCBzdGRpbiBvciBhIHBpcGUuICBUaGUgZmlsZSBuYW1lCi0gKiBpcyBvbmx5IHVzZWQgZm9yIGVycm9yIG1lc3NhZ2VzLiAgVGhlIGluY2x1ZGVTZWFyY2hQYXRoIGlzCi0gKiBhIGNvbG9uLWRlbGltaXRlZCBsaXN0IG9mIGRpcmVjdG9yaWVzIGluIHdoaWNoIHRvIGZpbmQKLSAqIGluY2x1ZGUgZmlsZXMuCi0gKi8KLUVYVEVSTiBpbnQgbGVmd1dyaXRlIChGSUxFICogZmlsZSwgY29uc3QgY2hhciAqIGZpbGVOYW1lLCBsZWZpVXNlckRhdGEgIHVzZXJEYXRhKTsKLQotLyoKLSAqIFNldCBhbGwgb2YgdGhlIGNhbGxiYWNrcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIHNldCB0byBhIGZ1bmN0aW9uCi0gKiB0aGF0IHdpbGwgYWRkIHVwIGhvdyBtYW55IHRpbWVzIGEgZ2l2ZW4gbGVmIGRhdGEgdHlwZSB3YXMgaWdub3JlZAotICogKGllIG5vIGNhbGxiYWNrIHdhcyBkb25lKS4gIFRoZSBzdGF0aXN0aWNzIGNhbiBsYXRlciBiZSBwcmludGVkIG91dC4KLSAqLwotRVhURVJOIHZvaWQgbGVmd1NldFJlZ2lzdGVyVW51c2VkQ2FsbGJhY2tzICgpOwotRVhURVJOIHZvaWQgbGVmd1ByaW50VW51c2VkQ2FsbGJhY2tzIChGSUxFKiAgZik7Ci0KLS8qCi0gKiBTZXQvZ2V0IHRoZSBjbGllbnQtcHJvdmlkZWQgdXNlciBkYXRhLiAgbGVmaSBkb2Vzbid0IGxvb2sgYXQKLSAqIHRoaXMgZGF0YSBhdCBhbGwsIGl0IHNpbXBseSBwYXNzZXMgdGhlIG9wYXF1ZSBsZWZpVXNlckRhdGEgcG9pbnRlcgotICogYmFjayB0byB0aGUgYXBwbGljYXRpb24gd2l0aCBlYWNoIGNhbGxiYWNrLiAgVGhlIGNsaWVudCBjYW4KLSAqIGNoYW5nZSB0aGUgZGF0YSBhdCBhbnkgdGltZSwgYW5kIGl0IHdpbGwgdGFrZSBlZmZlY3Qgb24gdGhlCi0gKiBuZXh0IGNhbGxiYWNrLiAgVGhlIGxlZmkgd3JpdGVyIGFuZCB3cml0ZXIgbWFpbnRhaW4gc2VwYXJhdGUKLSAqIHVzZXIgZGF0YSBwb2ludGVycy4KLSAqLwotRVhURVJOIHZvaWQgbGVmd1NldFVzZXJEYXRhIChsZWZpVXNlckRhdGEgIHAwKTsKLUVYVEVSTiBsZWZpVXNlckRhdGEgbGVmd0dldFVzZXJEYXRhICgpOwotCi0vKgotICogQW4gZW51bSBkZXNjcmliaW5nIGFsbCBvZiB0aGUgdHlwZXMgb2Ygd3JpdGVyIGNhbGxiYWNrcy4KLSAqLwotdHlwZWRlZiBlbnVtIHsKLSAgbGVmd1Vuc3BlY2lmaWVkQ2JrVHlwZSA9IDAsCi0gIGxlZndWZXJzaW9uQ2JrVHlwZSA9IDEsCi0gIGxlZndDYXNlU2Vuc2l0aXZlQ2JrVHlwZSA9IDIsCi0gIGxlZndOb1dpcmVFeHRlbnNpb25DYmtUeXBlID0gMywKLSAgbGVmd0J1c0JpdENoYXJzQ2JrVHlwZSA9IDQsCi0gIGxlZndEaXZpZGVyQ2hhckNia1R5cGUgPSA1LAotICBsZWZ3TWFudWZhY3R1cmluZ0dyaWRDYmtUeXBlID0gNiwKLSAgbGVmd1VzZU1pblNwYWNpbmdDYmtUeXBlID0gNywKLSAgbGVmd0NsZWFyYW5jZU1lYXN1cmVDYmtUeXBlID0gOCwKLSAgbGVmd1VuaXRzQ2JrVHlwZSA9IDksCi0gIGxlZndBbnRlbm5hSW5wdXRHYXRlQXJlYUNia1R5cGUgPSAxMCwKLSAgbGVmd0FudGVubmFJbk91dERpZmZBcmVhQ2JrVHlwZSA9IDExLAotICBsZWZ3QW50ZW5uYU91dHB1dERpZmZBcmVhQ2JrVHlwZSA9IDEyLAotICBsZWZ3UHJvcERlZkNia1R5cGUgPSAxMywKLSAgbGVmd0xheWVyQ2JrVHlwZSA9IDE0LAotICBsZWZ3VmlhQ2JrVHlwZSA9IDE1LAotICBsZWZ3VmlhUnVsZUNia1R5cGUgPSAxNiwKLSAgbGVmd05vbkRlZmF1bHRDYmtUeXBlID0gMTcsCi0gIGxlZndDcm9zc1RhbGtDYmtUeXBlID0gMTgsCi0gIGxlZndOb2lzZVRhYmxlQ2JrVHlwZSA9IDE5LAotICBsZWZ3Q29ycmVjdGlvblRhYmxlQ2JrVHlwZSA9IDIwLAotICBsZWZ3U3BhY2luZ0Nia1R5cGUgPSAyMSwKLSAgbGVmd01pbkZlYXR1cmVDYmtUeXBlID0gMjIsCi0gIGxlZndEaWVsZWN0cmljQ2JrVHlwZSA9IDIzLAotICBsZWZ3SVJEcm9wQ2JrVHlwZSA9IDI0LAotICBsZWZ3U2l0ZUNia1R5cGUgPSAyNSwKLSAgbGVmd0FycmF5Q2JrVHlwZSA9IDI2LAotICBsZWZ3TWFjcm9DYmtUeXBlID0gMjcsCi0gIGxlZndBbnRlbm5hQ2JrVHlwZSA9IDI4LAotICBsZWZ3RXh0Q2JrVHlwZSA9IDI5LAotICBsZWZ3RW5kTGliQ2JrVHlwZSA9IDMwCi0KLSAgLyogTkVXIENBTExCQUNLUyAtIGVhY2ggY2FsbGJhY2sgaGFzIGl0cyBvd24gdHlwZS4gIEZvciBlYWNoIGNhbGxiYWNrCi0gICAqIHRoYXQgeW91IGFkZCwgeW91IG11c3QgYWRkIGFuIGl0ZW0gdG8gdGhpcyBlbnVtLiAqLwotCi19IGxlZndDYWxsYmFja1R5cGVfZTsKLQotLyogRGVjbGFyYXRpb25zIG9mIGZ1bmN0aW9uIHNpZ25hdHVyZXMgZm9yIGVhY2ggdHlwZSBvZiBjYWxsYmFjay4KLSAqIFRoZXNlIGRlY2xhcmF0aW9ucyBhcmUgdHlwZS1zYWZlIHdoZW4gY29tcGlsaW5nIHdpdGggQU5TSSBDCi0gKiBvciBDKys7IHlvdSB3aWxsIG9ubHkgYmUgYWJsZSB0byByZWdpc3RlciBhIGZ1bmN0aW9uIHBvaW50ZXIKLSAqIHdpdGggdGhlIGNvcnJlY3Qgc2lnbmF0dXJlIGZvciBhIGdpdmVuIHR5cGUgb2YgY2FsbGJhY2suCi0gKgotICogRWFjaCBjYWxsYmFjayBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byByZXR1cm4gMCBpZiBzdWNjZXNzZnVsLgotICogQSBub24temVybyByZXR1cm4gY29kZSB3aWxsIGNhdXNlIHRoZSB3cml0ZXIgdG8gYWJvcnQuCi0gKgotICogVGhlIGxlZndEZXNpZ25TdGFydCBhbmQgbGVmd0Rlc2lnbkVuZCBjYWxsYmFjayBpcyBvbmx5IGNhbGxlZCBvbmNlLgotICogT3RoZXIgY2FsbGJhY2tzIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMsIGVhY2ggdGltZSB3aXRoIGEgZGlmZmVyZW50Ci0gKiBzZXQgb2YgZGF0YS4KLSAqCi0gKiBGb3IgZWFjaCBjYWxsYmFjaywgdGhlIExlZiBBUEkgd2lsbCBtYWtlIHRoZSBjYWxsYmFjayB0byB0aGUKLSAqIGZ1bmN0aW9uIHN1cHBsaWVkIGJ5IHRoZSBjbGllbnQsIHdoaWNoIHNob3VsZCBlaXRoZXIgbWFrZSBhIGNvcHkKLSAqIG9mIHRoZSBMZWYgb2JqZWN0LCBvciBzdG9yZSB0aGUgZGF0YSBpbiB0aGUgY2xpZW50J3Mgb3duIGRhdGEgc3RydWN0dXJlcy4KLSAqIFRoZSBMZWYgQVBJIHdpbGwgZGVsZXRlIG9yIHJldXNlIGVhY2ggb2JqZWN0IGFmdGVyIG1ha2luZyB0aGUgY2FsbGJhY2ssCi0gKiBzbyB0aGUgY2xpZW50IHNob3VsZCBub3Qga2VlcCBhIHBvaW50ZXIgdG8gaXQuCi0gKgotICogQWxsIGNhbGxiYWNrcyBwYXNzIHRoZSB1c2VyIGRhdGEgcG9pbnRlciBwcm92aWRlZCBpbiBsZWZ3UmVhZCgpCi0gKiBvciBsZWZ3U2V0VXNlckRhdGEoKSBiYWNrIHRvIHRoZSBjbGllbnQ7IHRoaXMgY2FuIGJlIHVzZWQgYnkgdGhlCi0gKiBjbGllbnQgdG8gb2J0YWluIGFjY2VzcyB0byB0aGUgcmVzdCBvZiB0aGUgY2xpZW50J3MgZGF0YSBzdHJ1Y3R1cmVzLgotICoKLSAqIFRoZSB1c2VyIGRhdGEgcG9pbnRlciBpcyBvYnRhaW5lZCB1c2luZyBsZWZ3R2V0VXNlckRhdGEoKSBpbW1lZGlhdGVseQotICogcHJpb3IgdG8gbWFraW5nIGVhY2ggY2FsbGJhY2ssIHNvIHRoZSBjbGllbnQgaXMgZnJlZSB0byBjaGFuZ2UgdGhlCi0gKiB1c2VyIGRhdGEgb24gdGhlIGZseSBpZiBuZWNlc3NhcnkuCi0gKgotICogQ2FsbGJhY2tzIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGFyZSBwYXNzZWQgYSBjYWxsYmFjayB0eXBlCi0gKiBwYXJhbWV0ZXIsIHdoaWNoIGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byB3cml0ZSBhIHNpbmdsZSBjYWxsYmFjawotICogZnVuY3Rpb24sIHJlZ2lzdGVyIHRoYXQgZnVuY3Rpb24gZm9yIG11bHRpcGxlIGNhbGxiYWNrcywgdGhlbgotICogc3dpdGNoIGJhc2VkIG9uIHRoZSBjYWxsYmFjayB0eXBlIHRvIGhhbmRsZSB0aGUgYXBwcm9wcmlhdGUgdHlwZSBvZgotICogZGF0YS4KLSAqLwotCi0vKiBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBub3RoaW5nLiAgICAgICAqLwotdHlwZWRlZiBpbnQgKCpsZWZ3Vm9pZENia0ZuVHlwZSkgKCBsZWZ3Q2FsbGJhY2tUeXBlX2UsIGxlZmlVc2VyRGF0YSApOwotCi0gLyogTkVXIENBTExCQUNLIC0gSWYgeW91ciBjYWxsYmFjayByZXR1cm5zIGEgcG9pbnRlciB0byBhIG5ldyBjbGFzcyB0aGVuCi0gICogeW91IG11c3QgYWRkIGEgdHlwZSBmdW5jdGlvbiBoZXJlLiAqLwotCi0vKiBGdW5jdGlvbnMgdG8gY2FsbCB0byByZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uLgotICovCi1FWFRFUk4gdm9pZCBsZWZ3U2V0VmVyc2lvbkNiayAobGVmd1ZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmd1NldENhc2VTZW5zaXRpdmVDYmsgKGxlZndWb2lkQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZndTZXROb1dpcmVFeHRlbnNpb25DYmsgKGxlZndWb2lkQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZndTZXRCdXNCaXRDaGFyc0NiayAobGVmd1ZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmd1NldERpdmlkZXJDaGFyQ2JrIChsZWZ3Vm9pZENia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBsZWZ3U2V0TWFudWZhY3R1cmluZ0dyaWRDYmsgKGxlZndWb2lkQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZndTZXRVc2VNaW5TcGFjaW5nQ2JrIChsZWZ3Vm9pZENia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBsZWZ3U2V0Q2xlYXJhbmNlTWVhc3VyZUNiayAobGVmd1ZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmd1NldFVuaXRzQ2JrIChsZWZ3Vm9pZENia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBsZWZ3QW50ZW5uYUlucHV0R2F0ZUFyZWFDYmsgKGxlZndWb2lkQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZndBbnRlbm5hSW5PdXREaWZmQXJlYUNiayAobGVmd1ZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmd0FudGVubmFPdXRwdXREaWZmQXJlYUNiayAobGVmd1ZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmd1NldFByb3BEZWZDYmsgKGxlZndWb2lkQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZndTZXRMYXllckNiayAobGVmd1ZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmd1NldFZpYUNiayAobGVmd1ZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmd1NldFZpYVJ1bGVDYmsgKGxlZndWb2lkQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZndTZXROb25EZWZhdWx0Q2JrIChsZWZ3Vm9pZENia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBsZWZ3U2V0Q3Jvc3NUYWxrQ2JrIChsZWZ3Vm9pZENia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBsZWZ3U2V0Tm9pc2VUYWJsZUNiayAobGVmd1ZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmd1NldENvcnJlY3Rpb25UYWJsZUNiayAobGVmd1ZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmd1NldFNwYWNpbmdDYmsgKGxlZndWb2lkQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZndTZXRNaW5GZWF0dXJlQ2JrIChsZWZ3Vm9pZENia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBsZWZ3U2V0RGllbGVjdHJpY0NiayAobGVmd1ZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmd1NldElSRHJvcENiayAobGVmd1ZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmd1NldFNpdGVDYmsgKGxlZndWb2lkQ2JrRm5UeXBlIHAwKTsKLUVYVEVSTiB2b2lkIGxlZndTZXRBcnJheUNiayAobGVmd1ZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmd1NldE1hY3JvQ2JrIChsZWZ3Vm9pZENia0ZuVHlwZSBwMCk7Ci1FWFRFUk4gdm9pZCBsZWZ3U2V0QW50ZW5uYUNiayAobGVmd1ZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmd1NldEV4dENiayAobGVmd1ZvaWRDYmtGblR5cGUgcDApOwotRVhURVJOIHZvaWQgbGVmd1NldEVuZExpYkNiayAobGVmd1ZvaWRDYmtGblR5cGUgcDApOwotCi0vKiBORVcgQ0FMTEJBQ0sgLSBlYWNoIGNhbGxiYWNrIG11c3QgaGF2ZSBhIGZ1bmN0aW9uIHRvIGFsbG93IHRoZSB1c2VyCi0gKiB0byBzZXQgaXQuICBBZGQgdGhlIGZ1bmN0aW9uIGhlcmUuICovCi0KLS8qCi0gKiBTZXQgYWxsIG9mIHRoZSBjYWxsYmFja3MgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBzZXQgdG8gdGhlIGZvbGxvd2luZwotICogZnVuY3Rpb24uICBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGNoZWNrIHRvIHNlZQotICogaWYgeW91IGZvcmdvdCBhbnl0aGluZy4KLSAqLwotRVhURVJOIHZvaWQgbGVmd1NldFVudXNlZENhbGxiYWNrcyAobGVmd1ZvaWRDYmtGblR5cGUgIGZ1bmMpOwotCi0vKiBSb3V0aW5lIHRvIHNldCB0aGUgbWVzc2FnZSBsb2dnaW5nIHJvdXRpbmUgZm9yIGVycm9ycyAgICAgICAgICAgICAgICAgICAgICAqLwotdHlwZWRlZiB2b2lkICgqTEVGSV9MT0dfRlVOQ1RJT04pKGNvbnN0IGNoYXIqKTsKLUVYVEVSTiB2b2lkIGxlZndTZXRMb2dGdW5jdGlvbiAoTEVGSV9MT0dfRlVOQ1RJT04gIHAwKTsKLQotLyogUm91dGluZSB0byBzZXQgdGhlIG1lc3NhZ2UgbG9nZ2luZyByb3V0aW5lIGZvciB3YXJuaW5ncyAgICAgICAgICAgICAgICAgICAgKi8KLXR5cGVkZWYgdm9pZCAoKkxFRklfV0FSTklOR19MT0dfRlVOQ1RJT04pKGNvbnN0IGNoYXIqKTsKLUVYVEVSTiB2b2lkIGxlZndTZXRXYXJuaW5nTG9nRnVuY3Rpb24gKExFRklfV0FSTklOR19MT0dfRlVOQ1RJT04gIHAwKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi94bGVmaUFycmF5LmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL3hsZWZpQXJyYXkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjAxMmVhLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL3hsZWZpQXJyYXkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkICAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jZGVmaW5lIEVYVEVSTiBleHRlcm4gIkMiCi0KLSNpbmNsdWRlICJsZWZpQXJyYXkuaCIKLSNpbmNsdWRlICJsZWZpQXJyYXkuaHBwIgotCi0vLyBXcmFwcGVycyBkZWZpbml0aW9ucy4KLWludCBsZWZpQXJyYXlGbG9vclBsYW5fbnVtUGF0dGVybnMgKGNvbnN0IDo6bGVmaUFycmF5Rmxvb3JQbGFuKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlBcnJheUZsb29yUGxhbiopb2JqKS0+bnVtUGF0dGVybnMoKTsKLX0KLQotY29uc3QgOjpsZWZpU2l0ZVBhdHRlcm4qIGxlZmlBcnJheUZsb29yUGxhbl9wYXR0ZXJuIChjb25zdCA6OmxlZmlBcnJheUZsb29yUGxhbiogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuIChjb25zdCA6OmxlZmlTaXRlUGF0dGVybiopICgoTGVmRGVmUGFyc2VyOjpsZWZpQXJyYXlGbG9vclBsYW4qKW9iaiktPnBhdHRlcm4oaW5kZXgpOwotfQotCi1jaGFyKiBsZWZpQXJyYXlGbG9vclBsYW5fdHlwIChjb25zdCA6OmxlZmlBcnJheUZsb29yUGxhbiogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpQXJyYXlGbG9vclBsYW4qKW9iaiktPnR5cChpbmRleCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGxlZmlBcnJheUZsb29yUGxhbl9uYW1lIChjb25zdCA6OmxlZmlBcnJheUZsb29yUGxhbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpsZWZpQXJyYXlGbG9vclBsYW4qKW9iaiktPm5hbWUoKTsKLX0KLQotaW50IGxlZmlBcnJheV9udW1TaXRlUGF0dGVybiAoY29uc3QgOjpsZWZpQXJyYXkqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUFycmF5KilvYmopLT5udW1TaXRlUGF0dGVybigpOwotfQotCi1pbnQgbGVmaUFycmF5X251bUNhblBsYWNlIChjb25zdCA6OmxlZmlBcnJheSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpQXJyYXkqKW9iaiktPm51bUNhblBsYWNlKCk7Ci19Ci0KLWludCBsZWZpQXJyYXlfbnVtQ2Fubm90T2NjdXB5IChjb25zdCA6OmxlZmlBcnJheSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpQXJyYXkqKW9iaiktPm51bUNhbm5vdE9jY3VweSgpOwotfQotCi1pbnQgbGVmaUFycmF5X251bVRyYWNrIChjb25zdCA6OmxlZmlBcnJheSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpQXJyYXkqKW9iaiktPm51bVRyYWNrKCk7Ci19Ci0KLWludCBsZWZpQXJyYXlfbnVtR2NlbGwgKGNvbnN0IDo6bGVmaUFycmF5KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlBcnJheSopb2JqKS0+bnVtR2NlbGwoKTsKLX0KLQotaW50IGxlZmlBcnJheV9oYXNEZWZhdWx0Q2FwIChjb25zdCA6OmxlZmlBcnJheSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpQXJyYXkqKW9iaiktPmhhc0RlZmF1bHRDYXAoKTsKLX0KLQotY29uc3QgY2hhciogbGVmaUFycmF5X25hbWUgKGNvbnN0IDo6bGVmaUFycmF5KiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlBcnJheSopb2JqKS0+bmFtZSgpOwotfQotCi1jb25zdCA6OmxlZmlTaXRlUGF0dGVybiogbGVmaUFycmF5X3NpdGVQYXR0ZXJuIChjb25zdCA6OmxlZmlBcnJheSogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuIChjb25zdCA6OmxlZmlTaXRlUGF0dGVybiopICgoTGVmRGVmUGFyc2VyOjpsZWZpQXJyYXkqKW9iaiktPnNpdGVQYXR0ZXJuKGluZGV4KTsKLX0KLQotY29uc3QgOjpsZWZpU2l0ZVBhdHRlcm4qIGxlZmlBcnJheV9jYW5QbGFjZSAoY29uc3QgOjpsZWZpQXJyYXkqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoY29uc3QgOjpsZWZpU2l0ZVBhdHRlcm4qKSAoKExlZkRlZlBhcnNlcjo6bGVmaUFycmF5KilvYmopLT5jYW5QbGFjZShpbmRleCk7Ci19Ci0KLWNvbnN0IDo6bGVmaVNpdGVQYXR0ZXJuKiBsZWZpQXJyYXlfY2Fubm90T2NjdXB5IChjb25zdCA6OmxlZmlBcnJheSogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuIChjb25zdCA6OmxlZmlTaXRlUGF0dGVybiopICgoTGVmRGVmUGFyc2VyOjpsZWZpQXJyYXkqKW9iaiktPmNhbm5vdE9jY3VweShpbmRleCk7Ci19Ci0KLWNvbnN0IDo6bGVmaVRyYWNrUGF0dGVybiogbGVmaUFycmF5X3RyYWNrIChjb25zdCA6OmxlZmlBcnJheSogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuIChjb25zdCA6OmxlZmlUcmFja1BhdHRlcm4qKSAoKExlZkRlZlBhcnNlcjo6bGVmaUFycmF5KilvYmopLT50cmFjayhpbmRleCk7Ci19Ci0KLWNvbnN0IDo6bGVmaUdjZWxsUGF0dGVybiogbGVmaUFycmF5X2djZWxsIChjb25zdCA6OmxlZmlBcnJheSogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuIChjb25zdCA6OmxlZmlHY2VsbFBhdHRlcm4qKSAoKExlZkRlZlBhcnNlcjo6bGVmaUFycmF5KilvYmopLT5nY2VsbChpbmRleCk7Ci19Ci0KLWludCBsZWZpQXJyYXlfdGFibGVTaXplIChjb25zdCA6OmxlZmlBcnJheSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpQXJyYXkqKW9iaiktPnRhYmxlU2l6ZSgpOwotfQotCi1pbnQgbGVmaUFycmF5X251bURlZmF1bHRDYXBzIChjb25zdCA6OmxlZmlBcnJheSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpQXJyYXkqKW9iaiktPm51bURlZmF1bHRDYXBzKCk7Ci19Ci0KLWludCBsZWZpQXJyYXlfZGVmYXVsdENhcE1pblBpbnMgKGNvbnN0IDo6bGVmaUFycmF5KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlBcnJheSopb2JqKS0+ZGVmYXVsdENhcE1pblBpbnMoaW5kZXgpOwotfQotCi1kb3VibGUgbGVmaUFycmF5X2RlZmF1bHRDYXAgKGNvbnN0IDo6bGVmaUFycmF5KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlBcnJheSopb2JqKS0+ZGVmYXVsdENhcChpbmRleCk7Ci19Ci0KLWludCBsZWZpQXJyYXlfbnVtRmxvb3JQbGFucyAoY29uc3QgOjpsZWZpQXJyYXkqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUFycmF5KilvYmopLT5udW1GbG9vclBsYW5zKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGxlZmlBcnJheV9mbG9vclBsYW5OYW1lIChjb25zdCA6OmxlZmlBcnJheSogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpsZWZpQXJyYXkqKW9iaiktPmZsb29yUGxhbk5hbWUoaW5kZXgpOwotfQotCi1pbnQgbGVmaUFycmF5X251bVNpdGVzIChjb25zdCA6OmxlZmlBcnJheSogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpQXJyYXkqKW9iaiktPm51bVNpdGVzKGluZGV4KTsKLX0KLQotY29uc3QgY2hhciogbGVmaUFycmF5X3NpdGVUeXBlIChjb25zdCA6OmxlZmlBcnJheSogb2JqLCBpbnQgIGZsb29ySW5kZXgsIGludCAgc2l0ZUluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpsZWZpQXJyYXkqKW9iaiktPnNpdGVUeXBlKGZsb29ySW5kZXgsIHNpdGVJbmRleCk7Ci19Ci0KLWNvbnN0IDo6bGVmaVNpdGVQYXR0ZXJuKiBsZWZpQXJyYXlfc2l0ZSAoY29uc3QgOjpsZWZpQXJyYXkqIG9iaiwgaW50ICBmbG9vckluZGV4LCBpbnQgIHNpdGVJbmRleCkgewotICAgIHJldHVybiAoY29uc3QgOjpsZWZpU2l0ZVBhdHRlcm4qKSAoKExlZkRlZlBhcnNlcjo6bGVmaUFycmF5KilvYmopLT5zaXRlKGZsb29ySW5kZXgsIHNpdGVJbmRleCk7Ci19Ci0KLXZvaWQgbGVmaUFycmF5X3ByaW50IChjb25zdCA6OmxlZmlBcnJheSogb2JqLCBGSUxFKiAgZikgewotICAgICgoTGVmRGVmUGFyc2VyOjpsZWZpQXJyYXkqKW9iaiktPnByaW50KGYpOwotfQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi94bGVmaUNyb3NzVGFsay5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi94bGVmaUNyb3NzVGFsay5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZjNiYmUuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYveGxlZmlDcm9zc1RhbGsuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBBVFRFTlRJT046IFRISVMgSVMgQU4gQVVUTy1HRU5FUkFURUQgRklMRS4gRE8gTk9UIENIQU5HRSBJVCEKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTIsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQgIAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNkZWZpbmUgRVhURVJOIGV4dGVybiAiQyIKLQotI2luY2x1ZGUgImxlZmlDcm9zc1RhbGsuaCIKLSNpbmNsdWRlICJsZWZpQ3Jvc3NUYWxrLmhwcCIKLQotLy8gV3JhcHBlcnMgZGVmaW5pdGlvbnMuCi1kb3VibGUgbGVmaU5vaXNlVmljdGltX2xlbmd0aCAoY29uc3QgOjpsZWZpTm9pc2VWaWN0aW0qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaU5vaXNlVmljdGltKilvYmopLT5sZW5ndGgoKTsKLX0KLQotaW50IGxlZmlOb2lzZVZpY3RpbV9udW1Ob2lzZXMgKGNvbnN0IDo6bGVmaU5vaXNlVmljdGltKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlOb2lzZVZpY3RpbSopb2JqKS0+bnVtTm9pc2VzKCk7Ci19Ci0KLWRvdWJsZSBsZWZpTm9pc2VWaWN0aW1fbm9pc2UgKGNvbnN0IDo6bGVmaU5vaXNlVmljdGltKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlOb2lzZVZpY3RpbSopb2JqKS0+bm9pc2UoaW5kZXgpOwotfQotCi1pbnQgbGVmaU5vaXNlUmVzaXN0YW5jZV9udW1OdW1zIChjb25zdCA6OmxlZmlOb2lzZVJlc2lzdGFuY2UqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaU5vaXNlUmVzaXN0YW5jZSopb2JqKS0+bnVtTnVtcygpOwotfQotCi1kb3VibGUgbGVmaU5vaXNlUmVzaXN0YW5jZV9udW0gKGNvbnN0IDo6bGVmaU5vaXNlUmVzaXN0YW5jZSogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTm9pc2VSZXNpc3RhbmNlKilvYmopLT5udW0oaW5kZXgpOwotfQotCi1pbnQgbGVmaU5vaXNlUmVzaXN0YW5jZV9udW1WaWN0aW1zIChjb25zdCA6OmxlZmlOb2lzZVJlc2lzdGFuY2UqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaU5vaXNlUmVzaXN0YW5jZSopb2JqKS0+bnVtVmljdGltcygpOwotfQotCi1jb25zdCA6OmxlZmlOb2lzZVZpY3RpbSogbGVmaU5vaXNlUmVzaXN0YW5jZV92aWN0aW0gKGNvbnN0IDo6bGVmaU5vaXNlUmVzaXN0YW5jZSogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuIChjb25zdCA6OmxlZmlOb2lzZVZpY3RpbSopICgoTGVmRGVmUGFyc2VyOjpsZWZpTm9pc2VSZXNpc3RhbmNlKilvYmopLT52aWN0aW0oaW5kZXgpOwotfQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi94bGVmaURlYnVnLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL3hsZWZpRGVidWcuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGIzZDgyLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL3hsZWZpRGVidWcuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBBVFRFTlRJT046IFRISVMgSVMgQU4gQVVUTy1HRU5FUkFURUQgRklMRS4gRE8gTk9UIENIQU5HRSBJVCEKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTIsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQgIAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNkZWZpbmUgRVhURVJOIGV4dGVybiAiQyIKLQotI2luY2x1ZGUgImxlZmlEZWJ1Zy5oIgotI2luY2x1ZGUgImxlZmlEZWJ1Zy5ocHAiCi0KLS8vIFdyYXBwZXJzIGRlZmluaXRpb25zLgotdm9pZCBsZWZpU2V0RGVidWcgKGludCAgbnVtLCBpbnQgIHZhbHVlKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZpU2V0RGVidWcobnVtLCB2YWx1ZSk7Ci19Ci0KLWludCBsZWZpRGVidWcgKGludCAgbnVtKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmaURlYnVnKG51bSk7Ci19Ci0KLXZvaWQgbGVmaUVycm9yIChpbnQgIGNoZWNrLCBpbnQgIG1zZ051bSwgY29uc3QgY2hhciogIG1zZykgewotICAgIExlZkRlZlBhcnNlcjo6bGVmaUVycm9yKGNoZWNrLCBtc2dOdW0sIG1zZyk7Ci19Ci0KLWNvbnN0IGNoYXIqIENBU0UgKGNvbnN0IGNoYXIgKiB4KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6Q0FTRSh4KTsKLX0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYveGxlZmlFbmNyeXB0SW50LmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL3hsZWZpRW5jcnlwdEludC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZmY5ZDAuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYveGxlZmlFbmNyeXB0SW50LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkICAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jZGVmaW5lIEVYVEVSTiBleHRlcm4gIkMiCi0KLSNpbmNsdWRlICJsZWZpRW5jcnlwdEludC5oIgotI2luY2x1ZGUgImxlZmlFbmNyeXB0SW50LmhwcCIKLQotLy8gV3JhcHBlcnMgZGVmaW5pdGlvbnMuCi12b2lkIGxlZnJFbmFibGVSZWFkRW5jcnlwdGVkICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJFbmFibGVSZWFkRW5jcnlwdGVkKCk7Ci19Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL3hsZWZpTGF5ZXIuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYveGxlZmlMYXllci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZTdlZWEuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYveGxlZmlMYXllci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjE1ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6IHh4eCAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2RlZmluZSBFWFRFUk4gZXh0ZXJuICJDIgotCi0jaW5jbHVkZSAibGVmaUxheWVyLmgiCi0jaW5jbHVkZSAibGVmaUxheWVyLmhwcCIKLQotLy8gV3JhcHBlcnMgZGVmaW5pdGlvbnMuCi1pbnQgbGVmaUFudGVubmFQV0xfbnVtUFdMIChjb25zdCA6OmxlZmlBbnRlbm5hUFdMKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlBbnRlbm5hUFdMKilvYmopLT5udW1QV0woKTsKLX0KLQotY2hhciogbGVmaUxheWVyRGVuc2l0eV90eXBlIChjb25zdCA6OmxlZmlMYXllckRlbnNpdHkqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyRGVuc2l0eSopb2JqKS0+dHlwZSgpOwotfQotCi1pbnQgbGVmaUxheWVyRGVuc2l0eV9oYXNPbmVFbnRyeSAoY29uc3QgOjpsZWZpTGF5ZXJEZW5zaXR5KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllckRlbnNpdHkqKW9iaiktPmhhc09uZUVudHJ5KCk7Ci19Ci0KLWRvdWJsZSBsZWZpTGF5ZXJEZW5zaXR5X29uZUVudHJ5IChjb25zdCA6OmxlZmlMYXllckRlbnNpdHkqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyRGVuc2l0eSopb2JqKS0+b25lRW50cnkoKTsKLX0KLQotaW50IGxlZmlMYXllckRlbnNpdHlfbnVtRnJlcXVlbmN5IChjb25zdCA6OmxlZmlMYXllckRlbnNpdHkqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyRGVuc2l0eSopb2JqKS0+bnVtRnJlcXVlbmN5KCk7Ci19Ci0KLWRvdWJsZSBsZWZpTGF5ZXJEZW5zaXR5X2ZyZXF1ZW5jeSAoY29uc3QgOjpsZWZpTGF5ZXJEZW5zaXR5KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllckRlbnNpdHkqKW9iaiktPmZyZXF1ZW5jeShpbmRleCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJEZW5zaXR5X251bVdpZHRocyAoY29uc3QgOjpsZWZpTGF5ZXJEZW5zaXR5KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllckRlbnNpdHkqKW9iaiktPm51bVdpZHRocygpOwotfQotCi1kb3VibGUgbGVmaUxheWVyRGVuc2l0eV93aWR0aCAoY29uc3QgOjpsZWZpTGF5ZXJEZW5zaXR5KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllckRlbnNpdHkqKW9iaiktPndpZHRoKGluZGV4KTsKLX0KLQotaW50IGxlZmlMYXllckRlbnNpdHlfbnVtVGFibGVFbnRyaWVzIChjb25zdCA6OmxlZmlMYXllckRlbnNpdHkqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyRGVuc2l0eSopb2JqKS0+bnVtVGFibGVFbnRyaWVzKCk7Ci19Ci0KLWRvdWJsZSBsZWZpTGF5ZXJEZW5zaXR5X3RhYmxlRW50cnkgKGNvbnN0IDo6bGVmaUxheWVyRGVuc2l0eSogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXJEZW5zaXR5KilvYmopLT50YWJsZUVudHJ5KGluZGV4KTsKLX0KLQotaW50IGxlZmlMYXllckRlbnNpdHlfbnVtQ3V0YXJlYXMgKGNvbnN0IDo6bGVmaUxheWVyRGVuc2l0eSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXJEZW5zaXR5KilvYmopLT5udW1DdXRhcmVhcygpOwotfQotCi1kb3VibGUgbGVmaUxheWVyRGVuc2l0eV9jdXRBcmVhIChjb25zdCA6OmxlZmlMYXllckRlbnNpdHkqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyRGVuc2l0eSopb2JqKS0+Y3V0QXJlYShpbmRleCk7Ci19Ci0KLWludCBsZWZpUGFyYWxsZWxfbnVtTGVuZ3RoIChjb25zdCA6OmxlZmlQYXJhbGxlbCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpUGFyYWxsZWwqKW9iaiktPm51bUxlbmd0aCgpOwotfQotCi1pbnQgbGVmaVBhcmFsbGVsX251bVdpZHRoIChjb25zdCA6OmxlZmlQYXJhbGxlbCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpUGFyYWxsZWwqKW9iaiktPm51bVdpZHRoKCk7Ci19Ci0KLWRvdWJsZSBsZWZpUGFyYWxsZWxfbGVuZ3RoIChjb25zdCA6OmxlZmlQYXJhbGxlbCogb2JqLCBpbnQgIGlMZW5ndGgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQYXJhbGxlbCopb2JqKS0+bGVuZ3RoKGlMZW5ndGgpOwotfQotCi1kb3VibGUgbGVmaVBhcmFsbGVsX3dpZHRoIChjb25zdCA6OmxlZmlQYXJhbGxlbCogb2JqLCBpbnQgIGlXaWR0aCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBhcmFsbGVsKilvYmopLT53aWR0aChpV2lkdGgpOwotfQotCi1kb3VibGUgbGVmaVBhcmFsbGVsX3dpZHRoU3BhY2luZyAoY29uc3QgOjpsZWZpUGFyYWxsZWwqIG9iaiwgaW50ICBpV2lkdGgsIGludCAgaVdpZHRoU3BhY2luZykgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBhcmFsbGVsKilvYmopLT53aWR0aFNwYWNpbmcoaVdpZHRoLCBpV2lkdGhTcGFjaW5nKTsKLX0KLQotaW50IGxlZmlJbmZsdWVuY2VfbnVtSW5mbHVlbmNlRW50cnkgKGNvbnN0IDo6bGVmaUluZmx1ZW5jZSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpSW5mbHVlbmNlKilvYmopLT5udW1JbmZsdWVuY2VFbnRyeSgpOwotfQotCi1kb3VibGUgbGVmaUluZmx1ZW5jZV93aWR0aCAoY29uc3QgOjpsZWZpSW5mbHVlbmNlKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlJbmZsdWVuY2UqKW9iaiktPndpZHRoKGluZGV4KTsKLX0KLQotZG91YmxlIGxlZmlJbmZsdWVuY2VfZGlzdGFuY2UgKGNvbnN0IDo6bGVmaUluZmx1ZW5jZSogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpSW5mbHVlbmNlKilvYmopLT5kaXN0YW5jZShpbmRleCk7Ci19Ci0KLWRvdWJsZSBsZWZpSW5mbHVlbmNlX3NwYWNpbmcgKGNvbnN0IDo6bGVmaUluZmx1ZW5jZSogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpSW5mbHVlbmNlKilvYmopLT5zcGFjaW5nKGluZGV4KTsKLX0KLQotaW50IGxlZmlUd29XaWR0aHNfbnVtV2lkdGggKGNvbnN0IDo6bGVmaVR3b1dpZHRocyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVHdvV2lkdGhzKilvYmopLT5udW1XaWR0aCgpOwotfQotCi1kb3VibGUgbGVmaVR3b1dpZHRoc193aWR0aCAoY29uc3QgOjpsZWZpVHdvV2lkdGhzKiBvYmosIGludCAgaVdpZHRoKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVHdvV2lkdGhzKilvYmopLT53aWR0aChpV2lkdGgpOwotfQotCi1pbnQgbGVmaVR3b1dpZHRoc19oYXNXaWR0aFBSTCAoY29uc3QgOjpsZWZpVHdvV2lkdGhzKiBvYmosIGludCAgaVdpZHRoKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVHdvV2lkdGhzKilvYmopLT5oYXNXaWR0aFBSTChpV2lkdGgpOwotfQotCi1kb3VibGUgbGVmaVR3b1dpZHRoc193aWR0aFBSTCAoY29uc3QgOjpsZWZpVHdvV2lkdGhzKiBvYmosIGludCAgaVdpZHRoKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVHdvV2lkdGhzKilvYmopLT53aWR0aFBSTChpV2lkdGgpOwotfQotCi1pbnQgbGVmaVR3b1dpZHRoc19udW1XaWR0aFNwYWNpbmcgKGNvbnN0IDo6bGVmaVR3b1dpZHRocyogb2JqLCBpbnQgIGlXaWR0aCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVR3b1dpZHRocyopb2JqKS0+bnVtV2lkdGhTcGFjaW5nKGlXaWR0aCk7Ci19Ci0KLWRvdWJsZSBsZWZpVHdvV2lkdGhzX3dpZHRoU3BhY2luZyAoY29uc3QgOjpsZWZpVHdvV2lkdGhzKiBvYmosIGludCAgaVdpZHRoLCBpbnQgIGlXaWR0aFNwYWNpbmcpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlUd29XaWR0aHMqKW9iaiktPndpZHRoU3BhY2luZyhpV2lkdGgsIGlXaWR0aFNwYWNpbmcpOwotfQotCi1pbnQgbGVmaVNwYWNpbmdUYWJsZV9pc0luZmx1ZW5jZSAoY29uc3QgOjpsZWZpU3BhY2luZ1RhYmxlKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlTcGFjaW5nVGFibGUqKW9iaiktPmlzSW5mbHVlbmNlKCk7Ci19Ci0KLWNvbnN0IDo6bGVmaUluZmx1ZW5jZSogbGVmaVNwYWNpbmdUYWJsZV9pbmZsdWVuY2UgKGNvbnN0IDo6bGVmaVNwYWNpbmdUYWJsZSogb2JqKSB7Ci0gICAgcmV0dXJuIChjb25zdCA6OmxlZmlJbmZsdWVuY2UqKSAoKExlZkRlZlBhcnNlcjo6bGVmaVNwYWNpbmdUYWJsZSopb2JqKS0+aW5mbHVlbmNlKCk7Ci19Ci0KLWludCBsZWZpU3BhY2luZ1RhYmxlX2lzUGFyYWxsZWwgKGNvbnN0IDo6bGVmaVNwYWNpbmdUYWJsZSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpU3BhY2luZ1RhYmxlKilvYmopLT5pc1BhcmFsbGVsKCk7Ci19Ci0KLWNvbnN0IDo6bGVmaVBhcmFsbGVsKiBsZWZpU3BhY2luZ1RhYmxlX3BhcmFsbGVsIChjb25zdCA6OmxlZmlTcGFjaW5nVGFibGUqIG9iaikgewotICAgIHJldHVybiAoY29uc3QgOjpsZWZpUGFyYWxsZWwqKSAoKExlZkRlZlBhcnNlcjo6bGVmaVNwYWNpbmdUYWJsZSopb2JqKS0+cGFyYWxsZWwoKTsKLX0KLQotY29uc3QgOjpsZWZpVHdvV2lkdGhzKiBsZWZpU3BhY2luZ1RhYmxlX3R3b1dpZHRocyAoY29uc3QgOjpsZWZpU3BhY2luZ1RhYmxlKiBvYmopIHsKLSAgICByZXR1cm4gKGNvbnN0IDo6bGVmaVR3b1dpZHRocyopICgoTGVmRGVmUGFyc2VyOjpsZWZpU3BhY2luZ1RhYmxlKilvYmopLT50d29XaWR0aHMoKTsKLX0KLQotaW50IGxlZmlPcnRob2dvbmFsX251bU9ydGhvZ29uYWwgKGNvbnN0IDo6bGVmaU9ydGhvZ29uYWwqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaU9ydGhvZ29uYWwqKW9iaiktPm51bU9ydGhvZ29uYWwoKTsKLX0KLQotZG91YmxlIGxlZmlPcnRob2dvbmFsX2N1dFdpdGhpbiAoY29uc3QgOjpsZWZpT3J0aG9nb25hbCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpT3J0aG9nb25hbCopb2JqKS0+Y3V0V2l0aGluKGluZGV4KTsKLX0KLQotZG91YmxlIGxlZmlPcnRob2dvbmFsX29ydGhvU3BhY2luZyAoY29uc3QgOjpsZWZpT3J0aG9nb25hbCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpT3J0aG9nb25hbCopb2JqKS0+b3J0aG9TcGFjaW5nKGluZGV4KTsKLX0KLQotaW50IGxlZmlBbnRlbm5hTW9kZWxfaGFzQW50ZW5uYUFyZWFSYXRpbyAoY29uc3QgOjpsZWZpQW50ZW5uYU1vZGVsKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlBbnRlbm5hTW9kZWwqKW9iaiktPmhhc0FudGVubmFBcmVhUmF0aW8oKTsKLX0KLQotaW50IGxlZmlBbnRlbm5hTW9kZWxfaGFzQW50ZW5uYURpZmZBcmVhUmF0aW8gKGNvbnN0IDo6bGVmaUFudGVubmFNb2RlbCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpQW50ZW5uYU1vZGVsKilvYmopLT5oYXNBbnRlbm5hRGlmZkFyZWFSYXRpbygpOwotfQotCi1pbnQgbGVmaUFudGVubmFNb2RlbF9oYXNBbnRlbm5hRGlmZkFyZWFSYXRpb1BXTCAoY29uc3QgOjpsZWZpQW50ZW5uYU1vZGVsKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlBbnRlbm5hTW9kZWwqKW9iaiktPmhhc0FudGVubmFEaWZmQXJlYVJhdGlvUFdMKCk7Ci19Ci0KLWludCBsZWZpQW50ZW5uYU1vZGVsX2hhc0FudGVubmFDdW1BcmVhUmF0aW8gKGNvbnN0IDo6bGVmaUFudGVubmFNb2RlbCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpQW50ZW5uYU1vZGVsKilvYmopLT5oYXNBbnRlbm5hQ3VtQXJlYVJhdGlvKCk7Ci19Ci0KLWludCBsZWZpQW50ZW5uYU1vZGVsX2hhc0FudGVubmFDdW1EaWZmQXJlYVJhdGlvIChjb25zdCA6OmxlZmlBbnRlbm5hTW9kZWwqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUFudGVubmFNb2RlbCopb2JqKS0+aGFzQW50ZW5uYUN1bURpZmZBcmVhUmF0aW8oKTsKLX0KLQotaW50IGxlZmlBbnRlbm5hTW9kZWxfaGFzQW50ZW5uYUN1bURpZmZBcmVhUmF0aW9QV0wgKGNvbnN0IDo6bGVmaUFudGVubmFNb2RlbCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpQW50ZW5uYU1vZGVsKilvYmopLT5oYXNBbnRlbm5hQ3VtRGlmZkFyZWFSYXRpb1BXTCgpOwotfQotCi1pbnQgbGVmaUFudGVubmFNb2RlbF9oYXNBbnRlbm5hQXJlYUZhY3RvciAoY29uc3QgOjpsZWZpQW50ZW5uYU1vZGVsKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlBbnRlbm5hTW9kZWwqKW9iaiktPmhhc0FudGVubmFBcmVhRmFjdG9yKCk7Ci19Ci0KLWludCBsZWZpQW50ZW5uYU1vZGVsX2hhc0FudGVubmFBcmVhRmFjdG9yRFVPIChjb25zdCA6OmxlZmlBbnRlbm5hTW9kZWwqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUFudGVubmFNb2RlbCopb2JqKS0+aGFzQW50ZW5uYUFyZWFGYWN0b3JEVU8oKTsKLX0KLQotaW50IGxlZmlBbnRlbm5hTW9kZWxfaGFzQW50ZW5uYVNpZGVBcmVhUmF0aW8gKGNvbnN0IDo6bGVmaUFudGVubmFNb2RlbCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpQW50ZW5uYU1vZGVsKilvYmopLT5oYXNBbnRlbm5hU2lkZUFyZWFSYXRpbygpOwotfQotCi1pbnQgbGVmaUFudGVubmFNb2RlbF9oYXNBbnRlbm5hRGlmZlNpZGVBcmVhUmF0aW8gKGNvbnN0IDo6bGVmaUFudGVubmFNb2RlbCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpQW50ZW5uYU1vZGVsKilvYmopLT5oYXNBbnRlbm5hRGlmZlNpZGVBcmVhUmF0aW8oKTsKLX0KLQotaW50IGxlZmlBbnRlbm5hTW9kZWxfaGFzQW50ZW5uYURpZmZTaWRlQXJlYVJhdGlvUFdMIChjb25zdCA6OmxlZmlBbnRlbm5hTW9kZWwqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUFudGVubmFNb2RlbCopb2JqKS0+aGFzQW50ZW5uYURpZmZTaWRlQXJlYVJhdGlvUFdMKCk7Ci19Ci0KLWludCBsZWZpQW50ZW5uYU1vZGVsX2hhc0FudGVubmFDdW1TaWRlQXJlYVJhdGlvIChjb25zdCA6OmxlZmlBbnRlbm5hTW9kZWwqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUFudGVubmFNb2RlbCopb2JqKS0+aGFzQW50ZW5uYUN1bVNpZGVBcmVhUmF0aW8oKTsKLX0KLQotaW50IGxlZmlBbnRlbm5hTW9kZWxfaGFzQW50ZW5uYUN1bURpZmZTaWRlQXJlYVJhdGlvIChjb25zdCA6OmxlZmlBbnRlbm5hTW9kZWwqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUFudGVubmFNb2RlbCopb2JqKS0+aGFzQW50ZW5uYUN1bURpZmZTaWRlQXJlYVJhdGlvKCk7Ci19Ci0KLWludCBsZWZpQW50ZW5uYU1vZGVsX2hhc0FudGVubmFDdW1EaWZmU2lkZUFyZWFSYXRpb1BXTCAoY29uc3QgOjpsZWZpQW50ZW5uYU1vZGVsKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlBbnRlbm5hTW9kZWwqKW9iaiktPmhhc0FudGVubmFDdW1EaWZmU2lkZUFyZWFSYXRpb1BXTCgpOwotfQotCi1pbnQgbGVmaUFudGVubmFNb2RlbF9oYXNBbnRlbm5hU2lkZUFyZWFGYWN0b3IgKGNvbnN0IDo6bGVmaUFudGVubmFNb2RlbCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpQW50ZW5uYU1vZGVsKilvYmopLT5oYXNBbnRlbm5hU2lkZUFyZWFGYWN0b3IoKTsKLX0KLQotaW50IGxlZmlBbnRlbm5hTW9kZWxfaGFzQW50ZW5uYVNpZGVBcmVhRmFjdG9yRFVPIChjb25zdCA6OmxlZmlBbnRlbm5hTW9kZWwqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUFudGVubmFNb2RlbCopb2JqKS0+aGFzQW50ZW5uYVNpZGVBcmVhRmFjdG9yRFVPKCk7Ci19Ci0KLWludCBsZWZpQW50ZW5uYU1vZGVsX2hhc0FudGVubmFDdW1Sb3V0aW5nUGx1c0N1dCAoY29uc3QgOjpsZWZpQW50ZW5uYU1vZGVsKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlBbnRlbm5hTW9kZWwqKW9iaiktPmhhc0FudGVubmFDdW1Sb3V0aW5nUGx1c0N1dCgpOwotfQotCi1pbnQgbGVmaUFudGVubmFNb2RlbF9oYXNBbnRlbm5hR2F0ZVBsdXNEaWZmIChjb25zdCA6OmxlZmlBbnRlbm5hTW9kZWwqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUFudGVubmFNb2RlbCopb2JqKS0+aGFzQW50ZW5uYUdhdGVQbHVzRGlmZigpOwotfQotCi1pbnQgbGVmaUFudGVubmFNb2RlbF9oYXNBbnRlbm5hQXJlYU1pbnVzRGlmZiAoY29uc3QgOjpsZWZpQW50ZW5uYU1vZGVsKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlBbnRlbm5hTW9kZWwqKW9iaiktPmhhc0FudGVubmFBcmVhTWludXNEaWZmKCk7Ci19Ci0KLWludCBsZWZpQW50ZW5uYU1vZGVsX2hhc0FudGVubmFBcmVhRGlmZlJlZHVjZVBXTCAoY29uc3QgOjpsZWZpQW50ZW5uYU1vZGVsKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlBbnRlbm5hTW9kZWwqKW9iaiktPmhhc0FudGVubmFBcmVhRGlmZlJlZHVjZVBXTCgpOwotfQotCi1jaGFyKiBsZWZpQW50ZW5uYU1vZGVsX2FudGVubmFPeGlkZSAoY29uc3QgOjpsZWZpQW50ZW5uYU1vZGVsKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlBbnRlbm5hTW9kZWwqKW9iaiktPmFudGVubmFPeGlkZSgpOwotfQotCi1kb3VibGUgbGVmaUFudGVubmFNb2RlbF9hbnRlbm5hQXJlYVJhdGlvIChjb25zdCA6OmxlZmlBbnRlbm5hTW9kZWwqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUFudGVubmFNb2RlbCopb2JqKS0+YW50ZW5uYUFyZWFSYXRpbygpOwotfQotCi1kb3VibGUgbGVmaUFudGVubmFNb2RlbF9hbnRlbm5hRGlmZkFyZWFSYXRpbyAoY29uc3QgOjpsZWZpQW50ZW5uYU1vZGVsKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlBbnRlbm5hTW9kZWwqKW9iaiktPmFudGVubmFEaWZmQXJlYVJhdGlvKCk7Ci19Ci0KLWNvbnN0IDo6bGVmaUFudGVubmFQV0wqIGxlZmlBbnRlbm5hTW9kZWxfYW50ZW5uYURpZmZBcmVhUmF0aW9QV0wgKGNvbnN0IDo6bGVmaUFudGVubmFNb2RlbCogb2JqKSB7Ci0gICAgcmV0dXJuIChjb25zdCA6OmxlZmlBbnRlbm5hUFdMKikgKChMZWZEZWZQYXJzZXI6OmxlZmlBbnRlbm5hTW9kZWwqKW9iaiktPmFudGVubmFEaWZmQXJlYVJhdGlvUFdMKCk7Ci19Ci0KLWRvdWJsZSBsZWZpQW50ZW5uYU1vZGVsX2FudGVubmFDdW1BcmVhUmF0aW8gKGNvbnN0IDo6bGVmaUFudGVubmFNb2RlbCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpQW50ZW5uYU1vZGVsKilvYmopLT5hbnRlbm5hQ3VtQXJlYVJhdGlvKCk7Ci19Ci0KLWRvdWJsZSBsZWZpQW50ZW5uYU1vZGVsX2FudGVubmFDdW1EaWZmQXJlYVJhdGlvIChjb25zdCA6OmxlZmlBbnRlbm5hTW9kZWwqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUFudGVubmFNb2RlbCopb2JqKS0+YW50ZW5uYUN1bURpZmZBcmVhUmF0aW8oKTsKLX0KLQotY29uc3QgOjpsZWZpQW50ZW5uYVBXTCogbGVmaUFudGVubmFNb2RlbF9hbnRlbm5hQ3VtRGlmZkFyZWFSYXRpb1BXTCAoY29uc3QgOjpsZWZpQW50ZW5uYU1vZGVsKiBvYmopIHsKLSAgICByZXR1cm4gKGNvbnN0IDo6bGVmaUFudGVubmFQV0wqKSAoKExlZkRlZlBhcnNlcjo6bGVmaUFudGVubmFNb2RlbCopb2JqKS0+YW50ZW5uYUN1bURpZmZBcmVhUmF0aW9QV0woKTsKLX0KLQotZG91YmxlIGxlZmlBbnRlbm5hTW9kZWxfYW50ZW5uYUFyZWFGYWN0b3IgKGNvbnN0IDo6bGVmaUFudGVubmFNb2RlbCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpQW50ZW5uYU1vZGVsKilvYmopLT5hbnRlbm5hQXJlYUZhY3RvcigpOwotfQotCi1kb3VibGUgbGVmaUFudGVubmFNb2RlbF9hbnRlbm5hU2lkZUFyZWFSYXRpbyAoY29uc3QgOjpsZWZpQW50ZW5uYU1vZGVsKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlBbnRlbm5hTW9kZWwqKW9iaiktPmFudGVubmFTaWRlQXJlYVJhdGlvKCk7Ci19Ci0KLWRvdWJsZSBsZWZpQW50ZW5uYU1vZGVsX2FudGVubmFEaWZmU2lkZUFyZWFSYXRpbyAoY29uc3QgOjpsZWZpQW50ZW5uYU1vZGVsKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlBbnRlbm5hTW9kZWwqKW9iaiktPmFudGVubmFEaWZmU2lkZUFyZWFSYXRpbygpOwotfQotCi1jb25zdCA6OmxlZmlBbnRlbm5hUFdMKiBsZWZpQW50ZW5uYU1vZGVsX2FudGVubmFEaWZmU2lkZUFyZWFSYXRpb1BXTCAoY29uc3QgOjpsZWZpQW50ZW5uYU1vZGVsKiBvYmopIHsKLSAgICByZXR1cm4gKGNvbnN0IDo6bGVmaUFudGVubmFQV0wqKSAoKExlZkRlZlBhcnNlcjo6bGVmaUFudGVubmFNb2RlbCopb2JqKS0+YW50ZW5uYURpZmZTaWRlQXJlYVJhdGlvUFdMKCk7Ci19Ci0KLWRvdWJsZSBsZWZpQW50ZW5uYU1vZGVsX2FudGVubmFDdW1TaWRlQXJlYVJhdGlvIChjb25zdCA6OmxlZmlBbnRlbm5hTW9kZWwqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUFudGVubmFNb2RlbCopb2JqKS0+YW50ZW5uYUN1bVNpZGVBcmVhUmF0aW8oKTsKLX0KLQotZG91YmxlIGxlZmlBbnRlbm5hTW9kZWxfYW50ZW5uYUN1bURpZmZTaWRlQXJlYVJhdGlvIChjb25zdCA6OmxlZmlBbnRlbm5hTW9kZWwqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUFudGVubmFNb2RlbCopb2JqKS0+YW50ZW5uYUN1bURpZmZTaWRlQXJlYVJhdGlvKCk7Ci19Ci0KLWNvbnN0IDo6bGVmaUFudGVubmFQV0wqIGxlZmlBbnRlbm5hTW9kZWxfYW50ZW5uYUN1bURpZmZTaWRlQXJlYVJhdGlvUFdMIChjb25zdCA6OmxlZmlBbnRlbm5hTW9kZWwqIG9iaikgewotICAgIHJldHVybiAoY29uc3QgOjpsZWZpQW50ZW5uYVBXTCopICgoTGVmRGVmUGFyc2VyOjpsZWZpQW50ZW5uYU1vZGVsKilvYmopLT5hbnRlbm5hQ3VtRGlmZlNpZGVBcmVhUmF0aW9QV0woKTsKLX0KLQotZG91YmxlIGxlZmlBbnRlbm5hTW9kZWxfYW50ZW5uYVNpZGVBcmVhRmFjdG9yIChjb25zdCA6OmxlZmlBbnRlbm5hTW9kZWwqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUFudGVubmFNb2RlbCopb2JqKS0+YW50ZW5uYVNpZGVBcmVhRmFjdG9yKCk7Ci19Ci0KLWRvdWJsZSBsZWZpQW50ZW5uYU1vZGVsX2FudGVubmFHYXRlUGx1c0RpZmYgKGNvbnN0IDo6bGVmaUFudGVubmFNb2RlbCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpQW50ZW5uYU1vZGVsKilvYmopLT5hbnRlbm5hR2F0ZVBsdXNEaWZmKCk7Ci19Ci0KLWRvdWJsZSBsZWZpQW50ZW5uYU1vZGVsX2FudGVubmFBcmVhTWludXNEaWZmIChjb25zdCA6OmxlZmlBbnRlbm5hTW9kZWwqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUFudGVubmFNb2RlbCopb2JqKS0+YW50ZW5uYUFyZWFNaW51c0RpZmYoKTsKLX0KLQotY29uc3QgOjpsZWZpQW50ZW5uYVBXTCogbGVmaUFudGVubmFNb2RlbF9hbnRlbm5hQXJlYURpZmZSZWR1Y2VQV0wgKGNvbnN0IDo6bGVmaUFudGVubmFNb2RlbCogb2JqKSB7Ci0gICAgcmV0dXJuIChjb25zdCA6OmxlZmlBbnRlbm5hUFdMKikgKChMZWZEZWZQYXJzZXI6OmxlZmlBbnRlbm5hTW9kZWwqKW9iaiktPmFudGVubmFBcmVhRGlmZlJlZHVjZVBXTCgpOwotfQotCi1pbnQgbGVmaUxheWVyX2hhc1R5cGUgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+aGFzVHlwZSgpOwotfQotCi1pbnQgbGVmaUxheWVyX2hhc0xheWVyVHlwZSAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5oYXNMYXllclR5cGUoKTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNNYXNrIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc01hc2soKTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNQaXRjaCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5oYXNQaXRjaCgpOwotfQotCi1pbnQgbGVmaUxheWVyX2hhc1hZUGl0Y2ggKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+aGFzWFlQaXRjaCgpOwotfQotCi1pbnQgbGVmaUxheWVyX2hhc09mZnNldCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5oYXNPZmZzZXQoKTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNYWU9mZnNldCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5oYXNYWU9mZnNldCgpOwotfQotCi1pbnQgbGVmaUxheWVyX2hhc1dpZHRoIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc1dpZHRoKCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfaGFzQXJlYSAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5oYXNBcmVhKCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfaGFzRGlhZ1BpdGNoIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc0RpYWdQaXRjaCgpOwotfQotCi1pbnQgbGVmaUxheWVyX2hhc1hZRGlhZ1BpdGNoIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc1hZRGlhZ1BpdGNoKCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfaGFzRGlhZ1dpZHRoIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc0RpYWdXaWR0aCgpOwotfQotCi1pbnQgbGVmaUxheWVyX2hhc0RpYWdTcGFjaW5nIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc0RpYWdTcGFjaW5nKCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfaGFzU3BhY2luZ051bWJlciAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5oYXNTcGFjaW5nTnVtYmVyKCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfaGFzU3BhY2luZ05hbWUgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+aGFzU3BhY2luZ05hbWUoaW5kZXgpOwotfQotCi1pbnQgbGVmaUxheWVyX2hhc1NwYWNpbmdMYXllclN0YWNrIChjb25zdCA6OmxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc1NwYWNpbmdMYXllclN0YWNrKGluZGV4KTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNTcGFjaW5nQWRqYWNlbnQgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+aGFzU3BhY2luZ0FkamFjZW50KGluZGV4KTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNTcGFjaW5nQ2VudGVyVG9DZW50ZXIgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+aGFzU3BhY2luZ0NlbnRlclRvQ2VudGVyKGluZGV4KTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNTcGFjaW5nUmFuZ2UgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+aGFzU3BhY2luZ1JhbmdlKGluZGV4KTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNTcGFjaW5nUmFuZ2VVc2VMZW5ndGhUaHJlc2hvbGQgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+aGFzU3BhY2luZ1JhbmdlVXNlTGVuZ3RoVGhyZXNob2xkKGluZGV4KTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNTcGFjaW5nUmFuZ2VJbmZsdWVuY2UgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+aGFzU3BhY2luZ1JhbmdlSW5mbHVlbmNlKGluZGV4KTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNTcGFjaW5nUmFuZ2VJbmZsdWVuY2VSYW5nZSAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5oYXNTcGFjaW5nUmFuZ2VJbmZsdWVuY2VSYW5nZShpbmRleCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfaGFzU3BhY2luZ1JhbmdlUmFuZ2UgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+aGFzU3BhY2luZ1JhbmdlUmFuZ2UoaW5kZXgpOwotfQotCi1pbnQgbGVmaUxheWVyX2hhc1NwYWNpbmdMZW5ndGhUaHJlc2hvbGQgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+aGFzU3BhY2luZ0xlbmd0aFRocmVzaG9sZChpbmRleCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfaGFzU3BhY2luZ0xlbmd0aFRocmVzaG9sZFJhbmdlIChjb25zdCA6OmxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc1NwYWNpbmdMZW5ndGhUaHJlc2hvbGRSYW5nZShpbmRleCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfaGFzU3BhY2luZ1BhcmFsbGVsT3ZlcmxhcCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5oYXNTcGFjaW5nUGFyYWxsZWxPdmVybGFwKGluZGV4KTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNTcGFjaW5nQXJlYSAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5oYXNTcGFjaW5nQXJlYShpbmRleCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfaGFzU3BhY2luZ0VuZE9mTGluZSAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5oYXNTcGFjaW5nRW5kT2ZMaW5lKGluZGV4KTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNTcGFjaW5nUGFyZWxsZWxFZGdlIChjb25zdCA6OmxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc1NwYWNpbmdQYXJlbGxlbEVkZ2UoaW5kZXgpOwotfQotCi1pbnQgbGVmaUxheWVyX2hhc1NwYWNpbmdUd29FZGdlcyAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5oYXNTcGFjaW5nVHdvRWRnZXMoaW5kZXgpOwotfQotCi1pbnQgbGVmaUxheWVyX2hhc1NwYWNpbmdBZGphY2VudEV4Y2VwdCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5oYXNTcGFjaW5nQWRqYWNlbnRFeGNlcHQoaW5kZXgpOwotfQotCi1pbnQgbGVmaUxheWVyX2hhc1NwYWNpbmdTYW1lbmV0IChjb25zdCA6OmxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc1NwYWNpbmdTYW1lbmV0KGluZGV4KTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNTcGFjaW5nU2FtZW5ldFBHb25seSAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5oYXNTcGFjaW5nU2FtZW5ldFBHb25seShpbmRleCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfaGFzU3BhY2luZ05vdGNoTGVuZ3RoIChjb25zdCA6OmxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc1NwYWNpbmdOb3RjaExlbmd0aChpbmRleCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfaGFzU3BhY2luZ0VuZE9mTm90Y2hXaWR0aCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5oYXNTcGFjaW5nRW5kT2ZOb3RjaFdpZHRoKGluZGV4KTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNEaXJlY3Rpb24gKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+aGFzRGlyZWN0aW9uKCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfaGFzUmVzaXN0YW5jZSAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5oYXNSZXNpc3RhbmNlKCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfaGFzUmVzaXN0YW5jZUFycmF5IChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc1Jlc2lzdGFuY2VBcnJheSgpOwotfQotCi1pbnQgbGVmaUxheWVyX2hhc0NhcGFjaXRhbmNlIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc0NhcGFjaXRhbmNlKCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfaGFzQ2FwYWNpdGFuY2VBcnJheSAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5oYXNDYXBhY2l0YW5jZUFycmF5KCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfaGFzSGVpZ2h0IChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc0hlaWdodCgpOwotfQotCi1pbnQgbGVmaUxheWVyX2hhc1RoaWNrbmVzcyAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5oYXNUaGlja25lc3MoKTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNXaXJlRXh0ZW5zaW9uIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc1dpcmVFeHRlbnNpb24oKTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNTaHJpbmthZ2UgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+aGFzU2hyaW5rYWdlKCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfaGFzQ2FwTXVsdGlwbGllciAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5oYXNDYXBNdWx0aXBsaWVyKCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfaGFzRWRnZUNhcCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5oYXNFZGdlQ2FwKCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfaGFzQW50ZW5uYUxlbmd0aCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5oYXNBbnRlbm5hTGVuZ3RoKCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfaGFzQW50ZW5uYUFyZWEgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+aGFzQW50ZW5uYUFyZWEoKTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNDdXJyZW50RGVuc2l0eVBvaW50IChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc0N1cnJlbnREZW5zaXR5UG9pbnQoKTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNDdXJyZW50RGVuc2l0eUFycmF5IChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc0N1cnJlbnREZW5zaXR5QXJyYXkoKTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNBY2N1cnJlbnREZW5zaXR5IChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc0FjY3VycmVudERlbnNpdHkoKTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNEY2N1cnJlbnREZW5zaXR5IChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc0RjY3VycmVudERlbnNpdHkoKTsKLX0KLQotaW50IGxlZmlMYXllcl9udW1Qcm9wcyAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5udW1Qcm9wcygpOwotfQotCi1jb25zdCBjaGFyKiBsZWZpTGF5ZXJfcHJvcE5hbWUgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+cHJvcE5hbWUoaW5kZXgpOwotfQotCi1jb25zdCBjaGFyKiBsZWZpTGF5ZXJfcHJvcFZhbHVlIChjb25zdCA6OmxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPnByb3BWYWx1ZShpbmRleCk7Ci19Ci0KLWRvdWJsZSBsZWZpTGF5ZXJfcHJvcE51bWJlciAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5wcm9wTnVtYmVyKGluZGV4KTsKLX0KLQotY29uc3QgY2hhciBsZWZpTGF5ZXJfcHJvcFR5cGUgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+cHJvcFR5cGUoaW5kZXgpOwotfQotCi1pbnQgbGVmaUxheWVyX3Byb3BJc051bWJlciAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5wcm9wSXNOdW1iZXIoaW5kZXgpOwotfQotCi1pbnQgbGVmaUxheWVyX3Byb3BJc1N0cmluZyAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5wcm9wSXNTdHJpbmcoaW5kZXgpOwotfQotCi1pbnQgbGVmaUxheWVyX251bVNwYWNpbmcgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+bnVtU3BhY2luZygpOwotfQotCi1jaGFyKiBsZWZpTGF5ZXJfbmFtZSAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5uYW1lKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGxlZmlMYXllcl90eXBlIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPnR5cGUoKTsKLX0KLQotY29uc3QgY2hhciogbGVmaUxheWVyX2xheWVyVHlwZSAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5sYXllclR5cGUoKTsKLX0KLQotZG91YmxlIGxlZmlMYXllcl9waXRjaCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5waXRjaCgpOwotfQotCi1pbnQgbGVmaUxheWVyX21hc2sgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+bWFzaygpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX3BpdGNoWCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5waXRjaFgoKTsKLX0KLQotZG91YmxlIGxlZmlMYXllcl9waXRjaFkgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+cGl0Y2hZKCk7Ci19Ci0KLWRvdWJsZSBsZWZpTGF5ZXJfb2Zmc2V0IChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPm9mZnNldCgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX29mZnNldFggKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+b2Zmc2V0WCgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX29mZnNldFkgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+b2Zmc2V0WSgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX3dpZHRoIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPndpZHRoKCk7Ci19Ci0KLWRvdWJsZSBsZWZpTGF5ZXJfYXJlYSAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5hcmVhKCk7Ci19Ci0KLWRvdWJsZSBsZWZpTGF5ZXJfZGlhZ1BpdGNoIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmRpYWdQaXRjaCgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX2RpYWdQaXRjaFggKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+ZGlhZ1BpdGNoWCgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX2RpYWdQaXRjaFkgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+ZGlhZ1BpdGNoWSgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX2RpYWdXaWR0aCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5kaWFnV2lkdGgoKTsKLX0KLQotZG91YmxlIGxlZmlMYXllcl9kaWFnU3BhY2luZyAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5kaWFnU3BhY2luZygpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX3NwYWNpbmcgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+c3BhY2luZyhpbmRleCk7Ci19Ci0KLWNoYXIqIGxlZmlMYXllcl9zcGFjaW5nTmFtZSAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5zcGFjaW5nTmFtZShpbmRleCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfc3BhY2luZ0FkamFjZW50Q3V0cyAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5zcGFjaW5nQWRqYWNlbnRDdXRzKGluZGV4KTsKLX0KLQotZG91YmxlIGxlZmlMYXllcl9zcGFjaW5nQWRqYWNlbnRXaXRoaW4gKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+c3BhY2luZ0FkamFjZW50V2l0aGluKGluZGV4KTsKLX0KLQotZG91YmxlIGxlZmlMYXllcl9zcGFjaW5nQXJlYSAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5zcGFjaW5nQXJlYShpbmRleCk7Ci19Ci0KLWRvdWJsZSBsZWZpTGF5ZXJfc3BhY2luZ1JhbmdlTWluIChjb25zdCA6OmxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPnNwYWNpbmdSYW5nZU1pbihpbmRleCk7Ci19Ci0KLWRvdWJsZSBsZWZpTGF5ZXJfc3BhY2luZ1JhbmdlTWF4IChjb25zdCA6OmxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPnNwYWNpbmdSYW5nZU1heChpbmRleCk7Ci19Ci0KLWRvdWJsZSBsZWZpTGF5ZXJfc3BhY2luZ1JhbmdlSW5mbHVlbmNlIChjb25zdCA6OmxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPnNwYWNpbmdSYW5nZUluZmx1ZW5jZShpbmRleCk7Ci19Ci0KLWRvdWJsZSBsZWZpTGF5ZXJfc3BhY2luZ1JhbmdlSW5mbHVlbmNlTWluIChjb25zdCA6OmxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPnNwYWNpbmdSYW5nZUluZmx1ZW5jZU1pbihpbmRleCk7Ci19Ci0KLWRvdWJsZSBsZWZpTGF5ZXJfc3BhY2luZ1JhbmdlSW5mbHVlbmNlTWF4IChjb25zdCA6OmxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPnNwYWNpbmdSYW5nZUluZmx1ZW5jZU1heChpbmRleCk7Ci19Ci0KLWRvdWJsZSBsZWZpTGF5ZXJfc3BhY2luZ1JhbmdlUmFuZ2VNaW4gKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+c3BhY2luZ1JhbmdlUmFuZ2VNaW4oaW5kZXgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX3NwYWNpbmdSYW5nZVJhbmdlTWF4IChjb25zdCA6OmxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPnNwYWNpbmdSYW5nZVJhbmdlTWF4KGluZGV4KTsKLX0KLQotZG91YmxlIGxlZmlMYXllcl9zcGFjaW5nTGVuZ3RoVGhyZXNob2xkIChjb25zdCA6OmxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPnNwYWNpbmdMZW5ndGhUaHJlc2hvbGQoaW5kZXgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX3NwYWNpbmdMZW5ndGhUaHJlc2hvbGRSYW5nZU1pbiAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5zcGFjaW5nTGVuZ3RoVGhyZXNob2xkUmFuZ2VNaW4oaW5kZXgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX3NwYWNpbmdMZW5ndGhUaHJlc2hvbGRSYW5nZU1heCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5zcGFjaW5nTGVuZ3RoVGhyZXNob2xkUmFuZ2VNYXgoaW5kZXgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX3NwYWNpbmdFb2xXaWR0aCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5zcGFjaW5nRW9sV2lkdGgoaW5kZXgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX3NwYWNpbmdFb2xXaXRoaW4gKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+c3BhY2luZ0VvbFdpdGhpbihpbmRleCk7Ci19Ci0KLWRvdWJsZSBsZWZpTGF5ZXJfc3BhY2luZ1BhclNwYWNlIChjb25zdCA6OmxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPnNwYWNpbmdQYXJTcGFjZShpbmRleCk7Ci19Ci0KLWRvdWJsZSBsZWZpTGF5ZXJfc3BhY2luZ1BhcldpdGhpbiAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5zcGFjaW5nUGFyV2l0aGluKGluZGV4KTsKLX0KLQotZG91YmxlIGxlZmlMYXllcl9zcGFjaW5nTm90Y2hMZW5ndGggKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+c3BhY2luZ05vdGNoTGVuZ3RoKGluZGV4KTsKLX0KLQotZG91YmxlIGxlZmlMYXllcl9zcGFjaW5nRW5kT2ZOb3RjaFdpZHRoIChjb25zdCA6OmxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPnNwYWNpbmdFbmRPZk5vdGNoV2lkdGgoaW5kZXgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX3NwYWNpbmdFbmRPZk5vdGNoU3BhY2luZyAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5zcGFjaW5nRW5kT2ZOb3RjaFNwYWNpbmcoaW5kZXgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX3NwYWNpbmdFbmRPZk5vdGNoTGVuZ3RoIChjb25zdCA6OmxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPnNwYWNpbmdFbmRPZk5vdGNoTGVuZ3RoKGluZGV4KTsKLX0KLQotaW50IGxlZmlMYXllcl9udW1NaW5pbXVtY3V0IChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPm51bU1pbmltdW1jdXQoKTsKLX0KLQotaW50IGxlZmlMYXllcl9taW5pbXVtY3V0IChjb25zdCA6OmxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPm1pbmltdW1jdXQoaW5kZXgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX21pbmltdW1jdXRXaWR0aCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5taW5pbXVtY3V0V2lkdGgoaW5kZXgpOwotfQotCi1pbnQgbGVmaUxheWVyX2hhc01pbmltdW1jdXRXaXRoaW4gKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+aGFzTWluaW11bWN1dFdpdGhpbihpbmRleCk7Ci19Ci0KLWRvdWJsZSBsZWZpTGF5ZXJfbWluaW11bWN1dFdpdGhpbiAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5taW5pbXVtY3V0V2l0aGluKGluZGV4KTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNNaW5pbXVtY3V0Q29ubmVjdGlvbiAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5oYXNNaW5pbXVtY3V0Q29ubmVjdGlvbihpbmRleCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGxlZmlMYXllcl9taW5pbXVtY3V0Q29ubmVjdGlvbiAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5taW5pbXVtY3V0Q29ubmVjdGlvbihpbmRleCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfaGFzTWluaW11bWN1dE51bUN1dHMgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+aGFzTWluaW11bWN1dE51bUN1dHMoaW5kZXgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX21pbmltdW1jdXRMZW5ndGggKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+bWluaW11bWN1dExlbmd0aChpbmRleCk7Ci19Ci0KLWRvdWJsZSBsZWZpTGF5ZXJfbWluaW11bWN1dERpc3RhbmNlIChjb25zdCA6OmxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPm1pbmltdW1jdXREaXN0YW5jZShpbmRleCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGxlZmlMYXllcl9kaXJlY3Rpb24gKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+ZGlyZWN0aW9uKCk7Ci19Ci0KLWRvdWJsZSBsZWZpTGF5ZXJfcmVzaXN0YW5jZSAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5yZXNpc3RhbmNlKCk7Ci19Ci0KLWRvdWJsZSBsZWZpTGF5ZXJfY2FwYWNpdGFuY2UgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+Y2FwYWNpdGFuY2UoKTsKLX0KLQotZG91YmxlIGxlZmlMYXllcl9oZWlnaHQgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+aGVpZ2h0KCk7Ci19Ci0KLWRvdWJsZSBsZWZpTGF5ZXJfd2lyZUV4dGVuc2lvbiAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT53aXJlRXh0ZW5zaW9uKCk7Ci19Ci0KLWRvdWJsZSBsZWZpTGF5ZXJfdGhpY2tuZXNzIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPnRoaWNrbmVzcygpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX3Nocmlua2FnZSAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5zaHJpbmthZ2UoKTsKLX0KLQotZG91YmxlIGxlZmlMYXllcl9jYXBNdWx0aXBsaWVyIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmNhcE11bHRpcGxpZXIoKTsKLX0KLQotZG91YmxlIGxlZmlMYXllcl9lZGdlQ2FwIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmVkZ2VDYXAoKTsKLX0KLQotZG91YmxlIGxlZmlMYXllcl9hbnRlbm5hTGVuZ3RoIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmFudGVubmFMZW5ndGgoKTsKLX0KLQotZG91YmxlIGxlZmlMYXllcl9hbnRlbm5hQXJlYSAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5hbnRlbm5hQXJlYSgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX2N1cnJlbnREZW5zaXR5UG9pbnQgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+Y3VycmVudERlbnNpdHlQb2ludCgpOwotfQotCi12b2lkIGxlZmlMYXllcl9jdXJyZW50RGVuc2l0eUFycmF5IChjb25zdCA6OmxlZmlMYXllciogb2JqLCBpbnQqICBudW1Qb2ludHMsIGRvdWJsZSoqICB3aWR0aHMsIGRvdWJsZSoqICBjdXJyZW50KSB7Ci0gICAgKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+Y3VycmVudERlbnNpdHlBcnJheShudW1Qb2ludHMsIHdpZHRocywgY3VycmVudCk7Ci19Ci0KLXZvaWQgbGVmaUxheWVyX2NhcGFjaXRhbmNlQXJyYXkgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCogIG51bVBvaW50cywgZG91YmxlKiogIHdpZHRocywgZG91YmxlKiogIHJlc1ZhbHVlcykgewotICAgICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmNhcGFjaXRhbmNlQXJyYXkobnVtUG9pbnRzLCB3aWR0aHMsIHJlc1ZhbHVlcyk7Ci19Ci0KLXZvaWQgbGVmaUxheWVyX3Jlc2lzdGFuY2VBcnJheSAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50KiAgbnVtUG9pbnRzLCBkb3VibGUqKiAgd2lkdGhzLCBkb3VibGUqKiAgY2FwVmFsdWVzKSB7Ci0gICAgKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+cmVzaXN0YW5jZUFycmF5KG51bVBvaW50cywgd2lkdGhzLCBjYXBWYWx1ZXMpOwotfQotCi1pbnQgbGVmaUxheWVyX251bUFjY3VycmVudERlbnNpdHkgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+bnVtQWNjdXJyZW50RGVuc2l0eSgpOwotfQotCi1jb25zdCA6OmxlZmlMYXllckRlbnNpdHkqIGxlZmlMYXllcl9hY2N1cnJlbnQgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKGNvbnN0IDo6bGVmaUxheWVyRGVuc2l0eSopICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmFjY3VycmVudChpbmRleCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfbnVtRGNjdXJyZW50RGVuc2l0eSAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5udW1EY2N1cnJlbnREZW5zaXR5KCk7Ci19Ci0KLWNvbnN0IDo6bGVmaUxheWVyRGVuc2l0eSogbGVmaUxheWVyX2RjY3VycmVudCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoY29uc3QgOjpsZWZpTGF5ZXJEZW5zaXR5KikgKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+ZGNjdXJyZW50KGluZGV4KTsKLX0KLQotaW50IGxlZmlMYXllcl9udW1BbnRlbm5hTW9kZWwgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+bnVtQW50ZW5uYU1vZGVsKCk7Ci19Ci0KLWNvbnN0IDo6bGVmaUFudGVubmFNb2RlbCogbGVmaUxheWVyX2FudGVubmFNb2RlbCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoY29uc3QgOjpsZWZpQW50ZW5uYU1vZGVsKikgKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+YW50ZW5uYU1vZGVsKGluZGV4KTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNTbG90V2lyZVdpZHRoIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc1Nsb3RXaXJlV2lkdGgoKTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNTbG90V2lyZUxlbmd0aCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5oYXNTbG90V2lyZUxlbmd0aCgpOwotfQotCi1pbnQgbGVmaUxheWVyX2hhc1Nsb3RXaWR0aCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5oYXNTbG90V2lkdGgoKTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNTbG90TGVuZ3RoIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc1Nsb3RMZW5ndGgoKTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNNYXhBZGphY2VudFNsb3RTcGFjaW5nIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc01heEFkamFjZW50U2xvdFNwYWNpbmcoKTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNNYXhDb2F4aWFsU2xvdFNwYWNpbmcgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+aGFzTWF4Q29heGlhbFNsb3RTcGFjaW5nKCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfaGFzTWF4RWRnZVNsb3RTcGFjaW5nIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc01heEVkZ2VTbG90U3BhY2luZygpOwotfQotCi1pbnQgbGVmaUxheWVyX2hhc1NwbGl0V2lyZVdpZHRoIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc1NwbGl0V2lyZVdpZHRoKCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfaGFzTWluaW11bURlbnNpdHkgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+aGFzTWluaW11bURlbnNpdHkoKTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNNYXhpbXVtRGVuc2l0eSAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5oYXNNYXhpbXVtRGVuc2l0eSgpOwotfQotCi1pbnQgbGVmaUxheWVyX2hhc0RlbnNpdHlDaGVja1dpbmRvdyAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5oYXNEZW5zaXR5Q2hlY2tXaW5kb3coKTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNEZW5zaXR5Q2hlY2tTdGVwIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc0RlbnNpdHlDaGVja1N0ZXAoKTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNGaWxsQWN0aXZlU3BhY2luZyAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5oYXNGaWxsQWN0aXZlU3BhY2luZygpOwotfQotCi1pbnQgbGVmaUxheWVyX2hhc01heHdpZHRoIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc01heHdpZHRoKCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfaGFzTWlud2lkdGggKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+aGFzTWlud2lkdGgoKTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNNaW5zdGVwIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc01pbnN0ZXAoKTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNQcm90cnVzaW9uIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc1Byb3RydXNpb24oKTsKLX0KLQotZG91YmxlIGxlZmlMYXllcl9zbG90V2lyZVdpZHRoIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPnNsb3RXaXJlV2lkdGgoKTsKLX0KLQotZG91YmxlIGxlZmlMYXllcl9zbG90V2lyZUxlbmd0aCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5zbG90V2lyZUxlbmd0aCgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX3Nsb3RXaWR0aCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5zbG90V2lkdGgoKTsKLX0KLQotZG91YmxlIGxlZmlMYXllcl9zbG90TGVuZ3RoIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPnNsb3RMZW5ndGgoKTsKLX0KLQotZG91YmxlIGxlZmlMYXllcl9tYXhBZGphY2VudFNsb3RTcGFjaW5nIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPm1heEFkamFjZW50U2xvdFNwYWNpbmcoKTsKLX0KLQotZG91YmxlIGxlZmlMYXllcl9tYXhDb2F4aWFsU2xvdFNwYWNpbmcgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+bWF4Q29heGlhbFNsb3RTcGFjaW5nKCk7Ci19Ci0KLWRvdWJsZSBsZWZpTGF5ZXJfbWF4RWRnZVNsb3RTcGFjaW5nIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPm1heEVkZ2VTbG90U3BhY2luZygpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX3NwbGl0V2lyZVdpZHRoIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPnNwbGl0V2lyZVdpZHRoKCk7Ci19Ci0KLWRvdWJsZSBsZWZpTGF5ZXJfbWluaW11bURlbnNpdHkgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+bWluaW11bURlbnNpdHkoKTsKLX0KLQotZG91YmxlIGxlZmlMYXllcl9tYXhpbXVtRGVuc2l0eSAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5tYXhpbXVtRGVuc2l0eSgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX2RlbnNpdHlDaGVja1dpbmRvd0xlbmd0aCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5kZW5zaXR5Q2hlY2tXaW5kb3dMZW5ndGgoKTsKLX0KLQotZG91YmxlIGxlZmlMYXllcl9kZW5zaXR5Q2hlY2tXaW5kb3dXaWR0aCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5kZW5zaXR5Q2hlY2tXaW5kb3dXaWR0aCgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX2RlbnNpdHlDaGVja1N0ZXAgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+ZGVuc2l0eUNoZWNrU3RlcCgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX2ZpbGxBY3RpdmVTcGFjaW5nIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmZpbGxBY3RpdmVTcGFjaW5nKCk7Ci19Ci0KLWRvdWJsZSBsZWZpTGF5ZXJfbWF4d2lkdGggKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+bWF4d2lkdGgoKTsKLX0KLQotZG91YmxlIGxlZmlMYXllcl9taW53aWR0aCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5taW53aWR0aCgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX3Byb3RydXNpb25XaWR0aDEgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+cHJvdHJ1c2lvbldpZHRoMSgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX3Byb3RydXNpb25MZW5ndGggKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+cHJvdHJ1c2lvbkxlbmd0aCgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX3Byb3RydXNpb25XaWR0aDIgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+cHJvdHJ1c2lvbldpZHRoMigpOwotfQotCi1pbnQgbGVmaUxheWVyX251bU1pbnN0ZXAgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+bnVtTWluc3RlcCgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX21pbnN0ZXAgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+bWluc3RlcChpbmRleCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfaGFzTWluc3RlcFR5cGUgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+aGFzTWluc3RlcFR5cGUoaW5kZXgpOwotfQotCi1jaGFyKiBsZWZpTGF5ZXJfbWluc3RlcFR5cGUgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+bWluc3RlcFR5cGUoaW5kZXgpOwotfQotCi1pbnQgbGVmaUxheWVyX2hhc01pbnN0ZXBMZW5ndGhzdW0gKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+aGFzTWluc3RlcExlbmd0aHN1bShpbmRleCk7Ci19Ci0KLWRvdWJsZSBsZWZpTGF5ZXJfbWluc3RlcExlbmd0aHN1bSAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5taW5zdGVwTGVuZ3Roc3VtKGluZGV4KTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNNaW5zdGVwTWF4ZWRnZXMgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+aGFzTWluc3RlcE1heGVkZ2VzKGluZGV4KTsKLX0KLQotaW50IGxlZmlMYXllcl9taW5zdGVwTWF4ZWRnZXMgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+bWluc3RlcE1heGVkZ2VzKGluZGV4KTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNNaW5zdGVwTWluQWRqTGVuZ3RoIChjb25zdCA6OmxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc01pbnN0ZXBNaW5BZGpMZW5ndGgoaW5kZXgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX21pbnN0ZXBNaW5BZGpMZW5ndGggKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+bWluc3RlcE1pbkFkakxlbmd0aChpbmRleCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfaGFzTWluc3RlcE1pbkJldExlbmd0aCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5oYXNNaW5zdGVwTWluQmV0TGVuZ3RoKGluZGV4KTsKLX0KLQotZG91YmxlIGxlZmlMYXllcl9taW5zdGVwTWluQmV0TGVuZ3RoIChjb25zdCA6OmxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPm1pbnN0ZXBNaW5CZXRMZW5ndGgoaW5kZXgpOwotfQotCi1pbnQgbGVmaUxheWVyX2hhc01pbnN0ZXBYU2FtZUNvcm5lcnMgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+aGFzTWluc3RlcFhTYW1lQ29ybmVycyhpbmRleCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfbnVtTWluZW5jbG9zZWRhcmVhIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPm51bU1pbmVuY2xvc2VkYXJlYSgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX21pbmVuY2xvc2VkYXJlYSAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5taW5lbmNsb3NlZGFyZWEoaW5kZXgpOwotfQotCi1pbnQgbGVmaUxheWVyX2hhc01pbmVuY2xvc2VkYXJlYVdpZHRoIChjb25zdCA6OmxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc01pbmVuY2xvc2VkYXJlYVdpZHRoKGluZGV4KTsKLX0KLQotZG91YmxlIGxlZmlMYXllcl9taW5lbmNsb3NlZGFyZWFXaWR0aCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5taW5lbmNsb3NlZGFyZWFXaWR0aChpbmRleCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfbnVtRW5jbG9zdXJlIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPm51bUVuY2xvc3VyZSgpOwotfQotCi1pbnQgbGVmaUxheWVyX2hhc0VuY2xvc3VyZVJ1bGUgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+aGFzRW5jbG9zdXJlUnVsZShpbmRleCk7Ci19Ci0KLWRvdWJsZSBsZWZpTGF5ZXJfZW5jbG9zdXJlT3ZlcmhhbmcxIChjb25zdCA6OmxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmVuY2xvc3VyZU92ZXJoYW5nMShpbmRleCk7Ci19Ci0KLWRvdWJsZSBsZWZpTGF5ZXJfZW5jbG9zdXJlT3ZlcmhhbmcyIChjb25zdCA6OmxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmVuY2xvc3VyZU92ZXJoYW5nMihpbmRleCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfaGFzRW5jbG9zdXJlV2lkdGggKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+aGFzRW5jbG9zdXJlV2lkdGgoaW5kZXgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX2VuY2xvc3VyZU1pbldpZHRoIChjb25zdCA6OmxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmVuY2xvc3VyZU1pbldpZHRoKGluZGV4KTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNFbmNsb3N1cmVFeGNlcHRFeHRyYUN1dCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5oYXNFbmNsb3N1cmVFeGNlcHRFeHRyYUN1dChpbmRleCk7Ci19Ci0KLWRvdWJsZSBsZWZpTGF5ZXJfZW5jbG9zdXJlRXhjZXB0RXh0cmFDdXQgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+ZW5jbG9zdXJlRXhjZXB0RXh0cmFDdXQoaW5kZXgpOwotfQotCi1pbnQgbGVmaUxheWVyX2hhc0VuY2xvc3VyZU1pbkxlbmd0aCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5oYXNFbmNsb3N1cmVNaW5MZW5ndGgoaW5kZXgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX2VuY2xvc3VyZU1pbkxlbmd0aCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5lbmNsb3N1cmVNaW5MZW5ndGgoaW5kZXgpOwotfQotCi1pbnQgbGVmaUxheWVyX251bVByZWZlckVuY2xvc3VyZSAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5udW1QcmVmZXJFbmNsb3N1cmUoKTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNQcmVmZXJFbmNsb3N1cmVSdWxlIChjb25zdCA6OmxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc1ByZWZlckVuY2xvc3VyZVJ1bGUoaW5kZXgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX3ByZWZlckVuY2xvc3VyZU92ZXJoYW5nMSAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5wcmVmZXJFbmNsb3N1cmVPdmVyaGFuZzEoaW5kZXgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX3ByZWZlckVuY2xvc3VyZU92ZXJoYW5nMiAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5wcmVmZXJFbmNsb3N1cmVPdmVyaGFuZzIoaW5kZXgpOwotfQotCi1pbnQgbGVmaUxheWVyX2hhc1ByZWZlckVuY2xvc3VyZVdpZHRoIChjb25zdCA6OmxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc1ByZWZlckVuY2xvc3VyZVdpZHRoKGluZGV4KTsKLX0KLQotZG91YmxlIGxlZmlMYXllcl9wcmVmZXJFbmNsb3N1cmVNaW5XaWR0aCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5wcmVmZXJFbmNsb3N1cmVNaW5XaWR0aChpbmRleCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfaGFzUmVzaXN0YW5jZVBlckN1dCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5oYXNSZXNpc3RhbmNlUGVyQ3V0KCk7Ci19Ci0KLWRvdWJsZSBsZWZpTGF5ZXJfcmVzaXN0YW5jZVBlckN1dCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5yZXNpc3RhbmNlUGVyQ3V0KCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfaGFzRGlhZ01pbkVkZ2VMZW5ndGggKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+aGFzRGlhZ01pbkVkZ2VMZW5ndGgoKTsKLX0KLQotZG91YmxlIGxlZmlMYXllcl9kaWFnTWluRWRnZUxlbmd0aCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5kaWFnTWluRWRnZUxlbmd0aCgpOwotfQotCi1pbnQgbGVmaUxheWVyX251bU1pblNpemUgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+bnVtTWluU2l6ZSgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX21pblNpemVXaWR0aCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5taW5TaXplV2lkdGgoaW5kZXgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX21pblNpemVMZW5ndGggKGNvbnN0IDo6bGVmaUxheWVyKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+bWluU2l6ZUxlbmd0aChpbmRleCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfaGFzTWF4RmxvYXRpbmdBcmVhIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc01heEZsb2F0aW5nQXJlYSgpOwotfQotCi1kb3VibGUgbGVmaUxheWVyX21heEZsb2F0aW5nQXJlYSAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5tYXhGbG9hdGluZ0FyZWEoKTsKLX0KLQotaW50IGxlZmlMYXllcl9oYXNBcnJheVNwYWNpbmcgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+aGFzQXJyYXlTcGFjaW5nKCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfaGFzTG9uZ0FycmF5IChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc0xvbmdBcnJheSgpOwotfQotCi1pbnQgbGVmaUxheWVyX2hhc1ZpYVdpZHRoIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmhhc1ZpYVdpZHRoKCk7Ci19Ci0KLWRvdWJsZSBsZWZpTGF5ZXJfdmlhV2lkdGggKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+dmlhV2lkdGgoKTsKLX0KLQotZG91YmxlIGxlZmlMYXllcl9jdXRTcGFjaW5nIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmN1dFNwYWNpbmcoKTsKLX0KLQotaW50IGxlZmlMYXllcl9udW1BcnJheUN1dHMgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+bnVtQXJyYXlDdXRzKCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfYXJyYXlDdXRzIChjb25zdCA6OmxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmFycmF5Q3V0cyhpbmRleCk7Ci19Ci0KLWRvdWJsZSBsZWZpTGF5ZXJfYXJyYXlTcGFjaW5nIChjb25zdCA6OmxlZmlMYXllciogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPmFycmF5U3BhY2luZyhpbmRleCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfaGFzU3BhY2luZ1RhYmxlT3J0aG8gKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlMYXllciopb2JqKS0+aGFzU3BhY2luZ1RhYmxlT3J0aG8oKTsKLX0KLQotY29uc3QgOjpsZWZpT3J0aG9nb25hbCogbGVmaUxheWVyX29ydGhvZ29uYWwgKGNvbnN0IDo6bGVmaUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKGNvbnN0IDo6bGVmaU9ydGhvZ29uYWwqKSAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5vcnRob2dvbmFsKCk7Ci19Ci0KLWludCBsZWZpTGF5ZXJfbmVlZDU4UHJvcHNQcm9jZXNzaW5nIChjb25zdCA6OmxlZmlMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTGF5ZXIqKW9iaiktPm5lZWQ1OFByb3BzUHJvY2Vzc2luZygpOwotfQotCi12b2lkIGxlZmlMYXllcl9wcmludCAoY29uc3QgOjpsZWZpTGF5ZXIqIG9iaiwgRklMRSogIGYpIHsKLSAgICAoKExlZkRlZlBhcnNlcjo6bGVmaUxheWVyKilvYmopLT5wcmludChmKTsKLX0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYveGxlZmlNYWNyby5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi94bGVmaU1hY3JvLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE2ODAzYi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi94bGVmaU1hY3JvLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDgyOSArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIEFUVEVOVElPTjogVEhJUyBJUyBBTiBBVVRPLUdFTkVSQVRFRCBGSUxFLiBETyBOT1QgQ0hBTkdFIElUIQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJCAgCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2RlZmluZSBFWFRFUk4gZXh0ZXJuICJDIgotCi0jaW5jbHVkZSAibGVmaU1hY3JvLmgiCi0jaW5jbHVkZSAibGVmaU1hY3JvLmhwcCIKLQotLy8gV3JhcHBlcnMgZGVmaW5pdGlvbnMuCi1jb25zdCA6OmxlZmlHZW9tZXRyaWVzKiBsZWZpT2JzdHJ1Y3Rpb25fZ2VvbWV0cmllcyAoY29uc3QgOjpsZWZpT2JzdHJ1Y3Rpb24qIG9iaikgewotICAgIHJldHVybiAoY29uc3QgOjpsZWZpR2VvbWV0cmllcyopICgoTGVmRGVmUGFyc2VyOjpsZWZpT2JzdHJ1Y3Rpb24qKW9iaiktPmdlb21ldHJpZXMoKTsKLX0KLQotdm9pZCBsZWZpT2JzdHJ1Y3Rpb25fcHJpbnQgKGNvbnN0IDo6bGVmaU9ic3RydWN0aW9uKiBvYmosIEZJTEUqICBmKSB7Ci0gICAgKChMZWZEZWZQYXJzZXI6OmxlZmlPYnN0cnVjdGlvbiopb2JqKS0+cHJpbnQoZik7Ci19Ci0KLWludCBsZWZpUGluQW50ZW5uYU1vZGVsX2hhc0FudGVubmFHYXRlQXJlYSAoY29uc3QgOjpsZWZpUGluQW50ZW5uYU1vZGVsKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW5BbnRlbm5hTW9kZWwqKW9iaiktPmhhc0FudGVubmFHYXRlQXJlYSgpOwotfQotCi1pbnQgbGVmaVBpbkFudGVubmFNb2RlbF9oYXNBbnRlbm5hTWF4QXJlYUNhciAoY29uc3QgOjpsZWZpUGluQW50ZW5uYU1vZGVsKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW5BbnRlbm5hTW9kZWwqKW9iaiktPmhhc0FudGVubmFNYXhBcmVhQ2FyKCk7Ci19Ci0KLWludCBsZWZpUGluQW50ZW5uYU1vZGVsX2hhc0FudGVubmFNYXhTaWRlQXJlYUNhciAoY29uc3QgOjpsZWZpUGluQW50ZW5uYU1vZGVsKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW5BbnRlbm5hTW9kZWwqKW9iaiktPmhhc0FudGVubmFNYXhTaWRlQXJlYUNhcigpOwotfQotCi1pbnQgbGVmaVBpbkFudGVubmFNb2RlbF9oYXNBbnRlbm5hTWF4Q3V0Q2FyIChjb25zdCA6OmxlZmlQaW5BbnRlbm5hTW9kZWwqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbkFudGVubmFNb2RlbCopb2JqKS0+aGFzQW50ZW5uYU1heEN1dENhcigpOwotfQotCi1jaGFyKiBsZWZpUGluQW50ZW5uYU1vZGVsX2FudGVubmFPeGlkZSAoY29uc3QgOjpsZWZpUGluQW50ZW5uYU1vZGVsKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW5BbnRlbm5hTW9kZWwqKW9iaiktPmFudGVubmFPeGlkZSgpOwotfQotCi1pbnQgbGVmaVBpbkFudGVubmFNb2RlbF9udW1BbnRlbm5hR2F0ZUFyZWEgKGNvbnN0IDo6bGVmaVBpbkFudGVubmFNb2RlbCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpUGluQW50ZW5uYU1vZGVsKilvYmopLT5udW1BbnRlbm5hR2F0ZUFyZWEoKTsKLX0KLQotZG91YmxlIGxlZmlQaW5BbnRlbm5hTW9kZWxfYW50ZW5uYUdhdGVBcmVhIChjb25zdCA6OmxlZmlQaW5BbnRlbm5hTW9kZWwqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbkFudGVubmFNb2RlbCopb2JqKS0+YW50ZW5uYUdhdGVBcmVhKGluZGV4KTsKLX0KLQotY29uc3QgY2hhciogbGVmaVBpbkFudGVubmFNb2RlbF9hbnRlbm5hR2F0ZUFyZWFMYXllciAoY29uc3QgOjpsZWZpUGluQW50ZW5uYU1vZGVsKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlQaW5BbnRlbm5hTW9kZWwqKW9iaiktPmFudGVubmFHYXRlQXJlYUxheWVyKGluZGV4KTsKLX0KLQotaW50IGxlZmlQaW5BbnRlbm5hTW9kZWxfbnVtQW50ZW5uYU1heEFyZWFDYXIgKGNvbnN0IDo6bGVmaVBpbkFudGVubmFNb2RlbCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpUGluQW50ZW5uYU1vZGVsKilvYmopLT5udW1BbnRlbm5hTWF4QXJlYUNhcigpOwotfQotCi1kb3VibGUgbGVmaVBpbkFudGVubmFNb2RlbF9hbnRlbm5hTWF4QXJlYUNhciAoY29uc3QgOjpsZWZpUGluQW50ZW5uYU1vZGVsKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW5BbnRlbm5hTW9kZWwqKW9iaiktPmFudGVubmFNYXhBcmVhQ2FyKGluZGV4KTsKLX0KLQotY29uc3QgY2hhciogbGVmaVBpbkFudGVubmFNb2RlbF9hbnRlbm5hTWF4QXJlYUNhckxheWVyIChjb25zdCA6OmxlZmlQaW5BbnRlbm5hTW9kZWwqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6bGVmaVBpbkFudGVubmFNb2RlbCopb2JqKS0+YW50ZW5uYU1heEFyZWFDYXJMYXllcihpbmRleCk7Ci19Ci0KLWludCBsZWZpUGluQW50ZW5uYU1vZGVsX251bUFudGVubmFNYXhTaWRlQXJlYUNhciAoY29uc3QgOjpsZWZpUGluQW50ZW5uYU1vZGVsKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW5BbnRlbm5hTW9kZWwqKW9iaiktPm51bUFudGVubmFNYXhTaWRlQXJlYUNhcigpOwotfQotCi1kb3VibGUgbGVmaVBpbkFudGVubmFNb2RlbF9hbnRlbm5hTWF4U2lkZUFyZWFDYXIgKGNvbnN0IDo6bGVmaVBpbkFudGVubmFNb2RlbCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpUGluQW50ZW5uYU1vZGVsKilvYmopLT5hbnRlbm5hTWF4U2lkZUFyZWFDYXIoaW5kZXgpOwotfQotCi1jb25zdCBjaGFyKiBsZWZpUGluQW50ZW5uYU1vZGVsX2FudGVubmFNYXhTaWRlQXJlYUNhckxheWVyIChjb25zdCA6OmxlZmlQaW5BbnRlbm5hTW9kZWwqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6bGVmaVBpbkFudGVubmFNb2RlbCopb2JqKS0+YW50ZW5uYU1heFNpZGVBcmVhQ2FyTGF5ZXIoaW5kZXgpOwotfQotCi1pbnQgbGVmaVBpbkFudGVubmFNb2RlbF9udW1BbnRlbm5hTWF4Q3V0Q2FyIChjb25zdCA6OmxlZmlQaW5BbnRlbm5hTW9kZWwqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbkFudGVubmFNb2RlbCopb2JqKS0+bnVtQW50ZW5uYU1heEN1dENhcigpOwotfQotCi1kb3VibGUgbGVmaVBpbkFudGVubmFNb2RlbF9hbnRlbm5hTWF4Q3V0Q2FyIChjb25zdCA6OmxlZmlQaW5BbnRlbm5hTW9kZWwqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbkFudGVubmFNb2RlbCopb2JqKS0+YW50ZW5uYU1heEN1dENhcihpbmRleCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGxlZmlQaW5BbnRlbm5hTW9kZWxfYW50ZW5uYU1heEN1dENhckxheWVyIChjb25zdCA6OmxlZmlQaW5BbnRlbm5hTW9kZWwqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6bGVmaVBpbkFudGVubmFNb2RlbCopb2JqKS0+YW50ZW5uYU1heEN1dENhckxheWVyKGluZGV4KTsKLX0KLQotaW50IGxlZmlQaW5BbnRlbm5hTW9kZWxfaGFzUmV0dXJuIChjb25zdCA6OmxlZmlQaW5BbnRlbm5hTW9kZWwqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbkFudGVubmFNb2RlbCopb2JqKS0+aGFzUmV0dXJuKCk7Ci19Ci0KLWludCBsZWZpUGluX2hhc0ZvcmVpZ24gKGNvbnN0IDo6bGVmaVBpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpUGluKilvYmopLT5oYXNGb3JlaWduKCk7Ci19Ci0KLWludCBsZWZpUGluX2hhc0ZvcmVpZ25PcmllbnQgKGNvbnN0IDo6bGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpUGluKilvYmopLT5oYXNGb3JlaWduT3JpZW50KGluZGV4KTsKLX0KLQotaW50IGxlZmlQaW5faGFzRm9yZWlnblBvaW50IChjb25zdCA6OmxlZmlQaW4qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+aGFzRm9yZWlnblBvaW50KGluZGV4KTsKLX0KLQotaW50IGxlZmlQaW5faGFzTEVRIChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+aGFzTEVRKCk7Ci19Ci0KLWludCBsZWZpUGluX2hhc0RpcmVjdGlvbiAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmhhc0RpcmVjdGlvbigpOwotfQotCi1pbnQgbGVmaVBpbl9oYXNVc2UgKGNvbnN0IDo6bGVmaVBpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpUGluKilvYmopLT5oYXNVc2UoKTsKLX0KLQotaW50IGxlZmlQaW5faGFzU2hhcGUgKGNvbnN0IDo6bGVmaVBpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpUGluKilvYmopLT5oYXNTaGFwZSgpOwotfQotCi1pbnQgbGVmaVBpbl9oYXNNdXN0am9pbiAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmhhc011c3Rqb2luKCk7Ci19Ci0KLWludCBsZWZpUGluX2hhc091dE1hcmdpbiAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmhhc091dE1hcmdpbigpOwotfQotCi1pbnQgbGVmaVBpbl9oYXNPdXRSZXNpc3RhbmNlIChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+aGFzT3V0UmVzaXN0YW5jZSgpOwotfQotCi1pbnQgbGVmaVBpbl9oYXNJbk1hcmdpbiAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmhhc0luTWFyZ2luKCk7Ci19Ci0KLWludCBsZWZpUGluX2hhc1Bvd2VyIChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+aGFzUG93ZXIoKTsKLX0KLQotaW50IGxlZmlQaW5faGFzTGVha2FnZSAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmhhc0xlYWthZ2UoKTsKLX0KLQotaW50IGxlZmlQaW5faGFzTWF4bG9hZCAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmhhc01heGxvYWQoKTsKLX0KLQotaW50IGxlZmlQaW5faGFzTWF4ZGVsYXkgKGNvbnN0IDo6bGVmaVBpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpUGluKilvYmopLT5oYXNNYXhkZWxheSgpOwotfQotCi1pbnQgbGVmaVBpbl9oYXNDYXBhY2l0YW5jZSAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmhhc0NhcGFjaXRhbmNlKCk7Ci19Ci0KLWludCBsZWZpUGluX2hhc1Jlc2lzdGFuY2UgKGNvbnN0IDo6bGVmaVBpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpUGluKilvYmopLT5oYXNSZXNpc3RhbmNlKCk7Ci19Ci0KLWludCBsZWZpUGluX2hhc1B1bGxkb3ducmVzIChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+aGFzUHVsbGRvd25yZXMoKTsKLX0KLQotaW50IGxlZmlQaW5faGFzVGllb2ZmciAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmhhc1RpZW9mZnIoKTsKLX0KLQotaW50IGxlZmlQaW5faGFzVkhJIChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+aGFzVkhJKCk7Ci19Ci0KLWludCBsZWZpUGluX2hhc1ZMTyAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmhhc1ZMTygpOwotfQotCi1pbnQgbGVmaVBpbl9oYXNSaXNlVm9sdGFnZSAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmhhc1Jpc2VWb2x0YWdlKCk7Ci19Ci0KLWludCBsZWZpUGluX2hhc0ZhbGxWb2x0YWdlIChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+aGFzRmFsbFZvbHRhZ2UoKTsKLX0KLQotaW50IGxlZmlQaW5faGFzUmlzZVRocmVzaCAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmhhc1Jpc2VUaHJlc2goKTsKLX0KLQotaW50IGxlZmlQaW5faGFzRmFsbFRocmVzaCAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmhhc0ZhbGxUaHJlc2goKTsKLX0KLQotaW50IGxlZmlQaW5faGFzUmlzZVNhdGN1ciAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmhhc1Jpc2VTYXRjdXIoKTsKLX0KLQotaW50IGxlZmlQaW5faGFzRmFsbFNhdGN1ciAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmhhc0ZhbGxTYXRjdXIoKTsKLX0KLQotaW50IGxlZmlQaW5faGFzQ3VycmVudFNvdXJjZSAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmhhc0N1cnJlbnRTb3VyY2UoKTsKLX0KLQotaW50IGxlZmlQaW5faGFzVGFibGVzIChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+aGFzVGFibGVzKCk7Ci19Ci0KLWludCBsZWZpUGluX2hhc0FudGVubmFTaXplIChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+aGFzQW50ZW5uYVNpemUoKTsKLX0KLQotaW50IGxlZmlQaW5faGFzQW50ZW5uYU1ldGFsQXJlYSAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmhhc0FudGVubmFNZXRhbEFyZWEoKTsKLX0KLQotaW50IGxlZmlQaW5faGFzQW50ZW5uYU1ldGFsTGVuZ3RoIChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+aGFzQW50ZW5uYU1ldGFsTGVuZ3RoKCk7Ci19Ci0KLWludCBsZWZpUGluX2hhc0FudGVubmFQYXJ0aWFsTWV0YWxBcmVhIChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+aGFzQW50ZW5uYVBhcnRpYWxNZXRhbEFyZWEoKTsKLX0KLQotaW50IGxlZmlQaW5faGFzQW50ZW5uYVBhcnRpYWxNZXRhbFNpZGVBcmVhIChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+aGFzQW50ZW5uYVBhcnRpYWxNZXRhbFNpZGVBcmVhKCk7Ci19Ci0KLWludCBsZWZpUGluX2hhc0FudGVubmFQYXJ0aWFsQ3V0QXJlYSAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmhhc0FudGVubmFQYXJ0aWFsQ3V0QXJlYSgpOwotfQotCi1pbnQgbGVmaVBpbl9oYXNBbnRlbm5hRGlmZkFyZWEgKGNvbnN0IDo6bGVmaVBpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpUGluKilvYmopLT5oYXNBbnRlbm5hRGlmZkFyZWEoKTsKLX0KLQotaW50IGxlZmlQaW5faGFzQW50ZW5uYU1vZGVsIChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+aGFzQW50ZW5uYU1vZGVsKCk7Ci19Ci0KLWludCBsZWZpUGluX2hhc1RhcGVyUnVsZSAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmhhc1RhcGVyUnVsZSgpOwotfQotCi1pbnQgbGVmaVBpbl9oYXNSaXNlU2xld0xpbWl0IChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+aGFzUmlzZVNsZXdMaW1pdCgpOwotfQotCi1pbnQgbGVmaVBpbl9oYXNGYWxsU2xld0xpbWl0IChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+aGFzRmFsbFNsZXdMaW1pdCgpOwotfQotCi1pbnQgbGVmaVBpbl9oYXNOZXRFeHByIChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+aGFzTmV0RXhwcigpOwotfQotCi1pbnQgbGVmaVBpbl9oYXNTdXBwbHlTZW5zaXRpdml0eSAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmhhc1N1cHBseVNlbnNpdGl2aXR5KCk7Ci19Ci0KLWludCBsZWZpUGluX2hhc0dyb3VuZFNlbnNpdGl2aXR5IChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+aGFzR3JvdW5kU2Vuc2l0aXZpdHkoKTsKLX0KLQotY29uc3QgY2hhciogbGVmaVBpbl9uYW1lIChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+bmFtZSgpOwotfQotCi1pbnQgbGVmaVBpbl9udW1Qb3J0cyAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPm51bVBvcnRzKCk7Ci19Ci0KLWNvbnN0IDo6bGVmaUdlb21ldHJpZXMqIGxlZmlQaW5fcG9ydCAoY29uc3QgOjpsZWZpUGluKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKGNvbnN0IDo6bGVmaUdlb21ldHJpZXMqKSAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+cG9ydChpbmRleCk7Ci19Ci0KLWludCBsZWZpUGluX251bUZvcmVpZ25zIChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+bnVtRm9yZWlnbnMoKTsKLX0KLQotY29uc3QgY2hhciogbGVmaVBpbl9mb3JlaWduTmFtZSAoY29uc3QgOjpsZWZpUGluKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmZvcmVpZ25OYW1lKGluZGV4KTsKLX0KLQotY29uc3QgY2hhciogbGVmaVBpbl90YXBlclJ1bGUgKGNvbnN0IDo6bGVmaVBpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpsZWZpUGluKilvYmopLT50YXBlclJ1bGUoKTsKLX0KLQotaW50IGxlZmlQaW5fZm9yZWlnbk9yaWVudCAoY29uc3QgOjpsZWZpUGluKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmZvcmVpZ25PcmllbnQoaW5kZXgpOwotfQotCi1jb25zdCBjaGFyKiBsZWZpUGluX2ZvcmVpZ25PcmllbnRTdHIgKGNvbnN0IDo6bGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpsZWZpUGluKilvYmopLT5mb3JlaWduT3JpZW50U3RyKGluZGV4KTsKLX0KLQotZG91YmxlIGxlZmlQaW5fZm9yZWlnblggKGNvbnN0IDo6bGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpUGluKilvYmopLT5mb3JlaWduWChpbmRleCk7Ci19Ci0KLWRvdWJsZSBsZWZpUGluX2ZvcmVpZ25ZIChjb25zdCA6OmxlZmlQaW4qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+Zm9yZWlnblkoaW5kZXgpOwotfQotCi1jb25zdCBjaGFyKiBsZWZpUGluX0xFUSAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPkxFUSgpOwotfQotCi1jb25zdCBjaGFyKiBsZWZpUGluX2RpcmVjdGlvbiAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmRpcmVjdGlvbigpOwotfQotCi1jb25zdCBjaGFyKiBsZWZpUGluX3VzZSAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPnVzZSgpOwotfQotCi1jb25zdCBjaGFyKiBsZWZpUGluX3NoYXBlIChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+c2hhcGUoKTsKLX0KLQotY29uc3QgY2hhciogbGVmaVBpbl9tdXN0am9pbiAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPm11c3Rqb2luKCk7Ci19Ci0KLWRvdWJsZSBsZWZpUGluX291dE1hcmdpbkhpZ2ggKGNvbnN0IDo6bGVmaVBpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpUGluKilvYmopLT5vdXRNYXJnaW5IaWdoKCk7Ci19Ci0KLWRvdWJsZSBsZWZpUGluX291dE1hcmdpbkxvdyAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPm91dE1hcmdpbkxvdygpOwotfQotCi1kb3VibGUgbGVmaVBpbl9vdXRSZXNpc3RhbmNlSGlnaCAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPm91dFJlc2lzdGFuY2VIaWdoKCk7Ci19Ci0KLWRvdWJsZSBsZWZpUGluX291dFJlc2lzdGFuY2VMb3cgKGNvbnN0IDo6bGVmaVBpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpUGluKilvYmopLT5vdXRSZXNpc3RhbmNlTG93KCk7Ci19Ci0KLWRvdWJsZSBsZWZpUGluX2luTWFyZ2luSGlnaCAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmluTWFyZ2luSGlnaCgpOwotfQotCi1kb3VibGUgbGVmaVBpbl9pbk1hcmdpbkxvdyAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmluTWFyZ2luTG93KCk7Ci19Ci0KLWRvdWJsZSBsZWZpUGluX3Bvd2VyIChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+cG93ZXIoKTsKLX0KLQotZG91YmxlIGxlZmlQaW5fbGVha2FnZSAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmxlYWthZ2UoKTsKLX0KLQotZG91YmxlIGxlZmlQaW5fbWF4bG9hZCAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPm1heGxvYWQoKTsKLX0KLQotZG91YmxlIGxlZmlQaW5fbWF4ZGVsYXkgKGNvbnN0IDo6bGVmaVBpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpUGluKilvYmopLT5tYXhkZWxheSgpOwotfQotCi1kb3VibGUgbGVmaVBpbl9jYXBhY2l0YW5jZSAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmNhcGFjaXRhbmNlKCk7Ci19Ci0KLWRvdWJsZSBsZWZpUGluX3Jlc2lzdGFuY2UgKGNvbnN0IDo6bGVmaVBpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpUGluKilvYmopLT5yZXNpc3RhbmNlKCk7Ci19Ci0KLWRvdWJsZSBsZWZpUGluX3B1bGxkb3ducmVzIChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+cHVsbGRvd25yZXMoKTsKLX0KLQotZG91YmxlIGxlZmlQaW5fdGllb2ZmciAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPnRpZW9mZnIoKTsKLX0KLQotZG91YmxlIGxlZmlQaW5fVkhJIChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+VkhJKCk7Ci19Ci0KLWRvdWJsZSBsZWZpUGluX1ZMTyAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPlZMTygpOwotfQotCi1kb3VibGUgbGVmaVBpbl9yaXNlVm9sdGFnZSAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPnJpc2VWb2x0YWdlKCk7Ci19Ci0KLWRvdWJsZSBsZWZpUGluX2ZhbGxWb2x0YWdlIChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+ZmFsbFZvbHRhZ2UoKTsKLX0KLQotZG91YmxlIGxlZmlQaW5fcmlzZVRocmVzaCAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPnJpc2VUaHJlc2goKTsKLX0KLQotZG91YmxlIGxlZmlQaW5fZmFsbFRocmVzaCAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmZhbGxUaHJlc2goKTsKLX0KLQotZG91YmxlIGxlZmlQaW5fcmlzZVNhdGN1ciAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPnJpc2VTYXRjdXIoKTsKLX0KLQotZG91YmxlIGxlZmlQaW5fZmFsbFNhdGN1ciAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmZhbGxTYXRjdXIoKTsKLX0KLQotZG91YmxlIGxlZmlQaW5fcmlzZVNsZXdMaW1pdCAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPnJpc2VTbGV3TGltaXQoKTsKLX0KLQotZG91YmxlIGxlZmlQaW5fZmFsbFNsZXdMaW1pdCAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmZhbGxTbGV3TGltaXQoKTsKLX0KLQotY29uc3QgY2hhciogbGVmaVBpbl9jdXJyZW50U291cmNlIChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+Y3VycmVudFNvdXJjZSgpOwotfQotCi1jb25zdCBjaGFyKiBsZWZpUGluX3RhYmxlSGlnaE5hbWUgKGNvbnN0IDo6bGVmaVBpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpsZWZpUGluKilvYmopLT50YWJsZUhpZ2hOYW1lKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGxlZmlQaW5fdGFibGVMb3dOYW1lIChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+dGFibGVMb3dOYW1lKCk7Ci19Ci0KLWludCBsZWZpUGluX251bUFudGVubmFTaXplIChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+bnVtQW50ZW5uYVNpemUoKTsKLX0KLQotZG91YmxlIGxlZmlQaW5fYW50ZW5uYVNpemUgKGNvbnN0IDo6bGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpUGluKilvYmopLT5hbnRlbm5hU2l6ZShpbmRleCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGxlZmlQaW5fYW50ZW5uYVNpemVMYXllciAoY29uc3QgOjpsZWZpUGluKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmFudGVubmFTaXplTGF5ZXIoaW5kZXgpOwotfQotCi1pbnQgbGVmaVBpbl9udW1BbnRlbm5hTWV0YWxBcmVhIChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+bnVtQW50ZW5uYU1ldGFsQXJlYSgpOwotfQotCi1kb3VibGUgbGVmaVBpbl9hbnRlbm5hTWV0YWxBcmVhIChjb25zdCA6OmxlZmlQaW4qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+YW50ZW5uYU1ldGFsQXJlYShpbmRleCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGxlZmlQaW5fYW50ZW5uYU1ldGFsQXJlYUxheWVyIChjb25zdCA6OmxlZmlQaW4qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+YW50ZW5uYU1ldGFsQXJlYUxheWVyKGluZGV4KTsKLX0KLQotaW50IGxlZmlQaW5fbnVtQW50ZW5uYU1ldGFsTGVuZ3RoIChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+bnVtQW50ZW5uYU1ldGFsTGVuZ3RoKCk7Ci19Ci0KLWRvdWJsZSBsZWZpUGluX2FudGVubmFNZXRhbExlbmd0aCAoY29uc3QgOjpsZWZpUGluKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmFudGVubmFNZXRhbExlbmd0aChpbmRleCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGxlZmlQaW5fYW50ZW5uYU1ldGFsTGVuZ3RoTGF5ZXIgKGNvbnN0IDo6bGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpsZWZpUGluKilvYmopLT5hbnRlbm5hTWV0YWxMZW5ndGhMYXllcihpbmRleCk7Ci19Ci0KLWludCBsZWZpUGluX251bUFudGVubmFQYXJ0aWFsTWV0YWxBcmVhIChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+bnVtQW50ZW5uYVBhcnRpYWxNZXRhbEFyZWEoKTsKLX0KLQotZG91YmxlIGxlZmlQaW5fYW50ZW5uYVBhcnRpYWxNZXRhbEFyZWEgKGNvbnN0IDo6bGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpUGluKilvYmopLT5hbnRlbm5hUGFydGlhbE1ldGFsQXJlYShpbmRleCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGxlZmlQaW5fYW50ZW5uYVBhcnRpYWxNZXRhbEFyZWFMYXllciAoY29uc3QgOjpsZWZpUGluKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmFudGVubmFQYXJ0aWFsTWV0YWxBcmVhTGF5ZXIoaW5kZXgpOwotfQotCi1pbnQgbGVmaVBpbl9udW1BbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWEgKGNvbnN0IDo6bGVmaVBpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpUGluKilvYmopLT5udW1BbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWEoKTsKLX0KLQotZG91YmxlIGxlZmlQaW5fYW50ZW5uYVBhcnRpYWxNZXRhbFNpZGVBcmVhIChjb25zdCA6OmxlZmlQaW4qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+YW50ZW5uYVBhcnRpYWxNZXRhbFNpZGVBcmVhKGluZGV4KTsKLX0KLQotY29uc3QgY2hhciogbGVmaVBpbl9hbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWFMYXllciAoY29uc3QgOjpsZWZpUGluKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmFudGVubmFQYXJ0aWFsTWV0YWxTaWRlQXJlYUxheWVyKGluZGV4KTsKLX0KLQotaW50IGxlZmlQaW5fbnVtQW50ZW5uYVBhcnRpYWxDdXRBcmVhIChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+bnVtQW50ZW5uYVBhcnRpYWxDdXRBcmVhKCk7Ci19Ci0KLWRvdWJsZSBsZWZpUGluX2FudGVubmFQYXJ0aWFsQ3V0QXJlYSAoY29uc3QgOjpsZWZpUGluKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPmFudGVubmFQYXJ0aWFsQ3V0QXJlYShpbmRleCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGxlZmlQaW5fYW50ZW5uYVBhcnRpYWxDdXRBcmVhTGF5ZXIgKGNvbnN0IDo6bGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpsZWZpUGluKilvYmopLT5hbnRlbm5hUGFydGlhbEN1dEFyZWFMYXllcihpbmRleCk7Ci19Ci0KLWludCBsZWZpUGluX251bUFudGVubmFEaWZmQXJlYSAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPm51bUFudGVubmFEaWZmQXJlYSgpOwotfQotCi1kb3VibGUgbGVmaVBpbl9hbnRlbm5hRGlmZkFyZWEgKGNvbnN0IDo6bGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpUGluKilvYmopLT5hbnRlbm5hRGlmZkFyZWEoaW5kZXgpOwotfQotCi1jb25zdCBjaGFyKiBsZWZpUGluX2FudGVubmFEaWZmQXJlYUxheWVyIChjb25zdCA6OmxlZmlQaW4qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+YW50ZW5uYURpZmZBcmVhTGF5ZXIoaW5kZXgpOwotfQotCi1jb25zdCBjaGFyKiBsZWZpUGluX25ldEV4cHIgKGNvbnN0IDo6bGVmaVBpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpsZWZpUGluKilvYmopLT5uZXRFeHByKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGxlZmlQaW5fc3VwcGx5U2Vuc2l0aXZpdHkgKGNvbnN0IDo6bGVmaVBpbiogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpsZWZpUGluKilvYmopLT5zdXBwbHlTZW5zaXRpdml0eSgpOwotfQotCi1jb25zdCBjaGFyKiBsZWZpUGluX2dyb3VuZFNlbnNpdGl2aXR5IChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+Z3JvdW5kU2Vuc2l0aXZpdHkoKTsKLX0KLQotaW50IGxlZmlQaW5fbnVtQW50ZW5uYU1vZGVsIChjb25zdCA6OmxlZmlQaW4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+bnVtQW50ZW5uYU1vZGVsKCk7Ci19Ci0KLWNvbnN0IDo6bGVmaVBpbkFudGVubmFNb2RlbCogbGVmaVBpbl9hbnRlbm5hTW9kZWwgKGNvbnN0IDo6bGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuIChjb25zdCA6OmxlZmlQaW5BbnRlbm5hTW9kZWwqKSAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+YW50ZW5uYU1vZGVsKGluZGV4KTsKLX0KLQotaW50IGxlZmlQaW5fbnVtUHJvcGVydGllcyAoY29uc3QgOjpsZWZpUGluKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPm51bVByb3BlcnRpZXMoKTsKLX0KLQotY29uc3QgY2hhciogbGVmaVBpbl9wcm9wTmFtZSAoY29uc3QgOjpsZWZpUGluKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPnByb3BOYW1lKGluZGV4KTsKLX0KLQotY29uc3QgY2hhciogbGVmaVBpbl9wcm9wVmFsdWUgKGNvbnN0IDo6bGVmaVBpbiogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpsZWZpUGluKilvYmopLT5wcm9wVmFsdWUoaW5kZXgpOwotfQotCi1kb3VibGUgbGVmaVBpbl9wcm9wTnVtIChjb25zdCA6OmxlZmlQaW4qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+cHJvcE51bShpbmRleCk7Ci19Ci0KLWNvbnN0IGNoYXIgbGVmaVBpbl9wcm9wVHlwZSAoY29uc3QgOjpsZWZpUGluKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlQaW4qKW9iaiktPnByb3BUeXBlKGluZGV4KTsKLX0KLQotaW50IGxlZmlQaW5fcHJvcElzTnVtYmVyIChjb25zdCA6OmxlZmlQaW4qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+cHJvcElzTnVtYmVyKGluZGV4KTsKLX0KLQotaW50IGxlZmlQaW5fcHJvcElzU3RyaW5nIChjb25zdCA6OmxlZmlQaW4qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+cHJvcElzU3RyaW5nKGluZGV4KTsKLX0KLQotdm9pZCBsZWZpUGluX3ByaW50IChjb25zdCA6OmxlZmlQaW4qIG9iaiwgRklMRSogIGYpIHsKLSAgICAoKExlZkRlZlBhcnNlcjo6bGVmaVBpbiopb2JqKS0+cHJpbnQoZik7Ci19Ci0KLWludCBsZWZpRGVuc2l0eV9udW1MYXllciAoY29uc3QgOjpsZWZpRGVuc2l0eSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpRGVuc2l0eSopb2JqKS0+bnVtTGF5ZXIoKTsKLX0KLQotY2hhciogbGVmaURlbnNpdHlfbGF5ZXJOYW1lIChjb25zdCA6OmxlZmlEZW5zaXR5KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlEZW5zaXR5KilvYmopLT5sYXllck5hbWUoaW5kZXgpOwotfQotCi1pbnQgbGVmaURlbnNpdHlfbnVtUmVjdHMgKGNvbnN0IDo6bGVmaURlbnNpdHkqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaURlbnNpdHkqKW9iaiktPm51bVJlY3RzKGluZGV4KTsKLX0KLQotOjpsZWZpR2VvbVJlY3QgbGVmaURlbnNpdHlfZ2V0UmVjdCAoY29uc3QgOjpsZWZpRGVuc2l0eSogb2JqLCBpbnQgIGluZGV4LCBpbnQgIHJlY3RJbmRleCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmaUdlb21SZWN0IHRtcDsKLSAgICB0bXAgPSAoKExlZkRlZlBhcnNlcjo6bGVmaURlbnNpdHkqKW9iaiktPmdldFJlY3QoaW5kZXgsIHJlY3RJbmRleCk7Ci0gICAgcmV0dXJuICooKDo6bGVmaUdlb21SZWN0KikmdG1wKTsKLX0KLQotZG91YmxlIGxlZmlEZW5zaXR5X2RlbnNpdHlWYWx1ZSAoY29uc3QgOjpsZWZpRGVuc2l0eSogb2JqLCBpbnQgIGluZGV4LCBpbnQgIHJlY3RJbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaURlbnNpdHkqKW9iaiktPmRlbnNpdHlWYWx1ZShpbmRleCwgcmVjdEluZGV4KTsKLX0KLQotdm9pZCBsZWZpRGVuc2l0eV9wcmludCAoY29uc3QgOjpsZWZpRGVuc2l0eSogb2JqLCBGSUxFKiAgZikgewotICAgICgoTGVmRGVmUGFyc2VyOjpsZWZpRGVuc2l0eSopb2JqKS0+cHJpbnQoZik7Ci19Ci0KLWludCBsZWZpTWFjcm9faGFzQ2xhc3MgKGNvbnN0IDo6bGVmaU1hY3JvKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlNYWNybyopb2JqKS0+aGFzQ2xhc3MoKTsKLX0KLQotaW50IGxlZmlNYWNyb19oYXNHZW5lcmF0b3IgKGNvbnN0IDo6bGVmaU1hY3JvKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlNYWNybyopb2JqKS0+aGFzR2VuZXJhdG9yKCk7Ci19Ci0KLWludCBsZWZpTWFjcm9faGFzR2VuZXJhdGUgKGNvbnN0IDo6bGVmaU1hY3JvKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlNYWNybyopb2JqKS0+aGFzR2VuZXJhdGUoKTsKLX0KLQotaW50IGxlZmlNYWNyb19oYXNQb3dlciAoY29uc3QgOjpsZWZpTWFjcm8qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaU1hY3JvKilvYmopLT5oYXNQb3dlcigpOwotfQotCi1pbnQgbGVmaU1hY3JvX2hhc09yaWdpbiAoY29uc3QgOjpsZWZpTWFjcm8qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaU1hY3JvKilvYmopLT5oYXNPcmlnaW4oKTsKLX0KLQotaW50IGxlZmlNYWNyb19oYXNFRVEgKGNvbnN0IDo6bGVmaU1hY3JvKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlNYWNybyopb2JqKS0+aGFzRUVRKCk7Ci19Ci0KLWludCBsZWZpTWFjcm9faGFzTEVRIChjb25zdCA6OmxlZmlNYWNybyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTWFjcm8qKW9iaiktPmhhc0xFUSgpOwotfQotCi1pbnQgbGVmaU1hY3JvX2hhc1NvdXJjZSAoY29uc3QgOjpsZWZpTWFjcm8qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaU1hY3JvKilvYmopLT5oYXNTb3VyY2UoKTsKLX0KLQotaW50IGxlZmlNYWNyb19oYXNYU3ltbWV0cnkgKGNvbnN0IDo6bGVmaU1hY3JvKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlNYWNybyopb2JqKS0+aGFzWFN5bW1ldHJ5KCk7Ci19Ci0KLWludCBsZWZpTWFjcm9faGFzWVN5bW1ldHJ5IChjb25zdCA6OmxlZmlNYWNybyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTWFjcm8qKW9iaiktPmhhc1lTeW1tZXRyeSgpOwotfQotCi1pbnQgbGVmaU1hY3JvX2hhczkwU3ltbWV0cnkgKGNvbnN0IDo6bGVmaU1hY3JvKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlNYWNybyopb2JqKS0+aGFzOTBTeW1tZXRyeSgpOwotfQotCi1pbnQgbGVmaU1hY3JvX2hhc1NpdGVOYW1lIChjb25zdCA6OmxlZmlNYWNybyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTWFjcm8qKW9iaiktPmhhc1NpdGVOYW1lKCk7Ci19Ci0KLWludCBsZWZpTWFjcm9faGFzU2l0ZVBhdHRlcm4gKGNvbnN0IDo6bGVmaU1hY3JvKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlNYWNybyopb2JqKS0+aGFzU2l0ZVBhdHRlcm4oKTsKLX0KLQotaW50IGxlZmlNYWNyb19oYXNTaXplIChjb25zdCA6OmxlZmlNYWNybyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTWFjcm8qKW9iaiktPmhhc1NpemUoKTsKLX0KLQotaW50IGxlZmlNYWNyb19oYXNGb3JlaWduIChjb25zdCA6OmxlZmlNYWNybyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTWFjcm8qKW9iaiktPmhhc0ZvcmVpZ24oKTsKLX0KLQotaW50IGxlZmlNYWNyb19oYXNGb3JlaWduT3JpZ2luIChjb25zdCA6OmxlZmlNYWNybyogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTWFjcm8qKW9iaiktPmhhc0ZvcmVpZ25PcmlnaW4oaW5kZXgpOwotfQotCi1pbnQgbGVmaU1hY3JvX2hhc0ZvcmVpZ25PcmllbnQgKGNvbnN0IDo6bGVmaU1hY3JvKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlNYWNybyopb2JqKS0+aGFzRm9yZWlnbk9yaWVudChpbmRleCk7Ci19Ci0KLWludCBsZWZpTWFjcm9faGFzRm9yZWlnblBvaW50IChjb25zdCA6OmxlZmlNYWNybyogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTWFjcm8qKW9iaiktPmhhc0ZvcmVpZ25Qb2ludChpbmRleCk7Ci19Ci0KLWludCBsZWZpTWFjcm9faGFzQ2xvY2tUeXBlIChjb25zdCA6OmxlZmlNYWNybyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTWFjcm8qKW9iaiktPmhhc0Nsb2NrVHlwZSgpOwotfQotCi1pbnQgbGVmaU1hY3JvX2lzQnVmZmVyIChjb25zdCA6OmxlZmlNYWNybyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTWFjcm8qKW9iaiktPmlzQnVmZmVyKCk7Ci19Ci0KLWludCBsZWZpTWFjcm9faXNJbnZlcnRlciAoY29uc3QgOjpsZWZpTWFjcm8qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaU1hY3JvKilvYmopLT5pc0ludmVydGVyKCk7Ci19Ci0KLWludCBsZWZpTWFjcm9faXNGaXhlZE1hc2sgKGNvbnN0IDo6bGVmaU1hY3JvKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlNYWNybyopb2JqKS0+aXNGaXhlZE1hc2soKTsKLX0KLQotaW50IGxlZmlNYWNyb19udW1TaXRlUGF0dGVybiAoY29uc3QgOjpsZWZpTWFjcm8qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaU1hY3JvKilvYmopLT5udW1TaXRlUGF0dGVybigpOwotfQotCi1pbnQgbGVmaU1hY3JvX251bVByb3BlcnRpZXMgKGNvbnN0IDo6bGVmaU1hY3JvKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlNYWNybyopb2JqKS0+bnVtUHJvcGVydGllcygpOwotfQotCi1jb25zdCBjaGFyKiBsZWZpTWFjcm9fcHJvcE5hbWUgKGNvbnN0IDo6bGVmaU1hY3JvKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlNYWNybyopb2JqKS0+cHJvcE5hbWUoaW5kZXgpOwotfQotCi1jb25zdCBjaGFyKiBsZWZpTWFjcm9fcHJvcFZhbHVlIChjb25zdCA6OmxlZmlNYWNybyogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpsZWZpTWFjcm8qKW9iaiktPnByb3BWYWx1ZShpbmRleCk7Ci19Ci0KLWRvdWJsZSBsZWZpTWFjcm9fcHJvcE51bSAoY29uc3QgOjpsZWZpTWFjcm8qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaU1hY3JvKilvYmopLT5wcm9wTnVtKGluZGV4KTsKLX0KLQotY29uc3QgY2hhciBsZWZpTWFjcm9fcHJvcFR5cGUgKGNvbnN0IDo6bGVmaU1hY3JvKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlNYWNybyopb2JqKS0+cHJvcFR5cGUoaW5kZXgpOwotfQotCi1pbnQgbGVmaU1hY3JvX3Byb3BJc051bWJlciAoY29uc3QgOjpsZWZpTWFjcm8qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaU1hY3JvKilvYmopLT5wcm9wSXNOdW1iZXIoaW5kZXgpOwotfQotCi1pbnQgbGVmaU1hY3JvX3Byb3BJc1N0cmluZyAoY29uc3QgOjpsZWZpTWFjcm8qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaU1hY3JvKilvYmopLT5wcm9wSXNTdHJpbmcoaW5kZXgpOwotfQotCi1jb25zdCBjaGFyKiBsZWZpTWFjcm9fbmFtZSAoY29uc3QgOjpsZWZpTWFjcm8qIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6bGVmaU1hY3JvKilvYmopLT5uYW1lKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGxlZmlNYWNyb19tYWNyb0NsYXNzIChjb25zdCA6OmxlZmlNYWNybyogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpsZWZpTWFjcm8qKW9iaiktPm1hY3JvQ2xhc3MoKTsKLX0KLQotY29uc3QgY2hhciogbGVmaU1hY3JvX2dlbmVyYXRvciAoY29uc3QgOjpsZWZpTWFjcm8qIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6bGVmaU1hY3JvKilvYmopLT5nZW5lcmF0b3IoKTsKLX0KLQotY29uc3QgY2hhciogbGVmaU1hY3JvX0VFUSAoY29uc3QgOjpsZWZpTWFjcm8qIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6bGVmaU1hY3JvKilvYmopLT5FRVEoKTsKLX0KLQotY29uc3QgY2hhciogbGVmaU1hY3JvX0xFUSAoY29uc3QgOjpsZWZpTWFjcm8qIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6bGVmaU1hY3JvKilvYmopLT5MRVEoKTsKLX0KLQotY29uc3QgY2hhciogbGVmaU1hY3JvX3NvdXJjZSAoY29uc3QgOjpsZWZpTWFjcm8qIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6bGVmaU1hY3JvKilvYmopLT5zb3VyY2UoKTsKLX0KLQotY29uc3QgY2hhciogbGVmaU1hY3JvX2Nsb2NrVHlwZSAoY29uc3QgOjpsZWZpTWFjcm8qIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6bGVmaU1hY3JvKilvYmopLT5jbG9ja1R5cGUoKTsKLX0KLQotZG91YmxlIGxlZmlNYWNyb19vcmlnaW5YIChjb25zdCA6OmxlZmlNYWNybyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTWFjcm8qKW9iaiktPm9yaWdpblgoKTsKLX0KLQotZG91YmxlIGxlZmlNYWNyb19vcmlnaW5ZIChjb25zdCA6OmxlZmlNYWNybyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTWFjcm8qKW9iaiktPm9yaWdpblkoKTsKLX0KLQotZG91YmxlIGxlZmlNYWNyb19wb3dlciAoY29uc3QgOjpsZWZpTWFjcm8qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaU1hY3JvKilvYmopLT5wb3dlcigpOwotfQotCi12b2lkIGxlZmlNYWNyb19nZW5lcmF0ZSAoY29uc3QgOjpsZWZpTWFjcm8qIG9iaiwgY2hhcioqICBuYW1lMSwgY2hhcioqICBuYW1lMikgewotICAgICgoTGVmRGVmUGFyc2VyOjpsZWZpTWFjcm8qKW9iaiktPmdlbmVyYXRlKG5hbWUxLCBuYW1lMik7Ci19Ci0KLWNvbnN0IDo6bGVmaVNpdGVQYXR0ZXJuKiBsZWZpTWFjcm9fc2l0ZVBhdHRlcm4gKGNvbnN0IDo6bGVmaU1hY3JvKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKGNvbnN0IDo6bGVmaVNpdGVQYXR0ZXJuKikgKChMZWZEZWZQYXJzZXI6OmxlZmlNYWNybyopb2JqKS0+c2l0ZVBhdHRlcm4oaW5kZXgpOwotfQotCi1jb25zdCBjaGFyKiBsZWZpTWFjcm9fc2l0ZU5hbWUgKGNvbnN0IDo6bGVmaU1hY3JvKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlNYWNybyopb2JqKS0+c2l0ZU5hbWUoKTsKLX0KLQotZG91YmxlIGxlZmlNYWNyb19zaXplWCAoY29uc3QgOjpsZWZpTWFjcm8qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaU1hY3JvKilvYmopLT5zaXplWCgpOwotfQotCi1kb3VibGUgbGVmaU1hY3JvX3NpemVZIChjb25zdCA6OmxlZmlNYWNybyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTWFjcm8qKW9iaiktPnNpemVZKCk7Ci19Ci0KLWludCBsZWZpTWFjcm9fbnVtRm9yZWlnbnMgKGNvbnN0IDo6bGVmaU1hY3JvKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlNYWNybyopb2JqKS0+bnVtRm9yZWlnbnMoKTsKLX0KLQotaW50IGxlZmlNYWNyb19mb3JlaWduT3JpZW50IChjb25zdCA6OmxlZmlNYWNybyogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTWFjcm8qKW9iaiktPmZvcmVpZ25PcmllbnQoaW5kZXgpOwotfQotCi1jb25zdCBjaGFyKiBsZWZpTWFjcm9fZm9yZWlnbk9yaWVudFN0ciAoY29uc3QgOjpsZWZpTWFjcm8qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6bGVmaU1hY3JvKilvYmopLT5mb3JlaWduT3JpZW50U3RyKGluZGV4KTsKLX0KLQotZG91YmxlIGxlZmlNYWNyb19mb3JlaWduWCAoY29uc3QgOjpsZWZpTWFjcm8qIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaU1hY3JvKilvYmopLT5mb3JlaWduWChpbmRleCk7Ci19Ci0KLWRvdWJsZSBsZWZpTWFjcm9fZm9yZWlnblkgKGNvbnN0IDo6bGVmaU1hY3JvKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlNYWNybyopb2JqKS0+Zm9yZWlnblkoaW5kZXgpOwotfQotCi1jb25zdCBjaGFyKiBsZWZpTWFjcm9fZm9yZWlnbk5hbWUgKGNvbnN0IDo6bGVmaU1hY3JvKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlNYWNybyopb2JqKS0+Zm9yZWlnbk5hbWUoaW5kZXgpOwotfQotCi12b2lkIGxlZmlNYWNyb19wcmludCAoY29uc3QgOjpsZWZpTWFjcm8qIG9iaiwgRklMRSogIGYpIHsKLSAgICAoKExlZkRlZlBhcnNlcjo6bGVmaU1hY3JvKilvYmopLT5wcmludChmKTsKLX0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYveGxlZmlNaXNjLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL3hsZWZpTWlzYy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZjhhNjkuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYveGxlZmlNaXNjLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM0MyArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIEFUVEVOVElPTjogVEhJUyBJUyBBTiBBVVRPLUdFTkVSQVRFRCBGSUxFLiBETyBOT1QgQ0hBTkdFIElUIQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJCAgCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2RlZmluZSBFWFRFUk4gZXh0ZXJuICJDIgotCi0jaW5jbHVkZSAibGVmaU1pc2MuaCIKLSNpbmNsdWRlICJsZWZpTWlzYy5ocHAiCi0KLS8vIFdyYXBwZXJzIGRlZmluaXRpb25zLgotaW50IGxlZmlHZW9tZXRyaWVzX251bUl0ZW1zIChjb25zdCA6OmxlZmlHZW9tZXRyaWVzKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlHZW9tZXRyaWVzKilvYmopLT5udW1JdGVtcygpOwotfQotCi1lbnVtIDo6bGVmaUdlb21FbnVtIGxlZmlHZW9tZXRyaWVzX2l0ZW1UeXBlIChjb25zdCA6OmxlZmlHZW9tZXRyaWVzKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKDo6bGVmaUdlb21FbnVtKSAoKExlZkRlZlBhcnNlcjo6bGVmaUdlb21ldHJpZXMqKW9iaiktPml0ZW1UeXBlKGluZGV4KTsKLX0KLQotc3RydWN0IDo6bGVmaUdlb21SZWN0KiBsZWZpR2VvbWV0cmllc19nZXRSZWN0IChjb25zdCA6OmxlZmlHZW9tZXRyaWVzKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKDo6bGVmaUdlb21SZWN0KikgKChMZWZEZWZQYXJzZXI6OmxlZmlHZW9tZXRyaWVzKilvYmopLT5nZXRSZWN0KGluZGV4KTsKLX0KLQotc3RydWN0IDo6bGVmaUdlb21SZWN0SXRlciogbGVmaUdlb21ldHJpZXNfZ2V0UmVjdEl0ZXIgKGNvbnN0IDo6bGVmaUdlb21ldHJpZXMqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoOjpsZWZpR2VvbVJlY3RJdGVyKikgKChMZWZEZWZQYXJzZXI6OmxlZmlHZW9tZXRyaWVzKilvYmopLT5nZXRSZWN0SXRlcihpbmRleCk7Ci19Ci0KLXN0cnVjdCA6OmxlZmlHZW9tUGF0aCogbGVmaUdlb21ldHJpZXNfZ2V0UGF0aCAoY29uc3QgOjpsZWZpR2VvbWV0cmllcyogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICg6OmxlZmlHZW9tUGF0aCopICgoTGVmRGVmUGFyc2VyOjpsZWZpR2VvbWV0cmllcyopb2JqKS0+Z2V0UGF0aChpbmRleCk7Ci19Ci0KLXN0cnVjdCA6OmxlZmlHZW9tUGF0aEl0ZXIqIGxlZmlHZW9tZXRyaWVzX2dldFBhdGhJdGVyIChjb25zdCA6OmxlZmlHZW9tZXRyaWVzKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKDo6bGVmaUdlb21QYXRoSXRlciopICgoTGVmRGVmUGFyc2VyOjpsZWZpR2VvbWV0cmllcyopb2JqKS0+Z2V0UGF0aEl0ZXIoaW5kZXgpOwotfQotCi1pbnQgbGVmaUdlb21ldHJpZXNfaGFzTGF5ZXJFeGNlcHRQZ05ldCAoY29uc3QgOjpsZWZpR2VvbWV0cmllcyogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpR2VvbWV0cmllcyopb2JqKS0+aGFzTGF5ZXJFeGNlcHRQZ05ldChpbmRleCk7Ci19Ci0KLWNoYXIqIGxlZmlHZW9tZXRyaWVzX2dldExheWVyIChjb25zdCA6OmxlZmlHZW9tZXRyaWVzKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlHZW9tZXRyaWVzKilvYmopLT5nZXRMYXllcihpbmRleCk7Ci19Ci0KLWRvdWJsZSBsZWZpR2VvbWV0cmllc19nZXRMYXllck1pblNwYWNpbmcgKGNvbnN0IDo6bGVmaUdlb21ldHJpZXMqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUdlb21ldHJpZXMqKW9iaiktPmdldExheWVyTWluU3BhY2luZyhpbmRleCk7Ci19Ci0KLWRvdWJsZSBsZWZpR2VvbWV0cmllc19nZXRMYXllclJ1bGVXaWR0aCAoY29uc3QgOjpsZWZpR2VvbWV0cmllcyogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpR2VvbWV0cmllcyopb2JqKS0+Z2V0TGF5ZXJSdWxlV2lkdGgoaW5kZXgpOwotfQotCi1kb3VibGUgbGVmaUdlb21ldHJpZXNfZ2V0V2lkdGggKGNvbnN0IDo6bGVmaUdlb21ldHJpZXMqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaUdlb21ldHJpZXMqKW9iaiktPmdldFdpZHRoKGluZGV4KTsKLX0KLQotc3RydWN0IDo6bGVmaUdlb21Qb2x5Z29uKiBsZWZpR2VvbWV0cmllc19nZXRQb2x5Z29uIChjb25zdCA6OmxlZmlHZW9tZXRyaWVzKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKDo6bGVmaUdlb21Qb2x5Z29uKikgKChMZWZEZWZQYXJzZXI6OmxlZmlHZW9tZXRyaWVzKilvYmopLT5nZXRQb2x5Z29uKGluZGV4KTsKLX0KLQotc3RydWN0IDo6bGVmaUdlb21Qb2x5Z29uSXRlciogbGVmaUdlb21ldHJpZXNfZ2V0UG9seWdvbkl0ZXIgKGNvbnN0IDo6bGVmaUdlb21ldHJpZXMqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoOjpsZWZpR2VvbVBvbHlnb25JdGVyKikgKChMZWZEZWZQYXJzZXI6OmxlZmlHZW9tZXRyaWVzKilvYmopLT5nZXRQb2x5Z29uSXRlcihpbmRleCk7Ci19Ci0KLWNoYXIqIGxlZmlHZW9tZXRyaWVzX2dldENsYXNzIChjb25zdCA6OmxlZmlHZW9tZXRyaWVzKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlHZW9tZXRyaWVzKilvYmopLT5nZXRDbGFzcyhpbmRleCk7Ci19Ci0KLXN0cnVjdCA6OmxlZmlHZW9tVmlhKiBsZWZpR2VvbWV0cmllc19nZXRWaWEgKGNvbnN0IDo6bGVmaUdlb21ldHJpZXMqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoOjpsZWZpR2VvbVZpYSopICgoTGVmRGVmUGFyc2VyOjpsZWZpR2VvbWV0cmllcyopb2JqKS0+Z2V0VmlhKGluZGV4KTsKLX0KLQotc3RydWN0IDo6bGVmaUdlb21WaWFJdGVyKiBsZWZpR2VvbWV0cmllc19nZXRWaWFJdGVyIChjb25zdCA6OmxlZmlHZW9tZXRyaWVzKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKDo6bGVmaUdlb21WaWFJdGVyKikgKChMZWZEZWZQYXJzZXI6OmxlZmlHZW9tZXRyaWVzKilvYmopLT5nZXRWaWFJdGVyKGluZGV4KTsKLX0KLQotdm9pZCBsZWZpR2VvbWV0cmllc19wcmludCAoY29uc3QgOjpsZWZpR2VvbWV0cmllcyogb2JqLCBGSUxFKiAgZikgewotICAgICgoTGVmRGVmUGFyc2VyOjpsZWZpR2VvbWV0cmllcyopb2JqKS0+cHJpbnQoZik7Ci19Ci0KLWludCBsZWZpU3BhY2luZ19oYXNTdGFjayAoY29uc3QgOjpsZWZpU3BhY2luZyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpU3BhY2luZyopb2JqKS0+aGFzU3RhY2soKTsKLX0KLQotY29uc3QgY2hhciogbGVmaVNwYWNpbmdfbmFtZTEgKGNvbnN0IDo6bGVmaVNwYWNpbmcqIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6bGVmaVNwYWNpbmcqKW9iaiktPm5hbWUxKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGxlZmlTcGFjaW5nX25hbWUyIChjb25zdCA6OmxlZmlTcGFjaW5nKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlTcGFjaW5nKilvYmopLT5uYW1lMigpOwotfQotCi1kb3VibGUgbGVmaVNwYWNpbmdfZGlzdGFuY2UgKGNvbnN0IDo6bGVmaVNwYWNpbmcqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVNwYWNpbmcqKW9iaiktPmRpc3RhbmNlKCk7Ci19Ci0KLXZvaWQgbGVmaVNwYWNpbmdfcHJpbnQgKGNvbnN0IDo6bGVmaVNwYWNpbmcqIG9iaiwgRklMRSogIGYpIHsKLSAgICAoKExlZkRlZlBhcnNlcjo6bGVmaVNwYWNpbmcqKW9iaiktPnByaW50KGYpOwotfQotCi1jb25zdCBjaGFyKiBsZWZpSVJEcm9wX25hbWUgKGNvbnN0IDo6bGVmaUlSRHJvcCogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpsZWZpSVJEcm9wKilvYmopLT5uYW1lKCk7Ci19Ci0KLWRvdWJsZSBsZWZpSVJEcm9wX3ZhbHVlMSAoY29uc3QgOjpsZWZpSVJEcm9wKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlJUkRyb3AqKW9iaiktPnZhbHVlMShpbmRleCk7Ci19Ci0KLWRvdWJsZSBsZWZpSVJEcm9wX3ZhbHVlMiAoY29uc3QgOjpsZWZpSVJEcm9wKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlJUkRyb3AqKW9iaiktPnZhbHVlMihpbmRleCk7Ci19Ci0KLWludCBsZWZpSVJEcm9wX251bVZhbHVlcyAoY29uc3QgOjpsZWZpSVJEcm9wKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlJUkRyb3AqKW9iaiktPm51bVZhbHVlcygpOwotfQotCi12b2lkIGxlZmlJUkRyb3BfcHJpbnQgKGNvbnN0IDo6bGVmaUlSRHJvcCogb2JqLCBGSUxFKiAgZikgewotICAgICgoTGVmRGVmUGFyc2VyOjpsZWZpSVJEcm9wKilvYmopLT5wcmludChmKTsKLX0KLQotZG91YmxlIGxlZmlNaW5GZWF0dXJlX29uZSAoY29uc3QgOjpsZWZpTWluRmVhdHVyZSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTWluRmVhdHVyZSopb2JqKS0+b25lKCk7Ci19Ci0KLWRvdWJsZSBsZWZpTWluRmVhdHVyZV90d28gKGNvbnN0IDo6bGVmaU1pbkZlYXR1cmUqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaU1pbkZlYXR1cmUqKW9iaiktPnR3bygpOwotfQotCi12b2lkIGxlZmlNaW5GZWF0dXJlX3ByaW50IChjb25zdCA6OmxlZmlNaW5GZWF0dXJlKiBvYmosIEZJTEUqICBmKSB7Ci0gICAgKChMZWZEZWZQYXJzZXI6OmxlZmlNaW5GZWF0dXJlKilvYmopLT5wcmludChmKTsKLX0KLQotY29uc3QgY2hhciogbGVmaVNpdGVfbmFtZSAoY29uc3QgOjpsZWZpU2l0ZSogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpsZWZpU2l0ZSopb2JqKS0+bmFtZSgpOwotfQotCi1pbnQgbGVmaVNpdGVfaGFzQ2xhc3MgKGNvbnN0IDo6bGVmaVNpdGUqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVNpdGUqKW9iaiktPmhhc0NsYXNzKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGxlZmlTaXRlX3NpdGVDbGFzcyAoY29uc3QgOjpsZWZpU2l0ZSogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpsZWZpU2l0ZSopb2JqKS0+c2l0ZUNsYXNzKCk7Ci19Ci0KLWRvdWJsZSBsZWZpU2l0ZV9zaXplWCAoY29uc3QgOjpsZWZpU2l0ZSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpU2l0ZSopb2JqKS0+c2l6ZVgoKTsKLX0KLQotZG91YmxlIGxlZmlTaXRlX3NpemVZIChjb25zdCA6OmxlZmlTaXRlKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlTaXRlKilvYmopLT5zaXplWSgpOwotfQotCi1pbnQgbGVmaVNpdGVfaGFzU2l6ZSAoY29uc3QgOjpsZWZpU2l0ZSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpU2l0ZSopb2JqKS0+aGFzU2l6ZSgpOwotfQotCi1pbnQgbGVmaVNpdGVfaGFzWFN5bW1ldHJ5IChjb25zdCA6OmxlZmlTaXRlKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlTaXRlKilvYmopLT5oYXNYU3ltbWV0cnkoKTsKLX0KLQotaW50IGxlZmlTaXRlX2hhc1lTeW1tZXRyeSAoY29uc3QgOjpsZWZpU2l0ZSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpU2l0ZSopb2JqKS0+aGFzWVN5bW1ldHJ5KCk7Ci19Ci0KLWludCBsZWZpU2l0ZV9oYXM5MFN5bW1ldHJ5IChjb25zdCA6OmxlZmlTaXRlKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlTaXRlKilvYmopLT5oYXM5MFN5bW1ldHJ5KCk7Ci19Ci0KLWludCBsZWZpU2l0ZV9oYXNSb3dQYXR0ZXJuIChjb25zdCA6OmxlZmlTaXRlKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlTaXRlKilvYmopLT5oYXNSb3dQYXR0ZXJuKCk7Ci19Ci0KLWludCBsZWZpU2l0ZV9udW1TaXRlcyAoY29uc3QgOjpsZWZpU2l0ZSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpU2l0ZSopb2JqKS0+bnVtU2l0ZXMoKTsKLX0KLQotY2hhciogbGVmaVNpdGVfc2l0ZU5hbWUgKGNvbnN0IDo6bGVmaVNpdGUqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVNpdGUqKW9iaiktPnNpdGVOYW1lKGluZGV4KTsKLX0KLQotaW50IGxlZmlTaXRlX3NpdGVPcmllbnQgKGNvbnN0IDo6bGVmaVNpdGUqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVNpdGUqKW9iaiktPnNpdGVPcmllbnQoaW5kZXgpOwotfQotCi1jaGFyKiBsZWZpU2l0ZV9zaXRlT3JpZW50U3RyIChjb25zdCA6OmxlZmlTaXRlKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlTaXRlKilvYmopLT5zaXRlT3JpZW50U3RyKGluZGV4KTsKLX0KLQotdm9pZCBsZWZpU2l0ZV9wcmludCAoY29uc3QgOjpsZWZpU2l0ZSogb2JqLCBGSUxFKiAgZikgewotICAgICgoTGVmRGVmUGFyc2VyOjpsZWZpU2l0ZSopb2JqKS0+cHJpbnQoZik7Ci19Ci0KLWNvbnN0IGNoYXIqIGxlZmlTaXRlUGF0dGVybl9uYW1lIChjb25zdCA6OmxlZmlTaXRlUGF0dGVybiogb2JqKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpsZWZpU2l0ZVBhdHRlcm4qKW9iaiktPm5hbWUoKTsKLX0KLQotaW50IGxlZmlTaXRlUGF0dGVybl9vcmllbnQgKGNvbnN0IDo6bGVmaVNpdGVQYXR0ZXJuKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlTaXRlUGF0dGVybiopb2JqKS0+b3JpZW50KCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGxlZmlTaXRlUGF0dGVybl9vcmllbnRTdHIgKGNvbnN0IDo6bGVmaVNpdGVQYXR0ZXJuKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlTaXRlUGF0dGVybiopb2JqKS0+b3JpZW50U3RyKCk7Ci19Ci0KLWRvdWJsZSBsZWZpU2l0ZVBhdHRlcm5feCAoY29uc3QgOjpsZWZpU2l0ZVBhdHRlcm4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVNpdGVQYXR0ZXJuKilvYmopLT54KCk7Ci19Ci0KLWRvdWJsZSBsZWZpU2l0ZVBhdHRlcm5feSAoY29uc3QgOjpsZWZpU2l0ZVBhdHRlcm4qIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVNpdGVQYXR0ZXJuKilvYmopLT55KCk7Ci19Ci0KLWludCBsZWZpU2l0ZVBhdHRlcm5faGFzU3RlcFBhdHRlcm4gKGNvbnN0IDo6bGVmaVNpdGVQYXR0ZXJuKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlTaXRlUGF0dGVybiopb2JqKS0+aGFzU3RlcFBhdHRlcm4oKTsKLX0KLQotZG91YmxlIGxlZmlTaXRlUGF0dGVybl94U3RhcnQgKGNvbnN0IDo6bGVmaVNpdGVQYXR0ZXJuKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlTaXRlUGF0dGVybiopb2JqKS0+eFN0YXJ0KCk7Ci19Ci0KLWRvdWJsZSBsZWZpU2l0ZVBhdHRlcm5feVN0YXJ0IChjb25zdCA6OmxlZmlTaXRlUGF0dGVybiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpU2l0ZVBhdHRlcm4qKW9iaiktPnlTdGFydCgpOwotfQotCi1kb3VibGUgbGVmaVNpdGVQYXR0ZXJuX3hTdGVwIChjb25zdCA6OmxlZmlTaXRlUGF0dGVybiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpU2l0ZVBhdHRlcm4qKW9iaiktPnhTdGVwKCk7Ci19Ci0KLWRvdWJsZSBsZWZpU2l0ZVBhdHRlcm5feVN0ZXAgKGNvbnN0IDo6bGVmaVNpdGVQYXR0ZXJuKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlTaXRlUGF0dGVybiopb2JqKS0+eVN0ZXAoKTsKLX0KLQotdm9pZCBsZWZpU2l0ZVBhdHRlcm5fcHJpbnQgKGNvbnN0IDo6bGVmaVNpdGVQYXR0ZXJuKiBvYmosIEZJTEUqICBmKSB7Ci0gICAgKChMZWZEZWZQYXJzZXI6OmxlZmlTaXRlUGF0dGVybiopb2JqKS0+cHJpbnQoZik7Ci19Ci0KLWNvbnN0IGNoYXIqIGxlZmlUcmFja1BhdHRlcm5fbmFtZSAoY29uc3QgOjpsZWZpVHJhY2tQYXR0ZXJuKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlUcmFja1BhdHRlcm4qKW9iaiktPm5hbWUoKTsKLX0KLQotZG91YmxlIGxlZmlUcmFja1BhdHRlcm5fc3RhcnQgKGNvbnN0IDo6bGVmaVRyYWNrUGF0dGVybiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVHJhY2tQYXR0ZXJuKilvYmopLT5zdGFydCgpOwotfQotCi1pbnQgbGVmaVRyYWNrUGF0dGVybl9udW1UcmFja3MgKGNvbnN0IDo6bGVmaVRyYWNrUGF0dGVybiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVHJhY2tQYXR0ZXJuKilvYmopLT5udW1UcmFja3MoKTsKLX0KLQotZG91YmxlIGxlZmlUcmFja1BhdHRlcm5fc3BhY2UgKGNvbnN0IDo6bGVmaVRyYWNrUGF0dGVybiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVHJhY2tQYXR0ZXJuKilvYmopLT5zcGFjZSgpOwotfQotCi1pbnQgbGVmaVRyYWNrUGF0dGVybl9udW1MYXllcnMgKGNvbnN0IDo6bGVmaVRyYWNrUGF0dGVybiogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVHJhY2tQYXR0ZXJuKilvYmopLT5udW1MYXllcnMoKTsKLX0KLQotY29uc3QgY2hhciogbGVmaVRyYWNrUGF0dGVybl9sYXllck5hbWUgKGNvbnN0IDo6bGVmaVRyYWNrUGF0dGVybiogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpsZWZpVHJhY2tQYXR0ZXJuKilvYmopLT5sYXllck5hbWUoaW5kZXgpOwotfQotCi12b2lkIGxlZmlUcmFja1BhdHRlcm5fcHJpbnQgKGNvbnN0IDo6bGVmaVRyYWNrUGF0dGVybiogb2JqLCBGSUxFKiAgZikgewotICAgICgoTGVmRGVmUGFyc2VyOjpsZWZpVHJhY2tQYXR0ZXJuKilvYmopLT5wcmludChmKTsKLX0KLQotY29uc3QgY2hhciogbGVmaUdjZWxsUGF0dGVybl9uYW1lIChjb25zdCA6OmxlZmlHY2VsbFBhdHRlcm4qIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6bGVmaUdjZWxsUGF0dGVybiopb2JqKS0+bmFtZSgpOwotfQotCi1kb3VibGUgbGVmaUdjZWxsUGF0dGVybl9zdGFydCAoY29uc3QgOjpsZWZpR2NlbGxQYXR0ZXJuKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlHY2VsbFBhdHRlcm4qKW9iaiktPnN0YXJ0KCk7Ci19Ci0KLWludCBsZWZpR2NlbGxQYXR0ZXJuX251bUNScyAoY29uc3QgOjpsZWZpR2NlbGxQYXR0ZXJuKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlHY2VsbFBhdHRlcm4qKW9iaiktPm51bUNScygpOwotfQotCi1kb3VibGUgbGVmaUdjZWxsUGF0dGVybl9zcGFjZSAoY29uc3QgOjpsZWZpR2NlbGxQYXR0ZXJuKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlHY2VsbFBhdHRlcm4qKW9iaiktPnNwYWNlKCk7Ci19Ci0KLXZvaWQgbGVmaUdjZWxsUGF0dGVybl9wcmludCAoY29uc3QgOjpsZWZpR2NlbGxQYXR0ZXJuKiBvYmosIEZJTEUqICBmKSB7Ci0gICAgKChMZWZEZWZQYXJzZXI6OmxlZmlHY2VsbFBhdHRlcm4qKW9iaiktPnByaW50KGYpOwotfQotCi1jb25zdCBjaGFyKiBsZWZpVXNlTWluU3BhY2luZ19uYW1lIChjb25zdCA6OmxlZmlVc2VNaW5TcGFjaW5nKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlVc2VNaW5TcGFjaW5nKilvYmopLT5uYW1lKCk7Ci19Ci0KLWludCBsZWZpVXNlTWluU3BhY2luZ192YWx1ZSAoY29uc3QgOjpsZWZpVXNlTWluU3BhY2luZyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVXNlTWluU3BhY2luZyopb2JqKS0+dmFsdWUoKTsKLX0KLQotdm9pZCBsZWZpVXNlTWluU3BhY2luZ19wcmludCAoY29uc3QgOjpsZWZpVXNlTWluU3BhY2luZyogb2JqLCBGSUxFKiAgZikgewotICAgICgoTGVmRGVmUGFyc2VyOjpsZWZpVXNlTWluU3BhY2luZyopb2JqKS0+cHJpbnQoZik7Ci19Ci0KLWludCBsZWZpTWF4U3RhY2tWaWFfbWF4U3RhY2tWaWEgKGNvbnN0IDo6bGVmaU1heFN0YWNrVmlhKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlNYXhTdGFja1ZpYSopb2JqKS0+bWF4U3RhY2tWaWEoKTsKLX0KLQotaW50IGxlZmlNYXhTdGFja1ZpYV9oYXNNYXhTdGFja1ZpYVJhbmdlIChjb25zdCA6OmxlZmlNYXhTdGFja1ZpYSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTWF4U3RhY2tWaWEqKW9iaiktPmhhc01heFN0YWNrVmlhUmFuZ2UoKTsKLX0KLQotY29uc3QgY2hhciogbGVmaU1heFN0YWNrVmlhX21heFN0YWNrVmlhQm90dG9tTGF5ZXIgKGNvbnN0IDo6bGVmaU1heFN0YWNrVmlhKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlNYXhTdGFja1ZpYSopb2JqKS0+bWF4U3RhY2tWaWFCb3R0b21MYXllcigpOwotfQotCi1jb25zdCBjaGFyKiBsZWZpTWF4U3RhY2tWaWFfbWF4U3RhY2tWaWFUb3BMYXllciAoY29uc3QgOjpsZWZpTWF4U3RhY2tWaWEqIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6bGVmaU1heFN0YWNrVmlhKilvYmopLT5tYXhTdGFja1ZpYVRvcExheWVyKCk7Ci19Ci0KLXZvaWQgbGVmaU1heFN0YWNrVmlhX3ByaW50IChjb25zdCA6OmxlZmlNYXhTdGFja1ZpYSogb2JqLCBGSUxFKiAgZikgewotICAgICgoTGVmRGVmUGFyc2VyOjpsZWZpTWF4U3RhY2tWaWEqKW9iaiktPnByaW50KGYpOwotfQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi94bGVmaU5vbkRlZmF1bHQuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYveGxlZmlOb25EZWZhdWx0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEzZWQzMC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi94bGVmaU5vbkRlZmF1bHQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkICAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jZGVmaW5lIEVYVEVSTiBleHRlcm4gIkMiCi0KLSNpbmNsdWRlICJsZWZpTm9uRGVmYXVsdC5oIgotI2luY2x1ZGUgImxlZmlOb25EZWZhdWx0LmhwcCIKLQotLy8gV3JhcHBlcnMgZGVmaW5pdGlvbnMuCi1jb25zdCBjaGFyKiBsZWZpTm9uRGVmYXVsdF9uYW1lIChjb25zdCA6OmxlZmlOb25EZWZhdWx0KiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlOb25EZWZhdWx0KilvYmopLT5uYW1lKCk7Ci19Ci0KLWludCBsZWZpTm9uRGVmYXVsdF9oYXNIYXJkc3BhY2luZyAoY29uc3QgOjpsZWZpTm9uRGVmYXVsdCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTm9uRGVmYXVsdCopb2JqKS0+aGFzSGFyZHNwYWNpbmcoKTsKLX0KLQotaW50IGxlZmlOb25EZWZhdWx0X251bVByb3BzIChjb25zdCA6OmxlZmlOb25EZWZhdWx0KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlOb25EZWZhdWx0KilvYmopLT5udW1Qcm9wcygpOwotfQotCi1jb25zdCBjaGFyKiBsZWZpTm9uRGVmYXVsdF9wcm9wTmFtZSAoY29uc3QgOjpsZWZpTm9uRGVmYXVsdCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpsZWZpTm9uRGVmYXVsdCopb2JqKS0+cHJvcE5hbWUoaW5kZXgpOwotfQotCi1jb25zdCBjaGFyKiBsZWZpTm9uRGVmYXVsdF9wcm9wVmFsdWUgKGNvbnN0IDo6bGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6bGVmaU5vbkRlZmF1bHQqKW9iaiktPnByb3BWYWx1ZShpbmRleCk7Ci19Ci0KLWRvdWJsZSBsZWZpTm9uRGVmYXVsdF9wcm9wTnVtYmVyIChjb25zdCA6OmxlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlOb25EZWZhdWx0KilvYmopLT5wcm9wTnVtYmVyKGluZGV4KTsKLX0KLQotY29uc3QgY2hhciBsZWZpTm9uRGVmYXVsdF9wcm9wVHlwZSAoY29uc3QgOjpsZWZpTm9uRGVmYXVsdCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpsZWZpTm9uRGVmYXVsdCopb2JqKS0+cHJvcFR5cGUoaW5kZXgpOwotfQotCi1pbnQgbGVmaU5vbkRlZmF1bHRfcHJvcElzTnVtYmVyIChjb25zdCA6OmxlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlOb25EZWZhdWx0KilvYmopLT5wcm9wSXNOdW1iZXIoaW5kZXgpOwotfQotCi1pbnQgbGVmaU5vbkRlZmF1bHRfcHJvcElzU3RyaW5nIChjb25zdCA6OmxlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlOb25EZWZhdWx0KilvYmopLT5wcm9wSXNTdHJpbmcoaW5kZXgpOwotfQotCi1pbnQgbGVmaU5vbkRlZmF1bHRfbnVtTGF5ZXJzIChjb25zdCA6OmxlZmlOb25EZWZhdWx0KiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlOb25EZWZhdWx0KilvYmopLT5udW1MYXllcnMoKTsKLX0KLQotY29uc3QgY2hhciogbGVmaU5vbkRlZmF1bHRfbGF5ZXJOYW1lIChjb25zdCA6OmxlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlOb25EZWZhdWx0KilvYmopLT5sYXllck5hbWUoaW5kZXgpOwotfQotCi1pbnQgbGVmaU5vbkRlZmF1bHRfaGFzTGF5ZXJXaWR0aCAoY29uc3QgOjpsZWZpTm9uRGVmYXVsdCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTm9uRGVmYXVsdCopb2JqKS0+aGFzTGF5ZXJXaWR0aChpbmRleCk7Ci19Ci0KLWRvdWJsZSBsZWZpTm9uRGVmYXVsdF9sYXllcldpZHRoIChjb25zdCA6OmxlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlOb25EZWZhdWx0KilvYmopLT5sYXllcldpZHRoKGluZGV4KTsKLX0KLQotaW50IGxlZmlOb25EZWZhdWx0X2hhc0xheWVyU3BhY2luZyAoY29uc3QgOjpsZWZpTm9uRGVmYXVsdCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTm9uRGVmYXVsdCopb2JqKS0+aGFzTGF5ZXJTcGFjaW5nKGluZGV4KTsKLX0KLQotZG91YmxlIGxlZmlOb25EZWZhdWx0X2xheWVyU3BhY2luZyAoY29uc3QgOjpsZWZpTm9uRGVmYXVsdCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTm9uRGVmYXVsdCopb2JqKS0+bGF5ZXJTcGFjaW5nKGluZGV4KTsKLX0KLQotaW50IGxlZmlOb25EZWZhdWx0X2hhc0xheWVyV2lyZUV4dGVuc2lvbiAoY29uc3QgOjpsZWZpTm9uRGVmYXVsdCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTm9uRGVmYXVsdCopb2JqKS0+aGFzTGF5ZXJXaXJlRXh0ZW5zaW9uKGluZGV4KTsKLX0KLQotZG91YmxlIGxlZmlOb25EZWZhdWx0X2xheWVyV2lyZUV4dGVuc2lvbiAoY29uc3QgOjpsZWZpTm9uRGVmYXVsdCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTm9uRGVmYXVsdCopb2JqKS0+bGF5ZXJXaXJlRXh0ZW5zaW9uKGluZGV4KTsKLX0KLQotaW50IGxlZmlOb25EZWZhdWx0X2hhc0xheWVyUmVzaXN0YW5jZSAoY29uc3QgOjpsZWZpTm9uRGVmYXVsdCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTm9uRGVmYXVsdCopb2JqKS0+aGFzTGF5ZXJSZXNpc3RhbmNlKGluZGV4KTsKLX0KLQotZG91YmxlIGxlZmlOb25EZWZhdWx0X2xheWVyUmVzaXN0YW5jZSAoY29uc3QgOjpsZWZpTm9uRGVmYXVsdCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTm9uRGVmYXVsdCopb2JqKS0+bGF5ZXJSZXNpc3RhbmNlKGluZGV4KTsKLX0KLQotaW50IGxlZmlOb25EZWZhdWx0X2hhc0xheWVyQ2FwYWNpdGFuY2UgKGNvbnN0IDo6bGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaU5vbkRlZmF1bHQqKW9iaiktPmhhc0xheWVyQ2FwYWNpdGFuY2UoaW5kZXgpOwotfQotCi1kb3VibGUgbGVmaU5vbkRlZmF1bHRfbGF5ZXJDYXBhY2l0YW5jZSAoY29uc3QgOjpsZWZpTm9uRGVmYXVsdCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTm9uRGVmYXVsdCopb2JqKS0+bGF5ZXJDYXBhY2l0YW5jZShpbmRleCk7Ci19Ci0KLWludCBsZWZpTm9uRGVmYXVsdF9oYXNMYXllckVkZ2VDYXAgKGNvbnN0IDo6bGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaU5vbkRlZmF1bHQqKW9iaiktPmhhc0xheWVyRWRnZUNhcChpbmRleCk7Ci19Ci0KLWRvdWJsZSBsZWZpTm9uRGVmYXVsdF9sYXllckVkZ2VDYXAgKGNvbnN0IDo6bGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaU5vbkRlZmF1bHQqKW9iaiktPmxheWVyRWRnZUNhcChpbmRleCk7Ci19Ci0KLWludCBsZWZpTm9uRGVmYXVsdF9oYXNMYXllckRpYWdXaWR0aCAoY29uc3QgOjpsZWZpTm9uRGVmYXVsdCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTm9uRGVmYXVsdCopb2JqKS0+aGFzTGF5ZXJEaWFnV2lkdGgoaW5kZXgpOwotfQotCi1kb3VibGUgbGVmaU5vbkRlZmF1bHRfbGF5ZXJEaWFnV2lkdGggKGNvbnN0IDo6bGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaU5vbkRlZmF1bHQqKW9iaiktPmxheWVyRGlhZ1dpZHRoKGluZGV4KTsKLX0KLQotaW50IGxlZmlOb25EZWZhdWx0X251bVZpYXMgKGNvbnN0IDo6bGVmaU5vbkRlZmF1bHQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaU5vbkRlZmF1bHQqKW9iaiktPm51bVZpYXMoKTsKLX0KLQotY29uc3QgOjpsZWZpVmlhKiBsZWZpTm9uRGVmYXVsdF92aWFSdWxlIChjb25zdCA6OmxlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKGNvbnN0IDo6bGVmaVZpYSopICgoTGVmRGVmUGFyc2VyOjpsZWZpTm9uRGVmYXVsdCopb2JqKS0+dmlhUnVsZShpbmRleCk7Ci19Ci0KLWludCBsZWZpTm9uRGVmYXVsdF9udW1TcGFjaW5nUnVsZXMgKGNvbnN0IDo6bGVmaU5vbkRlZmF1bHQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaU5vbkRlZmF1bHQqKW9iaiktPm51bVNwYWNpbmdSdWxlcygpOwotfQotCi1jb25zdCA6OmxlZmlTcGFjaW5nKiBsZWZpTm9uRGVmYXVsdF9zcGFjaW5nUnVsZSAoY29uc3QgOjpsZWZpTm9uRGVmYXVsdCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuIChjb25zdCA6OmxlZmlTcGFjaW5nKikgKChMZWZEZWZQYXJzZXI6OmxlZmlOb25EZWZhdWx0KilvYmopLT5zcGFjaW5nUnVsZShpbmRleCk7Ci19Ci0KLWludCBsZWZpTm9uRGVmYXVsdF9udW1Vc2VWaWEgKGNvbnN0IDo6bGVmaU5vbkRlZmF1bHQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaU5vbkRlZmF1bHQqKW9iaiktPm51bVVzZVZpYSgpOwotfQotCi1jb25zdCBjaGFyKiBsZWZpTm9uRGVmYXVsdF92aWFOYW1lIChjb25zdCA6OmxlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlOb25EZWZhdWx0KilvYmopLT52aWFOYW1lKGluZGV4KTsKLX0KLQotaW50IGxlZmlOb25EZWZhdWx0X251bVVzZVZpYVJ1bGUgKGNvbnN0IDo6bGVmaU5vbkRlZmF1bHQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaU5vbkRlZmF1bHQqKW9iaiktPm51bVVzZVZpYVJ1bGUoKTsKLX0KLQotY29uc3QgY2hhciogbGVmaU5vbkRlZmF1bHRfdmlhUnVsZU5hbWUgKGNvbnN0IDo6bGVmaU5vbkRlZmF1bHQqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6bGVmaU5vbkRlZmF1bHQqKW9iaiktPnZpYVJ1bGVOYW1lKGluZGV4KTsKLX0KLQotaW50IGxlZmlOb25EZWZhdWx0X251bU1pbkN1dHMgKGNvbnN0IDo6bGVmaU5vbkRlZmF1bHQqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaU5vbkRlZmF1bHQqKW9iaiktPm51bU1pbkN1dHMoKTsKLX0KLQotY29uc3QgY2hhciogbGVmaU5vbkRlZmF1bHRfY3V0TGF5ZXJOYW1lIChjb25zdCA6OmxlZmlOb25EZWZhdWx0KiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlOb25EZWZhdWx0KilvYmopLT5jdXRMYXllck5hbWUoaW5kZXgpOwotfQotCi1pbnQgbGVmaU5vbkRlZmF1bHRfbnVtQ3V0cyAoY29uc3QgOjpsZWZpTm9uRGVmYXVsdCogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpTm9uRGVmYXVsdCopb2JqKS0+bnVtQ3V0cyhpbmRleCk7Ci19Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL3hsZWZpUHJvcC5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi94bGVmaVByb3AuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWU2YWI3Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL3hsZWZpUHJvcC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIEFUVEVOVElPTjogVEhJUyBJUyBBTiBBVVRPLUdFTkVSQVRFRCBGSUxFLiBETyBOT1QgQ0hBTkdFIElUIQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJCAgCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2RlZmluZSBFWFRFUk4gZXh0ZXJuICJDIgotCi0jaW5jbHVkZSAibGVmaVByb3AuaCIKLSNpbmNsdWRlICJsZWZpUHJvcC5ocHAiCi0KLS8vIFdyYXBwZXJzIGRlZmluaXRpb25zLgotY29uc3QgY2hhciogbGVmaVByb3Bfc3RyaW5nIChjb25zdCA6OmxlZmlQcm9wKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlQcm9wKilvYmopLT5zdHJpbmcoKTsKLX0KLQotY29uc3QgY2hhciogbGVmaVByb3BfcHJvcFR5cGUgKGNvbnN0IDo6bGVmaVByb3AqIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6bGVmaVByb3AqKW9iaiktPnByb3BUeXBlKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGxlZmlQcm9wX3Byb3BOYW1lIChjb25zdCA6OmxlZmlQcm9wKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlQcm9wKilvYmopLT5wcm9wTmFtZSgpOwotfQotCi1jaGFyIGxlZmlQcm9wX2RhdGFUeXBlIChjb25zdCA6OmxlZmlQcm9wKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQcm9wKilvYmopLT5kYXRhVHlwZSgpOwotfQotCi1pbnQgbGVmaVByb3BfaGFzTnVtYmVyIChjb25zdCA6OmxlZmlQcm9wKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQcm9wKilvYmopLT5oYXNOdW1iZXIoKTsKLX0KLQotaW50IGxlZmlQcm9wX2hhc1JhbmdlIChjb25zdCA6OmxlZmlQcm9wKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQcm9wKilvYmopLT5oYXNSYW5nZSgpOwotfQotCi1pbnQgbGVmaVByb3BfaGFzU3RyaW5nIChjb25zdCA6OmxlZmlQcm9wKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQcm9wKilvYmopLT5oYXNTdHJpbmcoKTsKLX0KLQotaW50IGxlZmlQcm9wX2hhc05hbWVNYXBTdHJpbmcgKGNvbnN0IDo6bGVmaVByb3AqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVByb3AqKW9iaiktPmhhc05hbWVNYXBTdHJpbmcoKTsKLX0KLQotZG91YmxlIGxlZmlQcm9wX251bWJlciAoY29uc3QgOjpsZWZpUHJvcCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpUHJvcCopb2JqKS0+bnVtYmVyKCk7Ci19Ci0KLWRvdWJsZSBsZWZpUHJvcF9sZWZ0IChjb25zdCA6OmxlZmlQcm9wKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlQcm9wKilvYmopLT5sZWZ0KCk7Ci19Ci0KLWRvdWJsZSBsZWZpUHJvcF9yaWdodCAoY29uc3QgOjpsZWZpUHJvcCogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpUHJvcCopb2JqKS0+cmlnaHQoKTsKLX0KLQotdm9pZCBsZWZpUHJvcF9wcmludCAoY29uc3QgOjpsZWZpUHJvcCogb2JqLCBGSUxFKiAgZikgewotICAgICgoTGVmRGVmUGFyc2VyOjpsZWZpUHJvcCopb2JqKS0+cHJpbnQoZik7Ci19Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL3hsZWZpUHJvcFR5cGUuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYveGxlZmlQcm9wVHlwZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMWY3OWEuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYveGxlZmlQcm9wVHlwZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIEFUVEVOVElPTjogVEhJUyBJUyBBTiBBVVRPLUdFTkVSQVRFRCBGSUxFLiBETyBOT1QgQ0hBTkdFIElUIQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJCAgCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2RlZmluZSBFWFRFUk4gZXh0ZXJuICJDIgotCi0jaW5jbHVkZSAibGVmaVByb3BUeXBlLmgiCi0jaW5jbHVkZSAibGVmaVByb3BUeXBlLmhwcCIKLQotLy8gV3JhcHBlcnMgZGVmaW5pdGlvbnMuCi1jb25zdCBjaGFyIGxlZmlQcm9wVHlwZV9wcm9wVHlwZSAoY29uc3QgOjpsZWZpUHJvcFR5cGUqIG9iaiwgY2hhciogIG5hbWUpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlQcm9wVHlwZSopb2JqKS0+cHJvcFR5cGUobmFtZSk7Ci19Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL3hsZWZpVW5pdHMuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYveGxlZmlVbml0cy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZDg1NmIuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYveGxlZmlVbml0cy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBBVFRFTlRJT046IFRISVMgSVMgQU4gQVVUTy1HRU5FUkFURUQgRklMRS4gRE8gTk9UIENIQU5HRSBJVCEKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTIsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQgIAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNkZWZpbmUgRVhURVJOIGV4dGVybiAiQyIKLQotI2luY2x1ZGUgImxlZmlVbml0cy5oIgotI2luY2x1ZGUgImxlZmlVbml0cy5ocHAiCi0KLS8vIFdyYXBwZXJzIGRlZmluaXRpb25zLgotaW50IGxlZmlVbml0c19oYXNEYXRhYmFzZSAoY29uc3QgOjpsZWZpVW5pdHMqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVVuaXRzKilvYmopLT5oYXNEYXRhYmFzZSgpOwotfQotCi1pbnQgbGVmaVVuaXRzX2hhc0NhcGFjaXRhbmNlIChjb25zdCA6OmxlZmlVbml0cyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVW5pdHMqKW9iaiktPmhhc0NhcGFjaXRhbmNlKCk7Ci19Ci0KLWludCBsZWZpVW5pdHNfaGFzUmVzaXN0YW5jZSAoY29uc3QgOjpsZWZpVW5pdHMqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVVuaXRzKilvYmopLT5oYXNSZXNpc3RhbmNlKCk7Ci19Ci0KLWludCBsZWZpVW5pdHNfaGFzVGltZSAoY29uc3QgOjpsZWZpVW5pdHMqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVVuaXRzKilvYmopLT5oYXNUaW1lKCk7Ci19Ci0KLWludCBsZWZpVW5pdHNfaGFzUG93ZXIgKGNvbnN0IDo6bGVmaVVuaXRzKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlVbml0cyopb2JqKS0+aGFzUG93ZXIoKTsKLX0KLQotaW50IGxlZmlVbml0c19oYXNDdXJyZW50IChjb25zdCA6OmxlZmlVbml0cyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVW5pdHMqKW9iaiktPmhhc0N1cnJlbnQoKTsKLX0KLQotaW50IGxlZmlVbml0c19oYXNWb2x0YWdlIChjb25zdCA6OmxlZmlVbml0cyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVW5pdHMqKW9iaiktPmhhc1ZvbHRhZ2UoKTsKLX0KLQotaW50IGxlZmlVbml0c19oYXNGcmVxdWVuY3kgKGNvbnN0IDo6bGVmaVVuaXRzKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlVbml0cyopb2JqKS0+aGFzRnJlcXVlbmN5KCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGxlZmlVbml0c19kYXRhYmFzZU5hbWUgKGNvbnN0IDo6bGVmaVVuaXRzKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlVbml0cyopb2JqKS0+ZGF0YWJhc2VOYW1lKCk7Ci19Ci0KLWRvdWJsZSBsZWZpVW5pdHNfZGF0YWJhc2VOdW1iZXIgKGNvbnN0IDo6bGVmaVVuaXRzKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlVbml0cyopb2JqKS0+ZGF0YWJhc2VOdW1iZXIoKTsKLX0KLQotZG91YmxlIGxlZmlVbml0c19jYXBhY2l0YW5jZSAoY29uc3QgOjpsZWZpVW5pdHMqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVVuaXRzKilvYmopLT5jYXBhY2l0YW5jZSgpOwotfQotCi1kb3VibGUgbGVmaVVuaXRzX3Jlc2lzdGFuY2UgKGNvbnN0IDo6bGVmaVVuaXRzKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlVbml0cyopb2JqKS0+cmVzaXN0YW5jZSgpOwotfQotCi1kb3VibGUgbGVmaVVuaXRzX3RpbWUgKGNvbnN0IDo6bGVmaVVuaXRzKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlVbml0cyopb2JqKS0+dGltZSgpOwotfQotCi1kb3VibGUgbGVmaVVuaXRzX3Bvd2VyIChjb25zdCA6OmxlZmlVbml0cyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVW5pdHMqKW9iaiktPnBvd2VyKCk7Ci19Ci0KLWRvdWJsZSBsZWZpVW5pdHNfY3VycmVudCAoY29uc3QgOjpsZWZpVW5pdHMqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVVuaXRzKilvYmopLT5jdXJyZW50KCk7Ci19Ci0KLWRvdWJsZSBsZWZpVW5pdHNfdm9sdGFnZSAoY29uc3QgOjpsZWZpVW5pdHMqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVVuaXRzKilvYmopLT52b2x0YWdlKCk7Ci19Ci0KLWRvdWJsZSBsZWZpVW5pdHNfZnJlcXVlbmN5IChjb25zdCA6OmxlZmlVbml0cyogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVW5pdHMqKW9iaiktPmZyZXF1ZW5jeSgpOwotfQotCi12b2lkIGxlZmlVbml0c19wcmludCAoY29uc3QgOjpsZWZpVW5pdHMqIG9iaiwgRklMRSogIGYpIHsKLSAgICAoKExlZkRlZlBhcnNlcjo6bGVmaVVuaXRzKilvYmopLT5wcmludChmKTsKLX0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYveGxlZmlVdGlsLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL3hsZWZpVXRpbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NDE2ZjMuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYveGxlZmlVdGlsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkICAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jZGVmaW5lIEVYVEVSTiBleHRlcm4gIkMiCi0KLSNpbmNsdWRlICJsZWZpVXRpbC5oIgotI2luY2x1ZGUgImxlZmlVdGlsLmhwcCIKLQotLy8gV3JhcHBlcnMgZGVmaW5pdGlvbnMuCi1pbnQgbGVmaVZhbGlkVXNlciAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmaVZhbGlkVXNlcigpOwotfQotCi1jaGFyKiBsZWZpVXNlciAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmaVVzZXIoKTsKLX0KLQotY2hhciogbGVmaU9yaWVudFN0ciAoaW50ICBvcmllbnQpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZpT3JpZW50U3RyKG9yaWVudCk7Ci19Ci0KLWRvdWJsZSBjb252ZXJ0X25hbWUybnVtIChjb25zdCBjaGFyICogdmVyc2lvbk5hbWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpjb252ZXJ0X25hbWUybnVtKHZlcnNpb25OYW1lKTsKLX0KLQotYm9vbCAgdmFsaWRhdGVNYXNrTnVtYmVyIChpbnQgIG51bSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OnZhbGlkYXRlTWFza051bWJlcihudW0pOwotfQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi94bGVmaVZpYS5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi94bGVmaVZpYS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYTZjOTEuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYveGxlZmlWaWEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkICAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jZGVmaW5lIEVYVEVSTiBleHRlcm4gIkMiCi0KLSNpbmNsdWRlICJsZWZpVmlhLmgiCi0jaW5jbHVkZSAibGVmaVZpYS5ocHAiCi0KLS8vIFdyYXBwZXJzIGRlZmluaXRpb25zLgotc3RydWN0IDo6bGVmaUdlb21Qb2x5Z29uKiBsZWZpVmlhTGF5ZXJfZ2V0UG9seWdvbiAoY29uc3QgOjpsZWZpVmlhTGF5ZXIqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoOjpsZWZpR2VvbVBvbHlnb24qKSAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYUxheWVyKilvYmopLT5nZXRQb2x5Z29uKGluZGV4KTsKLX0KLQotaW50IGxlZmlWaWFfaGFzRGVmYXVsdCAoY29uc3QgOjpsZWZpVmlhKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlWaWEqKW9iaiktPmhhc0RlZmF1bHQoKTsKLX0KLQotaW50IGxlZmlWaWFfaGFzR2VuZXJhdGVkIChjb25zdCA6OmxlZmlWaWEqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYSopb2JqKS0+aGFzR2VuZXJhdGVkKCk7Ci19Ci0KLWludCBsZWZpVmlhX2hhc0ZvcmVpZ24gKGNvbnN0IDo6bGVmaVZpYSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVmlhKilvYmopLT5oYXNGb3JlaWduKCk7Ci19Ci0KLWludCBsZWZpVmlhX2hhc0ZvcmVpZ25QbnQgKGNvbnN0IDo6bGVmaVZpYSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVmlhKilvYmopLT5oYXNGb3JlaWduUG50KCk7Ci19Ci0KLWludCBsZWZpVmlhX2hhc0ZvcmVpZ25PcmllbnQgKGNvbnN0IDo6bGVmaVZpYSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVmlhKilvYmopLT5oYXNGb3JlaWduT3JpZW50KCk7Ci19Ci0KLWludCBsZWZpVmlhX2hhc1Byb3BlcnRpZXMgKGNvbnN0IDo6bGVmaVZpYSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVmlhKilvYmopLT5oYXNQcm9wZXJ0aWVzKCk7Ci19Ci0KLWludCBsZWZpVmlhX2hhc1Jlc2lzdGFuY2UgKGNvbnN0IDo6bGVmaVZpYSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVmlhKilvYmopLT5oYXNSZXNpc3RhbmNlKCk7Ci19Ci0KLWludCBsZWZpVmlhX2hhc1RvcE9mU3RhY2sgKGNvbnN0IDo6bGVmaVZpYSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVmlhKilvYmopLT5oYXNUb3BPZlN0YWNrKCk7Ci19Ci0KLWludCBsZWZpVmlhX251bUxheWVycyAoY29uc3QgOjpsZWZpVmlhKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlWaWEqKW9iaiktPm51bUxheWVycygpOwotfQotCi1jaGFyKiBsZWZpVmlhX2xheWVyTmFtZSAoY29uc3QgOjpsZWZpVmlhKiBvYmosIGludCAgbGF5ZXJOdW0pIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlWaWEqKW9iaiktPmxheWVyTmFtZShsYXllck51bSk7Ci19Ci0KLWludCBsZWZpVmlhX251bVJlY3RzIChjb25zdCA6OmxlZmlWaWEqIG9iaiwgaW50ICBsYXllck51bSkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYSopb2JqKS0+bnVtUmVjdHMobGF5ZXJOdW0pOwotfQotCi1kb3VibGUgbGVmaVZpYV94bCAoY29uc3QgOjpsZWZpVmlhKiBvYmosIGludCAgbGF5ZXJOdW0sIGludCAgcmVjdE51bSkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYSopb2JqKS0+eGwobGF5ZXJOdW0sIHJlY3ROdW0pOwotfQotCi1kb3VibGUgbGVmaVZpYV95bCAoY29uc3QgOjpsZWZpVmlhKiBvYmosIGludCAgbGF5ZXJOdW0sIGludCAgcmVjdE51bSkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYSopb2JqKS0+eWwobGF5ZXJOdW0sIHJlY3ROdW0pOwotfQotCi1kb3VibGUgbGVmaVZpYV94aCAoY29uc3QgOjpsZWZpVmlhKiBvYmosIGludCAgbGF5ZXJOdW0sIGludCAgcmVjdE51bSkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYSopb2JqKS0+eGgobGF5ZXJOdW0sIHJlY3ROdW0pOwotfQotCi1kb3VibGUgbGVmaVZpYV95aCAoY29uc3QgOjpsZWZpVmlhKiBvYmosIGludCAgbGF5ZXJOdW0sIGludCAgcmVjdE51bSkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYSopb2JqKS0+eWgobGF5ZXJOdW0sIHJlY3ROdW0pOwotfQotCi1pbnQgbGVmaVZpYV9yZWN0Q29sb3JNYXNrIChjb25zdCA6OmxlZmlWaWEqIG9iaiwgaW50ICBsYXllck51bSwgaW50ICByZWN0TnVtKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVmlhKilvYmopLT5yZWN0Q29sb3JNYXNrKGxheWVyTnVtLCByZWN0TnVtKTsKLX0KLQotaW50IGxlZmlWaWFfcG9seUNvbG9yTWFzayAoY29uc3QgOjpsZWZpVmlhKiBvYmosIGludCAgbGF5ZXJOdW0sIGludCAgcG9seU51bSkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYSopb2JqKS0+cG9seUNvbG9yTWFzayhsYXllck51bSwgcG9seU51bSk7Ci19Ci0KLWludCBsZWZpVmlhX251bVBvbHlnb25zIChjb25zdCA6OmxlZmlWaWEqIG9iaiwgaW50ICBsYXllck51bSkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYSopb2JqKS0+bnVtUG9seWdvbnMobGF5ZXJOdW0pOwotfQotCi06OmxlZmlHZW9tUG9seWdvbiBsZWZpVmlhX2dldFBvbHlnb24gKGNvbnN0IDo6bGVmaVZpYSogb2JqLCBpbnQgIGxheWVyTnVtLCBpbnQgIHBvbHlOdW0pIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZmlHZW9tUG9seWdvbiB0bXA7Ci0gICAgdG1wID0gKChMZWZEZWZQYXJzZXI6OmxlZmlWaWEqKW9iaiktPmdldFBvbHlnb24obGF5ZXJOdW0sIHBvbHlOdW0pOwotICAgIHJldHVybiAqKCg6OmxlZmlHZW9tUG9seWdvbiopJnRtcCk7Ci19Ci0KLWNoYXIqIGxlZmlWaWFfbmFtZSAoY29uc3QgOjpsZWZpVmlhKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlWaWEqKW9iaiktPm5hbWUoKTsKLX0KLQotZG91YmxlIGxlZmlWaWFfcmVzaXN0YW5jZSAoY29uc3QgOjpsZWZpVmlhKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlWaWEqKW9iaiktPnJlc2lzdGFuY2UoKTsKLX0KLQotaW50IGxlZmlWaWFfbnVtUHJvcGVydGllcyAoY29uc3QgOjpsZWZpVmlhKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlWaWEqKW9iaiktPm51bVByb3BlcnRpZXMoKTsKLX0KLQotY2hhciogbGVmaVZpYV9wcm9wTmFtZSAoY29uc3QgOjpsZWZpVmlhKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlWaWEqKW9iaiktPnByb3BOYW1lKGluZGV4KTsKLX0KLQotY2hhciogbGVmaVZpYV9wcm9wVmFsdWUgKGNvbnN0IDo6bGVmaVZpYSogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVmlhKilvYmopLT5wcm9wVmFsdWUoaW5kZXgpOwotfQotCi1kb3VibGUgbGVmaVZpYV9wcm9wTnVtYmVyIChjb25zdCA6OmxlZmlWaWEqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYSopb2JqKS0+cHJvcE51bWJlcihpbmRleCk7Ci19Ci0KLWNoYXIgbGVmaVZpYV9wcm9wVHlwZSAoY29uc3QgOjpsZWZpVmlhKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlWaWEqKW9iaiktPnByb3BUeXBlKGluZGV4KTsKLX0KLQotaW50IGxlZmlWaWFfcHJvcElzTnVtYmVyIChjb25zdCA6OmxlZmlWaWEqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYSopb2JqKS0+cHJvcElzTnVtYmVyKGluZGV4KTsKLX0KLQotaW50IGxlZmlWaWFfcHJvcElzU3RyaW5nIChjb25zdCA6OmxlZmlWaWEqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYSopb2JqKS0+cHJvcElzU3RyaW5nKGluZGV4KTsKLX0KLQotY2hhciogbGVmaVZpYV9mb3JlaWduIChjb25zdCA6OmxlZmlWaWEqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYSopb2JqKS0+Zm9yZWlnbigpOwotfQotCi1kb3VibGUgbGVmaVZpYV9mb3JlaWduWCAoY29uc3QgOjpsZWZpVmlhKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlWaWEqKW9iaiktPmZvcmVpZ25YKCk7Ci19Ci0KLWRvdWJsZSBsZWZpVmlhX2ZvcmVpZ25ZIChjb25zdCA6OmxlZmlWaWEqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYSopb2JqKS0+Zm9yZWlnblkoKTsKLX0KLQotaW50IGxlZmlWaWFfZm9yZWlnbk9yaWVudCAoY29uc3QgOjpsZWZpVmlhKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlWaWEqKW9iaiktPmZvcmVpZ25PcmllbnQoKTsKLX0KLQotY2hhciogbGVmaVZpYV9mb3JlaWduT3JpZW50U3RyIChjb25zdCA6OmxlZmlWaWEqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYSopb2JqKS0+Zm9yZWlnbk9yaWVudFN0cigpOwotfQotCi1pbnQgbGVmaVZpYV9oYXNWaWFSdWxlIChjb25zdCA6OmxlZmlWaWEqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYSopb2JqKS0+aGFzVmlhUnVsZSgpOwotfQotCi1jb25zdCBjaGFyKiBsZWZpVmlhX3ZpYVJ1bGVOYW1lIChjb25zdCA6OmxlZmlWaWEqIG9iaikgewotICAgIHJldHVybiAoKGNvbnN0IExlZkRlZlBhcnNlcjo6bGVmaVZpYSopb2JqKS0+dmlhUnVsZU5hbWUoKTsKLX0KLQotZG91YmxlIGxlZmlWaWFfeEN1dFNpemUgKGNvbnN0IDo6bGVmaVZpYSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVmlhKilvYmopLT54Q3V0U2l6ZSgpOwotfQotCi1kb3VibGUgbGVmaVZpYV95Q3V0U2l6ZSAoY29uc3QgOjpsZWZpVmlhKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlWaWEqKW9iaiktPnlDdXRTaXplKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGxlZmlWaWFfYm90TWV0YWxMYXllciAoY29uc3QgOjpsZWZpVmlhKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlWaWEqKW9iaiktPmJvdE1ldGFsTGF5ZXIoKTsKLX0KLQotY29uc3QgY2hhciogbGVmaVZpYV9jdXRMYXllciAoY29uc3QgOjpsZWZpVmlhKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlWaWEqKW9iaiktPmN1dExheWVyKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGxlZmlWaWFfdG9wTWV0YWxMYXllciAoY29uc3QgOjpsZWZpVmlhKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlWaWEqKW9iaiktPnRvcE1ldGFsTGF5ZXIoKTsKLX0KLQotZG91YmxlIGxlZmlWaWFfeEN1dFNwYWNpbmcgKGNvbnN0IDo6bGVmaVZpYSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVmlhKilvYmopLT54Q3V0U3BhY2luZygpOwotfQotCi1kb3VibGUgbGVmaVZpYV95Q3V0U3BhY2luZyAoY29uc3QgOjpsZWZpVmlhKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlWaWEqKW9iaiktPnlDdXRTcGFjaW5nKCk7Ci19Ci0KLWRvdWJsZSBsZWZpVmlhX3hCb3RFbmMgKGNvbnN0IDo6bGVmaVZpYSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVmlhKilvYmopLT54Qm90RW5jKCk7Ci19Ci0KLWRvdWJsZSBsZWZpVmlhX3lCb3RFbmMgKGNvbnN0IDo6bGVmaVZpYSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVmlhKilvYmopLT55Qm90RW5jKCk7Ci19Ci0KLWRvdWJsZSBsZWZpVmlhX3hUb3BFbmMgKGNvbnN0IDo6bGVmaVZpYSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVmlhKilvYmopLT54VG9wRW5jKCk7Ci19Ci0KLWRvdWJsZSBsZWZpVmlhX3lUb3BFbmMgKGNvbnN0IDo6bGVmaVZpYSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVmlhKilvYmopLT55VG9wRW5jKCk7Ci19Ci0KLWludCBsZWZpVmlhX2hhc1Jvd0NvbCAoY29uc3QgOjpsZWZpVmlhKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlWaWEqKW9iaiktPmhhc1Jvd0NvbCgpOwotfQotCi1pbnQgbGVmaVZpYV9udW1DdXRSb3dzIChjb25zdCA6OmxlZmlWaWEqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYSopb2JqKS0+bnVtQ3V0Um93cygpOwotfQotCi1pbnQgbGVmaVZpYV9udW1DdXRDb2xzIChjb25zdCA6OmxlZmlWaWEqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYSopb2JqKS0+bnVtQ3V0Q29scygpOwotfQotCi1pbnQgbGVmaVZpYV9oYXNPcmlnaW4gKGNvbnN0IDo6bGVmaVZpYSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVmlhKilvYmopLT5oYXNPcmlnaW4oKTsKLX0KLQotZG91YmxlIGxlZmlWaWFfeE9mZnNldCAoY29uc3QgOjpsZWZpVmlhKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlWaWEqKW9iaiktPnhPZmZzZXQoKTsKLX0KLQotZG91YmxlIGxlZmlWaWFfeU9mZnNldCAoY29uc3QgOjpsZWZpVmlhKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlWaWEqKW9iaiktPnlPZmZzZXQoKTsKLX0KLQotaW50IGxlZmlWaWFfaGFzT2Zmc2V0IChjb25zdCA6OmxlZmlWaWEqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYSopb2JqKS0+aGFzT2Zmc2V0KCk7Ci19Ci0KLWRvdWJsZSBsZWZpVmlhX3hCb3RPZmZzZXQgKGNvbnN0IDo6bGVmaVZpYSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVmlhKilvYmopLT54Qm90T2Zmc2V0KCk7Ci19Ci0KLWRvdWJsZSBsZWZpVmlhX3lCb3RPZmZzZXQgKGNvbnN0IDo6bGVmaVZpYSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVmlhKilvYmopLT55Qm90T2Zmc2V0KCk7Ci19Ci0KLWRvdWJsZSBsZWZpVmlhX3hUb3BPZmZzZXQgKGNvbnN0IDo6bGVmaVZpYSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVmlhKilvYmopLT54VG9wT2Zmc2V0KCk7Ci19Ci0KLWRvdWJsZSBsZWZpVmlhX3lUb3BPZmZzZXQgKGNvbnN0IDo6bGVmaVZpYSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVmlhKilvYmopLT55VG9wT2Zmc2V0KCk7Ci19Ci0KLWludCBsZWZpVmlhX2hhc0N1dFBhdHRlcm4gKGNvbnN0IDo6bGVmaVZpYSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVmlhKilvYmopLT5oYXNDdXRQYXR0ZXJuKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGxlZmlWaWFfY3V0UGF0dGVybiAoY29uc3QgOjpsZWZpVmlhKiBvYmopIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlWaWEqKW9iaiktPmN1dFBhdHRlcm4oKTsKLX0KLQotdm9pZCBsZWZpVmlhX3ByaW50IChjb25zdCA6OmxlZmlWaWEqIG9iaiwgRklMRSogIGYpIHsKLSAgICAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYSopb2JqKS0+cHJpbnQoZik7Ci19Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL3hsZWZpVmlhUnVsZS5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi94bGVmaVZpYVJ1bGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzQxMjYzLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL3hsZWZpVmlhUnVsZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBBVFRFTlRJT046IFRISVMgSVMgQU4gQVVUTy1HRU5FUkFURUQgRklMRS4gRE8gTk9UIENIQU5HRSBJVCEKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTIsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQgIAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNkZWZpbmUgRVhURVJOIGV4dGVybiAiQyIKLQotI2luY2x1ZGUgImxlZmlWaWFSdWxlLmgiCi0jaW5jbHVkZSAibGVmaVZpYVJ1bGUuaHBwIgotCi0vLyBXcmFwcGVycyBkZWZpbml0aW9ucy4KLWludCBsZWZpVmlhUnVsZUxheWVyX2hhc0RpcmVjdGlvbiAoY29uc3QgOjpsZWZpVmlhUnVsZUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlWaWFSdWxlTGF5ZXIqKW9iaiktPmhhc0RpcmVjdGlvbigpOwotfQotCi1pbnQgbGVmaVZpYVJ1bGVMYXllcl9oYXNFbmNsb3N1cmUgKGNvbnN0IDo6bGVmaVZpYVJ1bGVMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVmlhUnVsZUxheWVyKilvYmopLT5oYXNFbmNsb3N1cmUoKTsKLX0KLQotaW50IGxlZmlWaWFSdWxlTGF5ZXJfaGFzV2lkdGggKGNvbnN0IDo6bGVmaVZpYVJ1bGVMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVmlhUnVsZUxheWVyKilvYmopLT5oYXNXaWR0aCgpOwotfQotCi1pbnQgbGVmaVZpYVJ1bGVMYXllcl9oYXNSZXNpc3RhbmNlIChjb25zdCA6OmxlZmlWaWFSdWxlTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYVJ1bGVMYXllciopb2JqKS0+aGFzUmVzaXN0YW5jZSgpOwotfQotCi1pbnQgbGVmaVZpYVJ1bGVMYXllcl9oYXNPdmVyaGFuZyAoY29uc3QgOjpsZWZpVmlhUnVsZUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlWaWFSdWxlTGF5ZXIqKW9iaiktPmhhc092ZXJoYW5nKCk7Ci19Ci0KLWludCBsZWZpVmlhUnVsZUxheWVyX2hhc01ldGFsT3ZlcmhhbmcgKGNvbnN0IDo6bGVmaVZpYVJ1bGVMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVmlhUnVsZUxheWVyKilvYmopLT5oYXNNZXRhbE92ZXJoYW5nKCk7Ci19Ci0KLWludCBsZWZpVmlhUnVsZUxheWVyX2hhc1NwYWNpbmcgKGNvbnN0IDo6bGVmaVZpYVJ1bGVMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVmlhUnVsZUxheWVyKilvYmopLT5oYXNTcGFjaW5nKCk7Ci19Ci0KLWludCBsZWZpVmlhUnVsZUxheWVyX2hhc1JlY3QgKGNvbnN0IDo6bGVmaVZpYVJ1bGVMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVmlhUnVsZUxheWVyKilvYmopLT5oYXNSZWN0KCk7Ci19Ci0KLWNoYXIqIGxlZmlWaWFSdWxlTGF5ZXJfbmFtZSAoY29uc3QgOjpsZWZpVmlhUnVsZUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlWaWFSdWxlTGF5ZXIqKW9iaiktPm5hbWUoKTsKLX0KLQotaW50IGxlZmlWaWFSdWxlTGF5ZXJfaXNIb3Jpem9udGFsIChjb25zdCA6OmxlZmlWaWFSdWxlTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYVJ1bGVMYXllciopb2JqKS0+aXNIb3Jpem9udGFsKCk7Ci19Ci0KLWludCBsZWZpVmlhUnVsZUxheWVyX2lzVmVydGljYWwgKGNvbnN0IDo6bGVmaVZpYVJ1bGVMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVmlhUnVsZUxheWVyKilvYmopLT5pc1ZlcnRpY2FsKCk7Ci19Ci0KLWRvdWJsZSBsZWZpVmlhUnVsZUxheWVyX2VuY2xvc3VyZU92ZXJoYW5nMSAoY29uc3QgOjpsZWZpVmlhUnVsZUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlWaWFSdWxlTGF5ZXIqKW9iaiktPmVuY2xvc3VyZU92ZXJoYW5nMSgpOwotfQotCi1kb3VibGUgbGVmaVZpYVJ1bGVMYXllcl9lbmNsb3N1cmVPdmVyaGFuZzIgKGNvbnN0IDo6bGVmaVZpYVJ1bGVMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVmlhUnVsZUxheWVyKilvYmopLT5lbmNsb3N1cmVPdmVyaGFuZzIoKTsKLX0KLQotZG91YmxlIGxlZmlWaWFSdWxlTGF5ZXJfd2lkdGhNaW4gKGNvbnN0IDo6bGVmaVZpYVJ1bGVMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVmlhUnVsZUxheWVyKilvYmopLT53aWR0aE1pbigpOwotfQotCi1kb3VibGUgbGVmaVZpYVJ1bGVMYXllcl93aWR0aE1heCAoY29uc3QgOjpsZWZpVmlhUnVsZUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlWaWFSdWxlTGF5ZXIqKW9iaiktPndpZHRoTWF4KCk7Ci19Ci0KLWRvdWJsZSBsZWZpVmlhUnVsZUxheWVyX292ZXJoYW5nIChjb25zdCA6OmxlZmlWaWFSdWxlTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYVJ1bGVMYXllciopb2JqKS0+b3ZlcmhhbmcoKTsKLX0KLQotZG91YmxlIGxlZmlWaWFSdWxlTGF5ZXJfbWV0YWxPdmVyaGFuZyAoY29uc3QgOjpsZWZpVmlhUnVsZUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlWaWFSdWxlTGF5ZXIqKW9iaiktPm1ldGFsT3ZlcmhhbmcoKTsKLX0KLQotZG91YmxlIGxlZmlWaWFSdWxlTGF5ZXJfcmVzaXN0YW5jZSAoY29uc3QgOjpsZWZpVmlhUnVsZUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlWaWFSdWxlTGF5ZXIqKW9iaiktPnJlc2lzdGFuY2UoKTsKLX0KLQotZG91YmxlIGxlZmlWaWFSdWxlTGF5ZXJfc3BhY2luZ1N0ZXBYIChjb25zdCA6OmxlZmlWaWFSdWxlTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYVJ1bGVMYXllciopb2JqKS0+c3BhY2luZ1N0ZXBYKCk7Ci19Ci0KLWRvdWJsZSBsZWZpVmlhUnVsZUxheWVyX3NwYWNpbmdTdGVwWSAoY29uc3QgOjpsZWZpVmlhUnVsZUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlWaWFSdWxlTGF5ZXIqKW9iaiktPnNwYWNpbmdTdGVwWSgpOwotfQotCi1kb3VibGUgbGVmaVZpYVJ1bGVMYXllcl94bCAoY29uc3QgOjpsZWZpVmlhUnVsZUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlWaWFSdWxlTGF5ZXIqKW9iaiktPnhsKCk7Ci19Ci0KLWRvdWJsZSBsZWZpVmlhUnVsZUxheWVyX3lsIChjb25zdCA6OmxlZmlWaWFSdWxlTGF5ZXIqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYVJ1bGVMYXllciopb2JqKS0+eWwoKTsKLX0KLQotZG91YmxlIGxlZmlWaWFSdWxlTGF5ZXJfeGggKGNvbnN0IDo6bGVmaVZpYVJ1bGVMYXllciogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVmlhUnVsZUxheWVyKilvYmopLT54aCgpOwotfQotCi1kb3VibGUgbGVmaVZpYVJ1bGVMYXllcl95aCAoY29uc3QgOjpsZWZpVmlhUnVsZUxheWVyKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlWaWFSdWxlTGF5ZXIqKW9iaiktPnloKCk7Ci19Ci0KLXZvaWQgbGVmaVZpYVJ1bGVMYXllcl9wcmludCAoY29uc3QgOjpsZWZpVmlhUnVsZUxheWVyKiBvYmosIEZJTEUqICBmKSB7Ci0gICAgKChMZWZEZWZQYXJzZXI6OmxlZmlWaWFSdWxlTGF5ZXIqKW9iaiktPnByaW50KGYpOwotfQotCi1pbnQgbGVmaVZpYVJ1bGVfaGFzR2VuZXJhdGUgKGNvbnN0IDo6bGVmaVZpYVJ1bGUqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYVJ1bGUqKW9iaiktPmhhc0dlbmVyYXRlKCk7Ci19Ci0KLWludCBsZWZpVmlhUnVsZV9oYXNEZWZhdWx0IChjb25zdCA6OmxlZmlWaWFSdWxlKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlWaWFSdWxlKilvYmopLT5oYXNEZWZhdWx0KCk7Ci19Ci0KLWNoYXIqIGxlZmlWaWFSdWxlX25hbWUgKGNvbnN0IDo6bGVmaVZpYVJ1bGUqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYVJ1bGUqKW9iaiktPm5hbWUoKTsKLX0KLQotaW50IGxlZmlWaWFSdWxlX251bUxheWVycyAoY29uc3QgOjpsZWZpVmlhUnVsZSogb2JqKSB7Ci0gICAgcmV0dXJuICgoTGVmRGVmUGFyc2VyOjpsZWZpVmlhUnVsZSopb2JqKS0+bnVtTGF5ZXJzKCk7Ci19Ci0KLWNvbnN0IDo6bGVmaVZpYVJ1bGVMYXllciogbGVmaVZpYVJ1bGVfbGF5ZXIgKGNvbnN0IDo6bGVmaVZpYVJ1bGUqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoY29uc3QgOjpsZWZpVmlhUnVsZUxheWVyKikgKChMZWZEZWZQYXJzZXI6OmxlZmlWaWFSdWxlKilvYmopLT5sYXllcihpbmRleCk7Ci19Ci0KLWludCBsZWZpVmlhUnVsZV9udW1WaWFzIChjb25zdCA6OmxlZmlWaWFSdWxlKiBvYmopIHsKLSAgICByZXR1cm4gKChMZWZEZWZQYXJzZXI6OmxlZmlWaWFSdWxlKilvYmopLT5udW1WaWFzKCk7Ci19Ci0KLWNoYXIqIGxlZmlWaWFSdWxlX3ZpYU5hbWUgKGNvbnN0IDo6bGVmaVZpYVJ1bGUqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYVJ1bGUqKW9iaiktPnZpYU5hbWUoaW5kZXgpOwotfQotCi1pbnQgbGVmaVZpYVJ1bGVfbnVtUHJvcHMgKGNvbnN0IDo6bGVmaVZpYVJ1bGUqIG9iaikgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYVJ1bGUqKW9iaiktPm51bVByb3BzKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGxlZmlWaWFSdWxlX3Byb3BOYW1lIChjb25zdCA6OmxlZmlWaWFSdWxlKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlWaWFSdWxlKilvYmopLT5wcm9wTmFtZShpbmRleCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGxlZmlWaWFSdWxlX3Byb3BWYWx1ZSAoY29uc3QgOjpsZWZpVmlhUnVsZSogb2JqLCBpbnQgIGluZGV4KSB7Ci0gICAgcmV0dXJuICgoY29uc3QgTGVmRGVmUGFyc2VyOjpsZWZpVmlhUnVsZSopb2JqKS0+cHJvcFZhbHVlKGluZGV4KTsKLX0KLQotZG91YmxlIGxlZmlWaWFSdWxlX3Byb3BOdW1iZXIgKGNvbnN0IDo6bGVmaVZpYVJ1bGUqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYVJ1bGUqKW9iaiktPnByb3BOdW1iZXIoaW5kZXgpOwotfQotCi1jb25zdCBjaGFyIGxlZmlWaWFSdWxlX3Byb3BUeXBlIChjb25zdCA6OmxlZmlWaWFSdWxlKiBvYmosIGludCAgaW5kZXgpIHsKLSAgICByZXR1cm4gKChjb25zdCBMZWZEZWZQYXJzZXI6OmxlZmlWaWFSdWxlKilvYmopLT5wcm9wVHlwZShpbmRleCk7Ci19Ci0KLWludCBsZWZpVmlhUnVsZV9wcm9wSXNOdW1iZXIgKGNvbnN0IDo6bGVmaVZpYVJ1bGUqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYVJ1bGUqKW9iaiktPnByb3BJc051bWJlcihpbmRleCk7Ci19Ci0KLWludCBsZWZpVmlhUnVsZV9wcm9wSXNTdHJpbmcgKGNvbnN0IDo6bGVmaVZpYVJ1bGUqIG9iaiwgaW50ICBpbmRleCkgewotICAgIHJldHVybiAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYVJ1bGUqKW9iaiktPnByb3BJc1N0cmluZyhpbmRleCk7Ci19Ci0KLXZvaWQgbGVmaVZpYVJ1bGVfcHJpbnQgKGNvbnN0IDo6bGVmaVZpYVJ1bGUqIG9iaiwgRklMRSogIGYpIHsKLSAgICAoKExlZkRlZlBhcnNlcjo6bGVmaVZpYVJ1bGUqKW9iaiktPnByaW50KGYpOwotfQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi94bGVmclJlYWRlci5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi94bGVmclJlYWRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZTJmNjUuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYveGxlZnJSZWFkZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzUxICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6IHh4eCAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2RlZmluZSBFWFRFUk4gZXh0ZXJuICJDIgotCi0jaW5jbHVkZSAibGVmclJlYWRlci5oIgotI2luY2x1ZGUgImxlZnJSZWFkZXIuaHBwIgotCi0vLyBXcmFwcGVycyBkZWZpbml0aW9ucy4KLWludCBsZWZySW5pdCAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmckluaXQoKTsKLX0KLQotaW50IGxlZnJJbml0U2Vzc2lvbiAoaW50ICBzdGFydFNlc3Npb24pIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZySW5pdFNlc3Npb24oc3RhcnRTZXNzaW9uKTsKLX0KLQotaW50IGxlZnJSZXNldCAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmclJlc2V0KCk7Ci19Ci0KLWludCBsZWZyQ2xlYXIgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZnJDbGVhcigpOwotfQotCi1pbnQgbGVmclJlbGVhc2VOUmVzZXRNZW1vcnkgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZnJSZWxlYXNlTlJlc2V0TWVtb3J5KCk7Ci19Ci0KLXZvaWQgbGVmclNldENvbW1lbnRDaGFyIChjaGFyICBjKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyU2V0Q29tbWVudENoYXIoYyk7Ci19Ci0KLXZvaWQgbGVmclNldFNoaWZ0Q2FzZSAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyU2V0U2hpZnRDYXNlKCk7Ci19Ci0KLXZvaWQgbGVmclNldENhc2VTZW5zaXRpdml0eSAoaW50ICBjYXNlU2Vuc2UpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRDYXNlU2Vuc2l0aXZpdHkoY2FzZVNlbnNlKTsKLX0KLQotY29uc3QgY2hhciAqIGxlZnJGTmFtZSAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmckZOYW1lKCk7Ci19Ci0KLWludCBsZWZyUmVhZCAoRklMRSAqIGZpbGUsIGNvbnN0IGNoYXIgKiBmaWxlTmFtZSwgbGVmaVVzZXJEYXRhICB1c2VyRGF0YSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZnJSZWFkKGZpbGUsIGZpbGVOYW1lLCB1c2VyRGF0YSk7Ci19Ci0KLXZvaWQgbGVmclNldFJlZ2lzdGVyVW51c2VkQ2FsbGJhY2tzICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRSZWdpc3RlclVudXNlZENhbGxiYWNrcygpOwotfQotCi12b2lkIGxlZnJQcmludFVudXNlZENhbGxiYWNrcyAoRklMRSogIGYpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJQcmludFVudXNlZENhbGxiYWNrcyhmKTsKLX0KLQotdm9pZCBsZWZyU2V0VXNlckRhdGEgKGxlZmlVc2VyRGF0YSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldFVzZXJEYXRhKHAwKTsKLX0KLQotbGVmaVVzZXJEYXRhIGxlZnJHZXRVc2VyRGF0YSAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmckdldFVzZXJEYXRhKCk7Ci19Ci0KLXZvaWQgbGVmclNldFVuaXRzQ2JrICg6OmxlZnJVbml0c0Nia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldFVuaXRzQ2JrKChMZWZEZWZQYXJzZXI6OmxlZnJVbml0c0Nia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGxlZnJTZXRWZXJzaW9uQ2JrICg6OmxlZnJEb3VibGVDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRWZXJzaW9uQ2JrKChMZWZEZWZQYXJzZXI6OmxlZnJEb3VibGVDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBsZWZyU2V0VmVyc2lvblN0ckNiayAoOjpsZWZyU3RyaW5nQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyU2V0VmVyc2lvblN0ckNiaygoTGVmRGVmUGFyc2VyOjpsZWZyU3RyaW5nQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmclNldERpdmlkZXJDaGFyQ2JrICg6OmxlZnJTdHJpbmdDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXREaXZpZGVyQ2hhckNiaygoTGVmRGVmUGFyc2VyOjpsZWZyU3RyaW5nQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmclNldEJ1c0JpdENoYXJzQ2JrICg6OmxlZnJTdHJpbmdDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRCdXNCaXRDaGFyc0NiaygoTGVmRGVmUGFyc2VyOjpsZWZyU3RyaW5nQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmclNldE5vV2lyZUV4dGVuc2lvbkNiayAoOjpsZWZyU3RyaW5nQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyU2V0Tm9XaXJlRXh0ZW5zaW9uQ2JrKChMZWZEZWZQYXJzZXI6OmxlZnJTdHJpbmdDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBsZWZyU2V0Q2FzZVNlbnNpdGl2ZUNiayAoOjpsZWZySW50ZWdlckNia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldENhc2VTZW5zaXRpdmVDYmsoKExlZkRlZlBhcnNlcjo6bGVmckludGVnZXJDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBsZWZyU2V0UHJvcEJlZ2luQ2JrICg6OmxlZnJWb2lkQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyU2V0UHJvcEJlZ2luQ2JrKChMZWZEZWZQYXJzZXI6OmxlZnJWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmclNldFByb3BDYmsgKDo6bGVmclByb3BDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRQcm9wQ2JrKChMZWZEZWZQYXJzZXI6OmxlZnJQcm9wQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmclNldFByb3BFbmRDYmsgKDo6bGVmclZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRQcm9wRW5kQ2JrKChMZWZEZWZQYXJzZXI6OmxlZnJWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmclNldExheWVyQ2JrICg6OmxlZnJMYXllckNia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldExheWVyQ2JrKChMZWZEZWZQYXJzZXI6OmxlZnJMYXllckNia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGxlZnJTZXRWaWFDYmsgKDo6bGVmclZpYUNia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldFZpYUNiaygoTGVmRGVmUGFyc2VyOjpsZWZyVmlhQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmclNldFZpYVJ1bGVDYmsgKDo6bGVmclZpYVJ1bGVDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRWaWFSdWxlQ2JrKChMZWZEZWZQYXJzZXI6OmxlZnJWaWFSdWxlQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmclNldFNwYWNpbmdDYmsgKDo6bGVmclNwYWNpbmdDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRTcGFjaW5nQ2JrKChMZWZEZWZQYXJzZXI6OmxlZnJTcGFjaW5nQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmclNldElSRHJvcENiayAoOjpsZWZySVJEcm9wQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyU2V0SVJEcm9wQ2JrKChMZWZEZWZQYXJzZXI6OmxlZnJJUkRyb3BDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBsZWZyU2V0RGllbGVjdHJpY0NiayAoOjpsZWZyRG91YmxlQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyU2V0RGllbGVjdHJpY0NiaygoTGVmRGVmUGFyc2VyOjpsZWZyRG91YmxlQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmclNldE1pbkZlYXR1cmVDYmsgKDo6bGVmck1pbkZlYXR1cmVDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRNaW5GZWF0dXJlQ2JrKChMZWZEZWZQYXJzZXI6OmxlZnJNaW5GZWF0dXJlQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmclNldE5vbkRlZmF1bHRDYmsgKDo6bGVmck5vbkRlZmF1bHRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXROb25EZWZhdWx0Q2JrKChMZWZEZWZQYXJzZXI6OmxlZnJOb25EZWZhdWx0Q2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmclNldFNpdGVDYmsgKDo6bGVmclNpdGVDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRTaXRlQ2JrKChMZWZEZWZQYXJzZXI6OmxlZnJTaXRlQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmclNldE1hY3JvQmVnaW5DYmsgKDo6bGVmclN0cmluZ0Nia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldE1hY3JvQmVnaW5DYmsoKExlZkRlZlBhcnNlcjo6bGVmclN0cmluZ0Nia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGxlZnJTZXRQaW5DYmsgKDo6bGVmclBpbkNia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldFBpbkNiaygoTGVmRGVmUGFyc2VyOjpsZWZyUGluQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmclNldE9ic3RydWN0aW9uQ2JrICg6OmxlZnJPYnN0cnVjdGlvbkNia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldE9ic3RydWN0aW9uQ2JrKChMZWZEZWZQYXJzZXI6OmxlZnJPYnN0cnVjdGlvbkNia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGxlZnJTZXRBcnJheUNiayAoOjpsZWZyQXJyYXlDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRBcnJheUNiaygoTGVmRGVmUGFyc2VyOjpsZWZyQXJyYXlDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBsZWZyU2V0TWFjcm9DYmsgKDo6bGVmck1hY3JvQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyU2V0TWFjcm9DYmsoKExlZkRlZlBhcnNlcjo6bGVmck1hY3JvQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmclNldExpYnJhcnlFbmRDYmsgKDo6bGVmclZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRMaWJyYXJ5RW5kQ2JrKChMZWZEZWZQYXJzZXI6OmxlZnJWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmclNldFRpbWluZ0NiayAoOjpsZWZyVGltaW5nQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyU2V0VGltaW5nQ2JrKChMZWZEZWZQYXJzZXI6OmxlZnJUaW1pbmdDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBsZWZyU2V0U3BhY2luZ0JlZ2luQ2JrICg6OmxlZnJWb2lkQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyU2V0U3BhY2luZ0JlZ2luQ2JrKChMZWZEZWZQYXJzZXI6OmxlZnJWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmclNldFNwYWNpbmdFbmRDYmsgKDo6bGVmclZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRTcGFjaW5nRW5kQ2JrKChMZWZEZWZQYXJzZXI6OmxlZnJWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmclNldEFycmF5QmVnaW5DYmsgKDo6bGVmclN0cmluZ0Nia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldEFycmF5QmVnaW5DYmsoKExlZkRlZlBhcnNlcjo6bGVmclN0cmluZ0Nia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGxlZnJTZXRBcnJheUVuZENiayAoOjpsZWZyU3RyaW5nQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyU2V0QXJyYXlFbmRDYmsoKExlZkRlZlBhcnNlcjo6bGVmclN0cmluZ0Nia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGxlZnJTZXRJUkRyb3BCZWdpbkNiayAoOjpsZWZyVm9pZENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldElSRHJvcEJlZ2luQ2JrKChMZWZEZWZQYXJzZXI6OmxlZnJWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmclNldElSRHJvcEVuZENiayAoOjpsZWZyVm9pZENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldElSRHJvcEVuZENiaygoTGVmRGVmUGFyc2VyOjpsZWZyVm9pZENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGxlZnJTZXROb2lzZU1hcmdpbkNiayAoOjpsZWZyTm9pc2VNYXJnaW5DYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXROb2lzZU1hcmdpbkNiaygoTGVmRGVmUGFyc2VyOjpsZWZyTm9pc2VNYXJnaW5DYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBsZWZyU2V0RWRnZVJhdGVUaHJlc2hvbGQxQ2JrICg6OmxlZnJEb3VibGVDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRFZGdlUmF0ZVRocmVzaG9sZDFDYmsoKExlZkRlZlBhcnNlcjo6bGVmckRvdWJsZUNia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGxlZnJTZXRFZGdlUmF0ZVRocmVzaG9sZDJDYmsgKDo6bGVmckRvdWJsZUNia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldEVkZ2VSYXRlVGhyZXNob2xkMkNiaygoTGVmRGVmUGFyc2VyOjpsZWZyRG91YmxlQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmclNldEVkZ2VSYXRlU2NhbGVGYWN0b3JDYmsgKDo6bGVmckRvdWJsZUNia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldEVkZ2VSYXRlU2NhbGVGYWN0b3JDYmsoKExlZkRlZlBhcnNlcjo6bGVmckRvdWJsZUNia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGxlZnJTZXROb2lzZVRhYmxlQ2JrICg6OmxlZnJOb2lzZVRhYmxlQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyU2V0Tm9pc2VUYWJsZUNiaygoTGVmRGVmUGFyc2VyOjpsZWZyTm9pc2VUYWJsZUNia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGxlZnJTZXRDb3JyZWN0aW9uVGFibGVDYmsgKDo6bGVmckNvcnJlY3Rpb25UYWJsZUNia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldENvcnJlY3Rpb25UYWJsZUNiaygoTGVmRGVmUGFyc2VyOjpsZWZyQ29ycmVjdGlvblRhYmxlQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmclNldElucHV0QW50ZW5uYUNiayAoOjpsZWZyRG91YmxlQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyU2V0SW5wdXRBbnRlbm5hQ2JrKChMZWZEZWZQYXJzZXI6OmxlZnJEb3VibGVDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBsZWZyU2V0T3V0cHV0QW50ZW5uYUNiayAoOjpsZWZyRG91YmxlQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyU2V0T3V0cHV0QW50ZW5uYUNiaygoTGVmRGVmUGFyc2VyOjpsZWZyRG91YmxlQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmclNldElub3V0QW50ZW5uYUNiayAoOjpsZWZyRG91YmxlQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyU2V0SW5vdXRBbnRlbm5hQ2JrKChMZWZEZWZQYXJzZXI6OmxlZnJEb3VibGVDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBsZWZyU2V0QW50ZW5uYUlucHV0Q2JrICg6OmxlZnJEb3VibGVDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRBbnRlbm5hSW5wdXRDYmsoKExlZkRlZlBhcnNlcjo6bGVmckRvdWJsZUNia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGxlZnJTZXRBbnRlbm5hSW5vdXRDYmsgKDo6bGVmckRvdWJsZUNia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldEFudGVubmFJbm91dENiaygoTGVmRGVmUGFyc2VyOjpsZWZyRG91YmxlQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmclNldEFudGVubmFPdXRwdXRDYmsgKDo6bGVmckRvdWJsZUNia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldEFudGVubmFPdXRwdXRDYmsoKExlZkRlZlBhcnNlcjo6bGVmckRvdWJsZUNia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGxlZnJTZXRDbGVhcmFuY2VNZWFzdXJlQ2JrICg6OmxlZnJTdHJpbmdDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRDbGVhcmFuY2VNZWFzdXJlQ2JrKChMZWZEZWZQYXJzZXI6OmxlZnJTdHJpbmdDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBsZWZyU2V0TWFudWZhY3R1cmluZ0NiayAoOjpsZWZyRG91YmxlQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyU2V0TWFudWZhY3R1cmluZ0NiaygoTGVmRGVmUGFyc2VyOjpsZWZyRG91YmxlQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmclNldFVzZU1pblNwYWNpbmdDYmsgKDo6bGVmclVzZU1pblNwYWNpbmdDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRVc2VNaW5TcGFjaW5nQ2JrKChMZWZEZWZQYXJzZXI6OmxlZnJVc2VNaW5TcGFjaW5nQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmclNldE1hY3JvQ2xhc3NUeXBlQ2JrICg6OmxlZnJTdHJpbmdDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRNYWNyb0NsYXNzVHlwZUNiaygoTGVmRGVmUGFyc2VyOjpsZWZyU3RyaW5nQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmclNldE1hY3JvT3JpZ2luQ2JrICg6OmxlZnJNYWNyb051bUNia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldE1hY3JvT3JpZ2luQ2JrKChMZWZEZWZQYXJzZXI6OmxlZnJNYWNyb051bUNia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGxlZnJTZXRNYWNyb1NpemVDYmsgKDo6bGVmck1hY3JvTnVtQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyU2V0TWFjcm9TaXplQ2JrKChMZWZEZWZQYXJzZXI6OmxlZnJNYWNyb051bUNia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGxlZnJTZXRNYWNyb0ZpeGVkTWFza0NiayAoOjpsZWZySW50ZWdlckNia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldE1hY3JvRml4ZWRNYXNrQ2JrKChMZWZEZWZQYXJzZXI6OmxlZnJJbnRlZ2VyQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmclNldE1hY3JvRW5kQ2JrICg6OmxlZnJTdHJpbmdDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRNYWNyb0VuZENiaygoTGVmRGVmUGFyc2VyOjpsZWZyU3RyaW5nQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmclNldE1heFN0YWNrVmlhQ2JrICg6OmxlZnJNYXhTdGFja1ZpYUNia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldE1heFN0YWNrVmlhQ2JrKChMZWZEZWZQYXJzZXI6OmxlZnJNYXhTdGFja1ZpYUNia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGxlZnJTZXRFeHRlbnNpb25DYmsgKDo6bGVmclN0cmluZ0Nia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldEV4dGVuc2lvbkNiaygoTGVmRGVmUGFyc2VyOjpsZWZyU3RyaW5nQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmclNldERlbnNpdHlDYmsgKDo6bGVmckRlbnNpdHlDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXREZW5zaXR5Q2JrKChMZWZEZWZQYXJzZXI6OmxlZnJEZW5zaXR5Q2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmclNldEZpeGVkTWFza0NiayAoOjpsZWZySW50ZWdlckNia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldEZpeGVkTWFza0NiaygoTGVmRGVmUGFyc2VyOjpsZWZySW50ZWdlckNia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGxlZnJTZXRVbnVzZWRDYWxsYmFja3MgKDo6bGVmclZvaWRDYmtGblR5cGUgIGZ1bmMpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRVbnVzZWRDYWxsYmFja3MoKExlZkRlZlBhcnNlcjo6bGVmclZvaWRDYmtGblR5cGUgKSBmdW5jKTsKLX0KLQotdm9pZCBsZWZyVW5zZXRDYWxsYmFja3MgKCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclVuc2V0Q2FsbGJhY2tzKCk7Ci19Ci0KLXZvaWQgbGVmclVuc2V0QW50ZW5uYUlucHV0Q2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJVbnNldEFudGVubmFJbnB1dENiaygpOwotfQotCi12b2lkIGxlZnJVbnNldEFudGVubmFJbm91dENiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyVW5zZXRBbnRlbm5hSW5vdXRDYmsoKTsKLX0KLQotdm9pZCBsZWZyVW5zZXRBbnRlbm5hT3V0cHV0Q2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJVbnNldEFudGVubmFPdXRwdXRDYmsoKTsKLX0KLQotdm9pZCBsZWZyVW5zZXRBcnJheUJlZ2luQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJVbnNldEFycmF5QmVnaW5DYmsoKTsKLX0KLQotdm9pZCBsZWZyVW5zZXRBcnJheUNiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyVW5zZXRBcnJheUNiaygpOwotfQotCi12b2lkIGxlZnJVbnNldEFycmF5RW5kQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJVbnNldEFycmF5RW5kQ2JrKCk7Ci19Ci0KLXZvaWQgbGVmclVuc2V0QnVzQml0Q2hhcnNDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclVuc2V0QnVzQml0Q2hhcnNDYmsoKTsKLX0KLQotdm9pZCBsZWZyVW5zZXRDYXNlU2Vuc2l0aXZlQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJVbnNldENhc2VTZW5zaXRpdmVDYmsoKTsKLX0KLQotdm9pZCBsZWZyVW5zZXRDbGVhcmFuY2VNZWFzdXJlQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJVbnNldENsZWFyYW5jZU1lYXN1cmVDYmsoKTsKLX0KLQotdm9pZCBsZWZyVW5zZXRDb3JyZWN0aW9uVGFibGVDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclVuc2V0Q29ycmVjdGlvblRhYmxlQ2JrKCk7Ci19Ci0KLXZvaWQgbGVmclVuc2V0RGVuc2l0eUNiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyVW5zZXREZW5zaXR5Q2JrKCk7Ci19Ci0KLXZvaWQgbGVmclVuc2V0RGllbGVjdHJpY0NiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyVW5zZXREaWVsZWN0cmljQ2JrKCk7Ci19Ci0KLXZvaWQgbGVmclVuc2V0RGl2aWRlckNoYXJDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclVuc2V0RGl2aWRlckNoYXJDYmsoKTsKLX0KLQotdm9pZCBsZWZyVW5zZXRFZGdlUmF0ZVNjYWxlRmFjdG9yQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJVbnNldEVkZ2VSYXRlU2NhbGVGYWN0b3JDYmsoKTsKLX0KLQotdm9pZCBsZWZyVW5zZXRFZGdlUmF0ZVRocmVzaG9sZDFDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclVuc2V0RWRnZVJhdGVUaHJlc2hvbGQxQ2JrKCk7Ci19Ci0KLXZvaWQgbGVmclVuc2V0RWRnZVJhdGVUaHJlc2hvbGQyQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJVbnNldEVkZ2VSYXRlVGhyZXNob2xkMkNiaygpOwotfQotCi12b2lkIGxlZnJVbnNldEV4dGVuc2lvbkNiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyVW5zZXRFeHRlbnNpb25DYmsoKTsKLX0KLQotdm9pZCBsZWZyVW5zZXRJbm91dEFudGVubmFDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclVuc2V0SW5vdXRBbnRlbm5hQ2JrKCk7Ci19Ci0KLXZvaWQgbGVmclVuc2V0SW5wdXRBbnRlbm5hQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJVbnNldElucHV0QW50ZW5uYUNiaygpOwotfQotCi12b2lkIGxlZnJVbnNldElSRHJvcEJlZ2luQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJVbnNldElSRHJvcEJlZ2luQ2JrKCk7Ci19Ci0KLXZvaWQgbGVmclVuc2V0SVJEcm9wQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJVbnNldElSRHJvcENiaygpOwotfQotCi12b2lkIGxlZnJVbnNldElSRHJvcEVuZENiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyVW5zZXRJUkRyb3BFbmRDYmsoKTsKLX0KLQotdm9pZCBsZWZyVW5zZXRMYXllckNiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyVW5zZXRMYXllckNiaygpOwotfQotCi12b2lkIGxlZnJVbnNldExpYnJhcnlFbmRDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclVuc2V0TGlicmFyeUVuZENiaygpOwotfQotCi12b2lkIGxlZnJVbnNldE1hY3JvQmVnaW5DYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclVuc2V0TWFjcm9CZWdpbkNiaygpOwotfQotCi12b2lkIGxlZnJVbnNldE1hY3JvQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJVbnNldE1hY3JvQ2JrKCk7Ci19Ci0KLXZvaWQgbGVmclVuc2V0TWFjcm9DbGFzc1R5cGVDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclVuc2V0TWFjcm9DbGFzc1R5cGVDYmsoKTsKLX0KLQotdm9pZCBsZWZyVW5zZXRNYWNyb0VuZENiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyVW5zZXRNYWNyb0VuZENiaygpOwotfQotCi12b2lkIGxlZnJVbnNldE1hY3JvT3JpZ2luQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJVbnNldE1hY3JvT3JpZ2luQ2JrKCk7Ci19Ci0KLXZvaWQgbGVmclVuc2V0TWFjcm9TaXplQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJVbnNldE1hY3JvU2l6ZUNiaygpOwotfQotCi12b2lkIGxlZnJVbnNldE1hbnVmYWN0dXJpbmdDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclVuc2V0TWFudWZhY3R1cmluZ0NiaygpOwotfQotCi12b2lkIGxlZnJVbnNldE1heFN0YWNrVmlhQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJVbnNldE1heFN0YWNrVmlhQ2JrKCk7Ci19Ci0KLXZvaWQgbGVmclVuc2V0TWluRmVhdHVyZUNiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyVW5zZXRNaW5GZWF0dXJlQ2JrKCk7Ci19Ci0KLXZvaWQgbGVmclVuc2V0Tm9pc2VNYXJnaW5DYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclVuc2V0Tm9pc2VNYXJnaW5DYmsoKTsKLX0KLQotdm9pZCBsZWZyVW5zZXROb2lzZVRhYmxlQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJVbnNldE5vaXNlVGFibGVDYmsoKTsKLX0KLQotdm9pZCBsZWZyVW5zZXROb25EZWZhdWx0Q2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJVbnNldE5vbkRlZmF1bHRDYmsoKTsKLX0KLQotdm9pZCBsZWZyVW5zZXROb1dpcmVFeHRlbnNpb25DYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclVuc2V0Tm9XaXJlRXh0ZW5zaW9uQ2JrKCk7Ci19Ci0KLXZvaWQgbGVmclVuc2V0T2JzdHJ1Y3Rpb25DYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclVuc2V0T2JzdHJ1Y3Rpb25DYmsoKTsKLX0KLQotdm9pZCBsZWZyVW5zZXRPdXRwdXRBbnRlbm5hQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJVbnNldE91dHB1dEFudGVubmFDYmsoKTsKLX0KLQotdm9pZCBsZWZyVW5zZXRQaW5DYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclVuc2V0UGluQ2JrKCk7Ci19Ci0KLXZvaWQgbGVmclVuc2V0UHJvcEJlZ2luQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJVbnNldFByb3BCZWdpbkNiaygpOwotfQotCi12b2lkIGxlZnJVbnNldFByb3BDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclVuc2V0UHJvcENiaygpOwotfQotCi12b2lkIGxlZnJVbnNldFByb3BFbmRDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclVuc2V0UHJvcEVuZENiaygpOwotfQotCi12b2lkIGxlZnJVbnNldFNpdGVDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclVuc2V0U2l0ZUNiaygpOwotfQotCi12b2lkIGxlZnJVbnNldFNwYWNpbmdCZWdpbkNiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyVW5zZXRTcGFjaW5nQmVnaW5DYmsoKTsKLX0KLQotdm9pZCBsZWZyVW5zZXRTcGFjaW5nQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJVbnNldFNwYWNpbmdDYmsoKTsKLX0KLQotdm9pZCBsZWZyVW5zZXRTcGFjaW5nRW5kQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJVbnNldFNwYWNpbmdFbmRDYmsoKTsKLX0KLQotdm9pZCBsZWZyVW5zZXRUaW1pbmdDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclVuc2V0VGltaW5nQ2JrKCk7Ci19Ci0KLXZvaWQgbGVmclVuc2V0VXNlTWluU3BhY2luZ0NiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyVW5zZXRVc2VNaW5TcGFjaW5nQ2JrKCk7Ci19Ci0KLXZvaWQgbGVmclVuc2V0VW5pdHNDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclVuc2V0VW5pdHNDYmsoKTsKLX0KLQotdm9pZCBsZWZyVW5zZXRWZXJzaW9uQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJVbnNldFZlcnNpb25DYmsoKTsKLX0KLQotdm9pZCBsZWZyVW5zZXRWZXJzaW9uU3RyQ2JrICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJVbnNldFZlcnNpb25TdHJDYmsoKTsKLX0KLQotdm9pZCBsZWZyVW5zZXRWaWFDYmsgKCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclVuc2V0VmlhQ2JrKCk7Ci19Ci0KLXZvaWQgbGVmclVuc2V0VmlhUnVsZUNiayAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyVW5zZXRWaWFSdWxlQ2JrKCk7Ci19Ci0KLWludCBsZWZyTGluZU51bWJlciAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmckxpbmVOdW1iZXIoKTsKLX0KLQotdm9pZCBsZWZyU2V0TG9nRnVuY3Rpb24gKDo6TEVGSV9MT0dfRlVOQ1RJT04gcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRMb2dGdW5jdGlvbihwMCk7Ci19Ci0KLXZvaWQgbGVmclNldFdhcm5pbmdMb2dGdW5jdGlvbiAoOjpMRUZJX1dBUk5JTkdfTE9HX0ZVTkNUSU9OIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyU2V0V2FybmluZ0xvZ0Z1bmN0aW9uKHAwKTsKLX0KLQotdm9pZCBsZWZyU2V0TWFsbG9jRnVuY3Rpb24gKDo6TEVGSV9NQUxMT0NfRlVOQ1RJT04gcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRNYWxsb2NGdW5jdGlvbihwMCk7Ci19Ci0KLXZvaWQgbGVmclNldFJlYWxsb2NGdW5jdGlvbiAoOjpMRUZJX1JFQUxMT0NfRlVOQ1RJT04gcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRSZWFsbG9jRnVuY3Rpb24ocDApOwotfQotCi12b2lkIGxlZnJTZXRGcmVlRnVuY3Rpb24gKDo6TEVGSV9GUkVFX0ZVTkNUSU9OIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyU2V0RnJlZUZ1bmN0aW9uKHAwKTsKLX0KLQotdm9pZCBsZWZyU2V0TGluZU51bWJlckZ1bmN0aW9uICg6OkxFRklfTElORV9OVU1CRVJfRlVOQ1RJT04gcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRMaW5lTnVtYmVyRnVuY3Rpb24ocDApOwotfQotCi12b2lkIGxlZnJTZXREZWx0YU51bWJlckxpbmVzIChpbnQgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXREZWx0YU51bWJlckxpbmVzKHAwKTsKLX0KLQotdm9pZCBsZWZyU2V0UmVsYXhNb2RlICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRSZWxheE1vZGUoKTsKLX0KLQotdm9pZCBsZWZyVW5zZXRSZWxheE1vZGUgKCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclVuc2V0UmVsYXhNb2RlKCk7Ci19Ci0KLXZvaWQgbGVmclNldFZlcnNpb25WYWx1ZSAoY29uc3QgIGNoYXIqICAgdmVyc2lvbikgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldFZlcnNpb25WYWx1ZSh2ZXJzaW9uKTsKLX0KLQotdm9pZCBsZWZyU2V0UmVhZEZ1bmN0aW9uICg6OkxFRklfUkVBRF9GVU5DVElPTiBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldFJlYWRGdW5jdGlvbihwMCk7Ci19Ci0KLXZvaWQgbGVmclVuc2V0UmVhZEZ1bmN0aW9uICgpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJVbnNldFJlYWRGdW5jdGlvbigpOwotfQotCi12b2lkIGxlZnJTZXRPcGVuTG9nRmlsZUFwcGVuZCAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyU2V0T3BlbkxvZ0ZpbGVBcHBlbmQoKTsKLX0KLQotdm9pZCBsZWZyVW5zZXRPcGVuTG9nRmlsZUFwcGVuZCAoKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyVW5zZXRPcGVuTG9nRmlsZUFwcGVuZCgpOwotfQotCi12b2lkIGxlZnJEaXNhYmxlUHJvcFN0clByb2Nlc3MgKCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmckRpc2FibGVQcm9wU3RyUHJvY2VzcygpOwotfQotCi12b2lkIGxlZnJTZXRBbnRlbm5hSW5vdXRXYXJuaW5ncyAoaW50ICB3YXJuKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyU2V0QW50ZW5uYUlub3V0V2FybmluZ3Mod2Fybik7Ci19Ci0KLXZvaWQgbGVmclNldEFudGVubmFJbnB1dFdhcm5pbmdzIChpbnQgIHdhcm4pIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRBbnRlbm5hSW5wdXRXYXJuaW5ncyh3YXJuKTsKLX0KLQotdm9pZCBsZWZyU2V0QW50ZW5uYU91dHB1dFdhcm5pbmdzIChpbnQgIHdhcm4pIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRBbnRlbm5hT3V0cHV0V2FybmluZ3Mod2Fybik7Ci19Ci0KLXZvaWQgbGVmclNldEFycmF5V2FybmluZ3MgKGludCAgd2FybikgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldEFycmF5V2FybmluZ3Mod2Fybik7Ci19Ci0KLXZvaWQgbGVmclNldENhc2VTZW5zaXRpdmVXYXJuaW5ncyAoaW50ICB3YXJuKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyU2V0Q2FzZVNlbnNpdGl2ZVdhcm5pbmdzKHdhcm4pOwotfQotCi12b2lkIGxlZnJTZXRDb3JyZWN0aW9uVGFibGVXYXJuaW5ncyAoaW50ICB3YXJuKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyU2V0Q29ycmVjdGlvblRhYmxlV2FybmluZ3Mod2Fybik7Ci19Ci0KLXZvaWQgbGVmclNldERpZWxlY3RyaWNXYXJuaW5ncyAoaW50ICB3YXJuKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyU2V0RGllbGVjdHJpY1dhcm5pbmdzKHdhcm4pOwotfQotCi12b2lkIGxlZnJTZXRFZGdlUmF0ZVRocmVzaG9sZDFXYXJuaW5ncyAoaW50ICB3YXJuKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyU2V0RWRnZVJhdGVUaHJlc2hvbGQxV2FybmluZ3Mod2Fybik7Ci19Ci0KLXZvaWQgbGVmclNldEVkZ2VSYXRlVGhyZXNob2xkMldhcm5pbmdzIChpbnQgIHdhcm4pIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRFZGdlUmF0ZVRocmVzaG9sZDJXYXJuaW5ncyh3YXJuKTsKLX0KLQotdm9pZCBsZWZyU2V0RWRnZVJhdGVTY2FsZUZhY3Rvcldhcm5pbmdzIChpbnQgIHdhcm4pIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRFZGdlUmF0ZVNjYWxlRmFjdG9yV2FybmluZ3Mod2Fybik7Ci19Ci0KLXZvaWQgbGVmclNldElub3V0QW50ZW5uYVdhcm5pbmdzIChpbnQgIHdhcm4pIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRJbm91dEFudGVubmFXYXJuaW5ncyh3YXJuKTsKLX0KLQotdm9pZCBsZWZyU2V0SW5wdXRBbnRlbm5hV2FybmluZ3MgKGludCAgd2FybikgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldElucHV0QW50ZW5uYVdhcm5pbmdzKHdhcm4pOwotfQotCi12b2lkIGxlZnJTZXRJUkRyb3BXYXJuaW5ncyAoaW50ICB3YXJuKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyU2V0SVJEcm9wV2FybmluZ3Mod2Fybik7Ci19Ci0KLXZvaWQgbGVmclNldExheWVyV2FybmluZ3MgKGludCAgd2FybikgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldExheWVyV2FybmluZ3Mod2Fybik7Ci19Ci0KLXZvaWQgbGVmclNldE1hY3JvV2FybmluZ3MgKGludCAgd2FybikgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldE1hY3JvV2FybmluZ3Mod2Fybik7Ci19Ci0KLXZvaWQgbGVmclNldE1heFN0YWNrVmlhV2FybmluZ3MgKGludCAgd2FybikgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldE1heFN0YWNrVmlhV2FybmluZ3Mod2Fybik7Ci19Ci0KLXZvaWQgbGVmclNldE1pbkZlYXR1cmVXYXJuaW5ncyAoaW50ICB3YXJuKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyU2V0TWluRmVhdHVyZVdhcm5pbmdzKHdhcm4pOwotfQotCi12b2lkIGxlZnJTZXROb2lzZU1hcmdpbldhcm5pbmdzIChpbnQgIHdhcm4pIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXROb2lzZU1hcmdpbldhcm5pbmdzKHdhcm4pOwotfQotCi12b2lkIGxlZnJTZXROb2lzZVRhYmxlV2FybmluZ3MgKGludCAgd2FybikgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldE5vaXNlVGFibGVXYXJuaW5ncyh3YXJuKTsKLX0KLQotdm9pZCBsZWZyU2V0Tm9uRGVmYXVsdFdhcm5pbmdzIChpbnQgIHdhcm4pIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXROb25EZWZhdWx0V2FybmluZ3Mod2Fybik7Ci19Ci0KLXZvaWQgbGVmclNldE5vV2lyZUV4dGVuc2lvbldhcm5pbmdzIChpbnQgIHdhcm4pIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXROb1dpcmVFeHRlbnNpb25XYXJuaW5ncyh3YXJuKTsKLX0KLQotdm9pZCBsZWZyU2V0T3V0cHV0QW50ZW5uYVdhcm5pbmdzIChpbnQgIHdhcm4pIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRPdXRwdXRBbnRlbm5hV2FybmluZ3Mod2Fybik7Ci19Ci0KLXZvaWQgbGVmclNldFBpbldhcm5pbmdzIChpbnQgIHdhcm4pIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRQaW5XYXJuaW5ncyh3YXJuKTsKLX0KLQotdm9pZCBsZWZyU2V0U2l0ZVdhcm5pbmdzIChpbnQgIHdhcm4pIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZnJTZXRTaXRlV2FybmluZ3Mod2Fybik7Ci19Ci0KLXZvaWQgbGVmclNldFNwYWNpbmdXYXJuaW5ncyAoaW50ICB3YXJuKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyU2V0U3BhY2luZ1dhcm5pbmdzKHdhcm4pOwotfQotCi12b2lkIGxlZnJTZXRUaW1pbmdXYXJuaW5ncyAoaW50ICB3YXJuKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyU2V0VGltaW5nV2FybmluZ3Mod2Fybik7Ci19Ci0KLXZvaWQgbGVmclNldFVuaXRzV2FybmluZ3MgKGludCAgd2FybikgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldFVuaXRzV2FybmluZ3Mod2Fybik7Ci19Ci0KLXZvaWQgbGVmclNldFVzZU1pblNwYWNpbmdXYXJuaW5ncyAoaW50ICB3YXJuKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyU2V0VXNlTWluU3BhY2luZ1dhcm5pbmdzKHdhcm4pOwotfQotCi12b2lkIGxlZnJTZXRWaWFSdWxlV2FybmluZ3MgKGludCAgd2FybikgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldFZpYVJ1bGVXYXJuaW5ncyh3YXJuKTsKLX0KLQotdm9pZCBsZWZyU2V0VmlhV2FybmluZ3MgKGludCAgd2FybikgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldFZpYVdhcm5pbmdzKHdhcm4pOwotfQotCi12b2lkIGxlZnJEaXNhYmxlUGFyc2VyTXNncyAoaW50ICBuTXNnLCBpbnQqICBtc2dzKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZyRGlzYWJsZVBhcnNlck1zZ3Mobk1zZywgbXNncyk7Ci19Ci0KLXZvaWQgbGVmckVuYWJsZVBhcnNlck1zZ3MgKGludCAgbk1zZywgaW50KiAgbXNncykgewotICAgIExlZkRlZlBhcnNlcjo6bGVmckVuYWJsZVBhcnNlck1zZ3Mobk1zZywgbXNncyk7Ci19Ci0KLXZvaWQgbGVmckVuYWJsZUFsbE1zZ3MgKCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmckVuYWJsZUFsbE1zZ3MoKTsKLX0KLQotdm9pZCBsZWZyRGlzYWJsZUFsbE1zZ3MgKCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmckRpc2FibGVBbGxNc2dzKCk7Ci19Ci0KLXZvaWQgbGVmclNldFRvdGFsTXNnTGltaXQgKGludCAgdG90TnVtTXNncykgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldFRvdGFsTXNnTGltaXQodG90TnVtTXNncyk7Ci19Ci0KLXZvaWQgbGVmclNldExpbWl0UGVyTXNnIChpbnQgIG1zZ0lkLCBpbnQgIG51bU1zZykgewotICAgIExlZkRlZlBhcnNlcjo6bGVmclNldExpbWl0UGVyTXNnKG1zZ0lkLCBudW1Nc2cpOwotfQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi94bGVmd1dyaXRlci5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi94bGVmd1dyaXRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZmQ5NDEuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWYveGxlZndXcml0ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTMwMyArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIEFUVEVOVElPTjogVEhJUyBJUyBBTiBBVVRPLUdFTkVSQVRFRCBGSUxFLiBETyBOT1QgQ0hBTkdFIElUIQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJCAgCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2RlZmluZSBFWFRFUk4gZXh0ZXJuICJDIgotCi0jaW5jbHVkZSAibGVmd1dyaXRlci5oIgotI2luY2x1ZGUgImxlZndXcml0ZXIuaHBwIgotCi0vLyBXcmFwcGVycyBkZWZpbml0aW9ucy4KLWludCBsZWZ3SW5pdCAoRklMRSogIGYpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3SW5pdChmKTsKLX0KLQotaW50IGxlZndJbml0Q2JrIChGSUxFKiAgZikgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndJbml0Q2JrKGYpOwotfQotCi1pbnQgbGVmd0VuY3J5cHQgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndFbmNyeXB0KCk7Ci19Ci0KLWludCBsZWZ3Q2xvc2VFbmNyeXB0ICgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3Q2xvc2VFbmNyeXB0KCk7Ci19Ci0KLWludCBsZWZ3TmV3TGluZSAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd05ld0xpbmUoKTsKLX0KLQotaW50IGxlZndWZXJzaW9uIChpbnQgIHZlcnMxLCBpbnQgIHZlcnMyKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd1ZlcnNpb24odmVyczEsIHZlcnMyKTsKLX0KLQotaW50IGxlZndDYXNlU2Vuc2l0aXZlIChjb25zdCBjaGFyKiAgY2FzZVNlbnNpdGl2ZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndDYXNlU2Vuc2l0aXZlKGNhc2VTZW5zaXRpdmUpOwotfQotCi1pbnQgbGVmd05vV2lyZUV4dGVuc2lvbkF0UGluIChjb25zdCBjaGFyKiAgbm9XaXJlRXh0KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd05vV2lyZUV4dGVuc2lvbkF0UGluKG5vV2lyZUV4dCk7Ci19Ci0KLWludCBsZWZ3TWluZmVhdHVyZSAoZG91YmxlICBtaW5GZWF0dXJlWCwgZG91YmxlICBtaW5GZWF0dXJlWSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndNaW5mZWF0dXJlKG1pbkZlYXR1cmVYLCBtaW5GZWF0dXJlWSk7Ci19Ci0KLWludCBsZWZ3RGllbGVjdHJpYyAoZG91YmxlICBkaWVsZWN0cmljKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0RpZWxlY3RyaWMoZGllbGVjdHJpYyk7Ci19Ci0KLWludCBsZWZ3QnVzQml0Q2hhcnMgKGNvbnN0IGNoYXIqICBidXNCaXRDaGFycykgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndCdXNCaXRDaGFycyhidXNCaXRDaGFycyk7Ci19Ci0KLWludCBsZWZ3RGl2aWRlckNoYXIgKGNvbnN0IGNoYXIqICBkaXZpZGVyQ2hhcikgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndEaXZpZGVyQ2hhcihkaXZpZGVyQ2hhcik7Ci19Ci0KLWludCBsZWZ3TWFudWZhY3R1cmluZ0dyaWQgKGRvdWJsZSAgZ3JpZCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndNYW51ZmFjdHVyaW5nR3JpZChncmlkKTsKLX0KLQotaW50IGxlZndGaXhlZE1hc2sgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndGaXhlZE1hc2soKTsKLX0KLQotaW50IGxlZndVc2VNaW5TcGFjaW5nIChjb25zdCBjaGFyKiAgdHlwZSwgY29uc3QgY2hhciogIG9uT2ZmKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd1VzZU1pblNwYWNpbmcodHlwZSwgb25PZmYpOwotfQotCi1pbnQgbGVmd0NsZWFyYW5jZU1lYXN1cmUgKGNvbnN0IGNoYXIqICB0eXBlKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0NsZWFyYW5jZU1lYXN1cmUodHlwZSk7Ci19Ci0KLWludCBsZWZ3QW50ZW5uYUlucHV0R2F0ZUFyZWEgKGRvdWJsZSAgaW5wdXRHYXRlQXJlYSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndBbnRlbm5hSW5wdXRHYXRlQXJlYShpbnB1dEdhdGVBcmVhKTsKLX0KLQotaW50IGxlZndBbnRlbm5hSW5PdXREaWZmQXJlYSAoZG91YmxlICBpbk91dERpZmZBcmVhKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0FudGVubmFJbk91dERpZmZBcmVhKGluT3V0RGlmZkFyZWEpOwotfQotCi1pbnQgbGVmd0FudGVubmFPdXRwdXREaWZmQXJlYSAoZG91YmxlICBvdXRwdXREaWZmQXJlYSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndBbnRlbm5hT3V0cHV0RGlmZkFyZWEob3V0cHV0RGlmZkFyZWEpOwotfQotCi1pbnQgbGVmd1N0YXJ0VW5pdHMgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndTdGFydFVuaXRzKCk7Ci19Ci0KLWludCBsZWZ3VW5pdHMgKGRvdWJsZSAgdGltZSwgZG91YmxlICBjYXBhY2l0YW5jZSwgZG91YmxlICByZXNpc3RhbmNlLCBkb3VibGUgIHBvd2VyLCBkb3VibGUgIGN1cnJlbnQsIGRvdWJsZSAgdm9sdGFnZSwgZG91YmxlICBkYXRhYmFzZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndVbml0cyh0aW1lLCBjYXBhY2l0YW5jZSwgcmVzaXN0YW5jZSwgcG93ZXIsIGN1cnJlbnQsIHZvbHRhZ2UsIGRhdGFiYXNlKTsKLX0KLQotaW50IGxlZndVbml0c0ZyZXF1ZW5jeSAoZG91YmxlICBmcmVxdWVuY3kpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3VW5pdHNGcmVxdWVuY3koZnJlcXVlbmN5KTsKLX0KLQotaW50IGxlZndFbmRVbml0cyAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0VuZFVuaXRzKCk7Ci19Ci0KLWludCBsZWZ3U3RhcnRMYXllciAoY29uc3QgY2hhciogIGxheWVyTmFtZSwgY29uc3QgY2hhciogIHR5cGUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3U3RhcnRMYXllcihsYXllck5hbWUsIHR5cGUpOwotfQotCi1pbnQgbGVmd0xheWVyTWFzayAoaW50ICBtYXNrQ29sb3IpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJNYXNrKG1hc2tDb2xvcik7Ci19Ci0KLWludCBsZWZ3TGF5ZXJXaWR0aCAoZG91YmxlICBtaW5XaWR0aCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllcldpZHRoKG1pbldpZHRoKTsKLX0KLQotaW50IGxlZndMYXllckN1dFNwYWNpbmcgKGRvdWJsZSAgc3BhY2luZykgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllckN1dFNwYWNpbmcoc3BhY2luZyk7Ci19Ci0KLWludCBsZWZ3TGF5ZXJDdXRTcGFjaW5nQ2VudGVyVG9DZW50ZXIgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllckN1dFNwYWNpbmdDZW50ZXJUb0NlbnRlcigpOwotfQotCi1pbnQgbGVmd0xheWVyQ3V0U3BhY2luZ1NhbWVOZXQgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllckN1dFNwYWNpbmdTYW1lTmV0KCk7Ci19Ci0KLWludCBsZWZ3TGF5ZXJDdXRTcGFjaW5nTGF5ZXIgKGNvbnN0IGNoYXIqICBuYW1lMiwgaW50ICBzdGFjaykgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllckN1dFNwYWNpbmdMYXllcihuYW1lMiwgc3RhY2spOwotfQotCi1pbnQgbGVmd0xheWVyQ3V0U3BhY2luZ0FkamFjZW50IChpbnQgIHZpYUN1dHMsIGRvdWJsZSAgZGlzdGFuY2UsIGludCAgc3RhY2spIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJDdXRTcGFjaW5nQWRqYWNlbnQodmlhQ3V0cywgZGlzdGFuY2UsIHN0YWNrKTsKLX0KLQotaW50IGxlZndMYXllckN1dFNwYWNpbmdQYXJhbGxlbCAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyQ3V0U3BhY2luZ1BhcmFsbGVsKCk7Ci19Ci0KLWludCBsZWZ3TGF5ZXJDdXRTcGFjaW5nQXJlYSAoZG91YmxlICBjdXRBcmVhKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyQ3V0U3BhY2luZ0FyZWEoY3V0QXJlYSk7Ci19Ci0KLWludCBsZWZ3TGF5ZXJDdXRTcGFjaW5nRW5kICgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJDdXRTcGFjaW5nRW5kKCk7Ci19Ci0KLWludCBsZWZ3TGF5ZXJDdXRTcGFjaW5nVGFibGVPcnRobyAoaW50ICBudW1TcGFjaW5nLCBkb3VibGUqICBjdXRXaXRoaW5zLCBkb3VibGUqICBvcnRob1NwYWNpbmdzKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyQ3V0U3BhY2luZ1RhYmxlT3J0aG8obnVtU3BhY2luZywgY3V0V2l0aGlucywgb3J0aG9TcGFjaW5ncyk7Ci19Ci0KLWludCBsZWZ3TGF5ZXJBcnJheVNwYWNpbmcgKGludCAgbG9uZ0FycmF5LCBkb3VibGUgIHZpYVdpZHRoLCBkb3VibGUgIGN1dFNwYWNpbmcsIGludCAgbnVtQXJyYXlDdXQsIGludCogIGFycmF5Q3V0cywgZG91YmxlKiAgYXJyYXlTcGFjaW5ncykgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllckFycmF5U3BhY2luZyhsb25nQXJyYXksIHZpYVdpZHRoLCBjdXRTcGFjaW5nLCBudW1BcnJheUN1dCwgYXJyYXlDdXRzLCBhcnJheVNwYWNpbmdzKTsKLX0KLQotaW50IGxlZndMYXllckVuY2xvc3VyZSAoY29uc3QgY2hhciogIGxvY2F0aW9uLCBkb3VibGUgIG92ZXJoYW5nMSwgZG91YmxlICBvdmVyaGFuZzIsIGRvdWJsZSAgd2lkdGgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJFbmNsb3N1cmUobG9jYXRpb24sIG92ZXJoYW5nMSwgb3ZlcmhhbmcyLCB3aWR0aCk7Ci19Ci0KLWludCBsZWZ3TGF5ZXJFbmNsb3N1cmVXaWR0aCAoY29uc3QgY2hhciogIGxvY2F0aW9uLCBkb3VibGUgIG92ZXJoYW5nMSwgZG91YmxlICBvdmVyaGFuZzIsIGRvdWJsZSAgd2lkdGgsIGRvdWJsZSAgY3V0V2l0aGluKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyRW5jbG9zdXJlV2lkdGgobG9jYXRpb24sIG92ZXJoYW5nMSwgb3ZlcmhhbmcyLCB3aWR0aCwgY3V0V2l0aGluKTsKLX0KLQotaW50IGxlZndMYXllckVuY2xvc3VyZUxlbmd0aCAoY29uc3QgY2hhciogIGxvY2F0aW9uLCBkb3VibGUgIG92ZXJoYW5nMSwgZG91YmxlICBvdmVyaGFuZzIsIGRvdWJsZSAgbWluTGVuZ3RoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyRW5jbG9zdXJlTGVuZ3RoKGxvY2F0aW9uLCBvdmVyaGFuZzEsIG92ZXJoYW5nMiwgbWluTGVuZ3RoKTsKLX0KLQotaW50IGxlZndMYXllclByZWZlckVuY2xvc3VyZSAoY29uc3QgY2hhciogIGxvY2F0aW9uLCBkb3VibGUgIG92ZXJoYW5nMSwgZG91YmxlICBvdmVyaGFuZzIsIGRvdWJsZSAgd2lkdGgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJQcmVmZXJFbmNsb3N1cmUobG9jYXRpb24sIG92ZXJoYW5nMSwgb3ZlcmhhbmcyLCB3aWR0aCk7Ci19Ci0KLWludCBsZWZ3TGF5ZXJSZXNpc3RhbmNlUGVyQ3V0IChkb3VibGUgIHJlc2lzdGFuY2UpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJSZXNpc3RhbmNlUGVyQ3V0KHJlc2lzdGFuY2UpOwotfQotCi1pbnQgbGVmd0VuZExheWVyIChjb25zdCBjaGFyKiAgbGF5ZXJOYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0VuZExheWVyKGxheWVyTmFtZSk7Ci19Ci0KLWludCBsZWZ3U3RhcnRMYXllclJvdXRpbmcgKGNvbnN0IGNoYXIqICBsYXllck5hbWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3U3RhcnRMYXllclJvdXRpbmcobGF5ZXJOYW1lKTsKLX0KLQotaW50IGxlZndMYXllclJvdXRpbmcgKGNvbnN0IGNoYXIqICBkaXJlY3Rpb24sIGRvdWJsZSAgd2lkdGgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJSb3V0aW5nKGRpcmVjdGlvbiwgd2lkdGgpOwotfQotCi1pbnQgbGVmd0xheWVyUm91dGluZ1BpdGNoIChkb3VibGUgIHBpdGNoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyUm91dGluZ1BpdGNoKHBpdGNoKTsKLX0KLQotaW50IGxlZndMYXllclJvdXRpbmdQaXRjaFhZRGlzdGFuY2UgKGRvdWJsZSAgeERpc3RhbmNlLCBkb3VibGUgIHlEaXN0YW5jZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllclJvdXRpbmdQaXRjaFhZRGlzdGFuY2UoeERpc3RhbmNlLCB5RGlzdGFuY2UpOwotfQotCi1pbnQgbGVmd0xheWVyUm91dGluZ0RpYWdQaXRjaCAoZG91YmxlICBkaXN0YW5jZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllclJvdXRpbmdEaWFnUGl0Y2goZGlzdGFuY2UpOwotfQotCi1pbnQgbGVmd0xheWVyUm91dGluZ0RpYWdQaXRjaFhZRGlzdGFuY2UgKGRvdWJsZSAgZGlhZzQ1RGlzdGFuY2UsIGRvdWJsZSAgZGlhZzEzNURpc3RhbmNlKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyUm91dGluZ0RpYWdQaXRjaFhZRGlzdGFuY2UoZGlhZzQ1RGlzdGFuY2UsIGRpYWcxMzVEaXN0YW5jZSk7Ci19Ci0KLWludCBsZWZ3TGF5ZXJSb3V0aW5nRGlhZ1dpZHRoIChkb3VibGUgIGRpYWdXaWR0aCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllclJvdXRpbmdEaWFnV2lkdGgoZGlhZ1dpZHRoKTsKLX0KLQotaW50IGxlZndMYXllclJvdXRpbmdEaWFnU3BhY2luZyAoZG91YmxlICBkaWFnU3BhY2luZykgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllclJvdXRpbmdEaWFnU3BhY2luZyhkaWFnU3BhY2luZyk7Ci19Ci0KLWludCBsZWZ3TGF5ZXJSb3V0aW5nRGlhZ01pbkVkZ2VMZW5ndGggKGRvdWJsZSAgZGlhZ0xlbmd0aCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllclJvdXRpbmdEaWFnTWluRWRnZUxlbmd0aChkaWFnTGVuZ3RoKTsKLX0KLQotaW50IGxlZndMYXllclJvdXRpbmdPZmZzZXQgKGRvdWJsZSAgb2Zmc2V0KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyUm91dGluZ09mZnNldChvZmZzZXQpOwotfQotCi1pbnQgbGVmd0xheWVyUm91dGluZ09mZnNldFhZRGlzdGFuY2UgKGRvdWJsZSAgeERpc3RhbmNlLCBkb3VibGUgIHlEaXN0YW5jZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllclJvdXRpbmdPZmZzZXRYWURpc3RhbmNlKHhEaXN0YW5jZSwgeURpc3RhbmNlKTsKLX0KLQotaW50IGxlZndMYXllclJvdXRpbmdBcmVhIChkb3VibGUgIGFyZWEpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJSb3V0aW5nQXJlYShhcmVhKTsKLX0KLQotaW50IGxlZndMYXllclJvdXRpbmdNaW5zaXplIChpbnQgIG51bVJlY3QsIGRvdWJsZSogIG1pbldpZHRoLCBkb3VibGUqICBtaW5MZW5ndGgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJSb3V0aW5nTWluc2l6ZShudW1SZWN0LCBtaW5XaWR0aCwgbWluTGVuZ3RoKTsKLX0KLQotaW50IGxlZndMYXllclJvdXRpbmdNaW5pbXVtY3V0IChkb3VibGUgIG51bUN1dHMsIGRvdWJsZSAgbWluV2lkdGgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJSb3V0aW5nTWluaW11bWN1dChudW1DdXRzLCBtaW5XaWR0aCk7Ci19Ci0KLWludCBsZWZ3TGF5ZXJSb3V0aW5nTWluaW11bWN1dFdpdGhpbiAoZG91YmxlICBudW1DdXRzLCBkb3VibGUgIG1pbldpZHRoLCBkb3VibGUgIGN1dERpc3RhbmNlKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyUm91dGluZ01pbmltdW1jdXRXaXRoaW4obnVtQ3V0cywgbWluV2lkdGgsIGN1dERpc3RhbmNlKTsKLX0KLQotaW50IGxlZndMYXllclJvdXRpbmdNaW5pbXVtY3V0Q29ubmVjdGlvbnMgKGNvbnN0IGNoYXIqICBkaXJlY3Rpb24pIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJSb3V0aW5nTWluaW11bWN1dENvbm5lY3Rpb25zKGRpcmVjdGlvbik7Ci19Ci0KLWludCBsZWZ3TGF5ZXJSb3V0aW5nTWluaW11bWN1dExlbmd0aFdpdGhpbiAoZG91YmxlICBsZW5ndGgsIGRvdWJsZSAgZGlzdGFuY2UpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJSb3V0aW5nTWluaW11bWN1dExlbmd0aFdpdGhpbihsZW5ndGgsIGRpc3RhbmNlKTsKLX0KLQotaW50IGxlZndMYXllclJvdXRpbmdTcGFjaW5nIChkb3VibGUgIHNwYWNpbmcpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZyhzcGFjaW5nKTsKLX0KLQotaW50IGxlZndMYXllclJvdXRpbmdTcGFjaW5nUmFuZ2UgKGRvdWJsZSAgbWluV2lkdGgsIGRvdWJsZSAgbWF4V2lkdGgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ1JhbmdlKG1pbldpZHRoLCBtYXhXaWR0aCk7Ci19Ci0KLWludCBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ1JhbmdlVXNlTGVuZ3RoVGhyZXNob2xkICgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ1JhbmdlVXNlTGVuZ3RoVGhyZXNob2xkKCk7Ci19Ci0KLWludCBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ1JhbmdlSW5mbHVlbmNlIChkb3VibGUgIGluZlZhbHVlLCBkb3VibGUgIHN1Yk1pbldpZHRoLCBkb3VibGUgIHN1Yk1heFdpZHRoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyUm91dGluZ1NwYWNpbmdSYW5nZUluZmx1ZW5jZShpbmZWYWx1ZSwgc3ViTWluV2lkdGgsIHN1Yk1heFdpZHRoKTsKLX0KLQotaW50IGxlZndMYXllclJvdXRpbmdTcGFjaW5nUmFuZ2VSYW5nZSAoZG91YmxlICBtaW5XaWR0aCwgZG91YmxlICBtYXhXaWR0aCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllclJvdXRpbmdTcGFjaW5nUmFuZ2VSYW5nZShtaW5XaWR0aCwgbWF4V2lkdGgpOwotfQotCi1pbnQgbGVmd0xheWVyUm91dGluZ1NwYWNpbmdMZW5ndGhUaHJlc2hvbGQgKGRvdWJsZSAgbGVuZ3RoVmFsdWUsIGRvdWJsZSAgbWluV2lkdGgsIGRvdWJsZSAgbWF4V2lkdGgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ0xlbmd0aFRocmVzaG9sZChsZW5ndGhWYWx1ZSwgbWluV2lkdGgsIG1heFdpZHRoKTsKLX0KLQotaW50IGxlZndMYXllclJvdXRpbmdTcGFjaW5nU2FtZU5ldCAoaW50ICBQR09ubHkpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ1NhbWVOZXQoUEdPbmx5KTsKLX0KLQotaW50IGxlZndMYXllclJvdXRpbmdTcGFjaW5nRW5kT2ZMaW5lIChkb3VibGUgIGVvbFdpZHRoLCBkb3VibGUgIGVvbFdpdGhpbikgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllclJvdXRpbmdTcGFjaW5nRW5kT2ZMaW5lKGVvbFdpZHRoLCBlb2xXaXRoaW4pOwotfQotCi1pbnQgbGVmd0xheWVyUm91dGluZ1NwYWNpbmdFT0xQYXJhbGxlbCAoZG91YmxlICBwYXJTcGFjZSwgZG91YmxlICBwYXJXaXRoaW4sIGludCAgdHdvRWRnZXMpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ0VPTFBhcmFsbGVsKHBhclNwYWNlLCBwYXJXaXRoaW4sIHR3b0VkZ2VzKTsKLX0KLQotaW50IGxlZndMYXllclJvdXRpbmdTcGFjaW5nTm90Y2hMZW5ndGggKGRvdWJsZSAgbWluTkxlbmd0aCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllclJvdXRpbmdTcGFjaW5nTm90Y2hMZW5ndGgobWluTkxlbmd0aCk7Ci19Ci0KLWludCBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ0VuZE9mTm90Y2hXaWR0aCAoZG91YmxlICBlb25XaWR0aCwgZG91YmxlICBtaW5OU3BhY2luZywgZG91YmxlICBtaW5OTGVuZ3RoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyUm91dGluZ1NwYWNpbmdFbmRPZk5vdGNoV2lkdGgoZW9uV2lkdGgsIG1pbk5TcGFjaW5nLCBtaW5OTGVuZ3RoKTsKLX0KLQotaW50IGxlZndMYXllclJvdXRpbmdXaXJlRXh0ZW5zaW9uIChkb3VibGUgIHdpcmVFeHRlbnNpb24pIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJSb3V0aW5nV2lyZUV4dGVuc2lvbih3aXJlRXh0ZW5zaW9uKTsKLX0KLQotaW50IGxlZndMYXllclJvdXRpbmdSZXNpc3RhbmNlIChjb25zdCBjaGFyKiAgcmVzaXN0YW5jZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllclJvdXRpbmdSZXNpc3RhbmNlKHJlc2lzdGFuY2UpOwotfQotCi1pbnQgbGVmd0xheWVyUm91dGluZ0NhcGFjaXRhbmNlIChjb25zdCBjaGFyKiAgY2FwYWNpdGFuY2UpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJSb3V0aW5nQ2FwYWNpdGFuY2UoY2FwYWNpdGFuY2UpOwotfQotCi1pbnQgbGVmd0xheWVyUm91dGluZ0hlaWdodCAoZG91YmxlICBoZWlnaHQpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJSb3V0aW5nSGVpZ2h0KGhlaWdodCk7Ci19Ci0KLWludCBsZWZ3TGF5ZXJSb3V0aW5nVGhpY2tuZXNzIChkb3VibGUgIHRoaWNrbmVzcykgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllclJvdXRpbmdUaGlja25lc3ModGhpY2tuZXNzKTsKLX0KLQotaW50IGxlZndMYXllclJvdXRpbmdTaHJpbmthZ2UgKGRvdWJsZSAgc2hyaW5rYWdlKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyUm91dGluZ1Nocmlua2FnZShzaHJpbmthZ2UpOwotfQotCi1pbnQgbGVmd0xheWVyUm91dGluZ0NhcE11bHRpcGxpZXIgKGRvdWJsZSAgY2FwTXVsdGlwbGllcikgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllclJvdXRpbmdDYXBNdWx0aXBsaWVyKGNhcE11bHRpcGxpZXIpOwotfQotCi1pbnQgbGVmd0xheWVyUm91dGluZ0VkZ2VDYXAgKGRvdWJsZSAgZWRnZUNhcCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllclJvdXRpbmdFZGdlQ2FwKGVkZ2VDYXApOwotfQotCi1pbnQgbGVmd0xheWVyUm91dGluZ0FudGVubmFBcmVhIChkb3VibGUgIGFudGVubmFBcmVhKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyUm91dGluZ0FudGVubmFBcmVhKGFudGVubmFBcmVhKTsKLX0KLQotaW50IGxlZndMYXllclJvdXRpbmdBbnRlbm5hTGVuZ3RoIChkb3VibGUgIGFudGVubmFMZW5ndGgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJSb3V0aW5nQW50ZW5uYUxlbmd0aChhbnRlbm5hTGVuZ3RoKTsKLX0KLQotaW50IGxlZndMYXllclJvdXRpbmdNYXh3aWR0aCAoZG91YmxlICB3aWR0aCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllclJvdXRpbmdNYXh3aWR0aCh3aWR0aCk7Ci19Ci0KLWludCBsZWZ3TGF5ZXJSb3V0aW5nTWlud2lkdGggKGRvdWJsZSAgd2lkdGgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJSb3V0aW5nTWlud2lkdGgod2lkdGgpOwotfQotCi1pbnQgbGVmd0xheWVyUm91dGluZ01pbmVuY2xvc2VkYXJlYSAoaW50ICBudW1NaW5lbmNsb3NlZCwgZG91YmxlKiAgYXJlYSwgZG91YmxlKiAgd2lkdGgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJSb3V0aW5nTWluZW5jbG9zZWRhcmVhKG51bU1pbmVuY2xvc2VkLCBhcmVhLCB3aWR0aCk7Ci19Ci0KLWludCBsZWZ3TGF5ZXJSb3V0aW5nTWluc3RlcCAoZG91YmxlICBkaXN0YW5jZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllclJvdXRpbmdNaW5zdGVwKGRpc3RhbmNlKTsKLX0KLQotaW50IGxlZndMYXllclJvdXRpbmdNaW5zdGVwV2l0aE9wdGlvbnMgKGRvdWJsZSAgZGlzdGFuY2UsIGNvbnN0IGNoYXIqICBydWxlLCBkb3VibGUgIG1heExlbmd0aCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllclJvdXRpbmdNaW5zdGVwV2l0aE9wdGlvbnMoZGlzdGFuY2UsIHJ1bGUsIG1heExlbmd0aCk7Ci19Ci0KLWludCBsZWZ3TGF5ZXJSb3V0aW5nTWluc3RlcE1heEVkZ2VzIChkb3VibGUgIGRpc3RhbmNlLCBkb3VibGUgIG1heEVkZ2VzKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyUm91dGluZ01pbnN0ZXBNYXhFZGdlcyhkaXN0YW5jZSwgbWF4RWRnZXMpOwotfQotCi1pbnQgbGVmd0xheWVyUm91dGluZ1Byb3RydXNpb24gKGRvdWJsZSAgd2lkdGgxLCBkb3VibGUgIGxlbmd0aCwgZG91YmxlICB3aWR0aDIpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJSb3V0aW5nUHJvdHJ1c2lvbih3aWR0aDEsIGxlbmd0aCwgd2lkdGgyKTsKLX0KLQotaW50IGxlZndMYXllclJvdXRpbmdTdGFydFNwYWNpbmd0YWJsZVBhcmFsbGVsIChpbnQgIG51bUxlbmd0aCwgZG91YmxlKiAgbGVuZ3RoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyUm91dGluZ1N0YXJ0U3BhY2luZ3RhYmxlUGFyYWxsZWwobnVtTGVuZ3RoLCBsZW5ndGgpOwotfQotCi1pbnQgbGVmd0xheWVyUm91dGluZ1NwYWNpbmd0YWJsZVBhcmFsbGVsV2lkdGggKGRvdWJsZSAgd2lkdGgsIGludCAgbnVtU3BhY2luZywgZG91YmxlKiAgc3BhY2luZykgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllclJvdXRpbmdTcGFjaW5ndGFibGVQYXJhbGxlbFdpZHRoKHdpZHRoLCBudW1TcGFjaW5nLCBzcGFjaW5nKTsKLX0KLQotaW50IGxlZndMYXllclJvdXRpbmdTdGFydFNwYWNpbmd0YWJsZUluZmx1ZW5jZSAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyUm91dGluZ1N0YXJ0U3BhY2luZ3RhYmxlSW5mbHVlbmNlKCk7Ci19Ci0KLWludCBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ0luZmx1ZW5jZVdpZHRoIChkb3VibGUgIHdpZHRoLCBkb3VibGUgIGRpc3RhbmNlLCBkb3VibGUgIHNwYWNpbmcpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ0luZmx1ZW5jZVdpZHRoKHdpZHRoLCBkaXN0YW5jZSwgc3BhY2luZyk7Ci19Ci0KLWludCBsZWZ3TGF5ZXJSb3V0aW5nU3RhcnRTcGFjaW5ndGFibGVUd29XaWR0aHMgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllclJvdXRpbmdTdGFydFNwYWNpbmd0YWJsZVR3b1dpZHRocygpOwotfQotCi1pbnQgbGVmd0xheWVyUm91dGluZ1NwYWNpbmd0YWJsZVR3b1dpZHRoc1dpZHRoIChkb3VibGUgIHdpZHRoLCBkb3VibGUgIHJ1bkxlbmd0aCwgaW50ICBudW1TcGFjaW5nLCBkb3VibGUqICBzcGFjaW5nKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyUm91dGluZ1NwYWNpbmd0YWJsZVR3b1dpZHRoc1dpZHRoKHdpZHRoLCBydW5MZW5ndGgsIG51bVNwYWNpbmcsIHNwYWNpbmcpOwotfQotCi1pbnQgbGVmd0xheWVyUm91dGluZUVuZFNwYWNpbmd0YWJsZSAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyUm91dGluZUVuZFNwYWNpbmd0YWJsZSgpOwotfQotCi1pbnQgbGVmd0VuZExheWVyUm91dGluZyAoY29uc3QgY2hhciogIGxheWVyTmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndFbmRMYXllclJvdXRpbmcobGF5ZXJOYW1lKTsKLX0KLQotaW50IGxlZndMYXllckFDQ3VycmVudERlbnNpdHkgKGNvbnN0IGNoYXIqICB0eXBlLCBkb3VibGUgIHZhbHVlKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyQUNDdXJyZW50RGVuc2l0eSh0eXBlLCB2YWx1ZSk7Ci19Ci0KLWludCBsZWZ3TGF5ZXJBQ0ZyZXF1ZW5jeSAoaW50ICBudW1GcmVxdWVuY3ksIGRvdWJsZSogIGZyZXF1ZW5jeSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllckFDRnJlcXVlbmN5KG51bUZyZXF1ZW5jeSwgZnJlcXVlbmN5KTsKLX0KLQotaW50IGxlZndMYXllckFDV2lkdGggKGludCAgbnVtV2lkdGhzLCBkb3VibGUqICB3aWR0aHMpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJBQ1dpZHRoKG51bVdpZHRocywgd2lkdGhzKTsKLX0KLQotaW50IGxlZndMYXllckFDQ3V0YXJlYSAoaW50ICBudW1DdXRhcmVhcywgZG91YmxlKiAgY3V0YXJlYXMpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJBQ0N1dGFyZWEobnVtQ3V0YXJlYXMsIGN1dGFyZWFzKTsKLX0KLQotaW50IGxlZndMYXllckFDVGFibGVFbnRyaWVzIChpbnQgIG51bUVudHJpZXMsIGRvdWJsZSogIGVudHJpZXMpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJBQ1RhYmxlRW50cmllcyhudW1FbnRyaWVzLCBlbnRyaWVzKTsKLX0KLQotaW50IGxlZndMYXllckRDQ3VycmVudERlbnNpdHkgKGNvbnN0IGNoYXIqICB0eXBlLCBkb3VibGUgIHZhbHVlKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyRENDdXJyZW50RGVuc2l0eSh0eXBlLCB2YWx1ZSk7Ci19Ci0KLWludCBsZWZ3TGF5ZXJEQ1dpZHRoIChpbnQgIG51bVdpZHRocywgZG91YmxlKiAgd2lkdGhzKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyRENXaWR0aChudW1XaWR0aHMsIHdpZHRocyk7Ci19Ci0KLWludCBsZWZ3TGF5ZXJEQ0N1dGFyZWEgKGludCAgbnVtQ3V0YXJlYXMsIGRvdWJsZSogIGN1dGFyZWFzKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyRENDdXRhcmVhKG51bUN1dGFyZWFzLCBjdXRhcmVhcyk7Ci19Ci0KLWludCBsZWZ3TGF5ZXJEQ1RhYmxlRW50cmllcyAoaW50ICBudW1FbnRyaWVzLCBkb3VibGUqICBlbnRyaWVzKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyRENUYWJsZUVudHJpZXMobnVtRW50cmllcywgZW50cmllcyk7Ci19Ci0KLWludCBsZWZ3TGF5ZXJBbnRlbm5hTW9kZWwgKGNvbnN0IGNoYXIqICBveGlkZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllckFudGVubmFNb2RlbChveGlkZSk7Ci19Ci0KLWludCBsZWZ3TGF5ZXJBbnRlbm5hQXJlYVJhdGlvIChkb3VibGUgIHZhbHVlKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyQW50ZW5uYUFyZWFSYXRpbyh2YWx1ZSk7Ci19Ci0KLWludCBsZWZ3TGF5ZXJBbnRlbm5hRGlmZkFyZWFSYXRpbyAoZG91YmxlICB2YWx1ZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllckFudGVubmFEaWZmQXJlYVJhdGlvKHZhbHVlKTsKLX0KLQotaW50IGxlZndMYXllckFudGVubmFEaWZmQXJlYVJhdGlvUHdsIChpbnQgIG51bVB3bHMsIGRvdWJsZSogIGRpZmZ1c2lvbnMsIGRvdWJsZSogIHJhdGlvcykgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllckFudGVubmFEaWZmQXJlYVJhdGlvUHdsKG51bVB3bHMsIGRpZmZ1c2lvbnMsIHJhdGlvcyk7Ci19Ci0KLWludCBsZWZ3TGF5ZXJBbnRlbm5hQ3VtQXJlYVJhdGlvIChkb3VibGUgIHZhbHVlKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyQW50ZW5uYUN1bUFyZWFSYXRpbyh2YWx1ZSk7Ci19Ci0KLWludCBsZWZ3TGF5ZXJBbnRlbm5hQ3VtRGlmZkFyZWFSYXRpbyAoZG91YmxlICB2YWx1ZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllckFudGVubmFDdW1EaWZmQXJlYVJhdGlvKHZhbHVlKTsKLX0KLQotaW50IGxlZndMYXllckFudGVubmFDdW1EaWZmQXJlYVJhdGlvUHdsIChpbnQgIG51bVB3bHMsIGRvdWJsZSogIGRpZmZ1c2lvbnMsIGRvdWJsZSogIHJhdGlvcykgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllckFudGVubmFDdW1EaWZmQXJlYVJhdGlvUHdsKG51bVB3bHMsIGRpZmZ1c2lvbnMsIHJhdGlvcyk7Ci19Ci0KLWludCBsZWZ3TGF5ZXJBbnRlbm5hQXJlYUZhY3RvciAoZG91YmxlICB2YWx1ZSwgY29uc3QgY2hhciogIGRpZmZVc2VPbmx5KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyQW50ZW5uYUFyZWFGYWN0b3IodmFsdWUsIGRpZmZVc2VPbmx5KTsKLX0KLQotaW50IGxlZndMYXllckFudGVubmFTaWRlQXJlYVJhdGlvIChkb3VibGUgIHZhbHVlKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyQW50ZW5uYVNpZGVBcmVhUmF0aW8odmFsdWUpOwotfQotCi1pbnQgbGVmd0xheWVyQW50ZW5uYURpZmZTaWRlQXJlYVJhdGlvIChkb3VibGUgIHZhbHVlKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyQW50ZW5uYURpZmZTaWRlQXJlYVJhdGlvKHZhbHVlKTsKLX0KLQotaW50IGxlZndMYXllckFudGVubmFEaWZmU2lkZUFyZWFSYXRpb1B3bCAoaW50ICBudW1Qd2xzLCBkb3VibGUqICBkaWZmdXNpb25zLCBkb3VibGUqICByYXRpb3MpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJBbnRlbm5hRGlmZlNpZGVBcmVhUmF0aW9Qd2wobnVtUHdscywgZGlmZnVzaW9ucywgcmF0aW9zKTsKLX0KLQotaW50IGxlZndMYXllckFudGVubmFDdW1TaWRlQXJlYVJhdGlvIChkb3VibGUgIHZhbHVlKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyQW50ZW5uYUN1bVNpZGVBcmVhUmF0aW8odmFsdWUpOwotfQotCi1pbnQgbGVmd0xheWVyQW50ZW5uYUN1bURpZmZTaWRlQXJlYVJhdGlvIChkb3VibGUgIHZhbHVlKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyQW50ZW5uYUN1bURpZmZTaWRlQXJlYVJhdGlvKHZhbHVlKTsKLX0KLQotaW50IGxlZndMYXllckFudGVubmFDdW1EaWZmU2lkZUFyZWFSYXRpb1B3bCAoaW50ICBudW1Qd2xzLCBkb3VibGUqICBkaWZmdXNpb25zLCBkb3VibGUqICByYXRpb3MpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJBbnRlbm5hQ3VtRGlmZlNpZGVBcmVhUmF0aW9Qd2wobnVtUHdscywgZGlmZnVzaW9ucywgcmF0aW9zKTsKLX0KLQotaW50IGxlZndMYXllckFudGVubmFTaWRlQXJlYUZhY3RvciAoZG91YmxlICB2YWx1ZSwgY29uc3QgY2hhciogIGRpZmZVc2VPbmx5KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyQW50ZW5uYVNpZGVBcmVhRmFjdG9yKHZhbHVlLCBkaWZmVXNlT25seSk7Ci19Ci0KLWludCBsZWZ3TGF5ZXJBbnRlbm5hQ3VtUm91dGluZ1BsdXNDdXQgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllckFudGVubmFDdW1Sb3V0aW5nUGx1c0N1dCgpOwotfQotCi1pbnQgbGVmd0xheWVyQW50ZW5uYUdhdGVQbHVzRGlmZiAoZG91YmxlICBwbHVzRGlmZkZhY3RvcikgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndMYXllckFudGVubmFHYXRlUGx1c0RpZmYocGx1c0RpZmZGYWN0b3IpOwotfQotCi1pbnQgbGVmd0xheWVyQW50ZW5uYUFyZWFNaW51c0RpZmYgKGRvdWJsZSAgbWludXNEaWZmRmFjdG9yKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0xheWVyQW50ZW5uYUFyZWFNaW51c0RpZmYobWludXNEaWZmRmFjdG9yKTsKLX0KLQotaW50IGxlZndMYXllckFudGVubmFBcmVhRGlmZlJlZHVjZVB3bCAoaW50ICBudW1Qd2xzLCBkb3VibGUqICBkaWZmQXJlYXMsIGRvdWJsZSogIG1ldGFsRGlmZkZhY3RvcnMpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TGF5ZXJBbnRlbm5hQXJlYURpZmZSZWR1Y2VQd2wobnVtUHdscywgZGlmZkFyZWFzLCBtZXRhbERpZmZGYWN0b3JzKTsKLX0KLQotaW50IGxlZndNaW5pbXVtRGVuc2l0eSAoZG91YmxlICBtaW5EZW5zaXR5KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01pbmltdW1EZW5zaXR5KG1pbkRlbnNpdHkpOwotfQotCi1pbnQgbGVmd01heGltdW1EZW5zaXR5IChkb3VibGUgIG1heERlbnNpdHkpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TWF4aW11bURlbnNpdHkobWF4RGVuc2l0eSk7Ci19Ci0KLWludCBsZWZ3RGVuc2l0eUNoZWNrV2luZG93IChkb3VibGUgIGNoZWNrV2luZG93TGVuZ3RoLCBkb3VibGUgIGNoZWNrV2luZG93V2lkdGgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3RGVuc2l0eUNoZWNrV2luZG93KGNoZWNrV2luZG93TGVuZ3RoLCBjaGVja1dpbmRvd1dpZHRoKTsKLX0KLQotaW50IGxlZndEZW5zaXR5Q2hlY2tTdGVwIChkb3VibGUgIGNoZWNrU3RlcFZhbHVlKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0RlbnNpdHlDaGVja1N0ZXAoY2hlY2tTdGVwVmFsdWUpOwotfQotCi1pbnQgbGVmd0ZpbGxBY3RpdmVTcGFjaW5nIChkb3VibGUgIGZpbGxUb0FjdGl2ZVNwYWNpbmcpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3RmlsbEFjdGl2ZVNwYWNpbmcoZmlsbFRvQWN0aXZlU3BhY2luZyk7Ci19Ci0KLWludCBsZWZ3TWF4dmlhc3RhY2sgKGludCAgdmFsdWUsIGNvbnN0IGNoYXIqICBib3R0b21MYXllciwgY29uc3QgY2hhciogIHRvcExheWVyKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01heHZpYXN0YWNrKHZhbHVlLCBib3R0b21MYXllciwgdG9wTGF5ZXIpOwotfQotCi1pbnQgbGVmd1N0YXJ0UHJvcERlZiAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd1N0YXJ0UHJvcERlZigpOwotfQotCi1pbnQgbGVmd0ludFByb3BEZWYgKGNvbnN0IGNoYXIqICBvYmpUeXBlLCBjb25zdCBjaGFyKiAgcHJvcE5hbWUsIGRvdWJsZSAgbGVmdFJhbmdlLCBkb3VibGUgIHJpZ2h0UmFuZ2UsIGludCAgICAgcHJvcFZhbHVlKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0ludFByb3BEZWYob2JqVHlwZSwgcHJvcE5hbWUsIGxlZnRSYW5nZSwgcmlnaHRSYW5nZSwgcHJvcFZhbHVlKTsKLX0KLQotaW50IGxlZndSZWFsUHJvcERlZiAoY29uc3QgY2hhciogIG9ialR5cGUsIGNvbnN0IGNoYXIqICBwcm9wTmFtZSwgZG91YmxlICBsZWZ0UmFuZ2UsIGRvdWJsZSAgcmlnaHRSYW5nZSwgZG91YmxlICBwcm9wVmFsdWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3UmVhbFByb3BEZWYob2JqVHlwZSwgcHJvcE5hbWUsIGxlZnRSYW5nZSwgcmlnaHRSYW5nZSwgcHJvcFZhbHVlKTsKLX0KLQotaW50IGxlZndTdHJpbmdQcm9wRGVmIChjb25zdCBjaGFyKiAgb2JqVHlwZSwgY29uc3QgY2hhciogIHByb3BOYW1lLCBkb3VibGUgIGxlZnRSYW5nZSwgZG91YmxlICByaWdodFJhbmdlLCBjb25zdCBjaGFyKiAgcHJvcFZhbHVlKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd1N0cmluZ1Byb3BEZWYob2JqVHlwZSwgcHJvcE5hbWUsIGxlZnRSYW5nZSwgcmlnaHRSYW5nZSwgcHJvcFZhbHVlKTsKLX0KLQotaW50IGxlZndFbmRQcm9wRGVmICgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3RW5kUHJvcERlZigpOwotfQotCi1pbnQgbGVmd1N0YXJ0VmlhIChjb25zdCBjaGFyKiAgdmlhTmFtZSwgY29uc3QgY2hhciogIGlzRGVmYXVsdCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndTdGFydFZpYSh2aWFOYW1lLCBpc0RlZmF1bHQpOwotfQotCi1pbnQgbGVmd1ZpYVRvcG9mc3RhY2tvbmx5ICgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3VmlhVG9wb2ZzdGFja29ubHkoKTsKLX0KLQotaW50IGxlZndWaWFGb3JlaWduIChjb25zdCBjaGFyKiAgZm9yZWlnbk5hbWUsIGRvdWJsZSAgeGwsIGRvdWJsZSAgeWwsIGludCAgb3JpZW50KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd1ZpYUZvcmVpZ24oZm9yZWlnbk5hbWUsIHhsLCB5bCwgb3JpZW50KTsKLX0KLQotaW50IGxlZndWaWFGb3JlaWduU3RyIChjb25zdCBjaGFyKiAgZm9yZWlnbk5hbWUsIGRvdWJsZSAgeGwsIGRvdWJsZSAgeWwsIGNvbnN0IGNoYXIqICBvcmllbnQpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3VmlhRm9yZWlnblN0cihmb3JlaWduTmFtZSwgeGwsIHlsLCBvcmllbnQpOwotfQotCi1pbnQgbGVmd1ZpYVJlc2lzdGFuY2UgKGRvdWJsZSAgcmVzaXN0YW5jZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndWaWFSZXNpc3RhbmNlKHJlc2lzdGFuY2UpOwotfQotCi1pbnQgbGVmd1ZpYUxheWVyIChjb25zdCBjaGFyKiAgbGF5ZXJOYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd1ZpYUxheWVyKGxheWVyTmFtZSk7Ci19Ci0KLWludCBsZWZ3VmlhTGF5ZXJSZWN0IChkb3VibGUgIHgxbCwgZG91YmxlICB5MWwsIGRvdWJsZSAgeDJsLCBkb3VibGUgIHkybCwgaW50ICBtYXNrKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd1ZpYUxheWVyUmVjdCh4MWwsIHkxbCwgeDJsLCB5MmwsIG1hc2spOwotfQotCi1pbnQgbGVmd1ZpYUxheWVyUG9seWdvbiAoaW50ICBudW1fcG9seXMsIGRvdWJsZSogIHhsLCBkb3VibGUqICB5bCwgaW50ICBtYXNrKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd1ZpYUxheWVyUG9seWdvbihudW1fcG9seXMsIHhsLCB5bCwgbWFzayk7Ci19Ci0KLWludCBsZWZ3VmlhVmlhcnVsZSAoY29uc3QgY2hhciogIHZpYVJ1bGVOYW1lLCBkb3VibGUgIHhDdXRTaXplLCBkb3VibGUgIHlDdXRTaXplLCBjb25zdCBjaGFyKiAgYm90TWV0YWxMYXllciwgY29uc3QgY2hhciogIGN1dExheWVyLCBjb25zdCBjaGFyKiAgdG9wTWV0YWxMYXllciwgZG91YmxlICB4Q3V0U3BhY2luZywgZG91YmxlICB5Q3V0U3BhY2luZywgZG91YmxlICB4Qm90RW5jLCBkb3VibGUgIHlCb3RFbmMsIGRvdWJsZSAgeFRvcEVuYywgZG91YmxlICB5VG9wRW5jKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd1ZpYVZpYXJ1bGUodmlhUnVsZU5hbWUsIHhDdXRTaXplLCB5Q3V0U2l6ZSwgYm90TWV0YWxMYXllciwgY3V0TGF5ZXIsIHRvcE1ldGFsTGF5ZXIsIHhDdXRTcGFjaW5nLCB5Q3V0U3BhY2luZywgeEJvdEVuYywgeUJvdEVuYywgeFRvcEVuYywgeVRvcEVuYyk7Ci19Ci0KLWludCBsZWZ3VmlhVmlhcnVsZVJvd0NvbCAoaW50ICBudW1DdXRSb3dzLCBpbnQgIG51bUN1dENvbHMpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3VmlhVmlhcnVsZVJvd0NvbChudW1DdXRSb3dzLCBudW1DdXRDb2xzKTsKLX0KLQotaW50IGxlZndWaWFWaWFydWxlT3JpZ2luIChkb3VibGUgIHhPZmZzZXQsIGRvdWJsZSAgeU9mZnNldCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndWaWFWaWFydWxlT3JpZ2luKHhPZmZzZXQsIHlPZmZzZXQpOwotfQotCi1pbnQgbGVmd1ZpYVZpYXJ1bGVPZmZzZXQgKGRvdWJsZSAgeEJvdE9mZnNldCwgZG91YmxlICB5Qm90T2Zmc2V0LCBkb3VibGUgIHhUb3BPZmZzZXQsIGRvdWJsZSAgeVRvcE9mZnNldCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndWaWFWaWFydWxlT2Zmc2V0KHhCb3RPZmZzZXQsIHlCb3RPZmZzZXQsIHhUb3BPZmZzZXQsIHlUb3BPZmZzZXQpOwotfQotCi1pbnQgbGVmd1ZpYVZpYXJ1bGVQYXR0ZXJuIChjb25zdCBjaGFyKiAgY3V0UGF0dGVybikgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndWaWFWaWFydWxlUGF0dGVybihjdXRQYXR0ZXJuKTsKLX0KLQotaW50IGxlZndTdHJpbmdQcm9wZXJ0eSAoY29uc3QgY2hhciogIHByb3BOYW1lLCBjb25zdCBjaGFyKiAgcHJvcFZhbHVlKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd1N0cmluZ1Byb3BlcnR5KHByb3BOYW1lLCBwcm9wVmFsdWUpOwotfQotCi1pbnQgbGVmd1JlYWxQcm9wZXJ0eSAoY29uc3QgY2hhciogIHByb3BOYW1lLCBkb3VibGUgIHByb3BWYWx1ZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndSZWFsUHJvcGVydHkocHJvcE5hbWUsIHByb3BWYWx1ZSk7Ci19Ci0KLWludCBsZWZ3SW50UHJvcGVydHkgKGNvbnN0IGNoYXIqICBwcm9wTmFtZSwgaW50ICBwcm9wVmFsdWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3SW50UHJvcGVydHkocHJvcE5hbWUsIHByb3BWYWx1ZSk7Ci19Ci0KLWludCBsZWZ3RW5kVmlhIChjb25zdCBjaGFyKiAgdmlhTmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndFbmRWaWEodmlhTmFtZSk7Ci19Ci0KLWludCBsZWZ3U3RhcnRWaWFSdWxlIChjb25zdCBjaGFyKiAgdmlhUnVsZU5hbWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3U3RhcnRWaWFSdWxlKHZpYVJ1bGVOYW1lKTsKLX0KLQotaW50IGxlZndWaWFSdWxlTGF5ZXIgKGNvbnN0IGNoYXIqICBsYXllck5hbWUsIGNvbnN0IGNoYXIqICBkaXJlY3Rpb24sIGRvdWJsZSAgbWluV2lkdGgsIGRvdWJsZSAgbWF4V2lkdGgsIGRvdWJsZSAgb3ZlcmhhbmcsIGRvdWJsZSAgbWV0YWxPdmVyaGFuZykgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndWaWFSdWxlTGF5ZXIobGF5ZXJOYW1lLCBkaXJlY3Rpb24sIG1pbldpZHRoLCBtYXhXaWR0aCwgb3ZlcmhhbmcsIG1ldGFsT3ZlcmhhbmcpOwotfQotCi1pbnQgbGVmd1ZpYVJ1bGVWaWEgKGNvbnN0IGNoYXIqICB2aWFOYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd1ZpYVJ1bGVWaWEodmlhTmFtZSk7Ci19Ci0KLWludCBsZWZ3RW5kVmlhUnVsZSAoY29uc3QgY2hhciogIHZpYVJ1bGVOYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0VuZFZpYVJ1bGUodmlhUnVsZU5hbWUpOwotfQotCi1pbnQgbGVmd1N0YXJ0VmlhUnVsZUdlbiAoY29uc3QgY2hhciogIHZpYVJ1bGVOYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd1N0YXJ0VmlhUnVsZUdlbih2aWFSdWxlTmFtZSk7Ci19Ci0KLWludCBsZWZ3VmlhUnVsZUdlbkRlZmF1bHQgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndWaWFSdWxlR2VuRGVmYXVsdCgpOwotfQotCi1pbnQgbGVmd1ZpYVJ1bGVHZW5MYXllciAoY29uc3QgY2hhciogIGxheWVyTmFtZSwgY29uc3QgY2hhciogIGRpcmVjdGlvbiwgZG91YmxlICBtaW5XaWR0aCwgZG91YmxlICBtYXhXaWR0aCwgZG91YmxlICBvdmVyaGFuZywgZG91YmxlICBtZXRhbE92ZXJoYW5nKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd1ZpYVJ1bGVHZW5MYXllcihsYXllck5hbWUsIGRpcmVjdGlvbiwgbWluV2lkdGgsIG1heFdpZHRoLCBvdmVyaGFuZywgbWV0YWxPdmVyaGFuZyk7Ci19Ci0KLWludCBsZWZ3VmlhUnVsZUdlbkxheWVyRW5jbG9zdXJlIChjb25zdCBjaGFyKiAgbGF5ZXJOYW1lLCBkb3VibGUgIG92ZXJoYW5nMSwgZG91YmxlICBvdmVyaGFuZzIsIGRvdWJsZSAgbWluV2lkdGgsIGRvdWJsZSAgbWF4V2lkdGgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3VmlhUnVsZUdlbkxheWVyRW5jbG9zdXJlKGxheWVyTmFtZSwgb3ZlcmhhbmcxLCBvdmVyaGFuZzIsIG1pbldpZHRoLCBtYXhXaWR0aCk7Ci19Ci0KLWludCBsZWZ3VmlhUnVsZUdlbkxheWVyMyAoY29uc3QgY2hhciogIGxheWVyTmFtZSwgZG91YmxlICB4bCwgZG91YmxlICB5bCwgZG91YmxlICB4aCwgZG91YmxlICB5aCwgZG91YmxlICB4U3BhY2luZywgZG91YmxlICB5U3BhY2luZywgZG91YmxlICByZXNpc3RhbmNlKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd1ZpYVJ1bGVHZW5MYXllcjMobGF5ZXJOYW1lLCB4bCwgeWwsIHhoLCB5aCwgeFNwYWNpbmcsIHlTcGFjaW5nLCByZXNpc3RhbmNlKTsKLX0KLQotaW50IGxlZndFbmRWaWFSdWxlR2VuIChjb25zdCBjaGFyKiAgdmlhUnVsZU5hbWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3RW5kVmlhUnVsZUdlbih2aWFSdWxlTmFtZSk7Ci19Ci0KLWludCBsZWZ3U3RhcnROb25EZWZhdWx0UnVsZSAoY29uc3QgY2hhciogIHJ1bGVOYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd1N0YXJ0Tm9uRGVmYXVsdFJ1bGUocnVsZU5hbWUpOwotfQotCi1pbnQgbGVmd05vbkRlZmF1bHRSdWxlTGF5ZXIgKGNvbnN0IGNoYXIqICByb3V0aW5nTGF5ZXJOYW1lLCBkb3VibGUgIHdpZHRoLCBkb3VibGUgIG1pblNwYWNpbmcsIGRvdWJsZSAgd2lyZUV4dGVuc2lvbiwgZG91YmxlICByZXNpc3RhbmNlLCBkb3VibGUgIGNhcGFjaXRhbmNlLCBkb3VibGUgIGVkZ2VDYXApIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3Tm9uRGVmYXVsdFJ1bGVMYXllcihyb3V0aW5nTGF5ZXJOYW1lLCB3aWR0aCwgbWluU3BhY2luZywgd2lyZUV4dGVuc2lvbiwgcmVzaXN0YW5jZSwgY2FwYWNpdGFuY2UsIGVkZ2VDYXApOwotfQotCi1pbnQgbGVmd05vbkRlZmF1bHRSdWxlSGFyZHNwYWNpbmcgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndOb25EZWZhdWx0UnVsZUhhcmRzcGFjaW5nKCk7Ci19Ci0KLWludCBsZWZ3Tm9uRGVmYXVsdFJ1bGVTdGFydFZpYSAoY29uc3QgY2hhciogIHZpYU5hbWUsIGNvbnN0IGNoYXIqICBpc0RlZmF1bHQpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3Tm9uRGVmYXVsdFJ1bGVTdGFydFZpYSh2aWFOYW1lLCBpc0RlZmF1bHQpOwotfQotCi1pbnQgbGVmd05vbkRlZmF1bHRSdWxlRW5kVmlhIChjb25zdCBjaGFyKiAgdmlhTmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndOb25EZWZhdWx0UnVsZUVuZFZpYSh2aWFOYW1lKTsKLX0KLQotaW50IGxlZndOb25EZWZhdWx0UnVsZVVzZVZpYSAoY29uc3QgY2hhciogIHZpYU5hbWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3Tm9uRGVmYXVsdFJ1bGVVc2VWaWEodmlhTmFtZSk7Ci19Ci0KLWludCBsZWZ3Tm9uRGVmYXVsdFJ1bGVVc2VWaWFSdWxlIChjb25zdCBjaGFyKiAgdmlhUnVsZU5hbWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3Tm9uRGVmYXVsdFJ1bGVVc2VWaWFSdWxlKHZpYVJ1bGVOYW1lKTsKLX0KLQotaW50IGxlZndOb25EZWZhdWx0UnVsZU1pbkN1dHMgKGNvbnN0IGNoYXIqICBsYXllck5hbWUsIGludCAgbnVtQ3V0cykgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndOb25EZWZhdWx0UnVsZU1pbkN1dHMobGF5ZXJOYW1lLCBudW1DdXRzKTsKLX0KLQotaW50IGxlZndFbmROb25EZWZhdWx0UnVsZSAoY29uc3QgY2hhciogIHJ1bGVOYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0VuZE5vbkRlZmF1bHRSdWxlKHJ1bGVOYW1lKTsKLX0KLQotaW50IGxlZndTdGFydFNwYWNpbmcgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndTdGFydFNwYWNpbmcoKTsKLX0KLQotaW50IGxlZndTcGFjaW5nIChjb25zdCBjaGFyKiAgbGF5ZXJOYW1lMSwgY29uc3QgY2hhciogIGxheWVyTmFtZTIsIGRvdWJsZSAgbWluU3BhY2UsIGNvbnN0IGNoYXIqICBzdGFjaykgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndTcGFjaW5nKGxheWVyTmFtZTEsIGxheWVyTmFtZTIsIG1pblNwYWNlLCBzdGFjayk7Ci19Ci0KLWludCBsZWZ3RW5kU3BhY2luZyAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0VuZFNwYWNpbmcoKTsKLX0KLQotaW50IGxlZndVbml2ZXJzYWxOb2lzZU1hcmdpbiAoZG91YmxlICBoaWdoLCBkb3VibGUgIGxvdykgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndVbml2ZXJzYWxOb2lzZU1hcmdpbihoaWdoLCBsb3cpOwotfQotCi1pbnQgbGVmd0VkZ2VSYXRlVGhyZXNob2xkMSAoZG91YmxlICBudW0pIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3RWRnZVJhdGVUaHJlc2hvbGQxKG51bSk7Ci19Ci0KLWludCBsZWZ3RWRnZVJhdGVUaHJlc2hvbGQyIChkb3VibGUgIG51bSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndFZGdlUmF0ZVRocmVzaG9sZDIobnVtKTsKLX0KLQotaW50IGxlZndFZGdlUmF0ZVNjYWxlRmFjdG9yIChkb3VibGUgIG51bSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndFZGdlUmF0ZVNjYWxlRmFjdG9yKG51bSk7Ci19Ci0KLWludCBsZWZ3U3RhcnROb2lzZVRhYmxlIChpbnQgIG51bSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndTdGFydE5vaXNlVGFibGUobnVtKTsKLX0KLQotaW50IGxlZndFZGdlUmF0ZSAoZG91YmxlICBudW0pIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3RWRnZVJhdGUobnVtKTsKLX0KLQotaW50IGxlZndPdXRwdXRSZXNpc3RhbmNlIChpbnQgIG51bVJlc2lzdHMsIGRvdWJsZSogIHJlc2lzdGFuY2UpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3T3V0cHV0UmVzaXN0YW5jZShudW1SZXNpc3RzLCByZXNpc3RhbmNlKTsKLX0KLQotaW50IGxlZndWaWN0aW1zIChpbnQgIGxlbmd0aCwgaW50ICBudW1Ob2lzZXMsIGRvdWJsZSogIG5vaXNlcykgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndWaWN0aW1zKGxlbmd0aCwgbnVtTm9pc2VzLCBub2lzZXMpOwotfQotCi1pbnQgbGVmd0VuZE5vaXNlVGFibGUgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndFbmROb2lzZVRhYmxlKCk7Ci19Ci0KLWludCBsZWZ3U3RhcnRDb3JyZWN0VGFibGUgKGludCAgbnVtKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd1N0YXJ0Q29ycmVjdFRhYmxlKG51bSk7Ci19Ci0KLWludCBsZWZ3RW5kQ29ycmVjdFRhYmxlICgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3RW5kQ29ycmVjdFRhYmxlKCk7Ci19Ci0KLWludCBsZWZ3TWluRmVhdHVyZSAoZG91YmxlICB4LCBkb3VibGUgIHkpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TWluRmVhdHVyZSh4LCB5KTsKLX0KLQotaW50IGxlZndTdGFydElyZHJvcCAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd1N0YXJ0SXJkcm9wKCk7Ci19Ci0KLWludCBsZWZ3SXJkcm9wVGFibGUgKGNvbnN0IGNoYXIqICB0YWJsZU5hbWUsIGNvbnN0IGNoYXIqICBjdXJyZW50c052b2x0cykgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndJcmRyb3BUYWJsZSh0YWJsZU5hbWUsIGN1cnJlbnRzTnZvbHRzKTsKLX0KLQotaW50IGxlZndFbmRJcmRyb3AgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndFbmRJcmRyb3AoKTsKLX0KLQotaW50IGxlZndTaXRlIChjb25zdCBjaGFyKiAgc2l0ZU5hbWUsIGNvbnN0IGNoYXIqICBjbGFzc1R5cGUsIGNvbnN0IGNoYXIqICBzeW1tZXRyeSwgZG91YmxlICB3aWR0aCwgZG91YmxlICBoZWlnaHQpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3U2l0ZShzaXRlTmFtZSwgY2xhc3NUeXBlLCBzeW1tZXRyeSwgd2lkdGgsIGhlaWdodCk7Ci19Ci0KLWludCBsZWZ3U2l0ZVJvd1BhdHRlcm4gKGNvbnN0IGNoYXIqICBzaXRlTmFtZSwgaW50ICBvcmllbnQpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3U2l0ZVJvd1BhdHRlcm4oc2l0ZU5hbWUsIG9yaWVudCk7Ci19Ci0KLWludCBsZWZ3U2l0ZVJvd1BhdHRlcm5TdHIgKGNvbnN0IGNoYXIqICBzaXRlTmFtZSwgY29uc3QgY2hhciAqIG9yaWVudCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndTaXRlUm93UGF0dGVyblN0cihzaXRlTmFtZSwgb3JpZW50KTsKLX0KLQotaW50IGxlZndFbmRTaXRlIChjb25zdCBjaGFyKiAgc2l0ZU5hbWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3RW5kU2l0ZShzaXRlTmFtZSk7Ci19Ci0KLWludCBsZWZ3U3RhcnRBcnJheSAoY29uc3QgY2hhciogIGFycmF5TmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndTdGFydEFycmF5KGFycmF5TmFtZSk7Ci19Ci0KLWludCBsZWZ3QXJyYXlTaXRlIChjb25zdCBjaGFyKiAgbmFtZSwgZG91YmxlICBvcmlnWCwgZG91YmxlICBvcmlnWSwgaW50ICBvcmllbnQsIGRvdWJsZSAgbnVtWCwgZG91YmxlICBudW1ZLCBkb3VibGUgIHNwYWNlWCwgZG91YmxlICBzcGFjZVkpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3QXJyYXlTaXRlKG5hbWUsIG9yaWdYLCBvcmlnWSwgb3JpZW50LCBudW1YLCBudW1ZLCBzcGFjZVgsIHNwYWNlWSk7Ci19Ci0KLWludCBsZWZ3QXJyYXlTaXRlU3RyIChjb25zdCBjaGFyKiAgbmFtZSwgZG91YmxlICBvcmlnWCwgZG91YmxlICBvcmlnWSwgY29uc3QgY2hhciAqIG9yaWVudCwgZG91YmxlICBudW1YLCBkb3VibGUgIG51bVksIGRvdWJsZSAgc3BhY2VYLCBkb3VibGUgIHNwYWNlWSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndBcnJheVNpdGVTdHIobmFtZSwgb3JpZ1gsIG9yaWdZLCBvcmllbnQsIG51bVgsIG51bVksIHNwYWNlWCwgc3BhY2VZKTsKLX0KLQotaW50IGxlZndBcnJheUNhbnBsYWNlIChjb25zdCBjaGFyKiAgbmFtZSwgZG91YmxlICBvcmlnWCwgZG91YmxlICBvcmlnWSwgaW50ICBvcmllbnQsIGRvdWJsZSAgbnVtWCwgZG91YmxlICBudW1ZLCBkb3VibGUgIHNwYWNlWCwgZG91YmxlICBzcGFjZVkpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3QXJyYXlDYW5wbGFjZShuYW1lLCBvcmlnWCwgb3JpZ1ksIG9yaWVudCwgbnVtWCwgbnVtWSwgc3BhY2VYLCBzcGFjZVkpOwotfQotCi1pbnQgbGVmd0FycmF5Q2FucGxhY2VTdHIgKGNvbnN0IGNoYXIqICBuYW1lLCBkb3VibGUgIG9yaWdYLCBkb3VibGUgIG9yaWdZLCBjb25zdCBjaGFyICogb3JpZW50LCBkb3VibGUgIG51bVgsIGRvdWJsZSAgbnVtWSwgZG91YmxlICBzcGFjZVgsIGRvdWJsZSAgc3BhY2VZKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0FycmF5Q2FucGxhY2VTdHIobmFtZSwgb3JpZ1gsIG9yaWdZLCBvcmllbnQsIG51bVgsIG51bVksIHNwYWNlWCwgc3BhY2VZKTsKLX0KLQotaW50IGxlZndBcnJheUNhbm5vdG9jY3VweSAoY29uc3QgY2hhciogIG5hbWUsIGRvdWJsZSAgb3JpZ1gsIGRvdWJsZSAgb3JpZ1ksIGludCAgb3JpZW50LCBkb3VibGUgIG51bVgsIGRvdWJsZSAgbnVtWSwgZG91YmxlICBzcGFjZVgsIGRvdWJsZSAgc3BhY2VZKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0FycmF5Q2Fubm90b2NjdXB5KG5hbWUsIG9yaWdYLCBvcmlnWSwgb3JpZW50LCBudW1YLCBudW1ZLCBzcGFjZVgsIHNwYWNlWSk7Ci19Ci0KLWludCBsZWZ3QXJyYXlDYW5ub3RvY2N1cHlTdHIgKGNvbnN0IGNoYXIqICBuYW1lLCBkb3VibGUgIG9yaWdYLCBkb3VibGUgIG9yaWdZLCBjb25zdCBjaGFyICogb3JpZW50LCBkb3VibGUgIG51bVgsIGRvdWJsZSAgbnVtWSwgZG91YmxlICBzcGFjZVgsIGRvdWJsZSAgc3BhY2VZKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0FycmF5Q2Fubm90b2NjdXB5U3RyKG5hbWUsIG9yaWdYLCBvcmlnWSwgb3JpZW50LCBudW1YLCBudW1ZLCBzcGFjZVgsIHNwYWNlWSk7Ci19Ci0KLWludCBsZWZ3QXJyYXlUcmFja3MgKGNvbnN0IGNoYXIqICB4eSwgZG91YmxlICBzdGFydCwgaW50ICBudW1UcmFja3MsIGRvdWJsZSAgc3BhY2UsIGNvbnN0IGNoYXIqICBsYXllcnMpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3QXJyYXlUcmFja3MoeHksIHN0YXJ0LCBudW1UcmFja3MsIHNwYWNlLCBsYXllcnMpOwotfQotCi1pbnQgbGVmd1N0YXJ0QXJyYXlGbG9vcnBsYW4gKGNvbnN0IGNoYXIqICBuYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd1N0YXJ0QXJyYXlGbG9vcnBsYW4obmFtZSk7Ci19Ci0KLWludCBsZWZ3QXJyYXlGbG9vcnBsYW4gKGNvbnN0IGNoYXIqICBzaXRlLCBjb25zdCBjaGFyKiAgbmFtZSwgZG91YmxlICBvcmlnWCwgZG91YmxlICBvcmlnWSwgaW50ICBvcmllbnQsIGludCAgbnVtWCwgaW50ICBudW1ZLCBkb3VibGUgIHNwYWNlWCwgZG91YmxlICBzcGFjZVkpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3QXJyYXlGbG9vcnBsYW4oc2l0ZSwgbmFtZSwgb3JpZ1gsIG9yaWdZLCBvcmllbnQsIG51bVgsIG51bVksIHNwYWNlWCwgc3BhY2VZKTsKLX0KLQotaW50IGxlZndBcnJheUZsb29ycGxhblN0ciAoY29uc3QgY2hhciogIHNpdGUsIGNvbnN0IGNoYXIqICBuYW1lLCBkb3VibGUgIG9yaWdYLCBkb3VibGUgIG9yaWdZLCBjb25zdCBjaGFyICogb3JpZW50LCBpbnQgIG51bVgsIGludCAgbnVtWSwgZG91YmxlICBzcGFjZVgsIGRvdWJsZSAgc3BhY2VZKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0FycmF5Rmxvb3JwbGFuU3RyKHNpdGUsIG5hbWUsIG9yaWdYLCBvcmlnWSwgb3JpZW50LCBudW1YLCBudW1ZLCBzcGFjZVgsIHNwYWNlWSk7Ci19Ci0KLWludCBsZWZ3RW5kQXJyYXlGbG9vcnBsYW4gKGNvbnN0IGNoYXIqICBuYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0VuZEFycmF5Rmxvb3JwbGFuKG5hbWUpOwotfQotCi1pbnQgbGVmd0FycmF5R2NlbGxncmlkIChjb25zdCBjaGFyKiAgeHksIGRvdWJsZSAgc3RhcnRYWSwgaW50ICBjb2xSb3dzLCBkb3VibGUgIHNwYWNlWFkpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3QXJyYXlHY2VsbGdyaWQoeHksIHN0YXJ0WFksIGNvbFJvd3MsIHNwYWNlWFkpOwotfQotCi1pbnQgbGVmd1N0YXJ0QXJyYXlEZWZhdWx0Q2FwIChpbnQgIHNpemUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3U3RhcnRBcnJheURlZmF1bHRDYXAoc2l6ZSk7Ci19Ci0KLWludCBsZWZ3QXJyYXlEZWZhdWx0Q2FwIChkb3VibGUgIG51bVBpbnMsIGRvdWJsZSAgY2FwKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0FycmF5RGVmYXVsdENhcChudW1QaW5zLCBjYXApOwotfQotCi1pbnQgbGVmd0VuZEFycmF5RGVmYXVsdENhcCAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0VuZEFycmF5RGVmYXVsdENhcCgpOwotfQotCi1pbnQgbGVmd0VuZEFycmF5IChjb25zdCBjaGFyKiAgYXJyYXlOYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0VuZEFycmF5KGFycmF5TmFtZSk7Ci19Ci0KLWludCBsZWZ3U3RhcnRNYWNybyAoY29uc3QgY2hhciogIG1hY3JvTmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndTdGFydE1hY3JvKG1hY3JvTmFtZSk7Ci19Ci0KLWludCBsZWZ3TWFjcm9DbGFzcyAoY29uc3QgY2hhciogIHZhbHVlMSwgY29uc3QgY2hhciogIHZhbHVlMikgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndNYWNyb0NsYXNzKHZhbHVlMSwgdmFsdWUyKTsKLX0KLQotaW50IGxlZndNYWNyb0ZpeGVkTWFzayAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvRml4ZWRNYXNrKCk7Ci19Ci0KLWludCBsZWZ3TWFjcm9Tb3VyY2UgKGNvbnN0IGNoYXIqICB2YWx1ZTEpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TWFjcm9Tb3VyY2UodmFsdWUxKTsKLX0KLQotaW50IGxlZndNYWNyb0ZvcmVpZ24gKGNvbnN0IGNoYXIqICBuYW1lLCBkb3VibGUgIHhsLCBkb3VibGUgIHlsLCBpbnQgIG9yaWVudCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndNYWNyb0ZvcmVpZ24obmFtZSwgeGwsIHlsLCBvcmllbnQpOwotfQotCi1pbnQgbGVmd01hY3JvRm9yZWlnblN0ciAoY29uc3QgY2hhciogIG5hbWUsIGRvdWJsZSAgeGwsIGRvdWJsZSAgeWwsIGNvbnN0IGNoYXIgKiBvcmllbnQpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TWFjcm9Gb3JlaWduU3RyKG5hbWUsIHhsLCB5bCwgb3JpZW50KTsKLX0KLQotaW50IGxlZndNYWNyb09yaWdpbiAoZG91YmxlICB4bCwgZG91YmxlICB5bCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndNYWNyb09yaWdpbih4bCwgeWwpOwotfQotCi1pbnQgbGVmd01hY3JvRUVRIChjb25zdCBjaGFyKiAgbWFjcm9OYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvRUVRKG1hY3JvTmFtZSk7Ci19Ci0KLWludCBsZWZ3TWFjcm9MRVEgKGNvbnN0IGNoYXIqICBtYWNyb05hbWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TWFjcm9MRVEobWFjcm9OYW1lKTsKLX0KLQotaW50IGxlZndNYWNyb1NpemUgKGRvdWJsZSAgd2lkdGgsIGRvdWJsZSAgaGVpZ2h0KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKLX0KLQotaW50IGxlZndNYWNyb1N5bW1ldHJ5IChjb25zdCBjaGFyKiAgc3ltbWV0cnkpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TWFjcm9TeW1tZXRyeShzeW1tZXRyeSk7Ci19Ci0KLWludCBsZWZ3TWFjcm9TaXRlIChjb25zdCBjaGFyKiAgc2l0ZU5hbWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TWFjcm9TaXRlKHNpdGVOYW1lKTsKLX0KLQotaW50IGxlZndNYWNyb1NpdGVQYXR0ZXJuIChjb25zdCBjaGFyKiAgbmFtZSwgZG91YmxlICBvcmlnWCwgZG91YmxlICBvcmlnWSwgaW50ICBvcmllbnQsIGludCAgbnVtWCwgaW50ICBudW1ZLCBkb3VibGUgIHNwYWNlWCwgZG91YmxlICBzcGFjZVkpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TWFjcm9TaXRlUGF0dGVybihuYW1lLCBvcmlnWCwgb3JpZ1ksIG9yaWVudCwgbnVtWCwgbnVtWSwgc3BhY2VYLCBzcGFjZVkpOwotfQotCi1pbnQgbGVmd01hY3JvU2l0ZVBhdHRlcm5TdHIgKGNvbnN0IGNoYXIqICBuYW1lLCBkb3VibGUgIG9yaWdYLCBkb3VibGUgIG9yaWdZLCBjb25zdCBjaGFyICogb3JpZW50LCBpbnQgIG51bVgsIGludCAgbnVtWSwgZG91YmxlICBzcGFjZVgsIGRvdWJsZSAgc3BhY2VZKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvU2l0ZVBhdHRlcm5TdHIobmFtZSwgb3JpZ1gsIG9yaWdZLCBvcmllbnQsIG51bVgsIG51bVksIHNwYWNlWCwgc3BhY2VZKTsKLX0KLQotaW50IGxlZndNYWNyb1Bvd2VyIChkb3VibGUgIHBvd2VyKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvUG93ZXIocG93ZXIpOwotfQotCi1pbnQgbGVmd0VuZE1hY3JvIChjb25zdCBjaGFyKiAgbWFjcm9OYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0VuZE1hY3JvKG1hY3JvTmFtZSk7Ci19Ci0KLWludCBsZWZ3U3RhcnRNYWNyb0RlbnNpdHkgKGNvbnN0IGNoYXIqICBsYXllck5hbWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3U3RhcnRNYWNyb0RlbnNpdHkobGF5ZXJOYW1lKTsKLX0KLQotaW50IGxlZndNYWNyb0RlbnNpdHlMYXllclJlY3QgKGRvdWJsZSAgeDEsIGRvdWJsZSAgeTEsIGRvdWJsZSAgeDIsIGRvdWJsZSAgeTIsIGRvdWJsZSAgZGVuc2l0eVZhbHVlKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvRGVuc2l0eUxheWVyUmVjdCh4MSwgeTEsIHgyLCB5MiwgZGVuc2l0eVZhbHVlKTsKLX0KLQotaW50IGxlZndFbmRNYWNyb0RlbnNpdHkgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndFbmRNYWNyb0RlbnNpdHkoKTsKLX0KLQotaW50IGxlZndTdGFydE1hY3JvUGluIChjb25zdCBjaGFyKiAgcGluTmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndTdGFydE1hY3JvUGluKHBpbk5hbWUpOwotfQotCi1pbnQgbGVmd01hY3JvUGluVGFwZXJSdWxlIChjb25zdCBjaGFyKiAgcnVsZU5hbWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TWFjcm9QaW5UYXBlclJ1bGUocnVsZU5hbWUpOwotfQotCi1pbnQgbGVmd01hY3JvUGluRm9yZWlnbiAoY29uc3QgY2hhciogIG5hbWUsIGRvdWJsZSAgeGwsIGRvdWJsZSAgeWwsIGludCAgb3JpZW50KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvUGluRm9yZWlnbihuYW1lLCB4bCwgeWwsIG9yaWVudCk7Ci19Ci0KLWludCBsZWZ3TWFjcm9QaW5Gb3JlaWduU3RyIChjb25zdCBjaGFyKiAgbmFtZSwgZG91YmxlICB4bCwgZG91YmxlICB5bCwgY29uc3QgY2hhciogIG9yaWVudCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndNYWNyb1BpbkZvcmVpZ25TdHIobmFtZSwgeGwsIHlsLCBvcmllbnQpOwotfQotCi1pbnQgbGVmd01hY3JvUGluTEVRIChjb25zdCBjaGFyKiAgcGluTmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndNYWNyb1BpbkxFUShwaW5OYW1lKTsKLX0KLQotaW50IGxlZndNYWNyb1BpbkRpcmVjdGlvbiAoY29uc3QgY2hhciogIGRpcmVjdGlvbikgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndNYWNyb1BpbkRpcmVjdGlvbihkaXJlY3Rpb24pOwotfQotCi1pbnQgbGVmd01hY3JvUGluVXNlIChjb25zdCBjaGFyKiAgdXNlKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvUGluVXNlKHVzZSk7Ci19Ci0KLWludCBsZWZ3TWFjcm9QaW5TaGFwZSAoY29uc3QgY2hhciogIG5hbWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TWFjcm9QaW5TaGFwZShuYW1lKTsKLX0KLQotaW50IGxlZndNYWNyb1Bpbk11c3Rqb2luIChjb25zdCBjaGFyKiAgbmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndNYWNyb1Bpbk11c3Rqb2luKG5hbWUpOwotfQotCi1pbnQgbGVmd01hY3JvUGluTmV0RXhwciAoY29uc3QgY2hhciogIG5hbWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TWFjcm9QaW5OZXRFeHByKG5hbWUpOwotfQotCi1pbnQgbGVmd01hY3JvUGluU3VwcGx5U2Vuc2l0aXZpdHkgKGNvbnN0IGNoYXIqICBwaW5OYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvUGluU3VwcGx5U2Vuc2l0aXZpdHkocGluTmFtZSk7Ci19Ci0KLWludCBsZWZ3TWFjcm9QaW5Hcm91bmRTZW5zaXRpdml0eSAoY29uc3QgY2hhciogIHBpbk5hbWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TWFjcm9QaW5Hcm91bmRTZW5zaXRpdml0eShwaW5OYW1lKTsKLX0KLQotaW50IGxlZndNYWNyb1Bpbk91dHB1dG5vaXNlbWFyZ2luIChpbnQgIGhpZ2gsIGludCAgbG93KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvUGluT3V0cHV0bm9pc2VtYXJnaW4oaGlnaCwgbG93KTsKLX0KLQotaW50IGxlZndNYWNyb1Bpbk91dHB1dHJlc2lzdGFuY2UgKGludCAgaGlnaCwgaW50ICBsb3cpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TWFjcm9QaW5PdXRwdXRyZXNpc3RhbmNlKGhpZ2gsIGxvdyk7Ci19Ci0KLWludCBsZWZ3TWFjcm9QaW5JbnB1dG5vaXNlbWFyZ2luIChpbnQgIGhpZ2gsIGludCAgbG93KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvUGluSW5wdXRub2lzZW1hcmdpbihoaWdoLCBsb3cpOwotfQotCi1pbnQgbGVmd01hY3JvUGluUG93ZXIgKGRvdWJsZSAgcG93ZXIpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TWFjcm9QaW5Qb3dlcihwb3dlcik7Ci19Ci0KLWludCBsZWZ3TWFjcm9QaW5MZWFrYWdlIChkb3VibGUgIGxlYWthZ2UpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TWFjcm9QaW5MZWFrYWdlKGxlYWthZ2UpOwotfQotCi1pbnQgbGVmd01hY3JvUGluQ2FwYWNpdGFuY2UgKGRvdWJsZSAgY2FwYWNpdGFuY2UpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TWFjcm9QaW5DYXBhY2l0YW5jZShjYXBhY2l0YW5jZSk7Ci19Ci0KLWludCBsZWZ3TWFjcm9QaW5SZXNpc3RhbmNlIChkb3VibGUgIHJlc2lzdGFuY2UpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TWFjcm9QaW5SZXNpc3RhbmNlKHJlc2lzdGFuY2UpOwotfQotCi1pbnQgbGVmd01hY3JvUGluUHVsbGRvd25yZXMgKGRvdWJsZSAgcmVzaXN0YW5jZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndNYWNyb1BpblB1bGxkb3ducmVzKHJlc2lzdGFuY2UpOwotfQotCi1pbnQgbGVmd01hY3JvUGluVGllb2ZmciAoZG91YmxlICByZXNpc3RhbmNlKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvUGluVGllb2ZmcihyZXNpc3RhbmNlKTsKLX0KLQotaW50IGxlZndNYWNyb1BpblZISSAoZG91YmxlICB2b2x0YWdlKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvUGluVkhJKHZvbHRhZ2UpOwotfQotCi1pbnQgbGVmd01hY3JvUGluVkxPIChkb3VibGUgIHZvbHRhZ2UpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TWFjcm9QaW5WTE8odm9sdGFnZSk7Ci19Ci0KLWludCBsZWZ3TWFjcm9QaW5SaXNldm9sdGFnZXRocmVzaG9sZCAoZG91YmxlICB2b2x0YWdlKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvUGluUmlzZXZvbHRhZ2V0aHJlc2hvbGQodm9sdGFnZSk7Ci19Ci0KLWludCBsZWZ3TWFjcm9QaW5GYWxsdm9sdGFnZXRocmVzaG9sZCAoZG91YmxlICB2b2x0YWdlKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvUGluRmFsbHZvbHRhZ2V0aHJlc2hvbGQodm9sdGFnZSk7Ci19Ci0KLWludCBsZWZ3TWFjcm9QaW5SaXNldGhyZXNoIChkb3VibGUgIGNhcGFjaXRhbmNlKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvUGluUmlzZXRocmVzaChjYXBhY2l0YW5jZSk7Ci19Ci0KLWludCBsZWZ3TWFjcm9QaW5GYWxsdGhyZXNoIChkb3VibGUgIGNhcGFjaXRhbmNlKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvUGluRmFsbHRocmVzaChjYXBhY2l0YW5jZSk7Ci19Ci0KLWludCBsZWZ3TWFjcm9QaW5SaXNlc2F0Y3VyIChkb3VibGUgIGN1cnJlbnQpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TWFjcm9QaW5SaXNlc2F0Y3VyKGN1cnJlbnQpOwotfQotCi1pbnQgbGVmd01hY3JvUGluRmFsbHNhdGN1ciAoZG91YmxlICBjdXJyZW50KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvUGluRmFsbHNhdGN1cihjdXJyZW50KTsKLX0KLQotaW50IGxlZndNYWNyb1BpbkN1cnJlbnRzb3VyY2UgKGNvbnN0IGNoYXIqICBuYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvUGluQ3VycmVudHNvdXJjZShuYW1lKTsKLX0KLQotaW50IGxlZndNYWNyb1BpbklWX1RhYmxlcyAoY29uc3QgY2hhciogIGxvd05hbWUsIGNvbnN0IGNoYXIqICBoaWdoTmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndNYWNyb1BpbklWX1RhYmxlcyhsb3dOYW1lLCBoaWdoTmFtZSk7Ci19Ci0KLWludCBsZWZ3TWFjcm9QaW5BbnRlbm5hc2l6ZSAoZG91YmxlICB2YWx1ZSwgY29uc3QgY2hhciogIGxheWVyTmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndNYWNyb1BpbkFudGVubmFzaXplKHZhbHVlLCBsYXllck5hbWUpOwotfQotCi1pbnQgbGVmd01hY3JvUGluQW50ZW5uYU1ldGFsQXJlYSAoZG91YmxlICB2YWx1ZSwgY29uc3QgY2hhciogIGxheWVyTmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndNYWNyb1BpbkFudGVubmFNZXRhbEFyZWEodmFsdWUsIGxheWVyTmFtZSk7Ci19Ci0KLWludCBsZWZ3TWFjcm9QaW5BbnRlbm5hTWV0YWxMZW5ndGggKGRvdWJsZSAgdmFsdWUsIGNvbnN0IGNoYXIqICBsYXllck5hbWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TWFjcm9QaW5BbnRlbm5hTWV0YWxMZW5ndGgodmFsdWUsIGxheWVyTmFtZSk7Ci19Ci0KLWludCBsZWZ3TWFjcm9QaW5BbnRlbm5hUGFydGlhbE1ldGFsQXJlYSAoZG91YmxlICB2YWx1ZSwgY29uc3QgY2hhciogIGxheWVyTmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndNYWNyb1BpbkFudGVubmFQYXJ0aWFsTWV0YWxBcmVhKHZhbHVlLCBsYXllck5hbWUpOwotfQotCi1pbnQgbGVmd01hY3JvUGluQW50ZW5uYVBhcnRpYWxNZXRhbFNpZGVBcmVhIChkb3VibGUgIHZhbHVlLCBjb25zdCBjaGFyKiAgbGF5ZXJOYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvUGluQW50ZW5uYVBhcnRpYWxNZXRhbFNpZGVBcmVhKHZhbHVlLCBsYXllck5hbWUpOwotfQotCi1pbnQgbGVmd01hY3JvUGluQW50ZW5uYVBhcnRpYWxDdXRBcmVhIChkb3VibGUgIHZhbHVlLCBjb25zdCBjaGFyKiAgbGF5ZXJOYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvUGluQW50ZW5uYVBhcnRpYWxDdXRBcmVhKHZhbHVlLCBsYXllck5hbWUpOwotfQotCi1pbnQgbGVmd01hY3JvUGluQW50ZW5uYURpZmZBcmVhIChkb3VibGUgIHZhbHVlLCBjb25zdCBjaGFyKiAgbGF5ZXJOYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvUGluQW50ZW5uYURpZmZBcmVhKHZhbHVlLCBsYXllck5hbWUpOwotfQotCi1pbnQgbGVmd01hY3JvUGluQW50ZW5uYU1vZGVsIChjb25zdCBjaGFyKiAgb3hpZGUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TWFjcm9QaW5BbnRlbm5hTW9kZWwob3hpZGUpOwotfQotCi1pbnQgbGVmd01hY3JvUGluQW50ZW5uYUdhdGVBcmVhIChkb3VibGUgIHZhbHVlLCBjb25zdCBjaGFyKiAgbGF5ZXJOYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvUGluQW50ZW5uYUdhdGVBcmVhKHZhbHVlLCBsYXllck5hbWUpOwotfQotCi1pbnQgbGVmd01hY3JvUGluQW50ZW5uYU1heEFyZWFDYXIgKGRvdWJsZSAgdmFsdWUsIGNvbnN0IGNoYXIqICBsYXllck5hbWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TWFjcm9QaW5BbnRlbm5hTWF4QXJlYUNhcih2YWx1ZSwgbGF5ZXJOYW1lKTsKLX0KLQotaW50IGxlZndNYWNyb1BpbkFudGVubmFNYXhTaWRlQXJlYUNhciAoZG91YmxlICB2YWx1ZSwgY29uc3QgY2hhciogIGxheWVyTmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndNYWNyb1BpbkFudGVubmFNYXhTaWRlQXJlYUNhcih2YWx1ZSwgbGF5ZXJOYW1lKTsKLX0KLQotaW50IGxlZndNYWNyb1BpbkFudGVubmFNYXhDdXRDYXIgKGRvdWJsZSAgdmFsdWUsIGNvbnN0IGNoYXIqICBsYXllck5hbWUpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TWFjcm9QaW5BbnRlbm5hTWF4Q3V0Q2FyKHZhbHVlLCBsYXllck5hbWUpOwotfQotCi1pbnQgbGVmd0VuZE1hY3JvUGluIChjb25zdCBjaGFyKiAgcGluTmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndFbmRNYWNyb1BpbihwaW5OYW1lKTsKLX0KLQotaW50IGxlZndTdGFydE1hY3JvUGluUG9ydCAoY29uc3QgY2hhciogIGNsYXNzVHlwZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndTdGFydE1hY3JvUGluUG9ydChjbGFzc1R5cGUpOwotfQotCi1pbnQgbGVmd01hY3JvUGluUG9ydExheWVyIChjb25zdCBjaGFyKiAgbGF5ZXJOYW1lLCBkb3VibGUgIHNwYWNpbmcpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TWFjcm9QaW5Qb3J0TGF5ZXIobGF5ZXJOYW1lLCBzcGFjaW5nKTsKLX0KLQotaW50IGxlZndNYWNyb1BpblBvcnREZXNpZ25SdWxlV2lkdGggKGNvbnN0IGNoYXIqICBsYXllck5hbWUsIGRvdWJsZSAgd2lkdGgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TWFjcm9QaW5Qb3J0RGVzaWduUnVsZVdpZHRoKGxheWVyTmFtZSwgd2lkdGgpOwotfQotCi1pbnQgbGVmd01hY3JvUGluUG9ydExheWVyV2lkdGggKGRvdWJsZSAgd2lkdGgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TWFjcm9QaW5Qb3J0TGF5ZXJXaWR0aCh3aWR0aCk7Ci19Ci0KLWludCBsZWZ3TWFjcm9QaW5Qb3J0TGF5ZXJQYXRoIChpbnQgIG51bV9wYXRocywgZG91YmxlKiAgeGwsIGRvdWJsZSogIHlsLCBpbnQgIG51bVgsIGludCAgbnVtWSwgZG91YmxlICBzcGFjZVgsIGRvdWJsZSAgc3BhY2VZLCBpbnQgICAgIG1hc2spIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TWFjcm9QaW5Qb3J0TGF5ZXJQYXRoKG51bV9wYXRocywgeGwsIHlsLCBudW1YLCBudW1ZLCBzcGFjZVgsIHNwYWNlWSwgbWFzayk7Ci19Ci0KLWludCBsZWZ3TWFjcm9QaW5Qb3J0TGF5ZXJSZWN0IChkb3VibGUgIHhsMSwgZG91YmxlICB5bDEsIGRvdWJsZSAgeGwyLCBkb3VibGUgIHlsMiwgaW50ICBudW1YLCBpbnQgIG51bVksIGRvdWJsZSAgc3BhY2VYLCBkb3VibGUgIHNwYWNlWSwgaW50ICBtYXNrKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvUGluUG9ydExheWVyUmVjdCh4bDEsIHlsMSwgeGwyLCB5bDIsIG51bVgsIG51bVksIHNwYWNlWCwgc3BhY2VZLCBtYXNrKTsKLX0KLQotaW50IGxlZndNYWNyb1BpblBvcnRMYXllclBvbHlnb24gKGludCAgbnVtX3BvbHlzLCBkb3VibGUqICB4bCwgZG91YmxlKiAgeWwsIGludCAgbnVtWCwgaW50ICBudW1ZLCBkb3VibGUgIHNwYWNlWCwgZG91YmxlICBzcGFjZVksIGludCAgbWFzaykgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndNYWNyb1BpblBvcnRMYXllclBvbHlnb24obnVtX3BvbHlzLCB4bCwgeWwsIG51bVgsIG51bVksIHNwYWNlWCwgc3BhY2VZLCBtYXNrKTsKLX0KLQotaW50IGxlZndNYWNyb1BpblBvcnRWaWEgKGRvdWJsZSAgeGwsIGRvdWJsZSAgeWwsIGNvbnN0IGNoYXIqICB2aWFOYW1lLCBpbnQgIG51bVgsIGludCAgbnVtWSwgZG91YmxlICBzcGFjZVgsIGRvdWJsZSAgc3BhY2VZLCBpbnQgIG1hc2spIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TWFjcm9QaW5Qb3J0VmlhKHhsLCB5bCwgdmlhTmFtZSwgbnVtWCwgbnVtWSwgc3BhY2VYLCBzcGFjZVksIG1hc2spOwotfQotCi1pbnQgbGVmd0VuZE1hY3JvUGluUG9ydCAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0VuZE1hY3JvUGluUG9ydCgpOwotfQotCi1pbnQgbGVmd1N0YXJ0TWFjcm9PYnMgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndTdGFydE1hY3JvT2JzKCk7Ci19Ci0KLWludCBsZWZ3TWFjcm9PYnNMYXllciAoY29uc3QgY2hhciogIGxheWVyTmFtZSwgZG91YmxlICBzcGFjaW5nKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvT2JzTGF5ZXIobGF5ZXJOYW1lLCBzcGFjaW5nKTsKLX0KLQotaW50IGxlZndNYWNyb09ic0Rlc2lnblJ1bGVXaWR0aCAoY29uc3QgY2hhciogIGxheWVyTmFtZSwgZG91YmxlICB3aWR0aCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndNYWNyb09ic0Rlc2lnblJ1bGVXaWR0aChsYXllck5hbWUsIHdpZHRoKTsKLX0KLQotaW50IGxlZndNYWNyb0V4Y2VwdFBHTmV0IChjb25zdCBjaGFyKiAgbGF5ZXJOYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvRXhjZXB0UEdOZXQobGF5ZXJOYW1lKTsKLX0KLQotaW50IGxlZndNYWNyb09ic0xheWVyV2lkdGggKGRvdWJsZSAgd2lkdGgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TWFjcm9PYnNMYXllcldpZHRoKHdpZHRoKTsKLX0KLQotaW50IGxlZndNYWNyb09ic0xheWVyUGF0aCAoaW50ICBudW1fcGF0aHMsIGRvdWJsZSogIHhsLCBkb3VibGUqICB5bCwgaW50ICBudW1YLCBpbnQgIG51bVksIGRvdWJsZSAgc3BhY2VYLCBkb3VibGUgIHNwYWNlWSwgaW50ICBtYXNrKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvT2JzTGF5ZXJQYXRoKG51bV9wYXRocywgeGwsIHlsLCBudW1YLCBudW1ZLCBzcGFjZVgsIHNwYWNlWSwgbWFzayk7Ci19Ci0KLWludCBsZWZ3TWFjcm9PYnNMYXllclJlY3QgKGRvdWJsZSAgeGwxLCBkb3VibGUgIHlsMSwgZG91YmxlICB4bDIsIGRvdWJsZSAgeWwyLCBpbnQgIG51bVgsIGludCAgbnVtWSwgZG91YmxlICBzcGFjZVgsIGRvdWJsZSAgc3BhY2VZLCBpbnQgIG1hc2spIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TWFjcm9PYnNMYXllclJlY3QoeGwxLCB5bDEsIHhsMiwgeWwyLCBudW1YLCBudW1ZLCBzcGFjZVgsIHNwYWNlWSwgbWFzayk7Ci19Ci0KLWludCBsZWZ3TWFjcm9PYnNMYXllclBvbHlnb24gKGludCAgbnVtX3BvbHlzLCBkb3VibGUqICB4bCwgZG91YmxlKiAgeWwsIGludCAgbnVtWCwgaW50ICBudW1ZLCBkb3VibGUgIHNwYWNlWCwgZG91YmxlICBzcGFjZVksIGludCAgbWFzaykgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndNYWNyb09ic0xheWVyUG9seWdvbihudW1fcG9seXMsIHhsLCB5bCwgbnVtWCwgbnVtWSwgc3BhY2VYLCBzcGFjZVksIG1hc2spOwotfQotCi1pbnQgbGVmd01hY3JvT2JzVmlhIChkb3VibGUgIHhsLCBkb3VibGUgIHlsLCBjb25zdCBjaGFyKiAgdmlhTmFtZSwgaW50ICBudW1YLCBpbnQgIG51bVksIGRvdWJsZSAgc3BhY2VYLCBkb3VibGUgIHNwYWNlWSwgaW50ICBtYXNrKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvT2JzVmlhKHhsLCB5bCwgdmlhTmFtZSwgbnVtWCwgbnVtWSwgc3BhY2VYLCBzcGFjZVksIG1hc2spOwotfQotCi1pbnQgbGVmd0VuZE1hY3JvT2JzICgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3RW5kTWFjcm9PYnMoKTsKLX0KLQotaW50IGxlZndTdGFydE1hY3JvVGltaW5nICgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3U3RhcnRNYWNyb1RpbWluZygpOwotfQotCi1pbnQgbGVmd01hY3JvVGltaW5nUGluIChjb25zdCBjaGFyKiAgZnJvbVBpbiwgY29uc3QgY2hhciogIHRvUGluKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvVGltaW5nUGluKGZyb21QaW4sIHRvUGluKTsKLX0KLQotaW50IGxlZndNYWNyb1RpbWluZ0ludHJpbnNpYyAoY29uc3QgY2hhciogIHJpc2VGYWxsLCBkb3VibGUgIG1pbiwgZG91YmxlICBtYXgsIGRvdWJsZSAgc2xld1QxLCBkb3VibGUgIHNsZXdUMU1pbiwgZG91YmxlICBzbGV3VDFNYXgsIGRvdWJsZSAgc2xld1QyLCBkb3VibGUgIHNsZXdUMk1pbiwgZG91YmxlICBzbGV3VDJNYXgsIGRvdWJsZSAgc2xld1QzLCBkb3VibGUgIHZhck1pbiwgZG91YmxlICB2YXJNYXgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3TWFjcm9UaW1pbmdJbnRyaW5zaWMocmlzZUZhbGwsIG1pbiwgbWF4LCBzbGV3VDEsIHNsZXdUMU1pbiwgc2xld1QxTWF4LCBzbGV3VDIsIHNsZXdUMk1pbiwgc2xld1QyTWF4LCBzbGV3VDMsIHZhck1pbiwgdmFyTWF4KTsKLX0KLQotaW50IGxlZndNYWNyb1RpbWluZ1Jpc2VycyAoZG91YmxlICBtaW4sIGRvdWJsZSAgbWF4KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvVGltaW5nUmlzZXJzKG1pbiwgbWF4KTsKLX0KLQotaW50IGxlZndNYWNyb1RpbWluZ0ZhbGxycyAoZG91YmxlICBtaW4sIGRvdWJsZSAgbWF4KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvVGltaW5nRmFsbHJzKG1pbiwgbWF4KTsKLX0KLQotaW50IGxlZndNYWNyb1RpbWluZ1Jpc2VjcyAoZG91YmxlICBtaW4sIGRvdWJsZSAgbWF4KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvVGltaW5nUmlzZWNzKG1pbiwgbWF4KTsKLX0KLQotaW50IGxlZndNYWNyb1RpbWluZ0ZhbGxjcyAoZG91YmxlICBtaW4sIGRvdWJsZSAgbWF4KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvVGltaW5nRmFsbGNzKG1pbiwgbWF4KTsKLX0KLQotaW50IGxlZndNYWNyb1RpbWluZ1Jpc2VzYXR0MSAoZG91YmxlICBtaW4sIGRvdWJsZSAgbWF4KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvVGltaW5nUmlzZXNhdHQxKG1pbiwgbWF4KTsKLX0KLQotaW50IGxlZndNYWNyb1RpbWluZ0ZhbGxzYXR0MSAoZG91YmxlICBtaW4sIGRvdWJsZSAgbWF4KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvVGltaW5nRmFsbHNhdHQxKG1pbiwgbWF4KTsKLX0KLQotaW50IGxlZndNYWNyb1RpbWluZ1Jpc2V0MCAoZG91YmxlICBtaW4sIGRvdWJsZSAgbWF4KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvVGltaW5nUmlzZXQwKG1pbiwgbWF4KTsKLX0KLQotaW50IGxlZndNYWNyb1RpbWluZ0ZhbGx0MCAoZG91YmxlICBtaW4sIGRvdWJsZSAgbWF4KSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd01hY3JvVGltaW5nRmFsbHQwKG1pbiwgbWF4KTsKLX0KLQotaW50IGxlZndNYWNyb1RpbWluZ1VuYXRlbmVzcyAoY29uc3QgY2hhciogIHVuYXRlbmVzcykgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndNYWNyb1RpbWluZ1VuYXRlbmVzcyh1bmF0ZW5lc3MpOwotfQotCi1pbnQgbGVmd0VuZE1hY3JvVGltaW5nICgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3RW5kTWFjcm9UaW1pbmcoKTsKLX0KLQotaW50IGxlZndBbnRlbm5hIChjb25zdCBjaGFyKiAgdHlwZSwgZG91YmxlICB2YWx1ZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndBbnRlbm5hKHR5cGUsIHZhbHVlKTsKLX0KLQotaW50IGxlZndTdGFydEJlZ2luZXh0IChjb25zdCBjaGFyKiAgbmFtZSkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndTdGFydEJlZ2luZXh0KG5hbWUpOwotfQotCi1pbnQgbGVmd0JlZ2luZXh0Q3JlYXRvciAoY29uc3QgY2hhciogIGNyZWF0b3JOYW1lKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0JlZ2luZXh0Q3JlYXRvcihjcmVhdG9yTmFtZSk7Ci19Ci0KLWludCBsZWZ3QmVnaW5leHREYXRlICgpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3QmVnaW5leHREYXRlKCk7Ci19Ci0KLWludCBsZWZ3QmVnaW5leHRSZXZpc2lvbiAoaW50ICB2ZXJzMSwgaW50ICB2ZXJzMikgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndCZWdpbmV4dFJldmlzaW9uKHZlcnMxLCB2ZXJzMik7Ci19Ci0KLWludCBsZWZ3QmVnaW5leHRTeW50YXggKGNvbnN0IGNoYXIqICB0aXRsZSwgY29uc3QgY2hhciogIHN0cmluZykgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndCZWdpbmV4dFN5bnRheCh0aXRsZSwgc3RyaW5nKTsKLX0KLQotaW50IGxlZndFbmRCZWdpbmV4dCAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0VuZEJlZ2luZXh0KCk7Ci19Ci0KLWludCBsZWZ3Q3VycmVudExpbmVOdW1iZXIgKCkgewotICAgIHJldHVybiBMZWZEZWZQYXJzZXI6OmxlZndDdXJyZW50TGluZU51bWJlcigpOwotfQotCi1pbnQgbGVmd0VuZCAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0VuZCgpOwotfQotCi12b2lkIGxlZndQcmludEVycm9yIChpbnQgIHN0YXR1cykgewotICAgIExlZkRlZlBhcnNlcjo6bGVmd1ByaW50RXJyb3Ioc3RhdHVzKTsKLX0KLQotdm9pZCBsZWZ3QWRkQ29tbWVudCAoY29uc3QgY2hhciogIGNvbW1lbnQpIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZndBZGRDb21tZW50KGNvbW1lbnQpOwotfQotCi12b2lkIGxlZndBZGRJbmRlbnQgKCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmd0FkZEluZGVudCgpOwotfQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZi94bGVmd1dyaXRlckNhbGxzLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL3hsZWZ3V3JpdGVyQ2FsbHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzMxZjAzLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9jbGVmL3hsZWZ3V3JpdGVyQ2FsbHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkICAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jZGVmaW5lIEVYVEVSTiBleHRlcm4gIkMiCi0KLSNpbmNsdWRlICJsZWZ3V3JpdGVyQ2FsbHMuaCIKLSNpbmNsdWRlICJsZWZ3V3JpdGVyQ2FsbHMuaHBwIgotCi0vLyBXcmFwcGVycyBkZWZpbml0aW9ucy4KLWludCBsZWZ3V3JpdGUgKEZJTEUgKiBmaWxlLCBjb25zdCBjaGFyICogZmlsZU5hbWUsIGxlZmlVc2VyRGF0YSAgdXNlckRhdGEpIHsKLSAgICByZXR1cm4gTGVmRGVmUGFyc2VyOjpsZWZ3V3JpdGUoZmlsZSwgZmlsZU5hbWUsIHVzZXJEYXRhKTsKLX0KLQotdm9pZCBsZWZ3U2V0UmVnaXN0ZXJVbnVzZWRDYWxsYmFja3MgKCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmd1NldFJlZ2lzdGVyVW51c2VkQ2FsbGJhY2tzKCk7Ci19Ci0KLXZvaWQgbGVmd1ByaW50VW51c2VkQ2FsbGJhY2tzIChGSUxFKiAgZikgewotICAgIExlZkRlZlBhcnNlcjo6bGVmd1ByaW50VW51c2VkQ2FsbGJhY2tzKGYpOwotfQotCi12b2lkIGxlZndTZXRVc2VyRGF0YSAobGVmaVVzZXJEYXRhICBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmd1NldFVzZXJEYXRhKHAwKTsKLX0KLQotbGVmaVVzZXJEYXRhIGxlZndHZXRVc2VyRGF0YSAoKSB7Ci0gICAgcmV0dXJuIExlZkRlZlBhcnNlcjo6bGVmd0dldFVzZXJEYXRhKCk7Ci19Ci0KLXZvaWQgbGVmd1NldFZlcnNpb25DYmsgKDo6bGVmd1ZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZndTZXRWZXJzaW9uQ2JrKChMZWZEZWZQYXJzZXI6OmxlZndWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmd1NldENhc2VTZW5zaXRpdmVDYmsgKDo6bGVmd1ZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZndTZXRDYXNlU2Vuc2l0aXZlQ2JrKChMZWZEZWZQYXJzZXI6OmxlZndWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmd1NldE5vV2lyZUV4dGVuc2lvbkNiayAoOjpsZWZ3Vm9pZENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmd1NldE5vV2lyZUV4dGVuc2lvbkNiaygoTGVmRGVmUGFyc2VyOjpsZWZ3Vm9pZENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGxlZndTZXRCdXNCaXRDaGFyc0NiayAoOjpsZWZ3Vm9pZENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmd1NldEJ1c0JpdENoYXJzQ2JrKChMZWZEZWZQYXJzZXI6OmxlZndWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmd1NldERpdmlkZXJDaGFyQ2JrICg6OmxlZndWb2lkQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZ3U2V0RGl2aWRlckNoYXJDYmsoKExlZkRlZlBhcnNlcjo6bGVmd1ZvaWRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBsZWZ3U2V0TWFudWZhY3R1cmluZ0dyaWRDYmsgKDo6bGVmd1ZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZndTZXRNYW51ZmFjdHVyaW5nR3JpZENiaygoTGVmRGVmUGFyc2VyOjpsZWZ3Vm9pZENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGxlZndTZXRVc2VNaW5TcGFjaW5nQ2JrICg6OmxlZndWb2lkQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZ3U2V0VXNlTWluU3BhY2luZ0NiaygoTGVmRGVmUGFyc2VyOjpsZWZ3Vm9pZENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGxlZndTZXRDbGVhcmFuY2VNZWFzdXJlQ2JrICg6OmxlZndWb2lkQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZ3U2V0Q2xlYXJhbmNlTWVhc3VyZUNiaygoTGVmRGVmUGFyc2VyOjpsZWZ3Vm9pZENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGxlZndTZXRVbml0c0NiayAoOjpsZWZ3Vm9pZENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmd1NldFVuaXRzQ2JrKChMZWZEZWZQYXJzZXI6OmxlZndWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmd0FudGVubmFJbnB1dEdhdGVBcmVhQ2JrICg6OmxlZndWb2lkQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZ3QW50ZW5uYUlucHV0R2F0ZUFyZWFDYmsoKExlZkRlZlBhcnNlcjo6bGVmd1ZvaWRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBsZWZ3QW50ZW5uYUluT3V0RGlmZkFyZWFDYmsgKDo6bGVmd1ZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZndBbnRlbm5hSW5PdXREaWZmQXJlYUNiaygoTGVmRGVmUGFyc2VyOjpsZWZ3Vm9pZENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGxlZndBbnRlbm5hT3V0cHV0RGlmZkFyZWFDYmsgKDo6bGVmd1ZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZndBbnRlbm5hT3V0cHV0RGlmZkFyZWFDYmsoKExlZkRlZlBhcnNlcjo6bGVmd1ZvaWRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBsZWZ3U2V0UHJvcERlZkNiayAoOjpsZWZ3Vm9pZENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmd1NldFByb3BEZWZDYmsoKExlZkRlZlBhcnNlcjo6bGVmd1ZvaWRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBsZWZ3U2V0TGF5ZXJDYmsgKDo6bGVmd1ZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZndTZXRMYXllckNiaygoTGVmRGVmUGFyc2VyOjpsZWZ3Vm9pZENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGxlZndTZXRWaWFDYmsgKDo6bGVmd1ZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZndTZXRWaWFDYmsoKExlZkRlZlBhcnNlcjo6bGVmd1ZvaWRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBsZWZ3U2V0VmlhUnVsZUNiayAoOjpsZWZ3Vm9pZENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmd1NldFZpYVJ1bGVDYmsoKExlZkRlZlBhcnNlcjo6bGVmd1ZvaWRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBsZWZ3U2V0Tm9uRGVmYXVsdENiayAoOjpsZWZ3Vm9pZENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmd1NldE5vbkRlZmF1bHRDYmsoKExlZkRlZlBhcnNlcjo6bGVmd1ZvaWRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBsZWZ3U2V0Q3Jvc3NUYWxrQ2JrICg6OmxlZndWb2lkQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZ3U2V0Q3Jvc3NUYWxrQ2JrKChMZWZEZWZQYXJzZXI6OmxlZndWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmd1NldE5vaXNlVGFibGVDYmsgKDo6bGVmd1ZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZndTZXROb2lzZVRhYmxlQ2JrKChMZWZEZWZQYXJzZXI6OmxlZndWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmd1NldENvcnJlY3Rpb25UYWJsZUNiayAoOjpsZWZ3Vm9pZENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmd1NldENvcnJlY3Rpb25UYWJsZUNiaygoTGVmRGVmUGFyc2VyOjpsZWZ3Vm9pZENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGxlZndTZXRTcGFjaW5nQ2JrICg6OmxlZndWb2lkQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZ3U2V0U3BhY2luZ0NiaygoTGVmRGVmUGFyc2VyOjpsZWZ3Vm9pZENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGxlZndTZXRNaW5GZWF0dXJlQ2JrICg6OmxlZndWb2lkQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZ3U2V0TWluRmVhdHVyZUNiaygoTGVmRGVmUGFyc2VyOjpsZWZ3Vm9pZENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGxlZndTZXREaWVsZWN0cmljQ2JrICg6OmxlZndWb2lkQ2JrRm5UeXBlIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZ3U2V0RGllbGVjdHJpY0NiaygoTGVmRGVmUGFyc2VyOjpsZWZ3Vm9pZENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGxlZndTZXRJUkRyb3BDYmsgKDo6bGVmd1ZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZndTZXRJUkRyb3BDYmsoKExlZkRlZlBhcnNlcjo6bGVmd1ZvaWRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBsZWZ3U2V0U2l0ZUNiayAoOjpsZWZ3Vm9pZENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmd1NldFNpdGVDYmsoKExlZkRlZlBhcnNlcjo6bGVmd1ZvaWRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBsZWZ3U2V0QXJyYXlDYmsgKDo6bGVmd1ZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZndTZXRBcnJheUNiaygoTGVmRGVmUGFyc2VyOjpsZWZ3Vm9pZENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGxlZndTZXRNYWNyb0NiayAoOjpsZWZ3Vm9pZENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmd1NldE1hY3JvQ2JrKChMZWZEZWZQYXJzZXI6OmxlZndWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmd1NldEFudGVubmFDYmsgKDo6bGVmd1ZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZndTZXRBbnRlbm5hQ2JrKChMZWZEZWZQYXJzZXI6OmxlZndWb2lkQ2JrRm5UeXBlKSBwMCk7Ci19Ci0KLXZvaWQgbGVmd1NldEV4dENiayAoOjpsZWZ3Vm9pZENia0ZuVHlwZSBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmd1NldEV4dENiaygoTGVmRGVmUGFyc2VyOjpsZWZ3Vm9pZENia0ZuVHlwZSkgcDApOwotfQotCi12b2lkIGxlZndTZXRFbmRMaWJDYmsgKDo6bGVmd1ZvaWRDYmtGblR5cGUgcDApIHsKLSAgICBMZWZEZWZQYXJzZXI6OmxlZndTZXRFbmRMaWJDYmsoKExlZkRlZlBhcnNlcjo6bGVmd1ZvaWRDYmtGblR5cGUpIHAwKTsKLX0KLQotdm9pZCBsZWZ3U2V0VW51c2VkQ2FsbGJhY2tzICg6OmxlZndWb2lkQ2JrRm5UeXBlICBmdW5jKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZ3U2V0VW51c2VkQ2FsbGJhY2tzKChMZWZEZWZQYXJzZXI6OmxlZndWb2lkQ2JrRm5UeXBlICkgZnVuYyk7Ci19Ci0KLXZvaWQgbGVmd1NldExvZ0Z1bmN0aW9uICg6OkxFRklfTE9HX0ZVTkNUSU9OICBwMCkgewotICAgIExlZkRlZlBhcnNlcjo6bGVmd1NldExvZ0Z1bmN0aW9uKHAwKTsKLX0KLQotdm9pZCBsZWZ3U2V0V2FybmluZ0xvZ0Z1bmN0aW9uICg6OkxFRklfV0FSTklOR19MT0dfRlVOQ1RJT04gIHAwKSB7Ci0gICAgTGVmRGVmUGFyc2VyOjpsZWZ3U2V0V2FybmluZ0xvZ0Z1bmN0aW9uKHAwKTsKLX0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWZ6bGliL2NsZWZ6bGliLmMgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZnpsaWIvY2xlZnpsaWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQzMWQwZi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZnpsaWIvY2xlZnpsaWIuYworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IDIwMTQsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLSAqIAotICogVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLSAqIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotICogCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotICogICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogCi0gKiBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotICogY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSAiemxpYi5oIgotI2luY2x1ZGUgImxlZnpsaWIuaCIKLSNpbmNsdWRlICJsZWZyUmVhZGVyLmgiCi0KLS8qCi0gKiBQcml2YXRlIGZ1bmN0aW9uczoKLSAqLwotc2l6ZV90IGxlZkdaaXBfcmVhZChGSUxFKiBmaWxlLCBjaGFyKiBidWYsIHNpemVfdCBsZW4pIHsKLSAgcmV0dXJuIGd6cmVhZCgoZ3pGaWxlKWZpbGUsIGJ1ZiwgKHVuc2lnbmVkIGludClsZW4pOwotfQotCi0vKgotICogUHVibGljIGZ1bmN0aW9uczoKLSAqLwotbGVmR1pGaWxlIAotbGVmR1ppcE9wZW4oY29uc3QgY2hhciAqZ3ppcFBhdGgsIGNvbnN0IGNoYXIqIG1vZGUpIHsKLSAgbGVmR1pGaWxlIGZwdHI7Ci0KLSAgaWYgKCFnemlwUGF0aCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBmcHRyID0gZ3pvcGVuKGd6aXBQYXRoLCBtb2RlKTsKLQotICBpZiAoZnB0cikgewotICAgIC8qIHN1Y2Nlc3NmdWxseSBvcGVuIHRoZSBnemlwIGZpbGUgKi8KLSAgICAvKiBzZXQgdGhlIHJlYWQgZnVuY3Rpb24gdG8gcmVhZCBmcm9tIGEgY29tcHJlc3NlZCBmaWxlICovCi0gICAgbGVmclNldFJlYWRGdW5jdGlvbihsZWZHWmlwX3JlYWQpOwotICAgIHJldHVybiAobGVmR1pGaWxlKWZwdHI7Ci0gIH0gZWxzZQotICAgIHJldHVybiBOVUxMOwotfQotCi1pbnQgbGVmR1ppcENsb3NlKGxlZkdaRmlsZSBmaWxlUHRyKSB7Ci0gIHJldHVybiAoZ3pjbG9zZSgoZ3pGaWxlKWZpbGVQdHIpKTsKLX0KLQotaW50IGxlZnJSZWFkR1ppcChsZWZHWkZpbGUgZmlsZSwgY29uc3QgY2hhciogZ3ppcEZpbGUsIGxlZmlVc2VyRGF0YSB1RGF0YSkgewotICByZXR1cm4gbGVmclJlYWQoKEZJTEUqKWZpbGUsIGd6aXBGaWxlLCB1RGF0YSk7Ci19CmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZnpsaWIvbGVmemxpYi5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2NsZWZ6bGliL2xlZnpsaWIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEyMzIzOC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvY2xlZnpsaWIvbGVmemxpYi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgMjAxMiwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotICogCi0gKiBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotICogRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0gKiAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAKLSAqIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0gKiBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBDTEVGWkxJQl9ICi0jZGVmaW5lIENMRUZaTElCX0gKLQotdHlwZWRlZiB2b2lkKiBsZWZHWkZpbGU7Ci0KLS8qIAotICogTmFtZTogbGVmR1ppcE9wZW4KLSAqIERlc2NyaXB0aW9uOiBPcGVuIGEgZ3ppcCBmaWxlCi0gKiBSZXR1cm5zOiBBIGZpbGUgcG9pbnRlcgotICovCi1leHRlcm4gbGVmR1pGaWxlIGxlZkdaaXBPcGVuKGNvbnN0IGNoYXIqIGd6aXBGaWxlLCBjb25zdCBjaGFyKiBtb2RlKTsKLQotLyogCi0gKiBOYW1lOiBsZWZHWmlwQ2xvc2UKLSAqIERlc2NyaXB0aW9uOiBDbG9zZSBhIGd6aXAgZmlsZQotICogUmV0dXJuczogMCBpZiBubyBlcnJvcnMKLSAqLwotZXh0ZXJuIGludCBsZWZHWmlwQ2xvc2UobGVmR1pGaWxlIGZpbGVQdHIpOwotCi0vKgotICogTmFtZTogbGVmclJlYWRHWmlwCi0gKiBEZXNjcmlwdGlvbjogUGFyc2UgYSBsZWYgZ3ppcCBmaWxlCi0gKiBSZXR1cm5zOiAwIGlmIG5vIGVycm9ycwotICovCi1leHRlcm4gaW50IGxlZnJSZWFkR1ppcChsZWZHWkZpbGUgZmlsZSwgY29uc3QgY2hhciogZ3ppcEZpbGUsIHZvaWQqIHVEYXRhKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvZG9jL2xlZmFwaS5wZGYgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvZG9jL2xlZmFwaS5wZGYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YTYwMGQuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2RvYy9sZWZhcGkucGRmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2RvYy9sZWZhcGlXTi5wZGYgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvZG9jL2xlZmFwaVdOLnBkZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg4MjY1NC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvZG9jL2xlZmFwaVdOLnBkZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvY3J5cHQuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9jcnlwdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNjllYWYuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9jcnlwdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiAtIDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjNiAkCi0vLyAgJERhdGU6IDIwMTUvMDEvMjAgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0vKgotICogRklMRTogY3J5cHQuY3BwCi0gKgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0jaW5jbHVkZSAibGVmaUtSRGVmcy5ocHAiCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLSNpZmRlZiBXSU4zMgotIyAgIGluY2x1ZGUgPGlvLmg+Ci0jZWxzZSAvLyBub3QgV0lOMzIgCi0jICAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNlbmRpZiAvLyBXSU4zMiAKLQotCi1GSUxFICoKLWVuY09wZW5GaWxlRm9yUmVhZChjaGFyICpmaWxlbmFtZSkKLXsKLSAgICByZXR1cm4gZm9wZW4oZmlsZW5hbWUsICJyIik7Ci19Ci0KLUZJTEUgKgotZW5jT3BlbkZpbGVGb3JXcml0ZShjaGFyICAgICpmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgaW50ICAgICBlbmNyeXB0X2YpCi17Ci0gICAgcmV0dXJuIGZvcGVuKGZpbGVuYW1lLCAidyIpOwotfQotCi1pbnQKLWVuY0Nsb3NlRmlsZShGSUxFICpmcCkKLXsKLSAgICByZXR1cm4gZmNsb3NlKGZwKTsKLX0KLQotdm9pZAotZW5jQ2xlYXJCdWYoRklMRSAqZnApCi17Ci19Ci0KLXZvaWQKLWVuY1JlYWRpbmdFbmNyeXB0ZWQoKQotewotfQotCi12b2lkCi1lbmNXcml0aW5nRW5jcnlwdGVkKCkKLXsKLX0KLQotaW50Ci1lbmNJc0VuY3J5cHRlZCh1bnNpZ25lZCBjaGFyICpidWYpCi17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1pbnQKLWVuY0ZnZXRjKEZJTEUgKmZwKQotewotICAgIHJldHVybiBmZ2V0YyhmcCk7Ci19Ci0KLWludAotZW5jRnB1dGMoY2hhciAgIGMsCi0gICAgICAgICBGSUxFICAgKmZwKQotewotICAgIHJldHVybiBmcHV0YyhjLCBmcCk7Ci19Ci0KLXZvaWQKLWVuY1ByaW50KEZJTEUgICAqZnAsCi0gICAgICAgICBjaGFyICAgKmZvcm1hdCwKLSAgICAgICAgIC4uLikKLXsKLSAgICB2YV9saXN0IGFwOwotCi0gICAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7Ci0gICAgdmZwcmludGYoZnAsIGZvcm1hdCwgYXApOwotICAgIHZhX2VuZChhcCk7Ci19Ci0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2NyeXB0LmhwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvY3J5cHQuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzUwZDA4Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvY3J5cHQuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiAtIDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaWZuZGVmIENSWVBUX0gKLSNkZWZpbmUgQ1JZUFRfSCAxCi0KLSNpbmNsdWRlICJsZWZpS1JEZWZzLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotZXh0ZXJuIEZJTEUqIGVuY09wZW5GaWxlRm9yUmVhZChjaGFyKiBmaWxlbmFtZSk7Ci1leHRlcm4gRklMRSogZW5jT3BlbkZpbGVGb3JXcml0ZShjaGFyKiBmaWxlbmFtZSwgaW50IGVuY3J5cHRfZik7Ci1leHRlcm4gaW50IGVuY0Nsb3NlRmlsZShGSUxFKiBmcCk7Ci1leHRlcm4gdm9pZCBlbmNDbGVhckJ1ZihGSUxFKiBmcCk7Ci1leHRlcm4gdm9pZCBlbmNSZWFkaW5nRW5jcnlwdGVkKCk7Ci1leHRlcm4gdm9pZCBlbmNXcml0aW5nRW5jcnlwdGVkKCk7Ci1leHRlcm4gaW50IGVuY0lzRW5jcnlwdGVkKHVuc2lnbmVkIGNoYXIqIGJ1Zik7Ci1leHRlcm4gaW50IGVuY0ZnZXRjKEZJTEUqIGZwKTsKLWV4dGVybiBpbnQgZW5jRnB1dGMoY2hhciBjLCBGSUxFKiBmcCk7Ci1leHRlcm4gdm9pZCBlbmNQcmludChGSUxFKmZwLCBjaGFyKiBmb3JtYXQsLi4uKTsKLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLVVTRV9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWYubXNnIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWYubXNnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDcyNGE5Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmLm1zZworKysgL2Rldi9udWxsCkBAIC0xLDQwNCArMCwwIEBACi0jIDEwMCAtICBsZWYgcmVhZGVyLCBsZWZyUmVhZGVyLmMKLSMgMTAwMCAtIGxlZiBwYXJzZXIsIGVycm9yLCBsZXguY3BwaCwgbGVmLnkgKENBTExCQUNLICYgQ0hLRVJSKQotIyAxMzAwIC0gZnJvbSBsZWZpRXJyb3IsIGxlZmlMYXllci5jcHAKLSMgMTM1MCAtIGZyb20gbGVmaUVycm9yLCBsZWZpTWFjcm8uY3BwCi0jIDEzNjAgLSBmcm9tIGxlZmlFcnJvciwgbGVmaU1pc2MuY3BwCi0jIDE0MDAgLSBmcm9tIGxlZmlFcnJvciwgbGVmaU5vbkRlZmF1bHQuY3BwCi0jIDE0MjAgLSBmcm9tIGxlZmlFcnJvciwgbGVmaVZpYS5jcHAKLSMgMTQzMCAtIGZyb20gbGVmaUVycm9yLCBsZWZpVmlhUnVsZS5jcHAKLSMgMTUwMCAtIGxlZiBwYXJzZXIsIGVycm9yLCBsZWYueQotIyAyMDAwIC0gbGVmIHBhcnNlciwgd2FybmluZywgbGV4LmNwcGgKLSMgMjUwMCAtIGxlZiBwYXJzZXIsIHdhcm5pbmcsIGxlZi55Ci0jIDMwMDAgLSBsZWYgcGFyc2VyLCBpbmZvLCBsZXguY3BwaAotIyA0MDAwIC0gbGVmIHdyaXRlciwgZXJyb3IsIGxlZndXcml0ZXIuY3BwICYgbGVmd1dyaXRlckNhbGxzLmNwcAotIyA0NTAwIC0gbGVmIHdyaXRlciwgd2FybmluZywgbGVmd1dyaXRlci5jcHAgJiBsZWZ3V3JpdGVyQ2FsbHMuY3BwCi0jIDQ3MDAgLSBsZWYgd3JpdGVyLCBpbmZvLCBsZWZ3V3JpdGVyLmNwcCAmIGxlZndXcml0ZXJDYWxscy5jcHAKLSMgZW1zTWtFcnJvciBMRUYgLWIgbGVmTXNnVGFibGUgLW0gbGVmLm1zZyAtZSAtbgotMTAwICAibGVmclJlYWQgY2FsbGVkIGJlZm9yZSBsZWZySW5pdFxuIgotMTAxICAibGVmclNldFJlZ2lzdGVyVW51c2VkQ2FsbGJhY2tzIHdhcyBub3QgY2FsbGVkIHRvIHNldHVwIHRoaXMgZGF0YS5cbiIKLTIwMSAgIkxFRiBpdGVtcyB0aGF0IHdlcmUgcHJlc2VudCBidXQgaWdub3JlZCBiZWNhdXNlIG9mIG5vIGNhbGxiYWNrOlxuIgotMjAzICAiTnVtYmVyIGhhcyBleGNlZWRlZCB0aGUgbGltaXQgZm9yIGFuIGludGVnZXIuIFNlZSBmaWxlICVzIGF0IGxpbmUgJWQuXG4iCi0xMDAwICJFeHBlY3RpbmcgJz0nIgotMTAwMSAiRW5kIG9mIGZpbGUgaW4gJkFMSUFTIgotMTAwMiAiSW5jb21wbGV0ZSBsZWYgZmlsZSIKLTEwMDMgInRhZyBpcyBtaXNzaW5nIGZvciBCRUdJTkVYVCIKLTEwMDQgIlRhZyBmb3IgQkVHSU5FWFQgaXMgZW1wdHkiCi0xMDA1ICJcIiBpcyBtaXNzaW5nIGluIHRhZyIKLTEwMDYgIkVuZGluZyBcIiBpcyBtaXNzaW5nIgotMTAwNyAiRU5ERVhUIGlzIG1pc3NpbmciCi0xMDA4ICJJbnZhbGlkIGNoYXJhY3RlcnMgZm91bmQgaW4gXCclc1wnLlxuVGhlc2UgY2hhcmFjdGVycyBtaWdodCBoYXZlIGNyZWF0ZWQgYnkgY2hhcmFjdGVyIHR5cGVzIG90aGVyIHRoYW4gRW5nbGlzaC4iCi0xMDA5ICJTeW1ib2wgJzsnIHNob3VsZCBiZSBzZXBhcmF0ZWQgYnkgc3BhY2UocykuIgotMTAxMSAiJXMsIHNlZSBmaWxlICVzIGF0IGxpbmUgJWQuXG5MYXN0IHRva2VuIHdhcyA8JXNcIj47IHNwYWNlIGlzIG1pc3NpbmcgYmV0d2VlbiB0aGUgY2xvc2luZyBcIiBvZiB0aGUgc3RyaW5nIGFuZCA7LlxuIgotMTAyMCAiVG9vIG1hbnkgc3ludGF4IGVycm9ycy4iCi0xMzAwICJUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgbGF5ZXIgcHJvcGVydHkgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIKLTEzMDEgIlRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBsYXllciBNSU5TSVpFIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWRcbiIKLTEzMDIgIlRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBsYXllciBNSU5TVEVQIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQiCi0xMzAzICJUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgbGF5ZXIgQVJSQVlDVVRTIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQiCi0xMzA0ICJUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgbGF5ZXIgU1BBQ0lORyBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIgotMTMwNSAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19TUEFDSU5HOiAlcy5cbkNvcnJlY3Qgc3ludGF4IGlzIGVpdGhlciBcIlNQQUNJTkcgbWluU3BhY2luZyBbQ0VOVEVSVE9DRU5URVJdXCJcblwiW0xBWUVSIHNlY29uZExheWVyTmFtZSB8IEFESkFDRU5UQ1VUUyB7MnwzfDR9IFdJVEhJTiBjdXRXaXRoaW4gfCBQQVJBTExFTE9WRVJMQVAgfCBBUkVBIGN1dEFyZWFdXCIgb3JcblwiU1BBQ0lORyBlb2xTcGFjZSBFTkRPRkxJTkUgZW9sV2lkdGggV0lUSElOIGVvbFdJVEhJTiBbUEFSQUxMRUxFREdFIHBhclNwYWNlIFdJVEhJTiBwYXJXaXRoaW4gW1RPV0VER0VTXV1cIlxuIgotMTMwNiAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19NQVhGTE9BVElOR0FSRUE6ICVzLlxuQ29ycmVjdCBzeW50YXggaXMgXCJNQVhGTE9BVElOR0FSRUEgbWF4QXJlYVwiXG4iCi0xMzA3ICJJbmNvcnJlY3Qgc3ludGF4IGRlZmluZWQgZm9yIHByb3BlcnR5IExFRjU3X0FSUkFZU1BBQ0lORzogJXMuXG5Db3JyZWN0IHN5bnRheCBpcyBBUlJBWVNQQUNJTkcgW0xPTkdBUlJBWV0gW1dJRFRIIHZpYVdpZHRoXSBDVVRTUEFDSU5HIGN1dFNwYWNpbmdcblx0QVJSQVlDVVRTIGFycmF5Q3V0cyBTUEFDSU5HIGFycmF5U3BhY2luZyAuLi5cbiIKLTEzMDggIkluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfQVJSQVlTUEFDSU5HOiAlcy5cbkxPTkdBUlJBWSBpcyBkZWZpbmVkIGFmdGVyIENVVFNQQUNJTkcuXG5Db3JyZWN0IHN5bnRheCBpcyBBUlJBWVNQQUNJTkcgW0xPTkdBUlJBWV0gW1dJRFRIIHZpYVdpZHRoXSBDVVRTUEFDSU5HIGN1dFNwYWNpbmdcblx0QVJSQVlDVVRTIGFycmF5Q3V0cyBTUEFDSU5HIGFycmF5U3BhY2luZyAuLi5cbiIKLTEzMDkgIkluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfQVJSQVlTUEFDSU5HOiAlcy5cbldJRFRIIGlzIGRlZmluZWQgYWZ0ZXIgQ1VUU1BBQ0lORy5cbkNvcnJlY3Qgc3ludGF4IGlzIEFSUkFZU1BBQ0lORyBbTE9OR0FSUkFZXSBbV0lEVEggdmlhV2lkdGhdIENVVFNQQUNJTkcgY3V0U3BhY2luZ1xuXHRBUlJBWUNVVFMgYXJyYXlDdXRzIFNQQUNJTkcgYXJyYXlTcGFjaW5nIC4uLlxuIgotMTMxMCAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19BUlJBWVNQQUNJTkc6ICVzLlxuQ1VUU1BBQ0lORyBoYXMgZGVmaW5lZCBtb3JlIHRoYW4gb25jZS5cbkNvcnJlY3Qgc3ludGF4IGlzIEFSUkFZU1BBQ0lORyBbTE9OR0FSUkFZXSBbV0lEVEggdmlhV2lkdGhdIENVVFNQQUNJTkcgY3V0U3BhY2luZ1xuXHRBUlJBWUNVVFMgYXJyYXlDdXRzIFNQQUNJTkcgYXJyYXlTcGFjaW5nIC4uLlxuIgotMTMxMSAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19BUlJBWVNQQUNJTkc6ICVzLlxuQ1VUU1BBQ0lORyB3aGljaCBpcyByZXF1aXJlZCBpcyBlaXRoZXIgaGFzIG5vdCBiZWVuIGRlZmluZWQgb3IgZGVmaW5lZCBpbiBhIHdyb25nIGxvY2F0aW9uLlxuQ29ycmVjdCBzeW50YXggaXMgQVJSQVlTUEFDSU5HIFtMT05HQVJSQVldIFtXSURUSCB2aWFXaWR0aF0gQ1VUU1BBQ0lORyBjdXRTcGFjaW5nXG5cdEFSUkFZQ1VUUyBhcnJheUN1dHMgU1BBQ0lORyBhcnJheSBTcGFjaW5nIC4uLlxuIgotMTMxMiAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19BUlJBWVNQQUNJTkc6ICVzLlxuU1BBQ0lORyBzaG91bGQgYmUgZGVmaW5lZCB3aXRoIEFSUkFZQ1VUUy5cbkNvcnJlY3Qgc3ludGF4IGlzIEFSUkFZU1BBQ0lORyBbTE9OR0FSUkFZXSBbV0lEVEggdmlhV2lkdGhdIENVVFNQQUNJTkcgY3V0U3BhY2luZ1xuXHRBUlJBWUNVVFMgYXJyYXlDdXRzIFNQQUNJTkcgYXJyYXlTcGFjaW5nIC4uLlxuIgotMTMxMyAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19BUlJBWVNQQUNJTkc6ICVzLlxuQ29ycmVjdCBzeW50YXggaXMgQVJSQVlTUEFDSU5HIFtMT05HQVJSQVldIFtXSURUSCB2aWFXaWR0aF0gQ1VUU1BBQ0lORyBjdXRTcGFjaW5nXG5cdEFSUkFZQ1VUUyBhcnJheUN1dHMgU1BBQ0lORyBhcnJheVNwYWNpbmcgLi4uXG4iCi0xMzE0ICJJbmNvcnJlY3Qgc3ludGF4IGRlZmluZWQgZm9yIHByb3BlcnR5IExFRjU3X0FSUkFZU1BBQ0lORzogJXMuXG5BUlJBWUNVVFMgaXMgcmVxdWlyZWQgYnV0IGhhcyBub3QgYmVlbiBkZWZpbmVkLlxuQ29ycmVjdCBzeW50YXggaXMgQVJSQVlTUEFDSU5HIFtMT05HQVJSQVldIFtXSURUSCB2aWFXaWR0aF0gQ1VUU1BBQ0lORyBjdXRTcGFjaW5nXG5cdEFSUkFZQ1VUUyBhcnJheUN1dHMgU1BBQ0lORyBhcnJheVNwYWNpbmcgLi4uXG4iCi0xMzE1ICJJbmNvcnJlY3Qgc3ludGF4IGRlZmluZWQgZm9yIHByb3BlcnR5IExFRjU3X01JTlNURVA6ICVzLlxuQ29ycmVjdCBzeW50YXggaXMgXCJNSU5TVEVQIG1pblN0ZXBMZW5ndGggW01BWEVER0VTIG1heEVkZ2VzXSBbTUlOQURKQUNFTlRMRU5HVEggbWluQWRqTGVuZ3RoIHwgTUlOQkVUV0VFTkxFTkdUSCBtaW5CZXR3ZWVuTGVuZ3RoIFtFWENFUFRTQU1FQ09STkVSU11dIDtcIlxuIgotMTMxNiAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19BTlRFTk5BQ1VNUk9VVElOR1BMVVNDVVQ6ICVzLlxuQ29ycmVjdCBzeW50YXggaXMgXCJBTlRBTk5BQ1VNUk9VVElOR1BMVVNDVVRcIlxuIgotMTMxNyAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19BTlRFTk5BR0FURVBMVVNESUZGOiAlcy5cbkNvcnJlY3Qgc3ludGF4IGlzIFwiQU5URU5OQUdBVEVQTFVTRElGRiBwbHVzRGlmZkZhY3RvclwiXG4iCi0xMzE4ICJJbmNvcnJlY3Qgc3ludGF4IGRlZmluZWQgZm9yIHByb3BlcnR5IExFRjU3X0FOVEVOTkFBUkVBTUlOVVNESUZGOiAlcy5cbkNvcnJlY3Qgc3ludGF4IGlzIFwiQU5URU5OQUFSRUFNSU5VU0RJRkYgbWludXNEaWZmRmFjdG9yXCJcbiIKLTEzMTkgIkluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfQU5URU5OQUFSRUFESUZGUkVEVUNFUFdMOiAlcy5cbkNvcnJlY3Qgc3ludGF4IGlzIFwiQU5URU5OQUFSRUFESUZGUkVEVUNFUFdMICgoIGRpZmZBcmVhMSBtZXRhbERpZmZGYWN0b3IxICkgKCBkaWZmQXJlYTIgbWV0YWxEaWZmRmFjdG9yMiApLi4uKVwiXG4iCi0xMzIwICJJbmNvcnJlY3Qgc3ludGF4IGRlZmluZWQgZm9yIHByb3BlcnR5IExFRjU3X1NQQUNJTkc6ICVzLlxuQ29ycmVjdCBzeW50YXggaXMgXCJTUEFDSU5HIGN1dFNwYWNpbmcgW0NFTlRFUlRPQ0VOVEVSXVtTQU1FTkVUXVxuXHRbTEFZRVIgc2Vjb25kTGF5ZXJOYW1lW1NUQUNLXVxuXHR8IEFESkFDRU5UQ1VUUyB7MiB8IDMgfCA0fSBXSVRISU4gY3V0V2l0aGluIFtFWENFUFRTQU1FUEdORVRdXG5cdHwgUEFSQUxMRUxPVkVSTEFQXG5cdHwgQVJFQSBjdXRBcmVhIDtcIiIKLTEzMjEgIlRoZSBwcm9wZXJ0eSBMRUY1N19TUEFDSU5HIHdpdGggdmFsdWUgJXMgaXMgZm9yIFRZUEUgQ1VUIG9ubHkuXG5UaGUgY3VycmVudCBsYXllciBoYXMgdGhlIFRZUEUgJXMuXG5VcGRhdGUgdGhlIHByb3BlcnR5IG9mIHlvdXIgbGVmIGZpbGUgd2l0aCB0aGUgY29ycmVjdCBzeW50YXggb3IgcmVtb3ZlIHRoaXMgcHJvcGVydHkgZnJvbSB5b3VyIGxlZiBmaWxlIgotMTMyMiAiVGhlIHByb3BlcnR5IExFRjU3X1NQQUNJTkcgd2l0aCB2YWx1ZSAlcyBpcyBmb3IgVFlQRSBST1VUSU5HIG9ubHkuXG5UaGUgY3VycmVudCBsYXllciBoYXMgdGhlIFRZUEUgJXMuXG5VcGRhdGUgdGhlIHByb3BlcnR5IG9mIHlvdXIgbGVmIGZpbGUgd2l0aCB0aGUgY29ycmVjdCBzeW50YXggb3IgcmVtb3ZlIHRoaXMgcHJvcGVydHkgZnJvbSB5b3VyIGxlZiBmaWxlLiIKLTEzMjMgIlRoZSBwcm9wZXJ0eSBMRUY1N19NSU5TVEVQIHdpdGggdmFsdWUgJXMgaXMgZm9yIFRZUEUgUk9VVElORyBvbmx5LlxuVGhlIGN1cnJlbnQgbGF5ZXIgaGFzIHRoZSBUWVBFICVzLlxuVXBkYXRlIHRoZSBwcm9wZXJ0eSBvZiB5b3VyIGxlZiBmaWxlIHdpdGggdGhlIGNvcnJlY3Qgc3ludGF4IG9yIHJlbW92ZSB0aGlzIHByb3BlcnR5IGZyb20geW91ciBsZWYgZmlsZS4iCi0xMzI0ICJJbmNvcnJlY3Qgc3ludGF4IGRlZmluZWQgZm9yIHRoZSBzdGF0ZW1lbnQgVFdPV0lEVEhTLlxuU3BhY2luZywgd2hpY2ggaXMgcmVxdWlyZWQsIGlzIG5vdCBkZWZpbmVkLiIKLTEzMjUgIlByb3BlcnR5IExFRjU4X1RZUEUgd2FzIGFkZGVkIGluIGluY29ycmVjdCBsYXllciB0eXBlLlxuSXQgaGFzIHRoZSB2YWx1ZSAlcyB3aGljaCBpcyBmb3IgbGF5ZXIgdHlwZSBST1VUSU5HLlxuVGhlIGxheWVyIHR5cGUgaXMgJXMuXG4iCi0xMzI2ICJQcm9wZXJ0eSBMRUY1OF9UWVBFIHdhcyBhZGRlZCBpbiBpbmNvcnJlY3QgbGF5ZXIgdHlwZS5cbkl0IGhhcyB0aGUgdmFsdWUgJXMgd2hpY2ggaXMgZm9yIGxheWVyIHR5cGUgQ1VULlxuVGhlIGxheWVyIHR5cGUgaXMgJXMuXG4iCi0xMzI3ICJQcm9wZXJ0eSBMRUY1OF9UWVBFIHdhcyBhZGRlZCBpbiBpbmNvcnJlY3QgbGF5ZXIgdHlwZS5cbkl0IGhhcyB0aGUgdmFsdWUgJXMgd2hpY2ggaXMgZm9yIGxheWVyIHR5cGUgTUFTVEVSU0xJQ0UuXG5UaGUgbGF5ZXIgdHlwZSBpcyAlcy5cbiIKLTEzMjggIlByb3BlcnR5IExFRjU4X1RZUEUgaGFzIGluY29ycmVjdCBsYXllciB0eXBlICVzLlxuVmFsdWUgbGF5ZXIgdHlwZSBhcmU6IFBPTFlST1VUSU5HLCBNSU1DQVAsIFRTViwgUEFTU0lWQVRJT04sIE5XRUxMIG9yIFBXRUxMLlxuIgotMTMyOSAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1OF9UWVBFOiAlc1xuQ29ycmVjdCBzeW50YXggaXMgXCJUWVBFIFBPTFlST1VUSU5HIHwgTUlNQ0FQIHwgVFNWIHwgUEFTU0lWQVRJT04gfCBOV0VMTCB8IFBXRUxMIDtcIlxuIgotMTMzMCAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19FTkNMT1NVUkU6ICVzXG5Db3JyZWN0IHN5bnRheCBpcyBcIkVOQ0xPU1VSRSBbQUJPVkV8QkVMT1ddIG92ZXJoYW5nMSBvdmVyaGFuZzJcblx0W1dJRFRIIG1pbldpZHRoIFtFWENFUFRFWFRSQUNVVCBjdXRXaXRoaW5dXG5cdHxMRU5HVEggbWluTGVuZ3RoXSA7XCJcbiIKLTEzMzEgIlRoZSBwcm9wZXJ0eSBMRUY1N19FTkNMT1NVUkUgd2l0aCB2YWx1ZSAlcyBpcyBmb3IgVFlQRSBDVVQgb25seS5cblRoZSBjdXJyZW50IGxheWVyIGhhcyB0aGUgVFlQRSAlcy5cblVwZGF0ZSB0aGUgcHJvcGVydHkgb2YgeW91ciBsZWYgZmlsZSB3aXRoIHRoZSBjb3JyZWN0IHN5bnRheCBvciByZW1vdmUgdGhpcyBwcm9wZXJ0eSBmcm9tIHlvdXIgbGVmIGZpbGUuXG4iCi0xMzUwICJUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgbWFjcm8gUElOIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQiCi0xMzUxICJUaGVyZSBpcyBhbiB1bmV4cGVjdGVkIGxlZiBwYXJzZXIgYnVnIHdoaWNoIGNhdXNlIGl0IHVuYWJsZSB0byByZXRyaWV2ZSBBTlRFTk5BTU9ERUwgZGF0YSB3aXRoIHRoZSBnaXZlbiBpbmRleC4iCi0xMzUyICJUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgbWFjcm8gcHJvcGVydHkgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIKLTEzNjAgIlRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBnZW9tZXRyeSBpdGVtIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIgotMTM2MSAiVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIGdlb21ldHJ5IFJFQ1RBTkdMRSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiIKLTEzNjIgIlRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBnZW9tZXRyeSBSRUNUQU5HTEUgSVRFUkFURSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiIKLTEzNjMgIlRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBnZW9tZXRyeSBQQVRIIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIgotMTM2NCAiVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIGdlb21ldHJ5IFBBVEggSVRFUkFURSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiIKLTEzNjUgIlRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBnZW9tZXRyeSBMQVlFUiBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiIKLTEzNjYgIlRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBnZW9tZXRyeSBMQVlFUiBFWENFUFQgUEcgTkVUIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIgotMTM2NyAiVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIGdlb21ldHJ5IExBWUVSIE1JTlNQQUNJTkcgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4iCi0xMzY4ICJUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgZ2VvbWV0cnkgTEFZRVIgUlVMRSBXSURUSCBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiIKLTEzNjkgIlRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBnZW9tZXRyeSBXSURUSCBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiIKLTEzNzAgIlRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBnZW9tZXRyeSBQT0xZR09OIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIgotMTM3MSAiVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIGdlb21ldHJ5IFBPTFlHT04gSVRFUkFURSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiIKLTEzNzIgIlRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBnZW9tZXRyeSBDTEFTUyBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiIKLTEzNzMgIlRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBnZW9tZXRyeSBWSUEgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4iCi0xMzc0ICJUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgZ2VvbWV0cnkgVklBIElURVJBVEUgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4iCi0xMzc1ICJ1bmtub3duIGdlb21ldHJ5IHR5cGUuIgotMTM3NiAiVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIElSRFJPUCBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiIKLTEzNzcgIlRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBUUkFDSyBQQVRURVJOICBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiIKLTE0MDAgIkludmFsaWQgbm9uZGVmYXVsdHZpYSBjYWxsYmFjay4iCi0xNDAxICJJbnZhbGlkIG5vbmRlZmF1bHRzcGFjaW5nIGNhbGxiYWNrLiIKLTE0MDIgIlRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBOT05ERUZBVUxUIExBWUVSIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIgotMTQwMyAiVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIE5PTkRFRkFVTFQgVklBIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIgotMTQwNCAiVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIE5PTkRFRkFVTFQgU1BBQ0lORyBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiIKLTE0MDUgIlRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBOT05ERUZBVUxUIFVTRSBWSUEgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4iCi0xNDA2ICJUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgTk9OREVGQVVMVCBVU0UgVklBUlVMRSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiIKLTE0MDcgIlRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBOT05ERUZBVUxUIENVVCBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkLiIKLTE0MDggIlRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBOT05ERUZBVUxUIFBST1BFUlRZIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIgotMTQyMCAiVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIFZJQSBMQVlFUiBSRUNUQU5HTEUgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZC4iCi0xNDIxICJUaGUgbGF5ZXIgbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgVklBIExBWUVSIGlzIGludmFsaWQuXG5WYWxpZCBudW1iZXIgaXMgZnJvbSAwIHRvICVkLiIKLTE0MjIgIlRoZSBsYXllciBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBWSUEgUFJPUEVSVFkgaXMgaW52YWxpZC5cblZhbGlkIG51bWJlciBpcyBmcm9tIDAgdG8gJWQuIgotMTQzMCAidG9vIG1hbnkgdmlhIHJ1bGUgbGF5ZXJzLiIKLTE0MzEgIlRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBWSUFSVUxFIFBST1BFUlRZIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQuIgotMTUwMSAiRXJyb3IgZm91bmQgd2hlbiBwcm9jZXNzaW5nIExFRiBmaWxlICclcydcblVuaXQgJWQgaXMgYSB2ZXJzaW9uIDUuNiBvciBsYXRlciBzeW50YXhcbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTUwMiAiVGhlIHZhbHVlICVkIGRlZmluZWQgZm9yIExFRiBVTklUUyBEQVRBQkFTRSBNSUNST05TIGlzIGludmFsaWRcbi4gQ29ycmVjdCB2YWx1ZSBpcyAxMDAsIDIwMCwgMTAwMCwgMjAwMCwgMTAwMDAsIG9yIDIwMDAwIgotMTUwMyAiTGVmIHBhcnNlciA1LjcgZG9lcyBub3Qgc3VwcG9ydCBsZWYgZmlsZSB3aXRoIHZlcnNpb24gJXMuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iCi0xNTA0ICJOQU1FU0NBU0VTRU5TSVRJVkUgc3RhdGVtZW50IGlzIHNldCB3aXRoIE9GRi5cblN0YXJ0aW5nIHZlcnNpb24gNS42LCBOQU1FU0NBU0VOU0lUSVZFIGlzIG9ic29sZXRlLFxuaWYgaXQgaXMgZGVmaW5lZCwgaXQgaGFzIHRvIGhhdmUgdGhlIE9OIHZhbHVlLlxuUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIKLTE1MDUgIk1BTlVGQUNUVVJJTkdHUklEIHN0YXRlbWVudCB3YXMgZGVmaW5lZCBiZWZvcmUgVU5JVFMuXG5SZWZlciB0byB0aGUgTEVGIExhbmd1YWdlIFJlZmVyZW5jZSBtYW51YWwgZm9yIHRoZSBvcmRlciBvZiBMRUYgc3RhdGVtZW50cy4iCi0xNTA2ICJBIE1BWFZJQVNUQUNLIHN0YXRlbWVudCBpcyBkZWZpbmVkIGJlZm9yZSB0aGUgTEFZRVIgc3RhdGVtZW50LlxuUmVmZXIgdG8gdGhlIExFRiBMYW5ndWFnZSBSZWZlcmVuY2UgbWFudWFsIGZvciB0aGUgb3JkZXIgb2YgTEVGIHN0YXRlbWVudHMuIgotMTUwNyAiRU5EIExBWUVSIG5hbWUgJXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIExBWUVSIG5hbWUgJXMuXG5Db3JyZWN0IHRoZSBMRUYgZmlsZSBiZWZvcmUgcmVydW5uaW5nIGl0IHRocm91Z2ggdGhlIExFRiBwYXJzZXIuIgotMTUwOCAiVFlQRSBzdGF0ZW1lbnQgaXMgYSByZXF1aXJlZCBzdGF0ZW1lbnQgaW4gYSBMQVlFUiBhbmQgaXQgaXMgbm90IGRlZmluZWQuIgotMTUwOSAiUElUQ0ggc3RhdGVtZW50IGlzIGEgcmVxdWlyZWQgc3RhdGVtZW50IGluIGEgTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcgYW5kIGl0IGlzIG5vdCBkZWZpbmVkLiIKLTE1MTAgIldJRFRIIHN0YXRlbWVudCBpcyBhIHJlcXVpcmVkIHN0YXRlbWVudCBpbiBhIExBWUVSIHdpdGggVFlQRSBST1VUSU5HIGFuZCBpdCBpcyBub3QgZGVmaW5lZC4iCi0xNTExICJUaGUgRElSRUNUSU9OIHN0YXRlbWVudCB3aGljaCBpcyByZXF1aXJlZCBpbiBhIExBWUVSIHdpdGggVFlQRSBST1VUSU5HIGlzIG5vdCBkZWZpbmVkIGluIExBWUVSICVzLlxuVXBkYXRlIHlvdXIgbGVmIGZpbGUgYW5kIGFkZCB0aGUgRElSRUNUSU9OIHN0YXRlbWVudCBmb3IgbGF5ZXIgJXMuIgotMTUxMiAiSXQgaXMgaW5jb3JyZWN0IHRvIGRlZmluZSBhIFNQQUNJTkcgc3RhdGVtZW50IGluIExBWUVSIHdpdGggVFlQRSBNQVNURVJTTElDRSBvciBPVkVSTEFQLiBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIgotMTUxMyAiRElSRUNUSU9OIHN0YXRlbWVudCBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HLiBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIgotMTUxNCAiUkVTSVNUQU5DRSBzdGF0ZW1lbnQgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgUk9VVElORy4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIKLTE1MTUgIlJFU0lTVEFOQ0Ugc3RhdGVtZW50IGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iCi0xNTE2ICJDQVBBQ0lUQU5DRSBzdGF0ZW1lbnQgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgUk9VVElORy4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIKLTE1MTcgIkNBUEFDSVRBTkNFIHN0YXRlbWVudCBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HLiBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIgotMTUxOCAiSEVJR0hUIHN0YXRlbWVudCBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HLiBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIgotMTUxOSAiV0lSRUVYVEVOU0lPTiBzdGF0ZW1lbnQgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgUk9VVElORy4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIKLTE1MjAgIlRISUNLTkVTUyBzdGF0ZW1lbnQgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgUk9VVElORy4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIKLTE1MjEgIlNIUklOS0FHRSBzdGF0ZW1lbnQgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgUk9VVElORy4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIKLTE1MjIgIkNBUE1VTFRJUExJRVIgc3RhdGVtZW50IGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iCi0xNTIzICJFREdFQ0FQQUNJVEFOQ0Ugc3RhdGVtZW50IGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iCi0xNTI0ICJBTlRFTk5BQVJFQUZBQ1RPUiBzdGF0ZW1lbnQgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgUk9VVElORy4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIKLTE1MjUgIkFOVEVOTkFMRU5HVEhGQUNUT1Igc3RhdGVtZW50IGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iCi0xNTI2ICJBTlRFTk5BTEVOR1RIRkFDVE9SIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS4zIG9yIGVhcmxpZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSB3aXRoIHZlcnNpb24gJWcsIGhhcyBib3RoIG9sZCBhbmQgbmV3IEFOVEVOTkFMRU5HVEhGQUNUT1Igc3ludGF4LCB3aGljaCBpcyBpbmNvcnJlY3QuIgotMTUyNyAiQUNDVVJSRU5UREVOU0lUWSBzdGF0ZW1lbnQgY2FuJ3QgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgTUFTVEVSU0xJQ0Ugb3IgT1ZFUkxBUC4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIKLTE1MjggIkRDQ1VSUkVOVERFTlNJVFkgc3RhdGVtZW50IGNhbid0IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIE1BU1RFUlNMSUNFIG9yIE9WRVJMQVAuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iCi0xNTI5ICJDVVRBUkVBIHN0YXRlbWVudCBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBDVVQuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iCi0xNTMwICJXSURUSCBzdGF0ZW1lbnQgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgUk9VVElORy4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIKLTE1MzEgIkFOVEVOTkFBUkVBUkFUSU8gc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTUzMiAiQU5URU5OQURJRkZBUkVBUkFUSU8gc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgb3IgZWFybGllciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIHdpdGggdmVyc2lvbiAlZywgaGFzIGJvdGggb2xkIGFuZCBuZXcgQU5URU5OQUFSRUFSQVRJTyBzeW50YXgsIHdoaWNoIGlzIGluY29ycmVjdC4iCi0xNTMzICJBTlRFTk5BQVJFQVJBVElPIHN0YXRlbWVudCBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HIG9yIENVVC4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIKLTE1MzQgIkFOVEVOTkFESUZGQVJFQVJBVElPIHN0YXRlbWVudCBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HIG9yIENVVC4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIKLTE1MzUgIkFOVEVOTkFDVU1BUkVBUkFUSU8gc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTUzNiAiQU5URU5OQUNVTUFSRUFSQVRJTyBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBvciBlYXJsaWVyIG9sZCBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIHdpdGggdmVyc2lvbiAlZywgaGFzIGJvdGggb2xkIGFuZCBuZXcgQU5URU5OQUNVTUFSRUFSQVRJTyBzeW50YXgsIHdoaWNoIGlzIGluY29ycmVjdC4iCi0xNTM3ICJBTlRFTk5BQ1VNQVJFQVJBVElPIHN0YXRlbWVudCBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HIG9yIENVVC4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIKLTE1MzggIkFOVEVOTkFDVU1ESUZGQVJFQVJBVElPIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTE1MzkgIkFOVEVOTkFDVU1ESUZGQVJFQVJBVElPIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IG9yIGVhcmxpZXIgb2xkIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgd2l0aCB2ZXJzaW9uICVnLCBoYXMgYm90aCBvbGQgYW5kIG5ldyBBTlRFTk5BQ1VNRElGRkFSRUFSQVRJTyBzeW50YXgsIHdoaWNoIGlzIGluY29ycmVjdC4iCi0xNTQwICJBTlRFTk5BQ1VNRElGRkFSRUFSQVRJTyBzdGF0ZW1lbnQgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgUk9VVElORyBvciBDVVQuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iCi0xNTQxICJBTlRFTk5BQVJFQUZBQ1RPUiBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HIG9yIENVVC4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIKLTE1NDIgIkFOVEVOTkFTSURFQVJFQVJBVElPIGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iCi0xNTQzICJBTlRFTk5BU0lERUFSRUFSQVRJTyBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNTQ0ICJBTlRFTk5BU0lERUFSRUFSQVRJTyBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBvciBlYXJsaWVyIG9sZCBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIHdpdGggdmVyc2lvbiAlZywgaGFzIGJvdGggb2xkIGFuZCBuZXcgQU5URU5OQVNJREVBUkVBUkFUSU8gc3ludGF4LCB3aGljaCBpcyBpbmNvcnJlY3QuIgotMTU0NSAiQU5URU5OQURJRkZTSURFQVJFQVJBVElPIGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iCi0xNTQ2ICJBTlRFTk5BRElGRlNJREVBUkVBUkFUSU8gc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTU0NyAiQU5URU5OQURJRkZTSURFQVJFQVJBVElPIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IG9yIGVhcmxpZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSB3aXRoIHZlcnNpb24gJWcsIGhhcyBib3RoIG9sZCBhbmQgbmV3IEFOVEVOTkFESUZGU0lERUFSRUFSQVRJTyBzeW50YXgsIHdoaWNoIGlzIGluY29ycmVjdC4iCi0xNTQ4ICJBTlRFTk5BQ1VNU0lERUFSRUFSQVRJTyBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HLiBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIgotMTU0OSAiQU5URU5OQUNVTVNJREVBUkVBUkFUSU8gc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTU1MCAiQU5URU5OQUNVTVNJREVBUkVBUkFUSU8gc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgb3IgZWFybGllciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIHdpdGggdmVyc2lvbiAlZywgaGFzIGJvdGggb2xkIGFuZCBuZXcgQU5URU5OQUNVTVNJREVBUkVBUkFUSU8gc3ludGF4LCB3aGljaCBpcyBpbmNvcnJlY3QuIgotMTU1MSAiQU5URU5OQUNVTURJRkZTSURFQVJFQVJBVElPIGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iCi0xNTUyICJBTlRFTk5BQ1VNRElGRlNJREVBUkVBUkFUSU8gc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTU1MyAiQU5URU5OQUNVTURJRkZTSURFQVJFQVJBVElPIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IG9yIGVhcmxpZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSB3aXRoIHZlcnNpb24gJWcsIGhhcyBib3RoIG9sZCBhbmQgbmV3IEFOVEVOTkFDVU1ESUZGU0lERUFSRUFSQVRJTyBzeW50YXgsIHdoaWNoIGlzIGluY29ycmVjdC4iCi0xNTU0ICJBTlRFTk5BU0lERUFSRUFGQUNUT1IgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgUk9VVElORy4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIKLTE1NTUgIkFOVEVOTkFTSURFQVJFQUZBQ1RPUiBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNTU2ICJBTlRFTk5BU0lERUFSRUFGQUNUT1Igc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgb3IgZWFybGllciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIHdpdGggdmVyc2lvbiAlZywgaGFzIGJvdGggb2xkIGFuZCBuZXcgQU5URU5OQVNJREVBUkVBRkFDVE9SIHN5bnRheCwgd2hpY2ggaXMgaW5jb3JyZWN0LiIKLTE1NTcgIkFOVEVOTkFNT0RFTCBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HLiBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIgotMTU1OCAiQU5URU5OQU1PREVMIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS41IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTE1NTkgIkFOVEVOTkFNT0RFTCBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBvciBlYXJsaWVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgd2l0aCB2ZXJzaW9uICVnLCBoYXMgYm90aCBvbGQgYW5kIG5ldyBBTlRFTk5BTU9ERUwgc3ludGF4LCB3aGljaCBpcyBpbmNvcnJlY3QuIgotMTU2MCAiQU5URU5OQUNVTVJPVVRJTkdQTFVTQ1VUIGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcgb3IgQ1VULiBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIgotMTU2MSAiQU5URU5OQUdBVEVQTFVTRElGRiBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HIG9yIENVVC4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIKLTE1NjIgIkFOVEVOTkFBUkVBTUlOVVNESUZGIGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcgb3IgQ1VULiBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIgotMTU2MyAiQU5URU5OQUFSRUFESUZGUkVEVUNFUFdMIGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcgb3IgQ1VULiBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIgotMTU2NCAiU0xPVFdJUkVXSURUSCBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNTY1ICJTTE9UV0lSRUxFTkdUSCBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNTY2ICJTTE9UV0lEVEggc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTU2NyAiU0xPVExFTkdUSCBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNTY4ICJNQVhBREpBQ0VOVFNMT1RTUEFDSU5HIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTE1NjkgIk1BWENPQVhJQUxTTE9UU1BBQ0lORyBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNTcwICJNQVhFREdFU0xPVFNQQUNJTkcgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTU3MSAiU1BMSVRXSVJFV0lEVEggc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbiBZb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTE1NzIgIk1JTklNVU1ERU5TSVRZIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IGFuZCBsYXRlciBzeW50YXguXG4gWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNTczICJNQVhJTVVNREVOU0lUWSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuIFlvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTU3NCAiREVOU0lUWUNIRUNLV0lORE9XIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTE1NzUgIkRFTlNJVFlDSEVDS1NURVAgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTU3NiAiRklMTEFDVElWRVNQQUNJTkcgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTU3NyAiTUFYV0lEVEggc3RhdGVtZW50IGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcuICBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIgotMTU3OCAiTUFYV0lEVEggc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjUgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTU3OSAiTUlOV0lEVEggc3RhdGVtZW50IGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcuICBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIgotMTU4MCAiTUlOV0lEVEggc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjUgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTU4MSAiTUlORU5DTE9TRURBUkVBIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS41IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTE1ODIgIlBST1RSVVNJT04gUlVMRSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNSBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNTgzICJTUEFDSU5HVEFCTEUgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjUgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTU4NCAiRU5DTE9TVVJFIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS42IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTE1ODUgIlBSRUZFUkVOQ0xPU1VSRSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNTg2ICJSRVNJU1RBTkNFIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS42IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTE1ODcgIkRJQUdNSU5FREdFTEVOR1RIIGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iCi0xNTg4ICJESUFHTUlORURHRUxFTkdUSCBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNTg5ICJBbiBJTkZMVUVOQ0UgdGFibGUgc3RhdGVtZW50IHdhcyBkZWZpbmVkIGJlZm9yZSB0aGUgUEFSQUxMRUxSVU5MRU5HVEggdGFibGUgc3RhdGVtZW50LlxuSU5GTFVFTkNFIHRhYmxlIHN0YXRlbWVudCBzaG91bGQgYmUgZGVmaW5lZCBmb2xsb3dpbmcgdGhlIFBBUkFMTEVMUlVOTEVOR1RILlxuQ2hhbmdlIHRoZSBMRUYgZmlsZSBhbmQgcmVydW5uaW5nIHRoZSBwYXJzZXIuIgotMTU5MCAiVGhlcmUgaXMgbXVsdGlwbGUgUEFSQUxMRUxSVU5MRU5HVEggdGFibGUgc3RhdGVtZW50cyBhcmUgZGVmaW5lZCB3aXRoaW4gYSBsYXllci5cbkFjY29yZGluZyB0byB0aGUgTEVGIFJlZmVyZW5jZSBNYW51YWwsIG9ubHkgb25lIFBBUkFMTEVMUlVOTEVOR1RIIHRhYmxlIHN0YXRlbWVudCBpcyBhbGxvd2VkIHBlciBsYXllci4iCi0xNTkxICJUaGUgdG90YWwgbnVtYmVyIG9mIGxlbmd0aHMgZGVmaW5lZCBpbiB0aGUgUEFSQUxMRUxSVU5MRU5HVEggc3RhdGVtZW50IGlzIG5vdCBlcXVhbCB0b1xudGhlICB0b3RhbCBudW1iZXIgb2Ygc3BhY2luZ3MgZGVmaW5lZCBpbiB0aGUgV0lEVEggc3RhdGVtZW50IGluIHRoZSBTUEFDSU5HVEFCTEUuIgotMTU5MiAiQSBQQVJBTExFTFJVTkxFTkdUSCBzdGF0ZW1lbnQgd2FzIGFscmVhZHkgZGVmaW5lZCBpbiB0aGUgbGF5ZXIuXG5JdCBpcyBQQVJBTExFTFJVTkxFTkdUSCBvciBUT1dXSURUSFMgaXMgYWxsb3dlZCBwZXIgbGF5ZXIuIgotMTU5MyAiQSBUV09XSURUSFMgdGFibGUgc3RhdGVtZW50IHdhcyBhbHJlYWR5IGRlZmluZWQgaW4gdGhlIGxheWVyLlxuT25seSBvbmUgVFdPV0lEVEhTIHN0YXRlbWVudCBpcyBhbGxvd2VkIHBlciBsYXllci4iCi0xNTk0ICJBIElORkxVRU5DRSB0YWJsZSBzdGF0ZW1lbnQgd2FzIGFscmVhZHkgZGVmaW5lZCBpbiB0aGUgbGF5ZXIuXG5Pbmx5IG9uZSBJTkZMVUVOQ0Ugc3RhdGVtZW50IGlzIGFsbG93ZWQgcGVyIGxheWVyLiIKLTE1OTUgIkFuIElORkxVRU5DRSB0YWJsZSBzdGF0ZW1lbnQgd2FzIGFscmVhZHkgZGVmaW5lZCBiZWZvcmUgdGhlIGxheWVyLlxuSU5GTFVFTkNFIHN0YXRlbWVudCBoYXMgdG8gYmUgZGVmaW5lZCBhZnRlciB0aGUgUEFSQUxMRUxSVU5MRU5HVEggdGFibGUgc3RhdGVtZW50IGluIHRoZSBsYXllci4iCi0xNTk2ICJGUk9NQUJPVkUgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjUgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTU5NyAiRlJPTUJFTE9XIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS41IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTE1OTggIkxFTkdUSCBXSVRISU4gc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjUgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTU5OSAiQU5URU5OQUFSRUFGQUNUT1Igd2l0aCBESUZGVVNFT05MWSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNjAwICJDVVRBUkVBIHN0YXRlbWVudCBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBDVVQuIgotMTYwMSAiV0lEVEggY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgUk9VVElORy4iCi0xNjAyICJNQVhWSUFTVEFDSyBzdGF0ZW1lbnQgaGFzIHRvIGJlIGRlZmluZWQgYWZ0ZXIgdGhlIExBWUVSIHN0YXRlbWVudC4iCi0xNjAzICJBIE1BWFZJQVNUQUNLIHdhcyBhbHJlYWR5IGRlZmluZWQuXG5Pbmx5IG9uZSBNQVhWSUFTVEFDSyBpcyBhbGxvd2VkIHBlciBsZWYgZmlsZS4iCi0xNjA0ICJNQVhWSUFTVEFDSyBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNSBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNjA1ICJERUZBVUxUIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS42IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTE2MDYgIkEgTEFZRVIgc3RhdGVtZW50IGlzIG1pc3NpbmcgaW4gdGhlIFZJQSAlcy5cbkF0IGxlYXN0IG9uZSBMQVlFUiBpcyByZXF1aXJlZCBwZXIgVklBIHN0YXRlbWVudC4iCi0xNjA3ICJFTkQgVklBIG5hbWUgJXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIFZJQSBuYW1lICVzLlxuQ29ycmVjdCB0aGUgTEVGIGZpbGUgYmVmb3JlIHJlcnVubmluZyBpdCB0aHJvdWdoIHRoZSBMRUYgcGFyc2VyLiIKLTE2MDggIkEgVklBUlVMRSBzdGF0ZW1lbnQgcmVxdWlyZXMgdHdvIGxheWVycy4iCi0xNjA5ICJBIERJUkVDVElPTiBzdGF0ZW1lbnQgd2FzIGFscmVhZHkgZGVmaW5lZCBpbiB0aGUgbGF5ZXIuXG5JdCBpcyBESVJFQ1RJT04gb3IgRU5DTE9TVVJFIGNhbiBiZSBzcGVjaWZpZWQgaW4gYSBsYXllci4iCi0xNjEwICJBbiBPVkVSSEFORyBzdGF0ZW1lbnQgaXMgZGVmaW5lZCwgYnV0IHRoZSByZXF1aXJlZCBESVJFQ1RJT04gc3RhdGVtZW50IGlzIG5vdCB5ZXQgZGVmaW5lZC5cblVwZGF0ZSB0aGUgTEVGIGZpbGUgdG8gZGVmaW5lIHRoZSBESVJFQ1RJT04gc3RhdGVtZW50IGJlZm9yZSB0aGUgT1ZFUkhBTkcuIgotMTYxMSAiQW4gT1ZFUkhBTkcgc3RhdGVtZW50IGlzIGRlZmluZWQgaW4gYSBWSUFSVUxFIHN0YXRlbWVudCBvbmx5LlxuT1ZFUkhBTkcgc3RhdGVtZW50IGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gVklBUlVMRSBHRU5FUkFURS4iCi0xNjEyICJBbiBNRVRBTE9WRVJIQU5HIHN0YXRlbWVudCBpcyBkZWZpbmVkIGluIGEgVklBUlVMRSBzdGF0ZW1lbnQgb25seS5cbk9WRVJIQU5HIHN0YXRlbWVudCBjYW4gb25seSBiZSBkZWZpbmVkIGluIFZJQVJVTEUgR0VORVJBVEUuIgotMTYxMyAiQW4gTUVUQUxPVkVSSEFORyBzdGF0ZW1lbnQgaXMgZGVmaW5lZCwgYnV0IHRoZSByZXF1aXJlZCBESVJFQ1RJT04gc3RhdGVtZW50IGlzIG5vdCB5ZXQgZGVmaW5lZC5cblVwZGF0ZSB0aGUgTEVGIGZpbGUgdG8gZGVmaW5lIHRoZSBESVJFQ1RJT04gc3RhdGVtZW50IGJlZm9yZSB0aGUgT1ZFUkhBTkcuIgotMTYxNCAiQW4gRU5DTE9TVVJFIHN0YXRlbWVudCBpcyBkZWZpbmVkIGluIGEgVklBUlVMRSBzdGF0ZW1lbnQgb25seS5cbk9WRVJIQU5HIHN0YXRlbWVudCBjYW4gb25seSBiZSBkZWZpbmVkIGluIFZJQVJVTEUgR0VORVJBVEUuIgotMTYxNSAiRU5EIFZJQVJVTEUgbmFtZSAlcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgVklBUlVMRSBuYW1lICVzLlxuQ29ycmVjdCB0aGUgTEVGIGZpbGUgYmVmb3JlIHJlcnVubmluZyBpdCB0aHJvdWdoIHRoZSBMRUYgcGFyc2VyLiIKLTE2MTYgIlNBTUVORVQgc3RhdGVtZW50IGlzIHJlcXVpcmVkIGluc2lkZSBTUEFDSU5HIGZvciBhbnkgbGVmIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBhbmQgZWFybGllciwgYnV0IGlzIG5vdCBkZWZpbmVkIGluIHRoZSBwYXJzZWQgbGVmIGZpbGUuIgotMTYxNyAiTk9OREVGQVVMVFJVTEUgc3RhdGVtZW50IHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBMQVlFUiBzdGF0ZW1lbnQuIgotMTYxOCAiTk9OREVGQVVMVFJVTEUgc3RhdGVtZW50IHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBWSUEgc3RhdGVtZW50LiIKLTE2MTkgIkVORCBOT05ERUZBVUxUUlVMRSBuYW1lICVzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBOT05ERUZBVUxUUlVMRSBuYW1lICVzLlxuQ29ycmVjdCB0aGUgTEVGIGZpbGUgYmVmb3JlIHJlcnVubmluZyBpdCB0aHJvdWdoIHRoZSBMRUYgcGFyc2VyLiIKLTE2MjAgIkhBUkRTUEFDSU5HIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS42IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTE2MjEgIlVTRVZJQSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNjIyICJVU0VWSUFSVUxFIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS42IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTE2MjMgIk1JTkNVVFMgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjYgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTYyNCAiRU5EIExBWUVSIG5hbWUgJXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIExBWUVSIG5hbWUgJXMuXG5Db3JyZWN0IHRoZSBMRUYgZmlsZSBiZWZvcmUgcmVydW5uaW5nIGl0IHRocm91Z2ggdGhlIExFRiBwYXJzZXIuIgotMTYyNSAiQSBXSURUSCBzdGF0ZW1lbnQgaXMgcmVxdWlyZWQgaW4gdGhlIExBWUVSIHN0YXRlbWVudCBpbiBOT05ERUZBVUxUUlVMRS4iCi0xNjI2ICJBIFNQQUNJTkcgc3RhdGVtZW50IGlzIHJlcXVpcmVkIGluIHRoZSBMQVlFUiBzdGF0ZW1lbnQgaW4gTk9OREVGQVVMVFJVTEUgZm9yIGxlZiBmaWxlIHdpdGggdmVyc2lvbiA1LjUgYW5kIGVhcmxpZXIuXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiBVcGRhdGUgeW91ciBsZWYgdG8gYWRkIGEgTEFZRVIgc3RhdGVtZW50IGFuZCB0cnkgYWdhaW4uIgotMTYyNyAiUkVTSVNUQU5DRSBSUEVSU1Egc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTYyOCAiQ0FQQUNJVEFOQ0UgQ1BFUlNRRElTVCBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNjI5ICJFREdFQ0FQQUNJVEFOQ0Ugc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbiBZb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTE2MzAgIkRJQUdXSURUSCBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNjMxICJFTkQgU0lURSBuYW1lICVzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBTSVRFIG5hbWUgJXMuXG5Db3JyZWN0IHRoZSBMRUYgZmlsZSBiZWZvcmUgcmVydW5uaW5nIGl0IHRocm91Z2ggdGhlIExFRiBwYXJzZXIuIgotMTYzMiAiQSBDTEFTUyBzdGF0ZW1lbnQgaXMgcmVxdWlyZWQgaW4gdGhlIFNJVEUgc3RhdGVtZW50LiIKLTE2MzMgIkEgU0laRSAgc3RhdGVtZW50IGlzIHJlcXVpcmVkIGluIHRoZSBTSVRFIHN0YXRlbWVudC4iCi0xNjM0ICJFTkQgTUFDUk8gbmFtZSAlcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgTUFDUk8gbmFtZSAlcy5cbkNvcnJlY3QgdGhlIExFRiBmaWxlIGJlZm9yZSByZXJ1bm5pbmcgaXQgdGhyb3VnaCB0aGUgTEVGIHBhcnNlci4iCi0xNjM1ICJDT1ZFUiBCVU1QIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS41IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTE2MzYgIkJMT0NLIEJMQUNLQk9YIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS41IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTE2MzcgIkJMT0NLIFNPRlQgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjYgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTYzOCAiUEFEIEFSRUFJTyBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNSBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNjM5ICJTUEFDRVIgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTY0MCAiQU5URU5OQUNFTEwgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTY0MSAiV0VMTFRBUCBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNjQyICJPUklHSU4gc3RhdGVtZW50IGhhcyBiZWVuIGRlZmluZWQgbW9yZSB0aGFuIG9uY2UgaW4gYSBNQUNSTyBzdGF0ZW1lbnQuXG5Pbmx5IG9uZSBPUklHSU4gc3RhdGVtZW50IGNhbiBiZSBkZWZpbmVkIGluIGEgTWFjcm8uXG5QYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIgotMTY0MyAiRU5EIFBJTiBuYW1lICVzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBQSU4gbmFtZSAlcy5cbkNvcnJlY3QgdGhlIExFRiBmaWxlIGJlZm9yZSByZXJ1bm5pbmcgaXQgdGhyb3VnaCB0aGUgTEVGIHBhcnNlci4iCi0xNjQ0ICJBTlRFTk5BU0laRSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuMyBhbmQgZWFybGllciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTE2NDUgIkFOVEVOTkFNRVRBTEFSRUEgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjMgYW5kIGVhcmxpZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNjQ2ICJBTlRFTk5BTUVUQUxMRU5HVEggc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjMgYW5kIGVhcmxpZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNjQ3ICJBTlRFTk5BUEFSVElBTE1FVEFMQVJFQSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNjQ4ICJBTlRFTk5BUEFSVElBTE1FVEFMU0lERUFSRUEgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTY0OSAiQU5URU5OQVBBUlRJQUxDVVRBUkVBIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTE2NTAgIkFOVEVOTkFESUZGQVJFQSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNjUxICJBTlRFTk5BR0FURUFSRUEgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTY1MiAiQU5URU5OQU1BWEFSRUFDQVIgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTY1MyAiQU5URU5OQU1BWFNJREVBUkVBQ0FSIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTE2NTQgIkFOVEVOTkFNQVhDVVRDQVIgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTY1NSAiQU5URU5OQU1PREVMIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS41IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTE2NTYgIk5FVEVYUFIgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjYgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTY1NyAiU1VQUExZU0VOU0lUSVZJVFkgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjYgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTY1OCAiR1JPVU5EU0VOU0lUSVZJVFkgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjYgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTY1OSAiVEhFIFNQQUNJTkcgc3RhdGVtZW50IGhhcyB0aGUgdmFsdWUgJWcgaW4gTUFDUk8gT0JTLlxuVmFsdWUgaGFzIHRvIGJlIDAgb3IgZ3JlYXRlci4iCi0xNjYwICJUSEUgREVTSUdOUlVMRVdJRFRIIHN0YXRlbWVudCBoYXMgdGhlIHZhbHVlICVnIGluIE1BQ1JPIE9CUy5cblZhbHVlIGhhcyB0byBiZSAwIG9yIGdyZWF0ZXIuIgotMTY2MSAiREVOU0lUWSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNjYyICJFTkQgQVJSQVkgbmFtZSAlcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgQVJSQVkgbmFtZSAlcy5cbkNvcnJlY3QgdGhlIExFRiBmaWxlIGJlZm9yZSByZXJ1bm5pbmcgaXQgdGhyb3VnaCB0aGUgTEVGIHBhcnNlci4iCi0xNjYzICJBIENFTlRFUlRPQ0VOVEVSIHN0YXRlbWVudCB3YXMgYWxyZWFkeSBkZWZpbmVkIGluIFNQQUNJTkdcbkNFTlRFUlRPQ0VOVEVSIGNhbiBvbmx5IGJlIGRlZmluZWQgb25jZSBwZXIgTEFZRVIgQ1VUIFNQQUNJTkcuIgotMTY2NCAiQ0VOVEVSVE9DRU5URVIgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjYgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTY2NSAiQSBTQU1FTkVUIHN0YXRlbWVudCB3YXMgYWxyZWFkeSBkZWZpbmVkIGluIFNQQUNJTkdcblNBTUVORVQgY2FuIG9ubHkgYmUgZGVmaW5lZCBvbmNlIHBlciBMQVlFUiBDVVQgU1BBQ0lORy4iCi0xNjY2ICJBIFBBUkFMTEVMT1ZFUkxBUCBzdGF0ZW1lbnQgd2FzIGFscmVhZHkgZGVmaW5lZCBpbiBTUEFDSU5HXG5QQVJBTExFTE9WRVJMQVAgY2FuIG9ubHkgYmUgZGVmaW5lZCBvbmNlIHBlciBMQVlFUiBDVVQgU1BBQ0lORy4iCi0xNjY3ICJBIFNBTUVORVQgc3RhdGVtZW50IHdhcyBhbHJlYWR5IGRlZmluZWQgaW4gU1BBQ0lOR1xuRWl0aGVyIFNBTUVORVQgb3IgTEFZRVIgY2FuIGJlIGRlZmluZWQsIGJ1dCBub3QgYm90aC4iCi0xNjY4ICJBREpBQ0VOVENVVFMgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjUgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTY2OSAiQSBTQU1FTkVUIHN0YXRlbWVudCB3YXMgYWxyZWFkeSBkZWZpbmVkIGluIFNQQUNJTkdcbkVpdGhlciBTQU1FTkVUIG9yIEFESkFDRU5UQ1VUUyBjYW4gYmUgZGVmaW5lZCwgYnV0IG5vdCBib3RoLiIKLTE2NzAgIkEgU0FNRU5FVCBzdGF0ZW1lbnQgd2FzIGFscmVhZHkgZGVmaW5lZCBpbiBTUEFDSU5HXG5FaXRoZXIgU0FNRU5FVCBvciBBUkVBIGNhbiBiZSBkZWZpbmVkLCBidXQgbm90IGJvdGguIgotMTY3MSAiSU5QVVRQSU5BTlRFTk5BU0laRSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuMyBvciBlYXJsaWVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgd2l0aCB2ZXJzaW9uICVnLCBoYXMgYm90aCBvbGQgYW5kIG5ldyBJTlBVVFBJTkFOVEVOTkFTSVpFIHN5bnRheCwgd2hpY2ggaXMgaW5jb3JyZWN0LiIKLTE2NzIgIk9VVFBVVFBJTkFOVEVOTkFTSVpFIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS4zIG9yIGVhcmxpZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSB3aXRoIHZlcnNpb24gJWcsIGhhcyBib3RoIG9sZCBhbmQgbmV3IE9VVFBVVFBJTkFOVEVOTkFTSVpFIHN5bnRheCwgd2hpY2ggaXMgaW5jb3JyZWN0LiIKLTE2NzMgIklOT1VUUElOQU5URU5OQVNJWkUgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjMgb3IgZWFybGllciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIHdpdGggdmVyc2lvbiAlZywgaGFzIGJvdGggb2xkIGFuZCBuZXcgSU5PVVRQSU5BTlRFTk5BU0laRSBzeW50YXgsIHdoaWNoIGlzIGluY29ycmVjdC4iCi0xNjc0ICJBTlRFTk5BSU5QVVRHQVRFQVJFQSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy5cbkVpdGhlciB1cGRhdGUgeW91ciBWRVJTSU9OIG51bWJlciB0byA1LjQgb3IgbGF0ZXIsIG9yIHVzZSB0aGUgNS4zIHN5bnRheDpcbnsgSU5QVVRJTkFURU5OQVNJWkUgfCBPVVRQVVRQSU5BTlRFTk5BU0laRSB8IElOT1VUUElOQU5URU5OQVNJWkUgfSB2YWx1ZS4iCi0xNjc1ICJBTlRFTk5BSU5QVVRHQVRFQVJFQSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBvciBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIHdpdGggdmVyc2lvbiAlZywgaGFzIGJvdGggb2xkIGFuZCBuZXcgQU5URU5OQUlOUFVUR0FURUFSRUEgc3ludGF4LCB3aGljaCBpcyBpbmNvcnJlY3QuIgotMTY3NiAiQU5URU5OQUlOT1VURElGRkFSRUEgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuXG5FaXRoZXIgdXBkYXRlIHlvdXIgVkVSU0lPTiBudW1iZXIgdG8gNS40IG9yIGxhdGVyLCBvciB1c2UgdGhlIDUuMyBzeW50YXg6XG57IElOUFVUSU5BVEVOTkFTSVpFIHwgT1VUUFVUUElOQU5URU5OQVNJWkUgfCBJTk9VVFBJTkFOVEVOTkFTSVpFIH0gdmFsdWUuIgotMTY3NyAiQU5URU5OQUlOT1VURElGRkFSRUEgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgb3IgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSB3aXRoIHZlcnNpb24gJWcsIGhhcyBib3RoIG9sZCBhbmQgbmV3IEFOVEVOTkFJTk9VVERJRkZBUkVBIHN5bnRheCwgd2hpY2ggaXMgaW5jb3JyZWN0LiIKLTE2NzggIkFOVEVOTkFPVVRQVVRESUZGQVJFQSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy5cbkVpdGhlciB1cGRhdGUgeW91ciBWRVJTSU9OIG51bWJlciB0byA1LjQgb3IgbGF0ZXIsIG9yIHVzZSB0aGUgNS4zIHN5bnRheDpcbnsgSU5QVVRJTkFURU5OQVNJWkUgfCBPVVRQVVRQSU5BTlRFTk5BU0laRSB8IElOT1VUUElOQU5URU5OQVNJWkUgfSB2YWx1ZS4iLgotMTY3OSAiQU5URU5OQU9VVFBVVERJRkZBUkVBIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IG9yIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgd2l0aCB2ZXJzaW9uICVnLCBoYXMgYm90aCBvbGQgYW5kIG5ldyBBTlRFTk5BT1VUUFVURElGRkFSRUEgc3ludGF4LCB3aGljaCBpcyBpbmNvcnJlY3QuIgotMTY4MCAiUEFSQUxMRUxPVkVSTEFQIGlzIGEgdmVyc2lvbiA1Ljcgb3IgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNjgxICJFTkRPRkxJTkUgaXMgYSB2ZXJzaW9uIDUuNyBvciBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTE2ODIgIk5PVENITEVOR1RIIGlzIGEgdmVyc2lvbiA1Ljcgb3IgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNjgzICJFWENFUFRTQU1FUEdORVQgaXMgYSB2ZXJzaW9uIDUuNyBvciBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTE2ODQgIlNBTUVORVQgaXMgYSB2ZXJzaW9uIDUuNyBvciBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTE2ODUgIkFSUkFZU1BBQ0lORyBpcyBhIHZlcnNpb24gNS43IG9yIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTY4NiAiQU5URU5OQUNVTVJPVVRJTkdQTFVTQ1VUIGlzIGEgdmVyc2lvbiA1Ljcgb3IgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNjg3ICJBTlRFTk5BR0FURVBMVVNESUZGIGlzIGEgdmVyc2lvbiA1Ljcgb3IgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNjg4ICJBTlRFTk5BQVJFQU1JTlVTRElGRiBpcyBhIHZlcnNpb24gNS43IG9yIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTY4OSAiQU5URU5OQUFSRUFESUZGUkVEVUNFUFdMIGlzIGEgdmVyc2lvbiA1Ljcgb3IgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNjkwICJFWENFUFRFWFRSQUNVVCBpcyBhIHZlcnNpb24gNS43IG9yIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTY5MSAiTEVOR1RIIGlzIGEgdmVyc2lvbiA1Ljcgb3IgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNjkzICJBUkVBIGlzIGEgdmVyc2lvbiA1Ljcgb3IgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNjk0ICJTUEFDSU5HVEFCTEUgT1JUSE9HT05BTCBpcyBhIHZlcnNpb24gNS43IG9yIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTY5NiAiRU5ET0ZOT1RDSFdJRFRIIGlzIGEgdmVyc2lvbiA1Ljcgb3IgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNjk3ICJUV09XSURUSFMgaXMgYSB2ZXJzaW9uIDUuNyBvciBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTE2OTggIkJVTVAgaXMgYSB2ZXJzaW9uIDUuNyBvciBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTE2OTkgIkVYQ0VQVFBHTkVUIGlzIGEgdmVyc2lvbiA1Ljcgb3IgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNzAwICJNSU5JTVVNQ1VUIFdJVEhJTiBpcyBhIHZlcnNpb24gNS43IG9yIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTcwMSAiQSBMQVlFUiBzdGF0ZW1lbnQgaXMgbWlzc2luZyBpbiBHZW9tZXRyeS5cbkxBWUVSIGlzIGEgcmVxdWlyZWQgc3RhdGVtZW50IGJlZm9yZSBhbnkgZ2VvbWV0cnkgY2FuIGJlIGRlZmluZWQuIgotMTcwMiAiQ1VSUkVOVERFTiBzdGF0ZW1lbnQgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgUk9VVElORy4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIKLTE3MDMgIkFOVEVOTkFESUZGQVJFQVJBVElPIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTE3MDQgIkFOVEVOTkFESUZGQVJFQVJBVElPIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IG9yIGVhcmxpZXIgb2xkIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgd2l0aCB2ZXJzaW9uICVnLCBoYXMgYm90aCBvbGQgYW5kIG5ldyBBTlRFTk5BRElGRkFSRUFSQVRJTyBzeW50YXgsIHdoaWNoIGlzIGluY29ycmVjdC4iCi0xNzA1ICJWSUFSVUxFIHN0YXRlbWVudCBpbiBhIGxheWVyLCByZXF1aXJlcyBhIERJUkVDVElPTiBjb25zdHJ1Y3Qgc3RhdGVtZW50LiIKLTE3MDYgIkFuIEVOQ0xPU1VSRSBzdGF0ZW1lbnQgd2FzIGFscmVhZHkgZGVmaW5lZCBpbiB0aGUgbGF5ZXIuXG5JdCBpcyBESVJFQ1RJT04gb3IgRU5DTE9TVVJFIGNhbiBiZSBzcGVjaWZpZWQgaW4gYSBsYXllci4iCi0xNzA3ICJFTkNMT1NVUkUgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjUgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIgotMTcwOCAiQSBWSUFSVUxFIEdFTkVSQVRFIHJlcXVpcmVzIHRocmVlIGxheWVycy4iCi0xNzA5ICJWSUFSVUxFIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS42IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIKLTE3MTAgIk1BWEVER0VTIGlzIGEgdmVyc2lvbiA1Ljcgb3IgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNzExICJOT1NIQVJFREVER0UgaW4gTEFZRVIgRU5DTE9TVVJFIGlzIGEgdmVyc2lvbiA1Ljggb3IgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iCi0xNzEyICJNSU5GRUFUVVJFIHN0YXRlbWVudCB3YXMgZGVmaW5lZCBiZWZvcmUgVU5JVFMuXG5SZWZlciB0aGUgTEVGIExhbmd1YWdlIFJlZmVyZW5jZSBtYW51YWwgZm9yIHRoZSBvcmRlciBvZiBMRUYgc3RhdGVtZW50cy4iCi0yMDAwICJTdHJpbmcgaGFzIGV4Y2VlZGVkIDEwNDg1NzYgY2hhcmFjdGVycywgZXh0cmEgY2hhcmFjdGVycyBhcmUgdHJ1bmNhdGVkLiIKLTIwMDEgIk5vIFZFUlNJT04gc3RhdGVtZW50IGZvdW5kLCB1c2luZyB0aGUgZGVmYXVsdCB2YWx1ZSAlMmcuIgotMjAwMiAiTkFNRVNDQVNFU0VOU0lUSVZFIGlzIGEgcmVxdWlyZWQgc3RhdGVtZW50IG9uIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjUgYW5kIGVhcmxpZXIuXG5XaXRob3V0IE5BTUVTQ0FTRVNFTlNJVElWRSBkZWZpbmVkLCB0aGUgTEVGIGZpbGUgaXMgdGVjaG5pY2FsbHkgaW5jb3JyZWN0LlxuUmVmZXIgdG8gdGhlIExFRi9ERUYgNS41IG9yIGVhcmxpZXIgTGFuZ3VhZ2UgUmVmZXJlbmNlIG1hbnVhbCBvbiBob3cgdG8gZGVmaW5lIHRoaXMgc3RhdGVtZW50LiIKLTIwMDMgIkJVU0JJVENIQVJTIGlzIGEgcmVxdWlyZWQgc3RhdGVtZW50IG9uIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjUgYW5kIGVhcmxpZXIuXG5XaXRob3V0IEJVU0JJVENIQVJTIGRlZmluZWQsIHRoZSBMRUYgZmlsZSBpcyB0ZWNobmljYWxseSBpbmNvcnJlY3QuXG5SZWZlciB0byB0aGUgTEVGL0RFRiA1LjUgb3IgZWFybGllciBMYW5ndWFnZSBSZWZlcmVuY2UgbWFudWFsIG9uIGhvdyB0byBkZWZpbmUgdGhpcyBzdGF0ZW1lbnQuIgotMjAwNCAiRElWSURFUkNIQVIgaXMgYSByZXF1aXJlZCBzdGF0ZW1lbnQgb24gTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNSBhbmQgZWFybGllci5cbldpdGhvdXQgRElWSURFQ0hBUiBkZWZpbmVkLCB0aGUgTEVGIGZpbGUgaXMgdGVjaG5pY2FsbHkgaW5jb3JyZWN0LlxuUmVmZXIgdG8gdGhlIExFRi9ERUYgNS41IG9yIGVhcmxpZXIgTGFuZ3VhZ2UgUmVmZXJlbmNlIG1hbnVhbCBvbiBob3cgdG8gZGVmaW5lIHRoaXMgc3RhdGVtZW50LiIKLTIwMDUgIkRJVklERVJDSEFSIGhhcyBhbiBpbnZhbGlkIG51bGwgdmFsdWUuIFZhbHVlIGlzIHNldCB0byBkZWZhdWx0IC8iCi0yMDA2ICJCVVNCSVRDSEFSIGhhcyBhbiBpbnZhbGlkIG51bGwgdmFsdWUuIFZhbHVlIGlzIHNldCB0byBkZWZhdWx0IFtdIgotMjAwNyAiTkFNRVNDQVNFU0VOU0lUSVZFIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNiBvciBsYXRlci4iCi0yMDA4ICJOT1dJUkVFWFRFTlNJT05BVFBJTiBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjYgb3IgbGF0ZXIuXG5UaGUgTk9XSVJFRVhURU5TSU9OQVRQSU4gc3RhdGVtZW50IHdpbGwgYmUgaWdub3JlZC4iCi0yMDA5ICJVU0VNSU5TUEFDSU5HIFBJTiBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjYgb3IgbGF0ZXIuXG4gVGhlIFVTRU1JTlNQQUNJTkcgUElOIHN0YXRlbWVudCB3aWxsIGJlIGlnbm9yZWQuIgotMjAxMCAiSXQgaXMgaW5jb3JyZWN0IHRvIGhhdmUgYm90aCBTUEFDSU5HIHJ1bGVzICYgU1BBQ0lOR1RBQkxFIHJ1bGVzIHdpdGhpbiBhIFJPVVRJTkcgbGF5ZXIuIgotMjAxMSAiU0xPVFdJUkVXSURUSCBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1Ljcgb3IgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNyBvciBsYXRlci4iCi0yMDEyICJTTE9UV0lSRUxFTkdUSCBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1Ljcgb3IgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNyBvciBsYXRlci4iCi0yMDEzICJTTE9UV0lEVEggc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS43IG9yIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1Ljcgb3IgbGF0ZXIuIgotMjAxNCAiU0xPVExFTkdUSCBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1Ljcgb3IgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNyBvciBsYXRlci4iCi0yMDE1ICJNQVhBREpBQ0VOVFNMT1RTUEFDSU5HIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNyBvciBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS43IG9yIGxhdGVyLiIKLTIwMTYgIk1BWENPQVhJQUxTTE9UU1BBQ0lORyBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1Ljcgb3IgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNyBvciBsYXRlci4iCi0yMDE3ICJNQVhFREdFU0xPVFNQQUNJTkcgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS43IG9yIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1Ljcgb3IgbGF0ZXIuIgotMjAxOCAiU1BMSVRXSVJFV0lEVEggc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS43IG9yIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1Ljcgb3IgbGF0ZXIuIgotMjAxOSAiVE9QT0ZTVEFDS09OTFkgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS42IG9yIGxhdGVyLiIKLTIwMjAgIkZPUkVJR04gc3RhdGVtZW50IGluIFZJQSBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNiBvciBsYXRlci4iCi0yMDIxICJ0dXJuLXZpYSBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG4gVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjYgb3IgbGF0ZXIuIgotMjAyMiAiRElSRUNUSU9OIHN0YXRlbWVudCBpbiBWSUFSVUxFIGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS42IG9yIGxhdGVyLiIKLTIwMjMgIk9WRVJIQU5HIHN0YXRlbWVudCB3aWxsIGJlIHRyYW5zbGF0ZWQgaW50byBzaW1pbGFyIEVOQ0xPU1VSRSBydWxlIgotMjAyNCAiTUVUQUxPVkVSSEFORyBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjYgb3IgbGF0ZXIuIgotMjAyNSAiU0FNRU5FVCBzdGF0ZW1lbnQgaW4gTk9OREVGQVVMVFJVTEUgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjYgb3IgbGF0ZXIuIgotMjAyNiAiSVJEUk9QIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iCi0yMDI3ICJNSU5GRUFUVVJFIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iCi0yMDI4ICJESUVMRUNUUklDIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iCi0yMDI5ICJSRVNJU1RBTkNFIFJQRVJTUSBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjYgb3IgbGF0ZXIuIgotMjAzMCAiQ0FQQUNJVEFOQ0UgQ1BFUlNRRElTVCBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjYgb3IgbGF0ZXIuIgotMjAzMSAiRURHRUNBUEFDSVRBTkNFIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNiBvciBsYXRlci4iCi0yMDMyICJBIFNJVEUgc3RhdGVtZW50IGlzIGRlZmluZWQgYmVmb3JlIFNZTU1FVFJZIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCBkZWZpbmUgU0lURSBhZnRlciBTWU1NRVRSWS4iCi0yMDMzICJUaGUgc3RhdGVtZW50IENPVkVSIEJVTVAgaXMgYSBMRUYgdmVyc2lvbiA1LjUgc3ludGF4LlxuWW91ciBMRUYgZmlsZSBpcyB2ZXJzaW9uIDUuNCBvciBlYXJsaWVyIHdoaWNoIGlzIGluY29ycmVjdCBidXQgd2lsbCBiZSBhbGxvd2VkXG5iZWNhdXNlIHRoaXMgYXBwbGljYXRpb24gZG9lcyBub3QgZW5mb3JjZSBzdHJpY3QgdmVyc2lvbiBjaGVja2luZy5cbk90aGVyIHRvb2xzIHRoYXQgZW5mb3JjZSBzdHJpY3QgY2hlY2tpbmcgd2lsbCBoYXZlIGEgc3ludGF4IGVycm9yIHdoZW4gcmVhZGluZyB0aGlzIGZpbGUuXG5Zb3UgY2FuIGNoYW5nZSB0aGUgVkVSU0lPTiBzdGF0ZW1lbnQgaW4gdGhpcyBMRUYgZmlsZSB0byA1LjUgb3IgaGlnaGVyIHRvIHN0b3AgdGhpcyB3YXJuaW5nLiIKLTIwMzQgIlRoZSBzdGF0ZW1lbnQgQkxPQ0sgQkxBQ0tCT1ggaXMgYSBMRUYgdmVyaW9uIDUuNSBzeW50YXguXG5Zb3VyIExFRiBmaWxlIGlzIHZlcnNpb24gNS40IG9yIGVhcmxpZXIgd2hpY2ggaXMgaW5jb3JyZWN0IGJ1dCB3aWxsIGJlIGFsbG93ZWRcbmJlY2F1c2UgdGhpcyBhcHBsaWNhdGlvbiBkb2VzIG5vdCBlbmZvcmNlIHN0cmljdCB2ZXJzaW9uIGNoZWNraW5nLlxuT3RoZXIgdG9vbHMgdGhhdCBlbmZvcmNlIHN0cmljdCBjaGVja2luZyB3aWxsIGhhdmUgYSBzeW50YXggZXJyb3Igd2hlbiByZWFkaW5nIHRoaXMgZmlsZS5cbllvdSBjYW4gY2hhbmdlIHRoZSBWRVJTSU9OIHN0YXRlbWVudCBpbiB0aGlzIExFRiBmaWxlIHRvIDUuNSBvciBoaWdoZXIgdG8gc3RvcCB0aGlzIHdhcm5pbmcuIgotMjAzNSAiVGhlIHN0YXRlbWVudCBQQUQgQVJFQUlPIGlzIGEgTEVGIHZlcmlvbiA1LjUgc3ludGF4LlxuWW91ciBMRUYgZmlsZSBpcyB2ZXJzaW9uIDUuNCBvciBlYXJsaWVyIHdoaWNoIGlzIGluY29ycmVjdCBidXQgd2lsbCBiZSBhbGxvd2VkXG5iZWNhdXNlIHRoaXMgYXBwbGljYXRpb24gZG9lcyBub3QgZW5mb3JjZSBzdHJpY3QgdmVyc2lvbiBjaGVja2luZy5cbk90aGVyIHRvb2xzIHRoYXQgZW5mb3JjZSBzdHJpY3QgY2hlY2tpbmcgd2lsbCBoYXZlIGEgc3ludGF4IGVycm9yIHdoZW4gcmVhZGluZyB0aGlzIGZpbGUuXG5Zb3UgY2FuIGNoYW5nZSB0aGUgVkVSU0lPTiBzdGF0ZW1lbnQgaW4gdGhpcyBMRUYgZmlsZSB0byA1LjUgb3IgaGlnaGVyIHRvIHN0b3AgdGhpcyB3YXJuaW5nLiIKLTIwMzYgIlNPVVJDRSBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjYgb3IgbGF0ZXIuIgotMjAzNyAiU09VUkNFIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNiBvciBsYXRlci4iCi0yMDM4ICJNQUNSTyBQT1dFUiBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIgotMjAzOSAiQSBTSVRFIHN0YXRlbWVudCBpcyBkZWZpbmVkIGJlZm9yZSBPUklHSU4gc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIGRlZmluZSBTSVRFIGFmdGVyIE9SSUdJTi4iCi0yMDQwICJBIFBJTiBzdGF0ZW1lbnQgaXMgZGVmaW5lZCBiZWZvcmUgT1JJR0lOIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCBkZWZpbmUgUElOIGFmdGVyIE9SSUdJTi4iCi0yMDQxICJBIE9CUyBzdGF0ZW1lbnQgaXMgZGVmaW5lZCBiZWZvcmUgT1JJR0lOIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCBkZWZpbmUgT0JTIGFmdGVyIE9SSUdJTi4iCi0yMDQyICJMRVEgc3RhdGVtZW50IGluIE1BQ1JPIGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS42IG9yIGxhdGVyLiIKLTIwNDMgIkZPUkVJR04gc3RhdGVtZW50IGluIE1BQ1JPIFBJTiBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNiBvciBsYXRlci4iCi0yMDQ0ICJMRVEgc3RhdGVtZW50IGluIE1BQ1JPIFBJTiBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNiBvciBsYXRlci4iCi0yMDQ1ICJNQUNSTyBQT1dFUiBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIgotMjA0NiAiTUFDUk8gTEVBS0FHRSBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIgotMjA0NyAiTUFDUk8gUklTRVRIUkVTSCBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIgotMjA0OCAiTUFDUk8gRkFMTFRIUkVTSCBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIgotMjA0OSAiTUFDUk8gUklTRVNBVENVUiBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIgotMjA1MCAiTUFDUk8gRkFMTFNBVENVUiBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIgotMjA1MSAiTUFDUk8gVkxPIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iCi0yMDUyICJNQUNSTyBWSEkgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS40IG9yIGxhdGVyLiIKLTIwNTMgIk1BQ1JPIFRJRU9GRlIgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS40IG9yIGxhdGVyLiIKLTIwNTQgIk1BQ1JPIE9VVFBVVE5PSVNFTUFSR0lOIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iCi0yMDU1ICJNQUNSTyBPVVRQVVRSRVNJU1RBTkNFIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iCi0yMDU2ICJNQUNSTyBJTlBVVE5PSVNFTUFSR0lOIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iCi0yMDU3ICJNQUNSTyBDQVBBQ0lUQU5DRSBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIgotMjA1OCAiTUFDUk8gUkVTSVNUQU5DRSBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIgotMjA1OSAiTUFDUk8gUFVMTERPV05SRVMgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS40IG9yIGxhdGVyLiIKLTIwNjAgIk1BQ1JPIENVUlJFTlRTT1VSQ0Ugc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS40IG9yIGxhdGVyLiIKLTIwNjEgIk1BQ1JPIENVUlJFTlRTT1VSQ0Ugc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS40IG9yIGxhdGVyLiIKLTIwNjIgIk1BQ1JPIFJJU0VWT0xUQUdFVEhSRVNIT0xEIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iCi0yMDYzICJNQUNSTyBGQUxMVk9MVEFHRVRIUkVTSE9MRCBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIgotMjA2NCAiTUFDUk8gSVZfVEFCTEVTIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iCi0yMDY1ICJFaXRoZXIgUEFUSCwgUkVDVCBvciBQT0xZR09OIHN0YXRlbWVudCBpcyBhIHJlcXVpcmVkIGluIE1BQ1JPL1BJTi9QT1JULiIKLTIwNjYgIk1BQ1JPIFRJTUlORyBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIgotMjA2NyAiREVGSU5FIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNiBvciBsYXRlci4iCi0yMDY4ICJERUZJTkVTIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNiBvciBsYXRlci4iCi0yMDY5ICJERUZJTkVCIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNiBvciBsYXRlci4iCi0yMDcwICJVTklWRVJTQUxOT0lTRU1BUkdJTiBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIgotMjA3MSAiRURHRVJBVEVUSFJFU0hPTEQxIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iCi0yMDcyICJFREdFUkFURVRIUkVTSE9MRDIgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS40IG9yIGxhdGVyLiIKLTIwNzMgIkVER0VSQVRFU0NBTEVGQUNUT1Igc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS40IG9yIGxhdGVyLiIKLTIwNzQgIk5PSVNFVEFCTEUgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS40IG9yIGxhdGVyLiIKLTIwNzUgIkNPUlJFQ1RJT05UQUJMRSBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIgotMjA3NiAiRWl0aGVyIFBBVEgsIFJFQ1Qgb3IgUE9MWUdPTiBzdGF0ZW1lbnQgaXMgcmVxdWlyZWQgaW4gTUFDUk8vT0JTLiIKLTIwNzcgIkEgU1BBQ0lORyBTQU1FTkVUIHNlY3Rpb24gaXMgZGVmaW5lZCBidXQgaXQgaXMgbm90IGxlZ2FsIGluIGEgTEVGIDUuNyB2ZXJzaW9uIGZpbGUuXG5JdCB3aWxsIGJlIGlnbm9yZWQgd2hpY2ggd2lsbCBwcm9iYWJseSBjYXVzZSByZWFsIERSQyB2aW9sYXRpb25zIHRvIGJlIGlnbm9yZWQsIGFuZCBtYXlcbmNhdXNlIGZhbHNlIERSQyB2aW9sYXRpb25zIHRvIG9jY3VyLlxuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcsIGFuZCBjb3JyZWN0bHkgaGFuZGxlIHRoZXNlIERSQyBydWxlcywgeW91IHNob3VsZCBtb2RpZnkgeW91clxuTEVGIHRvIHVzZSB0aGUgYXBwcm9wcmlhdGUgU0FNRU5FVCBrZXl3b3JkcyBhcyBkZXNjcmliZWQgaW4gdGhlIExFRi9ERUYgNS43XG5tYW51YWwgdW5kZXIgdGhlIFNQQUNJTkcgc3RhdGVtZW50cyBpbiB0aGUgTEFZRVIgKFJvdXRpbmcpIGFuZCBMQVlFUiAoQ3V0KVxuc2VjdGlvbnMgbGlzdGVkIGluIHRoZSBMRUYgVGFibGUgb2YgQ29udGVudHMuIgotMjA3OCAiSXQgaXMgaWxsZWdhbCB0byBoYXZlIG1vcmUgdGhhbiBvbmUgU1BBQ0lOR1RBQkxFIHJ1bGVzIHdpdGhpbiBhIFJPVVRJTkcgbGF5ZXIiCi0yMDc5ICJDVVJSRU5UREVOIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuMiBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuMiBvciBsYXRlci4iCi0yMDgwICJUaGUgbnVtYmVyIG9mIGN1dCB2YWx1ZXMgaW4gbXVsdGlwbGUgQVJSQVlTUEFDSU5HIEFSUkFZQ1VUUyBhcmUgbm90IGluIGluY3JlYXNpbmcgb3JkZXIuXG5UbyBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGRvY3VtZW50YXRpb24sIHVwZGF0ZSB0aGUgY3V0IHZhbHVlcyB0byBpbmNyZWFzaW5nIG9yZGVyLiIKLTI1MDIgIk1lc3NhZ2UgJXMgaGFzIGJlZW4gc3VwcHJlc3NlZCBmcm9tIG91dHB1dCIKLTI1MDMgIk1lc3NhZ2UgJXMgaGFzIGV4Y2VlZGVkIHRoZSBtZXNzYWdlIGRpc3BsYXkgbGltaXQgb2YgJWQiCi0zMDAwICJUaGVyZSBhcmUgc3RpbGwgZGF0YSBhZnRlciB0aGUgRU5EIExJQlJBUlkiCi00MDAwICJsZWZ3SW5pdENiayB3YXMgYWxyZWFkeSBjYWxsZWQsIGNhbm5vdCBjYWxsIGxlZndJbml0IGFnYWluLlxuV3JpdGVyIEV4aXQuXG4iCi00MDAxICJsZWZ3SW5pdCB3YXMgYWxyZWFkeSBjYWxsZWQsIGNhbm5vdCBjYWxsIGxlZndJbml0Q2JrIGFnYWluLlxuV3JpdGVyIEV4aXQuXG4iCi00MDAyICJsZWZ3SW5pdCB3YXMgYWxyZWFkeSBjYWxsZWQsIGNhbm5vdCBjYWxsIGxlZndJbml0Q2JrIGFnYWluLlxuV3JpdGVyIEV4aXQuXG4iCi00MDAzICJsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ1VzZUxlbmd0aFRocmVzaG9sZCBjYW5ub3QgYmUgY2FsbGVkIGlmXG5cdGxlZndMYXllclJvdXRpbmdTcGFjaW5nUmFuZ2UgaGFzIG5vdCBiZWVuIGNhbGxlZC5cbiIKLTQwMDQgImxlZndMYXllclJvdXRpbmdTcGFjaW5nSW5mbHVlbmNlIGNhbm5vdCBiZSBjYWxsZWQgaWZcblx0bGVmUmFuZ2UgYW5kIHJpZ2h0UmFuZ2UgaW4gbGVmd0xheWVyUm91dGluZ1NwYWNpbmcgYXJlIGJvdGggemVyby5cbiIKLTQwMDUgImxlZndMYXllclJvdXRpbmdTcGFjaW5nSW5mbHVlbmNlIGNhbm5vdCBiZSBjYWxsZWQgaWZcblx0bGVmUmFuZ2UgYW5kIHJpZ2h0UmFuZ2UgaW4gbGVmd0xheWVyUm91dGluZ1NwYWNpbmcgYXJlIGJvdGggemVyby4iCi00MDA2ICJOZWVkIGFuIG91dHB1dCBmaWxlIGlmIHdyaXRpbmcgaW4gZW5jcnlwdGVkIGZvcm1hdC5cbiIKLTQxMDAgImxlZndXcml0ZSBjYWxsZWQgYmVmb3JlIGxlZndJbml0Q2JrLlxuIgotNDEwMSAibGVmd1NldFJlZ2lzdGVyVW51c2VkQ2FsbGJhY2tzIHdhcyBub3QgY2FsbGVkIHRvIHNldHVwIHRoaXMgZGF0YS5cbiIKLTQ1MDAgIkNhbGxiYWNrIGZvciAlcyBpcyByZXF1aXJlZCwgYnV0IGlzIG5vdCBkZWZpbmVkLlxuXG4iCi00NzAwICJMRUYgaXRlbXMgdGhhdCB3ZXJlIHByZXNlbnQgYnV0IGlnbm9yZWQgYmVjYXVzZSBvZiBubyBjYWxsYmFja3Mgd2VyZSBzZXQuXG4iCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZi55IGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWYueQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZiNjVkYy4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZi55CisrKyAvZGV2L251bGwKQEAgLTEsNzE1OCArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotLy8gQVRURU5USU9OOiBUSElTIElTIEFOIEFVVE8tR0VORVJBVEVEIEZJTEUuIERPIE5PVCBDSEFOR0UgSVQhICAgICAgICAgICAgICAgCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotLy8gQ29weXJpZ2h0IDIwMTIgLSAyMDE3LCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZSAgICAgICAgICAgICAKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gICAgICAgIAotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsICAgICAgIAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgICAgCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgICAgICAKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgIAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LCAgICAgICAgICAKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4gICAgICAgICAgICAgCi0vLwotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLQotLy8gIEVycm9yIG1lc3NhZ2UgbnVtYmVyOgotLy8gICAxMDAgLSAgbGVmIHJlYWRlciwgbGVmclJlYWRlci5jCi0vLyAgIDEwMDAgLSBsZWYgcGFyc2VyLCBlcnJvciwgbGV4LmNwcGgsIGxlZi55IChDQUxMQkFDSyAmIENIS0VSUikKLS8vICAgMTMwMCAtIGZyb20gbGVmaUVycm9yLCBsZWZpTGF5ZXIuY3BwCi0vLyAgIDEzNTAgLSBmcm9tIGxlZmlFcnJvciwgbGVmaU1hY3JvLmNwcAotLy8gICAxMzYwIC0gZnJvbSBsZWZpRXJyb3IsIGxlZmlNaXNjLmNwcAotLy8gICAxNDAwIC0gZnJvbSBsZWZpRXJyb3IsIGxlZmlOb25EZWZhdWx0LmNwcAotLy8gICAxNDIwIC0gZnJvbSBsZWZpRXJyb3IsIGxlZmlWaWEuY3BwCi0vLyAgIDE0MzAgLSBmcm9tIGxlZmlFcnJvciwgbGVmaVZpYVJ1bGUuY3BwCi0vLyAgIDE1MDAgLSBsZWYgcGFyc2VyLCBlcnJvciwgbGVmLnkKLS8vICAgMjAwMCAtIGxlZiBwYXJzZXIsIHdhcm5pbmcsIGxleC5jcHBoCi0vLyAgIDI1MDAgLSBsZWYgcGFyc2VyLCB3YXJuaW5nLCBsZWYueQotLy8gICAzMDAwIC0gbGVmIHBhcnNlciwgaW5mbywgbGV4LmNwcGgKLS8vICAgNDAwMCAtIGxlZiB3cml0ZXIsIGVycm9yLCBsZWZ3V3J0aWVyLmNwcCAmIGxlZndXcml0ZXJDYWxscy5jcHAKLS8vICAgNDUwMCAtIGxlZiB3cml0ZXIsIHdhcm5pbmcsIGxlZndXcnRpZXIuY3BwICYgbGVmd1dyaXRlckNhbGxzLmNwcAotLy8gICA0NzAwIC0gbGVmIHdyaXRlciwgaW5mbywgbGVmd1dydGllci5jcHAgJiBsZWZ3V3JpdGVyQ2FsbHMuY3BwCi0vLyAKLS8vICAgSGlnaGVzdCBtZXNzYWdlIG51bWJlciA9IDQ3MDAKLQotJXsKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0KLSNpbmNsdWRlICJsZXguaCIKLSNpbmNsdWRlICJsZWZpRGVmcy5ocHAiCi0jaW5jbHVkZSAibGVmaVVzZXIuaHBwIgotI2luY2x1ZGUgImxlZmlVdGlsLmhwcCIKLQotI2luY2x1ZGUgImxlZnJEYXRhLmhwcCIKLSNpbmNsdWRlICJsZWZyQ2FsbEJhY2tzLmhwcCIKLSNpbmNsdWRlICJsZWZyU2V0dGluZ3MuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0jZGVmaW5lIExZUFJPUF9FQ0FQICJFREdFX0NBUEFDSVRBTkNFIgotCi0jZGVmaW5lIFlZSU5JVERFUFRIIDEwMDAwICAvLyBwY3IgNjQwOTAyIC0gaW5pdGlhbGl6ZSB0aGUgeXlzdGFja3NpemUgdG8gMzAwIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBtYXkgbmVlZCB0byBpbmNyZWFzZSBpbiBhIGRlc2lnbiBnZXRzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGFyZ2VyIGFuZCBhIHBvbHlnb24gaGFzIGFyb3VuZCAzMDAgc2l6ZXMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxMS8yMS8yMDAzIC0gaW5jcnJlYXNlZCB0byA1MDAsIGRlc2lnbiBmcm9tIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXJ0aXNhbiBpcyBncmVhdGVyIHRoYW4gMzAwLCBuZWVkIHRvIGZpbmQgYSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdheSB0byBkeW5hbWljYWxseSBpbmNyZWFzZSB0aGUgc2l6ZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIvMTAvMjAwNCAtIGluY3JlYXNlZCB0byAxMDAwIGZvciBwY3IgNjg2MDczIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMy8yMi8yMDA0IC0gaW5jcmVhc2VkIHRvIDIwMDAgZm9yIHBjciA2OTU4NzkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA5LzI5LzIwMDQgLSBkb3VibGUgdGhlIHNpemUgZm9yIHBjciA3NDY4NjUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmllZCB0byBvdmVyd3JpdGUgdGhlIHl5b3ZlcmZsb3cgZGVmaW5pdGlvbiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IGlzIGltcG9zc2libGUgZHVlIHRvIHRoZSB1bmlvbiBzdHJ1Y3R1cmUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxMC8wMy8yMDA2IC0gaW5jcmVhc2VkIHRvIDEwMDAwIGZvciBwY3IgOTEzNjk1IAotCi0jZGVmaW5lIFlZTUFYREVQVEggMzAwMDAwICAvLyAxLzI0LzIwMDggLSBpbmNyZWFzZWQgZnJvbSAxNTAwMDAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHZhbHVlIGhhcyB0byBiZSBncmVhdGVyIHRoYW4gWVlJTklUREVQVEggCi0KLQotLy8gTWFjcm8gdG8gZGVzY3JpYmUgaG93IHdlIGhhbmRsZSBhIGNhbGxiYWNrLgotLy8gSWYgdGhlIGZ1bmN0aW9uIHdhcyBzZXQgdGhlbiBjYWxsIGl0LgotLy8gSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgbm9uIHplcm8gdGhlbiB0aGVyZSB3YXMgYW4gZXJyb3IKLS8vIHNvIGNhbGwgdGhlIGVycm9yIHJvdXRpbmUgYW5kIGV4aXQuCi0jZGVmaW5lIENBTExCQUNLKGZ1bmMsIHR5cCwgZGF0YSkgXAotICAgIGlmICghbGVmRGF0YS0+bGVmX2Vycm9ycykgeyBcCi0gICAgICBpZiAoZnVuYykgeyBcCi0gICAgICAgIGlmICgobGVmRGF0YS0+bGVmUmV0VmFsID0gKCpmdW5jKSh0eXAsIGRhdGEsIGxlZlNldHRpbmdzLT5Vc2VyRGF0YSkpID09IDApIHsgXAotICAgICAgICB9IGVsc2UgeyBcCi0gICAgICAgICAgcmV0dXJuIGxlZkRhdGEtPmxlZlJldFZhbDsgXAotICAgICAgICB9IFwKLSAgICAgIH0gXAotICAgIH0KLQotI2RlZmluZSBDSEtFUlIoKSBcCi0gICAgaWYgKGxlZkRhdGEtPmxlZl9lcnJvcnMgPiAyMCkgeyBcCi0gICAgICBsZWZFcnJvcigxMDIwLCAiVG9vIG1hbnkgc3ludGF4IGVycm9ycy4iKTsgXAotICAgICAgbGVmRGF0YS0+bGVmX2Vycm9ycyA9IDA7IFwKLSAgICAgIHJldHVybiAxOyBcCi0gICAgfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNkZWZpbmUgQ19FUSAwCi0jZGVmaW5lIENfTkUgMQotI2RlZmluZSBDX0xUIDIKLSNkZWZpbmUgQ19MRSAzCi0jZGVmaW5lIENfR1QgNAotI2RlZmluZSBDX0dFIDUKLQotCi1pbnQgY29tcF9zdHIoY2hhciAqczEsIGludCBvcCwgY2hhciAqczIpCi17Ci0gICAgaW50IGsgPSBzdHJjbXAoczEsIHMyKTsKLSAgICBzd2l0Y2ggKG9wKSB7Ci0gICAgICAgIGNhc2UgQ19FUTogcmV0dXJuIGsgPT0gMDsKLSAgICAgICAgY2FzZSBDX05FOiByZXR1cm4gayAhPSAwOwotICAgICAgICBjYXNlIENfR1Q6IHJldHVybiBrID4gIDA7Ci0gICAgICAgIGNhc2UgQ19HRTogcmV0dXJuIGsgPj0gMDsKLSAgICAgICAgY2FzZSBDX0xUOiByZXR1cm4gayA8ICAwOwotICAgICAgICBjYXNlIENfTEU6IHJldHVybiBrIDw9IDA7Ci0gICAgICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLWludCBjb21wX251bShkb3VibGUgczEsIGludCBvcCwgZG91YmxlIHMyKQotewotICAgIGRvdWJsZSBrID0gczEgLSBzMjsKLSAgICBzd2l0Y2ggKG9wKSB7Ci0gICAgICAgIGNhc2UgQ19FUTogcmV0dXJuIGsgPT0gMDsKLSAgICAgICAgY2FzZSBDX05FOiByZXR1cm4gayAhPSAwOwotICAgICAgICBjYXNlIENfR1Q6IHJldHVybiBrID4gIDA7Ci0gICAgICAgIGNhc2UgQ19HRTogcmV0dXJuIGsgPj0gMDsKLSAgICAgICAgY2FzZSBDX0xUOiByZXR1cm4gayA8ICAwOwotICAgICAgICBjYXNlIENfTEU6IHJldHVybiBrIDw9IDA7Ci0gICAgICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IHZhbGlkTnVtKGludCB2YWx1ZXMpIHsKLSAgICBzd2l0Y2ggKHZhbHVlcykgewotICAgICAgICBjYXNlIDEwMDoKLSAgICAgICAgY2FzZSAyMDA6Ci0gICAgICAgIGNhc2UgMTAwMDoKLSAgICAgICAgY2FzZSAyMDAwOgotICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICBjYXNlIDQwMDoKLSAgICAgICAgY2FzZSA4MDA6Ci0gICAgICAgIGNhc2UgNDAwMDoKLSAgICAgICAgY2FzZSA4MDAwOgotICAgICAgICBjYXNlIDEwMDAwOgotICAgICAgICBjYXNlIDIwMDAwOgotICAgICAgICAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS42KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+VW5pdHNDYmspIHsKLSAgICAgICAgICAgICAgICAgIGlmIChsZWZEYXRhLT51bml0c1dhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+VW5pdHNXYXJuaW5ncykgewotICAgICAgICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgZm91bmQgd2hlbiBwcm9jZXNzaW5nIExFRiBmaWxlICclcydcblVuaXQgJWQgaXMgYSB2ZXJzaW9uIDUuNiBvciBsYXRlciBzeW50YXhcbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwKLSAgICAgICAgICAgICAgICAgICAgbGVmRGF0YS0+bGVmckZpbGVOYW1lLCB2YWx1ZXMsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgICAgICBsZWZFcnJvcigxNTAxLCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICAgfSAgICAgICAgCi0gICAgfQotICAgIGlmIChsZWZEYXRhLT51bml0c1dhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+VW5pdHNXYXJuaW5ncykgewotICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAiVGhlIHZhbHVlICVkIGRlZmluZWQgZm9yIExFRiBVTklUUyBEQVRBQkFTRSBNSUNST05TIGlzIGludmFsaWRcbi4gQ29ycmVjdCB2YWx1ZSBpcyAxMDAsIDIwMCwgNDAwLCA4MDAsIDEwMDAsIDIwMDAsIDQwMDAsIDgwMDAsIDEwMDAwLCBvciAyMDAwMCIsIHZhbHVlcyk7Ci0gICAgICAgbGVmRXJyb3IoMTUwMiwgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgfQotICAgIENIS0VSUigpOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgemVyb09yR3QoZG91YmxlIHZhbHVlcykgewotICAgIGlmICh2YWx1ZXMgPCAwKQotICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLSV9Ci0KLSV1bmlvbiB7Ci0gICAgICAgIGRvdWJsZSAgICBkdmFsIDsKLSAgICAgICAgaW50ICAgICAgIGludGVnZXIgOwotICAgICAgICBjaGFyICogICAgc3RyaW5nIDsKLSAgICAgICAgTGVmRGVmUGFyc2VyOjpsZWZQT0lOVCAgcHQ7Ci19Ci0KLSV0b2tlbiA8c3RyaW5nPiBLX0hJU1RPUlkKLSV0b2tlbiBLX0FCVVQgS19BQlVUTUVOVCBLX0FDVElWRSBLX0FOQUxPRyBLX0FSUkFZIEtfQVJFQQotJXRva2VuIEtfQkxPQ0sgS19CT1RUT01MRUZUIEtfQk9UVE9NUklHSFQKLSV0b2tlbiBLX0JZIEtfQ0FQQUNJVEFOQ0UgS19DQVBNVUxUSVBMSUVSIEtfQ0xBU1MgS19DTE9DSyBLX0NMT0NLVFlQRQotJXRva2VuIEtfQ09MVU1OTUFKT1IgS19ERVNJR05SVUxFV0lEVEggS19JTkZMVUVOQ0UKLSV0b2tlbiBLX0NPUkUgS19DT1JORVIgS19DT1ZFUiBLX0NQRVJTUURJU1QgS19DVVJSRU5UIAotJXRva2VuIEtfQ1VSUkVOVFNPVVJDRSBLX0NVVCBLX0RFRkFVTFQgS19EQVRBQkFTRSBLX0RBVEEKLSV0b2tlbiBLX0RJRUxFQ1RSSUMgS19ESVJFQ1RJT04gS19ETyBLX0VER0VDQVBBQ0lUQU5DRQotJXRva2VuIEtfRUVRIEtfRU5EIEtfRU5EQ0FQIEtfRkFMTCBLX0ZBTExDUyBLX0ZBTExUMCBLX0ZBTExTQVRUMQotJXRva2VuIEtfRkFMTFJTIEtfRkFMTFNBVENVUiBLX0ZBTExUSFJFU0ggS19GRUVEVEhSVSBLX0ZJWEVEIEtfRk9SRUlHTiBLX0ZST01QSU4KLSV0b2tlbiBLX0dFTkVSQVRFIEtfR0VORVJBVE9SIEtfR1JPVU5EIEtfSEVJR0hUIEtfSE9SSVpPTlRBTCBLX0lOT1VUIEtfSU5QVVQKLSV0b2tlbiBLX0lOUFVUTk9JU0VNQVJHSU4gS19DT01QT05FTlRQSU4KLSV0b2tlbiBLX0lOVFJJTlNJQyBLX0lOVkVSVCBLX0lSRFJPUCBLX0lURVJBVEUgS19JVl9UQUJMRVMgS19MQVlFUiBLX0xFQUtBR0UKLSV0b2tlbiBLX0xFUSBLX0xJQlJBUlkgS19NQUNSTyBLX01BVENIIEtfTUFYREVMQVkgS19NQVhMT0FEIEtfTUVUQUxPVkVSSEFORyBLX01JTExJQU1QUwotJXRva2VuIEtfTUlMTElXQVRUUyBLX01JTkZFQVRVUkUgS19NVVNUSk9JTiBLX05BTUVTQ0FTRVNFTlNJVElWRSBLX05BTk9TRUNPTkRTCi0ldG9rZW4gS19ORVRTIEtfTkVXIEtfTk9OREVGQVVMVFJVTEUKLSV0b2tlbiBLX05PTklOVkVSVCBLX05PTlVOQVRFIEtfT0JTIEtfT0hNUyBLX09GRlNFVCBLX09SSUVOVEFUSU9OIEtfT1JJR0lOIEtfT1VUUFVUCi0ldG9rZW4gS19PVVRQVVROT0lTRU1BUkdJTgotJXRva2VuIEtfT1ZFUkhBTkcgS19PVkVSTEFQIEtfT0ZGIEtfT04gS19PVkVSTEFQUyBLX1BBRCBLX1BBVEggS19QQVRURVJOIEtfUElDT0ZBUkFEUwotJXRva2VuIEtfUElOIEtfUElUQ0gKLSV0b2tlbiBLX1BMQUNFRCBLX1BPTFlHT04gS19QT1JUIEtfUE9TVCBLX1BPV0VSIEtfUFJFIEtfUFVMTERPV05SRVMgS19SRUNUCi0ldG9rZW4gS19SRVNJU1RBTkNFIEtfUkVTSVNUSVZFIEtfUklORyBLX1JJU0UgS19SSVNFQ1MgS19SSVNFUlMgS19SSVNFU0FUQ1VSIEtfUklTRVRIUkVTSAotJXRva2VuIEtfUklTRVNBVFQxIEtfUklTRVQwIEtfUklTRVZPTFRBR0VUSFJFU0hPTEQgS19GQUxMVk9MVEFHRVRIUkVTSE9MRAotJXRva2VuIEtfUk9VVElORyBLX1JPV01BSk9SIEtfUlBFUlNRIEtfU0FNRU5FVCBLX1NDQU5VU0UgS19TSEFQRSBLX1NIUklOS0FHRQotJXRva2VuIEtfU0lHTkFMIEtfU0lURSBLX1NJWkUgS19TT1VSQ0UgS19TUEFDRVIgS19TUEFDSU5HIEtfU1BFQ0lBTE5FVFMgS19TVEFDSwotJXRva2VuIEtfU1RBUlQgS19TVEVQIEtfU1RPUCBLX1NUUlVDVFVSRSBLX1NZTU1FVFJZIEtfVEFCTEUgS19USElDS05FU1MgS19USUVISUdICi0ldG9rZW4gS19USUVMT1cgS19USUVPRkZSIEtfVElNRSBLX1RJTUlORyBLX1RPIEtfVE9QSU4gS19UT1BMRUZUIEtfVE9QUklHSFQKLSV0b2tlbiBLX1RPUE9GU1RBQ0tPTkxZCi0ldG9rZW4gS19UUklTVEFURSBLX1RZUEUgS19VTkFURU5FU1MgS19VTklUUyBLX1VTRSBLX1ZBUklBQkxFIEtfVkVSVElDQUwgS19WSEkKLSV0b2tlbiBLX1ZJQSBLX1ZJQVJVTEUgS19WTE8gS19WT0xUQUdFIEtfVk9MVFMgS19XSURUSCBLX1ggS19ZCi0ldG9rZW4gPHN0cmluZz4gVF9TVFJJTkcgUVNUUklORwotJXRva2VuIDxkdmFsPiBOVU1CRVIKLSV0b2tlbiBLX04gS19TIEtfRSBLX1cgS19GTiBLX0ZTIEtfRkUgS19GVwotJXRva2VuIEtfUjAgS19SOTAgS19SMTgwIEtfUjI3MCBLX01YIEtfTVkgS19NWFI5MCBLX01ZUjkwCi0ldG9rZW4gS19VU0VSIEtfTUFTVEVSU0xJQ0UKLSV0b2tlbiBLX0VORE1BQ1JPIEtfRU5ETUFDUk9QSU4gS19FTkRWSUFSVUxFIEtfRU5EVklBIEtfRU5ETEFZRVIgS19FTkRTSVRFCi0ldG9rZW4gS19DQU5QTEFDRSBLX0NBTk5PVE9DQ1VQWSBLX1RSQUNLUyBLX0ZMT09SUExBTiBLX0dDRUxMR1JJRCBLX0RFRkFVTFRDQVAKLSV0b2tlbiBLX01JTlBJTlMgS19XSVJFQ0FQCi0ldG9rZW4gS19TVEFCTEUgS19TRVRVUCBLX0hPTEQKLSV0b2tlbiBLX0RFRklORSBLX0RFRklORVMgS19ERUZJTkVCIEtfSUYgS19USEVOIEtfRUxTRSBLX0ZBTFNFIEtfVFJVRSAKLSV0b2tlbiBLX0VRIEtfTkUgS19MRSBLX0xUIEtfR0UgS19HVCBLX09SIEtfQU5EIEtfTk9UCi0ldG9rZW4gS19ERUxBWSBLX1RBQkxFRElNRU5TSU9OIEtfVEFCTEVBWElTIEtfVEFCTEVFTlRSSUVTIEtfVFJBTlNJVElPTlRJTUUKLSV0b2tlbiBLX0VYVEVOU0lPTgotJXRva2VuIEtfUFJPUERFRiBLX1NUUklORyBLX0lOVEVHRVIgS19SRUFMIEtfUkFOR0UgS19QUk9QRVJUWQotJXRva2VuIEtfVklSVFVBTCBLX0JVU0JJVENIQVJTIEtfVkVSU0lPTgotJXRva2VuIEtfQkVHSU5FWFQgS19FTkRFWFQKLSV0b2tlbiBLX1VOSVZFUlNBTE5PSVNFTUFSR0lOIEtfRURHRVJBVEVUSFJFU0hPTEQxIEtfQ09SUkVDVElPTlRBQkxFCi0ldG9rZW4gS19FREdFUkFURVNDQUxFRkFDVE9SIEtfRURHRVJBVEVUSFJFU0hPTEQyIEtfVklDVElNTk9JU0UKLSV0b2tlbiBLX05PSVNFVEFCTEUgS19FREdFUkFURSBLX09VVFBVVFJFU0lTVEFOQ0UgS19WSUNUSU1MRU5HVEgKLSV0b2tlbiBLX0NPUlJFQ1RJT05GQUNUT1IgS19PVVRQVVRQSU5BTlRFTk5BU0laRQotJXRva2VuIEtfSU5QVVRQSU5BTlRFTk5BU0laRSBLX0lOT1VUUElOQU5URU5OQVNJWkUKLSV0b2tlbiBLX0NVUlJFTlRERU4gS19QV0wgS19BTlRFTk5BTEVOR1RIRkFDVE9SIEtfVEFQRVJSVUxFCi0ldG9rZW4gS19ESVZJREVSQ0hBUiBLX0FOVEVOTkFTSVpFIEtfQU5URU5OQU1FVEFMTEVOR1RIIEtfQU5URU5OQU1FVEFMQVJFQQotJXRva2VuIEtfUklTRVNMRVdMSU1JVCBLX0ZBTExTTEVXTElNSVQgS19GVU5DVElPTiBLX0JVRkZFUiBLX0lOVkVSVEVSCi0ldG9rZW4gS19OQU1FTUFQU1RSSU5HIEtfTk9XSVJFRVhURU5TSU9OQVRQSU4gS19XSVJFRVhURU5TSU9OCi0ldG9rZW4gS19NRVNTQUdFIEtfQ1JFQVRFRklMRSBLX09QRU5GSUxFIEtfQ0xPU0VGSUxFIEtfV0FSTklORwotJXRva2VuIEtfRVJST1IgS19GQVRBTEVSUk9SCi0ldG9rZW4gS19SRUNPVkVSWSBLX1NLRVcgS19BTllFREdFIEtfUE9TRURHRSBLX05FR0VER0UKLSV0b2tlbiBLX1NERkNPTkRTVEFSVCBLX1NERkNPTkRFTkQgS19TREZDT05ECi0ldG9rZW4gS19NUFdIIEtfTVBXTCBLX1BFUklPRAotJXRva2VuIEtfQUNDVVJSRU5UREVOU0lUWSBLX0RDQ1VSUkVOVERFTlNJVFkgS19BVkVSQUdFIEtfUEVBSyBLX1JNUyBLX0ZSRVFVRU5DWQotJXRva2VuIEtfQ1VUQVJFQSBLX01FR0FIRVJUWiBLX1VTRUxFTkdUSFRIUkVTSE9MRCBLX0xFTkdUSFRIUkVTSE9MRAotJXRva2VuIEtfQU5URU5OQUlOUFVUR0FURUFSRUEgS19BTlRFTk5BSU5PVVRESUZGQVJFQSBLX0FOVEVOTkFPVVRQVVRESUZGQVJFQQotJXRva2VuIEtfQU5URU5OQUFSRUFSQVRJTyBLX0FOVEVOTkFESUZGQVJFQVJBVElPIEtfQU5URU5OQUNVTUFSRUFSQVRJTwotJXRva2VuIEtfQU5URU5OQUNVTURJRkZBUkVBUkFUSU8gS19BTlRFTk5BQVJFQUZBQ1RPUiBLX0FOVEVOTkFTSURFQVJFQVJBVElPCi0ldG9rZW4gS19BTlRFTk5BRElGRlNJREVBUkVBUkFUSU8gS19BTlRFTk5BQ1VNU0lERUFSRUFSQVRJTwotJXRva2VuIEtfQU5URU5OQUNVTURJRkZTSURFQVJFQVJBVElPIEtfQU5URU5OQVNJREVBUkVBRkFDVE9SCi0ldG9rZW4gS19ESUZGVVNFT05MWSBLX01BTlVGQUNUVVJJTkdHUklEIEtfRklYRURNQVNLCi0ldG9rZW4gS19BTlRFTk5BQ0VMTCBLX0NMRUFSQU5DRU1FQVNVUkUgS19FVUNMSURFQU4gS19NQVhYWQotJXRva2VuIEtfVVNFTUlOU1BBQ0lORyBLX1JPV01JTlNQQUNJTkcgS19ST1dBQlVUU1BBQ0lORyBLX0ZMSVAgS19OT05FCi0ldG9rZW4gS19BTlRFTk5BUEFSVElBTE1FVEFMQVJFQSBLX0FOVEVOTkFQQVJUSUFMTUVUQUxTSURFQVJFQQotJXRva2VuIEtfQU5URU5OQUdBVEVBUkVBIEtfQU5URU5OQURJRkZBUkVBIEtfQU5URU5OQU1BWEFSRUFDQVIKLSV0b2tlbiBLX0FOVEVOTkFNQVhTSURFQVJFQUNBUiBLX0FOVEVOTkFQQVJUSUFMQ1VUQVJFQSBLX0FOVEVOTkFNQVhDVVRDQVIKLSV0b2tlbiBLX1NMT1RXSVJFV0lEVEggS19TTE9UV0lSRUxFTkdUSCBLX1NMT1RXSURUSCBLX1NMT1RMRU5HVEgKLSV0b2tlbiBLX01BWEFESkFDRU5UU0xPVFNQQUNJTkcgS19NQVhDT0FYSUFMU0xPVFNQQUNJTkcgS19NQVhFREdFU0xPVFNQQUNJTkcKLSV0b2tlbiBLX1NQTElUV0lSRVdJRFRIIEtfTUlOSU1VTURFTlNJVFkgS19NQVhJTVVNREVOU0lUWSBLX0RFTlNJVFlDSEVDS1dJTkRPVwotJXRva2VuIEtfREVOU0lUWUNIRUNLU1RFUCBLX0ZJTExBQ1RJVkVTUEFDSU5HIEtfTUlOSU1VTUNVVCBLX0FESkFDRU5UQ1VUUwotJXRva2VuIEtfQU5URU5OQU1PREVMIEtfQlVNUCBLX0VOQ0xPU1VSRSBLX0ZST01BQk9WRSBLX0ZST01CRUxPVwotJXRva2VuIEtfSU1QTEFOVCBLX0xFTkdUSCBLX01BWFZJQVNUQUNLIEtfQVJFQUlPIEtfQkxBQ0tCT1gKLSV0b2tlbiBLX01BWFdJRFRIIEtfTUlORU5DTE9TRURBUkVBIEtfTUlOU1RFUCBLX09SSUVOVCBLX09YSURFMSBLX09YSURFMgotJXRva2VuIEtfT1hJREUzIEtfT1hJREU0IEtfUEFSQUxMRUxSVU5MRU5HVEggS19NSU5XSURUSAotJXRva2VuIEtfUFJPVFJVU0lPTldJRFRIIEtfU1BBQ0lOR1RBQkxFIEtfV0lUSElOCi0ldG9rZW4gS19BQk9WRSBLX0JFTE9XIEtfQ0VOVEVSVE9DRU5URVIgS19DVVRTSVpFIEtfQ1VUU1BBQ0lORyBLX0RFTlNJVFkKLSV0b2tlbiBLX0RJQUc0NSBLX0RJQUcxMzUgS19NQVNLCi0ldG9rZW4gS19ESUFHTUlORURHRUxFTkdUSCBLX0RJQUdTUEFDSU5HIEtfRElBR1BJVENIIEtfRElBR1dJRFRICi0ldG9rZW4gS19HRU5FUkFURUQgS19HUk9VTkRTRU5TSVRJVklUWSBLX0hBUkRTUEFDSU5HIEtfSU5TSURFQ09STkVSCi0ldG9rZW4gS19MQVlFUlMgS19MRU5HVEhTVU0gS19NSUNST05TIEtfTUlOQ1VUUwotJXRva2VuIEtfTUlOU0laRSBLX05FVEVYUFIgS19PVVRTSURFQ09STkVSCi0ldG9rZW4gS19QUkVGRVJFTkNMT1NVUkUgS19ST1dDT0wgS19ST1dQQVRURVJOIEtfU09GVAotJXRva2VuIEtfU1VQUExZU0VOU0lUSVZJVFkgS19VU0VWSUEKLSV0b2tlbiBLX1VTRVZJQVJVTEUgS19XRUxMVEFQCi0ldG9rZW4gS19BUlJBWUNVVFMgS19BUlJBWVNQQUNJTkcgS19BTlRFTk5BQVJFQURJRkZSRURVQ0VQV0wKLSV0b2tlbiBLX0FOVEVOTkFBUkVBTUlOVVNESUZGCi0ldG9rZW4gS19BTlRFTk5BQ1VNUk9VVElOR1BMVVNDVVQgS19BTlRFTk5BR0FURVBMVVNESUZGCi0ldG9rZW4gS19FTkRPRkxJTkUgS19FTkRPRk5PVENIV0lEVEggS19FWENFUFRFWFRSQUNVVCBLX0VYQ0VQVFNBTUVQR05FVAotJXRva2VuIEtfRVhDRVBUUEdORVQKLSV0b2tlbiBLX0xPTkdBUlJBWSBLX01BWEVER0VTIEtfTk9UQ0hMRU5HVEggS19OT1RDSFNQQUNJTkcgS19PUlRIT0dPTkFMCi0ldG9rZW4gS19QQVJBTExFTEVER0UgS19QQVJBTExFTE9WRVJMQVAgS19QR09OTFkgS19QUkwgS19UV09FREdFUyBLX1RXT1dJRFRIUwotCi0ldHlwZSA8c3RyaW5nPiBzdGFydF9tYWNybyBlbmRfbWFjcm8KLSV0eXBlIDxzdHJpbmc+IHN0YXJ0X2xheWVyCi0ldHlwZSA8c3RyaW5nPiBtYWNyb19waW5fdXNlCi0ldHlwZSA8c3RyaW5nPiBtYWNyb19zY2FuX3VzZQotJXR5cGUgPHN0cmluZz4gcGluX3NoYXBlCi0ldHlwZSA8c3RyaW5nPiBwYWRfdHlwZSBjb3JlX3R5cGUgZW5kY2FwX3R5cGUgY2xhc3NfdHlwZSBzaXRlX2NsYXNzCi0ldHlwZSA8c3RyaW5nPiBzdGFydF9mb3JlaWduIHNwYWNpbmdfdHlwZSBjbGVhcmFuY2VfdHlwZQotJXR5cGUgPHB0PiBwdCAKLSV0eXBlIDxwdD4gbWFjcm9fb3JpZ2luCi0ldHlwZSA8c3RyaW5nPiBsYXllcl9vcHRpb24gbGF5ZXJfb3B0aW9ucyBsYXllcl90eXBlIGxheWVyX2RpcmVjdGlvbgotJXR5cGUgPHN0cmluZz4gZWxlY3RyaWNhbF9kaXJlY3Rpb24KLSV0eXBlIDxpbnRlZ2VyPiBvcmllbnRhdGlvbiBtYXNrQ29sb3IKLSV0eXBlIDxkdmFsPiBleHByZXNzaW9uCi0ldHlwZSA8aW50ZWdlcj4gYl9leHByCi0ldHlwZSA8c3RyaW5nPiAgc19leHByCi0ldHlwZSA8aW50ZWdlcj4gcmVsb3Agc3BhY2luZ192YWx1ZQotJXR5cGUgPHN0cmluZz4gb3B0X2xheWVyX25hbWUgcmlzZWZhbGwgdW5hdGVuZXNzIGRlbGF5X29yX3RyYW5zaXRpb24KLSV0eXBlIDxzdHJpbmc+IHR3b19waW5fdHJpZ2dlciBmcm9tX3Bpbl90cmlnZ2VyIHRvX3Bpbl90cmlnZ2VyCi0ldHlwZSA8c3RyaW5nPiBvbmVfcGluX3RyaWdnZXIgcmVxX2xheWVyX25hbWUgCi0ldHlwZSA8c3RyaW5nPiBsYXllcl90YWJsZV90eXBlIGxheWVyX2VuY2xvc3VyZV90eXBlX29wdCBsYXllcl9taW5zdGVwX3R5cGUKLSV0eXBlIDxkdmFsPiAgIGxheWVyX3NwX1R3b1dpZHRoc1BSTAotJXR5cGUgPGR2YWw+IGludF9udW1iZXIKLQotJW5vbmFzc29jIElGCi0lbGVmdCBLX0FORAotJWxlZnQgS19PUgotJWxlZnQgS19MRSBLX0VRIEtfTFQgS19ORSBLX0dFIEtfR1QKLSVub25hc3NvYyBMTk9UCi0lbGVmdCAnLScgJysnCi0lbGVmdCAnKicgJy8nCi0lbm9uYXNzb2MgVU1JTlVTCi0KLSUlCi0KLWxlZl9maWxlOiBydWxlcyBleHRlbnNpb25fb3B0ICBlbmRfbGlicmFyeQotICAgICAgewotICAgICAgICAvLyAxMS8xNi8yMDAxIC0gV2FuZGEgZGEgUm9zYSAtIHBjciA0MDgzMzQKLSAgICAgICAgLy8gUmV0dXJuIDEgaWYgdGhlcmUgYXJlIGVycm9ycwotICAgICAgICBpZiAobGVmRGF0YS0+bGVmX2Vycm9ycykKLSAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIGlmICghbGVmRGF0YS0+aGFzVmVyKSB7Ci0gICAgICAgICAgICAgIGNoYXIgdGVtcFszMDBdOwotICAgICAgICAgICAgICBzcHJpbnRmKHRlbXAsICJObyBWRVJTSU9OIHN0YXRlbWVudCBmb3VuZCwgdXNpbmcgdGhlIGRlZmF1bHQgdmFsdWUgJTJnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICBsZWZXYXJuaW5nKDIwMDEsIHRlbXApOyAgICAgICAgICAgIAotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgLy9vbmx5IHByZSA1LjYsIDUuNiBpdCBpcyBvYnNvbGV0ZQotICAgICAgICBpZiAoIWxlZkRhdGEtPmhhc05hbWVDYXNlICYmIGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjYpCi0gICAgICAgICAgIGxlZldhcm5pbmcoMjAwMiwgIk5BTUVTQ0FTRVNFTlNJVElWRSBpcyBhIHJlcXVpcmVkIHN0YXRlbWVudCBvbiBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS41IGFuZCBlYXJsaWVyLlxuV2l0aG91dCBOQU1FU0NBU0VTRU5TSVRJVkUgZGVmaW5lZCwgdGhlIExFRiBmaWxlIGlzIHRlY2huaWNhbGx5IGluY29ycmVjdC5cblJlZmVyIHRoZSBMRUYvREVGIDUuNSBvciBlYXJsaWVyIExhbmd1YWdlIFJlZmVyZWNlIG1hbnVhbCBvbiBob3cgdG8gZGVmaW5lIHRoaXMgc3RhdGVtZW50LiIpOwotICAgICAgICBpZiAoIWxlZkRhdGEtPmhhc0J1c0JpdCAmJiBsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS42KQotICAgICAgICAgICBsZWZXYXJuaW5nKDIwMDMsICJCVVNCSVRDSEFSUyBpcyBhIHJlcXVpcmVkIHN0YXRlbWVudCBvbiBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS41IGFuZCBlYXJsaWVyLlxuV2l0aG91dCBCVVNCSVRDSEFSUyBkZWZpbmVkLCB0aGUgTEVGIGZpbGUgaXMgdGVjaG5pY2FsbHkgaW5jb3JyZWN0LlxuUmVmZXIgdGhlIExFRi9ERUYgNS41IG9yIGVhcmxpZXIgTGFuZ3VhZ2UgUmVmZXJlY2UgbWFudWFsIG9uIGhvdyB0byBkZWZpbmUgdGhpcyBzdGF0ZW1lbnQuIik7Ci0gICAgICAgIGlmICghbGVmRGF0YS0+aGFzRGl2Q2hhciAmJiBsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS42KQotICAgICAgICAgICBsZWZXYXJuaW5nKDIwMDQsICJESVZJREVSQ0hBUiBpcyBhIHJlcXVpcmVkIHN0YXRlbWVudG9uIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjUgYW5kIGVhcmxpZXIuXG5XaXRob3V0IERJVklERUNIQVIgZGVmaW5lZCwgdGhlIExFRiBmaWxlIGlzIHRlY2huaWNhbGx5IGluY29ycmVjdC5cblJlZmVyIHRoZSBMRUYvREVGIDUuNSBvciBlYXJsaWVyIExhbmd1YWdlIFJlZmVyZWNlIG1hbnVhbCBvbiBob3cgdG8gZGVmaW5lIHRoaXMgc3RhdGVtZW50LiIpOwotCi0gICAgICB9Ci0KLXZlcnNpb246IEtfVkVSU0lPTiB7IGxlZkRhdGEtPmxlZkR1bWJNb2RlID0gMTsgbGVmRGF0YS0+bGVmTm9OdW0gPSAxO30gVF9TVFJJTkcgJzsnCi0gICAgICB7IAotCQkgLy8gTW9yZSB0aGFuIDEgVkVSU0lPTiBpbiBsZWYgZmlsZSB3aXRoaW4gdGhlIG9wZW4gZmlsZSAtIEl0J3Mgd3Jvbmcgc3ludGF4LCAKLQkJIC8vIGJ1dCBjb3B5IG9sZCBiZWhhdmlvciAtIGluaXRpYWxpemUgbGVmIHJlYWRpbmcuCi0gICAgICAgICBpZiAobGVmRGF0YS0+aGFzVmVyKSAgICAgCi0gICAgICAgICB7Ci0JCQlsZWZEYXRhLT5pbml0UmVhZCgpOwotCQkgfQotCi0gICAgICAgICBsZWZEYXRhLT52ZXJzaW9uTnVtID0gY29udmVydF9uYW1lMm51bSgkMyk7Ci0gICAgICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA+IENVUlJFTlRfVkVSU0lPTikgewotICAgICAgICAgICAgY2hhciB0ZW1wWzEyMF07Ci0gICAgICAgICAgICBzcHJpbnRmKHRlbXAsCi0gICAgICAgICAgICAgICAiTGVmIHBhcnNlciAlLjFmIGRvZXMgbm90IHN1cHBvcnQgbGVmIGZpbGUgd2l0aCB2ZXJzaW9uICVzLiBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIiwgQ1VSUkVOVF9WRVJTSU9OLCAkMyk7Ci0gICAgICAgICAgICBsZWZFcnJvcigxNTAzLCB0ZW1wKTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgfQotCi0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5WZXJzaW9uU3RyQ2JrKSB7Ci0gICAgICAgICAgICBDQUxMQkFDSyhsZWZDYWxsYmFja3MtPlZlcnNpb25TdHJDYmssIGxlZnJWZXJzaW9uU3RyQ2JrVHlwZSwgJDMpOwotICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlZlcnNpb25DYmspCi0gICAgICAgICAgICAgICBDQUxMQkFDSyhsZWZDYWxsYmFja3MtPlZlcnNpb25DYmssIGxlZnJWZXJzaW9uQ2JrVHlwZSwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA+IDUuMyAmJiBsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS40KSB7Ci0gICAgICAgICAgICBsZWZEYXRhLT5pZ25vcmVWZXJzaW9uID0gMTsKLSAgICAgICAgIH0KLSAgICAgICAgIGxlZkRhdGEtPnVzZTVfMyA9IGxlZkRhdGEtPnVzZTVfNCA9IDA7Ci0gICAgICAgICBsZWZEYXRhLT5sZWZfZXJyb3JzID0gMDsKLSAgICAgICAgIGxlZkRhdGEtPmhhc1ZlciA9IDE7Ci0gICAgICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNikgewotICAgICAgICAgICAgbGVmRGF0YS0+ZG9uZUxpYiA9IDA7Ci0gICAgICAgICAgICBsZWZEYXRhLT5uYW1lc0Nhc2VTZW5zaXRpdmUgPSBsZWZTZXR0aW5ncy0+Q2FzZVNlbnNpdGl2ZTsKLSAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsZWZEYXRhLT5kb25lTGliID0gMTsKLSAgICAgICAgICAgIGxlZkRhdGEtPm5hbWVzQ2FzZVNlbnNpdGl2ZSA9IDE7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0KLWludF9udW1iZXIgOiBOVU1CRVIgCi0gICAgICB7Ci0gICAgICAgICAvLyBpbnRfbnVtYmVyIHJlcHJlc2VudCAnaW50ZWdlci1saWtlJyB0eXBlLiBJdCBjYW4gaGF2ZSBmcmFjdGlvbiBhbmQgZXhwb25lbnQgcGFydCAKLSAgICAgICAgIC8vIGJ1dCB0aGUgdmFsdWUgc2hvdWxkbid0IGV4Y2VlZCB0aGUgNjQtYml0IGludGVnZXIgbGltaXQuIAotICAgICAgICAgaWYgKCEoKCB5eWx2YWwuZHZhbCA+PSBsZWZEYXRhLT5sZWZsVmFsKSAmJiAoIHl5bHZhbC5kdmFsIDw9IGxlZkRhdGEtPmxlZnJWYWwpKSkgeyAvLyBZRVMsIGl0IGlzbid0IHJlYWxseSBhIG51bWJlciAKLSAgICAgICAgICAgIGNoYXIgKnN0ciA9IChjaGFyKikgbGVmTWFsbG9jKHN0cmxlbihsZWZEYXRhLT5jdXJyZW50X3Rva2VuKSArIHN0cmxlbihsZWZEYXRhLT5sZWZyRmlsZU5hbWUpICsgMzUwKTsKLSAgICAgICAgICAgIHNwcmludGYoc3RyLCAiRVJST1IgKExFRlBBUlMtMjAzKSBOdW1iZXIgaGFzIGV4Y2VlZGVkIHRoZSBsaW1pdCBmb3IgYW4gaW50ZWdlci4gU2VlIGZpbGUgJXMgYXQgbGluZSAlZC5cbiIsCi0gICAgICAgICAgICAgICAgICAgIGxlZkRhdGEtPmxlZnJGaWxlTmFtZSwgbGVmRGF0YS0+bGVmX25saW5lcyk7Ci0gICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICAgICAgICAgIGxlZmlFcnJvcigwLCAyMDMsIHN0cik7Ci0gICAgICAgICAgICBmcmVlKHN0cik7Ci0gICAgICAgICAgICBsZWZEYXRhLT5sZWZfZXJyb3JzKys7Ci0gICAgICAgIH0KLQotICAgICAgICAkJCA9IHl5bHZhbC5kdmFsIDsKLSAgICAgIH0KLQotZGl2aWRlcmNoYXI6IEtfRElWSURFUkNIQVIgUVNUUklORyAnOycKLSAgICAgIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+RGl2aWRlckNoYXJDYmspIHsKLSAgICAgICAgICBpZiAoc3RyY21wKCQyLCAiIikgIT0gMCkgewotICAgICAgICAgICAgIENBTExCQUNLKGxlZkNhbGxiYWNrcy0+RGl2aWRlckNoYXJDYmssIGxlZnJEaXZpZGVyQ2hhckNia1R5cGUsICQyKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgIENBTExCQUNLKGxlZkNhbGxiYWNrcy0+RGl2aWRlckNoYXJDYmssIGxlZnJEaXZpZGVyQ2hhckNia1R5cGUsICIvIik7Ci0gICAgICAgICAgICAgbGVmV2FybmluZygyMDA1LCAiRElWSURFUkNIQVIgaGFzIGFuIGludmFsaWQgbnVsbCB2YWx1ZS4gVmFsdWUgaXMgc2V0IHRvIGRlZmF1bHQgLyIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBsZWZEYXRhLT5oYXNEaXZDaGFyID0gMTsKLSAgICAgIH0KLQotYnVzYml0Y2hhcnM6IEtfQlVTQklUQ0hBUlMgUVNUUklORyAnOycKLSAgICAgIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+QnVzQml0Q2hhcnNDYmspIHsKLSAgICAgICAgICBpZiAoc3RyY21wKCQyLCAiIikgIT0gMCkgewotICAgICAgICAgICAgIENBTExCQUNLKGxlZkNhbGxiYWNrcy0+QnVzQml0Q2hhcnNDYmssIGxlZnJCdXNCaXRDaGFyc0Nia1R5cGUsICQyKTsgCi0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICBDQUxMQkFDSyhsZWZDYWxsYmFja3MtPkJ1c0JpdENoYXJzQ2JrLCBsZWZyQnVzQml0Q2hhcnNDYmtUeXBlLCAiW10iKTsgCi0gICAgICAgICAgICAgbGVmV2FybmluZygyMDA2LCAiQlVTQklUQ0hBUiBoYXMgYW4gaW52YWxpZCBudWxsIHZhbHVlLiBWYWx1ZSBpcyBzZXQgdG8gZGVmYXVsdCBbXSIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBsZWZEYXRhLT5oYXNCdXNCaXQgPSAxOwotICAgICAgfQotCi1ydWxlczoKLSAgICAgICAgfCBydWxlcyBydWxlCi0gICAgICAgIHwgZXJyb3IgCi0gICAgICAgICAgICB7IH0KLQotZW5kX2xpYnJhcnk6Ci0gICAgICB7Ci0gICAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtID49IDUuNikgewotICAgICAgICAgICBsZWZEYXRhLT5kb25lTGliID0gMTsKLSAgICAgICAgICAgbGVmRGF0YS0+Z2U1NmRvbmUgPSAxOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB8IEtfRU5EIEtfTElCUkFSWQotICAgICAgewotICAgICAgICBsZWZEYXRhLT5kb25lTGliID0gMTsKLSAgICAgICAgbGVmRGF0YS0+Z2U1NmRvbmUgPSAxOwotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MaWJyYXJ5RW5kQ2JrKQotICAgICAgICAgIENBTExCQUNLKGxlZkNhbGxiYWNrcy0+TGlicmFyeUVuZENiaywgbGVmckxpYnJhcnlFbmRDYmtUeXBlLCAwKTsKLSAgICAgICAgLy8gMTEvMTYvMjAwMSAtIFdhbmRhIGRhIFJvc2EgLSBwY3IgNDA4MzM0Ci0gICAgICAgIC8vIFJldHVybiAxIGlmIHRoZXJlIGFyZSBlcnJvcnMKLSAgICAgIH0KLQotcnVsZTogIHZlcnNpb24gfCBidXNiaXRjaGFycyB8IGNhc2Vfc2Vuc2l0aXZpdHkgfCB1bml0c19zZWN0aW9uCi0gICAgfCBsYXllcl9ydWxlIHwgdmlhIHwgdmlhcnVsZSB8IHZpYXJ1bGVfZ2VuZXJhdGUgfCBkaXZpZGVyY2hhcgotICAgIHwgd2lyZWV4dGVuc2lvbiB8IG1zZ19zdGF0ZW1lbnQKLSAgICB8IHNwYWNpbmdfcnVsZSB8IGRpZWxlY3RyaWMgfCBtaW5mZWF0dXJlIHwgaXJkcm9wIHwgc2l0ZSB8IG1hY3JvIHwgYXJyYXkKLSAgICB8IGRlZl9zdGF0ZW1lbnQgfCBub25kZWZhdWx0X3J1bGUgfCBwcm9wX2RlZl9zZWN0aW9uCi0gICAgfCB1bml2ZXJzYWxub2lzZW1hcmdpbiB8IGVkZ2VyYXRldGhyZXNob2xkMQotICAgIHwgZWRnZXJhdGVzY2FsZWZhY3RvciB8IGVkZ2VyYXRldGhyZXNob2xkMgotICAgIHwgbm9pc2V0YWJsZSB8IGNvcnJlY3Rpb250YWJsZSB8IGlucHV0X2FudGVubmEKLSAgICB8IG91dHB1dF9hbnRlbm5hIHwgaW5vdXRfYW50ZW5uYQotICAgIHwgYW50ZW5uYV9pbnB1dCB8IGFudGVubmFfaW5vdXQgfCBhbnRlbm5hX291dHB1dCB8IG1hbnVmYWN0dXJpbmcgIHwgZml4ZWRtYXNrIAotICAgIHwgdXNlbWluc3BhY2luZyB8IGNsZWFyYW5jZW1lYXN1cmUgfCBtYXhzdGFja192aWEKLSAgICB8IGNyZWF0ZV9maWxlX3N0YXRlbWVudAotICAgIDsKLQotY2FzZV9zZW5zaXRpdml0eTogS19OQU1FU0NBU0VTRU5TSVRJVkUgS19PTiAnOycKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNikgewotICAgICAgICAgICAgICBsZWZEYXRhLT5uYW1lc0Nhc2VTZW5zaXRpdmUgPSBUUlVFOwotICAgICAgICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5DYXNlU2Vuc2l0aXZlQ2JrKQotICAgICAgICAgICAgICAgIENBTExCQUNLKGxlZkNhbGxiYWNrcy0+Q2FzZVNlbnNpdGl2ZUNiaywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGVmckNhc2VTZW5zaXRpdmVDYmtUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGxlZkRhdGEtPm5hbWVzQ2FzZVNlbnNpdGl2ZSk7Ci0gICAgICAgICAgICAgIGxlZkRhdGEtPmhhc05hbWVDYXNlID0gMTsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5DYXNlU2Vuc2l0aXZlQ2JrKSAvLyB3cml0ZSB3YXJuaW5nIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmNhc2VTZW5zaXRpdmVXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkNhc2VTZW5zaXRpdmVXYXJuaW5ncykKLSAgICAgICAgICAgICAgICAgICBsZWZXYXJuaW5nKDIwMDcsICJOQU1FU0NBU0VTRU5TSVRJVkUgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS42IG9yIGxhdGVyLiIpOwotICAgICAgICAgIH0KLSAgICAgIHwgS19OQU1FU0NBU0VTRU5TSVRJVkUgS19PRkYgJzsnCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjYpIHsKLSAgICAgICAgICAgICAgbGVmRGF0YS0+bmFtZXNDYXNlU2Vuc2l0aXZlID0gRkFMU0U7Ci0gICAgICAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkNhc2VTZW5zaXRpdmVDYmspCi0gICAgICAgICAgICAgICAgQ0FMTEJBQ0sobGVmQ2FsbGJhY2tzLT5DYXNlU2Vuc2l0aXZlQ2JrLCBsZWZyQ2FzZVNlbnNpdGl2ZUNia1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmRGF0YS0+bmFtZXNDYXNlU2Vuc2l0aXZlKTsKLSAgICAgICAgICAgICAgbGVmRGF0YS0+aGFzTmFtZUNhc2UgPSAxOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+Q2FzZVNlbnNpdGl2ZUNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmNhc2VTZW5zaXRpdmVXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkNhc2VTZW5zaXRpdmVXYXJuaW5ncykgewotICAgICAgICAgICAgICAgICAgbGVmRXJyb3IoMTUwNCwgIk5BTUVTQ0FTRVNFTlNJVElWRSBzdGF0ZW1lbnQgaXMgc2V0IHdpdGggT0ZGLlxuU3RhcnRpbmcgdmVyc2lvbiA1LjYsIE5BTUVTQ0FTRU5TSVRJVkUgaXMgb2Jzb2xldGUsXG5pZiBpdCBpcyBkZWZpbmVkLCBpdCBoYXMgdG8gaGF2ZSB0aGUgT04gdmFsdWUuXG5QYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIik7Ci0gICAgICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLXdpcmVleHRlbnNpb246IEtfTk9XSVJFRVhURU5TSU9OQVRQSU4gS19PTiAnOycKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNikgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5Ob1dpcmVFeHRlbnNpb25DYmspCi0gICAgICAgICAgQ0FMTEJBQ0sobGVmQ2FsbGJhY2tzLT5Ob1dpcmVFeHRlbnNpb25DYmssIGxlZnJOb1dpcmVFeHRlbnNpb25DYmtUeXBlLCAiT04iKTsKLSAgICAgIH0gZWxzZQotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5Ob1dpcmVFeHRlbnNpb25DYmspIC8vIHdyaXRlIHdhcm5pbmcgb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+bm9XaXJlRXh0ZW5zaW9uV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5Ob1dpcmVFeHRlbnNpb25XYXJuaW5ncykKLSAgICAgICAgICAgICBsZWZXYXJuaW5nKDIwMDgsICJOT1dJUkVFWFRFTlNJT05BVFBJTiBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjYgb3IgbGF0ZXIuXG5UaGUgTk9XSVJFRVhURU5TSU9OQVRQSU4gc3RhdGVtZW50IHdpbGwgYmUgaWdub3JlZC4iKTsKLSAgICB9Ci0gIHwgS19OT1dJUkVFWFRFTlNJT05BVFBJTiBLX09GRiAnOycKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNikgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5Ob1dpcmVFeHRlbnNpb25DYmspCi0gICAgICAgICAgQ0FMTEJBQ0sobGVmQ2FsbGJhY2tzLT5Ob1dpcmVFeHRlbnNpb25DYmssIGxlZnJOb1dpcmVFeHRlbnNpb25DYmtUeXBlLCAiT0ZGIik7Ci0gICAgICB9IGVsc2UKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+Tm9XaXJlRXh0ZW5zaW9uQ2JrKSAvLyB3cml0ZSB3YXJuaW5nIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPm5vV2lyZUV4dGVuc2lvbldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+Tm9XaXJlRXh0ZW5zaW9uV2FybmluZ3MpCi0gICAgICAgICAgICAgbGVmV2FybmluZygyMDA4LCAiTk9XSVJFRVhURU5TSU9OQVRQSU4gc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS42IG9yIGxhdGVyLlxuVGhlIE5PV0lSRUVYVEVOU0lPTkFUUElOIHN0YXRlbWVudCB3aWxsIGJlIGlnbm9yZWQuIik7Ci0gICAgfQotCi1maXhlZG1hc2s6IEtfRklYRURNQVNLICc7JwotICAgIHsgCi0gICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPj0gNS44KSB7Ci0gICAgICAgCi0gICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+Rml4ZWRNYXNrQ2JrKSB7Ci0gICAgICAgICAgICBsZWZEYXRhLT5sZWZGaXhlZE1hc2sgPSAxOwotICAgICAgICAgICAgQ0FMTEJBQ0sobGVmQ2FsbGJhY2tzLT5GaXhlZE1hc2tDYmssIGxlZnJGaXhlZE1hc2tDYmtUeXBlLCBsZWZEYXRhLT5sZWZGaXhlZE1hc2spOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICBsZWZEYXRhLT5oYXNGaXhlZE1hc2sgPSAxOwotICAgICAgIH0KLSAgICB9Ci0gICAgCi1tYW51ZmFjdHVyaW5nOiBLX01BTlVGQUNUVVJJTkdHUklEIGludF9udW1iZXIgJzsnCi0gICAgewotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TWFudWZhY3R1cmluZ0NiaykKLSAgICAgICAgQ0FMTEJBQ0sobGVmQ2FsbGJhY2tzLT5NYW51ZmFjdHVyaW5nQ2JrLCBsZWZyTWFudWZhY3R1cmluZ0Nia1R5cGUsICQyKTsKLSAgICAgIGxlZkRhdGEtPmhhc01hbnVmYWN0dXIgPSAxOwotICAgIH0KLQotdXNlbWluc3BhY2luZzogS19VU0VNSU5TUEFDSU5HIHNwYWNpbmdfdHlwZSBzcGFjaW5nX3ZhbHVlICc7JwotICB7Ci0gICAgaWYgKChzdHJjbXAoJDIsICJQSU4iKSA9PSAwKSAmJiAobGVmRGF0YS0+dmVyc2lvbk51bSA+PSA1LjYpKSB7Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5Vc2VNaW5TcGFjaW5nQ2JrKSAvLyB3cml0ZSB3YXJuaW5nIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgIGlmIChsZWZEYXRhLT51c2VNaW5TcGFjaW5nV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5Vc2VNaW5TcGFjaW5nV2FybmluZ3MpCi0gICAgICAgICAgICBsZWZXYXJuaW5nKDIwMDksICJVU0VNSU5TUEFDSU5HIFBJTiBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjYgb3IgbGF0ZXIuXG4gVGhlIFVTRU1JTlNQQUNJTkcgUElOIHN0YXRlbWVudCB3aWxsIGJlIGlnbm9yZWQuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+VXNlTWluU3BhY2luZ0NiaykgewotICAgICAgICAgIGxlZkRhdGEtPmxlZnJVc2VNaW5TcGFjaW5nLnNldCgkMiwgJDMpOwotICAgICAgICAgIENBTExCQUNLKGxlZkNhbGxiYWNrcy0+VXNlTWluU3BhY2luZ0NiaywgbGVmclVzZU1pblNwYWNpbmdDYmtUeXBlLAotICAgICAgICAgICAgICAgICAgICZsZWZEYXRhLT5sZWZyVXNlTWluU3BhY2luZyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLWNsZWFyYW5jZW1lYXN1cmU6IEtfQ0xFQVJBTkNFTUVBU1VSRSBjbGVhcmFuY2VfdHlwZSAnOycKLSAgICB7IENBTExCQUNLKGxlZkNhbGxiYWNrcy0+Q2xlYXJhbmNlTWVhc3VyZUNiaywgbGVmckNsZWFyYW5jZU1lYXN1cmVDYmtUeXBlLCAkMik7IH0KLQotY2xlYXJhbmNlX3R5cGU6Ci0gIEtfTUFYWFkgICB7JCQgPSAoY2hhciopIk1BWFhZIjt9Ci0gIHwgS19FVUNMSURFQU4gICB7JCQgPSAoY2hhciopIkVVQ0xJREVBTiI7fQotCi1zcGFjaW5nX3R5cGU6Ci0gIEtfT0JTICAgICB7JCQgPSAoY2hhciopIk9CUyI7fQotICB8IEtfUElOICAgeyQkID0gKGNoYXIqKSJQSU4iO30KLQotc3BhY2luZ192YWx1ZToKLSAgS19PTiAgICAgIHskJCA9IDE7fQotICB8IEtfT0ZGICAgeyQkID0gMDt9Ci0KLXVuaXRzX3NlY3Rpb246IHN0YXJ0X3VuaXRzIHVuaXRzX3J1bGVzIEtfRU5EIEtfVU5JVFMKLSAgICB7IAotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+VW5pdHNDYmspCi0gICAgICAgIENBTExCQUNLKGxlZkNhbGxiYWNrcy0+VW5pdHNDYmssIGxlZnJVbml0c0Nia1R5cGUsICZsZWZEYXRhLT5sZWZyVW5pdHMpOwotICAgIH0KLQotc3RhcnRfdW5pdHM6IEtfVU5JVFMKLSAgICB7Ci0gICAgICBsZWZEYXRhLT5sZWZyVW5pdHMuY2xlYXIoKTsKLSAgICAgIGlmIChsZWZEYXRhLT5oYXNNYW51ZmFjdHVyKSB7Ci0gICAgICAgIGlmIChsZWZEYXRhLT51bml0c1dhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+VW5pdHNXYXJuaW5ncykgewotICAgICAgICAgIGxlZkVycm9yKDE1MDUsICJNQU5VRkFDVFVSSU5HR1JJRCBzdGF0ZW1lbnQgd2FzIGRlZmluZWQgYmVmb3JlIFVOSVRTLlxuUmVmZXIgdGhlIExFRiBMYW5ndWFnZSBSZWZlcmVuY2UgbWFudWFsIGZvciB0aGUgb3JkZXIgb2YgTEVGIHN0YXRlbWVudHMuIik7Ci0gICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChsZWZEYXRhLT5oYXNNaW5mZWF0dXJlKSB7Ci0gICAgICAgIGlmIChsZWZEYXRhLT51bml0c1dhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+VW5pdHNXYXJuaW5ncykgewotICAgICAgICAgIGxlZkVycm9yKDE3MTIsICJNSU5GRUFUVVJFIHN0YXRlbWVudCB3YXMgZGVmaW5lZCBiZWZvcmUgVU5JVFMuXG5SZWZlciB0aGUgTEVGIExhbmd1YWdlIFJlZmVyZW5jZSBtYW51YWwgZm9yIHRoZSBvcmRlciBvZiBMRUYgc3RhdGVtZW50cy4iKTsKLSAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjYpIHsKLSAgICAgICAgaWYgKGxlZkRhdGEtPmhhc1NpdGUpIHsvL1NJVEUgaXMgZGVmaW5lZCBiZWZvcmUgVU5JVCBhbmQgaXMgaWxsZWdhbCBpbiBwcmUgNS42Ci0gICAgICAgICAgbGVmRXJyb3IoMTcxMywgIlNJVEUgc3RhdGVtZW50IHdhcyBkZWZpbmVkIGJlZm9yZSBVTklUUy5cblJlZmVyIHRoZSBMRUYgTGFuZ3VhZ2UgUmVmZXJlbmNlIG1hbnVhbCBmb3IgdGhlIG9yZGVyIG9mIExFRiBzdGF0ZW1lbnRzLiIpOwotICAgICAgICAgIENIS0VSUigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi11bml0c19ydWxlczogCi0gIHwgdW5pdHNfcnVsZXMgdW5pdHNfcnVsZQotICA7Ci0KLXVuaXRzX3J1bGU6IEtfVElNRSBLX05BTk9TRUNPTkRTIGludF9udW1iZXIgJzsnCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5Vbml0c0NiaykgbGVmRGF0YS0+bGVmclVuaXRzLnNldFRpbWUoJDMpOyB9Ci0gIHwgS19DQVBBQ0lUQU5DRSBLX1BJQ09GQVJBRFMgaW50X251bWJlciAnOycKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPlVuaXRzQ2JrKSBsZWZEYXRhLT5sZWZyVW5pdHMuc2V0Q2FwYWNpdGFuY2UoJDMpOyB9Ci0gIHwgS19SRVNJU1RBTkNFIEtfT0hNUyBpbnRfbnVtYmVyICc7JwotICAgIHsgaWYgKGxlZkNhbGxiYWNrcy0+VW5pdHNDYmspIGxlZkRhdGEtPmxlZnJVbml0cy5zZXRSZXNpc3RhbmNlKCQzKTsgfQotICB8IEtfUE9XRVIgS19NSUxMSVdBVFRTIGludF9udW1iZXIgJzsnCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5Vbml0c0NiaykgbGVmRGF0YS0+bGVmclVuaXRzLnNldFBvd2VyKCQzKTsgfQotICB8IEtfQ1VSUkVOVCBLX01JTExJQU1QUyBpbnRfbnVtYmVyICc7JwotICAgIHsgaWYgKGxlZkNhbGxiYWNrcy0+VW5pdHNDYmspIGxlZkRhdGEtPmxlZnJVbml0cy5zZXRDdXJyZW50KCQzKTsgfQotICB8IEtfVk9MVEFHRSBLX1ZPTFRTIGludF9udW1iZXIgJzsnCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5Vbml0c0NiaykgbGVmRGF0YS0+bGVmclVuaXRzLnNldFZvbHRhZ2UoJDMpOyB9Ci0gIHwgS19EQVRBQkFTRSBLX01JQ1JPTlMgaW50X251bWJlciAnOycKLSAgICB7IAotICAgICAgaWYodmFsaWROdW0oKGludCkkMykpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlVuaXRzQ2JrKQotICAgICAgICAgICAgbGVmRGF0YS0+bGVmclVuaXRzLnNldERhdGFiYXNlKCJNSUNST05TIiwgJDMpOwotICAgICAgfQotICAgIH0KLSAgfCBLX0ZSRVFVRU5DWSBLX01FR0FIRVJUWiBOVU1CRVIgJzsnCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5Vbml0c0NiaykgbGVmRGF0YS0+bGVmclVuaXRzLnNldEZyZXF1ZW5jeSgkMyk7IH0KLQotbGF5ZXJfcnVsZTogc3RhcnRfbGF5ZXIgCi0gICAgbGF5ZXJfb3B0aW9ucyBlbmRfbGF5ZXIKLSAgICB7IAotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspCi0gICAgICAgIENBTExCQUNLKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmssIGxlZnJMYXllckNia1R5cGUsICZsZWZEYXRhLT5sZWZyTGF5ZXIpOwotICAgIH0KLQotc3RhcnRfbGF5ZXI6IEtfTEFZRVIge2xlZkRhdGEtPmxlZkR1bWJNb2RlID0gMTsgbGVmRGF0YS0+bGVmTm9OdW0gPSAxOyB9IFRfU1RSSU5HCi0gICAgeyAKLSAgICAgIGlmIChsZWZEYXRhLT5sZWZySGFzTWF4VlMpIHsgICAvLyA1LjUgCi0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgIGxlZkVycm9yKDE1MDYsICJBIE1BWFZJQVNUQUNLIHN0YXRlbWVudCBpcyBkZWZpbmVkIGJlZm9yZSB0aGUgTEFZRVIgc3RhdGVtZW50LlxuUmVmZXIgdG8gdGhlIExFRiBMYW5ndWFnZSBSZWZlcmVuY2UgbWFudWFsIGZvciB0aGUgb3JkZXIgb2YgTEVGIHN0YXRlbWVudHMuIik7Ci0gICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKQotICAgICAgICBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0TmFtZSgkMyk7Ci0gICAgICBsZWZEYXRhLT51c2VMZW5UaHIgPSAwOwotICAgICAgbGVmRGF0YS0+bGF5ZXJDdXQgPSAwOwotICAgICAgbGVmRGF0YS0+bGF5ZXJNYXN0T3ZlciA9IDA7Ci0gICAgICBsZWZEYXRhLT5sYXllclJvdXQgPSAwOwotICAgICAgbGVmRGF0YS0+bGF5ZXJEaXIgPSAwOwotICAgICAgbGVmRGF0YS0+bGVmckhhc0xheWVyID0gMTsKLSAgICAgIC8vc3RyY3B5KGxlZkRhdGEtPmxheWVyTmFtZSwgJDMpOwotICAgICAgbGVmRGF0YS0+bGF5ZXJOYW1lID0gc3RyZHVwKCQzKTsKLSAgICAgIGxlZkRhdGEtPmhhc1R5cGUgPSAwOwotICAgICAgbGVmRGF0YS0+aGFzTWFzayA9IDA7Ci0gICAgICBsZWZEYXRhLT5oYXNQaXRjaCA9IDA7Ci0gICAgICBsZWZEYXRhLT5oYXNXaWR0aCA9IDA7Ci0gICAgICBsZWZEYXRhLT5oYXNEaXJlY3Rpb24gPSAwOwotICAgICAgbGVmRGF0YS0+aGFzUGFyYWxsZWwgPSAwOwotICAgICAgbGVmRGF0YS0+aGFzSW5mbHVlbmNlID0gMDsKLSAgICAgIGxlZkRhdGEtPmhhc1R3b1dpZHRocyA9IDA7Ci0gICAgICBsZWZEYXRhLT5sZWZySGFzU3BhY2luZ1RibCA9IDA7Ci0gICAgICBsZWZEYXRhLT5sZWZySGFzU3BhY2luZyA9IDA7Ci0gICAgfQotCi1lbmRfbGF5ZXI6IEtfRU5EIHtsZWZEYXRhLT5sZWZEdW1iTW9kZSA9IDE7IGxlZkRhdGEtPmxlZk5vTnVtID0gMTsgfSBUX1NUUklORwotICAgIHsgCi0gICAgICBpZiAoc3RyY21wKGxlZkRhdGEtPmxheWVyTmFtZSwgJDMpICE9IDApIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgIGlmIChsZWZEYXRhLT5sYXllcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TGF5ZXJXYXJuaW5ncykgewotICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAiRU5EIExBWUVSIG5hbWUgJXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIExBWUVSIG5hbWUgJXMuXG5Db3JyZWN0IHRoZSBMRUYgZmlsZSBiZWZvcmUgcmVydW5uaW5nIGl0IHRocm91Z2ggdGhlIExFRiBwYXJzZXIuIiwgJDMsIGxlZkRhdGEtPmxheWVyTmFtZSk7Ci0gICAgICAgICAgICAgbGVmRXJyb3IoMTUwNywgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5sYXllck5hbWUpOwotICAgICAgICAgICAgIENIS0VSUigpOyAKLSAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPmxheWVyTmFtZSk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+bGF5ZXJOYW1lKTsKLSAgICAgIH0gZWxzZQotICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPmxheWVyTmFtZSk7Ci0gICAgICBpZiAoIWxlZlNldHRpbmdzLT5SZWxheE1vZGUpIHsKLSAgICAgICAgaWYgKGxlZkRhdGEtPmhhc1R5cGUgPT0gMCkgewotICAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5sYXllcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TGF5ZXJXYXJuaW5ncykgewotICAgICAgICAgICAgICAgbGVmRXJyb3IoMTUwOCwgIlRZUEUgc3RhdGVtZW50IGlzIGEgcmVxdWlyZWQgc3RhdGVtZW50IGluIGEgTEFZRVIgYW5kIGl0IGlzIG5vdCBkZWZpbmVkLiIpOwotICAgICAgICAgICAgICAgQ0hLRVJSKCk7IAotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoKGxlZkRhdGEtPmxheWVyUm91dCA9PSAxKSAmJiAobGVmRGF0YS0+aGFzUGl0Y2ggPT0gMCkpIHsKLSAgICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTUwOSwgIlBJVENIIHN0YXRlbWVudCBpcyBhIHJlcXVpcmVkIHN0YXRlbWVudCBpbiBhIExBWUVSIHdpdGggdHlwZSBST1VUSU5HIGFuZCBpdCBpcyBub3QgZGVmaW5lZC4iKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7IAotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoKGxlZkRhdGEtPmxheWVyUm91dCA9PSAxKSAmJiAobGVmRGF0YS0+aGFzV2lkdGggPT0gMCkpIHsKLSAgICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTUxMCwgIldJRFRIIHN0YXRlbWVudCBpcyBhIHJlcXVpcmVkIHN0YXRlbWVudCBpbiBhIExBWUVSIHdpdGggdHlwZSBST1VUSU5HIGFuZCBpdCBpcyBub3QgZGVmaW5lZC4iKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7IAotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoKGxlZkRhdGEtPmxheWVyUm91dCA9PSAxKSAmJiAobGVmRGF0YS0+aGFzRGlyZWN0aW9uID09IDApKSB7Ci0gICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csICJUaGUgRElSRUNUSU9OIHN0YXRlbWVudCB3aGljaCBpcyByZXF1aXJlZCBpbiBhIExBWUVSIHdpdGggVFlQRSBST1VUSU5HIGlzIG5vdCBkZWZpbmVkIGluIExBWUVSICVzLlxuVXBkYXRlIHlvdXIgbGVmIGZpbGUgYW5kIGFkZCB0aGUgRElSRUNUSU9OIHN0YXRlbWVudCBmb3IgbGF5ZXIgJXMuIiwgJDMsICQzKTsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTUxMSwgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi1sYXllcl9vcHRpb25zOgotICAgIHsgfQotICB8IGxheWVyX29wdGlvbnMgbGF5ZXJfb3B0aW9uICAgIC8vIFVzZSBsZWZ0IHJlY3Vyc2lvbnMgCi0gICAgeyB9Ci0KLWxheWVyX29wdGlvbjoKLSAgS19BUlJBWVNQQUNJTkcgICAgICAgICAgICAgICAgICAgLy8gNS43IAotICAgIHsKLSAgICAgICAvLyBsZXQgc2V0QXJyYXlTcGFjaW5nQ3V0U3BhY2luZyB0byBzZXQgdGhlIGRhdGEgCi0gICAgfQotICAgIGxheWVyX2FycmF5U3BhY2luZ19sb25nCi0gICAgbGF5ZXJfYXJyYXlTcGFjaW5nX3dpZHRoCi0gICAgS19DVVRTUEFDSU5HIGludF9udW1iZXIKLSAgICB7Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgewotICAgICAgICAgbGVmRGF0YS0+bGVmckxheWVyLnNldEFycmF5U3BhY2luZ0N1dCgkNik7Ci0gICAgICAgICBsZWZEYXRhLT5hcnJheUN1dHNWYWwgPSAwOwotICAgICAgfQotICAgIH0KLSAgICBsYXllcl9hcnJheVNwYWNpbmdfYXJyYXljdXRzICc7JwotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS43KSB7Ci0gICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgIHNwcmludGYobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAiQVJSQVlTUEFDSU5HIGlzIGEgdmVyc2lvbiA1Ljcgb3IgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgIGxlZkVycm9yKDE2ODUsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICBDSEtFUlIoKTsKLSAgICAgIH0KLSAgICB9Ci0gIHwgS19UWVBFIGxheWVyX3R5cGUgJzsnCi0gICAgewotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspCi0gICAgICAgICBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0VHlwZSgkMik7Ci0gICAgICBsZWZEYXRhLT5oYXNUeXBlID0gMTsKLSAgICB9Ci0gIHwgS19NQVNLIGludF9udW1iZXIgJzsnCi0gICAgewotICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjgpIHsKLSAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPlZpYVdhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDIwODEsICJNQVNLIGluZm9ybWF0aW9uIGNhbiBvbmx5IGJlIGRlZmluZWQgd2l0aCB2ZXJzaW9uIDUuOCIpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsgCi0gICAgICAgICAgfSAgICAgICAgICAgCi0gICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7Ci0gICAgICAgICAgICBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0TWFzaygoaW50KSQyKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgbGVmRGF0YS0+aGFzTWFzayA9IDE7Ci0gICAgICB9Ci0gICAgfQotICB8IEtfUElUQ0ggaW50X251bWJlciAnOycKLSAgICB7IAotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIGxlZkRhdGEtPmxlZnJMYXllci5zZXRQaXRjaCgkMik7Ci0gICAgICBsZWZEYXRhLT5oYXNQaXRjaCA9IDE7ICAKLSAgICB9Ci0gIHwgS19QSVRDSCBpbnRfbnVtYmVyIGludF9udW1iZXIgJzsnCi0gICAgeyAKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0UGl0Y2hYWSgkMiwgJDMpOwotICAgICAgbGVmRGF0YS0+aGFzUGl0Y2ggPSAxOyAgCi0gICAgfQotICB8IEtfRElBR1BJVENIIGludF9udW1iZXIgJzsnCi0gICAgeyAKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0RGlhZ1BpdGNoKCQyKTsKLSAgICB9Ci0gIHwgS19ESUFHUElUQ0ggaW50X251bWJlciBpbnRfbnVtYmVyICc7JwotICAgIHsgCi0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgbGVmRGF0YS0+bGVmckxheWVyLnNldERpYWdQaXRjaFhZKCQyLCAkMyk7Ci0gICAgfQotICB8IEtfT0ZGU0VUIGludF9udW1iZXIgJzsnCi0gICAgewotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIGxlZkRhdGEtPmxlZnJMYXllci5zZXRPZmZzZXQoJDIpOwotICAgIH0KLSAgfCBLX09GRlNFVCBpbnRfbnVtYmVyIGludF9udW1iZXIgJzsnCi0gICAgewotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIGxlZkRhdGEtPmxlZnJMYXllci5zZXRPZmZzZXRYWSgkMiwgJDMpOwotICAgIH0KLSAgfCBLX0RJQUdXSURUSCBpbnRfbnVtYmVyICc7JwotICAgIHsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0RGlhZ1dpZHRoKCQyKTsKLSAgICB9Ci0gIHwgS19ESUFHU1BBQ0lORyBpbnRfbnVtYmVyICc7JwotICAgIHsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0RGlhZ1NwYWNpbmcoJDIpOwotICAgIH0KLSAgfCBLX1dJRFRIIGludF9udW1iZXIgJzsnICAgIC8vIENVVCAmIFJPVVRJTkcKLSAgICB7Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgbGVmRGF0YS0+bGVmckxheWVyLnNldFdpZHRoKCQyKTsKLSAgICAgIGxlZkRhdGEtPmhhc1dpZHRoID0gMTsgIAotICAgIH0KLSAgfCBLX0FSRUEgTlVNQkVSICc7JwotICAgIHsKLSAgICAgIC8vIElzc3VlIGFuIGVycm9yIGlzIHRoaXMgaXMgZGVmaW5lZCBpbiBtYXN0ZXJzbGljZQotICAgICAgaWYgKGxlZkRhdGEtPmxheWVyTWFzdE92ZXIpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICBsZWZFcnJvcigxNzE1LCAiSXQgaXMgaW5jb3JyZWN0IHRvIGRlZmluZSBhbiBBUkVBIHN0YXRlbWVudCBpbiBMQVlFUiB3aXRoIFRZUEUgTUFTVEVSU0xJQ0Ugb3IgT1ZFUkxBUC4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIpOwotICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7Ci0gICAgICAgICBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0QXJlYSgkMik7Ci0gICAgICB9Ci0gICAgfQotICB8IEtfU1BBQ0lORyBpbnRfbnVtYmVyCi0gICAgewotICAgICAgbGVmRGF0YS0+aGFzU3BDZW50ZXIgPSAwOyAgICAgICAvLyByZXNldCB0byAwLCBvbmx5IG9uY2UgcGVyIHNwYWNpbmcgaXMgYWxsb3dlZCAKLSAgICAgIGxlZkRhdGEtPmhhc1NwU2FtZW5ldCA9IDA7Ci0gICAgICBsZWZEYXRhLT5oYXNTcFBhcmFsbGVsID0gMDsKLSAgICAgIGxlZkRhdGEtPmhhc1NwTGF5ZXIgPSAwOwotICAgICAgbGVmRGF0YS0+bGF5ZXJDdXRTcGFjaW5nID0gJDI7ICAvLyBmb3IgZXJyb3IgbWVzc2FnZSBwdXJwb3NlCi0gICAgICAvLyAxMS8yMi85OSAtIFdhbmRhIGRhIFJvc2EsIFBDUiAyODM3NjIKLSAgICAgIC8vICAgICAgICAgICAgSXNzdWUgYW4gZXJyb3IgaXMgdGhpcyBpcyBkZWZpbmVkIGluIG1hc3RlcnNsaWNlCi0gICAgICBpZiAobGVmRGF0YS0+bGF5ZXJNYXN0T3ZlcikgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE1MTIsICJJdCBpcyBpbmNvcnJlY3QgdG8gZGVmaW5lIGEgU1BBQ0lORyBzdGF0ZW1lbnQgaW4gTEFZRVIgd2l0aCBUWVBFIE1BU1RFUlNMSUNFIG9yIE9WRVJMQVAuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyA1LjUgZWl0aGVyIFNQQUNJTkcgb3IgU1BBQ0lOR1RBQkxFLCBub3QgYm90aCBmb3Igcm91dGluZyBsYXllciBvbmx5Ci0gICAgICBpZiAobGVmRGF0YS0+bGF5ZXJSb3V0KSB7Ci0gICAgICAgIGlmIChsZWZEYXRhLT5sZWZySGFzU3BhY2luZ1RibCAmJiBsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS43KSB7Ci0gICAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICAgbGVmV2FybmluZygyMDEwLCAiSXQgaXMgaW5jb3JyZWN0IHRvIGhhdmUgYm90aCBTUEFDSU5HIHJ1bGVzICYgU1BBQ0lOR1RBQkxFIHJ1bGVzIHdpdGhpbiBhIFJPVVRJTkcgbGF5ZXIiKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspCi0gICAgICAgICAgIGxlZkRhdGEtPmxlZnJMYXllci5zZXRTcGFjaW5nTWluKCQyKTsKLSAgICAgICAgbGVmRGF0YS0+bGVmckhhc1NwYWNpbmcgPSAxOwotICAgICAgfSBlbHNlIHsgCi0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKQotICAgICAgICAgICBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0U3BhY2luZ01pbigkMik7Ci0gICAgICB9Ci0gICAgfQotICAgIGxheWVyX3NwYWNpbmdfb3B0cwotICAgIGxheWVyX3NwYWNpbmdfY3V0X3JvdXRpbmcgJzsnIHt9Ci0gIHwgS19TUEFDSU5HVEFCTEUgS19PUlRIT0dPTkFMIEtfV0lUSElOIGludF9udW1iZXIgS19TUEFDSU5HIGludF9udW1iZXIgICAvLyA1LjcgCi0gICAgewotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspCi0gICAgICAgICBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0U3BhY2luZ1RhYmxlT3J0aG8oKTsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSAvLyBkdWUgdG8gY29udmVydGluZyB0byBDLCBlbHNlLCBjb252ZXJ0b3IgcHJvZHVjZSAKLSAgICAgICAgIGxlZkRhdGEtPmxlZnJMYXllci5hZGRTcGFjaW5nVGFibGVPcnRob1dpdGhpbigkNCwgJDYpOy8vYmFkIGNvZGUKLSAgICB9Ci0gICAgbGF5ZXJfc3BhY2luZ3RhYmxlX29wdHMgJzsnCi0gICAgewotICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjcpIHsKLSAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgc3ByaW50ZihsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICJTUEFDSU5HVEFCTEUgT1JUSE9HT05BTCBpcyBhIHZlcnNpb24gNS43IG9yIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICBsZWZFcnJvcigxNjk0LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICB9Ci0gICAgfQotICB8IEtfRElSRUNUSU9OIGxheWVyX2RpcmVjdGlvbiAnOycKLSAgICB7Ci0gICAgICBsZWZEYXRhLT5sYXllckRpciA9IDE7Ci0gICAgICBpZiAoIWxlZkRhdGEtPmxheWVyUm91dCkgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE1MTMsICJESVJFQ1RJT04gc3RhdGVtZW50IGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgbGVmRGF0YS0+bGVmckxheWVyLnNldERpcmVjdGlvbigkMik7Ci0gICAgICBsZWZEYXRhLT5oYXNEaXJlY3Rpb24gPSAxOyAgCi0gICAgfQotICB8IEtfUkVTSVNUQU5DRSBLX1JQRVJTUSBpbnRfbnVtYmVyICc7JwotICAgIHsKLSAgICAgIGlmICghbGVmRGF0YS0+bGF5ZXJSb3V0KSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTUxNCwgIlJFU0lTVEFOQ0Ugc3RhdGVtZW50IGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgbGVmRGF0YS0+bGVmckxheWVyLnNldFJlc2lzdGFuY2UoJDMpOwotICAgIH0KLSAgfCBLX1JFU0lTVEFOQ0UgS19SUEVSU1EgS19QV0wgJygnIHJlc19wb2ludHMgJyknICc7JwotICAgIHsKLSAgICAgIGlmICghbGVmRGF0YS0+bGF5ZXJSb3V0KSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTUxNSwgIlJFU0lTVEFOQ0Ugc3RhdGVtZW50IGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB8IEtfQ0FQQUNJVEFOQ0UgS19DUEVSU1FESVNUIGludF9udW1iZXIgJzsnCi0gICAgewotICAgICAgaWYgKCFsZWZEYXRhLT5sYXllclJvdXQpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5sYXllcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TGF5ZXJXYXJuaW5ncykgewotICAgICAgICAgICAgICBsZWZFcnJvcigxNTE2LCAiQ0FQQUNJVEFOQ0Ugc3RhdGVtZW50IGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgbGVmRGF0YS0+bGVmckxheWVyLnNldENhcGFjaXRhbmNlKCQzKTsKLSAgICB9Ci0gIHwgS19DQVBBQ0lUQU5DRSBLX0NQRVJTUURJU1QgS19QV0wgJygnIGNhcF9wb2ludHMgJyknICc7JwotICAgIHsKLSAgICAgIGlmICghbGVmRGF0YS0+bGF5ZXJSb3V0KSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTUxNywgIkNBUEFDSVRBTkNFIHN0YXRlbWVudCBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HLiBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIik7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfCBLX0hFSUdIVCBpbnRfbnVtYmVyICc7JwotICAgIHsKLSAgICAgIGlmICghbGVmRGF0YS0+bGF5ZXJSb3V0KSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTUxOCwgIkhFSUdIVCBzdGF0ZW1lbnQgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgUk9VVElORy4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0SGVpZ2h0KCQyKTsKLSAgICB9Ci0gIHwgS19XSVJFRVhURU5TSU9OIGludF9udW1iZXIgJzsnCi0gICAgewotICAgICAgaWYgKCFsZWZEYXRhLT5sYXllclJvdXQpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5sYXllcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TGF5ZXJXYXJuaW5ncykgewotICAgICAgICAgICAgICBsZWZFcnJvcigxNTE5LCAiV0lSRUVYVEVOU0lPTiBzdGF0ZW1lbnQgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgUk9VVElORy4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0V2lyZUV4dGVuc2lvbigkMik7Ci0gICAgfQotICB8IEtfVEhJQ0tORVNTIGludF9udW1iZXIgJzsnCi0gICAgewotICAgICAgaWYgKCFsZWZEYXRhLT5sYXllclJvdXQgJiYgKGxlZkRhdGEtPmxheWVyQ3V0IHx8IGxlZkRhdGEtPmxheWVyTWFzdE92ZXIpKSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTUyMCwgIlRISUNLTkVTUyBzdGF0ZW1lbnQgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgUk9VVElORy4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0VGhpY2tuZXNzKCQyKTsKLSAgICB9Ci0gIHwgS19TSFJJTktBR0UgaW50X251bWJlciAnOycKLSAgICB7Ci0gICAgICBpZiAoIWxlZkRhdGEtPmxheWVyUm91dCkgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE1MjEsICJTSFJJTktBR0Ugc3RhdGVtZW50IGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgbGVmRGF0YS0+bGVmckxheWVyLnNldFNocmlua2FnZSgkMik7Ci0gICAgfQotICB8IEtfQ0FQTVVMVElQTElFUiBpbnRfbnVtYmVyICc7JwotICAgIHsKLSAgICAgIGlmICghbGVmRGF0YS0+bGF5ZXJSb3V0KSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTUyMiwgIkNBUE1VTFRJUExJRVIgc3RhdGVtZW50IGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgbGVmRGF0YS0+bGVmckxheWVyLnNldENhcE11bHRpcGxpZXIoJDIpOwotICAgIH0KLSAgfCBLX0VER0VDQVBBQ0lUQU5DRSBpbnRfbnVtYmVyICc7JwotICAgIHsKLSAgICAgIGlmICghbGVmRGF0YS0+bGF5ZXJSb3V0KSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTUyMywgIkVER0VDQVBBQ0lUQU5DRSBzdGF0ZW1lbnQgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgUk9VVElORy4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0RWRnZUNhcCgkMik7Ci0gICAgfQotCi0gIHwgS19BTlRFTk5BTEVOR1RIRkFDVE9SIGludF9udW1iZXIgJzsnCi0gICAgeyAvLyA1LjMgc3ludGF4IAotICAgICAgbGVmRGF0YS0+dXNlNV8zID0gMTsKLSAgICAgIGlmICghbGVmRGF0YS0+bGF5ZXJSb3V0ICYmIChsZWZEYXRhLT5sYXllckN1dCB8fCBsZWZEYXRhLT5sYXllck1hc3RPdmVyKSkgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE1MjUsICJBTlRFTk5BTEVOR1RIRkFDVE9SIHN0YXRlbWVudCBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HLiBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIik7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtID49IDUuNCkgewotICAgICAgICAgaWYgKGxlZkRhdGEtPnVzZTVfNCkgewotICAgICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgICAgIkFOVEVOTkFMRU5HVEhGQUNUT1Igc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjMgb3IgZWFybGllciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIHdpdGggdmVyc2lvbiAlZywgaGFzIGJvdGggb2xkIGFuZCBuZXcgQU5URU5OQUxFTkdUSEZBQ1RPUiBzeW50YXgsIHdoaWNoIGlzIGluY29ycmVjdC4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgICAgIGxlZkVycm9yKDE1MjYsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIGxlZkRhdGEtPmxlZnJMYXllci5zZXRBbnRlbm5hTGVuZ3RoKCQyKTsKLSAgICB9Ci0gIHwgS19DVVJSRU5UREVOIGludF9udW1iZXIgJzsnCi0gICAgewotICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjIpIHsKLSAgICAgICAgIGlmICghbGVmRGF0YS0+bGF5ZXJSb3V0KSB7Ci0gICAgICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgICAgbGVmRXJyb3IoMTcwMiwgIkNVUlJFTlRERU4gc3RhdGVtZW50IGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iKTsKLSAgICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgbGVmRGF0YS0+bGVmckxheWVyLnNldEN1cnJlbnREZW5zaXR5KCQyKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgIGxlZldhcm5pbmcoMjA3OSwgIkNVUlJFTlRERU4gc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS4yIGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS4yIG9yIGxhdGVyLiIpOwotICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB8IEtfQ1VSUkVOVERFTiBLX1BXTCAnKCcgY3VycmVudF9kZW5zaXR5X3B3bF9saXN0ICcpJyAnOycKLSAgICB7IAotICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjIpIHsKLSAgICAgICAgIGlmICghbGVmRGF0YS0+bGF5ZXJSb3V0KSB7Ci0gICAgICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgICAgbGVmRXJyb3IoMTcwMiwgIkNVUlJFTlRERU4gc3RhdGVtZW50IGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iKTsKLSAgICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICBsZWZXYXJuaW5nKDIwNzksICJDVVJSRU5UREVOIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuMiBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuMiBvciBsYXRlci4iKTsKLSAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfCBLX0NVUlJFTlRERU4gJygnIGludF9udW1iZXIgaW50X251bWJlciAnKScgJzsnCi0gICAgewotICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjIpIHsKLSAgICAgICAgIGlmICghbGVmRGF0YS0+bGF5ZXJSb3V0KSB7Ci0gICAgICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgICAgbGVmRXJyb3IoMTcwMiwgIkNVUlJFTlRERU4gc3RhdGVtZW50IGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iKTsKLSAgICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgbGVmRGF0YS0+bGVmckxheWVyLnNldEN1cnJlbnRQb2ludCgkMywgJDQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgIGlmIChsZWZEYXRhLT5sYXllcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TGF5ZXJXYXJuaW5ncykgewotICAgICAgICAgICAgbGVmV2FybmluZygyMDc5LCAiQ1VSUkVOVERFTiBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjIgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjIgb3IgbGF0ZXIuIik7Ci0gICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIHwgS19QUk9QRVJUWSB7IGxlZkRhdGEtPmxlZkR1bWJNb2RlID0gMTAwMDAwMDA7fSBsYXllcl9wcm9wX2xpc3QgJzsnCi0gICAgewotICAgICAgbGVmRGF0YS0+bGVmRHVtYk1vZGUgPSAwOwotICAgIH0KLSAgfCBLX0FDQ1VSUkVOVERFTlNJVFkgbGF5ZXJfdGFibGVfdHlwZQotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT5sYXllck1hc3RPdmVyKSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTUyNywgIkFDQ1VSUkVOVERFTlNJVFkgc3RhdGVtZW50IGNhbid0IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIE1BU1RFUlNMSUNFIG9yIE9WRVJMQVAuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgbGVmRGF0YS0+bGVmckxheWVyLmFkZEFjY3VycmVudERlbnNpdHkoJDIpOyAgICAgIAotICAgIH0KLSAgICBsYXllcl9mcmVxdWVuY3kgewotCi0gICAgfQotICB8IEtfQUNDVVJSRU5UREVOU0lUWSBsYXllcl90YWJsZV90eXBlIGludF9udW1iZXIgJzsnCi0gICAgewotICAgICAgaWYgKGxlZkRhdGEtPmxheWVyTWFzdE92ZXIpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5sYXllcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TGF5ZXJXYXJuaW5ncykgewotICAgICAgICAgICAgICBsZWZFcnJvcigxNTI3LCAiQUNDVVJSRU5UREVOU0lUWSBzdGF0ZW1lbnQgY2FuJ3QgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgTUFTVEVSU0xJQ0Ugb3IgT1ZFUkxBUC4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7Ci0gICAgICAgICAgIGxlZkRhdGEtPmxlZnJMYXllci5hZGRBY2N1cnJlbnREZW5zaXR5KCQyKTsKLSAgICAgICAgICAgbGVmRGF0YS0+bGVmckxheWVyLnNldEFjT25lRW50cnkoJDMpOwotICAgICAgfQotICAgIH0KLSAgfCBLX0RDQ1VSUkVOVERFTlNJVFkgS19BVkVSQUdFIGludF9udW1iZXIgJzsnCi0gICAgewotICAgICAgaWYgKGxlZkRhdGEtPmxheWVyTWFzdE92ZXIpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5sYXllcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TGF5ZXJXYXJuaW5ncykgewotICAgICAgICAgICAgICBsZWZFcnJvcigxNTI4LCAiRENDVVJSRU5UREVOU0lUWSBzdGF0ZW1lbnQgY2FuJ3QgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgTUFTVEVSU0xJQ0Ugb3IgT1ZFUkxBUC4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7Ci0gICAgICAgICBsZWZEYXRhLT5sZWZyTGF5ZXIuYWRkRGNjdXJyZW50RGVuc2l0eSgiQVZFUkFHRSIpOwotICAgICAgICAgbGVmRGF0YS0+bGVmckxheWVyLnNldERjT25lRW50cnkoJDMpOwotICAgICAgfQotICAgIH0KLSAgfCBLX0RDQ1VSUkVOVERFTlNJVFkgS19BVkVSQUdFIEtfQ1VUQVJFQSBOVU1CRVIKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+bGF5ZXJNYXN0T3ZlcikgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE1MjgsICJEQ0NVUlJFTlRERU5TSVRZIHN0YXRlbWVudCBjYW4ndCBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBNQVNURVJTTElDRSBvciBPVkVSTEFQLiBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIik7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKCFsZWZEYXRhLT5sYXllckN1dCkgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE1MjksICJDVVRBUkVBIHN0YXRlbWVudCBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggdHlwZSBDVVQuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgewotICAgICAgICAgbGVmRGF0YS0+bGVmckxheWVyLmFkZERjY3VycmVudERlbnNpdHkoIkFWRVJBR0UiKTsKLSAgICAgICAgIGxlZkRhdGEtPmxlZnJMYXllci5hZGROdW1iZXIoJDQpOwotICAgICAgfQotICAgIH0KLSAgICBudW1iZXJfbGlzdCAnOycKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSBsZWZEYXRhLT5sZWZyTGF5ZXIuYWRkRGNDdXRhcmVhKCk7IH0KLSAgICBkY19sYXllcl90YWJsZSB7fQotICB8IEtfRENDVVJSRU5UREVOU0lUWSBLX0FWRVJBR0UgS19XSURUSCBpbnRfbnVtYmVyCi0gICAgewotICAgICAgaWYgKGxlZkRhdGEtPmxheWVyTWFzdE92ZXIpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5sYXllcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TGF5ZXJXYXJuaW5ncykgewotICAgICAgICAgICAgICBsZWZFcnJvcigxNTI4LCAiRENDVVJSRU5UREVOU0lUWSBjYW4ndCBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBNQVNURVJTTElDRSBvciBPVkVSTEFQLiBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIik7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKCFsZWZEYXRhLT5sYXllclJvdXQpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5sYXllcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TGF5ZXJXYXJuaW5ncykgewotICAgICAgICAgICAgICBsZWZFcnJvcigxNTMwLCAiV0lEVEggc3RhdGVtZW50IGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCB0eXBlIFJPVVRJTkcuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgewotICAgICAgICAgbGVmRGF0YS0+bGVmckxheWVyLmFkZERjY3VycmVudERlbnNpdHkoIkFWRVJBR0UiKTsKLSAgICAgICAgIGxlZkRhdGEtPmxlZnJMYXllci5hZGROdW1iZXIoJDQpOwotICAgICAgfQotICAgIH0KLSAgICBpbnRfbnVtYmVyX2xpc3QgJzsnCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgbGVmRGF0YS0+bGVmckxheWVyLmFkZERjV2lkdGgoKTsgfQotICAgIGRjX2xheWVyX3RhYmxlIHt9Ci0KLS8vIDMvMjMvMjAwMCAtIDUuNCBzeW50YXguICBXYW5kYSBkYSBSb3NhIAotICB8IEtfQU5URU5OQUFSRUFSQVRJTyBpbnRfbnVtYmVyICc7JwotICAgIHsgLy8gNS40IHN5bnRheCAKLSAgICAgIGxlZkRhdGEtPnVzZTVfNCA9IDE7Ci0gICAgICBpZiAobGVmRGF0YS0+aWdub3JlVmVyc2lvbikgewotICAgICAgICAgLy8gZG8gbm90aGluZyAKLSAgICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNCkgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgIkFOVEVOTkFBUkVBUkFUSU8gc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICBsZWZFcnJvcigxNTMxLCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPnVzZTVfMykgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgIkFOVEVOTkFESUZGQVJFQVJBVElPIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IG9yIGVhcmxpZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSB3aXRoIHZlcnNpb24gJWcsIGhhcyBib3RoIG9sZCBhbmQgbmV3IEFOVEVOTkFBUkVBUkFUSU8gc3ludGF4LCB3aGljaCBpcyBpbmNvcnJlY3QuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICBsZWZFcnJvcigxNzA0LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoIWxlZkRhdGEtPmxheWVyUm91dCAmJiAhbGVmRGF0YS0+bGF5ZXJDdXQgJiYgbGVmRGF0YS0+bGF5ZXJNYXN0T3ZlcikgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE1MzMsICJBTlRFTk5BQVJFQVJBVElPIHN0YXRlbWVudCBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HIG9yIENVVC4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0QW50ZW5uYUFyZWFSYXRpbygkMik7Ci0gICAgfQotICB8IEtfQU5URU5OQURJRkZBUkVBUkFUSU8KLSAgICB7IC8vIDUuNCBzeW50YXggCi0gICAgICBsZWZEYXRhLT51c2U1XzQgPSAxOwotICAgICAgaWYgKGxlZkRhdGEtPmlnbm9yZVZlcnNpb24pIHsKLSAgICAgICAgIC8vIGRvIG5vdGhpbmcgCi0gICAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjQpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5sYXllcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TGF5ZXJXYXJuaW5ncykgewotICAgICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAgICAiQU5URU5OQURJRkZBUkVBUkFUSU8gc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICBsZWZFcnJvcigxNTMyLCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPnVzZTVfMykgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgIkFOVEVOTkFESUZGQVJFQVJBVElPIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IG9yIGVhcmxpZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSB3aXRoIHZlcnNpb24gJWcsIGhhcyBib3RoIG9sZCBhbmQgbmV3IEFOVEVOTkFESUZGQVJFQVJBVElPIHN5bnRheCwgd2hpY2ggaXMgaW5jb3JyZWN0LiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgbGVmRXJyb3IoMTcwNCwgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKCFsZWZEYXRhLT5sYXllclJvdXQgJiYgIWxlZkRhdGEtPmxheWVyQ3V0ICYmIGxlZkRhdGEtPmxheWVyTWFzdE92ZXIpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5sYXllcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TGF5ZXJXYXJuaW5ncykgewotICAgICAgICAgICAgICAgbGVmRXJyb3IoMTUzNCwgIkFOVEVOTkFESUZGQVJFQVJBVElPIHN0YXRlbWVudCBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HIG9yIENVVC4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIpOwotICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBsZWZEYXRhLT5hbnRlbm5hVHlwZSA9IGxlZmlBbnRlbm5hREFSOyAKLSAgICB9Ci0gICAgbGF5ZXJfYW50ZW5uYV9wd2wgJzsnIHt9Ci0gIHwgS19BTlRFTk5BQ1VNQVJFQVJBVElPIGludF9udW1iZXIgJzsnCi0gICAgeyAvLyA1LjQgc3ludGF4IAotICAgICAgbGVmRGF0YS0+dXNlNV80ID0gMTsKLSAgICAgIGlmIChsZWZEYXRhLT5pZ25vcmVWZXJzaW9uKSB7Ci0gICAgICAgICAvLyBkbyBub3RoaW5nIAotICAgICAgfSBlbHNlIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS40KSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAgIkFOVEVOTkFDVU1BUkVBUkFUSU8gc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICBsZWZFcnJvcigxNTM1LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPnVzZTVfMykgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgIkFOVEVOTkFDVU1BUkVBUkFUSU8gc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgb3IgZWFybGllciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIHdpdGggdmVyc2lvbiAlZywgaGFzIGJvdGggb2xkIGFuZCBuZXcgQU5URU5OQUNVTUFSRUFSQVRJTyBzeW50YXgsIHdoaWNoIGlzIGluY29ycmVjdC4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgIGxlZkVycm9yKDE1MzYsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmICghbGVmRGF0YS0+bGF5ZXJSb3V0ICYmICFsZWZEYXRhLT5sYXllckN1dCAmJiBsZWZEYXRhLT5sYXllck1hc3RPdmVyKSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgIGxlZkVycm9yKDE1MzcsICJBTlRFTk5BQ1VNQVJFQVJBVElPIHN0YXRlbWVudCBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HIG9yIENVVC4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIpOwotICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgbGVmRGF0YS0+bGVmckxheWVyLnNldEFudGVubmFDdW1BcmVhUmF0aW8oJDIpOwotICAgIH0KLSAgfCBLX0FOVEVOTkFDVU1ESUZGQVJFQVJBVElPCi0gICAgeyAgLy8gNS40IHN5bnRheCAKLSAgICAgIGxlZkRhdGEtPnVzZTVfNCA9IDE7Ci0gICAgICBpZiAobGVmRGF0YS0+aWdub3JlVmVyc2lvbikgewotICAgICAgICAgLy8gZG8gbm90aGluZyAKLSAgICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNCkgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgICJBTlRFTk5BQ1VNRElGRkFSRUFSQVRJTyBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgIGxlZkVycm9yKDE1MzgsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+dXNlNV8zKSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAiQU5URU5OQUNVTURJRkZBUkVBUkFUSU8gc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgb3IgZWFybGllciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIHdpdGggdmVyc2lvbiAlZywgaGFzIGJvdGggb2xkIGFuZCBuZXcgQU5URU5OQUNVTURJRkZBUkVBUkFUSU8gc3ludGF4LCB3aGljaCBpcyBpbmNvcnJlY3QuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICBsZWZFcnJvcigxNTM5LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoIWxlZkRhdGEtPmxheWVyUm91dCAmJiAhbGVmRGF0YS0+bGF5ZXJDdXQgJiYgbGVmRGF0YS0+bGF5ZXJNYXN0T3ZlcikgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE1NDAsICJBTlRFTk5BQ1VNRElGRkFSRUFSQVRJTyBzdGF0ZW1lbnQgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgUk9VVElORyBvciBDVVQuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBsZWZEYXRhLT5hbnRlbm5hVHlwZSA9IGxlZmlBbnRlbm5hQ0RBUjsKLSAgICB9Ci0gICAgbGF5ZXJfYW50ZW5uYV9wd2wgJzsnIHt9IAotICB8IEtfQU5URU5OQUFSRUFGQUNUT1IgaW50X251bWJlcgotICAgIHsgLy8gYm90aCA1LjMgICYgNS40IHN5bnRheCAKLSAgICAgIGlmICghbGVmRGF0YS0+bGF5ZXJSb3V0ICYmICFsZWZEYXRhLT5sYXllckN1dCAmJiBsZWZEYXRhLT5sYXllck1hc3RPdmVyKSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgIGxlZkVycm9yKDE1NDEsICJBTlRFTk5BQVJFQUZBQ1RPUiBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HIG9yIENVVC4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIpOwotICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyB0aGlzIGRvZXMgbm90IG5lZWQgdG8gY2hlY2ssIHNpbmNlIHN5bnRheCBpcyBpbiBib3RoIDUuMyAmIDUuNCAKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0QW50ZW5uYUFyZWFGYWN0b3IoJDIpOwotICAgICAgbGVmRGF0YS0+YW50ZW5uYVR5cGUgPSBsZWZpQW50ZW5uYUFGOwotICAgIH0KLSAgICBsYXllcl9hbnRlbm5hX2R1byAnOycge30KLSAgfCBLX0FOVEVOTkFTSURFQVJFQVJBVElPIGludF9udW1iZXIgJzsnCi0gICAgeyAvLyA1LjQgc3ludGF4IAotICAgICAgbGVmRGF0YS0+dXNlNV80ID0gMTsKLSAgICAgIGlmICghbGVmRGF0YS0+bGF5ZXJSb3V0ICYmIChsZWZEYXRhLT5sYXllckN1dCB8fCBsZWZEYXRhLT5sYXllck1hc3RPdmVyKSkgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICBsZWZFcnJvcigxNTQyLCAiQU5URU5OQVNJREVBUkVBUkFUSU8gY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgUk9VVElORy4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIpOwotICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobGVmRGF0YS0+aWdub3JlVmVyc2lvbikgewotICAgICAgICAvLyBkbyBub3RoaW5nIAotICAgICAgfSBlbHNlIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS40KSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAgIkFOVEVOTkFTSURFQVJFQVJBVElPIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgbGVmRXJyb3IoMTU0MywgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChsZWZEYXRhLT51c2U1XzMpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5sYXllcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TGF5ZXJXYXJuaW5ncykgewotICAgICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAgICJBTlRFTk5BU0lERUFSRUFSQVRJTyBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBvciBlYXJsaWVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgd2l0aCB2ZXJzaW9uICVnLCBoYXMgYm90aCBvbGQgYW5kIG5ldyBBTlRFTk5BU0lERUFSRUFSQVRJTyBzeW50YXgsIHdoaWNoIGlzIGluY29ycmVjdC4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgIGxlZkVycm9yKDE1NDQsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0QW50ZW5uYVNpZGVBcmVhUmF0aW8oJDIpOwotICAgIH0KLSAgfCBLX0FOVEVOTkFESUZGU0lERUFSRUFSQVRJTwotICAgIHsgIC8vIDUuNCBzeW50YXggCi0gICAgICBsZWZEYXRhLT51c2U1XzQgPSAxOwotICAgICAgaWYgKCFsZWZEYXRhLT5sYXllclJvdXQgJiYgKGxlZkRhdGEtPmxheWVyQ3V0IHx8IGxlZkRhdGEtPmxheWVyTWFzdE92ZXIpKSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgIGxlZkVycm9yKDE1NDUsICJBTlRFTk5BRElGRlNJREVBUkVBUkFUSU8gY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgUk9VVElORy4gUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIpOwotICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobGVmRGF0YS0+aWdub3JlVmVyc2lvbikgewotICAgICAgICAgLy8gZG8gbm90aGluZyAKLSAgICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNCkgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgICJBTlRFTk5BRElGRlNJREVBUkVBUkFUSU8gc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICBsZWZFcnJvcigxNTQ2LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPnVzZTVfMykgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgIkFOVEVOTkFESUZGU0lERUFSRUFSQVRJTyBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBvciBlYXJsaWVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgd2l0aCB2ZXJzaW9uICVnLCBoYXMgYm90aCBvbGQgYW5kIG5ldyBBTlRFTk5BRElGRlNJREVBUkVBUkFUSU8gc3ludGF4LCB3aGljaCBpcyBpbmNvcnJlY3QuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICBsZWZFcnJvcigxNTQ3LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBsZWZEYXRhLT5hbnRlbm5hVHlwZSA9IGxlZmlBbnRlbm5hRFNBUjsKLSAgICB9Ci0gICAgbGF5ZXJfYW50ZW5uYV9wd2wgJzsnIHt9Ci0gIHwgS19BTlRFTk5BQ1VNU0lERUFSRUFSQVRJTyBpbnRfbnVtYmVyICc7JwotICAgIHsgLy8gNS40IHN5bnRheCAKLSAgICAgIGxlZkRhdGEtPnVzZTVfNCA9IDE7Ci0gICAgICBpZiAoIWxlZkRhdGEtPmxheWVyUm91dCAmJiAobGVmRGF0YS0+bGF5ZXJDdXQgfHwgbGVmRGF0YS0+bGF5ZXJNYXN0T3ZlcikpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5sYXllcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TGF5ZXJXYXJuaW5ncykgewotICAgICAgICAgICAgICAgbGVmRXJyb3IoMTU0OCwgIkFOVEVOTkFDVU1TSURFQVJFQVJBVElPIGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iKTsKLSAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGxlZkRhdGEtPmlnbm9yZVZlcnNpb24pIHsKLSAgICAgICAgIC8vIGRvIG5vdGhpbmcgCi0gICAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjQpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5sYXllcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TGF5ZXJXYXJuaW5ncykgewotICAgICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAgICAiQU5URU5OQUNVTVNJREVBUkVBUkFUSU8gc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICBsZWZFcnJvcigxNTQ5LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPnVzZTVfMykgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgIkFOVEVOTkFDVU1TSURFQVJFQVJBVElPIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IG9yIGVhcmxpZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSB3aXRoIHZlcnNpb24gJWcsIGhhcyBib3RoIG9sZCBhbmQgbmV3IEFOVEVOTkFDVU1TSURFQVJFQVJBVElPIHN5bnRheCwgd2hpY2ggaXMgaW5jb3JyZWN0LiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgbGVmRXJyb3IoMTU1MCwgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIGxlZkRhdGEtPmxlZnJMYXllci5zZXRBbnRlbm5hQ3VtU2lkZUFyZWFSYXRpbygkMik7Ci0gICAgfQotICB8IEtfQU5URU5OQUNVTURJRkZTSURFQVJFQVJBVElPCi0gICAgeyAgLy8gNS40IHN5bnRheCAKLSAgICAgIGxlZkRhdGEtPnVzZTVfNCA9IDE7Ci0gICAgICBpZiAoIWxlZkRhdGEtPmxheWVyUm91dCAmJiAobGVmRGF0YS0+bGF5ZXJDdXQgfHwgbGVmRGF0YS0+bGF5ZXJNYXN0T3ZlcikpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5sYXllcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TGF5ZXJXYXJuaW5ncykgewotICAgICAgICAgICAgICAgbGVmRXJyb3IoMTU1MSwgIkFOVEVOTkFDVU1ESUZGU0lERUFSRUFSQVRJTyBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HLiBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIik7Ci0gICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChsZWZEYXRhLT5pZ25vcmVWZXJzaW9uKSB7Ci0gICAgICAgICAvLyBkbyBub3RoaW5nIAotICAgICAgfSBlbHNlIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS40KSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAgIkFOVEVOTkFDVU1ESUZGU0lERUFSRUFSQVRJTyBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgIGxlZkVycm9yKDE1NTIsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+dXNlNV8zKSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAiQU5URU5OQUNVTURJRkZTSURFQVJFQVJBVElPIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IG9yIGVhcmxpZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSB3aXRoIHZlcnNpb24gJWcsIGhhcyBib3RoIG9sZCBhbmQgbmV3IEFOVEVOTkFDVU1ESUZGU0lERUFSRUFSQVRJTyBzeW50YXgsIHdoaWNoIGlzIGluY29ycmVjdC4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgIGxlZkVycm9yKDE1NTMsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGxlZkRhdGEtPmFudGVubmFUeXBlID0gbGVmaUFudGVubmFDRFNBUjsKLSAgICB9Ci0gICAgbGF5ZXJfYW50ZW5uYV9wd2wgJzsnIHt9Ci0gIHwgS19BTlRFTk5BU0lERUFSRUFGQUNUT1IgaW50X251bWJlcgotICAgIHsgLy8gNS40IHN5bnRheCAKLSAgICAgIGxlZkRhdGEtPnVzZTVfNCA9IDE7Ci0gICAgICBpZiAoIWxlZkRhdGEtPmxheWVyUm91dCAmJiAobGVmRGF0YS0+bGF5ZXJDdXQgfHwgbGVmRGF0YS0+bGF5ZXJNYXN0T3ZlcikpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5sYXllcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TGF5ZXJXYXJuaW5ncykgewotICAgICAgICAgICAgICAgbGVmRXJyb3IoMTU1NCwgIkFOVEVOTkFTSURFQVJFQUZBQ1RPUiBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HLiBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIik7Ci0gICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChsZWZEYXRhLT5pZ25vcmVWZXJzaW9uKSB7Ci0gICAgICAgICAvLyBkbyBub3RoaW5nIAotICAgICAgfSBlbHNlIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS40KSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAgIkFOVEVOTkFTSURFQVJFQUZBQ1RPUiBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgIGxlZkVycm9yKDE1NTUsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+dXNlNV8zKSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAiQU5URU5OQVNJREVBUkVBRkFDVE9SIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IG9yIGVhcmxpZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSB3aXRoIHZlcnNpb24gJWcsIGhhcyBib3RoIG9sZCBhbmQgbmV3IEFOVEVOTkFTSURFQVJFQUZBQ1RPUiBzeW50YXgsIHdoaWNoIGlzIGluY29ycmVjdC4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgIGxlZkVycm9yKDE1NTYsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0QW50ZW5uYVNpZGVBcmVhRmFjdG9yKCQyKTsKLSAgICAgIGxlZkRhdGEtPmFudGVubmFUeXBlID0gbGVmaUFudGVubmFTQUY7Ci0gICAgfQotICAgIGxheWVyX2FudGVubmFfZHVvICc7JyB7fQotICB8IEtfQU5URU5OQU1PREVMIC8vIDUuNSAKLSAgICB7IC8vIDUuNCBzeW50YXggCi0gICAgICBsZWZEYXRhLT51c2U1XzQgPSAxOwotICAgICAgaWYgKCFsZWZEYXRhLT5sYXllclJvdXQgJiYgIWxlZkRhdGEtPmxheWVyQ3V0ICYmIGxlZkRhdGEtPmxheWVyTWFzdE92ZXIpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5sYXllcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TGF5ZXJXYXJuaW5ncykgewotICAgICAgICAgICAgICAgbGVmRXJyb3IoMTU1NywgIkFOVEVOTkFNT0RFTCBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HLiBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIik7Ci0gICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChsZWZEYXRhLT5pZ25vcmVWZXJzaW9uKSB7Ci0gICAgICAgICAvLyBkbyBub3RoaW5nIAotICAgICAgfSBlbHNlIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS41KSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAgIkFOVEVOTkFNT0RFTCBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNSBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgIGxlZkVycm9yKDE1NTgsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+dXNlNV8zKSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAiQU5URU5OQU1PREVMIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IG9yIGVhcmxpZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSB3aXRoIHZlcnNpb24gJWcsIGhhcyBib3RoIG9sZCBhbmQgbmV3IEFOVEVOTkFNT0RFTCBzeW50YXgsIHdoaWNoIGlzIGluY29ycmVjdC4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgIGxlZkVycm9yKDE1NTksIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGxlZkRhdGEtPmFudGVubmFUeXBlID0gbGVmaUFudGVubmFPOwotICAgIH0KLSAgICBsYXllcl9veGlkZSAnOycge30KLSAgfCBLX0FOVEVOTkFDVU1ST1VUSU5HUExVU0NVVCAnOycgICAgICAgIC8vIDUuNyAKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNykgewotICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICBzcHJpbnRmKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgIkFOVEVOTkFDVU1ST1VUSU5HUExVU0NVVCBpcyBhIHZlcnNpb24gNS43IG9yIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICBsZWZFcnJvcigxNjg2LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAgaWYgKCFsZWZEYXRhLT5sYXllclJvdXQgJiYgIWxlZkRhdGEtPmxheWVyQ3V0KSB7Ci0gICAgICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgICAgIGxlZkVycm9yKDE1NjAsICJBTlRFTk5BQ1VNUk9VVElOR1BMVVNDVVQgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIHR5cGUgUk9VVElORyBvciBDVVQuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iKTsKLSAgICAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIGxlZkRhdGEtPmxlZnJMYXllci5zZXRBbnRlbm5hQ3VtUm91dGluZ1BsdXNDdXQoKTsKLSAgICAgIH0KLSAgICB9Ci0gIHwgS19BTlRFTk5BR0FURVBMVVNESUZGIGludF9udW1iZXIgJzsnICAgICAgLy8gNS43IAotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS43KSB7Ci0gICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgIHNwcmludGYobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAiQU5URU5OQUdBVEVQTFVTRElGRiBpcyBhIHZlcnNpb24gNS43IG9yIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICBsZWZFcnJvcigxNjg3LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAgaWYgKCFsZWZEYXRhLT5sYXllclJvdXQgJiYgIWxlZkRhdGEtPmxheWVyQ3V0KSB7Ci0gICAgICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgICAgIGxlZkVycm9yKDE1NjEsICJBTlRFTk5BR0FURVBMVVNESUZGIGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCB0eXBlIFJPVVRJTkcgb3IgQ1VULiBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIik7Ci0gICAgICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0QW50ZW5uYUdhdGVQbHVzRGlmZigkMik7Ci0gICAgICB9Ci0gICAgfQotICB8IEtfQU5URU5OQUFSRUFNSU5VU0RJRkYgaW50X251bWJlciAnOycgICAgIC8vIDUuNyAKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNykgewotICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICBzcHJpbnRmKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgIkFOVEVOTkFBUkVBTUlOVVNESUZGIGlzIGEgdmVyc2lvbiA1Ljcgb3IgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgIGxlZkVycm9yKDE2ODgsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICBDSEtFUlIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICBpZiAoIWxlZkRhdGEtPmxheWVyUm91dCAmJiAhbGVmRGF0YS0+bGF5ZXJDdXQpIHsKLSAgICAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgICAgIGlmIChsZWZEYXRhLT5sYXllcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TGF5ZXJXYXJuaW5ncykgewotICAgICAgICAgICAgICAgICAgbGVmRXJyb3IoMTU2MiwgIkFOVEVOTkFBUkVBTUlOVVNESUZGIGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCB0eXBlIFJPVVRJTkcgb3IgQ1VULiBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIik7Ci0gICAgICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0QW50ZW5uYUFyZWFNaW51c0RpZmYoJDIpOwotICAgICAgfQotICAgIH0KLSAgfCBLX0FOVEVOTkFBUkVBRElGRlJFRFVDRVBXTCAnKCcgcHQgcHQgICAgICAgICAgICAvLyA1LjcgCi0gICAgewotICAgICAgaWYgKCFsZWZEYXRhLT5sYXllclJvdXQgJiYgIWxlZkRhdGEtPmxheWVyQ3V0KSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgIGxlZkVycm9yKDE1NjMsICJBTlRFTk5BQVJFQURJRkZSRURVQ0VQV0wgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIHR5cGUgUk9VVElORyBvciBDVVQuIFBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iKTsKLSAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gcmVxdWlyZSBtaW4gMiBwb2ludHMsIHNldCB0aGUgMXN0IDIgCi0gICAgICAgICBpZiAobGVmRGF0YS0+bGVmckFudGVubmFQV0xQdHIpIHsKLSAgICAgICAgICAgIGxlZkRhdGEtPmxlZnJBbnRlbm5hUFdMUHRyLT5EZXN0cm95KCk7Ci0gICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPmxlZnJBbnRlbm5hUFdMUHRyKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgbGVmRGF0YS0+bGVmckFudGVubmFQV0xQdHIgPSBsZWZpQW50ZW5uYVBXTDo6Y3JlYXRlKCk7Ci0gICAgICAgICBsZWZEYXRhLT5sZWZyQW50ZW5uYVBXTFB0ci0+YWRkQW50ZW5uYVBXTCgkMy54LCAkMy55KTsKLSAgICAgICAgIGxlZkRhdGEtPmxlZnJBbnRlbm5hUFdMUHRyLT5hZGRBbnRlbm5hUFdMKCQ0LngsICQ0LnkpOwotICAgICAgfQotICAgIH0gCi0gICAgbGF5ZXJfZGlmZnVzaW9uX3JhdGlvcyAnKScgJzsnCi0gICAgewotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsKLSAgICAgICAgbGVmRGF0YS0+bGVmckxheWVyLnNldEFudGVubmFQV0wobGVmaUFudGVubmFBRFIsIGxlZkRhdGEtPmxlZnJBbnRlbm5hUFdMUHRyKTsKLSAgICAgICAgbGVmRGF0YS0+bGVmckFudGVubmFQV0xQdHIgPSBOVUxMOwotICAgICAgfQotICAgIH0KLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNykgewotICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgc3ByaW50ZihsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgIkFOVEVOTkFBUkVBRElGRlJFRFVDRVBXTCBpcyBhIHZlcnNpb24gNS43IG9yIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgIGxlZkVycm9yKDE2ODksIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICB9Ci0gICAgfQotICB8IEtfU0xPVFdJUkVXSURUSCBpbnRfbnVtYmVyICc7JwotICAgIHsgLy8gNS40IHN5bnRheCAKLSAgICAgIGlmIChsZWZEYXRhLT5pZ25vcmVWZXJzaW9uKSB7Ci0gICAgICAgICAvLyBkbyBub3RoaW5nIAotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIGxlZkRhdGEtPmxlZnJMYXllci5zZXRTbG90V2lyZVdpZHRoKCQyKTsKLSAgICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA+PSA1LjcpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5sYXllcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TGF5ZXJXYXJuaW5ncykKLSAgICAgICAgICAgICAgIGxlZldhcm5pbmcoMjAxMSwgIlNMT1RXSVJFV0lEVEggc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS43IG9yIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1Ljcgb3IgbGF0ZXIuIik7Ci0gICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjQpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5sYXllcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TGF5ZXJXYXJuaW5ncykgewotICAgICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAgICAiU0xPVFdJUkVXSURUSCBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgIGxlZkVycm9yKDE1NjQsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0gZWxzZQotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIGxlZkRhdGEtPmxlZnJMYXllci5zZXRTbG90V2lyZVdpZHRoKCQyKTsKLSAgICB9Ci0gIHwgS19TTE9UV0lSRUxFTkdUSCBpbnRfbnVtYmVyICc7JwotICAgIHsgLy8gNS40IHN5bnRheCAKLSAgICAgIGlmIChsZWZEYXRhLT5pZ25vcmVWZXJzaW9uKSB7Ci0gICAgICAgICAvLyBkbyBub3RoaW5nIAotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIGxlZkRhdGEtPmxlZnJMYXllci5zZXRTbG90V2lyZUxlbmd0aCgkMik7Ci0gICAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPj0gNS43KSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpCi0gICAgICAgICAgICAgICBsZWZXYXJuaW5nKDIwMTIsICJTTE9UV0lSRUxFTkdUSCBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1Ljcgb3IgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNyBvciBsYXRlci4iKTsKLSAgICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNCkgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgICJTTE9UV0lSRUxFTkdUSCBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgIGxlZkVycm9yKDE1NjUsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0gZWxzZQotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIGxlZkRhdGEtPmxlZnJMYXllci5zZXRTbG90V2lyZUxlbmd0aCgkMik7Ci0gICAgfQotICB8IEtfU0xPVFdJRFRIIGludF9udW1iZXIgJzsnCi0gICAgeyAvLyA1LjQgc3ludGF4IAotICAgICAgaWYgKGxlZkRhdGEtPmlnbm9yZVZlcnNpb24pIHsKLSAgICAgICAgIC8vIGRvIG5vdGhpbmcgCi0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgbGVmRGF0YS0+bGVmckxheWVyLnNldFNsb3RXaWR0aCgkMik7Ci0gICAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPj0gNS43KSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpCi0gICAgICAgICAgICAgICBsZWZXYXJuaW5nKDIwMTMsICJTTE9UV0lEVEggc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS43IG9yIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1Ljcgb3IgbGF0ZXIuIik7Ci0gICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjQpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5sYXllcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TGF5ZXJXYXJuaW5ncykgewotICAgICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAgICAiU0xPVFdJRFRIIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgbGVmRXJyb3IoMTU2NiwgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfSBlbHNlCi0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgbGVmRGF0YS0+bGVmckxheWVyLnNldFNsb3RXaWR0aCgkMik7Ci0gICAgfQotICB8IEtfU0xPVExFTkdUSCBpbnRfbnVtYmVyICc7JwotICAgIHsgLy8gNS40IHN5bnRheCAKLSAgICAgIGlmIChsZWZEYXRhLT5pZ25vcmVWZXJzaW9uKSB7Ci0gICAgICAgICAvLyBkbyBub3RoaW5nIAotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIGxlZkRhdGEtPmxlZnJMYXllci5zZXRTbG90TGVuZ3RoKCQyKTsKLSAgICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA+PSA1LjcpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5sYXllcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TGF5ZXJXYXJuaW5ncykKLSAgICAgICAgICAgICAgIGxlZldhcm5pbmcoMjAxNCwgIlNMT1RMRU5HVEggc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS43IG9yIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1Ljcgb3IgbGF0ZXIuIik7Ci0gICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjQpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5sYXllcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TGF5ZXJXYXJuaW5ncykgewotICAgICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAgICAiU0xPVExFTkdUSCBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgIGxlZkVycm9yKDE1NjcsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0gZWxzZQotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIGxlZkRhdGEtPmxlZnJMYXllci5zZXRTbG90TGVuZ3RoKCQyKTsKLSAgICB9Ci0gIHwgS19NQVhBREpBQ0VOVFNMT1RTUEFDSU5HIGludF9udW1iZXIgJzsnCi0gICAgeyAvLyA1LjQgc3ludGF4IAotICAgICAgaWYgKGxlZkRhdGEtPmlnbm9yZVZlcnNpb24pIHsKLSAgICAgICAgIC8vIGRvIG5vdGhpbmcgCi0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgbGVmRGF0YS0+bGVmckxheWVyLnNldE1heEFkamFjZW50U2xvdFNwYWNpbmcoJDIpOwotICAgICAgfSBlbHNlIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtID49IDUuNykgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKQotICAgICAgICAgICAgICAgbGVmV2FybmluZygyMDE1LCAiTUFYQURKQUNFTlRTTE9UU1BBQ0lORyBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1Ljcgb3IgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNyBvciBsYXRlci4iKTsKLSAgICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNCkgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgICJNQVhBREpBQ0VOVFNMT1RTUEFDSU5HIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgbGVmRXJyb3IoMTU2OCwgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfSBlbHNlCi0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgbGVmRGF0YS0+bGVmckxheWVyLnNldE1heEFkamFjZW50U2xvdFNwYWNpbmcoJDIpOwotICAgIH0KLSAgfCBLX01BWENPQVhJQUxTTE9UU1BBQ0lORyBpbnRfbnVtYmVyICc7JwotICAgIHsgLy8gNS40IHN5bnRheCAKLSAgICAgIGlmIChsZWZEYXRhLT5pZ25vcmVWZXJzaW9uKSB7Ci0gICAgICAgICAvLyBkbyBub3RoaW5nIAotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIGxlZkRhdGEtPmxlZnJMYXllci5zZXRNYXhDb2F4aWFsU2xvdFNwYWNpbmcoJDIpOwotICAgICAgfSBlbHNlIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtID49IDUuNykgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKQotICAgICAgICAgICAgICAgIGxlZldhcm5pbmcoMjAxNiwgIk1BWENPQVhJQUxTTE9UU1BBQ0lORyBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1Ljcgb3IgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNyBvciBsYXRlci4iKTsKLSAgICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNCkgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgICJNQVhDT0FYSUFMU0xPVFNQQUNJTkcgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICBsZWZFcnJvcigxNTY5LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9IGVsc2UKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0TWF4Q29heGlhbFNsb3RTcGFjaW5nKCQyKTsKLSAgICB9Ci0gIHwgS19NQVhFREdFU0xPVFNQQUNJTkcgaW50X251bWJlciAnOycKLSAgICB7IC8vIDUuNCBzeW50YXggCi0gICAgICBpZiAobGVmRGF0YS0+aWdub3JlVmVyc2lvbikgewotICAgICAgICAgLy8gZG8gbm90aGluZyAKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0TWF4RWRnZVNsb3RTcGFjaW5nKCQyKTsKLSAgICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA+PSA1LjcpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5sYXllcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TGF5ZXJXYXJuaW5ncykKLSAgICAgICAgICAgICAgIGxlZldhcm5pbmcoMjAxNywgIk1BWEVER0VTTE9UU1BBQ0lORyBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1Ljcgb3IgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNyBvciBsYXRlci4iKTsKLSAgICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNCkgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgICJNQVhFREdFU0xPVFNQQUNJTkcgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICBsZWZFcnJvcigxNTcwLCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9IGVsc2UKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0TWF4RWRnZVNsb3RTcGFjaW5nKCQyKTsKLSAgICB9Ci0gIHwgS19TUExJVFdJUkVXSURUSCBpbnRfbnVtYmVyICc7JwotICAgIHsgLy8gNS40IHN5bnRheCAKLSAgICAgIGlmIChsZWZEYXRhLT5pZ25vcmVWZXJzaW9uKSB7Ci0gICAgICAgICAvLyBkbyBub3RoaW5nIAotICAgICAgfSBlbHNlIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtID49IDUuNykgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKQotICAgICAgICAgICAgICAgbGVmV2FybmluZygyMDE4LCAiU1BMSVRXSVJFV0lEVEggc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS43IG9yIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1Ljcgb3IgbGF0ZXIuIik7Ci0gICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjQpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5sYXllcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TGF5ZXJXYXJuaW5ncykgewotICAgICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAgICAiU1BMSVRXSVJFV0lEVEggc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICBsZWZFcnJvcigxNTcxLCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgbGVmRGF0YS0+bGVmckxheWVyLnNldFNwbGl0V2lyZVdpZHRoKCQyKTsKLSAgICB9Ci0gIHwgS19NSU5JTVVNREVOU0lUWSBpbnRfbnVtYmVyICc7JwotICAgIHsgLy8gNS40IHN5bnRheCwgcGNyIDM5NDM4OSAKLSAgICAgIGlmIChsZWZEYXRhLT5pZ25vcmVWZXJzaW9uKSB7Ci0gICAgICAgICAvLyBkbyBub3RoaW5nIAotICAgICAgfSBlbHNlIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS40KSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAgIk1JTklNVU1ERU5TSVRZIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgbGVmRXJyb3IoMTU3MiwgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIGxlZkRhdGEtPmxlZnJMYXllci5zZXRNaW5pbXVtRGVuc2l0eSgkMik7Ci0gICAgfQotICB8IEtfTUFYSU1VTURFTlNJVFkgaW50X251bWJlciAnOycKLSAgICB7IC8vIDUuNCBzeW50YXgsIHBjciAzOTQzODkgCi0gICAgICBpZiAobGVmRGF0YS0+aWdub3JlVmVyc2lvbikgewotICAgICAgICAgLy8gZG8gbm90aGluZyAKLSAgICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNCkgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgICJNQVhJTVVNREVOU0lUWSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgIGxlZkVycm9yKDE1NzMsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0TWF4aW11bURlbnNpdHkoJDIpOwotICAgIH0KLSAgfCBLX0RFTlNJVFlDSEVDS1dJTkRPVyBpbnRfbnVtYmVyIGludF9udW1iZXIgJzsnCi0gICAgeyAvLyA1LjQgc3ludGF4LCBwY3IgMzk0Mzg5IAotICAgICAgaWYgKGxlZkRhdGEtPmlnbm9yZVZlcnNpb24pIHsKLSAgICAgICAgIC8vIGRvIG5vdGhpbmcgCi0gICAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjQpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5sYXllcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TGF5ZXJXYXJuaW5ncykgewotICAgICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAgICAiREVOU0lUWUNIRUNLV0lORE9XIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgbGVmRXJyb3IoMTU3NCwgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIGxlZkRhdGEtPmxlZnJMYXllci5zZXREZW5zaXR5Q2hlY2tXaW5kb3coJDIsICQzKTsKLSAgICB9Ci0gIHwgS19ERU5TSVRZQ0hFQ0tTVEVQIGludF9udW1iZXIgJzsnCi0gICAgeyAvLyA1LjQgc3ludGF4LCBwY3IgMzk0Mzg5IAotICAgICAgaWYgKGxlZkRhdGEtPmlnbm9yZVZlcnNpb24pIHsKLSAgICAgICAgIC8vIGRvIG5vdGhpbmcgCi0gICAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjQpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5sYXllcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TGF5ZXJXYXJuaW5ncykgewotICAgICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAgICAiREVOU0lUWUNIRUNLU1RFUCBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgIGxlZkVycm9yKDE1NzUsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0RGVuc2l0eUNoZWNrU3RlcCgkMik7Ci0gICAgfQotICB8IEtfRklMTEFDVElWRVNQQUNJTkcgaW50X251bWJlciAnOycKLSAgICB7IC8vIDUuNCBzeW50YXgsIHBjciAzOTQzODkgCi0gICAgICBpZiAobGVmRGF0YS0+aWdub3JlVmVyc2lvbikgewotICAgICAgICAgLy8gZG8gbm90aGluZyAKLSAgICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNCkgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgICJGSUxMQUNUSVZFU1BBQ0lORyBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgIGxlZkVycm9yKDE1NzYsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0RmlsbEFjdGl2ZVNwYWNpbmcoJDIpOwotICAgIH0KLSAgfCBLX01BWFdJRFRIIGludF9udW1iZXIgJzsnICAgICAgICAgICAgICAvLyA1LjUgCi0gICAgewotICAgICAgLy8gNS41IE1BWFdJRFRILCBpcyBmb3Igcm91dGluZyBsYXllciBvbmx5Ci0gICAgICBpZiAoIWxlZkRhdGEtPmxheWVyUm91dCkgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICBsZWZFcnJvcigxNTc3LCAiTUFYV0lEVEggc3RhdGVtZW50IGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gTEFZRVIgd2l0aCBUWVBFIFJPVVRJTkcuICBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIik7Ci0gICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS41KSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAgIk1BWFdJRFRIIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS41IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgbGVmRXJyb3IoMTU3OCwgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIGxlZkRhdGEtPmxlZnJMYXllci5zZXRNYXh3aWR0aCgkMik7Ci0gICAgfQotICB8IEtfTUlOV0lEVEggaW50X251bWJlciAnOycgICAgICAgICAgICAgIC8vIDUuNSAKLSAgICB7Ci0gICAgICAvLyA1LjUgTUlOV0lEVEgsIGlzIGZvciByb3V0aW5nIGxheWVyIG9ubHkKLSAgICAgIGlmICghbGVmRGF0YS0+bGF5ZXJSb3V0KSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTU3OSwgIk1JTldJRFRIIHN0YXRlbWVudCBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HLiAgUGFyc2VyIHdpbGwgc3RvcCBwcm9jZXNzaW5nLiIpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS41KSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAgIk1JTldJRFRIIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS41IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgbGVmRXJyb3IoMTU4MCwgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIGxlZkRhdGEtPmxlZnJMYXllci5zZXRNaW53aWR0aCgkMik7Ci0gICAgfQotICB8IEtfTUlORU5DTE9TRURBUkVBIE5VTUJFUiAgICAgICAgICAgLy8gNS41IAotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS41KSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAgIk1JTkVOQ0xPU0VEQVJFQSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNSBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgIGxlZkVycm9yKDE1ODEsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSBsZWZEYXRhLT5sZWZyTGF5ZXIuYWRkTWluZW5jbG9zZWRhcmVhKCQyKTsKLSAgICB9Ci0gICAgbGF5ZXJfbWluZW5fd2lkdGggJzsnIHt9Ci0gIHwgS19NSU5JTVVNQ1VUIGludF9udW1iZXIgS19XSURUSCBpbnRfbnVtYmVyIC8vIDUuNSAKLSAgICB7IC8vIHBjciA0MDkzMzQgCi0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykKLSAgICAgICAgIGxlZkRhdGEtPmxlZnJMYXllci5hZGRNaW5pbXVtY3V0KChpbnQpJDIsICQ0KTsgCi0gICAgICBsZWZEYXRhLT5oYXNMYXllck1pbmN1dCA9IDA7Ci0gICAgfQotICAgIGxheWVyX21pbmltdW1jdXRfd2l0aGluCi0gICAgbGF5ZXJfbWluaW11bWN1dF9mcm9tCi0gICAgbGF5ZXJfbWluaW11bWN1dF9sZW5ndGggJzsnCi0gICAgewotICAgICAgaWYgKCFsZWZEYXRhLT5oYXNMYXllck1pbmN1dCkgeyAgIC8vIEZST01BQk9WRSBub3IgRlJPTUJFTE9XIGlzIHNldCAKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKQotICAgICAgICAgICAgIGxlZkRhdGEtPmxlZnJMYXllci5hZGRNaW5pbXVtY3V0Q29ubmVjdCgoY2hhciopIiIpOwotICAgICAgfQotICAgIH0KLSAgfCBLX01JTlNURVAgaW50X251bWJlciAgICAgICAgICAgICAgIC8vIDUuNSAKLSAgICB7Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgbGVmRGF0YS0+bGVmckxheWVyLmFkZE1pbnN0ZXAoJDIpOwotICAgIH0KLSAgICBsYXllcl9taW5zdGVwX29wdGlvbnMgJzsnICAgICAgLy8gNS42IAotICAgIHsKLSAgICB9Ci0gIHwgS19QUk9UUlVTSU9OV0lEVEggaW50X251bWJlciBLX0xFTkdUSCBpbnRfbnVtYmVyIEtfV0lEVEggaW50X251bWJlciAnOycgIC8vIDUuNSAKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNSkgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgICJQUk9UUlVTSU9OIFJVTEUgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjUgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICBsZWZFcnJvcigxNTgyLCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgbGVmRGF0YS0+bGVmckxheWVyLnNldFByb3RydXNpb24oJDIsICQ0LCAkNik7Ci0gICAgfQotICB8IEtfU1BBQ0lOR1RBQkxFICAgICAgICAgICAgICAgICAgICAvLyA1LjUgCi0gICAgewotICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjUpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5sYXllcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TGF5ZXJXYXJuaW5ncykgewotICAgICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAgICAiU1BBQ0lOR1RBQkxFIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS41IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgbGVmRXJyb3IoMTU4MywgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gNS41IGVpdGhlciBTUEFDSU5HIG9yIFNQQUNJTkdUQUJMRSBpbiBhIGxheWVyLCBub3QgYm90aAotICAgICAgaWYgKGxlZkRhdGEtPmxlZnJIYXNTcGFjaW5nICYmIGxlZkRhdGEtPmxheWVyUm91dCAmJiBsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS43KSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgIC8vIHdyaXRlIHdhcm5pbmcgb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZldhcm5pbmcoMjAxMCwgIkl0IGlzIGluY29ycmVjdCB0byBoYXZlIGJvdGggU1BBQ0lORyBydWxlcyAmIFNQQUNJTkdUQUJMRSBydWxlcyB3aXRoaW4gYSBST1VUSU5HIGxheWVyIik7Ci0gICAgICAgICAgICB9Ci0gICAgICB9IAotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIGxlZkRhdGEtPmxlZnJMYXllci5hZGRTcGFjaW5nVGFibGUoKTsKLSAgICAgIGxlZkRhdGEtPmxlZnJIYXNTcGFjaW5nVGJsID0gMTsKLSAgICB9Ci0gICAgc3Bfb3B0aW9ucyAnOycge30KLSAgLy8gMTAvMTIvMjAwMyAtIDUuNiBzeW50YXggCi0gIHwgS19FTkNMT1NVUkUgbGF5ZXJfZW5jbG9zdXJlX3R5cGVfb3B0IGludF9udW1iZXIgaW50X251bWJlcgotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS42KSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAgIkVOQ0xPU1VSRSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgIGxlZkVycm9yKDE1ODQsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKQotICAgICAgICAgbGVmRGF0YS0+bGVmckxheWVyLmFkZEVuY2xvc3VyZSgkMiwgJDMsICQ0KTsKLSAgICB9Ci0gICAgbGF5ZXJfZW5jbG9zdXJlX3dpZHRoX29wdCAnOycge30KLSAgLy8gMTIvMzAvMjAwMyAtIDUuNiBzeW50YXggCi0gIHwgS19QUkVGRVJFTkNMT1NVUkUgbGF5ZXJfZW5jbG9zdXJlX3R5cGVfb3B0IGludF9udW1iZXIgaW50X251bWJlcgotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS42KSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAgIlBSRUZFUkVOQ0xPU1VSRSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgIGxlZkVycm9yKDE1ODUsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKQotICAgICAgICAgbGVmRGF0YS0+bGVmckxheWVyLmFkZFByZWZlckVuY2xvc3VyZSgkMiwgJDMsICQ0KTsKLSAgICB9Ci0gICAgbGF5ZXJfcHJlZmVyZW5jbG9zdXJlX3dpZHRoX29wdCAnOycge30KLSAgfCBLX1JFU0lTVEFOQ0UgaW50X251bWJlciAnOycKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNikgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgICJSRVNJU1RBTkNFIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS42IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgbGVmRXJyb3IoMTU4NiwgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKQotICAgICAgICAgICAgbGVmRGF0YS0+bGVmckxheWVyLnNldFJlc1BlckN1dCgkMik7Ci0gICAgICB9Ci0gICAgfQotICB8IEtfRElBR01JTkVER0VMRU5HVEggaW50X251bWJlciAnOycKLSAgICB7Ci0gICAgICBpZiAoIWxlZkRhdGEtPmxheWVyUm91dCkgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE1ODcsICJESUFHTUlORURHRUxFTkdUSCBjYW4gb25seSBiZSBkZWZpbmVkIGluIExBWUVSIHdpdGggVFlQRSBST1VUSU5HLiBQYXJzZXIgd2lsbCBzdG9wIHByb2Nlc3NpbmcuIik7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS42KSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAgIkRJQUdNSU5FREdFTEVOR1RIIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS42IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgbGVmRXJyb3IoMTU4OCwgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKQotICAgICAgICAgICAgbGVmRGF0YS0+bGVmckxheWVyLnNldERpYWdNaW5FZGdlTGVuZ3RoKCQyKTsKLSAgICAgIH0KLSAgICB9Ci0gIHwgS19NSU5TSVpFCi0gICAgewotICAgICAgLy8gVXNlIHRoZSBwb2x5Z29uIGNvZGUgdG8gcmV0cmlldmUgdGhlIHBvaW50cyBmb3IgTUlOU0laRQotICAgICAgbGVmRGF0YS0+bGVmckdlb21ldHJpZXNQdHIgPSAobGVmaUdlb21ldHJpZXMqKWxlZk1hbGxvYyhzaXplb2YobGVmaUdlb21ldHJpZXMpKTsKLSAgICAgIGxlZkRhdGEtPmxlZnJHZW9tZXRyaWVzUHRyLT5Jbml0KCk7Ci0gICAgICBsZWZEYXRhLT5sZWZyRG9HZW9tZXRyaWVzID0gMTsKLSAgICB9Ci0gICAgZmlyc3RQdCBvdGhlclB0cyAnOycgCi0gICAgewotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsKLSAgICAgICAgIGxlZkRhdGEtPmxlZnJHZW9tZXRyaWVzUHRyLT5hZGRQb2x5Z29uKCk7Ci0gICAgICAgICBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0TWluU2l6ZShsZWZEYXRhLT5sZWZyR2VvbWV0cmllc1B0cik7Ci0gICAgICB9Ci0gICAgIGxlZkRhdGEtPmxlZnJEb0dlb21ldHJpZXMgPSAwOwotICAgICAgbGVmRGF0YS0+bGVmckdlb21ldHJpZXNQdHItPkRlc3Ryb3koKTsKLSAgICAgIGxlZkZyZWUobGVmRGF0YS0+bGVmckdlb21ldHJpZXNQdHIpOwotICAgIH0KLQotbGF5ZXJfYXJyYXlTcGFjaW5nX2xvbmc6ICAgICAgICAgICAgLy8gNS43Ci0gIC8vIGVtcHR5IAotICB8IEtfTE9OR0FSUkFZCi0gICAgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykKLSAgICAgICAgICAgbGVmRGF0YS0+bGVmckxheWVyLnNldEFycmF5U3BhY2luZ0xvbmdBcnJheSgpOwotICAgIH0KLQotbGF5ZXJfYXJyYXlTcGFjaW5nX3dpZHRoOiAgICAgICAgICAgLy8gNS43Ci0gIC8vIGVtcHR5IAotICB8IEtfV0lEVEggaW50X251bWJlcgotICAgIHsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKQotICAgICAgICAgbGVmRGF0YS0+bGVmckxheWVyLnNldEFycmF5U3BhY2luZ1dpZHRoKCQyKTsKLSAgICB9Ci0KLWxheWVyX2FycmF5U3BhY2luZ19hcnJheWN1dHM6ICAgICAgIC8vIDUuNwotICAvLyBlbXB0eSAKLSAgfCBsYXllcl9hcnJheVNwYWNpbmdfYXJyYXljdXQgbGF5ZXJfYXJyYXlTcGFjaW5nX2FycmF5Y3V0cwotCi1sYXllcl9hcnJheVNwYWNpbmdfYXJyYXljdXQ6Ci0gIEtfQVJSQVlDVVRTIGludF9udW1iZXIgS19TUEFDSU5HIGludF9udW1iZXIKLSAgICB7Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykKLSAgICAgICAgIGxlZkRhdGEtPmxlZnJMYXllci5hZGRBcnJheVNwYWNpbmdBcnJheSgoaW50KSQyLCAkNCk7Ci0gICAgICAgICBpZiAobGVmRGF0YS0+YXJyYXlDdXRzVmFsID4gKGludCkkMikgewotICAgICAgICAgICAgLy8gTXVsaXRpcGxlIEFSUkFZQ1VUUyB2YWx1ZSBuZWVkcyB0byBtZSBpbiBhc2NlbmRpbmcgb3JkZXIgCi0gICAgICAgICAgICBpZiAoIWxlZkRhdGEtPmFycmF5Q3V0c1dhcikgewotICAgICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKQotICAgICAgICAgICAgICAgICAgbGVmV2FybmluZygyMDgwLCAiVGhlIG51bWJlciBvZiBjdXQgdmFsdWVzIGluIG11bHRpcGxlIEFSUkFZU1BBQ0lORyBBUlJBWUNVVFMgYXJlIG5vdCBpbiBpbmNyZWFzaW5nIG9yZGVyLlxuVG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSBkb2N1bWVudGF0aW9uLCB1cGRhdGUgdGhlIGN1dCB2YWx1ZXMgdG8gaW5jcmVhc2luZyBvcmRlci4iKTsKLSAgICAgICAgICAgICAgIGxlZkRhdGEtPmFycmF5Q3V0c1dhciA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICBsZWZEYXRhLT5hcnJheUN1dHNWYWwgPSAoaW50KSQyOwotICAgIH0KLQotc3Bfb3B0aW9uczoKLSAgS19QQVJBTExFTFJVTkxFTkdUSCBpbnRfbnVtYmVyCi0gICAgeyAKLSAgICAgIGlmIChsZWZEYXRhLT5oYXNJbmZsdWVuY2UpIHsgIC8vIDUuNSAtIElORkxVRU5DRSB0YWJsZSBtdXN0IGZvbGxvdyBhIFBBUkFMTEVMCi0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTU4OSwgIkFuIElORkxVRU5DRSB0YWJsZSBzdGF0ZW1lbnQgd2FzIGRlZmluZWQgYmVmb3JlIHRoZSBQQVJBTExFTFJVTkxFTkdUSCB0YWJsZSBzdGF0ZW1lbnQuXG5JTkZMVUVOQ0UgdGFibGUgc3RhdGVtZW50IHNob3VsZCBiZSBkZWZpbmVkIGZvbGxvd2luZyB0aGUgUEFSQUxMRUxSVU5MRU5HVEguXG5DaGFuZ2UgdGhlIExFRiBmaWxlIGFuZCByZXJ1biB0aGUgcGFyc2VyLiIpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChsZWZEYXRhLT5oYXNQYXJhbGxlbCkgeyAvLyA1LjUgLSBPbmx5IG9uZSBQQVJBTExFTCB0YWJsZSBpcyBhbGxvd2VkIHBlciBsYXllcgotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE1OTAsICJUaGVyZSBpcyBtdWx0aXBsZSBQQVJBTExFTFJVTkxFTkdUSCB0YWJsZSBzdGF0ZW1lbnRzIGFyZSBkZWZpbmVkIHdpdGhpbiBhIGxheWVyLlxuQWNjb3JkaW5nIHRvIHRoZSBMRUYgUmVmZXJlbmNlIE1hbnVhbCwgb25seSBvbmUgUEFSQUxMRUxSVU5MRU5HVEggdGFibGUgc3RhdGVtZW50IGlzIGFsbG93ZWQgcGVyIGxheWVyLiIpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSBsZWZEYXRhLT5sZWZyTGF5ZXIuYWRkTnVtYmVyKCQyKTsKLSAgICAgIGxlZkRhdGEtPmhhc1BhcmFsbGVsID0gMTsKLSAgICB9Ci0gICAgaW50X251bWJlcl9saXN0Ci0gICAgewotICAgICAgbGVmRGF0YS0+c3BQYXJhbGxlbExlbmd0aCA9IGxlZkRhdGEtPmxlZnJMYXllci5nZXROdW1iZXIoKTsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSBsZWZEYXRhLT5sZWZyTGF5ZXIuYWRkU3BQYXJhbGxlbExlbmd0aCgpOwotICAgIH0KLSAgICBLX1dJRFRIIGludF9udW1iZXIKLSAgICB7IAotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsKLSAgICAgICAgIGxlZkRhdGEtPmxlZnJMYXllci5hZGRTcFBhcmFsbGVsV2lkdGgoJDcpOwotICAgICAgfQotICAgIH0KLSAgICBpbnRfbnVtYmVyX2xpc3QKLSAgICB7IAotICAgICAgaWYgKGxlZkRhdGEtPmxlZnJMYXllci5nZXROdW1iZXIoKSAhPSBsZWZEYXRhLT5zcFBhcmFsbGVsTGVuZ3RoKSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgewotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE1OTEsICJUaGUgbnVtYmVyIG9mIGxlbmd0aCBpbiB0aGUgUEFSQUxMRUxSVU5MRU5HVEggc3RhdGVtZW50IGlzIG5vdCBlcXVhbCB0b1xudGhlIHRvdGFsIG51bWJlciBvZiBzcGFjaW5ncyBkZWZpbmVkIGluIHRoZSBXSURUSCBzdGF0ZW1lbnQgaW4gdGhlIFNQQUNJTkdUQUJMRS4iKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgbGVmRGF0YS0+bGVmckxheWVyLmFkZFNwUGFyYWxsZWxXaWR0aFNwYWNpbmcoKTsKLSAgICB9Ci0gICAgbGF5ZXJfc3BfcGFyYWxsZWxfd2lkdGhzCi0KLSAgfCBLX1RXT1dJRFRIUyBLX1dJRFRIIGludF9udW1iZXIgbGF5ZXJfc3BfVHdvV2lkdGhzUFJMIGludF9udW1iZXIKLSAgICB7Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgbGVmRGF0YS0+bGVmckxheWVyLmFkZE51bWJlcigkNSk7Ci0gICAgfQotICAgIGludF9udW1iZXJfbGlzdAotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT5oYXNQYXJhbGxlbCkgeyAvLyA1LjcgLSBFaXRoZXIgUEFSQUxMRUwgT1IgVFdPV0lEVEhTIHBlciBsYXllcgotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE1OTIsICJBIFBBUkFMTEVMUlVOTEVOR1RIIHN0YXRlbWVudCB3YXMgYWxyZWFkeSBkZWZpbmVkIGluIHRoZSBsYXllci5cbkl0IGlzIFBBUkFMTEVMUlVOTEVOR1RIIG9yIFRXT1dJRFRIUyBpcyBhbGxvd2VkIHBlciBsYXllci4iKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobGVmRGF0YS0+aGFzVHdvV2lkdGhzKSB7IC8vIDUuNyAtIG9ubHkgMSBUV09XSURUSFMgcGVyIGxheWVyCi0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTU5MywgIkEgVFdPV0lEVEhTIHRhYmxlIHN0YXRlbWVudCB3YXMgYWxyZWFkeSBkZWZpbmVkIGluIHRoZSBsYXllci5cbk9ubHkgb25lIFRXT1dJRFRIUyBzdGF0ZW1lbnQgaXMgYWxsb3dlZCBwZXIgbGF5ZXIuIik7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIGxlZkRhdGEtPmxlZnJMYXllci5hZGRTcFR3b1dpZHRocygkMywgJDQpOwotICAgICAgbGVmRGF0YS0+aGFzVHdvV2lkdGhzID0gMTsKLSAgICB9Ci0gICAgbGF5ZXJfc3BfVHdvV2lkdGhzCi0gICAgewotICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjcpIHsKLSAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgIHNwcmludGYobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICJUV09XSURUSFMgaXMgYSB2ZXJzaW9uIDUuNyBvciBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICBsZWZFcnJvcigxNjk3LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgIENIS0VSUigpOwotICAgICAgfSAKLSAgICB9Ci0gIHwgS19JTkZMVUVOQ0UgS19XSURUSCBpbnRfbnVtYmVyIEtfV0lUSElOIGludF9udW1iZXIgS19TUEFDSU5HIGludF9udW1iZXIKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+aGFzSW5mbHVlbmNlKSB7ICAvLyA1LjUgLSBJTkZMVUVOQ0UgdGFibGUgbXVzdCBmb2xsb3cgYSBQQVJBTExFTAotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE1OTQsICJBIElORkxVRU5DRSB0YWJsZSBzdGF0ZW1lbnQgd2FzIGFscmVhZHkgZGVmaW5lZCBpbiB0aGUgbGF5ZXIuXG5Pbmx5IG9uZSBJTkZMVUVOQ0Ugc3RhdGVtZW50IGlzIGFsbG93ZWQgcGVyIGxheWVyLiIpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmICghbGVmRGF0YS0+aGFzUGFyYWxsZWwpIHsgIC8vIDUuNSAtIElORkxVRU5DRSBtdXN0IGZvbGxvdyBhIFBBUkFMTEVMCi0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTU5NSwgIkFuIElORkxVRU5DRSB0YWJsZSBzdGF0ZW1lbnQgd2FzIGFscmVhZHkgZGVmaW5lZCBiZWZvcmUgdGhlIGxheWVyLlxuSU5GTFVFTkNFIHN0YXRlbWVudCBoYXMgdG8gYmUgZGVmaW5lZCBhZnRlciB0aGUgUEFSQUxMRUxSVU5MRU5HVEggdGFibGUgc3RhdGVtZW50IGluIHRoZSBsYXllci4iKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgewotICAgICAgICAgbGVmRGF0YS0+bGVmckxheWVyLnNldEluZmx1ZW5jZSgpOwotICAgICAgICAgbGVmRGF0YS0+bGVmckxheWVyLmFkZFNwSW5mbHVlbmNlKCQzLCAkNSwgJDcpOwotICAgICAgfQotICAgIH0KLSAgICBsYXllcl9zcF9pbmZsdWVuY2Vfd2lkdGhzCi0KLWxheWVyX3NwYWNpbmd0YWJsZV9vcHRzOiAgICAgIC8vIDUuNyAKLSAgLy8gZW1wdHkgCi0gIHwgbGF5ZXJfc3BhY2luZ3RhYmxlX29wdCBsYXllcl9zcGFjaW5ndGFibGVfb3B0cwotCi1sYXllcl9zcGFjaW5ndGFibGVfb3B0OgotICBLX1dJVEhJTiBpbnRfbnVtYmVyIEtfU1BBQ0lORyBpbnRfbnVtYmVyCi0gIHsKLSAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykKLSAgICAgICBsZWZEYXRhLT5sZWZyTGF5ZXIuYWRkU3BhY2luZ1RhYmxlT3J0aG9XaXRoaW4oJDIsICQ0KTsKLSAgfQotCi1sYXllcl9lbmNsb3N1cmVfdHlwZV9vcHQ6IAotICAgIHskJCA9IChjaGFyKikiTlVMTCI7fSAgIC8vIGVtcHR5IAotICB8IEtfQUJPVkUgIHskJCA9IChjaGFyKikiQUJPVkUiO30KLSAgfCBLX0JFTE9XICB7JCQgPSAoY2hhciopIkJFTE9XIjt9Ci0KLWxheWVyX2VuY2xvc3VyZV93aWR0aF9vcHQ6ICAvLyBlbXB0eSAKLSAgfCBLX1dJRFRIIGludF9udW1iZXIKLSAgICB7Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgewotICAgICAgICAgbGVmRGF0YS0+bGVmckxheWVyLmFkZEVuY2xvc3VyZVdpZHRoKCQyKTsKLSAgICAgIH0KLSAgICB9Ci0gIGxheWVyX2VuY2xvc3VyZV93aWR0aF9leGNlcHRfb3B0Ci0gIHwgS19MRU5HVEggaW50X251bWJlciAgICAgICAgICAgICAgLy8gNS43IAotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS43KSB7Ci0gICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgIHNwcmludGYobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAiTEVOR1RIIGlzIGEgdmVyc2lvbiA1Ljcgb3IgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgIGxlZkVycm9yKDE2OTEsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICBDSEtFUlIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgewotICAgICAgICAgICAgbGVmRGF0YS0+bGVmckxheWVyLmFkZEVuY2xvc3VyZUxlbmd0aCgkMik7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotbGF5ZXJfZW5jbG9zdXJlX3dpZHRoX2V4Y2VwdF9vcHQ6IC8vIGVtcHR5IAotICB8IEtfRVhDRVBURVhUUkFDVVQgaW50X251bWJlciAgICAgICAvLyA1LjcgCi0gICAgewotICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjcpIHsKLSAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgc3ByaW50ZihsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICJFWENFUFRFWFRSQUNVVCBpcyBhIHZlcnNpb24gNS43IG9yIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICBsZWZFcnJvcigxNjkwLCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsKLSAgICAgICAgICAgIGxlZkRhdGEtPmxlZnJMYXllci5hZGRFbmNsb3N1cmVFeGNlcHRFQygkMik7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi1sYXllcl9wcmVmZXJlbmNsb3N1cmVfd2lkdGhfb3B0OiAgLy8gZW1wdHkgCi0gIHwgS19XSURUSCBpbnRfbnVtYmVyCi0gICAgewotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsKLSAgICAgICAgIGxlZkRhdGEtPmxlZnJMYXllci5hZGRQcmVmZXJFbmNsb3N1cmVXaWR0aCgkMik7Ci0gICAgICB9Ci0gICAgfQotICAgIAotbGF5ZXJfbWluaW11bWN1dF93aXRoaW46IC8vIGVtcHR5IAotICB8IEtfV0lUSElOIGludF9udW1iZXIKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNykgewotICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgc3ByaW50ZihsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgIk1JTklNVU1DVVQgV0lUSElOIGlzIGEgdmVyc2lvbiA1Ljcgb3IgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgbGVmRXJyb3IoMTcwMCwgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICBDSEtFUlIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgewotICAgICAgICAgICAgbGVmRGF0YS0+bGVmckxheWVyLmFkZE1pbmltdW1jdXRXaXRoaW4oJDIpOwotICAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotbGF5ZXJfbWluaW11bWN1dF9mcm9tOiAvLyBlbXB0eSAKLSAgfCBLX0ZST01BQk9WRQotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS41KSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAiRlJPTUFCT1ZFIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS41IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgbGVmRXJyb3IoMTU5NiwgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgICAgbGVmRGF0YS0+aGFzTGF5ZXJNaW5jdXQgPSAxOwotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspCi0gICAgICAgICBsZWZEYXRhLT5sZWZyTGF5ZXIuYWRkTWluaW11bWN1dENvbm5lY3QoKGNoYXIqKSJGUk9NQUJPVkUiKTsKLQotICAgIH0KLSAgfCBLX0ZST01CRUxPVwotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS41KSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAiRlJPTUJFTE9XIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS41IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgbGVmRXJyb3IoMTU5NywgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgICAgbGVmRGF0YS0+aGFzTGF5ZXJNaW5jdXQgPSAxOwotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspCi0gICAgICAgICBsZWZEYXRhLT5sZWZyTGF5ZXIuYWRkTWluaW11bWN1dENvbm5lY3QoKGNoYXIqKSJGUk9NQkVMT1ciKTsKLSAgICB9Ci0KLWxheWVyX21pbmltdW1jdXRfbGVuZ3RoOiAvLyBlbXB0eSAKLSAgfCBLX0xFTkdUSCBpbnRfbnVtYmVyIEtfV0lUSElOIGludF9udW1iZXIKLSAgICB7ICAgCi0gICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNSkgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgIkxFTkdUSCBXSVRISU4gc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjUgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICBsZWZFcnJvcigxNTk4LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKQotICAgICAgICAgbGVmRGF0YS0+bGVmckxheWVyLmFkZE1pbmltdW1jdXRMZW5nRGlzKCQyLCAkNCk7Ci0gICAgfQotCi1sYXllcl9taW5zdGVwX29wdGlvbnM6IC8vIGVtcHR5IAotICB8IGxheWVyX21pbnN0ZXBfb3B0aW9ucyBsYXllcl9taW5zdGVwX29wdGlvbiAgLy8gVXNlIGxlZnQgcmVjdXJzaW9ucyAKLQotbGF5ZXJfbWluc3RlcF9vcHRpb246Ci0gIGxheWVyX21pbnN0ZXBfdHlwZQotICB7Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIGxlZkRhdGEtPmxlZnJMYXllci5hZGRNaW5zdGVwVHlwZSgkMSk7Ci0gIH0KLSAgfCBLX0xFTkdUSFNVTSBpbnRfbnVtYmVyCi0gIHsKLSAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgbGVmRGF0YS0+bGVmckxheWVyLmFkZE1pbnN0ZXBMZW5ndGhzdW0oJDIpOwotICB9Ci0gIHwgS19NQVhFREdFUyBpbnRfbnVtYmVyICAgICAgICAgICAgICAgICAgLy8gNS43IAotICB7Ci0gICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjcpIHsKLSAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgc3ByaW50ZihsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICJNQVhFREdFUyBpcyBhIHZlcnNpb24gNS43IG9yIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICBsZWZFcnJvcigxNzEwLCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgQ0hLRVJSKCk7Ci0gICAgfSBlbHNlCi0gICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIGxlZkRhdGEtPmxlZnJMYXllci5hZGRNaW5zdGVwTWF4ZWRnZXMoKGludCkkMik7Ci0gIH0KLQotbGF5ZXJfbWluc3RlcF90eXBlOgotICBLX0lOU0lERUNPUk5FUiB7JCQgPSAoY2hhciopIklOU0lERUNPUk5FUiI7fQotICB8IEtfT1VUU0lERUNPUk5FUiB7JCQgPSAoY2hhciopIk9VVFNJREVDT1JORVIiO30KLSAgfCBLX1NURVAgeyQkID0gKGNoYXIqKSJTVEVQIjt9Ci0KLWxheWVyX2FudGVubmFfcHdsOgotICBpbnRfbnVtYmVyCi0gICAgICB7IGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKQotICAgICAgICAgIGxlZkRhdGEtPmxlZnJMYXllci5zZXRBbnRlbm5hVmFsdWUobGVmRGF0YS0+YW50ZW5uYVR5cGUsICQxKTsgfQotICB8IEtfUFdMICcoJyBwdCBwdAotICAgICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyByZXF1aXJlIG1pbiAyIHBvaW50cywgc2V0IHRoZSAxc3QgMiAKLSAgICAgICAgICBpZiAobGVmRGF0YS0+bGVmckFudGVubmFQV0xQdHIpIHsKLSAgICAgICAgICAgIGxlZkRhdGEtPmxlZnJBbnRlbm5hUFdMUHRyLT5EZXN0cm95KCk7Ci0gICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPmxlZnJBbnRlbm5hUFdMUHRyKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBsZWZEYXRhLT5sZWZyQW50ZW5uYVBXTFB0ciA9IGxlZmlBbnRlbm5hUFdMOjpjcmVhdGUoKTsKLSAgICAgICAgICBsZWZEYXRhLT5sZWZyQW50ZW5uYVBXTFB0ci0+YWRkQW50ZW5uYVBXTCgkMy54LCAkMy55KTsKLSAgICAgICAgICBsZWZEYXRhLT5sZWZyQW50ZW5uYVBXTFB0ci0+YWRkQW50ZW5uYVBXTCgkNC54LCAkNC55KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIGxheWVyX2RpZmZ1c2lvbl9yYXRpb3MgJyknCi0gICAgICB7IAotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgewotICAgICAgICAgIGxlZkRhdGEtPmxlZnJMYXllci5zZXRBbnRlbm5hUFdMKGxlZkRhdGEtPmFudGVubmFUeXBlLCBsZWZEYXRhLT5sZWZyQW50ZW5uYVBXTFB0cik7Ci0gICAgICAgICAgbGVmRGF0YS0+bGVmckFudGVubmFQV0xQdHIgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICB9Ci0KLWxheWVyX2RpZmZ1c2lvbl9yYXRpb3M6IC8vIGVtcHR5IAotICB8IGxheWVyX2RpZmZ1c2lvbl9yYXRpb3MgbGF5ZXJfZGlmZnVzaW9uX3JhdGlvICAvLyBVc2UgbGVmdCByZWN1cnNpb25zIAotICA7Ci0KLWxheWVyX2RpZmZ1c2lvbl9yYXRpbzoKLSAgcHQKLSAgeyBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykKLSAgICAgIGxlZkRhdGEtPmxlZnJBbnRlbm5hUFdMUHRyLT5hZGRBbnRlbm5hUFdMKCQxLngsICQxLnkpOwotICB9Ci0KLWxheWVyX2FudGVubmFfZHVvOiAvLyBlbXB0eSAKLSAgfCBLX0RJRkZVU0VPTkxZCi0gICAgICB7IAotICAgICAgICBsZWZEYXRhLT51c2U1XzQgPSAxOwotICAgICAgICBpZiAobGVmRGF0YS0+aWdub3JlVmVyc2lvbikgewotICAgICAgICAgICAvLyBkbyBub3RoaW5nIAotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKChsZWZEYXRhLT5hbnRlbm5hVHlwZSA9PSBsZWZpQW50ZW5uYUFGKSAmJiAobGVmRGF0YS0+dmVyc2lvbk51bSA8PSA1LjMpKSB7Ci0gICAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAgICAgIkFOVEVOTkFBUkVBRkFDVE9SIHdpdGggRElGRlVTRU9OTFkgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICAgIGxlZkVycm9yKDE1OTksIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPnVzZTVfMykgewotICAgICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICAgIGlmIChsZWZEYXRhLT5sYXllcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TGF5ZXJXYXJuaW5ncykgewotICAgICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAgICJBTlRFTk5BQVJFQUZBQ1RPUiB3aXRoIERJRkZVU0VPTkxZIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgICBsZWZFcnJvcigxNTk5LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykKLSAgICAgICAgICBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0QW50ZW5uYURVTyhsZWZEYXRhLT5hbnRlbm5hVHlwZSk7Ci0gICAgICB9Ci0KLWxheWVyX3RhYmxlX3R5cGU6Ci0gIEtfUEVBSyAgICAgICB7JCQgPSAoY2hhciopIlBFQUsiO30KLSAgfCBLX0FWRVJBR0UgIHskJCA9IChjaGFyKikiQVZFUkFHRSI7fQotICB8IEtfUk1TICAgICAgeyQkID0gKGNoYXIqKSJSTVMiO30KLQotbGF5ZXJfZnJlcXVlbmN5OgotICBLX0ZSRVFVRU5DWSBOVU1CRVIKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSBsZWZEYXRhLT5sZWZyTGF5ZXIuYWRkTnVtYmVyKCQyKTsgfQotICBudW1iZXJfbGlzdCAnOycKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSBsZWZEYXRhLT5sZWZyTGF5ZXIuYWRkQWNGcmVxdWVuY3koKTsgfQotICBhY19sYXllcl90YWJsZV9vcHQKLSAgS19UQUJMRUVOVFJJRVMgTlVNQkVSCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgbGVmRGF0YS0+bGVmckxheWVyLmFkZE51bWJlcigkOSk7IH0KLSAgICBudW1iZXJfbGlzdCAnOycKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSBsZWZEYXRhLT5sZWZyTGF5ZXIuYWRkQWNUYWJsZUVudHJ5KCk7IH0KLQotYWNfbGF5ZXJfdGFibGVfb3B0OiAgLy8gZW1wdHkgCi0gIHwgS19DVVRBUkVBIE5VTUJFUgotICAgIHsKLSAgICAgIGlmICghbGVmRGF0YS0+bGF5ZXJDdXQpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5sYXllcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TGF5ZXJXYXJuaW5ncykgewotICAgICAgICAgICAgICBsZWZFcnJvcigxNjAwLCAiQ1VUQVJFQSBzdGF0ZW1lbnQgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgQ1VULiIpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSBsZWZEYXRhLT5sZWZyTGF5ZXIuYWRkTnVtYmVyKCQyKTsKLSAgICB9Ci0gICAgbnVtYmVyX2xpc3QgJzsnCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgbGVmRGF0YS0+bGVmckxheWVyLmFkZEFjQ3V0YXJlYSgpOyB9Ci0gIHwgS19XSURUSCBpbnRfbnVtYmVyCi0gICAgewotICAgICAgaWYgKCFsZWZEYXRhLT5sYXllclJvdXQpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5sYXllcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TGF5ZXJXYXJuaW5ncykgewotICAgICAgICAgICAgICBsZWZFcnJvcigxNjAxLCAiV0lEVEggY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBMQVlFUiB3aXRoIFRZUEUgUk9VVElORy4iKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgbGVmRGF0YS0+bGVmckxheWVyLmFkZE51bWJlcigkMik7Ci0gICAgfQotICAgIGludF9udW1iZXJfbGlzdCAnOycKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSBsZWZEYXRhLT5sZWZyTGF5ZXIuYWRkQWNXaWR0aCgpOyB9Ci0KLWRjX2xheWVyX3RhYmxlOgotICBLX1RBQkxFRU5UUklFUyBpbnRfbnVtYmVyCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgbGVmRGF0YS0+bGVmckxheWVyLmFkZE51bWJlcigkMik7IH0KLSAgICBpbnRfbnVtYmVyX2xpc3QgJzsnCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgbGVmRGF0YS0+bGVmckxheWVyLmFkZERjVGFibGVFbnRyeSgpOyB9Ci0KLWludF9udW1iZXJfbGlzdDoKLSAgfCBpbnRfbnVtYmVyX2xpc3QgaW50X251bWJlcgotICAgIHsgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIGxlZkRhdGEtPmxlZnJMYXllci5hZGROdW1iZXIoJDIpOyB9Ci0KLW51bWJlcl9saXN0OgotICB8IG51bWJlcl9saXN0IE5VTUJFUgotICAgIHsgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIGxlZkRhdGEtPmxlZnJMYXllci5hZGROdW1iZXIoJDIpOyB9Ci0KLWxheWVyX3Byb3BfbGlzdDoKLSAgbGF5ZXJfcHJvcAotICB8IGxheWVyX3Byb3BfbGlzdCBsYXllcl9wcm9wCi0gIDsKLQotbGF5ZXJfcHJvcDoKLSAgVF9TVFJJTkcgVF9TVFJJTkcKLSAgICB7Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgewotICAgICAgICBjaGFyIHByb3BUcDsKLSAgICAgICAgcHJvcFRwID0gbGVmU2V0dGluZ3MtPmxlZlByb3BzLmxlZnJMYXllclByb3AucHJvcFR5cGUoJDEpOwotICAgICAgICBsZWZEYXRhLT5sZWZyTGF5ZXIuYWRkUHJvcCgkMSwgJDIsIHByb3BUcCk7Ci0gICAgICB9Ci0gICAgfQotICB8IFRfU1RSSU5HIFFTVFJJTkcKLSAgICB7Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgewotICAgICAgICBjaGFyIHByb3BUcDsKLSAgICAgICAgcHJvcFRwID0gbGVmU2V0dGluZ3MtPmxlZlByb3BzLmxlZnJMYXllclByb3AucHJvcFR5cGUoJDEpOwotICAgICAgICBsZWZEYXRhLT5sZWZyTGF5ZXIuYWRkUHJvcCgkMSwgJDIsIHByb3BUcCk7Ci0gICAgICB9Ci0gICAgfQotICB8IFRfU1RSSU5HIE5VTUJFUgotICAgIHsKLSAgICAgIGNoYXIgdGVtcFszMl07Ci0gICAgICBzcHJpbnRmKHRlbXAsICIlLjExZyIsICQyKTsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7Ci0gICAgICAgIGNoYXIgcHJvcFRwOwotICAgICAgICBwcm9wVHAgPSBsZWZTZXR0aW5ncy0+bGVmUHJvcHMubGVmckxheWVyUHJvcC5wcm9wVHlwZSgkMSk7Ci0gICAgICAgIGxlZkRhdGEtPmxlZnJMYXllci5hZGROdW1Qcm9wKCQxLCAkMiwgdGVtcCwgcHJvcFRwKTsKLSAgICAgIH0KLSAgICB9Ci0KLWN1cnJlbnRfZGVuc2l0eV9wd2xfbGlzdCA6Ci0gIGN1cnJlbnRfZGVuc2l0eV9wd2wKLSAgICB7IH0KLSAgfCBjdXJyZW50X2RlbnNpdHlfcHdsX2xpc3QgY3VycmVudF9kZW5zaXR5X3B3bAotICAgIHsgfQotCi1jdXJyZW50X2RlbnNpdHlfcHdsOiAnKCcgaW50X251bWJlciBpbnRfbnVtYmVyICcpJwotICAgIHsgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIGxlZkRhdGEtPmxlZnJMYXllci5zZXRDdXJyZW50UG9pbnQoJDIsICQzKTsgfQotCi1jYXBfcG9pbnRzIDoKLSAgY2FwX3BvaW50Ci0gIHwgY2FwX3BvaW50cyBjYXBfcG9pbnQKLSAgOwotCi1jYXBfcG9pbnQ6ICcoJyBpbnRfbnVtYmVyIGludF9udW1iZXIgJyknCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgbGVmRGF0YS0+bGVmckxheWVyLnNldENhcGFjaXRhbmNlUG9pbnQoJDIsICQzKTsgfQotCi1yZXNfcG9pbnRzIDoKLSAgcmVzX3BvaW50Ci0gIHwgcmVzX3BvaW50cyByZXNfcG9pbnQKLSAgICB7IH0KLQotcmVzX3BvaW50OiAnKCcgaW50X251bWJlciBpbnRfbnVtYmVyICcpJwotICAgIHsgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIGxlZkRhdGEtPmxlZnJMYXllci5zZXRSZXNpc3RhbmNlUG9pbnQoJDIsICQzKTsgfQotCi1sYXllcl90eXBlOgotICBLX1JPVVRJTkcgICAgICAgeyQkID0gKGNoYXIqKSJST1VUSU5HIjsgbGVmRGF0YS0+bGF5ZXJSb3V0ID0gMTt9Ci0gIHwgS19DVVQgICAgICAgICB7JCQgPSAoY2hhciopIkNVVCI7IGxlZkRhdGEtPmxheWVyQ3V0ID0gMTt9Ci0gIHwgS19PVkVSTEFQICAgICB7JCQgPSAoY2hhciopIk9WRVJMQVAiOyBsZWZEYXRhLT5sYXllck1hc3RPdmVyID0gMTt9Ci0gIHwgS19NQVNURVJTTElDRSB7JCQgPSAoY2hhciopIk1BU1RFUlNMSUNFIjsgbGVmRGF0YS0+bGF5ZXJNYXN0T3ZlciA9IDE7fQotICB8IEtfVklSVFVBTCAgICAgeyQkID0gKGNoYXIqKSJWSVJUVUFMIjt9Ci0gIHwgS19JTVBMQU5UICAgICB7JCQgPSAoY2hhciopIklNUExBTlQiO30KLQotbGF5ZXJfZGlyZWN0aW9uOgotICBLX0hPUklaT05UQUwgICAgICB7JCQgPSAoY2hhciopIkhPUklaT05UQUwiO30KLSAgfCAgS19WRVJUSUNBTCAgICAgeyQkID0gKGNoYXIqKSJWRVJUSUNBTCI7fQotICB8ICBLX0RJQUc0NSAgICAgICB7JCQgPSAoY2hhciopIkRJQUc0NSI7fQotICB8ICBLX0RJQUcxMzUgICAgICB7JCQgPSAoY2hhciopIkRJQUcxMzUiO30KLQotbGF5ZXJfbWluZW5fd2lkdGg6Ci0gIHwgS19XSURUSCBpbnRfbnVtYmVyCi0gICAgewotICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKQotICAgICAgIGxlZkRhdGEtPmxlZnJMYXllci5hZGRNaW5lbmNsb3NlZGFyZWFXaWR0aCgkMik7Ci0gICAgfQotCi1sYXllcl9veGlkZToKLSAgS19PWElERTEKLSAgICB7Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspCi0gICAgICAgbGVmRGF0YS0+bGVmckxheWVyLmFkZEFudGVubmFNb2RlbCgxKTsKLSAgICB9Ci0gIHwgS19PWElERTIKLSAgICB7Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspCi0gICAgICAgbGVmRGF0YS0+bGVmckxheWVyLmFkZEFudGVubmFNb2RlbCgyKTsKLSAgICB9Ci0gIHwgS19PWElERTMKLSAgICB7Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspCi0gICAgICAgbGVmRGF0YS0+bGVmckxheWVyLmFkZEFudGVubmFNb2RlbCgzKTsKLSAgICB9Ci0gIHwgS19PWElERTQKLSAgICB7Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspCi0gICAgICAgbGVmRGF0YS0+bGVmckxheWVyLmFkZEFudGVubmFNb2RlbCg0KTsKLSAgICB9Ci0KLWxheWVyX3NwX3BhcmFsbGVsX3dpZHRoczogLy8gZW1wdHkgCi0gICAgeyB9Ci0gIHwgbGF5ZXJfc3BfcGFyYWxsZWxfd2lkdGhzIGxheWVyX3NwX3BhcmFsbGVsX3dpZHRoICAvLyBVc2UgbGVmdCByZWN1cnNpb25zIAotICAgIHsgfQotCi1sYXllcl9zcF9wYXJhbGxlbF93aWR0aDogS19XSURUSCBpbnRfbnVtYmVyCi0gICAgeyAKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7Ci0gICAgICAgICBsZWZEYXRhLT5sZWZyTGF5ZXIuYWRkU3BQYXJhbGxlbFdpZHRoKCQyKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaW50X251bWJlcl9saXN0Ci0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgbGVmRGF0YS0+bGVmckxheWVyLmFkZFNwUGFyYWxsZWxXaWR0aFNwYWNpbmcoKTsgfQotIAotbGF5ZXJfc3BfVHdvV2lkdGhzOiAvLyBlbXB0eSAgICAgICAgICAgICAgIC8vIDUuNwotICAgIHsgfQotICB8IGxheWVyX3NwX1R3b1dpZHRoIGxheWVyX3NwX1R3b1dpZHRocwotICAgIHsgfQotICAgIAotbGF5ZXJfc3BfVHdvV2lkdGg6IEtfV0lEVEggaW50X251bWJlciBsYXllcl9zcF9Ud29XaWR0aHNQUkwgaW50X251bWJlcgotICAgIHsKLSAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgbGVmRGF0YS0+bGVmckxheWVyLmFkZE51bWJlcigkNCk7Ci0gICAgfQotICAgIGludF9udW1iZXJfbGlzdCAKLSAgICB7Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykKLSAgICAgICAgIGxlZkRhdGEtPmxlZnJMYXllci5hZGRTcFR3b1dpZHRocygkMiwgJDMpOwotICAgIH0KLQotbGF5ZXJfc3BfVHdvV2lkdGhzUFJMOiAgICAgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gICAgeyAKLSAgICAgICAgJCQgPSAtMTsgLy8gY2Fubm90IHVzZSAwLCBzaW5jZSBQUkwgbnVtYmVyIGNhbiBiZSAwIAotICAgICAgICBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0U3BUd29XaWR0aHNIYXNQUkwoMCk7Ci0gICAgfSAgICAgICAgICAgCi0gIHwgS19QUkwgaW50X251bWJlcgotICAgIHsgCi0gICAgICAgICQkID0gJDI7IAotICAgICAgICBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0U3BUd29XaWR0aHNIYXNQUkwoMSk7Ci0gICAgfQotIAotbGF5ZXJfc3BfaW5mbHVlbmNlX3dpZHRoczogLy8gZW1wdHkgCi0gICAgeyB9Ci0gIHwgbGF5ZXJfc3BfaW5mbHVlbmNlX3dpZHRocyBsYXllcl9zcF9pbmZsdWVuY2Vfd2lkdGgKLSAgICB7IH0KLQotbGF5ZXJfc3BfaW5mbHVlbmNlX3dpZHRoOiBLX1dJRFRIIGludF9udW1iZXIgS19XSVRISU4gaW50X251bWJlciBLX1NQQUNJTkcgaW50X251bWJlcgotICAgIHsgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIGxlZkRhdGEtPmxlZnJMYXllci5hZGRTcEluZmx1ZW5jZSgkMiwgJDQsICQ2KTsgfQotCi1tYXhzdGFja192aWE6IEtfTUFYVklBU1RBQ0sgaW50X251bWJlciAnOycKLSAgICB7Ci0gICAgICBpZiAoIWxlZkRhdGEtPmxlZnJIYXNMYXllcikgeyAgLy8gNS41IAotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5NYXhTdGFja1ZpYUNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgIGlmIChsZWZEYXRhLT5tYXhTdGFja1ZpYVdhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TWF4U3RhY2tWaWFXYXJuaW5ncykgewotICAgICAgICAgICAgIGxlZkVycm9yKDE2MDIsICJNQVhWSUFTVEFDSyBzdGF0ZW1lbnQgaGFzIHRvIGJlIGRlZmluZWQgYWZ0ZXIgdGhlIExBWUVSIHN0YXRlbWVudC4iKTsKLSAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPmxlZnJIYXNNYXhWUykgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5NYXhTdGFja1ZpYUNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgIGlmIChsZWZEYXRhLT5tYXhTdGFja1ZpYVdhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TWF4U3RhY2tWaWFXYXJuaW5ncykgewotICAgICAgICAgICAgIGxlZkVycm9yKDE2MDMsICJBIE1BWFZJQVNUQUNLIHdhcyBhbHJlYWR5IGRlZmluZWQuXG5Pbmx5IG9uZSBNQVhWSUFTVEFDSyBpcyBhbGxvd2VkIHBlciBsZWYgZmlsZS4iKTsKLSAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5NYXhTdGFja1ZpYUNiaykgewotICAgICAgICAgICBsZWZEYXRhLT5sZWZyTWF4U3RhY2tWaWEuc2V0TWF4U3RhY2tWaWEoKGludCkkMik7Ci0gICAgICAgICAgIENBTExCQUNLKGxlZkNhbGxiYWNrcy0+TWF4U3RhY2tWaWFDYmssIGxlZnJNYXhTdGFja1ZpYUNia1R5cGUsICZsZWZEYXRhLT5sZWZyTWF4U3RhY2tWaWEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNSkgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5NYXhTdGFja1ZpYUNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgIGlmIChsZWZEYXRhLT5tYXhTdGFja1ZpYVdhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TWF4U3RhY2tWaWFXYXJuaW5ncykgewotICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICJNQVhWSUFTVEFDSyBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNSBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTYwNCwgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBsZWZEYXRhLT5sZWZySGFzTWF4VlMgPSAxOwotICAgIH0KLSAgfCBLX01BWFZJQVNUQUNLIGludF9udW1iZXIgS19SQU5HRSB7bGVmRGF0YS0+bGVmRHVtYk1vZGUgPSAyOyBsZWZEYXRhLT5sZWZOb051bT0gMjt9Ci0gICAgVF9TVFJJTkcgVF9TVFJJTkcgJzsnCi0gICAgewotICAgICAgaWYgKCFsZWZEYXRhLT5sZWZySGFzTGF5ZXIpIHsgIC8vIDUuNSAKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TWF4U3RhY2tWaWFDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+bWF4U3RhY2tWaWFXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPk1heFN0YWNrVmlhV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTYwMiwgIk1BWFZJQVNUQUNLIHN0YXRlbWVudCBoYXMgdG8gYmUgZGVmaW5lZCBhZnRlciB0aGUgTEFZRVIgc3RhdGVtZW50LiIpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPmxlZnJIYXNNYXhWUykgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5NYXhTdGFja1ZpYUNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgIGlmIChsZWZEYXRhLT5tYXhTdGFja1ZpYVdhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TWF4U3RhY2tWaWFXYXJuaW5ncykgewotICAgICAgICAgICAgIGxlZkVycm9yKDE2MDMsICJBIE1BWFZJQVNUQUNLIHdhcyBhbHJlYWR5IGRlZmluZWQuXG5Pbmx5IG9uZSBNQVhWSUFTVEFDSyBpcyBhbGxvd2VkIHBlciBsZWYgZmlsZS4iKTsKLSAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5NYXhTdGFja1ZpYUNiaykgewotICAgICAgICAgICBsZWZEYXRhLT5sZWZyTWF4U3RhY2tWaWEuc2V0TWF4U3RhY2tWaWEoKGludCkkMik7Ci0gICAgICAgICAgIGxlZkRhdGEtPmxlZnJNYXhTdGFja1ZpYS5zZXRNYXhTdGFja1ZpYVJhbmdlKCQ1LCAkNik7Ci0gICAgICAgICAgIENBTExCQUNLKGxlZkNhbGxiYWNrcy0+TWF4U3RhY2tWaWFDYmssIGxlZnJNYXhTdGFja1ZpYUNia1R5cGUsICZsZWZEYXRhLT5sZWZyTWF4U3RhY2tWaWEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBsZWZEYXRhLT5sZWZySGFzTWF4VlMgPSAxOwotICAgIH0KLQotdmlhOiBzdGFydF92aWEgIHsgbGVmRGF0YS0+aGFzVmlhUnVsZV9sYXllciA9IDA7IH0gdmlhX29wdGlvbiBlbmRfdmlhCi0gICAgeyAKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPlZpYUNiaykgewotICAgICAgICBpZiAobGVmRGF0YS0+bmRSdWxlKSAKLSAgICAgICAgICAgIGxlZkRhdGEtPm5kLT5hZGRWaWFSdWxlKCZsZWZEYXRhLT5sZWZyVmlhKTsKLSAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICBDQUxMQkFDSyhsZWZDYWxsYmFja3MtPlZpYUNiaywgbGVmclZpYUNia1R5cGUsICZsZWZEYXRhLT5sZWZyVmlhKTsKLSAgICAgICB9Ci0gICAgfQotCi12aWFfa2V5d29yZCA6IEtfVklBICAgICAgICAgICAgICAgICAvL25lZWRlZCB0byBoYXZlIGEgVklBIG5hbWVkIHZpYQotICAgICB7IGxlZkRhdGEtPmxlZkR1bWJNb2RlID0gMTsgbGVmRGF0YS0+bGVmTm9OdW0gPSAxOyB9Ci0KLXN0YXJ0X3ZpYTogdmlhX2tleXdvcmQgVF9TVFJJTkcgCi0gICAgewotICAgICAgLy8gMCBpcyBub2RlZmF1bHQgCi0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5WaWFDYmspIGxlZkRhdGEtPmxlZnJWaWEuc2V0TmFtZSgkMiwgMCk7Ci0gICAgICBsZWZEYXRhLT52aWFMYXllciA9IDA7Ci0gICAgICBsZWZEYXRhLT5udW1WaWErKzsKLSAgICAgIC8vc3RyY3B5KGxlZkRhdGEtPnZpYU5hbWUsICQyKTsKLSAgICAgIGxlZkRhdGEtPnZpYU5hbWUgPSBzdHJkdXAoJDIpOwotICAgIH0KLSAgfCB2aWFfa2V5d29yZCBUX1NUUklORyBLX0RFRkFVTFQKLSAgICB7Ci0gICAgICAvLyAxIGlzIGRlZmF1bHQgCi0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5WaWFDYmspIGxlZkRhdGEtPmxlZnJWaWEuc2V0TmFtZSgkMiwgMSk7Ci0gICAgICBsZWZEYXRhLT52aWFMYXllciA9IDA7Ci0gICAgICAvL3N0cmNweShsZWZEYXRhLT52aWFOYW1lLCAkMik7Ci0gICAgICBsZWZEYXRhLT52aWFOYW1lID0gc3RyZHVwKCQyKTsKLSAgICB9Ci0gIHwgdmlhX2tleXdvcmQgVF9TVFJJTkcgS19HRU5FUkFURUQKLSAgICB7Ci0gICAgICAvLyAyIGlzIGdlbmVyYXRlZCAKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPlZpYUNiaykgbGVmRGF0YS0+bGVmclZpYS5zZXROYW1lKCQyLCAyKTsKLSAgICAgIGxlZkRhdGEtPnZpYUxheWVyID0gMDsKLSAgICAgIC8vc3RyY3B5KGxlZkRhdGEtPnZpYU5hbWUsICQyKTsKLSAgICAgIGxlZkRhdGEtPnZpYU5hbWUgPSBzdHJkdXAoJDIpOwotICAgIH0KLQotdmlhX3ZpYXJ1bGU6IEtfVklBUlVMRSB7bGVmRGF0YS0+bGVmRHVtYk1vZGUgPSAxOyBsZWZEYXRhLT5sZWZOb051bSA9IDE7IH0gVF9TVFJJTkcgJzsnCi0gIEtfQ1VUU0laRSBpbnRfbnVtYmVyIGludF9udW1iZXIgJzsnCi0gIEtfTEFZRVJTIHtsZWZEYXRhLT5sZWZEdW1iTW9kZSA9IDM7IGxlZkRhdGEtPmxlZk5vTnVtID0gMTsgfSBUX1NUUklORyBUX1NUUklORyBUX1NUUklORyAnOycKLSAgS19DVVRTUEFDSU5HIGludF9udW1iZXIgaW50X251bWJlciAnOycKLSAgS19FTkNMT1NVUkUgaW50X251bWJlciBpbnRfbnVtYmVyIGludF9udW1iZXIgaW50X251bWJlciAnOycKLSAgICB7Ci0gICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjYpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlZpYUNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+dmlhUnVsZVdhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+VmlhUnVsZVdhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAgIlZJQVJVTEUgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjYgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE3MDksIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgfSAgZWxzZQotICAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlZpYUNiaykgbGVmRGF0YS0+bGVmclZpYS5zZXRWaWFSdWxlKCQzLCAkNiwgJDcsICQxMSwgJDEyLCAkMTMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICQxNiwgJDE3LCAkMjAsICQyMSwgJDIyLCAkMjMpOwotICAgICAgIGxlZkRhdGEtPnZpYUxheWVyKys7Ci0gICAgICAgbGVmRGF0YS0+aGFzVmlhUnVsZV9sYXllciA9IDE7Ci0gICAgfQotICB2aWFfdmlhcnVsZV9vcHRpb25zCi0gIDsKLQotdmlhX3ZpYXJ1bGVfb3B0aW9uczogLy8gZW1wdHkgCi0gIHwgdmlhX3ZpYXJ1bGVfb3B0aW9ucyB2aWFfdmlhcnVsZV9vcHRpb24KLSAgOwotCi12aWFfdmlhcnVsZV9vcHRpb246IEtfUk9XQ09MIGludF9udW1iZXIgaW50X251bWJlciAnOycKLSAgICB7Ci0gICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+VmlhQ2JrKSBsZWZEYXRhLT5sZWZyVmlhLnNldFJvd0NvbCgoaW50KSQyLCAoaW50KSQzKTsKLSAgICB9Ci0gIHwgS19PUklHSU4gaW50X251bWJlciBpbnRfbnVtYmVyICc7JwotICAgIHsKLSAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5WaWFDYmspIGxlZkRhdGEtPmxlZnJWaWEuc2V0T3JpZ2luKCQyLCAkMyk7Ci0gICAgfQotICB8IEtfT0ZGU0VUIGludF9udW1iZXIgaW50X251bWJlciBpbnRfbnVtYmVyIGludF9udW1iZXIgJzsnCi0gICAgewotICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlZpYUNiaykgbGVmRGF0YS0+bGVmclZpYS5zZXRPZmZzZXQoJDIsICQzLCAkNCwgJDUpOwotICAgIH0KLSAgfCBLX1BBVFRFUk4ge2xlZkRhdGEtPmxlZkR1bWJNb2RlID0gMTsgbGVmRGF0YS0+bGVmTm9OdW0gPSAxOyB9IFRfU1RSSU5HICc7JwotICAgIHsKLSAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5WaWFDYmspIGxlZkRhdGEtPmxlZnJWaWEuc2V0UGF0dGVybigkMyk7Ci0gICAgfQotICA7Ci0KLXZpYV9vcHRpb246IHZpYV92aWFydWxlCi0gIHwgdmlhX290aGVyX29wdGlvbnMKLQotdmlhX290aGVyX29wdGlvbnM6IHZpYV9vdGhlcl9vcHRpb24KLSAgdmlhX21vcmVfb3B0aW9ucwotCi12aWFfbW9yZV9vcHRpb25zOiAvLyBlbXB0eSAKLSAgfCB2aWFfbW9yZV9vcHRpb25zIHZpYV9vdGhlcl9vcHRpb24KLSAgOwotCi12aWFfb3RoZXJfb3B0aW9uOgotICB2aWFfZm9yZWlnbiAKLSAgICB7IH0KLSAgfCB2aWFfbGF5ZXJfcnVsZSAKLSAgICB7IH0KLSAgfCBLX1JFU0lTVEFOQ0UgaW50X251bWJlciAnOycKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPlZpYUNiaykgbGVmRGF0YS0+bGVmclZpYS5zZXRSZXNpc3RhbmNlKCQyKTsgfQotICB8IEtfUFJPUEVSVFkgeyBsZWZEYXRhLT5sZWZEdW1iTW9kZSA9IDEwMDAwMDA7IH0gdmlhX3Byb3BfbGlzdCAnOycKLSAgICB7IGxlZkRhdGEtPmxlZkR1bWJNb2RlID0gMDsKLSAgICB9Ci0gIHwgS19UT1BPRlNUQUNLT05MWQotICAgIHsgCi0gICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNikgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5WaWFDYmspIGxlZkRhdGEtPmxlZnJWaWEuc2V0VG9wT2ZTdGFjaygpOwotICAgICAgfSBlbHNlCi0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlZpYUNiaykgIC8vIHdyaXRlIHdhcm5pbmcgb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+dmlhV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5WaWFXYXJuaW5ncykKLSAgICAgICAgICAgICAgbGVmV2FybmluZygyMDE5LCAiVE9QT0ZTVEFDS09OTFkgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS42IG9yIGxhdGVyIik7Ci0gICAgfQotCi12aWFfcHJvcF9saXN0OgotICB2aWFfbmFtZV92YWx1ZV9wYWlyCi0gIHwgdmlhX3Byb3BfbGlzdCB2aWFfbmFtZV92YWx1ZV9wYWlyCi0gIDsKLQotdmlhX25hbWVfdmFsdWVfcGFpcjoKLSAgVF9TVFJJTkcgTlVNQkVSCi0gICAgeyAKLSAgICAgIGNoYXIgdGVtcFszMl07Ci0gICAgICBzcHJpbnRmKHRlbXAsICIlLjExZyIsICQyKTsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPlZpYUNiaykgewotICAgICAgICAgY2hhciBwcm9wVHA7Ci0gICAgICAgICBwcm9wVHAgPSBsZWZTZXR0aW5ncy0+bGVmUHJvcHMubGVmclZpYVByb3AucHJvcFR5cGUoJDEpOwotICAgICAgICAgbGVmRGF0YS0+bGVmclZpYS5hZGROdW1Qcm9wKCQxLCAkMiwgdGVtcCwgcHJvcFRwKTsKLSAgICAgIH0KLSAgICB9Ci0gIHwgVF9TVFJJTkcgUVNUUklORwotICAgIHsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPlZpYUNiaykgewotICAgICAgICAgY2hhciBwcm9wVHA7Ci0gICAgICAgICBwcm9wVHAgPSBsZWZTZXR0aW5ncy0+bGVmUHJvcHMubGVmclZpYVByb3AucHJvcFR5cGUoJDEpOwotICAgICAgICAgbGVmRGF0YS0+bGVmclZpYS5hZGRQcm9wKCQxLCAkMiwgcHJvcFRwKTsKLSAgICAgIH0KLSAgICB9Ci0gIHwgVF9TVFJJTkcgVF9TVFJJTkcKLSAgICB7Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5WaWFDYmspIHsKLSAgICAgICAgIGNoYXIgcHJvcFRwOwotICAgICAgICAgcHJvcFRwID0gbGVmU2V0dGluZ3MtPmxlZlByb3BzLmxlZnJWaWFQcm9wLnByb3BUeXBlKCQxKTsKLSAgICAgICAgIGxlZkRhdGEtPmxlZnJWaWEuYWRkUHJvcCgkMSwgJDIsIHByb3BUcCk7Ci0gICAgICB9Ci0gICAgfQotCi12aWFfZm9yZWlnbjoKLSAgc3RhcnRfZm9yZWlnbiAnOycKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNikgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5WaWFDYmspIGxlZkRhdGEtPmxlZnJWaWEuc2V0Rm9yZWlnbigkMSwgMCwgMC4wLCAwLjAsIC0xKTsKLSAgICAgIH0gZWxzZQotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5WaWFDYmspICAvLyB3cml0ZSB3YXJuaW5nIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPnZpYVdhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+VmlhV2FybmluZ3MpCi0gICAgICAgICAgICAgbGVmV2FybmluZygyMDIwLCAiRk9SRUlHTiBzdGF0ZW1lbnQgaW4gVklBIGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS42IG9yIGxhdGVyLiIpOwotICAgIH0KLSAgfCBzdGFydF9mb3JlaWduIHB0ICc7JwotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS42KSB7Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlZpYUNiaykgbGVmRGF0YS0+bGVmclZpYS5zZXRGb3JlaWduKCQxLCAxLCAkMi54LCAkMi55LCAtMSk7Ci0gICAgICB9IGVsc2UKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+VmlhQ2JrKSAgLy8gd3JpdGUgd2FybmluZyBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgIGlmIChsZWZEYXRhLT52aWFXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPlZpYVdhcm5pbmdzKQotICAgICAgICAgICAgIGxlZldhcm5pbmcoMjAyMCwgIkZPUkVJR04gc3RhdGVtZW50IGluIFZJQSBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNiBvciBsYXRlci4iKTsKLSAgICB9Ci0gIHwgc3RhcnRfZm9yZWlnbiBwdCBvcmllbnRhdGlvbiAnOycKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNikgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5WaWFDYmspIGxlZkRhdGEtPmxlZnJWaWEuc2V0Rm9yZWlnbigkMSwgMSwgJDIueCwgJDIueSwgJDMpOwotICAgICAgfSBlbHNlCi0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlZpYUNiaykgIC8vIHdyaXRlIHdhcm5pbmcgb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+dmlhV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5WaWFXYXJuaW5ncykKLSAgICAgICAgICAgICBsZWZXYXJuaW5nKDIwMjAsICJGT1JFSUdOIHN0YXRlbWVudCBpbiBWSUEgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjYgb3IgbGF0ZXIuIik7Ci0gICAgfQotICB8IHN0YXJ0X2ZvcmVpZ24gb3JpZW50YXRpb24gJzsnCi0gICAgewotICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjYpIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+VmlhQ2JrKSBsZWZEYXRhLT5sZWZyVmlhLnNldEZvcmVpZ24oJDEsIDAsIDAuMCwgMC4wLCAkMik7Ci0gICAgICB9IGVsc2UKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+VmlhQ2JrKSAgLy8gd3JpdGUgd2FybmluZyBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgIGlmIChsZWZEYXRhLT52aWFXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPlZpYVdhcm5pbmdzKQotICAgICAgICAgICAgIGxlZldhcm5pbmcoMjAyMCwgIkZPUkVJR04gc3RhdGVtZW50IGluIFZJQSBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNiBvciBsYXRlci4iKTsKLSAgICB9Ci0KLXN0YXJ0X2ZvcmVpZ246ICAgICAgICBLX0ZPUkVJR04ge2xlZkRhdGEtPmxlZkR1bWJNb2RlID0gMTsgbGVmRGF0YS0+bGVmTm9OdW09IDE7fSBUX1NUUklORwotICAgIHsgJCQgPSAkMzsgfQotCi1vcmllbnRhdGlvbjoKLSAgS19OICAgICAgICAgeyQkID0gMDt9Ci0gIHwgS19XICAgICAgIHskJCA9IDE7fQotICB8IEtfUyAgICAgICB7JCQgPSAyO30KLSAgfCBLX0UgICAgICAgeyQkID0gMzt9Ci0gIHwgS19GTiAgICAgIHskJCA9IDQ7fQotICB8IEtfRlcgICAgICB7JCQgPSA1O30KLSAgfCBLX0ZTICAgICAgeyQkID0gNjt9Ci0gIHwgS19GRSAgICAgIHskJCA9IDc7fQotICB8IEtfUjAgICAgICB7JCQgPSAwO30KLSAgfCBLX1I5MCAgICAgeyQkID0gMTt9Ci0gIHwgS19SMTgwICAgIHskJCA9IDI7fQotICB8IEtfUjI3MCAgICB7JCQgPSAzO30KLSAgfCBLX01ZICAgICAgeyQkID0gNDt9Ci0gIHwgS19NWVI5MCAgIHskJCA9IDU7fQotICB8IEtfTVggICAgICB7JCQgPSA2O30KLSAgfCBLX01YUjkwICAgeyQkID0gNzt9Ci0KLXZpYV9sYXllcl9ydWxlOiB2aWFfbGF5ZXIgdmlhX2dlb21ldHJpZXMKLSAgICB7IH0KLQotdmlhX2xheWVyOiBLX0xBWUVSIHtsZWZEYXRhLT5sZWZEdW1iTW9kZSA9IDE7IGxlZkRhdGEtPmxlZk5vTnVtID0gMTsgfSBUX1NUUklORyAnOycKLSAgICB7Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5WaWFDYmspIGxlZkRhdGEtPmxlZnJWaWEuYWRkTGF5ZXIoJDMpOwotICAgICAgbGVmRGF0YS0+dmlhTGF5ZXIrKzsKLSAgICAgIGxlZkRhdGEtPmhhc1ZpYVJ1bGVfbGF5ZXIgPSAxOwotICAgIH0KLQotdmlhX2dlb21ldHJpZXM6Ci0gIC8vIGVtcHR5IAotICB8IHZpYV9nZW9tZXRyaWVzIHZpYV9nZW9tZXRyeSAKLSAgOwotCi12aWFfZ2VvbWV0cnk6Ci0gIEtfUkVDVCBtYXNrQ29sb3IgcHQgcHQgJzsnCi0gICAgeyAKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPlZpYUNiaykgewotICAgICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuOCAmJiAoaW50KSQyID4gMCkgewotICAgICAgICAgIGlmIChsZWZEYXRhLT52aWFXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPlZpYVdhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDIwODEsICJNQVNLIGluZm9ybWF0aW9uIGNhbiBvbmx5IGJlIGRlZmluZWQgd2l0aCB2ZXJzaW9uIDUuOCIpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsgCi0gICAgICAgICAgICB9ICAgICAgICAgICAKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBsZWZEYXRhLT5sZWZyVmlhLmFkZFJlY3RUb0xheWVyKChpbnQpJDIsICQzLngsICQzLnksICQ0LngsICQ0LnkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB8IEtfUE9MWUdPTiBtYXNrQ29sb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gICAgewotICAgICAgbGVmRGF0YS0+bGVmckdlb21ldHJpZXNQdHIgPSAobGVmaUdlb21ldHJpZXMqKWxlZk1hbGxvYyhzaXplb2YobGVmaUdlb21ldHJpZXMpKTsKLSAgICAgIGxlZkRhdGEtPmxlZnJHZW9tZXRyaWVzUHRyLT5Jbml0KCk7Ci0gICAgICBsZWZEYXRhLT5sZWZyRG9HZW9tZXRyaWVzID0gMTsKLSAgICB9Ci0gICAgZmlyc3RQdCBuZXh0UHQgbmV4dFB0IG90aGVyUHRzICc7JwotICAgIHsgCi0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5WaWFDYmspIHsKLSAgICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjggJiYgJDIgPiAwKSB7Ci0gICAgICAgICAgaWYgKGxlZkRhdGEtPnZpYVdhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+VmlhV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMjA4MywgIkNvbG9yIG1hc2sgaW5mb3JtYXRpb24gY2FuIG9ubHkgYmUgZGVmaW5lZCB3aXRoIHZlcnNpb24gNS44LiIpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsgCi0gICAgICAgICAgICB9ICAgICAgICAgICAKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxlZkRhdGEtPmxlZnJHZW9tZXRyaWVzUHRyLT5hZGRQb2x5Z29uKChpbnQpJDIpOwotICAgICAgICAgICAgbGVmRGF0YS0+bGVmclZpYS5hZGRQb2x5VG9MYXllcigoaW50KSQyLCBsZWZEYXRhLT5sZWZyR2VvbWV0cmllc1B0cik7ICAgLy8gNS42Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGxlZkRhdGEtPmxlZnJHZW9tZXRyaWVzUHRyLT5jbGVhclBvbHlJdGVtcygpOyAvLyBmcmVlIGl0ZW1zIGZpZWxkcwotICAgICAgbGVmRnJlZSgoY2hhciopKGxlZkRhdGEtPmxlZnJHZW9tZXRyaWVzUHRyKSk7IC8vIERvbid0IG5lZWQgYW55bW9yZSwgcG9seSBkYXRhIGhhcwotICAgICAgbGVmRGF0YS0+bGVmckRvR2VvbWV0cmllcyA9IDA7ICAgICAgICAgICAgICAgIC8vIGNvcGllZAotICAgIH0KLQotZW5kX3ZpYTogS19FTkQge2xlZkRhdGEtPmxlZkR1bWJNb2RlID0gMTsgbGVmRGF0YS0+bGVmTm9OdW0gPSAxO30gVF9TVFJJTkcgCi0gICAgeyAKLSAgICAgIC8vIDEwLzE3LzIwMDEgLSBXYW5kYSBkYSBSb3NhLCBQQ1IgNDA0MTQ5Ci0gICAgICAvLyAgICAgICAgICAgICAgRXJyb3IgaWYgbm8gbGF5ZXIgaW4gdmlhCi0gICAgICBpZiAoIWxlZkRhdGEtPnZpYUxheWVyKSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5WaWFDYmspIHsgIC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT52aWFXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPlZpYVdhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAgIkEgTEFZRVIgc3RhdGVtZW50IGlzIG1pc3NpbmcgaW4gdGhlIFZJQSAlcy5cbkF0IGxlYXN0IG9uZSBMQVlFUmlzIHJlcXVpcmVkIHBlciBWSUEgc3RhdGVtZW50LiIsICQzKTsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTYwNiwgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChzdHJjbXAobGVmRGF0YS0+dmlhTmFtZSwgJDMpICE9IDApIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlZpYUNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+dmlhV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5WaWFXYXJuaW5ncykgewotICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICJFTkQgVklBIG5hbWUgJXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIFZJQSBuYW1lICVzLlxuQ29ycmVjdCB0aGUgTEVGIGZpbGUgYmVmb3JlIHJlcnVubmluZyBpdCB0aHJvdWdoIHRoZSBMRUYgcGFyc2VyLiIsICQzLCBsZWZEYXRhLT52aWFOYW1lKTsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTYwNywgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPnZpYU5hbWUpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPnZpYU5hbWUpOwotICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPnZpYU5hbWUpOwotICAgICAgfSBlbHNlCi0gICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPnZpYU5hbWUpOwotICAgIH0KLQotdmlhcnVsZV9rZXl3b3JkIDogS19WSUFSVUxFIHsgbGVmRGF0YS0+bGVmRHVtYk1vZGUgPSAxOyBsZWZEYXRhLT5sZWZOb051bSA9IDE7fSBUX1NUUklORwotICAgIHsgCi0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5WaWFSdWxlQ2JrKSBsZWZEYXRhLT5sZWZyVmlhUnVsZS5zZXROYW1lKCQzKTsKLSAgICAgIGxlZkRhdGEtPnZpYVJ1bGVMYXllciA9IDA7Ci0gICAgICAvL3N0cmNweShsZWZEYXRhLT52aWFSdWxlTmFtZSwgJDMpOwotICAgICAgbGVmRGF0YS0+dmlhUnVsZU5hbWUgPSBzdHJkdXAoJDMpOwotICAgICAgbGVmRGF0YS0+aXNHZW5lcmF0ZSA9IDA7Ci0gICAgfQotCi12aWFydWxlOgotICB2aWFydWxlX2tleXdvcmQgdmlhcnVsZV9sYXllcl9saXN0IHZpYV9uYW1lcyBvcHRfdmlhcnVsZV9wcm9wcyBlbmRfdmlhcnVsZQotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52aWFSdWxlTGF5ZXIgPT0gMCB8fCBsZWZEYXRhLT52aWFSdWxlTGF5ZXIgPiAyKSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5WaWFSdWxlQ2JrKSB7ICAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+dmlhUnVsZVdhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+VmlhUnVsZVdhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE2MDgsICJBIFZJQVJVTEUgc3RhdGVtZW50IHJlcXVpcmVzIHR3byBsYXllcnMuIik7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+VmlhUnVsZUNiaykKLSAgICAgICAgQ0FMTEJBQ0sobGVmQ2FsbGJhY2tzLT5WaWFSdWxlQ2JrLCBsZWZyVmlhUnVsZUNia1R5cGUsICZsZWZEYXRhLT5sZWZyVmlhUnVsZSk7Ci0gICAgICAvLyAyLzE5LzIwMDQgLSByZXNldCB0aGUgRU5DTE9TVVJFIG92ZXJoYW5nIHZhbHVlcyB3aGljaCBtYXkgYmUKLSAgICAgIC8vIHNldCBieSB0aGUgb2xkIHN5bnRheCBPVkVSSEFORyAtLSBOb3QgbmVjZXNzYXJ5LCBidXQganVzdCBpbmNhc2UKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPlZpYVJ1bGVDYmspIGxlZkRhdGEtPmxlZnJWaWFSdWxlLmNsZWFyTGF5ZXJPdmVyaGFuZygpOwotICAgIH0KLQotdmlhcnVsZV9nZW5lcmF0ZToKLSAgdmlhcnVsZV9rZXl3b3JkIEtfR0VORVJBVEUgdmlhcnVsZV9nZW5lcmF0ZV9kZWZhdWx0Ci0gICAgewotICAgICAgbGVmRGF0YS0+aXNHZW5lcmF0ZSA9IDE7Ci0gICAgfQotICB2aWFydWxlX2xheWVyX2xpc3Qgb3B0X3ZpYXJ1bGVfcHJvcHMgZW5kX3ZpYXJ1bGUKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+dmlhUnVsZUxheWVyID09IDApIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlZpYVJ1bGVDYmspIHsgIC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT52aWFSdWxlV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5WaWFSdWxlV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTcwOCwgIkEgVklBUlVMRSBHRU5FUkFURSByZXF1aXJlcyB0aHJlZSBsYXllcnMuIik7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfSBlbHNlIGlmICgobGVmRGF0YS0+dmlhUnVsZUxheWVyIDwgMykgJiYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPj0gNS42KSkgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+VmlhUnVsZUNiaykgIC8vIHdyaXRlIHdhcm5pbmcgb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPnZpYVJ1bGVXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPlZpYVJ1bGVXYXJuaW5ncykKLSAgICAgICAgICAgICAgbGVmV2FybmluZygyMDIxLCAidHVybi12aWEgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjYgb3IgbGF0ZXIuIik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+VmlhUnVsZUNiaykgewotICAgICAgICAgICAgbGVmRGF0YS0+bGVmclZpYVJ1bGUuc2V0R2VuZXJhdGUoKTsKLSAgICAgICAgICAgIENBTExCQUNLKGxlZkNhbGxiYWNrcy0+VmlhUnVsZUNiaywgbGVmclZpYVJ1bGVDYmtUeXBlLCAmbGVmRGF0YS0+bGVmclZpYVJ1bGUpOwotICAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gMi8xOS8yMDA0IC0gcmVzZXQgdGhlIEVOQ0xPU1VSRSBvdmVyaGFuZyB2YWx1ZXMgd2hpY2ggbWF5IGJlCi0gICAgICAvLyBzZXQgYnkgdGhlIG9sZCBzeW50YXggT1ZFUkhBTkcKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPlZpYVJ1bGVDYmspIGxlZkRhdGEtPmxlZnJWaWFSdWxlLmNsZWFyTGF5ZXJPdmVyaGFuZygpOwotICAgIH0KLQotdmlhcnVsZV9nZW5lcmF0ZV9kZWZhdWx0OiAgLy8gb3B0aW9uYWwgCi0gIHwgS19ERUZBVUxUICAgLy8gNS42IHN5bnRheAotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS42KSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5WaWFSdWxlQ2JrKSB7ICAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+dmlhUnVsZVdhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+VmlhUnVsZVdhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAgIkRFRkFVTFQgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjYgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE2MDUsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9IGVsc2UKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+VmlhUnVsZUNiaykgbGVmRGF0YS0+bGVmclZpYVJ1bGUuc2V0RGVmYXVsdCgpOwotICAgIH0KLSAKLXZpYXJ1bGVfbGF5ZXJfbGlzdCA6Ci0gIHZpYXJ1bGVfbGF5ZXIKLSAgfCB2aWFydWxlX2xheWVyX2xpc3QgdmlhcnVsZV9sYXllcgotICA7Ci0KLW9wdF92aWFydWxlX3Byb3BzOgotICAvLyBlbXB0eSAKLSAgfCB2aWFydWxlX3Byb3BzCi0gIDsKLQotdmlhcnVsZV9wcm9wczoKLSAgdmlhcnVsZV9wcm9wCi0gIHwgdmlhcnVsZV9wcm9wcyB2aWFydWxlX3Byb3AKLSAgOwotCi12aWFydWxlX3Byb3A6IEtfUFJPUEVSVFkgeyBsZWZEYXRhLT5sZWZEdW1iTW9kZSA9IDEwMDAwMDAwO30gdmlhcnVsZV9wcm9wX2xpc3QgJzsnCi0gICAgeyBsZWZEYXRhLT5sZWZEdW1iTW9kZSA9IDA7Ci0gICAgfQotCi12aWFydWxlX3Byb3BfbGlzdDoKLSAgdmlhcnVsZV9wcm9wCi0gIHwgdmlhcnVsZV9wcm9wX2xpc3QgdmlhcnVsZV9wcm9wCi0gIDsKLQotdmlhcnVsZV9wcm9wOgotICBUX1NUUklORyBUX1NUUklORwotICAgIHsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPlZpYVJ1bGVDYmspIHsKLSAgICAgICAgIGNoYXIgcHJvcFRwOwotICAgICAgICAgcHJvcFRwID0gbGVmU2V0dGluZ3MtPmxlZlByb3BzLmxlZnJWaWFSdWxlUHJvcC5wcm9wVHlwZSgkMSk7Ci0gICAgICAgICBsZWZEYXRhLT5sZWZyVmlhUnVsZS5hZGRQcm9wKCQxLCAkMiwgcHJvcFRwKTsKLSAgICAgIH0KLSAgICB9Ci0gIHwgVF9TVFJJTkcgUVNUUklORwotICAgIHsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPlZpYVJ1bGVDYmspIHsKLSAgICAgICAgIGNoYXIgcHJvcFRwOwotICAgICAgICAgcHJvcFRwID0gbGVmU2V0dGluZ3MtPmxlZlByb3BzLmxlZnJWaWFSdWxlUHJvcC5wcm9wVHlwZSgkMSk7Ci0gICAgICAgICBsZWZEYXRhLT5sZWZyVmlhUnVsZS5hZGRQcm9wKCQxLCAkMiwgcHJvcFRwKTsKLSAgICAgIH0KLSAgICB9Ci0gIHwgVF9TVFJJTkcgTlVNQkVSCi0gICAgewotICAgICAgY2hhciB0ZW1wWzMyXTsKLSAgICAgIHNwcmludGYodGVtcCwgIiUuMTFnIiwgJDIpOwotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+VmlhUnVsZUNiaykgewotICAgICAgICAgY2hhciBwcm9wVHA7Ci0gICAgICAgICBwcm9wVHAgPSBsZWZTZXR0aW5ncy0+bGVmUHJvcHMubGVmclZpYVJ1bGVQcm9wLnByb3BUeXBlKCQxKTsKLSAgICAgICAgIGxlZkRhdGEtPmxlZnJWaWFSdWxlLmFkZE51bVByb3AoJDEsICQyLCB0ZW1wLCBwcm9wVHApOwotICAgICAgfQotICAgIH0KLQotdmlhcnVsZV9sYXllcjogdmlhcnVsZV9sYXllcl9uYW1lIHZpYXJ1bGVfbGF5ZXJfb3B0aW9ucwotICAgIHsKLSAgICAgIC8vIDEwLzE4LzIwMDEgLSBXYW5kYSBkYSBSb3NhIFBDUiA0MDQxODEKLSAgICAgIC8vICAgICAgICAgICAgICBNYWtlIHN1cmUgdGhlIDFzdCAyIGxheWVycyBpbiB2aWFydWxlIGhhcyBkaXJlY3Rpb24KLSAgICAgIC8vIDA0LzI4LzIwMDQgLSBQQ1IgNzA0MDcyIC0gRElSRUNUSU9OIGluIHZpYXJ1bGUgZ2VuZXJhdGUgaXMKLSAgICAgIC8vICAgICAgICAgICAgICBvYnNvbGV0ZSBpbiA1LjYKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtID49IDUuNikgewotICAgICAgICAgaWYgKGxlZkRhdGEtPnZpYVJ1bGVMYXllciA8IDIgJiYgIWxlZkRhdGEtPnZpYVJ1bGVIYXNEaXIgJiYgIWxlZkRhdGEtPnZpYVJ1bGVIYXNFbmMgJiYKLSAgICAgICAgICAgICAhbGVmRGF0YS0+aXNHZW5lcmF0ZSkgewotICAgICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+VmlhUnVsZUNiaykgeyAgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgICAgaWYgKGxlZkRhdGEtPnZpYVJ1bGVXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPlZpYVJ1bGVXYXJuaW5ncykgewotICAgICAgICAgICAgICAgICAgbGVmRXJyb3IoMTcwNSwgIlZJQVJVTEUgc3RhdGVtZW50IGluIGEgbGF5ZXIsIHJlcXVpcmVzIGEgRElSRUNUSU9OIGNvbnN0cnVjdCBzdGF0ZW1lbnQuIik7Ci0gICAgICAgICAgICAgICAgICBDSEtFUlIoKTsgCi0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICAgaWYgKGxlZkRhdGEtPnZpYVJ1bGVMYXllciA8IDIgJiYgIWxlZkRhdGEtPnZpYVJ1bGVIYXNEaXIgJiYgIWxlZkRhdGEtPnZpYVJ1bGVIYXNFbmMgJiYKLSAgICAgICAgICAgICBsZWZEYXRhLT5pc0dlbmVyYXRlKSB7Ci0gICAgICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5WaWFSdWxlQ2JrKSB7ICAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICAgICBpZiAobGVmRGF0YS0+dmlhUnVsZVdhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+VmlhUnVsZVdhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICAgICBsZWZFcnJvcigxNzA1LCAiVklBUlVMRSBzdGF0ZW1lbnQgaW4gYSBsYXllciwgcmVxdWlyZXMgYSBESVJFQ1RJT04gY29uc3RydWN0IHN0YXRlbWVudC4iKTsKLSAgICAgICAgICAgICAgICAgIENIS0VSUigpOyAKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGxlZkRhdGEtPnZpYVJ1bGVMYXllcisrOwotICAgIH0KLSAgOwotCi12aWFfbmFtZXM6Ci0gIC8vIGVtcHR5IAotICB8IHZpYV9uYW1lcyB2aWFfbmFtZQotICA7Ci0KLXZpYV9uYW1lOiB2aWFfa2V5d29yZCBUX1NUUklORyAnOycKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPlZpYVJ1bGVDYmspIGxlZkRhdGEtPmxlZnJWaWFSdWxlLmFkZFZpYU5hbWUoJDIpOyB9Ci0KLXZpYXJ1bGVfbGF5ZXJfbmFtZTogS19MQVlFUiB7bGVmRGF0YS0+bGVmRHVtYk1vZGUgPSAxOyBsZWZEYXRhLT5sZWZOb051bSA9IDE7IH0gVF9TVFJJTkcgJzsnCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5WaWFSdWxlQ2JrKSBsZWZEYXRhLT5sZWZyVmlhUnVsZS5zZXRMYXllcigkMyk7Ci0gICAgICBsZWZEYXRhLT52aWFSdWxlSGFzRGlyID0gMDsKLSAgICAgIGxlZkRhdGEtPnZpYVJ1bGVIYXNFbmMgPSAwOwotICAgIH0KLQotdmlhcnVsZV9sYXllcl9vcHRpb25zOgotICAvLyBlbXB0eSAKLSAgfCB2aWFydWxlX2xheWVyX29wdGlvbnMgdmlhcnVsZV9sYXllcl9vcHRpb24KLSAgOwotCi12aWFydWxlX2xheWVyX29wdGlvbjoKLSAgS19ESVJFQ1RJT04gS19IT1JJWk9OVEFMICc7JwotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52aWFSdWxlSGFzRW5jKSB7Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlZpYVJ1bGVDYmspIHsgIC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPnZpYVJ1bGVXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPlZpYVJ1bGVXYXJuaW5ncykgewotICAgICAgICAgICAgICBsZWZFcnJvcigxNzA2LCAiQW4gRU5DTE9TUkUgc3RhdGVtZW50IHdhcyBhbHJlYWR5IGRlZmluZWQgaW4gdGhlIGxheWVyLlxuSXQgaXMgRElSRUNUSU9OIG9yIEVOQ0xPU1VSRSBjYW4gYmUgc3BlY2lmaWVkIGluIGEgbGF5ZXIuIik7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICgobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNikgfHwgKCFsZWZEYXRhLT5pc0dlbmVyYXRlKSkgewotICAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlZpYVJ1bGVDYmspIGxlZkRhdGEtPmxlZnJWaWFSdWxlLnNldEhvcml6b250YWwoKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+VmlhUnVsZUNiaykgIC8vIHdyaXRlIHdhcm5pbmcgb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgIGlmIChsZWZEYXRhLT52aWFSdWxlV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5WaWFSdWxlV2FybmluZ3MpCi0gICAgICAgICAgICAgICBsZWZXYXJuaW5nKDIwMjIsICJESVJFQ1RJT04gc3RhdGVtZW50IGluIFZJQVJVTEUgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjYgb3IgbGF0ZXIuIik7Ci0gICAgICB9Ci0gICAgICBsZWZEYXRhLT52aWFSdWxlSGFzRGlyID0gMTsKLSAgICB9Ci0gIHwgS19ESVJFQ1RJT04gS19WRVJUSUNBTCAnOycKLSAgICB7IAotICAgICAgaWYgKGxlZkRhdGEtPnZpYVJ1bGVIYXNFbmMpIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+VmlhUnVsZUNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgIGlmIChsZWZEYXRhLT52aWFSdWxlV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5WaWFSdWxlV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTcwNiwgIkFuIEVOQ0xPU1JFIHN0YXRlbWVudCB3YXMgYWxyZWFkeSBkZWZpbmVkIGluIHRoZSBsYXllci5cbkl0IGlzIERJUkVDVElPTiBvciBFTkNMT1NVUkUgY2FuIGJlIHNwZWNpZmllZCBpbiBhIGxheWVyLiIpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjYpIHx8ICghbGVmRGF0YS0+aXNHZW5lcmF0ZSkpIHsKLSAgICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5WaWFSdWxlQ2JrKSBsZWZEYXRhLT5sZWZyVmlhUnVsZS5zZXRWZXJ0aWNhbCgpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5WaWFSdWxlQ2JrKSAvLyB3cml0ZSB3YXJuaW5nIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPnZpYVJ1bGVXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPlZpYVJ1bGVXYXJuaW5ncykKLSAgICAgICAgICAgICAgbGVmV2FybmluZygyMDIyLCAiRElSRUNUSU9OIHN0YXRlbWVudCBpbiBWSUFSVUxFIGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS42IG9yIGxhdGVyLiIpOwotICAgICAgfQotICAgICAgbGVmRGF0YS0+dmlhUnVsZUhhc0RpciA9IDE7Ci0gICAgfQotICB8IEtfRU5DTE9TVVJFIGludF9udW1iZXIgaW50X251bWJlciAnOycgICAgLy8gNS41IAotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS41KSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5WaWFSdWxlQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPnZpYVJ1bGVXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPlZpYVJ1bGVXYXJuaW5ncykgewotICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICJFTkNMT1NVUkUgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjUgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE3MDcsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIDIvMTkvMjAwNCAtIEVuZm9yY2VkIHRoZSBydWxlIHRoYXQgRU5DTE9TVVJFIGNhbiBvbmx5IGJlIGRlZmluZWQKLSAgICAgIC8vIGluIFZJQVJVTEUgR0VORVJBVEUKLSAgICAgIGlmICghbGVmRGF0YS0+aXNHZW5lcmF0ZSkgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+VmlhUnVsZUNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgIGlmIChsZWZEYXRhLT52aWFSdWxlV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5WaWFSdWxlV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTYxNCwgIkFuIEVOQ0xPU1VSRSBzdGF0ZW1lbnQgaXMgZGVmaW5lZCBpbiBhIFZJQVJVTEUgc3RhdGVtZW50IG9ubHkuXG5PVkVSSEFORyBzdGF0ZW1lbnQgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBWSUFSVUxFIEdFTkVSQVRFLiIpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGxlZkRhdGEtPnZpYVJ1bGVIYXNEaXIpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlZpYVJ1bGVDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+dmlhUnVsZVdhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+VmlhUnVsZVdhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE2MDksICJBIERJUkVDVElPTiBzdGF0ZW1lbnQgd2FzIGFscmVhZHkgZGVmaW5lZCBpbiB0aGUgbGF5ZXIuXG5JdCBpcyBESVJFQ1RJT04gb3IgRU5DTE9TVVJFIGNhbiBiZSBzcGVjaWZpZWQgaW4gYSBsYXllci4iKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5WaWFSdWxlQ2JrKSBsZWZEYXRhLT5sZWZyVmlhUnVsZS5zZXRFbmNsb3N1cmUoJDIsICQzKTsKLSAgICAgIH0KLSAgICAgIGxlZkRhdGEtPnZpYVJ1bGVIYXNFbmMgPSAxOwotICAgIH0KLSAgfCBLX1dJRFRIIGludF9udW1iZXIgS19UTyBpbnRfbnVtYmVyICc7JwotICAgIHsgaWYgKGxlZkNhbGxiYWNrcy0+VmlhUnVsZUNiaykgbGVmRGF0YS0+bGVmclZpYVJ1bGUuc2V0V2lkdGgoJDIsJDQpOyB9Ci0gIHwgS19SRUNUIHB0IHB0ICc7JwotICAgIHsgaWYgKGxlZkNhbGxiYWNrcy0+VmlhUnVsZUNiaykKLSAgICAgICAgbGVmRGF0YS0+bGVmclZpYVJ1bGUuc2V0UmVjdCgkMi54LCAkMi55LCAkMy54LCAkMy55KTsgfSAKLSAgfCBLX1NQQUNJTkcgaW50X251bWJlciBLX0JZIGludF9udW1iZXIgJzsnCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5WaWFSdWxlQ2JrKSBsZWZEYXRhLT5sZWZyVmlhUnVsZS5zZXRTcGFjaW5nKCQyLCQ0KTsgfQotICB8IEtfUkVTSVNUQU5DRSBpbnRfbnVtYmVyICc7JwotICAgIHsgaWYgKGxlZkNhbGxiYWNrcy0+VmlhUnVsZUNiaykgbGVmRGF0YS0+bGVmclZpYVJ1bGUuc2V0UmVzaXN0YW5jZSgkMik7IH0KLSAgfCBLX09WRVJIQU5HIGludF9udW1iZXIgJzsnCi0gICAgewotICAgICAgaWYgKCFsZWZEYXRhLT52aWFSdWxlSGFzRGlyKSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5WaWFSdWxlQ2JrKSB7ICAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+dmlhUnVsZVdhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+VmlhUnVsZVdhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICBsZWZFcnJvcigxNjEwLCAiQW4gT1ZFUkhBTkcgc3RhdGVtZW50IGlzIGRlZmluZWQsIGJ1dCB0aGUgcmVxdWlyZWQgRElSRUNUSU9OIHN0YXRlbWVudCBpcyBub3QgeWV0IGRlZmluZWQuXG5VcGRhdGUgdGhlIExFRiBmaWxlIHRvIGRlZmluZSB0aGUgRElSRUNUSU9OIHN0YXRlbWVudCBiZWZvcmUgdGhlIE9WRVJIQU5HLiIpOwotICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyAyLzE5LzIwMDQgLSBFbmZvcmNlZCB0aGUgcnVsZSB0aGF0IE9WRVJIQU5HIGNhbiBvbmx5IGJlIGRlZmluZWQKLSAgICAgIC8vIGluIFZJQVJVTEUgR0VORVJBVEUgYWZ0ZXIgNS4zCi0gICAgICBpZiAoKGxlZkRhdGEtPnZlcnNpb25OdW0gPiA1LjMpICYmICghbGVmRGF0YS0+aXNHZW5lcmF0ZSkpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlZpYVJ1bGVDYmspIHsgIC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT52aWFSdWxlV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5WaWFSdWxlV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgIGxlZkVycm9yKDE2MTEsICJBbiBPVkVSSEFORyBzdGF0ZW1lbnQgaXMgZGVmaW5lZCBpbiBhIFZJQVJVTEUgc3RhdGVtZW50IG9ubHkuXG5PVkVSSEFORyBzdGF0ZW1lbnQgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBWSUFSVUxFIEdFTkVSQVRFLiIpOwotICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNikgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5WaWFSdWxlQ2JrKSBsZWZEYXRhLT5sZWZyVmlhUnVsZS5zZXRPdmVyaGFuZygkMik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5WaWFSdWxlQ2JrKSAgLy8gd3JpdGUgd2FybmluZyBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgIGlmIChsZWZEYXRhLT52aWFSdWxlV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5WaWFSdWxlV2FybmluZ3MpCi0gICAgICAgICAgICAgIGxlZldhcm5pbmcoMjAyMywgIk9WRVJIQU5HIHN0YXRlbWVudCB3aWxsIGJlIHRyYW5zbGF0ZWQgaW50byBzaW1pbGFyIEVOQ0xPU1VSRSBydWxlIik7Ci0gICAgICAgIC8vIEluIDUuNiAmIGxhdGVyLCBzZXQgaXQgdG8gZWl0aGVyIEVOQ0xPU1VSRSBvdmVyaGFuZzEgb3Igb3ZlcmhhbmcyCi0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlZpYVJ1bGVDYmspIGxlZkRhdGEtPmxlZnJWaWFSdWxlLnNldE92ZXJoYW5nVG9FbmNsb3N1cmUoJDIpOwotICAgICAgfQotICAgIH0KLSAgfCBLX01FVEFMT1ZFUkhBTkcgaW50X251bWJlciAnOycKLSAgICB7Ci0gICAgICAvLyAyLzE5LzIwMDQgLSBFbmZvcmNlZCB0aGUgcnVsZSB0aGF0IE1FVEFMT1ZFUkhBTkcgY2FuIG9ubHkgYmUgZGVmaW5lZAotICAgICAgLy8gaW4gVklBUlVMRSBHRU5FUkFURQotICAgICAgaWYgKChsZWZEYXRhLT52ZXJzaW9uTnVtID4gNS4zKSAmJiAoIWxlZkRhdGEtPmlzR2VuZXJhdGUpKSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5WaWFSdWxlQ2JrKSB7ICAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+dmlhUnVsZVdhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+VmlhUnVsZVdhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICBsZWZFcnJvcigxNjEyLCAiQW4gTUVUQUxPVkVSSEFORyBzdGF0ZW1lbnQgaXMgZGVmaW5lZCBpbiBhIFZJQVJVTEUgc3RhdGVtZW50IG9ubHkuXG5PVkVSSEFORyBzdGF0ZW1lbnQgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBWSUFSVUxFIEdFTkVSQVRFLiIpOwotICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNikgewotICAgICAgICBpZiAoIWxlZkRhdGEtPnZpYVJ1bGVIYXNEaXIpIHsKLSAgICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+VmlhUnVsZUNiaykgeyAgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgIGlmIChsZWZEYXRhLT52aWFSdWxlV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5WaWFSdWxlV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgICBsZWZFcnJvcigxNjEzLCAiQW4gTUVUQUxPVkVSSEFORyBzdGF0ZW1lbnQgaXMgZGVmaW5lZCwgYnV0IHRoZSByZXF1aXJlZCBESVJFQ1RJT04gc3RhdGVtZW50IGlzIG5vdCB5ZXQgZGVmaW5lZC5cblVwZGF0ZSB0aGUgTEVGIGZpbGUgdG8gZGVmaW5lIHRoZSBESVJFQ1RJT04gc3RhdGVtZW50IGJlZm9yZSB0aGUgT1ZFUkhBTkcuIik7Ci0gICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgfSAKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlZpYVJ1bGVDYmspIGxlZkRhdGEtPmxlZnJWaWFSdWxlLnNldE1ldGFsT3ZlcmhhbmcoJDIpOwotICAgICAgfSBlbHNlCi0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlZpYVJ1bGVDYmspICAvLyB3cml0ZSB3YXJuaW5nIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPnZpYVJ1bGVXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPlZpYVJ1bGVXYXJuaW5ncykKLSAgICAgICAgICAgICBsZWZXYXJuaW5nKDIwMjQsICJNRVRBTE9WRVJIQU5HIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNiBvciBsYXRlci4iKTsKLSAgICB9Ci0KLWVuZF92aWFydWxlOiBLX0VORCB7bGVmRGF0YS0+bGVmRHVtYk1vZGUgPSAxOyBsZWZEYXRhLT5sZWZOb051bSA9IDE7fSAgVF9TVFJJTkcgCi0gICAgewotICAgICAgaWYgKChsZWZEYXRhLT5pc0dlbmVyYXRlKSAmJiAobGVmQ2FsbGJhY2tzLT5WaWFSdWxlQ2JrKSAmJiBsZWZEYXRhLT5sZWZyVmlhUnVsZS5udW1MYXllcnMoKSA+PSAzKSB7ICAgICAgICAgCi0gICAgICAgIGlmICghbGVmRGF0YS0+bGVmclZpYVJ1bGUubGF5ZXIoMCktPmhhc1JlY3QoKSAmJgotICAgICAgICAgICAgIWxlZkRhdGEtPmxlZnJWaWFSdWxlLmxheWVyKDEpLT5oYXNSZWN0KCkgJiYKLSAgICAgICAgICAgICFsZWZEYXRhLT5sZWZyVmlhUnVsZS5sYXllcigyKS0+aGFzUmVjdCgpKSB7Ci0gICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywgCi0gICAgICAgICAgICAgICAgICAgICAiVklBUlVMRSBHRU5FUkFURSAnJXMnIGN1dCBsYXllciBkZWZpbml0aW9uIHNob3VsZCBoYXZlIFJFQ1Qgc3RhdGVtZW50LlxuQ29ycmVjdCB0aGUgTEVGIGZpbGUgYmVmb3JlIHJlcnVubmluZyBpdCB0aHJvdWdoIHRoZSBMRUYgcGFyc2VyLiIsIAotICAgICAgICAgICAgICAgICAgICAgIGxlZkRhdGEtPnZpYVJ1bGVOYW1lKTsKLSAgICAgICAgICAgIGxlZldhcm5pbmcoMTcxNCwgbGVmRGF0YS0+b3V0TXNnKTsgCi0gICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7ICAgICAgICAgICAgCi0gICAgICAgICAgICBDSEtFUlIoKTsgICAgICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHN0cmNtcChsZWZEYXRhLT52aWFSdWxlTmFtZSwgJDMpICE9IDApIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+VmlhUnVsZUNiaykgeyAgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+dmlhUnVsZVdhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+VmlhUnVsZVdhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAgICJFTkQgVklBUlVMRSBuYW1lICVzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBWSUFSVUxFIG5hbWUgJXMuXG5Db3JyZWN0IHRoZSBMRUYgZmlsZSBiZWZvcmUgcmVydW5uaW5nIGl0IHRocm91Z2ggdGhlIExFRiBwYXJzZXIuIiwgJDMsIGxlZkRhdGEtPnZpYVJ1bGVOYW1lKTsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTYxNSwgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPnZpYVJ1bGVOYW1lKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPnZpYVJ1bGVOYW1lKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+dmlhUnVsZU5hbWUpOwotICAgICAgfSBlbHNlCi0gICAgICAgIGxlZkZyZWUobGVmRGF0YS0+dmlhUnVsZU5hbWUpOwotICAgIH0KLQotc3BhY2luZ19ydWxlOiBzdGFydF9zcGFjaW5nIHNwYWNpbmdzIGVuZF9zcGFjaW5nIAotICAgIHsgfQotCi1zdGFydF9zcGFjaW5nOiBLX1NQQUNJTkcKLSAgICB7Ci0gICAgICBsZWZEYXRhLT5oYXNTYW1lbmV0ID0gMDsKLSAgICAgIGlmICgobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNikgfHwgKCFsZWZEYXRhLT5uZFJ1bGUpKSB7Ci0gICAgICAgIC8vIGlmIDUuNiBhbmQgaW4gbm9uZGVmYXVsdHJ1bGUsIGl0IHNob3VsZCBub3QgZ2V0IGluIGhlcmUsIAotICAgICAgICAvLyBpdCBzaG91bGQgZ28gdG8gdGhlIGVsc2Ugc3RhdGVtZW50IHRvIHdyaXRlIG91dCBhIHdhcm5pbmcgCi0gICAgICAgIC8vIGlmIDUuNiwgbm90IGluIG5vbmRlZmF1bHRydWxlLCBpdCB3aWxsIGdldCBpbiBoZXJlIAotICAgICAgICAvLyBpZiA1LjUgYW5kIGVhcmxpZXIgaW4gbm9uZGVmYXVsdHJ1bGUgaXMgb2sgdG8gZ2V0IGluIGhlcmUgCi0gICAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtID49IDUuNykgeyAvLyB3aWxsIGdldCB0byB0aGlzIGlmIHN0YXRlbWVudCBpZiAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsZWZEYXRhLT52ZXJzaW9uTnVtIGlzIDUuNiBhbmQgaGlnaGVyIGJ1dCBsZWZEYXRhLT5uZFJ1bGUgPSAwIAotICAgICAgICAgICBpZiAobGVmRGF0YS0+c3BhY2luZ1dhcm5pbmdzID09IDApIHsgIC8vIG9ubHkgcHJpbnQgb25jZSAKLSAgICAgICAgICAgICAgbGVmV2FybmluZygyMDc3LCAiQSBTUEFDSU5HIFNBTUVORVQgc2VjdGlvbiBpcyBkZWZpbmVkIGJ1dCBpdCBpcyBub3QgbGVnYWwgaW4gYSBMRUYgNS43IHZlcnNpb24gZmlsZS5cbkl0IHdpbGwgYmUgaWdub3JlZCB3aGljaCB3aWxsIHByb2JhYmx5IGNhdXNlIHJlYWwgRFJDIHZpb2xhdGlvbnMgdG8gYmUgaWdub3JlZCwgYW5kIG1heVxuY2F1c2UgZmFsc2UgRFJDIHZpb2xhdGlvbnMgdG8gb2NjdXIuXG5cblRvIGF2b2lkIHRoaXMgd2FybmluZywgYW5kIGNvcnJlY3RseSBoYW5kbGUgdGhlc2UgRFJDIHJ1bGVzLCB5b3Ugc2hvdWxkIG1vZGlmeSB5b3VyXG5MRUYgdG8gdXNlIHRoZSBhcHByb3ByaWF0ZSBTQU1FTkVUIGtleXdvcmRzIGFzIGRlc2NyaWJlZCBpbiB0aGUgTEVGL0RFRiA1Ljdcbm1hbnVhbCB1bmRlciB0aGUgU1BBQ0lORyBzdGF0ZW1lbnRzIGluIHRoZSBMQVlFUiAoUm91dGluZykgYW5kIExBWUVSIChDdXQpXG5zZWN0aW9ucyBsaXN0ZWQgaW4gdGhlIExFRiBUYWJsZSBvZiBDb250ZW50cy4iKTsKLSAgICAgICAgICAgICAgbGVmRGF0YS0+c3BhY2luZ1dhcm5pbmdzKys7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChsZWZDYWxsYmFja3MtPlNwYWNpbmdCZWdpbkNiayAmJiAhbGVmRGF0YS0+bmRSdWxlKQotICAgICAgICAgIENBTExCQUNLKGxlZkNhbGxiYWNrcy0+U3BhY2luZ0JlZ2luQ2JrLCBsZWZyU3BhY2luZ0JlZ2luQ2JrVHlwZSwgMCk7Ci0gICAgICB9IGVsc2UKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+U3BhY2luZ0JlZ2luQ2JrICYmICFsZWZEYXRhLT5uZFJ1bGUpICAvLyB3cml0ZSB3YXJuaW5nIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPnNwYWNpbmdXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPlNwYWNpbmdXYXJuaW5ncykKLSAgICAgICAgICAgICBsZWZXYXJuaW5nKDIwMjUsICJTQU1FTkVUIHN0YXRlbWVudCBpbiBOT05ERUZBVUxUUlVMRSBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNiBvciBsYXRlci4iKTsKLSAgICB9Ci0KLWVuZF9zcGFjaW5nOiBLX0VORCBLX1NQQUNJTkcKLSAgICB7Ci0gICAgICBpZiAoKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjYpIHx8ICghbGVmRGF0YS0+bmRSdWxlKSkgewotICAgICAgICBpZiAoKGxlZkRhdGEtPnZlcnNpb25OdW0gPD0gNS40KSAmJiAoIWxlZkRhdGEtPmhhc1NhbWVuZXQpKSB7Ci0gICAgICAgICAgIGxlZkVycm9yKDE2MTYsICJTQU1FTkVUIHN0YXRlbWVudCBpcyByZXF1aXJlZCBpbnNpZGUgU1BBQ0lORyBmb3IgYW55IGxlZiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgYW5kIGVhcmxpZXIsIGJ1dCBpcyBub3QgZGVmaW5lZCBpbiB0aGUgcGFyc2VkIGxlZiBmaWxlLiIpOwotICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgfSBlbHNlIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS43KSB7IC8vIG9ic29sZXRlIGluIDUuNyBhbmQgbGF0ZXIgCi0gICAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlNwYWNpbmdFbmRDYmsgJiYgIWxlZkRhdGEtPm5kUnVsZSkKLSAgICAgICAgICAgICBDQUxMQkFDSyhsZWZDYWxsYmFja3MtPlNwYWNpbmdFbmRDYmssIGxlZnJTcGFjaW5nRW5kQ2JrVHlwZSwgMCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLXNwYWNpbmdzOgotICAvLyBlbXB0eSAKLSAgfCBzcGFjaW5ncyBzcGFjaW5nCi0gIDsKLQotc3BhY2luZzogIHNhbWVuZXRfa2V5d29yZCBUX1NUUklORyBUX1NUUklORyBpbnRfbnVtYmVyICc7JwotICAgIHsKLSAgICAgIGlmICgobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNikgfHwgKCFsZWZEYXRhLT5uZFJ1bGUpKSB7Ci0gICAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS43KSB7Ci0gICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+U3BhY2luZ0NiaykgewotICAgICAgICAgICAgbGVmRGF0YS0+bGVmclNwYWNpbmcuc2V0KCQyLCAkMywgJDQsIDApOwotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPm5kUnVsZSkKLSAgICAgICAgICAgICAgICBsZWZEYXRhLT5uZC0+YWRkU3BhY2luZ1J1bGUoJmxlZkRhdGEtPmxlZnJTcGFjaW5nKTsKLSAgICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICAgICAgQ0FMTEJBQ0sobGVmQ2FsbGJhY2tzLT5TcGFjaW5nQ2JrLCBsZWZyU3BhY2luZ0Nia1R5cGUsICZsZWZEYXRhLT5sZWZyU3BhY2luZyk7ICAgICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB8IHNhbWVuZXRfa2V5d29yZCBUX1NUUklORyBUX1NUUklORyBpbnRfbnVtYmVyIEtfU1RBQ0sgJzsnCi0gICAgewotICAgICAgaWYgKChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS42KSB8fCAoIWxlZkRhdGEtPm5kUnVsZSkpIHsKLSAgICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjcpIHsKLSAgICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5TcGFjaW5nQ2JrKSB7Ci0gICAgICAgICAgICBsZWZEYXRhLT5sZWZyU3BhY2luZy5zZXQoJDIsICQzLCAkNCwgMSk7Ci0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bmRSdWxlKQotICAgICAgICAgICAgICAgIGxlZkRhdGEtPm5kLT5hZGRTcGFjaW5nUnVsZSgmbGVmRGF0YS0+bGVmclNwYWNpbmcpOwotICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgICAgICBDQUxMQkFDSyhsZWZDYWxsYmFja3MtPlNwYWNpbmdDYmssIGxlZnJTcGFjaW5nQ2JrVHlwZSwgJmxlZkRhdGEtPmxlZnJTcGFjaW5nKTsgICAgCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi1zYW1lbmV0X2tleXdvcmQ6IEtfU0FNRU5FVAotICAgIC8vIG11c3QgYmUgZm9sbG93ZWQgYnkgdHdvIG5hbWVzIAotICAgIHsgbGVmRGF0YS0+bGVmRHVtYk1vZGUgPSAyOyBsZWZEYXRhLT5sZWZOb051bSA9IDI7IGxlZkRhdGEtPmhhc1NhbWVuZXQgPSAxOyB9Ci0gICAgIAotbWFza0NvbG9yOgotICAgIC8vIGVtcHR5IAotICAgIHsgJCQgPSAwOyB9Ci0gICAgfCBLX01BU0sgaW50X251bWJlcgotICAgIHsgJCQgPSAoaW50KSQyOyB9Ci0gICAgICAgICAgICAKLWlyZHJvcDogc3RhcnRfaXJkcm9wIGlyX3RhYmxlcyBlbmRfaXJkcm9wCi0gICAgeyB9Ci0KLXN0YXJ0X2lyZHJvcDogS19JUkRST1AKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNCkgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5JUkRyb3BCZWdpbkNiaykgCi0gICAgICAgICAgQ0FMTEJBQ0sobGVmQ2FsbGJhY2tzLT5JUkRyb3BCZWdpbkNiaywgbGVmcklSRHJvcEJlZ2luQ2JrVHlwZSwgMCk7Ci0gICAgICB9IGVsc2UKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+SVJEcm9wQmVnaW5DYmspIC8vIHdyaXRlIHdhcm5pbmcgb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgIGlmIChsZWZEYXRhLT5pUkRyb3BXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPklSRHJvcFdhcm5pbmdzKQotICAgICAgICAgICAgbGVmV2FybmluZygyMDI2LCAiSVJEUk9QIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iKTsKLSAgICB9Ci0KLWVuZF9pcmRyb3A6IEtfRU5EIEtfSVJEUk9QCi0gICAgewotICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjQpIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+SVJEcm9wRW5kQ2JrKQotICAgICAgICAgIENBTExCQUNLKGxlZkNhbGxiYWNrcy0+SVJEcm9wRW5kQ2JrLCBsZWZySVJEcm9wRW5kQ2JrVHlwZSwgMCk7Ci0gICAgICB9Ci0gICAgfQotICAgICAgCi0KLWlyX3RhYmxlczoKLSAgLy8gZW1wdHkgCi0gIHwgaXJfdGFibGVzIGlyX3RhYmxlCi0gIDsKLQotaXJfdGFibGU6IGlyX3RhYmxlbmFtZSBpcl90YWJsZV92YWx1ZXMgJzsnCi0gICAgeyAKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS40KSB7Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPklSRHJvcENiaykKLSAgICAgICAgICBDQUxMQkFDSyhsZWZDYWxsYmFja3MtPklSRHJvcENiaywgbGVmcklSRHJvcENia1R5cGUsICZsZWZEYXRhLT5sZWZySVJEcm9wKTsKLSAgICAgIH0KLSAgICB9Ci0KLWlyX3RhYmxlX3ZhbHVlczoKLSAgLy8gZW1wdHkgCi0gIHwgaXJfdGFibGVfdmFsdWVzIGlyX3RhYmxlX3ZhbHVlIAotICA7Ci0KLWlyX3RhYmxlX3ZhbHVlOiBpbnRfbnVtYmVyIGludF9udW1iZXIgCi0gIHsgaWYgKGxlZkNhbGxiYWNrcy0+SVJEcm9wQ2JrKSBsZWZEYXRhLT5sZWZySVJEcm9wLnNldFZhbHVlcygkMSwgJDIpOyB9Ci0KLWlyX3RhYmxlbmFtZTogS19UQUJMRSBUX1NUUklORwotICB7IGlmIChsZWZDYWxsYmFja3MtPklSRHJvcENiaykgbGVmRGF0YS0+bGVmcklSRHJvcC5zZXRUYWJsZU5hbWUoJDIpOyB9Ci0KLW1pbmZlYXR1cmU6IEtfTUlORkVBVFVSRSBpbnRfbnVtYmVyIGludF9udW1iZXIgJzsnCi0gIHsKLSAgICBsZWZEYXRhLT5oYXNNaW5mZWF0dXJlID0gMTsKLSAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNCkgewotICAgICAgIGlmIChsZWZDYWxsYmFja3MtPk1pbkZlYXR1cmVDYmspIHsKLSAgICAgICAgIGxlZkRhdGEtPmxlZnJNaW5GZWF0dXJlLnNldCgkMiwgJDMpOwotICAgICAgICAgQ0FMTEJBQ0sobGVmQ2FsbGJhY2tzLT5NaW5GZWF0dXJlQ2JrLCBsZWZyTWluRmVhdHVyZUNia1R5cGUsICZsZWZEYXRhLT5sZWZyTWluRmVhdHVyZSk7Ci0gICAgICAgfQotICAgIH0gZWxzZQotICAgICAgIGlmIChsZWZDYWxsYmFja3MtPk1pbkZlYXR1cmVDYmspIC8vIHdyaXRlIHdhcm5pbmcgb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgIGlmIChsZWZEYXRhLT5taW5GZWF0dXJlV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5NaW5GZWF0dXJlV2FybmluZ3MpCi0gICAgICAgICAgICBsZWZXYXJuaW5nKDIwMjcsICJNSU5GRUFUVVJFIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iKTsKLSAgfQotCi1kaWVsZWN0cmljOiBLX0RJRUxFQ1RSSUMgaW50X251bWJlciAnOycKLSAgewotICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS40KSB7Ci0gICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+RGllbGVjdHJpY0NiaykKLSAgICAgICAgIENBTExCQUNLKGxlZkNhbGxiYWNrcy0+RGllbGVjdHJpY0NiaywgbGVmckRpZWxlY3RyaWNDYmtUeXBlLCAkMik7Ci0gICAgfSBlbHNlCi0gICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+RGllbGVjdHJpY0NiaykgLy8gd3JpdGUgd2FybmluZyBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICBpZiAobGVmRGF0YS0+ZGllbGVjdHJpY1dhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+RGllbGVjdHJpY1dhcm5pbmdzKQotICAgICAgICAgICBsZWZXYXJuaW5nKDIwMjgsICJESUVMRUNUUklDIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iKTsKLSAgfQotCi1ub25kZWZhdWx0X3J1bGU6IEtfTk9OREVGQVVMVFJVTEUge2xlZkRhdGEtPmxlZkR1bWJNb2RlID0gMTsgbGVmRGF0YS0+bGVmTm9OdW0gPSAxO30gVF9TVFJJTkcKLSAgewotICAgICh2b2lkKWxlZlNldE5vbkRlZmF1bHQoJDMpOwotICAgIGlmIChsZWZDYWxsYmFja3MtPk5vbkRlZmF1bHRDYmspIGxlZkRhdGEtPmxlZnJOb25EZWZhdWx0LnNldE5hbWUoJDMpOwotICAgIGxlZkRhdGEtPm5kTGF5ZXIgPSAwOwotICAgIGxlZkRhdGEtPm5kUnVsZSA9IDE7Ci0gICAgbGVmRGF0YS0+bnVtVmlhID0gMDsKLSAgICAvL3N0cmNweShsZWZEYXRhLT5ub25EZWZhdWx0UnVsZU5hbWUsICQzKTsKLSAgICBsZWZEYXRhLT5ub25EZWZhdWx0UnVsZU5hbWUgPSBzdHJkdXAoJDMpOwotICB9Ci0gIG5kX2hhcmRzcGFjaW5nCi0gIG5kX3J1bGVzIHtsZWZEYXRhLT5sZWZOZFJ1bGUgPSAxO30gZW5kX25kX3J1bGUKLSAgewotICAgIC8vIDEwLzE4LzIwMDEgLSBXYW5kYSBkYSBSb3NhLCBQQ1IgNDA0MTg5Ci0gICAgLy8gICAgICAgICAgICAgIEF0IGxlYXN0IDEgbGF5ZXIgaXMgcmVxdWlyZWQKLSAgICBpZiAoKCFsZWZEYXRhLT5uZExheWVyKSAmJiAoIWxlZlNldHRpbmdzLT5SZWxheE1vZGUpKSB7Ci0gICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+Tm9uRGVmYXVsdENiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICBpZiAobGVmRGF0YS0+bm9uRGVmYXVsdFdhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+Tm9uRGVmYXVsdFdhcm5pbmdzKSB7Ci0gICAgICAgICAgICBsZWZFcnJvcigxNjE3LCAiTk9OREVGQVVMVFJVTEUgc3RhdGVtZW50IHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBMQVlFUiBzdGF0ZW1lbnQuIik7Ci0gICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgfQotICAgIGlmICgoIWxlZkRhdGEtPm51bVZpYSkgJiYgKCFsZWZTZXR0aW5ncy0+UmVsYXhNb2RlKSAmJiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNikpIHsKLSAgICAgICAvLyBWSUEgaXMgbm8gbG9uZ2VyIGEgcmVxdWlyZWQgc3RhdGVtZW50IGluIDUuNgotICAgICAgIGlmIChsZWZDYWxsYmFja3MtPk5vbkRlZmF1bHRDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgaWYgKGxlZkRhdGEtPm5vbkRlZmF1bHRXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPk5vbkRlZmF1bHRXYXJuaW5ncykgewotICAgICAgICAgICAgbGVmRXJyb3IoMTYxOCwgIk5PTkRFRkFVTFRSVUxFIHN0YXRlbWVudCByZXF1aXJlcyBhdCBsZWFzdCBvbmUgVklBIHN0YXRlbWVudC4iKTsKLSAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgfQotICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+Tm9uRGVmYXVsdENiaykgewotICAgICAgbGVmRGF0YS0+bGVmck5vbkRlZmF1bHQuZW5kKCk7Ci0gICAgICBDQUxMQkFDSyhsZWZDYWxsYmFja3MtPk5vbkRlZmF1bHRDYmssIGxlZnJOb25EZWZhdWx0Q2JrVHlwZSwgJmxlZkRhdGEtPmxlZnJOb25EZWZhdWx0KTsKLSAgICB9Ci0gICAgbGVmRGF0YS0+bmRSdWxlID0gMDsKLSAgICBsZWZEYXRhLT5sZWZEdW1iTW9kZSA9IDA7Ci0gICAgKHZvaWQpbGVmVW5zZXROb25EZWZhdWx0KCk7Ci0gIH0KLQotZW5kX25kX3J1bGU6IEtfRU5ECi0gICAgewotICAgICAgaWYgKChsZWZEYXRhLT5ub25EZWZhdWx0UnVsZU5hbWUpICYmICgqbGVmRGF0YS0+bm9uRGVmYXVsdFJ1bGVOYW1lICE9ICdcMCcpKQotICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm5vbkRlZmF1bHRSdWxlTmFtZSk7Ci0gICAgfQotICB8IEtfRU5EIFRfU1RSSU5HCi0gICAgewotICAgICAgaWYgKHN0cmNtcChsZWZEYXRhLT5ub25EZWZhdWx0UnVsZU5hbWUsICQyKSAhPSAwKSB7Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPk5vbkRlZmF1bHRDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgIGlmIChsZWZEYXRhLT5ub25EZWZhdWx0V2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5Ob25EZWZhdWx0V2FybmluZ3MpIHsKLSAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAgIkVORCBOT05ERUZBVUxUUlVMRSBuYW1lICVzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBOT05ERUZBVUxUUlVMRSBuYW1lICVzLlxuQ29ycmVjdCB0aGUgTEVGIGZpbGUgYmVmb3JlIHJlcnVubmluZyBpdCB0aHJvdWdoIHRoZSBMRUYgcGFyc2VyLiIsICQyLCBsZWZEYXRhLT5ub25EZWZhdWx0UnVsZU5hbWUpOwotICAgICAgICAgICAgIGxlZkVycm9yKDE2MTksIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5ub25EZWZhdWx0UnVsZU5hbWUpOwotICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm5vbkRlZmF1bHRSdWxlTmFtZSk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm5vbkRlZmF1bHRSdWxlTmFtZSk7Ci0gICAgICB9IGVsc2UKLSAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5ub25EZWZhdWx0UnVsZU5hbWUpOwotICAgIH0KLSAgOwotCi1uZF9oYXJkc3BhY2luZzoKLSAgLy8gZW1wdHkgCi0gIHwgS19IQVJEU1BBQ0lORyAnOycgICAvLyBIQVJEU1BBQ0lORyBpcyBvcHRpb25hbCBpbiA1LjYgCi0gICAgewotICAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS42KSB7Ci0gICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+Tm9uRGVmYXVsdENiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bm9uRGVmYXVsdFdhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+Tm9uRGVmYXVsdFdhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgIkhBUkRTUEFDSU5HIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS42IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgbGVmRXJyb3IoMTYyMCwgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICB9IGVsc2UgCi0gICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+Tm9uRGVmYXVsdENiaykKLSAgICAgICAgICAgICBsZWZEYXRhLT5sZWZyTm9uRGVmYXVsdC5zZXRIYXJkc3BhY2luZygpOwotICAgIH0KLSAgOwotCi1uZF9ydWxlczogLy8gZW1wdHkgCi0gIHwgbmRfcnVsZXMgbmRfcnVsZQotICA7Ci0KLW5kX3J1bGU6Ci0gIG5kX2xheWVyCi0gIHwgdmlhCi0gIHwgc3BhY2luZ19ydWxlCi0gIHwgbmRfcHJvcAotICB8IHVzZXZpYQotICB8IHVzZXZpYXJ1bGUKLSAgfCBtaW5jdXRzCi0gIDsKLQotdXNldmlhOiBLX1VTRVZJQSBUX1NUUklORyAnOycKLSAgICB7Ci0gICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjYpIHsKLSAgICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5Ob25EZWZhdWx0Q2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAiVVNFVklBIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS42IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgIGxlZkVycm9yKDE2MjEsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgIH0KLSAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPk5vbkRlZmF1bHRDYmspCi0gICAgICAgICAgICAgbGVmRGF0YS0+bGVmck5vbkRlZmF1bHQuYWRkVXNlVmlhKCQyKTsKLSAgICAgICB9Ci0gICAgfQotCi11c2V2aWFydWxlOiAgS19VU0VWSUFSVUxFIFRfU1RSSU5HICc7JwotICAgIHsKLSAgICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNikgewotICAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPk5vbkRlZmF1bHRDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgIGlmIChsZWZEYXRhLT5ub25EZWZhdWx0V2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5Ob25EZWZhdWx0V2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAgICAiVVNFVklBUlVMRSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgICBsZWZFcnJvcigxNjIyLCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+Tm9uRGVmYXVsdENiaykKLSAgICAgICAgICAgICBsZWZEYXRhLT5sZWZyTm9uRGVmYXVsdC5hZGRVc2VWaWFSdWxlKCQyKTsKLSAgICAgICB9Ci0gICAgfQotCi1taW5jdXRzOiBLX01JTkNVVFMgVF9TVFJJTkcgaW50X251bWJlciAnOycKLSAgICB7Ci0gICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjYpIHsKLSAgICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5Ob25EZWZhdWx0Q2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgICBpZiAobGVmRGF0YS0+bm9uRGVmYXVsdFdhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+Tm9uRGVmYXVsdFdhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAgIk1JTkNVVFMgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjYgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICAgbGVmRXJyb3IoMTYyMywgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPk5vbkRlZmF1bHRDYmspCi0gICAgICAgICAgICAgbGVmRGF0YS0+bGVmck5vbkRlZmF1bHQuYWRkTWluQ3V0cygkMiwgKGludCkkMyk7Ci0gICAgICAgfQotICAgIH0KLQotbmRfcHJvcDogS19QUk9QRVJUWSB7IGxlZkRhdGEtPmxlZkR1bWJNb2RlID0gMTAwMDAwMDA7fSBuZF9wcm9wX2xpc3QgJzsnCi0gICAgeyBsZWZEYXRhLT5sZWZEdW1iTW9kZSA9IDA7Ci0gICAgfQotCi1uZF9wcm9wX2xpc3Q6Ci0gIG5kX3Byb3AKLSAgfCBuZF9wcm9wX2xpc3QgbmRfcHJvcAotICA7Ci0KLW5kX3Byb3A6Ci0gIFRfU1RSSU5HIFRfU1RSSU5HCi0gICAgewotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+Tm9uRGVmYXVsdENiaykgewotICAgICAgICAgY2hhciBwcm9wVHA7Ci0gICAgICAgICBwcm9wVHAgPSBsZWZTZXR0aW5ncy0+bGVmUHJvcHMubGVmck5vbmRlZlByb3AucHJvcFR5cGUoJDEpOwotICAgICAgICAgbGVmRGF0YS0+bGVmck5vbkRlZmF1bHQuYWRkUHJvcCgkMSwgJDIsIHByb3BUcCk7Ci0gICAgICB9Ci0gICAgfQotICB8IFRfU1RSSU5HIFFTVFJJTkcKLSAgICB7Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5Ob25EZWZhdWx0Q2JrKSB7Ci0gICAgICAgICBjaGFyIHByb3BUcDsKLSAgICAgICAgIHByb3BUcCA9IGxlZlNldHRpbmdzLT5sZWZQcm9wcy5sZWZyTm9uZGVmUHJvcC5wcm9wVHlwZSgkMSk7Ci0gICAgICAgICBsZWZEYXRhLT5sZWZyTm9uRGVmYXVsdC5hZGRQcm9wKCQxLCAkMiwgcHJvcFRwKTsKLSAgICAgIH0KLSAgICB9Ci0gIHwgVF9TVFJJTkcgTlVNQkVSCi0gICAgewotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+Tm9uRGVmYXVsdENiaykgewotICAgICAgICAgY2hhciB0ZW1wWzMyXTsKLSAgICAgICAgIGNoYXIgcHJvcFRwOwotICAgICAgICAgc3ByaW50Zih0ZW1wLCAiJS4xMWciLCAkMik7Ci0gICAgICAgICBwcm9wVHAgPSBsZWZTZXR0aW5ncy0+bGVmUHJvcHMubGVmck5vbmRlZlByb3AucHJvcFR5cGUoJDEpOwotICAgICAgICAgbGVmRGF0YS0+bGVmck5vbkRlZmF1bHQuYWRkTnVtUHJvcCgkMSwgJDIsIHRlbXAsIHByb3BUcCk7Ci0gICAgICB9Ci0gICAgfQotCi1uZF9sYXllcjogS19MQVlFUiB7bGVmRGF0YS0+bGVmRHVtYk1vZGUgPSAxOyBsZWZEYXRhLT5sZWZOb051bSA9IDE7fSBUX1NUUklORwotICB7Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+Tm9uRGVmYXVsdENiaykgbGVmRGF0YS0+bGVmck5vbkRlZmF1bHQuYWRkTGF5ZXIoJDMpOwotICAgIGxlZkRhdGEtPm5kTGF5ZXIrKzsKLSAgICAvL3N0cmNweShsZWZEYXRhLT5sYXllck5hbWUsICQzKTsKLSAgICBsZWZEYXRhLT5sYXllck5hbWUgPSBzdHJkdXAoJDMpOwotICAgIGxlZkRhdGEtPm5kTGF5ZXJXaWR0aCA9IDA7Ci0gICAgbGVmRGF0YS0+bmRMYXllclNwYWNlID0gMDsKLSAgfQotICBLX1dJRFRIIGludF9udW1iZXIgJzsnCi0gIHsgCi0gICAgbGVmRGF0YS0+bmRMYXllcldpZHRoID0gMTsKLSAgICBpZiAobGVmQ2FsbGJhY2tzLT5Ob25EZWZhdWx0Q2JrKSBsZWZEYXRhLT5sZWZyTm9uRGVmYXVsdC5hZGRXaWR0aCgkNik7Ci0gIH0KLSAgbmRfbGF5ZXJfc3RtdHMgS19FTkQge2xlZkRhdGEtPmxlZkR1bWJNb2RlID0gMTsgbGVmRGF0YS0+bGVmTm9OdW0gPSAxO30gVF9TVFJJTkcKLSAgewotICAgIGlmIChzdHJjbXAobGVmRGF0YS0+bGF5ZXJOYW1lLCAkMTIpICE9IDApIHsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPk5vbkRlZmF1bHRDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgaWYgKGxlZkRhdGEtPm5vbkRlZmF1bHRXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPk5vbkRlZmF1bHRXYXJuaW5ncykgewotICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAiRU5EIExBWUVSIG5hbWUgJXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIExBWUVSIG5hbWUgJXMuXG5Db3JyZWN0IHRoZSBMRUYgZmlsZSBiZWZvcmUgcmVydW5uaW5nIGl0IHRocm91Z2ggdGhlIExFRiBwYXJzZXIuIiwgJDMsIGxlZkRhdGEtPmxheWVyTmFtZSk7Ci0gICAgICAgICAgICBsZWZFcnJvcigxNjI0LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5sYXllck5hbWUpOwotICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+bGF5ZXJOYW1lKTsKLSAgICAgIH0gZWxzZQotICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5sYXllck5hbWUpOwotICAgIH0gZWxzZQotICAgICAgbGVmRnJlZShsZWZEYXRhLT5sYXllck5hbWUpOwotICAgIGlmICghbGVmRGF0YS0+bmRMYXllcldpZHRoKSB7Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5Ob25EZWZhdWx0Q2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgIGlmIChsZWZEYXRhLT5ub25EZWZhdWx0V2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5Ob25EZWZhdWx0V2FybmluZ3MpIHsKLSAgICAgICAgICAgIGxlZkVycm9yKDE2MjUsICJBIFdJRFRIIHN0YXRlbWVudCBpcyByZXF1aXJlZCBpbiB0aGUgTEFZRVIgc3RhdGVtZW50IGluIE5PTkRFRlVMVFJVTEUuIik7Ci0gICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFsZWZEYXRhLT5uZExheWVyU3BhY2UgJiYgbGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNikgeyAgIC8vIDUuNiwgU1BBQ0lORyBpcyBvcHRpb25hbAotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+Tm9uRGVmYXVsdENiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICBpZiAobGVmRGF0YS0+bm9uRGVmYXVsdFdhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+Tm9uRGVmYXVsdFdhcm5pbmdzKSB7Ci0gICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICJBIFNQQUNJTkcgc3RhdGVtZW50IGlzIHJlcXVpcmVkIGluIHRoZSBMQVlFUiBzdGF0ZW1lbnQgaW4gTk9OREVGQVVMVFJVTEUgZm9yIGxlZiBmaWxlIHdpdGggdmVyc2lvbiA1LjUgYW5kIGVhcmxpZXIuXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiBVcGRhdGUgeW91ciBsZWYgdG8gYWRkIGEgTEFZRVIgc3RhdGVtZW50IGFuZCB0cnkgYWdhaW4uIiwKLSAgICAgICAgICAgICAgICBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgIGxlZkVycm9yKDE2MjYsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgOwotCi1uZF9sYXllcl9zdG10czoKLSAgLy8gZW1wdHkgCi0gIHwgbmRfbGF5ZXJfc3RtdHMgbmRfbGF5ZXJfc3RtdAotICA7Ci0KLW5kX2xheWVyX3N0bXQ6Ci0gIEtfU1BBQ0lORyBpbnRfbnVtYmVyICc7JwotICAgIHsKLSAgICAgIGxlZkRhdGEtPm5kTGF5ZXJTcGFjZSA9IDE7Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5Ob25EZWZhdWx0Q2JrKSBsZWZEYXRhLT5sZWZyTm9uRGVmYXVsdC5hZGRTcGFjaW5nKCQyKTsKLSAgICB9Ci0gIHwgS19XSVJFRVhURU5TSU9OIGludF9udW1iZXIgJzsnCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5Ob25EZWZhdWx0Q2JrKQotICAgICAgICAgbGVmRGF0YS0+bGVmck5vbkRlZmF1bHQuYWRkV2lyZUV4dGVuc2lvbigkMik7IH0KLSAgfCBLX1JFU0lTVEFOQ0UgS19SUEVSU1EgaW50X251bWJlciAnOycKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+aWdub3JlVmVyc2lvbikgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+Tm9uRGVmYXVsdENiaykKLSAgICAgICAgICAgIGxlZkRhdGEtPmxlZnJOb25EZWZhdWx0LmFkZFJlc2lzdGFuY2UoJDMpOwotICAgICAgfSBlbHNlIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS40KSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5Ob25EZWZhdWx0Q2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5ub25EZWZhdWx0V2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5Ob25EZWZhdWx0V2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAiUkVTSVNUQU5DRSBSUEVSU1Egc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICBsZWZFcnJvcigxNjI3LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPiA1LjUpIHsgIC8vIG9ic29sZXRlIGluIDUuNgotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+Tm9uRGVmYXVsdENiaykgLy8gd3JpdGUgd2FybmluZyBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bm9uRGVmYXVsdFdhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+Tm9uRGVmYXVsdFdhcm5pbmdzKQotICAgICAgICAgICAgICBsZWZXYXJuaW5nKDIwMjksICJSRVNJU1RBTkNFIFJQRVJTUSBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjYgb3IgbGF0ZXIuIik7Ci0gICAgICB9IGVsc2UgaWYgKGxlZkNhbGxiYWNrcy0+Tm9uRGVmYXVsdENiaykKLSAgICAgICAgIGxlZkRhdGEtPmxlZnJOb25EZWZhdWx0LmFkZFJlc2lzdGFuY2UoJDMpOwotICAgIH0gCi0gCi0gIHwgS19DQVBBQ0lUQU5DRSBLX0NQRVJTUURJU1QgaW50X251bWJlciAnOycKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+aWdub3JlVmVyc2lvbikgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+Tm9uRGVmYXVsdENiaykKLSAgICAgICAgICAgIGxlZkRhdGEtPmxlZnJOb25EZWZhdWx0LmFkZENhcGFjaXRhbmNlKCQzKTsKLSAgICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNCkgewotICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+Tm9uRGVmYXVsdENiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bm9uRGVmYXVsdFdhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+Tm9uRGVmYXVsdFdhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgIkNBUEFDSVRBTkNFIENQRVJTUURJU1Qgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICBsZWZFcnJvcigxNjI4LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPiA1LjUpIHsgLy8gb2Jzb2xldGUgaW4gNS42Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5Ob25EZWZhdWx0Q2JrKSAvLyB3cml0ZSB3YXJuaW5nIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5ub25EZWZhdWx0V2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5Ob25EZWZhdWx0V2FybmluZ3MpCi0gICAgICAgICAgICAgIGxlZldhcm5pbmcoMjAzMCwgIkNBUEFDSVRBTkNFIENQRVJTUURJU1Qgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS42LiBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNiBvciBsYXRlci4iKTsKLSAgICAgIH0gZWxzZSBpZiAobGVmQ2FsbGJhY2tzLT5Ob25EZWZhdWx0Q2JrKQotICAgICAgICAgbGVmRGF0YS0+bGVmck5vbkRlZmF1bHQuYWRkQ2FwYWNpdGFuY2UoJDMpOwotICAgIH0KLSAgfCBLX0VER0VDQVBBQ0lUQU5DRSBpbnRfbnVtYmVyICc7JwotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT5pZ25vcmVWZXJzaW9uKSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5Ob25EZWZhdWx0Q2JrKQotICAgICAgICAgICAgbGVmRGF0YS0+bGVmck5vbkRlZmF1bHQuYWRkRWRnZUNhcCgkMik7Ci0gICAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjQpIHsKLSAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPk5vbkRlZmF1bHRDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPm5vbkRlZmF1bHRXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPk5vbkRlZmF1bHRXYXJuaW5ncykgewotICAgICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAgICJFREdFQ0FQQUNJVEFOQ0Ugc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICBsZWZFcnJvcigxNjI5LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA+IDUuNSkgeyAgLy8gb2Jzb2xldGUgaW4gNS42Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5Ob25EZWZhdWx0Q2JrKSAvLyB3cml0ZSB3YXJuaW5nIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5ub25EZWZhdWx0V2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5Ob25EZWZhdWx0V2FybmluZ3MpCi0gICAgICAgICAgICAgIGxlZldhcm5pbmcoMjAzMSwgIkVER0VDQVBBQ0lUQU5DRSBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjYgb3IgbGF0ZXIuIik7Ci0gICAgICB9IGVsc2UgaWYgKGxlZkNhbGxiYWNrcy0+Tm9uRGVmYXVsdENiaykKLSAgICAgICAgIGxlZkRhdGEtPmxlZnJOb25EZWZhdWx0LmFkZEVkZ2VDYXAoJDIpOwotICAgIH0KLSAgfCBLX0RJQUdXSURUSCBpbnRfbnVtYmVyICc7JwotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS42KSB7ICAvLyA1LjYgc3ludGF4Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5Ob25EZWZhdWx0Q2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5ub25EZWZhdWx0V2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5Ob25EZWZhdWx0V2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAiRElBR1dJRFRIIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS42IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgbGVmRXJyb3IoMTYzMCwgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIENIS0VSUigpOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5Ob25EZWZhdWx0Q2JrKQotICAgICAgICAgICAgbGVmRGF0YS0+bGVmck5vbkRlZmF1bHQuYWRkRGlhZ1dpZHRoKCQyKTsKLSAgICAgIH0KLSAgICB9Ci0KLXNpdGU6IHN0YXJ0X3NpdGUgc2l0ZV9vcHRpb25zIGVuZF9zaXRlCi0gICAgeyAKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPlNpdGVDYmspCi0gICAgICAgIENBTExCQUNLKGxlZkNhbGxiYWNrcy0+U2l0ZUNiaywgbGVmclNpdGVDYmtUeXBlLCAmbGVmRGF0YS0+bGVmclNpdGUpOwotICAgIH0KLQotc3RhcnRfc2l0ZTogS19TSVRFIHtsZWZEYXRhLT5sZWZEdW1iTW9kZSA9IDE7IGxlZkRhdGEtPmxlZk5vTnVtID0gMTt9IFRfU1RSSU5HIAotICAgIHsgCi0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5TaXRlQ2JrKSBsZWZEYXRhLT5sZWZyU2l0ZS5zZXROYW1lKCQzKTsKLSAgICAgIC8vc3RyY3B5KGxlZkRhdGEtPnNpdGVOYW1lLCAkMyk7Ci0gICAgICBsZWZEYXRhLT5zaXRlTmFtZSA9IHN0cmR1cCgkMyk7Ci0gICAgICBsZWZEYXRhLT5oYXNTaXRlQ2xhc3MgPSAwOwotICAgICAgbGVmRGF0YS0+aGFzU2l0ZVNpemUgPSAwOwotICAgICAgbGVmRGF0YS0+aGFzU2l0ZSA9IDE7Ci0gICAgfQotCi1lbmRfc2l0ZTogS19FTkQge2xlZkRhdGEtPmxlZkR1bWJNb2RlID0gMTsgbGVmRGF0YS0+bGVmTm9OdW0gPSAxO30gVF9TVFJJTkcKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wKGxlZkRhdGEtPnNpdGVOYW1lLCAkMykgIT0gMCkgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5TaXRlQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPnNpdGVXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPlNpdGVXYXJuaW5ncykgewotICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAiRU5EIFNJVEUgbmFtZSAlcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgU0lURSBuYW1lICVzLlxuQ29ycmVjdCB0aGUgTEVGIGZpbGUgYmVmb3JlIHJlcnVubmluZyBpdCB0aHJvdWdoIHRoZSBMRUYgcGFyc2VyLiIsICQzLCBsZWZEYXRhLT5zaXRlTmFtZSk7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE2MzEsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5zaXRlTmFtZSk7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5zaXRlTmFtZSk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPnNpdGVOYW1lKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGxlZkZyZWUobGVmRGF0YS0+c2l0ZU5hbWUpOwotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5TaXRlQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICBpZiAobGVmRGF0YS0+aGFzU2l0ZUNsYXNzID09IDApIHsKLSAgICAgICAgICAgICBsZWZFcnJvcigxNjMyLCAiQSBDTEFTUyBzdGF0ZW1lbnQgaXMgcmVxdWlyZWQgaW4gdGhlIFNJVEUgc3RhdGVtZW50LiIpOwotICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAobGVmRGF0YS0+aGFzU2l0ZVNpemUgPT0gMCkgewotICAgICAgICAgICAgIGxlZkVycm9yKDE2MzMsICJBIFNJWkUgIHN0YXRlbWVudCBpcyByZXF1aXJlZCBpbiB0aGUgU0lURSBzdGF0ZW1lbnQuIik7Ci0gICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi1zaXRlX29wdGlvbnM6Ci0gIC8vIGVtcHR5IAotICB8IHNpdGVfb3B0aW9ucyBzaXRlX29wdGlvbgotICA7Ci0KLXNpdGVfb3B0aW9uOgotICBLX1NJWkUgaW50X251bWJlciBLX0JZIGludF9udW1iZXIgJzsnIAotICAgIHsKLQotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+U2l0ZUNiaykgbGVmRGF0YS0+bGVmclNpdGUuc2V0U2l6ZSgkMiwkNCk7Ci0gICAgICBsZWZEYXRhLT5oYXNTaXRlU2l6ZSA9IDE7Ci0gICAgfQotICB8IHNpdGVfc3ltbWV0cnlfc3RhdGVtZW50Ci0gICAgeyB9Ci0gIHwgc2l0ZV9jbGFzcyAKLSAgICB7IAotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+U2l0ZUNiaykgbGVmRGF0YS0+bGVmclNpdGUuc2V0Q2xhc3MoJDEpOwotICAgICAgbGVmRGF0YS0+aGFzU2l0ZUNsYXNzID0gMTsKLSAgICB9Ci0gIHwgc2l0ZV9yb3dwYXR0ZXJuX3N0YXRlbWVudAotICAgIHsgfQotCi1zaXRlX2NsYXNzOgotICBLX0NMQVNTIEtfUEFEICc7JyB7JCQgPSAoY2hhciopIlBBRCI7IH0KLSAgfCBLX0NMQVNTIEtfQ09SRSAnOycgIHskJCA9IChjaGFyKikiQ09SRSI7IH0KLSAgfCBLX0NMQVNTIEtfVklSVFVBTCAnOycgIHskJCA9IChjaGFyKikiVklSVFVBTCI7IH0KLQotc2l0ZV9zeW1tZXRyeV9zdGF0ZW1lbnQ6IEtfU1lNTUVUUlkgc2l0ZV9zeW1tZXRyaWVzICc7JwotICAgIHsgfQotCi1zaXRlX3N5bW1ldHJpZXM6Ci0gIC8vIGVtcHR5IAotICB8IHNpdGVfc3ltbWV0cmllcyBzaXRlX3N5bW1ldHJ5Ci0gIDsKLQotc2l0ZV9zeW1tZXRyeToKLSAgS19YIAotICAgIHsgaWYgKGxlZkNhbGxiYWNrcy0+U2l0ZUNiaykgbGVmRGF0YS0+bGVmclNpdGUuc2V0WFN5bW1ldHJ5KCk7IH0KLSAgfCBLX1kgCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5TaXRlQ2JrKSBsZWZEYXRhLT5sZWZyU2l0ZS5zZXRZU3ltbWV0cnkoKTsgfQotICB8IEtfUjkwCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5TaXRlQ2JrKSBsZWZEYXRhLT5sZWZyU2l0ZS5zZXQ5MFN5bW1ldHJ5KCk7IH0KLQotc2l0ZV9yb3dwYXR0ZXJuX3N0YXRlbWVudDogS19ST1dQQVRURVJOIHtsZWZEYXRhLT5sZWZEdW1iTW9kZSA9IDE7IGxlZkRhdGEtPmxlZk5vTnVtID0gMTt9Ci0gICAgc2l0ZV9yb3dwYXR0ZXJucyAnOycKLSAgICB7IH0KLQotc2l0ZV9yb3dwYXR0ZXJuczoKLSAgLy8gZW1wdHkgCi0gIHwgc2l0ZV9yb3dwYXR0ZXJucyBzaXRlX3Jvd3BhdHRlcm4KLSAgOwotCi1zaXRlX3Jvd3BhdHRlcm46IFRfU1RSSU5HIG9yaWVudGF0aW9uIHtsZWZEYXRhLT5sZWZEdW1iTW9kZSA9IDE7IGxlZkRhdGEtPmxlZk5vTnVtID0gMTt9Ci0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5TaXRlQ2JrKSBsZWZEYXRhLT5sZWZyU2l0ZS5hZGRSb3dQYXR0ZXJuKCQxLCAkMik7IH0KLQotcHQ6Ci0gIGludF9udW1iZXIgaW50X251bWJlcgotICAgIHsgJCQueCA9ICQxOyAkJC55ID0gJDI7IH0KLSAgfCAnKCcgaW50X251bWJlciBpbnRfbnVtYmVyICcpJwotICAgIHsgJCQueCA9ICQyOyAkJC55ID0gJDM7IH0KLQotbWFjcm86IHN0YXJ0X21hY3JvIG1hY3JvX29wdGlvbnMKLSAgICB7IAotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TWFjcm9DYmspCi0gICAgICAgIENBTExCQUNLKGxlZkNhbGxiYWNrcy0+TWFjcm9DYmssIGxlZnJNYWNyb0Nia1R5cGUsICZsZWZEYXRhLT5sZWZyTWFjcm8pOwotICAgICAgbGVmRGF0YS0+bGVmckRvU2l0ZSA9IDA7Ci0gICAgfQotICAgIGVuZF9tYWNybwotCi1zdGFydF9tYWNybzogS19NQUNSTyB7bGVmRGF0YS0+bGVmRHVtYk1vZGUgPSAxOyBsZWZEYXRhLT5sZWZOb051bSA9IDE7fSBUX1NUUklORyAKLSAgICB7Ci0gICAgICBsZWZEYXRhLT5zaXRlRGVmID0gMDsKLSAgICAgIGxlZkRhdGEtPnN5bURlZiA9IDA7Ci0gICAgICBsZWZEYXRhLT5zaXplRGVmID0gMDsgCi0gICAgICBsZWZEYXRhLT5waW5EZWYgPSAwOyAKLSAgICAgIGxlZkRhdGEtPm9ic0RlZiA9IDA7IAotICAgICAgbGVmRGF0YS0+b3JpZ0RlZiA9IDA7Ci0gICAgICBsZWZEYXRhLT5sZWZyTWFjcm8uY2xlYXIoKTsgICAgICAKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPk1hY3JvQmVnaW5DYmsgfHwgbGVmQ2FsbGJhY2tzLT5NYWNyb0NiaykgewotICAgICAgICAvLyBzb21lIHJlYWRlciBtYXkgbm90IGhhdmUgTWFjcm9CZWdpbkNCLCBidXQgaGFzIE1hY3JvQ0Igc2V0Ci0gICAgICAgIGxlZkRhdGEtPmxlZnJNYWNyby5zZXROYW1lKCQzKTsKLSAgICAgICAgQ0FMTEJBQ0sobGVmQ2FsbGJhY2tzLT5NYWNyb0JlZ2luQ2JrLCBsZWZyTWFjcm9CZWdpbkNia1R5cGUsICQzKTsKLSAgICAgIH0KLSAgICAgIC8vc3RyY3B5KGxlZkRhdGEtPm1hY3JvTmFtZSwgJDMpOwotICAgICAgbGVmRGF0YS0+bWFjcm9OYW1lID0gc3RyZHVwKCQzKTsKLSAgICB9Ci0KLWVuZF9tYWNybzogS19FTkQge2xlZkRhdGEtPmxlZkR1bWJNb2RlID0gMTsgbGVmRGF0YS0+bGVmTm9OdW0gPSAxO30gVF9TVFJJTkcKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wKGxlZkRhdGEtPm1hY3JvTmFtZSwgJDMpICE9IDApIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TWFjcm9FbmRDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+bWFjcm9XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPk1hY3JvV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgIkVORCBNQUNSTyBuYW1lICVzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBNQUNSTyBuYW1lICVzLlxuQ29ycmVjdCB0aGUgTEVGIGZpbGUgYmVmb3JlIHJlcnVubmluZyBpdCB0aHJvdWdoIHRoZSBMRUYgcGFyc2VyLiIsICQzLCBsZWZEYXRhLT5tYWNyb05hbWUpOwotICAgICAgICAgICAgICBsZWZFcnJvcigxNjM0LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+bWFjcm9OYW1lKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm1hY3JvTmFtZSk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm1hY3JvTmFtZSk7Ci0gICAgICB9IGVsc2UKLSAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5tYWNyb05hbWUpOwotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TWFjcm9FbmRDYmspCi0gICAgICAgIENBTExCQUNLKGxlZkNhbGxiYWNrcy0+TWFjcm9FbmRDYmssIGxlZnJNYWNyb0VuZENia1R5cGUsICQzKTsKLSAgICB9Ci0KLW1hY3JvX29wdGlvbnM6Ci0gIC8vIGVtcHR5IAotICB8IG1hY3JvX29wdGlvbnMgbWFjcm9fb3B0aW9uICAgLy8gVXNlIGxlZnQgcmVjdXJzaW9ucyAKLSAgOwotCi1tYWNyb19vcHRpb246Ci0gIG1hY3JvX2NsYXNzIAotICB8IG1hY3JvX2dlbmVyYXRvciAKLSAgfCBtYWNyb19nZW5lcmF0ZSAKLSAgfCBtYWNyb19zb3VyY2UKLSAgfCBtYWNyb19zeW1tZXRyeV9zdGF0ZW1lbnQgCi0gIHwgbWFjcm9fZml4ZWRNYXNrCi0gICAgICB7IH0KLSAgfCBtYWNyb19vcmlnaW4gCi0gICAgICB7IH0KLSAgfCBtYWNyb19wb3dlciAKLSAgICAgIHsgfQotICB8IG1hY3JvX2ZvcmVpZ24KLSAgICAgIHsgfQotICB8IG1hY3JvX2VlcSAKLSAgfCBtYWNyb19sZXEgCi0gIHwgbWFjcm9fc2l6ZSAKLSAgICAgIHsgfQotICB8IG1hY3JvX3NpdGUgCi0gICAgICB7IH0KLSAgfCBtYWNyb19waW4gCi0gICAgICB7IH0KLSAgfCBLX0ZVTkNUSU9OIEtfQlVGRkVSICc7JwotICAgICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5NYWNyb0NiaykgbGVmRGF0YS0+bGVmck1hY3JvLnNldEJ1ZmZlcigpOyB9Ci0gIHwgS19GVU5DVElPTiBLX0lOVkVSVEVSICc7JwotICAgICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5NYWNyb0NiaykgbGVmRGF0YS0+bGVmck1hY3JvLnNldEludmVydGVyKCk7IH0KLSAgfCBtYWNyb19vYnMgCi0gICAgICB7IH0KLSAgfCBtYWNyb19kZW5zaXR5IAotICAgICAgeyB9Ci0gIHwgbWFjcm9fY2xvY2t0eXBlIAotICAgICAgeyB9Ci0gIHwgdGltaW5nCi0gICAgICB7IH0KLSAgfCBLX1BST1BFUlRZIHtsZWZEYXRhLT5sZWZEdW1iTW9kZSA9IDEwMDAwMDA7IH0gbWFjcm9fcHJvcF9saXN0ICAnOycKLSAgICAgIHsgbGVmRGF0YS0+bGVmRHVtYk1vZGUgPSAwOwotICAgICAgfQotCi1tYWNyb19wcm9wX2xpc3Q6Ci0gIG1hY3JvX25hbWVfdmFsdWVfcGFpcgotICB8IG1hY3JvX3Byb3BfbGlzdCBtYWNyb19uYW1lX3ZhbHVlX3BhaXIKLSAgOwotCi1tYWNyb19zeW1tZXRyeV9zdGF0ZW1lbnQ6IEtfU1lNTUVUUlkgbWFjcm9fc3ltbWV0cmllcyAnOycKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+c2l0ZURlZikgeyAvLyBTSVRFIGlzIGRlZmluZWQgYmVmb3JlIFNZTU1FVFJZIAotICAgICAgICAgIC8vIHBjciAyODM4NDYgc3VwcHJlc3Mgd2FybmluZyAKLSAgICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5NYWNyb0NiaykgLy8gd3JpdGUgd2FybmluZyBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICAgaWYgKGxlZkRhdGEtPm1hY3JvV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5NYWNyb1dhcm5pbmdzKQotICAgICAgICAgICAgICAgbGVmV2FybmluZygyMDMyLCAiQSBTSVRFIHN0YXRlbWVudCBpcyBkZWZpbmVkIGJlZm9yZSBTWU1NRVRSWSBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgZGVmaW5lIFNJVEUgYWZ0ZXIgU1lNTUVUUlkiKTsKLSAgICAgIH0KLSAgICAgIGxlZkRhdGEtPnN5bURlZiA9IDE7Ci0gICAgfQotCi1tYWNyb19zeW1tZXRyaWVzOgotICAvLyBlbXB0eSAKLSAgfCBtYWNyb19zeW1tZXRyaWVzIG1hY3JvX3N5bW1ldHJ5Ci0gIDsKLQotbWFjcm9fc3ltbWV0cnk6Ci0gIEtfWCAKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPk1hY3JvQ2JrKSBsZWZEYXRhLT5sZWZyTWFjcm8uc2V0WFN5bW1ldHJ5KCk7IH0KLSAgfCBLX1kgCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5NYWNyb0NiaykgbGVmRGF0YS0+bGVmck1hY3JvLnNldFlTeW1tZXRyeSgpOyB9Ci0gIHwgS19SOTAKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPk1hY3JvQ2JrKSBsZWZEYXRhLT5sZWZyTWFjcm8uc2V0OTBTeW1tZXRyeSgpOyB9Ci0KLW1hY3JvX25hbWVfdmFsdWVfcGFpcjoKLSAgVF9TVFJJTkcgTlVNQkVSCi0gICAgewotICAgICAgY2hhciB0ZW1wWzMyXTsKLSAgICAgIHNwcmludGYodGVtcCwgIiUuMTFnIiwgJDIpOwotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TWFjcm9DYmspIHsKLSAgICAgICAgIGNoYXIgcHJvcFRwOwotICAgICAgICAgcHJvcFRwID0gbGVmU2V0dGluZ3MtPmxlZlByb3BzLmxlZnJNYWNyb1Byb3AucHJvcFR5cGUoJDEpOwotICAgICAgICAgbGVmRGF0YS0+bGVmck1hY3JvLnNldE51bVByb3BlcnR5KCQxLCAkMiwgdGVtcCwgIHByb3BUcCk7Ci0gICAgICB9Ci0gICAgfQotICB8IFRfU1RSSU5HIFFTVFJJTkcKLSAgICB7Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5NYWNyb0NiaykgewotICAgICAgICAgY2hhciBwcm9wVHA7Ci0gICAgICAgICBwcm9wVHAgPSBsZWZTZXR0aW5ncy0+bGVmUHJvcHMubGVmck1hY3JvUHJvcC5wcm9wVHlwZSgkMSk7Ci0gICAgICAgICBsZWZEYXRhLT5sZWZyTWFjcm8uc2V0UHJvcGVydHkoJDEsICQyLCBwcm9wVHApOwotICAgICAgfQotICAgIH0KLSAgfCBUX1NUUklORyBUX1NUUklORwotICAgIHsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPk1hY3JvQ2JrKSB7Ci0gICAgICAgICBjaGFyIHByb3BUcDsKLSAgICAgICAgIHByb3BUcCA9IGxlZlNldHRpbmdzLT5sZWZQcm9wcy5sZWZyTWFjcm9Qcm9wLnByb3BUeXBlKCQxKTsKLSAgICAgICAgIGxlZkRhdGEtPmxlZnJNYWNyby5zZXRQcm9wZXJ0eSgkMSwgJDIsIHByb3BUcCk7Ci0gICAgICB9Ci0gICAgfQotCi1tYWNyb19jbGFzczogS19DTEFTUyBjbGFzc190eXBlICc7JwotICAgIHsKLSAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5NYWNyb0NiaykgbGVmRGF0YS0+bGVmck1hY3JvLnNldENsYXNzKCQyKTsKLSAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5NYWNyb0NsYXNzVHlwZUNiaykKLSAgICAgICAgICBDQUxMQkFDSyhsZWZDYWxsYmFja3MtPk1hY3JvQ2xhc3NUeXBlQ2JrLCBsZWZyTWFjcm9DbGFzc1R5cGVDYmtUeXBlLCAkMik7Ci0gICAgfQotCi1jbGFzc190eXBlOgotICBLX0NPVkVSIHskJCA9IChjaGFyKikiQ09WRVIiOyB9Ci0gIHwgS19DT1ZFUiBLX0JVTVAKLSAgICB7ICQkID0gKGNoYXIqKSJDT1ZFUiBCVU1QIjsKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS41KSB7Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPk1hY3JvQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPm1hY3JvV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5NYWNyb1dhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGlmIChsZWZTZXR0aW5ncy0+UmVsYXhNb2RlKQotICAgICAgICAgICAgICAgICBsZWZXYXJuaW5nKDIwMzMsICJUaGUgc3RhdGVtZW50IENPVkVSIEJVTVAgaXMgYSBMRUYgdmVyaW9uIDUuNSBzeW50YXguXG5Zb3VyIExFRiBmaWxlIGlzIHZlcnNpb24gNS40IG9yIGVhcmxpZXIgd2hpY2ggaXMgaW5jb3JyZWN0IGJ1dCB3aWxsIGJlIGFsbG93ZWRcbmJlY2F1c2UgdGhpcyBhcHBsaWNhdGlvbiBkb2VzIG5vdCBlbmZvcmNlIHN0cmljdCB2ZXJzaW9uIGNoZWNraW5nLlxuT3RoZXIgdG9vbHMgdGhhdCBlbmZvcmNlIHN0cmljdCBjaGVja2luZyB3aWxsIGhhdmUgYSBzeW50YXggZXJyb3Igd2hlbiByZWFkaW5nIHRoaXMgZmlsZS5cbllvdSBjYW4gY2hhbmdlIHRoZSBWRVJTSU9OIHN0YXRlbWVudCBpbiB0aGlzIExFRiBmaWxlIHRvIDUuNSBvciBoaWdoZXIgdG8gc3RvcCB0aGlzIHdhcm5pbmcuIik7Ci0gICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAgICAiQ09WRVIgQlVNUCBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNSBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgICAgbGVmRXJyb3IoMTYzNSwgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIHwgS19SSU5HICAgIHskJCA9IChjaGFyKikiUklORyI7IH0KLSAgfCBLX0JMT0NLICAgeyQkID0gKGNoYXIqKSJCTE9DSyI7IH0KLSAgfCBLX0JMT0NLIEtfQkxBQ0tCT1ggCi0gICAgeyAkJCA9IChjaGFyKikiQkxPQ0sgQkxBQ0tCT1giOwotICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjUpIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TWFjcm9DYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+bWFjcm9XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPk1hY3JvV2FybmluZ3MpIHsKLSAgICAgICAgICAgICBpZiAobGVmU2V0dGluZ3MtPlJlbGF4TW9kZSkKLSAgICAgICAgICAgICAgICBsZWZXYXJuaW5nKDIwMzQsICJUaGUgc3RhdGVtZW50IEJMT0NLIEJMQUNLQk9YIGlzIGEgTEVGIHZlcmlvbiA1LjUgc3ludGF4LlxuWW91ciBMRUYgZmlsZSBpcyB2ZXJzaW9uIDUuNCBvciBlYXJsaWVyIHdoaWNoIGlzIGluY29ycmVjdCBidXQgd2lsbCBiZSBhbGxvd2VkXG5iZWNhdXNlIHRoaXMgYXBwbGljYXRpb24gZG9lcyBub3QgZW5mb3JjZSBzdHJpY3QgdmVyc2lvbiBjaGVja2luZy5cbk90aGVyIHRvb2xzIHRoYXQgZW5mb3JjZSBzdHJpY3QgY2hlY2tpbmcgd2lsbCBoYXZlIGEgc3ludGF4IGVycm9yIHdoZW4gcmVhZGluZyB0aGlzIGZpbGUuXG5Zb3UgY2FuIGNoYW5nZSB0aGUgVkVSU0lPTiBzdGF0ZW1lbnQgaW4gdGhpcyBMRUYgZmlsZSB0byA1LjUgb3IgaGlnaGVyIHRvIHN0b3AgdGhpcyB3YXJuaW5nLiIpOwotICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgICAgIkJMT0NLIEJMQUNLQk9YIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS41IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgICBsZWZFcnJvcigxNjM2LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfCBLX0JMT0NLIEtfU09GVAotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT5pZ25vcmVWZXJzaW9uKSB7Ci0gICAgICAgICQkID0gKGNoYXIqKSJCTE9DSyBTT0ZUIjsKLSAgICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNikgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5NYWNyb0NiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgIGlmIChsZWZEYXRhLT5tYWNyb1dhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TWFjcm9XYXJuaW5ncykgewotICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAiQkxPQ0sgU09GVCBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTYzNywgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgICQkID0gKGNoYXIqKSJCTE9DSyBTT0ZUIjsKLSAgICB9Ci0gIHwgS19OT05FICAgIHskJCA9IChjaGFyKikiTk9ORSI7IH0KLSAgfCBLX0JVTVAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS43IAotICAgICAgewotICAgICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNykgewotICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgIHNwcmludGYobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgIkJVTVAgaXMgYSB2ZXJzaW9uIDUuNyBvciBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgIGxlZkVycm9yKDE2OTgsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgIENIS0VSUigpOwotICAgICAgICB9Ci0gICAgICAgCi0gICAgICAgICQkID0gKGNoYXIqKSJCVU1QIjsKLSAgICAgfQotICB8IEtfUEFEICAgICB7JCQgPSAoY2hhciopIlBBRCI7IH0gCi0gIHwgS19WSVJUVUFMIHskJCA9IChjaGFyKikiVklSVFVBTCI7IH0KLSAgfCBLX1BBRCAgcGFkX3R5cGUgCi0gICAgICB7ICBzcHJpbnRmKGxlZkRhdGEtPnRlbXBfbmFtZSwgIlBBRCAlcyIsICQyKTsKLSAgICAgICAgJCQgPSBsZWZEYXRhLT50ZW1wX25hbWU7IAotICAgICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNSkgewotICAgICAgICAgICBpZiAoc3RyY21wKCJBUkVBSU8iLCAkMikgIT0gMCkgewotICAgICAgICAgICAgIHNwcmludGYobGVmRGF0YS0+dGVtcF9uYW1lLCAiUEFEICVzIiwgJDIpOwotICAgICAgICAgICAgICQkID0gbGVmRGF0YS0+dGVtcF9uYW1lOyAKLSAgICAgICAgICAgfSBlbHNlIGlmIChsZWZDYWxsYmFja3MtPk1hY3JvQ2JrKSB7IAotICAgICAgICAgICAgIGlmIChsZWZEYXRhLT5tYWNyb1dhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TWFjcm9XYXJuaW5ncykgewotICAgICAgICAgICAgICAgaWYgKGxlZlNldHRpbmdzLT5SZWxheE1vZGUpCi0gICAgICAgICAgICAgICAgICBsZWZXYXJuaW5nKDIwMzUsICJUaGUgc3RhdGVtZW50IFBBRCBBUkVBSU8gaXMgYSBMRUYgdmVyaW9uIDUuNSBzeW50YXguXG5Zb3VyIExFRiBmaWxlIGlzIHZlcnNpb24gNS40IG9yIGVhcmxpZXIgd2hpY2ggaXMgaW5jb3JyZWN0IGJ1dCB3aWxsIGJlIGFsbG93ZWRcbmJlY2F1c2UgdGhpcyBhcHBsaWNhdGlvbiBkb2VzIG5vdCBlbmZvcmNlIHN0cmljdCB2ZXJzaW9uIGNoZWNraW5nLlxuT3RoZXIgdG9vbHMgdGhhdCBlbmZvcmNlIHN0cmljdCBjaGVja2luZyB3aWxsIGhhdmUgYSBzeW50YXggZXJyb3Igd2hlbiByZWFkaW5nIHRoaXMgZmlsZS5cbllvdSBjYW4gY2hhbmdlIHRoZSBWRVJTSU9OIHN0YXRlbWVudCBpbiB0aGlzIExFRiBmaWxlIHRvIDUuNSBvciBoaWdoZXIgdG8gc3RvcCB0aGlzIHdhcm5pbmcuIik7Ci0gICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAgICAgIlBBRCBBUkVBSU8gc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjUgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICAgICBsZWZFcnJvcigxNjM4LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gIHwgS19DT1JFICAgIHskJCA9IChjaGFyKikiQ09SRSI7IH0KLSAgfCBLX0NPUk5FUiAKLSAgICAgIHskJCA9IChjaGFyKikiQ09STkVSIjsKLSAgICAgIC8vIFRoaXMgdG9rZW4gaXMgTk9UIGluIHRoZSBzcGVjIGJ1dCBoYXMgc2hvd24gdXAgaW4gCi0gICAgICAvLyBzb21lIGxlZiBmaWxlcy4gIFRoaXMgZXhjZXB0aW9uIGNhbWUgZnJvbSBMRUZPVVQKLSAgICAgIC8vIGluICdmcmFtZXdvcmtzJwotICAgICAgfQotICB8IEtfQ09SRSBjb3JlX3R5cGUKLSAgICAgIHtzcHJpbnRmKGxlZkRhdGEtPnRlbXBfbmFtZSwgIkNPUkUgJXMiLCAkMik7Ci0gICAgICAkJCA9IGxlZkRhdGEtPnRlbXBfbmFtZTt9IAotICB8IEtfRU5EQ0FQIGVuZGNhcF90eXBlCi0gICAgICB7c3ByaW50ZihsZWZEYXRhLT50ZW1wX25hbWUsICJFTkRDQVAgJXMiLCAkMik7Ci0gICAgICAkJCA9IGxlZkRhdGEtPnRlbXBfbmFtZTt9IAotCi1wYWRfdHlwZTogCi0gIEtfSU5QVVQgICAgICAgICB7JCQgPSAoY2hhciopIklOUFVUIjt9Ci0gIHwgS19PVVRQVVQgICAgICAgIHskJCA9IChjaGFyKikiT1VUUFVUIjt9Ci0gIHwgS19JTk9VVCAgICAgICAgIHskJCA9IChjaGFyKikiSU5PVVQiO30KLSAgfCBLX1BPV0VSICAgICAgICAgeyQkID0gKGNoYXIqKSJQT1dFUiI7fQotICB8IEtfU1BBQ0VSICAgICAgICB7JCQgPSAoY2hhciopIlNQQUNFUiI7fQotICB8IEtfQVJFQUlPICAgIHskJCA9IChjaGFyKikiQVJFQUlPIjt9Ci0KLWNvcmVfdHlwZToKLSAgS19GRUVEVEhSVSAgICAgICAgeyQkID0gKGNoYXIqKSJGRUVEVEhSVSI7fQotICB8IEtfVElFSElHSCAgICAgICB7JCQgPSAoY2hhciopIlRJRUhJR0giO30KLSAgfCBLX1RJRUxPVyAgICAgICAgeyQkID0gKGNoYXIqKSJUSUVMT1ciO30KLSAgfCBLX1NQQUNFUgotICAgIHsgCi0gICAgICAkJCA9IChjaGFyKikiU1BBQ0VSIjsKLQotICAgICAgaWYgKCFsZWZEYXRhLT5pZ25vcmVWZXJzaW9uICYmIGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjQpIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TWFjcm9DYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+bWFjcm9XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPk1hY3JvV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgIlNQQUNFUiBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTYzOSwgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB8IEtfQU5URU5OQUNFTEwKLSAgICB7IAotICAgICAgJCQgPSAoY2hhciopIkFOVEVOTkFDRUxMIjsKLQotICAgICAgaWYgKCFsZWZEYXRhLT5pZ25vcmVWZXJzaW9uICYmIGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjQpIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TWFjcm9DYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+bWFjcm9XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPk1hY3JvV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgIkFOVEVOTkFDRUxMIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICBsZWZFcnJvcigxNjQwLCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIHwgS19XRUxMVEFQCi0gICAgeyAKLSAgICAgICQkID0gKGNoYXIqKSJXRUxMVEFQIjsKLQotICAgICAgaWYgKCFsZWZEYXRhLT5pZ25vcmVWZXJzaW9uICYmIGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjYpIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TWFjcm9DYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+bWFjcm9XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPk1hY3JvV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgIldFTExUQVAgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjYgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE2NDEsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotZW5kY2FwX3R5cGU6Ci0gIEtfUFJFICAgICAgICAgeyQkID0gKGNoYXIqKSJQUkUiO30KLSAgfCBLX1BPU1QgICAgICAgICB7JCQgPSAoY2hhciopIlBPU1QiO30KLSAgfCBLX1RPUExFRlQgICAgICAgICB7JCQgPSAoY2hhciopIlRPUExFRlQiO30KLSAgfCBLX1RPUFJJR0hUICAgICAgICAgeyQkID0gKGNoYXIqKSJUT1BSSUdIVCI7fQotICB8IEtfQk9UVE9NTEVGVCAgICAgICAgIHskJCA9IChjaGFyKikiQk9UVE9NTEVGVCI7fQotICB8IEtfQk9UVE9NUklHSFQgICAgICAgIHskJCA9IChjaGFyKikiQk9UVE9NUklHSFQiO30KLQotbWFjcm9fZ2VuZXJhdG9yOiBLX0dFTkVSQVRPUiBUX1NUUklORyAnOycKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPk1hY3JvQ2JrKSBsZWZEYXRhLT5sZWZyTWFjcm8uc2V0R2VuZXJhdG9yKCQyKTsgfQotCi1tYWNyb19nZW5lcmF0ZTogS19HRU5FUkFURSBUX1NUUklORyBUX1NUUklORyAnOycKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPk1hY3JvQ2JrKSBsZWZEYXRhLT5sZWZyTWFjcm8uc2V0R2VuZXJhdGUoJDIsICQzKTsgfQotCi1tYWNyb19zb3VyY2U6Ci0gIEtfU09VUkNFIEtfVVNFUiAnOycKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNikgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5NYWNyb0NiaykgbGVmRGF0YS0+bGVmck1hY3JvLnNldFNvdXJjZSgiVVNFUiIpOwotICAgICAgfSBlbHNlCi0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPk1hY3JvQ2JrKSAvLyB3cml0ZSB3YXJuaW5nIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPm1hY3JvV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5NYWNyb1dhcm5pbmdzKQotICAgICAgICAgICAgIGxlZldhcm5pbmcoMjAzNiwgIlNPVVJDRSBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjYgb3IgbGF0ZXIuIik7Ci0gICAgfQotICB8IEtfU09VUkNFIEtfR0VORVJBVEUgJzsnCi0gICAgewotICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjYpIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TWFjcm9DYmspIGxlZkRhdGEtPmxlZnJNYWNyby5zZXRTb3VyY2UoIkdFTkVSQVRFIik7Ci0gICAgICB9IGVsc2UKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TWFjcm9DYmspIC8vIHdyaXRlIHdhcm5pbmcgb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+bWFjcm9XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPk1hY3JvV2FybmluZ3MpCi0gICAgICAgICAgICAgbGVmV2FybmluZygyMDM3LCAiU09VUkNFIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNiBvciBsYXRlci4iKTsKLSAgICB9Ci0gIHwgS19TT1VSQ0UgS19CTE9DSyAnOycKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNikgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5NYWNyb0NiaykgbGVmRGF0YS0+bGVmck1hY3JvLnNldFNvdXJjZSgiQkxPQ0siKTsKLSAgICAgIH0gZWxzZQotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5NYWNyb0NiaykgLy8gd3JpdGUgd2FybmluZyBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgIGlmIChsZWZEYXRhLT5tYWNyb1dhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TWFjcm9XYXJuaW5ncykKLSAgICAgICAgICAgICBsZWZXYXJuaW5nKDIwMzcsICJTT1VSQ0Ugc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS42IG9yIGxhdGVyLiIpOwotICAgIH0KLQotbWFjcm9fcG93ZXI6IEtfUE9XRVIgaW50X251bWJlciAnOycKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNCkgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5NYWNyb0NiaykgbGVmRGF0YS0+bGVmck1hY3JvLnNldFBvd2VyKCQyKTsKLSAgICAgIH0gZWxzZQotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5NYWNyb0NiaykgLy8gd3JpdGUgd2FybmluZyBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgIGlmIChsZWZEYXRhLT5tYWNyb1dhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TWFjcm9XYXJuaW5ncykKLSAgICAgICAgICAgICBsZWZXYXJuaW5nKDIwMzgsICJNQUNSTyBQT1dFUiBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIik7Ci0gICAgfQotCi1tYWNyb19vcmlnaW46IEtfT1JJR0lOIHB0ICc7JwotICAgIHsgCi0gICAgICAgaWYgKGxlZkRhdGEtPm9yaWdEZWYpIHsgLy8gSGFzIG11bHRpcGxlIE9SSUdJTiBkZWZpbmVkIGluIGEgbWFjcm8sIHN0b3AgcGFyc2luZwotICAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPk1hY3JvQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgICBpZiAobGVmRGF0YS0+bWFjcm9XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPk1hY3JvV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgICBsZWZFcnJvcigxNjQyLCAiT1JJR0lOIHN0YXRlbWVudCBoYXMgZGVmaW5lZCBtb3JlIHRoYW4gb25jZSBpbiBhIE1BQ1JPIHN0YXRlbWVudC5cbk9ubHkgb25lIE9SSUdJTiBzdGF0ZW1lbnQgY2FuIGJlIGRlZmluZWQgaW4gYSBNYWNyby5cblBhcnNlciB3aWxsIHN0b3AgcHJvY2Vzc2luZy4iKTsKLSAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIGxlZkRhdGEtPm9yaWdEZWYgPSAxOwotICAgICAgIGlmIChsZWZEYXRhLT5zaXRlRGVmKSB7IC8vIFNJVEUgaXMgZGVmaW5lZCBiZWZvcmUgT1JJR0lOIAotICAgICAgICAgIC8vIHBjciAyODM4NDYgc3VwcHJlc3Mgd2FybmluZyAKLSAgICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5NYWNyb0NiaykgLy8gd3JpdGUgd2FybmluZyBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICAgaWYgKGxlZkRhdGEtPm1hY3JvV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5NYWNyb1dhcm5pbmdzKQotICAgICAgICAgICAgICAgbGVmV2FybmluZygyMDM5LCAiQSBTSVRFIHN0YXRlbWVudCBpcyBkZWZpbmVkIGJlZm9yZSBPUklHSU4gc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIGRlZmluZSBTSVRFIGFmdGVyIE9SSUdJTiIpOwotICAgICAgIH0KLSAgICAgICBpZiAobGVmRGF0YS0+cGluRGVmKSB7IC8vIFBJTiBpcyBkZWZpbmVkIGJlZm9yZSBPUklHSU4gCi0gICAgICAgICAgLy8gcGNyIDI4Mzg0NiBzdXBwcmVzcyB3YXJuaW5nIAotICAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPk1hY3JvQ2JrKSAvLyB3cml0ZSB3YXJuaW5nIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgICBpZiAobGVmRGF0YS0+bWFjcm9XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPk1hY3JvV2FybmluZ3MpCi0gICAgICAgICAgICAgICBsZWZXYXJuaW5nKDIwNDAsICJBIFBJTiBzdGF0ZW1lbnQgaXMgZGVmaW5lZCBiZWZvcmUgT1JJR0lOIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCBkZWZpbmUgUElOIGFmdGVyIE9SSUdJTiIpOwotICAgICAgIH0KLSAgICAgICBpZiAobGVmRGF0YS0+b2JzRGVmKSB7IC8vIE9CUyBpcyBkZWZpbmVkIGJlZm9yZSBPUklHSU4gCi0gICAgICAgICAgLy8gcGNyIDI4Mzg0NiBzdXBwcmVzcyB3YXJuaW5nIAotICAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPk1hY3JvQ2JrKSAvLyB3cml0ZSB3YXJuaW5nIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgICBpZiAobGVmRGF0YS0+bWFjcm9XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPk1hY3JvV2FybmluZ3MpCi0gICAgICAgICAgICAgICBsZWZXYXJuaW5nKDIwNDEsICJBIE9CUyBzdGF0ZW1lbnQgaXMgZGVmaW5lZCBiZWZvcmUgT1JJR0lOIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCBkZWZpbmUgT0JTIGFmdGVyIE9SSUdJTiIpOwotICAgICAgIH0KLSAgICAgIAotICAgICAgIC8vIFdvcmthcm91bmQgZm9yIHBjciA2NDA5MDIgCi0gICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TWFjcm9DYmspIGxlZkRhdGEtPmxlZnJNYWNyby5zZXRPcmlnaW4oJDIueCwgJDIueSk7Ci0gICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TWFjcm9PcmlnaW5DYmspIHsKLSAgICAgICAgICBsZWZEYXRhLT5tYWNyb051bS54ID0gJDIueDsgCi0gICAgICAgICAgbGVmRGF0YS0+bWFjcm9OdW0ueSA9ICQyLnk7IAotICAgICAgICAgIENBTExCQUNLKGxlZkNhbGxiYWNrcy0+TWFjcm9PcmlnaW5DYmssIGxlZnJNYWNyb09yaWdpbkNia1R5cGUsIGxlZkRhdGEtPm1hY3JvTnVtKTsKLSAgICAgICB9Ci0gICAgfQotCi1tYWNyb19mb3JlaWduOgotICBzdGFydF9mb3JlaWduICc7JwotICAgIHsgCi0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5NYWNyb0NiaykgewotICAgICAgICBsZWZEYXRhLT5sZWZyTWFjcm8uYWRkRm9yZWlnbigkMSwgMCwgMC4wLCAwLjAsIC0xKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TWFjcm9Gb3JlaWduQ2JrKSB7Ci0gICAgICAgIGxlZmlNYWNyb0ZvcmVpZ24gZm9yZWlnbigkMSwgMCwgMC4wLCAwLjAsIDAsIDApOwotICAgICAgICBDQUxMQkFDSyhsZWZDYWxsYmFja3MtPk1hY3JvRm9yZWlnbkNiaywgbGVmck1hY3JvRm9yZWlnbkNia1R5cGUsICZmb3JlaWduKTsKLSAgICAgIH0gIAotICAgIH0KLSAgfCBzdGFydF9mb3JlaWduIHB0ICc7JwotICAgIHsgCi0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5NYWNyb0NiaykgewotICAgICAgICBsZWZEYXRhLT5sZWZyTWFjcm8uYWRkRm9yZWlnbigkMSwgMSwgJDIueCwgJDIueSwgLTEpOwotICAgICAgfQotICAgICAgCi0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5NYWNyb0ZvcmVpZ25DYmspIHsKLSAgICAgICAgbGVmaU1hY3JvRm9yZWlnbiBmb3JlaWduKCQxLCAxLCAkMi54LCAkMi55LCAwLCAwKTsKLSAgICAgICAgQ0FMTEJBQ0sobGVmQ2FsbGJhY2tzLT5NYWNyb0ZvcmVpZ25DYmssIGxlZnJNYWNyb0ZvcmVpZ25DYmtUeXBlLCAmZm9yZWlnbik7Ci0gICAgICB9ICAKLSAgICB9Ci0gIHwgc3RhcnRfZm9yZWlnbiBwdCBvcmllbnRhdGlvbiAnOycKLSAgICB7IAotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TWFjcm9DYmspIHsKLSAgICAgICAgbGVmRGF0YS0+bGVmck1hY3JvLmFkZEZvcmVpZ24oJDEsIDEsICQyLngsICQyLnksICQzKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TWFjcm9Gb3JlaWduQ2JrKSB7Ci0gICAgICAgIGxlZmlNYWNyb0ZvcmVpZ24gZm9yZWlnbigkMSwgMSwgJDIueCwgJDIueSwgMSwgJDMpOwotICAgICAgICBDQUxMQkFDSyhsZWZDYWxsYmFja3MtPk1hY3JvRm9yZWlnbkNiaywgbGVmck1hY3JvRm9yZWlnbkNia1R5cGUsICZmb3JlaWduKTsKLSAgICAgIH0gCi0gICAgfQotICB8IHN0YXJ0X2ZvcmVpZ24gb3JpZW50YXRpb24gJzsnCi0gICAgeyAKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPk1hY3JvQ2JrKSB7Ci0gICAgICAgIGxlZkRhdGEtPmxlZnJNYWNyby5hZGRGb3JlaWduKCQxLCAwLCAwLjAsIDAuMCwgJDIpOwotICAgICAgfQotCi0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5NYWNyb0ZvcmVpZ25DYmspIHsKLSAgICAgICAgbGVmaU1hY3JvRm9yZWlnbiBmb3JlaWduKCQxLCAwLCAwLjAsIDAuMCwgMSwgJDIpOwotICAgICAgICBDQUxMQkFDSyhsZWZDYWxsYmFja3MtPk1hY3JvRm9yZWlnbkNiaywgbGVmck1hY3JvRm9yZWlnbkNia1R5cGUsICZmb3JlaWduKTsKLSAgICAgIH0gCi0gICAgfQotCi1tYWNyb19maXhlZE1hc2s6Ci0gICBLX0ZJWEVETUFTSyAnOycgCi0gICB7ICAgCi0gICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TWFjcm9DYmsgJiYgbGVmRGF0YS0+dmVyc2lvbk51bSA+PSA1LjgpIHsKLSAgICAgICAgICBsZWZEYXRhLT5sZWZyTWFjcm8uc2V0Rml4ZWRNYXNrKDEpOwotICAgICAgIH0KLSAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5NYWNyb0ZpeGVkTWFza0NiaykgewotICAgICAgICAgIENBTExCQUNLKGxlZkNhbGxiYWNrcy0+TWFjcm9GaXhlZE1hc2tDYmssIGxlZnJNYWNyb0ZpeGVkTWFza0Nia1R5cGUsIDEpOwotICAgICAgIH0gICAgICAgIAotICAgIH0KLSAgICAKLW1hY3JvX2VlcTogS19FRVEgeyBsZWZEYXRhLT5sZWZEdW1iTW9kZSA9IDE7IGxlZkRhdGEtPmxlZk5vTnVtID0gMTsgfSBUX1NUUklORyAnOycKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPk1hY3JvQ2JrKSBsZWZEYXRhLT5sZWZyTWFjcm8uc2V0RUVRKCQzKTsgfQotCi1tYWNyb19sZXE6IEtfTEVRIHsgbGVmRGF0YS0+bGVmRHVtYk1vZGUgPSAxOyBsZWZEYXRhLT5sZWZOb051bSA9IDE7IH0gVF9TVFJJTkcgJzsnCi0gICAgewotICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjYpIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TWFjcm9DYmspIGxlZkRhdGEtPmxlZnJNYWNyby5zZXRMRVEoJDMpOwotICAgICAgfSBlbHNlCi0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPk1hY3JvQ2JrKSAvLyB3cml0ZSB3YXJuaW5nIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPm1hY3JvV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5NYWNyb1dhcm5pbmdzKQotICAgICAgICAgICAgIGxlZldhcm5pbmcoMjA0MiwgIkxFUSBzdGF0ZW1lbnQgaW4gTUFDUk8gaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjYgb3IgbGF0ZXIuIik7Ci0gICAgfQotCi1tYWNyb19zaXRlOgotICBtYWNyb19zaXRlX3dvcmQgIFRfU1RSSU5HICc7JwotICAgIHsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPk1hY3JvQ2JrKSB7Ci0gICAgICAgIGxlZkRhdGEtPmxlZnJNYWNyby5zZXRTaXRlTmFtZSgkMik7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPk1hY3JvU2l0ZUNiaykgewotICAgICAgICBsZWZpTWFjcm9TaXRlIHNpdGUoJDIsIDApOwotICAgICAgICBDQUxMQkFDSyhsZWZDYWxsYmFja3MtPk1hY3JvU2l0ZUNiaywgbGVmck1hY3JvU2l0ZUNia1R5cGUsICZzaXRlKTsKLSAgICAgIH0KLSAgICB9Ci0gIHwgbWFjcm9fc2l0ZV93b3JkIHNpdGVQYXR0ZXJuICc7JwotICAgIHsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPk1hY3JvQ2JrKSB7Ci0gICAgICAgIC8vIGFsc28gc2V0IHNpdGUgbmFtZSBpbiB0aGUgdmFyaWFibGUgc2l0ZU5hbWVfIGluIGxlZmlNYWNybyAKLSAgICAgICAgLy8gdGhpcywgaWYgdXNlciB3YW50cyB0byB1c2UgbWV0aG9kIGxlZkRhdGEtPnNpdGVOYW1lIHdpbGwgZ2V0IHRoZSBuYW1lIGFsc28gCi0gICAgICAgIGxlZkRhdGEtPmxlZnJNYWNyby5zZXRTaXRlUGF0dGVybihsZWZEYXRhLT5sZWZyU2l0ZVBhdHRlcm5QdHIpOwotICAgICAgfQotCi0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5NYWNyb1NpdGVDYmspIHsKLSAgICAgICAgbGVmaU1hY3JvU2l0ZSBzaXRlKDAsIGxlZkRhdGEtPmxlZnJTaXRlUGF0dGVyblB0cik7Ci0gICAgICAgIENBTExCQUNLKGxlZkNhbGxiYWNrcy0+TWFjcm9TaXRlQ2JrLCBsZWZyTWFjcm9TaXRlQ2JrVHlwZSwgJnNpdGUpOwotICAgICAgfQotICAgICAgICAKLSAgICAgIGxlZkRhdGEtPmxlZnJTaXRlUGF0dGVyblB0ciA9IDA7Ci0gICAgfQotCi1tYWNyb19zaXRlX3dvcmQ6IEtfU0lURQotICAgIHsgbGVmRGF0YS0+bGVmRHVtYk1vZGUgPSAxOyBsZWZEYXRhLT5sZWZOb051bSA9IDE7IGxlZkRhdGEtPnNpdGVEZWYgPSAxOwotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5NYWNyb0NiaykgbGVmRGF0YS0+bGVmckRvU2l0ZSA9IDE7IH0KLQotc2l0ZV93b3JkOiBLX1NJVEUKLSAgICB7IGxlZkRhdGEtPmxlZkR1bWJNb2RlID0gMTsgbGVmRGF0YS0+bGVmTm9OdW0gPSAxOyB9Ci0KLW1hY3JvX3NpemU6IEtfU0laRSBpbnRfbnVtYmVyIEtfQlkgaW50X251bWJlciAnOycKLSAgICB7IAotICAgICAgaWYgKGxlZkRhdGEtPnNpdGVEZWYpIHsgLy8gU0lURSBpcyBkZWZpbmVkIGJlZm9yZSBTSVpFIAotICAgICAgfQotICAgICAgbGVmRGF0YS0+c2l6ZURlZiA9IDE7Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5NYWNyb0NiaykgbGVmRGF0YS0+bGVmck1hY3JvLnNldFNpemUoJDIsICQ0KTsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPk1hY3JvU2l6ZUNiaykgewotICAgICAgICAgbGVmRGF0YS0+bWFjcm9OdW0ueCA9ICQyOyAKLSAgICAgICAgIGxlZkRhdGEtPm1hY3JvTnVtLnkgPSAkNDsgCi0gICAgICAgICBDQUxMQkFDSyhsZWZDYWxsYmFja3MtPk1hY3JvU2l6ZUNiaywgbGVmck1hY3JvU2l6ZUNia1R5cGUsIGxlZkRhdGEtPm1hY3JvTnVtKTsKLSAgICAgIH0KLSAgICB9Ci0KLS8vIFRoaXMgaXMgY29uZnVzaW5nLCBzaW5jZSBGRUYgYW5kIExFRiBoYXZlIG9wcG9zaXRlIGRlZmluaXRpb25zIG9mCi0vLyBwb3J0cyBhbmQgcGlucyAKLQotbWFjcm9fcGluOiBzdGFydF9tYWNyb19waW4gbWFjcm9fcGluX29wdGlvbnMgZW5kX21hY3JvX3BpbgotICAgIHsgCi0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspCi0gICAgICAgIENBTExCQUNLKGxlZkNhbGxiYWNrcy0+UGluQ2JrLCBsZWZyUGluQ2JrVHlwZSwgJmxlZkRhdGEtPmxlZnJQaW4pOwotICAgICAgbGVmRGF0YS0+bGVmclBpbi5jbGVhcigpOwotICAgIH0KLQotc3RhcnRfbWFjcm9fcGluOiBLX1BJTiB7bGVmRGF0YS0+bGVmRHVtYk1vZGUgPSAxOyBsZWZEYXRhLT5sZWZOb051bSA9IDE7IGxlZkRhdGEtPnBpbkRlZiA9IDE7fSBUX1NUUklORyAKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgbGVmRGF0YS0+bGVmclBpbi5zZXROYW1lKCQzKTsKLSAgICAgIC8vc3RyY3B5KGxlZkRhdGEtPnBpbk5hbWUsICQzKTsKLSAgICAgIGxlZkRhdGEtPnBpbk5hbWUgPSBzdHJkdXAoJDMpOwotICAgIH0KLQotZW5kX21hY3JvX3BpbjogS19FTkQge2xlZkRhdGEtPmxlZkR1bWJNb2RlID0gMTsgbGVmRGF0YS0+bGVmTm9OdW0gPSAxO30gVF9TVFJJTkcKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wKGxlZkRhdGEtPnBpbk5hbWUsICQzKSAhPSAwKSB7Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPk1hY3JvQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPm1hY3JvV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5NYWNyb1dhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAgICJFTkQgUElOIG5hbWUgJXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIFBJTiBuYW1lICVzLlxuQ29ycmVjdCB0aGUgTEVGIGZpbGUgYmVmb3JlIHJlcnVubmluZyBpdCB0aHJvdWdoIHRoZSBMRUYgcGFyc2VyLiIsICQzLCBsZWZEYXRhLT5waW5OYW1lKTsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTY0MywgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPnBpbk5hbWUpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+cGluTmFtZSk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPnBpbk5hbWUpOwotICAgICAgfSBlbHNlCi0gICAgICAgIGxlZkZyZWUobGVmRGF0YS0+cGluTmFtZSk7Ci0gICAgfQotCi1tYWNyb19waW5fb3B0aW9uczoKLSAgLy8gZW1wdHkgCi0gICAgeyB9Ci0gIHwgbWFjcm9fcGluX29wdGlvbnMgbWFjcm9fcGluX29wdGlvbiAKLSAgICB7IH0KLQotbWFjcm9fcGluX29wdGlvbjoKLSAgc3RhcnRfZm9yZWlnbiAnOycKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNikgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIGxlZkRhdGEtPmxlZnJQaW4uYWRkRm9yZWlnbigkMSwgMCwgMC4wLCAwLjAsIC0xKTsKLSAgICAgIH0gZWxzZQotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIC8vIHdyaXRlIHdhcm5pbmcgb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5QaW5XYXJuaW5ncykKLSAgICAgICAgICAgICBsZWZXYXJuaW5nKDIwNDMsICJGT1JFSUdOIHN0YXRlbWVudCBpbiBNQUNSTyBQSU4gaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjYgb3IgbGF0ZXIuIik7Ci0gICAgfQotICB8IHN0YXJ0X2ZvcmVpZ24gcHQgJzsnCi0gICAgewotICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjYpIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSBsZWZEYXRhLT5sZWZyUGluLmFkZEZvcmVpZ24oJDEsIDEsICQyLngsICQyLnksIC0xKTsKLSAgICAgIH0gZWxzZQotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIC8vIHdyaXRlIHdhcm5pbmcgb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5QaW5XYXJuaW5ncykKLSAgICAgICAgICAgICBsZWZXYXJuaW5nKDIwNDMsICJGT1JFSUdOIHN0YXRlbWVudCBpbiBNQUNSTyBQSU4gaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjYgb3IgbGF0ZXIuIik7Ci0gICAgfQotICB8IHN0YXJ0X2ZvcmVpZ24gcHQgb3JpZW50YXRpb24gJzsnCi0gICAgewotICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjYpIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSBsZWZEYXRhLT5sZWZyUGluLmFkZEZvcmVpZ24oJDEsIDEsICQyLngsICQyLnksICQzKTsKLSAgICAgIH0gZWxzZQotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIC8vIHdyaXRlIHdhcm5pbmcgb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5QaW5XYXJuaW5ncykKLSAgICAgICAgICAgICBsZWZXYXJuaW5nKDIwNDMsICJGT1JFSUdOIHN0YXRlbWVudCBpbiBNQUNSTyBQSU4gaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjYgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjYgb3IgbGF0ZXIuIik7Ci0gICAgfQotICB8IHN0YXJ0X2ZvcmVpZ24gS19TVFJVQ1RVUkUgJzsnCi0gICAgewotICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjYpIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSBsZWZEYXRhLT5sZWZyUGluLmFkZEZvcmVpZ24oJDEsIDAsIDAuMCwgMC4wLCAtMSk7Ci0gICAgICB9IGVsc2UKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSAvLyB3cml0ZSB3YXJuaW5nIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPnBpbldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+UGluV2FybmluZ3MpCi0gICAgICAgICAgICAgbGVmV2FybmluZygyMDQzLCAiRk9SRUlHTiBzdGF0ZW1lbnQgaW4gTUFDUk8gUElOIGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS42IG9yIGxhdGVyLiIpOwotICAgIH0KLSAgfCBzdGFydF9mb3JlaWduIEtfU1RSVUNUVVJFIHB0ICc7JwotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS42KSB7Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgbGVmRGF0YS0+bGVmclBpbi5hZGRGb3JlaWduKCQxLCAxLCAkMy54LCAkMy55LCAtMSk7Ci0gICAgICB9IGVsc2UKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSAvLyB3cml0ZSB3YXJuaW5nIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPnBpbldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+UGluV2FybmluZ3MpCi0gICAgICAgICAgICAgbGVmV2FybmluZygyMDQzLCAiRk9SRUlHTiBzdGF0ZW1lbnQgaW4gTUFDUk8gUElOIGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS42IG9yIGxhdGVyLiIpOwotICAgIH0KLSAgfCBzdGFydF9mb3JlaWduIEtfU1RSVUNUVVJFIHB0IG9yaWVudGF0aW9uICc7JwotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS42KSB7Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgbGVmRGF0YS0+bGVmclBpbi5hZGRGb3JlaWduKCQxLCAxLCAkMy54LCAkMy55LCAkNCk7Ci0gICAgICB9IGVsc2UKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSAvLyB3cml0ZSB3YXJuaW5nIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPnBpbldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+UGluV2FybmluZ3MpCi0gICAgICAgICAgICAgbGVmV2FybmluZygyMDQzLCAiRk9SRUlHTiBzdGF0ZW1lbnQgaW4gTUFDUk8gUElOIGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS42IG9yIGxhdGVyLiIpOwotICAgIH0KLSAgfCBLX0xFUSB7IGxlZkRhdGEtPmxlZkR1bWJNb2RlID0gMTsgbGVmRGF0YS0+bGVmTm9OdW0gPSAxOyB9IFRfU1RSSU5HICc7JwotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS42KSB7Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgbGVmRGF0YS0+bGVmclBpbi5zZXRMRVEoJDMpOwotICAgICAgfSBlbHNlCi0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgLy8gd3JpdGUgd2FybmluZyBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgIGlmIChsZWZEYXRhLT5waW5XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPlBpbldhcm5pbmdzKQotICAgICAgICAgICAgIGxlZldhcm5pbmcoMjA0NCwgIkxFUSBzdGF0ZW1lbnQgaW4gTUFDUk8gUElOIGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS42IG9yIGxhdGVyLiIpOwotICAgfQotICB8IEtfUE9XRVIgaW50X251bWJlciAnOycKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNCkgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIGxlZkRhdGEtPmxlZnJQaW4uc2V0UG93ZXIoJDIpOwotICAgICAgfSBlbHNlCi0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgLy8gd3JpdGUgd2FybmluZyBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgIGlmIChsZWZEYXRhLT5waW5XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPlBpbldhcm5pbmdzKQotICAgICAgICAgICAgIGxlZldhcm5pbmcoMjA0NSwgIk1BQ1JPIFBPV0VSIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iKTsKLSAgICB9Ci0gIHwgZWxlY3RyaWNhbF9kaXJlY3Rpb24KLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgbGVmRGF0YS0+bGVmclBpbi5zZXREaXJlY3Rpb24oJDEpOyB9Ci0gIHwgS19VU0UgbWFjcm9fcGluX3VzZSAnOycKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgbGVmRGF0YS0+bGVmclBpbi5zZXRVc2UoJDIpOyB9Ci0gIHwgS19TQ0FOVVNFIG1hY3JvX3NjYW5fdXNlICc7JwotICAgIHsgfQotICB8IEtfTEVBS0FHRSBpbnRfbnVtYmVyICc7JwotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS40KSB7Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgbGVmRGF0YS0+bGVmclBpbi5zZXRMZWFrYWdlKCQyKTsKLSAgICAgIH0gZWxzZQotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIC8vIHdyaXRlIHdhcm5pbmcgb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5QaW5XYXJuaW5ncykKLSAgICAgICAgICAgICBsZWZXYXJuaW5nKDIwNDYsICJNQUNSTyBMRUFLQUdFIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByIGVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIik7Ci0gICAgfQotICB8IEtfUklTRVRIUkVTSCBpbnRfbnVtYmVyICc7JwotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS40KSB7Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgbGVmRGF0YS0+bGVmclBpbi5zZXRSaXNlVGhyZXNoKCQyKTsKLSAgICAgIH0gZWxzZQotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIC8vIHdyaXRlIHdhcm5pbmcgb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5QaW5XYXJuaW5ncykKLSAgICAgICAgICAgICBsZWZXYXJuaW5nKDIwNDcsICJNQUNSTyBSSVNFVEhSRVNIIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iKTsKLSAgICB9Ci0gIHwgS19GQUxMVEhSRVNIIGludF9udW1iZXIgJzsnCi0gICAgewotICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjQpIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSBsZWZEYXRhLT5sZWZyUGluLnNldEZhbGxUaHJlc2goJDIpOwotICAgICAgfSBlbHNlCi0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgLy8gd3JpdGUgd2FybmluZyBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgIGlmIChsZWZEYXRhLT5waW5XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPlBpbldhcm5pbmdzKQotICAgICAgICAgICAgIGxlZldhcm5pbmcoMjA0OCwgIk1BQ1JPIEZBTExUSFJFU0ggc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS40IG9yIGxhdGVyLiIpOwotICAgIH0KLSAgfCBLX1JJU0VTQVRDVVIgaW50X251bWJlciAnOycKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNCkgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIGxlZkRhdGEtPmxlZnJQaW4uc2V0UmlzZVNhdGN1cigkMik7Ci0gICAgICB9IGVsc2UKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSAvLyB3cml0ZSB3YXJuaW5nIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPnBpbldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+UGluV2FybmluZ3MpCi0gICAgICAgICAgICAgbGVmV2FybmluZygyMDQ5LCAiTUFDUk8gUklTRVNBVENVUiBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIik7Ci0gICAgfQotICB8IEtfRkFMTFNBVENVUiBpbnRfbnVtYmVyICc7JwotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS40KSB7Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgbGVmRGF0YS0+bGVmclBpbi5zZXRGYWxsU2F0Y3VyKCQyKTsKLSAgICAgIH0gZWxzZQotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIC8vIHdyaXRlIHdhcm5pbmcgb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5QaW5XYXJuaW5ncykKLSAgICAgICAgICAgICBsZWZXYXJuaW5nKDIwNTAsICJNQUNSTyBGQUxMU0FUQ1VSIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iKTsKLSAgICB9Ci0gIHwgS19WTE8gaW50X251bWJlciAnOycKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNCkgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIGxlZkRhdGEtPmxlZnJQaW4uc2V0VkxPKCQyKTsKLSAgICAgIH0gZWxzZQotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIC8vIHdyaXRlIHdhcm5pbmcgb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5QaW5XYXJuaW5ncykKLSAgICAgICAgICAgICBsZWZXYXJuaW5nKDIwNTEsICJNQUNSTyBWTE8gc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS40IG9yIGxhdGVyLiIpOwotICAgIH0KLSAgfCBLX1ZISSBpbnRfbnVtYmVyICc7JwotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS40KSB7Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgbGVmRGF0YS0+bGVmclBpbi5zZXRWSEkoJDIpOwotICAgICAgfSBlbHNlCi0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgLy8gd3JpdGUgd2FybmluZyBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgIGlmIChsZWZEYXRhLT5waW5XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPlBpbldhcm5pbmdzKQotICAgICAgICAgICAgIGxlZldhcm5pbmcoMjA1MiwgIk1BQ1JPIFZISSBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIik7Ci0gICAgfQotICB8IEtfVElFT0ZGUiBpbnRfbnVtYmVyICc7JwotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS40KSB7Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgbGVmRGF0YS0+bGVmclBpbi5zZXRUaWVvZmZyKCQyKTsKLSAgICAgIH0gZWxzZQotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIC8vIHdyaXRlIHdhcm5pbmcgb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5QaW5XYXJuaW5ncykKLSAgICAgICAgICAgICBsZWZXYXJuaW5nKDIwNTMsICJNQUNSTyBUSUVPRkZSIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iKTsKLSAgICB9Ci0gIHwgS19TSEFQRSBwaW5fc2hhcGUgJzsnCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIGxlZkRhdGEtPmxlZnJQaW4uc2V0U2hhcGUoJDIpOyB9Ci0gIHwgS19NVVNUSk9JTiB7bGVmRGF0YS0+bGVmRHVtYk1vZGUgPSAxOyBsZWZEYXRhLT5sZWZOb051bSA9IDE7fSBUX1NUUklORyAnOycKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgbGVmRGF0YS0+bGVmclBpbi5zZXRNdXN0am9pbigkMyk7IH0KLSAgfCBLX09VVFBVVE5PSVNFTUFSR0lOIHtsZWZEYXRhLT5sZWZEdW1iTW9kZSA9IDE7fSBpbnRfbnVtYmVyIGludF9udW1iZXIgJzsnCi0gICAgewotICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjQpIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSBsZWZEYXRhLT5sZWZyUGluLnNldE91dE1hcmdpbigkMywgJDQpOwotICAgICAgfSBlbHNlCi0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgLy8gd3JpdGUgd2FybmluZyBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgIGlmIChsZWZEYXRhLT5waW5XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPlBpbldhcm5pbmdzKQotICAgICAgICAgICAgIGxlZldhcm5pbmcoMjA1NCwgIk1BQ1JPIE9VVFBVVE5PSVNFTUFSR0lOIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iKTsKLSAgICB9Ci0gIHwgS19PVVRQVVRSRVNJU1RBTkNFIHtsZWZEYXRhLT5sZWZEdW1iTW9kZSA9IDE7fSBpbnRfbnVtYmVyIGludF9udW1iZXIgJzsnCi0gICAgewotICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjQpIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSBsZWZEYXRhLT5sZWZyUGluLnNldE91dFJlc2lzdGFuY2UoJDMsICQ0KTsKLSAgICAgIH0gZWxzZQotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIC8vIHdyaXRlIHdhcm5pbmcgb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5QaW5XYXJuaW5ncykKLSAgICAgICAgICAgICBsZWZXYXJuaW5nKDIwNTUsICJNQUNSTyBPVVRQVVRSRVNJU1RBTkNFIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iKTsKLSAgICB9Ci0gIHwgS19JTlBVVE5PSVNFTUFSR0lOIHtsZWZEYXRhLT5sZWZEdW1iTW9kZSA9IDE7fSBpbnRfbnVtYmVyIGludF9udW1iZXIgJzsnCi0gICAgewotICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjQpIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSBsZWZEYXRhLT5sZWZyUGluLnNldEluTWFyZ2luKCQzLCAkNCk7Ci0gICAgICB9IGVsc2UKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSAvLyB3cml0ZSB3YXJuaW5nIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPnBpbldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+UGluV2FybmluZ3MpCi0gICAgICAgICAgICAgbGVmV2FybmluZygyMDU2LCAiTUFDUk8gSU5QVVROT0lTRU1BUkdJTiBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIik7Ci0gICAgfQotICB8IEtfQ0FQQUNJVEFOQ0UgaW50X251bWJlciAnOycgCi0gICAgewotICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjQpIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSBsZWZEYXRhLT5sZWZyUGluLnNldENhcGFjaXRhbmNlKCQyKTsKLSAgICAgIH0gZWxzZQotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIC8vIHdyaXRlIHdhcm5pbmcgb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5QaW5XYXJuaW5ncykKLSAgICAgICAgICAgICBsZWZXYXJuaW5nKDIwNTcsICJNQUNSTyBDQVBBQ0lUQU5DRSBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIik7Ci0gICAgfQotICB8IEtfTUFYREVMQVkgaW50X251bWJlciAnOycgCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIGxlZkRhdGEtPmxlZnJQaW4uc2V0TWF4ZGVsYXkoJDIpOyB9Ci0gIHwgS19NQVhMT0FEIGludF9udW1iZXIgJzsnIAotICAgIHsgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSBsZWZEYXRhLT5sZWZyUGluLnNldE1heGxvYWQoJDIpOyB9Ci0gIHwgS19SRVNJU1RBTkNFIGludF9udW1iZXIgJzsnIAotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS40KSB7Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgbGVmRGF0YS0+bGVmclBpbi5zZXRSZXNpc3RhbmNlKCQyKTsKLSAgICAgIH0gZWxzZQotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIC8vIHdyaXRlIHdhcm5pbmcgb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5QaW5XYXJuaW5ncykKLSAgICAgICAgICAgICBsZWZXYXJuaW5nKDIwNTgsICJNQUNSTyBSRVNJU1RBTkNFIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iKTsKLSAgICB9Ci0gIHwgS19QVUxMRE9XTlJFUyBpbnRfbnVtYmVyICc7JyAKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNCkgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIGxlZkRhdGEtPmxlZnJQaW4uc2V0UHVsbGRvd25yZXMoJDIpOwotICAgICAgfSBlbHNlCi0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgLy8gd3JpdGUgd2FybmluZyBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgIGlmIChsZWZEYXRhLT5waW5XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPlBpbldhcm5pbmdzKQotICAgICAgICAgICAgIGxlZldhcm5pbmcoMjA1OSwgIk1BQ1JPIFBVTExET1dOUkVTIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iKTsKLSAgICB9Ci0gIHwgS19DVVJSRU5UU09VUkNFIEtfQUNUSVZFICc7JyAKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNCkgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIGxlZkRhdGEtPmxlZnJQaW4uc2V0Q3VycmVudFNvdXJjZSgiQUNUSVZFIik7Ci0gICAgICB9IGVsc2UKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSAvLyB3cml0ZSB3YXJuaW5nIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPnBpbldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+UGluV2FybmluZ3MpCi0gICAgICAgICAgICAgbGVmV2FybmluZygyMDYwLCAiTUFDUk8gQ1VSUkVOVFNPVVJDRSBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIik7Ci0gICAgfQotICB8IEtfQ1VSUkVOVFNPVVJDRSBLX1JFU0lTVElWRSAnOycgCi0gICAgewotICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjQpIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSBsZWZEYXRhLT5sZWZyUGluLnNldEN1cnJlbnRTb3VyY2UoIlJFU0lTVElWRSIpOwotICAgICAgfSBlbHNlCi0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgLy8gd3JpdGUgd2FybmluZyBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgIGlmIChsZWZEYXRhLT5waW5XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPlBpbldhcm5pbmdzKQotICAgICAgICAgICAgIGxlZldhcm5pbmcoMjA2MSwgIk1BQ1JPIENVUlJFTlRTT1VSQ0Ugc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS40IG9yIGxhdGVyLiIpOwotICAgIH0KLSAgfCBLX1JJU0VWT0xUQUdFVEhSRVNIT0xEIGludF9udW1iZXIgJzsnIAotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS40KSB7Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgbGVmRGF0YS0+bGVmclBpbi5zZXRSaXNlVm9sdGFnZSgkMik7Ci0gICAgICB9IGVsc2UKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSAvLyB3cml0ZSB3YXJuaW5nIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPnBpbldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+UGluV2FybmluZ3MpCi0gICAgICAgICAgICAgbGVmV2FybmluZygyMDYyLCAiTUFDUk8gUklTRVZPTFRBR0VUSFJFU0hPTEQgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS40IG9yIGxhdGVyLiIpOwotICAgIH0KLSAgfCBLX0ZBTExWT0xUQUdFVEhSRVNIT0xEIGludF9udW1iZXIgJzsnIAotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS40KSB7Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgbGVmRGF0YS0+bGVmclBpbi5zZXRGYWxsVm9sdGFnZSgkMik7Ci0gICAgICB9IGVsc2UKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSAvLyB3cml0ZSB3YXJuaW5nIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPnBpbldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+UGluV2FybmluZ3MpCi0gICAgICAgICAgICAgbGVmV2FybmluZygyMDYzLCAiTUFDUk8gRkFMTFZPTFRBR0VUSFJFU0hPTEQgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS40IG9yIGxhdGVyLiIpOwotICAgIH0KLSAgfCBLX0lWX1RBQkxFUyBUX1NUUklORyBUX1NUUklORyAnOycKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNCkgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIGxlZkRhdGEtPmxlZnJQaW4uc2V0VGFibGVzKCQyLCAkMyk7Ci0gICAgICB9IGVsc2UKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSAvLyB3cml0ZSB3YXJuaW5nIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPnBpbldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+UGluV2FybmluZ3MpCi0gICAgICAgICAgICAgbGVmV2FybmluZygyMDY0LCAiTUFDUk8gSVZfVEFCTEVTIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iKTsKLSAgICB9Ci0gIHwgS19UQVBFUlJVTEUgVF9TVFJJTkcgJzsnCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIGxlZkRhdGEtPmxlZnJQaW4uc2V0VGFwZXJSdWxlKCQyKTsgfQotICB8IEtfUFJPUEVSVFkge2xlZkRhdGEtPmxlZkR1bWJNb2RlID0gMTAwMDAwMDsgfSBwaW5fcHJvcF9saXN0ICc7JwotICAgIHsgbGVmRGF0YS0+bGVmRHVtYk1vZGUgPSAwOwotICAgIH0KLSAgfCBzdGFydF9tYWNyb19wb3J0IG1hY3JvX3BvcnRfY2xhc3Nfb3B0aW9uIGdlb21ldHJpZXMgS19FTkQKLSAgICB7Ci0gICAgICBsZWZEYXRhLT5sZWZEdW1iTW9kZSA9IDA7Ci0gICAgICBsZWZEYXRhLT5oYXNHZW9MYXllciA9IDA7Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIHsKLSAgICAgICAgbGVmRGF0YS0+bGVmclBpbi5hZGRQb3J0KGxlZkRhdGEtPmxlZnJHZW9tZXRyaWVzUHRyKTsKLSAgICAgICAgbGVmRGF0YS0+bGVmckdlb21ldHJpZXNQdHIgPSAwOwotICAgICAgICBsZWZEYXRhLT5sZWZyRG9HZW9tZXRyaWVzID0gMDsKLSAgICAgIH0KLSAgICAgIGlmICgobGVmRGF0YS0+bmVlZEdlb21ldHJ5KSAmJiAobGVmRGF0YS0+bmVlZEdlb21ldHJ5ICE9IDIpKSAgLy8gaWYgdGhlIGxlZkRhdGEtPmxhc3QgTEFZRVIgaW4gUE9SVAotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIC8vIHdyaXRlIHdhcm5pbmcgb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5QaW5XYXJuaW5ncykKLSAgICAgICAgICAgICBsZWZXYXJuaW5nKDIwNjUsICJFaXRoZXIgUEFUSCwgUkVDVCBvciBQT0xZR09OIHN0YXRlbWVudCBpcyBhIHJlcXVpcmVkIGluIE1BQ1JPL1BJTi9QT1JULiIpOwotICAgIH0KLSAgfCBzdGFydF9tYWNyb19wb3J0IEtfRU5ECi0gICAgewotICAgICAgLy8gU2luY2UgaW4gc3RhcnRfbWFjcm9fcG9ydCBpdCBoYXMgY2FsbCB0aGUgSW5pdCBtZXRob2QsIGhlcmUKLSAgICAgIC8vIHdlIG5lZWQgdG8gY2FsbCB0aGUgRGVzdHJveSBtZXRob2QuCi0gICAgICAvLyBTdGlsbCBhZGQgYSBudWxsIHBvaW50ZXIgdG8gc2V0IHRoZSBudW1iZXIgb2YgcG9ydAotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSB7Ci0gICAgICAgIGxlZkRhdGEtPmxlZnJQaW4uYWRkUG9ydChsZWZEYXRhLT5sZWZyR2VvbWV0cmllc1B0cik7Ci0gICAgICAgIGxlZkRhdGEtPmxlZnJHZW9tZXRyaWVzUHRyID0gMDsKLSAgICAgICAgbGVmRGF0YS0+bGVmckRvR2VvbWV0cmllcyA9IDA7Ci0gICAgICB9Ci0gICAgICBsZWZEYXRhLT5oYXNHZW9MYXllciA9IDA7Ci0gICAgfQotICB8IEtfQU5URU5OQVNJWkUgaW50X251bWJlciBvcHRfbGF5ZXJfbmFtZSAnOycKLSAgICB7ICAvLyBhIHByZSA1LjQgc3ludGF4IAotICAgICAgbGVmRGF0YS0+dXNlNV8zID0gMTsKLSAgICAgIGlmIChsZWZEYXRhLT5pZ25vcmVWZXJzaW9uKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcgCi0gICAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPj0gNS40KSB7Ci0gICAgICAgIGlmIChsZWZEYXRhLT51c2U1XzQpIHsKLSAgICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgICBpZiAobGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5QaW5XYXJuaW5ncykgewotICAgICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgICAiQU5URU5OQVNJWkUgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjMgYW5kIGVhcmxpZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgICBsZWZFcnJvcigxNjQ0LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSBsZWZEYXRhLT5sZWZyUGluLmFkZEFudGVubmFTaXplKCQyLCAkMyk7Ci0gICAgfQotICB8IEtfQU5URU5OQU1FVEFMQVJFQSBOVU1CRVIgb3B0X2xheWVyX25hbWUgJzsnCi0gICAgeyAgLy8gYSBwcmUgNS40IHN5bnRheCAKLSAgICAgIGxlZkRhdGEtPnVzZTVfMyA9IDE7Ci0gICAgICBpZiAobGVmRGF0YS0+aWdub3JlVmVyc2lvbikgewotICAgICAgICAvLyBkbyBub3RoaW5nIAotICAgICAgfSBlbHNlIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtID49IDUuNCkgewotICAgICAgICBpZiAobGVmRGF0YS0+dXNlNV80KSB7Ci0gICAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICAgIGlmIChsZWZEYXRhLT5waW5XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPlBpbldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAgICAgICJBTlRFTk5BTUVUQUxBUkVBIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS4zIGFuZCBlYXJsaWVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICAgIGxlZkVycm9yKDE2NDUsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIGxlZkRhdGEtPmxlZnJQaW4uYWRkQW50ZW5uYU1ldGFsQXJlYSgkMiwgJDMpOwotICAgIH0KLSAgfCBLX0FOVEVOTkFNRVRBTExFTkdUSCBpbnRfbnVtYmVyIG9wdF9sYXllcl9uYW1lICc7JwotICAgIHsgLy8gYSBwcmUgNS40IHN5bnRheCAgCi0gICAgICBsZWZEYXRhLT51c2U1XzMgPSAxOwotICAgICAgaWYgKGxlZkRhdGEtPmlnbm9yZVZlcnNpb24pIHsKLSAgICAgICAgLy8gZG8gbm90aGluZyAKLSAgICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA+PSA1LjQpIHsKLSAgICAgICAgaWYgKGxlZkRhdGEtPnVzZTVfNCkgewotICAgICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgICBpZiAobGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5QaW5XYXJuaW5ncykgewotICAgICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAgICAiQU5URU5OQU1FVEFMTEVOR1RIIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS4zIGFuZCBlYXJsaWVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICAgIGxlZkVycm9yKDE2NDYsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIGxlZkRhdGEtPmxlZnJQaW4uYWRkQW50ZW5uYU1ldGFsTGVuZ3RoKCQyLCAkMyk7Ci0gICAgfQotICB8IEtfUklTRVNMRVdMSU1JVCBpbnRfbnVtYmVyICc7JwotICAgIHsgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSBsZWZEYXRhLT5sZWZyUGluLnNldFJpc2VTbGV3TGltaXQoJDIpOyB9Ci0gIHwgS19GQUxMU0xFV0xJTUlUIGludF9udW1iZXIgJzsnCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIGxlZkRhdGEtPmxlZnJQaW4uc2V0RmFsbFNsZXdMaW1pdCgkMik7IH0KLSAgfCBLX0FOVEVOTkFQQVJUSUFMTUVUQUxBUkVBIE5VTUJFUiBvcHRfbGF5ZXJfbmFtZSAnOycKLSAgICB7IC8vIDUuNCBzeW50YXggCi0gICAgICBsZWZEYXRhLT51c2U1XzQgPSAxOwotICAgICAgaWYgKGxlZkRhdGEtPmlnbm9yZVZlcnNpb24pIHsKLSAgICAgICAgLy8gZG8gbm90aGluZyAKLSAgICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNCkgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5QaW5XYXJuaW5ncykgewotICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAiQU5URU5OQVBBUlRJQUxNRVRBTEFSRUEgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE2NDcsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChsZWZEYXRhLT51c2U1XzMpIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPnBpbldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+UGluV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgIkFOVEVOTkFQQVJUSUFMTUVUQUxBUkVBIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICBsZWZFcnJvcigxNjQ3LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgbGVmRGF0YS0+bGVmclBpbi5hZGRBbnRlbm5hUGFydGlhbE1ldGFsQXJlYSgkMiwgJDMpOwotICAgIH0KLSAgfCBLX0FOVEVOTkFQQVJUSUFMTUVUQUxTSURFQVJFQSBOVU1CRVIgb3B0X2xheWVyX25hbWUgJzsnCi0gICAgeyAvLyA1LjQgc3ludGF4IAotICAgICAgbGVmRGF0YS0+dXNlNV80ID0gMTsKLSAgICAgIGlmIChsZWZEYXRhLT5pZ25vcmVWZXJzaW9uKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcgCi0gICAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjQpIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPnBpbldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+UGluV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgIkFOVEVOTkFQQVJUSUFMTUVUQUxTSURFQVJFQSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTY0OCwgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPnVzZTVfMykgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5QaW5XYXJuaW5ncykgewotICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAiQU5URU5OQVBBUlRJQUxNRVRBTFNJREVBUkVBIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICBsZWZFcnJvcigxNjQ4LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgbGVmRGF0YS0+bGVmclBpbi5hZGRBbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWEoJDIsICQzKTsKLSAgICB9Ci0gIHwgS19BTlRFTk5BUEFSVElBTENVVEFSRUEgTlVNQkVSIG9wdF9sYXllcl9uYW1lICc7JwotICAgIHsgLy8gNS40IHN5bnRheCAKLSAgICAgIGxlZkRhdGEtPnVzZTVfNCA9IDE7Ci0gICAgICBpZiAobGVmRGF0YS0+aWdub3JlVmVyc2lvbikgewotICAgICAgICAvLyBkbyBub3RoaW5nIAotICAgICAgfSBlbHNlIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS40KSB7Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgIGlmIChsZWZEYXRhLT5waW5XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPlBpbldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAgICJBTlRFTk5BUEFSVElBTENVVEFSRUEgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE2NDksIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChsZWZEYXRhLT51c2U1XzMpIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPnBpbldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+UGluV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgIkFOVEVOTkFQQVJUSUFMQ1VUQVJFQSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTY0OSwgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIGxlZkRhdGEtPmxlZnJQaW4uYWRkQW50ZW5uYVBhcnRpYWxDdXRBcmVhKCQyLCAkMyk7Ci0gICAgfQotICB8IEtfQU5URU5OQURJRkZBUkVBIE5VTUJFUiBvcHRfbGF5ZXJfbmFtZSAnOycKLSAgICB7IC8vIDUuNCBzeW50YXggCi0gICAgICBsZWZEYXRhLT51c2U1XzQgPSAxOwotICAgICAgaWYgKGxlZkRhdGEtPmlnbm9yZVZlcnNpb24pIHsKLSAgICAgICAgLy8gZG8gbm90aGluZyAKLSAgICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNCkgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5QaW5XYXJuaW5ncykgewotICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAiQU5URU5OQURJRkZBUkVBIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICBsZWZFcnJvcigxNjUwLCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+dXNlNV8zKSB7Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgIGlmIChsZWZEYXRhLT5waW5XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPlBpbldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAgICJBTlRFTk5BRElGRkFSRUEgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE2NTAsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSBsZWZEYXRhLT5sZWZyUGluLmFkZEFudGVubmFEaWZmQXJlYSgkMiwgJDMpOwotICAgIH0KLSAgfCBLX0FOVEVOTkFHQVRFQVJFQSBOVU1CRVIgb3B0X2xheWVyX25hbWUgJzsnCi0gICAgeyAvLyA1LjQgc3ludGF4IAotICAgICAgbGVmRGF0YS0+dXNlNV80ID0gMTsKLSAgICAgIGlmIChsZWZEYXRhLT5pZ25vcmVWZXJzaW9uKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcgCi0gICAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjQpIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPnBpbldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+UGluV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgIkFOVEVOTkFHQVRFQVJFQSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTY1MSwgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPnVzZTVfMykgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5QaW5XYXJuaW5ncykgewotICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAiQU5URU5OQUdBVEVBUkVBIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICBsZWZFcnJvcigxNjUxLCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgbGVmRGF0YS0+bGVmclBpbi5hZGRBbnRlbm5hR2F0ZUFyZWEoJDIsICQzKTsKLSAgICB9Ci0gIHwgS19BTlRFTk5BTUFYQVJFQUNBUiBOVU1CRVIgcmVxX2xheWVyX25hbWUgJzsnCi0gICAgeyAvLyA1LjQgc3ludGF4IAotICAgICAgbGVmRGF0YS0+dXNlNV80ID0gMTsKLSAgICAgIGlmIChsZWZEYXRhLT5pZ25vcmVWZXJzaW9uKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcgCi0gICAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjQpIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPnBpbldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+UGluV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgIkFOVEVOTkFNQVhBUkVBQ0FSIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICBsZWZFcnJvcigxNjUyLCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+dXNlNV8zKSB7Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgIGlmIChsZWZEYXRhLT5waW5XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPlBpbldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAgICJBTlRFTk5BTUFYQVJFQUNBUiBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTY1MiwgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIGxlZkRhdGEtPmxlZnJQaW4uYWRkQW50ZW5uYU1heEFyZWFDYXIoJDIsICQzKTsKLSAgICB9Ci0gIHwgS19BTlRFTk5BTUFYU0lERUFSRUFDQVIgTlVNQkVSIHJlcV9sYXllcl9uYW1lICc7JwotICAgIHsgLy8gNS40IHN5bnRheCAKLSAgICAgIGxlZkRhdGEtPnVzZTVfNCA9IDE7Ci0gICAgICBpZiAobGVmRGF0YS0+aWdub3JlVmVyc2lvbikgewotICAgICAgICAvLyBkbyBub3RoaW5nIAotICAgICAgfSBlbHNlIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS40KSB7Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgIGlmIChsZWZEYXRhLT5waW5XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPlBpbldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAgICJBTlRFTk5BTUFYU0lERUFSRUFDQVIgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE2NTMsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChsZWZEYXRhLT51c2U1XzMpIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPnBpbldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+UGluV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgIkFOVEVOTkFNQVhTSURFQVJFQUNBUiBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTY1MywgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIGxlZkRhdGEtPmxlZnJQaW4uYWRkQW50ZW5uYU1heFNpZGVBcmVhQ2FyKCQyLCAkMyk7Ci0gICAgfQotICB8IEtfQU5URU5OQU1BWENVVENBUiBOVU1CRVIgcmVxX2xheWVyX25hbWUgJzsnCi0gICAgeyAvLyA1LjQgc3ludGF4IAotICAgICAgbGVmRGF0YS0+dXNlNV80ID0gMTsKLSAgICAgIGlmIChsZWZEYXRhLT5pZ25vcmVWZXJzaW9uKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcgCi0gICAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjQpIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPnBpbldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+UGluV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgIkFOVEVOTkFNQVhDVVRDQVIgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE2NTQsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChsZWZEYXRhLT51c2U1XzMpIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPnBpbldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+UGluV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgIkFOVEVOTkFNQVhDVVRDQVIgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE2NTQsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSBsZWZEYXRhLT5sZWZyUGluLmFkZEFudGVubmFNYXhDdXRDYXIoJDIsICQzKTsKLSAgICB9Ci0gIHwgS19BTlRFTk5BTU9ERUwKLSAgICB7IC8vIDUuNSBzeW50YXggCi0gICAgICBsZWZEYXRhLT51c2U1XzQgPSAxOwotICAgICAgaWYgKGxlZkRhdGEtPmlnbm9yZVZlcnNpb24pIHsKLSAgICAgICAgLy8gZG8gbm90aGluZyAKLSAgICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNSkgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+cGluV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5QaW5XYXJuaW5ncykgewotICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAiQU5URU5OQU1PREVMIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS41IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICBsZWZFcnJvcigxNjU1LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+dXNlNV8zKSB7Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgIGlmIChsZWZEYXRhLT5waW5XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPlBpbldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAgICJBTlRFTk5BTU9ERUwgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjUgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE2NTUsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBwaW5fbGF5ZXJfb3hpZGUgJzsnCi0gIHwgS19ORVRFWFBSIHtsZWZEYXRhLT5sZWZEdW1iTW9kZSA9IDI7IGxlZkRhdGEtPmxlZk5vTnVtID0gMjsgfSBRU1RSSU5HICc7JwotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS42KSB7Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgIGlmIChsZWZEYXRhLT5waW5XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPlBpbldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAgICJORVRFWFBSIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS42IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICBsZWZFcnJvcigxNjU2LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZQotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIGxlZkRhdGEtPmxlZnJQaW4uc2V0TmV0RXhwcigkMyk7Ci0gICAgfQotICB8IEtfU1VQUExZU0VOU0lUSVZJVFkge2xlZkRhdGEtPmxlZkR1bWJNb2RlID0gMTsgbGVmRGF0YS0+bGVmTm9OdW0gPSAxOyB9IFRfU1RSSU5HICc7JwotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS42KSB7Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgeyAvLyB3cml0ZSBlcnJvciBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgIGlmIChsZWZEYXRhLT5waW5XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPlBpbldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAgICJTVVBQTFlTRU5TSVRJVklUWSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTY1NywgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSBsZWZEYXRhLT5sZWZyUGluLnNldFN1cHBseVNlbnNpdGl2aXR5KCQzKTsKLSAgICB9Ci0gIHwgS19HUk9VTkRTRU5TSVRJVklUWSB7bGVmRGF0YS0+bGVmRHVtYk1vZGUgPSAxOyBsZWZEYXRhLT5sZWZOb051bSA9IDE7IH0gVF9TVFJJTkcgJzsnCi0gICAgewotICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjYpIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSB7IC8vIHdyaXRlIGVycm9yIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPnBpbldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+UGluV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgIkdST1VORFNFTlNJVElWSVRZIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS42IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICBsZWZFcnJvcigxNjU4LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZQotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIGxlZkRhdGEtPmxlZnJQaW4uc2V0R3JvdW5kU2Vuc2l0aXZpdHkoJDMpOwotICAgIH0KLQotcGluX2xheWVyX294aWRlOgotICBLX09YSURFMQotICAgIHsKLSAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspCi0gICAgICAgbGVmRGF0YS0+bGVmclBpbi5hZGRBbnRlbm5hTW9kZWwoMSk7Ci0gICAgfQotICB8IEtfT1hJREUyCi0gICAgewotICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykKLSAgICAgICBsZWZEYXRhLT5sZWZyUGluLmFkZEFudGVubmFNb2RlbCgyKTsKLSAgICB9Ci0gIHwgS19PWElERTMKLSAgICB7Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKQotICAgICAgIGxlZkRhdGEtPmxlZnJQaW4uYWRkQW50ZW5uYU1vZGVsKDMpOwotICAgIH0KLSAgfCBLX09YSURFNAotICAgIHsKLSAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspCi0gICAgICAgbGVmRGF0YS0+bGVmclBpbi5hZGRBbnRlbm5hTW9kZWwoNCk7Ci0gICAgfQotCi1waW5fcHJvcF9saXN0OgotICBwaW5fbmFtZV92YWx1ZV9wYWlyCi0gIHwgcGluX3Byb3BfbGlzdCBwaW5fbmFtZV92YWx1ZV9wYWlyCi0gIDsKLQotcGluX25hbWVfdmFsdWVfcGFpcjoKLSAgVF9TVFJJTkcgTlVNQkVSCi0gICAgeyAKLSAgICAgIGNoYXIgdGVtcFszMl07Ci0gICAgICBzcHJpbnRmKHRlbXAsICIlLjExZyIsICQyKTsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgewotICAgICAgICAgY2hhciBwcm9wVHA7Ci0gICAgICAgICBwcm9wVHAgPSBsZWZTZXR0aW5ncy0+bGVmUHJvcHMubGVmclBpblByb3AucHJvcFR5cGUoJDEpOwotICAgICAgICAgbGVmRGF0YS0+bGVmclBpbi5zZXROdW1Qcm9wZXJ0eSgkMSwgJDIsIHRlbXAsIHByb3BUcCk7Ci0gICAgICB9Ci0gICAgfQotICB8IFRfU1RSSU5HIFFTVFJJTkcKLSAgICB7Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmspIHsKLSAgICAgICAgIGNoYXIgcHJvcFRwOwotICAgICAgICAgcHJvcFRwID0gbGVmU2V0dGluZ3MtPmxlZlByb3BzLmxlZnJQaW5Qcm9wLnByb3BUeXBlKCQxKTsKLSAgICAgICAgIGxlZkRhdGEtPmxlZnJQaW4uc2V0UHJvcGVydHkoJDEsICQyLCBwcm9wVHApOwotICAgICAgfQotICAgIH0KLSAgfCBUX1NUUklORyBUX1NUUklORwotICAgIHsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPlBpbkNiaykgewotICAgICAgICAgY2hhciBwcm9wVHA7Ci0gICAgICAgICBwcm9wVHAgPSBsZWZTZXR0aW5ncy0+bGVmUHJvcHMubGVmclBpblByb3AucHJvcFR5cGUoJDEpOwotICAgICAgICAgbGVmRGF0YS0+bGVmclBpbi5zZXRQcm9wZXJ0eSgkMSwgJDIsIHByb3BUcCk7Ci0gICAgICB9Ci0gICAgfQotCi1lbGVjdHJpY2FsX2RpcmVjdGlvbjoKLSAgS19ESVJFQ1RJT04gS19JTlBVVCAnOycgICAgICAgICAgICAgIHskJCA9IChjaGFyKikiSU5QVVQiO30KLSAgfCBLX0RJUkVDVElPTiBLX09VVFBVVCAnOycgICAgICAgICAgICB7JCQgPSAoY2hhciopIk9VVFBVVCI7fQotICB8IEtfRElSRUNUSU9OIEtfT1VUUFVUIEtfVFJJU1RBVEUgJzsnIHskJCA9IChjaGFyKikiT1VUUFVUIFRSSVNUQVRFIjt9Ci0gIHwgS19ESVJFQ1RJT04gS19JTk9VVCAgJzsnICAgICAgICAgICAgeyQkID0gKGNoYXIqKSJJTk9VVCI7fQotICB8IEtfRElSRUNUSU9OIEtfRkVFRFRIUlUgJzsnICAgICAgICAgIHskJCA9IChjaGFyKikiRkVFRFRIUlUiO30KLQotc3RhcnRfbWFjcm9fcG9ydDogS19QT1JUCi0gICAgewotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UGluQ2JrKSB7Ci0gICAgICAgIGxlZkRhdGEtPmxlZnJEb0dlb21ldHJpZXMgPSAxOwotICAgICAgICBsZWZEYXRhLT5oYXNQUlAgPSAwOwotICAgICAgICBsZWZEYXRhLT5sZWZyR2VvbWV0cmllc1B0ciA9IChsZWZpR2VvbWV0cmllcyopbGVmTWFsbG9jKCBzaXplb2YobGVmaUdlb21ldHJpZXMpKTsKLSAgICAgICAgbGVmRGF0YS0+bGVmckdlb21ldHJpZXNQdHItPkluaXQoKTsKLSAgICAgIH0KLSAgICAgIGxlZkRhdGEtPm5lZWRHZW9tZXRyeSA9IDA7ICAvLyBkb24ndCBuZWVkIHJlY3QvcGF0aC9wb2x5IGRlZmluZSB5ZXQKLSAgICAgIGxlZkRhdGEtPmhhc0dlb0xheWVyID0gMDsgICAvLyBtYWtlIHN1cmUgTEFZRVIgaXMgc2V0IGJlZm9yZSBnZW9tZXRyeQotICAgIH0KLQotbWFjcm9fcG9ydF9jbGFzc19vcHRpb246IC8vIGVtcHR5IAotICB8IEtfQ0xBU1MgY2xhc3NfdHlwZSAnOycKLSAgICB7IGlmIChsZWZEYXRhLT5sZWZyRG9HZW9tZXRyaWVzKQotICAgICAgICBsZWZEYXRhLT5sZWZyR2VvbWV0cmllc1B0ci0+YWRkQ2xhc3MoJDIpOyB9Ci0KLW1hY3JvX3Bpbl91c2U6Ci0gIEtfU0lHTkFMICAgICAgeyQkID0gKGNoYXIqKSJTSUdOQUwiO30KLSAgfCBLX0FOQUxPRyAgICB7JCQgPSAoY2hhciopIkFOQUxPRyI7fQotICB8IEtfUE9XRVIgICAgIHskJCA9IChjaGFyKikiUE9XRVIiO30KLSAgfCBLX0dST1VORCAgICB7JCQgPSAoY2hhciopIkdST1VORCI7fQotICB8IEtfQ0xPQ0sgICAgIHskJCA9IChjaGFyKikiQ0xPQ0siO30KLSAgfCBLX0RBVEEgICAgICB7JCQgPSAoY2hhciopIkRBVEEiO30KLQotbWFjcm9fc2Nhbl91c2U6Ci0gIEtfSU5QVVQgeyQkID0gKGNoYXIqKSJJTlBVVCI7fQotICB8IEtfT1VUUFVUICAgIHskJCA9IChjaGFyKikiT1VUUFVUIjt9Ci0gIHwgS19TVEFSVCAgICAgeyQkID0gKGNoYXIqKSJTVEFSVCI7fQotICB8IEtfU1RPUCAgICAgIHskJCA9IChjaGFyKikiU1RPUCI7fQotCi1waW5fc2hhcGU6Ci0gIHskJCA9IChjaGFyKikiIjsgfSAgICAgIC8vIG5vbi1sZWZEYXRhLT5yaW5nIHNoYXBlIAotICB8IEtfQUJVVE1FTlQgIHskJCA9IChjaGFyKikiQUJVVE1FTlQiO30KLSAgfCBLX1JJTkcgICAgICB7JCQgPSAoY2hhciopIlJJTkciO30KLSAgfCBLX0ZFRURUSFJVICB7JCQgPSAoY2hhciopIkZFRURUSFJVIjt9Ci0KLWdlb21ldHJpZXM6IGdlb21ldHJ5IGdlb21ldHJ5X29wdGlvbnMKLQotZ2VvbWV0cnk6Ci0gIEtfTEFZRVIge2xlZkRhdGEtPmxlZkR1bWJNb2RlID0gMTsgbGVmRGF0YS0+bGVmTm9OdW0gPSAxOyB9IFRfU1RSSU5HCi0gICAgewotICAgICAgaWYgKChsZWZEYXRhLT5uZWVkR2VvbWV0cnkpICYmIChsZWZEYXRhLT5uZWVkR2VvbWV0cnkgIT0gMikpIC8vIDEgTEFZRVIgZm9sbG93IGFmdGVyIGFub3RoZXIKLSAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgLy8gZ2VvbWV0cmllcyBpcyBjYWxsZWQgYnkgTUFDUk8vT0JTICYgTUFDUk8vUElOL1BPUlQgCi0gICAgICAgICAgaWYgKGxlZkRhdGEtPm9ic0RlZikKLSAgICAgICAgICAgICBsZWZXYXJuaW5nKDIwNzYsICJFaXRoZXIgUEFUSCwgUkVDVCBvciBQT0xZR09OIHN0YXRlbWVudCBpcyBhIHJlcXVpcmVkIGluIE1BQ1JPL09CUy4iKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgbGVmV2FybmluZygyMDY1LCAiRWl0aGVyIFBBVEgsIFJFQ1Qgb3IgUE9MWUdPTiBzdGF0ZW1lbnQgaXMgYSByZXF1aXJlZCBpbiBNQUNSTy9QSU4vUE9SVC4iKTsKLSAgICAgICAgfQotICAgICAgaWYgKGxlZkRhdGEtPmxlZnJEb0dlb21ldHJpZXMpCi0gICAgICAgIGxlZkRhdGEtPmxlZnJHZW9tZXRyaWVzUHRyLT5hZGRMYXllcigkMyk7Ci0gICAgICBsZWZEYXRhLT5uZWVkR2VvbWV0cnkgPSAxOyAgICAvLyB3aXRoaW4gTEFZRVIgaXQgcmVxdWlyZXMgZWl0aGVyIHBhdGgsIHJlY3QsIHBvbHkKLSAgICAgIGxlZkRhdGEtPmhhc0dlb0xheWVyID0gMTsKLSAgICB9Ci0gIGxheWVyX2V4Y2VwdHBnbmV0Ci0gIGxheWVyX3NwYWNpbmcgJzsnCi0gIHwgS19XSURUSCBpbnRfbnVtYmVyICc7JwotICAgIHsgCi0gICAgICBpZiAobGVmRGF0YS0+bGVmckRvR2VvbWV0cmllcykgewotICAgICAgICBpZiAobGVmRGF0YS0+aGFzR2VvTGF5ZXIgPT0gMCkgeyAgIC8vIExBWUVSIHN0YXRlbWVudCBpcyBtaXNzaW5nIAotICAgICAgICAgICBpZiAobGVmRGF0YS0+bWFjcm9XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPk1hY3JvV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTcwMSwgIkEgTEFZRVIgc3RhdGVtZW50IGlzIG1pc3NpbmcgaW4gR2VvbWV0cnkuXG5MQVlFUiBpcyBhIHJlcXVpcmVkIHN0YXRlbWVudCBiZWZvcmUgYW55IGdlb21ldHJ5IGNhbiBiZSBkZWZpbmVkLiIpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgbGVmRGF0YS0+bGVmckdlb21ldHJpZXNQdHItPmFkZFdpZHRoKCQyKTsgCi0gICAgICB9IAotICAgIH0KLSAgfCBLX1BBVEggbWFza0NvbG9yIGZpcnN0UHQgb3RoZXJQdHMgJzsnCi0gICAgeyBpZiAobGVmRGF0YS0+bGVmckRvR2VvbWV0cmllcykgewotICAgICAgICBpZiAobGVmRGF0YS0+aGFzR2VvTGF5ZXIgPT0gMCkgeyAgIC8vIExBWUVSIHN0YXRlbWVudCBpcyBtaXNzaW5nIAotICAgICAgICAgICBpZiAobGVmRGF0YS0+bWFjcm9XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPk1hY3JvV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTcwMSwgIkEgTEFZRVIgc3RhdGVtZW50IGlzIG1pc3NpbmcgaW4gR2VvbWV0cnkuXG5MQVlFUiBpcyBhIHJlcXVpcmVkIHN0YXRlbWVudCBiZWZvcmUgYW55IGdlb21ldHJ5IGNhbiBiZSBkZWZpbmVkLiIpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuOCAmJiAoaW50KSQyID4gMCkgewotICAgICAgICAgICAgICBpZiAobGVmRGF0YS0+bWFjcm9XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPk1hY3JvV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgICAgbGVmRXJyb3IoMjA4MywgIkNvbG9yIG1hc2sgaW5mb3JtYXRpb24gY2FuIG9ubHkgYmUgZGVmaW5lZCB3aXRoIHZlcnNpb24gNS44LiIpOwotICAgICAgICAgICAgICAgICBDSEtFUlIoKTsgCi0gICAgICAgICAgICAgIH0gICAgICAgICAgIAotICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxlZkRhdGEtPmxlZnJHZW9tZXRyaWVzUHRyLT5hZGRQYXRoKChpbnQpJDIpOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGxlZkRhdGEtPmhhc1BSUCA9IDE7Ci0gICAgICBsZWZEYXRhLT5uZWVkR2VvbWV0cnkgPSAyOwotICAgIH0KLSAgfCBLX1BBVEggbWFza0NvbG9yIEtfSVRFUkFURSBmaXJzdFB0IG90aGVyUHRzIHN0ZXBQYXR0ZXJuICc7JwotICAgIHsgaWYgKGxlZkRhdGEtPmxlZnJEb0dlb21ldHJpZXMpIHsKLSAgICAgICAgaWYgKGxlZkRhdGEtPmhhc0dlb0xheWVyID09IDApIHsgICAvLyBMQVlFUiBzdGF0ZW1lbnQgaXMgbWlzc2luZyAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPm1hY3JvV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5NYWNyb1dhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE3MDEsICJBIExBWUVSIHN0YXRlbWVudCBpcyBtaXNzaW5nIGluIEdlb21ldHJ5LlxuTEFZRVIgaXMgYSByZXF1aXJlZCBzdGF0ZW1lbnQgYmVmb3JlIGFueSBnZW9tZXRyeSBjYW4gYmUgZGVmaW5lZC4iKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjggJiYgKGludCkkMiA+IDApIHsKLSAgICAgICAgICAgICAgaWYgKGxlZkRhdGEtPm1hY3JvV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5NYWNyb1dhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICAgIGxlZkVycm9yKDIwODMsICJDb2xvciBtYXNrIGluZm9ybWF0aW9uIGNhbiBvbmx5IGJlIGRlZmluZWQgd2l0aCB2ZXJzaW9uIDUuOC4iKTsKLSAgICAgICAgICAgICAgICAgQ0hLRVJSKCk7IAotICAgICAgICAgICAgICB9ICAgICAgICAgICAKLSAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgbGVmRGF0YS0+bGVmckdlb21ldHJpZXNQdHItPmFkZFBhdGhJdGVyKChpbnQpJDIpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfSAKLSAgICAgIGxlZkRhdGEtPmhhc1BSUCA9IDE7Ci0gICAgICBsZWZEYXRhLT5uZWVkR2VvbWV0cnkgPSAyOwotICAgIH0KLSAgfCBLX1JFQ1QgbWFza0NvbG9yIHB0IHB0JzsnCi0gICAgeyBpZiAobGVmRGF0YS0+bGVmckRvR2VvbWV0cmllcykgewotICAgICAgICBpZiAobGVmRGF0YS0+aGFzR2VvTGF5ZXIgPT0gMCkgeyAgIC8vIExBWUVSIHN0YXRlbWVudCBpcyBtaXNzaW5nIAotICAgICAgICAgICBpZiAobGVmRGF0YS0+bWFjcm9XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPk1hY3JvV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTcwMSwgIkEgTEFZRVIgc3RhdGVtZW50IGlzIG1pc3NpbmcgaW4gR2VvbWV0cnkuXG5MQVlFUiBpcyBhIHJlcXVpcmVkIHN0YXRlbWVudCBiZWZvcmUgYW55IGdlb21ldHJ5IGNhbiBiZSBkZWZpbmVkLiIpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuOCAmJiAoaW50KSQyID4gMCkgewotICAgICAgICAgICAgICBpZiAobGVmRGF0YS0+bWFjcm9XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPk1hY3JvV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgICAgbGVmRXJyb3IoMjA4MywgIkNvbG9yIG1hc2sgaW5mb3JtYXRpb24gY2FuIG9ubHkgYmUgZGVmaW5lZCB3aXRoIHZlcnNpb24gNS44LiIpOwotICAgICAgICAgICAgICAgICBDSEtFUlIoKTsgCi0gICAgICAgICAgICAgIH0gICAgICAgICAgIAotICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBsZWZEYXRhLT5sZWZyR2VvbWV0cmllc1B0ci0+YWRkUmVjdCgoaW50KSQyLCAkMy54LCAkMy55LCAkNC54LCAkNC55KTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBsZWZEYXRhLT5uZWVkR2VvbWV0cnkgPSAyOwotICAgIH0KLSAgfCBLX1JFQ1QgbWFza0NvbG9yIEtfSVRFUkFURSBwdCBwdCBzdGVwUGF0dGVybiAnOycKLSAgICB7IGlmIChsZWZEYXRhLT5sZWZyRG9HZW9tZXRyaWVzKSB7Ci0gICAgICAgIGlmIChsZWZEYXRhLT5oYXNHZW9MYXllciA9PSAwKSB7ICAgLy8gTEFZRVIgc3RhdGVtZW50IGlzIG1pc3NpbmcgCi0gICAgICAgICAgIGlmIChsZWZEYXRhLT5tYWNyb1dhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TWFjcm9XYXJuaW5ncykgewotICAgICAgICAgICAgICBsZWZFcnJvcigxNzAxLCAiQSBMQVlFUiBzdGF0ZW1lbnQgaXMgbWlzc2luZyBpbiBHZW9tZXRyeS5cbkxBWUVSIGlzIGEgcmVxdWlyZWQgc3RhdGVtZW50IGJlZm9yZSBhbnkgZ2VvbWV0cnkgY2FuIGJlIGRlZmluZWQuIik7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS44ICYmIChpbnQpJDIgPiAwKSB7Ci0gICAgICAgICAgICAgIGlmIChsZWZEYXRhLT5tYWNyb1dhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TWFjcm9XYXJuaW5ncykgewotICAgICAgICAgICAgICAgICBsZWZFcnJvcigyMDgzLCAiQ29sb3IgbWFzayBpbmZvcm1hdGlvbiBjYW4gb25seSBiZSBkZWZpbmVkIHdpdGggdmVyc2lvbiA1LjguIik7Ci0gICAgICAgICAgICAgICAgIENIS0VSUigpOyAKLSAgICAgICAgICAgICAgfSAgICAgICAgICAgCi0gICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGxlZkRhdGEtPmxlZnJHZW9tZXRyaWVzUHRyLT5hZGRSZWN0SXRlcigoaW50KSQyLCAkNC54LCAkNC55LCAkNS54LCAkNS55KTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBsZWZEYXRhLT5uZWVkR2VvbWV0cnkgPSAyOwotICAgIH0KLSAgfCBLX1BPTFlHT04gbWFza0NvbG9yIGZpcnN0UHQgbmV4dFB0IG5leHRQdCBvdGhlclB0cyAnOycKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+bGVmckRvR2VvbWV0cmllcykgewotICAgICAgICBpZiAobGVmRGF0YS0+aGFzR2VvTGF5ZXIgPT0gMCkgeyAgIC8vIExBWUVSIHN0YXRlbWVudCBpcyBtaXNzaW5nIAotICAgICAgICAgICBpZiAobGVmRGF0YS0+bWFjcm9XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPk1hY3JvV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRXJyb3IoMTcwMSwgIkEgTEFZRVIgc3RhdGVtZW50IGlzIG1pc3NpbmcgaW4gR2VvbWV0cnkuXG5MQVlFUiBpcyBhIHJlcXVpcmVkIHN0YXRlbWVudCBiZWZvcmUgYW55IGdlb21ldHJ5IGNhbiBiZSBkZWZpbmVkLiIpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuOCAmJiAoaW50KSQyID4gMCkgewotICAgICAgICAgICAgICBpZiAobGVmRGF0YS0+bWFjcm9XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPk1hY3JvV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgICAgbGVmRXJyb3IoMjA4MywgIkNvbG9yIG1hc2sgaW5mb3JtYXRpb24gY2FuIG9ubHkgYmUgZGVmaW5lZCB3aXRoIHZlcnNpb24gNS44LiIpOwotICAgICAgICAgICAgICAgICBDSEtFUlIoKTsgCi0gICAgICAgICAgICAgIH0gICAgICAgICAgIAotICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBsZWZEYXRhLT5sZWZyR2VvbWV0cmllc1B0ci0+YWRkUG9seWdvbigoaW50KSQyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgfQotICAgICAgbGVmRGF0YS0+aGFzUFJQID0gMTsKLSAgICAgIGxlZkRhdGEtPm5lZWRHZW9tZXRyeSA9IDI7Ci0gICAgfQotICB8IEtfUE9MWUdPTiBtYXNrQ29sb3IgS19JVEVSQVRFIGZpcnN0UHQgbmV4dFB0IG5leHRQdCBvdGhlclB0cyBzdGVwUGF0dGVybiAnOycKLSAgICB7IGlmIChsZWZEYXRhLT5sZWZyRG9HZW9tZXRyaWVzKSB7Ci0gICAgICAgIGlmIChsZWZEYXRhLT5oYXNHZW9MYXllciA9PSAwKSB7ICAgLy8gTEFZRVIgc3RhdGVtZW50IGlzIG1pc3NpbmcgCi0gICAgICAgICAgIGlmIChsZWZEYXRhLT5tYWNyb1dhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TWFjcm9XYXJuaW5ncykgewotICAgICAgICAgICAgICBsZWZFcnJvcigxNzAxLCAiQSBMQVlFUiBzdGF0ZW1lbnQgaXMgbWlzc2luZyBpbiBHZW9tZXRyeS5cbkxBWUVSIGlzIGEgcmVxdWlyZWQgc3RhdGVtZW50IGJlZm9yZSBhbnkgZ2VvbWV0cnkgY2FuIGJlIGRlZmluZWQuIik7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS44ICYmIChpbnQpJDIgPiAwKSB7Ci0gICAgICAgICAgICAgIGlmIChsZWZEYXRhLT5tYWNyb1dhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TWFjcm9XYXJuaW5ncykgewotICAgICAgICAgICAgICAgICBsZWZFcnJvcigyMDgzLCAiQ29sb3IgbWFzayBpbmZvcm1hdGlvbiBjYW4gb25seSBiZSBkZWZpbmVkIHdpdGggdmVyc2lvbiA1LjguIik7Ci0gICAgICAgICAgICAgICAgIENIS0VSUigpOyAKLSAgICAgICAgICAgICAgfSAgICAgICAgICAgCi0gICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGxlZkRhdGEtPmxlZnJHZW9tZXRyaWVzUHRyLT5hZGRQb2x5Z29uSXRlcigoaW50KSQyKTsKLSAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgICAgbGVmRGF0YS0+aGFzUFJQID0gMTsKLSAgICAgIGxlZkRhdGEtPm5lZWRHZW9tZXRyeSA9IDI7Ci0gICAgfQotICB8IHZpYV9wbGFjZW1lbnQKLSAgICB7IH0KLQotZ2VvbWV0cnlfb3B0aW9uczogLy8gZW1wdHkgCi0gIHwgZ2VvbWV0cnlfb3B0aW9ucyBnZW9tZXRyeQotCi1sYXllcl9leGNlcHRwZ25ldDogLy8gZW1wdHkgCi0gIHwgS19FWENFUFRQR05FVCAgICAgICAgICAgICAgICAgICAvLyA1LjcgCi0gICAgewotICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjcpIHsKLSAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgIHNwcmludGYobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICJFWENFUFRQR05FVCBpcyBhIHZlcnNpb24gNS43IG9yIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgIGxlZkVycm9yKDE2OTksIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgIGlmIChsZWZEYXRhLT5sZWZyRG9HZW9tZXRyaWVzKQotICAgICAgICBsZWZEYXRhLT5sZWZyR2VvbWV0cmllc1B0ci0+YWRkTGF5ZXJFeGNlcHRQZ05ldCgpOwotICAgICAgfQotICAgIH0KLQotbGF5ZXJfc3BhY2luZzogLy8gZW1wdHkgCi0gIHwgS19TUEFDSU5HIGludF9udW1iZXIKLSAgICB7IGlmIChsZWZEYXRhLT5sZWZyRG9HZW9tZXRyaWVzKSB7Ci0gICAgICAgIGlmICh6ZXJvT3JHdCgkMikpCi0gICAgICAgICAgIGxlZkRhdGEtPmxlZnJHZW9tZXRyaWVzUHRyLT5hZGRMYXllck1pblNwYWNpbmcoJDIpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgIlRIRSBTUEFDSU5HIHN0YXRlbWVudCBoYXMgdGhlIHZhbHVlICVnIGluIE1BQ1JPIE9CUy5cblZhbHVlIGhhcyB0byBiZSAwIG9yIGdyZWF0ZXIuIiwgJDIpOwotICAgICAgICAgICBsZWZFcnJvcigxNjU5LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgIENIS0VSUigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB8IEtfREVTSUdOUlVMRVdJRFRIIGludF9udW1iZXIKLSAgICB7IGlmIChsZWZEYXRhLT5sZWZyRG9HZW9tZXRyaWVzKSB7Ci0gICAgICAgIGlmICh6ZXJvT3JHdCgkMikpCi0gICAgICAgICAgIGxlZkRhdGEtPmxlZnJHZW9tZXRyaWVzUHRyLT5hZGRMYXllclJ1bGVXaWR0aCgkMik7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAiVEhFIERFU0lHTlJVTEVXSURUSCBzdGF0ZW1lbnQgaGFzIHRoZSB2YWx1ZSAlZyBpbiBNQUNSTyBPQlMuXG5WYWx1ZSBoYXMgdG8gYmUgMCBvciBncmVhdGVyLiIsICQyKTsKLSAgICAgICAgICAgbGVmRXJyb3IoMTY2MCwgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotZmlyc3RQdDogcHQgIAotICAgIHsgaWYgKGxlZkRhdGEtPmxlZnJEb0dlb21ldHJpZXMpCi0gICAgICAgIGxlZkRhdGEtPmxlZnJHZW9tZXRyaWVzUHRyLT5zdGFydExpc3QoJDEueCwgJDEueSk7IH0KLQotbmV4dFB0OiAgcHQKLSAgICB7IGlmIChsZWZEYXRhLT5sZWZyRG9HZW9tZXRyaWVzKQotICAgICAgICBsZWZEYXRhLT5sZWZyR2VvbWV0cmllc1B0ci0+YWRkVG9MaXN0KCQxLngsICQxLnkpOyB9Ci0KLW90aGVyUHRzOgotICAvLyBlbXB0eSAKLSAgfCBvdGhlclB0cyBuZXh0UHQKLSAgOwotCi12aWFfcGxhY2VtZW50OgotICBLX1ZJQSBtYXNrQ29sb3IgcHQge2xlZkRhdGEtPmxlZkR1bWJNb2RlID0gMTt9IFRfU1RSSU5HICc7JwotICAgIHsgCi0gICAgICAgIGlmIChsZWZEYXRhLT5sZWZyRG9HZW9tZXRyaWVzKXsKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS44ICYmIChpbnQpJDIgPiAwKSB7Ci0gICAgICAgICAgICAgIGlmIChsZWZEYXRhLT5tYWNyb1dhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+TWFjcm9XYXJuaW5ncykgewotICAgICAgICAgICAgICAgICBsZWZFcnJvcigyMDgzLCAiQ29sb3IgbWFzayBpbmZvcm1hdGlvbiBjYW4gb25seSBiZSBkZWZpbmVkIHdpdGggdmVyc2lvbiA1LjguIik7Ci0gICAgICAgICAgICAgICAgIENIS0VSUigpOyAKLSAgICAgICAgICAgICAgfSAgICAgICAgICAgCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxlZkRhdGEtPmxlZnJHZW9tZXRyaWVzUHRyLT5hZGRWaWEoKGludCkkMiwgJDMueCwgJDMueSwgJDUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICB8IEtfVklBIEtfSVRFUkFURSBtYXNrQ29sb3IgcHQge2xlZkRhdGEtPmxlZkR1bWJNb2RlID0gMTsgbGVmRGF0YS0+bGVmTm9OdW0gPSAxO30gVF9TVFJJTkcKLSAgICBzdGVwUGF0dGVybiAnOycKLSAgICB7IAotICAgICAgICBpZiAobGVmRGF0YS0+bGVmckRvR2VvbWV0cmllcykgewotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjggJiYgKGludCkkMyA+IDApIHsKLSAgICAgICAgICAgICAgaWYgKGxlZkRhdGEtPm1hY3JvV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5NYWNyb1dhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICAgIGxlZkVycm9yKDIwODMsICJDb2xvciBtYXNrIGluZm9ybWF0aW9uIGNhbiBvbmx5IGJlIGRlZmluZWQgd2l0aCB2ZXJzaW9uIDUuOC4iKTsKLSAgICAgICAgICAgICAgICAgQ0hLRVJSKCk7IAotICAgICAgICAgICAgICB9ICAgICAgICAgICAKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGxlZkRhdGEtPmxlZnJHZW9tZXRyaWVzUHRyLT5hZGRWaWFJdGVyKChpbnQpJDMsICQ0LngsICQ0LnksICQ2KTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgIAotc3RlcFBhdHRlcm46IEtfRE8gaW50X251bWJlciBLX0JZIGludF9udW1iZXIgS19TVEVQIGludF9udW1iZXIgaW50X251bWJlcgotICAgICB7IGlmIChsZWZEYXRhLT5sZWZyRG9HZW9tZXRyaWVzKQotICAgICAgICAgbGVmRGF0YS0+bGVmckdlb21ldHJpZXNQdHItPmFkZFN0ZXBQYXR0ZXJuKCQyLCAkNCwgJDYsICQ3KTsgfQotCi1zaXRlUGF0dGVybjogVF9TVFJJTkcgaW50X251bWJlciBpbnRfbnVtYmVyIG9yaWVudGF0aW9uCi0gIEtfRE8gaW50X251bWJlciBLX0JZIGludF9udW1iZXIgS19TVEVQIGludF9udW1iZXIgaW50X251bWJlcgotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT5sZWZyRG9TaXRlKSB7Ci0gICAgICAgIGxlZkRhdGEtPmxlZnJTaXRlUGF0dGVyblB0ciA9IChsZWZpU2l0ZVBhdHRlcm4qKWxlZk1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGxlZmlTaXRlUGF0dGVybikpOwotICAgICAgICBsZWZEYXRhLT5sZWZyU2l0ZVBhdHRlcm5QdHItPkluaXQoKTsKLSAgICAgICAgbGVmRGF0YS0+bGVmclNpdGVQYXR0ZXJuUHRyLT5zZXQoJDEsICQyLCAkMywgJDQsICQ2LCAkOCwKLSAgICAgICAgICAkMTAsICQxMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gIHwgVF9TVFJJTkcgaW50X251bWJlciBpbnRfbnVtYmVyIG9yaWVudGF0aW9uCi0gICAgewotICAgICAgaWYgKGxlZkRhdGEtPmxlZnJEb1NpdGUpIHsKLSAgICAgICAgbGVmRGF0YS0+bGVmclNpdGVQYXR0ZXJuUHRyID0gKGxlZmlTaXRlUGF0dGVybiopbGVmTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobGVmaVNpdGVQYXR0ZXJuKSk7Ci0gICAgICAgIGxlZkRhdGEtPmxlZnJTaXRlUGF0dGVyblB0ci0+SW5pdCgpOwotICAgICAgICBsZWZEYXRhLT5sZWZyU2l0ZVBhdHRlcm5QdHItPnNldCgkMSwgJDIsICQzLCAkNCwgLTEsIC0xLAotICAgICAgICAgIC0xLCAtMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLXRyYWNrUGF0dGVybjoKLSAgS19YIGludF9udW1iZXIgS19ETyBpbnRfbnVtYmVyIEtfU1RFUCBpbnRfbnVtYmVyIAotICAgIHsgCi0gICAgICBpZiAobGVmRGF0YS0+bGVmckRvVHJhY2spIHsKLSAgICAgICAgbGVmRGF0YS0+bGVmclRyYWNrUGF0dGVyblB0ciA9IChsZWZpVHJhY2tQYXR0ZXJuKilsZWZNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihsZWZpVHJhY2tQYXR0ZXJuKSk7Ci0gICAgICAgIGxlZkRhdGEtPmxlZnJUcmFja1BhdHRlcm5QdHItPkluaXQoKTsKLSAgICAgICAgbGVmRGF0YS0+bGVmclRyYWNrUGF0dGVyblB0ci0+c2V0KCJYIiwgJDIsIChpbnQpJDQsICQ2KTsKLSAgICAgIH0gICAgCi0gICAgfQotICAgIEtfTEFZRVIge2xlZkRhdGEtPmxlZkR1bWJNb2RlID0gMTAwMDAwMDAwMDt9IHRyYWNrTGF5ZXJzCi0gICAgeyBsZWZEYXRhLT5sZWZEdW1iTW9kZSA9IDA7fQotICB8IEtfWSBpbnRfbnVtYmVyIEtfRE8gaW50X251bWJlciBLX1NURVAgaW50X251bWJlcgotICAgIHsgCi0gICAgICBpZiAobGVmRGF0YS0+bGVmckRvVHJhY2spIHsKLSAgICAgICAgbGVmRGF0YS0+bGVmclRyYWNrUGF0dGVyblB0ciA9IChsZWZpVHJhY2tQYXR0ZXJuKilsZWZNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobGVmaVRyYWNrUGF0dGVybikpOwotICAgICAgICBsZWZEYXRhLT5sZWZyVHJhY2tQYXR0ZXJuUHRyLT5Jbml0KCk7Ci0gICAgICAgIGxlZkRhdGEtPmxlZnJUcmFja1BhdHRlcm5QdHItPnNldCgiWSIsICQyLCAoaW50KSQ0LCAkNik7Ci0gICAgICB9ICAgIAotICAgIH0KLSAgICBLX0xBWUVSIHtsZWZEYXRhLT5sZWZEdW1iTW9kZSA9IDEwMDAwMDAwMDA7fSB0cmFja0xheWVycwotICAgIHsgbGVmRGF0YS0+bGVmRHVtYk1vZGUgPSAwO30KLSAgfCBLX1ggaW50X251bWJlciBLX0RPIGludF9udW1iZXIgS19TVEVQIGludF9udW1iZXIgCi0gICAgeyAKLSAgICAgIGlmIChsZWZEYXRhLT5sZWZyRG9UcmFjaykgewotICAgICAgICBsZWZEYXRhLT5sZWZyVHJhY2tQYXR0ZXJuUHRyID0gKGxlZmlUcmFja1BhdHRlcm4qKWxlZk1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihsZWZpVHJhY2tQYXR0ZXJuKSk7Ci0gICAgICAgIGxlZkRhdGEtPmxlZnJUcmFja1BhdHRlcm5QdHItPkluaXQoKTsKLSAgICAgICAgbGVmRGF0YS0+bGVmclRyYWNrUGF0dGVyblB0ci0+c2V0KCJYIiwgJDIsIChpbnQpJDQsICQ2KTsKLSAgICAgIH0gICAgCi0gICAgfQotICB8IEtfWSBpbnRfbnVtYmVyIEtfRE8gaW50X251bWJlciBLX1NURVAgaW50X251bWJlcgotICAgIHsgCi0gICAgICBpZiAobGVmRGF0YS0+bGVmckRvVHJhY2spIHsKLSAgICAgICAgbGVmRGF0YS0+bGVmclRyYWNrUGF0dGVyblB0ciA9IChsZWZpVHJhY2tQYXR0ZXJuKilsZWZNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobGVmaVRyYWNrUGF0dGVybikpOwotICAgICAgICBsZWZEYXRhLT5sZWZyVHJhY2tQYXR0ZXJuUHRyLT5Jbml0KCk7Ci0gICAgICAgIGxlZkRhdGEtPmxlZnJUcmFja1BhdHRlcm5QdHItPnNldCgiWSIsICQyLCAoaW50KSQ0LCAkNik7Ci0gICAgICB9ICAgIAotICAgIH0KLQotdHJhY2tMYXllcnM6Ci0gIC8vIGVtcHR5IAotICB8IHRyYWNrTGF5ZXJzIGxheWVyX25hbWUKLSAgOwotCi1sYXllcl9uYW1lOiBUX1NUUklORwotICAgIHsgaWYgKGxlZkRhdGEtPmxlZnJEb1RyYWNrKSBsZWZEYXRhLT5sZWZyVHJhY2tQYXR0ZXJuUHRyLT5hZGRMYXllcigkMSk7IH0KLQotZ2NlbGxQYXR0ZXJuOiBLX1ggaW50X251bWJlciBLX0RPIGludF9udW1iZXIgS19TVEVQIGludF9udW1iZXIKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+bGVmckRvR2NlbGwpIHsKLSAgICAgICAgbGVmRGF0YS0+bGVmckdjZWxsUGF0dGVyblB0ciA9IChsZWZpR2NlbGxQYXR0ZXJuKilsZWZNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobGVmaUdjZWxsUGF0dGVybikpOwotICAgICAgICBsZWZEYXRhLT5sZWZyR2NlbGxQYXR0ZXJuUHRyLT5Jbml0KCk7Ci0gICAgICAgIGxlZkRhdGEtPmxlZnJHY2VsbFBhdHRlcm5QdHItPnNldCgiWCIsICQyLCAoaW50KSQ0LCAkNik7Ci0gICAgICB9ICAgIAotICAgIH0KLSAgfCBLX1kgaW50X251bWJlciBLX0RPIGludF9udW1iZXIgS19TVEVQIGludF9udW1iZXIKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+bGVmckRvR2NlbGwpIHsKLSAgICAgICAgbGVmRGF0YS0+bGVmckdjZWxsUGF0dGVyblB0ciA9IChsZWZpR2NlbGxQYXR0ZXJuKilsZWZNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobGVmaUdjZWxsUGF0dGVybikpOwotICAgICAgICBsZWZEYXRhLT5sZWZyR2NlbGxQYXR0ZXJuUHRyLT5Jbml0KCk7Ci0gICAgICAgIGxlZkRhdGEtPmxlZnJHY2VsbFBhdHRlcm5QdHItPnNldCgiWSIsICQyLCAoaW50KSQ0LCAkNik7Ci0gICAgICB9ICAgIAotICAgIH0KLQotbWFjcm9fb2JzOiBzdGFydF9tYWNyb19vYnMgZ2VvbWV0cmllcyBLX0VORAotICAgIHsgCi0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5PYnN0cnVjdGlvbkNiaykgewotICAgICAgICBsZWZEYXRhLT5sZWZyT2JzdHJ1Y3Rpb24uc2V0R2VvbWV0cmllcyhsZWZEYXRhLT5sZWZyR2VvbWV0cmllc1B0cik7Ci0gICAgICAgIGxlZkRhdGEtPmxlZnJHZW9tZXRyaWVzUHRyID0gMDsKLSAgICAgICAgbGVmRGF0YS0+bGVmckRvR2VvbWV0cmllcyA9IDA7Ci0gICAgICAgIENBTExCQUNLKGxlZkNhbGxiYWNrcy0+T2JzdHJ1Y3Rpb25DYmssIGxlZnJPYnN0cnVjdGlvbkNia1R5cGUsICZsZWZEYXRhLT5sZWZyT2JzdHJ1Y3Rpb24pOwotICAgICAgfQotICAgICAgbGVmRGF0YS0+bGVmRHVtYk1vZGUgPSAwOwotICAgICAgbGVmRGF0YS0+aGFzR2VvTGF5ZXIgPSAwOyAgICAgICAvLyByZXNldCAKLSAgICB9Ci0gIHwgc3RhcnRfbWFjcm9fb2JzIEtfRU5ECi0gICAgewotICAgICAgIC8vIFRoZSBwb2ludGVyIGhhcyBtYWxsb2NlZCBpbiBzdGFydCwgbmVlZCB0byBmcmVlIG1hbnVhbGx5IAotICAgICAgIGlmIChsZWZEYXRhLT5sZWZyR2VvbWV0cmllc1B0cikgewotICAgICAgICAgIGxlZkRhdGEtPmxlZnJHZW9tZXRyaWVzUHRyLT5EZXN0cm95KCk7Ci0gICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5sZWZyR2VvbWV0cmllc1B0cik7Ci0gICAgICAgICAgbGVmRGF0YS0+bGVmckdlb21ldHJpZXNQdHIgPSAwOwotICAgICAgICAgIGxlZkRhdGEtPmxlZnJEb0dlb21ldHJpZXMgPSAwOwotICAgICAgIH0KLSAgICAgICBsZWZEYXRhLT5oYXNHZW9MYXllciA9IDA7Ci0gICAgfQotCi1zdGFydF9tYWNyb19vYnM6IEtfT0JTCi0gICAgewotICAgICAgbGVmRGF0YS0+b2JzRGVmID0gMTsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPk9ic3RydWN0aW9uQ2JrKSB7Ci0gICAgICAgIGxlZkRhdGEtPmxlZnJEb0dlb21ldHJpZXMgPSAxOwotICAgICAgICBsZWZEYXRhLT5sZWZyR2VvbWV0cmllc1B0ciA9IChsZWZpR2VvbWV0cmllcyopbGVmTWFsbG9jKAotICAgICAgICAgICAgc2l6ZW9mKGxlZmlHZW9tZXRyaWVzKSk7Ci0gICAgICAgIGxlZkRhdGEtPmxlZnJHZW9tZXRyaWVzUHRyLT5Jbml0KCk7Ci0gICAgICAgIH0KLSAgICAgIGxlZkRhdGEtPmhhc0dlb0xheWVyID0gMDsKLSAgICB9Ci0KLW1hY3JvX2RlbnNpdHk6IEtfREVOU0lUWSBkZW5zaXR5X2xheWVyIGRlbnNpdHlfbGF5ZXJzIEtfRU5ECi0gICAgeyAKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS42KSB7Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkRlbnNpdHlDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+bWFjcm9XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPk1hY3JvV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgIkRFTlNJVFkgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjYgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE2NjEsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSAKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkRlbnNpdHlDYmspIHsKLSAgICAgICAgQ0FMTEJBQ0sobGVmQ2FsbGJhY2tzLT5EZW5zaXR5Q2JrLCBsZWZyRGVuc2l0eUNia1R5cGUsICZsZWZEYXRhLT5sZWZyRGVuc2l0eSk7Ci0gICAgICAgIGxlZkRhdGEtPmxlZnJEZW5zaXR5LmNsZWFyKCk7Ci0gICAgICB9Ci0gICAgICBsZWZEYXRhLT5sZWZEdW1iTW9kZSA9IDA7Ci0gICAgfQotCi1kZW5zaXR5X2xheWVyczogLy8gZW1wdHkgCi0gICAgfCBkZW5zaXR5X2xheWVycyBkZW5zaXR5X2xheWVyCi0gICAgOwotCi1kZW5zaXR5X2xheWVyOiBLX0xBWUVSIHsgbGVmRGF0YS0+bGVmRHVtYk1vZGUgPSAxOyBsZWZEYXRhLT5sZWZOb051bSA9IDE7IH0gVF9TVFJJTkcgJzsnCi0gICAgewotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+RGVuc2l0eUNiaykKLSAgICAgICAgbGVmRGF0YS0+bGVmckRlbnNpdHkuYWRkTGF5ZXIoJDMpOwotICAgIH0KLSAgICBkZW5zaXR5X2xheWVyX3JlY3QgZGVuc2l0eV9sYXllcl9yZWN0cwotCi1kZW5zaXR5X2xheWVyX3JlY3RzOiAvLyBlbXB0eSAKLSAgICB8IGRlbnNpdHlfbGF5ZXJfcmVjdHMgZGVuc2l0eV9sYXllcl9yZWN0Ci0gICAgOwotCi1kZW5zaXR5X2xheWVyX3JlY3Q6IEtfUkVDVCBwdCBwdCBpbnRfbnVtYmVyICc7JwotICAgIHsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkRlbnNpdHlDYmspCi0gICAgICAgIGxlZkRhdGEtPmxlZnJEZW5zaXR5LmFkZFJlY3QoJDIueCwgJDIueSwgJDMueCwgJDMueSwgJDQpOyAKLSAgICB9Ci0KLW1hY3JvX2Nsb2NrdHlwZTogS19DTE9DS1RZUEUgeyBsZWZEYXRhLT5sZWZEdW1iTW9kZSA9IDE7IGxlZkRhdGEtPmxlZk5vTnVtID0gMTsgfSBUX1NUUklORyAnOycKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPk1hY3JvQ2JrKSBsZWZEYXRhLT5sZWZyTWFjcm8uc2V0Q2xvY2tUeXBlKCQzKTsgfQotCi10aW1pbmc6IHN0YXJ0X3RpbWluZyB0aW1pbmdfb3B0aW9ucyBlbmRfdGltaW5nCi0gICAgeyB9Ci0KLXN0YXJ0X3RpbWluZzogS19USU1JTkcgCi0gICAgeyB9Ci0KLWVuZF90aW1pbmc6IEtfRU5EIEtfVElNSU5HIAotICB7Ci0gICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjQpIHsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPlRpbWluZ0NiayAmJiBsZWZEYXRhLT5sZWZyVGltaW5nLmhhc0RhdGEoKSkKLSAgICAgICAgQ0FMTEJBQ0sobGVmQ2FsbGJhY2tzLT5UaW1pbmdDYmssIGxlZnJUaW1pbmdDYmtUeXBlLCAmbGVmRGF0YS0+bGVmclRpbWluZyk7Ci0gICAgICBsZWZEYXRhLT5sZWZyVGltaW5nLmNsZWFyKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPlRpbWluZ0NiaykgLy8gd3JpdGUgd2FybmluZyBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgIGlmIChsZWZEYXRhLT50aW1pbmdXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPlRpbWluZ1dhcm5pbmdzKQotICAgICAgICAgIGxlZldhcm5pbmcoMjA2NiwgIk1BQ1JPIFRJTUlORyBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIik7Ci0gICAgICBsZWZEYXRhLT5sZWZyVGltaW5nLmNsZWFyKCk7Ci0gICAgfQotICB9Ci0KLXRpbWluZ19vcHRpb25zOgotICAvLyBlbXB0eSAKLSAgfCB0aW1pbmdfb3B0aW9ucyB0aW1pbmdfb3B0aW9uCi0gIDsKLQotdGltaW5nX29wdGlvbjoKLSAgS19GUk9NUElOIAotICAgIHsKLSAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNCkgewotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+VGltaW5nQ2JrICYmIGxlZkRhdGEtPmxlZnJUaW1pbmcuaGFzRGF0YSgpKQotICAgICAgICBDQUxMQkFDSyhsZWZDYWxsYmFja3MtPlRpbWluZ0NiaywgbGVmclRpbWluZ0Nia1R5cGUsICZsZWZEYXRhLT5sZWZyVGltaW5nKTsKLSAgICB9Ci0gICAgbGVmRGF0YS0+bGVmRHVtYk1vZGUgPSAxMDAwMDAwMDAwOwotICAgIGxlZkRhdGEtPmxlZnJUaW1pbmcuY2xlYXIoKTsKLSAgICB9Ci0gICAgbGlzdF9vZl9mcm9tX3N0cmluZ3MgJzsnCi0gICAgeyBsZWZEYXRhLT5sZWZEdW1iTW9kZSA9IDA7fQotICB8IEtfVE9QSU4ge2xlZkRhdGEtPmxlZkR1bWJNb2RlID0gMTAwMDAwMDAwMDt9IGxpc3Rfb2ZfdG9fc3RyaW5ncyAnOycKLSAgICB7IGxlZkRhdGEtPmxlZkR1bWJNb2RlID0gMDt9Ci0gIHwgcmlzZWZhbGwgS19JTlRSSU5TSUMgaW50X251bWJlciBpbnRfbnVtYmVyCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5UaW1pbmdDYmspIGxlZkRhdGEtPmxlZnJUaW1pbmcuYWRkUmlzZUZhbGwoJDEsJDMsJDQpOyB9Ci0gICAgc2xld19zcGVjIEtfVkFSSUFCTEUgaW50X251bWJlciBpbnRfbnVtYmVyICc7JwotICAgIHsgaWYgKGxlZkNhbGxiYWNrcy0+VGltaW5nQ2JrKSBsZWZEYXRhLT5sZWZyVGltaW5nLmFkZFJpc2VGYWxsVmFyaWFibGUoJDgsJDkpOyB9Ci0gIHwgcmlzZWZhbGwgZGVsYXlfb3JfdHJhbnNpdGlvbiBLX1VOQVRFTkVTUyB1bmF0ZW5lc3MKLSAgICBLX1RBQkxFRElNRU5TSU9OIGludF9udW1iZXIgaW50X251bWJlciBpbnRfbnVtYmVyICc7JyAKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPlRpbWluZ0NiaykgewotICAgICAgICBpZiAoJDJbMF0gPT0gJ0QnIHx8ICQyWzBdID09ICdkJykgLy8gZGVsYXkgCi0gICAgICAgICAgbGVmRGF0YS0+bGVmclRpbWluZy5hZGREZWxheSgkMSwgJDQsICQ2LCAkNywgJDgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgbGVmRGF0YS0+bGVmclRpbWluZy5hZGRUcmFuc2l0aW9uKCQxLCAkNCwgJDYsICQ3LCAkOCk7Ci0gICAgICB9Ci0gICAgfQotICB8IEtfVEFCTEVBWElTIGxpc3Rfb2ZfdGFibGVfYXhpc19kbnVtYmVycyAnOycKLSAgICB7IH0KLSAgfCBLX1RBQkxFRU5UUklFUyBsaXN0X29mX3RhYmxlX2VudHJpZXMgJzsnCi0gICAgeyB9Ci0gIHwgS19SSVNFUlMgaW50X251bWJlciBpbnRfbnVtYmVyICc7JwotICAgIHsgaWYgKGxlZkNhbGxiYWNrcy0+VGltaW5nQ2JrKSBsZWZEYXRhLT5sZWZyVGltaW5nLnNldFJpc2VSUygkMiwkMyk7IH0KLSAgfCBLX0ZBTExSUyBpbnRfbnVtYmVyIGludF9udW1iZXIgJzsnCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5UaW1pbmdDYmspIGxlZkRhdGEtPmxlZnJUaW1pbmcuc2V0RmFsbFJTKCQyLCQzKTsgfQotICB8IEtfUklTRUNTIGludF9udW1iZXIgaW50X251bWJlciAnOycKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPlRpbWluZ0NiaykgbGVmRGF0YS0+bGVmclRpbWluZy5zZXRSaXNlQ1MoJDIsJDMpOyB9Ci0gIHwgS19GQUxMQ1MgaW50X251bWJlciBpbnRfbnVtYmVyICc7JwotICAgIHsgaWYgKGxlZkNhbGxiYWNrcy0+VGltaW5nQ2JrKSBsZWZEYXRhLT5sZWZyVGltaW5nLnNldEZhbGxDUygkMiwkMyk7IH0KLSAgfCBLX1JJU0VTQVRUMSBpbnRfbnVtYmVyIGludF9udW1iZXIgJzsnCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5UaW1pbmdDYmspIGxlZkRhdGEtPmxlZnJUaW1pbmcuc2V0UmlzZUF0dDEoJDIsJDMpOyB9Ci0gIHwgS19GQUxMU0FUVDEgaW50X251bWJlciBpbnRfbnVtYmVyICc7JwotICAgIHsgaWYgKGxlZkNhbGxiYWNrcy0+VGltaW5nQ2JrKSBsZWZEYXRhLT5sZWZyVGltaW5nLnNldEZhbGxBdHQxKCQyLCQzKTsgfQotICB8IEtfUklTRVQwIGludF9udW1iZXIgaW50X251bWJlciAnOycKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPlRpbWluZ0NiaykgbGVmRGF0YS0+bGVmclRpbWluZy5zZXRSaXNlVG8oJDIsJDMpOyB9Ci0gIHwgS19GQUxMVDAgaW50X251bWJlciBpbnRfbnVtYmVyICc7JwotICAgIHsgaWYgKGxlZkNhbGxiYWNrcy0+VGltaW5nQ2JrKSBsZWZEYXRhLT5sZWZyVGltaW5nLnNldEZhbGxUbygkMiwkMyk7IH0KLSAgfCBLX1VOQVRFTkVTUyB1bmF0ZW5lc3MgJzsnCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5UaW1pbmdDYmspIGxlZkRhdGEtPmxlZnJUaW1pbmcuYWRkVW5hdGVuZXNzKCQyKTsgfQotICB8IEtfU1RBQkxFIEtfU0VUVVAgaW50X251bWJlciBLX0hPTEQgaW50X251bWJlciByaXNlZmFsbCAnOycKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPlRpbWluZ0NiaykgbGVmRGF0YS0+bGVmclRpbWluZy5zZXRTdGFibGUoJDMsJDUsJDYpOyB9Ci0gIHwgdHdvX3Bpbl90cmlnZ2VyIGZyb21fcGluX3RyaWdnZXIgdG9fcGluX3RyaWdnZXIgS19UQUJMRURJTUVOU0lPTiBpbnRfbnVtYmVyIGludF9udW1iZXIgaW50X251bWJlciAnOycKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPlRpbWluZ0NiaykgbGVmRGF0YS0+bGVmclRpbWluZy5hZGRTREYyUGlucygkMSwkMiwkMywkNSwkNiwkNyk7IH0KLSAgfCBvbmVfcGluX3RyaWdnZXIgS19UQUJMRURJTUVOU0lPTiBpbnRfbnVtYmVyIGludF9udW1iZXIgaW50X251bWJlciAnOycgCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5UaW1pbmdDYmspIGxlZkRhdGEtPmxlZnJUaW1pbmcuYWRkU0RGMVBpbigkMSwkMywkNCwkNCk7IH0KLSAgfCBLX1NERkNPTkRTVEFSVCBRU1RSSU5HICc7JwotICAgIHsgaWYgKGxlZkNhbGxiYWNrcy0+VGltaW5nQ2JrKSBsZWZEYXRhLT5sZWZyVGltaW5nLnNldFNERmNvbmRTdGFydCgkMik7IH0KLSAgfCBLX1NERkNPTkRFTkQgUVNUUklORyAnOycKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPlRpbWluZ0NiaykgbGVmRGF0YS0+bGVmclRpbWluZy5zZXRTREZjb25kRW5kKCQyKTsgfQotICB8IEtfU0RGQ09ORCBRU1RSSU5HICc7JwotICAgIHsgaWYgKGxlZkNhbGxiYWNrcy0+VGltaW5nQ2JrKSBsZWZEYXRhLT5sZWZyVGltaW5nLnNldFNERmNvbmQoJDIpOyB9Ci0gIHwgS19FWFRFTlNJT04gJzsnCi0gICAgeyB9Ci0KLW9uZV9waW5fdHJpZ2dlcjoKLSAgS19NUFdICi0gICAgeyAkJCA9IChjaGFyKikiTVBXSCI7fQotICB8IEtfTVBXTAotICAgIHsgJCQgPSAoY2hhciopIk1QV0wiO30KLSAgfCBLX1BFUklPRAotICAgIHsgJCQgPSAoY2hhciopIlBFUklPRCI7fQotCi10d29fcGluX3RyaWdnZXIgOgotICBLX1NFVFVQCi0gICAgeyAkJCA9IChjaGFyKikiU0VUVVAiO30KLSAgfCBLX0hPTEQKLSAgICB7ICQkID0gKGNoYXIqKSJIT0xEIjt9Ci0gIHwgS19SRUNPVkVSWQotICAgIHsgJCQgPSAoY2hhciopIlJFQ09WRVJZIjt9Ci0gIHwgS19TS0VXCi0gICAgeyAkJCA9IChjaGFyKikiU0tFVyI7fQotCi1mcm9tX3Bpbl90cmlnZ2VyOgotICBLX0FOWUVER0UKLSAgICB7ICQkID0gKGNoYXIqKSJBTllFREdFIjt9Ci0gIHwgS19QT1NFREdFCi0gICAgeyAkJCA9IChjaGFyKikiUE9TRURHRSI7fQotICB8IEtfTkVHRURHRSAKLSAgICB7ICQkID0gKGNoYXIqKSJORUdFREdFIjt9Ci0KLXRvX3Bpbl90cmlnZ2VyOgotICBLX0FOWUVER0UKLSAgICB7ICQkID0gKGNoYXIqKSJBTllFREdFIjt9Ci0gIHwgS19QT1NFREdFCi0gICAgeyAkJCA9IChjaGFyKikiUE9TRURHRSI7fQotICB8IEtfTkVHRURHRSAKLSAgICB7ICQkID0gKGNoYXIqKSJORUdFREdFIjt9Ci0KLWRlbGF5X29yX3RyYW5zaXRpb24gOgotICBLX0RFTEFZCi0gICAgeyAkJCA9IChjaGFyKikiREVMQVkiOyB9Ci0gIHwgS19UUkFOU0lUSU9OVElNRQotICAgIHsgJCQgPSAoY2hhciopIlRSQU5TSVRJT04iOyB9Ci0KLWxpc3Rfb2ZfdGFibGVfZW50cmllczoKLSAgdGFibGVfZW50cnkKLSAgICB7IH0KLSAgfCBsaXN0X29mX3RhYmxlX2VudHJpZXMgdGFibGVfZW50cnkKLSAgICB7IH0KLQotdGFibGVfZW50cnk6ICcoJyBpbnRfbnVtYmVyIGludF9udW1iZXIgaW50X251bWJlciAnKScKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPlRpbWluZ0NiaykgbGVmRGF0YS0+bGVmclRpbWluZy5hZGRUYWJsZUVudHJ5KCQyLCQzLCQ0KTsgfQotCi1saXN0X29mX3RhYmxlX2F4aXNfZG51bWJlcnM6Ci0gIGludF9udW1iZXIKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPlRpbWluZ0NiaykgbGVmRGF0YS0+bGVmclRpbWluZy5hZGRUYWJsZUF4aXNOdW1iZXIoJDEpOyB9Ci0gIHwgbGlzdF9vZl90YWJsZV9heGlzX2RudW1iZXJzIGludF9udW1iZXIKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPlRpbWluZ0NiaykgbGVmRGF0YS0+bGVmclRpbWluZy5hZGRUYWJsZUF4aXNOdW1iZXIoJDIpOyB9Ci0KLXNsZXdfc3BlYzoKLSAgLy8gZW1wdHkgCi0gICAgeyB9Ci0gIHwgaW50X251bWJlciBpbnRfbnVtYmVyIGludF9udW1iZXIgaW50X251bWJlciAKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPlRpbWluZ0NiaykgbGVmRGF0YS0+bGVmclRpbWluZy5hZGRSaXNlRmFsbFNsZXcoJDEsJDIsJDMsJDQpOyB9Ci0gIHwgIGludF9udW1iZXIgaW50X251bWJlciBpbnRfbnVtYmVyIGludF9udW1iZXIgaW50X251bWJlciBpbnRfbnVtYmVyIGludF9udW1iZXIgCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5UaW1pbmdDYmspIGxlZkRhdGEtPmxlZnJUaW1pbmcuYWRkUmlzZUZhbGxTbGV3KCQxLCQyLCQzLCQ0KTsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPlRpbWluZ0NiaykgbGVmRGF0YS0+bGVmclRpbWluZy5hZGRSaXNlRmFsbFNsZXcyKCQ1LCQ2LCQ3KTsgfQotCi1yaXNlZmFsbDoKLSAgS19SSVNFCi0gICAgeyAkJCA9IChjaGFyKikiUklTRSI7IH0KLSAgfCBLX0ZBTEwgCi0gICAgeyAkJCA9IChjaGFyKikiRkFMTCI7IH0KLQotdW5hdGVuZXNzOgotICBLX0lOVkVSVAotICAgIHsgJCQgPSAoY2hhciopIklOVkVSVCI7IH0KLSAgfCBLX05PTklOVkVSVAotICAgIHsgJCQgPSAoY2hhciopIk5PTklOVkVSVCI7IH0KLSAgfCBLX05PTlVOQVRFIAotICAgIHsgJCQgPSAoY2hhciopIk5PTlVOQVRFIjsgfQotCi1saXN0X29mX2Zyb21fc3RyaW5nczoKLSAgVF9TVFJJTkcKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPlRpbWluZ0NiaykgbGVmRGF0YS0+bGVmclRpbWluZy5hZGRGcm9tUGluKCQxKTsgfQotICB8IGxpc3Rfb2ZfZnJvbV9zdHJpbmdzIFRfU1RSSU5HIAotICAgIHsgaWYgKGxlZkNhbGxiYWNrcy0+VGltaW5nQ2JrKSBsZWZEYXRhLT5sZWZyVGltaW5nLmFkZEZyb21QaW4oJDIpOyB9Ci0KLWxpc3Rfb2ZfdG9fc3RyaW5nczoKLSAgVF9TVFJJTkcKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPlRpbWluZ0NiaykgbGVmRGF0YS0+bGVmclRpbWluZy5hZGRUb1BpbigkMSk7IH0KLSAgfCBsaXN0X29mX3RvX3N0cmluZ3MgVF9TVFJJTkcgCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5UaW1pbmdDYmspIGxlZkRhdGEtPmxlZnJUaW1pbmcuYWRkVG9QaW4oJDIpOyB9Ci0KLWFycmF5OiBzdGFydF9hcnJheSBhcnJheV9ydWxlcwotICAgIHsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkFycmF5Q2JrKQotICAgICAgICBDQUxMQkFDSyhsZWZDYWxsYmFja3MtPkFycmF5Q2JrLCBsZWZyQXJyYXlDYmtUeXBlLCAmbGVmRGF0YS0+bGVmckFycmF5KTsKLSAgICAgIGxlZkRhdGEtPmxlZnJBcnJheS5jbGVhcigpOwotICAgICAgbGVmRGF0YS0+bGVmclNpdGVQYXR0ZXJuUHRyID0gMDsKLSAgICAgIGxlZkRhdGEtPmxlZnJEb1NpdGUgPSAwOwotICAgfQotICAgIGVuZF9hcnJheQotCi1zdGFydF9hcnJheTogS19BUlJBWSB7bGVmRGF0YS0+bGVmRHVtYk1vZGUgPSAxOyBsZWZEYXRhLT5sZWZOb051bSA9IDE7fSBUX1NUUklORwotICAgIHsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkFycmF5Q2JrKSB7Ci0gICAgICAgIGxlZkRhdGEtPmxlZnJBcnJheS5zZXROYW1lKCQzKTsKLSAgICAgICAgQ0FMTEJBQ0sobGVmQ2FsbGJhY2tzLT5BcnJheUJlZ2luQ2JrLCBsZWZyQXJyYXlCZWdpbkNia1R5cGUsICQzKTsKLSAgICAgIH0KLSAgICAgIC8vc3RyY3B5KGxlZkRhdGEtPmFycmF5TmFtZSwgJDMpOwotICAgICAgbGVmRGF0YS0+YXJyYXlOYW1lID0gc3RyZHVwKCQzKTsKLSAgICB9Ci0KLWVuZF9hcnJheTogS19FTkQge2xlZkRhdGEtPmxlZkR1bWJNb2RlID0gMTsgbGVmRGF0YS0+bGVmTm9OdW0gPSAxO30gVF9TVFJJTkcKLSAgICB7Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5BcnJheUNiayAmJiBsZWZDYWxsYmFja3MtPkFycmF5RW5kQ2JrKQotICAgICAgICBDQUxMQkFDSyhsZWZDYWxsYmFja3MtPkFycmF5RW5kQ2JrLCBsZWZyQXJyYXlFbmRDYmtUeXBlLCAkMyk7Ci0gICAgICBpZiAoc3RyY21wKGxlZkRhdGEtPmFycmF5TmFtZSwgJDMpICE9IDApIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+QXJyYXlDYmspIHsgLy8gd3JpdGUgZXJyb3Igb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+YXJyYXlXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkFycmF5V2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgIkVORCBBUlJBWSBuYW1lICVzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBBUlJBWSBuYW1lICVzLlxuQ29ycmVjdCB0aGUgTEVGIGZpbGUgYmVmb3JlIHJlcnVubmluZyBpdCB0aHJvdWdoIHRoZSBMRUYgcGFyc2VyLiIsICQzLCBsZWZEYXRhLT5hcnJheU5hbWUpOwotICAgICAgICAgICAgICBsZWZFcnJvcigxNjYyLCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+YXJyYXlOYW1lKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPmFycmF5TmFtZSk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPmFycmF5TmFtZSk7Ci0gICAgICB9IGVsc2UKLSAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5hcnJheU5hbWUpOwotICAgIH0KLQotYXJyYXlfcnVsZXM6Ci0gIC8vIGVtcHR5IAotICAgIHsgfQotICB8IGFycmF5X3J1bGVzIGFycmF5X3J1bGUKLSAgICB7IH0KLQotYXJyYXlfcnVsZToKLSAgc2l0ZV93b3JkIHsgaWYgKGxlZkNhbGxiYWNrcy0+QXJyYXlDYmspIGxlZkRhdGEtPmxlZnJEb1NpdGUgPSAxOyBsZWZEYXRhLT5sZWZEdW1iTW9kZSA9IDE7IH0KLSAgICBzaXRlUGF0dGVybiAgJzsnCi0gICAgewotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+QXJyYXlDYmspIHsKLSAgICAgICAgbGVmRGF0YS0+bGVmckFycmF5LmFkZFNpdGVQYXR0ZXJuKGxlZkRhdGEtPmxlZnJTaXRlUGF0dGVyblB0cik7Ci0gICAgICB9Ci0gICAgfQotICB8IEtfQ0FOUExBQ0Uge2xlZkRhdGEtPmxlZkR1bWJNb2RlID0gMTsgaWYgKGxlZkNhbGxiYWNrcy0+QXJyYXlDYmspIGxlZkRhdGEtPmxlZnJEb1NpdGUgPSAxOyB9Ci0gICAgc2l0ZVBhdHRlcm4gJzsnCi0gICAgewotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+QXJyYXlDYmspIHsKLSAgICAgICAgbGVmRGF0YS0+bGVmckFycmF5LmFkZENhblBsYWNlKGxlZkRhdGEtPmxlZnJTaXRlUGF0dGVyblB0cik7Ci0gICAgICB9Ci0gICAgfQotICB8IEtfQ0FOTk9UT0NDVVBZIHtsZWZEYXRhLT5sZWZEdW1iTW9kZSA9IDE7IGlmIChsZWZDYWxsYmFja3MtPkFycmF5Q2JrKSBsZWZEYXRhLT5sZWZyRG9TaXRlID0gMTsgfQotICAgIHNpdGVQYXR0ZXJuICc7JwotICAgIHsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkFycmF5Q2JrKSB7Ci0gICAgICAgIGxlZkRhdGEtPmxlZnJBcnJheS5hZGRDYW5ub3RPY2N1cHkobGVmRGF0YS0+bGVmclNpdGVQYXR0ZXJuUHRyKTsKLSAgICAgIH0KLSAgICB9Ci0gIHwgS19UUkFDS1MgeyBpZiAobGVmQ2FsbGJhY2tzLT5BcnJheUNiaykgbGVmRGF0YS0+bGVmckRvVHJhY2sgPSAxOyB9IHRyYWNrUGF0dGVybiAnOycKLSAgICB7Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5BcnJheUNiaykgewotICAgICAgICBsZWZEYXRhLT5sZWZyQXJyYXkuYWRkVHJhY2sobGVmRGF0YS0+bGVmclRyYWNrUGF0dGVyblB0cik7Ci0gICAgICB9Ci0gICAgfQotICB8IGZsb29ycGxhbl9zdGFydCBmbG9vcnBsYW5fbGlzdCBLX0VORCBUX1NUUklORyAKLSAgICB7Ci0gICAgfQotICB8IEtfR0NFTExHUklEIHsgaWYgKGxlZkNhbGxiYWNrcy0+QXJyYXlDYmspIGxlZkRhdGEtPmxlZnJEb0djZWxsID0gMTsgfSBnY2VsbFBhdHRlcm4gJzsnCi0gICAgewotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+QXJyYXlDYmspIHsKLSAgICAgICAgbGVmRGF0YS0+bGVmckFycmF5LmFkZEdjZWxsKGxlZkRhdGEtPmxlZnJHY2VsbFBhdHRlcm5QdHIpOwotICAgICAgfQotICAgIH0KLSAgfCBLX0RFRkFVTFRDQVAgaW50X251bWJlciBjYXBfbGlzdCBLX0VORCBLX0RFRkFVTFRDQVAKLSAgICB7Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5BcnJheUNiaykgewotICAgICAgICBsZWZEYXRhLT5sZWZyQXJyYXkuc2V0VGFibGVTaXplKChpbnQpJDIpOwotICAgICAgfQotICAgIH0KLSAgfCBkZWZfc3RhdGVtZW50Ci0gICAgeyB9Ci0KLWZsb29ycGxhbl9zdGFydDogS19GTE9PUlBMQU4gVF9TVFJJTkcKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPkFycmF5Q2JrKSBsZWZEYXRhLT5sZWZyQXJyYXkuYWRkRmxvb3JQbGFuKCQyKTsgfQotICAgICAgICAKLWZsb29ycGxhbl9saXN0OgotICAvLyBlbXB0eSAKLSAgICB7IH0KLSAgfCBmbG9vcnBsYW5fbGlzdCBmbG9vcnBsYW5fZWxlbWVudAotICAgIHsgfQotCi1mbG9vcnBsYW5fZWxlbWVudDoKLSAgS19DQU5QTEFDRSB7IGxlZkRhdGEtPmxlZkR1bWJNb2RlID0gMTsgaWYgKGxlZkNhbGxiYWNrcy0+QXJyYXlDYmspIGxlZkRhdGEtPmxlZnJEb1NpdGUgPSAxOyB9Ci0gICAgc2l0ZVBhdHRlcm4gJzsnCi0gICAgewotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+QXJyYXlDYmspCi0gICAgICAgIGxlZkRhdGEtPmxlZnJBcnJheS5hZGRTaXRlVG9GbG9vclBsYW4oIkNBTlBMQUNFIiwKLSAgICAgICAgbGVmRGF0YS0+bGVmclNpdGVQYXR0ZXJuUHRyKTsKLSAgICB9Ci0gIHwgS19DQU5OT1RPQ0NVUFkgeyBpZiAobGVmQ2FsbGJhY2tzLT5BcnJheUNiaykgbGVmRGF0YS0+bGVmckRvU2l0ZSA9IDE7IGxlZkRhdGEtPmxlZkR1bWJNb2RlID0gMTsgfQotICAgIHNpdGVQYXR0ZXJuICc7JwotICAgIHsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkFycmF5Q2JrKQotICAgICAgICBsZWZEYXRhLT5sZWZyQXJyYXkuYWRkU2l0ZVRvRmxvb3JQbGFuKCJDQU5OT1RPQ0NVUFkiLAotICAgICAgICBsZWZEYXRhLT5sZWZyU2l0ZVBhdHRlcm5QdHIpOwotICAgICB9Ci0KLWNhcF9saXN0OgotICAvLyBlbXB0eSAKLSAgICB7IH0KLSAgfCBjYXBfbGlzdCBvbmVfY2FwCi0gICAgeyB9Ci0KLW9uZV9jYXA6IEtfTUlOUElOUyBpbnRfbnVtYmVyIEtfV0lSRUNBUCBpbnRfbnVtYmVyICc7JwotICAgIHsgaWYgKGxlZkNhbGxiYWNrcy0+QXJyYXlDYmspIGxlZkRhdGEtPmxlZnJBcnJheS5hZGREZWZhdWx0Q2FwKChpbnQpJDIsICQ0KTsgfQotCi1tc2dfc3RhdGVtZW50OgotICBLX01FU1NBR0Uge2xlZkRhdGEtPmxlZkR1bWJNb2RlPTE7bGVmRGF0YS0+bGVmTmxUb2tlbj1UUlVFO30gVF9TVFJJTkcgJz0nIHNfZXhwciBkdHJtCi0gICAgeyAgfQotCi1jcmVhdGVfZmlsZV9zdGF0ZW1lbnQ6Ci0gIEtfQ1JFQVRFRklMRSB7bGVmRGF0YS0+bGVmRHVtYk1vZGU9MTtsZWZEYXRhLT5sZWZObFRva2VuPVRSVUU7fSBUX1NUUklORyAnPScgc19leHByIGR0cm0KLSAgICB7IH0KLQotZGVmX3N0YXRlbWVudDoKLSAgS19ERUZJTkUge2xlZkRhdGEtPmxlZkR1bWJNb2RlPTE7bGVmRGF0YS0+bGVmTmxUb2tlbj1UUlVFO30gVF9TVFJJTkcgJz0nIGV4cHJlc3Npb24gZHRybQotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS42KQotICAgICAgICBsZWZBZGROdW1EZWZpbmUoJDMsICQ1KTsKLSAgICAgIGVsc2UKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+QXJyYXlDYmspIC8vIHdyaXRlIHdhcm5pbmcgb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+YXJyYXlXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkFycmF5V2FybmluZ3MpCi0gICAgICAgICAgICAgbGVmV2FybmluZygyMDY3LCAiREVGSU5FIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNiBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNiBvciBsYXRlci4iKTsKLSAgICB9Ci0gIHwgIEtfREVGSU5FUyB7bGVmRGF0YS0+bGVmRHVtYk1vZGU9MTtsZWZEYXRhLT5sZWZObFRva2VuPVRSVUU7fSBUX1NUUklORyAnPScgc19leHByIGR0cm0KLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNikKLSAgICAgICAgbGVmQWRkU3RyaW5nRGVmaW5lKCQzLCAkNSk7Ci0gICAgICBlbHNlCi0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkFycmF5Q2JrKSAvLyB3cml0ZSB3YXJuaW5nIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPmFycmF5V2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5BcnJheVdhcm5pbmdzKQotICAgICAgICAgICAgIGxlZldhcm5pbmcoMjA2OCwgIkRFRklORVMgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS42IG9yIGxhdGVyLiIpOwotICAgIH0KLSAgfCAgS19ERUZJTkVCIHtsZWZEYXRhLT5sZWZEdW1iTW9kZT0xO2xlZkRhdGEtPmxlZk5sVG9rZW49VFJVRTt9IFRfU1RSSU5HICc9JyBiX2V4cHIgZHRybQotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS42KQotICAgICAgICBsZWZBZGRCb29sZWFuRGVmaW5lKCQzLCAkNSk7Ci0gICAgICBlbHNlCi0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkFycmF5Q2JrKSAvLyB3cml0ZSB3YXJuaW5nIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPmFycmF5V2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5BcnJheVdhcm5pbmdzKQotICAgICAgICAgICAgIGxlZldhcm5pbmcoMjA2OSwgIkRFRklORUIgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS42IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS42IG9yIGxhdGVyLiIpOwotICAgIH0KLQotLy8gdGVybWluYXRvciBmb3IgJmRlZmluZXMuICBDYW4gYmUgc2VtaWNvbG9uIG9yIG5ld2xpbmUgCi1kdHJtOgotICB8ICAnOycge2xlZkRhdGEtPmxlZk5sVG9rZW4gPSBGQUxTRTt9Ci0gIHwgICdcbicgICAgICAgIHtsZWZEYXRhLT5sZWZObFRva2VuID0gRkFMU0U7fQotCi10aGVuOgotICBLX1RIRU4KLSAgfCAnXG4nIEtfVEhFTgotICA7Ci0KLWVsc2U6Ci0gIEtfRUxTRQotICB8ICdcbicgS19FTFNFCi0gIDsKLQotZXhwcmVzc2lvbjoKLSAgZXhwcmVzc2lvbiAnKycgZXhwcmVzc2lvbiAgICAgeyQkID0gJDEgKyAkMzsgfQotICB8IGV4cHJlc3Npb24gJy0nIGV4cHJlc3Npb24gICB7JCQgPSAkMSAtICQzOyB9Ci0gIHwgZXhwcmVzc2lvbiAnKicgZXhwcmVzc2lvbiAgIHskJCA9ICQxICogJDM7IH0KLSAgfCBleHByZXNzaW9uICcvJyBleHByZXNzaW9uICAgeyQkID0gJDEgLyAkMzsgfQotICB8ICctJyBleHByZXNzaW9uICVwcmVjIFVNSU5VUyB7JCQgPSAtJDI7fQotICB8ICcoJyBleHByZXNzaW9uICcpJyAgICAgICAgICB7JCQgPSAkMjt9Ci0gIHwgS19JRiBiX2V4cHIgdGhlbiBleHByZXNzaW9uIGVsc2UgZXhwcmVzc2lvbiAlcHJlYyBJRgotICAgICAgICAgICAgICAgIHskJCA9ICgkMiAhPSAwKSA/ICQ0IDogJDY7fQotICB8IGludF9udW1iZXIgICAgICAgICAgICAgICAgICAgICAgIHskJCA9ICQxO30KLQotYl9leHByOgotICBleHByZXNzaW9uIHJlbG9wIGV4cHJlc3Npb24geyQkID0gY29tcF9udW0oJDEsJDIsJDMpO30KLSAgfCBleHByZXNzaW9uIEtfQU5EIGV4cHJlc3Npb24geyQkID0gJDEgIT0gMCAmJiAkMyAhPSAwO30KLSAgfCBleHByZXNzaW9uIEtfT1IgIGV4cHJlc3Npb24geyQkID0gJDEgIT0gMCB8fCAkMyAhPSAwO30KLSAgfCBzX2V4cHIgcmVsb3Agc19leHByICAgICAgIHskJCA9IGNvbXBfc3RyKCQxLCQyLCQzKTt9Ci0gIHwgc19leHByIEtfQU5EIHNfZXhwciAgICAgICB7JCQgPSAkMVswXSAhPSAwICYmICQzWzBdICE9IDA7fQotICB8IHNfZXhwciBLX09SICBzX2V4cHIgICAgICAgeyQkID0gJDFbMF0gIT0gMCB8fCAkM1swXSAhPSAwO30KLSAgfCBiX2V4cHIgS19FUSBiX2V4cHIgICAgICAgIHskJCA9ICQxID09ICQzO30KLSAgfCBiX2V4cHIgS19ORSBiX2V4cHIgICAgICAgIHskJCA9ICQxICE9ICQzO30KLSAgfCBiX2V4cHIgS19BTkQgYl9leHByICAgICAgIHskJCA9ICQxICYmICQzO30KLSAgfCBiX2V4cHIgS19PUiAgYl9leHByICAgICAgIHskJCA9ICQxIHx8ICQzO30KLSAgfCBLX05PVCBiX2V4cHIgICAgICAgICAgICAgICAgICAgICVwcmVjIExOT1QgeyQkID0gISQkO30KLSAgfCAnKCcgYl9leHByICcpJyAgICAgICAgICAgIHskJCA9ICQyO30KLSAgfCBLX0lGIGJfZXhwciB0aGVuIGJfZXhwciBlbHNlIGJfZXhwciAlcHJlYyBJRgotICAgICAgICB7JCQgPSAoJDIgIT0gMCkgPyAkNCA6ICQ2O30KLSAgfCBLX1RSVUUgICAgICAgICAgICAgICAgICAgIHskJCA9IDE7fQotICB8IEtfRkFMU0UgICAgICAgICAgICAgICAgICAgeyQkID0gMDt9Ci0KLXNfZXhwcjoKLSAgc19leHByICcrJyBzX2V4cHIKLSAgICB7Ci0gICAgICAkJCA9IChjaGFyKilsZWZNYWxsb2Moc3RybGVuKCQxKStzdHJsZW4oJDMpKzEpOwotICAgICAgc3RyY3B5KCQkLCQxKTsKLSAgICAgIHN0cmNhdCgkJCwkMyk7Ci0gICAgfQotICB8ICcoJyBzX2V4cHIgJyknCi0gICAgeyAkJCA9ICQyOyB9Ci0gIHwgS19JRiBiX2V4cHIgdGhlbiBzX2V4cHIgZWxzZSBzX2V4cHIgJXByZWMgSUYKLSAgICB7Ci0gICAgICBsZWZEYXRhLT5sZWZEZWZJZiA9IFRSVUU7Ci0gICAgICBpZiAoJDIgIT0gMCkgewotICAgICAgICAkJCA9ICQ0OyAgICAgICAgCi0gICAgICB9IGVsc2UgewotICAgICAgICAkJCA9ICQ2OwotICAgICAgfQotICAgIH0KLSAgfCBRU1RSSU5HCi0gICAgeyAkJCA9ICQxOyB9Ci0KLXJlbG9wOgotICBLX0xFIHskJCA9IENfTEU7fQotICB8IEtfTFQgeyQkID0gQ19MVDt9Ci0gIHwgS19HRSB7JCQgPSBDX0dFO30KLSAgfCBLX0dUIHskJCA9IENfR1Q7fQotICB8IEtfRVEgeyQkID0gQ19FUTt9Ci0gIHwgS19ORSB7JCQgPSBDX05FO30KLSAgfCAnPScgIHskJCA9IENfRVE7fQotICB8ICc8JyAgeyQkID0gQ19MVDt9Ci0gIHwgJz4nICB7JCQgPSBDX0dUO30KLQotCi1wcm9wX2RlZl9zZWN0aW9uOiBLX1BST1BERUYKLSAgICB7IAotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UHJvcEJlZ2luQ2JrKQotICAgICAgICBDQUxMQkFDSyhsZWZDYWxsYmFja3MtPlByb3BCZWdpbkNiaywgbGVmclByb3BCZWdpbkNia1R5cGUsIDApOwotICAgIH0KLSAgICBwcm9wX3N0bXRzIEtfRU5EIEtfUFJPUERFRgotICAgIHsgCi0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5Qcm9wRW5kQ2JrKQotICAgICAgICBDQUxMQkFDSyhsZWZDYWxsYmFja3MtPlByb3BFbmRDYmssIGxlZnJQcm9wRW5kQ2JrVHlwZSwgMCk7Ci0gICAgfQotCi1wcm9wX3N0bXRzOgotICAvLyBlbXB0eSAKLSAgICB7IH0KLSAgfCBwcm9wX3N0bXRzIHByb3Bfc3RtdAotICAgIHsgfQotCi1wcm9wX3N0bXQ6Ci0gIEtfTElCUkFSWSB7bGVmRGF0YS0+bGVmRHVtYk1vZGUgPSAxOyBsZWZEYXRhLT5sZWZyUHJvcC5jbGVhcigpOyB9Ci0gICAgVF9TVFJJTkcgcHJvcF9kZWZpbmUgJzsnCi0gICAgeyAKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPlByb3BDYmspIHsKLSAgICAgICAgbGVmRGF0YS0+bGVmclByb3Auc2V0UHJvcFR5cGUoImxpYnJhcnkiLCAkMyk7Ci0gICAgICAgIENBTExCQUNLKGxlZkNhbGxiYWNrcy0+UHJvcENiaywgbGVmclByb3BDYmtUeXBlLCAmbGVmRGF0YS0+bGVmclByb3ApOwotICAgICAgfQotICAgICAgbGVmU2V0dGluZ3MtPmxlZlByb3BzLmxlZnJMaWJQcm9wLnNldFByb3BUeXBlKCQzLCBsZWZEYXRhLT5sZWZQcm9wRGVmVHlwZSk7Ci0gICAgfQotICB8IEtfQ09NUE9ORU5UUElOIHtsZWZEYXRhLT5sZWZEdW1iTW9kZSA9IDE7IGxlZkRhdGEtPmxlZnJQcm9wLmNsZWFyKCk7IH0KLSAgICBUX1NUUklORyBwcm9wX2RlZmluZSAnOycKLSAgICB7IAotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UHJvcENiaykgewotICAgICAgICBsZWZEYXRhLT5sZWZyUHJvcC5zZXRQcm9wVHlwZSgiY29tcG9uZW50cGluIiwgJDMpOwotICAgICAgICBDQUxMQkFDSyhsZWZDYWxsYmFja3MtPlByb3BDYmssIGxlZnJQcm9wQ2JrVHlwZSwgJmxlZkRhdGEtPmxlZnJQcm9wKTsKLSAgICAgIH0KLSAgICAgIGxlZlNldHRpbmdzLT5sZWZQcm9wcy5sZWZyQ29tcFByb3Auc2V0UHJvcFR5cGUoJDMsIGxlZkRhdGEtPmxlZlByb3BEZWZUeXBlKTsKLSAgICB9Ci0gIHwgS19QSU4ge2xlZkRhdGEtPmxlZkR1bWJNb2RlID0gMTsgbGVmRGF0YS0+bGVmclByb3AuY2xlYXIoKTsgfQotICAgIFRfU1RSSU5HIHByb3BfZGVmaW5lICc7JwotICAgIHsgCi0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5Qcm9wQ2JrKSB7Ci0gICAgICAgIGxlZkRhdGEtPmxlZnJQcm9wLnNldFByb3BUeXBlKCJwaW4iLCAkMyk7Ci0gICAgICAgIENBTExCQUNLKGxlZkNhbGxiYWNrcy0+UHJvcENiaywgbGVmclByb3BDYmtUeXBlLCAmbGVmRGF0YS0+bGVmclByb3ApOwotICAgICAgfQotICAgICAgbGVmU2V0dGluZ3MtPmxlZlByb3BzLmxlZnJQaW5Qcm9wLnNldFByb3BUeXBlKCQzLCBsZWZEYXRhLT5sZWZQcm9wRGVmVHlwZSk7Ci0gICAgICAKLSAgICB9Ci0gIHwgS19NQUNSTyB7bGVmRGF0YS0+bGVmRHVtYk1vZGUgPSAxOyBsZWZEYXRhLT5sZWZyUHJvcC5jbGVhcigpOyB9Ci0gICAgVF9TVFJJTkcgcHJvcF9kZWZpbmUgJzsnCi0gICAgeyAKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPlByb3BDYmspIHsKLSAgICAgICAgbGVmRGF0YS0+bGVmclByb3Auc2V0UHJvcFR5cGUoIm1hY3JvIiwgJDMpOwotICAgICAgICBDQUxMQkFDSyhsZWZDYWxsYmFja3MtPlByb3BDYmssIGxlZnJQcm9wQ2JrVHlwZSwgJmxlZkRhdGEtPmxlZnJQcm9wKTsKLSAgICAgIH0KLSAgICAgIGxlZlNldHRpbmdzLT5sZWZQcm9wcy5sZWZyTWFjcm9Qcm9wLnNldFByb3BUeXBlKCQzLCBsZWZEYXRhLT5sZWZQcm9wRGVmVHlwZSk7Ci0gICAgfQotICB8IEtfVklBIHtsZWZEYXRhLT5sZWZEdW1iTW9kZSA9IDE7IGxlZkRhdGEtPmxlZnJQcm9wLmNsZWFyKCk7IH0KLSAgICBUX1NUUklORyBwcm9wX2RlZmluZSAnOycKLSAgICB7IAotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UHJvcENiaykgewotICAgICAgICBsZWZEYXRhLT5sZWZyUHJvcC5zZXRQcm9wVHlwZSgidmlhIiwgJDMpOwotICAgICAgICBDQUxMQkFDSyhsZWZDYWxsYmFja3MtPlByb3BDYmssIGxlZnJQcm9wQ2JrVHlwZSwgJmxlZkRhdGEtPmxlZnJQcm9wKTsKLSAgICAgIH0KLSAgICAgIGxlZlNldHRpbmdzLT5sZWZQcm9wcy5sZWZyVmlhUHJvcC5zZXRQcm9wVHlwZSgkMywgbGVmRGF0YS0+bGVmUHJvcERlZlR5cGUpOwotICAgIH0KLSAgfCBLX1ZJQVJVTEUge2xlZkRhdGEtPmxlZkR1bWJNb2RlID0gMTsgbGVmRGF0YS0+bGVmclByb3AuY2xlYXIoKTsgfQotICAgIFRfU1RSSU5HIHByb3BfZGVmaW5lICc7JwotICAgIHsgCi0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5Qcm9wQ2JrKSB7Ci0gICAgICAgIGxlZkRhdGEtPmxlZnJQcm9wLnNldFByb3BUeXBlKCJ2aWFydWxlIiwgJDMpOwotICAgICAgICBDQUxMQkFDSyhsZWZDYWxsYmFja3MtPlByb3BDYmssIGxlZnJQcm9wQ2JrVHlwZSwgJmxlZkRhdGEtPmxlZnJQcm9wKTsKLSAgICAgIH0KLSAgICAgIGxlZlNldHRpbmdzLT5sZWZQcm9wcy5sZWZyVmlhUnVsZVByb3Auc2V0UHJvcFR5cGUoJDMsIGxlZkRhdGEtPmxlZlByb3BEZWZUeXBlKTsKLSAgICB9Ci0gIHwgS19MQVlFUiB7bGVmRGF0YS0+bGVmRHVtYk1vZGUgPSAxOyBsZWZEYXRhLT5sZWZyUHJvcC5jbGVhcigpOyB9Ci0gICAgVF9TVFJJTkcgcHJvcF9kZWZpbmUgJzsnCi0gICAgeyAKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPlByb3BDYmspIHsKLSAgICAgICAgbGVmRGF0YS0+bGVmclByb3Auc2V0UHJvcFR5cGUoImxheWVyIiwgJDMpOwotICAgICAgICBDQUxMQkFDSyhsZWZDYWxsYmFja3MtPlByb3BDYmssIGxlZnJQcm9wQ2JrVHlwZSwgJmxlZkRhdGEtPmxlZnJQcm9wKTsKLSAgICAgIH0KLSAgICAgIGxlZlNldHRpbmdzLT5sZWZQcm9wcy5sZWZyTGF5ZXJQcm9wLnNldFByb3BUeXBlKCQzLCBsZWZEYXRhLT5sZWZQcm9wRGVmVHlwZSk7Ci0gICAgfQotICB8IEtfTk9OREVGQVVMVFJVTEUge2xlZkRhdGEtPmxlZkR1bWJNb2RlID0gMTsgbGVmRGF0YS0+bGVmclByb3AuY2xlYXIoKTsgfQotICAgIFRfU1RSSU5HIHByb3BfZGVmaW5lICc7JwotICAgIHsgCi0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5Qcm9wQ2JrKSB7Ci0gICAgICAgIGxlZkRhdGEtPmxlZnJQcm9wLnNldFByb3BUeXBlKCJub25kZWZhdWx0cnVsZSIsICQzKTsKLSAgICAgICAgQ0FMTEJBQ0sobGVmQ2FsbGJhY2tzLT5Qcm9wQ2JrLCBsZWZyUHJvcENia1R5cGUsICZsZWZEYXRhLT5sZWZyUHJvcCk7Ci0gICAgICB9Ci0gICAgICBsZWZTZXR0aW5ncy0+bGVmUHJvcHMubGVmck5vbmRlZlByb3Auc2V0UHJvcFR5cGUoJDMsIGxlZkRhdGEtPmxlZlByb3BEZWZUeXBlKTsKLSAgICB9Ci0gICAgCi1wcm9wX2RlZmluZToKLSAgS19JTlRFR0VSICBvcHRfZGVmX3JhbmdlIG9wdF9kZWZfZHZhbHVlIAotICAgIHsgCi0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5Qcm9wQ2JrKSBsZWZEYXRhLT5sZWZyUHJvcC5zZXRQcm9wSW50ZWdlcigpOwotICAgICAgbGVmRGF0YS0+bGVmUHJvcERlZlR5cGUgPSAnSSc7Ci0gICAgfQotICB8IEtfUkVBTCBvcHRfZGVmX3JhbmdlIG9wdF9kZWZfdmFsdWUKLSAgICB7IAotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UHJvcENiaykgbGVmRGF0YS0+bGVmclByb3Auc2V0UHJvcFJlYWwoKTsKLSAgICAgIGxlZkRhdGEtPmxlZlByb3BEZWZUeXBlID0gJ1InOwotICAgIH0KLSAgfCBLX1NUUklORwotICAgIHsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPlByb3BDYmspIGxlZkRhdGEtPmxlZnJQcm9wLnNldFByb3BTdHJpbmcoKTsKLSAgICAgIGxlZkRhdGEtPmxlZlByb3BEZWZUeXBlID0gJ1MnOwotICAgIH0KLSAgfCBLX1NUUklORyBRU1RSSU5HCi0gICAgewotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+UHJvcENiaykgbGVmRGF0YS0+bGVmclByb3Auc2V0UHJvcFFTdHJpbmcoJDIpOwotICAgICAgbGVmRGF0YS0+bGVmUHJvcERlZlR5cGUgPSAnUSc7Ci0gICAgfQotICB8IEtfTkFNRU1BUFNUUklORyBUX1NUUklORwotICAgIHsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPlByb3BDYmspIGxlZkRhdGEtPmxlZnJQcm9wLnNldFByb3BOYW1lTWFwU3RyaW5nKCQyKTsKLSAgICAgIGxlZkRhdGEtPmxlZlByb3BEZWZUeXBlID0gJ1MnOwotICAgIH0KLQotb3B0X3JhbmdlX3NlY29uZDoKLSAgLy8gbm90aGluZyAKLSAgICB7IH0KLSAgfCBLX1VTRUxFTkdUSFRIUkVTSE9MRAotICAgIHsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKQotICAgICAgICBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0U3BhY2luZ1JhbmdlVXNlTGVuZ3RoKCk7Ci0gICAgfQotICB8IEtfSU5GTFVFTkNFIGludF9udW1iZXIKLSAgICB7Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgewotICAgICAgICBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0U3BhY2luZ1JhbmdlSW5mbHVlbmNlKCQyKTsKLSAgICAgICAgbGVmRGF0YS0+bGVmckxheWVyLnNldFNwYWNpbmdSYW5nZUluZmx1ZW5jZVJhbmdlKC0xLCAtMSk7Ci0gICAgICB9Ci0gICAgfQotICB8IEtfSU5GTFVFTkNFIGludF9udW1iZXIgS19SQU5HRSBpbnRfbnVtYmVyIGludF9udW1iZXIKLSAgICB7Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgewotICAgICAgICBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0U3BhY2luZ1JhbmdlSW5mbHVlbmNlKCQyKTsKLSAgICAgICAgbGVmRGF0YS0+bGVmckxheWVyLnNldFNwYWNpbmdSYW5nZUluZmx1ZW5jZVJhbmdlKCQ0LCAkNSk7Ci0gICAgICB9Ci0gICAgfQotICB8IEtfUkFOR0UgaW50X251bWJlciBpbnRfbnVtYmVyCi0gICAgewotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspCi0gICAgICAgIGxlZkRhdGEtPmxlZnJMYXllci5zZXRTcGFjaW5nUmFuZ2VSYW5nZSgkMiwgJDMpOwotICAgIH0KLQotb3B0X2VuZG9mbGluZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNyAKLSAgLy8gbm90aGluZyAKLSAgICB7IH0KLSAgfCBLX1BBUkFMTEVMRURHRSBpbnRfbnVtYmVyIEtfV0lUSElOIGludF9udW1iZXIKLSAgICB7Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykKLSAgICAgICAgbGVmRGF0YS0+bGVmckxheWVyLnNldFNwYWNpbmdQYXJTVygkMiwgJDQpOwotICAgIH0KLSAgICBvcHRfZW5kb2ZsaW5lX3R3b2VkZ2VzCi0KLW9wdF9lbmRvZmxpbmVfdHdvZWRnZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjcgCi0gIC8vIG5vdGhpbmcgCi0gICAgeyB9Ci0gIHwgS19UV09FREdFUwotICAgIHsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKQotICAgICAgICBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0U3BhY2luZ1BhclR3b0VkZ2VzKCk7Ci0gICAgfQotCi1vcHRfc2FtZW5ldFBHb25seTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS43IAotICAvLyBub3RoaW5nIAotICAgIHsgfQotICB8IEtfUEdPTkxZCi0gICAgewotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspCi0gICAgICAgIGxlZkRhdGEtPmxlZnJMYXllci5zZXRTcGFjaW5nU2FtZW5ldFBHb25seSgpOwotICAgIH0KLQotb3B0X2RlZl9yYW5nZToKLSAgLy8gbm90aGluZyAKLSAgICB7IH0KLSAgfCBLX1JBTkdFIGludF9udW1iZXIgaW50X251bWJlcgotICAgIHsgIGlmIChsZWZDYWxsYmFja3MtPlByb3BDYmspIGxlZkRhdGEtPmxlZnJQcm9wLnNldFJhbmdlKCQyLCAkMyk7IH0KLQotb3B0X2RlZl92YWx1ZToKLSAgLy8gZW1wdHkgCi0gICAgeyB9Ci0gIHwgTlVNQkVSCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5Qcm9wQ2JrKSBsZWZEYXRhLT5sZWZyUHJvcC5zZXROdW1iZXIoJDEpOyB9Ci0KLW9wdF9kZWZfZHZhbHVlOgotICAvLyBlbXB0eSAKLSAgICB7IH0KLSAgfCBpbnRfbnVtYmVyCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5Qcm9wQ2JrKSBsZWZEYXRhLT5sZWZyUHJvcC5zZXROdW1iZXIoJDEpOyB9Ci0KLWxheWVyX3NwYWNpbmdfb3B0czoKLSAgLy8gZW1wdHkgCi0gIHwgbGF5ZXJfc3BhY2luZ19vcHQgbGF5ZXJfc3BhY2luZ19vcHRzCi0KLWxheWVyX3NwYWNpbmdfb3B0OiBLX0NFTlRFUlRPQ0VOVEVSICAgICAgLy8gNS43IAotICAgIHsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7Ci0gICAgICAgICBpZiAobGVmRGF0YS0+aGFzU3BDZW50ZXIpIHsKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE2NjMsICJBIENFTlRFUlRPQ0VOVEVSIHN0YXRlbWVudCB3YXMgYWxyZWFkeSBkZWZpbmVkIGluIFNQQUNJTkdcbkNFTlRFUlRPQ0VOVEVSIGNhbiBvbmx5IGJlIGRlZmluZWQgb25jZSBwZXIgTEFZRVIgQ1VUIFNQQUNJTkcuIik7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbGVmRGF0YS0+aGFzU3BDZW50ZXIgPSAxOwotICAgICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNikgewotICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgIkNFTlRFUlRPQ0VOVEVSIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS42IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICBsZWZFcnJvcigxNjY0LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspCi0gICAgICAgICAgbGVmRGF0YS0+bGVmckxheWVyLnNldFNwYWNpbmdDZW50ZXJUb0NlbnRlcigpOwotICAgICAgfQotICAgIH0KLSAgfCBLX1NBTUVORVQgICAgICAgICAgICAgLy8gNS43IAotICAgIHsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7Ci0gICAgICAgIGlmIChsZWZEYXRhLT5oYXNTcFNhbWVuZXQpIHsKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE2NjUsICJBIFNBTUVORVQgc3RhdGVtZW50IHdhcyBhbHJlYWR5IGRlZmluZWQgaW4gU1BBQ0lOR1xuU0FNRU5FVCBjYW4gb25seSBiZSBkZWZpbmVkIG9uY2UgcGVyIExBWUVSIENVVCBTUEFDSU5HLiIpOwotICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGxlZkRhdGEtPmhhc1NwU2FtZW5ldCA9IDE7Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKQotICAgICAgICAgIGxlZkRhdGEtPmxlZnJMYXllci5zZXRTcGFjaW5nU2FtZW5ldCgpOwotICAgICAgIH0KLSAgICB9Ci0gICAgb3B0X3NhbWVuZXRQR29ubHkKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNykgewotICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgc3ByaW50ZihsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgIlNBTUVORVQgaXMgYSB2ZXJzaW9uIDUuNyBvciBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICBsZWZFcnJvcigxNjg0LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgIENIS0VSUigpOwotICAgICAgfQotICAgIH0KLSAgfCBLX1BBUkFMTEVMT1ZFUkxBUCAgICAvLyA1LjcgCi0gICAgewotICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjcpIHsKLSAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgIHNwcmludGYobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICJQQVJBTExFTE9WRVJMQVAgaXMgYSB2ZXJzaW9uIDUuNyBvciBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICBsZWZFcnJvcigxNjgwLCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgIENIS0VSUigpOyAKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKSB7Ci0gICAgICAgICAgaWYgKGxlZkRhdGEtPmhhc1NwUGFyYWxsZWwpIHsKLSAgICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgICBsZWZFcnJvcigxNjY2LCAiQSBQQVJBTExFTE9WRVJMQVAgc3RhdGVtZW50IHdhcyBhbHJlYWR5IGRlZmluZWQgaW4gU1BBQ0lOR1xuUEFSQUxMRUxPVkVSTEFQIGNhbiBvbmx5IGJlIGRlZmluZWQgb25jZSBwZXIgTEFZRVIgQ1VUIFNQQUNJTkcuIik7Ci0gICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBsZWZEYXRhLT5oYXNTcFBhcmFsbGVsID0gMTsKLSAgICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykKLSAgICAgICAgICAgIGxlZkRhdGEtPmxlZnJMYXllci5zZXRTcGFjaW5nUGFyYWxsZWxPdmVybGFwKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLWxheWVyX3NwYWNpbmdfY3V0X3JvdXRpbmc6Ci0gIC8vIGVtcHR5IAotICB8IEtfTEFZRVIge2xlZkRhdGEtPmxlZkR1bWJNb2RlID0gMTsgbGVmRGF0YS0+bGVmTm9OdW0gPSAxOyB9IFRfU1RSSU5HCi0gICAgewotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspCi17Ci0gICAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS43KSB7Ci0gICAgICAgICAgIGlmIChsZWZEYXRhLT5oYXNTcFNhbWVuZXQpIHsgICAgLy8gNS42IGFuZCBlYXJsaWVyIGRvZXMgbm90IGFsbG93IAotICAgICAgICAgICAgICBpZiAobGVmRGF0YS0+bGF5ZXJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkxheWVyV2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgICAgbGVmRXJyb3IoMTY2NywgIkEgU0FNRU5FVCBzdGF0ZW1lbnQgd2FzIGFscmVhZHkgZGVmaW5lZCBpbiBTUEFDSU5HXG5FaXRoZXIgU0FNRU5FVCBvciBMQVlFUiBjYW4gYmUgZGVmaW5lZCwgYnV0IG5vdCBib3RoLiIpOwotICAgICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbGVmRGF0YS0+bGVmckxheWVyLnNldFNwYWNpbmdOYW1lKCQzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc3BhY2luZ19jdXRfbGF5ZXJfb3B0Ci0gIHwgS19BREpBQ0VOVENVVFMgaW50X251bWJlciBLX1dJVEhJTiBpbnRfbnVtYmVyCi0gICAgewotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsKLSAgICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjUpIHsKLSAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAgICJBREpBQ0VOVENVVFMgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjUgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgIGxlZkVycm9yKDE2NjgsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNykgewotICAgICAgICAgICBpZiAobGVmRGF0YS0+aGFzU3BTYW1lbmV0KSB7ICAgIC8vIDUuNiBhbmQgZWFybGllciBkb2VzIG5vdCBhbGxvdyAKLSAgICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICAgIGxlZkVycm9yKDE2NjksICJBIFNBTUVORVQgc3RhdGVtZW50IHdhcyBhbHJlYWR5IGRlZmluZWQgaW4gU1BBQ0lOR1xuRWl0aGVyIFNBTUVORVQgb3IgQURKQUNFTlRDVVRTIGNhbiBiZSBkZWZpbmVkLCBidXQgbm90IGJvdGguIik7Ci0gICAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0U3BhY2luZ0FkamFjZW50KChpbnQpJDIsICQ0KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgb3B0X2FkamFjZW50Y3V0c19leGNlcHRzYW1lCi0gIHwgS19BUkVBIE5VTUJFUiAgICAgICAgLy8gNS43IAotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS43KSB7Ci0gICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICBzcHJpbnRmKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAiQVJFQSBpcyBhIHZlcnNpb24gNS43IG9yIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgIGxlZkVycm9yKDE2OTMsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykgewotICAgICAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS43KSB7Ci0gICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmhhc1NwU2FtZW5ldCkgeyAgICAvLyA1LjYgYW5kIGVhcmxpZXIgZG9lcyBub3QgYWxsb3cgCi0gICAgICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxheWVyV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzKSB7Ci0gICAgICAgICAgICAgICAgICAgbGVmRXJyb3IoMTY3MCwgIkEgU0FNRU5FVCBzdGF0ZW1lbnQgd2FzIGFscmVhZHkgZGVmaW5lZCBpbiBTUEFDSU5HXG5FaXRoZXIgU0FNRU5FVCBvciBBUkVBIGNhbiBiZSBkZWZpbmVkLCBidXQgbm90IGJvdGguIik7Ci0gICAgICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgbGVmRGF0YS0+bGVmckxheWVyLnNldFNwYWNpbmdBcmVhKCQyKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfCBLX1JBTkdFIGludF9udW1iZXIgaW50X251bWJlcgotICAgIHsKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKQotICAgICAgICBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0U3BhY2luZ1JhbmdlKCQyLCAkMyk7Ci0gICAgfQotICAgIG9wdF9yYW5nZV9zZWNvbmQKLSAgfCBLX0xFTkdUSFRIUkVTSE9MRCBpbnRfbnVtYmVyCi0gICAgewotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsKLSAgICAgICAgbGVmRGF0YS0+bGVmckxheWVyLnNldFNwYWNpbmdMZW5ndGgoJDIpOwotICAgICAgfQotICAgIH0KLSAgfCBLX0xFTkdUSFRIUkVTSE9MRCBpbnRfbnVtYmVyIEtfUkFOR0UgaW50X251bWJlciBpbnRfbnVtYmVyCi0gICAgewotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspIHsKLSAgICAgICAgbGVmRGF0YS0+bGVmckxheWVyLnNldFNwYWNpbmdMZW5ndGgoJDIpOwotICAgICAgICBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0U3BhY2luZ0xlbmd0aFJhbmdlKCQ0LCAkNSk7Ci0gICAgICB9Ci0gICAgfQotICB8IEtfRU5ET0ZMSU5FIGludF9udW1iZXIgS19XSVRISU4gaW50X251bWJlciAgICAvLyA1LjcgCi0gICAgewotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspCi0gICAgICAgIGxlZkRhdGEtPmxlZnJMYXllci5zZXRTcGFjaW5nRW9sKCQyLCAkNCk7Ci0gICAgfQotICAgIG9wdF9lbmRvZmxpbmUKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNykgewotICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgc3ByaW50ZihsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgIkVORE9GTElORSBpcyBhIHZlcnNpb24gNS43IG9yIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgIGxlZkVycm9yKDE2ODEsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICB9Ci0gICAgfQotICB8IEtfTk9UQ0hMRU5HVEggaW50X251bWJlciAgICAgIC8vIDUuNyAKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNykgewotICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgc3ByaW50ZihsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgIk5PVENITEVOR1RIIGlzIGEgdmVyc2lvbiA1Ljcgb3IgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSBpcyBkZWZpbmVkIHdpdGggdmVyc2lvbiAlZy4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgbGVmRXJyb3IoMTY4MiwgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICBDSEtFUlIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrKQotICAgICAgICAgIGxlZkRhdGEtPmxlZnJMYXllci5zZXRTcGFjaW5nTm90Y2hMZW5ndGgoJDIpOwotICAgICAgfQotICAgIH0KLSAgfCBLX0VORE9GTk9UQ0hXSURUSCBpbnRfbnVtYmVyIEtfTk9UQ0hTUEFDSU5HIGludF9udW1iZXIgS19OT1RDSExFTkdUSCBpbnRfbnVtYmVyIC8vNS43Ci0gICAgewotICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjcpIHsKLSAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgIHNwcmludGYobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICJFTkRPRk5PVENIV0lEVEggaXMgYSB2ZXJzaW9uIDUuNyBvciBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICBsZWZFcnJvcigxNjk2LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgIENIS0VSUigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspCi0gICAgICAgICAgbGVmRGF0YS0+bGVmckxheWVyLnNldFNwYWNpbmdFbmRPZk5vdGNoV2lkdGgoJDIsICQ0LCAkNik7Ci0gICAgICB9Ci0gICAgfQotCi1zcGFjaW5nX2N1dF9sYXllcl9vcHQ6ICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNyAKLSAgLy8gZW1wdHkgCi0gICAge30KLSAgfCBLX1NUQUNLCi0gICAgewotICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmspCi0gICAgICAgIGxlZkRhdGEtPmxlZnJMYXllci5zZXRTcGFjaW5nTGF5ZXJTdGFjaygpOwotICAgIH0KLQotb3B0X2FkamFjZW50Y3V0c19leGNlcHRzYW1lOiAgICAgICAgICAgICAgICAvLyA1LjcgCi0gIC8vIGVtcHR5IAotICAgIHt9Ci0gIHwgS19FWENFUFRTQU1FUEdORVQKLSAgICB7Ci0gICAgICBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA8IDUuNykgewotICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgc3ByaW50ZihsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgIkVYQ0VQVFNBTUVQR05FVCBpcyBhIHZlcnNpb24gNS43IG9yIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgIGxlZkVycm9yKDE2ODMsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5MYXllckNiaykKLSAgICAgICAgICBsZWZEYXRhLT5sZWZyTGF5ZXIuc2V0U3BhY2luZ0FkamFjZW50RXhjZXB0KCk7Ci0gICAgICB9Ci0gICAgfQotCi1vcHRfbGF5ZXJfbmFtZToKLSAgLy8gZW1wdHkgCi0gICAgeyAkJCA9IDA7IH0KLSAgfCBLX0xBWUVSIHtsZWZEYXRhLT5sZWZEdW1iTW9kZSA9IDE7IGxlZkRhdGEtPmxlZk5vTnVtID0gMTsgfSBUX1NUUklORwotICAgIHsgJCQgPSAkMzsgfQotCi1yZXFfbGF5ZXJfbmFtZToKLSAgLy8gcGNyIDM1NTMxMyAKLSAgIEtfTEFZRVIge2xlZkRhdGEtPmxlZkR1bWJNb2RlID0gMTsgbGVmRGF0YS0+bGVmTm9OdW0gPSAxOyB9IFRfU1RSSU5HCi0gICAgeyAkJCA9ICQzOyB9Ci0KLS8vIDkvMTEvMjAwMSAtIFdhbmRhIGRhIFJvc2EuICBUaGUgZm9sbG93aW5nIGFyZSBvYnNvbGV0ZSBpbiA1LjQgCi11bml2ZXJzYWxub2lzZW1hcmdpbjogS19VTklWRVJTQUxOT0lTRU1BUkdJTiBpbnRfbnVtYmVyIGludF9udW1iZXIgJzsnCi0gICAgewotICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjQpIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+Tm9pc2VNYXJnaW5DYmspIHsKLSAgICAgICAgICBsZWZEYXRhLT5sZWZyTm9pc2VNYXJnaW4ubG93ID0gJDI7Ci0gICAgICAgICAgbGVmRGF0YS0+bGVmck5vaXNlTWFyZ2luLmhpZ2ggPSAkMzsKLSAgICAgICAgICBDQUxMQkFDSyhsZWZDYWxsYmFja3MtPk5vaXNlTWFyZ2luQ2JrLCBsZWZyTm9pc2VNYXJnaW5DYmtUeXBlLCAmbGVmRGF0YS0+bGVmck5vaXNlTWFyZ2luKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlCi0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPk5vaXNlTWFyZ2luQ2JrKSAvLyB3cml0ZSB3YXJuaW5nIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICBpZiAobGVmRGF0YS0+bm9pc2VNYXJnaW5XYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPk5vaXNlTWFyZ2luV2FybmluZ3MpCi0gICAgICAgICAgICBsZWZXYXJuaW5nKDIwNzAsICJVTklWRVJTQUxOT0lTRU1BUkdJTiBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIik7Ci0gICAgfQotCi1lZGdlcmF0ZXRocmVzaG9sZDE6IEtfRURHRVJBVEVUSFJFU0hPTEQxIGludF9udW1iZXIgJzsnCi0gICAgewotICAgICAgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjQpIHsKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+RWRnZVJhdGVUaHJlc2hvbGQxQ2JrKSB7Ci0gICAgICAgICAgQ0FMTEJBQ0sobGVmQ2FsbGJhY2tzLT5FZGdlUmF0ZVRocmVzaG9sZDFDYmssCi0gICAgICAgICAgbGVmckVkZ2VSYXRlVGhyZXNob2xkMUNia1R5cGUsICQyKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlCi0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkVkZ2VSYXRlVGhyZXNob2xkMUNiaykgLy8gd3JpdGUgd2FybmluZyBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgaWYgKGxlZkRhdGEtPmVkZ2VSYXRlVGhyZXNob2xkMVdhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+RWRnZVJhdGVUaHJlc2hvbGQxV2FybmluZ3MpCi0gICAgICAgICAgICBsZWZXYXJuaW5nKDIwNzEsICJFREdFUkFURVRIUkVTSE9MRDEgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS40IG9yIGxhdGVyLiIpOwotICAgIH0KLQotZWRnZXJhdGV0aHJlc2hvbGQyOiBLX0VER0VSQVRFVEhSRVNIT0xEMiBpbnRfbnVtYmVyICc7JwotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS40KSB7Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkVkZ2VSYXRlVGhyZXNob2xkMkNiaykgewotICAgICAgICAgIENBTExCQUNLKGxlZkNhbGxiYWNrcy0+RWRnZVJhdGVUaHJlc2hvbGQyQ2JrLAotICAgICAgICAgIGxlZnJFZGdlUmF0ZVRocmVzaG9sZDJDYmtUeXBlLCAkMik7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZQotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5FZGdlUmF0ZVRocmVzaG9sZDJDYmspIC8vIHdyaXRlIHdhcm5pbmcgb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgIGlmIChsZWZEYXRhLT5lZGdlUmF0ZVRocmVzaG9sZDJXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkVkZ2VSYXRlVGhyZXNob2xkMldhcm5pbmdzKQotICAgICAgICAgICAgbGVmV2FybmluZygyMDcyLCAiRURHRVJBVEVUSFJFU0hPTEQyIHN0YXRlbWVudCBpcyBvYnNvbGV0ZSBpbiB2ZXJzaW9uIDUuNCBhbmQgbGF0ZXIuXG5UaGUgTEVGIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIHN0YXRlbWVudC5cblRvIGF2b2lkIHRoaXMgd2FybmluZyBpbiB0aGUgZnV0dXJlLCByZW1vdmUgdGhpcyBzdGF0ZW1lbnQgZnJvbSB0aGUgTEVGIGZpbGUgd2l0aCB2ZXJzaW9uIDUuNCBvciBsYXRlci4iKTsKLSAgICB9Ci0KLWVkZ2VyYXRlc2NhbGVmYWN0b3I6IEtfRURHRVJBVEVTQ0FMRUZBQ1RPUiBpbnRfbnVtYmVyICc7JwotICAgIHsKLSAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS40KSB7Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkVkZ2VSYXRlU2NhbGVGYWN0b3JDYmspIHsKLSAgICAgICAgICBDQUxMQkFDSyhsZWZDYWxsYmFja3MtPkVkZ2VSYXRlU2NhbGVGYWN0b3JDYmssCi0gICAgICAgICAgbGVmckVkZ2VSYXRlU2NhbGVGYWN0b3JDYmtUeXBlLCAkMik7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZQotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5FZGdlUmF0ZVNjYWxlRmFjdG9yQ2JrKSAvLyB3cml0ZSB3YXJuaW5nIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICBpZiAobGVmRGF0YS0+ZWRnZVJhdGVTY2FsZUZhY3Rvcldhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+RWRnZVJhdGVTY2FsZUZhY3Rvcldhcm5pbmdzKQotICAgICAgICAgICAgbGVmV2FybmluZygyMDczLCAiRURHRVJBVEVTQ0FMRUZBQ1RPUiBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIik7Ci0gICAgfQotCi1ub2lzZXRhYmxlOiBLX05PSVNFVEFCTEUgaW50X251bWJlcgotICAgIHsgaWYgKGxlZkNhbGxiYWNrcy0+Tm9pc2VUYWJsZUNiaykgbGVmRGF0YS0+bGVmck5vaXNlVGFibGUuc2V0dXAoKGludCkkMik7IH0KLSAgICAnOycgbm9pc2VfdGFibGVfbGlzdCBlbmRfbm9pc2V0YWJsZSBkdHJtCi0gICAgeyB9Ci0KLWVuZF9ub2lzZXRhYmxlOgotICBLX0VORCBLX05PSVNFVEFCTEUKLSAgewotICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS40KSB7Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5Ob2lzZVRhYmxlQ2JrKQotICAgICAgICBDQUxMQkFDSyhsZWZDYWxsYmFja3MtPk5vaXNlVGFibGVDYmssIGxlZnJOb2lzZVRhYmxlQ2JrVHlwZSwgJmxlZkRhdGEtPmxlZnJOb2lzZVRhYmxlKTsKLSAgICB9IGVsc2UKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPk5vaXNlVGFibGVDYmspIC8vIHdyaXRlIHdhcm5pbmcgb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICBpZiAobGVmRGF0YS0+bm9pc2VUYWJsZVdhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+Tm9pc2VUYWJsZVdhcm5pbmdzKQotICAgICAgICAgIGxlZldhcm5pbmcoMjA3NCwgIk5PSVNFVEFCTEUgc3RhdGVtZW50IGlzIG9ic29sZXRlIGluIHZlcnNpb24gNS40IGFuZCBsYXRlci5cblRoZSBMRUYgcGFyc2VyIHdpbGwgaWdub3JlIHRoaXMgc3RhdGVtZW50LlxuVG8gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUsIHJlbW92ZSB0aGlzIHN0YXRlbWVudCBmcm9tIHRoZSBMRUYgZmlsZSB3aXRoIHZlcnNpb24gNS40IG9yIGxhdGVyLiIpOwotICB9Ci0KLQotbm9pc2VfdGFibGVfbGlzdCA6Ci0gIG5vaXNlX3RhYmxlX2VudHJ5Ci0gIHwgbm9pc2VfdGFibGVfbGlzdCBub2lzZV90YWJsZV9lbnRyeQotICA7Ci0KLW5vaXNlX3RhYmxlX2VudHJ5OgotICBLX0VER0VSQVRFIGludF9udW1iZXIgJzsnCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5Ob2lzZVRhYmxlQ2JrKQotICAgICAgICAgewotICAgICAgICAgICAgbGVmRGF0YS0+bGVmck5vaXNlVGFibGUubmV3RWRnZSgpOwotICAgICAgICAgICAgbGVmRGF0YS0+bGVmck5vaXNlVGFibGUuYWRkRWRnZSgkMik7Ci0gICAgICAgICB9Ci0gICAgfQotICB8IG91dHB1dF9yZXNpc3RhbmNlX2VudHJ5Ci0gICAgeyB9Ci0KLW91dHB1dF9yZXNpc3RhbmNlX2VudHJ5OiBLX09VVFBVVFJFU0lTVEFOQ0UKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPk5vaXNlVGFibGVDYmspIGxlZkRhdGEtPmxlZnJOb2lzZVRhYmxlLmFkZFJlc2lzdGFuY2UoKTsgfQotICAgIG51bV9saXN0ICc7JyB2aWN0aW1fbGlzdAotICAgIDsKLQotbnVtX2xpc3Q6Ci0gIGludF9udW1iZXIKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPk5vaXNlVGFibGVDYmspCi0gICAgbGVmRGF0YS0+bGVmck5vaXNlVGFibGUuYWRkUmVzaXN0YW5jZU51bWJlcigkMSk7IH0KLSAgIHwgbnVtX2xpc3QgaW50X251bWJlcgotICAgIHsgaWYgKGxlZkNhbGxiYWNrcy0+Tm9pc2VUYWJsZUNiaykKLSAgICBsZWZEYXRhLT5sZWZyTm9pc2VUYWJsZS5hZGRSZXNpc3RhbmNlTnVtYmVyKCQyKTsgfQotCi12aWN0aW1fbGlzdDoKLSAgdmljdGltCi0gIHwgdmljdGltX2xpc3QgdmljdGltCi0gIDsKLQotdmljdGltOiBLX1ZJQ1RJTUxFTkdUSCBpbnRfbnVtYmVyICc7JwotICAgICAgICB7IGlmIChsZWZDYWxsYmFja3MtPk5vaXNlVGFibGVDYmspCi0gICAgICAgIGxlZkRhdGEtPmxlZnJOb2lzZVRhYmxlLmFkZFZpY3RpbUxlbmd0aCgkMik7IH0KLSAgICAgIEtfVklDVElNTk9JU0Ugdm5vaXNlbGlzdCAnOycKLSAgICAgICAgeyB9Ci0KLXZub2lzZWxpc3Q6Ci0gIGludF9udW1iZXIKLSAgICB7IGlmIChsZWZDYWxsYmFja3MtPk5vaXNlVGFibGVDYmspCi0gICAgbGVmRGF0YS0+bGVmck5vaXNlVGFibGUuYWRkVmljdGltTm9pc2UoJDEpOyB9Ci0gIHwgdm5vaXNlbGlzdCBpbnRfbnVtYmVyCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5Ob2lzZVRhYmxlQ2JrKQotICAgIGxlZkRhdGEtPmxlZnJOb2lzZVRhYmxlLmFkZFZpY3RpbU5vaXNlKCQyKTsgfQotCi1jb3JyZWN0aW9udGFibGU6IEtfQ09SUkVDVElPTlRBQkxFIGludF9udW1iZXIgJzsnCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5Db3JyZWN0aW9uVGFibGVDYmspCi0gICAgbGVmRGF0YS0+bGVmckNvcnJlY3Rpb25UYWJsZS5zZXR1cCgoaW50KSQyKTsgfQotICAgIGNvcnJlY3Rpb25fdGFibGVfbGlzdCBlbmRfY29ycmVjdGlvbnRhYmxlIGR0cm0KLSAgICB7IH0KLQotZW5kX2NvcnJlY3Rpb250YWJsZToKLSAgS19FTkQgS19DT1JSRUNUSU9OVEFCTEUKLSAgewotICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS40KSB7Ci0gICAgICBpZiAobGVmQ2FsbGJhY2tzLT5Db3JyZWN0aW9uVGFibGVDYmspCi0gICAgICAgIENBTExCQUNLKGxlZkNhbGxiYWNrcy0+Q29ycmVjdGlvblRhYmxlQ2JrLCBsZWZyQ29ycmVjdGlvblRhYmxlQ2JrVHlwZSwKLSAgICAgICAgICAgICAgICZsZWZEYXRhLT5sZWZyQ29ycmVjdGlvblRhYmxlKTsKLSAgICB9IGVsc2UKLSAgICAgIGlmIChsZWZDYWxsYmFja3MtPkNvcnJlY3Rpb25UYWJsZUNiaykgLy8gd3JpdGUgd2FybmluZyBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgIGlmIChsZWZEYXRhLT5jb3JyZWN0aW9uVGFibGVXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkNvcnJlY3Rpb25UYWJsZVdhcm5pbmdzKQotICAgICAgICAgIGxlZldhcm5pbmcoMjA3NSwgIkNPUlJFQ1RJT05UQUJMRSBzdGF0ZW1lbnQgaXMgb2Jzb2xldGUgaW4gdmVyc2lvbiA1LjQgYW5kIGxhdGVyLlxuVGhlIExFRiBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBzdGF0ZW1lbnQuXG5UbyBhdm9pZCB0aGlzIHdhcm5pbmcgaW4gdGhlIGZ1dHVyZSwgcmVtb3ZlIHRoaXMgc3RhdGVtZW50IGZyb20gdGhlIExFRiBmaWxlIHdpdGggdmVyc2lvbiA1LjQgb3IgbGF0ZXIuIik7Ci0gIH0KLQotY29ycmVjdGlvbl90YWJsZV9saXN0OgotICBjb3JyZWN0aW9uX3RhYmxlX2l0ZW0KLSAgfCBjb3JyZWN0aW9uX3RhYmxlX2xpc3QgY29ycmVjdGlvbl90YWJsZV9pdGVtCi0gIDsKLQotY29ycmVjdGlvbl90YWJsZV9pdGVtOgotICBLX0VER0VSQVRFIGludF9udW1iZXIgJzsnCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5Db3JyZWN0aW9uVGFibGVDYmspCi0gICAgICAgICB7Ci0gICAgICAgICAgICBsZWZEYXRhLT5sZWZyQ29ycmVjdGlvblRhYmxlLm5ld0VkZ2UoKTsKLSAgICAgICAgICAgIGxlZkRhdGEtPmxlZnJDb3JyZWN0aW9uVGFibGUuYWRkRWRnZSgkMik7Ci0gICAgICAgICB9Ci0gICAgfQotICB8IG91dHB1dF9saXN0Ci0gICAgeyB9Ci0KLW91dHB1dF9saXN0OiBLX09VVFBVVFJFU0lTVEFOQ0UKLSAgeyBpZiAobGVmQ2FsbGJhY2tzLT5Db3JyZWN0aW9uVGFibGVDYmspCi0gIGxlZkRhdGEtPmxlZnJDb3JyZWN0aW9uVGFibGUuYWRkUmVzaXN0YW5jZSgpOyB9Ci0gIG51bW9fbGlzdCAnOycgY29ycl92aWN0aW1fbGlzdAotICB7IH0KLQotbnVtb19saXN0OgotICBpbnRfbnVtYmVyCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5Db3JyZWN0aW9uVGFibGVDYmspCi0gICAgbGVmRGF0YS0+bGVmckNvcnJlY3Rpb25UYWJsZS5hZGRSZXNpc3RhbmNlTnVtYmVyKCQxKTsgfQotICB8IG51bW9fbGlzdCBpbnRfbnVtYmVyCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5Db3JyZWN0aW9uVGFibGVDYmspCi0gICAgbGVmRGF0YS0+bGVmckNvcnJlY3Rpb25UYWJsZS5hZGRSZXNpc3RhbmNlTnVtYmVyKCQyKTsgfQotCi1jb3JyX3ZpY3RpbV9saXN0OgotICAgY29ycl92aWN0aW0KLSAgIHwgY29ycl92aWN0aW1fbGlzdCBjb3JyX3ZpY3RpbQotICAgOwotCi1jb3JyX3ZpY3RpbToKLSAgS19WSUNUSU1MRU5HVEggaW50X251bWJlciAnOycKLSAgICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5Db3JyZWN0aW9uVGFibGVDYmspCi0gICAgIGxlZkRhdGEtPmxlZnJDb3JyZWN0aW9uVGFibGUuYWRkVmljdGltTGVuZ3RoKCQyKTsgfQotICBLX0NPUlJFQ1RJT05GQUNUT1IgY29ycl9saXN0ICc7JwotICAgICB7IH0KLQotY29ycl9saXN0OgotICBpbnRfbnVtYmVyCi0gICAgeyBpZiAobGVmQ2FsbGJhY2tzLT5Db3JyZWN0aW9uVGFibGVDYmspCi0gICAgICAgIGxlZkRhdGEtPmxlZnJDb3JyZWN0aW9uVGFibGUuYWRkVmljdGltQ29ycmVjdGlvbigkMSk7IH0KLSAgfCBjb3JyX2xpc3QgaW50X251bWJlcgotICAgIHsgaWYgKGxlZkNhbGxiYWNrcy0+Q29ycmVjdGlvblRhYmxlQ2JrKQotICAgICAgICBsZWZEYXRhLT5sZWZyQ29ycmVjdGlvblRhYmxlLmFkZFZpY3RpbUNvcnJlY3Rpb24oJDIpOyB9Ci0KLS8vIGVuZCBvZiA1LjQgb2Jzb2xldGUgc3ludGF4IAotCi1pbnB1dF9hbnRlbm5hOiBLX0lOUFVUUElOQU5URU5OQVNJWkUgaW50X251bWJlciAnOycKLSAgICB7IC8vIDUuMyBzeW50YXggCi0gICAgICAgIGxlZkRhdGEtPnVzZTVfMyA9IDE7Ci0gICAgICAgIGlmIChsZWZEYXRhLT5pZ25vcmVWZXJzaW9uKSB7Ci0gICAgICAgICAgIC8vIGRvIG5vdGhpbmcgCi0gICAgICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA+IDUuMykgewotICAgICAgICAgICAvLyBBIDUuMyBzeW50YXggaW4gNS40IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+dXNlNV80KSB7Ci0gICAgICAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPklucHV0QW50ZW5uYUNiaykgeyAvLyB3cml0ZSB3YXJuaW5nIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgICAgICBpZiAobGVmRGF0YS0+aW5wdXRBbnRlbm5hV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5JbnB1dEFudGVubmFXYXJuaW5ncykgewotICAgICAgICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgICAgICAiSU5QVVRQSU5BTlRFTk5BU0laRSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuMyBvciBlYXJsaWVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgd2l0aCB2ZXJzaW9uICVnLCBoYXMgYm90aCBvbGQgYW5kIG5ldyBJTlBVVFBJTkFOVEVOTkFTSVpFIHN5bnRheCwgd2hpY2ggaXMgaW5jb3JyZWN0LiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgICAgIGxlZkVycm9yKDE2NzEsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+SW5wdXRBbnRlbm5hQ2JrKQotICAgICAgICAgIENBTExCQUNLKGxlZkNhbGxiYWNrcy0+SW5wdXRBbnRlbm5hQ2JrLCBsZWZySW5wdXRBbnRlbm5hQ2JrVHlwZSwgJDIpOwotICAgIH0KLQotb3V0cHV0X2FudGVubmE6IEtfT1VUUFVUUElOQU5URU5OQVNJWkUgaW50X251bWJlciAnOycKLSAgICB7IC8vIDUuMyBzeW50YXggCi0gICAgICAgIGxlZkRhdGEtPnVzZTVfMyA9IDE7Ci0gICAgICAgIGlmIChsZWZEYXRhLT5pZ25vcmVWZXJzaW9uKSB7Ci0gICAgICAgICAgIC8vIGRvIG5vdGhpbmcgCi0gICAgICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA+IDUuMykgewotICAgICAgICAgICAvLyBBIDUuMyBzeW50YXggaW4gNS40IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+dXNlNV80KSB7Ci0gICAgICAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPk91dHB1dEFudGVubmFDYmspIHsgLy8gd3JpdGUgd2FybmluZyBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICAgICAgaWYgKGxlZkRhdGEtPm91dHB1dEFudGVubmFXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPk91dHB1dEFudGVubmFXYXJuaW5ncykgewotICAgICAgICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgICAgICAiT1VUUFVUUElOQU5URU5OQVNJWkUgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjMgb3IgZWFybGllciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIHdpdGggdmVyc2lvbiAlZywgaGFzIGJvdGggb2xkIGFuZCBuZXcgT1VUUFVUUElOQU5URU5OQVNJWkUgc3ludGF4LCB3aGljaCBpcyBpbmNvcnJlY3QuIiwgbGVmRGF0YS0+dmVyc2lvbk51bSk7Ci0gICAgICAgICAgICAgICAgICAgbGVmRXJyb3IoMTY3MiwgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICAgICAgQ0hLRVJSKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5PdXRwdXRBbnRlbm5hQ2JrKQotICAgICAgICAgIENBTExCQUNLKGxlZkNhbGxiYWNrcy0+T3V0cHV0QW50ZW5uYUNiaywgbGVmck91dHB1dEFudGVubmFDYmtUeXBlLCAkMik7Ci0gICAgfQotCi1pbm91dF9hbnRlbm5hOiBLX0lOT1VUUElOQU5URU5OQVNJWkUgaW50X251bWJlciAnOycKLSAgICB7IC8vIDUuMyBzeW50YXggCi0gICAgICAgIGxlZkRhdGEtPnVzZTVfMyA9IDE7Ci0gICAgICAgIGlmIChsZWZEYXRhLT5pZ25vcmVWZXJzaW9uKSB7Ci0gICAgICAgICAgIC8vIGRvIG5vdGhpbmcgCi0gICAgICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA+IDUuMykgewotICAgICAgICAgICAvLyBBIDUuMyBzeW50YXggaW4gNS40IAotICAgICAgICAgICBpZiAobGVmRGF0YS0+dXNlNV80KSB7Ci0gICAgICAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPklub3V0QW50ZW5uYUNiaykgeyAvLyB3cml0ZSB3YXJuaW5nIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgICAgICBpZiAobGVmRGF0YS0+aW5vdXRBbnRlbm5hV2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5Jbm91dEFudGVubmFXYXJuaW5ncykgewotICAgICAgICAgICAgICAgICAgIGxlZkRhdGEtPm91dE1zZyA9IChjaGFyKilsZWZNYWxsb2MoMTAwMDApOwotICAgICAgICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgICAgICAiSU5PVVRQSU5BTlRFTk5BU0laRSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuMyBvciBlYXJsaWVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgd2l0aCB2ZXJzaW9uICVnLCBoYXMgYm90aCBvbGQgYW5kIG5ldyBJTk9VVFBJTkFOVEVOTkFTSVpFIHN5bnRheCwgd2hpY2ggaXMgaW5jb3JyZWN0LiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgICAgIGxlZkVycm9yKDE2NzMsIGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+SW5vdXRBbnRlbm5hQ2JrKQotICAgICAgICAgIENBTExCQUNLKGxlZkNhbGxiYWNrcy0+SW5vdXRBbnRlbm5hQ2JrLCBsZWZySW5vdXRBbnRlbm5hQ2JrVHlwZSwgJDIpOwotICAgIH0KLQotYW50ZW5uYV9pbnB1dDogS19BTlRFTk5BSU5QVVRHQVRFQVJFQSBOVU1CRVIgJzsnCi0gICAgeyAvLyA1LjQgc3ludGF4IAotICAgICAgICAvLyAxMS8xMi8yMDAyIC0gdGhpcyBpcyBvYnNvbGV0ZSBpbiA1LjUsIHN1cHBvc2Ugc2hvdWxkIGJlIGluZ29yZWQgCi0gICAgICAgIC8vIDEyLzE2LzIwMDIgLSB0YWxrZWQgdG8gRGF2ZSBOb2ljZSwgbGVhdmUgdGhlbSBpbiBoZXJlIGZvciBkZWJ1Z2dpbmcKLSAgICAgICAgbGVmRGF0YS0+dXNlNV80ID0gMTsKLSAgICAgICAgaWYgKGxlZkRhdGEtPmlnbm9yZVZlcnNpb24pIHsKLSAgICAgICAgICAgLy8gZG8gbm90aGluZyAKLSAgICAgICAgfSBlbHNlIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS40KSB7Ci0gICAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkFudGVubmFJbnB1dENiaykgeyAvLyB3cml0ZSB3YXJuaW5nIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgICBpZiAobGVmRGF0YS0+YW50ZW5uYUlucHV0V2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5BbnRlbm5hSW5wdXRXYXJuaW5ncykgewotICAgICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAgICAiQU5URU5OQUlOUFVUR0FURUFSRUEgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuXG5FaXRoZXIgdXBkYXRlIHlvdXIgVkVSU0lPTiBudW1iZXIgb3IgdXNlIHRoZSA1LjMgc3ludGF4LiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgbGVmRXJyb3IoMTY3NCwgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPnVzZTVfMykgewotICAgICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5BbnRlbm5hSW5wdXRDYmspIHsgLy8gd3JpdGUgd2FybmluZyBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmFudGVubmFJbnB1dFdhcm5pbmdzKysgPCBsZWZTZXR0aW5ncy0+QW50ZW5uYUlucHV0V2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgICBzcHJpbnRmIChsZWZEYXRhLT5vdXRNc2csCi0gICAgICAgICAgICAgICAgICAgIkFOVEVOTkFJTlBVVEdBVEVBUkVBIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IG9yIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgd2l0aCB2ZXJzaW9uICVnLCBoYXMgYm90aCBvbGQgYW5kIG5ldyBBTlRFTk5BSU5QVVRHQVRFQVJFQSBzeW50YXgsIHdoaWNoIGlzIGluY29ycmVjdC4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgICBsZWZFcnJvcigxNjc1LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgIGxlZkZyZWUobGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkFudGVubmFJbnB1dENiaykKLSAgICAgICAgICBDQUxMQkFDSyhsZWZDYWxsYmFja3MtPkFudGVubmFJbnB1dENiaywgbGVmckFudGVubmFJbnB1dENia1R5cGUsICQyKTsKLSAgICB9Ci0KLWFudGVubmFfaW5vdXQ6IEtfQU5URU5OQUlOT1VURElGRkFSRUEgTlVNQkVSICc7JwotICAgIHsgLy8gNS40IHN5bnRheCAKLSAgICAgICAgLy8gMTEvMTIvMjAwMiAtIHRoaXMgaXMgb2Jzb2xldGUgaW4gNS41LCAmIHdpbGwgYmUgaWdub3JlZCAKLSAgICAgICAgLy8gMTIvMTYvMjAwMiAtIHRhbGtlZCB0byBEYXZlIE5vaWNlLCBsZWF2ZSB0aGVtIGluIGhlcmUgZm9yIGRlYnVnZ2luZwotICAgICAgICBsZWZEYXRhLT51c2U1XzQgPSAxOwotICAgICAgICBpZiAobGVmRGF0YS0+aWdub3JlVmVyc2lvbikgewotICAgICAgICAgICAvLyBkbyBub3RoaW5nIAotICAgICAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjQpIHsKLSAgICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+QW50ZW5uYUlub3V0Q2JrKSB7IC8vIHdyaXRlIHdhcm5pbmcgb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgICBpZiAobGVmRGF0YS0+YW50ZW5uYUlub3V0V2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5BbnRlbm5hSW5vdXRXYXJuaW5ncykgewotICAgICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAgICAiQU5URU5OQUlOT1VURElGRkFSRUEgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgYW5kIGxhdGVyIHN5bnRheC5cbllvdXIgbGVmIGZpbGUgaXMgZGVmaW5lZCB3aXRoIHZlcnNpb24gJWcuXG5FaXRoZXIgdXBkYXRlIHlvdXIgVkVSU0lPTiBudW1iZXIgb3IgdXNlIHRoZSA1LjMgc3ludGF4LiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgICBsZWZFcnJvcigxNjc2LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChsZWZEYXRhLT51c2U1XzMpIHsKLSAgICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+QW50ZW5uYUlub3V0Q2JrKSB7IC8vIHdyaXRlIHdhcm5pbmcgb25seSBpZiBjYmsgaXMgc2V0IAotICAgICAgICAgICAgICBpZiAobGVmRGF0YS0+YW50ZW5uYUlub3V0V2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5BbnRlbm5hSW5vdXRXYXJuaW5ncykgewotICAgICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAgICAiQU5URU5OQUlOT1VURElGRkFSRUEgc3RhdGVtZW50IGlzIGEgdmVyc2lvbiA1LjQgb3IgbGF0ZXIgc3ludGF4LlxuWW91ciBsZWYgZmlsZSB3aXRoIHZlcnNpb24gJWcsIGhhcyBib3RoIG9sZCBhbmQgbmV3IEFOVEVOTkFJTk9VVERJRkZBUkVBIHN5bnRheCwgd2hpY2ggaXMgaW5jb3JyZWN0LiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgICBsZWZFcnJvcigxNjc3LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5BbnRlbm5hSW5vdXRDYmspCi0gICAgICAgICAgQ0FMTEJBQ0sobGVmQ2FsbGJhY2tzLT5BbnRlbm5hSW5vdXRDYmssIGxlZnJBbnRlbm5hSW5vdXRDYmtUeXBlLCAkMik7Ci0gICAgfQotCi1hbnRlbm5hX291dHB1dDogS19BTlRFTk5BT1VUUFVURElGRkFSRUEgTlVNQkVSICc7JwotICAgIHsgLy8gNS40IHN5bnRheCAKLSAgICAgICAgLy8gMTEvMTIvMjAwMiAtIHRoaXMgaXMgb2Jzb2xldGUgaW4gNS41LCAmIHdpbGwgYmUgaWdub3JlZCAKLSAgICAgICAgLy8gMTIvMTYvMjAwMiAtIHRhbGtlZCB0byBEYXZlIE5vaWNlLCBsZWF2ZSB0aGVtIGluIGhlcmUgZm9yIGRlYnVnZ2luZwotICAgICAgICBsZWZEYXRhLT51c2U1XzQgPSAxOwotICAgICAgICBpZiAobGVmRGF0YS0+aWdub3JlVmVyc2lvbikgewotICAgICAgICAgICAvLyBkbyBub3RoaW5nIAotICAgICAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPnZlcnNpb25OdW0gPCA1LjQpIHsKLSAgICAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+QW50ZW5uYU91dHB1dENiaykgeyAvLyB3cml0ZSB3YXJuaW5nIG9ubHkgaWYgY2JrIGlzIHNldCAKLSAgICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmFudGVubmFPdXRwdXRXYXJuaW5ncysrIDwgbGVmU2V0dGluZ3MtPkFudGVubmFPdXRwdXRXYXJuaW5ncykgewotICAgICAgICAgICAgICAgICBsZWZEYXRhLT5vdXRNc2cgPSAoY2hhciopbGVmTWFsbG9jKDEwMDAwKTsKLSAgICAgICAgICAgICAgICAgc3ByaW50ZiAobGVmRGF0YS0+b3V0TXNnLAotICAgICAgICAgICAgICAgICAgICAiQU5URU5OQU9VVFBVVERJRkZBUkVBIHN0YXRlbWVudCBpcyBhIHZlcnNpb24gNS40IGFuZCBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIGlzIGRlZmluZWQgd2l0aCB2ZXJzaW9uICVnLlxuRWl0aGVyIHVwZGF0ZSB5b3VyIFZFUlNJT04gbnVtYmVyIG9yIHVzZSB0aGUgNS4zIHN5bnRheC4iLCBsZWZEYXRhLT52ZXJzaW9uTnVtKTsKLSAgICAgICAgICAgICAgICAgbGVmRXJyb3IoMTY3OCwgbGVmRGF0YS0+b3V0TXNnKTsKLSAgICAgICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgICBDSEtFUlIoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+dXNlNV8zKSB7Ci0gICAgICAgICAgIGlmIChsZWZDYWxsYmFja3MtPkFudGVubmFPdXRwdXRDYmspIHsgLy8gd3JpdGUgd2FybmluZyBvbmx5IGlmIGNiayBpcyBzZXQgCi0gICAgICAgICAgICAgIGlmIChsZWZEYXRhLT5hbnRlbm5hT3V0cHV0V2FybmluZ3MrKyA8IGxlZlNldHRpbmdzLT5BbnRlbm5hT3V0cHV0V2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgICAgbGVmRGF0YS0+b3V0TXNnID0gKGNoYXIqKWxlZk1hbGxvYygxMDAwMCk7Ci0gICAgICAgICAgICAgICAgIHNwcmludGYgKGxlZkRhdGEtPm91dE1zZywKLSAgICAgICAgICAgICAgICAgICAgIkFOVEVOTkFPVVRQVVRESUZGQVJFQSBzdGF0ZW1lbnQgaXMgYSB2ZXJzaW9uIDUuNCBvciBsYXRlciBzeW50YXguXG5Zb3VyIGxlZiBmaWxlIHdpdGggdmVyc2lvbiAlZywgaGFzIGJvdGggb2xkIGFuZCBuZXcgQU5URU5OQU9VVFBVVERJRkZBUkVBIHN5bnRheCwgd2hpY2ggaXMgaW5jb3JyZWN0LiIsIGxlZkRhdGEtPnZlcnNpb25OdW0pOwotICAgICAgICAgICAgICAgICBsZWZFcnJvcigxNjc5LCBsZWZEYXRhLT5vdXRNc2cpOwotICAgICAgICAgICAgICAgICBsZWZGcmVlKGxlZkRhdGEtPm91dE1zZyk7Ci0gICAgICAgICAgICAgICAgIENIS0VSUigpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobGVmQ2FsbGJhY2tzLT5BbnRlbm5hT3V0cHV0Q2JrKQotICAgICAgICAgIENBTExCQUNLKGxlZkNhbGxiYWNrcy0+QW50ZW5uYU91dHB1dENiaywgbGVmckFudGVubmFPdXRwdXRDYmtUeXBlLCAkMik7Ci0gICAgfQotCi1leHRlbnNpb25fb3B0OiAgLy8gZW1wdHkgCi0gICAgfCBleHRlbnNpb24KLQotZXh0ZW5zaW9uOiBLX0JFR0lORVhUCi0gICAgeyAKLSAgICAgICAgaWYgKGxlZkNhbGxiYWNrcy0+RXh0ZW5zaW9uQ2JrKQotICAgICAgICAgIENBTExCQUNLKGxlZkNhbGxiYWNrcy0+RXh0ZW5zaW9uQ2JrLCBsZWZyRXh0ZW5zaW9uQ2JrVHlwZSwgJmxlZkRhdGEtPkhpc3RfdGV4dFswXSk7Ci0gICAgICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtID49IDUuNikKLSAgICAgICAgICAgbGVmRGF0YS0+Z2U1NmFsbW9zdERvbmUgPSAxOwotICAgIH0KLQotJSUKLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZl9rZXl3b3Jkcy5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZl9rZXl3b3Jkcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5OTBlY2IuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZfa2V5d29yZHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjEwOCArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyIC0gMjAxNiwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAibGVmaURlZnMuaHBwIgotI2luY2x1ZGUgImxlZmlEZWJ1Zy5ocHAiCi0jaW5jbHVkZSAibGVmclJlYWRlci5ocHAiCi0jaW5jbHVkZSAibGVmckRhdGEuaHBwIgotI2luY2x1ZGUgImxlZnJDYWxsQmFja3MuaHBwIgotI2luY2x1ZGUgImxlZnJTZXR0aW5ncy5ocHAiCi0jaW5jbHVkZSAiY3J5cHQuaHBwIgotI2luY2x1ZGUgImxleC5oIgotCi0jaWZkZWYgV0lOMzIKLSMgICBpbmNsdWRlIDxkaXJlY3QuaD4KLSNlbHNlIC8vIG5vdCBXSU4zMiAKLSMgICBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZiAvLyBXSU4zMgotCi0jaW5jbHVkZSAibGVmckRhdGEuaHBwIgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0jaW5jbHVkZSAibGVmLnRhYi5oIgotCi1leHRlcm4gWVlTVFlQRSBsZWZ5eWx2YWw7Ci0KLQotaW5saW5lIHN0cmluZyAKLXN0cmlwX2Nhc2UoY29uc3QgY2hhciAqc3RyKQotewotICAgIHN0cmluZyByZXN1bHQoc3RyKTsKLQotICAgIGlmIChsZWZEYXRhLT5uYW1lc0Nhc2VTZW5zaXRpdmUpIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9OwotCi0gICAgZm9yIChzdHJpbmc6Oml0ZXJhdG9yIHAgPSByZXN1bHQuYmVnaW4oKTsgcmVzdWx0LmVuZCgpICE9IHA7ICsrcCkgewotICAgICAgICAqcCA9IHRvdXBwZXIoKnApOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotaW5saW5lCi1pbnQgbGVmR2V0S2V5d29yZChjb25zdCBjaGFyKiBuYW1lLCBpbnQgKnJlc3VsdCkgCi17IAotICAgIG1hcDxjb25zdCBjaGFyKiwgaW50LCBsZWZDb21wYXJlQ1N0cmluZ3M+OjppdGVyYXRvciBzZWFyY2ggPSBsZWZTZXR0aW5ncy0+S2V5d29yZF9zZXQuZmluZChuYW1lKTsKLSAgICBpZiAoIHNlYXJjaCAhPSBsZWZTZXR0aW5ncy0+S2V5d29yZF9zZXQuZW5kKCkpIHsKLSAgICAgICAgKnJlc3VsdCA9IHNlYXJjaC0+c2Vjb25kOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLQotaW5saW5lIGludAotbGVmR2V0U3RyaW5nRGVmaW5lKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqKiB2YWx1ZSkKLXsKLSAgICBtYXA8c3RyaW5nLCBzdHJpbmcsIGxlZkNvbXBhcmVTdHJpbmdzPjo6aXRlcmF0b3Igc2VhcmNoID0gbGVmRGF0YS0+ZGVmaW5lc19zZXQuZmluZChzdHJpcF9jYXNlKG5hbWUpKTsKLQotICAgIGlmICggc2VhcmNoICE9IGxlZkRhdGEtPmRlZmluZXNfc2V0LmVuZCgpKSB7Ci0gICAgICAgICp2YWx1ZSA9IHNlYXJjaC0+c2Vjb25kLmNfc3RyKCk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLQotaW5saW5lIGludAotbGVmR2V0SW50RGVmaW5lKGNvbnN0IGNoYXIqIG5hbWUsIGludCogdmFsdWUpCi17Ci0gICAgbWFwPHN0cmluZywgaW50LCBsZWZDb21wYXJlU3RyaW5ncz46Oml0ZXJhdG9yIHNlYXJjaCA9IGxlZkRhdGEtPmRlZmluZWJfc2V0LmZpbmQoc3RyaXBfY2FzZShuYW1lKSk7Ci0KLSAgICBpZiAoIHNlYXJjaCAhPSBsZWZEYXRhLT5kZWZpbmViX3NldC5lbmQoKSkgewotICAgICAgICAqdmFsdWUgPSBzZWFyY2gtPnNlY29uZDsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLQotCi1pbmxpbmUgaW50Ci1sZWZHZXREb3VibGVEZWZpbmUoY29uc3QgY2hhciogbmFtZSwgZG91YmxlKiB2YWx1ZSkKLXsKLSAgICBtYXA8c3RyaW5nLCBkb3VibGUsIGxlZkNvbXBhcmVTdHJpbmdzPjo6aXRlcmF0b3Igc2VhcmNoID0gbGVmRGF0YS0+ZGVmaW5lX3NldC5maW5kKHN0cmlwX2Nhc2UobmFtZSkpOwotCi0gICAgaWYgKCBzZWFyY2ggIT0gbGVmRGF0YS0+ZGVmaW5lX3NldC5lbmQoKSkgewotICAgICAgICAqdmFsdWUgPSBzZWFyY2gtPnNlY29uZDsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLQotCi1pbmxpbmUgaW50Ci1sZWZHZXRBbGlhcyhjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiogdmFsdWUpCi17Ci0gICAgbWFwPHN0cmluZywgc3RyaW5nLCBsZWZDb21wYXJlU3RyaW5ncz46Oml0ZXJhdG9yIHNlYXJjaCA9IGxlZkRhdGEtPmFsaWFzX3NldC5maW5kKHN0cmlwX2Nhc2UobmFtZSkpOwotCi0gICAgaWYgKCBzZWFyY2ggIT0gbGVmRGF0YS0+YWxpYXNfc2V0LmVuZCgpKSB7Ci0gICAgICAgICp2YWx1ZSA9IHNlYXJjaC0+c2Vjb25kLmNfc3RyKCk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLQotI2RlZmluZSB5eXBhcnNlICAgIGxlZnl5cGFyc2UKLSNkZWZpbmUgeXlsZXggICAgbGVmeXlsZXgKLSNkZWZpbmUgeXllcnJvciAgICBsZWZ5eWVycm9yCi0jZGVmaW5lIHl5bHZhbCAgICBsZWZ5eWx2YWwKLSNkZWZpbmUgeXljaGFyICAgIGxlZnl5Y2hhcgotI2RlZmluZSB5eWRlYnVnICAgIGxlZnl5ZGVidWcKLSNkZWZpbmUgeXluZXJycyAgICBsZWZ5eW5lcnJzCi0KLS8vIGxlZi5jcHBoIHN0YXJ0cyBoZXJlLgotCi0vLyB2YXJpYWJsZSB0byBjb3VudCBudW1iZXIgb2Ygd2FybmluZ3MgCi0KLS8vIDEyLzA4LzE5OTkgLS0gV2FuZGEgZGEgUm9zYSAKLS8vIGZpbGUgcG9pbnRlciB0byB0aGUgbGVmUldhcm5pbmcubG9nIAotCi1leHRlcm4gY2hhciAqbGVmX2t5d2QoaW50IG51bSk7Ci0KLS8vIFVzZXIgZGVmaW5lZCBpZiBsb2cgZmlsZSBzaG91bGQgYmUgaW4gYXBwZW5kIGZyb20gdGhlIHByZXZpb3VzIHJ1biAKLQotLy8gVXNlciBkZWZpbmVkIGlmIHByb3BlcnR5IHN0cmluZyB2YWx1ZSBzaG91bGQgYmUgcHJvY2VzcyAKLQotLy8gVmFyaWJsZSBmcm9tIGxleC5jcHBoIHRvIGtlZXAgdHJhY2sgb2YgaW52YWxpZCBub25FbmdsaXNoIGNoYXJhY3RlciAKLS8vIGluIGxlZiBmaWxlIAotCi12b2lkCi1sZWZSZWxvYWRCdWZmZXIoKQotewotICAgIGludCBuYjsKLQotICAgIG5iID0gMDsKLQotICAgIGlmIChsZWZEYXRhLT5maXJzdF9idWZmZXIpIHsKLSAgICAgICAgbGVmRGF0YS0+Zmlyc3RfYnVmZmVyID0gMDsKLSAgICAgICAgaWYgKGxlZlNldHRpbmdzLT5SZWFkRnVuY3Rpb24pIHsKLSAgICAgICAgICAgIGlmICgobmIgPSAoKmxlZlNldHRpbmdzLT5SZWFkRnVuY3Rpb24pKGxlZkRhdGEtPmxlZnJGaWxlLCBsZWZEYXRhLT5jdXJyZW50X2J1ZmZlciwgNCkpICE9IDQpIHsKLSAgICAgICAgICAgICAgICBsZWZEYXRhLT5uZXh0ID0gTlVMTDsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoKG5iID0gZnJlYWQobGVmRGF0YS0+Y3VycmVudF9idWZmZXIsIDEsIDQsIGxlZkRhdGEtPmxlZnJGaWxlKSkgIT0gNCkgewotICAgICAgICAgICAgICAgIGxlZkRhdGEtPm5leHQgPSBOVUxMOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBsZWZEYXRhLT5lbmNyeXB0ZWQgPSBlbmNJc0VuY3J5cHRlZCgodW5zaWduZWQgY2hhciopIGxlZkRhdGEtPmN1cnJlbnRfYnVmZmVyKTsKLSAgICB9Ci0KLSAgICBpZiAobGVmRGF0YS0+ZW5jcnlwdGVkKSB7Ci0gICAgICAgIGludCBpOwotICAgICAgICBpbnQgYzsKLQotICAgICAgICBpZiAobGVmU2V0dGluZ3MtPlJlYWRFbmNyeXB0ZWQpIHsKLSAgICAgICAgICAgIC8vIGlzIGVuY3J5cHRlZCBmaWxlIGFuZCB1c2VyIGhhcyBzZXQgdGhlIGVuYWJsZSBmbGFnIHRvIHJlYWQgb25lIAotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IElOX0JVRl9TSVpFOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoKGMgPSBlbmNGZ2V0YyhsZWZEYXRhLT5sZWZyRmlsZSkpID09IEVPRikgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGVmRGF0YS0+Y3VycmVudF9idWZmZXJbaV0gPSBjOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmIgPSBpOwotICAgICAgICB9IGVsc2UgeyAgICAgIC8vIGFuIGVuY3J5cHRlZCBmaWxlLCBidXQgdXNlciBkb2VzIG5vdCBhbGxvdyB0byByZWFkIG9uZSAKLSAgICAgICAgICAgIHByaW50ZigiRmlsZSBpcyBhbiBlbmNyeXB0ZWQgZmlsZSwgcmVhZGVyIGlzIG5vdCBzZXQgdG8gcmVhZCBvbmUuXG4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobmIgPT0gMCkgewotICAgICAgICBpZiAobGVmU2V0dGluZ3MtPlJlYWRGdW5jdGlvbikKLSAgICAgICAgICAgIG5iID0gKCpsZWZTZXR0aW5ncy0+UmVhZEZ1bmN0aW9uKShsZWZEYXRhLT5sZWZyRmlsZSwgbGVmRGF0YS0+Y3VycmVudF9idWZmZXIsIElOX0JVRl9TSVpFKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgLy8gVGhpcyBpcyBhIG5vcm1hbCBmaWxlIHNvIGp1c3QgcmVhZCBzb21lIGJ5dGVzLiAKLSAgICAgICAgICAgIG5iID0gZnJlYWQobGVmRGF0YS0+Y3VycmVudF9idWZmZXIsIDEsIElOX0JVRl9TSVpFLCBsZWZEYXRhLT5sZWZyRmlsZSk7Ci0gICAgfQotCi0gICAgaWYgKG5iIDw9IDApIHsKLSAgICAgICAgbGVmRGF0YS0+bmV4dCA9IE5VTEw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbGVmRGF0YS0+bmV4dCA9IGxlZkRhdGEtPmN1cnJlbnRfYnVmZmVyOwotICAgICAgICBsZWZEYXRhLT5sYXN0ID0gbGVmRGF0YS0+Y3VycmVudF9idWZmZXIgKyBuYiAtIDE7Ci0gICAgfQotfQotCi1pbnQKLWxlZkdldGMoKQotewotICAgIGlmIChsZWZEYXRhLT5pbnB1dF9sZXZlbCA+PSAwKSB7ICAgICAgICAvLyBUb2tlbiBoYXMgYmVlbiBnZXR0aW5nIGZyb20gCi0gICAgICAgIGNvbnN0IGNoYXIgKmNoLCAqczsKLSAgICAgICAgcyA9IGNoID0gbGVmRGF0YS0+Y3VycmVudF9zdGFja1tsZWZEYXRhLT5pbnB1dF9sZXZlbF07Ci0gICAgICAgIGxlZkRhdGEtPmN1cnJlbnRfc3RhY2tbbGVmRGF0YS0+aW5wdXRfbGV2ZWxdID0gKytzOwotICAgICAgICByZXR1cm4gKmNoOwotICAgIH0KLQotICAgIC8vIFJlbW92ZSAnXHInIHN5bWJvbHMgZnJvbSBXaW5kb3dzIHN0cmVhbXMuCi0gICAgZm9yICg7OykgewotICAgICAgICBpZiAobGVmRGF0YS0+bmV4dCA+IGxlZkRhdGEtPmxhc3QpCi0gICAgICAgICAgICBsZWZSZWxvYWRCdWZmZXIoKTsKLSAgICAgICAgaWYgKGxlZkRhdGEtPm5leHQgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiBFT0Y7Ci0KLSAgICAgICAgaW50IGNoID0gKmxlZkRhdGEtPm5leHQrKzsKLQotICAgICAgICBpZiAoY2ggIT0gJ1xyJykKLSAgICAgICAgICAgIHJldHVybiBjaDsKLSAgICB9Ci19Ci0KLXZvaWQKLVVObGVmR2V0YyhjaGFyIGNoKQotewotICAgIGlmICgobGVmRGF0YS0+bmV4dCA8PSBsZWZEYXRhLT5jdXJyZW50X2J1ZmZlcikgfHwgKGxlZkRhdGEtPmlucHV0X2xldmVsID4gMCkpIHsKLSAgICAgICAgbGVmRXJyb3IoMTExMSwgIlVObGVmR2V0YzogYnVmZmVyIGFjY2VzcyB2aW9sYXRpb24uIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKigtLWxlZkRhdGEtPm5leHQpID0gY2g7Ci0gICAgfQotfQotCi0KLS8vIFRoZSBmb2xsb3dpbmcgdHdvIHZhcmlhYmxlcyBhcmUgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgcGFyc2VyCi0vKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgYWxsb2NhdGVkIGZyb20gdGhlIGxlZkRhdGEtPnJpbmcgYnVmZmVyLgotICogV2Ugd2lsbCBrZWVwIHNldmVyYWwgc3RyaW5ncyBpbiB0aGUgYnVmZmVyIGFuZCBqdXN0IHJldXNlIHRoZW0uCi0gKiBUaGlzIGNvdWxkIGNhdXNlIHByb2JsZW1zIGlmIHdlIG5lZWQgdG8gdXNlIG1vcmUgc3RyaW5ncyB0aGFuIHdlCi0gKiBoYXZlIGluIHRoZSBidWZmZXIuCi0gKi8KLXN0YXRpYyBjaGFyICoKLXJpbmdDb3B5KGNvbnN0IGNoYXIgKnN0cmluZykKLXsKLSAgICBpbnQgbGVuID0gc3RybGVuKHN0cmluZykgKyAxOwotICAgIGlmICgrK2xlZkRhdGEtPnJpbmdQbGFjZSA+PSBSSU5HX1NJWkUpCi0gICAgICAgIGxlZkRhdGEtPnJpbmdQbGFjZSA9IDA7Ci0gICAgaWYgKGxlbiA+IGxlZkRhdGEtPnJpbmdTaXplc1tsZWZEYXRhLT5yaW5nUGxhY2VdKSB7Ci0gICAgICAgIGxlZkRhdGEtPnJpbmdbbGVmRGF0YS0+cmluZ1BsYWNlXSA9IChjaGFyKikgbGVmUmVhbGxvYyhsZWZEYXRhLT5yaW5nW2xlZkRhdGEtPnJpbmdQbGFjZV0sIGxlbik7Ci0gICAgICAgIGxlZkRhdGEtPnJpbmdTaXplc1tsZWZEYXRhLT5yaW5nUGxhY2VdID0gbGVuOwotICAgIH0KLSAgICBzdHJjcHkobGVmRGF0YS0+cmluZ1tsZWZEYXRhLT5yaW5nUGxhY2VdLCBzdHJpbmcpOwotICAgIHJldHVybiBsZWZEYXRhLT5yaW5nW2xlZkRhdGEtPnJpbmdQbGFjZV07Ci19Ci0KLWNoYXIgKgotcVN0ckNvcHkoY2hhciAqc3RyaW5nKQotewotICAgIGludCAgICAgbGVuID0gc3RybGVuKHN0cmluZykgKyAzOwotICAgIGNoYXIgICAgKnJldFN0cjsKLQotICAgIHJldFN0ciA9IChjaGFyKikgbGVmTWFsbG9jKGxlbik7Ci0gICAgc3ByaW50ZihyZXRTdHIsICJcIiVzXCIiLCBzdHJpbmcpOwotICAgIHJldHVybiByZXRTdHI7Ci19Ci0KLQotLyogTk9URTogd2UgZG9uJ3QgYWxsb2NhdGUgdGhlc2UgdGFibGVzIHVudGlsIHRoZXkgYXJlIHVzZWQuICBUaGUgcmVhc29uCi0gKiB3ZSBkb24ndCBhbGxvY2F0ZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwcm9ncmFtIGlzIHRoYXQgd2UgZG9uJ3Qga25vdwotICogYXQgdGhhdCBwb2ludCBpZiB3ZSBzaG91bGQgYmUgY2FzZSBzZW5zaXRpdmUgb3Igbm90LiAqLwotCi12b2lkCi1sZWZBZGRTdHJpbmdEZWZpbmUoY29uc3QgY2hhciAqdG9rZW4sIGNvbnN0IGNoYXIgKnN0cikKLXsgICAgCi0gICAgc3RyaW5nIHRtcFN0cigobGVmRGF0YS0+bGVmRGVmSWYgPT0gVFJVRSkgPyAiIiA6ICJcIiIpOwotCi0gICAgdG1wU3RyICs9IHN0cjsKLQotICAgIGxlZkRhdGEtPmRlZmluZXNfc2V0W3N0cmlwX2Nhc2UodG9rZW4pXSA9IHRtcFN0cjsKLSAgICBsZWZEYXRhLT5sZWZEZWZJZiA9IEZBTFNFOwotICAgIGxlZkRhdGEtPmluRGVmaW5lID0gMDsKLX0KLQotCi12b2lkCi1sZWZBZGRCb29sZWFuRGVmaW5lKGNvbnN0IGNoYXIgICp0b2tlbiwgaW50IHZhbCkKLXsKLSAgICBsZWZEYXRhLT5kZWZpbmViX3NldFtzdHJpcF9jYXNlKHRva2VuKV0gPSB2YWw7Ci19Ci0KLQotdm9pZAotbGVmQWRkTnVtRGVmaW5lKGNvbnN0IGNoYXIgICp0b2tlbiwgZG91YmxlIHZhbCkKLXsKLSAgICBsZWZEYXRhLT5kZWZpbmVfc2V0W3N0cmlwX2Nhc2UodG9rZW4pXSA9IHZhbDsKLX0KLQotCi1zdGF0aWMgaW50Ci1HZXRUb2tlbkZyb21TdGFjayhjaGFyICpzKQotewotICAgIGNvbnN0IGNoYXIgICAgKmNoOyAgICAgICAgICAgICAgICAgIC8vIHV0aWxpdHkgdmFyaWFibGUgCi0gICAgY2hhciAgICAgICAgICAqcHJTID0gTlVMTDsgICAgICAgICAgLy8gcG9pbnRpbmcgdG8gdGhlIHByZXZpb3VzIGNoYXIgb3IgcyAKLSAgICBjaGFyICAgICAgICAgICpzYXZlID0gczsgICAgICAgICAgICAvLyBmb3IgZGVidWcgcHJpbnRpbmcgCi0KLSAgICB3aGlsZSAobGVmRGF0YS0+aW5wdXRfbGV2ZWwgPj0gMCkgewotICAgICAgICBmb3IgKGNoID0gbGVmRGF0YS0+Y3VycmVudF9zdGFja1tsZWZEYXRhLT5pbnB1dF9sZXZlbF07ICpjaCAhPSAwOyBjaCsrKSAgICAvLyBza2lwIHdoaXRlIHNwYWNlIAotICAgICAgICAgICAgaWYgKCpjaCAhPSAnICcgJiYgKmNoICE9ICdcdCcgJiYgKGxlZkRhdGEtPmxlZk5sVG9rZW4gfHwgKmNoICE9ICdcbicpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAvLyBkaWQgd2UgZmluZCBhbnl0aGluZz8gIElmIG5vdCwgZGVjcmVtZW50IGxldmVsIGFuZCB0cnkgYWdhaW4gCi0gICAgICAgIGlmICgqY2ggPT0gMCkKLSAgICAgICAgICAgIGxlZkRhdGEtPmlucHV0X2xldmVsLS07Ci0gICAgICAgIGVsc2UgaWYgKCpjaCA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAqcysrID0gKmNoOwotICAgICAgICAgICAgKnMgPSAwOwotICAgICAgICAgICAgaWYgKGxlZkRhdGEtPmxlZkRlYnVnWzExXSkKLSAgICAgICAgICAgICAgICBwcmludGYoIlN0YWNrWyVkXSBOZXdsaW5lIHRva2VuXG4iLCBsZWZEYXRhLT5pbnB1dF9sZXZlbCk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfSBlbHNlIHsgICAgICAgIC8vIHdlIGZvdW5kIHNvbWV0aGluZyAKLSAgICAgICAgICAgIGZvciAoOyA7IGNoKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoKmNoID09ICcgJyB8fCAqY2ggPT0gJ1x0JyB8fCAqY2ggPT0gJ1xuJyB8fCAqY2ggPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAvKiAxMC8xMC8yMDAwIC0gV2FuZGEgZGEgUm9zYSwgcGNyIDM0MTAzMgotICAgICAgICAgICAgICAgICAgICAqKiBUYWtlIG91dCB0aGUgbGVmRGF0YS0+bGFzdCAnIicsIHRoZSAxc3Qgd2lsbCBiZSBza2lwIGxhdGVyCi0gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGlmICgqcHJTID09ICciJykgewotICAgICAgICAgICAgICAgICAgICAgICAgKnByUyA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgKnMrKyA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgICAgIGxlZkRhdGEtPmN1cnJlbnRfc3RhY2tbbGVmRGF0YS0+aW5wdXRfbGV2ZWxdID0gY2g7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsZWZEYXRhLT5sZWZEZWJ1Z1sxMV0pCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlN0YWNrWyVkXTogPCVzPiwgZG09JWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmRGF0YS0+aW5wdXRfbGV2ZWwsIHNhdmUsIGxlZkRhdGEtPmxlZkR1bWJNb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIDEwLzEwLzIwMDAgLSBXYW5kYSBkYSBSb3NhLCBwY3IgMzQxMDMyCi0gICAgICAgICAgICAgICAgKiogU2F2ZSB0aGUgbG9jYXRpb24gb2YgdGhlIHByZXZpb3VzIHMKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHByUyA9IHM7Ci0gICAgICAgICAgICAgICAgKnMrKyA9ICpjaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7ICAgICAgICAvLyBpZiB3ZSBnZXQgaGVyZSwgd2UgcmFuIG91dCBvZiBpbnB1dCBsZXZlbHMgCi19Ci0KLQotLy8gSW5jcmVtZW50IGN1cnJlbnQgcG9zaXRpb24gb2YgYnVmZmVyIHBvaW50ZXIuIAotLy8gRG91YmxlIGJ1ZmZlciBzaXplIGlmIGN1clBvcyBpcyBvdXQgb2YgYm91bmRhcnkuCi1zdGF0aWMgaW5saW5lIHZvaWQgIAotSW5jQ3VyUG9zKGNoYXIgKipjdXJQb3MsIGNoYXIgKipidWZmZXIsIGludCAqYnVmZmVyU2l6ZSkKLXsKLSAgICAoKmN1clBvcykrKzsKLSAgICBpZiAoKmN1clBvcyAtICpidWZmZXIgPCAqYnVmZmVyU2l6ZSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbG9uZyBvZmZzZXQgPSAqY3VyUG9zIC0gKmJ1ZmZlcjsKLQotICAgICpidWZmZXJTaXplICo9IDI7Ci0gICAgKmJ1ZmZlciA9IChjaGFyKikgcmVhbGxvYygqYnVmZmVyLCAqYnVmZmVyU2l6ZSk7Ci0gICAgKmN1clBvcyA9ICpidWZmZXIgKyBvZmZzZXQ7Ci19Ci0KLQotaW5saW5lIHN0YXRpYyB2b2lkIAotcHJpbnRfbmxpbmVzKGludCBsaW5lTnVtKQotewotICAgIC8vIGNhbGwgdGhlIGNhbGxiYWNrIGxpbmUgbnVtYmVyIGZ1bmN0aW9uIGlmIGl0IGlzIHNldCAKLSAgICBpZiAobGVmU2V0dGluZ3MtPkxpbmVOdW1iZXJGdW5jdGlvbiAmJgotICAgICAgICAobGluZU51bSAlIGxlZlNldHRpbmdzLT5EZWx0YU51bWJlckxpbmVzKSA9PSAwKQotICAgICAgICBsZWZTZXR0aW5ncy0+TGluZU51bWJlckZ1bmN0aW9uKGxpbmVOdW0pOwotfQotCi0KLXN0YXRpYyBpbnQKLUdldFRva2VuKGNoYXIgKipidWZmZXIsIGludCAqYnVmZmVyU2l6ZSkKLXsKLSAgICBjaGFyICpzID0gKmJ1ZmZlcjsKLSAgICBpbnQgY2g7Ci0KLSAgICBsZWZEYXRhLT5sZWZfbnRva2VucysrOwotICAgIGxlZkRhdGEtPmxlZkludmFsaWRDaGFyID0gMDsKLQotICAgIGlmIChsZWZEYXRhLT5pbnB1dF9sZXZlbCA+PSAwKSB7ICAgICAgICAgICAgLy8gaWYgd2UgYXJlIGV4cGFuZGluZyBhbiBhbGlhcyAKLSAgICAgICAgaWYgKEdldFRva2VuRnJvbVN0YWNrKHMpKSAgICAvLyB0cnkgdG8gZ2V0IGEgdG9rZW4gZnJvbSBpdCAKLSAgICAgICAgICAgIHJldHVybiBUUlVFOyAgICAgICAgICAgICAgICAvLyBpZiB3ZSBnZXQgb25lLCByZXR1cm4gaXQgCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBpZiBub3QsIGNvbnRpbnVlIAotCi0gICAgLy8gc2tpcCBibGFua3MgYW5kIGNvdW50IGxpbmVzIAotICAgIHdoaWxlICgoY2ggPSBsZWZHZXRjKCkpICE9IEVPRikgewotICAgICAgICAvLyBjaGVjayBpZiB0aGUgZmlsZSBpcyBlbmNyeXB0ZWQgYW5kIHVzZXIgYWxsb3dzIHRvIHJlYWQgCi0gICAgICAgIGlmIChsZWZEYXRhLT5lbmNyeXB0ZWQgJiYgIWxlZlNldHRpbmdzLT5SZWFkRW5jcnlwdGVkKQotICAgICAgICAgICAgY2ggPSBFT0Y7Ci0gICAgICAgIGlmIChjaCA9PSAnXG4nKSB7Ci0gICAgICAgICAgICBwcmludF9ubGluZXMoKytsZWZEYXRhLT5sZWZfbmxpbmVzKTsgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGlmIChjaCAhPSAnICcgJiYgY2ggIT0gJ1x0JyAmJiAobGVmRGF0YS0+bGVmTmxUb2tlbiB8fCBjaCAhPSAnXG4nKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChjaCA9PSBFT0YpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIGlmIChjaCA9PSAnXG4nKSB7Ci0gICAgICAgICpzID0gY2g7Ci0gICAgICAgIEluY0N1clBvcygmcywgYnVmZmVyLCBidWZmZXJTaXplKTsKLQotICAgICAgICAqcyA9ICdcMCc7Ci0gICAgICAgIGlmIChsZWZEYXRhLT5sZWZEZWJ1Z1sxMV0pCi0gICAgICAgICAgICBwcmludGYoIk5ld2xpbmUgdG9rZW5cbiIpOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0KLSAgICAvLyBub3cgZ2V0IHRoZSB0b2tlbiAKLSAgICBpZiAoY2ggPT0gJyInKSB7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIC8qIDUvNi8yMDA4IC0gQ0NSIDU1NjgxOAotICAgICAgICAgICAgKiogQ2hlY2sgaWYgdGhlIGNoIGlzIGEgdmFsaWQgYXNjaWkgY2hhcmFjdGVyIDAgPTwgY2ggPCAxMjgKLSAgICAgICAgICAgICoqIElmIG5vdCB3cml0ZSBvdXQgYW4gZXJyb3IKLSAgICAgICAgICAgICovCi0gICAgICAgICAgICAvKiA4LzcvMjAwOCAtIENDUiA1ODYxNzUKLSAgICAgICAgICAgICoqIFNvbWUgZmlsZXMgbWF5IG5vdCBlbmQgd2l0aCBcbiBvciBcMCBvciBFT0YgYXMgdGhlIGxlZkRhdGEtPmxhc3QgY2hhcmFjdGVyCi0gICAgICAgICAgICAqKiBUaGUgcGFyc2VyIGFsbG93cyB0aGlzIGNoYXIgaW5zdGVhZCBvZiBlcnJvciBvdXQKLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoKGNoIDwgLTEpIHx8IChjaCA+IDEyNykpIHsKLSAgICAgICAgICAgICAgICBsZWZEYXRhLT5sZWZJbnZhbGlkQ2hhciA9IDE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIDgvMjIvMjAwMCAtIFdhbmRhIGRhIFJvc2EsIHBjciAzMzMzMzQKLSAgICAgICAgICAgICoqIHNhdmUgdGhlIHByZXZpb3VzIGNoYXIgdG8gYWxsb3cgYmFja3NsYXNoIHF1b3RlIHdpdGhpbiBxdW90ZQotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICghbGVmU2V0dGluZ3MtPkRpc1Byb3BTdHJQcm9jZXNzKSB7Ci0gICAgICAgICAgICAgICAgLy8gMy80LzIwMDggLSBDQ1IgNTIzODc5IC0gY29udmVydCBcXCB0byBcLCBcIiB0byAiLCBceCB0byB4IAotICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnXFwnKSB7ICAgICAgLy8gZ290IGEgXCwgc2F2ZSB0aGUgbGVmRGF0YS0+bmV4dCBjaGFyIG9ubHkgCi0gICAgICAgICAgICAgICAgICAgIGNoID0gbGVmR2V0YygpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgoY2ggPT0gJ1xuJykgfHwgKGNoID09IEVPRikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpzID0gJ1wwJzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlZkVycm9yKDYwMTUsICJVbmV4cGVjdGVkIGVuZCBvZiB0aGUgTEVGIGZpbGUuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZWZEYXRhLT5oYXNGYXRhbEVycm9yID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gNS81LzIwMDQgLSBwY3IgNzA0Nzg0Ci0gICAgICAgICAgICAvLyBJZiBuYW1lLCBvciBxdW90ZSBzdHJpbmcgaXMgbG9uZ2VyIHRoYW4gY3VycmVudCBidWZmZXIgc2l6ZSAKLSAgICAgICAgICAgIC8vIGluY3JlYXNlIHRoZSBidWZmZXIuICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICpzID0gY2g7Ci0gICAgICAgICAgICBJbmNDdXJQb3MoJnMsIGJ1ZmZlciwgYnVmZmVyU2l6ZSk7Ci0KLSAgICAgICAgICAgIGNoID0gbGVmR2V0YygpOwotCi0gICAgICAgICAgICAvLyA3LzIzLzIwMDMgLSBwY3IgNjA2NTU4IC0gZG8gbm90IGFsbG93IFxuIGluIGEgc3RyaW5nIGluc3RlYWQgCi0gICAgICAgICAgICAvLyBvZiA7IAotICAgICAgICAgICAgaWYgKChjaCA9PSAnXG4nKSApIHsKLSAgICAgICAgICAgICAgICBwcmludF9ubGluZXMoKytsZWZEYXRhLT5sZWZfbmxpbmVzKTsKLSAgICAgICAgICAgICAgICAvLyAyLzIvMjAwNyAtIFBDUiA5MDk3MTQsIGFsbG93IHN0cmluZyB0byBnbyBtb3JlIHRoYW4gMSBsaW5lIAotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgY29udGludWUgdG8gcGFyc2UgCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjaCA9PSBFT0YpIHsKLSAgICAgICAgICAgICAgICAqcyA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgbGVmRXJyb3IoNjAxNSwgIlVuZXhwZWN0ZWQgZW5kIG9mIHRoZSBMRUYgZmlsZS4iKTsKLSAgICAgICAgICAgICAgICBsZWZEYXRhLT5oYXNGYXRhbEVycm9yID0gMTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKGNoICE9ICciJyk7Ci0gICAgICAgICpzID0gJ1wwJzsKLSAgICAgICAgLyogMTAvMzEvMjAwNiAtIHBjciA5MjYwNjgKLSAgICAgICAgKiogV2hlbiBpdCByZWFjaGVzIHRvIGhlcmUsIGNoYW5jZXMgYXJlIGl0IHJlYWNoZXMgdGhlIGVuZCAiLgotICAgICAgICAqKiBDaGVjayBpZiB0aGVyZSBpcyBhIHNwYWNlIGZvbGxvd2luZyB0aGUgIgotICAgICAgICAqLwotICAgICAgICBpZiAoY2ggPT0gJyInKSB7Ci0gICAgICAgICAgICBjaCA9IGxlZkdldGMoKTsKLSAgICAgICAgICAgIGlmIChjaCAhPSAnICcgJiYgY2ggIT0gRU9GKSB7Ci0gICAgICAgICAgICAgICAgVU5sZWZHZXRjKGNoKTsKLSAgICAgICAgICAgICAgICBsZWZEYXRhLT5zcGFjZU1pc3NpbmcgPSAxOwotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFVObGVmR2V0YyhjaCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotCi0gICAgaWYgKGxlZkRhdGEtPm5hbWVzQ2FzZVNlbnNpdGl2ZSkgewotICAgICAgICBmb3IgKDsgOyBjaCA9IGxlZkdldGMoKSkgewotICAgICAgICAgICAgLyogNS82LzIwMDggLSBDQ1IgNTU2ODE4Ci0gICAgICAgICAgICAqKiBDaGVjayBpZiB0aGUgY2ggaXMgYSB2YWxpZCBhc2NpaSBjaGFyYWN0ZXIgMCA9PCBjaCA8IDEyOAotICAgICAgICAgICAgKiogSWYgbm90IHdyaXRlIG91dCBhbiBlcnJvcgotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICgoY2ggPCAtMSkgfHwgKGNoID4gMTI3KSkgewotICAgICAgICAgICAgICAgIGxlZkRhdGEtPmxlZkludmFsaWRDaGFyID0gMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNoID09ICcgJyB8fCBjaCA9PSAnXHQnIHx8IGNoID09ICdcbicgfHwgY2ggPT0gRU9GKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAqcyA9IGNoOwotICAgICAgICAgICAgSW5jQ3VyUG9zKCZzLCBidWZmZXIsIGJ1ZmZlclNpemUpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChsZWZTZXR0aW5ncy0+U2hpZnRDYXNlKSB7IC8vIHdlIGFyZSBjYXNlIGluc2Vuc2l0aXZlLCB1c2UgYSBkaWZmZXJlbnQgbG9vcCAKLSAgICAgICAgZm9yICg7IDsgY2ggPSBsZWZHZXRjKCkpIHsKLSAgICAgICAgICAgIC8qIDUvNi8yMDA4IC0gQ0NSIDU1NjgxOAotICAgICAgICAgICAgKiogQ2hlY2sgaWYgdGhlIGNoIGlzIGEgdmFsaWQgYXNjaWkgY2hhcmFjdGVyIDAgPTwgY2ggPCAxMjgKLSAgICAgICAgICAgICoqIElmIG5vdCB3cml0ZSBvdXQgYW4gZXJyb3IKLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoKGNoIDwgLTEpIHx8IChjaCA+IDEyNykpIHsKLSAgICAgICAgICAgICAgICBsZWZEYXRhLT5sZWZJbnZhbGlkQ2hhciA9IDE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjaCA9PSAnICcgfHwgY2ggPT0gJ1x0JyB8fCBjaCA9PSAnXG4nIHx8IGNoID09IEVPRikKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICpzID0gKGNoID49ICdhJyAmJiBjaCA8PSAneicpPyAoY2ggLSAnYScgKyAnQScpIDogY2g7Ci0gICAgICAgICAgICBJbmNDdXJQb3MoJnMsIGJ1ZmZlciwgYnVmZmVyU2l6ZSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKDsgOyBjaCA9IGxlZkdldGMoKSkgewotICAgICAgICAgICAgLyogNS82LzIwMDggLSBDQ1IgNTU2ODE4Ci0gICAgICAgICAgICAqKiBDaGVjayBpZiB0aGUgY2ggaXMgYSB2YWxpZCBhc2NpaSBjaGFyYWN0ZXIgMCA9PCBjaCA8IDEyOAotICAgICAgICAgICAgKiogSWYgbm90IHdyaXRlIG91dCBhbiBlcnJvcgotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICgoY2ggPCAtMSkgfHwgKGNoID4gMTI3KSkgewotICAgICAgICAgICAgICAgIGxlZkRhdGEtPmxlZkludmFsaWRDaGFyID0gMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNoID09ICcgJyB8fCBjaCA9PSAnXHQnIHx8IGNoID09ICdcbicgfHwgY2ggPT0gRU9GKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgCi0gICAgICAgICAgICAqcyA9IGNoOwotICAgICAgICAgICAgSW5jQ3VyUG9zKCZzLCBidWZmZXIsIGJ1ZmZlclNpemUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gSWYgd2UgZ290IHRoaXMgZmFyLCB0aGUgbGVmRGF0YS0+bGFzdCBjaGFyIHdhcyB3aGl0ZXNwYWNlIAotICAgICpzID0gJ1wwJzsKLSAgICBpZiAoY2ggIT0gRU9GKSAgIC8vIHNob3VsZG4ndCB1bmdldGMgYW4gRU9GIAotICAgICAgICBVTmxlZkdldGMoY2gpOwotICAgIHJldHVybiBUUlVFOwotfQotCi0vLyBjcmVhdGVzIGFuIHVwcGVyIGNhc2UgY29weSBvZiBhbiBhcnJheSAKLXZvaWQKLWxlZnVjX2FycmF5KGNoYXIgICAgKnNvdXJjZSwKLSAgICAgICAgICAgIGNoYXIgICAgKmRlc3QpCi17Ci0gICAgZm9yICg7ICpzb3VyY2UgIT0gMDsgKQotICAgICAgICAqZGVzdCsrID0gdG91cHBlcigqc291cmNlKyspOwotICAgICpkZXN0ID0gMDsKLX0gCi0KLXZvaWQgbGVmRXJyb3IoaW50ICAgICAgICAgICBtc2dOdW0sCi0gICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKnMpOwotCi12b2lkCi1sZWZTdG9yZUFsaWFzKCkKLXsKLSAgICBzdHJpbmcgICAgIHNvX2ZhcjsgLy8gY29udGFpbnMgYWxpYXMgY29udGVudHMgYXMgd2UgYnVpbGQgaXQgCi0KLSAgICBpbnQgdG9rZW5TaXplID0gMTAyNDA7Ci0gICAgY2hhciAqYW5hbWUgPSAoY2hhciopbWFsbG9jKHRva2VuU2l6ZSk7Ci0KLSAgICBHZXRUb2tlbigmYW5hbWUsICZ0b2tlblNpemUpOwotCi0gICAgY2hhciAqbGluZSA9IChjaGFyKikgbWFsbG9jKHRva2VuU2l6ZSk7Ci0KLSAgICBHZXRUb2tlbigmbGluZSwgJnRva2VuU2l6ZSk7ICAgICAvLyBzaG91bGQgYmUgIj0iIAotICAgIAotICAgIGNoYXIgICAgICAgICp1Y19saW5lID0gKGNoYXIqKW1hbGxvYyh0b2tlblNpemUpOwotCi0gICAgaWYgKHN0cmNtcChsaW5lLCAiPSIpICE9IDApCi0gICAgICAgIGxlZkVycm9yKDEwMDAsICJFeHBlY3RpbmcgJz0nIik7Ci0KLSAgICAvKiBub3cga2VlcCBnZXR0aW5nIGxpbmVzIHRpbGwgd2UgZ2V0IG9uZSB0aGF0IGNvbnRhaW5zICZFTkRBTElBUyAqLwotICAgIGZvcihjaGFyICpwID0gTlVMTDsgcCA9PSBOVUxMOyl7Ci0gICAgICAgIGludCBpOwotICAgICAgICBjaGFyICpzID0gbGluZTsKLSAgICAgICAgZm9yKGk9MDtpPHRva2VuU2l6ZS0xO2krKykgewotICAgICAgICAgICAgaW50IGNoID0gbGVmR2V0YygpOwotICAgICAgICAgICAgaWYgKGNoID09IEVPRikgewotICAgICAgICAgICAgICAgIGxlZkVycm9yKDEwMDEsICJFbmQgb2YgZmlsZSBpbiAmQUxJQVMiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICpzKysgPSBjaDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGNoID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICBwcmludF9ubGluZXMoKytsZWZEYXRhLT5sZWZfbmxpbmVzKTsgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAqcyA9ICdcMCc7Ci0gICAgICAgIGxlZnVjX2FycmF5KGxpbmUsIHVjX2xpbmUpOyAgICAgICAgICAgICAvLyBtYWtlIHVwcGVyIGNhc2UgY29weSAKLSAgICAgICAgcCA9IHN0cnN0cih1Y19saW5lLCAiJkVOREFMSUFTIik7ICAgICAgIC8vIGxvb2sgZm9yIEVORF9BTElBUyAKLSAgICAgICAgCi0gICAgICAgIGlmIChwICE9IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBmaW5kIGl0IAotICAgICAgICAgICAgKihsaW5lICsgKHAgLSB1Y19saW5lKSkgPSAwOyAgICAgICAgIC8vIHJlbW92ZSBpdCBmcm9tIHRoZSBsaW5lIAotCi0gICAgICAgIHNvX2ZhciArPSBsaW5lOwotICAgIH0KLQotICAgIGNoYXIgKmR1cCA9IChjaGFyKiltYWxsb2Moc3RybGVuKHNvX2Zhci5jX3N0cigpKSArIDEpOwotCi0gICAgc3RyY3B5KGR1cCwgc29fZmFyLmNfc3RyKCkpOwotICAgIGxlZkRhdGEtPmFsaWFzX3NldFtzdHJpcF9jYXNlKGFuYW1lKV0gPSBkdXA7Ci0KLQotICAgIGZyZWUoYW5hbWUpOwotICAgIGZyZWUobGluZSk7Ci0gICAgZnJlZSh1Y19saW5lKTsKLX0KLQotaW50IGxlZmFtcGVyX2xvb2t1cChjaGFyICp0b2tlbik7IC8vIGZvcndhcmQgcmVmZXJlbmNlIHRvIHRoaXMgcm91dGluZSAKLQotLyogVGhlIG1haW4gcm91dGluZSBjYWxsZWQgYnkgdGhlIFlBQ0MgcGFyc2VyIHRvIGdldCB0aGUgbGVmRGF0YS0+bmV4dCB0b2tlbi4KLSAqICAgIFJldHVybnMgMCBpZiBubyBtb3JlIHRva2VucyBhcmUgYXZhaWxhYmxlLgotICogICAgUmV0dXJucyBhbiBpbnRlZ2VyIGZvciBrZXl3b3JkcyAoc2VlIHRoZSB5YWNjX2RlZmluZXMuaCBmb3IgdmFsdWVzKQotICogICAgUmV0dXJucyB0aGUgY2hhcmFjdGVyIGl0c2VsZiBmb3IgcHVuY3R1YXRpb24KLSAqICAgIFJldHVybnMgTlVNQkVSIGZvciBudW1lcmljIGxvb2tpbmcgdG9rZW5zCi0gKiAgICBSZXR1cm5zIFRfU1RSSU5HIGZvciBhbnl0aGluZyBlbHNlCi0gKiBJZiB0aGUgZ2xvYmFsICJsZWZEYXRhLT5sZWZEdW1iTW9kZSIgaXMgPiAwLCBpdCByZWFkcyB0aGUgbGVmRGF0YS0+bmV4dCB0b2tlbiBpbiAiZHVtYiBtb2RlIi4KLSAqIEluIHRoaXMgY2FzZSwgaXQgZG9lcyBub3QgZG8ga2V5d29yZCBsb29rdXAsIG9yIGF0dGVtcHQgdG8gcmVhZCBhIHRva2VuCi0gKiBhcyBhIG51bWJlcjsgaWYgdGhlIHRva2VuIGlzIG5vdCBwdW5jdHVhdGlvbiwgaXQncyBhIFRfU1RSSU5HLiAgRWFjaCB0b2tlbgotICogcmVhZCBkZWNyZW1lbnRzIGxlZkRhdGEtPmxlZkR1bWJNb2RlLCBzbyB5b3UgY2FuIGluc3RydWN0IHRoZSB0aGUgbGV4ZXIgdG8gcmVhZCB0aGUKLSAqIGxlZkRhdGEtPm5leHQgTiB0b2tlbnMgaW4gZHVtYiBtb2RlIGJ5IHNldHRpbmcgImxlZkRhdGEtPmxlZkR1bWJNb2RlIiB0byB0aGF0IHZhbHVlLgotICoKLSAqIE5ld2xpbmVzIGFyZSBpbiBnZW5lcmFsIHNpbGVudGx5IGlnbm9yZWQuICBJZiB0aGUgZ2xvYmFsIGxlZkRhdGEtPmxlZk5sVG9rZW4gaXMKLSAqIHRydWUsIGhvd2V2ZXIsIHRoZXkgYXJlIHJldHVybmVkIGFzIHRoZSB0b2tlbiBLX05MLgotICovCi1leHRlcm4gaW50IGxlZnN1YmxleCgpOwotCi1pbnQKLXl5bGV4KCkKLXsKLSAgICBpbnQgdiA9IGxlZnN1YmxleCgpOwotCi0gICAgaWYgKGxlZkRhdGEtPmxlZkRlYnVnWzEzXSkgewotICAgICAgICBpZiAodiA9PSAwKSB7Ci0gICAgICAgICAgICBwcmludGYoInl5bGV4IE5JTFxuIik7Ci0gICAgICAgIH0gZWxzZSBpZiAodiA8IDI1NikgewotICAgICAgICAgICAgcHJpbnRmKCJ5eWxleCBjaGFyICVjXG4iLCB2KTsKLSAgICAgICAgfSBlbHNlIGlmICh2ID09IFFTVFJJTkcpIHsKLSAgICAgICAgICAgIHByaW50ZigieXlsZXggcXVvdGVkIHN0cmluZyAnJXMnXG4iLCB5eWx2YWwuc3RyaW5nKTsKLSAgICAgICAgfSBlbHNlIGlmICh2ID09IFRfU1RSSU5HKSB7Ci0gICAgICAgICAgICBwcmludGYoInl5bGV4IHN0cmluZyAnJXMnXG4iLCB5eWx2YWwuc3RyaW5nKTsKLSAgICAgICAgfSBlbHNlIGlmICh2ID09IE5VTUJFUikgewotICAgICAgICAgICAgcHJpbnRmKCJ5eWxleCBudW1iZXIgJWZcbiIsIHl5bHZhbC5kdmFsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByaW50ZigieXlsZXgga2V5d29yZCAlc1xuIiwgbGVmX2t5d2QodikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gQXQgNS42LCBsZWZEYXRhLT5kb25lTGliIGlzIGFsd2F5cyB0cnVlLCBzaW5jZSAiRU5EIExJQlJBUlkiIGlzIG9wdGlvbmFsIAotICAgIGlmICgodiA9PSAwKSAmJiAoIWxlZkRhdGEtPmRvbmVMaWIpKSB7Ci0gICAgICAgIGlmICghbGVmRGF0YS0+c3BhY2VNaXNzaW5nKSB7Ci0gICAgICAgICAgICBsZWZFcnJvcigxMDAyLCAiSW5jb21wbGV0ZSBsZWYgZmlsZS4iKTsKLSAgICAgICAgICAgIGxlZkRhdGEtPmhhc0ZhdGFsRXJyb3IgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICgtMSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHY7Ci19Ci0KLWludAotbGVmc3VibGV4KCkKLXsKLQotICAgIGNoYXIgICAgZmM7Ci0gICAgZG91YmxlICBudW1WYWw7Ci0gICAgY2hhciAgICAqb3V0U3RyOwotCi0gICAgc3RyY3B5KGxlZkRhdGEtPnB2X3Rva2VuLCBsZWZEYXRhLT5jdXJyZW50X3Rva2VuKTsgICAvLyBzYXZlIHRoZSBwcmV2aW91cyB0b2tlbiAKLQotICAgIC8qIEZpcnN0LCB3ZSBlYXQgYWxsIHRoZSB0aGluZ3MgdGhlIHBhcnNlciBzaG91bGQgYmUgdW5hd2FyZSBvZi4KLSAgICAgKiBUaGlzIGluY2x1ZGVzOgotICAgICAqIGEpIENvbW1lbnRzCi0gICAgICogYikgJmFsaWFzIGRlZmluaXRpb25zCi0gICAgICogYykgJmFsaWFzIGV4cGFuc2lvbnMKLSAgICAgKi8KLQotICAgIGZvciAoOyA7ICkgewotICAgICAgICBpZiAoIUdldFRva2VuKCZsZWZEYXRhLT5jdXJyZW50X3Rva2VuLCAmbGVmRGF0YS0+dG9rZW5TaXplKSkgICAgLy8gZ2V0IGEgcmF3IHRva2VuIAotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgLy8gVG9rZW4gc2l6ZSBjYW4gY2hhbmdlLiBEbyBwcmV2ZW50aXZlIHJlLWFsbG9jLiAKLSAgICAgICAgbGVmRGF0YS0+dWNfdG9rZW4gPSAoY2hhciopIHJlYWxsb2MobGVmRGF0YS0+dWNfdG9rZW4sIGxlZkRhdGEtPnRva2VuU2l6ZSk7Ci0gICAgICAgIGxlZkRhdGEtPnB2X3Rva2VuID0gKGNoYXIqKSByZWFsbG9jKGxlZkRhdGEtPnB2X3Rva2VuLCBsZWZEYXRhLT50b2tlblNpemUpOwotCi0gICAgICAgIGZjID0gbGVmRGF0YS0+Y3VycmVudF90b2tlblswXTsKLQotICAgICAgICAvKiBsZWZEYXRhLT5maXJzdCwgY2hlY2sgZm9yIGNvbW1lbnRzIG9yICZhbGlhcyBzdGF0ZW1lbnRzLiAgQ29tbWVudHMgd2UKLSAgICAgICAgICogaWdub3JlLCBhbmQgJmFsaWFzIHN0YXRlbWVudHMgYXJlIGVhdGVuIGFuZCByZWNvcmRlZCBieSB0aGUgbGV4ZXIuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoZmMgPT0gbGVmU2V0dGluZ3MtPkNvbW1lbnRDaGFyKSB7Ci0gICAgICAgICAgICBmb3IgKGZjID0gbGVmR2V0YygpOyA7IGZjID0gbGVmR2V0YygpKSB7Ly8gc28gc2tpcCB0byB0aGUgZW5kIG9mIGxpbmUgCi0gICAgICAgICAgICAgICAgaWYgKGZjID09IEVPRikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgaWYgKGZjID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRfbmxpbmVzKCsrbGVmRGF0YS0+bGVmX25saW5lcyk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChmYyA9PSAnJicpIHsKLSAgICAgICAgICAgIC8vIGJlZ2lucyB3aXRoICYuICBJZiAmYWxpYXMsIHJlYWQgY29udGVudHMgYW5kIAotICAgICAgICAgICAgLy8gc3RvcmUgdGhlbS4gIE90aGVyd2lzZSBpdCdzIGEgZGVmaW5lLCBvciBhIG1hY3JvIHVzZS4gCi0gICAgICAgICAgICBjb25zdCBjaGFyICpjcHRyOwotICAgICAgICAgICAgbGVmdWNfYXJyYXkobGVmRGF0YS0+Y3VycmVudF90b2tlbiwgbGVmRGF0YS0+dWNfdG9rZW4pOwotICAgICAgICAgICAgaWYgKHN0cmNtcChsZWZEYXRhLT51Y190b2tlbiwgIiZBTElBUyIpID09IDApCi0gICAgICAgICAgICAgICAgbGVmU3RvcmVBbGlhcygpOyAgICAvLyByZWFkIGFuZCBzdG9yZSB0aGUgYWxpYXMgCi0gICAgICAgICAgICBlbHNlIGlmIChzdHJuY21wKGxlZkRhdGEtPnVjX3Rva2VuLCAiJkRFRklORSIsIDcpID09IDApIHsKLSAgICAgICAgICAgICAgICBsZWZEYXRhLT5pbkRlZmluZSA9IDE7ICAgICAgIC8vIGl0IGlzIGEgZGVmaW5lIHN0YXRlbWVudCAKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGVmR2V0QWxpYXMobGVmRGF0YS0+Y3VycmVudF90b2tlbiwgJmNwdHIpKQotICAgICAgICAgICAgICAgIGxlZkRhdGEtPmN1cnJlbnRfc3RhY2tbKytsZWZEYXRhLT5pbnB1dF9sZXZlbF0gPSBjcHRyOwotICAgICAgICAgICAgZWxzZSBpZiAobGVmR2V0U3RyaW5nRGVmaW5lKGxlZkRhdGEtPmN1cnJlbnRfdG9rZW4sICZjcHRyKSAmJiAhbGVmRGF0YS0+aW5EZWZpbmUpCi0gICAgICAgICAgICAgICAgbGVmRGF0YS0+Y3VycmVudF9zdGFja1srK2xlZkRhdGEtPmlucHV0X2xldmVsXSA9IGNwdHI7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYnJlYWs7ICAgIC8vIGJlZ2lucyB3aXRoICYsIGJ1dCBub3QgYW4gJmFsaWFzIGRlZm4uIG9yIHVzZS4gCi0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgYnJlYWs7ICAgIC8vIGRvZXMgbm90IGJlZ2luIHdpdGggQ29tbWVudENoYXIgb3IgJyYnIAotICAgIH0KLQotICAgIGlmIChsZWZEYXRhLT5sZWZJbnZhbGlkQ2hhcikgewotICAgICAgICBvdXRTdHIgPSAoY2hhciopIGxlZk1hbGxvYyg1MDAgKyBzdHJsZW4obGVmRGF0YS0+Y3VycmVudF90b2tlbikpOwotICAgICAgICBzcHJpbnRmKG91dFN0ciwgIkludmFsaWQgY2hhcmFjdGVycyBmb3VuZCBpbiBcJyVzXCcuXG5UaGVzZSBjaGFyYWN0ZXJzIG1pZ2h0IGhhdmUgY3JlYXRlZCBieSBjaGFyYWN0ZXIgdHlwZXMgb3RoZXIgdGhhbiBFbmdsaXNoLiIsCi0gICAgICAgICAgICAgICAgbGVmRGF0YS0+Y3VycmVudF90b2tlbik7Ci0gICAgICAgIGxlZkVycm9yKDEwMDgsIG91dFN0cik7Ci0gICAgICAgIGxlZkZyZWUob3V0U3RyKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKGxlZkRhdGEtPmdlNTZhbG1vc3REb25lICYmIChzdHJjbXAobGVmRGF0YS0+Y3VycmVudF90b2tlbiwgIkVORCIpID09IDApKSB7Ci0gICAgICAgIC8vIExpYnJhcnkgaGFzIEJFR0lORVhUIGFuZCBhbHNvIGVuZCB3aXRoIEVORCBMSUJSQVJZIAotICAgICAgICAvLyBVc2UgRU5EIExJQlJBUlkgdG8gaW5kaWNhdGUgdGhlIGVuZCBvZiB0aGUgbGlicmFyeSAKLSAgICAgICAgbGVmRGF0YS0+Z2U1NmFsbW9zdERvbmUgPSAwOwotICAgIH0KLQotICAgIGlmICgobGVmRGF0YS0+ZG9uZUxpYiAmJiBsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS42KSB8fCAvLyBFTkQgTElCUkFSWSBpcyBwYXNzZWQgZm9yIHByZSA1LjYgCi0gICAgICAgIChsZWZEYXRhLT5nZTU2YWxtb3N0RG9uZSAmJiAoc3RyY21wKGxlZkRhdGEtPmN1cnJlbnRfdG9rZW4sICJFTkQiKSkpIHx8IC8vIGFmdGVyIEVYVCwgbm90IAotICAgICAgICAvLyBmb2xsb3cgYnkgRU5EIAotICAgICAgICAobGVmRGF0YS0+Z2U1NmRvbmUpKSB7ICAgICAgICAgICAgICAgICAgICAgLy8gRU5EIExJQlJBUlkgaXMgcGFzc2VkIGZvciA+PSA1LjYgCi0gICAgICAgIGZjID0gRU9GOwotICAgICAgICBsZWZJbmZvKDMwMDAsICJUaGVyZSBhcmUgc3RpbGwgZGF0YSBhZnRlciB0aGUgRU5EIExJQlJBUlkiKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKGZjID09ICdcIicpIHsKLSAgICAgICAgeXlsdmFsLnN0cmluZyA9IHJpbmdDb3B5KCYobGVmRGF0YS0+Y3VycmVudF90b2tlblsxXSkpOwotICAgICAgICByZXR1cm4gUVNUUklORzsKLSAgICB9Ci0KLSAgICAvLyBhdCB0aGlzIHBvaW50IHdlJ3ZlIHJlYWQgYSB0b2tlbiAKLSAgICAvLyBwcmludGYoIlRva2VuIGlzICVzXG4iLCB0b2tlbik7IAotICAgIGxlZkRhdGEtPmxlZkR1bWJNb2RlLS07Ci0gICAgbGVmRGF0YS0+bGVmTm9OdW0tLTsKLSAgICBpZiAoaXNkaWdpdChmYykgfHwgZmMgPT0gJy4nIHx8IChmYyA9PSAnLScgJiYgbGVmRGF0YS0+Y3VycmVudF90b2tlblsxXSAhPSAnXDAnKSkgewotICAgICAgICBjaGFyICpjaDsKLSAgICAgICAgbnVtVmFsID0geXlsdmFsLmR2YWwgPSBzdHJ0b2QobGVmRGF0YS0+Y3VycmVudF90b2tlbiwgJmNoKTsKLSAgICAgICAgaWYgKGxlZkRhdGEtPmxlZk5vTnVtIDwgMCAmJiAqY2ggPT0gJ1wwJykgeyAgICAvLyBkaWQgd2UgdXNlIHRoZSB3aG9sZSBzdHJpbmc/IAotICAgICAgICAgICAgICAgIHJldHVybiBOVU1CRVI7Ci0gICAgICAgIH0gZWxzZSB7ICAvLyBmYWlsZWQgaW50ZWdlciBjb252ZXJzaW9uLCB0cnkgZmxvYXRpbmcgcG9pbnQgCi0gICAgICAgICAgICAgICAgeXlsdmFsLnN0cmluZyA9IHJpbmdDb3B5KGxlZkRhdGEtPmN1cnJlbnRfdG9rZW4pOyAgLy8gTk8sIGl0J3MgYSBzdHJpbmcgCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRfU1RSSU5HOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAvLyA1LzE3LzIwMDQgLSBTcGVjaWFsIGNoZWNraW5nIGZvciBub25kZWZhdWx0cnVsZSAKLSAgICBpZiAobGVmRGF0YS0+bGVmTmRSdWxlICYmIChzdHJjbXAobGVmRGF0YS0+Y3VycmVudF90b2tlbiwgIkVORCIpICE9IDApKSB7Ci0gICAgICAgIGlmIChzdHJjbXAobGVmRGF0YS0+Y3VycmVudF90b2tlbiwgbGVmRGF0YS0+bmROYW1lKSA9PSAwKSB7Ci0gICAgICAgICAgICB5eWx2YWwuc3RyaW5nID0gcmluZ0NvcHkobGVmRGF0YS0+Y3VycmVudF90b2tlbik7ICAvLyBhIG5kIHJ1bGUgbmFtZSAKLSAgICAgICAgICAgIHJldHVybiBUX1NUUklORzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIENhbiBiZSBOT05ERUZBVUxUUlVMRSBFTkQgd2l0aG91dCBuYW1lLCB0aGlzIGNhc2UsIHN0cmluZyAKLSAgICAgICAgICAgIC8vIHNob3VsZCBiZSBhIHJlc2VydmUgd29yZCAgb3IgbmFtZSBpcyBpbmNvcnJlY3QgCi0gICAgICAgICAgICAvLyBsZWZEYXRhLT5maXJzdCBjaGVjayBpZiBpdCBpcyBhIHJlc2VydmUgd29yZCAKLSAgICAgICAgICAgIGxlZkRhdGEtPmxlZkR1bWJNb2RlID0gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gaWYgd2UgYXJlIGR1bWIgbW9kZSwgYWxsIHdlIHJldHVybiBpcyBwdW5jdHVhdGlvbiBhbmQgc3RyaW5ncyAmIG51bWJlcnMKLSAgICAvLyB1bnRpbCB3ZSBzZWUgdGhlIGxlZkRhdGEtPm5leHQgJysnIG9yICc7JyB0b2tlbiAKLSAgICBpZiAobGVmRGF0YS0+bGVmRHVtYk1vZGUgPj0gMCkgewotICAgICAgICBpZiAobGVmRGF0YS0+Y3VycmVudF90b2tlblsxXSA9PSAnXDAnICYmIChmYyA9PSAnKCcgfHwgZmMgPT0gJyknIHx8IGZjID09ICcrJyB8fCBmYyA9PSAnOycgfHwgZmMgPT0gJyonKSkgewotICAgICAgICAgICAgaWYgKGZjID09ICc7JyB8fCBmYyA9PSAnKycpCi0gICAgICAgICAgICAgICAgbGVmRGF0YS0+bGVmRHVtYk1vZGUgPSAwOwotICAgICAgICAgICAgcmV0dXJuIChpbnQpIGZjOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsZWZEYXRhLT5sZWZOZXdJc0tleXdvcmQgJiYgc3RyY21wKGxlZkRhdGEtPmN1cnJlbnRfdG9rZW4sICJORVciKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gS19ORVc7IC8vIGV2ZW4gaW4gZHVtYiBtb2RlLCB3ZSBtdXN0IHNlZSB0aGUgTkVXIHRva2VuIAotICAgICAgICB9Ci0gICAgICAgIHl5bHZhbC5zdHJpbmcgPSByaW5nQ29weShsZWZEYXRhLT5jdXJyZW50X3Rva2VuKTsKLSAgICAgICAgLy8gNS8xNy8yMDA0IC0gU3BlY2lhbCBjaGVja2luZyBmb3Igbm9uZGVmYXVsdHJ1bGUgCi0gICAgICAgIGlmIChsZWZEYXRhLT5sZWZOZFJ1bGUpIHsKLSAgICAgICAgICAgIGlmIChzdHJjbXAobGVmRGF0YS0+Y3VycmVudF90b2tlbiwgbGVmRGF0YS0+bmROYW1lKSA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBUX1NUUklORzsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIENhbiBiZSBOT05ERUZBVUxUUlVMRSBFTkQgd2l0aG91dCBuYW1lLCB0aGlzIGNhc2UsIHN0cmluZyAKLSAgICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgYSByZXNlcnZlIHdvcmQgIG9yIG5hbWUgaXMgaW5jb3JyZWN0IAotICAgICAgICAgICAgICAgIC8vIGxlZkRhdGEtPmZpcnN0IGNoZWNrIGlmIGl0IGlzIGEgcmVzZXJ2ZSB3b3JkIAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUX1NUUklORzsKLSAgICB9Ci0KLSAgICAvLyBpZiB3ZSBnZXQgaGVyZSB3ZSBhcmUgaW4gc21hcnQgbW9kZS4gIFBhcnNlIHRva2VuIAotICAgIGlmIChpc2FscGhhKGZjKSB8fCBmYyA9PSAnJicgfHwgZmMgPT0gJ18nKSB7Ci0gICAgICAgIGludCAgICAgcmVzdWx0OwotICAgICAgICBjaGFyICAgICpjaCwgKnVjaDsKLQotICAgICAgICBmb3IgKGNoID0gbGVmRGF0YS0+Y3VycmVudF90b2tlbiwgdWNoID0gbGVmRGF0YS0+dWNfdG9rZW47ICpjaCAhPSAnXDAnOyBjaCsrKQotICAgICAgICAgICAgKnVjaCsrID0gdG91cHBlcigqY2gpOwotICAgICAgICAqdWNoID0gJ1wwJzsKLQotICAgICAgICBsZWZEYXRhLT5IaXN0X3RleHQucmVzaXplKDApOwotCi0gICAgICAgIGlmIChsZWZHZXRLZXl3b3JkKGxlZkRhdGEtPnVjX3Rva2VuLCAmcmVzdWx0KSkgewotICAgICAgICAgICAgaWYgKEtfSElTVE9SWSA9PSByZXN1bHQpIHsgIC8vIGhpc3RvcnkgLSBnZXQgdXAgdG8gJzsnIAotICAgICAgICAgICAgICAgIGludCBjOwotICAgICAgICAgICAgICAgIGludCBwcmV2OwotICAgICAgICAgICAgICAgIHByZXYgPSAnICc7Ci0gICAgICAgICAgICAgICAgZm9yICg7IDsgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGMgPSBsZWZHZXRjKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gRU9GKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZWZFcnJvcig2MDE1LCAiVW5leHBlY3RlZCBlbmQgb2YgdGhlIExFRiBmaWxlLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGVmRGF0YS0+aGFzRmF0YWxFcnJvciA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjID09ICc7JyAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKHByZXYgPT0gJyAnIHx8IHByZXYgPT0gJ1x0JyB8fCBwcmV2ID09ICdcbicpKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGwgdGhlIGNhbGxiYWNrIGxpbmUgbnVtYmVyIGZ1bmN0aW9uIGlmIGl0IGlzIHNldCAKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X25saW5lcygrK2xlZkRhdGEtPmxlZl9ubGluZXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHByZXYgPSBjOwotICAgICAgICAgICAgICAgICAgICBsZWZEYXRhLT5IaXN0X3RleHQucHVzaF9iYWNrKGMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsZWZEYXRhLT5IaXN0X3RleHQucHVzaF9iYWNrKCdcMCcpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChLX0JFR0lORVhUID09IHJlc3VsdCkgeyAvLyBleHRlbnNpb24sIGdldCB1cCB0byBlbmQgCi0gICAgICAgICAgICAgICAgaW50IGNjOwotICAgICAgICAgICAgICAgIGludCBmb3VuZFRhZyA9IDA7Ci0gICAgICAgICAgICAgICAgaW50IG5vdEVtcFRhZyA9IDA7Ci0gICAgICAgICAgICAgICAgaW50IGJlZ1F1b3RlID0gMDsKLSAgICAgICAgICAgICAgICAvLyBGaXJzdCBtYWtlIHN1cmUgdGhlcmUgaXMgYSBuYW1lIGFmdGVyIEJFR0lORVhUIHdpdGhpbiBxdW90ZSAKLSAgICAgICAgICAgICAgICAvLyBCRUdJTkVYVCAibmFtZSIgCi0gICAgICAgICAgICAgICAgZm9yIChjYyA9IGxlZkdldGMoKTsgOyBjYyA9IGxlZkdldGMoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY2MgPT0gRU9GKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgLy8gbGVmIGZpbGUgbWF5IG5vdCBoYXZlIEVORCBMSUIgCi0gICAgICAgICAgICAgICAgICAgIGlmIChjYyA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kVGFnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmRXJyb3IoMTAwMywgInRhZyBpcyBtaXNzaW5nIGZvciBCRUdJTkVYVCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB0YWcgaXMgcXVvdGVkIAotICAgICAgICAgICAgICAgICAgICAgICAgbGVmRGF0YS0+SGlzdF90ZXh0LnB1c2hfYmFjayhjYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2MgIT0gJyAnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNjID09ICdcIicpIHsgICAvLyBmb3VuZCBhIHF1b3RlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJlZ1F1b3RlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnUXVvdGUgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChub3RFbXBUYWcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kVGFnID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgIC8vIEZvdW5kIHRoZSBxdW90ZWQgdGFnIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmRXJyb3IoMTAwNCwgIlRhZyBmb3IgQkVHSU5FWFQgaXMgZW1wdHkiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghYmVnUXVvdGUpIHsgICAvLyBhbnl0aGluZyBidXQgYSBxdW90ZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmRXJyb3IoMTAwNSwgIlwiIGlzIG1pc3NpbmcgaW4gdGFnIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSAgICAgICAgICAgICAvLyBhbnl0aGluZyBidXQgYSBxdW90ZSBhbmQgdGhlcmUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdEVtcFRhZyA9IDE7ICAgLy8gaXMgYWxyZWFkeSBhIHF1b3RlIAotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChmb3VuZFRhZykgewotICAgICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGhhbmRsZSB3aXRoIHRoZSB0YWcsIGp1c3QgcmVhZCB0aGUgcmVzdCB1bnRpbCAKLSAgICAgICAgICAgICAgICAgICAgLy8gRU5ERVhUIAotICAgICAgICAgICAgICAgICAgICBiZWdRdW90ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoY2MgPSBsZWZHZXRjKCk7IDsgY2MgPSBsZWZHZXRjKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYyA9PSBFT0YpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgLy8gbGVmIGZpbGUgbWF5IG5vdCBoYXZlIEVORCBMSUIgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2MgPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGwgdGhlIGNhbGxiYWNrIGxpbmUgbnVtYmVyIGZ1bmN0aW9uIGlmIGl0IGlzIHNldCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF9ubGluZXMoKytsZWZEYXRhLT5sZWZfbmxpbmVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2MgPT0gJ1wiJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYmVnUXVvdGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ1F1b3RlID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ1F1b3RlID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxlZkRhdGEtPkhpc3RfdGV4dC5wdXNoX2JhY2soY2MpOyAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGlzdFRleHRTaXplID0gbGVmRGF0YS0+SGlzdF90ZXh0LnNpemUoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhpc3RUZXh0U2l6ZSA+PSA2ICYmIG1lbWNtcCgmbGVmRGF0YS0+SGlzdF90ZXh0W2hpc3RUZXh0U2l6ZSAtIDYgXSwgIkVOREVYVCIsIDYpID09IDApIHsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJlZ1F1b3RlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZFcnJvcigxMDA2LCAiRW5kaW5nIFwiIGlzIG1pc3NpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGlzdFRleHRTaXplID49IDExICYmIG1lbWNtcCgmbGVmRGF0YS0+SGlzdF90ZXh0W2hpc3RUZXh0U2l6ZSAtIDExIF0sICJFTkQgTElCUkFSWSIsIDExKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmRXJyb3IoMTAwNywgIkVOREVYVCBpcyBtaXNzaW5nIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGVmRGF0YS0+SGlzdF90ZXh0LnB1c2hfYmFjaygnXDAnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7ICAgICAgICAvLyBZRVMsIHJldHVybiBpdHMgdmFsdWUgCi0gICAgICAgIH0gZWxzZSB7ICAvLyB3ZSBkb24ndCBoYXZlIGEga2V5d29yZC4gIAotICAgICAgICAgICAgaWYgKGZjID09ICcmJykKLSAgICAgICAgICAgICAgICByZXR1cm4gbGVmYW1wZXJfbG9va3VwKGxlZkRhdGEtPmN1cnJlbnRfdG9rZW4pOwotICAgICAgICAgICAgeXlsdmFsLnN0cmluZyA9IHJpbmdDb3B5KGxlZkRhdGEtPmN1cnJlbnRfdG9rZW4pOyAgLy8gTk8sIGl0J3MgYSBzdHJpbmcgCi0gICAgICAgICAgICByZXR1cm4gVF9TVFJJTkc7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgeyAgLy8gaXQgc2hvdWxkIGJlIGEgcHVuY3R1YXRpb24gY2hhcmFjdGVyIAotICAgICAgICBpZiAobGVmRGF0YS0+Y3VycmVudF90b2tlblsxXSAhPSAnXDAnKSB7Ci0gICAgICAgICAgICBpZiAoc3RyY21wKGxlZkRhdGEtPmN1cnJlbnRfdG9rZW4sICI+PSIpID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIEtfR0U7Ci0gICAgICAgICAgICBpZiAoc3RyY21wKGxlZkRhdGEtPmN1cnJlbnRfdG9rZW4sICI8PSIpID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIEtfTEU7Ci0gICAgICAgICAgICBpZiAoc3RyY21wKGxlZkRhdGEtPmN1cnJlbnRfdG9rZW4sICI8PiIpID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIEtfTkU7Ci0gICAgICAgICAgICBpZiAobGVmRGF0YS0+Y3VycmVudF90b2tlblswXSA9PSAnOycpIHsgLy8gd2UgZ290ICc7VE9LRU4nIHdoaWNoIGlzIG5vdCBhbGxvd2VkIGJ5Ci0gICAgICAgICAgICAgICAgLy8nOycgY2Fubm90IGJlIGF0dGFjaGVkIHRvIG90aGVyIHRva2Vucy4KLSAgICAgICAgICAgICAgICBsZWZFcnJvcigxMDA5LCAiU3ltYm9sICc7JyBzaG91bGQgYmUgc2VwYXJhdGVkIGJ5IHNwYWNlKHMpLiIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIC8vIHN0cmNweShzYXZlZF90b2tlbiwgJnRva2VuWzFdKTsgLy8gdGhlIHN0YW5kYXJkIHN5bnRheCwgYnV0IAotICAgICAgICAgICAgICAgIC8vIHN0YWNrWysrbGVmRGF0YS0+aW5wdXRfbGV2ZWxdID0gc2F2ZWRfdG9rZW47IC8vIEMzIGFuZCBHRSBzdXBwb3J0LiAKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+Y3VycmVudF90b2tlblswXSA9PSAnXycpIHsvLyBuYW1lIHN0YXJ0cyB3aXRoIF8sIHJldHVybiBhcyBUX1NUUklORyAKLSAgICAgICAgICAgICAgICB5eWx2YWwuc3RyaW5nID0gcmluZ0NvcHkobGVmRGF0YS0+Y3VycmVudF90b2tlbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRfU1RSSU5HOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsZWZFcnJvcig2MDE2LCAiT2RkIHB1bmN0dWF0aW9uIGZvdW5kLiIpOwotICAgICAgICAgICAgICAgIGxlZkRhdGEtPmhhc0ZhdGFsRXJyb3IgPSAxOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHN0cmxlbihsZWZEYXRhLT5jdXJyZW50X3Rva2VuKSA+IDIKLSAgICAgICAgICAgICAgICAgICB8fCBzdHJsZW4obGVmRGF0YS0+Y3VycmVudF90b2tlbikgPT0gMCkgewotICAgICAgICAgICAgbGVmRXJyb3IoNjAxNiwgIk9kZCBwdW5jdHVhdGlvbiBmb3VuZC4iKTsKLSAgICAgICAgICAgIGxlZkRhdGEtPmhhc0ZhdGFsRXJyb3IgPSAxOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChpbnQpIGxlZkRhdGEtPmN1cnJlbnRfdG9rZW5bMF07Ci0gICAgfQotfQotCi0vKiBXZSBoYXZlIGZvdW5kIGEgdG9rZW4gYmVnaW5uaW5nIHdpdGggJyYnLiAgSWYgaXQgaGFzIGJlZW4gcHJldmlvdXNseQotICAgZGVmaW5lZCwgc3Vic3RpdHV0ZSB0aGUgZGVmaW5pdGlvbi4gIE90aGVyd2lzZSByZXR1cm4gaXQuICovCi1pbnQKLWxlZmFtcGVyX2xvb2t1cChjaGFyICp0a24pCi17Ci0gICAgZG91YmxlICAgICAgICBkcHRyOwotICAgIGludCAgICAgICAgICAgcmVzdWx0OwotICAgIGNvbnN0IGNoYXIgICAgKmNwdHI7Ci0KLSAgICAvLyBwcmludGYoIkFtcGVyX2xvb2t1cDogJXNcbiIsIHRrbik7IAotCi0gICAgLy8gJmRlZmluZSByZXR1cm5zIGEgbnVtYmVyIAotICAgIGlmIChsZWZHZXREb3VibGVEZWZpbmUodGtuLCAmZHB0cikpIHsKLSAgICAgICAgeXlsdmFsLmR2YWwgPSBkcHRyOwotICAgICAgICByZXR1cm4gTlVNQkVSOwotICAgIH0KLSAgICAvLyAmZGVmaW5lYiByZXR1cm5zIFRSVUUgb3IgRkFMU0UsIGVuY29kZWQgYXMgS19UUlVFIG9yIEtfRkFMU0UgCi0gICAgaWYgKGxlZkdldEludERlZmluZSh0a24sICZyZXN1bHQpKQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIC8vICZkZWZpbmVzIHJldHVybnMgYSBUX1NUUklORyAKLSAgICBpZiAobGVmR2V0U3RyaW5nRGVmaW5lKHRrbiwgJmNwdHIpKSB7Ci0gICAgICAgIGlmIChsZWZHZXRLZXl3b3JkKGNwdHIsICZyZXN1bHQpKQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgeXlsdmFsLnN0cmluZyA9IHJpbmdDb3B5KGNwdHIpOwotICAgICAgICByZXR1cm4gKGNwdHJbMF0gPT0gJ1wiJyA/IFFTVFJJTkcgOiBUX1NUUklORyk7Ci0gICAgfQotICAgIC8vIGlmIG5vbmUgb2YgdGhlIGFib3ZlLCBqdXN0IHJldHVybiB0aGUgdG9rZW4uIAotICAgIHl5bHZhbC5zdHJpbmcgPSByaW5nQ29weSh0a24pOwotICAgIHJldHVybiBUX1NUUklORzsKLX0KLQotdm9pZAotbGVmRXJyb3IoaW50ICAgICAgICBtc2dOdW0sCi0gICAgICAgICBjb25zdCBjaGFyICpzKQotewotICAgIGNoYXIgICAgICAgICpzdHI7Ci0gICAgY29uc3QgY2hhciAgKmN1clRva2VuID0gaXNncmFwaChsZWZEYXRhLT5jdXJyZW50X3Rva2VuWzBdKSA/IGxlZkRhdGEtPmN1cnJlbnRfdG9rZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIjx1bnByaW50YWJsZT4iOwotICAgIGNvbnN0IGNoYXIgICpwdlRva2VuID0gaXNncmFwaChsZWZEYXRhLT5wdl90b2tlblswXSkgPyBsZWZEYXRhLT5wdl90b2tlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiPHVucHJpbnRhYmxlPiI7Ci0gICAgaW50ICAgICAgICAgbGVuID0gc3RybGVuKGN1clRva2VuKSAtIDE7Ci0gICAgaW50ICAgICAgICAgcHZMZW4gPSBzdHJsZW4ocHZUb2tlbikgLSAxOwotCi0gICAgaWYgKGxlZkRhdGEtPmhhc0ZhdGFsRXJyb3IpIAotICAgICAgICByZXR1cm47Ci0gICAgaWYgKChsZWZTZXR0aW5ncy0+VG90YWxNc2dMaW1pdCA+IDApICYmIChsZWZEYXRhLT5sZWZFcnJNc2dQcmludGVkID49IGxlZlNldHRpbmdzLT5Ub3RhbE1zZ0xpbWl0KSkKLSAgICAgICAgcmV0dXJuOwotICAgIGlmIChsZWZTZXR0aW5ncy0+TXNnTGltaXRbbXNnTnVtXSA+IDApIHsKLSAgICAgICAgaWYgKGxlZkRhdGEtPm1zZ0xpbWl0WzBdW21zZ051bV0gPj0gbGVmU2V0dGluZ3MtPk1zZ0xpbWl0W21zZ051bV0pIC8vIG92ZXIgdGhlIGxpbWl0IAotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBsZWZEYXRhLT5tc2dMaW1pdFswXVttc2dOdW1dID0gbGVmRGF0YS0+bXNnTGltaXRbMF1bbXNnTnVtXSArIDE7Ci0gICAgfQotCi0gICAgLy8gUENSIDY5MDY3OSwgcHJvYmFibHkgbWlzc2luZyBzcGFjZSBiZWZvcmUgYSAnOycgCi0gICAgaWYgKHN0cmNtcChzLCAicGFyc2UgZXJyb3IiKSA9PSAwKSB7Ci0gICAgICAgIGlmICgobGVuID4gMSkgJiYgKGxlZkRhdGEtPmN1cnJlbnRfdG9rZW5bbGVuXSA9PSAnOycpKSB7Ci0gICAgICAgICAgICBzdHIgPSAoY2hhciopIGxlZk1hbGxvYyhsZW4gKyBzdHJsZW4ocykgKyBzdHJsZW4obGVmRGF0YS0+bGVmckZpbGVOYW1lKSArIDM1MCk7Ci0gICAgICAgICAgICBzcHJpbnRmKHN0ciwgIkVSUk9SIChMRUZQQVJTLSVkKTogJXMsIHNlZSBmaWxlICVzIGF0IGxpbmUgJWRcbkxhc3QgdG9rZW4gd2FzIDwlcz4sIHNwYWNlIGlzIG1pc3NpbmcgYmVmb3JlIDw7PlxuIiwKLSAgICAgICAgICAgICAgICAgICAgbXNnTnVtLCBzLCBsZWZEYXRhLT5sZWZyRmlsZU5hbWUsIGxlZkRhdGEtPmxlZl9ubGluZXMsIGN1clRva2VuKTsKLSAgICAgICAgfSBlbHNlIGlmICgocHZMZW4gPiAxKSAmJiAobGVmRGF0YS0+cHZfdG9rZW5bcHZMZW5dID09ICc7JykpIHsKLSAgICAgICAgICAgIHN0ciA9IChjaGFyKikgbGVmTWFsbG9jKHB2TGVuICsgc3RybGVuKHMpICsgc3RybGVuKGxlZkRhdGEtPmxlZnJGaWxlTmFtZSkgKyAzNTApOwotICAgICAgICAgICAgc3ByaW50ZihzdHIsICJFUlJPUiAoTEVGUEFSUy0lZCk6ICVzLCBzZWUgZmlsZSAlcyBhdCBsaW5lICVkXG5MYXN0IHRva2VuIHdhcyA8JXM+LCBzcGFjZSBpcyBtaXNzaW5nIGJlZm9yZSA8Oz5cbiIsCi0gICAgICAgICAgICAgICAgICAgIG1zZ051bSwgcywgbGVmRGF0YS0+bGVmckZpbGVOYW1lLCBsZWZEYXRhLT5sZWZfbmxpbmVzIC0gMSwgcHZUb2tlbik7Ci0gICAgICAgIH0gZWxzZSBpZiAoKGxlZkRhdGEtPmN1cnJlbnRfdG9rZW5bMF0gPT0gJyInKSAmJiAobGVmRGF0YS0+c3BhY2VNaXNzaW5nKSkgewotICAgICAgICAgICAgLy8gbW9zdCBsaWtlbHkgc3BhY2UgaXMgbWlzc2luZyBhZnRlciB0aGUgZW5kICIgCi0gICAgICAgICAgICBzdHIgPSAoY2hhciopIGxlZk1hbGxvYyhsZW4gKyBzdHJsZW4ocykgKyBzdHJsZW4obGVmRGF0YS0+bGVmckZpbGVOYW1lKSArIDM1MCk7Ci0gICAgICAgICAgICBzcHJpbnRmKHN0ciwgIkVSUk9SIChMRUZQQVJTLSVkKTogJXMsIHNlZSBmaWxlICVzIGF0IGxpbmUgJWRcbkxhc3QgdG9rZW4gd2FzIDwlc1wiPiwgc3BhY2UgaXMgbWlzc2luZyBiZXR3ZWVuIHRoZSBjbG9zaW5nIFwiIG9mIHRoZSBzdHJpbmcgYW5kIDsuXG4iLAotICAgICAgICAgICAgICAgICAgICAxMDEwLCBzLCBsZWZEYXRhLT5sZWZyRmlsZU5hbWUsIGxlZkRhdGEtPmxlZl9ubGluZXMsIGN1clRva2VuKTsKLSAgICAgICAgICAgIGxlZkRhdGEtPnNwYWNlTWlzc2luZyA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdHIgPSAoY2hhciopIGxlZk1hbGxvYyhsZW4gKyBzdHJsZW4obGVmRGF0YS0+bGVmckZpbGVOYW1lKSArIDM1MCk7Ci0gICAgICAgICAgICBzcHJpbnRmKHN0ciwgIkVSUk9SIChMRUZQQVJTLSVkKTogTGVmIHBhcnNlciBoYXMgZW5jb3VudGVyZWQgYW4gZXJyb3IgaW4gZmlsZSAlcyBhdCBsaW5lICVkLCBvbiB0b2tlbiAlcy5cblByb2JsZW0gY2FuIGJlIHN5bnRheCBlcnJvciBvbiB0aGUgbGVmIGZpbGUgb3IgYW4gaW52YWxpZCBwYXJhbWV0ZXIgbmFtZS5cbkRvdWJsZSBjaGVjayB0aGUgc3ludGF4IG9uIHRoZSBsZWYgZmlsZSB3aXRoIHRoZSBMRUZERUYgUmVmZXJlbmNlIE1hbnVhbC5cbiIsCi0gICAgICAgICAgICAgICAgICAgIG1zZ051bSwgbGVmRGF0YS0+bGVmckZpbGVOYW1lLCBsZWZEYXRhLT5sZWZfbmxpbmVzLCBjdXJUb2tlbik7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHN0cmNtcChzLCAic3ludGF4IGVycm9yIikgPT0gMCkgeyAgLy8gbGludXggbWFjaGluZXMgCi0gICAgICAgIGlmICgobGVuID4gMSkgJiYgKGxlZkRhdGEtPmN1cnJlbnRfdG9rZW5bbGVuXSA9PSAnOycpKSB7Ci0gICAgICAgICAgICBzdHIgPSAoY2hhciopIGxlZk1hbGxvYyhsZW4gKyBzdHJsZW4ocykgKyBzdHJsZW4obGVmRGF0YS0+bGVmckZpbGVOYW1lKSArIDM1MCk7Ci0gICAgICAgICAgICBzcHJpbnRmKHN0ciwgIkVSUk9SIChMRUZQQVJTLSVkKTogJXMsIHNlZSBmaWxlICVzIGF0IGxpbmUgJWRcbkxhc3QgdG9rZW4gd2FzIDwlcz4sIHNwYWNlIGlzIG1pc3NpbmcgYmVmb3JlIDw7PlxuIiwKLSAgICAgICAgICAgICAgICAgICAgbXNnTnVtLCBzLCBsZWZEYXRhLT5sZWZyRmlsZU5hbWUsIGxlZkRhdGEtPmxlZl9ubGluZXMsIGN1clRva2VuKTsKLSAgICAgICAgfSBlbHNlIGlmICgocHZMZW4gPiAxKSAmJiAobGVmRGF0YS0+cHZfdG9rZW5bcHZMZW5dID09ICc7JykpIHsKLSAgICAgICAgICAgIHN0ciA9IChjaGFyKikgbGVmTWFsbG9jKHB2TGVuICsgc3RybGVuKHMpICsgc3RybGVuKGxlZkRhdGEtPmxlZnJGaWxlTmFtZSkgKyAzNTApOwotICAgICAgICAgICAgc3ByaW50ZihzdHIsICJFUlJPUiAoTEVGUEFSUy0lZCk6ICVzLCBzZWUgZmlsZSAlcyBhdCBsaW5lICVkXG5MYXN0IHRva2VuIHdhcyA8JXM+LCBzcGFjZSBpcyBtaXNzaW5nIGJlZm9yZSA8Oz5cbiIsCi0gICAgICAgICAgICAgICAgICAgIG1zZ051bSwgcywgbGVmRGF0YS0+bGVmckZpbGVOYW1lLCBsZWZEYXRhLT5sZWZfbmxpbmVzIC0gMSwgcHZUb2tlbik7Ci0gICAgICAgIH0gZWxzZSBpZiAoKGxlZkRhdGEtPmN1cnJlbnRfdG9rZW5bMF0gPT0gJyInKSAmJiAobGVmRGF0YS0+c3BhY2VNaXNzaW5nKSkgewotICAgICAgICAgICAgLy8gbW9zdCBsaWtlbHkgc3BhY2UgaXMgbWlzc2luZyBhZnRlciB0aGUgZW5kICIgCi0gICAgICAgICAgICBzdHIgPSAoY2hhciopIGxlZk1hbGxvYyhsZW4gKyBzdHJsZW4ocykgKyBzdHJsZW4obGVmRGF0YS0+bGVmckZpbGVOYW1lKSArIDM1MCk7Ci0gICAgICAgICAgICBzcHJpbnRmKHN0ciwgIkVSUk9SIChMRUZQQVJTLSVkKTogJXMsIHNlZSBmaWxlICVzIGF0IGxpbmUgJWRcbkxhc3QgdG9rZW4gd2FzIDwlc1wiPiwgc3BhY2UgaXMgbWlzc2luZyBiZXR3ZWVuIHRoZSBjbG9zaW5nIFwiIG9mIHRoZSBzdHJpbmcgYW5kIDsuXG4iLAotICAgICAgICAgICAgICAgICAgICAxMDExLCBzLCBsZWZEYXRhLT5sZWZyRmlsZU5hbWUsIGxlZkRhdGEtPmxlZl9ubGluZXMsIGN1clRva2VuKTsKLSAgICAgICAgICAgIGxlZkRhdGEtPnNwYWNlTWlzc2luZyA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdHIgPSAoY2hhciopIGxlZk1hbGxvYyhsZW4gKyBzdHJsZW4obGVmRGF0YS0+bGVmckZpbGVOYW1lKSArIDM1MCk7Ci0gICAgICAgICAgICBzcHJpbnRmKHN0ciwgIkVSUk9SIChMRUZQQVJTLSVkKTogTGVmIHBhcnNlciBoYXMgZW5jb3VudGVyZWQgYW4gZXJyb3IgaW4gZmlsZSAlcyBhdCBsaW5lICVkLCBvbiB0b2tlbiAlcy5cblByb2JsZW0gY2FuIGJlIHN5bnRheCBlcnJvciBvbiB0aGUgbGVmIGZpbGUgb3IgYW4gaW52YWxpZCBwYXJhbWV0ZXIgbmFtZS5cbkRvdWJsZSBjaGVjayB0aGUgc3ludGF4IG9uIHRoZSBsZWYgZmlsZSB3aXRoIHRoZSBMRUZERUYgUmVmZXJlbmNlIE1hbnVhbC5cbiIsCi0gICAgICAgICAgICAgICAgICAgIG1zZ051bSwgbGVmRGF0YS0+bGVmckZpbGVOYW1lLCBsZWZEYXRhLT5sZWZfbmxpbmVzLCBjdXJUb2tlbik7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBzdHIgPSAoY2hhciopIGxlZk1hbGxvYyhsZW4gKyBzdHJsZW4ocykgKyBzdHJsZW4obGVmRGF0YS0+bGVmckZpbGVOYW1lKSArIDM1MCk7Ci0gICAgICAgIHNwcmludGYoc3RyLCAiRVJST1IgKExFRlBBUlMtJWQpOiAlcyBFcnJvciBpbiBmaWxlICVzIGF0IGxpbmUgJWQsIG9uIHRva2VuICVzLlxuIiwKLSAgICAgICAgICAgICAgICBtc2dOdW0sIHMsIGxlZkRhdGEtPmxlZnJGaWxlTmFtZSwgbGVmRGF0YS0+bGVmX25saW5lcywgY3VyVG9rZW4pOwotICAgIH0KLSAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICBsZWZpRXJyb3IoMSwgbXNnTnVtLCBzdHIpOwotICAgIGZyZWUoc3RyKTsKLSAgICBsZWZEYXRhLT5sZWZFcnJNc2dQcmludGVkKys7Ci0gICAgLy8gTm90IHJlYWxseSBlcnJvciwgZXJyb3IgbnVtYmVycyBiZXR3ZWVuIDEzMDAgJiAxNDk5LCB0aG9zZSBlcnJvcnMgCi0gICAgLy8gYXJlIG5vdCBmcm9tIGxlZi55IG9yIHRoZSBwYXJzZXIgCi0gICAgaWYgKChtc2dOdW0gPCAxMzAwKSB8fCAobXNnTnVtID4gMTQ5OSkpCi0gICAgICAgIGxlZkRhdGEtPmxlZl9lcnJvcnMrKzsKLX0KLQotLy8geXllcnJvciBpcyBjYWxsZWQgYnkgYmlzb24uc2ltcGxlLCA1IGxvY2F0aW9ucyB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbiAKLXZvaWQKLXl5ZXJyb3IoY29uc3QgY2hhciAqcykKLXsKLQotICAgIGxlZkVycm9yKGxlZkRhdGEtPm1zZ0NudCsrLCBzKTsKLX0KLQotLy8gQWxsIGluZm8gc3RhcnRzIHdpdGggMzAwMCAKLS8vIEFsbCBpbmZvIHdpdGhpbiBsZWZJbmZvIHN0YXJ0cyB3aXRoIDM1MDAgCi12b2lkCi1sZWZJbmZvKGludCAgICAgICAgIG1zZ051bSwKLSAgICAgICAgY29uc3QgY2hhciAgKnMpCi17Ci0gICAgaW50IGRpc2FibGVTdGF0dXMgPSBsZWZTZXR0aW5ncy0+c3VwcHJlc01zZyhtc2dOdW0pOwotCi0gICAgaWYgKGRpc2FibGVTdGF0dXMgPT0gMSkgewotICAgICAgICBjaGFyIG1zZ1N0cls2MF07Ci0gICAgICAgIHNwcmludGYobXNnU3RyLCAiTWVzc2FnZSAoTEVGUEFSUy0lZCkgaGFzIGJlZW4gc3VwcHJlc3NlZCBmcm9tIG91dHB1dC4iLCBtc2dOdW0pOwotICAgICAgICBsZWZXYXJuaW5nKDI1MDIsIG1zZ1N0cik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKGRpc2FibGVTdGF0dXMgPT0gMikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKChsZWZTZXR0aW5ncy0+VG90YWxNc2dMaW1pdCA+IDApICYmIChsZWZEYXRhLT5sZWZJbmZvTXNnUHJpbnRlZCA+PSBsZWZTZXR0aW5ncy0+VG90YWxNc2dMaW1pdCkpCi0gICAgICAgIHJldHVybjsKLSAgICBpZiAobGVmU2V0dGluZ3MtPk1zZ0xpbWl0W21zZ051bV0gPiAwKSB7Ci0gICAgICAgIGlmIChsZWZEYXRhLT5tc2dMaW1pdFswXVttc2dOdW1dID49IGxlZlNldHRpbmdzLT5Nc2dMaW1pdFttc2dOdW1dKSB7IC8vIG92ZXIgdGhlIGxpbWl0IAotICAgICAgICAgICAgY2hhciBtc2dTdHJbMTAwXTsKLSAgICAgICAgICAgIGlmIChsZWZEYXRhLT5tc2dMaW1pdFsxXVttc2dOdW1dKSAvLyBhbHJlYWR5IHByaW50ZWQgb3V0IHdhcm5pbmcgCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgbGVmRGF0YS0+bXNnTGltaXRbMV1bbXNnTnVtXSA9IDE7Ci0gICAgICAgICAgICBzcHJpbnRmKG1zZ1N0ciwKLSAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgKExFRlBBUlMtJWQpIGhhcyBleGNlZWRlZCB0aGUgbWVzc2FnZSBkaXNwbGF5IGxpbWl0IG9mICVkIiwKLSAgICAgICAgICAgICAgICAgICAgbXNnTnVtLCBsZWZTZXR0aW5ncy0+TXNnTGltaXRbbXNnTnVtXSk7Ci0gICAgICAgICAgICBsZWZXYXJuaW5nKDI1MDMsIG1zZ1N0cik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbGVmRGF0YS0+bXNnTGltaXRbMF1bbXNnTnVtXSA9IGxlZkRhdGEtPm1zZ0xpbWl0WzBdW21zZ051bV0gKyAxOwotICAgIH0KLSAgICBsZWZEYXRhLT5sZWZJbmZvTXNnUHJpbnRlZCsrOwotCi0gICAgaWYgKGxlZlNldHRpbmdzLT5XYXJuaW5nTG9nRnVuY3Rpb24pIHsKLSAgICAgICAgY2hhciAqc3RyID0gKGNoYXIqKSBsZWZNYWxsb2Moc3RybGVuKGxlZkRhdGEtPmN1cnJlbnRfdG9rZW4pICsgc3RybGVuKHMpICsgc3RybGVuKGxlZkRhdGEtPmxlZnJGaWxlTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAzNTApOwotICAgICAgICBzcHJpbnRmKHN0ciwgIklORk8gKExFRlBBUlMtJWQpOiAlcyBTZWUgZmlsZSAlcyBhdCBsaW5lICVkLlxuIiwKLSAgICAgICAgICAgICAgICBtc2dOdW0sIHMsIGxlZkRhdGEtPmxlZnJGaWxlTmFtZSwgbGVmRGF0YS0+bGVmX25saW5lcyk7Ci0gICAgICAgICgqbGVmU2V0dGluZ3MtPldhcm5pbmdMb2dGdW5jdGlvbikoc3RyKTsKLSAgICAgICAgZnJlZShzdHIpOwotICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+bGVmckxvZykgewotICAgICAgICBmcHJpbnRmKGxlZkRhdGEtPmxlZnJMb2csICJJTkZPIChMRUZQQVJTLSVkKTogJXMgU2VlIGZpbGUgJXMgYXQgbGluZSAlZFxuIiwKLSAgICAgICAgICAgICAgICBtc2dOdW0sIHMsIGxlZkRhdGEtPmxlZnJGaWxlTmFtZSwgbGVmRGF0YS0+bGVmX25saW5lcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFsZWZEYXRhLT5oYXNPcGVuZWRMb2dGaWxlKSB7Ci0gICAgICAgICAgICBpZiAoKGxlZkRhdGEtPmxlZnJMb2cgPSBmb3BlbigibGVmUldhcm5pbmcubG9nIiwgInciKSkgPT0gMCkgewotICAgICAgICAgICAgICAgIHByaW50ZigiV0FSTklORyAoTEVGUEFSUy0zNTAwKTogVW5hYmxlIHRvIG9wZW4gdGhlIGZpbGUgbGVmUldhcm5pbmcubG9nIGluICVzLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgZ2V0Y3dkKE5VTEwsIDY0KSk7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJJbmZvIG1lc3NhZ2VzIHdpbGwgbm90IGJlIHByaW50ZWQuXG4iKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbGVmRGF0YS0+aGFzT3BlbmVkTG9nRmlsZSA9IDE7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihsZWZEYXRhLT5sZWZyTG9nLCAiSW5mbyBmcm9tIGZpbGU6ICVzXG5cbiIsIGxlZkRhdGEtPmxlZnJGaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihsZWZEYXRhLT5sZWZyTG9nLCAiSU5GTyAoTEVGUEFSUy0lZCk6ICVzIFNlZSBmaWxlICVzIGF0IGxpbmUgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dOdW0sIHMsIGxlZkRhdGEtPmxlZnJGaWxlTmFtZSwgbGVmRGF0YS0+bGVmX25saW5lcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoKGxlZkRhdGEtPmxlZnJMb2cgPSBmb3BlbigibGVmUldhcm5pbmcubG9nIiwgImEiKSkgPT0gMCkgewotICAgICAgICAgICAgICAgIHByaW50ZigiV0FSTklORyAoTEVGUEFSUy0zNTAwKTogVW5hYmxlIHRvIG9wZW4gdGhlIGZpbGUgbGVmUldhcm5pbmcubG9nIGluICVzLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgZ2V0Y3dkKE5VTEwsIDY0KSk7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJJbmZvIG1lc3NhZ2VzIHdpbGwgbm90IGJlIHByaW50ZWQuXG4iKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihsZWZEYXRhLT5sZWZyTG9nLCAiXG5JbmZvIGZyb20gZmlsZTogJXNcblxuIiwgbGVmRGF0YS0+bGVmckZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZkRhdGEtPmxlZnJMb2csICJJTkZPIChMRUZQQVJTLSVkKTogJXMgU2VlIGZpbGUgJXMgYXQgbGluZSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ051bSwgcywgbGVmRGF0YS0+bGVmckZpbGVOYW1lLCBsZWZEYXRhLT5sZWZfbmxpbmVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gQWxsIHdhcm5pbmcgc3RhcnRzIHdpdGggMjAwMCAKLS8vIEFsbCB3YXJuaW5nIHdpdGhpbiBsZWZXYXJuaW5nIHN0YXJ0cyB3aXRoIDI1MDAgCi12b2lkCi1sZWZXYXJuaW5nKGludCAgICAgICAgICBtc2dOdW0sCi0gICAgICAgICAgIGNvbnN0IGNoYXIgICAqcykKLXsKLSAgICBpZiAobGVmU2V0dGluZ3MtPmRBbGxNc2dzKSAgIC8vIGFsbCBtZXNzYWdlcyBhcmUgc3VwcHJlc3NlZCAKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKChtc2dOdW0gIT0gMjUwMikgJiYgKG1zZ051bSAhPSAyNTAzKSkgewotICAgICAgICBpbnQgZGlzYWJsZVN0YXR1cyA9IGxlZlNldHRpbmdzLT5zdXBwcmVzTXNnKG1zZ051bSk7Ci0KLSAgICAgICAgaWYgKGRpc2FibGVTdGF0dXMgPT0gMSkgewotICAgICAgICAgICAgY2hhciBtc2dTdHJbNjBdOwotICAgICAgICAgICAgc3ByaW50Zihtc2dTdHIsICJNZXNzYWdlIChMRUZQQVJTLSVkKSBoYXMgYmVlbiBzdXBwcmVzc2VkIGZyb20gb3V0cHV0LiIsIG1zZ051bSk7Ci0gICAgICAgICAgICBsZWZXYXJuaW5nKDI1MDIsIG1zZ1N0cik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAoZGlzYWJsZVN0YXR1cyA9PSAyKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gICAgICAgIAotICAgIH0KLQotICAgIGlmICgobGVmU2V0dGluZ3MtPlRvdGFsTXNnTGltaXQgPiAwKSAmJiAobGVmRGF0YS0+bGVmV2Fybk1zZ1ByaW50ZWQgPj0gbGVmU2V0dGluZ3MtPlRvdGFsTXNnTGltaXQpKQotICAgICAgICByZXR1cm47Ci0gICAgaWYgKGxlZlNldHRpbmdzLT5Nc2dMaW1pdFttc2dOdW1dID4gMCkgewotICAgICAgICBpZiAobGVmRGF0YS0+bXNnTGltaXRbMF1bbXNnTnVtXSA+PSBsZWZTZXR0aW5ncy0+TXNnTGltaXRbbXNnTnVtXSkgeyAvLyBvdmVyIHRoZSBsaW1pdCAKLSAgICAgICAgICAgIGNoYXIgbXNnU3RyWzEwMF07Ci0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bXNnTGltaXRbMV1bbXNnTnVtXSkgLy8gYWxyZWFkeSBwcmludGVkIG91dCB3YXJuaW5nIAotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGxlZkRhdGEtPm1zZ0xpbWl0WzFdW21zZ051bV0gPSAxOwotICAgICAgICAgICAgc3ByaW50Zihtc2dTdHIsCi0gICAgICAgICAgICAgICAgICAgICJNZXNzYWdlIChMRUZQQVJTLSVkKSBoYXMgZXhjZWVkZWQgdGhlIG1lc3NhZ2UgZGlzcGxheSBsaW1pdCBvZiAlZCIsCi0gICAgICAgICAgICAgICAgICAgIG1zZ051bSwgbGVmU2V0dGluZ3MtPk1zZ0xpbWl0W21zZ051bV0pOwotICAgICAgICAgICAgbGVmV2FybmluZygyNTAzLCBtc2dTdHIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGxlZkRhdGEtPm1zZ0xpbWl0WzBdW21zZ051bV0gPSBsZWZEYXRhLT5tc2dMaW1pdFswXVttc2dOdW1dICsgMTsKLSAgICB9Ci0gICAgbGVmRGF0YS0+bGVmV2Fybk1zZ1ByaW50ZWQrKzsKLQotICAgIGlmIChsZWZTZXR0aW5ncy0+V2FybmluZ0xvZ0Z1bmN0aW9uKSB7Ci0gICAgICAgIGNoYXIgKnN0ciA9IChjaGFyKikgbGVmTWFsbG9jKHN0cmxlbihsZWZEYXRhLT5jdXJyZW50X3Rva2VuKSArIHN0cmxlbihzKSArIHN0cmxlbihsZWZEYXRhLT5sZWZyRmlsZU5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMzUwKTsKLSAgICAgICAgc3ByaW50ZihzdHIsICJXQVJOSU5HIChMRUZQQVJTLSVkKTogJXMgU2VlIGZpbGUgJXMgYXQgbGluZSAlZC5cbiIsCi0gICAgICAgICAgICAgICAgbXNnTnVtLCBzLCBsZWZEYXRhLT5sZWZyRmlsZU5hbWUsIGxlZkRhdGEtPmxlZl9ubGluZXMpOwotICAgICAgICAoKmxlZlNldHRpbmdzLT5XYXJuaW5nTG9nRnVuY3Rpb24pKHN0cik7Ci0gICAgICAgIGZyZWUoc3RyKTsKLSAgICB9IGVsc2UgaWYgKGxlZkRhdGEtPmxlZnJMb2cpIHsKLSAgICAgICAgZnByaW50ZihsZWZEYXRhLT5sZWZyTG9nLCAiV0FSTklORyAoTEVGUEFSUy0lZCk6ICVzIFNlZSBmaWxlICVzIGF0IGxpbmUgJWRcbiIsCi0gICAgICAgICAgICAgICAgbXNnTnVtLCBzLCBsZWZEYXRhLT5sZWZyRmlsZU5hbWUsIGxlZkRhdGEtPmxlZl9ubGluZXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghbGVmRGF0YS0+aGFzT3BlbmVkTG9nRmlsZSkgewotICAgICAgICAgICAgaWYgKChsZWZEYXRhLT5sZWZyTG9nID0gZm9wZW4oImxlZlJXYXJuaW5nLmxvZyIsICJ3IikpID09IDApIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIldBUk5JTkcgKExFRlBBUlMtMjUwMCk6IFVuYWJsZSB0byBvcGVuIHRoZSBmaWxlIGxlZlJXYXJuaW5nLmxvZyBpbiAlcy5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIGdldGN3ZChOVUxMLCA2NCkpOwotICAgICAgICAgICAgICAgIHByaW50ZigiV2FybmluZyBtZXNzYWdlcyB3aWxsIG5vdCBiZSBwcmludGVkLlxuIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxlZkRhdGEtPmhhc09wZW5lZExvZ0ZpbGUgPSAxOwotICAgICAgICAgICAgICAgIGZwcmludGYobGVmRGF0YS0+bGVmckxvZywgIldhcm5pbmdzIGZyb20gZmlsZTogJXNcblxuIiwgbGVmRGF0YS0+bGVmckZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZkRhdGEtPmxlZnJMb2csICJXQVJOSU5HIChMRUZQQVJTLSVkKTogJXMgU2VlIGZpbGUgJXMgYXQgbGluZSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ051bSwgcywgbGVmRGF0YS0+bGVmckZpbGVOYW1lLCBsZWZEYXRhLT5sZWZfbmxpbmVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICgobGVmRGF0YS0+bGVmckxvZyA9IGZvcGVuKCJsZWZSV2FybmluZy5sb2ciLCAiYSIpKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJXQVJOSU5HIChMRUZQQVJTLTI1MDEpOiBVbmFibGUgdG8gb3BlbiB0aGUgZmlsZSBsZWZSV2FybmluZy5sb2cgaW4gJXMuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICBnZXRjd2QoTlVMTCwgNjQpKTsKLSAgICAgICAgICAgICAgICBwcmludGYoIldhcm5pbmcgbWVzc2FnZXMgd2lsbCBub3QgYmUgcHJpbnRlZC5cbiIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZkRhdGEtPmxlZnJMb2csICJcbldhcm5pbmdzIGZyb20gZmlsZTogJXNcblxuIiwgbGVmRGF0YS0+bGVmckZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZkRhdGEtPmxlZnJMb2csICJXQVJOSU5HIChMRUZQQVJTLSVkKTogJXMgU2VlIGZpbGUgJXMgYXQgbGluZSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ051bSwgcywgbGVmRGF0YS0+bGVmckZpbGVOYW1lLCBsZWZEYXRhLT5sZWZfbmxpbmVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBsZWZEYXRhLT5sZWZfd2FybmluZ3MrKzsKLX0KLQotdm9pZCAqCi1sZWZNYWxsb2Moc2l6ZV90IGxlZl9zaXplKQotewotICAgIHZvaWQgKm1hbGxvY1ZhcjsKLQotICAgIGlmIChsZWZTZXR0aW5ncy0+TWFsbG9jRnVuY3Rpb24pCi0gICAgICAgIHJldHVybiAoKmxlZlNldHRpbmdzLT5NYWxsb2NGdW5jdGlvbikobGVmX3NpemUpOwotICAgIGVsc2UgewotICAgICAgICBtYWxsb2NWYXIgPSAodm9pZCopIG1hbGxvYyhsZWZfc2l6ZSk7Ci0gICAgICAgIGlmICghbWFsbG9jVmFyKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIChMRUZQQVJTLTEwMDkpOiBOb3QgZW5vdWdoIG1lbW9yeSwgc3RvcCBwYXJzaW5nIVxuIik7Ci0gICAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYWxsb2NWYXI7Ci0gICAgfQotfQotCi12b2lkICoKLWxlZlJlYWxsb2Modm9pZCAqbmFtZSwKLSAgICAgICAgICAgc2l6ZV90ICBsZWZfc2l6ZSkKLXsKLSAgICBpZiAobGVmU2V0dGluZ3MtPlJlYWxsb2NGdW5jdGlvbikKLSAgICAgICAgcmV0dXJuICgqbGVmU2V0dGluZ3MtPlJlYWxsb2NGdW5jdGlvbikobmFtZSwgbGVmX3NpemUpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuICh2b2lkKikgcmVhbGxvYyhuYW1lLCBsZWZfc2l6ZSk7Ci19Ci0KLXZvaWQKLWxlZkZyZWUodm9pZCAqbmFtZSkKLXsKLSAgICBpZiAobGVmU2V0dGluZ3MtPkZyZWVGdW5jdGlvbikKLSAgICAgICAgKCpsZWZTZXR0aW5ncy0+RnJlZUZ1bmN0aW9uKShuYW1lKTsKLSAgICBlbHNlCi0gICAgICAgIGZyZWUobmFtZSk7Ci19Ci0KLWNoYXIgKgotbGVmYWRkcihjb25zdCBjaGFyICppbikKLXsKLSAgICByZXR1cm4gKGNoYXIqKSBpbjsKLX0KLQotdm9pZAotbGVmU2V0Tm9uRGVmYXVsdChjb25zdCBjaGFyICpuZF9uYW1lKQotewotICAgIGxlZkRhdGEtPm5kTmFtZSA9IChjaGFyKiltYWxsb2Moc3RybGVuKG5kX25hbWUpKzEpOwotICAgIHN0cmNweShsZWZEYXRhLT5uZE5hbWUsIG5kX25hbWUpOwotfQotCi12b2lkCi1sZWZVbnNldE5vbkRlZmF1bHQoKQotewotICAgIGxlZkRhdGEtPmxlZk5kUnVsZSA9IDA7Ci0gICAgZnJlZShsZWZEYXRhLT5uZE5hbWUpOwotfQotCi1jaGFyICoKLWxlZl9reXdkKGludCBudW0pCi17Ci0gICAgY2hhciAqYTsKLSAgICBzd2l0Y2ggKG51bSkgewotICAgIGNhc2UgS19ISVNUT1JZOgotICAgICAgICBhID0gbGVmYWRkcigiSElTVE9SWSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfQUJVVDoKLSAgICAgICAgYSA9IGxlZmFkZHIoIkFCVVQiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0FCVVRNRU5UOgotICAgICAgICBhID0gbGVmYWRkcigiQUJVVE1FTlQiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0FDVElWRToKLSAgICAgICAgYSA9IGxlZmFkZHIoIkFDVElWRSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfQU5BTE9HOgotICAgICAgICBhID0gbGVmYWRkcigiQU5BTE9HIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19BTlRFTk5BQVJFQUZBQ1RPUjoKLSAgICAgICAgYSA9IGxlZmFkZHIoIkFOVEVOTkFBUkVBRkFDVE9SIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19BTlRFTk5BTEVOR1RIRkFDVE9SOgotICAgICAgICBhID0gbGVmYWRkcigiQU5URU5OQUxFTkdUSEZBQ1RPUiIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfQVJSQVk6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJBUlJBWSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfQkxPQ0s6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJCTE9DSyIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfQk9UVE9NTEVGVDoKLSAgICAgICAgYSA9IGxlZmFkZHIoIkJPVFRPTUxFRlQiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0JPVFRPTVJJR0hUOgotICAgICAgICBhID0gbGVmYWRkcigiQk9UVE9NUklHSFQiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0JVRkZFUjoKLSAgICAgICAgYSA9IGxlZmFkZHIoIkJVRkZFUiIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfQlk6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJCWSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfQ0FQQUNJVEFOQ0U6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJDQVBBQ0lUQU5DRSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfQ0FQTVVMVElQTElFUjoKLSAgICAgICAgYSA9IGxlZmFkZHIoIkNBUE1VTFRJUExJRVIiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0NMQVNTOgotICAgICAgICBhID0gbGVmYWRkcigiQ0xBU1MiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0NMT0NLOgotICAgICAgICBhID0gbGVmYWRkcigiQ0xPQ0siKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0NPTFVNTk1BSk9SOgotICAgICAgICBhID0gbGVmYWRkcigiQ09MVU1OTUFKT1IiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0NPUkU6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJDT1JFIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19DT1JORVI6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJDT1JORVIiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0NPVkVSOgotICAgICAgICBhID0gbGVmYWRkcigiQ09WRVIiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0NQRVJTUURJU1Q6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJDUEVSU1FESVNUIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19DVVJSRU5UOgotICAgICAgICBhID0gbGVmYWRkcigiQ1VSUkVOVCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfQ1VSUkVOVERFTjoKLSAgICAgICAgYSA9IGxlZmFkZHIoIkNVUlJFTlRERU4iKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0NVUlJFTlRTT1VSQ0U6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJDVVJSRU5UU09VUkNFIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19DVVQ6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJDVVQiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0RFRkFVTFQ6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJERUZBVUxUIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19EQVRBQkFTRToKLSAgICAgICAgYSA9IGxlZmFkZHIoIkRBVEFCQVNFIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19ESUVMRUNUUklDOgotICAgICAgICBhID0gbGVmYWRkcigiRElFTEVDVFJJQyIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfRElSRUNUSU9OOgotICAgICAgICBhID0gbGVmYWRkcigiRElSRUNUSU9OIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19ETzoKLSAgICAgICAgYSA9IGxlZmFkZHIoIkRPIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19FREdFQ0FQQUNJVEFOQ0U6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJFREdFQ0FQQUNJVEFOQ0UiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0VFUToKLSAgICAgICAgYSA9IGxlZmFkZHIoIkVFUSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfRU5EOgotICAgICAgICBhID0gbGVmYWRkcigiRU5EIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19FTkRDQVA6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJFTkRDQVAiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0ZBTEw6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJGQUxMIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19GQUxMQ1M6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJGQUxMQ1MiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0ZBTExUMDoKLSAgICAgICAgYSA9IGxlZmFkZHIoIkZBTExUMCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfRkFMTFNBVFQxOgotICAgICAgICBhID0gbGVmYWRkcigiRkFMTFNBVFQxIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19GQUxMUlM6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJGQUxMUlMiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0ZBTExTQVRDVVI6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJGQUxMU0FUQ1VSIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19GQUxMVEhSRVNIOgotICAgICAgICBhID0gbGVmYWRkcigiRkFMTFRIUkVTSCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfRkVFRFRIUlU6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJGRUVEVEhSVSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfRklYRUQ6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJGSVhFRCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfRk9SRUlHTjoKLSAgICAgICAgYSA9IGxlZmFkZHIoIkZPUkVJR04iKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0ZST01QSU46Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJGUk9NUElOIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19GVU5DVElPTjoKLSAgICAgICAgYSA9IGxlZmFkZHIoIkZVTkNUSU9OIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19HRU5FUkFURToKLSAgICAgICAgYSA9IGxlZmFkZHIoIkdFTkVSQVRFIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19HRU5FUkFUT1I6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJHRU5FUkFUT1IiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0dST1VORDoKLSAgICAgICAgYSA9IGxlZmFkZHIoIkdST1VORCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfSEVJR0hUOgotICAgICAgICBhID0gbGVmYWRkcigiSEVJR0hUIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19IT1JJWk9OVEFMOgotICAgICAgICBhID0gbGVmYWRkcigiSE9SSVpPTlRBTCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfSU5PVVQ6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJJTk9VVCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfSU5QVVQ6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJJTlBVVCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfSU5QVVROT0lTRU1BUkdJTjoKLSAgICAgICAgYSA9IGxlZmFkZHIoIklOUFVUTk9JU0VNQVJHSU4iKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0NPTVBPTkVOVFBJTjoKLSAgICAgICAgYSA9IGxlZmFkZHIoIkNPTVBPTkVOVFBJTiIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfSU5UUklOU0lDOgotICAgICAgICBhID0gbGVmYWRkcigiSU5UUklOU0lDIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19JTlZFUlQ6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJJTlZFUlQiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0lOVkVSVEVSOgotICAgICAgICBhID0gbGVmYWRkcigiSU5WRVJURVIiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0lSRFJPUDoKLSAgICAgICAgYSA9IGxlZmFkZHIoIklSRFJPUCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfSVRFUkFURToKLSAgICAgICAgYSA9IGxlZmFkZHIoIklURVJBVEUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0lWX1RBQkxFUzoKLSAgICAgICAgYSA9IGxlZmFkZHIoIklWX1RBQkxFUyIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfTEFZRVI6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJMQVlFUiIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfTEVBS0FHRToKLSAgICAgICAgYSA9IGxlZmFkZHIoIkxFQUtBR0UiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0xFUToKLSAgICAgICAgYSA9IGxlZmFkZHIoIkxFUSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfTElCUkFSWToKLSAgICAgICAgYSA9IGxlZmFkZHIoIkxJQlJBUlkiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX01BQ1JPOgotICAgICAgICBhID0gbGVmYWRkcigiTUFDUk8iKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX01BVENIOgotICAgICAgICBhID0gbGVmYWRkcigiTUFUQ0giKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX01BWERFTEFZOgotICAgICAgICBhID0gbGVmYWRkcigiTUFYREVMQVkiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX01BWExPQUQ6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJNQVhMT0FEIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19NRVRBTE9WRVJIQU5HOgotICAgICAgICBhID0gbGVmYWRkcigiTUVUQUxPVkVSSEFORyIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfTUlMTElBTVBTOgotICAgICAgICBhID0gbGVmYWRkcigiTUlMTElBTVBTIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19NSUxMSVdBVFRTOgotICAgICAgICBhID0gbGVmYWRkcigiTUlMTElXQVRUUyIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfTUlORkVBVFVSRToKLSAgICAgICAgYSA9IGxlZmFkZHIoIk1JTkZFQVRVUkUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX01VU1RKT0lOOgotICAgICAgICBhID0gbGVmYWRkcigiTVVTVEpPSU4iKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX05BTUVNQVBTVFJJTkc6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJOQU1FTUFQU1RSSU5HIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19OQU1FU0NBU0VTRU5TSVRJVkU6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJOQU1FU0NBU0VTRU5TSVRJVkUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX05BTk9TRUNPTkRTOgotICAgICAgICBhID0gbGVmYWRkcigiTkFOT1NFQ09ORFMiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX05FVFM6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJORVRTIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19ORVc6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJORVciKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX05PTkRFRkFVTFRSVUxFOgotICAgICAgICBhID0gbGVmYWRkcigiTk9OREVGQVVMVFJVTEUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX05PTklOVkVSVDoKLSAgICAgICAgYSA9IGxlZmFkZHIoIk5PTklOVkVSVCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfTk9OVU5BVEU6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJOT05VTkFURSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfTk9XSVJFRVhURU5TSU9OQVRQSU46Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJOT1dJUkVFWFRFTlNJT05BVFBJTiIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfT0JTOgotICAgICAgICBhID0gbGVmYWRkcigiT0JTIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19PSE1TOgotICAgICAgICBhID0gbGVmYWRkcigiT0hNUyIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfT0ZGU0VUOgotICAgICAgICBhID0gbGVmYWRkcigiT0ZGU0VUIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19PUklFTlRBVElPTjoKLSAgICAgICAgYSA9IGxlZmFkZHIoIk9SSUVOVEFUSU9OIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19PUklHSU46Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJPUklHSU4iKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX09VVFBVVDoKLSAgICAgICAgYSA9IGxlZmFkZHIoIk9VVFBVVCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfT1VUUFVUTk9JU0VNQVJHSU46Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJPVVRQVVROT0lTRU1BUkdJTiIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfT1VUUFVUUkVTSVNUQU5DRToKLSAgICAgICAgYSA9IGxlZmFkZHIoIk9VVFBVVFJFU0lTVEFOQ0UiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX09WRVJIQU5HOgotICAgICAgICBhID0gbGVmYWRkcigiT1ZFUkhBTkciKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX09WRVJMQVA6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJPVkVSTEFQIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19PRkY6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJPRkYiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX09OOgotICAgICAgICBhID0gbGVmYWRkcigiT04iKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX09WRVJMQVBTOgotICAgICAgICBhID0gbGVmYWRkcigiT1ZFUkxBUFMiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1BBRDoKLSAgICAgICAgYSA9IGxlZmFkZHIoIlBBRCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfUEFUSDoKLSAgICAgICAgYSA9IGxlZmFkZHIoIlBBVEgiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1BBVFRFUk46Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJQQVRURVJOIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19QSUNPRkFSQURTOgotICAgICAgICBhID0gbGVmYWRkcigiUElDT0ZBUkFEUyIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfUElOOgotICAgICAgICBhID0gbGVmYWRkcigiUElOIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19QSVRDSDoKLSAgICAgICAgYSA9IGxlZmFkZHIoIlBJVENIIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19QTEFDRUQ6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJQTEFDRUQiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1BPTFlHT046Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJQT0xZR09OIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19QT1JUOgotICAgICAgICBhID0gbGVmYWRkcigiUE9SVCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfUE9TVDoKLSAgICAgICAgYSA9IGxlZmFkZHIoIlBPU1QiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1BPV0VSOgotICAgICAgICBhID0gbGVmYWRkcigiUE9XRVIiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1BSRToKLSAgICAgICAgYSA9IGxlZmFkZHIoIlBSRSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfUFVMTERPV05SRVM6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJQVUxMRE9XTlJFUyIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfUFdMOgotICAgICAgICBhID0gbGVmYWRkcigiUFdMIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19SRUNUOgotICAgICAgICBhID0gbGVmYWRkcigiUkVDVCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfUkVTSVNUQU5DRToKLSAgICAgICAgYSA9IGxlZmFkZHIoIlJFU0lTVEFOQ0UiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1JFU0lTVElWRToKLSAgICAgICAgYSA9IGxlZmFkZHIoIlJFU0lTVElWRSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfUklORzoKLSAgICAgICAgYSA9IGxlZmFkZHIoIlJJTkciKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1JJU0U6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJSSVNFIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19SSVNFQ1M6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJSSVNFQ1MiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1JJU0VSUzoKLSAgICAgICAgYSA9IGxlZmFkZHIoIlJJU0VSUyIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfUklTRVNBVENVUjoKLSAgICAgICAgYSA9IGxlZmFkZHIoIlJJU0VTQVRDVVIiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1JJU0VUSFJFU0g6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJSSVNFVEhSRVNIIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19SSVNFU0FUVDE6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJSSVNFU0FUVDEiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1JJU0VUMDoKLSAgICAgICAgYSA9IGxlZmFkZHIoIlJJU0VUMCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfUklTRVZPTFRBR0VUSFJFU0hPTEQ6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJSSVNFVk9MVEFHRVRIUkVTSE9MRCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfRkFMTFZPTFRBR0VUSFJFU0hPTEQ6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJGQUxMVk9MVEFHRVRIUkVTSE9MRCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfUk9VVElORzoKLSAgICAgICAgYSA9IGxlZmFkZHIoIlJPVVRJTkciKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1JPV01BSk9SOgotICAgICAgICBhID0gbGVmYWRkcigiUk9XTUFKT1IiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1JQRVJTUToKLSAgICAgICAgYSA9IGxlZmFkZHIoIlJQRVJTUSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfU0FNRU5FVDoKLSAgICAgICAgYSA9IGxlZmFkZHIoIlNBTUVORVQiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1NDQU5VU0U6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJTQ0FOVVNFIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19TSEFQRToKLSAgICAgICAgYSA9IGxlZmFkZHIoIlNIQVBFIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19TSFJJTktBR0U6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJTSFJJTktBR0UiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1NJR05BTDoKLSAgICAgICAgYSA9IGxlZmFkZHIoIlNJR05BTCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfU0lURToKLSAgICAgICAgYSA9IGxlZmFkZHIoIlNJVEUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1NJWkU6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJTSVpFIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19TT1VSQ0U6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJTT1VSQ0UiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1NQQUNFUjoKLSAgICAgICAgYSA9IGxlZmFkZHIoIlNQQUNFUiIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfU1BBQ0lORzoKLSAgICAgICAgYSA9IGxlZmFkZHIoIlNQQUNJTkciKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1NQRUNJQUxORVRTOgotICAgICAgICBhID0gbGVmYWRkcigiU1BFQ0lBTE5FVFMiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1NUQUNLOgotICAgICAgICBhID0gbGVmYWRkcigiU1RBQ0siKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1NUQVJUOgotICAgICAgICBhID0gbGVmYWRkcigiU1RBUlQiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1NURVA6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJTVEVQIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19TVE9QOgotICAgICAgICBhID0gbGVmYWRkcigiU1RPUCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfU1RSVUNUVVJFOgotICAgICAgICBhID0gbGVmYWRkcigiU1RSVUNUVVJFIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19TWU1NRVRSWToKLSAgICAgICAgYSA9IGxlZmFkZHIoIlNZTU1FVFJZIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19UQUJMRToKLSAgICAgICAgYSA9IGxlZmFkZHIoIlRBQkxFIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19USElDS05FU1M6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJUSElDS05FU1MiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1RJRUhJR0g6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJUSUVISUdIIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19USUVMT1c6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJUSUVMT1ciKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1RJRU9GRlI6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJUSUVPRkZSIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19USU1FOgotICAgICAgICBhID0gbGVmYWRkcigiVElNRSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfVElNSU5HOgotICAgICAgICBhID0gbGVmYWRkcigiVElNSU5HIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19UTzoKLSAgICAgICAgYSA9IGxlZmFkZHIoIlRPIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19UT1BJTjoKLSAgICAgICAgYSA9IGxlZmFkZHIoIlRPUElOIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19UT1BMRUZUOgotICAgICAgICBhID0gbGVmYWRkcigiVE9QTEVGVCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfVE9QUklHSFQ6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJUT1BSSUdIVCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfVE9QT0ZTVEFDS09OTFk6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJUT1BPRlNUQUNLT05MWSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfVFJJU1RBVEU6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJUUklTVEFURSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfVFlQRToKLSAgICAgICAgYSA9IGxlZmFkZHIoIlRZUEUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1VOQVRFTkVTUzoKLSAgICAgICAgYSA9IGxlZmFkZHIoIlVOQVRFTkVTUyIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfVU5JVFM6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJVTklUUyIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfVVNFOgotICAgICAgICBhID0gbGVmYWRkcigiVVNFIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19WQVJJQUJMRToKLSAgICAgICAgYSA9IGxlZmFkZHIoIlZBUklBQkxFIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19WRVJUSUNBTDoKLSAgICAgICAgYSA9IGxlZmFkZHIoIlZFUlRJQ0FMIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19WSEk6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJWSEkiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1ZJQToKLSAgICAgICAgYSA9IGxlZmFkZHIoIlZJQSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfVklBUlVMRToKLSAgICAgICAgYSA9IGxlZmFkZHIoIlZJQVJVTEUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1ZMTzoKLSAgICAgICAgYSA9IGxlZmFkZHIoIlZMTyIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfVk9MVEFHRToKLSAgICAgICAgYSA9IGxlZmFkZHIoIlZPTFRBR0UiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1ZPTFRTOgotICAgICAgICBhID0gbGVmYWRkcigiVk9MVFMiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1dJRFRIOgotICAgICAgICBhID0gbGVmYWRkcigiV0lEVEgiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1dJUkVFWFRFTlNJT046Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJXSVJFRVhURU5TSU9OIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19YOgotICAgICAgICBhID0gbGVmYWRkcigiWCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfWToKLSAgICAgICAgYSA9IGxlZmFkZHIoIlkiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1I5MDoKLSAgICAgICAgYSA9IGxlZmFkZHIoIlI5MCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFRfU1RSSU5HOgotICAgICAgICBhID0gbGVmYWRkcigiVF9TVFJJTkciKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBRU1RSSU5HOgotICAgICAgICBhID0gbGVmYWRkcigiUVNUUklORyIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE5VTUJFUjoKLSAgICAgICAgYSA9IGxlZmFkZHIoIk5VTUJFUiIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfTjoKLSAgICAgICAgYSA9IGxlZmFkZHIoIk4iKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1M6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJTIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19FOgotICAgICAgICBhID0gbGVmYWRkcigiRSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfVzoKLSAgICAgICAgYSA9IGxlZmFkZHIoIlciKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0ZOOgotICAgICAgICBhID0gbGVmYWRkcigiRk4iKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0ZTOgotICAgICAgICBhID0gbGVmYWRkcigiRlMiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0ZFOgotICAgICAgICBhID0gbGVmYWRkcigiRkUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0ZXOgotICAgICAgICBhID0gbGVmYWRkcigiRlciKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1VTRVI6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJVU0VSIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19NQVNURVJTTElDRToKLSAgICAgICAgYSA9IGxlZmFkZHIoIk1BU1RFUlNMSUNFIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19FTkRNQUNSTzoKLSAgICAgICAgYSA9IGxlZmFkZHIoIkVORE1BQ1JPIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19FTkRNQUNST1BJTjoKLSAgICAgICAgYSA9IGxlZmFkZHIoIkVORE1BQ1JPUElOIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19FTkRWSUFSVUxFOgotICAgICAgICBhID0gbGVmYWRkcigiRU5EVklBUlVMRSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfRU5EVklBOgotICAgICAgICBhID0gbGVmYWRkcigiRU5EVklBIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19FTkRMQVlFUjoKLSAgICAgICAgYSA9IGxlZmFkZHIoIkVORExBWUVSIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19FTkRTSVRFOgotICAgICAgICBhID0gbGVmYWRkcigiRU5EU0lURSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfQ0FOUExBQ0U6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJDQU5QTEFDRSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfQ0FOTk9UT0NDVVBZOgotICAgICAgICBhID0gbGVmYWRkcigiQ0FOTk9UT0NDVVBZIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19UUkFDS1M6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJUUkFDS1MiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0ZMT09SUExBTjoKLSAgICAgICAgYSA9IGxlZmFkZHIoIkZMT09SUExBTiIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfR0NFTExHUklEOgotICAgICAgICBhID0gbGVmYWRkcigiR0NFTExHUklEIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19ERUZBVUxUQ0FQOgotICAgICAgICBhID0gbGVmYWRkcigiREVGQVVMVENBUCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfTUlOUElOUzoKLSAgICAgICAgYSA9IGxlZmFkZHIoIk1JTlBJTlMiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1dJUkVDQVA6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJXSVJFQ0FQIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19TVEFCTEU6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJTVEFCTEUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1NFVFVQOgotICAgICAgICBhID0gbGVmYWRkcigiU0VUVVAiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0hPTEQ6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJIT0xEIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19ERUZJTkU6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJERUZJTkUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0RFRklORVM6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJERUZJTkVTIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19ERUZJTkVCOgotICAgICAgICBhID0gbGVmYWRkcigiREVGSU5FQiIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfSUY6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJJRiIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfVEhFTjoKLSAgICAgICAgYSA9IGxlZmFkZHIoIlRIRU4iKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0VMU0U6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJFTFNFIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19GQUxTRToKLSAgICAgICAgYSA9IGxlZmFkZHIoIkZBTFNFIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19UUlVFOgotICAgICAgICBhID0gbGVmYWRkcigiVFJVRSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfRVE6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJFUSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfTkU6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJORSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfTEU6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJMRSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfTFQ6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJMVCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfR0U6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJHRSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfR1Q6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJHVCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfT1I6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJPUiIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfQU5EOgotICAgICAgICBhID0gbGVmYWRkcigiQU5EIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19OT1Q6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJOT1QiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0RFTEFZOgotICAgICAgICBhID0gbGVmYWRkcigiREVMQVkiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1RBQkxFRElNRU5TSU9OOgotICAgICAgICBhID0gbGVmYWRkcigiVEFCTEVESU1FTlNJT04iKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1RBQkxFQVhJUzoKLSAgICAgICAgYSA9IGxlZmFkZHIoIlRBQkxFQVhJUyIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfVEFCTEVFTlRSSUVTOgotICAgICAgICBhID0gbGVmYWRkcigiVEFCTEVFTlRSSUVTIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19UUkFOU0lUSU9OVElNRToKLSAgICAgICAgYSA9IGxlZmFkZHIoIlRSQU5TSVRJT05USU1FIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19FWFRFTlNJT046Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJFWFRFTlNJT04iKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1BST1BERUY6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJQUk9QREVGIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19TVFJJTkc6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJTVFJJTkciKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0lOVEVHRVI6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJJTlRFR0VSIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19SRUFMOgotICAgICAgICBhID0gbGVmYWRkcigiUkVBTCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfUkFOR0U6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJSQU5HRSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfUFJPUEVSVFk6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJQUk9QRVJUWSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfVklSVFVBTDoKLSAgICAgICAgYSA9IGxlZmFkZHIoIlZJUlRVQUwiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0JVU0JJVENIQVJTOgotICAgICAgICBhID0gbGVmYWRkcigiQlVTQklUQ0hBUlMiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1ZFUlNJT046Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJWRVJTSU9OIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19CRUdJTkVYVDoKLSAgICAgICAgYSA9IGxlZmFkZHIoIkJFR0lORVhUIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19FTkRFWFQ6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJFTkRFWFQiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1VOSVZFUlNBTE5PSVNFTUFSR0lOOgotICAgICAgICBhID0gbGVmYWRkcigiVU5JVkVSU0FMTk9JU0VNQVJHSU4iKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0VER0VSQVRFVEhSRVNIT0xEMToKLSAgICAgICAgYSA9IGxlZmFkZHIoIkVER0VSQVRFVEhSRVNIT0xEMSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfQ09SUkVDVElPTlRBQkxFOgotICAgICAgICBhID0gbGVmYWRkcigiQ09SUkVDVElPTlRBQkxFIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19FREdFUkFURVNDQUxFRkFDVE9SOgotICAgICAgICBhID0gbGVmYWRkcigiRURHRVJBVEVTQ0FMRUZBQ1RPUiIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfRURHRVJBVEVUSFJFU0hPTEQyOgotICAgICAgICBhID0gbGVmYWRkcigiRURHRVJBVEVUSFJFU0hPTEQyIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19WSUNUSU1OT0lTRToKLSAgICAgICAgYSA9IGxlZmFkZHIoIlZJQ1RJTU5PSVNFIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19OT0lTRVRBQkxFOgotICAgICAgICBhID0gbGVmYWRkcigiTk9JU0VUQUJMRSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfRURHRVJBVEU6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJFREdFUkFURSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfVklDVElNTEVOR1RIOgotICAgICAgICBhID0gbGVmYWRkcigiVklDVElNTEVOR1RIIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19DT1JSRUNUSU9ORkFDVE9SOgotICAgICAgICBhID0gbGVmYWRkcigiQ09SUkVDVElPTkZBQ1RPUiIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfT1VUUFVUUElOQU5URU5OQVNJWkU6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJPVVRQVVRQSU5BTlRFTk5BU0laRSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfSU5QVVRQSU5BTlRFTk5BU0laRToKLSAgICAgICAgYSA9IGxlZmFkZHIoIklOUFVUUElOQU5URU5OQVNJWkUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0lOT1VUUElOQU5URU5OQVNJWkU6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJJTk9VVFBJTkFOVEVOTkFTSVpFIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19UQVBFUlJVTEU6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJUQVBFUlJVTEUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0RJVklERVJDSEFSOgotICAgICAgICBhID0gbGVmYWRkcigiRElWSURFUkNIQVIiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0FOVEVOTkFTSVpFOgotICAgICAgICBhID0gbGVmYWRkcigiQU5URU5OQVNJWkUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0FOVEVOTkFNRVRBTEFSRUE6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJBTlRFTk5BTUVUQUxBUkVBIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19BTlRFTk5BTUVUQUxMRU5HVEg6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJBTlRFTk5BTUVUQUxMRU5HVEgiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1JJU0VTTEVXTElNSVQ6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJSSVNFU0xFV0xJTUlUIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19GQUxMU0xFV0xJTUlUOgotICAgICAgICBhID0gbGVmYWRkcigiRkFMTFNMRVdMSU1JVCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfTUVTU0FHRToKLSAgICAgICAgYSA9IGxlZmFkZHIoIk1FU1NBR0UiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX0NSRUFURUZJTEU6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJDUkVBVEVGSUxFIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19PUEVORklMRToKLSAgICAgICAgYSA9IGxlZmFkZHIoIk9QRU5GSUxFIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19DTE9TRUZJTEU6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJDTE9TRUZJTEUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLX1dBUk5JTkc6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJXQVJOSU5HIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19FUlJPUjoKLSAgICAgICAgYSA9IGxlZmFkZHIoIkVSUk9SIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19GQVRBTEVSUk9SOgotICAgICAgICBhID0gbGVmYWRkcigiRkFUQUxFUlJPUiIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIElGOgotICAgICAgICBhID0gbGVmYWRkcigiSUYiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMTk9UOgotICAgICAgICBhID0gbGVmYWRkcigiTE5PVCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFVNSU5VUzoKLSAgICAgICAgYSA9IGxlZmFkZHIoIlVNSU5VUyIpOwotICAgICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGEgPSBsZWZhZGRyKCJib2d1cyIpOwotICAgIH0KLSAgICByZXR1cm4gYTsKLX0KLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlBcnJheS5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlBcnJheS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMTY2NTQuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZpQXJyYXkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjc1ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTIgLSAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgImxleC5oIgotI2luY2x1ZGUgImxlZmlBcnJheS5ocHAiCi0jaW5jbHVkZSAibGVmaU1pc2MuaHBwIgotI2luY2x1ZGUgImxlZmlEZWJ1Zy5ocHAiCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gbGVmaUFycmF5Rmxvb3JQbGFuCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi12b2lkCi1sZWZpQXJyYXlGbG9vclBsYW46OkluaXQoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLSAgICBuYW1lXyA9IChjaGFyKikgbGVmTWFsbG9jKGxlbik7Ci0gICAgc3RyY3B5KG5hbWVfLCBDQVNFKG5hbWUpKTsKLSAgICBudW1QYXR0ZXJuc18gPSAwOwotICAgIHBhdHRlcm5zQWxsb2NhdGVkXyA9IDI7Ci0gICAgdHlwZXNfID0gKGNoYXIqKikgbGVmTWFsbG9jKHNpemVvZihjaGFyKikgKiAyKTsKLSAgICBwYXR0ZXJuc18gPSAobGVmaVNpdGVQYXR0ZXJuKiopIGxlZk1hbGxvYyhzaXplb2YobGVmaVNpdGVQYXR0ZXJuKikgKiAyKTsKLX0KLQotdm9pZAotbGVmaUFycmF5Rmxvb3JQbGFuOjpEZXN0cm95KCkKLXsKLSAgICBsZWZpU2l0ZVBhdHRlcm4gKnM7Ci0gICAgaW50ICAgICAgICAgICAgIGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bVBhdHRlcm5zXzsgaSsrKSB7Ci0gICAgICAgIHMgPSBwYXR0ZXJuc19baV07Ci0gICAgICAgIHMtPkRlc3Ryb3koKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIHMpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHR5cGVzX1tpXSkpOwotICAgIH0KLSAgICBsZWZGcmVlKChjaGFyKikgKHR5cGVzXykpOwotICAgIGxlZkZyZWUoKGNoYXIqKSAocGF0dGVybnNfKSk7Ci0gICAgbGVmRnJlZShuYW1lXyk7Ci19Ci0KLXZvaWQKLWxlZmlBcnJheUZsb29yUGxhbjo6YWRkU2l0ZVBhdHRlcm4oY29uc3QgY2hhciAgICAgICAqdHlwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZpU2l0ZVBhdHRlcm4gICpzKQotewotICAgIGludCBsZW4gPSBzdHJsZW4odHlwKSArIDE7Ci0gICAgaWYgKG51bVBhdHRlcm5zXyA9PSBwYXR0ZXJuc0FsbG9jYXRlZF8pIHsKLSAgICAgICAgaW50ICAgICAgICAgICAgIGk7Ci0gICAgICAgIGludCAgICAgICAgICAgICBsaW07Ci0gICAgICAgIGNoYXIgICAgICAgICAgICAqKm5jOwotICAgICAgICBsZWZpU2l0ZVBhdHRlcm4gKipucDsKLQotICAgICAgICBpZiAocGF0dGVybnNBbGxvY2F0ZWRfID09IDApCi0gICAgICAgICAgICBsaW0gPSBwYXR0ZXJuc0FsbG9jYXRlZF8gPSAyOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBsaW0gPSBwYXR0ZXJuc0FsbG9jYXRlZF8gPSBwYXR0ZXJuc0FsbG9jYXRlZF8gKiAyOwotICAgICAgICBuYyA9IChjaGFyKiopIGxlZk1hbGxvYyhzaXplb2YoY2hhciopICogbGltKTsKLSAgICAgICAgbnAgPSAobGVmaVNpdGVQYXR0ZXJuKiopIGxlZk1hbGxvYyhzaXplb2YobGVmaVNpdGVQYXR0ZXJuKikgKiBsaW0pOwotICAgICAgICBsaW0gLz0gMjsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbTsgaSsrKSB7Ci0gICAgICAgICAgICBuY1tpXSA9IHR5cGVzX1tpXTsKLSAgICAgICAgICAgIG5wW2ldID0gcGF0dGVybnNfW2ldOwotICAgICAgICB9Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAodHlwZXNfKSk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAocGF0dGVybnNfKSk7Ci0gICAgICAgIHR5cGVzXyA9IG5jOwotICAgICAgICBwYXR0ZXJuc18gPSBucDsKLSAgICB9Ci0gICAgdHlwZXNfW251bVBhdHRlcm5zX10gPSAoY2hhciopIGxlZk1hbGxvYyhsZW4pOwotICAgIHN0cmNweSh0eXBlc19bbnVtUGF0dGVybnNfXSwgdHlwKTsKLSAgICBwYXR0ZXJuc19bbnVtUGF0dGVybnNfXSA9IHM7Ci0gICAgbnVtUGF0dGVybnNfICs9IDE7Ci19Ci0KLWludAotbGVmaUFycmF5Rmxvb3JQbGFuOjpudW1QYXR0ZXJucygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG51bVBhdHRlcm5zXzsKLX0KLQotbGVmaVNpdGVQYXR0ZXJuICoKLWxlZmlBcnJheUZsb29yUGxhbjo6cGF0dGVybihpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHBhdHRlcm5zX1tpbmRleF07Ci19Ci0KLWNoYXIgKgotbGVmaUFycmF5Rmxvb3JQbGFuOjp0eXAoaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiB0eXBlc19baW5kZXhdOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlBcnJheUZsb29yUGxhbjo6bmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG5hbWVfOwotfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gbGVmaUFycmF5Ci0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotbGVmaUFycmF5OjpsZWZpQXJyYXkoKQotOiBuYW1lU2l6ZV8oMCksCi0gIG5hbWVfKE5VTEwpLAotICBwYXR0ZXJuc0FsbG9jYXRlZF8oMCksCi0gIG51bVBhdHRlcm5zXygwKSwKLSAgcGF0dGVybl8oTlVMTCksCi0gIGNhbkFsbG9jYXRlZF8oMCksCi0gIG51bUNhbl8oMCksCi0gIGNhblBsYWNlXyhOVUxMKSwKLSAgY2Fubm90QWxsb2NhdGVkXygwKSwKLSAgbnVtQ2Fubm90XygwKSwKLSAgY2Fubm90T2NjdXB5XyhOVUxMKSwKLSAgdHJhY2tzQWxsb2NhdGVkXygwKSwKLSAgbnVtVHJhY2tzXygwKSwKLSAgdHJhY2tfKE5VTEwpLAotICBnQWxsb2NhdGVkXygwKSwKLSAgbnVtR18oMCksCi0gIGdjZWxsXyhOVUxMKSwKLSAgaGFzRGVmYXVsdF8oMCksCi0gIHRhYmxlU2l6ZV8oMCksCi0gIG51bURlZmF1bHRfKDApLAotICBkZWZhdWx0QWxsb2NhdGVkXygwKSwKLSAgbWluUGluc18oTlVMTCksCi0gIGNhcHNfKE5VTEwpLAotICBudW1GbG9vclBsYW5zXygwKSwKLSAgZmxvb3JQbGFuc0FsbG9jYXRlZF8oMCksCi0gIGZsb29yc18oMCkKLXsKLSAgICBJbml0KCk7Ci19Ci0KLXZvaWQKLWxlZmlBcnJheTo6SW5pdCgpCi17Ci0gICAgbmFtZVNpemVfID0gMTY7Ci0gICAgbmFtZV8gPSAoY2hhciopIGxlZk1hbGxvYygxNik7Ci0KLSAgICBudW1QYXR0ZXJuc18gPSAwOwotICAgIHBhdHRlcm5zQWxsb2NhdGVkXyA9IDA7Ci0gICAgYnVtcCgodm9pZCoqKikgKCYocGF0dGVybl8pKSwgbnVtUGF0dGVybnNfLCAmKHBhdHRlcm5zQWxsb2NhdGVkXykpOwotCi0gICAgbnVtQ2FuXyA9IDA7Ci0gICAgY2FuQWxsb2NhdGVkXyA9IDA7Ci0gICAgYnVtcCgodm9pZCoqKikgKCYoY2FuUGxhY2VfKSksIG51bUNhbl8sICYoY2FuQWxsb2NhdGVkXykpOwotCi0gICAgbnVtQ2Fubm90XyA9IDA7Ci0gICAgY2Fubm90QWxsb2NhdGVkXyA9IDA7Ci0gICAgYnVtcCgodm9pZCoqKikgKCYoY2Fubm90T2NjdXB5XykpLCBudW1DYW5ub3RfLCAmKGNhbm5vdEFsbG9jYXRlZF8pKTsKLQotICAgIG51bVRyYWNrc18gPSAwOwotICAgIHRyYWNrc0FsbG9jYXRlZF8gPSAwOwotICAgIGJ1bXAoKHZvaWQqKiopICgmKHRyYWNrXykpLCBudW1UcmFja3NfLCAmKHRyYWNrc0FsbG9jYXRlZF8pKTsKLQotICAgIG51bUdfID0gMDsKLSAgICBnQWxsb2NhdGVkXyA9IDA7Ci0gICAgYnVtcCgodm9pZCoqKikgKCYoZ2NlbGxfKSksIG51bUdfLCAmKGdBbGxvY2F0ZWRfKSk7Ci0KLSAgICBudW1EZWZhdWx0XyA9IDA7Ci0gICAgZGVmYXVsdEFsbG9jYXRlZF8gPSA0OwotICAgIG1pblBpbnNfID0gKGludCopIGxlZk1hbGxvYyhzaXplb2YoaW50KSAqIDQpOwotICAgIGNhcHNfID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIDQpOwotCi0gICAgZmxvb3JQbGFuc0FsbG9jYXRlZF8gPSAwOwotICAgIG51bUZsb29yUGxhbnNfID0gMDsKLSAgICBidW1wKCh2b2lkKioqKSAoJihmbG9vcnNfKSksIG51bUZsb29yUGxhbnNfLAotICAgICAgICAgJihmbG9vclBsYW5zQWxsb2NhdGVkXykpOwotfQotCi12b2lkCi1sZWZpQXJyYXk6OkRlc3Ryb3koKQotewotICAgIGNsZWFyKCk7Ci0KLSAgICBsZWZGcmVlKChjaGFyKikgKG5hbWVfKSk7Ci0gICAgbGVmRnJlZSgoY2hhciopIChjYXBzXykpOwotICAgIGxlZkZyZWUoKGNoYXIqKSAobWluUGluc18pKTsKLSAgICBsZWZGcmVlKChjaGFyKikgKGZsb29yc18pKTsKLSAgICBsZWZGcmVlKChjaGFyKikgKHRyYWNrXykpOwotICAgIGxlZkZyZWUoKGNoYXIqKSAoZ2NlbGxfKSk7Ci0gICAgbGVmRnJlZSgoY2hhciopIChjYW5ub3RPY2N1cHlfKSk7Ci0gICAgbGVmRnJlZSgoY2hhciopIChjYW5QbGFjZV8pKTsKLSAgICBsZWZGcmVlKChjaGFyKikgKHBhdHRlcm5fKSk7Ci19Ci0KLWxlZmlBcnJheTo6fmxlZmlBcnJheSgpCi17Ci0gICAgRGVzdHJveSgpOwotfQotCi12b2lkCi1sZWZpQXJyYXk6OmFkZFNpdGVQYXR0ZXJuKGxlZmlTaXRlUGF0dGVybiAqcykKLXsKLSAgICAvKgotICAgICAgaWYgKG51bVBhdHRlcm5zXyA9PSBwYXR0ZXJuc0FsbG9jYXRlZF8pCi0gICAgICAgIGJ1bXAoKHZvaWQqKiopKCYocGF0dGVybl8pKSwgbnVtUGF0dGVybnNfLAotICAgICAgICAmKHBhdHRlcm5zQWxsb2NhdGVkXykpOwotICAgICovCi0gICAgaWYgKG51bVBhdHRlcm5zXyA9PSBwYXR0ZXJuc0FsbG9jYXRlZF8pIHsKLSAgICAgICAgbGVmaVNpdGVQYXR0ZXJuICoqdHBhdHRlcm47Ci0gICAgICAgIGludCAgICAgICAgICAgICBpOwotCi0gICAgICAgIGlmIChwYXR0ZXJuc0FsbG9jYXRlZF8gPT0gMCkKLSAgICAgICAgICAgIHBhdHRlcm5zQWxsb2NhdGVkXyA9IDI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBhdHRlcm5zQWxsb2NhdGVkXyA9IHBhdHRlcm5zQWxsb2NhdGVkXyAqIDI7Ci0gICAgICAgIHRwYXR0ZXJuID0gKGxlZmlTaXRlUGF0dGVybioqKSBsZWZNYWxsb2Moc2l6ZW9mKGxlZmlTaXRlUGF0dGVybiopICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuc0FsbG9jYXRlZF8pOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUGF0dGVybnNfOyBpKyspIHsKLSAgICAgICAgICAgIHRwYXR0ZXJuW2ldID0gcGF0dGVybl9baV07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhdHRlcm5fKQotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChwYXR0ZXJuXykpOwotICAgICAgICBwYXR0ZXJuXyA9IHRwYXR0ZXJuOwotICAgICAgICAvKgotICAgICAgICAgICAgYnVtcCgodm9pZCoqKikoJihwYXR0ZXJuXykpLCBudW1QYXR0ZXJuc18sCi0gICAgICAgICAgICAmKHBhdHRlcm5zQWxsb2NhdGVkXykpOwotICAgICAgICAqLwotICAgIH0KLQotICAgIHBhdHRlcm5fW251bVBhdHRlcm5zX10gPSBzOwotICAgIG51bVBhdHRlcm5zXyArPSAxOwotfQotCi12b2lkCi1sZWZpQXJyYXk6OnNldE5hbWUoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLSAgICBpZiAobGVuID4gbmFtZVNpemVfKSB7Ci0gICAgICAgIGxlZkZyZWUobmFtZV8pOwotICAgICAgICBuYW1lXyA9IChjaGFyKikgbGVmTWFsbG9jKGxlbik7Ci0gICAgICAgIG5hbWVTaXplXyA9IGxlbjsKLSAgICB9Ci0gICAgc3RyY3B5KG5hbWVfLCBDQVNFKG5hbWUpKTsKLX0KLQotdm9pZAotbGVmaUFycmF5OjpzZXRUYWJsZVNpemUoaW50IHRzaXplKQotewotICAgIHRhYmxlU2l6ZV8gPSB0c2l6ZTsKLSAgICBoYXNEZWZhdWx0XyA9IDE7Ci19Ci0KLXZvaWQKLWxlZmlBcnJheTo6YWRkRGVmYXVsdENhcChpbnQgICAgbWluUGlucywKLSAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgY2FwKQotewotICAgIGlmIChudW1EZWZhdWx0XyA9PSBkZWZhdWx0QWxsb2NhdGVkXykgewotICAgICAgICBpbnQgICAgIGk7Ci0gICAgICAgIGludCAgICAgbGltOwotICAgICAgICBkb3VibGUgICpuYzsKLSAgICAgICAgaW50ICAgICAqbnA7Ci0KLSAgICAgICAgaWYgKGRlZmF1bHRBbGxvY2F0ZWRfID09IDApCi0gICAgICAgICAgICBsaW0gPSBkZWZhdWx0QWxsb2NhdGVkXyA9IDI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGxpbSA9IGRlZmF1bHRBbGxvY2F0ZWRfICogMjsKLSAgICAgICAgZGVmYXVsdEFsbG9jYXRlZF8gPSBsaW07Ci0gICAgICAgIG5jID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGxpbSk7Ci0gICAgICAgIG5wID0gKGludCopIGxlZk1hbGxvYyhzaXplb2YoaW50KSAqIGxpbSk7Ci0gICAgICAgIGxpbSAvPSAyOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGltOyBpKyspIHsKLSAgICAgICAgICAgIG5jW2ldID0gY2Fwc19baV07Ci0gICAgICAgICAgICBucFtpXSA9IG1pblBpbnNfW2ldOwotICAgICAgICB9Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoY2Fwc18pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChtaW5QaW5zXykpOwotICAgICAgICBjYXBzXyA9IG5jOwotICAgICAgICBtaW5QaW5zXyA9IG5wOwotICAgIH0KLSAgICBjYXBzX1tudW1EZWZhdWx0X10gPSBjYXA7Ci0gICAgbWluUGluc19bbnVtRGVmYXVsdF9dID0gbWluUGluczsKLSAgICBudW1EZWZhdWx0XyArPSAxOwotfQotCi12b2lkCi1sZWZpQXJyYXk6OmFkZENhblBsYWNlKGxlZmlTaXRlUGF0dGVybiAqcykKLXsKLSAgICBpZiAobnVtQ2FuXyA9PSBjYW5BbGxvY2F0ZWRfKSB7Ci0gICAgICAgIGxlZmlTaXRlUGF0dGVybiAqKmNwbGFjZTsKLSAgICAgICAgaW50ICAgICAgICAgICAgIGk7Ci0KLSAgICAgICAgaWYgKGNhbkFsbG9jYXRlZF8gPT0gMCkKLSAgICAgICAgICAgIGNhbkFsbG9jYXRlZF8gPSAyOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjYW5BbGxvY2F0ZWRfID0gY2FuQWxsb2NhdGVkXyAqIDI7Ci0gICAgICAgIGNwbGFjZSA9IChsZWZpU2l0ZVBhdHRlcm4qKikgbGVmTWFsbG9jKHNpemVvZihsZWZpU2l0ZVBhdHRlcm4qKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbkFsbG9jYXRlZF8pOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQ2FuXzsgaSsrKSB7Ci0gICAgICAgICAgICBjcGxhY2VbaV0gPSBjYW5QbGFjZV9baV07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNhblBsYWNlXykKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoY2FuUGxhY2VfKSk7Ci0gICAgICAgIGNhblBsYWNlXyA9IGNwbGFjZTsKLSAgICB9Ci0gICAgLyoKLSAgICAgICAgYnVtcCgodm9pZCoqKikoJihjYW5QbGFjZV8pKSwgbnVtQ2FuXywgJihjYW5BbGxvY2F0ZWRfKSk7Ci0gICAgKi8KLSAgICBjYW5QbGFjZV9bbnVtQ2FuX10gPSBzOwotICAgIG51bUNhbl8gKz0gMTsKLX0KLQotdm9pZAotbGVmaUFycmF5OjphZGRDYW5ub3RPY2N1cHkobGVmaVNpdGVQYXR0ZXJuICpzKQotewotICAgIGlmIChudW1DYW5ub3RfID09IGNhbm5vdEFsbG9jYXRlZF8pIHsKLSAgICAgICAgbGVmaVNpdGVQYXR0ZXJuICoqY25wbGFjZTsKLSAgICAgICAgaW50ICAgICAgICAgICAgIGk7Ci0KLSAgICAgICAgaWYgKGNhbm5vdEFsbG9jYXRlZF8gPT0gMCkKLSAgICAgICAgICAgIGNhbm5vdEFsbG9jYXRlZF8gPSAyOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjYW5ub3RBbGxvY2F0ZWRfID0gY2Fubm90QWxsb2NhdGVkXyAqIDI7Ci0gICAgICAgIGNucGxhY2UgPSAobGVmaVNpdGVQYXR0ZXJuKiopIGxlZk1hbGxvYyhzaXplb2YobGVmaVNpdGVQYXR0ZXJuKikgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fubm90QWxsb2NhdGVkXyk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1DYW5ub3RfOyBpKyspIHsKLSAgICAgICAgICAgIGNucGxhY2VbaV0gPSBjYW5ub3RPY2N1cHlfW2ldOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjYW5ub3RPY2N1cHlfKQotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChjYW5ub3RPY2N1cHlfKSk7Ci0gICAgICAgIGNhbm5vdE9jY3VweV8gPSBjbnBsYWNlOwotICAgIH0KLSAgICAvKgotICAgICAgaWYgKG51bUNhbm5vdF8gPT0gY2Fubm90QWxsb2NhdGVkXykKLSAgICAgICAgYnVtcCgodm9pZCoqKikoJihjYW5ub3RPY2N1cHlfKSksIG51bUNhbm5vdF8sCi0gICAgICAgICYoY2Fubm90QWxsb2NhdGVkXykpOwotICAgICovCi0gICAgY2Fubm90T2NjdXB5X1tudW1DYW5ub3RfXSA9IHM7Ci0gICAgbnVtQ2Fubm90XyArPSAxOwotfQotCi12b2lkCi1sZWZpQXJyYXk6OmFkZFRyYWNrKGxlZmlUcmFja1BhdHRlcm4gKnQpCi17Ci0gICAgaWYgKG51bVRyYWNrc18gPT0gdHJhY2tzQWxsb2NhdGVkXykgewotICAgICAgICBsZWZpVHJhY2tQYXR0ZXJuICAgICoqdHJhY2tzOwotICAgICAgICBpbnQgICAgICAgICAgICAgICAgIGk7Ci0KLSAgICAgICAgaWYgKHRyYWNrc0FsbG9jYXRlZF8gPT0gMCkKLSAgICAgICAgICAgIHRyYWNrc0FsbG9jYXRlZF8gPSAyOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB0cmFja3NBbGxvY2F0ZWRfID0gdHJhY2tzQWxsb2NhdGVkXyAqIDI7Ci0gICAgICAgIHRyYWNrcyA9IChsZWZpVHJhY2tQYXR0ZXJuKiopIGxlZk1hbGxvYyhzaXplb2YobGVmaVRyYWNrUGF0dGVybiopICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrc0FsbG9jYXRlZF8pOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVHJhY2tzXzsgaSsrKSB7Ci0gICAgICAgICAgICB0cmFja3NbaV0gPSB0cmFja19baV07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRyYWNrXykKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAodHJhY2tfKSk7Ci0gICAgICAgIHRyYWNrXyA9IHRyYWNrczsKLSAgICB9Ci0gICAgLyoKLSAgICAgIGlmIChudW1UcmFja3NfID09IHRyYWNrc0FsbG9jYXRlZF8pCi0gICAgICAgIGJ1bXAoKHZvaWQqKiopKCYodHJhY2tfKSksIG51bVRyYWNrc18sICYodHJhY2tzQWxsb2NhdGVkXykpOwotICAgICovCi0gICAgdHJhY2tfW251bVRyYWNrc19dID0gdDsKLSAgICBudW1UcmFja3NfICs9IDE7Ci19Ci0KLXZvaWQKLWxlZmlBcnJheTo6YWRkR2NlbGwobGVmaUdjZWxsUGF0dGVybiAqZykKLXsKLSAgICBpZiAobnVtR18gPT0gZ0FsbG9jYXRlZF8pIHsKLSAgICAgICAgbGVmaUdjZWxsUGF0dGVybiAgICAqKmNlbGxzOwotICAgICAgICBpbnQgICAgICAgICAgICAgICAgIGk7Ci0KLSAgICAgICAgaWYgKGdBbGxvY2F0ZWRfID09IDApCi0gICAgICAgICAgICBnQWxsb2NhdGVkXyA9IDI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGdBbGxvY2F0ZWRfID0gZ0FsbG9jYXRlZF8gKiAyOwotICAgICAgICBjZWxscyA9IChsZWZpR2NlbGxQYXR0ZXJuKiopIGxlZk1hbGxvYyhzaXplb2YobGVmaUdjZWxsUGF0dGVybiopICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ0FsbG9jYXRlZF8pOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtR187IGkrKykgewotICAgICAgICAgICAgY2VsbHNbaV0gPSBnY2VsbF9baV07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGdjZWxsXykKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoZ2NlbGxfKSk7Ci0gICAgICAgIGdjZWxsXyA9IGNlbGxzOwotICAgIH0KLSAgICAvKgotICAgICAgaWYgKG51bUdfID09IGdBbGxvY2F0ZWRfKQotICAgICAgICBidW1wKCh2b2lkKioqKSgmKGdjZWxsXykpLCBudW1HXywgJihnQWxsb2NhdGVkXykpOwotICAgICovCi0gICAgZ2NlbGxfW251bUdfXSA9IGc7Ci0gICAgbnVtR18gKz0gMTsKLX0KLQotdm9pZAotbGVmaUFycmF5OjphZGRGbG9vclBsYW4oY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBsZWZpQXJyYXlGbG9vclBsYW4gKmY7Ci0gICAgaWYgKG51bUZsb29yUGxhbnNfID09IGZsb29yUGxhbnNBbGxvY2F0ZWRfKSB7Ci0gICAgICAgIGludCAgICAgICAgICAgICAgICAgaTsKLSAgICAgICAgbGVmaUFycmF5Rmxvb3JQbGFuICAqKnRmOwotCi0gICAgICAgIGlmIChmbG9vclBsYW5zQWxsb2NhdGVkXyA9PSAwKQotICAgICAgICAgICAgZmxvb3JQbGFuc0FsbG9jYXRlZF8gPSAyOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmbG9vclBsYW5zQWxsb2NhdGVkXyA9IGZsb29yUGxhbnNBbGxvY2F0ZWRfICogMjsKLSAgICAgICAgdGYgPSAobGVmaUFycmF5Rmxvb3JQbGFuKiopIGxlZk1hbGxvYyhzaXplb2YobGVmaUFycmF5Rmxvb3JQbGFuKikgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb29yUGxhbnNBbGxvY2F0ZWRfKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUZsb29yUGxhbnNfOyBpKyspIHsKLSAgICAgICAgICAgIHRmW2ldID0gZmxvb3JzX1tpXTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZmxvb3JzXykKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoZmxvb3JzXykpOwotICAgICAgICBmbG9vcnNfID0gdGY7Ci0gICAgfQotICAgIC8qCi0gICAgICBpZiAobnVtRmxvb3JQbGFuc18gPT0gZmxvb3JQbGFuc0FsbG9jYXRlZF8pIHsKLSAgICAgICAgYnVtcCgodm9pZCoqKikoJihmbG9vcnNfKSksIG51bUZsb29yUGxhbnNfLAotICAgICAgICAmKGZsb29yUGxhbnNBbGxvY2F0ZWRfKSk7Ci0gICAgICB9Ci0gICAgKi8KLSAgICBmID0gKGxlZmlBcnJheUZsb29yUGxhbiopIGxlZk1hbGxvYyhzaXplb2YobGVmaUFycmF5Rmxvb3JQbGFuKSk7Ci0gICAgZi0+SW5pdChuYW1lKTsKLSAgICBmbG9vcnNfW251bUZsb29yUGxhbnNfXSA9IGY7Ci0gICAgbnVtRmxvb3JQbGFuc18gKz0gMTsKLX0KLQotdm9pZAotbGVmaUFycmF5OjphZGRTaXRlVG9GbG9vclBsYW4oY29uc3QgY2hhciAgICAgICAgKnR5cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZmlTaXRlUGF0dGVybiAgICpzKQotewotICAgIGxlZmlBcnJheUZsb29yUGxhbiAqZiA9IGZsb29yc19bbnVtRmxvb3JQbGFuc18gLSAxXTsKLSAgICBmLT5hZGRTaXRlUGF0dGVybih0eXAsIHMpOwotfQotCi12b2lkCi1sZWZpQXJyYXk6OmJ1bXAodm9pZCAgICAqKiphcnIsCi0gICAgICAgICAgICAgICAgaW50ICAgICB1c2VkLAotICAgICAgICAgICAgICAgIGludCAgICAgKmFsbG9jYXRlZCkKLXsKLSAgICBpbnQgICAgIHNpemUgPSAqYWxsb2NhdGVkICogMjsKLSAgICBpbnQgICAgIGk7Ci0gICAgdm9pZCAgICAqKm5ld2E7Ci0gICAgaWYgKHNpemUgPT0gMCkKLSAgICAgICAgc2l6ZSA9IDI7Ci0gICAgbmV3YSA9ICh2b2lkKiopIGxlZk1hbGxvYyhzaXplb2Yodm9pZCopICogc2l6ZSk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgdXNlZDsgaSsrKSB7Ci0gICAgICAgIG5ld2FbaV0gPSAoKmFycilbaV07Ci0gICAgfQotCi0gICAgaWYgKCphcnIpCi0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoKmFycikpOwotICAgICphbGxvY2F0ZWQgPSBzaXplOwotICAgICphcnIgPSBuZXdhOwotfQotCi12b2lkCi1sZWZpQXJyYXk6OmNsZWFyKCkKLXsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGk7Ci0gICAgbGVmaVNpdGVQYXR0ZXJuICAgICAqcDsKLSAgICBsZWZpR2NlbGxQYXR0ZXJuICAgICpnOwotICAgIGxlZmlUcmFja1BhdHRlcm4gICAgKnQ7Ci0gICAgbGVmaUFycmF5Rmxvb3JQbGFuICAqZjsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBudW1QYXR0ZXJuc187IGkrKykgewotICAgICAgICBwID0gcGF0dGVybl9baV07Ci0gICAgICAgIHAtPkRlc3Ryb3koKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIHApOwotICAgIH0KLSAgICBudW1QYXR0ZXJuc18gPSAwOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG51bUNhbl87IGkrKykgewotICAgICAgICBwID0gY2FuUGxhY2VfW2ldOwotICAgICAgICBwLT5EZXN0cm95KCk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSBwKTsKLSAgICB9Ci0gICAgbnVtQ2FuXyA9IDA7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQ2Fubm90XzsgaSsrKSB7Ci0gICAgICAgIHAgPSBjYW5ub3RPY2N1cHlfW2ldOwotICAgICAgICBwLT5EZXN0cm95KCk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSBwKTsKLSAgICB9Ci0gICAgbnVtQ2Fubm90XyA9IDA7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVHJhY2tzXzsgaSsrKSB7Ci0gICAgICAgIHQgPSB0cmFja19baV07Ci0gICAgICAgIHQtPkRlc3Ryb3koKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIHQpOwotICAgIH0KLSAgICBudW1UcmFja3NfID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBudW1HXzsgaSsrKSB7Ci0gICAgICAgIGcgPSBnY2VsbF9baV07Ci0gICAgICAgIGctPkRlc3Ryb3koKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIGcpOwotICAgIH0KLSAgICBudW1HXyA9IDA7Ci0KLSAgICBoYXNEZWZhdWx0XyA9IDA7Ci0gICAgdGFibGVTaXplXyA9IDA7Ci0gICAgbnVtRGVmYXVsdF8gPSAwOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG51bUZsb29yUGxhbnNfOyBpKyspIHsKLSAgICAgICAgZiA9IGZsb29yc19baV07Ci0gICAgICAgIGYtPkRlc3Ryb3koKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIGYpOwotICAgIH0KLSAgICBudW1GbG9vclBsYW5zXyA9IDA7Ci0KLX0KLQotaW50Ci1sZWZpQXJyYXk6Om51bVNpdGVQYXR0ZXJuKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbnVtUGF0dGVybnNfOwotfQotCi1pbnQKLWxlZmlBcnJheTo6bnVtQ2FuUGxhY2UoKSBjb25zdAotewotICAgIHJldHVybiBudW1DYW5fOwotfQotCi1pbnQKLWxlZmlBcnJheTo6bnVtQ2Fubm90T2NjdXB5KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbnVtQ2Fubm90XzsKLX0KLQotaW50Ci1sZWZpQXJyYXk6Om51bVRyYWNrKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbnVtVHJhY2tzXzsKLX0KLQotaW50Ci1sZWZpQXJyYXk6Om51bUdjZWxsKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbnVtR187Ci19Ci0KLWludAotbGVmaUFycmF5OjpoYXNEZWZhdWx0Q2FwKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzRGVmYXVsdF87Ci19Ci0KLWNvbnN0IGNoYXIgKgotbGVmaUFycmF5OjpuYW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbmFtZV87Ci19Ci0KLWxlZmlTaXRlUGF0dGVybiAqCi1sZWZpQXJyYXk6OnNpdGVQYXR0ZXJuKGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gcGF0dGVybl9baW5kZXhdOwotfQotCi1sZWZpU2l0ZVBhdHRlcm4gKgotbGVmaUFycmF5OjpjYW5QbGFjZShpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGNhblBsYWNlX1tpbmRleF07Ci19Ci0KLWxlZmlTaXRlUGF0dGVybiAqCi1sZWZpQXJyYXk6OmNhbm5vdE9jY3VweShpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGNhbm5vdE9jY3VweV9baW5kZXhdOwotfQotCi1sZWZpVHJhY2tQYXR0ZXJuICoKLWxlZmlBcnJheTo6dHJhY2soaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiB0cmFja19baW5kZXhdOwotfQotCi1sZWZpR2NlbGxQYXR0ZXJuICoKLWxlZmlBcnJheTo6Z2NlbGwoaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiBnY2VsbF9baW5kZXhdOwotfQotCi1pbnQKLWxlZmlBcnJheTo6dGFibGVTaXplKCkgY29uc3QKLXsKLSAgICByZXR1cm4gdGFibGVTaXplXzsKLX0KLQotaW50Ci1sZWZpQXJyYXk6Om51bURlZmF1bHRDYXBzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbnVtRGVmYXVsdF87Ci19Ci0KLWludAotbGVmaUFycmF5OjpkZWZhdWx0Q2FwTWluUGlucyhpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1pblBpbnNfW2luZGV4XTsKLX0KLQotZG91YmxlCi1sZWZpQXJyYXk6OmRlZmF1bHRDYXAoaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiBjYXBzX1tpbmRleF07Ci19Ci0KLWludAotbGVmaUFycmF5OjpudW1GbG9vclBsYW5zKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbnVtRmxvb3JQbGFuc187Ci19Ci0KLWNvbnN0IGNoYXIgKgotbGVmaUFycmF5OjpmbG9vclBsYW5OYW1lKGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjb25zdCBsZWZpQXJyYXlGbG9vclBsYW4gKmYgPSBmbG9vcnNfW2luZGV4XTsKLSAgICByZXR1cm4gZi0+bmFtZSgpOwotfQotCi1pbnQKLWxlZmlBcnJheTo6bnVtU2l0ZXMoaW50IGluZGV4KSBjb25zdAotewotICAgIGNvbnN0IGxlZmlBcnJheUZsb29yUGxhbiAqZiA9IGZsb29yc19baW5kZXhdOwotICAgIHJldHVybiBmLT5udW1QYXR0ZXJucygpOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlBcnJheTo6c2l0ZVR5cGUoaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICBpbnQgaikgY29uc3QKLXsKLSAgICBjb25zdCBsZWZpQXJyYXlGbG9vclBsYW4gKmYgPSBmbG9vcnNfW2luZGV4XTsKLSAgICByZXR1cm4gZi0+dHlwKGopOwotfQotCi1sZWZpU2l0ZVBhdHRlcm4gKgotbGVmaUFycmF5OjpzaXRlKGludCBpbmRleCwKLSAgICAgICAgICAgICAgICBpbnQgaikgY29uc3QKLXsKLSAgICBjb25zdCBsZWZpQXJyYXlGbG9vclBsYW4gKmYgPSBmbG9vcnNfW2luZGV4XTsKLSAgICByZXR1cm4gZi0+cGF0dGVybihqKTsKLX0KLQotdm9pZAotbGVmaUFycmF5OjpwcmludChGSUxFICpmKSBjb25zdAotewotICAgIGZwcmludGYoZiwgIkFSUkFZICVzXG4iLCBuYW1lKCkpOwotfQotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZpQXJyYXkuaHBwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZpQXJyYXkuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjQ0MDUzLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaUFycmF5LmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyIC0gMjAxMywgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpZm5kZWYgbGVmaUFycmF5X2gKLSNkZWZpbmUgbGVmaUFycmF5X2gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAibGVmaUtSRGVmcy5ocHAiCi0jaW5jbHVkZSAibGVmaU1pc2MuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1jbGFzcyBsZWZpQXJyYXlGbG9vclBsYW4gewotcHVibGljOgotICB2b2lkIEluaXQoY29uc3QgY2hhciogbmFtZSk7Ci0gIHZvaWQgRGVzdHJveSgpOwotICB2b2lkIGFkZFNpdGVQYXR0ZXJuKGNvbnN0IGNoYXIqIHR5cCwgbGVmaVNpdGVQYXR0ZXJuKiBzKTsKLQotICBpbnQgbnVtUGF0dGVybnMoKSBjb25zdDsKLSAgbGVmaVNpdGVQYXR0ZXJuKiBwYXR0ZXJuKGludCBpbmRleCkgY29uc3Q7Ci0gIGNoYXIqIHR5cChpbnQgaW5kZXgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgaW50IG51bVBhdHRlcm5zXzsKLSAgaW50IHBhdHRlcm5zQWxsb2NhdGVkXzsKLSAgbGVmaVNpdGVQYXR0ZXJuKiogcGF0dGVybnNfOwotICBjaGFyKiogdHlwZXNfOwotICBjaGFyKiBuYW1lXzsKLX07Ci0KLWNsYXNzIGxlZmlBcnJheSB7Ci1wdWJsaWM6Ci0gIGxlZmlBcnJheSgpOwotICB2b2lkIEluaXQoKTsKLQotICB2b2lkIERlc3Ryb3koKTsKLSAgfmxlZmlBcnJheSgpOwotCi0gIHZvaWQgc2V0TmFtZShjb25zdCBjaGFyKiBuYW1lKTsKLSAgdm9pZCBhZGRTaXRlUGF0dGVybihsZWZpU2l0ZVBhdHRlcm4qIHMpOwotICB2b2lkIHNldFRhYmxlU2l6ZShpbnQgdHNpemUpOwotICB2b2lkIGFkZERlZmF1bHRDYXAoaW50IG1pblBpbnMsIGRvdWJsZSBjYXApOwotICB2b2lkIGFkZENhblBsYWNlKGxlZmlTaXRlUGF0dGVybiogcyk7Ci0gIHZvaWQgYWRkQ2Fubm90T2NjdXB5KGxlZmlTaXRlUGF0dGVybiogcyk7Ci0gIHZvaWQgYWRkVHJhY2sobGVmaVRyYWNrUGF0dGVybiogdCk7Ci0gIHZvaWQgYWRkR2NlbGwobGVmaUdjZWxsUGF0dGVybiogZyk7Ci0gIHZvaWQgYWRkRmxvb3JQbGFuKGNvbnN0IGNoYXIqIG5hbWUpOwotICB2b2lkIGFkZFNpdGVUb0Zsb29yUGxhbihjb25zdCBjaGFyKiB0eXAsIGxlZmlTaXRlUGF0dGVybiogcCk7Ci0gIHZvaWQgY2xlYXIoKTsKLSAgdm9pZCBidW1wKHZvaWQqKiogYXJyLCBpbnQgdXNlZCwgaW50KiBhbGxvY2F0ZWQpOwotCi0gIGludCBudW1TaXRlUGF0dGVybigpIGNvbnN0OwotICBpbnQgbnVtQ2FuUGxhY2UoKSBjb25zdDsKLSAgaW50IG51bUNhbm5vdE9jY3VweSgpIGNvbnN0OwotICBpbnQgbnVtVHJhY2soKSBjb25zdDsKLSAgaW50IG51bUdjZWxsKCkgY29uc3Q7Ci0gIGludCBoYXNEZWZhdWx0Q2FwKCkgY29uc3Q7Ci0KLSAgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0OwotICBsZWZpU2l0ZVBhdHRlcm4qIHNpdGVQYXR0ZXJuKGludCBpbmRleCkgY29uc3Q7Ci0gIGxlZmlTaXRlUGF0dGVybiogY2FuUGxhY2UoaW50IGluZGV4KSBjb25zdDsKLSAgbGVmaVNpdGVQYXR0ZXJuKiBjYW5ub3RPY2N1cHkoaW50IGluZGV4KSBjb25zdDsKLSAgbGVmaVRyYWNrUGF0dGVybiogdHJhY2soaW50IGluZGV4KSBjb25zdDsKLSAgbGVmaUdjZWxsUGF0dGVybiogZ2NlbGwoaW50IGluZGV4KSBjb25zdDsKLQotICBpbnQgdGFibGVTaXplKCkgY29uc3Q7Ci0gIGludCBudW1EZWZhdWx0Q2FwcygpIGNvbnN0OwotICBpbnQgZGVmYXVsdENhcE1pblBpbnMoaW50IGluZGV4KSBjb25zdDsKLSAgZG91YmxlIGRlZmF1bHRDYXAoaW50IGluZGV4KSBjb25zdDsKLQotICBpbnQgbnVtRmxvb3JQbGFucygpIGNvbnN0OwotICBjb25zdCBjaGFyKiBmbG9vclBsYW5OYW1lKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCBudW1TaXRlcyhpbnQgaW5kZXgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBzaXRlVHlwZShpbnQgZmxvb3JJbmRleCwgaW50IHNpdGVJbmRleCkgY29uc3Q7Ci0gIGxlZmlTaXRlUGF0dGVybiogc2l0ZShpbnQgZmxvb3JJbmRleCwgaW50IHNpdGVJbmRleCkgY29uc3Q7Ci0KLSAgLy8gRGVidWcgcHJpbnQKLSAgdm9pZCBwcmludChGSUxFKiBmKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICBpbnQgbmFtZVNpemVfOwotICBjaGFyKiBuYW1lXzsKLQotICBpbnQgcGF0dGVybnNBbGxvY2F0ZWRfOwotICBpbnQgbnVtUGF0dGVybnNfOwotICBsZWZpU2l0ZVBhdHRlcm4qKiBwYXR0ZXJuXzsKLQotICBpbnQgY2FuQWxsb2NhdGVkXzsKLSAgaW50IG51bUNhbl87Ci0gIGxlZmlTaXRlUGF0dGVybioqIGNhblBsYWNlXzsKLQotICBpbnQgY2Fubm90QWxsb2NhdGVkXzsKLSAgaW50IG51bUNhbm5vdF87Ci0gIGxlZmlTaXRlUGF0dGVybioqIGNhbm5vdE9jY3VweV87Ci0KLSAgaW50IHRyYWNrc0FsbG9jYXRlZF87Ci0gIGludCBudW1UcmFja3NfOwotICBsZWZpVHJhY2tQYXR0ZXJuKiogdHJhY2tfOwotCi0gIGludCBnQWxsb2NhdGVkXzsKLSAgaW50IG51bUdfOwotICBsZWZpR2NlbGxQYXR0ZXJuKiogZ2NlbGxfOwotCi0gIGludCBoYXNEZWZhdWx0XzsKLSAgaW50IHRhYmxlU2l6ZV87Ci0gIGludCBudW1EZWZhdWx0XzsKLSAgaW50IGRlZmF1bHRBbGxvY2F0ZWRfOwotICBpbnQqIG1pblBpbnNfOwotICBkb3VibGUqIGNhcHNfOwotCi0gIGludCBudW1GbG9vclBsYW5zXzsKLSAgaW50IGZsb29yUGxhbnNBbGxvY2F0ZWRfOwotICBsZWZpQXJyYXlGbG9vclBsYW4qKiBmbG9vcnNfOwotfTsKLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLVVTRV9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaUNyb3NzVGFsay5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlDcm9zc1RhbGsuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzgwNjQxLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaUNyb3NzVGFsay5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5OTQgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiAtIDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJsZXguaCIKLSNpbmNsdWRlICJsZWZpQ3Jvc3NUYWxrLmhwcCIKLSNpbmNsdWRlICJsZWZpRGVidWcuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gbGVmaU5vaXNlVmljdGltCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1sZWZpTm9pc2VWaWN0aW06OmxlZmlOb2lzZVZpY3RpbShkb3VibGUgZCkKLTogbGVuZ3RoXygwLjApLAotICBudW1Ob2lzZXNfKDApLAotICBub2lzZXNBbGxvY2F0ZWRfKDApLAotICBub2lzZXNfKE5VTEwpCi17Ci0gICAgSW5pdChkKTsKLX0KLQotdm9pZAotbGVmaU5vaXNlVmljdGltOjpJbml0KGRvdWJsZSBkKQotewotICAgIGxlbmd0aF8gPSBkOwotCi0gICAgbnVtTm9pc2VzXyA9IDA7Ci0gICAgbm9pc2VzQWxsb2NhdGVkXyA9IDI7Ci0gICAgbm9pc2VzXyA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiAyKTsKLX0KLQotdm9pZAotbGVmaU5vaXNlVmljdGltOjpjbGVhcigpCi17Ci0gICAgbnVtTm9pc2VzXyA9IDA7Ci19Ci0KLXZvaWQKLWxlZmlOb2lzZVZpY3RpbTo6RGVzdHJveSgpCi17Ci0gICAgY2xlYXIoKTsKLSAgICBsZWZGcmVlKChjaGFyKikgKG5vaXNlc18pKTsKLX0KLQotbGVmaU5vaXNlVmljdGltOjp+bGVmaU5vaXNlVmljdGltKCkKLXsKLSAgICBEZXN0cm95KCk7Ci19Ci0KLXZvaWQKLWxlZmlOb2lzZVZpY3RpbTo6YWRkVmljdGltTm9pc2UoZG91YmxlIGQpCi17Ci0gICAgaWYgKG51bU5vaXNlc18gPT0gbm9pc2VzQWxsb2NhdGVkXykgewotICAgICAgICBpbnQgICAgIG1heDsKLSAgICAgICAgZG91YmxlICAqbmU7Ci0gICAgICAgIGludCAgICAgaTsKLQotICAgICAgICBpZiAobm9pc2VzQWxsb2NhdGVkXyA9PSAwKSB7Ci0gICAgICAgICAgICBtYXggPSBub2lzZXNBbGxvY2F0ZWRfID0gMjsKLSAgICAgICAgICAgIG51bU5vaXNlc18gPSAwOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIG1heCA9IG5vaXNlc0FsbG9jYXRlZF8gPSBudW1Ob2lzZXNfICogMjsKLSAgICAgICAgbmUgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbWF4KTsKLSAgICAgICAgbWF4IC89IDI7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykKLSAgICAgICAgICAgIG5lW2ldID0gbm9pc2VzX1tpXTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChub2lzZXNfKSk7Ci0gICAgICAgIG5vaXNlc18gPSBuZTsKLSAgICB9Ci0gICAgbm9pc2VzX1tudW1Ob2lzZXNfXSA9IGQ7Ci0gICAgbnVtTm9pc2VzXyArPSAxOwotfQotCi1pbnQKLWxlZmlOb2lzZVZpY3RpbTo6bnVtTm9pc2VzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbnVtTm9pc2VzXzsKLX0KLQotZG91YmxlCi1sZWZpTm9pc2VWaWN0aW06Om5vaXNlKGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gbm9pc2VzX1tpbmRleF07Ci19Ci0KLWRvdWJsZQotbGVmaU5vaXNlVmljdGltOjpsZW5ndGgoKSBjb25zdAotewotICAgIHJldHVybiBsZW5ndGhfOwotfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gbGVmaU5vaXNlUmVzaXN0YW5jZQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotbGVmaU5vaXNlUmVzaXN0YW5jZTo6bGVmaU5vaXNlUmVzaXN0YW5jZSgpCi06IG51bU51bXNfKDApLAotICBudW1zQWxsb2NhdGVkXygwKSwKLSAgbnVtc18oTlVMTCksCi0gIG51bVZpY3RpbXNfKDApLAotICB2aWN0aW1zQWxsb2NhdGVkXygwKSwKLSAgdmljdGltc18oTlVMTCkKLXsKLSAgICBJbml0KCk7Ci19Ci0KLXZvaWQKLWxlZmlOb2lzZVJlc2lzdGFuY2U6OkluaXQoKQotewotICAgIG51bU51bXNfID0gMDsKLSAgICBudW1zQWxsb2NhdGVkXyA9IDE7Ci0gICAgbnVtc18gPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogMSk7Ci0KLSAgICBudW1WaWN0aW1zXyA9IDA7Ci0gICAgdmljdGltc0FsbG9jYXRlZF8gPSAyOwotICAgIHZpY3RpbXNfID0gKGxlZmlOb2lzZVZpY3RpbSoqKSBsZWZNYWxsb2Moc2l6ZW9mKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaU5vaXNlVmljdGltKikgKiAyKTsKLX0KLQotdm9pZAotbGVmaU5vaXNlUmVzaXN0YW5jZTo6Y2xlYXIoKQotewotICAgIGludCAgICAgICAgICAgICBpOwotICAgIGxlZmlOb2lzZVZpY3RpbSAqcjsKLSAgICBpbnQgICAgICAgICAgICAgbWF4ID0gbnVtVmljdGltc187Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLSAgICAgICAgciA9IHZpY3RpbXNfW2ldOwotICAgICAgICByLT5EZXN0cm95KCk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSByKTsKLSAgICB9Ci0gICAgbnVtVmljdGltc18gPSAwOwotICAgIG51bU51bXNfID0gMDsKLX0KLQotdm9pZAotbGVmaU5vaXNlUmVzaXN0YW5jZTo6RGVzdHJveSgpCi17Ci0gICAgY2xlYXIoKTsKLSAgICBsZWZGcmVlKChjaGFyKikgKG51bXNfKSk7Ci0gICAgbGVmRnJlZSgoY2hhciopICh2aWN0aW1zXykpOwotfQotCi1sZWZpTm9pc2VSZXNpc3RhbmNlOjp+bGVmaU5vaXNlUmVzaXN0YW5jZSgpCi17Ci0gICAgRGVzdHJveSgpOwotfQotCi12b2lkCi1sZWZpTm9pc2VSZXNpc3RhbmNlOjphZGRSZXNpc3RhbmNlTnVtYmVyKGRvdWJsZSBkKQotewotICAgIGlmIChudW1OdW1zXyA9PSBudW1zQWxsb2NhdGVkXykgewotICAgICAgICBpbnQgICAgIG1heDsKLSAgICAgICAgZG91YmxlICAqbmU7Ci0gICAgICAgIGludCAgICAgaTsKLQotICAgICAgICBpZiAobnVtc0FsbG9jYXRlZF8gPT0gMCkgewotICAgICAgICAgICAgbWF4ID0gbnVtc0FsbG9jYXRlZF8gPSAyOwotICAgICAgICAgICAgbnVtTnVtc18gPSAwOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIG1heCA9IG51bXNBbGxvY2F0ZWRfID0gbnVtTnVtc18gKiAyOwotICAgICAgICBuZSA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBtYXgpOwotICAgICAgICBtYXggLz0gMjsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKQotICAgICAgICAgICAgbmVbaV0gPSBudW1zX1tpXTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChudW1zXykpOwotICAgICAgICBudW1zXyA9IG5lOwotICAgIH0KLSAgICBudW1zX1tudW1OdW1zX10gPSBkOwotICAgIG51bU51bXNfICs9IDE7Ci19Ci0KLXZvaWQKLWxlZmlOb2lzZVJlc2lzdGFuY2U6OmFkZFZpY3RpbU5vaXNlKGRvdWJsZSBkKQotewotICAgIGxlZmlOb2lzZVZpY3RpbSAqciA9IHZpY3RpbXNfW251bVZpY3RpbXNfIC0gMV07Ci0gICAgci0+YWRkVmljdGltTm9pc2UoZCk7Ci19Ci0KLXZvaWQKLWxlZmlOb2lzZVJlc2lzdGFuY2U6OmFkZFZpY3RpbUxlbmd0aChkb3VibGUgZCkKLXsKLSAgICBsZWZpTm9pc2VWaWN0aW0gKnI7Ci0gICAgaWYgKG51bVZpY3RpbXNfID09IHZpY3RpbXNBbGxvY2F0ZWRfKSB7Ci0gICAgICAgIGludCAgICAgICAgICAgICBtYXg7Ci0gICAgICAgIGxlZmlOb2lzZVZpY3RpbSAqKm5lOwotICAgICAgICBpbnQgICAgICAgICAgICAgaTsKLQotICAgICAgICBpZiAodmljdGltc0FsbG9jYXRlZF8gPT0gMCkgewotICAgICAgICAgICAgbWF4ID0gdmljdGltc0FsbG9jYXRlZF8gPSAyOwotICAgICAgICAgICAgbnVtVmljdGltc18gPSAwOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIG1heCA9IHZpY3RpbXNBbGxvY2F0ZWRfID0gbnVtVmljdGltc18gKiAyOwotCi0gICAgICAgIG5lID0gKGxlZmlOb2lzZVZpY3RpbSoqKSBsZWZNYWxsb2Moc2l6ZW9mKGxlZmlOb2lzZVZpY3RpbSopICogbWF4KTsKLSAgICAgICAgbWF4IC89IDI7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykKLSAgICAgICAgICAgIG5lW2ldID0gdmljdGltc19baV07Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAodmljdGltc18pKTsKLSAgICAgICAgdmljdGltc18gPSBuZTsKLSAgICB9Ci0gICAgciA9IChsZWZpTm9pc2VWaWN0aW0qKSBsZWZNYWxsb2Moc2l6ZW9mKGxlZmlOb2lzZVZpY3RpbSkpOwotICAgIHItPkluaXQoZCk7Ci0gICAgdmljdGltc19bbnVtVmljdGltc19dID0gcjsKLSAgICBudW1WaWN0aW1zXyArPSAxOwotfQotCi1pbnQKLWxlZmlOb2lzZVJlc2lzdGFuY2U6Om51bVZpY3RpbXMoKSBjb25zdAotewotICAgIHJldHVybiBudW1WaWN0aW1zXzsKLX0KLQotbGVmaU5vaXNlVmljdGltICoKLWxlZmlOb2lzZVJlc2lzdGFuY2U6OnZpY3RpbShpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHZpY3RpbXNfW2luZGV4XTsKLX0KLQotaW50Ci1sZWZpTm9pc2VSZXNpc3RhbmNlOjpudW1OdW1zKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbnVtTnVtc187Ci19Ci0KLWRvdWJsZQotbGVmaU5vaXNlUmVzaXN0YW5jZTo6bnVtKGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gbnVtc19baW5kZXhdOwotfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gbGVmaU5vaXNlRWRnZQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotbGVmaU5vaXNlRWRnZTo6bGVmaU5vaXNlRWRnZSgpCi17Ci0gICAgSW5pdCgpOwotfQotCi12b2lkCi1sZWZpTm9pc2VFZGdlOjpJbml0KCkKLXsKLSAgICBlZGdlXyA9IDA7Ci0KLSAgICBudW1SZXNpc3RhbmNlc18gPSAwOwotICAgIHJlc2lzdGFuY2VzQWxsb2NhdGVkXyA9IDI7Ci0gICAgcmVzaXN0YW5jZXNfID0gKGxlZmlOb2lzZVJlc2lzdGFuY2UqKikgbGVmTWFsbG9jKHNpemVvZigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaU5vaXNlUmVzaXN0YW5jZSopICogMik7Ci19Ci0KLXZvaWQKLWxlZmlOb2lzZUVkZ2U6OmNsZWFyKCkKLXsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGk7Ci0gICAgbGVmaU5vaXNlUmVzaXN0YW5jZSAqcjsKLSAgICBpbnQgICAgICAgICAgICAgICAgIG1heHIgPSBudW1SZXNpc3RhbmNlc187Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbWF4cjsgaSsrKSB7Ci0gICAgICAgIHIgPSByZXNpc3RhbmNlc19baV07Ci0gICAgICAgIHItPkRlc3Ryb3koKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIHIpOwotICAgIH0KLQotICAgIGVkZ2VfID0gMDsKLSAgICBudW1SZXNpc3RhbmNlc18gPSAwOwotfQotCi12b2lkCi1sZWZpTm9pc2VFZGdlOjpEZXN0cm95KCkKLXsKLSAgICBjbGVhcigpOwotICAgIGxlZkZyZWUoKGNoYXIqKSAocmVzaXN0YW5jZXNfKSk7Ci19Ci0KLWxlZmlOb2lzZUVkZ2U6On5sZWZpTm9pc2VFZGdlKCkKLXsKLSAgICBEZXN0cm95KCk7Ci19Ci0KLXZvaWQKLWxlZmlOb2lzZUVkZ2U6OmFkZEVkZ2UoZG91YmxlIGQpCi17Ci0gICAgZWRnZV8gPSBkOwotfQotCi12b2lkCi1sZWZpTm9pc2VFZGdlOjphZGRSZXNpc3RhbmNlTnVtYmVyKGRvdWJsZSBkKQotewotICAgIGxlZmlOb2lzZVJlc2lzdGFuY2UgKnIgPSByZXNpc3RhbmNlc19bbnVtUmVzaXN0YW5jZXNfIC0gMV07Ci0gICAgci0+YWRkUmVzaXN0YW5jZU51bWJlcihkKTsKLX0KLQotCi12b2lkCi1sZWZpTm9pc2VFZGdlOjphZGRSZXNpc3RhbmNlKCkKLXsKLSAgICBsZWZpTm9pc2VSZXNpc3RhbmNlICpyOwotICAgIGlmIChudW1SZXNpc3RhbmNlc18gPT0gcmVzaXN0YW5jZXNBbGxvY2F0ZWRfKSB7Ci0gICAgICAgIGludCAgICAgICAgICAgICAgICAgbWF4OwotICAgICAgICBsZWZpTm9pc2VSZXNpc3RhbmNlICoqbmU7Ci0gICAgICAgIGludCAgICAgICAgICAgICAgICAgaTsKLQotICAgICAgICBpZiAocmVzaXN0YW5jZXNBbGxvY2F0ZWRfID09IDApIHsKLSAgICAgICAgICAgIG1heCA9IHJlc2lzdGFuY2VzQWxsb2NhdGVkXyA9IDI7Ci0gICAgICAgICAgICBudW1SZXNpc3RhbmNlc18gPSAwOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIG1heCA9IHJlc2lzdGFuY2VzQWxsb2NhdGVkXyA9IG51bVJlc2lzdGFuY2VzXyAqIDI7Ci0gICAgICAgIG5lID0gKGxlZmlOb2lzZVJlc2lzdGFuY2UqKikgbGVmTWFsbG9jKHNpemVvZihsZWZpTm9pc2VSZXNpc3RhbmNlKikgKiBtYXgpOwotICAgICAgICBtYXggLz0gMjsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKQotICAgICAgICAgICAgbmVbaV0gPSByZXNpc3RhbmNlc19baV07Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAocmVzaXN0YW5jZXNfKSk7Ci0gICAgICAgIHJlc2lzdGFuY2VzXyA9IG5lOwotICAgIH0KLSAgICByID0gKGxlZmlOb2lzZVJlc2lzdGFuY2UqKSBsZWZNYWxsb2Moc2l6ZW9mKGxlZmlOb2lzZVJlc2lzdGFuY2UpKTsKLSAgICByLT5Jbml0KCk7Ci0gICAgcmVzaXN0YW5jZXNfW251bVJlc2lzdGFuY2VzX10gPSByOwotICAgIG51bVJlc2lzdGFuY2VzXyArPSAxOwotfQotCi12b2lkCi1sZWZpTm9pc2VFZGdlOjphZGRWaWN0aW1Ob2lzZShkb3VibGUgZCkKLXsKLSAgICBsZWZpTm9pc2VSZXNpc3RhbmNlICpyID0gcmVzaXN0YW5jZXNfW251bVJlc2lzdGFuY2VzXyAtIDFdOwotICAgIHItPmFkZFZpY3RpbU5vaXNlKGQpOwotfQotCi12b2lkCi1sZWZpTm9pc2VFZGdlOjphZGRWaWN0aW1MZW5ndGgoZG91YmxlIGQpCi17Ci0gICAgbGVmaU5vaXNlUmVzaXN0YW5jZSAqciA9IHJlc2lzdGFuY2VzX1tudW1SZXNpc3RhbmNlc18gLSAxXTsKLSAgICByLT5hZGRWaWN0aW1MZW5ndGgoZCk7Ci19Ci0KLWludAotbGVmaU5vaXNlRWRnZTo6bnVtUmVzaXN0YW5jZXMoKQotewotICAgIHJldHVybiBudW1SZXNpc3RhbmNlc187Ci19Ci0KLWxlZmlOb2lzZVJlc2lzdGFuY2UgKgotbGVmaU5vaXNlRWRnZTo6cmVzaXN0YW5jZShpbnQgaW5kZXgpCi17Ci0gICAgcmV0dXJuIHJlc2lzdGFuY2VzX1tpbmRleF07Ci19Ci0KLWRvdWJsZQotbGVmaU5vaXNlRWRnZTo6ZWRnZSgpCi17Ci0gICAgcmV0dXJuIGVkZ2VfOwotfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gbGVmaU5vaXNlVGFibGUKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLWxlZmlOb2lzZVRhYmxlOjpsZWZpTm9pc2VUYWJsZSgpCi17Ci0gICAgSW5pdCgpOwotfQotCi12b2lkCi1sZWZpTm9pc2VUYWJsZTo6SW5pdCgpCi17Ci0gICAgbnVtRWRnZXNfID0gMDsKLSAgICBlZGdlc0FsbG9jYXRlZF8gPSAyOwotICAgIGVkZ2VzXyA9IChsZWZpTm9pc2VFZGdlKiopIGxlZk1hbGxvYyhzaXplb2YobGVmaU5vaXNlRWRnZSopICogMik7Ci19Ci0KLXZvaWQKLWxlZmlOb2lzZVRhYmxlOjpjbGVhcigpCi17Ci0gICAgaW50ICAgICAgICAgICAgIGk7Ci0gICAgbGVmaU5vaXNlRWRnZSAgICpyOwotICAgIGludCAgICAgICAgICAgICBtYXggPSBudW1FZGdlc187Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLSAgICAgICAgciA9IGVkZ2VzX1tpXTsKLSAgICAgICAgci0+RGVzdHJveSgpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgcik7Ci0gICAgfQotICAgIG51bUVkZ2VzXyA9IDA7Ci19Ci0KLXZvaWQKLWxlZmlOb2lzZVRhYmxlOjpEZXN0cm95KCkKLXsKLSAgICBjbGVhcigpOwotICAgIGxlZkZyZWUoKGNoYXIqKSAoZWRnZXNfKSk7Ci19Ci0KLWxlZmlOb2lzZVRhYmxlOjp+bGVmaU5vaXNlVGFibGUoKQotewotICAgIERlc3Ryb3koKTsKLX0KLQotdm9pZAotbGVmaU5vaXNlVGFibGU6OnNldHVwKGludCBpKQotewotICAgIG51bV8gPSBpOwotICAgIGNsZWFyKCk7Ci19Ci0KLXZvaWQKLWxlZmlOb2lzZVRhYmxlOjpuZXdFZGdlKCkKLXsKLSAgICBsZWZpTm9pc2VFZGdlICpyOwotICAgIGlmIChudW1FZGdlc18gPT0gZWRnZXNBbGxvY2F0ZWRfKSB7Ci0gICAgICAgIGludCAgICAgICAgICAgICBtYXg7Ci0gICAgICAgIGxlZmlOb2lzZUVkZ2UgICAqKm5lOwotICAgICAgICBpbnQgICAgICAgICAgICAgaTsKLQotICAgICAgICBpZiAoZWRnZXNBbGxvY2F0ZWRfID09IDApIHsKLSAgICAgICAgICAgIG1heCA9IGVkZ2VzQWxsb2NhdGVkXyA9IDI7Ci0gICAgICAgICAgICBudW1FZGdlc18gPSAwOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIG1heCA9IGVkZ2VzQWxsb2NhdGVkXyA9IG51bUVkZ2VzXyAqIDI7Ci0gICAgICAgIG5lID0gKGxlZmlOb2lzZUVkZ2UqKikgbGVmTWFsbG9jKHNpemVvZihsZWZpTm9pc2VFZGdlKikgKiBtYXgpOwotICAgICAgICBtYXggLz0gMjsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKQotICAgICAgICAgICAgbmVbaV0gPSBlZGdlc19baV07Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoZWRnZXNfKSk7Ci0gICAgICAgIGVkZ2VzXyA9IG5lOwotICAgIH0KLSAgICByID0gKGxlZmlOb2lzZUVkZ2UqKSBsZWZNYWxsb2Moc2l6ZW9mKGxlZmlOb2lzZUVkZ2UpKTsKLSAgICByLT5Jbml0KCk7Ci0gICAgZWRnZXNfW251bUVkZ2VzX10gPSByOwotICAgIG51bUVkZ2VzXyArPSAxOwotfQotCi12b2lkCi1sZWZpTm9pc2VUYWJsZTo6YWRkRWRnZShkb3VibGUgZCkKLXsKLSAgICBsZWZpTm9pc2VFZGdlICpyID0gZWRnZXNfW251bUVkZ2VzXyAtIDFdOwotICAgIHItPmFkZEVkZ2UoZCk7Ci19Ci0KLXZvaWQKLWxlZmlOb2lzZVRhYmxlOjphZGRSZXNpc3RhbmNlKCkKLXsKLSAgICBsZWZpTm9pc2VFZGdlICpyID0gZWRnZXNfW251bUVkZ2VzXyAtIDFdOwotICAgIHItPmFkZFJlc2lzdGFuY2UoKTsKLX0KLQotdm9pZAotbGVmaU5vaXNlVGFibGU6OmFkZFJlc2lzdGFuY2VOdW1iZXIoZG91YmxlIGQpCi17Ci0gICAgbGVmaU5vaXNlRWRnZSAqciA9IGVkZ2VzX1tudW1FZGdlc18gLSAxXTsKLSAgICByLT5hZGRSZXNpc3RhbmNlTnVtYmVyKGQpOwotfQotCi12b2lkCi1sZWZpTm9pc2VUYWJsZTo6YWRkVmljdGltTGVuZ3RoKGRvdWJsZSBkKQotewotICAgIGxlZmlOb2lzZUVkZ2UgKnIgPSBlZGdlc19bbnVtRWRnZXNfIC0gMV07Ci0gICAgci0+YWRkVmljdGltTGVuZ3RoKGQpOwotfQotCi12b2lkCi1sZWZpTm9pc2VUYWJsZTo6YWRkVmljdGltTm9pc2UoZG91YmxlIGQpCi17Ci0gICAgbGVmaU5vaXNlRWRnZSAqciA9IGVkZ2VzX1tudW1FZGdlc18gLSAxXTsKLSAgICByLT5hZGRWaWN0aW1Ob2lzZShkKTsKLX0KLQotaW50Ci1sZWZpTm9pc2VUYWJsZTo6bnVtKCkKLXsKLSAgICByZXR1cm4gbnVtXzsKLX0KLQotaW50Ci1sZWZpTm9pc2VUYWJsZTo6bnVtRWRnZXMoKQotewotICAgIHJldHVybiBudW1FZGdlc187Ci19Ci0KLWxlZmlOb2lzZUVkZ2UgKgotbGVmaU5vaXNlVGFibGU6OmVkZ2UoaW50IGluZGV4KQotewotICAgIHJldHVybiBlZGdlc19baW5kZXhdOwotfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gbGVmaUNvcnJlY3Rpb25WaWN0aW0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLWxlZmlDb3JyZWN0aW9uVmljdGltOjpsZWZpQ29ycmVjdGlvblZpY3RpbShkb3VibGUgZCkKLXsKLSAgICBJbml0KGQpOwotfQotCi12b2lkCi1sZWZpQ29ycmVjdGlvblZpY3RpbTo6SW5pdChkb3VibGUgZCkKLXsKLSAgICBsZW5ndGhfID0gZDsKLQotICAgIG51bUNvcnJlY3Rpb25zXyA9IDA7Ci0gICAgY29ycmVjdGlvbnNBbGxvY2F0ZWRfID0gMjsKLSAgICBjb3JyZWN0aW9uc18gPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogMik7Ci19Ci0KLXZvaWQKLWxlZmlDb3JyZWN0aW9uVmljdGltOjpjbGVhcigpCi17Ci0gICAgbnVtQ29ycmVjdGlvbnNfID0gMDsKLX0KLQotdm9pZAotbGVmaUNvcnJlY3Rpb25WaWN0aW06OkRlc3Ryb3koKQotewotICAgIGNsZWFyKCk7Ci0gICAgbGVmRnJlZSgoY2hhciopIChjb3JyZWN0aW9uc18pKTsKLX0KLQotbGVmaUNvcnJlY3Rpb25WaWN0aW06On5sZWZpQ29ycmVjdGlvblZpY3RpbSgpCi17Ci0gICAgRGVzdHJveSgpOwotfQotCi12b2lkCi1sZWZpQ29ycmVjdGlvblZpY3RpbTo6YWRkVmljdGltQ29ycmVjdGlvbihkb3VibGUgZCkKLXsKLSAgICBpZiAobnVtQ29ycmVjdGlvbnNfID09IGNvcnJlY3Rpb25zQWxsb2NhdGVkXykgewotICAgICAgICBpbnQgICAgIG1heDsKLSAgICAgICAgZG91YmxlICAqbmU7Ci0gICAgICAgIGludCAgICAgaTsKLQotICAgICAgICBpZiAoY29ycmVjdGlvbnNBbGxvY2F0ZWRfID09IDApIHsKLSAgICAgICAgICAgIG1heCA9IGNvcnJlY3Rpb25zQWxsb2NhdGVkXyA9IDI7Ci0gICAgICAgICAgICBudW1Db3JyZWN0aW9uc18gPSAwOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIG1heCA9IGNvcnJlY3Rpb25zQWxsb2NhdGVkXyA9IG51bUNvcnJlY3Rpb25zXyAqIDI7Ci0gICAgICAgIG5lID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIG1heCk7Ci0gICAgICAgIG1heCAvPSAyOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspCi0gICAgICAgICAgICBuZVtpXSA9IGNvcnJlY3Rpb25zX1tpXTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChjb3JyZWN0aW9uc18pKTsKLSAgICAgICAgY29ycmVjdGlvbnNfID0gbmU7Ci0gICAgfQotICAgIGNvcnJlY3Rpb25zX1tudW1Db3JyZWN0aW9uc19dID0gZDsKLSAgICBudW1Db3JyZWN0aW9uc18gKz0gMTsKLX0KLQotaW50Ci1sZWZpQ29ycmVjdGlvblZpY3RpbTo6bnVtQ29ycmVjdGlvbnMoKQotewotICAgIHJldHVybiBudW1Db3JyZWN0aW9uc187Ci19Ci0KLWRvdWJsZQotbGVmaUNvcnJlY3Rpb25WaWN0aW06OmNvcnJlY3Rpb24oaW50IGluZGV4KQotewotICAgIHJldHVybiBjb3JyZWN0aW9uc19baW5kZXhdOwotfQotCi1kb3VibGUKLWxlZmlDb3JyZWN0aW9uVmljdGltOjpsZW5ndGgoKQotewotICAgIHJldHVybiBsZW5ndGhfOwotfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gbGVmaUNvcnJlY3Rpb25SZXNpc3RhbmNlCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1sZWZpQ29ycmVjdGlvblJlc2lzdGFuY2U6OmxlZmlDb3JyZWN0aW9uUmVzaXN0YW5jZSgpCi17Ci0gICAgSW5pdCgpOwotfQotCi12b2lkCi1sZWZpQ29ycmVjdGlvblJlc2lzdGFuY2U6OkluaXQoKQotewotICAgIG51bU51bXNfID0gMDsKLSAgICBudW1zQWxsb2NhdGVkXyA9IDE7Ci0gICAgbnVtc18gPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogMSk7Ci0KLSAgICBudW1WaWN0aW1zXyA9IDA7Ci0gICAgdmljdGltc0FsbG9jYXRlZF8gPSAyOwotICAgIHZpY3RpbXNfID0gKGxlZmlDb3JyZWN0aW9uVmljdGltKiopIGxlZk1hbGxvYyhzaXplb2YoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZmlDb3JyZWN0aW9uVmljdGltKikgKiAyKTsKLX0KLQotdm9pZAotbGVmaUNvcnJlY3Rpb25SZXNpc3RhbmNlOjpjbGVhcigpCi17Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgaTsKLSAgICBsZWZpQ29ycmVjdGlvblZpY3RpbSAgICAqcjsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtYXggPSBudW1WaWN0aW1zXzsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykgewotICAgICAgICByID0gdmljdGltc19baV07Ci0gICAgICAgIHItPkRlc3Ryb3koKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIHIpOwotICAgIH0KLSAgICBudW1WaWN0aW1zXyA9IDA7Ci0gICAgbnVtTnVtc18gPSAwOwotfQotCi12b2lkCi1sZWZpQ29ycmVjdGlvblJlc2lzdGFuY2U6OkRlc3Ryb3koKQotewotICAgIGNsZWFyKCk7Ci0gICAgbGVmRnJlZSgoY2hhciopIChudW1zXykpOwotICAgIGxlZkZyZWUoKGNoYXIqKSAodmljdGltc18pKTsKLX0KLQotbGVmaUNvcnJlY3Rpb25SZXNpc3RhbmNlOjp+bGVmaUNvcnJlY3Rpb25SZXNpc3RhbmNlKCkKLXsKLSAgICBEZXN0cm95KCk7Ci19Ci0KLXZvaWQKLWxlZmlDb3JyZWN0aW9uUmVzaXN0YW5jZTo6YWRkUmVzaXN0YW5jZU51bWJlcihkb3VibGUgZCkKLXsKLSAgICBpZiAobnVtTnVtc18gPT0gbnVtc0FsbG9jYXRlZF8pIHsKLSAgICAgICAgaW50ICAgICBtYXg7Ci0gICAgICAgIGRvdWJsZSAgKm5lOwotICAgICAgICBpbnQgICAgIGk7Ci0KLSAgICAgICAgaWYgKG51bXNBbGxvY2F0ZWRfKSB7Ci0gICAgICAgICAgICBtYXggPSBudW1zQWxsb2NhdGVkXyA9IDI7Ci0gICAgICAgICAgICBudW1OdW1zXyA9IDA7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgbWF4ID0gbnVtc0FsbG9jYXRlZF8gPSBudW1OdW1zXyAqIDI7Ci0gICAgICAgIG5lID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIG1heCk7Ci0gICAgICAgIG1heCAvPSAyOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspCi0gICAgICAgICAgICBuZVtpXSA9IG51bXNfW2ldOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKG51bXNfKSk7Ci0gICAgICAgIG51bXNfID0gbmU7Ci0gICAgfQotICAgIG51bXNfW251bU51bXNfXSA9IGQ7Ci0gICAgbnVtTnVtc18gKz0gMTsKLX0KLQotdm9pZAotbGVmaUNvcnJlY3Rpb25SZXNpc3RhbmNlOjphZGRWaWN0aW1Db3JyZWN0aW9uKGRvdWJsZSBkKQotewotICAgIGxlZmlDb3JyZWN0aW9uVmljdGltICpyID0gdmljdGltc19bbnVtVmljdGltc18gLSAxXTsKLSAgICByLT5hZGRWaWN0aW1Db3JyZWN0aW9uKGQpOwotfQotCi12b2lkCi1sZWZpQ29ycmVjdGlvblJlc2lzdGFuY2U6OmFkZFZpY3RpbUxlbmd0aChkb3VibGUgZCkKLXsKLSAgICBsZWZpQ29ycmVjdGlvblZpY3RpbSAqcjsKLSAgICBpZiAobnVtVmljdGltc18gPT0gdmljdGltc0FsbG9jYXRlZF8pIHsKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbWF4OwotICAgICAgICBsZWZpQ29ycmVjdGlvblZpY3RpbSAgICAqKm5lOwotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBpOwotCi0gICAgICAgIGlmICh2aWN0aW1zQWxsb2NhdGVkXyA9PSAwKSB7Ci0gICAgICAgICAgICBtYXggPSB2aWN0aW1zQWxsb2NhdGVkXyA9IDI7Ci0gICAgICAgICAgICBudW1WaWN0aW1zXyA9IDA7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgbWF4ID0gdmljdGltc0FsbG9jYXRlZF8gPSBudW1WaWN0aW1zXyAqIDI7Ci0gICAgICAgIG5lID0gKGxlZmlDb3JyZWN0aW9uVmljdGltKiopIGxlZk1hbGxvYyhzaXplb2YobGVmaUNvcnJlY3Rpb25WaWN0aW0qKSAqIG1heCk7Ci0gICAgICAgIG1heCAvPSAyOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspCi0gICAgICAgICAgICBuZVtpXSA9IHZpY3RpbXNfW2ldOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHZpY3RpbXNfKSk7Ci0gICAgICAgIHZpY3RpbXNfID0gbmU7Ci0gICAgfQotICAgIHIgPSAobGVmaUNvcnJlY3Rpb25WaWN0aW0qKSBsZWZNYWxsb2Moc2l6ZW9mKGxlZmlDb3JyZWN0aW9uVmljdGltKSk7Ci0gICAgci0+SW5pdChkKTsKLSAgICB2aWN0aW1zX1tudW1WaWN0aW1zX10gPSByOwotICAgIG51bVZpY3RpbXNfICs9IDE7Ci19Ci0KLWludAotbGVmaUNvcnJlY3Rpb25SZXNpc3RhbmNlOjpudW1WaWN0aW1zKCkKLXsKLSAgICByZXR1cm4gbnVtVmljdGltc187Ci19Ci0KLWxlZmlDb3JyZWN0aW9uVmljdGltICoKLWxlZmlDb3JyZWN0aW9uUmVzaXN0YW5jZTo6dmljdGltKGludCBpbmRleCkKLXsKLSAgICByZXR1cm4gdmljdGltc19baW5kZXhdOwotfQotCi1pbnQKLWxlZmlDb3JyZWN0aW9uUmVzaXN0YW5jZTo6bnVtTnVtcygpCi17Ci0gICAgcmV0dXJuIG51bU51bXNfOwotfQotCi1kb3VibGUKLWxlZmlDb3JyZWN0aW9uUmVzaXN0YW5jZTo6bnVtKGludCBpbmRleCkKLXsKLSAgICByZXR1cm4gbnVtc19baW5kZXhdOwotfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gbGVmaUNvcnJlY3Rpb25FZGdlCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0KLWxlZmlDb3JyZWN0aW9uRWRnZTo6bGVmaUNvcnJlY3Rpb25FZGdlKCkKLXsKLSAgICBJbml0KCk7Ci19Ci0KLQotdm9pZAotbGVmaUNvcnJlY3Rpb25FZGdlOjpJbml0KCkKLXsKLSAgICBlZGdlXyA9IDA7Ci0KLSAgICBudW1SZXNpc3RhbmNlc18gPSAwOwotICAgIHJlc2lzdGFuY2VzQWxsb2NhdGVkXyA9IDI7Ci0gICAgcmVzaXN0YW5jZXNfID0gKGxlZmlDb3JyZWN0aW9uUmVzaXN0YW5jZSoqKSBsZWZNYWxsb2Moc2l6ZW9mKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZmlDb3JyZWN0aW9uUmVzaXN0YW5jZSopICogMik7Ci19Ci0KLQotdm9pZAotbGVmaUNvcnJlY3Rpb25FZGdlOjpjbGVhcigpCi17Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0gICAgbGVmaUNvcnJlY3Rpb25SZXNpc3RhbmNlICAgICpyOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtYXhyID0gbnVtUmVzaXN0YW5jZXNfOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG1heHI7IGkrKykgewotICAgICAgICByID0gcmVzaXN0YW5jZXNfW2ldOwotICAgICAgICByLT5EZXN0cm95KCk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSByKTsKLSAgICB9Ci0KLSAgICBlZGdlXyA9IDA7Ci0gICAgbnVtUmVzaXN0YW5jZXNfID0gMDsKLX0KLQotCi12b2lkCi1sZWZpQ29ycmVjdGlvbkVkZ2U6OkRlc3Ryb3koKQotewotICAgIGNsZWFyKCk7Ci0gICAgbGVmRnJlZSgoY2hhciopIChyZXNpc3RhbmNlc18pKTsKLX0KLQotCi1sZWZpQ29ycmVjdGlvbkVkZ2U6On5sZWZpQ29ycmVjdGlvbkVkZ2UoKQotewotICAgIERlc3Ryb3koKTsKLX0KLQotCi12b2lkCi1sZWZpQ29ycmVjdGlvbkVkZ2U6OmFkZEVkZ2UoZG91YmxlIGQpCi17Ci0gICAgZWRnZV8gPSBkOwotfQotCi0KLXZvaWQKLWxlZmlDb3JyZWN0aW9uRWRnZTo6YWRkUmVzaXN0YW5jZU51bWJlcihkb3VibGUgZCkKLXsKLSAgICBsZWZpQ29ycmVjdGlvblJlc2lzdGFuY2UgKnIgPSByZXNpc3RhbmNlc19bbnVtUmVzaXN0YW5jZXNfIC0gMV07Ci0gICAgci0+YWRkUmVzaXN0YW5jZU51bWJlcihkKTsKLX0KLQotCi12b2lkCi1sZWZpQ29ycmVjdGlvbkVkZ2U6OmFkZFJlc2lzdGFuY2UoKQotewotICAgIGxlZmlDb3JyZWN0aW9uUmVzaXN0YW5jZSAqcjsKLSAgICBpZiAobnVtUmVzaXN0YW5jZXNfID09IHJlc2lzdGFuY2VzQWxsb2NhdGVkXykgewotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbWF4OwotICAgICAgICBsZWZpQ29ycmVjdGlvblJlc2lzdGFuY2UgICAgKipuZTsKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0KLSAgICAgICAgaWYgKHJlc2lzdGFuY2VzQWxsb2NhdGVkXyA9PSAwKSB7Ci0gICAgICAgICAgICBtYXggPSByZXNpc3RhbmNlc0FsbG9jYXRlZF8gPSAyOwotICAgICAgICAgICAgbnVtUmVzaXN0YW5jZXNfID0gMDsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBtYXggPSByZXNpc3RhbmNlc0FsbG9jYXRlZF8gPSBudW1SZXNpc3RhbmNlc18gKiAyOwotICAgICAgICBuZSA9IChsZWZpQ29ycmVjdGlvblJlc2lzdGFuY2UqKikgbGVmTWFsbG9jCi0gICAgICAgICAgICAoc2l6ZW9mKGxlZmlDb3JyZWN0aW9uUmVzaXN0YW5jZSopICogbWF4KTsKLSAgICAgICAgbWF4IC89IDI7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykKLSAgICAgICAgICAgIG5lW2ldID0gcmVzaXN0YW5jZXNfW2ldOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHJlc2lzdGFuY2VzXykpOwotICAgICAgICByZXNpc3RhbmNlc18gPSBuZTsKLSAgICB9Ci0gICAgciA9IChsZWZpQ29ycmVjdGlvblJlc2lzdGFuY2UqKSBsZWZNYWxsb2Moc2l6ZW9mKGxlZmlDb3JyZWN0aW9uUmVzaXN0YW5jZSkpOwotICAgIHItPkluaXQoKTsKLSAgICByZXNpc3RhbmNlc19bbnVtUmVzaXN0YW5jZXNfXSA9IHI7Ci0gICAgbnVtUmVzaXN0YW5jZXNfICs9IDE7Ci19Ci0KLQotdm9pZAotbGVmaUNvcnJlY3Rpb25FZGdlOjphZGRWaWN0aW1Db3JyZWN0aW9uKGRvdWJsZSBkKQotewotICAgIGxlZmlDb3JyZWN0aW9uUmVzaXN0YW5jZSAqciA9IHJlc2lzdGFuY2VzX1tudW1SZXNpc3RhbmNlc18gLSAxXTsKLSAgICByLT5hZGRWaWN0aW1Db3JyZWN0aW9uKGQpOwotfQotCi0KLXZvaWQKLWxlZmlDb3JyZWN0aW9uRWRnZTo6YWRkVmljdGltTGVuZ3RoKGRvdWJsZSBkKQotewotICAgIGxlZmlDb3JyZWN0aW9uUmVzaXN0YW5jZSAqciA9IHJlc2lzdGFuY2VzX1tudW1SZXNpc3RhbmNlc18gLSAxXTsKLSAgICByLT5hZGRWaWN0aW1MZW5ndGgoZCk7Ci19Ci0KLQotaW50Ci1sZWZpQ29ycmVjdGlvbkVkZ2U6Om51bVJlc2lzdGFuY2VzKCkKLXsKLSAgICByZXR1cm4gbnVtUmVzaXN0YW5jZXNfOwotfQotCi0KLWxlZmlDb3JyZWN0aW9uUmVzaXN0YW5jZSAqCi1sZWZpQ29ycmVjdGlvbkVkZ2U6OnJlc2lzdGFuY2UoaW50IGluZGV4KQotewotICAgIHJldHVybiByZXNpc3RhbmNlc19baW5kZXhdOwotfQotCi0KLWRvdWJsZQotbGVmaUNvcnJlY3Rpb25FZGdlOjplZGdlKCkKLXsKLSAgICByZXR1cm4gZWRnZV87Ci19Ci0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIGxlZmlDb3JyZWN0aW9uVGFibGUKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLWxlZmlDb3JyZWN0aW9uVGFibGU6OmxlZmlDb3JyZWN0aW9uVGFibGUoKQotewotICAgIEluaXQoKTsKLX0KLQotdm9pZAotbGVmaUNvcnJlY3Rpb25UYWJsZTo6SW5pdCgpCi17Ci0gICAgbnVtRWRnZXNfID0gMDsKLSAgICBlZGdlc0FsbG9jYXRlZF8gPSAyOwotICAgIGVkZ2VzXyA9IChsZWZpQ29ycmVjdGlvbkVkZ2UqKikgbGVmTWFsbG9jKHNpemVvZihsZWZpQ29ycmVjdGlvbkVkZ2UqKSAqIDIpOwotfQotCi12b2lkCi1sZWZpQ29ycmVjdGlvblRhYmxlOjpjbGVhcigpCi17Ci0gICAgaW50ICAgICAgICAgICAgICAgICBpOwotICAgIGxlZmlDb3JyZWN0aW9uRWRnZSAgKnI7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBtYXggPSBudW1FZGdlc187Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLSAgICAgICAgciA9IGVkZ2VzX1tpXTsKLSAgICAgICAgci0+RGVzdHJveSgpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgcik7Ci0gICAgfQotICAgIG51bUVkZ2VzXyA9IDA7Ci19Ci0KLXZvaWQKLWxlZmlDb3JyZWN0aW9uVGFibGU6OkRlc3Ryb3koKQotewotICAgIGNsZWFyKCk7Ci0gICAgbGVmRnJlZSgoY2hhciopIChlZGdlc18pKTsKLX0KLQotbGVmaUNvcnJlY3Rpb25UYWJsZTo6fmxlZmlDb3JyZWN0aW9uVGFibGUoKQotewotICAgIERlc3Ryb3koKTsKLX0KLQotdm9pZAotbGVmaUNvcnJlY3Rpb25UYWJsZTo6c2V0dXAoaW50IGkpCi17Ci0gICAgbnVtXyA9IGk7Ci0gICAgY2xlYXIoKTsKLX0KLQotdm9pZAotbGVmaUNvcnJlY3Rpb25UYWJsZTo6bmV3RWRnZSgpCi17Ci0gICAgbGVmaUNvcnJlY3Rpb25FZGdlICpyOwotICAgIGlmIChudW1FZGdlc18gPT0gZWRnZXNBbGxvY2F0ZWRfKSB7Ci0gICAgICAgIGludCAgICAgICAgICAgICAgICAgbWF4OwotICAgICAgICBsZWZpQ29ycmVjdGlvbkVkZ2UgICoqbmU7Ci0gICAgICAgIGludCAgICAgICAgICAgICAgICAgaTsKLQotICAgICAgICBpZiAoZWRnZXNBbGxvY2F0ZWRfID09IDApIHsKLSAgICAgICAgICAgIG1heCA9IGVkZ2VzQWxsb2NhdGVkXyA9IDI7Ci0gICAgICAgICAgICBudW1FZGdlc18gPSAwOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIG1heCA9IGVkZ2VzQWxsb2NhdGVkXyA9IG51bUVkZ2VzXyAqIDI7Ci0gICAgICAgIG5lID0gKGxlZmlDb3JyZWN0aW9uRWRnZSoqKSBsZWZNYWxsb2Moc2l6ZW9mKGxlZmlDb3JyZWN0aW9uRWRnZSopICogbWF4KTsKLSAgICAgICAgbWF4IC89IDI7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykKLSAgICAgICAgICAgIG5lW2ldID0gZWRnZXNfW2ldOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGVkZ2VzXykpOwotICAgICAgICBlZGdlc18gPSBuZTsKLSAgICB9Ci0gICAgciA9IChsZWZpQ29ycmVjdGlvbkVkZ2UqKSBsZWZNYWxsb2Moc2l6ZW9mKGxlZmlDb3JyZWN0aW9uRWRnZSkpOwotICAgIHItPkluaXQoKTsKLSAgICBlZGdlc19bbnVtRWRnZXNfXSA9IHI7Ci0gICAgbnVtRWRnZXNfICs9IDE7Ci19Ci0KLXZvaWQKLWxlZmlDb3JyZWN0aW9uVGFibGU6OmFkZEVkZ2UoZG91YmxlIGQpCi17Ci0gICAgbGVmaUNvcnJlY3Rpb25FZGdlICpyID0gZWRnZXNfW251bUVkZ2VzXyAtIDFdOwotICAgIHItPmFkZEVkZ2UoZCk7Ci19Ci0KLXZvaWQKLWxlZmlDb3JyZWN0aW9uVGFibGU6OmFkZFJlc2lzdGFuY2VOdW1iZXIoZG91YmxlIGQpCi17Ci0gICAgbGVmaUNvcnJlY3Rpb25FZGdlICpyID0gZWRnZXNfW251bUVkZ2VzXyAtIDFdOwotICAgIHItPmFkZFJlc2lzdGFuY2VOdW1iZXIoZCk7Ci19Ci0KLXZvaWQKLWxlZmlDb3JyZWN0aW9uVGFibGU6OmFkZFJlc2lzdGFuY2UoKQotewotICAgIGxlZmlDb3JyZWN0aW9uRWRnZSAqciA9IGVkZ2VzX1tudW1FZGdlc18gLSAxXTsKLSAgICByLT5hZGRSZXNpc3RhbmNlKCk7Ci19Ci0KLXZvaWQKLWxlZmlDb3JyZWN0aW9uVGFibGU6OmFkZFZpY3RpbUxlbmd0aChkb3VibGUgZCkKLXsKLSAgICBsZWZpQ29ycmVjdGlvbkVkZ2UgKnIgPSBlZGdlc19bbnVtRWRnZXNfIC0gMV07Ci0gICAgci0+YWRkVmljdGltTGVuZ3RoKGQpOwotfQotCi12b2lkCi1sZWZpQ29ycmVjdGlvblRhYmxlOjphZGRWaWN0aW1Db3JyZWN0aW9uKGRvdWJsZSBkKQotewotICAgIGxlZmlDb3JyZWN0aW9uRWRnZSAqciA9IGVkZ2VzX1tudW1FZGdlc18gLSAxXTsKLSAgICByLT5hZGRWaWN0aW1Db3JyZWN0aW9uKGQpOwotfQotCi1pbnQKLWxlZmlDb3JyZWN0aW9uVGFibGU6Om51bSgpCi17Ci0gICAgcmV0dXJuIG51bV87Ci19Ci0KLWludAotbGVmaUNvcnJlY3Rpb25UYWJsZTo6bnVtRWRnZXMoKQotewotICAgIHJldHVybiBudW1FZGdlc187Ci19Ci0KLWxlZmlDb3JyZWN0aW9uRWRnZSAqCi1sZWZpQ29ycmVjdGlvblRhYmxlOjplZGdlKGludCBpbmRleCkKLXsKLSAgICByZXR1cm4gZWRnZXNfW2luZGV4XTsKLX0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlDcm9zc1RhbGsuaHBwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZpQ3Jvc3NUYWxrLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFmMWU3Yy4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlDcm9zc1RhbGsuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTIgLSAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2lmbmRlZiBsZWZpQ3Jvc3NUYWxrX2gKLSNkZWZpbmUgbGVmaUNyb3NzVGFsa19oCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImxlZmlLUkRlZnMuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0vLyBTdHJ1Y3R1cmUgcmV0dXJuZWQgZm9yIHRoZSBub2lzZSBtYXJnaW4gY2FsbGJhY2suCi0vLyBUaGlzIGxlZiBjb25zdHJ1Y3QgaGFzIHR3byBmbG9hdGluZyBwb2ludCBudW1iZXJzLiAKLXN0cnVjdCBsZWZpTm9pc2VNYXJnaW4gewotICBkb3VibGUgaGlnaDsKLSAgZG91YmxlIGxvdzsKLX07Ci0KLWNsYXNzIGxlZmlOb2lzZVZpY3RpbSB7Ci1wdWJsaWM6Ci0gIGxlZmlOb2lzZVZpY3RpbShkb3VibGUgZCk7Ci0gIHZvaWQgSW5pdChkb3VibGUgZCk7Ci0KLSAgdm9pZCBEZXN0cm95KCk7Ci0gIH5sZWZpTm9pc2VWaWN0aW0oKTsKLQotICB2b2lkIGNsZWFyKCk7Ci0KLSAgdm9pZCBhZGRWaWN0aW1Ob2lzZShkb3VibGUgZCk7Ci0KLSAgZG91YmxlIGxlbmd0aCgpIGNvbnN0OwotICBpbnQgbnVtTm9pc2VzKCkgY29uc3Q7Ci0gIGRvdWJsZSBub2lzZShpbnQgaW5kZXgpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gIGRvdWJsZSBsZW5ndGhfOwotCi0gIGludCBudW1Ob2lzZXNfOwotICBpbnQgbm9pc2VzQWxsb2NhdGVkXzsKLSAgZG91YmxlKiBub2lzZXNfOwotfTsKLQotY2xhc3MgbGVmaU5vaXNlUmVzaXN0YW5jZSB7Ci1wdWJsaWM6Ci0gIGxlZmlOb2lzZVJlc2lzdGFuY2UoKTsKLSAgdm9pZCBJbml0KCk7Ci0KLSAgdm9pZCBEZXN0cm95KCk7Ci0gIH5sZWZpTm9pc2VSZXNpc3RhbmNlKCk7Ci0KLSAgdm9pZCBjbGVhcigpOwotCi0gIHZvaWQgYWRkUmVzaXN0YW5jZU51bWJlcihkb3VibGUgZCk7Ci0gIHZvaWQgYWRkVmljdGltTGVuZ3RoKGRvdWJsZSBkKTsKLSAgdm9pZCBhZGRWaWN0aW1Ob2lzZShkb3VibGUgZCk7Ci0KLSAgaW50IG51bU51bXMoKSBjb25zdDsKLSAgZG91YmxlIG51bShpbnQgaW5kZXgpIGNvbnN0OwotCi0gIGludCBudW1WaWN0aW1zKCkgY29uc3Q7Ci0gIGxlZmlOb2lzZVZpY3RpbSogdmljdGltKGludCBpbmRleCkgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgaW50IG51bU51bXNfOwotICBpbnQgbnVtc0FsbG9jYXRlZF87Ci0gIGRvdWJsZSogbnVtc187Ci0KLSAgaW50IG51bVZpY3RpbXNfOwotICBpbnQgdmljdGltc0FsbG9jYXRlZF87Ci0gIGxlZmlOb2lzZVZpY3RpbSoqIHZpY3RpbXNfOwotfTsKLQotY2xhc3MgbGVmaU5vaXNlRWRnZSB7Ci1wdWJsaWM6Ci0gIGxlZmlOb2lzZUVkZ2UoKTsKLSAgdm9pZCBJbml0KCk7Ci0KLSAgdm9pZCBEZXN0cm95KCk7Ci0gIH5sZWZpTm9pc2VFZGdlKCk7Ci0KLSAgdm9pZCBjbGVhcigpOwotCi0gIHZvaWQgYWRkRWRnZShkb3VibGUgZCk7Ci0gIHZvaWQgYWRkUmVzaXN0YW5jZSgpOwotICB2b2lkIGFkZFJlc2lzdGFuY2VOdW1iZXIoZG91YmxlIGQpOwotICB2b2lkIGFkZFZpY3RpbUxlbmd0aChkb3VibGUgZCk7Ci0gIHZvaWQgYWRkVmljdGltTm9pc2UoZG91YmxlIGQpOwotCi0gIGRvdWJsZSBlZGdlKCk7Ci0gIGludCBudW1SZXNpc3RhbmNlcygpOwotICBsZWZpTm9pc2VSZXNpc3RhbmNlKiByZXNpc3RhbmNlKGludCBpbmRleCk7Ci0KLXByb3RlY3RlZDoKLSAgZG91YmxlIGVkZ2VfOwotCi0gIGludCBudW1SZXNpc3RhbmNlc187Ci0gIGludCByZXNpc3RhbmNlc0FsbG9jYXRlZF87Ci0gIGxlZmlOb2lzZVJlc2lzdGFuY2UqKiByZXNpc3RhbmNlc187Ci19OwotCi1jbGFzcyBsZWZpTm9pc2VUYWJsZSB7Ci1wdWJsaWM6Ci0gIGxlZmlOb2lzZVRhYmxlKCk7Ci0gIHZvaWQgSW5pdCgpOwotCi0gIHZvaWQgRGVzdHJveSgpOwotICB+bGVmaU5vaXNlVGFibGUoKTsKLQotICB2b2lkIHNldHVwKGludCBpKTsKLSAgdm9pZCBuZXdFZGdlKCk7Ci0gIHZvaWQgYWRkRWRnZShkb3VibGUgZCk7Ci0gIHZvaWQgYWRkUmVzaXN0YW5jZSgpOwotICB2b2lkIGFkZFJlc2lzdGFuY2VOdW1iZXIoZG91YmxlIGQpOwotICB2b2lkIGFkZFZpY3RpbUxlbmd0aChkb3VibGUgZCk7Ci0gIHZvaWQgYWRkVmljdGltTm9pc2UoZG91YmxlIGQpOwotCi0gIHZvaWQgY2xlYXIoKTsKLQotICBpbnQgbnVtKCk7Ci0gIGludCBudW1FZGdlcygpOwotICBsZWZpTm9pc2VFZGdlKiBlZGdlKGludCBpbmRleCk7Ci0KLXByb3RlY3RlZDoKLSAgaW50IG51bV87Ci0KLSAgaW50IG51bUVkZ2VzXzsKLSAgaW50IGVkZ2VzQWxsb2NhdGVkXzsKLSAgbGVmaU5vaXNlRWRnZSoqIGVkZ2VzXzsKLX07Ci0KLWNsYXNzIGxlZmlDb3JyZWN0aW9uVmljdGltIHsKLXB1YmxpYzoKLSAgbGVmaUNvcnJlY3Rpb25WaWN0aW0oZG91YmxlIGQpOwotICB2b2lkIEluaXQoZG91YmxlIGQpOwotCi0gIHZvaWQgRGVzdHJveSgpOwotICB+bGVmaUNvcnJlY3Rpb25WaWN0aW0oKTsKLQotICB2b2lkIGNsZWFyKCk7Ci0KLSAgdm9pZCBhZGRWaWN0aW1Db3JyZWN0aW9uKGRvdWJsZSBkKTsKLQotICBkb3VibGUgbGVuZ3RoKCk7Ci0gIGludCBudW1Db3JyZWN0aW9ucygpOwotICBkb3VibGUgY29ycmVjdGlvbihpbnQgaW5kZXgpOwotCi1wcm90ZWN0ZWQ6Ci0gIGRvdWJsZSBsZW5ndGhfOwotCi0gIGludCBudW1Db3JyZWN0aW9uc187Ci0gIGludCBjb3JyZWN0aW9uc0FsbG9jYXRlZF87Ci0gIGRvdWJsZSogY29ycmVjdGlvbnNfOwotfTsKLQotY2xhc3MgbGVmaUNvcnJlY3Rpb25SZXNpc3RhbmNlIHsKLXB1YmxpYzoKLSAgbGVmaUNvcnJlY3Rpb25SZXNpc3RhbmNlKCk7Ci0gIHZvaWQgSW5pdCgpOwotCi0gIHZvaWQgRGVzdHJveSgpOwotICB+bGVmaUNvcnJlY3Rpb25SZXNpc3RhbmNlKCk7Ci0KLSAgdm9pZCBjbGVhcigpOwotCi0gIHZvaWQgYWRkUmVzaXN0YW5jZU51bWJlcihkb3VibGUgZCk7Ci0gIHZvaWQgYWRkVmljdGltTGVuZ3RoKGRvdWJsZSBkKTsKLSAgdm9pZCBhZGRWaWN0aW1Db3JyZWN0aW9uKGRvdWJsZSBkKTsKLQotICBpbnQgbnVtTnVtcygpOwotICBkb3VibGUgbnVtKGludCBpbmRleCk7Ci0KLSAgaW50IG51bVZpY3RpbXMoKTsKLSAgbGVmaUNvcnJlY3Rpb25WaWN0aW0qIHZpY3RpbShpbnQgaW5kZXgpOwotCi1wcm90ZWN0ZWQ6Ci0gIGludCBudW1OdW1zXzsKLSAgaW50IG51bXNBbGxvY2F0ZWRfOwotICBkb3VibGUqIG51bXNfOwotCi0gIGludCBudW1WaWN0aW1zXzsKLSAgaW50IHZpY3RpbXNBbGxvY2F0ZWRfOwotICBsZWZpQ29ycmVjdGlvblZpY3RpbSoqIHZpY3RpbXNfOwotfTsKLQotY2xhc3MgbGVmaUNvcnJlY3Rpb25FZGdlIHsKLXB1YmxpYzoKLSAgbGVmaUNvcnJlY3Rpb25FZGdlKCk7Ci0gIHZvaWQgSW5pdCgpOwotIAotICB2b2lkIERlc3Ryb3koKTsKLSAgfmxlZmlDb3JyZWN0aW9uRWRnZSgpOwotIAotICB2b2lkIGNsZWFyKCk7Ci0gCi0gIHZvaWQgYWRkRWRnZShkb3VibGUgZCk7Ci0gIHZvaWQgYWRkUmVzaXN0YW5jZSgpOwotICB2b2lkIGFkZFJlc2lzdGFuY2VOdW1iZXIoZG91YmxlIGQpOwotICB2b2lkIGFkZFZpY3RpbUxlbmd0aChkb3VibGUgZCk7Ci0gIHZvaWQgYWRkVmljdGltQ29ycmVjdGlvbihkb3VibGUgZCk7Ci0gCi0gIGRvdWJsZSBlZGdlKCk7Ci0gIGludCBudW1SZXNpc3RhbmNlcygpOwotICBsZWZpQ29ycmVjdGlvblJlc2lzdGFuY2UqIHJlc2lzdGFuY2UoaW50IGluZGV4KTsKLSAKLXByb3RlY3RlZDoKLSAgZG91YmxlIGVkZ2VfOwotIAotICBpbnQgbnVtUmVzaXN0YW5jZXNfOwotICBpbnQgcmVzaXN0YW5jZXNBbGxvY2F0ZWRfOwotICBsZWZpQ29ycmVjdGlvblJlc2lzdGFuY2UqKiByZXNpc3RhbmNlc187Ci19OwotCi1jbGFzcyBsZWZpQ29ycmVjdGlvblRhYmxlIHsKLXB1YmxpYzoKLSAgbGVmaUNvcnJlY3Rpb25UYWJsZSgpOwotICB2b2lkIEluaXQoKTsKLQotICB2b2lkIERlc3Ryb3koKTsKLSAgfmxlZmlDb3JyZWN0aW9uVGFibGUoKTsKLQotICB2b2lkIHNldHVwKGludCBpKTsKLSAgdm9pZCBuZXdFZGdlKCk7Ci0gIHZvaWQgYWRkRWRnZShkb3VibGUgZCk7Ci0gIHZvaWQgYWRkUmVzaXN0YW5jZSgpOwotICB2b2lkIGFkZFJlc2lzdGFuY2VOdW1iZXIoZG91YmxlIGQpOwotICB2b2lkIGFkZFZpY3RpbUxlbmd0aChkb3VibGUgZCk7Ci0gIHZvaWQgYWRkVmljdGltQ29ycmVjdGlvbihkb3VibGUgZCk7Ci0KLSAgdm9pZCBjbGVhcigpOwotCi0gIGludCBudW0oKTsKLSAgaW50IG51bUVkZ2VzKCk7Ci0gIGxlZmlDb3JyZWN0aW9uRWRnZSogZWRnZShpbnQgaW5kZXgpOwotCi1wcm90ZWN0ZWQ6Ci0gIGludCBudW1fOwotCi0gIGludCBudW1FZGdlc187Ci0gIGludCBlZGdlc0FsbG9jYXRlZF87Ci0gIGxlZmlDb3JyZWN0aW9uRWRnZSoqIGVkZ2VzXzsKLX07Ci0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1VU0VfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlEZWJ1Zy5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlEZWJ1Zy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2N2Y1YzIuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZpRGVidWcuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDAwICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTIgLSAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2luY2x1ZGUgImxlZmlEZWJ1Zy5ocHAiCi0jaW5jbHVkZSAibGVmclJlYWRlci5ocHAiCi0jaW5jbHVkZSAibGV4LmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImxlZnJEYXRhLmhwcCIKLSNpbmNsdWRlICJsZWZyU2V0dGluZ3MuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0vLyAqKioqKioqKioqKioqKioqKioKLS8vICAgRGVidWcgZmxhZ3M6Ci0vLyAgIDAgLQotLy8gICAxIC0gbWFsbG9jIGRlYnVnCi0vLyAgIDIgLSBwcmludCBlYWNoIGhpc3Rvcnkgc2l6ZSBidW1wIHVwLgotLy8gICAzIC0KLS8vICAgNCAtCi0vLyAgIDUgLQotLy8gICA2IC0KLS8vICAgNyAtCi0vLyAgIDggLQotLy8gICA5IC0KLS8vICAxMCAtCi0vLyAgMTEgLSBsZXhlciBkZWJ1ZwotLy8gIDEyIC0KLS8vICAxMyAtIHByaW50IGVhY2ggbGV4IHRva2VuIGFzIHJlYWQgaW4uCi0vLwotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLS8vIFNldCBmbGFnIAotdm9pZAotbGVmaVNldERlYnVnKGludCAgICBudW0sCi0gICAgICAgICAgICAgaW50ICAgIHZhbHVlKQotewotICAgIGxlZkRhdGEtPmxlZkRlYnVnW251bV0gPSB2YWx1ZTsKLX0KLS8vIFJlYWQgZmxhZyAKLWludAotbGVmaURlYnVnKGludCBudW0pCi17Ci0gICAgcmV0dXJuIGxlZkRhdGEtPmxlZkRlYnVnW251bV07Ci19Ci0KLXZvaWQKLWxlZmlFcnJvcihpbnQgICAgICAgICAgIGNoZWNrLAotICAgICAgICAgIGludCAgICAgICAgICAgbXNnTnVtLAotICAgICAgICAgIGNvbnN0IGNoYXIgICAgKnN0cikKLXsKLQotICAgIC8vIGNoZWNrIGlzIDEgaWYgdGhlIGNhbGxlciBmdW5jdGlvbiBoYXMgY2hlY2tlZCBUb3RhbE1zZ0xpbWl0LCBldGMuIAotCi0gICAgaWYgKCFjaGVjaykgewotICAgICAgICBpZiAoKGxlZlNldHRpbmdzLT5Ub3RhbE1zZ0xpbWl0ID4gMCkgJiYgKGxlZkRhdGEtPmxlZkVyck1zZ1ByaW50ZWQgPj0gbGVmU2V0dGluZ3MtPlRvdGFsTXNnTGltaXQpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZiAobGVmU2V0dGluZ3MtPk1zZ0xpbWl0W21zZ051bV0gPiAwKSB7Ci0gICAgICAgICAgICBpZiAobGVmRGF0YS0+bXNnTGltaXRbMF1bbXNnTnVtXSA+PSBsZWZTZXR0aW5ncy0+TXNnTGltaXRbbXNnTnVtXSkgLy9vdmVyIHRoZSBsaW1pdAotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGxlZkRhdGEtPm1zZ0xpbWl0WzBdW21zZ051bV0gPSBsZWZEYXRhLT5tc2dMaW1pdFswXVttc2dOdW1dICsgMTsKLSAgICAgICAgfQotICAgICAgICBsZWZEYXRhLT5sZWZFcnJNc2dQcmludGVkKys7Ci0gICAgfQotCi0gICAgaWYgKGxlZlNldHRpbmdzLT5FcnJvckxvZ0Z1bmN0aW9uKQotICAgICAgICAoKmxlZlNldHRpbmdzLT5FcnJvckxvZ0Z1bmN0aW9uKShzdHIpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIHN0cik7Ci19Ci0KLXN0YXRpYyBjaGFyIGxlZmlTaGlmdCBbXSA9IHsKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJyAnLAotICAgICchJywKLSAgICAnIicsCi0gICAgJyMnLAotICAgICckJywKLSAgICAnJScsCi0gICAgJyYnLAotICAgICdcJycsCi0gICAgJygnLAotICAgICcpJywKLSAgICAnKicsCi0gICAgJysnLAotICAgICcsJywKLSAgICAnLScsCi0gICAgJy4nLAotICAgICcvJywKLSAgICAnMCcsCi0gICAgJzEnLAotICAgICcyJywKLSAgICAnMycsCi0gICAgJzQnLAotICAgICc1JywKLSAgICAnNicsCi0gICAgJzcnLAotICAgICc4JywKLSAgICAnOScsCi0gICAgJzonLAotICAgICc7JywKLSAgICAnPCcsCi0gICAgJz0nLAotICAgICc+JywKLSAgICAnPycsCi0gICAgJ0AnLAotICAgICdBJywKLSAgICAnQicsCi0gICAgJ0MnLAotICAgICdEJywKLSAgICAnRScsCi0gICAgJ0YnLAotICAgICdHJywKLSAgICAnSCcsCi0gICAgJ0knLAotICAgICdKJywKLSAgICAnSycsCi0gICAgJ0wnLAotICAgICdNJywKLSAgICAnTicsCi0gICAgJ08nLAotICAgICdQJywKLSAgICAnUScsCi0gICAgJ1InLAotICAgICdTJywKLSAgICAnVCcsCi0gICAgJ1UnLAotICAgICdWJywKLSAgICAnVycsCi0gICAgJ1gnLAotICAgICdZJywKLSAgICAnWicsCi0gICAgJ1snLAotICAgICdcXCcsCi0gICAgJ10nLAotICAgICdeJywKLSAgICAnXycsCi0gICAgJ2AnLAotICAgICdBJywKLSAgICAnQicsCi0gICAgJ0MnLAotICAgICdEJywKLSAgICAnRScsCi0gICAgJ0YnLAotICAgICdHJywKLSAgICAnSCcsCi0gICAgJ0knLAotICAgICdKJywKLSAgICAnSycsCi0gICAgJ2wnLAotICAgICdNJywKLSAgICAnTicsCi0gICAgJ08nLAotICAgICdQJywKLSAgICAnUScsCi0gICAgJ1InLAotICAgICdTJywKLSAgICAnVCcsCi0gICAgJ1UnLAotICAgICdWJywKLSAgICAnVycsCi0gICAgJ1gnLAotICAgICdZJywKLSAgICAnWicsCi0gICAgJ3snLAotICAgICd8JywKLSAgICAnfScsCi0gICAgJ34nLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnLAotICAgICdcMCcsCi0gICAgJ1wwJywKLSAgICAnXDAnCi19OwotCi1jb25zdCBjaGFyICoKLWxlZlVwcGVyQ2FzZShjb25zdCBjaGFyICpzdHIpCi17Ci0gICAgY2hhciAgICAqcGxhY2UgPSAoY2hhciopIHN0cjsKLSAgICBjaGFyICAgICp0bzsKLSAgICBpbnQgICAgIGxlbiA9IHN0cmxlbihzdHIpICsgMTsKLQotICAgIGlmIChsZW4gPiBsZWZEYXRhLT5zaGlmdEJ1Zkxlbmd0aCkgewotICAgICAgICBpZiAobGVmRGF0YS0+c2hpZnRCdWYgPT0gMCkgewotICAgICAgICAgICAgbGVuID0gbGVuIDwgNjQgPyA2NCA6IGxlbjsKLSAgICAgICAgICAgIGxlZkRhdGEtPnNoaWZ0QnVmID0gKGNoYXIqKSBsZWZNYWxsb2MobGVuKTsKLSAgICAgICAgICAgIGxlZkRhdGEtPnNoaWZ0QnVmTGVuZ3RoID0gbGVuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGVmRnJlZShsZWZEYXRhLT5zaGlmdEJ1Zik7Ci0gICAgICAgICAgICBsZWZEYXRhLT5zaGlmdEJ1ZiA9IChjaGFyKikgbWFsbG9jKGxlbik7Ci0gICAgICAgICAgICBsZWZEYXRhLT5zaGlmdEJ1Zkxlbmd0aCA9IGxlbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHRvID0gbGVmRGF0YS0+c2hpZnRCdWY7Ci0gICAgd2hpbGUgKCpwbGFjZSkgewotICAgICAgICBpbnQgaSA9IChpbnQpICpwbGFjZTsKLSAgICAgICAgcGxhY2UrKzsKLSAgICAgICAgKnRvKysgPSBsZWZpU2hpZnRbaV07Ci0gICAgfQotICAgICp0byA9ICdcMCc7Ci0KLSAgICByZXR1cm4gbGVmRGF0YS0+c2hpZnRCdWY7Ci19Ci0KLS8vIGZvciBhdXRvIHVwc2hpZnRpbmcgbmFtZXMgaW4gY2FzZSBpbnNlbnNpdGl2ZSBmaWxlcyAKLWV4dGVybiBjb25zdCBjaGFyICpsZWZVcHBlckNhc2UoY29uc3QgY2hhciAqYyk7Ci0KLS8vIEZ1bmN0aW9uIGlzIGRvbmUgZnJvbSAjZGVmaW5lIENBU0UsIGNvbXBhdGliaWxpdHkgb25seQotY29uc3QgY2hhciAqCi1DQVNFKGNvbnN0IGNoYXIgKngpCi17Ci0gICAgcmV0dXJuICFsZWZEYXRhLT5uYW1lc0Nhc2VTZW5zaXRpdmUgJiYgbGVmU2V0dGluZ3MtPlNoaWZ0Q2FzZSA/IGxlZlVwcGVyQ2FzZSh4KSA6IHg7Ci19Ci0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlEZWJ1Zy5ocHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlEZWJ1Zy5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMDJlYzkuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZpRGVidWcuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiAtIDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaWZuZGVmIGxlZmlEZWJ1Z19oCi0jZGVmaW5lIGxlZmlEZWJ1Z19oIDEKLQotI2luY2x1ZGUgImxlZmlLUkRlZnMuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0vLyBTZXQgZmxhZyAKLWV4dGVybiB2b2lkIGxlZmlTZXREZWJ1ZyAoaW50IG51bSwgaW50IHZhbHVlKSA7Ci0KLS8vIFJlYWQgZmxhZyAKLWV4dGVybiBpbnQgbGVmaURlYnVnIChpbnQgbnVtKSA7Ci0KLS8vIEVycm9yIHJlcG9ydGluZyByb3V0aW5lIAotZXh0ZXJuIHZvaWQgbGVmaUVycm9yIChpbnQgY2hlY2ssIGludCBtc2dOdW0sIGNvbnN0IGNoYXIqIG1zZyk7Ci0KLWV4dGVybiBjb25zdCBjaGFyKiBDQVNFKGNvbnN0IGNoYXIgKngpOyAKLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLVVTRV9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaURlZnMuaHBwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZpRGVmcy5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NWU3MmUuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZpRGVmcy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiAtIDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0vLyBEZWZpbml0aW9ucyBoZWFkZXIgZmlsZSBmb3IgdGhlIERFRiBJbnRlcmZhY2UgCi0KLSNpZm5kZWYgTEVGSV9ERUZTX0gKLSNkZWZpbmUgTEVGSV9ERUZTX0gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0KLSNpbmNsdWRlICJsZWZpS1JEZWZzLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotLy89PT09PT09PT09PT09PT09PT09IEdlbmVyYWwgVHlwZXMgYW5kIERlZmluaXRpb25zID09PT09PT09PT09PT09PT09Ci0KLSNpZm5kZWYgVFJVRQotI2RlZmluZSBUUlVFICgxKQotI2VuZGlmCi0KLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UgKDApCi0jZW5kaWYKLQotI2lmbmRlZiBOVUxMCi0jZGVmaW5lIE5VTEwgKDApCi0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgcG9pbnQgbGVmUE9JTlQ7Ci0KLXN0cnVjdCBwb2ludCB7Ci0gICAgZG91YmxlIHg7Ci0gICAgZG91YmxlIHk7Ci0gICAgfTsKLQotdHlwZWRlZiBzdHJ1Y3QgcmVjdCBsZWZSRUNUOwotCi1zdHJ1Y3QgcmVjdCB7Ci0gICAgbGVmUE9JTlQgbGwsdXI7Ci0gICAgfTsKLQotdHlwZWRlZiBzdHJ1Y3QgdG9rZW4gbGVmVE9LRU47Ci0KLXN0cnVjdCB0b2tlbiB7Ci0gICAgbGVmVE9LRU4gKm5leHQ7Ci0gICAgaW50IHdoYXQ7Ci0gICAgaW50IGRhdGE7Ci0gICAgbGVmUE9JTlQgcHQ7Ci0gICAgfTsKLQotI2RlZmluZSBTVEFSVF9MSVNUIDEwMDAxCi0jZGVmaW5lIFBPSU5UX1NQRUMgMTAwMDIKLSNkZWZpbmUgVklBX1NQRUMgICAxMDAwMwotI2RlZmluZSBXSURUSF9TUEVDIDEwMDA0Ci0jZGVmaW5lIExBWUVSX1NQRUMgMTAwMDUKLSNkZWZpbmUgU0hBUEVfU1BFQyAxMDAwNgotCi0jaWZuZGVmIE1BWElOVAotI2RlZmluZSBNQVhJTlQgMHg3RkZGRkZGRgotI2VuZGlmCi0jaWZuZGVmIE1JTklOVAotI2RlZmluZSBNSU5JTlQgMHg4MDAwMDAwMAotI2VuZGlmCi0KLSNpZm5kZWYgICAgTUlOCi0jZGVmaW5lIE1JTih4LHkpICgoeCkgPCAoeSk/ICh4KSA6ICh5KSkKLSNlbmRpZgotCi0jaWZuZGVmICAgIE1JTgotI2RlZmluZSBNQVgoeCx5KSAoKHgpID4gKHkpPyAoeCkgOiAoeSkpCi0jZW5kaWYKLQotI2RlZmluZSBST1VORCh4KSAoKHgpID49IDAgPyAoaW50KSgoeCkrMC41KSA6IChpbnQpKCh4KS0wLjUpKQotCi0vL1RPS0VOICpUb2tlbkZyb21SZWN0KCk7Ci0KLS8vPT09PT09PT09PT09PT09PT09PSBFbnVtZXJhdGVkIFR5cGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXR5cGVkZWYgaW50IGxlZmlCb29sZWFuOwotCi0vLyBFdmVyeSB0eXBlIG9mIG9iamVjdCBoYXMgYSB1bmlxdWUgaWRlbnRpZmllciwgYW5kIGVhY2ggb2JqZWN0Ci0vLyAgd2hpY2ggaXMgY3JlYXRlZCBrbm93cyBpdHMgdHlwZSwgYnkgc3RvcmluZyB0aGUgbGVmaU9iamVjdFR5cGVfZQotLy8gIGFzIHRoZSBmaXJzdCBtZW1iZXIgaW4gdGhlIHN0cnVjdHVyZS4KLQotdHlwZWRlZiBlbnVtCi17Ci0gIC8vIGRlY3JlYXNlIGxpa2VsaWhvb2Qgb2YgYWNjaWRlbnRhbGx5IGNvcnJlY3QgdmFsdWVzIGJ5IHN0YXJ0aW5nCi0gIC8vIGF0IGFuIHVudXN1YWwgbnVtYmVyIAotICBsZWZpSW52YWxpZE9iamVjdCA9IDQxNzEzLCAKLSAgbGVmaVVua25vd25PYmplY3QgLy8gdm9pZCAqIAotfSBsZWZpT2JqZWN0VHlwZV9lOwotCi0vLyBUaGUgbWVtb3J5IHBvbGljeSBjb250cm9scyBob3cgYW4gb2JqZWN0IHdoaWNoIHJlZmVycyB0byBvciBpcyBjb21wb3NlZCBvZgotLy8gIG90aGVyIG9iamVjdHMgbWFuYWdlcyB0aG9zZSBzdWItb2JqZWN0cywgcGFydGljdWxhcmx5IHdoZW4gdGhlIHBhcmVudAotLy8gIG9iamVjdCBpcyBjb3BpZWQgb3IgZGVsZXRlZC4gIFRoZSBwb2xpY3kgaXMgc3BlY2lmaWVkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZQotLy8gIGNvbnN0cnVjdG9yIG9yIGluaXRpYWxpemVyLCBhbmQgaXQgaXMgc3RvcmVkIHdpdGggdGhlIHBhcmVudCBvYmplY3QuCi0vLyAKLS8vICBUaGUgbWVtb3J5IHBvbGljeSBpcyBhIGdlbmVyYWxpemF0aW9uIG9mIHRoZSBjb21tb24gZGlzdGluY3Rpb24gYmV0d2VlbgotLy8gIGRlZXAgYW5kIHNoYWxsb3cgY29waWVzLiAgV2hlbiBhIHNoYWxsb3cgY29weSBvZiBhIHBhcmVudCBvYmplY3QgaXMgbWFkZSwKLS8vICB0aGUgY29weSBtYWludGFpbnMgcG9pbnRlcnMgdG8gdGhlIG9yaWdpbmFsIHN1Yi1vYmplY3RzLCBhbmQgdGhlIG9yaWdpbmFsCi0vLyAgcGFyZW50IHJlbWFpbnMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRob3NlIHN1Yi1vYmplY3RzLiAgV2hlbiBhIGRlZXAKLS8vICBjb3B5IG9mIGEgcGFyZW50IG9iamVjdCBpcyBtYWRlLCB0aGUgY29weSBtYWludGFpbnMgcG9pbnRlcnMgdG8gbmV3IGNvcGllcwotLy8gIG9mIGVhY2ggb2YgdGhlIHN1Yi1vYmplY3RzLCBhbmQgdGhlIGNvcHkgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZQotLy8gIG5ldyBzdWItb2JqZWN0cy4KLS8vIAotLy8gIFRoZSBsZWZpUHJpdmF0ZVN1Yk9iamVjdHMgcG9saWN5IGNvcnJlc3BvbmRzIHRvIGEgZGVlcCBjb3B5LCB3aGlsZSB0aGUgdGhlCi0vLyAgbGVmaVJlZmVyZW5jZWRTdWJPYmplY3RzIHBvbGljeSBjb3JyZXNwb25kcyB0byBhIHNoYWxsb3cgY29weS4gIFVzdWFsbHkgYW4KLS8vICBpbml0aWFsIHBhcmVudCBvYmplY3Qgd2lsbCBiZSBjcmVhdGVkIHVzaW5nIGxlZmlQcml2YXRlU3ViT2JqZWN0cy4gIFdoZW4gYQotLy8gIGNvcHkgaXMgbWFkZSBvZiB0aGF0IHBhcmVudCBvYmplY3QsIHRoZSBjb3B5IG1heSBlaXRoZXIgbWFpbnRhaW4gaXRzIG93bgotLy8gIHByaXZhdGUgdmVyc2lvbnMgb2YgZWFjaCBzdWItb2JqZWN0LCBvciBpdCBtYXkgcmVmZXIgdG8gdGhlIG9yaWdpbmFsCi0vLyAgc3ViLW9iamVjdHMuCi0vLyAKLS8vICBJbiBjZXJ0YWluIGNhc2VzLCBpdCBpcyB1c2VmdWwgdG8gY3JlYXRlIGEgZGVlcCBjb3B5IG9mIGEgcGFyZW50IG9iamVjdCwKLS8vICBldmVuIHRob3VnaCB0aGUgbmV3IHBhcmVudCBvYmplY3Qgc2hvdWxkbid0IGJlIHJlc3BvbnNpYmxlIGZvciB0aGUgbmV3Ci0vLyAgc3ViLW9iamVjdHMuICBJbiB0aGlzIGNhc2UsIHRoZSBsZWZpT3JwaGFuU3ViT2JqZWN0cyBhbmQKLS8vICBsZWZpQWRvcHRlZFN1Yk9iamVjdHMgcG9saWNpZXMgbWF5IGJlIHVzZWQuICBsZWZpT3JwaGFuU3ViT2JqZWN0cyBpcwotLy8gIHNwZWNpZmllZCB3aGlsZSBjcmVhdGluZyB0aGUgZGVlcCBjb3B5LCBhbmQgdGhlbiBsZWZpQWRvcHRlZFN1Yk9iamVjdHMgaXMKLS8vICBzcGVjaWZpZWQgd2hpbGUgY3JlYXRpbmcgYW5vdGhlciBwYXJlbnQgd2hpY2ggd2lsbCB0YWtlIG9uIHRoZQotLy8gIHJlc3BvbnNpYmlsaXR5IGZvciB0aGUgb3JwaGFucy4KLS8vIAotLy8gIEFuIG9iamVjdCdzIG1lbW9yeSBwb2xpY3kgYWZmZWN0cyBvbmx5IHRoZSBzdWItb2JqZWN0cyB3aGljaCBpdCBkaXJlY3RseQotLy8gIGNvbnRyb2xzLiAgVGhvc2Ugc3ViLW9iamVjdHMgdGhlbXNlbHZlcyBtYXkgaGF2ZSB0aGUgc2FtZSBtZW1vcnkgcG9saWN5IGFzCi0vLyAgdGhlaXIgcGFyZW50cywgb3IgdGhleSBtYXkgaGF2ZSBhIGRpZmZlcmVudCBtZW1vcnkgcG9saWN5LiAgV2hlbiBhIGNvcHkgaXMKLS8vICBtYWRlIG9mIGEgY2hpbGQgc3ViLW9iamVjdCwgdGhlIG1lbW9yeSBwb2xpY3kgb2YgdGhlIGNoaWxkIGNvbnRyb2xzCi0vLyAgd2hldGhlciBkZWVwIG9yIHNoYWxsb3cgY29waWVzIGFyZSBtYWRlIG9mIHRoZSBncmFuZGNoaWxkcmVuLgotLy8gCi10eXBlZGVmIGVudW0KLXsKLSAgLy8gZGVjcmVhc2UgbGlrZWxpaG9vZCBvZiBhY2NpZGVudGFsbHkgY29ycmVjdCB2YWx1ZXMgYnkgc3RhcnRpbmcKLSAgLy8gYXQgYW4gdW51c3VhbCBudW1iZXIgCi0gIGxlZmlJbnZhbGlkTWVtb3J5UG9saWN5ID0gMjM5NTAsCi0gIGxlZmlQcml2YXRlU3ViT2JqZWN0cywgICAgICAvLyBkZWVwIGNvcHkgKyBkZWxldGUKLSAgbGVmaVJlZmVyZW5jZWRTdWJPYmplY3RzLCAgIC8vIHNoYWxsb3cgY29weSwgbm8gZGVsZXRlCi0gIGxlZmlPcnBoYW5TdWJPYmplY3RzLCAgICAgICAvLyBkZWVwIGNvcHksIG5vIGRlbGV0ZQotICBsZWZpQWRvcHRlZFN1Yk9iamVjdHMgICAgICAgLy8gc2hhbGxvdyBjb3B5ICsgZGVsZXRlCi19IGxlZmlNZW1vcnlQb2xpY3lfZTsKLQotLy8gQW4gb3BhcXVlIHBvaW50ZXIgZm9yIHBhc3NpbmcgdXNlciBkYXRhIHRocm91Z2ggZnJvbSBvbmUgQVBJCi0vLyAgZnVuY3Rpb24gdG8gYW5vdGhlci4KLS8vICBBIGhhbmRsZSB3aGljaCBhIHVzZXIgY2FuIHNldCB0byBwb2ludCB0byB0aGVpciBvd24gZGF0YQotLy8gIG9uIGEgcGVyLWNhbGxiYWNrIGJhc2lzLiAgKFNlZSB0aGUgY29tbWVudCBpbiBsZWZ3V3JpdGVyLmgpCi0KLSNkZWZpbmUgbGVmaVVzZXJEYXRhIHZvaWQgKgotI2RlZmluZSBsZWZpVXNlckRhdGFIYW5kbGUgdm9pZCAqKgotCi0jaWZkZWYgX19TdW5PU180XzFfMwotZXh0ZXJuIGludCBzdHJjYXNlY21wKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7Ci0jZW5kaWYKLQotI2lmZGVmIFdJTjMyCi0jZGVmaW5lIHN0cmR1cCBfc3RyZHVwCi0jZW5kaWYgCi0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1VU0VfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlFbmNyeXB0SW50LmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaUVuY3J5cHRJbnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjU5YWIyLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaUVuY3J5cHRJbnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiAtIDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJsZWZpRW5jcnlwdEludC5ocHAiCi0KLSNpbmNsdWRlICJsZWZyU2V0dGluZ3MuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gR2xvYmFsIHZhcmlhYmxlcwotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotdm9pZAotbGVmckVuYWJsZVJlYWRFbmNyeXB0ZWQoKQotewotICAgIGxlZlNldHRpbmdzLT5SZWFkRW5jcnlwdGVkID0gMTsKLX0KLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlFbmNyeXB0SW50LmhwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaUVuY3J5cHRJbnQuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjI2OGEyLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaUVuY3J5cHRJbnQuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiAtIDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaWZuZGVmIERFRklfRU5DUllQVElOVF9ICi0jZGVmaW5lIERFRklfRU5DUllQVElOVF9ICi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImxlZmlLUkRlZnMuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0vLyBVbmFibGUgdGhlIHJlYWRlciB0byByZWFkIGVuY3J5cHRlZCBsZWYgZmlsZS4KLS8vICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBsZWZyUmVhZCgpLgotLy8gLwotZXh0ZXJuIHZvaWQgbGVmckVuYWJsZVJlYWRFbmNyeXB0ZWQoKTsKLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLVVTRV9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaUtSRGVmcy5ocHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlLUkRlZnMuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTdiMTViLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaUtSRGVmcy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyIC0gMjAxMywgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpZm5kZWYgbGVmaUtSREVGU19oCi0jZGVmaW5lIGxlZmlLUkRFRlNfaAotCi0jZGVmaW5lIEJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFIG5hbWVzcGFjZSBMZWZEZWZQYXJzZXIgewotI2RlZmluZSBFTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UgfQotI2RlZmluZSBVU0VfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UgdXNpbmcgbmFtZXNwYWNlIExlZkRlZlBhcnNlcjsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlMYXllci5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlMYXllci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MGUxNDYuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZpTGF5ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjgxMiArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyIC0gMjAxNywgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJsZXguaCIKLSNpbmNsdWRlICJsZWZpTGF5ZXIuaHBwIgotI2luY2x1ZGUgImxlZmlEZWJ1Zy5ocHAiCi0jaW5jbHVkZSAibGVmclNldHRpbmdzLmhwcCIKLSNpbmNsdWRlICJsZWZyQ2FsbEJhY2tzLmhwcCIKLSNpbmNsdWRlIDxzZXQ+Ci0KLSNpbmNsdWRlICJsZWZyRGF0YS5ocHAiCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBsZWZpQW50ZW5uYVBXTAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotbGVmaUFudGVubmFQV0w6OmxlZmlBbnRlbm5hUFdMKCkKLTogZF8oMCksCi0gIHJfKDApCi17Ci0gICAgSW5pdCgpOwotfQotCi1sZWZpQW50ZW5uYVBXTCoKLWxlZmlBbnRlbm5hUFdMOjpjcmVhdGUoKQotewotICAgIGxlZmlBbnRlbm5hUFdMKiBwQW50ZW5uYSA9IChsZWZpQW50ZW5uYVBXTCopbGVmTWFsbG9jKHNpemVvZihsZWZpQW50ZW5uYVBXTCkpOwotICAgIHBBbnRlbm5hLT5kXyA9IDA7Ci0gICAgcEFudGVubmEtPnJfID0gMDsKLSAgICBwQW50ZW5uYS0+SW5pdCgpOwotCi0gICAgcmV0dXJuIHBBbnRlbm5hOwotfQotCi12b2lkCi1sZWZpQW50ZW5uYVBXTDo6SW5pdCgpCi17Ci0gICAgaWYgKGRfKSB7Ci0gICAgICAgIGxlZkZyZWUoZF8pOwotICAgIH0KLQotICAgIGlmIChyXykgewotICAgICAgICBsZWZGcmVlKHJfKTsKLSAgICB9Ci0KLSAgICBudW1BbGxvY18gPSAyOwotICAgIGRfID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIDIpOwotICAgIHJfID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIDIpOwotICAgIGNsZWFyKCk7Ci19Ci0KLWxlZmlBbnRlbm5hUFdMOjp+bGVmaUFudGVubmFQV0woKQotewotICAgIERlc3Ryb3koKTsKLX0KLQotdm9pZAotbGVmaUFudGVubmFQV0w6OkRlc3Ryb3koKQotewotICAgIGlmIChkXykKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChkXykpOwotICAgIGlmIChyXykKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChyXykpOwotfQotCi0vLyBDbGVhciB3aWxsIHJlc2V0IHRoZSBudW1QV0xfIHRvIHplcm8gYnV0IGtlZXAgYXJyYXkgYWxsb2NhdGVkCi12b2lkCi1sZWZpQW50ZW5uYVBXTDo6Y2xlYXIoKQotewotICAgIG51bVBXTF8gPSAwOwotfQotCi12b2lkCi1sZWZpQW50ZW5uYVBXTDo6YWRkQW50ZW5uYVBXTChkb3VibGUgICAgZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICByKQotewotICAgIGlmIChudW1QV0xfID09IG51bUFsbG9jXykgewotICAgICAgICBpbnQgICAgIGksIGxlbjsKLSAgICAgICAgZG91YmxlICAqbmQ7Ci0gICAgICAgIGRvdWJsZSAgKm5yOwotCi0gICAgICAgIGlmIChudW1BbGxvY18gPT0gMCkKLSAgICAgICAgICAgIGxlbiA9IG51bUFsbG9jXyA9IDI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGxlbiA9IG51bUFsbG9jXyAqPSAyOwotICAgICAgICBuZCA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBsZW4pOwotICAgICAgICBuciA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBsZW4pOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1QV0xfOyBpKyspIHsKLSAgICAgICAgICAgIG5kW2ldID0gZF9baV07Ci0gICAgICAgICAgICBucltpXSA9IHJfW2ldOwotICAgICAgICB9Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoZF8pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChyXykpOwotICAgICAgICBkXyA9IG5kOwotICAgICAgICByXyA9IG5yOwotICAgIH0KLSAgICBkX1tudW1QV0xfXSA9IGQ7Ci0gICAgcl9bbnVtUFdMX10gPSByOwotICAgIG51bVBXTF8gKz0gMTsKLX0KLQotaW50Ci1sZWZpQW50ZW5uYVBXTDo6bnVtUFdMKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbnVtUFdMXzsKLX0KLQotZG91YmxlCi1sZWZpQW50ZW5uYVBXTDo6UFdMZGlmZnVzaW9uKGludCBpbmRleCkKLXsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVBXTF8pCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBkX1tpbmRleF07Ci19Ci0KLWRvdWJsZQotbGVmaUFudGVubmFQV0w6OlBXTHJhdGlvKGludCBpbmRleCkKLXsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVBXTF8pCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiByX1tpbmRleF07Ci19Ci0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBsZWZpTGF5ZXJEZW5zaXR5Ci0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotbGVmaUxheWVyRGVuc2l0eTo6bGVmaUxheWVyRGVuc2l0eSgpCi17Ci19Ci0KLXZvaWQKLWxlZmlMYXllckRlbnNpdHk6OkluaXQoY29uc3QgY2hhciAqdHlwZSkKLXsKLSAgICBpbnQgbGVuID0gc3RybGVuKHR5cGUpICsgMTsKLSAgICB0eXBlXyA9IChjaGFyKikgbGVmTWFsbG9jKGxlbik7Ci0gICAgc3RyY3B5KHR5cGVfLCBDQVNFKHR5cGUpKTsKLSAgICBvbmVFbnRyeV8gPSAwOwotICAgIG51bUZyZXF1ZW5jeV8gPSAwOwotICAgIGZyZXF1ZW5jeV8gPSAwOwotICAgIG51bVdpZHRoc18gPSAwOwotICAgIHdpZHRoc18gPSAwOwotICAgIG51bVRhYmxlRW50cmllc18gPSAwOwotICAgIHRhYmxlRW50cmllc18gPSAwOwotICAgIG51bUN1dGFyZWFzXyA9IDA7Ci0gICAgY3V0YXJlYXNfID0gMDsKLX0KLQotdm9pZAotbGVmaUxheWVyRGVuc2l0eTo6RGVzdHJveSgpCi17Ci0gICAgaWYgKHR5cGVfKQotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHR5cGVfKSk7Ci0gICAgaWYgKGZyZXF1ZW5jeV8pCi0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoZnJlcXVlbmN5XykpOwotICAgIGlmICh3aWR0aHNfKQotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHdpZHRoc18pKTsKLSAgICBpZiAodGFibGVFbnRyaWVzXykKLSAgICAgICAgbGVmRnJlZSgoY2hhciopICh0YWJsZUVudHJpZXNfKSk7Ci0gICAgaWYgKGN1dGFyZWFzXykKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChjdXRhcmVhc18pKTsKLX0KLQotbGVmaUxheWVyRGVuc2l0eTo6fmxlZmlMYXllckRlbnNpdHkoKQotewotICAgIERlc3Ryb3koKTsKLX0KLQotdm9pZAotbGVmaUxheWVyRGVuc2l0eTo6c2V0T25lRW50cnkoZG91YmxlIGVudHJ5KQotewotICAgIG9uZUVudHJ5XyA9IGVudHJ5OwotfQotCi12b2lkCi1sZWZpTGF5ZXJEZW5zaXR5OjphZGRGcmVxdWVuY3koaW50ICAgICAgbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICpmcmVxdWVuY3kpCi17Ci0gICAgbnVtRnJlcXVlbmN5XyA9IG51bTsKLSAgICBmcmVxdWVuY3lfID0gZnJlcXVlbmN5OwotfQotCi12b2lkCi1sZWZpTGF5ZXJEZW5zaXR5OjphZGRXaWR0aChpbnQgICAgICBudW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAqd2lkdGgpCi17Ci0gICAgbnVtV2lkdGhzXyA9IG51bTsKLSAgICB3aWR0aHNfID0gd2lkdGg7Ci19Ci0KLXZvaWQKLWxlZmlMYXllckRlbnNpdHk6OmFkZFRhYmxlRW50cnkoaW50ICAgICBudW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgKmVudHJ5KQotewotICAgIG51bVRhYmxlRW50cmllc18gPSBudW07Ci0gICAgdGFibGVFbnRyaWVzXyA9IGVudHJ5OwotfQotCi12b2lkCi1sZWZpTGF5ZXJEZW5zaXR5OjphZGRDdXRhcmVhKGludCAgICBudW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqY3V0YXJlYSkKLXsKLSAgICBudW1DdXRhcmVhc18gPSBudW07Ci0gICAgY3V0YXJlYXNfID0gY3V0YXJlYTsKLX0KLQotaW50Ci1sZWZpTGF5ZXJEZW5zaXR5OjpoYXNPbmVFbnRyeSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG9uZUVudHJ5XyA/IDEgOiAwOwotfQotCi1jaGFyICoKLWxlZmlMYXllckRlbnNpdHk6OnR5cGUoKSBjb25zdAotewotICAgIHJldHVybiB0eXBlXzsKLX0KLQotZG91YmxlCi1sZWZpTGF5ZXJEZW5zaXR5OjpvbmVFbnRyeSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG9uZUVudHJ5XzsKLX0KLQotaW50Ci1sZWZpTGF5ZXJEZW5zaXR5OjpudW1GcmVxdWVuY3koKSBjb25zdAotewotICAgIHJldHVybiBudW1GcmVxdWVuY3lfOwotfQotCi1kb3VibGUKLWxlZmlMYXllckRlbnNpdHk6OmZyZXF1ZW5jeShpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZyZXF1ZW5jeV9baW5kZXhdOwotfQotCi1pbnQKLWxlZmlMYXllckRlbnNpdHk6Om51bVdpZHRocygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG51bVdpZHRoc187Ci19Ci0KLWRvdWJsZQotbGVmaUxheWVyRGVuc2l0eTo6d2lkdGgoaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiB3aWR0aHNfW2luZGV4XTsKLX0KLQotaW50Ci1sZWZpTGF5ZXJEZW5zaXR5OjpudW1UYWJsZUVudHJpZXMoKSBjb25zdAotewotICAgIHJldHVybiBudW1UYWJsZUVudHJpZXNfOwotfQotCi1kb3VibGUKLWxlZmlMYXllckRlbnNpdHk6OnRhYmxlRW50cnkoaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiB0YWJsZUVudHJpZXNfW2luZGV4XTsKLX0KLQotaW50Ci1sZWZpTGF5ZXJEZW5zaXR5OjpudW1DdXRhcmVhcygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG51bUN1dGFyZWFzXzsKLX0KLQotZG91YmxlCi1sZWZpTGF5ZXJEZW5zaXR5OjpjdXRBcmVhKGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gY3V0YXJlYXNfW2luZGV4XTsKLX0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIGxlZmlQYXJhbGxlbAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotbGVmaVBhcmFsbGVsOjpsZWZpUGFyYWxsZWwoKQotewotICAgIEluaXQoKTsKLX0KLQotdm9pZAotbGVmaVBhcmFsbGVsOjpJbml0KCkKLXsKLSAgICBudW1MZW5ndGhfID0gMDsKLSAgICBudW1XaWR0aF8gPSAwOwotICAgIG51bVdpZHRoQWxsb2NhdGVkXyA9IDA7Ci19Ci0KLXZvaWQKLWxlZmlQYXJhbGxlbDo6RGVzdHJveSgpCi17Ci0KLSAgICBpZiAobnVtTGVuZ3RoXykKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChsZW5ndGhfKSk7Ci0gICAgaWYgKG51bVdpZHRoXykgewotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHdpZHRoXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHdpZHRoU3BhY2luZ18pKTsKLSAgICB9Ci0gICAgSW5pdCgpOwotfQotCi1sZWZpUGFyYWxsZWw6On5sZWZpUGFyYWxsZWwoKQotewotICAgIERlc3Ryb3koKTsKLX0KLQotdm9pZAotbGVmaVBhcmFsbGVsOjphZGRQYXJhbGxlbExlbmd0aChpbnQgICAgIG51bUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAqbGVuZ3RocykKLXsKLSAgICBudW1MZW5ndGhfID0gbnVtTGVuZ3RoOwotICAgIGxlbmd0aF8gPSBsZW5ndGhzOwotfQotCi12b2lkCi1sZWZpUGFyYWxsZWw6OmFkZFBhcmFsbGVsV2lkdGgoZG91YmxlIHdpZHRoKQotewotICAgIGlmIChudW1XaWR0aF8gPT0gbnVtV2lkdGhBbGxvY2F0ZWRfKSB7Ci0gICAgICAgIGludCAgICAgaSwgbnVtTGVuZ3RoOwotICAgICAgICBkb3VibGUgICpudzsKLSAgICAgICAgZG91YmxlICAqbndzOwotCi0gICAgICAgIG51bVdpZHRoQWxsb2NhdGVkXyA9IG51bVdpZHRoQWxsb2NhdGVkXyA/Ci0gICAgICAgICAgICBudW1XaWR0aEFsbG9jYXRlZF8gKiAyIDogMjsKLSAgICAgICAgbncgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbnVtV2lkdGhBbGxvY2F0ZWRfKTsKLSAgICAgICAgbnVtTGVuZ3RoID0gbnVtTGVuZ3RoXzsKLSAgICAgICAgaWYgKG51bUxlbmd0aCA+IDApCi0gICAgICAgICAgICBud3MgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogKG51bVdpZHRoQWxsb2NhdGVkXyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUxlbmd0aF8pKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBzdGlsbCB3YW50IHRvIG1vdmUgYW55dGhpbmcgYWxyZWFkeSB0aGVyZSAKLSAgICAgICAgICAgIG53cyA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBudW1XaWR0aEFsbG9jYXRlZF8pOwotICAgICAgICAgICAgbnVtTGVuZ3RoID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1XaWR0aF87IGkrKykKLSAgICAgICAgICAgIG53W2ldID0gd2lkdGhfW2ldOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKG51bVdpZHRoXyAqIG51bUxlbmd0aCk7IGkrKykKLSAgICAgICAgICAgIG53c1tpXSA9IHdpZHRoU3BhY2luZ19baV07Ci0gICAgICAgIGlmIChudW1XaWR0aF8pIHsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAod2lkdGhfKSk7Ci0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKHdpZHRoU3BhY2luZ18pKTsKLSAgICAgICAgfQotICAgICAgICB3aWR0aF8gPSBudzsKLSAgICAgICAgd2lkdGhTcGFjaW5nXyA9IG53czsKLSAgICB9Ci0gICAgd2lkdGhfW251bVdpZHRoX10gPSB3aWR0aDsKLSAgICBudW1XaWR0aF8gKz0gMTsKLX0KLQotdm9pZAotbGVmaVBhcmFsbGVsOjphZGRQYXJhbGxlbFdpZHRoU3BhY2luZyhpbnQgICAgICAgbnVtU3BhY2luZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICpzcGFjaW5ncykKLXsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtU3BhY2luZzsgaSsrKQotICAgICAgICB3aWR0aFNwYWNpbmdfWyhudW1XaWR0aF8gLSAxKSAqIG51bUxlbmd0aF8gKyBpXSA9Ci0gICAgICAgICAgICBzcGFjaW5nc1tpXTsKLX0KLQotaW50Ci1sZWZpUGFyYWxsZWw6Om51bUxlbmd0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG51bUxlbmd0aF87Ci19Ci0KLWludAotbGVmaVBhcmFsbGVsOjpudW1XaWR0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG51bVdpZHRoXzsKLX0KLQotZG91YmxlCi1sZWZpUGFyYWxsZWw6Omxlbmd0aChpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGxlbmd0aF9baW5kZXhdOwotfQotCi1kb3VibGUKLWxlZmlQYXJhbGxlbDo6d2lkdGgoaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiB3aWR0aF9baW5kZXhdOwotfQotCi1kb3VibGUKLWxlZmlQYXJhbGxlbDo6d2lkdGhTcGFjaW5nKGludCAgaVdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBpV2lkdGhTcGFjaW5nKSBjb25zdAotewotICAgIHJldHVybiB3aWR0aFNwYWNpbmdfW2lXaWR0aCAqIG51bUxlbmd0aF8gKyBpV2lkdGhTcGFjaW5nXTsKLX0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIGxlZmlJbmZsdWVuY2UKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLWxlZmlJbmZsdWVuY2U6OmxlZmlJbmZsdWVuY2UoKQotewotICAgIEluaXQoKTsKLX0KLQotdm9pZAotbGVmaUluZmx1ZW5jZTo6SW5pdCgpCi17Ci0gICAgbnVtQWxsb2NhdGVkXyA9IDA7Ci0gICAgbnVtV2lkdGhfID0gMDsKLSAgICBudW1EaXN0YW5jZV8gPSAwOwotICAgIG51bVNwYWNpbmdfID0gMDsKLX0KLQotdm9pZAotbGVmaUluZmx1ZW5jZTo6RGVzdHJveSgpCi17Ci0gICAgaWYgKG51bVdpZHRoXykgewotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHdpZHRoXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGRpc3RhbmNlXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHNwYWNpbmdfKSk7Ci0gICAgfQotICAgIEluaXQoKTsKLX0KLQotbGVmaUluZmx1ZW5jZTo6fmxlZmlJbmZsdWVuY2UoKQotewotICAgIERlc3Ryb3koKTsKLX0KLQotdm9pZAotbGVmaUluZmx1ZW5jZTo6YWRkSW5mbHVlbmNlKGRvdWJsZSAgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgIHNwYWNpbmcpCi17Ci0gICAgaW50ICAgICBpOwotICAgIGRvdWJsZSAgKm53OwotICAgIGRvdWJsZSAgKm5kOwotICAgIGRvdWJsZSAgKm5zOwotCi0gICAgaWYgKG51bVdpZHRoXyA9PSBudW1BbGxvY2F0ZWRfKSB7Ci0gICAgICAgIG51bUFsbG9jYXRlZF8gPSBudW1BbGxvY2F0ZWRfID8KLSAgICAgICAgICAgIG51bUFsbG9jYXRlZF8gKiAyIDogMjsKLSAgICAgICAgbncgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbnVtQWxsb2NhdGVkXyk7Ci0gICAgICAgIG5kID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIG51bUFsbG9jYXRlZF8pOwotICAgICAgICBucyA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBudW1BbGxvY2F0ZWRfKTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtV2lkdGhfOyBpKyspIHsKLSAgICAgICAgICAgIG53W2ldID0gd2lkdGhfW2ldOwotICAgICAgICAgICAgbmRbaV0gPSBkaXN0YW5jZV9baV07Ci0gICAgICAgICAgICBuc1tpXSA9IHNwYWNpbmdfW2ldOwotICAgICAgICB9Ci0gICAgICAgIGlmIChudW1XaWR0aF8gPiAwKSB7Ci0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKHdpZHRoXykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChkaXN0YW5jZV8pKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoc3BhY2luZ18pKTsKLSAgICAgICAgfQotICAgICAgICB3aWR0aF8gPSBudzsKLSAgICAgICAgZGlzdGFuY2VfID0gbmQ7Ci0gICAgICAgIHNwYWNpbmdfID0gbnM7Ci0gICAgfQotICAgIHdpZHRoX1tudW1XaWR0aF9dID0gd2lkdGg7Ci0gICAgZGlzdGFuY2VfW251bVdpZHRoX10gPSBkaXN0YW5jZTsKLSAgICBzcGFjaW5nX1tudW1XaWR0aF9dID0gc3BhY2luZzsKLSAgICBudW1XaWR0aF8gKz0gMTsKLX0KLQotaW50Ci1sZWZpSW5mbHVlbmNlOjpudW1JbmZsdWVuY2VFbnRyeSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG51bVdpZHRoXzsKLX0KLQotZG91YmxlCi1sZWZpSW5mbHVlbmNlOjp3aWR0aChpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHdpZHRoX1tpbmRleF07Ci19Ci0KLWRvdWJsZQotbGVmaUluZmx1ZW5jZTo6ZGlzdGFuY2UoaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiBkaXN0YW5jZV9baW5kZXhdOwotfQotCi1kb3VibGUKLWxlZmlJbmZsdWVuY2U6OnNwYWNpbmcoaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiBzcGFjaW5nX1tpbmRleF07Ci19Ci0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBsZWZpVHdvV2lkdGhzCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1sZWZpVHdvV2lkdGhzOjpsZWZpVHdvV2lkdGhzKCkKLXsKLSAgICBJbml0KCk7Ci19Ci0KLXZvaWQKLWxlZmlUd29XaWR0aHM6OkluaXQoKQotewotICAgIG51bVdpZHRoXyA9IDA7Ci0gICAgbnVtV2lkdGhBbGxvY2F0ZWRfID0gMDsKLX0KLQotdm9pZAotbGVmaVR3b1dpZHRoczo6RGVzdHJveSgpCi17Ci0KLSAgICBpZiAobnVtV2lkdGhfKSB7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAod2lkdGhfKSk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAocHJsXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHdpZHRoU3BhY2luZ18pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChudW1XaWR0aFNwYWNpbmdfKSk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoYXROc3BfKSk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoaGFzUFJMXykpOwotICAgIH0KLSAgICBJbml0KCk7Ci19Ci0KLWxlZmlUd29XaWR0aHM6On5sZWZpVHdvV2lkdGhzKCkKLXsKLSAgICBEZXN0cm95KCk7Ci19Ci0KLXZvaWQKLWxlZmlUd29XaWR0aHM6OmFkZFR3b1dpZHRocyhkb3VibGUgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgcHJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgbnVtU3BhY2luZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICpzcGFjaW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgIGhhc1BSTCkKLXsKLSAgICBpbnQgaTsKLQotICAgIGlmIChudW1XaWR0aF8gPT0gbnVtV2lkdGhBbGxvY2F0ZWRfKSB7Ci0gICAgICAgIGRvdWJsZSAgKm53OwotICAgICAgICBkb3VibGUgICpucDsKLSAgICAgICAgaW50ICAgICAqbm53czsKLSAgICAgICAgZG91YmxlICAqbndzOwotICAgICAgICBpbnQgICAgICpuYXQ7Ci0gICAgICAgIGludCAgICAgKm5IYXNQcmw7Ci0KLSAgICAgICAgbnVtV2lkdGhBbGxvY2F0ZWRfID0gbnVtV2lkdGhBbGxvY2F0ZWRfID8KLSAgICAgICAgICAgIG51bVdpZHRoQWxsb2NhdGVkXyAqIDIgOiAyOwotICAgICAgICBudyA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBudW1XaWR0aEFsbG9jYXRlZF8pOwotICAgICAgICBucCA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBudW1XaWR0aEFsbG9jYXRlZF8pOwotICAgICAgICBubndzID0gKGludCopIGxlZk1hbGxvYyhzaXplb2YoaW50KSAqIG51bVdpZHRoQWxsb2NhdGVkXyk7Ci0gICAgICAgIG5hdCA9IChpbnQqKSBsZWZNYWxsb2Moc2l6ZW9mKGludCkgKiBudW1XaWR0aEFsbG9jYXRlZF8pOwotICAgICAgICBuSGFzUHJsID0gKGludCopIGxlZk1hbGxvYyhzaXplb2YoaW50KSAqIG51bVdpZHRoQWxsb2NhdGVkXyk7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVdpZHRoXzsgaSsrKSB7Ci0gICAgICAgICAgICBud1tpXSA9IHdpZHRoX1tpXTsKLSAgICAgICAgICAgIG5wW2ldID0gcHJsX1tpXTsKLSAgICAgICAgICAgIG5ud3NbaV0gPSBudW1XaWR0aFNwYWNpbmdfW2ldOwotICAgICAgICAgICAgbmF0W2ldID0gYXROc3BfW2ldOwotICAgICAgICAgICAgbkhhc1BybFtpXSA9IGhhc1BSTF9baV07Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVGhlIGxlZkRhdGEtPmxhc3QgdmFsdWUgaW4gYXROc3BfIGlzIHRoZSBsZWZEYXRhLT5sYXN0IHRvdGFsIG51bWJlciBvZiBzcGFjaW5nCi0gICAgICAgIGlmIChudW1XaWR0aF8gPiAwKSB7Ci0gICAgICAgICAgICBud3MgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogKGF0TnNwX1tudW1XaWR0aF8gLSAxXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG51bVNwYWNpbmcpKTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdE5zcF9bbnVtV2lkdGhfIC0gMV07IGkrKykgewotICAgICAgICAgICAgICAgIG53c1tpXSA9IHdpZHRoU3BhY2luZ19baV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgbndzID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIG51bVNwYWNpbmcpOwotCi0gICAgICAgIGlmIChudW1XaWR0aF8pIHsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAod2lkdGhfKSk7Ci0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKHBybF8pKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAobnVtV2lkdGhTcGFjaW5nXykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopICh3aWR0aFNwYWNpbmdfKSk7Ci0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKGF0TnNwXykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChoYXNQUkxfKSk7Ci0gICAgICAgIH0KLSAgICAgICAgd2lkdGhfID0gbnc7Ci0gICAgICAgIHBybF8gPSBucDsKLSAgICAgICAgbnVtV2lkdGhTcGFjaW5nXyA9IG5ud3M7Ci0gICAgICAgIHdpZHRoU3BhY2luZ18gPSBud3M7Ci0gICAgICAgIGF0TnNwXyA9IG5hdDsKLSAgICAgICAgaGFzUFJMXyA9IG5IYXNQcmw7Ci0gICAgfSBlbHNlIHsgIC8vIG5lZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB3aWR0aFNwYWNpbmdfCi0gICAgICAgIGRvdWJsZSAqbndzOwotICAgICAgICBud3MgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogKGF0TnNwX1tudW1XaWR0aF8gLSAxXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbnVtU3BhY2luZykpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXROc3BfW251bVdpZHRoXyAtIDFdOyBpKyspIHsKLSAgICAgICAgICAgIG53c1tpXSA9IHdpZHRoU3BhY2luZ19baV07Ci0gICAgICAgIH0KLSAgICAgICAgbGVmRnJlZSgoY2hhciopICh3aWR0aFNwYWNpbmdfKSk7Ci0gICAgICAgIHdpZHRoU3BhY2luZ18gPSBud3M7Ci0gICAgfQotICAgIHdpZHRoX1tudW1XaWR0aF9dID0gd2lkdGg7Ci0gICAgcHJsX1tudW1XaWR0aF9dID0gcHJsOwotICAgIGhhc1BSTF9bbnVtV2lkdGhfXSA9IGhhc1BSTDsKLSAgICBudW1XaWR0aFNwYWNpbmdfW251bVdpZHRoX10gPSBudW1TcGFjaW5nOwotICAgIGlmIChudW1XaWR0aF8gPT0gMCkgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtU3BhY2luZzsgaSsrKQotICAgICAgICAgICAgd2lkdGhTcGFjaW5nX1tpXSA9IHNwYWNpbmdzW2ldOwotICAgICAgICBhdE5zcF9bMF0gPSBudW1TcGFjaW5nOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1TcGFjaW5nOyBpKyspCi0gICAgICAgICAgICB3aWR0aFNwYWNpbmdfW2F0TnNwX1tudW1XaWR0aF8gLSAxXSArIGldID0gc3BhY2luZ3NbaV07Ci0gICAgICAgIGF0TnNwX1tudW1XaWR0aF9dID0gYXROc3BfW251bVdpZHRoXyAtIDFdICsgbnVtU3BhY2luZzsKLSAgICB9Ci0gICAgbnVtV2lkdGhfICs9IDE7Ci19Ci0KLWludAotbGVmaVR3b1dpZHRoczo6bnVtV2lkdGgoKSBjb25zdAotewotICAgIHJldHVybiBudW1XaWR0aF87Ci19Ci0KLWRvdWJsZQotbGVmaVR3b1dpZHRoczo6d2lkdGgoaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiB3aWR0aF9baW5kZXhdOwotfQotCi1pbnQKLWxlZmlUd29XaWR0aHM6Omhhc1dpZHRoUFJMKGludCBpbmRleCkgY29uc3QKLXsKLSAgICBpZiAoaGFzUFJMX1tpbmRleF0pCi0gICAgICAgIHJldHVybiAxOwotICAgIHJldHVybiAwOwotfQotCi1kb3VibGUKLWxlZmlUd29XaWR0aHM6OndpZHRoUFJMKGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gcHJsX1tpbmRleF07Ci19Ci0KLWludAotbGVmaVR3b1dpZHRoczo6bnVtV2lkdGhTcGFjaW5nKGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gbnVtV2lkdGhTcGFjaW5nX1tpbmRleF07Ci19Ci0KLWRvdWJsZQotbGVmaVR3b1dpZHRoczo6d2lkdGhTcGFjaW5nKGludCBpV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlXaWR0aFNwYWNpbmcpIGNvbnN0Ci17Ci0gICAgaWYgKGlXaWR0aCA9PSAwKQotICAgICAgICByZXR1cm4gd2lkdGhTcGFjaW5nX1tpV2lkdGhTcGFjaW5nXTsKLSAgICByZXR1cm4gd2lkdGhTcGFjaW5nX1thdE5zcF9baVdpZHRoIC0gMV0gKyBpV2lkdGhTcGFjaW5nXTsKLX0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIGxlZmlTcGFjaW5nVGFibGUKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLWxlZmlTcGFjaW5nVGFibGU6OmxlZmlTcGFjaW5nVGFibGUoKQotewotICAgIEluaXQoKTsKLX0KLQotdm9pZAotbGVmaVNwYWNpbmdUYWJsZTo6SW5pdCgpCi17Ci0gICAgaGFzSW5mbHVlbmNlXyA9IDA7Ci0gICAgcGFyYWxsZWxfID0gMDsKLSAgICBpbmZsdWVuY2VfID0gMDsKLSAgICB0d29XaWR0aHNfID0gMDsgICAgICAgICAgICAgLy8gNS43Ci19Ci0KLXZvaWQKLWxlZmlTcGFjaW5nVGFibGU6OkRlc3Ryb3koKQotewotICAgIGlmICgoaGFzSW5mbHVlbmNlXykgJiYgKGluZmx1ZW5jZV8pKQotICAgICAgICBpbmZsdWVuY2VfLT5EZXN0cm95KCk7Ci0gICAgZWxzZSBpZiAocGFyYWxsZWxfKSB7Ci0gICAgICAgIHBhcmFsbGVsXy0+RGVzdHJveSgpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgcGFyYWxsZWxfKTsKLSAgICB9Ci0gICAgaWYgKGluZmx1ZW5jZV8pCi0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSBpbmZsdWVuY2VfKTsKLSAgICBpZiAodHdvV2lkdGhzXykgewotICAgICAgICB0d29XaWR0aHNfLT5EZXN0cm95KCk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSB0d29XaWR0aHNfKTsKLSAgICB9Ci0gICAgSW5pdCgpOwotfQotCi1sZWZpU3BhY2luZ1RhYmxlOjp+bGVmaVNwYWNpbmdUYWJsZSgpCi17Ci0gICAgRGVzdHJveSgpOwotfQotCi12b2lkCi1sZWZpU3BhY2luZ1RhYmxlOjphZGRQYXJhbGxlbExlbmd0aChpbnQgICAgIG51bUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgKmxlbmd0aHMpCi17Ci0gICAgbGVmaVBhcmFsbGVsICpwYXJhbGxlbDsKLQotICAgIGlmIChwYXJhbGxlbF8gPT0gMCkgewotICAgICAgICBwYXJhbGxlbCA9IChsZWZpUGFyYWxsZWwqKSBsZWZNYWxsb2Moc2l6ZW9mKGxlZmlQYXJhbGxlbCkpOwotICAgICAgICBwYXJhbGxlbC0+SW5pdCgpOwotICAgICAgICBwYXJhbGxlbF8gPSBwYXJhbGxlbDsKLSAgICB9IGVsc2UKLSAgICAgICAgcGFyYWxsZWwgPSBwYXJhbGxlbF87Ci0gICAgcGFyYWxsZWwtPmFkZFBhcmFsbGVsTGVuZ3RoKG51bUxlbmd0aCwgbGVuZ3Rocyk7Ci19Ci0KLXZvaWQKLWxlZmlTcGFjaW5nVGFibGU6OmFkZFBhcmFsbGVsV2lkdGgoZG91YmxlIHdpZHRoKQotewotICAgIGxlZmlQYXJhbGxlbCAqcGFyYWxsZWw7Ci0KLSAgICBwYXJhbGxlbCA9IHBhcmFsbGVsXzsKLSAgICBwYXJhbGxlbC0+YWRkUGFyYWxsZWxXaWR0aCh3aWR0aCk7Ci19Ci0KLXZvaWQKLWxlZmlTcGFjaW5nVGFibGU6OmFkZFBhcmFsbGVsV2lkdGhTcGFjaW5nKGludCAgICAgICBudW1TcGFjaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICpzcGFjaW5ncykKLXsKLSAgICBsZWZpUGFyYWxsZWwgKnBhcmFsbGVsOwotCi0gICAgcGFyYWxsZWwgPSBwYXJhbGxlbF87Ci0gICAgcGFyYWxsZWwtPmFkZFBhcmFsbGVsV2lkdGhTcGFjaW5nKG51bVNwYWNpbmcsIHNwYWNpbmdzKTsKLX0KLQotdm9pZAotbGVmaVNwYWNpbmdUYWJsZTo6c2V0SW5mbHVlbmNlKCkKLXsKLSAgICBsZWZpSW5mbHVlbmNlICppbmZsdWVuY2U7Ci0KLSAgICBpbmZsdWVuY2UgPSAobGVmaUluZmx1ZW5jZSopIGxlZk1hbGxvYyhzaXplb2YobGVmaUluZmx1ZW5jZSkpOwotICAgIGluZmx1ZW5jZS0+SW5pdCgpOwotICAgIGluZmx1ZW5jZV8gPSBpbmZsdWVuY2U7Ci0gICAgaGFzSW5mbHVlbmNlXyA9IDE7Ci19Ci0KLXZvaWQKLWxlZmlTcGFjaW5nVGFibGU6OmFkZEluZmx1ZW5jZShkb3VibGUgICB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICBzcGFjaW5nKQotewotICAgIGxlZmlJbmZsdWVuY2UgKmluZmx1ZW5jZTsKLQotICAgIGluZmx1ZW5jZSA9IGluZmx1ZW5jZV87Ci0gICAgaW5mbHVlbmNlLT5hZGRJbmZsdWVuY2Uod2lkdGgsIGRpc3RhbmNlLCBzcGFjaW5nKTsKLX0KLQotaW50Ci1sZWZpU3BhY2luZ1RhYmxlOjppc0luZmx1ZW5jZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc0luZmx1ZW5jZV8gPyAxIDogMDsKLX0KLQotaW50Ci1sZWZpU3BhY2luZ1RhYmxlOjppc1BhcmFsbGVsKCkgY29uc3QKLXsKLSAgICByZXR1cm4gcGFyYWxsZWxfID8gMSA6IDA7Ci19Ci0KLWxlZmlJbmZsdWVuY2UgKgotbGVmaVNwYWNpbmdUYWJsZTo6aW5mbHVlbmNlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaW5mbHVlbmNlXzsKLX0KLQotbGVmaVBhcmFsbGVsICoKLWxlZmlTcGFjaW5nVGFibGU6OnBhcmFsbGVsKCkgY29uc3QKLXsKLSAgICByZXR1cm4gcGFyYWxsZWxfOwotfQotCi1sZWZpVHdvV2lkdGhzICoKLWxlZmlTcGFjaW5nVGFibGU6OnR3b1dpZHRocygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHR3b1dpZHRoc187Ci19Ci0KLS8vIDUuNwotdm9pZAotbGVmaVNwYWNpbmdUYWJsZTo6YWRkVHdvV2lkdGhzKGRvdWJsZSAgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgIHJ1bkxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICBudW1TcGFjaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICpzcGFjaW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICBoYXNQUkwpCi17Ci0gICAgbGVmaVR3b1dpZHRocyAqdHdvV2lkdGhzOwotCi0gICAgaWYgKHR3b1dpZHRoc18gPT0gMCkgewotICAgICAgICB0d29XaWR0aHMgPSAobGVmaVR3b1dpZHRocyopIGxlZk1hbGxvYyhzaXplb2YobGVmaVR3b1dpZHRocykpOwotICAgICAgICB0d29XaWR0aHMtPkluaXQoKTsKLSAgICAgICAgdHdvV2lkdGhzXyA9IHR3b1dpZHRoczsKLSAgICB9IGVsc2UKLSAgICAgICAgdHdvV2lkdGhzID0gdHdvV2lkdGhzXzsKLSAgICB0d29XaWR0aHMtPmFkZFR3b1dpZHRocyh3aWR0aCwgcnVuTGVuZ3RoLCBudW1TcGFjaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmdzLCBoYXNQUkwpOwotfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gbGVmaU9ydGhvZ29uYWwKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLWxlZmlPcnRob2dvbmFsOjpsZWZpT3J0aG9nb25hbCgpCi17Ci0gICAgSW5pdCgpOwotfQotCi12b2lkCi1sZWZpT3J0aG9nb25hbDo6SW5pdCgpCi17Ci0gICAgbnVtQWxsb2NhdGVkXyA9IDA7Ci0gICAgbnVtQ3V0T3J0aG9fID0gMDsKLSAgICBjdXRXaXRoaW5fID0gMDsKLSAgICBvcnRob18gPSAwOwotfQotCi1sZWZpT3J0aG9nb25hbDo6fmxlZmlPcnRob2dvbmFsKCkKLXsKLSAgICBEZXN0cm95KCk7Ci19Ci0KLXZvaWQKLWxlZmlPcnRob2dvbmFsOjpEZXN0cm95KCkKLXsKLSAgICBpZiAoY3V0V2l0aGluXykKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChjdXRXaXRoaW5fKSk7Ci0gICAgaWYgKG9ydGhvXykKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChvcnRob18pKTsKLSAgICBudW1BbGxvY2F0ZWRfID0gMDsKLSAgICBudW1DdXRPcnRob18gPSAwOwotfQotCi12b2lkCi1sZWZpT3J0aG9nb25hbDo6YWRkT3J0aG9nb25hbChkb3VibGUgICAgY3V0V2l0aGluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgIG9ydGhvKQotewotICAgIGludCAgICAgaSwgbGVuOwotICAgIGRvdWJsZSAgKmN3OwotICAgIGRvdWJsZSAgKm90OwotCi0gICAgaWYgKG51bUFsbG9jYXRlZF8gPT0gbnVtQ3V0T3J0aG9fKSB7Ci0gICAgICAgIGlmIChudW1BbGxvY2F0ZWRfID09IDApCi0gICAgICAgICAgICBsZW4gPSBudW1BbGxvY2F0ZWRfID0gMjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbGVuID0gbnVtQWxsb2NhdGVkXyAqPSAyOwotICAgICAgICBjdyA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBsZW4pOwotICAgICAgICBvdCA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBsZW4pOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1DdXRPcnRob187IGkrKykgewotICAgICAgICAgICAgY3dbaV0gPSBjdXRXaXRoaW5fW2ldOwotICAgICAgICAgICAgb3RbaV0gPSBvcnRob19baV07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGN1dFdpdGhpbl8pCi0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKGN1dFdpdGhpbl8pKTsKLSAgICAgICAgaWYgKG9ydGhvXykKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAob3J0aG9fKSk7Ci0gICAgICAgIGN1dFdpdGhpbl8gPSBjdzsKLSAgICAgICAgb3J0aG9fID0gb3Q7Ci0gICAgfQotICAgIGN1dFdpdGhpbl9bbnVtQ3V0T3J0aG9fXSA9IGN1dFdpdGhpbjsKLSAgICBvcnRob19bbnVtQ3V0T3J0aG9fXSA9IG9ydGhvOwotICAgIG51bUN1dE9ydGhvXyArPSAxOwotfQotCi1pbnQKLWxlZmlPcnRob2dvbmFsOjpudW1PcnRob2dvbmFsKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbnVtQ3V0T3J0aG9fOwotfQotCi1kb3VibGUKLWxlZmlPcnRob2dvbmFsOjpjdXRXaXRoaW4oaW50IGluZGV4KSBjb25zdAotewotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtQ3V0T3J0aG9fKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gY3V0V2l0aGluX1tpbmRleF07Ci19Ci0KLWRvdWJsZQotbGVmaU9ydGhvZ29uYWw6Om9ydGhvU3BhY2luZyhpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1DdXRPcnRob18pCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBvcnRob19baW5kZXhdOwotfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gbGVmaUFudGVubmFNb2RlbAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotbGVmaUFudGVubmFNb2RlbDo6bGVmaUFudGVubmFNb2RlbCgpCi17Ci0gICAgSW5pdCgpOwotfQotCi12b2lkCi1sZWZpQW50ZW5uYU1vZGVsOjpJbml0KCkKLXsKLSAgICBoYXNBbnRlbm5hQXJlYVJhdGlvXyA9IDA7Ci0gICAgaGFzQW50ZW5uYURpZmZBcmVhUmF0aW9fID0gMDsKLSAgICBoYXNBbnRlbm5hRGlmZkFyZWFSYXRpb1BXTF8gPSAwOwotICAgIGhhc0FudGVubmFDdW1BcmVhUmF0aW9fID0gMDsKLSAgICBoYXNBbnRlbm5hQ3VtRGlmZkFyZWFSYXRpb18gPSAwOwotICAgIGhhc0FudGVubmFDdW1EaWZmQXJlYVJhdGlvUFdMXyA9IDA7Ci0gICAgaGFzQW50ZW5uYUFyZWFGYWN0b3JfID0gMDsKLSAgICBoYXNBbnRlbm5hQXJlYUZhY3RvckRVT18gPSAwOwotICAgIGhhc0FudGVubmFTaWRlQXJlYVJhdGlvXyA9IDA7Ci0gICAgaGFzQW50ZW5uYURpZmZTaWRlQXJlYVJhdGlvXyA9IDA7Ci0gICAgaGFzQW50ZW5uYURpZmZTaWRlQXJlYVJhdGlvUFdMXyA9IDA7Ci0gICAgaGFzQW50ZW5uYUN1bVNpZGVBcmVhUmF0aW9fID0gMDsKLSAgICBoYXNBbnRlbm5hQ3VtRGlmZlNpZGVBcmVhUmF0aW9fID0gMDsKLSAgICBoYXNBbnRlbm5hQ3VtRGlmZlNpZGVBcmVhUmF0aW9QV0xfID0gMDsKLSAgICBoYXNBbnRlbm5hU2lkZUFyZWFGYWN0b3JfID0gMDsKLSAgICBoYXNBbnRlbm5hU2lkZUFyZWFGYWN0b3JEVU9fID0gMDsKLSAgICBoYXNBbnRlbm5hQ3VtUm91dGluZ1BsdXNDdXRfID0gMDsgICAgIC8vIDUuNwotICAgIGhhc0FudGVubmFHYXRlUGx1c0RpZmZfID0gMDsgICAgICAgICAgLy8gNS43Ci0gICAgaGFzQW50ZW5uYUFyZWFNaW51c0RpZmZfID0gMDsgICAgICAgICAvLyA1LjcKLSAgICBhbnRlbm5hRGlmZkFyZWFSYXRpb1BXTF8gPSAwOwotICAgIGFudGVubmFDdW1EaWZmQXJlYVJhdGlvUFdMXyA9IDA7Ci0gICAgYW50ZW5uYURpZmZTaWRlQXJlYVJhdGlvUFdMXyA9IDA7Ci0gICAgYW50ZW5uYUN1bURpZmZTaWRlQXJlYVJhdGlvUFdMXyA9IDA7Ci0gICAgYW50ZW5uYUFyZWFEaWZmUmVkdWNlUFdMXyA9IDA7ICAgICAgICAgLy8gNS43Ci0gICAgb3hpZGVfID0gMDsKLX0KLQotdm9pZAotbGVmaUFudGVubmFNb2RlbDo6RGVzdHJveSgpCi17Ci0gICAgaWYgKG94aWRlXykgewotICAgICAgICBsZWZGcmVlKChjaGFyKikgKG94aWRlXykpOwotICAgIH0KLQotICAgIGlmIChhbnRlbm5hRGlmZkFyZWFSYXRpb1BXTF8pIHsKLSAgICAgICAgYW50ZW5uYURpZmZBcmVhUmF0aW9QV0xfLT5EZXN0cm95KCk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoYW50ZW5uYURpZmZBcmVhUmF0aW9QV0xfKSk7Ci0gICAgICAgIGFudGVubmFEaWZmQXJlYVJhdGlvUFdMXyA9IDA7Ci0gICAgfQotICAgIAotICAgIGlmIChhbnRlbm5hQ3VtRGlmZkFyZWFSYXRpb1BXTF8pIHsKLSAgICAgICAgYW50ZW5uYUN1bURpZmZBcmVhUmF0aW9QV0xfLT5EZXN0cm95KCk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoYW50ZW5uYUN1bURpZmZBcmVhUmF0aW9QV0xfKSk7Ci0gICAgICAgIGFudGVubmFDdW1EaWZmQXJlYVJhdGlvUFdMXyA9IDA7Ci0gICAgfQotICAgIAotICAgIGlmIChhbnRlbm5hRGlmZlNpZGVBcmVhUmF0aW9QV0xfKSB7Ci0gICAgICAgIGFudGVubmFEaWZmU2lkZUFyZWFSYXRpb1BXTF8tPkRlc3Ryb3koKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChhbnRlbm5hRGlmZlNpZGVBcmVhUmF0aW9QV0xfKSk7Ci0gICAgICAgIGFudGVubmFEaWZmU2lkZUFyZWFSYXRpb1BXTF8gPSAwOwotICAgIH0KLSAgICAKLSAgICBpZiAoYW50ZW5uYUN1bURpZmZTaWRlQXJlYVJhdGlvUFdMXykgewotICAgICAgICBhbnRlbm5hQ3VtRGlmZlNpZGVBcmVhUmF0aW9QV0xfLT5EZXN0cm95KCk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoYW50ZW5uYUN1bURpZmZTaWRlQXJlYVJhdGlvUFdMXykpOwotICAgICAgICBhbnRlbm5hQ3VtRGlmZlNpZGVBcmVhUmF0aW9QV0xfID0gMDsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGFudGVubmFBcmVhRGlmZlJlZHVjZVBXTF8pIHsgICAgLy8gNS43Ci0gICAgICAgIGFudGVubmFBcmVhRGlmZlJlZHVjZVBXTF8tPkRlc3Ryb3koKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChhbnRlbm5hQXJlYURpZmZSZWR1Y2VQV0xfKSk7Ci0gICAgICAgIGFudGVubmFBcmVhRGlmZlJlZHVjZVBXTF8gPSAwOwotICAgIH0KLQotICAgIEluaXQoKTsKLX0KLQotbGVmaUFudGVubmFNb2RlbDo6fmxlZmlBbnRlbm5hTW9kZWwoKQotewotICAgIERlc3Ryb3koKTsKLX0KLQotLy8gNS41Ci12b2lkCi1sZWZpQW50ZW5uYU1vZGVsOjpzZXRBbnRlbm5hTW9kZWwoaW50IGFPeGlkZSkKLXsKLSAgICBpZiAob3hpZGVfKQotICAgICAgICBsZWZGcmVlKChjaGFyKikgKG94aWRlXykpOwotICAgIHN3aXRjaCAoYU94aWRlKSB7Ci0gICAgY2FzZSAyOgotICAgICAgICBveGlkZV8gPSBzdHJkdXAoIk9YSURFMiIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICAgIG94aWRlXyA9IHN0cmR1cCgiT1hJREUzIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgICAgb3hpZGVfID0gc3RyZHVwKCJPWElERTQiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgb3hpZGVfID0gc3RyZHVwKCJPWElERTEiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vLyAzLzIzLzIwMDAgLS0gV2FuZGEgZGEgUm9zYS4gIFRoZSBmb2xsb3dpbmcgYXJlIGZvciA1LjQgc3ludGF4Ci12b2lkCi1sZWZpQW50ZW5uYU1vZGVsOjpzZXRBbnRlbm5hQXJlYVJhdGlvKGRvdWJsZSB2YWx1ZSkKLXsKLSAgICBhbnRlbm5hQXJlYVJhdGlvXyA9IHZhbHVlOwotICAgIGhhc0FudGVubmFBcmVhUmF0aW9fID0gMTsKLX0KLQotdm9pZAotbGVmaUFudGVubmFNb2RlbDo6c2V0QW50ZW5uYUN1bUFyZWFSYXRpbyhkb3VibGUgdmFsdWUpCi17Ci0gICAgYW50ZW5uYUN1bUFyZWFSYXRpb18gPSB2YWx1ZTsKLSAgICBoYXNBbnRlbm5hQ3VtQXJlYVJhdGlvXyA9IDE7Ci19Ci0KLXZvaWQKLWxlZmlBbnRlbm5hTW9kZWw6OnNldEFudGVubmFBcmVhRmFjdG9yKGRvdWJsZSB2YWx1ZSkKLXsKLSAgICBhbnRlbm5hQXJlYUZhY3Rvcl8gPSB2YWx1ZTsKLSAgICBoYXNBbnRlbm5hQXJlYUZhY3Rvcl8gPSAxOwotfQotCi12b2lkCi1sZWZpQW50ZW5uYU1vZGVsOjpzZXRBbnRlbm5hU2lkZUFyZWFSYXRpbyhkb3VibGUgdmFsdWUpCi17Ci0gICAgYW50ZW5uYVNpZGVBcmVhUmF0aW9fID0gdmFsdWU7Ci0gICAgaGFzQW50ZW5uYVNpZGVBcmVhUmF0aW9fID0gMTsKLX0KLQotdm9pZAotbGVmaUFudGVubmFNb2RlbDo6c2V0QW50ZW5uYUN1bVNpZGVBcmVhUmF0aW8oZG91YmxlIHZhbHVlKQotewotICAgIGFudGVubmFDdW1TaWRlQXJlYVJhdGlvXyA9IHZhbHVlOwotICAgIGhhc0FudGVubmFDdW1TaWRlQXJlYVJhdGlvXyA9IDE7Ci19Ci0KLXZvaWQKLWxlZmlBbnRlbm5hTW9kZWw6OnNldEFudGVubmFTaWRlQXJlYUZhY3Rvcihkb3VibGUgdmFsdWUpCi17Ci0gICAgYW50ZW5uYVNpZGVBcmVhRmFjdG9yXyA9IHZhbHVlOwotICAgIGhhc0FudGVubmFTaWRlQXJlYUZhY3Rvcl8gPSAxOwotfQotCi12b2lkCi1sZWZpQW50ZW5uYU1vZGVsOjpzZXRBbnRlbm5hVmFsdWUobGVmaUFudGVubmFFbnVtICAgYW50ZW5uYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgICAgICAgdmFsdWUpCi17Ci0gICAgc3dpdGNoIChhbnRlbm5hVHlwZSkgewotICAgIGNhc2UgbGVmaUFudGVubmFEQVI6Ci0gICAgICAgIGFudGVubmFEaWZmQXJlYVJhdGlvXyA9IHZhbHVlOwotICAgICAgICBoYXNBbnRlbm5hRGlmZkFyZWFSYXRpb18gPSAxOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIGxlZmlBbnRlbm5hQ0RBUjoKLSAgICAgICAgYW50ZW5uYUN1bURpZmZBcmVhUmF0aW9fID0gdmFsdWU7Ci0gICAgICAgIGhhc0FudGVubmFDdW1EaWZmQXJlYVJhdGlvXyA9IDE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgbGVmaUFudGVubmFEU0FSOgotICAgICAgICBhbnRlbm5hRGlmZlNpZGVBcmVhUmF0aW9fID0gdmFsdWU7Ci0gICAgICAgIGhhc0FudGVubmFEaWZmU2lkZUFyZWFSYXRpb18gPSAxOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIGxlZmlBbnRlbm5hQ0RTQVI6Ci0gICAgICAgIGFudGVubmFDdW1EaWZmU2lkZUFyZWFSYXRpb18gPSB2YWx1ZTsKLSAgICAgICAgaGFzQW50ZW5uYUN1bURpZmZTaWRlQXJlYVJhdGlvXyA9IDE7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9pZAotbGVmaUFudGVubmFNb2RlbDo6c2V0QW50ZW5uYURVTyhsZWZpQW50ZW5uYUVudW0gYW50ZW5uYVR5cGUpCi17Ci0gICAgc3dpdGNoIChhbnRlbm5hVHlwZSkgewotICAgIGNhc2UgbGVmaUFudGVubmFBRjoKLSAgICAgICAgaGFzQW50ZW5uYUFyZWFGYWN0b3JEVU9fID0gMTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsZWZpQW50ZW5uYVNBRjoKLSAgICAgICAgaGFzQW50ZW5uYVNpZGVBcmVhRmFjdG9yRFVPXyA9IDE7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLy8gVGhpcyBmdW5jdGlvbiAnY29uc3VtZXMnIGRhdGEgb2YgcHdsIHBvaW50ZXIgYW5kIHNlbmQgaXQgdG8gdGhlIG5ldyBvd25lci4gCi0vLyBBZnRlciBjYWxsaW5nIHRoZSBmdW5jdGlvbiAncHdsJyBzaG91bGQgYmUgc2V0IHRvIE5VTEwgb3IgYXNzaWduZWQgYSBuZXcgCi0vLyB2YWx1ZS4gCi12b2lkCi1sZWZpQW50ZW5uYU1vZGVsOjpzZXRBbnRlbm5hUFdMKGxlZmlBbnRlbm5hRW51bSBhbnRlbm5hVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaUFudGVubmFQV0wgICpwd2wpCi17Ci0gICAgc3dpdGNoIChhbnRlbm5hVHlwZSkgewotICAgIGNhc2UgbGVmaUFudGVubmFEQVI6Ci0gICAgICAgIGlmIChhbnRlbm5hRGlmZkFyZWFSYXRpb1BXTF8pIHsKLSAgICAgICAgICAgIGFudGVubmFEaWZmQXJlYVJhdGlvUFdMXy0+RGVzdHJveSgpOwotICAgICAgICAgICAgbGVmRnJlZShhbnRlbm5hRGlmZkFyZWFSYXRpb1BXTF8pOwotICAgICAgICB9Ci0KLSAgICAgICAgYW50ZW5uYURpZmZBcmVhUmF0aW9QV0xfID0gcHdsOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgbGVmaUFudGVubmFDREFSOgotICAgICAgICBpZiAoYW50ZW5uYUN1bURpZmZBcmVhUmF0aW9QV0xfKSB7Ci0gICAgICAgICAgICBhbnRlbm5hQ3VtRGlmZkFyZWFSYXRpb1BXTF8tPkRlc3Ryb3koKTsKLSAgICAgICAgICAgIGxlZkZyZWUoYW50ZW5uYUN1bURpZmZBcmVhUmF0aW9QV0xfKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFudGVubmFDdW1EaWZmQXJlYVJhdGlvUFdMXyA9IHB3bDsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGxlZmlBbnRlbm5hRFNBUjoKLSAgICAgICAgaWYgKGFudGVubmFEaWZmU2lkZUFyZWFSYXRpb1BXTF8pIHsKLSAgICAgICAgICAgIGFudGVubmFEaWZmU2lkZUFyZWFSYXRpb1BXTF8tPkRlc3Ryb3koKTsKLSAgICAgICAgICAgIGxlZkZyZWUoYW50ZW5uYURpZmZTaWRlQXJlYVJhdGlvUFdMXyk7Ci0gICAgICAgIH0KLQotICAgICAgICBhbnRlbm5hRGlmZlNpZGVBcmVhUmF0aW9QV0xfID0gcHdsOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgbGVmaUFudGVubmFDRFNBUjoKLSAgICAgICAgaWYgKGFudGVubmFDdW1EaWZmU2lkZUFyZWFSYXRpb1BXTF8pIHsKLSAgICAgICAgICAgIGFudGVubmFDdW1EaWZmU2lkZUFyZWFSYXRpb1BXTF8tPkRlc3Ryb3koKTsKLSAgICAgICAgICAgIGxlZkZyZWUoYW50ZW5uYUN1bURpZmZTaWRlQXJlYVJhdGlvUFdMXyk7Ci0gICAgICAgIH0KLQotICAgICAgICBhbnRlbm5hQ3VtRGlmZlNpZGVBcmVhUmF0aW9QV0xfID0gcHdsOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgbGVmaUFudGVubmFBRFI6Ci0gICAgICAgIGlmIChhbnRlbm5hQXJlYURpZmZSZWR1Y2VQV0xfKSB7Ci0gICAgICAgICAgICBhbnRlbm5hQXJlYURpZmZSZWR1Y2VQV0xfLT5EZXN0cm95KCk7Ci0gICAgICAgICAgICBsZWZGcmVlKGFudGVubmFBcmVhRGlmZlJlZHVjZVBXTF8pOwotICAgICAgICB9Ci0KLSAgICAgICAgYW50ZW5uYUFyZWFEaWZmUmVkdWNlUFdMXyA9IHB3bDsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgICBwd2wtPkRlc3Ryb3koKTsKLSAgICAgICAgbGVmRnJlZShwd2wpOwotICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8vIDUuNwotdm9pZAotbGVmaUFudGVubmFNb2RlbDo6c2V0QW50ZW5uYUN1bVJvdXRpbmdQbHVzQ3V0KCkKLXsKLSAgICBoYXNBbnRlbm5hQ3VtUm91dGluZ1BsdXNDdXRfID0gMTsKLX0KLQotLy8gNS43Ci12b2lkCi1sZWZpQW50ZW5uYU1vZGVsOjpzZXRBbnRlbm5hR2F0ZVBsdXNEaWZmKGRvdWJsZSB2YWx1ZSkKLXsKLSAgICBhbnRlbm5hR2F0ZVBsdXNEaWZmXyA9IHZhbHVlOwotICAgIGhhc0FudGVubmFHYXRlUGx1c0RpZmZfID0gMTsKLX0KLQotLy8gNS43Ci12b2lkCi1sZWZpQW50ZW5uYU1vZGVsOjpzZXRBbnRlbm5hQXJlYU1pbnVzRGlmZihkb3VibGUgdmFsdWUpCi17Ci0gICAgYW50ZW5uYUFyZWFNaW51c0RpZmZfID0gdmFsdWU7Ci0gICAgaGFzQW50ZW5uYUFyZWFNaW51c0RpZmZfID0gMTsKLX0KLQotaW50Ci1sZWZpQW50ZW5uYU1vZGVsOjpoYXNBbnRlbm5hQXJlYVJhdGlvKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzQW50ZW5uYUFyZWFSYXRpb187Ci19Ci0KLWludAotbGVmaUFudGVubmFNb2RlbDo6aGFzQW50ZW5uYURpZmZBcmVhUmF0aW8oKSBjb25zdAotewotICAgIHJldHVybiBoYXNBbnRlbm5hRGlmZkFyZWFSYXRpb187Ci19Ci0KLWludAotbGVmaUFudGVubmFNb2RlbDo6aGFzQW50ZW5uYUN1bUFyZWFSYXRpbygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc0FudGVubmFDdW1BcmVhUmF0aW9fOwotfQotCi1pbnQKLWxlZmlBbnRlbm5hTW9kZWw6Omhhc0FudGVubmFDdW1EaWZmQXJlYVJhdGlvKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzQW50ZW5uYUN1bURpZmZBcmVhUmF0aW9fOwotfQotCi1pbnQKLWxlZmlBbnRlbm5hTW9kZWw6Omhhc0FudGVubmFBcmVhRmFjdG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzQW50ZW5uYUFyZWFGYWN0b3JfOwotfQotCi1pbnQKLWxlZmlBbnRlbm5hTW9kZWw6Omhhc0FudGVubmFTaWRlQXJlYVJhdGlvKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzQW50ZW5uYVNpZGVBcmVhUmF0aW9fOwotfQotCi1pbnQKLWxlZmlBbnRlbm5hTW9kZWw6Omhhc0FudGVubmFEaWZmU2lkZUFyZWFSYXRpbygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc0FudGVubmFEaWZmU2lkZUFyZWFSYXRpb187Ci19Ci0KLWludAotbGVmaUFudGVubmFNb2RlbDo6aGFzQW50ZW5uYUN1bVNpZGVBcmVhUmF0aW8oKSBjb25zdAotewotICAgIHJldHVybiBoYXNBbnRlbm5hQ3VtU2lkZUFyZWFSYXRpb187Ci19Ci0KLWludAotbGVmaUFudGVubmFNb2RlbDo6aGFzQW50ZW5uYUN1bURpZmZTaWRlQXJlYVJhdGlvKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzQW50ZW5uYUN1bURpZmZTaWRlQXJlYVJhdGlvXzsKLX0KLQotaW50Ci1sZWZpQW50ZW5uYU1vZGVsOjpoYXNBbnRlbm5hU2lkZUFyZWFGYWN0b3IoKSBjb25zdAotewotICAgIHJldHVybiBoYXNBbnRlbm5hU2lkZUFyZWFGYWN0b3JfOwotfQotCi1pbnQKLWxlZmlBbnRlbm5hTW9kZWw6Omhhc0FudGVubmFEaWZmQXJlYVJhdGlvUFdMKCkgY29uc3QKLXsKLSAgICByZXR1cm4gYW50ZW5uYURpZmZBcmVhUmF0aW9QV0xfID8gMSA6IDA7Ci19Ci0KLWludAotbGVmaUFudGVubmFNb2RlbDo6aGFzQW50ZW5uYUN1bURpZmZBcmVhUmF0aW9QV0woKSBjb25zdAotewotICAgIHJldHVybiBhbnRlbm5hQ3VtRGlmZkFyZWFSYXRpb1BXTF8gPyAxIDogMDsKLX0KLQotaW50Ci1sZWZpQW50ZW5uYU1vZGVsOjpoYXNBbnRlbm5hRGlmZlNpZGVBcmVhUmF0aW9QV0woKSBjb25zdAotewotICAgIHJldHVybiBhbnRlbm5hRGlmZlNpZGVBcmVhUmF0aW9QV0xfID8gMSA6IDA7Ci19Ci0KLWludAotbGVmaUFudGVubmFNb2RlbDo6aGFzQW50ZW5uYUN1bURpZmZTaWRlQXJlYVJhdGlvUFdMKCkgY29uc3QKLXsKLSAgICByZXR1cm4gYW50ZW5uYUN1bURpZmZTaWRlQXJlYVJhdGlvUFdMXyA/IDEgOiAwOwotfQotCi1pbnQKLWxlZmlBbnRlbm5hTW9kZWw6Omhhc0FudGVubmFBcmVhRmFjdG9yRFVPKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzQW50ZW5uYUFyZWFGYWN0b3JEVU9fOwotfQotCi1pbnQKLWxlZmlBbnRlbm5hTW9kZWw6Omhhc0FudGVubmFTaWRlQXJlYUZhY3RvckRVTygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc0FudGVubmFTaWRlQXJlYUZhY3RvckRVT187Ci19Ci0KLS8vIDUuNwotaW50Ci1sZWZpQW50ZW5uYU1vZGVsOjpoYXNBbnRlbm5hQ3VtUm91dGluZ1BsdXNDdXQoKSBjb25zdAotewotICAgIHJldHVybiBoYXNBbnRlbm5hQ3VtUm91dGluZ1BsdXNDdXRfOwotfQotCi0vLyA1LjcKLWludAotbGVmaUFudGVubmFNb2RlbDo6aGFzQW50ZW5uYUdhdGVQbHVzRGlmZigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc0FudGVubmFHYXRlUGx1c0RpZmZfOwotfQotCi0vLyA1LjcKLWludAotbGVmaUFudGVubmFNb2RlbDo6aGFzQW50ZW5uYUFyZWFNaW51c0RpZmYoKSBjb25zdAotewotICAgIHJldHVybiBoYXNBbnRlbm5hQXJlYU1pbnVzRGlmZl87Ci19Ci0KLS8vIDUuNwotaW50Ci1sZWZpQW50ZW5uYU1vZGVsOjpoYXNBbnRlbm5hQXJlYURpZmZSZWR1Y2VQV0woKSBjb25zdAotewotICAgIHJldHVybiBhbnRlbm5hQXJlYURpZmZSZWR1Y2VQV0xfID8gMSA6IDA7Ci19Ci0KLS8vIDUuNQotY2hhciAqCi1sZWZpQW50ZW5uYU1vZGVsOjphbnRlbm5hT3hpZGUoKSBjb25zdAotewotICAgIHJldHVybiBveGlkZV87Ci19Ci0KLWRvdWJsZQotbGVmaUFudGVubmFNb2RlbDo6YW50ZW5uYUFyZWFSYXRpbygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGFudGVubmFBcmVhUmF0aW9fOwotfQotCi1kb3VibGUKLWxlZmlBbnRlbm5hTW9kZWw6OmFudGVubmFEaWZmQXJlYVJhdGlvKCkgY29uc3QKLXsKLSAgICByZXR1cm4gYW50ZW5uYURpZmZBcmVhUmF0aW9fOwotfQotCi1kb3VibGUKLWxlZmlBbnRlbm5hTW9kZWw6OmFudGVubmFDdW1BcmVhUmF0aW8oKSBjb25zdAotewotICAgIHJldHVybiBhbnRlbm5hQ3VtQXJlYVJhdGlvXzsKLX0KLQotZG91YmxlCi1sZWZpQW50ZW5uYU1vZGVsOjphbnRlbm5hQ3VtRGlmZkFyZWFSYXRpbygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGFudGVubmFDdW1EaWZmQXJlYVJhdGlvXzsKLX0KLQotZG91YmxlCi1sZWZpQW50ZW5uYU1vZGVsOjphbnRlbm5hQXJlYUZhY3RvcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGFudGVubmFBcmVhRmFjdG9yXzsKLX0KLQotZG91YmxlCi1sZWZpQW50ZW5uYU1vZGVsOjphbnRlbm5hU2lkZUFyZWFSYXRpbygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGFudGVubmFTaWRlQXJlYVJhdGlvXzsKLX0KLQotZG91YmxlCi1sZWZpQW50ZW5uYU1vZGVsOjphbnRlbm5hRGlmZlNpZGVBcmVhUmF0aW8oKSBjb25zdAotewotICAgIHJldHVybiBhbnRlbm5hRGlmZlNpZGVBcmVhUmF0aW9fOwotfQotCi1kb3VibGUKLWxlZmlBbnRlbm5hTW9kZWw6OmFudGVubmFDdW1TaWRlQXJlYVJhdGlvKCkgY29uc3QKLXsKLSAgICByZXR1cm4gYW50ZW5uYUN1bVNpZGVBcmVhUmF0aW9fOwotfQotCi1kb3VibGUKLWxlZmlBbnRlbm5hTW9kZWw6OmFudGVubmFDdW1EaWZmU2lkZUFyZWFSYXRpbygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGFudGVubmFDdW1EaWZmU2lkZUFyZWFSYXRpb187Ci19Ci0KLWRvdWJsZQotbGVmaUFudGVubmFNb2RlbDo6YW50ZW5uYVNpZGVBcmVhRmFjdG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gYW50ZW5uYVNpZGVBcmVhRmFjdG9yXzsKLX0KLQotbGVmaUFudGVubmFQV0wgKgotbGVmaUFudGVubmFNb2RlbDo6YW50ZW5uYURpZmZBcmVhUmF0aW9QV0woKSBjb25zdAotewotICAgIHJldHVybiBhbnRlbm5hRGlmZkFyZWFSYXRpb1BXTF87Ci19Ci0KLWxlZmlBbnRlbm5hUFdMICoKLWxlZmlBbnRlbm5hTW9kZWw6OmFudGVubmFDdW1EaWZmQXJlYVJhdGlvUFdMKCkgY29uc3QKLXsKLSAgICByZXR1cm4gYW50ZW5uYUN1bURpZmZBcmVhUmF0aW9QV0xfOwotfQotCi1sZWZpQW50ZW5uYVBXTCAqCi1sZWZpQW50ZW5uYU1vZGVsOjphbnRlbm5hRGlmZlNpZGVBcmVhUmF0aW9QV0woKSBjb25zdAotewotICAgIHJldHVybiBhbnRlbm5hRGlmZlNpZGVBcmVhUmF0aW9QV0xfOwotfQotCi1sZWZpQW50ZW5uYVBXTCAqCi1sZWZpQW50ZW5uYU1vZGVsOjphbnRlbm5hQ3VtRGlmZlNpZGVBcmVhUmF0aW9QV0woKSBjb25zdAotewotICAgIHJldHVybiBhbnRlbm5hQ3VtRGlmZlNpZGVBcmVhUmF0aW9QV0xfOwotfQotCi0vLyA1LjcKLWRvdWJsZQotbGVmaUFudGVubmFNb2RlbDo6YW50ZW5uYUdhdGVQbHVzRGlmZigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGFudGVubmFHYXRlUGx1c0RpZmZfOwotfQotCi0vLyA1LjcKLWRvdWJsZQotbGVmaUFudGVubmFNb2RlbDo6YW50ZW5uYUFyZWFNaW51c0RpZmYoKSBjb25zdAotewotICAgIHJldHVybiBhbnRlbm5hQXJlYU1pbnVzRGlmZl87Ci19Ci0KLS8vIDUuNwotbGVmaUFudGVubmFQV0wgKgotbGVmaUFudGVubmFNb2RlbDo6YW50ZW5uYUFyZWFEaWZmUmVkdWNlUFdMKCkgY29uc3QKLXsKLSAgICByZXR1cm4gYW50ZW5uYUFyZWFEaWZmUmVkdWNlUFdMXzsKLX0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIGxlZmlMYXllcgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLWxlZmlMYXllcjo6bGVmaUxheWVyKCkKLTogbmFtZV8oTlVMTCksCi0gIG5hbWVTaXplXygwKSwKLSAgdHlwZV8oTlVMTCksCi0gIHR5cGVTaXplXygwKSwKLSAgbGF5ZXJUeXBlXyhOVUxMKSwKLSAgaGFzUGl0Y2hfKDApLAotICBoYXNNYXNrXygwKSwKLSAgaGFzT2Zmc2V0XygwKSwKLSAgaGFzV2lkdGhfKDApLAotICBoYXNBcmVhXygwKSwKLSAgaGFzU3BhY2luZ18oMCksCi0gIGhhc0RpYWdQaXRjaF8oMCksCi0gIGhhc0RpYWdXaWR0aF8oMCksCi0gIGhhc0RpYWdTcGFjaW5nXygwKSwKLSAgaGFzU3BhY2luZ05hbWVfKE5VTEwpLAotICBoYXNTcGFjaW5nTGF5ZXJTdGFja18oTlVMTCksCi0gIGhhc1NwYWNpbmdBZGphY2VudF8oTlVMTCksCi0gIGhhc1NwYWNpbmdSYW5nZV8oTlVMTCksCi0gIGhhc1NwYWNpbmdVc2VMZW5ndGhUaHJlc2hvbGRfKE5VTEwpLAotICBoYXNTcGFjaW5nTGVuZ3RoVGhyZXNob2xkXyhOVUxMKSwKLSAgaGFzU3BhY2luZ0NlbnRlclRvQ2VudGVyXyhOVUxMKSwKLSAgaGFzU3BhY2luZ1BhcmFsbGVsT3ZlcmxhcF8oTlVMTCksCi0gIGhhc1NwYWNpbmdDdXRBcmVhXyhOVUxMKSwKLSAgaGFzU3BhY2luZ0VuZE9mTGluZV8oTlVMTCksCi0gIGhhc1NwYWNpbmdQYXJlbGxlbEVkZ2VfKE5VTEwpLAotICBoYXNTcGFjaW5nVHdvRWRnZXNfKE5VTEwpLAotICBoYXNTcGFjaW5nQWRqYWNlbnRFeGNlcHRfKE5VTEwpLAotICBoYXNTcGFjaW5nU2FtZW5ldF8oTlVMTCksCi0gIGhhc1NwYWNpbmdTYW1lbmV0UEdvbmx5XyhOVUxMKSwKLSAgaGFzQXJyYXlTcGFjaW5nXygwKSwKLSAgaGFzRGlyZWN0aW9uXygwKSwKLSAgaGFzUmVzaXN0YW5jZV8oMCksCi0gIGhhc0NhcGFjaXRhbmNlXygwKSwKLSAgaGFzSGVpZ2h0XygwKSwKLSAgaGFzV2lyZUV4dGVuc2lvbl8oMCksCi0gIGhhc1RoaWNrbmVzc18oMCksCi0gIGhhc1Nocmlua2FnZV8oMCksCi0gIGhhc0NhcE11bHRpcGxpZXJfKDApLAotICBoYXNFZGdlQ2FwXygwKSwKLSAgaGFzQW50ZW5uYUFyZWFfKDApLAotICBoYXNBbnRlbm5hTGVuZ3RoXygwKSwKLSAgaGFzQ3VycmVudERlbnNpdHlQb2ludF8oMCksCi0gIGN1cnJlbnREZW5zaXR5XygwLjApLAotICBwaXRjaFhfKDAuMCksCi0gIHBpdGNoWV8oMC4wKSwKLSAgb2Zmc2V0WF8oMC4wKSwKLSAgb2Zmc2V0WV8oMC4wKSwKLSAgZGlhZ1BpdGNoWF8oMC4wKSwKLSAgZGlhZ1BpdGNoWV8oMC4wKSwKLSAgZGlhZ1dpZHRoXygwLjApLAotICBkaWFnU3BhY2luZ18oMC4wKSwKLSAgd2lkdGhfKDAuMCksCi0gIGFyZWFfKDAuMCksCi0gIHdpcmVFeHRlbnNpb25fKDAuMCksCi0gIG51bVNwYWNpbmdzXygwKSwKLSAgc3BhY2luZ3NBbGxvY2F0ZWRfKDApLAotICBtYXNrTnVtYmVyXygwKSwKLSAgc3BhY2luZ18oTlVMTCksCi0gIHNwYWNpbmdBZGphY2VudEN1dHNfKE5VTEwpLAotICBzcGFjaW5nQWRqYWNlbnRXaXRoaW5fKE5VTEwpLAotICBzcGFjaW5nQ3V0QXJlYV8oTlVMTCksCi0gIHJhbmdlTWluXyhOVUxMKSwKLSAgcmFuZ2VNYXhfKE5VTEwpLAotICByYW5nZUluZmx1ZW5jZV8oTlVMTCksCi0gIHJhbmdlSW5mbHVlbmNlUmFuZ2VNaW5fKE5VTEwpLAotICByYW5nZUluZmx1ZW5jZVJhbmdlTWF4XyhOVUxMKSwKLSAgcmFuZ2VSYW5nZU1pbl8oTlVMTCksCi0gIHJhbmdlUmFuZ2VNYXhfKE5VTEwpLAotICBsZW5ndGhUaHJlc2hvbGRfKE5VTEwpLAotICBsZW5ndGhUaHJlc2hvbGRSYW5nZU1pbl8oTlVMTCksCi0gIGxlbmd0aFRocmVzaG9sZFJhbmdlTWF4XyhOVUxMKSwKLSAgbnVtTWluaW11bWN1dF8oMCksCi0gIG1pbmltdW1jdXRBbGxvY2F0ZWRfKDApLAotICBtaW5pbXVtY3V0XyhOVUxMKSwKLSAgbWluaW11bWN1dFdpZHRoXyhOVUxMKSwKLSAgaGFzTWluaW11bWN1dFdpdGhpbl8oTlVMTCksCi0gIG1pbmltdW1jdXRXaXRoaW5fKE5VTEwpLAotICBoYXNNaW5pbXVtY3V0Q29ubmVjdGlvbl8oTlVMTCksCi0gIGhhc01pbmltdW1jdXROdW1DdXRzXyhOVUxMKSwKLSAgbWluaW11bWN1dExlbmd0aF8oTlVMTCksCi0gIG1pbmltdW1jdXREaXN0YW5jZV8oTlVMTCksCi0gIG1heHdpZHRoXygwLjApLAotICBtaW53aWR0aF8oMC4wKSwKLSAgbnVtTWluZW5jbG9zZWRhcmVhXygwKSwKLSAgbWluZW5jbG9zZWRhcmVhQWxsb2NhdGVkXygwKSwKLSAgbWluZW5jbG9zZWRhcmVhXyhOVUxMKSwKLSAgbWluZW5jbG9zZWRhcmVhV2lkdGhfKE5VTEwpLAotICBwcm90cnVzaW9uV2lkdGgxXygwLjApLAotICBwcm90cnVzaW9uTGVuZ3RoXygwLjApLAotICBwcm90cnVzaW9uV2lkdGgyXygwLjApLAotICBudW1NaW5zdGVwXygwKSwKLSAgbnVtTWluc3RlcEFsbG9jXygwKSwKLSAgbWluc3RlcF8oTlVMTCksCi0gIG1pbnN0ZXBMZW5ndGhzdW1fKE5VTEwpLAotICBtaW5zdGVwTWF4RWRnZXNfKE5VTEwpLAotICBtaW5zdGVwTWluQWRqTGVuZ3RoXyhOVUxMKSwKLSAgbWluc3RlcE1pbkJldExlbmd0aF8oTlVMTCksCi0gIG1pbnN0ZXBYU2FtZUNvcm5lcnNfKE5VTEwpLAotICBkaXJlY3Rpb25fKE5VTEwpLAotICByZXNpc3RhbmNlXygwLjApLAotICBjYXBhY2l0YW5jZV8oMC4wKSwKLSAgaGVpZ2h0XygwLjApLAotICB0aGlja25lc3NfKDAuMCksCi0gIHNocmlua2FnZV8oMC4wKSwKLSAgY2FwTXVsdGlwbGllcl8oMC4wKSwKLSAgZWRnZUNhcF8oMC4wKSwKLSAgYW50ZW5uYUFyZWFfKDAuMCksCi0gIGFudGVubmFMZW5ndGhfKDAuMCksCi0gIG51bUN1cnJlbnRQb2ludHNfKDApLAotICBjdXJyZW50UG9pbnRzQWxsb2NhdGVkXygwKSwKLSAgY3VycmVudFdpZHRoc18oTlVMTCksCi0gIGN1cnJlbnRfKE5VTEwpLAotICBudW1DYXBhY2l0YW5jZVBvaW50c18oMCksCi0gIGNhcGFjaXRhbmNlUG9pbnRzQWxsb2NhdGVkXygwKSwKLSAgY2FwYWNpdGFuY2VXaWR0aHNfKE5VTEwpLAotICBjYXBhY2l0YW5jZXNfKE5VTEwpLAotICBudW1SZXNpc3RhbmNlUG9pbnRzXygwKSwKLSAgcmVzaXN0YW5jZVBvaW50c0FsbG9jYXRlZF8oMCksCi0gIHJlc2lzdGFuY2VXaWR0aHNfKE5VTEwpLAotICByZXNpc3RhbmNlc18oTlVMTCksCi0gIG51bVByb3BzXygwKSwKLSAgcHJvcHNBbGxvY2F0ZWRfKDApLAotICBkdmFsdWVzXyhOVUxMKSwKLSAgdHlwZXNfKE5VTEwpLAotICBudW1BY2N1cnJlbnRzXygwKSwKLSAgYWNjdXJyZW50QWxsb2NhdGVkXygwKSwKLSAgYWNjdXJyZW50c18oTlVMTCksCi0gIG51bURjY3VycmVudHNfKDApLAotICBkY2N1cnJlbnRBbGxvY2F0ZWRfKDApLAotICBkY2N1cnJlbnRzXyhOVUxMKSwKLSAgbnVtTnVtc18oMCksCi0gIG51bUFsbG9jYXRlZF8oMCksCi0gIG51bXNfKE5VTEwpLAotICBoYXNBbnRlbm5hQXJlYVJhdGlvXygwKSwKLSAgaGFzQW50ZW5uYURpZmZBcmVhUmF0aW9fKDApLAotICBoYXNBbnRlbm5hRGlmZkFyZWFSYXRpb1BXTF8oMCksCi0gIGhhc0FudGVubmFDdW1BcmVhUmF0aW9fKDApLAotICBoYXNBbnRlbm5hQ3VtRGlmZkFyZWFSYXRpb18oMCksCi0gIGhhc0FudGVubmFDdW1EaWZmQXJlYVJhdGlvUFdMXygwKSwKLSAgaGFzQW50ZW5uYUFyZWFGYWN0b3JfKDApLAotICBoYXNBbnRlbm5hQXJlYUZhY3RvckRVT18oMCksCi0gIGhhc0FudGVubmFTaWRlQXJlYVJhdGlvXygwKSwKLSAgaGFzQW50ZW5uYURpZmZTaWRlQXJlYVJhdGlvXygwKSwKLSAgaGFzQW50ZW5uYURpZmZTaWRlQXJlYVJhdGlvUFdMXygwKSwKLSAgaGFzQW50ZW5uYUN1bVNpZGVBcmVhUmF0aW9fKDApLAotICBoYXNBbnRlbm5hQ3VtRGlmZlNpZGVBcmVhUmF0aW9fKDApLAotICBoYXNBbnRlbm5hQ3VtRGlmZlNpZGVBcmVhUmF0aW9QV0xfKDApLAotICBoYXNBbnRlbm5hU2lkZUFyZWFGYWN0b3JfKDApLAotICBoYXNBbnRlbm5hU2lkZUFyZWFGYWN0b3JEVU9fKDApLAotICBjdXJyZW50QW50ZW5uYU1vZGVsXygwKSwKLSAgbnVtQW50ZW5uYU1vZGVsXygwKSwKLSAgYW50ZW5uYU1vZGVsQWxsb2NhdGVkXygwKSwKLSAgYW50ZW5uYU1vZGVsXyhOVUxMKSwKLSAgaGFzU2xvdFdpcmVXaWR0aF8oMCksCi0gIGhhc1Nsb3RXaXJlTGVuZ3RoXygwKSwKLSAgaGFzU2xvdFdpZHRoXygwKSwKLSAgaGFzU2xvdExlbmd0aF8oMCksCi0gIGhhc01heEFkamFjZW50U2xvdFNwYWNpbmdfKDApLAotICBoYXNNYXhDb2F4aWFsU2xvdFNwYWNpbmdfKDApLAotICBoYXNNYXhFZGdlU2xvdFNwYWNpbmdfKDApLAotICBoYXNTcGxpdFdpcmVXaWR0aF8oMCksCi0gIGhhc01pbmltdW1EZW5zaXR5XygwKSwKLSAgaGFzTWF4aW11bURlbnNpdHlfKDApLAotICBoYXNEZW5zaXR5Q2hlY2tXaW5kb3dfKDApLAotICBoYXNEZW5zaXR5Q2hlY2tTdGVwXygwKSwKLSAgaGFzRmlsbEFjdGl2ZVNwYWNpbmdfKDApLAotICBoYXNUd29XaWR0aFBSTF8oMCksCi0gIHNsb3RXaXJlV2lkdGhfKDAuMCksCi0gIHNsb3RXaXJlTGVuZ3RoXygwLjApLAotICBzbG90V2lkdGhfKDAuMCksCi0gIHNsb3RMZW5ndGhfKDAuMCksCi0gIG1heEFkamFjZW50U2xvdFNwYWNpbmdfKDAuMCksCi0gIG1heENvYXhpYWxTbG90U3BhY2luZ18oMC4wKSwKLSAgbWF4RWRnZVNsb3RTcGFjaW5nXygwLjApLAotICBzcGxpdFdpcmVXaWR0aF8oMC4wKSwKLSAgbWluaW11bURlbnNpdHlfKDAuMCksCi0gIG1heGltdW1EZW5zaXR5XygwLjApLAotICBkZW5zaXR5Q2hlY2tXaW5kb3dMZW5ndGhfKDAuMCksCi0gIGRlbnNpdHlDaGVja1dpbmRvd1dpZHRoXygwLjApLAotICBkZW5zaXR5Q2hlY2tTdGVwXygwLjApLAotICBmaWxsQWN0aXZlU3BhY2luZ18oMC4wKSwKLSAgbnVtU3BhY2luZ1RhYmxlXygwKSwKLSAgc3BhY2luZ1RhYmxlQWxsb2NhdGVkXygwKSwKLSAgc3BhY2luZ1RhYmxlXyhOVUxMKSwKLSAgbnVtRW5jbG9zdXJlXygwKSwKLSAgZW5jbG9zdXJlQWxsb2NhdGVkXygwKSwKLSAgb3ZlcmhhbmcxXyhOVUxMKSwKLSAgb3ZlcmhhbmcyXyhOVUxMKSwKLSAgZW5jbWluV2lkdGhfKE5VTEwpLAotICBjdXRXaXRoaW5fKE5VTEwpLAotICBtaW5MZW5ndGhfKE5VTEwpLAotICBudW1QcmVmZXJFbmNsb3N1cmVfKDApLAotICBwcmVmZXJFbmNsb3N1cmVBbGxvY2F0ZWRfKDApLAotICBwcmVmZXJPdmVyaGFuZzFfKE5VTEwpLAotICBwcmVmZXJPdmVyaGFuZzJfKE5VTEwpLAotICBwcmVmZXJNaW5XaWR0aF8oTlVMTCksCi0gIHJlc1BlckN1dF8oMC4wKSwKLSAgZGlhZ01pbkVkZ2VMZW5ndGhfKDAuMCksCi0gIG51bU1pblNpemVfKDApLAotICBtaW5TaXplV2lkdGhfKE5VTEwpLAotICBtaW5TaXplTGVuZ3RoXyhOVUxMKSwKLSAgZW9sV2lkdGhfKE5VTEwpLAotICBlb2xXaXRoaW5fKE5VTEwpLAotICBwYXJTcGFjZV8oTlVMTCksCi0gIHBhcldpdGhpbl8oTlVMTCksCi0gIG1heEFyZWFfKDAuMCksCi0gIGhhc0xvbmdBcnJheV8oMCksCi0gIHZpYVdpZHRoXygwLjApLAotICBjdXRTcGFjaW5nXygwLjApLAotICBudW1BcnJheUN1dHNfKDApLAotICBhcnJheUN1dHNBbGxvY2F0ZWRfKDApLAotICBhcnJheUN1dHNfKE5VTEwpLAotICBhcnJheVNwYWNpbmdzXyhOVUxMKSwKLSAgaGFzU3BhY2luZ1RhYmxlT3J0aG9fKDApLAotICBzcGFjaW5nVGFibGVPcnRob18oTlVMTCksCi0gIG5vdGNoTGVuZ3RoXyhOVUxMKSwKLSAgZW5kT2ZOb3RjaFdpZHRoXyhOVUxMKSwKLSAgbWluTm90Y2hTcGFjaW5nXyhOVUxMKSwKLSAgZW9ub3RjaExlbmd0aF8oTlVMTCkKLXsKLSAgICBJbml0KCk7Ci19Ci0KLXZvaWQKLWxlZmlMYXllcjo6SW5pdCgpCi17Ci0gICAgbmFtZV8gPSAoY2hhciopIGxlZk1hbGxvYygxNik7Ci0gICAgbmFtZVNpemVfID0gMTY7Ci0gICAgdHlwZV8gPSAoY2hhciopIGxlZk1hbGxvYygxNik7Ci0gICAgdHlwZVNpemVfID0gMTY7Ci0gICAgbGF5ZXJUeXBlXyA9IDA7Ci0gICAgbnVtU3BhY2luZ3NfID0gMDsKLSAgICBzcGFjaW5nc0FsbG9jYXRlZF8gPSAwOwotICAgIG51bU1pbmltdW1jdXRfID0gMDsKLSAgICBtaW5pbXVtY3V0QWxsb2NhdGVkXyA9IDA7Ci0gICAgbnVtTWluZW5jbG9zZWRhcmVhXyA9IDA7Ci0gICAgbWluZW5jbG9zZWRhcmVhQWxsb2NhdGVkXyA9IDA7Ci0gICAgbnVtQ3VycmVudFBvaW50c18gPSAwOwotICAgIGN1cnJlbnRQb2ludHNBbGxvY2F0ZWRfID0gMjsKLSAgICBjdXJyZW50V2lkdGhzXyA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiAyKTsKLSAgICBjdXJyZW50XyA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiAyKTsKLSAgICBudW1SZXNpc3RhbmNlUG9pbnRzXyA9IDA7Ci0gICAgcmVzaXN0YW5jZVBvaW50c0FsbG9jYXRlZF8gPSAyOwotICAgIHJlc2lzdGFuY2VXaWR0aHNfID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIDIpOwotICAgIHJlc2lzdGFuY2VzXyA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiAyKTsKLSAgICBudW1DYXBhY2l0YW5jZVBvaW50c18gPSAwOwotICAgIGNhcGFjaXRhbmNlUG9pbnRzQWxsb2NhdGVkXyA9IDI7Ci0gICAgY2FwYWNpdGFuY2VXaWR0aHNfID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIDIpOwotICAgIGNhcGFjaXRhbmNlc18gPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogMik7Ci0gICAgbnVtUHJvcHNfID0gMDsKLSAgICBwcm9wc0FsbG9jYXRlZF8gPSAxOwotICAgIG5hbWVzXyA9IChjaGFyKiopIGxlZk1hbGxvYyhzaXplb2YoY2hhciopKTsKLSAgICB2YWx1ZXNfID0gKGNoYXIqKikgbGVmTWFsbG9jKHNpemVvZihjaGFyKikpOwotICAgIGR2YWx1ZXNfID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSk7Ci0gICAgdHlwZXNfID0gKGNoYXIqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIpKTsKLSAgICBudW1BY2N1cnJlbnRzXyA9IDA7Ci0gICAgYWNjdXJyZW50QWxsb2NhdGVkXyA9IDA7Ci0gICAgbnVtRGNjdXJyZW50c18gPSAwOwotICAgIGRjY3VycmVudEFsbG9jYXRlZF8gPSAwOwotICAgIG51bU51bXNfID0gMDsKLSAgICBudW1BbGxvY2F0ZWRfID0gMDsKLSAgICBoYXNUd29XaWR0aFBSTF8gPSAwOwotICAgIG51bVNwYWNpbmdUYWJsZV8gPSAwOwotICAgIHNwYWNpbmdUYWJsZUFsbG9jYXRlZF8gPSAwOwotICAgIG51bUVuY2xvc3VyZV8gPSAwOwotICAgIGVuY2xvc3VyZUFsbG9jYXRlZF8gPSAwOwotICAgIG51bVByZWZlckVuY2xvc3VyZV8gPSAwOwotICAgIHByZWZlckVuY2xvc3VyZUFsbG9jYXRlZF8gPSAwOwotICAgIG51bU1pblNpemVfID0gMDsKLSAgICBudW1NaW5zdGVwQWxsb2NfID0gMDsKLSAgICBudW1BcnJheUN1dHNfID0gMDsKLSAgICBhcnJheUN1dHNBbGxvY2F0ZWRfID0gMDsKLSAgICBjdXRTcGFjaW5nXyA9IDA7ICAgICAgICAvLyBJbml0aWFsaXplIEFSUkFZU1BBQ0lORwotICAgIGN1cnJlbnRBbnRlbm5hTW9kZWxfID0gMDsKLSAgICBudW1BbnRlbm5hTW9kZWxfID0gMDsKLSAgICBhbnRlbm5hTW9kZWxBbGxvY2F0ZWRfID0gMDsKLSAgICBhbnRlbm5hTW9kZWxfID0gMDsKLSAgICBoYXNTcGFjaW5nVGFibGVPcnRob18gPSAwOwotICAgIHNwYWNpbmdfID0gMDsKLSAgICBzcGFjaW5nTmFtZV8gPSAwOwotICAgIHNwYWNpbmdBZGphY2VudEN1dHNfID0gMDsKLSAgICBzcGFjaW5nQWRqYWNlbnRXaXRoaW5fID0gMDsKLSAgICBoYXNTcGFjaW5nTmFtZV8gPSAwOwotICAgIGhhc1NwYWNpbmdMYXllclN0YWNrXyA9IDA7Ci0gICAgaGFzU3BhY2luZ0FkamFjZW50XyA9IDA7Ci0gICAgaGFzU3BhY2luZ0NlbnRlclRvQ2VudGVyXyA9IDA7Ci0gICAgaGFzU3BhY2luZ1BhcmFsbGVsT3ZlcmxhcF8gPSAwOwotICAgIGhhc1NwYWNpbmdFbmRPZkxpbmVfID0gMDsKLSAgICBlb2xXaWR0aF8gPSAwOwotICAgIGVvbFdpdGhpbl8gPSAwOwotICAgIGhhc1NwYWNpbmdQYXJlbGxlbEVkZ2VfID0gMDsKLSAgICBwYXJTcGFjZV8gPSAwOwotICAgIHBhcldpdGhpbl8gPSAwOwotICAgIGhhc1NwYWNpbmdUd29FZGdlc18gPSAwOwotICAgIGhhc1NwYWNpbmdBZGphY2VudEV4Y2VwdF8gPSAwOwotICAgIGhhc1NwYWNpbmdTYW1lbmV0XyA9IDA7Ci0gICAgaGFzU3BhY2luZ1NhbWVuZXRQR29ubHlfID0gMDsKLSAgICBoYXNTcGFjaW5nQ3V0QXJlYV8gPSAwOwotICAgIHNwYWNpbmdDdXRBcmVhXyA9IDA7Ci0gICAgbm90Y2hMZW5ndGhfID0gMDsKLSAgICBlbmRPZk5vdGNoV2lkdGhfID0gMDsKLSAgICBtaW5Ob3RjaFNwYWNpbmdfID0gMDsKLSAgICBlb25vdGNoTGVuZ3RoXyA9IDA7Ci0gICAgcmFuZ2VNaW5fID0gMDsKLSAgICByYW5nZU1heF8gPSAwOwotICAgIHJhbmdlSW5mbHVlbmNlXyA9IDA7Ci0gICAgcmFuZ2VJbmZsdWVuY2VSYW5nZU1pbl8gPSAwOwotICAgIHJhbmdlSW5mbHVlbmNlUmFuZ2VNYXhfID0gMDsKLSAgICByYW5nZVJhbmdlTWluXyA9IDA7Ci0gICAgcmFuZ2VSYW5nZU1heF8gPSAwOwotICAgIGxlbmd0aFRocmVzaG9sZF8gPSAwOwotICAgIGxlbmd0aFRocmVzaG9sZFJhbmdlTWluXyA9IDA7Ci0gICAgbGVuZ3RoVGhyZXNob2xkUmFuZ2VNYXhfID0gMDsKLSAgICBoYXNTcGFjaW5nUmFuZ2VfID0gMDsKLSAgICBoYXNTcGFjaW5nVXNlTGVuZ3RoVGhyZXNob2xkXyA9IDA7Ci0gICAgaGFzU3BhY2luZ0xlbmd0aFRocmVzaG9sZF8gPSAwOwotICAgIGNsZWFyKCk7Ci19Ci0KLXZvaWQKLWxlZmlMYXllcjo6RGVzdHJveSgpCi17Ci0KLSAgICBjbGVhcigpOwotICAgIGxlZkZyZWUobmFtZV8pOwotICAgIG5hbWVTaXplXyA9IDA7Ci0gICAgbGVmRnJlZSh0eXBlXyk7Ci0gICAgdHlwZVNpemVfID0gMDsKLSAgICBpZiAoc3BhY2luZ18pCi0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoc3BhY2luZ18pKTsKLSAgICBzcGFjaW5nXyA9IDA7Ci0gICAgaWYgKHNwYWNpbmdUYWJsZV8pCi0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSBzcGFjaW5nVGFibGVfKTsKLSAgICBzcGFjaW5nVGFibGVfID0gMDsKLSAgICBpZiAoc3BhY2luZ05hbWVfKQotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHNwYWNpbmdOYW1lXykpOwotICAgIHNwYWNpbmdOYW1lXyA9IDA7Ci0gICAgaWYgKHNwYWNpbmdBZGphY2VudEN1dHNfKQotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHNwYWNpbmdBZGphY2VudEN1dHNfKSk7Ci0gICAgc3BhY2luZ0FkamFjZW50Q3V0c18gPSAwOwotICAgIGlmIChzcGFjaW5nQWRqYWNlbnRXaXRoaW5fKQotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHNwYWNpbmdBZGphY2VudFdpdGhpbl8pKTsKLSAgICBzcGFjaW5nQWRqYWNlbnRXaXRoaW5fID0gMDsKLSAgICBpZiAoaGFzU3BhY2luZ05hbWVfKQotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGhhc1NwYWNpbmdOYW1lXykpOwotICAgIGhhc1NwYWNpbmdOYW1lXyA9IDA7Ci0gICAgaWYgKGhhc1NwYWNpbmdMYXllclN0YWNrXykKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChoYXNTcGFjaW5nTGF5ZXJTdGFja18pKTsKLSAgICBoYXNTcGFjaW5nTGF5ZXJTdGFja18gPSAwOwotICAgIGlmIChoYXNTcGFjaW5nQWRqYWNlbnRfKQotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGhhc1NwYWNpbmdBZGphY2VudF8pKTsKLSAgICBoYXNTcGFjaW5nQWRqYWNlbnRfID0gMDsKLSAgICBpZiAoaGFzU3BhY2luZ0NlbnRlclRvQ2VudGVyXykKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChoYXNTcGFjaW5nQ2VudGVyVG9DZW50ZXJfKSk7Ci0gICAgaGFzU3BhY2luZ0NlbnRlclRvQ2VudGVyXyA9IDA7Ci0gICAgaWYgKGhhc1NwYWNpbmdQYXJhbGxlbE92ZXJsYXBfKQotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGhhc1NwYWNpbmdQYXJhbGxlbE92ZXJsYXBfKSk7Ci0gICAgaGFzU3BhY2luZ1BhcmFsbGVsT3ZlcmxhcF8gPSAwOwotICAgIGlmIChoYXNTcGFjaW5nRW5kT2ZMaW5lXykKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChoYXNTcGFjaW5nRW5kT2ZMaW5lXykpOwotICAgIGhhc1NwYWNpbmdFbmRPZkxpbmVfID0gMDsKLSAgICBpZiAoZW9sV2lkdGhfKQotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGVvbFdpZHRoXykpOwotICAgIGVvbFdpZHRoXyA9IDA7Ci0gICAgaWYgKGVvbFdpdGhpbl8pCi0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoZW9sV2l0aGluXykpOwotICAgIGVvbFdpdGhpbl8gPSAwOwotICAgIGlmIChoYXNTcGFjaW5nUGFyZWxsZWxFZGdlXykKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChoYXNTcGFjaW5nUGFyZWxsZWxFZGdlXykpOwotICAgIGhhc1NwYWNpbmdQYXJlbGxlbEVkZ2VfID0gMDsKLSAgICBpZiAocGFyU3BhY2VfKQotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHBhclNwYWNlXykpOwotICAgIHBhclNwYWNlXyA9IDA7Ci0gICAgaWYgKHBhcldpdGhpbl8pCi0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAocGFyV2l0aGluXykpOwotICAgIHBhcldpdGhpbl8gPSAwOwotICAgIGlmIChoYXNTcGFjaW5nVHdvRWRnZXNfKQotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGhhc1NwYWNpbmdUd29FZGdlc18pKTsKLSAgICBoYXNTcGFjaW5nVHdvRWRnZXNfID0gMDsKLSAgICBpZiAoaGFzU3BhY2luZ0FkamFjZW50RXhjZXB0XykKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChoYXNTcGFjaW5nQWRqYWNlbnRFeGNlcHRfKSk7Ci0gICAgaGFzU3BhY2luZ0FkamFjZW50RXhjZXB0XyA9IDA7Ci0gICAgaWYgKGhhc1NwYWNpbmdTYW1lbmV0XykKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChoYXNTcGFjaW5nU2FtZW5ldF8pKTsKLSAgICBoYXNTcGFjaW5nU2FtZW5ldF8gPSAwOwotICAgIGlmIChoYXNTcGFjaW5nU2FtZW5ldFBHb25seV8pCi0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoaGFzU3BhY2luZ1NhbWVuZXRQR29ubHlfKSk7Ci0gICAgaGFzU3BhY2luZ1NhbWVuZXRQR29ubHlfID0gMDsKLSAgICBpZiAoaGFzU3BhY2luZ0N1dEFyZWFfKQotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGhhc1NwYWNpbmdDdXRBcmVhXykpOwotICAgIGhhc1NwYWNpbmdDdXRBcmVhXyA9IDA7Ci0gICAgaWYgKHNwYWNpbmdDdXRBcmVhXykKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChzcGFjaW5nQ3V0QXJlYV8pKTsKLSAgICBzcGFjaW5nQ3V0QXJlYV8gPSAwOwotICAgIGlmIChub3RjaExlbmd0aF8pCi0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAobm90Y2hMZW5ndGhfKSk7Ci0gICAgbm90Y2hMZW5ndGhfID0gMDsKLSAgICBpZiAoZW5kT2ZOb3RjaFdpZHRoXykKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChlbmRPZk5vdGNoV2lkdGhfKSk7Ci0gICAgZW5kT2ZOb3RjaFdpZHRoXyA9IDA7Ci0gICAgaWYgKG1pbk5vdGNoU3BhY2luZ18pCi0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAobWluTm90Y2hTcGFjaW5nXykpOwotICAgIG1pbk5vdGNoU3BhY2luZ18gPSAwOwotICAgIGlmIChlb25vdGNoTGVuZ3RoXykKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChlb25vdGNoTGVuZ3RoXykpOwotICAgIGVvbm90Y2hMZW5ndGhfID0gMDsKLSAgICBpZiAocmFuZ2VNaW5fKQotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHJhbmdlTWluXykpOwotICAgIHJhbmdlTWluXyA9IDA7Ci0gICAgaWYgKHJhbmdlTWF4XykKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChyYW5nZU1heF8pKTsKLSAgICByYW5nZU1heF8gPSAwOwotICAgIGlmIChyYW5nZUluZmx1ZW5jZV8pCi0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAocmFuZ2VJbmZsdWVuY2VfKSk7Ci0gICAgcmFuZ2VJbmZsdWVuY2VfID0gMDsKLSAgICBpZiAocmFuZ2VJbmZsdWVuY2VSYW5nZU1pbl8pCi0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAocmFuZ2VJbmZsdWVuY2VSYW5nZU1pbl8pKTsKLSAgICByYW5nZUluZmx1ZW5jZVJhbmdlTWluXyA9IDA7Ci0gICAgaWYgKHJhbmdlSW5mbHVlbmNlUmFuZ2VNYXhfKQotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHJhbmdlSW5mbHVlbmNlUmFuZ2VNYXhfKSk7Ci0gICAgcmFuZ2VJbmZsdWVuY2VSYW5nZU1heF8gPSAwOwotICAgIGlmIChyYW5nZVJhbmdlTWluXykKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChyYW5nZVJhbmdlTWluXykpOwotICAgIHJhbmdlUmFuZ2VNaW5fID0gMDsKLSAgICBpZiAocmFuZ2VSYW5nZU1heF8pCi0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAocmFuZ2VSYW5nZU1heF8pKTsKLSAgICByYW5nZVJhbmdlTWF4XyA9IDA7Ci0gICAgaWYgKGxlbmd0aFRocmVzaG9sZF8pCi0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAobGVuZ3RoVGhyZXNob2xkXykpOwotICAgIGxlbmd0aFRocmVzaG9sZF8gPSAwOwotICAgIGlmIChsZW5ndGhUaHJlc2hvbGRSYW5nZU1pbl8pCi0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAobGVuZ3RoVGhyZXNob2xkUmFuZ2VNaW5fKSk7Ci0gICAgbGVuZ3RoVGhyZXNob2xkUmFuZ2VNaW5fID0gMDsKLSAgICBpZiAobGVuZ3RoVGhyZXNob2xkUmFuZ2VNYXhfKQotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGxlbmd0aFRocmVzaG9sZFJhbmdlTWF4XykpOwotICAgIGxlbmd0aFRocmVzaG9sZFJhbmdlTWF4XyA9IDA7Ci0gICAgaWYgKGhhc1NwYWNpbmdSYW5nZV8pCi0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoaGFzU3BhY2luZ1JhbmdlXykpOwotICAgIGhhc1NwYWNpbmdSYW5nZV8gPSAwOwotICAgIGlmIChoYXNTcGFjaW5nVXNlTGVuZ3RoVGhyZXNob2xkXykKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChoYXNTcGFjaW5nVXNlTGVuZ3RoVGhyZXNob2xkXykpOwotICAgIGhhc1NwYWNpbmdVc2VMZW5ndGhUaHJlc2hvbGRfID0gMDsKLSAgICBpZiAoaGFzU3BhY2luZ0xlbmd0aFRocmVzaG9sZF8pCi0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoaGFzU3BhY2luZ0xlbmd0aFRocmVzaG9sZF8pKTsKLSAgICBoYXNTcGFjaW5nTGVuZ3RoVGhyZXNob2xkXyA9IDA7Ci0gICAgbGVmRnJlZSgoY2hhciopIChjdXJyZW50V2lkdGhzXykpOwotICAgIGxlZkZyZWUoKGNoYXIqKSAoY3VycmVudF8pKTsKLSAgICBsZWZGcmVlKChjaGFyKikgKHJlc2lzdGFuY2VXaWR0aHNfKSk7Ci0gICAgbGVmRnJlZSgoY2hhciopIChyZXNpc3RhbmNlc18pKTsKLSAgICBsZWZGcmVlKChjaGFyKikgKGNhcGFjaXRhbmNlV2lkdGhzXykpOwotICAgIGxlZkZyZWUoKGNoYXIqKSAoY2FwYWNpdGFuY2VzXykpOwotICAgIGxlZkZyZWUoKGNoYXIqKSAobmFtZXNfKSk7Ci0gICAgbGVmRnJlZSgoY2hhciopICh2YWx1ZXNfKSk7Ci0gICAgbGVmRnJlZSgoY2hhciopIChkdmFsdWVzXykpOwotICAgIGxlZkZyZWUoKGNoYXIqKSAodHlwZXNfKSk7Ci0gICAgY3VycmVudFBvaW50c0FsbG9jYXRlZF8gPSAwOwotICAgIHJlc2lzdGFuY2VQb2ludHNBbGxvY2F0ZWRfID0gMDsKLSAgICBjYXBhY2l0YW5jZVBvaW50c0FsbG9jYXRlZF8gPSAwOwotICAgIHByb3BzQWxsb2NhdGVkXyA9IDA7Ci19Ci0KLWxlZmlMYXllcjo6fmxlZmlMYXllcigpCi17Ci0gICAgRGVzdHJveSgpOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OmNsZWFyKCkKLXsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGk7Ci0gICAgbGVmaUxheWVyRGVuc2l0eSAgICAqcDsKLSAgICBsZWZpU3BhY2luZ1RhYmxlICAgICpzcDsKLSAgICBsZWZpQW50ZW5uYU1vZGVsICAgICphTzsgICAgICAgICAvLyA1LjUKLQotICAgIGlmIChuYW1lXykKLSAgICAgICAgKihuYW1lXykgPSAwOwotICAgIGlmICh0eXBlXykKLSAgICAgICAgKih0eXBlXykgPSAwOwotICAgIGlmIChsYXllclR5cGVfKSB7Ci0gICAgICAgIGxlZkZyZWUobGF5ZXJUeXBlXyk7Ci0gICAgICAgIGxheWVyVHlwZV8gPSAwOwotICAgIH0KLSAgICBoYXNNYXNrXyA9IDA7Ci0gICAgaGFzUGl0Y2hfID0gMDsKLSAgICBoYXNPZmZzZXRfID0gMDsKLSAgICBoYXNXaWR0aF8gPSAwOwotICAgIGhhc0FyZWFfID0gMDsKLSAgICBoYXNEaWFnUGl0Y2hfID0gMDsKLSAgICBoYXNEaWFnV2lkdGhfID0gMDsKLSAgICBoYXNEaWFnU3BhY2luZ18gPSAwOwotICAgIGhhc1dpcmVFeHRlbnNpb25fID0gMDsKLSAgICBoYXNTcGFjaW5nXyA9IDA7Ci0gICAgaGFzRGlyZWN0aW9uXyA9IDA7Ci0gICAgaGFzUmVzaXN0YW5jZV8gPSAwOwotICAgIGhhc0NhcGFjaXRhbmNlXyA9IDA7Ci0gICAgaGFzSGVpZ2h0XyA9IDA7Ci0gICAgaGFzVGhpY2tuZXNzXyA9IDA7Ci0gICAgaGFzU2hyaW5rYWdlXyA9IDA7Ci0gICAgaGFzQ2FwTXVsdGlwbGllcl8gPSAwOwotICAgIGhhc0VkZ2VDYXBfID0gMDsKLSAgICBoYXNBbnRlbm5hQXJlYV8gPSAwOwotICAgIGhhc0FudGVubmFMZW5ndGhfID0gMDsKLSAgICBoYXNDdXJyZW50RGVuc2l0eVBvaW50XyA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bVNwYWNpbmdzXzsgaSsrKQotICAgICAgICBpZiAoc3BhY2luZ05hbWVfW2ldKQotICAgICAgICAgICAgbGVmRnJlZShzcGFjaW5nTmFtZV9baV0pOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1Qcm9wc187IGkrKykgewotICAgICAgICBpZiAobmFtZXNfW2ldKQotICAgICAgICAgICAgbGVmRnJlZShuYW1lc19baV0pOwotICAgICAgICBpZiAodmFsdWVzX1tpXSkKLSAgICAgICAgICAgIGxlZkZyZWUodmFsdWVzX1tpXSk7Ci0gICAgICAgIGR2YWx1ZXNfW2ldID0gMDsKLSAgICB9Ci0gICAgbnVtUHJvcHNfID0gMDsKLSAgICBudW1TcGFjaW5nc18gPSAwOwotICAgIG51bUN1cnJlbnRQb2ludHNfID0gMDsKLSAgICBpZiAobnVtQWNjdXJyZW50c18pIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUFjY3VycmVudHNfOyBpKyspIHsKLSAgICAgICAgICAgIHAgPSBhY2N1cnJlbnRzX1tpXTsKLSAgICAgICAgICAgIHAtPkRlc3Ryb3koKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSBwKTsKLSAgICAgICAgfQotICAgICAgICBudW1BY2N1cnJlbnRzXyA9IDA7Ci0gICAgICAgIGFjY3VycmVudEFsbG9jYXRlZF8gPSAwOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGFjY3VycmVudHNfKSk7Ci0gICAgICAgIGFjY3VycmVudHNfID0gMDsKLSAgICB9Ci0gICAgaWYgKG51bURjY3VycmVudHNfKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1EY2N1cnJlbnRzXzsgaSsrKSB7Ci0gICAgICAgICAgICBwID0gZGNjdXJyZW50c19baV07Ci0gICAgICAgICAgICBwLT5EZXN0cm95KCk7Ci0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgcCk7Ci0gICAgICAgIH0KLSAgICAgICAgbnVtRGNjdXJyZW50c18gPSAwOwotICAgICAgICBkY2N1cnJlbnRBbGxvY2F0ZWRfID0gMDsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChkY2N1cnJlbnRzXykpOwotICAgICAgICBkY2N1cnJlbnRzXyA9IDA7Ci0gICAgfQotICAgIC8vIDgvMjkvMjAwMSAtIFdhbmRhIGRhIFJvc2EuICBUaGUgZm9sbG93aW5nIGFyZSA1LjQgZW5oYW5jZW1lbnRzCi0gICAgaGFzU2xvdFdpcmVXaWR0aF8gPSAwOwotICAgIGhhc1Nsb3RXaXJlTGVuZ3RoXyA9IDA7Ci0gICAgaGFzU2xvdFdpZHRoXyA9IDA7Ci0gICAgaGFzU2xvdExlbmd0aF8gPSAwOwotICAgIGhhc01heEFkamFjZW50U2xvdFNwYWNpbmdfID0gMDsKLSAgICBoYXNNYXhDb2F4aWFsU2xvdFNwYWNpbmdfID0gMDsKLSAgICBoYXNNYXhFZGdlU2xvdFNwYWNpbmdfID0gMDsKLSAgICBoYXNTcGxpdFdpcmVXaWR0aF8gPSAwOwotICAgIGhhc01pbmltdW1EZW5zaXR5XyA9IDA7Ci0gICAgaGFzTWF4aW11bURlbnNpdHlfID0gMDsKLSAgICBoYXNEZW5zaXR5Q2hlY2tXaW5kb3dfID0gMDsKLSAgICBoYXNEZW5zaXR5Q2hlY2tTdGVwXyA9IDA7Ci0gICAgaGFzVHdvV2lkdGhQUkxfID0gMDsKLSAgICBoYXNGaWxsQWN0aXZlU3BhY2luZ18gPSAwOwotICAgIC8vIDUuNQotICAgIGlmIChudW1NaW5pbXVtY3V0XyA+IDApIHsKLSAgICAgICAgLy8gSGFzIGFsbG9jYXRlZCBtZW1vcmllcwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKG1pbmltdW1jdXRfKSk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAobWluaW11bWN1dFdpZHRoXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGhhc01pbmltdW1jdXRXaXRoaW5fKSk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAobWluaW11bWN1dFdpdGhpbl8pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChoYXNNaW5pbXVtY3V0Q29ubmVjdGlvbl8pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChoYXNNaW5pbXVtY3V0TnVtQ3V0c18pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChtaW5pbXVtY3V0TGVuZ3RoXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKG1pbmltdW1jdXREaXN0YW5jZV8pKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bU1pbmltdW1jdXRfOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChtaW5pbXVtY3V0Q29ubmVjdGlvbl9baV0pCi0gICAgICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChtaW5pbXVtY3V0Q29ubmVjdGlvbl9baV0pKTsKLSAgICAgICAgfQotICAgICAgICBsZWZGcmVlKChjaGFyKikgKG1pbmltdW1jdXRDb25uZWN0aW9uXykpOwotICAgICAgICBudW1NaW5pbXVtY3V0XyA9IDA7Ci0gICAgICAgIG1pbmltdW1jdXRBbGxvY2F0ZWRfID0gMDsKLSAgICB9Ci0gICAgbWF4d2lkdGhfID0gLTE7Ci0gICAgbWlud2lkdGhfID0gLTE7Ci0gICAgaWYgKG51bU1pbmVuY2xvc2VkYXJlYV8gPiAwKSB7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAobWluZW5jbG9zZWRhcmVhXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKG1pbmVuY2xvc2VkYXJlYVdpZHRoXykpOwotICAgICAgICBudW1NaW5lbmNsb3NlZGFyZWFfID0gMDsKLSAgICAgICAgbWluZW5jbG9zZWRhcmVhQWxsb2NhdGVkXyA9IDA7Ci0gICAgfQotICAgIGlmIChudW1NaW5zdGVwQWxsb2NfID4gMCkgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTWluc3RlcF87IGkrKykgeyAvLyA1LjYKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAobWluc3RlcFR5cGVfW2ldKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChtaW5zdGVwXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKG1pbnN0ZXBUeXBlXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKG1pbnN0ZXBMZW5ndGhzdW1fKSk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAobWluc3RlcE1heEVkZ2VzXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKG1pbnN0ZXBNaW5BZGpMZW5ndGhfKSk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAobWluc3RlcE1pbkJldExlbmd0aF8pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChtaW5zdGVwWFNhbWVDb3JuZXJzXykpOwotICAgIH0KLSAgICBudW1NaW5zdGVwQWxsb2NfID0gMDsKLSAgICBudW1NaW5zdGVwXyA9IDA7Ci0gICAgcHJvdHJ1c2lvbldpZHRoMV8gPSAtMTsKLSAgICBwcm90cnVzaW9uTGVuZ3RoXyA9IC0xOwotICAgIHByb3RydXNpb25XaWR0aDJfID0gLTE7Ci0gICAgaWYgKG51bVNwYWNpbmdUYWJsZV8pIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVNwYWNpbmdUYWJsZV87IGkrKykgewotICAgICAgICAgICAgc3AgPSBzcGFjaW5nVGFibGVfW2ldOwotICAgICAgICAgICAgc3AtPkRlc3Ryb3koKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSBzcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbnVtU3BhY2luZ1RhYmxlXyA9IDA7Ci0gICAgc3BhY2luZ1RhYmxlQWxsb2NhdGVkXyA9IDA7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQW50ZW5uYU1vZGVsXzsgaSsrKSB7ICAvLyA1LjUKLSAgICAgICAgYU8gPSBhbnRlbm5hTW9kZWxfW2ldOwotICAgICAgICBhTy0+RGVzdHJveSgpOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgYW50ZW5uYU1vZGVsQWxsb2NhdGVkXzsgaSsrKSB7IC8vIDUuNQotICAgICAgICBsZWZGcmVlKChjaGFyKikgYW50ZW5uYU1vZGVsX1tpXSk7Ci0gICAgfQotCi0gICAgaWYgKGFudGVubmFNb2RlbF8pICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS41Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoYW50ZW5uYU1vZGVsXykpOwotICAgIGFudGVubmFNb2RlbF8gPSAwOwotICAgIGN1cnJlbnRBbnRlbm5hTW9kZWxfID0gMDsKLSAgICBudW1BbnRlbm5hTW9kZWxfID0gMDsKLSAgICBhbnRlbm5hTW9kZWxBbGxvY2F0ZWRfID0gMDsKLQotICAgIGlmIChudW1zXykKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChudW1zXykpOwotCi0gICAgLy8gNS42Ci0gICAgaWYgKG51bUVuY2xvc3VyZV8pIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUVuY2xvc3VyZV87IGkrKykgewotICAgICAgICAgICAgaWYgKGVuY2xvc3VyZVJ1bGVzX1tpXSkKLSAgICAgICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKGVuY2xvc3VyZVJ1bGVzX1tpXSkpOwotICAgICAgICB9Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoZW5jbG9zdXJlUnVsZXNfKSk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAob3ZlcmhhbmcxXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKG92ZXJoYW5nMl8pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChlbmNtaW5XaWR0aF8pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChjdXRXaXRoaW5fKSk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAobWluTGVuZ3RoXykpOwotICAgICAgICBudW1FbmNsb3N1cmVfID0gMDsKLSAgICAgICAgZW5jbG9zdXJlQWxsb2NhdGVkXyA9IDA7Ci0gICAgfQotICAgIGlmIChudW1QcmVmZXJFbmNsb3N1cmVfKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1QcmVmZXJFbmNsb3N1cmVfOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChwcmVmZXJFbmNsb3N1cmVSdWxlc19baV0pCi0gICAgICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChwcmVmZXJFbmNsb3N1cmVSdWxlc19baV0pKTsKLSAgICAgICAgfQotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHByZWZlckVuY2xvc3VyZVJ1bGVzXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHByZWZlck92ZXJoYW5nMV8pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChwcmVmZXJPdmVyaGFuZzJfKSk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAocHJlZmVyTWluV2lkdGhfKSk7Ci0gICAgICAgIG51bVByZWZlckVuY2xvc3VyZV8gPSAwOwotICAgICAgICBwcmVmZXJFbmNsb3N1cmVBbGxvY2F0ZWRfID0gMDsKLSAgICB9Ci0gICAgcmVzUGVyQ3V0XyA9IDA7Ci0gICAgZGlhZ01pbkVkZ2VMZW5ndGhfID0gMDsKLSAgICBpZiAobnVtTWluU2l6ZV8pIHsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChtaW5TaXplV2lkdGhfKSk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAobWluU2l6ZUxlbmd0aF8pKTsKLSAgICAgICAgbnVtTWluU2l6ZV8gPSAwOwotICAgIH0KLSAgICBtYXhBcmVhXyA9IDA7Ci0gICAgaGFzTG9uZ0FycmF5XyA9IDA7Ci0gICAgdmlhV2lkdGhfID0gMDsKLSAgICBjdXRTcGFjaW5nXyA9IDA7Ci0gICAgaWYgKG51bUFycmF5Q3V0c18pIHsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChhcnJheUN1dHNfKSk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoYXJyYXlTcGFjaW5nc18pKTsKLSAgICB9Ci0gICAgYXJyYXlDdXRzXyA9IDA7Ci0gICAgYXJyYXlTcGFjaW5nc18gPSAwOwotICAgIGFycmF5Q3V0c0FsbG9jYXRlZF8gPSAwOwotICAgIG51bUFycmF5Q3V0c18gPSAwOwotCi0gICAgLy8gNS43Ci0gICAgaWYgKGhhc1NwYWNpbmdUYWJsZU9ydGhvXykgewotICAgICAgICBzcGFjaW5nVGFibGVPcnRob18tPkRlc3Ryb3koKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChzcGFjaW5nVGFibGVPcnRob18pKTsKLSAgICB9Ci0gICAgaGFzU3BhY2luZ1RhYmxlT3J0aG9fID0gMDsKLX0KLQotCi12b2lkCi1sZWZpTGF5ZXI6OnNldE5hbWUoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLSAgICBjbGVhcigpOwotICAgIGlmIChsZW4gPiBuYW1lU2l6ZV8pIHsKLSAgICAgICAgbGVmRnJlZShuYW1lXyk7Ci0gICAgICAgIG5hbWVfID0gKGNoYXIqKSBsZWZNYWxsb2MobGVuKTsKLSAgICAgICAgbmFtZVNpemVfID0gbGVuOwotICAgIH0KLSAgICBzdHJjcHkobmFtZV8sIENBU0UobmFtZSkpOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OnNldFR5cGUoY29uc3QgY2hhciAqdHlwKQotewotICAgIGludCBsZW4gPSBzdHJsZW4odHlwKSArIDE7Ci0gICAgaWYgKGxlbiA+IHR5cGVTaXplXykgewotICAgICAgICBsZWZGcmVlKHR5cGVfKTsKLSAgICAgICAgdHlwZV8gPSAoY2hhciopIGxlZk1hbGxvYyhsZW4pOwotICAgICAgICB0eXBlU2l6ZV8gPSBsZW47Ci0gICAgfQotICAgIHN0cmNweSh0eXBlXywgQ0FTRSh0eXApKTsKLX0KLQotLy8gNS44Ci12b2lkCi1sZWZpTGF5ZXI6OnNldExheWVyVHlwZShjb25zdCBjaGFyICpsYXllclR5cGUpCi17Ci0gICAgaWYgKGxheWVyVHlwZV8pCi0gICAgICAgIGxlZkZyZWUobGF5ZXJUeXBlXyk7Ci0gICAgbGF5ZXJUeXBlXyA9IHN0cmR1cChsYXllclR5cGUpOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OnNldFBpdGNoKGRvdWJsZSBudW0pCi17Ci0gICAgaGFzUGl0Y2hfID0gMTsKLSAgICBwaXRjaFhfID0gbnVtOwotICAgIHBpdGNoWV8gPSAtMTsKLX0KLQotLy8gNS42Ci12b2lkCi1sZWZpTGF5ZXI6OnNldFBpdGNoWFkoZG91YmxlICAgIHhkaXN0LAotICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICB5ZGlzdCkKLXsKLSAgICBoYXNQaXRjaF8gPSAyOyAgICAgICAgICAgICAvLyAyIG1lYW5zIGl0IGhhcyBYICYgWSB2YWx1ZXMKLSAgICBwaXRjaFhfID0geGRpc3Q7Ci0gICAgcGl0Y2hZXyA9IHlkaXN0OwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OnNldE1hc2soaW50IG51bSkKLXsKLSAgICBoYXNNYXNrXyA9IDE7Ci0gICAgbWFza051bWJlcl8gPSBudW07Ci19Ci0KLXZvaWQKLWxlZmlMYXllcjo6c2V0T2Zmc2V0KGRvdWJsZSBudW0pCi17Ci0gICAgaGFzT2Zmc2V0XyA9IDE7Ci0gICAgb2Zmc2V0WF8gPSBudW07Ci0gICAgb2Zmc2V0WV8gPSAtMTsKLX0KLQotLy8gNS42Ci12b2lkCi1sZWZpTGF5ZXI6OnNldE9mZnNldFhZKGRvdWJsZSAgIHhkaXN0LAotICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICB5ZGlzdCkKLXsKLSAgICBoYXNPZmZzZXRfID0gMjsgICAgICAgICAgICAgLy8gMiBtZWFucyBpdCBoYXMgWCAmIFkgdmFsdWVzCi0gICAgb2Zmc2V0WF8gPSB4ZGlzdDsKLSAgICBvZmZzZXRZXyA9IHlkaXN0OwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OnNldFdpZHRoKGRvdWJsZSBudW0pCi17Ci0gICAgaGFzV2lkdGhfID0gMTsKLSAgICB3aWR0aF8gPSBudW07Ci19Ci0KLXZvaWQKLWxlZmlMYXllcjo6c2V0QXJlYShkb3VibGUgbnVtKQotewotICAgIGhhc0FyZWFfID0gMTsKLSAgICBhcmVhXyA9IG51bTsKLX0KLQotLy8gNS42Ci12b2lkCi1sZWZpTGF5ZXI6OnNldERpYWdQaXRjaChkb3VibGUgZGlzdCkKLXsKLSAgICBoYXNEaWFnUGl0Y2hfID0gMTsKLSAgICBkaWFnUGl0Y2hYXyA9IGRpc3Q7Ci0gICAgZGlhZ1BpdGNoWV8gPSAtMTsKLX0KLQotLy8gNS42Ci12b2lkCi1sZWZpTGF5ZXI6OnNldERpYWdQaXRjaFhZKGRvdWJsZSAgICB4ZGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgIHlkaXN0KQotewotICAgIGhhc0RpYWdQaXRjaF8gPSAyOwotICAgIGRpYWdQaXRjaFhfID0geGRpc3Q7Ci0gICAgZGlhZ1BpdGNoWV8gPSB5ZGlzdDsKLX0KLQotLy8gNS42Ci12b2lkCi1sZWZpTGF5ZXI6OnNldERpYWdXaWR0aChkb3VibGUgd2lkdGgpCi17Ci0gICAgaGFzRGlhZ1dpZHRoXyA9IDE7Ci0gICAgZGlhZ1dpZHRoXyA9IHdpZHRoOwotfQotCi0vLyA1LjYKLXZvaWQKLWxlZmlMYXllcjo6c2V0RGlhZ1NwYWNpbmcoZG91YmxlIHNwYWNpbmcpCi17Ci0gICAgaGFzRGlhZ1NwYWNpbmdfID0gMTsKLSAgICBkaWFnU3BhY2luZ18gPSBzcGFjaW5nOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OnNldFdpcmVFeHRlbnNpb24oZG91YmxlIG51bSkKLXsKLSAgICBoYXNXaXJlRXh0ZW5zaW9uXyA9IDE7Ci0gICAgd2lyZUV4dGVuc2lvbl8gPSBudW07Ci19Ci0KLS8vIDUuNQotdm9pZAotbGVmaUxheWVyOjpzZXRNYXh3aWR0aChkb3VibGUgd2lkdGgpCi17Ci0gICAgbWF4d2lkdGhfID0gd2lkdGg7Ci19Ci0KLS8vIDUuNQotdm9pZAotbGVmaUxheWVyOjpzZXRNaW53aWR0aChkb3VibGUgd2lkdGgpCi17Ci0gICAgbWlud2lkdGhfID0gd2lkdGg7Ci19Ci0KLS8vIDUuNQotdm9pZAotbGVmaUxheWVyOjphZGRNaW5lbmNsb3NlZGFyZWEoZG91YmxlIGFyZWEpCi17Ci0gICAgaWYgKG51bU1pbmVuY2xvc2VkYXJlYV8gPT0gbWluZW5jbG9zZWRhcmVhQWxsb2NhdGVkXykgewotICAgICAgICBkb3VibGUgICpuYTsKLSAgICAgICAgZG91YmxlICAqbnc7Ci0gICAgICAgIGludCAgICAgaSwgbGltOwotCi0gICAgICAgIGlmIChtaW5lbmNsb3NlZGFyZWFBbGxvY2F0ZWRfID09IDApIHsKLSAgICAgICAgICAgIGxpbSA9IG1pbmVuY2xvc2VkYXJlYUFsbG9jYXRlZF8gPSAyOwotICAgICAgICAgICAgbmEgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGltKTsKLSAgICAgICAgICAgIG53ID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGxpbSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsaW0gPSBtaW5lbmNsb3NlZGFyZWFBbGxvY2F0ZWRfICogMjsKLSAgICAgICAgICAgIG1pbmVuY2xvc2VkYXJlYUFsbG9jYXRlZF8gPSBsaW07Ci0gICAgICAgICAgICBuYSA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBsaW0pOwotICAgICAgICAgICAgbncgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGltKTsKLSAgICAgICAgICAgIGxpbSAvPSAyOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbmFbaV0gPSBtaW5lbmNsb3NlZGFyZWFfW2ldOwotICAgICAgICAgICAgICAgIG53W2ldID0gbWluZW5jbG9zZWRhcmVhV2lkdGhfW2ldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChtaW5lbmNsb3NlZGFyZWFfKSk7Ci0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKG1pbmVuY2xvc2VkYXJlYVdpZHRoXykpOwotICAgICAgICB9Ci0gICAgICAgIG1pbmVuY2xvc2VkYXJlYV8gPSBuYTsKLSAgICAgICAgbWluZW5jbG9zZWRhcmVhV2lkdGhfID0gbnc7Ci0gICAgfQotICAgIG1pbmVuY2xvc2VkYXJlYV9bbnVtTWluZW5jbG9zZWRhcmVhX10gPSBhcmVhOwotICAgIG1pbmVuY2xvc2VkYXJlYVdpZHRoX1tudW1NaW5lbmNsb3NlZGFyZWFfXSA9IC0xOwotICAgIG51bU1pbmVuY2xvc2VkYXJlYV8gKz0gMTsKLX0KLQotLy8gNS41Ci12b2lkCi1sZWZpTGF5ZXI6OmFkZE1pbmVuY2xvc2VkYXJlYVdpZHRoKGRvdWJsZSB3aWR0aCkKLXsKLSAgICBtaW5lbmNsb3NlZGFyZWFXaWR0aF9bbnVtTWluZW5jbG9zZWRhcmVhXyAtIDFdID0gd2lkdGg7Ci19Ci0KLS8vIDUuNQotdm9pZAotbGVmaUxheWVyOjphZGRNaW5pbXVtY3V0KGludCAgICBtaW5jdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHdpZHRoKQotewotICAgIGlmIChudW1NaW5pbXVtY3V0XyA9PSBtaW5pbXVtY3V0QWxsb2NhdGVkXykgewotICAgICAgICBpbnQgICAgICpuYzsKLSAgICAgICAgZG91YmxlICAqbnc7Ci0gICAgICAgIGludCAgICAgKmhjZDsKLSAgICAgICAgZG91YmxlICAqbmNkOwotICAgICAgICBpbnQgICAgICpobTsKLSAgICAgICAgY2hhciAgICAqKm51ZDsKLSAgICAgICAgaW50ICAgICAqaGM7Ci0gICAgICAgIGRvdWJsZSAgKm5sOwotICAgICAgICBkb3VibGUgICpuZDsKLSAgICAgICAgaW50ICAgICBpLCBsaW07Ci0KLSAgICAgICAgaWYgKG1pbmltdW1jdXRBbGxvY2F0ZWRfID09IDApIHsKLSAgICAgICAgICAgIGxpbSA9IG1pbmltdW1jdXRBbGxvY2F0ZWRfID0gMjsKLSAgICAgICAgICAgIG5jID0gKGludCopIGxlZk1hbGxvYyhzaXplb2YoaW50KSAqIGxpbSk7Ci0gICAgICAgICAgICBudyA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBsaW0pOwotICAgICAgICAgICAgaGNkID0gKGludCopIGxlZk1hbGxvYyhzaXplb2YoaW50KSAqIGxpbSk7Ci0gICAgICAgICAgICBuY2QgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGltKTsKLSAgICAgICAgICAgIGhtID0gKGludCopIGxlZk1hbGxvYyhzaXplb2YoaW50KSAqIGxpbSk7Ci0gICAgICAgICAgICBudWQgPSAoY2hhcioqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIqKSAqIGxpbSk7Ci0gICAgICAgICAgICBoYyA9IChpbnQqKSBsZWZNYWxsb2Moc2l6ZW9mKGludCkgKiBsaW0pOwotICAgICAgICAgICAgbmwgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGltKTsKLSAgICAgICAgICAgIG5kID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGxpbSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsaW0gPSBtaW5pbXVtY3V0QWxsb2NhdGVkXyAqIDI7Ci0gICAgICAgICAgICBtaW5pbXVtY3V0QWxsb2NhdGVkXyA9IGxpbTsKLSAgICAgICAgICAgIG5jID0gKGludCopIGxlZk1hbGxvYyhzaXplb2YoaW50KSAqIGxpbSk7Ci0gICAgICAgICAgICBudyA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBsaW0pOwotICAgICAgICAgICAgaGNkID0gKGludCopIGxlZk1hbGxvYyhzaXplb2YoaW50KSAqIGxpbSk7Ci0gICAgICAgICAgICBuY2QgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGltKTsKLSAgICAgICAgICAgIGhtID0gKGludCopIGxlZk1hbGxvYyhzaXplb2YoaW50KSAqIGxpbSk7Ci0gICAgICAgICAgICBudWQgPSAoY2hhcioqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIqKSAqIGxpbSk7Ci0gICAgICAgICAgICBoYyA9IChpbnQqKSBsZWZNYWxsb2Moc2l6ZW9mKGludCkgKiBsaW0pOwotICAgICAgICAgICAgbmwgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGltKTsKLSAgICAgICAgICAgIG5kID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGxpbSk7Ci0gICAgICAgICAgICBsaW0gLz0gMjsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW07IGkrKykgewotICAgICAgICAgICAgICAgIG5jW2ldID0gbWluaW11bWN1dF9baV07Ci0gICAgICAgICAgICAgICAgbndbaV0gPSBtaW5pbXVtY3V0V2lkdGhfW2ldOwotICAgICAgICAgICAgICAgIGhjZFtpXSA9IGhhc01pbmltdW1jdXRXaXRoaW5fW2ldOwotICAgICAgICAgICAgICAgIG5jZFtpXSA9IG1pbmltdW1jdXRXaXRoaW5fW2ldOwotICAgICAgICAgICAgICAgIGhtW2ldID0gaGFzTWluaW11bWN1dENvbm5lY3Rpb25fW2ldOwotICAgICAgICAgICAgICAgIG51ZFtpXSA9IG1pbmltdW1jdXRDb25uZWN0aW9uX1tpXTsKLSAgICAgICAgICAgICAgICBoY1tpXSA9IGhhc01pbmltdW1jdXROdW1DdXRzX1tpXTsKLSAgICAgICAgICAgICAgICBubFtpXSA9IG1pbmltdW1jdXRMZW5ndGhfW2ldOwotICAgICAgICAgICAgICAgIG5kW2ldID0gbWluaW11bWN1dERpc3RhbmNlX1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAobWluaW11bWN1dF8pKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAobWluaW11bWN1dFdpZHRoXykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChoYXNNaW5pbXVtY3V0V2l0aGluXykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChtaW5pbXVtY3V0V2l0aGluXykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChoYXNNaW5pbXVtY3V0Q29ubmVjdGlvbl8pKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAobWluaW11bWN1dENvbm5lY3Rpb25fKSk7Ci0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKGhhc01pbmltdW1jdXROdW1DdXRzXykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChtaW5pbXVtY3V0TGVuZ3RoXykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChtaW5pbXVtY3V0RGlzdGFuY2VfKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbWluaW11bWN1dF8gPSBuYzsKLSAgICAgICAgbWluaW11bWN1dFdpZHRoXyA9IG53OwotICAgICAgICBoYXNNaW5pbXVtY3V0V2l0aGluXyA9IGhjZDsKLSAgICAgICAgbWluaW11bWN1dFdpdGhpbl8gPSBuY2Q7Ci0gICAgICAgIGhhc01pbmltdW1jdXRDb25uZWN0aW9uXyA9IGhtOwotICAgICAgICBtaW5pbXVtY3V0Q29ubmVjdGlvbl8gPSBudWQ7Ci0gICAgICAgIGhhc01pbmltdW1jdXROdW1DdXRzXyA9IGhjOwotICAgICAgICBtaW5pbXVtY3V0TGVuZ3RoXyA9IG5sOwotICAgICAgICBtaW5pbXVtY3V0RGlzdGFuY2VfID0gbmQ7Ci0gICAgfQotICAgIG1pbmltdW1jdXRfW251bU1pbmltdW1jdXRfXSA9IG1pbmN1dDsKLSAgICBtaW5pbXVtY3V0V2lkdGhfW251bU1pbmltdW1jdXRfXSA9IHdpZHRoOwotICAgIGhhc01pbmltdW1jdXRXaXRoaW5fW251bU1pbmltdW1jdXRfXSA9IDA7Ci0gICAgbWluaW11bWN1dFdpdGhpbl9bbnVtTWluaW11bWN1dF9dID0gMDsKLSAgICBoYXNNaW5pbXVtY3V0Q29ubmVjdGlvbl9bbnVtTWluaW11bWN1dF9dID0gMDsKLSAgICBtaW5pbXVtY3V0Q29ubmVjdGlvbl9bbnVtTWluaW11bWN1dF9dID0gMDsKLSAgICBoYXNNaW5pbXVtY3V0TnVtQ3V0c19bbnVtTWluaW11bWN1dF9dID0gMDsKLSAgICBtaW5pbXVtY3V0TGVuZ3RoX1tudW1NaW5pbXVtY3V0X10gPSAwOwotICAgIG1pbmltdW1jdXREaXN0YW5jZV9bbnVtTWluaW11bWN1dF9dID0gMDsKLSAgICBudW1NaW5pbXVtY3V0XyArPSAxOwotfQotCi0vLyA1LjcKLXZvaWQKLWxlZmlMYXllcjo6YWRkTWluaW11bWN1dFdpdGhpbihkb3VibGUgY3V0RGlzdGFuY2UpCi17Ci0gICAgaGFzTWluaW11bWN1dFdpdGhpbl9bbnVtTWluaW11bWN1dF8gLSAxXSA9IDE7Ci0gICAgbWluaW11bWN1dFdpdGhpbl9bbnVtTWluaW11bWN1dF8gLSAxXSA9IGN1dERpc3RhbmNlOwotfQotCi0vLyA1LjUKLXZvaWQKLWxlZmlMYXllcjo6YWRkTWluaW11bWN1dENvbm5lY3QoY29uc3QgY2hhciAqY29ubmVjdFR5cGUpCi17Ci0gICAgaWYgKGNvbm5lY3RUeXBlICYmIChzdHJjbXAoY29ubmVjdFR5cGUsICIiKSAhPSAwKSkgewotICAgICAgICBoYXNNaW5pbXVtY3V0Q29ubmVjdGlvbl9bbnVtTWluaW11bWN1dF8gLSAxXSA9IDE7Ci0gICAgICAgIG1pbmltdW1jdXRDb25uZWN0aW9uX1tudW1NaW5pbXVtY3V0XyAtIDFdID0KLSAgICAgICAgICAgIHN0cmR1cChjb25uZWN0VHlwZSk7Ci0gICAgfQotfQotCi0vLyA1LjUKLXZvaWQKLWxlZmlMYXllcjo6YWRkTWluaW11bWN1dExlbmdEaXMoZG91YmxlICBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgd2lkdGgpCi17Ci0gICAgaGFzTWluaW11bWN1dE51bUN1dHNfW251bU1pbmltdW1jdXRfIC0gMV0gPSAxOwotICAgIG1pbmltdW1jdXRMZW5ndGhfW251bU1pbmltdW1jdXRfIC0gMV0gPSBsZW5ndGg7Ci0gICAgbWluaW11bWN1dERpc3RhbmNlX1tudW1NaW5pbXVtY3V0XyAtIDFdID0gd2lkdGg7Ci19Ci0KLS8vIDUuNSwgNS42IHN3aXRjaGVkIHRvIG11bHRpcGxlCi12b2lkCi1sZWZpTGF5ZXI6OmFkZE1pbnN0ZXAoZG91YmxlIGRpc3RhbmNlKQotewotICAgIGRvdWJsZSAgKm1zOwotICAgIGNoYXIgICAgKiptdDsKLSAgICBkb3VibGUgICptbDsKLSAgICBpbnQgICAgICptZTsKLSAgICBkb3VibGUgICptYTsKLSAgICBkb3VibGUgICptYjsKLSAgICBpbnQgICAgICpteDsKLSAgICBpbnQgICAgIGk7Ci0KLSAgICBpZiAobnVtTWluc3RlcF8gPT0gbnVtTWluc3RlcEFsbG9jXykgewotICAgICAgICBpbnQgbGVuOwotICAgICAgICBpZiAobnVtTWluc3RlcEFsbG9jXyA9PSAwKSB7Ci0gICAgICAgICAgICBsZW4gPSBudW1NaW5zdGVwQWxsb2NfID0gMjsKLSAgICAgICAgICAgIG1zID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGxlbik7Ci0gICAgICAgICAgICBtdCA9IChjaGFyKiopIGxlZk1hbGxvYyhzaXplb2YoY2hhciopICogbGVuKTsKLSAgICAgICAgICAgIG1sID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGxlbik7Ci0gICAgICAgICAgICBtZSA9IChpbnQqKSBsZWZNYWxsb2Moc2l6ZW9mKGludCkgKiBsZW4pOwotICAgICAgICAgICAgbWEgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGVuKTsKLSAgICAgICAgICAgIG1iID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGxlbik7Ci0gICAgICAgICAgICBteCA9IChpbnQqKSBsZWZNYWxsb2Moc2l6ZW9mKGludCkgKiBsZW4pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGVuID0gbnVtTWluc3RlcEFsbG9jXyAqPSAyOwotICAgICAgICAgICAgbXMgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGVuKTsKLSAgICAgICAgICAgIG10ID0gKGNoYXIqKikgbGVmTWFsbG9jKHNpemVvZihjaGFyKikgKiBsZW4pOwotICAgICAgICAgICAgbWwgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGVuKTsKLSAgICAgICAgICAgIG1lID0gKGludCopIGxlZk1hbGxvYyhzaXplb2YoaW50KSAqIGxlbik7Ci0gICAgICAgICAgICBtYSA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBsZW4pOwotICAgICAgICAgICAgbWIgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGVuKTsKLSAgICAgICAgICAgIG14ID0gKGludCopIGxlZk1hbGxvYyhzaXplb2YoaW50KSAqIGxlbik7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1NaW5zdGVwXzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbXNbaV0gPSBtaW5zdGVwX1tpXTsKLSAgICAgICAgICAgICAgICBtdFtpXSA9IG1pbnN0ZXBUeXBlX1tpXTsKLSAgICAgICAgICAgICAgICBtbFtpXSA9IG1pbnN0ZXBMZW5ndGhzdW1fW2ldOwotICAgICAgICAgICAgICAgIG1lW2ldID0gbWluc3RlcE1heEVkZ2VzX1tpXTsKLSAgICAgICAgICAgICAgICBtYVtpXSA9IG1pbnN0ZXBNaW5BZGpMZW5ndGhfW2ldOwotICAgICAgICAgICAgICAgIG1iW2ldID0gbWluc3RlcE1pbkJldExlbmd0aF9baV07Ci0gICAgICAgICAgICAgICAgbXhbaV0gPSBtaW5zdGVwWFNhbWVDb3JuZXJzX1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAobWluc3RlcF8pKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAobWluc3RlcFR5cGVfKSk7Ci0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKG1pbnN0ZXBMZW5ndGhzdW1fKSk7Ci0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKG1pbnN0ZXBNYXhFZGdlc18pKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAobWluc3RlcE1pbkFkakxlbmd0aF8pKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAobWluc3RlcE1pbkJldExlbmd0aF8pKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAobWluc3RlcFhTYW1lQ29ybmVyc18pKTsKLSAgICAgICAgfQotICAgICAgICBtaW5zdGVwXyA9IG1zOwotICAgICAgICBtaW5zdGVwVHlwZV8gPSBtdDsKLSAgICAgICAgbWluc3RlcExlbmd0aHN1bV8gPSBtbDsKLSAgICAgICAgbWluc3RlcE1heEVkZ2VzXyA9IG1lOwotICAgICAgICBtaW5zdGVwTWluQWRqTGVuZ3RoXyA9IG1hOwotICAgICAgICBtaW5zdGVwTWluQmV0TGVuZ3RoXyA9IG1iOwotICAgICAgICBtaW5zdGVwWFNhbWVDb3JuZXJzXyA9IG14OwotICAgIH0KLSAgICBtaW5zdGVwX1tudW1NaW5zdGVwX10gPSBkaXN0YW5jZTsKLSAgICBtaW5zdGVwVHlwZV9bbnVtTWluc3RlcF9dID0gMDsKLSAgICBtaW5zdGVwTGVuZ3Roc3VtX1tudW1NaW5zdGVwX10gPSAtMTsKLSAgICBtaW5zdGVwTWF4RWRnZXNfW251bU1pbnN0ZXBfXSA9IC0xOwotICAgIG1pbnN0ZXBNaW5BZGpMZW5ndGhfW251bU1pbnN0ZXBfXSA9IC0xOwotICAgIG1pbnN0ZXBNaW5CZXRMZW5ndGhfW251bU1pbnN0ZXBfXSA9IC0xOwotICAgIG1pbnN0ZXBYU2FtZUNvcm5lcnNfW251bU1pbnN0ZXBfXSA9IC0xOwotICAgIG51bU1pbnN0ZXBfICs9IDE7Ci19Ci0KLS8vIDUuNgotdm9pZAotbGVmaUxheWVyOjphZGRNaW5zdGVwVHlwZShjaGFyICp0eXBlKQotewotICAgIG1pbnN0ZXBUeXBlX1tudW1NaW5zdGVwXyAtIDFdID0gc3RyZHVwKHR5cGUpOwotfQotCi0vLyA1LjYKLXZvaWQKLWxlZmlMYXllcjo6YWRkTWluc3RlcExlbmd0aHN1bShkb3VibGUgbWF4TGVuZ3RoKQotewotICAgIG1pbnN0ZXBMZW5ndGhzdW1fW251bU1pbnN0ZXBfIC0gMV0gPSBtYXhMZW5ndGg7Ci19Ci0KLS8vIDUuNwotdm9pZAotbGVmaUxheWVyOjphZGRNaW5zdGVwTWF4ZWRnZXMoaW50IG1heEVkZ2VzKQotewotICAgIG1pbnN0ZXBNYXhFZGdlc19bbnVtTWluc3RlcF8gLSAxXSA9IG1heEVkZ2VzOwotfQotCi0vLyA1LjcKLXZvaWQKLWxlZmlMYXllcjo6YWRkTWluc3RlcE1pbkFkakxlbmd0aChkb3VibGUgYWRqTGVuZ3RoKQotewotICAgIG1pbnN0ZXBNaW5BZGpMZW5ndGhfW251bU1pbnN0ZXBfIC0gMV0gPSBhZGpMZW5ndGg7Ci19Ci0KLS8vIDUuNwotdm9pZAotbGVmaUxheWVyOjphZGRNaW5zdGVwTWluQmV0TGVuZ3RoKGRvdWJsZSBiZXRMZW5ndGgpCi17Ci0gICAgbWluc3RlcE1pbkJldExlbmd0aF9bbnVtTWluc3RlcF8gLSAxXSA9IGJldExlbmd0aDsKLX0KLQotLy8gNS43Ci12b2lkCi1sZWZpTGF5ZXI6OmFkZE1pbnN0ZXBYU2FtZUNvcm5lcnMoKQotewotICAgIG1pbnN0ZXBYU2FtZUNvcm5lcnNfW251bU1pbnN0ZXBfIC0gMV0gPSAxOwotfQotCi0vLyA1LjUKLXZvaWQKLWxlZmlMYXllcjo6c2V0UHJvdHJ1c2lvbihkb3VibGUgd2lkdGgxLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHdpZHRoMikKLXsKLSAgICBwcm90cnVzaW9uV2lkdGgxXyA9IHdpZHRoMTsKLSAgICBwcm90cnVzaW9uTGVuZ3RoXyA9IGxlbmd0aDsKLSAgICBwcm90cnVzaW9uV2lkdGgyXyA9IHdpZHRoMjsKLX0KLQotLy8gd21kIC0tIHBjciAyODI3OTksIG5lZWQgdG8gbWFrZSBsZWZ0XywgcmlnaHRfIGFzIGFycmF5cwotLy8gd2hlbiBidW1waW5nIHRvIG5ldyBsaXN0LCBuZWVkIHRvIGNvcHkgYWxzbyBoYXNVc2VMZW5ndGhUaHJlc2hvbGRfCi0vLyBhbmQgbGVuZ3RoVGhyZXNob2xkXwotdm9pZAotbGVmaUxheWVyOjpzZXRTcGFjaW5nTWluKGRvdWJsZSBkaXN0KQotewotICAgIGlmIChudW1TcGFjaW5nc18gPT0gc3BhY2luZ3NBbGxvY2F0ZWRfKSB7Ci0gICAgICAgIGRvdWJsZSAgKm5kOwotICAgICAgICBjaGFyICAgICoqbm47ICAgICAgICAgICAgIC8vIEFsc28gc2V0IHVwIHRoZSBzcGFjaW5nIG5hbWUKLSAgICAgICAgaW50ICAgICAqbnNuOyAgICAgICAgICAgLy8gaGFzU3BhY2luZ05hbWVfCi0gICAgICAgIGludCAgICAgKm5zczsgICAgICAgICAgIC8vIGhhc1NwYWNpbmdMYXllclN0YWNrXwotICAgICAgICBpbnQgICAgICpuc2E7ICAgICAgICAgICAvLyBoYXNTcGFjaW5nQWRqYWNlbnRfCi0gICAgICAgIGludCAgICAgKm5yOyAgICAgICAgICAgIC8vIGhhc1NwYWNpbmdSYW5nZV8KLSAgICAgICAgaW50ICAgICAqbmFjOyAgICAgICAgICAgLy8gYWRqYWNlbnRDdXRzXwotICAgICAgICBpbnQgICAgICpuY2M7ICAgICAgICAgICAvLyBoYXNDZW50ZXJUb0NlbnRlcl8KLSAgICAgICAgaW50ICAgICAqaHBvOyAgICAgICAgICAgLy8gaGFzU3BhY2luZ1BhcmFsbGVsT3ZlcmxhcF8KLSAgICAgICAgaW50ICAgICAqaGVvbDsgICAgICAgICAgLy8gaGFzU3BhY2luZ0VuZE9mTGluZV8KLSAgICAgICAgZG91YmxlICAqbndkLCAqbnduOyAgICAgLy8gZW9sV2lkdGhfLCBlb2xXaXRoaW5fCi0gICAgICAgIGRvdWJsZSAgKm50bDsgICAgICAgICAgIC8vIG5vdGNoTGVuZ3RoXwotICAgICAgICBkb3VibGUgICplb247ICAgICAgICAgICAvLyBlbmRPZk5vdGNoV2lkdGhfCi0gICAgICAgIGRvdWJsZSAgKm50czsgICAgICAgICAgIC8vIG1pbk5vdGNoU3BhY2luZ18KLSAgICAgICAgZG91YmxlICAqZW9ubDsgICAgICAgICAgLy8gZW9ub3RjaExlbmd0aF8KLSAgICAgICAgaW50ICAgICAqaHBlOyAgICAgICAgICAgLy8gaGFzU3BhY2luZ1BhcmVsbGVsRWRnZV8KLSAgICAgICAgZG91YmxlICAqbnBzLCAqbnB3OyAgICAgLy8gcGFyU3BhY2VfLCBwYXJXaXRoaW5fCi0gICAgICAgIGludCAgICAgKmh0ZTsgICAgICAgICAgIC8vIGhhc1NwYWNpbmdUd29FZGdlc18KLSAgICAgICAgaW50ICAgICAqaGFlOyAgICAgICAgICAgLy8gaGFzU3BhY2luZ0FkamFjZW50RXhjZXB0XwotICAgICAgICBpbnQgICAgICpoc247ICAgICAgICAgICAvLyBoYXNTcGFjaW5nU2FtZW5ldF8KLSAgICAgICAgaW50ICAgICAqaHNubzsgICAgICAgICAgLy8gaGFzU3BhY2luZ1NhbWVuZXRQR29ubHlfCi0gICAgICAgIGludCAgICAgKmhjYTsgICAgICAgICAgIC8vIGhhc1NwYWNpbmdDdXRBcmVhXwotICAgICAgICBkb3VibGUgICpuY2E7ICAgICAgICAgICAvLyBzcGFjaW5nQ3V0QXJlYV8KLSAgICAgICAgZG91YmxlICAqbmF3OyAgICAgICAgICAgLy8gYWRqYWNlbnRXaXRoaW5fCi0gICAgICAgIGRvdWJsZSAgKm5ybWluLCAqbnJtYXg7IC8vIHJhbmdlTWluXywgcmFuZ2VNYXhfCi0gICAgICAgIGRvdWJsZSAgKm5yaSwgKm5yaW1pbiwgKm5yaW1heDsgLy8gcmFuZ2VJbmZsdWVuY2VfLCByYW5nZUluZmx1ZW5jZVJhbmdlTWluXywKLSAgICAgICAgLy8gcmFuZ2VJbmZsdWVuY2VSYW5nZU1heF8KLSAgICAgICAgZG91YmxlICAqbnJybWluLCAqbnJybWF4OyAgICAgICAvLyByYW5nZVJhbmdlTWluXywgcmFuZ2VSYW5nZU1heF8KLSAgICAgICAgaW50ICAgICAqaHQ7ICAgICAgICAgICAgLy8gaGFzU3BhY2luZ1VzZUxlbmd0aFRocmVzaG9sZF8KLSAgICAgICAgaW50ICAgICAqbmw7ICAgICAgICAgICAgLy8gaGFzU3BhY2luZ0xlbmd0aFRocmVzaG9sZF8KLSAgICAgICAgZG91YmxlICAqbnQsICpudG1pbiwgKm50bWF4OyAvLyBsZW5ndGhUaHJlc2hvbGRfLCBsZW5ndGhUaHJlc2hvbGRNaW5fCi0gICAgICAgIC8vIGxlbmd0aFRocmVzaG9sZE1heF8KLQotICAgICAgICBpbnQgICAgIGksIGxpbTsKLSAgICAgICAgaWYgKHNwYWNpbmdzQWxsb2NhdGVkXyA9PSAwKSB7Ci0gICAgICAgICAgICBsaW0gPSBzcGFjaW5nc0FsbG9jYXRlZF8gPSAyOwotICAgICAgICAgICAgbmQgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGltKTsKLSAgICAgICAgICAgIG5uID0gKGNoYXIqKikgbGVmTWFsbG9jKHNpemVvZihjaGFyKikgKiBsaW0pOwotICAgICAgICAgICAgbmFjID0gKGludCopIGxlZk1hbGxvYyhzaXplb2YoaW50KSAqIGxpbSk7Ci0gICAgICAgICAgICBuYXcgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGltKTsKLSAgICAgICAgICAgIG5zbiA9IChpbnQqKSBsZWZNYWxsb2Moc2l6ZW9mKGludCkgKiBsaW0pOwotICAgICAgICAgICAgbnNzID0gKGludCopIGxlZk1hbGxvYyhzaXplb2YoaW50KSAqIGxpbSk7Ci0gICAgICAgICAgICBuc2EgPSAoaW50KikgbGVmTWFsbG9jKHNpemVvZihpbnQpICogbGltKTsKLSAgICAgICAgICAgIG5jYyA9IChpbnQqKSBsZWZNYWxsb2Moc2l6ZW9mKGludCkgKiBsaW0pOwotICAgICAgICAgICAgaHBvID0gKGludCopIGxlZk1hbGxvYyhzaXplb2YoaW50KSAqIGxpbSk7Ci0gICAgICAgICAgICBoZW9sID0gKGludCopIGxlZk1hbGxvYyhzaXplb2YoaW50KSAqIGxpbSk7Ci0gICAgICAgICAgICBud2QgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGltKTsKLSAgICAgICAgICAgIG53biA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBsaW0pOwotICAgICAgICAgICAgbnRsID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGxpbSk7Ci0gICAgICAgICAgICBlb24gPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGltKTsKLSAgICAgICAgICAgIG50cyA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBsaW0pOwotICAgICAgICAgICAgZW9ubCA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBsaW0pOwotICAgICAgICAgICAgaHBlID0gKGludCopIGxlZk1hbGxvYyhzaXplb2YoaW50KSAqIGxpbSk7Ci0gICAgICAgICAgICBucHMgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGltKTsKLSAgICAgICAgICAgIG5wdyA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBsaW0pOwotICAgICAgICAgICAgaHRlID0gKGludCopIGxlZk1hbGxvYyhzaXplb2YoaW50KSAqIGxpbSk7Ci0gICAgICAgICAgICBoYWUgPSAoaW50KikgbGVmTWFsbG9jKHNpemVvZihpbnQpICogbGltKTsKLSAgICAgICAgICAgIGhzbiA9IChpbnQqKSBsZWZNYWxsb2Moc2l6ZW9mKGludCkgKiBsaW0pOwotICAgICAgICAgICAgaHNubyA9IChpbnQqKSBsZWZNYWxsb2Moc2l6ZW9mKGludCkgKiBsaW0pOwotICAgICAgICAgICAgaGNhID0gKGludCopIGxlZk1hbGxvYyhzaXplb2YoaW50KSAqIGxpbSk7Ci0gICAgICAgICAgICBuY2EgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGltKTsKLSAgICAgICAgICAgIG5yID0gKGludCopIGxlZk1hbGxvYyhzaXplb2YoaW50KSAqIGxpbSk7Ci0gICAgICAgICAgICBucm1pbiA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBsaW0pOwotICAgICAgICAgICAgbnJtYXggPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGltKTsKLSAgICAgICAgICAgIG5yaSA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBsaW0pOwotICAgICAgICAgICAgbnJpbWluID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGxpbSk7Ci0gICAgICAgICAgICBucmltYXggPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGltKTsKLSAgICAgICAgICAgIG5ycm1pbiA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBsaW0pOwotICAgICAgICAgICAgbnJybWF4ID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGxpbSk7Ci0gICAgICAgICAgICBodCA9IChpbnQqKSBsZWZNYWxsb2Moc2l6ZW9mKGludCkgKiBsaW0pOwotICAgICAgICAgICAgbmwgPSAoaW50KikgbGVmTWFsbG9jKHNpemVvZihpbnQpICogbGltKTsKLSAgICAgICAgICAgIG50ID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGxpbSk7Ci0gICAgICAgICAgICBudG1pbiA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBsaW0pOwotICAgICAgICAgICAgbnRtYXggPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGltKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxpbSA9IHNwYWNpbmdzQWxsb2NhdGVkXyAqIDI7Ci0gICAgICAgICAgICBzcGFjaW5nc0FsbG9jYXRlZF8gPSBsaW07Ci0gICAgICAgICAgICBuZCA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBsaW0pOwotICAgICAgICAgICAgbm4gPSAoY2hhcioqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIqKSAqIGxpbSk7Ci0gICAgICAgICAgICBuYWMgPSAoaW50KikgbGVmTWFsbG9jKHNpemVvZihpbnQpICogbGltKTsKLSAgICAgICAgICAgIG5hdyA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBsaW0pOwotICAgICAgICAgICAgbnNuID0gKGludCopIGxlZk1hbGxvYyhzaXplb2YoaW50KSAqIGxpbSk7Ci0gICAgICAgICAgICBuc3MgPSAoaW50KikgbGVmTWFsbG9jKHNpemVvZihpbnQpICogbGltKTsKLSAgICAgICAgICAgIG5zYSA9IChpbnQqKSBsZWZNYWxsb2Moc2l6ZW9mKGludCkgKiBsaW0pOwotICAgICAgICAgICAgbmNjID0gKGludCopIGxlZk1hbGxvYyhzaXplb2YoaW50KSAqIGxpbSk7Ci0gICAgICAgICAgICBocG8gPSAoaW50KikgbGVmTWFsbG9jKHNpemVvZihpbnQpICogbGltKTsKLSAgICAgICAgICAgIGhlb2wgPSAoaW50KikgbGVmTWFsbG9jKHNpemVvZihpbnQpICogbGltKTsKLSAgICAgICAgICAgIG53ZCA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBsaW0pOwotICAgICAgICAgICAgbnduID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGxpbSk7Ci0gICAgICAgICAgICBudGwgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGltKTsKLSAgICAgICAgICAgIGVvbiA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBsaW0pOwotICAgICAgICAgICAgbnRzID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGxpbSk7Ci0gICAgICAgICAgICBlb25sID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGxpbSk7Ci0gICAgICAgICAgICBocGUgPSAoaW50KikgbGVmTWFsbG9jKHNpemVvZihpbnQpICogbGltKTsKLSAgICAgICAgICAgIG5wcyA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBsaW0pOwotICAgICAgICAgICAgbnB3ID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGxpbSk7Ci0gICAgICAgICAgICBodGUgPSAoaW50KikgbGVmTWFsbG9jKHNpemVvZihpbnQpICogbGltKTsKLSAgICAgICAgICAgIGhhZSA9IChpbnQqKSBsZWZNYWxsb2Moc2l6ZW9mKGludCkgKiBsaW0pOwotICAgICAgICAgICAgaHNuID0gKGludCopIGxlZk1hbGxvYyhzaXplb2YoaW50KSAqIGxpbSk7Ci0gICAgICAgICAgICBoc25vID0gKGludCopIGxlZk1hbGxvYyhzaXplb2YoaW50KSAqIGxpbSk7Ci0gICAgICAgICAgICBoY2EgPSAoaW50KikgbGVmTWFsbG9jKHNpemVvZihpbnQpICogbGltKTsKLSAgICAgICAgICAgIG5jYSA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBsaW0pOwotICAgICAgICAgICAgbnIgPSAoaW50KikgbGVmTWFsbG9jKHNpemVvZihpbnQpICogbGltKTsKLSAgICAgICAgICAgIG5ybWluID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGxpbSk7Ci0gICAgICAgICAgICBucm1heCA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBsaW0pOwotICAgICAgICAgICAgbnJpID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGxpbSk7Ci0gICAgICAgICAgICBucmltaW4gPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGltKTsKLSAgICAgICAgICAgIG5yaW1heCA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBsaW0pOwotICAgICAgICAgICAgbnJybWluID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGxpbSk7Ci0gICAgICAgICAgICBucnJtYXggPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGltKTsKLSAgICAgICAgICAgIGh0ID0gKGludCopIGxlZk1hbGxvYyhzaXplb2YoaW50KSAqIGxpbSk7Ci0gICAgICAgICAgICBubCA9IChpbnQqKSBsZWZNYWxsb2Moc2l6ZW9mKGludCkgKiBsaW0pOwotICAgICAgICAgICAgbnQgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGltKTsKLSAgICAgICAgICAgIG50bWluID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGxpbSk7Ci0gICAgICAgICAgICBudG1heCA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBsaW0pOwotICAgICAgICAgICAgbGltIC89IDI7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGltOyBpKyspIHsKLSAgICAgICAgICAgICAgICBuZFtpXSA9IHNwYWNpbmdfW2ldOwotICAgICAgICAgICAgICAgIGlmIChzcGFjaW5nTmFtZV9baV0pICAvLyBpcyBudWxsIGlmIGlzIG5vdCBDVVQgbGF5ZXIKLSAgICAgICAgICAgICAgICAgICAgbm5baV0gPSBzcGFjaW5nTmFtZV9baV07Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBubltpXSA9IDA7Ci0gICAgICAgICAgICAgICAgbmFjW2ldID0gc3BhY2luZ0FkamFjZW50Q3V0c19baV07Ci0gICAgICAgICAgICAgICAgbmF3W2ldID0gc3BhY2luZ0FkamFjZW50V2l0aGluX1tpXTsKLSAgICAgICAgICAgICAgICBuc25baV0gPSBoYXNTcGFjaW5nTmFtZV9baV07Ci0gICAgICAgICAgICAgICAgbnNzW2ldID0gaGFzU3BhY2luZ0xheWVyU3RhY2tfW2ldOwotICAgICAgICAgICAgICAgIG5zYVtpXSA9IGhhc1NwYWNpbmdBZGphY2VudF9baV07Ci0gICAgICAgICAgICAgICAgbmNjW2ldID0gaGFzU3BhY2luZ0NlbnRlclRvQ2VudGVyX1tpXTsKLSAgICAgICAgICAgICAgICBocG9baV0gPSBoYXNTcGFjaW5nUGFyYWxsZWxPdmVybGFwX1tpXTsKLSAgICAgICAgICAgICAgICBud2RbaV0gPSBlb2xXaWR0aF9baV07Ci0gICAgICAgICAgICAgICAgbnduW2ldID0gZW9sV2l0aGluX1tpXTsKLSAgICAgICAgICAgICAgICBudGxbaV0gPSBub3RjaExlbmd0aF9baV07Ci0gICAgICAgICAgICAgICAgZW9uW2ldID0gZW5kT2ZOb3RjaFdpZHRoX1tpXTsKLSAgICAgICAgICAgICAgICBudHNbaV0gPSBtaW5Ob3RjaFNwYWNpbmdfW2ldOwotICAgICAgICAgICAgICAgIGVvbmxbaV0gPSBlb25vdGNoTGVuZ3RoX1tpXTsKLSAgICAgICAgICAgICAgICBoZW9sW2ldID0gaGFzU3BhY2luZ0VuZE9mTGluZV9baV07Ci0gICAgICAgICAgICAgICAgaHBlW2ldID0gaGFzU3BhY2luZ1BhcmVsbGVsRWRnZV9baV07Ci0gICAgICAgICAgICAgICAgbnBzW2ldID0gcGFyU3BhY2VfW2ldOwotICAgICAgICAgICAgICAgIG5wd1tpXSA9IHBhcldpdGhpbl9baV07Ci0gICAgICAgICAgICAgICAgaHRlW2ldID0gaGFzU3BhY2luZ1R3b0VkZ2VzX1tpXTsKLSAgICAgICAgICAgICAgICBoYWVbaV0gPSBoYXNTcGFjaW5nQWRqYWNlbnRFeGNlcHRfW2ldOwotICAgICAgICAgICAgICAgIGhzbltpXSA9IGhhc1NwYWNpbmdTYW1lbmV0X1tpXTsKLSAgICAgICAgICAgICAgICBoc25vW2ldID0gaGFzU3BhY2luZ1NhbWVuZXRQR29ubHlfW2ldOwotICAgICAgICAgICAgICAgIGhjYVtpXSA9IGhhc1NwYWNpbmdDdXRBcmVhX1tpXTsKLSAgICAgICAgICAgICAgICBuY2FbaV0gPSBzcGFjaW5nQ3V0QXJlYV9baV07Ci0gICAgICAgICAgICAgICAgbnJbaV0gPSBoYXNTcGFjaW5nUmFuZ2VfW2ldOwotICAgICAgICAgICAgICAgIG5ybWluW2ldID0gcmFuZ2VNaW5fW2ldOwotICAgICAgICAgICAgICAgIG5ybWF4W2ldID0gcmFuZ2VNYXhfW2ldOwotICAgICAgICAgICAgICAgIG5yaVtpXSA9IHJhbmdlSW5mbHVlbmNlX1tpXTsKLSAgICAgICAgICAgICAgICBucmltaW5baV0gPSByYW5nZUluZmx1ZW5jZVJhbmdlTWluX1tpXTsKLSAgICAgICAgICAgICAgICBucmltYXhbaV0gPSByYW5nZUluZmx1ZW5jZVJhbmdlTWF4X1tpXTsKLSAgICAgICAgICAgICAgICBucnJtaW5baV0gPSByYW5nZVJhbmdlTWluX1tpXTsKLSAgICAgICAgICAgICAgICBucnJtYXhbaV0gPSByYW5nZVJhbmdlTWF4X1tpXTsKLSAgICAgICAgICAgICAgICBodFtpXSA9IGhhc1NwYWNpbmdVc2VMZW5ndGhUaHJlc2hvbGRfW2ldOwotICAgICAgICAgICAgICAgIG5sW2ldID0gaGFzU3BhY2luZ0xlbmd0aFRocmVzaG9sZF9baV07Ci0gICAgICAgICAgICAgICAgbnRbaV0gPSBsZW5ndGhUaHJlc2hvbGRfW2ldOwotICAgICAgICAgICAgICAgIG50bWluW2ldID0gbGVuZ3RoVGhyZXNob2xkUmFuZ2VNaW5fW2ldOwotICAgICAgICAgICAgICAgIG50bWF4W2ldID0gbGVuZ3RoVGhyZXNob2xkUmFuZ2VNYXhfW2ldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChzcGFjaW5nXykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChzcGFjaW5nTmFtZV8pKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoc3BhY2luZ0FkamFjZW50Q3V0c18pKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoc3BhY2luZ0FkamFjZW50V2l0aGluXykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChoYXNTcGFjaW5nTmFtZV8pKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoaGFzU3BhY2luZ0xheWVyU3RhY2tfKSk7Ci0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKGhhc1NwYWNpbmdBZGphY2VudF8pKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoaGFzU3BhY2luZ1JhbmdlXykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChoYXNTcGFjaW5nQ2VudGVyVG9DZW50ZXJfKSk7Ci0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKGhhc1NwYWNpbmdQYXJhbGxlbE92ZXJsYXBfKSk7Ci0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKGhhc1NwYWNpbmdFbmRPZkxpbmVfKSk7Ci0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKGVvbFdpZHRoXykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChlb2xXaXRoaW5fKSk7Ci0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKG5vdGNoTGVuZ3RoXykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChlbmRPZk5vdGNoV2lkdGhfKSk7Ci0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKG1pbk5vdGNoU3BhY2luZ18pKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoZW9ub3RjaExlbmd0aF8pKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoaGFzU3BhY2luZ1BhcmVsbGVsRWRnZV8pKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoaGFzU3BhY2luZ0FkamFjZW50RXhjZXB0XykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChwYXJTcGFjZV8pKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAocGFyV2l0aGluXykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChoYXNTcGFjaW5nVHdvRWRnZXNfKSk7Ci0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKGhhc1NwYWNpbmdTYW1lbmV0XykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChoYXNTcGFjaW5nU2FtZW5ldFBHb25seV8pKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoaGFzU3BhY2luZ0N1dEFyZWFfKSk7Ci0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKHNwYWNpbmdDdXRBcmVhXykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChyYW5nZU1pbl8pKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAocmFuZ2VNYXhfKSk7Ci0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKHJhbmdlSW5mbHVlbmNlXykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChyYW5nZUluZmx1ZW5jZVJhbmdlTWluXykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChyYW5nZUluZmx1ZW5jZVJhbmdlTWF4XykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChyYW5nZVJhbmdlTWluXykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChyYW5nZVJhbmdlTWF4XykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChoYXNTcGFjaW5nVXNlTGVuZ3RoVGhyZXNob2xkXykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChoYXNTcGFjaW5nTGVuZ3RoVGhyZXNob2xkXykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChsZW5ndGhUaHJlc2hvbGRfKSk7Ci0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKGxlbmd0aFRocmVzaG9sZFJhbmdlTWluXykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChsZW5ndGhUaHJlc2hvbGRSYW5nZU1heF8pKTsKLSAgICAgICAgfQotICAgICAgICBzcGFjaW5nXyA9IG5kOwotICAgICAgICBzcGFjaW5nTmFtZV8gPSBubjsKLSAgICAgICAgc3BhY2luZ0FkamFjZW50Q3V0c18gPSBuYWM7Ci0gICAgICAgIHNwYWNpbmdBZGphY2VudFdpdGhpbl8gPSBuYXc7Ci0gICAgICAgIGhhc1NwYWNpbmdOYW1lXyA9IG5zbjsKLSAgICAgICAgaGFzU3BhY2luZ0xheWVyU3RhY2tfID0gbnNzOwotICAgICAgICBoYXNTcGFjaW5nQWRqYWNlbnRfID0gbnNhOwotICAgICAgICBoYXNTcGFjaW5nUmFuZ2VfID0gbnI7Ci0gICAgICAgIGhhc1NwYWNpbmdDZW50ZXJUb0NlbnRlcl8gPSBuY2M7Ci0gICAgICAgIGhhc1NwYWNpbmdQYXJhbGxlbE92ZXJsYXBfID0gaHBvOwotICAgICAgICBoYXNTcGFjaW5nRW5kT2ZMaW5lXyA9IGhlb2w7Ci0gICAgICAgIGVvbFdpZHRoXyA9IG53ZDsKLSAgICAgICAgZW9sV2l0aGluXyA9IG53bjsKLSAgICAgICAgbm90Y2hMZW5ndGhfID0gbnRsOwotICAgICAgICBlbmRPZk5vdGNoV2lkdGhfID0gZW9uOwotICAgICAgICBtaW5Ob3RjaFNwYWNpbmdfID0gbnRzOwotICAgICAgICBlb25vdGNoTGVuZ3RoXyA9IGVvbmw7Ci0gICAgICAgIGhhc1NwYWNpbmdQYXJlbGxlbEVkZ2VfID0gaHBlOwotICAgICAgICBwYXJTcGFjZV8gPSBucHM7Ci0gICAgICAgIHBhcldpdGhpbl8gPSBucHc7Ci0gICAgICAgIGhhc1NwYWNpbmdUd29FZGdlc18gPSBodGU7Ci0gICAgICAgIGhhc1NwYWNpbmdBZGphY2VudEV4Y2VwdF8gPSBoYWU7Ci0gICAgICAgIGhhc1NwYWNpbmdTYW1lbmV0XyA9IGhzbjsKLSAgICAgICAgaGFzU3BhY2luZ1NhbWVuZXRQR29ubHlfID0gaHNubzsKLSAgICAgICAgaGFzU3BhY2luZ0N1dEFyZWFfID0gaGNhOwotICAgICAgICBzcGFjaW5nQ3V0QXJlYV8gPSBuY2E7Ci0gICAgICAgIHJhbmdlTWluXyA9IG5ybWluOwotICAgICAgICByYW5nZU1heF8gPSBucm1heDsKLSAgICAgICAgcmFuZ2VJbmZsdWVuY2VfID0gbnJpOwotICAgICAgICByYW5nZUluZmx1ZW5jZVJhbmdlTWluXyA9IG5yaW1pbjsKLSAgICAgICAgcmFuZ2VJbmZsdWVuY2VSYW5nZU1heF8gPSBucmltYXg7Ci0gICAgICAgIHJhbmdlUmFuZ2VNaW5fID0gbnJybWluOwotICAgICAgICByYW5nZVJhbmdlTWF4XyA9IG5ycm1heDsKLSAgICAgICAgaGFzU3BhY2luZ1VzZUxlbmd0aFRocmVzaG9sZF8gPSBodDsKLSAgICAgICAgaGFzU3BhY2luZ0xlbmd0aFRocmVzaG9sZF8gPSBubDsKLSAgICAgICAgbGVuZ3RoVGhyZXNob2xkXyA9IG50OwotICAgICAgICBsZW5ndGhUaHJlc2hvbGRSYW5nZU1pbl8gPSBudG1pbjsKLSAgICAgICAgbGVuZ3RoVGhyZXNob2xkUmFuZ2VNYXhfID0gbnRtYXg7Ci0gICAgfQotICAgIGhhc1NwYWNpbmdfID0gMTsKLSAgICBzcGFjaW5nX1tudW1TcGFjaW5nc19dID0gZGlzdDsKLSAgICBzcGFjaW5nTmFtZV9bbnVtU3BhY2luZ3NfXSA9IDA7Ci0gICAgaGFzU3BhY2luZ05hbWVfW251bVNwYWNpbmdzX10gPSAwOwotICAgIGhhc1NwYWNpbmdMYXllclN0YWNrX1tudW1TcGFjaW5nc19dID0gMDsKLSAgICBzcGFjaW5nQWRqYWNlbnRDdXRzX1tudW1TcGFjaW5nc19dID0gMDsKLSAgICBzcGFjaW5nQWRqYWNlbnRXaXRoaW5fW251bVNwYWNpbmdzX10gPSAwOwotICAgIGhhc1NwYWNpbmdBZGphY2VudF9bbnVtU3BhY2luZ3NfXSA9IDA7Ci0gICAgaGFzU3BhY2luZ1JhbmdlX1tudW1TcGFjaW5nc19dID0gMDsKLSAgICBoYXNTcGFjaW5nQ2VudGVyVG9DZW50ZXJfW251bVNwYWNpbmdzX10gPSAwOwotICAgIGhhc1NwYWNpbmdQYXJhbGxlbE92ZXJsYXBfW251bVNwYWNpbmdzX10gPSAwOwotICAgIGhhc1NwYWNpbmdFbmRPZkxpbmVfW251bVNwYWNpbmdzX10gPSAwOwotICAgIGhhc1NwYWNpbmdBZGphY2VudEV4Y2VwdF9bbnVtU3BhY2luZ3NfXSA9IDA7Ci0gICAgZW9sV2lkdGhfW251bVNwYWNpbmdzX10gPSAwOwotICAgIGVvbFdpdGhpbl9bbnVtU3BhY2luZ3NfXSA9IDA7Ci0gICAgbm90Y2hMZW5ndGhfW251bVNwYWNpbmdzX10gPSAtMTsKLSAgICBlbmRPZk5vdGNoV2lkdGhfW251bVNwYWNpbmdzX10gPSAwOwotICAgIG1pbk5vdGNoU3BhY2luZ19bbnVtU3BhY2luZ3NfXSA9IDA7Ci0gICAgZW9ub3RjaExlbmd0aF9bbnVtU3BhY2luZ3NfXSA9IDA7Ci0gICAgaGFzU3BhY2luZ1BhcmVsbGVsRWRnZV9bbnVtU3BhY2luZ3NfXSA9IDA7Ci0gICAgcGFyU3BhY2VfW251bVNwYWNpbmdzX10gPSAwOwotICAgIHBhcldpdGhpbl9bbnVtU3BhY2luZ3NfXSA9IDA7Ci0gICAgaGFzU3BhY2luZ1R3b0VkZ2VzX1tudW1TcGFjaW5nc19dID0gMDsKLSAgICBoYXNTcGFjaW5nU2FtZW5ldF9bbnVtU3BhY2luZ3NfXSA9IDA7Ci0gICAgaGFzU3BhY2luZ1NhbWVuZXRQR29ubHlfW251bVNwYWNpbmdzX10gPSAwOwotICAgIGhhc1NwYWNpbmdDdXRBcmVhX1tudW1TcGFjaW5nc19dID0gMDsKLSAgICBzcGFjaW5nQ3V0QXJlYV9bbnVtU3BhY2luZ3NfXSA9IDA7Ci0gICAgcmFuZ2VNaW5fW251bVNwYWNpbmdzX10gPSAtMTsKLSAgICByYW5nZU1heF9bbnVtU3BhY2luZ3NfXSA9IC0xOwotICAgIHJhbmdlSW5mbHVlbmNlX1tudW1TcGFjaW5nc19dID0gMDsKLSAgICByYW5nZUluZmx1ZW5jZVJhbmdlTWluX1tudW1TcGFjaW5nc19dID0gLTE7Ci0gICAgcmFuZ2VJbmZsdWVuY2VSYW5nZU1heF9bbnVtU3BhY2luZ3NfXSA9IC0xOwotICAgIHJhbmdlUmFuZ2VNaW5fW251bVNwYWNpbmdzX10gPSAtMTsKLSAgICByYW5nZVJhbmdlTWF4X1tudW1TcGFjaW5nc19dID0gLTE7Ci0gICAgaGFzU3BhY2luZ1VzZUxlbmd0aFRocmVzaG9sZF9bbnVtU3BhY2luZ3NfXSA9IDA7Ci0gICAgaGFzU3BhY2luZ0xlbmd0aFRocmVzaG9sZF9bbnVtU3BhY2luZ3NfXSA9IDA7Ci0gICAgbGVuZ3RoVGhyZXNob2xkX1tudW1TcGFjaW5nc19dID0gMDsKLSAgICBsZW5ndGhUaHJlc2hvbGRSYW5nZU1pbl9bbnVtU3BhY2luZ3NfXSA9IC0xOwotICAgIGxlbmd0aFRocmVzaG9sZFJhbmdlTWF4X1tudW1TcGFjaW5nc19dID0gLTE7Ci0gICAgbnVtU3BhY2luZ3NfICs9IDE7Ci19Ci0KLXZvaWQKLWxlZmlMYXllcjo6c2V0U3BhY2luZ1JhbmdlKGRvdWJsZSAgIGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICByaWdodCkKLXsKLSAgICByYW5nZU1pbl9bbnVtU3BhY2luZ3NfIC0gMV0gPSBsZWZ0OwotICAgIHJhbmdlTWF4X1tudW1TcGFjaW5nc18gLSAxXSA9IHJpZ2h0OwotICAgIGhhc1NwYWNpbmdSYW5nZV9bbnVtU3BhY2luZ3NfIC0gMV0gPSAxOwotICAgIHJhbmdlSW5mbHVlbmNlX1tudW1TcGFjaW5nc18gLSAxXSA9IC0xOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OnNldFNwYWNpbmdOYW1lKGNvbnN0IGNoYXIgKnNwYWNpbmdOYW1lKQotewotICAgIGlmIChzcGFjaW5nTmFtZSkgewotICAgICAgICBpbnQgbGVuID0gc3RybGVuKHNwYWNpbmdOYW1lKSArIDE7Ci0gICAgICAgIHNwYWNpbmdOYW1lX1tudW1TcGFjaW5nc18gLSAxXSA9IChjaGFyKikgbGVmTWFsbG9jKGxlbik7Ci0gICAgICAgIHN0cmNweShzcGFjaW5nTmFtZV9bbnVtU3BhY2luZ3NfIC0gMV0sIENBU0Uoc3BhY2luZ05hbWUpKTsKLSAgICAgICAgaGFzU3BhY2luZ05hbWVfW251bVNwYWNpbmdzXyAtIDFdID0gMTsKLSAgICB9Ci19Ci0KLXZvaWQKLWxlZmlMYXllcjo6c2V0U3BhY2luZ0xheWVyU3RhY2soKQotewotICAgIGhhc1NwYWNpbmdMYXllclN0YWNrX1tudW1TcGFjaW5nc18gLSAxXSA9IDE7Ci19Ci0KLXZvaWQKLWxlZmlMYXllcjo6c2V0U3BhY2luZ0FkamFjZW50KGludCAgICAgICBudW1DdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgIGRpc3RhbmNlKQotewotICAgIHNwYWNpbmdBZGphY2VudEN1dHNfW251bVNwYWNpbmdzXyAtIDFdID0gbnVtQ3V0czsKLSAgICBzcGFjaW5nQWRqYWNlbnRXaXRoaW5fW251bVNwYWNpbmdzXyAtIDFdID0gZGlzdGFuY2U7Ci0gICAgaGFzU3BhY2luZ0FkamFjZW50X1tudW1TcGFjaW5nc18gLSAxXSA9IDE7Ci19Ci0KLXZvaWQKLWxlZmlMYXllcjo6c2V0U3BhY2luZ1JhbmdlVXNlTGVuZ3RoKCkKLXsKLSAgICBoYXNTcGFjaW5nVXNlTGVuZ3RoVGhyZXNob2xkX1tudW1TcGFjaW5nc18gLSAxXSA9IDE7Ci19Ci0KLXZvaWQKLWxlZmlMYXllcjo6c2V0U3BhY2luZ1JhbmdlSW5mbHVlbmNlKGRvdWJsZSBpbmZMZW5ndGgpCi17Ci0gICAgcmFuZ2VJbmZsdWVuY2VfW251bVNwYWNpbmdzXyAtIDFdID0gaW5mTGVuZ3RoOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OnNldFNwYWNpbmdSYW5nZUluZmx1ZW5jZVJhbmdlKGRvdWJsZSBtaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtYXgpCi17Ci0gICAgcmFuZ2VJbmZsdWVuY2VSYW5nZU1pbl9bbnVtU3BhY2luZ3NfIC0gMV0gPSBtaW47Ci0gICAgcmFuZ2VJbmZsdWVuY2VSYW5nZU1heF9bbnVtU3BhY2luZ3NfIC0gMV0gPSBtYXg7Ci19Ci0KLXZvaWQKLWxlZmlMYXllcjo6c2V0U3BhY2luZ1JhbmdlUmFuZ2UoZG91YmxlICBtaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgbWF4KQotewotICAgIHJhbmdlUmFuZ2VNaW5fW251bVNwYWNpbmdzXyAtIDFdID0gbWluOwotICAgIHJhbmdlUmFuZ2VNYXhfW251bVNwYWNpbmdzXyAtIDFdID0gbWF4OwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OnNldFNwYWNpbmdMZW5ndGgoZG91YmxlIG51bSkKLXsKLSAgICBsZW5ndGhUaHJlc2hvbGRfW251bVNwYWNpbmdzXyAtIDFdID0gbnVtOwotICAgIGhhc1NwYWNpbmdMZW5ndGhUaHJlc2hvbGRfW251bVNwYWNpbmdzXyAtIDFdID0gMTsKLX0KLQotdm9pZAotbGVmaUxheWVyOjpzZXRTcGFjaW5nTGVuZ3RoUmFuZ2UoZG91YmxlIG1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtYXgpCi17Ci0gICAgbGVuZ3RoVGhyZXNob2xkUmFuZ2VNaW5fW251bVNwYWNpbmdzXyAtIDFdID0gbWluOwotICAgIGxlbmd0aFRocmVzaG9sZFJhbmdlTWF4X1tudW1TcGFjaW5nc18gLSAxXSA9IG1heDsKLX0KLQotdm9pZAotbGVmaUxheWVyOjpzZXRTcGFjaW5nQ2VudGVyVG9DZW50ZXIoKQotewotICAgIGhhc1NwYWNpbmdDZW50ZXJUb0NlbnRlcl9bbnVtU3BhY2luZ3NfIC0gMV0gPSAxOwotfQotCi0vLyA1LjcKLXZvaWQKLWxlZmlMYXllcjo6c2V0U3BhY2luZ1BhcmFsbGVsT3ZlcmxhcCgpCi17Ci0gICAgaGFzU3BhY2luZ1BhcmFsbGVsT3ZlcmxhcF9bbnVtU3BhY2luZ3NfIC0gMV0gPSAxOwotfQotCi0vLyA1LjcKLXZvaWQKLWxlZmlMYXllcjo6c2V0U3BhY2luZ0FyZWEoZG91YmxlIGN1dEFyZWEpCi17Ci0gICAgc3BhY2luZ0N1dEFyZWFfW251bVNwYWNpbmdzXyAtIDFdID0gY3V0QXJlYTsKLSAgICBoYXNTcGFjaW5nQ3V0QXJlYV9bbnVtU3BhY2luZ3NfIC0gMV0gPSAxOwotfQotCi0vLyA1LjcKLXZvaWQKLWxlZmlMYXllcjo6c2V0U3BhY2luZ0VvbChkb3VibGUgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHdpdGhpbikKLXsKLSAgICBoYXNTcGFjaW5nRW5kT2ZMaW5lX1tudW1TcGFjaW5nc18gLSAxXSA9IDE7Ci0gICAgZW9sV2lkdGhfW251bVNwYWNpbmdzXyAtIDFdID0gd2lkdGg7Ci0gICAgZW9sV2l0aGluX1tudW1TcGFjaW5nc18gLSAxXSA9IHdpdGhpbjsKLX0KLQotLy8gNS43Ci12b2lkCi1sZWZpTGF5ZXI6OnNldFNwYWNpbmdQYXJTVyhkb3VibGUgICBzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgIHdpdGhpbikKLXsKLSAgICBoYXNTcGFjaW5nUGFyZWxsZWxFZGdlX1tudW1TcGFjaW5nc18gLSAxXSA9IDE7Ci0gICAgcGFyU3BhY2VfW251bVNwYWNpbmdzXyAtIDFdID0gc3BhY2U7Ci0gICAgcGFyV2l0aGluX1tudW1TcGFjaW5nc18gLSAxXSA9IHdpdGhpbjsKLX0KLQotLy8gNS43Ci12b2lkCi1sZWZpTGF5ZXI6OnNldFNwYWNpbmdQYXJUd29FZGdlcygpCi17Ci0gICAgaGFzU3BhY2luZ1R3b0VkZ2VzX1tudW1TcGFjaW5nc18gLSAxXSA9IDE7Ci19Ci0KLS8vIDUuNwotdm9pZAotbGVmaUxheWVyOjpzZXRTcGFjaW5nQWRqYWNlbnRFeGNlcHQoKQotewotICAgIGhhc1NwYWNpbmdBZGphY2VudEV4Y2VwdF9bbnVtU3BhY2luZ3NfIC0gMV0gPSAxOwotfQotCi0vLyA1LjcKLXZvaWQKLWxlZmlMYXllcjo6c2V0U3BhY2luZ1NhbWVuZXQoKQotewotICAgIGhhc1NwYWNpbmdTYW1lbmV0X1tudW1TcGFjaW5nc18gLSAxXSA9IDE7Ci19Ci0KLS8vIDUuNwotdm9pZAotbGVmaUxheWVyOjpzZXRTcGFjaW5nU2FtZW5ldFBHb25seSgpCi17Ci0gICAgaGFzU3BhY2luZ1NhbWVuZXRQR29ubHlfW251bVNwYWNpbmdzXyAtIDFdID0gMTsKLX0KLQotLy8gNS43Ci12b2lkCi1sZWZpTGF5ZXI6OnNldFNwYWNpbmdOb3RjaExlbmd0aChkb3VibGUgbm90Y2hMZW5ndGgpCi17Ci0gICAgbm90Y2hMZW5ndGhfW251bVNwYWNpbmdzXyAtIDFdID0gbm90Y2hMZW5ndGg7Ci19Ci0KLS8vIDUuNwotdm9pZAotbGVmaUxheWVyOjpzZXRTcGFjaW5nRW5kT2ZOb3RjaFdpZHRoKGRvdWJsZSBlb25XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbW5TcGFjaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBlb25MZW5ndGgpCi17Ci0gICAgZW5kT2ZOb3RjaFdpZHRoX1tudW1TcGFjaW5nc18gLSAxXSA9IGVvbldpZHRoOwotICAgIG1pbk5vdGNoU3BhY2luZ19bbnVtU3BhY2luZ3NfIC0gMV0gPSBtblNwYWNpbmc7Ci0gICAgZW9ub3RjaExlbmd0aF9bbnVtU3BhY2luZ3NfIC0gMV0gPSBlb25MZW5ndGg7Ci19Ci0KLS8vIDUuNwotdm9pZAotbGVmaUxheWVyOjpzZXRTcGFjaW5nVGFibGVPcnRobygpCi17Ci0KLSAgICBzcGFjaW5nVGFibGVPcnRob18gPSAobGVmaU9ydGhvZ29uYWwqKSBsZWZNYWxsb2Moc2l6ZW9mKGxlZmlPcnRob2dvbmFsKSk7Ci0gICAgc3BhY2luZ1RhYmxlT3J0aG9fLT5Jbml0KCk7Ci19Ci0KLS8vIDUuNwotdm9pZAotbGVmaUxheWVyOjphZGRTcGFjaW5nVGFibGVPcnRob1dpdGhpbihkb3VibGUgICAgY3V0V2l0aGluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgb3J0aG9TcCkKLXsKLSAgICBzcGFjaW5nVGFibGVPcnRob18tPmFkZE9ydGhvZ29uYWwoY3V0V2l0aGluLCBvcnRob1NwKTsKLSAgICBoYXNTcGFjaW5nVGFibGVPcnRob18gPSAxOwotfQotCi0vLyA1LjcKLXZvaWQKLWxlZmlMYXllcjo6c2V0TWF4RmxvYXRpbmdBcmVhKGRvdWJsZSBudW0pCi17Ci0gICAgbWF4QXJlYV8gPSBudW07Ci19Ci0KLS8vIDUuNwotdm9pZAotbGVmaUxheWVyOjpzZXRBcnJheVNwYWNpbmdMb25nQXJyYXkoKQotewotICAgIGhhc0xvbmdBcnJheV8gPSAxOwotfQotCi0vLyA1LjcKLXZvaWQKLWxlZmlMYXllcjo6c2V0QXJyYXlTcGFjaW5nV2lkdGgoZG91YmxlIHZpYVdpZHRoKQotewotICAgIHZpYVdpZHRoXyA9IHZpYVdpZHRoOwotfQotCi0vLyA1LjcKLXZvaWQKLWxlZmlMYXllcjo6c2V0QXJyYXlTcGFjaW5nQ3V0KGRvdWJsZSBjdXRTcGFjaW5nKQotewotICAgIGN1dFNwYWNpbmdfID0gY3V0U3BhY2luZzsKLX0KLQotLy8gNS43Ci12b2lkCi1sZWZpTGF5ZXI6OmFkZEFycmF5U3BhY2luZ0FycmF5KGludCAgICAgYXJyYXlDdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgYXJyYXlTcGFjaW5nKQotewotICAgIGludCAgICAgaSwgbGVuOwotICAgIGludCAgICAgKmFjOwotICAgIGRvdWJsZSAgKmFzOwotCi0gICAgaWYgKG51bUFycmF5Q3V0c18gPT0gYXJyYXlDdXRzQWxsb2NhdGVkXykgewotICAgICAgICBpZiAoYXJyYXlDdXRzQWxsb2NhdGVkXyA9PSAwKQotICAgICAgICAgICAgbGVuID0gYXJyYXlDdXRzQWxsb2NhdGVkXyA9IDI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGxlbiA9IGFycmF5Q3V0c0FsbG9jYXRlZF8gKj0gMjsKLSAgICAgICAgYWMgPSAoaW50KikgbGVmTWFsbG9jKHNpemVvZihpbnQpICogbGVuKTsKLSAgICAgICAgYXMgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGVuKTsKLQotICAgICAgICBpZiAobnVtQXJyYXlDdXRzXyA+IDApIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1BcnJheUN1dHNfOyBpKyspIHsKLSAgICAgICAgICAgICAgICBhY1tpXSA9IGFycmF5Q3V0c19baV07Ci0gICAgICAgICAgICAgICAgYXNbaV0gPSBhcnJheVNwYWNpbmdzX1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoYXJyYXlDdXRzXykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChhcnJheVNwYWNpbmdzXykpOwotICAgICAgICB9Ci0gICAgICAgIGFycmF5Q3V0c18gPSBhYzsKLSAgICAgICAgYXJyYXlTcGFjaW5nc18gPSBhczsKLSAgICB9Ci0gICAgYXJyYXlDdXRzX1tudW1BcnJheUN1dHNfXSA9IGFycmF5Q3V0OwotICAgIGFycmF5U3BhY2luZ3NfW251bUFycmF5Q3V0c19dID0gYXJyYXlTcGFjaW5nOwotICAgIG51bUFycmF5Q3V0c18gKz0gMTsKLX0KLQotdm9pZAotbGVmaUxheWVyOjpzZXREaXJlY3Rpb24oY29uc3QgY2hhciAqZGlyKQotewotICAgIGRpcmVjdGlvbl8gPSAoY2hhciopIGRpcjsKLSAgICBoYXNEaXJlY3Rpb25fID0gMTsKLX0KLQotdm9pZAotbGVmaUxheWVyOjpzZXRSZXNpc3RhbmNlKGRvdWJsZSBudW0pCi17Ci0gICAgaGFzUmVzaXN0YW5jZV8gPSAxOwotICAgIHJlc2lzdGFuY2VfID0gbnVtOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OnNldENhcGFjaXRhbmNlKGRvdWJsZSBudW0pCi17Ci0gICAgaGFzQ2FwYWNpdGFuY2VfID0gMTsKLSAgICBjYXBhY2l0YW5jZV8gPSBudW07Ci19Ci0KLXZvaWQKLWxlZmlMYXllcjo6c2V0SGVpZ2h0KGRvdWJsZSBudW0pCi17Ci0gICAgaGFzSGVpZ2h0XyA9IDE7Ci0gICAgaGVpZ2h0XyA9IG51bTsKLX0KLQotdm9pZAotbGVmaUxheWVyOjpzZXRUaGlja25lc3MoZG91YmxlIG51bSkKLXsKLSAgICBoYXNUaGlja25lc3NfID0gMTsKLSAgICB0aGlja25lc3NfID0gbnVtOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OnNldFNocmlua2FnZShkb3VibGUgbnVtKQotewotICAgIGhhc1Nocmlua2FnZV8gPSAxOwotICAgIHNocmlua2FnZV8gPSBudW07Ci19Ci0KLXZvaWQKLWxlZmlMYXllcjo6c2V0Q2FwTXVsdGlwbGllcihkb3VibGUgbnVtKQotewotICAgIGhhc0NhcE11bHRpcGxpZXJfID0gMTsKLSAgICBjYXBNdWx0aXBsaWVyXyA9IG51bTsKLX0KLQotdm9pZAotbGVmaUxheWVyOjpzZXRFZGdlQ2FwKGRvdWJsZSBudW0pCi17Ci0gICAgaGFzRWRnZUNhcF8gPSAxOwotICAgIGVkZ2VDYXBfID0gbnVtOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OnNldEFudGVubmFMZW5ndGgoZG91YmxlIG51bSkKLXsKLSAgICBoYXNBbnRlbm5hTGVuZ3RoXyA9IDE7Ci0gICAgYW50ZW5uYUxlbmd0aF8gPSBudW07Ci19Ci0KLXZvaWQKLWxlZmlMYXllcjo6c2V0QW50ZW5uYUFyZWEoZG91YmxlIG51bSkKLXsKLSAgICBoYXNBbnRlbm5hQXJlYV8gPSAxOwotICAgIGFudGVubmFBcmVhXyA9IG51bTsKLX0KLQotdm9pZAotbGVmaUxheWVyOjpzZXRDdXJyZW50RGVuc2l0eShkb3VibGUgbnVtKQotewotICAgIGhhc0N1cnJlbnREZW5zaXR5UG9pbnRfID0gMTsKLSAgICBjdXJyZW50RGVuc2l0eV8gPSBudW07Ci19Ci0KLXZvaWQKLWxlZmlMYXllcjo6c2V0Q3VycmVudFBvaW50KGRvdWJsZSAgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgY3VycmVudCkKLXsKLSAgICBpZiAobnVtQ3VycmVudFBvaW50c18gPT0gY3VycmVudFBvaW50c0FsbG9jYXRlZF8pIHsKLSAgICAgICAgaW50ICAgICBtYXggPSBudW1DdXJyZW50UG9pbnRzXzsKLSAgICAgICAgaW50ICAgICBsZW47Ci0gICAgICAgIGludCAgICAgaTsKLSAgICAgICAgZG91YmxlICAqbmM7Ci0gICAgICAgIGRvdWJsZSAgKm53OwotCi0gICAgICAgIGlmIChjdXJyZW50UG9pbnRzQWxsb2NhdGVkXyA9PSAwKQotICAgICAgICAgICAgbGVuID0gY3VycmVudFBvaW50c0FsbG9jYXRlZF8gPSAyOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBsZW4gPSBjdXJyZW50UG9pbnRzQWxsb2NhdGVkXyAqPSAyOwotICAgICAgICBuYyA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBsZW4pOwotICAgICAgICBudyA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBsZW4pOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykgewotICAgICAgICAgICAgbmNbaV0gPSBjdXJyZW50X1tpXTsKLSAgICAgICAgICAgIG53W2ldID0gY3VycmVudFdpZHRoc19baV07Ci0gICAgICAgIH0KLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChjdXJyZW50XykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGN1cnJlbnRXaWR0aHNfKSk7Ci0gICAgICAgIGN1cnJlbnRfID0gbmM7Ci0gICAgICAgIGN1cnJlbnRXaWR0aHNfID0gbnc7Ci0gICAgfQotICAgIGN1cnJlbnRfW251bUN1cnJlbnRQb2ludHNfXSA9IGN1cnJlbnQ7Ci0gICAgY3VycmVudFdpZHRoc19bbnVtQ3VycmVudFBvaW50c19dID0gd2lkdGg7Ci0gICAgbnVtQ3VycmVudFBvaW50c18gKz0gMTsKLX0KLQotdm9pZAotbGVmaUxheWVyOjpzZXRSZXNpc3RhbmNlUG9pbnQoZG91YmxlICAgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgIHJlc2lzdGFuY2UpCi17Ci0gICAgaWYgKG51bVJlc2lzdGFuY2VQb2ludHNfID09IHJlc2lzdGFuY2VQb2ludHNBbGxvY2F0ZWRfKSB7Ci0gICAgICAgIGludCAgICAgbWF4ID0gbnVtUmVzaXN0YW5jZVBvaW50c187Ci0gICAgICAgIGludCAgICAgbGVuOwotICAgICAgICBpbnQgICAgIGk7Ci0gICAgICAgIGRvdWJsZSAgKm5jOwotICAgICAgICBkb3VibGUgICpudzsKLQotICAgICAgICBpZiAocmVzaXN0YW5jZVBvaW50c0FsbG9jYXRlZF8gPT0gMCkKLSAgICAgICAgICAgIGxlbiA9IHJlc2lzdGFuY2VQb2ludHNBbGxvY2F0ZWRfID0gMjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbGVuID0gcmVzaXN0YW5jZVBvaW50c0FsbG9jYXRlZF8gKj0gMjsKLSAgICAgICAgbmMgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGVuKTsKLSAgICAgICAgbncgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGVuKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKSB7Ci0gICAgICAgICAgICBuY1tpXSA9IHJlc2lzdGFuY2VzX1tpXTsKLSAgICAgICAgICAgIG53W2ldID0gcmVzaXN0YW5jZVdpZHRoc19baV07Ci0gICAgICAgIH0KLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChyZXNpc3RhbmNlc18pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChyZXNpc3RhbmNlV2lkdGhzXykpOwotICAgICAgICByZXNpc3RhbmNlc18gPSBuYzsKLSAgICAgICAgcmVzaXN0YW5jZVdpZHRoc18gPSBudzsKLSAgICB9Ci0gICAgcmVzaXN0YW5jZXNfW251bVJlc2lzdGFuY2VQb2ludHNfXSA9IHJlc2lzdGFuY2U7Ci0gICAgcmVzaXN0YW5jZVdpZHRoc19bbnVtUmVzaXN0YW5jZVBvaW50c19dID0gd2lkdGg7Ci0gICAgbnVtUmVzaXN0YW5jZVBvaW50c18gKz0gMTsKLX0KLQotdm9pZAotbGVmaUxheWVyOjpzZXRDYXBhY2l0YW5jZVBvaW50KGRvdWJsZSAgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgIGNhcGFjaXRhbmNlKQotewotICAgIGlmIChudW1DYXBhY2l0YW5jZVBvaW50c18gPT0gY2FwYWNpdGFuY2VQb2ludHNBbGxvY2F0ZWRfKSB7Ci0gICAgICAgIGludCAgICAgbWF4ID0gbnVtQ2FwYWNpdGFuY2VQb2ludHNfOwotICAgICAgICBpbnQgICAgIGxlbjsKLSAgICAgICAgaW50ICAgICBpOwotICAgICAgICBkb3VibGUgICpuYzsKLSAgICAgICAgZG91YmxlICAqbnc7Ci0KLSAgICAgICAgaWYgKGNhcGFjaXRhbmNlUG9pbnRzQWxsb2NhdGVkXyA9PSAwKQotICAgICAgICAgICAgbGVuID0gY2FwYWNpdGFuY2VQb2ludHNBbGxvY2F0ZWRfID0gMjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbGVuID0gY2FwYWNpdGFuY2VQb2ludHNBbGxvY2F0ZWRfICo9IDI7Ci0gICAgICAgIG5jID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGxlbik7Ci0gICAgICAgIG53ID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGxlbik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykgewotICAgICAgICAgICAgbmNbaV0gPSBjYXBhY2l0YW5jZXNfW2ldOwotICAgICAgICAgICAgbndbaV0gPSBjYXBhY2l0YW5jZVdpZHRoc19baV07Ci0gICAgICAgIH0KLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChjYXBhY2l0YW5jZXNfKSk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoY2FwYWNpdGFuY2VXaWR0aHNfKSk7Ci0gICAgICAgIGNhcGFjaXRhbmNlc18gPSBuYzsKLSAgICAgICAgY2FwYWNpdGFuY2VXaWR0aHNfID0gbnc7Ci0gICAgfQotICAgIGNhcGFjaXRhbmNlc19bbnVtQ2FwYWNpdGFuY2VQb2ludHNfXSA9IGNhcGFjaXRhbmNlOwotICAgIGNhcGFjaXRhbmNlV2lkdGhzX1tudW1DYXBhY2l0YW5jZVBvaW50c19dID0gd2lkdGg7Ci0gICAgbnVtQ2FwYWNpdGFuY2VQb2ludHNfICs9IDE7Ci19Ci0KLWludAotbGVmaUxheWVyOjpoYXNUeXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gKHR5cGVfWzBdICE9ICdcMCcpID8gMSA6IDA7Ci19Ci0KLS8vIDUuOAotaW50Ci1sZWZpTGF5ZXI6Omhhc0xheWVyVHlwZSgpIGNvbnN0Ci17Ci0gICAgaWYgKGxheWVyVHlwZV8pCi0gICAgICAgIHJldHVybiAxOwotICAgIHJldHVybiAwOwotfQotCi1pbnQKLWxlZmlMYXllcjo6aGFzUGl0Y2goKSBjb25zdAotewotICAgIGlmIChoYXNQaXRjaF8gPT0gMSkKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gMDsKLX0KLQotaW50Ci1sZWZpTGF5ZXI6Omhhc01hc2soKSBjb25zdAotewotICAgIGlmIChoYXNNYXNrXykgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLS8vIDUuNgotaW50Ci1sZWZpTGF5ZXI6Omhhc1hZUGl0Y2goKSBjb25zdAotewotICAgIGlmIChoYXNQaXRjaF8gPT0gMikKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gMDsKLX0KLQotaW50Ci1sZWZpTGF5ZXI6Omhhc09mZnNldCgpIGNvbnN0Ci17Ci0gICAgaWYgKGhhc09mZnNldF8gPT0gMSkKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gMDsKLX0KLQotLy8gNS42Ci1pbnQKLWxlZmlMYXllcjo6aGFzWFlPZmZzZXQoKSBjb25zdAotewotICAgIGlmIChoYXNPZmZzZXRfID09IDIpCi0gICAgICAgIHJldHVybiAxOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLWludAotbGVmaUxheWVyOjpoYXNXaWR0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc1dpZHRoXzsKLX0KLQotaW50Ci1sZWZpTGF5ZXI6Omhhc0FyZWEoKSBjb25zdAotewotICAgIHJldHVybiBoYXNBcmVhXzsKLX0KLQotLy8gNS42Ci1pbnQKLWxlZmlMYXllcjo6aGFzRGlhZ1BpdGNoKCkgY29uc3QKLXsKLSAgICBpZiAoaGFzRGlhZ1BpdGNoXyA9PSAxKQotICAgICAgICByZXR1cm4gMTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiAwOwotfQotCi0vLyA1LjYKLWludAotbGVmaUxheWVyOjpoYXNYWURpYWdQaXRjaCgpIGNvbnN0Ci17Ci0gICAgaWYgKGhhc0RpYWdQaXRjaF8gPT0gMikKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gMDsKLX0KLQotLy8gNS42Ci1pbnQKLWxlZmlMYXllcjo6aGFzRGlhZ1dpZHRoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzRGlhZ1dpZHRoXzsKLX0KLQotLy8gNS42Ci1pbnQKLWxlZmlMYXllcjo6aGFzRGlhZ1NwYWNpbmcoKSBjb25zdAotewotICAgIHJldHVybiBoYXNEaWFnU3BhY2luZ187Ci19Ci0KLWludAotbGVmaUxheWVyOjpoYXNXaXJlRXh0ZW5zaW9uKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzV2lyZUV4dGVuc2lvbl87Ci19Ci0KLWludAotbGVmaUxheWVyOjpoYXNTcGFjaW5nTnVtYmVyKCkgY29uc3QKLXsKLSAgICByZXR1cm4gKChoYXNTcGFjaW5nXyAhPSAwKSAmJiAobnVtU3BhY2luZ3NfID4gMCkpID8gMSA6IDA7Ci19Ci0KLWludAotbGVmaUxheWVyOjpoYXNTcGFjaW5nTmFtZShpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICgoaGFzU3BhY2luZ18gIT0gMCkgJiYKLSAgICAgICAgICAgIChoYXNTcGFjaW5nTmFtZV9baW5kZXhdICE9IDApKSA/IDEgOiAwOwotfQotCi1pbnQKLWxlZmlMYXllcjo6aGFzU3BhY2luZ0xheWVyU3RhY2soaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiAoKGhhc1NwYWNpbmdfICE9IDApICYmCi0gICAgICAgICAgICAoaGFzU3BhY2luZ0xheWVyU3RhY2tfW2luZGV4XSAhPSAwKSkgPyAxIDogMDsKLX0KLQotaW50Ci1sZWZpTGF5ZXI6Omhhc1NwYWNpbmdBZGphY2VudChpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICgoaGFzU3BhY2luZ18gIT0gMCkgJiYKLSAgICAgICAgICAgIChoYXNTcGFjaW5nQWRqYWNlbnRfW2luZGV4XSAhPSAwKSkgPyAxIDogMDsKLX0KLQotaW50Ci1sZWZpTGF5ZXI6Omhhc1NwYWNpbmdSYW5nZShpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICgoaGFzU3BhY2luZ18gIT0gMCkgJiYKLSAgICAgICAgICAgIChoYXNTcGFjaW5nUmFuZ2VfW2luZGV4XSAhPSAwKSkgPyAxIDogMDsKLX0KLQotaW50Ci1sZWZpTGF5ZXI6Omhhc1NwYWNpbmdSYW5nZVVzZUxlbmd0aFRocmVzaG9sZChpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIChoYXNTcGFjaW5nVXNlTGVuZ3RoVGhyZXNob2xkX1tpbmRleF0pOwotfQotCi1pbnQKLWxlZmlMYXllcjo6aGFzU3BhY2luZ1JhbmdlSW5mbHVlbmNlKGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gKChoYXNTcGFjaW5nXyAhPSAwKSAmJiAoaGFzU3BhY2luZ1JhbmdlX1tpbmRleF0gIT0gMCkgJiYKLSAgICAgICAgICAgIChyYW5nZUluZmx1ZW5jZV9baW5kZXhdKSAhPSAtMSkgPyAxIDogMDsKLX0KLQotaW50Ci1sZWZpTGF5ZXI6Omhhc1NwYWNpbmdSYW5nZUluZmx1ZW5jZVJhbmdlKGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gKChoYXNTcGFjaW5nXyAhPSAwKSAmJiAoaGFzU3BhY2luZ1JhbmdlX1tpbmRleF0gIT0gMCkgJiYKLSAgICAgICAgICAgIChyYW5nZUluZmx1ZW5jZVJhbmdlTWluX1tpbmRleF0gIT0gLTEpICYmCi0gICAgICAgICAgICAocmFuZ2VJbmZsdWVuY2VSYW5nZU1heF9baW5kZXhdICE9IC0xKSkgPyAxIDogMDsKLX0KLQotaW50Ci1sZWZpTGF5ZXI6Omhhc1NwYWNpbmdSYW5nZVJhbmdlKGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gKChoYXNTcGFjaW5nXyAhPSAwKSAmJiAoaGFzU3BhY2luZ1JhbmdlX1tpbmRleF0gIT0gMCkgJiYKLSAgICAgICAgICAgIChyYW5nZVJhbmdlTWluX1tpbmRleF0gIT0gLTEpICYmCi0gICAgICAgICAgICAocmFuZ2VSYW5nZU1heF9baW5kZXhdICE9IC0xKSkgPyAxIDogMDsKLX0KLQotaW50Ci1sZWZpTGF5ZXI6Omhhc1NwYWNpbmdMZW5ndGhUaHJlc2hvbGQoaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiAoaGFzU3BhY2luZ0xlbmd0aFRocmVzaG9sZF9baW5kZXhdKSA/IDEgOiAwOwotfQotCi1pbnQKLWxlZmlMYXllcjo6aGFzU3BhY2luZ0xlbmd0aFRocmVzaG9sZFJhbmdlKGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gKChoYXNTcGFjaW5nXyAhPSAwKSAmJgotICAgICAgICAgICAgKGhhc1NwYWNpbmdMZW5ndGhUaHJlc2hvbGRfW2luZGV4XSAhPSAwKSAmJgotICAgICAgICAgICAgKGxlbmd0aFRocmVzaG9sZFJhbmdlTWluX1tpbmRleF0gIT0gLTEpICYmCi0gICAgICAgICAgICAobGVuZ3RoVGhyZXNob2xkUmFuZ2VNYXhfW2luZGV4XSAhPSAtMSkpID8gMSA6IDA7Ci19Ci0KLWludAotbGVmaUxheWVyOjpoYXNTcGFjaW5nQ2VudGVyVG9DZW50ZXIoaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiAoKGhhc1NwYWNpbmdfICE9IDApICYmCi0gICAgICAgICAgICAoaGFzU3BhY2luZ0NlbnRlclRvQ2VudGVyX1tpbmRleF0gIT0gMCkpID8gMSA6IDA7Ci19Ci0KLS8vIDUuNwotaW50Ci1sZWZpTGF5ZXI6Omhhc1NwYWNpbmdQYXJhbGxlbE92ZXJsYXAoaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiAoKGhhc1NwYWNpbmdfICE9IDApICYmCi0gICAgICAgICAgICAoaGFzU3BhY2luZ1BhcmFsbGVsT3ZlcmxhcF9baW5kZXhdICE9IDApKSA/IDEgOiAwOwotfQotCi0vLyA1LjcKLWludAotbGVmaUxheWVyOjpoYXNTcGFjaW5nQXJlYShpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICgoaGFzU3BhY2luZ18gIT0gMCkgJiYKLSAgICAgICAgICAgIChoYXNTcGFjaW5nQ3V0QXJlYV9baW5kZXhdICE9IDApKSA/IDEgOiAwOwotfQotCi0vLyA1LjcKLWludAotbGVmaUxheWVyOjpoYXNTcGFjaW5nRW5kT2ZMaW5lKGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gKChoYXNTcGFjaW5nXyAhPSAwKSAmJgotICAgICAgICAgICAgKGhhc1NwYWNpbmdFbmRPZkxpbmVfW2luZGV4XSAhPSAwKSkgPyAxIDogMDsKLX0KLQotLy8gNS43Ci1pbnQKLWxlZmlMYXllcjo6aGFzU3BhY2luZ1BhcmVsbGVsRWRnZShpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICgoaGFzU3BhY2luZ18gIT0gMCkgJiYKLSAgICAgICAgICAgIChoYXNTcGFjaW5nUGFyZWxsZWxFZGdlX1tpbmRleF0gIT0gMCkpID8gMSA6IDA7Ci19Ci0KLS8vIDUuNwotaW50Ci1sZWZpTGF5ZXI6Omhhc1NwYWNpbmdUd29FZGdlcyhpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICgoaGFzU3BhY2luZ18gIT0gMCkgJiYKLSAgICAgICAgICAgIChoYXNTcGFjaW5nVHdvRWRnZXNfW2luZGV4XSAhPSAwKSkgPyAxIDogMDsKLX0KLQotLy8gNS43Ci1pbnQKLWxlZmlMYXllcjo6aGFzU3BhY2luZ0FkamFjZW50RXhjZXB0KGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gKChoYXNTcGFjaW5nXyAhPSAwKSAmJgotICAgICAgICAgICAgKGhhc1NwYWNpbmdBZGphY2VudEV4Y2VwdF9baW5kZXhdICE9IDApKSA/IDEgOiAwOwotfQotCi0vLyA1LjcKLWludAotbGVmaUxheWVyOjpoYXNTcGFjaW5nU2FtZW5ldChpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICgoaGFzU3BhY2luZ18gIT0gMCkgJiYKLSAgICAgICAgICAgIChoYXNTcGFjaW5nU2FtZW5ldF9baW5kZXhdICE9IDApKSA/IDEgOiAwOwotfQotCi0vLyA1LjcKLWludAotbGVmaUxheWVyOjpoYXNTcGFjaW5nU2FtZW5ldFBHb25seShpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICgoaGFzU3BhY2luZ18gIT0gMCkgJiYKLSAgICAgICAgICAgIChoYXNTcGFjaW5nU2FtZW5ldFBHb25seV9baW5kZXhdICE9IDApKSA/IDEgOiAwOwotfQotCi0vLyA1LjcKLWludAotbGVmaUxheWVyOjpoYXNTcGFjaW5nTm90Y2hMZW5ndGgoaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiAobm90Y2hMZW5ndGhfW2luZGV4XSA+PSAwKSA/IDEgOiAwOwotfQotCi0vLyA1LjcKLWludAotbGVmaUxheWVyOjpoYXNTcGFjaW5nRW5kT2ZOb3RjaFdpZHRoKGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gKGVuZE9mTm90Y2hXaWR0aF9baW5kZXhdICE9IDApID8gMSA6IDA7Ci19Ci0KLS8vIDUuNwotaW50Ci1sZWZpTGF5ZXI6Omhhc1NwYWNpbmdUYWJsZU9ydGhvKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzU3BhY2luZ1RhYmxlT3J0aG9fID8gMSA6IDA7Ci19Ci0KLS8vIDUuNwotaW50Ci1sZWZpTGF5ZXI6Omhhc01heEZsb2F0aW5nQXJlYSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1heEFyZWFfID8gMSA6IDA7Ci19Ci0KLS8vIDUuNwotaW50Ci1sZWZpTGF5ZXI6Omhhc0FycmF5U3BhY2luZygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGN1dFNwYWNpbmdfID8gMSA6IDA7Ci19Ci0KLS8vIDUuNwotaW50Ci1sZWZpTGF5ZXI6Omhhc0xvbmdBcnJheSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc0xvbmdBcnJheV8gPyAxIDogMDsKLX0KLQotLy8gNS43Ci1pbnQKLWxlZmlMYXllcjo6aGFzVmlhV2lkdGgoKSBjb25zdAotewotICAgIHJldHVybiB2aWFXaWR0aF8gPyAxIDogMDsKLX0KLQotaW50Ci1sZWZpTGF5ZXI6Omhhc0RpcmVjdGlvbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc0RpcmVjdGlvbl87Ci19Ci0KLWludAotbGVmaUxheWVyOjpoYXNSZXNpc3RhbmNlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzUmVzaXN0YW5jZV87Ci19Ci0KLWludAotbGVmaUxheWVyOjpoYXNDYXBhY2l0YW5jZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc0NhcGFjaXRhbmNlXzsKLX0KLQotaW50Ci1sZWZpTGF5ZXI6Omhhc0hlaWdodCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc0hlaWdodF87Ci19Ci0KLWludAotbGVmaUxheWVyOjpoYXNUaGlja25lc3MoKSBjb25zdAotewotICAgIHJldHVybiBoYXNUaGlja25lc3NfOwotfQotCi1pbnQKLWxlZmlMYXllcjo6aGFzU2hyaW5rYWdlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzU2hyaW5rYWdlXzsKLX0KLQotaW50Ci1sZWZpTGF5ZXI6Omhhc0NhcE11bHRpcGxpZXIoKSBjb25zdAotewotICAgIHJldHVybiBoYXNDYXBNdWx0aXBsaWVyXzsKLX0KLQotaW50Ci1sZWZpTGF5ZXI6Omhhc0VkZ2VDYXAoKSBjb25zdAotewotICAgIHJldHVybiBoYXNFZGdlQ2FwXzsKLX0KLQotaW50Ci1sZWZpTGF5ZXI6Omhhc0FudGVubmFBcmVhKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzQW50ZW5uYUFyZWFfOwotfQotCi1pbnQKLWxlZmlMYXllcjo6aGFzQW50ZW5uYUxlbmd0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc0FudGVubmFMZW5ndGhfOwotfQotCi1pbnQKLWxlZmlMYXllcjo6aGFzQ3VycmVudERlbnNpdHlQb2ludCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc0N1cnJlbnREZW5zaXR5UG9pbnRfOwotfQotCi1pbnQKLWxlZmlMYXllcjo6aGFzQ3VycmVudERlbnNpdHlBcnJheSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG51bUN1cnJlbnRQb2ludHNfID8gMSA6IDA7Ci19Ci0KLWludAotbGVmaUxheWVyOjpoYXNSZXNpc3RhbmNlQXJyYXkoKSBjb25zdAotewotICAgIHJldHVybiBudW1SZXNpc3RhbmNlUG9pbnRzXyA/IDEgOiAwOwotfQotCi1pbnQKLWxlZmlMYXllcjo6aGFzQ2FwYWNpdGFuY2VBcnJheSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG51bUNhcGFjaXRhbmNlUG9pbnRzXyA/IDEgOiAwOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OmN1cnJlbnREZW5zaXR5QXJyYXkoaW50ICAgICAgKm51bVBvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAqKndpZHRocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAqKmN1cnJlbnQpIGNvbnN0Ci17Ci0gICAgKm51bVBvaW50cyA9IG51bUN1cnJlbnRQb2ludHNfOwotICAgICp3aWR0aHMgPSBjdXJyZW50V2lkdGhzXzsKLSAgICAqY3VycmVudCA9IGN1cnJlbnRfOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OnJlc2lzdGFuY2VBcnJheShpbnQgICAgICAqbnVtUG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgKip3aWR0aHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAqKnJlcykgY29uc3QKLXsKLSAgICAqbnVtUG9pbnRzID0gbnVtUmVzaXN0YW5jZVBvaW50c187Ci0gICAgKndpZHRocyA9IHJlc2lzdGFuY2VXaWR0aHNfOwotICAgICpyZXMgPSByZXNpc3RhbmNlc187Ci19Ci0KLXZvaWQKLWxlZmlMYXllcjo6Y2FwYWNpdGFuY2VBcnJheShpbnQgICAgICpudW1Qb2ludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAqKndpZHRocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICoqY2FwKSBjb25zdAotewotICAgICpudW1Qb2ludHMgPSBudW1DYXBhY2l0YW5jZVBvaW50c187Ci0gICAgKndpZHRocyA9IGNhcGFjaXRhbmNlV2lkdGhzXzsKLSAgICAqY2FwID0gY2FwYWNpdGFuY2VzXzsKLX0KLQotaW50Ci1sZWZpTGF5ZXI6Om51bVNwYWNpbmcoKSBjb25zdAotewotICAgIHJldHVybiBudW1TcGFjaW5nc187Ci19Ci0KLWNoYXIgKgotbGVmaUxheWVyOjpuYW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbmFtZV87Ci19Ci0KLWNvbnN0IGNoYXIgKgotbGVmaUxheWVyOjp0eXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gdHlwZV87Ci19Ci0KLS8vIDUuOAotY29uc3QgY2hhciAqCi1sZWZpTGF5ZXI6OmxheWVyVHlwZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGxheWVyVHlwZV87Ci19Ci0KLWRvdWJsZQotbGVmaUxheWVyOjpwaXRjaCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHBpdGNoWF87Ci19Ci0KLS8vIDUuNgotZG91YmxlCi1sZWZpTGF5ZXI6OnBpdGNoWCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHBpdGNoWF87Ci19Ci0KLS8vIDUuNgotZG91YmxlCi1sZWZpTGF5ZXI6OnBpdGNoWSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHBpdGNoWV87Ci19Ci0KLWRvdWJsZQotbGVmaUxheWVyOjpvZmZzZXQoKSBjb25zdAotewotICAgIHJldHVybiBvZmZzZXRYXzsKLX0KLQotLy8gNS42Ci1kb3VibGUKLWxlZmlMYXllcjo6b2Zmc2V0WCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG9mZnNldFhfOwotfQotCi0vLyA1LjYKLWRvdWJsZQotbGVmaUxheWVyOjpvZmZzZXRZKCkgY29uc3QKLXsKLSAgICByZXR1cm4gb2Zmc2V0WV87Ci19Ci0KLWRvdWJsZQotbGVmaUxheWVyOjp3aWR0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHdpZHRoXzsKLX0KLQotZG91YmxlCi1sZWZpTGF5ZXI6OmFyZWEoKSBjb25zdAotewotICAgIHJldHVybiBhcmVhXzsKLX0KLQotLy8gNS42Ci1kb3VibGUKLWxlZmlMYXllcjo6ZGlhZ1BpdGNoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZGlhZ1BpdGNoWF87Ci19Ci0KLS8vIDUuNgotZG91YmxlCi1sZWZpTGF5ZXI6OmRpYWdQaXRjaFgoKSBjb25zdAotewotICAgIHJldHVybiBkaWFnUGl0Y2hYXzsKLX0KLQotLy8gNS42Ci1kb3VibGUKLWxlZmlMYXllcjo6ZGlhZ1BpdGNoWSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGRpYWdQaXRjaFlfOwotfQotCi0vLyA1LjYKLWRvdWJsZQotbGVmaUxheWVyOjpkaWFnV2lkdGgoKSBjb25zdAotewotICAgIHJldHVybiBkaWFnV2lkdGhfOwotfQotCi0vLyA1LjYKLWRvdWJsZQotbGVmaUxheWVyOjpkaWFnU3BhY2luZygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGRpYWdTcGFjaW5nXzsKLX0KLQotZG91YmxlCi1sZWZpTGF5ZXI6OndpcmVFeHRlbnNpb24oKSBjb25zdAotewotICAgIHJldHVybiB3aXJlRXh0ZW5zaW9uXzsKLX0KLQotZG91YmxlCi1sZWZpTGF5ZXI6OnNwYWNpbmcoaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiBzcGFjaW5nX1tpbmRleF07Ci19Ci0KLWNoYXIgKgotbGVmaUxheWVyOjpzcGFjaW5nTmFtZShpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHNwYWNpbmdOYW1lX1tpbmRleF07Ci19Ci0KLWludAotbGVmaUxheWVyOjpzcGFjaW5nQWRqYWNlbnRDdXRzKGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gc3BhY2luZ0FkamFjZW50Q3V0c19baW5kZXhdOwotfQotCi1kb3VibGUKLWxlZmlMYXllcjo6c3BhY2luZ0FkamFjZW50V2l0aGluKGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gc3BhY2luZ0FkamFjZW50V2l0aGluX1tpbmRleF07Ci19Ci0KLWRvdWJsZQotbGVmaUxheWVyOjpzcGFjaW5nQXJlYShpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHNwYWNpbmdDdXRBcmVhX1tpbmRleF07Ci19Ci0KLWRvdWJsZQotbGVmaUxheWVyOjpzcGFjaW5nUmFuZ2VNaW4oaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiByYW5nZU1pbl9baW5kZXhdOwotfQotCi1kb3VibGUKLWxlZmlMYXllcjo6c3BhY2luZ1JhbmdlTWF4KGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gcmFuZ2VNYXhfW2luZGV4XTsKLX0KLQotZG91YmxlCi1sZWZpTGF5ZXI6OnNwYWNpbmdSYW5nZUluZmx1ZW5jZShpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJhbmdlSW5mbHVlbmNlX1tpbmRleF07Ci19Ci0KLWRvdWJsZQotbGVmaUxheWVyOjpzcGFjaW5nUmFuZ2VJbmZsdWVuY2VNaW4oaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiByYW5nZUluZmx1ZW5jZVJhbmdlTWluX1tpbmRleF07Ci19Ci0KLWRvdWJsZQotbGVmaUxheWVyOjpzcGFjaW5nUmFuZ2VJbmZsdWVuY2VNYXgoaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiByYW5nZUluZmx1ZW5jZVJhbmdlTWF4X1tpbmRleF07Ci19Ci0KLWRvdWJsZQotbGVmaUxheWVyOjpzcGFjaW5nUmFuZ2VSYW5nZU1pbihpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJhbmdlUmFuZ2VNaW5fW2luZGV4XTsKLX0KLQotZG91YmxlCi1sZWZpTGF5ZXI6OnNwYWNpbmdSYW5nZVJhbmdlTWF4KGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gcmFuZ2VSYW5nZU1heF9baW5kZXhdOwotfQotCi1kb3VibGUKLWxlZmlMYXllcjo6c3BhY2luZ0xlbmd0aFRocmVzaG9sZChpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGxlbmd0aFRocmVzaG9sZF9baW5kZXhdOwotfQotCi1kb3VibGUKLWxlZmlMYXllcjo6c3BhY2luZ0xlbmd0aFRocmVzaG9sZFJhbmdlTWluKGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gbGVuZ3RoVGhyZXNob2xkUmFuZ2VNaW5fW2luZGV4XTsKLX0KLQotZG91YmxlCi1sZWZpTGF5ZXI6OnNwYWNpbmdMZW5ndGhUaHJlc2hvbGRSYW5nZU1heChpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGxlbmd0aFRocmVzaG9sZFJhbmdlTWF4X1tpbmRleF07Ci19Ci0KLS8vIDUuNwotZG91YmxlCi1sZWZpTGF5ZXI6OnNwYWNpbmdFb2xXaWR0aChpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGVvbFdpZHRoX1tpbmRleF07Ci19Ci0KLS8vIDUuNwotZG91YmxlCi1sZWZpTGF5ZXI6OnNwYWNpbmdFb2xXaXRoaW4oaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiBlb2xXaXRoaW5fW2luZGV4XTsKLX0KLQotLy8gNS43Ci1kb3VibGUKLWxlZmlMYXllcjo6c3BhY2luZ1BhclNwYWNlKGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gcGFyU3BhY2VfW2luZGV4XTsKLX0KLQotLy8gNS43Ci1kb3VibGUKLWxlZmlMYXllcjo6c3BhY2luZ1BhcldpdGhpbihpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHBhcldpdGhpbl9baW5kZXhdOwotfQotCi0vLyA1LjcKLWRvdWJsZQotbGVmaUxheWVyOjpzcGFjaW5nTm90Y2hMZW5ndGgoaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiBub3RjaExlbmd0aF9baW5kZXhdOwotfQotCi0vLyA1LjcKLWRvdWJsZQotbGVmaUxheWVyOjpzcGFjaW5nRW5kT2ZOb3RjaFdpZHRoKGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gZW5kT2ZOb3RjaFdpZHRoX1tpbmRleF07Ci19Ci0KLS8vIDUuNwotZG91YmxlCi1sZWZpTGF5ZXI6OnNwYWNpbmdFbmRPZk5vdGNoU3BhY2luZyhpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1pbk5vdGNoU3BhY2luZ19baW5kZXhdOwotfQotCi0vLyA1LjcKLWRvdWJsZQotbGVmaUxheWVyOjpzcGFjaW5nRW5kT2ZOb3RjaExlbmd0aChpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGVvbm90Y2hMZW5ndGhfW2luZGV4XTsKLX0KLQotY29uc3QgY2hhciAqCi1sZWZpTGF5ZXI6OmRpcmVjdGlvbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGRpcmVjdGlvbl87Ci19Ci0KLWRvdWJsZQotbGVmaUxheWVyOjpjdXJyZW50RGVuc2l0eVBvaW50KCkgY29uc3QKLXsKLSAgICByZXR1cm4gY3VycmVudERlbnNpdHlfOwotfQotCi1kb3VibGUKLWxlZmlMYXllcjo6cmVzaXN0YW5jZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJlc2lzdGFuY2VfOwotfQotCi1kb3VibGUKLWxlZmlMYXllcjo6Y2FwYWNpdGFuY2UoKSBjb25zdAotewotICAgIHJldHVybiBjYXBhY2l0YW5jZV87Ci19Ci0KLWRvdWJsZQotbGVmaUxheWVyOjpoZWlnaHQoKSBjb25zdAotewotICAgIHJldHVybiBoZWlnaHRfOwotfQotCi1kb3VibGUKLWxlZmlMYXllcjo6dGhpY2tuZXNzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gdGhpY2tuZXNzXzsKLX0KLQotZG91YmxlCi1sZWZpTGF5ZXI6OnNocmlua2FnZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHNocmlua2FnZV87Ci19Ci0KLWRvdWJsZQotbGVmaUxheWVyOjpjYXBNdWx0aXBsaWVyKCkgY29uc3QKLXsKLSAgICByZXR1cm4gY2FwTXVsdGlwbGllcl87Ci19Ci0KLWRvdWJsZQotbGVmaUxheWVyOjplZGdlQ2FwKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZWRnZUNhcF87Ci19Ci0KLWRvdWJsZQotbGVmaUxheWVyOjphbnRlbm5hTGVuZ3RoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gYW50ZW5uYUxlbmd0aF87Ci19Ci0KLWRvdWJsZQotbGVmaUxheWVyOjphbnRlbm5hQXJlYSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGFudGVubmFBcmVhXzsKLX0KLQotLy8gNS41Ci1pbnQKLWxlZmlMYXllcjo6bnVtTWluaW11bWN1dCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG51bU1pbmltdW1jdXRfOwotfQotCi0vLyA1LjUKLWludAotbGVmaUxheWVyOjptaW5pbXVtY3V0KGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gbWluaW11bWN1dF9baW5kZXhdOwotfQotCi0vLyA1LjUKLWRvdWJsZQotbGVmaUxheWVyOjptaW5pbXVtY3V0V2lkdGgoaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiBtaW5pbXVtY3V0V2lkdGhfW2luZGV4XTsKLX0KLQotLy8gNS43Ci1pbnQKLWxlZmlMYXllcjo6aGFzTWluaW11bWN1dFdpdGhpbihpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc01pbmltdW1jdXRXaXRoaW5fW2luZGV4XTsKLX0KLQotLy8gNS43Ci1kb3VibGUKLWxlZmlMYXllcjo6bWluaW11bWN1dFdpdGhpbihpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1pbmltdW1jdXRXaXRoaW5fW2luZGV4XTsKLX0KLQotLy8gNS41Ci1pbnQKLWxlZmlMYXllcjo6aGFzTWluaW11bWN1dENvbm5lY3Rpb24oaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiBoYXNNaW5pbXVtY3V0Q29ubmVjdGlvbl9baW5kZXhdOwotfQotCi0vLyA1LjUKLWNvbnN0IGNoYXIgKgotbGVmaUxheWVyOjptaW5pbXVtY3V0Q29ubmVjdGlvbihpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1pbmltdW1jdXRDb25uZWN0aW9uX1tpbmRleF07Ci19Ci0KLS8vIDUuNQotaW50Ci1sZWZpTGF5ZXI6Omhhc01pbmltdW1jdXROdW1DdXRzKGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzTWluaW11bWN1dE51bUN1dHNfW2luZGV4XTsKLX0KLQotLy8gNS41Ci1kb3VibGUKLWxlZmlMYXllcjo6bWluaW11bWN1dExlbmd0aChpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1pbmltdW1jdXRMZW5ndGhfW2luZGV4XTsKLX0KLQotLy8gNS41Ci1kb3VibGUKLWxlZmlMYXllcjo6bWluaW11bWN1dERpc3RhbmNlKGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gbWluaW11bWN1dERpc3RhbmNlX1tpbmRleF07Ci19Ci0KLS8vIDUuNQotaW50Ci1sZWZpTGF5ZXI6Omhhc01heHdpZHRoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbWF4d2lkdGhfID09IC0xID8gMCA6IDE7Ci19Ci0KLS8vIDUuNQotZG91YmxlCi1sZWZpTGF5ZXI6Om1heHdpZHRoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbWF4d2lkdGhfOwotfQotCi0vLyA1LjUKLWludAotbGVmaUxheWVyOjpoYXNNaW53aWR0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1pbndpZHRoXyA9PSAtMSA/IDAgOiAxOwotfQotCi0vLyA1LjUKLWRvdWJsZQotbGVmaUxheWVyOjptaW53aWR0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1pbndpZHRoXzsKLX0KLQotLy8gNS44Ci1pbnQKLWxlZmlMYXllcjo6bWFzaygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1hc2tOdW1iZXJfOwotfQotCi0vLyA1LjUKLWludAotbGVmaUxheWVyOjpudW1NaW5lbmNsb3NlZGFyZWEoKSBjb25zdAotewotICAgIHJldHVybiBudW1NaW5lbmNsb3NlZGFyZWFfOwotfQotCi0vLyA1LjUKLWludAotbGVmaUxheWVyOjpoYXNNaW5lbmNsb3NlZGFyZWFXaWR0aChpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1pbmVuY2xvc2VkYXJlYVdpZHRoX1tpbmRleF0gPT0gLTEgPyAwIDogMTsKLX0KLQotLy8gNS41Ci1kb3VibGUKLWxlZmlMYXllcjo6bWluZW5jbG9zZWRhcmVhKGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gbWluZW5jbG9zZWRhcmVhX1tpbmRleF07Ci19Ci0KLS8vIDUuNQotZG91YmxlCi1sZWZpTGF5ZXI6Om1pbmVuY2xvc2VkYXJlYVdpZHRoKGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gbWluZW5jbG9zZWRhcmVhV2lkdGhfW2luZGV4XTsKLX0KLQotLy8gNS41ICYgNS42Ci1pbnQKLWxlZmlMYXllcjo6aGFzTWluc3RlcCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG51bU1pbnN0ZXBfPyAxIDogMDsKLX0KLQotLy8gNS41Ci1pbnQKLWxlZmlMYXllcjo6aGFzUHJvdHJ1c2lvbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHByb3RydXNpb25XaWR0aDFfID09IC0xID8gMCA6IDE7Ci19Ci0KLS8vIDUuNQotZG91YmxlCi1sZWZpTGF5ZXI6OnByb3RydXNpb25XaWR0aDEoKSBjb25zdAotewotICAgIHJldHVybiBwcm90cnVzaW9uV2lkdGgxXzsKLX0KLQotLy8gNS41Ci1kb3VibGUKLWxlZmlMYXllcjo6cHJvdHJ1c2lvbkxlbmd0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHByb3RydXNpb25MZW5ndGhfOwotfQotCi0vLyA1LjUKLWRvdWJsZQotbGVmaUxheWVyOjpwcm90cnVzaW9uV2lkdGgyKCkgY29uc3QKLXsKLSAgICByZXR1cm4gcHJvdHJ1c2lvbldpZHRoMl87Ci19Ci0KLXZvaWQKLWxlZmlMYXllcjo6cHJpbnQoRklMRSAqZikgY29uc3QKLXsKLSAgICBpbnQgICAgIGksIG1heDsKLSAgICBkb3VibGUgICpqOwotICAgIGRvdWJsZSAgKms7Ci0gICAgZnByaW50ZihmLCAiTGF5ZXIgJXM6XG4iLCBuYW1lKCkpOwotICAgIGlmIChoYXNUeXBlKCkpCi0gICAgICAgIGZwcmludGYoZiwgIiAgdHlwZSAlc1xuIiwgdHlwZSgpKTsKLSAgICBpZiAoaGFzTWFzaygpKQotICAgICAgICBmcHJpbnRmKGYsICIgIG1hc2sgJWRcbiIsIG1hc2soKSk7Ci0gICAgaWYgKGhhc1BpdGNoKCkpCi0gICAgICAgIGZwcmludGYoZiwgIiAgcGl0Y2ggJWdcbiIsIHBpdGNoKCkpOwotICAgIGlmIChoYXNXaXJlRXh0ZW5zaW9uKCkpCi0gICAgICAgIGZwcmludGYoZiwgIiAgd2lyZWV4dGVuc2lvbiAlZ1xuIiwgd2lyZUV4dGVuc2lvbigpKTsKLSAgICBpZiAoaGFzV2lkdGgoKSkKLSAgICAgICAgZnByaW50ZihmLCAiICB3aWR0aCAlZ1xuIiwgd2lkdGgoKSk7Ci0gICAgaWYgKGhhc0FyZWEoKSkKLSAgICAgICAgZnByaW50ZihmLCAiICBhcmVhICVnXG4iLCBhcmVhKCkpOwotICAgIGlmIChoYXNTcGFjaW5nTnVtYmVyKCkpIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVNwYWNpbmcoKTsgaSsrKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKGYsICIgIHNwYWNpbmcgJWdcbiIsIHNwYWNpbmcoaSkpOwotICAgICAgICAgICAgaWYgKGhhc1NwYWNpbmdSYW5nZShpKSkgewotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiAgcmFuZ2UgJWcgJWdcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzcGFjaW5nUmFuZ2VNaW4oaSksCi0gICAgICAgICAgICAgICAgICAgICAgICBzcGFjaW5nUmFuZ2VNYXgoaSkpOwotICAgICAgICAgICAgICAgIGlmIChoYXNTcGFjaW5nUmFuZ2VVc2VMZW5ndGhUaHJlc2hvbGQoaSkpCi0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiAgICB1c2VsZW5ndGh0aHJlc2hvbGRcbiIpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhhc1NwYWNpbmdSYW5nZUluZmx1ZW5jZShpKSkgewotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIgICAgaW5mbHVlbmNlICVnXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmdSYW5nZUluZmx1ZW5jZShpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoYXNTcGFjaW5nUmFuZ2VJbmZsdWVuY2VSYW5nZShpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiAgICAgIFJhbmdlICVnICVnXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjaW5nUmFuZ2VJbmZsdWVuY2VNaW4oaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmdSYW5nZUluZmx1ZW5jZU1heChpKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoYXNTcGFjaW5nUmFuZ2VSYW5nZShpKSkKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmLCAiICAgIHJhbmdlICVnICVnXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmdSYW5nZVJhbmdlTWluKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmdSYW5nZVJhbmdlTWF4KGkpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaGFzU3BhY2luZ0xlbmd0aFRocmVzaG9sZChpKSkgewotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiAgbGVuZ3RodGhyZXNob2xkICVnXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2luZ0xlbmd0aFRocmVzaG9sZChpKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGhhc1NwYWNpbmdMZW5ndGhUaHJlc2hvbGRSYW5nZShpKSkKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmLCAiICByYW5nZSAlZyAlZ1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjaW5nTGVuZ3RoVGhyZXNob2xkUmFuZ2VNaW4oaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2luZ0xlbmd0aFRocmVzaG9sZFJhbmdlTWF4KGkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoaGFzRGlyZWN0aW9uKCkpCi0gICAgICAgIGZwcmludGYoZiwgIiAgZGlyZWN0aW9uICVzXG4iLCBkaXJlY3Rpb24oKSk7Ci0KLSAgICBpZiAoaGFzUmVzaXN0YW5jZSgpKQotICAgICAgICBmcHJpbnRmKGYsICIgIHJlc2lzdGFuY2UgJWdcbiIsIHJlc2lzdGFuY2UoKSk7Ci0gICAgaWYgKGhhc1Jlc2lzdGFuY2VBcnJheSgpKSB7Ci0gICAgICAgIHJlc2lzdGFuY2VBcnJheSgmbWF4LCAmaiwgJmspOwotICAgICAgICBmcHJpbnRmKGYsICIgIHJlc2lzdGFuY2UgUFdMIik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykKLSAgICAgICAgICAgIGZwcmludGYoZiwgIiAlZyAlZyIsIGpbaV0sIGtbaV0pOwotICAgICAgICBmcHJpbnRmKGYsICJcbiIpOwotICAgIH0KLSAgICBpZiAoaGFzQ2FwYWNpdGFuY2UoKSkKLSAgICAgICAgZnByaW50ZihmLCAiICBjYXBhY2l0YW5jZSAlZ1xuIiwgY2FwYWNpdGFuY2UoKSk7Ci0gICAgaWYgKGhhc0NhcGFjaXRhbmNlQXJyYXkoKSkgewotICAgICAgICBjYXBhY2l0YW5jZUFycmF5KCZtYXgsICZqLCAmayk7Ci0gICAgICAgIGZwcmludGYoZiwgIiAgY2FwYWNpdGFuY2UgUFdMIik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykKLSAgICAgICAgICAgIGZwcmludGYoZiwgIiAlZyAlZyIsIGpbaV0sIGtbaV0pOwotICAgICAgICBmcHJpbnRmKGYsICJcbiIpOwotICAgIH0KLQotICAgIGlmIChoYXNIZWlnaHQoKSkKLSAgICAgICAgZnByaW50ZihmLCAiICBoZWlnaHQgJWdcbiIsIGhlaWdodCgpKTsKLSAgICBpZiAoaGFzVGhpY2tuZXNzKCkpCi0gICAgICAgIGZwcmludGYoZiwgIiAgdGhpY2tuZXNzICVnXG4iLCB0aGlja25lc3MoKSk7Ci0gICAgaWYgKGhhc1Nocmlua2FnZSgpKQotICAgICAgICBmcHJpbnRmKGYsICIgIHNocmlua2FnZSAlZ1xuIiwgc2hyaW5rYWdlKCkpOwotICAgIGlmIChoYXNDYXBNdWx0aXBsaWVyKCkpCi0gICAgICAgIGZwcmludGYoZiwgIiAgY2FwIG11cHRpcGxpZXIgJWdcbiIsIGNhcE11bHRpcGxpZXIoKSk7Ci0gICAgaWYgKGhhc0VkZ2VDYXAoKSkKLSAgICAgICAgZnByaW50ZihmLCAiICBlZGdlIGNhcCAlZ1xuIiwgZWRnZUNhcCgpKTsKLQotICAgIGlmIChoYXNDdXJyZW50RGVuc2l0eVBvaW50KCkpCi0gICAgICAgIGZwcmludGYoZiwgIiAgY3VycmVudGRlbiAlZ1xuIiwgY3VycmVudERlbnNpdHlQb2ludCgpKTsKLSAgICBpZiAoaGFzQ3VycmVudERlbnNpdHlBcnJheSgpKSB7Ci0gICAgICAgIGN1cnJlbnREZW5zaXR5QXJyYXkoJm1heCwgJmosICZrKTsKLSAgICAgICAgZnByaW50ZihmLCAiICBjdXJyZW50ZGVuIFBXTCIpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspCi0gICAgICAgICAgICBmcHJpbnRmKGYsICIgJWcgJWciLCBqW2ldLCBrW2ldKTsKLSAgICAgICAgZnByaW50ZihmLCAiXG4iKTsKLSAgICB9Ci19Ci0KLXZvaWQKLWxlZmlMYXllcjo6YWRkUHJvcChjb25zdCBjaGFyICAgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgdHlwZSkKLXsKLSAgICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLSAgICAvLyBjaGFyKiAgdHZhbHVlOwotICAgIC8vIGludCAgICB2bGVuLCBpOwotICAgIGlmIChudW1Qcm9wc18gPT0gcHJvcHNBbGxvY2F0ZWRfKSB7Ci0gICAgICAgIGludCAgICAgaTsKLSAgICAgICAgaW50ICAgICBtYXg7Ci0gICAgICAgIGludCAgICAgbGltID0gbnVtUHJvcHNfOwotICAgICAgICBjaGFyICAgICoqbm47Ci0gICAgICAgIGNoYXIgICAgKipudjsKLSAgICAgICAgZG91YmxlICAqbmQ7Ci0gICAgICAgIGNoYXIgICAgKm50OwotCi0gICAgICAgIGlmIChwcm9wc0FsbG9jYXRlZF8gPT0gMCkKLSAgICAgICAgICAgIG1heCA9IHByb3BzQWxsb2NhdGVkXyA9IDI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1heCA9IHByb3BzQWxsb2NhdGVkXyAqPSAyOwotICAgICAgICBubiA9IChjaGFyKiopIGxlZk1hbGxvYyhzaXplb2YoY2hhciopICogbWF4KTsKLSAgICAgICAgbnYgPSAoY2hhcioqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIqKSAqIG1heCk7Ci0gICAgICAgIG5kID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIG1heCk7Ci0gICAgICAgIG50ID0gKGNoYXIqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIpICogbWF4KTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbTsgaSsrKSB7Ci0gICAgICAgICAgICBubltpXSA9IG5hbWVzX1tpXTsKLSAgICAgICAgICAgIG52W2ldID0gdmFsdWVzX1tpXTsKLSAgICAgICAgICAgIG5kW2ldID0gZHZhbHVlc19baV07Ci0gICAgICAgICAgICBudFtpXSA9IHR5cGVzX1tpXTsKLSAgICAgICAgfQotICAgICAgICBsZWZGcmVlKChjaGFyKikgKG5hbWVzXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHZhbHVlc18pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChkdmFsdWVzXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHR5cGVzXykpOwotICAgICAgICBuYW1lc18gPSBubjsKLSAgICAgICAgdmFsdWVzXyA9IG52OwotICAgICAgICBkdmFsdWVzXyA9IG5kOwotICAgICAgICB0eXBlc18gPSBudDsKLSAgICB9Ci0gICAgbmFtZXNfW251bVByb3BzX10gPSAoY2hhciopIGxlZk1hbGxvYyhzaXplb2YoY2hhcikgKiBsZW4pOwotICAgIHN0cmNweShuYW1lc19bbnVtUHJvcHNfXSwgbmFtZSk7Ci0gICAgbGVuID0gc3RybGVuKHZhbHVlKSArIDE7Ci0gICAgdmFsdWVzX1tudW1Qcm9wc19dID0gKGNoYXIqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIpICogbGVuKTsKLSAgICBzdHJjcHkodmFsdWVzX1tudW1Qcm9wc19dLCB2YWx1ZSk7Ci0gICAgZHZhbHVlc19bbnVtUHJvcHNfXSA9IDA7Ci0gICAgLy9pZiAodHlwZSA9PSAnTicpIHsKLSAgICAvLyBpdCBpcyBhIG51bWJlciwgZG9uJ3Qga25vdyBpZiBpdCBpcyBhbiBpbnRlZ2VyIG9yIHJlYWwKLSAgICAvLyBMb29rIGZvciAuIGluIHRoZSB2YWx1ZQotICAgIC8vdHZhbHVlID0gKGNoYXIqKXZhbHVlOwotICAgIC8vdmxlbiA9IHN0cmxlbih2YWx1ZSk7Ci0gICAgLy9mb3IgKGkgPSAwOyBpIDwgdmxlbjsgaSsrKSB7IAotICAgIC8vaWYgKCp0dmFsdWUgPT0gJy4nKSB7Ci0gICAgLy90eXBlc19bbnVtUHJvcHNfXSA9ICdSJzsKLSAgICAvL2JyZWFrOwotICAgIC8vfQotICAgIC8vKyt0dmFsdWU7Ci0gICAgLy90eXBlc19bbnVtUHJvcHNfXSA9IHR5cGU7Ci0gICAgLy99Ci0gICAgLy99IGVsc2UKLSAgICB0eXBlc19bbnVtUHJvcHNfXSA9IHR5cGU7Ci0gICAgbnVtUHJvcHNfICs9IDE7Ci19Ci0KLXZvaWQKLWxlZmlMYXllcjo6YWRkTnVtUHJvcChjb25zdCBjaGFyICAgICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSAgZCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgIHR5cGUpCi17Ci0gICAgaW50IGxlbiA9IHN0cmxlbihuYW1lKSArIDE7Ci0gICAgaWYgKG51bVByb3BzXyA9PSBwcm9wc0FsbG9jYXRlZF8pIHsKLSAgICAgICAgaW50ICAgICBpOwotICAgICAgICBpbnQgICAgIG1heDsKLSAgICAgICAgaW50ICAgICBsaW0gPSBudW1Qcm9wc187Ci0gICAgICAgIGNoYXIgICAgKipubjsKLSAgICAgICAgY2hhciAgICAqKm52OwotICAgICAgICBkb3VibGUgICpuZDsKLSAgICAgICAgY2hhciAgICAqbnQ7Ci0KLSAgICAgICAgaWYgKHByb3BzQWxsb2NhdGVkXyA9PSAwKQotICAgICAgICAgICAgbWF4ID0gcHJvcHNBbGxvY2F0ZWRfID0gMjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbWF4ID0gcHJvcHNBbGxvY2F0ZWRfICo9IDI7Ci0gICAgICAgIG5uID0gKGNoYXIqKikgbGVmTWFsbG9jKHNpemVvZihjaGFyKikgKiBtYXgpOwotICAgICAgICBudiA9IChjaGFyKiopIGxlZk1hbGxvYyhzaXplb2YoY2hhciopICogbWF4KTsKLSAgICAgICAgbmQgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbWF4KTsKLSAgICAgICAgbnQgPSAoY2hhciopIGxlZk1hbGxvYyhzaXplb2YoY2hhcikgKiBtYXgpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGltOyBpKyspIHsKLSAgICAgICAgICAgIG5uW2ldID0gbmFtZXNfW2ldOwotICAgICAgICAgICAgbnZbaV0gPSB2YWx1ZXNfW2ldOwotICAgICAgICAgICAgbmRbaV0gPSBkdmFsdWVzX1tpXTsKLSAgICAgICAgICAgIG50W2ldID0gdHlwZXNfW2ldOwotICAgICAgICB9Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAobmFtZXNfKSk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAodmFsdWVzXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGR2YWx1ZXNfKSk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAodHlwZXNfKSk7Ci0gICAgICAgIG5hbWVzXyA9IG5uOwotICAgICAgICB2YWx1ZXNfID0gbnY7Ci0gICAgICAgIGR2YWx1ZXNfID0gbmQ7Ci0gICAgICAgIHR5cGVzXyA9IG50OwotICAgIH0KLSAgICBuYW1lc19bbnVtUHJvcHNfXSA9IChjaGFyKikgbGVmTWFsbG9jKHNpemVvZihjaGFyKSAqIGxlbik7Ci0gICAgc3RyY3B5KG5hbWVzX1tudW1Qcm9wc19dLCBuYW1lKTsKLSAgICBsZW4gPSBzdHJsZW4odmFsdWUpICsgMTsKLSAgICB2YWx1ZXNfW251bVByb3BzX10gPSAoY2hhciopIGxlZk1hbGxvYyhzaXplb2YoY2hhcikgKiBsZW4pOwotICAgIHN0cmNweSh2YWx1ZXNfW251bVByb3BzX10sIHZhbHVlKTsKLSAgICBkdmFsdWVzX1tudW1Qcm9wc19dID0gZDsKLSAgICB0eXBlc19bbnVtUHJvcHNfXSA9IHR5cGU7Ci0gICAgbnVtUHJvcHNfICs9IDE7Ci19Ci0KLWludAotbGVmaUxheWVyOjpudW1Qcm9wcygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG51bVByb3BzXzsKLX0KLQotY29uc3QgY2hhciAqCi1sZWZpTGF5ZXI6OnByb3BOYW1lKGludCBpKSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGkgPCAwIHx8IGkgPj0gbnVtUHJvcHNfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTMwMCk6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBsYXllciBwcm9wZXJ0eSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaSwgbnVtUHJvcHNfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDEzMDAsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gbmFtZXNfW2ldOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlMYXllcjo6cHJvcFZhbHVlKGludCBpKSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGkgPCAwIHx8IGkgPj0gbnVtUHJvcHNfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTMwMCk6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBsYXllciBwcm9wZXJ0eSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaSwgbnVtUHJvcHNfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDEzMDAsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gdmFsdWVzX1tpXTsKLX0KLQotZG91YmxlCi1sZWZpTGF5ZXI6OnByb3BOdW1iZXIoaW50IGkpIGNvbnN0Ci17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaSA8IDAgfHwgaSA+PSBudW1Qcm9wc18pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xMzAwKTogVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIGxheWVyIHByb3BlcnR5IGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQiLCBpLCBudW1Qcm9wc18pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTMwMCwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBkdmFsdWVzX1tpXTsKLX0KLQotY29uc3QgY2hhcgotbGVmaUxheWVyOjpwcm9wVHlwZShpbnQgaSkgY29uc3QKLXsKLSAgICBjaGFyIG1zZ1sxNjBdOwotICAgIGlmIChpIDwgMCB8fCBpID49IG51bVByb3BzXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzMDApOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgbGF5ZXIgcHJvcGVydHkgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGksIG51bVByb3BzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxMzAwLCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHR5cGVzX1tpXTsKLX0KLQotaW50Ci1sZWZpTGF5ZXI6OnByb3BJc051bWJlcihpbnQgaSkgY29uc3QKLXsKLSAgICBjaGFyIG1zZ1sxNjBdOwotICAgIGlmIChpIDwgMCB8fCBpID49IG51bVByb3BzXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzMDApOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgbGF5ZXIgcHJvcGVydHkgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGksIG51bVByb3BzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxMzAwLCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIGR2YWx1ZXNfW2ldID8gMSA6IDA7Ci19Ci0KLWludAotbGVmaUxheWVyOjpwcm9wSXNTdHJpbmcoaW50IGkpIGNvbnN0Ci17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaSA8IDAgfHwgaSA+PSBudW1Qcm9wc18pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xMzAwKTogVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIGxheWVyIHByb3BlcnR5IGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQiLCBpLCBudW1Qcm9wc18pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTMwMCwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBkdmFsdWVzX1tpXSA/IDAgOiAxOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OmFkZEFjY3VycmVudERlbnNpdHkoY29uc3QgY2hhciAqdHlwZSkKLXsKLSAgICBsZWZpTGF5ZXJEZW5zaXR5ICpkZW5zaXR5OwotICAgIGlmIChudW1BY2N1cnJlbnRzXyA9PSBhY2N1cnJlbnRBbGxvY2F0ZWRfKSB7Ci0gICAgICAgIGxlZmlMYXllckRlbnNpdHkgICAgKiphcnJheTsKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICBpOwotICAgICAgICBhY2N1cnJlbnRBbGxvY2F0ZWRfID0gYWNjdXJyZW50QWxsb2NhdGVkXyA/Ci0gICAgICAgICAgICBhY2N1cnJlbnRBbGxvY2F0ZWRfICogMiA6IDI7Ci0gICAgICAgIGFycmF5ID0gKGxlZmlMYXllckRlbnNpdHkqKikgbGVmTWFsbG9jKHNpemVvZihsZWZpTGF5ZXJEZW5zaXR5KikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhY2N1cnJlbnRBbGxvY2F0ZWRfKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUFjY3VycmVudHNfOyBpKyspCi0gICAgICAgICAgICBhcnJheVtpXSA9IGFjY3VycmVudHNfW2ldOwotICAgICAgICBpZiAoYWNjdXJyZW50c18pCi0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKGFjY3VycmVudHNfKSk7Ci0gICAgICAgIGFjY3VycmVudHNfID0gYXJyYXk7Ci0gICAgfQotICAgIGRlbnNpdHkgPSBhY2N1cnJlbnRzX1tudW1BY2N1cnJlbnRzX10gPQotICAgICAgICAobGVmaUxheWVyRGVuc2l0eSopIGxlZk1hbGxvYyhzaXplb2YobGVmaUxheWVyRGVuc2l0eSkpOwotICAgIG51bUFjY3VycmVudHNfICs9IDE7Ci0gICAgZGVuc2l0eS0+SW5pdCh0eXBlKTsKLX0KLQotdm9pZAotbGVmaUxheWVyOjpzZXRBY09uZUVudHJ5KGRvdWJsZSBudW0pCi17Ci0gICAgbGVmaUxheWVyRGVuc2l0eSAqZGVuc2l0eTsKLSAgICBkZW5zaXR5ID0gYWNjdXJyZW50c19bbnVtQWNjdXJyZW50c18gLSAxXTsKLSAgICBkZW5zaXR5LT5zZXRPbmVFbnRyeShudW0pOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OmFkZEFjRnJlcXVlbmN5KCkKLXsKLSAgICBsZWZpTGF5ZXJEZW5zaXR5ICpkZW5zaXR5OwotICAgIGRlbnNpdHkgPSBhY2N1cnJlbnRzX1tudW1BY2N1cnJlbnRzXyAtIDFdOwotICAgIGRlbnNpdHktPmFkZEZyZXF1ZW5jeShudW1OdW1zXywgbnVtc18pOwotICAgIG51bU51bXNfID0gMDsKLSAgICBudW1BbGxvY2F0ZWRfID0gMDsKLSAgICBudW1zXyA9IDA7Ci19Ci0KLXZvaWQKLWxlZmlMYXllcjo6YWRkQWNDdXRhcmVhKCkKLXsKLSAgICBsZWZpTGF5ZXJEZW5zaXR5ICpkZW5zaXR5OwotICAgIGRlbnNpdHkgPSBhY2N1cnJlbnRzX1tudW1BY2N1cnJlbnRzXyAtIDFdOwotICAgIGRlbnNpdHktPmFkZEN1dGFyZWEobnVtTnVtc18sIG51bXNfKTsKLSAgICBudW1OdW1zXyA9IDA7Ci0gICAgbnVtQWxsb2NhdGVkXyA9IDA7Ci0gICAgbnVtc18gPSAwOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OmFkZEFjVGFibGVFbnRyeSgpCi17Ci0gICAgbGVmaUxheWVyRGVuc2l0eSAqZGVuc2l0eTsKLSAgICBkZW5zaXR5ID0gYWNjdXJyZW50c19bbnVtQWNjdXJyZW50c18gLSAxXTsKLSAgICBkZW5zaXR5LT5hZGRUYWJsZUVudHJ5KG51bU51bXNfLCBudW1zXyk7Ci0gICAgbnVtTnVtc18gPSAwOwotICAgIG51bUFsbG9jYXRlZF8gPSAwOwotICAgIG51bXNfID0gMDsKLX0KLQotdm9pZAotbGVmaUxheWVyOjphZGRBY1dpZHRoKCkKLXsKLSAgICBsZWZpTGF5ZXJEZW5zaXR5ICpkZW5zaXR5OwotICAgIGRlbnNpdHkgPSBhY2N1cnJlbnRzX1tudW1BY2N1cnJlbnRzXyAtIDFdOwotICAgIGRlbnNpdHktPmFkZFdpZHRoKG51bU51bXNfLCBudW1zXyk7Ci0gICAgbnVtTnVtc18gPSAwOwotICAgIG51bUFsbG9jYXRlZF8gPSAwOwotICAgIG51bXNfID0gMDsKLX0KLQotdm9pZAotbGVmaUxheWVyOjpzZXREY09uZUVudHJ5KGRvdWJsZSBudW0pCi17Ci0gICAgbGVmaUxheWVyRGVuc2l0eSAqZGVuc2l0eTsKLSAgICBkZW5zaXR5ID0gZGNjdXJyZW50c19bbnVtRGNjdXJyZW50c18gLSAxXTsKLSAgICBkZW5zaXR5LT5zZXRPbmVFbnRyeShudW0pOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OmFkZERjY3VycmVudERlbnNpdHkoY29uc3QgY2hhciAqdHlwZSkKLXsKLSAgICBsZWZpTGF5ZXJEZW5zaXR5ICpkZW5zaXR5OwotICAgIGlmIChudW1EY2N1cnJlbnRzXyA9PSBkY2N1cnJlbnRBbGxvY2F0ZWRfKSB7Ci0gICAgICAgIGxlZmlMYXllckRlbnNpdHkgICAgKiphcnJheTsKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICBpOwotICAgICAgICBkY2N1cnJlbnRBbGxvY2F0ZWRfID0gZGNjdXJyZW50QWxsb2NhdGVkXyA/Ci0gICAgICAgICAgICBkY2N1cnJlbnRBbGxvY2F0ZWRfICogMiA6IDI7Ci0gICAgICAgIGFycmF5ID0gKGxlZmlMYXllckRlbnNpdHkqKikgbGVmTWFsbG9jKHNpemVvZihsZWZpTGF5ZXJEZW5zaXR5KikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBkY2N1cnJlbnRBbGxvY2F0ZWRfKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bURjY3VycmVudHNfOyBpKyspCi0gICAgICAgICAgICBhcnJheVtpXSA9IGRjY3VycmVudHNfW2ldOwotICAgICAgICBpZiAoZGNjdXJyZW50c18pCi0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKGRjY3VycmVudHNfKSk7Ci0gICAgICAgIGRjY3VycmVudHNfID0gYXJyYXk7Ci0gICAgfQotICAgIGRlbnNpdHkgPSBkY2N1cnJlbnRzX1tudW1EY2N1cnJlbnRzX10gPQotICAgICAgICAobGVmaUxheWVyRGVuc2l0eSopIGxlZk1hbGxvYyhzaXplb2YobGVmaUxheWVyRGVuc2l0eSkpOwotICAgIG51bURjY3VycmVudHNfICs9IDE7Ci0gICAgZGVuc2l0eS0+SW5pdCh0eXBlKTsKLX0KLQotdm9pZAotbGVmaUxheWVyOjphZGREY0N1dGFyZWEoKQotewotICAgIGxlZmlMYXllckRlbnNpdHkgKmRlbnNpdHk7Ci0gICAgZGVuc2l0eSA9IGRjY3VycmVudHNfW251bURjY3VycmVudHNfIC0gMV07Ci0gICAgZGVuc2l0eS0+YWRkQ3V0YXJlYShudW1OdW1zXywgbnVtc18pOwotICAgIG51bU51bXNfID0gMDsKLSAgICBudW1BbGxvY2F0ZWRfID0gMDsKLSAgICBudW1zXyA9IDA7Ci19Ci0KLXZvaWQKLWxlZmlMYXllcjo6YWRkRGNUYWJsZUVudHJ5KCkKLXsKLSAgICBsZWZpTGF5ZXJEZW5zaXR5ICpkZW5zaXR5OwotICAgIGRlbnNpdHkgPSBkY2N1cnJlbnRzX1tudW1EY2N1cnJlbnRzXyAtIDFdOwotICAgIGRlbnNpdHktPmFkZFRhYmxlRW50cnkobnVtTnVtc18sIG51bXNfKTsKLSAgICBudW1OdW1zXyA9IDA7Ci0gICAgbnVtQWxsb2NhdGVkXyA9IDA7Ci0gICAgbnVtc18gPSAwOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OmFkZERjV2lkdGgoKQotewotICAgIGxlZmlMYXllckRlbnNpdHkgKmRlbnNpdHk7Ci0gICAgZGVuc2l0eSA9IGRjY3VycmVudHNfW251bURjY3VycmVudHNfIC0gMV07Ci0gICAgZGVuc2l0eS0+YWRkV2lkdGgobnVtTnVtc18sIG51bXNfKTsKLSAgICBudW1OdW1zXyA9IDA7Ci0gICAgbnVtQWxsb2NhdGVkXyA9IDA7Ci0gICAgbnVtc18gPSAwOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OmFkZE51bWJlcihkb3VibGUgbnVtKQotewotICAgIGlmIChudW1OdW1zXyA9PSBudW1BbGxvY2F0ZWRfKSB7Ci0gICAgICAgIGRvdWJsZSAgKmFycmF5OwotICAgICAgICBpbnQgICAgIGk7Ci0gICAgICAgIG51bUFsbG9jYXRlZF8gPSBudW1BbGxvY2F0ZWRfID8KLSAgICAgICAgICAgIG51bUFsbG9jYXRlZF8gKiAyIDogMjsKLSAgICAgICAgYXJyYXkgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbnVtQWxsb2NhdGVkXyk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1OdW1zXzsgaSsrKQotICAgICAgICAgICAgYXJyYXlbaV0gPSBudW1zX1tpXTsKLSAgICAgICAgaWYgKG51bXNfKQotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChudW1zXykpOwotICAgICAgICBudW1zXyA9IGFycmF5OwotICAgIH0KLSAgICBudW1zX1tudW1OdW1zXysrXSA9IG51bTsKLX0KLQotaW50Ci1sZWZpTGF5ZXI6OmdldE51bWJlcigpCi17Ci0gICAgcmV0dXJuIG51bU51bXNfIC0gMTsKLX0KLQotaW50Ci1sZWZpTGF5ZXI6Omhhc0FjY3VycmVudERlbnNpdHkoKSBjb25zdAotewotICAgIHJldHVybiBudW1BY2N1cnJlbnRzXyA/IDEgOiAwOwotfQotCi1pbnQKLWxlZmlMYXllcjo6aGFzRGNjdXJyZW50RGVuc2l0eSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG51bURjY3VycmVudHNfID8gMSA6IDA7Ci19Ci0KLWludAotbGVmaUxheWVyOjpudW1BY2N1cnJlbnREZW5zaXR5KCkgY29uc3QKLXsKLSAgICByZXR1cm4gKG51bUFjY3VycmVudHNfKTsKLX0KLQotaW50Ci1sZWZpTGF5ZXI6Om51bURjY3VycmVudERlbnNpdHkoKSBjb25zdAotewotICAgIHJldHVybiAobnVtRGNjdXJyZW50c18pOwotfQotCi1sZWZpTGF5ZXJEZW5zaXR5ICoKLWxlZmlMYXllcjo6YWNjdXJyZW50KGludCBpbmRleCkgY29uc3QKLXsKLSAgICBpZiAoaW5kZXggPj0gbnVtQWNjdXJyZW50c18pCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiAoYWNjdXJyZW50c19baW5kZXhdKTsKLX0KLQotbGVmaUxheWVyRGVuc2l0eSAqCi1sZWZpTGF5ZXI6OmRjY3VycmVudChpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgaWYgKGluZGV4ID49IG51bURjY3VycmVudHNfKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gKGRjY3VycmVudHNfW2luZGV4XSk7Ci19Ci0KLS8vIDUuNQotdm9pZAotbGVmaUxheWVyOjphZGRBbnRlbm5hTW9kZWwoaW50IGFPeGlkZSkKLXsKLSAgICAgLy8gRm9yIHZlcnNpb24gNS41IG9ubHkgT1hJREUxLCBPWElERTIsIE9YSURFMywgJiBPWElERTQKLSAgICAvLyBhcmUgZGVmaW5lZCB3aXRoaW4gYSBtYWNybyBwaW4KLSAgICBsZWZpQW50ZW5uYU1vZGVsICphbW87Ci0gICAgaW50ICAgICAgICAgICAgICAgICBpOwotCi0gICAgaWYgKG51bUFudGVubmFNb2RlbF8gPT0gMCkgeyAgIC8vIGRvZXMgbm90IGhhdmUgYW50ZW5uYU1vZGVsCi0gICAgICAgIGFudGVubmFNb2RlbF8gPSAobGVmaUFudGVubmFNb2RlbCoqKQotICAgICAgICAgICAgbGVmTWFsbG9jKHNpemVvZihsZWZpQW50ZW5uYU1vZGVsKikgKiA0KTsKLSAgICAgICAgYW50ZW5uYU1vZGVsQWxsb2NhdGVkXyA9IDQ7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgICAgICAgIGFudGVubmFNb2RlbF9baV0gPSAobGVmaUFudGVubmFNb2RlbCopCi0gICAgICAgICAgICAgICAgbGVmTWFsbG9jKHNpemVvZihsZWZpQW50ZW5uYU1vZGVsKSk7Ci0gICAgICAgICAgICBhbnRlbm5hTW9kZWxfW2ldLT5Jbml0KCk7Ci0gICAgICAgICAgICAvLyBqdXN0IGluaXRpYWxpemUgaXQgZmlyc3QKLSAgICAgICAgfQotICAgICAgICBhbnRlbm5hTW9kZWxBbGxvY2F0ZWRfID0gNDsKLSAgICAgICAgYW1vID0gYW50ZW5uYU1vZGVsX1swXTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAvLyBGaXJzdCBjYW4gZ28gYW55IG94aWRlLCBzbyBmaWxsIHByZWYgb3hpZGVzIG1vZGVscy4KLSAgICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBhT3hpZGUgLSAxOyBpZHgrKykgewotICAgICAgICBhbW8gPSBhbnRlbm5hTW9kZWxfW2lkeF07Ci0gICAgICAgIGlmICghYW1vLT5hbnRlbm5hT3hpZGUoKSkgewotICAgICAgICAgICAgYW1vLT5zZXRBbnRlbm5hTW9kZWwoaWR4ICsgMSk7ICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgIGFtbyA9IGFudGVubmFNb2RlbF9bYU94aWRlIC0gMV07Ci0gICAgLy8gT3hpZGUgaGFzIG5vdCBkZWZpbmVkIHlldAotICAgIGlmIChhbW8tPmFudGVubmFPeGlkZSgpKSB7Ci0gICAgICAgIGFtby0+RGVzdHJveSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgIGlmIChhT3hpZGUgPiBudW1BbnRlbm5hTW9kZWxfKSB7Ci0gICAgICAgIG51bUFudGVubmFNb2RlbF8gPSBhT3hpZGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFtby0+SW5pdCgpOwotICAgIGFtby0+c2V0QW50ZW5uYU1vZGVsKGFPeGlkZSk7Ci0KLSAgICBjdXJyZW50QW50ZW5uYU1vZGVsXyA9IGFtbzsKLSAgICAKLSAgICByZXR1cm47Ci19Ci0KLS8vIDUuNQotaW50Ci1sZWZpTGF5ZXI6Om51bUFudGVubmFNb2RlbCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG51bUFudGVubmFNb2RlbF87Ci19Ci0KLS8vIDUuNQotbGVmaUFudGVubmFNb2RlbCAqCi1sZWZpTGF5ZXI6OmFudGVubmFNb2RlbChpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGFudGVubmFNb2RlbF9baW5kZXhdOwotfQotCi0vLyAzLzIzLzIwMDAgLS0gV2FuZGEgZGEgUm9zYS4gIFRoZSBmb2xsb3dpbmcgYXJlIGZvciA1LjQgc3ludGF4Ci12b2lkCi1sZWZpTGF5ZXI6OnNldEFudGVubmFBcmVhUmF0aW8oZG91YmxlIHZhbHVlKQotewotICAgIGlmIChudW1BbnRlbm5hTW9kZWxfID09IDApICAgLy8gaGF2ZW4ndCBjcmVhdGVkIGFueSBhbnRhbm5hTW9kZWwgeWV0Ci0gICAgICAgIGFkZEFudGVubmFNb2RlbCgxKTsKLSAgICBjdXJyZW50QW50ZW5uYU1vZGVsXy0+c2V0QW50ZW5uYUFyZWFSYXRpbyh2YWx1ZSk7Ci19Ci0KLXZvaWQKLWxlZmlMYXllcjo6c2V0QW50ZW5uYUN1bUFyZWFSYXRpbyhkb3VibGUgdmFsdWUpCi17Ci0gICAgaWYgKG51bUFudGVubmFNb2RlbF8gPT0gMCkgICAvLyBoYXZlbid0IGNyZWF0ZWQgYW55IGFudGFubmFNb2RlbCB5ZXQKLSAgICAgICAgYWRkQW50ZW5uYU1vZGVsKDEpOwotICAgIGN1cnJlbnRBbnRlbm5hTW9kZWxfLT5zZXRBbnRlbm5hQ3VtQXJlYVJhdGlvKHZhbHVlKTsKLX0KLQotdm9pZAotbGVmaUxheWVyOjpzZXRBbnRlbm5hQXJlYUZhY3Rvcihkb3VibGUgdmFsdWUpCi17Ci0gICAgaWYgKG51bUFudGVubmFNb2RlbF8gPT0gMCkgICAvLyBoYXZlbid0IGNyZWF0ZWQgYW55IGFudGFubmFNb2RlbCB5ZXQKLSAgICAgICAgYWRkQW50ZW5uYU1vZGVsKDEpOwotICAgIGN1cnJlbnRBbnRlbm5hTW9kZWxfLT5zZXRBbnRlbm5hQXJlYUZhY3Rvcih2YWx1ZSk7Ci19Ci0KLXZvaWQKLWxlZmlMYXllcjo6c2V0QW50ZW5uYVNpZGVBcmVhUmF0aW8oZG91YmxlIHZhbHVlKQotewotICAgIGlmIChudW1BbnRlbm5hTW9kZWxfID09IDApICAgLy8gaGF2ZW4ndCBjcmVhdGVkIGFueSBhbnRhbm5hTW9kZWwgeWV0Ci0gICAgICAgIGFkZEFudGVubmFNb2RlbCgxKTsKLSAgICBjdXJyZW50QW50ZW5uYU1vZGVsXy0+c2V0QW50ZW5uYVNpZGVBcmVhUmF0aW8odmFsdWUpOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OnNldEFudGVubmFDdW1TaWRlQXJlYVJhdGlvKGRvdWJsZSB2YWx1ZSkKLXsKLSAgICBpZiAobnVtQW50ZW5uYU1vZGVsXyA9PSAwKSAgIC8vIGhhdmVuJ3QgY3JlYXRlZCBhbnkgYW50YW5uYU1vZGVsIHlldAotICAgICAgICBhZGRBbnRlbm5hTW9kZWwoMSk7Ci0gICAgY3VycmVudEFudGVubmFNb2RlbF8tPnNldEFudGVubmFDdW1TaWRlQXJlYVJhdGlvKHZhbHVlKTsKLX0KLQotdm9pZAotbGVmaUxheWVyOjpzZXRBbnRlbm5hU2lkZUFyZWFGYWN0b3IoZG91YmxlIHZhbHVlKQotewotICAgIGlmIChudW1BbnRlbm5hTW9kZWxfID09IDApICAgLy8gaGF2ZW4ndCBjcmVhdGVkIGFueSBhbnRhbm5hTW9kZWwgeWV0Ci0gICAgICAgIGFkZEFudGVubmFNb2RlbCgxKTsKLSAgIGN1cnJlbnRBbnRlbm5hTW9kZWxfLT5zZXRBbnRlbm5hU2lkZUFyZWFGYWN0b3IodmFsdWUpOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OnNldEFudGVubmFWYWx1ZShsZWZpQW50ZW5uYUVudW0gIGFudGVubmFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgICAgICB2YWx1ZSkKLXsKLSAgICBpZiAobnVtQW50ZW5uYU1vZGVsXyA9PSAwKSAgIC8vIGhhdmVuJ3QgY3JlYXRlZCBhbnkgYW50YW5uYU1vZGVsIHlldAotICAgICAgICBhZGRBbnRlbm5hTW9kZWwoMSk7Ci0gICAgY3VycmVudEFudGVubmFNb2RlbF8tPnNldEFudGVubmFWYWx1ZShhbnRlbm5hVHlwZSwgdmFsdWUpOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OnNldEFudGVubmFEVU8obGVmaUFudGVubmFFbnVtIGFudGVubmFUeXBlKQotewotICAgIGlmIChudW1BbnRlbm5hTW9kZWxfID09IDApICAgLy8gaGF2ZW4ndCBjcmVhdGVkIGFueSBhbnRhbm5hTW9kZWwgeWV0Ci0gICAgICAgIGFkZEFudGVubmFNb2RlbCgxKTsKLSAgICBjdXJyZW50QW50ZW5uYU1vZGVsXy0+c2V0QW50ZW5uYURVTyhhbnRlbm5hVHlwZSk7Ci19Ci0KLXZvaWQKLWxlZmlMYXllcjo6c2V0QW50ZW5uYVBXTChsZWZpQW50ZW5uYUVudW0gICAgYW50ZW5uYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGVmaUFudGVubmFQV0wgICAgICpwd2wpCi17Ci0gICAgaWYgKG51bUFudGVubmFNb2RlbF8gPT0gMCkgICAvLyBoYXZlbid0IGNyZWF0ZWQgYW55IGFudGFubmFNb2RlbCB5ZXQKLSAgICAgICAgYWRkQW50ZW5uYU1vZGVsKDEpOwotICAgIGN1cnJlbnRBbnRlbm5hTW9kZWxfLT5zZXRBbnRlbm5hUFdMKGFudGVubmFUeXBlLCBwd2wpOwotfQotCi0vLyA1LjcKLXZvaWQKLWxlZmlMYXllcjo6c2V0QW50ZW5uYUN1bVJvdXRpbmdQbHVzQ3V0KCkKLXsKLSAgICBpZiAobnVtQW50ZW5uYU1vZGVsXyA9PSAwKSAgIC8vIGhhdmVuJ3QgY3JlYXRlZCBhbnkgYW50YW5uYU1vZGVsIHlldAotICAgICAgICBhZGRBbnRlbm5hTW9kZWwoMSk7Ci0gICAgY3VycmVudEFudGVubmFNb2RlbF8tPnNldEFudGVubmFDdW1Sb3V0aW5nUGx1c0N1dCgpOwotfQotCi0vLyA1LjcKLXZvaWQKLWxlZmlMYXllcjo6c2V0QW50ZW5uYUdhdGVQbHVzRGlmZihkb3VibGUgdmFsdWUpCi17Ci0gICAgaWYgKG51bUFudGVubmFNb2RlbF8gPT0gMCkgICAvLyBoYXZlbid0IGNyZWF0ZWQgYW55IGFudGFubmFNb2RlbCB5ZXQKLSAgICAgICAgYWRkQW50ZW5uYU1vZGVsKDEpOwotICAgIGN1cnJlbnRBbnRlbm5hTW9kZWxfLT5zZXRBbnRlbm5hR2F0ZVBsdXNEaWZmKHZhbHVlKTsKLX0KLQotLy8gNS43Ci12b2lkCi1sZWZpTGF5ZXI6OnNldEFudGVubmFBcmVhTWludXNEaWZmKGRvdWJsZSB2YWx1ZSkKLXsKLSAgICBpZiAobnVtQW50ZW5uYU1vZGVsXyA9PSAwKSAgIC8vIGhhdmVuJ3QgY3JlYXRlZCBhbnkgYW50YW5uYU1vZGVsIHlldAotICAgICAgICBhZGRBbnRlbm5hTW9kZWwoMSk7Ci0gICAgY3VycmVudEFudGVubmFNb2RlbF8tPnNldEFudGVubmFBcmVhTWludXNEaWZmKHZhbHVlKTsKLX0KLQotLy8gOC8yOS8yMDAxIC0tIFdhbmRhIGRhIFJvc2EuICBUaGUgZm9sbG93aW5nIGFyZSBmb3IgNS40IGVuaGFuY2VtZW50cwotCi12b2lkCi1sZWZpTGF5ZXI6OnNldFNsb3RXaXJlV2lkdGgoZG91YmxlIG51bSkKLXsKLSAgICBoYXNTbG90V2lyZVdpZHRoXyA9IDE7Ci0gICAgc2xvdFdpcmVXaWR0aF8gPSBudW07Ci19Ci0KLXZvaWQKLWxlZmlMYXllcjo6c2V0U2xvdFdpcmVMZW5ndGgoZG91YmxlIG51bSkKLXsKLSAgICBoYXNTbG90V2lyZUxlbmd0aF8gPSAxOwotICAgIHNsb3RXaXJlTGVuZ3RoXyA9IG51bTsKLX0KLQotdm9pZAotbGVmaUxheWVyOjpzZXRTbG90V2lkdGgoZG91YmxlIG51bSkKLXsKLSAgICBoYXNTbG90V2lkdGhfID0gMTsKLSAgICBzbG90V2lkdGhfID0gbnVtOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OnNldFNsb3RMZW5ndGgoZG91YmxlIG51bSkKLXsKLSAgICBoYXNTbG90TGVuZ3RoXyA9IDE7Ci0gICAgc2xvdExlbmd0aF8gPSBudW07Ci19Ci0KLXZvaWQKLWxlZmlMYXllcjo6c2V0TWF4QWRqYWNlbnRTbG90U3BhY2luZyhkb3VibGUgbnVtKQotewotICAgIGhhc01heEFkamFjZW50U2xvdFNwYWNpbmdfID0gMTsKLSAgICBtYXhBZGphY2VudFNsb3RTcGFjaW5nXyA9IG51bTsKLX0KLQotdm9pZAotbGVmaUxheWVyOjpzZXRNYXhDb2F4aWFsU2xvdFNwYWNpbmcoZG91YmxlIG51bSkKLXsKLSAgICBoYXNNYXhDb2F4aWFsU2xvdFNwYWNpbmdfID0gMTsKLSAgICBtYXhDb2F4aWFsU2xvdFNwYWNpbmdfID0gbnVtOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OnNldE1heEVkZ2VTbG90U3BhY2luZyhkb3VibGUgbnVtKQotewotICAgIGhhc01heEVkZ2VTbG90U3BhY2luZ18gPSAxOwotICAgIG1heEVkZ2VTbG90U3BhY2luZ18gPSBudW07Ci19Ci0KLXZvaWQKLWxlZmlMYXllcjo6c2V0U3BsaXRXaXJlV2lkdGgoZG91YmxlIG51bSkKLXsKLSAgICBoYXNTcGxpdFdpcmVXaWR0aF8gPSAxOwotICAgIHNwbGl0V2lyZVdpZHRoXyA9IG51bTsKLX0KLQotdm9pZAotbGVmaUxheWVyOjpzZXRNaW5pbXVtRGVuc2l0eShkb3VibGUgbnVtKQotewotICAgIGhhc01pbmltdW1EZW5zaXR5XyA9IDE7Ci0gICAgbWluaW11bURlbnNpdHlfID0gbnVtOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OnNldE1heGltdW1EZW5zaXR5KGRvdWJsZSBudW0pCi17Ci0gICAgaGFzTWF4aW11bURlbnNpdHlfID0gMTsKLSAgICBtYXhpbXVtRGVuc2l0eV8gPSBudW07Ci19Ci0KLXZvaWQKLWxlZmlMYXllcjo6c2V0RGVuc2l0eUNoZWNrV2luZG93KGRvdWJsZSBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgd2lkdGgpCi17Ci0gICAgaGFzRGVuc2l0eUNoZWNrV2luZG93XyA9IDE7Ci0gICAgZGVuc2l0eUNoZWNrV2luZG93TGVuZ3RoXyA9IGxlbmd0aDsKLSAgICBkZW5zaXR5Q2hlY2tXaW5kb3dXaWR0aF8gPSB3aWR0aDsKLX0KLQotdm9pZAotbGVmaUxheWVyOjpzZXREZW5zaXR5Q2hlY2tTdGVwKGRvdWJsZSBudW0pCi17Ci0gICAgaGFzRGVuc2l0eUNoZWNrU3RlcF8gPSAxOwotICAgIGRlbnNpdHlDaGVja1N0ZXBfID0gbnVtOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OnNldEZpbGxBY3RpdmVTcGFjaW5nKGRvdWJsZSBudW0pCi17Ci0gICAgaGFzRmlsbEFjdGl2ZVNwYWNpbmdfID0gMTsKLSAgICBmaWxsQWN0aXZlU3BhY2luZ18gPSBudW07Ci19Ci0KLWludAotbGVmaUxheWVyOjpoYXNTbG90V2lyZVdpZHRoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzU2xvdFdpcmVXaWR0aF87Ci19Ci0KLWludAotbGVmaUxheWVyOjpoYXNTbG90V2lyZUxlbmd0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc1Nsb3RXaXJlTGVuZ3RoXzsKLX0KLQotaW50Ci1sZWZpTGF5ZXI6Omhhc1Nsb3RXaWR0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc1Nsb3RXaWR0aF87Ci19Ci0KLWludAotbGVmaUxheWVyOjpoYXNTbG90TGVuZ3RoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzU2xvdExlbmd0aF87Ci19Ci0KLWludAotbGVmaUxheWVyOjpoYXNNYXhBZGphY2VudFNsb3RTcGFjaW5nKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzTWF4QWRqYWNlbnRTbG90U3BhY2luZ187Ci19Ci0KLWludAotbGVmaUxheWVyOjpoYXNNYXhDb2F4aWFsU2xvdFNwYWNpbmcoKSBjb25zdAotewotICAgIHJldHVybiBoYXNNYXhDb2F4aWFsU2xvdFNwYWNpbmdfOwotfQotCi1pbnQKLWxlZmlMYXllcjo6aGFzTWF4RWRnZVNsb3RTcGFjaW5nKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzTWF4RWRnZVNsb3RTcGFjaW5nXzsKLX0KLQotaW50Ci1sZWZpTGF5ZXI6Omhhc1NwbGl0V2lyZVdpZHRoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzU3BsaXRXaXJlV2lkdGhfOwotfQotCi1pbnQKLWxlZmlMYXllcjo6aGFzTWluaW11bURlbnNpdHkoKSBjb25zdAotewotICAgIHJldHVybiBoYXNNaW5pbXVtRGVuc2l0eV87Ci19Ci0KLWludAotbGVmaUxheWVyOjpoYXNNYXhpbXVtRGVuc2l0eSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc01heGltdW1EZW5zaXR5XzsKLX0KLQotaW50Ci1sZWZpTGF5ZXI6Omhhc0RlbnNpdHlDaGVja1dpbmRvdygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc0RlbnNpdHlDaGVja1dpbmRvd187Ci19Ci0KLWludAotbGVmaUxheWVyOjpoYXNEZW5zaXR5Q2hlY2tTdGVwKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzRGVuc2l0eUNoZWNrU3RlcF87Ci19Ci0KLWludAotbGVmaUxheWVyOjpoYXNGaWxsQWN0aXZlU3BhY2luZygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc0ZpbGxBY3RpdmVTcGFjaW5nXzsKLX0KLQotZG91YmxlCi1sZWZpTGF5ZXI6OnNsb3RXaXJlV2lkdGgoKSBjb25zdAotewotICAgIHJldHVybiBzbG90V2lyZVdpZHRoXzsKLX0KLQotZG91YmxlCi1sZWZpTGF5ZXI6OnNsb3RXaXJlTGVuZ3RoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gc2xvdFdpcmVMZW5ndGhfOwotfQotCi1kb3VibGUKLWxlZmlMYXllcjo6c2xvdFdpZHRoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gc2xvdFdpZHRoXzsKLX0KLQotZG91YmxlCi1sZWZpTGF5ZXI6OnNsb3RMZW5ndGgoKSBjb25zdAotewotICAgIHJldHVybiBzbG90TGVuZ3RoXzsKLX0KLQotZG91YmxlCi1sZWZpTGF5ZXI6Om1heEFkamFjZW50U2xvdFNwYWNpbmcoKSBjb25zdAotewotICAgIHJldHVybiBtYXhBZGphY2VudFNsb3RTcGFjaW5nXzsKLX0KLQotZG91YmxlCi1sZWZpTGF5ZXI6Om1heENvYXhpYWxTbG90U3BhY2luZygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1heENvYXhpYWxTbG90U3BhY2luZ187Ci19Ci0KLWRvdWJsZQotbGVmaUxheWVyOjptYXhFZGdlU2xvdFNwYWNpbmcoKSBjb25zdAotewotICAgIHJldHVybiBtYXhFZGdlU2xvdFNwYWNpbmdfOwotfQotCi1kb3VibGUKLWxlZmlMYXllcjo6c3BsaXRXaXJlV2lkdGgoKSBjb25zdAotewotICAgIHJldHVybiBzcGxpdFdpcmVXaWR0aF87Ci19Ci0KLWRvdWJsZQotbGVmaUxheWVyOjptaW5pbXVtRGVuc2l0eSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1pbmltdW1EZW5zaXR5XzsKLX0KLQotZG91YmxlCi1sZWZpTGF5ZXI6Om1heGltdW1EZW5zaXR5KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbWF4aW11bURlbnNpdHlfOwotfQotCi1kb3VibGUKLWxlZmlMYXllcjo6ZGVuc2l0eUNoZWNrV2luZG93TGVuZ3RoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZGVuc2l0eUNoZWNrV2luZG93TGVuZ3RoXzsKLX0KLQotZG91YmxlCi1sZWZpTGF5ZXI6OmRlbnNpdHlDaGVja1dpbmRvd1dpZHRoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZGVuc2l0eUNoZWNrV2luZG93V2lkdGhfOwotfQotCi1kb3VibGUKLWxlZmlMYXllcjo6ZGVuc2l0eUNoZWNrU3RlcCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGRlbnNpdHlDaGVja1N0ZXBfOwotfQotCi1kb3VibGUKLWxlZmlMYXllcjo6ZmlsbEFjdGl2ZVNwYWNpbmcoKSBjb25zdAotewotICAgIHJldHVybiBmaWxsQWN0aXZlU3BhY2luZ187Ci19Ci0KLS8vIDUuNSBTUEFDSU5HVEFCTEUKLQotdm9pZAotbGVmaUxheWVyOjphZGRTcGFjaW5nVGFibGUoKQotewotICAgIGxlZmlTcGFjaW5nVGFibGUgKnNwOwotICAgIGlmIChudW1TcGFjaW5nVGFibGVfID09IHNwYWNpbmdUYWJsZUFsbG9jYXRlZF8pIHsKLSAgICAgICAgbGVmaVNwYWNpbmdUYWJsZSAgICAqKmFycmF5OwotICAgICAgICBpbnQgICAgICAgICAgICAgICAgIGk7Ci0gICAgICAgIHNwYWNpbmdUYWJsZUFsbG9jYXRlZF8gPSBzcGFjaW5nVGFibGVBbGxvY2F0ZWRfID8KLSAgICAgICAgICAgIHNwYWNpbmdUYWJsZUFsbG9jYXRlZF8gKiAyIDogMjsKLSAgICAgICAgYXJyYXkgPSAobGVmaVNwYWNpbmdUYWJsZSoqKSBsZWZNYWxsb2Moc2l6ZW9mKGxlZmlTcGFjaW5nVGFibGUqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNwYWNpbmdUYWJsZUFsbG9jYXRlZF8pOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtU3BhY2luZ1RhYmxlXzsgaSsrKQotICAgICAgICAgICAgYXJyYXlbaV0gPSBzcGFjaW5nVGFibGVfW2ldOwotICAgICAgICBpZiAoc3BhY2luZ1RhYmxlXykKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoc3BhY2luZ1RhYmxlXykpOwotICAgICAgICBzcGFjaW5nVGFibGVfID0gYXJyYXk7Ci0gICAgfQotICAgIHNwID0gc3BhY2luZ1RhYmxlX1tudW1TcGFjaW5nVGFibGVfXSA9Ci0gICAgICAgIChsZWZpU3BhY2luZ1RhYmxlKikgbGVmTWFsbG9jKHNpemVvZihsZWZpU3BhY2luZ1RhYmxlKSk7Ci0gICAgbnVtU3BhY2luZ1RhYmxlXyArPSAxOwotICAgIHNwLT5Jbml0KCk7Ci19Ci0KLXZvaWQKLWxlZmlMYXllcjo6YWRkU3BQYXJhbGxlbExlbmd0aCgpCi17Ci0gICAgbGVmaVNwYWNpbmdUYWJsZSAqc3A7Ci0gICAgc3AgPSBzcGFjaW5nVGFibGVfW251bVNwYWNpbmdUYWJsZV8gLSAxXTsKLSAgICBzcC0+YWRkUGFyYWxsZWxMZW5ndGgobnVtTnVtc18sIG51bXNfKTsKLSAgICBudW1OdW1zXyA9IDA7Ci0gICAgbnVtQWxsb2NhdGVkXyA9IDA7Ci0gICAgbnVtc18gPSAwOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OmFkZFNwUGFyYWxsZWxXaWR0aChkb3VibGUgd2lkdGgpCi17Ci0gICAgbGVmaVNwYWNpbmdUYWJsZSAqc3A7Ci0gICAgc3AgPSBzcGFjaW5nVGFibGVfW251bVNwYWNpbmdUYWJsZV8gLSAxXTsKLSAgICBzcC0+YWRkUGFyYWxsZWxXaWR0aCh3aWR0aCk7Ci19Ci0KLXZvaWQKLWxlZmlMYXllcjo6YWRkU3BQYXJhbGxlbFdpZHRoU3BhY2luZygpCi17Ci0gICAgbGVmaVNwYWNpbmdUYWJsZSAqc3A7Ci0gICAgc3AgPSBzcGFjaW5nVGFibGVfW251bVNwYWNpbmdUYWJsZV8gLSAxXTsKLSAgICBzcC0+YWRkUGFyYWxsZWxXaWR0aFNwYWNpbmcobnVtTnVtc18sIG51bXNfKTsKLSAgICAvLyBTaW5jZSBpbnNpZGUgYWRkUGFyYWxsZWxXaWR0aFNwYWNpbmcgY29weSB0aGUgbnVtc18sIHdlIGNhbiBmcmVlIGl0Ci0gICAgLy8gaGVyZQotICAgIGxlZkZyZWUoKGNoYXIqKSAobnVtc18pKTsKLSAgICBudW1OdW1zXyA9IDA7Ci0gICAgbnVtQWxsb2NhdGVkXyA9IDA7Ci0gICAgbnVtc18gPSAwOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OmFkZFNwVHdvV2lkdGhzKGRvdWJsZSAgICB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgIHJ1bkxlbmd0aCkKLXsKLSAgICBsZWZpU3BhY2luZ1RhYmxlICpzcDsKLSAgICBzcCA9IHNwYWNpbmdUYWJsZV9bbnVtU3BhY2luZ1RhYmxlXyAtIDFdOwotICAgIC8qIFRoaXMgd2lsbCBuZXZlciBoYXBwZW4gc2luY2UgaW4gbGVmLnksIHRoZSBncmFtbWVyIHJlcXVpcmVzIGEgbnVtYmVyIGZvcgotICAgICAgIHNwYWNpbmcKLSAgICAgIGlmIChudW1OdW1zXyA9PSAwKSB7Ci0gICAgICAgICAqIHNwYWNpbmcgaXMgcmVxdWlyZWQgaW4gVFdPV0lEVEhTICoKLSAgICAgICAgIGxlZmlFcnJvcigiRVJST1IgKExFRlBBUlMtMTMyNCk6IEluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgdGhlIHN0YXRlbWVudCBUV09XSURUSFMuXG5zcGFjaW5nLCB3aGljaCBpcyByZXF1aXJlZCBpcyBub3QgZGVmaW5lZC4iKTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAqLwotICAgIHNwLT5hZGRUd29XaWR0aHMod2lkdGgsIHJ1bkxlbmd0aCwgbnVtTnVtc18sCi0gICAgICAgICAgICAgICAgICAgICBudW1zXywgaGFzVHdvV2lkdGhQUkxfKTsKLSAgICAvLyBTaW5jZSBpbnNpZGUgYWRkVHdvV2lkdGhzU3BhY2luZyBjb3B5IHRoZSBudW1zXywgd2UgY2FuIGZyZWUgaXQKLSAgICAvLyBoZXJlCi0gICAgbGVmRnJlZSgoY2hhciopIChudW1zXykpOwotICAgIG51bU51bXNfID0gMDsKLSAgICBudW1BbGxvY2F0ZWRfID0gMDsKLSAgICBudW1zXyA9IDA7Ci0gICAgaGFzVHdvV2lkdGhQUkxfID0gMDsKLX0KLQotdm9pZAotbGVmaUxheWVyOjpzZXRJbmZsdWVuY2UoKQotewotICAgIGxlZmlTcGFjaW5nVGFibGUgKnNwOwotICAgIHNwID0gc3BhY2luZ1RhYmxlX1tudW1TcGFjaW5nVGFibGVfIC0gMV07Ci0gICAgc3AtPnNldEluZmx1ZW5jZSgpOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OmFkZFNwSW5mbHVlbmNlKGRvdWJsZSAgICB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgIGRpc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgc3BhY2luZykKLXsKLSAgICBsZWZpU3BhY2luZ1RhYmxlICpzcDsKLSAgICBzcCA9IHNwYWNpbmdUYWJsZV9bbnVtU3BhY2luZ1RhYmxlXyAtIDFdOwotICAgIHNwLT5hZGRJbmZsdWVuY2Uod2lkdGgsIGRpc3RhbmNlLCBzcGFjaW5nKTsKLX0KLQotaW50Ci1sZWZpTGF5ZXI6Om51bVNwYWNpbmdUYWJsZSgpCi17Ci0gICAgcmV0dXJuIG51bVNwYWNpbmdUYWJsZV87Ci19Ci0KLXZvaWQKLWxlZmlMYXllcjo6c2V0U3BUd29XaWR0aHNIYXNQUkwoaW50IGhhc1BSTCkKLXsKLSAgICBoYXNUd29XaWR0aFBSTF8gPSBoYXNQUkw7Ci19Ci0KLWxlZmlTcGFjaW5nVGFibGUgKgotbGVmaUxheWVyOjpzcGFjaW5nVGFibGUoaW50IGluZGV4KQotewotICAgIHJldHVybiBzcGFjaW5nVGFibGVfW2luZGV4XTsKLX0KLQotLy8gNS42IEVOQ0xPU1VSRSBQUkVGRVJFTkNMT1NVUkUgJiBSRVNJU1RBTkNFUEVSQ1VUCi0KLXZvaWQKLWxlZmlMYXllcjo6YWRkRW5jbG9zdXJlKGNoYXIgICAgKmVuY2xSdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICBvdmVyaGFuZzEsCi0gICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgIG92ZXJoYW5nMikKLXsKLSAgICBpZiAobnVtRW5jbG9zdXJlXyA9PSBlbmNsb3N1cmVBbGxvY2F0ZWRfKSB7Ci0gICAgICAgIGludCAgICAgaSwgbGVuOwotICAgICAgICBjaGFyICAgICoqZXI7Ci0gICAgICAgIGRvdWJsZSAgKm8xOwotICAgICAgICBkb3VibGUgICpvMjsKLSAgICAgICAgZG91YmxlICAqbXc7Ci0gICAgICAgIGRvdWJsZSAgKmN0OwotICAgICAgICBkb3VibGUgICptbDsKLQotICAgICAgICBpZiAoZW5jbG9zdXJlQWxsb2NhdGVkXyA9PSAwKQotICAgICAgICAgICAgbGVuID0gZW5jbG9zdXJlQWxsb2NhdGVkXyA9IDI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGxlbiA9IGVuY2xvc3VyZUFsbG9jYXRlZF8gKj0gMjsKLSAgICAgICAgZXIgPSAoY2hhcioqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIqKSAqIGxlbik7Ci0gICAgICAgIG8xID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGxlbik7Ci0gICAgICAgIG8yID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGxlbik7Ci0gICAgICAgIG13ID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGxlbik7Ci0gICAgICAgIGN0ID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGxlbik7Ci0gICAgICAgIG1sID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGxlbik7Ci0KLSAgICAgICAgaWYgKG51bUVuY2xvc3VyZV8gPiAwKSB7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtRW5jbG9zdXJlXzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZXJbaV0gPSBlbmNsb3N1cmVSdWxlc19baV07Ci0gICAgICAgICAgICAgICAgbzFbaV0gPSBvdmVyaGFuZzFfW2ldOwotICAgICAgICAgICAgICAgIG8yW2ldID0gb3ZlcmhhbmcyX1tpXTsKLSAgICAgICAgICAgICAgICBtd1tpXSA9IGVuY21pbldpZHRoX1tpXTsKLSAgICAgICAgICAgICAgICBjdFtpXSA9IGN1dFdpdGhpbl9baV07Ci0gICAgICAgICAgICAgICAgbWxbaV0gPSBtaW5MZW5ndGhfW2ldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChlbmNsb3N1cmVSdWxlc18pKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAob3ZlcmhhbmcxXykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChvdmVyaGFuZzJfKSk7Ci0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKGVuY21pbldpZHRoXykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChjdXRXaXRoaW5fKSk7Ci0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKG1pbkxlbmd0aF8pKTsKLSAgICAgICAgfQotICAgICAgICBlbmNsb3N1cmVSdWxlc18gPSBlcjsKLSAgICAgICAgb3ZlcmhhbmcxXyA9IG8xOwotICAgICAgICBvdmVyaGFuZzJfID0gbzI7Ci0gICAgICAgIGVuY21pbldpZHRoXyA9IG13OwotICAgICAgICBjdXRXaXRoaW5fID0gY3Q7Ci0gICAgICAgIG1pbkxlbmd0aF8gPSBtbDsKLSAgICB9Ci0gICAgaWYgKGVuY2xSdWxlKSB7Ci0gICAgICAgIGlmIChzdHJjbXAoZW5jbFJ1bGUsICJOVUxMIikgPT0gMCkKLSAgICAgICAgICAgIGVuY2xvc3VyZVJ1bGVzX1tudW1FbmNsb3N1cmVfXSA9IE5VTEw7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGVuY2xvc3VyZVJ1bGVzX1tudW1FbmNsb3N1cmVfXSA9IHN0cmR1cChlbmNsUnVsZSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIGVuY2xvc3VyZVJ1bGVzX1tudW1FbmNsb3N1cmVfXSA9IE5VTEw7Ci0gICAgb3ZlcmhhbmcxX1tudW1FbmNsb3N1cmVfXSA9IG92ZXJoYW5nMTsKLSAgICBvdmVyaGFuZzJfW251bUVuY2xvc3VyZV9dID0gb3ZlcmhhbmcyOwotICAgIGVuY21pbldpZHRoX1tudW1FbmNsb3N1cmVfXSA9IDA7Ci0gICAgY3V0V2l0aGluX1tudW1FbmNsb3N1cmVfXSA9IDA7Ci0gICAgbWluTGVuZ3RoX1tudW1FbmNsb3N1cmVfXSA9IDA7Ci0gICAgbnVtRW5jbG9zdXJlXyArPSAxOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OmFkZEVuY2xvc3VyZVdpZHRoKGRvdWJsZSBtaW5XaWR0aCkKLXsKLSAgICBlbmNtaW5XaWR0aF9bbnVtRW5jbG9zdXJlXyAtIDFdID0gbWluV2lkdGg7Ci19Ci0KLXZvaWQKLWxlZmlMYXllcjo6YWRkRW5jbG9zdXJlRXhjZXB0RUMoZG91YmxlIGN1dFdpdGhpbikKLXsKLSAgICBjdXRXaXRoaW5fW251bUVuY2xvc3VyZV8gLSAxXSA9IGN1dFdpdGhpbjsKLX0KLQotdm9pZAotbGVmaUxheWVyOjphZGRFbmNsb3N1cmVMZW5ndGgoZG91YmxlIG1pbkxlbmd0aCkKLXsKLSAgICBtaW5MZW5ndGhfW251bUVuY2xvc3VyZV8gLSAxXSA9IG1pbkxlbmd0aDsKLX0KLQotaW50Ci1sZWZpTGF5ZXI6Om51bUVuY2xvc3VyZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG51bUVuY2xvc3VyZV87Ci19Ci0KLWludAotbGVmaUxheWVyOjpoYXNFbmNsb3N1cmVSdWxlKGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gZW5jbG9zdXJlUnVsZXNfW2luZGV4XSA/IDEgOiAwOwotfQotCi1jaGFyICoKLWxlZmlMYXllcjo6ZW5jbG9zdXJlUnVsZShpbnQgaW5kZXgpCi17Ci0gICAgcmV0dXJuIGVuY2xvc3VyZVJ1bGVzX1tpbmRleF07Ci19Ci0KLWRvdWJsZQotbGVmaUxheWVyOjplbmNsb3N1cmVPdmVyaGFuZzEoaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiBvdmVyaGFuZzFfW2luZGV4XTsKLX0KLQotZG91YmxlCi1sZWZpTGF5ZXI6OmVuY2xvc3VyZU92ZXJoYW5nMihpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG92ZXJoYW5nMl9baW5kZXhdOwotfQotCi1pbnQKLWxlZmlMYXllcjo6aGFzRW5jbG9zdXJlV2lkdGgoaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiBlbmNtaW5XaWR0aF9baW5kZXhdID8gMSA6IDA7Ci19Ci0KLWRvdWJsZQotbGVmaUxheWVyOjplbmNsb3N1cmVNaW5XaWR0aChpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGVuY21pbldpZHRoX1tpbmRleF07Ci19Ci0KLWludAotbGVmaUxheWVyOjpoYXNFbmNsb3N1cmVFeGNlcHRFeHRyYUN1dChpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGN1dFdpdGhpbl9baW5kZXhdID8gMSA6IDA7Ci19Ci0KLWRvdWJsZQotbGVmaUxheWVyOjplbmNsb3N1cmVFeGNlcHRFeHRyYUN1dChpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGN1dFdpdGhpbl9baW5kZXhdOwotfQotCi1pbnQKLWxlZmlMYXllcjo6aGFzRW5jbG9zdXJlTWluTGVuZ3RoKGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gbWluTGVuZ3RoX1tpbmRleF0gPyAxIDogMDsKLX0KLQotZG91YmxlCi1sZWZpTGF5ZXI6OmVuY2xvc3VyZU1pbkxlbmd0aChpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1pbkxlbmd0aF9baW5kZXhdOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OmFkZFByZWZlckVuY2xvc3VyZShjaGFyICAgICAgKmVuY2xSdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgIG92ZXJoYW5nMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICBvdmVyaGFuZzIpCi17Ci0gICAgaWYgKG51bVByZWZlckVuY2xvc3VyZV8gPT0gcHJlZmVyRW5jbG9zdXJlQWxsb2NhdGVkXykgewotICAgICAgICBpbnQgICAgIGksIGxlbjsKLSAgICAgICAgY2hhciAgICAqKmVyOwotICAgICAgICBkb3VibGUgICpvMTsKLSAgICAgICAgZG91YmxlICAqbzI7Ci0gICAgICAgIGRvdWJsZSAgKm13OwotCi0gICAgICAgIGlmIChwcmVmZXJFbmNsb3N1cmVBbGxvY2F0ZWRfID09IDApCi0gICAgICAgICAgICBsZW4gPSBwcmVmZXJFbmNsb3N1cmVBbGxvY2F0ZWRfID0gMjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbGVuID0gcHJlZmVyRW5jbG9zdXJlQWxsb2NhdGVkXyAqPSAyOwotICAgICAgICBlciA9IChjaGFyKiopIGxlZk1hbGxvYyhzaXplb2YoY2hhciopICogbGVuKTsKLSAgICAgICAgbzEgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGVuKTsKLSAgICAgICAgbzIgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGVuKTsKLSAgICAgICAgbXcgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGVuKTsKLQotICAgICAgICBpZiAobnVtUHJlZmVyRW5jbG9zdXJlXyA+IDApIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1QcmVmZXJFbmNsb3N1cmVfOyBpKyspIHsKLSAgICAgICAgICAgICAgICBlcltpXSA9IHByZWZlckVuY2xvc3VyZVJ1bGVzX1tpXTsKLSAgICAgICAgICAgICAgICBvMVtpXSA9IHByZWZlck92ZXJoYW5nMV9baV07Ci0gICAgICAgICAgICAgICAgbzJbaV0gPSBwcmVmZXJPdmVyaGFuZzFfW2ldOwotICAgICAgICAgICAgICAgIG13W2ldID0gcHJlZmVyTWluV2lkdGhfW2ldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChwcmVmZXJFbmNsb3N1cmVSdWxlc18pKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAocHJlZmVyT3ZlcmhhbmcxXykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChwcmVmZXJPdmVyaGFuZzJfKSk7Ci0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKHByZWZlck1pbldpZHRoXykpOwotICAgICAgICB9Ci0gICAgICAgIHByZWZlckVuY2xvc3VyZVJ1bGVzXyA9IGVyOwotICAgICAgICBwcmVmZXJPdmVyaGFuZzFfID0gbzE7Ci0gICAgICAgIHByZWZlck92ZXJoYW5nMl8gPSBvMjsKLSAgICAgICAgcHJlZmVyTWluV2lkdGhfID0gbXc7Ci0gICAgfQotICAgIGlmIChzdHJjbXAoZW5jbFJ1bGUsICJOVUxMIikgPT0gMCkKLSAgICAgICAgcHJlZmVyRW5jbG9zdXJlUnVsZXNfW251bVByZWZlckVuY2xvc3VyZV9dID0gTlVMTDsKLSAgICBlbHNlCi0gICAgICAgIHByZWZlckVuY2xvc3VyZVJ1bGVzX1tudW1QcmVmZXJFbmNsb3N1cmVfXSA9IHN0cmR1cChlbmNsUnVsZSk7Ci0gICAgcHJlZmVyT3ZlcmhhbmcxX1tudW1QcmVmZXJFbmNsb3N1cmVfXSA9IG92ZXJoYW5nMTsKLSAgICBwcmVmZXJPdmVyaGFuZzJfW251bVByZWZlckVuY2xvc3VyZV9dID0gb3ZlcmhhbmcyOwotICAgIHByZWZlck1pbldpZHRoX1tudW1QcmVmZXJFbmNsb3N1cmVfXSA9IDA7Ci0gICAgbnVtUHJlZmVyRW5jbG9zdXJlXyArPSAxOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OmFkZFByZWZlckVuY2xvc3VyZVdpZHRoKGRvdWJsZSBtaW5XaWR0aCkKLXsKLSAgICBwcmVmZXJNaW5XaWR0aF9bbnVtUHJlZmVyRW5jbG9zdXJlXyAtIDFdID0gbWluV2lkdGg7Ci19Ci0KLWludAotbGVmaUxheWVyOjpudW1QcmVmZXJFbmNsb3N1cmUoKSBjb25zdAotewotICAgIHJldHVybiBudW1QcmVmZXJFbmNsb3N1cmVfOwotfQotCi1pbnQKLWxlZmlMYXllcjo6aGFzUHJlZmVyRW5jbG9zdXJlUnVsZShpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHByZWZlckVuY2xvc3VyZVJ1bGVzX1tpbmRleF0gPyAxIDogMDsKLX0KLQotY2hhciAqCi1sZWZpTGF5ZXI6OnByZWZlckVuY2xvc3VyZVJ1bGUoaW50IGluZGV4KQotewotICAgIHJldHVybiBwcmVmZXJFbmNsb3N1cmVSdWxlc19baW5kZXhdOwotfQotCi1kb3VibGUKLWxlZmlMYXllcjo6cHJlZmVyRW5jbG9zdXJlT3ZlcmhhbmcxKGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gcHJlZmVyT3ZlcmhhbmcxX1tpbmRleF07Ci19Ci0KLWRvdWJsZQotbGVmaUxheWVyOjpwcmVmZXJFbmNsb3N1cmVPdmVyaGFuZzIoaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiBwcmVmZXJPdmVyaGFuZzJfW2luZGV4XTsKLX0KLQotaW50Ci1sZWZpTGF5ZXI6Omhhc1ByZWZlckVuY2xvc3VyZVdpZHRoKGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gcHJlZmVyTWluV2lkdGhfW2luZGV4XSA/IDEgOiAwOwotfQotCi1kb3VibGUKLWxlZmlMYXllcjo6cHJlZmVyRW5jbG9zdXJlTWluV2lkdGgoaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiBwcmVmZXJNaW5XaWR0aF9baW5kZXhdOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OnNldFJlc1BlckN1dChkb3VibGUgdmFsdWUpCi17Ci0gICAgcmVzUGVyQ3V0XyA9IHZhbHVlOwotfQotCi1pbnQKLWxlZmlMYXllcjo6aGFzUmVzaXN0YW5jZVBlckN1dCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJlc1BlckN1dF8gPyAxIDogMDsKLX0KLQotZG91YmxlCi1sZWZpTGF5ZXI6OnJlc2lzdGFuY2VQZXJDdXQoKSBjb25zdAotewotICAgIHJldHVybiByZXNQZXJDdXRfOwotfQotCi12b2lkCi1sZWZpTGF5ZXI6OnNldERpYWdNaW5FZGdlTGVuZ3RoKGRvdWJsZSB2YWx1ZSkKLXsKLSAgICBkaWFnTWluRWRnZUxlbmd0aF8gPSB2YWx1ZTsKLX0KLQotaW50Ci1sZWZpTGF5ZXI6Omhhc0RpYWdNaW5FZGdlTGVuZ3RoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZGlhZ01pbkVkZ2VMZW5ndGhfID8gMSA6IDA7Ci19Ci0KLWRvdWJsZQotbGVmaUxheWVyOjpkaWFnTWluRWRnZUxlbmd0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGRpYWdNaW5FZGdlTGVuZ3RoXzsKLX0KLQotdm9pZAotbGVmaUxheWVyOjpzZXRNaW5TaXplKGxlZmlHZW9tZXRyaWVzICpnZW9tKQotewotICAgIHN0cnVjdCBsZWZpR2VvbVBvbHlnb24gIHRlbXBQb2x5OwotICAgIGludCAgICAgICAgICAgICAgICAgICAgIGk7Ci0KLSAgICB0ZW1wUG9seSA9ICooZ2VvbS0+Z2V0UG9seWdvbigwKSk7Ci0gICAgbnVtTWluU2l6ZV8gPSB0ZW1wUG9seS5udW1Qb2ludHM7Ci0gICAgaWYgKG51bU1pblNpemVfID4gMCkgewotICAgICAgICBtaW5TaXplV2lkdGhfID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIG51bU1pblNpemVfKTsKLSAgICAgICAgbWluU2l6ZUxlbmd0aF8gPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbnVtTWluU2l6ZV8pOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTWluU2l6ZV87IGkrKykgewotICAgICAgICAgICAgbWluU2l6ZVdpZHRoX1tpXSA9IHRlbXBQb2x5LnhbaV07Ci0gICAgICAgICAgICBtaW5TaXplTGVuZ3RoX1tpXSA9IHRlbXBQb2x5LnlbaV07Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtaW5TaXplV2lkdGhfID0gMDsKLSAgICAgICAgbWluU2l6ZUxlbmd0aF8gPSAwOwotICAgIH0KLX0KLQotaW50Ci1sZWZpTGF5ZXI6Om51bU1pblNpemUoKSBjb25zdAotewotICAgIHJldHVybiBudW1NaW5TaXplXzsKLX0KLQotZG91YmxlCi1sZWZpTGF5ZXI6Om1pblNpemVXaWR0aChpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gbnVtTWluU2l6ZV8pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xMzAxKTogVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIGxheWVyIE1JTlNJWkUgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZFxuIiwgaW5kZXgsIG51bU1pblNpemVfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDEzMDEsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gbWluU2l6ZVdpZHRoX1tpbmRleF07Ci19Ci0KLWRvdWJsZQotbGVmaUxheWVyOjptaW5TaXplTGVuZ3RoKGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjaGFyIG1zZ1sxNjBdOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBudW1NaW5TaXplXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzMDEpOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgbGF5ZXIgTUlOU0laRSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkXG4iLCBpbmRleCwgbnVtTWluU2l6ZV8pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTMwMSwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBtaW5TaXplTGVuZ3RoX1tpbmRleF07Ci19Ci0KLS8vIDUuNiBDSEFOR0VTIE9OIE1JTlNURVAKLWludAotbGVmaUxheWVyOjpudW1NaW5zdGVwKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbnVtTWluc3RlcF87Ci19Ci0KLWRvdWJsZQotbGVmaUxheWVyOjptaW5zdGVwKGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjaGFyIG1zZ1sxNjBdOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBudW1NaW5zdGVwXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzMDIpOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgbGF5ZXIgTUlOU1RFUCBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bU1pbnN0ZXBfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDEzMDIsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gbWluc3RlcF9baW5kZXhdOwotfQotCi1pbnQKLWxlZmlMYXllcjo6aGFzTWluc3RlcFR5cGUoaW50IGluZGV4KSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IG51bU1pbnN0ZXBfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTMwMik6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBsYXllciBNSU5TVEVQIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQiLCBpbmRleCwgbnVtTWluc3RlcF8pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTMwMiwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBtaW5zdGVwVHlwZV9baW5kZXhdID8gMSA6IDA7Ci19Ci0KLWNoYXIgKgotbGVmaUxheWVyOjptaW5zdGVwVHlwZShpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gbnVtTWluc3RlcF8pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xMzAyKTogVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIGxheWVyIE1JTlNURVAgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGluZGV4LCBudW1NaW5zdGVwXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxMzAyLCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIG1pbnN0ZXBUeXBlX1tpbmRleF07Ci19Ci0KLWludAotbGVmaUxheWVyOjpoYXNNaW5zdGVwTGVuZ3Roc3VtKGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjaGFyIG1zZ1sxNjBdOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBudW1NaW5zdGVwXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzMDIpOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgbGF5ZXIgTUlOU1RFUCBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bU1pbnN0ZXBfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDEzMDIsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gbWluc3RlcExlbmd0aHN1bV9baW5kZXhdID09IC0xID8gMCA6IDE7Ci19Ci0KLWRvdWJsZQotbGVmaUxheWVyOjptaW5zdGVwTGVuZ3Roc3VtKGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjaGFyIG1zZ1sxNjBdOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBudW1NaW5zdGVwXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzMDIpOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgbGF5ZXIgTUlOU1RFUCBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bU1pbnN0ZXBfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDEzMDIsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gbWluc3RlcExlbmd0aHN1bV9baW5kZXhdOwotfQotCi0vLyA1LjcKLWludAotbGVmaUxheWVyOjpoYXNNaW5zdGVwTWF4ZWRnZXMoaW50IGluZGV4KSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IG51bU1pbnN0ZXBfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTMwMik6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBsYXllciBNSU5TVEVQIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQiLCBpbmRleCwgbnVtTWluc3RlcF8pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTMwMiwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBtaW5zdGVwTWF4RWRnZXNfW2luZGV4XSA9PSAtMSA/IDAgOiAxOwotfQotCi0vLyA1LjcKLWludAotbGVmaUxheWVyOjptaW5zdGVwTWF4ZWRnZXMoaW50IGluZGV4KSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IG51bU1pbnN0ZXBfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTMwMik6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBsYXllciBNSU5TVEVQIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQiLCBpbmRleCwgbnVtTWluc3RlcF8pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTMwMiwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBtaW5zdGVwTWF4RWRnZXNfW2luZGV4XTsKLX0KLQotLy8gNS43Ci1pbnQKLWxlZmlMYXllcjo6aGFzTWluc3RlcE1pbkFkakxlbmd0aChpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gbnVtTWluc3RlcF8pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xMzAyKTogVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIGxheWVyIE1JTlNURVAgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGluZGV4LCBudW1NaW5zdGVwXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxMzAyLCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIG1pbnN0ZXBNaW5BZGpMZW5ndGhfW2luZGV4XSA9PSAtMSA/IDAgOiAxOwotfQotCi0vLyA1LjcKLWRvdWJsZQotbGVmaUxheWVyOjptaW5zdGVwTWluQWRqTGVuZ3RoKGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjaGFyIG1zZ1sxNjBdOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBudW1NaW5zdGVwXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzMDIpOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgbGF5ZXIgTUlOU1RFUCBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bU1pbnN0ZXBfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDEzMDIsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gbWluc3RlcE1pbkFkakxlbmd0aF9baW5kZXhdOwotfQotCi0vLyA1LjcKLWludAotbGVmaUxheWVyOjpoYXNNaW5zdGVwTWluQmV0TGVuZ3RoKGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjaGFyIG1zZ1sxNjBdOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBudW1NaW5zdGVwXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzMDIpOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgbGF5ZXIgTUlOU1RFUCBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bU1pbnN0ZXBfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDEzMDIsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gbWluc3RlcE1pbkJldExlbmd0aF9baW5kZXhdID09IC0xID8gMCA6IDE7Ci19Ci0KLS8vIDUuNwotZG91YmxlCi1sZWZpTGF5ZXI6Om1pbnN0ZXBNaW5CZXRMZW5ndGgoaW50IGluZGV4KSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IG51bU1pbnN0ZXBfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTMwMik6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBsYXllciBNSU5TVEVQIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQiLCBpbmRleCwgbnVtTWluc3RlcF8pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTMwMiwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBtaW5zdGVwTWluQmV0TGVuZ3RoX1tpbmRleF07Ci19Ci0KLS8vIDUuNwotaW50Ci1sZWZpTGF5ZXI6Omhhc01pbnN0ZXBYU2FtZUNvcm5lcnMoaW50IGluZGV4KSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IG51bU1pbnN0ZXBfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTMwMik6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBsYXllciBNSU5TVEVQIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQiLCBpbmRleCwgbnVtTWluc3RlcF8pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTMwMiwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBtaW5zdGVwWFNhbWVDb3JuZXJzX1tpbmRleF0gPT0gLTEgPyAwIDogMTsKLX0KLQotLy8gNS43Ci1sZWZpT3J0aG9nb25hbCAqCi1sZWZpTGF5ZXI6Om9ydGhvZ29uYWwoKSBjb25zdAotewotICAgIHJldHVybiBzcGFjaW5nVGFibGVPcnRob187Ci19Ci0KLS8vIDUuNwotZG91YmxlCi1sZWZpTGF5ZXI6Om1heEZsb2F0aW5nQXJlYSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1heEFyZWFfOwotfQotCi0vLyA1LjcKLWRvdWJsZQotbGVmaUxheWVyOjp2aWFXaWR0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHZpYVdpZHRoXzsKLX0KLQotLy8gNS43Ci1kb3VibGUKLWxlZmlMYXllcjo6Y3V0U3BhY2luZygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGN1dFNwYWNpbmdfOwotfQotCi0vLyA1LjcKLWludAotbGVmaUxheWVyOjpudW1BcnJheUN1dHMoKSBjb25zdAotewotICAgIHJldHVybiBudW1BcnJheUN1dHNfOwotfQotCi0vLyA1LjcKLWludAotbGVmaUxheWVyOjphcnJheUN1dHMoaW50IGluZGV4KSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IG51bUFycmF5Q3V0c18pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xMzAzKTogVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIGxheWVyIEFSUkFZQ1VUUyBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bUFycmF5Q3V0c18pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTMwMywgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBhcnJheUN1dHNfW2luZGV4XTsKLX0KLQotLy8gNS43Ci1kb3VibGUKLWxlZmlMYXllcjo6YXJyYXlTcGFjaW5nKGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjaGFyIG1zZ1sxNjBdOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBudW1BcnJheUN1dHNfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTMwNCk6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBsYXllciBTUEFDSU5HIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQiLCBpbmRleCwgbnVtQXJyYXlDdXRzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxMzA0LCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIGFycmF5U3BhY2luZ3NfW2luZGV4XTsKLX0KLQotLy8gUFJJVkFURSA1LjcKLS8vIFNQQUNJTkcgY3V0U3BhY2luZwotLy8gICAgIFtDRU5URVJUT0NFTlRFUl0KLS8vICAgICBbU0FNRU5FVF0KLS8vICAgICBbIExBWUVSIHNlY29uZExheWVyTmFtZSBbU1RBQ0tdCi0vLyAgICAgfCBBREpBQ0VOVENVVFMgezJ8M3w0fSBXSVRISU4gY3V0V2l0aGluIFtFWENFUFRTQU1FUEdORVRdCi0vLyAgICAgfCBQQVJBTExFTE9WRVJMQVAKLS8vICAgICB8IEFSRUEgY3V0QXJlYSBdIDsKLS8vIFNQQUNJTkcgcm91dGluZyBFTkRPRkxJTkUgZW9sV2lkdGggV0lUSElOIGVvbFdpdGhpbgotLy8gICAgIFtQQVJBTExFTEVER0UgcGFyU3BhY2UgV0lUSElOIHBhcldpdGhpbiBbVFdPRURHRVNdXTsKLXZvaWQKLWxlZmlMYXllcjo6cGFyc2VTcGFjaW5nKGludCBpbmRleCkKLXsKLSAgICBjaGFyICAgICp3cmtpbmdTdHIgPSBzdHJkdXAodmFsdWVzX1tpbmRleF0pOwotICAgIGNoYXIgICAgKnZhbHVlOwotICAgIGRvdWJsZSAgc3BWYWx1ZSA9IDAsIHdpZHRoID0gMCwgd2l0aGluID0gMCwgcFZhbHVlID0gMCwgcFdpdGhpbiA9IDA7Ci0gICAgZG91YmxlICBjdXRBcmVhID0gMDsKLSAgICBjaGFyICAgIG1zZ1sxMDI0XTsKLSAgICBpbnQgICAgIG51bUN1dHMgPSAwLCB0d29FZGdlcyA9IDA7Ci0KLSAgICAvLyBQcmUtcGFyc2UgdGhlIHN0cmluZyBiZWZvcmUgYnJlYWtpbmcgaXQgdXAgYW5kIHN0b3JlIGl0IGluCi0gICAgLy8gdGhlIGxheWVyIGNsYXNzLgotICAgIC8vIElmIHRoZSBzdHJpbmcgaXMKLSAgICAvLyBTUEFDSU5HIGVvbFNwYWNlIEVORE9GTElORSBlb2xXaWR0aCBXSVRISU4gZW9sV2l0aGluCi0gICAgLy8gICAgW1BBUkFMTEVMRURHRSBwYXJTcGFjZSBXSVRISU4gcGFyV2l0aGluIFtUV09FREdFU11dCi0gICAgLy8gICAgW0VOQ0xPU0VDVVQgW0JFTE9XIHwgQUJPVkVdIGVuY2xvc2VEaXN0IENVVFNQQUNJTkcgY3V0VG9NZXRhbFNwYWNlXQotICAgIC8vIEtlZXAgdGhlIHByb3BlcnR5IGFzIGl0LCBhbmQgZG9uJ3QgYnJlYWsgaXQgYW5kIHNhdmUgaW4gbGF5ZXIgY2xhc3MKLQotICAgIHZhbHVlID0gc3RydG9rKHdya2luZ1N0ciwgIiAiKTsKLSAgICB3aGlsZSAodmFsdWUpIHsKLSAgICAgICAgaWYgKHN0cmNtcCh2YWx1ZSwgIlNQQUNJTkciKSAhPSAwKSB7Ci0gICAgICAgICAgICBmcmVlKHdya2luZ1N0cik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB2YWx1ZSA9IHN0cnRvayhOVUxMLCAiICIpOwotICAgICAgICBzcFZhbHVlID0gYXRvZih2YWx1ZSk7Ci0KLSAgICAgICAgdmFsdWUgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICAgICAgaWYgKChzdHJjbXAodmFsdWUsICJDRU5URVJUT0NFTlRFUiIpID09IDApIHx8Ci0gICAgICAgICAgICAoc3RyY21wKHZhbHVlLCAiU0FNRU5FVCIpID09IDApIHx8Ci0gICAgICAgICAgICAoc3RyY21wKHZhbHVlLCAiTEFZRVIiKSA9PSAwKSB8fAotICAgICAgICAgICAgKHN0cmNtcCh2YWx1ZSwgIkFESkFDRU5UQ1VUUyIpID09IDApIHx8Ci0gICAgICAgICAgICAoc3RyY21wKHZhbHVlLCAiUEFSQUxMRUxPVkVSTEFQIikgPT0gMCkgfHwKLSAgICAgICAgICAgIChzdHJjbXAodmFsdWUsICJBUkVBIikgPT0gMCkpIHsKLQotICAgICAgICAgICAgaWYgKHN0cmNtcCh0eXBlKCksICJDVVQiKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzMjEpOiBUaGUgcHJvcGVydHkgTEVGNTdfU1BBQ0lORyB3aXRoIHZhbHVlICVzIGlzIGZvciBUWVBFIENVVCBvbmx5LlxuVGhlIGN1cnJlbnQgbGF5ZXIgaGFzIHRoZSBUWVBFICVzLlxuVXBkYXRlIHRoZSBwcm9wZXJ0eSBvZiB5b3VyIGxlZiBmaWxlIHdpdGggdGhlIGNvcnJlY3Qgc3ludGF4IG9yIHJlbW92ZSB0aGlzIHByb3BlcnR5IGZyb20geW91ciBsZWYgZmlsZS5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX1tpbmRleF0sIHR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaUVycm9yKG1zZyk7Ci0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBzcHJpbnRmKG1zZywgIlRoZSBwcm9wZXJ0eSBMRUY1N19TUEFDSU5HIHdpdGggdmFsdWUgJXMgaXMgZm9yIFRZUEUgQ1VUIG9ubHkuXG5UaGUgY3VycmVudCBsYXllciBoYXMgdGhlIFRZUEUgJXMuXG5VcGRhdGUgdGhlIHByb3BlcnR5IG9mIHlvdXIgbGVmIGZpbGUgd2l0aCB0aGUgY29ycmVjdCBzeW50YXggb3IgcmVtb3ZlIHRoaXMgcHJvcGVydHkgZnJvbSB5b3VyIGxlZiBmaWxlLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc19baW5kZXhdLCB0eXBlKCkpOwotICAgICAgICAgICAgICAgIGxlZkVycm9yKDEzMjEsIG1zZyk7Ci0gICAgICAgICAgICAgICAgZnJlZSh3cmtpbmdTdHIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldFNwYWNpbmdNaW4oc3BWYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoc3RyY21wKHZhbHVlLCAiQ0VOVEVSVE9DRU5URVIiKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gU1BBQ0lORyBtaW5TcGFjaW5nIENFTlRFUlRPQ0VOVEVSIDsKLSAgICAgICAgICAgICAgICBzZXRTcGFjaW5nQ2VudGVyVG9DZW50ZXIoKTsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnRvayhOVUxMLCAiICIpOwotICAgICAgICAgICAgICAgIGlmICgqdmFsdWUgPT0gJzsnKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RydG9rKE5VTEwsICIgIik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgLy8gTG9vayBmb3IgYSBuZXcgc3RhdGVtZW50Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN0cmNtcCh2YWx1ZSwgIlNBTUVORVQiKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gU1BBQ0lORyBtaW5TcGFjaW5nIFNBTUVORVQgOwotICAgICAgICAgICAgICAgIHNldFNwYWNpbmdTYW1lbmV0KCk7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICAgICAgICAgICAgICBpZiAoKnZhbHVlID09ICc7JykgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnRvayhOVUxMLCAiICIpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgIC8vIExvb2sgZm9yIGEgbmV3IHN0YXRlbWVudAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdHJjbXAodmFsdWUsICJMQVlFUiIpID09IDApIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnRvayhOVUxMLCAiICIpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiAqdmFsdWUgIT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICBzZXRTcGFjaW5nTmFtZSh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RydG9rKE5VTEwsICIgIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJjbXAodmFsdWUsICJTVEFDSyIpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFNwYWNpbmdMYXllclN0YWNrKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnRvayhOVUxMLCAiICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCp2YWx1ZSAhPSAnOycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTMyMCk6IEluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfU1BBQ0lORzogJXMuXG5Db3JyZWN0IHN5bnRheCBpcyBcIlNQQUNJTkcgY3V0U3BhY2luZyBbQ0VOVEVSVE9DRU5URVJdW1NBTUVORVRdXG5cdFtMQVlFUiBzZWNvbmRMYXllck5hbWVbU1RBQ0tdXG5cdHwgQURKQUNFTlRDVVRTIHsyIHwgMyB8IDR9IFdJVEhJTiBjdXRXaXRoaW4gW0VYQ0VQVFNBTUVQR05FVF1cblx0fCBQQVJBTExFTE9WRVJMQVBcblx0fCBBUkVBIGN1dEFyZWEgO1wiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfW2luZGV4XSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaUVycm9yKG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKG1zZywgIkluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfU1BBQ0lORzogJXMuXG5Db3JyZWN0IHN5bnRheCBpcyBcIlNQQUNJTkcgY3V0U3BhY2luZyBbQ0VOVEVSVE9DRU5URVJdW1NBTUVORVRdXG5cdFtMQVlFUiBzZWNvbmRMYXllck5hbWVbU1RBQ0tdXG5cdHwgQURKQUNFTlRDVVRTIHsyIHwgMyB8IDR9IFdJVEhJTiBjdXRXaXRoaW4gW0VYQ0VQVFNBTUVQR05FVF1cblx0fCBQQVJBTExFTE9WRVJMQVBcblx0fCBBUkVBIGN1dEFyZWEgO1wiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZFcnJvcigxMzIwLCBtc2cpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUod3JraW5nU3RyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKnZhbHVlICE9ICc7JykgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTMyMCk6IEluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfU1BBQ0lORzogJXMuXG5Db3JyZWN0IHN5bnRheCBpcyBcIlNQQUNJTkcgY3V0U3BhY2luZyBbQ0VOVEVSVE9DRU5URVJdW1NBTUVORVRdXG5cdFtMQVlFUiBzZWNvbmRMYXllck5hbWVbU1RBQ0tdXG5cdHwgQURKQUNFTlRDVVRTIHsyIHwgMyB8IDR9IFdJVEhJTiBjdXRXaXRoaW4gW0VYQ0VQVFNBTUVQR05FVF1cblx0fCBQQVJBTExFTE9WRVJMQVBcblx0fCBBUkVBIGN1dEFyZWEgO1wiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZmlFcnJvcihtc2cpOwotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYobXNnLCAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19TUEFDSU5HOiAlcy5cbkNvcnJlY3Qgc3ludGF4IGlzIFwiU1BBQ0lORyBjdXRTcGFjaW5nIFtDRU5URVJUT0NFTlRFUl1bU0FNRU5FVF1cblx0W0xBWUVSIHNlY29uZExheWVyTmFtZVtTVEFDS11cblx0fCBBREpBQ0VOVENVVFMgezIgfCAzIHwgNH0gV0lUSElOIGN1dFdpdGhpbiBbRVhDRVBUU0FNRVBHTkVUXVxuXHR8IFBBUkFMTEVMT1ZFUkxBUFxuXHR8IEFSRUEgY3V0QXJlYSA7XCIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfW2luZGV4XSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZWZFcnJvcigxMzIwLCBtc2cpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSh3cmtpbmdTdHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAodmFsdWUsICJBREpBQ0VOVENVVFMiKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICAgICAgICAgICAgICBudW1DdXRzID0gYXRvaSh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKChudW1DdXRzIDwgMikgfHwgKG51bUN1dHMgPiA0KSkgewotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzMjApOiBJbmNvcnJlY3Qgc3ludGF4IGRlZmluZWQgZm9yIHByb3BlcnR5IExFRjU3X1NQQUNJTkc6ICVzLlxuQ29ycmVjdCBzeW50YXggaXMgXCJTUEFDSU5HIGN1dFNwYWNpbmcgW0NFTlRFUlRPQ0VOVEVSXVtTQU1FTkVUXVxuXHRbTEFZRVIgc2Vjb25kTGF5ZXJOYW1lW1NUQUNLXVxuXHR8IEFESkFDRU5UQ1VUUyB7MiB8IDMgfCA0fSBXSVRISU4gY3V0V2l0aGluIFtFWENFUFRTQU1FUEdORVRdXG5cdHwgUEFSQUxMRUxPVkVSTEFQXG5cdHwgQVJFQSBjdXRBcmVhIDtcIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaUVycm9yKG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHNwcmludGYobXNnLCAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19TUEFDSU5HOiAlcy5cbkNvcnJlY3Qgc3ludGF4IGlzIFwiU1BBQ0lORyBjdXRTcGFjaW5nIFtDRU5URVJUT0NFTlRFUl1bU0FNRU5FVF1cblx0W0xBWUVSIHNlY29uZExheWVyTmFtZVtTVEFDS11cblx0fCBBREpBQ0VOVENVVFMgezIgfCAzIHwgNH0gV0lUSElOIGN1dFdpdGhpbiBbRVhDRVBUU0FNRVBHTkVUXVxuXHR8IFBBUkFMTEVMT1ZFUkxBUFxuXHR8IEFSRUEgY3V0QXJlYSA7XCIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgICAgICAgICAgICAgbGVmRXJyb3IoMTMyMCwgbXNnKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh3cmtpbmdTdHIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZhbHVlID0gc3RydG9rKE5VTEwsICIgIik7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmNtcCh2YWx1ZSwgIldJVEhJTiIpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgd2l0aGluID0gYXRvZih2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNldFNwYWNpbmdBZGphY2VudChudW1DdXRzLCB3aXRoaW4pOwotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnRvayhOVUxMLCAiICIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHZhbHVlLCAiRVhDRVBUU0FNRVBHTkVUIikgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3BhY2luZ0FkamFjZW50RXhjZXB0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnRvayhOVUxMLCAiICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCp2YWx1ZSAhPSAnOycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTMyMCk6IEluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfU1BBQ0lORzogJXMuXG5Db3JyZWN0IHN5bnRheCBpcyBcIlNQQUNJTkcgY3V0U3BhY2luZyBbQ0VOVEVSVE9DRU5URVJdW1NBTUVORVRdXG5cdFtMQVlFUiBzZWNvbmRMYXllck5hbWVbU1RBQ0tdXG5cdHwgQURKQUNFTlRDVVRTIHsyIHwgMyB8IDR9IFdJVEhJTiBjdXRXaXRoaW4gW0VYQ0VQVFNBTUVQR05FVF1cblx0fCBQQVJBTExFTE9WRVJMQVBcblx0fCBBUkVBIGN1dEFyZWEgO1wiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfW2luZGV4XSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaUVycm9yKG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKG1zZywgIkluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfU1BBQ0lORzogJXMuXG5Db3JyZWN0IHN5bnRheCBpcyBcIlNQQUNJTkcgY3V0U3BhY2luZyBbQ0VOVEVSVE9DRU5URVJdW1NBTUVORVRdXG5cdFtMQVlFUiBzZWNvbmRMYXllck5hbWVbU1RBQ0tdXG5cdHwgQURKQUNFTlRDVVRTIHsyIHwgMyB8IDR9IFdJVEhJTiBjdXRXaXRoaW4gW0VYQ0VQVFNBTUVQR05FVF1cblx0fCBQQVJBTExFTE9WRVJMQVBcblx0fCBBUkVBIGN1dEFyZWEgO1wiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZFcnJvcigxMzIwLCBtc2cpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUod3JraW5nU3RyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKnZhbHVlICE9ICc7JykgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTMyMCk6IEluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfU1BBQ0lORzogJXMuXG5Db3JyZWN0IHN5bnRheCBpcyBcIlNQQUNJTkcgY3V0U3BhY2luZyBbQ0VOVEVSVE9DRU5URVJdW1NBTUVORVRdXG5cdFtMQVlFUiBzZWNvbmRMYXllck5hbWVbU1RBQ0tdXG5cdHwgQURKQUNFTlRDVVRTIHsyIHwgMyB8IDR9IFdJVEhJTiBjdXRXaXRoaW4gW0VYQ0VQVFNBTUVQR05FVF1cblx0fCBQQVJBTExFTE9WRVJMQVBcblx0fCBBUkVBIGN1dEFyZWEgO1wiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZmlFcnJvcihtc2cpOwotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYobXNnLCAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19TUEFDSU5HOiAlcy5cbkNvcnJlY3Qgc3ludGF4IGlzIFwiU1BBQ0lORyBjdXRTcGFjaW5nIFtDRU5URVJUT0NFTlRFUl1bU0FNRU5FVF1cblx0W0xBWUVSIHNlY29uZExheWVyTmFtZVtTVEFDS11cblx0fCBBREpBQ0VOVENVVFMgezIgfCAzIHwgNH0gV0lUSElOIGN1dFdpdGhpbiBbRVhDRVBUU0FNRVBHTkVUXVxuXHR8IFBBUkFMTEVMT1ZFUkxBUFxuXHR8IEFSRUEgY3V0QXJlYSA7XCIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfW2luZGV4XSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZWZFcnJvcigxMzIwLCBtc2cpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSh3cmtpbmdTdHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTMyMCk6IEluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfU1BBQ0lORzogJXMuXG5Db3JyZWN0IHN5bnRheCBpcyBcIlNQQUNJTkcgY3V0U3BhY2luZyBbQ0VOVEVSVE9DRU5URVJdW1NBTUVORVRdXG5cdFtMQVlFUiBzZWNvbmRMYXllck5hbWVbU1RBQ0tdXG5cdHwgQURKQUNFTlRDVVRTIHsyIHwgMyB8IDR9IFdJVEhJTiBjdXRXaXRoaW4gW0VYQ0VQVFNBTUVQR05FVF1cblx0fCBQQVJBTExFTE9WRVJMQVBcblx0fCBBUkVBIGN1dEFyZWEgO1wiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX1tpbmRleF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZpRXJyb3IobXNnKTsKLSAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgc3ByaW50Zihtc2csICJJbmNvcnJlY3Qgc3ludGF4IGRlZmluZWQgZm9yIHByb3BlcnR5IExFRjU3X1NQQUNJTkc6ICVzLlxuQ29ycmVjdCBzeW50YXggaXMgXCJTUEFDSU5HIGN1dFNwYWNpbmcgW0NFTlRFUlRPQ0VOVEVSXVtTQU1FTkVUXVxuXHRbTEFZRVIgc2Vjb25kTGF5ZXJOYW1lW1NUQUNLXVxuXHR8IEFESkFDRU5UQ1VUUyB7MiB8IDMgfCA0fSBXSVRISU4gY3V0V2l0aGluIFtFWENFUFRTQU1FUEdORVRdXG5cdHwgUEFSQUxMRUxPVkVSTEFQXG5cdHwgQVJFQSBjdXRBcmVhIDtcIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX1tpbmRleF0pOwotICAgICAgICAgICAgICAgICAgICBsZWZFcnJvcigxMzIwLCBtc2cpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKHdya2luZ1N0cik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCh2YWx1ZSwgIlBBUkFMTEVMT1ZFUkxBUCIpID09IDApIHsKLSAgICAgICAgICAgICAgICAvLyBTUEFDSU5HIG1pblNwYWNpbmcgUEFSQUxMRUxPVkVSTEFQIDsKLSAgICAgICAgICAgICAgICBzZXRTcGFjaW5nUGFyYWxsZWxPdmVybGFwKCk7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICAgICAgICAgICAgICBpZiAoKnZhbHVlICE9ICc7JykgewotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzMjApOiBJbmNvcnJlY3Qgc3ludGF4IGRlZmluZWQgZm9yIHByb3BlcnR5IExFRjU3X1NQQUNJTkc6ICVzLlxuQ29ycmVjdCBzeW50YXggaXMgXCJTUEFDSU5HIGN1dFNwYWNpbmcgW0NFTlRFUlRPQ0VOVEVSXVtTQU1FTkVUXVxuXHRbTEFZRVIgc2Vjb25kTGF5ZXJOYW1lW1NUQUNLXVxuXHR8IEFESkFDRU5UQ1VUUyB7MiB8IDMgfCA0fSBXSVRISU4gY3V0V2l0aGluIFtFWENFUFRTQU1FUEdORVRdXG5cdHwgUEFSQUxMRUxPVkVSTEFQXG5cdHwgQVJFQSBjdXRBcmVhIDtcIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaUVycm9yKG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHNwcmludGYobXNnLCAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19TUEFDSU5HOiAlcy5cbkNvcnJlY3Qgc3ludGF4IGlzIFwiU1BBQ0lORyBjdXRTcGFjaW5nIFtDRU5URVJUT0NFTlRFUl1bU0FNRU5FVF1cblx0W0xBWUVSIHNlY29uZExheWVyTmFtZVtTVEFDS11cblx0fCBBREpBQ0VOVENVVFMgezIgfCAzIHwgNH0gV0lUSElOIGN1dFdpdGhpbiBbRVhDRVBUU0FNRVBHTkVUXVxuXHR8IFBBUkFMTEVMT1ZFUkxBUFxuXHR8IEFSRUEgY3V0QXJlYSA7XCIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgICAgICAgICAgICAgbGVmRXJyb3IoMTMyMCwgbXNnKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh3cmtpbmdTdHIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCh2YWx1ZSwgIkFSRUEiKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICAgICAgICAgICAgICBjdXRBcmVhID0gYXRvZih2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgc2V0U3BhY2luZ0FyZWEoY3V0QXJlYSk7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICAgICAgICAgICAgICBpZiAoKnZhbHVlICE9ICc7JykgewotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzMjApOiBJbmNvcnJlY3Qgc3ludGF4IGRlZmluZWQgZm9yIHByb3BlcnR5IExFRjU3X1NQQUNJTkc6ICVzLlxuQ29ycmVjdCBzeW50YXggaXMgXCJTUEFDSU5HIGN1dFNwYWNpbmcgW0NFTlRFUlRPQ0VOVEVSXVtTQU1FTkVUXVxuXHRbTEFZRVIgc2Vjb25kTGF5ZXJOYW1lW1NUQUNLXVxuXHR8IEFESkFDRU5UQ1VUUyB7MiB8IDMgfCA0fSBXSVRISU4gY3V0V2l0aGluIFtFWENFUFRTQU1FUEdORVRdXG5cdHwgUEFSQUxMRUxPVkVSTEFQXG5cdHwgQVJFQSBjdXRBcmVhIDtcIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaUVycm9yKG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHNwcmludGYobXNnLCAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19TUEFDSU5HOiAlcy5cbkNvcnJlY3Qgc3ludGF4IGlzIFwiU1BBQ0lORyBjdXRTcGFjaW5nIFtDRU5URVJUT0NFTlRFUl1bU0FNRU5FVF1cblx0W0xBWUVSIHNlY29uZExheWVyTmFtZVtTVEFDS11cblx0fCBBREpBQ0VOVENVVFMgezIgfCAzIHwgNH0gV0lUSElOIGN1dFdpdGhpbiBbRVhDRVBUU0FNRVBHTkVUXVxuXHR8IFBBUkFMTEVMT1ZFUkxBUFxuXHR8IEFSRUEgY3V0QXJlYSA7XCIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgICAgICAgICAgICAgbGVmRXJyb3IoMTMyMCwgbXNnKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh3cmtpbmdTdHIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHZhbHVlLCAiU0FNRU1FVEFMIikgPT0gMCkgewotICAgICAgICAgICAgLy8gU1BBQ0lORyBjdXRTcGFjaW5nIFNBTUVNRVRBTCBqdXN0IGV4aXQKLSAgICAgICAgICAgIGZyZWUod3JraW5nU3RyKTsKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCh2YWx1ZSwgIkVORE9GTElORSIpID09IDApIHsKLSAgICAgICAgICAgIC8vIFNQQUNJTkcgZW9sU3BhY2UgRU5ET0ZMSU5FIGVvbFdpZHRoIFdJVEhJTiBlb2xXaXRoaW4KLSAgICAgICAgICAgIC8vICAgIFtQQVJBTExFTEVHRSBwYXJTcGFjZSBXSVRISU4gcGFyV2l0aGluIFtUV09FREdFU11dCi0gICAgICAgICAgICAvLyBQYXJzZSB0aGUgc3RyaW5nIGxlZkRhdGEtPmZpcnN0LCBpZiBpdCBoYXMgdGhlIHN5bnRheCBvZgotICAgICAgICAgICAgLy8gU1BBQ0lORyBlb2xTcGFjZSBFTkRPRkxJTkUgZW9sV2lkdGggV0lUSElOIGVvbFdpdGhpbgotICAgICAgICAgICAgLy8gW1BBUkFMTEVMRURHRSBwYXJTcGFjZSBXSVRISU4gcGFyV2l0aGluIFtUV09FREdFU11dCi0gICAgICAgICAgICAvLyB0aGFuIHN0b3JlIHRoZSBkYXRhLCBvdGhlcndpc2UsIHNraXAgdG8gOwotCi0gICAgICAgICAgICBpZiAoc3RyY21wKHR5cGUoKSwgIlJPVVRJTkciKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzMjIpOiBUaGUgcHJvcGVydHkgTEVGNTdfU1BBQ0lORyB3aXRoIHZhbHVlICVzIGlzIGZvciBUWVBFIFJPVVRJTkcgb25seS5cblRoZSBjdXJyZW50IGxheWVyIGhhcyB0aGUgVFlQRSAlcy5cblVwZGF0ZSB0aGUgcHJvcGVydHkgb2YgeW91ciBsZWYgZmlsZSB3aXRoIHRoZSBjb3JyZWN0IHN5bnRheCBvciByZW1vdmUgdGhpcyBwcm9wZXJ0eSBmcm9tIHlvdXIgbGVmIGZpbGUuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc19baW5kZXhdLCB0eXBlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZmlFcnJvcihtc2cpOwotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgc3ByaW50Zihtc2csICJUaGUgcHJvcGVydHkgTEVGNTdfU1BBQ0lORyB3aXRoIHZhbHVlICVzIGlzIGZvciBUWVBFIFJPVVRJTkcgb25seS5cblRoZSBjdXJyZW50IGxheWVyIGhhcyB0aGUgVFlQRSAlcy5cblVwZGF0ZSB0aGUgcHJvcGVydHkgb2YgeW91ciBsZWYgZmlsZSB3aXRoIHRoZSBjb3JyZWN0IHN5bnRheCBvciByZW1vdmUgdGhpcyBwcm9wZXJ0eSBmcm9tIHlvdXIgbGVmIGZpbGUuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX1tpbmRleF0sIHR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgbGVmRXJyb3IoMTMyMiwgbXNnKTsKLSAgICAgICAgICAgICAgICBmcmVlKHdya2luZ1N0cik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0d29FZGdlcyA9IDA7Ci0KLSAgICAgICAgICAgIHZhbHVlID0gc3RydG9rKE5VTEwsICIgIik7Ci0gICAgICAgICAgICB3aWR0aCA9IGF0b2YodmFsdWUpOwotICAgICAgICAgICAgdmFsdWUgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICAgICAgICAgIGlmIChzdHJjbXAodmFsdWUsICJXSVRISU4iKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICAgICAgICAgICAgICB3aXRoaW4gPSBhdG9mKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAvLyAqIHNldFNwYWNpbmdNaW4oc3BWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgLy8gKiBzZXRTcGFjaW5nRW9sKHdpZHRoLCB3aXRoaW4pOwotICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIG9wdGlvbiBbUEFSQUxMRUxFREdFIHBhclNwYWNlIFdJVEhJTiBwYXJXaXRoaW5dIGlzIHNldAotICAgICAgICAgICAgICAgIHZhbHVlID0gc3RydG9rKE5VTEwsICIgIik7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmICp2YWx1ZSAhPSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJjbXAodmFsdWUsICJQQVJBTExFTEVER0UiKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnRvayhOVUxMLCAiICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlID0gYXRvZih2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnRvayhOVUxMLCAiICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmNtcCh2YWx1ZSwgIldJVEhJTiIpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnRvayhOVUxMLCAiICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXaXRoaW4gPSBhdG9mKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAqIHNldFNwYWNpbmdQYXJTVyhwVmFsdWUsIHBXaXRoaW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIFRXT0VER0VTIGlzIHNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RydG9rKE5VTEwsICIgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmICp2YWx1ZSAhPSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJjbXAodmFsdWUsICJUV09FREdFUyIpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICogc2V0U3BhY2luZ1BhclR3b0VkZ2VzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d29FZGdlcyA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnRvayhOVUxMLCAiICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCp2YWx1ZSA9PSAnOycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYXZlIHRoZSB2YWx1ZSB0byBsZWZpTGF5ZXIgY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTcGFjaW5nTWluKHNwVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNwYWNpbmdFb2wod2lkdGgsIHdpdGhpbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3BhY2luZ1BhclNXKHBWYWx1ZSwgcFdpdGhpbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR3b0VkZ2VzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTcGFjaW5nUGFyVHdvRWRnZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnRvayhOVUxMLCAiICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAvLyB3aXRoIHRoZSB3aGlsZSBsb29wIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNb3JlIHJ1bGVzLCBza2lwIHRvIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHZhbHVlKSAmJiAoKnZhbHVlICE9ICc7JykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCp2YWx1ZSAhPSAnXG4nKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHZhbHVlKSAmJiAoKnZhbHVlID09ICc7JykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCp2YWx1ZSA9PSAnOycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNwYWNpbmdNaW4oc3BWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTcGFjaW5nRW9sKHdpZHRoLCB3aXRoaW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3BhY2luZ1BhclNXKHBWYWx1ZSwgcFdpdGhpbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnRvayhOVUxMLCAiICIpOyAgICAgIC8vIGRvbmUgd2l0aCB0aGlzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7ICAgICAgIC8vIHN0YXRlbWVudCB3aXRoIHRoZSB3aGlsZSBsb29wIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTW9yZSBydWxlcywgc2tpcCB0byA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHZhbHVlKSAmJiAoKnZhbHVlICE9ICc7JykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnZhbHVlICE9ICdcbicpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RydG9rKE5VTEwsICIgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHZhbHVlKSAmJiAoKnZhbHVlID09ICc7JykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnRvayhOVUxMLCAiICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xMzA1KTogSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19TUEFDSU5HOiAlcy5cbkNvcnJlY3Qgc3ludGF4IGlzIFwiU1BBQ0lORyBtaW5TcGFjaW5nIFtDRU5URVJUT0NFTlRFUl1cIlxuXCJbTEFZRVIgc2Vjb25kTGF5ZXJOYW1lIHwgQURKQUNFTlRDVVRTIHsyfDN8NH0gV0lUSElOIGN1dFdpdGhpbiB8IFBBUkFMTEVMT1ZFUkxBUCB8IEFSRUEgY3V0QXJlYV1cIiBvclxuXCJTUEFDSU5HIGVvbFNwYWNlIEVORE9GTElORSBlb2xXaWR0aCBXSVRISU4gZW9sV0lUSElOIFtQQVJBTExFTEVER0UgcGFyU3BhY2UgV0lUSElOIHBhcldpdGhpbiBbVE9XRURHRVNdXVwiXG4iLCB2YWx1ZXNfW2luZGV4XSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZmlFcnJvcihtc2cpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKG1zZywgIkluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfU1BBQ0lORzogJXMuXG5Db3JyZWN0IHN5bnRheCBpcyBcIlNQQUNJTkcgbWluU3BhY2luZyBbQ0VOVEVSVE9DRU5URVJdXCJcblwiW0xBWUVSIHNlY29uZExheWVyTmFtZSB8IEFESkFDRU5UQ1VUUyB7MnwzfDR9IFdJVEhJTiBjdXRXaXRoaW4gfCBQQVJBTExFTE9WRVJMQVAgfCBBUkVBIGN1dEFyZWFdXCIgb3JcblwiU1BBQ0lORyBlb2xTcGFjZSBFTkRPRkxJTkUgZW9sV2lkdGggV0lUSElOIGVvbFdJVEhJTiBbUEFSQUxMRUxFREdFIHBhclNwYWNlIFdJVEhJTiBwYXJXaXRoaW4gW1RPV0VER0VTXV1cIlxuIiwgdmFsdWVzX1tpbmRleF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZFcnJvcigxMzA1LCBtc2cpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHdya2luZ1N0cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xMzA1KTogSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19TUEFDSU5HOiAlcy5cbkNvcnJlY3Qgc3ludGF4IGlzIFwiU1BBQ0lORyBtaW5TcGFjaW5nIFtDRU5URVJUT0NFTlRFUl1cIlxuXCJbTEFZRVIgc2Vjb25kTGF5ZXJOYW1lIHwgQURKQUNFTlRDVVRTIHsyfDN8NH0gV0lUSElOIGN1dFdpdGhpbiB8IFBBUkFMTEVMT1ZFUkxBUCB8IEFSRUEgY3V0QXJlYV1cIiBvclxuXCJTUEFDSU5HIGVvbFNwYWNlIEVORE9GTElORSBlb2xXaWR0aCBXSVRISU4gZW9sV0lUSElOIFtQQVJBTExFTEVER0UgcGFyU3BhY2UgV0lUSElOIHBhcldpdGhpbiBbVE9XRURHRVNdXVwiXG4iLCB2YWx1ZXNfW2luZGV4XSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaUVycm9yKG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKG1zZywgIkluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfU1BBQ0lORzogJXMuXG5Db3JyZWN0IHN5bnRheCBpcyBcIlNQQUNJTkcgbWluU3BhY2luZyBbQ0VOVEVSVE9DRU5URVJdXCJcblwiW0xBWUVSIHNlY29uZExheWVyTmFtZSB8IEFESkFDRU5UQ1VUUyB7MnwzfDR9IFdJVEhJTiBjdXRXaXRoaW4gfCBQQVJBTExFTE9WRVJMQVAgfCBBUkVBIGN1dEFyZWFdXCIgb3JcblwiU1BBQ0lORyBlb2xTcGFjZSBFTkRPRkxJTkUgZW9sV2lkdGggV0lUSElOIGVvbFdJVEhJTiBbUEFSQUxMRUxFREdFIHBhclNwYWNlIFdJVEhJTiBwYXJXaXRoaW4gW1RPV0VER0VTXV1cIlxuIiwgdmFsdWVzX1tpbmRleF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZkVycm9yKDEzMDUsIG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSh3cmtpbmdTdHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgqdmFsdWUgPT0gJzsnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTYXZlIHRoZSBkYXRhIGluIGxlZmlMYXllciBsZWZEYXRhLT5maXJzdAotICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3BhY2luZ01pbihzcFZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFNwYWNpbmdFb2wod2lkdGgsIHdpdGhpbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnRvayhOVUxMLCAiICIpOyAgICAgIC8vIGRvbmUgd2l0aCB0aGlzIAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHZhbHVlKSAmJiAoKnZhbHVlICE9ICc7JykgJiYgKCp2YWx1ZSAhPSAnXG4nKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnRvayhOVUxMLCAiICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh2YWx1ZSkgJiYgKCp2YWx1ZSA9PSAnOycpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzMDUpOiBJbmNvcnJlY3Qgc3ludGF4IGRlZmluZWQgZm9yIHByb3BlcnR5IExFRjU3X1NQQUNJTkc6ICVzLlxuQ29ycmVjdCBzeW50YXggaXMgZWl0aGVyIFwiU1BBQ0lORyBtaW5TcGFjaW5nIFtDRU5URVJUT0NFTlRFUl1cIlxuXCJbTEFZRVIgc2Vjb25kTGF5ZXJOYW1lIHwgQURKQUNFTlRDVVRTIHsyfDN8NH0gV0lUSElOIGN1dFdpdGhpbiB8IFBBUkFMTEVMT1ZFUkxBUCB8IEFSRUEgY3V0QXJlYV1cIiBvclxuXCJTUEFDSU5HIGVvbFNwYWNlIEVORE9GTElORSBlb2xXaWR0aCBXSVRISU4gZW9sV0lUSElOIFtQQVJBTExFTEVER0UgcGFyU3BhY2UgV0lUSElOIHBhcldpdGhpbiBbVE9XRURHRVNdXVwiXG4iLCB2YWx1ZXNfW2luZGV4XSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaUVycm9yKG1zZyk7Ci0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBzcHJpbnRmKG1zZywgIkluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfU1BBQ0lORzogJXMuXG5Db3JyZWN0IHN5bnRheCBpcyBlaXRoZXIgXCJTUEFDSU5HIG1pblNwYWNpbmcgW0NFTlRFUlRPQ0VOVEVSXVwiXG5cIltMQVlFUiBzZWNvbmRMYXllck5hbWUgfCBBREpBQ0VOVENVVFMgezJ8M3w0fSBXSVRISU4gY3V0V2l0aGluIHwgUEFSQUxMRUxPVkVSTEFQIHwgQVJFQSBjdXRBcmVhXVwiIG9yXG5cIlNQQUNJTkcgZW9sU3BhY2UgRU5ET0ZMSU5FIGVvbFdpZHRoIFdJVEhJTiBlb2xXSVRISU4gW1BBUkFMTEVMRURHRSBwYXJTcGFjZSBXSVRISU4gcGFyV2l0aGluIFtUT1dFREdFU11dXCJcbiIsIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgICAgICAgICBsZWZFcnJvcigxMzA1LCBtc2cpOwotICAgICAgICAgICAgICAgIGZyZWUod3JraW5nU3RyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xMzA1KTogSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19TUEFDSU5HOiAlcy5cbkNvcnJlY3Qgc3ludGF4IGlzIGVpdGhlciBcIlNQQUNJTkcgbWluU3BhY2luZyBbQ0VOVEVSVE9DRU5URVJdXCJcblwiW0xBWUVSIHNlY29uZExheWVyTmFtZSB8IEFESkFDRU5UQ1VUUyB7MnwzfDR9IFdJVEhJTiBjdXRXaXRoaW4gfCBQQVJBTExFTE9WRVJMQVAgfCBBUkVBIGN1dEFyZWFdXCIgb3JcblwiU1BBQ0lORyBlb2xTcGFjZSBFTkRPRkxJTkUgZW9sV2lkdGggV0lUSElOIGVvbFdJVEhJTiBbUEFSQUxMRUxFREdFIHBhclNwYWNlIFdJVEhJTiBwYXJXaXRoaW4gW1RPV0VER0VTXV1cIlxuIiwgdmFsdWVzX1tpbmRleF0pOwotICAgICAgICAgICAgICAgICAgICAgbGVmaUVycm9yKG1zZyk7Ci0gICAgICAgICAgICAqLwotICAgICAgICAgICAgc3ByaW50Zihtc2csICJJbmNvcnJlY3Qgc3ludGF4IGRlZmluZWQgZm9yIHByb3BlcnR5IExFRjU3X1NQQUNJTkc6ICVzLlxuQ29ycmVjdCBzeW50YXggaXMgZWl0aGVyIFwiU1BBQ0lORyBtaW5TcGFjaW5nIFtDRU5URVJUT0NFTlRFUl1cIlxuXCJbTEFZRVIgc2Vjb25kTGF5ZXJOYW1lIHwgQURKQUNFTlRDVVRTIHsyfDN8NH0gV0lUSElOIGN1dFdpdGhpbiB8IFBBUkFMTEVMT1ZFUkxBUCB8IEFSRUEgY3V0QXJlYV1cIiBvclxuXCJTUEFDSU5HIGVvbFNwYWNlIEVORE9GTElORSBlb2xXaWR0aCBXSVRISU4gZW9sV0lUSElOIFtQQVJBTExFTEVER0UgcGFyU3BhY2UgV0lUSElOIHBhcldpdGhpbiBbVE9XRURHRVNdXVwiXG4iLCB2YWx1ZXNfW2luZGV4XSk7Ci0gICAgICAgICAgICBsZWZFcnJvcigxMzA1LCBtc2cpOwotICAgICAgICAgICAgZnJlZSh3cmtpbmdTdHIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gTm9uZSBvZiB0aGUgYWJvdmUgc3RhdGVtZW50Ci0gICAgZnJlZSh3cmtpbmdTdHIpOwotICAgIHJldHVybjsKLX0KLQotLy8gUFJJVkFURSA1LjcKLS8qIE5PVCBhbiBPQSBkYXRhIG1vZGVsCi12b2lkIGxlZmlMYXllcjo6cGFyc2VNYXhGbG9hdGluZyhpbnQgaW5kZXgpIHsKLSAgIGNoYXIgICAqd3JraW5nU3RyID0gc3RyZHVwKHZhbHVlc19baW5kZXhdKTsKLSAgIGNoYXIgICAqdmFsdWU7Ci0gICBkb3VibGUgbWF4QXJlYTsKLSAgIGNoYXIgICBtc2dbMTAyNF07Ci0KLSAgIHZhbHVlID0gc3RydG9rKHdya2luZ1N0ciwgIiAiKTsKLSAgIGlmIChzdHJjbXAodmFsdWUsICJNQVhGTE9BVElOR0FSRUEiKSAhPSAwKSB7Ci0gICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzMDYpOiBJbmNvcnJlY3Qgc3ludGF4IGRlZmluZWQgZm9yIHByb3BlcnR5IExFRjU3X01BWEZMT0FUSU5HQVJFQTogJXMuXG5Db3JyZWN0IHN5bnRheCBpcyBcIk1BWEZMT0FUSU5HQVJFQSBtYXhBcmVhXCJcbiIsIHZhbHVlc19baW5kZXhdKTsKLSAgICAgIGxlZmlFcnJvcigwLCAxMzA2LCBtc2cpOwotICAgICAgZnJlZSh3cmtpbmdTdHIpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICB2YWx1ZSA9IHN0cnRvayhOVUxMLCAiICIpOwotICAgbWF4QXJlYSA9IGF0b2YodmFsdWUpOwotICAgc2V0TWF4RmxvYXRpbmdBcmVhKG1heEFyZWEpOwotCi0gICBmcmVlKHdya2luZ1N0cik7Ci0gICByZXR1cm47Ci19Ci0qLwotCi0vLyBQUklWQVRFIDUuNwotdm9pZAotbGVmaUxheWVyOjpwYXJzZUFycmF5U3BhY2luZyhpbnQgaW5kZXgpCi17Ci0gICAgY2hhciAgICAqd3JraW5nU3RyID0gc3RyZHVwKHZhbHVlc19baW5kZXhdKTsKLSAgICBjaGFyICAgICp2YWx1ZTsKLSAgICBkb3VibGUgIHZpYVdpZHRoID0gMCwgY3V0U3BhY2luZyA9IDAsIGFycmF5U3BhY2luZzsKLSAgICBpbnQgICAgIGFycmF5Q3V0czsKLSAgICBpbnQgICAgIGhhc0xvbmdBcnJheSA9IDAsIGhhc0FycmF5Q3V0ID0gMDsKLSAgICBjaGFyICAgIG1zZ1sxMDI0XTsKLQotICAgIHZhbHVlID0gc3RydG9rKHdya2luZ1N0ciwgIiAiKTsKLSAgICBpZiAoc3RyY21wKHZhbHVlLCAiQVJSQVlTUEFDSU5HIikgIT0gMCkgewotICAgICAgICAvKgotICAgICAgICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzMDcpOiBJbmNvcnJlY3Qgc3ludGF4IGRlZmluZWQgZm9yIHByb3BlcnR5IExFRjU3X0FSUkFZU1BBQ0lORzogJXMuXG5Db3JyZWN0IHN5bnRheCBpcyBBUlJBWVNQQUNJTkcgW0xPTkdBUlJBWV0gW1dJRFRIIHZpYVdpZHRoXSBDVVRTUEFDSU5HIGN1dFNwYWNpbmdcblx0QVJSQVlDVVRTIGFycmF5Q3V0cyBTUEFDSU5HIGFycmF5U3BhY2luZyAuLi5cbiIsIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgICAgICAgbGVmaUVycm9yKG1zZyk7Ci0gICAgICAgICovCi0gICAgICAgIHNwcmludGYobXNnLCAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19BUlJBWVNQQUNJTkc6ICVzLlxuQ29ycmVjdCBzeW50YXggaXMgQVJSQVlTUEFDSU5HIFtMT05HQVJSQVldIFtXSURUSCB2aWFXaWR0aF0gQ1VUU1BBQ0lORyBjdXRTcGFjaW5nXG5cdEFSUkFZQ1VUUyBhcnJheUN1dHMgU1BBQ0lORyBhcnJheVNwYWNpbmcgLi4uXG4iLCB2YWx1ZXNfW2luZGV4XSk7Ci0gICAgICAgIGxlZkVycm9yKDEzMDcsIG1zZyk7Ci0gICAgICAgIGZyZWUod3JraW5nU3RyKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB2YWx1ZSA9IHN0cnRvayhOVUxMLCAiICIpOwotCi0gICAgd2hpbGUgKHN0cmNtcCh2YWx1ZSwgIjsiKSAhPSAwKSB7Ci0gICAgICAgIGlmIChzdHJjbXAodmFsdWUsICJMT05HQVJSQVkiKSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAoY3V0U3BhY2luZyAhPSAwKSB7IC8vIG1ha2Ugc3VyZSBzeW50YXggaGFzIGNvcnJlY3Qgb3JkZXIgCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzMDgpOiBJbmNvcnJlY3Qgc3ludGF4IGRlZmluZWQgZm9yIHByb3BlcnR5IExFRjU3X0FSUkFZU1BBQ0lORzogJXMuXG5MT05HQVJSQVkgaXMgZGVmaW5lZCBhZnRlciBDVVRTUEFDSU5HLlxuQ29ycmVjdCBzeW50YXggaXMgQVJSQVlTUEFDSU5HIFtMT05HQVJSQVldIFtXSURUSCB2aWFXaWR0aF0gQ1VUU1BBQ0lORyBjdXRTcGFjaW5nXG5cdEFSUkFZQ1VUUyBhcnJheUN1dHMgU1BBQ0lORyBhcnJheVNwYWNpbmcgLi4uXG4iLCB2YWx1ZXNfW2luZGV4XSk7Ci0gICAgICAgICAgICAgICAgbGVmaUVycm9yKG1zZyk7Ci0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBzcHJpbnRmKG1zZywgIkluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfQVJSQVlTUEFDSU5HOiAlcy5cbkxPTkdBUlJBWSBpcyBkZWZpbmVkIGFmdGVyIENVVFNQQUNJTkcuXG5Db3JyZWN0IHN5bnRheCBpcyBBUlJBWVNQQUNJTkcgW0xPTkdBUlJBWV0gW1dJRFRIIHZpYVdpZHRoXSBDVVRTUEFDSU5HIGN1dFNwYWNpbmdcblx0QVJSQVlDVVRTIGFycmF5Q3V0cyBTUEFDSU5HIGFycmF5U3BhY2luZyAuLi5cbiIsIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgICAgICAgICBsZWZFcnJvcigxMzA4LCBtc2cpOwotICAgICAgICAgICAgICAgIGZyZWUod3JraW5nU3RyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYXNMb25nQXJyYXkgPSAxOwotICAgICAgICAgICAgdmFsdWUgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAodmFsdWUsICJXSURUSCIpID09IDApIHsKLSAgICAgICAgICAgIGlmIChjdXRTcGFjaW5nICE9IDApIHsgLy8gbWFrZSBzdXJlIHN5bnRheCBoYXMgY29ycmVjdCBvcmRlciAKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTMwOSk6IEluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfQVJSQVlTUEFDSU5HOiAlcy5cbldJRFRIIGlzIGRlZmluZWQgYWZ0ZXIgQ1VUU1BBQ0lORy5cbkNvcnJlY3Qgc3ludGF4IGlzIEFSUkFZU1BBQ0lORyBbTE9OR0FSUkFZXSBbV0lEVEggdmlhV2lkdGhdIENVVFNQQUNJTkcgY3V0U3BhY2luZ1xuXHRBUlJBWUNVVFMgYXJyYXlDdXRzIFNQQUNJTkcgYXJyYXlTcGFjaW5nIC4uLlxuIiwgdmFsdWVzX1tpbmRleF0pOwotICAgICAgICAgICAgICAgIGxlZmlFcnJvcihtc2cpOwotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgc3ByaW50Zihtc2csICJJbmNvcnJlY3Qgc3ludGF4IGRlZmluZWQgZm9yIHByb3BlcnR5IExFRjU3X0FSUkFZU1BBQ0lORzogJXMuXG5XSURUSCBpcyBkZWZpbmVkIGFmdGVyIENVVFNQQUNJTkcuXG5Db3JyZWN0IHN5bnRheCBpcyBBUlJBWVNQQUNJTkcgW0xPTkdBUlJBWV0gW1dJRFRIIHZpYVdpZHRoXSBDVVRTUEFDSU5HIGN1dFNwYWNpbmdcblx0QVJSQVlDVVRTIGFycmF5Q3V0cyBTUEFDSU5HIGFycmF5U3BhY2luZyAuLi5cbiIsIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgICAgICAgICBsZWZFcnJvcigxMzA5LCBtc2cpOwotICAgICAgICAgICAgICAgIGZyZWUod3JraW5nU3RyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YWx1ZSA9IHN0cnRvayhOVUxMLCAiICIpOwotICAgICAgICAgICAgdmlhV2lkdGggPSBhdG9mKHZhbHVlKTsKLSAgICAgICAgICAgIHZhbHVlID0gc3RydG9rKE5VTEwsICIgIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHZhbHVlLCAiQ1VUU1BBQ0lORyIpID09IDApIHsKLSAgICAgICAgICAgIGlmIChjdXRTcGFjaW5nICE9IDApIHsgLy8gbWFrZSBzdXJlIHN5bnRheCBoYXMgY29ycmVjdCBvcmRlciAKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTMxMCk6IEluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfQVJSQVlTUEFDSU5HOiAlcy5cbkNVVFNQQUNJTkcgaGFzIGRlZmluZWQgbW9yZSB0aGFuIG9uY2UuXG5Db3JyZWN0IHN5bnRheCBpcyBBUlJBWVNQQUNJTkcgW0xPTkdBUlJBWV0gW1dJRFRIIHZpYVdpZHRoXSBDVVRTUEFDSU5HIGN1dFNwYWNpbmdcblx0QVJSQVlDVVRTIGFycmF5Q3V0cyBTUEFDSU5HIGFycmF5U3BhY2luZyAuLi5cbiIsIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgICAgICAgICBsZWZpRXJyb3IobXNnKTsKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHNwcmludGYobXNnLCAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19BUlJBWVNQQUNJTkc6ICVzLlxuQ1VUU1BBQ0lORyBoYXMgZGVmaW5lZCBtb3JlIHRoYW4gb25jZS5cbkNvcnJlY3Qgc3ludGF4IGlzIEFSUkFZU1BBQ0lORyBbTE9OR0FSUkFZXSBbV0lEVEggdmlhV2lkdGhdIENVVFNQQUNJTkcgY3V0U3BhY2luZ1xuXHRBUlJBWUNVVFMgYXJyYXlDdXRzIFNQQUNJTkcgYXJyYXlTcGFjaW5nIC4uLlxuIiwgdmFsdWVzX1tpbmRleF0pOwotICAgICAgICAgICAgICAgIGxlZkVycm9yKDEzMTAsIG1zZyk7Ci0gICAgICAgICAgICAgICAgZnJlZSh3cmtpbmdTdHIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhbHVlID0gc3RydG9rKE5VTEwsICIgIik7Ci0gICAgICAgICAgICBjdXRTcGFjaW5nID0gYXRvZih2YWx1ZSk7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgc2V0QXJyYXlTcGFjaW5nKGhhc0xvbmdBcnJheSwgdmlhV2lkdGgsIGN1dFNwYWNpbmcpOwotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChoYXNMb25nQXJyYXkpCi0gICAgICAgICAgICAgICAgc2V0QXJyYXlTcGFjaW5nTG9uZ0FycmF5KCk7Ci0gICAgICAgICAgICBzZXRBcnJheVNwYWNpbmdXaWR0aCh2aWFXaWR0aCk7Ci0gICAgICAgICAgICBzZXRBcnJheVNwYWNpbmdDdXQoY3V0U3BhY2luZyk7Ci0gICAgICAgICAgICB2YWx1ZSA9IHN0cnRvayhOVUxMLCAiICIpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCh2YWx1ZSwgIkFSUkFZQ1VUUyIpID09IDApIHsKLSAgICAgICAgICAgIGlmIChjdXRTcGFjaW5nID09IDApIHsgLy8gbWFrZSBzdXJlIGN1dFNwYWNpbmcgaXMgYWxyZWFkeSBzZXQgCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzMTEpOiBJbmNvcnJlY3Qgc3ludGF4IGRlZmluZWQgZm9yIHByb3BlcnR5IExFRjU3X0FSUkFZU1BBQ0lORzogJXMuXG5DVVRTUEFDSU5HIHdoaWNoIGlzIHJlcXVpcmVkIGlzIGVpdGhlciBoYXMgbm90IGJlZW4gZGVmaW5lZCBvciBkZWZpbmVkIGluIGEgd3JvbmcgbG9jYXRpb24uXG5Db3JyZWN0IHN5bnRheCBpcyBBUlJBWVNQQUNJTkcgW0xPTkdBUlJBWV0gW1dJRFRIIHZpYVdpZHRoXSBDVVRTUEFDSU5HIGN1dFNwYWNpbmdcblx0QVJSQVlDVVRTIGFycmF5Q3V0cyBTUEFDSU5HIGFycmF5U3BhY2luZyAuLi5cbiIsIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgICAgICAgICBsZWZpRXJyb3IobXNnKTsKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHNwcmludGYobXNnLCAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19BUlJBWVNQQUNJTkc6ICVzLlxuQ1VUU1BBQ0lORyB3aGljaCBpcyByZXF1aXJlZCBpcyBlaXRoZXIgaGFzIG5vdCBiZWVuIGRlZmluZWQgb3IgZGVmaW5lZCBpbiBhIHdyb25nIGxvY2F0aW9uLlxuQ29ycmVjdCBzeW50YXggaXMgQVJSQVlTUEFDSU5HIFtMT05HQVJSQVldIFtXSURUSCB2aWFXaWR0aF0gQ1VUU1BBQ0lORyBjdXRTcGFjaW5nXG5cdEFSUkFZQ1VUUyBhcnJheUN1dHMgU1BBQ0lORyBhcnJheVNwYWNpbmcgLi4uXG4iLCB2YWx1ZXNfW2luZGV4XSk7Ci0gICAgICAgICAgICAgICAgbGVmRXJyb3IoMTMxMSwgbXNnKTsKLSAgICAgICAgICAgICAgICBmcmVlKHdya2luZ1N0cik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFsdWUgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICAgICAgICAgIGFycmF5Q3V0cyA9IGF0b2kodmFsdWUpOwotICAgICAgICAgICAgdmFsdWUgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICAgICAgICAgIGlmIChzdHJjbXAodmFsdWUsICJTUEFDSU5HIikgIT0gMCkgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xMzEyKTogSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciAgcHJvcGVydHkgTEVGNTdfQVJSQVlTUEFDSU5HOiAlcy5cblNQQUNJTkcgc2hvdWxkIGJlIGRlZmluZWQgd2l0aCBBUlJBWUNVVFMuXG5Db3JyZWN0IHN5bnRheCBpcyBBUlJBWVNQQUNJTkcgW0xPTkdBUlJBWV0gW1dJRFRIIHZpYVdpZHRoXSBDVVRTUEFDSU5HIGN1dFNwYWNpbmdcblx0QVJSQVlDVVRTIGFycmF5Q3V0cyBTUEFDSU5HIGFycmF5U3BhY2luZyAuLi5cbiIsIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZpRXJyb3IobXNnKTsKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHNwcmludGYobXNnLCAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciAgcHJvcGVydHkgTEVGNTdfQVJSQVlTUEFDSU5HOiAlcy5cblNQQUNJTkcgc2hvdWxkIGJlIGRlZmluZWQgd2l0aCBBUlJBWUNVVFMuXG5Db3JyZWN0IHN5bnRheCBpcyBBUlJBWVNQQUNJTkcgW0xPTkdBUlJBWV0gW1dJRFRIIHZpYVdpZHRoXSBDVVRTUEFDSU5HIGN1dFNwYWNpbmdcblx0QVJSQVlDVVRTIGFycmF5Q3V0cyBTUEFDSU5HIGFycmF5U3BhY2luZyAuLi5cbiIsIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgICAgICAgICBsZWZFcnJvcigxMzEyLCBtc2cpOwotICAgICAgICAgICAgICAgIGZyZWUod3JraW5nU3RyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YWx1ZSA9IHN0cnRvayhOVUxMLCAiICIpOwotICAgICAgICAgICAgYXJyYXlTcGFjaW5nID0gYXRvZih2YWx1ZSk7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgYWRkQXJyYXlDdXRzKGFycmF5Q3V0cywgYXJyYXlTcGFjaW5nKTsKLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBhZGRBcnJheVNwYWNpbmdBcnJheShhcnJheUN1dHMsIGFycmF5U3BhY2luZyk7Ci0gICAgICAgICAgICB2YWx1ZSA9IHN0cnRvayhOVUxMLCAiICIpOwotICAgICAgICAgICAgaGFzQXJyYXlDdXQgPSAxOwotICAgICAgICB9IGVsc2UgeyAgLy8gRG9lc24ndCBtYXRjaCBhbnkgb2YgdGhlIGZvcm1hdAotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTMxMyk6IEluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfQVJSQVlTUEFDSU5HOiAlcy5cbkNvcnJlY3Qgc3ludGF4IGlzIEFSUkFZU1BBQ0lORyBbTE9OR0FSUkFZXSBbV0lEVEggdmlhV2lkdGhdIENVVFNQQUNJTkcgY3V0U3BhY2luZ1xuXHRBUlJBWUNVVFMgYXJyYXlDdXRzIFNQQUNJTkcgYXJyYXlTcGFjaW5nIC4uLlxuIiwgdmFsdWVzX1tpbmRleF0pOwotICAgICAgICAgICAgbGVmaUVycm9yKG1zZyk7Ci0gICAgICAgICAgICAqLwotICAgICAgICAgICAgc3ByaW50Zihtc2csICJJbmNvcnJlY3Qgc3ludGF4IGRlZmluZWQgZm9yIHByb3BlcnR5IExFRjU3X0FSUkFZU1BBQ0lORzogJXMuXG5Db3JyZWN0IHN5bnRheCBpcyBBUlJBWVNQQUNJTkcgW0xPTkdBUlJBWV0gW1dJRFRIIHZpYVdpZHRoXSBDVVRTUEFDSU5HIGN1dFNwYWNpbmdcblx0QVJSQVlDVVRTIGFycmF5Q3V0cyBTUEFDSU5HIGFycmF5U3BhY2luZyAuLi5cbiIsIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgICAgIGxlZkVycm9yKDEzMTMsIG1zZyk7Ci0gICAgICAgICAgICBmcmVlKHdya2luZ1N0cik7Ci0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChoYXNBcnJheUN1dCA9PSAwKSB7ICAvLyBBUlJBWUNVVFMgaXMgcmVxdWlyZWQKLSAgICAgICAgLyoKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xMzE0KTogSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19BUlJBWVNQQUNJTkc6ICVzXG5BUlJBWUNVVFMgaXMgcmVxdWlyZWQgYnV0IGhhcyBub3QgYmVlbiBkZWZpbmVkLlxuQ29ycmVjdCBzeW50YXggaXMgQVJSQVlTUEFDSU5HIFtMT05HQVJSQVldIFtXSURUSCB2aWFXaWR0aF0gQ1VUU1BBQ0lORyBjdXRTcGFjaW5nXG5cdEFSUkFZQ1VUUyBhcnJheUN1dHMgU1BBQ0lORyBhcnJheVNwYWNpbmcgLi4uXG4iLCB2YWx1ZXNfW2luZGV4XSk7Ci0gICAgICAgICovCi0gICAgICAgIHNwcmludGYobXNnLCAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19BUlJBWVNQQUNJTkc6ICVzXG5BUlJBWUNVVFMgaXMgcmVxdWlyZWQgYnV0IGhhcyBub3QgYmVlbiBkZWZpbmVkLlxuQ29ycmVjdCBzeW50YXggaXMgQVJSQVlTUEFDSU5HIFtMT05HQVJSQVldIFtXSURUSCB2aWFXaWR0aF0gQ1VUU1BBQ0lORyBjdXRTcGFjaW5nXG5cdEFSUkFZQ1VUUyBhcnJheUN1dHMgU1BBQ0lORyBhcnJheVNwYWNpbmcgLi4uXG4iLCB2YWx1ZXNfW2luZGV4XSk7Ci0gICAgICAgIGxlZkVycm9yKDEzMTQsIG1zZyk7Ci0gICAgfQotCi0gICAgZnJlZSh3cmtpbmdTdHIpOwotICAgIHJldHVybjsKLX0KLQotLy8gUFJJVkFURSA1LjcKLS8vIE1JTlNURVAgbWluU3RlcExlbmd0aAotLy8gW01BWEVER0VTIG1heEVkZ2VzXSA7IAotLy8gU2F2ZSB0aGUgdmFsdWUgbGVmRGF0YS0+Zmlyc3QgdG8gbWFrZSBzdXJlIHRoZSBzeW50YXggdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhlIHBhcnNlcgotdm9pZAotbGVmaUxheWVyOjpwYXJzZU1pbnN0ZXAoaW50IGluZGV4KQotewotICAgIGNoYXIgICAgKndya2luZ1N0ciA9IHN0cmR1cCh2YWx1ZXNfW2luZGV4XSk7Ci0gICAgY2hhciAgICAqdmFsdWU7Ci0gICAgZG91YmxlICBtaW5TdGVwTGVuZ3RoID0gMCwgbWluQWRqTGVuZ3RoID0gMCwgbWluQmV0TGVuZ3RoID0gMDsKLSAgICBpbnQgICAgIG1heEVkZ2VzID0gMCwgeFNhbWVDb3JuZXJzID0gMCwgZG9uZSA9IDA7Ci0gICAgY2hhciAgICBtc2dbMTAyNF07Ci0KLSAgICBpZiAoc3RyY21wKHR5cGUoKSwgIlJPVVRJTkciKSAhPSAwKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTMyMyk6IFRoZSBwcm9wZXJ0eSBMRUY1N19NSU5TVEVQIHdpdGggdmFsdWUgJXMgaXMgZm9yIFRZUEUgUk9VVElORyBvbmx5LlxuVGhlIGN1cnJlbnQgbGF5ZXIgaGFzIHRoZSBUWVBFICVzLlxuVXBkYXRlIHRoZSBwcm9wZXJ0eSBvZiB5b3VyIGxlZiBmaWxlIHdpdGggdGhlIGNvcnJlY3Qgc3ludGF4IG9yIHJlbW92ZSB0aGlzIHByb3BlcnR5IGZyb20geW91ciBsZWYgZmlsZS5cbiIsCi0gICAgICAgICAgICAgIHZhbHVlc19baW5kZXhdLCB0eXBlKCkpOwotICAgICAgICAgICAgICBsZWZpRXJyb3IobXNnKTsKLSAgICAgICAgKi8KLSAgICAgICAgc3ByaW50Zihtc2csICJUaGUgcHJvcGVydHkgTEVGNTdfTUlOU1RFUCB3aXRoIHZhbHVlICVzIGlzIGZvciBUWVBFIFJPVVRJTkcgb25seS5cblRoZSBjdXJyZW50IGxheWVyIGhhcyB0aGUgVFlQRSAlcy5cblVwZGF0ZSB0aGUgcHJvcGVydHkgb2YgeW91ciBsZWYgZmlsZSB3aXRoIHRoZSBjb3JyZWN0IHN5bnRheCBvciByZW1vdmUgdGhpcyBwcm9wZXJ0eSBmcm9tIHlvdXIgbGVmIGZpbGUuXG4iLAotICAgICAgICAgICAgICAgIHZhbHVlc19baW5kZXhdLCB0eXBlKCkpOwotICAgICAgICBsZWZFcnJvcigxMzIzLCBtc2cpOwotICAgICAgICBmcmVlKHdya2luZ1N0cik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB2YWx1ZSA9IHN0cnRvayh3cmtpbmdTdHIsICIgIik7Ci0gICAgaWYgKHN0cmNtcCh2YWx1ZSwgIk1JTlNURVAiKSAhPSAwKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTMxNSk6IEluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfTUlOU1RFUDogJXMuXG5Db3JyZWN0IHN5bnRheCBpcyBcIk1JTlNURVAgbWluU3RlcExlbmd0aCBbTUFYRURHRVMgbWF4RWRnZXNdIFtNSU5BREpBQ0VOVExFTkdUSCBtaW5BZGpMZW5ndGggfCBNSU5CRVRXRUVOTEVOR1RIIG1pbkJldHdlZW5MZW5ndGggW0VYQ0VQVFNBTUVDT1JORVJTXV0gO1wiXG4iLCB2YWx1ZXNfW2luZGV4XSk7Ci0gICAgICAgICAgICAgIGxlZmlFcnJvcihtc2cpOwotICAgICAgICAqLwotICAgICAgICBzcHJpbnRmKG1zZywgIkluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfTUlOU1RFUDogJXMuXG5Db3JyZWN0IHN5bnRheCBpcyBcIk1JTlNURVAgbWluU3RlcExlbmd0aCBbTUFYRURHRVMgbWF4RWRnZXNdIFtNSU5BREpBQ0VOVExFTkdUSCBtaW5BZGpMZW5ndGggfCBNSU5CRVRXRUVOTEVOR1RIIG1pbkJldHdlZW5MZW5ndGggW0VYQ0VQVFNBTUVDT1JORVJTXV0gO1wiXG4iLCB2YWx1ZXNfW2luZGV4XSk7Ci0gICAgICAgIGxlZkVycm9yKDEzMTUsIG1zZyk7Ci0gICAgICAgIGZyZWUod3JraW5nU3RyKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHZhbHVlID0gc3RydG9rKE5VTEwsICIgIik7Ci0gICAgbWluU3RlcExlbmd0aCA9IGF0b2YodmFsdWUpOwotICAgIC8vYWRkTWluc3RlcChtaW5TdGVwTGVuZ3RoKTsKLSAgICB2YWx1ZSA9IHN0cnRvayhOVUxMLCAiICIpOwotICAgIHdoaWxlIChkb25lID09IDApIHsKLSAgICAgICAgaWYgKHZhbHVlICYmICp2YWx1ZSAhPSAnXG4nKSB7Ci0gICAgICAgICAgICBpZiAoc3RyY21wKHZhbHVlLCAiTUFYRURHRVMiKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gTUFYRURHRVMgbWF4RWRnZXMKLSAgICAgICAgICAgICAgICBpZiAobWF4RWRnZXMpIHsgLy8gTUFYRURHRVMgaGFzIGFscmVhZHkgZGVmaW5lZAotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzMTUpOiBJbmNvcnJlY3Qgc3ludGF4IGRlZmluZWQgZm9yIHByb3BlcnR5IExFRjU3X01JTlNURVA6ICVzXG5Db3JyZWN0IHN5bnRheCBpcyBcIk1JTlNURVAgbWluU3RlcExlbmd0aCBbTUFYRURHRVMgbWF4RWRnZXNdIFtNSU5BREpBQ0VOVExFTkdUSCBtaW5BZGpMZW5ndGggfCBNSU5CRVRXRUVOTEVOR1RIIG1pbkJldHdlZW5MZW5ndGggW0VYQ0VQVFNBTUVDT1JORVJTXV0gO1wiXG4iLCB2YWx1ZXNfW2luZGV4XSk7Ci0gICAgICAgICAgICAgICAgICAgIGxlZmlFcnJvcihtc2cpOwotICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKG1zZywgIkluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfTUlOU1RFUDogJXNcbkNvcnJlY3Qgc3ludGF4IGlzIFwiTUlOU1RFUCBtaW5TdGVwTGVuZ3RoIFtNQVhFREdFUyBtYXhFZGdlc10gW01JTkFESkFDRU5UTEVOR1RIIG1pbkFkakxlbmd0aCB8IE1JTkJFVFdFRU5MRU5HVEggbWluQmV0d2Vlbkxlbmd0aCBbRVhDRVBUU0FNRUNPUk5FUlNdXSA7XCJcbiIsIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgICAgICAgICAgICAgbGVmRXJyb3IoMTMxNSwgbXNnKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh3cmtpbmdTdHIpOyAgIC8vIGRvbmUgcGFyc2luZwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZhbHVlID0gc3RydG9rKE5VTEwsICIgIik7Ci0gICAgICAgICAgICAgICAgbWF4RWRnZXMgPSBhdG9pKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAvL2FkZE1pbnN0ZXBNYXhlZGdlcyhtYXhFZGdlcyk7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHZhbHVlLCAiTUlOQURKQUNFTlRMRU5HVEgiKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1pbkJldExlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICAvLyBNSU5CRVRXRUVOTEVOR1RIIGhhcyBkZWZpbmVkLCBpdCBpcyBlaXRoZXIgTUlOQURKQUNFTlRMRU5HVEgKLSAgICAgICAgICAgICAgICAgICAgLy8gb3IgTUlOQkVUV0VFTkxFTkdUSCBidXQgbm90IGJvdGgKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xMzE1KTogSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19NSU5TVEVQOiAlc1xuQ29ycmVjdCBzeW50YXggaXMgXCJNSU5TVEVQIG1pblN0ZXBMZW5ndGggW01BWEVER0VTIG1heEVkZ2VzXSBbTUlOQURKQUNFTlRMRU5HVEggbWluQWRqTGVuZ3RoIHwgTUlOQkVUV0VFTkxFTkdUSCBtaW5CZXR3ZWVuTGVuZ3RoIFtFWENFUFRTQU1FQ09STkVSU11dIDtcIlxuIiwgdmFsdWVzX1tpbmRleF0pOwotICAgICAgICAgICAgICAgICAgICBsZWZpRXJyb3IobXNnKTsKLSAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgc3ByaW50Zihtc2csICJJbmNvcnJlY3Qgc3ludGF4IGRlZmluZWQgZm9yIHByb3BlcnR5IExFRjU3X01JTlNURVA6ICVzXG5Db3JyZWN0IHN5bnRheCBpcyBcIk1JTlNURVAgbWluU3RlcExlbmd0aCBbTUFYRURHRVMgbWF4RWRnZXNdIFtNSU5BREpBQ0VOVExFTkdUSCBtaW5BZGpMZW5ndGggfCBNSU5CRVRXRUVOTEVOR1RIIG1pbkJldHdlZW5MZW5ndGggW0VYQ0VQVFNBTUVDT1JORVJTXV0gO1wiXG4iLCB2YWx1ZXNfW2luZGV4XSk7Ci0gICAgICAgICAgICAgICAgICAgIGxlZkVycm9yKDEzMTUsIG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUod3JraW5nU3RyKTsgICAvLyBkb25lIHBhcnNpbmcKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnRvayhOVUxMLCAiICIpOwotICAgICAgICAgICAgICAgIG1pbkFkakxlbmd0aCA9IGF0b2YodmFsdWUpOwotICAgICAgICAgICAgICAgIC8vYWRkTWluc3RlcE1pbkFkakxlbmd0aChtaW5BZGpMZW5ndGgpOwotICAgICAgICAgICAgICAgIHZhbHVlID0gc3RydG9rKE5VTEwsICIgIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCh2YWx1ZSwgIk1JTkJFVFdFRU5MRU5HVEgiKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1pbkFkakxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICAvLyBtaW5hZGpBQ0VOVExFTkdUSCBoYXMgZGVmaW5lZCwgaXQgaXMgZWl0aGVyIE1JTkJFVFdFRU5MRU5HVEgKLSAgICAgICAgICAgICAgICAgICAgLy8gb3IgbWluQURKQUNFTlRMRU5HVEggYnV0IG5vdCBib3RoCi0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTMxNSk6IEluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfTUlOU1RFUDogJXNcbkNvcnJlY3Qgc3ludGF4IGlzIFwiTUlOU1RFUCBtaW5TdGVwTGVuZ3RoIFtNQVhFREdFUyBtYXhFZGdlc10gW01JTkFESkFDRU5UTEVOR1RIIG1pbkFkakxlbmd0aCB8IE1JTkJFVFdFRU5MRU5HVEggbWluQmV0d2Vlbkxlbmd0aCBbRVhDRVBUU0FNRUNPUk5FUlNdXSA7XCJcbiIsIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgICAgICAgICAgICAgbGVmaWVycm9yKG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHNwcmludGYobXNnLCAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19NSU5TVEVQOiAlc1xuQ29ycmVjdCBzeW50YXggaXMgXCJNSU5TVEVQIG1pblN0ZXBMZW5ndGggW01BWEVER0VTIG1heEVkZ2VzXSBbTUlOQURKQUNFTlRMRU5HVEggbWluQWRqTGVuZ3RoIHwgTUlOQkVUV0VFTkxFTkdUSCBtaW5CZXR3ZWVuTGVuZ3RoIFtFWENFUFRTQU1FQ09STkVSU11dIDtcIlxuIiwgdmFsdWVzX1tpbmRleF0pOwotICAgICAgICAgICAgICAgICAgICBsZWZFcnJvcigxMzE1LCBtc2cpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKHdya2luZ1N0cik7ICAgLy8gZG9uZSBwYXJzaW5nCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICAgICAgICAgICAgICBtaW5CZXRMZW5ndGggPSBhdG9mKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAvL2FkZE1pbnN0ZXBNaW5CZXRMZW5ndGgobWluQmV0TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnRvayhOVUxMLCAiICIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAodmFsdWUsICJFWENFUFRTQU1FQ09STkVSUyIpID09IDApIHsKLSAgICAgICAgICAgICAgICBpZiAobWluQmV0TGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhTYW1lQ29ybmVycyA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIC8vYWRkTWluc3RlcFhTYW1lQ29ybmVycygpOwotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnRvayhOVUxMLCAiICIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTMxNSk6IEluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfTUlOU1RFUDogJXNcbkNvcnJlY3Qgc3ludGF4IGlzIFwiTUlOU1RFUCBtaW5TdGVwTGVuZ3RoIFtNQVhFREdFUyBtYXhFZGdlc10gW01JTkFESkFDRU5UTEVOR1RIIG1pbkFkakxlbmd0aCB8IE1JTkJFVFdFRU5MRU5HVEggbWluQmV0d2Vlbkxlbmd0aCBbRVhDRVBUU0FNRUNPUk5FUlNdXSA7XCJcbiIsIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaWVycm9yKG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHNwcmludGYobXNnLCAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19NSU5TVEVQOiAlc1xuQ29ycmVjdCBzeW50YXggaXMgXCJNSU5TVEVQIG1pblN0ZXBMZW5ndGggW01BWEVER0VTIG1heEVkZ2VzXSBbTUlOQURKQUNFTlRMRU5HVEggbWluQWRqTGVuZ3RoIHwgTUlOQkVUV0VFTkxFTkdUSCBtaW5CZXR3ZWVuTGVuZ3RoIFtFWENFUFRTQU1FQ09STkVSU11dIDtcIlxuIiwgdmFsdWVzX1tpbmRleF0pOwotICAgICAgICAgICAgICAgICAgICBsZWZFcnJvcigxMzE1LCBtc2cpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKHdya2luZ1N0cik7ICAgLy8gZG9uZSBwYXJzaW5nCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCh2YWx1ZSwgIjsiKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gYW4gaW52YWxpZCB2YWx1ZQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xMzE1KTogSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19NSU5TVEVQOiAlcy5cbkNvcnJlY3Qgc3ludGF4IGlzIFwiTUlOU1RFUCBtaW5TdGVwTGVuZ3RoIFtNQVhFREdFUyBtYXhFZGdlc10gW01JTkFESkFDRU5UTEVOR1RIIG1pbkFkakxlbmd0aCB8IE1JTkJFVFdFRU5MRU5HVEggbWluQmV0d2Vlbkxlbmd0aCBbRVhDRVBUU0FNRUNPUk5FUlNdXSA7XCJcbiIsIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgICAgICAgICBsZWZpZXJyb3IobXNnKTsKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHNwcmludGYobXNnLCAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19NSU5TVEVQOiAlcy5cbkNvcnJlY3Qgc3ludGF4IGlzIFwiTUlOU1RFUCBtaW5TdGVwTGVuZ3RoIFtNQVhFREdFUyBtYXhFZGdlc10gW01JTkFESkFDRU5UTEVOR1RIIG1pbkFkakxlbmd0aCB8IE1JTkJFVFdFRU5MRU5HVEggbWluQmV0d2Vlbkxlbmd0aCBbRVhDRVBUU0FNRUNPUk5FUlNdXSA7XCJcbiIsIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgICAgICAgICBsZWZFcnJvcigxMzE1LCBtc2cpOwotICAgICAgICAgICAgICAgIGZyZWUod3JraW5nU3RyKTsgICAvLyBkb25lIHBhcnNpbmcKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBkb25lID0gMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGRvbmUgcGFyc2luZyB3aXRob3V0IDsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICBzcHJpbnRmKG1zZywgImVSUk9SIChMRUZQQVJTLTEzMTUpOiBJbmNvcnJlY3Qgc3ludGF4IGRlZmluZWQgZm9yIHByb3BlcnR5IExFRjU3X01JTlNURVA6ICVzXG5Db3JyZWN0IHN5bnRheCBpcyBcIk1JTlNURVAgbWluU3RlcExlbmd0aCBbTUFYRURHRVMgbWF4RWRnZXNdIFtNSU5BREpBQ0VOVExFTkdUSCBtaW5BZGpMZW5ndGggfCBNSU5CRVRXRUVOTEVOR1RIIG1pbkJldHdlZW5MZW5ndGggW0VYQ0VQVFNBTUVDT1JORVJTXV0gO1wiXG4iLCB2YWx1ZXNfW2luZGV4XSk7Ci0gICAgICAgICAgICBsZWZpZXJyb3IobXNnKTsKLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBzcHJpbnRmKG1zZywgImluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfTUlOU1RFUDogJXNcbkNvcnJlY3Qgc3ludGF4IGlzIFwiTUlOU1RFUCBtaW5TdGVwTGVuZ3RoIFtNQVhFREdFUyBtYXhFZGdlc10gW01JTkFESkFDRU5UTEVOR1RIIG1pbkFkakxlbmd0aCB8IE1JTkJFVFdFRU5MRU5HVEggbWluQmV0d2Vlbkxlbmd0aCBbRVhDRVBUU0FNRUNPUk5FUlNdXSA7XCJcbiIsIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgICAgIGxlZkVycm9yKDEzMTUsIG1zZyk7Ci0gICAgICAgICAgICBmcmVlKHdya2luZ1N0cik7ICAgLy8gZG9uZSBwYXJzaW5nCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobWluU3RlcExlbmd0aCkKLSAgICAgICAgYWRkTWluc3RlcChtaW5TdGVwTGVuZ3RoKTsKLSAgICBpZiAobWF4RWRnZXMpCi0gICAgICAgIGFkZE1pbnN0ZXBNYXhlZGdlcyhtYXhFZGdlcyk7Ci0gICAgaWYgKG1pbkFkakxlbmd0aCkKLSAgICAgICAgYWRkTWluc3RlcE1pbkFkakxlbmd0aChtaW5BZGpMZW5ndGgpOwotICAgIGlmIChtaW5CZXRMZW5ndGgpCi0gICAgICAgIGFkZE1pbnN0ZXBNaW5CZXRMZW5ndGgobWluQmV0TGVuZ3RoKTsKLSAgICBpZiAoeFNhbWVDb3JuZXJzKQotICAgICAgICBhZGRNaW5zdGVwWFNhbWVDb3JuZXJzKCk7Ci0gICAgZnJlZSh3cmtpbmdTdHIpOwotICAgIHJldHVybjsKLX0KLQotLy8gUFJJVkFURSA1LjcKLXZvaWQKLWxlZmlMYXllcjo6cGFyc2VBbnRlbm5hQ3VtUm91dGluZyhpbnQgaW5kZXgpCi17Ci0gICAgY2hhciAgICAqd3JraW5nU3RyID0gc3RyZHVwKHZhbHVlc19baW5kZXhdKTsKLSAgICBjaGFyICAgICp2YWx1ZTsKLSAgICBjaGFyICAgIG1zZ1sxMDI0XTsKLQotICAgIHZhbHVlID0gc3RydG9rKHdya2luZ1N0ciwgIiAiKTsKLSAgICBpZiAoc3RyY21wKHZhbHVlLCAiQU5URU5OQUNVTVJPVVRJTkdQTFVTQ1VUIikgIT0gMCkgewotICAgICAgICAvKgotICAgICAgICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzMTYpOiBJbmNvcnJlY3Qgc3ludGF4IGRlZmluZWQgZm9yIHByb3BlcnR5IExFRjU3X0FOVEVOTkFDVU1ST1VUSU5HUExVU0NVVDogJXMuXG5Db3JyZWN0IHN5bnRheCBpcyBcIkFOVEFOTkFDVU1ST1VUSU5HUExVU0NVVFwiXG4iLCB2YWx1ZXNfW2luZGV4XSk7Ci0gICAgICAgICAgICAgIGxlZmlFcnJvcihtc2cpOwotICAgICAgICAqLwotICAgICAgICBzcHJpbnRmKG1zZywgIkluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfQU5URU5OQUNVTVJPVVRJTkdQTFVTQ1VUOiAlcy5cbkNvcnJlY3Qgc3ludGF4IGlzIFwiQU5UQU5OQUNVTVJPVVRJTkdQTFVTQ1VUXCJcbiIsIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgbGVmRXJyb3IoMTMxNiwgbXNnKTsKLSAgICAgICAgZnJlZSh3cmtpbmdTdHIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc2V0QW50ZW5uYUN1bVJvdXRpbmdQbHVzQ3V0KCk7Ci0KLSAgICBmcmVlKHdya2luZ1N0cik7Ci0gICAgcmV0dXJuOwotfQotCi0vLyBQUklWQVRFIDUuNwotdm9pZAotbGVmaUxheWVyOjpwYXJzZUFudGVubmFHYXRlUGx1cyhpbnQgaW5kZXgpCi17Ci0gICAgY2hhciAgICAqd3JraW5nU3RyID0gc3RyZHVwKHZhbHVlc19baW5kZXhdKTsKLSAgICBjaGFyICAgICp2YWx1ZTsKLSAgICBkb3VibGUgIHBEaWZmRmFjdG9yOwotICAgIGNoYXIgICAgbXNnWzEwMjRdOwotCi0gICAgdmFsdWUgPSBzdHJ0b2sod3JraW5nU3RyLCAiICIpOwotICAgIGlmIChzdHJjbXAodmFsdWUsICJBTlRFTk5BR0FURVBMVVNESUZGIikgIT0gMCkgewotICAgICAgICAvKgotICAgICAgICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzMTcpOiBJbmNvcnJlY3Qgc3ludGF4IGRlZmluZWQgZm9yIHByb3BlcnR5IExFRjU3X0FOVEVOTkFHQVRFUExVU0RJRkY6ICVzLlxuQ29ycmVjdCBzeW50YXggaXMgXCJBTlRFTk5BR0FURVBMVVNESUZGIHBsdXNEaWZmRmFjdG9yXCJcbiIsIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgICAgICAgbGVmaUVycm9yKG1zZyk7Ci0gICAgICAgICovCi0gICAgICAgIHNwcmludGYobXNnLCAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19BTlRFTk5BR0FURVBMVVNESUZGOiAlcy5cbkNvcnJlY3Qgc3ludGF4IGlzIFwiQU5URU5OQUdBVEVQTFVTRElGRiBwbHVzRGlmZkZhY3RvclwiXG4iLCB2YWx1ZXNfW2luZGV4XSk7Ci0gICAgICAgIGxlZkVycm9yKDEzMTcsIG1zZyk7Ci0gICAgICAgIGZyZWUod3JraW5nU3RyKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHZhbHVlID0gc3RydG9rKE5VTEwsICIgIik7Ci0gICAgcERpZmZGYWN0b3IgPSBhdG9mKHZhbHVlKTsKLSAgICBzZXRBbnRlbm5hR2F0ZVBsdXNEaWZmKHBEaWZmRmFjdG9yKTsKLQotICAgIGZyZWUod3JraW5nU3RyKTsKLSAgICByZXR1cm47Ci19Ci0KLS8vIFBSSVZBVEUgNS43Ci12b2lkCi1sZWZpTGF5ZXI6OnBhcnNlQW50ZW5uYUFyZWFNaW51cyhpbnQgaW5kZXgpCi17Ci0gICAgY2hhciAgICAqd3JraW5nU3RyID0gc3RyZHVwKHZhbHVlc19baW5kZXhdKTsKLSAgICBjaGFyICAgICp2YWx1ZTsKLSAgICBkb3VibGUgIG1EaWZmRmFjdG9yOwotICAgIGNoYXIgICAgbXNnWzEwMjRdOwotCi0gICAgdmFsdWUgPSBzdHJ0b2sod3JraW5nU3RyLCAiICIpOwotICAgIGlmIChzdHJjbXAodmFsdWUsICJBTlRFTk5BQVJFQU1JTlVTRElGRiIpICE9IDApIHsKLSAgICAgICAgLyoKLSAgICAgICAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xMzE4KTogSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19BTlRFTk5BQVJFQU1JTlVTRElGRjogJXMuXG5Db3JyZWN0IHN5bnRheCBpcyBcIkFOVEVOTkFBUkVBTUlOVVNESUZGIG1pbnVzRGlmZkZhY3RvclwiXG4iLCB2YWx1ZXNfW2luZGV4XSk7Ci0gICAgICAgICAgICAgIGxlZmlFcnJvcihtc2cpOwotICAgICAgICAqLwotICAgICAgICBzcHJpbnRmKG1zZywgIkluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfQU5URU5OQUFSRUFNSU5VU0RJRkY6ICVzLlxuQ29ycmVjdCBzeW50YXggaXMgXCJBTlRFTk5BQVJFQU1JTlVTRElGRiBtaW51c0RpZmZGYWN0b3JcIlxuIiwgdmFsdWVzX1tpbmRleF0pOwotICAgICAgICBsZWZFcnJvcigxMzE4LCBtc2cpOwotICAgICAgICBmcmVlKHdya2luZ1N0cik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB2YWx1ZSA9IHN0cnRvayhOVUxMLCAiICIpOwotICAgIG1EaWZmRmFjdG9yID0gYXRvZih2YWx1ZSk7Ci0gICAgc2V0QW50ZW5uYUFyZWFNaW51c0RpZmYobURpZmZGYWN0b3IpOwotCi0gICAgZnJlZSh3cmtpbmdTdHIpOwotICAgIHJldHVybjsKLX0KLQotLy8gUFJJVkFURSA1LjcKLXZvaWQKLWxlZmlMYXllcjo6cGFyc2VBbnRlbm5hQXJlYURpZmYoaW50IGluZGV4KQotewotICAgIGNoYXIgICAgICAgICAgICAqd3JraW5nU3RyID0gc3RyZHVwKHZhbHVlc19baW5kZXhdKTsKLSAgICBjaGFyICAgICAgICAgICAgKnZhbHVlOwotICAgIGRvdWJsZSAgICAgICAgICBkaWZmQSwgZGlmZkY7Ci0gICAgbGVmaUFudGVubmFQV0wgICpwd2xQdHI7Ci0gICAgaW50ICAgICAgICAgICAgIGRvbmUgPSAwOwotICAgIGNoYXIgICAgICAgICAgICBtc2dbMTAyNF07Ci0KLSAgICB2YWx1ZSA9IHN0cnRvayh3cmtpbmdTdHIsICIgIik7Ci0gICAgaWYgKHN0cmNtcCh2YWx1ZSwgIkFOVEVOTkFBUkVBRElGRlJFRFVDRVBXTCIpICE9IDApIHsKLSAgICAgICAgLyoKLSAgICAgICAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xMzE5KTogSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19BTlRFTk5BQVJFQURJRkZSRURVQ0VQV0w6ICVzLlxuQ29ycmVjdCBzeW50YXggaXMgXCJBTlRFTk5BQVJFQURJRkZSRURVQ0VQV0wgKCggZGlmZkFyZWExIG1ldGFsRGlmZkZhY3RvcjEgKSAoIGRpZmZBcmVhMiBtZXRhbERpZmZGYWN0b3IyICkuLi4pXCJcbiIsIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgICAgICAgbGVmaUVycm9yKG1zZyk7Ci0gICAgICAgICovCi0gICAgICAgIHNwcmludGYobXNnLCAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19BTlRFTk5BQVJFQURJRkZSRURVQ0VQV0w6ICVzLlxuQ29ycmVjdCBzeW50YXggaXMgXCJBTlRFTk5BQVJFQURJRkZSRURVQ0VQV0wgKCggZGlmZkFyZWExIG1ldGFsRGlmZkZhY3RvcjEgKSAoIGRpZmZBcmVhMiBtZXRhbERpZmZGYWN0b3IyICkuLi4pXCJcbiIsIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgbGVmRXJyb3IoMTMxOSwgbXNnKTsKLSAgICAgICAgZnJlZSh3cmtpbmdTdHIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdmFsdWUgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICBpZiAoc3RyY21wKHZhbHVlLCAiKCIpID09IDApIHsgLy8gYmVnaW5uaW5nIG9mICggKCBkMSByMSApICggZDIgcjIgKSAuLi4gKQotICAgICAgICBwd2xQdHIgPSBsZWZpQW50ZW5uYVBXTDo6Y3JlYXRlKCk7Ci0gICAgICAgIHdoaWxlIChkb25lID09IDApIHsKLSAgICAgICAgICAgIHZhbHVlID0gc3RydG9rKE5VTEwsICIgIik7Ci0gICAgICAgICAgICBpZiAoc3RyY21wKHZhbHVlLCAiKCIpID09IDApIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnRvayhOVUxMLCAiICIpOwotICAgICAgICAgICAgICAgIGRpZmZBID0gYXRvZih2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICAgICAgICAgICAgICBkaWZmRiA9IGF0b2YodmFsdWUpOwotICAgICAgICAgICAgICAgIHB3bFB0ci0+YWRkQW50ZW5uYVBXTChkaWZmQSwgZGlmZkYpOwotICAgICAgICAgICAgICAgIHZhbHVlID0gc3RydG9rKE5VTEwsICIgIik7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmNtcCh2YWx1ZSwgIikiKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHZhbHVlLCAiKSIpID09IDApCi0gICAgICAgICAgICAgICAgZG9uZSA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRvbmUpIHsKLSAgICAgICAgICAgIHNldEFudGVubmFQV0wobGVmaUFudGVubmFBRFIsIHB3bFB0cik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwd2xQdHItPkRlc3Ryb3koKTsKLSAgICAgICAgICAgIGxlZkZyZWUocHdsUHRyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZyZWUod3JraW5nU3RyKTsKLSAgICByZXR1cm47Ci19Ci0KLS8vIFBSSVZBVEUgNS43Ci0vLyBbRU5DTE9TVVJFIFtBQk9WRSB8IEJFTE9XXSBvdmVyaGFuZzEgb3ZlcmhhbmcyCi0vLyAgICAgW1dJRFRIIG1pbldpZHRoIFtFWENFUFRFWFRSQUNVVCBjdXRXaXRoaW5dCi0vLyAgICAgfExFTkdUSCBtaW5MZW5ndGhdIDsKLXZvaWQKLWxlZmlMYXllcjo6cGFyc2VMYXllckVuY2xvc3VyZShpbnQgaW5kZXgpCi17Ci0gICAgY2hhciAgICAqd3JraW5nU3RyID0gc3RyZHVwKHZhbHVlc19baW5kZXhdKTsKLSAgICBjaGFyICAgICp2YWx1ZTsKLSAgICBjaGFyICAgIG1zZ1sxMDI0XTsKLSAgICBpbnQgICAgIG92ZXJoID0gMCwgd2lkdGggPSAwLCBleGNlcHQgPSAwLCBsZW5ndGggPSAwOwotICAgIGNoYXIgICAgKmVuY2xSdWxlID0gMDsKLSAgICBkb3VibGUgIG92ZXJoYW5nMSA9IDAsIG92ZXJoYW5nMiA9IDAsIG1pbldpZHRoID0gMCwgY3V0V2l0aGluID0gMCwgbWluTGVuZ3RoID0gMDsKLQotICAgIGlmIChzdHJjbXAodHlwZSgpLCAiQ1VUIikgIT0gMCkgewotICAgICAgICAvKgotICAgICAgICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzMzEpOiBUaGUgcHJvcGVydHkgTEVGNTdfRU5DTE9TVVJFIHdpdGggdmFsdWUgJXMgaXMgZm9yIFRZUEUgQ1VUIG9ubHkuXG5UaGUgY3VycmVudCBsYXllciBoYXMgdGhlIFRZUEUgJXMuXG5VcGRhdGUgdGhlIHByb3BlcnR5IG9mIHlvdXIgbGVmIGZpbGUgd2l0aCB0aGUgY29ycmVjdCBzeW50YXggb3IgcmVtb3ZlIHRoaXMgcHJvcGVydHkgZnJvbSB5b3VyIGxlZiBmaWxlLlxuIiwKLSAgICAgICAgICAgICAgdmFsdWVzX1tpbmRleF0sIHR5cGUoKSk7Ci0gICAgICAgICAgICAgIGxlZmlFcnJvcihtc2cpOwotICAgICAgICAqLwotICAgICAgICBzcHJpbnRmKG1zZywgIlRoZSBwcm9wZXJ0eSBMRUY1N19FTkNMT1NVUkUgd2l0aCB2YWx1ZSAlcyBpcyBmb3IgVFlQRSBDVVQgb25seS5cblRoZSBjdXJyZW50IGxheWVyIGhhcyB0aGUgVFlQRSAlcy5cblVwZGF0ZSB0aGUgcHJvcGVydHkgb2YgeW91ciBsZWYgZmlsZSB3aXRoIHRoZSBjb3JyZWN0IHN5bnRheCBvciByZW1vdmUgdGhpcyBwcm9wZXJ0eSBmcm9tIHlvdXIgbGVmIGZpbGUuXG4iLAotICAgICAgICAgICAgICAgIHZhbHVlc19baW5kZXhdLCB0eXBlKCkpOwotICAgICAgICBsZWZFcnJvcigxMzMxLCBtc2cpOwotICAgICAgICBmcmVlKHdya2luZ1N0cik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB2YWx1ZSA9IHN0cnRvayh3cmtpbmdTdHIsICIgIik7Ci0gICAgaWYgKHN0cmNtcCh2YWx1ZSwgIkVOQ0xPU1VSRSIpICE9IDApIHsgICAvLyBVbmtub3duIHZhbHVlCi0gICAgICAgIC8qCi0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTMzMCk6IEluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfRU5DTE9TVVJFOiAlc1xuQ29ycmVjdCBzeW50YXggaXMgXCJFTkNMT1NVUkUgW0FCT1ZFfEJFTE9XXSBvdmVyaGFuZzEgb3ZlcmhhbmcyXG5cdFtXSURUSCBtaW5XaWR0aCBbRVhDRVBURVhUUkFDVVQgY3V0V2l0aGluXVxuXHR8TEVOR1RIIG1pbkxlbmd0aF0gO1wiXG4iLCB2YWx1ZXNfW2luZGV4XSk7Ci0gICAgICAgIGxlZmlFcnJvcihtc2cpOwotICAgICAgICAqLwotICAgICAgICBzcHJpbnRmKG1zZywgIkluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfRU5DTE9TVVJFOiAlc1xuQ29ycmVjdCBzeW50YXggaXMgXCJFTkNMT1NVUkUgW0FCT1ZFfEJFTE9XXSBvdmVyaGFuZzEgb3ZlcmhhbmcyXG5cdFtXSURUSCBtaW5XaWR0aCBbRVhDRVBURVhUUkFDVVQgY3V0V2l0aGluXVxuXHR8TEVOR1RIIG1pbkxlbmd0aF0gO1wiXG4iLCB2YWx1ZXNfW2luZGV4XSk7Ci0gICAgICAgIGxlZkVycm9yKDEzMzAsIG1zZyk7Ci0gICAgICAgIGZyZWUod3JraW5nU3RyKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHZhbHVlID0gc3RydG9rKE5VTEwsICIgIik7Ci0KLSAgICB3aGlsZSAoc3RyY21wKHZhbHVlLCAiOyIpICE9IDApIHsKLSAgICAgICAgaWYgKHN0cmNtcCh2YWx1ZSwgIkNVVENMQVNTIikgPT0gMCkgewotICAgICAgICAgICAgLy8gVGhpcyBpcyA1OCBzeW50YXggYnV0IGlzIG5vdCBpbiBPQSBkYXRhIG1vZGVsLiAgU2tpcCB0aGUgcGFyc2luZwotICAgICAgICAgICAgZnJlZSh3cmtpbmdTdHIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKChzdHJjbXAodmFsdWUsICJBQk9WRSIpID09IDApIHx8IChzdHJjbXAodmFsdWUsICJCRUxPVyIpID09IDApKSB7Ci0gICAgICAgICAgICAvLyBQYXJzZSB0aGUgcmVzdCBvZiB0aGUgcHJvcGVydHkgdmFsdWUgbGVmRGF0YS0+Zmlyc3QgYW5kIGlmIGl0IGhhcyB0aGUgc3ludGF4Ci0gICAgICAgICAgICAvLyBFTkNMT1NVUkUgW0FCT1ZFIHwgQkVMT1ddIG92ZXJoYW5nMSBvdmVyaGFuZzIKLSAgICAgICAgICAgIC8vICAgW1dJRFRIIG1pbldpZHRoIFtFWENFUFRFWFRSQUNVVCBjdXRXaXRoaW5dCi0gICAgICAgICAgICAvLyAgIHxMRU5HVEggbWluTGVuZ3RoXQotICAgICAgICAgICAgaWYgKG92ZXJoKSB7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzMzApOiBJbmNvcnJlY3Qgc3ludGF4IGRlZmluZWQgZm9yIHByb3BlcnR5IExFRjU3X0VOQ0xPU1VSRTogJXNcbkNvcnJlY3Qgc3ludGF4IGlzIFwiRU5DTE9TVVJFIFtBQk9WRXxCRUxPV10gb3ZlcmhhbmcxIG92ZXJoYW5nMlxuXHRbV0lEVEggbWluV2lkdGggW0VYQ0VQVEVYVFJBQ1VUIGN1dFdpdGhpbl1cblx0fExFTkdUSCBtaW5MZW5ndGhdIDtcIlxuIiwgdmFsdWVzX1tpbmRleF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZmlFcnJvcihtc2cpOwotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgc3ByaW50Zihtc2csICJJbmNvcnJlY3Qgc3ludGF4IGRlZmluZWQgZm9yIHByb3BlcnR5IExFRjU3X0VOQ0xPU1VSRTogJXNcbkNvcnJlY3Qgc3ludGF4IGlzIFwiRU5DTE9TVVJFIFtBQk9WRXxCRUxPV10gb3ZlcmhhbmcxIG92ZXJoYW5nMlxuXHRbV0lEVEggbWluV2lkdGggW0VYQ0VQVEVYVFJBQ1VUIGN1dFdpdGhpbl1cblx0fExFTkdUSCBtaW5MZW5ndGhdIDtcIlxuIiwgdmFsdWVzX1tpbmRleF0pOwotICAgICAgICAgICAgICAgIGxlZkVycm9yKDEzMzAsIG1zZyk7Ci0gICAgICAgICAgICAgICAgZnJlZSh3cmtpbmdTdHIpOwotICAgICAgICAgICAgICAgIGlmIChlbmNsUnVsZSkKLSAgICAgICAgICAgICAgICAgICAgZnJlZShlbmNsUnVsZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZW5jbFJ1bGUgPSBzdHJkdXAodmFsdWUpOwotICAgICAgICAgICAgdmFsdWUgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAodmFsdWUsICJXSURUSCIpID09IDApIHsKLSAgICAgICAgICAgIGlmICgoIW92ZXJoKSkgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xMzMwKTogSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19FTkNMT1NVUkU6ICVzXG5Db3JyZWN0IHN5bnRheCBpcyBcIkVOQ0xPU1VSRSBbQUJPVkV8QkVMT1ddIG92ZXJoYW5nMSBvdmVyaGFuZzJcblx0W1dJRFRIIG1pbldpZHRoIFtFWENFUFRFWFRSQUNVVCBjdXRXaXRoaW5dXG5cdHxMRU5HVEggbWluTGVuZ3RoXSA7XCJcbiIsIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZpRXJyb3IobXNnKTsKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHNwcmludGYobXNnLCAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19FTkNMT1NVUkU6ICVzXG5Db3JyZWN0IHN5bnRheCBpcyBcIkVOQ0xPU1VSRSBbQUJPVkV8QkVMT1ddIG92ZXJoYW5nMSBvdmVyaGFuZzJcblx0W1dJRFRIIG1pbldpZHRoIFtFWENFUFRFWFRSQUNVVCBjdXRXaXRoaW5dXG5cdHxMRU5HVEggbWluTGVuZ3RoXSA7XCJcbiIsIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgICAgICAgICBsZWZFcnJvcigxMzMwLCBtc2cpOwotICAgICAgICAgICAgICAgIGZyZWUod3JraW5nU3RyKTsKLSAgICAgICAgICAgICAgICBpZiAoZW5jbFJ1bGUpCi0gICAgICAgICAgICAgICAgICAgIGZyZWUoZW5jbFJ1bGUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1pbldpZHRoID0gc3RydG9kKHN0cnRvayhOVUxMLCAiICIpLCAwKTsKLSAgICAgICAgICAgIHZhbHVlID0gc3RydG9rKE5VTEwsICIgIik7Ci0gICAgICAgICAgICB3aWR0aCA9IDE7Ci0gICAgICAgICAgICBpZiAoc3RyY21wKHZhbHVlLCAiRVhDRVBURVhUUkFDVVQiKSA9PSAwKSB7ICAvLyBjb250aW51ZSB3aXRoIFdJRFRICi0gICAgICAgICAgICAgICAgZXhjZXB0ID0gMTsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnRvayhOVUxMLCAiICIpOwotICAgICAgICAgICAgICAgIGN1dFdpdGhpbiA9IHN0cnRvZCh2YWx1ZSwgMCk7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHZhbHVlLCAiTk9TSEFSRURFREdFIikgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAvLyA1Ljggc3ludGF4IGJ1dCBub3QgaW4gT0EgZGF0YSBtb2RlbAotICAgICAgICAgICAgICAgICAgICBmcmVlKHdya2luZ1N0cik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbmNsUnVsZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZW5jbFJ1bGUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCh2YWx1ZSwgIkxFTkdUSCIpID09IDApIHsKLSAgICAgICAgICAgIGlmICh3aWR0aCB8fCAoIW92ZXJoKSkgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xMzMwKTogSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19FTkNMT1NVUkU6ICVzXG5Db3JyZWN0IHN5bnRheCBpcyBcIkVOQ0xPU1VSRSBbQUJPVkV8QkVMT1ddIG92ZXJoYW5nMSBvdmVyaGFuZzJcblx0W1dJRFRIIG1pbldpZHRoIFtFWENFUFRFWFRSQUNVVCBjdXRXaXRoaW5cblx0fExFTkdUSCBtaW5MZW5ndGhdIDtcIlxuIiwgdmFsdWVzX1tpbmRleF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZmlFcnJvcihtc2cpOwotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgc3ByaW50Zihtc2csICJJbmNvcnJlY3Qgc3ludGF4IGRlZmluZWQgZm9yIHByb3BlcnR5IExFRjU3X0VOQ0xPU1VSRTogJXNcbkNvcnJlY3Qgc3ludGF4IGlzIFwiRU5DTE9TVVJFIFtBQk9WRXxCRUxPV10gb3ZlcmhhbmcxIG92ZXJoYW5nMlxuXHRbV0lEVEggbWluV2lkdGggW0VYQ0VQVEVYVFJBQ1VUIGN1dFdpdGhpblxuXHR8TEVOR1RIIG1pbkxlbmd0aF0gO1wiXG4iLCB2YWx1ZXNfW2luZGV4XSk7Ci0gICAgICAgICAgICAgICAgbGVmRXJyb3IoMTMzMCwgbXNnKTsKLSAgICAgICAgICAgICAgICBmcmVlKHdya2luZ1N0cik7Ci0gICAgICAgICAgICAgICAgaWYgKGVuY2xSdWxlKQotICAgICAgICAgICAgICAgICAgICBmcmVlKGVuY2xSdWxlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtaW5MZW5ndGggPSBzdHJ0b2Qoc3RydG9rKE5VTEwsICIgIiksIDApOwotICAgICAgICAgICAgdmFsdWUgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICAgICAgICAgIGxlbmd0aCA9IDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAob3ZlcmggPT0gMSkgeyAvLyBBbHJlYWR5IGhhcyBvdmVyaGFuZyB2YWx1ZQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xMzMwKTogSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19FTkNMT1NVUkU6ICVzXG5Db3JyZWN0IHN5bnRheCBpcyBcIkVOQ0xPU1VSRSBbQUJPVkV8QkVMT1ddIG92ZXJoYW5nMSBvdmVyaGFuZzJcblx0W1dJRFRIIG1pbldpZHRoIFtFWENFUFRFWFRSQUNVVCBjdXRXaXRoaW5dXG5cdHxMRU5HVEggbWluTGVuZ3RoXSA7XCJcbiIsIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgICAgICAgICBsZWZpRXJyb3IobXNnKTsKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHNwcmludGYobXNnLCAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19FTkNMT1NVUkU6ICVzXG5Db3JyZWN0IHN5bnRheCBpcyBcIkVOQ0xPU1VSRSBbQUJPVkV8QkVMT1ddIG92ZXJoYW5nMSBvdmVyaGFuZzJcblx0W1dJRFRIIG1pbldpZHRoIFtFWENFUFRFWFRSQUNVVCBjdXRXaXRoaW5dXG5cdHxMRU5HVEggbWluTGVuZ3RoXSA7XCJcbiIsIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgICAgICAgICBsZWZFcnJvcigxMzMwLCBtc2cpOwotICAgICAgICAgICAgICAgIGZyZWUod3JraW5nU3RyKTsKLSAgICAgICAgICAgICAgICBpZiAoZW5jbFJ1bGUpCi0gICAgICAgICAgICAgICAgICAgIGZyZWUoZW5jbFJ1bGUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG92ZXJoYW5nMSA9IHN0cnRvZCh2YWx1ZSwgMCk7Ci0gICAgICAgICAgICBvdmVyaGFuZzIgPSBzdHJ0b2Qoc3RydG9rKE5VTEwsICIgIiksIDApOwotICAgICAgICAgICAgb3ZlcmggPSAxOyAgICAgIC8vIHNldCB0aGUgZmxhZyBvbgotICAgICAgICAgICAgdmFsdWUgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIW92ZXJoKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTMzMCk6IEluY29ycmVjdCBzeW50YXggZGVmaW5lZCBmb3IgcHJvcGVydHkgTEVGNTdfRU5DTE9TVVJFOiAlc1xuQ29ycmVjdCBzeW50YXggaXMgXCJFTkNMT1NVUkUgW0FCT1ZFfEJFTE9XXSBvdmVyaGFuZzEgb3ZlcmhhbmcyXG5cdFtXSURUSCBtaW5XaWR0aCBbRVhDRVBURVhUUkFDVVQgY3V0V2l0aGluXVxuXHR8TEVOR1RIIG1pbkxlbmd0aF0gO1wiXG4iLCB2YWx1ZXNfW2luZGV4XSk7Ci0gICAgICAgICovCi0gICAgICAgIHNwcmludGYobXNnLCAiSW5jb3JyZWN0IHN5bnRheCBkZWZpbmVkIGZvciBwcm9wZXJ0eSBMRUY1N19FTkNMT1NVUkU6ICVzXG5Db3JyZWN0IHN5bnRheCBpcyBcIkVOQ0xPU1VSRSBbQUJPVkV8QkVMT1ddIG92ZXJoYW5nMSBvdmVyaGFuZzJcblx0W1dJRFRIIG1pbldpZHRoIFtFWENFUFRFWFRSQUNVVCBjdXRXaXRoaW5dXG5cdHxMRU5HVEggbWluTGVuZ3RoXSA7XCJcbiIsIHZhbHVlc19baW5kZXhdKTsKLSAgICAgICAgbGVmRXJyb3IoMTMzMCwgbXNnKTsKLSAgICB9IGVsc2UgewotICAgICAgICBhZGRFbmNsb3N1cmUoZW5jbFJ1bGUsIG92ZXJoYW5nMSwgb3ZlcmhhbmcyKTsKLQotICAgICAgICBpZiAod2lkdGgpIHsKLSAgICAgICAgICAgIGFkZEVuY2xvc3VyZVdpZHRoKG1pbldpZHRoKTsKLSAgICAgICAgICAgIGlmIChleGNlcHQpCi0gICAgICAgICAgICAgICAgYWRkRW5jbG9zdXJlRXhjZXB0RUMoY3V0V2l0aGluKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobGVuZ3RoKQotICAgICAgICAgICAgYWRkRW5jbG9zdXJlTGVuZ3RoKG1pbkxlbmd0aCk7Ci0gICAgfQotICAgIGlmIChlbmNsUnVsZSkKLSAgICAgICAgZnJlZShlbmNsUnVsZSk7Ci0KLSAgICBmcmVlKHdya2luZ1N0cik7Ci0gICAgcmV0dXJuOwotfQotCi0vLyA1LjcKLS8vIFRoaXMgQVBJIHdpbGwgaXMgY3JlYXRlZCBqdXN0IGZvciBPQSB0byBjYWxsIGluIDUuNiBvbmx5LgotLy8gVGhpcyBBUEkgd2lsbCBiZSBvYnNvbGV0ZWQgaW4gNS43LgotLy8gSXQgd2lsbCBsb29rIGZvciBhbGwgdGhlIHByb3BlcnRpZXMgaW4gInRoaXMiIHRoYXQgYXJlIHR5cGUgJ1MnIGFuZAotLy8gcHJvcGVydHkgbmFtZSBzdGFydHMgd2l0aCAiTEVGNTdfLi4uCi12b2lkCi1sZWZpTGF5ZXI6OnBhcnNlNjVubVJ1bGVzKCkKLXsKLSAgICBpbnQgaTsKLQotICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS42KQotICAgICAgICByZXR1cm47Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUHJvcHNfOyBpKyspIHsKLSAgICAgICAgaWYgKChzdHJsZW4obmFtZXNfW2ldKSA+IDYpICYmICh0eXBlc19baV0gPT0gJ1MnKSkgewotICAgICAgICAgICAgaWYgKHN0cm5jbXAobmFtZXNfW2ldLCAiTEVGNTdfIiwgNikgPT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChzdHJjbXAobmFtZXNfW2ldLCAiTEVGNTdfU1BBQ0lORyIpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyc2VTcGFjaW5nKGkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSAvKiBOb3QgYW4gT0EgZGF0YSBtb2RlbAotICAgICAgICAgICBpZiAoc3RyY21wKG5hbWVzX1tpXSwgIkxFRjU3X01BWEZMT0FUSU5HQVJFQSIpID09IDApIHsKLSAgICAgICAgICAgICAgcGFyc2VNYXhGbG9hdGluZyhpKTsKLSAgICAgICAgICAgfSBlbHNlCi0qLwotICAgICAgICAgICAgICAgIGlmIChzdHJjbXAobmFtZXNfW2ldLCAiTEVGNTdfQVJSQVlTUEFDSU5HIikgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBwYXJzZUFycmF5U3BhY2luZyhpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChuYW1lc19baV0sICJMRUY1N19NSU5TVEVQIikgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBwYXJzZU1pbnN0ZXAoaSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobmFtZXNfW2ldLCAiTEVGNTdfQU5URU5OQUNVTVJPVVRJTkdQTFVTQ1VUIikgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBwYXJzZUFudGVubmFDdW1Sb3V0aW5nKGkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5hbWVzX1tpXSwgIkxFRjU3X0FOVEVOTkFHQVRFUExVU0RJRkYiKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcnNlQW50ZW5uYUdhdGVQbHVzKGkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5hbWVzX1tpXSwgIkxFRjU3X0FOVEVOTkFBUkVBTUlOVVNESUZGIikgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBwYXJzZUFudGVubmFBcmVhTWludXMoaSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobmFtZXNfW2ldLCAiTEVGNTdfQU5URU5OQUFSRUFESUZGUkVEVUNFUFdMIikgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBwYXJzZUFudGVubmFBcmVhRGlmZihpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChuYW1lc19baV0sICJMRUY1N19FTkNMT1NVUkUiKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcnNlTGF5ZXJFbmNsb3N1cmUoaSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0vLyBQUklWQVRFIDUuOAotLy8gVGhpcyBmdW5jdGlvbiB3aWxsIHBhcnNlIExFRjU4X1RZUEUgcHJvcGVydHkgdmFsdWUuIEl0IGFsc28gY2hlY2tzCi0vLyBpZiBsZWY1OCB0eXBlIGlzIGNvbXBhdGlibGUgd2l0aCBMQVlFUiBUWVBFIHZhbHVlLgotdm9pZAotbGVmaUxheWVyOjpwYXJzZUxheWVyVHlwZShpbnQgaW5kZXgpCi17Ci0gICAgc3RkOjpzdHJpbmcgcHJvcFZhbHVlKHZhbHVlc19baW5kZXhdKTsKLSAgICBpbnQgICAgICAgICB0b2tlblN0YXJ0ID0gMDsKLSAgICBzdGQ6OnN0cmluZyBmaXJzdFRva2VuID0gbGVmclNldHRpbmdzOjpnZXRUb2tlbihwcm9wVmFsdWUsIHRva2VuU3RhcnQpOwotCi0gICAgLy8gV3JvbmcgTEVGNThfVFlQRSBzeW50YXguCi0gICAgaWYgKGZpcnN0VG9rZW4gIT0gIlRZUEUiKSB7IAotICAgICAgICBzdGQ6OnN0cmluZyBtc2cgPSAiSW5jb3JyZWN0IExFRjU4X1RZUEUgcHJvcGVydHkgdmFsdWUgc3ludGF4OiAnIiArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcFZhbHVlICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiJy4gQ29ycmVjdCBzeW50YXg6ICdUWVBFIDx0eXBlPiA7Jy5cbiI7Ci0KLSAgICAgICAgbGVmRXJyb3IoMTMyOSwgbXNnLmNfc3RyKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3RkOjpzdHJpbmcgdHlwZSh0eXBlXyk7Ci0gICAgc3RkOjpzdHJpbmcgbGVmNThUeXBlKGxlZnJTZXR0aW5nczo6Z2V0VG9rZW4ocHJvcFZhbHVlLCB0b2tlblN0YXJ0KSk7Ci0gICAgc3RkOjpzdHJpbmcgdHlwZXNQYWlyKGxlZjU4VHlwZSArICIgIiArIHR5cGUpOwotCi0gICAgaWYgKGxlZlNldHRpbmdzLT5MZWY1OFR5cGVQYWlycy5maW5kKHR5cGVzUGFpcikgIT0gbGVmU2V0dGluZ3MtPkxlZjU4VHlwZVBhaXJzLmVuZCgpKSB7Ci0gICAgICAgIC8vIEluIHBhcnNlciBMYXllclR5cGUgPT0gbGVmNTggdHlwZS4gCi0gICAgICAgIHNldExheWVyVHlwZShsZWY1OFR5cGUuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmluZyBsYXllckxlZjU4VHlwZXMgPSBsZWZTZXR0aW5ncy0+Z2V0TGF5ZXJMZWY1OFR5cGVzKHRoaXMtPnR5cGVfKTsKLQotICAgIC8vIFdyb25nL2luY29tcGF0aWJsZSBsZWY1OCB0eXBlLgotICAgIGlmIChsYXllckxlZjU4VHlwZXMuZW1wdHkoKSkgewotICAgICAgICBzdGQ6OnN0cmluZyBtc2cgPSAiTGF5ZXJzIHdpdGggVFlQRSAiICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlICArICIgY2Fubm90IGhhdmUgTEVGNThfVFlQRSBwcm9wZXJ0eS5cbiI7Ci0KLSAgICAgICAgbGVmRXJyb3IoMTMyOCwgbXNnLmNfc3RyKCkpOyAgICAgICAgCi0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgbXNnID0gIlByb3BlcnR5IExFRjU4X1RZUEUgaGFzIGluY29ycmVjdCBUWVBFIHZhbHVlOiAnIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxlZjU4VHlwZSArICInLiBGb3IgVFlQRSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSArICIgbGF5ZXJzIHZhbGlkIHZhbHVlcyBhcmU6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllckxlZjU4VHlwZXMgKyAiLlxuIjsKLQotICAgICAgICBsZWZFcnJvcigxMzI3LCBtc2cuY19zdHIoKSk7ICAKLSAgICB9IAotfQotCi0vLyA1LjgKLS8vIFRoaXMgQVBJIHdpbGwgaXMgY3JlYXRlZCBqdXN0IGZvciBPQSB0byBjYWxsIGluIDUuNyBvbmx5LgotLy8gVGhpcyBBUEkgd2lsbCBiZSBvYnNvbGV0ZWQgb25jZSA1LjggQVBJcyBhcmUgYXZhaWxhYmxlIGFuZCBPQSBtb3ZlcwotLy8gdG8gdXNpbmcgdGhlbS4KLS8vIEl0IHdpbGwgbG9vayBmb3IgdGhlIHByb3BlcnRpZXMgaW4gInRoaXMiIHRoYXQgYXJlIHR5cGUgJ1MnIGFuZAotLy8gcHJvcGVydHkgbmFtZSBpcyAiTEVGNThfVFlQRSIKLXZvaWQKLWxlZmlMYXllcjo6cGFyc2VMRUY1OExheWVyKCkKLXsKLSAgICBpbnQgaTsKLQotICAgIGlmIChsZWZEYXRhLT52ZXJzaW9uTnVtIDwgNS43KQotICAgICAgICByZXR1cm47Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUHJvcHNfOyBpKyspIHsKLSAgICAgICAgaWYgKHN0cmxlbihuYW1lc19baV0pID09IDEwKSB7Ci0gICAgICAgICAgICBpZiAoc3RyY21wKG5hbWVzX1tpXSwgIkxFRjU4X1RZUEUiKSA9PSAwKQotICAgICAgICAgICAgICAgIHBhcnNlTGF5ZXJUeXBlKGkpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1pbnQKLWxlZmlMYXllcjo6bmVlZDU4UHJvcHNQcm9jZXNzaW5nKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbGVmRGF0YS0+dmVyc2lvbk51bSA+PSA1Ljc7Ci19Ci0KLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaUxheWVyLmhwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaUxheWVyLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGViMjM0ZS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlMYXllci5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDY0ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTIgLSAyMDE1LCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2lmbmRlZiBsZWZpTGF5ZXJfaAotI2RlZmluZSBsZWZpTGF5ZXJfaAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJsZWZpS1JEZWZzLmhwcCIKLSNpbmNsdWRlICJsZWZpTWlzYy5ocHAiCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLXR5cGVkZWYgZW51bSBsZWZpQW50ZW5uYUVudW0gewotICBsZWZpQW50ZW5uYUFSLAotICBsZWZpQW50ZW5uYURBUiwKLSAgbGVmaUFudGVubmFDQVIsCi0gIGxlZmlBbnRlbm5hQ0RBUiwKLSAgbGVmaUFudGVubmFBRiwKLSAgbGVmaUFudGVubmFTQVIsCi0gIGxlZmlBbnRlbm5hRFNBUiwKLSAgbGVmaUFudGVubmFDU0FSLAotICBsZWZpQW50ZW5uYUNEU0FSLAotICBsZWZpQW50ZW5uYVNBRiwKLSAgbGVmaUFudGVubmFPLAotICBsZWZpQW50ZW5uYUFEUgotfSBsZWZpQW50ZW5uYUVudW07Ci0KLWNsYXNzIGxlZmlBbnRlbm5hUFdMIHsKLXB1YmxpYzoKLSAgbGVmaUFudGVubmFQV0woKTsKLSAgfmxlZmlBbnRlbm5hUFdMKCk7Ci0KLSAgc3RhdGljIGxlZmlBbnRlbm5hUFdMKiBjcmVhdGUoKTsKLSAgdm9pZCBJbml0KCk7Ci0gIHZvaWQgY2xlYXIoKTsKLSAgdm9pZCBEZXN0cm95KCk7Ci0KLSAgdm9pZCBhZGRBbnRlbm5hUFdMKGRvdWJsZSBkLCBkb3VibGUgcik7Ci0KLSAgaW50ICBudW1QV0woKSBjb25zdDsKLSAgZG91YmxlIFBXTGRpZmZ1c2lvbihpbnQgaW5kZXgpOyAKLSAgZG91YmxlIFBXTHJhdGlvKGludCBpbmRleCk7IAotCi1wcm90ZWN0ZWQ6Ci0gIGludCBudW1BbGxvY187Ci0gIGludCBudW1QV0xfOwotICBkb3VibGUqIGRfOwotICBkb3VibGUqIHJfOwotfTsKLQotY2xhc3MgbGVmaUxheWVyRGVuc2l0eSB7Ci1wdWJsaWM6Ci0gIGxlZmlMYXllckRlbnNpdHkoKTsKLSAgfmxlZmlMYXllckRlbnNpdHkoKTsKLQotICB2b2lkIEluaXQoY29uc3QgY2hhciogdHlwZSk7Ci0gIHZvaWQgRGVzdHJveSgpOwotICB2b2lkIGNsZWFyKCk7Ci0KLSAgdm9pZCBzZXRPbmVFbnRyeShkb3VibGUgZW50cnkpOwotICB2b2lkIGFkZEZyZXF1ZW5jeShpbnQgbnVtLCBkb3VibGUqIGZyZXF1ZW5jeSk7Ci0gIHZvaWQgYWRkV2lkdGgoaW50IG51bSwgZG91YmxlKiB3aWR0aCk7Ci0gIHZvaWQgYWRkVGFibGVFbnRyeShpbnQgbnVtLCBkb3VibGUqIGVudHJ5KTsKLSAgdm9pZCBhZGRDdXRhcmVhKGludCBudW0sIGRvdWJsZSogY3V0YXJlYSk7Ci0KLSAgY2hhciogdHlwZSgpIGNvbnN0OwotICBpbnQgaGFzT25lRW50cnkoKSBjb25zdDsKLSAgZG91YmxlIG9uZUVudHJ5KCkgY29uc3Q7Ci0gIGludCBudW1GcmVxdWVuY3koKSBjb25zdDsKLSAgZG91YmxlIGZyZXF1ZW5jeShpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgbnVtV2lkdGhzKCkgY29uc3Q7Ci0gIGRvdWJsZSB3aWR0aChpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgbnVtVGFibGVFbnRyaWVzKCkgY29uc3Q7Ci0gIGRvdWJsZSB0YWJsZUVudHJ5KGludCBpbmRleCkgY29uc3Q7Ci0gIGludCBudW1DdXRhcmVhcygpIGNvbnN0OwotICBkb3VibGUgY3V0QXJlYShpbnQgaW5kZXgpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gIGNoYXIqIHR5cGVfOwotICBkb3VibGUgb25lRW50cnlfOwotICBpbnQgbnVtRnJlcXVlbmN5XzsKLSAgZG91YmxlKiBmcmVxdWVuY3lfOwotICBpbnQgbnVtV2lkdGhzXzsKLSAgZG91YmxlKiB3aWR0aHNfOwotICBpbnQgbnVtVGFibGVFbnRyaWVzXzsKLSAgZG91YmxlKiB0YWJsZUVudHJpZXNfOwotICBpbnQgbnVtQ3V0YXJlYXNfOwotICBkb3VibGUqIGN1dGFyZWFzXzsKLX07Ci0KLS8vIDUuNQotY2xhc3MgbGVmaVBhcmFsbGVsIHsKLXB1YmxpYzoKLSAgbGVmaVBhcmFsbGVsKCk7Ci0gIH5sZWZpUGFyYWxsZWwoKTsKLQotICB2b2lkIEluaXQoKTsKLSAgdm9pZCBjbGVhcigpOwotICB2b2lkIERlc3Ryb3koKTsKLQotICB2b2lkIGFkZFBhcmFsbGVsTGVuZ3RoKGludCBudW1MZW5ndGgsIGRvdWJsZSogbGVuZ3Rocyk7Ci0gIHZvaWQgYWRkUGFyYWxsZWxXaWR0aChkb3VibGUgd2lkdGgpOwotICB2b2lkIGFkZFBhcmFsbGVsV2lkdGhTcGFjaW5nKGludCBudW1TcGFjaW5nLCBkb3VibGUqIHNwYWNpbmdzKTsKLQotICBpbnQgIG51bUxlbmd0aCgpIGNvbnN0OwotICBpbnQgIG51bVdpZHRoKCkgY29uc3Q7Ci0gIGRvdWJsZSBsZW5ndGgoaW50IGlMZW5ndGgpIGNvbnN0OwotICBkb3VibGUgd2lkdGgoaW50IGlXaWR0aCkgY29uc3Q7Ci0gIGRvdWJsZSB3aWR0aFNwYWNpbmcoaW50IGlXaWR0aCwgaW50IGlXaWR0aFNwYWNpbmcpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gIGludCBudW1MZW5ndGhfOwotICBpbnQgbnVtV2lkdGhfOwotICBpbnQgbnVtV2lkdGhBbGxvY2F0ZWRfOwotICBkb3VibGUqIGxlbmd0aF87Ci0gIGRvdWJsZSogd2lkdGhfOwotICBkb3VibGUqIHdpZHRoU3BhY2luZ187Ci19OwotCi0vLyA1LjUKLWNsYXNzIGxlZmlJbmZsdWVuY2UgewotcHVibGljOgotICBsZWZpSW5mbHVlbmNlKCk7Ci0gIH5sZWZpSW5mbHVlbmNlKCk7Ci0KLSAgdm9pZCBJbml0KCk7Ci0gIHZvaWQgY2xlYXIoKTsKLSAgdm9pZCBEZXN0cm95KCk7Ci0KLSAgdm9pZCBhZGRJbmZsdWVuY2UoZG91YmxlIHdpZHRoLCBkb3VibGUgZGlzdGFuY2UsIGRvdWJsZSBzcGFjaW5nKTsKLQotICBpbnQgIG51bUluZmx1ZW5jZUVudHJ5KCkgY29uc3Q7Ci0gIGRvdWJsZSB3aWR0aChpbnQgaW5kZXgpIGNvbnN0OwotICBkb3VibGUgZGlzdGFuY2UoaW50IGluZGV4KSBjb25zdDsKLSAgZG91YmxlIHNwYWNpbmcoaW50IGluZGV4KSBjb25zdDsKLQotcHJvdGVjdGVkOgotICBpbnQgbnVtQWxsb2NhdGVkXzsKLSAgaW50IG51bVdpZHRoXzsKLSAgaW50IG51bURpc3RhbmNlXzsKLSAgaW50IG51bVNwYWNpbmdfOwotICBkb3VibGUqIHdpZHRoXzsKLSAgZG91YmxlKiBkaXN0YW5jZV87Ci0gIGRvdWJsZSogc3BhY2luZ187Ci19OwotCi0vLyA1LjcKLWNsYXNzIGxlZmlUd29XaWR0aHMgewotcHVibGljOgotICBsZWZpVHdvV2lkdGhzKCk7Ci0gIH5sZWZpVHdvV2lkdGhzKCk7Ci0KLSAgdm9pZCBJbml0KCk7Ci0gIHZvaWQgY2xlYXIoKTsKLSAgdm9pZCBEZXN0cm95KCk7Ci0KLSAgdm9pZCBhZGRUd29XaWR0aHMoZG91YmxlIHdpZHRoLCBkb3VibGUgcnVuTGVuZ3RoLCBpbnQgbnVtU3BhY2luZywKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBzcGFjaW5ncywgaW50IGhhc1BSTCA9IDApOwotCi0gIGludCAgICBudW1XaWR0aCgpIGNvbnN0OwotICBkb3VibGUgd2lkdGgoaW50IGlXaWR0aCkgY29uc3Q7Ci0gIGludCAgICBoYXNXaWR0aFBSTChpbnQgaVdpZHRoKSBjb25zdDsKLSAgZG91YmxlIHdpZHRoUFJMKGludCBpV2lkdGgpIGNvbnN0OwotICBpbnQgICAgbnVtV2lkdGhTcGFjaW5nKGludCBpV2lkdGgpIGNvbnN0OwotICBkb3VibGUgd2lkdGhTcGFjaW5nKGludCBpV2lkdGgsIGludCBpV2lkdGhTcGFjaW5nKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICBpbnQgbnVtV2lkdGhfOwotICBpbnQgbnVtV2lkdGhBbGxvY2F0ZWRfOwotICBkb3VibGUqIHdpZHRoXzsKLSAgZG91YmxlKiBwcmxfOwotICBpbnQqICAgIGhhc1BSTF87Ci0gIGludCogICAgbnVtV2lkdGhTcGFjaW5nXzsgICAvLyBlYWNoIHNsb3QgY29udGFpbnMgbnVtYmVyIG9mIHNwYWNpbmcgb2Ygc2xvdAotICBkb3VibGUqIHdpZHRoU3BhY2luZ187Ci0gIGludCogICAgYXROc3BfOyAgICAgICAgICAgICAvLyBhY2N1bXVsYXRlIHRvdGFsIG51bWJlciBvZiBzcGFjaW5nCi19OwotCi0vLyA1LjUKLWNsYXNzIGxlZmlTcGFjaW5nVGFibGUgewotcHVibGljOgotICBsZWZpU3BhY2luZ1RhYmxlKCk7Ci0gIH5sZWZpU3BhY2luZ1RhYmxlKCk7Ci0KLSAgdm9pZCBJbml0KCk7Ci0gIHZvaWQgY2xlYXIoKTsKLSAgdm9pZCBEZXN0cm95KCk7Ci0KLSAgdm9pZCBhZGRQYXJhbGxlbExlbmd0aChpbnQgbnVtTGVuZ3RoLCBkb3VibGUqIGxlbmd0aHMpOwotICB2b2lkIGFkZFBhcmFsbGVsV2lkdGgoZG91YmxlIHdpZHRoKTsKLSAgdm9pZCBhZGRQYXJhbGxlbFdpZHRoU3BhY2luZyhpbnQgbnVtU3BhY2luZywgZG91YmxlKiBzcGFjaW5nKTsKLSAgdm9pZCBzZXRJbmZsdWVuY2UoKTsKLSAgdm9pZCBhZGRJbmZsdWVuY2UoZG91YmxlIHdpZHRoLCBkb3VibGUgZGlzdGFuY2UsIGRvdWJsZSBzcGFjaW5nKTsKLSAgdm9pZCBhZGRUd29XaWR0aHMoZG91YmxlIHdpZHRoLCBkb3VibGUgcnVuTGVuZ3RoLCBpbnQgbnVtU3BhY2luZywKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBzcGFjaW5nLCBpbnQgaGFzUFJMID0gMCk7ICAgICAgICAgIC8vIDUuNwotICAKLSAgaW50IGlzSW5mbHVlbmNlKCkgY29uc3Q7Ci0gIGxlZmlJbmZsdWVuY2UqIGluZmx1ZW5jZSgpIGNvbnN0OwotICBpbnQgaXNQYXJhbGxlbCgpIGNvbnN0OwotICBsZWZpUGFyYWxsZWwqICBwYXJhbGxlbCgpIGNvbnN0OwotICBsZWZpVHdvV2lkdGhzKiB0d29XaWR0aHMoKSBjb25zdDsgICAgICAgICAgIC8vIDUuNwotCi1wcm90ZWN0ZWQ6Ci0gIGludCBoYXNJbmZsdWVuY2VfOwotICBsZWZpSW5mbHVlbmNlKiAgIGluZmx1ZW5jZV87Ci0gIGxlZmlQYXJhbGxlbCogICAgcGFyYWxsZWxfOwotICBsZWZpVHdvV2lkdGhzKiAgIHR3b1dpZHRoc187ICAgICAgICAgICAgICAgLy8gNS43Ci19OwotCi0vLyA1LjcKLWNsYXNzIGxlZmlPcnRob2dvbmFsIHsKLXB1YmxpYzoKLSAgbGVmaU9ydGhvZ29uYWwoKTsKLSAgfmxlZmlPcnRob2dvbmFsKCk7Ci0KLSAgdm9pZCBJbml0KCk7Ci0gIHZvaWQgRGVzdHJveSgpOwotCi0gIHZvaWQgYWRkT3J0aG9nb25hbChkb3VibGUgY3V0V2l0aGluLCBkb3VibGUgb3J0aG8pOwotCi0gIGludCAgbnVtT3J0aG9nb25hbCgpIGNvbnN0OwotICBkb3VibGUgY3V0V2l0aGluKGludCBpbmRleCkgY29uc3Q7Ci0gIGRvdWJsZSBvcnRob1NwYWNpbmcoaW50IGluZGV4KSBjb25zdDsKLQotcHJvdGVjdGVkOgotICBpbnQgbnVtQWxsb2NhdGVkXzsKLSAgaW50IG51bUN1dE9ydGhvXzsKLSAgZG91YmxlKiBjdXRXaXRoaW5fOwotICBkb3VibGUqIG9ydGhvXzsKLX07Ci0KLS8vIDUuNQotY2xhc3MgbGVmaUFudGVubmFNb2RlbCB7Ci1wdWJsaWM6Ci0gIGxlZmlBbnRlbm5hTW9kZWwoKTsKLSAgfmxlZmlBbnRlbm5hTW9kZWwoKTsKLQotICB2b2lkIEluaXQoKTsKLSAgdm9pZCBEZXN0cm95KCk7Ci0KLSAgdm9pZCBzZXRBbnRlbm5hTW9kZWwoaW50IG94aWRlKTsKLSAgdm9pZCBzZXRBbnRlbm5hQXJlYVJhdGlvKGRvdWJsZSB2YWx1ZSk7Ci0gIHZvaWQgc2V0QW50ZW5uYUN1bUFyZWFSYXRpbyhkb3VibGUgdmFsdWUpOwotICB2b2lkIHNldEFudGVubmFBcmVhRmFjdG9yKGRvdWJsZSB2YWx1ZSk7Ci0gIHZvaWQgc2V0QW50ZW5uYVNpZGVBcmVhUmF0aW8oZG91YmxlIHZhbHVlKTsKLSAgdm9pZCBzZXRBbnRlbm5hQ3VtU2lkZUFyZWFSYXRpbyhkb3VibGUgdmFsdWUpOwotICB2b2lkIHNldEFudGVubmFTaWRlQXJlYUZhY3Rvcihkb3VibGUgdmFsdWUpOwotICB2b2lkIHNldEFudGVubmFWYWx1ZShsZWZpQW50ZW5uYUVudW0gYW50ZW5uYVR5cGUsIGRvdWJsZSB2YWx1ZSk7Ci0gIHZvaWQgc2V0QW50ZW5uYURVTyhsZWZpQW50ZW5uYUVudW0gYW50ZW5uYVR5cGUpOwotICB2b2lkIHNldEFudGVubmFQV0wobGVmaUFudGVubmFFbnVtIGFudGVubmFUeXBlLCBsZWZpQW50ZW5uYVBXTCogcHdsKTsKLSAgdm9pZCBzZXRBbnRlbm5hQ3VtUm91dGluZ1BsdXNDdXQoKTsgICAgICAgICAgICAgLy8gNS43Ci0gIHZvaWQgc2V0QW50ZW5uYUdhdGVQbHVzRGlmZihkb3VibGUgdmFsdWUpOyAgICAgIC8vIDUuNwotICB2b2lkIHNldEFudGVubmFBcmVhTWludXNEaWZmKGRvdWJsZSB2YWx1ZSk7ICAgICAvLyA1LjcKLQotICBpbnQgaGFzQW50ZW5uYUFyZWFSYXRpbygpIGNvbnN0OwotICBpbnQgaGFzQW50ZW5uYURpZmZBcmVhUmF0aW8oKSBjb25zdDsKLSAgaW50IGhhc0FudGVubmFEaWZmQXJlYVJhdGlvUFdMKCkgY29uc3Q7Ci0gIGludCBoYXNBbnRlbm5hQ3VtQXJlYVJhdGlvKCkgY29uc3Q7Ci0gIGludCBoYXNBbnRlbm5hQ3VtRGlmZkFyZWFSYXRpbygpIGNvbnN0OwotICBpbnQgaGFzQW50ZW5uYUN1bURpZmZBcmVhUmF0aW9QV0woKSBjb25zdDsKLSAgaW50IGhhc0FudGVubmFBcmVhRmFjdG9yKCkgY29uc3Q7Ci0gIGludCBoYXNBbnRlbm5hQXJlYUZhY3RvckRVTygpIGNvbnN0OwotICBpbnQgaGFzQW50ZW5uYVNpZGVBcmVhUmF0aW8oKSBjb25zdDsKLSAgaW50IGhhc0FudGVubmFEaWZmU2lkZUFyZWFSYXRpbygpIGNvbnN0OwotICBpbnQgaGFzQW50ZW5uYURpZmZTaWRlQXJlYVJhdGlvUFdMKCkgY29uc3Q7Ci0gIGludCBoYXNBbnRlbm5hQ3VtU2lkZUFyZWFSYXRpbygpIGNvbnN0OwotICBpbnQgaGFzQW50ZW5uYUN1bURpZmZTaWRlQXJlYVJhdGlvKCkgY29uc3Q7Ci0gIGludCBoYXNBbnRlbm5hQ3VtRGlmZlNpZGVBcmVhUmF0aW9QV0woKSBjb25zdDsKLSAgaW50IGhhc0FudGVubmFTaWRlQXJlYUZhY3RvcigpIGNvbnN0OwotICBpbnQgaGFzQW50ZW5uYVNpZGVBcmVhRmFjdG9yRFVPKCkgY29uc3Q7Ci0gIGludCBoYXNBbnRlbm5hQ3VtUm91dGluZ1BsdXNDdXQoKSBjb25zdDsgICAgICAgIC8vIDUuNwotICBpbnQgaGFzQW50ZW5uYUdhdGVQbHVzRGlmZigpIGNvbnN0OyAgICAgICAgICAgICAvLyA1LjcKLSAgaW50IGhhc0FudGVubmFBcmVhTWludXNEaWZmKCkgY29uc3Q7ICAgICAgICAgICAgLy8gNS43Ci0gIGludCBoYXNBbnRlbm5hQXJlYURpZmZSZWR1Y2VQV0woKSBjb25zdDsgICAgICAgIC8vIDUuNwotCi0gIGNoYXIqICBhbnRlbm5hT3hpZGUoKSBjb25zdDsKLSAgZG91YmxlIGFudGVubmFBcmVhUmF0aW8oKSBjb25zdDsKLSAgZG91YmxlIGFudGVubmFEaWZmQXJlYVJhdGlvKCkgY29uc3Q7Ci0gIGxlZmlBbnRlbm5hUFdMKiBhbnRlbm5hRGlmZkFyZWFSYXRpb1BXTCgpIGNvbnN0OwotICBkb3VibGUgYW50ZW5uYUN1bUFyZWFSYXRpbygpIGNvbnN0OwotICBkb3VibGUgYW50ZW5uYUN1bURpZmZBcmVhUmF0aW8oKSBjb25zdDsKLSAgbGVmaUFudGVubmFQV0wqIGFudGVubmFDdW1EaWZmQXJlYVJhdGlvUFdMKCkgY29uc3Q7Ci0gIGRvdWJsZSBhbnRlbm5hQXJlYUZhY3RvcigpIGNvbnN0OwotICBkb3VibGUgYW50ZW5uYVNpZGVBcmVhUmF0aW8oKSBjb25zdDsKLSAgZG91YmxlIGFudGVubmFEaWZmU2lkZUFyZWFSYXRpbygpIGNvbnN0OwotICBsZWZpQW50ZW5uYVBXTCogYW50ZW5uYURpZmZTaWRlQXJlYVJhdGlvUFdMKCkgY29uc3Q7Ci0gIGRvdWJsZSBhbnRlbm5hQ3VtU2lkZUFyZWFSYXRpbygpIGNvbnN0OwotICBkb3VibGUgYW50ZW5uYUN1bURpZmZTaWRlQXJlYVJhdGlvKCkgY29uc3Q7Ci0gIGxlZmlBbnRlbm5hUFdMKiBhbnRlbm5hQ3VtRGlmZlNpZGVBcmVhUmF0aW9QV0woKSBjb25zdDsKLSAgZG91YmxlIGFudGVubmFTaWRlQXJlYUZhY3RvcigpIGNvbnN0OwotICBkb3VibGUgYW50ZW5uYUdhdGVQbHVzRGlmZigpIGNvbnN0OyAgICAgICAgICAgICAgICAgIC8vIDUuNwotICBkb3VibGUgYW50ZW5uYUFyZWFNaW51c0RpZmYoKSBjb25zdDsgICAgICAgICAgICAgICAgIC8vIDUuNwotICBsZWZpQW50ZW5uYVBXTCogYW50ZW5uYUFyZWFEaWZmUmVkdWNlUFdMKCkgY29uc3Q7ICAgIC8vIDUuNwotCi1wcm90ZWN0ZWQ6Ci0gIGludCBoYXNBbnRlbm5hQXJlYVJhdGlvXzsKLSAgaW50IGhhc0FudGVubmFEaWZmQXJlYVJhdGlvXzsKLSAgaW50IGhhc0FudGVubmFEaWZmQXJlYVJhdGlvUFdMXzsKLSAgaW50IGhhc0FudGVubmFDdW1BcmVhUmF0aW9fOwotICBpbnQgaGFzQW50ZW5uYUN1bURpZmZBcmVhUmF0aW9fOwotICBpbnQgaGFzQW50ZW5uYUN1bURpZmZBcmVhUmF0aW9QV0xfOwotICBpbnQgaGFzQW50ZW5uYUFyZWFGYWN0b3JfOwotICBpbnQgaGFzQW50ZW5uYUFyZWFGYWN0b3JEVU9fOwotICBpbnQgaGFzQW50ZW5uYVNpZGVBcmVhUmF0aW9fOwotICBpbnQgaGFzQW50ZW5uYURpZmZTaWRlQXJlYVJhdGlvXzsKLSAgaW50IGhhc0FudGVubmFEaWZmU2lkZUFyZWFSYXRpb1BXTF87Ci0gIGludCBoYXNBbnRlbm5hQ3VtU2lkZUFyZWFSYXRpb187Ci0gIGludCBoYXNBbnRlbm5hQ3VtRGlmZlNpZGVBcmVhUmF0aW9fOwotICBpbnQgaGFzQW50ZW5uYUN1bURpZmZTaWRlQXJlYVJhdGlvUFdMXzsKLSAgaW50IGhhc0FudGVubmFTaWRlQXJlYUZhY3Rvcl87Ci0gIGludCBoYXNBbnRlbm5hU2lkZUFyZWFGYWN0b3JEVU9fOwotICBpbnQgaGFzQW50ZW5uYUN1bVJvdXRpbmdQbHVzQ3V0XzsgICAgICAgIC8vIDUuNwotICBpbnQgaGFzQW50ZW5uYUdhdGVQbHVzRGlmZl87ICAgICAgICAgICAgIC8vIDUuNwotICBpbnQgaGFzQW50ZW5uYUFyZWFNaW51c0RpZmZfOyAgICAgICAgICAgIC8vIDUuNwotCi0gIGNoYXIqICBveGlkZV87Ci0gIGRvdWJsZSBhbnRlbm5hQXJlYVJhdGlvXzsKLSAgZG91YmxlIGFudGVubmFEaWZmQXJlYVJhdGlvXzsKLSAgbGVmaUFudGVubmFQV0wqIGFudGVubmFEaWZmQXJlYVJhdGlvUFdMXzsKLSAgZG91YmxlIGFudGVubmFDdW1BcmVhUmF0aW9fOwotICBkb3VibGUgYW50ZW5uYUN1bURpZmZBcmVhUmF0aW9fOwotICBsZWZpQW50ZW5uYVBXTCogYW50ZW5uYUN1bURpZmZBcmVhUmF0aW9QV0xfOwotICBkb3VibGUgYW50ZW5uYUFyZWFGYWN0b3JfOwotICBkb3VibGUgYW50ZW5uYVNpZGVBcmVhUmF0aW9fOwotICBkb3VibGUgYW50ZW5uYURpZmZTaWRlQXJlYVJhdGlvXzsKLSAgbGVmaUFudGVubmFQV0wqIGFudGVubmFEaWZmU2lkZUFyZWFSYXRpb1BXTF87Ci0gIGRvdWJsZSBhbnRlbm5hQ3VtU2lkZUFyZWFSYXRpb187Ci0gIGRvdWJsZSBhbnRlbm5hQ3VtRGlmZlNpZGVBcmVhUmF0aW9fOwotICBsZWZpQW50ZW5uYVBXTCogYW50ZW5uYUN1bURpZmZTaWRlQXJlYVJhdGlvUFdMXzsKLSAgZG91YmxlIGFudGVubmFTaWRlQXJlYUZhY3Rvcl87Ci0gIGRvdWJsZSBhbnRlbm5hR2F0ZVBsdXNEaWZmXzsgICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgZG91YmxlIGFudGVubmFBcmVhTWludXNEaWZmXzsgICAgICAgICAgICAgICAgIC8vIDUuNwotICBsZWZpQW50ZW5uYVBXTCogYW50ZW5uYUFyZWFEaWZmUmVkdWNlUFdMXzsgICAgLy8gNS43Ci19OwotCi1jbGFzcyBsZWZpTGF5ZXIgewotcHVibGljOgotICBsZWZpTGF5ZXIoKTsKLSAgdm9pZCBJbml0KCk7Ci0KLSAgdm9pZCBEZXN0cm95KCk7Ci0gIH5sZWZpTGF5ZXIoKTsKLQotICB2b2lkIGNsZWFyKCk7Ci0gIHZvaWQgc2V0TmFtZShjb25zdCBjaGFyKiBuYW1lKTsgLy8gY2FsbHMgY2xlYXIgdG8gaW5pdAotICB2b2lkIHNldFR5cGUoY29uc3QgY2hhciogdHlwKTsKLSAgdm9pZCBzZXRQaXRjaChkb3VibGUgbnVtKTsKLSAgdm9pZCBzZXRNYXNrKGludCBudW0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuOAotICB2b2lkIHNldFBpdGNoWFkoZG91YmxlIHhkaXN0LCBkb3VibGUgeWRpc3QpOyAgICAgLy8gNS42Ci0gIHZvaWQgc2V0T2Zmc2V0KGRvdWJsZSBudW0pOwotICB2b2lkIHNldE9mZnNldFhZKGRvdWJsZSB4ZGlzdCwgZG91YmxlIHlkaXN0KTsgICAgLy8gNS42Ci0gIHZvaWQgc2V0V2lkdGgoZG91YmxlIG51bSk7Ci0gIHZvaWQgc2V0QXJlYShkb3VibGUgbnVtKTsKLSAgdm9pZCBzZXREaWFnUGl0Y2goZG91YmxlIGRpc3QpOyAgICAgICAgICAgICAgICAgIC8vIDUuNgotICB2b2lkIHNldERpYWdQaXRjaFhZKGRvdWJsZSB4ZGlzdCwgZG91YmxlIHlkaXN0KTsgLy8gNS42Ci0gIHZvaWQgc2V0RGlhZ1dpZHRoKGRvdWJsZSB3aWR0aCk7ICAgICAgICAgICAgICAgICAvLyA1LjYKLSAgdm9pZCBzZXREaWFnU3BhY2luZyhkb3VibGUgc3BhY2luZyk7ICAgICAgICAgICAgIC8vIDUuNgotICB2b2lkIHNldFNwYWNpbmdNaW4oZG91YmxlIGRpc3QpOwotICB2b2lkIHNldFNwYWNpbmdOYW1lKGNvbnN0IGNoYXIqIHNwYWNpbmdOYW1lKTsgICAgLy8gZm9yIENVVCBsYXllcgotICB2b2lkIHNldFNwYWNpbmdMYXllclN0YWNrKCk7ICAgICAgICAgICAgICAgICAgICAgLy8gNS43IGZvciBDVVQgbGF5ZXIKLSAgdm9pZCBzZXRTcGFjaW5nQWRqYWNlbnQoaW50IG51bUN1dHMsIGRvdWJsZSBkaXN0YW5jZSk7ICAvLyA1LjVmb3IgQ1VUIGxheWVyCi0gIHZvaWQgc2V0U3BhY2luZ1JhbmdlKGRvdWJsZSBsZWZ0LCBkb3VibGUgcmlnaHQpOwotICB2b2lkIHNldFNwYWNpbmdSYW5nZVVzZUxlbmd0aCgpOwotICB2b2lkIHNldFNwYWNpbmdSYW5nZUluZmx1ZW5jZShkb3VibGUgaW5mTGVuZ3RoKTsKLSAgdm9pZCBzZXRTcGFjaW5nUmFuZ2VJbmZsdWVuY2VSYW5nZShkb3VibGUgbWluLCBkb3VibGUgbWF4KTsKLSAgdm9pZCBzZXRTcGFjaW5nUmFuZ2VSYW5nZShkb3VibGUgbWluLCBkb3VibGUgbWF4KTsKLSAgdm9pZCBzZXRTcGFjaW5nTGVuZ3RoKGRvdWJsZSBudW0pOwotICB2b2lkIHNldFNwYWNpbmdMZW5ndGhSYW5nZShkb3VibGUgbWluLCBkb3VibGUgbWF4KTsKLSAgdm9pZCBzZXRTcGFjaW5nQ2VudGVyVG9DZW50ZXIoKTsKLSAgdm9pZCBzZXRTcGFjaW5nUGFyYWxsZWxPdmVybGFwKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNwotICB2b2lkIHNldFNwYWNpbmdBcmVhKGRvdWJsZSBjdXRBcmVhKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIHZvaWQgc2V0U3BhY2luZ0VvbChkb3VibGUgd2lkdGgsIGRvdWJsZSB3aXRoaW4pOyAgICAgICAgICAgICAvLyA1LjcKLSAgdm9pZCBzZXRTcGFjaW5nUGFyU1coZG91YmxlIHNwYWNlLCBkb3VibGUgd2l0aGluKTsgICAgICAgICAgIC8vIDUuNwotICB2b2lkIHNldFNwYWNpbmdQYXJUd29FZGdlcygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIHZvaWQgc2V0U3BhY2luZ0FkamFjZW50RXhjZXB0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgdm9pZCBzZXRTcGFjaW5nU2FtZW5ldCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNwotICB2b2lkIHNldFNwYWNpbmdTYW1lbmV0UEdvbmx5KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIHZvaWQgc2V0U3BhY2luZ1RhYmxlT3J0aG8oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgdm9pZCBhZGRTcGFjaW5nVGFibGVPcnRob1dpdGhpbihkb3VibGUgY3V0V2l0aGluLCBkb3VibGUgb3J0aG8pOyAgLy8gNS43Ci0gIHZvaWQgc2V0TWF4RmxvYXRpbmdBcmVhKGRvdWJsZSBudW0pOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgdm9pZCBzZXRBcnJheVNwYWNpbmdMb25nQXJyYXkoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNwotICB2b2lkIHNldEFycmF5U3BhY2luZ1dpZHRoKGRvdWJsZSB2aWFXaWR0aCk7ICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIHZvaWQgc2V0QXJyYXlTcGFjaW5nQ3V0KGRvdWJsZSBjdXRTcGFjaW5nKTsgICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgdm9pZCBhZGRBcnJheVNwYWNpbmdBcnJheShpbnQgYUN1dHMsIGRvdWJsZSBhU3BhY2luZyk7ICAgICAgIC8vIDUuNwotICB2b2lkIHNldFNwYWNpbmdOb3RjaExlbmd0aChkb3VibGUgbWluTm90Y2hMZW5ndGgpOyAgICAgICAgICAgLy8gNS43Ci0gIHZvaWQgc2V0U3BhY2luZ0VuZE9mTm90Y2hXaWR0aCAoZG91YmxlIGVuZE9mTm90Y2hXaWR0aCwKLSAgICAgICAgICAgZG91YmxlIG1pbk5vdGNoU3BhY2luZywgZG91YmxlIG1pbk5vdGNoTGVuZ3RoKTsgICAgIC8vIDUuNwotICB2b2lkIHNldERpcmVjdGlvbihjb25zdCBjaGFyKiBkaXIpOwotICB2b2lkIHNldFJlc2lzdGFuY2UoZG91YmxlIG51bSk7Ci0gIHZvaWQgc2V0Q2FwYWNpdGFuY2UoZG91YmxlIG51bSk7Ci0gIHZvaWQgc2V0SGVpZ2h0KGRvdWJsZSBudW0pOwotICB2b2lkIHNldFdpcmVFeHRlbnNpb24oZG91YmxlIG51bSk7Ci0gIHZvaWQgc2V0VGhpY2tuZXNzKGRvdWJsZSBudW0pOwotICB2b2lkIHNldFNocmlua2FnZShkb3VibGUgbnVtKTsKLSAgdm9pZCBzZXRDYXBNdWx0aXBsaWVyKGRvdWJsZSBudW0pOwotICB2b2lkIHNldEVkZ2VDYXAoZG91YmxlIG51bSk7Ci0gIHZvaWQgc2V0QW50ZW5uYUFyZWEoZG91YmxlIG51bSk7Ci0gIHZvaWQgc2V0QW50ZW5uYUxlbmd0aChkb3VibGUgbnVtKTsKLSAgdm9pZCBzZXRDdXJyZW50RGVuc2l0eShkb3VibGUgbnVtKTsKLSAgdm9pZCBzZXRDdXJyZW50UG9pbnQoZG91YmxlIHdpZHRoLCBkb3VibGUgY3VycmVudCk7Ci0gIHZvaWQgc2V0UmVzaXN0YW5jZVBvaW50KGRvdWJsZSB3aWR0aCwgZG91YmxlIHJlcyk7Ci0gIHZvaWQgc2V0Q2FwYWNpdGFuY2VQb2ludChkb3VibGUgd2lkdGgsIGRvdWJsZSBjYXApOwotICB2b2lkIGFkZFByb3AoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdmFsdWUsIGNvbnN0IGNoYXIgdHlwZSk7Ci0gIHZvaWQgYWRkTnVtUHJvcChjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBkb3VibGUgZCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhbHVlLCBjb25zdCBjaGFyIHR5cGUpOwotICB2b2lkIGFkZEFjY3VycmVudERlbnNpdHkoY29uc3QgY2hhciogdHlwZSk7Ci0gIHZvaWQgc2V0QWNPbmVFbnRyeShkb3VibGUgbnVtKTsKLSAgdm9pZCBhZGRBY0ZyZXF1ZW5jeSgpOwotICB2b2lkIGFkZEFjQ3V0YXJlYSgpOwotICB2b2lkIGFkZEFjVGFibGVFbnRyeSgpOwotICB2b2lkIGFkZEFjV2lkdGgoKTsKLSAgdm9pZCBhZGREY2N1cnJlbnREZW5zaXR5KGNvbnN0IGNoYXIqIHR5cGUpOwotICB2b2lkIHNldERjT25lRW50cnkoZG91YmxlIG51bSk7Ci0gIHZvaWQgYWRkRGNUYWJsZUVudHJ5KCk7Ci0gIHZvaWQgYWRkRGNXaWR0aCgpOwotICB2b2lkIGFkZERjQ3V0YXJlYSgpOwotICB2b2lkIGFkZE51bWJlcihkb3VibGUgbnVtKTsKLSAgdm9pZCBzZXRNYXh3aWR0aChkb3VibGUgd2lkdGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS41Ci0gIHZvaWQgc2V0TWlud2lkdGgoZG91YmxlIHdpZHRoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNQotICB2b2lkIGFkZE1pbmVuY2xvc2VkYXJlYShkb3VibGUgYXJlYSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjUKLSAgdm9pZCBhZGRNaW5lbmNsb3NlZGFyZWFXaWR0aChkb3VibGUgd2lkdGgpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gNS41Ci0gIHZvaWQgYWRkTWluaW11bWN1dChpbnQgY3V0cywgZG91YmxlIHdpZHRoKTsgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNQotICB2b2lkIGFkZE1pbmltdW1jdXRXaXRoaW4oZG91YmxlIGN1dERpc3RhbmNlKTsgICAgICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgdm9pZCBhZGRNaW5pbXVtY3V0Q29ubmVjdChjb25zdCBjaGFyKiBkaXJlY3Rpb24pOyAgICAgICAgICAgICAgICAgLy8gNS41Ci0gIHZvaWQgYWRkTWluaW11bWN1dExlbmdEaXMoZG91YmxlIGxlbmd0aCwgZG91YmxlIGRpc3RhbmNlKTsgICAgICAgIC8vIDUuNQotICB2b2lkIGFkZFBhcmVsbGVsTGVuZ3RoKGRvdWJsZSBsZW5ndGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjUKLSAgdm9pZCBhZGRQYXJlbGxlbFNwYWNpbmcoZG91YmxlIHdpZHRoLCBkb3VibGUgc3BhY2luZyk7ICAgICAgICAgICAgLy8gNS41Ci0gIHZvaWQgYWRkUGFyZWxsZWxXaWR0aChkb3VibGUgd2lkdGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNQotICB2b2lkIHNldFByb3RydXNpb24oZG91YmxlIHdpZHRoLCBkb3VibGUgbGVuZ3RoLCBkb3VibGUgd2lkdGgyKTsgICAvLyA1LjUKLQotICAvLyA1LjYgLSBtaW5zdGVwIHN3aXRjaCB0byBtdWx0aXBsZSBhbmQgYWRkZWQgbW9yZSBvcHRpb25zCi0gIHZvaWQgYWRkTWluc3RlcChkb3VibGUgZGlzdGFuY2UpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNQotICB2b2lkIGFkZE1pbnN0ZXBUeXBlKGNoYXIqIHR5cGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjYKLSAgdm9pZCBhZGRNaW5zdGVwTGVuZ3Roc3VtKGRvdWJsZSBtYXhMZW5ndGgpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIHZvaWQgYWRkTWluc3RlcE1heGVkZ2VzKGludCBtYXhFZGdlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNwotICB2b2lkIGFkZE1pbnN0ZXBNaW5BZGpMZW5ndGgoZG91YmxlIG1pbkFkakxlbmd0aCk7ICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgdm9pZCBhZGRNaW5zdGVwTWluQmV0TGVuZ3RoKGRvdWJsZSBtaW5CZXRMZW5ndGgpOyAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIHZvaWQgYWRkTWluc3RlcFhTYW1lQ29ybmVycygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNwotCi0gIGludCAgZ2V0TnVtYmVyKCk7ICAgICAvLyB0aGlzIGlzIGZvciB0aGUgcGFyc2VyIGludGVybmFsIHVzZSBvbmx5Ci0KLSAgLy8gNS41IFNQQUNJTkdUQUJMRQotICB2b2lkIGFkZFNwYWNpbmdUYWJsZSgpOwotICB2b2lkIGFkZFNwUGFyYWxsZWxMZW5ndGgoKTsKLSAgdm9pZCBhZGRTcFBhcmFsbGVsV2lkdGgoZG91YmxlIHdpZHRoKTsKLSAgdm9pZCBhZGRTcFBhcmFsbGVsV2lkdGhTcGFjaW5nKCk7Ci0gIHZvaWQgc2V0SW5mbHVlbmNlKCk7Ci0gIHZvaWQgc2V0U3BUd29XaWR0aHNIYXNQUkwoaW50IGhhc1BSTCk7Ci0gIHZvaWQgYWRkU3BJbmZsdWVuY2UoZG91YmxlIHdpZHRoLCBkb3VibGUgZGlzdGFuY2UsIGRvdWJsZSBzcGFjaW5nKTsKLSAgdm9pZCBhZGRTcFR3b1dpZHRocyhkb3VibGUgd2lkdGgsIGRvdWJsZSBydW5MZW5ndGgpOyAgICAgICAgICAgICAgLy8gNS43Ci0gIAotCi0gIC8vIDUuNgotICB2b2lkIGFkZEVuY2xvc3VyZShjaGFyKiBlbmNsUnVsZSwgZG91YmxlIG92ZXJoYW5nMSwgZG91YmxlIG92ZXJoYW5nMik7Ci0gIHZvaWQgYWRkRW5jbG9zdXJlV2lkdGgoZG91YmxlIG1pbldpZHRoKTsgCi0gIHZvaWQgYWRkRW5jbG9zdXJlRXhjZXB0RUMoZG91YmxlIGN1dFdpdGhpbik7ICAgICAgIC8vIDUuNwotICB2b2lkIGFkZEVuY2xvc3VyZUxlbmd0aChkb3VibGUgbWluTGVuZ3RoKTsgICAgICAgICAvLyA1LjcKLSAgdm9pZCBhZGRFbmNsb3N1cmVFeHRyYUN1dCgpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gNS43KwotICB2b2lkIGFkZFByZWZlckVuY2xvc3VyZShjaGFyKiBlbmNsUnVsZSwgZG91YmxlIG92ZXJoYW5nMSwgZG91YmxlIG92ZXJoYW5nMik7Ci0gIHZvaWQgYWRkUHJlZmVyRW5jbG9zdXJlV2lkdGgoZG91YmxlIG1pbldpZHRoKTsgCi0gIHZvaWQgc2V0UmVzUGVyQ3V0KGRvdWJsZSB2YWx1ZSk7Ci0gIHZvaWQgc2V0RGlhZ01pbkVkZ2VMZW5ndGgoZG91YmxlIHZhbHVlKTsKLSAgdm9pZCBzZXRNaW5TaXplKGxlZmlHZW9tZXRyaWVzKiBnZW9tKTsKLQotICAvLyA1LjgKLSAgLy8gUE9MWVJPVVRJTkcsIE1JTUNBUCwgVFNWLCBQQVNTSVZBVElPTiwgTldFTEwKLSAgdm9pZCBzZXRMYXllclR5cGUoY29uc3QgY2hhciogbFR5cGUpIDsgCi0KLSAgaW50IGhhc1R5cGUoKSBjb25zdCA7Ci0gIGludCBoYXNMYXllclR5cGUoKSBjb25zdCA7ICAgICAgICAgLy8gNS44IC0gU29tZSBsYXllcnMgY2FuIGJlIGFub3RoZXIgdHlwZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgUk9VVElORyBjYW4gYmUgUE9MWVJPVVRJTkcgb3IgTUlNQ0FQCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIENVVCBjYW4gYmUgVFNWIG9yIFBBU1NJVkFUSU9OCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIE1BU1RFUlNMSUNFIGNhbiBiZSBOV0VMTAotICBpbnQgaGFzTWFzaygpIGNvbnN0IDsgICAgICAgICAgICAgIC8vIDUuOAotICBpbnQgaGFzUGl0Y2goKSBjb25zdCA7Ci0gIGludCBoYXNYWVBpdGNoKCkgY29uc3QgOyAgICAgICAgICAgLy8gNS42Ci0gIGludCBoYXNPZmZzZXQoKSBjb25zdCA7Ci0gIGludCBoYXNYWU9mZnNldCgpIGNvbnN0IDsgICAgICAgICAgLy8gNS42Ci0gIGludCBoYXNXaWR0aCgpIGNvbnN0IDsKLSAgaW50IGhhc0FyZWEoKSBjb25zdCA7Ci0gIGludCBoYXNEaWFnUGl0Y2goKSBjb25zdDsgICAgICAgICAgLy8gNS42Ci0gIGludCBoYXNYWURpYWdQaXRjaCgpIGNvbnN0OyAgICAgICAgLy8gNS42Ci0gIGludCBoYXNEaWFnV2lkdGgoKSBjb25zdDsgICAgICAgICAgLy8gNS42Ci0gIGludCBoYXNEaWFnU3BhY2luZygpIGNvbnN0OyAgICAgICAgLy8gNS42IAotICBpbnQgaGFzU3BhY2luZ051bWJlcigpIGNvbnN0IDsKLSAgaW50IGhhc1NwYWNpbmdOYW1lKGludCBpbmRleCkgY29uc3QgOwotICBpbnQgaGFzU3BhY2luZ0xheWVyU3RhY2soaW50IGluZGV4KSBjb25zdCA7ICAgICAgICAgICAgLy8gNS43Ci0gIGludCBoYXNTcGFjaW5nQWRqYWNlbnQoaW50IGluZGV4KSBjb25zdCA7Ci0gIGludCBoYXNTcGFjaW5nQ2VudGVyVG9DZW50ZXIoaW50IGluZGV4KSBjb25zdCA7Ci0gIGludCBoYXNTcGFjaW5nUmFuZ2UoaW50IGluZGV4KSBjb25zdCA7Ci0gIGludCBoYXNTcGFjaW5nUmFuZ2VVc2VMZW5ndGhUaHJlc2hvbGQoaW50IGluZGV4KSBjb25zdDsKLSAgaW50IGhhc1NwYWNpbmdSYW5nZUluZmx1ZW5jZShpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgaGFzU3BhY2luZ1JhbmdlSW5mbHVlbmNlUmFuZ2UoaW50IGluZGV4KSBjb25zdDsKLSAgaW50IGhhc1NwYWNpbmdSYW5nZVJhbmdlKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCBoYXNTcGFjaW5nTGVuZ3RoVGhyZXNob2xkKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCBoYXNTcGFjaW5nTGVuZ3RoVGhyZXNob2xkUmFuZ2UoaW50IGluZGV4KSBjb25zdDsKLSAgaW50IGhhc1NwYWNpbmdQYXJhbGxlbE92ZXJsYXAoaW50IGluZGV4KSBjb25zdDsgICAgICAgIC8vIDUuNwotICBpbnQgaGFzU3BhY2luZ0FyZWEoaW50IGluZGV4KSBjb25zdDsgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIGludCBoYXNTcGFjaW5nRW5kT2ZMaW5lKGludCBpbmRleCkgY29uc3Q7ICAgICAgICAgICAgICAvLyA1LjcKLSAgaW50IGhhc1NwYWNpbmdQYXJlbGxlbEVkZ2UoaW50IGluZGV4KSBjb25zdDsgICAgICAgICAgIC8vIDUuNwotICBpbnQgaGFzU3BhY2luZ1R3b0VkZ2VzKGludCBpbmRleCkgY29uc3Q7ICAgICAgICAgICAgICAgLy8gNS43Ci0gIGludCBoYXNTcGFjaW5nQWRqYWNlbnRFeGNlcHQoaW50IGluZGV4KSBjb25zdDsgICAgICAgICAvLyA1LjcKLSAgaW50IGhhc1NwYWNpbmdTYW1lbmV0KGludCBpbmRleCkgY29uc3Q7ICAgICAgICAgICAgICAgIC8vIDUuNwotICBpbnQgaGFzU3BhY2luZ1NhbWVuZXRQR29ubHkoaW50IGluZGV4KSBjb25zdDsgICAgICAgICAgLy8gNS43Ci0gIGludCBoYXNTcGFjaW5nTm90Y2hMZW5ndGgoaW50IGluZGV4KSBjb25zdDsgICAgICAgICAgICAvLyA1LjcKLSAgaW50IGhhc1NwYWNpbmdFbmRPZk5vdGNoV2lkdGgoaW50IGluZGV4KSBjb25zdDsgICAgICAgIC8vIDUuNwotICBpbnQgaGFzRGlyZWN0aW9uKCkgY29uc3QgOwotICBpbnQgaGFzUmVzaXN0YW5jZSgpIGNvbnN0IDsKLSAgaW50IGhhc1Jlc2lzdGFuY2VBcnJheSgpIGNvbnN0IDsKLSAgaW50IGhhc0NhcGFjaXRhbmNlKCkgY29uc3QgOwotICBpbnQgaGFzQ2FwYWNpdGFuY2VBcnJheSgpIGNvbnN0IDsKLSAgaW50IGhhc0hlaWdodCgpIGNvbnN0IDsKLSAgaW50IGhhc1RoaWNrbmVzcygpIGNvbnN0IDsKLSAgaW50IGhhc1dpcmVFeHRlbnNpb24oKSBjb25zdCA7Ci0gIGludCBoYXNTaHJpbmthZ2UoKSBjb25zdCA7Ci0gIGludCBoYXNDYXBNdWx0aXBsaWVyKCkgY29uc3QgOwotICBpbnQgaGFzRWRnZUNhcCgpIGNvbnN0IDsKLSAgaW50IGhhc0FudGVubmFMZW5ndGgoKSBjb25zdCA7Ci0gIGludCBoYXNBbnRlbm5hQXJlYSgpIGNvbnN0IDsKLSAgaW50IGhhc0N1cnJlbnREZW5zaXR5UG9pbnQoKSBjb25zdCA7Ci0gIGludCBoYXNDdXJyZW50RGVuc2l0eUFycmF5KCkgY29uc3QgOwotICBpbnQgaGFzQWNjdXJyZW50RGVuc2l0eSgpIGNvbnN0OwotICBpbnQgaGFzRGNjdXJyZW50RGVuc2l0eSgpIGNvbnN0OwotCi0gIGludCBudW1Qcm9wcygpIGNvbnN0OwotICBjb25zdCBjaGFyKiAgcHJvcE5hbWUoaW50IGluZGV4KSBjb25zdDsKLSAgY29uc3QgY2hhciogIHByb3BWYWx1ZShpbnQgaW5kZXgpIGNvbnN0OwotICBkb3VibGUgcHJvcE51bWJlcihpbnQgaW5kZXgpIGNvbnN0OwotICBjb25zdCBjaGFyICAgcHJvcFR5cGUoaW50IGluZGV4KSBjb25zdDsKLSAgaW50ICAgIHByb3BJc051bWJlcihpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgICAgcHJvcElzU3RyaW5nKGludCBpbmRleCkgY29uc3Q7Ci0KLSAgaW50IG51bVNwYWNpbmcoKSBjb25zdDsKLQotICBjaGFyKiBuYW1lKCkgY29uc3QgOwotICBjb25zdCBjaGFyKiB0eXBlKCkgY29uc3QgOwotICBjb25zdCBjaGFyKiBsYXllclR5cGUoKSBjb25zdCA7ICAgICAgICAgICAvLyA1LjgKLSAgZG91YmxlIHBpdGNoKCkgY29uc3QgOwotICBpbnQgICAgbWFzaygpIGNvbnN0OyAgICAgICAgICAgICAgICAgICAgICAvLyA1LjgKLSAgZG91YmxlIHBpdGNoWCgpIGNvbnN0IDsgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIGRvdWJsZSBwaXRjaFkoKSBjb25zdCA7ICAgICAgICAgICAgICAgICAgIC8vIDUuNgotICBkb3VibGUgb2Zmc2V0KCkgY29uc3QgOwotICBkb3VibGUgb2Zmc2V0WCgpIGNvbnN0IDsgICAgICAgICAgICAgICAgICAvLyA1LjYKLSAgZG91YmxlIG9mZnNldFkoKSBjb25zdCA7ICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIGRvdWJsZSB3aWR0aCgpIGNvbnN0IDsKLSAgZG91YmxlIGFyZWEoKSBjb25zdCA7Ci0gIGRvdWJsZSBkaWFnUGl0Y2goKSBjb25zdCA7ICAgICAgICAgICAgICAgIC8vIDUuNgotICBkb3VibGUgZGlhZ1BpdGNoWCgpIGNvbnN0IDsgICAgICAgICAgICAgICAvLyA1LjYKLSAgZG91YmxlIGRpYWdQaXRjaFkoKSBjb25zdCA7ICAgICAgICAgICAgICAgLy8gNS42Ci0gIGRvdWJsZSBkaWFnV2lkdGgoKSBjb25zdCA7ICAgICAgICAgICAgICAgIC8vIDUuNiAKLSAgZG91YmxlIGRpYWdTcGFjaW5nKCkgY29uc3QgOyAgICAgICAgICAgICAgLy8gNS42IAotICBkb3VibGUgc3BhY2luZyhpbnQgaW5kZXgpIGNvbnN0IDsKLSAgY2hhciogIHNwYWNpbmdOYW1lKGludCBpbmRleCkgY29uc3QgOyAgICAgLy8gZm9yIENVVCBsYXllcgotICBpbnQgICAgc3BhY2luZ0FkamFjZW50Q3V0cyhpbnQgaW5kZXgpIGNvbnN0IDsgICAvLyA1LjUgLSBmb3IgQ1VUIGxheWVyCi0gIGRvdWJsZSBzcGFjaW5nQWRqYWNlbnRXaXRoaW4oaW50IGluZGV4KSBjb25zdCA7IC8vIDUuNSAtIGZvciBDVVQgbGF5ZXIKLSAgZG91YmxlIHNwYWNpbmdBcmVhKGludCBpbmRleCkgY29uc3Q7ICAgICAgICAgICAgLy8gNS43IC0gZm9yIENVVCBsYXllcgotICBkb3VibGUgc3BhY2luZ1JhbmdlTWluKGludCBpbmRleCkgY29uc3QgOwotICBkb3VibGUgc3BhY2luZ1JhbmdlTWF4KGludCBpbmRleCkgY29uc3QgOwotICBkb3VibGUgc3BhY2luZ1JhbmdlSW5mbHVlbmNlKGludCBpbmRleCkgY29uc3QgOwotICBkb3VibGUgc3BhY2luZ1JhbmdlSW5mbHVlbmNlTWluKGludCBpbmRleCkgY29uc3QgOwotICBkb3VibGUgc3BhY2luZ1JhbmdlSW5mbHVlbmNlTWF4KGludCBpbmRleCkgY29uc3QgOwotICBkb3VibGUgc3BhY2luZ1JhbmdlUmFuZ2VNaW4oaW50IGluZGV4KSBjb25zdCA7Ci0gIGRvdWJsZSBzcGFjaW5nUmFuZ2VSYW5nZU1heChpbnQgaW5kZXgpIGNvbnN0IDsKLSAgZG91YmxlIHNwYWNpbmdMZW5ndGhUaHJlc2hvbGQoaW50IGluZGV4KSBjb25zdDsKLSAgZG91YmxlIHNwYWNpbmdMZW5ndGhUaHJlc2hvbGRSYW5nZU1pbihpbnQgaW5kZXgpIGNvbnN0OwotICBkb3VibGUgc3BhY2luZ0xlbmd0aFRocmVzaG9sZFJhbmdlTWF4KGludCBpbmRleCkgY29uc3Q7Ci0KLSAgLy8gNS43IFNwYWNpbmcgZW5kb2ZsaW5lCi0gIGRvdWJsZSBzcGFjaW5nRW9sV2lkdGgoaW50IGluZGV4KSBjb25zdDsKLSAgZG91YmxlIHNwYWNpbmdFb2xXaXRoaW4oaW50IGluZGV4KSBjb25zdDsKLSAgZG91YmxlIHNwYWNpbmdQYXJTcGFjZShpbnQgaW5kZXgpIGNvbnN0OwotICBkb3VibGUgc3BhY2luZ1BhcldpdGhpbihpbnQgaW5kZXgpIGNvbnN0OwotCi0gIC8vIDUuNyBTcGFjaW5nIE5vdGNoCi0gIGRvdWJsZSBzcGFjaW5nTm90Y2hMZW5ndGgoaW50IGluZGV4KSBjb25zdDsKLSAgZG91YmxlIHNwYWNpbmdFbmRPZk5vdGNoV2lkdGgoaW50IGluZGV4KSBjb25zdDsKLSAgZG91YmxlIHNwYWNpbmdFbmRPZk5vdGNoU3BhY2luZyhpbnQgaW5kZXgpIGNvbnN0OwotICBkb3VibGUgc3BhY2luZ0VuZE9mTm90Y2hMZW5ndGgoaW50IGluZGV4KSBjb25zdDsKLQotICAvLyA1LjUgTWluaW11bSBjdXQgcnVsZXMKLSAgaW50ICAgIG51bU1pbmltdW1jdXQoKSBjb25zdDsKLSAgaW50ICAgIG1pbmltdW1jdXQoaW50IGluZGV4KSBjb25zdDsKLSAgZG91YmxlIG1pbmltdW1jdXRXaWR0aChpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgICAgaGFzTWluaW11bWN1dFdpdGhpbihpbnQgaW5kZXgpIGNvbnN0OyAgICAgICAgICAvLyA1LjcKLSAgZG91YmxlIG1pbmltdW1jdXRXaXRoaW4oaW50IGluZGV4KSBjb25zdDsgICAgICAgICAgICAgLy8gNS43Ci0gIGludCAgICBoYXNNaW5pbXVtY3V0Q29ubmVjdGlvbihpbnQgaW5kZXgpIGNvbnN0OyAgICAgIC8vIEZST01BQk9WRXxGUk9NQkVMT1cKLSAgY29uc3QgIGNoYXIqIG1pbmltdW1jdXRDb25uZWN0aW9uKGludCBpbmRleCkgY29uc3Q7ICAgLy8gRlJPTUFCT1ZFfEZST01CRUxPVwotICBpbnQgICAgaGFzTWluaW11bWN1dE51bUN1dHMoaW50IGluZGV4KSBjb25zdDsKLSAgZG91YmxlIG1pbmltdW1jdXRMZW5ndGgoaW50IGluZGV4KSBjb25zdDsKLSAgZG91YmxlIG1pbmltdW1jdXREaXN0YW5jZShpbnQgaW5kZXgpIGNvbnN0OwotCi0gIGNvbnN0IGNoYXIqIGRpcmVjdGlvbigpIGNvbnN0IDsKLSAgZG91YmxlIHJlc2lzdGFuY2UoKSBjb25zdCA7Ci0gIGRvdWJsZSBjYXBhY2l0YW5jZSgpIGNvbnN0IDsKLSAgZG91YmxlIGhlaWdodCgpIGNvbnN0IDsKLSAgZG91YmxlIHdpcmVFeHRlbnNpb24oKSBjb25zdCA7Ci0gIGRvdWJsZSB0aGlja25lc3MoKSBjb25zdCA7Ci0gIGRvdWJsZSBzaHJpbmthZ2UoKSBjb25zdCA7Ci0gIGRvdWJsZSBjYXBNdWx0aXBsaWVyKCkgY29uc3QgOwotICBkb3VibGUgZWRnZUNhcCgpIGNvbnN0IDsKLSAgZG91YmxlIGFudGVubmFMZW5ndGgoKSBjb25zdCA7Ci0gIGRvdWJsZSBhbnRlbm5hQXJlYSgpIGNvbnN0IDsKLSAgZG91YmxlIGN1cnJlbnREZW5zaXR5UG9pbnQoKSBjb25zdCA7Ci0gIHZvaWQgY3VycmVudERlbnNpdHlBcnJheShpbnQqIG51bVBvaW50cywKLSAgICAgICBkb3VibGUqKiB3aWR0aHMsIGRvdWJsZSoqIGN1cnJlbnQpIGNvbnN0IDsKLSAgdm9pZCBjYXBhY2l0YW5jZUFycmF5KGludCogbnVtUG9pbnRzLAotICAgICAgIGRvdWJsZSoqIHdpZHRocywgZG91YmxlKiogcmVzVmFsdWVzKSBjb25zdCA7Ci0gIHZvaWQgcmVzaXN0YW5jZUFycmF5KGludCogbnVtUG9pbnRzLAotICAgICAgIGRvdWJsZSoqIHdpZHRocywgZG91YmxlKiogY2FwVmFsdWVzKSBjb25zdCA7Ci0KLSAgaW50IG51bUFjY3VycmVudERlbnNpdHkoKSBjb25zdDsKLSAgbGVmaUxheWVyRGVuc2l0eSogYWNjdXJyZW50KGludCBpbmRleCkgY29uc3Q7Ci0gIGludCBudW1EY2N1cnJlbnREZW5zaXR5KCkgY29uc3Q7Ci0gIGxlZmlMYXllckRlbnNpdHkqIGRjY3VycmVudChpbnQgaW5kZXgpIGNvbnN0OwotCi0gIC8vIDMvMjMvMjAwMCAtIFdhbmRhIGRhIFJvc2EuICBUaGUgZm9sbG93aW5nIGFyZSBmb3IgNS40IEFudGVubmEuCi0gIC8vICAgICAgICAgICAgIE9ubHkgNS40IG9yIDUuMyBhcmUgYWxsb3dlZCBpbiBhIGxlZiBmaWxlLCBidXQgbm90IGJvdGgKLSAgdm9pZCBzZXRBbnRlbm5hQXJlYVJhdGlvKGRvdWJsZSB2YWx1ZSk7Ci0gIHZvaWQgc2V0QW50ZW5uYUN1bUFyZWFSYXRpbyhkb3VibGUgdmFsdWUpOwotICB2b2lkIHNldEFudGVubmFBcmVhRmFjdG9yKGRvdWJsZSB2YWx1ZSk7Ci0gIHZvaWQgc2V0QW50ZW5uYVNpZGVBcmVhUmF0aW8oZG91YmxlIHZhbHVlKTsKLSAgdm9pZCBzZXRBbnRlbm5hQ3VtU2lkZUFyZWFSYXRpbyhkb3VibGUgdmFsdWUpOwotICB2b2lkIHNldEFudGVubmFTaWRlQXJlYUZhY3Rvcihkb3VibGUgdmFsdWUpOwotICB2b2lkIHNldEFudGVubmFWYWx1ZShsZWZpQW50ZW5uYUVudW0gYW50ZW5uYVR5cGUsIGRvdWJsZSB2YWx1ZSk7Ci0gIHZvaWQgc2V0QW50ZW5uYURVTyhsZWZpQW50ZW5uYUVudW0gYW50ZW5uYVR5cGUpOwotICB2b2lkIHNldEFudGVubmFQV0wobGVmaUFudGVubmFFbnVtIGFudGVubmFUeXBlLCBsZWZpQW50ZW5uYVBXTCogcHdsKTsKLSAgdm9pZCBzZXRBbnRlbm5hQ3VtUm91dGluZ1BsdXNDdXQoKTsgICAgICAgICAgICAgLy8gNS43Ci0gIHZvaWQgc2V0QW50ZW5uYUdhdGVQbHVzRGlmZihkb3VibGUgdmFsdWUpOyAgICAgIC8vIDUuNwotICB2b2lkIHNldEFudGVubmFBcmVhTWludXNEaWZmKGRvdWJsZSB2YWx1ZSk7ICAgICAvLyA1LjcKLSAgdm9pZCBhZGRBbnRlbm5hTW9kZWwgKGludCBhT3hpZGUpOyAgLy8gNS41Ci0KLSAgLy8gNS41Ci0gIGludCBudW1BbnRlbm5hTW9kZWwoKSBjb25zdDsKLSAgbGVmaUFudGVubmFNb2RlbCogYW50ZW5uYU1vZGVsKGludCBpbmRleCkgY29uc3Q7Ci0KLSAgLy8gVGhlIGZvbGxvd2luZyBpcyA4LzIxLzAxIDUuNCBlbmhhbmNlbWVudHMgCi0gIHZvaWQgc2V0U2xvdFdpcmVXaWR0aChkb3VibGUgbnVtKTsKLSAgdm9pZCBzZXRTbG90V2lyZUxlbmd0aChkb3VibGUgbnVtKTsKLSAgdm9pZCBzZXRTbG90V2lkdGgoZG91YmxlIG51bSk7Ci0gIHZvaWQgc2V0U2xvdExlbmd0aChkb3VibGUgbnVtKTsKLSAgdm9pZCBzZXRNYXhBZGphY2VudFNsb3RTcGFjaW5nKGRvdWJsZSBudW0pOwotICB2b2lkIHNldE1heENvYXhpYWxTbG90U3BhY2luZyhkb3VibGUgbnVtKTsKLSAgdm9pZCBzZXRNYXhFZGdlU2xvdFNwYWNpbmcoZG91YmxlIG51bSk7Ci0gIHZvaWQgc2V0U3BsaXRXaXJlV2lkdGgoZG91YmxlIG51bSk7Ci0gIHZvaWQgc2V0TWluaW11bURlbnNpdHkoZG91YmxlIG51bSk7Ci0gIHZvaWQgc2V0TWF4aW11bURlbnNpdHkoZG91YmxlIG51bSk7Ci0gIHZvaWQgc2V0RGVuc2l0eUNoZWNrV2luZG93KGRvdWJsZSBsZW5ndGgsIGRvdWJsZSB3aWR0aCk7Ci0gIHZvaWQgc2V0RGVuc2l0eUNoZWNrU3RlcChkb3VibGUgbnVtKTsKLSAgdm9pZCBzZXRGaWxsQWN0aXZlU3BhY2luZyhkb3VibGUgbnVtKTsKLQotICBpbnQgaGFzU2xvdFdpcmVXaWR0aCgpIGNvbnN0OwotICBpbnQgaGFzU2xvdFdpcmVMZW5ndGgoKSBjb25zdDsKLSAgaW50IGhhc1Nsb3RXaWR0aCgpIGNvbnN0OwotICBpbnQgaGFzU2xvdExlbmd0aCgpIGNvbnN0OwotICBpbnQgaGFzTWF4QWRqYWNlbnRTbG90U3BhY2luZygpIGNvbnN0OwotICBpbnQgaGFzTWF4Q29heGlhbFNsb3RTcGFjaW5nKCkgY29uc3Q7Ci0gIGludCBoYXNNYXhFZGdlU2xvdFNwYWNpbmcoKSBjb25zdDsKLSAgaW50IGhhc1NwbGl0V2lyZVdpZHRoKCkgY29uc3Q7Ci0gIGludCBoYXNNaW5pbXVtRGVuc2l0eSgpIGNvbnN0OwotICBpbnQgaGFzTWF4aW11bURlbnNpdHkoKSBjb25zdDsKLSAgaW50IGhhc0RlbnNpdHlDaGVja1dpbmRvdygpIGNvbnN0OwotICBpbnQgaGFzRGVuc2l0eUNoZWNrU3RlcCgpIGNvbnN0OwotICBpbnQgaGFzRmlsbEFjdGl2ZVNwYWNpbmcoKSBjb25zdDsKLSAgaW50IGhhc01heHdpZHRoKCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgICAgLy8gNS41Ci0gIGludCBoYXNNaW53aWR0aCgpIGNvbnN0OyAgICAgICAgICAgICAgICAgICAgIC8vIDUuNQotICBpbnQgaGFzTWluc3RlcCgpIGNvbnN0OyAgICAgICAgICAgICAgICAgICAgICAvLyA1LjUKLSAgaW50IGhhc1Byb3RydXNpb24oKSBjb25zdDsgICAgICAgICAgICAgICAgICAgLy8gNS41Ci0KLSAgZG91YmxlIHNsb3RXaXJlV2lkdGgoKSBjb25zdDsKLSAgZG91YmxlIHNsb3RXaXJlTGVuZ3RoKCkgY29uc3Q7Ci0gIGRvdWJsZSBzbG90V2lkdGgoKSBjb25zdDsKLSAgZG91YmxlIHNsb3RMZW5ndGgoKSBjb25zdDsKLSAgZG91YmxlIG1heEFkamFjZW50U2xvdFNwYWNpbmcoKSBjb25zdDsKLSAgZG91YmxlIG1heENvYXhpYWxTbG90U3BhY2luZygpIGNvbnN0OwotICBkb3VibGUgbWF4RWRnZVNsb3RTcGFjaW5nKCkgY29uc3Q7Ci0gIGRvdWJsZSBzcGxpdFdpcmVXaWR0aCgpIGNvbnN0OwotICBkb3VibGUgbWluaW11bURlbnNpdHkoKSBjb25zdDsKLSAgZG91YmxlIG1heGltdW1EZW5zaXR5KCkgY29uc3Q7Ci0gIGRvdWJsZSBkZW5zaXR5Q2hlY2tXaW5kb3dMZW5ndGgoKSBjb25zdDsKLSAgZG91YmxlIGRlbnNpdHlDaGVja1dpbmRvd1dpZHRoKCkgY29uc3Q7Ci0gIGRvdWJsZSBkZW5zaXR5Q2hlY2tTdGVwKCkgY29uc3Q7Ci0gIGRvdWJsZSBmaWxsQWN0aXZlU3BhY2luZygpIGNvbnN0OwotICBkb3VibGUgbWF4d2lkdGgoKSBjb25zdDsgICAgICAgICAgICAgICAgICAgICAvLyA1LjUKLSAgZG91YmxlIG1pbndpZHRoKCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgICAgLy8gNS41Ci0gIGRvdWJsZSBwcm90cnVzaW9uV2lkdGgxKCkgY29uc3Q7ICAgICAgICAgICAgIC8vIDUuNQotICBkb3VibGUgcHJvdHJ1c2lvbkxlbmd0aCgpIGNvbnN0OyAgICAgICAgICAgICAvLyA1LjUKLSAgZG91YmxlIHByb3RydXNpb25XaWR0aDIoKSBjb25zdDsgICAgICAgICAgICAgLy8gNS41Ci0KLSAgaW50ICAgIG51bU1pbnN0ZXAoKSBjb25zdDsgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIGRvdWJsZSBtaW5zdGVwKGludCBpbmRleCkgY29uc3Q7ICAgICAgICAgICAgIC8vIDUuNSwgNS42IHN3aXRjaCB0byBtdWx0aXBsZQotICBpbnQgICAgaGFzTWluc3RlcFR5cGUoaW50IGluZGV4KSBjb25zdDsgICAgICAvLyA1LjYKLSAgY2hhciogIG1pbnN0ZXBUeXBlKGludCBpbmRleCkgY29uc3Q7ICAgICAgICAgLy8gNS42Ci0gIGludCAgICBoYXNNaW5zdGVwTGVuZ3Roc3VtKGludCBpbmRleCkgY29uc3Q7IC8vIDUuNgotICBkb3VibGUgbWluc3RlcExlbmd0aHN1bShpbnQgaW5kZXgpIGNvbnN0OyAgICAvLyA1LjYKLSAgaW50ICAgIGhhc01pbnN0ZXBNYXhlZGdlcyhpbnQgaW5kZXgpIGNvbnN0OyAgLy8gNS43Ci0gIGludCAgICBtaW5zdGVwTWF4ZWRnZXMoaW50IGluZGV4KSBjb25zdDsgICAgIC8vIDUuNwotICBpbnQgICAgaGFzTWluc3RlcE1pbkFkakxlbmd0aChpbnQgaW5kZXgpIGNvbnN0OyAgLy8gNS43Ci0gIGRvdWJsZSBtaW5zdGVwTWluQWRqTGVuZ3RoKGludCBpbmRleCkgY29uc3Q7ICAgICAvLyA1LjcKLSAgaW50ICAgIGhhc01pbnN0ZXBNaW5CZXRMZW5ndGgoaW50IGluZGV4KSBjb25zdDsgIC8vIDUuNwotICBkb3VibGUgbWluc3RlcE1pbkJldExlbmd0aChpbnQgaW5kZXgpIGNvbnN0OyAgICAgLy8gNS43Ci0gIGludCAgICBoYXNNaW5zdGVwWFNhbWVDb3JuZXJzKGludCBpbmRleCkgY29uc3Q7ICAvLyA1LjcKLQotICAvLyA1LjUgTUlORU5DTE9TRURBUkVBCi0gIGludCAgICBudW1NaW5lbmNsb3NlZGFyZWEoKSBjb25zdDsKLSAgZG91YmxlIG1pbmVuY2xvc2VkYXJlYShpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgICAgaGFzTWluZW5jbG9zZWRhcmVhV2lkdGgoaW50IGluZGV4KSBjb25zdDsKLSAgZG91YmxlIG1pbmVuY2xvc2VkYXJlYVdpZHRoKGludCBpbmRleCkgY29uc3Q7Ci0KLSAgLy8gNS41IFNQQUNJTkdUQUJMRSBGT1IgTEFZRVIgUk9VVElORwotICBpbnQgICAgICAgICAgICAgICBudW1TcGFjaW5nVGFibGUoKTsKLSAgbGVmaVNwYWNpbmdUYWJsZSogc3BhY2luZ1RhYmxlKGludCBpbmRleCk7Ci0KLSAgLy8gNS42IEVOQ0xPU1VSRSwgUFJFRkVSRU5DTE9TVVJFLCBSRVNJU1RBTkNFUEVSQ1VUICYgRElBR01JTkVER0VMRU5HVEgKLSAgaW50ICAgIG51bUVuY2xvc3VyZSgpIGNvbnN0OwotICBpbnQgICAgaGFzRW5jbG9zdXJlUnVsZShpbnQgaW5kZXgpIGNvbnN0OwotICBjaGFyKiAgZW5jbG9zdXJlUnVsZShpbnQgaW5kZXgpIDsKLSAgZG91YmxlIGVuY2xvc3VyZU92ZXJoYW5nMShpbnQgaW5kZXgpIGNvbnN0OwotICBkb3VibGUgZW5jbG9zdXJlT3ZlcmhhbmcyKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCAgICBoYXNFbmNsb3N1cmVXaWR0aChpbnQgaW5kZXgpIGNvbnN0OwotICBkb3VibGUgZW5jbG9zdXJlTWluV2lkdGgoaW50IGluZGV4KSBjb25zdDsKLSAgaW50ICAgIGhhc0VuY2xvc3VyZUV4Y2VwdEV4dHJhQ3V0KGludCBpbmRleCkgY29uc3Q7ICAgIC8vIDUuNwotICBkb3VibGUgZW5jbG9zdXJlRXhjZXB0RXh0cmFDdXQoaW50IGluZGV4KSBjb25zdDsgICAgICAgLy8gNS43Ci0gIGludCAgICBoYXNFbmNsb3N1cmVNaW5MZW5ndGgoaW50IGluZGV4KSBjb25zdDsgICAgICAgICAvLyA1LjcKLSAgZG91YmxlIGVuY2xvc3VyZU1pbkxlbmd0aChpbnQgaW5kZXgpIGNvbnN0OyAgICAgICAgICAgIC8vIDUuNwotICBpbnQgICAgbnVtUHJlZmVyRW5jbG9zdXJlKCkgY29uc3Q7Ci0gIGludCAgICBoYXNQcmVmZXJFbmNsb3N1cmVSdWxlKGludCBpbmRleCkgY29uc3Q7Ci0gIGNoYXIqICBwcmVmZXJFbmNsb3N1cmVSdWxlKGludCBpbmRleCkgOwotICBkb3VibGUgcHJlZmVyRW5jbG9zdXJlT3ZlcmhhbmcxKGludCBpbmRleCkgY29uc3Q7Ci0gIGRvdWJsZSBwcmVmZXJFbmNsb3N1cmVPdmVyaGFuZzIoaW50IGluZGV4KSBjb25zdDsKLSAgaW50ICAgIGhhc1ByZWZlckVuY2xvc3VyZVdpZHRoKGludCBpbmRleCkgY29uc3Q7Ci0gIGRvdWJsZSBwcmVmZXJFbmNsb3N1cmVNaW5XaWR0aChpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgICAgaGFzUmVzaXN0YW5jZVBlckN1dCgpIGNvbnN0OwotICBkb3VibGUgcmVzaXN0YW5jZVBlckN1dCgpIGNvbnN0OwotICBpbnQgICAgaGFzRGlhZ01pbkVkZ2VMZW5ndGgoKSBjb25zdDsKLSAgZG91YmxlIGRpYWdNaW5FZGdlTGVuZ3RoKCkgY29uc3Q7Ci0gIGludCAgICBudW1NaW5TaXplKCkgY29uc3Q7Ci0gIGRvdWJsZSBtaW5TaXplV2lkdGgoaW50IGluZGV4KSBjb25zdDsKLSAgZG91YmxlIG1pblNpemVMZW5ndGgoaW50IGluZGV4KSBjb25zdDsKLQotICAvLyA1LjcKLSAgaW50ICAgIGhhc01heEZsb2F0aW5nQXJlYSgpIGNvbnN0OyAKLSAgZG91YmxlIG1heEZsb2F0aW5nQXJlYSgpIGNvbnN0OwotICBpbnQgICAgaGFzQXJyYXlTcGFjaW5nKCkgY29uc3Q7Ci0gIGludCAgICBoYXNMb25nQXJyYXkoKSBjb25zdDsKLSAgaW50ICAgIGhhc1ZpYVdpZHRoKCkgY29uc3Q7Ci0gIGRvdWJsZSB2aWFXaWR0aCgpIGNvbnN0OwotICBkb3VibGUgY3V0U3BhY2luZygpIGNvbnN0OwotICBpbnQgICAgbnVtQXJyYXlDdXRzKCkgY29uc3Q7Ci0gIGludCAgICBhcnJheUN1dHMoaW50IGluZGV4KSBjb25zdDsKLSAgZG91YmxlIGFycmF5U3BhY2luZyhpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgICAgaGFzU3BhY2luZ1RhYmxlT3J0aG8oKSBjb25zdDsgLy8gU1BBQ0lOR1RBQkxFIE9SVEhPR09OQUwgRk9SIExBWUVSIENVVAotICBsZWZpT3J0aG9nb25hbCAqb3J0aG9nb25hbCgpIGNvbnN0OwotCi0gIHZvaWQgcGFyc2U2NW5tUnVsZXMoKTsgICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgdm9pZCBwYXJzZUxFRjU4TGF5ZXIoKTsgICAgICAgICAgICAgICAgIC8vIDUuOAotICBpbnQgIG5lZWQ1OFByb3BzUHJvY2Vzc2luZygpIGNvbnN0OyAgICAgLy8gNS44Ci0KLSAgLy8gRGVidWcgcHJpbnQKLSAgdm9pZCBwcmludChGSUxFKiBmKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgdm9pZCBwYXJzZVNwYWNpbmcoaW50IGluZGV4KTsKLSAgdm9pZCBwYXJzZU1heEZsb2F0aW5nKGludCBpbmRleCk7Ci0gIHZvaWQgcGFyc2VBcnJheVNwYWNpbmcoaW50IGluZGV4KTsKLSAgdm9pZCBwYXJzZU1pbnN0ZXAoaW50IGluZGV4KTsKLSAgdm9pZCBwYXJzZUFudGVubmFDdW1Sb3V0aW5nKGludCBpbmRleCk7Ci0gIHZvaWQgcGFyc2VBbnRlbm5hR2F0ZVBsdXMoaW50IGluZGV4KTsKLSAgdm9pZCBwYXJzZUFudGVubmFBcmVhTWludXMoaW50IGluZGV4KTsKLSAgdm9pZCBwYXJzZUFudGVubmFBcmVhRGlmZihpbnQgaW5kZXgpOwotCi0gIHZvaWQgcGFyc2VMYXllclR5cGUoaW50IGluZGV4KTsgICAgICAgICAvLyA1LjgKLSAgdm9pZCBwYXJzZUxheWVyRW5jbG9zdXJlKGludCBpbmRleCk7ICAgIC8vIDUuOAotICB2b2lkIHBhcnNlTGF5ZXJXaWR0aFRhYmxlKGludCBpbmR4ZSk7ICAgLy8gNS44Ci0KLXByb3RlY3RlZDoKLSAgY2hhciogbmFtZV87Ci0gIGludCBuYW1lU2l6ZV87Ci0gIGNoYXIqIHR5cGVfOwotICBpbnQgdHlwZVNpemVfOwotICBjaGFyKiBsYXllclR5cGVfOyAgIC8vIDUuOCAtIFBPTFlST1VUSU5HLCBNSU1DQVAsIFRTViwgUEFTU0lWQVRJT04sIE5XRUxMCi0KLSAgaW50IGhhc1BpdGNoXzsKLSAgaW50IGhhc01hc2tfOyAgICAgICAgICAgICAgICAgICAgICAgLy8gNS44IG5hdGl2ZQotICBpbnQgaGFzT2Zmc2V0XzsKLSAgaW50IGhhc1dpZHRoXzsgICAgICAgICAgICAKLSAgaW50IGhhc0FyZWFfOwotICBpbnQgaGFzU3BhY2luZ187Ci0gIGludCBoYXNEaWFnUGl0Y2hfOyAgICAgICAgICAgICAgICAgIC8vIDUuNgotICBpbnQgaGFzRGlhZ1dpZHRoXzsgICAgICAgICAgICAgICAgICAvLyA1LjYKLSAgaW50IGhhc0RpYWdTcGFjaW5nXzsgICAgICAgICAgICAgICAgLy8gNS42Ci0gIGludCogaGFzU3BhY2luZ05hbWVfOyAgICAgICAgICAgICAgIC8vIDUuNQotICBpbnQqIGhhc1NwYWNpbmdMYXllclN0YWNrXzsgICAgICAgICAvLyA1LjcKLSAgaW50KiBoYXNTcGFjaW5nQWRqYWNlbnRfOyAgICAgICAgICAgLy8gNS41Ci0gIGludCogaGFzU3BhY2luZ1JhbmdlXzsgICAgICAgICAgICAgIC8vIHBjciA0MDkzMzQKLSAgaW50KiBoYXNTcGFjaW5nVXNlTGVuZ3RoVGhyZXNob2xkXzsgLy8gcGNyIDI4Mjc5OSwgZHVlIHRvIG11bHQuIHNwYWNpbmcgYWxsb3cKLSAgaW50KiBoYXNTcGFjaW5nTGVuZ3RoVGhyZXNob2xkXzsgICAgLy8gcGNyIDQwOTMzNAotICBpbnQqIGhhc1NwYWNpbmdDZW50ZXJUb0NlbnRlcl87ICAgICAvLyA1LjYKLSAgaW50KiBoYXNTcGFjaW5nUGFyYWxsZWxPdmVybGFwXzsgICAgLy8gNS43Ci0gIGludCogaGFzU3BhY2luZ0N1dEFyZWFfOyAgICAgICAgICAgIC8vIDUuNwotICBpbnQqIGhhc1NwYWNpbmdFbmRPZkxpbmVfOyAgICAgICAgICAvLyA1LjcKLSAgaW50KiBoYXNTcGFjaW5nUGFyZWxsZWxFZGdlXzsgICAgICAgLy8gNS43Ci0gIGludCogaGFzU3BhY2luZ1R3b0VkZ2VzXzsgICAgICAgICAgIC8vIDUuNwotICBpbnQqIGhhc1NwYWNpbmdBZGphY2VudEV4Y2VwdF87ICAgICAvLyA1LjcKLSAgaW50KiBoYXNTcGFjaW5nU2FtZW5ldF87ICAgICAgICAgICAgLy8gNS43Ci0gIGludCogaGFzU3BhY2luZ1NhbWVuZXRQR29ubHlfOyAgICAgIC8vIDUuNwotICBpbnQgaGFzQXJyYXlTcGFjaW5nXzsgICAgICAgICAgICAgICAvLyA1LjcKLSAgaW50IGhhc0RpcmVjdGlvbl87Ci0gIGludCBoYXNSZXNpc3RhbmNlXzsKLSAgaW50IGhhc0NhcGFjaXRhbmNlXzsKLSAgaW50IGhhc0hlaWdodF87Ci0gIGludCBoYXNXaXJlRXh0ZW5zaW9uXzsKLSAgaW50IGhhc1RoaWNrbmVzc187Ci0gIGludCBoYXNTaHJpbmthZ2VfOwotICBpbnQgaGFzQ2FwTXVsdGlwbGllcl87Ci0gIGludCBoYXNFZGdlQ2FwXzsKLSAgaW50IGhhc0FudGVubmFBcmVhXzsKLSAgaW50IGhhc0FudGVubmFMZW5ndGhfOwotICBpbnQgaGFzQ3VycmVudERlbnNpdHlQb2ludF87Ci0KLSAgZG91YmxlIGN1cnJlbnREZW5zaXR5XzsKLSAgZG91YmxlIHBpdGNoWF87ICAgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIGRvdWJsZSBwaXRjaFlfOyAgICAgICAgICAgICAgICAgICAgIC8vIDUuNgotICBkb3VibGUgb2Zmc2V0WF87ICAgICAgICAgICAgICAgICAgICAvLyA1LjYKLSAgZG91YmxlIG9mZnNldFlfOyAgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIGRvdWJsZSBkaWFnUGl0Y2hYXzsgICAgICAgICAgICAgICAgIC8vIDUuNgotICBkb3VibGUgZGlhZ1BpdGNoWV87ICAgICAgICAgICAgICAgICAvLyA1LjYKLSAgZG91YmxlIGRpYWdXaWR0aF87ICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIGRvdWJsZSBkaWFnU3BhY2luZ187ICAgICAgICAgICAgICAgIC8vIDUuNgotICBkb3VibGUgd2lkdGhfOwotICBkb3VibGUgYXJlYV87Ci0gIGRvdWJsZSB3aXJlRXh0ZW5zaW9uXzsKLSAgaW50IG51bVNwYWNpbmdzXzsKLSAgaW50IHNwYWNpbmdzQWxsb2NhdGVkXzsKLSAgaW50IG1hc2tOdW1iZXJfOyAgICAgICAgICAgICAgICAgICAgIC8vIDUuOAotICBkb3VibGUqIHNwYWNpbmdfOyAgICAgICAgICAvLyBmb3IgQ3V0ICYgcm91dGluZyBMYXllciwgc3BhY2luZyBpcyBtdWx0aXBsZQotICBjaGFyKiogIHNwYWNpbmdOYW1lXzsKLSAgaW50KiAgICBzcGFjaW5nQWRqYWNlbnRDdXRzXzsgICAgLy8gNS41Ci0gIGRvdWJsZSogc3BhY2luZ0FkamFjZW50V2l0aGluXzsgIC8vIDUuNQotICBkb3VibGUqIHNwYWNpbmdDdXRBcmVhXzsgICAgICAgICAvLyA1LjcKLSAgZG91YmxlKiByYW5nZU1pbl87ICAgICAgICAgLy8gcGNyIDI4Mjc5OSAmIDQwODkzMCwgZHVlIHRvIG11bHQgc3BhY2luZyBhbGxvdwotICBkb3VibGUqIHJhbmdlTWF4XzsgICAgICAgICAvLyBwY3IgMjgyNzk5ICYgNDA4OTMwLCBkdWUgdG8gbXVsdCBzcGFjaW5nIGFsbG93Ci0gIGRvdWJsZSogcmFuZ2VJbmZsdWVuY2VfOyAgIC8vIHBjciAyODI3OTkgJiA0MDg5MzAsIGR1ZSB0byBtdWx0IHNwYWNpbmcgYWxsb3cKLSAgZG91YmxlKiByYW5nZUluZmx1ZW5jZVJhbmdlTWluXzsgICAgICAgICAgLy8gcGNyIDM4ODE4MyAmIDQwODkzMAotICBkb3VibGUqIHJhbmdlSW5mbHVlbmNlUmFuZ2VNYXhfOyAgICAgICAgICAvLyBwY3IgMzg4MTgzICYgNDA4OTMwCi0gIGRvdWJsZSogcmFuZ2VSYW5nZU1pbl87ICAgICAgICAgICAgICAgICAgIC8vIHBjciA0MDg5MzAKLSAgZG91YmxlKiByYW5nZVJhbmdlTWF4XzsgICAgICAgICAgICAgICAgICAgLy8gcGNyIDQwODkzMAotICBkb3VibGUqIGxlbmd0aFRocmVzaG9sZF87ICAgICAgICAgICAgICAgICAvLyBwY3IgNDA4OTMwCi0gIGRvdWJsZSogbGVuZ3RoVGhyZXNob2xkUmFuZ2VNaW5fOyAgICAgICAgIC8vIHBjciA0MDg5MzAKLSAgZG91YmxlKiBsZW5ndGhUaHJlc2hvbGRSYW5nZU1heF87ICAgICAgICAgLy8gcGNyIDQwODkzMAotCi0gIC8vIDUuNQotICBpbnQgICAgIG51bU1pbmltdW1jdXRfOwotICBpbnQgICAgIG1pbmltdW1jdXRBbGxvY2F0ZWRfOwotICBpbnQqICAgIG1pbmltdW1jdXRfOyAgICAgICAgICAgICAgICAgICAgICAgLy8gcGNyIDQwOTMzNAotICBkb3VibGUqIG1pbmltdW1jdXRXaWR0aF87ICAgICAgICAgICAgICAgICAgLy8gcGNyIDQwOTMzNAotICBpbnQqICAgIGhhc01pbmltdW1jdXRXaXRoaW5fOyAgICAgICAgICAgICAgLy8gNS43Ci0gIGRvdWJsZSogbWluaW11bWN1dFdpdGhpbl87ICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgaW50KiAgICBoYXNNaW5pbXVtY3V0Q29ubmVjdGlvbl87Ci0gIGNoYXIqKiAgbWluaW11bWN1dENvbm5lY3Rpb25fOwotICBpbnQqICAgIGhhc01pbmltdW1jdXROdW1DdXRzXzsKLSAgZG91YmxlKiBtaW5pbXVtY3V0TGVuZ3RoXzsKLSAgZG91YmxlKiBtaW5pbXVtY3V0RGlzdGFuY2VfOwotCi0gIGRvdWJsZSAgbWF4d2lkdGhfOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS41Ci0gIGRvdWJsZSAgbWlud2lkdGhfOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS41Ci0gIGludCAgICAgbnVtTWluZW5jbG9zZWRhcmVhXzsgICAgICAgICAgICAgICAgLy8gNS41Ci0gIGludCAgICAgbWluZW5jbG9zZWRhcmVhQWxsb2NhdGVkXzsgICAgICAgICAgLy8gNS41Ci0gIGRvdWJsZSogbWluZW5jbG9zZWRhcmVhXzsgICAgICAgICAgICAgICAgICAgLy8gNS41Ci0gIGRvdWJsZSogbWluZW5jbG9zZWRhcmVhV2lkdGhfOyAgICAgICAgICAgICAgLy8gNS41Ci0gIGRvdWJsZSAgcHJvdHJ1c2lvbldpZHRoMV87ICAgICAgICAgICAgICAgICAgLy8gNS41Ci0gIGRvdWJsZSAgcHJvdHJ1c2lvbkxlbmd0aF87ICAgICAgICAgICAgICAgICAgLy8gNS41Ci0gIGRvdWJsZSAgcHJvdHJ1c2lvbldpZHRoMl87ICAgICAgICAgICAgICAgICAgLy8gNS41Ci0KLSAgaW50ICAgICBudW1NaW5zdGVwXzsgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjYKLSAgaW50ICAgICBudW1NaW5zdGVwQWxsb2NfOyAgICAgICAgICAgICAgICAgICAvLyA1LjYKLSAgZG91YmxlKiBtaW5zdGVwXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjYsIHN3aXRjaCB0byBtdWx0aXBsZQotICBjaGFyKiogIG1pbnN0ZXBUeXBlXzsgICAgICAgICAgICAgICAgICAgICAgIC8vIElOU0lERUNPUk5FUnxPVVRTSURFQ09STkVSfFNURVAKLSAgZG91YmxlKiBtaW5zdGVwTGVuZ3Roc3VtXzsgCi0gIGludCogICAgbWluc3RlcE1heEVkZ2VzXzsgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIGRvdWJsZSogbWluc3RlcE1pbkFkakxlbmd0aF87ICAgICAgICAgICAgICAgLy8gNS43Ci0gIGRvdWJsZSogbWluc3RlcE1pbkJldExlbmd0aF87ICAgICAgICAgICAgICAgLy8gNS43Ci0gIGludCogICAgbWluc3RlcFhTYW1lQ29ybmVyc187ICAgICAgICAgICAgICAgLy8gNS43Ci0KLSAgY2hhciogIGRpcmVjdGlvbl87Ci0gIGRvdWJsZSByZXNpc3RhbmNlXzsKLSAgZG91YmxlIGNhcGFjaXRhbmNlXzsKLSAgZG91YmxlIGhlaWdodF87Ci0gIGRvdWJsZSB0aGlja25lc3NfOwotICBkb3VibGUgc2hyaW5rYWdlXzsKLSAgZG91YmxlIGNhcE11bHRpcGxpZXJfOwotICBkb3VibGUgZWRnZUNhcF87Ci0gIGRvdWJsZSBhbnRlbm5hQXJlYV87Ci0gIGRvdWJsZSBhbnRlbm5hTGVuZ3RoXzsKLQotICBpbnQgbnVtQ3VycmVudFBvaW50c187Ci0gIGludCBjdXJyZW50UG9pbnRzQWxsb2NhdGVkXzsKLSAgZG91YmxlKiBjdXJyZW50V2lkdGhzXzsKLSAgZG91YmxlKiBjdXJyZW50XzsKLQotICBpbnQgbnVtQ2FwYWNpdGFuY2VQb2ludHNfOwotICBpbnQgY2FwYWNpdGFuY2VQb2ludHNBbGxvY2F0ZWRfOwotICBkb3VibGUqIGNhcGFjaXRhbmNlV2lkdGhzXzsKLSAgZG91YmxlKiBjYXBhY2l0YW5jZXNfOwotCi0gIGludCBudW1SZXNpc3RhbmNlUG9pbnRzXzsKLSAgaW50IHJlc2lzdGFuY2VQb2ludHNBbGxvY2F0ZWRfOwotICBkb3VibGUqIHJlc2lzdGFuY2VXaWR0aHNfOwotICBkb3VibGUqIHJlc2lzdGFuY2VzXzsKLQotICBpbnQgbnVtUHJvcHNfOwotICBpbnQgcHJvcHNBbGxvY2F0ZWRfOwotICBjaGFyKiogIG5hbWVzXzsKLSAgY2hhcioqICB2YWx1ZXNfOwotICBkb3VibGUqIGR2YWx1ZXNfOwotICBjaGFyKiAgIHR5cGVzXzsgICAgICAgICAgICAgICAgICAgICAvLyBJOiBpbnRlZ2VyLCBSOiByZWFsLCBTOnN0cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBROiBxdW90ZWRzdHJpbmcKLSAgaW50IG51bUFjY3VycmVudHNfOyAgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIEFDQ1VSUkVOVERFTlNJVFkKLSAgaW50IGFjY3VycmVudEFsbG9jYXRlZF87Ci0gIGxlZmlMYXllckRlbnNpdHkqKiBhY2N1cnJlbnRzXzsKLSAgaW50IG51bURjY3VycmVudHNfOyAgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIERDQ1VSUkVOVERFTlNJVFkKLSAgaW50IGRjY3VycmVudEFsbG9jYXRlZF87Ci0gIGxlZmlMYXllckRlbnNpdHkqKiBkY2N1cnJlbnRzXzsKLSAgaW50IG51bU51bXNfOwotICBpbnQgbnVtQWxsb2NhdGVkXzsKLSAgZG91YmxlKiBudW1zXzsKLQotICAvLyAzLzIzLzIwMDAgLSBXYW5kYSBkYSBSb3NhLiAgVGhlIGZvbGxvd2luZyBpcyBmb3IgNS40IEFOVEVOTkEuCi0gIC8vICAgICAgICAgICAgIEVpdGhlciA1LjQgb3IgNS4zIGFyZSBhbGxvd2VkLCBub3QgYm90aAotICBpbnQgaGFzQW50ZW5uYUFyZWFSYXRpb187Ci0gIGludCBoYXNBbnRlbm5hRGlmZkFyZWFSYXRpb187Ci0gIGludCBoYXNBbnRlbm5hRGlmZkFyZWFSYXRpb1BXTF87Ci0gIGludCBoYXNBbnRlbm5hQ3VtQXJlYVJhdGlvXzsKLSAgaW50IGhhc0FudGVubmFDdW1EaWZmQXJlYVJhdGlvXzsKLSAgaW50IGhhc0FudGVubmFDdW1EaWZmQXJlYVJhdGlvUFdMXzsKLSAgaW50IGhhc0FudGVubmFBcmVhRmFjdG9yXzsKLSAgaW50IGhhc0FudGVubmFBcmVhRmFjdG9yRFVPXzsKLSAgaW50IGhhc0FudGVubmFTaWRlQXJlYVJhdGlvXzsKLSAgaW50IGhhc0FudGVubmFEaWZmU2lkZUFyZWFSYXRpb187Ci0gIGludCBoYXNBbnRlbm5hRGlmZlNpZGVBcmVhUmF0aW9QV0xfOwotICBpbnQgaGFzQW50ZW5uYUN1bVNpZGVBcmVhUmF0aW9fOwotICBpbnQgaGFzQW50ZW5uYUN1bURpZmZTaWRlQXJlYVJhdGlvXzsKLSAgaW50IGhhc0FudGVubmFDdW1EaWZmU2lkZUFyZWFSYXRpb1BXTF87Ci0gIGludCBoYXNBbnRlbm5hU2lkZUFyZWFGYWN0b3JfOwotICBpbnQgaGFzQW50ZW5uYVNpZGVBcmVhRmFjdG9yRFVPXzsKLQotICAvLyA1LjUgQW50ZW5uYU1vZGVsCi0gIGxlZmlBbnRlbm5hTW9kZWwqIGN1cnJlbnRBbnRlbm5hTW9kZWxfOwotICBpbnQgbnVtQW50ZW5uYU1vZGVsXzsKLSAgaW50IGFudGVubmFNb2RlbEFsbG9jYXRlZF87Ci0gIGxlZmlBbnRlbm5hTW9kZWwqKiBhbnRlbm5hTW9kZWxfOwotCi0gIC8vIDgvMjkvMjAwMSAtIFdhbmRhIGRhIFJvc2EuICBUaGUgZm9sbG93aW5nIGlzIGZvciA1LjQgZW5oYW5jZW1lbnRzLgotICBpbnQgaGFzU2xvdFdpcmVXaWR0aF87Ci0gIGludCBoYXNTbG90V2lyZUxlbmd0aF87Ci0gIGludCBoYXNTbG90V2lkdGhfOwotICBpbnQgaGFzU2xvdExlbmd0aF87Ci0gIGludCBoYXNNYXhBZGphY2VudFNsb3RTcGFjaW5nXzsKLSAgaW50IGhhc01heENvYXhpYWxTbG90U3BhY2luZ187Ci0gIGludCBoYXNNYXhFZGdlU2xvdFNwYWNpbmdfOwotICBpbnQgaGFzU3BsaXRXaXJlV2lkdGhfOwotICBpbnQgaGFzTWluaW11bURlbnNpdHlfOwotICBpbnQgaGFzTWF4aW11bURlbnNpdHlfOwotICBpbnQgaGFzRGVuc2l0eUNoZWNrV2luZG93XzsKLSAgaW50IGhhc0RlbnNpdHlDaGVja1N0ZXBfOwotICBpbnQgaGFzRmlsbEFjdGl2ZVNwYWNpbmdfOwotICBpbnQgaGFzVHdvV2lkdGhQUkxfOwotCi0gIGRvdWJsZSBzbG90V2lyZVdpZHRoXzsgCi0gIGRvdWJsZSBzbG90V2lyZUxlbmd0aF87IAotICBkb3VibGUgc2xvdFdpZHRoXzsgCi0gIGRvdWJsZSBzbG90TGVuZ3RoXzsgCi0gIGRvdWJsZSBtYXhBZGphY2VudFNsb3RTcGFjaW5nXzsgCi0gIGRvdWJsZSBtYXhDb2F4aWFsU2xvdFNwYWNpbmdfOyAKLSAgZG91YmxlIG1heEVkZ2VTbG90U3BhY2luZ187IAotICBkb3VibGUgc3BsaXRXaXJlV2lkdGhfOyAKLSAgZG91YmxlIG1pbmltdW1EZW5zaXR5XzsgCi0gIGRvdWJsZSBtYXhpbXVtRGVuc2l0eV87IAotICBkb3VibGUgZGVuc2l0eUNoZWNrV2luZG93TGVuZ3RoXzsgCi0gIGRvdWJsZSBkZW5zaXR5Q2hlY2tXaW5kb3dXaWR0aF87IAotICBkb3VibGUgZGVuc2l0eUNoZWNrU3RlcF87IAotICBkb3VibGUgZmlsbEFjdGl2ZVNwYWNpbmdfOyAKLQotICAvLyA1LjUgU1BBQ0lOR1RBQkxFCi0gIGludCBudW1TcGFjaW5nVGFibGVfOwotICBpbnQgc3BhY2luZ1RhYmxlQWxsb2NhdGVkXzsKLSAgbGVmaVNwYWNpbmdUYWJsZSoqIHNwYWNpbmdUYWJsZV87Ci0KLSAgLy8gNS42Ci0gIGludCBudW1FbmNsb3N1cmVfOwotICBpbnQgZW5jbG9zdXJlQWxsb2NhdGVkXzsKLSAgY2hhcioqIGVuY2xvc3VyZVJ1bGVzXzsKLSAgZG91YmxlKiBvdmVyaGFuZzFfOwotICBkb3VibGUqIG92ZXJoYW5nMl87Ci0gIGRvdWJsZSogZW5jbWluV2lkdGhfOwotICBkb3VibGUqIGN1dFdpdGhpbl87Ci0gIGRvdWJsZSogbWluTGVuZ3RoXzsKLSAgaW50IG51bVByZWZlckVuY2xvc3VyZV87Ci0gIGludCBwcmVmZXJFbmNsb3N1cmVBbGxvY2F0ZWRfOwotICBjaGFyKiogcHJlZmVyRW5jbG9zdXJlUnVsZXNfOwotICBkb3VibGUqIHByZWZlck92ZXJoYW5nMV87Ci0gIGRvdWJsZSogcHJlZmVyT3ZlcmhhbmcyXzsKLSAgZG91YmxlKiBwcmVmZXJNaW5XaWR0aF87Ci0gIGRvdWJsZSAgcmVzUGVyQ3V0XzsKLSAgZG91YmxlICBkaWFnTWluRWRnZUxlbmd0aF87Ci0gIGludCBudW1NaW5TaXplXzsKLSAgZG91YmxlKiBtaW5TaXplV2lkdGhfOwotICBkb3VibGUqIG1pblNpemVMZW5ndGhfOwotCi0gIC8vIDUuNwotICBkb3VibGUqIGVvbFdpZHRoXzsKLSAgZG91YmxlKiBlb2xXaXRoaW5fOwotICBkb3VibGUqIHBhclNwYWNlXzsKLSAgZG91YmxlKiBwYXJXaXRoaW5fOwotICBkb3VibGUgIG1heEFyZWFfOwotICBpbnQgICAgIGhhc0xvbmdBcnJheV87Ci0gIGRvdWJsZSAgdmlhV2lkdGhfOwotICBkb3VibGUgIGN1dFNwYWNpbmdfOwotICBpbnQgICAgIG51bUFycmF5Q3V0c187Ci0gIGludCAgICAgYXJyYXlDdXRzQWxsb2NhdGVkXzsKLSAgaW50KiAgICBhcnJheUN1dHNfOwotICBkb3VibGUqIGFycmF5U3BhY2luZ3NfOwotICBpbnQgICAgIGhhc1NwYWNpbmdUYWJsZU9ydGhvXzsKLSAgbGVmaU9ydGhvZ29uYWwqIHNwYWNpbmdUYWJsZU9ydGhvXzsKLSAgZG91YmxlKiBub3RjaExlbmd0aF87Ci0gIGRvdWJsZSogZW5kT2ZOb3RjaFdpZHRoXzsKLSAgZG91YmxlKiBtaW5Ob3RjaFNwYWNpbmdfOwotICBkb3VibGUqIGVvbm90Y2hMZW5ndGhfOwotCi0gIGludCAgICAgbGVmNThXaWR0aFRhYmxlT3J0aG9WYWx1ZXNfOwotICBpbnQgICAgIGxlZjU4V2lkdGhUYWJsZVdyb25nRGlyVmFsdWVzXzsKLSAgZG91YmxlKiBsZWY1OFdpZHRoVGFibGVPcnRob187Ci0gIGRvdWJsZSogbGVmNThXaWR0aFRhYmxlV3JvbmdEaXJfOwotfTsKLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLVVTRV9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaU1hY3JvLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaU1hY3JvLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FkMWI2MS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlNYWNyby5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0Nzg5ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTIgLSAyMDE3LCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgImxleC5oIgotI2luY2x1ZGUgImxlZmlNYWNyby5ocHAiCi0jaW5jbHVkZSAibGVmaU1pc2MuaHBwIgotI2luY2x1ZGUgImxlZmlEZWJ1Zy5ocHAiCi0jaW5jbHVkZSAibGVmaVV0aWwuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gbGVmaU9ic3RydWN0aW9uCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1sZWZpT2JzdHJ1Y3Rpb246OmxlZmlPYnN0cnVjdGlvbigpCi06IGdlb21ldHJpZXNfKE5VTEwpCi17Ci0gICAgSW5pdCgpOwotfQotCi12b2lkCi1sZWZpT2JzdHJ1Y3Rpb246OkluaXQoKQotewotICAgIGdlb21ldHJpZXNfID0gMDsKLX0KLQotbGVmaU9ic3RydWN0aW9uOjp+bGVmaU9ic3RydWN0aW9uKCkKLXsKLSAgICBEZXN0cm95KCk7Ci19Ci0KLXZvaWQKLWxlZmlPYnN0cnVjdGlvbjo6RGVzdHJveSgpCi17Ci0gICAgY2xlYXIoKTsKLX0KLQotdm9pZAotbGVmaU9ic3RydWN0aW9uOjpjbGVhcigpCi17Ci0gICAgaWYgKGdlb21ldHJpZXNfKSB7Ci0gICAgICAgIGdlb21ldHJpZXNfLT5EZXN0cm95KCk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoZ2VvbWV0cmllc18pKTsKLSAgICB9Ci0gICAgZ2VvbWV0cmllc18gPSAwOwotfQotCi12b2lkCi1sZWZpT2JzdHJ1Y3Rpb246OnNldEdlb21ldHJpZXMobGVmaUdlb21ldHJpZXMgKmcpCi17Ci0gICAgY2xlYXIoKTsKLSAgICBnZW9tZXRyaWVzXyA9IGc7Ci19Ci0KLWxlZmlHZW9tZXRyaWVzICoKLWxlZmlPYnN0cnVjdGlvbjo6Z2VvbWV0cmllcygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdlb21ldHJpZXNfOwotfQotCi12b2lkCi1sZWZpT2JzdHJ1Y3Rpb246OnByaW50KEZJTEUgKmYpIGNvbnN0Ci17Ci0gICAgbGVmaUdlb21ldHJpZXMgKmc7Ci0KLSAgICBmcHJpbnRmKGYsICIgIE9ic3RydWN0aW9uXG4iKTsKLQotICAgIGcgPSBnZW9tZXRyaWVzXzsKLSAgICBnLT5wcmludChmKTsKLQotfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gbGVmaURlbnNpdHkKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLWxlZmlEZW5zaXR5OjpsZWZpRGVuc2l0eSgpCi06IG51bUxheWVyc18oMCksCi0gIGxheWVyc0FsbG9jYXRlZF8oMCksCi0gIGxheWVyTmFtZV8oTlVMTCksCi0gIG51bVJlY3RzXyhOVUxMKSwKLSAgcmVjdHNBbGxvY2F0ZWRfKE5VTEwpLAotICByZWN0c18oTlVMTCksCi0gIGRlbnNpdHlWYWx1ZV8oTlVMTCkKLXsKLSAgICBJbml0KCk7Ci19Ci0KLXZvaWQKLWxlZmlEZW5zaXR5OjpJbml0KCkKLXsKLSAgICBudW1MYXllcnNfID0gMDsKLSAgICBsYXllcnNBbGxvY2F0ZWRfID0gMDsKLX0KLQotbGVmaURlbnNpdHk6On5sZWZpRGVuc2l0eSgpCi17Ci0gICAgRGVzdHJveSgpOwotfQotCi12b2lkCi1sZWZpRGVuc2l0eTo6RGVzdHJveSgpCi17Ci0gICAgY2xlYXIoKTsKLX0KLQotdm9pZAotbGVmaURlbnNpdHk6OmNsZWFyKCkKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUxheWVyc187IGkrKykgewotICAgICAgICBsZWZGcmVlKGxheWVyTmFtZV9baV0pOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgcmVjdHNfW2ldKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIGRlbnNpdHlWYWx1ZV9baV0pOwotICAgICAgICBudW1SZWN0c19baV0gPSAwOwotICAgICAgICByZWN0c0FsbG9jYXRlZF9baV0gPSAwOwotICAgIH0KLSAgICBsZWZGcmVlKGxheWVyTmFtZV8pOwotICAgIGxlZkZyZWUoKGNoYXIqKSAocmVjdHNfKSk7Ci0gICAgbGVmRnJlZSgoY2hhciopIChkZW5zaXR5VmFsdWVfKSk7Ci0gICAgbGVmRnJlZSgoY2hhciopIChudW1SZWN0c18pKTsKLSAgICBsZWZGcmVlKChjaGFyKikgKHJlY3RzQWxsb2NhdGVkXykpOwotICAgIGxheWVyTmFtZV8gPSAwOwotICAgIG51bUxheWVyc18gPSAwOwotICAgIGxheWVyc0FsbG9jYXRlZF8gPSAwOwotICAgIG51bVJlY3RzXyA9IDA7Ci0gICAgcmVjdHNfID0gMDsKLSAgICBkZW5zaXR5VmFsdWVfID0gMDsKLSAgICByZWN0c0FsbG9jYXRlZF8gPSAwOwotfQotCi12b2lkCi1sZWZpRGVuc2l0eTo6YWRkTGF5ZXIoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBpZiAobnVtTGF5ZXJzXyA9PSBsYXllcnNBbGxvY2F0ZWRfKSB7Ci0gICAgICAgIGludCAgICAgICAgICAgICBpOwotICAgICAgICBjaGFyICAgICAgICAgICAgKipsbjsgICAgICAgICAgICAgICAgICAgLy8gbGF5ZXJOYW1lCi0gICAgICAgIGludCAgICAgICAgICAgICAqbnI7ICAgICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiByZWN0IHdpdGhpbiB0aGUgbGF5ZXIKLSAgICAgICAgaW50ICAgICAgICAgICAgICpyYTsgICAgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIHJlY3QgYWxsb2NhdGVkIHdpdGhpbiB0aGUgbGF5ZXIKLSAgICAgICAgbGVmaUdlb21SZWN0ICAgICoqcnM7ICAgIC8vIHJlY3QgdmFsdWUKLSAgICAgICAgZG91YmxlICAgICAgICAgICoqZHY7ICAgICAgICAgICAvLyBkZW5zaXR5IHZhbHVlCi0KLSAgICAgICAgbGF5ZXJzQWxsb2NhdGVkXyA9IChsYXllcnNBbGxvY2F0ZWRfID09IDApID8KLSAgICAgICAgICAgIDIgOiBsYXllcnNBbGxvY2F0ZWRfICogMjsKLSAgICAgICAgbG4gPSAoY2hhcioqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIqKSAqIGxheWVyc0FsbG9jYXRlZF8pOwotICAgICAgICBuciA9IChpbnQqKSBsZWZNYWxsb2Moc2l6ZW9mKGludCkgKiBsYXllcnNBbGxvY2F0ZWRfKTsKLSAgICAgICAgcmEgPSAoaW50KikgbGVmTWFsbG9jKHNpemVvZihpbnQpICogbGF5ZXJzQWxsb2NhdGVkXyk7Ci0gICAgICAgIHJzID0gKGxlZmlHZW9tUmVjdCoqKSBsZWZNYWxsb2Moc2l6ZW9mKGxlZmlHZW9tUmVjdCopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBsYXllcnNBbGxvY2F0ZWRfKTsKLSAgICAgICAgZHYgPSAoZG91YmxlKiopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKikgKiBsYXllcnNBbGxvY2F0ZWRfKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUxheWVyc187IGkrKykgewotICAgICAgICAgICAgbG5baV0gPSBsYXllck5hbWVfW2ldOwotICAgICAgICAgICAgbnJbaV0gPSBudW1SZWN0c19baV07Ci0gICAgICAgICAgICByYVtpXSA9IHJlY3RzQWxsb2NhdGVkX1tpXTsKLSAgICAgICAgICAgIHJzW2ldID0gcmVjdHNfW2ldOwotICAgICAgICAgICAgZHZbaV0gPSBkZW5zaXR5VmFsdWVfW2ldOwotICAgICAgICB9Ci0KLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChsYXllck5hbWVfKSk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAocmVjdHNfKSk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoZGVuc2l0eVZhbHVlXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKG51bVJlY3RzXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHJlY3RzQWxsb2NhdGVkXykpOwotCi0gICAgICAgIGxheWVyTmFtZV8gPSBsbjsKLSAgICAgICAgbnVtUmVjdHNfID0gbnI7Ci0gICAgICAgIHJlY3RzQWxsb2NhdGVkXyA9IHJhOwotICAgICAgICByZWN0c18gPSByczsKLSAgICAgICAgZGVuc2l0eVZhbHVlXyA9IGR2OwotICAgIH0KLSAgICBsYXllck5hbWVfW251bUxheWVyc19dID0gc3RyZHVwKG5hbWUpOwotICAgIG51bVJlY3RzX1tudW1MYXllcnNfXSA9IDA7Ci0gICAgcmVjdHNBbGxvY2F0ZWRfW251bUxheWVyc19dID0gMDsKLSAgICByZWN0c19bbnVtTGF5ZXJzX10gPSAwOwotICAgIGRlbnNpdHlWYWx1ZV9bbnVtTGF5ZXJzX10gPSAwOwotICAgIG51bUxheWVyc18gKz0gMTsKLX0KLQotdm9pZAotbGVmaURlbnNpdHk6OmFkZFJlY3QoZG91YmxlIHgxLAotICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHkxLAotICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHgyLAotICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHkyLAotICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbHVlKQotewotICAgIGlmIChudW1SZWN0c19bbnVtTGF5ZXJzXyAtIDFdID09Ci0gICAgICAgIHJlY3RzQWxsb2NhdGVkX1tudW1MYXllcnNfIC0gMV0pIHsKLQotICAgICAgICBsZWZpR2VvbVJlY3QgICAgKnJzLCAqb3JzOwotICAgICAgICBkb3VibGUgICAgICAgICAgKmR2LCAqb2R2OwotICAgICAgICBpbnQgICAgICAgICAgICAgaTsKLQotICAgICAgICByZWN0c0FsbG9jYXRlZF9bbnVtTGF5ZXJzXyAtIDFdID0KLSAgICAgICAgICAgIChyZWN0c0FsbG9jYXRlZF9bbnVtTGF5ZXJzXyAtIDFdID09IDApID8KLSAgICAgICAgICAgIDIgOiByZWN0c0FsbG9jYXRlZF9bbnVtTGF5ZXJzXyAtIDFdICogMjsKLQotICAgICAgICBycyA9IChsZWZpR2VvbVJlY3QqKSBsZWZNYWxsb2Moc2l6ZW9mKGxlZmlHZW9tUmVjdCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdHNBbGxvY2F0ZWRfW251bUxheWVyc18gLSAxXSk7Ci0gICAgICAgIGR2ID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0c0FsbG9jYXRlZF9bbnVtTGF5ZXJzXyAtIDFdKTsKLQotICAgICAgICBpZiAobnVtUmVjdHNfW251bUxheWVyc18gLSAxXSA+IDApIHsKLSAgICAgICAgICAgIG9ycyA9IHJlY3RzX1tudW1MYXllcnNfIC0gMV07Ci0gICAgICAgICAgICBvZHYgPSBkZW5zaXR5VmFsdWVfW251bUxheWVyc18gLSAxXTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1SZWN0c19bbnVtTGF5ZXJzXyAtIDFdOyBpKyspIHsKLSAgICAgICAgICAgICAgICByc1tpXSA9IG9yc1tpXTsgICAgLy8gYXNzaWduIGRhdGEgZnJvbSBvbGQgcmVjdCAmIGRlbnNpdHkgdmFsdWUgdG8KLSAgICAgICAgICAgICAgICBkdltpXSA9IG9kdltpXTsgICAgLy8gbmV3LCBsYXJnZXIgYXJyYXkKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIHJlY3RzX1tudW1MYXllcnNfIC0gMV0pOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIGRlbnNpdHlWYWx1ZV9bbnVtTGF5ZXJzXyAtIDFdKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlY3RzX1tudW1MYXllcnNfIC0gMV0gPSByczsKLSAgICAgICAgZGVuc2l0eVZhbHVlX1tudW1MYXllcnNfIC0gMV0gPSBkdjsKLSAgICB9Ci0KLSAgICBsZWZpR2VvbVJlY3QgcDsKLQotICAgIHAueGwgPSB4MTsKLSAgICBwLnlsID0geTE7Ci0gICAgcC54aCA9IHgyOwotICAgIHAueWggPSB5MjsKLSAgICBwLmNvbG9yTWFzayA9IDA7Ci0KLSAgICByZWN0c19bbnVtTGF5ZXJzXyAtIDFdW251bVJlY3RzX1tudW1MYXllcnNfIC0gMV1dID0gcDsKLSAgICBkZW5zaXR5VmFsdWVfW251bUxheWVyc18gLSAxXVtudW1SZWN0c19bbnVtTGF5ZXJzXyAtIDFdXSA9IHZhbHVlOwotICAgIG51bVJlY3RzX1tudW1MYXllcnNfIC0gMV0gKz0gMTsKLX0KLQotaW50Ci1sZWZpRGVuc2l0eTo6bnVtTGF5ZXIoKSBjb25zdAotewotICAgIHJldHVybiBudW1MYXllcnNfOwotfQotCi1jaGFyICoKLWxlZmlEZW5zaXR5OjpsYXllck5hbWUoaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiBsYXllck5hbWVfW2luZGV4XTsKLX0KLQotaW50Ci1sZWZpRGVuc2l0eTo6bnVtUmVjdHMoaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiBudW1SZWN0c19baW5kZXhdOwotfQotCi1sZWZpR2VvbVJlY3QKLWxlZmlEZW5zaXR5OjpnZXRSZWN0KGludCAgICBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgIGludCAgICByZWN0SW5kZXgpIGNvbnN0Ci17Ci0gICAgbGVmaUdlb21SZWN0ICpyczsKLQotICAgIHJzID0gcmVjdHNfW2luZGV4XTsKLSAgICByZXR1cm4gcnNbcmVjdEluZGV4XTsKLX0KLQotZG91YmxlCi1sZWZpRGVuc2l0eTo6ZGVuc2l0eVZhbHVlKGludCAgIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICByZWN0SW5kZXgpIGNvbnN0Ci17Ci0gICAgZG91YmxlICpkdjsKLQotICAgIGR2ID0gZGVuc2l0eVZhbHVlX1tpbmRleF07Ci0gICAgcmV0dXJuIGR2W3JlY3RJbmRleF07Ci19Ci0KLXZvaWQKLWxlZmlEZW5zaXR5OjpwcmludChGSUxFICpmKSBjb25zdAotewotICAgIGludCBpLCBqOwotCi0gICAgLy8gMTEvOC8yMDA0IC0gQWRkZWQgZmVlZCBiYWNrIGZyb20gdXNlcnMKLSAgICBmcHJpbnRmKGYsICIgIERFTlNJVFlcbiIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1MYXllcnNfOyBpKyspIHsKLSAgICAgICAgZnByaW50ZihmLCAiICAgIExBWUVSICVzXG4iLCBsYXllck5hbWVfW2ldKTsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bVJlY3RzX1tpXTsgaisrKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKGYsICIgICAgICBSRUNUICVnICVnICVnICVnICIsIHJlY3RzX1tpXVtqXS54bCwKLSAgICAgICAgICAgICAgICAgICAgcmVjdHNfW2ldW2pdLnlsLCByZWN0c19baV1bal0ueGgsCi0gICAgICAgICAgICAgICAgICAgIHJlY3RzX1tpXVtqXS55aCk7Ci0gICAgICAgICAgICBmcHJpbnRmKGYsICIlZ1xuIiwgZGVuc2l0eVZhbHVlX1tpXVtqXSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBsZWZpUGluQW50ZW5uYU1vZGVsCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1sZWZpUGluQW50ZW5uYU1vZGVsOjpsZWZpUGluQW50ZW5uYU1vZGVsKCkKLTogb3hpZGVfKE5VTEwpLAotICBoYXNSZXR1cm5fKDApLAotICBudW1BbnRlbm5hR2F0ZUFyZWFfKDApLAotICBhbnRlbm5hR2F0ZUFyZWFBbGxvY2F0ZWRfKDApLAotICBhbnRlbm5hR2F0ZUFyZWFfKE5VTEwpLAotICBhbnRlbm5hR2F0ZUFyZWFMYXllcl8oTlVMTCksCi0gIG51bUFudGVubmFNYXhBcmVhQ2FyXygwKSwKLSAgYW50ZW5uYU1heEFyZWFDYXJBbGxvY2F0ZWRfKDApLAotICBhbnRlbm5hTWF4QXJlYUNhcl8oTlVMTCksCi0gIGFudGVubmFNYXhBcmVhQ2FyTGF5ZXJfKE5VTEwpLAotICBudW1BbnRlbm5hTWF4U2lkZUFyZWFDYXJfKDApLAotICBhbnRlbm5hTWF4U2lkZUFyZWFDYXJBbGxvY2F0ZWRfKDApLAotICBhbnRlbm5hTWF4U2lkZUFyZWFDYXJfKE5VTEwpLAotICBhbnRlbm5hTWF4U2lkZUFyZWFDYXJMYXllcl8oTlVMTCksCi0gIG51bUFudGVubmFNYXhDdXRDYXJfKDApLAotICBhbnRlbm5hTWF4Q3V0Q2FyQWxsb2NhdGVkXygwKSwKLSAgYW50ZW5uYU1heEN1dENhcl8oTlVMTCksCi0gIGFudGVubmFNYXhDdXRDYXJMYXllcl8oTlVMTCkKLXsKLSAgICBJbml0KCk7Ci19Ci0KLXZvaWQKLWxlZmlQaW5BbnRlbm5hTW9kZWw6OkluaXQoKQotewotICAgIG51bUFudGVubmFHYXRlQXJlYV8gPSAwOwotICAgIGFudGVubmFHYXRlQXJlYUFsbG9jYXRlZF8gPSAxOwotICAgIGFudGVubmFHYXRlQXJlYV8gPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpKTsKLSAgICBhbnRlbm5hR2F0ZUFyZWFMYXllcl8gPSAoY2hhcioqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIqKSk7Ci0KLSAgICBudW1BbnRlbm5hTWF4QXJlYUNhcl8gPSAwOwotICAgIGFudGVubmFNYXhBcmVhQ2FyQWxsb2NhdGVkXyA9IDE7Ci0gICAgYW50ZW5uYU1heEFyZWFDYXJfID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSk7Ci0gICAgYW50ZW5uYU1heEFyZWFDYXJMYXllcl8gPSAoY2hhcioqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIqKSk7Ci0KLSAgICBudW1BbnRlbm5hTWF4U2lkZUFyZWFDYXJfID0gMDsKLSAgICBhbnRlbm5hTWF4U2lkZUFyZWFDYXJBbGxvY2F0ZWRfID0gMTsKLSAgICBhbnRlbm5hTWF4U2lkZUFyZWFDYXJfID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSk7Ci0gICAgYW50ZW5uYU1heFNpZGVBcmVhQ2FyTGF5ZXJfID0gKGNoYXIqKikgbGVmTWFsbG9jKHNpemVvZihjaGFyKikpOwotCi0gICAgbnVtQW50ZW5uYU1heEN1dENhcl8gPSAwOwotICAgIGFudGVubmFNYXhDdXRDYXJBbGxvY2F0ZWRfID0gMTsKLSAgICBhbnRlbm5hTWF4Q3V0Q2FyXyA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkpOwotICAgIGFudGVubmFNYXhDdXRDYXJMYXllcl8gPSAoY2hhcioqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIqKSk7Ci0KLSAgICBveGlkZV8gPSAwOwotICAgIGhhc1JldHVybl8gPSAwOwotCi19Ci0KLWxlZmlQaW5BbnRlbm5hTW9kZWw6On5sZWZpUGluQW50ZW5uYU1vZGVsKCkKLXsKLSAgICBEZXN0cm95KCk7Ci19Ci0KLXZvaWQKLWxlZmlQaW5BbnRlbm5hTW9kZWw6OkRlc3Ryb3koKQotewotICAgIGNsZWFyKCk7Ci19Ci0KLXZvaWQKLWxlZmlQaW5BbnRlbm5hTW9kZWw6OmNsZWFyKCkKLXsKLSAgICBpbnQgaTsKLQotICAgIGlmIChveGlkZV8pCi0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAob3hpZGVfKSk7Ci0gICAgZWxzZSAgICAgICAvLyBkaWQgbm90IGRlY2xhcmUKLSAgICAgICAgcmV0dXJuOwotICAgIG94aWRlXyA9IDA7Ci0gICAgaGFzUmV0dXJuXyA9IDA7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQW50ZW5uYUdhdGVBcmVhXzsgaSsrKSB7Ci0gICAgICAgIGlmIChhbnRlbm5hR2F0ZUFyZWFMYXllcl9baV0pCi0gICAgICAgICAgICBsZWZGcmVlKGFudGVubmFHYXRlQXJlYUxheWVyX1tpXSk7Ci0gICAgfQotICAgIG51bUFudGVubmFHYXRlQXJlYV8gPSAwOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG51bUFudGVubmFNYXhBcmVhQ2FyXzsgaSsrKSB7Ci0gICAgICAgIGlmIChhbnRlbm5hTWF4QXJlYUNhckxheWVyX1tpXSkKLSAgICAgICAgICAgIGxlZkZyZWUoYW50ZW5uYU1heEFyZWFDYXJMYXllcl9baV0pOwotICAgIH0KLSAgICBudW1BbnRlbm5hTWF4QXJlYUNhcl8gPSAwOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG51bUFudGVubmFNYXhTaWRlQXJlYUNhcl87IGkrKykgewotICAgICAgICBpZiAoYW50ZW5uYU1heFNpZGVBcmVhQ2FyTGF5ZXJfW2ldKQotICAgICAgICAgICAgbGVmRnJlZShhbnRlbm5hTWF4U2lkZUFyZWFDYXJMYXllcl9baV0pOwotICAgIH0KLSAgICBudW1BbnRlbm5hTWF4U2lkZUFyZWFDYXJfID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBudW1BbnRlbm5hTWF4Q3V0Q2FyXzsgaSsrKSB7Ci0gICAgICAgIGlmIChhbnRlbm5hTWF4Q3V0Q2FyTGF5ZXJfW2ldKQotICAgICAgICAgICAgbGVmRnJlZShhbnRlbm5hTWF4Q3V0Q2FyTGF5ZXJfW2ldKTsKLSAgICB9Ci0gICAgbnVtQW50ZW5uYU1heEN1dENhcl8gPSAwOwotICAgIGxlZkZyZWUoKGNoYXIqKSAoYW50ZW5uYUdhdGVBcmVhXykpOwotICAgIGxlZkZyZWUoKGNoYXIqKSAoYW50ZW5uYUdhdGVBcmVhTGF5ZXJfKSk7Ci0gICAgbGVmRnJlZSgoY2hhciopIChhbnRlbm5hTWF4QXJlYUNhcl8pKTsKLSAgICBsZWZGcmVlKChjaGFyKikgKGFudGVubmFNYXhBcmVhQ2FyTGF5ZXJfKSk7Ci0gICAgbGVmRnJlZSgoY2hhciopIChhbnRlbm5hTWF4U2lkZUFyZWFDYXJfKSk7Ci0gICAgbGVmRnJlZSgoY2hhciopIChhbnRlbm5hTWF4U2lkZUFyZWFDYXJMYXllcl8pKTsKLSAgICBsZWZGcmVlKChjaGFyKikgKGFudGVubmFNYXhDdXRDYXJfKSk7Ci0gICAgbGVmRnJlZSgoY2hhciopIChhbnRlbm5hTWF4Q3V0Q2FyTGF5ZXJfKSk7Ci0KLX0KLQotLy8gNS41Ci12b2lkCi1sZWZpUGluQW50ZW5uYU1vZGVsOjpzZXRBbnRlbm5hTW9kZWwoaW50IGFPeGlkZSkKLXsKLSAgICBzd2l0Y2ggKGFPeGlkZSkgewotICAgIGNhc2UgMToKLSAgICAgICAgb3hpZGVfID0gc3RyZHVwKCJPWElERTEiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgICBveGlkZV8gPSBzdHJkdXAoIk9YSURFMiIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICAgIG94aWRlXyA9IHN0cmR1cCgiT1hJREUzIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgICAgb3hpZGVfID0gc3RyZHVwKCJPWElERTQiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgb3hpZGVfID0gTlVMTDsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi12b2lkCi1sZWZpUGluQW50ZW5uYU1vZGVsOjphZGRBbnRlbm5hR2F0ZUFyZWEoZG91YmxlICAgICAgdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpsYXllcikKLXsKLSAgICBpbnQgbGVuOwotICAgIGlmIChudW1BbnRlbm5hR2F0ZUFyZWFfID09IGFudGVubmFHYXRlQXJlYUFsbG9jYXRlZF8pIHsKLSAgICAgICAgaW50ICAgICBpOwotICAgICAgICBpbnQgICAgIG1heDsKLSAgICAgICAgaW50ICAgICBsaW0gPSBudW1BbnRlbm5hR2F0ZUFyZWFfOwotICAgICAgICBkb3VibGUgICpuZDsKLSAgICAgICAgY2hhciAgICAqKm5sOwotCi0KLSAgICAgICAgaWYgKGFudGVubmFHYXRlQXJlYUFsbG9jYXRlZF8gPT0gMCkKLSAgICAgICAgICAgIG1heCA9IGFudGVubmFHYXRlQXJlYUFsbG9jYXRlZF8gPSAyOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtYXggPSBhbnRlbm5hR2F0ZUFyZWFBbGxvY2F0ZWRfICo9IDI7Ci0gICAgICAgIG5kID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIG1heCk7Ci0gICAgICAgIG5sID0gKGNoYXIqKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbWF4KTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbTsgaSsrKSB7Ci0gICAgICAgICAgICBubFtpXSA9IGFudGVubmFHYXRlQXJlYUxheWVyX1tpXTsKLSAgICAgICAgICAgIG5kW2ldID0gYW50ZW5uYUdhdGVBcmVhX1tpXTsKLSAgICAgICAgfQotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGFudGVubmFHYXRlQXJlYUxheWVyXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGFudGVubmFHYXRlQXJlYV8pKTsKLSAgICAgICAgYW50ZW5uYUdhdGVBcmVhTGF5ZXJfID0gbmw7Ci0gICAgICAgIGFudGVubmFHYXRlQXJlYV8gPSBuZDsKLSAgICB9Ci0gICAgYW50ZW5uYUdhdGVBcmVhX1tudW1BbnRlbm5hR2F0ZUFyZWFfXSA9IHZhbDsKLSAgICBpZiAobGF5ZXIpIHsgIC8vIGxheWVyIGNhbiBiZSBudWxsLCBzaW5jZSBpdCBpcyBvcHRpb25hbAotICAgICAgICBsZW4gPSBzdHJsZW4obGF5ZXIpICsgMTsKLSAgICAgICAgYW50ZW5uYUdhdGVBcmVhTGF5ZXJfW251bUFudGVubmFHYXRlQXJlYV9dID0KLSAgICAgICAgICAgIChjaGFyKikgbGVmTWFsbG9jKGxlbik7Ci0gICAgICAgIHN0cmNweShhbnRlbm5hR2F0ZUFyZWFMYXllcl9bbnVtQW50ZW5uYUdhdGVBcmVhX10sCi0gICAgICAgICAgICAgICBsYXllcik7Ci0gICAgfSBlbHNlCi0gICAgICAgIGFudGVubmFHYXRlQXJlYUxheWVyX1tudW1BbnRlbm5hR2F0ZUFyZWFfXSA9IE5VTEw7Ci0gICAgbnVtQW50ZW5uYUdhdGVBcmVhXyArPSAxOwotfQotCi12b2lkCi1sZWZpUGluQW50ZW5uYU1vZGVsOjphZGRBbnRlbm5hTWF4QXJlYUNhcihkb3VibGUgICAgICAgIHZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKmxheWVyKQotewotICAgIGludCBsZW47Ci0gICAgaWYgKG51bUFudGVubmFNYXhBcmVhQ2FyXyA9PSBhbnRlbm5hTWF4QXJlYUNhckFsbG9jYXRlZF8pIHsKLSAgICAgICAgaW50ICAgICBpOwotICAgICAgICBpbnQgICAgIG1heDsKLSAgICAgICAgaW50ICAgICBsaW0gPSBudW1BbnRlbm5hTWF4QXJlYUNhcl87Ci0gICAgICAgIGRvdWJsZSAgKm5kOwotICAgICAgICBjaGFyICAgICoqbmw7Ci0KLSAgICAgICAgaWYgKGFudGVubmFNYXhBcmVhQ2FyQWxsb2NhdGVkXyA9PSAwKQotICAgICAgICAgICAgbWF4ID0gYW50ZW5uYU1heEFyZWFDYXJBbGxvY2F0ZWRfID0gMjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbWF4ID0gYW50ZW5uYU1heEFyZWFDYXJBbGxvY2F0ZWRfICo9IDI7Ci0gICAgICAgIG5kID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIG1heCk7Ci0gICAgICAgIG5sID0gKGNoYXIqKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbWF4KTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbTsgaSsrKSB7Ci0gICAgICAgICAgICBubFtpXSA9IGFudGVubmFNYXhBcmVhQ2FyTGF5ZXJfW2ldOwotICAgICAgICAgICAgbmRbaV0gPSBhbnRlbm5hTWF4QXJlYUNhcl9baV07Ci0gICAgICAgIH0KLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChhbnRlbm5hTWF4QXJlYUNhckxheWVyXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGFudGVubmFNYXhBcmVhQ2FyXykpOwotICAgICAgICBhbnRlbm5hTWF4QXJlYUNhckxheWVyXyA9IG5sOwotICAgICAgICBhbnRlbm5hTWF4QXJlYUNhcl8gPSBuZDsKLSAgICB9Ci0gICAgYW50ZW5uYU1heEFyZWFDYXJfW251bUFudGVubmFNYXhBcmVhQ2FyX10gPSB2YWw7Ci0gICAgaWYgKGxheWVyKSB7ICAvLyBsYXllciBjYW4gYmUgbnVsbCwgc2luY2UgaXQgaXMgb3B0aW9uYWwKLSAgICAgICAgbGVuID0gc3RybGVuKGxheWVyKSArIDE7Ci0gICAgICAgIGFudGVubmFNYXhBcmVhQ2FyTGF5ZXJfW251bUFudGVubmFNYXhBcmVhQ2FyX10gPQotICAgICAgICAgICAgKGNoYXIqKSBsZWZNYWxsb2MobGVuKTsKLSAgICAgICAgc3RyY3B5KGFudGVubmFNYXhBcmVhQ2FyTGF5ZXJfW251bUFudGVubmFNYXhBcmVhQ2FyX10sCi0gICAgICAgICAgICAgICBsYXllcik7Ci0gICAgfSBlbHNlCi0gICAgICAgIGFudGVubmFNYXhBcmVhQ2FyTGF5ZXJfW251bUFudGVubmFNYXhBcmVhQ2FyX10gPSBOVUxMOwotICAgIG51bUFudGVubmFNYXhBcmVhQ2FyXyArPSAxOwotfQotCi12b2lkCi1sZWZpUGluQW50ZW5uYU1vZGVsOjphZGRBbnRlbm5hTWF4U2lkZUFyZWFDYXIoZG91YmxlICAgICAgICB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqbGF5ZXIpCi17Ci0gICAgaW50IGxlbjsKLSAgICBpZiAobnVtQW50ZW5uYU1heFNpZGVBcmVhQ2FyXyA9PSBhbnRlbm5hTWF4U2lkZUFyZWFDYXJBbGxvY2F0ZWRfKSB7Ci0gICAgICAgIGludCAgICAgaTsKLSAgICAgICAgaW50ICAgICBtYXg7Ci0gICAgICAgIGludCAgICAgbGltID0gbnVtQW50ZW5uYU1heFNpZGVBcmVhQ2FyXzsKLSAgICAgICAgZG91YmxlICAqbmQ7Ci0gICAgICAgIGNoYXIgICAgKipubDsKLQotICAgICAgICBpZiAoYW50ZW5uYU1heFNpZGVBcmVhQ2FyQWxsb2NhdGVkXyA9PSAwKQotICAgICAgICAgICAgbWF4ID0gYW50ZW5uYU1heFNpZGVBcmVhQ2FyQWxsb2NhdGVkXyA9IDI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1heCA9IGFudGVubmFNYXhTaWRlQXJlYUNhckFsbG9jYXRlZF8gKj0gMjsKLSAgICAgICAgbmQgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbWF4KTsKLSAgICAgICAgbmwgPSAoY2hhcioqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBtYXgpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGltOyBpKyspIHsKLSAgICAgICAgICAgIG5sW2ldID0gYW50ZW5uYU1heFNpZGVBcmVhQ2FyTGF5ZXJfW2ldOwotICAgICAgICAgICAgbmRbaV0gPSBhbnRlbm5hTWF4U2lkZUFyZWFDYXJfW2ldOwotICAgICAgICB9Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoYW50ZW5uYU1heFNpZGVBcmVhQ2FyTGF5ZXJfKSk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoYW50ZW5uYU1heFNpZGVBcmVhQ2FyXykpOwotICAgICAgICBhbnRlbm5hTWF4U2lkZUFyZWFDYXJMYXllcl8gPSBubDsKLSAgICAgICAgYW50ZW5uYU1heFNpZGVBcmVhQ2FyXyA9IG5kOwotICAgIH0KLSAgICBhbnRlbm5hTWF4U2lkZUFyZWFDYXJfW251bUFudGVubmFNYXhTaWRlQXJlYUNhcl9dID0gdmFsOwotICAgIGlmIChsYXllcikgeyAgLy8gbGF5ZXIgY2FuIGJlIG51bGwsIHNpbmNlIGl0IGlzIG9wdGlvbmFsCi0gICAgICAgIGxlbiA9IHN0cmxlbihsYXllcikgKyAxOwotICAgICAgICBhbnRlbm5hTWF4U2lkZUFyZWFDYXJMYXllcl9bbnVtQW50ZW5uYU1heFNpZGVBcmVhQ2FyX10gPQotICAgICAgICAgICAgKGNoYXIqKSBsZWZNYWxsb2MobGVuKTsKLSAgICAgICAgc3RyY3B5KGFudGVubmFNYXhTaWRlQXJlYUNhckxheWVyX1tudW1BbnRlbm5hTWF4U2lkZUFyZWFDYXJfXSwKLSAgICAgICAgICAgICAgIGxheWVyKTsKLSAgICB9IGVsc2UKLSAgICAgICAgYW50ZW5uYU1heFNpZGVBcmVhQ2FyTGF5ZXJfW251bUFudGVubmFNYXhTaWRlQXJlYUNhcl9dID0gTlVMTDsKLSAgICBudW1BbnRlbm5hTWF4U2lkZUFyZWFDYXJfICs9IDE7Ci19Ci0KLXZvaWQKLWxlZmlQaW5BbnRlbm5hTW9kZWw6OmFkZEFudGVubmFNYXhDdXRDYXIoZG91YmxlICAgICB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxheWVyKQotewotICAgIGludCBsZW47Ci0gICAgaWYgKG51bUFudGVubmFNYXhDdXRDYXJfID09IGFudGVubmFNYXhDdXRDYXJBbGxvY2F0ZWRfKSB7Ci0gICAgICAgIGludCAgICAgaTsKLSAgICAgICAgaW50ICAgICBtYXg7Ci0gICAgICAgIGludCAgICAgbGltID0gbnVtQW50ZW5uYU1heEN1dENhcl87Ci0gICAgICAgIGRvdWJsZSAgKm5kOwotICAgICAgICBjaGFyICAgICoqbmw7Ci0KLSAgICAgICAgaWYgKGFudGVubmFNYXhDdXRDYXJBbGxvY2F0ZWRfID09IDApCi0gICAgICAgICAgICBtYXggPSBhbnRlbm5hTWF4Q3V0Q2FyQWxsb2NhdGVkXyA9IDI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1heCA9IGFudGVubmFNYXhDdXRDYXJBbGxvY2F0ZWRfICo9IDI7Ci0gICAgICAgIG5kID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIG1heCk7Ci0gICAgICAgIG5sID0gKGNoYXIqKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbWF4KTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbTsgaSsrKSB7Ci0gICAgICAgICAgICBubFtpXSA9IGFudGVubmFNYXhDdXRDYXJMYXllcl9baV07Ci0gICAgICAgICAgICBuZFtpXSA9IGFudGVubmFNYXhDdXRDYXJfW2ldOwotICAgICAgICB9Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoYW50ZW5uYU1heEN1dENhckxheWVyXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGFudGVubmFNYXhDdXRDYXJfKSk7Ci0gICAgICAgIGFudGVubmFNYXhDdXRDYXJMYXllcl8gPSBubDsKLSAgICAgICAgYW50ZW5uYU1heEN1dENhcl8gPSBuZDsKLSAgICB9Ci0gICAgYW50ZW5uYU1heEN1dENhcl9bbnVtQW50ZW5uYU1heEN1dENhcl9dID0gdmFsOwotICAgIGlmIChsYXllcikgeyAgLy8gbGF5ZXIgY2FuIGJlIG51bGwsIHNpbmNlIGl0IGlzIG9wdGlvbmFsCi0gICAgICAgIGxlbiA9IHN0cmxlbihsYXllcikgKyAxOwotICAgICAgICBhbnRlbm5hTWF4Q3V0Q2FyTGF5ZXJfW251bUFudGVubmFNYXhDdXRDYXJfXSA9Ci0gICAgICAgICAgICAoY2hhciopIGxlZk1hbGxvYyhsZW4pOwotICAgICAgICBzdHJjcHkoYW50ZW5uYU1heEN1dENhckxheWVyX1tudW1BbnRlbm5hTWF4Q3V0Q2FyX10sCi0gICAgICAgICAgICAgICBsYXllcik7Ci0gICAgfSBlbHNlCi0gICAgICAgIGFudGVubmFNYXhDdXRDYXJMYXllcl9bbnVtQW50ZW5uYU1heEN1dENhcl9dID0gTlVMTDsKLSAgICBudW1BbnRlbm5hTWF4Q3V0Q2FyXyArPSAxOwotfQotCi12b2lkCi1sZWZpUGluQW50ZW5uYU1vZGVsOjpzZXRBbnRlbm5hUmV0dXJuRmxhZyhpbnQgZmxhZykKLXsKLSAgICBoYXNSZXR1cm5fID0gZmxhZzsKLSAgICByZXR1cm47Ci19Ci0KLWludAotbGVmaVBpbkFudGVubmFNb2RlbDo6aGFzQW50ZW5uYUdhdGVBcmVhKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbnVtQW50ZW5uYUdhdGVBcmVhXyA/IDEgOiAwOwotfQotCi1pbnQKLWxlZmlQaW5BbnRlbm5hTW9kZWw6Omhhc0FudGVubmFNYXhBcmVhQ2FyKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbnVtQW50ZW5uYU1heEFyZWFDYXJfID8gMSA6IDA7Ci19Ci0KLWludAotbGVmaVBpbkFudGVubmFNb2RlbDo6aGFzQW50ZW5uYU1heFNpZGVBcmVhQ2FyKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbnVtQW50ZW5uYU1heFNpZGVBcmVhQ2FyXyA/IDEgOiAwOwotfQotCi1pbnQKLWxlZmlQaW5BbnRlbm5hTW9kZWw6Omhhc0FudGVubmFNYXhDdXRDYXIoKSBjb25zdAotewotICAgIHJldHVybiBudW1BbnRlbm5hTWF4Q3V0Q2FyXyA/IDEgOiAwOwotfQotCi0vLyA1LjUKLWNoYXIgKgotbGVmaVBpbkFudGVubmFNb2RlbDo6YW50ZW5uYU94aWRlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gb3hpZGVfOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlQaW5BbnRlbm5hTW9kZWw6OmFudGVubmFHYXRlQXJlYUxheWVyKGludCBpKSBjb25zdAotewotICAgIHJldHVybiBhbnRlbm5hR2F0ZUFyZWFMYXllcl9baV07Ci19Ci0KLWNvbnN0IGNoYXIgKgotbGVmaVBpbkFudGVubmFNb2RlbDo6YW50ZW5uYU1heEFyZWFDYXJMYXllcihpbnQgaSkgY29uc3QKLXsKLSAgICByZXR1cm4gYW50ZW5uYU1heEFyZWFDYXJMYXllcl9baV07Ci19Ci0KLWNvbnN0IGNoYXIgKgotbGVmaVBpbkFudGVubmFNb2RlbDo6YW50ZW5uYU1heFNpZGVBcmVhQ2FyTGF5ZXIoaW50IGkpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGFudGVubmFNYXhTaWRlQXJlYUNhckxheWVyX1tpXTsKLX0KLQotY29uc3QgY2hhciAqCi1sZWZpUGluQW50ZW5uYU1vZGVsOjphbnRlbm5hTWF4Q3V0Q2FyTGF5ZXIoaW50IGkpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGFudGVubmFNYXhDdXRDYXJMYXllcl9baV07Ci19Ci0KLWludAotbGVmaVBpbkFudGVubmFNb2RlbDo6bnVtQW50ZW5uYUdhdGVBcmVhKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbnVtQW50ZW5uYUdhdGVBcmVhXzsKLX0KLQotaW50Ci1sZWZpUGluQW50ZW5uYU1vZGVsOjpudW1BbnRlbm5hTWF4QXJlYUNhcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG51bUFudGVubmFNYXhBcmVhQ2FyXzsKLX0KLQotaW50Ci1sZWZpUGluQW50ZW5uYU1vZGVsOjpudW1BbnRlbm5hTWF4U2lkZUFyZWFDYXIoKSBjb25zdAotewotICAgIHJldHVybiBudW1BbnRlbm5hTWF4U2lkZUFyZWFDYXJfOwotfQotCi1pbnQKLWxlZmlQaW5BbnRlbm5hTW9kZWw6Om51bUFudGVubmFNYXhDdXRDYXIoKSBjb25zdAotewotICAgIHJldHVybiBudW1BbnRlbm5hTWF4Q3V0Q2FyXzsKLX0KLQotZG91YmxlCi1sZWZpUGluQW50ZW5uYU1vZGVsOjphbnRlbm5hR2F0ZUFyZWEoaW50IGkpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGFudGVubmFHYXRlQXJlYV9baV07Ci19Ci0KLWRvdWJsZQotbGVmaVBpbkFudGVubmFNb2RlbDo6YW50ZW5uYU1heEFyZWFDYXIoaW50IGkpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGFudGVubmFNYXhBcmVhQ2FyX1tpXTsKLX0KLQotZG91YmxlCi1sZWZpUGluQW50ZW5uYU1vZGVsOjphbnRlbm5hTWF4U2lkZUFyZWFDYXIoaW50IGkpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGFudGVubmFNYXhTaWRlQXJlYUNhcl9baV07Ci19Ci0KLWRvdWJsZQotbGVmaVBpbkFudGVubmFNb2RlbDo6YW50ZW5uYU1heEN1dENhcihpbnQgaSkgY29uc3QKLXsKLSAgICByZXR1cm4gYW50ZW5uYU1heEN1dENhcl9baV07Ci19Ci0KLWludAotbGVmaVBpbkFudGVubmFNb2RlbDo6aGFzUmV0dXJuKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzUmV0dXJuXzsKLX0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIGxlZmlQaW4KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLWxlZmlQaW46OmxlZmlQaW4oKQotOiBuYW1lU2l6ZV8oMCksCi0gIG5hbWVfKE5VTEwpLAotICBoYXNMRVFfKDApLAotICBoYXNEaXJlY3Rpb25fKDApLAotICBoYXNVc2VfKDApLAotICBoYXNTaGFwZV8oMCksCi0gIGhhc011c3Rqb2luXygwKSwKLSAgaGFzT3V0TWFyZ2luXygwKSwKLSAgaGFzT3V0UmVzaXN0YW5jZV8oMCksCi0gIGhhc0luTWFyZ2luXygwKSwKLSAgaGFzUG93ZXJfKDApLAotICBoYXNMZWFrYWdlXygwKSwKLSAgaGFzTWF4bG9hZF8oMCksCi0gIGhhc01heGRlbGF5XygwKSwKLSAgaGFzQ2FwYWNpdGFuY2VfKDApLAotICBoYXNSZXNpc3RhbmNlXygwKSwKLSAgaGFzUHVsbGRvd25yZXNfKDApLAotICBoYXNUaWVvZmZyXygwKSwKLSAgaGFzVkhJXygwKSwKLSAgaGFzVkxPXygwKSwKLSAgaGFzUmlzZVZvbHRhZ2VfKDApLAotICBoYXNGYWxsVm9sdGFnZV8oMCksCi0gIGhhc1Jpc2VUaHJlc2hfKDApLAotICBoYXNGYWxsVGhyZXNoXygwKSwKLSAgaGFzUmlzZVNhdGN1cl8oMCksCi0gIGhhc0ZhbGxTYXRjdXJfKDApLAotICBoYXNDdXJyZW50U291cmNlXygwKSwKLSAgaGFzVGFibGVzXygwKSwKLSAgaGFzQW50ZW5uYXNpemVfKDApLAotICBoYXNSaXNlU2xld0xpbWl0XygwKSwKLSAgaGFzRmFsbFNsZXdMaW1pdF8oMCksCi0gIG51bUZvcmVpZ25zXygwKSwKLSAgZm9yZWlnbkFsbG9jYXRlZF8oMCksCi0gIGhhc0ZvcmVpZ25PcmllbnRfKE5VTEwpLAotICBoYXNGb3JlaWduUG9pbnRfKE5VTEwpLAotICBmb3JlaWduT3JpZW50XyhOVUxMKSwKLSAgZm9yZWlnblhfKE5VTEwpLAotICBmb3JlaWduWV8oTlVMTCksCi0gIGZvcmVpZ25fKE5VTEwpLAotICBMRVFTaXplXygwKSwKLSAgTEVRXyhOVUxMKSwKLSAgbXVzdGpvaW5TaXplXygwKSwKLSAgbXVzdGpvaW5fKE5VTEwpLAotICBvdXRNYXJnaW5IXygwLjApLAotICBvdXRNYXJnaW5MXygwLjApLAotICBvdXRSZXNpc3RhbmNlSF8oMC4wKSwKLSAgb3V0UmVzaXN0YW5jZUxfKDAuMCksCi0gIGluTWFyZ2luSF8oMC4wKSwKLSAgaW5NYXJnaW5MXygwLjApLAotICBwb3dlcl8oMC4wKSwKLSAgbGVha2FnZV8oMC4wKSwKLSAgbWF4bG9hZF8oMC4wKSwKLSAgbWF4ZGVsYXlfKDAuMCksCi0gIGNhcGFjaXRhbmNlXygwLjApLAotICByZXNpc3RhbmNlXygwLjApLAotICBwdWxsZG93bnJlc18oMC4wKSwKLSAgdGllb2Zmcl8oMC4wKSwKLSAgVkhJXygwLjApLAotICBWTE9fKDAuMCksCi0gIHJpc2VWb2x0YWdlXygwLjApLAotICBmYWxsVm9sdGFnZV8oMC4wKSwKLSAgcmlzZVRocmVzaF8oMC4wKSwKLSAgZmFsbFRocmVzaF8oMC4wKSwKLSAgcmlzZVNhdGN1cl8oMC4wKSwKLSAgZmFsbFNhdGN1cl8oMC4wKSwKLSAgbG93VGFibGVTaXplXygwKSwKLSAgbG93VGFibGVfKE5VTEwpLAotICBoaWdoVGFibGVTaXplXygwKSwKLSAgaGlnaFRhYmxlXyhOVUxMKSwKLSAgcmlzZVNsZXdMaW1pdF8oMC4wKSwKLSAgZmFsbFNsZXdMaW1pdF8oMC4wKSwKLSAgbnVtQW50ZW5uYU1vZGVsXygwKSwKLSAgYW50ZW5uYU1vZGVsQWxsb2NhdGVkXygwKSwKLSAgY3VyQW50ZW5uYU1vZGVsSW5kZXhfKDApLAotICBhbnRlbm5hTW9kZWxfKE5VTEwpLAotICBudW1BbnRlbm5hU2l6ZV8oMCksCi0gIGFudGVubmFTaXplQWxsb2NhdGVkXygwKSwKLSAgYW50ZW5uYVNpemVfKE5VTEwpLAotICBhbnRlbm5hU2l6ZUxheWVyXyhOVUxMKSwKLSAgbnVtQW50ZW5uYU1ldGFsQXJlYV8oMCksCi0gIGFudGVubmFNZXRhbEFyZWFBbGxvY2F0ZWRfKDApLAotICBhbnRlbm5hTWV0YWxBcmVhXyhOVUxMKSwKLSAgYW50ZW5uYU1ldGFsQXJlYUxheWVyXyhOVUxMKSwKLSAgbnVtQW50ZW5uYU1ldGFsTGVuZ3RoXygwKSwKLSAgYW50ZW5uYU1ldGFsTGVuZ3RoQWxsb2NhdGVkXygwKSwKLSAgYW50ZW5uYU1ldGFsTGVuZ3RoXyhOVUxMKSwKLSAgYW50ZW5uYU1ldGFsTGVuZ3RoTGF5ZXJfKE5VTEwpLAotICBudW1BbnRlbm5hUGFydGlhbE1ldGFsQXJlYV8oMCksCi0gIGFudGVubmFQYXJ0aWFsTWV0YWxBcmVhQWxsb2NhdGVkXygwKSwKLSAgYW50ZW5uYVBhcnRpYWxNZXRhbEFyZWFfKE5VTEwpLAotICBhbnRlbm5hUGFydGlhbE1ldGFsQXJlYUxheWVyXyhOVUxMKSwKLSAgbnVtQW50ZW5uYVBhcnRpYWxNZXRhbFNpZGVBcmVhXygwKSwKLSAgYW50ZW5uYVBhcnRpYWxNZXRhbFNpZGVBcmVhQWxsb2NhdGVkXygwKSwKLSAgYW50ZW5uYVBhcnRpYWxNZXRhbFNpZGVBcmVhXyhOVUxMKSwKLSAgYW50ZW5uYVBhcnRpYWxNZXRhbFNpZGVBcmVhTGF5ZXJfKE5VTEwpLAotICBudW1BbnRlbm5hUGFydGlhbEN1dEFyZWFfKDApLAotICBhbnRlbm5hUGFydGlhbEN1dEFyZWFBbGxvY2F0ZWRfKDApLAotICBhbnRlbm5hUGFydGlhbEN1dEFyZWFfKE5VTEwpLAotICBhbnRlbm5hUGFydGlhbEN1dEFyZWFMYXllcl8oTlVMTCksCi0gIG51bUFudGVubmFEaWZmQXJlYV8oMCksCi0gIGFudGVubmFEaWZmQXJlYUFsbG9jYXRlZF8oMCksCi0gIGFudGVubmFEaWZmQXJlYV8oTlVMTCksCi0gIGFudGVubmFEaWZmQXJlYUxheWVyXyhOVUxMKSwKLSAgdGFwZXJSdWxlXyhOVUxMKSwKLSAgbmV0RXB4cl8oTlVMTCksCi0gIHNzUGluTmFtZV8oTlVMTCksCi0gIGdzUGluTmFtZV8oTlVMTCksCi0gIG51bVByb3BlcnRpZXNfKDApLAotICBwcm9wZXJ0aWVzQWxsb2NhdGVkXygwKSwKLSAgcHJvcE5hbWVzXyhOVUxMKSwKLSAgcHJvcFZhbHVlc18oTlVMTCksCi0gIHByb3BOdW1zXyhOVUxMKSwKLSAgcHJvcFR5cGVzXyhOVUxMKSwKLSAgbnVtUG9ydHNfKDApLAotICBwb3J0c0FsbG9jYXRlZF8oMCksCi0gIHBvcnRzXyhOVUxMKQotewotICAgIEluaXQoKTsKLX0KLQotdm9pZAotbGVmaVBpbjo6SW5pdCgpCi17Ci0gICAgbmFtZVNpemVfID0gMTY7Ci0gICAgbmFtZV8gPSAoY2hhciopIGxlZk1hbGxvYygxNik7Ci0gICAgcG9ydHNBbGxvY2F0ZWRfID0gMjsKLSAgICBwb3J0c18gPSAobGVmaUdlb21ldHJpZXMqKikgbGVmTWFsbG9jKHNpemVvZihsZWZpR2VvbWV0cmllcyopICogMik7Ci0gICAgbnVtUG9ydHNfID0gMDsKLSAgICBudW1Qcm9wZXJ0aWVzXyA9IDA7Ci0gICAgcHJvcGVydGllc0FsbG9jYXRlZF8gPSAwOwotICAgIHByb3BOYW1lc18gPSAwOwotICAgIHByb3BWYWx1ZXNfID0gMDsKLSAgICBwcm9wVHlwZXNfID0gMDsKLSAgICBmb3JlaWduXyA9IDA7Ci0gICAgTEVRXyA9IDA7Ci0gICAgbXVzdGpvaW5fID0gMDsKLSAgICBsb3dUYWJsZV8gPSAwOwotICAgIGhpZ2hUYWJsZV8gPSAwOwotICAgIHRhcGVyUnVsZV8gPSAwOwotICAgIGFudGVubmFNb2RlbF8gPSAwOwotICAgIG51bUFudGVubmFNb2RlbF8gPSAwOwotICAgIG5ldEVweHJfID0gMDsKLSAgICBzc1Bpbk5hbWVfID0gMDsKLSAgICBnc1Bpbk5hbWVfID0gMDsKLQotICAgIGJ1bXAoJihMRVFfKSwgMTYsICYoTEVRU2l6ZV8pKTsKLSAgICBidW1wKCYobXVzdGpvaW5fKSwgMTYsICYobXVzdGpvaW5TaXplXykpOwotICAgIGJ1bXAoJihsb3dUYWJsZV8pLCAxNiwgJihsb3dUYWJsZVNpemVfKSk7Ci0gICAgYnVtcCgmKGhpZ2hUYWJsZV8pLCAxNiwgJihoaWdoVGFibGVTaXplXykpOwotCi0gICAgbnVtQW50ZW5uYVNpemVfID0gMDsKLSAgICBhbnRlbm5hU2l6ZUFsbG9jYXRlZF8gPSAxOwotICAgIGFudGVubmFTaXplXyA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkpOwotICAgIGFudGVubmFTaXplTGF5ZXJfID0gKGNoYXIqKikgbGVmTWFsbG9jKHNpemVvZihjaGFyKikpOwotCi0gICAgbnVtQW50ZW5uYU1ldGFsQXJlYV8gPSAwOwotICAgIGFudGVubmFNZXRhbEFyZWFBbGxvY2F0ZWRfID0gMTsKLSAgICBhbnRlbm5hTWV0YWxBcmVhXyA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkpOwotICAgIGFudGVubmFNZXRhbEFyZWFMYXllcl8gPSAoY2hhcioqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIqKSk7Ci0KLSAgICBudW1BbnRlbm5hTWV0YWxMZW5ndGhfID0gMDsKLSAgICBhbnRlbm5hTWV0YWxMZW5ndGhBbGxvY2F0ZWRfID0gMTsKLSAgICBhbnRlbm5hTWV0YWxMZW5ndGhfID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSk7Ci0gICAgYW50ZW5uYU1ldGFsTGVuZ3RoTGF5ZXJfID0gKGNoYXIqKikgbGVmTWFsbG9jKHNpemVvZihjaGFyKikpOwotCi0gICAgbnVtQW50ZW5uYVBhcnRpYWxNZXRhbEFyZWFfID0gMDsKLSAgICBhbnRlbm5hUGFydGlhbE1ldGFsQXJlYUFsbG9jYXRlZF8gPSAxOwotICAgIGFudGVubmFQYXJ0aWFsTWV0YWxBcmVhXyA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkpOwotICAgIGFudGVubmFQYXJ0aWFsTWV0YWxBcmVhTGF5ZXJfID0gKGNoYXIqKikgbGVmTWFsbG9jKHNpemVvZihjaGFyKikpOwotCi0gICAgbnVtQW50ZW5uYVBhcnRpYWxNZXRhbFNpZGVBcmVhXyA9IDA7Ci0gICAgYW50ZW5uYVBhcnRpYWxNZXRhbFNpZGVBcmVhQWxsb2NhdGVkXyA9IDE7Ci0gICAgYW50ZW5uYVBhcnRpYWxNZXRhbFNpZGVBcmVhXyA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkpOwotICAgIGFudGVubmFQYXJ0aWFsTWV0YWxTaWRlQXJlYUxheWVyXyA9IChjaGFyKiopIGxlZk1hbGxvYyhzaXplb2YoY2hhciopKTsKLQotICAgIG51bUFudGVubmFQYXJ0aWFsQ3V0QXJlYV8gPSAwOwotICAgIGFudGVubmFQYXJ0aWFsQ3V0QXJlYUFsbG9jYXRlZF8gPSAxOwotICAgIGFudGVubmFQYXJ0aWFsQ3V0QXJlYV8gPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpKTsKLSAgICBhbnRlbm5hUGFydGlhbEN1dEFyZWFMYXllcl8gPSAoY2hhcioqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIqKSk7Ci0KLSAgICBudW1BbnRlbm5hRGlmZkFyZWFfID0gMDsKLSAgICBhbnRlbm5hRGlmZkFyZWFBbGxvY2F0ZWRfID0gMTsKLSAgICBhbnRlbm5hRGlmZkFyZWFfID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSk7Ci0gICAgYW50ZW5uYURpZmZBcmVhTGF5ZXJfID0gKGNoYXIqKikgbGVmTWFsbG9jKHNpemVvZihjaGFyKikpOwotfQotCi1sZWZpUGluOjp+bGVmaVBpbigpCi17Ci0gICAgRGVzdHJveSgpOwotfQotCi12b2lkCi1sZWZpUGluOjpEZXN0cm95KCkKLXsKLQotICAgIGNsZWFyKCk7Ci0gICAgbGVmRnJlZShuYW1lXyk7Ci0gICAgbGVmRnJlZSgoY2hhciopIChwb3J0c18pKTsKLSAgICBsZWZGcmVlKExFUV8pOwotICAgIGxlZkZyZWUobXVzdGpvaW5fKTsKLSAgICBsZWZGcmVlKGxvd1RhYmxlXyk7Ci0gICAgbGVmRnJlZShoaWdoVGFibGVfKTsKLSAgICBpZiAocHJvcE5hbWVzXykKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChwcm9wTmFtZXNfKSk7Ci0gICAgcHJvcE5hbWVzXyA9IDA7Ci0gICAgaWYgKHByb3BWYWx1ZXNfKQotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHByb3BWYWx1ZXNfKSk7Ci0gICAgcHJvcFZhbHVlc18gPSAwOwotICAgIGlmIChwcm9wTnVtc18pCi0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAocHJvcE51bXNfKSk7Ci0gICAgcHJvcE51bXNfID0gMDsKLSAgICBpZiAocHJvcFR5cGVzXykKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChwcm9wVHlwZXNfKSk7Ci0gICAgcHJvcFR5cGVzXyA9IDA7Ci0gICAgbGVmRnJlZSgoY2hhciopIChhbnRlbm5hU2l6ZV8pKTsKLSAgICBsZWZGcmVlKChjaGFyKikgKGFudGVubmFTaXplTGF5ZXJfKSk7Ci0gICAgbGVmRnJlZSgoY2hhciopIChhbnRlbm5hTWV0YWxBcmVhXykpOwotICAgIGxlZkZyZWUoKGNoYXIqKSAoYW50ZW5uYU1ldGFsQXJlYUxheWVyXykpOwotICAgIGxlZkZyZWUoKGNoYXIqKSAoYW50ZW5uYU1ldGFsTGVuZ3RoXykpOwotICAgIGxlZkZyZWUoKGNoYXIqKSAoYW50ZW5uYU1ldGFsTGVuZ3RoTGF5ZXJfKSk7Ci0gICAgbGVmRnJlZSgoY2hhciopIChhbnRlbm5hUGFydGlhbE1ldGFsQXJlYV8pKTsKLSAgICBsZWZGcmVlKChjaGFyKikgKGFudGVubmFQYXJ0aWFsTWV0YWxBcmVhTGF5ZXJfKSk7Ci0gICAgbGVmRnJlZSgoY2hhciopIChhbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWFfKSk7Ci0gICAgbGVmRnJlZSgoY2hhciopIChhbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWFMYXllcl8pKTsKLSAgICBsZWZGcmVlKChjaGFyKikgKGFudGVubmFQYXJ0aWFsQ3V0QXJlYV8pKTsKLSAgICBsZWZGcmVlKChjaGFyKikgKGFudGVubmFQYXJ0aWFsQ3V0QXJlYUxheWVyXykpOwotICAgIGxlZkZyZWUoKGNoYXIqKSAoYW50ZW5uYURpZmZBcmVhXykpOwotICAgIGxlZkZyZWUoKGNoYXIqKSAoYW50ZW5uYURpZmZBcmVhTGF5ZXJfKSk7Ci0gICAgaWYgKGZvcmVpZ25BbGxvY2F0ZWRfKSB7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoaGFzRm9yZWlnbk9yaWVudF8pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChoYXNGb3JlaWduUG9pbnRfKSk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoZm9yZWlnbk9yaWVudF8pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChmb3JlaWduWF8pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChmb3JlaWduWV8pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChmb3JlaWduXykpOwotICAgICAgICBmb3JlaWduQWxsb2NhdGVkXyA9IDA7Ci0gICAgfQotfQotCi12b2lkCi1sZWZpUGluOjpjbGVhcigpCi17Ci0gICAgaW50ICAgICAgICAgICAgICAgICBpOwotICAgIGxlZmlHZW9tZXRyaWVzICAgICAgKmc7Ci0gICAgbGVmaVBpbkFudGVubmFNb2RlbCAqYU1vZGVsOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG51bVBvcnRzXzsgaSsrKSB7Ci0gICAgICAgIGcgPSBwb3J0c19baV07Ci0gICAgICAgIGctPkRlc3Ryb3koKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIGcpOwotICAgIH0KLSAgICBudW1Qb3J0c18gPSAwOwotICAgIHBvcnRzQWxsb2NhdGVkXyA9IDA7Ci0KLSAgICBoYXNMRVFfID0gMDsKLSAgICBoYXNEaXJlY3Rpb25fID0gMDsKLSAgICBoYXNVc2VfID0gMDsKLSAgICBoYXNTaGFwZV8gPSAwOwotICAgIGhhc011c3Rqb2luXyA9IDA7Ci0gICAgaGFzT3V0TWFyZ2luXyA9IDA7Ci0gICAgaGFzT3V0UmVzaXN0YW5jZV8gPSAwOwotICAgIGhhc0luTWFyZ2luXyA9IDA7Ci0gICAgaGFzUG93ZXJfID0gMDsKLSAgICBoYXNMZWFrYWdlXyA9IDA7Ci0gICAgaGFzTWF4bG9hZF8gPSAwOwotICAgIGhhc01heGRlbGF5XyA9IDA7Ci0gICAgaGFzQ2FwYWNpdGFuY2VfID0gMDsKLSAgICBoYXNSZXNpc3RhbmNlXyA9IDA7Ci0gICAgaGFzUHVsbGRvd25yZXNfID0gMDsKLSAgICBoYXNUaWVvZmZyXyA9IDA7Ci0gICAgaGFzVkhJXyA9IDA7Ci0gICAgaGFzVkxPXyA9IDA7Ci0gICAgaGFzUmlzZVZvbHRhZ2VfID0gMDsKLSAgICBoYXNGYWxsVm9sdGFnZV8gPSAwOwotICAgIGhhc1Jpc2VUaHJlc2hfID0gMDsKLSAgICBoYXNGYWxsVGhyZXNoXyA9IDA7Ci0gICAgaGFzUmlzZVNhdGN1cl8gPSAwOwotICAgIGhhc0ZhbGxTYXRjdXJfID0gMDsKLSAgICBoYXNDdXJyZW50U291cmNlXyA9IDA7Ci0gICAgaGFzUmlzZVNsZXdMaW1pdF8gPSAwOwotICAgIGhhc0ZhbGxTbGV3TGltaXRfID0gMDsKLSAgICBoYXNUYWJsZXNfID0gMDsKLSAgICBzdHJjcHkodXNlXywgIlNJR05BTCIpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG51bUZvcmVpZ25zXzsgaSsrKSB7Ci0gICAgICAgIGhhc0ZvcmVpZ25PcmllbnRfW2ldID0gMDsKLSAgICAgICAgaGFzRm9yZWlnblBvaW50X1tpXSA9IDA7Ci0gICAgICAgIGZvcmVpZ25PcmllbnRfW2ldID0gLTE7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoZm9yZWlnbl9baV0pKTsKLSAgICB9Ci0gICAgbnVtRm9yZWlnbnNfID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBudW1BbnRlbm5hU2l6ZV87IGkrKykgewotICAgICAgICBpZiAoYW50ZW5uYVNpemVMYXllcl9baV0pCi0gICAgICAgICAgICBsZWZGcmVlKGFudGVubmFTaXplTGF5ZXJfW2ldKTsKLSAgICB9Ci0gICAgbnVtQW50ZW5uYVNpemVfID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBudW1BbnRlbm5hTWV0YWxMZW5ndGhfOyBpKyspIHsKLSAgICAgICAgaWYgKGFudGVubmFNZXRhbExlbmd0aExheWVyX1tpXSkKLSAgICAgICAgICAgIGxlZkZyZWUoYW50ZW5uYU1ldGFsTGVuZ3RoTGF5ZXJfW2ldKTsKLSAgICB9Ci0gICAgbnVtQW50ZW5uYU1ldGFsTGVuZ3RoXyA9IDA7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQW50ZW5uYU1ldGFsQXJlYV87IGkrKykgewotICAgICAgICBpZiAoYW50ZW5uYU1ldGFsQXJlYUxheWVyX1tpXSkKLSAgICAgICAgICAgIGxlZkZyZWUoYW50ZW5uYU1ldGFsQXJlYUxheWVyX1tpXSk7Ci0gICAgfQotICAgIG51bUFudGVubmFNZXRhbEFyZWFfID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBudW1BbnRlbm5hUGFydGlhbE1ldGFsQXJlYV87IGkrKykgewotICAgICAgICBpZiAoYW50ZW5uYVBhcnRpYWxNZXRhbEFyZWFMYXllcl9baV0pCi0gICAgICAgICAgICBsZWZGcmVlKGFudGVubmFQYXJ0aWFsTWV0YWxBcmVhTGF5ZXJfW2ldKTsKLSAgICB9Ci0gICAgbnVtQW50ZW5uYVBhcnRpYWxNZXRhbEFyZWFfID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBudW1BbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWFfOyBpKyspIHsKLSAgICAgICAgaWYgKGFudGVubmFQYXJ0aWFsTWV0YWxTaWRlQXJlYUxheWVyX1tpXSkKLSAgICAgICAgICAgIGxlZkZyZWUoYW50ZW5uYVBhcnRpYWxNZXRhbFNpZGVBcmVhTGF5ZXJfW2ldKTsKLSAgICB9Ci0gICAgbnVtQW50ZW5uYVBhcnRpYWxNZXRhbFNpZGVBcmVhXyA9IDA7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQW50ZW5uYVBhcnRpYWxDdXRBcmVhXzsgaSsrKSB7Ci0gICAgICAgIGlmIChhbnRlbm5hUGFydGlhbEN1dEFyZWFMYXllcl9baV0pCi0gICAgICAgICAgICBsZWZGcmVlKGFudGVubmFQYXJ0aWFsQ3V0QXJlYUxheWVyX1tpXSk7Ci0gICAgfQotICAgIG51bUFudGVubmFQYXJ0aWFsQ3V0QXJlYV8gPSAwOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG51bUFudGVubmFEaWZmQXJlYV87IGkrKykgewotICAgICAgICBpZiAoYW50ZW5uYURpZmZBcmVhTGF5ZXJfW2ldKQotICAgICAgICAgICAgbGVmRnJlZShhbnRlbm5hRGlmZkFyZWFMYXllcl9baV0pOwotICAgIH0KLSAgICBudW1BbnRlbm5hRGlmZkFyZWFfID0gMDsKLQotICAgIGlmIChudW1BbnRlbm5hTW9kZWxfID4gMCkgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7ICAgICAgICAvLyA1LjUKLSAgICAgICAgICAgIGFNb2RlbCA9IGFudGVubmFNb2RlbF9baV07Ci0gICAgICAgICAgICBhTW9kZWwtPkRlc3Ryb3koKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgYW50ZW5uYU1vZGVsQWxsb2NhdGVkXzsgaSsrKSB7ICAvLyA1LjUKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIGFudGVubmFNb2RlbF9baV0pOwotICAgIH0KLSAgICBpZiAoYW50ZW5uYU1vZGVsXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjUKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIGFudGVubmFNb2RlbF8pOwotICAgIGFudGVubmFNb2RlbF8gPSAwOyAgICAgICAgICAgICAvLyA1LjUKLSAgICBudW1BbnRlbm5hTW9kZWxfID0gMDsgICAgICAgICAgLy8gNS41Ci0gICAgY3VyQW50ZW5uYU1vZGVsSW5kZXhfID0gMDsgICAgIC8vIDUuNQotICAgIGFudGVubmFNb2RlbEFsbG9jYXRlZF8gPSAwOyAgICAvLyA1LjUKLQotICAgIGZvciAoaSA9IDA7IGkgPCBudW1Qcm9wZXJ0aWVzXzsgaSsrKSB7Ci0gICAgICAgIGxlZkZyZWUocHJvcE5hbWVzX1tpXSk7Ci0gICAgICAgIGxlZkZyZWUocHJvcFZhbHVlc19baV0pOwotICAgIH0KLSAgICBudW1Qcm9wZXJ0aWVzXyA9IDA7Ci0gICAgcHJvcGVydGllc0FsbG9jYXRlZF8gPSAwOwotICAgIGlmICh0YXBlclJ1bGVfKSB7Ci0gICAgICAgIGxlZkZyZWUodGFwZXJSdWxlXyk7Ci0gICAgICAgIHRhcGVyUnVsZV8gPSAwOwotICAgIH0KLSAgICBpZiAobmV0RXB4cl8pIHsKLSAgICAgICAgbGVmRnJlZShuZXRFcHhyXyk7Ci0gICAgICAgIG5ldEVweHJfID0gMDsKLSAgICB9Ci0gICAgaWYgKHNzUGluTmFtZV8pIHsKLSAgICAgICAgbGVmRnJlZShzc1Bpbk5hbWVfKTsKLSAgICAgICAgc3NQaW5OYW1lXyA9IDA7Ci0gICAgfQotICAgIGlmIChnc1Bpbk5hbWVfKSB7Ci0gICAgICAgIGxlZkZyZWUoZ3NQaW5OYW1lXyk7Ci0gICAgICAgIGdzUGluTmFtZV8gPSAwOwotICAgIH0KLX0KLQotdm9pZAotbGVmaVBpbjo6YnVtcChjaGFyICAqKmFycmF5LAotICAgICAgICAgICAgICBpbnQgICBsZW4sCi0gICAgICAgICAgICAgIGludCAgICpzaXplKQotewotICAgIGlmICgqYXJyYXkpCi0gICAgICAgIGxlZkZyZWUoKmFycmF5KTsKLSAgICBpZiAobGVuID4gMCkKLSAgICAgICAgKmFycmF5ID0gKGNoYXIqKSBsZWZNYWxsb2MobGVuKTsKLSAgICBlbHNlCi0gICAgICAgICphcnJheSA9IDA7Ci0gICAgKnNpemUgPSBsZW47Ci19Ci0KLQotdm9pZAotbGVmaVBpbjo6c2V0TmFtZShjb25zdCBjaGFyICpuYW1lKQotewotICAgIGludCBsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotICAgIGNsZWFyKCk7Ci0gICAgaWYgKGxlbiA+IG5hbWVTaXplXykgewotICAgICAgICBsZWZGcmVlKG5hbWVfKTsKLSAgICAgICAgbmFtZV8gPSAoY2hhciopIGxlZk1hbGxvYyhsZW4pOwotICAgICAgICBuYW1lU2l6ZV8gPSBsZW47Ci0gICAgfQotICAgIHN0cmNweShuYW1lXywgQ0FTRShuYW1lKSk7Ci19Ci0KLXZvaWQKLWxlZmlQaW46OmFkZFBvcnQobGVmaUdlb21ldHJpZXMgKmcpCi17Ci0gICAgaWYgKG51bVBvcnRzXyA9PSBwb3J0c0FsbG9jYXRlZF8pIHsKLSAgICAgICAgaW50ICAgICAgICAgICAgIGk7Ci0gICAgICAgIGxlZmlHZW9tZXRyaWVzICAqKm5nOwotICAgICAgICBpZiAocG9ydHNBbGxvY2F0ZWRfID09IDApCi0gICAgICAgICAgICBwb3J0c0FsbG9jYXRlZF8gPSAyOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwb3J0c0FsbG9jYXRlZF8gKj0gMjsKLSAgICAgICAgbmcgPSAobGVmaUdlb21ldHJpZXMqKikgbGVmTWFsbG9jKHNpemVvZihsZWZpR2VvbWV0cmllcyopICogcG9ydHNBbGxvY2F0ZWRfKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVBvcnRzXzsgaSsrKQotICAgICAgICAgICAgbmdbaV0gPSBwb3J0c19baV07Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAocG9ydHNfKSk7Ci0gICAgICAgIHBvcnRzXyA9IG5nOwotICAgIH0KLSAgICBwb3J0c19bbnVtUG9ydHNfKytdID0gZzsKLX0KLQotdm9pZAotbGVmaVBpbjo6YWRkRm9yZWlnbihjb25zdCBjaGFyICAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgaGFzUG50LAotICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICB4LAotICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICB5LAotICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBvcmllbnQpCi17Ci0gICAgaW50ICAgICBpOwotICAgIGludCAgICAgKmhmbzsKLSAgICBpbnQgICAgICpoZnA7Ci0gICAgaW50ICAgICAqZm87Ci0gICAgZG91YmxlICAqZng7Ci0gICAgZG91YmxlICAqZnk7Ci0gICAgY2hhciAgICAqKmY7Ci0KLSAgICBpZiAoZm9yZWlnbkFsbG9jYXRlZF8gPT0gbnVtRm9yZWlnbnNfKSB7Ci0gICAgICAgIGlmIChmb3JlaWduQWxsb2NhdGVkXyA9PSAwKQotICAgICAgICAgICAgZm9yZWlnbkFsbG9jYXRlZF8gPSAxNjsgLy8gc2luY2UgaXQgaW52b2x2ZXMgY2hhciosIGl0IHdpbGwKLSAgICAgICAgICAgIC8vIGNvc3RseSBpbiB0aGUgbnVtYmVyIGlzIHRvbyBzbWFsbAotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmb3JlaWduQWxsb2NhdGVkXyAqPSAyOwotICAgICAgICBoZm8gPSAoaW50KikgbGVmTWFsbG9jKHNpemVvZihpbnQpICogZm9yZWlnbkFsbG9jYXRlZF8pOwotICAgICAgICBoZnAgPSAoaW50KikgbGVmTWFsbG9jKHNpemVvZihpbnQpICogZm9yZWlnbkFsbG9jYXRlZF8pOwotICAgICAgICBmbyA9IChpbnQqKSBsZWZNYWxsb2Moc2l6ZW9mKGludCkgKiBmb3JlaWduQWxsb2NhdGVkXyk7Ci0gICAgICAgIGZ4ID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGZvcmVpZ25BbGxvY2F0ZWRfKTsKLSAgICAgICAgZnkgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogZm9yZWlnbkFsbG9jYXRlZF8pOwotICAgICAgICBmID0gKGNoYXIqKikgbGVmTWFsbG9jKHNpemVvZihjaGFyKikgKiBmb3JlaWduQWxsb2NhdGVkXyk7Ci0gICAgICAgIGlmIChudW1Gb3JlaWduc18gIT0gMCkgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUZvcmVpZ25zXzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaGZvW2ldID0gaGFzRm9yZWlnbk9yaWVudF9baV07Ci0gICAgICAgICAgICAgICAgaGZwW2ldID0gaGFzRm9yZWlnblBvaW50X1tpXTsKLSAgICAgICAgICAgICAgICBmb1tpXSA9IGZvcmVpZ25PcmllbnRfW2ldOwotICAgICAgICAgICAgICAgIGZ4W2ldID0gZm9yZWlnblhfW2ldOwotICAgICAgICAgICAgICAgIGZ5W2ldID0gZm9yZWlnbllfW2ldOwotICAgICAgICAgICAgICAgIGZbaV0gPSBmb3JlaWduX1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoaGFzRm9yZWlnbk9yaWVudF8pKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoaGFzRm9yZWlnblBvaW50XykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChmb3JlaWduT3JpZW50XykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChmb3JlaWduWF8pKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoZm9yZWlnbllfKSk7Ci0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKGZvcmVpZ25fKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaGFzRm9yZWlnbk9yaWVudF8gPSBoZm87Ci0gICAgICAgIGhhc0ZvcmVpZ25Qb2ludF8gPSBoZnA7Ci0gICAgICAgIGZvcmVpZ25PcmllbnRfID0gZm87Ci0gICAgICAgIGZvcmVpZ25YXyA9IGZ4OwotICAgICAgICBmb3JlaWduWV8gPSBmeTsKLSAgICAgICAgZm9yZWlnbl8gPSBmOwotICAgIH0KLQotCi0gICAgLy8gb3JpZW50PS0xIG1lYW5zIG5vIG9yaWVudCB3YXMgc3BlY2lmaWVkLgotICAgIGlmIChvcmllbnQgIT0gLTEpCi0gICAgICAgIGhhc0ZvcmVpZ25PcmllbnRfW251bUZvcmVpZ25zX10gPSAxOwotICAgIGVsc2UKLSAgICAgICAgaGFzRm9yZWlnbk9yaWVudF9bbnVtRm9yZWlnbnNfXSA9IC0xOwotCi0gICAgaGFzRm9yZWlnblBvaW50X1tudW1Gb3JlaWduc19dID0gaGFzUG50OwotICAgIGZvcmVpZ25PcmllbnRfW251bUZvcmVpZ25zX10gPSBvcmllbnQ7Ci0gICAgZm9yZWlnblhfW251bUZvcmVpZ25zX10gPSB4OwotICAgIGZvcmVpZ25ZX1tudW1Gb3JlaWduc19dID0geTsKLSAgICBmb3JlaWduX1tudW1Gb3JlaWduc19dID0gKGNoYXIqKSBsZWZNYWxsb2Moc3RybGVuKG5hbWUpICsgMSk7Ci0gICAgc3RyY3B5KGZvcmVpZ25fW251bUZvcmVpZ25zX10sIENBU0UobmFtZSkpOwotICAgIG51bUZvcmVpZ25zXyArPSAxOwotfQotCi12b2lkCi1sZWZpUGluOjpzZXRMRVEoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLSAgICBpZiAobGVuID4gTEVRU2l6ZV8pCi0gICAgICAgIGJ1bXAoJihMRVFfKSwgbGVuLCAmKExFUVNpemVfKSk7Ci0gICAgc3RyY3B5KExFUV8sIENBU0UobmFtZSkpOwotICAgIGhhc0xFUV8gPSAxOwotfQotCi12b2lkCi1sZWZpUGluOjpzZXREaXJlY3Rpb24oY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBzdHJjcHkoZGlyZWN0aW9uXywgQ0FTRShuYW1lKSk7Ci0gICAgaGFzRGlyZWN0aW9uXyA9IDE7Ci19Ci0KLXZvaWQKLWxlZmlQaW46OnNldFVzZShjb25zdCBjaGFyICpuYW1lKQotewotICAgIHN0cmNweSh1c2VfLCBDQVNFKG5hbWUpKTsKLSAgICBoYXNVc2VfID0gMTsKLX0KLQotdm9pZAotbGVmaVBpbjo6c2V0U2hhcGUoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBzdHJjcHkoc2hhcGVfLCBDQVNFKG5hbWUpKTsKLSAgICBoYXNTaGFwZV8gPSAxOwotfQotCi12b2lkCi1sZWZpUGluOjpzZXRNdXN0am9pbihjb25zdCBjaGFyICpuYW1lKQotewotICAgIGludCBsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotICAgIGlmIChsZW4gPiBtdXN0am9pblNpemVfKQotICAgICAgICBidW1wKCYobXVzdGpvaW5fKSwgbGVuLCAmKG11c3Rqb2luU2l6ZV8pKTsKLSAgICBzdHJjcHkobXVzdGpvaW5fLCBDQVNFKG5hbWUpKTsKLSAgICBoYXNNdXN0am9pbl8gPSAxOwotfQotCi12b2lkCi1sZWZpUGluOjpzZXRPdXRNYXJnaW4oZG91YmxlICAgIGhpZ2gsCi0gICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgIGxvdykKLXsKLSAgICBvdXRNYXJnaW5IXyA9IGhpZ2g7Ci0gICAgb3V0TWFyZ2luTF8gPSBsb3c7Ci0gICAgaGFzT3V0TWFyZ2luXyA9IDE7Ci19Ci0KLXZvaWQKLWxlZmlQaW46OnNldE91dFJlc2lzdGFuY2UoZG91YmxlICAgIGhpZ2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICBsb3cpCi17Ci0gICAgb3V0UmVzaXN0YW5jZUhfID0gaGlnaDsKLSAgICBvdXRSZXNpc3RhbmNlTF8gPSBsb3c7Ci0gICAgaGFzT3V0UmVzaXN0YW5jZV8gPSAxOwotfQotCi12b2lkCi1sZWZpUGluOjpzZXRJbk1hcmdpbihkb3VibGUgaGlnaCwKLSAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBsb3cpCi17Ci0gICAgaW5NYXJnaW5IXyA9IGhpZ2g7Ci0gICAgaW5NYXJnaW5MXyA9IGxvdzsKLSAgICBoYXNJbk1hcmdpbl8gPSAxOwotfQotCi12b2lkCi1sZWZpUGluOjpzZXRQb3dlcihkb3VibGUgcG93ZXIpCi17Ci0gICAgcG93ZXJfID0gcG93ZXI7Ci0gICAgaGFzUG93ZXJfID0gMTsKLX0KLQotdm9pZAotbGVmaVBpbjo6c2V0TGVha2FnZShkb3VibGUgY3VycmVudCkKLXsKLSAgICBsZWFrYWdlXyA9IGN1cnJlbnQ7Ci0gICAgaGFzTGVha2FnZV8gPSAxOwotfQotCi12b2lkCi1sZWZpUGluOjpzZXRNYXhsb2FkKGRvdWJsZSBjYXBhY2l0YW5jZSkKLXsKLSAgICBtYXhsb2FkXyA9IGNhcGFjaXRhbmNlOwotICAgIGhhc01heGxvYWRfID0gMTsKLX0KLQotdm9pZAotbGVmaVBpbjo6c2V0TWF4ZGVsYXkoZG91YmxlIGR0aW1lKQotewotICAgIG1heGRlbGF5XyA9IGR0aW1lOwotICAgIGhhc01heGRlbGF5XyA9IDE7Ci19Ci0KLXZvaWQKLWxlZmlQaW46OnNldENhcGFjaXRhbmNlKGRvdWJsZSBjYXBhY2l0YW5jZSkKLXsKLSAgICBjYXBhY2l0YW5jZV8gPSBjYXBhY2l0YW5jZTsKLSAgICBoYXNDYXBhY2l0YW5jZV8gPSAxOwotfQotCi12b2lkCi1sZWZpUGluOjpzZXRSZXNpc3RhbmNlKGRvdWJsZSByZXNpc3RhbmNlKQotewotICAgIHJlc2lzdGFuY2VfID0gcmVzaXN0YW5jZTsKLSAgICBoYXNSZXNpc3RhbmNlXyA9IDE7Ci19Ci0KLXZvaWQKLWxlZmlQaW46OnNldFB1bGxkb3ducmVzKGRvdWJsZSByZXNpc3RhbmNlKQotewotICAgIHB1bGxkb3ducmVzXyA9IHJlc2lzdGFuY2U7Ci0gICAgaGFzUHVsbGRvd25yZXNfID0gMTsKLX0KLQotdm9pZAotbGVmaVBpbjo6c2V0VGllb2Zmcihkb3VibGUgcmVzaXN0YW5jZSkKLXsKLSAgICB0aWVvZmZyXyA9IHJlc2lzdGFuY2U7Ci0gICAgaGFzVGllb2Zmcl8gPSAxOwotfQotCi12b2lkCi1sZWZpUGluOjpzZXRWSEkoZG91YmxlIHZvbHRhZ2UpCi17Ci0gICAgVkhJXyA9IHZvbHRhZ2U7Ci0gICAgaGFzVkhJXyA9IDE7Ci19Ci0KLXZvaWQKLWxlZmlQaW46OnNldFZMTyhkb3VibGUgdm9sdGFnZSkKLXsKLSAgICBWTE9fID0gdm9sdGFnZTsKLSAgICBoYXNWTE9fID0gMTsKLX0KLQotdm9pZAotbGVmaVBpbjo6c2V0UmlzZVZvbHRhZ2UoZG91YmxlIHZvbHRhZ2UpCi17Ci0gICAgcmlzZVZvbHRhZ2VfID0gdm9sdGFnZTsKLSAgICBoYXNSaXNlVm9sdGFnZV8gPSAxOwotfQotCi12b2lkCi1sZWZpUGluOjpzZXRGYWxsVm9sdGFnZShkb3VibGUgdm9sdGFnZSkKLXsKLSAgICBmYWxsVm9sdGFnZV8gPSB2b2x0YWdlOwotICAgIGhhc0ZhbGxWb2x0YWdlXyA9IDE7Ci19Ci0KLXZvaWQKLWxlZmlQaW46OnNldEZhbGxTbGV3TGltaXQoZG91YmxlIG51bSkKLXsKLSAgICBmYWxsU2xld0xpbWl0XyA9IG51bTsKLSAgICBoYXNGYWxsU2xld0xpbWl0XyA9IDE7Ci19Ci0KLXZvaWQKLWxlZmlQaW46OnNldFJpc2VTbGV3TGltaXQoZG91YmxlIG51bSkKLXsKLSAgICByaXNlU2xld0xpbWl0XyA9IG51bTsKLSAgICBoYXNSaXNlU2xld0xpbWl0XyA9IDE7Ci19Ci0KLXZvaWQKLWxlZmlQaW46OnNldFJpc2VUaHJlc2goZG91YmxlIGNhcGFjaXRhbmNlKQotewotICAgIHJpc2VUaHJlc2hfID0gY2FwYWNpdGFuY2U7Ci0gICAgaGFzUmlzZVRocmVzaF8gPSAxOwotfQotCi12b2lkCi1sZWZpUGluOjpzZXRUYXBlclJ1bGUoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLSAgICB0YXBlclJ1bGVfID0gKGNoYXIqKSBsZWZNYWxsb2MobGVuKTsKLSAgICBzdHJjcHkodGFwZXJSdWxlXywgbmFtZSk7Ci19Ci0KLXZvaWQKLWxlZmlQaW46OnNldE5ldEV4cHIoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBuZXRFcHhyXyA9IHN0cmR1cChuYW1lKTsKLX0KLQotdm9pZAotbGVmaVBpbjo6c2V0U3VwcGx5U2Vuc2l0aXZpdHkoY29uc3QgY2hhciAqcGluTmFtZSkKLXsKLSAgICBzc1Bpbk5hbWVfID0gc3RyZHVwKHBpbk5hbWUpOwotfQotCi12b2lkCi1sZWZpUGluOjpzZXRHcm91bmRTZW5zaXRpdml0eShjb25zdCBjaGFyICpwaW5OYW1lKQotewotICAgIGdzUGluTmFtZV8gPSBzdHJkdXAocGluTmFtZSk7Ci19Ci0KLXZvaWQKLWxlZmlQaW46OnNldEZhbGxUaHJlc2goZG91YmxlIGNhcGFjaXRhbmNlKQotewotICAgIGZhbGxUaHJlc2hfID0gY2FwYWNpdGFuY2U7Ci0gICAgaGFzRmFsbFRocmVzaF8gPSAxOwotfQotCi12b2lkCi1sZWZpUGluOjpzZXRSaXNlU2F0Y3VyKGRvdWJsZSBjdXJyZW50KQotewotICAgIHJpc2VTYXRjdXJfID0gY3VycmVudDsKLSAgICBoYXNSaXNlU2F0Y3VyXyA9IDE7Ci19Ci0KLXZvaWQKLWxlZmlQaW46OnNldEZhbGxTYXRjdXIoZG91YmxlIGN1cnJlbnQpCi17Ci0gICAgZmFsbFNhdGN1cl8gPSBjdXJyZW50OwotICAgIGhhc0ZhbGxTYXRjdXJfID0gMTsKLX0KLQotdm9pZAotbGVmaVBpbjo6c2V0Q3VycmVudFNvdXJjZShjb25zdCBjaGFyICpuYW1lKQotewotICAgIHN0cmNweShjdXJyZW50U291cmNlXywgQ0FTRShuYW1lKSk7Ci0gICAgaGFzQ3VycmVudFNvdXJjZV8gPSAxOwotfQotCi12b2lkCi1sZWZpUGluOjpzZXRUYWJsZXMoY29uc3QgY2hhciAgICpoaWdoTmFtZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKmxvd05hbWUpCi17Ci0gICAgaW50IGxlbiA9IHN0cmxlbihoaWdoTmFtZSkgKyAxOwotICAgIGlmIChsZW4gPiBoaWdoVGFibGVTaXplXykKLSAgICAgICAgYnVtcCgmKGhpZ2hUYWJsZV8pLCBsZW4sICYoaGlnaFRhYmxlU2l6ZV8pKTsKLSAgICBzdHJjcHkoaGlnaFRhYmxlXywgQ0FTRShoaWdoTmFtZSkpOwotICAgIGxlbiA9IHN0cmxlbihsb3dOYW1lKSArIDE7Ci0gICAgaWYgKGxlbiA+IGxvd1RhYmxlU2l6ZV8pCi0gICAgICAgIGJ1bXAoJihsb3dUYWJsZV8pLCBsZW4sICYobG93VGFibGVTaXplXykpOwotICAgIHN0cmNweShsb3dUYWJsZV8sIENBU0UobG93TmFtZSkpOwotICAgIGhhc1RhYmxlc18gPSAxOwotfQotCi12b2lkCi1sZWZpUGluOjpzZXRQcm9wZXJ0eShjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIHR5cGUpCi17Ci0gICAgaW50IGxlbjsKLSAgICBpZiAobnVtUHJvcGVydGllc18gPT0gcHJvcGVydGllc0FsbG9jYXRlZF8pCi0gICAgICAgIGJ1bXBQcm9wcygpOwotICAgIGxlbiA9IHN0cmxlbihuYW1lKSArIDE7Ci0gICAgcHJvcE5hbWVzX1tudW1Qcm9wZXJ0aWVzX10gPSAoY2hhciopIGxlZk1hbGxvYyhsZW4pOwotICAgIHN0cmNweShwcm9wTmFtZXNfW251bVByb3BlcnRpZXNfXSwgQ0FTRShuYW1lKSk7Ci0gICAgbGVuID0gc3RybGVuKHZhbHVlKSArIDE7Ci0gICAgcHJvcFZhbHVlc19bbnVtUHJvcGVydGllc19dID0gKGNoYXIqKSBsZWZNYWxsb2MobGVuKTsKLSAgICBzdHJjcHkocHJvcFZhbHVlc19bbnVtUHJvcGVydGllc19dLCBDQVNFKHZhbHVlKSk7Ci0gICAgcHJvcE51bXNfW251bVByb3BlcnRpZXNfXSA9IDA7Ci0gICAgcHJvcFR5cGVzX1tudW1Qcm9wZXJ0aWVzX10gPSB0eXBlOwotICAgIG51bVByb3BlcnRpZXNfICs9IDE7Ci19Ci0KLXZvaWQKLWxlZmlQaW46OnNldE51bVByb3BlcnR5KGNvbnN0IGNoYXIgICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgIHR5cGUpCi17Ci0gICAgaW50IGxlbjsKLQotICAgIGlmIChudW1Qcm9wZXJ0aWVzXyA9PSBwcm9wZXJ0aWVzQWxsb2NhdGVkXykKLSAgICAgICAgYnVtcFByb3BzKCk7Ci0gICAgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLSAgICBwcm9wTmFtZXNfW251bVByb3BlcnRpZXNfXSA9IChjaGFyKikgbGVmTWFsbG9jKGxlbik7Ci0gICAgc3RyY3B5KHByb3BOYW1lc19bbnVtUHJvcGVydGllc19dLCBDQVNFKG5hbWUpKTsKLSAgICBsZW4gPSBzdHJsZW4odmFsdWUpICsgMTsKLSAgICBwcm9wVmFsdWVzX1tudW1Qcm9wZXJ0aWVzX10gPSAoY2hhciopIGxlZk1hbGxvYyhsZW4pOwotICAgIHN0cmNweShwcm9wVmFsdWVzX1tudW1Qcm9wZXJ0aWVzX10sIENBU0UodmFsdWUpKTsKLSAgICBwcm9wTnVtc19bbnVtUHJvcGVydGllc19dID0gZDsKLSAgICBwcm9wVHlwZXNfW251bVByb3BlcnRpZXNfXSA9IHR5cGU7Ci0gICAgbnVtUHJvcGVydGllc18gKz0gMTsKLX0KLQotdm9pZAotbGVmaVBpbjo6YnVtcFByb3BzKCkKLXsKLSAgICBpbnQgICAgIGxpbSA9IHByb3BlcnRpZXNBbGxvY2F0ZWRfOwotICAgIGludCAgICAgbmV3czsKLSAgICBjaGFyICAgICoqbmV3cG47Ci0gICAgY2hhciAgICAqKm5ld3B2OwotICAgIGRvdWJsZSAgKm5ld2Q7Ci0gICAgY2hhciAgICAqbmV3dDsKLQotICAgIG5ld3MgPSBsaW0gPyBsaW0gKyBsaW0gOiAyOwotCi0gICAgbmV3cG4gPSAoY2hhcioqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIqKSAqIG5ld3MpOwotICAgIG5ld3B2ID0gKGNoYXIqKikgbGVmTWFsbG9jKHNpemVvZihjaGFyKikgKiBuZXdzKTsKLSAgICBuZXdkID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIG5ld3MpOwotICAgIG5ld3QgPSAoY2hhciopIGxlZk1hbGxvYyhzaXplb2YoY2hhcikgKiBuZXdzKTsKLQotICAgIGxpbSA9IHByb3BlcnRpZXNBbGxvY2F0ZWRfID0gbmV3czsKLQotICAgIGlmIChsaW0gPiAyKSB7Ci0gICAgICAgIGludCBpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUHJvcGVydGllc187IGkrKykgewotICAgICAgICAgICAgbmV3cG5baV0gPSBwcm9wTmFtZXNfW2ldOwotICAgICAgICAgICAgbmV3cHZbaV0gPSBwcm9wVmFsdWVzX1tpXTsKLSAgICAgICAgICAgIG5ld2RbaV0gPSBwcm9wTnVtc19baV07Ci0gICAgICAgICAgICBuZXd0W2ldID0gcHJvcFR5cGVzX1tpXTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocHJvcE5hbWVzXykKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChwcm9wTmFtZXNfKSk7Ci0gICAgaWYgKHByb3BWYWx1ZXNfKQotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHByb3BWYWx1ZXNfKSk7Ci0gICAgaWYgKHByb3BOdW1zXykKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChwcm9wTnVtc18pKTsKLSAgICBpZiAocHJvcFR5cGVzXykKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChwcm9wVHlwZXNfKSk7Ci0gICAgcHJvcE5hbWVzXyA9IG5ld3BuOwotICAgIHByb3BWYWx1ZXNfID0gbmV3cHY7Ci0gICAgcHJvcE51bXNfID0gbmV3ZDsKLSAgICBwcm9wVHlwZXNfID0gbmV3dDsKLX0KLQotCi1pbnQKLWxlZmlQaW46Omhhc0ZvcmVpZ24oKSBjb25zdAotewotICAgIHJldHVybiAobnVtRm9yZWlnbnNfKSA/IDEgOiAwOwotfQotCi1pbnQKLWxlZmlQaW46Omhhc0ZvcmVpZ25PcmllbnQoaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiAoaGFzRm9yZWlnbk9yaWVudF9baW5kZXhdID09IC0xKSA/IDAgOiAxOwotfQotCi1pbnQKLWxlZmlQaW46Omhhc0ZvcmVpZ25Qb2ludChpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc0ZvcmVpZ25Qb2ludF9baW5kZXhdOwotfQotCi1pbnQKLWxlZmlQaW46Omhhc0xFUSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc0xFUV87Ci19Ci0KLWludAotbGVmaVBpbjo6aGFzRGlyZWN0aW9uKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzRGlyZWN0aW9uXzsKLX0KLQotaW50Ci1sZWZpUGluOjpoYXNVc2UoKSBjb25zdAotewotICAgIHJldHVybiBoYXNVc2VfOwotfQotCi1pbnQKLWxlZmlQaW46Omhhc1NoYXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzU2hhcGVfOwotfQotCi1pbnQKLWxlZmlQaW46Omhhc011c3Rqb2luKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzTXVzdGpvaW5fOwotfQotCi1pbnQKLWxlZmlQaW46Omhhc091dE1hcmdpbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc091dE1hcmdpbl87Ci19Ci0KLWludAotbGVmaVBpbjo6aGFzT3V0UmVzaXN0YW5jZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc091dFJlc2lzdGFuY2VfOwotfQotCi1pbnQKLWxlZmlQaW46Omhhc0luTWFyZ2luKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzSW5NYXJnaW5fOwotfQotCi1pbnQKLWxlZmlQaW46Omhhc1Bvd2VyKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzUG93ZXJfOwotfQotCi1pbnQKLWxlZmlQaW46Omhhc0xlYWthZ2UoKSBjb25zdAotewotICAgIHJldHVybiBoYXNMZWFrYWdlXzsKLX0KLQotaW50Ci1sZWZpUGluOjpoYXNNYXhsb2FkKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzTWF4bG9hZF87Ci19Ci0KLWludAotbGVmaVBpbjo6aGFzTWF4ZGVsYXkoKSBjb25zdAotewotICAgIHJldHVybiBoYXNNYXhkZWxheV87Ci19Ci0KLWludAotbGVmaVBpbjo6aGFzQ2FwYWNpdGFuY2UoKSBjb25zdAotewotICAgIHJldHVybiBoYXNDYXBhY2l0YW5jZV87Ci19Ci0KLWludAotbGVmaVBpbjo6aGFzUmVzaXN0YW5jZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc1Jlc2lzdGFuY2VfOwotfQotCi1pbnQKLWxlZmlQaW46Omhhc1B1bGxkb3ducmVzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzUHVsbGRvd25yZXNfOwotfQotCi1pbnQKLWxlZmlQaW46Omhhc1RpZW9mZnIoKSBjb25zdAotewotICAgIHJldHVybiBoYXNUaWVvZmZyXzsKLX0KLQotaW50Ci1sZWZpUGluOjpoYXNWSEkoKSBjb25zdAotewotICAgIHJldHVybiBoYXNWSElfOwotfQotCi1pbnQKLWxlZmlQaW46Omhhc1ZMTygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc1ZMT187Ci19Ci0KLWludAotbGVmaVBpbjo6aGFzRmFsbFNsZXdMaW1pdCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc0ZhbGxTbGV3TGltaXRfOwotfQotCi1pbnQKLWxlZmlQaW46Omhhc1Jpc2VTbGV3TGltaXQoKSBjb25zdAotewotICAgIHJldHVybiBoYXNSaXNlU2xld0xpbWl0XzsKLX0KLQotaW50Ci1sZWZpUGluOjpoYXNSaXNlVm9sdGFnZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc1Jpc2VWb2x0YWdlXzsKLX0KLQotaW50Ci1sZWZpUGluOjpoYXNGYWxsVm9sdGFnZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc0ZhbGxWb2x0YWdlXzsKLX0KLQotaW50Ci1sZWZpUGluOjpoYXNSaXNlVGhyZXNoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzUmlzZVRocmVzaF87Ci19Ci0KLWludAotbGVmaVBpbjo6aGFzRmFsbFRocmVzaCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc0ZhbGxUaHJlc2hfOwotfQotCi1pbnQKLWxlZmlQaW46Omhhc1Jpc2VTYXRjdXIoKSBjb25zdAotewotICAgIHJldHVybiBoYXNSaXNlU2F0Y3VyXzsKLX0KLQotaW50Ci1sZWZpUGluOjpoYXNGYWxsU2F0Y3VyKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzRmFsbFNhdGN1cl87Ci19Ci0KLWludAotbGVmaVBpbjo6aGFzQ3VycmVudFNvdXJjZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc0N1cnJlbnRTb3VyY2VfOwotfQotCi1pbnQKLWxlZmlQaW46Omhhc1RhYmxlcygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc1RhYmxlc187Ci19Ci0KLWludAotbGVmaVBpbjo6aGFzQW50ZW5uYVNpemUoKSBjb25zdAotewotICAgIHJldHVybiBudW1BbnRlbm5hU2l6ZV8gPyAxIDogMDsKLX0KLQotaW50Ci1sZWZpUGluOjpoYXNBbnRlbm5hTWV0YWxMZW5ndGgoKSBjb25zdAotewotICAgIHJldHVybiBudW1BbnRlbm5hTWV0YWxMZW5ndGhfID8gMSA6IDA7Ci19Ci0KLWludAotbGVmaVBpbjo6aGFzQW50ZW5uYU1ldGFsQXJlYSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG51bUFudGVubmFNZXRhbEFyZWFfID8gMSA6IDA7Ci19Ci0KLWludAotbGVmaVBpbjo6aGFzQW50ZW5uYVBhcnRpYWxNZXRhbEFyZWEoKSBjb25zdAotewotICAgIHJldHVybiBudW1BbnRlbm5hUGFydGlhbE1ldGFsQXJlYV8gPyAxIDogMDsKLX0KLQotaW50Ci1sZWZpUGluOjpoYXNBbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWEoKSBjb25zdAotewotICAgIHJldHVybiBudW1BbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWFfID8gMSA6IDA7Ci19Ci0KLWludAotbGVmaVBpbjo6aGFzQW50ZW5uYVBhcnRpYWxDdXRBcmVhKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbnVtQW50ZW5uYVBhcnRpYWxDdXRBcmVhXyA/IDEgOiAwOwotfQotCi1pbnQKLWxlZmlQaW46Omhhc0FudGVubmFEaWZmQXJlYSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG51bUFudGVubmFEaWZmQXJlYV8gPyAxIDogMDsKLX0KLQotaW50Ci1sZWZpUGluOjpoYXNBbnRlbm5hTW9kZWwoKSBjb25zdAotewotICAgIHJldHVybiBhbnRlbm5hTW9kZWxfID8gMSA6IDA7Ci19Ci0KLWludAotbGVmaVBpbjo6aGFzVGFwZXJSdWxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gdGFwZXJSdWxlXyA/IDEgOiAwOwotfQotCi1pbnQKLWxlZmlQaW46Omhhc05ldEV4cHIoKSBjb25zdAotewotICAgIHJldHVybiBuZXRFcHhyXyA/IDEgOiAwOwotfQotCi1pbnQKLWxlZmlQaW46Omhhc1N1cHBseVNlbnNpdGl2aXR5KCkgY29uc3QKLXsKLSAgICByZXR1cm4gc3NQaW5OYW1lXyA/IDEgOiAwOwotfQotCi1pbnQKLWxlZmlQaW46Omhhc0dyb3VuZFNlbnNpdGl2aXR5KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ3NQaW5OYW1lXyA/IDEgOiAwOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlQaW46Om5hbWUoKSBjb25zdAotewotICAgIHJldHVybiBuYW1lXzsKLX0KLQotY29uc3QgY2hhciAqCi1sZWZpUGluOjp0YXBlclJ1bGUoKSBjb25zdAotewotICAgIHJldHVybiB0YXBlclJ1bGVfOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlQaW46Om5ldEV4cHIoKSBjb25zdAotewotICAgIHJldHVybiBuZXRFcHhyXzsKLX0KLQotY29uc3QgY2hhciAqCi1sZWZpUGluOjpzdXBwbHlTZW5zaXRpdml0eSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHNzUGluTmFtZV87Ci19Ci0KLWNvbnN0IGNoYXIgKgotbGVmaVBpbjo6Z3JvdW5kU2Vuc2l0aXZpdHkoKSBjb25zdAotewotICAgIHJldHVybiBnc1Bpbk5hbWVfOwotfQotCi1pbnQKLWxlZmlQaW46Om51bVBvcnRzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbnVtUG9ydHNfOwotfQotCi1sZWZpR2VvbWV0cmllcyAqCi1sZWZpUGluOjpwb3J0KGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjaGFyIG1zZ1sxNjBdOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBudW1Qb3J0c18pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xMzUwKTogVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIG1hY3JvIFBJTiBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bVBvcnRzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxMzUwLCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHBvcnRzX1tpbmRleF07Ci19Ci0KLWludAotbGVmaVBpbjo6bnVtRm9yZWlnbnMoKSBjb25zdAotewotICAgIHJldHVybiBudW1Gb3JlaWduc187Ci19Ci0KLWNvbnN0IGNoYXIgKgotbGVmaVBpbjo6Zm9yZWlnbk5hbWUoaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiBmb3JlaWduX1tpbmRleF07Ci19Ci0KLWludAotbGVmaVBpbjo6Zm9yZWlnbk9yaWVudChpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZvcmVpZ25PcmllbnRfW2luZGV4XTsKLX0KLQotY29uc3QgY2hhciAqCi1sZWZpUGluOjpmb3JlaWduT3JpZW50U3RyKGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gKGxlZmlPcmllbnRTdHIoZm9yZWlnbk9yaWVudF9baW5kZXhdKSk7Ci19Ci0KLWRvdWJsZQotbGVmaVBpbjo6Zm9yZWlnblgoaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiBmb3JlaWduWF9baW5kZXhdOwotfQotCi1kb3VibGUKLWxlZmlQaW46OmZvcmVpZ25ZKGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gZm9yZWlnbllfW2luZGV4XTsKLX0KLQotY29uc3QgY2hhciAqCi1sZWZpUGluOjpMRVEoKSBjb25zdAotewotICAgIHJldHVybiBMRVFfOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlQaW46OmRpcmVjdGlvbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGRpcmVjdGlvbl87Ci19Ci0KLWNvbnN0IGNoYXIgKgotbGVmaVBpbjo6dXNlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gdXNlXzsKLX0KLQotY29uc3QgY2hhciAqCi1sZWZpUGluOjpzaGFwZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHNoYXBlXzsKLX0KLQotY29uc3QgY2hhciAqCi1sZWZpUGluOjptdXN0am9pbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG11c3Rqb2luXzsKLX0KLQotZG91YmxlCi1sZWZpUGluOjpvdXRNYXJnaW5IaWdoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gb3V0TWFyZ2luSF87Ci19Ci0KLWRvdWJsZQotbGVmaVBpbjo6b3V0TWFyZ2luTG93KCkgY29uc3QKLXsKLSAgICByZXR1cm4gb3V0TWFyZ2luTF87Ci19Ci0KLWRvdWJsZQotbGVmaVBpbjo6b3V0UmVzaXN0YW5jZUhpZ2goKSBjb25zdAotewotICAgIHJldHVybiBvdXRSZXNpc3RhbmNlSF87Ci19Ci0KLWRvdWJsZQotbGVmaVBpbjo6b3V0UmVzaXN0YW5jZUxvdygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG91dFJlc2lzdGFuY2VMXzsKLX0KLQotZG91YmxlCi1sZWZpUGluOjppbk1hcmdpbkhpZ2goKSBjb25zdAotewotICAgIHJldHVybiBpbk1hcmdpbkhfOwotfQotCi1kb3VibGUKLWxlZmlQaW46OmluTWFyZ2luTG93KCkgY29uc3QKLXsKLSAgICByZXR1cm4gaW5NYXJnaW5MXzsKLX0KLQotZG91YmxlCi1sZWZpUGluOjpwb3dlcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHBvd2VyXzsKLX0KLQotZG91YmxlCi1sZWZpUGluOjpsZWFrYWdlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbGVha2FnZV87Ci19Ci0KLWRvdWJsZQotbGVmaVBpbjo6bWF4bG9hZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1heGxvYWRfOwotfQotCi1kb3VibGUKLWxlZmlQaW46Om1heGRlbGF5KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbWF4ZGVsYXlfOwotfQotCi1kb3VibGUKLWxlZmlQaW46OmNhcGFjaXRhbmNlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gY2FwYWNpdGFuY2VfOwotfQotCi1kb3VibGUKLWxlZmlQaW46OnJlc2lzdGFuY2UoKSBjb25zdAotewotICAgIHJldHVybiByZXNpc3RhbmNlXzsKLX0KLQotZG91YmxlCi1sZWZpUGluOjpwdWxsZG93bnJlcygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHB1bGxkb3ducmVzXzsKLX0KLQotZG91YmxlCi1sZWZpUGluOjp0aWVvZmZyKCkgY29uc3QKLXsKLSAgICByZXR1cm4gdGllb2Zmcl87Ci19Ci0KLWRvdWJsZQotbGVmaVBpbjo6VkhJKCkgY29uc3QKLXsKLSAgICByZXR1cm4gVkhJXzsKLX0KLQotZG91YmxlCi1sZWZpUGluOjpWTE8oKSBjb25zdAotewotICAgIHJldHVybiBWTE9fOwotfQotCi1kb3VibGUKLWxlZmlQaW46OmZhbGxTbGV3TGltaXQoKSBjb25zdAotewotICAgIHJldHVybiBmYWxsU2xld0xpbWl0XzsKLX0KLQotZG91YmxlCi1sZWZpUGluOjpyaXNlU2xld0xpbWl0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gcmlzZVNsZXdMaW1pdF87Ci19Ci0KLWRvdWJsZQotbGVmaVBpbjo6cmlzZVZvbHRhZ2UoKSBjb25zdAotewotICAgIHJldHVybiByaXNlVm9sdGFnZV87Ci19Ci0KLWRvdWJsZQotbGVmaVBpbjo6ZmFsbFZvbHRhZ2UoKSBjb25zdAotewotICAgIHJldHVybiBmYWxsVm9sdGFnZV87Ci19Ci0KLWRvdWJsZQotbGVmaVBpbjo6cmlzZVRocmVzaCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJpc2VUaHJlc2hfOwotfQotCi1kb3VibGUKLWxlZmlQaW46OmZhbGxUaHJlc2goKSBjb25zdAotewotICAgIHJldHVybiBmYWxsVGhyZXNoXzsKLX0KLQotZG91YmxlCi1sZWZpUGluOjpyaXNlU2F0Y3VyKCkgY29uc3QKLXsKLSAgICByZXR1cm4gcmlzZVNhdGN1cl87Ci19Ci0KLWRvdWJsZQotbGVmaVBpbjo6ZmFsbFNhdGN1cigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbGxTYXRjdXJfOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlQaW46OmN1cnJlbnRTb3VyY2UoKSBjb25zdAotewotICAgIHJldHVybiBjdXJyZW50U291cmNlXzsKLX0KLQotY29uc3QgY2hhciAqCi1sZWZpUGluOjp0YWJsZUhpZ2hOYW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGlnaFRhYmxlXzsKLX0KLQotY29uc3QgY2hhciAqCi1sZWZpUGluOjp0YWJsZUxvd05hbWUoKSBjb25zdAotewotICAgIHJldHVybiBsb3dUYWJsZV87Ci19Ci0KLWNvbnN0IGNoYXIgKgotbGVmaVBpbjo6YW50ZW5uYVNpemVMYXllcihpbnQgaSkgY29uc3QKLXsKLSAgICByZXR1cm4gYW50ZW5uYVNpemVMYXllcl9baV07Ci19Ci0KLWNvbnN0IGNoYXIgKgotbGVmaVBpbjo6YW50ZW5uYU1ldGFsQXJlYUxheWVyKGludCBpKSBjb25zdAotewotICAgIHJldHVybiBhbnRlbm5hTWV0YWxBcmVhTGF5ZXJfW2ldOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlQaW46OmFudGVubmFNZXRhbExlbmd0aExheWVyKGludCBpKSBjb25zdAotewotICAgIHJldHVybiBhbnRlbm5hTWV0YWxMZW5ndGhMYXllcl9baV07Ci19Ci0KLWNvbnN0IGNoYXIgKgotbGVmaVBpbjo6YW50ZW5uYVBhcnRpYWxNZXRhbEFyZWFMYXllcihpbnQgaSkgY29uc3QKLXsKLSAgICByZXR1cm4gYW50ZW5uYVBhcnRpYWxNZXRhbEFyZWFMYXllcl9baV07Ci19Ci0KLWNvbnN0IGNoYXIgKgotbGVmaVBpbjo6YW50ZW5uYVBhcnRpYWxNZXRhbFNpZGVBcmVhTGF5ZXIoaW50IGkpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGFudGVubmFQYXJ0aWFsTWV0YWxTaWRlQXJlYUxheWVyX1tpXTsKLX0KLQotY29uc3QgY2hhciAqCi1sZWZpUGluOjphbnRlbm5hUGFydGlhbEN1dEFyZWFMYXllcihpbnQgaSkgY29uc3QKLXsKLSAgICByZXR1cm4gYW50ZW5uYVBhcnRpYWxDdXRBcmVhTGF5ZXJfW2ldOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlQaW46OmFudGVubmFEaWZmQXJlYUxheWVyKGludCBpKSBjb25zdAotewotICAgIHJldHVybiBhbnRlbm5hRGlmZkFyZWFMYXllcl9baV07Ci19Ci0KLWludAotbGVmaVBpbjo6bnVtQW50ZW5uYVNpemUoKSBjb25zdAotewotICAgIHJldHVybiBudW1BbnRlbm5hU2l6ZV87Ci19Ci0KLWludAotbGVmaVBpbjo6bnVtQW50ZW5uYU1ldGFsQXJlYSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG51bUFudGVubmFNZXRhbEFyZWFfOwotfQotCi1pbnQKLWxlZmlQaW46Om51bUFudGVubmFNZXRhbExlbmd0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG51bUFudGVubmFNZXRhbExlbmd0aF87Ci19Ci0KLWludAotbGVmaVBpbjo6bnVtQW50ZW5uYVBhcnRpYWxNZXRhbEFyZWEoKSBjb25zdAotewotICAgIHJldHVybiBudW1BbnRlbm5hUGFydGlhbE1ldGFsQXJlYV87Ci19Ci0KLWludAotbGVmaVBpbjo6bnVtQW50ZW5uYVBhcnRpYWxNZXRhbFNpZGVBcmVhKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbnVtQW50ZW5uYVBhcnRpYWxNZXRhbFNpZGVBcmVhXzsKLX0KLQotaW50Ci1sZWZpUGluOjpudW1BbnRlbm5hUGFydGlhbEN1dEFyZWEoKSBjb25zdAotewotICAgIHJldHVybiBudW1BbnRlbm5hUGFydGlhbEN1dEFyZWFfOwotfQotCi1pbnQKLWxlZmlQaW46Om51bUFudGVubmFEaWZmQXJlYSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG51bUFudGVubmFEaWZmQXJlYV87Ci19Ci0KLWRvdWJsZQotbGVmaVBpbjo6YW50ZW5uYVNpemUoaW50IGkpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGFudGVubmFTaXplX1tpXTsKLX0KLQotZG91YmxlCi1sZWZpUGluOjphbnRlbm5hTWV0YWxBcmVhKGludCBpKSBjb25zdAotewotICAgIHJldHVybiBhbnRlbm5hTWV0YWxBcmVhX1tpXTsKLX0KLQotZG91YmxlCi1sZWZpUGluOjphbnRlbm5hTWV0YWxMZW5ndGgoaW50IGkpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGFudGVubmFNZXRhbExlbmd0aF9baV07Ci19Ci0KLWRvdWJsZQotbGVmaVBpbjo6YW50ZW5uYVBhcnRpYWxNZXRhbEFyZWEoaW50IGkpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGFudGVubmFQYXJ0aWFsTWV0YWxBcmVhX1tpXTsKLX0KLQotZG91YmxlCi1sZWZpUGluOjphbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWEoaW50IGkpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGFudGVubmFQYXJ0aWFsTWV0YWxTaWRlQXJlYV9baV07Ci19Ci0KLWRvdWJsZQotbGVmaVBpbjo6YW50ZW5uYVBhcnRpYWxDdXRBcmVhKGludCBpKSBjb25zdAotewotICAgIHJldHVybiBhbnRlbm5hUGFydGlhbEN1dEFyZWFfW2ldOwotfQotCi1kb3VibGUKLWxlZmlQaW46OmFudGVubmFEaWZmQXJlYShpbnQgaSkgY29uc3QKLXsKLSAgICByZXR1cm4gYW50ZW5uYURpZmZBcmVhX1tpXTsKLX0KLQotdm9pZAotbGVmaVBpbjo6YWRkQW50ZW5uYU1ldGFsTGVuZ3RoKGRvdWJsZSAgICAgICB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICpsYXllcikKLXsKLSAgICBpbnQgbGVuOwotICAgIGlmIChudW1BbnRlbm5hTWV0YWxMZW5ndGhfID09IGFudGVubmFNZXRhbExlbmd0aEFsbG9jYXRlZF8pIHsKLSAgICAgICAgaW50ICAgICBpOwotICAgICAgICBpbnQgICAgIG1heDsKLSAgICAgICAgaW50ICAgICBsaW0gPSBudW1BbnRlbm5hTWV0YWxMZW5ndGhfOwotICAgICAgICBkb3VibGUgICpuZDsKLSAgICAgICAgY2hhciAgICAqKm5sOwotCi0gICAgICAgIGlmIChhbnRlbm5hTWV0YWxMZW5ndGhBbGxvY2F0ZWRfID09IDApCi0gICAgICAgICAgICBtYXggPSBhbnRlbm5hTWV0YWxMZW5ndGhBbGxvY2F0ZWRfID0gMjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbWF4ID0gYW50ZW5uYU1ldGFsTGVuZ3RoQWxsb2NhdGVkXyAqPSAyOwotICAgICAgICBuZCA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBtYXgpOwotICAgICAgICBubCA9IChjaGFyKiopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIG1heCk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW07IGkrKykgewotICAgICAgICAgICAgbmxbaV0gPSBhbnRlbm5hTWV0YWxMZW5ndGhMYXllcl9baV07Ci0gICAgICAgICAgICBuZFtpXSA9IGFudGVubmFNZXRhbExlbmd0aF9baV07Ci0gICAgICAgIH0KLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChhbnRlbm5hTWV0YWxMZW5ndGhMYXllcl8pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChhbnRlbm5hTWV0YWxMZW5ndGhfKSk7Ci0gICAgICAgIGFudGVubmFNZXRhbExlbmd0aExheWVyXyA9IG5sOwotICAgICAgICBhbnRlbm5hTWV0YWxMZW5ndGhfID0gbmQ7Ci0gICAgfQotICAgIGFudGVubmFNZXRhbExlbmd0aF9bbnVtQW50ZW5uYU1ldGFsTGVuZ3RoX10gPSB2YWw7Ci0gICAgaWYgKGxheWVyKSB7ICAgIC8vIGxheWVyIGNhbiBiZSBudWxsLCBzaW5jZSBpdCBpcyBvcHRpb25hbAotICAgICAgICBsZW4gPSBzdHJsZW4obGF5ZXIpICsgMTsKLSAgICAgICAgYW50ZW5uYU1ldGFsTGVuZ3RoTGF5ZXJfW251bUFudGVubmFNZXRhbExlbmd0aF9dID0KLSAgICAgICAgICAgIChjaGFyKikgbGVmTWFsbG9jKGxlbik7Ci0gICAgICAgIHN0cmNweShhbnRlbm5hTWV0YWxMZW5ndGhMYXllcl9bbnVtQW50ZW5uYU1ldGFsTGVuZ3RoX10sCi0gICAgICAgICAgICAgICBsYXllcik7Ci0gICAgfSBlbHNlCi0gICAgICAgIGFudGVubmFNZXRhbExlbmd0aExheWVyX1tudW1BbnRlbm5hTWV0YWxMZW5ndGhfXSA9IE5VTEw7Ci0gICAgbnVtQW50ZW5uYU1ldGFsTGVuZ3RoXyArPSAxOwotfQotCi0vLyA1LjUKLXZvaWQKLWxlZmlQaW46OmFkZEFudGVubmFNb2RlbChpbnQgb3hpZGUpCi17Ci0gICAgLy8gRm9yIHZlcnNpb24gNS41IG9ubHkgT1hJREUxLCBPWElERTIsIE9YSURFMywgJiBPWElERTQKLSAgICAvLyBhcmUgZGVmaW5lZCB3aXRoaW4gYSBtYWNybyBwaW4KLSAgICBsZWZpUGluQW50ZW5uYU1vZGVsICphbW87Ci0gICAgaW50ICAgICAgICAgICAgICAgICBpOwotCi0gICAgaWYgKG51bUFudGVubmFNb2RlbF8gPT0gMCkgeyAgIC8vIGRvZXMgbm90IGhhdmUgYW50ZW5uYU1vZGVsCi0gICAgICAgIGFudGVubmFNb2RlbF8gPSAobGVmaVBpbkFudGVubmFNb2RlbCoqKQotICAgICAgICAgICAgbGVmTWFsbG9jKHNpemVvZihsZWZpUGluQW50ZW5uYU1vZGVsKikgKiA0KTsKLSAgICAgICAgYW50ZW5uYU1vZGVsQWxsb2NhdGVkXyA9IDQ7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgICAgICAgIGFudGVubmFNb2RlbF9baV0gPSAobGVmaVBpbkFudGVubmFNb2RlbCopCi0gICAgICAgICAgICAgICAgbGVmTWFsbG9jKHNpemVvZihsZWZpUGluQW50ZW5uYU1vZGVsKSk7Ci0gICAgICAgICAgICBhbnRlbm5hTW9kZWxfW2ldLT5zZXRBbnRlbm5hTW9kZWwoMCk7Ci0gICAgICAgICAgICAvLyBqdXN0IGluaXRpYWxpemUgaXQgZmlyc3QKLSAgICAgICAgfQotICAgICAgICBhbnRlbm5hTW9kZWxBbGxvY2F0ZWRfID0gNDsKLSAgICAgICAgYW1vID0gYW50ZW5uYU1vZGVsX1swXTsKLSAgICAgICAgY3VyQW50ZW5uYU1vZGVsSW5kZXhfID0gMDsKLSAgICB9IAotCi0gICAgLy8gRmlyc3QgY2FuIGdvIGFueSBveGlkZSwgc28gZmlsbCBwcmVmIG94aWRlcyBtb2RlbHMuCi0gICAgZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgb3hpZGUgLSAxOyBpZHgrKykgewotICAgICAgICBhbW8gPSBhbnRlbm5hTW9kZWxfW2lkeF07Ci0gICAgICAgIGlmICghYW1vLT5hbnRlbm5hT3hpZGUoKSkgewotICAgICAgICAgICAgYW1vLT5Jbml0KCk7Ci0gICAgICAgICAgICBhbW8tPnNldEFudGVubmFNb2RlbChpZHggKyAxKTsgICAKLSAgICAgICAgfQotICAgIH0KLQotICAgICAgICBhbW8gPSBhbnRlbm5hTW9kZWxfW294aWRlIC0gMV07Ci0gICAgICAgIGN1ckFudGVubmFNb2RlbEluZGV4XyA9IG94aWRlIC0gMTsKLSAgICAgICAgLy8gT3hpZGUgaGFzIG5vdCBkZWZpbmVkIHlldAotICAgIGlmIChhbW8tPmFudGVubmFPeGlkZSgpKSB7Ci0gICAgICAgICAgICBhbW8tPmNsZWFyKCk7Ci0gICAgICAgIH0KLQotICAgIGlmIChveGlkZSA+IG51bUFudGVubmFNb2RlbF8pIHsKLSAgICAgICAgbnVtQW50ZW5uYU1vZGVsXyA9IG94aWRlOwotICAgIH0KLQotICAgIGFtby0+SW5pdCgpOwotICAgIGFtby0+c2V0QW50ZW5uYU1vZGVsKG94aWRlKTsKLSAgICByZXR1cm47Ci19Ci0KLS8vIDUuNQotaW50Ci1sZWZpUGluOjpudW1BbnRlbm5hTW9kZWwoKSBjb25zdAotewotICAgIHJldHVybiBudW1BbnRlbm5hTW9kZWxfOwotfQotCi0vLyA1LjUKLWxlZmlQaW5BbnRlbm5hTW9kZWwgKgotbGVmaVBpbjo6YW50ZW5uYU1vZGVsKGludCBpbmRleCkgY29uc3QKLXsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGogPSBpbmRleDsKLSAgICBsZWZpUGluQW50ZW5uYU1vZGVsICphbW87Ci0KLSAgICBpZiAoaW5kZXggPT0gMCkgeyAgIC8vIHJlc2V0IGFsbCB0aGUgcmV0dXJuIGZsYWdzIHRvIDAsIGJlZ2lubmluZyBvZiB0aGUgbG9vcAotICAgICAgICBpbnQgaTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgICAgIGFudGVubmFNb2RlbF9baV0tPnNldEFudGVubmFSZXR1cm5GbGFnKDApOwotICAgIH0KLSAgICB3aGlsZSAoaiA8IDQpIHsKLSAgICAgICAgYW1vID0gYW50ZW5uYU1vZGVsX1tqXTsKLSAgICAgICAgaWYgKCEoYW1vLT5hbnRlbm5hT3hpZGUoKSkgJiYKLSAgICAgICAgICAgIChhbW8tPmhhc1JldHVybigpID09IDApKQotICAgICAgICAgICAgaisrOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgaWYgKGogPT0gNCkgeyAgLy8gc29tZXRoaW5nIHZlcnkgd3JvbmcsIG5vcm1hbGx5IHRoaXMgY2FuJ3QgaGFwcGVuCi0gICAgICAgICAgICBsZWZpRXJyb3IoMCwgMTM1MSwgIkVSUk9SIChMRUZQQVJTLTEzNTEpOiBUaGVyZSBpcyBhbiB1bmV4cGVjdGVkIGxlZiBwYXJzZXIgYnVnIHdoaWNoIGNhdXNlIGl0IHVuYWJsZSB0byByZXRyaWV2ZSBBTlRFTk5BTU9ERUwgZGF0YSB3aXRoIHRoZSBnaXZlbiBpbmRleC4iKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotICAgIC8vIElmIGl0IGFycml2ZWQgaGVyZSwgaXQgaXMgc2F2ZWQsIG1hcmsgdGhlIGFudGVubmFNb2RlbCBoYXMgcmV0dXJuZWQKLSAgICBhbnRlbm5hTW9kZWxfW2pdLT5zZXRBbnRlbm5hUmV0dXJuRmxhZygxKTsKLSAgICByZXR1cm4gYW50ZW5uYU1vZGVsX1tqXTsKLX0KLQotdm9pZAotbGVmaVBpbjo6YWRkQW50ZW5uYVNpemUoZG91YmxlICAgICAgdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmxheWVyKQotewotICAgIGludCBsZW47Ci0gICAgaWYgKG51bUFudGVubmFTaXplXyA9PSBhbnRlbm5hU2l6ZUFsbG9jYXRlZF8pIHsKLSAgICAgICAgaW50ICAgICBpOwotICAgICAgICBpbnQgICAgIG1heDsKLSAgICAgICAgaW50ICAgICBsaW0gPSBudW1BbnRlbm5hU2l6ZV87Ci0gICAgICAgIGRvdWJsZSAgKm5kOwotICAgICAgICBjaGFyICAgICoqbmw7Ci0KLSAgICAgICAgaWYgKGFudGVubmFTaXplQWxsb2NhdGVkXyA9PSAwKQotICAgICAgICAgICAgbWF4ID0gYW50ZW5uYVNpemVBbGxvY2F0ZWRfID0gMjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbWF4ID0gYW50ZW5uYVNpemVBbGxvY2F0ZWRfICo9IDI7Ci0gICAgICAgIG5kID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIG1heCk7Ci0gICAgICAgIG5sID0gKGNoYXIqKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbWF4KTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbTsgaSsrKSB7Ci0gICAgICAgICAgICBubFtpXSA9IGFudGVubmFTaXplTGF5ZXJfW2ldOwotICAgICAgICAgICAgbmRbaV0gPSBhbnRlbm5hU2l6ZV9baV07Ci0gICAgICAgIH0KLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChhbnRlbm5hU2l6ZUxheWVyXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGFudGVubmFTaXplXykpOwotICAgICAgICBhbnRlbm5hU2l6ZUxheWVyXyA9IG5sOwotICAgICAgICBhbnRlbm5hU2l6ZV8gPSBuZDsKLSAgICB9Ci0gICAgYW50ZW5uYVNpemVfW251bUFudGVubmFTaXplX10gPSB2YWw7Ci0gICAgaWYgKGxheWVyKSB7ICAvLyBsYXllciBjYW4gYmUgbnVsbCwgc2luY2UgaXQgaXMgb3B0aW9uYWwKLSAgICAgICAgbGVuID0gc3RybGVuKGxheWVyKSArIDE7Ci0gICAgICAgIGFudGVubmFTaXplTGF5ZXJfW251bUFudGVubmFTaXplX10gPQotICAgICAgICAgICAgKGNoYXIqKSBsZWZNYWxsb2MobGVuKTsKLSAgICAgICAgc3RyY3B5KGFudGVubmFTaXplTGF5ZXJfW251bUFudGVubmFTaXplX10sCi0gICAgICAgICAgICAgICBsYXllcik7Ci0gICAgfSBlbHNlCi0gICAgICAgIGFudGVubmFTaXplTGF5ZXJfW251bUFudGVubmFTaXplX10gPSBOVUxMOwotICAgIG51bUFudGVubmFTaXplXyArPSAxOwotfQotCi12b2lkCi1sZWZpUGluOjphZGRBbnRlbm5hTWV0YWxBcmVhKGRvdWJsZSAgICAgdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpsYXllcikKLXsKLSAgICBpbnQgbGVuOwotICAgIGlmIChudW1BbnRlbm5hTWV0YWxBcmVhXyA9PSBhbnRlbm5hTWV0YWxBcmVhQWxsb2NhdGVkXykgewotICAgICAgICBpbnQgICAgIGk7Ci0gICAgICAgIGludCAgICAgbWF4OwotICAgICAgICBpbnQgICAgIGxpbSA9IG51bUFudGVubmFNZXRhbEFyZWFfOwotICAgICAgICBkb3VibGUgICpuZDsKLSAgICAgICAgY2hhciAgICAqKm5sOwotCi0gICAgICAgIGlmIChhbnRlbm5hTWV0YWxBcmVhQWxsb2NhdGVkXyA9PSAwKQotICAgICAgICAgICAgbWF4ID0gYW50ZW5uYU1ldGFsQXJlYUFsbG9jYXRlZF8gPSAyOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtYXggPSBhbnRlbm5hTWV0YWxBcmVhQWxsb2NhdGVkXyAqPSAyOwotICAgICAgICBuZCA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBtYXgpOwotICAgICAgICBubCA9IChjaGFyKiopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIG1heCk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW07IGkrKykgewotICAgICAgICAgICAgbmxbaV0gPSBhbnRlbm5hTWV0YWxBcmVhTGF5ZXJfW2ldOwotICAgICAgICAgICAgbmRbaV0gPSBhbnRlbm5hTWV0YWxBcmVhX1tpXTsKLSAgICAgICAgfQotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGFudGVubmFNZXRhbEFyZWFMYXllcl8pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChhbnRlbm5hTWV0YWxBcmVhXykpOwotICAgICAgICBhbnRlbm5hTWV0YWxBcmVhTGF5ZXJfID0gbmw7Ci0gICAgICAgIGFudGVubmFNZXRhbEFyZWFfID0gbmQ7Ci0gICAgfQotICAgIGFudGVubmFNZXRhbEFyZWFfW251bUFudGVubmFNZXRhbEFyZWFfXSA9IHZhbDsKLSAgICBpZiAobGF5ZXIpIHsgIC8vIGxheWVyIGNhbiBiZSBudWxsLCBzaW5jZSBpdCBpcyBvcHRpb25hbAotICAgICAgICBsZW4gPSBzdHJsZW4obGF5ZXIpICsgMTsKLSAgICAgICAgYW50ZW5uYU1ldGFsQXJlYUxheWVyX1tudW1BbnRlbm5hTWV0YWxBcmVhX10gPQotICAgICAgICAgICAgKGNoYXIqKSBsZWZNYWxsb2MobGVuKTsKLSAgICAgICAgc3RyY3B5KGFudGVubmFNZXRhbEFyZWFMYXllcl9bbnVtQW50ZW5uYU1ldGFsQXJlYV9dLAotICAgICAgICAgICAgICAgbGF5ZXIpOwotICAgIH0gZWxzZQotICAgICAgICBhbnRlbm5hTWV0YWxBcmVhTGF5ZXJfW251bUFudGVubmFNZXRhbEFyZWFfXSA9IE5VTEw7Ci0gICAgbnVtQW50ZW5uYU1ldGFsQXJlYV8gKz0gMTsKLX0KLQotdm9pZAotbGVmaVBpbjo6YWRkQW50ZW5uYVBhcnRpYWxNZXRhbEFyZWEoZG91YmxlICAgICAgdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmxheWVyKQotewotICAgIGludCBsZW47Ci0gICAgaWYgKG51bUFudGVubmFQYXJ0aWFsTWV0YWxBcmVhXyA9PSBhbnRlbm5hUGFydGlhbE1ldGFsQXJlYUFsbG9jYXRlZF8pIHsKLSAgICAgICAgaW50ICAgICBpOwotICAgICAgICBpbnQgICAgIG1heDsKLSAgICAgICAgaW50ICAgICBsaW0gPSBudW1BbnRlbm5hUGFydGlhbE1ldGFsQXJlYV87Ci0gICAgICAgIGRvdWJsZSAgKm5kOwotICAgICAgICBjaGFyICAgICoqbmw7Ci0KLSAgICAgICAgaWYgKGFudGVubmFQYXJ0aWFsTWV0YWxBcmVhQWxsb2NhdGVkXyA9PSAwKQotICAgICAgICAgICAgbWF4ID0gYW50ZW5uYVBhcnRpYWxNZXRhbEFyZWFBbGxvY2F0ZWRfID0gMjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbWF4ID0gYW50ZW5uYVBhcnRpYWxNZXRhbEFyZWFBbGxvY2F0ZWRfICo9IDI7Ci0gICAgICAgIG5kID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIG1heCk7Ci0gICAgICAgIG5sID0gKGNoYXIqKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbWF4KTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbTsgaSsrKSB7Ci0gICAgICAgICAgICBubFtpXSA9IGFudGVubmFQYXJ0aWFsTWV0YWxBcmVhTGF5ZXJfW2ldOwotICAgICAgICAgICAgbmRbaV0gPSBhbnRlbm5hUGFydGlhbE1ldGFsQXJlYV9baV07Ci0gICAgICAgIH0KLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChhbnRlbm5hUGFydGlhbE1ldGFsQXJlYUxheWVyXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGFudGVubmFQYXJ0aWFsTWV0YWxBcmVhXykpOwotICAgICAgICBhbnRlbm5hUGFydGlhbE1ldGFsQXJlYUxheWVyXyA9IG5sOwotICAgICAgICBhbnRlbm5hUGFydGlhbE1ldGFsQXJlYV8gPSBuZDsKLSAgICB9Ci0gICAgYW50ZW5uYVBhcnRpYWxNZXRhbEFyZWFfW251bUFudGVubmFQYXJ0aWFsTWV0YWxBcmVhX10gPSB2YWw7Ci0gICAgaWYgKGxheWVyKSB7ICAvLyBsYXllciBjYW4gYmUgbnVsbCwgc2luY2UgaXQgaXMgb3B0aW9uYWwKLSAgICAgICAgbGVuID0gc3RybGVuKGxheWVyKSArIDE7Ci0gICAgICAgIGFudGVubmFQYXJ0aWFsTWV0YWxBcmVhTGF5ZXJfW251bUFudGVubmFQYXJ0aWFsTWV0YWxBcmVhX10gPQotICAgICAgICAgICAgKGNoYXIqKSBsZWZNYWxsb2MobGVuKTsKLSAgICAgICAgc3RyY3B5KGFudGVubmFQYXJ0aWFsTWV0YWxBcmVhTGF5ZXJfW251bUFudGVubmFQYXJ0aWFsTWV0YWxBcmVhX10sCi0gICAgICAgICAgICAgICBsYXllcik7Ci0gICAgfSBlbHNlCi0gICAgICAgIGFudGVubmFQYXJ0aWFsTWV0YWxBcmVhTGF5ZXJfW251bUFudGVubmFQYXJ0aWFsTWV0YWxBcmVhX10gPSBOVUxMOwotICAgIG51bUFudGVubmFQYXJ0aWFsTWV0YWxBcmVhXyArPSAxOwotfQotCi12b2lkCi1sZWZpUGluOjphZGRBbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWEoZG91YmxlICAgICAgdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpsYXllcikKLXsKLSAgICBpbnQgbGVuOwotICAgIGlmIChudW1BbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWFfID09IGFudGVubmFQYXJ0aWFsTWV0YWxTaWRlQXJlYUFsbG9jYXRlZF8pIHsKLSAgICAgICAgaW50ICAgICBpOwotICAgICAgICBpbnQgICAgIG1heDsKLSAgICAgICAgaW50ICAgICBsaW0gPSBudW1BbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWFfOwotICAgICAgICBkb3VibGUgICpuZDsKLSAgICAgICAgY2hhciAgICAqKm5sOwotCi0gICAgICAgIGlmIChhbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWFBbGxvY2F0ZWRfID09IDApCi0gICAgICAgICAgICBtYXggPSBhbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWFBbGxvY2F0ZWRfID0gMjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbWF4ID0gYW50ZW5uYVBhcnRpYWxNZXRhbFNpZGVBcmVhQWxsb2NhdGVkXyAqPSAyOwotICAgICAgICBuZCA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBtYXgpOwotICAgICAgICBubCA9IChjaGFyKiopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIG1heCk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW07IGkrKykgewotICAgICAgICAgICAgbmxbaV0gPSBhbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWFMYXllcl9baV07Ci0gICAgICAgICAgICBuZFtpXSA9IGFudGVubmFQYXJ0aWFsTWV0YWxTaWRlQXJlYV9baV07Ci0gICAgICAgIH0KLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChhbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWFMYXllcl8pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChhbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWFfKSk7Ci0gICAgICAgIGFudGVubmFQYXJ0aWFsTWV0YWxTaWRlQXJlYUxheWVyXyA9IG5sOwotICAgICAgICBhbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWFfID0gbmQ7Ci0gICAgfQotICAgIGFudGVubmFQYXJ0aWFsTWV0YWxTaWRlQXJlYV9bbnVtQW50ZW5uYVBhcnRpYWxNZXRhbFNpZGVBcmVhX10gPSB2YWw7Ci0gICAgaWYgKGxheWVyKSB7ICAvLyBsYXllciBjYW4gYmUgbnVsbCwgc2luY2UgaXQgaXMgb3B0aW9uYWwKLSAgICAgICAgbGVuID0gc3RybGVuKGxheWVyKSArIDE7Ci0gICAgICAgIGFudGVubmFQYXJ0aWFsTWV0YWxTaWRlQXJlYUxheWVyX1tudW1BbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWFfXSA9Ci0gICAgICAgICAgICAoY2hhciopIGxlZk1hbGxvYyhsZW4pOwotICAgICAgICBzdHJjcHkoYW50ZW5uYVBhcnRpYWxNZXRhbFNpZGVBcmVhTGF5ZXJfW251bUFudGVubmFQYXJ0aWFsTWV0YWxTaWRlQXJlYV9dLAotICAgICAgICAgICAgICAgbGF5ZXIpOwotICAgIH0gZWxzZQotICAgICAgICBhbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWFMYXllcl9bbnVtQW50ZW5uYVBhcnRpYWxNZXRhbFNpZGVBcmVhX10gPSBOVUxMOwotICAgIG51bUFudGVubmFQYXJ0aWFsTWV0YWxTaWRlQXJlYV8gKz0gMTsKLX0KLQotdm9pZAotbGVmaVBpbjo6YWRkQW50ZW5uYVBhcnRpYWxDdXRBcmVhKGRvdWJsZSAgICAgICAgdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKmxheWVyKQotewotICAgIGludCBsZW47Ci0gICAgaWYgKG51bUFudGVubmFQYXJ0aWFsQ3V0QXJlYV8gPT0gYW50ZW5uYVBhcnRpYWxDdXRBcmVhQWxsb2NhdGVkXykgewotICAgICAgICBpbnQgICAgIGk7Ci0gICAgICAgIGludCAgICAgbWF4OwotICAgICAgICBpbnQgICAgIGxpbSA9IG51bUFudGVubmFQYXJ0aWFsQ3V0QXJlYV87Ci0gICAgICAgIGRvdWJsZSAgKm5kOwotICAgICAgICBjaGFyICAgICoqbmw7Ci0KLSAgICAgICAgaWYgKGFudGVubmFQYXJ0aWFsQ3V0QXJlYUFsbG9jYXRlZF8gPT0gMCkKLSAgICAgICAgICAgIG1heCA9IGFudGVubmFQYXJ0aWFsQ3V0QXJlYUFsbG9jYXRlZF8gPSAyOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtYXggPSBhbnRlbm5hUGFydGlhbEN1dEFyZWFBbGxvY2F0ZWRfICo9IDI7Ci0gICAgICAgIG5kID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIG1heCk7Ci0gICAgICAgIG5sID0gKGNoYXIqKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbWF4KTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbTsgaSsrKSB7Ci0gICAgICAgICAgICBubFtpXSA9IGFudGVubmFQYXJ0aWFsQ3V0QXJlYUxheWVyX1tpXTsKLSAgICAgICAgICAgIG5kW2ldID0gYW50ZW5uYVBhcnRpYWxDdXRBcmVhX1tpXTsKLSAgICAgICAgfQotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGFudGVubmFQYXJ0aWFsQ3V0QXJlYUxheWVyXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGFudGVubmFQYXJ0aWFsQ3V0QXJlYV8pKTsKLSAgICAgICAgYW50ZW5uYVBhcnRpYWxDdXRBcmVhTGF5ZXJfID0gbmw7Ci0gICAgICAgIGFudGVubmFQYXJ0aWFsQ3V0QXJlYV8gPSBuZDsKLSAgICB9Ci0gICAgYW50ZW5uYVBhcnRpYWxDdXRBcmVhX1tudW1BbnRlbm5hUGFydGlhbEN1dEFyZWFfXSA9IHZhbDsKLSAgICBpZiAobGF5ZXIpIHsgIC8vIGxheWVyIGNhbiBiZSBudWxsLCBzaW5jZSBpdCBpcyBvcHRpb25hbAotICAgICAgICBsZW4gPSBzdHJsZW4obGF5ZXIpICsgMTsKLSAgICAgICAgYW50ZW5uYVBhcnRpYWxDdXRBcmVhTGF5ZXJfW251bUFudGVubmFQYXJ0aWFsQ3V0QXJlYV9dID0KLSAgICAgICAgICAgIChjaGFyKikgbGVmTWFsbG9jKGxlbik7Ci0gICAgICAgIHN0cmNweShhbnRlbm5hUGFydGlhbEN1dEFyZWFMYXllcl9bbnVtQW50ZW5uYVBhcnRpYWxDdXRBcmVhX10sCi0gICAgICAgICAgICAgICBsYXllcik7Ci0gICAgfSBlbHNlCi0gICAgICAgIGFudGVubmFQYXJ0aWFsQ3V0QXJlYUxheWVyX1tudW1BbnRlbm5hUGFydGlhbEN1dEFyZWFfXSA9IE5VTEw7Ci0gICAgbnVtQW50ZW5uYVBhcnRpYWxDdXRBcmVhXyArPSAxOwotfQotCi12b2lkCi1sZWZpUGluOjphZGRBbnRlbm5hRGlmZkFyZWEoZG91YmxlICAgICAgdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpsYXllcikKLXsKLSAgICBpbnQgbGVuOwotICAgIGlmIChudW1BbnRlbm5hRGlmZkFyZWFfID09IGFudGVubmFEaWZmQXJlYUFsbG9jYXRlZF8pIHsKLSAgICAgICAgaW50ICAgICBpOwotICAgICAgICBpbnQgICAgIG1heDsKLSAgICAgICAgaW50ICAgICBsaW0gPSBudW1BbnRlbm5hRGlmZkFyZWFfOwotICAgICAgICBkb3VibGUgICpuZDsKLSAgICAgICAgY2hhciAgICAqKm5sOwotCi0gICAgICAgIGlmIChhbnRlbm5hRGlmZkFyZWFBbGxvY2F0ZWRfID09IDApCi0gICAgICAgICAgICBtYXggPSBhbnRlbm5hRGlmZkFyZWFBbGxvY2F0ZWRfID0gMjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbWF4ID0gYW50ZW5uYURpZmZBcmVhQWxsb2NhdGVkXyAqPSAyOwotICAgICAgICBuZCA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBtYXgpOwotICAgICAgICBubCA9IChjaGFyKiopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIG1heCk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW07IGkrKykgewotICAgICAgICAgICAgbmxbaV0gPSBhbnRlbm5hRGlmZkFyZWFMYXllcl9baV07Ci0gICAgICAgICAgICBuZFtpXSA9IGFudGVubmFEaWZmQXJlYV9baV07Ci0gICAgICAgIH0KLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChhbnRlbm5hRGlmZkFyZWFMYXllcl8pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChhbnRlbm5hRGlmZkFyZWFfKSk7Ci0gICAgICAgIGFudGVubmFEaWZmQXJlYUxheWVyXyA9IG5sOwotICAgICAgICBhbnRlbm5hRGlmZkFyZWFfID0gbmQ7Ci0gICAgfQotICAgIGFudGVubmFEaWZmQXJlYV9bbnVtQW50ZW5uYURpZmZBcmVhX10gPSB2YWw7Ci0gICAgaWYgKGxheWVyKSB7ICAvLyBsYXllciBjYW4gYmUgbnVsbCwgc2luY2UgaXQgaXMgb3B0aW9uYWwKLSAgICAgICAgbGVuID0gc3RybGVuKGxheWVyKSArIDE7Ci0gICAgICAgIGFudGVubmFEaWZmQXJlYUxheWVyX1tudW1BbnRlbm5hRGlmZkFyZWFfXSA9Ci0gICAgICAgICAgICAoY2hhciopIGxlZk1hbGxvYyhsZW4pOwotICAgICAgICBzdHJjcHkoYW50ZW5uYURpZmZBcmVhTGF5ZXJfW251bUFudGVubmFEaWZmQXJlYV9dLAotICAgICAgICAgICAgICAgbGF5ZXIpOwotICAgIH0gZWxzZQotICAgICAgICBhbnRlbm5hRGlmZkFyZWFMYXllcl9bbnVtQW50ZW5uYURpZmZBcmVhX10gPSBOVUxMOwotICAgIG51bUFudGVubmFEaWZmQXJlYV8gKz0gMTsKLX0KLQotdm9pZAotbGVmaVBpbjo6YWRkQW50ZW5uYUdhdGVBcmVhKGRvdWJsZSAgICAgIHZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqbGF5ZXIpCi17Ci0gICAgaWYgKG51bUFudGVubmFNb2RlbF8gPT0gMCkgICAgLy8gaGF2ZW4ndCBjcmVhdGVkIGFueSBhbnRlbm5hTW9kZWwgeWV0Ci0gICAgICAgIGFkZEFudGVubmFNb2RlbCgxKTsKLSAgICBhbnRlbm5hTW9kZWxfW2N1ckFudGVubmFNb2RlbEluZGV4X10tPmFkZEFudGVubmFHYXRlQXJlYSh2YWwsIGxheWVyKTsKLX0KLQotdm9pZAotbGVmaVBpbjo6YWRkQW50ZW5uYU1heEFyZWFDYXIoZG91YmxlICAgICAgICB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpsYXllcikKLXsKLSAgICBpZiAobnVtQW50ZW5uYU1vZGVsXyA9PSAwKSAgICAvLyBoYXZlbid0IGNyZWF0ZWQgYW55IGFudGVubmFNb2RlbCB5ZXQKLSAgICAgICAgYWRkQW50ZW5uYU1vZGVsKDEpOwotICAgIGFudGVubmFNb2RlbF9bY3VyQW50ZW5uYU1vZGVsSW5kZXhfXS0+YWRkQW50ZW5uYU1heEFyZWFDYXIodmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIpOwotfQotCi12b2lkCi1sZWZpUGluOjphZGRBbnRlbm5hTWF4U2lkZUFyZWFDYXIoZG91YmxlICAgICAgICB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqbGF5ZXIpCi17Ci0gICAgaWYgKG51bUFudGVubmFNb2RlbF8gPT0gMCkgICAgLy8gaGF2ZW4ndCBjcmVhdGVkIGFueSBhbnRlbm5hTW9kZWwgeWV0Ci0gICAgICAgIGFkZEFudGVubmFNb2RlbCgxKTsKLSAgICBhbnRlbm5hTW9kZWxfW2N1ckFudGVubmFNb2RlbEluZGV4X10tPmFkZEFudGVubmFNYXhTaWRlQXJlYUNhcih2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIpOwotfQotCi12b2lkCi1sZWZpUGluOjphZGRBbnRlbm5hTWF4Q3V0Q2FyKGRvdWJsZSAgICAgdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpsYXllcikKLXsKLSAgICBpZiAobnVtQW50ZW5uYU1vZGVsXyA9PSAwKSAgICAvLyBoYXZlbid0IGNyZWF0ZWQgYW55IGFudGVubmFNb2RlbCB5ZXQKLSAgICAgICAgYWRkQW50ZW5uYU1vZGVsKDEpOwotICAgIGFudGVubmFNb2RlbF9bY3VyQW50ZW5uYU1vZGVsSW5kZXhfXS0+YWRkQW50ZW5uYU1heEN1dENhcih2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyKTsKLX0KLQotaW50Ci1sZWZpUGluOjpudW1Qcm9wZXJ0aWVzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbnVtUHJvcGVydGllc187Ci19Ci0KLWNvbnN0IGNoYXIgKgotbGVmaVBpbjo6cHJvcE5hbWUoaW50IGluZGV4KSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1Qcm9wZXJ0aWVzXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzNTIpOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgbWFjcm8gcHJvcGVydHkgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGluZGV4LCBudW1Qcm9wZXJ0aWVzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxMzUyLCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHByb3BOYW1lc19baW5kZXhdOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlQaW46OnByb3BWYWx1ZShpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVByb3BlcnRpZXNfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTM1Mik6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBtYWNybyBwcm9wZXJ0eSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bVByb3BlcnRpZXNfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDEzNTIsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gcHJvcFZhbHVlc19baW5kZXhdOwotfQotCi1kb3VibGUKLWxlZmlQaW46OnByb3BOdW0oaW50IGluZGV4KSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1Qcm9wZXJ0aWVzXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzNTIpOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgbWFjcm8gcHJvcGVydHkgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGluZGV4LCBudW1Qcm9wZXJ0aWVzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxMzUyLCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHByb3BOdW1zX1tpbmRleF07Ci19Ci0KLWNvbnN0IGNoYXIKLWxlZmlQaW46OnByb3BUeXBlKGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjaGFyIG1zZ1sxNjBdOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtUHJvcGVydGllc18pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xMzUyKTogVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIG1hY3JvIHByb3BlcnR5IGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQiLCBpbmRleCwgbnVtUHJvcGVydGllc18pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTM1MiwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBwcm9wVHlwZXNfW2luZGV4XTsKLX0KLQotaW50Ci1sZWZpUGluOjpwcm9wSXNOdW1iZXIoaW50IGluZGV4KSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1Qcm9wZXJ0aWVzXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzNTIpOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgbWFjcm8gcHJvcGVydHkgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGluZGV4LCBudW1Qcm9wZXJ0aWVzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxMzUyLCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHByb3BOdW1zX1tpbmRleF0gPyAxIDogMDsKLX0KLQotaW50Ci1sZWZpUGluOjpwcm9wSXNTdHJpbmcoaW50IGluZGV4KSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1Qcm9wZXJ0aWVzXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzNTIpOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgbWFjcm8gcHJvcGVydHkgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGluZGV4LCBudW1Qcm9wZXJ0aWVzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxMzUyLCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHByb3BOdW1zX1tpbmRleF0gPyAwIDogMTsKLX0KLQotdm9pZAotbGVmaVBpbjo6cHJpbnQoRklMRSAqZikgY29uc3QKLXsKLSAgICBpbnQgICAgICAgICAgICAgaTsKLSAgICBsZWZpR2VvbWV0cmllcyAgKmc7Ci0KLSAgICBmcHJpbnRmKGYsICIgIFBpbiAlc1xuIiwgbmFtZSgpKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBudW1Qb3J0cygpOyBpKyspIHsKLSAgICAgICAgZnByaW50ZihmLCAiICAgIFBvcnQgJWQgIiwgaSk7Ci0gICAgICAgIGcgPSBwb3J0KGkpOwotICAgICAgICBnLT5wcmludChmKTsKLSAgICB9Ci0KLX0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIGxlZmlNYWNybwotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotbGVmaU1hY3JvOjpsZWZpTWFjcm8oKQotOiBuYW1lU2l6ZV8oMCksCi0gIG5hbWVfKE5VTEwpLAotICBnZW5lcmF0b3JTaXplXygwKSwKLSAgZ2VuZXJhdG9yXyhOVUxMKSwKLSAgaGFzQ2xhc3NfKDApLAotICBoYXNHZW5lcmF0b3JfKDApLAotICBoYXNHZW5lcmF0ZV8oMCksCi0gIGhhc1Bvd2VyXygwKSwKLSAgaGFzT3JpZ2luXygwKSwKLSAgaGFzU291cmNlXygwKSwKLSAgaGFzRUVRXygwKSwKLSAgaGFzTEVRXygwKSwKLSAgaGFzU3ltbWV0cnlfKDApLAotICBoYXNTaXRlTmFtZV8oMCksCi0gIGhhc1NpemVfKDApLAotICBoYXNDbG9ja1R5cGVfKDApLAotICBpc0J1ZmZlcl8oMCksCi0gIGlzSW52ZXJ0ZXJfKDApLAotICBFRVFfKE5VTEwpLAotICBFRVFTaXplXygwKSwKLSAgTEVRXyhOVUxMKSwKLSAgTEVRU2l6ZV8oMCksCi0gIGdlbjFfKE5VTEwpLAotICBnZW4xU2l6ZV8oMCksCi0gIGdlbjJfKE5VTEwpLAotICBnZW4yU2l6ZV8oMCksCi0gIHBvd2VyXygwLjApLAotICBvcmlnaW5YXygwLjApLAotICBvcmlnaW5ZXygwLjApLAotICBzaXplWF8oMC4wKSwKLSAgc2l6ZVlfKDAuMCksCi0gIG51bVNpdGVzXygwKSwKLSAgc2l0ZXNBbGxvY2F0ZWRfKDApLAotICBwYXR0ZXJuXyhOVUxMKSwKLSAgbnVtRm9yZWlnbnNfKDApLAotICBmb3JlaWduQWxsb2NhdGVkXygwKSwKLSAgaGFzRm9yZWlnbk9yaWdpbl8oTlVMTCksCi0gIGhhc0ZvcmVpZ25Qb2ludF8oTlVMTCksCi0gIGZvcmVpZ25PcmllbnRfKE5VTEwpLAotICBmb3JlaWduWF8oTlVMTCksCi0gIGZvcmVpZ25ZXyhOVUxMKSwKLSAgZm9yZWlnbl8oTlVMTCksCi0gIHNpdGVOYW1lU2l6ZV8oMCksCi0gIHNpdGVOYW1lXyhOVUxMKSwKLSAgY2xvY2tUeXBlXyhOVUxMKSwKLSAgY2xvY2tUeXBlU2l6ZV8oMCksCi0gIG51bVByb3BlcnRpZXNfKDApLAotICBwcm9wZXJ0aWVzQWxsb2NhdGVkXygwKSwKLSAgcHJvcE5hbWVzXyhOVUxMKSwKLSAgcHJvcFZhbHVlc18oTlVMTCksCi0gIHByb3BOdW1zXyhOVUxMKSwKLSAgcHJvcFR5cGVzXyhOVUxMKSwKLSAgaXNGaXhlZE1hc2tfKDApCi17Ci0gICAgSW5pdCgpOwotfQotCi12b2lkCi1sZWZpTWFjcm86OkluaXQoKQotewotICAgIG5hbWVfID0gMDsKLSAgICBnZW5lcmF0b3JfID0gMDsKLSAgICBFRVFfID0gMDsKLSAgICBMRVFfID0gMDsKLSAgICBnZW4xXyA9IDA7Ci0gICAgZ2VuMl8gPSAwOwotICAgIGZvcmVpZ25fID0gMDsKLSAgICBzaXRlTmFtZV8gPSAwOwotICAgIGNsb2NrVHlwZV8gPSAwOwotICAgIHByb3BOYW1lc18gPSAwOwotICAgIHByb3BWYWx1ZXNfID0gMDsKLSAgICBwcm9wVHlwZXNfID0gMDsKLQotICAgIGJ1bXAoJihuYW1lXyksIDE2LCAmKG5hbWVTaXplXykpOwotICAgIGJ1bXAoJihnZW5lcmF0b3JfKSwgMTYsICYoZ2VuZXJhdG9yU2l6ZV8pKTsKLSAgICBidW1wKCYoRUVRXyksIDE2LCAmKEVFUVNpemVfKSk7Ci0gICAgYnVtcCgmKExFUV8pLCAxNiwgJihMRVFTaXplXykpOwotICAgIGJ1bXAoJihnZW4xXyksIDE2LCAmKGdlbjFTaXplXykpOwotICAgIGJ1bXAoJihnZW4yXyksIDE2LCAmKGdlbjJTaXplXykpOwotICAgIGJ1bXAoJihzaXRlTmFtZV8pLCAxNiwgJihzaXRlTmFtZVNpemVfKSk7Ci0gICAgYnVtcCgmKGNsb2NrVHlwZV8pLCAxNiwgJihjbG9ja1R5cGVTaXplXykpOwotCi0gICAgcHJvcGVydGllc0FsbG9jYXRlZF8gPSAyOwotICAgIG51bVByb3BlcnRpZXNfID0gMDsKLSAgICBwcm9wTmFtZXNfID0gKGNoYXIqKikgbGVmTWFsbG9jKHNpemVvZihjaGFyKikgKiAyKTsKLSAgICBwcm9wVmFsdWVzXyA9IChjaGFyKiopIGxlZk1hbGxvYyhzaXplb2YoY2hhciopICogMik7Ci0gICAgcHJvcE51bXNfID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIDIpOwotICAgIHByb3BUeXBlc18gPSAoY2hhciopIGxlZk1hbGxvYyhzaXplb2YoY2hhcikgKiAyKTsKLQotICAgIG51bVNpdGVzXyA9IDA7Ci0gICAgc2l0ZXNBbGxvY2F0ZWRfID0gMDsKLSAgICBwYXR0ZXJuXyA9IDA7Ci0gICAgbnVtRm9yZWlnbnNfID0gMDsKLSAgICBmb3JlaWduQWxsb2NhdGVkXyA9IDA7Ci0gICAgaXNGaXhlZE1hc2tfID0gMDsKLQotICAgIGNsZWFyKCk7Ci19Ci0KLXZvaWQKLWxlZmlNYWNybzo6RGVzdHJveSgpCi17Ci0gICAgY2xlYXIoKTsKLSAgICBsZWZGcmVlKG5hbWVfKTsKLSAgICBsZWZGcmVlKGdlbmVyYXRvcl8pOwotICAgIGxlZkZyZWUoRUVRXyk7Ci0gICAgbGVmRnJlZShMRVFfKTsKLSAgICBsZWZGcmVlKGdlbjFfKTsKLSAgICBsZWZGcmVlKGdlbjJfKTsKLSAgICBsZWZGcmVlKHNpdGVOYW1lXyk7Ci0gICAgbGVmRnJlZShjbG9ja1R5cGVfKTsKLSAgICBsZWZGcmVlKChjaGFyKikgKHByb3BOYW1lc18pKTsKLSAgICBsZWZGcmVlKChjaGFyKikgKHByb3BWYWx1ZXNfKSk7Ci0gICAgbGVmRnJlZSgoY2hhciopIChwcm9wTnVtc18pKTsKLSAgICBsZWZGcmVlKChjaGFyKikgKHByb3BUeXBlc18pKTsKLSAgICBpZiAoZm9yZWlnbkFsbG9jYXRlZF8pIHsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChoYXNGb3JlaWduT3JpZ2luXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGhhc0ZvcmVpZ25Qb2ludF8pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChmb3JlaWduT3JpZW50XykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGZvcmVpZ25YXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGZvcmVpZ25ZXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGZvcmVpZ25fKSk7Ci0gICAgICAgIGZvcmVpZ25BbGxvY2F0ZWRfID0gMDsKLSAgICB9Ci19Ci0KLWxlZmlNYWNybzo6fmxlZmlNYWNybygpCi17Ci0gICAgRGVzdHJveSgpOwotfQotCi12b2lkCi1sZWZpTWFjcm86OmNsZWFyKCkKLXsKLSAgICBpbnQgaTsKLQotICAgIGhhc0NsYXNzXyA9IDA7Ci0gICAgaGFzR2VuZXJhdG9yXyA9IDA7Ci0gICAgaGFzR2VuZXJhdGVfID0gMDsKLSAgICBoYXNQb3dlcl8gPSAwOwotICAgIGhhc09yaWdpbl8gPSAwOwotICAgIGhhc1NvdXJjZV8gPSAwOwotICAgIGhhc0VFUV8gPSAwOwotICAgIGhhc0xFUV8gPSAwOwotICAgIGhhc1N5bW1ldHJ5XyA9IDA7Ci0gICAgaGFzU2l0ZU5hbWVfID0gMDsKLSAgICBoYXNDbG9ja1R5cGVfID0gMDsKLSAgICBoYXNTaXplXyA9IDA7Ci0gICAgaXNJbnZlcnRlcl8gPSAwOwotICAgIGlzQnVmZmVyXyA9IDA7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtRm9yZWlnbnNfOyBpKyspIHsKLSAgICAgICAgaGFzRm9yZWlnbk9yaWdpbl9baV0gPSAwOwotICAgICAgICBoYXNGb3JlaWduUG9pbnRfW2ldID0gMDsKLSAgICAgICAgZm9yZWlnbk9yaWVudF9baV0gPSAtMTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChmb3JlaWduX1tpXSkpOwotICAgIH0KLSAgICBudW1Gb3JlaWduc18gPSAwOwotCi0gICAgaWYgKHBhdHRlcm5fKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1TaXRlc187IGkrKykgewotICAgICAgICAgICAgcGF0dGVybl9baV0tPkRlc3Ryb3koKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAocGF0dGVybl9baV0pKTsKLSAgICAgICAgfQotICAgICAgICBudW1TaXRlc18gPSAwOwotICAgICAgICBzaXRlc0FsbG9jYXRlZF8gPSAwOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHBhdHRlcm5fKSk7Ci0gICAgICAgIHBhdHRlcm5fID0gMDsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUHJvcGVydGllc187IGkrKykgewotICAgICAgICBsZWZGcmVlKHByb3BOYW1lc19baV0pOwotICAgICAgICBsZWZGcmVlKHByb3BWYWx1ZXNfW2ldKTsKLSAgICB9Ci0KLSAgICBudW1Qcm9wZXJ0aWVzXyA9IDA7Ci0gICAgaXNGaXhlZE1hc2tfID0gMDsKLX0KLQotdm9pZAotbGVmaU1hY3JvOjpidW1wKGNoYXIgICAgKiphcnJheSwKLSAgICAgICAgICAgICAgICBpbnQgICAgIGxlbiwKLSAgICAgICAgICAgICAgICBpbnQgICAgICpzaXplKQotewotICAgIGlmICgqYXJyYXkpCi0gICAgICAgIGxlZkZyZWUoKmFycmF5KTsKLSAgICBpZiAobGVuKQotICAgICAgICAqYXJyYXkgPSAoY2hhciopIGxlZk1hbGxvYyhsZW4pOwotICAgIGVsc2UKLSAgICAgICAgKmFycmF5ID0gMDsKLSAgICAqc2l6ZSA9IGxlbjsKLX0KLQotdm9pZAotbGVmaU1hY3JvOjpzZXROYW1lKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgaW50IGxlbiA9IHN0cmxlbihuYW1lKSArIDE7Ci0gICAgaWYgKGxlbiA+IG5hbWVTaXplXykKLSAgICAgICAgYnVtcCgmKG5hbWVfKSwgbGVuLCAmKG5hbWVTaXplXykpOwotICAgIHN0cmNweShuYW1lXywgQ0FTRShuYW1lKSk7Ci19Ci0KLXZvaWQKLWxlZmlNYWNybzo6c2V0R2VuZXJhdGUoY29uc3QgY2hhciAgICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKm4yKQotewotICAgIGludCBsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotICAgIGlmIChsZW4gPiBnZW4xU2l6ZV8pCi0gICAgICAgIGJ1bXAoJihnZW4xXyksIGxlbiwgJihnZW4xU2l6ZV8pKTsKLSAgICBzdHJjcHkoZ2VuMV8sIENBU0UobmFtZSkpOwotICAgIGxlbiA9IHN0cmxlbihuMikgKyAxOwotICAgIGlmIChsZW4gPiBnZW4yU2l6ZV8pCi0gICAgICAgIGJ1bXAoJihnZW4yXyksIGxlbiwgJihnZW4yU2l6ZV8pKTsKLSAgICBzdHJjcHkoZ2VuMl8sIG4yKTsKLX0KLQotdm9pZAotbGVmaU1hY3JvOjpzZXRHZW5lcmF0b3IoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLSAgICBpZiAobGVuID4gZ2VuZXJhdG9yU2l6ZV8pCi0gICAgICAgIGJ1bXAoJihnZW5lcmF0b3JfKSwgbGVuLCAmKGdlbmVyYXRvclNpemVfKSk7Ci0gICAgc3RyY3B5KGdlbmVyYXRvcl8sIENBU0UobmFtZSkpOwotICAgIGhhc0dlbmVyYXRvcl8gPSAxOwotfQotCi12b2lkCi1sZWZpTWFjcm86OnNldEludmVydGVyKCkKLXsKLSAgICBpc0ludmVydGVyXyA9IDE7Ci19Ci0KLXZvaWQKLWxlZmlNYWNybzo6c2V0QnVmZmVyKCkKLXsKLSAgICBpc0J1ZmZlcl8gPSAxOwotfQotCi12b2lkCi1sZWZpTWFjcm86OnNldFNvdXJjZShjb25zdCBjaGFyICpuYW1lKQotewotICAgIHN0cmNweShzb3VyY2VfLCBDQVNFKG5hbWUpKTsKLSAgICBoYXNTb3VyY2VfID0gMTsKLX0KLQotdm9pZAotbGVmaU1hY3JvOjpzZXRDbGFzcyhjb25zdCBjaGFyICpuYW1lKQotewotICAgIHN0cmNweShtYWNyb0NsYXNzXywgQ0FTRShuYW1lKSk7Ci0gICAgaGFzQ2xhc3NfID0gMTsKLX0KLQotdm9pZAotbGVmaU1hY3JvOjpzZXRPcmlnaW4oZG91YmxlIHgsCi0gICAgICAgICAgICAgICAgICAgICBkb3VibGUgeSkKLXsKLSAgICBvcmlnaW5YXyA9IHg7Ci0gICAgb3JpZ2luWV8gPSB5OwotICAgIGhhc09yaWdpbl8gPSAxOwotfQotCi12b2lkCi1sZWZpTWFjcm86OnNldFBvd2VyKGRvdWJsZSBwKQotewotICAgIHBvd2VyXyA9IHA7Ci0gICAgaGFzUG93ZXJfID0gMTsKLX0KLQotdm9pZAotbGVmaU1hY3JvOjpzZXRFRVEoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLSAgICBpZiAobGVuID4gRUVRU2l6ZV8pCi0gICAgICAgIGJ1bXAoJihFRVFfKSwgbGVuLCAmKEVFUVNpemVfKSk7Ci0gICAgc3RyY3B5KEVFUV8sIENBU0UobmFtZSkpOwotICAgIGhhc0VFUV8gPSAxOwotfQotCi12b2lkCi1sZWZpTWFjcm86OnNldExFUShjb25zdCBjaGFyICpuYW1lKQotewotICAgIGludCBsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotICAgIGlmIChsZW4gPiBMRVFTaXplXykKLSAgICAgICAgYnVtcCgmKExFUV8pLCBsZW4sICYoTEVRU2l6ZV8pKTsKLSAgICBzdHJjcHkoTEVRXywgQ0FTRShuYW1lKSk7Ci0gICAgaGFzTEVRXyA9IDE7Ci19Ci0KLXZvaWQKLWxlZmlNYWNybzo6c2V0UHJvcGVydHkoY29uc3QgY2hhciAgICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgdHlwZSkKLXsKLSAgICBpbnQgbGVuOwotICAgIGlmIChudW1Qcm9wZXJ0aWVzXyA9PSBwcm9wZXJ0aWVzQWxsb2NhdGVkXykKLSAgICAgICAgYnVtcFByb3BzKCk7Ci0gICAgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLSAgICBwcm9wTmFtZXNfW251bVByb3BlcnRpZXNfXSA9IChjaGFyKikgbGVmTWFsbG9jKGxlbik7Ci0gICAgc3RyY3B5KHByb3BOYW1lc19bbnVtUHJvcGVydGllc19dLCBDQVNFKG5hbWUpKTsKLSAgICBsZW4gPSBzdHJsZW4odmFsdWUpICsgMTsKLSAgICBwcm9wVmFsdWVzX1tudW1Qcm9wZXJ0aWVzX10gPSAoY2hhciopIGxlZk1hbGxvYyhsZW4pOwotICAgIHN0cmNweShwcm9wVmFsdWVzX1tudW1Qcm9wZXJ0aWVzX10sIENBU0UodmFsdWUpKTsKLSAgICBwcm9wTnVtc19bbnVtUHJvcGVydGllc19dID0gMC4wOwotICAgIHByb3BUeXBlc19bbnVtUHJvcGVydGllc19dID0gdHlwZTsKLSAgICBudW1Qcm9wZXJ0aWVzXyArPSAxOwotfQotCi12b2lkCi1sZWZpTWFjcm86OnNldE51bVByb3BlcnR5KGNvbnN0IGNoYXIgICAgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICAgZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgdHlwZSkKLXsKLSAgICBpbnQgbGVuOwotCi0gICAgaWYgKG51bVByb3BlcnRpZXNfID09IHByb3BlcnRpZXNBbGxvY2F0ZWRfKQotICAgICAgICBidW1wUHJvcHMoKTsKLSAgICBsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotICAgIHByb3BOYW1lc19bbnVtUHJvcGVydGllc19dID0gKGNoYXIqKSBsZWZNYWxsb2MobGVuKTsKLSAgICBzdHJjcHkocHJvcE5hbWVzX1tudW1Qcm9wZXJ0aWVzX10sIENBU0UobmFtZSkpOwotICAgIGxlbiA9IHN0cmxlbih2YWx1ZSkgKyAxOwotICAgIHByb3BWYWx1ZXNfW251bVByb3BlcnRpZXNfXSA9IChjaGFyKikgbGVmTWFsbG9jKGxlbik7Ci0gICAgc3RyY3B5KHByb3BWYWx1ZXNfW251bVByb3BlcnRpZXNfXSwgQ0FTRSh2YWx1ZSkpOwotICAgIHByb3BOdW1zX1tudW1Qcm9wZXJ0aWVzX10gPSBkOwotICAgIHByb3BUeXBlc19bbnVtUHJvcGVydGllc19dID0gdHlwZTsKLSAgICBudW1Qcm9wZXJ0aWVzXyArPSAxOwotfQotCi0KLXZvaWQKLWxlZmlNYWNybzo6YnVtcFByb3BzKCkKLXsKLSAgICBpbnQgICAgIGxpbTsKLSAgICBpbnQgICAgIG5ld3M7Ci0gICAgY2hhciAgICAqKm5ld3BuOwotICAgIGNoYXIgICAgKipuZXdwdjsKLSAgICBkb3VibGUgICpuZXdkOwotICAgIGNoYXIgICAgKm5ld3Q7Ci0gICAgaW50ICAgICBpOwotCi0gICAgaWYgKHByb3BlcnRpZXNBbGxvY2F0ZWRfIDw9IDApCi0gICAgICAgIGxpbSA9IDI7ICAgICAgICAgICAgICAgICAvLyBzdGFydHMgd2l0aCA0Ci0gICAgZWxzZQotICAgICAgICBsaW0gPSBwcm9wZXJ0aWVzQWxsb2NhdGVkXzsKLSAgICBuZXdzID0gbGltICsgbGltOwotICAgIG5ld3BuID0gKGNoYXIqKikgbGVmTWFsbG9jKHNpemVvZihjaGFyKikgKiBuZXdzKTsKLSAgICBuZXdwdiA9IChjaGFyKiopIGxlZk1hbGxvYyhzaXplb2YoY2hhciopICogbmV3cyk7Ci0gICAgbmV3ZCA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBuZXdzKTsKLSAgICBuZXd0ID0gKGNoYXIqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIpICogbmV3cyk7Ci0KLSAgICBwcm9wZXJ0aWVzQWxsb2NhdGVkXyA9IG5ld3M7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbGltOyBpKyspIHsKLSAgICAgICAgbmV3cG5baV0gPSBwcm9wTmFtZXNfW2ldOwotICAgICAgICBuZXdwdltpXSA9IHByb3BWYWx1ZXNfW2ldOwotICAgICAgICBuZXdkW2ldID0gcHJvcE51bXNfW2ldOwotICAgICAgICBuZXd0W2ldID0gcHJvcFR5cGVzX1tpXTsKLSAgICB9Ci0gICAgbGVmRnJlZSgoY2hhciopIChwcm9wTmFtZXNfKSk7Ci0gICAgbGVmRnJlZSgoY2hhciopIChwcm9wVmFsdWVzXykpOwotICAgIGxlZkZyZWUoKGNoYXIqKSAocHJvcE51bXNfKSk7Ci0gICAgbGVmRnJlZSgoY2hhciopIChwcm9wVHlwZXNfKSk7Ci0gICAgcHJvcE5hbWVzXyA9IG5ld3BuOwotICAgIHByb3BWYWx1ZXNfID0gbmV3cHY7Ci0gICAgcHJvcE51bXNfID0gbmV3ZDsKLSAgICBwcm9wVHlwZXNfID0gbmV3dDsKLX0KLQotdm9pZAotbGVmaU1hY3JvOjpzZXRGaXhlZE1hc2soaW50IGlzRml4ZWRNYXNrKQotewotICAgIGlzRml4ZWRNYXNrXyA9IGlzRml4ZWRNYXNrOwotfQotCi1pbnQKLWxlZmlNYWNybzo6aXNGaXhlZE1hc2soKSBjb25zdAotewotICAgIHJldHVybiBpc0ZpeGVkTWFza187Ci19Ci0KLXZvaWQKLWxlZmlNYWNybzo6YWRkRm9yZWlnbihjb25zdCBjaGFyICAgICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgaGFzUG50LAotICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICAgeCwKLSAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICAgIHksCi0gICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICBvcmllbnQpCi17Ci0gICAgaW50ICAgICBpOwotICAgIGludCAgICAgKmhmbzsKLSAgICBpbnQgICAgICpoZnA7Ci0gICAgaW50ICAgICAqZm87Ci0gICAgZG91YmxlICAqZng7Ci0gICAgZG91YmxlICAqZnk7Ci0gICAgY2hhciAgICAqKmY7Ci0KLSAgICBpZiAoZm9yZWlnbkFsbG9jYXRlZF8gPT0gbnVtRm9yZWlnbnNfKSB7Ci0gICAgICAgIGlmIChmb3JlaWduQWxsb2NhdGVkXyA9PSAwKQotICAgICAgICAgICAgZm9yZWlnbkFsbG9jYXRlZF8gPSAxNjsgLy8gc2luY2UgaXQgaW52b2x2ZXMgY2hhciosIGl0IHdpbGwKLSAgICAgICAgICAgIC8vIGNvc3RseSBpbiB0aGUgbnVtYmVyIGlzIHRvbyBzbWFsbAotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmb3JlaWduQWxsb2NhdGVkXyAqPSAyOwotICAgICAgICBoZm8gPSAoaW50KikgbGVmTWFsbG9jKHNpemVvZihpbnQpICogZm9yZWlnbkFsbG9jYXRlZF8pOwotICAgICAgICBoZnAgPSAoaW50KikgbGVmTWFsbG9jKHNpemVvZihpbnQpICogZm9yZWlnbkFsbG9jYXRlZF8pOwotICAgICAgICBmbyA9IChpbnQqKSBsZWZNYWxsb2Moc2l6ZW9mKGludCkgKiBmb3JlaWduQWxsb2NhdGVkXyk7Ci0gICAgICAgIGZ4ID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGZvcmVpZ25BbGxvY2F0ZWRfKTsKLSAgICAgICAgZnkgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogZm9yZWlnbkFsbG9jYXRlZF8pOwotICAgICAgICBmID0gKGNoYXIqKikgbGVmTWFsbG9jKHNpemVvZihjaGFyKikgKiBmb3JlaWduQWxsb2NhdGVkXyk7Ci0gICAgICAgIGlmIChudW1Gb3JlaWduc18gIT0gMCkgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUZvcmVpZ25zXzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaGZvW2ldID0gaGFzRm9yZWlnbk9yaWdpbl9baV07Ci0gICAgICAgICAgICAgICAgaGZwW2ldID0gaGFzRm9yZWlnblBvaW50X1tpXTsKLSAgICAgICAgICAgICAgICBmb1tpXSA9IGZvcmVpZ25PcmllbnRfW2ldOwotICAgICAgICAgICAgICAgIGZ4W2ldID0gZm9yZWlnblhfW2ldOwotICAgICAgICAgICAgICAgIGZ5W2ldID0gZm9yZWlnbllfW2ldOwotICAgICAgICAgICAgICAgIGZbaV0gPSBmb3JlaWduX1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoaGFzRm9yZWlnbk9yaWdpbl8pKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoaGFzRm9yZWlnblBvaW50XykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChmb3JlaWduT3JpZW50XykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChmb3JlaWduWF8pKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoZm9yZWlnbllfKSk7Ci0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKGZvcmVpZ25fKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaGFzRm9yZWlnbk9yaWdpbl8gPSBoZm87Ci0gICAgICAgIGhhc0ZvcmVpZ25Qb2ludF8gPSBoZnA7Ci0gICAgICAgIGZvcmVpZ25PcmllbnRfID0gZm87Ci0gICAgICAgIGZvcmVpZ25YXyA9IGZ4OwotICAgICAgICBmb3JlaWduWV8gPSBmeTsKLSAgICAgICAgZm9yZWlnbl8gPSBmOwotICAgIH0KLQotICAgIC8vIG9yaWVudD0tMSBtZWFucyBubyBvcmllbnQgd2FzIHNwZWNpZmllZC4KLSAgICBoYXNGb3JlaWduT3JpZ2luX1tudW1Gb3JlaWduc19dID0gb3JpZW50OwotICAgIGhhc0ZvcmVpZ25Qb2ludF9bbnVtRm9yZWlnbnNfXSA9IGhhc1BudDsKLSAgICBmb3JlaWduT3JpZW50X1tudW1Gb3JlaWduc19dID0gb3JpZW50OwotICAgIGZvcmVpZ25YX1tudW1Gb3JlaWduc19dID0geDsKLSAgICBmb3JlaWduWV9bbnVtRm9yZWlnbnNfXSA9IHk7Ci0gICAgZm9yZWlnbl9bbnVtRm9yZWlnbnNfXSA9IChjaGFyKikgbGVmTWFsbG9jKHN0cmxlbihuYW1lKSArIDEpOwotICAgIHN0cmNweShmb3JlaWduX1tudW1Gb3JlaWduc19dLCBDQVNFKG5hbWUpKTsKLSAgICBudW1Gb3JlaWduc18gKz0gMTsKLQotfQotCi0gICAgCi12b2lkCi1sZWZpTWFjcm86OnNldFhTeW1tZXRyeSgpCi17Ci0gICAgaGFzU3ltbWV0cnlfIHw9IDE7Ci19Ci0KLXZvaWQKLWxlZmlNYWNybzo6c2V0WVN5bW1ldHJ5KCkKLXsKLSAgICBoYXNTeW1tZXRyeV8gfD0gMjsKLX0KLQotdm9pZAotbGVmaU1hY3JvOjpzZXQ5MFN5bW1ldHJ5KCkKLXsKLSAgICBoYXNTeW1tZXRyeV8gfD0gNDsKLX0KLQotdm9pZAotbGVmaU1hY3JvOjpzZXRTaXRlTmFtZShjb25zdCBjaGFyICpuYW1lKQotewotICAgIGludCBsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotICAgIGlmIChsZW4gPiBzaXRlTmFtZVNpemVfKQotICAgICAgICBidW1wKCYoc2l0ZU5hbWVfKSwgbGVuLCAmKHNpdGVOYW1lU2l6ZV8pKTsKLSAgICBzdHJjcHkoc2l0ZU5hbWVfLCBDQVNFKG5hbWUpKTsKLSAgICBoYXNTaXRlTmFtZV8gPSAxOwotfQotCi12b2lkCi1sZWZpTWFjcm86OnNldENsb2NrVHlwZShjb25zdCBjaGFyICpuYW1lKQotewotICAgIGludCBsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotICAgIGlmIChsZW4gPiBjbG9ja1R5cGVTaXplXykKLSAgICAgICAgYnVtcCgmKGNsb2NrVHlwZV8pLCBsZW4sICYoY2xvY2tUeXBlU2l6ZV8pKTsKLSAgICBzdHJjcHkoY2xvY2tUeXBlXywgQ0FTRShuYW1lKSk7Ci0gICAgaGFzQ2xvY2tUeXBlXyA9IDE7Ci19Ci0KLXZvaWQKLWxlZmlNYWNybzo6c2V0U2l0ZVBhdHRlcm4obGVmaVNpdGVQYXR0ZXJuICpwKQotewotICAgIGlmIChudW1TaXRlc18gPT0gc2l0ZXNBbGxvY2F0ZWRfKSB7Ci0gICAgICAgIGxlZmlTaXRlUGF0dGVybiAqKm5wOwotICAgICAgICBpbnQgICAgICAgICAgICAgaSwgbGltOwotICAgICAgICBpZiAoc2l0ZXNBbGxvY2F0ZWRfID09IDApIHsKLSAgICAgICAgICAgIGxpbSA9IHNpdGVzQWxsb2NhdGVkXyA9IDQ7Ci0gICAgICAgICAgICBucCA9IChsZWZpU2l0ZVBhdHRlcm4qKikgbGVmTWFsbG9jKHNpemVvZihsZWZpU2l0ZVBhdHRlcm4qKSAqIGxpbSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsaW0gPSBzaXRlc0FsbG9jYXRlZF8gKiAyOwotICAgICAgICAgICAgc2l0ZXNBbGxvY2F0ZWRfID0gbGltOwotICAgICAgICAgICAgbnAgPSAobGVmaVNpdGVQYXR0ZXJuKiopIGxlZk1hbGxvYyhzaXplb2YobGVmaVNpdGVQYXR0ZXJuKikgKiBsaW0pOwotICAgICAgICAgICAgbGltIC89IDI7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGltOyBpKyspCi0gICAgICAgICAgICAgICAgbnBbaV0gPSBwYXR0ZXJuX1tpXTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAocGF0dGVybl8pKTsKLSAgICAgICAgfQotICAgICAgICBwYXR0ZXJuXyA9IG5wOwotICAgIH0KLSAgICBwYXR0ZXJuX1tudW1TaXRlc19dID0gcDsKLSAgICBudW1TaXRlc18gKz0gMTsKLX0KLQotdm9pZAotbGVmaU1hY3JvOjpzZXRTaXplKGRvdWJsZSAgIHgsCi0gICAgICAgICAgICAgICAgICAgZG91YmxlICAgeSkKLXsKLSAgICBoYXNTaXplXyA9IDE7Ci0gICAgc2l6ZVhfID0geDsKLSAgICBzaXplWV8gPSB5OwotfQotICAgIAotCi1pbnQKLWxlZmlNYWNybzo6aGFzQ2xhc3MoKSBjb25zdAotewotICAgIHJldHVybiBoYXNDbGFzc187Ci19Ci0KLWludAotbGVmaU1hY3JvOjpoYXNTaXRlTmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc1NpdGVOYW1lXzsKLX0KLQotaW50Ci1sZWZpTWFjcm86Omhhc0dlbmVyYXRvcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc0dlbmVyYXRvcl87Ci19Ci0KLWludAotbGVmaU1hY3JvOjpoYXNHZW5lcmF0ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc0dlbmVyYXRlXzsKLX0KLQotaW50Ci1sZWZpTWFjcm86Omhhc1Bvd2VyKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzUG93ZXJfOwotfQotCi1pbnQKLWxlZmlNYWNybzo6aGFzT3JpZ2luKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzT3JpZ2luXzsKLX0KLQotaW50Ci1sZWZpTWFjcm86Omhhc1NvdXJjZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc1NvdXJjZV87Ci19Ci0KLWludAotbGVmaU1hY3JvOjpoYXNFRVEoKSBjb25zdAotewotICAgIHJldHVybiBoYXNFRVFfOwotfQotCi1pbnQKLWxlZmlNYWNybzo6aGFzTEVRKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzTEVRXzsKLX0KLQotaW50Ci1sZWZpTWFjcm86Omhhc1hTeW1tZXRyeSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIChoYXNTeW1tZXRyeV8gJiAxKSA/IDEgOiAwOwotfQotCi1pbnQKLWxlZmlNYWNybzo6aGFzWVN5bW1ldHJ5KCkgY29uc3QKLXsKLSAgICByZXR1cm4gKGhhc1N5bW1ldHJ5XyAmIDIpID8gMSA6IDA7Ci19Ci0KLWludAotbGVmaU1hY3JvOjpoYXM5MFN5bW1ldHJ5KCkgY29uc3QKLXsKLSAgICByZXR1cm4gKGhhc1N5bW1ldHJ5XyAmIDQpID8gMSA6IDA7Ci19Ci0KLWludAotbGVmaU1hY3JvOjpoYXNTaXRlUGF0dGVybigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIChwYXR0ZXJuXykgPyAxIDogMDsKLX0KLQotaW50Ci1sZWZpTWFjcm86Omhhc1NpemUoKSBjb25zdAotewotICAgIHJldHVybiBoYXNTaXplXzsKLX0KLQotaW50Ci1sZWZpTWFjcm86Omhhc0ZvcmVpZ24oKSBjb25zdAotewotICAgIHJldHVybiAobnVtRm9yZWlnbnNfKSA/IDEgOiAwOwotfQotCi1pbnQKLWxlZmlNYWNybzo6aGFzRm9yZWlnbk9yaWdpbihpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc0ZvcmVpZ25PcmlnaW5fW2luZGV4XTsKLX0KLQotaW50Ci1sZWZpTWFjcm86Omhhc0ZvcmVpZ25PcmllbnQoaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiAoZm9yZWlnbk9yaWVudF9baW5kZXhdID09IC0xKSA/IDAgOiAxOwotfQotCi1pbnQKLWxlZmlNYWNybzo6aGFzRm9yZWlnblBvaW50KGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzRm9yZWlnblBvaW50X1tpbmRleF07Ci19Ci0KLWludAotbGVmaU1hY3JvOjpoYXNDbG9ja1R5cGUoKSBjb25zdAotewotICAgIHJldHVybiBoYXNDbG9ja1R5cGVfOwotfQotCi1pbnQKLWxlZmlNYWNybzo6bnVtU2l0ZVBhdHRlcm4oKSBjb25zdAotewotICAgIHJldHVybiBudW1TaXRlc187Ci19Ci0KLWludAotbGVmaU1hY3JvOjpudW1Qcm9wZXJ0aWVzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbnVtUHJvcGVydGllc187Ci19Ci0KLWNvbnN0IGNoYXIgKgotbGVmaU1hY3JvOjpwcm9wTmFtZShpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVByb3BlcnRpZXNfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTM1Mik6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBtYWNybyBwcm9wZXJ0eSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bVByb3BlcnRpZXNfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDEzNTIsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gcHJvcE5hbWVzX1tpbmRleF07Ci19Ci0KLWNvbnN0IGNoYXIgKgotbGVmaU1hY3JvOjpwcm9wVmFsdWUoaW50IGluZGV4KSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1Qcm9wZXJ0aWVzXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzNTIpOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgbWFjcm8gcHJvcGVydHkgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGluZGV4LCBudW1Qcm9wZXJ0aWVzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxMzUyLCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHByb3BWYWx1ZXNfW2luZGV4XTsKLX0KLQotZG91YmxlCi1sZWZpTWFjcm86OnByb3BOdW0oaW50IGluZGV4KSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1Qcm9wZXJ0aWVzXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzNTIpOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgbWFjcm8gcHJvcGVydHkgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGluZGV4LCBudW1Qcm9wZXJ0aWVzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxMzUyLCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHByb3BOdW1zX1tpbmRleF07Ci19Ci0KLWNvbnN0IGNoYXIKLWxlZmlNYWNybzo6cHJvcFR5cGUoaW50IGluZGV4KSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1Qcm9wZXJ0aWVzXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzNTIpOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgbWFjcm8gcHJvcGVydHkgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGluZGV4LCBudW1Qcm9wZXJ0aWVzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxMzUyLCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHByb3BUeXBlc19baW5kZXhdOwotfQotCi1pbnQKLWxlZmlNYWNybzo6cHJvcElzTnVtYmVyKGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjaGFyIG1zZ1sxNjBdOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtUHJvcGVydGllc18pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xMzUyKTogVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIG1hY3JvIHByb3BlcnR5IGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQiLCBpbmRleCwgbnVtUHJvcGVydGllc18pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTM1MiwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBwcm9wTnVtc19baW5kZXhdID8gMSA6IDA7Ci19Ci0KLWludAotbGVmaU1hY3JvOjpwcm9wSXNTdHJpbmcoaW50IGluZGV4KSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1Qcm9wZXJ0aWVzXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzNTIpOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgbWFjcm8gcHJvcGVydHkgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGluZGV4LCBudW1Qcm9wZXJ0aWVzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxMzUyLCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHByb3BOdW1zX1tpbmRleF0gPyAwIDogMTsKLX0KLQotY29uc3QgY2hhciAqCi1sZWZpTWFjcm86Om5hbWUoKSBjb25zdAotewotICAgIHJldHVybiBuYW1lXzsKLX0KLQotY29uc3QgY2hhciAqCi1sZWZpTWFjcm86Om1hY3JvQ2xhc3MoKSBjb25zdAotewotICAgIHJldHVybiBtYWNyb0NsYXNzXzsKLX0KLQotY29uc3QgY2hhciAqCi1sZWZpTWFjcm86OmdlbmVyYXRvcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdlbmVyYXRvcl87Ci19Ci0KLWNvbnN0IGNoYXIgKgotbGVmaU1hY3JvOjpFRVEoKSBjb25zdAotewotICAgIHJldHVybiBFRVFfOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlNYWNybzo6TEVRKCkgY29uc3QKLXsKLSAgICByZXR1cm4gTEVRXzsKLX0KLQotY29uc3QgY2hhciAqCi1sZWZpTWFjcm86OnNvdXJjZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHNvdXJjZV87Ci19Ci0KLWRvdWJsZQotbGVmaU1hY3JvOjpvcmlnaW5YKCkgY29uc3QKLXsKLSAgICByZXR1cm4gb3JpZ2luWF87Ci19Ci0KLWRvdWJsZQotbGVmaU1hY3JvOjpvcmlnaW5ZKCkgY29uc3QKLXsKLSAgICByZXR1cm4gb3JpZ2luWV87Ci19Ci0KLWRvdWJsZQotbGVmaU1hY3JvOjpwb3dlcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHBvd2VyXzsKLX0KLQotdm9pZAotbGVmaU1hY3JvOjpnZW5lcmF0ZShjaGFyICAgICoqbmFtZTEsCi0gICAgICAgICAgICAgICAgICAgIGNoYXIgICAgKipuYW1lMikgY29uc3QKLXsKLSAgICBpZiAobmFtZTEpCi0gICAgICAgICpuYW1lMSA9IGdlbjFfOwotICAgIGlmIChuYW1lMikKLSAgICAgICAgKm5hbWUyID0gZ2VuMl87Ci19Ci0KLWxlZmlTaXRlUGF0dGVybiAqCi1sZWZpTWFjcm86OnNpdGVQYXR0ZXJuKGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gcGF0dGVybl9baW5kZXhdOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlNYWNybzo6c2l0ZU5hbWUoKSBjb25zdAotewotICAgIHJldHVybiBzaXRlTmFtZV87Ci19Ci0KLWRvdWJsZQotbGVmaU1hY3JvOjpzaXplWCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHNpemVYXzsKLX0KLQotZG91YmxlCi1sZWZpTWFjcm86OnNpemVZKCkgY29uc3QKLXsKLSAgICByZXR1cm4gc2l6ZVlfOwotfQotCi1pbnQKLWxlZmlNYWNybzo6bnVtRm9yZWlnbnMoKSBjb25zdAotewotICAgIHJldHVybiBudW1Gb3JlaWduc187Ci19Ci0KLWludAotbGVmaU1hY3JvOjpmb3JlaWduT3JpZW50KGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gZm9yZWlnbk9yaWVudF9baW5kZXhdOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlNYWNybzo6Zm9yZWlnbk9yaWVudFN0cihpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIChsZWZpT3JpZW50U3RyKGZvcmVpZ25PcmllbnRfW2luZGV4XSkpOwotfQotCi1kb3VibGUKLWxlZmlNYWNybzo6Zm9yZWlnblgoaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiBmb3JlaWduWF9baW5kZXhdOwotfQotCi1kb3VibGUKLWxlZmlNYWNybzo6Zm9yZWlnblkoaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiBmb3JlaWduWV9baW5kZXhdOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlNYWNybzo6Zm9yZWlnbk5hbWUoaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiBmb3JlaWduX1tpbmRleF07Ci19Ci0KLWNvbnN0IGNoYXIgKgotbGVmaU1hY3JvOjpjbG9ja1R5cGUoKSBjb25zdAotewotICAgIHJldHVybiBjbG9ja1R5cGVfOwotfQotCi1pbnQKLWxlZmlNYWNybzo6aXNCdWZmZXIoKSBjb25zdAotewotICAgIHJldHVybiBpc0J1ZmZlcl87Ci19Ci0KLWludAotbGVmaU1hY3JvOjppc0ludmVydGVyKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaXNJbnZlcnRlcl87Ci19Ci0KLXZvaWQKLWxlZmlNYWNybzo6cHJpbnQoRklMRSAqZikgY29uc3QKLXsKLSAgICBjaGFyICAgICAgICAgICAgKmMxOwotICAgIGNoYXIgICAgICAgICAgICAqYzI7Ci0gICAgbGVmaVNpdGVQYXR0ZXJuICpzcDsKLSAgICBpbnQgICAgICAgICAgICAgaTsKLQotICAgIGZwcmludGYoZiwgIk1BQ1JPICVzXG4iLCBuYW1lKCkpOwotCi0gICAgaWYgKGhhc0NsYXNzKCkpCi0gICAgICAgIGZwcmludGYoZiwgIiAgQ2xhc3MgJXNcbiIsIG1hY3JvQ2xhc3MoKSk7Ci0KLSAgICBpZiAoaGFzR2VuZXJhdG9yKCkpCi0gICAgICAgIGZwcmludGYoZiwgIiAgR2VuZXJhdG9yICVzXG4iLCBnZW5lcmF0b3IoKSk7Ci0KLSAgICBpZiAoaGFzR2VuZXJhdG9yKCkpIHsKLSAgICAgICAgZ2VuZXJhdGUoJmMxLCAmYzIpOwotICAgICAgICBmcHJpbnRmKGYsICIgIEdlbmVyYXRlICVzICVzXG4iLCBjMSwgYzIpOwotICAgIH0KLQotICAgIGlmIChoYXNQb3dlcigpKQotICAgICAgICBmcHJpbnRmKGYsICIgIFBvd2VyICVnXG4iLCBwb3dlcigpKTsKLQotICAgIGlmIChoYXNPcmlnaW4oKSkKLSAgICAgICAgZnByaW50ZihmLCAiICBPcmlnaW4gJWcsJWdcbiIsIG9yaWdpblgoKSwKLSAgICAgICAgICAgICAgICBvcmlnaW5ZKCkpOwotCi0gICAgaWYgKGhhc0VFUSgpKQotICAgICAgICBmcHJpbnRmKGYsICIgIEVFUSAlc1xuIiwgRUVRKCkpOwotCi0gICAgaWYgKGhhc0xFUSgpKQotICAgICAgICBmcHJpbnRmKGYsICIgIExFUSAlc1xuIiwgTEVRKCkpOwotCi0gICAgaWYgKGhhc1NvdXJjZSgpKQotICAgICAgICBmcHJpbnRmKGYsICIgIFNvdXJjZSAlc1xuIiwgc291cmNlKCkpOwotCi0gICAgaWYgKGhhc1hTeW1tZXRyeSgpKQotICAgICAgICBmcHJpbnRmKGYsICIgIFN5bW1ldHJ5IFhcbiIpOwotCi0gICAgaWYgKGhhc1lTeW1tZXRyeSgpKQotICAgICAgICBmcHJpbnRmKGYsICIgIFN5bW1ldHJ5IFlcbiIpOwotCi0gICAgaWYgKGhhczkwU3ltbWV0cnkoKSkKLSAgICAgICAgZnByaW50ZihmLCAiICBTeW1tZXRyeSBSOTBcbiIpOwotCi0gICAgaWYgKGhhc1NpdGVOYW1lKCkpCi0gICAgICAgIGZwcmludGYoZiwgIiAgU2l0ZSBuYW1lICVzXG4iLCBzaXRlTmFtZSgpKTsKLQotICAgIGlmIChoYXNTaXRlUGF0dGVybigpKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1TaXRlUGF0dGVybigpOyBpKyspIHsKLSAgICAgICAgICAgIHNwID0gc2l0ZVBhdHRlcm4oaSk7Ci0gICAgICAgICAgICBmcHJpbnRmKGYsICIgIFNpdGUgcGF0dGVybiAiKTsKLSAgICAgICAgICAgIHNwLT5wcmludChmKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChoYXNTaXplKCkpCi0gICAgICAgIGZwcmludGYoZiwgIiAgU2l6ZSAlZywlZ1xuIiwgc2l6ZVgoKSwKLSAgICAgICAgICAgICAgICBzaXplWSgpKTsKLQotICAgIGlmIChoYXNGb3JlaWduKCkpIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUZvcmVpZ25zKCk7IGkrKykgewotICAgICAgICAgICAgZnByaW50ZihmLCAiICBGb3JlaWduICVzIiwgZm9yZWlnbk5hbWUoaSkpOwotICAgICAgICAgICAgaWYgKGhhc0ZvcmVpZ25PcmlnaW4oaSkpCi0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiICAlZywlZyIsIGZvcmVpZ25YKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWlnblkoaSkpOwotICAgICAgICAgICAgaWYgKGhhc0ZvcmVpZ25PcmllbnQoaSkpCi0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiICBvcmllbnQgJXMiLCBmb3JlaWduT3JpZW50U3RyKGkpKTsKLSAgICAgICAgICAgIGZwcmludGYoZiwgIlxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaGFzQ2xvY2tUeXBlKCkpCi0gICAgICAgIGZwcmludGYoZiwgIiAgQ2xvY2sgdHlwZSAlc1xuIiwgY2xvY2tUeXBlKCkpOwotCi0gICAgZnByaW50ZihmLCAiRU5EIE1BQ1JPICVzXG4iLCBuYW1lKCkpOwotfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gbGVmaVRpbWluZwotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotbGVmaVRpbWluZzo6bGVmaVRpbWluZygpCi06IG51bUZyb21fKDApLAotICBmcm9tXyhOVUxMKSwKLSAgZnJvbUFsbG9jYXRlZF8oMCksCi0gIG51bVRvXygwKSwKLSAgdG9fKE5VTEwpLAotICB0b0FsbG9jYXRlZF8oMCksCi0gIGhhc1RyYW5zaXRpb25fKDApLAotICBoYXNEZWxheV8oMCksCi0gIGhhc1Jpc2VTbGV3XygwKSwKLSAgaGFzUmlzZVNsZXcyXygwKSwKLSAgaGFzRmFsbFNsZXdfKDApLAotICBoYXNGYWxsU2xldzJfKDApLAotICBoYXNSaXNlSW50cmluc2ljXygwKSwKLSAgaGFzRmFsbEludHJpbnNpY18oMCksCi0gIGhhc1Jpc2VSU18oMCksCi0gIGhhc1Jpc2VDU18oMCksCi0gIGhhc0ZhbGxSU18oMCksCi0gIGhhc0ZhbGxDU18oMCksCi0gIGhhc1VuYXRlbmVzc18oMCksCi0gIGhhc0ZhbGxBdHQxXygwKSwKLSAgaGFzUmlzZUF0dDFfKDApLAotICBoYXNGYWxsVG9fKDApLAotICBoYXNSaXNlVG9fKDApLAotICBoYXNTdGFibGVUaW1pbmdfKDApLAotICBoYXNTREZvbmVQaW5UcmlnZ2VyXygwKSwKLSAgaGFzU0RGdHdvUGluVHJpZ2dlcl8oMCksCi0gIGhhc1NERmNvbmRTdGFydF8oMCksCi0gIGhhc1NERmNvbmRFbmRfKDApLAotICBoYXNTREZjb25kXygwKSwKLSAgbm93UmlzZV8oMCksCi0gIG51bU9mQXhpc051bWJlcnNfKDApLAotICBheGlzTnVtYmVyc18oTlVMTCksCi0gIGF4aXNOdW1iZXJzQWxsb2NhdGVkXygwKSwKLSAgbnVtT2ZUYWJsZUVudHJpZXNfKDApLAotICB0YWJsZUVudHJpZXNBbGxvY2F0ZWRfKDApLAotICB0YWJsZV8oTlVMTCksICAvLyB0aHJlZSBudW1iZXJzIHBlciBlbnRyeSAKLSAgZGVsYXlSaXNlT3JGYWxsXyhOVUxMKSwKLSAgZGVsYXlVbmF0ZW5lc3NfKE5VTEwpLAotICBkZWxheVRhYmxlT25lXygwLjApLAotICBkZWxheVRhYmxlVHdvXygwLjApLAotICBkZWxheVRhYmxlVGhyZWVfKDAuMCksCi0gIHRyYW5zaXRpb25SaXNlT3JGYWxsXyhOVUxMKSwKLSAgdHJhbnNpdGlvblVuYXRlbmVzc18oTlVMTCksCi0gIHRyYW5zaXRpb25UYWJsZU9uZV8oMC4wKSwKLSAgdHJhbnNpdGlvblRhYmxlVHdvXygwLjApLAotICB0cmFuc2l0aW9uVGFibGVUaHJlZV8oMC4wKSwKLSAgcmlzZUludHJpbnNpY09uZV8oMC4wKSwKLSAgcmlzZUludHJpbnNpY1R3b18oMC4wKSwKLSAgcmlzZUludHJpbnNpY1RocmVlXygwLjApLAotICByaXNlSW50cmluc2ljRm91cl8oMC4wKSwKLSAgZmFsbEludHJpbnNpY09uZV8oMC4wKSwKLSAgZmFsbEludHJpbnNpY1R3b18oMC4wKSwKLSAgZmFsbEludHJpbnNpY1RocmVlXygwLjApLAotICBmYWxsSW50cmluc2ljRm91cl8oMC4wKSwKLSAgcmlzZVNsZXdPbmVfKDAuMCksCi0gIHJpc2VTbGV3VHdvXygwLjApLAotICByaXNlU2xld1RocmVlXygwLjApLAotICByaXNlU2xld0ZvdXJfKDAuMCksCi0gIHJpc2VTbGV3Rml2ZV8oMC4wKSwKLSAgcmlzZVNsZXdTaXhfKDAuMCksCi0gIHJpc2VTbGV3U2V2ZW5fKDAuMCksCi0gIGZhbGxTbGV3T25lXygwLjApLAotICBmYWxsU2xld1R3b18oMC4wKSwKLSAgZmFsbFNsZXdUaHJlZV8oMC4wKSwKLSAgZmFsbFNsZXdGb3VyXygwLjApLAotICBmYWxsU2xld0ZpdmVfKDAuMCksCi0gIGZhbGxTbGV3U2l4XygwLjApLAotICBmYWxsU2xld1NldmVuXygwLjApLAotICByaXNlUlNPbmVfKDAuMCksCi0gIHJpc2VSU1R3b18oMC4wKSwKLSAgcmlzZUNTT25lXygwLjApLAotICByaXNlQ1NUd29fKDAuMCksCi0gIGZhbGxSU09uZV8oMC4wKSwKLSAgZmFsbFJTVHdvXygwLjApLAotICBmYWxsQ1NPbmVfKDAuMCksCi0gIGZhbGxDU1R3b18oMC4wKSwKLSAgdW5hdGVuZXNzXyhOVUxMKSwKLSAgcmlzZUF0dDFPbmVfKDAuMCksCi0gIHJpc2VBdHQxVHdvXygwLjApLAotICBmYWxsQXR0MU9uZV8oMC4wKSwKLSAgZmFsbEF0dDFUd29fKDAuMCksCi0gIGZhbGxUb09uZV8oMC4wKSwKLSAgZmFsbFRvVHdvXygwLjApLAotICByaXNlVG9PbmVfKDAuMCksCi0gIHJpc2VUb1R3b18oMC4wKSwKLSAgc3RhYmxlU2V0dXBfKDAuMCksCi0gIHN0YWJsZUhvbGRfKDAuMCksCi0gIHN0YWJsZVJpc2VGYWxsXyhOVUxMKSwKLSAgU0RGdHJpZ2dlclR5cGVfKE5VTEwpLAotICBTREZmcm9tVHJpZ2dlcl8oTlVMTCksCi0gIFNERnRvVHJpZ2dlcl8oTlVMTCksCi0gIFNERnRyaWdnZXJUYWJsZU9uZV8oMC4wKSwKLSAgU0RGdHJpZ2dlclRhYmxlVHdvXygwLjApLAotICBTREZ0cmlnZ2VyVGFibGVUaHJlZV8oMC4wKSwKLSAgU0RGY29uZFN0YXJ0XyhOVUxMKSwKLSAgU0RGY29uZEVuZF8oTlVMTCksCi0gIFNERmNvbmRfKE5VTEwpCi17Ci0gICAgSW5pdCgpOwotfQotCi12b2lkCi1sZWZpVGltaW5nOjpJbml0KCkKLXsKLSAgICBudW1Gcm9tXyA9IDA7Ci0gICAgZnJvbV8gPSAoY2hhcioqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIqKSk7Ci0gICAgZnJvbUFsbG9jYXRlZF8gPSAxOwotICAgIG51bVRvXyA9IDA7Ci0gICAgdG9fID0gKGNoYXIqKikgbGVmTWFsbG9jKHNpemVvZihjaGFyKikpOwotICAgIHRvQWxsb2NhdGVkXyA9IDE7Ci0KLSAgICBudW1PZkF4aXNOdW1iZXJzXyA9IDA7Ci0gICAgYXhpc051bWJlcnNfID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSk7Ci0gICAgYXhpc051bWJlcnNBbGxvY2F0ZWRfID0gMTsKLQotICAgIG51bU9mVGFibGVFbnRyaWVzXyA9IDA7Ci0gICAgdGFibGVFbnRyaWVzQWxsb2NhdGVkXyA9IDE7Ci0gICAgdGFibGVfID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIDMpOyAgLy8gdGhyZWUgbnVtYmVycyBwZXIgZW50cnkgCi0KLSAgICBjbGVhcigpOwotfQotCi12b2lkCi1sZWZpVGltaW5nOjpEZXN0cm95KCkKLXsKLSAgICBjbGVhcigpOwotICAgIGxlZkZyZWUoKGNoYXIqKSAoZnJvbV8pKTsKLSAgICBsZWZGcmVlKChjaGFyKikgKHRvXykpOwotICAgIGxlZkZyZWUoKGNoYXIqKSAoYXhpc051bWJlcnNfKSk7Ci0gICAgbGVmRnJlZSgoY2hhciopICh0YWJsZV8pKTsKLX0KLQotbGVmaVRpbWluZzo6fmxlZmlUaW1pbmcoKQotewotICAgIERlc3Ryb3koKTsKLX0KLQotdm9pZAotbGVmaVRpbWluZzo6YWRkUmlzZUZhbGwoY29uc3QgY2hhciAgKnJpc2VmYWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgb25lLAotICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgdHdvKQotewotICAgIGlmICgqcmlzZWZhbGwgPT0gJ3InIHx8ICpyaXNlZmFsbCA9PSAnUicpIHsKLSAgICAgICAgaGFzUmlzZUludHJpbnNpY18gPSAxOwotICAgICAgICBub3dSaXNlXyA9IDE7Ci0gICAgICAgIHJpc2VJbnRyaW5zaWNPbmVfID0gb25lOwotICAgICAgICByaXNlSW50cmluc2ljVHdvXyA9IHR3bzsKLSAgICB9IGVsc2UgewotICAgICAgICBub3dSaXNlXyA9IDA7Ci0gICAgICAgIGhhc0ZhbGxJbnRyaW5zaWNfID0gMTsKLSAgICAgICAgZmFsbEludHJpbnNpY09uZV8gPSBvbmU7Ci0gICAgICAgIGZhbGxJbnRyaW5zaWNUd29fID0gdHdvOwotICAgIH0KLX0KLQotdm9pZAotbGVmaVRpbWluZzo6YWRkUmlzZUZhbGxWYXJpYWJsZShkb3VibGUgIG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICB0d28pCi17Ci0gICAgaWYgKG5vd1Jpc2VfID09IDEpIHsKLSAgICAgICAgcmlzZUludHJpbnNpY1RocmVlXyA9IG9uZTsKLSAgICAgICAgcmlzZUludHJpbnNpY0ZvdXJfID0gdHdvOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZhbGxJbnRyaW5zaWNUaHJlZV8gPSBvbmU7Ci0gICAgICAgIGZhbGxJbnRyaW5zaWNGb3VyXyA9IHR3bzsKLSAgICB9Ci19Ci0KLXZvaWQKLWxlZmlUaW1pbmc6OnNldFJpc2VSUyhkb3VibGUgICAgb25lLAotICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICB0d28pCi17Ci0gICAgaGFzUmlzZVJTXyA9IDE7Ci0gICAgcmlzZVJTT25lXyA9IG9uZTsKLSAgICByaXNlUlNUd29fID0gdHdvOwotfQotCi12b2lkCi1sZWZpVGltaW5nOjpzZXRGYWxsUlMoZG91YmxlICAgIG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgdHdvKQotewotICAgIGhhc0ZhbGxSU18gPSAxOwotICAgIGZhbGxSU09uZV8gPSBvbmU7Ci0gICAgZmFsbFJTVHdvXyA9IHR3bzsKLX0KLQotdm9pZAotbGVmaVRpbWluZzo6c2V0UmlzZUNTKGRvdWJsZSAgICBvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgIHR3bykKLXsKLSAgICBoYXNSaXNlQ1NfID0gMTsKLSAgICByaXNlQ1NPbmVfID0gb25lOwotICAgIHJpc2VDU1R3b18gPSB0d287Ci19Ci0KLXZvaWQKLWxlZmlUaW1pbmc6OnNldEZhbGxDUyhkb3VibGUgICAgb25lLAotICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICB0d28pCi17Ci0gICAgaGFzRmFsbENTXyA9IDE7Ci0gICAgZmFsbENTT25lXyA9IG9uZTsKLSAgICBmYWxsQ1NUd29fID0gdHdvOwotfQotCi12b2lkCi1sZWZpVGltaW5nOjpzZXRSaXNlQXR0MShkb3VibGUgIG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgdHdvKQotewotICAgIGhhc1Jpc2VBdHQxXyA9IDE7Ci0gICAgcmlzZUF0dDFPbmVfID0gb25lOwotICAgIHJpc2VBdHQxVHdvXyA9IHR3bzsKLX0KLQotdm9pZAotbGVmaVRpbWluZzo6c2V0RmFsbEF0dDEoZG91YmxlICBvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgIHR3bykKLXsKLSAgICBoYXNGYWxsQXR0MV8gPSAxOwotICAgIGZhbGxBdHQxT25lXyA9IG9uZTsKLSAgICBmYWxsQXR0MVR3b18gPSB0d287Ci19Ci0KLXZvaWQKLWxlZmlUaW1pbmc6OnNldFJpc2VUbyhkb3VibGUgICAgb25lLAotICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICB0d28pCi17Ci0gICAgaGFzUmlzZVRvXyA9IDE7Ci0gICAgcmlzZVRvT25lXyA9IG9uZTsKLSAgICByaXNlVG9Ud29fID0gdHdvOwotfQotCi12b2lkCi1sZWZpVGltaW5nOjpzZXRGYWxsVG8oZG91YmxlICAgIG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgdHdvKQotewotICAgIGhhc0ZhbGxUb18gPSAxOwotICAgIGZhbGxUb09uZV8gPSBvbmU7Ci0gICAgZmFsbFRvVHdvXyA9IHR3bzsKLX0KLQotdm9pZAotbGVmaVRpbWluZzo6YWRkVW5hdGVuZXNzKGNvbnN0IGNoYXIgKnR5cCkKLXsKLSAgICBoYXNVbmF0ZW5lc3NfID0gMTsKLSAgICB1bmF0ZW5lc3NfID0gKGNoYXIqKSB0eXA7Ci19Ci0KLXZvaWQKLWxlZmlUaW1pbmc6OnNldFN0YWJsZShkb3VibGUgICAgICAgIG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICAgIHR3bywKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICp0eXApCi17Ci0gICAgaGFzU3RhYmxlVGltaW5nXyA9IDE7Ci0gICAgc3RhYmxlU2V0dXBfID0gb25lOwotICAgIHN0YWJsZUhvbGRfID0gdHdvOwotICAgIHN0YWJsZVJpc2VGYWxsXyA9IChjaGFyKikgdHlwOwotfQotCi12b2lkCi1sZWZpVGltaW5nOjphZGRUYWJsZUVudHJ5KGRvdWJsZSAgICBvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICB0d28sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICB0aHJlZSkKLXsKLSAgICBpbnQgICAgIGk7Ci0gICAgZG91YmxlICAqbjsKLSAgICBpZiAobnVtT2ZUYWJsZUVudHJpZXNfID49IHRhYmxlRW50cmllc0FsbG9jYXRlZF8pIHsKLSAgICAgICAgaW50IGxpbTsKLQotICAgICAgICBpZiAodGFibGVFbnRyaWVzQWxsb2NhdGVkXyA9PSAwKQotICAgICAgICAgICAgbGltID0gdGFibGVFbnRyaWVzQWxsb2NhdGVkXyA9IDI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGxpbSA9IHRhYmxlRW50cmllc0FsbG9jYXRlZF8gKj0gMjsKLSAgICAgICAgbiA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiAzICogbGltKTsKLSAgICAgICAgbGltID0gbnVtT2ZUYWJsZUVudHJpZXNfICogMzsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbTsgaSsrKSB7Ci0gICAgICAgICAgICBuW2ldID0gdGFibGVfW2ldOwotICAgICAgICB9Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAodGFibGVfKSk7Ci0gICAgICAgIHRhYmxlXyA9IG47Ci0gICAgfQotICAgIGkgPSBudW1PZlRhYmxlRW50cmllc18gKiAzOwotICAgIHRhYmxlX1tpKytdID0gb25lOwotICAgIHRhYmxlX1tpKytdID0gdHdvOwotICAgIHRhYmxlX1tpXSA9IHRocmVlOwotICAgIG51bU9mVGFibGVFbnRyaWVzXyArPSAxOwotfQotCi12b2lkCi1sZWZpVGltaW5nOjphZGRUYWJsZUF4aXNOdW1iZXIoZG91YmxlIG9uZSkKLXsKLSAgICBpZiAobnVtT2ZBeGlzTnVtYmVyc18gPT0gYXhpc051bWJlcnNBbGxvY2F0ZWRfKSB7Ci0gICAgICAgIGludCAgICAgaTsKLSAgICAgICAgaW50ICAgICBsaW07Ci0gICAgICAgIGRvdWJsZSAgKm47Ci0KLSAgICAgICAgaWYgKGF4aXNOdW1iZXJzQWxsb2NhdGVkXyA9PSAwKQotICAgICAgICAgICAgbGltID0gYXhpc051bWJlcnNBbGxvY2F0ZWRfID0gMjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbGltID0gYXhpc051bWJlcnNBbGxvY2F0ZWRfICo9IDI7Ci0gICAgICAgIG4gPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGltKTsKLSAgICAgICAgbGltID0gbnVtT2ZBeGlzTnVtYmVyc187Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW07IGkrKykKLSAgICAgICAgICAgIG5baV0gPSBheGlzTnVtYmVyc19baV07Ci0gICAgICAgIGlmIChheGlzTnVtYmVyc0FsbG9jYXRlZF8gPiAyKQotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChheGlzTnVtYmVyc18pKTsKLSAgICAgICAgYXhpc051bWJlcnNfID0gbjsKLSAgICB9Ci0gICAgYXhpc051bWJlcnNfWyhudW1PZkF4aXNOdW1iZXJzXykrK10gPSBvbmU7Ci19Ci0KLXZvaWQKLWxlZmlUaW1pbmc6OmFkZFJpc2VGYWxsU2xldyhkb3VibGUgIG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgIHR3bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgIHRocmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgZm91cikKLXsKLSAgICBpZiAobm93UmlzZV8pIHsKLSAgICAgICAgaGFzUmlzZVNsZXdfID0gMTsKLSAgICAgICAgcmlzZVNsZXdPbmVfID0gb25lOwotICAgICAgICByaXNlU2xld1R3b18gPSB0d287Ci0gICAgICAgIHJpc2VTbGV3VGhyZWVfID0gdGhyZWU7Ci0gICAgICAgIHJpc2VTbGV3Rm91cl8gPSBmb3VyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGhhc0ZhbGxTbGV3XyA9IDE7Ci0gICAgICAgIGZhbGxTbGV3T25lXyA9IG9uZTsKLSAgICAgICAgZmFsbFNsZXdUd29fID0gdHdvOwotICAgICAgICBmYWxsU2xld1RocmVlXyA9IHRocmVlOwotICAgICAgICBmYWxsU2xld0ZvdXJfID0gZm91cjsKLSAgICB9Ci19Ci0KLXZvaWQKLWxlZmlUaW1pbmc6OmFkZFJpc2VGYWxsU2xldzIoZG91YmxlIG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHR3bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRocmVlKQotewotICAgIGlmIChub3dSaXNlXykgewotICAgICAgICBoYXNSaXNlU2xldzJfID0gMTsKLSAgICAgICAgcmlzZVNsZXdGaXZlXyA9IG9uZTsKLSAgICAgICAgcmlzZVNsZXdTaXhfID0gdHdvOwotICAgICAgICByaXNlU2xld1NldmVuXyA9IHRocmVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGhhc0ZhbGxTbGV3Ml8gPSAxOwotICAgICAgICBmYWxsU2xld0ZpdmVfID0gb25lOwotICAgICAgICBmYWxsU2xld1NpeF8gPSB0d287Ci0gICAgICAgIGZhbGxTbGV3U2V2ZW5fID0gdGhyZWU7Ci0gICAgfQotfQotCi12b2lkCi1sZWZpVGltaW5nOjphZGRGcm9tUGluKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgaWYgKG51bUZyb21fID09IGZyb21BbGxvY2F0ZWRfKSB7Ci0gICAgICAgIGludCAgICAgbGltOwotICAgICAgICBpbnQgICAgIGk7Ci0gICAgICAgIGNoYXIgICAgKipuOwotCi0gICAgICAgIGlmIChmcm9tQWxsb2NhdGVkXyA9PSAwKQotICAgICAgICAgICAgbGltID0gZnJvbUFsbG9jYXRlZF8gPSAyOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBsaW0gPSBmcm9tQWxsb2NhdGVkXyAqPSAyOwotICAgICAgICBuID0gKGNoYXIqKikgbGVmTWFsbG9jKHNpemVvZihjaGFyKikgKiBsaW0pOwotICAgICAgICBsaW0gPSBudW1Gcm9tXzsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbTsgaSsrKQotICAgICAgICAgICAgbltpXSA9IGZyb21fW2ldOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGZyb21fKSk7Ci0gICAgICAgIGZyb21fID0gbjsKLSAgICB9Ci0gICAgZnJvbV9bKG51bUZyb21fKSsrXSA9IChjaGFyKikgbmFtZTsKLX0KLQotdm9pZAotbGVmaVRpbWluZzo6YWRkVG9QaW4oY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBpZiAobnVtVG9fID09IHRvQWxsb2NhdGVkXykgewotICAgICAgICBpbnQgICAgIGxpbTsKLSAgICAgICAgaW50ICAgICBpOwotICAgICAgICBjaGFyICAgICoqbjsKLQotICAgICAgICBpZiAodG9BbGxvY2F0ZWRfID09IDApCi0gICAgICAgICAgICBsaW0gPSB0b0FsbG9jYXRlZF8gPSAyOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBsaW0gPSB0b0FsbG9jYXRlZF8gKj0gMjsKLSAgICAgICAgbiA9IChjaGFyKiopIGxlZk1hbGxvYyhzaXplb2YoY2hhciopICogbGltKTsKLSAgICAgICAgbGltID0gbnVtVG9fOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGltOyBpKyspCi0gICAgICAgICAgICBuW2ldID0gdG9fW2ldOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHRvXykpOwotICAgICAgICB0b18gPSBuOwotICAgIH0KLSAgICB0b19bKG51bVRvXykrK10gPSAoY2hhciopIG5hbWU7Ci19Ci0KLXZvaWQKLWxlZmlUaW1pbmc6OmFkZERlbGF5KGNvbnN0IGNoYXIgKnJpc2VmYWxsLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdW5hdGVuZXNzLAotICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICBvbmUsCi0gICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgIHR3bywKLSAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgdGhyZWUpCi17Ci0gICAgaGFzRGVsYXlfID0gMTsKLSAgICBkZWxheVJpc2VPckZhbGxfID0gKGNoYXIqKSByaXNlZmFsbDsKLSAgICBkZWxheVVuYXRlbmVzc18gPSAoY2hhciopIHVuYXRlbmVzczsKLSAgICBkZWxheVRhYmxlT25lXyA9IG9uZTsKLSAgICBkZWxheVRhYmxlVHdvXyA9IHR3bzsKLSAgICBkZWxheVRhYmxlVGhyZWVfID0gdGhyZWU7Ci19Ci0KLXZvaWQKLWxlZmlUaW1pbmc6OmFkZFRyYW5zaXRpb24oY29uc3QgY2hhciAgICAqcmlzZWZhbGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKnVuYXRlbmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgICBvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICAgdHdvLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICAgIHRocmVlKQotewotICAgIGhhc1RyYW5zaXRpb25fID0gMTsKLSAgICB0cmFuc2l0aW9uUmlzZU9yRmFsbF8gPSAoY2hhciopIHJpc2VmYWxsOwotICAgIHRyYW5zaXRpb25VbmF0ZW5lc3NfID0gKGNoYXIqKSB1bmF0ZW5lc3M7Ci0gICAgdHJhbnNpdGlvblRhYmxlT25lXyA9IG9uZTsKLSAgICB0cmFuc2l0aW9uVGFibGVUd29fID0gdHdvOwotICAgIHRyYW5zaXRpb25UYWJsZVRocmVlXyA9IHRocmVlOwotfQotCi12b2lkCi1sZWZpVGltaW5nOjphZGRTREYxUGluKGNvbnN0IGNoYXIgICAqdHJpZ1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICBvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICB0d28sCi0gICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICB0aHJlZSkKLXsKLSAgICBoYXNTREZvbmVQaW5UcmlnZ2VyXyA9IDE7Ci0gICAgU0RGdHJpZ2dlclR5cGVfID0gKGNoYXIqKSB0cmlnVHlwZTsKLSAgICBTREZ0cmlnZ2VyVGFibGVPbmVfID0gb25lOwotICAgIFNERnRyaWdnZXJUYWJsZVR3b18gPSB0d287Ci0gICAgU0RGdHJpZ2dlclRhYmxlVGhyZWVfID0gdGhyZWU7Ci19Ci0KLXZvaWQKLWxlZmlUaW1pbmc6OmFkZFNERjJQaW5zKGNvbnN0IGNoYXIgICp0cmlnVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpmcm9tVHJpZywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICp0b1RyaWcsCi0gICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICBvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICB0d28sCi0gICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICB0aHJlZSkKLXsKLSAgICBoYXNTREZ0d29QaW5UcmlnZ2VyXyA9IDE7Ci0gICAgU0RGdHJpZ2dlclR5cGVfID0gKGNoYXIqKSB0cmlnVHlwZTsKLSAgICBTREZmcm9tVHJpZ2dlcl8gPSAoY2hhciopIGZyb21UcmlnOwotICAgIFNERnRvVHJpZ2dlcl8gPSAoY2hhciopIHRvVHJpZzsKLSAgICBTREZ0cmlnZ2VyVGFibGVPbmVfID0gb25lOwotICAgIFNERnRyaWdnZXJUYWJsZVR3b18gPSB0d287Ci0gICAgU0RGdHJpZ2dlclRhYmxlVGhyZWVfID0gdGhyZWU7Ci19Ci0KLXZvaWQKLWxlZmlUaW1pbmc6OnNldFNERmNvbmRTdGFydChjb25zdCBjaGFyICpjb25kU3RhcnQpCi17Ci0gICAgU0RGY29uZFN0YXJ0XyA9IChjaGFyKikgY29uZFN0YXJ0OwotfQotCi12b2lkCi1sZWZpVGltaW5nOjpzZXRTREZjb25kRW5kKGNvbnN0IGNoYXIgKmNvbmRFbmQpCi17Ci0gICAgU0RGY29uZEVuZF8gPSAoY2hhciopIGNvbmRFbmQ7Ci19Ci0KLXZvaWQKLWxlZmlUaW1pbmc6OnNldFNERmNvbmQoY29uc3QgY2hhciAqY29uZCkKLXsKLSAgICBTREZjb25kXyA9IChjaGFyKikgY29uZDsKLX0KLQotaW50Ci1sZWZpVGltaW5nOjpoYXNEYXRhKCkKLXsKLSAgICByZXR1cm4gKChudW1Gcm9tXykgPyAxIDogMCk7Ci19Ci0KLXZvaWQKLWxlZmlUaW1pbmc6OmNsZWFyKCkKLXsKLSAgICBudW1Gcm9tXyA9IDA7Ci0gICAgbnVtVG9fID0gMDsKLSAgICBudW1PZkF4aXNOdW1iZXJzXyA9IDA7Ci0gICAgbnVtT2ZUYWJsZUVudHJpZXNfID0gMDsKLQotICAgIG5vd1Jpc2VfID0gMDsKLSAgICBoYXNUcmFuc2l0aW9uXyA9IDA7Ci0gICAgaGFzRGVsYXlfID0gMDsKLSAgICBoYXNGYWxsU2xld18gPSAwOwotICAgIGhhc0ZhbGxTbGV3Ml8gPSAwOwotICAgIGhhc1Jpc2VTbGV3XyA9IDA7Ci0gICAgaGFzUmlzZVNsZXcyXyA9IDA7Ci0gICAgaGFzUmlzZUludHJpbnNpY18gPSAwOwotICAgIGhhc0ZhbGxJbnRyaW5zaWNfID0gMDsKLSAgICBoYXNSaXNlU2xld18gPSAwOwotICAgIGhhc0ZhbGxTbGV3XyA9IDA7Ci0gICAgaGFzUmlzZVNsZXcyXyA9IDA7Ci0gICAgaGFzRmFsbFNsZXcyXyA9IDA7Ci0gICAgaGFzUmlzZVJTXyA9IDA7Ci0gICAgaGFzUmlzZUNTXyA9IDA7Ci0gICAgaGFzRmFsbFJTXyA9IDA7Ci0gICAgaGFzRmFsbENTXyA9IDA7Ci0gICAgaGFzVW5hdGVuZXNzXyA9IDA7Ci0gICAgaGFzRmFsbEF0dDFfID0gMDsKLSAgICBoYXNSaXNlQXR0MV8gPSAwOwotICAgIGhhc0ZhbGxUb18gPSAwOwotICAgIGhhc1Jpc2VUb18gPSAwOwotICAgIGhhc1N0YWJsZVRpbWluZ18gPSAwOwotICAgIGhhc1NERm9uZVBpblRyaWdnZXJfID0gMDsKLSAgICBoYXNTREZ0d29QaW5UcmlnZ2VyXyA9IDA7Ci0gICAgaGFzU0RGY29uZFN0YXJ0XyA9IDA7Ci0gICAgaGFzU0RGY29uZEVuZF8gPSAwOwotICAgIGhhc1NERmNvbmRfID0gMDsKLX0KLQotaW50Ci1sZWZpVGltaW5nOjpudW1Gcm9tUGlucygpCi17Ci0gICAgcmV0dXJuIG51bUZyb21fOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlUaW1pbmc6OmZyb21QaW4oaW50IGluZGV4KQotewotICAgIHJldHVybiBmcm9tX1tpbmRleF07Ci19Ci0KLWludAotbGVmaVRpbWluZzo6bnVtVG9QaW5zKCkKLXsKLSAgICByZXR1cm4gbnVtVG9fOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlUaW1pbmc6OnRvUGluKGludCBpbmRleCkKLXsKLSAgICByZXR1cm4gdG9fW2luZGV4XTsKLX0KLQotaW50Ci1sZWZpVGltaW5nOjpoYXNUcmFuc2l0aW9uKCkKLXsKLSAgICByZXR1cm4gaGFzVHJhbnNpdGlvbl87Ci19Ci0KLWludAotbGVmaVRpbWluZzo6aGFzRGVsYXkoKQotewotICAgIHJldHVybiBoYXNEZWxheV87Ci19Ci0KLWludAotbGVmaVRpbWluZzo6aGFzUmlzZVNsZXcoKQotewotICAgIHJldHVybiBoYXNSaXNlU2xld187Ci19Ci0KLWludAotbGVmaVRpbWluZzo6aGFzUmlzZVNsZXcyKCkKLXsKLSAgICByZXR1cm4gaGFzUmlzZVNsZXcyXzsKLX0KLQotaW50Ci1sZWZpVGltaW5nOjpoYXNGYWxsU2xldygpCi17Ci0gICAgcmV0dXJuIGhhc0ZhbGxTbGV3XzsKLX0KLQotaW50Ci1sZWZpVGltaW5nOjpoYXNGYWxsU2xldzIoKQotewotICAgIHJldHVybiBoYXNGYWxsU2xldzJfOwotfQotCi1pbnQKLWxlZmlUaW1pbmc6Omhhc1Jpc2VJbnRyaW5zaWMoKQotewotICAgIHJldHVybiBoYXNSaXNlSW50cmluc2ljXzsKLX0KLQotaW50Ci1sZWZpVGltaW5nOjpoYXNGYWxsSW50cmluc2ljKCkKLXsKLSAgICByZXR1cm4gaGFzRmFsbEludHJpbnNpY187Ci19Ci0KLWludAotbGVmaVRpbWluZzo6aGFzU0RGb25lUGluVHJpZ2dlcigpCi17Ci0gICAgcmV0dXJuIGhhc1NERm9uZVBpblRyaWdnZXJfOwotfQotCi1pbnQKLWxlZmlUaW1pbmc6Omhhc1NERnR3b1BpblRyaWdnZXIoKQotewotICAgIHJldHVybiBoYXNTREZ0d29QaW5UcmlnZ2VyXzsKLX0KLQotaW50Ci1sZWZpVGltaW5nOjpoYXNTREZjb25kU3RhcnQoKQotewotICAgIHJldHVybiBoYXNTREZjb25kU3RhcnRfOwotfQotCi1pbnQKLWxlZmlUaW1pbmc6Omhhc1NERmNvbmRFbmQoKQotewotICAgIHJldHVybiBoYXNTREZjb25kRW5kXzsKLX0KLQotaW50Ci1sZWZpVGltaW5nOjpoYXNTREZjb25kKCkKLXsKLSAgICByZXR1cm4gaGFzU0RGY29uZF87Ci19Ci0KLWludAotbGVmaVRpbWluZzo6bnVtT2ZBeGlzTnVtYmVycygpCi17Ci0gICAgcmV0dXJuIG51bU9mQXhpc051bWJlcnNfOwotfQotCi1kb3VibGUgKgotbGVmaVRpbWluZzo6YXhpc051bWJlcnMoKQotewotICAgIHJldHVybiBheGlzTnVtYmVyc187Ci19Ci0KLWludAotbGVmaVRpbWluZzo6bnVtT2ZUYWJsZUVudHJpZXMoKQotewotICAgIHJldHVybiBudW1PZlRhYmxlRW50cmllc187Ci19Ci0KLXZvaWQKLWxlZmlUaW1pbmc6OnRhYmxlRW50cnkoaW50ICAgICAgbnVtLAotICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAqb25lLAotICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAqdHdvLAotICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAqdGhyZWUpCi17Ci0gICAgbnVtICo9IDM7Ci0gICAgKm9uZSA9IHRhYmxlX1tudW1dOwotICAgIG51bSsrOwotICAgICp0d28gPSB0YWJsZV9bbnVtXTsKLSAgICBudW0rKzsKLSAgICAqdGhyZWUgPSB0YWJsZV9bbnVtXTsKLX0KLQotY29uc3QgY2hhciAqCi1sZWZpVGltaW5nOjpkZWxheVJpc2VPckZhbGwoKQotewotICAgIHJldHVybiBkZWxheVJpc2VPckZhbGxfOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlUaW1pbmc6OmRlbGF5VW5hdGVuZXNzKCkKLXsKLSAgICByZXR1cm4gZGVsYXlVbmF0ZW5lc3NfOwotfQotCi1kb3VibGUKLWxlZmlUaW1pbmc6OmRlbGF5VGFibGVPbmUoKQotewotICAgIHJldHVybiBkZWxheVRhYmxlT25lXzsKLX0KLQotZG91YmxlCi1sZWZpVGltaW5nOjpkZWxheVRhYmxlVHdvKCkKLXsKLSAgICByZXR1cm4gZGVsYXlUYWJsZVR3b187Ci19Ci0KLWRvdWJsZQotbGVmaVRpbWluZzo6ZGVsYXlUYWJsZVRocmVlKCkKLXsKLSAgICByZXR1cm4gZGVsYXlUYWJsZVRocmVlXzsKLX0KLQotY29uc3QgY2hhciAqCi1sZWZpVGltaW5nOjp0cmFuc2l0aW9uUmlzZU9yRmFsbCgpCi17Ci0gICAgcmV0dXJuIHRyYW5zaXRpb25SaXNlT3JGYWxsXzsKLX0KLQotY29uc3QgY2hhciAqCi1sZWZpVGltaW5nOjp0cmFuc2l0aW9uVW5hdGVuZXNzKCkKLXsKLSAgICByZXR1cm4gdHJhbnNpdGlvblVuYXRlbmVzc187Ci19Ci0KLWRvdWJsZQotbGVmaVRpbWluZzo6dHJhbnNpdGlvblRhYmxlT25lKCkKLXsKLSAgICByZXR1cm4gdHJhbnNpdGlvblRhYmxlT25lXzsKLX0KLQotZG91YmxlCi1sZWZpVGltaW5nOjp0cmFuc2l0aW9uVGFibGVUd28oKQotewotICAgIHJldHVybiB0cmFuc2l0aW9uVGFibGVUd29fOwotfQotCi1kb3VibGUKLWxlZmlUaW1pbmc6OnRyYW5zaXRpb25UYWJsZVRocmVlKCkKLXsKLSAgICByZXR1cm4gdHJhbnNpdGlvblRhYmxlVGhyZWVfOwotfQotCi1kb3VibGUKLWxlZmlUaW1pbmc6OnJpc2VJbnRyaW5zaWNPbmUoKQotewotICAgIHJldHVybiByaXNlSW50cmluc2ljT25lXzsKLX0KLQotZG91YmxlCi1sZWZpVGltaW5nOjpyaXNlSW50cmluc2ljVHdvKCkKLXsKLSAgICByZXR1cm4gcmlzZUludHJpbnNpY1R3b187Ci19Ci0KLWRvdWJsZQotbGVmaVRpbWluZzo6cmlzZUludHJpbnNpY1RocmVlKCkKLXsKLSAgICByZXR1cm4gcmlzZUludHJpbnNpY1RocmVlXzsKLX0KLQotZG91YmxlCi1sZWZpVGltaW5nOjpyaXNlSW50cmluc2ljRm91cigpCi17Ci0gICAgcmV0dXJuIHJpc2VJbnRyaW5zaWNGb3VyXzsKLX0KLQotZG91YmxlCi1sZWZpVGltaW5nOjpmYWxsSW50cmluc2ljT25lKCkKLXsKLSAgICByZXR1cm4gZmFsbEludHJpbnNpY09uZV87Ci19Ci0KLWRvdWJsZQotbGVmaVRpbWluZzo6ZmFsbEludHJpbnNpY1R3bygpCi17Ci0gICAgcmV0dXJuIGZhbGxJbnRyaW5zaWNUd29fOwotfQotCi1kb3VibGUKLWxlZmlUaW1pbmc6OmZhbGxJbnRyaW5zaWNUaHJlZSgpCi17Ci0gICAgcmV0dXJuIGZhbGxJbnRyaW5zaWNUaHJlZV87Ci19Ci0KLWRvdWJsZQotbGVmaVRpbWluZzo6ZmFsbEludHJpbnNpY0ZvdXIoKQotewotICAgIHJldHVybiBmYWxsSW50cmluc2ljRm91cl87Ci19Ci0KLWRvdWJsZQotbGVmaVRpbWluZzo6cmlzZVNsZXdPbmUoKQotewotICAgIHJldHVybiByaXNlU2xld09uZV87Ci19Ci0KLWRvdWJsZQotbGVmaVRpbWluZzo6cmlzZVNsZXdUd28oKQotewotICAgIHJldHVybiByaXNlU2xld1R3b187Ci19Ci0KLWRvdWJsZQotbGVmaVRpbWluZzo6cmlzZVNsZXdUaHJlZSgpCi17Ci0gICAgcmV0dXJuIHJpc2VTbGV3VGhyZWVfOwotfQotCi1kb3VibGUKLWxlZmlUaW1pbmc6OnJpc2VTbGV3Rm91cigpCi17Ci0gICAgcmV0dXJuIHJpc2VTbGV3Rm91cl87Ci19Ci0KLWRvdWJsZQotbGVmaVRpbWluZzo6cmlzZVNsZXdGaXZlKCkKLXsKLSAgICByZXR1cm4gcmlzZVNsZXdGaXZlXzsKLX0KLQotZG91YmxlCi1sZWZpVGltaW5nOjpyaXNlU2xld1NpeCgpCi17Ci0gICAgcmV0dXJuIHJpc2VTbGV3U2l4XzsKLX0KLQotZG91YmxlCi1sZWZpVGltaW5nOjpyaXNlU2xld1NldmVuKCkKLXsKLSAgICByZXR1cm4gcmlzZVNsZXdTZXZlbl87Ci19Ci0KLWRvdWJsZQotbGVmaVRpbWluZzo6ZmFsbFNsZXdPbmUoKQotewotICAgIHJldHVybiBmYWxsU2xld09uZV87Ci19Ci0KLWRvdWJsZQotbGVmaVRpbWluZzo6ZmFsbFNsZXdUd28oKQotewotICAgIHJldHVybiBmYWxsU2xld1R3b187Ci19Ci0KLWRvdWJsZQotbGVmaVRpbWluZzo6ZmFsbFNsZXdUaHJlZSgpCi17Ci0gICAgcmV0dXJuIGZhbGxTbGV3VGhyZWVfOwotfQotCi1kb3VibGUKLWxlZmlUaW1pbmc6OmZhbGxTbGV3Rm91cigpCi17Ci0gICAgcmV0dXJuIGZhbGxTbGV3Rm91cl87Ci19Ci0KLWRvdWJsZQotbGVmaVRpbWluZzo6ZmFsbFNsZXdGaXZlKCkKLXsKLSAgICByZXR1cm4gZmFsbFNsZXdGaXZlXzsKLX0KLQotZG91YmxlCi1sZWZpVGltaW5nOjpmYWxsU2xld1NpeCgpCi17Ci0gICAgcmV0dXJuIGZhbGxTbGV3U2l4XzsKLX0KLQotZG91YmxlCi1sZWZpVGltaW5nOjpmYWxsU2xld1NldmVuKCkKLXsKLSAgICByZXR1cm4gZmFsbFNsZXdTZXZlbl87Ci19Ci0KLWludAotbGVmaVRpbWluZzo6aGFzUmlzZVJTKCkKLXsKLSAgICByZXR1cm4gaGFzUmlzZVJTXzsKLX0KLQotZG91YmxlCi1sZWZpVGltaW5nOjpyaXNlUlNPbmUoKQotewotICAgIHJldHVybiByaXNlUlNPbmVfOwotfQotCi1kb3VibGUKLWxlZmlUaW1pbmc6OnJpc2VSU1R3bygpCi17Ci0gICAgcmV0dXJuIHJpc2VSU1R3b187Ci19Ci0KLWludAotbGVmaVRpbWluZzo6aGFzUmlzZUNTKCkKLXsKLSAgICByZXR1cm4gaGFzUmlzZUNTXzsKLX0KLQotZG91YmxlCi1sZWZpVGltaW5nOjpyaXNlQ1NPbmUoKQotewotICAgIHJldHVybiByaXNlQ1NPbmVfOwotfQotCi1kb3VibGUKLWxlZmlUaW1pbmc6OnJpc2VDU1R3bygpCi17Ci0gICAgcmV0dXJuIHJpc2VDU1R3b187Ci19Ci0KLWludAotbGVmaVRpbWluZzo6aGFzRmFsbFJTKCkKLXsKLSAgICByZXR1cm4gaGFzRmFsbFJTXzsKLX0KLQotZG91YmxlCi1sZWZpVGltaW5nOjpmYWxsUlNPbmUoKQotewotICAgIHJldHVybiBmYWxsUlNPbmVfOwotfQotCi1kb3VibGUKLWxlZmlUaW1pbmc6OmZhbGxSU1R3bygpCi17Ci0gICAgcmV0dXJuIGZhbGxSU1R3b187Ci19Ci0KLWludAotbGVmaVRpbWluZzo6aGFzRmFsbENTKCkKLXsKLSAgICByZXR1cm4gaGFzRmFsbENTXzsKLX0KLQotZG91YmxlCi1sZWZpVGltaW5nOjpmYWxsQ1NPbmUoKQotewotICAgIHJldHVybiBmYWxsQ1NPbmVfOwotfQotCi1kb3VibGUKLWxlZmlUaW1pbmc6OmZhbGxDU1R3bygpCi17Ci0gICAgcmV0dXJuIGZhbGxDU1R3b187Ci19Ci0KLWludAotbGVmaVRpbWluZzo6aGFzVW5hdGVuZXNzKCkKLXsKLSAgICByZXR1cm4gaGFzVW5hdGVuZXNzXzsKLX0KLQotY29uc3QgY2hhciAqCi1sZWZpVGltaW5nOjp1bmF0ZW5lc3MoKQotewotICAgIHJldHVybiB1bmF0ZW5lc3NfOwotfQotCi1pbnQKLWxlZmlUaW1pbmc6Omhhc0ZhbGxBdHQxKCkKLXsKLSAgICByZXR1cm4gaGFzRmFsbEF0dDFfOwotfQotCi1kb3VibGUKLWxlZmlUaW1pbmc6OmZhbGxBdHQxT25lKCkKLXsKLSAgICByZXR1cm4gZmFsbEF0dDFPbmVfOwotfQotCi1kb3VibGUKLWxlZmlUaW1pbmc6OmZhbGxBdHQxVHdvKCkKLXsKLSAgICByZXR1cm4gZmFsbEF0dDFUd29fOwotfQotCi1pbnQKLWxlZmlUaW1pbmc6Omhhc1Jpc2VBdHQxKCkKLXsKLSAgICByZXR1cm4gaGFzUmlzZUF0dDFfOwotfQotCi1kb3VibGUKLWxlZmlUaW1pbmc6OnJpc2VBdHQxT25lKCkKLXsKLSAgICByZXR1cm4gcmlzZUF0dDFPbmVfOwotfQotCi1kb3VibGUKLWxlZmlUaW1pbmc6OnJpc2VBdHQxVHdvKCkKLXsKLSAgICByZXR1cm4gcmlzZUF0dDFUd29fOwotfQotCi1pbnQKLWxlZmlUaW1pbmc6Omhhc0ZhbGxUbygpCi17Ci0gICAgcmV0dXJuIGhhc0ZhbGxUb187Ci19Ci0KLWRvdWJsZQotbGVmaVRpbWluZzo6ZmFsbFRvT25lKCkKLXsKLSAgICByZXR1cm4gZmFsbFRvT25lXzsKLX0KLQotZG91YmxlCi1sZWZpVGltaW5nOjpmYWxsVG9Ud28oKQotewotICAgIHJldHVybiBmYWxsVG9Ud29fOwotfQotCi1pbnQKLWxlZmlUaW1pbmc6Omhhc1Jpc2VUbygpCi17Ci0gICAgcmV0dXJuIGhhc1Jpc2VUb187Ci19Ci0KLWRvdWJsZQotbGVmaVRpbWluZzo6cmlzZVRvT25lKCkKLXsKLSAgICByZXR1cm4gcmlzZVRvT25lXzsKLX0KLQotZG91YmxlCi1sZWZpVGltaW5nOjpyaXNlVG9Ud28oKQotewotICAgIHJldHVybiByaXNlVG9Ud29fOwotfQotCi1pbnQKLWxlZmlUaW1pbmc6Omhhc1N0YWJsZVRpbWluZygpCi17Ci0gICAgcmV0dXJuIGhhc1N0YWJsZVRpbWluZ187Ci19Ci0KLWRvdWJsZQotbGVmaVRpbWluZzo6c3RhYmxlU2V0dXAoKQotewotICAgIHJldHVybiBzdGFibGVTZXR1cF87Ci19Ci0KLWRvdWJsZQotbGVmaVRpbWluZzo6c3RhYmxlSG9sZCgpCi17Ci0gICAgcmV0dXJuIHN0YWJsZUhvbGRfOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlUaW1pbmc6OnN0YWJsZVJpc2VGYWxsKCkKLXsKLSAgICByZXR1cm4gc3RhYmxlUmlzZUZhbGxfOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlUaW1pbmc6OlNERm9uZVBpblRyaWdnZXJUeXBlKCkKLXsKLSAgICByZXR1cm4gU0RGdHJpZ2dlclR5cGVfOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlUaW1pbmc6OlNERnR3b1BpblRyaWdnZXJUeXBlKCkKLXsKLSAgICByZXR1cm4gU0RGdHJpZ2dlclR5cGVfOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlUaW1pbmc6OlNERmZyb21UcmlnZ2VyKCkKLXsKLSAgICByZXR1cm4gU0RGZnJvbVRyaWdnZXJfOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlUaW1pbmc6OlNERnRvVHJpZ2dlcigpCi17Ci0gICAgcmV0dXJuIFNERnRvVHJpZ2dlcl87Ci19Ci0KLWRvdWJsZQotbGVmaVRpbWluZzo6U0RGdHJpZ2dlck9uZSgpCi17Ci0gICAgcmV0dXJuIFNERnRyaWdnZXJUYWJsZU9uZV87Ci19Ci0KLWRvdWJsZQotbGVmaVRpbWluZzo6U0RGdHJpZ2dlclR3bygpCi17Ci0gICAgcmV0dXJuIFNERnRyaWdnZXJUYWJsZVR3b187Ci19Ci0KLWRvdWJsZQotbGVmaVRpbWluZzo6U0RGdHJpZ2dlclRocmVlKCkKLXsKLSAgICByZXR1cm4gU0RGdHJpZ2dlclRhYmxlVGhyZWVfOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlUaW1pbmc6OlNERmNvbmRTdGFydCgpCi17Ci0gICAgcmV0dXJuIFNERmNvbmRTdGFydF87Ci19Ci0KLWNvbnN0IGNoYXIgKgotbGVmaVRpbWluZzo6U0RGY29uZEVuZCgpCi17Ci0gICAgcmV0dXJuIFNERmNvbmRFbmRfOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlUaW1pbmc6OlNERmNvbmQoKQotewotICAgIHJldHVybiBTREZjb25kXzsKLX0KLQotbGVmaU1hY3JvU2l0ZTo6bGVmaU1hY3JvU2l0ZShjb25zdCBjaGFyICAgICAgICAgICAgKm5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsZWZpU2l0ZVBhdHRlcm4gKnBhdHRlcm4pCi06IHNpdGVOYW1lXyhuYW1lKSwKLSAgc2l0ZVBhdHRlcm5fKHBhdHRlcm4pCi17Ci19Ci0KLWNvbnN0IGNoYXIgKgotbGVmaU1hY3JvU2l0ZTo6c2l0ZU5hbWUoKSBjb25zdAotewotICAgIHJldHVybiBzaXRlTmFtZV87Ci19Ci0KLWNvbnN0IGxlZmlTaXRlUGF0dGVybiAqCi1sZWZpTWFjcm9TaXRlOjpzaXRlUGF0dGVybigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHNpdGVQYXR0ZXJuXzsKLX0KLQotbGVmaU1hY3JvRm9yZWlnbjo6bGVmaU1hY3JvRm9yZWlnbihjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIGhhc1B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgaGFzT3JpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIG9yaWVudCkKLTogY2VsbE5hbWVfKG5hbWUpLAotICBjZWxsSGFzUHRzXyhoYXNQdHMpLAotICBweV8oeSksCi0gIHB4Xyh4KSwKLSAgY2VsbEhhc09yaWVudF8oaGFzT3JpZW50KSwKLSAgY2VsbE9yaWVudF8ob3JpZW50KQotewotfQotCi1jb25zdCBjaGFyICoKLWxlZmlNYWNyb0ZvcmVpZ246OmNlbGxOYW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gY2VsbE5hbWVfOwotfQotCi1pbnQgCi1sZWZpTWFjcm9Gb3JlaWduOjpjZWxsSGFzUHRzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gY2VsbEhhc1B0c187Ci19Ci0KLWRvdWJsZQotbGVmaU1hY3JvRm9yZWlnbjo6cHgoKSBjb25zdAotewotICAgIHJldHVybiBweF87Ci19Ci0KLWRvdWJsZQotbGVmaU1hY3JvRm9yZWlnbjo6cHkoKSBjb25zdAotewotICAgIHJldHVybiBweV87Ci19Ci0KLWludAotbGVmaU1hY3JvRm9yZWlnbjo6Y2VsbEhhc09yaWVudCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGNlbGxIYXNPcmllbnRfOwotfQotCi1pbnQKLWxlZmlNYWNyb0ZvcmVpZ246OmNlbGxPcmllbnQoKSBjb25zdAotewotICAgIHJldHVybiBjZWxsT3JpZW50XzsKLX0KLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaU1hY3JvLmhwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaU1hY3JvLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNmY2RjZS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlNYWNyby5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw5MzkgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiAtIDIwMTcsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaWZuZGVmIGxlZmlNYWNyb19oCi0jZGVmaW5lIGxlZmlNYWNyb19oCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImxlZmlLUkRlZnMuaHBwIgotI2luY2x1ZGUgImxlZmlNaXNjLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotY2xhc3MgbGVmaU9ic3RydWN0aW9uIHsKLXB1YmxpYzoKLSAgbGVmaU9ic3RydWN0aW9uKCk7Ci0gIHZvaWQgSW5pdCgpOwotCi0gIHZvaWQgRGVzdHJveSgpOwotICB+bGVmaU9ic3RydWN0aW9uKCk7Ci0KLSAgdm9pZCBjbGVhcigpOwotICB2b2lkIHNldEdlb21ldHJpZXMobGVmaUdlb21ldHJpZXMqIGcpOwotCi0gIGxlZmlHZW9tZXRyaWVzKiBnZW9tZXRyaWVzKCkgY29uc3Q7Ci0KLSAgdm9pZCBwcmludChGSUxFKiBmKSBjb25zdDsKLQotcHJvdGVjdGVkOgotCi0gIGxlZmlHZW9tZXRyaWVzKiBnZW9tZXRyaWVzXzsKLX07Ci0KLS8vIDUuNQotY2xhc3MgbGVmaVBpbkFudGVubmFNb2RlbCB7Ci1wdWJsaWM6Ci0gIGxlZmlQaW5BbnRlbm5hTW9kZWwoKTsKLSAgfmxlZmlQaW5BbnRlbm5hTW9kZWwoKTsKLQotICB2b2lkIEluaXQoKTsKLSAgdm9pZCBjbGVhcigpOwotICB2b2lkIERlc3Ryb3koKTsKLQotICB2b2lkIHNldEFudGVubmFNb2RlbChpbnQgb3hpZGUpOwotICB2b2lkIGFkZEFudGVubmFHYXRlQXJlYShkb3VibGUgdmFsdWUsIGNvbnN0IGNoYXIqIGxheWVyKTsKLSAgdm9pZCBhZGRBbnRlbm5hTWF4QXJlYUNhcihkb3VibGUgdmFsdWUsIGNvbnN0IGNoYXIqIGxheWVyKTsKLSAgdm9pZCBhZGRBbnRlbm5hTWF4U2lkZUFyZWFDYXIoZG91YmxlIHZhbHVlLCBjb25zdCBjaGFyKiBsYXllcik7Ci0gIHZvaWQgYWRkQW50ZW5uYU1heEN1dENhcihkb3VibGUgdmFsdWUsIGNvbnN0IGNoYXIqIGxheWVyKTsKLSAgdm9pZCBzZXRBbnRlbm5hUmV0dXJuRmxhZyhpbnQgZmxhZyk7Ci0KLSAgaW50IGhhc0FudGVubmFHYXRlQXJlYSgpIGNvbnN0OwotICBpbnQgaGFzQW50ZW5uYU1heEFyZWFDYXIoKSBjb25zdDsKLSAgaW50IGhhc0FudGVubmFNYXhTaWRlQXJlYUNhcigpIGNvbnN0OwotICBpbnQgaGFzQW50ZW5uYU1heEN1dENhcigpIGNvbnN0OwotCi0gIGNoYXIqIGFudGVubmFPeGlkZSgpIGNvbnN0OwotCi0gIGludCBudW1BbnRlbm5hR2F0ZUFyZWEoKSBjb25zdDsKLSAgZG91YmxlIGFudGVubmFHYXRlQXJlYShpbnQgaW5kZXgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBhbnRlbm5hR2F0ZUFyZWFMYXllcihpbnQgaW5kZXgpIGNvbnN0OwotCi0gIGludCBudW1BbnRlbm5hTWF4QXJlYUNhcigpIGNvbnN0OwotICBkb3VibGUgYW50ZW5uYU1heEFyZWFDYXIoaW50IGluZGV4KSBjb25zdDsKLSAgY29uc3QgY2hhciogYW50ZW5uYU1heEFyZWFDYXJMYXllcihpbnQgaW5kZXgpIGNvbnN0OwotCi0gIGludCBudW1BbnRlbm5hTWF4U2lkZUFyZWFDYXIoKSBjb25zdDsKLSAgZG91YmxlIGFudGVubmFNYXhTaWRlQXJlYUNhcihpbnQgaW5kZXgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBhbnRlbm5hTWF4U2lkZUFyZWFDYXJMYXllcihpbnQgaW5kZXgpIGNvbnN0OwotCi0gIGludCBudW1BbnRlbm5hTWF4Q3V0Q2FyKCkgY29uc3Q7Ci0gIGRvdWJsZSBhbnRlbm5hTWF4Q3V0Q2FyKGludCBpbmRleCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIGFudGVubmFNYXhDdXRDYXJMYXllcihpbnQgaW5kZXgpIGNvbnN0OwotCi0gIGludCBoYXNSZXR1cm4oKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICBjaGFyKiBveGlkZV87Ci0gIGludCAgIGhhc1JldHVybl87Ci0KLSAgaW50IG51bUFudGVubmFHYXRlQXJlYV87Ci0gIGludCBhbnRlbm5hR2F0ZUFyZWFBbGxvY2F0ZWRfOwotICBkb3VibGUqIGFudGVubmFHYXRlQXJlYV87Ci0gIGNoYXIqKiBhbnRlbm5hR2F0ZUFyZWFMYXllcl87Ci0KLSAgaW50IG51bUFudGVubmFNYXhBcmVhQ2FyXzsKLSAgaW50IGFudGVubmFNYXhBcmVhQ2FyQWxsb2NhdGVkXzsKLSAgZG91YmxlKiBhbnRlbm5hTWF4QXJlYUNhcl87Ci0gIGNoYXIqKiBhbnRlbm5hTWF4QXJlYUNhckxheWVyXzsKLQotICBpbnQgbnVtQW50ZW5uYU1heFNpZGVBcmVhQ2FyXzsKLSAgaW50IGFudGVubmFNYXhTaWRlQXJlYUNhckFsbG9jYXRlZF87Ci0gIGRvdWJsZSogYW50ZW5uYU1heFNpZGVBcmVhQ2FyXzsKLSAgY2hhcioqIGFudGVubmFNYXhTaWRlQXJlYUNhckxheWVyXzsKLQotICBpbnQgbnVtQW50ZW5uYU1heEN1dENhcl87Ci0gIGludCBhbnRlbm5hTWF4Q3V0Q2FyQWxsb2NhdGVkXzsKLSAgZG91YmxlKiBhbnRlbm5hTWF4Q3V0Q2FyXzsKLSAgY2hhcioqIGFudGVubmFNYXhDdXRDYXJMYXllcl87Ci19OwotCi1jbGFzcyBsZWZpUGluIHsKLXB1YmxpYzoKLSAgbGVmaVBpbigpOwotICB2b2lkIEluaXQoKTsKLQotICB2b2lkIERlc3Ryb3koKTsKLSAgfmxlZmlQaW4oKTsKLQotICB2b2lkIGNsZWFyKCk7Ci0gIHZvaWQgYnVtcChjaGFyKiogYXJyYXksIGludCBsZW4sIGludCogc2l6ZSk7Ci0gIHZvaWQgc2V0TmFtZShjb25zdCBjaGFyKiBuYW1lKTsKLSAgdm9pZCBhZGRQb3J0KGxlZmlHZW9tZXRyaWVzKiBnKTsKLSAgdm9pZCBhZGRGb3JlaWduKGNvbnN0IGNoYXIqIG5hbWUsIGludCBoYXNQbnQsIGRvdWJsZSB4LCBkb3VibGUgeSwgaW50IG9yaWVudCk7Ci0gIHZvaWQgc2V0TEVRKGNvbnN0IGNoYXIqIG5hbWUpOwotICB2b2lkIHNldERpcmVjdGlvbihjb25zdCBjaGFyKiBuYW1lKTsKLSAgdm9pZCBzZXRVc2UoY29uc3QgY2hhciogbmFtZSk7Ci0gIHZvaWQgc2V0U2hhcGUoY29uc3QgY2hhciogbmFtZSk7Ci0gIHZvaWQgc2V0TXVzdGpvaW4oY29uc3QgY2hhciogbmFtZSk7Ci0gIHZvaWQgc2V0T3V0TWFyZ2luKGRvdWJsZSBoaWdoLCBkb3VibGUgbG93KTsKLSAgdm9pZCBzZXRPdXRSZXNpc3RhbmNlKGRvdWJsZSBoaWdoLCBkb3VibGUgbG93KTsKLSAgdm9pZCBzZXRJbk1hcmdpbihkb3VibGUgaGlnaCwgZG91YmxlIGxvdyk7Ci0gIHZvaWQgc2V0UG93ZXIoZG91YmxlIHBvd2VyKTsKLSAgdm9pZCBzZXRMZWFrYWdlKGRvdWJsZSBjdXJyZW50KTsKLSAgdm9pZCBzZXRNYXhsb2FkKGRvdWJsZSBjYXBhY2l0YW5jZSk7Ci0gIHZvaWQgc2V0TWF4ZGVsYXkoZG91YmxlIGRlbGF5VGltZSk7Ci0gIHZvaWQgc2V0Q2FwYWNpdGFuY2UoZG91YmxlIGNhcGFjaXRhbmNlKTsKLSAgdm9pZCBzZXRSZXNpc3RhbmNlKGRvdWJsZSByZXNpc3RhbmNlKTsKLSAgdm9pZCBzZXRQdWxsZG93bnJlcyhkb3VibGUgcmVzaXN0YW5jZSk7Ci0gIHZvaWQgc2V0VGllb2Zmcihkb3VibGUgcmVzaXN0YW5jZSk7Ci0gIHZvaWQgc2V0VkhJKGRvdWJsZSB2b2x0YWdlKTsKLSAgdm9pZCBzZXRWTE8oZG91YmxlIHZvbHRhZ2UpOwotICB2b2lkIHNldFJpc2VWb2x0YWdlKGRvdWJsZSB2b2x0YWdlKTsKLSAgdm9pZCBzZXRGYWxsVm9sdGFnZShkb3VibGUgdm9sdGFnZSk7Ci0gIHZvaWQgc2V0UmlzZVRocmVzaChkb3VibGUgY2FwYWNpdGFuY2UpOwotICB2b2lkIHNldEZhbGxUaHJlc2goZG91YmxlIGNhcGFjaXRhbmNlKTsKLSAgdm9pZCBzZXRSaXNlU2F0Y3VyKGRvdWJsZSBjdXJyZW50KTsKLSAgdm9pZCBzZXRGYWxsU2F0Y3VyKGRvdWJsZSBjdXJyZW50KTsKLSAgdm9pZCBzZXRDdXJyZW50U291cmNlKGNvbnN0IGNoYXIqIG5hbWUpOwotICB2b2lkIHNldFRhYmxlcyhjb25zdCBjaGFyKiBoaWdoTmFtZSwgY29uc3QgY2hhciogbG93TmFtZSk7Ci0gIHZvaWQgc2V0UHJvcGVydHkoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdmFsdWUsIGNvbnN0IGNoYXIgdHlwZSk7Ci0gIHZvaWQgc2V0TnVtUHJvcGVydHkoY29uc3QgY2hhciogbmFtZSwgZG91YmxlIGQsIGNvbnN0IGNoYXIqIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgdHlwZSk7Ci0gIHZvaWQgYWRkQW50ZW5uYU1vZGVsKGludCBveGlkZSk7ICAgICAgIC8vIDUuNQotICB2b2lkIGFkZEFudGVubmFTaXplKGRvdWJsZSB2YWx1ZSwgY29uc3QgY2hhciogbGF5ZXIpOwotICB2b2lkIGFkZEFudGVubmFNZXRhbEFyZWEoZG91YmxlIHZhbHVlLCBjb25zdCBjaGFyKiBsYXllcik7Ci0gIHZvaWQgYWRkQW50ZW5uYU1ldGFsTGVuZ3RoKGRvdWJsZSB2YWx1ZSwgY29uc3QgY2hhciogbGF5ZXIpOwotICB2b2lkIGFkZEFudGVubmFQYXJ0aWFsTWV0YWxBcmVhKGRvdWJsZSB2YWx1ZSwgY29uc3QgY2hhciogbGF5ZXIpOwotICB2b2lkIGFkZEFudGVubmFQYXJ0aWFsTWV0YWxTaWRlQXJlYShkb3VibGUgdmFsdWUsIGNvbnN0IGNoYXIqIGxheWVyKTsKLSAgdm9pZCBhZGRBbnRlbm5hR2F0ZUFyZWEoZG91YmxlIHZhbHVlLCBjb25zdCBjaGFyKiBsYXllcik7Ci0gIHZvaWQgYWRkQW50ZW5uYURpZmZBcmVhKGRvdWJsZSB2YWx1ZSwgY29uc3QgY2hhciogbGF5ZXIpOwotICB2b2lkIGFkZEFudGVubmFNYXhBcmVhQ2FyKGRvdWJsZSB2YWx1ZSwgY29uc3QgY2hhciogbGF5ZXIpOwotICB2b2lkIGFkZEFudGVubmFNYXhTaWRlQXJlYUNhcihkb3VibGUgdmFsdWUsIGNvbnN0IGNoYXIqIGxheWVyKTsKLSAgdm9pZCBhZGRBbnRlbm5hUGFydGlhbEN1dEFyZWEoZG91YmxlIHZhbHVlLCBjb25zdCBjaGFyKiBsYXllcik7Ci0gIHZvaWQgYWRkQW50ZW5uYU1heEN1dENhcihkb3VibGUgdmFsdWUsIGNvbnN0IGNoYXIqIGxheWVyKTsKLSAgdm9pZCBzZXRSaXNlU2xld0xpbWl0KGRvdWJsZSB2YWx1ZSk7Ci0gIHZvaWQgc2V0RmFsbFNsZXdMaW1pdChkb3VibGUgdmFsdWUpOwotICB2b2lkIHNldFRhcGVyUnVsZShjb25zdCBjaGFyKiBuYW1lKTsKLSAgdm9pZCBzZXROZXRFeHByKGNvbnN0IGNoYXIqIG5hbWUpOyAgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIHZvaWQgc2V0U3VwcGx5U2Vuc2l0aXZpdHkoY29uc3QgY2hhciogcGluTmFtZSk7ICAgICAgIC8vIDUuNgotICB2b2lkIHNldEdyb3VuZFNlbnNpdGl2aXR5KGNvbnN0IGNoYXIqIHBpbk5hbWUpOyAgICAgICAvLyA1LjYKLSAgdm9pZCBidW1wUHJvcHMoKTsKLQotICBpbnQgaGFzRm9yZWlnbigpIGNvbnN0OwotICBpbnQgaGFzRm9yZWlnbk9yaWVudChpbnQgaW5kZXggPSAwKSBjb25zdDsKLSAgaW50IGhhc0ZvcmVpZ25Qb2ludChpbnQgaW5kZXggPSAwKSBjb25zdDsKLSAgaW50IGhhc0xFUSgpIGNvbnN0OwotICBpbnQgaGFzRGlyZWN0aW9uKCkgY29uc3Q7Ci0gIGludCBoYXNVc2UoKSBjb25zdDsKLSAgaW50IGhhc1NoYXBlKCkgY29uc3Q7Ci0gIGludCBoYXNNdXN0am9pbigpIGNvbnN0OwotICBpbnQgaGFzT3V0TWFyZ2luKCkgY29uc3Q7IAotICBpbnQgaGFzT3V0UmVzaXN0YW5jZSgpIGNvbnN0OwotICBpbnQgaGFzSW5NYXJnaW4oKSBjb25zdDsKLSAgaW50IGhhc1Bvd2VyKCkgY29uc3Q7Ci0gIGludCBoYXNMZWFrYWdlKCkgY29uc3Q7Ci0gIGludCBoYXNNYXhsb2FkKCkgY29uc3Q7Ci0gIGludCBoYXNNYXhkZWxheSgpIGNvbnN0OwotICBpbnQgaGFzQ2FwYWNpdGFuY2UoKSBjb25zdDsKLSAgaW50IGhhc1Jlc2lzdGFuY2UoKSBjb25zdDsKLSAgaW50IGhhc1B1bGxkb3ducmVzKCkgY29uc3Q7Ci0gIGludCBoYXNUaWVvZmZyKCkgY29uc3Q7Ci0gIGludCBoYXNWSEkoKSBjb25zdDsKLSAgaW50IGhhc1ZMTygpIGNvbnN0OwotICBpbnQgaGFzUmlzZVZvbHRhZ2UoKSBjb25zdDsKLSAgaW50IGhhc0ZhbGxWb2x0YWdlKCkgY29uc3Q7Ci0gIGludCBoYXNSaXNlVGhyZXNoKCkgY29uc3Q7Ci0gIGludCBoYXNGYWxsVGhyZXNoKCkgY29uc3Q7Ci0gIGludCBoYXNSaXNlU2F0Y3VyKCkgY29uc3Q7Ci0gIGludCBoYXNGYWxsU2F0Y3VyKCkgY29uc3Q7Ci0gIGludCBoYXNDdXJyZW50U291cmNlKCkgY29uc3Q7Ci0gIGludCBoYXNUYWJsZXMoKSBjb25zdDsKLSAgaW50IGhhc0FudGVubmFTaXplKCkgY29uc3Q7Ci0gIGludCBoYXNBbnRlbm5hTWV0YWxBcmVhKCkgY29uc3Q7Ci0gIGludCBoYXNBbnRlbm5hTWV0YWxMZW5ndGgoKSBjb25zdDsKLSAgaW50IGhhc0FudGVubmFQYXJ0aWFsTWV0YWxBcmVhKCkgY29uc3Q7Ci0gIGludCBoYXNBbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWEoKSBjb25zdDsKLSAgaW50IGhhc0FudGVubmFQYXJ0aWFsQ3V0QXJlYSgpIGNvbnN0OwotICBpbnQgaGFzQW50ZW5uYURpZmZBcmVhKCkgY29uc3Q7Ci0gIGludCBoYXNBbnRlbm5hTW9kZWwoKSBjb25zdDsgICAgICAgICAvLyA1LjUKLSAgaW50IGhhc1RhcGVyUnVsZSgpIGNvbnN0OwotICBpbnQgaGFzUmlzZVNsZXdMaW1pdCgpIGNvbnN0OwotICBpbnQgaGFzRmFsbFNsZXdMaW1pdCgpIGNvbnN0OwotICBpbnQgaGFzTmV0RXhwcigpIGNvbnN0OyAgICAgICAgICAgICAgLy8gNS42Ci0gIGludCBoYXNTdXBwbHlTZW5zaXRpdml0eSgpIGNvbnN0OyAgICAvLyA1LjYKLSAgaW50IGhhc0dyb3VuZFNlbnNpdGl2aXR5KCkgY29uc3Q7ICAgIC8vIDUuNgotCi0gIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdDsKLQotICBpbnQgbnVtUG9ydHMoKSBjb25zdDsKLSAgbGVmaUdlb21ldHJpZXMqIHBvcnQoaW50IGluZGV4KSBjb25zdDsKLQotICBpbnQgbnVtRm9yZWlnbnMoKSBjb25zdDsKLSAgY29uc3QgY2hhciogZm9yZWlnbk5hbWUoaW50IGluZGV4ID0gMCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIHRhcGVyUnVsZSgpIGNvbnN0OwotICBpbnQgZm9yZWlnbk9yaWVudChpbnQgaW5kZXggPSAwKSBjb25zdDsKLSAgY29uc3QgY2hhciogZm9yZWlnbk9yaWVudFN0cihpbnQgaW5kZXggPSAwKSBjb25zdDsKLSAgZG91YmxlIGZvcmVpZ25YKGludCBpbmRleCA9IDApIGNvbnN0OwotICBkb3VibGUgZm9yZWlnblkoaW50IGluZGV4ID0gMCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIExFUSgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBkaXJlY3Rpb24oKSBjb25zdDsKLSAgY29uc3QgY2hhciogdXNlKCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIHNoYXBlKCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIG11c3Rqb2luKCkgY29uc3Q7Ci0gIGRvdWJsZSBvdXRNYXJnaW5IaWdoKCkgY29uc3Q7Ci0gIGRvdWJsZSBvdXRNYXJnaW5Mb3coKSBjb25zdDsKLSAgZG91YmxlIG91dFJlc2lzdGFuY2VIaWdoKCkgY29uc3Q7Ci0gIGRvdWJsZSBvdXRSZXNpc3RhbmNlTG93KCkgY29uc3Q7Ci0gIGRvdWJsZSBpbk1hcmdpbkhpZ2goKSBjb25zdDsKLSAgZG91YmxlIGluTWFyZ2luTG93KCkgY29uc3Q7Ci0gIGRvdWJsZSBwb3dlcigpIGNvbnN0OwotICBkb3VibGUgbGVha2FnZSgpIGNvbnN0OwotICBkb3VibGUgbWF4bG9hZCgpIGNvbnN0OwotICBkb3VibGUgbWF4ZGVsYXkoKSBjb25zdDsKLSAgZG91YmxlIGNhcGFjaXRhbmNlKCkgY29uc3Q7Ci0gIGRvdWJsZSByZXNpc3RhbmNlKCkgY29uc3Q7Ci0gIGRvdWJsZSBwdWxsZG93bnJlcygpIGNvbnN0OwotICBkb3VibGUgdGllb2ZmcigpIGNvbnN0OwotICBkb3VibGUgVkhJKCkgY29uc3Q7Ci0gIGRvdWJsZSBWTE8oKSBjb25zdDsKLSAgZG91YmxlIHJpc2VWb2x0YWdlKCkgY29uc3Q7Ci0gIGRvdWJsZSBmYWxsVm9sdGFnZSgpIGNvbnN0OwotICBkb3VibGUgcmlzZVRocmVzaCgpIGNvbnN0OwotICBkb3VibGUgZmFsbFRocmVzaCgpIGNvbnN0OwotICBkb3VibGUgcmlzZVNhdGN1cigpIGNvbnN0OwotICBkb3VibGUgZmFsbFNhdGN1cigpIGNvbnN0OwotICBkb3VibGUgcmlzZVNsZXdMaW1pdCgpIGNvbnN0OwotICBkb3VibGUgZmFsbFNsZXdMaW1pdCgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBjdXJyZW50U291cmNlKCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIHRhYmxlSGlnaE5hbWUoKSBjb25zdDsKLSAgY29uc3QgY2hhciogdGFibGVMb3dOYW1lKCkgY29uc3Q7Ci0KLSAgaW50IG51bUFudGVubmFTaXplKCkgY29uc3Q7Ci0gIGRvdWJsZSBhbnRlbm5hU2l6ZShpbnQgaW5kZXgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBhbnRlbm5hU2l6ZUxheWVyKGludCBpbmRleCkgY29uc3Q7Ci0KLSAgaW50IG51bUFudGVubmFNZXRhbEFyZWEoKSBjb25zdDsKLSAgZG91YmxlIGFudGVubmFNZXRhbEFyZWEoaW50IGluZGV4KSBjb25zdDsKLSAgY29uc3QgY2hhciogYW50ZW5uYU1ldGFsQXJlYUxheWVyKGludCBpbmRleCkgY29uc3Q7Ci0KLSAgaW50IG51bUFudGVubmFNZXRhbExlbmd0aCgpIGNvbnN0OwotICBkb3VibGUgYW50ZW5uYU1ldGFsTGVuZ3RoKGludCBpbmRleCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIGFudGVubmFNZXRhbExlbmd0aExheWVyKGludCBpbmRleCkgY29uc3Q7Ci0KLSAgaW50IG51bUFudGVubmFQYXJ0aWFsTWV0YWxBcmVhKCkgY29uc3Q7Ci0gIGRvdWJsZSBhbnRlbm5hUGFydGlhbE1ldGFsQXJlYShpbnQgaW5kZXgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBhbnRlbm5hUGFydGlhbE1ldGFsQXJlYUxheWVyKGludCBpbmRleCkgY29uc3Q7Ci0KLSAgaW50IG51bUFudGVubmFQYXJ0aWFsTWV0YWxTaWRlQXJlYSgpIGNvbnN0OwotICBkb3VibGUgYW50ZW5uYVBhcnRpYWxNZXRhbFNpZGVBcmVhKGludCBpbmRleCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIGFudGVubmFQYXJ0aWFsTWV0YWxTaWRlQXJlYUxheWVyKGludCBpbmRleCkgY29uc3Q7Ci0KLSAgaW50IG51bUFudGVubmFQYXJ0aWFsQ3V0QXJlYSgpIGNvbnN0OwotICBkb3VibGUgYW50ZW5uYVBhcnRpYWxDdXRBcmVhKGludCBpbmRleCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIGFudGVubmFQYXJ0aWFsQ3V0QXJlYUxheWVyKGludCBpbmRleCkgY29uc3Q7Ci0KLSAgaW50IG51bUFudGVubmFEaWZmQXJlYSgpIGNvbnN0OwotICBkb3VibGUgYW50ZW5uYURpZmZBcmVhKGludCBpbmRleCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIGFudGVubmFEaWZmQXJlYUxheWVyKGludCBpbmRleCkgY29uc3Q7Ci0KLSAgLy8gNS42Ci0gIGNvbnN0IGNoYXIqIG5ldEV4cHIoKSBjb25zdDsKLSAgY29uc3QgY2hhciogc3VwcGx5U2Vuc2l0aXZpdHkoKSBjb25zdDsKLSAgY29uc3QgY2hhciogZ3JvdW5kU2Vuc2l0aXZpdHkoKSBjb25zdDsKLQotICAvLyA1LjUKLSAgaW50IG51bUFudGVubmFNb2RlbCgpIGNvbnN0OwotICBsZWZpUGluQW50ZW5uYU1vZGVsKiBhbnRlbm5hTW9kZWwoaW50IGluZGV4KSBjb25zdDsKLQotICBpbnQgICAgbnVtUHJvcGVydGllcygpIGNvbnN0OwotICBjb25zdCAgY2hhciogcHJvcE5hbWUoaW50IGluZGV4KSBjb25zdDsKLSAgY29uc3QgIGNoYXIqIHByb3BWYWx1ZShpbnQgaW5kZXgpIGNvbnN0OwotICBkb3VibGUgcHJvcE51bShpbnQgaW5kZXgpIGNvbnN0OwotICBjb25zdCAgY2hhciAgcHJvcFR5cGUoaW50IGluZGV4KSBjb25zdDsKLSAgaW50ICAgIHByb3BJc051bWJlcihpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgICAgcHJvcElzU3RyaW5nKGludCBpbmRleCkgY29uc3Q7Ci0KLSAgdm9pZCBwcmludChGSUxFKiBmKSBjb25zdCA7Ci0KLXByb3RlY3RlZDoKLSAgaW50ICAgbmFtZVNpemVfOwotICBjaGFyKiBuYW1lXzsKLQotICBjaGFyIGhhc0xFUV87Ci0gIGNoYXIgaGFzRGlyZWN0aW9uXzsKLSAgY2hhciBoYXNVc2VfOwotICBjaGFyIGhhc1NoYXBlXzsKLSAgY2hhciBoYXNNdXN0am9pbl87Ci0gIGNoYXIgaGFzT3V0TWFyZ2luXzsKLSAgY2hhciBoYXNPdXRSZXNpc3RhbmNlXzsKLSAgY2hhciBoYXNJbk1hcmdpbl87Ci0gIGNoYXIgaGFzUG93ZXJfOwotICBjaGFyIGhhc0xlYWthZ2VfOwotICBjaGFyIGhhc01heGxvYWRfOwotICBjaGFyIGhhc01heGRlbGF5XzsKLSAgY2hhciBoYXNDYXBhY2l0YW5jZV87Ci0gIGNoYXIgaGFzUmVzaXN0YW5jZV87Ci0gIGNoYXIgaGFzUHVsbGRvd25yZXNfOwotICBjaGFyIGhhc1RpZW9mZnJfOwotICBjaGFyIGhhc1ZISV87IAotICBjaGFyIGhhc1ZMT187Ci0gIGNoYXIgaGFzUmlzZVZvbHRhZ2VfOwotICBjaGFyIGhhc0ZhbGxWb2x0YWdlXzsKLSAgY2hhciBoYXNSaXNlVGhyZXNoXzsKLSAgY2hhciBoYXNGYWxsVGhyZXNoXzsKLSAgY2hhciBoYXNSaXNlU2F0Y3VyXzsKLSAgY2hhciBoYXNGYWxsU2F0Y3VyXzsKLSAgY2hhciBoYXNDdXJyZW50U291cmNlXzsKLSAgY2hhciBoYXNUYWJsZXNfOwotICBjaGFyIGhhc0FudGVubmFzaXplXzsKLSAgY2hhciBoYXNSaXNlU2xld0xpbWl0XzsKLSAgY2hhciBoYXNGYWxsU2xld0xpbWl0XzsKLQotICBpbnQgICAgIG51bUZvcmVpZ25zXzsKLSAgaW50ICAgICBmb3JlaWduQWxsb2NhdGVkXzsKLSAgaW50KiAgICBoYXNGb3JlaWduT3JpZW50XzsKLSAgaW50KiAgICBoYXNGb3JlaWduUG9pbnRfOwotICBpbnQqICAgIGZvcmVpZ25PcmllbnRfOwotICBkb3VibGUqIGZvcmVpZ25YXzsKLSAgZG91YmxlKiBmb3JlaWduWV87Ci0gIGNoYXIqKiAgZm9yZWlnbl87Ci0KLSAgaW50ICAgIExFUVNpemVfOwotICBjaGFyKiAgTEVRXzsKLSAgaW50ICAgIG11c3Rqb2luU2l6ZV87Ci0gIGNoYXIqICBtdXN0am9pbl87Ci0gIGRvdWJsZSBvdXRNYXJnaW5IXzsKLSAgZG91YmxlIG91dE1hcmdpbkxfOwotICBkb3VibGUgb3V0UmVzaXN0YW5jZUhfOwotICBkb3VibGUgb3V0UmVzaXN0YW5jZUxfOwotICBkb3VibGUgaW5NYXJnaW5IXzsKLSAgZG91YmxlIGluTWFyZ2luTF87Ci0gIGRvdWJsZSBwb3dlcl87Ci0gIGRvdWJsZSBsZWFrYWdlXzsKLSAgZG91YmxlIG1heGxvYWRfOwotICBkb3VibGUgbWF4ZGVsYXlfOwotICBkb3VibGUgY2FwYWNpdGFuY2VfOwotICBkb3VibGUgcmVzaXN0YW5jZV87Ci0gIGRvdWJsZSBwdWxsZG93bnJlc187Ci0gIGRvdWJsZSB0aWVvZmZyXzsKLSAgZG91YmxlIFZISV87Ci0gIGRvdWJsZSBWTE9fOwotICBkb3VibGUgcmlzZVZvbHRhZ2VfOwotICBkb3VibGUgZmFsbFZvbHRhZ2VfOwotICBkb3VibGUgcmlzZVRocmVzaF87Ci0gIGRvdWJsZSBmYWxsVGhyZXNoXzsKLSAgZG91YmxlIHJpc2VTYXRjdXJfOwotICBkb3VibGUgZmFsbFNhdGN1cl87Ci0gIGludCBsb3dUYWJsZVNpemVfOwotICBjaGFyKiBsb3dUYWJsZV87Ci0gIGludCBoaWdoVGFibGVTaXplXzsKLSAgY2hhciogaGlnaFRhYmxlXzsKLSAgZG91YmxlIHJpc2VTbGV3TGltaXRfOwotICBkb3VibGUgZmFsbFNsZXdMaW1pdF87Ci0KLSAgLy8gNS41IEFudGVubmFNb2RlbAotICBpbnQgbnVtQW50ZW5uYU1vZGVsXzsKLSAgaW50IGFudGVubmFNb2RlbEFsbG9jYXRlZF87Ci0gIGludCBjdXJBbnRlbm5hTW9kZWxJbmRleF87ICAgICAvLyBzYXZlIHRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBhbnRlbm5hCi0gIGxlZmlQaW5BbnRlbm5hTW9kZWwqKiBhbnRlbm5hTW9kZWxfOwotCi0gIGludCBudW1BbnRlbm5hU2l6ZV87Ci0gIGludCBhbnRlbm5hU2l6ZUFsbG9jYXRlZF87Ci0gIGRvdWJsZSogYW50ZW5uYVNpemVfOwotICBjaGFyKiogYW50ZW5uYVNpemVMYXllcl87Ci0KLSAgaW50IG51bUFudGVubmFNZXRhbEFyZWFfOwotICBpbnQgYW50ZW5uYU1ldGFsQXJlYUFsbG9jYXRlZF87Ci0gIGRvdWJsZSogYW50ZW5uYU1ldGFsQXJlYV87Ci0gIGNoYXIqKiBhbnRlbm5hTWV0YWxBcmVhTGF5ZXJfOwotCi0gIGludCBudW1BbnRlbm5hTWV0YWxMZW5ndGhfOwotICBpbnQgYW50ZW5uYU1ldGFsTGVuZ3RoQWxsb2NhdGVkXzsKLSAgZG91YmxlKiBhbnRlbm5hTWV0YWxMZW5ndGhfOwotICBjaGFyKiogYW50ZW5uYU1ldGFsTGVuZ3RoTGF5ZXJfOwotCi0gIGludCBudW1BbnRlbm5hUGFydGlhbE1ldGFsQXJlYV87Ci0gIGludCBhbnRlbm5hUGFydGlhbE1ldGFsQXJlYUFsbG9jYXRlZF87Ci0gIGRvdWJsZSogYW50ZW5uYVBhcnRpYWxNZXRhbEFyZWFfOwotICBjaGFyKiogYW50ZW5uYVBhcnRpYWxNZXRhbEFyZWFMYXllcl87Ci0KLSAgaW50IG51bUFudGVubmFQYXJ0aWFsTWV0YWxTaWRlQXJlYV87Ci0gIGludCBhbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWFBbGxvY2F0ZWRfOwotICBkb3VibGUqIGFudGVubmFQYXJ0aWFsTWV0YWxTaWRlQXJlYV87Ci0gIGNoYXIqKiBhbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWFMYXllcl87Ci0KLSAgaW50IG51bUFudGVubmFQYXJ0aWFsQ3V0QXJlYV87Ci0gIGludCBhbnRlbm5hUGFydGlhbEN1dEFyZWFBbGxvY2F0ZWRfOwotICBkb3VibGUqIGFudGVubmFQYXJ0aWFsQ3V0QXJlYV87Ci0gIGNoYXIqKiBhbnRlbm5hUGFydGlhbEN1dEFyZWFMYXllcl87Ci0KLSAgaW50IG51bUFudGVubmFEaWZmQXJlYV87Ci0gIGludCBhbnRlbm5hRGlmZkFyZWFBbGxvY2F0ZWRfOwotICBkb3VibGUqIGFudGVubmFEaWZmQXJlYV87Ci0gIGNoYXIqKiBhbnRlbm5hRGlmZkFyZWFMYXllcl87Ci0KLSAgY2hhciogdGFwZXJSdWxlXzsKLQotICBjaGFyKiBuZXRFcHhyXzsKLSAgY2hhciogc3NQaW5OYW1lXzsKLSAgY2hhciogZ3NQaW5OYW1lXzsKLQotICBjaGFyIGRpcmVjdGlvbl9bMzJdOwotICBjaGFyIHVzZV9bMTJdOwotICBjaGFyIHNoYXBlX1sxMl07Ci0gIGNoYXIgY3VycmVudFNvdXJjZV9bMTJdOwotCi0gIGludCBudW1Qcm9wZXJ0aWVzXzsKLSAgaW50IHByb3BlcnRpZXNBbGxvY2F0ZWRfOwotICBjaGFyKiogcHJvcE5hbWVzXzsKLSAgY2hhcioqIHByb3BWYWx1ZXNfOwotICBkb3VibGUqIHByb3BOdW1zXzsKLSAgY2hhciogIHByb3BUeXBlc187Ci0KLSAgaW50IG51bVBvcnRzXzsKLSAgaW50IHBvcnRzQWxsb2NhdGVkXzsKLSAgbGVmaUdlb21ldHJpZXMqKiBwb3J0c187Ci19OwotCi0vLyA1LjYKLWNsYXNzIGxlZmlEZW5zaXR5IHsKLXB1YmxpYzoKLSAgbGVmaURlbnNpdHkoKTsKLSAgdm9pZCBJbml0KCk7Ci0KLSAgdm9pZCBEZXN0cm95KCk7Ci0gIH5sZWZpRGVuc2l0eSgpOwotCi0gIHZvaWQgY2xlYXIoKTsKLSAgdm9pZCBhZGRMYXllcihjb25zdCBjaGFyKiBuYW1lKTsKLSAgdm9pZCBhZGRSZWN0KGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgeDIsIGRvdWJsZSB5MiwgZG91YmxlIHZhbHVlKTsKLQotICBpbnQgbnVtTGF5ZXIoKSBjb25zdDsKLSAgY2hhciogbGF5ZXJOYW1lKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCBudW1SZWN0cyhpbnQgaW5kZXgpIGNvbnN0OwotICBsZWZpR2VvbVJlY3QgZ2V0UmVjdChpbnQgaW5kZXgsIGludCByZWN0SW5kZXgpIGNvbnN0OwotICBkb3VibGUgZGVuc2l0eVZhbHVlKGludCBpbmRleCwgaW50IHJlY3RJbmRleCkgY29uc3Q7Ci0KLSAgdm9pZCBwcmludChGSUxFKiBmKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICBpbnQgICAgbnVtTGF5ZXJzXzsKLSAgaW50ICAgIGxheWVyc0FsbG9jYXRlZF87Ci0gIGNoYXIqKiBsYXllck5hbWVfOwotICBpbnQqICAgbnVtUmVjdHNfOwotICBpbnQqICAgcmVjdHNBbGxvY2F0ZWRfOwotICBzdHJ1Y3QgbGVmaUdlb21SZWN0KiogcmVjdHNfOwotICBkb3VibGUqKiAgICAgICBkZW5zaXR5VmFsdWVfOwotfTsKLQotY2xhc3MgbGVmaU1hY3JvIHsKLXB1YmxpYzoKLSAgbGVmaU1hY3JvKCk7Ci0gIHZvaWQgSW5pdCgpOwotCi0gIHZvaWQgRGVzdHJveSgpOwotICB+bGVmaU1hY3JvKCk7Ci0KLSAgdm9pZCBjbGVhcigpOwotICB2b2lkIGJ1bXAoY2hhcioqIGFycmF5LCBpbnQgbGVuLCBpbnQqIHNpemUpOwotICB2b2lkIHNldE5hbWUoY29uc3QgY2hhciogbmFtZSk7Ci0gIHZvaWQgc2V0R2VuZXJhdG9yKGNvbnN0IGNoYXIqIG5hbWUpOwotICB2b2lkIHNldEdlbmVyYXRlKGNvbnN0IGNoYXIqIG5hbWUxLCBjb25zdCBjaGFyKiBuYW1lMik7Ci0gIHZvaWQgc2V0UG93ZXIoZG91YmxlIGQpOwotICB2b2lkIHNldE9yaWdpbihkb3VibGUgeCwgZG91YmxlIHkpOwotICB2b2lkIHNldENsYXNzKGNvbnN0IGNoYXIqIG5hbWUpOwotICB2b2lkIHNldFNvdXJjZShjb25zdCBjaGFyKiBuYW1lKTsKLSAgdm9pZCBzZXRFRVEoY29uc3QgY2hhciogbmFtZSk7Ci0gIHZvaWQgc2V0TEVRKGNvbnN0IGNoYXIqIG5hbWUpOwotICB2b2lkIHNldENsb2NrVHlwZShjb25zdCBjaGFyKiBuYW1lKTsKLSAgdm9pZCBzZXRQcm9wZXJ0eShjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSwgY29uc3QgY2hhciB0eXBlKTsKLSAgdm9pZCBzZXROdW1Qcm9wZXJ0eShjb25zdCBjaGFyKiBuYW1lLCBkb3VibGUgZCwgY29uc3QgY2hhciogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciB0eXBlKTsKLSAgdm9pZCBidW1wUHJvcHMoKTsKLQotICAvLyBvcmllbnQ9LTEgbWVhbnMgbm8gb3JpZW50IHdhcyBzcGVjaWZpZWQuCi0gIHZvaWQgYWRkRm9yZWlnbihjb25zdCBjaGFyKiBuYW1lLCBpbnQgaGFzUG50LAotICAgICAgICAgICBkb3VibGUgeCwgZG91YmxlIHksIGludCBvcmllbnQpOwotCi0gIHZvaWQgc2V0WFN5bW1ldHJ5KCk7Ci0gIHZvaWQgc2V0WVN5bW1ldHJ5KCk7Ci0gIHZvaWQgc2V0OTBTeW1tZXRyeSgpOwotICB2b2lkIHNldFNpdGVOYW1lKGNvbnN0IGNoYXIqIG5hbWUpOwotICB2b2lkIHNldFNpdGVQYXR0ZXJuKGxlZmlTaXRlUGF0dGVybiogcCk7Ci0gIHZvaWQgc2V0U2l6ZShkb3VibGUgeCwgZG91YmxlIHkpOwotICB2b2lkIHNldEJ1ZmZlcigpOwotICB2b2lkIHNldEludmVydGVyKCk7Ci0gIHZvaWQgc2V0Rml4ZWRNYXNrKGludCBpc0ZpeGVkTWFzayA9IDApOwotCi0gIGludCBoYXNDbGFzcygpIGNvbnN0OwotICBpbnQgaGFzR2VuZXJhdG9yKCkgY29uc3Q7Ci0gIGludCBoYXNHZW5lcmF0ZSgpIGNvbnN0OwotICBpbnQgaGFzUG93ZXIoKSBjb25zdDsKLSAgaW50IGhhc09yaWdpbigpIGNvbnN0OwotICBpbnQgaGFzRUVRKCkgY29uc3Q7Ci0gIGludCBoYXNMRVEoKSBjb25zdDsKLSAgaW50IGhhc1NvdXJjZSgpIGNvbnN0OwotICBpbnQgaGFzWFN5bW1ldHJ5KCkgY29uc3Q7Ci0gIGludCBoYXNZU3ltbWV0cnkoKSBjb25zdDsKLSAgaW50IGhhczkwU3ltbWV0cnkoKSBjb25zdDsKLSAgaW50IGhhc1NpdGVOYW1lKCkgY29uc3Q7Ci0gIGludCBoYXNTaXRlUGF0dGVybigpIGNvbnN0OwotICBpbnQgaGFzU2l6ZSgpIGNvbnN0OwotICBpbnQgaGFzRm9yZWlnbigpIGNvbnN0OwotICBpbnQgaGFzRm9yZWlnbk9yaWdpbihpbnQgaW5kZXggPSAwKSBjb25zdDsKLSAgaW50IGhhc0ZvcmVpZ25PcmllbnQoaW50IGluZGV4ID0gMCkgY29uc3Q7Ci0gIGludCBoYXNGb3JlaWduUG9pbnQoaW50IGluZGV4ID0gMCkgY29uc3Q7Ci0gIGludCBoYXNDbG9ja1R5cGUoKSBjb25zdDsKLSAgaW50IGlzQnVmZmVyKCkgY29uc3Q7Ci0gIGludCBpc0ludmVydGVyKCkgY29uc3Q7Ci0gIGludCBpc0ZpeGVkTWFzaygpIGNvbnN0OwotCi0gIGludCBudW1TaXRlUGF0dGVybigpIGNvbnN0OwotICBpbnQgbnVtUHJvcGVydGllcygpIGNvbnN0OwotICBjb25zdCBjaGFyKiBwcm9wTmFtZShpbnQgaW5kZXgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBwcm9wVmFsdWUoaW50IGluZGV4KSBjb25zdDsKLSAgZG91YmxlIHByb3BOdW0oaW50IGluZGV4KSBjb25zdDsKLSAgY29uc3QgY2hhciBwcm9wVHlwZShpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgIHByb3BJc051bWJlcihpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgIHByb3BJc1N0cmluZyhpbnQgaW5kZXgpIGNvbnN0OwotCi0gIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdDsKLSAgY29uc3QgY2hhciogbWFjcm9DbGFzcygpIGNvbnN0OwotICBjb25zdCBjaGFyKiBnZW5lcmF0b3IoKSBjb25zdDsKLSAgY29uc3QgY2hhciogRUVRKCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIExFUSgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBzb3VyY2UoKSBjb25zdDsKLSAgY29uc3QgY2hhciogY2xvY2tUeXBlKCkgY29uc3Q7Ci0gIGRvdWJsZSBvcmlnaW5YKCkgY29uc3Q7Ci0gIGRvdWJsZSBvcmlnaW5ZKCkgY29uc3Q7Ci0gIGRvdWJsZSBwb3dlcigpIGNvbnN0OwotICB2b2lkIGdlbmVyYXRlKGNoYXIqKiBuYW1lMSwgY2hhcioqIG5hbWUyKSBjb25zdDsKLSAgbGVmaVNpdGVQYXR0ZXJuKiBzaXRlUGF0dGVybihpbnQgaW5kZXgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBzaXRlTmFtZSgpIGNvbnN0OwotICBkb3VibGUgc2l6ZVgoKSBjb25zdDsKLSAgZG91YmxlIHNpemVZKCkgY29uc3Q7Ci0gIGludCBudW1Gb3JlaWducygpIGNvbnN0OwotICBpbnQgZm9yZWlnbk9yaWVudChpbnQgaW5kZXggPSAwKSBjb25zdDsKLSAgY29uc3QgY2hhciogIGZvcmVpZ25PcmllbnRTdHIoaW50IGluZGV4ID0gMCkgY29uc3Q7Ci0gIGRvdWJsZSBmb3JlaWduWChpbnQgaW5kZXggPSAwKSBjb25zdDsKLSAgZG91YmxlIGZvcmVpZ25ZKGludCBpbmRleCA9IDApIGNvbnN0OwotICBjb25zdCBjaGFyKiBmb3JlaWduTmFtZShpbnQgaW5kZXggPSAwKSBjb25zdDsKLQotICAvLyBEZWJ1ZyBwcmludAotICB2b2lkIHByaW50KEZJTEUqIGYpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gIGludCBuYW1lU2l6ZV87Ci0gIGNoYXIqIG5hbWVfOwotICBjaGFyIG1hY3JvQ2xhc3NfWzMyXTsKLSAgY2hhciBzb3VyY2VfWzEyXTsKLQotICBpbnQgZ2VuZXJhdG9yU2l6ZV87Ci0gIGNoYXIqIGdlbmVyYXRvcl87Ci0KLSAgY2hhciBoYXNDbGFzc187Ci0gIGNoYXIgaGFzR2VuZXJhdG9yXzsKLSAgY2hhciBoYXNHZW5lcmF0ZV87Ci0gIGNoYXIgaGFzUG93ZXJfOwotICBjaGFyIGhhc09yaWdpbl87Ci0gIGNoYXIgaGFzU291cmNlXzsKLSAgY2hhciBoYXNFRVFfOwotICBjaGFyIGhhc0xFUV87Ci0gIGNoYXIgaGFzU3ltbWV0cnlfOyAgLy8gWD0xICBZPTIgIFI5MD00ICAoY2FuIGJlIGNvbWJpbmVkKQotICBjaGFyIGhhc1NpdGVOYW1lXzsKLSAgY2hhciBoYXNTaXplXzsKLSAgY2hhciBoYXNDbG9ja1R5cGVfOwotICBjaGFyIGlzQnVmZmVyXzsKLSAgY2hhciBpc0ludmVydGVyXzsKLQotICBjaGFyKiBFRVFfOwotICBpbnQgRUVRU2l6ZV87Ci0gIGNoYXIqIExFUV87Ci0gIGludCBMRVFTaXplXzsKLSAgY2hhciogZ2VuMV87Ci0gIGludCBnZW4xU2l6ZV87Ci0gIGNoYXIqIGdlbjJfOwotICBpbnQgZ2VuMlNpemVfOwotICBkb3VibGUgcG93ZXJfOwotICBkb3VibGUgb3JpZ2luWF87Ci0gIGRvdWJsZSBvcmlnaW5ZXzsKLSAgZG91YmxlIHNpemVYXzsKLSAgZG91YmxlIHNpemVZXzsKLQotICBpbnQgbnVtU2l0ZXNfOwotICBpbnQgc2l0ZXNBbGxvY2F0ZWRfOwotICBsZWZpU2l0ZVBhdHRlcm4qKiBwYXR0ZXJuXzsKLQotICBpbnQgbnVtRm9yZWlnbnNfOwotICBpbnQgZm9yZWlnbkFsbG9jYXRlZF87Ci0gIGludCogIGhhc0ZvcmVpZ25PcmlnaW5fOwotICBpbnQqICBoYXNGb3JlaWduUG9pbnRfOwotICBpbnQqICBmb3JlaWduT3JpZW50XzsKLSAgZG91YmxlKiBmb3JlaWduWF87Ci0gIGRvdWJsZSogZm9yZWlnbllfOwotICBjaGFyKiogZm9yZWlnbl87Ci0KLSAgaW50IHNpdGVOYW1lU2l6ZV87Ci0gIGNoYXIqIHNpdGVOYW1lXzsKLQotICBjaGFyKiBjbG9ja1R5cGVfOwotICBpbnQgY2xvY2tUeXBlU2l6ZV87Ci0KLSAgaW50IG51bVByb3BlcnRpZXNfOwotICBpbnQgcHJvcGVydGllc0FsbG9jYXRlZF87Ci0gIGNoYXIqKiBwcm9wTmFtZXNfOwotICBjaGFyKiogcHJvcFZhbHVlc187Ci0gIGRvdWJsZSogcHJvcE51bXNfOwotICBjaGFyKiAgcHJvcFR5cGVzXzsKLQotICBpbnQgaXNGaXhlZE1hc2tfOwotfTsKLQotY2xhc3MgbGVmaVRpbWluZyB7Ci1wdWJsaWM6Ci0gIGxlZmlUaW1pbmcoKTsKLSAgdm9pZCBJbml0KCk7Ci0KLSAgdm9pZCBEZXN0cm95KCk7Ci0gIH5sZWZpVGltaW5nKCk7Ci0KLSAgdm9pZCBhZGRSaXNlRmFsbChjb25zdCBjaGFyKiByaXNlZmFsbCwgZG91YmxlIG9uZSwgZG91YmxlIHR3byk7Ci0gIHZvaWQgYWRkUmlzZUZhbGxWYXJpYWJsZShkb3VibGUgb25lLCBkb3VibGUgdHdvKTsKLSAgdm9pZCBhZGRSaXNlRmFsbFNsZXcoZG91YmxlIG9uZSwgZG91YmxlIHR3bywgZG91YmxlIHRocmVlLCBkb3VibGUgZm91cik7Ci0gIHZvaWQgYWRkUmlzZUZhbGxTbGV3Mihkb3VibGUgb25lLCBkb3VibGUgdHdvLCBkb3VibGUgdGhyZWUpOwotICB2b2lkIHNldFJpc2VSUyhkb3VibGUgb25lLCBkb3VibGUgdHdvKTsKLSAgdm9pZCBzZXRGYWxsUlMoZG91YmxlIG9uZSwgZG91YmxlIHR3byk7Ci0gIHZvaWQgc2V0UmlzZUNTKGRvdWJsZSBvbmUsIGRvdWJsZSB0d28pOwotICB2b2lkIHNldEZhbGxDUyhkb3VibGUgb25lLCBkb3VibGUgdHdvKTsKLSAgdm9pZCBzZXRSaXNlQXR0MShkb3VibGUgb25lLCBkb3VibGUgdHdvKTsKLSAgdm9pZCBzZXRGYWxsQXR0MShkb3VibGUgb25lLCBkb3VibGUgdHdvKTsKLSAgdm9pZCBzZXRSaXNlVG8oZG91YmxlIG9uZSwgZG91YmxlIHR3byk7Ci0gIHZvaWQgc2V0RmFsbFRvKGRvdWJsZSBvbmUsIGRvdWJsZSB0d28pOwotICB2b2lkIGFkZFVuYXRlbmVzcyhjb25zdCBjaGFyKiB0eXApOwotICB2b2lkIHNldFN0YWJsZShkb3VibGUgb25lLCBkb3VibGUgdHdvLCBjb25zdCBjaGFyKiB0eXApOwotICB2b2lkIGFkZFRhYmxlRW50cnkoZG91YmxlIG9uZSwgZG91YmxlIHR3bywgZG91YmxlIHRocmVlKTsKLSAgdm9pZCBhZGRUYWJsZUF4aXNOdW1iZXIoZG91YmxlIG9uZSk7Ci0gIHZvaWQgYWRkRnJvbVBpbihjb25zdCBjaGFyKiBuYW1lKTsKLSAgdm9pZCBhZGRUb1Bpbihjb25zdCBjaGFyKiBuYW1lKTsKLSAgdm9pZCBhZGREZWxheShjb25zdCBjaGFyKiByaXNlZmFsbCwgY29uc3QgY2hhciogdW5hdGVuZXNzLCBkb3VibGUgb25lLAotICAgICAgICAgZG91YmxlIHR3bywgZG91YmxlIHRocmVlKTsKLSAgdm9pZCBhZGRUcmFuc2l0aW9uKGNvbnN0IGNoYXIqIHJpc2VmYWxsLCBjb25zdCBjaGFyKiB1bmF0ZW5lc3MsIGRvdWJsZSBvbmUsCi0gICAgICAgICBkb3VibGUgdHdvLCBkb3VibGUgdGhyZWUpOwotICAvLyBhZGRTREYyUGlucyAmIGFkZFNERjFQaW4gYXJlIGZvciA1LjEKLSAgdm9pZCBhZGRTREYyUGlucyhjb25zdCBjaGFyKiB0cmlnVHlwZSwgY29uc3QgY2hhciogZnJvbVRyaWcsCi0gICAgICAgICBjb25zdCBjaGFyKiB0b1RyaWcsIGRvdWJsZSBvbmUsIGRvdWJsZSB0d28sIGRvdWJsZSB0aHJlZSk7Ci0gIHZvaWQgYWRkU0RGMVBpbihjb25zdCBjaGFyKiB0cmlnVHlwZSwgZG91YmxlIG9uZSwgZG91YmxlIHR3bywgZG91YmxlIHRocmVlKTsKLSAgdm9pZCBzZXRTREZjb25kU3RhcnQoY29uc3QgY2hhciogY29uZFN0YXJ0KTsKLSAgdm9pZCBzZXRTREZjb25kRW5kKGNvbnN0IGNoYXIqIGNvbmRFbmQpOwotICB2b2lkIHNldFNERmNvbmQoY29uc3QgY2hhciogY29uZCk7Ci0gIGludCBoYXNEYXRhKCk7Ci0gIHZvaWQgY2xlYXIoKTsKLQotICBpbnQgbnVtRnJvbVBpbnMoKTsKLSAgY29uc3QgY2hhciogZnJvbVBpbihpbnQgaW5kZXgpOwotICBpbnQgbnVtVG9QaW5zKCk7Ci0gIGNvbnN0IGNoYXIqIHRvUGluKGludCBpbmRleCk7Ci0gIGludCBoYXNUcmFuc2l0aW9uKCk7Ci0gIGludCBoYXNEZWxheSgpOwotICBpbnQgaGFzUmlzZVNsZXcoKTsKLSAgaW50IGhhc1Jpc2VTbGV3MigpOwotICBpbnQgaGFzRmFsbFNsZXcoKTsKLSAgaW50IGhhc0ZhbGxTbGV3MigpOwotICBpbnQgaGFzUmlzZUludHJpbnNpYygpOwotICBpbnQgaGFzRmFsbEludHJpbnNpYygpOwotICBpbnQgbnVtT2ZBeGlzTnVtYmVycygpOwotICBkb3VibGUqIGF4aXNOdW1iZXJzKCk7Ci0gIGludCBudW1PZlRhYmxlRW50cmllcygpOwotICB2b2lkIHRhYmxlRW50cnkoaW50IG51bSwgZG91YmxlKiBvbmUsIGRvdWJsZSogdHdvLCBkb3VibGUqIHRocmVlKTsKLSAgY29uc3QgY2hhciogZGVsYXlSaXNlT3JGYWxsKCk7Ci0gIGNvbnN0IGNoYXIqIGRlbGF5VW5hdGVuZXNzKCk7Ci0gIGRvdWJsZSBkZWxheVRhYmxlT25lKCk7Ci0gIGRvdWJsZSBkZWxheVRhYmxlVHdvKCk7Ci0gIGRvdWJsZSBkZWxheVRhYmxlVGhyZWUoKTsKLSAgY29uc3QgY2hhciogdHJhbnNpdGlvblJpc2VPckZhbGwoKTsKLSAgY29uc3QgY2hhciogdHJhbnNpdGlvblVuYXRlbmVzcygpOwotICBkb3VibGUgdHJhbnNpdGlvblRhYmxlT25lKCk7Ci0gIGRvdWJsZSB0cmFuc2l0aW9uVGFibGVUd28oKTsKLSAgZG91YmxlIHRyYW5zaXRpb25UYWJsZVRocmVlKCk7Ci0gIGRvdWJsZSBmYWxsSW50cmluc2ljT25lKCk7Ci0gIGRvdWJsZSBmYWxsSW50cmluc2ljVHdvKCk7Ci0gIGRvdWJsZSBmYWxsSW50cmluc2ljVGhyZWUoKTsKLSAgZG91YmxlIGZhbGxJbnRyaW5zaWNGb3VyKCk7Ci0gIGRvdWJsZSByaXNlSW50cmluc2ljT25lKCk7Ci0gIGRvdWJsZSByaXNlSW50cmluc2ljVHdvKCk7Ci0gIGRvdWJsZSByaXNlSW50cmluc2ljVGhyZWUoKTsKLSAgZG91YmxlIHJpc2VJbnRyaW5zaWNGb3VyKCk7Ci0gIGRvdWJsZSBmYWxsU2xld09uZSgpOwotICBkb3VibGUgZmFsbFNsZXdUd28oKTsKLSAgZG91YmxlIGZhbGxTbGV3VGhyZWUoKTsKLSAgZG91YmxlIGZhbGxTbGV3Rm91cigpOwotICBkb3VibGUgZmFsbFNsZXdGaXZlKCk7Ci0gIGRvdWJsZSBmYWxsU2xld1NpeCgpOwotICBkb3VibGUgZmFsbFNsZXdTZXZlbigpOwotICBkb3VibGUgcmlzZVNsZXdPbmUoKTsKLSAgZG91YmxlIHJpc2VTbGV3VHdvKCk7Ci0gIGRvdWJsZSByaXNlU2xld1RocmVlKCk7Ci0gIGRvdWJsZSByaXNlU2xld0ZvdXIoKTsKLSAgZG91YmxlIHJpc2VTbGV3Rml2ZSgpOwotICBkb3VibGUgcmlzZVNsZXdTaXgoKTsKLSAgZG91YmxlIHJpc2VTbGV3U2V2ZW4oKTsKLSAgaW50IGhhc1Jpc2VSUygpOwotICBkb3VibGUgcmlzZVJTT25lKCk7Ci0gIGRvdWJsZSByaXNlUlNUd28oKTsKLSAgaW50IGhhc1Jpc2VDUygpOwotICBkb3VibGUgcmlzZUNTT25lKCk7Ci0gIGRvdWJsZSByaXNlQ1NUd28oKTsKLSAgaW50IGhhc0ZhbGxSUygpOwotICBkb3VibGUgZmFsbFJTT25lKCk7Ci0gIGRvdWJsZSBmYWxsUlNUd28oKTsKLSAgaW50IGhhc0ZhbGxDUygpOwotICBkb3VibGUgZmFsbENTT25lKCk7Ci0gIGRvdWJsZSBmYWxsQ1NUd28oKTsKLSAgaW50IGhhc1VuYXRlbmVzcygpOwotICBjb25zdCBjaGFyKiB1bmF0ZW5lc3MoKTsKLSAgaW50IGhhc1Jpc2VBdHQxKCk7Ci0gIGRvdWJsZSByaXNlQXR0MU9uZSgpOwotICBkb3VibGUgcmlzZUF0dDFUd28oKTsKLSAgaW50IGhhc0ZhbGxBdHQxKCk7Ci0gIGRvdWJsZSBmYWxsQXR0MU9uZSgpOwotICBkb3VibGUgZmFsbEF0dDFUd28oKTsKLSAgaW50IGhhc0ZhbGxUbygpOwotICBkb3VibGUgZmFsbFRvT25lKCk7Ci0gIGRvdWJsZSBmYWxsVG9Ud28oKTsKLSAgaW50IGhhc1Jpc2VUbygpOwotICBkb3VibGUgcmlzZVRvT25lKCk7Ci0gIGRvdWJsZSByaXNlVG9Ud28oKTsKLSAgaW50IGhhc1N0YWJsZVRpbWluZygpOwotICBkb3VibGUgc3RhYmxlU2V0dXAoKTsKLSAgZG91YmxlIHN0YWJsZUhvbGQoKTsKLSAgY29uc3QgY2hhciogc3RhYmxlUmlzZUZhbGwoKTsKLSAgLy8gVGhlIGZvbGxvd2luZyBhcmUgZm9yIDUuMQotICBpbnQgaGFzU0RGb25lUGluVHJpZ2dlcigpOwotICBpbnQgaGFzU0RGdHdvUGluVHJpZ2dlcigpOwotICBpbnQgaGFzU0RGY29uZFN0YXJ0KCk7Ci0gIGludCBoYXNTREZjb25kRW5kKCk7Ci0gIGludCBoYXNTREZjb25kKCk7Ci0gIGNvbnN0IGNoYXIqIFNERm9uZVBpblRyaWdnZXJUeXBlKCk7Ci0gIGNvbnN0IGNoYXIqIFNERnR3b1BpblRyaWdnZXJUeXBlKCk7Ci0gIGNvbnN0IGNoYXIqIFNERmZyb21UcmlnZ2VyKCk7Ci0gIGNvbnN0IGNoYXIqIFNERnRvVHJpZ2dlcigpOwotICBkb3VibGUgU0RGdHJpZ2dlck9uZSgpOwotICBkb3VibGUgU0RGdHJpZ2dlclR3bygpOwotICBkb3VibGUgU0RGdHJpZ2dlclRocmVlKCk7Ci0gIGNvbnN0IGNoYXIqIFNERmNvbmRTdGFydCgpOwotICBjb25zdCBjaGFyKiBTREZjb25kRW5kKCk7Ci0gIGNvbnN0IGNoYXIqIFNERmNvbmQoKTsKLQotcHJvdGVjdGVkOgotICBpbnQgbnVtRnJvbV87Ci0gIGNoYXIqKiBmcm9tXzsKLSAgaW50IGZyb21BbGxvY2F0ZWRfOwotICBpbnQgbnVtVG9fOwotICBjaGFyKiogdG9fOwotICBpbnQgdG9BbGxvY2F0ZWRfOwotCi0gIGludCBoYXNUcmFuc2l0aW9uXzsKLSAgaW50IGhhc0RlbGF5XzsKLSAgaW50IGhhc1Jpc2VTbGV3XzsKLSAgaW50IGhhc1Jpc2VTbGV3Ml87Ci0gIGludCBoYXNGYWxsU2xld187Ci0gIGludCBoYXNGYWxsU2xldzJfOwotICBpbnQgaGFzUmlzZUludHJpbnNpY187Ci0gIGludCBoYXNGYWxsSW50cmluc2ljXzsKLSAgaW50IGhhc1Jpc2VSU187Ci0gIGludCBoYXNSaXNlQ1NfOwotICBpbnQgaGFzRmFsbFJTXzsKLSAgaW50IGhhc0ZhbGxDU187Ci0gIGludCBoYXNVbmF0ZW5lc3NfOwotICBpbnQgaGFzRmFsbEF0dDFfOwotICBpbnQgaGFzUmlzZUF0dDFfOwotICBpbnQgaGFzRmFsbFRvXzsKLSAgaW50IGhhc1Jpc2VUb187Ci0gIGludCBoYXNTdGFibGVUaW1pbmdfOwotICBpbnQgaGFzU0RGb25lUGluVHJpZ2dlcl87Ci0gIGludCBoYXNTREZ0d29QaW5UcmlnZ2VyXzsKLSAgaW50IGhhc1NERmNvbmRTdGFydF87Ci0gIGludCBoYXNTREZjb25kRW5kXzsKLSAgaW50IGhhc1NERmNvbmRfOwotICBpbnQgbm93UmlzZV87Ci0KLSAgaW50IG51bU9mQXhpc051bWJlcnNfOwotICBkb3VibGUqIGF4aXNOdW1iZXJzXzsKLSAgaW50IGF4aXNOdW1iZXJzQWxsb2NhdGVkXzsKLQotICBpbnQgbnVtT2ZUYWJsZUVudHJpZXNfOwotICBpbnQgdGFibGVFbnRyaWVzQWxsb2NhdGVkXzsKLSAgZG91YmxlKiB0YWJsZV87ICAvLyB0aHJlZSBudW1iZXJzIHBlciBlbnRyeSAKLQotICBjaGFyKiBkZWxheVJpc2VPckZhbGxfOwotICBjaGFyKiBkZWxheVVuYXRlbmVzc187Ci0gIGRvdWJsZSBkZWxheVRhYmxlT25lXzsKLSAgZG91YmxlIGRlbGF5VGFibGVUd29fOwotICBkb3VibGUgZGVsYXlUYWJsZVRocmVlXzsKLSAgY2hhciogdHJhbnNpdGlvblJpc2VPckZhbGxfOwotICBjaGFyKiB0cmFuc2l0aW9uVW5hdGVuZXNzXzsKLSAgZG91YmxlIHRyYW5zaXRpb25UYWJsZU9uZV87Ci0gIGRvdWJsZSB0cmFuc2l0aW9uVGFibGVUd29fOwotICBkb3VibGUgdHJhbnNpdGlvblRhYmxlVGhyZWVfOwotICBkb3VibGUgcmlzZUludHJpbnNpY09uZV87Ci0gIGRvdWJsZSByaXNlSW50cmluc2ljVHdvXzsKLSAgZG91YmxlIHJpc2VJbnRyaW5zaWNUaHJlZV87Ci0gIGRvdWJsZSByaXNlSW50cmluc2ljRm91cl87Ci0gIGRvdWJsZSBmYWxsSW50cmluc2ljT25lXzsKLSAgZG91YmxlIGZhbGxJbnRyaW5zaWNUd29fOwotICBkb3VibGUgZmFsbEludHJpbnNpY1RocmVlXzsKLSAgZG91YmxlIGZhbGxJbnRyaW5zaWNGb3VyXzsKLSAgZG91YmxlIHJpc2VTbGV3T25lXzsKLSAgZG91YmxlIHJpc2VTbGV3VHdvXzsKLSAgZG91YmxlIHJpc2VTbGV3VGhyZWVfOwotICBkb3VibGUgcmlzZVNsZXdGb3VyXzsKLSAgZG91YmxlIHJpc2VTbGV3Rml2ZV87Ci0gIGRvdWJsZSByaXNlU2xld1NpeF87Ci0gIGRvdWJsZSByaXNlU2xld1NldmVuXzsKLSAgZG91YmxlIGZhbGxTbGV3T25lXzsKLSAgZG91YmxlIGZhbGxTbGV3VHdvXzsKLSAgZG91YmxlIGZhbGxTbGV3VGhyZWVfOwotICBkb3VibGUgZmFsbFNsZXdGb3VyXzsKLSAgZG91YmxlIGZhbGxTbGV3Rml2ZV87Ci0gIGRvdWJsZSBmYWxsU2xld1NpeF87Ci0gIGRvdWJsZSBmYWxsU2xld1NldmVuXzsKLSAgZG91YmxlIHJpc2VSU09uZV87Ci0gIGRvdWJsZSByaXNlUlNUd29fOwotICBkb3VibGUgcmlzZUNTT25lXzsKLSAgZG91YmxlIHJpc2VDU1R3b187Ci0gIGRvdWJsZSBmYWxsUlNPbmVfOwotICBkb3VibGUgZmFsbFJTVHdvXzsKLSAgZG91YmxlIGZhbGxDU09uZV87Ci0gIGRvdWJsZSBmYWxsQ1NUd29fOwotICBjaGFyKiB1bmF0ZW5lc3NfOwotICBkb3VibGUgcmlzZUF0dDFPbmVfOwotICBkb3VibGUgcmlzZUF0dDFUd29fOwotICBkb3VibGUgZmFsbEF0dDFPbmVfOwotICBkb3VibGUgZmFsbEF0dDFUd29fOwotICBkb3VibGUgZmFsbFRvT25lXzsKLSAgZG91YmxlIGZhbGxUb1R3b187Ci0gIGRvdWJsZSByaXNlVG9PbmVfOwotICBkb3VibGUgcmlzZVRvVHdvXzsKLSAgZG91YmxlIHN0YWJsZVNldHVwXzsKLSAgZG91YmxlIHN0YWJsZUhvbGRfOwotICBjaGFyKiBzdGFibGVSaXNlRmFsbF87Ci0gIGNoYXIqIFNERnRyaWdnZXJUeXBlXzsKLSAgY2hhciogU0RGZnJvbVRyaWdnZXJfOwotICBjaGFyKiBTREZ0b1RyaWdnZXJfOwotICBkb3VibGUgU0RGdHJpZ2dlclRhYmxlT25lXzsKLSAgZG91YmxlIFNERnRyaWdnZXJUYWJsZVR3b187Ci0gIGRvdWJsZSBTREZ0cmlnZ2VyVGFibGVUaHJlZV87Ci0gIGNoYXIqIFNERmNvbmRTdGFydF87Ci0gIGNoYXIqIFNERmNvbmRFbmRfOwotICBjaGFyKiBTREZjb25kXzsKLX07Ci0KLS8vIDUuOCAKLWNsYXNzIGxlZmlNYWNyb1NpdGUgewotcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgbGVmaU1hY3JvU2l0ZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBsZWZpU2l0ZVBhdHRlcm4qIHBhdHRlcm4pOwotCi0gIGNvbnN0IGNoYXIgICAgICAgICAgICAqc2l0ZU5hbWUoKSBjb25zdDsKLSAgY29uc3QgbGVmaVNpdGVQYXR0ZXJuICpzaXRlUGF0dGVybigpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gIGNvbnN0IGNoYXIgICAgICAgICAgICAqc2l0ZU5hbWVfOwotICBjb25zdCBsZWZpU2l0ZVBhdHRlcm4gKnNpdGVQYXR0ZXJuXzsKLX07Ci0KLWNsYXNzIGxlZmlNYWNyb0ZvcmVpZ24gewotcHVibGljOgotICAgICAgICAgICAgIGxlZmlNYWNyb0ZvcmVpZ24oY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgaGFzUHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBoYXNPcmllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIG9yaWVudCk7Ci0KLSAgY29uc3QgY2hhciAqY2VsbE5hbWUoKSBjb25zdDsKLSAgaW50ICAgICAgICBjZWxsSGFzUHRzKCkgY29uc3Q7Ci0gIGRvdWJsZSAgICAgcHgoKSBjb25zdDsKLSAgZG91YmxlICAgICBweSgpIGNvbnN0OwotICBpbnQgICAgICAgIGNlbGxIYXNPcmllbnQoKSBjb25zdDsKLSAgaW50ICAgICAgICBjZWxsT3JpZW50KCkgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgY29uc3QgY2hhciAqY2VsbE5hbWVfOwotICBpbnQgICAgICAgIGNlbGxIYXNQdHNfOwotICBkb3VibGUgICAgIHB4XzsKLSAgZG91YmxlICAgICBweV87Ci0gIGludCAgICAgICAgY2VsbEhhc09yaWVudF87Ci0gIGludCAgICAgICAgY2VsbE9yaWVudF87Ci19OwotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotVVNFX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZpTWlzYy5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlNaXNjLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI5MTRlZi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlNaXNjLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE4NjcgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiAtIDIwMTQsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaW5jbHVkZSAibGVmaU1pc2MuaHBwIgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgImxleC5oIgotI2luY2x1ZGUgImxlZmlEZWJ1Zy5ocHAiCi0jaW5jbHVkZSAibGVmaVV0aWwuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gbGVmaUdlb21ldHJpZXMKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLWxlZmlHZW9tZXRyaWVzOjpsZWZpR2VvbWV0cmllcygpCi17Ci0gICAgSW5pdCgpOwotfQotCi12b2lkCi1sZWZpR2VvbWV0cmllczo6SW5pdCgpCi17Ci0gICAgaXRlbXNBbGxvY2F0ZWRfID0gMjsKLSAgICBudW1JdGVtc18gPSAwOwotICAgIGl0ZW1UeXBlXyA9IChsZWZpR2VvbUVudW0qKSBsZWZNYWxsb2Moc2l6ZW9mKGxlZmlHZW9tRW51bSkgKiAyKTsKLSAgICBpdGVtc18gPSAodm9pZCoqKSBsZWZNYWxsb2Moc2l6ZW9mKHZvaWQqKSAqIDIpOwotICAgIG51bVBvaW50c18gPSAwOwotICAgIHBvaW50c0FsbG9jYXRlZF8gPSAwOwotICAgIHhfID0gMDsKLSAgICB5XyA9IDA7Ci0gICAgeFN0YXJ0XyA9IC0xOwotICAgIHlTdGFydF8gPSAtMTsKLSAgICB4U3RlcF8gPSAtMTsKLSAgICB5U3RlcF8gPSAtMTsKLX0KLQotdm9pZAotbGVmaUdlb21ldHJpZXM6OkRlc3Ryb3koKQotewotICAgIGNsZWFyKCk7Ci0gICAgbGVmRnJlZSgoY2hhciopIChpdGVtc18pKTsKLSAgICBsZWZGcmVlKChjaGFyKikgKGl0ZW1UeXBlXykpOwotICAgIGlmICh4XykgewotICAgICAgICBsZWZGcmVlKChkb3VibGUqKSAoeF8pKTsKLSAgICAgICAgbGVmRnJlZSgoZG91YmxlKikgKHlfKSk7Ci0gICAgfQotICAgIHBvaW50c0FsbG9jYXRlZF8gPSAwOwotfQotCi1sZWZpR2VvbWV0cmllczo6fmxlZmlHZW9tZXRyaWVzKCkKLXsKLSAgICBEZXN0cm95KCk7Ci19Ci0KLXZvaWQKLWxlZmlHZW9tZXRyaWVzOjpjbGVhcigpCi17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1JdGVtc187IGkrKykgewotICAgICAgICBpZiAoaXRlbVR5cGVfW2ldID09IGxlZmlHZW9tVmlhRSkgewotICAgICAgICAgICAgbGVmRnJlZSgoKGxlZmlHZW9tVmlhKikgKGl0ZW1zX1tpXSkpLT5uYW1lKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXRlbVR5cGVfW2ldID09IGxlZmlHZW9tVmlhSXRlckUpIHsKLSAgICAgICAgICAgIGxlZkZyZWUoKChsZWZpR2VvbVZpYUl0ZXIqKSAoaXRlbXNfW2ldKSktPm5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdGVtVHlwZV9baV0gPT0gbGVmaUdlb21QYXRoRSkgewotICAgICAgICAgICAgKChsZWZpR2VvbVBhdGgqKSAoaXRlbXNfW2ldKSktPm51bVBvaW50cyA9IDA7Ci0gICAgICAgICAgICBsZWZGcmVlKChkb3VibGUqKSAoKGxlZmlHZW9tUGF0aCopIGl0ZW1zX1tpXSktPngpOwotICAgICAgICAgICAgbGVmRnJlZSgoZG91YmxlKikgKChsZWZpR2VvbVBhdGgqKSBpdGVtc19baV0pLT55KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXRlbVR5cGVfW2ldID09IGxlZmlHZW9tUGF0aEl0ZXJFKSB7Ci0gICAgICAgICAgICAoKGxlZmlHZW9tUGF0aEl0ZXIqKSAoaXRlbXNfW2ldKSktPm51bVBvaW50cyA9IDA7Ci0gICAgICAgICAgICBsZWZGcmVlKChkb3VibGUqKSAoKGxlZmlHZW9tUGF0aEl0ZXIqKSBpdGVtc19baV0pLT54KTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGRvdWJsZSopICgobGVmaUdlb21QYXRoSXRlciopIGl0ZW1zX1tpXSktPnkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdGVtVHlwZV9baV0gPT0gbGVmaUdlb21Qb2x5Z29uRSkgewotICAgICAgICAgICAgKChsZWZpR2VvbVBvbHlnb24qKSAoaXRlbXNfW2ldKSktPm51bVBvaW50cyA9IDA7Ci0gICAgICAgICAgICBsZWZGcmVlKChkb3VibGUqKSAoKGxlZmlHZW9tUG9seWdvbiopIGl0ZW1zX1tpXSktPngpOwotICAgICAgICAgICAgbGVmRnJlZSgoZG91YmxlKikgKChsZWZpR2VvbVBvbHlnb24qKSBpdGVtc19baV0pLT55KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXRlbVR5cGVfW2ldID09IGxlZmlHZW9tUG9seWdvbkl0ZXJFKSB7Ci0gICAgICAgICAgICAoKGxlZmlHZW9tUG9seWdvbkl0ZXIqKSAoaXRlbXNfW2ldKSktPm51bVBvaW50cyA9IDA7Ci0gICAgICAgICAgICBsZWZGcmVlKChkb3VibGUqKSAoKGxlZmlHZW9tUG9seWdvbkl0ZXIqKSBpdGVtc19baV0pLT54KTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGRvdWJsZSopICgobGVmaUdlb21Qb2x5Z29uSXRlciopIGl0ZW1zX1tpXSktPnkpOwotICAgICAgICB9Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoaXRlbXNfW2ldKSk7Ci0gICAgfQotICAgIG51bUl0ZW1zXyA9IDA7Ci19Ci0KLXZvaWQKLWxlZmlHZW9tZXRyaWVzOjpjbGVhclBvbHlJdGVtcygpCi17Ci0gICAgbGVmRnJlZSgoY2hhciopIChpdGVtc18pKTsKLSAgICBsZWZGcmVlKChjaGFyKikgKGl0ZW1UeXBlXykpOwotICAgIGlmICh4XykgewotICAgICAgICBsZWZGcmVlKChkb3VibGUqKSAoeF8pKTsKLSAgICAgICAgbGVmRnJlZSgoZG91YmxlKikgKHlfKSk7Ci0gICAgfQotICAgIG51bVBvaW50c18gPSAwOwotICAgIHBvaW50c0FsbG9jYXRlZF8gPSAwOwotICAgIG51bUl0ZW1zXyA9IDA7Ci19Ci0KLXZvaWQKLWxlZmlHZW9tZXRyaWVzOjphZGQodm9pZCAgICAgICAgICAgICp2LAotICAgICAgICAgICAgICAgICAgICBsZWZpR2VvbUVudW0gICAgZSkKLXsKLSAgICBpZiAobnVtSXRlbXNfID09IGl0ZW1zQWxsb2NhdGVkXykgewotICAgICAgICBpbnQgICAgICAgICAgICAgaTsKLSAgICAgICAgdm9pZCAgICAgICAgICAgICoqbmV3aTsKLSAgICAgICAgbGVmaUdlb21FbnVtICAgICpuZXdlOwotICAgICAgICBpZiAoaXRlbXNBbGxvY2F0ZWRfID09IDApICAgLy8gOS8xMi8yMDAyIC0gZm9yIEMgdmVyc2lvbgotICAgICAgICAgICAgaXRlbXNBbGxvY2F0ZWRfID0gMjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaXRlbXNBbGxvY2F0ZWRfICo9IDI7Ci0gICAgICAgIG5ld2UgPSAobGVmaUdlb21FbnVtKikgbGVmTWFsbG9jKHNpemVvZihsZWZpR2VvbUVudW0pICogaXRlbXNBbGxvY2F0ZWRfKTsKLSAgICAgICAgbmV3aSA9ICh2b2lkKiopIGxlZk1hbGxvYyhzaXplb2Yodm9pZCopICogaXRlbXNBbGxvY2F0ZWRfKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUl0ZW1zXzsgaSsrKSB7Ci0gICAgICAgICAgICBuZXdlW2ldID0gaXRlbVR5cGVfW2ldOwotICAgICAgICAgICAgbmV3aVtpXSA9IGl0ZW1zX1tpXTsKLSAgICAgICAgfQotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGl0ZW1zXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGl0ZW1UeXBlXykpOwotICAgICAgICBpdGVtc18gPSBuZXdpOwotICAgICAgICBpdGVtVHlwZV8gPSBuZXdlOwotICAgIH0KLSAgICBpdGVtc19bbnVtSXRlbXNfXSA9IHY7Ci0gICAgaXRlbVR5cGVfW251bUl0ZW1zX10gPSBlOwotICAgIG51bUl0ZW1zXyArPSAxOwotfQotCi12b2lkCi1sZWZpR2VvbWV0cmllczo6YWRkTGF5ZXIoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBjaGFyICpjID0gKGNoYXIqKSBsZWZNYWxsb2Moc3RybGVuKG5hbWUpICsgMSk7Ci0gICAgc3RyY3B5KGMsIENBU0UobmFtZSkpOwotICAgIGFkZCgodm9pZCopIGMsIGxlZmlHZW9tTGF5ZXJFKTsKLX0KLQotLy8gNS43Ci12b2lkCi1sZWZpR2VvbWV0cmllczo6YWRkTGF5ZXJFeGNlcHRQZ05ldCgpCi17Ci0gICAgaW50ICpkID0gKGludCopIGxlZk1hbGxvYyhzaXplb2YoaW50KSk7Ci0gICAgKmQgPSAxOwotICAgIGFkZCgodm9pZCopIGQsIGxlZmlHZW9tTGF5ZXJFeGNlcHRQZ05ldEUpOwotfQotCi12b2lkCi1sZWZpR2VvbWV0cmllczo6YWRkTGF5ZXJNaW5TcGFjaW5nKGRvdWJsZSBzcGFjaW5nKQotewotICAgIGRvdWJsZSAqZCA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkpOwotICAgICpkID0gc3BhY2luZzsKLSAgICBhZGQoKHZvaWQqKSBkLCBsZWZpR2VvbUxheWVyTWluU3BhY2luZ0UpOwotfQotCi12b2lkCi1sZWZpR2VvbWV0cmllczo6YWRkTGF5ZXJSdWxlV2lkdGgoZG91YmxlIHdpZHRoKQotewotICAgIGRvdWJsZSAqZCA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkpOwotICAgICpkID0gd2lkdGg7Ci0gICAgYWRkKCh2b2lkKikgZCwgbGVmaUdlb21MYXllclJ1bGVXaWR0aEUpOwotfQotCi12b2lkCi1sZWZpR2VvbWV0cmllczo6YWRkQ2xhc3MoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBjaGFyICpjID0gKGNoYXIqKSBsZWZNYWxsb2Moc3RybGVuKG5hbWUpICsgMSk7Ci0gICAgc3RyY3B5KGMsIENBU0UobmFtZSkpOwotICAgIGFkZCgodm9pZCopIGMsIGxlZmlHZW9tQ2xhc3NFKTsKLX0KLQotdm9pZAotbGVmaUdlb21ldHJpZXM6OmFkZFdpZHRoKGRvdWJsZSB3KQotewotICAgIGRvdWJsZSAqZCA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkpOwotICAgICpkID0gdzsKLSAgICBhZGQoKHZvaWQqKSBkLCBsZWZpR2VvbVdpZHRoRSk7Ci19Ci0KLXZvaWQKLWxlZmlHZW9tZXRyaWVzOjphZGRQYXRoKGludCBjb2xvck1hc2spCi17Ci0gICAgaW50ICAgICAgICAgICAgIGk7Ci0gICAgaW50ICAgICAgICAgICAgIGxpbTsKLSAgICBsZWZpR2VvbVBhdGggICAgKnAgPSAobGVmaUdlb21QYXRoKikgbGVmTWFsbG9jKHNpemVvZihsZWZpR2VvbVBhdGgpKTsKLQotICAgIGxpbSA9IHAtPm51bVBvaW50cyA9IG51bVBvaW50c187Ci0KLSAgICBpZiAobGltID4gMCkgewotICAgICAgICBwLT54ID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGxpbSk7Ci0gICAgICAgIHAtPnkgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGltKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbTsgaSsrKSB7Ci0gICAgICAgICAgICBwLT54W2ldID0geF9baV07Ci0gICAgICAgICAgICBwLT55W2ldID0geV9baV07Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBwLT54ID0gMDsKLSAgICAgICAgcC0+eSA9IDA7Ci0gICAgfQotCi0gICAgcC0+Y29sb3JNYXNrID0gY29sb3JNYXNrOwotCi0gICAgYWRkKCh2b2lkKikgcCwgbGVmaUdlb21QYXRoRSk7Ci19Ci0KLXZvaWQKLWxlZmlHZW9tZXRyaWVzOjphZGRQYXRoSXRlcihpbnQgY29sb3JNYXNrKQotewotICAgIGludCAgICAgICAgICAgICAgICAgaTsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGxpbTsKLSAgICBsZWZpR2VvbVBhdGhJdGVyICAgICpwID0gKGxlZmlHZW9tUGF0aEl0ZXIqKSBsZWZNYWxsb2Moc2l6ZW9mKGxlZmlHZW9tUGF0aEl0ZXIpKTsKLQotICAgIGxpbSA9IHAtPm51bVBvaW50cyA9IG51bVBvaW50c187Ci0KLSAgICBpZiAobGltID4gMCkgewotICAgICAgICBwLT54ID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGxpbSk7Ci0gICAgICAgIHAtPnkgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGltKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbTsgaSsrKSB7Ci0gICAgICAgICAgICBwLT54W2ldID0geF9baV07Ci0gICAgICAgICAgICBwLT55W2ldID0geV9baV07Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBwLT54ID0gMDsKLSAgICAgICAgcC0+eSA9IDA7Ci0gICAgfQotCi0gICAgcC0+Y29sb3JNYXNrID0gY29sb3JNYXNrOwotICAgIHAtPnhTdGFydCA9IHhTdGFydF87Ci0gICAgcC0+eVN0YXJ0ID0geVN0YXJ0XzsKLSAgICBwLT54U3RlcCA9IHhTdGVwXzsKLSAgICBwLT55U3RlcCA9IHlTdGVwXzsKLQotICAgIGFkZCgodm9pZCopIHAsIGxlZmlHZW9tUGF0aEl0ZXJFKTsKLX0KLQotLy8gcGNyIDQ4MTc4MyAmIDU2MDUwNCAKLXZvaWQKLWxlZmlHZW9tZXRyaWVzOjphZGRSZWN0KGludCAgICAgY29sb3JNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICB4bCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgeWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgIHhoLAotICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICB5aCkKLXsKLSAgICBsZWZpR2VvbVJlY3QgKnAgPSAobGVmaUdlb21SZWN0KikgbGVmTWFsbG9jKHNpemVvZihsZWZpR2VvbVJlY3QpKTsKLSAgICBwLT54bCA9IHhsOwotICAgIHAtPnlsID0geWw7Ci0gICAgcC0+eGggPSB4aDsKLSAgICBwLT55aCA9IHloOwotICAgIHAtPmNvbG9yTWFzayA9IGNvbG9yTWFzazsKLQotICAgIGFkZCgodm9pZCopIHAsIGxlZmlHZW9tUmVjdEUpOwotfQotCi12b2lkCi1sZWZpR2VvbWV0cmllczo6YWRkUmVjdEl0ZXIoaW50ICAgICBjb2xvck1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICB4bCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgIHlsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgeGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICB5aCkKLXsKLSAgICBsZWZpR2VvbVJlY3RJdGVyICpwID0gKGxlZmlHZW9tUmVjdEl0ZXIqKSBsZWZNYWxsb2Moc2l6ZW9mKGxlZmlHZW9tUmVjdEl0ZXIpKTsKLQotICAgIHAtPnhsID0geGw7Ci0gICAgcC0+eWwgPSB5bDsKLSAgICBwLT54aCA9IHhoOwotICAgIHAtPnloID0geWg7Ci0gICAgcC0+eFN0YXJ0ID0geFN0YXJ0XzsKLSAgICBwLT55U3RhcnQgPSB5U3RhcnRfOwotICAgIHAtPnhTdGVwID0geFN0ZXBfOwotICAgIHAtPnlTdGVwID0geVN0ZXBfOwotICAgIHAtPmNvbG9yTWFzayA9IGNvbG9yTWFzazsKLQotICAgIGFkZCgodm9pZCopIHAsIGxlZmlHZW9tUmVjdEl0ZXJFKTsKLX0KLQotdm9pZAotbGVmaUdlb21ldHJpZXM6OmFkZFBvbHlnb24oaW50IGNvbG9yTWFzaykKLXsKLSAgICBpbnQgICAgICAgICAgICAgaTsKLSAgICBpbnQgICAgICAgICAgICAgbGltOwotICAgIGxlZmlHZW9tUG9seWdvbiAqcCA9IChsZWZpR2VvbVBvbHlnb24qKSBsZWZNYWxsb2Moc2l6ZW9mKGxlZmlHZW9tUG9seWdvbikpOwotCi0gICAgbGltID0gcC0+bnVtUG9pbnRzID0gbnVtUG9pbnRzXzsKLQotICAgIGlmIChsaW0gPiAwKSB7Ci0gICAgICAgIHAtPnggPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbGltKTsKLSAgICAgICAgcC0+eSA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBsaW0pOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGltOyBpKyspIHsKLSAgICAgICAgICAgIHAtPnhbaV0gPSB4X1tpXTsKLSAgICAgICAgICAgIHAtPnlbaV0gPSB5X1tpXTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHAtPnggPSAwOwotICAgICAgICBwLT55ID0gMDsKLSAgICB9Ci0KLQotICAgIHAtPmNvbG9yTWFzayA9IGNvbG9yTWFzazsKLQotICAgIGFkZCgodm9pZCopIHAsIGxlZmlHZW9tUG9seWdvbkUpOwotfQotCi12b2lkCi1sZWZpR2VvbWV0cmllczo6YWRkUG9seWdvbkl0ZXIoaW50IGNvbG9yTWFzaykKLXsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGk7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBsaW07Ci0gICAgbGVmaUdlb21Qb2x5Z29uSXRlciAqcCA9IChsZWZpR2VvbVBvbHlnb25JdGVyKikgbGVmTWFsbG9jKHNpemVvZihsZWZpR2VvbVBvbHlnb25JdGVyKSk7Ci0KLSAgICBsaW0gPSBwLT5udW1Qb2ludHMgPSBudW1Qb2ludHNfOwotCi0gICAgaWYgKGxpbSA+IDApIHsKLSAgICAgICAgcC0+eCA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBsaW0pOwotICAgICAgICBwLT55ID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGxpbSk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW07IGkrKykgewotICAgICAgICAgICAgcC0+eFtpXSA9IHhfW2ldOwotICAgICAgICAgICAgcC0+eVtpXSA9IHlfW2ldOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcC0+eCA9IDA7Ci0gICAgICAgIHAtPnkgPSAwOwotICAgIH0KLQotICAgIHAtPnhTdGFydCA9IHhTdGFydF87Ci0gICAgcC0+eVN0YXJ0ID0geVN0YXJ0XzsKLSAgICBwLT54U3RlcCA9IHhTdGVwXzsKLSAgICBwLT55U3RlcCA9IHlTdGVwXzsKLQotICAgIHAtPmNvbG9yTWFzayA9IGNvbG9yTWFzazsKLQotICAgIGFkZCgodm9pZCopIHAsIGxlZmlHZW9tUG9seWdvbkl0ZXJFKTsKLX0KLQotdm9pZAotbGVmaUdlb21ldHJpZXM6OmFkZFZpYShpbnQgICAgICAgICAgdmlhTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgIHgsCi0gICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICB5LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKm5hbWUpCi17Ci0gICAgbGVmaUdlb21WaWEgKnAgPSAobGVmaUdlb21WaWEqKSBsZWZNYWxsb2Moc2l6ZW9mKGxlZmlHZW9tVmlhKSk7Ci0gICAgY2hhciAgICAgICAgKmMgPSAoY2hhciopIGxlZk1hbGxvYyhzdHJsZW4obmFtZSkgKyAxKTsKLQotICAgIHN0cmNweShjLCBDQVNFKG5hbWUpKTsKLSAgICBwLT54ID0geDsKLSAgICBwLT55ID0geTsKLSAgICBwLT5uYW1lID0gYzsKLSAgICBwLT5ib3R0b21NYXNrTnVtID0gdmlhTWFzayAlIDEwOwotICAgIHAtPmN1dE1hc2tOdW0gPSB2aWFNYXNrIC8gMTAgJSAxMDsKLSAgICBwLT50b3BNYXNrTnVtID0gdmlhTWFzayAvIDEwMDsKLQotICAgIGFkZCgodm9pZCopIHAsIGxlZmlHZW9tVmlhRSk7Ci19Ci0KLXZvaWQKLWxlZmlHZW9tZXRyaWVzOjphZGRWaWFJdGVyKGludCAgICAgICAgICB2aWFNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICAgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAqbmFtZSkKLXsKLSAgICBsZWZpR2VvbVZpYUl0ZXIgKnAgPSAobGVmaUdlb21WaWFJdGVyKikgbGVmTWFsbG9jKHNpemVvZihsZWZpR2VvbVZpYUl0ZXIpKTsKLSAgICBjaGFyICAgICAgICAgICAgKmMgPSAoY2hhciopIGxlZk1hbGxvYyhzdHJsZW4obmFtZSkgKyAxKTsKLQotICAgIHN0cmNweShjLCBDQVNFKG5hbWUpKTsKLSAgICBwLT5ib3R0b21NYXNrTnVtID0gdmlhTWFzayAlIDEwOwotICAgIHAtPmN1dE1hc2tOdW0gPSB2aWFNYXNrIC8gMTAgJSAxMDsKLSAgICBwLT50b3BNYXNrTnVtID0gdmlhTWFzayAvIDEwMDsKLSAgICBwLT54ID0geDsKLSAgICBwLT55ID0geTsKLSAgICBwLT5uYW1lID0gYzsKLSAgICBwLT54U3RhcnQgPSB4U3RhcnRfOwotICAgIHAtPnlTdGFydCA9IHlTdGFydF87Ci0gICAgcC0+eFN0ZXAgPSB4U3RlcF87Ci0gICAgcC0+eVN0ZXAgPSB5U3RlcF87Ci0KLSAgICBhZGQoKHZvaWQqKSBwLCBsZWZpR2VvbVZpYUl0ZXJFKTsKLX0KLQotdm9pZAotbGVmaUdlb21ldHJpZXM6OmFkZFN0ZXBQYXR0ZXJuKGRvdWJsZSAgIHhTdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICB5U3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgeFN0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgeVN0ZXApCi17Ci0gICAgeFN0YXJ0XyA9IHhTdGFydDsKLSAgICB5U3RhcnRfID0geVN0YXJ0OwotICAgIHhTdGVwXyA9IHhTdGVwOwotICAgIHlTdGVwXyA9IHlTdGVwOwotfQotCi12b2lkCi1sZWZpR2VvbWV0cmllczo6c3RhcnRMaXN0KGRvdWJsZSAgICB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgeSkKLXsKLSAgICBpZiAoIXhfKSB7Ci0gICAgICAgIG51bVBvaW50c18gPSAwOwotICAgICAgICBwb2ludHNBbGxvY2F0ZWRfID0gMTY7Ci0gICAgICAgIHhfID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIDE2KTsKLSAgICAgICAgeV8gPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogMTYpOwotICAgIH0gZWxzZSB7ICAvLyByZXNldCB0aGUgbnVtUG9pdHMgdG8gMAotICAgICAgICBudW1Qb2ludHNfID0gMDsKLSAgICB9Ci0gICAgYWRkVG9MaXN0KHgsIHkpOwotfQotCi12b2lkCi1sZWZpR2VvbWV0cmllczo6YWRkVG9MaXN0KGRvdWJsZSAgICB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgeSkKLXsKLSAgICBpZiAobnVtUG9pbnRzXyA9PSBwb2ludHNBbGxvY2F0ZWRfKSB7Ci0gICAgICAgIGludCAgICAgaTsKLSAgICAgICAgZG91YmxlICAqbng7Ci0gICAgICAgIGRvdWJsZSAgKm55OwotICAgICAgICBpZiAocG9pbnRzQWxsb2NhdGVkXyA9PSAwKQotICAgICAgICAgICAgcG9pbnRzQWxsb2NhdGVkXyA9IDI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBvaW50c0FsbG9jYXRlZF8gKj0gMjsKLSAgICAgICAgbnggPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogcG9pbnRzQWxsb2NhdGVkXyk7Ci0gICAgICAgIG55ID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIHBvaW50c0FsbG9jYXRlZF8pOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUG9pbnRzXzsgaSsrKSB7Ci0gICAgICAgICAgICBueFtpXSA9IHhfW2ldOwotICAgICAgICAgICAgbnlbaV0gPSB5X1tpXTsKLSAgICAgICAgfQotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHhfKSk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoeV8pKTsKLSAgICAgICAgeF8gPSBueDsKLSAgICAgICAgeV8gPSBueTsKLSAgICB9Ci0gICAgeF9bbnVtUG9pbnRzX10gPSB4OwotICAgIHlfW251bVBvaW50c19dID0geTsKLSAgICBudW1Qb2ludHNfICs9IDE7Ci19Ci0KLWludAotbGVmaUdlb21ldHJpZXM6Om51bUl0ZW1zKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbnVtSXRlbXNfOwotfQotCi1sZWZpR2VvbUVudW0KLWxlZmlHZW9tZXRyaWVzOjppdGVtVHlwZShpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bUl0ZW1zXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzNjApOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgZ2VvbWV0cnkgaXRlbSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bUl0ZW1zXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxMzYwLCBtc2cpOwotICAgICAgICByZXR1cm4gbGVmaUdlb21Vbmtub3duOwotICAgIH0KLSAgICByZXR1cm4gaXRlbVR5cGVfW2luZGV4XTsKLX0KLQotbGVmaUdlb21SZWN0ICoKLWxlZmlHZW9tZXRyaWVzOjpnZXRSZWN0KGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjaGFyIG1zZ1sxNjBdOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtSXRlbXNfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTM2MSk6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBnZW9tZXRyeSBSRUNUQU5HTEUgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGluZGV4LCBudW1JdGVtc18pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTM2MSwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAobGVmaUdlb21SZWN0KikgKGl0ZW1zX1tpbmRleF0pOwotfQotCi1sZWZpR2VvbVJlY3RJdGVyICoKLWxlZmlHZW9tZXRyaWVzOjpnZXRSZWN0SXRlcihpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bUl0ZW1zXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzNjIpOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgZ2VvbWV0cnkgUkVDVEFOR0xFIElURVJBVEUgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGluZGV4LCBudW1JdGVtc18pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTM2MiwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAobGVmaUdlb21SZWN0SXRlciopIChpdGVtc19baW5kZXhdKTsKLX0KLQotbGVmaUdlb21QYXRoICoKLWxlZmlHZW9tZXRyaWVzOjpnZXRQYXRoKGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjaGFyIG1zZ1sxNjBdOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtSXRlbXNfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTM2Myk6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBnZW9tZXRyeSBQQVRIIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQiLCBpbmRleCwgbnVtSXRlbXNfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDEzNjMsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gKGxlZmlHZW9tUGF0aCopIChpdGVtc19baW5kZXhdKTsKLX0KLQotbGVmaUdlb21QYXRoSXRlciAqCi1sZWZpR2VvbWV0cmllczo6Z2V0UGF0aEl0ZXIoaW50IGluZGV4KSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1JdGVtc18pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xMzY0KTogVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIGdlb21ldHJ5IFBBVEggSVRFUkFURSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bUl0ZW1zXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxMzY0LCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIChsZWZpR2VvbVBhdGhJdGVyKikgKGl0ZW1zX1tpbmRleF0pOwotfQotCi1jaGFyICoKLWxlZmlHZW9tZXRyaWVzOjpnZXRMYXllcihpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bUl0ZW1zXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzNjUpOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgZ2VvbWV0cnkgTEFZRVIgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGluZGV4LCBudW1JdGVtc18pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTM2NSwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAoY2hhciopIChpdGVtc19baW5kZXhdKTsKLX0KLQotLy8gNS43Ci1pbnQKLWxlZmlHZW9tZXRyaWVzOjpoYXNMYXllckV4Y2VwdFBnTmV0KGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjaGFyIG1zZ1sxNjBdOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtSXRlbXNfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTM2Nik6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBnZW9tZXRyeSBMQVlFUiBFWENFUFQgUEcgTkVUIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQiLCBpbmRleCwgbnVtSXRlbXNfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDEzNjYsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gKigoaW50KikgKGl0ZW1zX1tpbmRleF0pKTsKLX0KLQotZG91YmxlCi1sZWZpR2VvbWV0cmllczo6Z2V0TGF5ZXJNaW5TcGFjaW5nKGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjaGFyIG1zZ1sxNjBdOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtSXRlbXNfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTM2Nyk6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBnZW9tZXRyeSBMQVlFUiBNSU5TUEFDSU5HIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQiLCBpbmRleCwgbnVtSXRlbXNfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDEzNjcsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gKigoZG91YmxlKikgKGl0ZW1zX1tpbmRleF0pKTsKLX0KLQotZG91YmxlCi1sZWZpR2VvbWV0cmllczo6Z2V0TGF5ZXJSdWxlV2lkdGgoaW50IGluZGV4KSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1JdGVtc18pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xMzY4KTogVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIGdlb21ldHJ5IExBWUVSIFJVTEUgV0lEVEggaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGluZGV4LCBudW1JdGVtc18pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTM2OCwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAqKChkb3VibGUqKSAoaXRlbXNfW2luZGV4XSkpOwotfQotCi1kb3VibGUKLWxlZmlHZW9tZXRyaWVzOjpnZXRXaWR0aChpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bUl0ZW1zXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzNjkpOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgZ2VvbWV0cnkgV0lEVEggaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGluZGV4LCBudW1JdGVtc18pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTM2OSwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAqKChkb3VibGUqKSAoaXRlbXNfW2luZGV4XSkpOwotfQotCi1sZWZpR2VvbVBvbHlnb24gKgotbGVmaUdlb21ldHJpZXM6OmdldFBvbHlnb24oaW50IGluZGV4KSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1JdGVtc18pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xMzcwKTogVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIGdlb21ldHJ5IFBPTFlHT04gaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGluZGV4LCBudW1JdGVtc18pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTM3MCwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAobGVmaUdlb21Qb2x5Z29uKikgKGl0ZW1zX1tpbmRleF0pOwotfQotCi1sZWZpR2VvbVBvbHlnb25JdGVyICoKLWxlZmlHZW9tZXRyaWVzOjpnZXRQb2x5Z29uSXRlcihpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bUl0ZW1zXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzNzEpOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgZ2VvbWV0cnkgUE9MWUdPTiBJVEVSQVRFIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQiLCBpbmRleCwgbnVtSXRlbXNfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDEzNzEsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gKGxlZmlHZW9tUG9seWdvbkl0ZXIqKSAoaXRlbXNfW2luZGV4XSk7Ci19Ci0KLWNoYXIgKgotbGVmaUdlb21ldHJpZXM6OmdldENsYXNzKGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjaGFyIG1zZ1sxNjBdOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtSXRlbXNfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTM3Mik6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBnZW9tZXRyeSBDTEFTUyBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bUl0ZW1zXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxMzcyLCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIChjaGFyKikgKGl0ZW1zX1tpbmRleF0pOwotfQotCi1sZWZpR2VvbVZpYSAqCi1sZWZpR2VvbWV0cmllczo6Z2V0VmlhKGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjaGFyIG1zZ1sxNjBdOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtSXRlbXNfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTM3Myk6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBnZW9tZXRyeSBWSUEgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGluZGV4LCBudW1JdGVtc18pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTM3MywgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAobGVmaUdlb21WaWEqKSAoaXRlbXNfW2luZGV4XSk7Ci19Ci0KLWxlZmlHZW9tVmlhSXRlciAqCi1sZWZpR2VvbWV0cmllczo6Z2V0VmlhSXRlcihpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bUl0ZW1zXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTEzNzQpOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgZ2VvbWV0cnkgVklBIElURVJBVEUgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGluZGV4LCBudW1JdGVtc18pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTM3NCwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAobGVmaUdlb21WaWFJdGVyKikgKGl0ZW1zX1tpbmRleF0pOwotfQotCi12b2lkCi1sZWZpR2VvbWV0cmllczo6cHJpbnQoRklMRSAqZikgY29uc3QKLXsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGk7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBsOwotICAgIGxlZmlHZW9tUmVjdCAgICAgICAgKnJlY3Q7Ci0gICAgbGVmaUdlb21SZWN0SXRlciAgICAqcmVjdGl0ZXI7Ci0gICAgbGVmaUdlb21QYXRoICAgICAgICAqcGF0aDsKLSAgICBsZWZpR2VvbVBhdGhJdGVyICAgICpwYXRoaXRlcjsKLSAgICBsZWZpR2VvbVBvbHlnb24gICAgICpwb2x5Z29uOwotICAgIGxlZmlHZW9tUG9seWdvbkl0ZXIgKnBvbHlnb25pdGVyOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG51bUl0ZW1zXzsgaSsrKSB7Ci0gICAgICAgIHN3aXRjaCAoaXRlbVR5cGUoaSkpIHsKLQotICAgICAgICBjYXNlIGxlZmlHZW9tTGF5ZXJFOgotICAgICAgICAgICAgZnByaW50ZihmLCAiTGF5ZXIgJXNcbiIsIGdldExheWVyKGkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgbGVmaUdlb21MYXllckV4Y2VwdFBnTmV0RToKLSAgICAgICAgICAgIGlmIChnZXRMYXllck1pblNwYWNpbmcoaSkpCi0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiRVhDRVBUUEdORVQgXG4iKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgbGVmaUdlb21MYXllck1pblNwYWNpbmdFOgotICAgICAgICAgICAgZnByaW50ZihmLCAiU3BhY2luZyAlZ1xuIiwKLSAgICAgICAgICAgICAgICAgICAgZ2V0TGF5ZXJNaW5TcGFjaW5nKGkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgbGVmaUdlb21MYXllclJ1bGVXaWR0aEU6Ci0gICAgICAgICAgICBmcHJpbnRmKGYsICJEZXNpZ25SdWxlV2lkdGggJWdcbiIsCi0gICAgICAgICAgICAgICAgICAgIGdldExheWVyUnVsZVdpZHRoKGkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgbGVmaUdlb21XaWR0aEU6Ci0gICAgICAgICAgICBmcHJpbnRmKGYsICJXaWR0aCAlZ1xuIiwgZ2V0V2lkdGgoaSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBsZWZpR2VvbVBhdGhFOgotICAgICAgICAgICAgcGF0aCA9IGdldFBhdGgoaSk7Ci0gICAgICAgICAgICBmcHJpbnRmKGYsICJQYXRoIik7Ci0KLSAgICAgICAgICAgIGlmIChwYXRoLT5jb2xvck1hc2spIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIgTUFTSyAlZCIsIHBhdGgtPmNvbG9yTWFzayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGwgPSAwOyBsIDwgcGF0aC0+bnVtUG9pbnRzOyBsKyspCi0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiICVnLCVnIiwgcGF0aC0+eFtsXSwgcGF0aC0+eVtsXSk7Ci0gICAgICAgICAgICBmcHJpbnRmKGYsICJcbiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBsZWZpR2VvbVBhdGhJdGVyRToKLSAgICAgICAgICAgIHBhdGhpdGVyID0gZ2V0UGF0aEl0ZXIoaSk7Ci0KLSAgICAgICAgICAgIGlmIChwYXRoaXRlci0+Y29sb3JNYXNrKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiTUFTSyAlZCIsIHBhdGhpdGVyLT5jb2xvck1hc2spOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmcHJpbnRmKGYsICJQYXRoIGl0ZXIgIHN0YXJ0ICVnLCVnICBzdGVwICVnLCVnXG4iLAotICAgICAgICAgICAgICAgICAgICBwYXRoaXRlci0+eFN0YXJ0LCBwYXRoaXRlci0+eVN0YXJ0LAotICAgICAgICAgICAgICAgICAgICBwYXRoaXRlci0+eFN0ZXAsIHBhdGhpdGVyLT55U3RlcCk7Ci0KLSAgICAgICAgICAgIGZvciAobCA9IDA7IGwgPCBwYXRoaXRlci0+bnVtUG9pbnRzOyBsKyspIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIgJWcsJWciLCBwYXRoaXRlci0+eFtsXSwgcGF0aGl0ZXItPnlbbF0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmcHJpbnRmKGYsICJcbiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBsZWZpR2VvbVJlY3RFOgotICAgICAgICAgICAgcmVjdCA9IGdldFJlY3QoaSk7Ci0KLSAgICAgICAgICAgIGlmIChyZWN0LT5jb2xvck1hc2spIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJSZWN0IE1BU0sgJWQsICVnLCVnICAlZywlZ1xuIiwgcmVjdC0+Y29sb3JNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC0+eGwsIHJlY3QtPnlsLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC0+eGgsIHJlY3QtPnloKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiUmVjdCAlZywlZyAgJWcsJWdcbiIsIHJlY3QtPnhsLCByZWN0LT55bCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QtPnhoLCByZWN0LT55aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGxlZmlHZW9tUmVjdEl0ZXJFOgotICAgICAgICAgICAgcmVjdGl0ZXIgPSBnZXRSZWN0SXRlcihpKTsKLQotICAgICAgICAgICAgaWYgKHJlY3RpdGVyLT5jb2xvck1hc2spIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJSZWN0IE1BU0sgJWQgaXRlciAgc3RhcnQgJWcsJWcgIHN0ZXAgJWcsJWdcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICByZWN0aXRlci0+Y29sb3JNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdGl0ZXItPnhTdGFydCwgcmVjdGl0ZXItPnlTdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY3RpdGVyLT54U3RlcCwgcmVjdGl0ZXItPnlTdGVwKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiUmVjdCBpdGVyICBzdGFydCAlZywlZyAgc3RlcCAlZywlZ1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY3RpdGVyLT54U3RhcnQsIHJlY3RpdGVyLT55U3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICByZWN0aXRlci0+eFN0ZXAsIHJlY3RpdGVyLT55U3RlcCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZwcmludGYoZiwgIiAgICAgJWcsJWcgICVnLCVnXG4iLCByZWN0aXRlci0+eGwsIHJlY3RpdGVyLT55bCwKLSAgICAgICAgICAgICAgICAgICAgcmVjdGl0ZXItPnhoLCByZWN0aXRlci0+eWgpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBsZWZpR2VvbVBvbHlnb25FOgotICAgICAgICAgICAgcG9seWdvbiA9IGdldFBvbHlnb24oaSk7Ci0gICAgICAgICAgICBmcHJpbnRmKGYsICJQb2x5Z29uIik7Ci0KLSAgICAgICAgICAgIGlmIChwb2x5Z29uLT5jb2xvck1hc2spIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIgTUFTSyAlZCIsIHBvbHlnb24tPmNvbG9yTWFzayk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAobCA9IDA7IGwgPCBwb2x5Z29uLT5udW1Qb2ludHM7IGwrKykgewotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiAlZywlZyIsIHBvbHlnb24tPnhbbF0sIHBvbHlnb24tPnlbbF0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmcHJpbnRmKGYsICJcbiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBsZWZpR2VvbVBvbHlnb25JdGVyRToKLSAgICAgICAgICAgIHBvbHlnb25pdGVyID0gZ2V0UG9seWdvbkl0ZXIoaSk7Ci0KLSAgICAgICAgICAgIGlmIChwb2x5Z29uaXRlci0+Y29sb3JNYXNrKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiUG9seWdvbiBNQVNLICVkIGl0ZXIgIHN0YXJ0ICVnLCVnICBzdGVwICVnLCVnXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgcG9seWdvbml0ZXItPmNvbG9yTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvbHlnb25pdGVyLT54U3RhcnQsIHBvbHlnb25pdGVyLT55U3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBwb2x5Z29uaXRlci0+eFN0ZXAsIHBvbHlnb25pdGVyLT55U3RlcCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIlBvbHlnb24gaXRlciAgc3RhcnQgJWcsJWcgIHN0ZXAgJWcsJWdcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwb2x5Z29uaXRlci0+eFN0YXJ0LCBwb2x5Z29uaXRlci0+eVN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgcG9seWdvbml0ZXItPnhTdGVwLCBwb2x5Z29uaXRlci0+eVN0ZXApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGwgPSAwOyBsIDwgcG9seWdvbml0ZXItPm51bVBvaW50czsgbCsrKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiICVnLCVnIiwgcG9seWdvbml0ZXItPnhbbF0sIHBvbHlnb25pdGVyLT55W2xdKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZnByaW50ZihmLCAiXG4iKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgbGVmaUdlb21WaWFFOgotICAgICAgICAgICAgZnByaW50ZihmLCAiVmlhIFxuIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGxlZmlHZW9tVmlhSXRlckU6Ci0gICAgICAgICAgICBmcHJpbnRmKGYsICJWaWEgaXRlciBcbiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBsZWZpR2VvbUNsYXNzRToKLSAgICAgICAgICAgIGZwcmludGYoZiwgIkNsYXNzdHlwZSAlc1xuIiwgKGNoYXIqKSBpdGVtc19baV0pOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGxlZmlFcnJvcigwLCAxMzc1LCAiRVJST1IgKExFRlBBUlMtMTM3NSk6IHVua25vd24gZ2VvbWV0cnkgdHlwZSIpOwotICAgICAgICAgICAgZnByaW50ZihmLCAiVW5rbm93biBnZW9tZXRyeSB0eXBlICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAoaW50KSAoaXRlbVR5cGUoaSkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gbGVmaVNwYWNpbmcKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLWxlZmlTcGFjaW5nOjpsZWZpU3BhY2luZygpCi17Ci0gICAgSW5pdCgpOwotfQotCi12b2lkCi1sZWZpU3BhY2luZzo6SW5pdCgpCi17Ci0gICAgbmFtZTFfID0gKGNoYXIqKSBsZWZNYWxsb2MoMTYpOwotICAgIG5hbWUyXyA9IChjaGFyKikgbGVmTWFsbG9jKDE2KTsKLSAgICBuYW1lMVNpemVfID0gMTY7Ci0gICAgbmFtZTJTaXplXyA9IDE2OwotICAgIGRpc3RhbmNlXyA9IDA7Ci0gICAgaGFzU3RhY2tfID0gMDsKLX0KLQotdm9pZAotbGVmaVNwYWNpbmc6OkRlc3Ryb3koKQotewotICAgIGlmIChuYW1lMV8pCi0gICAgICAgIGxlZkZyZWUobmFtZTFfKTsKLSAgICBpZiAobmFtZTJfKQotICAgICAgICBsZWZGcmVlKG5hbWUyXyk7Ci19Ci0KLWxlZmlTcGFjaW5nOjp+bGVmaVNwYWNpbmcoKQotewotICAgIERlc3Ryb3koKTsKLX0KLQotbGVmaVNwYWNpbmcgKgotbGVmaVNwYWNpbmc6OmNsb25lKCkKLXsKLSAgICBsZWZpU3BhY2luZyAqc3AgPSAobGVmaVNwYWNpbmcqKSBsZWZNYWxsb2Moc2l6ZW9mKGxlZmlTcGFjaW5nKSk7Ci0gICAgc3AtPm5hbWUxU2l6ZV8gPSBzdHJsZW4obmFtZTFfKSArIDE7Ci0gICAgc3AtPm5hbWUxXyA9IChjaGFyKikgbGVmTWFsbG9jKHNwLT5uYW1lMVNpemVfKTsKLSAgICBzdHJjcHkoc3AtPm5hbWUxXywgbmFtZTFfKTsKLSAgICBzcC0+bmFtZTJTaXplXyA9IHN0cmxlbihuYW1lMl8pICsgMTsKLSAgICBzcC0+bmFtZTJfID0gKGNoYXIqKSBsZWZNYWxsb2Moc3AtPm5hbWUyU2l6ZV8pOwotICAgIHN0cmNweShzcC0+bmFtZTJfLCBuYW1lMl8pOwotICAgIHNwLT5kaXN0YW5jZV8gPSBkaXN0YW5jZV87Ci0gICAgc3AtPmhhc1N0YWNrXyA9IGhhc1N0YWNrXzsKLSAgICByZXR1cm4gc3A7Ci19Ci0KLXZvaWQKLWxlZmlTcGFjaW5nOjpzZXQoY29uc3QgY2hhciAqbmFtZTEsCi0gICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUyLAotICAgICAgICAgICAgICAgICBkb3VibGUgICAgIGQsCi0gICAgICAgICAgICAgICAgIGludCAgICAgICAgaGFzU3RhY2spCi17Ci0gICAgaW50IGxlbiA9IHN0cmxlbihuYW1lMSkgKyAxOwotICAgIGlmIChsZW4gPiBuYW1lMVNpemVfKSB7Ci0gICAgICAgIGxlZkZyZWUobmFtZTFfKTsKLSAgICAgICAgbmFtZTFfID0gKGNoYXIqKSBsZWZNYWxsb2MobGVuKTsKLSAgICAgICAgbmFtZTFTaXplXyA9IGxlbjsKLSAgICB9Ci0gICAgbGVuID0gc3RybGVuKG5hbWUyKSArIDE7Ci0gICAgaWYgKGxlbiA+IG5hbWUyU2l6ZV8pIHsKLSAgICAgICAgbGVmRnJlZShuYW1lMl8pOwotICAgICAgICBuYW1lMl8gPSAoY2hhciopIGxlZk1hbGxvYyhsZW4pOwotICAgICAgICBuYW1lMlNpemVfID0gbGVuOwotICAgIH0KLSAgICBzdHJjcHkobmFtZTFfLCBDQVNFKG5hbWUxKSk7Ci0gICAgc3RyY3B5KG5hbWUyXywgQ0FTRShuYW1lMikpOwotICAgIGRpc3RhbmNlXyA9IGQ7Ci0gICAgaGFzU3RhY2tfID0gaGFzU3RhY2s7Ci19Ci0KLWNvbnN0IGNoYXIgKgotbGVmaVNwYWNpbmc6Om5hbWUxKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbmFtZTFfOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlTcGFjaW5nOjpuYW1lMigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG5hbWUyXzsKLX0KLQotZG91YmxlCi1sZWZpU3BhY2luZzo6ZGlzdGFuY2UoKSBjb25zdAotewotICAgIHJldHVybiBkaXN0YW5jZV87Ci19Ci0KLWludAotbGVmaVNwYWNpbmc6Omhhc1N0YWNrKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzU3RhY2tfOwotfQotdm9pZAotbGVmaVNwYWNpbmc6OnByaW50KEZJTEUgKmYpIGNvbnN0Ci17Ci0gICAgZnByaW50ZihmLCAiU1BBQ0lORyAlcyAlcyAlZyIsIG5hbWUxKCksCi0gICAgICAgICAgICBuYW1lMigpLCBkaXN0YW5jZSgpKTsKLQotICAgIGlmIChoYXNTdGFjaygpKQotICAgICAgICBmcHJpbnRmKGYsICIgIFNUQUNLIik7Ci0KLSAgICBmcHJpbnRmKGYsICJcbiIpOwotfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gbGVmaUlSRHJvcAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotbGVmaUlSRHJvcDo6bGVmaUlSRHJvcCgpCi17Ci0gICAgSW5pdCgpOwotfQotCi12b2lkCi1sZWZpSVJEcm9wOjpJbml0KCkKLXsKLSAgICBuYW1lU2l6ZV8gPSAxNjsKLSAgICB2YWx1ZTFTaXplXyA9IDE2OwotICAgIHZhbHVlMlNpemVfID0gMTY7Ci0gICAgbmFtZV8gPSAoY2hhciopIGxlZk1hbGxvYygxNik7Ci0gICAgbnVtVmFsdWVzXyA9IDA7Ci0gICAgdmFsdWVzQWxsb2NhdGVkXyA9IDI7Ci0gICAgdmFsdWUxXyA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiAyKTsKLSAgICB2YWx1ZTJfID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIDIpOwotfQotCi12b2lkCi1sZWZpSVJEcm9wOjpEZXN0cm95KCkKLXsKLSAgICBsZWZGcmVlKG5hbWVfKTsKLSAgICBjbGVhcigpOwotICAgIGxlZkZyZWUoKGNoYXIqKSAodmFsdWUxXykpOwotICAgIGxlZkZyZWUoKGNoYXIqKSAodmFsdWUyXykpOwotfQotCi1sZWZpSVJEcm9wOjp+bGVmaUlSRHJvcCgpCi17Ci0gICAgRGVzdHJveSgpOwotfQotCi12b2lkCi1sZWZpSVJEcm9wOjpjbGVhcigpCi17Ci0gICAgbnVtVmFsdWVzXyA9IDA7Ci19Ci0KLXZvaWQKLWxlZmlJUkRyb3A6OnNldFRhYmxlTmFtZShjb25zdCBjaGFyICpuYW1lKQotewotICAgIGludCBsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotICAgIGlmIChsZW4gPiBuYW1lU2l6ZV8pIHsKLSAgICAgICAgbGVmRnJlZShuYW1lXyk7Ci0gICAgICAgIG5hbWVfID0gKGNoYXIqKSBsZWZNYWxsb2MobGVuKTsKLSAgICAgICAgbmFtZVNpemVfID0gbGVuOwotICAgIH0KLSAgICBzdHJjcHkobmFtZV8sIENBU0UobmFtZSkpOwotICAgIGNsZWFyKCk7Ci0gICAgLyoKLSAgICAgICoodmFsdWUxXykgPSAnXDAnOwotICAgICAgKih2YWx1ZTJfKSA9ICdcMCc7Ci0gICAgKi8KLX0KLQotdm9pZAotbGVmaUlSRHJvcDo6c2V0VmFsdWVzKGRvdWJsZSAgICB2YWx1ZTEsCi0gICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgIHZhbHVlMikKLXsKLSAgICBpZiAobnVtVmFsdWVzXyA9PSB2YWx1ZXNBbGxvY2F0ZWRfKSB7Ci0gICAgICAgIGludCAgICAgaTsKLSAgICAgICAgZG91YmxlICAqdjE7Ci0gICAgICAgIGRvdWJsZSAgKnYyOwotICAgICAgICBpZiAodmFsdWVzQWxsb2NhdGVkXyA9PSAwKSB7Ci0gICAgICAgICAgICB2YWx1ZXNBbGxvY2F0ZWRfID0gMjsKLSAgICAgICAgICAgIHYxID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIHZhbHVlc0FsbG9jYXRlZF8pOwotICAgICAgICAgICAgdjIgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogdmFsdWVzQWxsb2NhdGVkXyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2YWx1ZXNBbGxvY2F0ZWRfICo9IDI7Ci0gICAgICAgICAgICB2MSA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiB2YWx1ZXNBbGxvY2F0ZWRfKTsKLSAgICAgICAgICAgIHYyID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIHZhbHVlc0FsbG9jYXRlZF8pOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVZhbHVlc187IGkrKykgewotICAgICAgICAgICAgICAgIHYxW2ldID0gdmFsdWUxX1tpXTsKLSAgICAgICAgICAgICAgICB2MltpXSA9IHZhbHVlMl9baV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKHZhbHVlMV8pKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAodmFsdWUyXykpOwotICAgICAgICB9Ci0gICAgICAgIHZhbHVlMV8gPSB2MTsKLSAgICAgICAgdmFsdWUyXyA9IHYyOwotICAgIH0KLSAgICB2YWx1ZTFfW251bVZhbHVlc19dID0gdmFsdWUxOwotICAgIHZhbHVlMl9bbnVtVmFsdWVzX10gPSB2YWx1ZTI7Ci0gICAgbnVtVmFsdWVzXyArPSAxOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlJUkRyb3A6Om5hbWUoKSBjb25zdAotewotICAgIHJldHVybiBuYW1lXzsKLX0KLQotaW50Ci1sZWZpSVJEcm9wOjpudW1WYWx1ZXMoKSBjb25zdAotewotICAgIHJldHVybiBudW1WYWx1ZXNfOwotfQotCi1kb3VibGUKLWxlZmlJUkRyb3A6OnZhbHVlMShpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVZhbHVlc18pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xMzc2KTogVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIElSRFJPUCBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bVZhbHVlc18pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTM3NiwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiB2YWx1ZTFfW2luZGV4XTsKLX0KLQotZG91YmxlCi1sZWZpSVJEcm9wOjp2YWx1ZTIoaW50IGluZGV4KSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1WYWx1ZXNfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTM3Nik6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBJUkRST1AgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGluZGV4LCBudW1WYWx1ZXNfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDEzNzYsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gdmFsdWUyX1tpbmRleF07Ci19Ci0KLXZvaWQKLWxlZmlJUkRyb3A6OnByaW50KEZJTEUgKmYpIGNvbnN0Ci17Ci0gICAgaW50IGk7Ci0gICAgZnByaW50ZihmLCAiSVJEUk9QICVzICIsIG5hbWUoKSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bVZhbHVlcygpOyBpKyspIHsKLSAgICAgICAgZnByaW50ZihmLCAiJWcgJWcgIiwgdmFsdWUxKGkpLAotICAgICAgICAgICAgICAgIHZhbHVlMihpKSk7Ci0gICAgfQotICAgIGZwcmludGYoZiwgIlxuIik7Ci0gICAgZnByaW50ZihmLCAiRU5EIElSRHJvcFxuIik7Ci19Ci0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBsZWZpdE1pbkZlYXR1cmUKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1sZWZpTWluRmVhdHVyZTo6bGVmaU1pbkZlYXR1cmUoKQotewotICAgIEluaXQoKTsKLX0KLQotdm9pZAotbGVmaU1pbkZlYXR1cmU6OkluaXQoKQotewotICAgIC8vIG5vdGhpbmcgdG8gZG8KLX0KLQotdm9pZAotbGVmaU1pbkZlYXR1cmU6OkRlc3Ryb3koKQotewotICAgIC8vIG5vdGhpbmcgdG8gZG8KLX0KLQotbGVmaU1pbkZlYXR1cmU6On5sZWZpTWluRmVhdHVyZSgpCi17Ci0gICAgRGVzdHJveSgpOwotfQotCi12b2lkCi1sZWZpTWluRmVhdHVyZTo6c2V0KGRvdWJsZSAgb25lLAotICAgICAgICAgICAgICAgICAgICBkb3VibGUgIHR3bykKLXsKLSAgICBvbmVfID0gb25lOwotICAgIHR3b18gPSB0d287Ci19Ci0KLWRvdWJsZQotbGVmaU1pbkZlYXR1cmU6Om9uZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG9uZV87Ci19Ci0KLWRvdWJsZQotbGVmaU1pbkZlYXR1cmU6OnR3bygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHR3b187Ci19Ci0KLXZvaWQKLWxlZmlNaW5GZWF0dXJlOjpwcmludChGSUxFICpmKSBjb25zdAotewotICAgIGZwcmludGYoZiwgIk1JTmZFQVRVUkUgJWcgJWdcbiIsIG9uZSgpLAotICAgICAgICAgICAgdHdvKCkpOwotfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gbGVmaVNpdGUKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLWxlZmlTaXRlOjpsZWZpU2l0ZSgpCi17Ci0gICAgSW5pdCgpOwotfQotCi12b2lkCi1sZWZpU2l0ZTo6SW5pdCgpCi17Ci0gICAgbmFtZVNpemVfID0gMTY7Ci0gICAgbmFtZV8gPSAoY2hhciopIGxlZk1hbGxvYygxNik7Ci0gICAgbnVtUm93UGF0dGVybl8gPSAwOwotICAgIHJvd1BhdHRlcm5BbGxvY2F0ZWRfID0gMDsKLSAgICBzaXRlTmFtZXNfID0gMDsKLSAgICBzaXRlT3JpZW50c18gPSAwOwotfQotCi12b2lkCi1sZWZpU2l0ZTo6RGVzdHJveSgpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBsZWZGcmVlKG5hbWVfKTsKLSAgICBpZiAobnVtUm93UGF0dGVybl8pIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVJvd1BhdHRlcm5fOyBpKyspCi0gICAgICAgICAgICBsZWZGcmVlKHNpdGVOYW1lc19baV0pOwotICAgICAgICBsZWZGcmVlKHNpdGVOYW1lc18pOwotICAgICAgICBsZWZGcmVlKHNpdGVPcmllbnRzXyk7Ci0gICAgICAgIG51bVJvd1BhdHRlcm5fID0gMDsKLSAgICB9Ci19Ci0KLWxlZmlTaXRlOjp+bGVmaVNpdGUoKQotewotICAgIERlc3Ryb3koKTsKLX0KLQotdm9pZAotbGVmaVNpdGU6OnNldE5hbWUoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBpbnQgaTsKLSAgICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLSAgICBpZiAobGVuID4gbmFtZVNpemVfKSB7Ci0gICAgICAgIGxlZkZyZWUobmFtZV8pOwotICAgICAgICBuYW1lXyA9IChjaGFyKikgbGVmTWFsbG9jKGxlbik7Ci0gICAgICAgIG5hbWVTaXplXyA9IGxlbjsKLSAgICB9Ci0gICAgc3RyY3B5KG5hbWVfLCBDQVNFKG5hbWUpKTsKLSAgICBoYXNDbGFzc18gPSAwOwotICAgICooc2l0ZUNsYXNzXykgPSAwOwotICAgIGhhc1NpemVfID0gMDsKLSAgICBzeW1tZXRyeV8gPSAwOwotICAgIGlmIChudW1Sb3dQYXR0ZXJuXykgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUm93UGF0dGVybl87IGkrKykKLSAgICAgICAgICAgIGxlZkZyZWUoc2l0ZU5hbWVzX1tpXSk7Ci0gICAgICAgIG51bVJvd1BhdHRlcm5fID0gMDsKLSAgICB9Ci19Ci0KLXZvaWQKLWxlZmlTaXRlOjpzZXRDbGFzcyhjb25zdCBjaGFyICpjbHMpCi17Ci0gICAgc3RyY3B5KHNpdGVDbGFzc18sIGNscyk7Ci0gICAgaGFzQ2xhc3NfID0gMTsKLX0KLQotdm9pZAotbGVmaVNpdGU6OnNldFNpemUoZG91YmxlICAgIHgsCi0gICAgICAgICAgICAgICAgICBkb3VibGUgICAgeSkKLXsKLSAgICBoYXNTaXplXyA9IDE7Ci0gICAgc2l6ZVhfID0geDsKLSAgICBzaXplWV8gPSB5OwotfQotCi12b2lkCi1sZWZpU2l0ZTo6c2V0WFN5bW1ldHJ5KCkKLXsKLSAgICBzeW1tZXRyeV8gfD0gMTsKLX0KLQotdm9pZAotbGVmaVNpdGU6OnNldFlTeW1tZXRyeSgpCi17Ci0gICAgc3ltbWV0cnlfIHw9IDI7Ci19Ci0KLXZvaWQKLWxlZmlTaXRlOjpzZXQ5MFN5bW1ldHJ5KCkKLXsKLSAgICBzeW1tZXRyeV8gfD0gNDsKLX0KLQotdm9pZAotbGVmaVNpdGU6OmFkZFJvd1BhdHRlcm4oY29uc3QgY2hhciAgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBvcmllbnQpCi17Ci0gICAgaWYgKG51bVJvd1BhdHRlcm5fID09IHJvd1BhdHRlcm5BbGxvY2F0ZWRfKSB7Ci0gICAgICAgIGludCAgICAgaTsKLSAgICAgICAgY2hhciAgICAqKnNuOwotICAgICAgICBpbnQgICAgICpzbzsKLQotICAgICAgICByb3dQYXR0ZXJuQWxsb2NhdGVkXyA9IChyb3dQYXR0ZXJuQWxsb2NhdGVkXyA9PSAwKSA/IDIgOgotICAgICAgICAgICAgcm93UGF0dGVybkFsbG9jYXRlZF8gKiAyOwotICAgICAgICBzbiA9IChjaGFyKiopIGxlZk1hbGxvYyhzaXplb2YoY2hhciopICogcm93UGF0dGVybkFsbG9jYXRlZF8pOwotICAgICAgICBzbyA9IChpbnQqKSBsZWZNYWxsb2Moc2l6ZW9mKGludCkgKiByb3dQYXR0ZXJuQWxsb2NhdGVkXyk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1Sb3dQYXR0ZXJuXzsgaSsrKSB7Ci0gICAgICAgICAgICBzbltpXSA9IHNpdGVOYW1lc19baV07Ci0gICAgICAgICAgICBzb1tpXSA9IHNpdGVPcmllbnRzX1tpXTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2l0ZU5hbWVzXykgewotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChzaXRlTmFtZXNfKSk7Ci0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKHNpdGVPcmllbnRzXykpOwotICAgICAgICB9Ci0gICAgICAgIHNpdGVOYW1lc18gPSBzbjsKLSAgICAgICAgc2l0ZU9yaWVudHNfID0gc287Ci0gICAgfQotICAgIHNpdGVOYW1lc19bbnVtUm93UGF0dGVybl9dID0gc3RyZHVwKG5hbWUpOwotICAgIHNpdGVPcmllbnRzX1tudW1Sb3dQYXR0ZXJuX10gPSBvcmllbnQ7Ci0gICAgbnVtUm93UGF0dGVybl8gKz0gMTsKLX0KLQotY29uc3QgY2hhciAqCi1sZWZpU2l0ZTo6bmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG5hbWVfOwotfQotCi1pbnQKLWxlZmlTaXRlOjpoYXNDbGFzcygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc0NsYXNzXzsKLX0KLQotY29uc3QgY2hhciAqCi1sZWZpU2l0ZTo6c2l0ZUNsYXNzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gc2l0ZUNsYXNzXzsKLX0KLQotZG91YmxlCi1sZWZpU2l0ZTo6c2l6ZVgoKSBjb25zdAotewotICAgIHJldHVybiBzaXplWF87Ci19Ci0KLWRvdWJsZQotbGVmaVNpdGU6OnNpemVZKCkgY29uc3QKLXsKLSAgICByZXR1cm4gc2l6ZVlfOwotfQotCi1pbnQKLWxlZmlTaXRlOjpoYXNTaXplKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzU2l6ZV87Ci19Ci0KLWludAotbGVmaVNpdGU6Omhhc1hTeW1tZXRyeSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIChzeW1tZXRyeV8gJiAxKSA/IDEgOiAwOwotfQotCi1pbnQKLWxlZmlTaXRlOjpoYXNZU3ltbWV0cnkoKSBjb25zdAotewotICAgIHJldHVybiAoc3ltbWV0cnlfICYgMikgPyAxIDogMDsKLX0KLQotaW50Ci1sZWZpU2l0ZTo6aGFzOTBTeW1tZXRyeSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIChzeW1tZXRyeV8gJiA0KSA/IDEgOiAwOwotfQotCi1pbnQKLWxlZmlTaXRlOjpoYXNSb3dQYXR0ZXJuKCkgY29uc3QKLXsKLSAgICByZXR1cm4gKG51bVJvd1BhdHRlcm5fKSA/IDEgOiAwOwotfQotCi1pbnQKLWxlZmlTaXRlOjpudW1TaXRlcygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIChudW1Sb3dQYXR0ZXJuXyk7Ci19Ci0KLWNoYXIgKgotbGVmaVNpdGU6OnNpdGVOYW1lKGludCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gKHNpdGVOYW1lc19baW5kZXhdKTsKLX0KLQotaW50Ci1sZWZpU2l0ZTo6c2l0ZU9yaWVudChpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIChzaXRlT3JpZW50c19baW5kZXhdKTsKLX0KLQotY2hhciAqCi1sZWZpU2l0ZTo6c2l0ZU9yaWVudFN0cihpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIChsZWZpT3JpZW50U3RyKHNpdGVPcmllbnRzX1tpbmRleF0pKTsKLX0KLQotdm9pZAotbGVmaVNpdGU6OnByaW50KEZJTEUgKmYpIGNvbnN0Ci17Ci0gICAgZnByaW50ZihmLCAiU0lURSAlcyIsIG5hbWUoKSk7Ci0KLSAgICBpZiAoaGFzQ2xhc3MoKSkKLSAgICAgICAgZnByaW50ZihmLCAiIENMQVNTICVzIiwgc2l0ZUNsYXNzKCkpOwotCi0gICAgaWYgKGhhc1NpemUoKSkKLSAgICAgICAgZnByaW50ZihmLCAiIFNJWkUgJWcgJWciLCBzaXplWCgpLAotICAgICAgICAgICAgICAgIHNpemVZKCkpOwotCi0gICAgaWYgKGhhc1hTeW1tZXRyeSgpKQotICAgICAgICBmcHJpbnRmKGYsICIgU1lNTUVUUlkgWCIpOwotCi0gICAgaWYgKGhhc1lTeW1tZXRyeSgpKQotICAgICAgICBmcHJpbnRmKGYsICIgU1lNTUVUUlkgWSIpOwotCi0gICAgaWYgKGhhczkwU3ltbWV0cnkoKSkKLSAgICAgICAgZnByaW50ZihmLCAiIFNZTU1FVFJZIFI5MCIpOwotCi0gICAgZnByaW50ZihmLCAiXG4iKTsKLX0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIGxlZmlTaXRlUGF0dGVybgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotbGVmaVNpdGVQYXR0ZXJuOjpsZWZpU2l0ZVBhdHRlcm4oKQotewotICAgIEluaXQoKTsKLX0KLQotdm9pZAotbGVmaVNpdGVQYXR0ZXJuOjpJbml0KCkKLXsKLSAgICBuYW1lU2l6ZV8gPSAxNjsKLSAgICBuYW1lXyA9IChjaGFyKikgbGVmTWFsbG9jKDE2KTsKLX0KLQotdm9pZAotbGVmaVNpdGVQYXR0ZXJuOjpEZXN0cm95KCkKLXsKLSAgICBsZWZGcmVlKG5hbWVfKTsKLX0KLQotbGVmaVNpdGVQYXR0ZXJuOjp+bGVmaVNpdGVQYXR0ZXJuKCkKLXsKLSAgICBEZXN0cm95KCk7Ci19Ci0KLXZvaWQKLWxlZmlTaXRlUGF0dGVybjo6c2V0KGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgIHgsCi0gICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgIHksCi0gICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIG9yaWVudCwKLSAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgeFN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICB5U3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgIHhTdGVwLAotICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICB5U3RlcCkKLXsKLSAgICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLSAgICBpZiAobGVuID4gbmFtZVNpemVfKSB7Ci0gICAgICAgIGxlZkZyZWUobmFtZV8pOwotICAgICAgICBuYW1lXyA9IChjaGFyKikgbGVmTWFsbG9jKGxlbik7Ci0gICAgICAgIG5hbWVTaXplXyA9IGxlbjsKLSAgICB9Ci0gICAgc3RyY3B5KG5hbWVfLCBDQVNFKG5hbWUpKTsKLQotICAgIHhfID0geDsKLSAgICB5XyA9IHk7Ci0gICAgeFN0ZXBfID0geFN0ZXA7Ci0gICAgeVN0ZXBfID0geVN0ZXA7Ci0gICAgeFN0YXJ0XyA9IHhTdGFydDsKLSAgICB5U3RhcnRfID0geVN0YXJ0OwotICAgIG9yaWVudF8gPSBvcmllbnQ7Ci19Ci0KLWNvbnN0IGNoYXIgKgotbGVmaVNpdGVQYXR0ZXJuOjpuYW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbmFtZV87Ci19Ci0KLWludAotbGVmaVNpdGVQYXR0ZXJuOjpvcmllbnQoKSBjb25zdAotewotICAgIHJldHVybiBvcmllbnRfOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlTaXRlUGF0dGVybjo6b3JpZW50U3RyKCkgY29uc3QKLXsKLSAgICByZXR1cm4gKGxlZmlPcmllbnRTdHIob3JpZW50XykpOwotfQotCi1kb3VibGUKLWxlZmlTaXRlUGF0dGVybjo6eCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHhfOwotfQotCi1kb3VibGUKLWxlZmlTaXRlUGF0dGVybjo6eSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHlfOwotfQotCi1pbnQKLWxlZmlTaXRlUGF0dGVybjo6aGFzU3RlcFBhdHRlcm4oKSBjb25zdAotewotICAgIGlmICh4U3RhcnRfID09IC0xICYmIHlTdGFydF8gPT0gLTEgJiYKLSAgICAgICAgeFN0ZXBfID09IC0xICYmIHlTdGVwXyA9PSAtMSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLWRvdWJsZQotbGVmaVNpdGVQYXR0ZXJuOjp4U3RhcnQoKSBjb25zdAotewotICAgIHJldHVybiB4U3RhcnRfOwotfQotCi1kb3VibGUKLWxlZmlTaXRlUGF0dGVybjo6eVN0YXJ0KCkgY29uc3QKLXsKLSAgICByZXR1cm4geVN0YXJ0XzsKLX0KLQotZG91YmxlCi1sZWZpU2l0ZVBhdHRlcm46OnhTdGVwKCkgY29uc3QKLXsKLSAgICByZXR1cm4geFN0ZXBfOwotfQotCi1kb3VibGUKLWxlZmlTaXRlUGF0dGVybjo6eVN0ZXAoKSBjb25zdAotewotICAgIHJldHVybiB5U3RlcF87Ci19Ci0KLXZvaWQKLWxlZmlTaXRlUGF0dGVybjo6cHJpbnQoRklMRSAqZikgY29uc3QKLXsKLSAgICBmcHJpbnRmKGYsICIgIFNJVEUgUGF0dGVybiAlcyAgJWcsJWcgJXNcbiIsCi0gICAgICAgICAgICBuYW1lKCksCi0gICAgICAgICAgICB4KCksCi0gICAgICAgICAgICB5KCksCi0gICAgICAgICAgICBvcmllbnRTdHIoKSk7Ci0gICAgZnByaW50ZihmLCAiICAgICVnLCVnIHN0ZXAgJWcsJWdcbiIsCi0gICAgICAgICAgICB4U3RhcnQoKSwKLSAgICAgICAgICAgIHlTdGFydCgpLAotICAgICAgICAgICAgeFN0ZXAoKSwKLSAgICAgICAgICAgIHlTdGVwKCkpOwotfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gbGVmaVRyYWNrUGF0dGVybgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotbGVmaVRyYWNrUGF0dGVybjo6bGVmaVRyYWNrUGF0dGVybigpCi17Ci0gICAgSW5pdCgpOwotfQotCi12b2lkCi1sZWZpVHJhY2tQYXR0ZXJuOjpJbml0KCkKLXsKLSAgICBuYW1lU2l6ZV8gPSAxNjsKLSAgICBuYW1lXyA9IChjaGFyKikgbGVmTWFsbG9jKDE2KTsKLSAgICBzdGFydF8gPSAwOwotICAgIG51bVRyYWNrc18gPSAwOwotICAgIHNwYWNlXyA9IDA7Ci0gICAgbnVtTGF5ZXJzXyA9IDA7Ci0gICAgbGF5ZXJBbGxvY2F0ZWRfID0gMjsKLSAgICBsYXllck5hbWVzXyA9IChjaGFyKiopIGxlZk1hbGxvYyhzaXplb2YoY2hhciopICogMik7Ci0gICAgY2xlYXIoKTsKLX0KLQotdm9pZAotbGVmaVRyYWNrUGF0dGVybjo6RGVzdHJveSgpCi17Ci0gICAgaWYgKG5hbWVfKQotICAgICAgICBsZWZGcmVlKG5hbWVfKTsKLSAgICBjbGVhcigpOwotICAgIG5hbWVfID0gMDsKLSAgICBzdGFydF8gPSAwOwotICAgIG51bVRyYWNrc18gPSAwOwotICAgIHNwYWNlXyA9IDA7Ci0gICAgbGVmRnJlZSgoY2hhciopIChsYXllck5hbWVzXykpOwotfQotCi12b2lkCi1sZWZpVHJhY2tQYXR0ZXJuOjpjbGVhcigpCi17Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bUxheWVyc187IGkrKykgewotICAgICAgICBsZWZGcmVlKGxheWVyTmFtZXNfW2ldKTsKLSAgICB9Ci19Ci0KLWxlZmlUcmFja1BhdHRlcm46On5sZWZpVHJhY2tQYXR0ZXJuKCkKLXsKLSAgICBEZXN0cm95KCk7Ci19Ci0KLXZvaWQKLWxlZmlUcmFja1BhdHRlcm46OnNldChjb25zdCBjaGFyICAgICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICAgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICBudW1UcmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgICBzcGFjZSkKLXsKLSAgICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLSAgICBpZiAobGVuID4gbmFtZVNpemVfKSB7Ci0gICAgICAgIGxlZkZyZWUobmFtZV8pOwotICAgICAgICBuYW1lXyA9IChjaGFyKikgbGVmTWFsbG9jKGxlbik7Ci0gICAgICAgIG5hbWVTaXplXyA9IGxlbjsKLSAgICB9Ci0gICAgc3RyY3B5KG5hbWVfLCBDQVNFKG5hbWUpKTsKLQotICAgIHN0YXJ0XyA9IHN0YXJ0OwotICAgIG51bVRyYWNrc18gPSBudW1UcmFja3M7Ci0gICAgc3BhY2VfID0gc3BhY2U7Ci19Ci0KLXZvaWQKLWxlZmlUcmFja1BhdHRlcm46OmFkZExheWVyKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgaW50IGxlbjsKLSAgICBpZiAobnVtTGF5ZXJzXyA9PSBsYXllckFsbG9jYXRlZF8pIHsKLSAgICAgICAgaW50ICAgICBpOwotICAgICAgICBjaGFyICAgICoqbm47Ci0KLSAgICAgICAgaWYgKGxheWVyQWxsb2NhdGVkXyA9PSAwKQotICAgICAgICAgICAgbGF5ZXJBbGxvY2F0ZWRfID0gMjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbGF5ZXJBbGxvY2F0ZWRfICo9IDI7Ci0gICAgICAgIG5uID0gKGNoYXIqKikgbGVmTWFsbG9jKHNpemVvZihjaGFyKikgKiBsYXllckFsbG9jYXRlZF8pOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTGF5ZXJzXzsgaSsrKQotICAgICAgICAgICAgbm5baV0gPSBsYXllck5hbWVzX1tpXTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChsYXllck5hbWVzXykpOwotICAgICAgICBsYXllck5hbWVzXyA9IG5uOwotICAgIH0KLSAgICBsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotICAgIGxheWVyTmFtZXNfW251bUxheWVyc19dID0gKGNoYXIqKSBsZWZNYWxsb2MobGVuKTsKLSAgICBzdHJjcHkobGF5ZXJOYW1lc19bbnVtTGF5ZXJzX10sIENBU0UobmFtZSkpOwotICAgIG51bUxheWVyc18gKz0gMTsKLX0KLQotY29uc3QgY2hhciAqCi1sZWZpVHJhY2tQYXR0ZXJuOjpuYW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbmFtZV87Ci19Ci0KLWRvdWJsZQotbGVmaVRyYWNrUGF0dGVybjo6c3RhcnQoKSBjb25zdAotewotICAgIHJldHVybiBzdGFydF87Ci19Ci0KLWludAotbGVmaVRyYWNrUGF0dGVybjo6bnVtVHJhY2tzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbnVtVHJhY2tzXzsKLX0KLQotZG91YmxlCi1sZWZpVHJhY2tQYXR0ZXJuOjpzcGFjZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHNwYWNlXzsKLX0KLQotaW50Ci1sZWZpVHJhY2tQYXR0ZXJuOjpudW1MYXllcnMoKSBjb25zdAotewotICAgIHJldHVybiBudW1MYXllcnNfOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlUcmFja1BhdHRlcm46OmxheWVyTmFtZShpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bUxheWVyc18pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xMzc3KTogVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIFRSQUNLIFBBVFRFUk4gIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQiLCBpbmRleCwgbnVtTGF5ZXJzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxMzc3LCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIGxheWVyTmFtZXNfW2luZGV4XTsKLX0KLQotdm9pZAotbGVmaVRyYWNrUGF0dGVybjo6cHJpbnQoRklMRSAqZikgY29uc3QKLXsKLSAgICBpbnQgaTsKLSAgICBmcHJpbnRmKGYsICIgIFRSQUNLIFBhdHRlcm4gJXMgICVnIERPICVkIFNURVAgJWdcbiIsCi0gICAgICAgICAgICBuYW1lKCksCi0gICAgICAgICAgICBzdGFydCgpLAotICAgICAgICAgICAgbnVtVHJhY2tzKCksCi0gICAgICAgICAgICBzcGFjZSgpKTsKLSAgICBpZiAobnVtTGF5ZXJzKCkgPiAwKSB7Ci0gICAgICAgIGZwcmludGYoZiwgIiAgICBMQVlFUiAiKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUxheWVycygpOyBpKyspCi0gICAgICAgICAgICBmcHJpbnRmKGYsICIlcyAiLCBsYXllck5hbWUoaSkpOwotICAgICAgICBmcHJpbnRmKGYsICJcbiIpOwotICAgIH0KLX0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIGxlZmlHY2VsbFBhdHRlcm4KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLWxlZmlHY2VsbFBhdHRlcm46OmxlZmlHY2VsbFBhdHRlcm4oKQotewotICAgIEluaXQoKTsKLX0KLQotdm9pZAotbGVmaUdjZWxsUGF0dGVybjo6SW5pdCgpCi17Ci0gICAgbmFtZVNpemVfID0gMTY7Ci0gICAgbmFtZV8gPSAoY2hhciopIGxlZk1hbGxvYygxNik7Ci0gICAgc3RhcnRfID0gMDsKLSAgICBudW1DUnNfID0gMDsKLSAgICBzcGFjZV8gPSAwOwotfQotCi12b2lkCi1sZWZpR2NlbGxQYXR0ZXJuOjpEZXN0cm95KCkKLXsKLSAgICBpZiAobmFtZV8pCi0gICAgICAgIGxlZkZyZWUobmFtZV8pOwotICAgIG5hbWVfID0gMDsKLSAgICBzdGFydF8gPSAwOwotICAgIG51bUNSc18gPSAwOwotICAgIHNwYWNlXyA9IDA7Ci19Ci0KLWxlZmlHY2VsbFBhdHRlcm46On5sZWZpR2NlbGxQYXR0ZXJuKCkKLXsKLSAgICBEZXN0cm95KCk7Ci19Ci0KLXZvaWQKLWxlZmlHY2VsbFBhdHRlcm46OnNldChjb25zdCBjaGFyICAgICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICAgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICBudW1DUnMsCi0gICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgICBzcGFjZSkKLXsKLSAgICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLSAgICBpZiAobGVuID4gbmFtZVNpemVfKSB7Ci0gICAgICAgIGxlZkZyZWUobmFtZV8pOwotICAgICAgICBuYW1lXyA9IChjaGFyKikgbGVmTWFsbG9jKGxlbik7Ci0gICAgICAgIG5hbWVTaXplXyA9IGxlbjsKLSAgICB9Ci0gICAgc3RyY3B5KG5hbWVfLCBDQVNFKG5hbWUpKTsKLQotICAgIHN0YXJ0XyA9IHN0YXJ0OwotICAgIG51bUNSc18gPSBudW1DUnM7Ci0gICAgc3BhY2VfID0gc3BhY2U7Ci19Ci0KLWNvbnN0IGNoYXIgKgotbGVmaUdjZWxsUGF0dGVybjo6bmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG5hbWVfOwotfQotCi1kb3VibGUKLWxlZmlHY2VsbFBhdHRlcm46OnN0YXJ0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gc3RhcnRfOwotfQotCi1pbnQKLWxlZmlHY2VsbFBhdHRlcm46Om51bUNScygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG51bUNSc187Ci19Ci0KLWRvdWJsZQotbGVmaUdjZWxsUGF0dGVybjo6c3BhY2UoKSBjb25zdAotewotICAgIHJldHVybiBzcGFjZV87Ci19Ci0KLXZvaWQKLWxlZmlHY2VsbFBhdHRlcm46OnByaW50KEZJTEUgKmYpIGNvbnN0Ci17Ci0gICAgZnByaW50ZihmLCAiICBUUkFDSyBQYXR0ZXJuICVzICAlZyBETyAlZCBTVEVQICVnXG4iLAotICAgICAgICAgICAgbmFtZSgpLAotICAgICAgICAgICAgc3RhcnQoKSwKLSAgICAgICAgICAgIG51bUNScygpLAotICAgICAgICAgICAgc3BhY2UoKSk7Ci19Ci0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBsZWZpVXNlTWluU3BhY2luZwotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotbGVmaVVzZU1pblNwYWNpbmc6OmxlZmlVc2VNaW5TcGFjaW5nKCkKLXsKLSAgICBJbml0KCk7Ci19Ci0KLXZvaWQKLWxlZmlVc2VNaW5TcGFjaW5nOjpJbml0KCkKLXsKLSAgICBuYW1lXyA9IDA7Ci0gICAgdmFsdWVfID0gMDsKLX0KLQotdm9pZAotbGVmaVVzZU1pblNwYWNpbmc6OkRlc3Ryb3koKQotewotICAgIGlmIChuYW1lXykKLSAgICAgICAgbGVmRnJlZShuYW1lXyk7Ci19Ci0KLWxlZmlVc2VNaW5TcGFjaW5nOjp+bGVmaVVzZU1pblNwYWNpbmcoKQotewotICAgIERlc3Ryb3koKTsKLX0KLQotdm9pZAotbGVmaVVzZU1pblNwYWNpbmc6OnNldChjb25zdCBjaGFyICAgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB2YWx1ZSkKLXsKLQotICAgIERlc3Ryb3koKTsgIC8vIGxlZkZyZWUgcHJldmlvdXMgbmFtZSwgaWYgdGhlcmUgaXMgYW55Ci0gICAgbmFtZV8gPSAoY2hhciopIGxlZk1hbGxvYyhzdHJsZW4obmFtZSkgKyAxKTsKLSAgICBzdHJjcHkobmFtZV8sIENBU0UobmFtZSkpOwotICAgIHZhbHVlXyA9IHZhbHVlOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlVc2VNaW5TcGFjaW5nOjpuYW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbmFtZV87Ci19Ci0KLWludAotbGVmaVVzZU1pblNwYWNpbmc6OnZhbHVlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gdmFsdWVfOwotfQotCi12b2lkCi1sZWZpVXNlTWluU3BhY2luZzo6cHJpbnQoRklMRSAqZikgY29uc3QKLXsKLSAgICBmcHJpbnRmKGYsICJVU0VNSU5TUEFDSU5HICVzICVkXG4iLAotICAgICAgICAgICAgbmFtZSgpLAotICAgICAgICAgICAgdmFsdWUoKSk7Ci19Ci0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBsZWZpTWF4U3RhY2tWaWEKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLWxlZmlNYXhTdGFja1ZpYTo6bGVmaU1heFN0YWNrVmlhKCkKLXsKLSAgICBib3R0b21MYXllcl8gPSAwOwotICAgIHRvcExheWVyXyA9IDA7Ci0gICAgSW5pdCgpOwotfQotCi12b2lkCi1sZWZpTWF4U3RhY2tWaWE6OkluaXQoKQotewotICAgIHZhbHVlXyA9IDA7Ci0gICAgaGFzUmFuZ2VfID0gMDsKLSAgICBpZiAoYm90dG9tTGF5ZXJfKSAgICAgICAgICAvLyBUaGlzIGlzIGZvciBDIHZlcnNpb24sIHNpbmNlIEMgd2lsbAotICAgICAgICBsZWZGcmVlKGJvdHRvbUxheWVyXyk7ICAvLyBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGNhbGxpbmcKLSAgICBpZiAodG9wTGF5ZXJfKSAgICAgICAgICAgICAvLyBzZXRNYXhTdGFja1ZpYVJhbmdlIHdoZW4gbW9yZSB0aGFuIDEgbGVmCi0gICAgICAgIGxlZkZyZWUodG9wTGF5ZXJfKTsgICAgIC8vIGZpbGVzIGFyZSBwYXJzZS4gQysrIHNraXBzIHRoaXMgZnVuY3Rpb24KLSAgICBib3R0b21MYXllcl8gPSAwOwotICAgIHRvcExheWVyXyA9IDA7Ci19Ci0KLXZvaWQKLWxlZmlNYXhTdGFja1ZpYTo6RGVzdHJveSgpCi17Ci0gICAgaWYgKGJvdHRvbUxheWVyXykKLSAgICAgICAgbGVmRnJlZShib3R0b21MYXllcl8pOwotICAgIGlmICh0b3BMYXllcl8pCi0gICAgICAgIGxlZkZyZWUodG9wTGF5ZXJfKTsKLSAgICBib3R0b21MYXllcl8gPSAwOwotICAgIHRvcExheWVyXyA9IDA7Ci0gICAgaGFzUmFuZ2VfID0gMDsKLSAgICB2YWx1ZV8gPSAwOwotfQotCi1sZWZpTWF4U3RhY2tWaWE6On5sZWZpTWF4U3RhY2tWaWEoKQotewotICAgIERlc3Ryb3koKTsKLX0KLQotdm9pZAotbGVmaU1heFN0YWNrVmlhOjpzZXRNYXhTdGFja1ZpYShpbnQgdmFsdWUpCi17Ci0gICAgdmFsdWVfID0gdmFsdWU7Ci19Ci0KLXZvaWQKLWxlZmlNYXhTdGFja1ZpYTo6c2V0TWF4U3RhY2tWaWFSYW5nZShjb25zdCBjaGFyICpib3R0b21MYXllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0b3BMYXllcikKLXsKLSAgICBoYXNSYW5nZV8gPSAxOwotICAgIGlmIChib3R0b21MYXllcl8pICAgICAgICAgIC8vIE1heSBiZSBsZWZyUmVzZXQgaXMgY2FsbGVkIGFuZCAKLSAgICAgICAgbGVmRnJlZShib3R0b21MYXllcl8pOyAgLy8gYm90dG9tTGF5ZXJfIGFuZC9vciB0b3BMYXllcl8gaGF2ZQotICAgIGlmICh0b3BMYXllcl8pICAgICAgICAgICAgIC8vIHZhbHVlIG1hbGxvYyBvbiB0aGVtCi0gICAgICAgIGxlZkZyZWUodG9wTGF5ZXJfKTsKLSAgICBib3R0b21MYXllcl8gPSAoY2hhciopIGxlZk1hbGxvYyhzdHJsZW4oYm90dG9tTGF5ZXIpICsgMSk7Ci0gICAgc3RyY3B5KGJvdHRvbUxheWVyXywgQ0FTRShib3R0b21MYXllcikpOwotICAgIHRvcExheWVyXyA9IChjaGFyKikgbGVmTWFsbG9jKHN0cmxlbih0b3BMYXllcikgKyAxKTsKLSAgICBzdHJjcHkodG9wTGF5ZXJfLCBDQVNFKHRvcExheWVyKSk7Ci0gICAgLy9ib3R0b21MYXllcl8gPSBzdHJkdXAoYm90dG9tTGF5ZXIpOwotICAgIC8vdG9wTGF5ZXJfICAgID0gc3RyZHVwKHRvcExheWVyKTsKLX0KLQotaW50Ci1sZWZpTWF4U3RhY2tWaWE6Om1heFN0YWNrVmlhKCkgY29uc3QKLXsKLSAgICByZXR1cm4gdmFsdWVfOwotfQotCi1pbnQKLWxlZmlNYXhTdGFja1ZpYTo6aGFzTWF4U3RhY2tWaWFSYW5nZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc1JhbmdlXyA/IDEgOiAwOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlNYXhTdGFja1ZpYTo6bWF4U3RhY2tWaWFCb3R0b21MYXllcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGJvdHRvbUxheWVyXzsKLX0KLQotY29uc3QgY2hhciAqCi1sZWZpTWF4U3RhY2tWaWE6Om1heFN0YWNrVmlhVG9wTGF5ZXIoKSBjb25zdAotewotICAgIHJldHVybiB0b3BMYXllcl87Ci19Ci0KLXZvaWQKLWxlZmlNYXhTdGFja1ZpYTo6cHJpbnQoRklMRSAqZikgY29uc3QKLXsKLSAgICBmcHJpbnRmKGYsICJNQVhWSUFTVEFDSyAlZCIsIG1heFN0YWNrVmlhKCkpOwotICAgIGlmIChoYXNNYXhTdGFja1ZpYVJhbmdlKCkpCi0gICAgICAgIGZwcmludGYoZiwgIiBSQU5HRSAlcyAlcyIsIG1heFN0YWNrVmlhQm90dG9tTGF5ZXIoKSwKLSAgICAgICAgICAgICAgICBtYXhTdGFja1ZpYVRvcExheWVyKCkpOwotICAgIGZwcmludGYoZiwgIlxuIik7Ci19Ci1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZpTWlzYy5ocHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlNaXNjLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRkMWQ2OS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlNaXNjLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ5MyArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyIC0gMjAxNCwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpZm5kZWYgbGVmaU1pc2NfaAotI2RlZmluZSBsZWZpTWlzY19oCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImxlZmlLUkRlZnMuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0vLyBUaGUgZGlmZmVyZW50IHR5cGVzIG9mIGl0ZW1zIGluIGEgZ2VvbWV0cnkgbGlzdC4KLQotc3RydWN0IGxlZmlHZW9tUmVjdCB7Ci0gICAgICBkb3VibGUgeGw7Ci0gICAgICBkb3VibGUgeWw7Ci0gICAgICBkb3VibGUgeGg7Ci0gICAgICBkb3VibGUgeWg7Ci0gICAgICBpbnQgICAgY29sb3JNYXNrOwotfTsKLQotc3RydWN0IGxlZmlHZW9tUmVjdEl0ZXIgewotICBkb3VibGUgeGw7Ci0gIGRvdWJsZSB5bDsKLSAgZG91YmxlIHhoOwotICBkb3VibGUgeWg7Ci0gIGRvdWJsZSB4U3RhcnQ7Ci0gIGRvdWJsZSB5U3RhcnQ7Ci0gIGRvdWJsZSB4U3RlcDsKLSAgZG91YmxlIHlTdGVwOwotICBpbnQgICAgY29sb3JNYXNrOwotfTsKLQotc3RydWN0IGxlZmlHZW9tUGF0aCB7Ci0gIGludCAgICAgbnVtUG9pbnRzOwotICBkb3VibGUqIHg7Ci0gIGRvdWJsZSogeTsKLSAgaW50ICAgICBjb2xvck1hc2s7Ci19OwotCi1zdHJ1Y3QgbGVmaUdlb21QYXRoSXRlciB7Ci0gIGludCAgICAgbnVtUG9pbnRzOwotICBkb3VibGUqIHg7Ci0gIGRvdWJsZSogeTsKLSAgZG91YmxlIHhTdGFydDsKLSAgZG91YmxlIHlTdGFydDsKLSAgZG91YmxlIHhTdGVwOwotICBkb3VibGUgeVN0ZXA7Ci0gIGludCAgICBjb2xvck1hc2s7Ci19OwotCi1zdHJ1Y3QgbGVmaUdlb21Qb2x5Z29uIHsKLSAgaW50ICAgICBudW1Qb2ludHM7Ci0gIGRvdWJsZSogeDsKLSAgZG91YmxlKiB5OwotICBpbnQgICAgIGNvbG9yTWFzazsKLX07Ci0KLXN0cnVjdCBsZWZpR2VvbVBvbHlnb25JdGVyIHsKLSAgaW50IG51bVBvaW50czsKLSAgZG91YmxlKiB4OwotICBkb3VibGUqIHk7Ci0gIGRvdWJsZSB4U3RhcnQ7Ci0gIGRvdWJsZSB5U3RhcnQ7Ci0gIGRvdWJsZSB4U3RlcDsKLSAgZG91YmxlIHlTdGVwOwotICBpbnQgICAgY29sb3JNYXNrOwotfTsKLQotZW51bSBsZWZpR2VvbUVudW0gewotICBsZWZpR2VvbVVua25vd24gPSAwLAotICBsZWZpR2VvbUxheWVyRSwKLSAgbGVmaUdlb21MYXllckV4Y2VwdFBnTmV0RSwKLSAgbGVmaUdlb21MYXllck1pblNwYWNpbmdFLAotICBsZWZpR2VvbUxheWVyUnVsZVdpZHRoRSwKLSAgbGVmaUdlb21XaWR0aEUsCi0gIGxlZmlHZW9tUGF0aEUsCi0gIGxlZmlHZW9tUGF0aEl0ZXJFLAotICBsZWZpR2VvbVJlY3RFLAotICBsZWZpR2VvbVJlY3RJdGVyRSwKLSAgbGVmaUdlb21Qb2x5Z29uRSwKLSAgbGVmaUdlb21Qb2x5Z29uSXRlckUsCi0gIGxlZmlHZW9tVmlhRSwKLSAgbGVmaUdlb21WaWFJdGVyRSwKLSAgbGVmaUdlb21DbGFzc0UsCi0gIGxlZmlHZW9tRW5kCi19OwotCi1zdHJ1Y3QgbGVmaUdlb21WaWEgewotICBjaGFyKiAgbmFtZTsKLSAgZG91YmxlIHg7Ci0gIGRvdWJsZSB5OwotICBpbnQgICAgdG9wTWFza051bTsKLSAgaW50ICAgIGN1dE1hc2tOdW07Ci0gIGludCAgICBib3R0b21NYXNrTnVtOwotfTsKLQotc3RydWN0IGxlZmlHZW9tVmlhSXRlciB7Ci0gIGNoYXIqICBuYW1lOwotICBkb3VibGUgeDsKLSAgZG91YmxlIHk7Ci0gIGRvdWJsZSB4U3RhcnQ7Ci0gIGRvdWJsZSB5U3RhcnQ7Ci0gIGRvdWJsZSB4U3RlcDsKLSAgZG91YmxlIHlTdGVwOwotICBpbnQgICAgdG9wTWFza051bTsKLSAgaW50ICAgIGN1dE1hc2tOdW07Ci0gIGludCAgICBib3R0b21NYXNrTnVtOwotfTsKLQotY2xhc3MgbGVmaUdlb21ldHJpZXMgewotcHVibGljOgotICBsZWZpR2VvbWV0cmllcygpOwotICB2b2lkIEluaXQoKTsKLQotICB2b2lkIERlc3Ryb3koKTsKLSAgfmxlZmlHZW9tZXRyaWVzKCk7Ci0KLSAgdm9pZCBjbGVhcigpOwotICB2b2lkIGNsZWFyUG9seUl0ZW1zKCk7Ci0gIHZvaWQgYWRkKHZvaWQqIHYsIGxlZmlHZW9tRW51bSBlKTsKLSAgdm9pZCBhZGRMYXllcihjb25zdCBjaGFyKiBuYW1lKTsKLSAgdm9pZCBhZGRMYXllckV4Y2VwdFBnTmV0KCk7ICAgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIHZvaWQgYWRkTGF5ZXJNaW5TcGFjaW5nKGRvdWJsZSBzcGFjaW5nKTsKLSAgdm9pZCBhZGRMYXllclJ1bGVXaWR0aChkb3VibGUgd2lkdGgpOwotICB2b2lkIGFkZENsYXNzKGNvbnN0IGNoYXIqIG5hbWUpOwotICB2b2lkIGFkZFdpZHRoKGRvdWJsZSB3KTsKLSAgdm9pZCBhZGRQYXRoKGludCBjb2xvck1hc2spOwotICB2b2lkIGFkZFBhdGhJdGVyKGludCBjb2xvck1hc2spOwotLyogIHBjciA0ODE3ODMgJiA1NjA1MDQKLSovCi0gIHZvaWQgYWRkUmVjdChpbnQgY29sb3JNYXNrLCBkb3VibGUgeGwsIGRvdWJsZSB5bCwgZG91YmxlIHhoLCBkb3VibGUgeWgpOwotICB2b2lkIGFkZFJlY3RJdGVyKGludCBjb2xvck1hc2ssIGRvdWJsZSB4bCwgZG91YmxlIHlsLCBkb3VibGUgeGgsIGRvdWJsZSB5aCk7Ci0gIHZvaWQgYWRkUG9seWdvbihpbnQgY29sb3JNYXNrID0gMCk7Ci0gIHZvaWQgYWRkUG9seWdvbkl0ZXIoaW50IGNvbG9yTWFzayk7Ci0gIHZvaWQgYWRkVmlhKGludCB2aWFNYXNrcywKLSAgICAgICAgICAgICAgZG91YmxlIHgsIGRvdWJsZSB5LCBjb25zdCBjaGFyKiBuYW1lKTsKLSAgdm9pZCBhZGRWaWFJdGVyKGludCB2aWFNYXNrcywKLSAgICAgICAgICAgICAgICAgIGRvdWJsZSB4LCBkb3VibGUgeSwgY29uc3QgY2hhciogbmFtZSk7Ci0gIHZvaWQgYWRkU3RlcFBhdHRlcm4oZG91YmxlIHhTdGFydCwgZG91YmxlIHlTdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeFN0ZXAsIGRvdWJsZSB5U3RlcCk7Ci0gIHZvaWQgc3RhcnRMaXN0KGRvdWJsZSB4LCBkb3VibGUgeSk7Ci0gIHZvaWQgYWRkVG9MaXN0KGRvdWJsZSB4LCBkb3VibGUgeSk7Ci0KLSAgaW50IG51bUl0ZW1zKCkgY29uc3Q7Ci0gIGxlZmlHZW9tRW51bSBpdGVtVHlwZShpbnQgaW5kZXgpIGNvbnN0OwotICBsZWZpR2VvbVJlY3QqIGdldFJlY3QoaW50IGluZGV4KSBjb25zdDsKLSAgbGVmaUdlb21SZWN0SXRlciogZ2V0UmVjdEl0ZXIoaW50IGluZGV4KSBjb25zdDsKLSAgbGVmaUdlb21QYXRoKiBnZXRQYXRoKGludCBpbmRleCkgY29uc3Q7Ci0gIGxlZmlHZW9tUGF0aEl0ZXIqIGdldFBhdGhJdGVyKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCAgICBoYXNMYXllckV4Y2VwdFBnTmV0KGludCBpbmRleCkgY29uc3QgOyAgICAgLy8gNS43Ci0gIGNoYXIqICBnZXRMYXllcihpbnQgaW5kZXgpIGNvbnN0OwotICBkb3VibGUgZ2V0TGF5ZXJNaW5TcGFjaW5nKGludCBpbmRleCkgY29uc3Q7Ci0gIGRvdWJsZSBnZXRMYXllclJ1bGVXaWR0aChpbnQgaW5kZXgpIGNvbnN0OwotICBkb3VibGUgZ2V0V2lkdGgoaW50IGluZGV4KSBjb25zdDsKLSAgbGVmaUdlb21Qb2x5Z29uKiBnZXRQb2x5Z29uKGludCBpbmRleCkgY29uc3Q7Ci0gIGxlZmlHZW9tUG9seWdvbkl0ZXIqIGdldFBvbHlnb25JdGVyKGludCBpbmRleCkgY29uc3Q7Ci0gIGNoYXIqICBnZXRDbGFzcyhpbnQgaW5kZXgpIGNvbnN0OwotICBsZWZpR2VvbVZpYSogZ2V0VmlhKGludCBpbmRleCkgY29uc3Q7Ci0gIGxlZmlHZW9tVmlhSXRlciogZ2V0VmlhSXRlcihpbnQgaW5kZXgpIGNvbnN0OwotCi0gIHZvaWQgcHJpbnQoRklMRSogZikgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLQotICBpbnQgbnVtSXRlbXNfOwotICBpbnQgaXRlbXNBbGxvY2F0ZWRfOwotICBsZWZpR2VvbUVudW0qIGl0ZW1UeXBlXzsKLSAgdm9pZCoqIGl0ZW1zXzsKLQotICBpbnQgbnVtUG9pbnRzXzsKLSAgaW50IHBvaW50c0FsbG9jYXRlZF87Ci0gIGRvdWJsZSogeF87Ci0gIGRvdWJsZSogeV87Ci0KLSAgZG91YmxlIHhTdGFydF87Ci0gIGRvdWJsZSB5U3RhcnRfOwotICBkb3VibGUgeFN0ZXBfOwotICBkb3VibGUgeVN0ZXBfOwotfTsKLQotY2xhc3MgbGVmaVNwYWNpbmcgewotcHVibGljOgotICBsZWZpU3BhY2luZygpOwotICB2b2lkIEluaXQoKTsKLQotICB2b2lkIERlc3Ryb3koKTsKLSAgfmxlZmlTcGFjaW5nKCk7Ci0KLSAgbGVmaVNwYWNpbmcqIGNsb25lKCk7Ci0KLSAgdm9pZCBzZXQoY29uc3QgY2hhciogbmFtZTEsIGNvbnN0IGNoYXIqIG5hbWUyLCBkb3VibGUgbnVtLCBpbnQgaGFzU3RhY2spOwotCi0gIGludCBoYXNTdGFjaygpIGNvbnN0OwotCi0gIGNvbnN0IGNoYXIqIG5hbWUxKCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIG5hbWUyKCkgY29uc3Q7Ci0gIGRvdWJsZSBkaXN0YW5jZSgpIGNvbnN0OwotCi0gIC8vIERlYnVnIHByaW50Ci0gIHZvaWQgcHJpbnQoRklMRSogZikgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgaW50ICAgIG5hbWUxU2l6ZV87Ci0gIGludCAgICBuYW1lMlNpemVfOwotICBjaGFyKiAgbmFtZTFfOwotICBjaGFyKiAgbmFtZTJfOwotICBkb3VibGUgZGlzdGFuY2VfOwotICBpbnQgICAgaGFzU3RhY2tfOwotfTsKLQotY2xhc3MgbGVmaUlSRHJvcCB7Ci1wdWJsaWM6Ci0gIGxlZmlJUkRyb3AoKTsKLSAgdm9pZCBJbml0KCk7Ci0KLSAgdm9pZCBEZXN0cm95KCk7Ci0gIH5sZWZpSVJEcm9wKCk7Ci0KLSAgdm9pZCBjbGVhcigpOwotICB2b2lkIHNldFRhYmxlTmFtZShjb25zdCBjaGFyKiBuYW1lKTsKLSAgdm9pZCBzZXRWYWx1ZXMoZG91YmxlIG5hbWUxLCBkb3VibGUgbmFtZTIpOwotCi0gIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdDsKLSAgZG91YmxlIHZhbHVlMShpbnQgaW5kZXgpIGNvbnN0OwotICBkb3VibGUgdmFsdWUyKGludCBpbmRleCkgY29uc3Q7Ci0KLSAgaW50IG51bVZhbHVlcygpIGNvbnN0OwotCi0gIC8vIERlYnVnIHByaW50Ci0gIHZvaWQgcHJpbnQoRklMRSogZikgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgaW50ICAgICBuYW1lU2l6ZV87Ci0gIGludCAgICAgdmFsdWUxU2l6ZV87Ci0gIGludCAgICAgdmFsdWUyU2l6ZV87Ci0gIGludCAgICAgbnVtVmFsdWVzXzsKLSAgaW50ICAgICB2YWx1ZXNBbGxvY2F0ZWRfOwotICBjaGFyKiAgIG5hbWVfOwotICBkb3VibGUqIHZhbHVlMV87Ci0gIGRvdWJsZSogdmFsdWUyXzsKLX07Ci0KLWNsYXNzIGxlZmlNaW5GZWF0dXJlIHsKLXB1YmxpYzoKLSAgbGVmaU1pbkZlYXR1cmUoKTsKLSAgdm9pZCBJbml0KCk7Ci0KLSAgdm9pZCBEZXN0cm95KCk7Ci0gIH5sZWZpTWluRmVhdHVyZSgpOwotCi0gIHZvaWQgc2V0KGRvdWJsZSBvbmUsIGRvdWJsZSB0d28pOwotCi0gIGRvdWJsZSBvbmUoKSBjb25zdDsKLSAgZG91YmxlIHR3bygpIGNvbnN0OwotCi0gIC8vIERlYnVnIHByaW50Ci0gIHZvaWQgcHJpbnQoRklMRSogZikgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgZG91YmxlIG9uZV87Ci0gIGRvdWJsZSB0d29fOwotfTsKLQotY2xhc3MgbGVmaVNpdGUgewotcHVibGljOgotICBsZWZpU2l0ZSgpOwotICB2b2lkIEluaXQoKTsKLQotICB2b2lkIERlc3Ryb3koKTsKLSAgfmxlZmlTaXRlKCk7Ci0KLSAgdm9pZCBzZXROYW1lKGNvbnN0IGNoYXIqIG5hbWUpOwotICB2b2lkIHNldENsYXNzKGNvbnN0IGNoYXIqIGNscyk7Ci0gIHZvaWQgc2V0U2l6ZShkb3VibGUgeCwgZG91YmxlIHkpOwotICB2b2lkIHNldFhTeW1tZXRyeSgpOwotICB2b2lkIHNldFlTeW1tZXRyeSgpOwotICB2b2lkIHNldDkwU3ltbWV0cnkoKTsKLSAgdm9pZCBhZGRSb3dQYXR0ZXJuKGNvbnN0IGNoYXIqIG5hbWUsIGludCBvcmllbnQpOwotCi0gIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdDsKLSAgaW50IGhhc0NsYXNzKCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIHNpdGVDbGFzcygpIGNvbnN0OwotICBkb3VibGUgc2l6ZVgoKSBjb25zdDsKLSAgZG91YmxlIHNpemVZKCkgY29uc3Q7Ci0gIGludCBoYXNTaXplKCkgY29uc3Q7Ci0gIGludCBoYXNYU3ltbWV0cnkoKSBjb25zdDsKLSAgaW50IGhhc1lTeW1tZXRyeSgpIGNvbnN0OwotICBpbnQgaGFzOTBTeW1tZXRyeSgpIGNvbnN0OwotICBpbnQgaGFzUm93UGF0dGVybigpIGNvbnN0OyAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIGludCBudW1TaXRlcygpIGNvbnN0OyAgICAgICAgICAgICAgICAgICAgICAvLyA1LjYKLSAgY2hhciogc2l0ZU5hbWUoaW50IGluZGV4KSBjb25zdDsgICAgICAgICAgIC8vIDUuNgotICBpbnQgICBzaXRlT3JpZW50KGludCBpbmRleCkgY29uc3Q7ICAgICAgICAgLy8gNS42Ci0gIGNoYXIqIHNpdGVPcmllbnRTdHIoaW50IGluZGV4KSBjb25zdDsgICAgICAvLyA1LjYKLQotICAvLyBEZWJ1ZyBwcmludAotICB2b2lkIHByaW50KEZJTEUqIGYpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gIGludCAgICBuYW1lU2l6ZV87Ci0gIGNoYXIqICBuYW1lXzsKLSAgaW50ICAgIGhhc0NsYXNzXzsKLSAgY2hhciAgIHNpdGVDbGFzc19bOF07Ci0gIGRvdWJsZSBzaXplWF87Ci0gIGRvdWJsZSBzaXplWV87Ci0gIGludCAgICBoYXNTaXplXzsKLSAgaW50ICAgIHN5bW1ldHJ5XzsgICAvLyBiaXQgMC14ICAgYml0IDEteSAgIGJpdCAyLTkwCi0KLSAgaW50ICAgIG51bVJvd1BhdHRlcm5fOyAgICAgICAgIC8vIDUuNiBST1dQQVRURVJOCi0gIGludCAgICByb3dQYXR0ZXJuQWxsb2NhdGVkXzsKLSAgY2hhcioqIHNpdGVOYW1lc187Ci0gIGludCogICBzaXRlT3JpZW50c187Ci19OwotCi1jbGFzcyBsZWZpU2l0ZVBhdHRlcm4gewotcHVibGljOgotICBsZWZpU2l0ZVBhdHRlcm4oKTsKLSAgdm9pZCBJbml0KCk7Ci0KLSAgdm9pZCBEZXN0cm95KCk7Ci0gIH5sZWZpU2l0ZVBhdHRlcm4oKTsKLQotICB2b2lkIHNldChjb25zdCBjaGFyKiBuYW1lLCBkb3VibGUgeCwgZG91YmxlIHksIGludCBvcmllbnQsCi0gICAgICAgZG91YmxlIHhTdGFydCwgZG91YmxlIHlTdGFydCwgZG91YmxlIHhTdGVwLCBkb3VibGUgeVN0ZXApOwotCi0gIGNvbnN0ICBjaGFyKiBuYW1lKCkgY29uc3Q7Ci0gIGludCAgICBvcmllbnQoKSBjb25zdDsKLSAgY29uc3QgIGNoYXIqIG9yaWVudFN0cigpIGNvbnN0OwotICBkb3VibGUgeCgpIGNvbnN0OwotICBkb3VibGUgeSgpIGNvbnN0OwotICBpbnQgICAgaGFzU3RlcFBhdHRlcm4oKSBjb25zdDsgICAgLy8gNS42Ci0gIGRvdWJsZSB4U3RhcnQoKSBjb25zdDsKLSAgZG91YmxlIHlTdGFydCgpIGNvbnN0OwotICBkb3VibGUgeFN0ZXAoKSBjb25zdDsKLSAgZG91YmxlIHlTdGVwKCkgY29uc3Q7Ci0KLSAgLy8gRGVidWcgcHJpbnQKLSAgdm9pZCBwcmludChGSUxFKiBmKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICBpbnQgICAgbmFtZVNpemVfOwotICBjaGFyKiAgbmFtZV87Ci0gIGludCAgICBvcmllbnRfOwotICBkb3VibGUgeF87Ci0gIGRvdWJsZSB5XzsKLSAgZG91YmxlIHhTdGFydF87Ci0gIGRvdWJsZSB5U3RhcnRfOwotICBkb3VibGUgeFN0ZXBfOwotICBkb3VibGUgeVN0ZXBfOwotfTsKLQotY2xhc3MgbGVmaVRyYWNrUGF0dGVybiB7Ci1wdWJsaWM6Ci0gIGxlZmlUcmFja1BhdHRlcm4oKTsKLSAgdm9pZCBJbml0KCk7Ci0KLSAgdm9pZCBEZXN0cm95KCk7Ci0gIH5sZWZpVHJhY2tQYXR0ZXJuKCk7Ci0KLSAgdm9pZCBjbGVhcigpOwotICB2b2lkIHNldChjb25zdCBjaGFyKiBuYW1lLCBkb3VibGUgc3RhcnQsIGludCBudW1UcmFja3MsIGRvdWJsZSBzcGFjZSk7Ci0gIHZvaWQgYWRkTGF5ZXIoY29uc3QgY2hhciogbmFtZSk7Ci0KLSAgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0OwotICBkb3VibGUgc3RhcnQoKSBjb25zdDsKLSAgaW50IG51bVRyYWNrcygpIGNvbnN0OwotICBkb3VibGUgc3BhY2UoKSBjb25zdDsKLQotICBpbnQgbnVtTGF5ZXJzKCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIGxheWVyTmFtZShpbnQgaW5kZXgpIGNvbnN0OwotCi0gIC8vIERlYnVnIHByaW50Ci0gIHZvaWQgcHJpbnQoRklMRSogZikgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgaW50ICAgIG5hbWVTaXplXzsKLSAgY2hhciogIG5hbWVfOwotICBkb3VibGUgc3RhcnRfOwotICBpbnQgICAgbnVtVHJhY2tzXzsKLSAgZG91YmxlIHNwYWNlXzsKLQotICBpbnQgICAgbnVtTGF5ZXJzXzsKLSAgaW50ICAgIGxheWVyQWxsb2NhdGVkXzsKLSAgY2hhcioqIGxheWVyTmFtZXNfOwotfTsKLQotY2xhc3MgbGVmaUdjZWxsUGF0dGVybiB7Ci1wdWJsaWM6Ci0gIGxlZmlHY2VsbFBhdHRlcm4oKTsKLSAgdm9pZCBJbml0KCk7Ci0KLSAgdm9pZCBEZXN0cm95KCk7Ci0gIH5sZWZpR2NlbGxQYXR0ZXJuKCk7Ci0KLSAgdm9pZCBzZXQoY29uc3QgY2hhciogbmFtZSwgZG91YmxlIHN0YXJ0LCBpbnQgbnVtQ1JzLCBkb3VibGUgc3BhY2UpOwotCi0gIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdDsKLSAgZG91YmxlIHN0YXJ0KCkgY29uc3Q7Ci0gIGludCBudW1DUnMoKSBjb25zdDsKLSAgZG91YmxlIHNwYWNlKCkgY29uc3Q7Ci0KLSAgLy8gRGVidWcgcHJpbnQKLSAgdm9pZCBwcmludChGSUxFKiBmKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICBpbnQgICAgbmFtZVNpemVfOwotICBjaGFyKiAgbmFtZV87Ci0gIGRvdWJsZSBzdGFydF87Ci0gIGludCAgICBudW1DUnNfOwotICBkb3VibGUgc3BhY2VfOwotfTsKLQotY2xhc3MgbGVmaVVzZU1pblNwYWNpbmcgewotcHVibGljOgotICBsZWZpVXNlTWluU3BhY2luZygpOwotICB2b2lkIEluaXQoKTsKLQotICB2b2lkIERlc3Ryb3koKTsKLSAgfmxlZmlVc2VNaW5TcGFjaW5nKCk7Ci0KLSAgdm9pZCBzZXQoY29uc3QgY2hhciogbmFtZSwgaW50IHZhbHVlKTsKLQotICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3Q7Ci0gIGludCAgIHZhbHVlKCkgY29uc3Q7Ci0KLSAgLy8gRGVidWcgcHJpbnQKLSAgdm9pZCBwcmludChGSUxFKiBmKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICBjaGFyKiBuYW1lXzsKLSAgaW50ICAgdmFsdWVfOwotfTsKLQotLy8gNS41IGZvciBNYXhpbXVtIFN0YWNrZWQtdmlhIHJ1bGUKLWNsYXNzIGxlZmlNYXhTdGFja1ZpYSB7Ci1wdWJsaWM6Ci0gIGxlZmlNYXhTdGFja1ZpYSgpOwotICB2b2lkIEluaXQoKTsKLQotICB2b2lkIERlc3Ryb3koKTsKLSAgfmxlZmlNYXhTdGFja1ZpYSgpOwotCi0gIHZvaWQgY2xlYXIoKTsKLSAgdm9pZCBzZXRNYXhTdGFja1ZpYShpbnQgdmFsdWUpOwotICB2b2lkIHNldE1heFN0YWNrVmlhUmFuZ2UoY29uc3QgY2hhciogYm90dG9tTGF5ZXIsIGNvbnN0IGNoYXIqIHRvcExheWVyKTsKLQotICBpbnQgbWF4U3RhY2tWaWEoKSBjb25zdDsKLSAgaW50IGhhc01heFN0YWNrVmlhUmFuZ2UoKSBjb25zdDsKLSAgY29uc3QgY2hhciogbWF4U3RhY2tWaWFCb3R0b21MYXllcigpIGNvbnN0OwotICBjb25zdCBjaGFyKiBtYXhTdGFja1ZpYVRvcExheWVyKCkgY29uc3Q7Ci0KLSAgLy8gRGVidWcgcHJpbnQKLSAgdm9pZCBwcmludChGSUxFKiBmKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICBpbnQgICB2YWx1ZV87Ci0gIGludCAgIGhhc1JhbmdlXzsKLSAgY2hhciogYm90dG9tTGF5ZXJfOwotICBjaGFyKiB0b3BMYXllcl87Ci19OwotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotVVNFX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlOb25EZWZhdWx0LmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaU5vbkRlZmF1bHQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTVmYWQwLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaU5vbkRlZmF1bHQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTEyMCArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyIC0gMjAxMywgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJsZXguaCIKLSNpbmNsdWRlICJsZWZpTm9uRGVmYXVsdC5ocHAiCi0jaW5jbHVkZSAibGVmaURlYnVnLmhwcCIKLSNpbmNsdWRlICJsZWZyQ2FsbEJhY2tzLmhwcCIKLQotI2luY2x1ZGUgImxlZnJEYXRhLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotLy8gNi8xNi8yMDAwIC0gV2FuZGEgZGEgUm9zYQotLy8gTWFrZSB0aGVzZSB2YXJpYWJsZXMgaW4gZ2xvYmFscy4gIENhbid0IHVzZSB0aG9zZSBkZWZpbmVkCi0vLyBpbiB0aGUgY2xhc3MgYmVjYXVzZSBpdCBnZW5lcmF0ZXMgd2FybmluZyB3aGVuIGl0IGNhc3RzLgotLy8gQ2FuJ3QgYXNzaWduIGZvciBleGFtcGxlIGxlZnJWaWFDYmtGblR5cGUgdG8gb2xkVmlhQ2JrXwotLy8gaW4gdGhlIGNsYXNzIGJlY2F1c2UgaXQgcmVxdWlyZXMgdG8gaW5jbHVkZSBsZWZyUmVhZGVyLmhwcAotLy8gaW4gbGVmaU5vbkRlZmF1bHQuaHBwLiAgQnV0IGluIGxlZnJSZWFkZXIuaHBwLCBpdCByZXF1aXJlcwotLy8gaW5jbHVkZSBsZWZpTm9uRGVmYXVsdC5ocHAsIHRoaXMgY3JlYXRlcyBhIGxvb3AgYW5kIGlzCi0vLyBwcm9ibGVtYXRpYy4uLgotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gbGVmaU5vbkRlZmF1bHQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLWxlZmlOb25EZWZhdWx0OjpsZWZpTm9uRGVmYXVsdCgpCi06IG5hbWVTaXplXygwKSwKLSAgbmFtZV8oTlVMTCksCi0gIG51bUxheWVyc18oMCksCi0gIGxheWVyc0FsbG9jYXRlZF8oMCksCi0gIGxheWVyTmFtZV8oTlVMTCksCi0gIHdpZHRoXyhOVUxMKSwKLSAgc3BhY2luZ18oTlVMTCksCi0gIHdpcmVFeHRlbnNpb25fKE5VTEwpLAotICBoYXNXaWR0aF8oTlVMTCksCi0gIGhhc1NwYWNpbmdfKE5VTEwpLAotICBoYXNXaXJlRXh0ZW5zaW9uXyhOVUxMKSwKLSAgcmVzaXN0YW5jZV8oTlVMTCksCi0gIGNhcGFjaXRhbmNlXyhOVUxMKSwKLSAgZWRnZUNhcF8oTlVMTCksCi0gIGhhc1Jlc2lzdGFuY2VfKE5VTEwpLAotICBoYXNDYXBhY2l0YW5jZV8oTlVMTCksCi0gIGhhc0VkZ2VDYXBfKE5VTEwpLAotICBkaWFnV2lkdGhfKE5VTEwpLAotICBoYXNEaWFnV2lkdGhfKE5VTEwpLAotICBudW1WaWFzXygwKSwKLSAgYWxsb2NhdGVkVmlhc18oMCksCi0gIHZpYVJ1bGVzXyhOVUxMKSwKLSAgbnVtU3BhY2luZ18oMCksCi0gIGFsbG9jYXRlZFNwYWNpbmdfKDApLAotICBzcGFjaW5nUnVsZXNfKE5VTEwpLAotICBoYXJkU3BhY2luZ18oMCksCi0gIG51bVVzZVZpYXNfKDApLAotICBhbGxvY2F0ZWRVc2VWaWFzXygwKSwKLSAgdXNlVmlhTmFtZV8oTlVMTCksCi0gIG51bVVzZVZpYVJ1bGVzXygwKSwKLSAgYWxsb2NhdGVkVXNlVmlhUnVsZXNfKDApLAotICB1c2VWaWFSdWxlTmFtZV8oTlVMTCksCi0gIG51bU1pbkN1dHNfKDApLAotICBhbGxvY2F0ZWRNaW5DdXRzXygwKSwKLSAgY3V0TGF5ZXJOYW1lXyhOVUxMKSwKLSAgbnVtQ3V0c18oTlVMTCksCi0gIG51bVByb3BzXygwKSwKLSAgcHJvcHNBbGxvY2F0ZWRfKDApLAotICBuYW1lc18oTlVMTCksCi0gIHZhbHVlc18oTlVMTCksCi0gIGR2YWx1ZXNfKE5VTEwpLAotICB0eXBlc18oTlVMTCkKLXsKLSAgICBJbml0KCk7Ci19Ci0KLXZvaWQKLWxlZmlOb25EZWZhdWx0OjpJbml0KCkKLXsKLSAgICBuYW1lU2l6ZV8gPSAxNjsKLSAgICBuYW1lXyA9IChjaGFyKikgbGVmTWFsbG9jKDE2KTsKLQotICAgIGxheWVyc0FsbG9jYXRlZF8gPSAyOwotICAgIG51bUxheWVyc18gPSAwOwotICAgIGxheWVyTmFtZV8gPSAoY2hhcioqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIqKSAqIDIpOwotICAgIHdpZHRoXyA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiAyKTsKLSAgICBkaWFnV2lkdGhfID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIDIpOwotICAgIHNwYWNpbmdfID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIDIpOwotICAgIHdpcmVFeHRlbnNpb25fID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIDIpOwotICAgIHJlc2lzdGFuY2VfID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIDIpOwotICAgIGNhcGFjaXRhbmNlXyA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiAyKTsKLSAgICBlZGdlQ2FwXyA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiAyKTsKLSAgICBoYXNXaWR0aF8gPSAoY2hhciopIGxlZk1hbGxvYyhzaXplb2YoY2hhcikgKiAyKTsKLSAgICBoYXNEaWFnV2lkdGhfID0gKGNoYXIqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIpICogMik7Ci0gICAgaGFzU3BhY2luZ18gPSAoY2hhciopIGxlZk1hbGxvYyhzaXplb2YoY2hhcikgKiAyKTsKLSAgICBoYXNXaXJlRXh0ZW5zaW9uXyA9IChjaGFyKikgbGVmTWFsbG9jKHNpemVvZihjaGFyKSAqIDIpOwotICAgIGhhc1Jlc2lzdGFuY2VfID0gKGNoYXIqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIpICogMik7Ci0gICAgaGFzQ2FwYWNpdGFuY2VfID0gKGNoYXIqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIpICogMik7Ci0gICAgaGFzRWRnZUNhcF8gPSAoY2hhciopIGxlZk1hbGxvYyhzaXplb2YoY2hhcikgKiAyKTsKLQotICAgIGFsbG9jYXRlZFZpYXNfID0gMjsKLSAgICBudW1WaWFzXyA9IDA7Ci0gICAgdmlhUnVsZXNfID0gKGxlZmlWaWEqKikgbGVmTWFsbG9jKHNpemVvZihsZWZpVmlhKikgKiAyKTsKLQotICAgIGFsbG9jYXRlZFNwYWNpbmdfID0gMjsKLSAgICBudW1TcGFjaW5nXyA9IDA7Ci0gICAgc3BhY2luZ1J1bGVzXyA9IChsZWZpU3BhY2luZyoqKSBsZWZNYWxsb2Moc2l6ZW9mKGxlZmlTcGFjaW5nKikgKiAyKTsKLQotICAgIG51bVByb3BzXyA9IDA7Ci0gICAgcHJvcHNBbGxvY2F0ZWRfID0gMTsKLSAgICBuYW1lc18gPSAoY2hhcioqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIqKSk7Ci0gICAgdmFsdWVzXyA9IChjaGFyKiopIGxlZk1hbGxvYyhzaXplb2YoY2hhciopKTsKLSAgICBkdmFsdWVzXyA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkpOwotICAgIHR5cGVzXyA9IChjaGFyKikgbGVmTWFsbG9jKHNpemVvZihjaGFyKSk7Ci0KLSAgICBoYXJkU3BhY2luZ18gPSAwOwotICAgIG51bVVzZVZpYXNfID0gMDsgICAgICAgICAgICAgLy8gV29uJ3QgYmUgYWxsb2NhdGVkIHVudGlsIHRoZXkgYXJlIHVzZWQKLSAgICBhbGxvY2F0ZWRVc2VWaWFzXyA9IDA7Ci0gICAgbnVtVXNlVmlhUnVsZXNfID0gMDsKLSAgICBhbGxvY2F0ZWRVc2VWaWFSdWxlc18gPSAwOwotICAgIG51bU1pbkN1dHNfID0gMDsKLSAgICBhbGxvY2F0ZWRNaW5DdXRzXyA9IDA7Ci19Ci0KLXZvaWQKLWxlZmlOb25EZWZhdWx0OjpEZXN0cm95KCkKLXsKLSAgICBjbGVhcigpOwotCi0gICAgbGVmRnJlZShuYW1lXyk7Ci0KLSAgICBsZWZGcmVlKChjaGFyKikgKGxheWVyTmFtZV8pKTsKLSAgICBsZWZGcmVlKChjaGFyKikgKHdpZHRoXykpOwotICAgIGxlZkZyZWUoKGNoYXIqKSAoZGlhZ1dpZHRoXykpOwotICAgIGxlZkZyZWUoKGNoYXIqKSAoc3BhY2luZ18pKTsKLSAgICBsZWZGcmVlKChjaGFyKikgKHdpcmVFeHRlbnNpb25fKSk7Ci0gICAgbGVmRnJlZSgoY2hhciopIChyZXNpc3RhbmNlXykpOwotICAgIGxlZkZyZWUoKGNoYXIqKSAoY2FwYWNpdGFuY2VfKSk7Ci0gICAgbGVmRnJlZSgoY2hhciopIChlZGdlQ2FwXykpOwotICAgIGxlZkZyZWUoaGFzV2lkdGhfKTsKLSAgICBsZWZGcmVlKGhhc0RpYWdXaWR0aF8pOwotICAgIGxlZkZyZWUoaGFzU3BhY2luZ18pOwotICAgIGxlZkZyZWUoaGFzV2lyZUV4dGVuc2lvbl8pOwotICAgIGxlZkZyZWUoaGFzUmVzaXN0YW5jZV8pOwotICAgIGxlZkZyZWUoaGFzQ2FwYWNpdGFuY2VfKTsKLSAgICBsZWZGcmVlKGhhc0VkZ2VDYXBfKTsKLQotICAgIGxlZkZyZWUoKGNoYXIqKSAodmlhUnVsZXNfKSk7Ci0KLSAgICBsZWZGcmVlKChjaGFyKikgKHNwYWNpbmdSdWxlc18pKTsKLSAgICBsZWZGcmVlKChjaGFyKikgKG5hbWVzXykpOwotICAgIGxlZkZyZWUoKGNoYXIqKSAodmFsdWVzXykpOwotICAgIGxlZkZyZWUoKGNoYXIqKSAoZHZhbHVlc18pKTsKLSAgICBsZWZGcmVlKChjaGFyKikgKHR5cGVzXykpOwotICAgIGlmIChhbGxvY2F0ZWRVc2VWaWFzXykKLSAgICAgICAgbGVmRnJlZSgoY2hhciopICh1c2VWaWFOYW1lXykpOwotICAgIGlmIChhbGxvY2F0ZWRVc2VWaWFSdWxlc18pCi0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAodXNlVmlhUnVsZU5hbWVfKSk7Ci0gICAgaWYgKGFsbG9jYXRlZE1pbkN1dHNfKSB7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoY3V0TGF5ZXJOYW1lXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKG51bUN1dHNfKSk7Ci0gICAgfQotICAgIGFsbG9jYXRlZFVzZVZpYXNfID0gMDsKLSAgICBhbGxvY2F0ZWRVc2VWaWFSdWxlc18gPSAwOwotICAgIGFsbG9jYXRlZE1pbkN1dHNfID0gMDsKLX0KLQotbGVmaU5vbkRlZmF1bHQ6On5sZWZpTm9uRGVmYXVsdCgpCi17Ci0gICAgRGVzdHJveSgpOwotfQotCi12b2lkCi1sZWZpTm9uRGVmYXVsdDo6Y2xlYXIoKQotewotICAgIGludCAgICAgICAgIGk7Ci0gICAgbGVmaVNwYWNpbmcgKnNyOwotICAgIGxlZmlWaWEgICAgICp2cjsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBudW1Qcm9wc187IGkrKykgewotICAgICAgICBsZWZGcmVlKG5hbWVzX1tpXSk7Ci0gICAgICAgIGxlZkZyZWUodmFsdWVzX1tpXSk7Ci0gICAgICAgIGR2YWx1ZXNfW2ldID0gMDsKLSAgICB9Ci0gICAgbnVtUHJvcHNfID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTGF5ZXJzXzsgaSsrKSB7Ci0gICAgICAgIGxlZkZyZWUobGF5ZXJOYW1lX1tpXSk7Ci0gICAgICAgIGxheWVyTmFtZV9baV0gPSAwOwotICAgIH0KLSAgICBudW1MYXllcnNfID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVmlhc187IGkrKykgewotICAgICAgICB2ciA9IHZpYVJ1bGVzX1tpXTsKLSAgICAgICAgdnItPkRlc3Ryb3koKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopICh2aWFSdWxlc19baV0pKTsKLSAgICAgICAgdmlhUnVsZXNfW2ldID0gMDsKLSAgICB9Ci0gICAgbnVtVmlhc18gPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1TcGFjaW5nXzsgaSsrKSB7Ci0gICAgICAgIHNyID0gc3BhY2luZ1J1bGVzX1tpXTsKLSAgICAgICAgc3ItPkRlc3Ryb3koKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChzcGFjaW5nUnVsZXNfW2ldKSk7Ci0gICAgICAgIHNwYWNpbmdSdWxlc19baV0gPSAwOwotICAgIH0KLSAgICBudW1TcGFjaW5nXyA9IDA7Ci0KLSAgICBoYXJkU3BhY2luZ18gPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1Vc2VWaWFzXzsgaSsrKSB7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAodXNlVmlhTmFtZV9baV0pKTsKLSAgICB9Ci0gICAgbnVtVXNlVmlhc18gPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1Vc2VWaWFSdWxlc187IGkrKykgewotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHVzZVZpYVJ1bGVOYW1lX1tpXSkpOwotICAgIH0KLSAgICBudW1Vc2VWaWFSdWxlc18gPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1NaW5DdXRzXzsgaSsrKSB7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoY3V0TGF5ZXJOYW1lX1tpXSkpOwotICAgIH0KLSAgICBudW1NaW5DdXRzXyA9IDA7Ci19Ci0KLXZvaWQKLWxlZmlOb25EZWZhdWx0OjphZGRWaWFSdWxlKGxlZmlWaWEgKnYpCi17Ci0gICAgaWYgKG51bVZpYXNfID09IGFsbG9jYXRlZFZpYXNfKSB7Ci0gICAgICAgIGludCAgICAgaTsKLSAgICAgICAgbGVmaVZpYSAqKm52OwotCi0gICAgICAgIGlmIChhbGxvY2F0ZWRWaWFzXyA9PSAwKQotICAgICAgICAgICAgYWxsb2NhdGVkVmlhc18gPSAyOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhbGxvY2F0ZWRWaWFzXyAqPSAyOwotICAgICAgICBudiA9IChsZWZpVmlhKiopIGxlZk1hbGxvYyhzaXplb2YobGVmaVZpYSopICogYWxsb2NhdGVkVmlhc18pOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVmlhc187IGkrKykgewotICAgICAgICAgICAgbnZbaV0gPSB2aWFSdWxlc19baV07Ci0gICAgICAgIH0KLSAgICAgICAgbGVmRnJlZSgoY2hhciopICh2aWFSdWxlc18pKTsKLSAgICAgICAgdmlhUnVsZXNfID0gbnY7Ci0gICAgfQotICAgIHZpYVJ1bGVzX1tudW1WaWFzXysrXSA9IHYtPmNsb25lKCk7Ci19Ci0KLXZvaWQKLWxlZmlOb25EZWZhdWx0OjphZGRTcGFjaW5nUnVsZShsZWZpU3BhY2luZyAqcykKLXsKLSAgICBpZiAobnVtU3BhY2luZ18gPT0gYWxsb2NhdGVkU3BhY2luZ18pIHsKLSAgICAgICAgaW50ICAgICAgICAgaTsKLSAgICAgICAgbGVmaVNwYWNpbmcgKipuczsKLQotICAgICAgICBpZiAoYWxsb2NhdGVkU3BhY2luZ18gPT0gMCkKLSAgICAgICAgICAgIGFsbG9jYXRlZFNwYWNpbmdfID0gMjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYWxsb2NhdGVkU3BhY2luZ18gKj0gMjsKLSAgICAgICAgbnMgPSAobGVmaVNwYWNpbmcqKikgbGVmTWFsbG9jKHNpemVvZihsZWZpU3BhY2luZyopICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZFNwYWNpbmdfKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVNwYWNpbmdfOyBpKyspIHsKLSAgICAgICAgICAgIG5zW2ldID0gc3BhY2luZ1J1bGVzX1tpXTsKLSAgICAgICAgfQotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHNwYWNpbmdSdWxlc18pKTsKLSAgICAgICAgc3BhY2luZ1J1bGVzXyA9IG5zOwotICAgIH0KLSAgICBzcGFjaW5nUnVsZXNfW251bVNwYWNpbmdfKytdID0gcy0+Y2xvbmUoKTsKLX0KLQotdm9pZAotbGVmaU5vbkRlZmF1bHQ6OnNldE5hbWUoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLSAgICBjbGVhcigpOwotCi0gICAgLy8gVXNlIG91ciBjYWxsYmFjayBmdW5jdGlvbnMgYmVjYXVzZSBhIHZpYSBhbmQgc3BhY2luZwotICAgIC8vIHJ1bGUgaXMgcmVhbGx5IHBhcnQgb2YgdGhlIG5vbiBkZWZhdWx0IHNlY3Rpb24uCi0gICAgLy8gb2xkVmlhQ2JrXyA9ICh2b2lkKilsZWZyVmlhQ2JrOwotICAgIC8vIG9sZFNwYWNpbmdDYmtfID0gKHZvaWQqKWxlZnJTcGFjaW5nQ2JrOwotICAgIC8vIG9sZFNwYWNpbmdCZWdpbkNia18gPSAodm9pZCopbGVmclNwYWNpbmdCZWdpbkNiazsKLSAgICAvLyBvbGRTcGFjaW5nRW5kQ2JrXyA9ICh2b2lkKilsZWZyU3BhY2luZ0VuZENiazsKLSAgICAvL29sZFVzZXJEYXRhXyA9IGxlZnJHZXRVc2VyRGF0YSgpOwotICAgIC8vb2xkVmlhQ2JrID0gbGVmQ2FsbGJhY2tzLT5WaWFDYms7Ci0gICAgLy9vbGRTcGFjaW5nQ2JrID0gbGVmQ2FsbGJhY2tzLT5TcGFjaW5nQ2JrOwotICAgIC8vb2xkU3BhY2luZ0JlZ2luQ2JrID0gbGVmQ2FsbGJhY2tzLT5TcGFjaW5nQmVnaW5DYms7Ci0gICAgLy9vbGRTcGFjaW5nRW5kQ2JrID0gbGVmQ2FsbGJhY2tzLT5TcGFjaW5nRW5kQ2JrOwotICAgIC8vbGVmQ2FsbGJhY2tzLT5WaWFDYmsgPSBsZWZpTm9uRGVmYXVsdFZpYUNiazsKLSAgICAvL2xlZkNhbGxiYWNrcy0+U3BhY2luZ0NiayA9IGxlZmlOb25EZWZhdWx0U3BhY2luZ0NiazsKLSAgICAvL2xlZkNhbGxiYWNrcy0+U3BhY2luZ0JlZ2luQ2JrID0gMDsKLSAgICAvLyBsZWZDYWxsYmFja3MtPlNwYWNpbmdFbmRDYmsgPSAwOwotICAgIC8vIHBjciA5MDkwMTAsIGluc3RlYWQgb2Ygc2F2aW5nIHRoZSBwb2ludGVyIGluIHVzZXJEYXRhLAotICAgIC8vIHNhdmUgaXQgaW4gdGhlIGdsb2JhbCBsZWZEYXRhLT5uZC4KLSAgICAvLyBsZWZyU2V0VXNlckRhdGEoKGxlZmlVc2VyRGF0YSl0aGlzKTsKLQotICAgIGxlZkRhdGEtPm5kID0gdGhpczsKLQotICAgIGlmIChsZW4gPiBuYW1lU2l6ZV8pIHsKLSAgICAgICAgbGVmRnJlZShuYW1lXyk7Ci0gICAgICAgIG5hbWVfID0gKGNoYXIqKSBsZWZNYWxsb2MobGVuKTsKLSAgICAgICAgbmFtZVNpemVfID0gbGVuOwotICAgIH0KLSAgICBzdHJjcHkobmFtZV8sIENBU0UobmFtZSkpOwotfQotCi12b2lkCi1sZWZpTm9uRGVmYXVsdDo6YWRkTGF5ZXIoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLSAgICBpZiAobnVtTGF5ZXJzXyA9PSBsYXllcnNBbGxvY2F0ZWRfKSB7Ci0gICAgICAgIGludCAgICAgaTsKLSAgICAgICAgY2hhciAgICAqKm5ld2w7Ci0gICAgICAgIGRvdWJsZSAgKm5ld3c7Ci0gICAgICAgIGRvdWJsZSAgKm5ld2Q7Ci0gICAgICAgIGRvdWJsZSAgKm5ld3M7Ci0gICAgICAgIGRvdWJsZSAgKm5ld2U7Ci0gICAgICAgIGRvdWJsZSAgKm5ld2M7Ci0gICAgICAgIGRvdWJsZSAgKm5ld3I7Ci0gICAgICAgIGRvdWJsZSAgKm5ld2VjOwotICAgICAgICBjaGFyICAgICpuZXdodzsKLSAgICAgICAgY2hhciAgICAqbmV3aGQ7Ci0gICAgICAgIGNoYXIgICAgKm5ld2hzOwotICAgICAgICBjaGFyICAgICpuZXdoZTsKLSAgICAgICAgY2hhciAgICAqbmV3aGM7Ci0gICAgICAgIGNoYXIgICAgKm5ld2hyOwotICAgICAgICBjaGFyICAgICpuZXdoZWM7Ci0KLSAgICAgICAgaWYgKGxheWVyc0FsbG9jYXRlZF8gPT0gMCkKLSAgICAgICAgICAgIGxheWVyc0FsbG9jYXRlZF8gPSAyOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBsYXllcnNBbGxvY2F0ZWRfICo9IDI7Ci0gICAgICAgIG5ld2wgPSAoY2hhcioqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIqKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzQWxsb2NhdGVkXyk7Ci0gICAgICAgIG5ld2UgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzQWxsb2NhdGVkXyk7Ci0gICAgICAgIG5ld3cgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzQWxsb2NhdGVkXyk7Ci0gICAgICAgIG5ld2QgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzQWxsb2NhdGVkXyk7Ci0gICAgICAgIG5ld3MgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzQWxsb2NhdGVkXyk7Ci0gICAgICAgIG5ld2MgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzQWxsb2NhdGVkXyk7Ci0gICAgICAgIG5ld3IgPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzQWxsb2NhdGVkXyk7Ci0gICAgICAgIG5ld2VjID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcnNBbGxvY2F0ZWRfKTsKLSAgICAgICAgbmV3aGUgPSAoY2hhciopIGxlZk1hbGxvYyhzaXplb2YoY2hhcikgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyc0FsbG9jYXRlZF8pOwotICAgICAgICBuZXdodyA9IChjaGFyKikgbGVmTWFsbG9jKHNpemVvZihjaGFyKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzQWxsb2NhdGVkXyk7Ci0gICAgICAgIG5ld2hkID0gKGNoYXIqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcnNBbGxvY2F0ZWRfKTsKLSAgICAgICAgbmV3aHMgPSAoY2hhciopIGxlZk1hbGxvYyhzaXplb2YoY2hhcikgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyc0FsbG9jYXRlZF8pOwotICAgICAgICBuZXdoYyA9IChjaGFyKikgbGVmTWFsbG9jKHNpemVvZihjaGFyKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzQWxsb2NhdGVkXyk7Ci0gICAgICAgIG5ld2hyID0gKGNoYXIqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcnNBbGxvY2F0ZWRfKTsKLSAgICAgICAgbmV3aGVjID0gKGNoYXIqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzQWxsb2NhdGVkXyk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1MYXllcnNfOyBpKyspIHsKLSAgICAgICAgICAgIG5ld2xbaV0gPSBsYXllck5hbWVfW2ldOwotICAgICAgICAgICAgbmV3d1tpXSA9IHdpZHRoX1tpXTsKLSAgICAgICAgICAgIG5ld2RbaV0gPSBkaWFnV2lkdGhfW2ldOwotICAgICAgICAgICAgbmV3c1tpXSA9IHNwYWNpbmdfW2ldOwotICAgICAgICAgICAgbmV3ZVtpXSA9IHdpcmVFeHRlbnNpb25fW2ldOwotICAgICAgICAgICAgbmV3Y1tpXSA9IGNhcGFjaXRhbmNlX1tpXTsKLSAgICAgICAgICAgIG5ld3JbaV0gPSByZXNpc3RhbmNlX1tpXTsKLSAgICAgICAgICAgIG5ld2VjW2ldID0gZWRnZUNhcF9baV07Ci0gICAgICAgICAgICBuZXdoZVtpXSA9IGhhc1dpcmVFeHRlbnNpb25fW2ldOwotICAgICAgICAgICAgbmV3aHdbaV0gPSBoYXNXaWR0aF9baV07Ci0gICAgICAgICAgICBuZXdoZFtpXSA9IGhhc0RpYWdXaWR0aF9baV07Ci0gICAgICAgICAgICBuZXdoc1tpXSA9IGhhc1NwYWNpbmdfW2ldOwotICAgICAgICAgICAgbmV3aGNbaV0gPSBoYXNDYXBhY2l0YW5jZV9baV07Ci0gICAgICAgICAgICBuZXdocltpXSA9IGhhc1Jlc2lzdGFuY2VfW2ldOwotICAgICAgICAgICAgbmV3aGVjW2ldID0gaGFzRWRnZUNhcF9baV07Ci0gICAgICAgIH0KLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChsYXllck5hbWVfKSk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAod2lkdGhfKSk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoZGlhZ1dpZHRoXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHNwYWNpbmdfKSk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAod2lyZUV4dGVuc2lvbl8pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChjYXBhY2l0YW5jZV8pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChyZXNpc3RhbmNlXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGVkZ2VDYXBfKSk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoaGFzV2lyZUV4dGVuc2lvbl8pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChoYXNXaWR0aF8pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChoYXNEaWFnV2lkdGhfKSk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoaGFzU3BhY2luZ18pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChoYXNDYXBhY2l0YW5jZV8pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChoYXNSZXNpc3RhbmNlXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGhhc0VkZ2VDYXBfKSk7Ci0gICAgICAgIGxheWVyTmFtZV8gPSBuZXdsOwotICAgICAgICB3aWR0aF8gPSBuZXd3OwotICAgICAgICBkaWFnV2lkdGhfID0gbmV3ZDsKLSAgICAgICAgc3BhY2luZ18gPSBuZXdzOwotICAgICAgICB3aXJlRXh0ZW5zaW9uXyA9IG5ld2U7Ci0gICAgICAgIGNhcGFjaXRhbmNlXyA9IG5ld2M7Ci0gICAgICAgIHJlc2lzdGFuY2VfID0gbmV3cjsKLSAgICAgICAgZWRnZUNhcF8gPSBuZXdlYzsKLSAgICAgICAgaGFzV2lkdGhfID0gbmV3aHc7Ci0gICAgICAgIGhhc0RpYWdXaWR0aF8gPSBuZXdoZDsKLSAgICAgICAgaGFzU3BhY2luZ18gPSBuZXdoczsKLSAgICAgICAgaGFzV2lyZUV4dGVuc2lvbl8gPSBuZXdoZTsKLSAgICAgICAgaGFzQ2FwYWNpdGFuY2VfID0gbmV3aGM7Ci0gICAgICAgIGhhc1Jlc2lzdGFuY2VfID0gbmV3aHI7Ci0gICAgICAgIGhhc0VkZ2VDYXBfID0gbmV3aGVjOwotICAgIH0KLSAgICBsYXllck5hbWVfW251bUxheWVyc19dID0gKGNoYXIqKSBsZWZNYWxsb2MobGVuKTsKLSAgICBzdHJjcHkobGF5ZXJOYW1lX1tudW1MYXllcnNfXSwgQ0FTRShuYW1lKSk7Ci0gICAgd2lkdGhfW251bUxheWVyc19dID0gMC4wOwotICAgIGRpYWdXaWR0aF9bbnVtTGF5ZXJzX10gPSAwLjA7Ci0gICAgc3BhY2luZ19bbnVtTGF5ZXJzX10gPSAwLjA7Ci0gICAgd2lyZUV4dGVuc2lvbl9bbnVtTGF5ZXJzX10gPSAwLjA7Ci0gICAgY2FwYWNpdGFuY2VfW251bUxheWVyc19dID0gMC4wOwotICAgIHJlc2lzdGFuY2VfW251bUxheWVyc19dID0gMC4wOwotICAgIGVkZ2VDYXBfW251bUxheWVyc19dID0gMC4wOwotICAgIGhhc1dpZHRoX1tudW1MYXllcnNfXSA9ICdcMCc7Ci0gICAgaGFzRGlhZ1dpZHRoX1tudW1MYXllcnNfXSA9ICdcMCc7Ci0gICAgaGFzU3BhY2luZ19bbnVtTGF5ZXJzX10gPSAnXDAnOwotICAgIGhhc1dpcmVFeHRlbnNpb25fW251bUxheWVyc19dID0gJ1wwJzsKLSAgICBoYXNDYXBhY2l0YW5jZV9bbnVtTGF5ZXJzX10gPSAnXDAnOwotICAgIGhhc1Jlc2lzdGFuY2VfW251bUxheWVyc19dID0gJ1wwJzsKLSAgICBoYXNFZGdlQ2FwX1tudW1MYXllcnNfXSA9ICdcMCc7Ci0gICAgbnVtTGF5ZXJzXyArPSAxOwotfQotCi12b2lkCi1sZWZpTm9uRGVmYXVsdDo6YWRkV2lkdGgoZG91YmxlIG51bSkKLXsKLSAgICB3aWR0aF9bbnVtTGF5ZXJzXyAtIDFdID0gbnVtOwotICAgIGhhc1dpZHRoX1tudW1MYXllcnNfIC0gMV0gPSAxOwotfQotCi12b2lkCi1sZWZpTm9uRGVmYXVsdDo6YWRkRGlhZ1dpZHRoKGRvdWJsZSBudW0pCi17Ci0gICAgZGlhZ1dpZHRoX1tudW1MYXllcnNfIC0gMV0gPSBudW07Ci0gICAgaGFzRGlhZ1dpZHRoX1tudW1MYXllcnNfIC0gMV0gPSAxOwotfQotCi12b2lkCi1sZWZpTm9uRGVmYXVsdDo6YWRkU3BhY2luZyhkb3VibGUgbnVtKQotewotICAgIHNwYWNpbmdfW251bUxheWVyc18gLSAxXSA9IG51bTsKLSAgICBoYXNTcGFjaW5nX1tudW1MYXllcnNfIC0gMV0gPSAxOwotfQotCi12b2lkCi1sZWZpTm9uRGVmYXVsdDo6YWRkV2lyZUV4dGVuc2lvbihkb3VibGUgbnVtKQotewotICAgIHdpcmVFeHRlbnNpb25fW251bUxheWVyc18gLSAxXSA9IG51bTsKLSAgICBoYXNXaXJlRXh0ZW5zaW9uX1tudW1MYXllcnNfIC0gMV0gPSAxOwotfQotCi12b2lkCi1sZWZpTm9uRGVmYXVsdDo6YWRkQ2FwYWNpdGFuY2UoZG91YmxlIG51bSkKLXsKLSAgICBjYXBhY2l0YW5jZV9bbnVtTGF5ZXJzXyAtIDFdID0gbnVtOwotICAgIGhhc0NhcGFjaXRhbmNlX1tudW1MYXllcnNfIC0gMV0gPSAxOwotfQotCi12b2lkCi1sZWZpTm9uRGVmYXVsdDo6YWRkUmVzaXN0YW5jZShkb3VibGUgbnVtKQotewotICAgIHJlc2lzdGFuY2VfW251bUxheWVyc18gLSAxXSA9IG51bTsKLSAgICBoYXNSZXNpc3RhbmNlX1tudW1MYXllcnNfIC0gMV0gPSAxOwotfQotCi12b2lkCi1sZWZpTm9uRGVmYXVsdDo6YWRkRWRnZUNhcChkb3VibGUgbnVtKQotewotICAgIGVkZ2VDYXBfW251bUxheWVyc18gLSAxXSA9IG51bTsKLSAgICBoYXNFZGdlQ2FwX1tudW1MYXllcnNfIC0gMV0gPSAxOwotfQotCi12b2lkCi1sZWZpTm9uRGVmYXVsdDo6c2V0SGFyZHNwYWNpbmcoKQotewotICAgIGhhcmRTcGFjaW5nXyA9IDE7Ci19Ci0KLXZvaWQKLWxlZmlOb25EZWZhdWx0OjphZGRVc2VWaWEoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBpZiAobnVtVXNlVmlhc18gPT0gYWxsb2NhdGVkVXNlVmlhc18pIHsKLSAgICAgICAgaW50ICAgICBpOwotICAgICAgICBjaGFyICAgICoqdm47Ci0KLSAgICAgICAgaWYgKGFsbG9jYXRlZFVzZVZpYXNfID09IDApCi0gICAgICAgICAgICBhbGxvY2F0ZWRVc2VWaWFzXyA9IDI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFsbG9jYXRlZFVzZVZpYXNfICo9IDI7Ci0gICAgICAgIHZuID0gKGNoYXIqKikgbGVmTWFsbG9jKHNpemVvZihjaGFyKikgKiBhbGxvY2F0ZWRVc2VWaWFzXyk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1Vc2VWaWFzXzsgaSsrKSB7Ci0gICAgICAgICAgICB2bltpXSA9IHVzZVZpYU5hbWVfW2ldOwotICAgICAgICB9Ci0gICAgICAgIGlmIChudW1Vc2VWaWFzXykKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAodXNlVmlhTmFtZV8pKTsKLSAgICAgICAgdXNlVmlhTmFtZV8gPSB2bjsKLSAgICB9Ci0gICAgdXNlVmlhTmFtZV9bbnVtVXNlVmlhc19dID0gKGNoYXIqKSBsZWZNYWxsb2Moc3RybGVuKG5hbWUpICsgMSk7Ci0gICAgc3RyY3B5KHVzZVZpYU5hbWVfW251bVVzZVZpYXNfXSwgQ0FTRShuYW1lKSk7Ci0gICAgbnVtVXNlVmlhc18gKz0gMTsKLX0KLQotdm9pZAotbGVmaU5vbkRlZmF1bHQ6OmFkZFVzZVZpYVJ1bGUoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBpZiAobnVtVXNlVmlhUnVsZXNfID09IGFsbG9jYXRlZFVzZVZpYVJ1bGVzXykgewotICAgICAgICBpbnQgICAgIGk7Ci0gICAgICAgIGNoYXIgICAgKip2bjsKLQotICAgICAgICBpZiAoYWxsb2NhdGVkVXNlVmlhUnVsZXNfID09IDApCi0gICAgICAgICAgICBhbGxvY2F0ZWRVc2VWaWFSdWxlc18gPSAyOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhbGxvY2F0ZWRVc2VWaWFSdWxlc18gKj0gMjsKLSAgICAgICAgdm4gPSAoY2hhcioqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIqKSAqIGFsbG9jYXRlZFVzZVZpYVJ1bGVzXyk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1Vc2VWaWFSdWxlc187IGkrKykgewotICAgICAgICAgICAgdm5baV0gPSB1c2VWaWFSdWxlTmFtZV9baV07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG51bVVzZVZpYVJ1bGVzXykKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAodXNlVmlhUnVsZU5hbWVfKSk7Ci0gICAgICAgIHVzZVZpYVJ1bGVOYW1lXyA9IHZuOwotICAgIH0KLSAgICB1c2VWaWFSdWxlTmFtZV9bbnVtVXNlVmlhUnVsZXNfXSA9IChjaGFyKikgbGVmTWFsbG9jKHN0cmxlbihuYW1lKSArIDEpOwotICAgIHN0cmNweSh1c2VWaWFSdWxlTmFtZV9bbnVtVXNlVmlhUnVsZXNfXSwgQ0FTRShuYW1lKSk7Ci0gICAgbnVtVXNlVmlhUnVsZXNfICs9IDE7Ci19Ci0KLXZvaWQKLWxlZmlOb25EZWZhdWx0OjphZGRNaW5DdXRzKGNvbnN0IGNoYXIgICAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICBudW1DdXRzKQotewotICAgIGlmIChudW1NaW5DdXRzXyA9PSBhbGxvY2F0ZWRNaW5DdXRzXykgewotICAgICAgICBpbnQgICAgIGk7Ci0gICAgICAgIGNoYXIgICAgKipjbjsKLSAgICAgICAgaW50ICAgICAqbmM7Ci0KLSAgICAgICAgaWYgKGFsbG9jYXRlZE1pbkN1dHNfID09IDApCi0gICAgICAgICAgICBhbGxvY2F0ZWRNaW5DdXRzXyA9IDI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFsbG9jYXRlZE1pbkN1dHNfICo9IDI7Ci0gICAgICAgIGNuID0gKGNoYXIqKikgbGVmTWFsbG9jKHNpemVvZihjaGFyKikgKiBhbGxvY2F0ZWRNaW5DdXRzXyk7Ci0gICAgICAgIG5jID0gKGludCopIGxlZk1hbGxvYyhzaXplb2YoaW50KSAqIGFsbG9jYXRlZE1pbkN1dHNfKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bU1pbkN1dHNfOyBpKyspIHsKLSAgICAgICAgICAgIGNuW2ldID0gY3V0TGF5ZXJOYW1lX1tpXTsKLSAgICAgICAgICAgIG5jW2ldID0gbnVtQ3V0c19baV07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG51bU1pbkN1dHNfKSB7Ci0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKGN1dExheWVyTmFtZV8pKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAobnVtQ3V0c18pKTsKLSAgICAgICAgfQotICAgICAgICBjdXRMYXllck5hbWVfID0gY247Ci0gICAgICAgIG51bUN1dHNfID0gbmM7Ci0gICAgfQotICAgIGN1dExheWVyTmFtZV9bbnVtTWluQ3V0c19dID0gKGNoYXIqKSBsZWZNYWxsb2Moc3RybGVuKG5hbWUpICsgMSk7Ci0gICAgc3RyY3B5KGN1dExheWVyTmFtZV9bbnVtTWluQ3V0c19dLCBDQVNFKG5hbWUpKTsKLSAgICBudW1DdXRzX1tudW1NaW5DdXRzX10gPSBudW1DdXRzOwotICAgIG51bU1pbkN1dHNfICs9IDE7Ci19Ci0KLXZvaWQKLWxlZmlOb25EZWZhdWx0OjplbmQoKQotewotICAgIC8vIFJldHVybiB0aGUgY2FsbGJhY2tzIHRvIHRoZWlyIG5vcm1hbCBzdGF0ZS4KLSAgICAvLyBsZWZyU2V0VmlhQ2JrKChsZWZyVmlhQ2JrRm5UeXBlKW9sZFZpYUNia18pOwotICAgIC8vIGxlZnJTZXRTcGFjaW5nQ2JrKChsZWZyU3BhY2luZ0Nia0ZuVHlwZSlvbGRTcGFjaW5nQ2JrXyk7Ci0gICAgLy8gbGVmclNldFNwYWNpbmdCZWdpbkNiaygobGVmclZvaWRDYmtGblR5cGUpb2xkU3BhY2luZ0JlZ2luQ2JrXyk7Ci0gICAgLy8gbGVmclNldFNwYWNpbmdFbmRDYmsoKGxlZnJWb2lkQ2JrRm5UeXBlKW9sZFNwYWNpbmdFbmRDYmtfKTsKLSAgICAvL2xlZnJTZXRWaWFDYmsob2xkVmlhQ2JrKTsKLSAgICAvL2xlZnJTZXRTcGFjaW5nQ2JrKG9sZFNwYWNpbmdDYmspOwotICAgIC8vbGVmclNldFNwYWNpbmdCZWdpbkNiayhvbGRTcGFjaW5nQmVnaW5DYmspOwotICAgIC8vbGVmclNldFNwYWNpbmdFbmRDYmsob2xkU3BhY2luZ0VuZENiayk7Ci0gICAgLy8gcGNyIDkwOTAxMCAtIGdsb2JhbCB2YXIgbGVmRGF0YS0+bmQgaXMgdXNlZCB0byBwYXNzIG5vbmRlZmF1bHQgcnVsZSBkYXRhCi0gICAgLy8gbGVmclNldFVzZXJEYXRhKG9sZFVzZXJEYXRhXyk7Ci0gICAgbGVmRGF0YS0+bmQgPSAwOwotfQotCi1pbnQKLWxlZmlOb25EZWZhdWx0OjpudW1MYXllcnMoKSBjb25zdAotewotICAgIHJldHVybiBudW1MYXllcnNfOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlOb25EZWZhdWx0OjpsYXllck5hbWUoaW50IGluZGV4KSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1MYXllcnNfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTQwMik6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBOT05ERUZBVUxUIExBWUVSIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQiLCBpbmRleCwgbnVtTGF5ZXJzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxNDAyLCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIGxheWVyTmFtZV9baW5kZXhdOwotfQotCi1pbnQKLWxlZmlOb25EZWZhdWx0OjpoYXNMYXllcldpZHRoKGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjaGFyIG1zZ1sxNjBdOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtTGF5ZXJzXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTE0MDIpOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgTk9OREVGQVVMVCBMQVlFUiBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bUxheWVyc18pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTQwMiwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBoYXNXaWR0aF9baW5kZXhdOwotfQotCi1kb3VibGUKLWxlZmlOb25EZWZhdWx0OjpsYXllcldpZHRoKGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjaGFyIG1zZ1sxNjBdOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtTGF5ZXJzXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTE0MDIpOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgTk9OREVGQVVMVCBMQVlFUiBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bUxheWVyc18pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTQwMiwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDAuMDsKLSAgICB9Ci0gICAgcmV0dXJuIHdpZHRoX1tpbmRleF07Ci19Ci0KLWludAotbGVmaU5vbkRlZmF1bHQ6Omhhc0xheWVyRGlhZ1dpZHRoKGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjaGFyIG1zZ1sxNjBdOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtTGF5ZXJzXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTE0MDIpOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgTk9OREVGQVVMVCBMQVlFUiBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bUxheWVyc18pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTQwMiwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBoYXNEaWFnV2lkdGhfW2luZGV4XTsKLX0KLQotZG91YmxlCi1sZWZpTm9uRGVmYXVsdDo6bGF5ZXJEaWFnV2lkdGgoaW50IGluZGV4KSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1MYXllcnNfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTQwMik6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBOT05ERUZBVUxUIExBWUVSIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQiLCBpbmRleCwgbnVtTGF5ZXJzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxNDAyLCBtc2cpOwotICAgICAgICByZXR1cm4gMC4wOwotICAgIH0KLSAgICByZXR1cm4gZGlhZ1dpZHRoX1tpbmRleF07Ci19Ci0KLWludAotbGVmaU5vbkRlZmF1bHQ6Omhhc0xheWVyV2lyZUV4dGVuc2lvbihpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bUxheWVyc18pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xNDAyKTogVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIE5PTkRFRkFVTFQgTEFZRVIgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGluZGV4LCBudW1MYXllcnNfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDE0MDIsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gaGFzV2lyZUV4dGVuc2lvbl9baW5kZXhdOwotfQotCi1pbnQKLWxlZmlOb25EZWZhdWx0OjpoYXNMYXllclNwYWNpbmcoaW50IGluZGV4KSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1MYXllcnNfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTQwMik6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBOT05ERUZBVUxUIExBWUVSIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQiLCBpbmRleCwgbnVtTGF5ZXJzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxNDAyLCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIGhhc1NwYWNpbmdfW2luZGV4XTsKLX0KLQotZG91YmxlCi1sZWZpTm9uRGVmYXVsdDo6bGF5ZXJXaXJlRXh0ZW5zaW9uKGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjaGFyIG1zZ1sxNjBdOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtTGF5ZXJzXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTE0MDIpOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgTk9OREVGQVVMVCBMQVlFUiBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bUxheWVyc18pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTQwMiwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDAuMDsKLSAgICB9Ci0gICAgcmV0dXJuIHdpcmVFeHRlbnNpb25fW2luZGV4XTsKLX0KLQotZG91YmxlCi1sZWZpTm9uRGVmYXVsdDo6bGF5ZXJTcGFjaW5nKGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjaGFyIG1zZ1sxNjBdOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtTGF5ZXJzXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTE0MDIpOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgTk9OREVGQVVMVCBMQVlFUiBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bUxheWVyc18pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTQwMiwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDAuMDsKLSAgICB9Ci0gICAgcmV0dXJuIHNwYWNpbmdfW2luZGV4XTsKLX0KLQotaW50Ci1sZWZpTm9uRGVmYXVsdDo6aGFzTGF5ZXJSZXNpc3RhbmNlKGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjaGFyIG1zZ1sxNjBdOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtTGF5ZXJzXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTE0MDIpOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgTk9OREVGQVVMVCBMQVlFUiBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bUxheWVyc18pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTQwMiwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBoYXNSZXNpc3RhbmNlX1tpbmRleF07Ci19Ci0KLWRvdWJsZQotbGVmaU5vbkRlZmF1bHQ6OmxheWVyUmVzaXN0YW5jZShpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bUxheWVyc18pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xNDAyKTogVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIE5PTkRFRkFVTFQgTEFZRVIgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGluZGV4LCBudW1MYXllcnNfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDE0MDIsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwLjA7Ci0gICAgfQotICAgIHJldHVybiByZXNpc3RhbmNlX1tpbmRleF07Ci19Ci0KLWludAotbGVmaU5vbkRlZmF1bHQ6Omhhc0xheWVyQ2FwYWNpdGFuY2UoaW50IGluZGV4KSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1MYXllcnNfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTQwMik6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBOT05ERUZBVUxUIExBWUVSIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQiLCBpbmRleCwgbnVtTGF5ZXJzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxNDAyLCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIGhhc0NhcGFjaXRhbmNlX1tpbmRleF07Ci19Ci0KLWRvdWJsZQotbGVmaU5vbkRlZmF1bHQ6OmxheWVyQ2FwYWNpdGFuY2UoaW50IGluZGV4KSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1MYXllcnNfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTQwMik6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBOT05ERUZBVUxUIExBWUVSIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQiLCBpbmRleCwgbnVtTGF5ZXJzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxNDAyLCBtc2cpOwotICAgICAgICByZXR1cm4gMC4wOwotICAgIH0KLSAgICByZXR1cm4gY2FwYWNpdGFuY2VfW2luZGV4XTsKLX0KLQotaW50Ci1sZWZpTm9uRGVmYXVsdDo6aGFzTGF5ZXJFZGdlQ2FwKGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjaGFyIG1zZ1sxNjBdOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtTGF5ZXJzXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTE0MDIpOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgTk9OREVGQVVMVCBMQVlFUiBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bUxheWVyc18pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTQwMiwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBoYXNFZGdlQ2FwX1tpbmRleF07Ci19Ci0KLWRvdWJsZQotbGVmaU5vbkRlZmF1bHQ6OmxheWVyRWRnZUNhcChpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bUxheWVyc18pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xNDAyKTogVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIE5PTkRFRkFVTFQgTEFZRVIgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGluZGV4LCBudW1MYXllcnNfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDE0MDIsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwLjA7Ci0gICAgfQotICAgIHJldHVybiBlZGdlQ2FwX1tpbmRleF07Ci19Ci0KLWludAotbGVmaU5vbkRlZmF1bHQ6Om51bVZpYXMoKSBjb25zdAotewotICAgIHJldHVybiBudW1WaWFzXzsKLX0KLQotbGVmaVZpYSAqCi1sZWZpTm9uRGVmYXVsdDo6dmlhUnVsZShpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVZpYXNfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTQwMyk6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBOT05ERUZBVUxUIFZJQSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bVZpYXNfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDE0MDMsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gdmlhUnVsZXNfW2luZGV4XTsKLX0KLQotaW50Ci1sZWZpTm9uRGVmYXVsdDo6bnVtU3BhY2luZ1J1bGVzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbnVtU3BhY2luZ187Ci19Ci0KLWxlZmlTcGFjaW5nICoKLWxlZmlOb25EZWZhdWx0OjpzcGFjaW5nUnVsZShpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVNwYWNpbmdfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTQwNCk6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBOT05ERUZBVUxUIFNQQUNJTkcgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGluZGV4LCBudW1TcGFjaW5nXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxNDA0LCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHNwYWNpbmdSdWxlc19baW5kZXhdOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlOb25EZWZhdWx0OjpuYW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbmFtZV87Ci19Ci0KLWludAotbGVmaU5vbkRlZmF1bHQ6Omhhc0hhcmRzcGFjaW5nKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFyZFNwYWNpbmdfOwotfQotCi1pbnQKLWxlZmlOb25EZWZhdWx0OjpudW1Vc2VWaWEoKSBjb25zdAotewotICAgIHJldHVybiBudW1Vc2VWaWFzXzsKLX0KLQotY29uc3QgY2hhciAqCi1sZWZpTm9uRGVmYXVsdDo6dmlhTmFtZShpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVVzZVZpYXNfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTQwNSk6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBOT05ERUZBVUxUIFVTRSBWSUEgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGluZGV4LCBudW1Vc2VWaWFzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxNDA1LCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHVzZVZpYU5hbWVfW2luZGV4XTsKLX0KLQotaW50Ci1sZWZpTm9uRGVmYXVsdDo6bnVtVXNlVmlhUnVsZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG51bVVzZVZpYVJ1bGVzXzsKLX0KLQotY29uc3QgY2hhciAqCi1sZWZpTm9uRGVmYXVsdDo6dmlhUnVsZU5hbWUoaW50IGluZGV4KSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1Vc2VWaWFSdWxlc18pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xNDA2KTogVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIE5PTkRFRkFVTFQgVVNFIFZJQVJVTEUgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGluZGV4LCBudW1Vc2VWaWFSdWxlc18pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTQwNiwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiB1c2VWaWFSdWxlTmFtZV9baW5kZXhdOwotfQotCi1pbnQKLWxlZmlOb25EZWZhdWx0OjpudW1NaW5DdXRzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbnVtTWluQ3V0c187Ci19Ci0KLWNvbnN0IGNoYXIgKgotbGVmaU5vbkRlZmF1bHQ6OmN1dExheWVyTmFtZShpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bU1pbkN1dHNfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTQwNyk6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBOT05ERUZBVUxUIENVVCBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bU1pbkN1dHNfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDE0MDcsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gY3V0TGF5ZXJOYW1lX1tpbmRleF07Ci19Ci0KLWludAotbGVmaU5vbkRlZmF1bHQ6Om51bUN1dHMoaW50IGluZGV4KSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1NaW5DdXRzXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTE0MDcpOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgTk9OREVGQVVMVCBDVVQgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGluZGV4LCBudW1NaW5DdXRzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxNDA3LCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIG51bUN1dHNfW2luZGV4XTsKLX0KLQotdm9pZAotbGVmaU5vbkRlZmF1bHQ6OnByaW50KEZJTEUgKmYpCi17Ci0gICAgaW50ICAgICAgICAgaTsKLSAgICBsZWZpU3BhY2luZyAqczsKLSAgICBsZWZpVmlhICAgICAqdjsKLQotICAgIGZwcmludGYoZiwgIk5vbmRlZmF1bHQgcnVsZSAlc1xuIiwKLSAgICAgICAgICAgIG5hbWUoKSk7Ci0gICAgZnByaW50ZihmLCAiJWQgbGF5ZXJzICAgJWQgdmlhcyAgICVkIHNwYWNpbmcgcnVsZXNcbiIsCi0gICAgICAgICAgICBudW1MYXllcnMoKSwKLSAgICAgICAgICAgIG51bVZpYXMoKSwKLSAgICAgICAgICAgIG51bVNwYWNpbmdSdWxlcygpKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBudW1MYXllcnMoKTsgaSsrKSB7Ci0gICAgICAgIGZwcmludGYoZiwgIiAgTGF5ZXIgJXNcbiIsIGxheWVyTmFtZShpKSk7Ci0gICAgICAgIGlmIChoYXNMYXllcldpZHRoKGkpKQotICAgICAgICAgICAgZnByaW50ZihmLCAiICAgIFdJRFRIICVnXG4iLCBsYXllcldpZHRoKGkpKTsKLSAgICAgICAgaWYgKGhhc0xheWVyRGlhZ1dpZHRoKGkpKQotICAgICAgICAgICAgZnByaW50ZihmLCAiICAgIERJQUdXSURUSCAlZ1xuIiwgbGF5ZXJEaWFnV2lkdGgoaSkpOwotICAgICAgICBpZiAoaGFzTGF5ZXJTcGFjaW5nKGkpKQotICAgICAgICAgICAgZnByaW50ZihmLCAiICAgIFNQQUNJTkcgJWdcbiIsIGxheWVyU3BhY2luZyhpKSk7Ci0gICAgICAgIGlmIChoYXNMYXllcldpcmVFeHRlbnNpb24oaSkpCi0gICAgICAgICAgICBmcHJpbnRmKGYsICIgICAgV0lSRUVYVEVOU0lPTiAlZyIsCi0gICAgICAgICAgICAgICAgICAgIGxheWVyV2lyZUV4dGVuc2lvbihpKSk7Ci0gICAgICAgIGlmIChoYXNMYXllclJlc2lzdGFuY2UoaSkpCi0gICAgICAgICAgICBmcHJpbnRmKGYsICIgICAgUkVTSVNUQU5DRSBSUEVSU1EgJWdcbiIsCi0gICAgICAgICAgICAgICAgICAgIGxheWVyUmVzaXN0YW5jZShpKSk7Ci0gICAgICAgIGlmIChoYXNMYXllckNhcGFjaXRhbmNlKGkpKQotICAgICAgICAgICAgZnByaW50ZihmLCAiICAgIENBUEFDSVRBTkNFIENQRVJTUURJU1QgJWdcbiIsCi0gICAgICAgICAgICAgICAgICAgIGxheWVyQ2FwYWNpdGFuY2UoaSkpOwotICAgICAgICBpZiAoaGFzTGF5ZXJFZGdlQ2FwKGkpKQotICAgICAgICAgICAgZnByaW50ZihmLCAiICAgIEVER0VDQVBBQ0lUQU5DRSAlZ1xuIiwKLSAgICAgICAgICAgICAgICAgICAgbGF5ZXJFZGdlQ2FwKGkpKTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVmlhcygpOyBpKyspIHsKLSAgICAgICAgdiA9IHZpYVJ1bGUoaSk7Ci0gICAgICAgIHYtPnByaW50KGYpOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBudW1TcGFjaW5nUnVsZXMoKTsgaSsrKSB7Ci0gICAgICAgIHMgPSBzcGFjaW5nUnVsZShpKTsKLSAgICAgICAgcy0+cHJpbnQoZik7Ci0gICAgfQotfQotCi1pbnQKLWxlZmlOb25EZWZhdWx0OjpudW1Qcm9wcygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG51bVByb3BzXzsKLX0KLQotdm9pZAotbGVmaU5vbkRlZmF1bHQ6OmFkZFByb3AoY29uc3QgY2hhciAgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICB0eXBlKQotewotICAgIGludCBsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotICAgIGlmIChudW1Qcm9wc18gPT0gcHJvcHNBbGxvY2F0ZWRfKSB7Ci0gICAgICAgIGludCAgICAgaTsKLSAgICAgICAgaW50ICAgICBtYXg7Ci0gICAgICAgIGludCAgICAgbGltID0gbnVtUHJvcHNfOwotICAgICAgICBjaGFyICAgICoqbm47Ci0gICAgICAgIGNoYXIgICAgKipudjsKLSAgICAgICAgZG91YmxlICAqbkQ7Ci0gICAgICAgIGNoYXIgICAgKm50OwotCi0gICAgICAgIGlmIChwcm9wc0FsbG9jYXRlZF8gPT0gMCkKLSAgICAgICAgICAgIG1heCA9IHByb3BzQWxsb2NhdGVkXyA9IDI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1heCA9IHByb3BzQWxsb2NhdGVkXyAqPSAyOwotICAgICAgICBubiA9IChjaGFyKiopIGxlZk1hbGxvYyhzaXplb2YoY2hhciopICogbWF4KTsKLSAgICAgICAgbnYgPSAoY2hhcioqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIqKSAqIG1heCk7Ci0gICAgICAgIG5EID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIG1heCk7Ci0gICAgICAgIG50ID0gKGNoYXIqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIpICogbWF4KTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbTsgaSsrKSB7Ci0gICAgICAgICAgICBubltpXSA9IG5hbWVzX1tpXTsKLSAgICAgICAgICAgIG52W2ldID0gdmFsdWVzX1tpXTsKLSAgICAgICAgICAgIG5EW2ldID0gZHZhbHVlc19baV07Ci0gICAgICAgICAgICBudFtpXSA9IHR5cGVzX1tpXTsKLSAgICAgICAgfQotICAgICAgICBsZWZGcmVlKChjaGFyKikgKG5hbWVzXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHZhbHVlc18pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChkdmFsdWVzXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHR5cGVzXykpOwotICAgICAgICBuYW1lc18gPSBubjsKLSAgICAgICAgdmFsdWVzXyA9IG52OwotICAgICAgICBkdmFsdWVzXyA9IG5EOwotICAgICAgICB0eXBlc18gPSBudDsKLSAgICB9Ci0gICAgbmFtZXNfW251bVByb3BzX10gPSAoY2hhciopIGxlZk1hbGxvYyhzaXplb2YoY2hhcikgKiBsZW4pOwotICAgIHN0cmNweShuYW1lc19bbnVtUHJvcHNfXSwgbmFtZSk7Ci0gICAgbGVuID0gc3RybGVuKHZhbHVlKSArIDE7Ci0gICAgdmFsdWVzX1tudW1Qcm9wc19dID0gKGNoYXIqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIpICogbGVuKTsKLSAgICBzdHJjcHkodmFsdWVzX1tudW1Qcm9wc19dLCB2YWx1ZSk7Ci0gICAgZHZhbHVlc19bbnVtUHJvcHNfXSA9IDA7Ci0gICAgdHlwZXNfW251bVByb3BzX10gPSB0eXBlOwotICAgIG51bVByb3BzXyArPSAxOwotfQotCi12b2lkCi1sZWZpTm9uRGVmYXVsdDo6YWRkTnVtUHJvcChjb25zdCBjaGFyICAgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgdHlwZSkKLXsKLSAgICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLSAgICBpZiAobnVtUHJvcHNfID09IHByb3BzQWxsb2NhdGVkXykgewotICAgICAgICBpbnQgICAgIGk7Ci0gICAgICAgIGludCAgICAgbWF4OwotICAgICAgICBpbnQgICAgIGxpbSA9IG51bVByb3BzXzsKLSAgICAgICAgY2hhciAgICAqKm5uOwotICAgICAgICBjaGFyICAgICoqbnY7Ci0gICAgICAgIGRvdWJsZSAgKm5EOwotICAgICAgICBjaGFyICAgICpudDsKLQotICAgICAgICBpZiAocHJvcHNBbGxvY2F0ZWRfID09IDApCi0gICAgICAgICAgICBtYXggPSBwcm9wc0FsbG9jYXRlZF8gPSAyOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtYXggPSBwcm9wc0FsbG9jYXRlZF8gKj0gMjsKLSAgICAgICAgbm4gPSAoY2hhcioqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIqKSAqIG1heCk7Ci0gICAgICAgIG52ID0gKGNoYXIqKikgbGVmTWFsbG9jKHNpemVvZihjaGFyKikgKiBtYXgpOwotICAgICAgICBuRCA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBtYXgpOwotICAgICAgICBudCA9IChjaGFyKikgbGVmTWFsbG9jKHNpemVvZihjaGFyKSAqIG1heCk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW07IGkrKykgewotICAgICAgICAgICAgbm5baV0gPSBuYW1lc19baV07Ci0gICAgICAgICAgICBudltpXSA9IHZhbHVlc19baV07Ci0gICAgICAgICAgICBuRFtpXSA9IGR2YWx1ZXNfW2ldOwotICAgICAgICAgICAgbnRbaV0gPSB0eXBlc19baV07Ci0gICAgICAgIH0KLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChuYW1lc18pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopICh2YWx1ZXNfKSk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoZHZhbHVlc18pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopICh0eXBlc18pKTsKLSAgICAgICAgbmFtZXNfID0gbm47Ci0gICAgICAgIHZhbHVlc18gPSBudjsKLSAgICAgICAgZHZhbHVlc18gPSBuRDsKLSAgICAgICAgdHlwZXNfID0gbnQ7Ci0gICAgfQotICAgIG5hbWVzX1tudW1Qcm9wc19dID0gKGNoYXIqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIpICogbGVuKTsKLSAgICBzdHJjcHkobmFtZXNfW251bVByb3BzX10sIG5hbWUpOwotICAgIGxlbiA9IHN0cmxlbih2YWx1ZSkgKyAxOwotICAgIHZhbHVlc19bbnVtUHJvcHNfXSA9IChjaGFyKikgbGVmTWFsbG9jKHNpemVvZihjaGFyKSAqIGxlbik7Ci0gICAgc3RyY3B5KHZhbHVlc19bbnVtUHJvcHNfXSwgdmFsdWUpOwotICAgIGR2YWx1ZXNfW251bVByb3BzX10gPSBkOwotICAgIHR5cGVzX1tudW1Qcm9wc19dID0gdHlwZTsKLSAgICBudW1Qcm9wc18gKz0gMTsKLX0KLQotY29uc3QgY2hhciAqCi1sZWZpTm9uRGVmYXVsdDo6cHJvcE5hbWUoaW50IGluZGV4KSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1Qcm9wc18pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xNDA4KTogVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIE5PTkRFRkFVTFQgUFJPUEVSVFkgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGluZGV4LCBudW1Qcm9wc18pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTQwOCwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBuYW1lc19baW5kZXhdOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlOb25EZWZhdWx0Ojpwcm9wVmFsdWUoaW50IGluZGV4KSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1Qcm9wc18pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xNDA4KTogVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIE5PTkRFRkFVTFQgUFJPUEVSVFkgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGluZGV4LCBudW1Qcm9wc18pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTQwOCwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiB2YWx1ZXNfW2luZGV4XTsKLX0KLQotZG91YmxlCi1sZWZpTm9uRGVmYXVsdDo6cHJvcE51bWJlcihpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVByb3BzXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTE0MDgpOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgTk9OREVGQVVMVCBQUk9QRVJUWSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bVByb3BzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxNDA4LCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIGR2YWx1ZXNfW2luZGV4XTsKLX0KLQotY29uc3QgY2hhcgotbGVmaU5vbkRlZmF1bHQ6OnByb3BUeXBlKGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjaGFyIG1zZ1sxNjBdOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtUHJvcHNfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTQwOCk6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBOT05ERUZBVUxUIFBST1BFUlRZIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQiLCBpbmRleCwgbnVtUHJvcHNfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDE0MDgsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gdHlwZXNfW2luZGV4XTsKLX0KLQotaW50Ci1sZWZpTm9uRGVmYXVsdDo6cHJvcElzTnVtYmVyKGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjaGFyIG1zZ1sxNjBdOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtUHJvcHNfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTQwOCk6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBOT05ERUZBVUxUIFBST1BFUlRZIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQiLCBpbmRleCwgbnVtUHJvcHNfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDE0MDgsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gZHZhbHVlc19baW5kZXhdID8gMSA6IDA7Ci19Ci0KLWludAotbGVmaU5vbkRlZmF1bHQ6OnByb3BJc1N0cmluZyhpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVByb3BzXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTE0MDgpOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgTk9OREVGQVVMVCBQUk9QRVJUWSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bVByb3BzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxNDA4LCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIGR2YWx1ZXNfW2luZGV4XSA/IDAgOiAxOwotfQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaU5vbkRlZmF1bHQuaHBwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZpTm9uRGVmYXVsdC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NDVhZjcuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZpTm9uRGVmYXVsdC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiAtIDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaWZuZGVmIGxlZmlOb25EZWZhdWx0X2gKLSNkZWZpbmUgbGVmaU5vbkRlZmF1bHRfaAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJsZWZpS1JEZWZzLmhwcCIKLSNpbmNsdWRlICJsZWZpVmlhLmhwcCIKLSNpbmNsdWRlICJsZWZpTWlzYy5ocHAiCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLWNsYXNzIGxlZmlOb25EZWZhdWx0IHsKLXB1YmxpYzoKLSAgbGVmaU5vbkRlZmF1bHQoKTsKLSAgdm9pZCBJbml0KCk7Ci0KLSAgdm9pZCBEZXN0cm95KCk7Ci0gIH5sZWZpTm9uRGVmYXVsdCgpOwotCi0gIHZvaWQgc2V0TmFtZShjb25zdCBjaGFyKiBuYW1lKTsKLSAgdm9pZCBhZGRMYXllcihjb25zdCBjaGFyKiBuYW1lKTsKLSAgdm9pZCBhZGRXaWR0aChkb3VibGUgbnVtKTsKLSAgdm9pZCBhZGRXaXJlRXh0ZW5zaW9uKGRvdWJsZSBudW0pOwotICB2b2lkIGFkZFNwYWNpbmcoZG91YmxlIG51bSk7Ci0gIHZvaWQgYWRkU3BhY2luZ1J1bGUobGVmaVNwYWNpbmcqIHMpOwotICB2b2lkIGFkZFJlc2lzdGFuY2UoZG91YmxlIG51bSk7Ci0gIHZvaWQgYWRkQ2FwYWNpdGFuY2UoZG91YmxlIG51bSk7Ci0gIHZvaWQgYWRkRWRnZUNhcChkb3VibGUgbnVtKTsKLSAgdm9pZCBhZGRWaWFSdWxlKGxlZmlWaWEqIHYpOwotICB2b2lkIGFkZERpYWdXaWR0aChkb3VibGUgbnVtKTsgICAgICAgICAgICAgICAgICAgIC8vIDUuNgotICB2b2lkIGVuZCgpOwotICB2b2lkIGNsZWFyKCk7Ci0gIHZvaWQgYWRkUHJvcChjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSwgY29uc3QgY2hhciB0eXBlKTsKLSAgdm9pZCBhZGROdW1Qcm9wKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGRvdWJsZSBkLAotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFsdWUsIGNvbnN0IGNoYXIgdHlwZSk7Ci0gIHZvaWQgc2V0SGFyZHNwYWNpbmcoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIHZvaWQgYWRkVXNlVmlhKGNvbnN0IGNoYXIqIG5hbWUpOyAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIHZvaWQgYWRkVXNlVmlhUnVsZShjb25zdCBjaGFyKiBuYW1lKTsgICAgICAgICAgICAgLy8gNS42Ci0gIHZvaWQgYWRkTWluQ3V0cyhjb25zdCBjaGFyKiBuYW1lLCBpbnQgbnVtQ3V0cyk7ICAgLy8gNS42Ci0KLSAgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0OwotICBpbnQgICBoYXNIYXJkc3BhY2luZygpIGNvbnN0OyAgICAgICAgICAgICAgICAgICAgIC8vIDUuNgotCi0gIGludCBudW1Qcm9wcygpIGNvbnN0OwotICBjb25zdCBjaGFyKiAgcHJvcE5hbWUoaW50IGluZGV4KSBjb25zdDsKLSAgY29uc3QgY2hhciogIHByb3BWYWx1ZShpbnQgaW5kZXgpIGNvbnN0OwotICBkb3VibGUgcHJvcE51bWJlcihpbnQgaW5kZXgpIGNvbnN0OwotICBjb25zdCBjaGFyICAgcHJvcFR5cGUoaW50IGluZGV4KSBjb25zdDsKLSAgaW50ICAgIHByb3BJc051bWJlcihpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgICAgcHJvcElzU3RyaW5nKGludCBpbmRleCkgY29uc3Q7Ci0gIAotICAvLyBBIG5vbiBkZWZhdWx0IHJ1bGUgY2FuIGhhdmUgb25lIG9yIG1vcmUgbGF5ZXJzLgotICAvLyBUaGUgbGF5ZXIgaW5mb3JtYXRpb24gaXMga2VwdCBpbiBhbiBhcnJheS4KLSAgaW50IG51bUxheWVycygpIGNvbnN0IDsKLSAgY29uc3QgY2hhciogbGF5ZXJOYW1lKGludCBpbmRleCkgY29uc3QgOwotICBpbnQgaGFzTGF5ZXJXaWR0aChpbnQgaW5kZXgpIGNvbnN0OwotICBkb3VibGUgbGF5ZXJXaWR0aChpbnQgaW5kZXgpIGNvbnN0IDsKLSAgaW50IGhhc0xheWVyU3BhY2luZyhpbnQgaW5kZXgpIGNvbnN0IDsKLSAgZG91YmxlIGxheWVyU3BhY2luZyhpbnQgaW5kZXgpIGNvbnN0IDsKLSAgaW50IGhhc0xheWVyV2lyZUV4dGVuc2lvbihpbnQgaW5kZXgpIGNvbnN0IDsKLSAgZG91YmxlIGxheWVyV2lyZUV4dGVuc2lvbihpbnQgaW5kZXgpIGNvbnN0IDsKLSAgaW50IGhhc0xheWVyUmVzaXN0YW5jZShpbnQgaW5kZXgpIGNvbnN0OyAgICAgICAvLyBvYnNvbGV0ZSBpbiA1LjYKLSAgZG91YmxlIGxheWVyUmVzaXN0YW5jZShpbnQgaW5kZXgpIGNvbnN0OyAgICAgICAvLyBvYnNvbGV0ZSBpbiA1LjYKLSAgaW50IGhhc0xheWVyQ2FwYWNpdGFuY2UoaW50IGluZGV4KSBjb25zdDsgICAgICAvLyBvYnNvbGV0ZSBpbiA1LjYKLSAgZG91YmxlIGxheWVyQ2FwYWNpdGFuY2UoaW50IGluZGV4KSBjb25zdDsgICAgICAvLyBvYnNvbGV0ZSBpbiA1LjYKLSAgaW50IGhhc0xheWVyRWRnZUNhcChpbnQgaW5kZXgpIGNvbnN0OyAgICAgICAgICAvLyBvYnNvbGV0ZSBpbiA1LjYKLSAgZG91YmxlIGxheWVyRWRnZUNhcChpbnQgaW5kZXgpIGNvbnN0OyAgICAgICAgICAvLyBvYnNvbGV0ZSBpbiA1LjYKLSAgaW50IGhhc0xheWVyRGlhZ1dpZHRoKGludCBpbmRleCkgY29uc3Q7ICAgICAgICAvLyA1LjYKLSAgZG91YmxlIGxheWVyRGlhZ1dpZHRoKGludCBpbmRleCkgY29uc3Q7ICAgICAgICAvLyA1LjYKLQotICAvLyBBIG5vbiBkZWZhdWx0IHJ1bGUgY2FuIGhhdmUgb25lIG9yIG1vcmUgdmlhcy4KLSAgLy8gVGhlc2Ugcm91dGluZXMgcmV0dXJuIHRoZSB2aWEgaW5mby4KLSAgaW50IG51bVZpYXMoKSBjb25zdCA7Ci0gIGxlZmlWaWEqIHZpYVJ1bGUoaW50IGluZGV4KSBjb25zdCA7Ci0KLSAgLy8gQSBub24gZGVmYXVsdCBydWxlIGNhbiBoYXZlIG9uZSBvciBtb3JlIHNwYWNpbmcgcnVsZXMuCi0gIC8vIFRoZXNlIHJvdXRpbmVzIHJldHVybiB0aGUgdGhhdCBpbmZvLgotICBpbnQgbnVtU3BhY2luZ1J1bGVzKCkgY29uc3QgOwotICBsZWZpU3BhY2luZyogc3BhY2luZ1J1bGUoaW50IGluZGV4KSBjb25zdCA7Ci0KLSAgaW50IG51bVVzZVZpYSgpIGNvbnN0OyAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjYKLSAgY29uc3QgY2hhciogdmlhTmFtZShpbnQgaW5kZXgpIGNvbnN0OyAgICAgICAgICAvLyA1LjYKLSAgaW50IG51bVVzZVZpYVJ1bGUoKSBjb25zdDsgICAgICAgICAgICAgICAgICAgICAvLyA1LjYKLSAgY29uc3QgY2hhciogdmlhUnVsZU5hbWUoaW50IGluZGV4KSBjb25zdDsgICAgICAvLyA1LjYKLSAgaW50IG51bU1pbkN1dHMoKSBjb25zdDsgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjYKLSAgY29uc3QgY2hhciogY3V0TGF5ZXJOYW1lKGludCBpbmRleCkgY29uc3Q7ICAgICAvLyA1LjYKLSAgaW50IG51bUN1dHMoaW50IGluZGV4KSBjb25zdDsgICAgICAgICAgICAgICAgICAvLyA1LjYKLQotICAvLyBEZWJ1ZyBwcmludAotICB2b2lkIHByaW50KEZJTEUqIGYpOwotCi1wcm90ZWN0ZWQ6Ci0gIGludCBuYW1lU2l6ZV87Ci0gIGNoYXIqIG5hbWVfOwotCi0gIC8vIExheWVyIGluZm9ybWF0aW9uCi0gIGludCBudW1MYXllcnNfOwotICBpbnQgbGF5ZXJzQWxsb2NhdGVkXzsKLSAgY2hhcioqIGxheWVyTmFtZV87Ci0gIGRvdWJsZSogd2lkdGhfOwotICBkb3VibGUqIHNwYWNpbmdfOwotICBkb3VibGUqIHdpcmVFeHRlbnNpb25fOwotICBjaGFyKiBoYXNXaWR0aF87Ci0gIGNoYXIqIGhhc1NwYWNpbmdfOwotICBjaGFyKiBoYXNXaXJlRXh0ZW5zaW9uXzsKLQotICAvLyA1LjQKLSAgZG91YmxlKiByZXNpc3RhbmNlXzsKLSAgZG91YmxlKiBjYXBhY2l0YW5jZV87Ci0gIGRvdWJsZSogZWRnZUNhcF87Ci0gIGNoYXIqICAgaGFzUmVzaXN0YW5jZV87Ci0gIGNoYXIqICAgaGFzQ2FwYWNpdGFuY2VfOwotICBjaGFyKiAgIGhhc0VkZ2VDYXBfOwotCi0gIGRvdWJsZSogZGlhZ1dpZHRoXzsgICAgICAgICAgICAgIC8vIDUuNgotICBjaGFyKiAgIGhhc0RpYWdXaWR0aF87ICAgICAgICAgICAvLyA1LjYKLQotICBpbnQgbnVtVmlhc187Ci0gIGludCBhbGxvY2F0ZWRWaWFzXzsKLSAgbGVmaVZpYSoqIHZpYVJ1bGVzXzsKLQotICBpbnQgbnVtU3BhY2luZ187Ci0gIGludCBhbGxvY2F0ZWRTcGFjaW5nXzsKLSAgbGVmaVNwYWNpbmcqKiBzcGFjaW5nUnVsZXNfOwotCi0gIGludCAgICBoYXJkU3BhY2luZ187ICAgICAgICAgICAgIC8vIDUuNgotICBpbnQgICAgbnVtVXNlVmlhc187ICAgICAgICAgICAgICAvLyA1LjYKLSAgaW50ICAgIGFsbG9jYXRlZFVzZVZpYXNfOyAgICAgICAgLy8gNS42Ci0gIGNoYXIqKiB1c2VWaWFOYW1lXzsgICAgICAgICAgICAgIC8vIDUuNgotICBpbnQgICAgbnVtVXNlVmlhUnVsZXNfOyAgICAgICAgICAvLyA1LjYKLSAgaW50ICAgIGFsbG9jYXRlZFVzZVZpYVJ1bGVzXzsgICAgLy8gNS42Ci0gIGNoYXIqKiB1c2VWaWFSdWxlTmFtZV87ICAgICAgICAgIC8vIDUuNgotICBpbnQgICAgbnVtTWluQ3V0c187ICAgICAgICAgICAgICAvLyA1LjYKLSAgaW50ICAgIGFsbG9jYXRlZE1pbkN1dHNfOyAgICAgICAgLy8gNS42Ci0gIGNoYXIqKiBjdXRMYXllck5hbWVfOyAgICAgICAgICAgIC8vIDUuNgotICBpbnQqICAgbnVtQ3V0c187ICAgICAgICAgICAgICAgICAvLyA1LjYKLQotICBpbnQgbnVtUHJvcHNfOwotICBpbnQgcHJvcHNBbGxvY2F0ZWRfOwotICBjaGFyKiogIG5hbWVzXzsKLSAgY2hhcioqICB2YWx1ZXNfOwotICBkb3VibGUqIGR2YWx1ZXNfOwotICBjaGFyKiAgIHR5cGVzXzsKLX07Ci0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1VU0VfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlQcm9wLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaVByb3AuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmNjMTE3Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaVByb3AuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTIgLSAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgImxleC5oIgotI2luY2x1ZGUgImxlZmlQcm9wLmhwcCIKLSNpbmNsdWRlICJsZWZpRGVidWcuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1sZWZpUHJvcDo6bGVmaVByb3AoKQotOiBwcm9wVHlwZV8oTlVMTCksCi0gIHByb3BOYW1lXyhOVUxMKSwKLSAgbmFtZVNpemVfKDApLAotICBoYXNSYW5nZV8oMCksCi0gIGhhc051bWJlcl8oMCksCi0gIGhhc05hbWVNYXBTdHJpbmdfKDApLAotICBkYXRhVHlwZV8oMCksCi0gIHN0cmluZ0RhdGFfKE5VTEwpLAotICBzdHJpbmdMZW5ndGhfKDApLAotICBsZWZ0XygwLjApLAotICByaWdodF8oMC4wKSwKLSAgZF8oMC4wKQotewotICAgIEluaXQoKTsKLX0KLQotdm9pZAotbGVmaVByb3A6OkluaXQoKQotewotICAgIHN0cmluZ0xlbmd0aF8gPSAxNjsKLSAgICBzdHJpbmdEYXRhXyA9IChjaGFyKikgbGVmTWFsbG9jKDE2KTsKLSAgICBuYW1lU2l6ZV8gPSAxNjsKLSAgICBwcm9wTmFtZV8gPSAoY2hhciopIGxlZk1hbGxvYygxNik7Ci0gICAgY2xlYXIoKTsKLX0KLQotdm9pZAotbGVmaVByb3A6OkRlc3Ryb3koKQotewotICAgIGxlZkZyZWUoc3RyaW5nRGF0YV8pOwotICAgIGxlZkZyZWUocHJvcE5hbWVfKTsKLX0KLQotbGVmaVByb3A6On5sZWZpUHJvcCgpCi17Ci0gICAgRGVzdHJveSgpOwotfQotCi12b2lkCi1sZWZpUHJvcDo6c2V0UHJvcFR5cGUoY29uc3QgY2hhciAgICAqdHlwLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKnN0cmluZykKLXsKLSAgICBpbnQgbGVuOwotICAgIHByb3BUeXBlXyA9IChjaGFyKikgdHlwOwotICAgIGlmICgobGVuID0gc3RybGVuKHN0cmluZykgKyAxKSA+IG5hbWVTaXplXykKLSAgICAgICAgYnVtcE5hbWUobGVuKTsKLSAgICBzdHJjcHkocHJvcE5hbWVfLCBDQVNFKHN0cmluZykpOwotfQotCi12b2lkCi1sZWZpUHJvcDo6c2V0UmFuZ2UoZG91YmxlICAgbGVmdCwKLSAgICAgICAgICAgICAgICAgICBkb3VibGUgICByaWdodCkKLXsKLSAgICBoYXNSYW5nZV8gPSAxOwotICAgIGxlZnRfID0gbGVmdDsKLSAgICByaWdodF8gPSByaWdodDsKLX0KLQotdm9pZAotbGVmaVByb3A6OnNldE51bWJlcihkb3VibGUgZCkKLXsKLSAgICBoYXNOdW1iZXJfID0gMTsKLSAgICBkXyA9IGQ7Ci19Ci0KLXZvaWQKLWxlZmlQcm9wOjpzZXRQcm9wSW50ZWdlcigpCi17Ci0gICAgZGF0YVR5cGVfID0gJ0knOwotfQotCi12b2lkCi1sZWZpUHJvcDo6c2V0UHJvcFJlYWwoKQotewotICAgIGRhdGFUeXBlXyA9ICdSJzsKLX0KLQotdm9pZAotbGVmaVByb3A6OnNldFByb3BTdHJpbmcoKQotewotICAgIGRhdGFUeXBlXyA9ICdTJzsKLX0KLQotdm9pZAotbGVmaVByb3A6OnNldFByb3BRU3RyaW5nKGNvbnN0IGNoYXIgKnN0cmluZykKLXsKLSAgICBpbnQgbGVuOwotICAgIGRhdGFUeXBlXyA9ICdRJzsKLSAgICBpZiAoKGxlbiA9IHN0cmxlbihzdHJpbmcpICsgMSkgPiBzdHJpbmdMZW5ndGhfKQotICAgICAgICBidW1wU2l6ZShsZW4pOwotICAgIHN0cmNweShzdHJpbmdEYXRhXywgQ0FTRShzdHJpbmcpKTsKLX0KLQotdm9pZAotbGVmaVByb3A6OnNldFByb3BOYW1lTWFwU3RyaW5nKGNvbnN0IGNoYXIgKnN0cmluZykKLXsKLSAgICBpbnQgbGVuOwotICAgIGRhdGFUeXBlXyA9ICdOJzsKLSAgICBoYXNOYW1lTWFwU3RyaW5nXyA9IDE7Ci0gICAgaWYgKChsZW4gPSBzdHJsZW4oc3RyaW5nKSArIDEpID4gc3RyaW5nTGVuZ3RoXykKLSAgICAgICAgYnVtcFNpemUobGVuKTsKLSAgICBzdHJjcHkoc3RyaW5nRGF0YV8sIENBU0Uoc3RyaW5nKSk7Ci19Ci0KLWNvbnN0IGNoYXIgKgotbGVmaVByb3A6OnN0cmluZygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHN0cmluZ0RhdGFfOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlQcm9wOjpwcm9wVHlwZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHByb3BUeXBlXzsKLX0KLQotaW50Ci1sZWZpUHJvcDo6aGFzTnVtYmVyKCkgY29uc3QKLXsKLSAgICByZXR1cm4gKGludCkgKGhhc051bWJlcl8pOwotfQotCi1pbnQKLWxlZmlQcm9wOjpoYXNSYW5nZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIChpbnQpIChoYXNSYW5nZV8pOwotfQotCi1kb3VibGUKLWxlZmlQcm9wOjpudW1iZXIoKSBjb25zdAotewotICAgIHJldHVybiBkXzsKLX0KLQotZG91YmxlCi1sZWZpUHJvcDo6bGVmdCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGxlZnRfOwotfQotCi1kb3VibGUKLWxlZmlQcm9wOjpyaWdodCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJpZ2h0XzsKLX0KLQotdm9pZAotbGVmaVByb3A6OmJ1bXBTaXplKGludCBzaXplKQotewotICAgIGxlZkZyZWUoc3RyaW5nRGF0YV8pOwotICAgIHN0cmluZ0RhdGFfID0gKGNoYXIqKSBsZWZNYWxsb2Moc2l6ZSk7Ci0gICAgc3RyaW5nTGVuZ3RoXyA9IHNpemU7Ci0gICAgKihzdHJpbmdEYXRhXykgPSAnXDAnOwotfQotCi12b2lkCi1sZWZpUHJvcDo6YnVtcE5hbWUoaW50IHNpemUpCi17Ci0gICAgbGVmRnJlZShwcm9wTmFtZV8pOwotICAgIHByb3BOYW1lXyA9IChjaGFyKikgbGVmTWFsbG9jKHNpemUpOwotICAgIG5hbWVTaXplXyA9IHNpemU7Ci0gICAgKihwcm9wTmFtZV8pID0gJ1wwJzsKLX0KLQotdm9pZAotbGVmaVByb3A6OmNsZWFyKCkKLXsKLSAgICBpZiAoc3RyaW5nRGF0YV8pCi0gICAgICAgICooc3RyaW5nRGF0YV8pID0gJ1wwJzsKLSAgICBpZiAoc3RyaW5nRGF0YV8pCi0gICAgICAgICoocHJvcE5hbWVfKSA9ICdcMCc7Ci0gICAgcHJvcFR5cGVfID0gMDsKLSAgICBoYXNSYW5nZV8gPSAwOwotICAgIGhhc051bWJlcl8gPSAwOwotICAgIGhhc05hbWVNYXBTdHJpbmdfID0gMDsKLSAgICBkYXRhVHlwZV8gPSAnQic7IC8vIGJvZ3VzIAotICAgIGRfID0gbGVmdF8gPSByaWdodF8gPSAwLjA7Ci19Ci0KLWludAotbGVmaVByb3A6Omhhc1N0cmluZygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICooc3RyaW5nRGF0YV8pID8gMSA6IDA7Ci19Ci0KLWludAotbGVmaVByb3A6Omhhc05hbWVNYXBTdHJpbmcoKSBjb25zdAotewotICAgIHJldHVybiAoaGFzTmFtZU1hcFN0cmluZ18pID8gMSA6IDA7Ci19Ci0KLWNvbnN0IGNoYXIgKgotbGVmaVByb3A6OnByb3BOYW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gKHByb3BOYW1lXyk7Ci19Ci0KLWNoYXIKLWxlZmlQcm9wOjpkYXRhVHlwZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIChkYXRhVHlwZV8pOwotfQotCi12b2lkCi1sZWZpUHJvcDo6cHJpbnQoRklMRSAqZikgY29uc3QKLXsKLSAgICBmcHJpbnRmKGYsICJQcm9wIHR5cGUgJyVzJ1xuIiwgcHJvcFR5cGUoKSk7Ci0gICAgaWYgKGhhc1N0cmluZygpKSB7Ci0gICAgICAgIGZwcmludGYoZiwgIiAgc3RyaW5nICclcydcbiIsIHN0cmluZygpKTsKLSAgICB9Ci0gICAgaWYgKGhhc051bWJlcigpKSB7Ci0gICAgICAgIGZwcmludGYoZiwgIiAgbnVtYmVyICU1LjJmXG4iLCBudW1iZXIoKSk7Ci0gICAgfQotICAgIGlmIChoYXNSYW5nZSgpKSB7Ci0gICAgICAgIGZwcmludGYoZiwgIiAgcmFuZ2UgJTUuMmYgLSAlNS4yZlxuIiwKLSAgICAgICAgICAgICAgICBsZWZ0KCksIHJpZ2h0KCkpOwotICAgIH0KLX0KLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaVByb3AuaHBwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZpUHJvcC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNjMzOGEuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZpUHJvcC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyIC0gMjAxMywgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpZm5kZWYgbGVmaVByb3BfaAotI2RlZmluZSBsZWZpUHJvcF9oCi0KLSNpbmNsdWRlICJsZWZpS1JEZWZzLmhwcCIKLSNpbmNsdWRlIDxzdGRpby5oPgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0vLyBTdHJ1Y3QgaG9sZHMgdGhlIGRhdGEgZm9yIG9uZSBwcm9wZXJ0eS4KLWNsYXNzIGxlZmlQcm9wIHsKLXB1YmxpYzoKLSAgbGVmaVByb3AoKTsKLSAgdm9pZCBJbml0KCk7Ci0KLSAgdm9pZCBEZXN0cm95KCk7Ci0gIH5sZWZpUHJvcCgpOwotCi0gIHZvaWQgc2V0UHJvcFR5cGUoY29uc3QgY2hhciogdHlwLCBjb25zdCBjaGFyKiBzdHJpbmcpOwotICB2b2lkIHNldFJhbmdlKGRvdWJsZSBsZWZ0LCBkb3VibGUgcmlnaHQpOwotICB2b2lkIHNldE51bWJlcihkb3VibGUgbnVtKTsKLSAgdm9pZCBzZXRQcm9wSW50ZWdlcigpOwotICB2b2lkIHNldFByb3BSZWFsKCk7Ci0gIHZvaWQgc2V0UHJvcFN0cmluZygpOwotICB2b2lkIHNldFByb3BRU3RyaW5nKGNvbnN0IGNoYXIqIHN0cmluZyk7Ci0gIHZvaWQgc2V0UHJvcE5hbWVNYXBTdHJpbmcoY29uc3QgY2hhciogc3RyaW5nKTsKLSAgdm9pZCBjbGVhcigpOwotCi0gIGNvbnN0IGNoYXIqIHN0cmluZygpIGNvbnN0OwotICBjb25zdCBjaGFyKiBwcm9wVHlwZSgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBwcm9wTmFtZSgpIGNvbnN0OwotICBjaGFyICBkYXRhVHlwZSgpIGNvbnN0OwotICAgICAgLy8gZWl0aGVyIEk6aW50ZWdlciBSOnJlYWwgUzpzdHJpbmcgUTpxdW90ZWRzdHJpbmcKLSAgICAgIC8vIE46cHJvcGVydHkgbmFtZSBpcyBub3QgZGVmaW5lZCBpbiB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbiBzZWN0aW9uCi0gIGludCBoYXNOdW1iZXIoKSBjb25zdDsKLSAgaW50IGhhc1JhbmdlKCkgY29uc3Q7Ci0gIGludCBoYXNTdHJpbmcoKSBjb25zdDsKLSAgaW50IGhhc05hbWVNYXBTdHJpbmcoKSBjb25zdDsKLSAgZG91YmxlIG51bWJlcigpIGNvbnN0OwotICBkb3VibGUgbGVmdCgpIGNvbnN0OwotICBkb3VibGUgcmlnaHQoKSBjb25zdDsKLQotICB2b2lkIGJ1bXBTaXplKGludCBzaXplKTsKLSAgdm9pZCBidW1wTmFtZShpbnQgc2l6ZSk7Ci0KLSAgdm9pZCBwcmludChGSUxFKiBmKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICBjaGFyKiBwcm9wVHlwZV87ICAgICAgLy8gImRlc2lnbiIgIm5ldCIgIm1hY3JvIiAuLi4KLSAgY2hhciogcHJvcE5hbWVfOyAgICAgIC8vIG5hbWUuCi0gIGludCBuYW1lU2l6ZV87ICAgICAgICAvLyBhbGxvY2F0ZWQgc2l6ZSBvZiBuYW1lLgotICBjaGFyIGhhc1JhbmdlXzsgICAgICAgLy8gZWl0aGVyIDA6Tk8gb3IgMTpZRVMuCi0gIGNoYXIgaGFzTnVtYmVyXzsgICAgICAvLyBlaXRoZXIgMDpOTyBvciAxOllFUy4KLSAgY2hhciBoYXNOYW1lTWFwU3RyaW5nXzsKLSAgY2hhciBkYXRhVHlwZV87ICAgICAgIC8vIGVpdGhlciBJOmludGVnZXIgUjpyZWFsIFM6c3RyaW5nIFE6cXVvdGVkc3RyaW5nLgotICAgICAgICAgICAgLy8gTjpwcm9wZXJ0eSBuYW1lIGlzIG5vdCBkZWZpbmVkLgotICBjaGFyKiBzdHJpbmdEYXRhXzsgICAgLy8gaWYgaXQgaXMgYSBzdHJpbmcgdGhlIGRhdGEgaXMgaGVyZS4KLSAgaW50IHN0cmluZ0xlbmd0aF87ICAgIC8vIGFsbG9jYXRlZCBzaXplIG9mIHN0cmluZ0RhdGEuCi0gIGRvdWJsZSBsZWZ0XzsKLSAgZG91YmxlIHJpZ2h0XzsgLy8gaWYgaXQgaGFzIGEgcmFuZ2UgdGhlIG51bWJlcnMgYXJlIGhlcmUuCi0gIGRvdWJsZSBkXzsgICAgICAgICAgICAvLyBpZiBpdCBpcyBhIHJlYWwgb3IgaW50IHRoZSBudW1iZXIgaXMgaGVyZS4KLX07Ci0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1VU0VfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlQcm9wVHlwZS5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlQcm9wVHlwZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2Yzk5YTEuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZpUHJvcFR5cGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTIgLSAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgImxleC5oIgotI2luY2x1ZGUgImxlZmlQcm9wVHlwZS5ocHAiCi0jaW5jbHVkZSAibGVmaURlYnVnLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotbGVmaVByb3BUeXBlOjpsZWZpUHJvcFR5cGUoKQotOiBudW1Qcm9wZXJ0aWVzXygwKSwKLSAgcHJvcGVydGllc0FsbG9jYXRlZF8oMCksCi0gIHByb3BOYW1lc18oTlVMTCksCi0gIHByb3BUeXBlc18oTlVMTCkKLXsKLSAgICBJbml0KCk7Ci19Ci0KLXZvaWQKLWxlZmlQcm9wVHlwZTo6SW5pdCgpCi17Ci0gICAgbnVtUHJvcGVydGllc18gPSAwOwotICAgIHByb3BlcnRpZXNBbGxvY2F0ZWRfID0gMDsKLSAgICBwcm9wTmFtZXNfID0gMDsKLSAgICBwcm9wVHlwZXNfID0gMDsKLX0KLQotdm9pZAotbGVmaVByb3BUeXBlOjpDbGVhcigpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUHJvcGVydGllc187IGkrKykgewotICAgICAgICBmcmVlKHByb3BOYW1lc19baV0pOwotICAgIH0KLSAgICBudW1Qcm9wZXJ0aWVzXyA9IDA7Ci0gICAgcHJvcGVydGllc0FsbG9jYXRlZF8gPSAwOwotfQotCi12b2lkCi1sZWZpUHJvcFR5cGU6OkRlc3Ryb3koKQotewotICAgIENsZWFyKCk7Ci0gICAgaWYgKHByb3BOYW1lc18pCi0gICAgICAgIGZyZWUocHJvcE5hbWVzXyk7Ci0gICAgaWYgKHByb3BUeXBlc18pCi0gICAgICAgIGZyZWUocHJvcFR5cGVzXyk7Ci19Ci0KLWxlZmlQcm9wVHlwZTo6fmxlZmlQcm9wVHlwZSgpCi17Ci0gICAgRGVzdHJveSgpOwotfQotCi12b2lkCi1sZWZpUHJvcFR5cGU6OnNldFByb3BUeXBlKGNvbnN0IGNoYXIgICAgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgdHlwZSkKLXsKLSAgICBpbnQgbGVuOwotCi0gICAgaWYgKG51bVByb3BlcnRpZXNfID09IHByb3BlcnRpZXNBbGxvY2F0ZWRfKQotICAgICAgICBidW1wUHJvcHMoKTsKLSAgICBsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotICAgIHByb3BOYW1lc19bbnVtUHJvcGVydGllc19dID0gKGNoYXIqKSBtYWxsb2MobGVuKTsKLSAgICBzdHJjcHkocHJvcE5hbWVzX1tudW1Qcm9wZXJ0aWVzX10sIENBU0UobmFtZSkpOwotICAgIHByb3BUeXBlc19bbnVtUHJvcGVydGllc19dID0gdHlwZTsKLSAgICBudW1Qcm9wZXJ0aWVzXyArPSAxOwotfQotCi12b2lkCi1sZWZpUHJvcFR5cGU6OmJ1bXBQcm9wcygpCi17Ci0gICAgaW50ICAgICBsaW0gPSBwcm9wZXJ0aWVzQWxsb2NhdGVkXzsKLSAgICBpbnQgICAgIG5ld3M7Ci0gICAgY2hhciAgICAqKm5ld3BuOwotICAgIGNoYXIgICAgKm5ld3Q7Ci0KLSAgICBuZXdzID0gbGltID8gbGltICsgbGltIDogMjsKLQotICAgIG5ld3BuID0gKGNoYXIqKikgbWFsbG9jKHNpemVvZihjaGFyKikgKiBuZXdzKTsKLSAgICBuZXd0ID0gKGNoYXIqKSBtYWxsb2Moc2l6ZW9mKGNoYXIpICogbmV3cyk7Ci0KLSAgICBsaW0gPSBwcm9wZXJ0aWVzQWxsb2NhdGVkXyA9IG5ld3M7Ci0KLSAgICBpZiAobGltID4gMikgewotICAgICAgICBpbnQgaTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVByb3BlcnRpZXNfOyBpKyspIHsKLSAgICAgICAgICAgIG5ld3BuW2ldID0gcHJvcE5hbWVzX1tpXTsKLSAgICAgICAgICAgIG5ld3RbaV0gPSBwcm9wVHlwZXNfW2ldOwotICAgICAgICB9Ci0gICAgICAgIGZyZWUoKGNoYXIqKSAocHJvcE5hbWVzXykpOwotICAgICAgICBmcmVlKChjaGFyKikgKHByb3BUeXBlc18pKTsKLSAgICB9Ci0gICAgcHJvcE5hbWVzXyA9IG5ld3BuOwotICAgIHByb3BUeXBlc18gPSBuZXd0OwotfQotCi1jb25zdCBjaGFyCi1sZWZpUHJvcFR5cGU6OnByb3BUeXBlKGNoYXIgKm5hbWUpIGNvbnN0Ci17Ci0gICAgaW50IGk7Ci0KLSAgICAvLyBOYW1lIGlzIE5VTEwsIGVycm9yCi0gICAgaWYgKCFuYW1lKQotICAgICAgICByZXR1cm4gKCdOJyk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUHJvcGVydGllc187IGkrKykgewotICAgICAgICBpZiAoc3RyY21wKG5hbWUsIHByb3BOYW1lc19baV0pID09IDApCi0gICAgICAgICAgICByZXR1cm4gKHByb3BUeXBlc19baV0pOyAgLy8gZm91bmQgdGhlIHByb3AgbmFtZQotICAgIH0KLSAgICByZXR1cm4gKCdOJyk7IC8vIENhbid0IGZvdW5kIHRoZSBuYW1lCi19Ci1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZpUHJvcFR5cGUuaHBwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZpUHJvcFR5cGUuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODI0OWE2Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaVByb3BUeXBlLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTIgLSAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2lmbmRlZiBsZWZpUHJvcFR5cGVfaAotI2RlZmluZSBsZWZpUHJvcFR5cGVfaAotCi0jaW5jbHVkZSAibGVmaUtSRGVmcy5ocHAiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotLy8gU3RydWN0IGhvbGRzIHRoZSBkYXRhIHR5cGUgZm9yIG9uZSBwcm9wZXJ0eSwgaWYgdGhlIHByb3BlcnR5IGlzCi0vLyBlaXRoZXIgUkVBTCBvciBJTlRFR0VSLgotY2xhc3MgbGVmaVByb3BUeXBlIHsKLXB1YmxpYzoKLSAgbGVmaVByb3BUeXBlKCk7Ci0gIHZvaWQgSW5pdCgpOwotCi0gIHZvaWQgRGVzdHJveSgpOwotICB+bGVmaVByb3BUeXBlKCk7Ci0KLSAgdm9pZCBzZXRQcm9wVHlwZShjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyIHR5cGUpOwotICB2b2lkIENsZWFyKCk7Ci0KLSAgY29uc3QgY2hhciBwcm9wVHlwZShjaGFyKiBuYW1lKSBjb25zdDsKLSAgdm9pZCBidW1wUHJvcHMoKTsKLQotcHJvdGVjdGVkOgotICBpbnQgICAgbnVtUHJvcGVydGllc187Ci0gIGludCAgICBwcm9wZXJ0aWVzQWxsb2NhdGVkXzsKLSAgY2hhcioqIHByb3BOYW1lc187ICAgICAgLy8gbmFtZS4KLSAgY2hhciogIHByb3BUeXBlc187ICAgICAgLy8gJ1InID09ICJSRUFMIiwgJ0knID09ICJJTlRFR0VSIgotfTsKLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLVVTRV9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaVRCRXh0LmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaVRCRXh0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY1MDBiZS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlUQkV4dC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiAtIDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpbmNsdWRlICJsZWZpS1JEZWZzLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotc3RhdGljIGNoYXIgdGFnTmFtZVsyMDBdID0gIkNETkRFU1lTIjsKLXN0YXRpYyBjaGFyIHRhZ051bVsyNF0gPSAiQ0ROQ0hLU00iOwotCi10aW1lX3QKLWxlZmlDYWxjVGltZSgpCi17Ci0gICAgLy8gQ2FsY3VsYXRlIHRoZSBudW1iZXIgZm9yIHRoZSBnaXZlbiBkYXRlCi0gICAgLy8gVGhlIGRhdGUgaXMgNS8xLzk5Ci0KLSAgICAvKiBVc2VkIHRvIGNhbGN1bGF0ZSB0aGUgVVRDIGZvciBhIHRpbWUgYm9tYiBkYXRlIGluIGxpYmNhaS5hCi0gICAgKiogc2VlIGNhaUluaXRXb3JrKCkgZnVuY3Rpb24KLSAgICAqLwotICAgIHN0cnVjdCB0bSB0czsKLQotICAgIHRzLnRtX3NlYyA9IDA7Ci0gICAgdHMudG1fbWluID0gMDsKLSAgICB0cy50bV9ob3VyID0gMDsKLSAgICB0cy50bV9tZGF5ID0gMTsKLSAgICB0cy50bV9tb24gPSA1OwotICAgIHRzLnRtX3llYXIgPSAxOTk5IC0gMTkwMDsKLSAgICB0cy50bV93ZGF5ID0gMDsKLSAgICB0cy50bV95ZGF5ID0gMDsKLSAgICB0cy50bV9pc2RzdCA9IDA7Ci0KLSAgICAvKgotICAgICAgICBwcmludGYoIk1heSAxLCAxOTk5IGluIFVUQyBpcyAlZFxuIiwgbWt0aW1lKCZ0cykpOwotICAgICAgICB0cy50bV9tZGF5ID0gMjsKLSAgICAgICAgcHJpbnRmKCJNYXkgMiwgMTk5OSBpbiBVVEMgaXMgJWRcbiIsIG1rdGltZSgmdHMpKTsKLSAgICAKLSAgICAgICAgcHJpbnRmKCJSaWdodCBub3cgaXMgJWRcbiIsIHRpbWUoMCkpOwotICAgICovCi0gICAgcmV0dXJuIChta3RpbWUoJnRzKSk7Ci19Ci0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBsZWZpVGltZUJvbWIKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLS8vIENoZWNrIHRoZSBjdXJyZW50IGRhdGUgYWdhaW5zdCB0aGUgZGF0ZSBnaXZlbgotaW50Ci1sZWZpVmFsaWRUaW1lKCkKLXsKLSAgICAvKiAgVGFrZSB0aGUgdGltZWJvbWIgb3V0IGZvciBub3cKLSAgICAgICAgdGltZV90ICAgIGJvbWJUaW1lID0gbGVmaUNhbGNUaW1lKCk7Ci0gICAgICAgIHRpbWVfdCAgICBib21iVGltZSA9IDkyODIyNDAwMDsKLSAgICAgICAgdGltZV90ICAgIGN1clRpbWU7Ci0gICAgCi0gICAgICAgIGN1clRpbWUgPSB0aW1lKCh0aW1lX3QgKilOVUxMKTsKLSAgICAgICAgaWYgKGN1clRpbWUgPT0gLTEgfHwgY3VyVGltZSA+IGJvbWJUaW1lKQotICAgICAgICB7Ci0gICAgICAgICgpcHJpbnRmKCJUaGUgZGVtb25zdHJhdGlvbiB2ZXJzaW9uIG9mIHRoaXMgY29kZSBpcyBubyBsb25nZXJcbiIKLSAgICAgICAgICAgICAgICAgImF2YWlsYWJsZS4gIFBsZWFzZSBjb250YWN0IHlvdXIgTGVmL0RlZiBQYXJzZXJcbiIKLSAgICAgICAgICAgICAgICAgInNvZnR3YXJlIHByb3ZpZGVyIGZvciB1cCB0byBkYXRlIGNvZGUuXG4iKTsKLSAgICAgICAgcmV0dXJuKDApOwotICAgICAgICB9Ci0gICAgKi8KLSAgICByZXR1cm4gKDEpOwotfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ2hlY2sgaWYgdGhlIGNvbXBhbnkgaXMgYXV0aG9yaXplZCB0byB1c2UgdGhlIHJlYWRlcgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotaW50Ci1sZWZpVmFsaWRVc2VyKCkKLXsKLSAgICBpbnQgaiA9IDAsIGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkgc3RybGVuKHRhZ05hbWUpOyBpKyspIHsKLSAgICAgICAgaiArPSAoaW50KSB0YWdOYW1lW2ldOwotICAgIH0KLQotICAgIGlmIChhdG9pKHRhZ051bSkgPT0gaikKLSAgICAgICAgcmV0dXJuICgxKTsKLSAgICByZXR1cm4gKDApOwotfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gUmV0dXJuIHVzZXIgbmFtZSBmcm9tIHRhZ05hbWUKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLWNoYXIgKgotbGVmaVVzZXIoKQotewotICAgIGNoYXIgKnRtcFVzZXIgPSB0YWdOYW1lOwotICAgIHRtcFVzZXIgPSB0bXBVc2VyICsgODsKLSAgICBpZiAoc3RybmNtcCh0bXBVc2VyLCAiICAgICAiLCA1KSA9PSAwKQotICAgICAgICByZXR1cm4gKChjaGFyKikgIkNhZGVuY2UgRGVzaWduIFN5c3RlbXMiKTsKLSAgICByZXR1cm4gKHRtcFVzZXIpOwotfQotCi0vLyBDb252ZXJ0IHRoZSBvcmllbnQgZnJvbSBpbnRlZ2VyIHRvIHN0cmluZwotLy8KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1jaGFyICoKLWxlZmlPcmllbnRTdHIoaW50IG9yaWVudCkKLXsKLSAgICBzd2l0Y2ggKG9yaWVudCkgewotICAgIGNhc2UgMDoKLSAgICAgICAgcmV0dXJuICgoY2hhciopICJOIik7Ci0gICAgY2FzZSAxOgotICAgICAgICByZXR1cm4gKChjaGFyKikgIlciKTsKLSAgICBjYXNlIDI6Ci0gICAgICAgIHJldHVybiAoKGNoYXIqKSAiUyIpOwotICAgIGNhc2UgMzoKLSAgICAgICAgcmV0dXJuICgoY2hhciopICJFIik7Ci0gICAgY2FzZSA0OgotICAgICAgICByZXR1cm4gKChjaGFyKikgIkZOIik7Ci0gICAgY2FzZSA1OgotICAgICAgICByZXR1cm4gKChjaGFyKikgIkZXIik7Ci0gICAgY2FzZSA2OgotICAgICAgICByZXR1cm4gKChjaGFyKikgIkZTIik7Ci0gICAgY2FzZSA3OgotICAgICAgICByZXR1cm4gKChjaGFyKikgIkZFIik7Ci0gICAgfTsKLSAgICByZXR1cm4gKChjaGFyKikgIiIpOwotfQotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZpVW5pdHMuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZpVW5pdHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWYyZTVjLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaVVuaXRzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI4MyArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyIC0gMjAxMywgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlICJsZXguaCIKLSNpbmNsdWRlICJsZWZpVW5pdHMuaHBwIgotI2luY2x1ZGUgImxlZmlEZWJ1Zy5ocHAiCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBsZWZpVW5pdHMKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLWxlZmlVbml0czo6bGVmaVVuaXRzKCkKLTogaGFzRGF0YWJhc2VfKDApLAotICBoYXNDYXBhY2l0YW5jZV8oMCksCi0gIGhhc1Jlc2lzdGFuY2VfKDApLAotICBoYXNUaW1lXygwKSwKLSAgaGFzUG93ZXJfKDApLAotICBoYXNDdXJyZW50XygwKSwKLSAgaGFzVm9sdGFnZV8oMCksCi0gIGhhc0ZyZXF1ZW5jeV8oMCksCi0gIGRhdGFiYXNlTmFtZV8oTlVMTCksCi0gIGRhdGFiYXNlTnVtYmVyXygwLjApLAotICBjYXBhY2l0YW5jZV8oMC4wKSwKLSAgcmVzaXN0YW5jZV8oMC4wKSwKLSAgcG93ZXJfKDAuMCksCi0gIHRpbWVfKDAuMCksCi0gIGN1cnJlbnRfKDAuMCksCi0gIHZvbHRhZ2VfKDAuMCksCi0gIGZyZXF1ZW5jeV8oMC4wKQotewotICAgIEluaXQoKTsKLX0KLQotdm9pZAotbGVmaVVuaXRzOjpJbml0KCkKLXsKLSAgICBjbGVhcigpOwotfQotCi12b2lkCi1sZWZpVW5pdHM6OkRlc3Ryb3koKQotewotICAgIGNsZWFyKCk7Ci19Ci0KLWxlZmlVbml0czo6fmxlZmlVbml0cygpCi17Ci0gICAgRGVzdHJveSgpOwotfQotCi12b2lkCi1sZWZpVW5pdHM6OnNldERhdGFiYXNlKGNvbnN0IGNoYXIgICAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgIG51bSkKLXsKLSAgICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLSAgICBkYXRhYmFzZU5hbWVfID0gKGNoYXIqKSBsZWZNYWxsb2MobGVuKTsKLSAgICBzdHJjcHkoZGF0YWJhc2VOYW1lXywgQ0FTRShuYW1lKSk7Ci0gICAgZGF0YWJhc2VOdW1iZXJfID0gbnVtOwotICAgIGhhc0RhdGFiYXNlXyA9IDE7Ci19Ci0KLXZvaWQKLWxlZmlVbml0czo6Y2xlYXIoKQotewotICAgIGlmIChkYXRhYmFzZU5hbWVfKQotICAgICAgICBsZWZGcmVlKGRhdGFiYXNlTmFtZV8pOwotICAgIGhhc1RpbWVfID0gMDsKLSAgICBoYXNDYXBhY2l0YW5jZV8gPSAwOwotICAgIGhhc1Jlc2lzdGFuY2VfID0gMDsKLSAgICBoYXNQb3dlcl8gPSAwOwotICAgIGhhc0N1cnJlbnRfID0gMDsKLSAgICBoYXNWb2x0YWdlXyA9IDA7Ci0gICAgaGFzRGF0YWJhc2VfID0gMDsKLSAgICBoYXNGcmVxdWVuY3lfID0gMDsKLSAgICBkYXRhYmFzZU5hbWVfID0gMDsKLX0KLQotdm9pZAotbGVmaVVuaXRzOjpzZXRUaW1lKGRvdWJsZSBudW0pCi17Ci0gICAgaGFzVGltZV8gPSAxOwotICAgIHRpbWVfID0gbnVtOwotfQotCi12b2lkCi1sZWZpVW5pdHM6OnNldENhcGFjaXRhbmNlKGRvdWJsZSBudW0pCi17Ci0gICAgaGFzQ2FwYWNpdGFuY2VfID0gMTsKLSAgICBjYXBhY2l0YW5jZV8gPSBudW07Ci19Ci0KLXZvaWQKLWxlZmlVbml0czo6c2V0UmVzaXN0YW5jZShkb3VibGUgbnVtKQotewotICAgIGhhc1Jlc2lzdGFuY2VfID0gMTsKLSAgICByZXNpc3RhbmNlXyA9IG51bTsKLX0KLQotdm9pZAotbGVmaVVuaXRzOjpzZXRQb3dlcihkb3VibGUgbnVtKQotewotICAgIGhhc1Bvd2VyXyA9IDE7Ci0gICAgcG93ZXJfID0gbnVtOwotfQotCi12b2lkCi1sZWZpVW5pdHM6OnNldEN1cnJlbnQoZG91YmxlIG51bSkKLXsKLSAgICBoYXNDdXJyZW50XyA9IDE7Ci0gICAgY3VycmVudF8gPSBudW07Ci19Ci0KLXZvaWQKLWxlZmlVbml0czo6c2V0Vm9sdGFnZShkb3VibGUgbnVtKQotewotICAgIGhhc1ZvbHRhZ2VfID0gMTsKLSAgICB2b2x0YWdlXyA9IG51bTsKLX0KLQotdm9pZAotbGVmaVVuaXRzOjpzZXRGcmVxdWVuY3koZG91YmxlIG51bSkKLXsKLSAgICBoYXNGcmVxdWVuY3lfID0gMTsKLSAgICBmcmVxdWVuY3lfID0gbnVtOwotfQotCi1pbnQKLWxlZmlVbml0czo6aGFzRGF0YWJhc2UoKSBjb25zdAotewotICAgIHJldHVybiBoYXNEYXRhYmFzZV87Ci19Ci0KLWludAotbGVmaVVuaXRzOjpoYXNDYXBhY2l0YW5jZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc0NhcGFjaXRhbmNlXzsKLX0KLQotaW50Ci1sZWZpVW5pdHM6Omhhc1Jlc2lzdGFuY2UoKSBjb25zdAotewotICAgIHJldHVybiBoYXNSZXNpc3RhbmNlXzsKLX0KLQotaW50Ci1sZWZpVW5pdHM6Omhhc1Bvd2VyKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzUG93ZXJfOwotfQotCi1pbnQKLWxlZmlVbml0czo6aGFzQ3VycmVudCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc0N1cnJlbnRfOwotfQotCi1pbnQKLWxlZmlVbml0czo6aGFzVm9sdGFnZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc1ZvbHRhZ2VfOwotfQotCi1pbnQKLWxlZmlVbml0czo6aGFzRnJlcXVlbmN5KCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzRnJlcXVlbmN5XzsKLX0KLQotaW50Ci1sZWZpVW5pdHM6Omhhc1RpbWUoKSBjb25zdAotewotICAgIHJldHVybiBoYXNUaW1lXzsKLX0KLQotY29uc3QgY2hhciAqCi1sZWZpVW5pdHM6OmRhdGFiYXNlTmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGRhdGFiYXNlTmFtZV87Ci19Ci0KLWRvdWJsZQotbGVmaVVuaXRzOjpkYXRhYmFzZU51bWJlcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGRhdGFiYXNlTnVtYmVyXzsKLX0KLQotZG91YmxlCi1sZWZpVW5pdHM6OmNhcGFjaXRhbmNlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gY2FwYWNpdGFuY2VfOwotfQotCi1kb3VibGUKLWxlZmlVbml0czo6cmVzaXN0YW5jZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJlc2lzdGFuY2VfOwotfQotCi1kb3VibGUKLWxlZmlVbml0czo6cG93ZXIoKSBjb25zdAotewotICAgIHJldHVybiBwb3dlcl87Ci19Ci0KLWRvdWJsZQotbGVmaVVuaXRzOjpjdXJyZW50KCkgY29uc3QKLXsKLSAgICByZXR1cm4gY3VycmVudF87Ci19Ci0KLWRvdWJsZQotbGVmaVVuaXRzOjp0aW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gdGltZV87Ci19Ci0KLWRvdWJsZQotbGVmaVVuaXRzOjp2b2x0YWdlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gdm9sdGFnZV87Ci19Ci0KLWRvdWJsZQotbGVmaVVuaXRzOjpmcmVxdWVuY3koKSBjb25zdAotewotICAgIHJldHVybiBmcmVxdWVuY3lfOwotfQotCi12b2lkCi1sZWZpVW5pdHM6OnByaW50KEZJTEUgKmYpIGNvbnN0Ci17Ci0gICAgZnByaW50ZihmLCAiVW5pdHM6XG4iKTsKLSAgICBpZiAoaGFzVGltZSgpKQotICAgICAgICBmcHJpbnRmKGYsICIgICVnIG5hbm9zZWNvbmRzXG4iLCB0aW1lKCkpOwotICAgIGlmIChoYXNDYXBhY2l0YW5jZSgpKQotICAgICAgICBmcHJpbnRmKGYsICIgICVnIHBpY29mYXJhZHNcbiIsIGNhcGFjaXRhbmNlKCkpOwotICAgIGlmIChoYXNSZXNpc3RhbmNlKCkpCi0gICAgICAgIGZwcmludGYoZiwgIiAgJWcgb2htc1xuIiwgcmVzaXN0YW5jZSgpKTsKLSAgICBpZiAoaGFzUG93ZXIoKSkKLSAgICAgICAgZnByaW50ZihmLCAiICAlZyBtaWxsaXdhdHRzXG4iLCBwb3dlcigpKTsKLSAgICBpZiAoaGFzQ3VycmVudCgpKQotICAgICAgICBmcHJpbnRmKGYsICIgICVnIG1pbGxpYW1wc1xuIiwgY3VycmVudCgpKTsKLSAgICBpZiAoaGFzVm9sdGFnZSgpKQotICAgICAgICBmcHJpbnRmKGYsICIgICVnIHZvbHRzXG4iLCB2b2x0YWdlKCkpOwotICAgIGlmIChoYXNGcmVxdWVuY3koKSkKLSAgICAgICAgZnByaW50ZihmLCAiICAlZyBmcmVxdWVuY3lcbiIsIGZyZXF1ZW5jeSgpKTsKLSAgICBpZiAoaGFzRGF0YWJhc2UoKSkKLSAgICAgICAgZnByaW50ZihmLCAiICAlcyAlZ1xuIiwgZGF0YWJhc2VOYW1lKCksCi0gICAgICAgICAgICAgICAgZGF0YWJhc2VOdW1iZXIoKSk7Ci19Ci0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlVbml0cy5ocHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlVbml0cy5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYjY3ZTYuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZpVW5pdHMuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTIgLSAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2lmbmRlZiBsZWZpVW5pdHNfaAotI2RlZmluZSBsZWZpVW5pdHNfaAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJsZWZpS1JEZWZzLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotY2xhc3MgbGVmaVVuaXRzIHsKLXB1YmxpYzoKLSAgbGVmaVVuaXRzKCk7Ci0gIHZvaWQgSW5pdCgpOwotCi0gIHZvaWQgRGVzdHJveSgpOwotICB+bGVmaVVuaXRzKCk7Ci0KLSAgdm9pZCBzZXREYXRhYmFzZShjb25zdCBjaGFyKiBuYW1lLCBkb3VibGUgbnVtKTsKLSAgdm9pZCBjbGVhcigpOwotICB2b2lkIHNldFRpbWUoZG91YmxlIG51bSk7Ci0gIHZvaWQgc2V0Q2FwYWNpdGFuY2UoZG91YmxlIG51bSk7Ci0gIHZvaWQgc2V0UmVzaXN0YW5jZShkb3VibGUgbnVtKTsKLSAgdm9pZCBzZXRQb3dlcihkb3VibGUgbnVtKTsKLSAgdm9pZCBzZXRDdXJyZW50KGRvdWJsZSBudW0pOwotICB2b2lkIHNldFZvbHRhZ2UoZG91YmxlIG51bSk7Ci0gIHZvaWQgc2V0RnJlcXVlbmN5KGRvdWJsZSBudW0pOwotCi0gIGludCBoYXNEYXRhYmFzZSgpIGNvbnN0OwotICBpbnQgaGFzQ2FwYWNpdGFuY2UoKWNvbnN0OwotICBpbnQgaGFzUmVzaXN0YW5jZSgpIGNvbnN0OwotICBpbnQgaGFzVGltZSgpIGNvbnN0OwotICBpbnQgaGFzUG93ZXIoKSBjb25zdDsKLSAgaW50IGhhc0N1cnJlbnQoKSBjb25zdDsKLSAgaW50IGhhc1ZvbHRhZ2UoKSBjb25zdDsKLSAgaW50IGhhc0ZyZXF1ZW5jeSgpIGNvbnN0OwotCi0gIGNvbnN0IGNoYXIqIGRhdGFiYXNlTmFtZSgpIGNvbnN0OwotICBkb3VibGUgZGF0YWJhc2VOdW1iZXIoKSBjb25zdDsKLSAgZG91YmxlIGNhcGFjaXRhbmNlKCkgY29uc3Q7Ci0gIGRvdWJsZSByZXNpc3RhbmNlKCkgY29uc3Q7Ci0gIGRvdWJsZSB0aW1lKCkgY29uc3Q7Ci0gIGRvdWJsZSBwb3dlcigpIGNvbnN0OwotICBkb3VibGUgY3VycmVudCgpIGNvbnN0OwotICBkb3VibGUgdm9sdGFnZSgpIGNvbnN0OwotICBkb3VibGUgZnJlcXVlbmN5KCkgY29uc3Q7Ci0KLSAgLy8gRGVidWcgcHJpbnQKLSAgdm9pZCBwcmludChGSUxFKiBmKSBjb25zdCA7Ci0KLXByb3RlY3RlZDoKLSAgaW50IGhhc0RhdGFiYXNlXzsKLSAgaW50IGhhc0NhcGFjaXRhbmNlXzsKLSAgaW50IGhhc1Jlc2lzdGFuY2VfOwotICBpbnQgaGFzVGltZV87Ci0gIGludCBoYXNQb3dlcl87Ci0gIGludCBoYXNDdXJyZW50XzsKLSAgaW50IGhhc1ZvbHRhZ2VfOwotICBpbnQgaGFzRnJlcXVlbmN5XzsKLSAgY2hhciogZGF0YWJhc2VOYW1lXzsKLSAgZG91YmxlIGRhdGFiYXNlTnVtYmVyXzsKLSAgZG91YmxlIGNhcGFjaXRhbmNlXzsKLSAgZG91YmxlIHJlc2lzdGFuY2VfOwotICBkb3VibGUgcG93ZXJfOwotICBkb3VibGUgdGltZV87Ci0gIGRvdWJsZSBjdXJyZW50XzsKLSAgZG91YmxlIHZvbHRhZ2VfOwotICBkb3VibGUgZnJlcXVlbmN5XzsKLX07Ci0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1VU0VfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlVc2VyLmhwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaVVzZXIuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDczOTQ0Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaVVzZXIuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiAtIDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0vLyAgVXNlciBoZWFkZXIgZmlsZSBmb3IgdGhlIExFRiBJbnRlcmZhY2UuICBUaGlzIGluY2x1ZGVzCi0vLyAgYWxsIG9mIHRoZSBoZWFkZXIgZmlsZXMgd2hpY2ggYXJlIHJlbGV2YW50IHRvIGJvdGggdGhlCi0vLyAgcmVhZGVyIGFuZCB0aGUgd3JpdGVyLgotLy8gCi0vLyAgbGVmclJlYWRlci5oIGFuZCBsZWZ3V3JpdGVyLmggaW5jbHVkZSB0aGlzIGZpbGUsIHNvIHRoYXQKLS8vICBhbiBhcHBsaWNhdGlvbiBvbmx5IG5lZWRzIHRvIGluY2x1ZGUgZWl0aGVyIGxlZnJSZWFkZXIuaChwcCkKLS8vICBvciBsZWZ3V3JpdGVyLmgocHApLgotLy8gCi0KLSNpZm5kZWYgTEVGSV9VU0VSX0gKLSNkZWZpbmUgTEVGSV9VU0VSX0gKLQotI2luY2x1ZGUgImxlZmlEZWJ1Zy5ocHAiCi0jaW5jbHVkZSAibGVmaVVuaXRzLmhwcCIKLSNpbmNsdWRlICJsZWZpTGF5ZXIuaHBwIgotI2luY2x1ZGUgImxlZmlWaWEuaHBwIgotI2luY2x1ZGUgImxlZmlWaWFSdWxlLmhwcCIKLSNpbmNsdWRlICJsZWZpTWlzYy5ocHAiCi0jaW5jbHVkZSAibGVmaU5vbkRlZmF1bHQuaHBwIgotI2luY2x1ZGUgImxlZmlNYWNyby5ocHAiCi0jaW5jbHVkZSAibGVmaUFycmF5LmhwcCIKLSNpbmNsdWRlICJsZWZpQ3Jvc3NUYWxrLmhwcCIKLSNpbmNsdWRlICJsZWZpUHJvcC5ocHAiCi0jaW5jbHVkZSAibGVmaVByb3BUeXBlLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotLy8gTkVXIENBTExCQUNLIGFkZCB0aGUgcmVmZXJlbmNlIGhlcmUgCi0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1VU0VfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlVdGlsLmhwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaVV0aWwuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDk0ZjgyLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaVV0aWwuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiAtIDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaWZuZGVmIGxlZmlVdGlsX2gKLSNkZWZpbmUgbGVmaVV0aWxfaAotCi0jaW5jbHVkZSAibGVmaUtSRGVmcy5ocHAiCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLS8vIFN0cnVjdHVyZSB0byByZXR1cm4gTWFjcm8gZGF0YSB0byBGRQotc3RydWN0IGxlZmlQb2ludHMgewotICBkb3VibGUgeDsKLSAgZG91YmxlIHk7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBsZWZpUG9pbnRzIGxlZmlOdW07Ci0KLS8vaW50IGxlZmlWYWxpZFRpbWUoKTsKLWV4dGVybiBpbnQgbGVmaVZhbGlkVXNlcigpOwotCi1leHRlcm4gY2hhciogbGVmaVVzZXIoKTsKLQotZXh0ZXJuIGNoYXIqIGxlZmlPcmllbnRTdHIoaW50IG9yaWVudCk7Ci0KLWV4dGVybiBkb3VibGUgY29udmVydF9uYW1lMm51bShjb25zdCBjaGFyICp2ZXJzaW9uTmFtZSk7Ci0KLWV4dGVybiBib29sICB2YWxpZGF0ZU1hc2tOdW1iZXIoaW50IG51bSk7Ci0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1VU0VfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaVZpYS5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlWaWEuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTA0NmY1Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmaVZpYS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYwICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTIgLSAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgImxleC5oIgotI2luY2x1ZGUgImxlZmlWaWEuaHBwIgotI2luY2x1ZGUgImxlZmlEZWJ1Zy5ocHAiCi0jaW5jbHVkZSAibGVmaVV0aWwuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gbGVmaVZpYUxheWVyCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1sZWZpVmlhTGF5ZXI6OmxlZmlWaWFMYXllcigpCi06IG5hbWVfKE5VTEwpLAotICByZWN0Q29sb3JNYXNrXyhOVUxMKSwKLSAgcG9seUNvbG9yTWFza18oTlVMTCksCi0gIG51bVJlY3RzXygwKSwKLSAgcmVjdHNBbGxvY2F0ZWRfKDApLAotICB4bF8oTlVMTCksCi0gIHlsXyhOVUxMKSwKLSAgeGhfKE5VTEwpLAotICB5aF8oTlVMTCksCi0gIG51bVBvbHlzXygwKSwKLSAgcG9seXNBbGxvY2F0ZWRfKDApLAotICBwb2x5Z29uc18oTlVMTCkKLXsKLSAgICBJbml0KCk7Ci19Ci0KLXZvaWQKLWxlZmlWaWFMYXllcjo6SW5pdCgpCi17Ci0gICAgbmFtZV8gPSAwOwotICAgIHJlY3RzQWxsb2NhdGVkXyA9IDI7Ci0gICAgbnVtUmVjdHNfID0gMDsKLSAgICByZWN0Q29sb3JNYXNrXyA9IChpbnQqKSBsZWZNYWxsb2Moc2l6ZW9mKGludCkgKiAyKTsKLSAgICBwb2x5Q29sb3JNYXNrXyA9IChpbnQqKSBsZWZNYWxsb2Moc2l6ZW9mKGludCkgKiAyKTsKLSAgICB4bF8gPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogMik7Ci0gICAgeWxfID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIDIpOwotICAgIHhoXyA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiAyKTsKLSAgICB5aF8gPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogMik7Ci0gICAgcG9seXNBbGxvY2F0ZWRfID0gMjsKLSAgICBudW1Qb2x5c18gPSAwOwotICAgIHBvbHlnb25zXyA9ICgobGVmaUdlb21Qb2x5Z29uKiopCi0gICAgICAgICAgICAgICAgIGxlZk1hbGxvYyhzaXplb2YobGVmaUdlb21Qb2x5Z29uKikgKiAyKSk7Ci19Ci0KLXZvaWQKLWxlZmlWaWFMYXllcjo6RGVzdHJveSgpCi17Ci0gICAgaWYgKHhsXykgewotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHhsXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHlsXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHhoXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHloXykpOwotICAgIH0KLSAgICBpZiAocG9seWdvbnNfKSB7Ci0gICAgICAgIGxlZmlHZW9tUG9seWdvbiAqZ2VvbTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Qb2x5c187IGkrKykgewotICAgICAgICAgICAgZ2VvbSA9IHBvbHlnb25zX1tpXTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoZ2VvbS0+eCkpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChnZW9tLT55KSk7Ci0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKHBvbHlnb25zX1tpXSkpOwotICAgICAgICB9Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAocG9seWdvbnNfKSk7Ci0KLSAgICAgICAgcG9seWdvbnNfID0gMDsKLSAgICAgICAgbnVtUG9seXNfID0gMDsKLSAgICB9Ci0KLSAgICBsZWZGcmVlKG5hbWVfKTsKLSAgICBsZWZGcmVlKChjaGFyKikgKHJlY3RDb2xvck1hc2tfKSk7Ci0gICAgbGVmRnJlZSgoY2hhciopIChwb2x5Q29sb3JNYXNrXykpOwotfQotCi1sZWZpVmlhTGF5ZXI6On5sZWZpVmlhTGF5ZXIoKQotewotICAgIERlc3Ryb3koKTsKLX0KLQotdm9pZAotbGVmaVZpYUxheWVyOjpzZXROYW1lKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgaW50IGxlbiA9IHN0cmxlbihuYW1lKSArIDE7Ci0gICAgbmFtZV8gPSAoY2hhciopIGxlZk1hbGxvYyhsZW4pOwotICAgIHN0cmNweShuYW1lXywgQ0FTRShuYW1lKSk7Ci19Ci0KLXZvaWQKLWxlZmlWaWFMYXllcjo6YWRkUmVjdChpbnQgICAgICAgY29sb3JNYXNrLAotICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICB4bCwKLSAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgeWwsCi0gICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgIHhoLAotICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICB5aCkKLXsKLSAgICBpZiAobnVtUmVjdHNfID09IHJlY3RzQWxsb2NhdGVkXykgewotICAgICAgICBpbnQgICAgIGk7Ci0gICAgICAgIGRvdWJsZSAgKm5ld3hsOwotICAgICAgICBkb3VibGUgICpuZXd5bDsKLSAgICAgICAgZG91YmxlICAqbmV3eGg7Ci0gICAgICAgIGRvdWJsZSAgKm5ld3loOwotICAgICAgICBpbnQgICAgICpyZWN0TWFzazsKLQotICAgICAgICByZWN0c0FsbG9jYXRlZF8gPSAocmVjdHNBbGxvY2F0ZWRfID09IDApID8KLSAgICAgICAgICAgIDIgOiByZWN0c0FsbG9jYXRlZF8gKiAyOwotICAgICAgICBuZXd4bCA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiByZWN0c0FsbG9jYXRlZF8pOwotICAgICAgICBuZXd5bCA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiByZWN0c0FsbG9jYXRlZF8pOwotICAgICAgICBuZXd4aCA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiByZWN0c0FsbG9jYXRlZF8pOwotICAgICAgICBuZXd5aCA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiByZWN0c0FsbG9jYXRlZF8pOwotICAgICAgICByZWN0TWFzayA9IChpbnQqKSBsZWZNYWxsb2Moc2l6ZW9mKGludCkgKiByZWN0c0FsbG9jYXRlZF8pOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1SZWN0c187IGkrKykgewotICAgICAgICAgICAgbmV3eGxbaV0gPSB4bF9baV07Ci0gICAgICAgICAgICBuZXd5bFtpXSA9IHlsX1tpXTsKLSAgICAgICAgICAgIG5ld3hoW2ldID0geGhfW2ldOwotICAgICAgICAgICAgbmV3eWhbaV0gPSB5aF9baV07Ci0gICAgICAgICAgICByZWN0TWFza1tpXSA9IHJlY3RDb2xvck1hc2tfW2ldOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHhsXykgewotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopICh4bF8pKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoeWxfKSk7Ci0gICAgICAgICAgICBsZWZGcmVlKChjaGFyKikgKHhoXykpOwotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopICh5aF8pKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAocmVjdENvbG9yTWFza18pKTsKLSAgICAgICAgfQotCi0gICAgICAgIHhsXyA9IG5ld3hsOwotICAgICAgICB5bF8gPSBuZXd5bDsKLSAgICAgICAgeGhfID0gbmV3eGg7Ci0gICAgICAgIHloXyA9IG5ld3loOwotICAgICAgICByZWN0Q29sb3JNYXNrXyA9IHJlY3RNYXNrOwotICAgIH0KLQotICAgIHhsX1tudW1SZWN0c19dID0geGw7Ci0gICAgeWxfW251bVJlY3RzX10gPSB5bDsKLSAgICB4aF9bbnVtUmVjdHNfXSA9IHhoOwotICAgIHloX1tudW1SZWN0c19dID0geWg7Ci0gICAgcmVjdENvbG9yTWFza19bbnVtUmVjdHNfXSA9IGNvbG9yTWFzazsKLQotICAgIG51bVJlY3RzXyArPSAxOwotfQotCi12b2lkCi1sZWZpVmlhTGF5ZXI6OmFkZFBvbHkoaW50ICAgICAgICAgICAgICAgY29sb3JNYXNrLAotICAgICAgICAgICAgICAgICAgICAgIGxlZmlHZW9tZXRyaWVzICAgICpnZW9tKQotewotICAgIGlmIChudW1Qb2x5c18gPT0gcG9seXNBbGxvY2F0ZWRfKSB7Ci0gICAgICAgIGludCAgICAgICAgICAgICBpOwotICAgICAgICBsZWZpR2VvbVBvbHlnb24gKipwb2x5OwotICAgICAgICBpbnQgICAgICAgICAgICAgKnBvbHlNYXNrOwotCi0gICAgICAgIHBvbHlzQWxsb2NhdGVkXyA9IChwb2x5c0FsbG9jYXRlZF8gPT0gMCkgPwotICAgICAgICAgICAgMiA6IHBvbHlzQWxsb2NhdGVkXyAqIDI7Ci0gICAgICAgIHBvbHkgPSAobGVmaUdlb21Qb2x5Z29uKiopIGxlZk1hbGxvYyhzaXplb2YobGVmaUdlb21Qb2x5Z29uKikgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9seXNBbGxvY2F0ZWRfKTsKLSAgICAgICAgcG9seU1hc2sgPSAoaW50KikgbGVmTWFsbG9jKHNpemVvZihpbnQpICogcG9seXNBbGxvY2F0ZWRfKTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUG9seXNfOyBpKyspIHsKLSAgICAgICAgICAgIHBvbHlbaV0gPSBwb2x5Z29uc19baV07Ci0gICAgICAgICAgICBwb2x5TWFza1tpXSA9IHBvbHlDb2xvck1hc2tfW2ldOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBvbHlnb25zXykgewotICAgICAgICAgICAgbGVmRnJlZSgoY2hhciopIChwb2x5Z29uc18pKTsKLSAgICAgICAgICAgIGxlZkZyZWUoKGNoYXIqKSAocG9seUNvbG9yTWFza18pKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBvbHlnb25zXyA9IHBvbHk7Ci0gICAgICAgIHBvbHlDb2xvck1hc2tfID0gcG9seU1hc2s7Ci0gICAgfQotCi0gICAgcG9seWdvbnNfW251bVBvbHlzX10gPSBnZW9tLT5nZXRQb2x5Z29uKDApOwotICAgIHBvbHlDb2xvck1hc2tfW251bVBvbHlzX10gPSBjb2xvck1hc2s7Ci0KLSAgICBudW1Qb2x5c18gKz0gMTsKLX0KLQotaW50Ci1sZWZpVmlhTGF5ZXI6Om51bVJlY3RzKCkKLXsKLSAgICByZXR1cm4gbnVtUmVjdHNfOwotfQotCi1pbnQKLWxlZmlWaWFMYXllcjo6bnVtUG9seWdvbnMoKQotewotICAgIHJldHVybiBudW1Qb2x5c187Ci19Ci0KLWxlZmlWaWFMYXllciAqCi1sZWZpVmlhTGF5ZXI6OmNsb25lKCkKLXsKLSAgICBsZWZpVmlhTGF5ZXIgICAgKnZsID0gKGxlZmlWaWFMYXllciopIGxlZk1hbGxvYyhzaXplb2YobGVmaVZpYUxheWVyKSk7Ci0gICAgaW50ICAgICAgICAgICAgIGksIGo7Ci0gICAgaWYgKG51bVJlY3RzXyA+IDApIHsKLSAgICAgICAgdmwtPnhsXyA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBudW1SZWN0c18pOwotICAgICAgICB2bC0+eWxfID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIG51bVJlY3RzXyk7Ci0gICAgICAgIHZsLT54aF8gPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICogbnVtUmVjdHNfKTsKLSAgICAgICAgdmwtPnloXyA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBudW1SZWN0c18pOwotICAgICAgICB2bC0+cmVjdENvbG9yTWFza18gPSAoaW50KikgbGVmTWFsbG9jKHNpemVvZihpbnQpICogbnVtUmVjdHNfKTsKLSAgICAgICAgdmwtPm51bVJlY3RzXyA9IG51bVJlY3RzXzsKLSAgICAgICAgdmwtPnJlY3RzQWxsb2NhdGVkXyA9IHJlY3RzQWxsb2NhdGVkXzsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUmVjdHNfOyBpKyspIHsKLSAgICAgICAgICAgIHZsLT54bF9baV0gPSB4bF9baV07Ci0gICAgICAgICAgICB2bC0+eWxfW2ldID0geWxfW2ldOwotICAgICAgICAgICAgdmwtPnhoX1tpXSA9IHhoX1tpXTsKLSAgICAgICAgICAgIHZsLT55aF9baV0gPSB5aF9baV07Ci0gICAgICAgICAgICB2bC0+cmVjdENvbG9yTWFza19baV0gPSByZWN0Q29sb3JNYXNrX1tpXTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZsLT54bF8gPSAwOwotICAgICAgICB2bC0+eWxfID0gMDsKLSAgICAgICAgdmwtPnhoXyA9IDA7Ci0gICAgICAgIHZsLT55aF8gPSAwOwotICAgICAgICB2bC0+cmVjdENvbG9yTWFza18gPSAwOwotICAgICAgICB2bC0+bnVtUmVjdHNfID0gbnVtUmVjdHNfOwotICAgICAgICB2bC0+cmVjdHNBbGxvY2F0ZWRfID0gcmVjdHNBbGxvY2F0ZWRfOwotICAgIH0KLQotICAgIHZsLT5udW1Qb2x5c18gPSBudW1Qb2x5c187Ci0gICAgdmwtPnBvbHlzQWxsb2NhdGVkXyA9IHBvbHlzQWxsb2NhdGVkXzsKLSAgICB2bC0+cG9seWdvbnNfID0gKGxlZmlHZW9tUG9seWdvbioqKQotICAgICAgICBsZWZNYWxsb2Moc2l6ZW9mKGxlZmlHZW9tUG9seWdvbiopICogcG9seXNBbGxvY2F0ZWRfKTsKLQotICAgIGlmIChudW1Qb2x5c18gPiAwKSB7Ci0gICAgICAgIHZsLT5wb2x5Q29sb3JNYXNrXyA9IChpbnQqKSBsZWZNYWxsb2Moc2l6ZW9mKGludCkgKiBudW1Qb2x5c18pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZsLT5wb2x5Q29sb3JNYXNrXyA9IDA7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IG51bVBvbHlzXzsgaSsrKSB7Ci0gICAgICAgIHZsLT5wb2x5Z29uc19baV0gPSAobGVmaUdlb21Qb2x5Z29uKikgbGVmTWFsbG9jKHNpemVvZihsZWZpR2VvbVBvbHlnb24pKTsKLSAgICAgICAgdmwtPnBvbHlnb25zX1tpXS0+bnVtUG9pbnRzID0gcG9seWdvbnNfW2ldLT5udW1Qb2ludHM7Ci0gICAgICAgIHZsLT5wb2x5Z29uc19baV0tPnggPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9seWdvbnNfW2ldLT5udW1Qb2ludHMpOwotICAgICAgICB2bC0+cG9seWdvbnNfW2ldLT55ID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbHlnb25zX1tpXS0+bnVtUG9pbnRzKTsKLSAgICAgICAgdmwtPnBvbHlnb25zX1tpXS0+Y29sb3JNYXNrID0gcG9seWdvbnNfW2ldLT5jb2xvck1hc2s7Ci0gICAgICAgIHZsLT5wb2x5Q29sb3JNYXNrX1tpXSA9IHBvbHlDb2xvck1hc2tfW2ldOwotCi0gICAgICAgIGZvciAoaiA9IDA7IGogPCBwb2x5Z29uc19baV0tPm51bVBvaW50czsgaisrKSB7Ci0gICAgICAgICAgICB2bC0+cG9seWdvbnNfW2ldLT54W2pdID0gcG9seWdvbnNfW2ldLT54W2pdOwotICAgICAgICAgICAgdmwtPnBvbHlnb25zX1tpXS0+eVtqXSA9IHBvbHlnb25zX1tpXS0+eVtqXTsKLSAgICAgICAgfQotICAgICAgICAvKgotICAgICAgICAgICAgdmwtPnBvbHlnb25zX1tpXSA9ICBwb2x5Z29uc19baV07Ci0gICAgICAgICovCi0gICAgfQotICAgIHZsLT5uYW1lXyA9IChjaGFyKikgbGVmTWFsbG9jKHN0cmxlbihuYW1lXykgKyAxKTsKLSAgICBzdHJjcHkodmwtPm5hbWVfLCBuYW1lXyk7Ci0gICAgcmV0dXJuIHZsOwotfQotCi1jaGFyICoKLWxlZmlWaWFMYXllcjo6bmFtZSgpCi17Ci0gICAgcmV0dXJuIG5hbWVfOwotfQotCi1pbnQKLWxlZmlWaWFMYXllcjo6cmVjdENvbG9yTWFzayhpbnQgaW5kZXgpCi17Ci0gICAgY2hhciBtc2dbMTYwXTsKLQotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtUmVjdHNfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTQyMCk6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBWSUEgTEFZRVIgUkVDVEFOR0xFIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQiLCBpbmRleCwgbnVtUmVjdHNfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDE0MjAsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiByZWN0Q29sb3JNYXNrX1tpbmRleF07Ci19Ci0KLWludAotbGVmaVZpYUxheWVyOjpwb2x5Q29sb3JNYXNrKGludCBpbmRleCkKLXsKLSAgICBjaGFyIG1zZ1sxNjBdOwotCi0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1Qb2x5c18pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xNDIwKTogVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIFZJQSBMQVlFUiBQT0xZR09OIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQiLCBpbmRleCwgbnVtUG9seXNfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDE0MjAsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiBwb2x5Q29sb3JNYXNrX1tpbmRleF07Ci19Ci0KLWRvdWJsZQotbGVmaVZpYUxheWVyOjp4bChpbnQgaW5kZXgpCi17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVJlY3RzXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTE0MjApOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgVklBIExBWUVSIFJFQ1RBTkdMRSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bVJlY3RzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxNDIwLCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHhsX1tpbmRleF07Ci19Ci0KLWRvdWJsZQotbGVmaVZpYUxheWVyOjp5bChpbnQgaW5kZXgpCi17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVJlY3RzXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTE0MjApOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgVklBIExBWUVSIFJFQ1RBTkdMRSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bVJlY3RzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxNDIwLCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHlsX1tpbmRleF07Ci19Ci0KLWRvdWJsZQotbGVmaVZpYUxheWVyOjp4aChpbnQgaW5kZXgpCi17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVJlY3RzXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTE0MjApOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgVklBIExBWUVSIFJFQ1RBTkdMRSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bVJlY3RzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxNDIwLCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHhoX1tpbmRleF07Ci19Ci0KLWRvdWJsZQotbGVmaVZpYUxheWVyOjp5aChpbnQgaW5kZXgpCi17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVJlY3RzXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTE0MjApOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgVklBIExBWUVSIFJFQ1RBTkdMRSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bVJlY3RzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxNDIwLCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHloX1tpbmRleF07Ci19Ci0KLWxlZmlHZW9tUG9seWdvbiAqCi1sZWZpVmlhTGF5ZXI6OmdldFBvbHlnb24oaW50IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiBwb2x5Z29uc19baW5kZXhdOwotfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gbGVmaVZpYQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotbGVmaVZpYTo6bGVmaVZpYSgpCi06IG5hbWVfKE5VTEwpLAotICBuYW1lU2l6ZV8oMCksCi0gIGhhc0RlZmF1bHRfKDApLAotICBoYXNHZW5lcmF0ZWRfKDApLAotICBoYXNSZXNpc3RhbmNlXygwKSwKLSAgaGFzRm9yZWlnblBudF8oMCksCi0gIGhhc1RvcE9mU3RhY2tfKDApLAotICBudW1Qcm9wc18oMCksCi0gIHByb3BzQWxsb2NhdGVkXygwKSwKLSAgcHJvcE5hbWVfKE5VTEwpLAotICBwcm9wVmFsdWVfKE5VTEwpLAotICBwcm9wRFZhbHVlXyhOVUxMKSwKLSAgcHJvcFR5cGVfKE5VTEwpLAotICBudW1MYXllcnNfKDApLAotICBsYXllcnNBbGxvY2F0ZWRfKDApLAotICBsYXllcnNfKE5VTEwpLAotICByZXNpc3RhbmNlXygwLjApLAotICBmb3JlaWduXyhOVUxMKSwKLSAgZm9yZWlnblhfKDAuMCksCi0gIGZvcmVpZ25ZXygwLjApLAotICBmb3JlaWduT3JpZW50XygwKSwKLSAgdmlhUnVsZU5hbWVfKE5VTEwpLAotICB4U2l6ZV8oMC4wKSwKLSAgeVNpemVfKDAuMCksCi0gIGJvdExheWVyXyhOVUxMKSwKLSAgY3V0TGF5ZXJfKE5VTEwpLAotICB0b3BMYXllcl8oTlVMTCksCi0gIHhTcGFjaW5nXygwLjApLAotICB5U3BhY2luZ18oMC4wKSwKLSAgeEJvdEVuY18oMC4wKSwKLSAgeUJvdEVuY18oMC4wKSwKLSAgeFRvcEVuY18oMC4wKSwKLSAgeVRvcEVuY18oMC4wKSwKLSAgbnVtUm93c18oMCksCi0gIG51bUNvbHNfKDApLAotICB4T2Zmc2V0XygwLjApLAotICB5T2Zmc2V0XygwLjApLAotICB4Qm90T3NfKDAuMCksCi0gIHlCb3RPc18oMC4wKSwKLSAgeFRvcE9zXygwLjApLAotICB5VG9wT3NfKDAuMCksCi0gIGN1dFBhdHRlcm5fKE5VTEwpCi17Ci0gICAgSW5pdCgpOwotfQotCi12b2lkCi1sZWZpVmlhOjpJbml0KCkKLXsKLSAgICBuYW1lU2l6ZV8gPSAxNjsKLSAgICBuYW1lXyA9IChjaGFyKikgbGVmTWFsbG9jKDE2KTsKLSAgICBmb3JlaWduXyA9IDA7Ci0gICAgbnVtUHJvcHNfID0gMDsKLSAgICBwcm9wc0FsbG9jYXRlZF8gPSAwOwotICAgIGxheWVyc0FsbG9jYXRlZF8gPSAzOwotICAgIGxheWVyc18gPSAobGVmaVZpYUxheWVyKiopIGxlZk1hbGxvYyhzaXplb2YobGVmaVZpYUxheWVyKikgKiAzKTsKLSAgICBudW1MYXllcnNfID0gMDsKLSAgICBjbGVhcigpOwotICAgIHZpYVJ1bGVOYW1lXyA9IDA7Ci19Ci0KLXZvaWQKLWxlZmlWaWE6OkRlc3Ryb3koKQotewotICAgIGNsZWFyKCk7Ci0gICAgbGVmRnJlZShuYW1lXyk7Ci0gICAgaWYgKGxheWVyc18pCi0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAobGF5ZXJzXykpOwotICAgIGxheWVyc18gPSAwOwotICAgIGlmIChwcm9wTmFtZV8pCi0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAocHJvcE5hbWVfKSk7Ci0gICAgaWYgKHByb3BWYWx1ZV8pCi0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAocHJvcFZhbHVlXykpOwotICAgIGlmIChwcm9wRFZhbHVlXykKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChwcm9wRFZhbHVlXykpOwotICAgIGlmIChwcm9wVHlwZV8pCi0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAocHJvcFR5cGVfKSk7Ci0gICAgaWYgKHZpYVJ1bGVOYW1lXykKLSAgICAgICAgbGVmRnJlZSgoY2hhciopICh2aWFSdWxlTmFtZV8pKTsKLSAgICBpZiAoYm90TGF5ZXJfKQotICAgICAgICBsZWZGcmVlKChjaGFyKikgKGJvdExheWVyXykpOwotICAgIGlmIChjdXRMYXllcl8pCi0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoY3V0TGF5ZXJfKSk7Ci0gICAgaWYgKHRvcExheWVyXykKLSAgICAgICAgbGVmRnJlZSgoY2hhciopICh0b3BMYXllcl8pKTsKLSAgICBpZiAoY3V0UGF0dGVybl8pCi0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAoY3V0UGF0dGVybl8pKTsKLSAgICBwcm9wTmFtZV8gPSAwOwotICAgIHByb3BWYWx1ZV8gPSAwOwotICAgIHByb3BEVmFsdWVfID0gMDsKLSAgICBwcm9wVHlwZV8gPSAwOwotICAgIHZpYVJ1bGVOYW1lXyA9IDA7Ci0gICAgYm90TGF5ZXJfID0gMDsKLSAgICBjdXRMYXllcl8gPSAwOwotICAgIHRvcExheWVyXyA9IDA7Ci0gICAgY3V0UGF0dGVybl8gPSAwOwotfQotCi1sZWZpVmlhOjp+bGVmaVZpYSgpCi17Ci0gICAgRGVzdHJveSgpOwotfQotCi1sZWZpVmlhICoKLWxlZmlWaWE6OmNsb25lKCkKLXsKLSAgICBpbnQgICAgICAgICAgICAgaTsKLSAgICBsZWZpVmlhTGF5ZXIgICAgKmw7Ci0gICAgbGVmaVZpYSAgICAgICAgICp2ID0gKGxlZmlWaWEqKSBsZWZNYWxsb2Moc2l6ZW9mKGxlZmlWaWEpKTsKLSAgICB2LT5uYW1lU2l6ZV8gPSBzdHJsZW4obmFtZV8pICsgMTsKLSAgICB2LT5uYW1lXyA9IChjaGFyKikgbGVmTWFsbG9jKHYtPm5hbWVTaXplXyk7Ci0gICAgc3RyY3B5KHYtPm5hbWVfLCBuYW1lXyk7Ci0gICAgdi0+Zm9yZWlnbl8gPSAwOwotICAgIGlmIChoYXNGb3JlaWduKCkpIHsKLSAgICAgICAgdi0+c2V0Rm9yZWlnbihmb3JlaWduXywgaGFzRm9yZWlnblBudCgpLAotICAgICAgICAgICAgICAgICAgICAgIGZvcmVpZ25YXywgZm9yZWlnbllfLCBmb3JlaWduT3JpZW50Xyk7Ci0gICAgfQotICAgIHYtPmhhc0RlZmF1bHRfID0gaGFzRGVmYXVsdF87Ci0gICAgdi0+aGFzR2VuZXJhdGVkXyA9IGhhc0dlbmVyYXRlZF87Ci0gICAgdi0+aGFzUmVzaXN0YW5jZV8gPSBoYXNSZXNpc3RhbmNlXzsKLSAgICB2LT5oYXNGb3JlaWduUG50XyA9IGhhc0ZvcmVpZ25QbnRfOwotICAgIHYtPmhhc1RvcE9mU3RhY2tfID0gaGFzVG9wT2ZTdGFja187Ci0gICAgdi0+bnVtUHJvcHNfID0gbnVtUHJvcHNfOwotICAgIHYtPnByb3BzQWxsb2NhdGVkXyA9IG51bVByb3BzXzsKLSAgICBpZiAobnVtUHJvcHNfID4gMCkgewotICAgICAgICB2LT5wcm9wTmFtZV8gPSAoY2hhcioqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIqKSAqIG51bVByb3BzXyk7Ci0gICAgICAgIHYtPnByb3BWYWx1ZV8gPSAoY2hhcioqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIqKSAqIG51bVByb3BzXyk7Ci0gICAgICAgIHYtPnByb3BEVmFsdWVfID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIG51bVByb3BzXyk7Ci0gICAgICAgIHYtPnByb3BUeXBlXyA9IChjaGFyKikgbGVmTWFsbG9jKHNpemVvZihjaGFyKSAqIG51bVByb3BzXyk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1Qcm9wc187IGkrKykgewotICAgICAgICAgICAgdi0+cHJvcE5hbWVfW2ldID0gKGNoYXIqKSBsZWZNYWxsb2Moc3RybGVuKHByb3BOYW1lX1tpXSkgKyAxKTsKLSAgICAgICAgICAgIHN0cmNweSh2LT5wcm9wTmFtZV9baV0sIHByb3BOYW1lX1tpXSk7Ci0gICAgICAgICAgICAvLyBNb2RpZmllZCA4LzI3Lzk5IC0gV2FuZGEgZGEgUm9zYSBmb3IgcGNyIDI3NDg5MQotICAgICAgICAgICAgLy8gcHJvcFZhbHVlX1tpXSBjYW4gYmUgbnVsbCwgaWYgcHJvcFZhbHVlIHdhcyBhIG51bWJlcgotICAgICAgICAgICAgaWYgKHByb3BWYWx1ZV9baV0pIHsKLSAgICAgICAgICAgICAgICB2LT5wcm9wVmFsdWVfW2ldID0gKGNoYXIqKSBsZWZNYWxsb2Moc3RybGVuKHByb3BWYWx1ZV9baV0pICsgMSk7Ci0gICAgICAgICAgICAgICAgc3RyY3B5KHYtPnByb3BWYWx1ZV9baV0sIHByb3BWYWx1ZV9baV0pOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgdi0+cHJvcFZhbHVlX1tpXSA9IDA7Ci0gICAgICAgICAgICB2LT5wcm9wRFZhbHVlX1tpXSA9IHByb3BEVmFsdWVfW2ldOwotICAgICAgICAgICAgdi0+cHJvcFR5cGVfW2ldID0gcHJvcFR5cGVfW2ldOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdi0+cHJvcE5hbWVfID0gMDsKLSAgICAgICAgdi0+cHJvcFZhbHVlXyA9IDA7Ci0gICAgICAgIHYtPnByb3BEVmFsdWVfID0gMDsKLSAgICAgICAgdi0+cHJvcFR5cGVfID0gMDsKLSAgICB9Ci0gICAgdi0+bGF5ZXJzQWxsb2NhdGVkXyA9IGxheWVyc0FsbG9jYXRlZF87Ci0gICAgdi0+bnVtTGF5ZXJzXyA9IG51bUxheWVyc187Ci0gICAgaWYgKG51bUxheWVyc18gPiAwKQotICAgICAgICB2LT5sYXllcnNfID0KLSAgICAgICAgICAgIChsZWZpVmlhTGF5ZXIqKikgbGVmTWFsbG9jKHNpemVvZihsZWZpVmlhTGF5ZXIqKSAqIG51bUxheWVyc18pOwotICAgIGVsc2UgICAvLyBzdGlsbCBtYWxsb2MgdGhlIG1lbW9yeSBiZWNhdXNlIGxlZmlWaWE6OkluaXQgZG9lcwotICAgICAgICB2LT5sYXllcnNfID0KLSAgICAgICAgICAgIChsZWZpVmlhTGF5ZXIqKikgbGVmTWFsbG9jKHNpemVvZihsZWZpVmlhTGF5ZXIqKSAqIDIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1MYXllcnNfOyBpKyspIHsKLSAgICAgICAgbCA9IGxheWVyc19baV07Ci0gICAgICAgIHYtPmxheWVyc19baV0gPSBsLT5jbG9uZSgpOwotICAgIH0KLSAgICB2LT5yZXNpc3RhbmNlXyA9IHJlc2lzdGFuY2VfOwotICAgIGlmIChmb3JlaWduT3JpZW50XyA9PSAwKQotICAgICAgICB2LT5mb3JlaWduT3JpZW50XyA9IC0xOwotICAgIGVsc2UKLSAgICAgICAgdi0+Zm9yZWlnbk9yaWVudF8gPSBmb3JlaWduT3JpZW50XzsKLQotICAgIHYtPnZpYVJ1bGVOYW1lXyA9IDA7Ci0gICAgdi0+Ym90TGF5ZXJfID0gMDsKLSAgICB2LT5jdXRMYXllcl8gPSAwOwotICAgIHYtPnRvcExheWVyXyA9IDA7Ci0gICAgdi0+Y3V0UGF0dGVybl8gPSAwOwotICAgIGlmICh2aWFSdWxlTmFtZV8pCi0gICAgICAgIHYtPnZpYVJ1bGVOYW1lXyA9IHN0cmR1cCh2aWFSdWxlTmFtZV8pOwotICAgIHYtPnhTaXplXyA9IHhTaXplXzsKLSAgICB2LT55U2l6ZV8gPSB5U2l6ZV87Ci0gICAgaWYgKGJvdExheWVyXykKLSAgICAgICAgdi0+Ym90TGF5ZXJfID0gc3RyZHVwKGJvdExheWVyXyk7Ci0gICAgaWYgKGN1dExheWVyXykKLSAgICAgICAgdi0+Y3V0TGF5ZXJfID0gc3RyZHVwKGN1dExheWVyXyk7Ci0gICAgaWYgKHRvcExheWVyXykKLSAgICAgICAgdi0+dG9wTGF5ZXJfID0gc3RyZHVwKHRvcExheWVyXyk7Ci0gICAgdi0+eFNwYWNpbmdfID0geFNwYWNpbmdfOwotICAgIHYtPnlTcGFjaW5nXyA9IHlTcGFjaW5nXzsKLSAgICB2LT54Qm90RW5jXyA9IHhCb3RFbmNfOwotICAgIHYtPnlCb3RFbmNfID0geUJvdEVuY187Ci0gICAgdi0+eFRvcEVuY18gPSB4VG9wRW5jXzsKLSAgICB2LT55VG9wRW5jXyA9IHlUb3BFbmNfOwotICAgIHYtPm51bVJvd3NfID0gbnVtUm93c187Ci0gICAgdi0+bnVtQ29sc18gPSBudW1Db2xzXzsKLSAgICB2LT54T2Zmc2V0XyA9IHhPZmZzZXRfOwotICAgIHYtPnlPZmZzZXRfID0geU9mZnNldF87Ci0gICAgdi0+eEJvdE9zXyA9IHhCb3RPc187Ci0gICAgdi0+eUJvdE9zXyA9IHlCb3RPc187Ci0gICAgdi0+eFRvcE9zXyA9IHhUb3BPc187Ci0gICAgdi0+eVRvcE9zXyA9IHlUb3BPc187Ci0gICAgaWYgKGN1dFBhdHRlcm5fKQotICAgICAgICB2LT5jdXRQYXR0ZXJuXyA9IHN0cmR1cChjdXRQYXR0ZXJuXyk7Ci0KLSAgICByZXR1cm4gdjsKLX0KLQotdm9pZAotbGVmaVZpYTo6Y2xlYXIoKQotewotICAgIGludCBpOwotCi0gICAgaWYgKG5hbWVfKQotICAgICAgICAqKG5hbWVfKSA9ICdcMCc7Ci0gICAgaWYgKGZvcmVpZ25fKQotICAgICAgICBsZWZGcmVlKGZvcmVpZ25fKTsKLSAgICBmb3JlaWduXyA9IDA7Ci0gICAgaGFzRGVmYXVsdF8gPSAwOwotICAgIGhhc0dlbmVyYXRlZF8gPSAwOwotICAgIGhhc1Jlc2lzdGFuY2VfID0gMDsKLSAgICBoYXNGb3JlaWduUG50XyA9IDA7Ci0gICAgaGFzVG9wT2ZTdGFja18gPSAwOwotICAgIGZvcmVpZ25PcmllbnRfID0gLTE7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUHJvcHNfOyBpKyspIHsKLSAgICAgICAgbGVmRnJlZShwcm9wTmFtZV9baV0pOwotICAgICAgICBwcm9wTmFtZV9baV0gPSAwOwotICAgICAgICBpZiAocHJvcFZhbHVlX1tpXSkKLSAgICAgICAgICAgIGxlZkZyZWUocHJvcFZhbHVlX1tpXSk7Ci0gICAgICAgIHByb3BWYWx1ZV9baV0gPSAwOwotICAgICAgICBwcm9wVHlwZV9baV0gPSAnICc7Ci0gICAgfQotICAgIG51bVByb3BzXyA9IDA7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTGF5ZXJzXzsgaSsrKSB7Ci0gICAgICAgIGxheWVyc19baV0tPkRlc3Ryb3koKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChsYXllcnNfW2ldKSk7Ci0gICAgICAgIGxheWVyc19baV0gPSAwOwotICAgIH0KLSAgICBudW1MYXllcnNfID0gMDsKLQotICAgIGlmICh2aWFSdWxlTmFtZV8pCi0gICAgICAgIGxlZkZyZWUodmlhUnVsZU5hbWVfKTsKLSAgICB2aWFSdWxlTmFtZV8gPSAwOwotICAgIHhTaXplXyA9IDA7Ci0gICAgeVNpemVfID0gMDsKLSAgICBpZiAoYm90TGF5ZXJfKQotICAgICAgICBsZWZGcmVlKGJvdExheWVyXyk7Ci0gICAgaWYgKGN1dExheWVyXykKLSAgICAgICAgbGVmRnJlZShjdXRMYXllcl8pOwotICAgIGlmICh0b3BMYXllcl8pCi0gICAgICAgIGxlZkZyZWUodG9wTGF5ZXJfKTsKLSAgICBib3RMYXllcl8gPSAwOwotICAgIGN1dExheWVyXyA9IDA7Ci0gICAgdG9wTGF5ZXJfID0gMDsKLSAgICB4U3BhY2luZ18gPSAwOwotICAgIHlTcGFjaW5nXyA9IDA7Ci0gICAgeEJvdEVuY18gPSAwOwotICAgIHlCb3RFbmNfID0gMDsKLSAgICB4VG9wRW5jXyA9IDA7Ci0gICAgeVRvcEVuY18gPSAwOwotICAgIG51bVJvd3NfID0gMDsKLSAgICBudW1Db2xzXyA9IDA7Ci0gICAgeE9mZnNldF8gPSAwOwotICAgIHlPZmZzZXRfID0gMDsKLSAgICB4Qm90T3NfID0gMDsKLSAgICB5Qm90T3NfID0gMDsKLSAgICB4VG9wT3NfID0gMDsKLSAgICB5VG9wT3NfID0gMDsKLSAgICBpZiAoY3V0UGF0dGVybl8pCi0gICAgICAgIGxlZkZyZWUoY3V0UGF0dGVybl8pOwotICAgIGN1dFBhdHRlcm5fID0gMDsKLX0KLQotdm9pZAotbGVmaVZpYTo6c2V0TmFtZShjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICBpbnQgICAgICAgIHZpYVR5cGUpCi17Ci0gICAgaW50IGxlbjsKLSAgICAvLyBzZXROYW1lIGNhbGxzIGNsZWFyIHRvIGluaXQKLSAgICAvLyBkZWZhdWx0PTAgbm8gZGVmYXVsdCBzcGVjaWZpZWQKLSAgICAvLyBkZWZhdWx0PTEgZGVmYXVsdCBzcGVjaWZpZWQgaW4gbGVmIGZpbGUKLSAgICBjbGVhcigpOwotICAgIHN3aXRjaCAodmlhVHlwZSkgewotICAgIGNhc2UgMToKLSAgICAgICAgaGFzRGVmYXVsdF8gPSAxOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICAgIGhhc0dlbmVyYXRlZF8gPSAxOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotICAgIGlmIChsZW4gPiBuYW1lU2l6ZV8pIHsKLSAgICAgICAgbGVmRnJlZShuYW1lXyk7Ci0gICAgICAgIG5hbWVfID0gKGNoYXIqKSBsZWZNYWxsb2MobGVuKTsKLSAgICAgICAgbmFtZVNpemVfID0gbGVuOwotICAgIH0KLSAgICBzdHJjcHkobmFtZV8sIENBU0UobmFtZSkpOwotCi19Ci0KLXZvaWQKLWxlZmlWaWE6OnNldFJlc2lzdGFuY2UoZG91YmxlIG51bSkKLXsKLSAgICBoYXNSZXNpc3RhbmNlXyA9IDE7Ci0gICAgcmVzaXN0YW5jZV8gPSBudW07Ci19Ci0KLXZvaWQKLWxlZmlWaWE6OmJ1bXBQcm9wcygpCi17Ci0gICAgaW50ICAgICBpOwotICAgIGRvdWJsZSAgKmQ7Ci0gICAgY2hhciAgICAqKm47Ci0gICAgY2hhciAgICAqKnY7Ci0gICAgY2hhciAgICAqdDsKLQotICAgIGlmIChwcm9wc0FsbG9jYXRlZF8gPT0gMCkKLSAgICAgICAgcHJvcHNBbGxvY2F0ZWRfID0gMjsKLSAgICBlbHNlCi0gICAgICAgIHByb3BzQWxsb2NhdGVkXyAqPSAyOwotCi0gICAgZCA9IChkb3VibGUqKSBsZWZNYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBwcm9wc0FsbG9jYXRlZF8pOwotICAgIG4gPSAoY2hhcioqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIqKSAqIHByb3BzQWxsb2NhdGVkXyk7Ci0gICAgdiA9IChjaGFyKiopIGxlZk1hbGxvYyhzaXplb2YoY2hhciopICogcHJvcHNBbGxvY2F0ZWRfKTsKLSAgICB0ID0gKGNoYXIqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIpICogcHJvcHNBbGxvY2F0ZWRfKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBudW1Qcm9wc187IGkrKykgewotICAgICAgICBkW2ldID0gcHJvcERWYWx1ZV9baV07Ci0gICAgICAgIG5baV0gPSBwcm9wTmFtZV9baV07Ci0gICAgICAgIHZbaV0gPSBwcm9wVmFsdWVfW2ldOwotICAgICAgICB0W2ldID0gcHJvcFR5cGVfW2ldOwotICAgIH0KLQotICAgIGlmIChudW1Qcm9wc18gPiAwKSB7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAocHJvcERWYWx1ZV8pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChwcm9wTmFtZV8pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChwcm9wVmFsdWVfKSk7Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAocHJvcFR5cGVfKSk7Ci0gICAgfQotCi0gICAgcHJvcERWYWx1ZV8gPSBkOwotICAgIHByb3BOYW1lXyA9IG47Ci0gICAgcHJvcFZhbHVlXyA9IHY7Ci0gICAgcHJvcFR5cGVfID0gdDsKLX0KLQotdm9pZAotbGVmaVZpYTo6YWRkUHJvcChjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgY29uc3QgY2hhciB0eXBlKQotewotICAgIGludCBsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotCi0gICAgaWYgKG51bVByb3BzXyA9PSBwcm9wc0FsbG9jYXRlZF8pCi0gICAgICAgIGJ1bXBQcm9wcygpOwotCi0gICAgcHJvcE5hbWVfW251bVByb3BzX10gPSAoY2hhciopIGxlZk1hbGxvYyhsZW4pOwotICAgIHN0cmNweShwcm9wTmFtZV9bbnVtUHJvcHNfXSwgQ0FTRShuYW1lKSk7Ci0KLSAgICBsZW4gPSBzdHJsZW4odmFsdWUpICsgMTsKLSAgICBwcm9wVmFsdWVfW251bVByb3BzX10gPSAoY2hhciopIGxlZk1hbGxvYyhsZW4pOwotICAgIHN0cmNweShwcm9wVmFsdWVfW251bVByb3BzX10sIENBU0UodmFsdWUpKTsKLQotICAgIHByb3BEVmFsdWVfW251bVByb3BzX10gPSAwLjA7Ci0KLSAgICBwcm9wVHlwZV9bbnVtUHJvcHNfXSA9IHR5cGU7Ci0KLSAgICBudW1Qcm9wc18gKz0gMTsKLX0KLQotdm9pZAotbGVmaVZpYTo6YWRkTnVtUHJvcChjb25zdCBjaGFyICAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgZCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICB0eXBlKQotewotICAgIGludCBsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotCi0gICAgaWYgKG51bVByb3BzXyA9PSBwcm9wc0FsbG9jYXRlZF8pCi0gICAgICAgIGJ1bXBQcm9wcygpOwotCi0gICAgcHJvcE5hbWVfW251bVByb3BzX10gPSAoY2hhciopIGxlZk1hbGxvYyhsZW4pOwotICAgIHN0cmNweShwcm9wTmFtZV9bbnVtUHJvcHNfXSwgQ0FTRShuYW1lKSk7Ci0KLSAgICBsZW4gPSBzdHJsZW4odmFsdWUpICsgMTsKLSAgICBwcm9wVmFsdWVfW251bVByb3BzX10gPSAoY2hhciopIGxlZk1hbGxvYyhsZW4pOwotICAgIHN0cmNweShwcm9wVmFsdWVfW251bVByb3BzX10sIENBU0UodmFsdWUpKTsKLQotICAgIHByb3BEVmFsdWVfW251bVByb3BzX10gPSBkOwotCi0gICAgcHJvcFR5cGVfW251bVByb3BzX10gPSB0eXBlOwotCi0gICAgbnVtUHJvcHNfICs9IDE7Ci19Ci0KLXZvaWQKLWxlZmlWaWE6OnNldEZvcmVpZ24oY29uc3QgY2hhciAgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGhhc1BudCwKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgeCwKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgeSwKLSAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgb3JpZW50KQotewotICAgIC8vIG9yaWVudD0tMSBtZWFucyBubyBvcmllbnQgd2FzIHNwZWNpZmllZC4KLSAgICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLQotICAgIGhhc0ZvcmVpZ25QbnRfID0gaGFzUG50OwotICAgIGZvcmVpZ25PcmllbnRfID0gb3JpZW50OwotICAgIGZvcmVpZ25YXyA9IHg7Ci0gICAgZm9yZWlnbllfID0geTsKLQotICAgIGZvcmVpZ25fID0gKGNoYXIqKSBsZWZNYWxsb2MobGVuKTsKLSAgICBzdHJjcHkoZm9yZWlnbl8sIENBU0UobmFtZSkpOwotfQotCi12b2lkCi1sZWZpVmlhOjpzZXRUb3BPZlN0YWNrKCkKLXsKLSAgICBoYXNUb3BPZlN0YWNrXyA9IDE7Ci19Ci0KLXZvaWQKLWxlZmlWaWE6OmFkZExheWVyKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgbGVmaVZpYUxheWVyICpuZXdsOwotICAgIGlmIChudW1MYXllcnNfID09IGxheWVyc0FsbG9jYXRlZF8pIHsKLSAgICAgICAgaW50ICAgICAgICAgICAgIGk7Ci0gICAgICAgIGxlZmlWaWFMYXllciAgICAqKmw7Ci0gICAgICAgIGlmIChsYXllcnNBbGxvY2F0ZWRfID09IDApCi0gICAgICAgICAgICBsYXllcnNBbGxvY2F0ZWRfID0gMjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbGF5ZXJzQWxsb2NhdGVkXyAqPSAyOwotICAgICAgICBsID0gKGxlZmlWaWFMYXllcioqKSBsZWZNYWxsb2Moc2l6ZW9mKGxlZmlWaWFMYXllciopICogbGF5ZXJzQWxsb2NhdGVkXyk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1MYXllcnNfOyBpKyspIHsKLSAgICAgICAgICAgIGxbaV0gPSBsYXllcnNfW2ldOwotICAgICAgICB9Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAobGF5ZXJzXykpOwotICAgICAgICBsYXllcnNfID0gbDsKLSAgICB9Ci0gICAgbmV3bCA9IChsZWZpVmlhTGF5ZXIqKSBsZWZNYWxsb2Moc2l6ZW9mKGxlZmlWaWFMYXllcikpOwotICAgIG5ld2wtPkluaXQoKTsKLSAgICBsYXllcnNfW251bUxheWVyc19dID0gbmV3bDsKLSAgICBuZXdsLT5zZXROYW1lKG5hbWUpOwotICAgIG51bUxheWVyc18gKz0gMTsKLX0KLQotdm9pZAotbGVmaVZpYTo6YWRkUmVjdFRvTGF5ZXIoaW50ICAgICBtYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICB4bCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgeWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgIHhoLAotICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICB5aCkKLXsKLSAgICBsYXllcnNfW251bUxheWVyc18gLSAxXS0+YWRkUmVjdChtYXNrLCB4bCwgeWwsIHhoLCB5aCk7Ci19Ci0KLXZvaWQKLWxlZmlWaWE6OmFkZFBvbHlUb0xheWVyKGludCAgICAgICAgICAgICBtYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgbGVmaUdlb21ldHJpZXMgICpnZW9tKQotewotICAgIGxheWVyc19bbnVtTGF5ZXJzXyAtIDFdLT5hZGRQb2x5KG1hc2ssIGdlb20pOwotfQotCi12b2lkCi1sZWZpVmlhOjpzZXRWaWFSdWxlKGNvbnN0IGNoYXIgICp2aWFSdWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgeFNpemUsCi0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgIHlTaXplLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqYm90TGF5ZXIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpjdXRMYXllciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKnRvcExheWVyLAotICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICB4Q3V0LAotICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICB5Q3V0LAotICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICB4Qm90RW5jLAotICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICB5Qm90RW5jLAotICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICB4VG9wRW5jLAotICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICB5VG9wRW5jKQotewotICAgIHZpYVJ1bGVOYW1lXyA9IHN0cmR1cCh2aWFSdWxlTmFtZSk7Ci0gICAgeFNpemVfID0geFNpemU7Ci0gICAgeVNpemVfID0geVNpemU7Ci0gICAgYm90TGF5ZXJfID0gc3RyZHVwKGJvdExheWVyKTsKLSAgICBjdXRMYXllcl8gPSBzdHJkdXAoY3V0TGF5ZXIpOwotICAgIHRvcExheWVyXyA9IHN0cmR1cCh0b3BMYXllcik7Ci0gICAgeFNwYWNpbmdfID0geEN1dDsKLSAgICB5U3BhY2luZ18gPSB5Q3V0OwotICAgIHhCb3RFbmNfID0geEJvdEVuYzsKLSAgICB5Qm90RW5jXyA9IHlCb3RFbmM7Ci0gICAgeFRvcEVuY18gPSB4VG9wRW5jOwotICAgIHlUb3BFbmNfID0geVRvcEVuYzsKLX0KLQotdm9pZAotbGVmaVZpYTo6c2V0Um93Q29sKGludCAgbnVtUm93cywKLSAgICAgICAgICAgICAgICAgICBpbnQgIG51bUNvbHMpCi17Ci0gICAgbnVtUm93c18gPSBudW1Sb3dzOwotICAgIG51bUNvbHNfID0gbnVtQ29sczsKLX0KLQotdm9pZAotbGVmaVZpYTo6c2V0T3JpZ2luKGRvdWJsZSAgIHhPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgZG91YmxlICAgeU9mZnNldCkKLXsKLSAgICB4T2Zmc2V0XyA9IHhPZmZzZXQ7Ci0gICAgeU9mZnNldF8gPSB5T2Zmc2V0OwotfQotCi12b2lkCi1sZWZpVmlhOjpzZXRPZmZzZXQoZG91YmxlICAgeEJvdCwKLSAgICAgICAgICAgICAgICAgICBkb3VibGUgICB5Qm90LAotICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgIHhUb3AsCi0gICAgICAgICAgICAgICAgICAgZG91YmxlICAgeVRvcCkKLXsKLSAgICB4Qm90T3NfID0geEJvdDsKLSAgICB5Qm90T3NfID0geUJvdDsKLSAgICB4VG9wT3NfID0geFRvcDsKLSAgICB5VG9wT3NfID0geVRvcDsKLX0KLQotdm9pZAotbGVmaVZpYTo6c2V0UGF0dGVybihjb25zdCBjaGFyICpjdXRQYXR0ZXJuKQotewotICAgIGN1dFBhdHRlcm5fID0gc3RyZHVwKGN1dFBhdHRlcm4pOwotfQotCi1pbnQKLWxlZmlWaWE6Omhhc0RlZmF1bHQoKSBjb25zdAotewotICAgIHJldHVybiBoYXNEZWZhdWx0XzsKLX0KLQotaW50Ci1sZWZpVmlhOjpoYXNHZW5lcmF0ZWQoKSBjb25zdAotewotICAgIHJldHVybiBoYXNHZW5lcmF0ZWRfOwotfQotCi1pbnQKLWxlZmlWaWE6Omhhc0ZvcmVpZ24oKSBjb25zdAotewotICAgIHJldHVybiBmb3JlaWduXyA/IDEgOiAwOwotfQotCi1pbnQKLWxlZmlWaWE6Omhhc0ZvcmVpZ25QbnQoKSBjb25zdAotewotICAgIHJldHVybiBoYXNGb3JlaWduUG50XzsKLX0KLQotaW50Ci1sZWZpVmlhOjpoYXNGb3JlaWduT3JpZW50KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZm9yZWlnbk9yaWVudF8gPT0gLTEgPyAwIDogMTsKLX0KLQotaW50Ci1sZWZpVmlhOjpoYXNQcm9wZXJ0aWVzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbnVtUHJvcHNfID8gMSA6IDA7Ci19Ci0KLWludAotbGVmaVZpYTo6aGFzUmVzaXN0YW5jZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc1Jlc2lzdGFuY2VfOwotfQotCi1pbnQKLWxlZmlWaWE6Omhhc1RvcE9mU3RhY2soKSBjb25zdAotewotICAgIHJldHVybiBoYXNUb3BPZlN0YWNrXzsKLX0KLQotLy8gNS42Ci1pbnQKLWxlZmlWaWE6Omhhc1ZpYVJ1bGUoKSBjb25zdAotewotICAgIHJldHVybiB2aWFSdWxlTmFtZV8gPyAxIDogMDsKLX0KLQotLy8gNS42Ci1pbnQKLWxlZmlWaWE6Omhhc1Jvd0NvbCgpIGNvbnN0Ci17Ci0gICAgaWYgKG51bVJvd3NfICE9IDAgfHwgbnVtQ29sc18gIT0gMCkKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8vIDUuNgotaW50Ci1sZWZpVmlhOjpoYXNPcmlnaW4oKSBjb25zdAotewotICAgIGlmICh4T2Zmc2V0XyAhPSAwIHx8IHlPZmZzZXRfICE9IDApCi0gICAgICAgIHJldHVybiAxOwotICAgIHJldHVybiAwOwotfQotCi0vLyA1LjYKLWludAotbGVmaVZpYTo6aGFzT2Zmc2V0KCkgY29uc3QKLXsKLSAgICBpZiAoeEJvdE9zXyAhPSAwIHx8IHlCb3RPc18gIT0gMCB8fAotICAgICAgICB4VG9wT3NfICE9IDAgfHwgeVRvcE9zXyAhPSAwKQotICAgICAgICByZXR1cm4gMTsKLSAgICByZXR1cm4gMDsKLX0KLQotLy8gNS42Ci1pbnQKLWxlZmlWaWE6Omhhc0N1dFBhdHRlcm4oKSBjb25zdAotewotICAgIHJldHVybiBjdXRQYXR0ZXJuXyA/IDEgOiAwOwotfQotCi1pbnQKLWxlZmlWaWE6Om51bUxheWVycygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG51bUxheWVyc187Ci19Ci0KLWNoYXIgKgotbGVmaVZpYTo6bGF5ZXJOYW1lKGludCBsYXllck51bSkgY29uc3QKLXsKLSAgICBsZWZpVmlhTGF5ZXIgICAgKnZsOwotICAgIGNoYXIgICAgICAgICAgICBtc2dbMTYwXTsKLSAgICBpZiAobGF5ZXJOdW0gPCAwIHx8IGxheWVyTnVtID49IG51bUxheWVyc18pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xNDIxKTogVGhlIGxheWVyIG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIFZJQSBMQVlFUiBpcyBpbnZhbGlkLlxuVmFsaWQgbnVtYmVyIGlzIGZyb20gMCB0byAlZCIsIGxheWVyTnVtLCBudW1MYXllcnNfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDE0MjEsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICB2bCA9IGxheWVyc19bbGF5ZXJOdW1dOwotICAgIHJldHVybiB2bC0+bmFtZSgpOwotfQotCi1pbnQKLWxlZmlWaWE6Om51bVJlY3RzKGludCBsYXllck51bSkgY29uc3QKLXsKLSAgICBsZWZpVmlhTGF5ZXIgICAgKnZsOwotICAgIGNoYXIgICAgICAgICAgICBtc2dbMTYwXTsKLSAgICBpZiAobGF5ZXJOdW0gPCAwIHx8IGxheWVyTnVtID49IG51bUxheWVyc18pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xNDIxKTogVGhlIGxheWVyIG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIFZJQSBMQVlFUiBpcyBpbnZhbGlkLlxuVmFsaWQgbnVtYmVyIGlzIGZyb20gMCB0byAlZCIsIGxheWVyTnVtLCBudW1MYXllcnNfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDE0MjEsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICB2bCA9IGxheWVyc19bbGF5ZXJOdW1dOwotICAgIHJldHVybiB2bC0+bnVtUmVjdHMoKTsKLX0KLQotZG91YmxlCi1sZWZpVmlhOjp4bChpbnQgbGF5ZXJOdW0sCi0gICAgICAgICAgICBpbnQgcmVjdE51bSkgY29uc3QKLXsKLSAgICBsZWZpVmlhTGF5ZXIgICAgKnZsOwotICAgIGNoYXIgICAgICAgICAgICBtc2dbMTYwXTsKLSAgICBpZiAobGF5ZXJOdW0gPCAwIHx8IGxheWVyTnVtID49IG51bUxheWVyc18pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xNDIxKTogVGhlIGxheWVyIG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIFZJQSBMQVlFUiBpcyBpbnZhbGlkLlxuVmFsaWQgbnVtYmVyIGlzIGZyb20gMCB0byAlZCIsIGxheWVyTnVtLCBudW1MYXllcnNfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDE0MjEsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICB2bCA9IGxheWVyc19bbGF5ZXJOdW1dOwotICAgIHJldHVybiB2bC0+eGwocmVjdE51bSk7Ci19Ci0KLWRvdWJsZQotbGVmaVZpYTo6eWwoaW50IGxheWVyTnVtLAotICAgICAgICAgICAgaW50IHJlY3ROdW0pIGNvbnN0Ci17Ci0gICAgbGVmaVZpYUxheWVyICAgICp2bDsKLSAgICBjaGFyICAgICAgICAgICAgbXNnWzE2MF07Ci0gICAgaWYgKGxheWVyTnVtIDwgMCB8fCBsYXllck51bSA+PSBudW1MYXllcnNfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTQyMSk6IFRoZSBsYXllciBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBWSUEgTEFZRVIgaXMgaW52YWxpZC5cblZhbGlkIG51bWJlciBpcyBmcm9tIDAgdG8gJWQiLCBsYXllck51bSwgbnVtTGF5ZXJzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxNDIxLCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgdmwgPSBsYXllcnNfW2xheWVyTnVtXTsKLSAgICByZXR1cm4gdmwtPnlsKHJlY3ROdW0pOwotfQotCi1kb3VibGUKLWxlZmlWaWE6OnhoKGludCBsYXllck51bSwKLSAgICAgICAgICAgIGludCByZWN0TnVtKSBjb25zdAotewotICAgIGxlZmlWaWFMYXllciAgICAqdmw7Ci0gICAgY2hhciAgICAgICAgICAgIG1zZ1sxNjBdOwotICAgIGlmIChsYXllck51bSA8IDAgfHwgbGF5ZXJOdW0gPj0gbnVtTGF5ZXJzXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTE0MjEpOiBUaGUgbGF5ZXIgbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgVklBIExBWUVSIGlzIGludmFsaWQuXG5WYWxpZCBudW1iZXIgaXMgZnJvbSAwIHRvICVkIiwgbGF5ZXJOdW0sIG51bUxheWVyc18pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTQyMSwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHZsID0gbGF5ZXJzX1tsYXllck51bV07Ci0gICAgcmV0dXJuIHZsLT54aChyZWN0TnVtKTsKLX0KLQotZG91YmxlCi1sZWZpVmlhOjp5aChpbnQgbGF5ZXJOdW0sCi0gICAgICAgICAgICBpbnQgcmVjdE51bSkgY29uc3QKLXsKLSAgICBsZWZpVmlhTGF5ZXIgICAgKnZsOwotICAgIGNoYXIgICAgICAgICAgICBtc2dbMTYwXTsKLSAgICBpZiAobGF5ZXJOdW0gPCAwIHx8IGxheWVyTnVtID49IG51bUxheWVyc18pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xNDIxKTogVGhlIGxheWVyIG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIFZJQSBMQVlFUiBpcyBpbnZhbGlkLlxuVmFsaWQgbnVtYmVyIGlzIGZyb20gMCB0byAlZCIsIGxheWVyTnVtLCBudW1MYXllcnNfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDE0MjEsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICB2bCA9IGxheWVyc19bbGF5ZXJOdW1dOwotICAgIHJldHVybiB2bC0+eWgocmVjdE51bSk7Ci19Ci0KLWludAotbGVmaVZpYTo6cmVjdENvbG9yTWFzayhpbnQgIGxheWVyTnVtLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgIHJlY3ROdW0pIGNvbnN0Ci17Ci0gICAgbGVmaVZpYUxheWVyICAgICp2bDsKLSAgICBjaGFyICAgICAgICAgICAgbXNnWzE2MF07Ci0KLSAgICBpZiAobGF5ZXJOdW0gPCAwIHx8IGxheWVyTnVtID49IG51bUxheWVyc18pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xNDIxKTogVGhlIGxheWVyIG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIFZJQSBMQVlFUiBpcyBpbnZhbGlkLlxuVmFsaWQgbnVtYmVyIGlzIGZyb20gMCB0byAlZCIsIGxheWVyTnVtLCBudW1MYXllcnNfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDE0MjEsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHZsID0gbGF5ZXJzX1tsYXllck51bV07Ci0KLSAgICByZXR1cm4gdmwtPnJlY3RDb2xvck1hc2socmVjdE51bSk7Ci19Ci0KLWludAotbGVmaVZpYTo6cG9seUNvbG9yTWFzayhpbnQgIGxheWVyTnVtLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgIHBvbHlOdW0pIGNvbnN0Ci17Ci0gICAgbGVmaVZpYUxheWVyICAgICp2bDsKLSAgICBjaGFyICAgICAgICAgICAgbXNnWzE2MF07Ci0KLSAgICBpZiAobGF5ZXJOdW0gPCAwIHx8IGxheWVyTnVtID49IG51bUxheWVyc18pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xNDIxKTogVGhlIGxheWVyIG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIFZJQSBMQVlFUiBpcyBpbnZhbGlkLlxuVmFsaWQgbnVtYmVyIGlzIGZyb20gMCB0byAlZCIsIGxheWVyTnVtLCBudW1MYXllcnNfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDE0MjEsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHZsID0gbGF5ZXJzX1tsYXllck51bV07Ci0KLSAgICByZXR1cm4gdmwtPnBvbHlDb2xvck1hc2socG9seU51bSk7Ci19Ci0KLWludAotbGVmaVZpYTo6bnVtUG9seWdvbnMoaW50IGxheWVyTnVtKSBjb25zdAotewotICAgIGxlZmlWaWFMYXllciAgICAqdmw7Ci0gICAgY2hhciAgICAgICAgICAgIG1zZ1sxNjBdOwotICAgIGlmIChsYXllck51bSA8IDAgfHwgbGF5ZXJOdW0gPj0gbnVtTGF5ZXJzXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTE0MjEpOiBUaGUgbGF5ZXIgbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgVklBIExBWUVSIGlzIGludmFsaWQuXG5WYWxpZCBudW1iZXIgaXMgZnJvbSAwIHRvICVkIiwgbGF5ZXJOdW0sIG51bUxheWVyc18pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTQyMSwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHZsID0gbGF5ZXJzX1tsYXllck51bV07Ci0gICAgcmV0dXJuIHZsLT5udW1Qb2x5Z29ucygpOwotfQotCi1sZWZpR2VvbVBvbHlnb24KLWxlZmlWaWE6OmdldFBvbHlnb24oaW50IGxheWVyTnVtLAotICAgICAgICAgICAgICAgICAgICBpbnQgcG9seU51bSkgY29uc3QKLXsKLSAgICBsZWZpVmlhTGF5ZXIgICAgKnZsOwotICAgIGNoYXIgICAgICAgICAgICBtc2dbMTYwXTsKLSAgICBsZWZpR2VvbVBvbHlnb24gdGVtcFBvbHk7Ci0KLSAgICB0ZW1wUG9seS5udW1Qb2ludHMgPSAwOwotICAgIHRlbXBQb2x5LnggPSAwOwotICAgIHRlbXBQb2x5LnkgPSAwOwotICAgIHRlbXBQb2x5LmNvbG9yTWFzayA9IDA7Ci0KLSAgICBpZiAobGF5ZXJOdW0gPCAwIHx8IGxheWVyTnVtID49IG51bUxheWVyc18pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xNDIxKTogVGhlIGxheWVyIG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIFZJQSBMQVlFUiBpcyBpbnZhbGlkLlxuVmFsaWQgbnVtYmVyIGlzIGZyb20gMCB0byAlZCIsIGxheWVyTnVtLCBudW1MYXllcnNfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDE0MjEsIG1zZyk7Ci0gICAgICAgIHJldHVybiB0ZW1wUG9seTsKLSAgICB9Ci0KLSAgICB2bCA9IGxheWVyc19bbGF5ZXJOdW1dOwotCi0gICAgcmV0dXJuICoodmwtPmdldFBvbHlnb24ocG9seU51bSkpOwotfQotCi1jaGFyICoKLWxlZmlWaWE6Om5hbWUoKSBjb25zdAotewotICAgIHJldHVybiBuYW1lXzsKLX0KLQotZG91YmxlCi1sZWZpVmlhOjpyZXNpc3RhbmNlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gcmVzaXN0YW5jZV87Ci19Ci0KLS8vIEdpdmVuIGFuIGluZGV4IGZyb20gMCB0byBudW1Qcm9wZXJ0aWVzKCktMSByZXR1cm4KLS8vIGluZm9ybWF0aW9uIGFib3V0IHRoYXQgcHJvcGVydHkuCi1pbnQKLWxlZmlWaWE6Om51bVByb3BlcnRpZXMoKSBjb25zdAotewotICAgIHJldHVybiBudW1Qcm9wc187Ci19Ci0KLWNoYXIgKgotbGVmaVZpYTo6cHJvcE5hbWUoaW50IGluZGV4KSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1Qcm9wc18pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xNDIyKTogVGhlIGxheWVyIG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIFZJQSBQUk9QRVJUWSBpcyBpbnZhbGlkLlxuVmFsaWQgbnVtYmVyIGlzIGZyb20gMCB0byAlZCIsIGluZGV4LCBudW1MYXllcnNfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDE0MjIsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gcHJvcE5hbWVfW2luZGV4XTsKLX0KLQotY2hhciAqCi1sZWZpVmlhOjpwcm9wVmFsdWUoaW50IGluZGV4KSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1Qcm9wc18pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xNDIyKTogVGhlIGxheWVyIG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIFZJQSBQUk9QRVJUWSBpcyBpbnZhbGlkLlxuVmFsaWQgbnVtYmVyIGlzIGZyb20gMCB0byAlZCIsIGluZGV4LCBudW1MYXllcnNfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDE0MjIsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gcHJvcFZhbHVlX1tpbmRleF07Ci19Ci0KLWRvdWJsZQotbGVmaVZpYTo6cHJvcE51bWJlcihpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVByb3BzXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTE0MjIpOiBUaGUgbGF5ZXIgbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgVklBIFBST1BFUlRZIGlzIGludmFsaWQuXG5WYWxpZCBudW1iZXIgaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bUxheWVyc18pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTQyMiwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBwcm9wRFZhbHVlX1tpbmRleF07Ci19Ci0KLWNoYXIKLWxlZmlWaWE6OnByb3BUeXBlKGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjaGFyIG1zZ1sxNjBdOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtUHJvcHNfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTQyMik6IFRoZSBsYXllciBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBWSUEgUFJPUEVSVFkgaXMgaW52YWxpZC5cblZhbGlkIG51bWJlciBpcyBmcm9tIDAgdG8gJWQiLCBpbmRleCwgbnVtTGF5ZXJzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxNDIyLCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHByb3BUeXBlX1tpbmRleF07Ci19Ci0KLWludAotbGVmaVZpYTo6cHJvcElzTnVtYmVyKGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjaGFyIG1zZ1sxNjBdOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtUHJvcHNfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTQyMik6IFRoZSBsYXllciBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBWSUEgUFJPUEVSVFkgaXMgaW52YWxpZC5cblZhbGlkIG51bWJlciBpcyBmcm9tIDAgdG8gJWQiLCBpbmRleCwgbnVtTGF5ZXJzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxNDIyLCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHByb3BEVmFsdWVfW2luZGV4XSA/IDEgOiAwOwotfQotCi1pbnQKLWxlZmlWaWE6OnByb3BJc1N0cmluZyhpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bVByb3BzXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTE0MjIpOiBUaGUgbGF5ZXIgbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgVklBIFBST1BFUlRZIGlzIGludmFsaWQuXG5WYWxpZCBudW1iZXIgaXMgZnJvbSAwIHRvICVkIiwgaW5kZXgsIG51bUxheWVyc18pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTQyMiwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBwcm9wRFZhbHVlX1tpbmRleF0gPyAwIDogMTsKLX0KLQotY2hhciAqCi1sZWZpVmlhOjpmb3JlaWduKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZm9yZWlnbl87Ci19Ci0KLWRvdWJsZQotbGVmaVZpYTo6Zm9yZWlnblgoKSBjb25zdAotewotICAgIHJldHVybiBmb3JlaWduWF87Ci19Ci0KLWRvdWJsZQotbGVmaVZpYTo6Zm9yZWlnblkoKSBjb25zdAotewotICAgIHJldHVybiBmb3JlaWduWV87Ci19Ci0KLWludAotbGVmaVZpYTo6Zm9yZWlnbk9yaWVudCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZvcmVpZ25PcmllbnRfOwotfQotCi1jaGFyICoKLWxlZmlWaWE6OmZvcmVpZ25PcmllbnRTdHIoKSBjb25zdAotewotICAgIHJldHVybiAobGVmaU9yaWVudFN0cihmb3JlaWduT3JpZW50XykpOwotfQotCi0vLyA1LjYKLWNvbnN0IGNoYXIgKgotbGVmaVZpYTo6dmlhUnVsZU5hbWUoKSBjb25zdAotewotICAgIHJldHVybiB2aWFSdWxlTmFtZV87Ci19Ci0KLWRvdWJsZQotbGVmaVZpYTo6eEN1dFNpemUoKSBjb25zdAotewotICAgIHJldHVybiB4U2l6ZV87Ci19Ci0KLWRvdWJsZQotbGVmaVZpYTo6eUN1dFNpemUoKSBjb25zdAotewotICAgIHJldHVybiB5U2l6ZV87Ci19Ci0KLWNvbnN0IGNoYXIgKgotbGVmaVZpYTo6Ym90TWV0YWxMYXllcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGJvdExheWVyXzsKLX0KLQotY29uc3QgY2hhciAqCi1sZWZpVmlhOjpjdXRMYXllcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGN1dExheWVyXzsKLX0KLQotY29uc3QgY2hhciAqCi1sZWZpVmlhOjp0b3BNZXRhbExheWVyKCkgY29uc3QKLXsKLSAgICByZXR1cm4gdG9wTGF5ZXJfOwotfQotCi1kb3VibGUKLWxlZmlWaWE6OnhDdXRTcGFjaW5nKCkgY29uc3QKLXsKLSAgICByZXR1cm4geFNwYWNpbmdfOwotfQotCi1kb3VibGUKLWxlZmlWaWE6OnlDdXRTcGFjaW5nKCkgY29uc3QKLXsKLSAgICByZXR1cm4geVNwYWNpbmdfOwotfQotCi1kb3VibGUKLWxlZmlWaWE6OnhCb3RFbmMoKSBjb25zdAotewotICAgIHJldHVybiB4Qm90RW5jXzsKLX0KLQotZG91YmxlCi1sZWZpVmlhOjp5Qm90RW5jKCkgY29uc3QKLXsKLSAgICByZXR1cm4geUJvdEVuY187Ci19Ci0KLWRvdWJsZQotbGVmaVZpYTo6eFRvcEVuYygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHhUb3BFbmNfOwotfQotCi1kb3VibGUKLWxlZmlWaWE6OnlUb3BFbmMoKSBjb25zdAotewotICAgIHJldHVybiB5VG9wRW5jXzsKLX0KLQotaW50Ci1sZWZpVmlhOjpudW1DdXRSb3dzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbnVtUm93c187Ci19Ci0KLWludAotbGVmaVZpYTo6bnVtQ3V0Q29scygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG51bUNvbHNfOwotfQotCi1kb3VibGUKLWxlZmlWaWE6OnhPZmZzZXQoKSBjb25zdAotewotICAgIHJldHVybiB4T2Zmc2V0XzsKLX0KLQotZG91YmxlCi1sZWZpVmlhOjp5T2Zmc2V0KCkgY29uc3QKLXsKLSAgICByZXR1cm4geU9mZnNldF87Ci19Ci0KLWRvdWJsZQotbGVmaVZpYTo6eEJvdE9mZnNldCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHhCb3RPc187Ci19Ci0KLWRvdWJsZQotbGVmaVZpYTo6eUJvdE9mZnNldCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHlCb3RPc187Ci19Ci0KLWRvdWJsZQotbGVmaVZpYTo6eFRvcE9mZnNldCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHhUb3BPc187Ci19Ci0KLWRvdWJsZQotbGVmaVZpYTo6eVRvcE9mZnNldCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHlUb3BPc187Ci19Ci0KLWNvbnN0IGNoYXIgKgotbGVmaVZpYTo6Y3V0UGF0dGVybigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGN1dFBhdHRlcm5fOwotfQotCi0vLyBEZWJ1ZyBwcmludAotdm9pZAotbGVmaVZpYTo6cHJpbnQoRklMRSAqZikgY29uc3QKLXsKLSAgICBpbnQgaTsKLSAgICBpbnQgaDsKLQotICAgIGZwcmludGYoZiwgIlZpYSAlczpcbiIsIG5hbWUoKSk7Ci0KLSAgICBpZiAoaGFzRGVmYXVsdCgpKQotICAgICAgICBmcHJpbnRmKGYsICIgIERFRkFVTFRcbiIpOwotCi0gICAgaWYgKGhhc0ZvcmVpZ24oKSkgewotICAgICAgICBmcHJpbnRmKGYsICIgIGZvcmVpZ24gJXMiLCBmb3JlaWduKCkpOwotICAgICAgICBpZiAoaGFzRm9yZWlnblBudCgpKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKGYsICIgJWcsJWciLCBmb3JlaWduWCgpLAotICAgICAgICAgICAgICAgICAgICBmb3JlaWduWSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaGFzRm9yZWlnbk9yaWVudCgpKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKGYsICIgb3JpZW50ICVzIiwgZm9yZWlnbk9yaWVudFN0cigpKTsKLSAgICAgICAgfQotICAgICAgICBmcHJpbnRmKGYsICJcbiIpOwotICAgIH0KLQotICAgIGlmIChoYXNSZXNpc3RhbmNlKCkpCi0gICAgICAgIGZwcmludGYoZiwgIiAgUkVTSVNUQU5DRSAlZ1xuIiwgcmVzaXN0YW5jZSgpKTsKLQotICAgIGlmIChoYXNQcm9wZXJ0aWVzKCkpIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVByb3BlcnRpZXMoKTsgaSsrKQotICAgICAgICAgICAgaWYgKHByb3BJc1N0cmluZyhpKSkKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIgIFBST1AgJXMgJXNcbiIsIHByb3BOYW1lKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcFZhbHVlKGkpKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIgIFBST1AgJXMgJWdcbiIsIHByb3BOYW1lKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE51bWJlcihpKSk7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IG51bUxheWVycygpOyBpKyspIHsKLSAgICAgICAgZnByaW50ZihmLCAiICBMQVlFUiAlc1xuIiwgbGF5ZXJOYW1lKGkpKTsKLSAgICAgICAgZm9yIChoID0gMDsgaCA8IG51bVJlY3RzKGkpOyBoKyspIHsKLSAgICAgICAgICAgIGlmIChyZWN0Q29sb3JNYXNrKGksIGgpICE9IDApIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIgICAgUkVDVCBNQVNLICVkICVnLCVnICVnLCVnXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdENvbG9yTWFzayhpLCBoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhsKGksIGgpLCB5bChpLCBoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhoKGksIGgpLCB5aChpLCBoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiAgICBSRUNUICVnLCVnICVnLCVnXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgeGwoaSwgaCksIHlsKGksIGgpLAotICAgICAgICAgICAgICAgICAgICAgICAgeGgoaSwgaCksIHloKGksIGgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlWaWEuaHBwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZpVmlhLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQzOTBiMi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlWaWEuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTIgLSAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2lmbmRlZiBsZWZpVmlhX2gKLSNkZWZpbmUgbGVmaVZpYV9oCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImxlZmlLUkRlZnMuaHBwIgotI2luY2x1ZGUgImxlZmlNaXNjLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotY2xhc3MgbGVmaVZpYUxheWVyIHsKLXB1YmxpYzoKLSAgbGVmaVZpYUxheWVyKCk7Ci0gIHZvaWQgSW5pdCgpOwotCi0gIHZvaWQgRGVzdHJveSgpOwotICB+bGVmaVZpYUxheWVyKCk7Ci0KLSAgdm9pZCBzZXROYW1lKGNvbnN0IGNoYXIqIG5hbWUpOwotICB2b2lkIGFkZFJlY3QoaW50IG1hc2ssCi0gICAgICAgICAgICAgICBkb3VibGUgeGwsIGRvdWJsZSB5bCwgCi0gICAgICAgICAgICAgICBkb3VibGUgeGgsIGRvdWJsZSB5aCk7Ci0gIHZvaWQgYWRkUG9seShpbnQgbWFzaywKLSAgICAgICAgICAgICAgIGxlZmlHZW9tZXRyaWVzKiBnZW9tKTsKLQotICBsZWZpVmlhTGF5ZXIqIGNsb25lKCk7Ci0KLSAgaW50IG51bVJlY3RzKCk7Ci0gIGNoYXIqIG5hbWUoKTsKLSAgZG91YmxlIHhsKGludCBpbmRleCk7Ci0gIGRvdWJsZSB5bChpbnQgaW5kZXgpOwotICBkb3VibGUgeGgoaW50IGluZGV4KTsKLSAgZG91YmxlIHloKGludCBpbmRleCk7Ci0gIGludCByZWN0Q29sb3JNYXNrKGludCBpbmRleCk7Ci0gIGludCBwb2x5Q29sb3JNYXNrKGludCBpbmRleCk7Ci0KLSAgaW50IG51bVBvbHlnb25zKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNgotICBsZWZpR2VvbVBvbHlnb24qIGdldFBvbHlnb24oaW50IGluZGV4KSBjb25zdDsgICAvLyA1LjYKLQotcHJvdGVjdGVkOgotICBjaGFyKiBuYW1lXzsKLSAgaW50KiByZWN0Q29sb3JNYXNrXzsKLSAgaW50KiBwb2x5Q29sb3JNYXNrXzsKLSAgaW50IG51bVJlY3RzXzsKLSAgaW50IHJlY3RzQWxsb2NhdGVkXzsKLSAgZG91YmxlKiB4bF87Ci0gIGRvdWJsZSogeWxfOwotICBkb3VibGUqIHhoXzsKLSAgZG91YmxlKiB5aF87Ci0KLSAgaW50IG51bVBvbHlzXzsKLSAgaW50IHBvbHlzQWxsb2NhdGVkXzsKLSAgbGVmaUdlb21Qb2x5Z29uKiogcG9seWdvbnNfOwotCi19OwotCi1jbGFzcyBsZWZpVmlhIHsKLXB1YmxpYzoKLSAgbGVmaVZpYSgpOwotICB2b2lkIEluaXQoKTsKLQotICB2b2lkIERlc3Ryb3koKTsKLSAgfmxlZmlWaWEoKTsKLQotICB2b2lkIGNsZWFyKCk7Ci0KLSAgLy8gc2V0TmFtZSBjYWxscyBjbGVhciB0byBpbml0Ci0gIC8vIGRlZmx0PTAgbm8gZGVmYXVsdCBzcGVjaWZpZWQKLSAgLy8gZGVmbHQ9MSBkZWZhdWx0IHNwZWNpZmllZCBpbiBsZWYgZmlsZQotICB2b2lkIHNldE5hbWUoY29uc3QgY2hhciogbmFtZSwgaW50IHZpYVR5cGUpOwotCi0gIHZvaWQgc2V0UmVzaXN0YW5jZShkb3VibGUgbnVtKTsKLSAgdm9pZCBhZGRQcm9wKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHZhbHVlLCBjb25zdCBjaGFyIHR5cGUpOwotICB2b2lkIGFkZE51bVByb3AoY29uc3QgY2hhciogbmFtZSwgZG91YmxlIGQsIGNvbnN0IGNoYXIqIHZhbHVlLAotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciB0eXBlKTsKLQotICAvLyBvcmllbnQ9LTEgbWVhbnMgbm8gb3JpZW50IHdhcyBzcGVjaWZpZWQuCi0gIHZvaWQgc2V0Rm9yZWlnbihjb25zdCBjaGFyKiBuYW1lLCBpbnQgaGFzUG50LAotICAgICBkb3VibGUgeCwgZG91YmxlIHksIGludCBvcmllbnQpOwotICB2b2lkIHNldFRvcE9mU3RhY2soKTsKLQotICB2b2lkIGFkZExheWVyKGNvbnN0IGNoYXIqIG5hbWUpOwotICB2b2lkIGFkZFJlY3RUb0xheWVyKGludCAgICBtYXNrLCAKLSAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeGwsIGRvdWJsZSB5bCwgCi0gICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHhoLCBkb3VibGUgeWgpOwotICB2b2lkIGFkZFBvbHlUb0xheWVyKGludCAgICBtYXNrLAotICAgICAgICAgICAgICAgICAgICAgIGxlZmlHZW9tZXRyaWVzKiBnZW9tKTsKLSAgdm9pZCBidW1wUHJvcHMoKTsKLQotICB2b2lkIHNldFZpYVJ1bGUoY29uc3QgY2hhciogdmlhUnVsZU5hbWUsIGRvdWJsZSB4U2l6ZSwgZG91YmxlIHlTaXplLAotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYm90TGF5ZXIsIGNvbnN0IGNoYXIqIGN1dExheWVyLAotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdG9wTGF5ZXIsIGRvdWJsZSB4Q3V0LCBkb3VibGUgeUN1dCwKLSAgICAgICAgICAgICAgICAgIGRvdWJsZSB4Qm90RW5jLCBkb3VibGUgeUJvdEVuYywgZG91YmxlIHhUb3BFbmMsCi0gICAgICAgICAgICAgICAgICBkb3VibGUgeVRvcEVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjYKLSAgdm9pZCBzZXRSb3dDb2woaW50IG51bVJvd3MsIGludCBudW1Db2xzKTsgICAgICAgICAgICAgICAgIC8vIDUuNgotICB2b2lkIHNldE9yaWdpbihkb3VibGUgeE9mZnNldCwgZG91YmxlIHlPZmZzZXQpOyAgICAgICAgICAgLy8gNS42Ci0gIHZvaWQgc2V0T2Zmc2V0KGRvdWJsZSB4Qm90LCBkb3VibGUgeUJvdCwgZG91YmxlIHhUb3AsIGRvdWJsZSB5VG9wKTsgICAvLyA1LjYKLSAgdm9pZCBzZXRQYXR0ZXJuKGNvbnN0IGNoYXIqIGN1dFBhdHRlcm4pOyAgICAgICAgICAgICAgICAgIC8vIDUuNgotCi0gIC8vIG1ha2UgYSBuZXcgb25lIAotICBsZWZpVmlhKiBjbG9uZSgpOwotCi0gIGludCBoYXNEZWZhdWx0KCkgY29uc3QgOwotICBpbnQgaGFzR2VuZXJhdGVkKCkgY29uc3QgOyAvLyA1LjYsIHRoaXMgbm8gbG9uZ2VyIGluIDUuNiwgc2hvdWxkIGJlIHJlbW92ZWQKLSAgaW50IGhhc0ZvcmVpZ24oKSBjb25zdCA7Ci0gIGludCBoYXNGb3JlaWduUG50KCkgY29uc3QgOwotICBpbnQgaGFzRm9yZWlnbk9yaWVudCgpIGNvbnN0IDsKLSAgaW50IGhhc1Byb3BlcnRpZXMoKSBjb25zdCA7Ci0gIGludCBoYXNSZXNpc3RhbmNlKCkgY29uc3QgOwotICBpbnQgaGFzVG9wT2ZTdGFjaygpIGNvbnN0IDsKLQotICBpbnQgbnVtTGF5ZXJzKCkgY29uc3Q7Ci0gIGNoYXIqIGxheWVyTmFtZShpbnQgbGF5ZXJOdW0pIGNvbnN0OwotICBpbnQgbnVtUmVjdHMoaW50IGxheWVyTnVtKSBjb25zdDsKLSAgZG91YmxlIHhsKGludCBsYXllck51bSwgaW50IHJlY3ROdW0pIGNvbnN0OwotICBkb3VibGUgeWwoaW50IGxheWVyTnVtLCBpbnQgcmVjdE51bSkgY29uc3Q7Ci0gIGRvdWJsZSB4aChpbnQgbGF5ZXJOdW0sIGludCByZWN0TnVtKSBjb25zdDsKLSAgZG91YmxlIHloKGludCBsYXllck51bSwgaW50IHJlY3ROdW0pIGNvbnN0OwotICBpbnQgcmVjdENvbG9yTWFzayhpbnQgbGF5ZXJOdW0sIGludCByZWN0TnVtKSBjb25zdDsKLSAgaW50IHBvbHlDb2xvck1hc2soaW50IGxheWVyTnVtLCBpbnQgcG9seU51bSkgY29uc3Q7Ci0gIGludCBudW1Qb2x5Z29ucyhpbnQgbGF5ZXJOdW0pIGNvbnN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNgotICBsZWZpR2VvbVBvbHlnb24gZ2V0UG9seWdvbihpbnQgbGF5ZXJOdW0sIGludCBwb2x5TnVtKSBjb25zdDsgIC8vIDUuNgotCi0gIGNoYXIqIG5hbWUoKSBjb25zdCA7Ci0gIGRvdWJsZSByZXNpc3RhbmNlKCkgY29uc3QgOwotCi0gIC8vIEdpdmVuIGFuIGluZGV4IGZyb20gMCB0byBudW1Qcm9wZXJ0aWVzKCktMSByZXR1cm4KLSAgLy8gaW5mb3JtYXRpb24gYWJvdXQgdGhhdCBwcm9wZXJ0eS4KLSAgaW50IG51bVByb3BlcnRpZXMoKSBjb25zdCA7Ci0gIGNoYXIqIHByb3BOYW1lKGludCBpbmRleCkgY29uc3Q7Ci0gIGNoYXIqIHByb3BWYWx1ZShpbnQgaW5kZXgpIGNvbnN0OwotICBkb3VibGUgcHJvcE51bWJlcihpbnQgaW5kZXgpIGNvbnN0OwotICBjaGFyICBwcm9wVHlwZShpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgcHJvcElzTnVtYmVyKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCBwcm9wSXNTdHJpbmcoaW50IGluZGV4KSBjb25zdDsKLSAgY2hhciogZm9yZWlnbigpIGNvbnN0OwotICBkb3VibGUgZm9yZWlnblgoKSBjb25zdDsKLSAgZG91YmxlIGZvcmVpZ25ZKCkgY29uc3Q7Ci0gIGludCBmb3JlaWduT3JpZW50KCkgY29uc3Q7Ci0gIGNoYXIqIGZvcmVpZ25PcmllbnRTdHIoKSBjb25zdDsKLQotICAvLyA1LjYgVklBUlVMRSBpbnNpZGUgYSBWSUEKLSAgaW50IGhhc1ZpYVJ1bGUoKSBjb25zdDsKLSAgY29uc3QgY2hhciogdmlhUnVsZU5hbWUoKSBjb25zdDsKLSAgZG91YmxlIHhDdXRTaXplKCkgY29uc3Q7Ci0gIGRvdWJsZSB5Q3V0U2l6ZSgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBib3RNZXRhbExheWVyKCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIGN1dExheWVyKCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIHRvcE1ldGFsTGF5ZXIoKSBjb25zdDsKLSAgZG91YmxlIHhDdXRTcGFjaW5nKCkgY29uc3Q7Ci0gIGRvdWJsZSB5Q3V0U3BhY2luZygpIGNvbnN0OwotICBkb3VibGUgeEJvdEVuYygpIGNvbnN0OwotICBkb3VibGUgeUJvdEVuYygpIGNvbnN0OwotICBkb3VibGUgeFRvcEVuYygpIGNvbnN0OwotICBkb3VibGUgeVRvcEVuYygpIGNvbnN0OwotICBpbnQgaGFzUm93Q29sKCkgY29uc3Q7Ci0gIGludCBudW1DdXRSb3dzKCkgY29uc3Q7IAotICBpbnQgbnVtQ3V0Q29scygpIGNvbnN0OyAKLSAgaW50IGhhc09yaWdpbigpIGNvbnN0OwotICBkb3VibGUgeE9mZnNldCgpIGNvbnN0OyAKLSAgZG91YmxlIHlPZmZzZXQoKSBjb25zdDsgCi0gIGludCBoYXNPZmZzZXQoKSBjb25zdDsKLSAgZG91YmxlIHhCb3RPZmZzZXQoKSBjb25zdDsgCi0gIGRvdWJsZSB5Qm90T2Zmc2V0KCkgY29uc3Q7IAotICBkb3VibGUgeFRvcE9mZnNldCgpIGNvbnN0OyAKLSAgZG91YmxlIHlUb3BPZmZzZXQoKSBjb25zdDsgCi0gIGludCBoYXNDdXRQYXR0ZXJuKCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqIGN1dFBhdHRlcm4oKSBjb25zdDsKLQotICAvLyBEZWJ1ZyBwcmludAotICB2b2lkIHByaW50KEZJTEUqIGYpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gIGNoYXIqIG5hbWVfOwotICBpbnQgbmFtZVNpemVfOwotCi0gIGludCBoYXNEZWZhdWx0XzsKLSAgaW50IGhhc0dlbmVyYXRlZF87Ci0gIGludCBoYXNSZXNpc3RhbmNlXzsKLSAgaW50IGhhc0ZvcmVpZ25QbnRfOwotICBpbnQgaGFzVG9wT2ZTdGFja187Ci0KLSAgaW50IG51bVByb3BzXzsKLSAgaW50IHByb3BzQWxsb2NhdGVkXzsKLSAgY2hhcioqIHByb3BOYW1lXzsKLSAgLy8gVGhlIHByb3AgdmFsdWUgaXMgc3RvcmVkIGluIHRoZSBwcm9wVmFsdWVfIG9yIHRoZSBwcm9wRFZhbHVlXy4KLSAgLy8gSWYgaXQgaXMgYSBzdHJpbmcgaXQgaXMgaW4gcHJvcFZhbHVlXy4gIElmIGl0IGlzIGEgbnVtYmVyLAotICAvLyB0aGVuIHByb3BWYWx1ZV8gaXMgTlVMTCBhbmQgaXQgaXMgc3RvcmVkIGluIHByb3BEVmFsdWVfOwotICBjaGFyKiogcHJvcFZhbHVlXzsKLSAgZG91YmxlKiBwcm9wRFZhbHVlXzsKLSAgY2hhciogICBwcm9wVHlwZV87Ci0KLSAgaW50IG51bUxheWVyc187Ci0gIGludCBsYXllcnNBbGxvY2F0ZWRfOwotICBsZWZpVmlhTGF5ZXIqKiBsYXllcnNfOwotCi0gIGRvdWJsZSByZXNpc3RhbmNlXzsKLQotICBjaGFyKiBmb3JlaWduXzsKLSAgZG91YmxlIGZvcmVpZ25YXzsKLSAgZG91YmxlIGZvcmVpZ25ZXzsKLSAgaW50IGZvcmVpZ25PcmllbnRfOwotCi0gIGNoYXIqIHZpYVJ1bGVOYW1lXzsgICAgICAgICAgLy8gNS42Ci0gIGRvdWJsZSB4U2l6ZV87ICAgICAgICAgICAgICAgLy8gNS42Ci0gIGRvdWJsZSB5U2l6ZV87ICAgICAgICAgICAgICAgLy8gNS42Ci0gIGNoYXIqIGJvdExheWVyXzsgICAgICAgICAgICAgLy8gNS42Ci0gIGNoYXIqIGN1dExheWVyXzsgICAgICAgICAgICAgLy8gNS42Ci0gIGNoYXIqIHRvcExheWVyXzsgICAgICAgICAgICAgLy8gNS42Ci0gIGRvdWJsZSB4U3BhY2luZ187ICAgICAgICAgICAgLy8gNS42Ci0gIGRvdWJsZSB5U3BhY2luZ187ICAgICAgICAgICAgLy8gNS42Ci0gIGRvdWJsZSB4Qm90RW5jXzsgICAgICAgICAgICAgLy8gNS42Ci0gIGRvdWJsZSB5Qm90RW5jXzsgICAgICAgICAgICAgLy8gNS42Ci0gIGRvdWJsZSB4VG9wRW5jXzsgICAgICAgICAgICAgLy8gNS42Ci0gIGRvdWJsZSB5VG9wRW5jXzsgICAgICAgICAgICAgLy8gNS42Ci0gIGludCBudW1Sb3dzXzsgICAgICAgICAgICAgICAgLy8gNS42Ci0gIGludCBudW1Db2xzXzsgICAgICAgICAgICAgICAgLy8gNS42Ci0gIGRvdWJsZSB4T2Zmc2V0XzsgICAgICAgICAgICAgLy8gNS42Ci0gIGRvdWJsZSB5T2Zmc2V0XzsgICAgICAgICAgICAgLy8gNS42Ci0gIGRvdWJsZSB4Qm90T3NfOyAgICAgICAgICAgICAgLy8gNS42Ci0gIGRvdWJsZSB5Qm90T3NfOyAgICAgICAgICAgICAgLy8gNS42Ci0gIGRvdWJsZSB4VG9wT3NfOyAgICAgICAgICAgICAgLy8gNS42Ci0gIGRvdWJsZSB5VG9wT3NfOyAgICAgICAgICAgICAgLy8gNS42Ci0gIGNoYXIqIGN1dFBhdHRlcm5fOyAgICAgICAgICAgLy8gNS42Ci19OwotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotVVNFX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZpVmlhUnVsZS5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlWaWFSdWxlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVmYWFlOC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlWaWFSdWxlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg0NiArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyIC0gMjAxNSwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgImxleC5oIgotI2luY2x1ZGUgImxlZmlWaWFSdWxlLmhwcCIKLSNpbmNsdWRlICJsZWZpRGVidWcuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gbGVmaVZpYVJ1bGVMYXllcgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotbGVmaVZpYVJ1bGVMYXllcjo6bGVmaVZpYVJ1bGVMYXllcigpCi06IG5hbWVfKE5VTEwpLAotICBkaXJlY3Rpb25fKDApLAotICBvdmVyaGFuZzFfKDAuMCksCi0gIG92ZXJoYW5nMl8oMC4wKSwKLSAgaGFzV2lkdGhfKDApLAotICBoYXNSZXNpc3RhbmNlXygwKSwKLSAgaGFzT3ZlcmhhbmdfKDApLAotICBoYXNNZXRhbE92ZXJoYW5nXygwKSwKLSAgaGFzU3BhY2luZ18oMCksCi0gIGhhc1JlY3RfKDApLAotICB3aWR0aE1pbl8oMC4wKSwKLSAgd2lkdGhNYXhfKDAuMCksCi0gIG92ZXJoYW5nXygwLjApLAotICBtZXRhbE92ZXJoYW5nXygwLjApLAotICByZXNpc3RhbmNlXygwLjApLAotICBzcGFjaW5nU3RlcFhfKDAuMCksCi0gIHNwYWNpbmdTdGVwWV8oMC4wKSwKLSAgeGxfKDAuMCksCi0gIHhoXygwLjApLAotICB5bF8oMC4wKSwKLSAgeWhfKDAuMCkKLXsKLSAgICBJbml0KCk7Ci19Ci0KLXZvaWQKLWxlZmlWaWFSdWxlTGF5ZXI6OkluaXQoKQotewotICAgIG5hbWVfID0gMDsKLSAgICBvdmVyaGFuZzFfID0gLTE7Ci0gICAgb3ZlcmhhbmcyXyA9IC0xOwotfQotCi12b2lkCi1sZWZpVmlhUnVsZUxheWVyOjpjbGVhckxheWVyT3ZlcmhhbmcoKQotewotICAgIG92ZXJoYW5nMV8gPSAtMTsKLSAgICBvdmVyaGFuZzJfID0gLTE7Ci19Ci0KLXZvaWQKLWxlZmlWaWFSdWxlTGF5ZXI6OnNldE5hbWUoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLSAgICBpZiAobmFtZV8pCi0gICAgICAgIGxlZkZyZWUobmFtZV8pOwotICAgIG5hbWVfID0gKGNoYXIqKSBsZWZNYWxsb2MobGVuKTsKLSAgICBzdHJjcHkobmFtZV8sIENBU0UobmFtZSkpOwotICAgIGRpcmVjdGlvbl8gPSAnXDAnOwotICAgIC8vIG92ZXJoYW5nMV8gPSAtMTsgICAgYWxyZWFkeSByZXNldCBpbiBjbGVhckxheWVyT3ZlcmhhbmcKLSAgICAvLyBvdmVyaGFuZzJfID0gLTE7Ci0gICAgaGFzV2lkdGhfID0gMDsKLSAgICBoYXNSZXNpc3RhbmNlXyA9IDA7Ci0gICAgaGFzT3ZlcmhhbmdfID0gMDsKLSAgICBoYXNNZXRhbE92ZXJoYW5nXyA9IDA7Ci0gICAgaGFzU3BhY2luZ18gPSAwOwotICAgIGhhc1JlY3RfID0gMDsKLX0KLQotdm9pZAotbGVmaVZpYVJ1bGVMYXllcjo6RGVzdHJveSgpCi17Ci0gICAgaWYgKG5hbWVfKQotICAgICAgICBsZWZGcmVlKG5hbWVfKTsKLX0KLQotbGVmaVZpYVJ1bGVMYXllcjo6fmxlZmlWaWFSdWxlTGF5ZXIoKQotewotICAgIC8vIERlc3Ryb3kgd2lsbCBiZSBjYWxsZWQgZXhwbGljaXRseQotICAgIC8vIHNvIGRvIG5vdGhpbmcgaGVyZS4KLX0KLQotdm9pZAotbGVmaVZpYVJ1bGVMYXllcjo6c2V0SG9yaXpvbnRhbCgpCi17Ci0gICAgZGlyZWN0aW9uXyA9ICdIJzsKLX0KLQotdm9pZAotbGVmaVZpYVJ1bGVMYXllcjo6c2V0VmVydGljYWwoKQotewotICAgIGRpcmVjdGlvbl8gPSAnVic7Ci19Ci0KLS8vIDUuNQotdm9pZAotbGVmaVZpYVJ1bGVMYXllcjo6c2V0RW5jbG9zdXJlKGRvdWJsZSAgIG92ZXJoYW5nMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICBvdmVyaGFuZzIpCi17Ci0gICAgb3ZlcmhhbmcxXyA9IG92ZXJoYW5nMTsKLSAgICBvdmVyaGFuZzJfID0gb3ZlcmhhbmcyOwotfQotCi12b2lkCi1sZWZpVmlhUnVsZUxheWVyOjpzZXRXaWR0aChkb3VibGUgICBtaW5XLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgbWF4VykKLXsKLSAgICBoYXNXaWR0aF8gPSAxOwotICAgIHdpZHRoTWluXyA9IG1pblc7Ci0gICAgd2lkdGhNYXhfID0gbWF4VzsKLX0KLQotdm9pZAotbGVmaVZpYVJ1bGVMYXllcjo6c2V0T3ZlcmhhbmcoZG91YmxlIGQpCi17Ci0gICAgaGFzT3ZlcmhhbmdfID0gMTsKLSAgICBvdmVyaGFuZ18gPSBkOwotfQotCi0vLyA1LjYKLXZvaWQKLWxlZmlWaWFSdWxlTGF5ZXI6OnNldE92ZXJoYW5nVG9FbmNsb3N1cmUoZG91YmxlIGQpCi17Ci0gICAgaWYgKChvdmVyaGFuZzFfICE9IC0xKSAmJiAob3ZlcmhhbmcyXyAhPSAtMSkpCi0gICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgIC8vIGJvdGggb3ZlcmhhbmcxXyAmIG92ZXJoYW5nMl8gYXJlIHNldAotICAgIGlmIChvdmVyaGFuZzFfID09IC0xKQotICAgICAgICBvdmVyaGFuZzFfID0gZDsgICAgICAvLyBzZXQgdmFsdWUgdG8gb3ZlcmhhbmcxXwotICAgIGVsc2UKLSAgICAgICAgb3ZlcmhhbmcyXyA9IGQ7ICAgICAgLy8gb3ZlcmhhbmcxXyBhbHJlYWR5IHNldCwgc2V0IHRvIG92ZXJoYW5nMl8KLSAgICByZXR1cm47Ci19Ci0KLS8vIDUuNQotdm9pZAotbGVmaVZpYVJ1bGVMYXllcjo6c2V0TWV0YWxPdmVyaGFuZyhkb3VibGUgZCkKLXsKLSAgICBoYXNNZXRhbE92ZXJoYW5nXyA9IDE7Ci0gICAgbWV0YWxPdmVyaGFuZ18gPSBkOwotfQotCi12b2lkCi1sZWZpVmlhUnVsZUxheWVyOjpzZXRSZXNpc3RhbmNlKGRvdWJsZSBkKQotewotICAgIGhhc1Jlc2lzdGFuY2VfID0gMTsKLSAgICByZXNpc3RhbmNlXyA9IGQ7Ci19Ci0KLXZvaWQKLWxlZmlWaWFSdWxlTGF5ZXI6OnNldFNwYWNpbmcoZG91YmxlIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB5KQotewotICAgIGhhc1NwYWNpbmdfID0gMTsKLSAgICBzcGFjaW5nU3RlcFhfID0geDsKLSAgICBzcGFjaW5nU3RlcFlfID0geTsKLX0KLQotdm9pZAotbGVmaVZpYVJ1bGVMYXllcjo6c2V0UmVjdChkb3VibGUgICAgeGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICB5bCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgIHhoLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgeWgpCi17Ci0gICAgaGFzUmVjdF8gPSAxOwotICAgIHhsXyA9IHhsOwotICAgIHlsXyA9IHlsOwotICAgIHhoXyA9IHhoOwotICAgIHloXyA9IHloOwotfQotCi1pbnQKLWxlZmlWaWFSdWxlTGF5ZXI6Omhhc1JlY3QoKSBjb25zdAotewotICAgIHJldHVybiBoYXNSZWN0XzsKLX0KLQotaW50Ci1sZWZpVmlhUnVsZUxheWVyOjpoYXNEaXJlY3Rpb24oKSBjb25zdAotewotICAgIHJldHVybiBkaXJlY3Rpb25fID8gMSA6IDA7Ci19Ci0KLS8vIDUuNQotaW50Ci1sZWZpVmlhUnVsZUxheWVyOjpoYXNFbmNsb3N1cmUoKSBjb25zdAotewotICAgIHJldHVybiBvdmVyaGFuZzFfID09IC0xID8gMCA6IDE7Ci19Ci0KLWludAotbGVmaVZpYVJ1bGVMYXllcjo6aGFzV2lkdGgoKSBjb25zdAotewotICAgIHJldHVybiBoYXNXaWR0aF87Ci19Ci0KLWludAotbGVmaVZpYVJ1bGVMYXllcjo6aGFzUmVzaXN0YW5jZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc1Jlc2lzdGFuY2VfOwotfQotCi1pbnQKLWxlZmlWaWFSdWxlTGF5ZXI6Omhhc092ZXJoYW5nKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzT3ZlcmhhbmdfOwotfQotCi1pbnQKLWxlZmlWaWFSdWxlTGF5ZXI6Omhhc01ldGFsT3ZlcmhhbmcoKSBjb25zdAotewotICAgIHJldHVybiBoYXNNZXRhbE92ZXJoYW5nXzsKLX0KLQotaW50Ci1sZWZpVmlhUnVsZUxheWVyOjpoYXNTcGFjaW5nKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzU3BhY2luZ187Ci19Ci0KLWNoYXIgKgotbGVmaVZpYVJ1bGVMYXllcjo6bmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG5hbWVfOwotfQotCi1pbnQKLWxlZmlWaWFSdWxlTGF5ZXI6OmlzSG9yaXpvbnRhbCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGRpcmVjdGlvbl8gPT0gJ0gnID8gMSA6IDA7Ci19Ci0KLWludAotbGVmaVZpYVJ1bGVMYXllcjo6aXNWZXJ0aWNhbCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGRpcmVjdGlvbl8gPT0gJ1YnID8gMSA6IDA7Ci19Ci0KLS8vIDUuNQotZG91YmxlCi1sZWZpVmlhUnVsZUxheWVyOjplbmNsb3N1cmVPdmVyaGFuZzEoKSBjb25zdAotewotICAgIHJldHVybiBvdmVyaGFuZzFfOwotfQotCi0vLyA1LjUKLWRvdWJsZQotbGVmaVZpYVJ1bGVMYXllcjo6ZW5jbG9zdXJlT3ZlcmhhbmcyKCkgY29uc3QKLXsKLSAgICByZXR1cm4gb3ZlcmhhbmcyXzsKLX0KLQotZG91YmxlCi1sZWZpVmlhUnVsZUxheWVyOjp3aWR0aE1pbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHdpZHRoTWluXzsKLX0KLQotZG91YmxlCi1sZWZpVmlhUnVsZUxheWVyOjp3aWR0aE1heCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHdpZHRoTWF4XzsKLX0KLQotZG91YmxlCi1sZWZpVmlhUnVsZUxheWVyOjpvdmVyaGFuZygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG92ZXJoYW5nXzsKLX0KLQotZG91YmxlCi1sZWZpVmlhUnVsZUxheWVyOjptZXRhbE92ZXJoYW5nKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbWV0YWxPdmVyaGFuZ187Ci19Ci0KLWRvdWJsZQotbGVmaVZpYVJ1bGVMYXllcjo6cmVzaXN0YW5jZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJlc2lzdGFuY2VfOwotfQotCi1kb3VibGUKLWxlZmlWaWFSdWxlTGF5ZXI6OnNwYWNpbmdTdGVwWCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHNwYWNpbmdTdGVwWF87Ci19Ci0KLWRvdWJsZQotbGVmaVZpYVJ1bGVMYXllcjo6c3BhY2luZ1N0ZXBZKCkgY29uc3QKLXsKLSAgICByZXR1cm4gc3BhY2luZ1N0ZXBZXzsKLX0KLQotZG91YmxlCi1sZWZpVmlhUnVsZUxheWVyOjp4bCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHhsXzsKLX0KLQotZG91YmxlCi1sZWZpVmlhUnVsZUxheWVyOjp5bCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHlsXzsKLX0KLQotZG91YmxlCi1sZWZpVmlhUnVsZUxheWVyOjp4aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHhoXzsKLX0KLQotZG91YmxlCi1sZWZpVmlhUnVsZUxheWVyOjp5aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHloXzsKLX0KLQotdm9pZAotbGVmaVZpYVJ1bGVMYXllcjo6cHJpbnQoRklMRSAqZikgY29uc3QKLXsKLSAgICBmcHJpbnRmKGYsICIgIExheWVyICVzIiwgbmFtZV8pOwotCi0gICAgaWYgKGlzSG9yaXpvbnRhbCgpKQotICAgICAgICBmcHJpbnRmKGYsICIgSE9SSVpPTlRBTCIpOwotICAgIGlmIChpc1ZlcnRpY2FsKCkpCi0gICAgICAgIGZwcmludGYoZiwgIiBWRVJUSUNBTCIpOwotICAgIGZwcmludGYoZiwgIlxuIik7Ci0KLSAgICBpZiAoaGFzV2lkdGgoKSkKLSAgICAgICAgZnByaW50ZihmLCAiICAgIFdJRFRIICVnICVnXG4iLCB3aWR0aE1pbigpLAotICAgICAgICAgICAgICAgIHdpZHRoTWF4KCkpOwotCi0gICAgaWYgKGhhc1Jlc2lzdGFuY2UoKSkKLSAgICAgICAgZnByaW50ZihmLCAiICAgIFJFU0lTVEFOQ0UgJWdcbiIsIHJlc2lzdGFuY2UoKSk7Ci0KLSAgICBpZiAoaGFzT3ZlcmhhbmcoKSkKLSAgICAgICAgZnByaW50ZihmLCAiICAgIE9WRVJIQU5HICVnXG4iLCBvdmVyaGFuZygpKTsKLQotICAgIGlmIChoYXNNZXRhbE92ZXJoYW5nKCkpCi0gICAgICAgIGZwcmludGYoZiwgIiAgICBNRVRBTE9WRVJIQU5HICVnXG4iLAotICAgICAgICAgICAgICAgIG1ldGFsT3ZlcmhhbmcoKSk7Ci0KLSAgICBpZiAoaGFzU3BhY2luZygpKQotICAgICAgICBmcHJpbnRmKGYsICIgICAgU1BBQ0lORyAlZyAlZ1xuIiwKLSAgICAgICAgICAgICAgICBzcGFjaW5nU3RlcFgoKSwKLSAgICAgICAgICAgICAgICBzcGFjaW5nU3RlcFkoKSk7Ci0KLSAgICBpZiAoaGFzUmVjdCgpKQotICAgICAgICBmcHJpbnRmKGYsICIgICAgUkVDVCAlZywlZyAlZywlZ1xuIiwKLSAgICAgICAgICAgICAgICB4bCgpLCB5bCgpLAotICAgICAgICAgICAgICAgIHhoKCksIHloKCkpOwotfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gbGVmaVZpYVJ1bGUKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLWxlZmlWaWFSdWxlOjpsZWZpVmlhUnVsZSgpCi06IG5hbWVfKE5VTEwpLAotICBuYW1lU2l6ZV8oMCksCi0gIGhhc0dlbmVyYXRlXygwKSwKLSAgaGFzRGVmYXVsdF8oMCksCi0gIG51bUxheWVyc18oMCksCi0gIG51bVZpYXNfKDApLAotICB2aWFzQWxsb2NhdGVkXygwKSwKLSAgdmlhc18oTlVMTCksCi0gIG51bVByb3BzXygwKSwKLSAgcHJvcHNBbGxvY2F0ZWRfKDApLAotICBuYW1lc18oTlVMTCksCi0gIHZhbHVlc18oTlVMTCksCi0gIGR2YWx1ZXNfKE5VTEwpLAotICB0eXBlc18oTlVMTCkKLXsKLSAgICBJbml0KCk7Ci19Ci0KLXZvaWQKLWxlZmlWaWFSdWxlOjpJbml0KCkKLXsKLSAgICBuYW1lU2l6ZV8gPSAxNjsKLSAgICBuYW1lXyA9IChjaGFyKikgbGVmTWFsbG9jKDE2KTsKLSAgICB2aWFzQWxsb2NhdGVkXyA9IDI7Ci0gICAgdmlhc18gPSAoY2hhcioqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIqKSAqIDIpOwotICAgIGxheWVyc19bMF0uSW5pdCgpOwotICAgIGxheWVyc19bMV0uSW5pdCgpOwotICAgIGxheWVyc19bMl0uSW5pdCgpOwotICAgIG51bUxheWVyc18gPSAwOwotICAgIG51bVZpYXNfID0gMDsKLSAgICBudW1Qcm9wc18gPSAwOwotICAgIHByb3BzQWxsb2NhdGVkXyA9IDE7Ci0gICAgbmFtZXNfID0gKGNoYXIqKikgbGVmTWFsbG9jKHNpemVvZihjaGFyKikpOwotICAgIHZhbHVlc18gPSAoY2hhcioqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIqKSk7Ci0gICAgZHZhbHVlc18gPSAoZG91YmxlKikgbGVmTWFsbG9jKHNpemVvZihkb3VibGUpKTsKLSAgICB0eXBlc18gPSAoY2hhciopIGxlZk1hbGxvYyhzaXplb2YoY2hhcikpOwotfQotCi12b2lkCi1sZWZpVmlhUnVsZTo6Y2xlYXIoKQotewotICAgIGludCBpOwotICAgIGhhc0dlbmVyYXRlXyA9IDA7Ci0gICAgaGFzRGVmYXVsdF8gPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1Qcm9wc187IGkrKykgewotICAgICAgICBsZWZGcmVlKG5hbWVzX1tpXSk7Ci0gICAgICAgIGxlZkZyZWUodmFsdWVzX1tpXSk7Ci0gICAgICAgIGR2YWx1ZXNfW2ldID0gMDsKLSAgICB9Ci0gICAgbnVtUHJvcHNfID0gMDsKLSAgICBudW1MYXllcnNfID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVmlhc187IGkrKykgewotICAgICAgICBsZWZGcmVlKHZpYXNfW2ldKTsKLSAgICB9Ci0gICAgbnVtVmlhc18gPSAwOwotfQotCi12b2lkCi1sZWZpVmlhUnVsZTo6Y2xlYXJMYXllck92ZXJoYW5nKCkKLXsKLSAgICBsYXllcnNfWzBdLmNsZWFyTGF5ZXJPdmVyaGFuZygpOwotICAgIGxheWVyc19bMV0uY2xlYXJMYXllck92ZXJoYW5nKCk7Ci19Ci0KLXZvaWQKLWxlZmlWaWFSdWxlOjpzZXROYW1lKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgaW50IGxlbiA9IHN0cmxlbihuYW1lKSArIDE7Ci0gICAgaWYgKGxlbiA+IG5hbWVTaXplXykgewotICAgICAgICBsZWZGcmVlKG5hbWVfKTsKLSAgICAgICAgbmFtZV8gPSAoY2hhciopIGxlZk1hbGxvYyhsZW4pOwotICAgICAgICBuYW1lU2l6ZV8gPSBsZW47Ci0gICAgfQotICAgIHN0cmNweShuYW1lXywgQ0FTRShuYW1lKSk7Ci0gICAgY2xlYXIoKTsKLX0KLQotdm9pZAotbGVmaVZpYVJ1bGU6OkRlc3Ryb3koKQotewotICAgIGNsZWFyKCk7Ci0gICAgbGVmRnJlZShuYW1lXyk7Ci0gICAgbGVmRnJlZSgoY2hhciopICh2aWFzXykpOwotICAgIGxlZkZyZWUoKGNoYXIqKSAobmFtZXNfKSk7Ci0gICAgbGVmRnJlZSgoY2hhciopICh2YWx1ZXNfKSk7Ci0gICAgbGVmRnJlZSgoY2hhciopIChkdmFsdWVzXykpOwotICAgIGxlZkZyZWUoKGNoYXIqKSAodHlwZXNfKSk7Ci0gICAgbGF5ZXJzX1swXS5EZXN0cm95KCk7Ci0gICAgbGF5ZXJzX1sxXS5EZXN0cm95KCk7Ci0gICAgbGF5ZXJzX1syXS5EZXN0cm95KCk7Ci19Ci0KLWxlZmlWaWFSdWxlOjp+bGVmaVZpYVJ1bGUoKQotewotICAgIERlc3Ryb3koKTsKLX0KLQotdm9pZAotbGVmaVZpYVJ1bGU6OnNldEdlbmVyYXRlKCkKLXsKLSAgICBoYXNHZW5lcmF0ZV8gPSAxOwotfQotCi12b2lkCi1sZWZpVmlhUnVsZTo6c2V0RGVmYXVsdCgpCi17Ci0gICAgaGFzRGVmYXVsdF8gPSAxOwotfQotCi12b2lkCi1sZWZpVmlhUnVsZTo6YWRkVmlhTmFtZShjb25zdCBjaGFyICpuYW1lKQotewotICAgIC8vIEFkZCBvbmUgb2YgcG9zc2libHkgbWFueSB2aWEgbmFtZXMKLSAgICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLSAgICBpZiAobnVtVmlhc18gPT0gdmlhc0FsbG9jYXRlZF8pIHsKLSAgICAgICAgaW50ICAgICBpOwotICAgICAgICBjaGFyICAgICoqbm47Ci0gICAgICAgIGlmICh2aWFzQWxsb2NhdGVkXyA9PSAwKQotICAgICAgICAgICAgdmlhc0FsbG9jYXRlZF8gPSAyOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB2aWFzQWxsb2NhdGVkXyAqPSAyOwotICAgICAgICBubiA9IChjaGFyKiopIGxlZk1hbGxvYyhzaXplb2YoY2hhciopICogdmlhc0FsbG9jYXRlZF8pOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVmlhc187IGkrKykKLSAgICAgICAgICAgIG5uW2ldID0gdmlhc19baV07Ci0gICAgICAgIGxlZkZyZWUoKGNoYXIqKSAodmlhc18pKTsKLSAgICAgICAgdmlhc18gPSBubjsKLSAgICB9Ci0gICAgdmlhc19bbnVtVmlhc19dID0gKGNoYXIqKSBsZWZNYWxsb2MobGVuKTsKLSAgICBzdHJjcHkodmlhc19bbnVtVmlhc19dLCBDQVNFKG5hbWUpKTsKLSAgICBudW1WaWFzXyArPSAxOwotfQotCi12b2lkCi1sZWZpVmlhUnVsZTo6c2V0UmVjdChkb3VibGUgeGwsCi0gICAgICAgICAgICAgICAgICAgICBkb3VibGUgeWwsCi0gICAgICAgICAgICAgICAgICAgICBkb3VibGUgeGgsCi0gICAgICAgICAgICAgICAgICAgICBkb3VibGUgeWgpCi17Ci0gICAgbGF5ZXJzX1tudW1MYXllcnNfIC0gMV0uc2V0UmVjdCh4bCwgeWwsIHhoLCB5aCk7Ci19Ci0KLXZvaWQKLWxlZmlWaWFSdWxlOjpzZXRTcGFjaW5nKGRvdWJsZSAgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgeSkKLXsKLSAgICBsYXllcnNfW251bUxheWVyc18gLSAxXS5zZXRTcGFjaW5nKHgsIHkpOwotfQotCi12b2lkCi1sZWZpVmlhUnVsZTo6c2V0V2lkdGgoZG91YmxlICAgIHgsCi0gICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgIHkpCi17Ci0gICAgbGF5ZXJzX1tudW1MYXllcnNfIC0gMV0uc2V0V2lkdGgoeCwgeSk7Ci19Ci0KLXZvaWQKLWxlZmlWaWFSdWxlOjpzZXRSZXNpc3RhbmNlKGRvdWJsZSBkKQotewotICAgIGxheWVyc19bbnVtTGF5ZXJzXyAtIDFdLnNldFJlc2lzdGFuY2UoZCk7Ci19Ci0KLXZvaWQKLWxlZmlWaWFSdWxlOjpzZXRPdmVyaGFuZyhkb3VibGUgZCkKLXsKLSAgICBsYXllcnNfW251bUxheWVyc18gLSAxXS5zZXRPdmVyaGFuZyhkKTsKLX0KLQotLy8gNS42LCB0cnkgdG8gc2V0IHZhbHVlIHRvIGxheWVyc19bMF0gJiBsYXllcnNfWzFdCi12b2lkCi1sZWZpVmlhUnVsZTo6c2V0T3ZlcmhhbmdUb0VuY2xvc3VyZShkb3VibGUgZCkKLXsKLSAgICBsYXllcnNfWzBdLnNldE92ZXJoYW5nVG9FbmNsb3N1cmUoZCk7Ci0gICAgbGF5ZXJzX1sxXS5zZXRPdmVyaGFuZ1RvRW5jbG9zdXJlKGQpOwotfQotCi12b2lkCi1sZWZpVmlhUnVsZTo6c2V0TWV0YWxPdmVyaGFuZyhkb3VibGUgZCkKLXsKLSAgICBsYXllcnNfW251bUxheWVyc18gLSAxXS5zZXRNZXRhbE92ZXJoYW5nKGQpOwotfQotCi12b2lkCi1sZWZpVmlhUnVsZTo6c2V0VmVydGljYWwoKQotewotICAgIGxheWVyc19bbnVtTGF5ZXJzXyAtIDFdLnNldFZlcnRpY2FsKCk7Ci19Ci0KLXZvaWQKLWxlZmlWaWFSdWxlOjpzZXRIb3Jpem9udGFsKCkKLXsKLSAgICBsYXllcnNfW251bUxheWVyc18gLSAxXS5zZXRIb3Jpem9udGFsKCk7Ci19Ci0KLXZvaWQKLWxlZmlWaWFSdWxlOjpzZXRFbmNsb3N1cmUoZG91YmxlICAgIG92ZXJoYW5nMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgIG92ZXJoYW5nMikKLXsKLSAgICBsYXllcnNfW251bUxheWVyc18gLSAxXS5zZXRFbmNsb3N1cmUob3ZlcmhhbmcxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyaGFuZzIpOwotfQotCi12b2lkCi1sZWZpVmlhUnVsZTo6c2V0TGF5ZXIoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBpZiAobnVtTGF5ZXJzXyA9PSAzKSB7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxNDMwLCAiRVJST1IgKExFRlBBUlMtMTQzMCk6IHRvbyBtYW55IHZpYSBydWxlIGxheWVycyIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIC8vIFRoaXMgcm91dGluZSBzZXRzIGFuZCBjcmVhdGVzIHRoZSBhY3RpdmUgbGF5ZXIuCi0gICAgbGF5ZXJzX1tudW1MYXllcnNfXS5zZXROYW1lKG5hbWUpOwotICAgIG51bUxheWVyc18gKz0gMTsKLX0KLQotaW50Ci1sZWZpVmlhUnVsZTo6aGFzR2VuZXJhdGUoKSBjb25zdAotewotICAgIHJldHVybiBoYXNHZW5lcmF0ZV87Ci19Ci0KLWludAotbGVmaVZpYVJ1bGU6Omhhc0RlZmF1bHQoKSBjb25zdAotewotICAgIHJldHVybiBoYXNEZWZhdWx0XzsKLX0KLQotaW50Ci1sZWZpVmlhUnVsZTo6bnVtTGF5ZXJzKCkgY29uc3QKLXsKLSAgICAvLyBUaGVyZSBhcmUgMiBvciAzIGxheWVycyBpbiBhIHJ1bGUuCi0gICAgLy8gbnVtTGF5ZXJzKCkgdGVsbHMgaG93IG1hbnkuCi0gICAgLy8gSWYgYSB0aGlyZCBsYXllciBleGlzdHMgdGhlbiBpdCBpcyB0aGUgY3V0IGxheWVyLgotICAgIHJldHVybiBudW1MYXllcnNfOwotfQotCi1sZWZpVmlhUnVsZUxheWVyICoKLWxlZmlWaWFSdWxlOjpsYXllcihpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IDIpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiAobGVmaVZpYVJ1bGVMYXllciopICYobGF5ZXJzX1tpbmRleF0pOwotfQotCi1jaGFyICoKLWxlZmlWaWFSdWxlOjpuYW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbmFtZV87Ci19Ci0KLXZvaWQKLWxlZmlWaWFSdWxlOjpwcmludChGSUxFICpmKSBjb25zdAotewotICAgIGludCBpOwotICAgIGZwcmludGYoZiwgIlZJQSBSVUxFICVzIiwgbmFtZSgpKTsKLSAgICBpZiAoaGFzR2VuZXJhdGUoKSkKLSAgICAgICAgZnByaW50ZihmLCAiIEdFTkVSQVRFIik7Ci0gICAgZnByaW50ZihmLCAiXG4iKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBudW1MYXllcnMoKTsgaSsrKSB7Ci0gICAgICAgIGxheWVyc19baV0ucHJpbnQoZik7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IG51bVZpYXMoKTsgaSsrKSB7Ci0gICAgICAgIGZwcmludGYoZiwgIiAgVmlhICVzXG4iLCB2aWFOYW1lKGkpKTsKLSAgICB9Ci19Ci0KLWludAotbGVmaVZpYVJ1bGU6Om51bVZpYXMoKSBjb25zdAotewotICAgIHJldHVybiBudW1WaWFzXzsKLX0KLQotY2hhciAqCi1sZWZpVmlhUnVsZTo6dmlhTmFtZShpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1WaWFzXykKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHZpYXNfW2luZGV4XTsKLX0KLQotaW50Ci1sZWZpVmlhUnVsZTo6bnVtUHJvcHMoKSBjb25zdAotewotICAgIHJldHVybiBudW1Qcm9wc187Ci19Ci0KLXZvaWQKLWxlZmlWaWFSdWxlOjphZGRQcm9wKGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgdHlwZSkKLXsKLSAgICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLSAgICBpZiAobnVtUHJvcHNfID09IHByb3BzQWxsb2NhdGVkXykgewotICAgICAgICBpbnQgICAgIGk7Ci0gICAgICAgIGludCAgICAgbWF4OwotICAgICAgICBpbnQgICAgIGxpbTsKLSAgICAgICAgY2hhciAgICAqKm5uOwotICAgICAgICBjaGFyICAgICoqbnY7Ci0gICAgICAgIGRvdWJsZSAgKm5kOwotICAgICAgICBjaGFyICAgICpudDsKLQotICAgICAgICBpZiAocHJvcHNBbGxvY2F0ZWRfID09IDApCi0gICAgICAgICAgICBwcm9wc0FsbG9jYXRlZF8gPSAxOyAgICAvLyBpbml0aWFsaXplIHByb3BzQWxsb2NhdGVkXwotICAgICAgICBtYXggPSBwcm9wc0FsbG9jYXRlZF8gKj0gMjsKLSAgICAgICAgbGltID0gbnVtUHJvcHNfOwotICAgICAgICBubiA9IChjaGFyKiopIGxlZk1hbGxvYyhzaXplb2YoY2hhciopICogbWF4KTsKLSAgICAgICAgbnYgPSAoY2hhcioqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIqKSAqIG1heCk7Ci0gICAgICAgIG5kID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIG1heCk7Ci0gICAgICAgIG50ID0gKGNoYXIqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIpICogbWF4KTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbTsgaSsrKSB7Ci0gICAgICAgICAgICBubltpXSA9IG5hbWVzX1tpXTsKLSAgICAgICAgICAgIG52W2ldID0gdmFsdWVzX1tpXTsKLSAgICAgICAgICAgIG5kW2ldID0gZHZhbHVlc19baV07Ci0gICAgICAgICAgICBudFtpXSA9IHR5cGVzX1tpXTsKLSAgICAgICAgfQotICAgICAgICBsZWZGcmVlKChjaGFyKikgKG5hbWVzXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHZhbHVlc18pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChkdmFsdWVzXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHR5cGVzXykpOwotICAgICAgICBuYW1lc18gPSBubjsKLSAgICAgICAgdmFsdWVzXyA9IG52OwotICAgICAgICBkdmFsdWVzXyA9IG5kOwotICAgICAgICB0eXBlc18gPSBudDsKLSAgICB9Ci0gICAgbmFtZXNfW251bVByb3BzX10gPSAoY2hhciopIGxlZk1hbGxvYyhzaXplb2YoY2hhcikgKiBsZW4pOwotICAgIHN0cmNweShuYW1lc19bbnVtUHJvcHNfXSwgbmFtZSk7Ci0gICAgbGVuID0gc3RybGVuKHZhbHVlKSArIDE7Ci0gICAgdmFsdWVzX1tudW1Qcm9wc19dID0gKGNoYXIqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIpICogbGVuKTsKLSAgICBzdHJjcHkodmFsdWVzX1tudW1Qcm9wc19dLCB2YWx1ZSk7Ci0gICAgZHZhbHVlc19bbnVtUHJvcHNfXSA9IDA7Ci0gICAgdHlwZXNfW251bVByb3BzX10gPSB0eXBlOwotICAgIG51bVByb3BzXyArPSAxOwotfQotCi12b2lkCi1sZWZpVmlhUnVsZTo6YWRkTnVtUHJvcChjb25zdCBjaGFyICAgICAgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgICAgZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgdHlwZSkKLXsKLSAgICBpbnQgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKLSAgICBpZiAobnVtUHJvcHNfID09IHByb3BzQWxsb2NhdGVkXykgewotICAgICAgICBpbnQgICAgIGk7Ci0gICAgICAgIGludCAgICAgbWF4OwotICAgICAgICBpbnQgICAgIGxpbTsKLSAgICAgICAgY2hhciAgICAqKm5uOwotICAgICAgICBjaGFyICAgICoqbnY7Ci0gICAgICAgIGRvdWJsZSAgKm5kOwotICAgICAgICBjaGFyICAgICpudDsKLQotICAgICAgICBpZiAocHJvcHNBbGxvY2F0ZWRfID09IDApCi0gICAgICAgICAgICBwcm9wc0FsbG9jYXRlZF8gPSAxOyAgICAvLyBpbml0aWFsaXplIHByb3BzQWxsb2NhdGVkXwotICAgICAgICBtYXggPSBwcm9wc0FsbG9jYXRlZF8gKj0gMjsKLSAgICAgICAgbGltID0gbnVtUHJvcHNfOwotICAgICAgICBubiA9IChjaGFyKiopIGxlZk1hbGxvYyhzaXplb2YoY2hhciopICogbWF4KTsKLSAgICAgICAgbnYgPSAoY2hhcioqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIqKSAqIG1heCk7Ci0gICAgICAgIG5kID0gKGRvdWJsZSopIGxlZk1hbGxvYyhzaXplb2YoZG91YmxlKSAqIG1heCk7Ci0gICAgICAgIG50ID0gKGNoYXIqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIpICogbWF4KTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbTsgaSsrKSB7Ci0gICAgICAgICAgICBubltpXSA9IG5hbWVzX1tpXTsKLSAgICAgICAgICAgIG52W2ldID0gdmFsdWVzX1tpXTsKLSAgICAgICAgICAgIG5kW2ldID0gZHZhbHVlc19baV07Ci0gICAgICAgICAgICBudFtpXSA9IHR5cGVzX1tpXTsKLSAgICAgICAgfQotICAgICAgICBsZWZGcmVlKChjaGFyKikgKG5hbWVzXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHZhbHVlc18pKTsKLSAgICAgICAgbGVmRnJlZSgoY2hhciopIChkdmFsdWVzXykpOwotICAgICAgICBsZWZGcmVlKChjaGFyKikgKHR5cGVzXykpOwotICAgICAgICBuYW1lc18gPSBubjsKLSAgICAgICAgdmFsdWVzXyA9IG52OwotICAgICAgICBkdmFsdWVzXyA9IG5kOwotICAgICAgICB0eXBlc18gPSBudDsKLSAgICB9Ci0gICAgbmFtZXNfW251bVByb3BzX10gPSAoY2hhciopIGxlZk1hbGxvYyhzaXplb2YoY2hhcikgKiBsZW4pOwotICAgIHN0cmNweShuYW1lc19bbnVtUHJvcHNfXSwgbmFtZSk7Ci0gICAgbGVuID0gc3RybGVuKHZhbHVlKSArIDE7Ci0gICAgdmFsdWVzX1tudW1Qcm9wc19dID0gKGNoYXIqKSBsZWZNYWxsb2Moc2l6ZW9mKGNoYXIpICogbGVuKTsKLSAgICBzdHJjcHkodmFsdWVzX1tudW1Qcm9wc19dLCB2YWx1ZSk7Ci0gICAgZHZhbHVlc19bbnVtUHJvcHNfXSA9IGQ7Ci0gICAgdHlwZXNfW251bVByb3BzX10gPSB0eXBlOwotICAgIG51bVByb3BzXyArPSAxOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlWaWFSdWxlOjpwcm9wTmFtZShpbnQgaSkgY29uc3QKLXsKLSAgICBjaGFyIG1zZ1sxNjBdOwotICAgIGlmIChpIDwgMCB8fCBpID49IG51bVByb3BzXykgewotICAgICAgICBzcHJpbnRmKG1zZywgIkVSUk9SIChMRUZQQVJTLTE0MzEpOiBUaGUgaW5kZXggbnVtYmVyICVkIGdpdmVuIGZvciB0aGUgVklBUlVMRSBQUk9QRVJUWSBpcyBpbnZhbGlkLlxuVmFsaWQgaW5kZXggaXMgZnJvbSAwIHRvICVkIiwgaSwgbnVtUHJvcHNfKTsKLSAgICAgICAgbGVmaUVycm9yKDAsIDE0MzEsIG1zZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gbmFtZXNfW2ldOwotfQotCi1jb25zdCBjaGFyICoKLWxlZmlWaWFSdWxlOjpwcm9wVmFsdWUoaW50IGkpIGNvbnN0Ci17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaSA8IDAgfHwgaSA+PSBudW1Qcm9wc18pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xNDMxKTogVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIFZJQVJVTEUgUFJPUEVSVFkgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGksIG51bVByb3BzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxNDMxLCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVlc19baV07Ci19Ci0KLWRvdWJsZQotbGVmaVZpYVJ1bGU6OnByb3BOdW1iZXIoaW50IGkpIGNvbnN0Ci17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaSA8IDAgfHwgaSA+PSBudW1Qcm9wc18pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xNDMxKTogVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIFZJQVJVTEUgUFJPUEVSVFkgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGksIG51bVByb3BzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxNDMxLCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIGR2YWx1ZXNfW2ldOwotfQotCi1jb25zdCBjaGFyCi1sZWZpVmlhUnVsZTo6cHJvcFR5cGUoaW50IGkpIGNvbnN0Ci17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaSA8IDAgfHwgaSA+PSBudW1Qcm9wc18pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xNDMxKTogVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIFZJQVJVTEUgUFJPUEVSVFkgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGksIG51bVByb3BzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxNDMxLCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHR5cGVzX1tpXTsKLX0KLQotaW50Ci1sZWZpVmlhUnVsZTo6cHJvcElzTnVtYmVyKGludCBpKSBjb25zdAotewotICAgIGNoYXIgbXNnWzE2MF07Ci0gICAgaWYgKGkgPCAwIHx8IGkgPj0gbnVtUHJvcHNfKSB7Ci0gICAgICAgIHNwcmludGYobXNnLCAiRVJST1IgKExFRlBBUlMtMTQzMSk6IFRoZSBpbmRleCBudW1iZXIgJWQgZ2l2ZW4gZm9yIHRoZSBWSUFSVUxFIFBST1BFUlRZIGlzIGludmFsaWQuXG5WYWxpZCBpbmRleCBpcyBmcm9tIDAgdG8gJWQiLCBpLCBudW1Qcm9wc18pOwotICAgICAgICBsZWZpRXJyb3IoMCwgMTQzMSwgbXNnKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBkdmFsdWVzX1tpXSA/IDEgOiAwOwotfQotCi1pbnQKLWxlZmlWaWFSdWxlOjpwcm9wSXNTdHJpbmcoaW50IGkpIGNvbnN0Ci17Ci0gICAgY2hhciBtc2dbMTYwXTsKLSAgICBpZiAoaSA8IDAgfHwgaSA+PSBudW1Qcm9wc18pIHsKLSAgICAgICAgc3ByaW50Zihtc2csICJFUlJPUiAoTEVGUEFSUy0xNDMxKTogVGhlIGluZGV4IG51bWJlciAlZCBnaXZlbiBmb3IgdGhlIFZJQVJVTEUgUFJPUEVSVFkgaXMgaW52YWxpZC5cblZhbGlkIGluZGV4IGlzIGZyb20gMCB0byAlZCIsIGksIG51bVByb3BzXyk7Ci0gICAgICAgIGxlZmlFcnJvcigwLCAxNDMxLCBtc2cpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIGR2YWx1ZXNfW2ldID8gMCA6IDE7Ci19Ci1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZpVmlhUnVsZS5ocHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlWaWFSdWxlLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ExN2M4ZC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZmlWaWFSdWxlLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyIC0gMjAxMywgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpZm5kZWYgbGVmaVZpYVJ1bGVfaAotI2RlZmluZSBsZWZpVmlhUnVsZV9oCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImxlZmlLUkRlZnMuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1jbGFzcyBsZWZpVmlhUnVsZUxheWVyIHsKLXB1YmxpYzoKLSAgbGVmaVZpYVJ1bGVMYXllcigpOwotICB2b2lkIEluaXQoKTsKLQotICB2b2lkIERlc3Ryb3koKTsKLSAgfmxlZmlWaWFSdWxlTGF5ZXIoKTsKLSAgdm9pZCBjbGVhckxheWVyT3ZlcmhhbmcoKTsKLQotICB2b2lkIHNldE5hbWUoY29uc3QgY2hhciogbmFtZSk7Ci0gIHZvaWQgc2V0SG9yaXpvbnRhbCgpOwotICB2b2lkIHNldFZlcnRpY2FsKCk7Ci0gIHZvaWQgc2V0RW5jbG9zdXJlKGRvdWJsZSBvdmVyaGFuZzEsIGRvdWJsZSBvdmVyaGFuZzIpOyAgICAgLy8gNS41Ci0gIHZvaWQgc2V0V2lkdGgoZG91YmxlIG1pblcsIGRvdWJsZSBtYXhXKTsKLSAgdm9pZCBzZXRPdmVyaGFuZyhkb3VibGUgZCk7Ci0gIHZvaWQgc2V0T3ZlcmhhbmdUb0VuY2xvc3VyZShkb3VibGUgZCk7ICAgICAgICAgICAgICAgICAgICAgLy8gNS42Ci0gIHZvaWQgc2V0TWV0YWxPdmVyaGFuZyhkb3VibGUgZCk7Ci0gIHZvaWQgc2V0UmVzaXN0YW5jZShkb3VibGUgZCk7Ci0gIHZvaWQgc2V0U3BhY2luZyhkb3VibGUgeCwgZG91YmxlIHkpOwotICB2b2lkIHNldFJlY3QoZG91YmxlIHhsLCBkb3VibGUgeWwsIGRvdWJsZSB4aCwgZG91YmxlIHloKTsKLQotICBpbnQgaGFzRGlyZWN0aW9uKCkgY29uc3QgOwotICBpbnQgaGFzRW5jbG9zdXJlKCkgY29uc3QgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNQotICBpbnQgaGFzV2lkdGgoKSBjb25zdCA7Ci0gIGludCBoYXNSZXNpc3RhbmNlKCkgY29uc3QgOwotICBpbnQgaGFzT3ZlcmhhbmcoKSBjb25zdCA7Ci0gIGludCBoYXNNZXRhbE92ZXJoYW5nKCkgY29uc3QgOwotICBpbnQgaGFzU3BhY2luZygpIGNvbnN0IDsKLSAgaW50IGhhc1JlY3QoKSBjb25zdCA7Ci0KLSAgY2hhciogbmFtZSgpIGNvbnN0IDsKLSAgaW50IGlzSG9yaXpvbnRhbCgpIGNvbnN0IDsKLSAgaW50IGlzVmVydGljYWwoKSBjb25zdCA7Ci0gIGRvdWJsZSBlbmNsb3N1cmVPdmVyaGFuZzEoKSBjb25zdDsgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjUKLSAgZG91YmxlIGVuY2xvc3VyZU92ZXJoYW5nMigpIGNvbnN0OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNQotICBkb3VibGUgd2lkdGhNaW4oKSBjb25zdCA7Ci0gIGRvdWJsZSB3aWR0aE1heCgpIGNvbnN0IDsKLSAgZG91YmxlIG92ZXJoYW5nKCkgY29uc3QgOwotICBkb3VibGUgbWV0YWxPdmVyaGFuZygpIGNvbnN0IDsKLSAgZG91YmxlIHJlc2lzdGFuY2UoKSBjb25zdCA7Ci0gIGRvdWJsZSBzcGFjaW5nU3RlcFgoKSBjb25zdCA7Ci0gIGRvdWJsZSBzcGFjaW5nU3RlcFkoKSBjb25zdCA7Ci0gIGRvdWJsZSB4bCgpIGNvbnN0IDsKLSAgZG91YmxlIHlsKCkgY29uc3QgOwotICBkb3VibGUgeGgoKSBjb25zdCA7Ci0gIGRvdWJsZSB5aCgpIGNvbnN0IDsKLQotICAvLyBEZWJ1ZyBwcmludAotICB2b2lkIHByaW50KEZJTEUqIGYpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gIGNoYXIqIG5hbWVfOwotICBjaGFyIGRpcmVjdGlvbl87Ci0gIGRvdWJsZSBvdmVyaGFuZzFfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNQotICBkb3VibGUgb3ZlcmhhbmcyXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjUKLSAgaW50IGhhc1dpZHRoXzsKLSAgaW50IGhhc1Jlc2lzdGFuY2VfOwotICBpbnQgaGFzT3ZlcmhhbmdfOwotICBpbnQgaGFzTWV0YWxPdmVyaGFuZ187Ci0gIGludCBoYXNTcGFjaW5nXzsKLSAgaW50IGhhc1JlY3RfOwotICBkb3VibGUgd2lkdGhNaW5fOwotICBkb3VibGUgd2lkdGhNYXhfOwotICBkb3VibGUgb3ZlcmhhbmdfOwotICBkb3VibGUgbWV0YWxPdmVyaGFuZ187Ci0gIGRvdWJsZSByZXNpc3RhbmNlXzsKLSAgZG91YmxlIHNwYWNpbmdTdGVwWF87Ci0gIGRvdWJsZSBzcGFjaW5nU3RlcFlfOwotICBkb3VibGUgeGxfLCB5bF8sIHhoXywgeWhfOwotfTsKLQotY2xhc3MgbGVmaVZpYVJ1bGUgewotcHVibGljOgotICBsZWZpVmlhUnVsZSgpOwotICB2b2lkIEluaXQoKTsKLQotICB2b2lkIGNsZWFyKCk7Ci0gIHZvaWQgY2xlYXJMYXllck92ZXJoYW5nKCk7Ci0KLSAgdm9pZCBEZXN0cm95KCk7Ci0gIH5sZWZpVmlhUnVsZSgpOwotCi0gIHZvaWQgc2V0R2VuZXJhdGUoKTsKLSAgdm9pZCBzZXREZWZhdWx0KCk7Ci0KLSAgLy8gVGhpcyBzaG91bGQgY2xlYXIgb3V0IGFsbCB0aGUgb2xkIHN0dWZmLgotICB2b2lkIHNldE5hbWUoY29uc3QgY2hhciogbmFtZSk7Ci0KLSAgLy8gQWRkIG9uZSBvZiBwb3NzaWJseSBtYW55IHZpYSBuYW1lcwotICB2b2lkIGFkZFZpYU5hbWUoY29uc3QgY2hhciogbmFtZSk7Ci0KLSAgLy8gVGhlc2Ugcm91dGluZXMgc2V0IGEgcGFydCBvZiB0aGUgYWN0aXZlIGxheWVyLgotICB2b2lkIHNldFJlY3QoZG91YmxlIHhsLCBkb3VibGUgeWwsIGRvdWJsZSB4aCwgZG91YmxlIHloKTsKLSAgdm9pZCBzZXRTcGFjaW5nKGRvdWJsZSB4LCBkb3VibGUgeSk7Ci0gIHZvaWQgc2V0V2lkdGgoZG91YmxlIHgsIGRvdWJsZSB5KTsKLSAgdm9pZCBzZXRSZXNpc3RhbmNlKGRvdWJsZSBkKTsKLSAgdm9pZCBzZXRPdmVyaGFuZyhkb3VibGUgZCk7Ci0gIHZvaWQgc2V0T3ZlcmhhbmdUb0VuY2xvc3VyZShkb3VibGUgZCk7ICAgICAgICAgICAgLy8gNS42Ci0gIHZvaWQgc2V0TWV0YWxPdmVyaGFuZyhkb3VibGUgZCk7Ci0gIHZvaWQgc2V0VmVydGljYWwoKTsKLSAgdm9pZCBzZXRIb3Jpem9udGFsKCk7Ci0gIHZvaWQgc2V0RW5jbG9zdXJlKGRvdWJsZSBvdmVyaGFuZzEsIGRvdWJsZSBvdmVyaGFuZzIpOwotICB2b2lkIGFkZFByb3AoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdmFsdWUsIGNvbnN0IGNoYXIgdHlwZSk7Ci0gIHZvaWQgYWRkTnVtUHJvcChjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBkb3VibGUgZCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhbHVlLCBjb25zdCBjaGFyIHR5cGUpOwotCi0gIC8vIFRoaXMgcm91dGluZSBzZXRzIGFuZCBjcmVhdGVzIHRoZSBhY3RpdmUgbGF5ZXIuCi0gIHZvaWQgc2V0TGF5ZXIoY29uc3QgY2hhciogbmFtZSk7Ci0KLSAgaW50IGhhc0dlbmVyYXRlKCkgY29uc3QgOwotICBpbnQgaGFzRGVmYXVsdCgpIGNvbnN0IDsKLSAgY2hhciogbmFtZSgpIGNvbnN0IDsKLQotICAvLyBUaGVyZSBhcmUgMiBvciAzIGxheWVycyBpbiBhIHJ1bGUuCi0gIC8vIG51bUxheWVycygpIHRlbGxzIGhvdyBtYW55LgotICAvLyBJZiBhIHRoaXJkIGxheWVyIGV4aXN0cyB0aGVuIGl0IGlzIHRoZSBjdXQgbGF5ZXIuCi0gIGludCBudW1MYXllcnMoKSBjb25zdCA7Ci0gIGxlZmlWaWFSdWxlTGF5ZXIqIGxheWVyKGludCBpbmRleCkgY29uc3Q7Ci0KLSAgaW50IG51bVZpYXMoKSBjb25zdCA7Ci0gIGNoYXIqIHZpYU5hbWUoaW50IGluZGV4KSBjb25zdCA7Ci0KLSAgaW50IG51bVByb3BzKCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIqICBwcm9wTmFtZShpbnQgaW5kZXgpIGNvbnN0OwotICBjb25zdCBjaGFyKiAgcHJvcFZhbHVlKGludCBpbmRleCkgY29uc3Q7Ci0gIGRvdWJsZSBwcm9wTnVtYmVyKGludCBpbmRleCkgY29uc3Q7Ci0gIGNvbnN0IGNoYXIgICBwcm9wVHlwZShpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgICAgcHJvcElzTnVtYmVyKGludCBpbmRleCkgY29uc3Q7Ci0gIGludCAgICBwcm9wSXNTdHJpbmcoaW50IGluZGV4KSBjb25zdDsKLQotICAvLyBEZWJ1ZyBwcmludAotICB2b2lkIHByaW50KEZJTEUqIGYpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gIGNoYXIqIG5hbWVfOwotICBpbnQgbmFtZVNpemVfOwotIAotICBpbnQgaGFzR2VuZXJhdGVfOwotICBpbnQgaGFzRGVmYXVsdF87Ci0KLSAgaW50IG51bUxheWVyc187Ci0gIGxlZmlWaWFSdWxlTGF5ZXIgbGF5ZXJzX1szXTsKLQotICBpbnQgbnVtVmlhc187Ci0gIGludCB2aWFzQWxsb2NhdGVkXzsKLSAgY2hhcioqIHZpYXNfOwotCi0gIGludCBudW1Qcm9wc187Ci0gIGludCBwcm9wc0FsbG9jYXRlZF87Ci0gIGNoYXIqKiAgbmFtZXNfOwotICBjaGFyKiogIHZhbHVlc187Ci0gIGRvdWJsZSogZHZhbHVlc187Ci0gIGNoYXIqICAgdHlwZXNfOwotfTsKLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLVVTRV9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmckNhbGxCYWNrcy5ocHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZnJDYWxsQmFja3MuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWE4ZWQ0Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmckNhbGxCYWNrcy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiAtIDIwMTcsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaWZuZGVmIGxlZnJDYWxsYmFja3NfaAotI2RlZmluZSBsZWZyQ2FsbGJhY2tzX2gKLQotI2luY2x1ZGUgImxlZmlLUkRlZnMuaHBwIgotI2luY2x1ZGUgImxlZnJSZWFkZXIuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1jbGFzcyBsZWZyQ2FsbGJhY2tzIHsKLXB1YmxpYzoKLSAgICBsZWZyQ2FsbGJhY2tzKCk7Ci0gICAgc3RhdGljIHZvaWQgcmVzZXQoKTsKLQotICAgIC8vIExpc3Qgb2YgY2FsbCBiYWNrIHJvdXRpbmVzCi0gICAgLy8gVGhlc2UgYXJlIGZpbGxlZCBpbiBieSB0aGUgdXNlci4gIFNlZSB0aGUKLSAgICAvLyAic2V0IiByb3V0aW5lcyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlCi0gICAgbGVmckRvdWJsZUNia0ZuVHlwZSBBbnRlbm5hSW5vdXRDYms7Ci0gICAgbGVmckRvdWJsZUNia0ZuVHlwZSBBbnRlbm5hSW5wdXRDYms7Ci0gICAgbGVmckRvdWJsZUNia0ZuVHlwZSBBbnRlbm5hT3V0cHV0Q2JrOwotICAgIGxlZnJTdHJpbmdDYmtGblR5cGUgQXJyYXlCZWdpbkNiazsKLSAgICBsZWZyQXJyYXlDYmtGblR5cGUgQXJyYXlDYms7Ci0gICAgbGVmclN0cmluZ0Nia0ZuVHlwZSBBcnJheUVuZENiazsKLSAgICBsZWZyU3RyaW5nQ2JrRm5UeXBlIEJ1c0JpdENoYXJzQ2JrOwotICAgIGxlZnJJbnRlZ2VyQ2JrRm5UeXBlIENhc2VTZW5zaXRpdmVDYms7Ci0gICAgbGVmclN0cmluZ0Nia0ZuVHlwZSBDbGVhcmFuY2VNZWFzdXJlQ2JrOwotICAgIGxlZnJDb3JyZWN0aW9uVGFibGVDYmtGblR5cGUgQ29ycmVjdGlvblRhYmxlQ2JrOwotICAgIGxlZnJEZW5zaXR5Q2JrRm5UeXBlIERlbnNpdHlDYms7Ci0gICAgbGVmckRvdWJsZUNia0ZuVHlwZSBEaWVsZWN0cmljQ2JrOwotICAgIGxlZnJTdHJpbmdDYmtGblR5cGUgRGl2aWRlckNoYXJDYms7Ci0gICAgbGVmckRvdWJsZUNia0ZuVHlwZSBFZGdlUmF0ZVNjYWxlRmFjdG9yQ2JrOwotICAgIGxlZnJEb3VibGVDYmtGblR5cGUgRWRnZVJhdGVUaHJlc2hvbGQxQ2JrOwotICAgIGxlZnJEb3VibGVDYmtGblR5cGUgRWRnZVJhdGVUaHJlc2hvbGQyQ2JrOwotICAgIGxlZnJTdHJpbmdDYmtGblR5cGUgRXh0ZW5zaW9uQ2JrOwotICAgIGxlZnJJbnRlZ2VyQ2JrRm5UeXBlIEZpeGVkTWFza0NiazsKLSAgICBsZWZyVm9pZENia0ZuVHlwZSBJUkRyb3BCZWdpbkNiazsKLSAgICBsZWZySVJEcm9wQ2JrRm5UeXBlIElSRHJvcENiazsKLSAgICBsZWZyVm9pZENia0ZuVHlwZSBJUkRyb3BFbmRDYms7Ci0gICAgbGVmckRvdWJsZUNia0ZuVHlwZSBJbm91dEFudGVubmFDYms7Ci0gICAgbGVmckRvdWJsZUNia0ZuVHlwZSBJbnB1dEFudGVubmFDYms7Ci0gICAgbGVmckxheWVyQ2JrRm5UeXBlIExheWVyQ2JrOwotICAgIGxlZnJWb2lkQ2JrRm5UeXBlIExpYnJhcnlFbmRDYms7Ci0gICAgbGVmclN0cmluZ0Nia0ZuVHlwZSBNYWNyb0JlZ2luQ2JrOwotICAgIGxlZnJNYWNyb0Nia0ZuVHlwZSBNYWNyb0NiazsKLSAgICBsZWZyU3RyaW5nQ2JrRm5UeXBlIE1hY3JvQ2xhc3NUeXBlQ2JrOwotICAgIGxlZnJTdHJpbmdDYmtGblR5cGUgTWFjcm9FbmRDYms7Ci0gICAgbGVmckludGVnZXJDYmtGblR5cGUgTWFjcm9GaXhlZE1hc2tDYms7Ci0gICAgbGVmck1hY3JvTnVtQ2JrRm5UeXBlIE1hY3JvT3JpZ2luQ2JrOwotICAgIGxlZnJNYWNyb1NpdGVDYmtGblR5cGUgTWFjcm9TaXRlQ2JrOwotICAgIGxlZnJNYWNyb0ZvcmVpZ25DYmtGblR5cGUgTWFjcm9Gb3JlaWduQ2JrOwotICAgIGxlZnJNYWNyb051bUNia0ZuVHlwZSBNYWNyb1NpemVDYms7Ci0gICAgbGVmckRvdWJsZUNia0ZuVHlwZSBNYW51ZmFjdHVyaW5nQ2JrOwotICAgIGxlZnJNYXhTdGFja1ZpYUNia0ZuVHlwZSBNYXhTdGFja1ZpYUNiazsKLSAgICBsZWZyTWluRmVhdHVyZUNia0ZuVHlwZSBNaW5GZWF0dXJlQ2JrOwotICAgIGxlZnJTdHJpbmdDYmtGblR5cGUgTm9XaXJlRXh0ZW5zaW9uQ2JrOwotICAgIGxlZnJOb2lzZU1hcmdpbkNia0ZuVHlwZSBOb2lzZU1hcmdpbkNiazsKLSAgICBsZWZyTm9pc2VUYWJsZUNia0ZuVHlwZSBOb2lzZVRhYmxlQ2JrOwotICAgIGxlZnJOb25EZWZhdWx0Q2JrRm5UeXBlIE5vbkRlZmF1bHRDYms7Ci0gICAgbGVmck9ic3RydWN0aW9uQ2JrRm5UeXBlIE9ic3RydWN0aW9uQ2JrOwotICAgIGxlZnJEb3VibGVDYmtGblR5cGUgT3V0cHV0QW50ZW5uYUNiazsKLSAgICBsZWZyUGluQ2JrRm5UeXBlIFBpbkNiazsKLSAgICBsZWZyVm9pZENia0ZuVHlwZSBQcm9wQmVnaW5DYms7Ci0gICAgbGVmclByb3BDYmtGblR5cGUgUHJvcENiazsKLSAgICBsZWZyVm9pZENia0ZuVHlwZSBQcm9wRW5kQ2JrOwotICAgIGxlZnJTaXRlQ2JrRm5UeXBlIFNpdGVDYms7Ci0gICAgbGVmclZvaWRDYmtGblR5cGUgU3BhY2luZ0JlZ2luQ2JrOwotICAgIGxlZnJTcGFjaW5nQ2JrRm5UeXBlIFNwYWNpbmdDYms7Ci0gICAgbGVmclZvaWRDYmtGblR5cGUgU3BhY2luZ0VuZENiazsKLSAgICBsZWZyVGltaW5nQ2JrRm5UeXBlIFRpbWluZ0NiazsKLSAgICBsZWZyVW5pdHNDYmtGblR5cGUgVW5pdHNDYms7Ci0gICAgbGVmclVzZU1pblNwYWNpbmdDYmtGblR5cGUgVXNlTWluU3BhY2luZ0NiazsKLSAgICBsZWZyRG91YmxlQ2JrRm5UeXBlIFZlcnNpb25DYms7Ci0gICAgbGVmclN0cmluZ0Nia0ZuVHlwZSBWZXJzaW9uU3RyQ2JrOwotICAgIGxlZnJWaWFDYmtGblR5cGUgVmlhQ2JrOwotICAgIGxlZnJWaWFSdWxlQ2JrRm5UeXBlIFZpYVJ1bGVDYms7Ci19OwotCi1leHRlcm4gbGVmckNhbGxiYWNrcyAqbGVmQ2FsbGJhY2tzOwotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotVVNFX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZyQ2FsbGJhY2tzLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmckNhbGxiYWNrcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MjU4MmMuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZyQ2FsbGJhY2tzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyIC0gMjAxNywgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBhcmFraG1hbiAkCi0vLyAgJFJldmlzaW9uOiAjMTEgJAotLy8gICREYXRlOiAyMDEzLzA0LzIzICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2luY2x1ZGUgImxlZnJDYWxsQmFja3MuaHBwIgotI2luY2x1ZGUgInN0cmluZy5oIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1sZWZyQ2FsbGJhY2tzOjpsZWZyQ2FsbGJhY2tzKCkKLTogQW50ZW5uYUlub3V0Q2JrKDApLAotICBBbnRlbm5hSW5wdXRDYmsoMCksCi0gIEFudGVubmFPdXRwdXRDYmsoMCksCi0gIEFycmF5QmVnaW5DYmsoMCksCi0gIEFycmF5Q2JrKDApLAotICBBcnJheUVuZENiaygwKSwKLSAgQnVzQml0Q2hhcnNDYmsoMCksCi0gIENhc2VTZW5zaXRpdmVDYmsoMCksCi0gIENsZWFyYW5jZU1lYXN1cmVDYmsoMCksCi0gIENvcnJlY3Rpb25UYWJsZUNiaygwKSwKLSAgRGVuc2l0eUNiaygwKSwKLSAgRGllbGVjdHJpY0NiaygwKSwKLSAgRGl2aWRlckNoYXJDYmsoMCksCi0gIEVkZ2VSYXRlU2NhbGVGYWN0b3JDYmsoMCksCi0gIEVkZ2VSYXRlVGhyZXNob2xkMUNiaygwKSwKLSAgRWRnZVJhdGVUaHJlc2hvbGQyQ2JrKDApLAotICBFeHRlbnNpb25DYmsoMCksCi0gIEZpeGVkTWFza0NiaygwKSwKLSAgSVJEcm9wQmVnaW5DYmsoMCksCi0gIElSRHJvcENiaygwKSwKLSAgSVJEcm9wRW5kQ2JrKDApLAotICBJbm91dEFudGVubmFDYmsoMCksCi0gIElucHV0QW50ZW5uYUNiaygwKSwKLSAgTGF5ZXJDYmsoMCksCi0gIExpYnJhcnlFbmRDYmsoMCksCi0gIE1hY3JvQmVnaW5DYmsoMCksCi0gIE1hY3JvQ2JrKDApLAotICBNYWNyb0NsYXNzVHlwZUNiaygwKSwKLSAgTWFjcm9FbmRDYmsoMCksCi0gIE1hY3JvRml4ZWRNYXNrQ2JrKDApLAotICBNYWNyb09yaWdpbkNiaygwKSwKLSAgTWFjcm9TaXRlQ2JrKDApLAotICBNYWNyb0ZvcmVpZ25DYmsoMCksCi0gIE1hY3JvU2l6ZUNiaygwKSwKLSAgTWFudWZhY3R1cmluZ0NiaygwKSwKLSAgTWF4U3RhY2tWaWFDYmsoMCksCi0gIE1pbkZlYXR1cmVDYmsoMCksCi0gIE5vV2lyZUV4dGVuc2lvbkNiaygwKSwKLSAgTm9pc2VNYXJnaW5DYmsoMCksCi0gIE5vaXNlVGFibGVDYmsoMCksCi0gIE5vbkRlZmF1bHRDYmsoMCksCi0gIE9ic3RydWN0aW9uQ2JrKDApLAotICBPdXRwdXRBbnRlbm5hQ2JrKDApLAotICBQaW5DYmsoMCksCi0gIFByb3BCZWdpbkNiaygwKSwKLSAgUHJvcENiaygwKSwKLSAgUHJvcEVuZENiaygwKSwKLSAgU2l0ZUNiaygwKSwKLSAgU3BhY2luZ0JlZ2luQ2JrKDApLAotICBTcGFjaW5nQ2JrKDApLAotICBTcGFjaW5nRW5kQ2JrKDApLAotICBUaW1pbmdDYmsoMCksCi0gIFVuaXRzQ2JrKDApLAotICBVc2VNaW5TcGFjaW5nQ2JrKDApLAotICBWZXJzaW9uQ2JrKDApLAotICBWZXJzaW9uU3RyQ2JrKDApLAotICBWaWFDYmsoMCksCi0gIFZpYVJ1bGVDYmsoMCkKLXsKLX0KLQotbGVmckNhbGxiYWNrcyAqbGVmQ2FsbGJhY2tzID0gTlVMTDsKLQotdm9pZAotbGVmckNhbGxiYWNrczo6cmVzZXQoKQotewotICAgIGlmIChsZWZDYWxsYmFja3MpIHsKLSAgICAgICAgZGVsZXRlIGxlZkNhbGxiYWNrczsKLSAgICB9Ci0KLSAgICBsZWZDYWxsYmFja3MgPSBuZXcgbGVmckNhbGxiYWNrcygpOwotfQotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmckRhdGEuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZyRGF0YS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNmU1MWMuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZyRGF0YS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNjEgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiAtIDIwMTYsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogYXJha2htYW4gJAotLy8gICRSZXZpc2lvbjogIzExICQKLS8vICAkRGF0ZTogMjAxMy8wNC8yMyAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJsZWZyRGF0YS5ocHAiCi0jaW5jbHVkZSAibGVmclNldHRpbmdzLmhwcCIKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotZXh0ZXJuIHZvaWQgKmxlZk1hbGxvYyhzaXplX3QgbGVmX3NpemUpOwotCi1sZWZyRGF0YSAgKmxlZkRhdGEgPSBOVUxMOwotCi1sZWZyRGF0YTo6bGVmckRhdGEoKQotOiBhbnRlbm5hSW5vdXRXYXJuaW5ncygwKSwKLSAgYW50ZW5uYUlucHV0V2FybmluZ3MoMCksCi0gIGFudGVubmFPdXRwdXRXYXJuaW5ncygwKSwKLSAgYW50ZW5uYVR5cGUobGVmaUFudGVubmFBUiksCi0gIGFycmF5Q3V0c1ZhbCgwKSwKLSAgYXJyYXlDdXRzV2FyKDApLAotICBhcnJheU5hbWUoTlVMTCksCi0gIGFycmF5V2FybmluZ3MoMCksCi0gIGNhc2VTZW5zaXRpdmVXYXJuaW5ncygwKSwKLSAgY29ycmVjdGlvblRhYmxlV2FybmluZ3MoMCksCi0gIGRpZWxlY3RyaWNXYXJuaW5ncygwKSwKLSAgZG9uZUxpYigxKSwKLSAgZWRnZVJhdGVTY2FsZUZhY3Rvcldhcm5pbmdzKDApLAotICBlZGdlUmF0ZVRocmVzaG9sZDFXYXJuaW5ncygwKSwKLSAgZWRnZVJhdGVUaHJlc2hvbGQyV2FybmluZ3MoMCksCi0gIGVuY3J5cHRlZCgwKSwKLSAgZmlyc3QoMSksCi0gIGZpcnN0X2J1ZmZlcigwKSwKLSAgZ2U1NmFsbW9zdERvbmUoMCksCi0gIGdlNTZkb25lKDApLAotICBoYXNCdXNCaXQoMCksCi0gIGhhc0RpcmVjdGlvbigwKSwKLSAgaGFzRGl2Q2hhcigwKSwKLSAgaGFzRml4ZWRNYXNrKDApLAotICBoYXNHZW9MYXllcigwKSwKLSAgaGFzSW5mbHVlbmNlKDApLAotICBoYXNMYXllck1pbmN1dCgwKSwKLSAgaGFzTWFudWZhY3R1cigwKSwKLSAgaGFzTWFzaygwKSwKLSAgaGFzTWluZmVhdHVyZSgwKSwKLSAgaGFzTmFtZUNhc2UoMCksCi0gIGhhc09wZW5lZExvZ0ZpbGUoMCksCi0gIGhhc1BSUCgwKSwKLSAgaGFzUGFyYWxsZWwoMCksCi0gIGhhc1BpdGNoKDApLAotICBoYXNTYW1lbmV0KDApLAotICBoYXNTaXRlKDApLAotICBoYXNTaXRlQ2xhc3MoMCksCi0gIGhhc1NpdGVTaXplKDApLAotICBoYXNTcENlbnRlcigwKSwKLSAgaGFzU3BMYXllcigwKSwKLSAgaGFzU3BQYXJhbGxlbCgwKSwKLSAgaGFzU3BTYW1lbmV0KDApLAotICBoYXNUd29XaWR0aHMoMCksCi0gIGhhc1R5cGUoMCksCi0gIGhhc1ZlcigwKSwKLSAgaGFzVmlhUnVsZV9sYXllcigwKSwKLSAgaGFzV2lkdGgoMCksCi0gIGhhc0ZhdGFsRXJyb3IoMCksCi0gIGlSRHJvcFdhcm5pbmdzKDApLAotICBpZ25vcmVWZXJzaW9uKDApLAotICBpbkRlZmluZSgwKSwKLSAgaW5vdXRBbnRlbm5hV2FybmluZ3MoMCksCi0gIGlucHV0QW50ZW5uYVdhcm5pbmdzKDApLAotICBpbnB1dF9sZXZlbCgtMSksCi0gIGlzR2VuZXJhdGUoMCksCi0gIGxhc3QoTlVMTCksCi0gIGxheWVyQ3V0KDApLAotICBsYXllckN1dFNwYWNpbmcoMCksCi0gIGxheWVyRGlyKDApLAotICBsYXllck1hc3RPdmVyKDApLAotICBsYXllck5hbWUoTlVMTCksCi0gIGxheWVyUm91dCgwKSwKLSAgbGF5ZXJXYXJuaW5ncygwKSwKLSAgbGVmRGVmSWYoRkFMU0UpLAotICBsZWZEdW1iTW9kZSgwKSwKLSAgbGVmRXJyTXNnUHJpbnRlZCgwKSwKLSAgbGVmRml4ZWRNYXNrKDApLAotICBsZWZJbmZvTXNnUHJpbnRlZCgwKSwKLSAgbGVmSW52YWxpZENoYXIoMCksCi0gIG5hbWVzQ2FzZVNlbnNpdGl2ZShUUlVFKSwKLSAgbGVmTmRSdWxlKDApLAotICBsZWZOZXdJc0tleXdvcmQoMCksCi0gIGxlZk5sVG9rZW4oRkFMU0UpLAotICBsZWZOb051bSgwKSwKLSAgbGVmUHJvcERlZlR5cGUoJ1wwJyksCi0gIGxlZlJldFZhbCgwKSwKLSAgbGVmV1JldFZhbCgwKSwKLSAgbGVmV2Fybk1zZ1ByaW50ZWQoMCksCi0gIGxlZl9lcnJvcnMoMCksCi0gIGxlZl9ubGluZXMoMSksCi0gIGxlZl9udG9rZW5zKDApLAotICBsZWZfc2F2ZV94KDAuMCksCi0gIGxlZl9zYXZlX3koMC4wKSwKLSAgbGVmX3dhcm5pbmdzKDApLAotICBsZWZjaChOVUxMKSwKLSAgbGVmbFZhbCgwLjApLAotICBsZWZyQW50ZW5uYVBXTFB0cigwKSwKLSAgbGVmckFycmF5KCksCi0gIGxlZnJDb3JyZWN0aW9uVGFibGUoKSwKLSAgbGVmckRlbnNpdHkoKSwKLSAgbGVmckRvR2NlbGwoMCksCi0gIGxlZnJEb0dlb21ldHJpZXMoMCksCi0gIGxlZnJEb1NpdGUoMCksCi0gIGxlZnJEb1RyYWNrKDApLAotICBsZWZyRmlsZSgwKSwKLSAgbGVmckZpbGVOYW1lKDApLAotICBsZWZyR2NlbGxQYXR0ZXJuUHRyKDApLAotICBsZWZyR2VvbWV0cmllc1B0cigwKSwKLSAgbGVmckhhc0xheWVyKDApLAotICBsZWZySGFzTWF4VlMoMCksCi0gIGxlZnJIYXNTcGFjaW5nKDApLAotICBsZWZySGFzU3BhY2luZ1RibCgwKSwKLSAgbGVmcklSRHJvcCgpLAotICBsZWZyTGF5ZXIoKSwKLSAgbGVmckxvZygwKSwKLSAgbGVmck1hY3JvKCksCi0gIGxlZnJNYXhTdGFja1ZpYSgpLAotICBsZWZyTWluRmVhdHVyZSgpLAotICBsZWZyTm9pc2VNYXJnaW4oKSwKLSAgbGVmck5vaXNlVGFibGUoKSwKLSAgbGVmck5vbkRlZmF1bHQoKSwKLSAgbGVmck9ic3RydWN0aW9uKCksCi0gIGxlZnJQaW4oKSwKLSAgbGVmclByb3AoKSwKLSAgbGVmclNpdGUoKSwKLSAgbGVmclNpdGVQYXR0ZXJuUHRyKDApLAotICBsZWZyU3BhY2luZygpLAotICBsZWZyVGltaW5nKCksCi0gIGxlZnJUcmFja1BhdHRlcm5QdHIoMCksCi0gIGxlZnJVbml0cygpLAotICBsZWZyVXNlTWluU3BhY2luZygpLAotICBsZWZyVmFsKDAuMCksCi0gIGxlZnJWaWEoKSwKLSAgbGVmclZpYVJ1bGUoKSwKLSAgbWFjcm9OYW1lKE5VTEwpLAotICBtYWNyb051bSgpLAotICBtYWNyb1dhcm5pbmdzKDApLAotICBtYXhTdGFja1ZpYVdhcm5pbmdzKDApLAotCi0gIG1pbkZlYXR1cmVXYXJuaW5ncygwKSwKLSAgbXNnQ250KDEpLAotICBuZCgwKSwKLSAgbmRMYXllcigwKSwKLSAgbmRMYXllclNwYWNlKDApLAotICBuZExheWVyV2lkdGgoMCksCi0gIG5kTmFtZSgwKSwKLSAgbmRSdWxlKDApLAotICBuZWVkR2VvbWV0cnkoMCksCi0gIG5leHQoTlVMTCksCi0gIG5vV2lyZUV4dGVuc2lvbldhcm5pbmdzKDApLAotICBub2lzZU1hcmdpbldhcm5pbmdzKDApLAotICBub2lzZVRhYmxlV2FybmluZ3MoMCksCi0gIG5vbkRlZmF1bHRSdWxlTmFtZShOVUxMKSwKLSAgbm9uRGVmYXVsdFdhcm5pbmdzKDApLAotICBudW1WaWEoMCksCi0gIG9ic0RlZigwKSwKLSAgb3JpZ0RlZigwKSwKLSAgb3V0TXNnKE5VTEwpLAotICBvdXRwdXRBbnRlbm5hV2FybmluZ3MoMCksCi0gIHBpbkRlZigwKSwKLSAgcGluTmFtZShOVUxMKSwKLSAgcGluV2FybmluZ3MoMCksCi0gIHBydE5ld0xpbmUoMCksCi0gIHBydFNlbWlDb2xvbigwKSwKLSAgcmluZ1BsYWNlKDApLAotICBzaGlmdEJ1ZigwKSwKLSAgc2hpZnRCdWZMZW5ndGgoMCksCi0gIHNpdGVEZWYoMCksCi0gIHNpdGVOYW1lKE5VTEwpLAotICBzaXRlV2FybmluZ3MoMCksCi0gIHNpemVEZWYoMCksCi0gIHNwUGFyYWxsZWxMZW5ndGgoMCksCi0gIHNwYWNlTWlzc2luZygwKSwKLSAgc3BhY2luZ1dhcm5pbmdzKDApLAotICBzeW1EZWYoMCksCi0gIHRpbWluZ1dhcm5pbmdzKDApLAotICB1bml0c1dhcm5pbmdzKDApLAotICB1c2U1XzMoMCksCi0gIHVzZTVfNCgwKSwKLSAgdXNlTGVuVGhyKDApLAotICB1c2VNaW5TcGFjaW5nV2FybmluZ3MoMCksCi0gIHZlcnNpb25OdW0oQ1VSUkVOVF9WRVJTSU9OKSwKLSAgdmlhTGF5ZXIoMCksCi0gIHZpYU5hbWUoTlVMTCksCi0gIHZpYVJ1bGVIYXNEaXIoMCksCi0gIHZpYVJ1bGVIYXNFbmMoMCksCi0gIHZpYVJ1bGVMYXllcigwKSwKLSAgdmlhUnVsZU5hbWUoTlVMTCksCi0gIHZpYVJ1bGVXYXJuaW5ncygwKSwKLSAgdmlhV2FybmluZ3MoMCksCi0gIGN1cnJlbnRfdG9rZW4oKGNoYXIqKSBtYWxsb2MoVE9LRU5fU0laRSkpLAotICBwdl90b2tlbigoY2hhciopIG1hbGxvYyhUT0tFTl9TSVpFKSksCi0gIHVjX3Rva2VuKChjaGFyKikgbWFsbG9jKFRPS0VOX1NJWkUpKSwgCi0gIHRva2VuU2l6ZShUT0tFTl9TSVpFKQotewotICAgIEhpc3RfdGV4dC5wdXNoX2JhY2soJ1wwJyk7Ci0KLSAgICAvLyBJbml0aWFsaXphdGlvbiBvZiBhcnJheXMuCi0gICAgbWVtc2V0KHJpbmcsIDAsIFJJTkdfU0laRSAqIHNpemVvZihjaGFyKikpOwotICAgIG1lbXNldChyaW5nU2l6ZXMsIDAsIFJJTkdfU0laRSAqIHNpemVvZihpbnQpKTsKLSAgICBtZW1zZXQobGVmRGVidWcsIDAsIDEwMCAqIHNpemVvZihjaGFyKSk7Ci0gICAgbWVtc2V0KGN1cnJlbnRfYnVmZmVyLCAwLCBJTl9CVUZfU0laRSAqIHNpemVvZihjaGFyKSk7Ci0gICAgbWVtc2V0KGN1cnJlbnRfc3RhY2ssIDAsIDIwICogc2l6ZW9mKGNoYXIqKSk7Ci0gICAgbWVtc2V0KGxlZnJFcnJNc2csIDAsIDEwMjQgKiBzaXplb2YoY2hhcikpOwotICAgIG1lbXNldChtc2dMaW1pdCwgMCwgMiAqIE1BWF9MRUZfTVNHUyAqIHNpemVvZihpbnQpKTsKLSAgICBtZW1zZXQodGVtcF9uYW1lLCAwLCAyNTggKiBzaXplb2YoY2hhcikpOwotCi0gICAgCi0gICAgY3VycmVudF90b2tlblswXSA9ICdcMCc7Ci0KLSAgICAvL2xlZl9sZXhfaW5pdCgpCi0gICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLQotICAgIC8vaW5pdFJpbmdCdWZmZXIoKTsKLSAgICBpbnQgaTsKLSAgICByaW5nUGxhY2UgPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCBSSU5HX1NJWkU7IGkrKykgewotICAgICAgICByaW5nW2ldID0gKGNoYXIqKSBsZWZNYWxsb2MoVE9LRU5fU0laRSk7Ci0gICAgICAgIHJpbmdTaXplc1tpXSA9IFRPS0VOX1NJWkU7Ci0gICAgfQotCi0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gMDsKLSAgICB9Ci0KLSAgICBsZWZfbmxpbmVzID0gMTsKLSAgICBsYXN0ID0gY3VycmVudF9idWZmZXIgLSAxOwotICAgIG5leHQgPSBjdXJyZW50X2J1ZmZlcjsKLSAgICBlbmNyeXB0ZWQgPSAwOwotICAgIGZpcnN0X2J1ZmZlciA9IDE7Ci0gICAgLy8gMTIvMDgvMTk5OSAtLSBXYW5kYSBkYSBSb3NhIAotICAgIC8vIG9wZW4gdGhlIGxlZnJMb2cgdG8gd3JpdGUgCi0gICAgLyogMy8yMy8yMDAwIC0tIFdhbmRhIGRhIFJvc2EuICBEdWUgdG8gbG90cyBvZiBjb21wbGFpbiwgZG9uJ3Qgb3BlbgotICAgICAgIHRoZSBmaWxlIHVudGlsIHRoZXJlIGlzIHJlYWxseSB3YXJuaW5nIG1lc3NhZ2VzIG9ubHkuCi0gICAgaWYgKChsZWZyTG9nID0gZm9wZW4oImxlZlJXYXJuaW5nLmxvZyIsICJ3IikpID09IDApIHsKLSAgICAgICBwcmludGYoCi0gICAgICAgIldBUk5JTkc6IFVuYWJsZSB0byBvcGVuIHRoZSBmaWxlIGxlZlJXYXJuaW5nLmxvZyBmb3Igd3JpdGluZyBmcm9tIHRoZSBkaXJlY3RvcnkgJXMuXG4iLAotICAgICAgICAgIGdldGN3ZChOVUxMLCA2NCkpOwotICAgICAgIHByaW50ZigiV2FybmluZyBtZXNzYWdlcyB3aWxsIG5vdCBiZSBwcmludGVkLlxuIik7Ci0gICAgfQotICAgICovCi0KLSAgICAvLyA0LzExLzIwMDMgLSBSZW1vdmUgZmlsZSBsZWZyUldhcm5pbmcubG9nIGZyb20gZGlyZWN0b3J5IGlmIGl0IGV4aXN0IAotICAgIC8vIHBjciA1Njk3MjkgCi0gICAgaWYgKHN0YXQoImxlZlJXYXJuaW5nLmxvZyIsICZzdGF0YnVmKSAhPSAtMSkgewotICAgICAgICAvLyBmaWxlIGV4aXN0LCByZW1vdmUgaXQgCi0gICAgICAgIGlmICghbGVmU2V0dGluZ3MtPkxvZ0ZpbGVBcHBlbmQpCi0gICAgICAgICAgICByZW1vdmUoImxlZlJXYXJuaW5nLmxvZyIpOwotICAgIH0KLQotICAgIC8vIGluaXRpYWxpemUgdGhlIHZhbHVlIAotICAgIGxlZmxWYWwgPSBzdHJ0b2QoIi0yMTQ3NDgzNjQ4IiwgJmxlZmNoKTsKLSAgICBsZWZyVmFsID0gc3RydG9kKCIyMTQ3NDgzNjQ3IiwgJmxlZmNoKTsgIAotfQotCi0KLWxlZnJEYXRhOjp+bGVmckRhdGEoKQotewotICAgIC8vbGVmX2xleF91bl9pbml0KCkKLSAgICAvKiBDbG9zZSB0aGUgZmlsZSAqLwotICAgIGlmIChsZWZyTG9nKSB7Ci0gICAgICAgIGZjbG9zZShsZWZyTG9nKTsKLSAgICAgICAgbGVmckxvZyA9IDA7Ci0gICAgfQotCi0gICAgLy9kZXN0cm95UmluZ0J1ZmZlcigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUklOR19TSVpFOyBpKyspIHsKLSAgICAgICAgZnJlZShyaW5nW2ldKTsKLSAgICB9Ci0KLSAgICBmcmVlKGN1cnJlbnRfdG9rZW4pOwotICAgIGZyZWUodWNfdG9rZW4pOwotICAgIGZyZWUocHZfdG9rZW4pOwotCi0gICAgaWYgKGxlZnJBbnRlbm5hUFdMUHRyKSB7Ci0gICAgICAgIGxlZnJBbnRlbm5hUFdMUHRyLT5EZXN0cm95KCk7Ci0gICAgICAgIGZyZWUobGVmckFudGVubmFQV0xQdHIpOwotICAgIH0KLX0KLQotdm9pZAotbGVmckRhdGE6OnJlc2V0KCkKLXsKLSAgICBpZiAobGVmRGF0YSkgewotICAgICAgICBkZWxldGUgbGVmRGF0YTsKLSAgICB9Ci0KLSAgICBsZWZEYXRhID0gbmV3IGxlZnJEYXRhKCk7Ci19Ci0KLXZvaWQgCi1sZWZyRGF0YTo6aW5pdFJlYWQoKQotewotCWhhc1ZlciA9IDE7IAotCWhhc0J1c0JpdCA9IDA7IAotCWhhc0RpcmVjdGlvbiA9IDA7IAotCWhhc0RpdkNoYXIgPSAwOyAKLQloYXNGaXhlZE1hc2sgPSAwOyAKLQloYXNHZW9MYXllciA9IDA7IAotCWhhc0luZmx1ZW5jZSA9IDA7IAotCWhhc0xheWVyTWluY3V0ID0gMDsgCi0JaGFzTWFudWZhY3R1ciA9IDA7IAotCWhhc01hc2sgPSAwOyAKLQloYXNNaW5mZWF0dXJlID0gMDsgCi0JaGFzTmFtZUNhc2UgPSAwOyAKLQloYXNPcGVuZWRMb2dGaWxlID0gMDsgCi0JaGFzUFJQID0gMDsgCi0JaGFzUGFyYWxsZWwgPSAwOyAKLQloYXNQaXRjaCA9IDA7IAotCWhhc1NhbWVuZXQgPSAwOyAKLQloYXNTaXRlID0gMDsgCi0JaGFzU2l0ZUNsYXNzID0gMDsgCi0JaGFzU2l0ZVNpemUgPSAwOyAKLQloYXNTcENlbnRlciA9IDA7IAotCWhhc1NwTGF5ZXIgPSAwOyAKLQloYXNTcFBhcmFsbGVsID0gMDsgCi0JaGFzU3BTYW1lbmV0ID0gMDsgCi0JaGFzVHdvV2lkdGhzID0gMDsgCi0JaGFzVHlwZSA9IDA7IAotCWhhc1ZpYVJ1bGVfbGF5ZXIgPSAwOyAKLQloYXNXaWR0aCA9IDA7IAotfQotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZyRGF0YS5ocHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZnJEYXRhLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM4OGQ3Ni4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZnJEYXRhLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyIC0gMjAxNCwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBhcmFraG1hbiAkCi0vLyAgJFJldmlzaW9uOiAjMTEgJAotLy8gICREYXRlOiAyMDEzLzA0LzIzICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2lmbmRlZiBsZWZyRGF0YV9oCi0jZGVmaW5lIGxlZnJEYXRhX2gKLQotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxtYXA+Ci0KLSNpbmNsdWRlICJsZWZpRGVmcy5ocHAiCi0jaW5jbHVkZSAibGVmaVVzZXIuaHBwIgotI2luY2x1ZGUgImxlZmlMYXllci5ocHAiCi0jaW5jbHVkZSAibGVmaUFycmF5LmhwcCIKLSNpbmNsdWRlICJsZWZpVXRpbC5ocHAiCi0jaW5jbHVkZSAibGVmaU1hY3JvLmhwcCIKLSNpbmNsdWRlICJsZWZpUHJvcFR5cGUuaHBwIgotI2luY2x1ZGUgImxlZmlDcm9zc1RhbGsuaHBwIgotI2luY2x1ZGUgImxlZmlQcm9wLmhwcCIKLSNpbmNsdWRlICJsZWZpTm9uRGVmYXVsdC5ocHAiCi0jaW5jbHVkZSAibGVmaVZpYS5ocHAiCi0jaW5jbHVkZSAibGVmaVZpYVJ1bGUuaHBwIgotI2luY2x1ZGUgImxlZmlVbml0cy5ocHAiCi0jaW5jbHVkZSAibGVmclJlYWRlci5ocHAiCi0KLSNkZWZpbmUgQ1VSUkVOVF9WRVJTSU9OIDUuOAotI2RlZmluZSBSSU5HX1NJWkUgMTAKLSNkZWZpbmUgSU5fQlVGX1NJWkUgMTYzODQKLSNkZWZpbmUgVE9LRU5fU0laRSA0MDk2Ci0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLXN0cnVjdCBsZWZDb21wYXJlU3RyaW5ncyAKLXsKLSAgICBib29sIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjpzdHJpbmcgJmxocywgY29uc3Qgc3RkOjpzdHJpbmcgJnJocykgY29uc3QgewotICAgICAgICByZXR1cm4gc3RkOjpzdHJjbXAobGhzLmNfc3RyKCksIHJocy5jX3N0cigpKSA8IDA7Ci0gICAgfQotfTsKLQotdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIGxlZkNvbXBhcmVTdHJpbmdzPiBsZWZBbGlhc01hcDsKLQotdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIGxlZkNvbXBhcmVTdHJpbmdzPiBsZWZTdHJpbmdNYXA7Ci0KLXR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludCwgbGVmQ29tcGFyZVN0cmluZ3M+IGxlZkludE1hcDsKLQotdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgZG91YmxlLCBsZWZDb21wYXJlU3RyaW5ncz4gbGVmRG91YmxlTWFwOwotCi0KLWNsYXNzIGxlZnJEYXRhIHsKLXB1YmxpYzoKLSAgICBsZWZyRGF0YSgpOwotICAgIH5sZWZyRGF0YSgpOwotCi0gICAgc3RhdGljIHZvaWQgcmVzZXQoKTsKLQl2b2lkCQlpbml0UmVhZCgpOwotICAgIHZvaWQJCWRvdWJsZUJ1ZmZlcigpOwotICAgIAotICAgIEZJTEUqICBsZWZyRmlsZTsgCi0gICAgRklMRSogIGxlZnJMb2c7IAotCi0gICAgY2hhciAgIGxlZlByb3BEZWZUeXBlOyAgCi0gICAgCi0gICAgY2hhciogIGFycmF5TmFtZTsgCi0gICAgY2hhciogIGxhc3Q7IAotICAgIGNoYXIqICBsYXllck5hbWU7IAotICAgIGNoYXIqICBsZWZjaDsgCi0gICAgY2hhciogIGxlZnJGaWxlTmFtZTsgCi0gICAgY2hhciogIG1hY3JvTmFtZTsgCi0gICAgY2hhciogIG5kTmFtZTsgCi0gICAgY2hhciogIG5leHQ7IAotICAgIGNoYXIqICBub25EZWZhdWx0UnVsZU5hbWU7IAotICAgIGNoYXIqICBvdXRNc2c7IAotICAgIGNoYXIqICBwaW5OYW1lOyAKLSAgICBjaGFyKiAgc2hpZnRCdWY7IAotICAgIGNoYXIqICBzaXRlTmFtZTsgCi0gICAgY2hhciogIHZpYU5hbWU7IAotICAgIGNoYXIqICB2aWFSdWxlTmFtZTsgCi0gICAgCi0gICAgZG91YmxlICBsYXllckN1dFNwYWNpbmc7IAotICAgIGRvdWJsZSAgbGVmX3NhdmVfeDsgCi0gICAgZG91YmxlICBsZWZfc2F2ZV95OyAvLyBmb3IgaW50ZXJwcmV0aW5nICgqKSBub3RhdGlvbiBvZiBMRUYvREVGCi0gICAgZG91YmxlICBsZWZsVmFsOyAKLSAgICBkb3VibGUgIGxlZnJWYWw7IAotICAgIGRvdWJsZSAgdmVyc2lvbk51bTsgCi0gICAgCi0gICAgaW50ICBhbnRlbm5hSW5vdXRXYXJuaW5nczsgCi0gICAgaW50ICBhbnRlbm5hSW5wdXRXYXJuaW5nczsgCi0gICAgaW50ICBhbnRlbm5hT3V0cHV0V2FybmluZ3M7IAotICAgIGludCAgYXJyYXlDdXRzVmFsOyAKLSAgICBpbnQgIGFycmF5Q3V0c1dhcjsgCi0gICAgaW50ICBhcnJheVdhcm5pbmdzOyAKLSAgICBpbnQgIGNhc2VTZW5zaXRpdmVXYXJuaW5nczsgCi0gICAgaW50ICBjb3JyZWN0aW9uVGFibGVXYXJuaW5nczsgCi0gICAgaW50ICBkaWVsZWN0cmljV2FybmluZ3M7IAotICAgIGludCAgZG9uZUxpYjsgLy8ga2VlcCB0cmFjayBpZiB0aGUgbGlicmFyeSBpcyBkb25lIHBhcnNpbmcKLSAgICBpbnQgIGVkZ2VSYXRlU2NhbGVGYWN0b3JXYXJuaW5nczsgCi0gICAgaW50ICBlZGdlUmF0ZVRocmVzaG9sZDFXYXJuaW5nczsgCi0gICAgaW50ICBlZGdlUmF0ZVRocmVzaG9sZDJXYXJuaW5nczsgCi0gICAgaW50ICBlbmNyeXB0ZWQ7IAotICAgIGludCAgZmlyc3Q7IAotICAgIGludCAgZmlyc3RfYnVmZmVyOyAKLSAgICBpbnQgIGdlNTZhbG1vc3REb25lOyAvLyBoYXZlIHJlYWNoZWQgdGhlIEVYVEVOU0lPTiBTRUNUSU9OCi0gICAgaW50ICBnZTU2ZG9uZTsgLy8gYSA1LjYgYW5kIGl0IGhhcyBFTkQgTElCUkFSWSBzdGF0ZW1lbnQKLSAgICBpbnQgIGhhc0J1c0JpdDsgCi0gICAgaW50ICBoYXNEaXJlY3Rpb247IAotICAgIGludCAgaGFzRGl2Q2hhcjsgCi0gICAgaW50ICBoYXNGaXhlZE1hc2s7IAotICAgIGludCAgaGFzR2VvTGF5ZXI7IAotICAgIGludCAgaGFzSW5mbHVlbmNlOyAKLSAgICBpbnQgIGhhc0xheWVyTWluY3V0OyAKLSAgICBpbnQgIGhhc01hbnVmYWN0dXI7IAotICAgIGludCAgaGFzTWFzazsgCi0gICAgaW50ICBoYXNNaW5mZWF0dXJlOyAKLSAgICBpbnQgIGhhc05hbWVDYXNlOyAKLSAgICBpbnQgIGhhc09wZW5lZExvZ0ZpbGU7IAotICAgIGludCAgaGFzUFJQOyAKLSAgICBpbnQgIGhhc1BhcmFsbGVsOyAKLSAgICBpbnQgIGhhc1BpdGNoOyAKLSAgICBpbnQgIGhhc1NhbWVuZXQ7IAotICAgIGludCAgaGFzU2l0ZTsgCi0gICAgaW50ICBoYXNTaXRlQ2xhc3M7IAotICAgIGludCAgaGFzU2l0ZVNpemU7IAotICAgIGludCAgaGFzU3BDZW50ZXI7IAotICAgIGludCAgaGFzU3BMYXllcjsgCi0gICAgaW50ICBoYXNTcFBhcmFsbGVsOyAKLSAgICBpbnQgIGhhc1NwU2FtZW5ldDsgCi0gICAgaW50ICBoYXNUd29XaWR0aHM7IAotICAgIGludCAgaGFzVHlwZTsgCi0gICAgaW50ICBoYXNWZXI7IAotICAgIGludCAgaGFzVmlhUnVsZV9sYXllcjsgCi0gICAgaW50ICBoYXNXaWR0aDsgCi0gICAgaW50ICBoYXNGYXRhbEVycm9yOyAvLyBkb24ndCByZXBvcnQgZXJyb3JzIGFmdGVyIHRoZSBmaWxlIGVuZC4KLSAgICBpbnQgIGlSRHJvcFdhcm5pbmdzOyAKLSAgICBpbnQgIGlnbm9yZVZlcnNpb247IC8vIGlnbm9yZSBjaGVja2luZyB2ZXJzaW9uIG51bWJlcgotICAgIGludCAgaW5EZWZpbmU7IAotICAgIGludCAgaW5vdXRBbnRlbm5hV2FybmluZ3M7IAotICAgIGludCAgaW5wdXRBbnRlbm5hV2FybmluZ3M7IAotICAgIGludCAgaW5wdXRfbGV2ZWw7IAotICAgIGludCAgaXNHZW5lcmF0ZTsgCi0gICAgaW50ICBsYXllckN1dDsgCi0gICAgaW50ICBsYXllckRpcjsgCi0gICAgaW50ICBsYXllck1hc3RPdmVyOyAKLSAgICBpbnQgIGxheWVyUm91dDsgCi0gICAgaW50ICBsYXllcldhcm5pbmdzOyAKLSAgICBpbnQgIGxlZkRlZklmOyAKLSAgICBpbnQgIGxlZkR1bWJNb2RlOyAKLSAgICBpbnQgIGxlZkVyck1zZ1ByaW50ZWQ7IAotICAgIGludCAgbGVmRml4ZWRNYXNrOyAvL0FsbCB0aGUgTEVGIE1BQ1JPIFBJTiBNQVNLIGFzc2lnbm1lbnRzIGNhbiBiZSAKLSAgICBpbnQgIGxlZkluZm9Nc2dQcmludGVkOyAKLSAgICBpbnQgIGxlZkludmFsaWRDaGFyOyAKLSAgICBpbnQgIGxlZk5kUnVsZTsgCi0gICAgaW50ICBsZWZOZXdJc0tleXdvcmQ7IAotICAgIGludCAgbGVmTmxUb2tlbjsgCi0gICAgaW50ICBsZWZOb051bTsgCi0gICAgaW50ICBsZWZSZXRWYWw7IAotICAgIGludCAgbGVmV1JldFZhbDsgCi0gICAgaW50ICBsZWZXYXJuTXNnUHJpbnRlZDsgCi0gICAgaW50ICBsZWZfZXJyb3JzOyAKLSAgICBpbnQgIGxlZl9ubGluZXM7IAotICAgIGludCAgbGVmX250b2tlbnM7IAotICAgIGludCAgbGVmX3dhcm5pbmdzOyAKLSAgICBpbnQgIGxlZnJEb0djZWxsOyAKLSAgICBpbnQgIGxlZnJEb0dlb21ldHJpZXM7IAotICAgIGludCAgbGVmckRvU2l0ZTsgCi0gICAgaW50ICBsZWZyRG9UcmFjazsKLSAgICBpbnQgIGxlZnJIYXNMYXllcjsgLy8gNS41IHRoaXMgJiBsZWZySGFzTWF4VlMgaXMgdG8ga2VlcCB0cmFjayB0aGF0Ci0gICAgaW50ICBsZWZySGFzTWF4VlM7IC8vIE1BWFZJQVNUQUNLIGhhcyB0byBiZSBhZnRlciBhbGwgbGF5ZXJzCi0gICAgaW50ICBsZWZySGFzU3BhY2luZzsgLy8ga2VlcCB0cmFjayBvZiBzcGFjaW5nIGluIGEgbGF5ZXIKLSAgICBpbnQgIGxlZnJIYXNTcGFjaW5nVGJsOyAvLyBrZWVwIHRyYWNrIG9mIHNwYWNpbmcgdGFibGUgaW4gYSBsYXllcgotCi0gICAgaW50ICBtYWNyb1dhcm5pbmdzOyAKLSAgICBpbnQgIG1heFN0YWNrVmlhV2FybmluZ3M7IAotICAgIGludCAgbWluRmVhdHVyZVdhcm5pbmdzOyAKLSAgICBpbnQgIG1zZ0NudDsgCi0gICAgaW50ICBuYW1lc0Nhc2VTZW5zaXRpdmU7IC8vIGFsd2F5cyB0cnVlIGluIDUuNgotICAgIGludCAgbmRMYXllcjsgCi0gICAgaW50ICBuZExheWVyU3BhY2U7IAotICAgIGludCAgbmRMYXllcldpZHRoOyAKLSAgICBpbnQgIG5kUnVsZTsgCi0gICAgaW50ICBuZWVkR2VvbWV0cnk7IAotICAgIGludCAgbm9XaXJlRXh0ZW5zaW9uV2FybmluZ3M7IAotICAgIGludCAgbm9pc2VNYXJnaW5XYXJuaW5nczsgCi0gICAgaW50ICBub2lzZVRhYmxlV2FybmluZ3M7IAotICAgIGludCAgbm9uRGVmYXVsdFdhcm5pbmdzOyAKLSAgICBpbnQgIG51bVZpYTsgCi0gICAgaW50ICBvYnNEZWY7IAotICAgIGludCAgb3JpZ0RlZjsgCi0gICAgaW50ICBvdXRwdXRBbnRlbm5hV2FybmluZ3M7IAotICAgIGludCAgcGluRGVmOyAKLSAgICBpbnQgIHBpbldhcm5pbmdzOyAKLSAgICBpbnQgIHBydE5ld0xpbmU7IC8vIHNvbWV0aW1lcyBuZWVkIHRvIHByaW50IGEgbmV3IGxpbmUKLSAgICBpbnQgIHBydFNlbWlDb2xvbjsgLy8gc29tZXRpbWVzIDsgaXMgbm90IHByaW50ZWQgeWV0Ci0gICAgaW50ICByaW5nUGxhY2U7IAotICAgIGludCAgc2hpZnRCdWZMZW5ndGg7IAotICAgIGludCAgc2l0ZURlZjsgCi0gICAgaW50ICBzaXRlV2FybmluZ3M7IAotICAgIGludCAgc2l6ZURlZjsgCi0gICAgaW50ICBzcFBhcmFsbGVsTGVuZ3RoOyAKLSAgICBpbnQgIHNwYWNlTWlzc2luZzsgCi0gICAgaW50ICBzcGFjaW5nV2FybmluZ3M7IAotICAgIGludCAgc3ltRGVmOyAKLSAgICBpbnQgIHRpbWluZ1dhcm5pbmdzOyAKLSAgICBpbnQgIHVuaXRzV2FybmluZ3M7IAotICAgIGludCAgdXNlNV8zOyAKLSAgICBpbnQgIHVzZTVfNDsgCi0gICAgaW50ICB1c2VMZW5UaHI7IAotICAgIGludCAgdXNlTWluU3BhY2luZ1dhcm5pbmdzOyAKLSAgICBpbnQgIHZpYUxheWVyOyAKLSAgICBpbnQgIHZpYVJ1bGVIYXNEaXI7IAotICAgIGludCAgdmlhUnVsZUhhc0VuYzsgCi0gICAgaW50ICB2aWFSdWxlTGF5ZXI7IAotICAgIGludCAgdmlhUnVsZVdhcm5pbmdzOyAKLSAgICBpbnQgIHZpYVdhcm5pbmdzOyAKLSAgICAKLSAgICBsZWZpQW50ZW5uYUVudW0gIGFudGVubmFUeXBlOyAKLSAgICBsZWZpQW50ZW5uYVBXTCogIGxlZnJBbnRlbm5hUFdMUHRyOyAKLSAgICBsZWZpQXJyYXkgIGxlZnJBcnJheTsgCi0gICAgbGVmaUNvcnJlY3Rpb25UYWJsZSAgbGVmckNvcnJlY3Rpb25UYWJsZTsgCi0gICAgbGVmaURlbnNpdHkgIGxlZnJEZW5zaXR5OyAKLSAgICBsZWZpR2NlbGxQYXR0ZXJuKiAgbGVmckdjZWxsUGF0dGVyblB0cjsgCi0gICAgbGVmaUdlb21ldHJpZXMqICBsZWZyR2VvbWV0cmllc1B0cjsgCi0gICAgbGVmaUlSRHJvcCAgbGVmcklSRHJvcDsgCi0gICAgbGVmaUxheWVyICBsZWZyTGF5ZXI7IAotICAgIGxlZmlNYWNybyAgbGVmck1hY3JvOyAKLSAgICBsZWZpTWF4U3RhY2tWaWEgIGxlZnJNYXhTdGFja1ZpYTsgLy8gNS41Ci0gICAgbGVmaU1pbkZlYXR1cmUgIGxlZnJNaW5GZWF0dXJlOyAKLSAgICBsZWZpTm9pc2VNYXJnaW4gIGxlZnJOb2lzZU1hcmdpbjsgCi0gICAgbGVmaU5vaXNlVGFibGUgIGxlZnJOb2lzZVRhYmxlOyAKLSAgICBsZWZpTm9uRGVmYXVsdCAgbGVmck5vbkRlZmF1bHQ7IAotICAgIGxlZmlOb25EZWZhdWx0KiAgbmQ7IC8vIFBDUiA5MDkwMTAgLSBGb3IgVklBIGluIHRoZSBub25kZWZhdWx0cnVsZQotICAgIGxlZmlOdW0gIG1hY3JvTnVtOyAKLSAgICBsZWZpT2JzdHJ1Y3Rpb24gIGxlZnJPYnN0cnVjdGlvbjsgCi0gICAgbGVmaVBpbiAgbGVmclBpbjsgCi0gICAgbGVmaVByb3AgIGxlZnJQcm9wOyAKLSAgICBsZWZpU2l0ZSAgbGVmclNpdGU7IAotICAgIGxlZmlTaXRlUGF0dGVybiogIGxlZnJTaXRlUGF0dGVyblB0cjsgCi0gICAgbGVmaVNwYWNpbmcgIGxlZnJTcGFjaW5nOyAKLSAgICBsZWZpVGltaW5nICBsZWZyVGltaW5nOyAKLSAgICBsZWZpVHJhY2tQYXR0ZXJuKiAgbGVmclRyYWNrUGF0dGVyblB0cjsgCi0gICAgbGVmaVVuaXRzICBsZWZyVW5pdHM7IAotICAgIGxlZmlVc2VNaW5TcGFjaW5nICBsZWZyVXNlTWluU3BhY2luZzsgCi0gICAgbGVmaVZpYSAgbGVmclZpYTsgCi0gICAgbGVmaVZpYVJ1bGUgIGxlZnJWaWFSdWxlOyAKLSAgICAKLSAgICBsZWZTdHJpbmdNYXAgICAgICAgIGFsaWFzX3NldDsgCi0gICAgbGVmRG91YmxlTWFwICAgICAgICBkZWZpbmVfc2V0OyAKLSAgICBsZWZJbnRNYXAgICAgICAgICAgIGRlZmluZWJfc2V0OyAKLSAgICBsZWZTdHJpbmdNYXAgICAgICAgIGRlZmluZXNfc2V0OyAKLSAgICBpbnQgICAgICAgICAgICAgICAgIHRva2VuU2l6ZTsKLQotICAgIC8vQVJSQVlTCi0gICAgLy8gUmluZyBidWZmZXIgc3RvcmFnZSAKLSAgICBjaGFyICAgICAgICpyaW5nW1JJTkdfU0laRV07Ci0gICAgaW50ICAgICAgICAgcmluZ1NpemVzW1JJTkdfU0laRV07Ci0gICAgY2hhciAgICAgICAgbGVmRGVidWdbMTAwXTsKLQotICAgIGNoYXIgICAgICAgKmN1cnJlbnRfdG9rZW47IAotICAgIGNoYXIgICAgICAgKnB2X3Rva2VuOyAKLSAgICBjaGFyICAgICAgICp1Y190b2tlbjsgCi0KLSAgICBjaGFyICAgICAgIGN1cnJlbnRfYnVmZmVyW0lOX0JVRl9TSVpFXTsKLSAgICBjb25zdCBjaGFyICpjdXJyZW50X3N0YWNrWzIwXTsgIC8vIHRoZSBzdGFjayBpdHNlbGYgCi0KLSAgICBjaGFyICAgICAgIGxlZnJFcnJNc2dbMTAyNF07Ci0gICAgY2hhciAgICAgICB0ZW1wX25hbWVbMjU4XTsKLQotICAgIHN0ZDo6dmVjdG9yPGNoYXI+ICBIaXN0X3RleHQ7IAotCi0gICAgLy8gdG8gaG9sZCB0aGUgbXNnIGxpbWl0LCAwIC0gbnVtIG9mIGxpbWl0IAotICAgIC8vIDEgLSBudW0gb2YgbWVzc2FnZSBwcmludGVkLCA0NzAxID0gNDcwMCArIDEsIG1lc3NhZ2Ugc3RhcnRzIG9uIDEgCi0gICAgLy8gMiAtIHdhcm5pbmcgcHJpbnRlZCAKLSAgICBpbnQgbXNnTGltaXRbMl1bTUFYX0xFRl9NU0dTXTsKLX07Ci0KLWV4dGVybiBsZWZyRGF0YSAqbGVmRGF0YTsKLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZnJSZWFkZXIuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZyUmVhZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NjOTQ5OS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZnJSZWFkZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTkxMCArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyIC0gMjAxNywgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jaW5jbHVkZSAibGVmclJlYWRlci5ocHAiCi0jaW5jbHVkZSAibGV4LmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJsZWZpRGVidWcuaHBwIgotI2luY2x1ZGUgImxlZnJEYXRhLmhwcCIKLSNpbmNsdWRlICJsZWZyU2V0dGluZ3MuaHBwIgotI2luY2x1ZGUgImxlZnJDYWxsQmFja3MuaHBwIgotCi0jZGVmaW5lIE5PQ0JLIDEwMAotI2RlZmluZSBOT0xFRk1TRyA0NzAxIC8vIDQ3MDEgPSA0NzAwICsgMSwgbWVzc2FnZSBzdGFydHMgb24gMQotCi0jIGRlZmluZSBMRUZfSU5JVCBsZWZfaW5pdChfX0ZVTkNUSU9OX18pCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLXN0YXRpYyBjb25zdCBjaGFyICppbml0X2NhbGxfZnVuYyA9IE5VTEw7Ci0KLWV4dGVybiBkb3VibGUgY29udmVydF9uYW1lMm51bShjb25zdCBjaGFyICp2ZXJzaW9uTmFtZSk7Ci1leHRlcm4gYm9vbCB2YWxpZGF0ZU1hc2tOdW1iZXIoaW50IG51bSk7Ci0KLXZvaWQKLWxlZl9pbml0KGNvbnN0IGNoYXIgICpmdW5jKQotewotICAgIGlmIChsZWZTZXR0aW5ncyA9PSBOVUxMKSB7Ci0JCWxlZnJTZXR0aW5nczo6cmVzZXQoKTsKLQkJaW5pdF9jYWxsX2Z1bmMgPSBmdW5jOwotCX0KLQotICAgIGlmIChsZWZDYWxsYmFja3MgPT0gTlVMTCkgewotCQlsZWZyQ2FsbGJhY2tzOjpyZXNldCgpOwotCQlpbml0X2NhbGxfZnVuYyA9IGZ1bmM7Ci0gICAgfQotfQotCi0KLXZvaWQKLWxlZmlOZXJyKGludCBpKQotewotICAgIHNwcmludGYobGVmRGF0YS0+bGVmckVyck1zZywgIkVSUk9SIG51bWJlciAlZFxuIiwgaSk7Ci0gICAgbGVmaUVycm9yKDEsIDAsIGxlZkRhdGEtPmxlZnJFcnJNc2cpOwotICAgIGV4aXQoMik7Ci19Ci0KLXZvaWQKLWxlZmlOd2FybihpbnQgaSkKLXsKLSAgICBzcHJpbnRmKGxlZkRhdGEtPmxlZnJFcnJNc2csICJXQVJOSU5HIG51bWJlciAlZFxuIiwgaSk7Ci0gICAgbGVmaUVycm9yKDEsIDAsIGxlZkRhdGEtPmxlZnJFcnJNc2cpOwotICAgIGV4aXQoMik7Ci19Ci0KLWRvdWJsZQotY29udmVydF9uYW1lMm51bShjb25zdCBjaGFyICp2ZXJzaW9uTmFtZSkKLXsKLSAgICBjaGFyICAgIG1ham9yTm1bODBdOwotICAgIGNoYXIgICAgbWlub3JObVs4MF07Ci0gICAgY2hhciAgICAqc3ViTWlub3JObSA9IE5VTEw7Ci0KLSAgICBjaGFyICAgICp2ZXJzaW9uTm0gPSBzdHJkdXAodmVyc2lvbk5hbWUpOwotCi0gICAgZG91YmxlICBtYWpvciA9IDAsIG1pbm9yID0gMCwgc3ViTWlub3IgPSAwOwotICAgIGRvdWJsZSAgdmVyc2lvbiwgdmVyc2lvbk51bWJlcjsKLSAgICBjaGFyICAgIGZpbmFsVmVyc2lvbls4MF07Ci0KLSAgICBzc2NhbmYodmVyc2lvbk5tLCAiJVteLl0uJXMiLCBtYWpvck5tLCBtaW5vck5tKTsKLSAgICBjaGFyICAgICpwMSA9IHN0cmNocihtaW5vck5tLCAnLicpOwotICAgIGlmIChwMSkgewotICAgICAgICBzdWJNaW5vck5tID0gcDEgKyAxOwotICAgICAgICAqcDEgPSAnXDAnOwotICAgIH0KLSAgICBtYWpvciA9IGF0b2YobWFqb3JObSk7Ci0gICAgbWlub3IgPSBhdG9mKG1pbm9yTm0pOwotICAgIGlmIChzdWJNaW5vck5tKQotICAgICAgICBzdWJNaW5vciA9IGF0b2Yoc3ViTWlub3JObSk7Ci0KLSAgICB2ZXJzaW9uID0gbWFqb3I7Ci0KLSAgICBpZiAobWlub3IgPiAwKQotICAgICAgICB2ZXJzaW9uID0gbWFqb3IgKyBtaW5vciAvIDEwOwotCi0gICAgaWYgKHN1Yk1pbm9yID4gMCkKLSAgICAgICAgdmVyc2lvbiA9IHZlcnNpb24gKyBzdWJNaW5vciAvIDEwMDA7Ci0KLSAgICBsZWZGcmVlKHZlcnNpb25ObSk7Ci0KLSAgICBzcHJpbnRmKGZpbmFsVmVyc2lvbiwgIiUuNGYiLCB2ZXJzaW9uKTsKLQotICAgIHZlcnNpb25OdW1iZXIgPSBhdG9mKGZpbmFsVmVyc2lvbik7Ci0KLSAgICByZXR1cm4gdmVyc2lvbk51bWJlcjsKLX0KLQotYm9vbAotdmFsaWRhdGVNYXNrTnVtYmVyKGludCBudW0pCi17Ci0gICAgaW50IGRpZ2l0ID0gMDsKLSAgICBpbnQgaW5kZXggPSAwOwotCi0gICAgaWYgKG51bSA8IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHdoaWxlIChudW0gPiAwKSB7Ci0gICAgICAgIGRpZ2l0ID0gbnVtICUgMTA7Ci0KLSAgICAgICAgaWYgKGRpZ2l0ID4gMykgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgbnVtID0gbnVtIC8gMTA7Ci0gICAgfQotCi0gICAgaWYgKGluZGV4ID4gMykgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqcwotLy8gR2xvYmFsIHZhcmlhYmxlcwotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotLy8gNS42IEVORCBMSUJSQVJZIGlzIG9wdGlvbmFsLgotLy8gRnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSBnbG9iYWwgdmFyaWFibGVzLgotLy8gVGhpcyBtYWtlIHN1cmUgdGhlIGdsb2JhbCB2YXJpYWJsZXMgYXJlIGluaXRpYWxpemVkCi0KLS8vIFVzZXIgY29udHJvbCB3YXJuaW5nIHRvIGJlIHByaW50ZWQgYnkgdGhlIHBhcnNlcgotdm9pZAotbGVmckRpc2FibGVQYXJzZXJNc2dzKGludCAgIG5Nc2csCi0gICAgICAgICAgICAgICAgICAgICAgaW50ICAgKm1zZ3MpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgaWYgKG5Nc2cgPD0gMCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuTXNnOyBpKyspIHsKLSAgICAgICAgbGVmU2V0dGluZ3MtPmRpc2FibGVNc2cobXNnc1tpXSk7Ci0gICAgfQotfQotCi12b2lkCi1sZWZyRW5hYmxlUGFyc2VyTXNncyhpbnQgICAgbk1zZywKLSAgICAgICAgICAgICAgICAgICAgIGludCAgICAqbXNncykKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Nc2c7IGkrKykgewotICAgICAgICBsZWZTZXR0aW5ncy0+ZW5hYmxlTXNnKG1zZ3NbaV0pOwotICAgIH0KLX0KLQotdm9pZAotbGVmckVuYWJsZUFsbE1zZ3MoKQotewotICAgIExFRl9JTklUOwotICAgIGxlZlNldHRpbmdzLT5lbmFibGVBbGxNc2dzKCk7Ci0gICAgbGVmU2V0dGluZ3MtPmRBbGxNc2dzID0gMDsKLX0KLQotdm9pZAotbGVmclNldFRvdGFsTXNnTGltaXQoaW50IHRvdE51bU1zZ3MpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmU2V0dGluZ3MtPlRvdGFsTXNnTGltaXQgPSB0b3ROdW1Nc2dzOwotfQotCi12b2lkCi1sZWZyU2V0TGltaXRQZXJNc2coaW50ICBtc2dJZCwKLSAgICAgICAgICAgICAgICAgICBpbnQgIG51bU1zZykKLXsKLSAgICBMRUZfSU5JVDsKLSAgICAKLSAgICBpZiAoKG1zZ0lkID4gMCkgJiYgKG1zZ0lkIDwgTk9MRUZNU0cpKSB7Ci0gICAgICAgIGxlZlNldHRpbmdzLT5Nc2dMaW1pdFttc2dJZF0gPSBudW1Nc2c7Ci0gICAgfQotfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gU2luY2UgdGhlIGxlZiBwYXJzZXIgb25seSBrZWVwIG9uZSBsaXN0IG9mIGRpc2FibGUgbWVzc2FnZSBpZHMsIGFuZCBkb2VzCi0vLyBub3QgaGF2ZSBhIGxpc3Qgb2YgZW5hYmxlIG1lc3NhZ2UgaWRzLCBpZiB0aGUgQVBJIGxlZnJEaXNhYmxlQWxsTXNncyBpcwotLy8gY2FsbGVkIHRvIGRpc2FibGUgYWxsIG1lc3NhZ2UgaWRzLCB1c2VyIGhhcyB0byBjYWxsIEFQSSBsZWZyRW5hYmxlQWxsTXNncwotLy8gdG8gZW5hYmxlIGFsbCBtZXNzYWdlIGlkcyBsZWZEYXRhLT5maXJzdCwgYmVmb3JlIGNhbGxpbmcgbGVmckRpc2FibGVQYXJzZXJNc2dzICYKLS8vIGxlZnJFbmFibGVQYXJzZXJNc2dzLgotLy8gVXNlcnMgY2Fubm90IGNhbGwgbGVmckRpc2FibGVBbGxNc2dzIGFuZCBjYWxsIGxlZnJFbmFibGVQYXJzZXJNc2dzIHRvCi0vLyBlbmFibGUgYSBzbWFsbCBsaXN0IG9mIG1lc3NhZ2UgaWRzIHNpbmNlIGxlZnJEaXNhYmxlQWxsTXNncyBkb2VzIG5vdCBoYXZlCi0vLyBhIGxpc3Qgb2YgYWxsIG1lc3NhZ2UgaWRzLCBoZW5jZSB0aGVyZSBpc24ndCBhIGxpc3QgZm9yIGxlZnJFbmFibGVQYXJzZXJNc2dzCi0vLyB0byB3b3JrIG9uIHRvIGVuYWJsZSB0aGUgbWVzc2FnZSBpZHMuCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotdm9pZAotbGVmckRpc2FibGVBbGxNc2dzKCkKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZTZXR0aW5ncy0+ZW5hYmxlQWxsTXNncygpOwotICAgIGxlZlNldHRpbmdzLT5kQWxsTXNncyA9IDE7Ci19Ci0KLS8vIFBhcnNlciBjb250cm9sIGJ5IHRoZSB1c2VyLgotLy8gUmVhZGVyIGluaXRpYWxpemF0aW9uCi1pbnQKLWxlZnJJbml0KCkKLXsKLQlyZXR1cm4gbGVmckluaXRTZXNzaW9uKDApOwotfQotCi1pbnQKLWxlZnJJbml0U2Vzc2lvbihpbnQgc3RhcnRTZXNzaW9uKQotewotCWlmIChzdGFydFNlc3Npb24pIHsgCi0JCWlmIChpbml0X2NhbGxfZnVuYyAhPSBOVUxMKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBBdHRlbXB0IHRvIGNhbGwgY29uZmlndXJhdGlvbiBmdW5jdGlvbiAnJXMnIGluIExFRiBwYXJzZXIgYmVmb3JlIGxlZnJJbml0KCkgY2FsbCBpbiBzZXNzaW9uLWJhc2VkIG1vZGUuXG4iLCBpbml0X2NhbGxfZnVuYyk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCi0JCWxlZnJDYWxsYmFja3M6OnJlc2V0KCk7Ci0JCWxlZnJTZXR0aW5nczo6cmVzZXQoKTsKLQl9IGVsc2UgewotCQlpZiAobGVmQ2FsbGJhY2tzID09IE5VTEwpIHsKLQkJCWxlZnJDYWxsYmFja3M6OnJlc2V0KCk7Ci0JCX0KLQkKLQkJaWYgKGxlZlNldHRpbmdzID09IE5VTEwpIHsKLQkJCWxlZnJTZXR0aW5nczo6cmVzZXQoKTsKLQkJfQotCX0KLQotICAgIHJldHVybiAwOwotfQotCi1pbnQKLWxlZnJSZXNldCgpCi17Ci0gICAgLy8gb2Jzb2xldGVkLgotICAgIHJldHVybiAwOwotfQotCi0KLWludCAKLWxlZnJDbGVhcigpCi17Ci0gICAgZGVsZXRlIGxlZkRhdGE7Ci0gICAgbGVmRGF0YSA9IE5VTEw7Ci0KLSAgICBkZWxldGUgbGVmQ2FsbGJhY2tzOwotICAgIGxlZkNhbGxiYWNrcyA9IE5VTEw7Ci0KLSAgICBkZWxldGUgbGVmU2V0dGluZ3M7Ci0gICAgbGVmU2V0dGluZ3MgPSBOVUxMOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotY29uc3QgY2hhciAqCi1sZWZyRk5hbWUoKQotewotICAgIHJldHVybiBsZWZEYXRhLT5sZWZyRmlsZU5hbWU7Ci19Ci0KLWludAotbGVmclJlbGVhc2VOUmVzZXRNZW1vcnkoKQotewotICAgIHJldHVybiAwOwotfQotCi1pbnQKLWxlZnJSZWFkKEZJTEUgICAgICAgICAgICpmLAotICAgICAgICAgY29uc3QgY2hhciAgICAgKmZOYW1lLAotICAgICAgICAgbGVmaVVzZXJEYXRhICAgdURhdGEpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgaW50IHN0YXR1czsKLQotICAgIGxlZnJEYXRhOjpyZXNldCgpOwotCi0gICAgbGVmRGF0YS0+dmVyc2lvbk51bSA9IChsZWZTZXR0aW5ncy0+VmVyc2lvbk51bSA9PSAwLjApID8KLSAgICAgICAgQ1VSUkVOVF9WRVJTSU9OIDoKLSAgICAgICAgbGVmRGF0YS0+dmVyc2lvbk51bSA9IGxlZlNldHRpbmdzLT5WZXJzaW9uTnVtOwotCi0gICAgaWYgKGxlZlNldHRpbmdzLT5DYXNlU2Vuc2l0aXZlU2V0KSB7Ci0gICAgICAgIGxlZkRhdGEtPm5hbWVzQ2FzZVNlbnNpdGl2ZSA9IGxlZlNldHRpbmdzLT5DYXNlU2Vuc2l0aXZlOwotICAgIH0gZWxzZSBpZiAobGVmRGF0YS0+dmVyc2lvbk51bSA+IDUuNSkgewotICAgICAgICBsZWZEYXRhLT5uYW1lc0Nhc2VTZW5zaXRpdmUgPSB0cnVlOwotICAgIH0KLQotICAgIGxlZkRhdGEtPmxlZnJGaWxlTmFtZSA9IChjaGFyKikgZk5hbWU7Ci0gICAgbGVmRGF0YS0+bGVmckZpbGUgPSBmOwotICAgIGxlZlNldHRpbmdzLT5Vc2VyRGF0YSA9IHVEYXRhOwotCi0gICAgc3RhdHVzID0gbGVmeXlwYXJzZSgpOwotCi0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotdm9pZAotbGVmclNldFVudXNlZENhbGxiYWNrcyhsZWZyVm9pZENia0ZuVHlwZSBmdW5jKQotewotICAgIC8vIFNldCBhbGwgb2YgdGhlIGNhbGxiYWNrcyB0aGF0IGhhdmUgbm90IGJlZW4gc2V0IHlldCB0bwotICAgIC8vIHRoZSBnaXZlbiBmdW5jdGlvbi4KLSAgICBMRUZfSU5JVDsKLQotICAgIGlmIChsZWZDYWxsYmFja3MtPkFycmF5QmVnaW5DYmsgPT0gMCkKLSAgICAgICAgbGVmQ2FsbGJhY2tzLT5BcnJheUJlZ2luQ2JrID0gKGxlZnJTdHJpbmdDYmtGblR5cGUpIGZ1bmM7Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+QXJyYXlDYmsgPT0gMCkKLSAgICAgICAgbGVmQ2FsbGJhY2tzLT5BcnJheUNiayA9IChsZWZyQXJyYXlDYmtGblR5cGUpIGZ1bmM7Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+QXJyYXlFbmRDYmsgPT0gMCkKLSAgICAgICAgbGVmQ2FsbGJhY2tzLT5BcnJheUVuZENiayA9IChsZWZyU3RyaW5nQ2JrRm5UeXBlKSBmdW5jOwotICAgIGlmIChsZWZDYWxsYmFja3MtPkRpdmlkZXJDaGFyQ2JrID09IDApCi0gICAgICAgIGxlZkNhbGxiYWNrcy0+RGl2aWRlckNoYXJDYmsgPSAobGVmclN0cmluZ0Nia0ZuVHlwZSkgZnVuYzsKLSAgICBpZiAobGVmQ2FsbGJhY2tzLT5CdXNCaXRDaGFyc0NiayA9PSAwKQotICAgICAgICBsZWZDYWxsYmFja3MtPkJ1c0JpdENoYXJzQ2JrID0gKGxlZnJTdHJpbmdDYmtGblR5cGUpIGZ1bmM7Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+Q2FzZVNlbnNpdGl2ZUNiayA9PSAwKQotICAgICAgICBsZWZDYWxsYmFja3MtPkNhc2VTZW5zaXRpdmVDYmsgPSAobGVmckludGVnZXJDYmtGblR5cGUpIGZ1bmM7Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+Tm9XaXJlRXh0ZW5zaW9uQ2JrID09IDApCi0gICAgICAgIGxlZkNhbGxiYWNrcy0+Tm9XaXJlRXh0ZW5zaW9uQ2JrID0gKGxlZnJTdHJpbmdDYmtGblR5cGUpIGZ1bmM7Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+Q29ycmVjdGlvblRhYmxlQ2JrID09IDApCi0gICAgICAgIGxlZkNhbGxiYWNrcy0+Q29ycmVjdGlvblRhYmxlQ2JrID0gKGxlZnJDb3JyZWN0aW9uVGFibGVDYmtGblR5cGUpIGZ1bmM7Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+RGllbGVjdHJpY0NiayA9PSAwKQotICAgICAgICBsZWZDYWxsYmFja3MtPkRpZWxlY3RyaWNDYmsgPSAobGVmckRvdWJsZUNia0ZuVHlwZSkgZnVuYzsKLSAgICBpZiAobGVmQ2FsbGJhY2tzLT5FZGdlUmF0ZVNjYWxlRmFjdG9yQ2JrID09IDApCi0gICAgICAgIGxlZkNhbGxiYWNrcy0+RWRnZVJhdGVTY2FsZUZhY3RvckNiayA9IChsZWZyRG91YmxlQ2JrRm5UeXBlKSBmdW5jOwotICAgIGlmIChsZWZDYWxsYmFja3MtPkVkZ2VSYXRlVGhyZXNob2xkMUNiayA9PSAwKQotICAgICAgICBsZWZDYWxsYmFja3MtPkVkZ2VSYXRlVGhyZXNob2xkMUNiayA9IChsZWZyRG91YmxlQ2JrRm5UeXBlKSBmdW5jOwotICAgIGlmIChsZWZDYWxsYmFja3MtPkVkZ2VSYXRlVGhyZXNob2xkMkNiayA9PSAwKQotICAgICAgICBsZWZDYWxsYmFja3MtPkVkZ2VSYXRlVGhyZXNob2xkMkNiayA9IChsZWZyRG91YmxlQ2JrRm5UeXBlKSBmdW5jOwotICAgIGlmIChsZWZDYWxsYmFja3MtPklSRHJvcEJlZ2luQ2JrID09IDApCi0gICAgICAgIGxlZkNhbGxiYWNrcy0+SVJEcm9wQmVnaW5DYmsgPSAobGVmclZvaWRDYmtGblR5cGUpIGZ1bmM7Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+SVJEcm9wQ2JrID09IDApCi0gICAgICAgIGxlZkNhbGxiYWNrcy0+SVJEcm9wQ2JrID0gKGxlZnJJUkRyb3BDYmtGblR5cGUpIGZ1bmM7Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+SVJEcm9wRW5kQ2JrID09IDApCi0gICAgICAgIGxlZkNhbGxiYWNrcy0+SVJEcm9wRW5kQ2JrID0gKGxlZnJWb2lkQ2JrRm5UeXBlKSBmdW5jOwotICAgIGlmIChsZWZDYWxsYmFja3MtPkxheWVyQ2JrID09IDApCi0gICAgICAgIGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmsgPSAobGVmckxheWVyQ2JrRm5UeXBlKSBmdW5jOwotICAgIGlmIChsZWZDYWxsYmFja3MtPkxpYnJhcnlFbmRDYmsgPT0gMCkKLSAgICAgICAgbGVmQ2FsbGJhY2tzLT5MaWJyYXJ5RW5kQ2JrID0gKGxlZnJWb2lkQ2JrRm5UeXBlKSBmdW5jOwotICAgIGlmIChsZWZDYWxsYmFja3MtPk1hY3JvQmVnaW5DYmsgPT0gMCkKLSAgICAgICAgbGVmQ2FsbGJhY2tzLT5NYWNyb0JlZ2luQ2JrID0gKGxlZnJTdHJpbmdDYmtGblR5cGUpIGZ1bmM7Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+TWFjcm9DYmsgPT0gMCkKLSAgICAgICAgbGVmQ2FsbGJhY2tzLT5NYWNyb0NiayA9IChsZWZyTWFjcm9DYmtGblR5cGUpIGZ1bmM7Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+TWFjcm9DbGFzc1R5cGVDYmsgPT0gMCkKLSAgICAgICAgbGVmQ2FsbGJhY2tzLT5NYWNyb0NsYXNzVHlwZUNiayA9IChsZWZyU3RyaW5nQ2JrRm5UeXBlKSBmdW5jOwotICAgIGlmIChsZWZDYWxsYmFja3MtPk1hY3JvT3JpZ2luQ2JrID09IDApCi0gICAgICAgIGxlZkNhbGxiYWNrcy0+TWFjcm9PcmlnaW5DYmsgPSAobGVmck1hY3JvTnVtQ2JrRm5UeXBlKSBmdW5jOwotICAgIGlmIChsZWZDYWxsYmFja3MtPk1hY3JvU2l0ZUNiayA9PSAwKQotICAgICAgICBsZWZDYWxsYmFja3MtPk1hY3JvU2l0ZUNiayA9IChsZWZyTWFjcm9TaXRlQ2JrRm5UeXBlKSBmdW5jOwotICAgIGlmIChsZWZDYWxsYmFja3MtPk1hY3JvRm9yZWlnbkNiayA9PSAwKQotICAgICAgICBsZWZDYWxsYmFja3MtPk1hY3JvRm9yZWlnbkNiayA9IChsZWZyTWFjcm9Gb3JlaWduQ2JrRm5UeXBlKSBmdW5jOwotICAgIGlmIChsZWZDYWxsYmFja3MtPk1hY3JvU2l6ZUNiayA9PSAwKQotICAgICAgICBsZWZDYWxsYmFja3MtPk1hY3JvU2l6ZUNiayA9IChsZWZyTWFjcm9OdW1DYmtGblR5cGUpIGZ1bmM7Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+TWFjcm9GaXhlZE1hc2tDYmsgPT0gMCkKLSAgICAgICAgbGVmQ2FsbGJhY2tzLT5NYWNyb0ZpeGVkTWFza0NiayA9IChsZWZySW50ZWdlckNia0ZuVHlwZSkgZnVuYzsKLSAgICBpZiAobGVmQ2FsbGJhY2tzLT5UaW1pbmdDYmsgPT0gMCkKLSAgICAgICAgbGVmQ2FsbGJhY2tzLT5UaW1pbmdDYmsgPSAobGVmclRpbWluZ0Nia0ZuVHlwZSkgZnVuYzsKLSAgICBpZiAobGVmQ2FsbGJhY2tzLT5NaW5GZWF0dXJlQ2JrID09IDApCi0gICAgICAgIGxlZkNhbGxiYWNrcy0+TWluRmVhdHVyZUNiayA9IChsZWZyTWluRmVhdHVyZUNia0ZuVHlwZSkgZnVuYzsKLSAgICBpZiAobGVmQ2FsbGJhY2tzLT5Ob2lzZU1hcmdpbkNiayA9PSAwKQotICAgICAgICBsZWZDYWxsYmFja3MtPk5vaXNlTWFyZ2luQ2JrID0gKGxlZnJOb2lzZU1hcmdpbkNia0ZuVHlwZSkgZnVuYzsKLSAgICBpZiAobGVmQ2FsbGJhY2tzLT5Ob2lzZVRhYmxlQ2JrID09IDApCi0gICAgICAgIGxlZkNhbGxiYWNrcy0+Tm9pc2VUYWJsZUNiayA9IChsZWZyTm9pc2VUYWJsZUNia0ZuVHlwZSkgZnVuYzsKLSAgICBpZiAobGVmQ2FsbGJhY2tzLT5Ob25EZWZhdWx0Q2JrID09IDApCi0gICAgICAgIGxlZkNhbGxiYWNrcy0+Tm9uRGVmYXVsdENiayA9IChsZWZyTm9uRGVmYXVsdENia0ZuVHlwZSkgZnVuYzsKLSAgICBpZiAobGVmQ2FsbGJhY2tzLT5PYnN0cnVjdGlvbkNiayA9PSAwKQotICAgICAgICBsZWZDYWxsYmFja3MtPk9ic3RydWN0aW9uQ2JrID0gKGxlZnJPYnN0cnVjdGlvbkNia0ZuVHlwZSkgZnVuYzsKLSAgICBpZiAobGVmQ2FsbGJhY2tzLT5QaW5DYmsgPT0gMCkKLSAgICAgICAgbGVmQ2FsbGJhY2tzLT5QaW5DYmsgPSAobGVmclBpbkNia0ZuVHlwZSkgZnVuYzsKLSAgICBpZiAobGVmQ2FsbGJhY2tzLT5Qcm9wQmVnaW5DYmsgPT0gMCkKLSAgICAgICAgbGVmQ2FsbGJhY2tzLT5Qcm9wQmVnaW5DYmsgPSAobGVmclZvaWRDYmtGblR5cGUpIGZ1bmM7Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+UHJvcENiayA9PSAwKQotICAgICAgICBsZWZDYWxsYmFja3MtPlByb3BDYmsgPSAobGVmclByb3BDYmtGblR5cGUpIGZ1bmM7Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+UHJvcEVuZENiayA9PSAwKQotICAgICAgICBsZWZDYWxsYmFja3MtPlByb3BFbmRDYmsgPSAobGVmclZvaWRDYmtGblR5cGUpIGZ1bmM7Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+U2l0ZUNiayA9PSAwKQotICAgICAgICBsZWZDYWxsYmFja3MtPlNpdGVDYmsgPSAobGVmclNpdGVDYmtGblR5cGUpIGZ1bmM7Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+U3BhY2luZ0JlZ2luQ2JrID09IDApCi0gICAgICAgIGxlZkNhbGxiYWNrcy0+U3BhY2luZ0JlZ2luQ2JrID0gKGxlZnJWb2lkQ2JrRm5UeXBlKSBmdW5jOwotICAgIGlmIChsZWZDYWxsYmFja3MtPlNwYWNpbmdDYmsgPT0gMCkKLSAgICAgICAgbGVmQ2FsbGJhY2tzLT5TcGFjaW5nQ2JrID0gKGxlZnJTcGFjaW5nQ2JrRm5UeXBlKSBmdW5jOwotICAgIGlmIChsZWZDYWxsYmFja3MtPlNwYWNpbmdFbmRDYmsgPT0gMCkKLSAgICAgICAgbGVmQ2FsbGJhY2tzLT5TcGFjaW5nRW5kQ2JrID0gKGxlZnJWb2lkQ2JrRm5UeXBlKSBmdW5jOwotICAgIGlmIChsZWZDYWxsYmFja3MtPlVuaXRzQ2JrID09IDApCi0gICAgICAgIGxlZkNhbGxiYWNrcy0+VW5pdHNDYmsgPSAobGVmclVuaXRzQ2JrRm5UeXBlKSBmdW5jOwotICAgIGlmICgobGVmQ2FsbGJhY2tzLT5WZXJzaW9uQ2JrID09IDApICYmIChsZWZDYWxsYmFja3MtPlZlcnNpb25TdHJDYmsgPT0gMCkpIHsKLSAgICAgICAgLy8gYm90aCB2ZXJzaW9uIGNhbGxiYWNrcyB3ZXJlbid0IHNldCwgaWYgZWl0aGVyIG9uZSBpcyBzZXQsIGl0IGlzIG9rCi0gICAgICAgIGxlZkNhbGxiYWNrcy0+VmVyc2lvbkNiayA9IChsZWZyRG91YmxlQ2JrRm5UeXBlKSBmdW5jOwotICAgICAgICBsZWZDYWxsYmFja3MtPlZlcnNpb25TdHJDYmsgPSAobGVmclN0cmluZ0Nia0ZuVHlwZSkgZnVuYzsKLSAgICB9Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+VmlhQ2JrID09IDApCi0gICAgICAgIGxlZkNhbGxiYWNrcy0+VmlhQ2JrID0gKGxlZnJWaWFDYmtGblR5cGUpIGZ1bmM7Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+VmlhUnVsZUNiayA9PSAwKQotICAgICAgICBsZWZDYWxsYmFja3MtPlZpYVJ1bGVDYmsgPSAobGVmclZpYVJ1bGVDYmtGblR5cGUpIGZ1bmM7Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+SW5wdXRBbnRlbm5hQ2JrID09IDApCi0gICAgICAgIGxlZkNhbGxiYWNrcy0+SW5wdXRBbnRlbm5hQ2JrID0gKGxlZnJEb3VibGVDYmtGblR5cGUpIGZ1bmM7Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+T3V0cHV0QW50ZW5uYUNiayA9PSAwKQotICAgICAgICBsZWZDYWxsYmFja3MtPk91dHB1dEFudGVubmFDYmsgPSAobGVmckRvdWJsZUNia0ZuVHlwZSkgZnVuYzsKLSAgICBpZiAobGVmQ2FsbGJhY2tzLT5Jbm91dEFudGVubmFDYmsgPT0gMCkKLSAgICAgICAgbGVmQ2FsbGJhY2tzLT5Jbm91dEFudGVubmFDYmsgPSAobGVmckRvdWJsZUNia0ZuVHlwZSkgZnVuYzsKLQotICAgIC8vIE5FVyBDQUxMQkFDSyAtIEFkZCBhIGxpbmUgaGVyZSBmb3IgZWFjaCBuZXcgY2FsbGJhY2sgcm91dGluZSAKLSAgICBpZiAobGVmQ2FsbGJhY2tzLT5BbnRlbm5hSW5wdXRDYmsgPT0gMCkKLSAgICAgICAgbGVmQ2FsbGJhY2tzLT5BbnRlbm5hSW5wdXRDYmsgPSAobGVmckRvdWJsZUNia0ZuVHlwZSkgZnVuYzsKLSAgICBpZiAobGVmQ2FsbGJhY2tzLT5BbnRlbm5hSW5vdXRDYmsgPT0gMCkKLSAgICAgICAgbGVmQ2FsbGJhY2tzLT5BbnRlbm5hSW5vdXRDYmsgPSAobGVmckRvdWJsZUNia0ZuVHlwZSkgZnVuYzsKLSAgICBpZiAobGVmQ2FsbGJhY2tzLT5BbnRlbm5hT3V0cHV0Q2JrID09IDApCi0gICAgICAgIGxlZkNhbGxiYWNrcy0+QW50ZW5uYU91dHB1dENiayA9IChsZWZyRG91YmxlQ2JrRm5UeXBlKSBmdW5jOwotICAgIGlmIChsZWZDYWxsYmFja3MtPk1hbnVmYWN0dXJpbmdDYmsgPT0gMCkKLSAgICAgICAgbGVmQ2FsbGJhY2tzLT5NYW51ZmFjdHVyaW5nQ2JrID0gKGxlZnJEb3VibGVDYmtGblR5cGUpIGZ1bmM7Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+VXNlTWluU3BhY2luZ0NiayA9PSAwKQotICAgICAgICBsZWZDYWxsYmFja3MtPlVzZU1pblNwYWNpbmdDYmsgPSAobGVmclVzZU1pblNwYWNpbmdDYmtGblR5cGUpIGZ1bmM7Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+Q2xlYXJhbmNlTWVhc3VyZUNiayA9PSAwKQotICAgICAgICBsZWZDYWxsYmFja3MtPkNsZWFyYW5jZU1lYXN1cmVDYmsgPSAobGVmclN0cmluZ0Nia0ZuVHlwZSkgZnVuYzsKLSAgICBpZiAobGVmQ2FsbGJhY2tzLT5NYWNyb0NsYXNzVHlwZUNiayA9PSAwKQotICAgICAgICBsZWZDYWxsYmFja3MtPk1hY3JvQ2xhc3NUeXBlQ2JrID0gKGxlZnJTdHJpbmdDYmtGblR5cGUpIGZ1bmM7Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+TWFjcm9PcmlnaW5DYmsgPT0gMCkKLSAgICAgICAgbGVmQ2FsbGJhY2tzLT5NYWNyb09yaWdpbkNiayA9IChsZWZyTWFjcm9OdW1DYmtGblR5cGUpIGZ1bmM7Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+TWFjcm9TaXRlQ2JrID09IDApCi0gICAgICAgIGxlZkNhbGxiYWNrcy0+TWFjcm9TaXRlQ2JrID0gKGxlZnJNYWNyb1NpdGVDYmtGblR5cGUpIGZ1bmM7Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+TWFjcm9Gb3JlaWduQ2JrID09IDApCi0gICAgICAgIGxlZkNhbGxiYWNrcy0+TWFjcm9Gb3JlaWduQ2JrID0gKGxlZnJNYWNyb0ZvcmVpZ25DYmtGblR5cGUpIGZ1bmM7Ci0gICAgaWYgKGxlZkNhbGxiYWNrcy0+TWFjcm9TaXplQ2JrID09IDApCi0gICAgICAgIGxlZkNhbGxiYWNrcy0+TWFjcm9TaXplQ2JrID0gKGxlZnJNYWNyb051bUNia0ZuVHlwZSkgZnVuYzsKLSAgICBpZiAobGVmQ2FsbGJhY2tzLT5NYWNyb0ZpeGVkTWFza0NiayA9PSAwKQotICAgICAgICBsZWZDYWxsYmFja3MtPk1hY3JvRml4ZWRNYXNrQ2JrID0gKGxlZnJJbnRlZ2VyQ2JrRm5UeXBlKSBmdW5jOwotICAgIGlmIChsZWZDYWxsYmFja3MtPk1hY3JvRW5kQ2JrID09IDApCi0gICAgICAgIGxlZkNhbGxiYWNrcy0+TWFjcm9FbmRDYmsgPSAobGVmclN0cmluZ0Nia0ZuVHlwZSkgZnVuYzsKLSAgICBpZiAobGVmQ2FsbGJhY2tzLT5NYXhTdGFja1ZpYUNiayA9PSAwKQotICAgICAgICBsZWZDYWxsYmFja3MtPk1heFN0YWNrVmlhQ2JrID0gKGxlZnJNYXhTdGFja1ZpYUNia0ZuVHlwZSkgZnVuYzsKLSAgICBpZiAobGVmQ2FsbGJhY2tzLT5FeHRlbnNpb25DYmsgPT0gMCkKLSAgICAgICAgbGVmQ2FsbGJhY2tzLT5FeHRlbnNpb25DYmsgPSAobGVmclN0cmluZ0Nia0ZuVHlwZSkgZnVuYzsKLSAgICBpZiAobGVmQ2FsbGJhY2tzLT5EZW5zaXR5Q2JrID09IDApCi0gICAgICAgIGxlZkNhbGxiYWNrcy0+RGVuc2l0eUNiayA9IChsZWZyRGVuc2l0eUNia0ZuVHlwZSkgZnVuYzsKLSAgICBpZiAobGVmQ2FsbGJhY2tzLT5GaXhlZE1hc2tDYmsgPT0gMCkKLSAgICAgICAgbGVmQ2FsbGJhY2tzLT5GaXhlZE1hc2tDYmsgPSAobGVmckludGVnZXJDYmtGblR5cGUpIGZ1bmM7Ci19Ci0KLS8vIFRoZXNlIGNvdW50IHVwIHRoZSBudW1iZXIgb2YgdGltZXMgYW4gdW5zZXQgY2FsbGJhY2sgaXMgY2FsbGVkLi4uIAotc3RhdGljIGludCBsZWZyVW51c2VkQ291bnRbTk9DQktdOwotCi1pbnQKLWxlZnJDb3VudEZ1bmMobGVmckNhbGxiYWNrVHlwZV9lICAgIGUsCi0gICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAqdiwKLSAgICAgICAgICAgICAgbGVmaVVzZXJEYXRhICAgICAgICAgIGQpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgaW50IGkgPSAoaW50KSBlOwotICAgIGlmIChsZWZpRGVidWcoMjMpKQotICAgICAgICBwcmludGYoImNvdW50ICVkIDB4JXAgMHglcFxuIiwgKGludCkgZSwgdiwgZCk7Ci0gICAgaWYgKGkgPj0gMCAmJiBpIDwgTk9DQkspIHsKLSAgICAgICAgbGVmclVudXNlZENvdW50W2ldICs9IDE7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotdm9pZAotbGVmclNldFJlZ2lzdGVyVW51c2VkQ2FsbGJhY2tzKCkKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBpbnQgaTsKLSAgICBsZWZTZXR0aW5ncy0+UmVnaXN0ZXJVbnVzZWQgPSAxOwotICAgIGxlZnJTZXRVbnVzZWRDYWxsYmFja3MobGVmckNvdW50RnVuYyk7Ci0gICAgZm9yIChpID0gMDsgaSA8IE5PQ0JLOyBpKyspCi0gICAgICAgIGxlZnJVbnVzZWRDb3VudFtpXSA9IDA7Ci19Ci0KLXZvaWQKLWxlZnJQcmludFVudXNlZENhbGxiYWNrcyhGSUxFICpmKQotewotICAgIExFRl9JTklUOwotICAgIGludCBpOwotICAgIGludCBmaXJzdENCID0gMTsKLSAgICBpbnQgdHJ1ZUNCID0gMTsKLQotICAgIGlmIChsZWZTZXR0aW5ncy0+UmVnaXN0ZXJVbnVzZWQgPT0gMCkgewotICAgICAgICBmcHJpbnRmKGYsCi0gICAgICAgICAgICAgICAgIkVSUk9SIChMRUZQQVJTLTEwMSk6IGxlZnJTZXRSZWdpc3RlclVudXNlZENhbGxiYWNrcyB3YXMgbm90IGNhbGxlZCB0byBzZXR1cCB0aGlzIGRhdGEuXG4iKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBOT0NCSzsgaSsrKSB7Ci0gICAgICAgIGlmIChsZWZyVW51c2VkQ291bnRbaV0pIHsKLSAgICAgICAgICAgIC8vIERvIG5vdCBuZWVkIHRvIHByaW50IHlldCBpZiBpIGlzOgotICAgICAgICAgICAgLy8gIGxlZnJNYWNyb0NsYXNzVHlwZUNia1R5cGUKLSAgICAgICAgICAgIC8vICBsZWZyTWFjcm9PcmlnaW5DYmtUeXBlCi0gICAgICAgICAgICAvLyAgbGVmck1hY3JvU2l6ZUNia1R5cGUKLSAgICAgICAgICAgIC8vICBsZWZyTWFjcm9FbmRDYmtUeXBlCi0gICAgICAgICAgICAvLyBpdCB3aWxsIGJlIHRha2VuIGNhcmUgbGF0ZXIKLSAgICAgICAgICAgIGlmIChmaXJzdENCICYmCi0gICAgICAgICAgICAgICAgKGxlZnJDYWxsYmFja1R5cGVfZSkgaSAhPSBsZWZyTWFjcm9DbGFzc1R5cGVDYmtUeXBlICYmCi0gICAgICAgICAgICAgICAgKGxlZnJDYWxsYmFja1R5cGVfZSkgaSAhPSBsZWZyTWFjcm9PcmlnaW5DYmtUeXBlICYmCi0gICAgICAgICAgICAgICAgKGxlZnJDYWxsYmFja1R5cGVfZSkgaSAhPSBsZWZyTWFjcm9TaXRlQ2JrVHlwZSAmJgotICAgICAgICAgICAgICAgIChsZWZyQ2FsbGJhY2tUeXBlX2UpIGkgIT0gbGVmck1hY3JvRm9yZWlnbkNia1R5cGUgJiYKLSAgICAgICAgICAgICAgICAobGVmckNhbGxiYWNrVHlwZV9lKSBpICE9IGxlZnJNYWNyb1NpemVDYmtUeXBlICYmCi0gICAgICAgICAgICAgICAgKGxlZnJDYWxsYmFja1R5cGVfZSkgaSAhPSBsZWZyTWFjcm9GaXhlZE1hc2tDYmtUeXBlICYmCi0gICAgICAgICAgICAgICAgKGxlZnJDYWxsYmFja1R5cGVfZSkgaSAhPSBsZWZyTWFjcm9FbmRDYmtUeXBlKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLAotICAgICAgICAgICAgICAgICAgICAgICAgIldBUk5JTkcgKExFRlBBUlMtMjAxKTogTEVGIGl0ZW1zIHRoYXQgd2VyZSBwcmVzZW50IGJ1dCBpZ25vcmVkIGJlY2F1c2Ugb2Ygbm8gY2FsbGJhY2s6XG4iKTsKLSAgICAgICAgICAgICAgICBmaXJzdENCID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoKGxlZnJDYWxsYmFja1R5cGVfZSkgaSkgewotICAgICAgICAgICAgY2FzZSBsZWZyQXJyYXlCZWdpbkNia1R5cGU6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiQXJyYXlCZWdpbiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBsZWZyQXJyYXlDYmtUeXBlOgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIkFycmF5Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGxlZnJBcnJheUVuZENia1R5cGU6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiQXJyYXlFbmQiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgbGVmckRpdmlkZXJDaGFyQ2JrVHlwZToKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJEaXZpZGVyQ2hhciIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBsZWZyQnVzQml0Q2hhcnNDYmtUeXBlOgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIkJ1c0JpdENoYXJzIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGxlZnJOb1dpcmVFeHRlbnNpb25DYmtUeXBlOgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIk5vV2lyZUV4dGVuc2lvbkF0UGlucyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBsZWZyQ2FzZVNlbnNpdGl2ZUNia1R5cGU6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiQ2FzZVNlbnNpdGl2ZSIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBsZWZyQ29ycmVjdGlvblRhYmxlQ2JrVHlwZToKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJDb3JyZWN0aW9uVGFibGUiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgbGVmckRpZWxlY3RyaWNDYmtUeXBlOgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIkRpZWxlY3RyaWMiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgbGVmckVkZ2VSYXRlU2NhbGVGYWN0b3JDYmtUeXBlOgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIkVkZ2VSYXRlU2NhbGVGYWN0b3IiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgbGVmckVkZ2VSYXRlVGhyZXNob2xkMUNia1R5cGU6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiRWRnZVJhdGVUaHJlc2hvbGQxIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGxlZnJFZGdlUmF0ZVRocmVzaG9sZDJDYmtUeXBlOgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIkVkZ2VSYXRlVGhyZXNob2xkMiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBsZWZySVJEcm9wQmVnaW5DYmtUeXBlOgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIklSRHJvcEJlZ2luIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGxlZnJJUkRyb3BDYmtUeXBlOgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIklSRHJvcCIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBsZWZySVJEcm9wRW5kQ2JrVHlwZToKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJJUkRyb3BFbmQiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgbGVmckxheWVyQ2JrVHlwZToKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJMYXllciIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBsZWZyTGlicmFyeUVuZENia1R5cGU6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiTGlicmFyeUVuZCIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBsZWZyTWFjcm9CZWdpbkNia1R5cGU6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiTWFjcm9CZWdpbiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBsZWZyTWFjcm9DYmtUeXBlOgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIk1hY3JvIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGxlZnJNaW5GZWF0dXJlQ2JrVHlwZToKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJNaW5GZWF0dXJlIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGxlZnJOb2lzZU1hcmdpbkNia1R5cGU6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiTm9pc2VNYXJnaW4iKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgbGVmck5vaXNlVGFibGVDYmtUeXBlOgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIk5vaXNlVGFibGUiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgbGVmck5vbkRlZmF1bHRDYmtUeXBlOgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIk5vbkRlZmF1bHQiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgbGVmck9ic3RydWN0aW9uQ2JrVHlwZToKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJPYnN0cnVjdGlvbiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBsZWZyUGluQ2JrVHlwZToKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJQaW4iKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgbGVmclByb3BCZWdpbkNia1R5cGU6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiUHJvcEJlZ2luIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGxlZnJQcm9wQ2JrVHlwZToKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJQcm9wIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGxlZnJQcm9wRW5kQ2JrVHlwZToKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJQcm9wRW5kIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGxlZnJTaXRlQ2JrVHlwZToKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJTaXRlIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGxlZnJTcGFjaW5nQmVnaW5DYmtUeXBlOgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIlNwYWNpbmdCZWdpbiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBsZWZyU3BhY2luZ0Nia1R5cGU6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiU3BhY2luZyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBsZWZyU3BhY2luZ0VuZENia1R5cGU6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiU3BhY2luZ0VuZCIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBsZWZyVW5pdHNDYmtUeXBlOgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIlVuaXRzIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGxlZnJWZXJzaW9uQ2JrVHlwZToKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJWZXJzaW9uIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGxlZnJWZXJzaW9uU3RyQ2JrVHlwZToKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJWZXJzaW9uIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGxlZnJWaWFDYmtUeXBlOgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIlZpYSIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBsZWZyVmlhUnVsZUNia1R5cGU6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiVmlhUnVsZSIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBsZWZySW5wdXRBbnRlbm5hQ2JrVHlwZToKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJJbnB1dEFudGVubmEiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgbGVmck91dHB1dEFudGVubmFDYmtUeXBlOgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIk91dHB1dEFudGVubmEiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgbGVmcklub3V0QW50ZW5uYUNia1R5cGU6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiSW5vdXRBbnRlbm5hIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGxlZnJBbnRlbm5hSW5wdXRDYmtUeXBlOgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIkFudGVubmFJbnB1dCIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBsZWZyQW50ZW5uYUlub3V0Q2JrVHlwZToKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJBbnRlbm5hSW5vdXQiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgbGVmckFudGVubmFPdXRwdXRDYmtUeXBlOgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIkFudGVubmFPdXRwdXQiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgbGVmck1hbnVmYWN0dXJpbmdDYmtUeXBlOgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIk1hbnVmYWN0dXJpbmciKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgbGVmclVzZU1pblNwYWNpbmdDYmtUeXBlOgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIlVzZU1pblNwYWNpbmciKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgbGVmckNsZWFyYW5jZU1lYXN1cmVDYmtUeXBlOgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIkNsZWFyYW5jZU1lYXN1cmUiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgbGVmclRpbWluZ0Nia1R5cGU6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiVGltaW5nIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGxlZnJNYXhTdGFja1ZpYUNia1R5cGU6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiTWF4U3RhY2tWaWEiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgbGVmckV4dGVuc2lvbkNia1R5cGU6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiRXh0ZW5zaW9uIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgLy8gMDcvMTMvMjAwMSAtIFdhbmRhIGRhIFJvc2EKLSAgICAgICAgICAgICAgICAvLyBEb24ndCBuZWVkIHRvIHByaW50IE1hY3JvQ2xhc3NUeXBlIGlmIGl0IGlzIG5vdCBzZXQsCi0gICAgICAgICAgICAgICAgLy8gc2luY2UgdGhpcyBpcyBhbiBleHRyYSBDQiBmb3IgQW1iaXQgb25seS4KLSAgICAgICAgICAgICAgICAvLyBPdGhlciB1c2VycyBzaG91bGQgbm90IGhhdmUgdG8gZGVhbCB3aXRoIGl0LgotICAgICAgICAgICAgICAgIC8vIGNhc2UgbGVmck1hY3JvQ2xhc3NUeXBlQ2JrVHlwZTogZnByaW50ZihmLCAiTWFjcm9DbGFzc1R5cGUiKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGxlZnJNYWNyb0NsYXNzVHlwZUNia1R5cGU6Ci0gICAgICAgICAgICBjYXNlIGxlZnJNYWNyb09yaWdpbkNia1R5cGU6Ci0gICAgICAgICAgICBjYXNlIGxlZnJNYWNyb1NpdGVDYmtUeXBlOgotICAgICAgICAgICAgY2FzZSBsZWZyTWFjcm9Gb3JlaWduQ2JrVHlwZToKLSAgICAgICAgICAgIGNhc2UgbGVmck1hY3JvU2l6ZUNia1R5cGU6Ci0gICAgICAgICAgICBjYXNlIGxlZnJNYWNyb0ZpeGVkTWFza0Nia1R5cGU6Ci0gICAgICAgICAgICBjYXNlIGxlZnJNYWNyb0VuZENia1R5cGU6Ci0gICAgICAgICAgICAgICAgdHJ1ZUNCID0gMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAvLyBORVcgQ0FMTEJBQ0sgIGFkZCB0aGUgcHJpbnQgaGVyZSAKLSAgICAgICAgICAgIGNhc2UgbGVmckRlbnNpdHlDYmtUeXBlOgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIkRlbnNpdHkiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgbGVmckZpeGVkTWFza0Nia1R5cGU6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiRml4ZWRNYXNrIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIkJPR1VTIEVOVFJZIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodHJ1ZUNCKQotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiAlZFxuIiwgbGVmclVudXNlZENvdW50W2ldKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB0cnVlQ0IgPSAxOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkCi1sZWZyVW5zZXRDYWxsYmFja3MoKQotewotICAgIGxlZnJDYWxsYmFja3M6OnJlc2V0KCk7Ci19Ci0KLS8vIFVuc2V0IGNhbGxiYWNrcyBmdW5jdGlvbnMKLXZvaWQKLWxlZnJVbnNldEFudGVubmFJbm91dENiaygpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5BbnRlbm5hSW5vdXRDYmsgPSAwOwotfQotCi12b2lkCi1sZWZyVW5zZXRBbnRlbm5hSW5wdXRDYmsoKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+QW50ZW5uYUlucHV0Q2JrID0gMDsKLX0KLQotdm9pZAotbGVmclVuc2V0QW50ZW5uYU91dHB1dENiaygpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5BbnRlbm5hT3V0cHV0Q2JrID0gMDsKLX0KLQotdm9pZAotbGVmclVuc2V0QXJyYXlCZWdpbkNiaygpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5BcnJheUJlZ2luQ2JrID0gMDsKLX0KLQotdm9pZAotbGVmclVuc2V0QXJyYXlDYmsoKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+QXJyYXlDYmsgPSAwOwotfQotCi12b2lkCi1sZWZyVW5zZXRBcnJheUVuZENiaygpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5BcnJheUVuZENiayA9IDA7Ci19Ci0KLXZvaWQKLWxlZnJVbnNldEJ1c0JpdENoYXJzQ2JrKCkKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPkJ1c0JpdENoYXJzQ2JrID0gMDsKLX0KLQotdm9pZAotbGVmclVuc2V0Q2FzZVNlbnNpdGl2ZUNiaygpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5DYXNlU2Vuc2l0aXZlQ2JrID0gMDsKLX0KLQotdm9pZAotbGVmclVuc2V0Q2xlYXJhbmNlTWVhc3VyZUNiaygpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5DbGVhcmFuY2VNZWFzdXJlQ2JrID0gMDsKLX0KLQotdm9pZAotbGVmclVuc2V0Q29ycmVjdGlvblRhYmxlQ2JrKCkKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPkNvcnJlY3Rpb25UYWJsZUNiayA9IDA7Ci19Ci0KLXZvaWQKLWxlZnJVbnNldERlbnNpdHlDYmsoKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+RGVuc2l0eUNiayA9IDA7Ci19Ci0KLXZvaWQKLWxlZnJVbnNldERpZWxlY3RyaWNDYmsoKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+RGllbGVjdHJpY0NiayA9IDA7Ci19Ci0KLXZvaWQKLWxlZnJVbnNldERpdmlkZXJDaGFyQ2JrKCkKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPkRpdmlkZXJDaGFyQ2JrID0gMDsKLX0KLQotdm9pZAotbGVmclVuc2V0RWRnZVJhdGVTY2FsZUZhY3RvckNiaygpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5FZGdlUmF0ZVNjYWxlRmFjdG9yQ2JrID0gMDsKLX0KLQotdm9pZAotbGVmclVuc2V0RWRnZVJhdGVUaHJlc2hvbGQxQ2JrKCkKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPkVkZ2VSYXRlVGhyZXNob2xkMUNiayA9IDA7Ci19Ci0KLXZvaWQKLWxlZnJVbnNldEVkZ2VSYXRlVGhyZXNob2xkMkNiaygpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5FZGdlUmF0ZVRocmVzaG9sZDJDYmsgPSAwOwotfQotCi12b2lkCi1sZWZyVW5zZXRFeHRlbnNpb25DYmsoKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+RXh0ZW5zaW9uQ2JrID0gMDsKLX0KLQotdm9pZAotbGVmclVuc2V0Rml4ZWRNYXNrQ2JrKCkKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPkZpeGVkTWFza0NiayA9IDA7Ci19Ci12b2lkCi1sZWZyVW5zZXRJUkRyb3BCZWdpbkNiaygpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5JUkRyb3BCZWdpbkNiayA9IDA7Ci19Ci0KLXZvaWQKLWxlZnJVbnNldElSRHJvcENiaygpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5JUkRyb3BDYmsgPSAwOwotfQotCi12b2lkCi1sZWZyVW5zZXRJUkRyb3BFbmRDYmsoKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+SVJEcm9wRW5kQ2JrID0gMDsKLX0KLQotdm9pZAotbGVmclVuc2V0SW5vdXRBbnRlbm5hQ2JrKCkKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPklub3V0QW50ZW5uYUNiayA9IDA7Ci19Ci0KLXZvaWQKLWxlZnJVbnNldElucHV0QW50ZW5uYUNiaygpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5JbnB1dEFudGVubmFDYmsgPSAwOwotfQotCi12b2lkCi1sZWZyVW5zZXRMYXllckNiaygpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5MYXllckNiayA9IDA7Ci19Ci0KLXZvaWQKLWxlZnJVbnNldExpYnJhcnlFbmRDYmsoKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+TGlicmFyeUVuZENiayA9IDA7Ci19Ci0KLXZvaWQKLWxlZnJVbnNldE1hY3JvQmVnaW5DYmsoKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+TWFjcm9CZWdpbkNiayA9IDA7Ci19Ci0KLXZvaWQKLWxlZnJVbnNldE1hY3JvQ2JrKCkKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPk1hY3JvQ2JrID0gMDsKLX0KLQotdm9pZAotbGVmclVuc2V0TWFjcm9DbGFzc1R5cGVDYmsoKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+TWFjcm9DbGFzc1R5cGVDYmsgPSAwOwotfQotCi12b2lkCi1sZWZyVW5zZXRNYWNyb0VuZENiaygpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5NYWNyb0VuZENiayA9IDA7Ci19Ci0KLXZvaWQKLWxlZnJVbnNldE1hY3JvRml4ZWRNYXNrQ2JrKCkKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPk1hY3JvRml4ZWRNYXNrQ2JrID0gMDsKLX0KLQotdm9pZAotbGVmclVuc2V0TWFjcm9PcmlnaW5DYmsoKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+TWFjcm9PcmlnaW5DYmsgPSAwOwotfQotCi12b2lkCi1sZWZyVW5zZXRNYWNyb1NpdGVDYmsoKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+TWFjcm9TaXRlQ2JrID0gMDsKLX0KLQotdm9pZAotbGVmclVuc2V0TWFjcm9Gb3JlaWduQ2JrKCkKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPk1hY3JvRm9yZWlnbkNiayA9IDA7Ci19Ci0KLXZvaWQKLWxlZnJVbnNldE1hY3JvU2l6ZUNiaygpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5NYWNyb1NpemVDYmsgPSAwOwotfQotCi12b2lkCi1sZWZyVW5zZXRNYW51ZmFjdHVyaW5nQ2JrKCkKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPk1hbnVmYWN0dXJpbmdDYmsgPSAwOwotfQotCi12b2lkCi1sZWZyVW5zZXRNYXhTdGFja1ZpYUNiaygpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5NYXhTdGFja1ZpYUNiayA9IDA7Ci19Ci0KLXZvaWQKLWxlZnJVbnNldE1pbkZlYXR1cmVDYmsoKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+TWluRmVhdHVyZUNiayA9IDA7Ci19Ci0KLXZvaWQKLWxlZnJVbnNldE5vV2lyZUV4dGVuc2lvbkNiaygpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5Ob1dpcmVFeHRlbnNpb25DYmsgPSAwOwotfQotCi12b2lkCi1sZWZyVW5zZXROb2lzZU1hcmdpbkNiaygpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5Ob2lzZU1hcmdpbkNiayA9IDA7Ci19Ci0KLXZvaWQKLWxlZnJVbnNldE5vaXNlVGFibGVDYmsoKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+Tm9pc2VUYWJsZUNiayA9IDA7Ci19Ci0KLXZvaWQKLWxlZnJVbnNldE5vbkRlZmF1bHRDYmsoKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+Tm9uRGVmYXVsdENiayA9IDA7Ci19Ci0KLXZvaWQKLWxlZnJVbnNldE9ic3RydWN0aW9uQ2JrKCkKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPk9ic3RydWN0aW9uQ2JrID0gMDsKLX0KLQotdm9pZAotbGVmclVuc2V0T3V0cHV0QW50ZW5uYUNiaygpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5PdXRwdXRBbnRlbm5hQ2JrID0gMDsKLX0KLQotdm9pZAotbGVmclVuc2V0UGluQ2JrKCkKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPlBpbkNiayA9IDA7Ci19Ci0KLXZvaWQKLWxlZnJVbnNldFByb3BCZWdpbkNiaygpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5Qcm9wQmVnaW5DYmsgPSAwOwotfQotCi12b2lkCi1sZWZyVW5zZXRQcm9wQ2JrKCkKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPlByb3BDYmsgPSAwOwotfQotCi12b2lkCi1sZWZyVW5zZXRQcm9wRW5kQ2JrKCkKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPlByb3BFbmRDYmsgPSAwOwotfQotCi12b2lkCi1sZWZyVW5zZXRTaXRlQ2JrKCkKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPlNpdGVDYmsgPSAwOwotfQotCi12b2lkCi1sZWZyVW5zZXRTcGFjaW5nQmVnaW5DYmsoKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+U3BhY2luZ0JlZ2luQ2JrID0gMDsKLX0KLQotdm9pZAotbGVmclVuc2V0U3BhY2luZ0NiaygpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5TcGFjaW5nQ2JrID0gMDsKLX0KLQotdm9pZAotbGVmclVuc2V0U3BhY2luZ0VuZENiaygpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5TcGFjaW5nRW5kQ2JrID0gMDsKLX0KLQotdm9pZAotbGVmclVuc2V0VGltaW5nQ2JrKCkKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPlRpbWluZ0NiayA9IDA7Ci19Ci0KLXZvaWQKLWxlZnJVbnNldFVuaXRzQ2JrKCkKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPlVuaXRzQ2JrID0gMDsKLX0KLQotdm9pZAotbGVmclVuc2V0VXNlTWluU3BhY2luZ0NiaygpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5Vc2VNaW5TcGFjaW5nQ2JrID0gMDsKLX0KLQotdm9pZAotbGVmclVuc2V0VmVyc2lvbkNiaygpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5WZXJzaW9uQ2JrID0gMDsKLX0KLQotdm9pZAotbGVmclVuc2V0VmVyc2lvblN0ckNiaygpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5WZXJzaW9uU3RyQ2JrID0gMDsKLX0KLQotdm9pZAotbGVmclVuc2V0VmlhQ2JrKCkKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPlZpYUNiayA9IDA7Ci19Ci0KLXZvaWQKLWxlZnJVbnNldFZpYVJ1bGVDYmsoKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+VmlhUnVsZUNiayA9IDA7Ci19Ci0KLS8vIFNldHRpbmcgb2YgdXNlciBkYXRhLgotdm9pZAotbGVmclNldFVzZXJEYXRhKGxlZmlVc2VyRGF0YSBkKQotewotICAgIExFRl9JTklUOwotICAgIGxlZlNldHRpbmdzLT5Vc2VyRGF0YSA9IGQ7Ci19Ci0KLWxlZmlVc2VyRGF0YQotbGVmckdldFVzZXJEYXRhKCkKLXsKLSAgICBMRUZfSU5JVDsKLSAgICByZXR1cm4gbGVmU2V0dGluZ3MtPlVzZXJEYXRhOwotfQotCi0vLyBDYWxsYmFja3Mgc2V0IGZ1bmN0aW9ucy4KLQotdm9pZAotbGVmclNldEFudGVubmFJbm91dENiayhsZWZyRG91YmxlQ2JrRm5UeXBlIGYpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5BbnRlbm5hSW5vdXRDYmsgPSBmOwotfQotCi12b2lkCi1sZWZyU2V0QW50ZW5uYUlucHV0Q2JrKGxlZnJEb3VibGVDYmtGblR5cGUgZikKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPkFudGVubmFJbnB1dENiayA9IGY7Ci19Ci0KLXZvaWQKLWxlZnJTZXRBbnRlbm5hT3V0cHV0Q2JrKGxlZnJEb3VibGVDYmtGblR5cGUgZikKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPkFudGVubmFPdXRwdXRDYmsgPSBmOwotfQotCi12b2lkCi1sZWZyU2V0QXJyYXlCZWdpbkNiayhsZWZyU3RyaW5nQ2JrRm5UeXBlIGYpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5BcnJheUJlZ2luQ2JrID0gZjsKLX0KLQotdm9pZAotbGVmclNldEFycmF5Q2JrKGxlZnJBcnJheUNia0ZuVHlwZSBmKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+QXJyYXlDYmsgPSBmOwotfQotCi12b2lkCi1sZWZyU2V0QXJyYXlFbmRDYmsobGVmclN0cmluZ0Nia0ZuVHlwZSBmKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+QXJyYXlFbmRDYmsgPSBmOwotfQotCi12b2lkCi1sZWZyU2V0QnVzQml0Q2hhcnNDYmsobGVmclN0cmluZ0Nia0ZuVHlwZSBmKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+QnVzQml0Q2hhcnNDYmsgPSBmOwotfQotCi12b2lkCi1sZWZyU2V0Q2FzZVNlbnNpdGl2ZUNiayhsZWZySW50ZWdlckNia0ZuVHlwZSBmKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+Q2FzZVNlbnNpdGl2ZUNiayA9IGY7Ci19Ci0KLXZvaWQKLWxlZnJTZXRDbGVhcmFuY2VNZWFzdXJlQ2JrKGxlZnJTdHJpbmdDYmtGblR5cGUgZikKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPkNsZWFyYW5jZU1lYXN1cmVDYmsgPSBmOwotfQotCi12b2lkCi1sZWZyU2V0Q29ycmVjdGlvblRhYmxlQ2JrKGxlZnJDb3JyZWN0aW9uVGFibGVDYmtGblR5cGUgZikKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPkNvcnJlY3Rpb25UYWJsZUNiayA9IGY7Ci19Ci0KLXZvaWQKLWxlZnJTZXREZW5zaXR5Q2JrKGxlZnJEZW5zaXR5Q2JrRm5UeXBlIGYpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5EZW5zaXR5Q2JrID0gZjsKLX0KLQotdm9pZAotbGVmclNldERpZWxlY3RyaWNDYmsobGVmckRvdWJsZUNia0ZuVHlwZSBmKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+RGllbGVjdHJpY0NiayA9IGY7Ci19Ci0KLXZvaWQKLWxlZnJTZXREaXZpZGVyQ2hhckNiayhsZWZyU3RyaW5nQ2JrRm5UeXBlIGYpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5EaXZpZGVyQ2hhckNiayA9IGY7Ci19Ci0KLXZvaWQKLWxlZnJTZXRFZGdlUmF0ZVNjYWxlRmFjdG9yQ2JrKGxlZnJEb3VibGVDYmtGblR5cGUgZikKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPkVkZ2VSYXRlU2NhbGVGYWN0b3JDYmsgPSBmOwotfQotCi12b2lkCi1sZWZyU2V0RWRnZVJhdGVUaHJlc2hvbGQxQ2JrKGxlZnJEb3VibGVDYmtGblR5cGUgZikKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPkVkZ2VSYXRlVGhyZXNob2xkMUNiayA9IGY7Ci19Ci0KLXZvaWQKLWxlZnJTZXRFZGdlUmF0ZVRocmVzaG9sZDJDYmsobGVmckRvdWJsZUNia0ZuVHlwZSBmKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+RWRnZVJhdGVUaHJlc2hvbGQyQ2JrID0gZjsKLX0KLQotdm9pZAotbGVmclNldEV4dGVuc2lvbkNiayhsZWZyU3RyaW5nQ2JrRm5UeXBlIGYpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5FeHRlbnNpb25DYmsgPSBmOwotfQotCi12b2lkCi1sZWZyU2V0Rml4ZWRNYXNrQ2JrKGxlZnJJbnRlZ2VyQ2JrRm5UeXBlIGYpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5GaXhlZE1hc2tDYmsgPSBmOwotfQotCi12b2lkCi1sZWZyU2V0SVJEcm9wQmVnaW5DYmsobGVmclZvaWRDYmtGblR5cGUgZikKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPklSRHJvcEJlZ2luQ2JrID0gZjsKLX0KLQotdm9pZAotbGVmclNldElSRHJvcENiayhsZWZySVJEcm9wQ2JrRm5UeXBlIGYpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5JUkRyb3BDYmsgPSBmOwotfQotCi12b2lkCi1sZWZyU2V0SVJEcm9wRW5kQ2JrKGxlZnJWb2lkQ2JrRm5UeXBlIGYpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5JUkRyb3BFbmRDYmsgPSBmOwotfQotCi12b2lkCi1sZWZyU2V0SW5vdXRBbnRlbm5hQ2JrKGxlZnJEb3VibGVDYmtGblR5cGUgZikKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPklub3V0QW50ZW5uYUNiayA9IGY7Ci19Ci0KLXZvaWQKLWxlZnJTZXRJbnB1dEFudGVubmFDYmsobGVmckRvdWJsZUNia0ZuVHlwZSBmKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+SW5wdXRBbnRlbm5hQ2JrID0gZjsKLX0KLQotdm9pZAotbGVmclNldExheWVyQ2JrKGxlZnJMYXllckNia0ZuVHlwZSBmKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+TGF5ZXJDYmsgPSBmOwotfQotCi12b2lkCi1sZWZyU2V0TGlicmFyeUVuZENiayhsZWZyVm9pZENia0ZuVHlwZSBmKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+TGlicmFyeUVuZENiayA9IGY7Ci19Ci0KLXZvaWQKLWxlZnJTZXRNYWNyb0JlZ2luQ2JrKGxlZnJTdHJpbmdDYmtGblR5cGUgZikKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPk1hY3JvQmVnaW5DYmsgPSBmOwotfQotCi12b2lkCi1sZWZyU2V0TWFjcm9DYmsobGVmck1hY3JvQ2JrRm5UeXBlIGYpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5NYWNyb0NiayA9IGY7Ci19Ci0KLXZvaWQKLWxlZnJTZXRNYWNyb0NsYXNzVHlwZUNiayhsZWZyU3RyaW5nQ2JrRm5UeXBlIGYpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5NYWNyb0NsYXNzVHlwZUNiayA9IGY7Ci19Ci0KLXZvaWQKLWxlZnJTZXRNYWNyb0VuZENiayhsZWZyU3RyaW5nQ2JrRm5UeXBlIGYpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5NYWNyb0VuZENiayA9IGY7Ci19Ci0KLXZvaWQKLWxlZnJTZXRNYWNyb0ZpeGVkTWFza0NiayhsZWZySW50ZWdlckNia0ZuVHlwZSBmKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+TWFjcm9GaXhlZE1hc2tDYmsgPSBmOwotfQotCi12b2lkCi1sZWZyU2V0TWFjcm9PcmlnaW5DYmsobGVmck1hY3JvTnVtQ2JrRm5UeXBlIGYpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5NYWNyb09yaWdpbkNiayA9IGY7Ci19Ci0KLXZvaWQKLWxlZnJTZXRNYWNyb1NpdGVDYmsobGVmck1hY3JvU2l0ZUNia0ZuVHlwZSBmKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+TWFjcm9TaXRlQ2JrID0gZjsKLX0KLQotdm9pZAotbGVmclNldE1hY3JvRm9yZWlnbkNiayhsZWZyTWFjcm9Gb3JlaWduQ2JrRm5UeXBlIGYpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5NYWNyb0ZvcmVpZ25DYmsgPSBmOwotfQotCi12b2lkCi1sZWZyU2V0TWFjcm9TaXplQ2JrKGxlZnJNYWNyb051bUNia0ZuVHlwZSBmKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+TWFjcm9TaXplQ2JrID0gZjsKLX0KLQotdm9pZAotbGVmclNldE1hbnVmYWN0dXJpbmdDYmsobGVmckRvdWJsZUNia0ZuVHlwZSBmKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+TWFudWZhY3R1cmluZ0NiayA9IGY7Ci19Ci0KLXZvaWQKLWxlZnJTZXRNYXhTdGFja1ZpYUNiayhsZWZyTWF4U3RhY2tWaWFDYmtGblR5cGUgZikKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPk1heFN0YWNrVmlhQ2JrID0gZjsKLX0KLQotdm9pZAotbGVmclNldE1pbkZlYXR1cmVDYmsobGVmck1pbkZlYXR1cmVDYmtGblR5cGUgZikKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPk1pbkZlYXR1cmVDYmsgPSBmOwotfQotCi12b2lkCi1sZWZyU2V0Tm9XaXJlRXh0ZW5zaW9uQ2JrKGxlZnJTdHJpbmdDYmtGblR5cGUgZikKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPk5vV2lyZUV4dGVuc2lvbkNiayA9IGY7Ci19Ci0KLXZvaWQKLWxlZnJTZXROb2lzZU1hcmdpbkNiayhsZWZyTm9pc2VNYXJnaW5DYmtGblR5cGUgZikKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPk5vaXNlTWFyZ2luQ2JrID0gZjsKLX0KLQotdm9pZAotbGVmclNldE5vaXNlVGFibGVDYmsobGVmck5vaXNlVGFibGVDYmtGblR5cGUgZikKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPk5vaXNlVGFibGVDYmsgPSBmOwotfQotCi12b2lkCi1sZWZyU2V0Tm9uRGVmYXVsdENiayhsZWZyTm9uRGVmYXVsdENia0ZuVHlwZSBmKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+Tm9uRGVmYXVsdENiayA9IGY7Ci19Ci0KLXZvaWQKLWxlZnJTZXRPYnN0cnVjdGlvbkNiayhsZWZyT2JzdHJ1Y3Rpb25DYmtGblR5cGUgZikKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPk9ic3RydWN0aW9uQ2JrID0gZjsKLX0KLQotdm9pZAotbGVmclNldE91dHB1dEFudGVubmFDYmsobGVmckRvdWJsZUNia0ZuVHlwZSBmKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+T3V0cHV0QW50ZW5uYUNiayA9IGY7Ci19Ci0KLXZvaWQKLWxlZnJTZXRQaW5DYmsobGVmclBpbkNia0ZuVHlwZSBmKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+UGluQ2JrID0gZjsKLX0KLQotdm9pZAotbGVmclNldFByb3BCZWdpbkNiayhsZWZyVm9pZENia0ZuVHlwZSBmKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+UHJvcEJlZ2luQ2JrID0gZjsKLX0KLQotdm9pZAotbGVmclNldFByb3BDYmsobGVmclByb3BDYmtGblR5cGUgZikKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPlByb3BDYmsgPSBmOwotfQotCi12b2lkCi1sZWZyU2V0UHJvcEVuZENiayhsZWZyVm9pZENia0ZuVHlwZSBmKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+UHJvcEVuZENiayA9IGY7Ci19Ci0KLXZvaWQKLWxlZnJTZXRTaXRlQ2JrKGxlZnJTaXRlQ2JrRm5UeXBlIGYpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5TaXRlQ2JrID0gZjsKLX0KLQotdm9pZAotbGVmclNldFNwYWNpbmdCZWdpbkNiayhsZWZyVm9pZENia0ZuVHlwZSBmKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+U3BhY2luZ0JlZ2luQ2JrID0gZjsKLX0KLQotdm9pZAotbGVmclNldFNwYWNpbmdDYmsobGVmclNwYWNpbmdDYmtGblR5cGUgZikKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPlNwYWNpbmdDYmsgPSBmOwotfQotCi12b2lkCi1sZWZyU2V0U3BhY2luZ0VuZENiayhsZWZyVm9pZENia0ZuVHlwZSBmKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+U3BhY2luZ0VuZENiayA9IGY7Ci19Ci0KLXZvaWQKLWxlZnJTZXRUaW1pbmdDYmsobGVmclRpbWluZ0Nia0ZuVHlwZSBmKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+VGltaW5nQ2JrID0gZjsKLX0KLQotdm9pZAotbGVmclNldFVuaXRzQ2JrKGxlZnJVbml0c0Nia0ZuVHlwZSBmKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+VW5pdHNDYmsgPSBmOwotfQotCi12b2lkCi1sZWZyU2V0VXNlTWluU3BhY2luZ0NiayhsZWZyVXNlTWluU3BhY2luZ0Nia0ZuVHlwZSBmKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+VXNlTWluU3BhY2luZ0NiayA9IGY7Ci19Ci0KLXZvaWQKLWxlZnJTZXRWZXJzaW9uQ2JrKGxlZnJEb3VibGVDYmtGblR5cGUgZikKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZDYWxsYmFja3MtPlZlcnNpb25DYmsgPSBmOwotfQotCi12b2lkCi1sZWZyU2V0VmVyc2lvblN0ckNiayhsZWZyU3RyaW5nQ2JrRm5UeXBlIGYpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5WZXJzaW9uU3RyQ2JrID0gZjsKLX0KLQotdm9pZAotbGVmclNldFZpYUNiayhsZWZyVmlhQ2JrRm5UeXBlIGYpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmQ2FsbGJhY2tzLT5WaWFDYmsgPSBmOwotfQotCi12b2lkCi1sZWZyU2V0VmlhUnVsZUNiayhsZWZyVmlhUnVsZUNia0ZuVHlwZSBmKQotewotICAgIExFRl9JTklUOwotICAgIGxlZkNhbGxiYWNrcy0+VmlhUnVsZUNiayA9IGY7Ci19Ci0KLWludAotbGVmckxpbmVOdW1iZXIoKQotewotICAgIC8vIENvbXBhdGliaWxpdHkgZmVhdHVyZTogaW4gb2xkIHZlcnNpb25zIHRoZSB0cmFuc2xhdG9ycywgIAotICAgIC8vIHRoZSBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGJlZm9yZSBsZWZEYXRhIGluaXRpYWxpemF0aW9uLiAKLSAgICByZXR1cm4gbGVmRGF0YSA/IGxlZkRhdGEtPmxlZl9ubGluZXMgOiAwOyAKLX0KLQotdm9pZAotbGVmclNldExvZ0Z1bmN0aW9uKExFRklfTE9HX0ZVTkNUSU9OIGYpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmU2V0dGluZ3MtPkVycm9yTG9nRnVuY3Rpb24gPSBmOwotfQotCi12b2lkCi1sZWZyU2V0V2FybmluZ0xvZ0Z1bmN0aW9uKExFRklfV0FSTklOR19MT0dfRlVOQ1RJT04gZikKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZTZXR0aW5ncy0+V2FybmluZ0xvZ0Z1bmN0aW9uID0gZjsKLX0KLQotdm9pZAotbGVmclNldE1hbGxvY0Z1bmN0aW9uKExFRklfTUFMTE9DX0ZVTkNUSU9OIGYpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmU2V0dGluZ3MtPk1hbGxvY0Z1bmN0aW9uID0gZjsKLX0KLQotdm9pZAotbGVmclNldFJlYWxsb2NGdW5jdGlvbihMRUZJX1JFQUxMT0NfRlVOQ1RJT04gZikKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZTZXR0aW5ncy0+UmVhbGxvY0Z1bmN0aW9uID0gZjsKLX0KLQotdm9pZAotbGVmclNldEZyZWVGdW5jdGlvbihMRUZJX0ZSRUVfRlVOQ1RJT04gZikKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZTZXR0aW5ncy0+RnJlZUZ1bmN0aW9uID0gZjsKLX0KLQotdm9pZAotbGVmclNldExpbmVOdW1iZXJGdW5jdGlvbihMRUZJX0xJTkVfTlVNQkVSX0ZVTkNUSU9OIGYpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmU2V0dGluZ3MtPkxpbmVOdW1iZXJGdW5jdGlvbiA9IGY7Ci19Ci0KLXZvaWQKLWxlZnJTZXREZWx0YU51bWJlckxpbmVzKGludCBudW1MaW5lcykKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZTZXR0aW5ncy0+RGVsdGFOdW1iZXJMaW5lcyA9IG51bUxpbmVzOwotfQotCi0vLyBmcm9tIHRoZSBsZXhlcgotCi12b2lkCi1sZWZyU2V0U2hpZnRDYXNlKCkKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZTZXR0aW5ncy0+U2hpZnRDYXNlID0gMTsKLX0KLQotdm9pZAotbGVmclNldENvbW1lbnRDaGFyKGNoYXIgYykKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZTZXR0aW5ncy0+Q29tbWVudENoYXIgPSBjOwotfQotCi12b2lkCi1sZWZyU2V0Q2FzZVNlbnNpdGl2aXR5KGludCBjYXNlU2Vuc2UpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmU2V0dGluZ3MtPkNhc2VTZW5zaXRpdmUgPSBjYXNlU2Vuc2U7Ci0gICAgbGVmU2V0dGluZ3MtPkNhc2VTZW5zaXRpdmVTZXQgPSBUUlVFOwotICAgIGlmIChsZWZEYXRhKSB7Ci0gICAgICAgIGxlZkRhdGEtPm5hbWVzQ2FzZVNlbnNpdGl2ZSA9IGNhc2VTZW5zZTsKLSAgICB9Ci19Ci0KLXZvaWQKLWxlZnJTZXRSZWxheE1vZGUoKQotewotICAgIExFRl9JTklUOwotICAgIGxlZlNldHRpbmdzLT5SZWxheE1vZGUgPSBUUlVFOwotfQotCi12b2lkCi1sZWZyVW5zZXRSZWxheE1vZGUoKQotewotICAgIExFRl9JTklUOwotICAgIGxlZlNldHRpbmdzLT5SZWxheE1vZGUgPSBGQUxTRTsKLX0KLQotdm9pZAotbGVmclNldFZlcnNpb25WYWx1ZShjb25zdCBjaGFyICp2ZXJzaW9uKQotewotICAgIExFRl9JTklUOwotICAgIGxlZlNldHRpbmdzLT5WZXJzaW9uTnVtID0gY29udmVydF9uYW1lMm51bSh2ZXJzaW9uKTsKLX0KLQotdm9pZAotbGVmclNldE9wZW5Mb2dGaWxlQXBwZW5kKCkKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZTZXR0aW5ncy0+TG9nRmlsZUFwcGVuZCA9IFRSVUU7Ci19Ci0KLXZvaWQKLWxlZnJVbnNldE9wZW5Mb2dGaWxlQXBwZW5kKCkKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZTZXR0aW5ncy0+TG9nRmlsZUFwcGVuZCA9IEZBTFNFOwotfQotCi12b2lkCi1sZWZyU2V0UmVhZEZ1bmN0aW9uKExFRklfUkVBRF9GVU5DVElPTiBmKQotewotICAgIExFRl9JTklUOwotICAgIGxlZlNldHRpbmdzLT5SZWFkRnVuY3Rpb24gPSBmOwotfQotCi12b2lkCi1sZWZyVW5zZXRSZWFkRnVuY3Rpb24oKQotewotICAgIExFRl9JTklUOwotICAgIGxlZlNldHRpbmdzLT5SZWFkRnVuY3Rpb24gPSAwOwotfQotCi0vLyBTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHdhcm5pbmdzCi0vLwotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotdm9pZAotbGVmclNldEFudGVubmFJbm91dFdhcm5pbmdzKGludCB3YXJuKQotewotICAgIExFRl9JTklUOwotICAgIGxlZlNldHRpbmdzLT5BbnRlbm5hSW5vdXRXYXJuaW5ncyA9IHdhcm47Ci19Ci0KLXZvaWQKLWxlZnJTZXRBbnRlbm5hSW5wdXRXYXJuaW5ncyhpbnQgd2FybikKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZTZXR0aW5ncy0+QW50ZW5uYUlucHV0V2FybmluZ3MgPSB3YXJuOwotfQotCi12b2lkCi1sZWZyU2V0QW50ZW5uYU91dHB1dFdhcm5pbmdzKGludCB3YXJuKQotewotICAgIExFRl9JTklUOwotICAgIGxlZlNldHRpbmdzLT5BbnRlbm5hT3V0cHV0V2FybmluZ3MgPSB3YXJuOwotfQotCi12b2lkCi1sZWZyU2V0QXJyYXlXYXJuaW5ncyhpbnQgd2FybikKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZTZXR0aW5ncy0+QXJyYXlXYXJuaW5ncyA9IHdhcm47Ci19Ci0KLXZvaWQKLWxlZnJTZXRDYXNlU2Vuc2l0aXZlV2FybmluZ3MoaW50IHdhcm4pCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmU2V0dGluZ3MtPkNhc2VTZW5zaXRpdmVXYXJuaW5ncyA9IHdhcm47Ci19Ci0KLXZvaWQKLWxlZnJTZXRDb3JyZWN0aW9uVGFibGVXYXJuaW5ncyhpbnQgd2FybikKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZTZXR0aW5ncy0+Q29ycmVjdGlvblRhYmxlV2FybmluZ3MgPSB3YXJuOwotfQotCi12b2lkCi1sZWZyU2V0RGllbGVjdHJpY1dhcm5pbmdzKGludCB3YXJuKQotewotICAgIExFRl9JTklUOwotICAgIGxlZlNldHRpbmdzLT5EaWVsZWN0cmljV2FybmluZ3MgPSB3YXJuOwotfQotCi12b2lkCi1sZWZyU2V0RWRnZVJhdGVUaHJlc2hvbGQxV2FybmluZ3MoaW50IHdhcm4pCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmU2V0dGluZ3MtPkVkZ2VSYXRlVGhyZXNob2xkMVdhcm5pbmdzID0gd2FybjsKLX0KLQotdm9pZAotbGVmclNldEVkZ2VSYXRlVGhyZXNob2xkMldhcm5pbmdzKGludCB3YXJuKQotewotICAgIExFRl9JTklUOwotICAgIGxlZlNldHRpbmdzLT5FZGdlUmF0ZVRocmVzaG9sZDJXYXJuaW5ncyA9IHdhcm47Ci19Ci0KLXZvaWQKLWxlZnJTZXRFZGdlUmF0ZVNjYWxlRmFjdG9yV2FybmluZ3MoaW50IHdhcm4pCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmU2V0dGluZ3MtPkVkZ2VSYXRlU2NhbGVGYWN0b3JXYXJuaW5ncyA9IHdhcm47Ci19Ci0KLXZvaWQKLWxlZnJTZXRJbm91dEFudGVubmFXYXJuaW5ncyhpbnQgd2FybikKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZTZXR0aW5ncy0+SW5vdXRBbnRlbm5hV2FybmluZ3MgPSB3YXJuOwotfQotCi12b2lkCi1sZWZyU2V0SW5wdXRBbnRlbm5hV2FybmluZ3MoaW50IHdhcm4pCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmU2V0dGluZ3MtPklucHV0QW50ZW5uYVdhcm5pbmdzID0gd2FybjsKLX0KLQotdm9pZAotbGVmclNldElSRHJvcFdhcm5pbmdzKGludCB3YXJuKQotewotICAgIExFRl9JTklUOwotICAgIGxlZlNldHRpbmdzLT5JUkRyb3BXYXJuaW5ncyA9IHdhcm47Ci19Ci0KLXZvaWQKLWxlZnJTZXRMYXllcldhcm5pbmdzKGludCB3YXJuKQotewotICAgIExFRl9JTklUOwotICAgIGxlZlNldHRpbmdzLT5MYXllcldhcm5pbmdzID0gd2FybjsKLX0KLQotdm9pZAotbGVmclNldE1hY3JvV2FybmluZ3MoaW50IHdhcm4pCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmU2V0dGluZ3MtPk1hY3JvV2FybmluZ3MgPSB3YXJuOwotfQotCi12b2lkCi1sZWZyU2V0TWF4U3RhY2tWaWFXYXJuaW5ncyhpbnQgd2FybikKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZTZXR0aW5ncy0+TWF4U3RhY2tWaWFXYXJuaW5ncyA9IHdhcm47Ci19Ci0KLXZvaWQKLWxlZnJTZXRNaW5GZWF0dXJlV2FybmluZ3MoaW50IHdhcm4pCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmU2V0dGluZ3MtPk1pbkZlYXR1cmVXYXJuaW5ncyA9IHdhcm47Ci19Ci0KLXZvaWQKLWxlZnJTZXROb2lzZU1hcmdpbldhcm5pbmdzKGludCB3YXJuKQotewotICAgIExFRl9JTklUOwotICAgIGxlZlNldHRpbmdzLT5Ob2lzZU1hcmdpbldhcm5pbmdzID0gd2FybjsKLX0KLQotdm9pZAotbGVmclNldE5vaXNlVGFibGVXYXJuaW5ncyhpbnQgd2FybikKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZTZXR0aW5ncy0+Tm9pc2VUYWJsZVdhcm5pbmdzID0gd2FybjsKLX0KLQotdm9pZAotbGVmclNldE5vbkRlZmF1bHRXYXJuaW5ncyhpbnQgd2FybikKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZTZXR0aW5ncy0+Tm9uRGVmYXVsdFdhcm5pbmdzID0gd2FybjsKLX0KLQotdm9pZAotbGVmclNldE5vV2lyZUV4dGVuc2lvbldhcm5pbmdzKGludCB3YXJuKQotewotICAgIExFRl9JTklUOwotICAgIGxlZlNldHRpbmdzLT5Ob1dpcmVFeHRlbnNpb25XYXJuaW5ncyA9IHdhcm47Ci19Ci0KLXZvaWQKLWxlZnJTZXRPdXRwdXRBbnRlbm5hV2FybmluZ3MoaW50IHdhcm4pCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmU2V0dGluZ3MtPk91dHB1dEFudGVubmFXYXJuaW5ncyA9IHdhcm47Ci19Ci0KLXZvaWQKLWxlZnJTZXRQaW5XYXJuaW5ncyhpbnQgd2FybikKLXsKLSAgICBMRUZfSU5JVDsKLSAgICBsZWZTZXR0aW5ncy0+UGluV2FybmluZ3MgPSB3YXJuOwotfQotCi12b2lkCi1sZWZyU2V0U2l0ZVdhcm5pbmdzKGludCB3YXJuKQotewotICAgIExFRl9JTklUOwotICAgIGxlZlNldHRpbmdzLT5TaXRlV2FybmluZ3MgPSB3YXJuOwotfQotCi12b2lkCi1sZWZyU2V0U3BhY2luZ1dhcm5pbmdzKGludCB3YXJuKQotewotICAgIExFRl9JTklUOwotICAgIGxlZlNldHRpbmdzLT5TcGFjaW5nV2FybmluZ3MgPSB3YXJuOwotfQotCi12b2lkCi1sZWZyU2V0VGltaW5nV2FybmluZ3MoaW50IHdhcm4pCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmU2V0dGluZ3MtPlRpbWluZ1dhcm5pbmdzID0gd2FybjsKLX0KLQotdm9pZAotbGVmclNldFVuaXRzV2FybmluZ3MoaW50IHdhcm4pCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmU2V0dGluZ3MtPlVuaXRzV2FybmluZ3MgPSB3YXJuOwotfQotCi12b2lkCi1sZWZyU2V0VXNlTWluU3BhY2luZ1dhcm5pbmdzKGludCB3YXJuKQotewotICAgIExFRl9JTklUOwotICAgIGxlZlNldHRpbmdzLT5Vc2VNaW5TcGFjaW5nV2FybmluZ3MgPSB3YXJuOwotfQotCi12b2lkCi1sZWZyU2V0VmlhUnVsZVdhcm5pbmdzKGludCB3YXJuKQotewotICAgIExFRl9JTklUOwotICAgIGxlZlNldHRpbmdzLT5WaWFSdWxlV2FybmluZ3MgPSB3YXJuOwotfQotCi12b2lkCi1sZWZyU2V0VmlhV2FybmluZ3MoaW50IHdhcm4pCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmU2V0dGluZ3MtPlZpYVdhcm5pbmdzID0gd2FybjsKLX0KLQotdm9pZAotbGVmckRpc2FibGVQcm9wU3RyUHJvY2VzcygpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgbGVmU2V0dGluZ3MtPkRpc1Byb3BTdHJQcm9jZXNzID0gMTsKLX0KLQotdm9pZAotbGVmclJlZ2lzdGVyTGVmNThUeXBlKGNvbnN0IGNoYXIgKmxlZjU4VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpsYXllclR5cGUpCi17Ci0gICAgTEVGX0lOSVQ7Ci0gICAgY29uc3QgY2hhciAqdHlwZUxheWVyc1tdID0ge2xheWVyVHlwZSwgIiJ9OwotCi0gICAgbGVmU2V0dGluZ3MtPmFkZExlZjU4VHlwZShsZWY1OFR5cGUsIHR5cGVMYXllcnMpOwotfQotCi1FTkRfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZyUmVhZGVyLmhwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmclJlYWRlci5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ODcyYzAuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZyUmVhZGVyLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDU4NiArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyIC0gMjAxNywgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBkZWxsICQKLS8vICAkUmV2aXNpb246ICMxICQKLS8vICAkRGF0ZTogMjAxNy8wNi8wNiAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpZm5kZWYgTEVGUlJFQURFUl9ICi0jZGVmaW5lIExFRlJSRUFERVJfSAotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgImxlZmlLUkRlZnMuaHBwIgotI2luY2x1ZGUgImxlZmlEZWZzLmhwcCIKLSNpbmNsdWRlICJsZWZpVXNlci5ocHAiCi0jaW5jbHVkZSAibGVmaVV0aWwuaHBwIgotCi0jZGVmaW5lIE1BWF9MRUZfTVNHUyA0NzAxCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLS8vIFRoZSByZWFkZXIgaW5pdGlhbGl6YXRpb24uICBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgbGVmclJlYWQoKS4gCi1leHRlcm4gaW50IGxlZnJJbml0ICgpOwotZXh0ZXJuIGludCBsZWZySW5pdFNlc3Npb24gKGludCBzdGFydFNlc3Npb24gPSAxKTsKLQotLy8gb2Jzb2x0ZWQKLWV4dGVybiBpbnQgbGVmclJlc2V0ICgpOwotCi0vLyBDbGVhcnMgcGFyc2VyIGNvbmZpZ3VyYXRpb24gYW5kIHJldHVybiBpdCBpbiBpbmlhbCBzdGF0ZS4KLWV4dGVybiBpbnQgbGVmckNsZWFyICgpOwotCi0vLyBvYnNvbGV0ZWQKLWV4dGVybiBpbnQgbGVmclJlbGVhc2VOUmVzZXRNZW1vcnkgKCk7Ci0KLS8vIENoYW5nZSB0aGUgY29tbWVudCBjaGFyYWN0ZXIgaW4gTEVGLiAgVGhlIG5vcm1hbCBjaGFyYWN0ZXIgaXMKLS8vICcjJy4gICBZb3UgY2FuIGNoYW5nZSBpdCB0byBhbnl0aGluZyB5b3Ugd2FudCwgYnV0IGJlIGNhcmVmdWwuCi1leHRlcm4gdm9pZCBsZWZyU2V0Q29tbWVudENoYXIgKGNoYXIgYyk7Ci0KLS8vIEFsbG93IHRoZSBwYXJzZXIgdG8gdXBzaGlmdCBhbGwgbmFtZXMgaWYgdGhlIExFRgotLy8gZmlsZSBpcyBjYXNlIGluc2Vuc2l0aXZlLiAgVGhlIGRlZmF1bHQgaXMgbm8gc2hpZnQsIHNvIHRoZSB1c2VyCi0vLyBtdXN0IGRvIGNhc2UgaW5zZW5zaXRpdmUgbWF0Y2hpbmcuCi1leHRlcm4gdm9pZCBsZWZyU2V0U2hpZnRDYXNlICgpOwotCi0vLyBBbGxvdyB0aGUgdXNlciB0byBjaGFuZ2UgdGhlIGNhc2VzZW5zaXRpdml0eSBhbnl0aW1lIGR1cmluZwotLy8gcGFyc2luZy4KLS8vIGNhc2VTZW4gPSAwLCB3aWxsIHR1cm4gb2ZmIHRoZSBjYXNlc2Vuc2l0aXZpdHkKLS8vIGNhc2VTZW4gIT0gMCwgd2lsbCB0dXJuIG9uIHRoZSBjYXNlc2Vuc2l0aXZpdHkKLSAKLWV4dGVybiB2b2lkIGxlZnJTZXRDYXNlU2Vuc2l0aXZpdHkgKGludCBjYXNlU2Vuc2UpOwotCi0vLyBUaGUgcmVhZGVyIHJlcXVlc3QgdGhlIGZpbGUgbmFtZSB0aGV5IGFyZSBwYXJzaW5nCi0KLWV4dGVybiBjb25zdCBjaGFyICogbGVmckZOYW1lICgpOwotCi0KLS8vICBUaGUgbWFpbiByZWFkZXIgZnVuY3Rpb24uCi0vLyAgVGhlIGZpbGUgc2hvdWxkIGFscmVhZHkgYmUgb3BlbmVkLiAgVGhpcyByZXF1aXJlbWVudCBhbGxvd3MKLS8vICB0aGUgcmVhZGVyIHRvIGJlIHVzZWQgd2l0aCBzdGRpbiBvciBhIHBpcGUuICBUaGUgZmlsZSBuYW1lCi0vLyAgaXMgb25seSB1c2VkIGZvciBlcnJvciBtZXNzYWdlcy4gIFRoZSBpbmNsdWRlU2VhcmNoUGF0aCBpcwotLy8gIGEgY29sb24tZGVsaW1pdGVkIGxpc3Qgb2YgZGlyZWN0b3JpZXMgaW4gd2hpY2ggdG8gZmluZAotLy8gIGluY2x1ZGUgZmlsZXMuCi0KLWV4dGVybiBpbnQgbGVmclJlYWQgKEZJTEUgKmZpbGUsIGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBsZWZpVXNlckRhdGEgdXNlckRhdGEpOwotCi0vLyAgU2V0IGFsbCBvZiB0aGUgY2FsbGJhY2tzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gc2V0IHRvIGEgZnVuY3Rpb24KLS8vICB0aGF0IHdpbGwgYWRkIHVwIGhvdyBtYW55IHRpbWVzIGEgZ2l2ZW4gbGVmIGRhdGEgdHlwZSB3YXMgaWdub3JlZAotLy8gIChpZSBubyBjYWxsYmFjayB3YXMgZG9uZSkuICBUaGUgc3RhdGlzdGljcyBjYW4gbGF0ZXIgYmUgcHJpbnRlZCBvdXQuCi1leHRlcm4gdm9pZCBsZWZyU2V0UmVnaXN0ZXJVbnVzZWRDYWxsYmFja3MgKCk7Ci1leHRlcm4gdm9pZCBsZWZyUHJpbnRVbnVzZWRDYWxsYmFja3MgKEZJTEUqIGYpOwotCi0vLyBTZXQvZ2V0IHRoZSBjbGllbnQtcHJvdmlkZWQgdXNlciBkYXRhLiAgbGVmaSBkb2Vzbid0IGxvb2sgYXQKLS8vIHRoaXMgZGF0YSBhdCBhbGwsIGl0IHNpbXBseSBwYXNzZXMgdGhlIG9wYXF1ZSBsZWZpVXNlckRhdGEgcG9pbnRlcgotLy8gYmFjayB0byB0aGUgYXBwbGljYXRpb24gd2l0aCBlYWNoIGNhbGxiYWNrLiAgVGhlIGNsaWVudCBjYW4KLS8vIGNoYW5nZSB0aGUgZGF0YSBhdCBhbnkgdGltZSwgYW5kIGl0IHdpbGwgdGFrZSBlZmZlY3Qgb24gdGhlCi0vLyBuZXh0IGNhbGxiYWNrLiAgVGhlIGxlZmkgcmVhZGVyIGFuZCB3cml0ZXIgbWFpbnRhaW4gc2VwYXJhdGUKLS8vIHVzZXIgZGF0YSBwb2ludGVycy4KLWV4dGVybiB2b2lkIGxlZnJTZXRVc2VyRGF0YSAobGVmaVVzZXJEYXRhKTsKLWV4dGVybiBsZWZpVXNlckRhdGEgbGVmckdldFVzZXJEYXRhICgpOwotCi0vLyBBbiBlbnVtIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSB0eXBlcyBvZiByZWFkZXIgY2FsbGJhY2tzLgotdHlwZWRlZiBlbnVtIHsKLSAgbGVmclVuc3BlY2lmaWVkQ2JrVHlwZSA9IDAsCi0gIGxlZnJWZXJzaW9uQ2JrVHlwZSwKLSAgbGVmclZlcnNpb25TdHJDYmtUeXBlLAotICBsZWZyRGl2aWRlckNoYXJDYmtUeXBlLAotICBsZWZyQnVzQml0Q2hhcnNDYmtUeXBlLAotICBsZWZyVW5pdHNDYmtUeXBlLAotICBsZWZyQ2FzZVNlbnNpdGl2ZUNia1R5cGUsCi0gIGxlZnJOb1dpcmVFeHRlbnNpb25DYmtUeXBlLAotICBsZWZyUHJvcEJlZ2luQ2JrVHlwZSwKLSAgbGVmclByb3BDYmtUeXBlLAotICBsZWZyUHJvcEVuZENia1R5cGUsCi0gIGxlZnJMYXllckNia1R5cGUsCi0gIGxlZnJWaWFDYmtUeXBlLAotICBsZWZyVmlhUnVsZUNia1R5cGUsCi0gIGxlZnJTcGFjaW5nQ2JrVHlwZSwKLSAgbGVmcklSRHJvcENia1R5cGUsCi0gIGxlZnJEaWVsZWN0cmljQ2JrVHlwZSwKLSAgbGVmck1pbkZlYXR1cmVDYmtUeXBlLAotICBsZWZyTm9uRGVmYXVsdENia1R5cGUsCi0gIGxlZnJTaXRlQ2JrVHlwZSwKLSAgbGVmck1hY3JvQmVnaW5DYmtUeXBlLAotICBsZWZyUGluQ2JrVHlwZSwKLSAgbGVmck1hY3JvQ2JrVHlwZSwKLSAgbGVmck9ic3RydWN0aW9uQ2JrVHlwZSwKLSAgbGVmckFycmF5Q2JrVHlwZSwKLQotICAvLyBORVcgQ0FMTEJBQ0tTIC0gZWFjaCBjYWxsYmFjayBoYXMgaXRzIG93biB0eXBlLiAgRm9yIGVhY2ggY2FsbGJhY2sKLSAgLy8gdGhhdCB5b3UgYWRkLCB5b3UgbXVzdCBhZGQgYW4gaXRlbSB0byB0aGlzIGVudW0uIAotCi0gIGxlZnJTcGFjaW5nQmVnaW5DYmtUeXBlLAotICBsZWZyU3BhY2luZ0VuZENia1R5cGUsCi0gIGxlZnJBcnJheUJlZ2luQ2JrVHlwZSwKLSAgbGVmckFycmF5RW5kQ2JrVHlwZSwKLSAgbGVmcklSRHJvcEJlZ2luQ2JrVHlwZSwKLSAgbGVmcklSRHJvcEVuZENia1R5cGUsCi0gIGxlZnJOb2lzZU1hcmdpbkNia1R5cGUsCi0gIGxlZnJFZGdlUmF0ZVRocmVzaG9sZDFDYmtUeXBlLAotICBsZWZyRWRnZVJhdGVUaHJlc2hvbGQyQ2JrVHlwZSwKLSAgbGVmckVkZ2VSYXRlU2NhbGVGYWN0b3JDYmtUeXBlLAotICBsZWZyTm9pc2VUYWJsZUNia1R5cGUsCi0gIGxlZnJDb3JyZWN0aW9uVGFibGVDYmtUeXBlLAotICBsZWZySW5wdXRBbnRlbm5hQ2JrVHlwZSwKLSAgbGVmck91dHB1dEFudGVubmFDYmtUeXBlLAotICBsZWZySW5vdXRBbnRlbm5hQ2JrVHlwZSwKLSAgbGVmckFudGVubmFJbnB1dENia1R5cGUsCi0gIGxlZnJBbnRlbm5hSW5vdXRDYmtUeXBlLAotICBsZWZyQW50ZW5uYU91dHB1dENia1R5cGUsCi0gIGxlZnJNYW51ZmFjdHVyaW5nQ2JrVHlwZSwKLSAgbGVmclVzZU1pblNwYWNpbmdDYmtUeXBlLAotICBsZWZyQ2xlYXJhbmNlTWVhc3VyZUNia1R5cGUsCi0gIGxlZnJUaW1pbmdDYmtUeXBlLAotICBsZWZyTWFjcm9DbGFzc1R5cGVDYmtUeXBlLAotICBsZWZyTWFjcm9PcmlnaW5DYmtUeXBlLAotICBsZWZyTWFjcm9TaXplQ2JrVHlwZSwKLSAgbGVmck1hY3JvRml4ZWRNYXNrQ2JrVHlwZSwKLSAgbGVmck1hY3JvRW5kQ2JrVHlwZSwKLSAgbGVmck1heFN0YWNrVmlhQ2JrVHlwZSwKLSAgbGVmckV4dGVuc2lvbkNia1R5cGUsCi0gIGxlZnJEZW5zaXR5Q2JrVHlwZSwKLSAgbGVmckZpeGVkTWFza0Nia1R5cGUsCi0gIGxlZnJNYWNyb1NpdGVDYmtUeXBlLAotICBsZWZyTWFjcm9Gb3JlaWduQ2JrVHlwZSwKLQotICBsZWZyTGlicmFyeUVuZENia1R5cGUKLX0gbGVmckNhbGxiYWNrVHlwZV9lOwotIAotLy8gRGVjbGFyYXRpb25zIG9mIGZ1bmN0aW9uIHNpZ25hdHVyZXMgZm9yIGVhY2ggdHlwZSBvZiBjYWxsYmFjay4KLS8vIFRoZXNlIGRlY2xhcmF0aW9ucyBhcmUgdHlwZS1zYWZlIHdoZW4gY29tcGlsaW5nIHdpdGggQU5TSSBDCi0vLyBvciBDKys7IHlvdSB3aWxsIG9ubHkgYmUgYWJsZSB0byByZWdpc3RlciBhIGZ1bmN0aW9uIHBvaW50ZXIKLS8vIHdpdGggdGhlIGNvcnJlY3Qgc2lnbmF0dXJlIGZvciBhIGdpdmVuIHR5cGUgb2YgY2FsbGJhY2suCi0vLwotLy8gRWFjaCBjYWxsYmFjayBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byByZXR1cm4gMCBpZiBzdWNjZXNzZnVsLgotLy8gQSBub24temVybyByZXR1cm4gY29kZSB3aWxsIGNhdXNlIHRoZSByZWFkZXIgdG8gYWJvcnQuCi0vLwotLy8gVGhlIGxlZnJEZXNpZ25TdGFydCBhbmQgbGVmckRlc2lnbkVuZCBjYWxsYmFjayBpcyBvbmx5IGNhbGxlZCBvbmNlLgotLy8gT3RoZXIgY2FsbGJhY2tzIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMsIGVhY2ggdGltZSB3aXRoIGEgZGlmZmVyZW50Ci0vLyBzZXQgb2YgZGF0YS4KLS8vCi0vLyBGb3IgZWFjaCBjYWxsYmFjaywgdGhlIERlZiBBUEkgd2lsbCBtYWtlIHRoZSBjYWxsYmFjayB0byB0aGUKLS8vIGZ1bmN0aW9uIHN1cHBsaWVkIGJ5IHRoZSBjbGllbnQsIHdoaWNoIHNob3VsZCBlaXRoZXIgbWFrZSBhIGNvcHkKLS8vIG9mIHRoZSBEZWYgb2JqZWN0LCBvciBzdG9yZSB0aGUgZGF0YSBpbiB0aGUgY2xpZW50J3Mgb3duIGRhdGEgc3RydWN0dXJlcy4KLS8vIFRoZSBEZWYgQVBJIHdpbGwgZGVsZXRlIG9yIHJldXNlIGVhY2ggb2JqZWN0IGFmdGVyIG1ha2luZyB0aGUgY2FsbGJhY2ssCi0vLyBzbyB0aGUgY2xpZW50IHNob3VsZCBub3Qga2VlcCBhIHBvaW50ZXIgdG8gaXQuCi0vLwotLy8gQWxsIGNhbGxiYWNrcyBwYXNzIHRoZSB1c2VyIGRhdGEgcG9pbnRlciBwcm92aWRlZCBpbiBsZWZyUmVhZCgpCi0vLyBvciBsZWZyU2V0VXNlckRhdGEoKSBiYWNrIHRvIHRoZSBjbGllbnQ7IHRoaXMgY2FuIGJlIHVzZWQgYnkgdGhlCi0vLyBjbGllbnQgdG8gb2J0YWluIGFjY2VzcyB0byB0aGUgcmVzdCBvZiB0aGUgY2xpZW50J3MgZGF0YSBzdHJ1Y3R1cmVzLgotLy8KLS8vIFRoZSB1c2VyIGRhdGEgcG9pbnRlciBpcyBvYnRhaW5lZCB1c2luZyBsZWZyR2V0VXNlckRhdGEoKSBpbW1lZGlhdGVseQotLy8gcHJpb3IgdG8gbWFraW5nIGVhY2ggY2FsbGJhY2ssIHNvIHRoZSBjbGllbnQgaXMgZnJlZSB0byBjaGFuZ2UgdGhlCi0vLyB1c2VyIGRhdGEgb24gdGhlIGZseSBpZiBuZWNlc3NhcnkuCi0vLwotLy8gQ2FsbGJhY2tzIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGFyZSBwYXNzZWQgYSBjYWxsYmFjayB0eXBlCi0vLyBwYXJhbWV0ZXIsIHdoaWNoIGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byB3cml0ZSBhIHNpbmdsZSBjYWxsYmFjawotLy8gZnVuY3Rpb24sIHJlZ2lzdGVyIHRoYXQgZnVuY3Rpb24gZm9yIG11bHRpcGxlIGNhbGxiYWNrcywgdGhlbgotLy8gc3dpdGNoIGJhc2VkIG9uIHRoZSBjYWxsYmFjayB0eXBlIHRvIGhhbmRsZSB0aGUgYXBwcm9wcmlhdGUgdHlwZSBvZgotLy8gZGF0YS4KLSAKLQotLy8gQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gbm90aGluZy4gCi10eXBlZGVmIGludCAoKmxlZnJWb2lkQ2JrRm5UeXBlKSAobGVmckNhbGxiYWNrVHlwZV9lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBudW0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZmlVc2VyRGF0YSk7Ci0KLS8vIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgc3RyaW5nLiAKLXR5cGVkZWYgaW50ICgqbGVmclN0cmluZ0Nia0ZuVHlwZSkgKGxlZnJDYWxsYmFja1R5cGVfZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdHJpbmcsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaVVzZXJEYXRhKTsKLSAKLS8vIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgaW50ZWdlci4gCi10eXBlZGVmIGludCAoKmxlZnJJbnRlZ2VyQ2JrRm5UeXBlKSAobGVmckNhbGxiYWNrVHlwZV9lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZpVXNlckRhdGEpOwotIAotLy8gQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBkb3VibGUuIAotdHlwZWRlZiBpbnQgKCpsZWZyRG91YmxlQ2JrRm5UeXBlKSAobGVmckNhbGxiYWNrVHlwZV9lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBudW1iZXIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaVVzZXJEYXRhKTsKLQotLy8gQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBsZWZpVW5pdHMuIAotdHlwZWRlZiBpbnQgKCpsZWZyVW5pdHNDYmtGblR5cGUpIChsZWZyQ2FsbGJhY2tUeXBlX2UsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZpVW5pdHMqIHVuaXRzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaVVzZXJEYXRhKTsKLSAKLS8vIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgbGVmaUxheWVyLiAKLXR5cGVkZWYgaW50ICgqbGVmckxheWVyQ2JrRm5UeXBlKSAobGVmckNhbGxiYWNrVHlwZV9lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaUxheWVyKiBsLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaVVzZXJEYXRhKTsKLSAKLS8vIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgbGVmaVZpYS4gCi10eXBlZGVmIGludCAoKmxlZnJWaWFDYmtGblR5cGUpIChsZWZyQ2FsbGJhY2tUeXBlX2UsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaVZpYSogbCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZpVXNlckRhdGEpOwotIAotLy8gQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBsZWZpVmlhUnVsZS4gCi10eXBlZGVmIGludCAoKmxlZnJWaWFSdWxlQ2JrRm5UeXBlKSAobGVmckNhbGxiYWNrVHlwZV9lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZpVmlhUnVsZSogbCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaVVzZXJEYXRhKTsKLSAKLS8vIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgbGVmaVNwYWNpbmcuIAotdHlwZWRlZiBpbnQgKCpsZWZyU3BhY2luZ0Nia0ZuVHlwZSkgKGxlZnJDYWxsYmFja1R5cGVfZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaVNwYWNpbmcqIGwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZmlVc2VyRGF0YSk7Ci0gCi0vLyBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBhIGxlZmlJUkRyb3AuIAotdHlwZWRlZiBpbnQgKCpsZWZySVJEcm9wQ2JrRm5UeXBlKSAobGVmckNhbGxiYWNrVHlwZV9lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZmlJUkRyb3AqIGwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaVVzZXJEYXRhKTsKLSAKLS8vIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgbGVmaU1pbkZlYXR1cmUuIAotdHlwZWRlZiBpbnQgKCpsZWZyTWluRmVhdHVyZUNia0ZuVHlwZSkgKGxlZnJDYWxsYmFja1R5cGVfZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaU1pbkZlYXR1cmUqIGwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZmlVc2VyRGF0YSk7Ci0gCi0vLyBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBhIGxlZmlOb25EZWZhdWx0LiAKLXR5cGVkZWYgaW50ICgqbGVmck5vbkRlZmF1bHRDYmtGblR5cGUpIChsZWZyQ2FsbGJhY2tUeXBlX2UsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZmlOb25EZWZhdWx0KiBsLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZpVXNlckRhdGEpOwotIAotLy8gQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBsZWZpU2l0ZS4gCi10eXBlZGVmIGludCAoKmxlZnJTaXRlQ2JrRm5UeXBlKSAobGVmckNhbGxiYWNrVHlwZV9lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZpU2l0ZSogbCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaVVzZXJEYXRhKTsKLSAKLS8vIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgbGVmaU1hY3JvLiAKLXR5cGVkZWYgaW50ICgqbGVmck1hY3JvQ2JrRm5UeXBlKSAobGVmckNhbGxiYWNrVHlwZV9lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaU1hY3JvKiBsLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaVVzZXJEYXRhKTsKLSAKLS8vIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgbGVmaVBpbi4gCi10eXBlZGVmIGludCAoKmxlZnJQaW5DYmtGblR5cGUpIChsZWZyQ2FsbGJhY2tUeXBlX2UsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaVBpbiogbCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZpVXNlckRhdGEpOwotIAotLy8gQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBsZWZpT2JzdHJ1Y3Rpb24uIAotdHlwZWRlZiBpbnQgKCpsZWZyT2JzdHJ1Y3Rpb25DYmtGblR5cGUpIChsZWZyQ2FsbGJhY2tUeXBlX2UsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZpT2JzdHJ1Y3Rpb24qIGwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZpVXNlckRhdGEpOwotIAotLy8gQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBsZWZpQXJyYXkuIAotdHlwZWRlZiBpbnQgKCpsZWZyQXJyYXlDYmtGblR5cGUpIChsZWZyQ2FsbGJhY2tUeXBlX2UsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZpQXJyYXkqIGwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZpVXNlckRhdGEpOwotIAotLy8gQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBsZWZpUHJvcC4gCi10eXBlZGVmIGludCAoKmxlZnJQcm9wQ2JrRm5UeXBlKSAobGVmckNhbGxiYWNrVHlwZV9lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZpUHJvcCogcCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaVVzZXJEYXRhKTsKLSAKLS8vIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgbGVmaU5vaXNlTWFyZ2luLiAKLXR5cGVkZWYgaW50ICgqbGVmck5vaXNlTWFyZ2luQ2JrRm5UeXBlKSAobGVmckNhbGxiYWNrVHlwZV9lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGxlZmlOb2lzZU1hcmdpbiogcCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZmlVc2VyRGF0YSk7Ci0gCi0vLyBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBhIGxlZmlOb2lzZVRhYmxlLiAKLXR5cGVkZWYgaW50ICgqbGVmck5vaXNlVGFibGVDYmtGblR5cGUpIChsZWZyQ2FsbGJhY2tUeXBlX2UsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZmlOb2lzZVRhYmxlKiBwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZpVXNlckRhdGEpOwotIAotLy8gQSBkZWNsYXJhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCByZXR1cm4gYSBsZWZpQ29ycmVjdGlvblRhYmxlLiAKLXR5cGVkZWYgaW50ICgqbGVmckNvcnJlY3Rpb25UYWJsZUNia0ZuVHlwZSkgKGxlZnJDYWxsYmFja1R5cGVfZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZpQ29ycmVjdGlvblRhYmxlKiBwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZmlVc2VyRGF0YSk7Ci0gCi0vLyBBIGRlY2xhcmF0aW9uIG9mIHRoZSBzaWduYXR1cmUgb2YgYWxsIGNhbGxiYWNrcyB0aGF0IHJldHVybiBhIGxlZmlUaW1pbmcuIAotdHlwZWRlZiBpbnQgKCpsZWZyVGltaW5nQ2JrRm5UeXBlKSAobGVmckNhbGxiYWNrVHlwZV9lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZmlUaW1pbmcqIHAsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaVVzZXJEYXRhKTsKLSAKLS8vIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgbGVmaVVzZU1pblNwYWNpbmcuIAotdHlwZWRlZiBpbnQgKCpsZWZyVXNlTWluU3BhY2luZ0Nia0ZuVHlwZSkgKGxlZnJDYWxsYmFja1R5cGVfZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaVVzZU1pblNwYWNpbmcqIGwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZmlVc2VyRGF0YSk7Ci0gCi0gIC8vIE5FVyBDQUxMQkFDSyAtIElmIHlvdXIgY2FsbGJhY2sgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBuZXcgY2xhc3MgdGhlbgotICAvLyB5b3UgbXVzdCBhZGQgYSB0eXBlIGZ1bmN0aW9uIGhlcmUuCi0KLS8vIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgbGVmaU1heFN0YWNrVmlhLiAKLXR5cGVkZWYgaW50ICgqbGVmck1heFN0YWNrVmlhQ2JrRm5UeXBlKSAobGVmckNhbGxiYWNrVHlwZV9lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaU1heFN0YWNrVmlhKiBsLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaVVzZXJEYXRhKTsKLQotdHlwZWRlZiBpbnQgKCpsZWZyTWFjcm9OdW1DYmtGblR5cGUpIChsZWZyQ2FsbGJhY2tUeXBlX2UsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZpTnVtIGwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZpVXNlckRhdGEpOwotCi10eXBlZGVmIGludCAoKmxlZnJNYWNyb1NpdGVDYmtGblR5cGUpIChsZWZyQ2FsbGJhY2tUeXBlX2UsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsZWZpTWFjcm9TaXRlICpzaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZpVXNlckRhdGEpOwotCi10eXBlZGVmIGludCAoKmxlZnJNYWNyb0ZvcmVpZ25DYmtGblR5cGUpIChsZWZyQ2FsbGJhY2tUeXBlX2UsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGVmaU1hY3JvRm9yZWlnbiAqZm9yZWlnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZmlVc2VyRGF0YSk7Ci0KLS8vIDUuNiAKLS8vIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIGEgbGVmaURlbnNpdHkuIAotdHlwZWRlZiBpbnQgKCpsZWZyRGVuc2l0eUNia0ZuVHlwZSkgKGxlZnJDYWxsYmFja1R5cGVfZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmaURlbnNpdHkqIGwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZmlVc2VyRGF0YSk7Ci0gCi0vLyBGdW5jdGlvbnMgdG8gY2FsbCB0byByZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uLgotZXh0ZXJuIHZvaWQgbGVmclNldFVuaXRzQ2JrKGxlZnJVbml0c0Nia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBsZWZyU2V0VmVyc2lvbkNiayhsZWZyRG91YmxlQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGxlZnJTZXRWZXJzaW9uU3RyQ2JrKGxlZnJTdHJpbmdDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmclNldERpdmlkZXJDaGFyQ2JrKGxlZnJTdHJpbmdDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmclNldEJ1c0JpdENoYXJzQ2JrKGxlZnJTdHJpbmdDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmclNldE5vV2lyZUV4dGVuc2lvbkNiayhsZWZyU3RyaW5nQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGxlZnJTZXRDYXNlU2Vuc2l0aXZlQ2JrKGxlZnJJbnRlZ2VyQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGxlZnJTZXRQcm9wQmVnaW5DYmsobGVmclZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmclNldFByb3BDYmsobGVmclByb3BDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmclNldFByb3BFbmRDYmsobGVmclZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmclNldExheWVyQ2JrKGxlZnJMYXllckNia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBsZWZyU2V0VmlhQ2JrKGxlZnJWaWFDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmclNldFZpYVJ1bGVDYmsobGVmclZpYVJ1bGVDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmclNldFNwYWNpbmdDYmsobGVmclNwYWNpbmdDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmclNldElSRHJvcENiayhsZWZySVJEcm9wQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGxlZnJTZXREaWVsZWN0cmljQ2JrKGxlZnJEb3VibGVDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmclNldE1pbkZlYXR1cmVDYmsobGVmck1pbkZlYXR1cmVDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmclNldE5vbkRlZmF1bHRDYmsobGVmck5vbkRlZmF1bHRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmclNldFNpdGVDYmsobGVmclNpdGVDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmclNldE1hY3JvQmVnaW5DYmsobGVmclN0cmluZ0Nia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBsZWZyU2V0UGluQ2JrKGxlZnJQaW5DYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmclNldE9ic3RydWN0aW9uQ2JrKGxlZnJPYnN0cnVjdGlvbkNia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBsZWZyU2V0QXJyYXlDYmsobGVmckFycmF5Q2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGxlZnJTZXRNYWNyb0NiayhsZWZyTWFjcm9DYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmclNldExpYnJhcnlFbmRDYmsobGVmclZvaWRDYmtGblR5cGUpOwotCi0vLyBORVcgQ0FMTEJBQ0sgLSBlYWNoIGNhbGxiYWNrIG11c3QgaGF2ZSBhIGZ1bmN0aW9uIHRvIGFsbG93IHRoZSB1c2VyCi0vLyB0byBzZXQgaXQuICBBZGQgdGhlIGZ1bmN0aW9uIGhlcmUuCi0KLWV4dGVybiB2b2lkIGxlZnJTZXRUaW1pbmdDYmsobGVmclRpbWluZ0Nia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBsZWZyU2V0U3BhY2luZ0JlZ2luQ2JrKGxlZnJWb2lkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGxlZnJTZXRTcGFjaW5nRW5kQ2JrKGxlZnJWb2lkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGxlZnJTZXRBcnJheUJlZ2luQ2JrKGxlZnJTdHJpbmdDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmclNldEFycmF5RW5kQ2JrKGxlZnJTdHJpbmdDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmclNldElSRHJvcEJlZ2luQ2JrKGxlZnJWb2lkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGxlZnJTZXRJUkRyb3BFbmRDYmsobGVmclZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmclNldE5vaXNlTWFyZ2luQ2JrKGxlZnJOb2lzZU1hcmdpbkNia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBsZWZyU2V0RWRnZVJhdGVUaHJlc2hvbGQxQ2JrKGxlZnJEb3VibGVDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmclNldEVkZ2VSYXRlVGhyZXNob2xkMkNiayhsZWZyRG91YmxlQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGxlZnJTZXRFZGdlUmF0ZVNjYWxlRmFjdG9yQ2JrKGxlZnJEb3VibGVDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmclNldE5vaXNlVGFibGVDYmsobGVmck5vaXNlVGFibGVDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmclNldENvcnJlY3Rpb25UYWJsZUNiayhsZWZyQ29ycmVjdGlvblRhYmxlQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGxlZnJTZXRJbnB1dEFudGVubmFDYmsobGVmckRvdWJsZUNia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBsZWZyU2V0T3V0cHV0QW50ZW5uYUNiayhsZWZyRG91YmxlQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGxlZnJTZXRJbm91dEFudGVubmFDYmsobGVmckRvdWJsZUNia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBsZWZyU2V0QW50ZW5uYUlucHV0Q2JrKGxlZnJEb3VibGVDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmclNldEFudGVubmFJbm91dENiayhsZWZyRG91YmxlQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGxlZnJTZXRBbnRlbm5hT3V0cHV0Q2JrKGxlZnJEb3VibGVDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmclNldENsZWFyYW5jZU1lYXN1cmVDYmsobGVmclN0cmluZ0Nia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBsZWZyU2V0TWFudWZhY3R1cmluZ0NiayhsZWZyRG91YmxlQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGxlZnJTZXRVc2VNaW5TcGFjaW5nQ2JrKGxlZnJVc2VNaW5TcGFjaW5nQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGxlZnJTZXRNYWNyb0NsYXNzVHlwZUNiayhsZWZyU3RyaW5nQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGxlZnJTZXRNYWNyb09yaWdpbkNiayhsZWZyTWFjcm9OdW1DYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmclNldE1hY3JvU2l0ZUNiayhsZWZyTWFjcm9TaXRlQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGxlZnJTZXRNYWNyb0ZvcmVpZ25DYmsobGVmck1hY3JvRm9yZWlnbkNia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBsZWZyU2V0TWFjcm9TaXplQ2JrKGxlZnJNYWNyb051bUNia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBsZWZyU2V0TWFjcm9GaXhlZE1hc2tDYmsobGVmckludGVnZXJDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmclNldE1hY3JvRW5kQ2JrKGxlZnJTdHJpbmdDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmclNldE1heFN0YWNrVmlhQ2JrKGxlZnJNYXhTdGFja1ZpYUNia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBsZWZyU2V0RXh0ZW5zaW9uQ2JrKGxlZnJTdHJpbmdDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmclNldERlbnNpdHlDYmsobGVmckRlbnNpdHlDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmclNldEZpeGVkTWFza0NiayhsZWZySW50ZWdlckNia0ZuVHlwZSk7Ci0KLS8vIFNldCBhbGwgb2YgdGhlIGNhbGxiYWNrcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIHNldCB0byB0aGUgZm9sbG93aW5nCi0vLyBmdW5jdGlvbi4gIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgaWYgeW91IHdhbnQgdG8gY2hlY2sgdG8gc2VlCi0vLyBpZiB5b3UgZm9yZ290IGFueXRoaW5nLgotZXh0ZXJuIHZvaWQgbGVmclNldFVudXNlZENhbGxiYWNrcyAobGVmclZvaWRDYmtGblR5cGUgZnVuYyk7Ci0KLS8vIFJlc2V0IGFsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb25zIHRvIG5pbAotZXh0ZXJuIHZvaWQgbGVmclVuc2V0Q2FsbGJhY2tzKCk7Ci0KLS8vIEZ1bmN0aW9ucyB0byBjYWxsIHRvIHVucmVnaXN0ZXIgYSBjYWxsYmFjayBmdW5jdGlvbi4KLWV4dGVybiB2b2lkIGxlZnJVbnNldEFudGVubmFJbnB1dENiaygpOwotZXh0ZXJuIHZvaWQgbGVmclVuc2V0QW50ZW5uYUlub3V0Q2JrKCk7Ci1leHRlcm4gdm9pZCBsZWZyVW5zZXRBbnRlbm5hT3V0cHV0Q2JrKCk7Ci1leHRlcm4gdm9pZCBsZWZyVW5zZXRBcnJheUJlZ2luQ2JrKCk7Ci1leHRlcm4gdm9pZCBsZWZyVW5zZXRBcnJheUNiaygpOwotZXh0ZXJuIHZvaWQgbGVmclVuc2V0QXJyYXlFbmRDYmsoKTsKLWV4dGVybiB2b2lkIGxlZnJVbnNldEJ1c0JpdENoYXJzQ2JrKCk7Ci1leHRlcm4gdm9pZCBsZWZyVW5zZXRDYXNlU2Vuc2l0aXZlQ2JrKCk7Ci1leHRlcm4gdm9pZCBsZWZyVW5zZXRDbGVhcmFuY2VNZWFzdXJlQ2JrKCk7Ci1leHRlcm4gdm9pZCBsZWZyVW5zZXRDb3JyZWN0aW9uVGFibGVDYmsoKTsKLWV4dGVybiB2b2lkIGxlZnJVbnNldERlbnNpdHlDYmsoKTsKLWV4dGVybiB2b2lkIGxlZnJVbnNldERpZWxlY3RyaWNDYmsoKTsKLWV4dGVybiB2b2lkIGxlZnJVbnNldERpdmlkZXJDaGFyQ2JrKCk7Ci1leHRlcm4gdm9pZCBsZWZyVW5zZXRFZGdlUmF0ZVNjYWxlRmFjdG9yQ2JrKCk7Ci1leHRlcm4gdm9pZCBsZWZyVW5zZXRFZGdlUmF0ZVRocmVzaG9sZDFDYmsoKTsKLWV4dGVybiB2b2lkIGxlZnJVbnNldEVkZ2VSYXRlVGhyZXNob2xkMkNiaygpOwotZXh0ZXJuIHZvaWQgbGVmclVuc2V0RXh0ZW5zaW9uQ2JrKCk7Ci1leHRlcm4gdm9pZCBsZWZyVW5zZXRJbm91dEFudGVubmFDYmsoKTsKLWV4dGVybiB2b2lkIGxlZnJVbnNldElucHV0QW50ZW5uYUNiaygpOwotZXh0ZXJuIHZvaWQgbGVmclVuc2V0SVJEcm9wQmVnaW5DYmsoKTsKLWV4dGVybiB2b2lkIGxlZnJVbnNldElSRHJvcENiaygpOwotZXh0ZXJuIHZvaWQgbGVmclVuc2V0SVJEcm9wRW5kQ2JrKCk7Ci1leHRlcm4gdm9pZCBsZWZyVW5zZXRMYXllckNiaygpOwotZXh0ZXJuIHZvaWQgbGVmclVuc2V0TGlicmFyeUVuZENiaygpOwotZXh0ZXJuIHZvaWQgbGVmclVuc2V0TWFjcm9CZWdpbkNiaygpOwotZXh0ZXJuIHZvaWQgbGVmclVuc2V0TWFjcm9DYmsoKTsKLWV4dGVybiB2b2lkIGxlZnJVbnNldE1hY3JvQ2xhc3NUeXBlQ2JrKCk7Ci1leHRlcm4gdm9pZCBsZWZyVW5zZXRNYWNyb0VuZENiaygpOwotZXh0ZXJuIHZvaWQgbGVmclVuc2V0TWFjcm9PcmlnaW5DYmsoKTsKLWV4dGVybiB2b2lkIGxlZnJVbnNldE1hY3JvU2l0ZUNiaygpOwotZXh0ZXJuIHZvaWQgbGVmclVuc2V0TWFjcm9Gb3JlaWduQ2JrKCk7Ci1leHRlcm4gdm9pZCBsZWZyVW5zZXRNYWNyb1NpemVDYmsoKTsKLWV4dGVybiB2b2lkIGxlZnJVbnNldE1hbnVmYWN0dXJpbmdDYmsoKTsKLWV4dGVybiB2b2lkIGxlZnJVbnNldE1heFN0YWNrVmlhQ2JrKCk7Ci1leHRlcm4gdm9pZCBsZWZyVW5zZXRNaW5GZWF0dXJlQ2JrKCk7Ci1leHRlcm4gdm9pZCBsZWZyVW5zZXROb2lzZU1hcmdpbkNiaygpOwotZXh0ZXJuIHZvaWQgbGVmclVuc2V0Tm9pc2VUYWJsZUNiaygpOwotZXh0ZXJuIHZvaWQgbGVmclVuc2V0Tm9uRGVmYXVsdENiaygpOwotZXh0ZXJuIHZvaWQgbGVmclVuc2V0Tm9XaXJlRXh0ZW5zaW9uQ2JrKCk7Ci1leHRlcm4gdm9pZCBsZWZyVW5zZXRPYnN0cnVjdGlvbkNiaygpOwotZXh0ZXJuIHZvaWQgbGVmclVuc2V0T3V0cHV0QW50ZW5uYUNiaygpOwotZXh0ZXJuIHZvaWQgbGVmclVuc2V0UGluQ2JrKCk7Ci1leHRlcm4gdm9pZCBsZWZyVW5zZXRQcm9wQmVnaW5DYmsoKTsKLWV4dGVybiB2b2lkIGxlZnJVbnNldFByb3BDYmsoKTsKLWV4dGVybiB2b2lkIGxlZnJVbnNldFByb3BFbmRDYmsoKTsKLWV4dGVybiB2b2lkIGxlZnJVbnNldFNpdGVDYmsoKTsKLWV4dGVybiB2b2lkIGxlZnJVbnNldFNwYWNpbmdCZWdpbkNiaygpOwotZXh0ZXJuIHZvaWQgbGVmclVuc2V0U3BhY2luZ0NiaygpOwotZXh0ZXJuIHZvaWQgbGVmclVuc2V0U3BhY2luZ0VuZENiaygpOwotZXh0ZXJuIHZvaWQgbGVmclVuc2V0VGltaW5nQ2JrKCk7Ci1leHRlcm4gdm9pZCBsZWZyVW5zZXRVc2VNaW5TcGFjaW5nQ2JrKCk7Ci1leHRlcm4gdm9pZCBsZWZyVW5zZXRVbml0c0NiaygpOwotZXh0ZXJuIHZvaWQgbGVmclVuc2V0VmVyc2lvbkNiaygpOwotZXh0ZXJuIHZvaWQgbGVmclVuc2V0VmVyc2lvblN0ckNiaygpOwotZXh0ZXJuIHZvaWQgbGVmclVuc2V0VmlhQ2JrKCk7Ci1leHRlcm4gdm9pZCBsZWZyVW5zZXRWaWFSdWxlQ2JrKCk7Ci0KLS8vIFJldHVybiB0aGUgY3VycmVudCBsaW5lIG51bWJlciBpbiB0aGUgcGFyc2VyLgotZXh0ZXJuIGludCBsZWZyTGluZU51bWJlciAoKTsKLQotLy8gUm91dGluZSB0byBzZXQgdGhlIG1lc3NhZ2UgbG9nZ2luZyByb3V0aW5lIGZvciBlcnJvcnMgCi10eXBlZGVmIHZvaWQgKCpMRUZJX0xPR19GVU5DVElPTikgKGNvbnN0IGNoYXIqKTsKLWV4dGVybiB2b2lkIGxlZnJTZXRMb2dGdW5jdGlvbihMRUZJX0xPR19GVU5DVElPTik7Ci0KLS8vIFJvdXRpbmUgdG8gc2V0IHRoZSBtZXNzYWdlIGxvZ2dpbmcgcm91dGluZSBmb3Igd2FybmluZ3MgCi10eXBlZGVmIHZvaWQgKCpMRUZJX1dBUk5JTkdfTE9HX0ZVTkNUSU9OKSAoY29uc3QgY2hhciopOwotZXh0ZXJuIHZvaWQgbGVmclNldFdhcm5pbmdMb2dGdW5jdGlvbihMRUZJX1dBUk5JTkdfTE9HX0ZVTkNUSU9OKTsKLQotLy8gUm91dGluZSB0byBzZXQgdGhlIHVzZXIgZGVmaW5lZCBtYWxsb2Mgcm91dGluZSAKLXR5cGVkZWYgdm9pZCogKCpMRUZJX01BTExPQ19GVU5DVElPTikgKGludCk7Ci1leHRlcm4gdm9pZCBsZWZyU2V0TWFsbG9jRnVuY3Rpb24oTEVGSV9NQUxMT0NfRlVOQ1RJT04pOwotCi0vLyBSb3V0aW5lIHRvIHNldCB0aGUgdXNlciBkZWZpbmVkIHJlYWxsb2Mgcm91dGluZSAKLXR5cGVkZWYgdm9pZCogKCpMRUZJX1JFQUxMT0NfRlVOQ1RJT04pICh2b2lkICosIGludCk7Ci1leHRlcm4gdm9pZCBsZWZyU2V0UmVhbGxvY0Z1bmN0aW9uKExFRklfUkVBTExPQ19GVU5DVElPTik7Ci0KLS8vIFJvdXRpbmUgdG8gc2V0IHRoZSB1c2VyIGRlZmluZWQgZnJlZSByb3V0aW5lIAotdHlwZWRlZiB2b2lkICgqTEVGSV9GUkVFX0ZVTkNUSU9OKSAodm9pZCAqKTsKLWV4dGVybiB2b2lkIGxlZnJTZXRGcmVlRnVuY3Rpb24oTEVGSV9GUkVFX0ZVTkNUSU9OKTsKLQotLy8gUm91dGluZSB0byBzZXQgdGhlIGxpbmUgbnVtYmVyIGNhbGxiYWNrIHJvdXRpbmUgCi10eXBlZGVmIHZvaWQgKCpMRUZJX0xJTkVfTlVNQkVSX0ZVTkNUSU9OKSAoaW50KTsKLWV4dGVybiB2b2lkIGxlZnJTZXRMaW5lTnVtYmVyRnVuY3Rpb24oIExFRklfTElORV9OVU1CRVJfRlVOQ1RJT04pOwotCi0vLyBTZXQgdGhlIG51bWJlciBvZiBsaW5lcyBiZWZvcmUgY2FsbGluZyB0aGUgbGluZSBmdW5jdGlvbiBjYWxsYmFjayByb3V0aW5lIAotLy8gRGVmYXVsdCBpcyAxMDAwMCAKLWV4dGVybiB2b2lkIGxlZnJTZXREZWx0YU51bWJlckxpbmVzICAoaW50KTsKLQotLy8gUENSIDU1MTIyOSAtIFNldCB0aGUgcGFyc2VyIHRvIGJlIG1vcmUgcmVsYXggCi0vLyBUaGlzIGFwaSBpcyBzcGVjaWZpYyBmb3IgUEtTLiAKLS8vIFdoZW4gaW4gcmVsYXggbW9kZSwgdGhlIHBhcnNlciB3aWxsIG5vdCByZXF1aXJlIHdpZHRoLCBwaXRjaCwgJiBkaXJlY3Rpb24gCi0vLyBpbiByb3V0aW5nIGxheWVycy4gQWxzbyB2aWFzIGluIG5vbmRlZmF1bHQgcnVsZXMgCi1leHRlcm4gdm9pZCBsZWZyU2V0UmVsYXhNb2RlICgpOwotZXh0ZXJuIHZvaWQgbGVmclVuc2V0UmVsYXhNb2RlICgpOwotCi0vLyBQQ1IgNTY1Mjc0IC0gTEVGL0RFRiBBUEkgc2hvdWxkIGhhdmUgdGhlIEFQSSBjYWxsIHRvIG92ZXJ3cml0ZSBkZWZhdWx0IAotLy8gICAgICAgICAgICAgIHZlcnNpb24gCi1leHRlcm4gdm9pZCBsZWZyU2V0VmVyc2lvblZhbHVlKGNvbnN0ICBjaGFyKiAgdmVyc2lvbik7Ci0KLS8vIFJvdXRpbmUgdG8gc2V0IHRoZSByZWFkIGZ1bmN0aW9uIAotdHlwZWRlZiBzaXplX3QgKCpMRUZJX1JFQURfRlVOQ1RJT04pIChGSUxFKiwgY2hhciosIHNpemVfdCk7Ci1leHRlcm4gdm9pZCBsZWZyU2V0UmVhZEZ1bmN0aW9uKExFRklfUkVBRF9GVU5DVElPTik7Ci1leHRlcm4gdm9pZCBsZWZyVW5zZXRSZWFkRnVuY3Rpb24oKTsKLQotLy8gUm91dGluZSB0byBzZXQgdGhlIGxlZnJXYXJuaW5nLmxvZyB0byBvcGVuIGFzIGFwcGVuZCBpbnN0ZWFkIGZvciB3cml0ZSAKLS8vIE5ldyBpbiA1LjcgCi1leHRlcm4gdm9pZCBsZWZyU2V0T3BlbkxvZ0ZpbGVBcHBlbmQoKTsKLWV4dGVybiB2b2lkIGxlZnJVbnNldE9wZW5Mb2dGaWxlQXBwZW5kKCk7Ci0KLS8vIFJvdXRpbmUgdG8gZGlzYWJsZSBzdHJpbmcgcHJvcGVydHkgdmFsdWUgcHJvY2VzcywgZGVmYXVsdCBpdCB3aWxsIHByb2Nlc3MgCi0vLyB0aGUgdmFsdWUgc3RyaW5nIAotZXh0ZXJuIHZvaWQgbGVmckRpc2FibGVQcm9wU3RyUHJvY2VzcygpOwotCi0vLyBSb3V0aW5lIHRvIHNldCB0aGUgbWF4IG51bWJlciBvZiB3YXJuaW5ncyBmb3IgYSBwZXJ0aWN1bGFyIHNlY3Rpb24gCi0KLWV4dGVybiB2b2lkIGxlZnJTZXRBbnRlbm5hSW5vdXRXYXJuaW5ncyhpbnQgd2Fybik7Ci1leHRlcm4gdm9pZCBsZWZyU2V0QW50ZW5uYUlucHV0V2FybmluZ3MoaW50IHdhcm4pOwotZXh0ZXJuIHZvaWQgbGVmclNldEFudGVubmFPdXRwdXRXYXJuaW5ncyhpbnQgd2Fybik7Ci1leHRlcm4gdm9pZCBsZWZyU2V0QXJyYXlXYXJuaW5ncyhpbnQgd2Fybik7Ci1leHRlcm4gdm9pZCBsZWZyU2V0Q2FzZVNlbnNpdGl2ZVdhcm5pbmdzKGludCB3YXJuKTsKLWV4dGVybiB2b2lkIGxlZnJTZXRDb3JyZWN0aW9uVGFibGVXYXJuaW5ncyhpbnQgd2Fybik7Ci1leHRlcm4gdm9pZCBsZWZyU2V0RGllbGVjdHJpY1dhcm5pbmdzKGludCB3YXJuKTsKLWV4dGVybiB2b2lkIGxlZnJTZXRFZGdlUmF0ZVRocmVzaG9sZDFXYXJuaW5ncyhpbnQgd2Fybik7Ci1leHRlcm4gdm9pZCBsZWZyU2V0RWRnZVJhdGVUaHJlc2hvbGQyV2FybmluZ3MoaW50IHdhcm4pOwotZXh0ZXJuIHZvaWQgbGVmclNldEVkZ2VSYXRlU2NhbGVGYWN0b3JXYXJuaW5ncyhpbnQgd2Fybik7Ci1leHRlcm4gdm9pZCBsZWZyU2V0SW5vdXRBbnRlbm5hV2FybmluZ3MoaW50IHdhcm4pOwotZXh0ZXJuIHZvaWQgbGVmclNldElucHV0QW50ZW5uYVdhcm5pbmdzKGludCB3YXJuKTsKLWV4dGVybiB2b2lkIGxlZnJTZXRJUkRyb3BXYXJuaW5ncyhpbnQgd2Fybik7Ci1leHRlcm4gdm9pZCBsZWZyU2V0TGF5ZXJXYXJuaW5ncyhpbnQgd2Fybik7Ci1leHRlcm4gdm9pZCBsZWZyU2V0TWFjcm9XYXJuaW5ncyhpbnQgd2Fybik7Ci1leHRlcm4gdm9pZCBsZWZyU2V0TWF4U3RhY2tWaWFXYXJuaW5ncyhpbnQgd2Fybik7Ci1leHRlcm4gdm9pZCBsZWZyU2V0TWluRmVhdHVyZVdhcm5pbmdzKGludCB3YXJuKTsKLWV4dGVybiB2b2lkIGxlZnJTZXROb2lzZU1hcmdpbldhcm5pbmdzKGludCB3YXJuKTsKLWV4dGVybiB2b2lkIGxlZnJTZXROb2lzZVRhYmxlV2FybmluZ3MoaW50IHdhcm4pOwotZXh0ZXJuIHZvaWQgbGVmclNldE5vbkRlZmF1bHRXYXJuaW5ncyhpbnQgd2Fybik7Ci1leHRlcm4gdm9pZCBsZWZyU2V0Tm9XaXJlRXh0ZW5zaW9uV2FybmluZ3MoaW50IHdhcm4pOwotZXh0ZXJuIHZvaWQgbGVmclNldE91dHB1dEFudGVubmFXYXJuaW5ncyhpbnQgd2Fybik7Ci1leHRlcm4gdm9pZCBsZWZyU2V0UGluV2FybmluZ3MoaW50IHdhcm4pOwotZXh0ZXJuIHZvaWQgbGVmclNldFNpdGVXYXJuaW5ncyhpbnQgd2Fybik7Ci1leHRlcm4gdm9pZCBsZWZyU2V0U3BhY2luZ1dhcm5pbmdzKGludCB3YXJuKTsKLWV4dGVybiB2b2lkIGxlZnJTZXRUaW1pbmdXYXJuaW5ncyhpbnQgd2Fybik7Ci1leHRlcm4gdm9pZCBsZWZyU2V0VW5pdHNXYXJuaW5ncyhpbnQgd2Fybik7Ci1leHRlcm4gdm9pZCBsZWZyU2V0VXNlTWluU3BhY2luZ1dhcm5pbmdzKGludCB3YXJuKTsKLWV4dGVybiB2b2lkIGxlZnJTZXRWaWFSdWxlV2FybmluZ3MoaW50IHdhcm4pOwotZXh0ZXJuIHZvaWQgbGVmclNldFZpYVdhcm5pbmdzKGludCB3YXJuKTsKLQotLy8gSGFuZGxpbmcgb3V0cHV0IG1lc3NhZ2VzIAotZXh0ZXJuIHZvaWQgbGVmckRpc2FibGVQYXJzZXJNc2dzKGludCBuTXNnLCBpbnQqIG1zZ3MpOwotZXh0ZXJuIHZvaWQgbGVmckVuYWJsZVBhcnNlck1zZ3MoaW50IG5Nc2csIGludCogbXNncyk7Ci1leHRlcm4gdm9pZCBsZWZyRW5hYmxlQWxsTXNncygpOwotZXh0ZXJuIHZvaWQgbGVmckRpc2FibGVBbGxNc2dzKCk7Ci1leHRlcm4gdm9pZCBsZWZyU2V0VG90YWxNc2dMaW1pdChpbnQgdG90TnVtTXNncyk7Ci1leHRlcm4gdm9pZCBsZWZyU2V0TGltaXRQZXJNc2coaW50IG1zZ0lkLCBpbnQgbnVtTXNnKTsKLQotLy8gUmVnaXN0ZXIgbGVmNThUeXBlLWxheWVyVHlwZSBwYWlyLiAKLWV4dGVybiB2b2lkIGxlZnJSZWdpc3RlckxlZjU4VHlwZShjb25zdCBjaGFyICpsZWY1OFR5cGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxheWVyVHlwZSk7Ci0KLS8vIFJldHVybiBjb2RlcyBmb3IgdGhlIHVzZXIgY2FsbGJhY2tzLgotLy8gVGhlIHVzZXIgc2hvdWxkIHJldHVybiBvbmUgb2YgdGhlc2UgdmFsdWVzLgotI2RlZmluZSBQQVJTRV9PSyAwICAgICAgLy8gY29udGludWUgcGFyc2luZyAKLSNkZWZpbmUgU1RPUF9QQVJTRSAxICAgIC8vIHN0b3AgcGFyc2luZyB3aXRoIG5vIGVycm9yIG1lc3NhZ2UgCi0jZGVmaW5lIFBBUlNFX0VSUk9SIDIgICAvLyBzdG9wIHBhcnNpbmcsIHByaW50IGFuIGVycm9yIG1lc3NhZ2UKLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLVVTRV9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmclNldHRpbmdzLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmclNldHRpbmdzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZhMzFiYi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZnJTZXR0aW5ncy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NTIgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiAtIDIwMTcsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogYXJha2htYW4gJAotLy8gICRSZXZpc2lvbjogIzExICQKLS8vICAkRGF0ZTogMjAxMy8wNC8yMyAkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotCi0jaW5jbHVkZSAibGVmclNldHRpbmdzLmhwcCIKLSNpbmNsdWRlICJsZWYudGFiLmgiCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLWxlZnJTZXR0aW5ncyAqbGVmU2V0dGluZ3MgPSBOVUxMOwotCi1sZWZyU2V0dGluZ3M6OmxlZnJTZXR0aW5ncygpCi06IERpc1Byb3BTdHJQcm9jZXNzKDApLAotICBDYXNlU2Vuc2l0aXZlKEZBTFNFKSwKLSAgQ2FzZVNlbnNpdGl2ZVNldChGQUxTRSksCi0gIENvbW1lbnRDaGFyKCcjJyksCi0gIERlbHRhTnVtYmVyTGluZXMoMTAwMDApLAotICBBbnRlbm5hSW5vdXRXYXJuaW5ncyg5OTkpLAotICBBbnRlbm5hSW5wdXRXYXJuaW5ncyg5OTkpLAotICBBbnRlbm5hT3V0cHV0V2FybmluZ3MoOTk5KSwKLSAgQXJyYXlXYXJuaW5ncyg5OTkpLAotICBDYXNlU2Vuc2l0aXZlV2FybmluZ3MoOTk5KSwKLSAgQ29ycmVjdGlvblRhYmxlV2FybmluZ3MoOTk5KSwKLSAgRGllbGVjdHJpY1dhcm5pbmdzKDk5OSksCi0gIEVkZ2VSYXRlU2NhbGVGYWN0b3JXYXJuaW5ncyg5OTkpLAotICBFZGdlUmF0ZVRocmVzaG9sZDFXYXJuaW5ncyg5OTkpLAotICBFZGdlUmF0ZVRocmVzaG9sZDJXYXJuaW5ncyg5OTkpLAotICBFcnJvckxvZ0Z1bmN0aW9uKDApLAotICBGcmVlRnVuY3Rpb24oMCksCi0gIElSRHJvcFdhcm5pbmdzKDk5OSksCi0gIElub3V0QW50ZW5uYVdhcm5pbmdzKDk5OSksCi0gIElucHV0QW50ZW5uYVdhcm5pbmdzKDk5OSksCi0gIExheWVyV2FybmluZ3MoOTk5KSwKLSAgTGluZU51bWJlckZ1bmN0aW9uKDApLAotICBNYWNyb1dhcm5pbmdzKDk5OSksCi0gIE1hbGxvY0Z1bmN0aW9uKDApLAotICBNYXhTdGFja1ZpYVdhcm5pbmdzKDk5OSksCi0gIE1pbkZlYXR1cmVXYXJuaW5ncyg5OTkpLAotICBOb1dpcmVFeHRlbnNpb25XYXJuaW5ncyg5OTkpLAotICBOb2lzZU1hcmdpbldhcm5pbmdzKDk5OSksCi0gIE5vaXNlVGFibGVXYXJuaW5ncyg5OTkpLAotICBOb25EZWZhdWx0V2FybmluZ3MoOTk5KSwKLSAgT3V0cHV0QW50ZW5uYVdhcm5pbmdzKDk5OSksCi0gIFBpbldhcm5pbmdzKDk5OSksCi0gIFJlYWRGdW5jdGlvbigwKSwKLSAgUmVhZEVuY3J5cHRlZCgwKSwKLSAgUmVhbGxvY0Z1bmN0aW9uKDApLAotICBSZWdpc3RlclVudXNlZCgwKSwKLSAgUmVsYXhNb2RlKEZBTFNFKSwKLSAgU2hpZnRDYXNlKDApLAotICBTaXRlV2FybmluZ3MoOTk5KSwKLSAgU3BhY2luZ1dhcm5pbmdzKDk5OSksCi0gIFRpbWluZ1dhcm5pbmdzKDk5OSksCi0gIFVuaXRzV2FybmluZ3MoOTk5KSwKLSAgVXNlTWluU3BhY2luZ1dhcm5pbmdzKDk5OSksCi0gIFVzZXJEYXRhKE5VTEwpLAotICBWZXJzaW9uTnVtKDAuMCksCi0gIFZpYVJ1bGVXYXJuaW5ncyg5OTkpLAotICBWaWFXYXJuaW5ncyg5OTkpLAotICBMb2dGaWxlQXBwZW5kKDApLAotICBTZXRMb2dGdW5jdGlvbigwKSwKLSAgVG90YWxNc2dMaW1pdCgwKSwKLSAgV2FybmluZ0xvZ0Z1bmN0aW9uKDApLAotICBkQWxsTXNncygwKQotewotICAgIG1lbXNldChNc2dMaW1pdCwgMCwgTUFYX0xFRl9NU0dTICogc2l6ZW9mKGludCkpOwotICAgIGluaXRfc3ltYm9sX3RhYmxlKCk7Ci0KLSAgICAvLyBEZWZpbmUgTEVGNThfVFlQRSB2YWx1ZXMgYW5kIGRlcGVuZGVuY2VzIGhlcmU6Ci0KLSAgICAvLyBQb3B1bGFyIGxheWVyIGdyb3Vwcy4KLSAgICBjb25zdCBjaGFyICpwb2x5cm91dGluZ0xheWVyc1tdID0geyJST1VUSU5HIiwgIiJ9OwotICAgIGNvbnN0IGNoYXIgKm1pbWNhcExheWVyc1tdID0geyJST1VUSU5HIiwgIkNVVCIsICIifTsgICAgCi0gICAgY29uc3QgY2hhciAqdHN2TGF5ZXJzW10gPSB7IkNVVCIsICIifTsKLSAgICBjb25zdCBjaGFyICptYXN0ZXJzbGljZU9ubHlbXSA9IHsiTUFTVEVSU0xJQ0UiLCAiIn07Ci0gICAgY29uc3QgY2hhciAqd2VsbExheWVyc1tdID0geyJNQVNURVJTTElDRSIsICJPVkVSTEFQIiwgIiJ9OwotCi0gICAgLy8gUmVnaXN0ZXIgTEVGNTggdHlwZXMgYW5kIGFsbG93ZWQgbGF5ZXIgdHlwZXMgcGFpcnMuCi0gICAgYWRkTGVmNThUeXBlKCJQT0xZUk9VVElORyIsIHBvbHlyb3V0aW5nTGF5ZXJzKTsKLSAgICBhZGRMZWY1OFR5cGUoIk1JTUNBUCIsIG1pbWNhcExheWVycyk7Ci0gICAgYWRkTGVmNThUeXBlKCJUU1YiLCB0c3ZMYXllcnMpOwotICAgIGFkZExlZjU4VHlwZSgiUEFTU0lWQVRJT04iLCB0c3ZMYXllcnMpOwotICAgIGFkZExlZjU4VHlwZSgiVFJJTVBPTFkiLCBtYXN0ZXJzbGljZU9ubHkpOwotICAgIGFkZExlZjU4VHlwZSgiTldFTEwiLCB3ZWxsTGF5ZXJzKTsKLSAgICBhZGRMZWY1OFR5cGUoIlBXRUxMIiwgd2VsbExheWVycyk7Ci0gICAgYWRkTGVmNThUeXBlKCJCRUxPV0RJRUVER0UiLCB3ZWxsTGF5ZXJzKTsKLSAgICBhZGRMZWY1OFR5cGUoIkFCT1ZFRElFRURHRSIsIHdlbGxMYXllcnMpOwotICAgIGFkZExlZjU4VHlwZSgiRElGRlVTSU9OIiwgd2VsbExheWVycyk7Ci0gICAgYWRkTGVmNThUeXBlKCJUUklNTUVUQUwiLCB3ZWxsTGF5ZXJzKTsKLSAgICBhZGRMZWY1OFR5cGUoIk1FT0wiLCBtYXN0ZXJzbGljZU9ubHkpOwotfQotCi0KLXZvaWQKLWxlZnJTZXR0aW5nczo6cmVzZXQoKQotewotICAgIGlmIChsZWZTZXR0aW5ncykgewotICAgICAgICBkZWxldGUgbGVmU2V0dGluZ3M7Ci0gICAgfQotCi0gICAgbGVmU2V0dGluZ3MgPSBuZXcgbGVmclNldHRpbmdzKCk7Ci19Ci0KLQotdm9pZAotbGVmclNldHRpbmdzOjppbml0X3N5bWJvbF90YWJsZSgpCi17Ci0gICAgS2V5d29yZF9zZXRbIiZERUZJTkUiXSA9IEtfREVGSU5FOwotICAgIEtleXdvcmRfc2V0WyImREVGSU5FQiJdID0gS19ERUZJTkVCOwotICAgIEtleXdvcmRfc2V0WyImREVGSU5FUyJdID0gS19ERUZJTkVTOwotICAgIEtleXdvcmRfc2V0WyImTUVTU0FHRSJdID0gS19NRVNTQUdFOwotICAgIEtleXdvcmRfc2V0WyImQ1JFQVRFRklMRSJdID0gS19DUkVBVEVGSUxFOwotICAgIEtleXdvcmRfc2V0WyImT1BFTkZJTEUiXSA9IEtfT1BFTkZJTEU7Ci0gICAgS2V5d29yZF9zZXRbIiZDTE9TRUZJTEUiXSA9IEtfQ0xPU0VGSUxFOwotICAgIEtleXdvcmRfc2V0WyImV0FSTklORyJdID0gS19XQVJOSU5HOwotICAgIEtleXdvcmRfc2V0WyImRVJST1IiXSA9IEtfRVJST1I7Ci0gICAgS2V5d29yZF9zZXRbIiZGQVRBTEVSUk9SIl0gPSBLX0ZBVEFMRVJST1I7Ci0gICAgS2V5d29yZF9zZXRbIm5hbWVzY2FzZXNlbnNpdGl2ZSJdID0gS19OQU1FU0NBU0VTRU5TSVRJVkU7Ci0gICAgS2V5d29yZF9zZXRbIm9mZiJdID0gS19PRkY7Ci0gICAgS2V5d29yZF9zZXRbIm9uIl0gPSBLX09OOwotICAgIEtleXdvcmRfc2V0WyJBQk9WRSJdID0gS19BQk9WRTsKLSAgICBLZXl3b3JkX3NldFsiQUJVVCJdID0gS19BQlVUOwotICAgIEtleXdvcmRfc2V0WyJBQlVUTUVOVCJdID0gS19BQlVUTUVOVDsKLSAgICBLZXl3b3JkX3NldFsiQUNDVVJSRU5UREVOU0lUWSJdID0gS19BQ0NVUlJFTlRERU5TSVRZOwotICAgIEtleXdvcmRfc2V0WyJBQ1RJVkUiXSA9IEtfQUNUSVZFOwotICAgIEtleXdvcmRfc2V0WyJBREpBQ0VOVENVVFMiXSA9IEtfQURKQUNFTlRDVVRTOwotICAgIEtleXdvcmRfc2V0WyJBTkFMT0ciXSA9IEtfQU5BTE9HOwotICAgIEtleXdvcmRfc2V0WyJBTkQiXSA9IEtfQU5EOwotICAgIEtleXdvcmRfc2V0WyJBTlRFTk5BQVJFQUZBQ1RPUiJdID0gS19BTlRFTk5BQVJFQUZBQ1RPUjsKLSAgICBLZXl3b3JkX3NldFsiQU5URU5OQUFSRUFESUZGUkVEVUNFUFdMIl0gPSBLX0FOVEVOTkFBUkVBRElGRlJFRFVDRVBXTDsKLSAgICBLZXl3b3JkX3NldFsiQU5URU5OQUFSRUFNSU5VU0RJRkYiXSA9IEtfQU5URU5OQUFSRUFNSU5VU0RJRkY7Ci0gICAgS2V5d29yZF9zZXRbIkFOVEVOTkFBUkVBUkFUSU8iXSA9IEtfQU5URU5OQUFSRUFSQVRJTzsKLSAgICBLZXl3b3JkX3NldFsiQU5URU5OQUNFTEwiXSA9IEtfQU5URU5OQUNFTEw7Ci0gICAgS2V5d29yZF9zZXRbIkFOVEVOTkFDVU1BUkVBUkFUSU8iXSA9IEtfQU5URU5OQUNVTUFSRUFSQVRJTzsKLSAgICBLZXl3b3JkX3NldFsiQU5URU5OQUNVTURJRkZBUkVBUkFUSU8iXSA9IEtfQU5URU5OQUNVTURJRkZBUkVBUkFUSU87Ci0gICAgS2V5d29yZF9zZXRbIkFOVEVOTkFDVU1ESUZGU0lERUFSRUFSQVRJTyJdID0gS19BTlRFTk5BQ1VNRElGRlNJREVBUkVBUkFUSU87Ci0gICAgS2V5d29yZF9zZXRbIkFOVEVOTkFDVU1ST1VUSU5HUExVU0NVVCJdID0gS19BTlRFTk5BQ1VNUk9VVElOR1BMVVNDVVQ7Ci0gICAgS2V5d29yZF9zZXRbIkFOVEVOTkFDVU1TSURFQVJFQVJBVElPIl0gPSBLX0FOVEVOTkFDVU1TSURFQVJFQVJBVElPOwotICAgIEtleXdvcmRfc2V0WyJBTlRFTk5BRElGRkFSRUEiXSA9IEtfQU5URU5OQURJRkZBUkVBOwotICAgIEtleXdvcmRfc2V0WyJBTlRFTk5BRElGRkFSRUFSQVRJTyJdID0gS19BTlRFTk5BRElGRkFSRUFSQVRJTzsKLSAgICBLZXl3b3JkX3NldFsiQU5URU5OQURJRkZTSURFQVJFQVJBVElPIl0gPSBLX0FOVEVOTkFESUZGU0lERUFSRUFSQVRJTzsKLSAgICBLZXl3b3JkX3NldFsiQU5URU5OQUdBVEVBUkVBIl0gPSBLX0FOVEVOTkFHQVRFQVJFQTsKLSAgICBLZXl3b3JkX3NldFsiQU5URU5OQUdBVEVQTFVTRElGRiJdID0gS19BTlRFTk5BR0FURVBMVVNESUZGOwotICAgIEtleXdvcmRfc2V0WyJBTlRFTk5BSU5PVVRESUZGQVJFQSJdID0gS19BTlRFTk5BSU5PVVRESUZGQVJFQTsKLSAgICBLZXl3b3JkX3NldFsiQU5URU5OQUlOUFVUR0FURUFSRUEiXSA9IEtfQU5URU5OQUlOUFVUR0FURUFSRUE7Ci0gICAgS2V5d29yZF9zZXRbIkFOVEVOTkFMRU5HVEhGQUNUT1IiXSA9IEtfQU5URU5OQUxFTkdUSEZBQ1RPUjsKLSAgICBLZXl3b3JkX3NldFsiQU5URU5OQU1BWEFSRUFDQVIiXSA9IEtfQU5URU5OQU1BWEFSRUFDQVI7Ci0gICAgS2V5d29yZF9zZXRbIkFOVEVOTkFNQVhDVVRDQVIiXSA9IEtfQU5URU5OQU1BWENVVENBUjsKLSAgICBLZXl3b3JkX3NldFsiQU5URU5OQU1BWFNJREVBUkVBQ0FSIl0gPSBLX0FOVEVOTkFNQVhTSURFQVJFQUNBUjsKLSAgICBLZXl3b3JkX3NldFsiQU5URU5OQU1FVEFMQVJFQSJdID0gS19BTlRFTk5BTUVUQUxBUkVBOwotICAgIEtleXdvcmRfc2V0WyJBTlRFTk5BTUVUQUxMRU5HVEgiXSA9IEtfQU5URU5OQU1FVEFMTEVOR1RIOwotICAgIEtleXdvcmRfc2V0WyJBTlRFTk5BTU9ERUwiXSA9IEtfQU5URU5OQU1PREVMOwotICAgIEtleXdvcmRfc2V0WyJBTlRFTk5BT1VUUFVURElGRkFSRUEiXSA9IEtfQU5URU5OQU9VVFBVVERJRkZBUkVBOwotICAgIEtleXdvcmRfc2V0WyJBTlRFTk5BUEFSVElBTENVVEFSRUEiXSA9IEtfQU5URU5OQVBBUlRJQUxDVVRBUkVBOwotICAgIEtleXdvcmRfc2V0WyJBTlRFTk5BUEFSVElBTE1FVEFMQVJFQSJdID0gS19BTlRFTk5BUEFSVElBTE1FVEFMQVJFQTsKLSAgICBLZXl3b3JkX3NldFsiQU5URU5OQVBBUlRJQUxNRVRBTFNJREVBUkVBIl0gPSBLX0FOVEVOTkFQQVJUSUFMTUVUQUxTSURFQVJFQTsKLSAgICBLZXl3b3JkX3NldFsiQU5URU5OQVNJREVBUkVBUkFUSU8iXSA9IEtfQU5URU5OQVNJREVBUkVBUkFUSU87Ci0gICAgS2V5d29yZF9zZXRbIkFOVEVOTkFTSVpFIl0gPSBLX0FOVEVOTkFTSVpFOwotICAgIEtleXdvcmRfc2V0WyJBTlRFTk5BU0lERUFSRUFGQUNUT1IiXSA9IEtfQU5URU5OQVNJREVBUkVBRkFDVE9SOwotICAgIEtleXdvcmRfc2V0WyJBTllFREdFIl0gPSBLX0FOWUVER0U7Ci0gICAgS2V5d29yZF9zZXRbIkFSRUEiXSA9IEtfQVJFQTsKLSAgICBLZXl3b3JkX3NldFsiQVJFQUlPIl0gPSBLX0FSRUFJTzsKLSAgICBLZXl3b3JkX3NldFsiQVJSQVkiXSA9IEtfQVJSQVk7Ci0gICAgS2V5d29yZF9zZXRbIkFSUkFZQ1VUUyJdID0gS19BUlJBWUNVVFM7Ci0gICAgS2V5d29yZF9zZXRbIkFSUkFZU1BBQ0lORyJdID0gS19BUlJBWVNQQUNJTkc7Ci0gICAgS2V5d29yZF9zZXRbIkFWRVJBR0UiXSA9IEtfQVZFUkFHRTsKLSAgICBLZXl3b3JkX3NldFsiQkVMT1ciXSA9IEtfQkVMT1c7Ci0gICAgS2V5d29yZF9zZXRbIkJFR0lORVhUIl0gPSBLX0JFR0lORVhUOwotICAgIEtleXdvcmRfc2V0WyJCTEFDS0JPWCJdID0gS19CTEFDS0JPWDsKLSAgICBLZXl3b3JkX3NldFsiQkxPQ0siXSA9IEtfQkxPQ0s7Ci0gICAgS2V5d29yZF9zZXRbIkJPVFRPTUxFRlQiXSA9IEtfQk9UVE9NTEVGVDsKLSAgICBLZXl3b3JkX3NldFsiQk9UVE9NUklHSFQiXSA9IEtfQk9UVE9NUklHSFQ7Ci0gICAgS2V5d29yZF9zZXRbIkJVTVAiXSA9IEtfQlVNUDsKLSAgICBLZXl3b3JkX3NldFsiQlVTQklUQ0hBUlMiXSA9IEtfQlVTQklUQ0hBUlM7Ci0gICAgS2V5d29yZF9zZXRbIkJVRkZFUiJdID0gS19CVUZGRVI7Ci0gICAgS2V5d29yZF9zZXRbIkJZIl0gPSBLX0JZOwotICAgIEtleXdvcmRfc2V0WyJDQU5OT1RPQ0NVUFkiXSA9IEtfQ0FOTk9UT0NDVVBZOwotICAgIEtleXdvcmRfc2V0WyJDQU5QTEFDRSJdID0gS19DQU5QTEFDRTsKLSAgICBLZXl3b3JkX3NldFsiQ0FQQUNJVEFOQ0UiXSA9IEtfQ0FQQUNJVEFOQ0U7Ci0gICAgS2V5d29yZF9zZXRbIkNBUE1VTFRJUExJRVIiXSA9IEtfQ0FQTVVMVElQTElFUjsKLSAgICBLZXl3b3JkX3NldFsiQ0VOVEVSVE9DRU5URVIiXSA9IEtfQ0VOVEVSVE9DRU5URVI7Ci0gICAgS2V5d29yZF9zZXRbIkNMQVNTIl0gPSBLX0NMQVNTOwotICAgIEtleXdvcmRfc2V0WyJDTEVBUkFOQ0VNRUFTVVJFIl0gPSBLX0NMRUFSQU5DRU1FQVNVUkU7Ci0gICAgS2V5d29yZF9zZXRbIkNMT0NLIl0gPSBLX0NMT0NLOwotICAgIEtleXdvcmRfc2V0WyJDTE9DS1RZUEUiXSA9IEtfQ0xPQ0tUWVBFOwotICAgIEtleXdvcmRfc2V0WyJDT0xVTU5NQUpPUiJdID0gS19DT0xVTU5NQUpPUjsKLSAgICBLZXl3b3JkX3NldFsiQ1VSUkVOVERFTiJdID0gS19DVVJSRU5UREVOOwotICAgIEtleXdvcmRfc2V0WyJDT01QT05FTlRQSU4iXSA9IEtfQ09NUE9ORU5UUElOOwotICAgIEtleXdvcmRfc2V0WyJDT1JFIl0gPSBLX0NPUkU7Ci0gICAgS2V5d29yZF9zZXRbIkNPUk5FUiJdID0gS19DT1JORVI7Ci0gICAgS2V5d29yZF9zZXRbIkNPUlJFQ1RJT05GQUNUT1IiXSA9IEtfQ09SUkVDVElPTkZBQ1RPUjsKLSAgICBLZXl3b3JkX3NldFsiQ09SUkVDVElPTlRBQkxFIl0gPSBLX0NPUlJFQ1RJT05UQUJMRTsKLSAgICBLZXl3b3JkX3NldFsiQ09WRVIiXSA9IEtfQ09WRVI7Ci0gICAgS2V5d29yZF9zZXRbIkNQRVJTUURJU1QiXSA9IEtfQ1BFUlNRRElTVDsKLSAgICBLZXl3b3JkX3NldFsiQ1VSUkVOVCJdID0gS19DVVJSRU5UOwotICAgIEtleXdvcmRfc2V0WyJDVVJSRU5UU09VUkNFIl0gPSBLX0NVUlJFTlRTT1VSQ0U7Ci0gICAgS2V5d29yZF9zZXRbIkNVVCJdID0gS19DVVQ7Ci0gICAgS2V5d29yZF9zZXRbIkNVVEFSRUEiXSA9IEtfQ1VUQVJFQTsKLSAgICBLZXl3b3JkX3NldFsiQ1VUU0laRSJdID0gS19DVVRTSVpFOwotICAgIEtleXdvcmRfc2V0WyJDVVRTUEFDSU5HIl0gPSBLX0NVVFNQQUNJTkc7Ci0gICAgS2V5d29yZF9zZXRbIkRBVEEiXSA9IEtfREFUQTsKLSAgICBLZXl3b3JkX3NldFsiREFUQUJBU0UiXSA9IEtfREFUQUJBU0U7Ci0gICAgS2V5d29yZF9zZXRbIkRDQ1VSUkVOVERFTlNJVFkiXSA9IEtfRENDVVJSRU5UREVOU0lUWTsKLSAgICBLZXl3b3JkX3NldFsiREVGQVVMVCJdID0gS19ERUZBVUxUOwotICAgIEtleXdvcmRfc2V0WyJERUZBVUxUQ0FQIl0gPSBLX0RFRkFVTFRDQVA7Ci0gICAgS2V5d29yZF9zZXRbIkRFTEFZIl0gPSBLX0RFTEFZOwotICAgIEtleXdvcmRfc2V0WyJERU5TSVRZIl0gPSBLX0RFTlNJVFk7Ci0gICAgS2V5d29yZF9zZXRbIkRFTlNJVFlDSEVDS1NURVAiXSA9IEtfREVOU0lUWUNIRUNLU1RFUDsKLSAgICBLZXl3b3JkX3NldFsiREVOU0lUWUNIRUNLV0lORE9XIl0gPSBLX0RFTlNJVFlDSEVDS1dJTkRPVzsKLSAgICBLZXl3b3JkX3NldFsiREVTSUdOUlVMRVdJRFRIIl0gPSBLX0RFU0lHTlJVTEVXSURUSDsKLSAgICBLZXl3b3JkX3NldFsiRElBRzQ1Il0gPSBLX0RJQUc0NTsKLSAgICBLZXl3b3JkX3NldFsiRElBRzEzNSJdID0gS19ESUFHMTM1OwotICAgIEtleXdvcmRfc2V0WyJESUFHTUlORURHRUxFTkdUSCJdID0gS19ESUFHTUlORURHRUxFTkdUSDsKLSAgICBLZXl3b3JkX3NldFsiRElBR1NQQUNJTkciXSA9IEtfRElBR1NQQUNJTkc7Ci0gICAgS2V5d29yZF9zZXRbIkRJQUdQSVRDSCJdID0gS19ESUFHUElUQ0g7Ci0gICAgS2V5d29yZF9zZXRbIkRJQUdXSURUSCJdID0gS19ESUFHV0lEVEg7Ci0gICAgS2V5d29yZF9zZXRbIkRJRUxFQ1RSSUMiXSA9IEtfRElFTEVDVFJJQzsKLSAgICBLZXl3b3JkX3NldFsiRElGRlVTRU9OTFkiXSA9IEtfRElGRlVTRU9OTFk7Ci0gICAgS2V5d29yZF9zZXRbIkRJUkVDVElPTiJdID0gS19ESVJFQ1RJT047Ci0gICAgS2V5d29yZF9zZXRbIkRJVklERVJDSEFSIl0gPSBLX0RJVklERVJDSEFSOwotICAgIEtleXdvcmRfc2V0WyJETyJdID0gS19ETzsKLSAgICBLZXl3b3JkX3NldFsiRSJdID0gS19FOwotICAgIEtleXdvcmRfc2V0WyJFREdFQ0FQQUNJVEFOQ0UiXSA9IEtfRURHRUNBUEFDSVRBTkNFOwotICAgIEtleXdvcmRfc2V0WyJFREdFUkFURSJdID0gS19FREdFUkFURTsKLSAgICBLZXl3b3JkX3NldFsiRURHRVJBVEVTQ0FMRUZBQ1RPUiJdID0gS19FREdFUkFURVNDQUxFRkFDVE9SOwotICAgIEtleXdvcmRfc2V0WyJFREdFUkFURVRIUkVTSE9MRDEiXSA9IEtfRURHRVJBVEVUSFJFU0hPTEQxOwotICAgIEtleXdvcmRfc2V0WyJFREdFUkFURVRIUkVTSE9MRDIiXSA9IEtfRURHRVJBVEVUSFJFU0hPTEQyOwotICAgIEtleXdvcmRfc2V0WyJFRVEiXSA9IEtfRUVROwotICAgIEtleXdvcmRfc2V0WyJFTFNFIl0gPSBLX0VMU0U7Ci0gICAgS2V5d29yZF9zZXRbIkVOQ0xPU1VSRSJdID0gS19FTkNMT1NVUkU7Ci0gICAgS2V5d29yZF9zZXRbIkVORCJdID0gS19FTkQ7Ci0gICAgS2V5d29yZF9zZXRbIkVOREVYVCJdID0gS19FTkRFWFQ7Ci0gICAgS2V5d29yZF9zZXRbIkVORENBUCJdID0gS19FTkRDQVA7Ci0gICAgS2V5d29yZF9zZXRbIkVORE9GTElORSJdID0gS19FTkRPRkxJTkU7Ci0gICAgS2V5d29yZF9zZXRbIkVORE9GTk9UQ0hXSURUSCJdID0gS19FTkRPRk5PVENIV0lEVEg7Ci0gICAgS2V5d29yZF9zZXRbIkVVQ0xJREVBTiJdID0gS19FVUNMSURFQU47Ci0gICAgS2V5d29yZF9zZXRbIkVYQ0VQVEVYVFJBQ1VUIl0gPSBLX0VYQ0VQVEVYVFJBQ1VUOwotICAgIEtleXdvcmRfc2V0WyJFWENFUFRTQU1FUEdORVQiXSA9IEtfRVhDRVBUU0FNRVBHTkVUOwotICAgIEtleXdvcmRfc2V0WyJFWENFUFRQR05FVCJdID0gS19FWENFUFRQR05FVDsKLSAgICBLZXl3b3JkX3NldFsiRVhURU5TSU9OIl0gPSBLX0VYVEVOU0lPTjsKLSAgICBLZXl3b3JkX3NldFsiRkFMTCJdID0gS19GQUxMOwotICAgIEtleXdvcmRfc2V0WyJGQUxMQ1MiXSA9IEtfRkFMTENTOwotICAgIEtleXdvcmRfc2V0WyJGQUxMUlMiXSA9IEtfRkFMTFJTOwotICAgIEtleXdvcmRfc2V0WyJGQUxMU0FUQ1VSIl0gPSBLX0ZBTExTQVRDVVI7Ci0gICAgS2V5d29yZF9zZXRbIkZBTExTQVRUMSJdID0gS19GQUxMU0FUVDE7Ci0gICAgS2V5d29yZF9zZXRbIkZBTExTTEVXTElNSVQiXSA9IEtfRkFMTFNMRVdMSU1JVDsKLSAgICBLZXl3b3JkX3NldFsiRkFMTFQwIl0gPSBLX0ZBTExUMDsKLSAgICBLZXl3b3JkX3NldFsiRkFMTFRIUkVTSCJdID0gS19GQUxMVEhSRVNIOwotICAgIEtleXdvcmRfc2V0WyJGQUxMVk9MVEFHRVRIUkVTSE9MRCJdID0gS19GQUxMVk9MVEFHRVRIUkVTSE9MRDsKLSAgICBLZXl3b3JkX3NldFsiRkFMU0UiXSA9IEtfRkFMU0U7Ci0gICAgS2V5d29yZF9zZXRbIkZFIl0gPSBLX0ZFOwotICAgIEtleXdvcmRfc2V0WyJGRUVEVEhSVSJdID0gS19GRUVEVEhSVTsKLSAgICBLZXl3b3JkX3NldFsiRklMTEFDVElWRVNQQUNJTkciXSA9IEtfRklMTEFDVElWRVNQQUNJTkc7Ci0gICAgS2V5d29yZF9zZXRbIkZJWEVEIl0gPSBLX0ZJWEVEOwotICAgIEtleXdvcmRfc2V0WyJGSVhFRE1BU0siXSA9IEtfRklYRURNQVNLOwotICAgIEtleXdvcmRfc2V0WyJGTElQIl0gPSBLX0ZMSVA7Ci0gICAgS2V5d29yZF9zZXRbIkZMT09SUExBTiJdID0gS19GTE9PUlBMQU47Ci0gICAgS2V5d29yZF9zZXRbIkZOIl0gPSBLX0ZOOwotICAgIEtleXdvcmRfc2V0WyJGT1JFSUdOIl0gPSBLX0ZPUkVJR047Ci0gICAgS2V5d29yZF9zZXRbIkZSRVFVRU5DWSJdID0gS19GUkVRVUVOQ1k7Ci0gICAgS2V5d29yZF9zZXRbIkZST01BQk9WRSJdID0gS19GUk9NQUJPVkU7Ci0gICAgS2V5d29yZF9zZXRbIkZST01CRUxPVyJdID0gS19GUk9NQkVMT1c7Ci0gICAgS2V5d29yZF9zZXRbIkZST01QSU4iXSA9IEtfRlJPTVBJTjsKLSAgICBLZXl3b3JkX3NldFsiRlVOQ1RJT04iXSA9IEtfRlVOQ1RJT047Ci0gICAgS2V5d29yZF9zZXRbIkZTIl0gPSBLX0ZTOwotICAgIEtleXdvcmRfc2V0WyJGVyJdID0gS19GVzsKLSAgICBLZXl3b3JkX3NldFsiR0NFTExHUklEIl0gPSBLX0dDRUxMR1JJRDsKLSAgICBLZXl3b3JkX3NldFsiR0VORVJBVEUiXSA9IEtfR0VORVJBVEU7Ci0gICAgS2V5d29yZF9zZXRbIkdFTkVSQVRFRCJdID0gS19HRU5FUkFURUQ7Ci0gICAgS2V5d29yZF9zZXRbIkdFTkVSQVRPUiJdID0gS19HRU5FUkFUT1I7Ci0gICAgS2V5d29yZF9zZXRbIkdST1VORCJdID0gS19HUk9VTkQ7Ci0gICAgS2V5d29yZF9zZXRbIkdST1VORFNFTlNJVElWSVRZIl0gPSBLX0dST1VORFNFTlNJVElWSVRZOwotICAgIEtleXdvcmRfc2V0WyJIQVJEU1BBQ0lORyJdID0gS19IQVJEU1BBQ0lORzsKLSAgICBLZXl3b3JkX3NldFsiSEVJR0hUIl0gPSBLX0hFSUdIVDsKLSAgICBLZXl3b3JkX3NldFsiSElTVE9SWSJdID0gS19ISVNUT1JZOwotICAgIEtleXdvcmRfc2V0WyJIT0xEIl0gPSBLX0hPTEQ7Ci0gICAgS2V5d29yZF9zZXRbIkhPUklaT05UQUwiXSA9IEtfSE9SSVpPTlRBTDsKLSAgICBLZXl3b3JkX3NldFsiSUYiXSA9IEtfSUY7Ci0gICAgS2V5d29yZF9zZXRbIklNUExBTlQiXSA9IEtfSU1QTEFOVDsKLSAgICBLZXl3b3JkX3NldFsiSU5GTFVFTkNFIl0gPSBLX0lORkxVRU5DRTsKLSAgICBLZXl3b3JkX3NldFsiSU5PVVQiXSA9IEtfSU5PVVQ7Ci0gICAgS2V5d29yZF9zZXRbIklOT1VUUElOQU5URU5OQVNJWkUiXSA9IEtfSU5PVVRQSU5BTlRFTk5BU0laRTsKLSAgICBLZXl3b3JkX3NldFsiSU5QVVQiXSA9IEtfSU5QVVQ7Ci0gICAgS2V5d29yZF9zZXRbIklOUFVUUElOQU5URU5OQVNJWkUiXSA9IEtfSU5QVVRQSU5BTlRFTk5BU0laRTsKLSAgICBLZXl3b3JkX3NldFsiSU5QVVROT0lTRU1BUkdJTiJdID0gS19JTlBVVE5PSVNFTUFSR0lOOwotICAgIEtleXdvcmRfc2V0WyJJTlNJREVDT1JORVIiXSA9IEtfSU5TSURFQ09STkVSOwotICAgIEtleXdvcmRfc2V0WyJJTlRFR0VSIl0gPSBLX0lOVEVHRVI7Ci0gICAgS2V5d29yZF9zZXRbIklOVFJJTlNJQyJdID0gS19JTlRSSU5TSUM7Ci0gICAgS2V5d29yZF9zZXRbIklOVkVSVCJdID0gS19JTlZFUlQ7Ci0gICAgS2V5d29yZF9zZXRbIklOVkVSVEVSIl0gPSBLX0lOVkVSVEVSOwotICAgIEtleXdvcmRfc2V0WyJJUkRST1AiXSA9IEtfSVJEUk9QOwotICAgIEtleXdvcmRfc2V0WyJJVEVSQVRFIl0gPSBLX0lURVJBVEU7Ci0gICAgS2V5d29yZF9zZXRbIklWX1RBQkxFUyJdID0gS19JVl9UQUJMRVM7Ci0gICAgS2V5d29yZF9zZXRbIkxBWUVSIl0gPSBLX0xBWUVSOwotICAgIEtleXdvcmRfc2V0WyJMQVlFUlMiXSA9IEtfTEFZRVJTOwotICAgIEtleXdvcmRfc2V0WyJMRUFLQUdFIl0gPSBLX0xFQUtBR0U7Ci0gICAgS2V5d29yZF9zZXRbIkxFTkdUSCJdID0gS19MRU5HVEg7Ci0gICAgS2V5d29yZF9zZXRbIkxFTkdUSFNVTSJdID0gS19MRU5HVEhTVU07Ci0gICAgS2V5d29yZF9zZXRbIkxFTkdUSFRIUkVTSE9MRCJdID0gS19MRU5HVEhUSFJFU0hPTEQ7Ci0gICAgS2V5d29yZF9zZXRbIkxFUSJdID0gS19MRVE7Ci0gICAgS2V5d29yZF9zZXRbIkxJQlJBUlkiXSA9IEtfTElCUkFSWTsKLSAgICBLZXl3b3JkX3NldFsiTE9OR0FSUkFZIl0gPSBLX0xPTkdBUlJBWTsKLSAgICBLZXl3b3JkX3NldFsiTUFDUk8iXSA9IEtfTUFDUk87Ci0gICAgS2V5d29yZF9zZXRbIk1BTlVGQUNUVVJJTkdHUklEIl0gPSBLX01BTlVGQUNUVVJJTkdHUklEOwotICAgIEtleXdvcmRfc2V0WyJNQVNURVJTTElDRSJdID0gS19NQVNURVJTTElDRTsKLSAgICBLZXl3b3JkX3NldFsiTUFTSyJdID0gS19NQVNLOwotICAgIEtleXdvcmRfc2V0WyJNQVRDSCJdID0gS19NQVRDSDsKLSAgICBLZXl3b3JkX3NldFsiTUFYQURKQUNFTlRTTE9UU1BBQ0lORyJdID0gS19NQVhBREpBQ0VOVFNMT1RTUEFDSU5HOwotICAgIEtleXdvcmRfc2V0WyJNQVhDT0FYSUFMU0xPVFNQQUNJTkciXSA9IEtfTUFYQ09BWElBTFNMT1RTUEFDSU5HOwotICAgIEtleXdvcmRfc2V0WyJNQVhERUxBWSJdID0gS19NQVhERUxBWTsKLSAgICBLZXl3b3JkX3NldFsiTUFYRURHRVMiXSA9IEtfTUFYRURHRVM7Ci0gICAgS2V5d29yZF9zZXRbIk1BWEVER0VTTE9UU1BBQ0lORyJdID0gS19NQVhFREdFU0xPVFNQQUNJTkc7Ci0gICAgS2V5d29yZF9zZXRbIk1BWExPQUQiXSA9IEtfTUFYTE9BRDsKLSAgICBLZXl3b3JkX3NldFsiTUFYSU1VTURFTlNJVFkiXSA9IEtfTUFYSU1VTURFTlNJVFk7Ci0gICAgS2V5d29yZF9zZXRbIk1BWFZJQVNUQUNLIl0gPSBLX01BWFZJQVNUQUNLOwotICAgIEtleXdvcmRfc2V0WyJNQVhXSURUSCJdID0gS19NQVhXSURUSDsKLSAgICBLZXl3b3JkX3NldFsiTUFYWFkiXSA9IEtfTUFYWFk7Ci0gICAgS2V5d29yZF9zZXRbIk1FR0FIRVJUWiJdID0gS19NRUdBSEVSVFo7Ci0gICAgS2V5d29yZF9zZXRbIk1FVEFMT1ZFUkhBTkciXSA9IEtfTUVUQUxPVkVSSEFORzsKLSAgICBLZXl3b3JkX3NldFsiTUlDUk9OUyJdID0gS19NSUNST05TOwotICAgIEtleXdvcmRfc2V0WyJNSUxMSUFNUFMiXSA9IEtfTUlMTElBTVBTOwotICAgIEtleXdvcmRfc2V0WyJNSUxMSVdBVFRTIl0gPSBLX01JTExJV0FUVFM7Ci0gICAgS2V5d29yZF9zZXRbIk1JTkNVVFMiXSA9IEtfTUlOQ1VUUzsKLSAgICBLZXl3b3JkX3NldFsiTUlORU5DTE9TRURBUkVBIl0gPSBLX01JTkVOQ0xPU0VEQVJFQTsKLSAgICBLZXl3b3JkX3NldFsiTUlORkVBVFVSRSJdID0gS19NSU5GRUFUVVJFOwotICAgIEtleXdvcmRfc2V0WyJNSU5JTVVNQ1VUIl0gPSBLX01JTklNVU1DVVQ7Ci0gICAgS2V5d29yZF9zZXRbIk1JTklNVU1ERU5TSVRZIl0gPSBLX01JTklNVU1ERU5TSVRZOwotICAgIEtleXdvcmRfc2V0WyJNSU5QSU5TIl0gPSBLX01JTlBJTlM7Ci0gICAgS2V5d29yZF9zZXRbIk1JTlNJWkUiXSA9IEtfTUlOU0laRTsKLSAgICBLZXl3b3JkX3NldFsiTUlOU1RFUCJdID0gS19NSU5TVEVQOwotICAgIEtleXdvcmRfc2V0WyJNSU5XSURUSCJdID0gS19NSU5XSURUSDsKLSAgICBLZXl3b3JkX3NldFsiTVBXSCJdID0gS19NUFdIOwotICAgIEtleXdvcmRfc2V0WyJNUFdMIl0gPSBLX01QV0w7Ci0gICAgS2V5d29yZF9zZXRbIk1VU1RKT0lOIl0gPSBLX01VU1RKT0lOOwotICAgIEtleXdvcmRfc2V0WyJNWCJdID0gS19NWDsKLSAgICBLZXl3b3JkX3NldFsiTVkiXSA9IEtfTVk7Ci0gICAgS2V5d29yZF9zZXRbIk1YUjkwIl0gPSBLX01YUjkwOwotICAgIEtleXdvcmRfc2V0WyJNWVI5MCJdID0gS19NWVI5MDsKLSAgICBLZXl3b3JkX3NldFsiTiJdID0gS19OOwotICAgIEtleXdvcmRfc2V0WyJOQU1FTUFQU1RSSU5HIl0gPSBLX05BTUVNQVBTVFJJTkc7Ci0gICAgS2V5d29yZF9zZXRbIk5BTUVTQ0FTRVNFTlNJVElWRSJdID0gS19OQU1FU0NBU0VTRU5TSVRJVkU7Ci0gICAgS2V5d29yZF9zZXRbIk5BTk9TRUNPTkRTIl0gPSBLX05BTk9TRUNPTkRTOwotICAgIEtleXdvcmRfc2V0WyJORUdFREdFIl0gPSBLX05FR0VER0U7Ci0gICAgS2V5d29yZF9zZXRbIk5FVEVYUFIiXSA9IEtfTkVURVhQUjsKLSAgICBLZXl3b3JkX3NldFsiTkVUUyJdID0gS19ORVRTOwotICAgIEtleXdvcmRfc2V0WyJORVciXSA9IEtfTkVXOwotICAgIEtleXdvcmRfc2V0WyJOT05ERUZBVUxUUlVMRSJdID0gS19OT05ERUZBVUxUUlVMRTsKLSAgICBLZXl3b3JkX3NldFsiTk9ORSJdID0gS19OT05FOwotICAgIEtleXdvcmRfc2V0WyJOT05JTlZFUlQiXSA9IEtfTk9OSU5WRVJUOwotICAgIEtleXdvcmRfc2V0WyJOT05VTkFURSJdID0gS19OT05VTkFURTsKLSAgICBLZXl3b3JkX3NldFsiTk9JU0VUQUJMRSJdID0gS19OT0lTRVRBQkxFOwotICAgIEtleXdvcmRfc2V0WyJOT1RDSExFTkdUSCJdID0gS19OT1RDSExFTkdUSDsKLSAgICBLZXl3b3JkX3NldFsiTk9UQ0hTUEFDSU5HIl0gPSBLX05PVENIU1BBQ0lORzsKLSAgICBLZXl3b3JkX3NldFsiTk9XSVJFRVhURU5TSU9OQVRQSU4iXSA9IEtfTk9XSVJFRVhURU5TSU9OQVRQSU47Ci0gICAgS2V5d29yZF9zZXRbIk9CUyJdID0gS19PQlM7Ci0gICAgS2V5d29yZF9zZXRbIk9GRiJdID0gS19PRkY7Ci0gICAgS2V5d29yZF9zZXRbIk9GRlNFVCJdID0gS19PRkZTRVQ7Ci0gICAgS2V5d29yZF9zZXRbIk9ITVMiXSA9IEtfT0hNUzsKLSAgICBLZXl3b3JkX3NldFsiT04iXSA9IEtfT047Ci0gICAgS2V5d29yZF9zZXRbIk9SIl0gPSBLX09SOwotICAgIEtleXdvcmRfc2V0WyJPUklFTlQiXSA9IEtfT1JJRU5UOwotICAgIEtleXdvcmRfc2V0WyJPUklFTlRBVElPTiJdID0gS19PUklFTlRBVElPTjsKLSAgICBLZXl3b3JkX3NldFsiT1JJR0lOIl0gPSBLX09SSUdJTjsKLSAgICBLZXl3b3JkX3NldFsiT1JUSE9HT05BTCJdID0gS19PUlRIT0dPTkFMOwotICAgIEtleXdvcmRfc2V0WyJPVVRQVVQiXSA9IEtfT1VUUFVUOwotICAgIEtleXdvcmRfc2V0WyJPVVRQVVRQSU5BTlRFTk5BU0laRSJdID0gS19PVVRQVVRQSU5BTlRFTk5BU0laRTsKLSAgICBLZXl3b3JkX3NldFsiT1VUUFVUTk9JU0VNQVJHSU4iXSA9IEtfT1VUUFVUTk9JU0VNQVJHSU47Ci0gICAgS2V5d29yZF9zZXRbIk9VVFBVVFJFU0lTVEFOQ0UiXSA9IEtfT1VUUFVUUkVTSVNUQU5DRTsKLSAgICBLZXl3b3JkX3NldFsiT1VUU0lERUNPUk5FUiJdID0gS19PVVRTSURFQ09STkVSOwotICAgIEtleXdvcmRfc2V0WyJPVkVSSEFORyJdID0gS19PVkVSSEFORzsKLSAgICBLZXl3b3JkX3NldFsiT1ZFUkxBUCJdID0gS19PVkVSTEFQOwotICAgIEtleXdvcmRfc2V0WyJPVkVSTEFQUyJdID0gS19PVkVSTEFQUzsKLSAgICBLZXl3b3JkX3NldFsiT1hJREUxIl0gPSBLX09YSURFMTsKLSAgICBLZXl3b3JkX3NldFsiT1hJREUyIl0gPSBLX09YSURFMjsKLSAgICBLZXl3b3JkX3NldFsiT1hJREUzIl0gPSBLX09YSURFMzsKLSAgICBLZXl3b3JkX3NldFsiT1hJREU0Il0gPSBLX09YSURFNDsKLSAgICBLZXl3b3JkX3NldFsiUEFEIl0gPSBLX1BBRDsKLSAgICBLZXl3b3JkX3NldFsiUEFSQUxMRUxFREdFIl0gPSBLX1BBUkFMTEVMRURHRTsKLSAgICBLZXl3b3JkX3NldFsiUEFSQUxMRUxPVkVSTEFQIl0gPSBLX1BBUkFMTEVMT1ZFUkxBUDsKLSAgICBLZXl3b3JkX3NldFsiUEFSQUxMRUxSVU5MRU5HVEgiXSA9IEtfUEFSQUxMRUxSVU5MRU5HVEg7Ci0gICAgS2V5d29yZF9zZXRbIlBBVEgiXSA9IEtfUEFUSDsKLSAgICBLZXl3b3JkX3NldFsiUEFUVEVSTiJdID0gS19QQVRURVJOOwotICAgIEtleXdvcmRfc2V0WyJQRUFLIl0gPSBLX1BFQUs7Ci0gICAgS2V5d29yZF9zZXRbIlBFUklPRCJdID0gS19QRVJJT0Q7Ci0gICAgS2V5d29yZF9zZXRbIlBHT05MWSJdID0gS19QR09OTFk7Ci0gICAgS2V5d29yZF9zZXRbIlBJQ09GQVJBRFMiXSA9IEtfUElDT0ZBUkFEUzsKLSAgICBLZXl3b3JkX3NldFsiUElOIl0gPSBLX1BJTjsKLSAgICBLZXl3b3JkX3NldFsiUElUQ0giXSA9IEtfUElUQ0g7Ci0gICAgS2V5d29yZF9zZXRbIlBMQUNFRCJdID0gS19QTEFDRUQ7Ci0gICAgS2V5d29yZF9zZXRbIlBPTFlHT04iXSA9IEtfUE9MWUdPTjsKLSAgICBLZXl3b3JkX3NldFsiUE9SVCJdID0gS19QT1JUOwotICAgIEtleXdvcmRfc2V0WyJQT1NFREdFIl0gPSBLX1BPU0VER0U7Ci0gICAgS2V5d29yZF9zZXRbIlBPU1QiXSA9IEtfUE9TVDsKLSAgICBLZXl3b3JkX3NldFsiUE9XRVIiXSA9IEtfUE9XRVI7Ci0gICAgS2V5d29yZF9zZXRbIlBSRSJdID0gS19QUkU7Ci0gICAgS2V5d29yZF9zZXRbIlBSRUZFUkVOQ0xPU1VSRSJdID0gS19QUkVGRVJFTkNMT1NVUkU7Ci0gICAgS2V5d29yZF9zZXRbIlBSTCJdID0gS19QUkw7Ci0gICAgS2V5d29yZF9zZXRbIlBST1BFUlRZIl0gPSBLX1BST1BFUlRZOwotICAgIEtleXdvcmRfc2V0WyJQUk9QRVJUWURFRklOSVRJT05TIl0gPSBLX1BST1BERUY7Ci0gICAgS2V5d29yZF9zZXRbIlBST1RSVVNJT05XSURUSCJdID0gS19QUk9UUlVTSU9OV0lEVEg7Ci0gICAgS2V5d29yZF9zZXRbIlBVTExET1dOUkVTIl0gPSBLX1BVTExET1dOUkVTOwotICAgIEtleXdvcmRfc2V0WyJQV0wiXSA9IEtfUFdMOwotICAgIEtleXdvcmRfc2V0WyJSMCJdID0gS19SMDsKLSAgICBLZXl3b3JkX3NldFsiUjkwIl0gPSBLX1I5MDsKLSAgICBLZXl3b3JkX3NldFsiUjE4MCJdID0gS19SMTgwOwotICAgIEtleXdvcmRfc2V0WyJSMjcwIl0gPSBLX1IyNzA7Ci0gICAgS2V5d29yZF9zZXRbIlJBTkdFIl0gPSBLX1JBTkdFOwotICAgIEtleXdvcmRfc2V0WyJSRUFMIl0gPSBLX1JFQUw7Ci0gICAgS2V5d29yZF9zZXRbIlJFQ09WRVJZIl0gPSBLX1JFQ09WRVJZOwotICAgIEtleXdvcmRfc2V0WyJSRUNUIl0gPSBLX1JFQ1Q7Ci0gICAgS2V5d29yZF9zZXRbIlJFU0lTVEFOQ0UiXSA9IEtfUkVTSVNUQU5DRTsKLSAgICBLZXl3b3JkX3NldFsiUkVTSVNUSVZFIl0gPSBLX1JFU0lTVElWRTsKLSAgICBLZXl3b3JkX3NldFsiUklORyJdID0gS19SSU5HOwotICAgIEtleXdvcmRfc2V0WyJSSVNFIl0gPSBLX1JJU0U7Ci0gICAgS2V5d29yZF9zZXRbIlJJU0VDUyJdID0gS19SSVNFQ1M7Ci0gICAgS2V5d29yZF9zZXRbIlJJU0VSUyJdID0gS19SSVNFUlM7Ci0gICAgS2V5d29yZF9zZXRbIlJJU0VTQVRDVVIiXSA9IEtfUklTRVNBVENVUjsKLSAgICBLZXl3b3JkX3NldFsiUklTRVNBVFQxIl0gPSBLX1JJU0VTQVRUMTsKLSAgICBLZXl3b3JkX3NldFsiUklTRVNMRVdMSU1JVCJdID0gS19SSVNFU0xFV0xJTUlUOwotICAgIEtleXdvcmRfc2V0WyJSSVNFVDAiXSA9IEtfUklTRVQwOwotICAgIEtleXdvcmRfc2V0WyJSSVNFVEhSRVNIIl0gPSBLX1JJU0VUSFJFU0g7Ci0gICAgS2V5d29yZF9zZXRbIlJJU0VWT0xUQUdFVEhSRVNIT0xEIl0gPSBLX1JJU0VWT0xUQUdFVEhSRVNIT0xEOwotICAgIEtleXdvcmRfc2V0WyJSTVMiXSA9IEtfUk1TOwotICAgIEtleXdvcmRfc2V0WyJST1VUSU5HIl0gPSBLX1JPVVRJTkc7Ci0gICAgS2V5d29yZF9zZXRbIlJPV0FCVVRTUEFDSU5HIl0gPSBLX1JPV0FCVVRTUEFDSU5HOwotICAgIEtleXdvcmRfc2V0WyJST1dDT0wiXSA9IEtfUk9XQ09MOwotICAgIEtleXdvcmRfc2V0WyJST1dNQUpPUiJdID0gS19ST1dNQUpPUjsKLSAgICBLZXl3b3JkX3NldFsiUk9XTUlOU1BBQ0lORyJdID0gS19ST1dNSU5TUEFDSU5HOwotICAgIEtleXdvcmRfc2V0WyJST1dQQVRURVJOIl0gPSBLX1JPV1BBVFRFUk47Ci0gICAgS2V5d29yZF9zZXRbIlJQRVJTUSJdID0gS19SUEVSU1E7Ci0gICAgS2V5d29yZF9zZXRbIlMiXSA9IEtfUzsKLSAgICBLZXl3b3JkX3NldFsiU0FNRU5FVCJdID0gS19TQU1FTkVUOwotICAgIEtleXdvcmRfc2V0WyJTQ0FOVVNFIl0gPSBLX1NDQU5VU0U7Ci0gICAgS2V5d29yZF9zZXRbIlNERkNPTkQiXSA9IEtfU0RGQ09ORDsKLSAgICBLZXl3b3JkX3NldFsiU0RGQ09OREVORCJdID0gS19TREZDT05ERU5EOwotICAgIEtleXdvcmRfc2V0WyJTREZDT05EU1RBUlQiXSA9IEtfU0RGQ09ORFNUQVJUOwotICAgIEtleXdvcmRfc2V0WyJTRVRVUCJdID0gS19TRVRVUDsKLSAgICBLZXl3b3JkX3NldFsiU0hBUEUiXSA9IEtfU0hBUEU7Ci0gICAgS2V5d29yZF9zZXRbIlNIUklOS0FHRSJdID0gS19TSFJJTktBR0U7Ci0gICAgS2V5d29yZF9zZXRbIlNJR05BTCJdID0gS19TSUdOQUw7Ci0gICAgS2V5d29yZF9zZXRbIlNJVEUiXSA9IEtfU0lURTsKLSAgICBLZXl3b3JkX3NldFsiU0laRSJdID0gS19TSVpFOwotICAgIEtleXdvcmRfc2V0WyJTS0VXIl0gPSBLX1NLRVc7Ci0gICAgS2V5d29yZF9zZXRbIlNMT1RMRU5HVEgiXSA9IEtfU0xPVExFTkdUSDsKLSAgICBLZXl3b3JkX3NldFsiU0xPVFdJRFRIIl0gPSBLX1NMT1RXSURUSDsKLSAgICBLZXl3b3JkX3NldFsiU0xPVFdJUkVMRU5HVEgiXSA9IEtfU0xPVFdJUkVMRU5HVEg7Ci0gICAgS2V5d29yZF9zZXRbIlNMT1RXSVJFV0lEVEgiXSA9IEtfU0xPVFdJUkVXSURUSDsKLSAgICBLZXl3b3JkX3NldFsiU1BMSVRXSVJFV0lEVEgiXSA9IEtfU1BMSVRXSVJFV0lEVEg7Ci0gICAgS2V5d29yZF9zZXRbIlNPRlQiXSA9IEtfU09GVDsKLSAgICBLZXl3b3JkX3NldFsiU09VUkNFIl0gPSBLX1NPVVJDRTsKLSAgICBLZXl3b3JkX3NldFsiU1BBQ0VSIl0gPSBLX1NQQUNFUjsKLSAgICBLZXl3b3JkX3NldFsiU1BBQ0lORyJdID0gS19TUEFDSU5HOwotICAgIEtleXdvcmRfc2V0WyJTUEFDSU5HVEFCTEUiXSA9IEtfU1BBQ0lOR1RBQkxFOwotICAgIEtleXdvcmRfc2V0WyJTUEVDSUFMTkVUUyJdID0gS19TUEVDSUFMTkVUUzsKLSAgICBLZXl3b3JkX3NldFsiU1RBQkxFIl0gPSBLX1NUQUJMRTsKLSAgICBLZXl3b3JkX3NldFsiU1RBQ0siXSA9IEtfU1RBQ0s7Ci0gICAgS2V5d29yZF9zZXRbIlNUQVJUIl0gPSBLX1NUQVJUOwotICAgIEtleXdvcmRfc2V0WyJTVEVQIl0gPSBLX1NURVA7Ci0gICAgS2V5d29yZF9zZXRbIlNUT1AiXSA9IEtfU1RPUDsKLSAgICBLZXl3b3JkX3NldFsiU1RSSU5HIl0gPSBLX1NUUklORzsKLSAgICBLZXl3b3JkX3NldFsiU1RSVUNUVVJFIl0gPSBLX1NUUlVDVFVSRTsKLSAgICBLZXl3b3JkX3NldFsiU1VQUExZU0VOU0lUSVZJVFkiXSA9IEtfU1VQUExZU0VOU0lUSVZJVFk7Ci0gICAgS2V5d29yZF9zZXRbIlNZTU1FVFJZIl0gPSBLX1NZTU1FVFJZOwotICAgIEtleXdvcmRfc2V0WyJUQUJMRSJdID0gS19UQUJMRTsKLSAgICBLZXl3b3JkX3NldFsiVEFCTEVBWElTIl0gPSBLX1RBQkxFQVhJUzsKLSAgICBLZXl3b3JkX3NldFsiVEFCTEVESU1FTlNJT04iXSA9IEtfVEFCTEVESU1FTlNJT047Ci0gICAgS2V5d29yZF9zZXRbIlRBQkxFRU5UUklFUyJdID0gS19UQUJMRUVOVFJJRVM7Ci0gICAgS2V5d29yZF9zZXRbIlRBUEVSUlVMRSJdID0gS19UQVBFUlJVTEU7Ci0gICAgS2V5d29yZF9zZXRbIlRIRU4iXSA9IEtfVEhFTjsKLSAgICBLZXl3b3JkX3NldFsiVEhJQ0tORVNTIl0gPSBLX1RISUNLTkVTUzsKLSAgICBLZXl3b3JkX3NldFsiVElFSElHSCJdID0gS19USUVISUdIOwotICAgIEtleXdvcmRfc2V0WyJUSUVMT1ciXSA9IEtfVElFTE9XOwotICAgIEtleXdvcmRfc2V0WyJUSUVPRkZSIl0gPSBLX1RJRU9GRlI7Ci0gICAgS2V5d29yZF9zZXRbIlRJTUUiXSA9IEtfVElNRTsKLSAgICBLZXl3b3JkX3NldFsiVElNSU5HIl0gPSBLX1RJTUlORzsKLSAgICBLZXl3b3JkX3NldFsiVE8iXSA9IEtfVE87Ci0gICAgS2V5d29yZF9zZXRbIlRPUElOIl0gPSBLX1RPUElOOwotICAgIEtleXdvcmRfc2V0WyJUT1BMRUZUIl0gPSBLX1RPUExFRlQ7Ci0gICAgS2V5d29yZF9zZXRbIlRPUE9GU1RBQ0tPTkxZIl0gPSBLX1RPUE9GU1RBQ0tPTkxZOwotICAgIEtleXdvcmRfc2V0WyJUT1BSSUdIVCJdID0gS19UT1BSSUdIVDsKLSAgICBLZXl3b3JkX3NldFsiVFJBQ0tTIl0gPSBLX1RSQUNLUzsKLSAgICBLZXl3b3JkX3NldFsiVFJBTlNJVElPTlRJTUUiXSA9IEtfVFJBTlNJVElPTlRJTUU7Ci0gICAgS2V5d29yZF9zZXRbIlRSSVNUQVRFIl0gPSBLX1RSSVNUQVRFOwotICAgIEtleXdvcmRfc2V0WyJUUlVFIl0gPSBLX1RSVUU7Ci0gICAgS2V5d29yZF9zZXRbIlRXT0VER0VTIl0gPSBLX1RXT0VER0VTOwotICAgIEtleXdvcmRfc2V0WyJUV09XSURUSFMiXSA9IEtfVFdPV0lEVEhTOwotICAgIEtleXdvcmRfc2V0WyJUWVBFIl0gPSBLX1RZUEU7Ci0gICAgS2V5d29yZF9zZXRbIlVOQVRFTkVTUyJdID0gS19VTkFURU5FU1M7Ci0gICAgS2V5d29yZF9zZXRbIlVOSVRTIl0gPSBLX1VOSVRTOwotICAgIEtleXdvcmRfc2V0WyJVTklWRVJTQUxOT0lTRU1BUkdJTiJdID0gS19VTklWRVJTQUxOT0lTRU1BUkdJTjsKLSAgICBLZXl3b3JkX3NldFsiVVNFIl0gPSBLX1VTRTsKLSAgICBLZXl3b3JkX3NldFsiVVNFTEVOR1RIVEhSRVNIT0xEIl0gPSBLX1VTRUxFTkdUSFRIUkVTSE9MRDsKLSAgICBLZXl3b3JkX3NldFsiVVNFTUlOU1BBQ0lORyJdID0gS19VU0VNSU5TUEFDSU5HOwotICAgIEtleXdvcmRfc2V0WyJVU0VSIl0gPSBLX1VTRVI7Ci0gICAgS2V5d29yZF9zZXRbIlVTRVZJQSJdID0gS19VU0VWSUE7Ci0gICAgS2V5d29yZF9zZXRbIlVTRVZJQVJVTEUiXSA9IEtfVVNFVklBUlVMRTsKLSAgICBLZXl3b3JkX3NldFsiVkFSSUFCTEUiXSA9IEtfVkFSSUFCTEU7Ci0gICAgS2V5d29yZF9zZXRbIlZFUlNJT04iXSA9IEtfVkVSU0lPTjsKLSAgICBLZXl3b3JkX3NldFsiVkVSVElDQUwiXSA9IEtfVkVSVElDQUw7Ci0gICAgS2V5d29yZF9zZXRbIlZISSJdID0gS19WSEk7Ci0gICAgS2V5d29yZF9zZXRbIlZJQSJdID0gS19WSUE7Ci0gICAgS2V5d29yZF9zZXRbIlZJQVJVTEUiXSA9IEtfVklBUlVMRTsKLSAgICBLZXl3b3JkX3NldFsiVklDVElNTEVOR1RIIl0gPSBLX1ZJQ1RJTUxFTkdUSDsKLSAgICBLZXl3b3JkX3NldFsiVklDVElNTk9JU0UiXSA9IEtfVklDVElNTk9JU0U7Ci0gICAgS2V5d29yZF9zZXRbIlZJUlRVQUwiXSA9IEtfVklSVFVBTDsKLSAgICBLZXl3b3JkX3NldFsiVkxPIl0gPSBLX1ZMTzsKLSAgICBLZXl3b3JkX3NldFsiVk9MVEFHRSJdID0gS19WT0xUQUdFOwotICAgIEtleXdvcmRfc2V0WyJWT0xUUyJdID0gS19WT0xUUzsKLSAgICBLZXl3b3JkX3NldFsiVyJdID0gS19XOwotICAgIEtleXdvcmRfc2V0WyJXRUxMVEFQIl0gPSBLX1dFTExUQVA7Ci0gICAgS2V5d29yZF9zZXRbIldJRFRIIl0gPSBLX1dJRFRIOwotICAgIEtleXdvcmRfc2V0WyJXSVRISU4iXSA9IEtfV0lUSElOOwotICAgIEtleXdvcmRfc2V0WyJXSVJFQ0FQIl0gPSBLX1dJUkVDQVA7Ci0gICAgS2V5d29yZF9zZXRbIldJUkVFWFRFTlNJT04iXSA9IEtfV0lSRUVYVEVOU0lPTjsKLSAgICBLZXl3b3JkX3NldFsiWCJdID0gS19YOwotICAgIEtleXdvcmRfc2V0WyJZIl0gPSBLX1k7Ci19Ci0KLQotdm9pZCAKLWxlZnJTZXR0aW5nczo6ZGlzYWJsZU1zZyhpbnQgbXNnSWQpCi17Ci0gICAgbXNnc0Rpc2FibGVNYXBbbXNnSWRdID0gMDsKLX0KLQotCi12b2lkIAotbGVmclNldHRpbmdzOjplbmFibGVNc2coaW50IG1zZ0lkKQotewotICAgIHN0ZDo6bWFwPGludCwgaW50Pjo6aXRlcmF0b3Igc2VhcmNoID0gbXNnc0Rpc2FibGVNYXAuZmluZChtc2dJZCk7Ci0KLSAgICBpZiAoc2VhcmNoICE9IG1zZ3NEaXNhYmxlTWFwLmVuZCgpKSB7Ci0gICAgICAgIG1zZ3NEaXNhYmxlTWFwLmVyYXNlKHNlYXJjaCk7Ci0gICAgfQotfQotCi0KLXZvaWQgCi1sZWZyU2V0dGluZ3M6OmVuYWJsZUFsbE1zZ3MoKQotewotICAgIG1zZ3NEaXNhYmxlTWFwLmNsZWFyKCk7Ci19Ci0KLQotLy8gQ2hlY2sgaWYgdGhlIG1lc3NhZ2Ugd2FzIGRpc2FibGVkIGFuZCByZXR1cm5zIHN0YXR1c2VzOgotLy8gMCAtIGVuYWJsZWQsIDEgLSBkaXNhYmxlZCwgbmVlZCB3YXJuaW5nIHByaW50LCAyIC0gZGlzYWJsZWQgbm8gd2FybmluZy4KLWludCAKLWxlZnJTZXR0aW5nczo6c3VwcHJlc01zZyhpbnQgbXNnSWQpCi17Ci0gICAgc3RkOjptYXA8aW50LCBpbnQ+OjppdGVyYXRvciBzZWFyY2ggPSBtc2dzRGlzYWJsZU1hcC5maW5kKG1zZ0lkKTsKLQotICAgIGlmIChzZWFyY2ggIT0gbXNnc0Rpc2FibGVNYXAuZW5kKCkpIHsKLSAgICAgICAgaW50IHN0YXR1cyA9IG1zZ3NEaXNhYmxlTWFwW21zZ0lkXTsKLSAgICAgICAgaWYgKCFzdGF0dXMpIHsKLSAgICAgICAgICAgIG1zZ3NEaXNhYmxlTWFwW21zZ0lkXSA9IDE7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGdldCB0b2tlbiBmcm9tIGlucHV0IHN0cmluZy4gQWxzbyBzZXRzIAotLy8gc3RhcnRJZHggb24gZmlyc3QgY2hhcmFjdGVyIGFmdGVyIHRoZSB0b2tlbi4KLXN0ZDo6c3RyaW5nCi1sZWZyU2V0dGluZ3M6OmdldFRva2VuKGNvbnN0IHN0ZDo6c3RyaW5nICZpbnB1dCwgaW50ICZzdGFydElkeCkKLXsKLSAgICBzdGQ6OnN0cmluZyAgZGl2Q2hhcnMgPSAiIFxuXHRccjsiOwotICAgIGludCAgICAgICAgICB0b2tlblN0YXJ0ID0gaW5wdXQuZmluZF9maXJzdF9ub3Rfb2YoZGl2Q2hhcnMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRJZHgpOwotICAgIGludCAgICAgICAgICB0b2tlbkVuZCA9IGlucHV0LmZpbmRfZmlyc3Rfb2YoZGl2Q2hhcnMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuU3RhcnQpOwotCi0gICAgc3RhcnRJZHggPSB0b2tlbkVuZDsKLSAgICByZXR1cm4gaW5wdXQuc3Vic3RyKHRva2VuU3RhcnQsIHRva2VuRW5kIC0gdG9rZW5TdGFydCk7Ci19Ci0KLQotLy8gVGhpcyBmdW5jdGlvbiBhZGRzIG5ldyBsZWY1OFR5cGUtbGF5ZXJUeXBlIHBhaXJzLiBsYXllclR5cGUgCi0vLyBpcyByZWZlcmVuY2UgdG8gc3RyaW5nIGFycmF5IGxhc3QgZWxlbWVudCBvZiB3aGljaCBzaG91bGQgYmUgCi0vLyAiIi4gVGhlIHBhaXJzIHdpbGwgYmUgY3JlYXRlZCBmb3IgZWFjaCBlbGVtZW50IG9mIHRoZSBhcnJheS4KLS8vIER1cGxpY2F0ZWQgcGFpcnMgd2lsbCBiZSBpZ25vcmVkLgotdm9pZCAKLWxlZnJTZXR0aW5nczo6YWRkTGVmNThUeXBlKGNvbnN0IGNoYXIgKmxlZjU4VHlwZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqbGF5ZXJUeXBlKQotewotICAgIGZvciAoOyoqbGF5ZXJUeXBlOyAgICAgbGF5ZXJUeXBlKyspIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgdHlwZXNQYWlyKGxlZjU4VHlwZSk7Ci0KLSAgICAgICAgdHlwZXNQYWlyID0gdHlwZXNQYWlyICsgIiAiICsgKmxheWVyVHlwZTsKLQotICAgICAgICBMZWY1OFR5cGVQYWlycy5pbnNlcnQodHlwZXNQYWlyKTsKLSAgICB9Ci19Ci0KLQotc3RkOjpzdHJpbmcKLWxlZnJTZXR0aW5nczo6Z2V0TGF5ZXJMZWY1OFR5cGVzKGNvbnN0IGNoYXIgKnR5cGUpIGNvbnN0Ci17Ci0gICAgc3RkOjpzdHJpbmcgICAgICAgICAgICAgICAgIHJlc3VsdDsKLSAgICBTdHJpbmdTZXQ6OmNvbnN0X2l0ZXJhdG9yICAgcGFpcnNJdGVyID0gTGVmNThUeXBlUGFpcnMuYmVnaW4oKTsKLQotICAgIGZvciAoOyBwYWlyc0l0ZXIgIT0gTGVmNThUeXBlUGFpcnMuZW5kKCk7ICsrcGFpcnNJdGVyKSB7Ci0gICAgICAgIGNvbnN0ICAgc3RkOjpzdHJpbmcgcGFpcigqcGFpcnNJdGVyKTsKLSAgICAgICAgaW50ICAgICBzZXBJZHggPSBwYWlyLmZpbmQoJyAnKTsKLQotICAgICAgICBpZiAocGFpci5zdWJzdHIoc2VwSWR4ICsgMSkgIT0gdHlwZSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXJlc3VsdC5lbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdCArPSBwYWlyLnN1YnN0cigwLCBzZXBJZHgpOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZyU2V0dGluZ3MuaHBwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZyU2V0dGluZ3MuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTgwYjhhLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmclNldHRpbmdzLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyIC0gMjAxNywgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yOiBhcmFraG1hbiAkCi0vLyAgJFJldmlzaW9uOiAjMTEgJAotLy8gICREYXRlOiAyMDEzLzA0LzIzICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2lmbmRlZiBsZWZyU2V0dGluZ3NfaAotI2RlZmluZSBsZWZyU2V0dGluZ3NfaAotCi0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHNldD4KLQotI2luY2x1ZGUgImxlZnJSZWFkZXIuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1zdHJ1Y3QgbGVmQ29tcGFyZUNTdHJpbmdzIAotewotICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBsaHMsIGNvbnN0IGNoYXIqIHJocykgY29uc3QgewotICAgICAgICByZXR1cm4gc3RkOjpzdHJjbXAobGhzLCByaHMpIDwgMDsKLSAgICB9Ci19OwotCi10eXBlZGVmIHN0ZDo6bWFwPGNvbnN0IGNoYXIqLCBpbnQsIGxlZkNvbXBhcmVDU3RyaW5ncz4gIGxlZktleXdvcmRNYXA7Ci10eXBlZGVmIHN0ZDo6bWFwPGludCwgaW50PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1zZ3NEaXNhYmxlTWFwOwotCi10eXBlZGVmIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiAgICAgICAgICAgICAgIFN0cmluZ1NldDsKLQotY2xhc3MgbGVmclByb3BzIHsKLXB1YmxpYzoKLSAgICBsZWZpUHJvcFR5cGUgIGxlZnJDb21wUHJvcDsgCi0gICAgbGVmaVByb3BUeXBlICBsZWZyTGF5ZXJQcm9wOyAKLSAgICBsZWZpUHJvcFR5cGUgIGxlZnJMaWJQcm9wOyAKLSAgICBsZWZpUHJvcFR5cGUgIGxlZnJNYWNyb1Byb3A7IAotICAgIGxlZmlQcm9wVHlwZSAgbGVmck5vbmRlZlByb3A7IAotICAgIGxlZmlQcm9wVHlwZSAgbGVmclBpblByb3A7IAotICAgIGxlZmlQcm9wVHlwZSAgbGVmclZpYVByb3A7IAotICAgIGxlZmlQcm9wVHlwZSAgbGVmclZpYVJ1bGVQcm9wOyAKLX07Ci0KLWNsYXNzIGxlZnJTZXR0aW5ncyB7Ci1wdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgIGxlZnJTZXR0aW5ncygpOwotCi0gICAgdm9pZCAgICAgICAgICAgIGluaXRfc3ltYm9sX3RhYmxlKCk7Ci0gICAgc3RhdGljIHZvaWQgICAgIHJlc2V0KCk7Ci0gICAgdm9pZCAgICAgICAgICAgIGFkZExlZjU4VHlwZShjb25zdCBjaGFyICpsZWY1OFR5cGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmxheWVyVHlwZSk7Ci0KLSAgICBzdGQ6OnN0cmluZyAgICAgZ2V0TGF5ZXJMZWY1OFR5cGVzKGNvbnN0IGNoYXIgKnR5cGUpIGNvbnN0OwotCi0gICAgdm9pZCAgICAgICAgICAgIGRpc2FibGVNc2coaW50IG1zZ0lkKTsKLSAgICB2b2lkICAgICAgICAgICAgZW5hYmxlTXNnKGludCBtc2dJZCk7Ci0gICAgdm9pZCAgICAgICAgICAgIGVuYWJsZUFsbE1zZ3MoKTsKLSAgICBpbnQgICAgICAgICAgICAgc3VwcHJlc01zZyhpbnQgbXNnSWQpOwotCi0gICAgc3RhdGljIHN0ZDo6c3RyaW5nICAgICBnZXRUb2tlbihjb25zdCBzdGQ6OnN0cmluZyAgICZpbnB1dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICZzdGFydElkeCk7Ci0KLSAgICBsZWZLZXl3b3JkTWFwICAgICAgIEtleXdvcmRfc2V0OyAKLQotICAgIGNoYXIgQ29tbWVudENoYXI7Ci0gICAgZG91YmxlIFZlcnNpb25OdW07Ci0gICAgaW50IERpc1Byb3BTdHJQcm9jZXNzOwotICAgIGludCBDYXNlU2Vuc2l0aXZlOwotICAgIGludCBDYXNlU2Vuc2l0aXZlU2V0OwotICAgIGludCBEZWx0YU51bWJlckxpbmVzOwotICAgIGludCBBbnRlbm5hSW5vdXRXYXJuaW5nczsKLSAgICBpbnQgQW50ZW5uYUlucHV0V2FybmluZ3M7Ci0gICAgaW50IEFudGVubmFPdXRwdXRXYXJuaW5nczsKLSAgICBpbnQgQXJyYXlXYXJuaW5nczsKLSAgICBpbnQgQ2FzZVNlbnNpdGl2ZVdhcm5pbmdzOwotICAgIGludCBDb3JyZWN0aW9uVGFibGVXYXJuaW5nczsKLSAgICBpbnQgRGllbGVjdHJpY1dhcm5pbmdzOwotICAgIGludCBFZGdlUmF0ZVNjYWxlRmFjdG9yV2FybmluZ3M7Ci0gICAgaW50IEVkZ2VSYXRlVGhyZXNob2xkMVdhcm5pbmdzOwotICAgIGludCBFZGdlUmF0ZVRocmVzaG9sZDJXYXJuaW5nczsKLSAgICBpbnQgSVJEcm9wV2FybmluZ3M7Ci0gICAgaW50IElub3V0QW50ZW5uYVdhcm5pbmdzOwotICAgIGludCBJbnB1dEFudGVubmFXYXJuaW5nczsKLSAgICBMRUZJX0xJTkVfTlVNQkVSX0ZVTkNUSU9OIExpbmVOdW1iZXJGdW5jdGlvbjsKLSAgICBpbnQgTGF5ZXJXYXJuaW5nczsKLSAgICBpbnQgTWFjcm9XYXJuaW5nczsKLSAgICBpbnQgTWF4U3RhY2tWaWFXYXJuaW5nczsKLSAgICBpbnQgTWluRmVhdHVyZVdhcm5pbmdzOwotICAgIGludCBOb1dpcmVFeHRlbnNpb25XYXJuaW5nczsKLSAgICBpbnQgTm9pc2VNYXJnaW5XYXJuaW5nczsKLSAgICBpbnQgTm9pc2VUYWJsZVdhcm5pbmdzOwotICAgIGludCBOb25EZWZhdWx0V2FybmluZ3M7Ci0gICAgaW50IE91dHB1dEFudGVubmFXYXJuaW5nczsKLSAgICBpbnQgUGluV2FybmluZ3M7Ci0gICAgTEVGSV9SRUFEX0ZVTkNUSU9OIFJlYWRGdW5jdGlvbjsKLSAgICBpbnQgUmVhZEVuY3J5cHRlZDsgCi0gICAgaW50IFJlZ2lzdGVyVW51c2VkOwotICAgIGludCBSZWxheE1vZGU7Ci0gICAgaW50IFNoaWZ0Q2FzZTsKLSAgICBpbnQgU2l0ZVdhcm5pbmdzOwotICAgIGludCBTcGFjaW5nV2FybmluZ3M7Ci0gICAgaW50IFRpbWluZ1dhcm5pbmdzOwotICAgIGludCBVbml0c1dhcm5pbmdzOwotICAgIGludCBVc2VNaW5TcGFjaW5nV2FybmluZ3M7Ci0gICAgaW50IFZpYVJ1bGVXYXJuaW5nczsKLSAgICBpbnQgVmlhV2FybmluZ3M7Ci0gICAgaW50IExvZ0ZpbGVBcHBlbmQ7Ci0gICAgaW50IFRvdGFsTXNnTGltaXQ7Ci0gICAgbGVmaVVzZXJEYXRhIFVzZXJEYXRhOwotCi0gICAgU3RyaW5nU2V0IExlZjU4VHlwZVBhaXJzOwotCi0gICAgTEVGSV9NQUxMT0NfRlVOQ1RJT04gTWFsbG9jRnVuY3Rpb247Ci0gICAgTEVGSV9SRUFMTE9DX0ZVTkNUSU9OIFJlYWxsb2NGdW5jdGlvbjsKLSAgICBMRUZJX0ZSRUVfRlVOQ1RJT04gRnJlZUZ1bmN0aW9uOwotICAgIExFRklfTE9HX0ZVTkNUSU9OIEVycm9yTG9nRnVuY3Rpb247Ci0gICAgTEVGSV9MT0dfRlVOQ1RJT04gU2V0TG9nRnVuY3Rpb247Ci0gICAgTEVGSV9XQVJOSU5HX0xPR19GVU5DVElPTiBXYXJuaW5nTG9nRnVuY3Rpb247Ci0KLSAgICBpbnQgTXNnTGltaXRbTUFYX0xFRl9NU0dTXTsKLQotICAgIE1zZ3NEaXNhYmxlTWFwIG1zZ3NEaXNhYmxlTWFwOwotICAgIGludCAgZEFsbE1zZ3M7IAotCi0gICAgbGVmclByb3BzIGxlZlByb3BzOwotfTsKLQotZXh0ZXJuIGxlZnJTZXR0aW5ncyogbGVmU2V0dGluZ3M7Ci0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmd1dyaXRlci5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZndXcml0ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Zjg3MGU5Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmd1dyaXRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5ODM5ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTIgLSAyMDE3LCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0KLS8vIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIGZvciBpbXBsZW1lbnRpbmcgdGhlIGxlZndyaXRlciA1LjMKLS8vIEl0IGhhcyBhbGwgdGhlIGZ1bmN0aW9ucyB1c2VyIGNhbiBjYWxsIGluIHRoZWlyIGNhbGxiYWNrcyBvcgotLy8ganVzdCB0aGVpciB3cml0ZXIgdG8gd3JpdGUgb3V0IHRoZSBjb3JyZWN0IGxlZiBzeW50YXguCi0vLwotLy8gQXV0aG9yOiBXYW5kYSBkYSBSb3NhCi0vLyBEYXRlOiAgIFN1bW1lciwgMTk5OAotLy8KLS8vIFJldmlzaW9uczoKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlICJsZWZ3V3JpdGVyLmhwcCIKLSNpbmNsdWRlICJjcnlwdC5ocHAiCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLS8vIFN0YXRlcyBvZiB0aGUgd3JpdGVyLgotI2RlZmluZSBMRUZXX1VOSU5JVCAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIExFRldfSU5JVCAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgTEVGV19BUlJBWV9TVEFSVCAgICAgICAgICAgICAgMgotI2RlZmluZSBMRUZXX0JFR0lORVhUX1NUQVJUICAgICAgICAgICAzCi0jZGVmaW5lIExFRldfQ09SUkVDVFRBQkxFX1NUQVJUICAgICAgIDQKLSNkZWZpbmUgTEVGV19JUkRST1BfU1RBUlQgICAgICAgICAgICAgNQotI2RlZmluZSBMRUZXX0xBWUVSX1NUQVJUICAgICAgICAgICAgICA2Ci0jZGVmaW5lIExFRldfTEFZRVJST1VUSU5HX1NUQVJUICAgICAgIDcKLSNkZWZpbmUgTEVGV19MQVlFUlJPVVRJTkdfU1BfU1RBUlQgICAgOAotI2RlZmluZSBMRUZXX01BQ1JPX1NUQVJUICAgICAgICAgICAgICA5Ci0jZGVmaW5lIExFRldfTk9JU0VUQUJMRV9TVEFSVCAgICAgICAgMTAKLSNkZWZpbmUgTEVGV19OT05ERUZBVUxUUlVMRV9TVEFSVCAgICAxMQotI2RlZmluZSBMRUZXX1BST1BFUlRZREVGX1NUQVJUICAgICAgIDEyCi0jZGVmaW5lIExFRldfU1BBQ0lOR19TVEFSVCAgICAgICAgICAgMTMKLSNkZWZpbmUgTEVGV19VTklUU19TVEFSVCAgICAgICAgICAgICAxNAotI2RlZmluZSBMRUZXX1ZJQV9TVEFSVCAgICAgICAgICAgICAgIDE1Ci0jZGVmaW5lIExFRldfVklBUlVMRV9TVEFSVCAgICAgICAgICAgMTYKLSNkZWZpbmUgTEVGV19WSUFSVUxFR0VOX1NUQVJUICAgICAgICAxNwotCi0jZGVmaW5lIExFRldfQU5URU5OQVNJWkUgICAgICAgICAgICAgMTgKLSNkZWZpbmUgTEVGV19BUlJBWSAgICAgICAgICAgICAgICAgICAxOQotI2RlZmluZSBMRUZXX0JFR0lORVhUICAgICAgICAgICAgICAgIDIwCi0jZGVmaW5lIExFRldfQlVTQklUQ0hBUlMgICAgICAgICAgICAgMjEKLSNkZWZpbmUgTEVGV19DQVNFU0VOU0lUSVZFICAgICAgICAgICAyMgotI2RlZmluZSBMRUZXX0NPUlJFQ1RUQUJMRSAgICAgICAgICAgIDIzCi0jZGVmaW5lIExFRldfRElFTEVDVFJJQyAgICAgICAgICAgICAgMjQKLSNkZWZpbmUgTEVGV19ESVZJREVSQ0hBUiAgICAgICAgICAgICAyNQotI2RlZmluZSBMRUZXX0VER0VSQVRFICAgICAgICAgICAgICAgIDI2Ci0jZGVmaW5lIExFRldfSVJEUk9QICAgICAgICAgICAgICAgICAgMjcKLSNkZWZpbmUgTEVGV19MQVlFUiAgICAgICAgICAgICAgICAgICAyOAotI2RlZmluZSBMRUZXX0xBWUVSQUNDVVJSRU5UICAgICAgICAgIDI5Ci0jZGVmaW5lIExFRldfTEFZRVJEQ0NVUlJFTlQgICAgICAgICAgMzAKLSNkZWZpbmUgTEVGV19MQVlFUlJPVVRJTkcgICAgICAgICAgICAzMQotI2RlZmluZSBMRUZXX0xBWUVSUk9VVElOR1dJRFRIICAgICAgIDMyCi0jZGVmaW5lIExFRldfTUFDUk8gICAgICAgICAgICAgICAgICAgMzMKLSNkZWZpbmUgTEVGV19NQUNST19DQVBBQ0lUQU5DRSAgICAgICAzNAotI2RlZmluZSBMRUZXX01BQ1JPX0lOUFVUTk9JU0VNQVJHSU4gIDM1Ci0jZGVmaW5lIExFRldfTUFDUk9fRkFMTENVUlJFTlRTT1VSQ0UgMzYKLSNkZWZpbmUgTEVGV19NQUNST19GQUxMU0FUQ1VSICAgICAgICAzNwotI2RlZmluZSBMRUZXX01BQ1JPX0ZBTExUSFJFU0ggICAgICAgIDM4Ci0jZGVmaW5lIExFRldfTUFDUk9fRkFMTFZPTFRBR0VUSFJFU0hPTEQgMzkKLSNkZWZpbmUgTEVGV19NQUNST19JVl9UQUJMRVMgICAgICAgICA0MAotI2RlZmluZSBMRUZXX01BQ1JPX0xFQUtBR0UgICAgICAgICAgIDQxCi0jZGVmaW5lIExFRldfTUFDUk9fTEVRICAgICAgICAgICAgICAgNDIKLSNkZWZpbmUgTEVGV19NQUNST19PVVRQVVROT0lTRU1BUkdJTiA0MwotI2RlZmluZSBMRUZXX01BQ1JPX09VVFBVVFJFU0lTVEFOQ0UgIDQ0Ci0jZGVmaW5lIExFRldfTUFDUk9fUElORk9SRUlHTiAgICAgICAgNDUKLSNkZWZpbmUgTEVGV19NQUNST19QSU5MRVEgICAgICAgICAgICA0NgotI2RlZmluZSBMRUZXX01BQ1JPX1BPV0VSICAgICAgICAgICAgIDQ3Ci0jZGVmaW5lIExFRldfTUFDUk9fUFVMTERPV05SRVMgICAgICAgNDgKLSNkZWZpbmUgTEVGV19NQUNST19SRVNJU1RBTkNFICAgICAgICA0OQotI2RlZmluZSBMRUZXX01BQ1JPX1JJU0VTQVRDVVIgICAgICAgIDUwCi0jZGVmaW5lIExFRldfTUFDUk9fUklTRVRIUkVTSCAgICAgICAgNTEKLSNkZWZpbmUgTEVGV19NQUNST19SSVNFVk9MVEFHRVRIUkVTSE9MRCA1MgotI2RlZmluZSBMRUZXX01BQ1JPX1NPVVJDRSAgICAgICAgICAgIDUzCi0jZGVmaW5lIExFRldfTUFDUk9fVElFT0ZGUiAgICAgICAgICAgNTQKLSNkZWZpbmUgTEVGV19NQUNST19USU1JTkcgICAgICAgICAgICA1NQotI2RlZmluZSBMRUZXX01BQ1JPX1ZISSAgICAgICAgICAgICAgIDU2Ci0jZGVmaW5lIExFRldfTUFDUk9fVkxPICAgICAgICAgICAgICAgNTcKLSNkZWZpbmUgTEVGV19NSU5GRUFUVVJFICAgICAgICAgICAgICA1OAotI2RlZmluZSBMRUZXX05PTkRFRkFVTFRSVUxFICAgICAgICAgIDU5Ci0jZGVmaW5lIExFRldfTk9OREVGQVVMVFJVTEVMQVlFUiAgICAgNjAKLSNkZWZpbmUgTEVGV19OT0lTRU1BUkdJTiAgICAgICAgICAgICA2MQotI2RlZmluZSBMRUZXX05PSVNFVEFCTEUgICAgICAgICAgICAgIDYyCi0jZGVmaW5lIExFRldfTk9XSVJFRVhUQVRQSU4gICAgICAgICAgNjMKLSNkZWZpbmUgTEVGV19QUk9QRVJUWURFRiAgICAgICAgICAgICA2NAotI2RlZmluZSBMRUZXX1NDQUxFRkFDVE9SICAgICAgICAgICAgIDY1Ci0jZGVmaW5lIExFRldfU0lURSAgICAgICAgICAgICAgICAgICAgNjYKLSNkZWZpbmUgTEVGV19TUEFDSU5HICAgICAgICAgICAgICAgICA2NwotI2RlZmluZSBMRUZXX1RIUkVTSE9MRDEgICAgICAgICAgICAgIDY4Ci0jZGVmaW5lIExFRldfVEhSRVNIT0xEMiAgICAgICAgICAgICAgNjkKLSNkZWZpbmUgTEVGV19VTklUUyAgICAgICAgICAgICAgICAgICA3MAotI2RlZmluZSBMRUZXX1ZFUlNJT04gICAgICAgICAgICAgICAgIDcxCi0jZGVmaW5lIExFRldfVklBICAgICAgICAgICAgICAgICAgICAgNzIKLSNkZWZpbmUgTEVGV19WSUFGT1JFSUdOICAgICAgICAgICAgICA3MwotI2RlZmluZSBMRUZXX1ZJQVJVTEUgICAgICAgICAgICAgICAgIDc0Ci0jZGVmaW5lIExFRldfVklBUlVMRUdFTkVSQVRFICAgICAgICAgNzUKLSNkZWZpbmUgTEVGV19WSUFSVUxFR0VOICAgICAgICAgICAgICA3NgotI2RlZmluZSBMRUZXX1ZJQVRPUE9GU1RBQ0tPTkxZICAgICAgIDc3Ci0jZGVmaW5lIExFRldfVklBVklBUlVMRSAgICAgICAgICAgICAgNzgKLQotI2RlZmluZSBMRUZXX0VORCAgICAgICAgICAgICAgICAgICAgIDc5Ci0jZGVmaW5lIExFRldfQVJSQVlfRU5EICAgICAgICAgICAgICAgODAKLSNkZWZpbmUgTEVGV19CRUdJTkVYVF9FTkQgICAgICAgICAgICA4MQotI2RlZmluZSBMRUZXX0NPUlJFQ1RUQUJMRV9FTkQgICAgICAgIDgyCi0jZGVmaW5lIExFRldfSVJEUk9QX0VORCAgICAgICAgICAgICAgODMKLSNkZWZpbmUgTEVGV19MQVlFUl9FTkQgICAgICAgICAgICAgICA4NAotI2RlZmluZSBMRUZXX0xBWUVSUk9VVElOR19FTkQgICAgICAgIDg1Ci0jZGVmaW5lIExFRldfTEFZRVJST1VUSU5HX1NQQUNJTkdUQUJMRV9FTkQgODYKLSNkZWZpbmUgTEVGV19NQUNST19FTkQgICAgICAgICAgICAgICA4NwotI2RlZmluZSBMRUZXX05PSVNFVEFCTEVfRU5EICAgICAgICAgIDg4Ci0jZGVmaW5lIExFRldfTk9OREVGQVVMVFJVTEVfRU5EICAgICAgODkKLSNkZWZpbmUgTEVGV19QUk9QRVJUWURFRl9FTkQgICAgICAgICA5MAotI2RlZmluZSBMRUZXX1NJVEVfRU5EICAgICAgICAgICAgICAgIDkxCi0jZGVmaW5lIExFRldfU1BBQ0lOR19FTkQgICAgICAgICAgICAgOTIKLSNkZWZpbmUgTEVGV19WSUFfRU5EICAgICAgICAgICAgICAgICA5MwotI2RlZmluZSBMRUZXX1ZJQVJVTEVfRU5EICAgICAgICAgICAgIDk0Ci0jZGVmaW5lIExFRldfVklBUlVMRUdFTl9FTkQgICAgICAgICAgOTUKLSNkZWZpbmUgTEVGV19VTklUU19FTkQgICAgICAgICAgICAgICA5NgotCi0vLyA1LjQKLS8vIEFOVEVOTkEgZm9yIExBWUVSCi0jZGVmaW5lIExFRldfQU5URU5OQUlOUFVUR0FURUFSRUEgICAgOTcKLSNkZWZpbmUgTEVGV19BTlRFTk5BSU5PVVRESUZGQVJFQSAgICA5OAotI2RlZmluZSBMRUZXX0FOVEVOTkFPVVRQVVRESUZGQVJFQSAgIDk5Ci0jZGVmaW5lIExFRldfQU5URU5OQU1PREVMICAgICAgICAgICAgMTAwCi0jZGVmaW5lIExFRldfQU5URU5OQUFSRUFSQVRJTyAgICAgICAgMTAxCi0jZGVmaW5lIExFRldfQU5URU5OQURJRkZBUkVBUkFUSU8gICAgMTAyCi0jZGVmaW5lIExFRldfQU5URU5OQURJRkZBUkVBUkFUSU9QV0wgMTAzCi0jZGVmaW5lIExFRldfQU5URU5OQUNVTUFSRUFSQVRJTyAgICAgMTA0Ci0jZGVmaW5lIExFRldfQU5URU5OQUNVTURJRkZBUkVBUkFUSU8gMTA1Ci0jZGVmaW5lIExFRldfQU5URU5OQUNVTURJRkZBUkVBUkFUSU9QV0wgICAgICAxMDYKLSNkZWZpbmUgTEVGV19BTlRFTk5BQVJFQUZBQ1RPUiAgICAgICAxMDcKLSNkZWZpbmUgTEVGV19BTlRFTk5BU0lERUFSRUFSQVRJTyAgICAxMDgKLSNkZWZpbmUgTEVGV19BTlRFTk5BRElGRlNJREVBUkVBUkFUSU8gICAgICAgIDEwOQotI2RlZmluZSBMRUZXX0FOVEVOTkFESUZGU0lERUFSRUFSQVRJT1BXTCAgICAgMTEwCi0jZGVmaW5lIExFRldfQU5URU5OQUNVTVNJREVBUkVBUkFUSU8gMTExCi0jZGVmaW5lIExFRldfQU5URU5OQUNVTURJRkZTSURFQVJFQVJBVElPICAgICAxMTIKLSNkZWZpbmUgTEVGV19BTlRFTk5BQ1VNRElGRlNJREVBUkVBUkFUSU9QV0wgIDExMwotI2RlZmluZSBMRUZXX0FOVEVOTkFTSURFQVJFQUZBQ1RPUiAgIDExNAotLy8gQU5URU5OQSBmb3IgTUFDUk8gUElOCi0jZGVmaW5lIExFRldfQU5URU5OQVBBUlRJQUxNRVRBTEFSRUEgMTE1Ci0jZGVmaW5lIExFRldfQU5URU5OQVBBUlRJQUxNRVRBTFNJREVBUkVBICAgICAxMTYKLSNkZWZpbmUgTEVGV19BTlRFTk5BR0FURUFSRUEgICAgICAgICAxMTcKLSNkZWZpbmUgTEVGV19BTlRFTk5BRElGRkFSRUEgICAgICAgICAxMTgKLSNkZWZpbmUgTEVGV19BTlRFTk5BTUFYQVJFQUNBUiAgICAgICAxMTkKLSNkZWZpbmUgTEVGV19BTlRFTk5BTUFYU0lERUFSRUFDQVIgICAxMjAKLSNkZWZpbmUgTEVGV19BTlRFTk5BUEFSVElBTENVVEFSRUEgICAxMjEKLSNkZWZpbmUgTEVGV19BTlRFTk5BTUFYQ1VUQ0FSICAgICAgICAxMjIKLSNkZWZpbmUgTEVGV19DTEVBUkFOQ0VNRUFTVVJFICAgICAgICAxMjMKLSNkZWZpbmUgTEVGV19ERU5TSVRZQ0hFQ0tXSU5ET1cgICAgICAxMjQKLSNkZWZpbmUgTEVGV19ERU5TSVRZQ0hFQ0tTVEVQICAgICAgICAxMjUKLSNkZWZpbmUgTEVGV19ERVNJR05SVUxFV0lEVEggICAgICAgICAxMjYKLSNkZWZpbmUgTEVGV19GSUxMQUNUSVZFU1BBQ0lORyAgICAgICAxMjcKLSNkZWZpbmUgTEVGV19NQU5VRkFDVFVSSU5HR1JJRCAgICAgICAxMjgKLSNkZWZpbmUgTEVGV19NQVhBREpBQ0VOVFNMT1RTUEFDSU5HICAxMjkKLSNkZWZpbmUgTEVGV19NQVhDT0FYSUFMU0xPVFNQQUNJTkcgICAxMzAKLSNkZWZpbmUgTEVGV19NQVhFREdFU0xPVFNQQUNJTkcgICAgICAxMzEKLSNkZWZpbmUgTEVGV19NQVhJTVVNREVOU0lUWSAgICAgICAgICAxMzIKLSNkZWZpbmUgTEVGV19NSU5JTVVNREVOU0lUWSAgICAgICAgICAxMzMKLSNkZWZpbmUgTEVGV19ST1dBQlVUU1BBQ0lORyAgICAgICAgICAxMzQKLSNkZWZpbmUgTEVGV19ST1dNSU5TUEFDSU5HICAgICAgICAgICAxMzUKLSNkZWZpbmUgTEVGV19TTE9UV0lSRVdJRFRIICAgICAgICAgICAxMzYKLSNkZWZpbmUgTEVGV19TTE9UV0lSRUxFTkdUSCAgICAgICAgICAxMzcKLSNkZWZpbmUgTEVGV19TTE9UV0lEVEggICAgICAgICAgICAgICAxMzgKLSNkZWZpbmUgTEVGV19TTE9UTEVOR1RIICAgICAgICAgICAgICAxMzkKLSNkZWZpbmUgTEVGV19TUExJVFdJUkVXSURUSCAgICAgICAgICAxNDAKLSNkZWZpbmUgTEVGV19VU0VNSU5TUEFDSU5HICAgICAgICAgICAxNDEKLSNkZWZpbmUgTEVGV19GSVhFRE1BU0sgICAgICAgICAgICAgICAxNDIKLQotI2RlZmluZSBMRUZXX0RPTkUgICAgICAgICAgICAgICAgICAgIDk5OQotCi0jZGVmaW5lIE1BWFNZTiAgICAgICAgICAgICAgICAgICAgICAgMTQzCi0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBHbG9iYWwgVmFyaWFibGVzCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotdHlwZWRlZiB2b2lkICgqTEVGSV9MT0dfRlVOQ1RJT04pKGNvbnN0IGNoYXIqKTsKLXR5cGVkZWYgdm9pZCAoKkxFRklfV0FSTklOR19MT0dfRlVOQ1RJT04pKGNvbnN0IGNoYXIqKTsKLQotTEVGSV9MT0dfRlVOQ1RJT04gbGVmd0Vycm9yTG9nRnVuY3Rpb247Ci1MRUZJX1dBUk5JTkdfTE9HX0ZVTkNUSU9OIGxlZndXYXJuaW5nTG9nRnVuY3Rpb247Ci0KLUZJTEUgKmxlZndGaWxlID0gMDsgICAvLyBGaWxlIHRvIHdyaXRlIHRvLgotaW50IGxlZndTeW5BcnJheVtNQVhTWU5dOyAvLyBhcnJheSBvZiBzeW50YXgKLWludCBsZWZ3TGluZXMgPSAwOyAgICAvLyBudW1iZXIgb2YgbGluZXMgd3JpdHRlbgotaW50IGxlZndTdGF0ZSA9IExFRldfVU5JTklUOyAgLy8gQ3VycmVudCBzdGF0ZSBvZiB3cml0ZXIKLWludCBsZWZ3RGlkSW5pdCA9IDA7IC8vIHJlcXVpcmVkIHNlY3Rpb24KLWludCBsZWZ3RGlkTGF5ZXIgPSAwOyAvLyByZXF1aXJlZCBzZWN0aW9uCi1pbnQgbGVmd0RpZFZpYSA9IDA7IC8vIHJlcXVpcmVkIHNlY3Rpb24KLWludCBsZWZ3RGlkVmlhUnVsZSA9IDA7IC8vIHJlcXVpcmVkIHNlY3Rpb24KLWludCBsZWZ3RGlkVmlhU2l0ZSA9IDA7IC8vIHJlcXVpcmVkIHNlY3Rpb24KLWludCBsZWZ3RGlkVmlhTWFjcm8gPSAwOyAvLyByZXF1aXJlZCBzZWN0aW9uCi1pbnQgbGVmd0NvdW50ZXIgPSAwOyAgLy8gbnVtYmVyIG9mIG5ldHMsIGNvbXBvbmVudHMgaW4gc2VjdGlvbgotaW50IGxlZndMaW5lSXRlbUNvdW50ZXIgPSAwOyAvLyBudW1iZXIgb2YgaXRlbXMgb24gY3VycmVudCBsaW5lCi1pbnQgbGVmd0hhc0FycmF5UmVxID0gMDsgLy8gYXJyYXkgcmVxdWlyZWQgZGF0YQotaW50IGxlZndJc0FycmF5Rmxvb3JwID0gMDsgLy8gYXJyYXkgZmxvb3JwbGFuIGZsYWcKLWludCBsZWZ3SXNBcnJheURlZiA9IDA7IC8vIGFycmF5IGRlZmF1bHQgY2FwIGZsYWcKLWludCBsZWZ3SXNDb3JyZWN0VGFibGUgPSAwOyAvLyBjb3JyZWN0aW9udGFibGUgZmxhZwotaW50IGxlZndJc0N1dCA9IDA7IC8vIGN1dCBsYXllcgotaW50IGxlZndJc0VkZ2VyYXRlID0gMDsgLy8gZWRnZXJhdGUgd2l0aGluIG5vaXNldGFibGUKLWludCBsZWZ3SXNGbG9vcnAgPSAwOyAvLyBmbG9vcnBsYW4gd2l0aGluIGFycmF5Ci1pbnQgbGVmd0lzSW1wbGFudCA9IDA7IC8vIGltcGxhbnQgbGF5ZXIKLWludCBsZWZ3SXNNYWNyb0RlbnNpdHkgPSAwOyAvLyBtYWNybyBkZW5zaXR5IGZsYWcKLWludCBsZWZ3SXNNYWNyb09icyA9IDA7IC8vIG1hY3JvIG9icyBmbGFnCi1pbnQgbGVmd0lzTWFjcm9PYnNMYXllciA9IDA7IC8vIG1hY3JvIG9icyBsYXllciB3aXRoaW4gbWFjcm8gb2JzCi1pbnQgbGVmd0lzTWFjcm9QaW4gPSAwOyAvLyBtYWNybyBwaW4gZmxhZwotaW50IGxlZndJc01hY3JvUGluUG9ydExheWVyID0gMDsgLy8gbWFjcm8gcGluIHBvcnQgbGF5ZXIgd2l0aGluIG1hY3JvIHBpbiBwb3J0Ci1pbnQgbGVmd0lzTWFjcm9QaW5Qb3J0ID0gMDsgLy8gbWFjcm8gcGluIHBvcnQgd2l0aGluIG1hY3JvIHBpbgotaW50IGxlZndJc01hY3JvVGltaW5nID0gMDsgLy8gbWFjcm8gdGltaW5nIGZsYWcKLWludCBsZWZ3SXNNYWNyb1RpbWluZ01vZGVsID0gMDsgLy8gbWFjcm8gdGltaW5nIG1vZGVsIGZsYWcKLWludCBsZWZ3SXNNYXh2aWFzdGFjayA9IDA7IC8vIG1heGltdW0gc3RhY2tlZC12aWEKLWludCBsZWZ3SXNOb2lzZVRhYmxlID0gMDsgLy8gbm9pc2V0YWJsZSBmbGFnCi1pbnQgbGVmd0lzTm9uRGVmYXVsdFJ1bGUgPSAwOyAvLyBub25kZWZhdWx0cnVsZSBmbGFnCi1pbnQgbGVmd0lzT3V0UmVzaXN0ID0gMDsgLy8gb3V0cHV0UmVzaXN0YW5jZSB3aXRoaW4gZWRnZXJhdGUKLWludCBsZWZ3SXNSb3V0aW5nID0gMDsgLy8gcm91dGluZwotaW50IGxlZndJc1JvdXRpbmdNaW5DdXQgPSAwOyAvLyByb3V0aW5nIE1pbmltdW1jdXQKLWludCBsZWZ3SXNSb3V0aW5nTWluQ3V0RGlzdCA9IDA7IC8vIHJvdXRpbmcgTWluaW11bWN1dCBkaXN0YW5jZQotaW50IGxlZndJc1JvdXRpbmdNaW5DdXRMZW4gPSAwOyAvLyByb3V0aW5nIE1pbmltdW1jdXQgbGVuZ3RoIHdpdGhpbgotaW50IGxlZndJc1JvdXRpbmdSZXFEYXRhID0gMDsgLy8gbGF5ZXIgcm91dGluZyByZXF1aXJlZCBkYXRhIGFyZSBwcm92aWRlZAotaW50IGxlZndOdW1WaWFSdWxlTGF5ZXJzID0gMDsgLy8gbnVtYmVyIG9mIHZpYSBydWxlIGluIGEgdmlhIHJ1bGUKLWludCBsZWZ3T2xkU3RhdGUgPSAwOyAgLy8gdGhlIHByZXZpb3VzIHN0YXRlCi1pbnQgbGVmd1RhYmxlTGVuID0gMDsgLy8gd2lkdGggb3IgY3V0YXJlYSBmb3IgdGhlIHRhYmxlRW50cmllcwotaW50IGxlZndIYXNJbml0ID0gMDsgICAgLy8gZm9yIGxlZndJbml0IGhhcyBjYWxsZWQKLWludCBsZWZ3SGFzSW5pdENiayA9IDA7IC8vIGZvciBsZWZ3SW5pdENiayBoYXMgY2FsbGVkCi1zdGF0aWMgaW50IGxlZndXcml0ZUVuY3J5cHQgPSAwOyAvLyBmb3Igd3JpdGluZyBvdXQgZW5jcnlwdGVkIGZpbGUsIGRlZmF1bHQgaXMgMAotc3RhdGljIGludCBwcnRTZW1pQ29sb24gPSAwOyAgLy8gc29tZXRpbWVzIDsgaXMgbm90IHByaW50ZWQgeWV0Ci1zdGF0aWMgaW50IHBydE5ld0xpbmUgPSAwOyAgLy8gc29tZXRpbWVzIG5lZWQgdG8gcHJpbnQgYSBuZXcgbGluZQotc3RhdGljIGludCBsZWZ3SGFzTGF5ZXJSb3V0aW5nUmFuZ2UgPSAwOyAgLy8gbWFyayBpZiBsYXllciByb3V0aW5nIGhhcyByYW5nZQotc3RhdGljIGludCBsZWZ3SGFzTGF5ZXJSb3V0aW5nU3BhY2luZyA9IDA7ICAvLyBsYXllciByb3V0aW5nIGlzIGxlbmd0aHRocmVzaG9sZAotc3RhdGljIGludCBsZWZ3SGFzTGF5ZXJSb3V0aW5nRW9sID0gMDsgIC8vIG1hcmsgaWYgbGF5ZXIgcm91dGluZyBpcyBlbmRvZmxpbmUKLXN0YXRpYyBpbnQgbGVmd0lzTGF5ZXJDdXRTcGFjaW5nID0gMDsgIC8vIG1hcmsgaWYgbGF5ZXIgY3V0IHNwYWNpbmcKLXN0YXRpYyBpbnQgbGVmd0FNYXhBcmVhQ2FyID0gMDsgIC8vIG9ubHkgYWxsb3cgdG8gZGVmaW5lIG9uY2UgcGVyIHBpbgotc3RhdGljIGludCBsZWZ3QU1heFNpZGVBcmVhQ2FyID0gMDsgLy8gb25seSBhbGxvdyB0byBkZWZpbmUgb25jZSBwZXIgcGluCi1zdGF0aWMgaW50IGxlZndBTWF4Q3V0Q2FyID0gMDsgLy8gb25seSBhbGxvdyB0byBkZWZpbmUgb25jZSBwZXIgcGluCi1zdGF0aWMgaW50IGxlZndTcGFjaW5nVmFsID0gMDsgLy8gZWl0aGVyIHRoaXMgb3IgbGVmd1dpZHRoVmFsCi1zdGF0aWMgaW50IGxlZndXaWR0aFZhbCA9IDA7ICAgLy8gaXMgYWxsb3dlZAotc3RhdGljIGRvdWJsZSB2ZXJzaW9uTnVtID0gNS43OyAgLy8gZGVmYXVsdCB0byA1LjcKLXN0YXRpYyBpbnQgbGVmd0FudGVubmE1NCA9IDA7ICAvLyB0byBrZWVwIHRyYWNrIDUuNCBhbnRlbm5hIGlzIHVzZWQKLXN0YXRpYyBpbnQgbGVmd0FudGVubmE1MyA9IDA7ICAvLyB0byBrZWVwIHRyYWNrIDUuMyBhbnRlbm5hIGlzIHVzZWQKLXN0YXRpYyBpbnQgbGVmd09ic29sZXRlTnVtID0gLTE7IC8vIGtlZXAgdHJhY2sgdGhlIG9ic29sb3RlIHN5bnRheCBmb3IgZXJyb3IKLXN0YXRpYyBpbnQgbGVmdzU0TnVtID0gLTE7IC8vIGtlZXAgdHJhY2sgdGhlIDUuNCBzeW50YXggZm9yIGVycm9yCi1zdGF0aWMgaW50IGxlZndWaWFIYXNWYWwgPSAwOyAvLyBrZWVwIHRyYWNrIG9ubHkgVmlhUnVsZSBvciBSZXNpc3RhbmNlIGluIGEgdmlhCi0KLWNoYXIgbGVmd1N0YXRlU3RyW01BWFNZTl0gWzgwXSA9IHsKLSAgICAiVU5JVFMiLCAgICAgICAgICAgICAgICAgLy8gIDAKLSAgICAiSU5JVCIsICAgICAgICAgICAgICAgICAgLy8gIDEKLSAgICAiQVJSQVkiLCAgICAgICAgICAgICAgICAgLy8gIDIKLSAgICAiQkVHSU5FWFQiLCAgICAgICAgICAgICAgLy8gIDMKLSAgICAiQ09SUkVDVFRBQkxFIiwgICAgICAgICAgLy8gIDQKLSAgICAiSVJEUk9QIiwgICAgICAgICAgICAgICAgLy8gIDUKLSAgICAiTEFZRVIiLCAgICAgICAgICAgICAgICAgLy8gIDYKLSAgICAiTEFZRVJST1VUSU5HIiwgICAgICAgICAgLy8gIDcKLSAgICAiTEFZRVJST1VUSU5HU1BBQ0lOR1RBQkxFIiwgLy8gIDgKLSAgICAiTUFDUk8iLCAgICAgICAgICAgICAgICAgLy8gIDkKLSAgICAiTk9JU0VUQUJMRSIsICAgICAgICAgICAgLy8gMTAKLSAgICAiTk9OREVGQVVMVFJVTEUiLCAgICAgICAgLy8gMTEKLSAgICAiUFJPUEVSVFlERUZJTklUSU9OIiwgICAgLy8gMTIKLSAgICAiU1BBQ0lORyIsICAgICAgICAgICAgICAgLy8gMTMKLSAgICAiVU5JVFMiLCAgICAgICAgICAgICAgICAgLy8gMTQKLSAgICAiVklBIiwgICAgICAgICAgICAgICAgICAgLy8gMTUKLSAgICAiVklBUlVMRSIsICAgICAgICAgICAgICAgLy8gMTYKLSAgICAiVklBUlVMRUdFTiIsICAgICAgICAgICAgLy8gMTcKLSAgICAiQU5URU5OQVNJWkUiLCAgICAgICAgICAgLy8gMTgKLSAgICAiQVJSQVkiLCAgICAgICAgICAgICAgICAgLy8gMTkKLSAgICAiQkVHSU5FWFQiLCAgICAgICAgICAgICAgLy8gMjAKLSAgICAiQlVTQklUQ0hBUlMiLCAgICAgICAgICAgLy8gMjEKLSAgICAiQ0FTRVNFTlNJVElWRSIsICAgICAgICAgLy8gMjIKLSAgICAiQ09SUkVDVEFCTEUiLCAgICAgICAgICAgLy8gMjMKLSAgICAiRElFTEVDVFJJQyIsICAgICAgICAgICAgLy8gMjQKLSAgICAiRElWSURFUkNIQVIiLCAgICAgICAgICAgLy8gMjUKLSAgICAiRURHRVJBVEUiLCAgICAgICAgICAgICAgLy8gMjYKLSAgICAiSVJEUk9QIiwgICAgICAgICAgICAgICAgLy8gMjcKLSAgICAiTEFZRVIiLCAgICAgICAgICAgICAgICAgLy8gMjgKLSAgICAiTEFZRVJBQ0NVUlJFTlQiLCAgICAgICAgLy8gMjkKLSAgICAiTEFZRVJEQ0NVUlJFTlQiLCAgICAgICAgLy8gMzAKLSAgICAiTEFZRVJST1VUSU5HIiwgICAgICAgICAgLy8gMzEKLSAgICAiTEFZRVJST1VUSU5HV0lEVEgiLCAgICAgLy8gMzIKLSAgICAiTUFDUk8iLCAgICAgICAgICAgICAgICAgLy8gMzMKLSAgICAiTUFDUk9fQ0FQQUNJVEFOQ0UiLCAgICAgLy8gMzQKLSAgICAiTUFDUk9fSU5QVVROT0lTRU1BUkdJTiIsLy8gMzUKLSAgICAiTUFDUk9fRkFMTENVUlJFTlRTT1VSQ0UiLCAgIC8vIDM2Ci0gICAgIk1BQ1JPX0ZBTExTQVRDVVIiLCAgICAgICAgICAvLyAzNwotICAgICJNQUNST19GQUxMVEhSRVNIIiwgICAgICAgICAgLy8gMzgKLSAgICAiTUFDUk9fRkFMTFZPTFRBR0VUSFJFU0hPTEQiLC8vIDM5Ci0gICAgIk1BQ1JPX0lWX1RBQkxFUyIsICAgICAgIC8vIDQwCi0gICAgIk1BQ1JPX0xFQUtBR0UiLCAgICAgICAgIC8vIDQxCi0gICAgIk1BQ1JPX0xFUSIsICAgICAgICAgICAgICAgICAvLyA0MgotICAgICJNQUNST19PVVRQVVROT0lTRU1BUkdJTiIsICAgLy8gNDMKLSAgICAiTUFDUk9fT1VUUFVUUkVTSVNUQU5DRSIsICAgIC8vIDQ0Ci0gICAgIk1BQ1JPX1BJTkZPUkVJR04iLCAgICAgICAgICAvLyA0NQotICAgICJNQUNST19QSU5MRVEiLCAgICAgICAgICAgICAgLy8gNDYKLSAgICAiTUFDUk9fUE9XRVIiLCAgICAgICAgICAgLy8gNDcKLSAgICAiTUFDUk9fUFVMTERPV05SRVMiLCAgICAgLy8gNDgKLSAgICAiTUFDUk9fUkVTSVNUQU5DRSIsICAgICAgLy8gNDkKLSAgICAiTUFDUk9fUklTRVNBVENVUiIsICAgICAgLy8gNTAKLSAgICAiTUFDUk9fUklTRVRIUkVTSCIsICAgICAgLy8gNTEKLSAgICAiTUFDUk9fUklTRVZPTFRBR0VUSFJFU0hPTEQiLC8vIDUyCi0gICAgIk1BQ1JPX1NPVVJDRSIsICAgICAgICAgIC8vIDUzCi0gICAgIk1BQ1JPX1RJRU9GRlIiLCAgICAgICAgIC8vIDU0Ci0gICAgIk1BQ1JPX1RJTUlORyIsICAgICAgICAgIC8vIDU1Ci0gICAgIk1BQ1JPX1ZISSIsICAgICAgICAgICAgIC8vIDU2Ci0gICAgIk1BQ1JPX1ZMTyIsICAgICAgICAgICAgIC8vIDU3Ci0gICAgIk1JTkZFQVRVUkUiLCAgICAgICAgICAgIC8vIDU4Ci0gICAgIk5PTkRFRkFVTFRSVUxFIiwgICAgICAgIC8vIDU5Ci0gICAgIk5PTkRFRkFVTFRSVUxFTEFZRVJSRVNJU1RfQ0FQQUNJVEFOQ0VfRURHRUNBUCIsICAvLyA2MAotICAgICJOT0lTRU1BUkdJTiIsICAgICAgICAgICAvLyA2MQotICAgICJOT0lTRVRBQkxFIiwgICAgICAgICAgICAvLyA2MgotICAgICJOT1dJUkVFWFRTSU9OQVRQSU4iLCAgICAvLyA2MwotICAgICJQUk9QRVJUWURFRklOSVRJT04iLCAgICAvLyA2NAotICAgICJFREdFUkFURVNDQUxFRkFDVE9SIiwgICAvLyA2NQotICAgICJTSVRFIiwgICAgICAgICAgICAgICAgICAvLyA2NgotICAgICJTUEFDSU5HIiwgICAgICAgICAgICAgICAvLyA2NwotICAgICJFREdFUkFURVRIUkVTSE9MRDEiLCAgICAvLyA2OAotICAgICJFREdFUkFURVRIUkVTSE9MRDIiLCAgICAvLyA2OQotICAgICJVTlRJUyIsICAgICAgICAgICAgICAgICAvLyA3MAotICAgICJWRVJTSU9OIiwgICAgICAgICAgICAgICAvLyA3MQotICAgICJWSUEiLCAgICAgICAgICAgICAgICAgICAvLyA3MgotICAgICJWSUFGT1JFSUdOIiwgICAgICAgICAgICAvLyA3MwotICAgICJWSUFSVUxFIiwgICAgICAgICAgICAgICAvLyA3NAotICAgICJWSUFSVUxFRElSRUNUSU9OX09WRVJIQU5HX01FVEFMT1ZFUkhBTkciLCAvLyA3NQotICAgICJWSUFSVUxFR0VOIiwgICAgICAgICAgICAvLyA3NgotICAgICJWSUFUT1BPRlNUQUNLT05MWSIsICAgICAgICAgICAgLy8gNzcKLSAgICAiVklBVklBUlVMRSIsICAgICAgICAgICAgLy8gNzgKLSAgICAiRU5EIiwgICAgICAgICAgICAgICAgICAgLy8gNzkKLSAgICAiQVJSQVkiLCAgICAgICAgICAgICAgICAgLy8gODAKLSAgICAiQkVHSU5FWFQiLCAgICAgICAgICAgICAgLy8gODEKLSAgICAiQ09SUkVDVEFCTEUiLCAgICAgICAgICAgLy8gODIKLSAgICAiSVJEUk9QIiwgICAgICAgICAgICAgICAgLy8gODMKLSAgICAiTEFZRVIiLCAgICAgICAgICAgICAgICAgLy8gODQKLSAgICAiTEFZRVJST1VUSU5HIiwgICAgICAgICAgLy8gODUKLSAgICAiTEFZRVJST1VUSU5HU1BBQ0lOR1RBQkxFIiwgICAgIC8vIDg2Ci0gICAgIk1BQ1JPIiwgICAgICAgICAgICAgICAgIC8vIDg3Ci0gICAgIk5PSVNFVEFCTEUiLCAgICAgICAgICAgIC8vIDg4Ci0gICAgIk5PTkRFRkFVTFRSVUxFIiwgICAgICAgIC8vIDg5Ci0gICAgIlBST0VSVFlERUZJTklUSU9OIiwgICAgIC8vIDkwCi0gICAgIlNJVEUiLCAgICAgICAgICAgICAgICAgIC8vIDkxCi0gICAgIlNQQUNJTkciLCAgICAgICAgICAgICAgIC8vIDkyCi0gICAgIlZJQSIsICAgICAgICAgICAgICAgICAgIC8vIDkzCi0gICAgIlZJQVJVTEUiLCAgICAgICAgICAgICAgIC8vIDk0Ci0gICAgIlZJQVJVTEVHRU4iLCAgICAgICAgICAgIC8vIDk1Ci0gICAgIlVOSVRTIiwgICAgICAgICAgICAgICAgIC8vIDk2Ci0gICAgIkFOVEVOTkFJTlBVVEdBVEVBUkVBIiwgIC8vIDk3Ci0gICAgIkFOVEVOTkFJTk9VVERJRkZBUkVBIiwgIC8vIDk4Ci0gICAgIkFOVEVOTkFPVVRQVVRESUZGQVJFQSIsIC8vIDk5Ci0gICAgIkFOVEVOTkFNT0RFTCIsICAgICAgICAgIC8vIDEwMAotICAgICJBTlRFTk5BQVJFQVJBVElPIiwgICAgICAvLyAxMDEKLSAgICAiQU5URU5OQURJRkZBUkVBUkFUSU8iLCAgLy8gMTAyCi0gICAgIkFOVEVOTkFESUZGQVJFQVJBVElPIFBXTCIsICAgICAgICAvLyAxMDMKLSAgICAiQU5URU5OQUNVTUFSRUFSQVRJTyIsICAgLy8gMTA0Ci0gICAgIkFOVEVOTkFDVU1ESUZGQVJFQVJBVElPIiwgICAgICAgICAvLyAxMDUKLSAgICAiQU5URU5OQUNVTURJRkZBUkVBUkFUSU8gUFdMIiwgICAgIC8vIDEwNgotICAgICJBTlRFTk5BQVJFQUZBQ1RPUiIsICAgICAvLyAxMDcKLSAgICAiQU5URU5OQVNJREVBUkVBUkFUSU8iLCAgLy8gMTA4Ci0gICAgIkFOVEVOTkFESUZGU0lERUFSRUFSQVRJTyIsICAgICAgICAvLyAxMDkKLSAgICAiQU5URU5OQURJRkZTSURFQVJFQVJBVElPIFBXTCIsICAgIC8vIDExMAotICAgICJBTlRFTk5BQ1VNU0lERUFSRUFSQVRJTyIsICAgICAgICAgLy8gMTExCi0gICAgIkFOVEVOTkFDVU1ESUZGU0lERUFSRUFSQVRJTyIsICAgICAvLyAxMTIKLSAgICAiQU5URU5OQUNVTURJRkZTSURFQVJFQVJBVElPIFBXTCIsIC8vIDExMwotICAgICJBTlRFTk5BU0lERUFSRUFGQUNUT1IiLCAvLyAxMTQKLSAgICAiQU5URU5OQVBBUlRJQUxNRVRBTEFSRUEiLCAgICAgICAgIC8vIDExNQotICAgICJBTlRFTk5BUEFSVElBTE1FVEFMU0lERUFSRUEiLCAgICAgLy8gMTE2Ci0gICAgIkFOVEVOTkFHQVRFQVJFQSIsICAgICAgIC8vIDExNwotICAgICJBTlRFTk5BRElGRkFSRUEiLCAgICAgICAvLyAxMTgKLSAgICAiQU5URU5OQU1BWEFSRUFDQVIiLCAgICAgLy8gMTE5Ci0gICAgIkFOVEVOTkFNQVhTSURFQVJFQUNBUiIsIC8vIDEyMAotICAgICJBTlRFTk5BUEFSVElBTENVVEFSRUEiLCAvLyAxMjEKLSAgICAiQU5URU5OQU1BWENVVENBUiIsICAgICAgLy8gMTIyCi0gICAgIkNMRUFSQU5DRU1FQVNVUkUiLCAgICAgIC8vIDEyMwotICAgICJERU5TSVRZQ0hFQ0tXSU5ET1ciLCAgICAvLyAxMjQKLSAgICAiREVOU0lUWUNIRUNLU1RFUCIsICAgICAgLy8gMTI1Ci0gICAgIkRFU0lHTlJVTEVXSURUSCIsICAgICAgIC8vIDEyNgotICAgICJGSUxMQUNUSVZFU1BBQ0lORyIsICAgICAvLyAxMjcKLSAgICAiTUFOVUZBQ1RVUklOR0dSSUQiLCAgICAgLy8gMTI4Ci0gICAgIk1BWEFESkFDRU5UU0xPVFNQQUNJTkciLCAgICAgICAgICAvLyAxMjkKLSAgICAiTUFYQ09BWElBTFNMT1RTUEFDSU5HIiwgICAgICAgICAgIC8vIDEzMAotICAgICJNQVhFREdFU0xPVFNQQUNJTkciLCAgICAvLyAxMzEKLSAgICAiTUFYSU1VTURFTlNJVFkiLCAgICAgICAgLy8gMTMyCi0gICAgIk1JTklNVU1ERU5TSVRZIiwgICAgICAgIC8vIDEzMwotICAgICJST1dBQlVUU1BBQ0lORyIsICAgICAgICAvLyAxMzQKLSAgICAiUk9XTUlOU1BBQ0lORyIsICAgICAgICAgLy8gMTM1Ci0gICAgIlNMT1RXSVJFV0lEVEgiLCAgICAgICAgIC8vIDEzNgotICAgICJTTE9UV0lSRUxFTkdUSCIsICAgICAgICAvLyAxMzcKLSAgICAiU0xPVFdJRFRIIiwgICAgICAgICAgICAgLy8gMTM4Ci0gICAgIlNMT1RMRU5HVEgiLCAgICAgICAgICAgIC8vIDEzOQotICAgICJTUExJVFdJUkVXSURUSCIsICAgICAgICAvLyAxNDAKLSAgICAiVVNFTUlOU1BBQ0lORyBQSU4iICAgICAgLy8gMTQxCi19OwotCi0vLyBpbnRlcm5hbCBmdW5jdGlvbgotY2hhciAqCi1sZWZ3QWRkcihjb25zdCBjaGFyICp4KQotewotICAgIHJldHVybiAoY2hhciopIHg7Ci19Ci0KLS8vIGludGVybmFsIGZ1bmN0aW9uCi1jaGFyICoKLWxlZndPcmllbnQoaW50IG51bSkKLXsKLSAgICBzd2l0Y2ggKG51bSkgewotICAgIGNhc2UgMDoKLSAgICAgICAgcmV0dXJuIGxlZndBZGRyKCJOIik7Ci0gICAgY2FzZSAxOgotICAgICAgICByZXR1cm4gbGVmd0FkZHIoIlciKTsKLSAgICBjYXNlIDI6Ci0gICAgICAgIHJldHVybiBsZWZ3QWRkcigiUyIpOwotICAgIGNhc2UgMzoKLSAgICAgICAgcmV0dXJuIGxlZndBZGRyKCJFIik7Ci0gICAgY2FzZSA0OgotICAgICAgICByZXR1cm4gbGVmd0FkZHIoIkZOIik7Ci0gICAgY2FzZSA1OgotICAgICAgICByZXR1cm4gbGVmd0FkZHIoIkZXIik7Ci0gICAgY2FzZSA2OgotICAgICAgICByZXR1cm4gbGVmd0FkZHIoIkZTIik7Ci0gICAgY2FzZSA3OgotICAgICAgICByZXR1cm4gbGVmd0FkZHIoIkZFIik7Ci0gICAgfTsKLSAgICByZXR1cm4gbGVmd0FkZHIoIkJPR1VTIik7Ci19Ci0KLS8vIGludGVybmFsIGZ1bmN0aW9uCi1ib29sCi1sZWZ3VmFsaWRhdGVNYXNrTnVtYmVyKGludCBudW0pCi17Ci0gICAgaW50IGRpZ2l0ID0gMDsKLSAgICBpbnQgaW5kZXggPSAwOwotCi0gICAgaWYgKG51bSA8IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHdoaWxlIChudW0gPiAwKSB7Ci0gICAgICAgIGRpZ2l0ID0gbnVtICUgMTA7Ci0KLSAgICAgICAgaWYgKGRpZ2l0ID4gMykgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgbnVtID0gbnVtIC8gMTA7Ci0gICAgfQotCi0gICAgaWYgKGluZGV4ID4gMykgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIHRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgdG8gYmUgY2FsbGVkIGZpcnN0IHRvIGluaXRpYWxpemUgdGhlIGFycmF5Ci0vLyBFaXRoZXIgdGhpcyBmdW5jdGlvbiBvciBsZWZ3SW5pdENiayBjYW4gYmUgY2FsbGVkLCBjYW5ub3QgYmUgYm90aAotaW50Ci1sZWZ3SW5pdChGSUxFICpmKQotewotICAgIGludCBpOwotCi0gICAgLy8gQ2hlY2sgaWYgdGhlIHVzZXIgaXMgdmFsaWQgCi0gICAgLyogZG9uJ3QgbmVlZCBhbnltb3JlCi0gICAgaWYgKCFsZWZpVmFsaWRVc2VyKCkpCi0gICAgICAgIGV4aXQoNzcpOwotICAgICovCi0KLSAgICAvLyBpZiAobGVmd0ZpbGUpIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBsZWZ3RmlsZSA9IGY7Ci0KLSAgICBpZiAobGVmd0hhc0luaXRDYmsgPT0gMSkgeyAgLy8gbGVmd0luaXRDYmsgaGFzIGFscmVhZHkgY2FsbGVkLCBpc3N1ZSBhbiBlcnJvcgotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLAotICAgICAgICAgICAgICAgICJFUlJPUiAoTEVGV1JJVC00MDAwKTogbGVmd0luaXRDYmsgaGFzIGFscmVhZHkgY2FsbGVkLCBjYW5ub3QgY2FsbCBsZWZ3SW5pdCBhZ2Fpbi5cbiIpOwotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiV3JpdGVyIEV4aXQuXG4iKTsKLSAgICAgICAgZXhpdChMRUZXX0JBRF9PUkRFUik7Ci0gICAgfQotICAgIGxlZndTdGF0ZSA9IExFRldfVU5JTklUOyAgLy8gQ3VycmVudCBzdGF0ZSBvZiB3cml0ZXIKLSAgICBsZWZ3RGlkSW5pdCA9IDA7ICAvLyByZXF1aXJlZCBzZWN0aW9uCi0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYU1lOOyBpKyspCi0gICAgICAgIGxlZndTeW5BcnJheVtpXSA9IDA7Ci0KLSAgICBsZWZ3RGlkSW5pdCA9IDE7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19JTklUOwotICAgIGxlZndIYXNJbml0ID0gMTsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotLy8gdGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCB0byBiZSBjYWxsZWQgZmlyc3QgdG8gaW5pdGlhbGl6ZSB0aGUgYXJyYXkKLS8vIEVpdGhlciB0aGlzIGZ1bmN0aW9uIG9yIGxlZndJbml0IGNhbiBiZSBjYWxsZWQsIGNhbm5vdCBiZSBib3RoCi1pbnQKLWxlZndJbml0Q2JrKEZJTEUgKmYpCi17Ci0gICAgaW50IGk7Ci0KLSAgICAvLyBpZiAobGVmd0ZpbGUpIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBsZWZ3RmlsZSA9IGY7Ci0KLSAgICBpZiAobGVmd0hhc0luaXQgPT0gMSkgeyAgLy8gbGVmd0luaXQgaGFzIGFscmVhZHkgY2FsbGVkLCBpc3N1ZSBhbiBlcnJvcgotICAgICAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikKLSAgICAgICAgICAgICAgICAgICAgICJFUlJPUiAoTEVGV1JJVC00MDAxKTogbGVmd0luaXQgaGFzIGFscmVhZHkgY2FsbGVkLCBjYW5ub3QgY2FsbCBsZWZ3SW5pdENiayBhZ2Fpbi5cbiIpOwotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIldyaXRlciBFeGl0LlxuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLAotICAgICAgICAgICAgICAgICAgICAiRVJST1IgKExFRldSSVQtNDAwMik6IGxlZndJbml0IGhhcyBhbHJlYWR5IGNhbGxlZCwgY2Fubm90IGNhbGwgbGVmd0luaXRDYmsgYWdhaW4uXG4iKTsKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJXcml0ZXIgRXhpdC5cbiIpOwotICAgICAgICB9Ci0gICAgICAgIGV4aXQoTEVGV19CQURfT1JERVIpOwotICAgIH0KLSAgICBsZWZ3U3RhdGUgPSBMRUZXX1VOSU5JVDsgIC8vIEN1cnJlbnQgc3RhdGUgb2Ygd3JpdGVyCi0gICAgbGVmd0RpZEluaXQgPSAwOyAgLy8gcmVxdWlyZWQgc2VjdGlvbgotCi0gICAgZm9yIChpID0gMDsgaSA8IE1BWFNZTjsgaSsrKQotICAgICAgICBsZWZ3U3luQXJyYXlbaV0gPSAwOwotCi0gICAgbGVmd0RpZEluaXQgPSAxOwotICAgIGxlZndTdGF0ZSA9IExFRldfSU5JVDsKLSAgICBsZWZ3SGFzSW5pdENiayA9IDE7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLS8vIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgZ2xvYmFsIHZhcmlhYmxlIGxlZndFbmNyeXB0IHRvIDEsIHdoaWNoIHdpbGwKLS8vIHdyaXRlIG91dCBhbiBvdXRwdXQgZW5jcnlwdGVkIGZpbGUsIG1ha2Ugc3VyZSB0byBjYWxsIGxlZndDbG9zZUVuY3J5cHQKLS8vIGJlZm9yZSBjbG9zaW5nIHRoZSBvdXRwdXQgZmlsZQotaW50Ci1sZWZ3RW5jcnlwdCgpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSB8fCAobGVmd0ZpbGUgPT0gc3Rkb3V0KSkgewotICAgICAgICAvLyBObyBvdXRwdXQgZmlsZW5hbWUgaXMgZ2l2ZW4KLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiAoTEVGV1JJVEUtNDAwNik6IE5lZWQgYW4gb3V0cHV0IGZpbGUgaWYgd3JpdGluZyBpbiBlbmNyeXB0ZWQgZm9ybWF0LlxuIik7Ci0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICB9Ci0KLSAgICAvLyBTZXQgdGhlIGZsYWcgaW4gY3J5cHQuY3BwCi0gICAgZW5jV3JpdGluZ0VuY3J5cHRlZCgpOwotCi0gICAgbGVmd1dyaXRlRW5jcnlwdCA9IDE7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLS8vIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgY2FsbGVkIGlmIGxlZndFbmNyeXB0IGlzIGNhbGxlZAotLy8gSXQgd2lsbCBjbGVhciB0aGUgZW5jcnlwdGVkIGJ1ZmZlcgotaW50Ci1sZWZ3Q2xvc2VFbmNyeXB0KCkKLXsKLQotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNDbGVhckJ1ZihsZWZ3RmlsZSk7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd05ld0xpbmUoKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIlxuIik7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiXG4iKTsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3VmVyc2lvbihpbnQgdmVyczEsCi0gICAgICAgICAgICBpbnQgdmVyczIpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0lOSVQgJiYgbGVmd1N0YXRlIDwgTEVGV19FTkQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsgIC8vIG5vdCBvZiB0aGUgRU5EcwotICAgIGlmIChsZWZ3U3luQXJyYXlbTEVGV19WRVJTSU9OXSkKLSAgICAgICAgcmV0dXJuIExFRldfQUxSRUFEWV9ERUZJTkVEOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiVkVSU0lPTiAlZC4lZCA7XG4iLCB2ZXJzMSwgdmVyczIpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIlZFUlNJT04gJWQuJWQgO1xuIiwgdmVyczEsIHZlcnMyKTsKLSAgICBpZiAodmVyczIgPj0gMTApCi0gICAgICAgIHZlcnNpb25OdW0gPSB2ZXJzMSArICh2ZXJzMiAvIDEwMC4wKTsKLSAgICBlbHNlCi0gICAgICAgIHZlcnNpb25OdW0gPSB2ZXJzMSArICh2ZXJzMiAvIDEwLjApOwotICAgIGxlZndTeW5BcnJheVtMRUZXX1ZFUlNJT05dID0gMTsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotCi1pbnQKLWxlZndDYXNlU2Vuc2l0aXZlKGNvbnN0IGNoYXIgKmNhc2VTZW5zaXRpdmUpCi17Ci0gICAgbGVmd09ic29sZXRlTnVtID0gTEVGV19DQVNFU0VOU0lUSVZFOwotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19JTklUICYmIGxlZndTdGF0ZSA8IExFRldfRU5EKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7ICAvLyBub3Qgb2YgdGhlIEVORHMKLSAgICBpZiAodmVyc2lvbk51bSA+PSA1LjYpCi0gICAgICAgIHJldHVybiBMRUZXX09CU09MRVRFOwotICAgIGlmIChsZWZ3U3luQXJyYXlbTEVGV19DQVNFU0VOU0lUSVZFXSkKLSAgICAgICAgcmV0dXJuIExFRldfQUxSRUFEWV9ERUZJTkVEOwotICAgIGlmIChzdHJjbXAoY2FzZVNlbnNpdGl2ZSwgIk9OIikgJiYgc3RyY21wKGNhc2VTZW5zaXRpdmUsICJPRkYiKSkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7ICAgICAvLyBoYXMgdG8gYmUgZWl0aGVyIE9OIG9yIE9GRgotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiTkFNRVNDQVNFU0VOU0lUSVZFICVzIDtcbiIsIGNhc2VTZW5zaXRpdmUpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIk5BTUVTQ0FTRVNFTlNJVElWRSAlcyA7XG4iLCBjYXNlU2Vuc2l0aXZlKTsKLSAgICBsZWZ3U3luQXJyYXlbTEVGV19DQVNFU0VOU0lUSVZFXSA9IDE7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLQotaW50Ci1sZWZ3Tm9XaXJlRXh0ZW5zaW9uQXRQaW4oY29uc3QgY2hhciAqbm9XaXJlRXh0KQotewotICAgIGxlZndPYnNvbGV0ZU51bSA9IExFRldfTk9XSVJFRVhUQVRQSU47Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0lOSVQgJiYgbGVmd1N0YXRlIDwgTEVGV19FTkQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsgIC8vIG5vdCBvZiB0aGUgRU5EcwotICAgIGlmICh2ZXJzaW9uTnVtID49IDUuNikKLSAgICAgICAgcmV0dXJuIExFRldfT0JTT0xFVEU7Ci0gICAgaWYgKGxlZndTeW5BcnJheVtMRUZXX05PV0lSRUVYVEFUUElOXSkKLSAgICAgICAgcmV0dXJuIExFRldfQUxSRUFEWV9ERUZJTkVEOwotICAgIGlmIChzdHJjbXAobm9XaXJlRXh0LCAiT04iKSAmJiBzdHJjbXAobm9XaXJlRXh0LCAiT0ZGIikpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOyAgICAgLy8gaGFzIHRvIGJlIGVpdGhlciBPTiBvciBPRkYKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIk5PV0lSRUVYVEVOU0lPTkFUUElOICVzIDtcbiIsIG5vV2lyZUV4dCk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiTk9XSVJFRVhURU5TSU9OQVRQSU4gJXMgO1xuIiwgbm9XaXJlRXh0KTsKLSAgICBsZWZ3U3luQXJyYXlbTEVGV19OT1dJUkVFWFRBVFBJTl0gPSAxOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi0KLWludAotbGVmd01pbmZlYXR1cmUoZG91YmxlICAgbWluRmVhdHVyZVgsCi0gICAgICAgICAgICAgICBkb3VibGUgICBtaW5GZWF0dXJlWSkKLXsKLSAgICBsZWZ3T2Jzb2xldGVOdW0gPSBMRUZXX01JTkZFQVRVUkU7Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0lOSVQgJiYgbGVmd1N0YXRlIDwgTEVGV19FTkQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAodmVyc2lvbk51bSA+PSA1LjQpCi0gICAgICAgIHJldHVybiBMRUZXX09CU09MRVRFOwotICAgIGlmIChsZWZ3U3luQXJyYXlbTEVGV19NSU5GRUFUVVJFXSkKLSAgICAgICAgcmV0dXJuIExFRldfQUxSRUFEWV9ERUZJTkVEOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiTUlORkVBVFVSRSAlLjExZyAlLjExZyA7XG4iLAotICAgICAgICAgICAgICAgICBtaW5GZWF0dXJlWCwgbWluRmVhdHVyZVkpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIk1JTkZFQVRVUkUgJS4xMWcgJS4xMWcgO1xuIiwgbWluRmVhdHVyZVgsIG1pbkZlYXR1cmVZKTsKLSAgICBsZWZ3U3luQXJyYXlbTEVGV19NSU5GRUFUVVJFXSA9IDE7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd0RpZWxlY3RyaWMoZG91YmxlIGRpZWxlY3RyaWMpCi17Ci0gICAgbGVmd09ic29sZXRlTnVtID0gTEVGV19ESUVMRUNUUklDOwotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19JTklUICYmIGxlZndTdGF0ZSA8IExFRldfRU5EKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7ICAvLyBub3Qgb2YgdGhlIEVORHMKLSAgICBpZiAodmVyc2lvbk51bSA+PSA1LjQpCi0gICAgICAgIHJldHVybiBMRUZXX09CU09MRVRFOwotICAgIGlmIChsZWZ3U3luQXJyYXlbTEVGV19ESUVMRUNUUklDXSkKLSAgICAgICAgcmV0dXJuIExFRldfQUxSRUFEWV9ERUZJTkVEOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiRElFTEVDVFJJQyAlLjExZyA7XG4iLCBkaWVsZWN0cmljKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJESUVMRUNUUklDICUuMTFnIDtcbiIsIGRpZWxlY3RyaWMpOwotICAgIGxlZndTeW5BcnJheVtMRUZXX0RJRUxFQ1RSSUNdID0gMTsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3QnVzQml0Q2hhcnMoY29uc3QgY2hhciAqYnVzQml0Q2hhcnMpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0lOSVQgJiYgbGVmd1N0YXRlIDwgTEVGV19FTkQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsgIC8vIG5vdCBvZiB0aGUgRU5EcwotICAgIGlmIChsZWZ3U3luQXJyYXlbTEVGV19CVVNCSVRDSEFSU10pCi0gICAgICAgIHJldHVybiBMRUZXX0FMUkVBRFlfREVGSU5FRDsKLSAgICBpZiAoYnVzQml0Q2hhcnMgJiYgYnVzQml0Q2hhcnMgIT0gMCAmJiAqYnVzQml0Q2hhcnMgIT0gMCkgewotICAgICAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJCVVNCSVRDSEFSUyBcIiVzXCIgO1xuIiwgYnVzQml0Q2hhcnMpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiQlVTQklUQ0hBUlMgXCIlc1wiIDtcbiIsIGJ1c0JpdENoYXJzKTsKLSAgICB9Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N5bkFycmF5W0xFRldfQlVTQklUQ0hBUlNdID0gMTsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3RGl2aWRlckNoYXIoY29uc3QgY2hhciAqZGl2aWRlckNoYXIpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0lOSVQgJiYgbGVmd1N0YXRlIDwgTEVGV19FTkQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsgIC8vIG5vdCBvZiB0aGUgRU5EcwotICAgIGlmIChsZWZ3U3luQXJyYXlbTEVGV19ESVZJREVSQ0hBUl0pCi0gICAgICAgIHJldHVybiBMRUZXX0FMUkVBRFlfREVGSU5FRDsKLSAgICBpZiAoZGl2aWRlckNoYXIgJiYgZGl2aWRlckNoYXIgIT0gMCAmJiAqZGl2aWRlckNoYXIgIT0gMCkgewotICAgICAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJESVZJREVSQ0hBUiBcIiVzXCIgO1xuIiwgZGl2aWRlckNoYXIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiRElWSURFUkNIQVIgXCIlc1wiIDtcbiIsIGRpdmlkZXJDaGFyKTsKLSAgICB9Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N5bkFycmF5W0xFRldfRElWSURFUkNIQVJdID0gMTsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TWFudWZhY3R1cmluZ0dyaWQoZG91YmxlIGdyaWQpCi17Ci0gICAgbGVmdzU0TnVtID0gTEVGV19NQU5VRkFDVFVSSU5HR1JJRDsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfSU5JVCAmJiBsZWZ3U3RhdGUgPCBMRUZXX0VORCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOyAgLy8gbm90IG9mIHRoZSBFTkRzCi0gICAgaWYgKGxlZndTeW5BcnJheVtMRUZXX01BTlVGQUNUVVJJTkdHUklEXSkKLSAgICAgICAgcmV0dXJuIExFRldfQUxSRUFEWV9ERUZJTkVEOwotICAgIGlmICh2ZXJzaW9uTnVtIDwgNS40KQotICAgICAgICByZXR1cm4gTEVGV19XUk9OR19WRVJTSU9OOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiTUFOVUZBQ1RVUklOR0dSSUQgJS4xMWcgO1xuIiwgZ3JpZCk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiTUFOVUZBQ1RVUklOR0dSSUQgJS4xMWcgO1xuIiwgZ3JpZCk7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N5bkFycmF5W0xFRldfTUFOVUZBQ1RVUklOR0dSSURdID0gMTsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3Rml4ZWRNYXNrKCkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfSU5JVCAmJiBsZWZ3U3RhdGUgPCBMRUZXX0VORCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOyAgLy8gbm90IG9mIHRoZSBFTkRzCi0KLSAgICBpZiAodmVyc2lvbk51bSA8IDUuOCkKLSAgICAgICAgcmV0dXJuIExFRldfV1JPTkdfVkVSU0lPTjsKLQotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiRklYRURNQVNLIDtcbiIpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIkZJWEVETUFTSyA7XG4iKTsKLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTeW5BcnJheVtMRUZXX0ZJWEVETUFTS10gPSAxOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndVc2VNaW5TcGFjaW5nKGNvbnN0IGNoYXIgICAgKnR5cGUsCi0gICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpvbk9mZikKLXsKLSAgICBsZWZ3T2Jzb2xldGVOdW0gPSBMRUZXX1VTRU1JTlNQQUNJTkc7Ci0gICAgbGVmdzU0TnVtID0gTEVGV19VU0VNSU5TUEFDSU5HOwotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19JTklUICYmIGxlZndTdGF0ZSA8IExFRldfRU5EKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7ICAvLyBub3Qgb2YgdGhlIEVORHMKLSAgICAvLyBDYW4gZGVmaW5lIG1vcmUgdGhhbiBvbmNlCi0gICAgLy8gaWYgKGxlZndTeW5BcnJheVtMRUZXX1VTRU1JTlNQQUNJTkddKSByZXR1cm4gTEVGV19BTFJFQURZX0RFRklORUQ7Ci0gICAgaWYgKCF0eXBlIHx8IChzdHJjbXAodHlwZSwgIk9CUyIpICYmIHN0cmNtcCh0eXBlLCAiUElOIikpKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsgICAvLyBoYXMgdG8gYmUgT0JTIG9yIFBJTiAKLSAgICBpZiAoKHN0cmNtcCh0eXBlLCAiUElOIikgPT0gMCkgJiYgKHZlcnNpb25OdW0gPj0gNS42KSkKLSAgICAgICAgcmV0dXJuIExFRldfT0JTT0xFVEU7Ci0gICAgaWYgKCFvbk9mZiB8fCAoc3RyY21wKG9uT2ZmLCAiT04iKSAmJiBzdHJjbXAob25PZmYsICJPRkYiKSkpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOyAgIC8vIGhhcyB0byBiZSBPTiBvciBPRkYgCi0gICAgaWYgKHZlcnNpb25OdW0gPCA1LjQpCi0gICAgICAgIHJldHVybiBMRUZXX1dST05HX1ZFUlNJT047Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJVU0VNSU5TUEFDSU5HICVzICVzIDtcbiIsIHR5cGUsIG9uT2ZmKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJVU0VNSU5TUEFDSU5HICVzICVzIDtcbiIsIHR5cGUsIG9uT2ZmKTsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICAvLyBsZWZ3U3luQXJyYXlbTEVGV19VU0VNSU5TUEFDSU5HXSA9IDE7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd0NsZWFyYW5jZU1lYXN1cmUoY29uc3QgY2hhciAqdHlwZSkKLXsKLSAgICBsZWZ3NTROdW0gPSBMRUZXX0NMRUFSQU5DRU1FQVNVUkU7Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0lOSVQgJiYgbGVmd1N0YXRlIDwgTEVGV19FTkQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsgIC8vIG5vdCBvZiB0aGUgRU5EcwotICAgIGlmIChsZWZ3U3luQXJyYXlbTEVGV19DTEVBUkFOQ0VNRUFTVVJFXSkKLSAgICAgICAgcmV0dXJuIExFRldfQUxSRUFEWV9ERUZJTkVEOwotICAgIGlmICghdHlwZSB8fCAoc3RyY21wKHR5cGUsICJNQVhYWSIpICYmIHN0cmNtcCh0eXBlLCAiRVVDTElERUFOIikpKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsgICAvLyBoYXMgdG8gYmUgTUFYWFkgb3IgRVVDTElERUFOIAotICAgIGlmICh2ZXJzaW9uTnVtIDwgNS40KQotICAgICAgICByZXR1cm4gTEVGV19XUk9OR19WRVJTSU9OOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiQ0xFQVJBTkNFTUVBU1VSRSAlcyA7XG4iLCB0eXBlKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJDTEVBUkFOQ0VNRUFTVVJFICVzIDtcbiIsIHR5cGUpOwotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTeW5BcnJheVtMRUZXX0NMRUFSQU5DRU1FQVNVUkVdID0gMTsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3U3RhcnRVbml0cygpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndTeW5BcnJheVtMRUZXX1VOSVRTX1NUQVJUXSkKLSAgICAgICAgcmV0dXJuIExFRldfQUxSRUFEWV9ERUZJTkVEOwotCi0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJVTklUU1xuIik7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiVU5JVFNcbiIpOwotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTeW5BcnJheVtMRUZXX1VOSVRTX1NUQVJUXSA9IDE7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19VTklUU19TVEFSVDsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3VW5pdHMoZG91YmxlICAgIHRpbWUsICAgICAgICAvLyBvcHRpb25hbCAKLSAgICAgICAgICBkb3VibGUgICAgY2FwYWNpdGFuY2UsIC8vIG9wdGlvbmFsIAotICAgICAgICAgIGRvdWJsZSAgICByZXNpc3RhbmNlLCAgLy8gb3B0aW9uYWwgCi0gICAgICAgICAgZG91YmxlICAgIHBvd2VyLCAgICAgICAvLyBvcHRpb25hbCAKLSAgICAgICAgICBkb3VibGUgICAgY3VycmVudCwgICAgIC8vIG9wdGlvbmFsIAotICAgICAgICAgIGRvdWJsZSAgICB2b2x0YWdlLCAgICAgLy8gb3B0aW9uYWwgCi0gICAgICAgICAgZG91YmxlICAgIGRhdGFiYXNlICAgICAvLyBvcHRpb25hbCAKLSAgICAgICAgICApCi17Ci0KLSAgICBpbnQgZGF0YWJhc2VWYWw7Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfVU5JVFNfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfVU5JVFMpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLQotICAgIGlmICh0aW1lKSB7Ci0gICAgICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIFRJTUUgTkFOT1NFQ09ORFMgJS4xMWcgO1xuIiwgdGltZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBUSU1FIE5BTk9TRUNPTkRTICUuMTFnIDtcbiIsIHRpbWUpOwotICAgIH0KLSAgICBpZiAoY2FwYWNpdGFuY2UpIHsKLSAgICAgICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgQ0FQQUNJVEFOQ0UgUElDT0ZBUkFEUyAlLjExZyA7XG4iLAotICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdGFuY2UpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgQ0FQQUNJVEFOQ0UgUElDT0ZBUkFEUyAlLjExZyA7XG4iLCBjYXBhY2l0YW5jZSk7Ci0gICAgfQotICAgIGlmIChyZXNpc3RhbmNlKSB7Ci0gICAgICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIFJFU0lTVEFOQ0UgT0hNUyAlLjExZyA7XG4iLCByZXNpc3RhbmNlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIFJFU0lTVEFOQ0UgT0hNUyAlLjExZyA7XG4iLCByZXNpc3RhbmNlKTsKLSAgICB9Ci0gICAgaWYgKHBvd2VyKSB7Ci0gICAgICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIFBPV0VSIE1JTExJV0FUVFMgJS4xMWcgO1xuIiwgcG93ZXIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgUE9XRVIgTUlMTElXQVRUUyAlLjExZyA7XG4iLCBwb3dlcik7Ci0gICAgfQotICAgIGlmIChjdXJyZW50KSB7Ci0gICAgICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIENVUlJFTlQgTUlMTElBTVBTICUuMTFnIDtcbiIsIGN1cnJlbnQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgQ1VSUkVOVCBNSUxMSUFNUFMgJS4xMWcgO1xuIiwgY3VycmVudCk7Ci0gICAgfQotICAgIGlmICh2b2x0YWdlKSB7Ci0gICAgICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIFZPTFRBR0UgVk9MVFMgJS4xMWcgO1xuIiwgdm9sdGFnZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBWT0xUQUdFIFZPTFRTICUuMTFnIDtcbiIsIHZvbHRhZ2UpOwotICAgIH0KLSAgICBpZiAoZGF0YWJhc2UpIHsKLSAgICAgICAgZGF0YWJhc2VWYWwgPSAoaW50KSBkYXRhYmFzZTsKLSAgICAgICAgc3dpdGNoIChkYXRhYmFzZVZhbCkgewotICAgICAgICBjYXNlIDEwMDoKLSAgICAgICAgY2FzZSAyMDA6Ci0gICAgICAgIGNhc2UgMTAwMDoKLSAgICAgICAgY2FzZSAyMDAwOgotICAgICAgICBjYXNlIDEwMDAwOgotICAgICAgICBjYXNlIDIwMDAwOgotICAgICAgICAgICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIERBVEFCQVNFIE1JQ1JPTlMgJWQgO1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIERBVEFCQVNFIE1JQ1JPTlMgJWQgO1xuIiwgZGF0YWJhc2VWYWwpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGxlZndTdGF0ZSA9IExFRldfVU5JVFM7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd1VuaXRzRnJlcXVlbmN5KGRvdWJsZSBmcmVxdWVuY3kpCi17ICAvLyByZXF1aXJlZCBzaW5jZSBvbmx5IGJ5IGl0c2VsZiAKLQotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX1VOSVRTX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX1VOSVRTKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFmcmVxdWVuY3kpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotCi0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBGUkVRVUVOQ1kgTUVHQUhFUlRaICUuMTFnIDtcbiIsIGZyZXF1ZW5jeSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgRlJFUVVFTkNZIE1FR0FIRVJUWiAlLjExZyA7XG4iLCBmcmVxdWVuY3kpOwotCi0gICAgbGVmd1N0YXRlID0gTEVGV19VTklUUzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3RW5kVW5pdHMoKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX1VOSVRTX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX1VOSVRTKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0KLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIkVORCBVTklUU1xuXG4iKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJFTkQgVU5JVFNcblxuIik7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19VTklUU19FTkQ7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd1N0YXJ0TGF5ZXIoY29uc3QgY2hhciAgICpsYXllck5hbWUsCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKnR5cGUpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndTdGF0ZSA9PSBMRUZXX0xBWUVSX1NUQVJUIHx8Ci0gICAgICAgIGxlZndTdGF0ZSA9PSBMRUZXX0xBWUVSKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0lOSVQgJiYgbGVmd1N0YXRlIDwgTEVGV19FTkQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsgIC8vIG5vdCBvZiB0aGUgRU5EcwotICAgIGlmIChsZWZ3SXNNYXh2aWFzdGFjaykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOyAgLy8gTGF5ZXIgYWZ0ZXIgbWF4aW11bSBzdGFja2VkLXZpYQotICAgIGlmIChzdHJjbXAodHlwZSwgIkNVVCIpID09IDApCi0gICAgICAgIGxlZndJc0N1dCA9IDE7Ci0gICAgZWxzZSBpZiAoc3RyY21wKHR5cGUsICJJTVBMQU5UIikgPT0gMCkgIC8vIElNUExBTlQgaXMgNS41IHN5bnRheAotICAgICAgICBsZWZ3SXNJbXBsYW50ID0gMTsKLSAgICBlbHNlIGlmIChzdHJjbXAodHlwZSwgIk1BU1RFUlNMSUNFIikgJiYgc3RyY21wKHR5cGUsICJPVkVSTEFQIikgJiYKLSAgICAgICAgICAgICBzdHJjbXAodHlwZSwgIklNUExBTlQiKSkgIC8vIElNUExBTlQgaXMgNS41IHN5bnRheAotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsgIC8vIHR5cGUgaXMgQ1VULCBNQVNURVJTTElDRSBvciBPVkVSTEFQIG9ubHkKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiTEFZRVIgJXNcbiIsIGxheWVyTmFtZSk7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBUWVBFICVzIDtcbiIsIHR5cGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJMQVlFUiAlc1xuIiwgbGF5ZXJOYW1lKTsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIFRZUEUgJXMgO1xuIiwgdHlwZSk7Ci0gICAgfQotICAgIGxlZndJc1JvdXRpbmcgPSAwOwotICAgIGxlZndMaW5lcyA9IGxlZndMaW5lcyArIDI7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19MQVlFUl9TVEFSVDsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotLy8gNS43Ci1pbnQKLWxlZndMYXllckN1dFNwYWNpbmcoZG91YmxlIHNwYWNpbmcpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTEFZRVJfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTEFZRVIpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd0lzTGF5ZXJDdXRTcGFjaW5nKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCghbGVmd0lzQ3V0KSAmJiAoIWxlZndJc0ltcGxhbnQpKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICAvLyBvbmx5IGN1dCAmIGltcGxhbnQgY2FsbCB0aGlzIGZ1bmMKLSAgICBpZiAoc3BhY2luZykgewotICAgICAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIFNQQUNJTkcgJS4xMWciLCBzcGFjaW5nKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBTUEFDSU5HICUuMTFnIiwgc3BhY2luZyk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19MQVlFUjsKLSAgICBsZWZ3SXNMYXllckN1dFNwYWNpbmcgPSAxOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi0vLyA1LjcKLWludAotbGVmd0xheWVyQ3V0U3BhY2luZ0NlbnRlclRvQ2VudGVyKCkKLXsKLSAgICBpZiAoIWxlZndJc0xheWVyQ3V0U3BhY2luZykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOyAvLyBoYXMgdG8gYmUgYWZ0ZXIgCi0gICAgLy8gbGVmd0xheWVyQ3V0U3BhY2luZyBpcyBjYWxsZWQKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIlxuICAgICBDRU5URVJUT0NFTlRFUiIpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIlxuICAgICBDRU5URVJUT0NFTlRFUiIpOwotICAgIGxlZndMaW5lcysrOwotCi0gICAgbGVmd1N0YXRlID0gTEVGV19MQVlFUjsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotLy8gNS43Ci1pbnQKLWxlZndMYXllckN1dFNwYWNpbmdTYW1lTmV0KCkKLXsKLSAgICBpZiAoIWxlZndJc0xheWVyQ3V0U3BhY2luZykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOyAvLyBoYXMgdG8gYmUgYWZ0ZXIgCi0gICAgLy8gbGVmd0xheWVyQ3V0U3BhY2luZyBpcyBjYWxsZWQKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIlxuICAgICBTQU1FTkVUIik7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiXG4gICAgIFNBTUVORVQiKTsKLSAgICBsZWZ3TGluZXMrKzsKLQotICAgIGxlZndTdGF0ZSA9IExFRldfTEFZRVI7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLS8vIDUuNwotaW50Ci1sZWZ3TGF5ZXJDdXRTcGFjaW5nTGF5ZXIoY29uc3QgY2hhciAqbmFtZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBzdGFjaykKLXsgICAvLyBvcHRpb25hbCAKLSAgICBpZiAoIWxlZndJc0xheWVyQ3V0U3BhY2luZykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOyAvLyBoYXMgdG8gYmUgYWZ0ZXIgCi0gICAgLy8gbGVmd0xheWVyQ3V0U3BhY2luZyBpcyBjYWxsZWQKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiXG4gICAgIExBWUVSICVzIiwgbmFtZTIpOwotICAgICAgICBpZiAoc3RhY2spCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiIFNUQUNLIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIlxuICAgICBMQVlFUiAlcyIsIG5hbWUyKTsKLSAgICAgICAgaWYgKHN0YWNrKQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiBTVEFDSyIpOwotICAgIH0KLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTdGF0ZSA9IExFRldfTEFZRVI7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLS8vIDUuNwotaW50Ci1sZWZ3TGF5ZXJDdXRTcGFjaW5nQWRqYWNlbnQoaW50ICAgICB2aWFDdXRzLCAgICAvLyBlaXRoZXIgMiwgMyBvciA0LCBvcHRpb25hbCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgIGRpc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgZXhjZXB0KQoteyAvLyBvcHRpb25hbCAKLSAgICBpZiAoIWxlZndJc0xheWVyQ3V0U3BhY2luZykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOyAvLyBoYXMgdG8gYmUgYWZ0ZXIgCi0gICAgLy8gbGVmd0xheWVyQ3V0U3BhY2luZyBpcyBjYWxsZWQKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBpZiAodmlhQ3V0cyA8IDIgJiYgdmlhQ3V0cyA+IDQpCi0gICAgICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIlxuICAgICBBREpBQ0VOVENVVFMgJWQgV0lUSElOICUuMTFnIiwKLSAgICAgICAgICAgICAgICAgdmlhQ3V0cywgZGlzdGFuY2UpOwotICAgICAgICBpZiAoZXhjZXB0KQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiBFWENFUFRTQU1FUEdORVQiKTsKLQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICh2aWFDdXRzIDwgMiAmJiB2aWFDdXRzID4gNCkKLSAgICAgICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiXG4gICAgIEFESkFDRU5UQ1VUUyAlZCBXSVRISU4gJS4xMWciLCB2aWFDdXRzLAotICAgICAgICAgICAgICAgIGRpc3RhbmNlKTsKLSAgICAgICAgaWYgKGV4Y2VwdCkKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgRVhDRVBUU0FNRVBHTkVUIik7Ci0gICAgfQotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19MQVlFUjsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotLy8gNS43Ci1pbnQKLWxlZndMYXllckN1dFNwYWNpbmdQYXJhbGxlbCgpCi17Ci0gICAgaWYgKCFsZWZ3SXNMYXllckN1dFNwYWNpbmcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsgLy8gaGFzIHRvIGJlIGFmdGVyIAotICAgIC8vIGxlZndMYXllckN1dFNwYWNpbmcgaXMgY2FsbGVkCi0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpIHsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIlxuICAgICBQQVJBTExFTE9WRVJMQVAiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiXG4gICAgIFBBUkFMTEVMT1ZFUkxBUCIpOwotICAgIH0KLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTdGF0ZSA9IExFRldfTEFZRVI7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLS8vIDUuNwotaW50Ci1sZWZ3TGF5ZXJDdXRTcGFjaW5nQXJlYShkb3VibGUgY3V0QXJlYSkKLXsKLSAgICBpZiAoIWxlZndJc0xheWVyQ3V0U3BhY2luZykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOyAvLyBoYXMgdG8gYmUgYWZ0ZXIgCi0gICAgLy8gbGVmd0xheWVyQ3V0U3BhY2luZyBpcyBjYWxsZWQKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiXG4gICAgIEFSRUEgJS4xMWciLCBjdXRBcmVhKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiXG4gICAgIEFSRUEgJS4xMWciLCBjdXRBcmVhKTsKLSAgICB9Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3U3RhdGUgPSBMRUZXX0xBWUVSOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi0vLyA1LjcKLWludAotbGVmd0xheWVyQ3V0U3BhY2luZ0VuZCgpCi17Ci0gICAgaWYgKCFsZWZ3SXNMYXllckN1dFNwYWNpbmcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsgLy8gaGFzIHRvIGJlIGFmdGVyIAotICAgIC8vIGxlZndMYXllckN1dFNwYWNpbmcgaXMgY2FsbGVkCi0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpIHsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiA7XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiIDtcbiIpOwotICAgIH0KLQotICAgIGxlZndJc0xheWVyQ3V0U3BhY2luZyA9IDA7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19MQVlFUjsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TGF5ZXJNYXNrKGludCBjb2xvck1hc2spCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTEFZRVJfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTEFZRVIgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HX1NUQVJUKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0KLSAgICBpZiAodmVyc2lvbk51bSA8IDUuOCkgewotICAgICAgICByZXR1cm4gTEVGV19XUk9OR19WRVJTSU9OOwotICAgIH0KLQotICAgIGlmICghbGVmd1ZhbGlkYXRlTWFza051bWJlcihjb2xvck1hc2spKSB7Ci0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIH0KLQotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgTUFTSyAlZCA7XG4iLCBjb2xvck1hc2spOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIE1BU0sgJWQgO1xuIiwgY29sb3JNYXNrKTsKLQotICAgIGxlZndMaW5lcysrOwotCi0gICAgbGVmd1N0YXRlID0gKGxlZndTdGF0ZSA9PSBMRUZXX0xBWUVSUk9VVElOR19TVEFSVCkgPyBMRUZXX0xBWUVSUk9VVElORyA6IExFRldfTEFZRVI7Ci0KLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TGF5ZXJXaWR0aChkb3VibGUgbWluV2lkdGgpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTEFZRVJfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTEFZRVIpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoKCFsZWZ3SXNJbXBsYW50KSAmJiAoIWxlZndJc0N1dCkpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgV0lEVEggJS4xMWcgO1xuIiwgbWluV2lkdGgpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIFdJRFRIICUuMTFnIDtcbiIsIG1pbldpZHRoKTsKLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTdGF0ZSA9IExFRldfTEFZRVI7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLS8vIDUuNwotaW50Ci1sZWZ3TGF5ZXJDdXRTcGFjaW5nVGFibGVPcnRobyhpbnQgICAgICAgbnVtU3BhY2luZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAqY3V0V2l0aGlucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAqb3J0aG9TcGFjaW5ncykKLXsKLSAgICBpbnQgaTsKLQotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNDdXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOyAgLy8gb25seSBjdXQgY2FsbHMgdGhpcyBmdW5jCi0gICAgaWYgKGxlZndJc01heHZpYXN0YWNrKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7ICAvLyBMYXllciBhZnRlciBtYXhpbXVtIHN0YWNrZWQtdmlhCi0gICAgaWYgKG51bVNwYWNpbmcpIHsKLSAgICAgICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpIHsKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBTUEFDSU5HVEFCTEUgT1JUSE9HT05BTCIpOwotICAgICAgICAgICAgbGVmd0xpbmVzKys7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtU3BhY2luZzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIlxuICAgICBXSVRISU5HICUuMTFnIFNQQUNJTkcgJS4xMWcgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqY3V0V2l0aGlucysrLCAqb3J0aG9TcGFjaW5ncysrKTsKLSAgICAgICAgICAgICAgICBsZWZ3TGluZXMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgO1xuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgU1BBQ0lOR1RBQkxFIE9SVEhPR09OQUwiKTsKLSAgICAgICAgICAgIGxlZndMaW5lcysrOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVNwYWNpbmc7IGkrKykgewotICAgICAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJcbiAgICAgV0lUSElOICUuMTFnIFNQQUNJTkcgJS4xMWciLAotICAgICAgICAgICAgICAgICAgICAgICAgKmN1dFdpdGhpbnMrKywgKm9ydGhvU3BhY2luZ3MrKyk7Ci0gICAgICAgICAgICAgICAgbGVmd0xpbmVzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiIDtcbiIpOwotICAgICAgICB9Ci0gICAgfQotICAgIGxlZndTdGF0ZSA9IExFRldfTEFZRVI7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLS8vIDUuNwotaW50Ci1sZWZ3TGF5ZXJBcnJheVNwYWNpbmcoaW50ICAgICAgIGxvbmdBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgdmlhV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgIGN1dFNwYWNpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG51bUFycmF5Q3V0LAotICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAqYXJyYXlDdXRzLAotICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAqYXJyYXlTcGFjaW5ncykKLXsKLSAgICBpbnQgaTsKLQotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNDdXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOyAgLy8gb25seSBjdXQgY2FsbHMgdGhpcyBmdW5jCi0gICAgaWYgKGxlZndJc01heHZpYXN0YWNrKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7ICAvLyBMYXllciBhZnRlciBtYXhpbXVtIHN0YWNrZWQtdmlhCi0gICAgaWYgKGN1dFNwYWNpbmcpIHsKLSAgICAgICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpIHsKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBBUlJBWVNQQUNJTkcgIik7Ci0gICAgICAgICAgICBpZiAobG9uZ0FycmF5KQotICAgICAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJMT05HQVJSQVkgIik7Ci0gICAgICAgICAgICBpZiAodmlhV2lkdGgpCi0gICAgICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIldJRFRIICUuMTFnICIsIHZpYVdpZHRoKTsKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJDVVRTUEFDSU5HICUuMTFnICIsIGN1dFNwYWNpbmcpOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUFycmF5Q3V0OyBpKyspIHsKLSAgICAgICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiQVJSQVlDVVRTICVkIFNQQUNJTkcgJS4xMWcgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqYXJyYXlDdXRzKyssICphcnJheVNwYWNpbmdzKyspOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiA7XG4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgIEFSUkFZU1BBQ0lORyAiKTsKLSAgICAgICAgICAgIGlmIChsb25nQXJyYXkpCi0gICAgICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIkxPTkdBUlJBWSAiKTsKLSAgICAgICAgICAgIGlmICh2aWFXaWR0aCkKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiV0lEVEggJS4xMWcgIiwgdmlhV2lkdGgpOwotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIkNVVFNQQUNJTkcgJS4xMWcgIiwgY3V0U3BhY2luZyk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQXJyYXlDdXQ7IGkrKykgewotICAgICAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJBUlJBWUNVVFMgJWQgU1BBQ0lORyAlLjExZyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgKmFycmF5Q3V0cysrLCAqYXJyYXlTcGFjaW5ncysrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgO1xuIik7Ci0gICAgICAgIH0KLSAgICAgICAgbGVmd0xpbmVzKys7Ci0gICAgfQotICAgIGxlZndTdGF0ZSA9IExFRldfTEFZRVI7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd0xheWVyRW5jbG9zdXJlKGNvbnN0IGNoYXIgICAqbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgIG92ZXJoYW5nMSwKLSAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICAgb3ZlcmhhbmcyLAotICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICB3aWR0aCkKLXsgICAgICAgICAvLyBvcHRpb25hbCAKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUl9TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzQ3V0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsgIC8vIG9ubHkgY3V0IGNhbGxzIHRoaXMgZnVuYwotICAgIGlmIChsZWZ3SXNNYXh2aWFzdGFjaykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOyAgLy8gTGF5ZXIgYWZ0ZXIgbWF4aW11bSBzdGFja2VkLXZpYQotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KSB7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBFTkNMT1NVUkUgIik7Ci0gICAgICAgIGlmIChsb2NhdGlvbiAmJiAoKmxvY2F0aW9uICE9IDApKSB7Ci0gICAgICAgICAgICBpZiAoc3RyY21wKGxvY2F0aW9uLCAiQUJPVkUiKSAmJiBzdHJjbXAobG9jYXRpb24sICJCRUxPVyIpKSB7Ci0gICAgICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikKLSAgICAgICAgICAgICAgICAgICAgICAgICAiRU5DTE9TVVJFIGluIExheWVyKEN1dCkgY2FuIG9ubHkgYmUgQUJPVkUsIEJFTE9XLlxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiJXMgIiwgbG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIlLjExZyAlLjExZyAiLCBvdmVyaGFuZzEsIG92ZXJoYW5nMik7Ci0gICAgICAgIGlmICh3aWR0aCkKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJXSURUSCAlLjExZyAiLCB3aWR0aCk7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICI7XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgRU5DTE9TVVJFICIpOwotICAgICAgICBpZiAobG9jYXRpb24gJiYgKCpsb2NhdGlvbiAhPSAwKSkgewotICAgICAgICAgICAgaWYgKHN0cmNtcChsb2NhdGlvbiwgIkFCT1ZFIikgJiYgc3RyY21wKGxvY2F0aW9uLCAiQkVMT1ciKSkgewotICAgICAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiRU5DTE9TVVJFIGluIExheWVyKEN1dCkgY2FuIG9ubHkgYmUgQUJPVkUsIEJFTE9XLlxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiJXMgIiwgbG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIlLjExZyAlLjExZyAiLCBvdmVyaGFuZzEsIG92ZXJoYW5nMik7Ci0gICAgICAgIGlmICh3aWR0aCkKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJXSURUSCAlLjExZyAiLCB3aWR0aCk7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICI7XG4iKTsKLSAgICB9Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19MQVlFUjsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotLy8gNS43Ci1pbnQKLWxlZndMYXllckVuY2xvc3VyZVdpZHRoKGNvbnN0IGNoYXIgICpsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgIG92ZXJoYW5nMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgIG92ZXJoYW5nMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgIHdpZHRoLCAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsIAotICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgY3V0V2l0aGluKQoteyAgICAgICAgIC8vIG9wdGlvbmFsIAotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNDdXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOyAgLy8gb25seSBjdXQgY2FsbHMgdGhpcyBmdW5jCi0gICAgaWYgKGxlZndJc01heHZpYXN0YWNrKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7ICAvLyBMYXllciBhZnRlciBtYXhpbXVtIHN0YWNrZWQtdmlhCi0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpIHsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIEVOQ0xPU1VSRSAiKTsKLSAgICAgICAgaWYgKGxvY2F0aW9uICYmICgqbG9jYXRpb24gIT0gMCkpIHsKLSAgICAgICAgICAgIGlmIChzdHJjbXAobG9jYXRpb24sICJBQk9WRSIpICYmIHN0cmNtcChsb2NhdGlvbiwgIkJFTE9XIikpIHsKLSAgICAgICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKQotICAgICAgICAgICAgICAgICAgICAgICAgICJFTkNMT1NVUkUgaW4gTGF5ZXIoQ3V0KSBjYW4gb25seSBiZSBBQk9WRSwgQkVMT1cuXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIlcyAiLCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiUuMTFnICUuMTFnICIsIG92ZXJoYW5nMSwgb3ZlcmhhbmcyKTsKLSAgICAgICAgaWYgKHdpZHRoKSB7Ci0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiV0lEVEggJS4xMWcgIiwgd2lkdGgpOwotICAgICAgICAgICAgaWYgKGN1dFdpdGhpbikKLSAgICAgICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiRVhDRVBURVhUUkFDVVQgJS4xMWcgIiwgY3V0V2l0aGluKTsKLSAgICAgICAgfQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiO1xuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIEVOQ0xPU1VSRSAiKTsKLSAgICAgICAgaWYgKGxvY2F0aW9uICYmICgqbG9jYXRpb24gIT0gMCkpIHsKLSAgICAgICAgICAgIGlmIChzdHJjbXAobG9jYXRpb24sICJBQk9WRSIpICYmIHN0cmNtcChsb2NhdGlvbiwgIkJFTE9XIikpIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIkVOQ0xPU1VSRSBpbiBMYXllcihDdXQpIGNhbiBvbmx5IGJlIEFCT1ZFLCBCRUxPVy5cbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiVzICIsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiJS4xMWcgJS4xMWcgIiwgb3ZlcmhhbmcxLCBvdmVyaGFuZzIpOwotICAgICAgICBpZiAod2lkdGgpIHsKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJXSURUSCAlLjExZyAiLCB3aWR0aCk7Ci0gICAgICAgICAgICBpZiAoY3V0V2l0aGluKQotICAgICAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJFWENFUFRFWFRSQUNVVCAlLjExZyAiLCBjdXRXaXRoaW4pOwotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICI7XG4iKTsKLSAgICB9Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19MQVlFUjsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotLy8gNS43Ci1pbnQKLWxlZndMYXllckVuY2xvc3VyZUxlbmd0aChjb25zdCBjaGFyICpsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgIG92ZXJoYW5nMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgIG92ZXJoYW5nMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgIG1pbkxlbmd0aCkKLXsgICAgICAgICAvLyBvcHRpb25hbCAKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUl9TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzQ3V0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsgIC8vIG9ubHkgY3V0IGNhbGxzIHRoaXMgZnVuYwotICAgIGlmIChsZWZ3SXNNYXh2aWFzdGFjaykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOyAgLy8gTGF5ZXIgYWZ0ZXIgbWF4aW11bSBzdGFja2VkLXZpYQotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KSB7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBFTkNMT1NVUkUgIik7Ci0gICAgICAgIGlmIChsb2NhdGlvbiAmJiAoKmxvY2F0aW9uICE9IDApKSB7Ci0gICAgICAgICAgICBpZiAoc3RyY21wKGxvY2F0aW9uLCAiQUJPVkUiKSAmJiBzdHJjbXAobG9jYXRpb24sICJCRUxPVyIpKSB7Ci0gICAgICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikKLSAgICAgICAgICAgICAgICAgICAgICAgICAiRU5DTE9TVVJFIGluIExheWVyKEN1dCkgY2FuIG9ubHkgYmUgQUJPVkUsIEJFTE9XLlxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiJXMgIiwgbG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIlLjExZyAlLjExZyAiLCBvdmVyaGFuZzEsIG92ZXJoYW5nMik7Ci0gICAgICAgIGlmIChtaW5MZW5ndGgpCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiTEVOR1RIICUuMTFnICIsIG1pbkxlbmd0aCk7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICI7XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgRU5DTE9TVVJFICIpOwotICAgICAgICBpZiAobG9jYXRpb24gJiYgKCpsb2NhdGlvbiAhPSAwKSkgewotICAgICAgICAgICAgaWYgKHN0cmNtcChsb2NhdGlvbiwgIkFCT1ZFIikgJiYgc3RyY21wKGxvY2F0aW9uLCAiQkVMT1ciKSkgewotICAgICAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiRU5DTE9TVVJFIGluIExheWVyKEN1dCkgY2FuIG9ubHkgYmUgQUJPVkUsIEJFTE9XLlxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiJXMgIiwgbG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIlLjExZyAlLjExZyAiLCBvdmVyaGFuZzEsIG92ZXJoYW5nMik7Ci0gICAgICAgIGlmIChtaW5MZW5ndGgpCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiTEVOR1RIICUuMTFnICIsIG1pbkxlbmd0aCk7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICI7XG4iKTsKLSAgICB9Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19MQVlFUjsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TGF5ZXJQcmVmZXJFbmNsb3N1cmUoY29uc3QgY2hhciAqbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICBvdmVyaGFuZzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICBvdmVyaGFuZzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICB3aWR0aCkKLXsgICAgICAgICAvLyBvcHRpb25hbCAKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUl9TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzQ3V0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsgIC8vIG9ubHkgY3V0IGNhbGxzIHRoaXMgZnVuYwotICAgIGlmIChsZWZ3SXNNYXh2aWFzdGFjaykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOyAgLy8gTGF5ZXIgYWZ0ZXIgbWF4aW11bSBzdGFja2VkLXZpYQotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KSB7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBQUkVGRVJFTkNMT1NVUkUgIik7Ci0gICAgICAgIGlmIChsb2NhdGlvbiAmJiAoKmxvY2F0aW9uICE9IDApKSB7Ci0gICAgICAgICAgICBpZiAoc3RyY21wKGxvY2F0aW9uLCAiQUJPVkUiKSAmJiBzdHJjbXAobG9jYXRpb24sICJCRUxPVyIpKSB7Ci0gICAgICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikKLSAgICAgICAgICAgICAgICAgICAgICAgICAiUFJFRkVSRU5DTE9TVVJFIGluIExheWVyKEN1dCkgY2FuIG9ubHkgYmUgQUJPVkUsIEJFTE9XLlxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiJXMgIiwgbG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIlLjExZyAlLjExZyAiLCBvdmVyaGFuZzEsIG92ZXJoYW5nMik7Ci0gICAgICAgIGlmICh3aWR0aCkKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJXSURUSCAlLjExZyAiLCB3aWR0aCk7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICI7XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgUFJFRkVSRU5DTE9TVVJFICIpOwotICAgICAgICBpZiAobG9jYXRpb24gJiYgKCpsb2NhdGlvbiAhPSAwKSkgewotICAgICAgICAgICAgaWYgKHN0cmNtcChsb2NhdGlvbiwgIkFCT1ZFIikgJiYgc3RyY21wKGxvY2F0aW9uLCAiQkVMT1ciKSkgewotICAgICAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiUFJFRkVSRU5DTE9TVVJFIGluIExheWVyKEN1dCkgY2FuIG9ubHkgYmUgQUJPVkUsIEJFTE9XLlxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiJXMgIiwgbG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIlLjExZyAlLjExZyAiLCBvdmVyaGFuZzEsIG92ZXJoYW5nMik7Ci0gICAgICAgIGlmICh3aWR0aCkKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJXSURUSCAlLjExZyAiLCB3aWR0aCk7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICI7XG4iKTsKLSAgICB9Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19MQVlFUjsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TGF5ZXJSZXNpc3RhbmNlUGVyQ3V0KGRvdWJsZSByZXNpc3RhbmNlKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNDdXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOyAgLy8gb25seSBjdXQgY2FsbHMgdGhpcyBmdW5jCi0gICAgaWYgKGxlZndJc01heHZpYXN0YWNrKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7ICAvLyBMYXllciBhZnRlciBtYXhpbXVtIHN0YWNrZWQtdmlhCi0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBSRVNJU1RBTkNFUEVSQ1VUICUuMTFnIDtcbiIsIHJlc2lzdGFuY2UpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIFJFU0lTVEFOQ0VQRVJDVVQgJS4xMWcgO1xuIiwgcmVzaXN0YW5jZSk7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19MQVlFUjsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3RW5kTGF5ZXIoY29uc3QgY2hhciAqbGF5ZXJOYW1lKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJFTkQgJXNcblxuIiwgbGF5ZXJOYW1lKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJFTkQgJXNcblxuIiwgbGF5ZXJOYW1lKTsKLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTdGF0ZSA9IExFRldfTEFZRVJfRU5EOwotICAgIGxlZndJc0N1dCA9IDA7Ci0gICAgbGVmd0lzSW1wbGFudCA9IDA7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nKGNvbnN0IGNoYXIgKmxheWVyTmFtZSkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1N0YXRlID09IExFRldfTEFZRVJST1VUSU5HX1NUQVJUIHx8Ci0gICAgICAgIGxlZndTdGF0ZSA9PSBMRUZXX0xBWUVSUk9VVElORykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19JTklUICYmIGxlZndTdGF0ZSA8IExFRldfRU5EKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7ICAvLyBub3Qgb2YgdGhlIEVORHMKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiTEFZRVIgJXNcbiIsIGxheWVyTmFtZSk7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBUWVBFIFJPVVRJTkcgO1xuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIkxBWUVSICVzXG4iLCBsYXllck5hbWUpOwotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgVFlQRSBST1VUSU5HIDtcbiIpOwotICAgIH0KLSAgICBsZWZ3SXNSb3V0aW5nID0gMTsKLSAgICBsZWZ3SXNSb3V0aW5nUmVxRGF0YSA9IDA7Ci0gICAgbGVmd0xpbmVzID0gbGVmd0xpbmVzICsgMjsKLSAgICBsZWZ3U3RhdGUgPSBMRUZXX0xBWUVSUk9VVElOR19TVEFSVDsKLSAgICBsZWZ3U3luQXJyYXlbTEVGV19MQVlFUlJPVVRJTkdfU1RBUlRdID0gMTsKLQotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndMYXllclJvdXRpbmcoY29uc3QgY2hhciAqZGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICBkb3VibGUgICAgIHdpZHRoKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElOR19TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc1JvdXRpbmcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOyAgLy8gb25seSByb3V0aW5nIGNhbGxzIHRoaXMgZnVuYwotICAgIC8vIHRoaXMgcm91dGluZSBzaG91bGQgY2FsbCBvbmx5IG9uY2UgcGVyIGxheWVyIHJvdXRpbmcKLSAgICBpZiAobGVmd1N5bkFycmF5W0xFRldfTEFZRVJST1VUSU5HXSkKLSAgICAgICAgcmV0dXJuIExFRldfQUxSRUFEWV9ERUZJTkVEOwotICAgIGlmIChwcnRTZW1pQ29sb24pIHsKLSAgICAgICAgLy8gdGhlIHByZXZpb3VzIHN0YXRlbWVudCBoYXNuJ3Qgd3JpdHRlbiB0aGUgOyB5ZXQKLSAgICAgICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiO1xuIik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICI7XG4iKTsKLSAgICAgICAgcHJ0U2VtaUNvbG9uID0gMDsKLSAgICB9Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpIHsKLSAgICAgICAgaWYgKCFkaXJlY3Rpb24gfHwgZGlyZWN0aW9uID09IDAgfHwgKmRpcmVjdGlvbiA9PSAwKSB7Ci0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiRElSRUNUSU9OIGlzIHJlcXVpcmVkIGluIExheWVyKFJvdXRpbmcpLlxuIik7Ci0gICAgICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RyY21wKGRpcmVjdGlvbiwgIkhPUklaT05UQUwiKSAmJiBzdHJjbXAoZGlyZWN0aW9uLCAiVkVSVElDQUwiKSAmJgotICAgICAgICAgICAgc3RyY21wKGRpcmVjdGlvbiwgIkRJQUc0NSIpICYmIHN0cmNtcChkaXJlY3Rpb24sICJESUFHMTM1IikpIHsKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopCi0gICAgICAgICAgICAgICAgICAgICAiRElSRUNUSU9OIGluIExheWVyKFJvdXRpbmcpIGNhbiBvbmx5IGJlIEhPUklaT05UQUwsIFZFUlRJQ0FMLCBESUFHNDUsIERJQUcxMzUuXG4iKTsKLSAgICAgICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOyAvLyBkaXJlY3Rpb24gaXMgZWl0aGVyIEhPUklaT05UQUwsIFZFUlRJQ0FMLCBESUFHNDUsIERJQUcxMzUgb25seQotICAgICAgICB9Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBESVJFQ1RJT04gJXMgO1xuIiwgZGlyZWN0aW9uKTsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIFdJRFRIICUuMTFnIDtcbiIsIHdpZHRoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoIWRpcmVjdGlvbiB8fCBkaXJlY3Rpb24gPT0gMCB8fCAqZGlyZWN0aW9uID09IDApIHsKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJESVJFQ1RJT04gaXMgcmVxdWlyZWQgaW4gTGF5ZXIoUm91dGluZykuXG4iKTsKLSAgICAgICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdHJjbXAoZGlyZWN0aW9uLCAiSE9SSVpPTlRBTCIpICYmIHN0cmNtcChkaXJlY3Rpb24sICJWRVJUSUNBTCIpICYmCi0gICAgICAgICAgICBzdHJjbXAoZGlyZWN0aW9uLCAiRElBRzQ1IikgJiYgc3RyY21wKGRpcmVjdGlvbiwgIkRJQUcxMzUiKSkgewotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwKLSAgICAgICAgICAgICAgICAgICAgIkRJUkVDVElPTiBpbiBMYXllcihSb3V0aW5nKSBjYW4gb25seSBiZSBIT1JJWk9OVEFMLCBWRVJUSUNBTCwgRElBRzQ1LCBESUFHMTM1LlxuIik7Ci0gICAgICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsgLy8gZGlyZWN0aW9uIGlzIGVpdGhlciBIT1JJWk9OVEFMLCBWRVJUSUNBTCwgRElBRzQ1LCBESUFHMTM1IG9ubHkKLSAgICAgICAgfQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgRElSRUNUSU9OICVzIDtcbiIsIGRpcmVjdGlvbik7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBXSURUSCAlLjExZyA7XG4iLCB3aWR0aCk7Ci0gICAgfQotCi0gICAgbGVmd0xpbmVzICs9IDI7Ci0gICAgbGVmd0lzUm91dGluZ1JlcURhdGEgPSAxOwotICAgIGxlZndTeW5BcnJheVtMRUZXX0xBWUVSUk9VVElOR10gPSAxOwotICAgIGxlZndJc1JvdXRpbmdNaW5DdXQgPSAwOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndMYXllclJvdXRpbmdQaXRjaChkb3VibGUgcGl0Y2gpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElORykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzUm91dGluZykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7ICAvLyBvbmx5IHJvdXRpbmcgY2FsbHMgdGhpcyBmdW5jCi0gICAgaWYgKHBydFNlbWlDb2xvbikgewotICAgICAgICAvLyB0aGUgcHJldmlvdXMgc3RhdGVtZW50IGhhc24ndCB3cml0dGVuIHRoZSA7IHlldAotICAgICAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICI7XG4iKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIjtcbiIpOwotICAgICAgICBwcnRTZW1pQ29sb24gPSAwOwotICAgIH0KLSAgICAvLyB0aGlzIHJvdXRpbmUgc2hvdWxkIGNhbGwgb25seSBvbmNlIHBlciBsYXllciByb3V0aW5nCi0gICAgLy8gaXQgaXMgcmVxdWlyZWQgZm9yIFNFIG9ubHksIG90aGVyIGlzIG9wdGlvbmFsCi0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBQSVRDSCAlLjExZyA7XG4iLCBwaXRjaCk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgUElUQ0ggJS4xMWcgO1xuIiwgcGl0Y2gpOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndMYXllclJvdXRpbmdQaXRjaFhZRGlzdGFuY2UoZG91YmxlICB4RGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgeURpc3RhbmNlKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElOR19TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc1JvdXRpbmcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOyAgLy8gb25seSByb3V0aW5nIGNhbGxzIHRoaXMgZnVuYwotICAgIGlmIChwcnRTZW1pQ29sb24pIHsKLSAgICAgICAgLy8gdGhlIHByZXZpb3VzIHN0YXRlbWVudCBoYXNuJ3Qgd3JpdHRlbiB0aGUgOyB5ZXQKLSAgICAgICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiO1xuIik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICI7XG4iKTsKLSAgICAgICAgcHJ0U2VtaUNvbG9uID0gMDsKLSAgICB9Ci0gICAgLy8gdGhpcyByb3V0aW5lIHNob3VsZCBjYWxsIG9ubHkgb25jZSBwZXIgbGF5ZXIgcm91dGluZwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgUElUQ0ggJS4xMWcgJS4xMWcgO1xuIiwKLSAgICAgICAgICAgICAgICAgeERpc3RhbmNlLCB5RGlzdGFuY2UpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIFBJVENIICUuMTFnICUuMTFnIDtcbiIsIHhEaXN0YW5jZSwgeURpc3RhbmNlKTsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TGF5ZXJSb3V0aW5nT2Zmc2V0KGRvdWJsZSBvZmZzZXQpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElORykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzUm91dGluZykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7ICAvLyBvbmx5IHJvdXRpbmcgY2FsbHMgdGhpcyBmdW5jCi0gICAgaWYgKHBydFNlbWlDb2xvbikgewotICAgICAgICAvLyB0aGUgcHJldmlvdXMgc3RhdGVtZW50IGhhc24ndCB3cml0dGVuIHRoZSA7IHlldAotICAgICAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICI7XG4iKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIjtcbiIpOwotICAgICAgICBwcnRTZW1pQ29sb24gPSAwOwotICAgIH0KLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIE9GRlNFVCAlLjExZyA7XG4iLCBvZmZzZXQpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIE9GRlNFVCAlLjExZyA7XG4iLCBvZmZzZXQpOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndMYXllclJvdXRpbmdPZmZzZXRYWURpc3RhbmNlKGRvdWJsZSB4RGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeURpc3RhbmNlKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElOR19TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc1JvdXRpbmcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOyAgLy8gb25seSByb3V0aW5nIGNhbGxzIHRoaXMgZnVuYwotICAgIGlmIChwcnRTZW1pQ29sb24pIHsKLSAgICAgICAgLy8gdGhlIHByZXZpb3VzIHN0YXRlbWVudCBoYXNuJ3Qgd3JpdHRlbiB0aGUgOyB5ZXQKLSAgICAgICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiO1xuIik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICI7XG4iKTsKLSAgICAgICAgcHJ0U2VtaUNvbG9uID0gMDsKLSAgICB9Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBPRkZTRVQgJS4xMWcgJS4xMWcgO1xuIiwKLSAgICAgICAgICAgICAgICAgeERpc3RhbmNlLCB5RGlzdGFuY2UpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIE9GRlNFVCAlLjExZyAlLjExZyA7XG4iLCB4RGlzdGFuY2UsIHlEaXN0YW5jZSk7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd0xheWVyUm91dGluZ0RpYWdQaXRjaChkb3VibGUgZGlzdGFuY2UpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElORykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzUm91dGluZykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7ICAvLyBvbmx5IHJvdXRpbmcgY2FsbHMgdGhpcyBmdW5jCi0gICAgaWYgKHBydFNlbWlDb2xvbikgewotICAgICAgICAvLyB0aGUgcHJldmlvdXMgc3RhdGVtZW50IGhhc24ndCB3cml0dGVuIHRoZSA7IHlldAotICAgICAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICI7XG4iKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIjtcbiIpOwotICAgICAgICBwcnRTZW1pQ29sb24gPSAwOwotICAgIH0KLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIERJQUdQSVRDSCAlLjExZyA7XG4iLCBkaXN0YW5jZSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgRElBR1BJVENIICUuMTFnIDtcbiIsIGRpc3RhbmNlKTsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TGF5ZXJSb3V0aW5nRGlhZ1BpdGNoWFlEaXN0YW5jZShkb3VibGUgIHhEaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgeURpc3RhbmNlKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElOR19TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc1JvdXRpbmcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOyAgLy8gb25seSByb3V0aW5nIGNhbGxzIHRoaXMgZnVuYwotICAgIGlmIChwcnRTZW1pQ29sb24pIHsKLSAgICAgICAgLy8gdGhlIHByZXZpb3VzIHN0YXRlbWVudCBoYXNuJ3Qgd3JpdHRlbiB0aGUgOyB5ZXQKLSAgICAgICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiO1xuIik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICI7XG4iKTsKLSAgICAgICAgcHJ0U2VtaUNvbG9uID0gMDsKLSAgICB9Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBESUFHUElUQ0ggJS4xMWcgJS4xMWcgO1xuIiwKLSAgICAgICAgICAgICAgICAgeERpc3RhbmNlLCB5RGlzdGFuY2UpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIERJQUdQSVRDSCAlLjExZyAlLjExZyA7XG4iLCB4RGlzdGFuY2UsIHlEaXN0YW5jZSk7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd0xheWVyUm91dGluZ0RpYWdXaWR0aChkb3VibGUgZGlhZ1dpZHRoKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElOR19TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc1JvdXRpbmcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOyAgLy8gb25seSByb3V0aW5nIGNhbGxzIHRoaXMgZnVuYwotICAgIGlmIChwcnRTZW1pQ29sb24pIHsKLSAgICAgICAgLy8gdGhlIHByZXZpb3VzIHN0YXRlbWVudCBoYXNuJ3Qgd3JpdHRlbiB0aGUgOyB5ZXQKLSAgICAgICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiO1xuIik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICI7XG4iKTsKLSAgICAgICAgcHJ0U2VtaUNvbG9uID0gMDsKLSAgICB9Ci0gICAgLy8gdGhpcyByb3V0aW5lIHNob3VsZCBjYWxsIG9ubHkgb25jZSBwZXIgbGF5ZXIgcm91dGluZwotICAgIC8vIGl0IGlzIHJlcXVpcmVkIGZvciBTRSBvbmx5LCBvdGhlciBpcyBvcHRpb25hbAotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgRElBR1dJRFRIICUuMTFnIDtcbiIsIGRpYWdXaWR0aCk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgRElBR1dJRFRIICUuMTFnIDtcbiIsIGRpYWdXaWR0aCk7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd0xheWVyUm91dGluZ0RpYWdTcGFjaW5nKGRvdWJsZSBkaWFnU3BhY2luZykKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNSb3V0aW5nKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsgIC8vIG9ubHkgcm91dGluZyBjYWxscyB0aGlzIGZ1bmMKLSAgICBpZiAocHJ0U2VtaUNvbG9uKSB7Ci0gICAgICAgIC8vIHRoZSBwcmV2aW91cyBzdGF0ZW1lbnQgaGFzbid0IHdyaXR0ZW4gdGhlIDsgeWV0Ci0gICAgICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIjtcbiIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiO1xuIik7Ci0gICAgICAgIHBydFNlbWlDb2xvbiA9IDA7Ci0gICAgfQotICAgIC8vIHRoaXMgcm91dGluZSBzaG91bGQgY2FsbCBvbmx5IG9uY2UgcGVyIGxheWVyIHJvdXRpbmcKLSAgICAvLyBpdCBpcyByZXF1aXJlZCBmb3IgU0Ugb25seSwgb3RoZXIgaXMgb3B0aW9uYWwKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIERJQUdTUEFDSU5HICUuMTFnIDtcbiIsIGRpYWdTcGFjaW5nKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBESUFHU1BBQ0lORyAlLjExZyA7XG4iLCBkaWFnU3BhY2luZyk7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd0xheWVyUm91dGluZ0RpYWdNaW5FZGdlTGVuZ3RoKGRvdWJsZSBkaWFnTGVuZ3RoKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElOR19TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc1JvdXRpbmcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOyAgLy8gb25seSByb3V0aW5nIGNhbGxzIHRoaXMgZnVuYwotICAgIGlmIChwcnRTZW1pQ29sb24pIHsKLSAgICAgICAgLy8gdGhlIHByZXZpb3VzIHN0YXRlbWVudCBoYXNuJ3Qgd3JpdHRlbiB0aGUgOyB5ZXQKLSAgICAgICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiO1xuIik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICI7XG4iKTsKLSAgICAgICAgcHJ0U2VtaUNvbG9uID0gMDsKLSAgICB9Ci0gICAgLy8gdGhpcyByb3V0aW5lIHNob3VsZCBjYWxsIG9ubHkgb25jZSBwZXIgbGF5ZXIgcm91dGluZwotICAgIC8vIGl0IGlzIHJlcXVpcmVkIGZvciBTRSBvbmx5LCBvdGhlciBpcyBvcHRpb25hbAotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgRElBR01JTkVER0VMRU5HVEggJS4xMWcgO1xuIiwgZGlhZ0xlbmd0aCk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgRElBR01JTkVER0VMRU5HVEggJS4xMWcgO1xuIiwgZGlhZ0xlbmd0aCk7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd0xheWVyUm91dGluZ0FyZWEoZG91YmxlIGFyZWEpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElORykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzUm91dGluZykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7ICAvLyBvbmx5IHJvdXRpbmcgY2FsbHMgdGhpcyBmdW5jCi0gICAgaWYgKHBydFNlbWlDb2xvbikgewotICAgICAgICAvLyB0aGUgcHJldmlvdXMgc3RhdGVtZW50IGhhc24ndCB3cml0dGVuIHRoZSA7IHlldAotICAgICAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICI7XG4iKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIjtcbiIpOwotICAgICAgICBwcnRTZW1pQ29sb24gPSAwOwotICAgIH0KLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIEFSRUEgJS4xMWcgO1xuIiwgYXJlYSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgQVJFQSAlLjExZyA7XG4iLCBhcmVhKTsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TGF5ZXJSb3V0aW5nTWluc2l6ZShpbnQgICAgIG51bVJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICptaW5XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgKm1pbkxlbmd0aCkKLXsKLSAgICBpbnQgaTsKLQotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElOR19TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc1JvdXRpbmcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOyAgLy8gb25seSByb3V0aW5nIGNhbGxzIHRoaXMgZnVuYwotICAgIGlmIChwcnRTZW1pQ29sb24pIHsKLSAgICAgICAgLy8gdGhlIHByZXZpb3VzIHN0YXRlbWVudCBoYXNuJ3Qgd3JpdHRlbiB0aGUgOyB5ZXQKLSAgICAgICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiO1xuIik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICI7XG4iKTsKLSAgICAgICAgcHJ0U2VtaUNvbG9uID0gMDsKLSAgICB9Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpIHsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIE1JTlNJWkUgIik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1SZWN0OyBpKyspCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiJS4xMWcgJS4xMWcgIiwgbWluV2lkdGhbaV0sIG1pbkxlbmd0aFtpXSk7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICI7XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgTUlOU0laRSAiKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVJlY3Q7IGkrKykKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIlLjExZyAlLjExZyAiLCBtaW5XaWR0aFtpXSwgbWluTGVuZ3RoW2ldKTsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIjtcbiIpOwotICAgIH0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TGF5ZXJSb3V0aW5nTWluaW11bWN1dChkb3VibGUgICBudW1DdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgbWluV2lkdGgpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElORykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzUm91dGluZykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7ICAvLyBvbmx5IHJvdXRpbmcgY2FsbHMgdGhpcyBmdW5jCi0gICAgaWYgKHBydFNlbWlDb2xvbikgewotICAgICAgICAvLyB0aGUgcHJldmlvdXMgc3RhdGVtZW50IGhhc24ndCB3cml0dGVuIHRoZSA7IHlldAotICAgICAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICI7XG4iKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIjtcbiIpOwotICAgICAgICBwcnRTZW1pQ29sb24gPSAwOwotICAgIH0KLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIE1JTklNVU1DVVQgJS4xMWcgV0lEVEggJS4xMWcgIiwgbnVtQ3V0cywKLSAgICAgICAgICAgICAgICAgbWluV2lkdGgpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIE1JTklNVU1DVVQgJS4xMWcgV0lEVEggJS4xMWcgIiwgbnVtQ3V0cywgbWluV2lkdGgpOwotICAgIGxlZndMaW5lcysrOwotICAgIHBydFNlbWlDb2xvbiA9IDE7Ci0gICAgbGVmd0lzUm91dGluZ01pbkN1dCA9IDE7Ci0gICAgbGVmd0lzUm91dGluZ01pbkN1dERpc3QgPSAwOwotICAgIGxlZndJc1JvdXRpbmdNaW5DdXRMZW4gPSAwOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi0vLyA1LjcKLWludAotbGVmd0xheWVyUm91dGluZ01pbmltdW1jdXRXaXRoaW4oZG91YmxlIG51bUN1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbWluV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgY3V0RGlzdGFuY2UpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElORykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzUm91dGluZykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7ICAvLyBvbmx5IHJvdXRpbmcgY2FsbHMgdGhpcyBmdW5jCi0gICAgaWYgKHBydFNlbWlDb2xvbikgewotICAgICAgICAvLyB0aGUgcHJldmlvdXMgc3RhdGVtZW50IGhhc24ndCB3cml0dGVuIHRoZSA7IHlldAotICAgICAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICI7XG4iKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIjtcbiIpOwotICAgICAgICBwcnRTZW1pQ29sb24gPSAwOwotICAgIH0KLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIE1JTklNVU1DVVQgJS4xMWcgV0lEVEggJS4xMWcgV0lUSElOICUuMTFnICIsCi0gICAgICAgICAgICAgICAgIG51bUN1dHMsIG1pbldpZHRoLCBjdXREaXN0YW5jZSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgTUlOSU1VTUNVVCAlLjExZyBXSURUSCAlLjExZyBXSVRISU4gJS4xMWcgIiwKLSAgICAgICAgICAgICAgICBudW1DdXRzLCBtaW5XaWR0aCwgY3V0RGlzdGFuY2UpOwotICAgIGxlZndMaW5lcysrOwotICAgIHBydFNlbWlDb2xvbiA9IDE7Ci0gICAgbGVmd0lzUm91dGluZ01pbkN1dCA9IDE7Ci0gICAgbGVmd0lzUm91dGluZ01pbkN1dERpc3QgPSAwOwotICAgIGxlZndJc1JvdXRpbmdNaW5DdXRMZW4gPSAwOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndMYXllclJvdXRpbmdNaW5pbXVtY3V0Q29ubmVjdGlvbnMoY29uc3QgY2hhciAqZGlyZWN0aW9uKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3SXNSb3V0aW5nTWluQ3V0IHx8IGxlZndJc1JvdXRpbmdNaW5DdXREaXN0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgLy8gbGVmd0xheWVyUm91dGluZ01pbmltdW1jdXQgaGFzIG5vdCBiZWluZyBjYWxsZWQgb3IKLSAgICAvLyBsZWZ3TGF5ZXJSb3V0aW5nTWluaW11bWN1dENvbm5lY3Rpb25zIGhhcyBhbHJlYWR5IGNhbGxlZAotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiXG4gICAgICVzICIsIGRpcmVjdGlvbik7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiXG4gICAgICVzICIsIGRpcmVjdGlvbik7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgcHJ0U2VtaUNvbG9uID0gMTsKLSAgICBsZWZ3SXNSb3V0aW5nTWluQ3V0RGlzdCA9IDE7Ci0gICAgaWYgKGxlZndJc1JvdXRpbmdNaW5DdXRMZW4pICAgLy8gYm90aCBkaXN0YW5jZSAmIGxlbmd0aCB3aXRoaW4gaGFzIGRlZmluZWQKLSAgICAgICAgbGVmd0lzUm91dGluZ01pbkN1dCA9IDA7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd0xheWVyUm91dGluZ01pbmltdW1jdXRMZW5ndGhXaXRoaW4oZG91YmxlICAgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgZGlzdGFuY2UpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndJc1JvdXRpbmdNaW5DdXQgfHwgbGVmd0lzUm91dGluZ01pbkN1dExlbikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIC8vIGxlZndMYXllclJvdXRpbmdNaW5pbXVtY3V0IGhhcyBub3QgYmVpbmcgY2FsbGVkIG9yCi0gICAgLy8gbGVmd0xheWVyUm91dGluZ01pbmltdW1jdXRMZW5ndGhXaXRoaW4gaGFzIGFscmVhZHkgY2FsbGVkCi0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgIExFTkdUSCAlLjExZyBXSVRISU4gJS4xMWcgIiwKLSAgICAgICAgICAgICAgICAgbGVuZ3RoLCBkaXN0YW5jZSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICBMRU5HVEggJS4xMWcgV0lUSElOICUuMTFnICIsIGxlbmd0aCwgZGlzdGFuY2UpOwotICAgIGxlZndMaW5lcysrOwotICAgIHBydFNlbWlDb2xvbiA9IDE7Ci0gICAgbGVmd0lzUm91dGluZ01pbkN1dExlbiA9IDE7Ci0gICAgaWYgKGxlZndJc1JvdXRpbmdNaW5DdXREaXN0KSAgIC8vIGJvdGggZGlzdGFuY2UgJiBsZW5ndGggd2l0aGluIGhhcyBkZWZpbmVkCi0gICAgICAgIGxlZndJc1JvdXRpbmdNaW5DdXQgPSAwOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndMYXllclJvdXRpbmdTcGFjaW5nKGRvdWJsZSBzcGFjaW5nKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElOR19TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc1JvdXRpbmcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOyAgLy8gb25seSByb3V0aW5nIGNhbGxzIHRoaXMgZnVuYwotICAgIGlmIChwcnRTZW1pQ29sb24pIHsKLSAgICAgICAgLy8gdGhlIHByZXZpb3VzIHN0YXRlbWVudCBoYXNuJ3Qgd3JpdHRlbiB0aGUgOyB5ZXQKLSAgICAgICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiO1xuIik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICI7XG4iKTsKLSAgICAgICAgcHJ0U2VtaUNvbG9uID0gMDsKLSAgICB9Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBTUEFDSU5HICUuMTFnICIsIHNwYWNpbmcpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIFNQQUNJTkcgJS4xMWcgIiwgc3BhY2luZyk7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd0hhc0xheWVyUm91dGluZ1JhbmdlID0gMDsgLy8gaW5pdGlhbGl6YXRpb24KLSAgICBsZWZ3SGFzTGF5ZXJSb3V0aW5nU3BhY2luZyA9IDE7IC8vIGluaXRpYWxpemF0aW9uCi0gICAgbGVmd0hhc0xheWVyUm91dGluZ0VvbCA9IDA7IC8vIGluaXRpYWxpemF0aW9uCi0gICAgcHJ0TmV3TGluZSA9IDE7Ci0gICAgcHJ0U2VtaUNvbG9uID0gMTsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ1JhbmdlKGRvdWJsZSBsZWZ0UmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSByaWdodFJhbmdlKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElOR19TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc1JvdXRpbmcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOyAgLy8gb25seSByb3V0aW5nIGNhbGxzIHRoaXMgZnVuYwotICAgIGlmICghbGVmd0hhc0xheWVyUm91dGluZ1NwYWNpbmcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiUkFOR0UgJS4xMWcgJS4xMWcgIiwgbGVmdFJhbmdlLCByaWdodFJhbmdlKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJSQU5HRSAlLjExZyAlLjExZyAiLCBsZWZ0UmFuZ2UsIHJpZ2h0UmFuZ2UpOwotICAgIGxlZndIYXNMYXllclJvdXRpbmdSYW5nZSA9IDE7IC8vIGluaXRpYWxpemF0aW9uCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgcHJ0TmV3TGluZSA9IDE7Ci0gICAgcHJ0U2VtaUNvbG9uID0gMTsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ1JhbmdlVXNlTGVuZ3RoVGhyZXNob2xkKCkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNSb3V0aW5nKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsgIC8vIG9ubHkgcm91dGluZyBjYWxscyB0aGlzIGZ1bmMKLSAgICBpZiAoIWxlZndIYXNMYXllclJvdXRpbmdSYW5nZSkgewotICAgICAgICAvLyBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IGlmIHJhbmdlIGFyZSBub24gemVybwotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLAotICAgICAgICAgICAgICAgICJFUlJPUiAoTEVGV1JJVC00MDAzKTogbGVmd0xheWVyUm91dGluZ1NwYWNpbmdVc2VMZW5ndGhUaHJlc2hvbGQgY2Fubm90IGJlIGNhbGxlZCBpZlxuIik7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsCi0gICAgICAgICAgICAgICAgIiAgICAgICBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ1JhbmdlIGhhcyBub3QgYmVlbiBjYWxsZWQuXG4iKTsKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgfQotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiXG4gICAgIFVTRUxFTkdUSFRIUkVTSE9MRCAiKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJcbiAgICAgVVNFTEVOR1RIVEhSRVNIT0xEICIpOwotICAgIHBydFNlbWlDb2xvbiA9IDE7Ci0gICAgcHJ0TmV3TGluZSA9IDE7Ci0gICAgbGVmd0hhc0xheWVyUm91dGluZ1JhbmdlID0gMDsgLy8gcmVzZXQgdG8gMAotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndMYXllclJvdXRpbmdTcGFjaW5nUmFuZ2VJbmZsdWVuY2UoZG91YmxlICAgIGluZlZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgc3ViTWluV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICBzdWJNYXhXaWR0aCkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNSb3V0aW5nKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsgIC8vIG9ubHkgcm91dGluZyBjYWxscyB0aGlzIGZ1bmMKLSAgICBpZiAoIWxlZndIYXNMYXllclJvdXRpbmdSYW5nZSkgewotICAgICAgICAvLyBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IGlmIHJhbmdlIGFyZSBub24gemVybwotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLAotICAgICAgICAgICAgICAgICJFUlJPUiAoTEVGV1JJVC00MDA0KTogbGVmd0xheWVyUm91dGluZ1NwYWNpbmdJbmZsdWVuY2UgY2Fubm90IGJlIGNhbGxlZCBpZlxuIik7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsCi0gICAgICAgICAgICAgICAgIiAgICAgICBsZWZSYW5nZSBhbmQgcmlnaHRSYW5nZSBpbiBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZyBhcmUgYm90aCB6ZXJvLlxuIik7Ci0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIH0KLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiXG4gICAgIElORkxVRU5DRSAlLjExZyAiLCBpbmZWYWx1ZSk7Ci0gICAgICAgIGlmIChzdWJNaW5XaWR0aCB8fCBzdWJNYXhXaWR0aCkKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJSQU5HRSAlLjExZyAlLjExZyAiLAotICAgICAgICAgICAgICAgICAgICAgc3ViTWluV2lkdGgsIHN1Yk1heFdpZHRoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiXG4gICAgIElORkxVRU5DRSAlLjExZyAiLCBpbmZWYWx1ZSk7Ci0gICAgICAgIGlmIChzdWJNaW5XaWR0aCB8fCBzdWJNYXhXaWR0aCkKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsIChjaGFyKikgIlJBTkdFICUuMTFnICUuMTFnICIsCi0gICAgICAgICAgICAgICAgICAgIHN1Yk1pbldpZHRoLCBzdWJNYXhXaWR0aCk7Ci0gICAgfQotICAgIHBydE5ld0xpbmUgPSAxOwotICAgIHBydFNlbWlDb2xvbiA9IDE7Ci0gICAgbGVmd0hhc0xheWVyUm91dGluZ1JhbmdlID0gMDsgLy8gcmVzZXQgdG8gMAotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndMYXllclJvdXRpbmdTcGFjaW5nUmFuZ2VSYW5nZShkb3VibGUgICAgbWluV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgIG1heFdpZHRoKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElOR19TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc1JvdXRpbmcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOyAgLy8gb25seSByb3V0aW5nIGNhbGxzIHRoaXMgZnVuYwotICAgIGlmICghbGVmd0hhc0xheWVyUm91dGluZ1JhbmdlKSB7Ci0gICAgICAgIC8vIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgaWYgcmFuZ2UgYXJlIG5vbiB6ZXJvCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsCi0gICAgICAgICAgICAgICAgIkVSUk9SIChMRUZXUklULTQwMDUpOiBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ0luZmx1ZW5jZSBjYW5ub3QgYmUgY2FsbGVkIGlmXG4iKTsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwKLSAgICAgICAgICAgICAgICAiICAgICAgIGxlZlJhbmdlIGFuZCByaWdodFJhbmdlIGluIGxlZndMYXllclJvdXRpbmdTcGFjaW5nIGFyZSBib3RoIHplcm8uXG4iKTsKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgfQotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KSB7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJSQU5HRSAlLjExZyAlLjExZyAiLCBtaW5XaWR0aCwgbWF4V2lkdGgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsIChjaGFyKikgIlJBTkdFICUuMTFnICUuMTFnICIsIG1pbldpZHRoLCBtYXhXaWR0aCk7Ci0gICAgfQotICAgIHBydE5ld0xpbmUgPSAxOwotICAgIHBydFNlbWlDb2xvbiA9IDE7Ci0gICAgbGVmd0hhc0xheWVyUm91dGluZ1JhbmdlID0gMDsgLy8gcmVzZXQgdG8gMAotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndMYXllclJvdXRpbmdTcGFjaW5nTGVuZ3RoVGhyZXNob2xkKGRvdWJsZSAgIGxlbmd0aFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgbWluV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICBtYXhXaWR0aCkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNSb3V0aW5nKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsgIC8vIG9ubHkgcm91dGluZyBjYWxscyB0aGlzIGZ1bmMKLSAgICBpZiAoIWxlZndIYXNMYXllclJvdXRpbmdTcGFjaW5nKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgTEVOR1RIVEhSRVNIT0xEICUuMTFnICIsIGxlbmd0aFZhbHVlKTsKLSAgICAgICAgaWYgKG1pbldpZHRoIHx8IG1heFdpZHRoKSB7Ci0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiUkFOR0UgJS4xMWcgJS4xMWcgIiwgbWluV2lkdGgsIG1heFdpZHRoKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBMRU5HVEhUSFJFU0hPTEQgJS4xMWcgIiwgbGVuZ3RoVmFsdWUpOwotICAgICAgICBpZiAobWluV2lkdGggfHwgbWF4V2lkdGgpIHsKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJSQU5HRSAlLjExZyAlLjExZyAiLCBtaW5XaWR0aCwgbWF4V2lkdGgpOwotICAgICAgICB9Ci0gICAgfQotICAgIHBydFNlbWlDb2xvbiA9IDE7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLS8vIDUuNwotaW50Ci1sZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ1NhbWVOZXQoaW50IFBHT25seSkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNSb3V0aW5nKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsgIC8vIG9ubHkgcm91dGluZyBjYWxscyB0aGlzIGZ1bmMKLSAgICBpZiAoIWxlZndIYXNMYXllclJvdXRpbmdTcGFjaW5nKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBpZiAoUEdPbmx5KQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIFNBTUVORVQgUEdPTkxZICIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgU0FNRU5FVCAiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoUEdPbmx5KQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIFNBTUVORVQgUEdPTkxZICIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgU0FNRU5FVCAiKTsKLSAgICB9Ci0gICAgcHJ0U2VtaUNvbG9uID0gMTsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotLy8gNS43Ci1pbnQKLWxlZndMYXllclJvdXRpbmdTcGFjaW5nRW5kT2ZMaW5lKGRvdWJsZSBlb2xXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBlb2xXaXRoaW4pCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElORykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzUm91dGluZykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7ICAvLyBvbmx5IHJvdXRpbmcgY2FsbHMgdGhpcyBmdW5jCi0gICAgaWYgKGxlZndIYXNMYXllclJvdXRpbmdFb2wpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOy8vIGFscmVhZHkgZGVmaW5lZCBpbiBTcGFjaW5nCi0gICAgaWYgKHBydFNlbWlDb2xvbikgewotICAgICAgICAvLyB0aGUgcHJldmlvdXMgc3RhdGVtZW50IGhhc24ndCB3cml0dGVuIHRoZSA7IHlldAotICAgICAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICI7XG4iKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIjtcbiIpOwotICAgICAgICBwcnRTZW1pQ29sb24gPSAwOwotICAgIH0KLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIEVORE9GTElORSAlLjExZyBXSVRISU4gJS4xMWcgIiwgZW9sV2lkdGgsCi0gICAgICAgICAgICAgICAgIGVvbFdpdGhpbik7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgRU5ET0ZMSU5FICUuMTFnIFdJVEhJTiAlLjExZyAiLCBlb2xXaWR0aCwKLSAgICAgICAgICAgICAgICBlb2xXaXRoaW4pOwotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndIYXNMYXllclJvdXRpbmdFb2wgPSAxOwotICAgIHBydFNlbWlDb2xvbiA9IDE7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLS8vIDUuNwotaW50Ci1sZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ0VPTFBhcmFsbGVsKGRvdWJsZSAgIHBhclNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICBwYXJXaXRoaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgIHR3b0VkZ2VzKQotewotICAgIGlmICghbGVmd0hhc0xheWVyUm91dGluZ0VvbCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ly8gRW5kT2ZMaW5lIGluIG5vdCBkZWZpbmVkCi0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpIHsKLSAgICAgICAgaWYgKHR3b0VkZ2VzKQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIlBBUkFMTEVMRURHRSAlLjExZyBXSVRISU4gJS4xMWcgVFdPRURHRVMgO1xuIiwKLSAgICAgICAgICAgICAgICAgICAgIHBhclNwYWNlLCBwYXJXaXRoaW4pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiUEFSQUxMRUxFREdFICUuMTFnIFdJVEhJTiAlLjExZyA7XG4iLAotICAgICAgICAgICAgICAgICAgICAgcGFyU3BhY2UsIHBhcldpdGhpbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHR3b0VkZ2VzKQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIlBBUkFMTEVMRURHRSAlLjExZyBXSVRISU4gJS4xMWcgVFdPRURHRVMgO1xuIiwKLSAgICAgICAgICAgICAgICAgICAgcGFyU3BhY2UsIHBhcldpdGhpbik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJQQVJBTExFTEVER0UgJS4xMWcgV0lUSElOICUuMTFnIDtcbiIsCi0gICAgICAgICAgICAgICAgICAgIHBhclNwYWNlLCBwYXJXaXRoaW4pOwotICAgIH0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3SGFzTGF5ZXJSb3V0aW5nRW9sID0gMDsKLSAgICBwcnRTZW1pQ29sb24gPSAwOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi0vLyA1LjcKLWludAotbGVmd0xheWVyUm91dGluZ1NwYWNpbmdOb3RjaExlbmd0aChkb3VibGUgbWluTkxlbmd0aCkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNSb3V0aW5nKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsgIC8vIG9ubHkgcm91dGluZyBjYWxscyB0aGlzIGZ1bmMKLSAgICBpZiAocHJ0U2VtaUNvbG9uKSB7Ci0gICAgICAgIC8vIHRoZSBwcmV2aW91cyBzdGF0ZW1lbnQgaGFzbid0IHdyaXR0ZW4gdGhlIDsgeWV0Ci0gICAgICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIjtcbiIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiO1xuIik7Ci0gICAgICAgIHBydFNlbWlDb2xvbiA9IDA7Ci0gICAgfQotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgTk9UQ0hMRU5HVEggJS4xMWcgO1xuIiwgbWluTkxlbmd0aCk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgTk9UQ0hMRU5HVEggJS4xMWcgO1xuIiwgbWluTkxlbmd0aCk7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLS8vIDUuNwotaW50Ci1sZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ0VuZE9mTm90Y2hXaWR0aChkb3VibGUgICBlb25XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgIG1pbk5TcGFjaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgbWluTkxlbmd0aCkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNSb3V0aW5nKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsgIC8vIG9ubHkgcm91dGluZyBjYWxscyB0aGlzIGZ1bmMKLSAgICBpZiAocHJ0U2VtaUNvbG9uKSB7Ci0gICAgICAgIC8vIHRoZSBwcmV2aW91cyBzdGF0ZW1lbnQgaGFzbid0IHdyaXR0ZW4gdGhlIDsgeWV0Ci0gICAgICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIjtcbiIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiO1xuIik7Ci0gICAgICAgIHBydFNlbWlDb2xvbiA9IDA7Ci0gICAgfQotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgRU5ET0ZOT1RDSFdJRFRIICUuMTFnIE5PVENIU1BBQ0lORyAlLjExZyBOT1RDSExFTkdUSCAlLjExZyA7XG4iLAotICAgICAgICAgICAgICAgICBlb25XaWR0aCwgbWluTlNwYWNpbmcsIG1pbk5MZW5ndGgpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICBFTkRPRk5PVENIV0lEVEggJS4xMWcgTk9UQ0hTUEFDSU5HICUuMTFnIE5PVENITEVOR1RIICUuMTFnIDtcbiIsCi0gICAgICAgICAgICAgICAgZW9uV2lkdGgsIG1pbk5TcGFjaW5nLCBtaW5OTGVuZ3RoKTsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TGF5ZXJSb3V0aW5nV2lyZUV4dGVuc2lvbihkb3VibGUgd2lyZUV4dGVuc2lvbikKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNSb3V0aW5nKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsgIC8vIG9ubHkgcm91dGluZyBjYWxscyB0aGlzIGZ1bmMKLSAgICBpZiAocHJ0U2VtaUNvbG9uKSB7Ci0gICAgICAgIC8vIHRoZSBwcmV2aW91cyBzdGF0ZW1lbnQgaGFzbid0IHdyaXR0ZW4gdGhlIDsgeWV0Ci0gICAgICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIjtcbiIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiO1xuIik7Ci0gICAgICAgIHBydFNlbWlDb2xvbiA9IDA7Ci0gICAgfQotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgV0lSRUVYVEVOU0lPTiAlLjExZyA7XG4iLCB3aXJlRXh0ZW5zaW9uKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBXSVJFRVhURU5TSU9OICUuMTFnIDtcbiIsIHdpcmVFeHRlbnNpb24pOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndMYXllclJvdXRpbmdSZXNpc3RhbmNlKGNvbnN0IGNoYXIgKnJlc2lzdGFuY2UpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElORykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzUm91dGluZykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7ICAvLyBvbmx5IHJvdXRpbmcgY2FsbHMgdGhpcyBmdW5jCi0gICAgaWYgKCFyZXNpc3RhbmNlIHx8IHJlc2lzdGFuY2UgPT0gMCB8fCAqcmVzaXN0YW5jZSA9PSAwKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAocHJ0U2VtaUNvbG9uKSB7Ci0gICAgICAgIC8vIHRoZSBwcmV2aW91cyBzdGF0ZW1lbnQgaGFzbid0IHdyaXR0ZW4gdGhlIDsgeWV0Ci0gICAgICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIjtcbiIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiO1xuIik7Ci0gICAgICAgIHBydFNlbWlDb2xvbiA9IDA7Ci0gICAgfQotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgUkVTSVNUQU5DRSBSUEVSU1EgJXMgO1xuIiwgcmVzaXN0YW5jZSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgUkVTSVNUQU5DRSBSUEVSU1EgJXMgO1xuIiwgcmVzaXN0YW5jZSk7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd0xheWVyUm91dGluZ0NhcGFjaXRhbmNlKGNvbnN0IGNoYXIgKmNhcGFjaXRhbmNlKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElOR19TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc1JvdXRpbmcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOyAgLy8gb25seSByb3V0aW5nIGNhbGxzIHRoaXMgZnVuYwotICAgIGlmIChwcnRTZW1pQ29sb24pIHsKLSAgICAgICAgLy8gdGhlIHByZXZpb3VzIHN0YXRlbWVudCBoYXNuJ3Qgd3JpdHRlbiB0aGUgOyB5ZXQKLSAgICAgICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiO1xuIik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICI7XG4iKTsKLSAgICAgICAgcHJ0U2VtaUNvbG9uID0gMDsKLSAgICB9Ci0gICAgaWYgKCFjYXBhY2l0YW5jZSB8fCBjYXBhY2l0YW5jZSA9PSAwIHx8ICpjYXBhY2l0YW5jZSA9PSAwKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIENBUEFDSVRBTkNFIENQRVJTUURJU1QgJXMgO1xuIiwgY2FwYWNpdGFuY2UpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIENBUEFDSVRBTkNFIENQRVJTUURJU1QgJXMgO1xuIiwgY2FwYWNpdGFuY2UpOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndMYXllclJvdXRpbmdIZWlnaHQoZG91YmxlIGhlaWdodCkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNSb3V0aW5nKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsgIC8vIG9ubHkgcm91dGluZyBjYWxscyB0aGlzIGZ1bmMKLSAgICBpZiAocHJ0U2VtaUNvbG9uKSB7Ci0gICAgICAgIC8vIHRoZSBwcmV2aW91cyBzdGF0ZW1lbnQgaGFzbid0IHdyaXR0ZW4gdGhlIDsgeWV0Ci0gICAgICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIjtcbiIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiO1xuIik7Ci0gICAgICAgIHBydFNlbWlDb2xvbiA9IDA7Ci0gICAgfQotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgSEVJR0hUICUuMTFnIDtcbiIsIGhlaWdodCk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgSEVJR0hUICUuMTFnIDtcbiIsIGhlaWdodCk7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd0xheWVyUm91dGluZ1RoaWNrbmVzcyhkb3VibGUgdGhpY2tuZXNzKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElOR19TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc1JvdXRpbmcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOyAgLy8gb25seSByb3V0aW5nIGNhbGxzIHRoaXMgZnVuYwotICAgIGlmIChwcnRTZW1pQ29sb24pIHsKLSAgICAgICAgLy8gdGhlIHByZXZpb3VzIHN0YXRlbWVudCBoYXNuJ3Qgd3JpdHRlbiB0aGUgOyB5ZXQKLSAgICAgICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiO1xuIik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICI7XG4iKTsKLSAgICAgICAgcHJ0U2VtaUNvbG9uID0gMDsKLSAgICB9Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBUSElDS05FU1MgJS4xMWcgO1xuIiwgdGhpY2tuZXNzKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBUSElDS05FU1MgJS4xMWcgO1xuIiwgdGhpY2tuZXNzKTsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TGF5ZXJSb3V0aW5nU2hyaW5rYWdlKGRvdWJsZSBzaHJpbmthZ2UpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElORykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzUm91dGluZykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7ICAvLyBvbmx5IHJvdXRpbmcgY2FsbHMgdGhpcyBmdW5jCi0gICAgaWYgKHBydFNlbWlDb2xvbikgewotICAgICAgICAvLyB0aGUgcHJldmlvdXMgc3RhdGVtZW50IGhhc24ndCB3cml0dGVuIHRoZSA7IHlldAotICAgICAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICI7XG4iKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIjtcbiIpOwotICAgICAgICBwcnRTZW1pQ29sb24gPSAwOwotICAgIH0KLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIFNIUklOS0FHRSAlLjExZyA7XG4iLCBzaHJpbmthZ2UpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIFNIUklOS0FHRSAlLjExZyA7XG4iLCBzaHJpbmthZ2UpOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndMYXllclJvdXRpbmdDYXBNdWx0aXBsaWVyKGRvdWJsZSBjYXBNdWx0aXBsaWVyKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElOR19TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc1JvdXRpbmcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOyAgLy8gb25seSByb3V0aW5nIGNhbGxzIHRoaXMgZnVuYwotICAgIGlmIChwcnRTZW1pQ29sb24pIHsKLSAgICAgICAgLy8gdGhlIHByZXZpb3VzIHN0YXRlbWVudCBoYXNuJ3Qgd3JpdHRlbiB0aGUgOyB5ZXQKLSAgICAgICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiO1xuIik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICI7XG4iKTsKLSAgICAgICAgcHJ0U2VtaUNvbG9uID0gMDsKLSAgICB9Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBDQVBNVUxUSVBMSUVSICUuMTFnIDtcbiIsIGNhcE11bHRpcGxpZXIpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIENBUE1VTFRJUExJRVIgJS4xMWcgO1xuIiwgY2FwTXVsdGlwbGllcik7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd0xheWVyUm91dGluZ0VkZ2VDYXAoZG91YmxlIGVkZ2VDYXApCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElORykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzUm91dGluZykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7ICAvLyBvbmx5IHJvdXRpbmcgY2FsbHMgdGhpcyBmdW5jCi0gICAgaWYgKHBydFNlbWlDb2xvbikgewotICAgICAgICAvLyB0aGUgcHJldmlvdXMgc3RhdGVtZW50IGhhc24ndCB3cml0dGVuIHRoZSA7IHlldAotICAgICAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICI7XG4iKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIjtcbiIpOwotICAgICAgICBwcnRTZW1pQ29sb24gPSAwOwotICAgIH0KLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIEVER0VDQVBBQ0lUQU5DRSAlLjExZyA7XG4iLCBlZGdlQ2FwKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBFREdFQ0FQQUNJVEFOQ0UgJS4xMWcgO1xuIiwgZWRnZUNhcCk7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd0xheWVyUm91dGluZ0FudGVubmFBcmVhKGRvdWJsZSBhbnRlbm5hQXJlYSkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNSb3V0aW5nKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsgIC8vIG9ubHkgcm91dGluZyBjYWxscyB0aGlzIGZ1bmMKLSAgICBpZiAocHJ0U2VtaUNvbG9uKSB7Ci0gICAgICAgIC8vIHRoZSBwcmV2aW91cyBzdGF0ZW1lbnQgaGFzbid0IHdyaXR0ZW4gdGhlIDsgeWV0Ci0gICAgICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIjtcbiIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiO1xuIik7Ci0gICAgICAgIHBydFNlbWlDb2xvbiA9IDA7Ci0gICAgfQotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgQU5URU5OQUFSRUFGQUNUT1IgJS4xMWcgO1xuIiwgYW50ZW5uYUFyZWEpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIEFOVEVOTkFBUkVBRkFDVE9SICUuMTFnIDtcbiIsIGFudGVubmFBcmVhKTsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TGF5ZXJSb3V0aW5nQW50ZW5uYUxlbmd0aChkb3VibGUgYW50ZW5uYUxlbmd0aCkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNSb3V0aW5nKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsgIC8vIG9ubHkgcm91dGluZyBjYWxscyB0aGlzIGZ1bmMKLSAgICBpZiAocHJ0U2VtaUNvbG9uKSB7Ci0gICAgICAgIC8vIHRoZSBwcmV2aW91cyBzdGF0ZW1lbnQgaGFzbid0IHdyaXR0ZW4gdGhlIDsgeWV0Ci0gICAgICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIjtcbiIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiO1xuIik7Ci0gICAgICAgIHBydFNlbWlDb2xvbiA9IDA7Ci0gICAgfQotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgQU5URU5OQUxFTkdUSEZBQ1RPUiAlLjExZyA7XG4iLAotICAgICAgICAgICAgICAgICBhbnRlbm5hTGVuZ3RoKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBBTlRFTk5BTEVOR1RIRkFDVE9SICUuMTFnIDtcbiIsIGFudGVubmFMZW5ndGgpOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndMYXllclJvdXRpbmdNYXh3aWR0aChkb3VibGUgd2lkdGgpCi17Ci0KLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNSb3V0aW5nKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsgIC8vIG9ubHkgcm91dGluZyBjYWxscyB0aGlzIGZ1bmMKLSAgICBpZiAocHJ0U2VtaUNvbG9uKSB7Ci0gICAgICAgIC8vIHRoZSBwcmV2aW91cyBzdGF0ZW1lbnQgaGFzbid0IHdyaXR0ZW4gdGhlIDsgeWV0Ci0gICAgICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIjtcbiIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiO1xuIik7Ci0gICAgICAgIHBydFNlbWlDb2xvbiA9IDA7Ci0gICAgfQotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgTUFYV0lEVEggJS4xMWcgO1xuIiwgd2lkdGgpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIE1BWFdJRFRIICUuMTFnIDtcbiIsIHdpZHRoKTsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TGF5ZXJSb3V0aW5nTWlud2lkdGgoZG91YmxlIHdpZHRoKQotewotCi0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElORykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzUm91dGluZykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7ICAvLyBvbmx5IHJvdXRpbmcgY2FsbHMgdGhpcyBmdW5jCi0gICAgaWYgKHBydFNlbWlDb2xvbikgewotICAgICAgICAvLyB0aGUgcHJldmlvdXMgc3RhdGVtZW50IGhhc24ndCB3cml0dGVuIHRoZSA7IHlldAotICAgICAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICI7XG4iKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIjtcbiIpOwotICAgICAgICBwcnRTZW1pQ29sb24gPSAwOwotICAgIH0KLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIE1JTldJRFRIICUuMTFnIDtcbiIsIHdpZHRoKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBNSU5XSURUSCAlLjExZyA7XG4iLCB3aWR0aCk7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd0xheWVyUm91dGluZ01pbmVuY2xvc2VkYXJlYShpbnQgICAgIG51bU1pbmVuY2xvc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICphcmVhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICp3aWR0aCkKLXsKLSAgICBpbnQgaTsKLQotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElOR19TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc1JvdXRpbmcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOyAgLy8gb25seSByb3V0aW5nIGNhbGxzIHRoaXMgZnVuYwotICAgIGlmIChwcnRTZW1pQ29sb24pIHsKLSAgICAgICAgLy8gdGhlIHByZXZpb3VzIHN0YXRlbWVudCBoYXNuJ3Qgd3JpdHRlbiB0aGUgOyB5ZXQKLSAgICAgICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiO1xuIik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICI7XG4iKTsKLSAgICAgICAgcHJ0U2VtaUNvbG9uID0gMDsKLSAgICB9Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bU1pbmVuY2xvc2VkOyBpKyspIHsKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBNSU5FTkNMT1NFREFSRUEgJS4xMWcgIiwgYXJlYVtpXSk7Ci0gICAgICAgICAgICBpZiAod2lkdGhbaV0gIT0gMCkKLSAgICAgICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiV0lEVEggJS4xMWcgIiwgd2lkdGhbaV0pOwotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIjtcbiIpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bU1pbmVuY2xvc2VkOyBpKyspIHsKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBNSU5FTkNMT1NFREFSRUEgJS4xMWcgIiwgYXJlYVtpXSk7Ci0gICAgICAgICAgICBpZiAod2lkdGhbaV0gIT0gMCkKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiV0lEVEggJS4xMWcgIiwgd2lkdGhbaV0pOwotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIjtcbiIpOwotICAgICAgICB9Ci0gICAgfQotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndMYXllclJvdXRpbmdNaW5zdGVwKGRvdWJsZSBkaXN0YW5jZSkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNSb3V0aW5nKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsgIC8vIG9ubHkgcm91dGluZyBjYWxscyB0aGlzIGZ1bmMKLSAgICBpZiAocHJ0U2VtaUNvbG9uKSB7Ci0gICAgICAgIC8vIHRoZSBwcmV2aW91cyBzdGF0ZW1lbnQgaGFzbid0IHdyaXR0ZW4gdGhlIDsgeWV0Ci0gICAgICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIjtcbiIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiO1xuIik7Ci0gICAgICAgIHBydFNlbWlDb2xvbiA9IDA7Ci0gICAgfQotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgTUlOU1RFUCAlLjExZyA7XG4iLCBkaXN0YW5jZSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgTUlOU1RFUCAlLjExZyA7XG4iLCBkaXN0YW5jZSk7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd0xheWVyUm91dGluZ01pbnN0ZXBXaXRoT3B0aW9ucyhkb3VibGUgICAgICAgZGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAqcnVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgIG1heExlbmd0aCkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNSb3V0aW5nKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsgIC8vIG9ubHkgcm91dGluZyBjYWxscyB0aGlzIGZ1bmMKLSAgICBpZiAocHJ0U2VtaUNvbG9uKSB7Ci0gICAgICAgIC8vIHRoZSBwcmV2aW91cyBzdGF0ZW1lbnQgaGFzbid0IHdyaXR0ZW4gdGhlIDsgeWV0Ci0gICAgICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIjtcbiIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiO1xuIik7Ci0gICAgICAgIHBydFNlbWlDb2xvbiA9IDA7Ci0gICAgfQotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgTUlOU1RFUCAlLjExZyAiLCBkaXN0YW5jZSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgTUlOU1RFUCAlLjExZyAiLCBkaXN0YW5jZSk7Ci0gICAgaWYgKHJ1bGUgJiYgKChzdHJjbXAocnVsZSwgIklOU0lERUNPUk5FUiIpID09IDApIHx8Ci0gICAgICAgICAgICAgICAgIChzdHJjbXAocnVsZSwgIk9VVFNJREVDT1JORVIiKSA9PSAwKSB8fCAoc3RyY21wKHJ1bGUsICJTVEVQIikgPT0gMCkpKSB7Ci0gICAgICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiVzICIsIHJ1bGUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiJXMgIiwgcnVsZSk7Ci0gICAgfQotICAgIGlmIChtYXhMZW5ndGgpIHsKLSAgICAgICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiTEVOR1RIU1VNICUuMTFnICIsIG1heExlbmd0aCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJMRU5HVEhTVU0gJS4xMWcgIiwgbWF4TGVuZ3RoKTsKLSAgICB9Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICI7XG4iKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICI7XG4iKTsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotLy8gNS43Ci1pbnQKLWxlZndMYXllclJvdXRpbmdNaW5zdGVwTWF4RWRnZXMoZG91YmxlICBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICBtYXhFZGdlcykKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNSb3V0aW5nKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsgIC8vIG9ubHkgcm91dGluZyBjYWxscyB0aGlzIGZ1bmMKLSAgICBpZiAocHJ0U2VtaUNvbG9uKSB7Ci0gICAgICAgIC8vIHRoZSBwcmV2aW91cyBzdGF0ZW1lbnQgaGFzbid0IHdyaXR0ZW4gdGhlIDsgeWV0Ci0gICAgICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIjtcbiIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiO1xuIik7Ci0gICAgICAgIHBydFNlbWlDb2xvbiA9IDA7Ci0gICAgfQotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgTUlOU1RFUCAlLjExZyBNQVhFREdFUyAlLjExZyA7XG4iLCBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgbWF4RWRnZXMpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIE1JTlNURVAgJS4xMWcgTUFYRURHRVMgJS4xMWcgO1xuIiwgZGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgbWF4RWRnZXMpOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndMYXllclJvdXRpbmdQcm90cnVzaW9uKGRvdWJsZSAgIHdpZHRoMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgIGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgIHdpZHRoMikKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNSb3V0aW5nKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsgIC8vIG9ubHkgcm91dGluZyBjYWxscyB0aGlzIGZ1bmMKLSAgICBpZiAocHJ0U2VtaUNvbG9uKSB7Ci0gICAgICAgIC8vIHRoZSBwcmV2aW91cyBzdGF0ZW1lbnQgaGFzbid0IHdyaXR0ZW4gdGhlIDsgeWV0Ci0gICAgICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIjtcbiIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiO1xuIik7Ci0gICAgICAgIHBydFNlbWlDb2xvbiA9IDA7Ci0gICAgfQotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgUFJPVFJVU0lPTldJRFRIICUuMTFnIExFTkdUSCAlLjExZyBXSURUSCAlLjExZyA7XG4iLAotICAgICAgICAgICAgICAgICB3aWR0aDEsIGxlbmd0aCwgd2lkdGgyKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBQUk9UUlVTSU9OV0lEVEggJS4xMWcgTEVOR1RIICUuMTFnIFdJRFRIICUuMTFnIDtcbiIsCi0gICAgICAgICAgICAgICAgd2lkdGgxLCBsZW5ndGgsIHdpZHRoMik7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd0xheWVyUm91dGluZ1N0YXJ0U3BhY2luZ3RhYmxlUGFyYWxsZWwoaW50ICAgICAgIG51bUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAqbGVuZ3RoKQotewotICAgIGludCBpOwotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElOR19TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc1JvdXRpbmdSZXFEYXRhKSB7Ci0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICB9Ci0gICAgaWYgKHBydFNlbWlDb2xvbikgewotICAgICAgICAvLyB0aGUgcHJldmlvdXMgc3RhdGVtZW50IGhhc24ndCB3cml0dGVuIHRoZSA7IHlldAotICAgICAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICI7XG4iKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIjtcbiIpOwotICAgICAgICBwcnRTZW1pQ29sb24gPSAwOwotICAgIH0KLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgU1BBQ0lOR1RBQkxFXG4iKTsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgUEFSQUxMRUxSVU5MRU5HVEgiKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUxlbmd0aDsgaSsrKQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAlLjExZyIsIGxlbmd0aFtpXSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIFNQQUNJTkdUQUJMRVxuIik7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgIFBBUkFMTEVMUlVOTEVOR1RIIik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1MZW5ndGg7IGkrKykKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgJS4xMWciLCBsZW5ndGhbaV0pOwotICAgIH0KLSAgICBsZWZ3U3RhdGUgPSBMRUZXX0xBWUVSUk9VVElOR19TUF9TVEFSVDsKLSAgICBsZWZ3TGluZXMgKz0gMjsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ3RhYmxlUGFyYWxsZWxXaWR0aChkb3VibGUgICAgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbnVtU3BhY2luZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAqc3BhY2luZykKLXsKLSAgICBpbnQgaTsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdfU1BfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HV0lEVEgpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiXG4gICAgICAgV0lEVEggJS4xMWciLCB3aWR0aCk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1TcGFjaW5nOyBpKyspCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICUuMTFnIiwgc3BhY2luZ1tpXSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIlxuICAgICAgIFdJRFRIICUuMTFnIiwgd2lkdGgpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtU3BhY2luZzsgaSsrKQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAlLjExZyIsIHNwYWNpbmdbaV0pOwotICAgIH0KLSAgICBsZWZ3U3RhdGUgPSBMRUZXX0xBWUVSUk9VVElOR1dJRFRIOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndMYXllclJvdXRpbmdTdGFydFNwYWNpbmd0YWJsZUluZmx1ZW5jZSgpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElORykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzUm91dGluZ1JlcURhdGEpIHsKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIH0KLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgU1BBQ0lOR1RBQkxFXG4iKTsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgSU5GTFVFTkNFIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIFNQQUNJTkdUQUJMRVxuIik7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgIElORkxVRU5DRSIpOwotICAgIH0KLSAgICBsZWZ3U3RhdGUgPSBMRUZXX0xBWUVSUk9VVElOR1dJRFRIOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndMYXllclJvdXRpbmdTcGFjaW5nSW5mbHVlbmNlV2lkdGgoZG91YmxlICAgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgZGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICBzcGFjaW5nKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElOR1dJRFRIKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLAotICAgICAgICAgICAgICAgICAoY2hhciopICJcbiAgICAgICBXSURUSCAlLjExZyBXSVRISU4gJS4xMSUuMTFnU1BBQ0lORyAlLjExZyIsCi0gICAgICAgICAgICAgICAgIHdpZHRoLCBkaXN0YW5jZSwgc3BhY2luZyk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiXG4gICAgICAgV0lEVEggJS4xMWcgV0lUSElOICUuMTFnIFNQQUNJTkcgJS4xMWciLCB3aWR0aCwKLSAgICAgICAgICAgICAgICBkaXN0YW5jZSwgc3BhY2luZyk7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd0xheWVyUm91dGluZ1N0YXJ0U3BhY2luZ3RhYmxlVHdvV2lkdGhzKCkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNSb3V0aW5nUmVxRGF0YSkgewotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgfQotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KSB7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBTUEFDSU5HVEFCTEVcbiIpOwotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICBUV09XSURUSFMiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgU1BBQ0lOR1RBQkxFXG4iKTsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgVFdPV0lEVEhTIik7Ci0gICAgfQotICAgIGxlZndTdGF0ZSA9IExFRldfTEFZRVJST1VUSU5HV0lEVEg7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd0xheWVyUm91dGluZ1NwYWNpbmd0YWJsZVR3b1dpZHRoc1dpZHRoKGRvdWJsZSAgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgIHJ1bkxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICBudW1TcGFjaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICpzcGFjaW5nKQotewotICAgIGludCBpOwotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElOR19TUF9TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdXSURUSCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KSB7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJcbiAgICAgICBXSURUSCAlLjExZyIsIHdpZHRoKTsKLSAgICAgICAgaWYgKHJ1bkxlbmd0aCkKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgUFJMICUuMTFnIiwgcnVuTGVuZ3RoKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVNwYWNpbmc7IGkrKykKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgJS4xMWciLCBzcGFjaW5nW2ldKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiXG4gICAgICAgV0lEVEggJS4xMWciLCB3aWR0aCk7Ci0gICAgICAgIGlmIChydW5MZW5ndGgpCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiIFBSTCAlLjExZyIsIHJ1bkxlbmd0aCk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1TcGFjaW5nOyBpKyspCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICUuMTFnIiwgc3BhY2luZ1tpXSk7Ci0gICAgfQotICAgIGxlZndTdGF0ZSA9IExFRldfTEFZRVJST1VUSU5HV0lEVEg7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd0xheWVyUm91dGluZUVuZFNwYWNpbmd0YWJsZSgpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HV0lEVEgpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiA7XG4iKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgO1xuIik7Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3U3RhdGUgPSBMRUZXX0xBWUVSUk9VVElORzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3RW5kTGF5ZXJSb3V0aW5nKGNvbnN0IGNoYXIgKmxheWVyTmFtZSkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNSb3V0aW5nUmVxRGF0YSkgewotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgfQotICAgIGlmIChwcnRTZW1pQ29sb24pIHsKLSAgICAgICAgLy8gdGhlIHByZXZpb3VzIHN0YXRlbWVudCBoYXNuJ3Qgd3JpdHRlbiB0aGUgOyB5ZXQKLSAgICAgICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiO1xuIik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICI7XG4iKTsKLSAgICAgICAgcHJ0U2VtaUNvbG9uID0gMDsKLSAgICB9Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJFTkQgJXNcblxuIiwgbGF5ZXJOYW1lKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJFTkQgJXNcblxuIiwgbGF5ZXJOYW1lKTsKLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTeW5BcnJheVtMRUZXX0xBWUVSUk9VVElOR10gPSAwOwotICAgIGxlZndTdGF0ZSA9IExFRldfTEFZRVJST1VUSU5HX0VORDsKLSAgICBsZWZ3SXNSb3V0aW5nID0gMDsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TGF5ZXJBQ0N1cnJlbnREZW5zaXR5KGNvbnN0IGNoYXIgICAgKnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICAgdmFsdWUpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HX1NUQVJUICYmIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElORwotICAgICAgICAmJiBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUl9TVEFSVCAmJiBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChzdHJjbXAodHlwZSwgIlBFQUsiKSAmJiBzdHJjbXAodHlwZSwgIkFWRVJBR0UiKSAmJiBzdHJjbXAodHlwZSwgIlJNUyIpKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsgIC8vIHR5cGUgaXMgUEVBSywgQVZFUkFHRSAmIFJNUyBvbmx5Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpIHsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIEFDQ1VSUkVOVERFTlNJVFkgJXMiLCB0eXBlKTsKLSAgICAgICAgbGVmd0xpbmVzKys7Ci0gICAgICAgIGxlZndUYWJsZUxlbiA9IDU7Ci0gICAgICAgIGlmICh2YWx1ZSkKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgJS4xMWcgO1xuIiwgdmFsdWUpOwotICAgICAgICAgICAgLy8gdGhhdCdzIGl0IGZvciBhY2N1cnJlbnRkZW5zaXR5Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIlxuIik7Ci0gICAgICAgICAgICAvLyBleHBlY3QgdG8gaGF2ZSBmcmVxdWVuY3kgJiB0YWJsZWVudHJpZXMKLSAgICAgICAgICAgIGxlZndPbGRTdGF0ZSA9IGxlZndTdGF0ZTsgICAvLyBzYXZlIHRoZSBwcmV2aW91cyBzdGF0ZQotICAgICAgICAgICAgbGVmd1N0YXRlID0gTEVGV19MQVlFUkFDQ1VSUkVOVDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBBQ0NVUlJFTlRERU5TSVRZICVzIiwgdHlwZSk7Ci0gICAgICAgIGxlZndMaW5lcysrOwotICAgICAgICBsZWZ3VGFibGVMZW4gPSA1OwotICAgICAgICBpZiAodmFsdWUpCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICUuMTFnIDtcbiIsIHZhbHVlKTsgLy8gdGhhdCdzIGl0IGZvciBhY2N1cnJlbnRkZW5zaXR5Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIlxuIik7ICAvLyAgZXhwZWN0IHRvIGhhdmUgZnJlcXVlbmN5ICYgdGFibGVlbnRyaWVzCi0gICAgICAgICAgICBsZWZ3T2xkU3RhdGUgPSBsZWZ3U3RhdGU7ICAvLyBzYXZlIHRoZSBwcmV2aW91cyBzdGF0ZQotICAgICAgICAgICAgbGVmd1N0YXRlID0gTEVGV19MQVlFUkFDQ1VSUkVOVDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TGF5ZXJBQ0ZyZXF1ZW5jeShpbnQgICAgbnVtRnJlcXVlbmN5LAotICAgICAgICAgICAgICAgICAgICAgZG91YmxlICpmcmVxdWVuY3kpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUkFDQ1VSUkVOVCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotCi0gICAgaWYgKG51bUZyZXF1ZW5jeSA8PSAwKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsgIC8vIGZyZXF1ZW5jeSBhcmUgcmVxdWlyZWQKLQotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KSB7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICBGUkVRVUVOQ1kgIik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1GcmVxdWVuY3k7IGkrKykgewotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiUuMTFnICIsICpmcmVxdWVuY3krKyk7Ci0gICAgICAgIH0KLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIjtcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBGUkVRVUVOQ1kgIik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1GcmVxdWVuY3k7IGkrKykgewotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiUuMTFnICIsICpmcmVxdWVuY3krKyk7Ci0gICAgICAgIH0KLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIjtcbiIpOwotICAgIH0KLQotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndMYXllckFDV2lkdGgoaW50ICAgIG51bVdpZHRocywKLSAgICAgICAgICAgICAgICAgZG91YmxlICp3aWR0aHMpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUkFDQ1VSUkVOVCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotCi0gICAgaWYgKG51bVdpZHRocyA8PSAwKQotICAgICAgICByZXR1cm4gTEVGV19PSzsgIC8vIHdpZHRoIGlzIG9wdGlvbmFsCi0KLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgV0lEVEggIik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1XaWR0aHM7IGkrKykgewotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiUuMTFnICIsICp3aWR0aHMrKyk7Ci0gICAgICAgIH0KLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIjtcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBXSURUSCAiKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVdpZHRoczsgaSsrKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiJS4xMWcgIiwgKndpZHRocysrKTsKLSAgICAgICAgfQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiO1xuIik7Ci0gICAgfQotCi0gICAgbGVmd1RhYmxlTGVuID0gbnVtV2lkdGhzOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndMYXllckFDQ3V0YXJlYShpbnQgICAgICBudW1DdXRhcmVhcywKLSAgICAgICAgICAgICAgICAgICBkb3VibGUgICAqY3V0YXJlYXMpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUkFDQ1VSUkVOVCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotCi0gICAgaWYgKG51bUN1dGFyZWFzIDw9IDApCi0gICAgICAgIHJldHVybiBMRUZXX09LOyAgLy8gY3V0YXJlYSBpcyBvcHRpb25hbAotCi0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpIHsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIENVVEFSRUEgIik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1DdXRhcmVhczsgaSsrKSB7Ci0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiJS4xMWcgIiwgKmN1dGFyZWFzKyspOwotICAgICAgICB9Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICI7XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgQ1VUQVJFQSAiKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUN1dGFyZWFzOyBpKyspIHsKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIlLjExZyAiLCAqY3V0YXJlYXMrKyk7Ci0gICAgICAgIH0KLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIjtcbiIpOwotICAgIH0KLQotICAgIGxlZndUYWJsZUxlbiA9IG51bUN1dGFyZWFzOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndMYXllckFDVGFibGVFbnRyaWVzKGludCAgICAgbnVtRW50cmllcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgKmVudHJpZXMpCi17Ci0gICAgaW50IGk7Ci0gICAgaW50IGogPSAwOwotCi0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTEFZRVJBQ0NVUlJFTlQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLQotICAgIGlmIChudW1FbnRyaWVzIDw9IDApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOyAgLy8gdGFibGVFbnRyaWVzIGFyZSByZXF1aXJlZAotCi0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpIHsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIFRBQkxFRU5UUklFU1xuICAgICAgICAiKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUVudHJpZXM7IGkrKykgewotICAgICAgICAgICAgaWYgKCsraiA+IGxlZndUYWJsZUxlbikgewotICAgICAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJcbiAgICAgICAgIik7Ci0gICAgICAgICAgICAgICAgaiA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiJS4xMWcgIiwgKmVudHJpZXMrKyk7Ci0gICAgICAgIH0KLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIjtcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBUQUJMRUVOVFJJRVNcbiAgICAgICAgIik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1FbnRyaWVzOyBpKyspIHsKLSAgICAgICAgICAgIGlmICgrK2ogPiBsZWZ3VGFibGVMZW4pIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiXG4gICAgICAgICIpOwotICAgICAgICAgICAgICAgIGogPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiUuMTFnICIsICplbnRyaWVzKyspOwotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICI7XG4iKTsKLSAgICB9Ci0KLSAgICBsZWZ3U3RhdGUgPSBsZWZ3T2xkU3RhdGU7ICAgLy8gcmVzdG9yZSB0aGUgcHJldmlvdXMgc3RhdGUKLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TGF5ZXJEQ0N1cnJlbnREZW5zaXR5KGNvbnN0IGNoYXIgICAgKnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICAgdmFsdWUpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HX1NUQVJUICYmIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElORwotICAgICAgICAmJiBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUl9TVEFSVCAmJiBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChzdHJjbXAodHlwZSwgIkFWRVJBR0UiKSkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7ICAvLyB0eXBlIGlzIEFWRVJBR0UKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgRENDVVJSRU5UREVOU0lUWSAlcyIsIHR5cGUpOwotICAgICAgICBsZWZ3TGluZXMrKzsKLSAgICAgICAgbGVmd1RhYmxlTGVuID0gNTsKLSAgICAgICAgaWYgKHZhbHVlKQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAlLjExZyA7XG4iLCB2YWx1ZSk7Ci0gICAgICAgICAgICAvLyB0aGF0J3MgaXQgZm9yIGFjY3VycmVudGRlbnNpdHkKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiXG4iKTsKLSAgICAgICAgICAgIC8vIGV4cGVjdCB0byBoYXZlIGZyZXF1ZW5jeSAmIHRhYmxlZW50cmllcwotICAgICAgICAgICAgbGVmd09sZFN0YXRlID0gbGVmd1N0YXRlOyAgIC8vIHNhdmUgdGhlIHByZXZpb3VzIHN0YXRlCi0gICAgICAgICAgICBsZWZ3U3RhdGUgPSBMRUZXX0xBWUVSRENDVVJSRU5UOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIERDQ1VSUkVOVERFTlNJVFkgJXMiLCB0eXBlKTsKLSAgICAgICAgbGVmd0xpbmVzKys7Ci0gICAgICAgIGxlZndUYWJsZUxlbiA9IDU7Ci0gICAgICAgIGlmICh2YWx1ZSkKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgJS4xMWcgO1xuIiwgdmFsdWUpOyAvLyB0aGF0J3MgaXQgZm9yIGFjY3VycmVudGRlbnNpdHkKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiXG4iKTsgICAgLy8gZXhwZWN0IHRvIGhhdmUgZnJlcXVlbmN5ICYgdGFibGVlbnRyaWVzCi0gICAgICAgICAgICBsZWZ3T2xkU3RhdGUgPSBsZWZ3U3RhdGU7ICAgLy8gc2F2ZSB0aGUgcHJldmlvdXMgc3RhdGUKLSAgICAgICAgICAgIGxlZndTdGF0ZSA9IExFRldfTEFZRVJEQ0NVUlJFTlQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd0xheWVyRENXaWR0aChpbnQgICAgbnVtV2lkdGhzLAotICAgICAgICAgICAgICAgICBkb3VibGUgKndpZHRocykKLXsKLSAgICBpbnQgaTsKLQotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSRENDVVJSRU5UKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0KLSAgICAvLyB3aWR0aCBpcyBhbGxvd2VkIGluIExheWVyIHJvdXRpbmcgb25seQotICAgIGlmIChsZWZ3T2xkU3RhdGUgIT0gTEVGV19MQVlFUl9TVEFSVCAmJiBsZWZ3T2xkU3RhdGUgIT0gTEVGV19MQVlFUiAmJgotICAgICAgICBsZWZ3T2xkU3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdfU1RBUlQgJiYKLSAgICAgICAgbGVmd09sZFN0YXRlICE9IExFRldfTEFZRVJST1VUSU5HKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLQotICAgIGlmIChudW1XaWR0aHMgPD0gMCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7ICAvLyB3aWR0aCBpcyByZXF1aXJlZAotCi0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpIHsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIFdJRFRIICIpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtV2lkdGhzOyBpKyspIHsKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIlLjExZyAiLCAqd2lkdGhzKyspOwotICAgICAgICB9Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICI7XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgV0lEVEggIik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1XaWR0aHM7IGkrKykgewotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiUuMTFnICIsICp3aWR0aHMrKyk7Ci0gICAgICAgIH0KLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIjtcbiIpOwotICAgIH0KLQotICAgIGxlZndUYWJsZUxlbiA9IG51bVdpZHRoczsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TGF5ZXJEQ0N1dGFyZWEoaW50ICAgICAgbnVtQ3V0YXJlYXMsCi0gICAgICAgICAgICAgICAgICAgZG91YmxlICAgKmN1dGFyZWFzKQotewotICAgIGludCBpOwotCi0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTEFZRVJEQ0NVUlJFTlQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLQotICAgIC8vIGN1dGFyZWEgaXMgYWxsb3dlZCBpbiBMYXllciBub24tcm91dGluZyBvbmx5Ci0gICAgaWYgKGxlZndPbGRTdGF0ZSAhPSBMRUZXX0xBWUVSX1NUQVJUICYmIGxlZndPbGRTdGF0ZSAhPSBMRUZXX0xBWUVSICYmCi0gICAgICAgIGxlZndPbGRTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElOR19TVEFSVCAmJgotICAgICAgICBsZWZ3T2xkU3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotCi0gICAgaWYgKG51bUN1dGFyZWFzIDw9IDApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOyAgLy8gY3V0YXJlYSBpcyByZXF1aXJlZAotCi0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpIHsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIENVVEFSRUEgIik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1DdXRhcmVhczsgaSsrKSB7Ci0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiJS4xMWcgIiwgKmN1dGFyZWFzKyspOwotICAgICAgICB9Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICI7XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgQ1VUQVJFQSAiKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUN1dGFyZWFzOyBpKyspIHsKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIlLjExZyAiLCAqY3V0YXJlYXMrKyk7Ci0gICAgICAgIH0KLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIjtcbiIpOwotICAgIH0KLQotICAgIGxlZndUYWJsZUxlbiA9IG51bUN1dGFyZWFzOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndMYXllckRDVGFibGVFbnRyaWVzKGludCAgICAgbnVtRW50cmllcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgKmVudHJpZXMpCi17Ci0gICAgaW50IGk7Ci0gICAgaW50IGogPSAwOwotCi0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTEFZRVJEQ0NVUlJFTlQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLQotICAgIGlmIChudW1FbnRyaWVzIDw9IDApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOyAgLy8gdGFibGVFbnRyaWVzIGFyZSByZXF1aXJlZAotCi0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpIHsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIFRBQkxFRU5UUklFU1xuICAgICAgICAiKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUVudHJpZXM7IGkrKykgewotICAgICAgICAgICAgaWYgKCsraiA+IGxlZndUYWJsZUxlbikgewotICAgICAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJcbiAgICAgICAgIik7Ci0gICAgICAgICAgICAgICAgaiA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiJS4xMWcgIiwgKmVudHJpZXMrKyk7Ci0gICAgICAgIH0KLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIjtcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBUQUJMRUVOVFJJRVNcbiAgICAgICAgIik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1FbnRyaWVzOyBpKyspIHsKLSAgICAgICAgICAgIGlmICgrK2ogPiBsZWZ3VGFibGVMZW4pIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiXG4gICAgICAgICIpOwotICAgICAgICAgICAgICAgIGogPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiUuMTFnICIsICplbnRyaWVzKyspOwotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICI7XG4iKTsKLSAgICB9Ci0KLSAgICBsZWZ3U3RhdGUgPSBsZWZ3T2xkU3RhdGU7ICAgLy8gcmVzdG9yZSB0aGUgcHJldmlvdXMgc3RhdGUKLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TGF5ZXJBbnRlbm5hTW9kZWwoY29uc3QgY2hhciAqb3hpZGUpCi17Ci0gICAgbGVmdzU0TnVtID0gTEVGV19BTlRFTk5BTU9ERUw7Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HX1NUQVJUICYmIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElORwotICAgICAgICAmJiBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUl9TVEFSVCAmJiBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIC8vIG9ubHkgcm91dGluZyBvciBjdXQgY2FsbHMgdGhpcyBmdW5jCi0gICAgaWYgKCFsZWZ3SXNSb3V0aW5nICYmICFsZWZ3SXNDdXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmICh2ZXJzaW9uTnVtIDwgNS40KQotICAgICAgICByZXR1cm4gTEVGV19XUk9OR19WRVJTSU9OOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgQU5URU5OQU1PREVMICVzIDtcbiIsIG94aWRlKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBBTlRFTk5BTU9ERUwgJXMgO1xuIiwgb3hpZGUpOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndMYXllckFudGVubmFBcmVhUmF0aW8oZG91YmxlIHZhbHVlKQotewotICAgIGxlZnc1NE51bSA9IExFRldfQU5URU5OQUFSRUFSQVRJTzsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdfU1RBUlQgJiYgbGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HCi0gICAgICAgICYmIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSX1NUQVJUICYmIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgLy8gb25seSByb3V0aW5nIG9yIGN1dCBjYWxscyB0aGlzIGZ1bmMKLSAgICBpZiAoIWxlZndJc1JvdXRpbmcgJiYgIWxlZndJc0N1dCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgaWYgKHZlcnNpb25OdW0gPCA1LjQpCi0gICAgICAgIHJldHVybiBMRUZXX1dST05HX1ZFUlNJT047Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBBTlRFTk5BQVJFQVJBVElPICUuMTFnIDtcbiIsIHZhbHVlKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBBTlRFTk5BQVJFQVJBVElPICUuMTFnIDtcbiIsIHZhbHVlKTsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TGF5ZXJBbnRlbm5hRGlmZkFyZWFSYXRpbyhkb3VibGUgdmFsdWUpCi17Ci0gICAgbGVmdzU0TnVtID0gTEVGV19BTlRFTk5BRElGRkFSRUFSQVRJTzsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdfU1RBUlQgJiYgbGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HCi0gICAgICAgICYmIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSX1NUQVJUICYmIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgLy8gb25seSByb3V0aW5nIG9yIGN1dCBjYWxscyB0aGlzIGZ1bmMKLSAgICBpZiAoIWxlZndJc1JvdXRpbmcgJiYgIWxlZndJc0N1dCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgaWYgKHZlcnNpb25OdW0gPCA1LjQpCi0gICAgICAgIHJldHVybiBMRUZXX1dST05HX1ZFUlNJT047Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBBTlRFTk5BRElGRkFSRUFSQVRJTyAlLjExZyA7XG4iLCB2YWx1ZSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgQU5URU5OQURJRkZBUkVBUkFUSU8gJS4xMWcgO1xuIiwgdmFsdWUpOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndMYXllckFudGVubmFEaWZmQXJlYVJhdGlvUHdsKGludCAgICBudW1Qd2xzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICpkaWZmdXNpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICpyYXRpb3MpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBsZWZ3NTROdW0gPSBMRUZXX0FOVEVOTkFESUZGQVJFQVJBVElPUFdMOwotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElOR19TVEFSVCAmJiBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkcKLSAgICAgICAgJiYgbGVmd1N0YXRlICE9IExFRldfTEFZRVJfU1RBUlQgJiYgbGVmd1N0YXRlICE9IExFRldfTEFZRVIpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICAvLyBvbmx5IHJvdXRpbmcgb3IgY3V0IGNhbGxzIHRoaXMgZnVuYwotICAgIGlmICghbGVmd0lzUm91dGluZyAmJiAhbGVmd0lzQ3V0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAodmVyc2lvbk51bSA8IDUuNCkKLSAgICAgICAgcmV0dXJuIExFRldfV1JPTkdfVkVSU0lPTjsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgQU5URU5OQURJRkZBUkVBUkFUSU8gUFdMICggIik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1Qd2xzOyBpKyspCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiKCAlLjExZyAlLjExZyApICIsICpkaWZmdXNpb25zKyssICpyYXRpb3MrKyk7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIpIDtcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBBTlRFTk5BRElGRkFSRUFSQVRJTyBQV0wgKCAiKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVB3bHM7IGkrKykKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIoICUuMTFnICUuMTFnICkgIiwgKmRpZmZ1c2lvbnMrKywgKnJhdGlvcysrKTsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIikgO1xuIik7Ci0gICAgfQotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndMYXllckFudGVubmFDdW1BcmVhUmF0aW8oZG91YmxlIHZhbHVlKQotewotICAgIGxlZnc1NE51bSA9IExFRldfQU5URU5OQUNVTUFSRUFSQVRJTzsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdfU1RBUlQgJiYgbGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HCi0gICAgICAgICYmIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSX1NUQVJUICYmIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgLy8gb25seSByb3V0aW5nIG9yIGN1dCBjYWxscyB0aGlzIGZ1bmMKLSAgICBpZiAoIWxlZndJc1JvdXRpbmcgJiYgIWxlZndJc0N1dCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgaWYgKHZlcnNpb25OdW0gPCA1LjQpCi0gICAgICAgIHJldHVybiBMRUZXX1dST05HX1ZFUlNJT047Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBBTlRFTk5BQ1VNQVJFQVJBVElPICUuMTFnIDtcbiIsIHZhbHVlKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBBTlRFTk5BQ1VNQVJFQVJBVElPICUuMTFnIDtcbiIsIHZhbHVlKTsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TGF5ZXJBbnRlbm5hQ3VtRGlmZkFyZWFSYXRpbyhkb3VibGUgdmFsdWUpCi17Ci0gICAgbGVmdzU0TnVtID0gTEVGV19BTlRFTk5BQ1VNRElGRkFSRUFSQVRJTzsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdfU1RBUlQgJiYgbGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HCi0gICAgICAgICYmIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSX1NUQVJUICYmIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgLy8gb25seSByb3V0aW5nIG9yIGN1dCBjYWxscyB0aGlzIGZ1bmMKLSAgICBpZiAoIWxlZndJc1JvdXRpbmcgJiYgIWxlZndJc0N1dCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgaWYgKHZlcnNpb25OdW0gPCA1LjQpCi0gICAgICAgIHJldHVybiBMRUZXX1dST05HX1ZFUlNJT047Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBBTlRFTk5BQ1VNRElGRkFSRUFSQVRJTyAlLjExZyA7XG4iLCB2YWx1ZSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgQU5URU5OQUNVTURJRkZBUkVBUkFUSU8gJS4xMWcgO1xuIiwgdmFsdWUpOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndMYXllckFudGVubmFDdW1EaWZmQXJlYVJhdGlvUHdsKGludCAgICAgbnVtUHdscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgKmRpZmZ1c2lvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICpyYXRpb3MpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBsZWZ3NTROdW0gPSBMRUZXX0FOVEVOTkFDVU1ESUZGQVJFQVJBVElPUFdMOwotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElOR19TVEFSVCAmJiBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkcKLSAgICAgICAgJiYgbGVmd1N0YXRlICE9IExFRldfTEFZRVJfU1RBUlQgJiYgbGVmd1N0YXRlICE9IExFRldfTEFZRVIpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICAvLyBvbmx5IHJvdXRpbmcgb3IgY3V0IGNhbGxzIHRoaXMgZnVuYwotICAgIGlmICghbGVmd0lzUm91dGluZyAmJiAhbGVmd0lzQ3V0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAodmVyc2lvbk51bSA8IDUuNCkKLSAgICAgICAgcmV0dXJuIExFRldfV1JPTkdfVkVSU0lPTjsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgQU5URU5OQUNVTURJRkZBUkVBUkFUSU8gUFdMICggIik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1Qd2xzOyBpKyspCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiKCAlLjExZyAlLjExZyApICIsICpkaWZmdXNpb25zKyssICpyYXRpb3MrKyk7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIpIDtcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBBTlRFTk5BQ1VNRElGRkFSRUFSQVRJTyBQV0wgKCAiKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVB3bHM7IGkrKykKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIoICUuMTFnICUuMTFnICkgIiwgKmRpZmZ1c2lvbnMrKywgKnJhdGlvcysrKTsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIikgO1xuIik7Ci0gICAgfQotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndMYXllckFudGVubmFBcmVhRmFjdG9yKGRvdWJsZSAgICAgICB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAqZGlmZlVzZU9ubHkpCi17Ci0gICAgbGVmdzU0TnVtID0gTEVGV19BTlRFTk5BQVJFQUZBQ1RPUjsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdfU1RBUlQgJiYgbGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HCi0gICAgICAgICYmIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSX1NUQVJUICYmIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgLy8gb25seSByb3V0aW5nIG9yIGN1dCBjYWxscyB0aGlzIGZ1bmMKLSAgICBpZiAoIWxlZndJc1JvdXRpbmcgJiYgIWxlZndJc0N1dCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgaWYgKCh2ZXJzaW9uTnVtIDwgNS40KSAmJgotICAgICAgICAoZGlmZlVzZU9ubHkgJiYgc3RyY21wKGRpZmZVc2VPbmx5LCAiRElGRlVTRU9OTFkiKSA9PSAwKSkKLSAgICAgICAgcmV0dXJuIExFRldfV1JPTkdfVkVSU0lPTjsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgQU5URU5OQUFSRUFGQUNUT1IgJS4xMWcgIiwgdmFsdWUpOwotICAgICAgICBpZiAoZGlmZlVzZU9ubHkgJiYgc3RyY21wKGRpZmZVc2VPbmx5LCAiRElGRlVTRU9OTFkiKSA9PSAwKQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIERJRkZVU0VPTkxZICIpOwotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiO1xuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIEFOVEVOTkFBUkVBRkFDVE9SICUuMTFnICIsIHZhbHVlKTsKLSAgICAgICAgaWYgKGRpZmZVc2VPbmx5ICYmIHN0cmNtcChkaWZmVXNlT25seSwgIkRJRkZVU0VPTkxZIikgPT0gMCkKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJESUZGVVNFT05MWSAiKTsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIjtcbiIpOwotICAgIH0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TGF5ZXJBbnRlbm5hU2lkZUFyZWFSYXRpbyhkb3VibGUgdmFsdWUpCi17Ci0gICAgbGVmdzU0TnVtID0gTEVGV19BTlRFTk5BU0lERUFSRUFSQVRJTzsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdfU1RBUlQgJiYgbGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgLy8gb25seSByb3V0aW5nIGNhbGxzIHRoaXMgZnVuYwotICAgIGlmICghbGVmd0lzUm91dGluZykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgaWYgKHZlcnNpb25OdW0gPCA1LjQpCi0gICAgICAgIHJldHVybiBMRUZXX1dST05HX1ZFUlNJT047Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBBTlRFTk5BU0lERUFSRUFSQVRJTyAlLjExZyA7XG4iLCB2YWx1ZSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgQU5URU5OQVNJREVBUkVBUkFUSU8gJS4xMWcgO1xuIiwgdmFsdWUpOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndMYXllckFudGVubmFEaWZmU2lkZUFyZWFSYXRpbyhkb3VibGUgdmFsdWUpCi17Ci0gICAgbGVmdzU0TnVtID0gTEVGV19BTlRFTk5BRElGRlNJREVBUkVBUkFUSU87Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HX1NUQVJUICYmIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElORykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIC8vIG9ubHkgcm91dGluZyBjYWxscyB0aGlzIGZ1bmMKLSAgICBpZiAoIWxlZndJc1JvdXRpbmcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmICh2ZXJzaW9uTnVtIDwgNS40KQotICAgICAgICByZXR1cm4gTEVGV19XUk9OR19WRVJTSU9OOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgQU5URU5OQURJRkZTSURFQVJFQVJBVElPICUuMTFnIDtcbiIsIHZhbHVlKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBBTlRFTk5BRElGRlNJREVBUkVBUkFUSU8gJS4xMWcgO1xuIiwgdmFsdWUpOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndMYXllckFudGVubmFEaWZmU2lkZUFyZWFSYXRpb1B3bChpbnQgICAgbnVtUHdscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgKmRpZmZ1c2lvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICpyYXRpb3MpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBsZWZ3NTROdW0gPSBMRUZXX0FOVEVOTkFESUZGU0lERUFSRUFSQVRJT1BXTDsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdfU1RBUlQgJiYgbGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgLy8gb25seSByb3V0aW5nIG9yIGN1dCBjYWxscyB0aGlzIGZ1bmMKLSAgICBpZiAoIWxlZndJc1JvdXRpbmcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmICh2ZXJzaW9uTnVtIDwgNS40KQotICAgICAgICByZXR1cm4gTEVGV19XUk9OR19WRVJTSU9OOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KSB7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBBTlRFTk5BRElGRlNJREVBUkVBUkFUSU8gUFdMICggIik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1Qd2xzOyBpKyspCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiKCAlLjExZyAlLjExZyApICIsICpkaWZmdXNpb25zKyssICpyYXRpb3MrKyk7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIpIDtcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBBTlRFTk5BRElGRlNJREVBUkVBUkFUSU8gUFdMICggIik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1Qd2xzOyBpKyspCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiKCAlLjExZyAlLjExZyApICIsICpkaWZmdXNpb25zKyssICpyYXRpb3MrKyk7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIpIDtcbiIpOwotICAgIH0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TGF5ZXJBbnRlbm5hQ3VtU2lkZUFyZWFSYXRpbyhkb3VibGUgdmFsdWUpCi17Ci0gICAgbGVmdzU0TnVtID0gTEVGV19BTlRFTk5BQ1VNU0lERUFSRUFSQVRJTzsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdfU1RBUlQgJiYgbGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgLy8gb25seSByb3V0aW5nIGNhbGxzIHRoaXMgZnVuYwotICAgIGlmICghbGVmd0lzUm91dGluZykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgaWYgKHZlcnNpb25OdW0gPCA1LjQpCi0gICAgICAgIHJldHVybiBMRUZXX1dST05HX1ZFUlNJT047Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBBTlRFTk5BQ1VNU0lERUFSRUFSQVRJTyAlLjExZyA7XG4iLCB2YWx1ZSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgQU5URU5OQUNVTVNJREVBUkVBUkFUSU8gJS4xMWcgO1xuIiwgdmFsdWUpOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi0vLyAxMS8yNS8yMDAyIC0gYnVnIGZpeDogc3VibWl0dGVkIGJ5IENyYWlnIEZpbGVzIChjZmlsZXNAZnRjLmFnaWxlbnQuY29tKQotLy8gUmVuYW1lZCBmcm9tIGxlZndMYXllckFudGVubmFDdW1TaWRlRGlmZkFyZWFSYXRpbyB0byBtYXRjaAotLy8gdGhlIGhlYWRlciAgCi1pbnQKLWxlZndMYXllckFudGVubmFDdW1EaWZmU2lkZUFyZWFSYXRpbyhkb3VibGUgdmFsdWUpCi17Ci0gICAgbGVmdzU0TnVtID0gTEVGV19BTlRFTk5BQ1VNRElGRlNJREVBUkVBUkFUSU87Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HX1NUQVJUICYmIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElORykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIC8vIG9ubHkgcm91dGluZyBjYWxscyB0aGlzIGZ1bmMKLSAgICBpZiAoIWxlZndJc1JvdXRpbmcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgQU5URU5OQUNVTURJRkZTSURFQVJFQVJBVElPICUuMTFnIDtcbiIsIHZhbHVlKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBBTlRFTk5BQ1VNRElGRlNJREVBUkVBUkFUSU8gJS4xMWcgO1xuIiwgdmFsdWUpOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndMYXllckFudGVubmFDdW1EaWZmU2lkZUFyZWFSYXRpb1B3bChpbnQgICAgIG51bVB3bHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAqZGlmZnVzaW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICpyYXRpb3MpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBsZWZ3NTROdW0gPSBMRUZXX0FOVEVOTkFDVU1ESUZGU0lERUFSRUFSQVRJT1BXTDsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdfU1RBUlQgJiYgbGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgLy8gb25seSByb3V0aW5nIG9yIGN1dCBjYWxscyB0aGlzIGZ1bmMKLSAgICBpZiAoIWxlZndJc1JvdXRpbmcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmICh2ZXJzaW9uTnVtIDwgNS40KQotICAgICAgICByZXR1cm4gTEVGV19XUk9OR19WRVJTSU9OOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KSB7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBBTlRFTk5BQ1VNRElGRlNJREVBUkVBUkFUSU8gUFdMICggIik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1Qd2xzOyBpKyspCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiKCAlLjExZyAlLjExZyApICIsICpkaWZmdXNpb25zKyssICpyYXRpb3MrKyk7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIpIDtcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBBTlRFTk5BQ1VNRElGRlNJREVBUkVBUkFUSU8gUFdMICggIik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1Qd2xzOyBpKyspCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiKCAlLjExZyAlLjExZyApICIsICpkaWZmdXNpb25zKyssICpyYXRpb3MrKyk7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIpIDtcbiIpOwotICAgIH0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TGF5ZXJBbnRlbm5hU2lkZUFyZWFGYWN0b3IoZG91YmxlICAgICAgIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAqZGlmZlVzZU9ubHkpCi17Ci0gICAgbGVmdzU0TnVtID0gTEVGV19BTlRFTk5BU0lERUFSRUFGQUNUT1I7Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HX1NUQVJUICYmIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElORykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIC8vIG9ubHkgcm91dGluZyBjYWxscyB0aGlzIGZ1bmMKLSAgICBpZiAoIWxlZndJc1JvdXRpbmcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmICgodmVyc2lvbk51bSA8IDUuNCkgJiYKLSAgICAgICAgKGRpZmZVc2VPbmx5ICYmIHN0cmNtcChkaWZmVXNlT25seSwgIkRJRkZVU0VPTkxZIikgPT0gMCkpCi0gICAgICAgIHJldHVybiBMRUZXX1dST05HX1ZFUlNJT047Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpIHsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIEFOVEVOTkFTSURFQVJFQUZBQ1RPUiAlLjExZyAiLCB2YWx1ZSk7Ci0gICAgICAgIGlmIChkaWZmVXNlT25seSAmJiBzdHJjbXAoZGlmZlVzZU9ubHksICJESUZGVVNFT05MWSIpID09IDApCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgRElGRlVTRU9OTFkgIik7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICI7XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgQU5URU5OQVNJREVBUkVBRkFDVE9SICUuMTFnICIsIHZhbHVlKTsKLSAgICAgICAgaWYgKGRpZmZVc2VPbmx5ICYmIHN0cmNtcChkaWZmVXNlT25seSwgIkRJRkZVU0VPTkxZIikgPT0gMCkKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJESUZGVVNFT05MWSAiKTsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIjtcbiIpOwotICAgIH0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotLy8gNS43Ci1pbnQKLWxlZndMYXllckFudGVubmFDdW1Sb3V0aW5nUGx1c0N1dCgpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HX1NUQVJUICYmIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElORyAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUl9TVEFSVCAmJiBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzUm91dGluZyAmJiAhbGVmd0lzQ3V0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICAvKiBXQU5EQQotICAgICAgaWYgKCh2ZXJzaW9uTnVtIDwgNS40KSAmJgotICAgICAgICAgIChkaWZmVXNlT25seSAmJiBzdHJjbXAoZGlmZlVzZU9ubHksICJESUZGVVNFT05MWSIpID09IDApKQotICAgICAgICAgcmV0dXJuIExFRldfV1JPTkdfVkVSU0lPTjsKLSAgICAqLwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgQU5URU5OQUNVTVJPVVRJTkdQTFVTQ1VUIDtcbiIpOwotICAgIGVsc2UgewotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgQU5URU5OQUNVTVJPVVRJTkdQTFVTQ1VUIDtcbiIpOwotICAgIH0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotLy8gNS43Ci1pbnQKLWxlZndMYXllckFudGVubmFHYXRlUGx1c0RpZmYoZG91YmxlIHBsdXNEaWZmRmFjdG9yKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElOR19TVEFSVCAmJiBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkcgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTEFZRVJfU1RBUlQgJiYgbGVmd1N0YXRlICE9IExFRldfTEFZRVIpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc1JvdXRpbmcgJiYgIWxlZndJc0N1dCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgLyogV0FOREEKLSAgICAgIGlmICgodmVyc2lvbk51bSA8IDUuNCkgJiYKLSAgICAgICAgICAoZGlmZlVzZU9ubHkgJiYgc3RyY21wKGRpZmZVc2VPbmx5LCAiRElGRlVTRU9OTFkiKSA9PSAwKSkKLSAgICAgICAgIHJldHVybiBMRUZXX1dST05HX1ZFUlNJT047Ci0gICAgKi8KLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIEFOVEVOTkFHQVRFUExVU0RJRkYgJS4xMWcgO1xuIiwKLSAgICAgICAgICAgICAgICAgcGx1c0RpZmZGYWN0b3IpOwotICAgIGVsc2UgewotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgQU5URU5OQUdBVEVQTFVTRElGRiAlLjExZyA7XG4iLCBwbHVzRGlmZkZhY3Rvcik7Ci0gICAgfQotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi0vLyA1LjcKLWludAotbGVmd0xheWVyQW50ZW5uYUFyZWFNaW51c0RpZmYoZG91YmxlIG1pbnVzRGlmZkZhY3RvcikKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdfU1RBUlQgJiYgbGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSX1NUQVJUICYmIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNSb3V0aW5nICYmICFsZWZ3SXNDdXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIC8qIFdBTkRBCi0gICAgICBpZiAoKHZlcnNpb25OdW0gPCA1LjQpICYmCi0gICAgICAgICAgKGRpZmZVc2VPbmx5ICYmIHN0cmNtcChkaWZmVXNlT25seSwgIkRJRkZVU0VPTkxZIikgPT0gMCkpCi0gICAgICAgICByZXR1cm4gTEVGV19XUk9OR19WRVJTSU9OOwotICAgICovCi0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBBTlRFTk5BQVJFQU1JTlVTRElGRiAlLjExZyA7XG4iLAotICAgICAgICAgICAgICAgICBtaW51c0RpZmZGYWN0b3IpOwotICAgIGVsc2UgewotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgQU5URU5OQUFSRUFNSU5VU0RJRkYgJS4xMWcgO1xuIiwgbWludXNEaWZmRmFjdG9yKTsKLSAgICB9Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLS8vIDUuNwotaW50Ci1sZWZ3TGF5ZXJBbnRlbm5hQXJlYURpZmZSZWR1Y2VQd2woaW50ICAgICAgIG51bVB3bHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICpkaWZmQXJlYXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICptZXRhbERpZmZGYWN0b3JzKQotewotICAgIGludCBpOwotCi0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTEFZRVJST1VUSU5HX1NUQVJUICYmIGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSUk9VVElORwotICAgICAgICAmJiBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUl9TVEFSVCAmJiBsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzUm91dGluZyAmJiAhbGVmd0lzQ3V0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICAvKiBXQU5EQQotICAgICAgaWYgKHZlcnNpb25OdW0gPCA1LjQpCi0gICAgICAgICByZXR1cm4gTEVGV19XUk9OR19WRVJTSU9OOwotICAgICovCi0gICAgaWYgKG51bVB3bHMgPCAyKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgQU5URU5OQUFSRUFESUZGUkVEVUNFUFdMICggIik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1Qd2xzOyBpKyspCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiKCAlLjExZyAlLjExZyApICIsICpkaWZmQXJlYXMrKywKLSAgICAgICAgICAgICAgICAgICAgICptZXRhbERpZmZGYWN0b3JzKyspOwotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiKSA7XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgQU5URU5OQUFSRUFESUZGUkVEVUNFUFdMICggIik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1Qd2xzOyBpKyspCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiKCAlLjExZyAlLjExZyApICIsICpkaWZmQXJlYXMrKywKLSAgICAgICAgICAgICAgICAgICAgKm1ldGFsRGlmZkZhY3RvcnMrKyk7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIpIDtcbiIpOwotICAgIH0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TWluaW11bURlbnNpdHkoZG91YmxlIG1pbkRlbnNpdHkpCi17Ci0gICAgbGVmdzU0TnVtID0gTEVGV19NSU5JTVVNREVOU0lUWTsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICh2ZXJzaW9uTnVtIDwgNS40KQotICAgICAgICByZXR1cm4gTEVGV19XUk9OR19WRVJTSU9OOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgTUlOSU1VTURFTlNJVFkgJS4xMWcgO1xuIiwgbWluRGVuc2l0eSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgTUlOSU1VTURFTlNJVFkgJS4xMWcgO1xuIiwgbWluRGVuc2l0eSk7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd01heGltdW1EZW5zaXR5KGRvdWJsZSBtYXhEZW5zaXR5KQotewotICAgIGxlZnc1NE51bSA9IExFRldfTUFYSU1VTURFTlNJVFk7Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAodmVyc2lvbk51bSA8IDUuNCkKLSAgICAgICAgcmV0dXJuIExFRldfV1JPTkdfVkVSU0lPTjsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIE1BWElNVU1ERU5TSVRZICUuMTFnIDtcbiIsIG1heERlbnNpdHkpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIE1BWElNVU1ERU5TSVRZICUuMTFnIDtcbiIsIG1heERlbnNpdHkpOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndEZW5zaXR5Q2hlY2tXaW5kb3coZG91YmxlICAgY2hlY2tXaW5kb3dMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgIGNoZWNrV2luZG93V2lkdGgpCi17Ci0gICAgbGVmdzU0TnVtID0gTEVGV19ERU5TSVRZQ0hFQ0tXSU5ET1c7Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAodmVyc2lvbk51bSA8IDUuNCkKLSAgICAgICAgcmV0dXJuIExFRldfV1JPTkdfVkVSU0lPTjsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIERFTlNJVFlDSEVDS1dJTkRPVyAlLjExZyAlLjExZyA7XG4iLAotICAgICAgICAgICAgICAgICBjaGVja1dpbmRvd0xlbmd0aCwgY2hlY2tXaW5kb3dXaWR0aCk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgREVOU0lUWUNIRUNLV0lORE9XICUuMTFnICUuMTFnIDtcbiIsCi0gICAgICAgICAgICAgICAgY2hlY2tXaW5kb3dMZW5ndGgsIGNoZWNrV2luZG93V2lkdGgpOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndEZW5zaXR5Q2hlY2tTdGVwKGRvdWJsZSBjaGVja1N0ZXBWYWx1ZSkKLXsKLSAgICBsZWZ3NTROdW0gPSBMRUZXX0RFTlNJVFlDSEVDS1NURVA7Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAodmVyc2lvbk51bSA8IDUuNCkKLSAgICAgICAgcmV0dXJuIExFRldfV1JPTkdfVkVSU0lPTjsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIERFTlNJVFlDSEVDS1NURVAgJS4xMWcgO1xuIiwKLSAgICAgICAgICAgICAgICAgY2hlY2tTdGVwVmFsdWUpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIERFTlNJVFlDSEVDS1NURVAgJS4xMWcgO1xuIiwgY2hlY2tTdGVwVmFsdWUpOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndGaWxsQWN0aXZlU3BhY2luZyhkb3VibGUgZmlsbFRvQWN0aXZlU3BhY2luZykKLXsKLSAgICBsZWZ3NTROdW0gPSBMRUZXX0ZJTExBQ1RJVkVTUEFDSU5HOwotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKHZlcnNpb25OdW0gPCA1LjQpCi0gICAgICAgIHJldHVybiBMRUZXX1dST05HX1ZFUlNJT047Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBGSUxMQUNUSVZFU1BBQ0lORyAlLjExZyA7XG4iLAotICAgICAgICAgICAgICAgICBmaWxsVG9BY3RpdmVTcGFjaW5nKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBGSUxMQUNUSVZFU1BBQ0lORyAlLjExZyA7XG4iLCBmaWxsVG9BY3RpdmVTcGFjaW5nKTsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TWF4dmlhc3RhY2soaW50ICAgICAgICAgdmFsdWUsCi0gICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmJvdHRvbUxheWVyLAotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICp0b3BMYXllcikKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd0lzTWF4dmlhc3RhY2spCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiTUFYVklBU1RBQ0sgJWQgIiwgdmFsdWUpOwotICAgICAgICBpZiAoYm90dG9tTGF5ZXIpCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiUkFOR0UgJXMgJXMgO1xuIiwgYm90dG9tTGF5ZXIsIHRvcExheWVyKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIjtcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJNQVhWSUFTVEFDSyAlZCAiLCB2YWx1ZSk7Ci0gICAgICAgIGlmIChib3R0b21MYXllcikKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJSQU5HRSAlcyAlcyA7XG4iLCBib3R0b21MYXllciwgdG9wTGF5ZXIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiO1xuIik7Ci0gICAgfQotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndTdGFydFByb3BEZWYoKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3U3luQXJyYXlbTEVGV19QUk9QRVJUWURFRl9TVEFSVF0pCi0gICAgICAgIHJldHVybiBMRUZXX0FMUkVBRFlfREVGSU5FRDsKLSAgICBsZWZ3U3luQXJyYXlbTEVGV19BTlRFTk5BU0laRV0gPSAxOwotICAgIGlmIChsZWZ3U3RhdGUgPT0gTEVGV19QUk9QRVJUWURFRl9TVEFSVCB8fAotICAgICAgICBsZWZ3U3RhdGUgPT0gTEVGV19QUk9QRVJUWURFRikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19JTklUICYmIGxlZndTdGF0ZSA8IExFRldfRU5EKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7ICAvLyBub3Qgb2YgdGhlIEVORHMKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIlBST1BFUlRZREVGSU5JVElPTlNcbiIpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIlBST1BFUlRZREVGSU5JVElPTlNcbiIpOwotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19QUk9QRVJUWURFRl9TVEFSVDsKLSAgICBsZWZ3U3luQXJyYXlbTEVGV19QUk9QRVJUWURFRl9TVEFSVF0gPSAxOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndJbnRQcm9wRGVmKGNvbnN0IGNoYXIgICAqb2JqVHlwZSwKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAqcHJvcE5hbWUsCi0gICAgICAgICAgICAgICBkb3VibGUgICAgICAgbGVmdFJhbmdlLAotICAgICAgICAgICAgICAgZG91YmxlICAgICAgIHJpZ2h0UmFuZ2UsICAgIC8vIG9wdGlvbmFsIAotICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHByb3BWYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsIAotICAgICAgICAgICAgICAgKQotewotCi0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfUFJPUEVSVFlERUZfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfUFJPUEVSVFlERUYpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICAvKgotICAgICAgaWYgKCghIG9ialR5cGUgJiYgISAqb2JqVHlwZSkgfHwgKCEgcHJvcE5hbWUgJiYgISAqcHJvcE5hbWUpKQotICAgICovCi0gICAgaWYgKCgob2JqVHlwZSA9PSAwKSB8fCAoKm9ialR5cGUgPT0gMCkpIHx8ICgocHJvcE5hbWUgPT0gMCkgfHwgKCpwcm9wTmFtZSA9PSAwKSkpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotCi0gICAgaWYgKHN0cmNtcChvYmpUeXBlLCAiTElCUkFSWSIpICYmIHN0cmNtcChvYmpUeXBlLCAiVklBIikgJiYKLSAgICAgICAgc3RyY21wKG9ialR5cGUsICJNQUNSTyIpICYmIHN0cmNtcChvYmpUeXBlLCAiUElOIikgJiYKLSAgICAgICAgc3RyY21wKG9ialR5cGUsICJMQVlFUiIpICYmIHN0cmNtcChvYmpUeXBlLCAiTk9OREVGQVVMVFJVTEUiKSAmJgotICAgICAgICBzdHJjbXAob2JqVHlwZSwgIlZJQVJVTEUiKSkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0KLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgJXMgJXMgSU5URUdFUiAiLCBvYmpUeXBlLCBwcm9wTmFtZSk7Ci0gICAgICAgIGlmIChsZWZ0UmFuZ2UgfHwgcmlnaHRSYW5nZSkKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJSQU5HRSAlLjExZyAlLjExZyAiLCBsZWZ0UmFuZ2UsIHJpZ2h0UmFuZ2UpOwotCi0gICAgICAgIGlmIChwcm9wVmFsdWUpCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiJWQgIiwgcHJvcFZhbHVlKTsKLQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiO1xuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICVzICVzIElOVEVHRVIgIiwgb2JqVHlwZSwgcHJvcE5hbWUpOwotICAgICAgICBpZiAobGVmdFJhbmdlIHx8IHJpZ2h0UmFuZ2UpCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiUkFOR0UgJS4xMWcgJS4xMWcgIiwgbGVmdFJhbmdlLCByaWdodFJhbmdlKTsKLQotICAgICAgICBpZiAocHJvcFZhbHVlKQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiVkICIsIHByb3BWYWx1ZSk7Ci0KLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIjtcbiIpOwotICAgIH0KLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTdGF0ZSA9IExFRldfUFJPUEVSVFlERUY7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLQotaW50Ci1sZWZ3UmVhbFByb3BEZWYoY29uc3QgY2hhciAgKm9ialR5cGUsCi0gICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKnByb3BOYW1lLAotICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgIGxlZnRSYW5nZSwKLSAgICAgICAgICAgICAgICBkb3VibGUgICAgICByaWdodFJhbmdlLCAgICAvLyBvcHRpb25hbCAKLSAgICAgICAgICAgICAgICBkb3VibGUgICAgICBwcm9wVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcHRpb25hbCAKLSAgICAgICAgICAgICAgICApCi17Ci0KLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19QUk9QRVJUWURFRl9TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19QUk9QRVJUWURFRikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICgoKG9ialR5cGUgPT0gMCkgfHwgKCpvYmpUeXBlID09IDApKSB8fCAoKHByb3BOYW1lID09IDApIHx8ICgqcHJvcE5hbWUgPT0gMCkpKSAvLyByZXF1aXJlCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotCi0gICAgaWYgKHN0cmNtcChvYmpUeXBlLCAiTElCUkFSWSIpICYmIHN0cmNtcChvYmpUeXBlLCAiVklBIikgJiYKLSAgICAgICAgc3RyY21wKG9ialR5cGUsICJNQUNSTyIpICYmIHN0cmNtcChvYmpUeXBlLCAiUElOIikgJiYKLSAgICAgICAgc3RyY21wKG9ialR5cGUsICJMQVlFUiIpICYmIHN0cmNtcChvYmpUeXBlLCAiTk9OREVGQVVMVFJVTEUiKSAmJgotICAgICAgICBzdHJjbXAob2JqVHlwZSwgIlZJQVJVTEUiKSkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0KLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgJXMgJXMgUkVBTCAiLCBvYmpUeXBlLCBwcm9wTmFtZSk7Ci0gICAgICAgIGlmIChsZWZ0UmFuZ2UgfHwgcmlnaHRSYW5nZSkKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJSQU5HRSAlLjExZyAlLjExZyAiLCBsZWZ0UmFuZ2UsIHJpZ2h0UmFuZ2UpOwotCi0gICAgICAgIGlmIChwcm9wVmFsdWUpCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiJS4xMWcgIiwgcHJvcFZhbHVlKTsKLQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiO1xuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICVzICVzIFJFQUwgIiwgb2JqVHlwZSwgcHJvcE5hbWUpOwotICAgICAgICBpZiAobGVmdFJhbmdlIHx8IHJpZ2h0UmFuZ2UpCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiUkFOR0UgJS4xMWcgJS4xMWcgIiwgbGVmdFJhbmdlLCByaWdodFJhbmdlKTsKLQotICAgICAgICBpZiAocHJvcFZhbHVlKQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiUuMTFnICIsIHByb3BWYWx1ZSk7Ci0KLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIjtcbiIpOwotICAgIH0KLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTdGF0ZSA9IExFRldfUFJPUEVSVFlERUY7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLQotaW50Ci1sZWZ3U3RyaW5nUHJvcERlZihjb25zdCBjaGFyICAgICpvYmpUeXBlLAotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqcHJvcE5hbWUsCi0gICAgICAgICAgICAgICAgICBkb3VibGUgICAgICAgIGxlZnRSYW5nZSwKLSAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICAgcmlnaHRSYW5nZSwgICAgLy8gb3B0aW9uYWwgCi0gICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpwcm9wVmFsdWUgICAgICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwgCi0gICAgICAgICAgICAgICAgICApCi17Ci0KLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19QUk9QRVJUWURFRl9TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19QUk9QRVJUWURFRikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICgoKG9ialR5cGUgPT0gMCkgfHwgKCpvYmpUeXBlID09IDApKSB8fCAoKHByb3BOYW1lID09IDApIHx8ICgqcHJvcE5hbWUgPT0gMCkpKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLQotICAgIGlmIChzdHJjbXAob2JqVHlwZSwgIkxJQlJBUlkiKSAmJiBzdHJjbXAob2JqVHlwZSwgIlZJQSIpICYmCi0gICAgICAgIHN0cmNtcChvYmpUeXBlLCAiTUFDUk8iKSAmJiBzdHJjbXAob2JqVHlwZSwgIlBJTiIpICYmCi0gICAgICAgIHN0cmNtcChvYmpUeXBlLCAiTEFZRVIiKSAmJiBzdHJjbXAob2JqVHlwZSwgIk5PTkRFRkFVTFRSVUxFIikgJiYKLSAgICAgICAgc3RyY21wKG9ialR5cGUsICJWSUFSVUxFIikpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotCi0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpIHsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICVzICVzIFNUUklORyAiLCBvYmpUeXBlLCBwcm9wTmFtZSk7Ci0gICAgICAgIGlmIChsZWZ0UmFuZ2UgfHwgcmlnaHRSYW5nZSkKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJSQU5HRSAlLjExZyAlLjExZyAiLCBsZWZ0UmFuZ2UsIHJpZ2h0UmFuZ2UpOwotCi0gICAgICAgIGlmIChwcm9wVmFsdWUpCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiXCIlc1wiICIsIHByb3BWYWx1ZSk7ICAvLyBzdHJpbmcsIHNldCBxdW90ZXMKLQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiO1xuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICVzICVzIFNUUklORyAiLCBvYmpUeXBlLCBwcm9wTmFtZSk7Ci0gICAgICAgIGlmIChsZWZ0UmFuZ2UgfHwgcmlnaHRSYW5nZSkKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJSQU5HRSAlLjExZyAlLjExZyAiLCBsZWZ0UmFuZ2UsIHJpZ2h0UmFuZ2UpOwotCi0gICAgICAgIGlmIChwcm9wVmFsdWUpCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiXCIlc1wiICIsIHByb3BWYWx1ZSk7ICAvLyBzdHJpbmcsIHNldCBxdW90ZXMKLQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiO1xuIik7Ci0gICAgfQotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19QUk9QRVJUWURFRjsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotCi1pbnQKLWxlZndFbmRQcm9wRGVmKCkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19QUk9QRVJUWURFRl9TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19QUk9QRVJUWURFRikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotCi0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJFTkQgUFJPUEVSVFlERUZJTklUSU9OU1xuXG4iKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJFTkQgUFJPUEVSVFlERUZJTklUSU9OU1xuXG4iKTsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3U3RhdGUgPSBMRUZXX1BST1BFUlRZREVGX0VORDsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotCi1pbnQKLWxlZndFbmQoKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiAxOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIkVORCBMSUJSQVJZXG4iKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJFTkQgTElCUkFSWVxuIik7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgLy8gbGVmd0ZpbGUgPSAwOwotICAgIGxlZndTdGF0ZSA9IExFRldfRE9ORTsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3U3RhcnRWaWEoY29uc3QgY2hhciAqdmlhTmFtZSwKLSAgICAgICAgICAgICBjb25zdCBjaGFyICppc0RlZmF1bHQpCi17ICAgLy8gb3B0aW9uYWwgCi0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndTdGF0ZSA9PSBMRUZXX1ZJQV9TVEFSVCB8fAotICAgICAgICBsZWZ3U3RhdGUgPT0gTEVGV19WSUEpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfSU5JVCAmJiBsZWZ3U3RhdGUgPCBMRUZXX0VORCAmJgotICAgICAgICAoIWxlZndJc05vbkRlZmF1bHRSdWxlKSkgIC8vIHZpYSBkZWZpbmVkIGluIG5vbmRlZmF1bHRydWxlIAotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7ICAvLyBub3Qgb2YgdGhlIEVORHMKLQotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KSB7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJWSUEgJXMgIiwgdmlhTmFtZSk7Ci0gICAgICAgIGlmIChpc0RlZmF1bHQgJiYgc3RyY21wKGlzRGVmYXVsdCwgIkRFRkFVTFQiKSA9PSAwKQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIkRFRkFVTFQiKTsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIlxuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIlZJQSAlcyAiLCB2aWFOYW1lKTsKLSAgICAgICAgaWYgKGlzRGVmYXVsdCAmJiBzdHJjbXAoaXNEZWZhdWx0LCAiREVGQVVMVCIpID09IDApCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiREVGQVVMVCIpOwotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiXG4iKTsKLSAgICB9Ci0gICAgbGVmd0xpbmVzKys7Ci0KLSAgICBsZWZ3U3luQXJyYXlbTEVGV19WSUFfU1RBUlRdID0gMTsKLSAgICBsZWZ3U3RhdGUgPSBMRUZXX1ZJQV9TVEFSVDsKLSAgICBsZWZ3RGlkTGF5ZXIgPSAwOyAgICAgICAgICAgLy8gaGFzbid0IHNldCB0aGUgbGF5ZXIgeWV0Ci0gICAgbGVmd1ZpYUhhc1ZhbCA9IDA7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd1ZpYVRvcG9mc3RhY2tvbmx5KCkKLXsKLSAgICBsZWZ3T2Jzb2xldGVOdW0gPSBMRUZXX1ZJQVRPUE9GU1RBQ0tPTkxZOwotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX1ZJQV9TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19WSUEpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAodmVyc2lvbk51bSA+PSA1LjYpCi0gICAgICAgIHJldHVybiBMRUZXX09CU09MRVRFOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgVE9QT0ZTVEFDS09OTFlcbiIpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIFRPUE9GU1RBQ0tPTkxZXG4iKTsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3VmlhRm9yZWlnbihjb25zdCBjaGFyICAgKmZvcmVpZ25OYW1lLAotICAgICAgICAgICAgICAgZG91YmxlICAgICAgIHhsLCAgICAgICAgICAvLyBvcHRpb25hbCAKLSAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICB5bCwgICAgICAgICAgLy8gb3B0aW9uYWwgCi0gICAgICAgICAgICAgICBpbnQgICAgICAgICAgb3JpZW50KQoteyAgICAgICAgLy8gb3B0aW9uYWwgCi0gICAgbGVmd09ic29sZXRlTnVtID0gTEVGV19WSUFGT1JFSUdOOwotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX1ZJQV9TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19WSUEpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAodmVyc2lvbk51bSA+PSA1LjYpCi0gICAgICAgIHJldHVybiBMRUZXX09CU09MRVRFOwotCi0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpIHsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIEZPUkVJR04gJXMgIiwgZm9yZWlnbk5hbWUpOwotICAgICAgICBpZiAoeGwgfHwgeWwpIHsKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIlLjExZyAlLjExZyAiLCB4bCwgeWwpOwotICAgICAgICAgICAgaWYgKG9yaWVudCA+PSAwICYmIG9yaWVudCA8PSA3KQotICAgICAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIlcyAiLCBsZWZ3T3JpZW50KG9yaWVudCkpOwotICAgICAgICB9IGVsc2UgaWYgKG9yaWVudCA+IDAgJiYgb3JpZW50IDw9IDcpIHsgLy8gYXNzdW1lIHVzZXIgaGFzIDAgMCBmb3IgcHQgCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiJS4xMWcgJS4xMWcgIiwgeGwsIHlsKTsKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIlcyAiLCBsZWZ3T3JpZW50KG9yaWVudCkpOwotICAgICAgICB9Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICI7XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgRk9SRUlHTiAlcyAiLCBmb3JlaWduTmFtZSk7Ci0gICAgICAgIGlmICh4bCB8fCB5bCkgewotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiUuMTFnICUuMTFnICIsIHhsLCB5bCk7Ci0gICAgICAgICAgICBpZiAob3JpZW50ID49IDAgJiYgb3JpZW50IDw9IDcpCi0gICAgICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiVzICIsIGxlZndPcmllbnQob3JpZW50KSk7Ci0gICAgICAgIH0gZWxzZSBpZiAob3JpZW50ID4gMCAmJiBvcmllbnQgPD0gNykgeyAvLyBhc3N1bWUgdXNlciBoYXMgMCAwIGZvciBwdCAKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIlLjExZyAlLjExZyAiLCB4bCwgeWwpOwotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiVzICIsIGxlZndPcmllbnQob3JpZW50KSk7Ci0gICAgICAgIH0KLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIjtcbiIpOwotICAgIH0KLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTdGF0ZSA9IExFRldfVklBOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndWaWFGb3JlaWduU3RyKGNvbnN0IGNoYXIgICAgKmZvcmVpZ25OYW1lLAotICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgICB4bCwgICAgICAgICAgICAvLyBvcHRpb25hbCAKLSAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICAgeWwsICAgICAgICAgICAgLy8gb3B0aW9uYWwgCi0gICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpvcmllbnQpCi17ICAvLyBvcHRpb25hbCAKLSAgICBsZWZ3T2Jzb2xldGVOdW0gPSBMRUZXX1ZJQUZPUkVJR047Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfVklBX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX1ZJQSkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICh2ZXJzaW9uTnVtID49IDUuNikKLSAgICAgICAgcmV0dXJuIExFRldfT0JTT0xFVEU7Ci0KLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgRk9SRUlHTiAlcyAiLCBmb3JlaWduTmFtZSk7Ci0gICAgICAgIGlmICh4bCB8fCB5bCkgewotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiUuMTFnICUuMTFnICIsIHhsLCB5bCk7Ci0gICAgICAgICAgICBpZiAob3JpZW50ICYmICpvcmllbnQgIT0gJ1wwJykKLSAgICAgICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiJXMgIiwgb3JpZW50KTsKLSAgICAgICAgfSBlbHNlIGlmIChvcmllbnQgJiYgKm9yaWVudCAhPSAnXDAnKSB7IC8vIGFzc3VtZSB1c2VyIGhhcyAwIDAgZm9yIHB0IAotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiUuMTFnICUuMTFnICIsIHhsLCB5bCk7Ci0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiJXMgIiwgb3JpZW50KTsKLSAgICAgICAgfQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiO1xuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIEZPUkVJR04gJXMgIiwgZm9yZWlnbk5hbWUpOwotICAgICAgICBpZiAoeGwgfHwgeWwpIHsKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIlLjExZyAlLjExZyAiLCB4bCwgeWwpOwotICAgICAgICAgICAgaWYgKG9yaWVudCAmJiAqb3JpZW50ICE9ICdcMCcpCi0gICAgICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiVzICIsIG9yaWVudCk7Ci0gICAgICAgIH0gZWxzZSBpZiAob3JpZW50ICYmICpvcmllbnQgIT0gJ1wwJykgeyAvLyBhc3N1bWUgdXNlciBoYXMgMCAwIGZvciBwdCAKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIlLjExZyAlLjExZyAiLCB4bCwgeWwpOwotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiVzICIsIG9yaWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIjtcbiIpOwotICAgIH0KLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTdGF0ZSA9IExFRldfVklBOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndWaWFSZXNpc3RhbmNlKGRvdWJsZSByZXNpc3RhbmNlKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX1ZJQV9TVEFSVCAmJiBsZWZ3U3RhdGUgIT0gTEVGV19WSUEpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLQotICAgIGlmIChsZWZ3VmlhSGFzVmFsKQotICAgICAgICByZXR1cm4gTEVGV19BTFJFQURZX0RFRklORUQ7ICAvLyBlaXRoZXIgUmVzaXN0YW5jZSBvcgotICAgIC8vIFZpYVJ1bGUgaGFzIGRlZmluZWQKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIFJFU0lTVEFOQ0UgJS4xMWcgO1xuIiwgcmVzaXN0YW5jZSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgUkVTSVNUQU5DRSAlLjExZyA7XG4iLCByZXNpc3RhbmNlKTsKLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTdGF0ZSA9IExFRldfVklBOwotICAgIGxlZndWaWFIYXNWYWwgPSAxOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndWaWFMYXllcihjb25zdCBjaGFyICpsYXllck5hbWUpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfVklBX1NUQVJUICYmIGxlZndTdGF0ZSAhPSBMRUZXX1ZJQSkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotCi0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBMQVlFUiAlcyA7XG4iLCBsYXllck5hbWUpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIExBWUVSICVzIDtcbiIsIGxheWVyTmFtZSk7Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3U3RhdGUgPSBMRUZXX1ZJQTsKLSAgICBsZWZ3RGlkTGF5ZXIgPSAxOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndWaWFMYXllclJlY3QoZG91YmxlIHgxbCwKLSAgICAgICAgICAgICAgICAgZG91YmxlIHkxbCwKLSAgICAgICAgICAgICAgICAgZG91YmxlIHgybCwKLSAgICAgICAgICAgICAgICAgZG91YmxlIHkybCwKLSAgICAgICAgICAgICAgICAgaW50ICAgIG1hc2spCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfVklBX1NUQVJUICYmIGxlZndTdGF0ZSAhPSBMRUZXX1ZJQSkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0RpZExheWVyKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0KLSAgICBpZiAobWFzayAmJiB2ZXJzaW9uTnVtIDwgNS44KSB7Ci0gICAgICAgIHJldHVybiBMRUZXX1dST05HX1ZFUlNJT047Ci0gICAgfQotCi0gICAgaWYgKCFsZWZ3VmFsaWRhdGVNYXNrTnVtYmVyKG1hc2spKSB7Ci0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIH0KLQotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KSB7Ci0gICAgICAgIGlmIChtYXNrKSB7Ci0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwKLSAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgIiAgICAgIFJFQ1QgTUFTSyAlZCAlLjExZyAlLjExZyAlLjExZyAlLjExZyA7XG4iLCBtYXNrLCB4MWwsIHkxbCwgeDJsLCB5MmwpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAoY2hhciopICIgICAgICBSRUNUICUuMTFnICUuMTFnICUuMTFnICUuMTFnIDtcbiIsIHgxbCwgeTFsLCB4MmwsIHkybCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAobWFzaykgewotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgIFJFQ1QgTUFTSyAlZCAlLjExZyAlLjExZyAlLjExZyAlLjExZyA7XG4iLCBtYXNrLCB4MWwsIHkxbCwgeDJsLCB5MmwpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgIFJFQ1QgJS4xMWcgJS4xMWcgJS4xMWcgJS4xMWcgO1xuIiwgeDFsLCB5MWwsIHgybCwgeTJsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTdGF0ZSA9IExFRldfVklBOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndWaWFMYXllclBvbHlnb24oaW50ICAgICBudW1fcG9seXMsCi0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgKnhsLAotICAgICAgICAgICAgICAgICAgICBkb3VibGUgICp5bCwKLSAgICAgICAgICAgICAgICAgICAgaW50ICAgICBtYXNrKQotewotICAgIGludCBpOwotICAgIGludCBwb2x5Q291bnQ7Ci0KLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19WSUFfU1RBUlQgJiYgbGVmd1N0YXRlICE9IExFRldfVklBKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3RGlkTGF5ZXIpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobnVtX3BvbHlzIDwgNCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0KLSAgICBpZiAobWFzayAmJiB2ZXJzaW9uTnVtIDwgNS44KSB7Ci0gICAgICAgIHJldHVybiBMRUZXX1dST05HX1ZFUlNJT047Ci0gICAgfQotCi0gICAgaWYgKCFsZWZ3VmFsaWRhdGVNYXNrTnVtYmVyKG1hc2spKSB7Ci0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIH0KLQotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KSB7Ci0gICAgICAgIGlmIChtYXNrKSB7Ci0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgUE9MWUdPTiBNQVNLICVkICIsIG1hc2spOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIFBPTFlHT04gIik7Ci0gICAgICAgIH0KLSAgICAgICAgcG9seUNvdW50ID0gMDsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9wb2x5czsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaSA9PSAwKQotICAgICAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIlLjExZyAlLjExZyAiLCAqeGwrKywgKnlsKyspOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKChpICUgNSkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiXG4gICAgICAgICAgICAgICUuMTFnICUuMTFnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnhsKyssICp5bCsrKTsKLSAgICAgICAgICAgICAgICAgICAgbGVmd0xpbmVzKys7Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIlLjExZyAlLjExZyAiLCAqeGwrKywgKnlsKyspOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgO1xuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG1hc2spIHsKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBQT0xZR09OIE1BU0sgJWQgIiwgbWFzayk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgUE9MWUdPTiAiKTsKLSAgICAgICAgfQotICAgICAgICBwb2x5Q291bnQgPSAwOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BvbHlzOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpID09IDApCi0gICAgICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiUuMTFnICUuMTFnIiwgKnhsKyssICp5bCsrKTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlmICgoaSAlIDUpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIlxuICAgICAgICAgICAgICAlLjExZyAlLjExZyIsICp4bCsrLCAqeWwrKyk7Ci0gICAgICAgICAgICAgICAgICAgIGxlZndMaW5lcysrOwotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiJS4xMWcgJS4xMWcgIiwgKnhsKyssICp5bCsrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiIDtcbiIpOwotICAgIH0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3U3RhdGUgPSBMRUZXX1ZJQTsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3VmlhVmlhcnVsZShjb25zdCBjaGFyICAgKnZpYVJ1bGVOYW1lLAotICAgICAgICAgICAgICAgZG91YmxlICAgICAgIHhDdXRTaXplLAotICAgICAgICAgICAgICAgZG91YmxlICAgICAgIHlDdXRTaXplLAotICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICpib3RNZXRhbExheWVyLAotICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICpjdXRMYXllciwKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAqdG9wTWV0YWxMYXllciwKLSAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICB4Q3V0U3BhY2luZywKLSAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICB5Q3V0U3BhY2luZywKLSAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICB4Qm90RW5jLAotICAgICAgICAgICAgICAgZG91YmxlICAgICAgIHlCb3RFbmMsCi0gICAgICAgICAgICAgICBkb3VibGUgICAgICAgeFRvcEVuYywKLSAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICB5VG9wRW5jKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX1ZJQV9TVEFSVCAmJiBsZWZ3U3RhdGUgIT0gTEVGV19WSUEpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLQotICAgIGlmIChsZWZ3VmlhSGFzVmFsKQotICAgICAgICByZXR1cm4gTEVGV19BTFJFQURZX0RFRklORUQ7ICAvLyBlaXRoZXIgUmVzaXN0YW5jZSBvcgotICAgIC8vIFZpYVJ1bGUgaGFzIGRlZmluZWQKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgVklBUlVMRSAlcyA7XG4iLCB2aWFSdWxlTmFtZSk7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgIENVVFNJWkUgJS4xMWcgJS4xMWcgO1xuIiwKLSAgICAgICAgICAgICAgICAgeEN1dFNpemUsIHlDdXRTaXplKTsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgTEFZRVJTICVzICVzICVzIDtcbiIsIGJvdE1ldGFsTGF5ZXIsCi0gICAgICAgICAgICAgICAgIGN1dExheWVyLCB0b3BNZXRhbExheWVyKTsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgQ1VUU1BBQ0lORyAlLjExZyAlLjExZyA7XG4iLAotICAgICAgICAgICAgICAgICB4Q3V0U3BhY2luZywgeUN1dFNwYWNpbmcpOwotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICBFTkNMT1NVUkUgJS4xMWcgJS4xMWcgJS4xMWcgJS4xMWcgO1xuIiwKLSAgICAgICAgICAgICAgICAgeEJvdEVuYywgeUJvdEVuYywgeFRvcEVuYywgeVRvcEVuYyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIFZJQVJVTEUgJXMgO1xuIiwgdmlhUnVsZU5hbWUpOwotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICBDVVRTSVpFICUuMTFnICUuMTFnIDtcbiIsIHhDdXRTaXplLCB5Q3V0U2l6ZSk7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgIExBWUVSUyAlcyAlcyAlcyA7XG4iLCBib3RNZXRhbExheWVyLAotICAgICAgICAgICAgICAgIGN1dExheWVyLCB0b3BNZXRhbExheWVyKTsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgQ1VUU1BBQ0lORyAlLjExZyAlLjExZyA7XG4iLAotICAgICAgICAgICAgICAgIHhDdXRTcGFjaW5nLCB5Q3V0U3BhY2luZyk7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgIEVOQ0xPU1VSRSAlLjExZyAlLjExZyAlLjExZyAlLjExZyA7XG4iLAotICAgICAgICAgICAgICAgIHhCb3RFbmMsIHlCb3RFbmMsIHhUb3BFbmMsIHlUb3BFbmMpOwotICAgIH0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3U3RhdGUgPSBMRUZXX1ZJQVZJQVJVTEU7Ci0gICAgbGVmd1ZpYUhhc1ZhbCA9IDE7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd1ZpYVZpYXJ1bGVSb3dDb2woaW50ICAgIG51bUN1dFJvd3MsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgICAgbnVtQ3V0Q29scykKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19WSUFWSUFSVUxFKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0KLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgUk9XQ09MICVkICVkIDtcbiIsIG51bUN1dFJvd3MsIG51bUN1dENvbHMpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgUk9XQ09MICVkICVkIDtcbiIsIG51bUN1dFJvd3MsIG51bUN1dENvbHMpOwotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd1ZpYVZpYXJ1bGVPcmlnaW4oZG91YmxlIHhPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICBkb3VibGUgeU9mZnNldCkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19WSUFWSUFSVUxFKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0KLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgT1JJR0lOICUuMTFnICUuMTFnIDtcbiIsIHhPZmZzZXQsIHlPZmZzZXQpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgT1JJR0lOICUuMTFnICUuMTFnIDtcbiIsIHhPZmZzZXQsIHlPZmZzZXQpOwotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd1ZpYVZpYXJ1bGVPZmZzZXQoZG91YmxlIHhCb3RPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICBkb3VibGUgeUJvdE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB4VG9wT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHlUb3BPZmZzZXQpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfVklBVklBUlVMRSkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotCi0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgIE9GRlNFVCAlLjExZyAlLjExZyAlLjExZyAlLjExZyA7XG4iLAotICAgICAgICAgICAgICAgICB4Qm90T2Zmc2V0LCB5Qm90T2Zmc2V0LCB4VG9wT2Zmc2V0LCB5VG9wT2Zmc2V0KTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgIE9GRlNFVCAlLjExZyAlLjExZyAlLjExZyAlLjExZyA7XG4iLAotICAgICAgICAgICAgICAgIHhCb3RPZmZzZXQsIHlCb3RPZmZzZXQsIHhUb3BPZmZzZXQsIHlUb3BPZmZzZXQpOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndWaWFWaWFydWxlUGF0dGVybihjb25zdCBjaGFyICpjdXRQYXR0ZXJuKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX1ZJQVZJQVJVTEUpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLQotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICBQQVRURVJOICVzIDtcbiIsIGN1dFBhdHRlcm4pOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgUEFUVEVSTiAlcyA7XG4iLCBjdXRQYXR0ZXJuKTsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3U3RyaW5nUHJvcGVydHkoY29uc3QgY2hhciAgICpwcm9wTmFtZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKnByb3BWYWx1ZSkKLXsKLSAgICBpZiAoKGxlZndTdGF0ZSAhPSBMRUZXX1ZJQSkgJiYgKGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSKSAmJgotICAgICAgICAobGVmd1N0YXRlICE9IExFRldfVklBUlVMRSkgJiYgKGxlZndTdGF0ZSAhPSBMRUZXX01BQ1JPX1NUQVJUKSAmJgotICAgICAgICAobGVmd1N0YXRlICE9IExFRldfTUFDUk8pICYmIChsZWZ3U3RhdGUgIT0gTEVGV19WSUFfU1RBUlQpICYmCi0gICAgICAgIChsZWZ3U3RhdGUgIT0gTEVGV19WSUFSVUxFX1NUQVJUKSAmJiAobGVmd1N0YXRlICE9IExFRldfTEFZRVJfU1RBUlQpICYmCi0gICAgICAgIChsZWZ3U3RhdGUgIT0gTEVGV19CRUdJTkVYVCkgJiYgKGxlZndTdGF0ZSAhPSBMRUZXX1ZJQVZJQVJVTEUpICYmCi0gICAgICAgIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkdfU1RBUlQpICYmCi0gICAgICAgIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUlJPVVRJTkcpKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0KLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsCi0gICAgICAgICAgICAgICAgIChjaGFyKikgIiAgIFBST1BFUlRZICVzIFwiJXNcIiA7XG4iLCBwcm9wTmFtZSwgcHJvcFZhbHVlKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBQUk9QRVJUWSAlcyBcIiVzXCIgO1xuIiwgcHJvcE5hbWUsIHByb3BWYWx1ZSk7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd1JlYWxQcm9wZXJ0eShjb25zdCBjaGFyICpwcm9wTmFtZSwKLSAgICAgICAgICAgICAgICAgZG91YmxlICAgICBwcm9wVmFsdWUpCi17Ci0gICAgaWYgKChsZWZ3U3RhdGUgIT0gTEVGV19WSUEpICYmIChsZWZ3U3RhdGUgIT0gTEVGV19MQVlFUikgJiYKLSAgICAgICAgKGxlZndTdGF0ZSAhPSBMRUZXX1ZJQVJVTEUpICYmIChsZWZ3U3RhdGUgIT0gTEVGV19NQUNST19TVEFSVCkgJiYKLSAgICAgICAgKGxlZndTdGF0ZSAhPSBMRUZXX01BQ1JPKSAmJiAobGVmd1N0YXRlICE9IExFRldfVklBX1NUQVJUKSAmJgotICAgICAgICAobGVmd1N0YXRlICE9IExFRldfVklBUlVMRV9TVEFSVCkgJiYgKGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSX1NUQVJUKSAmJgotICAgICAgICAobGVmd1N0YXRlICE9IExFRldfQkVHSU5FWFQpICYmIChsZWZ3U3RhdGUgIT0gTEVGV19WSUFWSUFSVUxFKSkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotCi0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBQUk9QRVJUWSAlcyAlLjExZyA7XG4iLCBwcm9wTmFtZSwgcHJvcFZhbHVlKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBQUk9QRVJUWSAlcyAlLjExZyA7XG4iLCBwcm9wTmFtZSwgcHJvcFZhbHVlKTsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3SW50UHJvcGVydHkoY29uc3QgY2hhciAgKnByb3BOYW1lLAotICAgICAgICAgICAgICAgIGludCAgICAgICAgIHByb3BWYWx1ZSkKLXsKLSAgICBpZiAoKGxlZndTdGF0ZSAhPSBMRUZXX1ZJQSkgJiYgKGxlZndTdGF0ZSAhPSBMRUZXX0xBWUVSKSAmJgotICAgICAgICAobGVmd1N0YXRlICE9IExFRldfVklBUlVMRSkgJiYgKGxlZndTdGF0ZSAhPSBMRUZXX01BQ1JPX1NUQVJUKSAmJgotICAgICAgICAobGVmd1N0YXRlICE9IExFRldfTUFDUk8pICYmIChsZWZ3U3RhdGUgIT0gTEVGV19WSUFfU1RBUlQpICYmCi0gICAgICAgIChsZWZ3U3RhdGUgIT0gTEVGV19WSUFSVUxFX1NUQVJUKSAmJiAobGVmd1N0YXRlICE9IExFRldfTEFZRVJfU1RBUlQpICYmCi0gICAgICAgIChsZWZ3U3RhdGUgIT0gTEVGV19CRUdJTkVYVCkgJiYgKGxlZndTdGF0ZSAhPSBMRUZXX1ZJQVZJQVJVTEUpKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0KLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIFBST1BFUlRZICVzICVkIDtcbiIsIHByb3BOYW1lLCBwcm9wVmFsdWUpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIFBST1BFUlRZICVzICVkIDtcbiIsIHByb3BOYW1lLCBwcm9wVmFsdWUpOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndFbmRWaWEoY29uc3QgY2hhciAqdmlhTmFtZSkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19WSUFfU1RBUlQgJiYgbGVmd1N0YXRlICE9IExFRldfVklBICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX1ZJQVZJQVJVTEUpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIkVORCAlc1xuXG4iLCB2aWFOYW1lKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJFTkQgJXNcblxuIiwgdmlhTmFtZSk7Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3U3RhdGUgPSBMRUZXX1ZJQV9FTkQ7Ci0gICAgbGVmd0RpZExheWVyID0gMDsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotLy8gaW50ZXJuYWwgZnVuY3Rpb24KLWludAotbGVmd1ZpYVJ1bGVQcnRMYXllcihjb25zdCBjaGFyICAqbGF5ZXJOYW1lLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqZGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICBtaW5XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgbWF4V2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgIG92ZXJoYW5nLAotICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICBtZXRhbE92ZXJoYW5nKQotewotICAgIGxlZndPYnNvbGV0ZU51bSA9IExFRldfVklBUlVMRUdFTkVSQVRFOwotICAgIGlmICghbGF5ZXJOYW1lIHx8IGxheWVyTmFtZSA9PSAwIHx8ICpsYXllck5hbWUgPT0gMCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBMQVlFUiAlcyA7XG4iLCBsYXllck5hbWUpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIExBWUVSICVzIDtcbiIsIGxheWVyTmFtZSk7Ci0gICAgaWYgKGRpcmVjdGlvbiAmJiBzdHJjbXAoZGlyZWN0aW9uLCAiSE9SSVpPTlRBTCIpICYmCi0gICAgICAgIHN0cmNtcChkaXJlY3Rpb24sICJWRVJUSUNBTCIpKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAodmVyc2lvbk51bSA+PSA1LjYgJiYgKGRpcmVjdGlvbiB8fCBvdmVyaGFuZyB8fCBtZXRhbE92ZXJoYW5nKSkKLSAgICAgICAgcmV0dXJuIExFRldfT0JTT0xFVEU7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpIHsKLSAgICAgICAgaWYgKGRpcmVjdGlvbikgewotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIERJUkVDVElPTiAlcyA7XG4iLCBkaXJlY3Rpb24pOwotICAgICAgICAgICAgbGVmd0xpbmVzID0gbGVmd0xpbmVzICsgMjsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBsZWZ3TGluZXMrKzsKLSAgICAgICAgaWYgKG1pbldpZHRoIHx8IG1heFdpZHRoKSB7Ci0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgV0lEVEggJS4xMWcgVE8gJS4xMWcgO1xuIiwKLSAgICAgICAgICAgICAgICAgICAgIG1pbldpZHRoLCBtYXhXaWR0aCk7Ci0gICAgICAgICAgICBsZWZ3TGluZXMrKzsKLSAgICAgICAgfQotICAgICAgICBpZiAob3ZlcmhhbmcpIHsKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICBPVkVSSEFORyAlLjExZyA7XG4iLCBvdmVyaGFuZyk7Ci0gICAgICAgICAgICBsZWZ3TGluZXMrKzsKLSAgICAgICAgfQotICAgICAgICBpZiAobWV0YWxPdmVyaGFuZykgewotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIE1FVEFMT1ZFUkhBTkcgJS4xMWcgO1xuIiwKLSAgICAgICAgICAgICAgICAgICAgIG1ldGFsT3ZlcmhhbmcpOwotICAgICAgICAgICAgbGVmd0xpbmVzKys7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgRElSRUNUSU9OICVzIDtcbiIsIGRpcmVjdGlvbik7Ci0gICAgICAgICAgICBsZWZ3TGluZXMgPSBsZWZ3TGluZXMgKyAyOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGxlZndMaW5lcysrOwotICAgICAgICBpZiAobWluV2lkdGggfHwgbWF4V2lkdGgpIHsKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBXSURUSCAlLjExZyBUTyAlLjExZyA7XG4iLAotICAgICAgICAgICAgICAgICAgICBtaW5XaWR0aCwgbWF4V2lkdGgpOwotICAgICAgICAgICAgbGVmd0xpbmVzKys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG92ZXJoYW5nKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgT1ZFUkhBTkcgJS4xMWcgO1xuIiwgb3ZlcmhhbmcpOwotICAgICAgICAgICAgbGVmd0xpbmVzKys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1ldGFsT3ZlcmhhbmcpIHsKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBNRVRBTE9WRVJIQU5HICUuMTFnIDtcbiIsIG1ldGFsT3ZlcmhhbmcpOwotICAgICAgICAgICAgbGVmd0xpbmVzKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd1N0YXJ0VmlhUnVsZShjb25zdCBjaGFyICp2aWFSdWxlTmFtZSkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1N0YXRlID09IExFRldfVklBUlVMRV9TVEFSVCB8fAotICAgICAgICBsZWZ3U3RhdGUgPT0gTEVGV19WSUFSVUxFKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0lOSVQgJiYgbGVmd1N0YXRlIDwgTEVGV19FTkQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsgIC8vIG5vdCBvZiB0aGUgRU5EcwotCi0gICAgaWYgKCF2aWFSdWxlTmFtZSB8fCB2aWFSdWxlTmFtZSA9PSAwIHx8ICp2aWFSdWxlTmFtZSA9PSAwKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIlZJQVJVTEUgJXNcbiIsIHZpYVJ1bGVOYW1lKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJWSUFSVUxFICVzXG4iLCB2aWFSdWxlTmFtZSk7Ci0gICAgbGVmd0xpbmVzKys7Ci0KLSAgICBsZWZ3U3luQXJyYXlbTEVGV19WSUFSVUxFX1NUQVJUXSA9IDE7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19WSUFSVUxFX1NUQVJUOwotICAgIGxlZndEaWRMYXllciA9IDA7ICAgICAgICAgICAvLyBoYXNuJ3Qgc2V0IHRoZSBsYXllciB5ZXQKLSAgICBsZWZ3TnVtVmlhUnVsZUxheWVycyA9IDA7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd1ZpYVJ1bGVMYXllcihjb25zdCBjaGFyICpsYXllck5hbWUsCi0gICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgZG91YmxlICAgICBtaW5XaWR0aCwKLSAgICAgICAgICAgICAgICAgZG91YmxlICAgICBtYXhXaWR0aCwgICAgICAgIC8vIG9wdGlvbmFsIAotICAgICAgICAgICAgICAgICBkb3VibGUgICAgIG92ZXJoYW5nLAotICAgICAgICAgICAgICAgICBkb3VibGUgICAgIG1ldGFsT3ZlcmhhbmcpCi17IC8vIG9wdGlvbmFsIAotICAgIGludCBzdGF0dXM7Ci0KLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfVklBUlVMRV9TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19WSUFSVUxFKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndOdW1WaWFSdWxlTGF5ZXJzID49IDIpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoKHN0YXR1cyA9IGxlZndWaWFSdWxlUHJ0TGF5ZXIobGF5ZXJOYW1lLCBkaXJlY3Rpb24sIG1pbldpZHRoLCBtYXhXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmhhbmcsIG1ldGFsT3ZlcmhhbmcpKSAhPSBMRUZXX09LKQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIGxlZndOdW1WaWFSdWxlTGF5ZXJzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19WSUFSVUxFOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndWaWFSdWxlVmlhKGNvbnN0IGNoYXIgKnZpYU5hbWUpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX1ZJQVJVTEUpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd051bVZpYVJ1bGVMYXllcnMgIT0gMikgICAvLyB0aGlzIHJvdXRpbmUgaGFzIHRvIGJlIGFmdGVyIHR3byBsYXllcnMKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOyAgICAgIC8vIGJlIHdyaXR0ZW4KLSAgICBpZiAoIXZpYU5hbWUgfHwgISp2aWFOYW1lKSAgICAgIC8vIHZpYU5hbWUgaXMgcmVxdWlyZWQKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICBWSUEgJXMgO1xuIiwgdmlhTmFtZSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgVklBICVzIDtcbiIsIHZpYU5hbWUpOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndFbmRWaWFSdWxlKGNvbnN0IGNoYXIgKnZpYVJ1bGVOYW1lKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX1ZJQVJVTEVfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfVklBUlVMRSkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiRU5EICVzXG5cbiIsIHZpYVJ1bGVOYW1lKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJFTkQgJXNcblxuIiwgdmlhUnVsZU5hbWUpOwotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19WSUFSVUxFX0VORDsKLSAgICBsZWZ3RGlkTGF5ZXIgPSAwOwotICAgIGxlZndOdW1WaWFSdWxlTGF5ZXJzID0gMDsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3U3RhcnRWaWFSdWxlR2VuKGNvbnN0IGNoYXIgKnZpYVJ1bGVOYW1lKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3U3RhdGUgPT0gTEVGV19WSUFSVUxFR0VOX1NUQVJUIHx8Ci0gICAgICAgIGxlZndTdGF0ZSA9PSBMRUZXX1ZJQVJVTEVHRU4pCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfSU5JVCAmJiBsZWZ3U3RhdGUgPCBMRUZXX0VORCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOyAgLy8gbm90IG9mIHRoZSBFTkRzCi0KLSAgICBpZiAoIXZpYVJ1bGVOYW1lIHx8IHZpYVJ1bGVOYW1lID09IDAgfHwgKnZpYVJ1bGVOYW1lID09IDApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiVklBUlVMRSAlcyBHRU5FUkFURSIsIHZpYVJ1bGVOYW1lKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJWSUFSVUxFICVzIEdFTkVSQVRFIiwgdmlhUnVsZU5hbWUpOwotICAgIGxlZndMaW5lcysrOwotCi0gICAgbGVmd1N5bkFycmF5W0xFRldfVklBUlVMRUdFTl9TVEFSVF0gPSAxOwotICAgIGxlZndTdGF0ZSA9IExFRldfVklBUlVMRUdFTl9TVEFSVDsKLSAgICBsZWZ3RGlkTGF5ZXIgPSAwOyAgICAgICAgICAgLy8gaGFzbid0IHNldCB0aGUgbGF5ZXIgeWV0Ci0gICAgbGVmd051bVZpYVJ1bGVMYXllcnMgPSAwOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndWaWFSdWxlR2VuRGVmYXVsdCgpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX1ZJQVJVTEVHRU5fU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfVklBUlVMRUdFTikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiIERFRkFVTFQiKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgREVGQVVMVCIpOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndWaWFSdWxlR2VuTGF5ZXIoY29uc3QgY2hhciAgKmxheWVyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmRpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgbWluV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgIG1heFdpZHRoLCAgICAgICAgLy8gb3B0aW9uYWwgCi0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgIG92ZXJoYW5nLAotICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICBtZXRhbE92ZXJoYW5nKQoteyAvLyBvcHRpb25hbCAKLSAgICBpbnQgc3RhdHVzOwotCi0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX1ZJQVJVTEVHRU5fU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfVklBUlVMRUdFTikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3TnVtVmlhUnVsZUxheWVycyA+PSAyKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpICAgICAgICAgICAgICAgIC8vIGFkZCBhIG5ldyBsaW5lIHNpbmNlLCBsZWZ3VmlhUnVsZUdlbgotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiXG4iKTsgIC8vICYgbGVmd1ZpYVJ1bGVHZW5EZWZhdWx0IGRvIG5vdAotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIlxuIik7Ci0gICAgaWYgKChzdGF0dXMgPSBsZWZ3VmlhUnVsZVBydExheWVyKGxheWVyTmFtZSwgZGlyZWN0aW9uLCBtaW5XaWR0aCwgbWF4V2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJoYW5nLCBtZXRhbE92ZXJoYW5nKSkgIT0gTEVGV19PSykKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICBsZWZ3TnVtVmlhUnVsZUxheWVycysrOwotICAgIGxlZndTdGF0ZSA9IExFRldfVklBUlVMRUdFTjsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3VmlhUnVsZUdlbkxheWVyRW5jbG9zdXJlKGNvbnN0IGNoYXIgKmxheWVyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICBvdmVyaGFuZzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgb3ZlcmhhbmcyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgIG1pbldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgIG1heFdpZHRoKQoteyAgICAgICAvLyBvcHRpb25hbCAKLQotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19WSUFSVUxFR0VOX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX1ZJQVJVTEVHRU4pCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd051bVZpYVJ1bGVMYXllcnMgPj0gMikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotCi0gICAgaWYgKCFsYXllck5hbWUgfHwgbGF5ZXJOYW1lID09IDAgfHwgKmxheWVyTmFtZSA9PSAwKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIlxuICAgTEFZRVIgJXMgO1xuIiwgbGF5ZXJOYW1lKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJcbiAgIExBWUVSICVzIDtcbiIsIGxheWVyTmFtZSk7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpIHsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIEVOQ0xPU1VSRSAlLjExZyAlLjExZyA7XG4iLCBvdmVyaGFuZzEsCi0gICAgICAgICAgICAgICAgIG92ZXJoYW5nMik7Ci0gICAgICAgIGxlZndMaW5lcyA9IGxlZndMaW5lcyArIDI7Ci0gICAgICAgIGlmIChtaW5XaWR0aCB8fCBtYXhXaWR0aCkgewotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIFdJRFRIICUuMTFnIFRPICUuMTFnIDtcbiIsIG1pbldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGgpOwotICAgICAgICAgICAgbGVmd0xpbmVzKys7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgRU5DTE9TVVJFICUuMTFnICUuMTFnIDtcbiIsIG92ZXJoYW5nMSwgb3ZlcmhhbmcyKTsKLSAgICAgICAgbGVmd0xpbmVzID0gbGVmd0xpbmVzICsgMjsKLSAgICAgICAgaWYgKG1pbldpZHRoIHx8IG1heFdpZHRoKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgV0lEVEggJS4xMWcgVE8gJS4xMWcgO1xuIiwgbWluV2lkdGgsIG1heFdpZHRoKTsKLSAgICAgICAgICAgIGxlZndMaW5lcysrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbGVmd051bVZpYVJ1bGVMYXllcnMrKzsKLSAgICBsZWZ3U3RhdGUgPSBMRUZXX1ZJQVJVTEVHRU47Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd1ZpYVJ1bGVHZW5MYXllcjMoY29uc3QgY2hhciAqbGF5ZXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICB4bCwKLSAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgeWwsCi0gICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgIHhoLAotICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICB5aCwKLSAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgeFNwYWNpbmcsCi0gICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgIHlTcGFjaW5nLAotICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICByZXNpc3RhbmNlKQoteyAgICAvLyBvcHRpb25hbCAKLQotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19WSUFSVUxFR0VOKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndOdW1WaWFSdWxlTGF5ZXJzICE9IDIpICAgLy8gdGhpcyByb3V0aW5lIGhhcyB0byBiZSBhZnRlciB0d28gbGF5ZXJzCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsgICAgICAvLyBiZSB3cml0dGVuCi0gICAgaWYgKCFsYXllck5hbWUgfHwgbGF5ZXJOYW1lID09IDAgfHwgKmxheWVyTmFtZSA9PSAwKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgTEFZRVIgJXMgO1xuIiwgbGF5ZXJOYW1lKTsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsCi0gICAgICAgICAgICAgICAgIChjaGFyKikgIiAgICAgIFJFQ1QgJS4xMWcgJS4xMWcgJS4xMWcgJS4xMWcgO1xuIiwgeGwsIHlsLCB4aCwgeWgpOwotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwKLSAgICAgICAgICAgICAgICAgKGNoYXIqKSAiICAgICAgU1BBQ0lORyAlLjExZyBCWSAlLjExZyA7XG4iLCB4U3BhY2luZywgeVNwYWNpbmcpOwotICAgICAgICBpZiAocmVzaXN0YW5jZSkgewotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIFJFU0lTVEFOQ0UgJS4xMWcgO1xuIiwgcmVzaXN0YW5jZSk7Ci0gICAgICAgICAgICBsZWZ3TGluZXMrKzsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBMQVlFUiAlcyA7XG4iLCBsYXllck5hbWUpOwotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgUkVDVCAlLjExZyAlLjExZyAlLjExZyAlLjExZyA7XG4iLAotICAgICAgICAgICAgICAgIHhsLCB5bCwgeGgsIHloKTsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgIFNQQUNJTkcgJS4xMWcgQlkgJS4xMWcgO1xuIiwgeFNwYWNpbmcsIHlTcGFjaW5nKTsKLSAgICAgICAgaWYgKHJlc2lzdGFuY2UpIHsKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBSRVNJU1RBTkNFICUuMTFnIDtcbiIsIHJlc2lzdGFuY2UpOwotICAgICAgICAgICAgbGVmd0xpbmVzKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbGVmd0xpbmVzICs9IDM7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd0VuZFZpYVJ1bGVHZW4oY29uc3QgY2hhciAqdmlhUnVsZU5hbWUpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfVklBUlVMRUdFTl9TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19WSUFSVUxFR0VOKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJFTkQgJXNcblxuIiwgdmlhUnVsZU5hbWUpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIkVORCAlc1xuXG4iLCB2aWFSdWxlTmFtZSk7Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3U3RhdGUgPSBMRUZXX1ZJQVJVTEVHRU5fRU5EOwotICAgIGxlZndEaWRMYXllciA9IDA7Ci0gICAgbGVmd051bVZpYVJ1bGVMYXllcnMgPSAwOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndTdGFydE5vbkRlZmF1bHRSdWxlKGNvbnN0IGNoYXIgKnJ1bGVOYW1lKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3U3RhdGUgPT0gTEVGV19OT05ERUZBVUxUUlVMRV9TVEFSVCB8fAotICAgICAgICBsZWZ3U3RhdGUgPT0gTEVGV19OT05ERUZBVUxUUlVMRSkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19JTklUICYmIGxlZndTdGF0ZSA8IExFRldfRU5EKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7ICAvLyBub3Qgb2YgdGhlIEVORHMKLQotICAgIGlmICghcnVsZU5hbWUgfHwgcnVsZU5hbWUgPT0gMCB8fCAqcnVsZU5hbWUgPT0gMCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJOT05ERUZBVUxUUlVMRSAlc1xuIiwgcnVsZU5hbWUpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIk5PTkRFRkFVTFRSVUxFICVzXG4iLCBydWxlTmFtZSk7Ci0gICAgbGVmd0xpbmVzKys7Ci0KLSAgICBsZWZ3U3luQXJyYXlbTEVGV19OT05ERUZBVUxUUlVMRV9TVEFSVF0gPSAxOwotICAgIGxlZndTdGF0ZSA9IExFRldfTk9OREVGQVVMVFJVTEVfU1RBUlQ7Ci0gICAgbGVmd0RpZExheWVyID0gMDsgICAgICAgICAgIC8vIGhhc24ndCBzZXQgdGhlIGxheWVyIHlldAotICAgIGxlZndJc05vbkRlZmF1bHRSdWxlID0gMTsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3Tm9uRGVmYXVsdFJ1bGVIYXJkc3BhY2luZygpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX05PTkRFRkFVTFRSVUxFX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX05PTkRFRkFVTFRSVUxFKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBIQVJEU1BBQ0lORyA7XG4iKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBIQVJEU1BBQ0lORyA7XG4iKTsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3Tm9uRGVmYXVsdFJ1bGVTdGFydFZpYShjb25zdCBjaGFyICAgKnZpYU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKmlzRGVmYXVsdCkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1N0YXRlID09IExFRldfVklBX1NUQVJUIHx8IGxlZndTdGF0ZSA9PSBMRUZXX1ZJQSB8fAotICAgICAgICAobGVmd1N0YXRlICE9IExFRldfTk9OREVGQVVMVFJVTEVfU1RBUlQgJiYKLSAgICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX05PTkRFRkFVTFRSVUxFKSkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotCi0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpIHsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIFZJQSAlcyAiLCB2aWFOYW1lKTsKLSAgICAgICAgaWYgKGlzRGVmYXVsdCAmJiBzdHJjbXAoaXNEZWZhdWx0LCAiREVGQVVMVCIpID09IDApCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiREVGQVVMVCIpOwotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiXG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgVklBICVzICIsIHZpYU5hbWUpOwotICAgICAgICBpZiAoaXNEZWZhdWx0ICYmIHN0cmNtcChpc0RlZmF1bHQsICJERUZBVUxUIikgPT0gMCkKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJERUZBVUxUIik7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJcbiIpOwotICAgIH0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3VmlhSGFzVmFsID0gMDsKLQotICAgIGxlZndTeW5BcnJheVtMRUZXX1ZJQV9TVEFSVF0gPSAxOwotICAgIGxlZndTdGF0ZSA9IExFRldfVklBX1NUQVJUOwotICAgIGxlZndEaWRMYXllciA9IDA7ICAgICAgICAgICAvLyBoYXNuJ3Qgc2V0IHRoZSBsYXllciB5ZXQKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3Tm9uRGVmYXVsdFJ1bGVFbmRWaWEoY29uc3QgY2hhciAqdmlhTmFtZSkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19WSUFfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfVklBKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBFTkQgJXNcblxuIiwgdmlhTmFtZSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgRU5EICVzXG5cbiIsIHZpYU5hbWUpOwotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19OT05ERUZBVUxUUlVMRTsKLSAgICBsZWZ3RGlkTGF5ZXIgPSAwOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndOb25EZWZhdWx0UnVsZVVzZVZpYShjb25zdCBjaGFyICp2aWFOYW1lKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19OT05ERUZBVUxUUlVMRV9TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19OT05ERUZBVUxUUlVMRSkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgVVNFVklBICVzIDtcbiIsIHZpYU5hbWUpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIFVTRVZJQSAlcyA7XG4iLCB2aWFOYW1lKTsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3Tm9uRGVmYXVsdFJ1bGVVc2VWaWFSdWxlKGNvbnN0IGNoYXIgKnZpYVJ1bGVOYW1lKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19OT05ERUZBVUxUUlVMRV9TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19OT05ERUZBVUxUUlVMRSkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgVVNFVklBUlVMRSAlcyA7XG4iLCB2aWFSdWxlTmFtZSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgVVNFVklBUlVMRSAlcyA7XG4iLCB2aWFSdWxlTmFtZSk7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd05vbkRlZmF1bHRSdWxlTWluQ3V0cyhjb25zdCBjaGFyICAgICpsYXllck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgbnVtQ3V0cykKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTk9OREVGQVVMVFJVTEVfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTk9OREVGQVVMVFJVTEUpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIE1JTkNVVFMgJXMgJWQgO1xuIiwgbGF5ZXJOYW1lLCBudW1DdXRzKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBNSU5DVVRTICVzICVkIDtcbiIsIGxheWVyTmFtZSwgbnVtQ3V0cyk7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd05vbkRlZmF1bHRSdWxlTGF5ZXIoY29uc3QgY2hhciAgKnJvdXRpbmdMYXllck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgIG1pblNwYWNpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICB3aXJlRXh0ZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgcmVzaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgY2FwYWNpdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICBlZGdlQ2FwKQotewotICAgIGxlZndPYnNvbGV0ZU51bSA9IExFRldfTk9OREVGQVVMVFJVTEVMQVlFUjsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTk9OREVGQVVMVFJVTEVfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTk9OREVGQVVMVFJVTEUpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIXJvdXRpbmdMYXllck5hbWUgfHwgcm91dGluZ0xheWVyTmFtZSA9PSAwIHx8ICpyb3V0aW5nTGF5ZXJOYW1lID09IDApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmICh2ZXJzaW9uTnVtID49IDUuNiAmJiAocmVzaXN0IHx8IGNhcGFjaXRhbmNlIHx8IGVkZ2VDYXApKQotICAgICAgICByZXR1cm4gTEVGV19PQlNPTEVURTsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgTEFZRVIgJXNcbiIsIHJvdXRpbmdMYXllck5hbWUpOwotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgV0lEVEggJS4xMWcgO1xuIiwgd2lkdGgpOwotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgU1BBQ0lORyAlLjExZyA7XG4iLCBtaW5TcGFjaW5nKTsKLSAgICAgICAgaWYgKHdpcmVFeHRlbnNpb24pIHsKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLAotICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSAiICAgICAgV0lSRUVYVEVOU0lPTiAlLjExZyA7XG4iLCB3aXJlRXh0ZW5zaW9uKTsKLSAgICAgICAgICAgIGxlZndMaW5lcysrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXNpc3QpIHsKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICBSRVNJU1RBTkNFIFJQRVJTUSAlLjExZyA7XG4iLCByZXNpc3QpOwotICAgICAgICAgICAgbGVmd0xpbmVzKys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNhcGFjaXRhbmNlKSB7Ci0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgQ0FQQUNJVEFOQ0UgQ1BFUlNRRElTVCAlLjExZyA7XG4iLAotICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdGFuY2UpOwotICAgICAgICAgICAgbGVmd0xpbmVzKys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVkZ2VDYXApIHsKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICBFREdFQ0FQQUNJVEFOQ0UgJS4xMWcgO1xuIiwgZWRnZUNhcCk7Ci0gICAgICAgICAgICBsZWZ3TGluZXMrKzsKLSAgICAgICAgfQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgRU5EICVzXG5cbiIsIHJvdXRpbmdMYXllck5hbWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBMQVlFUiAlc1xuIiwgcm91dGluZ0xheWVyTmFtZSk7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBXSURUSCAlLjExZyA7XG4iLCB3aWR0aCk7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBTUEFDSU5HICUuMTFnIDtcbiIsIG1pblNwYWNpbmcpOwotICAgICAgICBpZiAod2lyZUV4dGVuc2lvbikgewotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgIFdJUkVFWFRFTlNJT04gJS4xMWcgO1xuIiwgd2lyZUV4dGVuc2lvbik7Ci0gICAgICAgICAgICBsZWZ3TGluZXMrKzsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVzaXN0KSB7Ci0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgUkVTSVNUQU5DRSBSUEVSU1EgJS4xMWcgO1xuIiwgcmVzaXN0KTsKLSAgICAgICAgICAgIGxlZndMaW5lcysrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjYXBhY2l0YW5jZSkgewotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwKLSAgICAgICAgICAgICAgICAgICAgIiAgICAgIENBUEFDSVRBTkNFIENQRVJTUURJU1QgJS4xMWcgO1xuIiwgY2FwYWNpdGFuY2UpOwotICAgICAgICAgICAgbGVmd0xpbmVzKys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVkZ2VDYXApIHsKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBFREdFQ0FQQUNJVEFOQ0UgJS4xMWcgO1xuIiwgZWRnZUNhcCk7Ci0gICAgICAgICAgICBsZWZ3TGluZXMrKzsKLSAgICAgICAgfQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgRU5EICVzXG5cbiIsIHJvdXRpbmdMYXllck5hbWUpOwotICAgIH0KLQotICAgIGxlZndMaW5lcyA9IGxlZndMaW5lcyArIDQ7Ci0gICAgbGVmd1N5bkFycmF5W0xFRldfTk9OREVGQVVMVFJVTEVdID0gMTsKLSAgICBsZWZ3U3RhdGUgPSBMRUZXX05PTkRFRkFVTFRSVUxFOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndFbmROb25EZWZhdWx0UnVsZShjb25zdCBjaGFyICpydWxlTmFtZSkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19OT05ERUZBVUxUUlVMRV9TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19OT05ERUZBVUxUUlVMRSAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19WSUFfRU5EICYmIGxlZndTdGF0ZSAhPSBMRUZXX1NQQUNJTkdfRU5EKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgLy8gY2FuIGJlIHJpZ2h0IGFmdGVyIGEgdmlhIG9yIHNwYWNpbmcgZGVmaW5lZCBpbiBub25kZWZhdWx0cnVsZSAKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIkVORCAlc1xuXG4iLCBydWxlTmFtZSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiRU5EICVzXG5cbiIsIHJ1bGVOYW1lKTsKLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTdGF0ZSA9IExFRldfTk9OREVGQVVMVFJVTEVfRU5EOwotICAgIGxlZndEaWRMYXllciA9IDA7Ci0gICAgbGVmd0lzTm9uRGVmYXVsdFJ1bGUgPSAwOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndTdGFydFNwYWNpbmcoKQotewotICAgIGxlZndPYnNvbGV0ZU51bSA9IExFRldfU1BBQ0lORzsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1N0YXRlID09IExFRldfU1BBQ0lOR19TVEFSVCB8fAotICAgICAgICBsZWZ3U3RhdGUgPT0gTEVGV19TUEFDSU5HKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0lOSVQgJiYgbGVmd1N0YXRlIDwgTEVGV19FTkQgJiYKLSAgICAgICAgKCFsZWZ3SXNOb25EZWZhdWx0UnVsZSkpICAvLyBzcGFjaW5nIGRlZmluZWQgaW4gbm9uZGVmYXVsdHJ1bGUKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOyAgLy8gbm90IG9mIHRoZSBFTkRzCi0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJTUEFDSU5HXG4iKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJTUEFDSU5HXG4iKTsKLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTdGF0ZSA9IExFRldfU1BBQ0lOR19TVEFSVDsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3U3BhY2luZyhjb25zdCBjaGFyICAqbGF5ZXJOYW1lMSwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgICpsYXllck5hbWUyLAotICAgICAgICAgICAgZG91YmxlICAgICAgbWluU3BhY2UsCi0gICAgICAgICAgICBjb25zdCBjaGFyICAqc3RhY2spCi17ICAvLyBvcHRpb2FubCAKLSAgICBsZWZ3T2Jzb2xldGVOdW0gPSBMRUZXX1NQQUNJTkc7Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfU1BBQ0lOR19TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19TUEFDSU5HKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsYXllck5hbWUxIHx8IGxheWVyTmFtZTEgPT0gMCB8fCAqbGF5ZXJOYW1lMSA9PSAwKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAoIWxheWVyTmFtZTIgfHwgbGF5ZXJOYW1lMiA9PSAwIHx8ICpsYXllck5hbWUyID09IDApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KSB7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBTQU1FTkVUICVzICVzICUuMTFnICIsCi0gICAgICAgICAgICAgICAgIGxheWVyTmFtZTEsIGxheWVyTmFtZTIsIG1pblNwYWNlKTsKLSAgICAgICAgaWYgKHN0YWNrICYmIHN0cmNtcChzdGFjaywgIlNUQUNLIikgPT0gMCkKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJTVEFDSyAiKTsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIjtcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBTQU1FTkVUICVzICVzICUuMTFnICIsIGxheWVyTmFtZTEsIGxheWVyTmFtZTIsCi0gICAgICAgICAgICAgICAgbWluU3BhY2UpOwotICAgICAgICBpZiAoc3RhY2sgJiYgc3RyY21wKHN0YWNrLCAiU1RBQ0siKSA9PSAwKQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIlNUQUNLICIpOwotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiO1xuIik7Ci0gICAgfQotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19TUEFDSU5HOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndFbmRTcGFjaW5nKCkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19TUEFDSU5HX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX1NQQUNJTkcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIkVORCBTUEFDSU5HXG5cbiIpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIkVORCBTUEFDSU5HXG5cbiIpOwotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19TUEFDSU5HX0VORDsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3VW5pdmVyc2FsTm9pc2VNYXJnaW4oZG91YmxlIGhpZ2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGxvdykKLXsKLSAgICBsZWZ3T2Jzb2xldGVOdW0gPSBMRUZXX05PSVNFTUFSR0lOOwotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19JTklUICYmIGxlZndTdGF0ZSA8IExFRldfRU5EKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7ICAvLyBub3Qgb2YgdGhlIEVORHMKLSAgICBpZiAobGVmd1N5bkFycmF5W0xFRldfTk9JU0VNQVJHSU5dKQotICAgICAgICByZXR1cm4gTEVGV19BTFJFQURZX0RFRklORUQ7Ci0gICAgaWYgKHZlcnNpb25OdW0gPj0gNS40KQotICAgICAgICByZXR1cm4gTEVGV19PQlNPTEVURTsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsCi0gICAgICAgICAgICAgICAgIChjaGFyKikgIlVOSVZFUlNBTE5PSVNFTUFSR0lOICUuMTFnICUuMTFnIDtcbiIsIGhpZ2gsIGxvdyk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiVU5JVkVSU0FMTk9JU0VNQVJHSU4gJS4xMWcgJS4xMWcgO1xuIiwgaGlnaCwgbG93KTsKLSAgICBsZWZ3U3luQXJyYXlbTEVGV19OT0lTRU1BUkdJTl0gPSAxOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndFZGdlUmF0ZVRocmVzaG9sZDEoZG91YmxlIG51bSkKLXsKLSAgICBsZWZ3T2Jzb2xldGVOdW0gPSBMRUZXX1RIUkVTSE9MRDE7Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0lOSVQgJiYgbGVmd1N0YXRlIDwgTEVGV19FTkQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsgIC8vIG5vdCBvZiB0aGUgRU5EcwotICAgIGlmIChsZWZ3U3luQXJyYXlbTEVGV19USFJFU0hPTEQxXSkKLSAgICAgICAgcmV0dXJuIExFRldfQUxSRUFEWV9ERUZJTkVEOwotICAgIGlmICh2ZXJzaW9uTnVtID49IDUuNCkKLSAgICAgICAgcmV0dXJuIExFRldfT0JTT0xFVEU7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJFREdFUkFURVRIUkVTSE9MRDEgJS4xMWcgO1xuIiwgbnVtKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJFREdFUkFURVRIUkVTSE9MRDEgJS4xMWcgO1xuIiwgbnVtKTsKLSAgICBsZWZ3U3luQXJyYXlbTEVGV19USFJFU0hPTEQxXSA9IDE7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd0VkZ2VSYXRlVGhyZXNob2xkMihkb3VibGUgbnVtKQotewotICAgIGxlZndPYnNvbGV0ZU51bSA9IExFRldfVEhSRVNIT0xEMjsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfSU5JVCAmJiBsZWZ3U3RhdGUgPCBMRUZXX0VORCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOyAgLy8gbm90IG9mIHRoZSBFTkRzCi0gICAgaWYgKGxlZndTeW5BcnJheVtMRUZXX1RIUkVTSE9MRDJdKQotICAgICAgICByZXR1cm4gTEVGV19BTFJFQURZX0RFRklORUQ7Ci0gICAgaWYgKHZlcnNpb25OdW0gPj0gNS40KQotICAgICAgICByZXR1cm4gTEVGV19PQlNPTEVURTsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIkVER0VSQVRFVEhSRVNIT0xEMiAlLjExZyA7XG4iLCBudW0pOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIkVER0VSQVRFVEhSRVNIT0xEMiAlLjExZyA7XG4iLCBudW0pOwotICAgIGxlZndTeW5BcnJheVtMRUZXX1RIUkVTSE9MRDJdID0gMTsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3RWRnZVJhdGVTY2FsZUZhY3Rvcihkb3VibGUgbnVtKQotewotICAgIGxlZndPYnNvbGV0ZU51bSA9IExFRldfU0NBTEVGQUNUT1I7Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0lOSVQgJiYgbGVmd1N0YXRlIDwgTEVGV19FTkQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsgIC8vIG5vdCBvZiB0aGUgRU5EcwotICAgIGlmIChsZWZ3U3luQXJyYXlbTEVGV19TQ0FMRUZBQ1RPUl0pCi0gICAgICAgIHJldHVybiBMRUZXX0FMUkVBRFlfREVGSU5FRDsKLSAgICBpZiAodmVyc2lvbk51bSA+PSA1LjQpCi0gICAgICAgIHJldHVybiBMRUZXX09CU09MRVRFOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiRURHRVJBVEVTQ0FMRUZBQ1RPUiAlLjExZyA7XG4iLCBudW0pOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIkVER0VSQVRFU0NBTEVGQUNUT1IgJS4xMWcgO1xuIiwgbnVtKTsKLSAgICBsZWZ3U3luQXJyYXlbTEVGV19TQ0FMRUZBQ1RPUl0gPSAxOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi0KLWludAotbGVmd1N0YXJ0Tm9pc2VUYWJsZShpbnQgbnVtKQotewotICAgIGxlZndPYnNvbGV0ZU51bSA9IExFRldfTk9JU0VUQUJMRV9TVEFSVDsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1N0YXRlID09IExFRldfTk9JU0VUQUJMRV9TVEFSVCB8fAotICAgICAgICBsZWZ3U3RhdGUgPT0gTEVGV19OT0lTRVRBQkxFKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0lOSVQgJiYgbGVmd1N0YXRlIDwgTEVGV19FTkQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsgIC8vIG5vdCBvZiB0aGUgRU5EcwotICAgIGlmIChsZWZ3U3luQXJyYXlbTEVGV19OT0lTRVRBQkxFX1NUQVJUXSkKLSAgICAgICAgcmV0dXJuIExFRldfQUxSRUFEWV9ERUZJTkVEOwotICAgIGlmICh2ZXJzaW9uTnVtID49IDUuNCkKLSAgICAgICAgcmV0dXJuIExFRldfT0JTT0xFVEU7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJOT0lTRVRBQkxFICVkIDtcbiIsIG51bSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiTk9JU0VUQUJMRSAlZCA7XG4iLCBudW0pOwotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19OT0lTRVRBQkxFX1NUQVJUOwotICAgIGxlZndJc05vaXNlVGFibGUgPSAxOwotICAgIGxlZndJc0VkZ2VyYXRlID0gMDsKLSAgICBsZWZ3U3luQXJyYXlbTEVGV19OT0lTRVRBQkxFX1NUQVJUXSA9IDE7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLS8vIGZvciBib3RoIG5vaXNldGFibGUgYW5kIGNvcnJlY3Rpb250YWJsZQotLy8gT2Jzb2xldGUgaW4gNS40Ci1pbnQKLWxlZndFZGdlUmF0ZShkb3VibGUgbnVtKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzTm9pc2VUYWJsZSAmJiAhbGVmd0lzQ29ycmVjdFRhYmxlKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBFREdFUkFURSAlLjExZyA7XG4iLCBudW0pOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIEVER0VSQVRFICUuMTFnIDtcbiIsIG51bSk7Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBpZiAobGVmd1N0YXRlID09IExFRldfTk9JU0VUQUJMRV9TVEFSVCkKLSAgICAgICAgbGVmd1N0YXRlID0gTEVGV19OT0lTRVRBQkxFOwotICAgIGVsc2UgaWYgKGxlZndTdGF0ZSA9PSBMRUZXX0NPUlJFQ1RUQUJMRV9TVEFSVCkKLSAgICAgICAgbGVmd1N0YXRlID0gTEVGV19DT1JSRUNUVEFCTEU7Ci0gICAgbGVmd0lzRWRnZXJhdGUgPSAxOwotICAgIGxlZndJc091dFJlc2lzdCA9IDA7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLS8vIE9ic29sZXRlIGluIDUuNAotaW50Ci1sZWZ3T3V0cHV0UmVzaXN0YW5jZShpbnQgICAgbnVtUmVzaXN0cywKLSAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqcmVzaXN0YW5jZSkKLXsKLSAgICBpbnQgaTsKLQotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzRWRnZXJhdGUpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd0lzT3V0UmVzaXN0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0KLSAgICBpZiAobnVtUmVzaXN0cyA8PSAwKQotICAgICAgICByZXR1cm4gTEVGV19PSzsKLQotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KSB7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBPVVRQVVRSRVNJU1RBTkNFICIpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUmVzaXN0czsgaSsrKSB7Ci0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiJS4xMWcgIiwgKnJlc2lzdGFuY2UrKyk7Ci0gICAgICAgIH0KLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIjtcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBPVVRQVVRSRVNJU1RBTkNFICIpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUmVzaXN0czsgaSsrKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiJS4xMWcgIiwgKnJlc2lzdGFuY2UrKyk7Ci0gICAgICAgIH0KLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIjtcbiIpOwotICAgIH0KLQotICAgIGxlZndJc091dFJlc2lzdCA9IDE7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLS8vIE9ic29sZXRlIGluIDUuNAotaW50Ci1sZWZ3VmljdGltcyhpbnQgICAgIGxlbmd0aCwKLSAgICAgICAgICAgIGludCAgICAgbnVtTm9pc2VzLAotICAgICAgICAgICAgZG91YmxlICAqbm9pc2VzKQotewotICAgIGludCBpOwotCi0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNPdXRSZXNpc3QpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLQotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KSB7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICBWSUNUSU1MRU5HVEggJWQgO1xuIiwgbGVuZ3RoKTsKLSAgICAgICAgaWYgKG51bU5vaXNlcyA8PSAwKQotICAgICAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7ICAgLy8gbm9pc2VzIGFyZSByZXF1aXJlZAotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTm9pc2VzOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChsZWZ3SXNOb2lzZVRhYmxlKQotICAgICAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICBWSUNUSU1OT0lTRSAiKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgQ09SUkVDVElPTkZBQ1RPUiAiKTsKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIlLjExZyAiLCAqbm9pc2VzKyspOwotICAgICAgICB9Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICI7XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgVklDVElNTEVOR1RIICVkIDtcbiIsIGxlbmd0aCk7Ci0gICAgICAgIGlmIChudW1Ob2lzZXMgPD0gMCkKLSAgICAgICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOyAgIC8vIG5vaXNlcyBhcmUgcmVxdWlyZWQKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bU5vaXNlczsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobGVmd0lzTm9pc2VUYWJsZSkKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgVklDVElNTk9JU0UgIik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgIENPUlJFQ1RJT05GQUNUT1IgIik7Ci0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiJS4xMWcgIiwgKm5vaXNlcysrKTsKLSAgICAgICAgfQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiO1xuIik7Ci0gICAgfQotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLS8vIE9ic29sZXRlIGluIDUuNAotaW50Ci1sZWZ3RW5kTm9pc2VUYWJsZSgpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTk9JU0VUQUJMRV9TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19OT0lTRVRBQkxFKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJFTkQgTk9JU0VUQUJMRVxuXG4iKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJFTkQgTk9JU0VUQUJMRVxuXG4iKTsKLSAgICBsZWZ3TGluZXMrKzsKLQotICAgIGxlZndTdGF0ZSA9IExFRldfTk9JU0VUQUJMRV9FTkQ7Ci0gICAgbGVmd0lzTm9pc2VUYWJsZSA9IDA7Ci0gICAgbGVmd0lzT3V0UmVzaXN0ID0gMDsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3U3RhcnRDb3JyZWN0VGFibGUoaW50IG51bSkKLXsKLSAgICBsZWZ3T2Jzb2xldGVOdW0gPSBMRUZXX0NPUlJFQ1RUQUJMRV9TVEFSVDsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1N0YXRlID09IExFRldfQ09SUkVDVFRBQkxFX1NUQVJUIHx8Ci0gICAgICAgIGxlZndTdGF0ZSA9PSBMRUZXX0NPUlJFQ1RUQUJMRSkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19JTklUICYmIGxlZndTdGF0ZSA8IExFRldfRU5EKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7ICAvLyBub3Qgb2YgdGhlIEVORHMKLSAgICBpZiAodmVyc2lvbk51bSA+PSA1LjQpCi0gICAgICAgIHJldHVybiBMRUZXX09CU09MRVRFOwotICAgIGlmIChsZWZ3U3luQXJyYXlbTEVGV19DT1JSRUNUVEFCTEVfU1RBUlRdKQotICAgICAgICByZXR1cm4gTEVGV19BTFJFQURZX0RFRklORUQ7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJDT1JSRUNUSU9OVEFCTEUgJWQgO1xuIiwgbnVtKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJDT1JSRUNUSU9OVEFCTEUgJWQgO1xuIiwgbnVtKTsKLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTdGF0ZSA9IExFRldfQ09SUkVDVFRBQkxFX1NUQVJUOwotICAgIGxlZndJc0NvcnJlY3RUYWJsZSA9IDE7Ci0gICAgbGVmd0lzRWRnZXJhdGUgPSAwOwotICAgIGxlZndTeW5BcnJheVtMRUZXX0NPUlJFQ1RUQUJMRV9TVEFSVF0gPSAxOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi0vLyBPYnNvbGV0ZSBpbiA1LjQKLWludAotbGVmd0VuZENvcnJlY3RUYWJsZSgpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfQ09SUkVDVFRBQkxFX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX0NPUlJFQ1RUQUJMRSkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiRU5EIENPUlJFQ1RJT05UQUJMRVxuXG4iKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJFTkQgQ09SUkVDVElPTlRBQkxFXG5cbiIpOwotICAgIGxlZndMaW5lcysrOwotCi0gICAgbGVmd1N0YXRlID0gTEVGV19DT1JSRUNUVEFCTEVfRU5EOwotICAgIGxlZndJc05vaXNlVGFibGUgPSAwOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndNaW5GZWF0dXJlKGRvdWJsZSAgIHgsCi0gICAgICAgICAgICAgICBkb3VibGUgICB5KQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19JTklUICYmIGxlZndTdGF0ZSA8IExFRldfRU5EKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7ICAvLyBub3Qgb2YgdGhlIEVORHMKLSAgICBpZiAobGVmd1N5bkFycmF5W0xFRldfTUlORkVBVFVSRV0pCi0gICAgICAgIHJldHVybiBMRUZXX0FMUkVBRFlfREVGSU5FRDsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIk1JTkZFQVRVUkUgJS4xMWcgJS4xMWcgO1xuIiwgeCwgeSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiTUlORkVBVFVSRSAlLjExZyAlLjExZyA7XG4iLCB4LCB5KTsKLSAgICBsZWZ3U3luQXJyYXlbTEVGV19NSU5GRUFUVVJFXSA9IDE7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLS8vICoqKioqKioqKioqKioqKioqKioqKgotLy8gIGludCBsZWZ3RGllbGVjdHJpYyAoZmxvYXQgZGllbGVjdHJpYykgewotLy8gICAgaWYgKCEgbGVmd0ZpbGUpIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0vLyAgICBpZiAoISBsZWZ3RGlkSW5pdCkgcmV0dXJuIExFRldfQkFEX09SREVSOwotLy8gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0lOSVQgJiYgbGVmd1N0YXRlIDwgTEVGV19FTkQpCi0vLyAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0vLyAgICBpZiAobGVmd1N5bkFycmF5W0xFRldfRElFTEVDVFJJQ10pIHJldHVybiBMRUZXX0FMUkVBRFlfREVGSU5FRDsKLS8vICAgIGZwcmludGYobGVmd0ZpbGUsICJESUVMRUNUUklDICUuMTFnIDtcbiIsIGRpZWxlY3RyaWMpOwotLy8gICAgbGVmd1N5bkFycmF5W0xFRldfRElFTEVDVFJJQ10gPSAxOwotLy8gICAgcmV0dXJuIExFRldfT0s7IAotLy8gIH0KLS8vICoqKioqKioqKioqKioqKioqKioqCi0KLWludAotbGVmd1N0YXJ0SXJkcm9wKCkKLXsKLSAgICBsZWZ3T2Jzb2xldGVOdW0gPSBMRUZXX0lSRFJPUF9TVEFSVDsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1N0YXRlID09IExFRldfSVJEUk9QX1NUQVJUIHx8Ci0gICAgICAgIGxlZndTdGF0ZSA9PSBMRUZXX0lSRFJPUCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICh2ZXJzaW9uTnVtID49IDUuNCkKLSAgICAgICAgcmV0dXJuIExFRldfT0JTT0xFVEU7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0lOSVQgJiYgbGVmd1N0YXRlIDwgTEVGV19FTkQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsgIC8vIG5vdCBvZiB0aGUgRU5EcwotICAgIGlmIChsZWZ3U3luQXJyYXlbTEVGV19JUkRST1BfU1RBUlRdKQotICAgICAgICByZXR1cm4gTEVGV19BTFJFQURZX0RFRklORUQ7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJJUkRST1BcbiIpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIklSRFJPUFxuIik7Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3U3RhdGUgPSBMRUZXX0lSRFJPUF9TVEFSVDsKLSAgICBsZWZ3U3luQXJyYXlbTEVGV19JUkRST1BfU1RBUlRdID0gMTsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotLy8gT2Jzb2xldGUgaW4gNS40Ci1pbnQKLWxlZndJcmRyb3BUYWJsZShjb25zdCBjaGFyICAqdGFibGVOYW1lLAotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpjdXJyZW50c052b2x0cykKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19JUkRST1BfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfSVJEUk9QKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCF0YWJsZU5hbWUgfHwgdGFibGVOYW1lID09IDAgfHwgKnRhYmxlTmFtZSA9PSAwKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAoIWN1cnJlbnRzTnZvbHRzIHx8IGN1cnJlbnRzTnZvbHRzID09IDAgfHwgKmN1cnJlbnRzTnZvbHRzID09IDApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgVEFCTEUgJXMgJXMgO1xuIiwgdGFibGVOYW1lLCBjdXJyZW50c052b2x0cyk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgVEFCTEUgJXMgJXMgO1xuIiwgdGFibGVOYW1lLCBjdXJyZW50c052b2x0cyk7Ci0gICAgbGVmd0xpbmVzKys7Ci0KLSAgICBsZWZ3U3RhdGUgPSBMRUZXX0lSRFJPUDsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotLy8gT2Jzb2xldGUgaW4gNS40Ci1pbnQKLWxlZndFbmRJcmRyb3AoKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0lSRFJPUF9TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19JUkRST1ApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIkVORCBJUkRST1BcblxuIik7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiRU5EIElSRFJPUFxuXG4iKTsKLSAgICBsZWZ3TGluZXMrKzsKLQotICAgIGxlZndTdGF0ZSA9IExFRldfSVJEUk9QX0VORDsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3U2l0ZShjb25zdCBjaGFyICpzaXRlTmFtZSwKLSAgICAgICAgIGNvbnN0IGNoYXIgKmNsYXNzVHlwZSwKLSAgICAgICAgIGNvbnN0IGNoYXIgKnN5bW1ldHJ5LAotICAgICAgICAgZG91YmxlICAgICB3aWR0aCwKLSAgICAgICAgIGRvdWJsZSAgICAgaGVpZ2h0KQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3U3RhdGUgPT0gTEVGV19TSVRFKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0lOSVQgJiYgbGVmd1N0YXRlIDwgTEVGV19FTkQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsgIC8vIG5vdCBvZiB0aGUgRU5EcwotICAgIGlmICghc2l0ZU5hbWUgfHwgc2l0ZU5hbWUgPT0gMCB8fCAqc2l0ZU5hbWUgPT0gMCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpIHsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIlNJVEUgJXNcbiIsIHNpdGVOYW1lKTsKLSAgICAgICAgaWYgKGNsYXNzVHlwZSAmJiBzdHJjbXAoY2xhc3NUeXBlLCAiUEFEIikgJiYgc3RyY21wKGNsYXNzVHlwZSwgIkNPUkUiKSkKLSAgICAgICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgQ0xBU1MgJXMgO1xuIiwgY2xhc3NUeXBlKTsKLSAgICAgICAgaWYgKHN5bW1ldHJ5KQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIFNZTU1FVFJZICVzIDtcbiIsIHN5bW1ldHJ5KTsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIFNJWkUgJS4xMWcgQlkgJS4xMWcgO1xuIiwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIC8vIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopIkVORCAlc1xuXG4iLCBzaXRlTmFtZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIlNJVEUgJXNcbiIsIHNpdGVOYW1lKTsKLSAgICAgICAgaWYgKGNsYXNzVHlwZSAmJiBzdHJjbXAoY2xhc3NUeXBlLCAiUEFEIikgJiYgc3RyY21wKGNsYXNzVHlwZSwgIkNPUkUiKSkKLSAgICAgICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgQ0xBU1MgJXMgO1xuIiwgY2xhc3NUeXBlKTsKLSAgICAgICAgaWYgKHN5bW1ldHJ5KQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIFNZTU1FVFJZICVzIDtcbiIsIHN5bW1ldHJ5KTsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIFNJWkUgJS4xMWcgQlkgJS4xMWcgO1xuIiwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIC8vIGEgc2VwYXJhdGUgZnVuY3Rpb24gY2FsbCwgbGVmd0VuZFNpdGUKLSAgICAgICAgLy8gZnByaW50ZihsZWZ3RmlsZSwgIkVORCAlc1xuXG4iLCBzaXRlTmFtZSk7Ci0gICAgfQotCi0gICAgbGVmd0xpbmVzID0gbGVmd0xpbmVzICsgNDsKLSAgICBsZWZ3U3luQXJyYXlbTEVGV19TSVRFXSA9IDE7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19TSVRFOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndTaXRlUm93UGF0dGVybihjb25zdCBjaGFyICAgKnNpdGVOYW1lLAotICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICBvcmllbnQpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfU0lURSkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghc2l0ZU5hbWUgfHwgc2l0ZU5hbWUgPT0gMCB8fCAqc2l0ZU5hbWUgPT0gMCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBST1dQQVRURVJOICVzICVzIDtcbiIsIHNpdGVOYW1lLAotICAgICAgICAgICAgICAgICBsZWZ3T3JpZW50KG9yaWVudCkpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIFJPV1BBVFRFUk4gJXMgJXMgO1xuIiwgc2l0ZU5hbWUsIGxlZndPcmllbnQob3JpZW50KSk7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19TSVRFOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndTaXRlUm93UGF0dGVyblN0cihjb25zdCBjaGFyICAgICpzaXRlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpvcmllbnQpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfU0lURSkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghc2l0ZU5hbWUgfHwgc2l0ZU5hbWUgPT0gMCB8fCAqc2l0ZU5hbWUgPT0gMCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgaWYgKCFvcmllbnQgfHwgb3JpZW50ID09IDAgfHwgKm9yaWVudCA9PSAwKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIFJPV1BBVFRFUk4gJXMgJXMgO1xuIiwgc2l0ZU5hbWUsIG9yaWVudCk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgUk9XUEFUVEVSTiAlcyAlcyA7XG4iLCBzaXRlTmFtZSwgb3JpZW50KTsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3U3RhdGUgPSBMRUZXX1NJVEU7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd0VuZFNpdGUoY29uc3QgY2hhciAqc2l0ZU5hbWUpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfU0lURSkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiRU5EICVzXG5cbiIsIHNpdGVOYW1lKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJFTkQgJXNcblxuIiwgc2l0ZU5hbWUpOwotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19TSVRFX0VORDsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3U3RhcnRBcnJheShjb25zdCBjaGFyICphcnJheU5hbWUpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndTdGF0ZSA9PSBMRUZXX0FSUkFZX1NUQVJUIHx8Ci0gICAgICAgIGxlZndTdGF0ZSA9PSBMRUZXX0FSUkFZKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0lOSVQgJiYgbGVmd1N0YXRlIDwgTEVGV19FTkQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsgIC8vIG5vdCBvZiB0aGUgRU5EcwotICAgIGlmICghYXJyYXlOYW1lIHx8IGFycmF5TmFtZSA9PSAwIHx8ICphcnJheU5hbWUgPT0gMCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJBUlJBWSAlc1xuIiwgYXJyYXlOYW1lKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJBUlJBWSAlc1xuIiwgYXJyYXlOYW1lKTsKLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTdGF0ZSA9IExFRldfQVJSQVlfU1RBUlQ7Ci0gICAgbGVmd1N5bkFycmF5W0xFRldfQVJSQVlfU1RBUlRdID0gMTsKLSAgICBsZWZ3SGFzQXJyYXlSZXEgPSAwOwotICAgIGxlZndJc0FycmF5Rmxvb3JwID0gMDsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3QXJyYXlTaXRlKGNvbnN0IGNoYXIgICAgKm5hbWUsCi0gICAgICAgICAgICAgIGRvdWJsZSAgICAgICAgb3JpZ1gsCi0gICAgICAgICAgICAgIGRvdWJsZSAgICAgICAgb3JpZ1ksCi0gICAgICAgICAgICAgIGludCAgICAgICAgICAgb3JpZW50LAotICAgICAgICAgICAgICBkb3VibGUgICAgICAgIG51bVgsCi0gICAgICAgICAgICAgIGRvdWJsZSAgICAgICAgbnVtWSwKLSAgICAgICAgICAgICAgZG91YmxlICAgICAgICBzcGFjZVgsCi0gICAgICAgICAgICAgIGRvdWJsZSAgICAgICAgc3BhY2VZKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0FSUkFZX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX0FSUkFZKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFuYW1lIHx8IG5hbWUgPT0gMCB8fCAqbmFtZSA9PSAwKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikKLSAgICAgICAgICAgICAgICAgIiAgIFNJVEUgJXMgJS4xMWcgJS4xMWcgJXMgRE8gJS4xMWcgQlkgJS4xMWcgU1RFUCAlLjExZyAlLjExZyA7XG4iLAotICAgICAgICAgICAgICAgICBuYW1lLCBvcmlnWCwgb3JpZ1ksIGxlZndPcmllbnQob3JpZW50KSwgbnVtWCwgbnVtWSwgc3BhY2VYLCBzcGFjZVkpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwKLSAgICAgICAgICAgICAgICAiICAgU0lURSAlcyAlLjExZyAlLjExZyAlcyBETyAlLjExZyBCWSAlLjExZyBTVEVQICUuMTFnICUuMTFnIDtcbiIsCi0gICAgICAgICAgICAgICAgbmFtZSwgb3JpZ1gsIG9yaWdZLCBsZWZ3T3JpZW50KG9yaWVudCksIG51bVgsIG51bVksIHNwYWNlWCwgc3BhY2VZKTsKLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndIYXNBcnJheVJlcSA9IDE7Ci0KLSAgICBsZWZ3U3RhdGUgPSBMRUZXX0FSUkFZOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndBcnJheVNpdGVTdHIoY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgZG91YmxlICAgICBvcmlnWCwKLSAgICAgICAgICAgICAgICAgZG91YmxlICAgICBvcmlnWSwKLSAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqb3JpZW50LAotICAgICAgICAgICAgICAgICBkb3VibGUgICAgIG51bVgsCi0gICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgbnVtWSwKLSAgICAgICAgICAgICAgICAgZG91YmxlICAgICBzcGFjZVgsCi0gICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgc3BhY2VZKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0FSUkFZX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX0FSUkFZKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFuYW1lIHx8IG5hbWUgPT0gMCB8fCAqbmFtZSA9PSAwKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikKLSAgICAgICAgICAgICAgICAgIiAgIFNJVEUgJXMgJS4xMWcgJS4xMWcgJXMgRE8gJS4xMWcgQlkgJS4xMWcgU1RFUCAlLjExZyAlLjExZyA7XG4iLAotICAgICAgICAgICAgICAgICBuYW1lLCBvcmlnWCwgb3JpZ1ksIG9yaWVudCwgbnVtWCwgbnVtWSwgc3BhY2VYLCBzcGFjZVkpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwKLSAgICAgICAgICAgICAgICAiICAgU0lURSAlcyAlLjExZyAlLjExZyAlcyBETyAlLjExZyBCWSAlLjExZyBTVEVQICUuMTFnICUuMTFnIDtcbiIsCi0gICAgICAgICAgICAgICAgbmFtZSwgb3JpZ1gsIG9yaWdZLCBvcmllbnQsIG51bVgsIG51bVksIHNwYWNlWCwgc3BhY2VZKTsKLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndIYXNBcnJheVJlcSA9IDE7Ci0KLSAgICBsZWZ3U3RhdGUgPSBMRUZXX0FSUkFZOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndBcnJheUNhbnBsYWNlKGNvbnN0IGNoYXIgICAgKm5hbWUsCi0gICAgICAgICAgICAgICAgICBkb3VibGUgICAgICAgIG9yaWdYLAotICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgICBvcmlnWSwKLSAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgb3JpZW50LAotICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgICBudW1YLAotICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgICBudW1ZLAotICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgICBzcGFjZVgsCi0gICAgICAgICAgICAgICAgICBkb3VibGUgICAgICAgIHNwYWNlWSkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19BUlJBWV9TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19BUlJBWSkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbmFtZSB8fCBuYW1lID09IDAgfHwgKm5hbWUgPT0gMCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopCi0gICAgICAgICAgICAgICAgICIgICBDQU5QTEFDRSAlcyAlLjExZyAlLjExZyAlcyBETyAlLjExZyBCWSAlLjExZyBTVEVQICUuMTFnICUuMTFnIDtcbiIsCi0gICAgICAgICAgICAgICAgIG5hbWUsIG9yaWdYLCBvcmlnWSwgbGVmd09yaWVudChvcmllbnQpLCBudW1YLCBudW1ZLCBzcGFjZVgsIHNwYWNlWSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLAotICAgICAgICAgICAgICAgICIgICBDQU5QTEFDRSAlcyAlLjExZyAlLjExZyAlcyBETyAlLjExZyBCWSAlLjExZyBTVEVQICUuMTFnICUuMTFnIDtcbiIsCi0gICAgICAgICAgICAgICAgbmFtZSwgb3JpZ1gsIG9yaWdZLCBsZWZ3T3JpZW50KG9yaWVudCksIG51bVgsIG51bVksIHNwYWNlWCwgc3BhY2VZKTsKLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndIYXNBcnJheVJlcSA9IDE7Ci0KLSAgICBsZWZ3U3RhdGUgPSBMRUZXX0FSUkFZOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndBcnJheUNhbnBsYWNlU3RyKGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgIG9yaWdYLAotICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICBvcmlnWSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm9yaWVudCwKLSAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgbnVtWCwKLSAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgbnVtWSwKLSAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgc3BhY2VYLAotICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICBzcGFjZVkpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfQVJSQVlfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfQVJSQVkpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIW5hbWUgfHwgbmFtZSA9PSAwIHx8ICpuYW1lID09IDApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKQotICAgICAgICAgICAgICAgICAiICAgQ0FOUExBQ0UgJXMgJS4xMWcgJS4xMWcgJXMgRE8gJS4xMWcgQlkgJS4xMWcgU1RFUCAlLjExZyAlLjExZyA7XG4iLAotICAgICAgICAgICAgICAgICBuYW1lLCBvcmlnWCwgb3JpZ1ksIG9yaWVudCwgbnVtWCwgbnVtWSwgc3BhY2VYLCBzcGFjZVkpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIENBTlBMQUNFICVzICUuMTFnICUuMTFnICVzIERPICUuMTFnIEJZICUuMTFnIFNURVAgJS4xMWcgJS4xMWcgO1xuIiwKLSAgICAgICAgICAgICAgICBuYW1lLCBvcmlnWCwgb3JpZ1ksIG9yaWVudCwgbnVtWCwgbnVtWSwgc3BhY2VYLCBzcGFjZVkpOwotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd0hhc0FycmF5UmVxID0gMTsKLQotICAgIGxlZndTdGF0ZSA9IExFRldfQVJSQVk7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd0FycmF5Q2Fubm90b2NjdXB5KGNvbnN0IGNoYXIgICAgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgICBvcmlnWCwKLSAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICAgIG9yaWdZLAotICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgb3JpZW50LAotICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICAgbnVtWCwKLSAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICAgIG51bVksCi0gICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgICBzcGFjZVgsCi0gICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgICBzcGFjZVkpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfQVJSQVlfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfQVJSQVkpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIW5hbWUgfHwgbmFtZSA9PSAwIHx8ICpuYW1lID09IDApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKQotICAgICAgICAgICAgICAgICAiICAgQ0FOTk9UT0NDVVBZICVzICUuMTFnICUuMTFnICVzIERPICUuMTFnIEJZICUuMTFnIFNURVAgJS4xMWcgJS4xMWcgO1xuIiwKLSAgICAgICAgICAgICAgICAgbmFtZSwgb3JpZ1gsIG9yaWdZLCBsZWZ3T3JpZW50KG9yaWVudCksIG51bVgsIG51bVksIHNwYWNlWCwgc3BhY2VZKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsCi0gICAgICAgICAgICAgICAgIiAgIENBTk5PVE9DQ1VQWSAlcyAlLjExZyAlLjExZyAlcyBETyAlLjExZyBCWSAlLjExZyBTVEVQICUuMTFnICUuMTFnIDtcbiIsCi0gICAgICAgICAgICAgICAgbmFtZSwgb3JpZ1gsIG9yaWdZLCBsZWZ3T3JpZW50KG9yaWVudCksIG51bVgsIG51bVksIHNwYWNlWCwgc3BhY2VZKTsKLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndIYXNBcnJheVJlcSA9IDE7Ci0KLSAgICBsZWZ3U3RhdGUgPSBMRUZXX0FSUkFZOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndBcnJheUNhbm5vdG9jY3VweVN0cihjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgb3JpZ1gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICBvcmlnWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpvcmllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICBudW1YLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgbnVtWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgIHNwYWNlWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgIHNwYWNlWSkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19BUlJBWV9TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19BUlJBWSkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbmFtZSB8fCBuYW1lID09IDAgfHwgKm5hbWUgPT0gMCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopCi0gICAgICAgICAgICAgICAgICIgICBDQU5OT1RPQ0NVUFkgJXMgJS4xMWcgJS4xMWcgJXMgRE8gJS4xMWcgQlkgJS4xMWcgU1RFUCAlLjExZyAlLjExZyA7XG4iLAotICAgICAgICAgICAgICAgICBuYW1lLCBvcmlnWCwgb3JpZ1ksIG9yaWVudCwgbnVtWCwgbnVtWSwgc3BhY2VYLCBzcGFjZVkpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwKLSAgICAgICAgICAgICAgICAiICAgQ0FOTk9UT0NDVVBZICVzICUuMTFnICUuMTFnICVzIERPICUuMTFnIEJZICUuMTFnIFNURVAgJS4xMWcgJS4xMWcgO1xuIiwKLSAgICAgICAgICAgICAgICBuYW1lLCBvcmlnWCwgb3JpZ1ksIG9yaWVudCwgbnVtWCwgbnVtWSwgc3BhY2VYLCBzcGFjZVkpOwotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd0hhc0FycmF5UmVxID0gMTsKLQotICAgIGxlZndTdGF0ZSA9IExFRldfQVJSQVk7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd0FycmF5VHJhY2tzKGNvbnN0IGNoYXIgICp4eSwKLSAgICAgICAgICAgICAgICBkb3VibGUgICAgICBzdGFydCwKLSAgICAgICAgICAgICAgICBpbnQgICAgICAgICBudW1UcmFja3MsCi0gICAgICAgICAgICAgICAgZG91YmxlICAgICAgc3BhY2UsCi0gICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmxheWVycykKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19BUlJBWV9TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19BUlJBWSkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICgheHkgfHwgeHkgPT0gMCB8fCAqeHkgPT0gMCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgaWYgKHN0cmNtcCh4eSwgIlgiKSAmJiBzdHJjbXAoeHksICJZIikpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmICghbGF5ZXJzIHx8IGxheWVycyA9PSAwIHx8ICpsYXllcnMgPT0gMCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLAotICAgICAgICAgICAgICAgICAoY2hhciopICIgICBUUkFDS1MgJXMgJS4xMWcgRE8gJWQgU1RFUCAlLjExZyBMQVlFUiAlcyA7XG4iLAotICAgICAgICAgICAgICAgICB4eSwgc3RhcnQsIG51bVRyYWNrcywgc3BhY2UsIGxheWVycyk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgVFJBQ0tTICVzICUuMTFnIERPICVkIFNURVAgJS4xMWcgTEFZRVIgJXMgO1xuIiwKLSAgICAgICAgICAgICAgICB4eSwgc3RhcnQsIG51bVRyYWNrcywgc3BhY2UsIGxheWVycyk7Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3SGFzQXJyYXlSZXEgPSAxOwotCi0gICAgbGVmd1N0YXRlID0gTEVGV19BUlJBWTsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3U3RhcnRBcnJheUZsb29ycGxhbihjb25zdCBjaGFyICpuYW1lKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0FSUkFZX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX0FSUkFZKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndJc0FycmF5Rmxvb3JwKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFuYW1lIHx8IG5hbWUgPT0gMCB8fCAqbmFtZSA9PSAwKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIEZMT09SUExBTiAlc1xuIiwgbmFtZSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgRkxPT1JQTEFOICVzXG4iLCBuYW1lKTsKLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndIYXNBcnJheVJlcSA9IDE7Ci0gICAgbGVmd0lzQXJyYXlGbG9vcnAgPSAxOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndBcnJheUZsb29ycGxhbihjb25zdCBjaGFyICAgKnNpdGUsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICpuYW1lLAotICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICBvcmlnWCwKLSAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICAgb3JpZ1ksCi0gICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIG9yaWVudCwKLSAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgbnVtWCwKLSAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgbnVtWSwKLSAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICAgc3BhY2VYLAotICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICBzcGFjZVkpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndJc0FycmF5Rmxvb3JwKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKHNpdGUgJiYgc3RyY21wKHNpdGUsICJDQU5QTEFDRSIpICYmIHN0cmNtcChzaXRlLCAiQ0FOTk9UT0NDVVBZIikpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKQotICAgICAgICAgICAgICAgICAiICAgICAgJXMgJXMgJS4xMWcgJS4xMWcgJXMgRE8gJWQgQlkgJWQgU1RFUCAlLjExZyAlLjExZyA7XG4iLAotICAgICAgICAgICAgICAgICBzaXRlLCBuYW1lLCBvcmlnWCwgb3JpZ1ksIGxlZndPcmllbnQob3JpZW50KSwgbnVtWCwgbnVtWSwKLSAgICAgICAgICAgICAgICAgc3BhY2VYLCBzcGFjZVkpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwKLSAgICAgICAgICAgICAgICAiICAgICAgJXMgJXMgJS4xMWcgJS4xMWcgJXMgRE8gJWQgQlkgJWQgU1RFUCAlLjExZyAlLjExZyA7XG4iLAotICAgICAgICAgICAgICAgIHNpdGUsIG5hbWUsIG9yaWdYLCBvcmlnWSwgbGVmd09yaWVudChvcmllbnQpLCBudW1YLCBudW1ZLAotICAgICAgICAgICAgICAgIHNwYWNlWCwgc3BhY2VZKTsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3QXJyYXlGbG9vcnBsYW5TdHIoY29uc3QgY2hhciAgICAqc2l0ZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICAgb3JpZ1gsCi0gICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgICBvcmlnWSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpvcmllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICBudW1YLAotICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgbnVtWSwKLSAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICAgIHNwYWNlWCwKLSAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICAgIHNwYWNlWSkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0lzQXJyYXlGbG9vcnApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoc2l0ZSAmJiBzdHJjbXAoc2l0ZSwgIkNBTlBMQUNFIikgJiYgc3RyY21wKHNpdGUsICJDQU5OT1RPQ0NVUFkiKSkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopCi0gICAgICAgICAgICAgICAgICIgICAgICAlcyAlcyAlLjExZyAlLjExZyAlcyBETyAlZCBCWSAlZCBTVEVQICUuMTFnICUuMTFnIDtcbiIsCi0gICAgICAgICAgICAgICAgIHNpdGUsIG5hbWUsIG9yaWdYLCBvcmlnWSwgb3JpZW50LCBudW1YLCBudW1ZLCBzcGFjZVgsIHNwYWNlWSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLAotICAgICAgICAgICAgICAgICIgICAgICAlcyAlcyAlLjExZyAlLjExZyAlcyBETyAlZCBCWSAlZCBTVEVQICUuMTFnICUuMTFnIDtcbiIsCi0gICAgICAgICAgICAgICAgc2l0ZSwgbmFtZSwgb3JpZ1gsIG9yaWdZLCBvcmllbnQsIG51bVgsIG51bVksIHNwYWNlWCwgc3BhY2VZKTsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3RW5kQXJyYXlGbG9vcnBsYW4oY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0lzQXJyYXlGbG9vcnApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIW5hbWUgfHwgbmFtZSA9PSAwIHx8ICpuYW1lID09IDApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgRU5EICVzXG5cbiIsIG5hbWUpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIEVORCAlc1xuXG4iLCBuYW1lKTsKLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndJc0FycmF5Rmxvb3JwID0gMDsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3QXJyYXlHY2VsbGdyaWQoY29uc3QgY2hhciAgICp4eSwKLSAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICAgc3RhcnRYWSwKLSAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgY29sUm93cywKLSAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICAgc3BhY2VYWSkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19BUlJBWV9TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19BUlJBWSkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICgheHkgfHwgeHkgPT0gMCB8fCAqeHkgPT0gMCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgaWYgKHN0cmNtcCh4eSwgIlgiKSAmJiBzdHJjbXAoeHksICJZIikpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgR0NFTExHUklEICVzICUuMTFnIERPICVkIFNURVAgJS4xMWcgO1xuIiwKLSAgICAgICAgICAgICAgICAgeHksIHN0YXJ0WFksIGNvbFJvd3MsIHNwYWNlWFkpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIEdDRUxMR1JJRCAlcyAlLjExZyBETyAlZCBTVEVQICUuMTFnIDtcbiIsCi0gICAgICAgICAgICAgICAgeHksIHN0YXJ0WFksIGNvbFJvd3MsIHNwYWNlWFkpOwotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd0hhc0FycmF5UmVxID0gMTsKLQotICAgIGxlZndTdGF0ZSA9IExFRldfQVJSQVk7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd1N0YXJ0QXJyYXlEZWZhdWx0Q2FwKGludCBzaXplKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0FSUkFZX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX0FSUkFZKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndJc0FycmF5RGVmKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBERUZBVUxUQ0FQICVkXG4iLCBzaXplKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBERUZBVUxUQ0FQICVkXG4iLCBzaXplKTsKLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndJc0FycmF5RGVmID0gMTsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3QXJyYXlEZWZhdWx0Q2FwKGRvdWJsZSAgbnVtUGlucywKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlICBjYXApCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndJc0FycmF5RGVmKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICBNSU5QSU5TICUuMTFnIFdJUkVDQVAgJS4xMWcgO1xuIiwKLSAgICAgICAgICAgICAgICAgbnVtUGlucywgY2FwKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBNSU5QSU5TICUuMTFnIFdJUkVDQVAgJS4xMWcgO1xuIiwgbnVtUGlucywgY2FwKTsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3RW5kQXJyYXlEZWZhdWx0Q2FwKCkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0lzQXJyYXlEZWYpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIEVORCBERUZBVUxUQ0FQXG5cbiIpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIEVORCBERUZBVUxUQ0FQXG5cbiIpOwotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd0lzQXJyYXlEZWYgPSAwOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndFbmRBcnJheShjb25zdCBjaGFyICphcnJheU5hbWUpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfQVJSQVlfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfQVJSQVkpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWFycmF5TmFtZSB8fCBhcnJheU5hbWUgPT0gMCB8fCAqYXJyYXlOYW1lID09IDApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChsZWZ3SXNGbG9vcnAgfHwgbGVmd0lzQXJyYXlEZWYpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIkVORCAlc1xuXG4iLCBhcnJheU5hbWUpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIkVORCAlc1xuXG4iLCBhcnJheU5hbWUpOwotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19BUlJBWV9FTkQ7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd1N0YXJ0TWFjcm8oY29uc3QgY2hhciAqbWFjcm9OYW1lKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSA9PSBMRUZXX01BQ1JPX1NUQVJUIHx8Ci0gICAgICAgIGxlZndTdGF0ZSA9PSBMRUZXX01BQ1JPKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFtYWNyb05hbWUgfHwgbWFjcm9OYW1lID09IDAgfHwgKm1hY3JvTmFtZSA9PSAwKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIk1BQ1JPICVzXG4iLCBtYWNyb05hbWUpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIk1BQ1JPICVzXG4iLCBtYWNyb05hbWUpOwotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19NQUNST19TVEFSVDsKLSAgICBsZWZ3SXNNYWNyb0RlbnNpdHkgPSAwOwotICAgIGxlZndJc01hY3JvUGluID0gMDsKLSAgICBsZWZ3SXNNYWNyb09icyA9IDA7Ci0gICAgbGVmd0lzTWFjcm9UaW1pbmcgPSAwOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndNYWNyb0NsYXNzKGNvbnN0IGNoYXIgICAqdmFsdWUxLAotICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICp2YWx1ZTIpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX01BQ1JPX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX01BQ1JPKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCF2YWx1ZTEgfHwgdmFsdWUxID09IDAgfHwgKnZhbHVlMSA9PSAwKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBpZiAoc3RyY21wKHZhbHVlMSwgIlJJTkciKSA9PSAwKQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIENMQVNTICVzIDtcbiIsIHZhbHVlMSk7Ci0gICAgICAgIGVsc2UgaWYgKHN0cmNtcCh2YWx1ZTEsICJCTE9DSyIpID09IDApIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZTIpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHZhbHVlMiwgIkJMQUNLQk9YIikgJiYgc3RyY21wKHZhbHVlMiwgIlNPRlQiKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIENMQVNTICVzICVzIDtcbiIsIHZhbHVlMSwgdmFsdWUyKTsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBDTEFTUyAlcyA7XG4iLCB2YWx1ZTEpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCh2YWx1ZTEsICJDT1ZFUiIpID09IDApIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZTIpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHZhbHVlMiwgIkJVTVAiKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIENMQVNTICVzICVzIDtcbiIsIHZhbHVlMSwgdmFsdWUyKTsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBDTEFTUyAlcyA7XG4iLCB2YWx1ZTEpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCh2YWx1ZTEsICJQQUQiKSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAodmFsdWUyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmNtcCh2YWx1ZTIsICJJTlBVVCIpICYmIHN0cmNtcCh2YWx1ZTIsICJPVVRQVVQiKSAmJgotICAgICAgICAgICAgICAgICAgICBzdHJjbXAodmFsdWUyLCAiSU5PVVQiKSAmJiBzdHJjbXAodmFsdWUyLCAiUE9XRVIiKSAmJgotICAgICAgICAgICAgICAgICAgICBzdHJjbXAodmFsdWUyLCAiU1BBQ0VSIikgJiYgc3RyY21wKHZhbHVlMiwgIkFSRUFJTyIpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICAgICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgQ0xBU1MgJXMgJXMgO1xuIiwgdmFsdWUxLCB2YWx1ZTIpOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIENMQVNTICVzIDtcbiIsIHZhbHVlMSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHZhbHVlMSwgIkNPUkUiKSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAodmFsdWUyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmNtcCh2YWx1ZTIsICJGRUVEVEhSVSIpICYmIHN0cmNtcCh2YWx1ZTIsICJUSUVISUdIIikgJiYKLSAgICAgICAgICAgICAgICAgICAgc3RyY21wKHZhbHVlMiwgIlRJRUxPVyIpICYmIHN0cmNtcCh2YWx1ZTIsICJTUEFDRVIiKSAmJgotICAgICAgICAgICAgICAgICAgICBzdHJjbXAodmFsdWUyLCAiQU5URU5OQUNFTEwiKSAmJiBzdHJjbXAodmFsdWUyLCAiV0VMTFRBUCIpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICAgICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgQ0xBU1MgJXMgJXMgO1xuIiwgdmFsdWUxLCB2YWx1ZTIpOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIENMQVNTICVzIDtcbiIsIHZhbHVlMSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHZhbHVlMSwgIkVORENBUCIpID09IDApIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZTIpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHZhbHVlMiwgIlBSRSIpICYmIHN0cmNtcCh2YWx1ZTIsICJQT1NUIikgJiYKLSAgICAgICAgICAgICAgICAgICAgc3RyY21wKHZhbHVlMiwgIlRPUExFRlQiKSAmJiBzdHJjbXAodmFsdWUyLCAiVE9QUklHSFQiKSAmJgotICAgICAgICAgICAgICAgICAgICBzdHJjbXAodmFsdWUyLCAiQk9UVE9NTEVGVCIpICYmIHN0cmNtcCh2YWx1ZTIsICJCT1RUT01SSUdIVCIpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICAgICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgQ0xBU1MgJXMgJXMgO1xuIiwgdmFsdWUxLCB2YWx1ZTIpOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7ICAgLy8gcmVxdWlyZSAybmQgdmFsdWUKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoc3RyY21wKHZhbHVlMSwgIlJJTkciKSA9PSAwKQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIENMQVNTICVzIDtcbiIsIHZhbHVlMSk7Ci0gICAgICAgIGVsc2UgaWYgKHN0cmNtcCh2YWx1ZTEsICJCTE9DSyIpID09IDApIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZTIpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHZhbHVlMiwgIkJMQUNLQk9YIikgJiYgc3RyY21wKHZhbHVlMiwgIlNPRlQiKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIENMQVNTICVzICVzIDtcbiIsIHZhbHVlMSwgdmFsdWUyKTsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBDTEFTUyAlcyA7XG4iLCB2YWx1ZTEpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCh2YWx1ZTEsICJDT1ZFUiIpID09IDApIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZTIpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHZhbHVlMiwgIkJVTVAiKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIENMQVNTICVzICVzIDtcbiIsIHZhbHVlMSwgdmFsdWUyKTsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBDTEFTUyAlcyA7XG4iLCB2YWx1ZTEpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCh2YWx1ZTEsICJQQUQiKSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAodmFsdWUyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmNtcCh2YWx1ZTIsICJJTlBVVCIpICYmIHN0cmNtcCh2YWx1ZTIsICJPVVRQVVQiKSAmJgotICAgICAgICAgICAgICAgICAgICBzdHJjbXAodmFsdWUyLCAiSU5PVVQiKSAmJiBzdHJjbXAodmFsdWUyLCAiUE9XRVIiKSAmJgotICAgICAgICAgICAgICAgICAgICBzdHJjbXAodmFsdWUyLCAiU1BBQ0VSIikgJiYgc3RyY21wKHZhbHVlMiwgIkFSRUFJTyIpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgQ0xBU1MgJXMgJXMgO1xuIiwgdmFsdWUxLCB2YWx1ZTIpOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIENMQVNTICVzIDtcbiIsIHZhbHVlMSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHZhbHVlMSwgIkNPUkUiKSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAodmFsdWUyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmNtcCh2YWx1ZTIsICJGRUVEVEhSVSIpICYmIHN0cmNtcCh2YWx1ZTIsICJUSUVISUdIIikgJiYKLSAgICAgICAgICAgICAgICAgICAgc3RyY21wKHZhbHVlMiwgIlRJRUxPVyIpICYmIHN0cmNtcCh2YWx1ZTIsICJTUEFDRVIiKSAmJgotICAgICAgICAgICAgICAgICAgICBzdHJjbXAodmFsdWUyLCAiQU5URU5OQUNFTEwiKSAmJiBzdHJjbXAodmFsdWUyLCAiV0VMTFRBUCIpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgQ0xBU1MgJXMgJXMgO1xuIiwgdmFsdWUxLCB2YWx1ZTIpOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIENMQVNTICVzIDtcbiIsIHZhbHVlMSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHZhbHVlMSwgIkVORENBUCIpID09IDApIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZTIpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHZhbHVlMiwgIlBSRSIpICYmIHN0cmNtcCh2YWx1ZTIsICJQT1NUIikgJiYKLSAgICAgICAgICAgICAgICAgICAgc3RyY21wKHZhbHVlMiwgIlRPUExFRlQiKSAmJiBzdHJjbXAodmFsdWUyLCAiVE9QUklHSFQiKSAmJgotICAgICAgICAgICAgICAgICAgICBzdHJjbXAodmFsdWUyLCAiQk9UVE9NTEVGVCIpICYmIHN0cmNtcCh2YWx1ZTIsICJCT1RUT01SSUdIVCIpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgQ0xBU1MgJXMgJXMgO1xuIiwgdmFsdWUxLCB2YWx1ZTIpOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7ICAgLy8gcmVxdWlyZSAybmQgdmFsdWUKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICB9Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3U3RhdGUgPSBMRUZXX01BQ1JPOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndNYWNyb0ZpeGVkTWFzaygpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkgewotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIH0KLQotICAgIGlmICghbGVmd0RpZEluaXQpIHsKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIH0KLQotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19NQUNST19TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19NQUNSTykgewotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgfQotCi0gICAgaWYgKHZlcnNpb25OdW0gPCA1LjgpIHsKLSAgICAgICAgcmV0dXJuIExFRldfV1JPTkdfVkVSU0lPTjsKLSAgICB9Ci0KLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgRklYRURNQVNLIDtcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBGSVhFRE1BU0sgO1xuIik7Ci0gICAgfQotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19NQUNSTzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TWFjcm9Tb3VyY2UoY29uc3QgY2hhciAqdmFsdWUxKQotewotICAgIGxlZndPYnNvbGV0ZU51bSA9IExFRldfTUFDUk9fU09VUkNFOwotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19NQUNST19TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19NQUNSTykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICh2ZXJzaW9uTnVtID49IDUuNikKLSAgICAgICAgcmV0dXJuIExFRldfT0JTT0xFVEU7Ci0gICAgaWYgKCF2YWx1ZTEgfHwgdmFsdWUxID09IDAgfHwgKnZhbHVlMSA9PSAwKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAoc3RyY21wKHZhbHVlMSwgIlVTRVIiKSA9PSAwIHx8IHN0cmNtcCh2YWx1ZTEsICJHRU5FUkFURSIpID09IDAgfHwKLSAgICAgICAgc3RyY21wKHZhbHVlMSwgIkJMT0NLIikgPT0gMCkKLSAgICAgICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgU09VUkNFICVzIDtcbiIsIHZhbHVlMSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBTT1VSQ0UgJXMgO1xuIiwgdmFsdWUxKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19NQUNSTzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TWFjcm9Gb3JlaWduKGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgeGwsCi0gICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgeWwsCi0gICAgICAgICAgICAgICAgIGludCAgICAgICAgb3JpZW50KQoteyAgICAvLyBvcHRpb25hbCAKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTUFDUk9fU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTUFDUk8pCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIW5hbWUgfHwgbmFtZSA9PSAwIHx8ICpuYW1lID09IDApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KSB7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBGT1JFSUdOICVzICIsIG5hbWUpOwotICAgICAgICBpZiAoeGwgfHwgeWwpIHsKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIlLjExZyAlLjExZyAiLCB4bCwgeWwpOwotICAgICAgICAgICAgaWYgKG9yaWVudCA+PSAwICYmIG9yaWVudCA8PSA3KQotICAgICAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIlcyAiLCBsZWZ3T3JpZW50KG9yaWVudCkpOwotICAgICAgICB9IGVsc2UgaWYgKG9yaWVudCA+IDAgJiYgb3JpZW50IDw9IDcpIHsgIC8vIGFzc3VtZSB1c2VyIGhhcyAwLCAwIHB0IAotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiUuMTFnICUuMTFnICIsIHhsLCB5bCk7Ci0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiJXMgIiwgbGVmd09yaWVudChvcmllbnQpKTsKLSAgICAgICAgfQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiO1xuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIEZPUkVJR04gJXMgIiwgbmFtZSk7Ci0gICAgICAgIGlmICh4bCB8fCB5bCkgewotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiUuMTFnICUuMTFnICIsIHhsLCB5bCk7Ci0gICAgICAgICAgICBpZiAob3JpZW50ID49IDAgJiYgb3JpZW50IDw9IDcpCi0gICAgICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiVzICIsIGxlZndPcmllbnQob3JpZW50KSk7Ci0gICAgICAgIH0gZWxzZSBpZiAob3JpZW50ID4gMCAmJiBvcmllbnQgPD0gNykgeyAgLy8gYXNzdW1lIHVzZXIgaGFzIDAsIDAgcHQgCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiJS4xMWcgJS4xMWcgIiwgeGwsIHlsKTsKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIlcyAiLCBsZWZ3T3JpZW50KG9yaWVudCkpOwotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICI7XG4iKTsKLSAgICB9Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3U3RhdGUgPSBMRUZXX01BQ1JPOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndNYWNyb0ZvcmVpZ25TdHIoY29uc3QgY2hhciAgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgIHhsLAotICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICB5bCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKm9yaWVudCkKLXsvL29wdGlvbmFsCi0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX01BQ1JPX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX01BQ1JPKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFuYW1lIHx8IG5hbWUgPT0gMCB8fCAqbmFtZSA9PSAwKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgRk9SRUlHTiAlcyAiLCBuYW1lKTsKLSAgICAgICAgaWYgKHhsIHx8IHlsKSB7Ci0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiJS4xMWcgJS4xMWcgIiwgeGwsIHlsKTsKLSAgICAgICAgICAgIGlmIChvcmllbnQgJiYgKm9yaWVudCAhPSAnXDAnKQotICAgICAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIlcyAiLCBvcmllbnQpOwotICAgICAgICB9IGVsc2UgaWYgKG9yaWVudCAmJiAqb3JpZW50ICE9ICdcMCcpIHsgIC8vIGFzc3VtZSB1c2VyIGhhcyAwLCAwIHB0IAotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiUuMTFnICUuMTFnICIsIHhsLCB5bCk7Ci0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiJXMgIiwgb3JpZW50KTsKLSAgICAgICAgfQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiO1xuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIEZPUkVJR04gJXMgIiwgbmFtZSk7Ci0gICAgICAgIGlmICh4bCB8fCB5bCkgewotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiUuMTFnICUuMTFnICIsIHhsLCB5bCk7Ci0gICAgICAgICAgICBpZiAob3JpZW50ICYmICpvcmllbnQgIT0gJ1wwJykKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiJXMgIiwgb3JpZW50KTsKLSAgICAgICAgfSBlbHNlIGlmIChvcmllbnQgJiYgKm9yaWVudCAhPSAnXDAnKSB7ICAvLyBhc3N1bWUgdXNlciBoYXMgMCwgMCBwdCAKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIlLjExZyAlLjExZyAiLCB4bCwgeWwpOwotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiVzICIsIG9yaWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIjtcbiIpOwotICAgIH0KLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTdGF0ZSA9IExFRldfTUFDUk87Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd01hY3JvT3JpZ2luKGRvdWJsZSAgeGwsCi0gICAgICAgICAgICAgICAgZG91YmxlICB5bCkKLXsgICAgLy8gb3B0aW9uYWwgCi0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX01BQ1JPX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX01BQ1JPKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBPUklHSU4gJS4xMWcgJS4xMWcgO1xuIiwgeGwsIHlsKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBPUklHSU4gJS4xMWcgJS4xMWcgO1xuIiwgeGwsIHlsKTsKLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTdGF0ZSA9IExFRldfTUFDUk87Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd01hY3JvRUVRKGNvbnN0IGNoYXIgKm1hY3JvTmFtZSkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTUFDUk9fU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTUFDUk8pCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIW1hY3JvTmFtZSB8fCBtYWNyb05hbWUgPT0gMCB8fCAqbWFjcm9OYW1lID09IDApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgRUVRICVzIDtcbiIsIG1hY3JvTmFtZSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgRUVRICVzIDtcbiIsIG1hY3JvTmFtZSk7Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3U3RhdGUgPSBMRUZXX01BQ1JPOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndNYWNyb0xFUShjb25zdCBjaGFyICptYWNyb05hbWUpCi17Ci0gICAgbGVmd09ic29sZXRlTnVtID0gTEVGV19NQUNST19MRVE7Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX01BQ1JPX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX01BQ1JPKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKHZlcnNpb25OdW0gPj0gNS42KQotICAgICAgICByZXR1cm4gTEVGV19PQlNPTEVURTsKLSAgICBpZiAoIW1hY3JvTmFtZSB8fCBtYWNyb05hbWUgPT0gMCB8fCAqbWFjcm9OYW1lID09IDApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgTEVRICVzIDtcbiIsIG1hY3JvTmFtZSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgTEVRICVzIDtcbiIsIG1hY3JvTmFtZSk7Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3U3RhdGUgPSBMRUZXX01BQ1JPOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndNYWNyb1NpemUoZG91YmxlICAgIHdpZHRoLAotICAgICAgICAgICAgICBkb3VibGUgICAgaGVpZ2h0KQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19NQUNST19TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19NQUNSTykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgU0laRSAlLjExZyBCWSAlLjExZyA7XG4iLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBTSVpFICUuMTFnIEJZICUuMTFnIDtcbiIsIHdpZHRoLCBoZWlnaHQpOwotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19NQUNSTzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TWFjcm9TeW1tZXRyeShjb25zdCBjaGFyICpzeW1tZXRyeSkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTUFDUk9fU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTUFDUk8pCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIXN5bW1ldHJ5IHx8IHN5bW1ldHJ5ID09IDAgfHwgKnN5bW1ldHJ5ID09IDApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgU1lNTUVUUlkgJXMgO1xuIiwgc3ltbWV0cnkpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIFNZTU1FVFJZICVzIDtcbiIsIHN5bW1ldHJ5KTsKLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTdGF0ZSA9IExFRldfTUFDUk87Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd01hY3JvU2l0ZShjb25zdCBjaGFyICpzaXRlTmFtZSkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTUFDUk9fU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTUFDUk8pCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIXNpdGVOYW1lIHx8IHNpdGVOYW1lID09IDAgfHwgKnNpdGVOYW1lID09IDApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgU0lURSAlcyA7XG4iLCBzaXRlTmFtZSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgU0lURSAlcyA7XG4iLCBzaXRlTmFtZSk7Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3U3RhdGUgPSBMRUZXX01BQ1JPOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndNYWNyb1NpdGVQYXR0ZXJuKGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgIG9yaWdYLAotICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICBvcmlnWSwKLSAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgb3JpZW50LAotICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBudW1YLAotICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBudW1ZLAotICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICBzcGFjZVgsCi0gICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgIHNwYWNlWSkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTUFDUk9fU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTUFDUk8pCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIW5hbWUgfHwgbmFtZSA9PSAwIHx8ICpuYW1lID09IDApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KSB7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBTSVRFICVzICIsIG5hbWUpOwotICAgICAgICBpZiAob3JpZ1ggfHwgb3JpZ1kgfHwgKG9yaWVudCAhPSAxKSkgewotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiUuMTFnICUuMTFnICVzICIsIG9yaWdYLCBvcmlnWSwKLSAgICAgICAgICAgICAgICAgICAgIGxlZndPcmllbnQob3JpZW50KSk7Ci0gICAgICAgICAgICBpZiAobnVtWCB8fCBudW1ZIHx8IHNwYWNlWCB8fCBzcGFjZVkpCi0gICAgICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIkRPICVkIEJZICVkIFNURVAgJS4xMWcgJS4xMWcgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBudW1YLCBudW1ZLCBzcGFjZVgsIHNwYWNlWSk7Ci0gICAgICAgIH0KLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIjtcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBTSVRFICVzICIsIG5hbWUpOwotICAgICAgICBpZiAob3JpZ1ggfHwgb3JpZ1kgfHwgKG9yaWVudCAhPSAxKSkgewotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiUuMTFnICUuMTFnICVzICIsIG9yaWdYLCBvcmlnWSwgbGVmd09yaWVudChvcmllbnQpKTsKLSAgICAgICAgICAgIGlmIChudW1YIHx8IG51bVkgfHwgc3BhY2VYIHx8IHNwYWNlWSkKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiRE8gJWQgQlkgJWQgU1RFUCAlLjExZyAlLjExZyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtWCwgbnVtWSwgc3BhY2VYLCBzcGFjZVkpOwotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICI7XG4iKTsKLSAgICB9Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3U3RhdGUgPSBMRUZXX01BQ1JPOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndNYWNyb1NpdGVQYXR0ZXJuU3RyKGNvbnN0IGNoYXIgICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgb3JpZ1gsCi0gICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICBvcmlnWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpvcmllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBudW1YLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbnVtWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgIHNwYWNlWCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgIHNwYWNlWSkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTUFDUk9fU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTUFDUk8pCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIW5hbWUgfHwgbmFtZSA9PSAwIHx8ICpuYW1lID09IDApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KSB7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBTSVRFICVzICIsIG5hbWUpOwotICAgICAgICBpZiAob3JpZ1ggfHwgb3JpZ1kgfHwgb3JpZW50KSB7Ci0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiJS4xMWcgJS4xMWcgJXMgIiwgb3JpZ1gsIG9yaWdZLCBvcmllbnQpOwotICAgICAgICAgICAgaWYgKG51bVggfHwgbnVtWSB8fCBzcGFjZVggfHwgc3BhY2VZKQotICAgICAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJETyAlZCBCWSAlZCBTVEVQICUuMTFnICUuMTFnICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbnVtWCwgbnVtWSwgc3BhY2VYLCBzcGFjZVkpOwotICAgICAgICB9Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICI7XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgU0lURSAlcyAiLCBuYW1lKTsKLSAgICAgICAgaWYgKG9yaWdYIHx8IG9yaWdZIHx8IG9yaWVudCkgewotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiUuMTFnICUuMTFnICVzICIsIG9yaWdYLCBvcmlnWSwgb3JpZW50KTsKLSAgICAgICAgICAgIGlmIChudW1YIHx8IG51bVkgfHwgc3BhY2VYIHx8IHNwYWNlWSkKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiRE8gJWQgQlkgJWQgU1RFUCAlLjExZyAlLjExZyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtWCwgbnVtWSwgc3BhY2VYLCBzcGFjZVkpOwotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICI7XG4iKTsKLSAgICB9Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3U3RhdGUgPSBMRUZXX01BQ1JPOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndNYWNyb1Bvd2VyKGRvdWJsZSBwb3dlcikKLXsKLSAgICBsZWZ3T2Jzb2xldGVOdW0gPSBMRUZXX01BQ1JPX1BPV0VSOwotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19NQUNST19TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19NQUNSTykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICh2ZXJzaW9uTnVtID49IDUuNCkKLSAgICAgICAgcmV0dXJuIExFRldfT0JTT0xFVEU7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBQT1dFUiAlLjExZyA7XG4iLCBwb3dlcik7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgUE9XRVIgJS4xMWcgO1xuIiwgcG93ZXIpOwotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19NQUNSTzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3RW5kTWFjcm8oY29uc3QgY2hhciAqbWFjcm9OYW1lKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX01BQ1JPX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX01BQ1JPKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFtYWNyb05hbWUgfHwgbWFjcm9OYW1lID09IDAgfHwgKm1hY3JvTmFtZSA9PSAwKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIkVORCAlc1xuXG4iLCBtYWNyb05hbWUpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIkVORCAlc1xuXG4iLCBtYWNyb05hbWUpOwotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19NQUNST19FTkQ7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd1N0YXJ0TWFjcm9EZW5zaXR5KGNvbnN0IGNoYXIgKmxheWVyTmFtZSkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19NQUNST19TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19NQUNSTykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3SXNNYWNyb0RlbnNpdHkpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxheWVyTmFtZSB8fCBsYXllck5hbWUgPT0gMCB8fCAqbGF5ZXJOYW1lID09IDApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgREVOU0lUWSAlc1xuIiwgbGF5ZXJOYW1lKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBERU5TSVRZICVzXG4iLCBsYXllck5hbWUpOwotCi0gICAgbGVmd1N0YXRlID0gTEVGV19NQUNSTzsKLSAgICBsZWZ3SXNNYWNyb0RlbnNpdHkgPSAxOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndNYWNyb0RlbnNpdHlMYXllclJlY3QoZG91YmxlICAgIHgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgeTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICB4MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgIHkyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgZGVuc2l0eVZhbHVlKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzTWFjcm9EZW5zaXR5KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLAotICAgICAgICAgICAgICAgICAoY2hhciopICIgICAgICBSRUNUICUuMTFnICUuMTFnICUuMTFnICUuMTFnICUuMTFnIDtcbiIsIHgxLCB5MSwgeDIsIHkyLAotICAgICAgICAgICAgICAgICBkZW5zaXR5VmFsdWUpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwKLSAgICAgICAgICAgICAgICAiICAgICAgUkVDVCAlLjExZyAlLjExZyAlLjExZyAlLjExZyAlLjExZyA7XG4iLCB4MSwgeTEsIHgyLCB5MiwKLSAgICAgICAgICAgICAgICBkZW5zaXR5VmFsdWUpOwotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTdGF0ZSA9IExFRldfTUFDUk87Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd0VuZE1hY3JvRGVuc2l0eSgpCi17Ci0gICAgaWYgKCFsZWZ3SXNNYWNyb0RlbnNpdHkpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIEVORFxuXG4iKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBFTkRcblxuIik7Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3SXNNYWNyb0RlbnNpdHkgPSAwOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndTdGFydE1hY3JvUGluKGNvbnN0IGNoYXIgKnBpbk5hbWUpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTUFDUk9fU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTUFDUk8pCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd0lzTWFjcm9QaW4pCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIXBpbk5hbWUgfHwgcGluTmFtZSA9PSAwIHx8ICpwaW5OYW1lID09IDApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgUElOICVzXG4iLCBwaW5OYW1lKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBQSU4gJXNcbiIsIHBpbk5hbWUpOwotCi0gICAgbGVmd0lzTWFjcm9QaW4gPSAxOwotICAgIGxlZndJc01hY3JvUGluUG9ydCA9IDA7ICAgIC8vIHBvcnQgd2l0aGluIG1hY3JvcGluCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd0FNYXhBcmVhQ2FyID0gMDsgICAgICAgLy8gcmVzZXQKLSAgICBsZWZ3QU1heFNpZGVBcmVhQ2FyID0gMDsgICAvLyByZXNldAotICAgIGxlZndBTWF4Q3V0Q2FyID0gMDsgICAgICAgIC8vIHJlc2V0Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLQotaW50Ci1sZWZ3TWFjcm9QaW5UYXBlclJ1bGUoY29uc3QgY2hhciAqcnVsZU5hbWUpCi17IC8vIG9waXRvbmFsIAotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzTWFjcm9QaW4pCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIXJ1bGVOYW1lIHx8IHJ1bGVOYW1lID09IDAgfHwgKnJ1bGVOYW1lID09IDApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgVEFQRVJSVUxFICVzIDtcbiIsIHJ1bGVOYW1lKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBUQVBFUlJVTEUgJXMgO1xuIiwgcnVsZU5hbWUpOwotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19NQUNSTzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TWFjcm9QaW5Gb3JlaWduKGNvbnN0IGNoYXIgICpuYW1lLAotICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICB4bCwKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgeWwsCi0gICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIG9yaWVudCkKLXsgLy8gb3B0aW9uYWwgCi0gICAgbGVmd09ic29sZXRlTnVtID0gTEVGV19NQUNST19QSU5GT1JFSUdOOwotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzTWFjcm9QaW4pCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAodmVyc2lvbk51bSA+PSA1LjYpCi0gICAgICAgIHJldHVybiBMRUZXX09CU09MRVRFOwotICAgIGlmICghbmFtZSB8fCBuYW1lID09IDAgfHwgKm5hbWUgPT0gMCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpIHsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIEZPUkVJR04gJXMgIiwgbmFtZSk7Ci0gICAgICAgIGlmICh4bCB8fCB5bCkgewotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIlNUUlVDVFVSRSAlLjExZyAlLjExZyAiLCB4bCwgeWwpOwotICAgICAgICAgICAgaWYgKG9yaWVudCA+PSAwICYmIG9yaWVudCA8PSA3KQotICAgICAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIlcyAiLCBsZWZ3T3JpZW50KG9yaWVudCkpOwotICAgICAgICB9IGVsc2UgaWYgKG9yaWVudCA+IDAgJiYgb3JpZW50IDw9IDcpIHsgLy8gYXNzdW1lIHVzZXIgaGFzIDAgMCBmb3IgcHQgCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiU1RSVUNUVVJFICUuMTFnICUuMTFnICIsIHhsLCB5bCk7Ci0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiJXMgIiwgbGVmd09yaWVudChvcmllbnQpKTsKLSAgICAgICAgfQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiO1xuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgIEZPUkVJR04gJXMgIiwgbmFtZSk7Ci0gICAgICAgIGlmICh4bCB8fCB5bCkgewotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIlNUUlVDVFVSRSAlLjExZyAlLjExZyAiLCB4bCwgeWwpOwotICAgICAgICAgICAgaWYgKG9yaWVudCA+PSAwICYmIG9yaWVudCA8PSA3KQotICAgICAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIlcyAiLCBsZWZ3T3JpZW50KG9yaWVudCkpOwotICAgICAgICB9IGVsc2UgaWYgKG9yaWVudCA+IDAgJiYgb3JpZW50IDw9IDcpIHsgLy8gYXNzdW1lIHVzZXIgaGFzIDAgMCBmb3IgcHQgCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiU1RSVUNUVVJFICUuMTFnICUuMTFnICIsIHhsLCB5bCk7Ci0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiJXMgIiwgbGVmd09yaWVudChvcmllbnQpKTsKLSAgICAgICAgfQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiO1xuIik7Ci0gICAgfQotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19NQUNSTzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotCi1pbnQKLWxlZndNYWNyb1BpbkZvcmVpZ25TdHIoY29uc3QgY2hhciAgICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICAgeGwsCi0gICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICB5bCwgLy8gb3B0aW9uYWwgCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAqb3JpZW50KQoteyAvLyBvcHRpb25hbCAKLSAgICBsZWZ3T2Jzb2xldGVOdW0gPSBMRUZXX01BQ1JPX1BJTkZPUkVJR047Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNNYWNyb1BpbikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICh2ZXJzaW9uTnVtID49IDUuNikKLSAgICAgICAgcmV0dXJuIExFRldfT0JTT0xFVEU7Ci0gICAgaWYgKCFuYW1lIHx8IG5hbWUgPT0gMCB8fCAqbmFtZSA9PSAwKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgRk9SRUlHTiAlcyAiLCBuYW1lKTsKLSAgICAgICAgaWYgKHhsIHx8IHlsKSB7Ci0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiU1RSVUNUVVJFICUuMTFnICUuMTFnICIsIHhsLCB5bCk7Ci0gICAgICAgICAgICBpZiAob3JpZW50ICYmICpvcmllbnQgIT0gJ1wwJykKLSAgICAgICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiJXMgIiwgb3JpZW50KTsKLSAgICAgICAgfSBlbHNlIGlmIChvcmllbnQgJiYgKm9yaWVudCAhPSAnXDAnKSB7IC8vIGFzc3VtZSB1c2VyIGhhcyAwIDAgZm9yIHB0IAotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIlNUUlVDVFVSRSAlLjExZyAlLjExZyAiLCB4bCwgeWwpOwotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiVzICIsIG9yaWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIjtcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBGT1JFSUdOICVzICIsIG5hbWUpOwotICAgICAgICBpZiAoeGwgfHwgeWwpIHsKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJTVFJVQ1RVUkUgJS4xMWcgJS4xMWcgIiwgeGwsIHlsKTsKLSAgICAgICAgICAgIGlmIChvcmllbnQgJiYgKm9yaWVudCAhPSAnXDAnKQotICAgICAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIlcyAiLCBvcmllbnQpOwotICAgICAgICB9IGVsc2UgaWYgKG9yaWVudCAmJiAqb3JpZW50ICE9ICdcMCcpIHsgLy8gYXNzdW1lIHVzZXIgaGFzIDAgMCBmb3IgcHQgCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiU1RSVUNUVVJFICUuMTFnICUuMTFnICIsIHhsLCB5bCk7Ci0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiJXMgIiwgb3JpZW50KTsKLSAgICAgICAgfQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiO1xuIik7Ci0gICAgfQotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19NQUNSTzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotCi1pbnQKLWxlZndNYWNyb1BpbkxFUShjb25zdCBjaGFyICpwaW5OYW1lKQotewotICAgIGxlZndPYnNvbGV0ZU51bSA9IExFRldfTUFDUk9fUElOTEVROwotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzTWFjcm9QaW4pCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAodmVyc2lvbk51bSA+PSA1LjYpCi0gICAgICAgIHJldHVybiBMRUZXX09CU09MRVRFOwotICAgIGlmICghcGluTmFtZSB8fCBwaW5OYW1lID09IDAgfHwgKnBpbk5hbWUgPT0gMCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICBMRVEgJXMgO1xuIiwgcGluTmFtZSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgTEVRICVzIDtcbiIsIHBpbk5hbWUpOwotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19NQUNSTzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TWFjcm9QaW5EaXJlY3Rpb24oY29uc3QgY2hhciAqZGlyZWN0aW9uKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzTWFjcm9QaW4pCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWRpcmVjdGlvbiB8fCBkaXJlY3Rpb24gPT0gMCB8fCAqZGlyZWN0aW9uID09IDApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgRElSRUNUSU9OICVzIDtcbiIsIGRpcmVjdGlvbik7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgRElSRUNUSU9OICVzIDtcbiIsIGRpcmVjdGlvbik7Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3U3RhdGUgPSBMRUZXX01BQ1JPOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndNYWNyb1BpblVzZShjb25zdCBjaGFyICp1c2UpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNNYWNyb1BpbikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghdXNlIHx8IHVzZSA9PSAwIHx8ICp1c2UgPT0gMCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICBVU0UgJXMgO1xuIiwgdXNlKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBVU0UgJXMgO1xuIiwgdXNlKTsKLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTdGF0ZSA9IExFRldfTUFDUk87Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd01hY3JvUGluU2hhcGUoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc01hY3JvUGluKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpIHsKLSAgICAgICAgaWYgKCFuYW1lIHx8IG5hbWUgPT0gMCB8fCAqbmFtZSA9PSAwKQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIFNIQVBFIDtcbiIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgU0hBUEUgJXMgO1xuIiwgbmFtZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFuYW1lIHx8IG5hbWUgPT0gMCB8fCAqbmFtZSA9PSAwKQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgIFNIQVBFIDtcbiIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgU0hBUEUgJXMgO1xuIiwgbmFtZSk7Ci0gICAgfQotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19NQUNSTzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TWFjcm9QaW5NdXN0am9pbihjb25zdCBjaGFyICpuYW1lKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzTWFjcm9QaW4pCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIW5hbWUgfHwgbmFtZSA9PSAwIHx8ICpuYW1lID09IDApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgTVVTVEpPSU4gJXMgO1xuIiwgbmFtZSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgTVVTVEpPSU4gJXMgO1xuIiwgbmFtZSk7Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3U3RhdGUgPSBMRUZXX01BQ1JPOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndNYWNyb1Bpbk5ldEV4cHIoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc01hY3JvUGluKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFuYW1lIHx8IG5hbWUgPT0gMCB8fCAqbmFtZSA9PSAwKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIE5FVEVYUFIgXCIlc1wiIDtcbiIsIG5hbWUpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgIE5FVEVYUFIgXCIlc1wiIDtcbiIsIG5hbWUpOwotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19NQUNSTzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TWFjcm9QaW5TdXBwbHlTZW5zaXRpdml0eShjb25zdCBjaGFyICpwaW5OYW1lKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzTWFjcm9QaW4pCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIXBpbk5hbWUgfHwgcGluTmFtZSA9PSAwIHx8ICpwaW5OYW1lID09IDApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgU1VQUExZU0VOU0lUSVZJVFkgJXMgO1xuIiwgcGluTmFtZSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgU1VQUExZU0VOU0lUSVZJVFkgJXMgO1xuIiwgcGluTmFtZSk7Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3U3RhdGUgPSBMRUZXX01BQ1JPOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndNYWNyb1Bpbkdyb3VuZFNlbnNpdGl2aXR5KGNvbnN0IGNoYXIgKnBpbk5hbWUpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNNYWNyb1BpbikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghcGluTmFtZSB8fCBwaW5OYW1lID09IDAgfHwgKnBpbk5hbWUgPT0gMCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICBHUk9VTkRTRU5TSVRJVklUWSAlcyA7XG4iLCBwaW5OYW1lKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBHUk9VTkRTRU5TSVRJVklUWSAlcyA7XG4iLCBwaW5OYW1lKTsKLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTdGF0ZSA9IExFRldfTUFDUk87Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd01hY3JvUGluT3V0cHV0bm9pc2VtYXJnaW4oaW50ICAgaGlnaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgIGxvdykKLXsKLSAgICBsZWZ3T2Jzb2xldGVOdW0gPSBMRUZXX01BQ1JPX09VVFBVVE5PSVNFTUFSR0lOOwotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzTWFjcm9QaW4pCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAodmVyc2lvbk51bSA+PSA1LjQpCi0gICAgICAgIHJldHVybiBMRUZXX09CU09MRVRFOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgT1VUUFVUTk9JU0VNQVJHSU4gJWQgJWQgO1xuIiwgaGlnaCwgbG93KTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBPVVRQVVROT0lTRU1BUkdJTiAlZCAlZCA7XG4iLCBoaWdoLCBsb3cpOwotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19NQUNSTzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TWFjcm9QaW5PdXRwdXRyZXNpc3RhbmNlKGludCAgICBoaWdoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgbG93KQotewotICAgIGxlZndPYnNvbGV0ZU51bSA9IExFRldfTUFDUk9fT1VUUFVUUkVTSVNUQU5DRTsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc01hY3JvUGluKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKHZlcnNpb25OdW0gPj0gNS40KQotICAgICAgICByZXR1cm4gTEVGV19PQlNPTEVURTsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIE9VVFBVVFJFU0lTVEFOQ0UgJWQgJWQgO1xuIiwgaGlnaCwgbG93KTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBPVVRQVVRSRVNJU1RBTkNFICVkICVkIDtcbiIsIGhpZ2gsIGxvdyk7Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3U3RhdGUgPSBMRUZXX01BQ1JPOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndNYWNyb1BpbklucHV0bm9pc2VtYXJnaW4oaW50ICAgIGhpZ2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBsb3cpCi17Ci0gICAgbGVmd09ic29sZXRlTnVtID0gTEVGV19NQUNST19JTlBVVE5PSVNFTUFSR0lOOwotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzTWFjcm9QaW4pCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAodmVyc2lvbk51bSA+PSA1LjQpCi0gICAgICAgIHJldHVybiBMRUZXX09CU09MRVRFOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgSU5QVVROT0lTRU1BUkdJTiAlZCAlZCA7XG4iLCBoaWdoLCBsb3cpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgIElOUFVUTk9JU0VNQVJHSU4gJWQgJWQgO1xuIiwgaGlnaCwgbG93KTsKLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTdGF0ZSA9IExFRldfTUFDUk87Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd01hY3JvUGluUG93ZXIoZG91YmxlIHBvd2VyKQotewotICAgIGxlZndPYnNvbGV0ZU51bSA9IExFRldfTUFDUk9fUE9XRVI7Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNNYWNyb1BpbikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICh2ZXJzaW9uTnVtID49IDUuNCkKLSAgICAgICAgcmV0dXJuIExFRldfT0JTT0xFVEU7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICBQT1dFUiAlLjExZyA7XG4iLCBwb3dlcik7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgUE9XRVIgJS4xMWcgO1xuIiwgcG93ZXIpOwotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19NQUNSTzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TWFjcm9QaW5MZWFrYWdlKGRvdWJsZSBsZWFrYWdlKQotewotICAgIGxlZndPYnNvbGV0ZU51bSA9IExFRldfTUFDUk9fTEVBS0FHRTsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc01hY3JvUGluKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKHZlcnNpb25OdW0gPj0gNS40KQotICAgICAgICByZXR1cm4gTEVGV19PQlNPTEVURTsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIExFQUtBR0UgJS4xMWcgO1xuIiwgbGVha2FnZSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgTEVBS0FHRSAlLjExZyA7XG4iLCBsZWFrYWdlKTsKLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTdGF0ZSA9IExFRldfTUFDUk87Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd01hY3JvUGluQ2FwYWNpdGFuY2UoZG91YmxlIGNhcGFjaXRhbmNlKQotewotICAgIGxlZndPYnNvbGV0ZU51bSA9IExFRldfTUFDUk9fQ0FQQUNJVEFOQ0U7Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNNYWNyb1BpbikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICh2ZXJzaW9uTnVtID49IDUuNCkKLSAgICAgICAgcmV0dXJuIExFRldfT0JTT0xFVEU7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICBDQVBBQ0lUQU5DRSAlLjExZyA7XG4iLCBjYXBhY2l0YW5jZSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgQ0FQQUNJVEFOQ0UgJS4xMWcgO1xuIiwgY2FwYWNpdGFuY2UpOwotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19NQUNSTzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TWFjcm9QaW5SZXNpc3RhbmNlKGRvdWJsZSByZXNpc3RhbmNlKQotewotICAgIGxlZndPYnNvbGV0ZU51bSA9IExFRldfTUFDUk9fUkVTSVNUQU5DRTsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc01hY3JvUGluKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKHZlcnNpb25OdW0gPj0gNS40KQotICAgICAgICByZXR1cm4gTEVGV19PQlNPTEVURTsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIFJFU0lTVEFOQ0UgJS4xMWcgO1xuIiwgcmVzaXN0YW5jZSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgUkVTSVNUQU5DRSAlLjExZyA7XG4iLCByZXNpc3RhbmNlKTsKLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTdGF0ZSA9IExFRldfTUFDUk87Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd01hY3JvUGluUHVsbGRvd25yZXMoZG91YmxlIHJlc2lzdGFuY2UpCi17Ci0gICAgbGVmd09ic29sZXRlTnVtID0gTEVGV19NQUNST19QVUxMRE9XTlJFUzsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc01hY3JvUGluKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKHZlcnNpb25OdW0gPj0gNS40KQotICAgICAgICByZXR1cm4gTEVGV19PQlNPTEVURTsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIFBVTExET1dOUkVTICUuMTFnIDtcbiIsIHJlc2lzdGFuY2UpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgIFBVTExET1dOUkVTICUuMTFnIDtcbiIsIHJlc2lzdGFuY2UpOwotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19NQUNSTzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TWFjcm9QaW5UaWVvZmZyKGRvdWJsZSByZXNpc3RhbmNlKQotewotICAgIGxlZndPYnNvbGV0ZU51bSA9IExFRldfTUFDUk9fVElFT0ZGUjsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc01hY3JvUGluKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKHZlcnNpb25OdW0gPj0gNS40KQotICAgICAgICByZXR1cm4gTEVGV19PQlNPTEVURTsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIFRJRU9GRlIgJS4xMWcgO1xuIiwgcmVzaXN0YW5jZSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgVElFT0ZGUiAlLjExZyA7XG4iLCByZXNpc3RhbmNlKTsKLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTdGF0ZSA9IExFRldfTUFDUk87Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd01hY3JvUGluVkhJKGRvdWJsZSB2b2x0YWdlKQotewotICAgIGxlZndPYnNvbGV0ZU51bSA9IExFRldfTUFDUk9fVkhJOwotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzTWFjcm9QaW4pCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAodmVyc2lvbk51bSA+PSA1LjQpCi0gICAgICAgIHJldHVybiBMRUZXX09CU09MRVRFOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgVkhJICUuMTFnIDtcbiIsIHZvbHRhZ2UpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgIFZISSAlLjExZyA7XG4iLCB2b2x0YWdlKTsKLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTdGF0ZSA9IExFRldfTUFDUk87Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLQotaW50Ci1sZWZ3TWFjcm9QaW5WTE8oZG91YmxlIHZvbHRhZ2UpCi17Ci0gICAgbGVmd09ic29sZXRlTnVtID0gTEVGV19NQUNST19WTE87Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNNYWNyb1BpbikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICh2ZXJzaW9uTnVtID49IDUuNCkKLSAgICAgICAgcmV0dXJuIExFRldfT0JTT0xFVEU7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICBWTE8gJS4xMWcgO1xuIiwgdm9sdGFnZSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgVkxPICUuMTFnIDtcbiIsIHZvbHRhZ2UpOwotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19NQUNSTzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotCi1pbnQKLWxlZndNYWNyb1BpblJpc2V2b2x0YWdldGhyZXNob2xkKGRvdWJsZSB2b2x0YWdlKQotewotICAgIGxlZndPYnNvbGV0ZU51bSA9IExFRldfTUFDUk9fUklTRVZPTFRBR0VUSFJFU0hPTEQ7Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNNYWNyb1BpbikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICh2ZXJzaW9uTnVtID49IDUuNCkKLSAgICAgICAgcmV0dXJuIExFRldfT0JTT0xFVEU7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICBSSVNFVk9MVEFHRVRIUkVTSE9MRCAlLjExZyA7XG4iLCB2b2x0YWdlKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBSSVNFVk9MVEFHRVRIUkVTSE9MRCAlLjExZyA7XG4iLCB2b2x0YWdlKTsKLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTdGF0ZSA9IExFRldfTUFDUk87Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLQotaW50Ci1sZWZ3TWFjcm9QaW5GYWxsdm9sdGFnZXRocmVzaG9sZChkb3VibGUgdm9sdGFnZSkKLXsKLSAgICBsZWZ3T2Jzb2xldGVOdW0gPSBMRUZXX01BQ1JPX0ZBTExWT0xUQUdFVEhSRVNIT0xEOwotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzTWFjcm9QaW4pCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAodmVyc2lvbk51bSA+PSA1LjQpCi0gICAgICAgIHJldHVybiBMRUZXX09CU09MRVRFOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgRkFMTFZPTFRBR0VUSFJFU0hPTEQgJS4xMWcgO1xuIiwgdm9sdGFnZSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgRkFMTFZPTFRBR0VUSFJFU0hPTEQgJS4xMWcgO1xuIiwgdm9sdGFnZSk7Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3U3RhdGUgPSBMRUZXX01BQ1JPOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndNYWNyb1BpblJpc2V0aHJlc2goZG91YmxlIGNhcGFjaXRhbmNlKQotewotICAgIGxlZndPYnNvbGV0ZU51bSA9IExFRldfTUFDUk9fUklTRVRIUkVTSDsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc01hY3JvUGluKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKHZlcnNpb25OdW0gPj0gNS40KQotICAgICAgICByZXR1cm4gTEVGV19PQlNPTEVURTsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIFJJU0VUSFJFU0ggJS4xMWcgO1xuIiwgY2FwYWNpdGFuY2UpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgIFJJU0VUSFJFU0ggJS4xMWcgO1xuIiwgY2FwYWNpdGFuY2UpOwotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19NQUNSTzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3TWFjcm9QaW5GYWxsdGhyZXNoKGRvdWJsZSBjYXBhY2l0YW5jZSkKLXsKLSAgICBsZWZ3T2Jzb2xldGVOdW0gPSBMRUZXX01BQ1JPX0ZBTExUSFJFU0g7Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNNYWNyb1BpbikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICh2ZXJzaW9uTnVtID49IDUuNCkKLSAgICAgICAgcmV0dXJuIExFRldfT0JTT0xFVEU7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICBGQUxMVEhSRVNIICUuMTFnIDtcbiIsIGNhcGFjaXRhbmNlKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBGQUxMVEhSRVNIICUuMTFnIDtcbiIsIGNhcGFjaXRhbmNlKTsKLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTdGF0ZSA9IExFRldfTUFDUk87Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLWludAotbGVmd01hY3JvUGluUmlzZXNhdGN1cihkb3VibGUgY3VycmVudCkKLXsKLSAgICBsZWZ3T2Jzb2xldGVOdW0gPSBMRUZXX01BQ1JPX1JJU0VTQVRDVVI7Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNNYWNyb1BpbikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICh2ZXJzaW9uTnVtID49IDUuNCkKLSAgICAgICAgcmV0dXJuIExFRldfT0JTT0xFVEU7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICBSSVNFU0FUQ1VSICUuMTFnIDtcbiIsIGN1cnJlbnQpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgIFJJU0VTQVRDVVIgJS4xMWcgO1xuIiwgY3VycmVudCk7Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3U3RhdGUgPSBMRUZXX01BQ1JPOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi1pbnQKLWxlZndNYWNyb1BpbkZhbGxzYXRjdXIoZG91YmxlIGN1cnJlbnQpCi17Ci0gICAgbGVmd09ic29sZXRlTnVtID0gTEVGV19NQUNST19GQUxMU0FUQ1VSOwotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzTWFjcm9QaW4pCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAodmVyc2lvbk51bSA+PSA1LjQpCi0gICAgICAgIHJldHVybiBMRUZXX09CU09MRVRFOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgRkFMTFNBVENVUiAlLjExZyA7XG4iLCBjdXJyZW50KTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBGQUxMU0FUQ1VSICUuMTFnIDtcbiIsIGN1cnJlbnQpOwotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19NQUNSTzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotCi1pbnQKLWxlZndNYWNyb1BpbkN1cnJlbnRzb3VyY2UoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBsZWZ3T2Jzb2xldGVOdW0gPSBMRUZXX01BQ1JPX0ZBTExDVVJSRU5UU09VUkNFOwotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzTWFjcm9QaW4pCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIW5hbWUgfHwgbmFtZSA9PSAwIHx8ICpuYW1lID09IDApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmICh2ZXJzaW9uTnVtID49IDUuNCkKLSAgICAgICAgcmV0dXJuIExFRldfT0JTT0xFVEU7Ci0gICAgaWYgKHN0cmNtcChuYW1lLCAiQUNUSVZFIikgJiYgc3RyY21wKG5hbWUsICJSRVNJU1RJVkUiKSkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICBDVVJSRU5UU09VUkNFICVzIDtcbiIsIG5hbWUpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgIENVUlJFTlRTT1VSQ0UgJXMgO1xuIiwgbmFtZSk7Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3U3RhdGUgPSBMRUZXX01BQ1JPOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi0KLWludAotbGVmd01hY3JvUGluSVZfVGFibGVzKGNvbnN0IGNoYXIgICAgKmxvd05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqaGlnaE5hbWUpCi17Ci0gICAgbGVmd09ic29sZXRlTnVtID0gTEVGV19NQUNST19JVl9UQUJMRVM7Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNNYWNyb1BpbikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICh2ZXJzaW9uTnVtID49IDUuNCkKLSAgICAgICAgcmV0dXJuIExFRldfT0JTT0xFVEU7Ci0gICAgaWYgKCFsb3dOYW1lIHx8IGxvd05hbWUgPT0gMCB8fCAqbG93TmFtZSA9PSAwKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAoIWhpZ2hOYW1lIHx8IGhpZ2hOYW1lID09IDAgfHwgKmhpZ2hOYW1lID09IDApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgSVZfVEFCTEVTICVzICVzIDtcbiIsIGxvd05hbWUsIGhpZ2hOYW1lKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBJVl9UQUJMRVMgJXMgJXMgO1xuIiwgbG93TmFtZSwgaGlnaE5hbWUpOwotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19NQUNSTzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotCi1pbnQKLWxlZndNYWNyb1BpbkFudGVubmFzaXplKGRvdWJsZSAgICAgIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmxheWVyTmFtZSkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc01hY3JvUGluKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndBbnRlbm5hNTQpCi0gICAgICAgIHJldHVybiBMRUZXX01JWF9WRVJTSU9OX0RBVEE7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpIHsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIEFOVEVOTkFTSVpFICUuMTFnICIsIHZhbHVlKTsKLSAgICAgICAgaWYgKGxheWVyTmFtZSkKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJMQVlFUiAlcyAiLCBsYXllck5hbWUpOwotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiO1xuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgIEFOVEVOTkFTSVpFICUuMTFnICIsIHZhbHVlKTsKLSAgICAgICAgaWYgKGxheWVyTmFtZSkKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJMQVlFUiAlcyAiLCBsYXllck5hbWUpOwotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiO1xuIik7Ci0gICAgfQotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19NQUNSTzsKLSAgICBsZWZ3QW50ZW5uYTUzID0gMTsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotCi1pbnQKLWxlZndNYWNyb1BpbkFudGVubmFNZXRhbEFyZWEoZG91YmxlICAgICB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbGF5ZXJOYW1lKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzTWFjcm9QaW4pCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgQU5URU5OQU1FVEFMQVJFQSAlLjExZyAiLCB2YWx1ZSk7Ci0gICAgICAgIGlmIChsYXllck5hbWUpCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiTEFZRVIgJXMgIiwgbGF5ZXJOYW1lKTsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIjtcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBBTlRFTk5BTUVUQUxBUkVBICUuMTFnICIsIHZhbHVlKTsKLSAgICAgICAgaWYgKGxheWVyTmFtZSkKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJMQVlFUiAlcyAiLCBsYXllck5hbWUpOwotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiO1xuIik7Ci0gICAgfQotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19NQUNSTzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotCi1pbnQKLWxlZndNYWNyb1BpbkFudGVubmFNZXRhbExlbmd0aChkb3VibGUgICAgICAgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICpsYXllck5hbWUpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNNYWNyb1BpbikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3QW50ZW5uYTU0KQotICAgICAgICByZXR1cm4gTEVGV19NSVhfVkVSU0lPTl9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KSB7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICBBTlRFTk5BTUVUQUxMRU5HVEggJS4xMWcgIiwgdmFsdWUpOwotICAgICAgICBpZiAobGF5ZXJOYW1lKQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIkxBWUVSICVzICIsIGxheWVyTmFtZSk7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICI7XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgQU5URU5OQU1FVEFMTEVOR1RIICUuMTFnICIsIHZhbHVlKTsKLSAgICAgICAgaWYgKGxheWVyTmFtZSkKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJMQVlFUiAlcyAiLCBsYXllck5hbWUpOwotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiO1xuIik7Ci0gICAgfQotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19NQUNSTzsKLSAgICBsZWZ3QW50ZW5uYTUzID0gMTsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotCi1pbnQKLWxlZndNYWNyb1BpbkFudGVubmFQYXJ0aWFsTWV0YWxBcmVhKGRvdWJsZSAgICAgIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmxheWVyTmFtZSkKLXsKLSAgICBsZWZ3NTROdW0gPSBMRUZXX0FOVEVOTkFQQVJUSUFMTUVUQUxBUkVBOwotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzTWFjcm9QaW4pCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAodmVyc2lvbk51bSA8IDUuNCkKLSAgICAgICAgcmV0dXJuIExFRldfV1JPTkdfVkVSU0lPTjsKLSAgICBpZiAobGVmd0FudGVubmE1MykKLSAgICAgICAgcmV0dXJuIExFRldfTUlYX1ZFUlNJT05fREFUQTsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgQU5URU5OQVBBUlRJQUxNRVRBTEFSRUEgJS4xMWcgIiwgdmFsdWUpOwotICAgICAgICBpZiAobGF5ZXJOYW1lKQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIkxBWUVSICVzICIsIGxheWVyTmFtZSk7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICI7XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgQU5URU5OQVBBUlRJQUxNRVRBTEFSRUEgJS4xMWcgIiwgdmFsdWUpOwotICAgICAgICBpZiAobGF5ZXJOYW1lKQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIkxBWUVSICVzICIsIGxheWVyTmFtZSk7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICI7XG4iKTsKLSAgICB9Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3U3RhdGUgPSBMRUZXX01BQ1JPOwotICAgIGxlZndBbnRlbm5hNTQgPSAxOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi0KLWludAotbGVmd01hY3JvUGluQW50ZW5uYVBhcnRpYWxNZXRhbFNpZGVBcmVhKGRvdWJsZSAgICAgIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpsYXllck5hbWUpCi17Ci0gICAgbGVmdzU0TnVtID0gTEVGV19BTlRFTk5BUEFSVElBTE1FVEFMU0lERUFSRUE7Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNNYWNyb1BpbikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICh2ZXJzaW9uTnVtIDwgNS40KQotICAgICAgICByZXR1cm4gTEVGV19XUk9OR19WRVJTSU9OOwotICAgIGlmIChsZWZ3QW50ZW5uYTUzKQotICAgICAgICByZXR1cm4gTEVGV19NSVhfVkVSU0lPTl9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KSB7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLAotICAgICAgICAgICAgICAgICAoY2hhciopICIgICAgICBBTlRFTk5BUEFSVElBTE1FVEFMU0lERUFSRUEgJS4xMWcgIiwgdmFsdWUpOwotICAgICAgICBpZiAobGF5ZXJOYW1lKQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIkxBWUVSICVzICIsIGxheWVyTmFtZSk7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICI7XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgQU5URU5OQVBBUlRJQUxNRVRBTFNJREVBUkVBICUuMTFnICIsIHZhbHVlKTsKLSAgICAgICAgaWYgKGxheWVyTmFtZSkKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJMQVlFUiAlcyAiLCBsYXllck5hbWUpOwotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiO1xuIik7Ci0gICAgfQotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19NQUNSTzsKLSAgICBsZWZ3QW50ZW5uYTU0ID0gMTsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotCi1pbnQKLWxlZndNYWNyb1BpbkFudGVubmFQYXJ0aWFsQ3V0QXJlYShkb3VibGUgICAgICAgIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKmxheWVyTmFtZSkKLXsKLSAgICBsZWZ3NTROdW0gPSBMRUZXX0FOVEVOTkFQQVJUSUFMQ1VUQVJFQTsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc01hY3JvUGluKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKHZlcnNpb25OdW0gPCA1LjQpCi0gICAgICAgIHJldHVybiBMRUZXX1dST05HX1ZFUlNJT047Ci0gICAgaWYgKGxlZndBbnRlbm5hNTMpCi0gICAgICAgIHJldHVybiBMRUZXX01JWF9WRVJTSU9OX0RBVEE7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpIHsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIEFOVEVOTkFQQVJUSUFMQ1VUQVJFQSAlLjExZyAiLCB2YWx1ZSk7Ci0gICAgICAgIGlmIChsYXllck5hbWUpCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiTEFZRVIgJXMgIiwgbGF5ZXJOYW1lKTsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIjtcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBBTlRFTk5BUEFSVElBTENVVEFSRUEgJS4xMWcgIiwgdmFsdWUpOwotICAgICAgICBpZiAobGF5ZXJOYW1lKQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIkxBWUVSICVzICIsIGxheWVyTmFtZSk7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICI7XG4iKTsKLSAgICB9Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3U3RhdGUgPSBMRUZXX01BQ1JPOwotICAgIGxlZndBbnRlbm5hNTQgPSAxOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi0KLWludAotbGVmd01hY3JvUGluQW50ZW5uYURpZmZBcmVhKGRvdWJsZSAgICAgIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpsYXllck5hbWUpCi17Ci0gICAgbGVmdzU0TnVtID0gTEVGV19BTlRFTk5BRElGRkFSRUE7Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNNYWNyb1BpbikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICh2ZXJzaW9uTnVtIDwgNS40KQotICAgICAgICByZXR1cm4gTEVGV19XUk9OR19WRVJTSU9OOwotICAgIGlmIChsZWZ3QW50ZW5uYTUzKQotICAgICAgICByZXR1cm4gTEVGV19NSVhfVkVSU0lPTl9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KSB7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICBBTlRFTk5BRElGRkFSRUEgJS4xMWcgIiwgdmFsdWUpOwotICAgICAgICBpZiAobGF5ZXJOYW1lKQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIkxBWUVSICVzICIsIGxheWVyTmFtZSk7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICI7XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgQU5URU5OQURJRkZBUkVBICUuMTFnICIsIHZhbHVlKTsKLSAgICAgICAgaWYgKGxheWVyTmFtZSkKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJMQVlFUiAlcyAiLCBsYXllck5hbWUpOwotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiO1xuIik7Ci0gICAgfQotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19NQUNSTzsKLSAgICBsZWZ3QW50ZW5uYTU0ID0gMTsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotCi1pbnQKLWxlZndNYWNyb1BpbkFudGVubmFNb2RlbChjb25zdCBjaGFyICpveGlkZSkKLXsKLSAgICBsZWZ3NTROdW0gPSBMRUZXX0FOVEVOTkFHQVRFQVJFQTsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc01hY3JvUGluKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKHZlcnNpb25OdW0gPCA1LjQpCi0gICAgICAgIHJldHVybiBMRUZXX1dST05HX1ZFUlNJT047Ci0gICAgaWYgKGxlZndBbnRlbm5hNTMpCi0gICAgICAgIHJldHVybiBMRUZXX01JWF9WRVJTSU9OX0RBVEE7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpIHsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIEFOVEVOTkFNT0RFTCAlcyA7XG4iLCBveGlkZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgIEFOVEVOTkFNT0RFTCAlcyA7XG4iLCBveGlkZSk7Ci0gICAgfQotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N0YXRlID0gTEVGV19NQUNSTzsKLSAgICBsZWZ3QW50ZW5uYTU0ID0gMTsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotCi1pbnQKLWxlZndNYWNyb1BpbkFudGVubmFHYXRlQXJlYShkb3VibGUgICAgICB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqbGF5ZXJOYW1lKQotewotICAgIGxlZnc1NE51bSA9IExFRldfQU5URU5OQUdBVEVBUkVBOwotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzTWFjcm9QaW4pCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAodmVyc2lvbk51bSA8IDUuNCkKLSAgICAgICAgcmV0dXJuIExFRldfV1JPTkdfVkVSU0lPTjsKLSAgICBpZiAobGVmd0FudGVubmE1MykKLSAgICAgICAgcmV0dXJuIExFRldfTUlYX1ZFUlNJT05fREFUQTsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgQU5URU5OQUdBVEVBUkVBICUuMTFnICIsIHZhbHVlKTsKLSAgICAgICAgaWYgKGxheWVyTmFtZSkKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJMQVlFUiAlcyAiLCBsYXllck5hbWUpOwotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiO1xuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgIEFOVEVOTkFHQVRFQVJFQSAlLjExZyAiLCB2YWx1ZSk7Ci0gICAgICAgIGlmIChsYXllck5hbWUpCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiTEFZRVIgJXMgIiwgbGF5ZXJOYW1lKTsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIjtcbiIpOwotICAgIH0KLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTdGF0ZSA9IExFRldfTUFDUk87Ci0gICAgbGVmd0FudGVubmE1NCA9IDE7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLQotaW50Ci1sZWZ3TWFjcm9QaW5BbnRlbm5hTWF4QXJlYUNhcihkb3VibGUgICAgICAgIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqbGF5ZXJOYW1lKQotewotICAgIGxlZnc1NE51bSA9IExFRldfQU5URU5OQU1BWEFSRUFDQVI7Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNNYWNyb1BpbikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3QU1heEFyZWFDYXIpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOyAgLy8gQU5URU5OQU1BWEFSRUFDQVIgaGFzIGRlZmluZWQKLSAgICAvLyBtb3JlIHRoYW4gb25jZQotICAgIGlmICh2ZXJzaW9uTnVtIDwgNS40KQotICAgICAgICByZXR1cm4gTEVGV19XUk9OR19WRVJTSU9OOwotICAgIGlmIChsZWZ3QW50ZW5uYTUzKQotICAgICAgICByZXR1cm4gTEVGV19NSVhfVkVSU0lPTl9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KSB7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICBBTlRFTk5BTUFYQVJFQUNBUiAlLjExZyAiLCB2YWx1ZSk7Ci0gICAgICAgIGlmIChsYXllck5hbWUpCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiTEFZRVIgJXMgIiwgbGF5ZXJOYW1lKTsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIjtcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBBTlRFTk5BTUFYQVJFQUNBUiAlLjExZyAiLCB2YWx1ZSk7Ci0gICAgICAgIGlmIChsYXllck5hbWUpCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiTEFZRVIgJXMgIiwgbGF5ZXJOYW1lKTsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIjtcbiIpOwotICAgIH0KLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTdGF0ZSA9IExFRldfTUFDUk87Ci0gICAgbGVmd0FudGVubmE1NCA9IDE7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLQotaW50Ci1sZWZ3TWFjcm9QaW5BbnRlbm5hTWF4U2lkZUFyZWFDYXIoZG91YmxlICAgICAgICB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpsYXllck5hbWUpCi17Ci0gICAgbGVmdzU0TnVtID0gTEVGV19BTlRFTk5BTUFYU0lERUFSRUFDQVI7Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNNYWNyb1BpbikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3QU1heFNpZGVBcmVhQ2FyKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsgIC8vIEFOVEVOTkFNQVhTSURFQVJFQUNBUiBoYXMKLSAgICAvLyBkZWZpbmVkIG1vcmUgdGhhbiBvbmNlCi0gICAgaWYgKHZlcnNpb25OdW0gPCA1LjQpCi0gICAgICAgIHJldHVybiBMRUZXX1dST05HX1ZFUlNJT047Ci0gICAgaWYgKGxlZndBbnRlbm5hNTMpCi0gICAgICAgIHJldHVybiBMRUZXX01JWF9WRVJTSU9OX0RBVEE7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpIHsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIEFOVEVOTkFNQVhTSURFQVJFQUNBUiAlLjExZyAiLCB2YWx1ZSk7Ci0gICAgICAgIGlmIChsYXllck5hbWUpCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiTEFZRVIgJXMgIiwgbGF5ZXJOYW1lKTsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIjtcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBBTlRFTk5BTUFYU0lERUFSRUFDQVIgJS4xMWcgIiwgdmFsdWUpOwotICAgICAgICBpZiAobGF5ZXJOYW1lKQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIkxBWUVSICVzICIsIGxheWVyTmFtZSk7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICI7XG4iKTsKLSAgICB9Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3U3RhdGUgPSBMRUZXX01BQ1JPOwotICAgIGxlZndBbnRlbm5hNTQgPSAxOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi0KLWludAotbGVmd01hY3JvUGluQW50ZW5uYU1heEN1dENhcihkb3VibGUgICAgIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpsYXllck5hbWUpCi17Ci0gICAgbGVmdzU0TnVtID0gTEVGV19BTlRFTk5BTUFYQ1VUQ0FSOwotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzTWFjcm9QaW4pCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd0FNYXhDdXRDYXIpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOyAgLy8gQU5URU5OQU1BWENVVENBUiBoYXMKLSAgICAvLyBkZWZpbmVkIG1vcmUgdGhhbiBvbmNlCi0gICAgaWYgKHZlcnNpb25OdW0gPCA1LjQpCi0gICAgICAgIHJldHVybiBMRUZXX1dST05HX1ZFUlNJT047Ci0gICAgaWYgKGxlZndBbnRlbm5hNTMpCi0gICAgICAgIHJldHVybiBMRUZXX01JWF9WRVJTSU9OX0RBVEE7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpIHsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIEFOVEVOTkFNQVhDVVRDQVIgJS4xMWcgIiwgdmFsdWUpOwotICAgICAgICBpZiAobGF5ZXJOYW1lKQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIkxBWUVSICVzICIsIGxheWVyTmFtZSk7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICI7XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgQU5URU5OQU1BWENVVENBUiAlLjExZyAiLCB2YWx1ZSk7Ci0gICAgICAgIGlmIChsYXllck5hbWUpCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiTEFZRVIgJXMgIiwgbGF5ZXJOYW1lKTsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIjtcbiIpOwotICAgIH0KLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTdGF0ZSA9IExFRldfTUFDUk87Ci0gICAgbGVmd0FudGVubmE1NCA9IDE7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLQotaW50Ci1sZWZ3RW5kTWFjcm9QaW4oY29uc3QgY2hhciAqcGluTmFtZSkKLXsKLSAgICBpZiAoIWxlZndJc01hY3JvUGluKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFwaW5OYW1lIHx8IHBpbk5hbWUgPT0gMCB8fCAqcGluTmFtZSA9PSAwKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIEVORCAlc1xuXG4iLCBwaW5OYW1lKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBFTkQgJXNcblxuIiwgcGluTmFtZSk7Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3SXNNYWNyb1BpbiA9IDA7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLQotaW50Ci1sZWZ3U3RhcnRNYWNyb1BpblBvcnQoY29uc3QgY2hhciAqY2xhc3NUeXBlKQoteyAgICAvLyBvcHRpb25hbCAKLQotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzTWFjcm9QaW4pCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBpZiAoY2xhc3NUeXBlKSB7Ci0gICAgICAgICAgICBpZiAoc3RyY21wKGNsYXNzVHlwZSwgIk5PTkUiKSAmJiBzdHJjbXAoY2xhc3NUeXBlLCAiQ09SRSIpKQotICAgICAgICAgICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIFBPUlQgQ0xBU1MgJXMgO1xuIiwgY2xhc3NUeXBlKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgUE9SVCBcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChjbGFzc1R5cGUpIHsKLSAgICAgICAgICAgIGlmIChzdHJjbXAoY2xhc3NUeXBlLCAiTk9ORSIpICYmIHN0cmNtcChjbGFzc1R5cGUsICJDT1JFIikgJiYKLSAgICAgICAgICAgICAgICBzdHJjbXAoY2xhc3NUeXBlLCAiQlVNUCIpKQotICAgICAgICAgICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgIFBPUlQgQ0xBU1MgJXMgO1xuIiwgY2xhc3NUeXBlKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgUE9SVCBcbiIpOwotICAgIH0KLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndJc01hY3JvUGluUG9ydCA9IDE7Ci0gICAgbGVmd0lzTWFjcm9QaW5Qb3J0TGF5ZXIgPSAwOwotICAgIGxlZndTcGFjaW5nVmFsID0gMDsKLSAgICBsZWZ3V2lkdGhWYWwgPSAwOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi0KLWludAotbGVmd01hY3JvUGluUG9ydExheWVyKGNvbnN0IGNoYXIgICAgKmxheWVyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICAgIHNwYWNpbmcpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNNYWNyb1BpblBvcnQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxheWVyTmFtZSB8fCBsYXllck5hbWUgPT0gMCB8fCAqbGF5ZXJOYW1lID09IDApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChsZWZ3V2lkdGhWYWwpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KSB7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICAgICBMQVlFUiAlcyAiLCBsYXllck5hbWUpOwotICAgICAgICBpZiAoc3BhY2luZykKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJTUEFDSU5HICUuMTFnICIsIHNwYWNpbmcpOwotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiO1xuICIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICAgICBMQVlFUiAlcyAiLCBsYXllck5hbWUpOwotICAgICAgICBpZiAoc3BhY2luZykKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJTUEFDSU5HICUuMTFnICIsIHNwYWNpbmcpOwotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiO1xuICIpOwotICAgIH0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3SXNNYWNyb1BpblBvcnRMYXllciA9IDE7Ci0gICAgbGVmd1NwYWNpbmdWYWwgPSAxOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi0KLWludAotbGVmd01hY3JvUGluUG9ydERlc2lnblJ1bGVXaWR0aChjb25zdCBjaGFyICAqbGF5ZXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICB3aWR0aCkKLXsKLSAgICBsZWZ3NTROdW0gPSBMRUZXX0RFU0lHTlJVTEVXSURUSDsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc01hY3JvUGluUG9ydCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGF5ZXJOYW1lIHx8IGxheWVyTmFtZSA9PSAwIHx8ICpsYXllck5hbWUgPT0gMCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgaWYgKGxlZndTcGFjaW5nVmFsKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAodmVyc2lvbk51bSA8IDUuNCkKLSAgICAgICAgcmV0dXJuIExFRldfV1JPTkdfVkVSU0lPTjsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgICAgTEFZRVIgJXMgIiwgbGF5ZXJOYW1lKTsKLSAgICAgICAgaWYgKHdpZHRoKQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIkRFU0lHTlJVTEVXSURUSCAlLjExZyAiLCB3aWR0aCk7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICI7XG4gIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgICAgIExBWUVSICVzICIsIGxheWVyTmFtZSk7Ci0gICAgICAgIGlmICh3aWR0aCkKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJERVNJR05SVUxFV0lEVEggJS4xMWcgIiwgd2lkdGgpOwotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiO1xuICIpOwotICAgIH0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3SXNNYWNyb1BpblBvcnRMYXllciA9IDE7Ci0gICAgbGVmd1dpZHRoVmFsID0gMTsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotCi1pbnQKLWxlZndNYWNyb1BpblBvcnRMYXllcldpZHRoKGRvdWJsZSB3aWR0aCkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc01hY3JvUGluUG9ydExheWVyKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICAgICBXSURUSCAlLjExZyA7XG4iLCB3aWR0aCk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgICAgV0lEVEggJS4xMWcgO1xuIiwgd2lkdGgpOwotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndJc01hY3JvUGluUG9ydExheWVyID0gMTsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotCi1pbnQKLWxlZndNYWNyb1BpblBvcnRMYXllclBhdGgoaW50ICAgICAgIG51bV9wYXRocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICp4bCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICp5bCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG51bVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBudW1ZLCAgICAgICAgICAgLy8gb3B0aW9uYWwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICBzcGFjZVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICBzcGFjZVksIC8vIG9wdGlvbmFsIAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbWFzaykKLXsgICAgICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwgCi0gICAgaW50IGksIG51bUl0ZW07Ci0KLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc01hY3JvUGluUG9ydExheWVyKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKG1hc2sgJiYgdmVyc2lvbk51bSA8IDUuOCkgewotICAgICAgICByZXR1cm4gTEVGV19XUk9OR19WRVJTSU9OOwotICAgIH0KLQotICAgIGlmICghbGVmd1ZhbGlkYXRlTWFza051bWJlcihtYXNrKSkgewotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICB9Ci0KLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBpZiAobnVtWCB8fCBudW1ZIHx8IHNwYWNlWCB8fCBzcGFjZVkpIHsKLSAgICAgICAgICAgIGlmIChtYXNrKSB7Ci0gICAgICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgICAgIFBBVEggTUFTSyAlZCBJVEVSQVRFICIsIG1hc2spOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgICAgUEFUSCBJVEVSQVRFICIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9wYXRoczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiUuMTFnICUuMTFnXG4iLCB4bFtpXSwgeWxbaV0pOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgIiAgICAgICAgICAgJS4xMWcgJS4xMWdcbiIsIHhsW2ldLCB5bFtpXSk7Ci0gICAgICAgICAgICAgICAgbGVmd0xpbmVzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKQotICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgRE8gJWQgQlkgJWQgU1RFUCAlLjExZyAlLjExZyAiLCBudW1YLCBudW1ZLCBzcGFjZVgsIHNwYWNlWSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobWFzaykgewotICAgICAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICAgICBQQVRIIE1BU0sgJWQgIiwgbWFzayk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICAgICBQQVRIICIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbnVtSXRlbSA9IDA7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BhdGhzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobnVtSXRlbSA+IDUpIHsKLSAgICAgICAgICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIlxuIik7Ci0gICAgICAgICAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopICIgICAgICAgICAgICUuMTFnICUuMTFnICIsIHhsW2ldLCB5bFtpXSk7Ci0gICAgICAgICAgICAgICAgICAgIG51bUl0ZW0gPSAwOwotICAgICAgICAgICAgICAgICAgICBsZWZ3TGluZXMrKzsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiUuMTFnICUuMTFnICIsIHhsW2ldLCB5bFtpXSk7Ci0gICAgICAgICAgICAgICAgbnVtSXRlbSsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICI7XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAobnVtWCB8fCBudW1ZIHx8IHNwYWNlWCB8fCBzcGFjZVkpIHsKLSAgICAgICAgICAgIGlmIChtYXNrKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgICAgIFBBVEggTUFTSyAlZCBJVEVSQVRFICIsIG1hc2spOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgICAgUEFUSCBJVEVSQVRFICIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9wYXRoczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiUuMTFnICUuMTFnXG4iLCB4bFtpXSwgeWxbaV0pOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgICAgICAgJS4xMWcgJS4xMWdcbiIsIHhsW2ldLCB5bFtpXSk7Ci0gICAgICAgICAgICAgICAgbGVmd0xpbmVzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLAotICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICBETyAlZCBCWSAlZCBTVEVQICUuMTFnICUuMTFnICIsIG51bVgsIG51bVksIHNwYWNlWCwgc3BhY2VZKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtYXNrKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgICAgIFBBVEggTUFTSyAlZCAiLCBtYXNrKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgICAgIFBBVEggIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBudW1JdGVtID0gMDsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGF0aHM7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChudW1JdGVtID4gNSkgewotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgICAgICAgJS4xMWcgJS4xMWcgIiwgeGxbaV0sIHlsW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgbnVtSXRlbSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGxlZndMaW5lcysrOwotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiJS4xMWcgJS4xMWcgIiwgeGxbaV0sIHlsW2ldKTsKLSAgICAgICAgICAgICAgICBudW1JdGVtKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIjtcbiIpOwotICAgIH0KLQotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi0KLWludAotbGVmd01hY3JvUGluUG9ydExheWVyUmVjdChkb3VibGUgICAgeGwxLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgeWwxLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgeGwyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgeWwyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbnVtWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG51bVksICAgICAgICAgICAgIC8vIG9wdGlvbmFsIAotICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgc3BhY2VYLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgc3BhY2VZLCAgIC8vIG9wdGlvbmFsIAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbWFzaykKLXsgICAgICAgICAgICAgICAgICAgICAvLyBvcHRpb25hbCAKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc01hY3JvUGluUG9ydExheWVyKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKG1hc2sgJiYgdmVyc2lvbk51bSA8IDUuOCkgewotICAgICAgICByZXR1cm4gTEVGV19XUk9OR19WRVJTSU9OOwotICAgIH0KLQotICAgIGlmICghbGVmd1ZhbGlkYXRlTWFza051bWJlcihtYXNrKSkgewotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICB9Ci0KLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBpZiAobnVtWCB8fCBudW1ZIHx8IHNwYWNlWCB8fCBzcGFjZVkpIHsKLSAgICAgICAgICAgIGlmIChtYXNrKSB7Ci0gICAgICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSAiICAgICAgICAgICAgUkVDVCBNQVNLICVkIElURVJBVEUgJS4xMWcgJS4xMWcgJS4xMWcgJS4xMWcgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrLCB4bDEsIHlsMSwgeGwyLCB5bDIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopICIgICAgICAgICAgICBSRUNUIElURVJBVEUgJS4xMWcgJS4xMWcgJS4xMWcgJS4xMWcgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB4bDEsIHlsMSwgeGwyLCB5bDIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAoY2hhciopICJETyAlZCBCWSAlZCBTVEVQICUuMTFnICUuMTFnICIsIG51bVgsIG51bVksIHNwYWNlWCwKLSAgICAgICAgICAgICAgICAgICAgIHNwYWNlWSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobWFzaykgewotICAgICAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIFJFQ1QgTUFTSyAlZCAlLjExZyAlLjExZyAlLjExZyAlLjExZyAiLCBtYXNrLCB4bDEsIHlsMSwgeGwyLCB5bDIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKQotICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICBSRUNUICUuMTFnICUuMTFnICUuMTFnICUuMTFnICIsIHhsMSwgeWwxLCB4bDIsIHlsMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIjtcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChudW1YIHx8IG51bVkgfHwgc3BhY2VYIHx8IHNwYWNlWSkgewotICAgICAgICAgICAgaWYgKG1hc2spIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgICAgICAgUkVDVCBNQVNLICVkIElURVJBVEUgJS4xMWcgJS4xMWcgJS4xMWcgJS4xMWcgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hc2ssIHhsMSwgeWwxLCB4bDIsIHlsMik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICAgICAgICBSRUNUIElURVJBVEUgJS4xMWcgJS4xMWcgJS4xMWcgJS4xMWcgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhsMSwgeWwxLCB4bDIsIHlsMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiRE8gJWQgQlkgJWQgU1RFUCAlLjExZyAlLjExZyAiLCBudW1YLCBudW1ZLCBzcGFjZVgsCi0gICAgICAgICAgICAgICAgICAgIHNwYWNlWSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobWFzaykgewotICAgICAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgUkVDVCBNQVNLICVkICUuMTFnICUuMTFnICUuMTFnICUuMTFnICIsIG1hc2ssIHhsMSwgeWwxLCB4bDIsIHlsMik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgUkVDVCAlLjExZyAlLjExZyAlLjExZyAlLjExZyAiLCB4bDEsIHlsMSwgeGwyLCB5bDIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICI7XG4iKTsKLSAgICB9Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotCi1pbnQKLWxlZndNYWNyb1BpblBvcnRMYXllclBvbHlnb24oaW50ICAgIG51bV9wb2x5cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICp4bCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICp5bCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIG51bVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBudW1ZLCAgICAgICAgICAgICAvLyBvcHRpb25hbCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHNwYWNlWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHNwYWNlWSwgICAvLyBvcHRpb25hbCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIG1hc2spCi17ICAgICAgICAgICAgICAgICAgICAvLyBvcHRpb25hbCAKLSAgICBpbnQgaTsKLQotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzTWFjcm9QaW5Qb3J0TGF5ZXIpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobnVtX3BvbHlzIDwgNCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7ICAgLy8gYXQgbGVhc3QgNCBwb2ludHMKLSAgICBpZiAobWFzayAmJiB2ZXJzaW9uTnVtIDwgNS44KSB7Ci0gICAgICAgIHJldHVybiBMRUZXX1dST05HX1ZFUlNJT047Ci0gICAgfQotCi0gICAgaWYgKCFsZWZ3VmFsaWRhdGVNYXNrTnVtYmVyKG1hc2spKSB7Ci0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIH0KLQotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KSB7Ci0gICAgICAgIGlmIChudW1YIHx8IG51bVkgfHwgc3BhY2VYIHx8IHNwYWNlWSkgewotICAgICAgICAgICAgaWYgKG1hc2spIHsKLSAgICAgICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgICAgICAgUE9MWUdPTiBNQVNLICVkIElURVJBVEUgIiwgbWFzayk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICAgICAgICBQT0xZR09OIElURVJBVEUgIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BvbHlzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKQotICAgICAgICAgICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiJS4xMWcgJS4xMWdcbiIsICp4bCsrLCAqeWwrKyk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSAiICAgICAgICAgICAgICAgJS4xMWcgJS4xMWdcbiIsICp4bCsrLCAqeWwrKyk7Ci0gICAgICAgICAgICAgICAgbGVmd0xpbmVzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKQotICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgIERPICVkIEJZICVkIFNURVAgJS4xMWcgJS4xMWcgO1xuIiwKLSAgICAgICAgICAgICAgICAgICAgIG51bVgsIG51bVksIHNwYWNlWCwgc3BhY2VZKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtYXNrKSB7Ci0gICAgICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgICAgICAgIFBPTFlHT04gTUFTSyAlZCAiLCBtYXNrKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgICAgICAgIFBPTFlHT04gIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BvbHlzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKQotICAgICAgICAgICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiJS4xMWcgJS4xMWciLCAqeGwrKywgKnlsKyspOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgIlxuICAgICAgICAgICAgICAgJS4xMWcgJS4xMWciLCAqeGwrKywgKnlsKyspOwotICAgICAgICAgICAgICAgIGxlZndMaW5lcysrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiA7XG4iKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChudW1YIHx8IG51bVkgfHwgc3BhY2VYIHx8IHNwYWNlWSkgewotICAgICAgICAgICAgaWYgKG1hc2spIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgICAgICAgUE9MWUdPTiBNQVNLICVkIElURVJBVEUgIiwgbWFzayk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICAgICAgICBQT0xZR09OIElURVJBVEUgIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BvbHlzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKQotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiJS4xMWcgJS4xMWdcbiIsICp4bCsrLCAqeWwrKyk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgICAgICAgICAgJS4xMWcgJS4xMWdcbiIsICp4bCsrLCAqeWwrKyk7Ci0gICAgICAgICAgICAgICAgbGVmd0xpbmVzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLAotICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgRE8gJWQgQlkgJWQgU1RFUCAlLjExZyAlLjExZyA7XG4iLAotICAgICAgICAgICAgICAgICAgICBudW1YLCBudW1ZLCBzcGFjZVgsIHNwYWNlWSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobWFzaykgewotICAgICAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICAgICAgICBQT0xZR09OIE1BU0sgJWQgIiwgbWFzayk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICAgICAgICBQT0xZR09OICIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9wb2x5czsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiUuMTFnICUuMTFnIiwgKnhsKyssICp5bCsrKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJcbiAgICAgICAgICAgICAgICUuMTFnICUuMTFnIiwgKnhsKyssICp5bCsrKTsKLSAgICAgICAgICAgICAgICBsZWZ3TGluZXMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgO1xuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotCi1pbnQKLWxlZndNYWNyb1BpblBvcnRWaWEoZG91YmxlICAgICAgeGwsCi0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgIHlsLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqdmlhTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbnVtWCwKLSAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbnVtWSwgICAgICAgICAgICAgLy8gb3B0aW9uYWwgCi0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgIHNwYWNlWCwKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgc3BhY2VZLCAgIC8vIG9wdGlvbmFsIAotICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBtYXNrKQoteyAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsIAotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzTWFjcm9QaW5Qb3J0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCF2aWFOYW1lIHx8IHZpYU5hbWUgPT0gMCB8fCAqdmlhTmFtZSA9PSAwKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAobWFzayAmJiB2ZXJzaW9uTnVtIDwgNS44KSB7Ci0gICAgICAgIHJldHVybiBMRUZXX1dST05HX1ZFUlNJT047Ci0gICAgfQotCi0gICAgaWYgKCFsZWZ3VmFsaWRhdGVNYXNrTnVtYmVyKG1hc2spKSB7Ci0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIH0KLQotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KSB7Ci0gICAgICAgIGlmIChudW1YIHx8IG51bVkgfHwgc3BhY2VYIHx8IHNwYWNlWSkgewotICAgICAgICAgICAgaWYgKG1hc2spIHsKLSAgICAgICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopICIgICAgICAgICAgICBWSUEgSVRFUkFURSBNQVNLICVkICUuMTFnICUuMTFnICVzICIsIG1hc2ssIHhsLCB5bCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB2aWFOYW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSAiICAgICAgICAgICAgVklBIElURVJBVEUgJS4xMWcgJS4xMWcgJXMgIiwgeGwsIHlsLAotICAgICAgICAgICAgICAgICAgICAgICAgIHZpYU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAoY2hhciopICJETyAlZCBCWSAlZCBTVEVQICUuMTFnICUuMTFnICIsIG51bVgsIG51bVksIHNwYWNlWCwKLSAgICAgICAgICAgICAgICAgICAgIHNwYWNlWSk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgICAgICAgIFZJQSAlLjExZyAlLjExZyAlcyAiLCB4bCwgeWwsIHZpYU5hbWUpOwotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiO1xuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG51bVggfHwgbnVtWSB8fCBzcGFjZVggfHwgc3BhY2VZKSB7Ci0gICAgICAgICAgICBpZiAobWFzaykgewotICAgICAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgVklBIElURVJBVEUgTUFTSyAlZCAlLjExZyAlLjExZyAlcyAiLCBtYXNrLCB4bCwgeWwsIHZpYU5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIFZJQSBJVEVSQVRFICUuMTFnICUuMTFnICVzICIsIHhsLCB5bCwgdmlhTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiRE8gJWQgQlkgJWQgU1RFUCAlLjExZyAlLjExZyAiLCBudW1YLCBudW1ZLCBzcGFjZVgsCi0gICAgICAgICAgICAgICAgICAgIHNwYWNlWSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobWFzaykgewotICAgICAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICAgICAgICBWSUEgTUFTSyAlZCAlLjExZyAlLjExZyAlcyAiLCBtYXNrLCB4bCwgeWwsIHZpYU5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgICAgICAgVklBICUuMTFnICUuMTFnICVzICIsIHhsLCB5bCwgdmlhTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIjtcbiIpOwotICAgIH0KLQotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi0KLWludAotbGVmd0VuZE1hY3JvUGluUG9ydCgpCi17Ci0gICAgaWYgKCFsZWZ3SXNNYWNyb1BpblBvcnQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIEVORFxuIik7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgRU5EXG4iKTsKLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndJc01hY3JvUGluUG9ydCA9IDA7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLQotaW50Ci1sZWZ3U3RhcnRNYWNyb09icygpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfTUFDUk9fU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfTUFDUk8pCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd0lzTWFjcm9PYnMpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgIE9CU1xuIik7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgT0JTXG4iKTsKLQotICAgIGxlZndJc01hY3JvT2JzID0gMTsKLSAgICBsZWZ3U3BhY2luZ1ZhbCA9IDA7Ci0gICAgbGVmd1dpZHRoVmFsID0gMDsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotCi1pbnQKLWxlZndNYWNyb09ic0xheWVyKGNvbnN0IGNoYXIgICAgKmxheWVyTmFtZSwKLSAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICAgc3BhY2luZykKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc01hY3JvT2JzKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsYXllck5hbWUgfHwgbGF5ZXJOYW1lID09IDAgfHwgKmxheWVyTmFtZSA9PSAwKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAobGVmd1dpZHRoVmFsKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgTEFZRVIgJXMgIiwgbGF5ZXJOYW1lKTsKLSAgICAgICAgaWYgKHNwYWNpbmcpCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiU1BBQ0lORyAlLjExZyAiLCBzcGFjaW5nKTsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIjtcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBMQVlFUiAlcyAiLCBsYXllck5hbWUpOwotICAgICAgICBpZiAoc3BhY2luZykKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJTUEFDSU5HICUuMTFnICIsIHNwYWNpbmcpOwotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiO1xuIik7Ci0gICAgfQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndJc01hY3JvT2JzTGF5ZXIgPSAxOwotICAgIGxlZndTcGFjaW5nVmFsID0gMTsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotCi1pbnQKLWxlZndNYWNyb09ic0Rlc2lnblJ1bGVXaWR0aChjb25zdCBjaGFyICAqbGF5ZXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgIHdpZHRoKQotewotICAgIGxlZnc1NE51bSA9IExFRldfREVTSUdOUlVMRVdJRFRIOwotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzTWFjcm9PYnMpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxheWVyTmFtZSB8fCBsYXllck5hbWUgPT0gMCB8fCAqbGF5ZXJOYW1lID09IDApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChsZWZ3U3BhY2luZ1ZhbCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgaWYgKHZlcnNpb25OdW0gPCA1LjQpCi0gICAgICAgIHJldHVybiBMRUZXX1dST05HX1ZFUlNJT047Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpIHsKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIExBWUVSICVzICIsIGxheWVyTmFtZSk7Ci0gICAgICAgIGlmICh3aWR0aCkKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJERVNJR05SVUxFV0lEVEggJS4xMWcgIiwgd2lkdGgpOwotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiO1xuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgIExBWUVSICVzICIsIGxheWVyTmFtZSk7Ci0gICAgICAgIGlmICh3aWR0aCkKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJERVNJR05SVUxFV0lEVEggJS4xMWcgIiwgd2lkdGgpOwotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiO1xuIik7Ci0gICAgfQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndJc01hY3JvT2JzTGF5ZXIgPSAxOwotICAgIGxlZndXaWR0aFZhbCA9IDE7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLQotaW50Ci1sZWZ3TWFjcm9FeGNlcHRQR05ldChjb25zdCBjaGFyICpsYXllck5hbWUpCi17Ci0gICAgbGVmdzU0TnVtID0gTEVGV19ERVNJR05SVUxFV0lEVEg7Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNNYWNyb09icykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGF5ZXJOYW1lIHx8IGxheWVyTmFtZSA9PSAwIHx8ICpsYXllck5hbWUgPT0gMCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgaWYgKGxlZndTcGFjaW5nVmFsKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAodmVyc2lvbk51bSA8IDUuNCkKLSAgICAgICAgcmV0dXJuIExFRldfV1JPTkdfVkVSU0lPTjsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIExBWUVSICVzIEVYQ0VQVFBHTkVUIDtcbiIsIGxheWVyTmFtZSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgTEFZRVIgJXMgRVhDRVBUUEdORVQgO1xuIiwgbGF5ZXJOYW1lKTsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3SXNNYWNyb09ic0xheWVyID0gMTsKLSAgICBsZWZ3V2lkdGhWYWwgPSAxOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi0KLWludAotbGVmd01hY3JvT2JzTGF5ZXJXaWR0aChkb3VibGUgd2lkdGgpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNNYWNyb09ic0xheWVyKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICBXSURUSCAlLjExZyA7XG4iLCB3aWR0aCk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgV0lEVEggJS4xMWcgO1xuIiwgd2lkdGgpOwotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndJc01hY3JvT2JzTGF5ZXIgPSAxOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi0KLWludAotbGVmd01hY3JvT2JzTGF5ZXJQYXRoKGludCAgICAgICBudW1fcGF0aHMsCi0gICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICp4bCwKLSAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgKnlsLAotICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBudW1YLAotICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBudW1ZLCAgICAgICAgICAgICAvLyBvcHRpb25hbCAKLSAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgc3BhY2VYLAotICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICBzcGFjZVksICAgLy8gb3B0aW9uYWwgCi0gICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG1hc2spCi17ICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsIAotICAgIGludCBpLCBudW1JdGVtOwotCi0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNNYWNyb09ic0xheWVyKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKG1hc2sgJiYgdmVyc2lvbk51bSA8IDUuOCkgewotICAgICAgICByZXR1cm4gTEVGV19XUk9OR19WRVJTSU9OOwotICAgIH0KLQotICAgIGlmICghbGVmd1ZhbGlkYXRlTWFza051bWJlcihtYXNrKSkgewotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICB9Ci0KLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBpZiAobnVtWCB8fCBudW1ZIHx8IHNwYWNlWCB8fCBzcGFjZVkpIHsKLSAgICAgICAgICAgIGlmIChtYXNrKSB7Ci0gICAgICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgICAgIFBBVEggTUFTSyAlZCBJVEVSQVRFICIsIG1hc2spOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgICAgUEFUSCBJVEVSQVRFICIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9wYXRoczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiUuMTFnICUuMTFnXG4iLCAqeGwrKywgKnlsKyspOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgIiAgICAgICAgICAgICUuMTFnICUuMTFnXG4iLCAqeGwrKywgKnlsKyspOwotICAgICAgICAgICAgICAgIGxlZndMaW5lcysrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgICAgICAgRE8gJWQgQlkgJWQgU1RFUCAlLjExZyAlLjExZyAiLAotICAgICAgICAgICAgICAgICAgICAgbnVtWCwgbnVtWSwgc3BhY2VYLCBzcGFjZVkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1hc2spIHsKLSAgICAgICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgICAgUEFUSCBNQVNLICVkICIsIG1hc2spOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgICAgUEFUSCAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG51bUl0ZW0gPSAwOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9wYXRoczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG51bUl0ZW0gPiA1KSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJcbiIpOwotICAgICAgICAgICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgICAgJS4xMWcgJS4xMWcgIiwgeGxbaV0sIHlsW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgbnVtSXRlbSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGxlZndMaW5lcysrOwotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiJS4xMWcgJS4xMWcgIiwgeGxbaV0sIHlsW2ldKTsKLSAgICAgICAgICAgICAgICBudW1JdGVtKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIjtcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChudW1YIHx8IG51bVkgfHwgc3BhY2VYIHx8IHNwYWNlWSkgewotICAgICAgICAgICAgaWYgKG1hc2spIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgICAgUEFUSCBNQVNLICVkIElURVJBVEUgIiwgbWFzayk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICAgICBQQVRIIElURVJBVEUgIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BhdGhzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKQotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiJS4xMWcgJS4xMWdcbiIsICp4bCsrLCAqeWwrKyk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgICAgICAgJS4xMWcgJS4xMWdcbiIsICp4bCsrLCAqeWwrKyk7Ci0gICAgICAgICAgICAgICAgbGVmd0xpbmVzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgICAgICBETyAlZCBCWSAlZCBTVEVQICUuMTFnICUuMTFnICIsCi0gICAgICAgICAgICAgICAgICAgIG51bVgsIG51bVksIHNwYWNlWCwgc3BhY2VZKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtYXNrKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgICAgIFBBVEggTUFTSyAlZCAiLCBtYXNrKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgICAgIFBBVEggIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBudW1JdGVtID0gMDsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGF0aHM7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChudW1JdGVtID4gNSkgewotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgICAgICUuMTFnICUuMTFnICIsIHhsW2ldLCB5bFtpXSk7Ci0gICAgICAgICAgICAgICAgICAgIG51bUl0ZW0gPSAwOwotICAgICAgICAgICAgICAgICAgICBsZWZ3TGluZXMrKzsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiUuMTFnICUuMTFnICIsIHhsW2ldLCB5bFtpXSk7Ci0gICAgICAgICAgICAgICAgbnVtSXRlbSsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICI7XG4iKTsKLSAgICB9Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotCi1pbnQKLWxlZndNYWNyb09ic0xheWVyUmVjdChkb3VibGUgICAgeGwxLAotICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICB5bDEsCi0gICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgIHhsMiwKLSAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgeWwyLAotICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBudW1YLAotICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBudW1ZLCAgICAgICAgICAgICAvLyBvcHRpb25hbCAKLSAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgc3BhY2VYLAotICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICBzcGFjZVksICAgLy8gb3B0aW9uYWwgCi0gICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG1hc2spCi17ICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwgCi0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNNYWNyb09ic0xheWVyKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKG1hc2sgJiYgdmVyc2lvbk51bSA8IDUuOCkgewotICAgICAgICByZXR1cm4gTEVGV19XUk9OR19WRVJTSU9OOwotICAgIH0KLQotICAgIGlmICghbGVmd1ZhbGlkYXRlTWFza051bWJlcihtYXNrKSkgewotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICB9Ci0KLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkgewotICAgICAgICBpZiAobnVtWCB8fCBudW1ZIHx8IHNwYWNlWCB8fCBzcGFjZVkpIHsKLSAgICAgICAgICAgIGlmIChtYXNrKSB7Ci0gICAgICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSAiICAgICAgICAgUkVDVCBNQVNLICVkIElURVJBVEUgJS4xMWcgJS4xMWcgJS4xMWcgJS4xMWcgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrLCB4bDEsIHlsMSwgeGwyLCB5bDIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopICIgICAgICAgICBSRUNUIElURVJBVEUgJS4xMWcgJS4xMWcgJS4xMWcgJS4xMWcgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB4bDEsIHlsMSwgeGwyLCB5bDIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIkRPICVkIEJZICVkIFNURVAgJS4xMWcgJS4xMWcgIiwKLSAgICAgICAgICAgICAgICAgICAgIG51bVgsIG51bVksIHNwYWNlWCwgc3BhY2VZKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtYXNrKSB7Ci0gICAgICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgICAgIFJFQ1QgTUFTSyAlZCAlLjExZyAlLjExZyAlLjExZyAlLjExZyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2ssIHhsMSwgeWwxLCB4bDIsIHlsMik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICAgICBSRUNUICUuMTFnICUuMTFnICUuMTFnICUuMTFnICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgeGwxLCB5bDEsIHhsMiwgeWwyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiO1xuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG51bVggfHwgbnVtWSB8fCBzcGFjZVggfHwgc3BhY2VZKSB7Ci0gICAgICAgICAgICBpZiAobWFzaykgewotICAgICAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICAgICBSRUNUIE1BU0sgJWQgSVRFUkFURSAlLjExZyAlLjExZyAlLjExZyAlLjExZyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgbWFzaywgeGwxLCB5bDEsIHhsMiwgeWwyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgICAgIFJFQ1QgSVRFUkFURSAlLjExZyAlLjExZyAlLjExZyAlLjExZyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgeGwxLCB5bDEsIHhsMiwgeWwyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICJETyAlZCBCWSAlZCBTVEVQICUuMTFnICUuMTFnICIsIG51bVgsIG51bVksIHNwYWNlWCwKLSAgICAgICAgICAgICAgICAgICAgc3BhY2VZKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtYXNrKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgICAgIFJFQ1QgTUFTSyAlZCAlLjExZyAlLjExZyAlLjExZyAlLjExZyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgbWFzaywgeGwxLCB5bDEsIHhsMiwgeWwyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgICAgIFJFQ1QgJS4xMWcgJS4xMWcgJS4xMWcgJS4xMWcgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhsMSwgeWwxLCB4bDIsIHlsMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIjtcbiIpOwotICAgIH0KLQotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi0KLWludAotbGVmd01hY3JvT2JzTGF5ZXJQb2x5Z29uKGludCAgICBudW1fcG9seXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICp4bCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgKnlsLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBudW1YLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBudW1ZLCAgICAgICAgICAgICAvLyBvcHRpb25hbCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgc3BhY2VYLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBzcGFjZVksICAgLy8gb3B0aW9uYWwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIG1hc2spCi17ICAgICAgICAgICAgICAgICAgICAvLyBvcHRpb25hbCAKLSAgICBpbnQgaTsKLQotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzTWFjcm9PYnNMYXllcikKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChudW1fcG9seXMgPCA0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsgICAvLyBhdCBsZWFzdCA0IHBvaW50cwotICAgIGlmIChtYXNrICYmIHZlcnNpb25OdW0gPCA1LjgpIHsKLSAgICAgICAgcmV0dXJuIExFRldfV1JPTkdfVkVSU0lPTjsKLSAgICB9Ci0KLSAgICBpZiAoIWxlZndWYWxpZGF0ZU1hc2tOdW1iZXIobWFzaykpIHsKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgfQotCi0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpIHsKLSAgICAgICAgaWYgKG51bVggfHwgbnVtWSB8fCBzcGFjZVggfHwgc3BhY2VZKSB7Ci0gICAgICAgICAgICBpZiAobWFzaykgewotICAgICAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICAgICBQT0xZR09OIE1BU0sgJWQgSVRFUkFURSAiLCBtYXNrKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgICAgIFBPTFlHT04gSVRFUkFURSAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcG9seXM7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChpID09IDApCi0gICAgICAgICAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIlLjExZyAlLjExZ1xuIiwgKnhsKyssICp5bCsrKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICAgICAgICUuMTFnICUuMTFnXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqeGwrKywgKnlsKyspOwotICAgICAgICAgICAgICAgIGxlZndMaW5lcysrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgICAgICAgRE8gJWQgQlkgJWQgU1RFUCAlLjExZyAlLjExZyA7IiwKLSAgICAgICAgICAgICAgICAgICAgIG51bVgsIG51bVksIHNwYWNlWCwgc3BhY2VZKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtYXNrKSB7Ci0gICAgICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgICAgIFBPTFlHT04gTUFTSyAlZCAiLCBtYXNrKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgICAgIFBPTFlHT04gIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BvbHlzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKQotICAgICAgICAgICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiJS4xMWcgJS4xMWciLCAqeGwrKywgKnlsKyspOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgIlxuICAgICAgICAgICAlLjExZyAlLjExZyIsICp4bCsrLCAqeWwrKyk7Ci0gICAgICAgICAgICAgICAgbGVmd0xpbmVzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiIDtcbiIpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG51bVggfHwgbnVtWSB8fCBzcGFjZVggfHwgc3BhY2VZKSB7Ci0gICAgICAgICAgICBpZiAobWFzaykgewotICAgICAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICAgICBQT0xZR09OIE1BU0sgJWQgSVRFUkFURSAiLCBtYXNrKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgICAgIFBPTFlHT04gSVRFUkFURSAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcG9seXM7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChpID09IDApCi0gICAgICAgICAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIlLjExZyAlLjExZ1xuIiwgKnhsKyssICp5bCsrKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICAgICAgICUuMTFnICUuMTFnXG4iLCAqeGwrKywgKnlsKyspOwotICAgICAgICAgICAgICAgIGxlZndMaW5lcysrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgICAgICAgRE8gJWQgQlkgJWQgU1RFUCAlLjExZyAlLjExZyA7IiwKLSAgICAgICAgICAgICAgICAgICAgbnVtWCwgbnVtWSwgc3BhY2VYLCBzcGFjZVkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1hc2spIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgICAgUE9MWUdPTiBNQVNLICVkICIsIG1hc2spOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgICAgUE9MWUdPTiAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcG9seXM7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChpID09IDApCi0gICAgICAgICAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIlLjExZyAlLjExZyIsICp4bCsrLCAqeWwrKyk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiXG4gICAgICAgICAgICUuMTFnICUuMTFnIiwgKnhsKyssICp5bCsrKTsKLSAgICAgICAgICAgICAgICBsZWZ3TGluZXMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgO1xuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotCi1pbnQKLWxlZndNYWNyb09ic1ZpYShkb3VibGUgICAgICB4bCwKLSAgICAgICAgICAgICAgICBkb3VibGUgICAgICB5bCwKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqdmlhTmFtZSwKLSAgICAgICAgICAgICAgICBpbnQgICAgICAgICBudW1YLAotICAgICAgICAgICAgICAgIGludCAgICAgICAgIG51bVksICAgICAgICAgICAgIC8vIG9wdGlvbmFsIAotICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgIHNwYWNlWCwKLSAgICAgICAgICAgICAgICBkb3VibGUgICAgICBzcGFjZVksICAgLy8gb3B0aW9uYWwgCi0gICAgICAgICAgICAgICAgaW50ICAgICAgICAgbWFzaykKLXsgICAgICAgICAgICAgICAgICAgICAvLyBvcHRpb25hbCAKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc01hY3JvT2JzKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCF2aWFOYW1lIHx8IHZpYU5hbWUgPT0gMCB8fCAqdmlhTmFtZSA9PSAwKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAobWFzayAmJiB2ZXJzaW9uTnVtIDwgNS44KSB7Ci0gICAgICAgIHJldHVybiBMRUZXX1dST05HX1ZFUlNJT047Ci0gICAgfQotCi0gICAgaWYgKCFsZWZ3VmFsaWRhdGVNYXNrTnVtYmVyKG1hc2spKSB7Ci0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIH0KLQotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KSB7Ci0gICAgICAgIGlmIChudW1YIHx8IG51bVkgfHwgc3BhY2VYIHx8IHNwYWNlWSkgewotICAgICAgICAgICAgaWYgKG1hc2spIHsKLSAgICAgICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgVklBIElURVJBVEUgTUFTSyAlZCAlLjExZyAlLjExZyAlcyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2ssIHhsLCB5bCwgdmlhTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICBWSUEgSVRFUkFURSAlLjExZyAlLjExZyAlcyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHhsLCB5bCwgdmlhTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiRE8gJWQgQlkgJWQgU1RFUCAlLjExZyAlLjExZyAiLAotICAgICAgICAgICAgICAgICAgICAgbnVtWCwgbnVtWSwgc3BhY2VYLAotICAgICAgICAgICAgICAgICAgICAgc3BhY2VZKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtYXNrKSB7Ci0gICAgICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIFZJQSBNQVNLICVkICUuMTFnICUuMTFnICVzICIsIG1hc2ssIHhsLCB5bCwgdmlhTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICBWSUEgJS4xMWcgJS4xMWcgJXMgIiwgeGwsIHlsLCB2aWFOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiO1xuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG51bVggfHwgbnVtWSB8fCBzcGFjZVggfHwgc3BhY2VZKSB7Ci0gICAgICAgICAgICBpZiAobWFzaykgewotICAgICAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBWSUEgSVRFUkFURSBNQVNLICVkICUuMTFnICUuMTFnICVzICIsIG1hc2ssIHhsLCB5bCwgdmlhTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBWSUEgSVRFUkFURSAlLjExZyAlLjExZyAlcyAiLCB4bCwgeWwsIHZpYU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIkRPICVkIEJZICVkIFNURVAgJS4xMWcgJS4xMWcgIiwgbnVtWCwgbnVtWSwgc3BhY2VYLAotICAgICAgICAgICAgICAgICAgICBzcGFjZVkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1hc2spIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgVklBIE1BU0sgJWQgJS4xMWcgJS4xMWcgJXMgIiwgbWFzaywgeGwsIHlsLCB2aWFOYW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgIFZJQSAlLjExZyAlLjExZyAlcyAiLCB4bCwgeWwsIHZpYU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICI7XG4iKTsKLSAgICB9Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3SXNNYWNyb09ic0xheWVyID0gMDsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotCi1pbnQKLWxlZndFbmRNYWNyb09icygpCi17Ci0gICAgaWYgKCFsZWZ3SXNNYWNyb09icykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgRU5EXG4iKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICBFTkRcbiIpOwotCi0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd0lzTWFjcm9PYnMgPSAwOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi0KLWludAotbGVmd1N0YXJ0TWFjcm9UaW1pbmcoKQotewotICAgIGxlZndPYnNvbGV0ZU51bSA9IExFRldfTUFDUk9fVElNSU5HOwotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19NQUNST19TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19NQUNSTykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3SXNNYWNyb1RpbWluZykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICh2ZXJzaW9uTnVtID49IDUuNCkKLSAgICAgICAgcmV0dXJuIExFRldfT0JTT0xFVEU7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBUSU1JTkdcbiIpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIFRJTUlOR1xuIik7Ci0KLSAgICBsZWZ3SXNNYWNyb1RpbWluZyA9IDE7Ci0gICAgbGVmd0lzTWFjcm9UaW1pbmdNb2RlbCA9IDA7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLS8vIE9ic29sZXRlIGluIDUuNAotaW50Ci1sZWZ3TWFjcm9UaW1pbmdQaW4oY29uc3QgY2hhciAgICpmcm9tUGluLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAqdG9QaW4pCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNNYWNyb1RpbWluZykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChmcm9tUGluKSB7Ci0gICAgICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIEZST01QSU4gJXMgO1xuIiwgZnJvbVBpbik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBGUk9NUElOICVzIDtcbiIsIGZyb21QaW4pOwotICAgICAgICBsZWZ3TGluZXMrKzsKLSAgICB9Ci0gICAgaWYgKHRvUGluKSB7Ci0gICAgICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIFRPUElOICVzIDtcbiIsIHRvUGluKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgIFRPUElOICVzIDtcbiIsIHRvUGluKTsKLSAgICAgICAgbGVmd0xpbmVzKys7Ci0gICAgfQotICAgIHJldHVybiBMRUZXX09LOwotfQotCi0vLyBPYnNvbGV0ZSBpbiA1LjQKLWludAotbGVmd01hY3JvVGltaW5nSW50cmluc2ljKGNvbnN0IGNoYXIgKnJpc2VGYWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgbWluLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgbWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgc2xld1QxLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgc2xld1QxTWluLCAgICAgICAvLyBvcHRpb25hbCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgIHNsZXdUMU1heCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgIHNsZXdUMiwgICAgICAgLy8gb3B0aW9uYWwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICBzbGV3VDJNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICBzbGV3VDJNYXgsICAgIC8vIG9wdGlvbmFsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgc2xld1QzLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcHRpb25hbCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgIHZhck1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgIHZhck1heCkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc01hY3JvVGltaW5nKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKHN0cmNtcChyaXNlRmFsbCwgIlJJU0UiKSAmJiBzdHJjbXAocmlzZUZhbGwsICJGQUxMIikpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KSB7Ci0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICAlcyBJTlRSSU5TSUMgJS4xMWcgJS4xMWcgIiwKLSAgICAgICAgICAgICAgICAgcmlzZUZhbGwsIG1pbiwgbWF4KTsKLSAgICAgICAgaWYgKHNsZXdUMSB8fCBzbGV3VDFNaW4gfHwgc2xld1QxTWF4IHx8IHNsZXdUMikgewotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiUuMTFnICUuMTFnICUuMTFnICUuMTFnICIsCi0gICAgICAgICAgICAgICAgICAgICBzbGV3VDEsIHNsZXdUMU1pbiwgc2xld1QxTWF4LCBzbGV3VDIpOwotICAgICAgICAgICAgaWYgKHNsZXdUMk1pbiB8fCBzbGV3VDJNYXggfHwgc2xld1QzKQotICAgICAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIlLjExZyAlLjExZyAlLjExZyBcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2xld1QyTWluLCBzbGV3VDJNYXgsIHNsZXdUMyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2xld1QyTWluIHx8IHNsZXdUMk1heCB8fCBzbGV3VDMpCi0gICAgICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsgICAgIC8vIHNsZXdUMk1pbi4uLiBoYXMgdG8gYmUgaW5zaWRlIG9mIHNsZXdUMS4uLgotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgICAgVkFSSUFCTEUgJS4xMWcgJS4xMWcgO1xuIiwKLSAgICAgICAgICAgICAgICAgdmFyTWluLCB2YXJNYXgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICAlcyBJTlRSSU5TSUMgJS4xMWcgJS4xMWcgIiwgcmlzZUZhbGwsIG1pbiwgbWF4KTsKLSAgICAgICAgaWYgKHNsZXdUMSB8fCBzbGV3VDFNaW4gfHwgc2xld1QxTWF4IHx8IHNsZXdUMikgewotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiUuMTFnICUuMTFnICUuMTFnICUuMTFnICIsCi0gICAgICAgICAgICAgICAgICAgIHNsZXdUMSwgc2xld1QxTWluLCBzbGV3VDFNYXgsIHNsZXdUMik7Ci0gICAgICAgICAgICBpZiAoc2xld1QyTWluIHx8IHNsZXdUMk1heCB8fCBzbGV3VDMpCi0gICAgICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiUuMTFnICUuMTFnICUuMTFnIFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNsZXdUMk1pbiwgc2xld1QyTWF4LCBzbGV3VDMpOwotICAgICAgICB9IGVsc2UgaWYgKHNsZXdUMk1pbiB8fCBzbGV3VDJNYXggfHwgc2xld1QzKQotICAgICAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7ICAgICAvLyBzbGV3VDJNaW4uLi4gaGFzIHRvIGJlIGluc2lkZSBvZiBzbGV3VDEuLi4KLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgICAgIFZBUklBQkxFICUuMTFnICUuMTFnIDtcbiIsIHZhck1pbiwgdmFyTWF4KTsKLSAgICB9Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLQotLy8gT2Jzb2xldGUgaW4gNS40Ci1pbnQKLWxlZndNYWNyb1RpbWluZ1Jpc2Vycyhkb3VibGUgICAgbWluLAotICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICBtYXgpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNNYWNyb1RpbWluZykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgUklTRVJTICUuMTFnICUuMTFnIDtcbiIsIG1pbiwgbWF4KTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBSSVNFUlMgJS4xMWcgJS4xMWcgO1xuIiwgbWluLCBtYXgpOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi0vLyBPYnNvbGV0ZSBpbiA1LjQKLWludAotbGVmd01hY3JvVGltaW5nRmFsbHJzKGRvdWJsZSAgICBtaW4sCi0gICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgIG1heCkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc01hY3JvVGltaW5nKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICBGQUxMUlMgJS4xMWcgJS4xMWcgO1xuIiwgbWluLCBtYXgpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgIEZBTExSUyAlLjExZyAlLjExZyA7XG4iLCBtaW4sIG1heCk7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLS8vIE9ic29sZXRlIGluIDUuNAotaW50Ci1sZWZ3TWFjcm9UaW1pbmdSaXNlY3MoZG91YmxlICAgIG1pbiwKLSAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgbWF4KQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzTWFjcm9UaW1pbmcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIFJJU0VDUyAlLjExZyAlLjExZyA7XG4iLCBtaW4sIG1heCk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgUklTRUNTICUuMTFnICUuMTFnIDtcbiIsIG1pbiwgbWF4KTsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotLy8gT2Jzb2xldGUgaW4gNS40Ci1pbnQKLWxlZndNYWNyb1RpbWluZ0ZhbGxjcyhkb3VibGUgICAgbWluLAotICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICBtYXgpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNNYWNyb1RpbWluZykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgRkFMTENTICUuMTFnICUuMTFnIDtcbiIsIG1pbiwgbWF4KTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBGQUxMQ1MgJS4xMWcgJS4xMWcgO1xuIiwgbWluLCBtYXgpOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi0vLyBPYnNvbGV0ZSBpbiA1LjQKLWludAotbGVmd01hY3JvVGltaW5nUmlzZXNhdHQxKGRvdWJsZSBtaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1heCkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc01hY3JvVGltaW5nKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICBSSVNFU0FUVDEgJS4xMWcgJS4xMWcgO1xuIiwgbWluLCBtYXgpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgIFJJU0VTQVRUMSAlLjExZyAlLjExZyA7XG4iLCBtaW4sIG1heCk7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLS8vIE9ic29sZXRlIGluIDUuNAotaW50Ci1sZWZ3TWFjcm9UaW1pbmdGYWxsc2F0dDEoZG91YmxlIG1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbWF4KQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzTWFjcm9UaW1pbmcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICAgIEZBTExTQVRUMSAlLjExZyAlLjExZyA7XG4iLCBtaW4sIG1heCk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgRkFMTFNBVFQxICUuMTFnICUuMTFnIDtcbiIsIG1pbiwgbWF4KTsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotLy8gT2Jzb2xldGUgaW4gNS40Ci1pbnQKLWxlZndNYWNyb1RpbWluZ1Jpc2V0MChkb3VibGUgICAgbWluLAotICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICBtYXgpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFsZWZ3SXNNYWNyb1RpbWluZykKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiICAgICAgUklTRVQwICUuMTFnICUuMTFnIDtcbiIsIG1pbiwgbWF4KTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIgICAgICBSSVNFVDAgJS4xMWcgJS4xMWcgO1xuIiwgbWluLCBtYXgpOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi0vLyBPYnNvbGV0ZSBpbiA1LjQKLWludAotbGVmd01hY3JvVGltaW5nRmFsbHQwKGRvdWJsZSAgICBtaW4sCi0gICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgIG1heCkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoIWxlZndJc01hY3JvVGltaW5nKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICBGQUxMVDAgJS4xMWcgJS4xMWcgO1xuIiwgbWluLCBtYXgpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICAgIEZBTExUMCAlLjExZyAlLjExZyA7XG4iLCBtaW4sIG1heCk7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLS8vIE9ic29sZXRlIGluIDUuNAotaW50Ci1sZWZ3TWFjcm9UaW1pbmdVbmF0ZW5lc3MoY29uc3QgY2hhciAqdW5hdGVuZXNzKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbGVmd0lzTWFjcm9UaW1pbmcpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAoc3RyY21wKHVuYXRlbmVzcywgIklOVkVSVCIpICYmIHN0cmNtcCh1bmF0ZW5lc3MsICJOT05JTlZFUlQiKSAmJgotICAgICAgICBzdHJjbXAodW5hdGVuZXNzLCAiTk9OVU5BVEUiKSkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICAgICBVTkFURU5FU1MgJXMgOyBcbiIsIHVuYXRlbmVzcyk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiICAgICAgVU5BVEVORVNTICVzIDsgXG4iLCB1bmF0ZW5lc3MpOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi0vLyBPYnNvbGV0ZSBpbiA1LjQKLWludAotbGVmd0VuZE1hY3JvVGltaW5nKCkKLXsKLSAgICBpZiAoIWxlZndJc01hY3JvVGltaW5nKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICIgICBFTkQgVElNSU5HXG5cbiIpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgIEVORCBUSU1JTkdcblxuIik7Ci0KLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3SXNNYWNyb1RpbWluZyA9IDA7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLQotaW50Ci1sZWZ3QW50ZW5uYShjb25zdCBjaGFyICAqdHlwZSwKLSAgICAgICAgICAgIGRvdWJsZSAgICAgIHZhbHVlKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19JTklUICYmIGxlZndTdGF0ZSA8IExFRldfRU5EKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7ICAvLyBub3Qgb2YgdGhlIEVORHMKLSAgICBpZiAoIXR5cGUgfHwgdHlwZSA9PSAwIHx8ICp0eXBlID09IDApCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChzdHJjbXAodHlwZSwgIklOUFVUUElOQU5URU5OQVNJWkUiKSAmJgotICAgICAgICBzdHJjbXAodHlwZSwgIk9VVFBVVFBJTkFOVEVOTkFTSVpFIikgJiYKLSAgICAgICAgc3RyY21wKHR5cGUsICJJTk9VVFBJTkFOVEVOTkFTSVpFIikpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9EQVRBOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiJXMgJS4xMWcgO1xuIiwgdHlwZSwgdmFsdWUpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiVzICUuMTFnIDtcbiIsIHR5cGUsIHZhbHVlKTsKLQotICAgIGxlZndMaW5lcysrOwotICAgIGxlZndTeW5BcnJheVtMRUZXX0FOVEVOTkFTSVpFXSA9IDE7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLQotaW50Ci1sZWZ3QW50ZW5uYUlucHV0R2F0ZUFyZWEoZG91YmxlIGlucHV0R2F0ZUFyZWEpCi17Ci0gICAgbGVmdzU0TnVtID0gTEVGV19BTlRFTk5BSU5QVVRHQVRFQVJFQTsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfSU5JVCAmJiBsZWZ3U3RhdGUgPCBMRUZXX0VORCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOyAgLy8gbm90IG9mIHRoZSBFTkRzCi0gICAgaWYgKGxlZndTeW5BcnJheVtMRUZXX0FOVEVOTkFJTlBVVEdBVEVBUkVBXSkKLSAgICAgICAgcmV0dXJuIExFRldfQUxSRUFEWV9ERUZJTkVEOwotICAgIGlmICh2ZXJzaW9uTnVtIDwgNS40KQotICAgICAgICByZXR1cm4gTEVGV19XUk9OR19WRVJTSU9OOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiQU5URU5OQUlOUFVUR0FURUFSRUEgJS4xMWcgO1xuIiwKLSAgICAgICAgICAgICAgICAgaW5wdXRHYXRlQXJlYSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiQU5URU5OQUlOUFVUR0FURUFSRUEgJS4xMWcgO1xuIiwgaW5wdXRHYXRlQXJlYSk7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N5bkFycmF5W0xFRldfQU5URU5OQUlOUFVUR0FURUFSRUFdID0gMTsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3QW50ZW5uYUluT3V0RGlmZkFyZWEoZG91YmxlIGluT3V0RGlmZkFyZWEpCi17Ci0gICAgbGVmdzU0TnVtID0gTEVGV19BTlRFTk5BSU5PVVRESUZGQVJFQTsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfSU5JVCAmJiBsZWZ3U3RhdGUgPCBMRUZXX0VORCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOyAgLy8gbm90IG9mIHRoZSBFTkRzCi0gICAgaWYgKGxlZndTeW5BcnJheVtMRUZXX0FOVEVOTkFJTk9VVERJRkZBUkVBXSkKLSAgICAgICAgcmV0dXJuIExFRldfQUxSRUFEWV9ERUZJTkVEOwotICAgIGlmICh2ZXJzaW9uTnVtIDwgNS40KQotICAgICAgICByZXR1cm4gTEVGV19XUk9OR19WRVJTSU9OOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiQU5URU5OQUlOT1VURElGRkFSRUEgJS4xMWcgO1xuIiwKLSAgICAgICAgICAgICAgICAgaW5PdXREaWZmQXJlYSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiQU5URU5OQUlOT1VURElGRkFSRUEgJS4xMWcgO1xuIiwgaW5PdXREaWZmQXJlYSk7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgbGVmd1N5bkFycmF5W0xFRldfQU5URU5OQUlOT1VURElGRkFSRUFdID0gMTsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3QW50ZW5uYU91dHB1dERpZmZBcmVhKGRvdWJsZSBvdXRwdXREaWZmQXJlYSkKLXsKLSAgICBsZWZ3NTROdW0gPSBMRUZXX0FOVEVOTkFPVVRQVVRESUZGQVJFQTsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfSU5JVCAmJiBsZWZ3U3RhdGUgPCBMRUZXX0VORCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOyAgLy8gbm90IG9mIHRoZSBFTkRzCi0gICAgaWYgKGxlZndTeW5BcnJheVtMRUZXX0FOVEVOTkFPVVRQVVRESUZGQVJFQV0pCi0gICAgICAgIHJldHVybiBMRUZXX0FMUkVBRFlfREVGSU5FRDsKLSAgICBpZiAodmVyc2lvbk51bSA8IDUuNCkKLSAgICAgICAgcmV0dXJuIExFRldfV1JPTkdfVkVSU0lPTjsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIkFOVEVOTkFPVVRQVVRESUZGQVJFQSAlLjExZyA7XG4iLAotICAgICAgICAgICAgICAgICBvdXRwdXREaWZmQXJlYSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiQU5URU5OQU9VVFBVVERJRkZBUkVBICUuMTFnIDtcbiIsIG91dHB1dERpZmZBcmVhKTsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICBsZWZ3U3luQXJyYXlbTEVGV19BTlRFTk5BT1VUUFVURElGRkFSRUFdID0gMTsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotaW50Ci1sZWZ3U3RhcnRCZWdpbmV4dChjb25zdCBjaGFyICpuYW1lKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3U3RhdGUgPT0gTEVGV19CRUdJTkVYVF9TVEFSVCB8fAotICAgICAgICBsZWZ3U3RhdGUgPT0gTEVGV19CRUdJTkVYVCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmICghbmFtZSB8fCBuYW1lID09IDAgfHwgKm5hbWUgPT0gMCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX0RBVEE7Ci0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJCRUdJTkVYVCBcIiVzXCIiLCBuYW1lKTsKLSAgICAgICAgLy8gXG4gd2lsbCBiZSBhZGRlZCBsYXRlcgotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIkJFR0lORVhUIFwiJXNcIiIsIG5hbWUpOwotCi0gICAgbGVmd1N0YXRlID0gTEVGV19CRUdJTkVYVF9TVEFSVDsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotCi1pbnQKLWxlZndCZWdpbmV4dENyZWF0b3IoY29uc3QgY2hhciAqY3JlYXRvck5hbWUpCi17Ci0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0JFR0lORVhUX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX0JFR0lORVhUKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKCFjcmVhdG9yTmFtZSB8fCBjcmVhdG9yTmFtZSA9PSAwIHx8ICpjcmVhdG9yTmFtZSA9PSAwKQotICAgICAgICByZXR1cm4gTEVGV19CQURfREFUQTsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIlxuICAgQ1JFQVRPUiBcIiVzXCIiLCBjcmVhdG9yTmFtZSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiXG4gICBDUkVBVE9SIFwiJXNcIiIsIGNyZWF0b3JOYW1lKTsKLQotICAgIGxlZndTdGF0ZSA9IExFRldfQkVHSU5FWFQ7Ci0gICAgbGVmd0xpbmVzKys7Ci0gICAgcmV0dXJuIExFRldfT0s7Ci19Ci0KLQotaW50Ci1sZWZ3QmVnaW5leHREYXRlKCkKLXsKLSAgICB0aW1lX3QgIHRvZGF5VGltZTsKLSAgICBjaGFyICAgICpyZXR0aW1lOwotCi0gICAgaWYgKCFsZWZ3RmlsZSkKLSAgICAgICAgcmV0dXJuIExFRldfVU5JTklUSUFMSVpFRDsKLSAgICBpZiAoIWxlZndEaWRJbml0KQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0gICAgaWYgKGxlZndTdGF0ZSAhPSBMRUZXX0JFR0lORVhUX1NUQVJUICYmCi0gICAgICAgIGxlZndTdGF0ZSAhPSBMRUZXX0JFR0lORVhUKQotICAgICAgICByZXR1cm4gTEVGV19CQURfT1JERVI7Ci0KLSAgICB0b2RheVRpbWUgPSB0aW1lKE5VTEwpOyAgICAgICAgICAgICAvLyB0aW1lIGluIFVUQyAKLSAgICByZXR0aW1lID0gY3RpbWUoJnRvZGF5VGltZSk7ICAgICAgICAvLyBjb252ZXJ0IHRvIHN0cmluZwotICAgIHJldHRpbWVbc3RybGVuKHJldHRpbWUpIC0gMV0gPSAnXDAnOyAgLy8gcmVwbGFjZSBcbiB3aXRoIFwwCi0gICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJcbiAgIERBVEUgXCIlc1wiIiwgcmV0dGltZSk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiXG4gICBEQVRFIFwiJXNcIiIsIHJldHRpbWUpOwotCi0gICAgbGVmd1N0YXRlID0gTEVGV19CRUdJTkVYVDsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotCi1pbnQKLWxlZndCZWdpbmV4dFJldmlzaW9uKGludCAgICB2ZXJzMSwKLSAgICAgICAgICAgICAgICAgICAgIGludCAgICB2ZXJzMikKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfQkVHSU5FWFRfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfQkVHSU5FWFQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIlxuICAgUkVWSVNJT04gJWQuJWQiLCB2ZXJzMSwgdmVyczIpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIlxuICAgUkVWSVNJT04gJWQuJWQiLCB2ZXJzMSwgdmVyczIpOwotCi0gICAgbGVmd1N0YXRlID0gTEVGV19CRUdJTkVYVDsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotCi1pbnQKLWxlZndCZWdpbmV4dFN5bnRheChjb25zdCBjaGFyICAgKnRpdGxlLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAqc3RyaW5nKQotewotICAgIGlmICghbGVmd0ZpbGUpCi0gICAgICAgIHJldHVybiBMRUZXX1VOSU5JVElBTElaRUQ7Ci0gICAgaWYgKCFsZWZ3RGlkSW5pdCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3U3RhdGUgIT0gTEVGV19CRUdJTkVYVF9TVEFSVCAmJgotICAgICAgICBsZWZ3U3RhdGUgIT0gTEVGV19CRUdJTkVYVCkKLSAgICAgICAgcmV0dXJuIExFRldfQkFEX09SREVSOwotICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiXG4gICAtICVzICVzIiwgdGl0bGUsIHN0cmluZyk7Ci0gICAgZWxzZQotICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiXG4gICAtICVzICVzIiwgdGl0bGUsIHN0cmluZyk7Ci0KLSAgICBsZWZ3U3RhdGUgPSBMRUZXX0JFR0lORVhUOwotICAgIGxlZndMaW5lcysrOwotICAgIHJldHVybiBMRUZXX09LOwotfQotCi0KLWludAotbGVmd0VuZEJlZ2luZXh0KCkKLXsKLSAgICBpZiAoIWxlZndGaWxlKQotICAgICAgICByZXR1cm4gTEVGV19VTklOSVRJQUxJWkVEOwotICAgIGlmICghbGVmd0RpZEluaXQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1N0YXRlICE9IExFRldfQkVHSU5FWFRfU1RBUlQgJiYKLSAgICAgICAgbGVmd1N0YXRlICE9IExFRldfQkVHSU5FWFQpCi0gICAgICAgIHJldHVybiBMRUZXX0JBRF9PUkRFUjsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIjtcbkVOREVYVFxuXG4iKTsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYobGVmd0ZpbGUsICI7XG5FTkRFWFRcblxuIik7Ci0KLSAgICBsZWZ3U3RhdGUgPSBMRUZXX0JFR0lORVhUX0VORDsKLSAgICBsZWZ3TGluZXMrKzsKLSAgICByZXR1cm4gTEVGV19PSzsKLX0KLQotCi1pbnQKLWxlZndDdXJyZW50TGluZU51bWJlcigpCi17Ci0gICAgcmV0dXJuIGxlZndMaW5lczsKLX0KLQotdm9pZAotbGVmd1ByaW50RXJyb3IoaW50IHN0YXR1cykKLXsKLSAgICBzd2l0Y2ggKHN0YXR1cykgewotICAgIGNhc2UgTEVGV19PSzoKLSAgICAgICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiTm8gRXJyb3IuXG4iKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIk5vIEVycm9yLlxuIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTEVGV19VTklOSVRJQUxJWkVEOgotICAgICAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJOZWVkIHRvIGNhbGwgbGVmd0luaXQgZmlyc3QuXG4iKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIk5lZWQgdG8gY2FsbCBsZWZ3SW5pdCBmaXJzdC5cbiIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIExFRldfQkFEX09SREVSOgotICAgICAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJJbmNvcnJlY3Qgb3JkZXIgb2YgZGF0YS5cbiIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiSW5jb3JyZWN0IG9yZGVyIG9mIGRhdGEuXG4iKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMRUZXX0JBRF9EQVRBOgotICAgICAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJJbnZhbGlkIGRhdGEuXG4iKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIkludmFsaWQgZGF0YS5cbiIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIExFRldfQUxSRUFEWV9ERUZJTkVEOgotICAgICAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJTZWN0aW9uIGlzIGFsbG93ZWQgdG8gZGVmaW5lIG9ubHkgb25jZS5cbiIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiU2VjdGlvbiBpcyBhbGxvd2VkIHRvIGRlZmluZSBvbmx5IG9uY2UuXG4iKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMRUZXX1dST05HX1ZFUlNJT046Ci0gICAgICAgIGlmIChsZWZ3V3JpdGVFbmNyeXB0KQotICAgICAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAoY2hhciopICJWZXJzaW9uIG51bWJlciBpcyBzZXQgYmVmb3JlIDUuNCwgQVBJOiAlcyBpcyBmb3IgNS40LlxuIiwKLSAgICAgICAgICAgICAgICAgICAgIGxlZndTdGF0ZVN0cltsZWZ3NTROdW1dKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIlZlcnNpb24gbnVtYmVyIGlzIHNldCBiZWZvcmUgNS40LCBidXQgNS40LCBBUEk6ICVzIGlzIGZvciA1LjQuXG4iLCBsZWZ3U3RhdGVTdHJbbGVmdzU0TnVtXSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTEVGV19NSVhfVkVSU0lPTl9EQVRBOgotICAgICAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgICAgIGVuY1ByaW50KGxlZndGaWxlLCAoY2hhciopICJZb3UgaGF2ZSBtYWRlIGJvdGggNS40ICYgcHJlIDUuNCBBbnRlbm5hIEFQSSBjYWxsZWQsIHdoaWNoIGlzIGludmFsaWQuXG4iKTsKLQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiWW91IGhhdmUgbWFkZSBib3RoIDUuNCAmIHByZSA1LjQgQW50ZW5uYSBBUEkgY2FsbGVkLCB3aGljaCBpcyBpbnZhbGlkLlxuIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTEVGV19PQlNPTEVURToKLSAgICAgICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiJXMgaXMgbm8gbG9uZ2VyIHZhbGlkIGluICVnLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgIGxlZndTdGF0ZVN0cltsZWZ3T2Jzb2xldGVOdW1dLCB2ZXJzaW9uTnVtKTsKLQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKGxlZndGaWxlLCAiJXMgaXMgbm8gbG9uZ2VyIHZhbGlkIGluICVnLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgbGVmd1N0YXRlU3RyW2xlZndPYnNvbGV0ZU51bV0sIHZlcnNpb25OdW0pOwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLXZvaWQKLWxlZndBZGRDb21tZW50KGNvbnN0IGNoYXIgKmNvbW1lbnQpCi17Ci0gICAgaWYgKGNvbW1lbnQpIHsKLSAgICAgICAgaWYgKGxlZndXcml0ZUVuY3J5cHQpCi0gICAgICAgICAgICBlbmNQcmludChsZWZ3RmlsZSwgKGNoYXIqKSAiIyAlc1xuIiwgY29tbWVudCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZwcmludGYobGVmd0ZpbGUsICIjICVzXG4iLCBjb21tZW50KTsKLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi12b2lkCi1sZWZ3QWRkSW5kZW50KCkKLXsKLSAgICBpZiAobGVmd1dyaXRlRW5jcnlwdCkKLSAgICAgICAgZW5jUHJpbnQobGVmd0ZpbGUsIChjaGFyKikgIiAgICIpOwotICAgIGVsc2UKLSAgICAgICAgZnByaW50ZihsZWZ3RmlsZSwgIiAgICIpOwotICAgIHJldHVybjsKLX0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAgIFF1ZXN0aW9uczoKLS8vIC0gSXMgb25seSBvbmUgcm93IHJ1bGUgYWxsb3dlZAotLy8gLSBJcyBvbmx5IG9uZSB0cmFja3MgcnVsZSBhbGxvd2VkCi0vLyAtIEluIHRoZSBkaWUgYXJlYSBpcyBhIHplcm8gYXJlYSBhbGxvd2VkPyBvdmVybGFwcz8KLS8vIC0gV2hhdCB0eXBlIG9mIGNoZWNraW5nIGlzIG5lZWRlZCBmb3IgdGhlIHJvd3MgYW5kIHRyYWNrcyBkbyBsb29wPwotLy8gLSBDYW4geW91IGhhdmUgYSBkZWZhdWx0IHByb3Agd2l0aCBhIG51bWJlciBBTkQgYSByYW5nZT8KLS8vIC0gV2hhdCBpcyB0aGUgcGluIHByb3BlcnRpZXMgc2VjdGlvbiBtZW50aW9uZWQgaW4gdGhlIDUuMSBzcGVjPwotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmd1dyaXRlci5ocHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZndXcml0ZXIuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTM3ODAyLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmd1dyaXRlci5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMzc0ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTIgLSAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3I6IGRlbGwgJAotLy8gICRSZXZpc2lvbjogIzEgJAotLy8gICREYXRlOiAyMDE3LzA2LzA2ICQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2lmbmRlZiBMRUZXX1dSSVRFUkNBTExTX0gKLSNkZWZpbmUgTEVGV19XUklURVJDQUxMU19ICi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAibGVmaUtSRGVmcy5ocHAiCi0jaW5jbHVkZSAibGVmaURlZnMuaHBwIgotI2luY2x1ZGUgImxlZmlVc2VyLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotLy8gUmV0dXJuIGNvZGVzIGZvciB3cml0aW5nIGZ1bmN0aW9uczogCi0jZGVmaW5lIExFRldfT0sgICAgICAgICAgICAgICAwCi0jZGVmaW5lIExFRldfVU5JTklUSUFMSVpFRCAgICAxCi0jZGVmaW5lIExFRldfQkFEX09SREVSICAgICAgICAyCi0jZGVmaW5lIExFRldfQkFEX0RBVEEgICAgICAgICAzCi0jZGVmaW5lIExFRldfQUxSRUFEWV9ERUZJTkVEICA0Ci0jZGVmaW5lIExFRldfV1JPTkdfVkVSU0lPTiAgICA1Ci0jZGVmaW5lIExFRldfTUlYX1ZFUlNJT05fREFUQSA2Ci0jZGVmaW5lIExFRldfT0JTT0xFVEUgICAgICAgICA3Ci0KLS8vIG9yaWVudCAKLS8vICAgMCA9IE4KLS8vICAgMSA9IFcKLS8vICAgMiA9IFMKLS8vICAgMyA9IEUKLS8vICAgNCA9IEZOCi0vLyAgIDUgPSBGVwotLy8gICA2ID0gRlMKLS8vICAgNyA9IEZFCi0KLS8vIFRoZSBMRUYgd3JpdGVyIGluaXRpYWxpemF0aW9uLiAgTXVzdCBiZSBjYWxsZWQgZmlyc3QuCi0vLyBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGxlZndJbml0Q2JrIHNob3VsZCBiZSBjYWxsIG9ubHksCi0vLyBDYW4ndCBjYWxsIGJvdGggcm91dGluZXMuCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3SW5pdChGSUxFKiBmKTsKLQotLy8gVGhlIExFRiB3cml0ZXIgaW5pdGlhbGl6YXRpb24uICBNdXN0IGJlIGNhbGxlZCBmaXJzdC4KLS8vIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgbGVmd0luaXQgc2hvdWxkIGJlIGNhbGwgb25seSwKLS8vIENhbid0IGNhbGwgYm90aCByb3V0aW5lcy4KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndJbml0Q2JrKEZJTEUqIGYpOwotCi0vLyBUaGlzIHJvdXRpbmUgd2lsbCBzZXQgdGhlIHdyaXRlciB0byB3cml0ZSBvdXQgYW4gZW5jcnlwdGVkCi0vLyBsZWYgZmlsZS4KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYW5kIGhhcyB0byBiZSBjYWxsZWQgYWZ0ZXIKLS8vIGxlZndJbml0IG9yIGxlZndJbml0Q2JrIAotLy8gTmVlZCB0byBjYWxsIGxlZndDbG9zZUVuY3J5cHQgdG8gZG8gc29tZSBjbGVhbmluZyBpZiB0aGlzIHJvdXRpbmUKLS8vIGhhcyBjYWxsZWQKLWV4dGVybiBpbnQgbGVmd0VuY3J5cHQoKTsKLQotLy8gVGhpcyByb3V0aW5lIG5lZWRzIHRvIGJlIGNhbGxlZCBpZiBsZWZ3RW5jcnlwdCBoYXMgY2FsbGVkLgotLy8gSXQgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGZjbG9zZS4KLS8vIEl0IGRvZXMgc29tZSBob3VzZSBjbGVhbmluZy4KLWV4dGVybiBpbnQgbGVmd0Nsb3NlRW5jcnlwdCgpOwotCi0vLyBUaGlzIHJvdXRpbmUgd2lsbCB3cml0ZSBhIGJsYW5rIGxpbmUKLQotZXh0ZXJuIGludCBsZWZ3TmV3TGluZSgpOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndJbml0LgotLy8gVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3VmVyc2lvbiAoaW50IHZlcnMxLCBpbnQgdmVyczIpOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndJbml0LgotLy8gVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGUgY2FzZVNlbnNpdGl2ZSBjYW4gYmUgT04gb3IgT0ZGLiAKLWV4dGVybiBpbnQgbGVmd0Nhc2VTZW5zaXRpdmUgKGNvbnN0IGNoYXIqIGNhc2VTZW5zaXRpdmUpOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndJbml0LgotLy8gVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGUgbm9XaXJlRXh0ZW5zaW9uQXRQaW4gY2FuIGJlIE9OIG9yIE9GRi4gCi1leHRlcm4gaW50IGxlZndOb1dpcmVFeHRlbnNpb25BdFBpbiAoY29uc3QgY2hhciogbm9XaXJlRXh0KTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3SW5pdC4KLS8vIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gICAgIGFscmVhZHkgaGF2ZSBvbmUKLWV4dGVybiBpbnQgbGVmd01pbmZlYXR1cmUgKGRvdWJsZSBtaW5GZWF0dXJlWCwgZG91YmxlIG1pbkZlYXR1cmVZKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3SW5pdC4KLS8vIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0RpZWxlY3RyaWMgKGRvdWJsZSBkaWVsZWN0cmljKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3SW5pdC4KLS8vIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0J1c0JpdENoYXJzIChjb25zdCBjaGFyKiBidXNCaXRDaGFycyk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd0luaXQuCi0vLyBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndEaXZpZGVyQ2hhciAoY29uc3QgY2hhciogZGl2aWRlckNoYXIpOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndJbml0LgotLy8gVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLgotLy8gVGhpcyBpcyBhIDUuNCBzeW50YXguCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndNYW51ZmFjdHVyaW5nR3JpZCAoZG91YmxlIGdyaWQpOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndJbml0LgotLy8gVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLgotLy8gVGhpcyBpcyBhIDUuOCBzeW50YXguCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndGaXhlZE1hc2soKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3SW5pdC4KLS8vIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgotLy8gVGhpcyBpcyBhIDUuNCBzeW50YXguCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndVc2VNaW5TcGFjaW5nIChjb25zdCBjaGFyKiB0eXBlLCBjb25zdCBjaGFyKiBvbk9mZik7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd0luaXQuCi0vLyBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0vLyBUaGlzIGlzIGEgNS40IHN5bnRheC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0NsZWFyYW5jZU1lYXN1cmUgKGNvbnN0IGNoYXIqIHR5cGUpOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndJbml0LgotLy8gVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLgotLy8gVGhpcyBpcyBhIDUuNCBzeW50YXguCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndBbnRlbm5hSW5wdXRHYXRlQXJlYSAoZG91YmxlIGlucHV0R2F0ZUFyZWEpOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndJbml0LgotLy8gVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLgotLy8gVGhpcyBpcyBhIDUuNCBzeW50YXguCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndBbnRlbm5hSW5PdXREaWZmQXJlYSAoZG91YmxlIGluT3V0RGlmZkFyZWEpOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndJbml0LgotLy8gVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLgotLy8gVGhpcyBpcyBhIDUuNCBzeW50YXguCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndBbnRlbm5hT3V0cHV0RGlmZkFyZWEgKGRvdWJsZSBvdXRwdXREaWZmQXJlYSk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd0luaXQuCi0vLyBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoaXMgc2VjdGlvbiBvZiByb3V0aW5lcyBpcyBvcHRpb25hbC4KLS8vIFRoZSByb3V0aW5lIHN0YXJ0cyB0aGUgdW5pdHMgc2VjdGlvbi4gQWxsIG9mIHRoZSB1bml0cyBtdXN0IGZvbGxvdy4gCi1leHRlcm4gaW50IGxlZndTdGFydFVuaXRzKCk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCB1bml0LiAgVGhlIGNhbGwgbXVzdAotLy8gYmUgcHJlY2VlZGVkIGJ5IGEgY2FsbCB0byBsZWZ3U3RhcnRVbml0cyBhbmQgbXVzdCBiZQotLy8gdGVybWluYXRlZCBieSBhIGNhbGwgdG8gbGVmd0VuZFVuaXRzLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3VW5pdHMoZG91YmxlIHRpbWUsICAgIC8vIG9wdGlvbmFsKDApIC0gVElNRSBOQU5PU0VDT05EUyAKLSAgICAgICAgICAgICAgIGRvdWJsZSBjYXBhY2l0YW5jZSwgICAvLyBvcHRpb25hbCgwKSAtIENBUEFDSVRBTkNFIFBJQ09GQVJBRFMgCi0gICAgICAgICAgICAgICBkb3VibGUgcmVzaXN0YW5jZSwgICAgLy8gb3B0aW9uYWwoMCkgLSBSRVNJU1RBTkNFIE9ITVMgCi0gICAgICAgICAgICAgICBkb3VibGUgcG93ZXIsICAgICAgICAgLy8gb3B0aW9uYWwoMCkgLSBQT1dFUiBNSUxMSVdBVFRTIAotICAgICAgICAgICAgICAgZG91YmxlIGN1cnJlbnQsICAgICAgIC8vIG9wdGlvbmFsKDApIC0gQ1VSUkVOVCBNSUxMSUFNUFMgCi0gICAgICAgICAgICAgICBkb3VibGUgdm9sdGFnZSwgICAgICAgLy8gb3B0aW9uYWwoMCkgLSBWT0xUQUdFIFZPTFRTIAotICAgICAgICAgICAgICAgZG91YmxlIGRhdGFiYXNlKTsgICAgIC8vIG9wdGlvbmFsKDApIC0gREFUQUJBU0UgTUlDUk9OUyAKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBvbmNlIGZvciBlYWNoIHVuaXQuICBJdCBpcyBzZXBhcmF0ZWQgZnJvbQotLy8gbGVmd1VuaXRzIGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJsZSBmb3IgcHJlIDUuMy4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd1VuaXRzRnJlcXVlbmN5KGRvdWJsZSBmcmVxdWVuY3kpOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxlZndVbml0cyBjYWxsIChpZiBhbnkpLgotLy8gVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndFbmRVbml0cygpOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndJbml0LgotLy8gRWl0aGVyIHRoaXMgcm91dGluZSBvciBsZWZ3U3RhcnRMYXllclJvdXRpbmcgbXVzdCBiZSBjYWxsZWQuCi0vLyBNdWx0aXBsZSBzZWN0aW9ucyBvZiBsZWZ3U3RhcnRMYXllciBjYW4gYmUgY2FsbGVkLgotLy8gVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBzZWN0aW9uLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGUgcm91dGluZSBzdGFydHMgdGhlIGxheWVyIHNlY3Rpb24uIEFsbCBvZiB0aGUgbGF5ZXJzIG11c3QgZm9sbG93LgotLy8gVGhlIHR5cGUgY2FuIGJlIGVpdGhlciBDVVQgZm9yIEN1dCBMYXllciwgTUFTVEVSU0xJQ0Ugb3IgT1ZFUkxBUCBmb3IKLS8vIE1hc3RlcnNsaWNlIG9yIE92ZXJsYXkgTGF5ZXIuIAotZXh0ZXJuIGludCBsZWZ3U3RhcnRMYXllcihjb25zdCBjaGFyKiBsYXllck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHR5cGUpOyAgLy8gQ1VUIHwgTUFTVEVSU0xJQ0UgfCBPVkVSTEFQIAotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXIuCi0vLyBUaGlzIHNlY3Rpb24gb2Ygcm91dGluZXMgaXMgb3B0aW9uYWwuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoaXMgaXMgYSA1Ljggc3ludGF4LiAKLWV4dGVybiBpbnQgbGVmd0xheWVyTWFzayhpbnQgbWFza0NvbG9yKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydExheWVyLgotLy8gVGhpcyBzZWN0aW9uIG9mIHJvdXRpbmVzIGlzIG9wdGlvbmFsLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGlzIGlzIGEgNS41IHN5bnRheC4KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgaWYgdGhlIGxheWVyIHR5cGUgaXMgSU1QTEFOVCB3aGVuCi0vLyBsZWZ3U3RhcnRMYXllciBpcyBjYWxsZWQuIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJXaWR0aChkb3VibGUgbWluV2lkdGgpOwotCi0vLyBUaGUgZm9sbG93aW5nIEFQSXMgYXJlIGZvciBsZWZ3cml0ZSA1LjcgTGF5ZXIsIFNwYWNpbmcgd2l0aCB0eXBlIENVVAotLy8gRHVlIHRvIGFkZGluZyBuZXcgY29uc3RydWN0cywgaXQgaXMgaW1wb3NzaWJsZSB0byB1c2UgdGhlIHByZXZpb3VzCi0vLyBBUElzLgotLy8gVGhlIGZvbGxvd2luZyBBUElzIGFyZSBvYnNvbGV0ZWQgaW4gNS43OgotLy8gICAgbGVmd0xheWVyCi0vLyAgICBsZWZ3TGF5ZXJTdGFjawotLy8gICAgbGVmd0xheWVyU3BhY2luZ0FkamFjZW50Ci0vLyAgICBsZWZ3TGF5ZXJTcGFjaW5nQ2VudGVyVG9DZW50ZXIKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydExheWVyLgotLy8gVGhpcyByb3V0aW5lIHN0YXJ0cyB0aGUgTGF5ZXIgVHlwZSBDdXQgU3BhY2luZwotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGUgcm91dGluZyBsZWZ3TGF5ZXJDdXRTcGFjaW5nRW5kIGhhcyB0byBjYWxsIGF0IHRoZSBlbmQgb2YgZWFjaCBzcGFjaW5nLgotLy8gVGhpcyBpcyBhIDUuNyBzeW50YXguIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJDdXRTcGFjaW5nKGRvdWJsZSBzcGFjaW5nKSA7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3TGF5ZXJTcGFjaW5nCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoaXMgaXMgYSA1Ljcgc3ludGF4LiAKLWV4dGVybiBpbnQgbGVmd0xheWVyQ3V0U3BhY2luZ0NlbnRlclRvQ2VudGVyKCk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3TGF5ZXJTcGFjaW5nCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoaXMgaXMgYSA1Ljcgc3ludGF4LiAKLWV4dGVybiBpbnQgbGVmd0xheWVyQ3V0U3BhY2luZ1NhbWVOZXQoKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndMYXllclNwYWNpbmcKLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4KLS8vIEVpdGhlciB0aGlzIHJvdXRpbmUsIGxlZndMYXllckN1dFNwYWNpbmdBZGphY2VudCwKLS8vIGxlZndMYXllckN1dFNwYWNpbmdQYXJhbGxlbCBvciBsZWZ3TGF5ZXJDdXRTcGFjaW5nQXJlYSBpcyBjYWxsZWQgcGVyIFNwYWNpbmcuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoaXMgaXMgYSA1Ljcgc3ludGF4LiAKLWV4dGVybiBpbnQgbGVmd0xheWVyQ3V0U3BhY2luZ0xheWVyKGNvbnN0IGNoYXIqIG5hbWUyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhY2spOyAgICAgICAgIC8vIG9wdGlvbmFsKDApIAotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd0xheWVyU3BhY2luZwotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLgotLy8gRWl0aGVyIHRoaXMgcm91dGluZSwgbGVmd0xheWVyQ3V0U3BhY2luZ0xheWVyLAotLy8gbGVmd0xheWVyQ3V0U3BhY2luZ1BhcmFsbGVsIG9yIGxlZndMYXllckN1dFNwYWNpbmdBcmVhIGlzIGNhbGxlZCBwZXIgU3BhY2luZy4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhpcyBpcyBhIDUuNyBzeW50YXguIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJDdXRTcGFjaW5nQWRqYWNlbnQoaW50IHZpYUN1dHMsIC8vIGVpdGhlciAyLCAzLCBvciA0LCBvcHQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YWNrKTsgIC8vIG9wdGlvbmFsKDApIAotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd0xheWVyU3BhY2luZwotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLgotLy8gRWl0aGVyIHRoaXMgcm91dGluZSwgbGVmd0xheWVyQ3V0U3BhY2luZ0xheWVyLAotLy8gbGVmd0xheWVyQ3V0U3BhY2luZ0FkamFjZW50IG9yIGxlZndMYXllckN1dFNwYWNpbmdBcmVhIGlzIGNhbGxlZCBwZXIgU3BhY2luZy4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhpcyBpcyBhIDUuNyBzeW50YXguIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJDdXRTcGFjaW5nUGFyYWxsZWwoKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndMYXllclNwYWNpbmcKLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4KLS8vIEVpdGhlciB0aGlzIHJvdXRpbmUsIGxlZndMYXllckN1dFNwYWNpbmdMYXllciwgKiBsZWZ3TGF5ZXJDdXRTcGFjaW5nQWRqYWNlbnQKLS8vIG9yIGxlZndMYXllckN1dFNwYWNpbmdQYXJhbGxlbCBpcyBjYWxsZWQgcGVyIFNwYWNpbmcuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoaXMgaXMgYSA1Ljcgc3ludGF4LiAKLWV4dGVybiBpbnQgbGVmd0xheWVyQ3V0U3BhY2luZ0FyZWEoZG91YmxlIGN1dEFyZWEpOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd0xheWVyU3BhY2luZwotLy8gVGhpcyByb3V0aW5lIG1hcmtzIHRoZSBlbmQgb2YgYSBMYXllciBUeXBlIENVVCBTcGFjaW5nCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoaXMgaXMgYSA1Ljcgc3ludGF4LiAKLWV4dGVybiBpbnQgbGVmd0xheWVyQ3V0U3BhY2luZ0VuZCgpOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXIuCi0vLyBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0vLyBUaGlzIHNlY3Rpb24gb2Ygcm91dGluZXMgaXMgb3B0aW9uYWwuCi0vLyBUaGlzIGlzIGEgNS43IHN5bnRheAotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGlmIHRoZSBsYXllciB0eXBlIGlzIENVVCB3aGVuCi0vLyBsZWZ3U3RhcnRMYXllciBpcyBjYWxsZWQuIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJDdXRTcGFjaW5nVGFibGVPcnRobyhpbnQgbnVtU3BhY2luZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBjdXRXaXRoaW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIG9ydGhvU3BhY2luZ3MpOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXIuCi0vLyBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0vLyBUaGlzIHNlY3Rpb24gb2Ygcm91dGluZXMgaXMgb3B0aW9uYWwuCi0vLyBUaGlzIGlzIGEgNS43IHN5bnRheAotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGlmIHRoZSBsYXllciB0eXBlIGlzIENVVCB3aGVuCi0vLyBsZWZ3U3RhcnRMYXllciBpcyBjYWxsZWQuIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJBcnJheVNwYWNpbmcoaW50IGxvbmdBcnJheSwgICAgLy8gb3B0aW9uYWwgKDApIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZpYVdpZHRoLCAgLy8gb3B0aW9uYWwgKDApIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGN1dFNwYWNpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtQXJyYXlDdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGFycmF5Q3V0cywgZG91YmxlKiBhcnJheVNwYWNpbmdzKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydExheWVyLgotLy8gVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCi0vLyBUaGlzIHNlY3Rpb24gb2Ygcm91dGluZXMgaXMgb3B0aW9uYWwuCi0vLyBUaGlzIGlzIGEgNS42IHN5bnRheC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBpZiB0aGUgbGF5ZXIgdHlwZSBpcyBDVVQgd2hlbgotLy8gbGVmd1N0YXJ0TGF5ZXIgaXMgY2FsbGVkLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyRW5jbG9zdXJlKGNvbnN0IGNoYXIqIGxvY2F0aW9uLCAvL0FCT1ZFfEJFTE9XLCBvcHRpb25hbCAiIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG92ZXJoYW5nMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBvdmVyaGFuZzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgd2lkdGgpOyAgICAvLyBvcHRpb25hbCAoMCkgCi0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRMYXllci4KLS8vIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgotLy8gVGhpcyByb3V0aW5lIGlzIHNpbWlsYXIgYXMgbGVmd0xheWVyRW5jbG9zdXJlLCBidXQgYWxsb3cgdXNlciB0byBhZGQKLS8vIEVYQ0VQVEVYVFJBQ1VUIG9wdGlvbgotLy8gVGhpcyBzZWN0aW9uIG9mIHJvdXRpbmVzIGlzIG9wdGlvbmFsLgotLy8gVGhpcyBpcyBhIDUuNyBzeW50YXguCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgaWYgdGhlIGxheWVyIHR5cGUgaXMgQ1VUIHdoZW4KLS8vIGxlZndTdGFydExheWVyIGlzIGNhbGxlZC4gCi1leHRlcm4gaW50IGxlZndMYXllckVuY2xvc3VyZVdpZHRoKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbG9jYXRpb24sIC8vQUJPVkV8QkVMT1csIG9wdGlvbmFsICIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgb3ZlcmhhbmcxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG92ZXJoYW5nMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB3aWR0aCwgICAgICAgICAvLyBvcHRpb25hbCAoMCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgY3V0V2l0aGluKTsgICAgLy8gb3B0aW9uYWwgKDApIAotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXIuCi0vLyBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KLS8vIFRoaXMgcm91dGluZSBpcyB0byB3cml0ZSBvdXQgbWluTGVuZ3RoIGluc2lkZSBFTkNMT1NVUkUgaW5zdGVhZCBvZiBXSURUSAotLy8gYXMgaW4gdGhlIHJvdXRpbmUgbGVmd0xheWVyRW5jbG9zdXJlICYgbGVmd0xheWVyRW5jbG9zdXJlV2lkdGguCi0vLyBUaGlzIHNlY3Rpb24gb2Ygcm91dGluZXMgaXMgb3B0aW9uYWwuCi0vLyBUaGlzIGlzIGEgNS43IHN5bnRheC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBpZiB0aGUgbGF5ZXIgdHlwZSBpcyBDVVQgd2hlbgotLy8gbGVmd1N0YXJ0TGF5ZXIgaXMgY2FsbGVkLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyRW5jbG9zdXJlTGVuZ3RoKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbG9jYXRpb24sIC8vQUJPVkV8QkVMT1csIG9wdGlvbmFsICIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgb3ZlcmhhbmcxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG92ZXJoYW5nMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtaW5MZW5ndGgpOyAgICAvLyBvcHRpb25hbCAoMCkgCi0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRMYXllci4KLS8vIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgotLy8gVGhpcyBzZWN0aW9uIG9mIHJvdXRpbmVzIGlzIG9wdGlvbmFsLgotLy8gVGhpcyBpcyBhIDUuNiBzeW50YXguCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgaWYgdGhlIGxheWVyIHR5cGUgaXMgQ1VUIHdoZW4KLS8vIGxlZndTdGFydExheWVyIGlzIGNhbGxlZC4gCi1leHRlcm4gaW50IGxlZndMYXllclByZWZlckVuY2xvc3VyZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGxvY2F0aW9uLCAvL0FCT1ZFfEJFTE9XLCBvcHRpb25hbCAiIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG92ZXJoYW5nMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBvdmVyaGFuZzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgd2lkdGgpOyAgICAvLyBvcHRpb25hbCAoMCkgCi0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRMYXllci4KLS8vIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgTGF5ZXIuCi0vLyBUaGlzIHNlY3Rpb24gb2Ygcm91dGluZXMgaXMgb3B0aW9uYWwuCi0vLyBUaGlzIGlzIGEgNS42IHN5bnRheC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBpZiB0aGUgbGF5ZXIgdHlwZSBpcyBDVVQgd2hlbgotLy8gbGVmd1N0YXJ0TGF5ZXIgaXMgY2FsbGVkLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyUmVzaXN0YW5jZVBlckN1dChkb3VibGUgcmVzaXN0YW5jZSk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbGVmd1N0YXJ0TGF5ZXIgY2FsbCAoaWYgYW55KS4KLS8vIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBzZWN0aW9uLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3RW5kTGF5ZXIoY29uc3QgY2hhciogbGF5ZXJOYW1lKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3SW5pdC4KLS8vIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgbGVmd1N0YXJ0TGF5ZXIgbXVzdCBiZSBjYWxsZWQuCi0vLyBNdWx0aXBsZSBzZWN0aW9uIG9mIGxlZndTdGFydExheWVyIGNhbiBiZSBjYWxsZWQuCi0vLyBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgc2VjdGlvbi4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhlIHJvdXRpbmUgc3RhcnRzIHRoZSBsYXllciByb3V0aW5nIHNlY3Rpb24uCi0vLyBBbGwgb2YgdGhlIGxheWVycyBtdXN0IGZvbGxvdy4gCi1leHRlcm4gaW50IGxlZndTdGFydExheWVyUm91dGluZyhjb25zdCBjaGFyKiBsYXllck5hbWUpOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZy4KLS8vIFRoaXMgcm91dGluZSBpcyByZXF1aXJlZCBmb3IgTGF5ZXJSb3V0aW5nLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJSb3V0aW5nKGNvbnN0IGNoYXIqIGRpcmVjdGlvbiwgLy8gSE9SSVpPTlRBTCB8IFZFUlRJQ0FMIHwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBESUFHNDUgfCBESUFHMTM1IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB3aWR0aCk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLgotLy8gRWl0aGVyIHRoaXMgcm91dGluZSBvciBsZWZ3TGF5ZXJSb3V0aW5nUGl0Y2hYWURpc3RhbmNlIGNhbiBiZSBjYWxsZWQKLS8vIGJ1dCBub3QgYm90aAotLy8gVGhpcyBpcyBhIDUuNiBzeW50YXguCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndMYXllclJvdXRpbmdQaXRjaChkb3VibGUgcGl0Y2gpOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZy4KLS8vIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgbGVmd0xheWVyUm91dGluZ1BpdGNoIGNhbiBiZSBjYWxsZWQgYnV0IG5vdCBib3RoCi0vLyBUaGlzIGlzIGEgNS42IHN5bnRheC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyUm91dGluZ1BpdGNoWFlEaXN0YW5jZShkb3VibGUgeERpc3RhbmNlLCBkb3VibGUgeURpc3RhbmNlKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG9ubHkgb25jZSBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcuCi0vLyBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGxlZndMYXllclJvdXRpbmdEaWFnUGl0Y2hYWURpc3RhbmNlIGNhbiBiZSBjYWxsZWQKLS8vIGJ1dCBub3QgYm90aAotLy8gVGhpcyBpcyBhIDUuNiBzeW50YXguCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndMYXllclJvdXRpbmdEaWFnUGl0Y2goZG91YmxlIGRpc3RhbmNlKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG9ubHkgb25jZSBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcuCi0vLyBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGxlZndMYXllclJvdXRpbmdEaWFnUGl0Y2ggY2FuIGJlIGNhbGxlZAotLy8gYnV0IG5vdCBib3RoCi0vLyBUaGlzIGlzIGEgNS42IHN5bnRheC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyUm91dGluZ0RpYWdQaXRjaFhZRGlzdGFuY2UoZG91YmxlIGRpYWc0NURpc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZGlhZzEzNURpc3RhbmNlKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG9ubHkgb25jZSBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcuCi0vLyBUaGlzIGlzIGEgNS42IHN5bnRheC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyUm91dGluZ0RpYWdXaWR0aChkb3VibGUgZGlhZ1dpZHRoKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG9ubHkgb25jZSBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcuCi0vLyBUaGlzIGlzIGEgNS42IHN5bnRheC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyUm91dGluZ0RpYWdTcGFjaW5nKGRvdWJsZSBkaWFnU3BhY2luZyk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLgotLy8gVGhpcyBpcyBhIDUuNiBzeW50YXguCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndMYXllclJvdXRpbmdEaWFnTWluRWRnZUxlbmd0aChkb3VibGUgZGlhZ0xlbmd0aCk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsCi0vLyBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGxlZndMYXllclJvdXRpbmdPZmZzZXRYWURpc3RhbmNlIGNhbiBiZSBjYWxsZWQKLS8vIGJ1dCBub3QgYm90aAotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJSb3V0aW5nT2Zmc2V0KGRvdWJsZSBvZmZzZXQpOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZy4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbAotLy8gRWl0aGVyIHRoaXMgcm91dGluZSBvciBsZWZ3TGF5ZXJSb3V0aW5nT2Zmc2V0IGNhbiBiZSBjYWxsZWQgYnV0IG5vdCBib3RoCi0vLyBUaGlzIGlzIGEgNS42IHN5bnRheC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyUm91dGluZ09mZnNldFhZRGlzdGFuY2UoZG91YmxlIHhEaXN0YW5jZSwgZG91YmxlIHlEaXN0YW5jZSk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndMYXllclJvdXRpbmdBcmVhKGRvdWJsZSBhcmVhKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG9ubHkgb25jZSBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcuCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwKLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyUm91dGluZ01pbnNpemUoaW50IG51bVJlY3QsIGRvdWJsZSogbWluV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogbWluTGVuZ3RoKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG9ubHkgb25jZSBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcuCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwKLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyUm91dGluZ01pbmltdW1jdXQoZG91YmxlIG51bUN1dHMsIGRvdWJsZSBtaW5XaWR0aCk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLgotLy8gVGhpcyByb3V0aW5lIGlzIHNpbWlsYXIgYXMgbGVmd0xheWVyUm91dGluZ01pbmltdW1jdXQsIGJ1dCBhbGxvdyB1c2VyCi0vLyB0byBzcGVjaWZ5IHZhbHVlIGZvciBXSVRISU4KLS8vIFRoaXMgaXMgYSA1Ljcgc3ludGF4LgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndMYXllclJvdXRpbmdNaW5pbXVtY3V0V2l0aGluKGRvdWJsZSBudW1DdXRzLCBkb3VibGUgbWluV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjdXREaXN0YW5jZSk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd0xheWVyUm91dGluZ01pbmltdW1jdXQuCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0vLyBEaXJlY3Rpb24gY2FuIGJlIGVpdGhlciBGUk9NQUJPVkUgb3IgRlJPTUJFTE9XCi0vLyBUaGlzIGlzIGEgNS41IHN5bnRheC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyUm91dGluZ01pbmltdW1jdXRDb25uZWN0aW9ucyhjb25zdCBjaGFyKiBkaXJlY3Rpb24pOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGxlZndMYXllclJvdXRpbmdNaW5pbXVtY3V0LgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLgotLy8gVGhpcyBpcyBhIDUuNSBzeW50YXguCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndMYXllclJvdXRpbmdNaW5pbXVtY3V0TGVuZ3RoV2l0aGluKGRvdWJsZSBsZW5ndGgsCi0gICAgICAgICAgICAgICBkb3VibGUgZGlzdGFuY2UpOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZSBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcuCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwKLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyUm91dGluZ1NwYWNpbmcoZG91YmxlIHNwYWNpbmcpOwotCi0vLyBFaXRoZXIgdGhpcyByb3V0aW5lLCBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ0xlbmd0aFRocmVzaG9sZCBvcgotLy8gbGVmd0xheWVyUm91dGluZ1NwYWNpbmdTYW1lTmV0IGNhbiBiZQotLy8gY2FsbGVkIG9ubHkgb25jZSBhZnRlciBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZy4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyUm91dGluZ1NwYWNpbmdSYW5nZShkb3VibGUgbWluV2lkdGgsIGRvdWJsZSBtYXhXaWR0aCk7Ci0KLS8vIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgbGVmd0xheWVyUm91dGluZ1NwYWNpbmdSYW5nZUluZmx1ZW5jZSBvcgotLy8gbGVmd0xheWVyUm91dGluZ1NwYWNpbmdSYW5nZVJhbmdlIGNhbgotLy8gYmUgY2FsbGVkIG9uY2UgYWZ0ZXIgbGxlZndMYXllclJvdXRpbmdTcGFjaW5nUmFuZ2UuCi0vLyBUaGlzIHJvdXRpbmUgaXMgdmFsaWQgb25seSBpZiBlaXRoZXIgb3IgYm90aCBsZWZ0UmFuZ2UgYW5kIHJpZ2h0UmFuZ2UKLS8vIGluIGxlZndMYXllclJvdXRpbmdTcGFjaW5nIGFyZSBub24gemVybwotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ1JhbmdlVXNlTGVuZ3RoVGhyZXNob2xkKCk7Ci0KLS8vIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgbGVmd0xheWVyUm91dGluZ1NwYWNpbmdSYW5nZVVzZUxlbmd0aFRocmVzaG9sZCBvcgotLy8gbGVmd0xheWVyUm91dGluZ1NwYWNpbmdSYW5nZVJhbmdlIGNhbiBiZSBjYWxsZWQgb25jZSBhZnRlcgotLy8gbGVmd0xheWVyUm91dGluZ1NwYWNpbmdSYW5nZS4KLS8vIHN1Yk1pbldpZHRoICYgc3ViTWF4V2lkdGggYXJlIG9wdGlvbmFsLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ1JhbmdlSW5mbHVlbmNlKGRvdWJsZSBpbmZWYWx1ZSwKLSAgICAgICAgICAgICAgZG91YmxlIHN1Yk1pbldpZHRoLCBkb3VibGUgc3ViTWF4V2lkdGgpOwotCi0vLyBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGxlZndMYXllclJvdXRpbmdTcGFjaW5nUmFuZ2VVc2VMZW5ndGhUaHJlc2hvbGQgb3IKLS8vIGxlZndMYXllclJvdXRpbmdTcGFjaW5nUmFuZ2VJbmZsdWVuY2UgY2FuIGJlIGNhbGxlZCBvbmNlIGFmdGVyCi0vLyBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ1JhbmdlLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ1JhbmdlUmFuZ2UoZG91YmxlIG1pbldpZHRoLCBkb3VibGUgbWF4V2lkdGgpOwotCi0vLyBFaXRoZXIgdGhpcyByb3V0aW5lLCBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ1JhbmdlIG9yCi0vLyBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ1NhbWVOZXQgY2FuIGJlCi0vLyBiZSBjYWxsZWQgb25jZSBhZnRlciBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZy4KLS8vIG1pbldpZHRoICYgbWF4V2lkdGggYXJlIG9wdGlvbmFsLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ0xlbmd0aFRocmVzaG9sZChkb3VibGUgbGVuZ3RoVmFsdWUsCi0gICAgICAgICAgICAgIGRvdWJsZSBtaW5XaWR0aCwgZG91YmxlIG1heFdpZHRoKTsKLQotLy8gRWl0aGVyIHRoaXMgcm91dGluZSwgbGVmd0xheWVyUm91dGluZ1NwYWNpbmdSYW5nZSBvcgotLy8gbGVmd0xheWVyUm91dGluZ1NwYWNpbmdSYW5nZSBjYW4gYmUKLS8vIGJlIGNhbGxlZCBvbmNlIGFmdGVyIGxlZndMYXllclJvdXRpbmdTcGFjaW5nLgotLy8gVGhpcyBpcyBhIDUuNyByb3V0aW5lLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ1NhbWVOZXQoaW50IFBHT25seSkgOyAvLyBvcHRpb25hbCAoMCkgCi0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsCi0vLyBUaGlzIGlzIGEgNS43IHN5bnRheC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyUm91dGluZ1NwYWNpbmdFbmRPZkxpbmUoZG91YmxlIGVvbFdpZHRoLCBkb3VibGUgZW9sV2l0aGluKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG9ubHkgb25jZSBhZnRlciBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ0VuZE9mTGluZQotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsCi0vLyBUaGlzIGlzIGEgNS43IHN5bnRheC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyUm91dGluZ1NwYWNpbmdFT0xQYXJhbGxlbChkb3VibGUgcGFyU3BhY2UsIGRvdWJsZSBwYXJXaXRoaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR3b0VkZ2VzKTsgLy8gb3B0aW9uYWwoMCkgCi0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsCi0vLyBUaGlzIGlzIGEgNS43IHN5bnRheC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyUm91dGluZ1NwYWNpbmdOb3RjaExlbmd0aChkb3VibGUgbWluTkxlbmd0aCk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsCi0vLyBUaGlzIGlzIGEgNS43IHN5bnRheC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyUm91dGluZ1NwYWNpbmdFbmRPZk5vdGNoV2lkdGgoZG91YmxlIGVvbldpZHRoLAotICAgICAgICAgICAgICAgICAgZG91YmxlIG1pbk5TcGFjaW5nLCBkb3VibGUgbWluTkxlbmd0aCk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndMYXllclJvdXRpbmdXaXJlRXh0ZW5zaW9uKGRvdWJsZSB3aXJlRXh0ZW5zaW9uKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG9ubHkgb25jZSBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcuCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwKLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyUm91dGluZ1Jlc2lzdGFuY2UoY29uc3QgY2hhciogcmVzaXN0YW5jZSk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndMYXllclJvdXRpbmdDYXBhY2l0YW5jZShjb25zdCBjaGFyKiBjYXBhY2l0YW5jZSk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndMYXllclJvdXRpbmdIZWlnaHQoZG91YmxlIGhlaWdodCk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndMYXllclJvdXRpbmdUaGlja25lc3MoZG91YmxlIHRoaWNrbmVzcyk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndMYXllclJvdXRpbmdTaHJpbmthZ2UoZG91YmxlIHNocmlua2FnZSk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndMYXllclJvdXRpbmdDYXBNdWx0aXBsaWVyKGRvdWJsZSBjYXBNdWx0aXBsaWVyKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG9ubHkgb25jZSBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcuCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwKLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyUm91dGluZ0VkZ2VDYXAoZG91YmxlIGVkZ2VDYXApOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZy4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbAotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJSb3V0aW5nQW50ZW5uYUFyZWEoZG91YmxlIGFudGVubmFBcmVhKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG9ubHkgb25jZSBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcuCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwKLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyUm91dGluZ0FudGVubmFMZW5ndGgoZG91YmxlIGFudGVubmFMZW5ndGgpOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZy4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmNlLgotLy8gVGhpcyBpcyBhIDUuNSBzeW50YXguCi0vLyB3aWR0aCBpcyB0aGUgbWF4aW11bSB3aWR0aC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyUm91dGluZ01heHdpZHRoKGRvdWJsZSB3aWR0aCk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9uY2UuCi0vLyBUaGlzIGlzIGEgNS41IHN5bnRheC4KLS8vIHdpZHRoIGlzIHRoZSBtYXhpbXVtIHdpZHRoLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJSb3V0aW5nTWlud2lkdGgoZG91YmxlIHdpZHRoKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG9ubHkgb25jZSBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcuCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCi0vLyBUaGlzIGlzIGEgNS41IHN5bnRheC4KLS8vIEFyZWEgaXMgdGhlIG1pbmltdW0gYXJlYSBzaXplIGxpbWl0IGZvciBtZXRhbCB0aGF0IGVuY2xvc2VzIGFuIGVtcHR5IGFyZWEuCi0vLyBXaWR0aCBpcyBvcHRpb25hbCwgaXQgc2F5cyB0aGUgcnVsZSBvbmx5IGFwcGxpZXMgd2hlbiBhIGRvbnV0IGlzIGNhcmV0ZWQKLS8vIGZyb20gYSB3aXJlIG9mIHdpZHRoIDw9IHdpZHRoLiAgVGhlIHBhcmFtZXRlciB3aWR0aCBpcyByZXF1aXJlZCBmb3IgdGhlCi0vLyByb3V0aW5lIGxlZndMYXllclJvdXRpbmVNaW5lbmNsb3NlZGFyZWEuICBJZiB3aWR0aCBpcyBvcHRpb25hbCwgYSAiMCIKLS8vIHZhbHVlIGlzIGFzc2lnbmVkIGZvciB0aGF0IGluZGV4IHNsb3Qgb2YgdGhlIGFycmF5LgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJSb3V0aW5nTWluZW5jbG9zZWRhcmVhKGludCBudW1NaW5lbmNsb3NlZCwgZG91YmxlKiBhcmVhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd2lkdGgpOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZy4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmNlLgotLy8gVGhpcyBpcyBhIDUuNSBzeW50YXguCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndMYXllclJvdXRpbmdNaW5zdGVwKGRvdWJsZSBkaXN0YW5jZSk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9uY2UuCi0vLyBUaGlzIHJvdXRpbmUgaXMgZXF1aXZhbGVudCB0byBsZWZ3TGF5ZXJSb3V0aW5nTWluc3RlcCwgZXhjZXB0IGl0IGFsc28KLS8vIHRha2VzIHRoZSBvcHRpb25zIGZvciB0eXBlICYgTGVuZ3Roc3VtLgotLy8gVGhpcyBpcyBhIDUuNSBzeW50YXguCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndMYXllclJvdXRpbmdNaW5zdGVwV2l0aE9wdGlvbnMoZG91YmxlIGRpc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBydWxlLCAvLyBJTlNJREVDT1JORVJ8T1VUU0lERUNPUk5FUnxTVEVQIAotICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbWF4TGVuZ3RoKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG9ubHkgb25jZSBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcuCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25jZS4KLS8vIFRoaXMgcm91dGluZSBpcyBlcXVpdmFsZW50IHRvIGxlZndMYXllclJvdXRpbmdNaW5zdGVwLCBleGNlcHQgaXQgYWxzbwotLy8gdGFrZXMgdGhlIG9wdGlvbiBmb3IgTWF4RWRnZXMuCi0vLyBUaGlzIGlzIGEgNS43IHN5bnRheC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyUm91dGluZ01pbnN0ZXBNYXhFZGdlcyhkb3VibGUgZGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1heEVkZ2VzKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG9ubHkgb25jZSBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcuCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25jZS4KLS8vIFRoaXMgaXMgYSA1LjUgc3ludGF4LgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJSb3V0aW5nUHJvdHJ1c2lvbihkb3VibGUgd2lkdGgxLCBkb3VibGUgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgd2lkdGgyKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgotLy8gVGhpcyBpcyBhIDUuNSBzeW50YXguCi0vLyBudW1MZW5ndGggaGFzIHRoZSBzaXplIG9mIHRoZSBhcnJheSBsZW5ndGguCi0vLyBsZW5ndGggaXMgYW4gYXJyYXkgb2YgbGVuZ3RoIHZhbHVlcy4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyUm91dGluZ1N0YXJ0U3BhY2luZ3RhYmxlUGFyYWxsZWwoaW50IG51bUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBsZW5ndGgpOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBhZnRlcgotLy8gbGVmd0xheWVyUm91dGluZ1N0YXJ0U3BhY2luZ3RhYmxlUGFyYWxsZWwuCi0vLyBUaGlzIHJvdXRpbmUgaXMgcmVxdWlyZWQgYWZ0ZXIgbGVmd0xheWVyUm91dGluZ1N0YXJ0U3BhY2luZ3RhYmxlUGFyYWxsZWwuCi0vLyBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KLS8vIFRoaXMgaXMgYSA1LjUgc3ludGF4LgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ3RhYmxlUGFyYWxsZWxXaWR0aChkb3VibGUgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bVNwYWNpbmcsIGRvdWJsZSogc3BhY2luZyk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZy4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KLS8vIFRoaXMgaXMgYSA1LjUgc3ludGF4LgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJSb3V0aW5nU3RhcnRTcGFjaW5ndGFibGVJbmZsdWVuY2UoKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIKLS8vIGxlZndMYXllclJvdXRpbmdTdGFydFNwYWNpbmd0YWJsZUluZmx1ZW5jZS4KLS8vIFRoaXMgcm91dGluZSBpcyByZXF1aXJlZCBhZnRlciBsZWZ3TGF5ZXJSb3V0aW5nU3RhcnRTcGFjaW5ndGFibGVJbmZsdWVuY2UuCi0vLyBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KLS8vIFRoaXMgaXMgYSA1LjUgc3ludGF4LgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAKLWV4dGVybiBpbnQgbGVmd0xheWVyUm91dGluZ1NwYWNpbmdJbmZsdWVuY2VXaWR0aChkb3VibGUgd2lkdGgsIGRvdWJsZSBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgc3BhY2luZyk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZy4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KLS8vIFRoaXMgaXMgYSA1Ljcgc3ludGF4LgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJSb3V0aW5nU3RhcnRTcGFjaW5ndGFibGVUd29XaWR0aHMoKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIKLS8vIGxlZndMYXllclJvdXRpbmdTdGFydFNwYWNpbmd0YWJsZUluZmx1ZW5jZS4KLS8vIFRoaXMgcm91dGluZSBpcyByZXF1aXJlZCBhZnRlciBsZWZ3TGF5ZXJSb3V0aW5nU3RhcnRTcGFjaW5ndGFibGVUd29XaWR0aHMuCi0vLyBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KLS8vIFRoaXMgaXMgYSA1Ljcgc3ludGF4LgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuICAKLWV4dGVybiBpbnQgbGVmd0xheWVyUm91dGluZ1NwYWNpbmd0YWJsZVR3b1dpZHRoc1dpZHRoKGRvdWJsZSB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcnVuTGVuZ3RoLCAvLyBQUkwsIG9wdGlvbmFsICgwKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtU3BhY2luZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHNwYWNpbmcpOwotCi0vLyBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBhZnRlciBsZWZ3TGF5ZXJSb3V0aW5nU3RhcnRTcGFjaW5ndGFibGVQYXJhbGxlbAotLy8gb3IgbGVmd0xheWVyUm91dGluZ1N0YXJ0U3BhY2luZ3RhYmxlSW5mbHVlbmNlLgotLy8gSXQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuCi0vLyBUaGlzIGlzIGEgNS41IHN5bnRheC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyUm91dGluZUVuZFNwYWNpbmd0YWJsZSgpOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxlZndTdGFydExheWVyIGNhbGwgKGlmIGFueSkuCi0vLyBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgc2VjdGlvbi4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0VuZExheWVyUm91dGluZyhjb25zdCBjaGFyKiBsYXllck5hbWUpOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nIG9yIGxlZndTdGFydExheWVyLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgotLy8gaWYgdGhlIHZhbHVlIGZvciB0aGUgdmFyaWFibGUgdmFsdWUgaXMgbm90IDAsIG9uZSBvZiB0aGUgZm9sbG93aW5nCi0vLyByb3V0aW5lcyBoYXZlIHRvIGJlIGNhbGxlZDogbGVmd0xheWVyQUNGcmVxdWVuY3ksCi0vLyBsZWZ3TGF5ZXJBQ1dpZHRoLCBsZWZ3TGF5ZXJBQ0N1dGFyZWEsIG9yCi0vLyBsZWZ3TGF5ZXJBQ1RhYmxlRW50cmllcwotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJBQ0N1cnJlbnREZW5zaXR5KGNvbnN0IGNoYXIqIHR5cGUsIGRvdWJsZSB2YWx1ZSk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3TGF5ZXJBQ0N1cnJlbnREZW5zaXR5LgotLy8gVGhpcyByb3V0aW5lIGlzIHJlcXVpcmVkIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSBhZnRlciBlYWNoCi0vLyBsZWZ3TGF5ZXJBQ0N1cnJlbnREZW5zaXR5LgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJBQ0ZyZXF1ZW5jeShpbnQgbnVtRnJlcXVlbmN5LCBkb3VibGUqIGZyZXF1ZW5jeSk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3TGF5ZXJBQ0N1cnJlbnREZW5zaXR5LgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSBhZnRlciBlYWNoCi0vLyBsZWZ3TGF5ZXJBQ0N1cnJlbnREZW5zaXR5LgotLy8gVGhpcyByb3V0aW5lIGNhbiBvbmx5IGJlIGNhbGxlZCBpbiBMYXllciBSb3V0aW5nCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndMYXllckFDV2lkdGgoaW50IG51bVdpZHRocywgZG91YmxlKiB3aWR0aHMpOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd0xheWVyQUNDdXJyZW50RGVuc2l0eS4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgZWFjaAotLy8gbGVmd0xheWVyQUNDdXJyZW50RGVuc2l0eS4KLS8vIFRoaXMgcm91dGluZSBjYW4gb25seSBiZSBjYWxsZWQgaW4gTGF5ZXIKLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyQUNDdXRhcmVhKGludCBudW1DdXRhcmVhcywgZG91YmxlKiBjdXRhcmVhcyk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3TGF5ZXJBQ0N1cnJlbnREZW5zaXR5LgotLy8gVGhpcyByb3V0aW5lIGlzIHJlcXVpcmVkIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSBhZnRlciBlYWNoCi0vLyBsZWZ3TGF5ZXJBQ0N1cnJlbnREZW5zaXR5LgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJBQ1RhYmxlRW50cmllcyhpbnQgbnVtRW50cmllcywgZG91YmxlKiBlbnRyaWVzKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZyBvciBsZWZ3U3RhcnRMYXllci4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KLS8vIGlmIHRoZSB2YWx1ZSBmb3IgdGhlIHZhcmlhYmxlIHZhbHVlIGlzIG5vdCAwLCBvbmUgb2YgdGhlIGZvbGxvd2luZwotLy8gcm91dGluZXMgaGF2ZSB0byBiZSBjYWxsZWQ6IGxlZndMYXllckRDV2lkdGgsIGxlZndMYXllckRDQ3V0YXJlYSwgb3IKLS8vIGxlZndMYXllckRDVGFibGVFbnRyaWVzCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndMYXllckRDQ3VycmVudERlbnNpdHkoY29uc3QgY2hhciogdHlwZSwgZG91YmxlIHZhbHVlKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndMYXllckRDQ3VycmVudERlbnNpdHkuCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGVhY2gKLS8vIGxlZndMYXllckRDQ3VycmVudERlbnNpdHkuCi0vLyBUaGlzIHJvdXRpbmUgY2FuIG9ubHkgYmUgY2FsbGVkIGluIExheWVyIFJvdXRpbmcKLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyRENXaWR0aChpbnQgbnVtV2lkdGhzLCBkb3VibGUqIHdpZHRocyk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3TGF5ZXJEQ0N1cnJlbnREZW5zaXR5LgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSBhZnRlciBlYWNoCi0vLyBsZWZ3TGF5ZXJEQ0N1cnJlbnREZW5zaXR5LgotLy8gVGhpcyByb3V0aW5lIGNhbiBvbmx5IGJlIGNhbGxlZCBpbiBMYXllcgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJEQ0N1dGFyZWEoaW50IG51bUN1dGFyZWFzLCBkb3VibGUqIGN1dGFyZWFzKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndMYXllckRDQ3VycmVudERlbnNpdHkuCi0vLyBUaGlzIHJvdXRpbmUgaXMgcmVxdWlyZWQgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGVhY2gKLS8vIGxlZndMYXllckRDQ3VycmVudERlbnNpdHkuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndMYXllckRDVGFibGVFbnRyaWVzKGludCBudW1FbnRyaWVzLCBkb3VibGUqIGVudHJpZXMpOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nIG9yIGxlZndTdGFydExheWVyLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLiAgVGhlIG94aWRlIHZhbHVlLCBjYW4gYmUgZWl0aGVyIE9YSURFMSwgT1hJREUyLAotLy8gT1hJREUzLCBvciBPWElERTQuICBFYWNoIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlIHdpdGhpbiBhIGxheWVyLgotLy8gVGhpcyByb3V0aW5lIGlzIHZhbGlkIG9ubHkgaWYgdGhlIGxheWVyIHR5cGUgaXMgZWl0aGVyIFJPVVRJTkcgb3IgQ1VULgotLy8gVGhpcyBpcyBhIDUuNSBzeW50YXguCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndMYXllckFudGVubmFNb2RlbChjb25zdCBjaGFyKiBveGlkZSk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcgb3IgbGVmd1N0YXJ0TGF5ZXIuCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHdpdGhpbiBhIGxheWVyCi0vLyBhZnRlciBlYWNoIGxlZndMYXllckFudGVubmFNb2RlbCBmdW5jdGlvbi4KLS8vIFRoaXMgcm91dGluZSBpcyB2YWxpZCBvbmx5IGlmIHRoZSBsYXllciB0eXBlIGlzIGVpdGhlciBST1VUSU5HIG9yIENVVC4KLS8vIFRoaXMgaXMgYSA1LjQgc3ludGF4LgotLy8gRWl0aGVyIHRoaXMgcm91dGluZSBvciBsZWZ3TGF5ZXJSb3V0aW5nQW50ZW5uYUxlbmd0aCBpcyBhbGxvd2VkLCBub3QgYm90aC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyQW50ZW5uYUFyZWFSYXRpbyhkb3VibGUgdmFsdWUpOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nIG9yIGxlZndTdGFydExheWVyLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSB3aXRoaW4gYSBsYXllcgotLy8gYWZ0ZXIgZWFjaCBsZWZ3TGF5ZXJBbnRlbm5hTW9kZWwgZnVuY3Rpb24uCi0vLyBUaGlzIHJvdXRpbmUgaXMgdmFsaWQgb25seSBpZiB0aGUgbGF5ZXIgdHlwZSBpcyBlaXRoZXIgUk9VVElORyBvciBDVVQuCi0vLyBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGxlZndMYXllckFudGVubmFEaWZmQXJlYVJhdGlvUHdsIGNhbiBiZSBjYWxsZWQsIGJ1dAotLy8gbm90IGJvdGgKLS8vIFRoaXMgaXMgYSA1LjQgc3ludGF4LgotLy8gRWl0aGVyIHRoaXMgcm91dGluZSBvciBsZWZ3TGF5ZXJSb3V0aW5nQW50ZW5uYUxlbmd0aCBpcyBhbGxvd2VkLCBub3QgYm90aC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyQW50ZW5uYURpZmZBcmVhUmF0aW8oZG91YmxlIHZhbHVlKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZyBvciBsZWZ3U3RhcnRMYXllci4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2Ugd2l0aGluIGEgbGF5ZXIgCi0vLyBhZnRlciBlYWNoIGxlZndMYXllckFudGVubmFNb2RlbCBmdW5jdGlvbi4KLS8vIFRoaXMgcm91dGluZSBpcyB2YWxpZCBvbmx5IGlmIHRoZSBsYXllciB0eXBlIGlzIGVpdGhlciBST1VUSU5HIG9yIENVVC4KLS8vIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgbGVmd0xheWVyQW50ZW5uYURpZmZBcmVhUmF0aW8gY2FuIGJlIGNhbGxlZCwgYnV0Ci0vLyBub3QgYm90aAotLy8gVGhpcyBpcyBhIDUuNCBzeW50YXguCi0vLyBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGxlZndMYXllclJvdXRpbmdBbnRlbm5hTGVuZ3RoIGlzIGFsbG93ZWQsIG5vdCBib3RoLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJBbnRlbm5hRGlmZkFyZWFSYXRpb1B3bChpbnQgbnVtUHdscywKLSAgICAgICAgICAgICAgIGRvdWJsZSogZGlmZnVzaW9ucywgZG91YmxlKiByYXRpb3MpOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nIG9yIGxlZndTdGFydExheWVyLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSB3aXRoaW4gYSBsYXllciAKLS8vIGFmdGVyIGVhY2ggbGVmd0xheWVyQW50ZW5uYU1vZGVsIGZ1bmN0aW9uLgotLy8gVGhpcyByb3V0aW5lIGlzIHZhbGlkIG9ubHkgaWYgdGhlIGxheWVyIHR5cGUgaXMgZWl0aGVyIFJPVVRJTkcgb3IgQ1VULgotLy8gVGhpcyBpcyBhIDUuNCBzeW50YXguCi0vLyBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGxlZndMYXllclJvdXRpbmdBbnRlbm5hTGVuZ3RoIGlzIGFsbG93ZWQsIG5vdCBib3RoLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJBbnRlbm5hQ3VtQXJlYVJhdGlvKGRvdWJsZSB2YWx1ZSk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcgb3IgbGVmd1N0YXJ0TGF5ZXIuCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHdpdGhpbiBhIGxheWVyIAotLy8gYWZ0ZXIgZWFjaCBsZWZ3TGF5ZXJBbnRlbm5hTW9kZWwgZnVuY3Rpb24uCi0vLyBUaGlzIHJvdXRpbmUgaXMgdmFsaWQgb25seSBpZiB0aGUgbGF5ZXIgdHlwZSBpcyBlaXRoZXIgUk9VVElORyBvciBDVVQuCi0vLyBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGxlZndMYXllckFudGVubmFDdW1EaWZmQXJlYVJhdGlvUHdsIGNhbiBiZSBjYWxsZWQsCi0vLyBidXQgbm90IGJvdGgKLS8vIFRoaXMgaXMgYSA1LjQgc3ludGF4LgotLy8gRWl0aGVyIHRoaXMgcm91dGluZSBvciBsZWZ3TGF5ZXJSb3V0aW5nQW50ZW5uYUxlbmd0aCBpcyBhbGxvd2VkLCBub3QgYm90aC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyQW50ZW5uYUN1bURpZmZBcmVhUmF0aW8oZG91YmxlIHZhbHVlKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZyBvciBsZWZ3U3RhcnRMYXllci4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2Ugd2l0aGluIGEgbGF5ZXIgCi0vLyBhZnRlciBlYWNoIGxlZndMYXllckFudGVubmFNb2RlbCBmdW5jdGlvbi4KLS8vIFRoaXMgcm91dGluZSBpcyB2YWxpZCBvbmx5IGlmIHRoZSBsYXllciB0eXBlIGlzIGVpdGhlciBST1VUSU5HIG9yIENVVC4KLS8vIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgbGVmd0xheWVyQW50ZW5uYUN1bURpZmZBcmVhUmF0aW8gY2FuIGJlIGNhbGxlZCwgYnV0Ci0vLyBub3QgYm90aAotLy8gVGhpcyBpcyBhIDUuNCBzeW50YXguCi0vLyBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGxlZndMYXllclJvdXRpbmdBbnRlbm5hTGVuZ3RoIGlzIGFsbG93ZWQsIG5vdCBib3RoLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJBbnRlbm5hQ3VtRGlmZkFyZWFSYXRpb1B3bChpbnQgbnVtUHdscywKLSAgICAgICAgICAgICAgIGRvdWJsZSogZGlmZnVzaW9ucywgZG91YmxlKiByYXRpb3MpOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nIG9yIGxlZndTdGFydExheWVyLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSB3aXRoaW4gYSBsYXllciAKLS8vIGFmdGVyIGVhY2ggbGVmd0xheWVyQW50ZW5uYU1vZGVsIGZ1bmN0aW9uLgotLy8gVGhpcyByb3V0aW5lIGlzIHZhbGlkIG9ubHkgaWYgdGhlIGxheWVyIHR5cGUgaXMgZWl0aGVyIFJPVVRJTkcgb3IgQ1VULgotLy8gVGhlIG9wdGlvbiBESUZGVVNFT05MWSBpcyBhIDUuNCBzeW50YXguCi0vLyBJZiBESUZGVVNFT05MWSwgbGVmd0xheWVyUm91dGluZ0FudGVubmFMZW5ndGggaXMgbm90IGFsbG93ZWQuCi0vLyBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gbGVmd0xheWVyUm91dGluZ0FudGVubmFBcmVhCi0vLyBkaWZmVXNlT25seSBoYXMgdG8gYmUgRElGRlVTRU9OTFkuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndMYXllckFudGVubmFBcmVhRmFjdG9yKGRvdWJsZSB2YWx1ZSwKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRpZmZVc2VPbmx5KTsgICAgLy8gb3B0aW9uYWwoTlVMTCkgCi0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcgb3IgbGVmd1N0YXJ0TGF5ZXIuCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHdpdGhpbiBhIGxheWVyIAotLy8gYWZ0ZXIgZWFjaCBsZWZ3TGF5ZXJBbnRlbm5hTW9kZWwgZnVuY3Rpb24uCi0vLyBUaGlzIHJvdXRpbmUgaXMgdmFsaWQgb25seSBpZiB0aGUgbGF5ZXIgdHlwZSBpcyBlaXRoZXIgUk9VVElORy4KLS8vIFRoaXMgaXMgYSA1LjQgc3ludGF4LgotLy8gRWl0aGVyIHRoaXMgcm91dGluZSBvciBsZWZ3TGF5ZXJSb3V0aW5nQW50ZW5uYUxlbmd0aCBpcyBhbGxvd2VkLCBub3QgYm90aC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyQW50ZW5uYVNpZGVBcmVhUmF0aW8oZG91YmxlIHZhbHVlKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZyBvciBsZWZ3U3RhcnRMYXllci4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2Ugd2l0aGluIGEgbGF5ZXIgCi0vLyBhZnRlciBlYWNoIGxlZndMYXllckFudGVubmFNb2RlbCBmdW5jdGlvbi4KLS8vIFRoaXMgcm91dGluZSBpcyB2YWxpZCBvbmx5IGlmIHRoZSBsYXllciB0eXBlIGlzIGVpdGhlciBST1VUSU5HLgotLy8gRWl0aGVyIHRoaXMgcm91dGluZSBvciBsZWZ3TGF5ZXJBbnRlbm5hRGlmZlNpZGVBcmVhUmF0aW9Qd2wgY2FuIGJlCi0vLyBjYWxsZWQsIGJ1dCBub3QgYm90aAotLy8gVGhpcyBpcyBhIDUuNCBzeW50YXguCi0vLyBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGxlZndMYXllclJvdXRpbmdBbnRlbm5hTGVuZ3RoIGlzIGFsbG93ZWQsIG5vdCBib3RoLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJBbnRlbm5hRGlmZlNpZGVBcmVhUmF0aW8oZG91YmxlIHZhbHVlKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZyBvciBsZWZ3U3RhcnRMYXllci4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2Ugd2l0aGluIGEgbGF5ZXIgCi0vLyBhZnRlciBlYWNoIGxlZndMYXllckFudGVubmFNb2RlbCBmdW5jdGlvbi4KLS8vIFRoaXMgcm91dGluZSBpcyB2YWxpZCBvbmx5IGlmIHRoZSBsYXllciB0eXBlIGlzIGVpdGhlciBST1VUSU5HIG9yIENVVC4KLS8vIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgbGVmd0xheWVyQW50ZW5uYURpZmZTaWRlQXJlYVJhdGlvIGNhbiBiZSBjYWxsZWQsCi0vLyBidXQgbm90IGJvdGgKLS8vIFRoaXMgaXMgYSA1LjQgc3ludGF4LgotLy8gRWl0aGVyIHRoaXMgcm91dGluZSBvciBsZWZ3TGF5ZXJSb3V0aW5nQW50ZW5uYUxlbmd0aCBpcyBhbGxvd2VkLCBub3QgYm90aC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyQW50ZW5uYURpZmZTaWRlQXJlYVJhdGlvUHdsKGludCBudW1Qd2xzLAotICAgICAgICAgICAgICAgZG91YmxlKiBkaWZmdXNpb25zLCBkb3VibGUqIHJhdGlvcyk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcgb3IgbGVmd1N0YXJ0TGF5ZXIuCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHdpdGhpbiBhIGxheWVyIAotLy8gYWZ0ZXIgZWFjaCBsZWZ3TGF5ZXJBbnRlbm5hTW9kZWwgZnVuY3Rpb24uCi0vLyBUaGlzIHJvdXRpbmUgaXMgdmFsaWQgb25seSBpZiB0aGUgbGF5ZXIgdHlwZSBpcyBlaXRoZXIgUk9VVElORy4KLS8vIFRoaXMgaXMgYSA1LjQgc3ludGF4LgotLy8gRWl0aGVyIHRoaXMgcm91dGluZSBvciBsZWZ3TGF5ZXJSb3V0aW5nQW50ZW5uYUxlbmd0aCBpcyBhbGxvd2VkLCBub3QgYm90aC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyQW50ZW5uYUN1bVNpZGVBcmVhUmF0aW8oZG91YmxlIHZhbHVlKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZyBvciBsZWZ3U3RhcnRMYXllci4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2Ugd2l0aGluIGEgbGF5ZXIgCi0vLyBhZnRlciBlYWNoIGxlZndMYXllckFudGVubmFNb2RlbCBmdW5jdGlvbi4KLS8vIFRoaXMgcm91dGluZSBpcyB2YWxpZCBvbmx5IGlmIHRoZSBsYXllciB0eXBlIGlzIGVpdGhlciBST1VUSU5HLgotLy8gRWl0aGVyIHRoaXMgcm91dGluZSBvciBsZWZ3TGF5ZXJBbnRlbm5hQ3VtRGlmZlNpZGVBcmVhUmF0aW9Qd2wgY2FuIGJlCi0vLyBjYWxsZWQsIGJ1dCBub3QgYm90aAotLy8gVGhpcyBpcyBhIDUuNCBzeW50YXguCi0vLyBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGxlZndMYXllclJvdXRpbmdBbnRlbm5hTGVuZ3RoIGlzIGFsbG93ZWQsIG5vdCBib3RoLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJBbnRlbm5hQ3VtRGlmZlNpZGVBcmVhUmF0aW8oZG91YmxlIHZhbHVlKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZyBvciBsZWZ3U3RhcnRMYXllci4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2Ugd2l0aGluIGEgbGF5ZXIgCi0vLyBhZnRlciBlYWNoIGxlZndMYXllckFudGVubmFNb2RlbCBmdW5jdGlvbi4KLS8vIFRoaXMgcm91dGluZSBpcyB2YWxpZCBvbmx5IGlmIHRoZSBsYXllciB0eXBlIGlzIGVpdGhlciBST1VUSU5HIG9yIENVVC4KLS8vIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgbGVmd0xheWVyQW50ZW5uYUN1bURpZmZTaWRlQXJlYVJhdGlvIGNhbiBiZSBjYWxsZWQsCi0vLyBidXQgbm90IGJvdGgKLS8vIFRoaXMgaXMgYSA1LjQgc3ludGF4LgotLy8gRWl0aGVyIHRoaXMgcm91dGluZSBvciBsZWZ3TGF5ZXJSb3V0aW5nQW50ZW5uYUxlbmd0aCBpcyBhbGxvd2VkLCBub3QgYm90aC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyQW50ZW5uYUN1bURpZmZTaWRlQXJlYVJhdGlvUHdsKGludCBudW1Qd2xzLAotICAgICAgICAgICAgICAgZG91YmxlKiBkaWZmdXNpb25zLCBkb3VibGUqIHJhdGlvcyk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcgb3IgbGVmd1N0YXJ0TGF5ZXIuCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHdpdGhpbiBhIGxheWVyIAotLy8gYWZ0ZXIgZWFjaCBsZWZ3TGF5ZXJBbnRlbm5hTW9kZWwgZnVuY3Rpb24uCi0vLyBUaGlzIHJvdXRpbmUgaXMgdmFsaWQgb25seSBpZiB0aGUgbGF5ZXIgdHlwZSBpcyBlaXRoZXIgUk9VVElORy4KLS8vIFRoZSBvcHRpb24gRElGRlVTRU9OTFkgaXMgYSA1LjQgc3ludGF4LgotLy8gZGlmZlVzZU9ubHkgaGFzIHRvIGJlIERJRkZVU0VPTkxZLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJBbnRlbm5hU2lkZUFyZWFGYWN0b3IoZG91YmxlIHZhbHVlLAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGlmZlVzZU9ubHkpOyAgICAvLyBvcHRpb25hbChOVUxMKSAKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydExheWVyUm91dGluZyBvciBsZWZ3U3RhcnRMYXllci4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2Ugd2l0aGluIGEgbGF5ZXIgCi0vLyBhZnRlciBlYWNoIGxlZndMYXllckFudGVubmFNb2RlbCBmdW5jdGlvbi4KLS8vIFRoaXMgcm91dGluZSBpcyB2YWxpZCBvbmx5IGlmIHRoZSBsYXllciB0eXBlIGlzIGVpdGhlciBST1VUSU5HIG9yIENVVC4KLS8vIFRoaXMgaXMgYSA1Ljcgcm91dGluZS4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0xheWVyQW50ZW5uYUN1bVJvdXRpbmdQbHVzQ3V0KCkgOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nIG9yIGxlZndTdGFydExheWVyLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSB3aXRoaW4gYSBsYXllciAKLS8vIGFmdGVyIGVhY2ggbGVmd0xheWVyQW50ZW5uYU1vZGVsIGZ1bmN0aW9uLgotLy8gVGhpcyByb3V0aW5lIGlzIHZhbGlkIG9ubHkgaWYgdGhlIGxheWVyIHR5cGUgaXMgZWl0aGVyIFJPVVRJTkcgb3IgQ1VULgotLy8gVGhpcyBpcyBhIDUuNyByb3V0aW5lLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJBbnRlbm5hR2F0ZVBsdXNEaWZmKGRvdWJsZSBwbHVzRGlmZkZhY3RvcikgOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nIG9yIGxlZndTdGFydExheWVyLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSB3aXRoaW4gYSBsYXllciAKLS8vIGFmdGVyIGVhY2ggbGVmd0xheWVyQW50ZW5uYU1vZGVsIGZ1bmN0aW9uLgotLy8gVGhpcyByb3V0aW5lIGlzIHZhbGlkIG9ubHkgaWYgdGhlIGxheWVyIHR5cGUgaXMgZWl0aGVyIFJPVVRJTkcgb3IgQ1VULgotLy8gVGhpcyBpcyBhIDUuNyByb3V0aW5lLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TGF5ZXJBbnRlbm5hQXJlYU1pbnVzRGlmZihkb3VibGUgbWludXNEaWZmRmFjdG9yKSA7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRMYXllclJvdXRpbmcgb3IgbGVmd1N0YXJ0TGF5ZXIuCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHdpdGhpbiBhIGxheWVyIAotLy8gYWZ0ZXIgZWFjaCBsZWZ3TGF5ZXJBbnRlbm5hTW9kZWwgZnVuY3Rpb24uCi0vLyBUaGlzIHJvdXRpbmUgaXMgdmFsaWQgb25seSBpZiB0aGUgbGF5ZXIgdHlwZSBpcyBlaXRoZXIgUk9VVElORyBvciBDVVQuCi0vLyBUaGlzIGlzIGEgNS43IHJvdXRpbmUuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndMYXllckFudGVubmFBcmVhRGlmZlJlZHVjZVB3bChpbnQgbnVtUHdscywKLSAgICAgICAgICAgICAgIGRvdWJsZSogZGlmZkFyZWFzLCBkb3VibGUqIG1ldGFsRGlmZkZhY3RvcnMpOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGxlZndTdGFydExheWVyLgotLy8gVGhlIG9wdGlvbiBNSU5JTVVNREVOU0lUWSBpcyBhIDUuNCBzeW50YXguCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndNaW5pbXVtRGVuc2l0eShkb3VibGUgbWluRGVuc2l0eSk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgYWZ0ZXIgbGVmd1N0YXJ0TGF5ZXIuCi0vLyBUaGUgb3B0aW9uIE1BWElNVU1ERU5TSVRZIGlzIGEgNS40IHN5bnRheC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd01heGltdW1EZW5zaXR5KGRvdWJsZSBtYXhEZW5zaXR5KTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG9ubHkgb25jZSBhZnRlciBsZWZ3U3RhcnRMYXllci4KLS8vIFRoZSBvcHRpb24gREVOU0lUWUNIRUNLV0lORE9XIGlzIGEgNS40IHN5bnRheC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0RlbnNpdHlDaGVja1dpbmRvdyhkb3VibGUgY2hlY2tXaW5kb3dMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGNoZWNrV2luZG93V2lkdGgpOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGxlZndTdGFydExheWVyLgotLy8gVGhlIG9wdGlvbiBERU5TSVRZQ0hFQ0tTVEVQIGlzIGEgNS40IHN5bnRheC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0RlbnNpdHlDaGVja1N0ZXAoZG91YmxlIGNoZWNrU3RlcFZhbHVlKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG9ubHkgb25jZSBhZnRlciBsZWZ3U3RhcnRMYXllci4KLS8vIFRoZSBvcHRpb24gRklMTEFDVElWRVNQQUNJTkcgaXMgYSA1LjQgc3ludGF4LgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3RmlsbEFjdGl2ZVNwYWNpbmcoZG91YmxlIGZpbGxUb0FjdGl2ZVNwYWNpbmcpOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGFsbCB0aGUgbGF5ZXJzLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLgotLy8gVGhpcyBpcyBhIDUuNSBzeW50YXguCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2VzZnVsLiAKLWV4dGVybiBpbnQgbGVmd01heHZpYXN0YWNrKGludCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGJvdHRvbUxheWVyLCAvLyBvcHRpb25hbCAoTlVMTCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0b3BMYXllcik7ICAgLy8gb3B0aW9uYWwgKE5VTEwpIAotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndJbml0LgotLy8gVGhpcyBzZWN0aW9uIG9mIHJvdXRpbmVzIGlzIG9wdGlvbmFsLgotLy8gVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoZSByb3V0aW5lIHN0YXJ0cyBwcm9wZXJ0eWRlZmluaXRpb25zIHNlY3Rpb24uIAotZXh0ZXJuIGludCBsZWZ3U3RhcnRQcm9wRGVmKCk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRQcm9wRGVmLgotLy8gVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCi0vLyBJdCBhZGRzIGludGVnZXIgcHJvcGVydHkgZGVmaW5pdGlvbiB0byB0aGUgc3RhdGVtZW50LgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGUgb2JqVHlwZSBjYW4gYmUgTElCUkFSWSBvciBWSUEgb3IgTUFDUk8gb3IgUElOLiAKLWV4dGVybiBpbnQgbGVmd0ludFByb3BEZWYoCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyKiBvYmpUeXBlLCAgIC8vIExJQlJBUlkgfCBMQVlFUiB8IFZJQSB8IFZJQVJVTEUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOT05ERUZBVUxUUlVMRSB8IE1BQ1JPIHwgUElOIAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogcHJvcE5hbWUsCi0gICAgICAgICAgICAgICBkb3VibGUgbGVmdFJhbmdlLCAgICAgIC8vIG9wdGlvbmFsKDApIC0gUkFOR0UgCi0gICAgICAgICAgICAgICBkb3VibGUgcmlnaHRSYW5nZSwgICAgIC8vIG9wdGlvbmFsKDApIAotICAgICAgICAgICAgICAgaW50ICAgIHByb3BWYWx1ZSk7ICAgICAvLyBvcHRpb25hbChOVUxMKSAKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydFByb3BEZWYuCi0vLyBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KLS8vIEl0IGFkZHMgcmVhbCBwcm9wZXJ0eSBkZWZpbml0aW9uIHRvIHRoZSBzdGF0ZW1lbnQuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoZSBvYmpUeXBlIGNhbiBiZSBMSUJSQVJZIG9yIFZJQSBvciBNQUNSTyBvciBQSU4uIAotZXh0ZXJuIGludCBsZWZ3UmVhbFByb3BEZWYoCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyKiBvYmpUeXBlLCAgIC8vIExJQlJBUlkgfCBMQVlFUiB8IFZJQSB8IFZJQVJVTEUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOT05ERUZBVUxUUlVMRSB8IE1BQ1JPIHwgUElOIAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogcHJvcE5hbWUsCi0gICAgICAgICAgICAgICBkb3VibGUgbGVmdFJhbmdlLCAgICAgIC8vIG9wdGlvbmFsKDApIC0gUkFOR0UgCi0gICAgICAgICAgICAgICBkb3VibGUgcmlnaHRSYW5nZSwgICAgIC8vIG9wdGlvbmFsKDApIAotICAgICAgICAgICAgICAgZG91YmxlIHByb3BWYWx1ZSk7ICAgICAvLyBvcHRpb25hbChOVUxMKSAKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydFByb3BEZWYuCi0vLyBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KLS8vIEl0IGFkZHMgc3RyaW5nIHByb3BlcnR5IGRlZmluaXRpb24gdG8gdGhlIHN0YXRlbWVudC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhlIG9ialR5cGUgY2FuIGJlIExJQlJBUlkgb3IgVklBIG9yIE1BQ1JPIG9yIFBJTi4gCi1leHRlcm4gaW50IGxlZndTdHJpbmdQcm9wRGVmKAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogb2JqVHlwZSwgICAgLy8gTElCUkFSWSB8IExBWUVSIHwgVklBIHwgVklBUlVMRSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgTk9OREVGQVVMVFJVTEUgfCBNQUNSTyB8IFBJTiAKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHByb3BOYW1lLAotICAgICAgICAgICAgICAgZG91YmxlIGxlZnRSYW5nZSwgICAgICAgLy8gb3B0aW9uYWwoMCkgLSBSQU5HRSAKLSAgICAgICAgICAgICAgIGRvdWJsZSByaWdodFJhbmdlLCAgICAgIC8vIG9wdGlvbmFsKDApIAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogcHJvcFZhbHVlKTsgLy8gb3B0aW9uYWwoTlVMTCkgCi0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbGVmd1N0YXJ0UHJvcERlZiBjYWxsIChpZiBhbnkpLgotLy8gVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndFbmRQcm9wRGVmKCk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd0luaXQuCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGUgcm91dGluZSBzdGFydHMgdGhlIHZpYSBzZWN0aW9uLiBBbGwgb2YgdGhlIHZpYXMgbXVzdCBmb2xsb3cuIAotZXh0ZXJuIGludCBsZWZ3U3RhcnRWaWEoY29uc3QgY2hhciogdmlhTmFtZSwKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGlzRGVmYXVsdCk7ICAgIC8vIG9wdGlvbmFsKE5VTEwpIC0gREVGQVVMVCAKLQotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLCBpdCBjYWxsIG9ubHkgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydFZpYS4KLS8vIEl0IGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3VmlhVG9wb2ZzdGFja29ubHkoKTsgICAgICAgLy8gVE9QT0ZTVEFDS09OTFkgCi0KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCwgaXQgY2FsbCBvbmx5IGJlIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRWaWEuCi0vLyBJdCBjYW4gb25seSBiZSBjYWxsZWQgb25jZS4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd1ZpYUZvcmVpZ24oY29uc3QgY2hhciogZm9yZWlnbk5hbWUsCi0gICAgICAgICAgICAgICBkb3VibGUgeGwsICAgICAgICAgICAgLy8gb3B0aW9uYWwoMCkgLSBwdCh4KSAKLSAgICAgICAgICAgICAgIGRvdWJsZSB5bCwgICAgICAgICAgICAvLyBvcHRpb25hbCgwKSAtIHB0KHkpIAotICAgICAgICAgICAgICAgaW50IG9yaWVudCk7ICAgICAgICAgIC8vIG9wdGlvbmFsKC0xKSAKLQotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLCBpdCBjYWxsIG9ubHkgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydFZpYS4KLS8vIEl0IGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGlzIHJvdXRpbmUgaXMgdGhlIHNhbWUgYXMgbGVmd1ZpYUZvcmVpZ24sIGV4Y2VwdCBvcmllbnQgaXMgYSBjaGFyKiAKLWV4dGVybiBpbnQgbGVmd1ZpYUZvcmVpZ25TdHIoY29uc3QgY2hhciogZm9yZWlnbk5hbWUsCi0gICAgICAgICAgICAgICBkb3VibGUgeGwsICAgICAgICAgICAgLy8gb3B0aW9uYWwoMCkgLSBwdCh4KSAKLSAgICAgICAgICAgICAgIGRvdWJsZSB5bCwgICAgICAgICAgICAvLyBvcHRpb25hbCgwKSAtIHB0KHkpIAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogb3JpZW50KTsgIC8vIG9wdGlvbmFsKCIiKSAKLQotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLCBpdCBjYWxsIG9ubHkgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydFZpYS4KLS8vIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgbGVmd1ZpYVZpYXJ1bGUgY2FuIGJlIGNhbGxlZCB3aXRoaW4gYSB2aWEuCi0vLyBJdCBjYW4gb25seSBiZSBjYWxsZWQgb25jZSBpbiBhIHZpYS4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd1ZpYVJlc2lzdGFuY2UoZG91YmxlIHJlc2lzdGFuY2UpOyAvLyBSRVNJU1RBTkNFIAotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0VmlhLgotLy8gSXQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd1ZpYUxheWVyKGNvbnN0IGNoYXIqIGxheWVyTmFtZSk7ICAvLyBMQVlFUiAKLQotLy8gVGhpcyByb3V0aW5lIGNhbiBjYWxsIG9ubHkgYWZ0ZXIgbGVmd1ZpYUxheWVyLgotLy8gRWl0aGVyIHRoaXMgcm91dGluZSBvciBsZWZ3VmlhTGF5ZXJQb2x5Z29uIGNhbiBiZSBjYWxsZWQgd2l0aGluIGEgbGF5ZXIKLS8vIEl0IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi0vLyBtYXNrIGlzIDUuOCBzeW50YXggIAotZXh0ZXJuIGludCBsZWZ3VmlhTGF5ZXJSZWN0KGRvdWJsZSB4MWwsICAgLy8gUkVDVCBwdDEoeCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHkxbCwgICAvLyBSRUNUIHB0MSh5KSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeDJsLCAgIC8vIFJFQ1QgcHQyKHgpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB5MmwsICAgLy8gUkVDVCBwdDIoeSkgCi0gICAgICAgICAgICAgICAgaW50IG1hc2sgPSAwKTsgCi0KLS8vIFRoaXMgcm91dGluZSBjYW4gY2FsbCBvbmx5IGFmdGVyIGxlZndWaWFMYXllci4KLS8vIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgbGVmd1ZpYUxheWVyUmVjdCBjYW4gYmUgY2FsbGVkIHdpdGhpbiBhIGxheWVyCi0vLyBJdCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgotLy8gVGhpcyBpcyBhIDUuNiBzeW50YXguCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi0vLyBtYXNrIGlzIDUuOCBzeW50YXggIAotZXh0ZXJuIGludCBsZWZ3VmlhTGF5ZXJQb2x5Z29uKGludCBudW1fcG9seXMsIGRvdWJsZSogeGwsIGRvdWJsZSogeWwsCi0gICAgICAgICAgICAgICAgICAgaW50IG1hc2sgPSAwKTsKLQotLy8gVGhpcyByb3V0aW5lIGNhbiBjYWxsIG9ubHkgYWZ0ZXIgbGVmd1N0YXJ0VmlhLgotLy8gRWl0aGVyIHRoaXMgcm91dGluZSBvciBsZWZ3VmlhUmVzaXN0YW5jZSBjYW4gYmUgY2FsbGVkIHdpdGhpbiBhIHZpYS4KLS8vIEl0IGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlIGluIGEgdmlhLgotLy8gVGhpcyBpcyBhIDUuNiBzeW50YXguCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndWaWFWaWFydWxlKGNvbnN0IGNoYXIqIHZpYVJ1bGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeEN1dFNpemUsIGRvdWJsZSB5Q3V0U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYm90TWV0YWxMYXllciwgY29uc3QgY2hhciogY3V0TGF5ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRvcE1ldGFsTGF5ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB4Q3V0U3BhY2luZywgZG91YmxlIHlDdXRTcGFjaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeEJvdEVuYywgZG91YmxlIHlCb3RFbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB4VG9wRW5jLCBkb3VibGUgeVRvcEVuYyk7Ci0KLS8vIFRoaXMgcm91dGluZSBjYW4gY2FsbCBvbmx5IGFmdGVyIGxlZndWaWFWaWFydWxlLgotLy8gSXQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuCi0vLyBUaGlzIGlzIGEgNS42IHN5bnRheC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd1ZpYVZpYXJ1bGVSb3dDb2woaW50IG51bUN1dFJvd3MsIGludCBudW1DdXRDb2xzKTsKLQotLy8gVGhpcyByb3V0aW5lIGNhbiBjYWxsIG9ubHkgYWZ0ZXIgbGVmd1ZpYVZpYXJ1bGUuCi0vLyBJdCBjYW4gb25seSBiZSBjYWxsZWQgb25jZS4KLS8vIFRoaXMgaXMgYSA1LjYgc3ludGF4LgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3VmlhVmlhcnVsZU9yaWdpbihkb3VibGUgeE9mZnNldCwgZG91YmxlIHlPZmZzZXQpOwotCi0vLyBUaGlzIHJvdXRpbmUgY2FuIGNhbGwgb25seSBhZnRlciBsZWZ3VmlhVmlhcnVsZS4KLS8vIEl0IGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLgotLy8gVGhpcyBpcyBhIDUuNiBzeW50YXguCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndWaWFWaWFydWxlT2Zmc2V0KGRvdWJsZSB4Qm90T2Zmc2V0LCBkb3VibGUgeUJvdE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHhUb3BPZmZzZXQsIGRvdWJsZSB5VG9wT2Zmc2V0KTsKLQotLy8gVGhpcyByb3V0aW5lIGNhbiBjYWxsIG9ubHkgYWZ0ZXIgbGVmd1ZpYVZpYXJ1bGUuCi0vLyBJdCBjYW4gb25seSBiZSBjYWxsZWQgb25jZS4KLS8vIFRoaXMgaXMgYSA1LjYgc3ludGF4LgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3VmlhVmlhcnVsZVBhdHRlcm4oY29uc3QgY2hhciogY3V0UGF0dGVybik7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1ZpYS4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCwgaXQgYWRkcyBzdHJpbmcgcHJvcGVydHkgdG8gdGhlIHN0YXRlbWVudC4KLS8vIEl0IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndTdHJpbmdQcm9wZXJ0eShjb25zdCBjaGFyKiBwcm9wTmFtZSwgY29uc3QgY2hhciogcHJvcFZhbHVlKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3VmlhLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLCBpdCBhZGRzIHJlYWwgcHJvcGVydHkgdG8gdGhlIHN0YXRlbWVudC4KLS8vIEl0IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndSZWFsUHJvcGVydHkoY29uc3QgY2hhciogcHJvcE5hbWUsIGRvdWJsZSBwcm9wVmFsdWUpOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndWaWEuCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwsIGl0IGFkZHMgaW50IHByb3BlcnR5IHRvIHRoZSBzdGF0ZW1lbnQuCi0vLyBJdCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3SW50UHJvcGVydHkoY29uc3QgY2hhciogcHJvcE5hbWUsIGludCBwcm9wVmFsdWUpOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxlZndTdGFydFZpYSBjYWxsIChpZiBhbnkpLgotLy8gVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndFbmRWaWEoY29uc3QgY2hhciogdmlhTmFtZSk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd0luaXQuCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYXMgYSBzZXQgd2l0aCBsZWZ3VmlhUnVsZUxheWVyLCBsZWZ3VmlhUnVsZVZpYQotLy8gYW5kIGxlZndFbmRWaWFSdWxlCi0vLyBtdWx0aXBsZSB0aW1lcy4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhlIHJvdXRpbmUgc3RhcnRzIHRoZSB2aWEgcnVsZSBzZWN0aW9uLiBUaGUgdmlhIHJ1bGUgZGF0YSBhbmQgaXRzIHByb3BlcnR5Ci0vLyBtdXN0IGZvbGxvdyAKLWV4dGVybiBpbnQgbGVmd1N0YXJ0VmlhUnVsZShjb25zdCBjaGFyKiB2aWFSdWxlTmFtZSk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0VmlhUnVsZS4KLS8vIFRoaXMgcm91dGluZSBoYXMgdG8gYmUgY2FsbGVkIDIgdGltZXMgZXhhY3QuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoZSBkaXJlY3Rpb24xIG9yIGRpcmVjdGlvbjIgY2FuIGJlIEhPUklaT05UQUwgb3IgVkVSVElDQUwuIAotZXh0ZXJuIGludCBsZWZ3VmlhUnVsZUxheWVyKAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogbGF5ZXJOYW1lLAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGlyZWN0aW9uLCAgICAvLyBIT1JJWk9OVEFMIHwgVkVSVElDQUwgCi0gICAgICAgICAgICAgICBkb3VibGUgbWluV2lkdGgsICAgICAgICAgIC8vIG9wdGlvbmFsKDApIC0gV0lEVEggCi0gICAgICAgICAgICAgICBkb3VibGUgbWF4V2lkdGgsICAgICAgICAgIC8vIG9wdGlvbmFsKDApIC0gV0lEVEggCi0gICAgICAgICAgICAgICBkb3VibGUgb3ZlcmhhbmcsICAgICAgICAgIC8vIG9wdGlvbmFsKDApIC0gT1ZFUkhBTkcgCi0gICAgICAgICAgICAgICBkb3VibGUgbWV0YWxPdmVyaGFuZyk7ICAgIC8vIG9wdGlvbmFsKDApIC0gTUVUQUxPVkVSSEFORyAKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3VmlhUnVsZUxheWVyIGlzIGNhbGxlZCB0d2ljZS4KLS8vIFRoaXMgcm91dGluZSBpcyByZXF1aXJlZCBpbiBhIHZpYXJ1bGUgYW5kIGNhbiBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoZSBkaXJlY3Rpb24xIG9yIGRpcmVjdGlvbjIgY2FuIGJlIEhPUklaT05UQUwgb3IgVkVSVElDQUwuIAotZXh0ZXJuIGludCBsZWZ3VmlhUnVsZVZpYSgKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZpYU5hbWUpOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxlZndTdGFydFZpYVJ1bGUgY2FsbCAoaWYgYW55KS4KLS8vIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBsZWZ3U3RhcnRWaWFSdWxlLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3RW5kVmlhUnVsZShjb25zdCBjaGFyKiB2aWFSdWxlTmFtZSk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd0luaXQuCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYXMgYSBzZXQgd2l0aCBsZWZ3VmlhUnVsZUdlbkxheWVyLAotLy8gbGVmd1ZpYVJ1bGVHZW5MYXllcjMsIGFuZCBsZWZ3RW5kVmlhUnVsZUdlbiBtdWx0aXBsZSB0aW1lcy4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhlIHJvdXRpbmUgc3RhcnRzIHRoZSB2aWEgcnVsZSBzZWN0aW9uLiBUaGUgdmlhIHJ1bGUgZGF0YSBhbmQgaXRzIHByb3BlcnR5Ci0vLyBtdXN0IGZvbGxvdyAKLWV4dGVybiBpbnQgbGVmd1N0YXJ0VmlhUnVsZUdlbihjb25zdCBjaGFyKiB2aWFSdWxlTmFtZSk7Ci0gCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTYXJ0VmlhUnVsZUdlbi4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbAotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwgIAotZXh0ZXJuIGludCBsZWZ3VmlhUnVsZUdlbkRlZmF1bHQoKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRWaWFSdWxlR2VuLgotLy8gVGhpcyByb3V0aW5lIGhhcyB0byBiZSBjYWxsZWQgMiB0aW1lcyBleGFjdC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gRWl0aGVyIHRoaXMgcm91dGluZSBvciBsZWZ3VmlhUnVsZUdlbkxheWVyRW5jbG9zdXJlLCBub3QgYm90aC4KLS8vIFRoZSBkaXJlY3Rpb24xIG9yIGRpcmVjdGlvbjIgY2FuIGJlIEhPUklaT05UQUwgb3IgVkVSVElDQUwuIAotZXh0ZXJuIGludCBsZWZ3VmlhUnVsZUdlbkxheWVyKAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogbGF5ZXJOYW1lLAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGlyZWN0aW9uLCAgICAvLyBIT1JJWk9OVEFMIHwgVkVSVElDQUwgCi0gICAgICAgICAgICAgICBkb3VibGUgbWluV2lkdGgsICAgICAgICAgIC8vIG9wdGlvbmFsKDApIC0gV0lEVEggCi0gICAgICAgICAgICAgICBkb3VibGUgbWF4V2lkdGgsICAgICAgICAgIC8vIG9wdGlvbmFsKDApIC0gV0lEVEggCi0gICAgICAgICAgICAgICBkb3VibGUgb3ZlcmhhbmcsICAgICAgICAgIC8vIG9wdGlvbmFsKDApIC0gT1ZFUkhBTkcgCi0gICAgICAgICAgICAgICBkb3VibGUgbWV0YWxPdmVyaGFuZyk7ICAgIC8vIG9wdGlvbmFsKDApIC0gTUVUQUxPVkVSSEFORyAKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRWaWFSdWxlR2VuLgotLy8gVGhpcyByb3V0aW5lIGhhcyB0byBiZSBjYWxsZWQgMiB0aW1lcyBleGFjdC4KLS8vIFRoaXMgaXMgNS41IHN5bnRheAotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGxlZndWaWFSdWxlR2VuTGF5ZXIsIG5vdCBib3RoLiAKLWV4dGVybiBpbnQgbGVmd1ZpYVJ1bGVHZW5MYXllckVuY2xvc3VyZSgKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGxheWVyTmFtZSwKLSAgICAgICAgICAgICAgIGRvdWJsZSBvdmVyaGFuZzEsCi0gICAgICAgICAgICAgICBkb3VibGUgb3ZlcmhhbmcyLAotICAgICAgICAgICAgICAgZG91YmxlIG1pbldpZHRoLCAgICAgICAgICAvLyBvcHRpb25hbCgwKSAtIFdJRFRIIAotICAgICAgICAgICAgICAgZG91YmxlIG1heFdpZHRoKTsgICAgICAgICAvLyBvcHRpb25hbCgwKSAtIFdJRFRIIAotIAotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3VmlhUnVsZUxheWVyR2VuIGlzIGNhbGxlZCB0d2ljZS4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBpbiBhIHZpYXJ1bGUgZ2VuZXJhdGUgYW5kIGNhbiBiZSBjYWxsZWQgb25jZS4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhlIGRpcmVjdGlvbjEgb3IgZGlyZWN0aW9uMiBjYW4gYmUgSE9SSVpPTlRBTCBvciBWRVJUSUNBTC4gCi1leHRlcm4gaW50IGxlZndWaWFSdWxlR2VuTGF5ZXIzKAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogbGF5ZXJOYW1lLAotICAgICAgICAgICAgICAgZG91YmxlIHhsLCBkb3VibGUgeWwsICAgICAgLy8gUkVDVCBwdDEoeCksIHB0MSh5KSAKLSAgICAgICAgICAgICAgIGRvdWJsZSB4aCwgZG91YmxlIHloLCAgICAgIC8vIFJFQ1QgcHQyKHgpLCBwdDIoeSkgCi0gICAgICAgICAgICAgICBkb3VibGUgeFNwYWNpbmcsIGRvdWJsZSB5U3BhY2luZywgLy8gU1BBQ0lORyB4IGFuZCB5IAotICAgICAgICAgICAgICAgZG91YmxlIHJlc2lzdGFuY2UpOyAgICAgICAgLy8gb3B0aW9uYWwoMCkgLSBSRVNJU1RBTkNFIAotIAotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBsZWZ3U3RhcnRWaWFSdWxlR2VuIGNhbGwgKGlmIGFueSkuCi0vLyBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgbGVmd1N0YXJ0VmlhUnVsZUdlbi4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0VuZFZpYVJ1bGVHZW4oY29uc3QgY2hhciogdmlhUnVsZU5hbWUpOwotIAotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndJbml0LgotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIG9ubHkgb25jZS4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhlIHJvdXRpbmUgc3RhcnRzIHRoZSBub25EZWZhdWx0UnVsZSBzZWN0aW9uLiBUaGUgbm9uRGVmYXVsdFJ1bGUgbGF5ZXJzCi0vLyBtdXN0IGZvbGxvdyAKLWV4dGVybiBpbnQgbGVmd1N0YXJ0Tm9uRGVmYXVsdFJ1bGUoY29uc3QgY2hhciogcnVsZU5hbWUpOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndJbml0LgotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydE5vbkRlZmF1bHRSdWxlCi0vLyBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd05vbkRlZmF1bHRSdWxlTGF5ZXIoY29uc3QgY2hhciogcm91dGluZ0xheWVyTmFtZSwKLSAgICAgICAgICAgICAgIGRvdWJsZSB3aWR0aCwgICAgICAgICAgIC8vIFdJRFRIIAotICAgICAgICAgICAgICAgZG91YmxlIG1pblNwYWNpbmcsICAgICAgLy8gTUlOU1BBQ0lORyAKLSAgICAgICAgICAgICAgIGRvdWJsZSB3aXJlRXh0ZW5zaW9uLCAgIC8vIG9wdGluYWwoMCkgLSBXSVJFRVhURU5TSU9OIAotICAgICAgICAgICAgICAgZG91YmxlIHJlc2lzdGFuY2UsICAgICAgLy8gb3B0aW5hbCgwKSAtIFJFU0lTVEFOQ0UgUlBFUlEgCi0gICAgICAgICAgICAgICBkb3VibGUgY2FwYWNpdGFuY2UsICAgICAvLyBvcHRpbmFsKDApIC0gQ0FQQUNJVEFOQ0UgQ1BFUlNRRElTVAotICAgICAgICAgICAgICAgZG91YmxlIGVkZ2VDYXApOyAgICAgICAgLy8gb3B0aW5hbCgwKSAtIEVER0VDQVBBQ0lUQU5DRSAKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3SW5pdC4KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnROb25EZWZhdWx0UnVsZQotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBpdCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd05vbkRlZmF1bHRSdWxlSGFyZHNwYWNpbmcoKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnROb25EZWZhdWx0UnVsZS4KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgZm9yIGVhY2ggdmlhIHNlY3Rpb24uCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoZSByb3V0aW5lIHN0YXJ0cyB0aGUgbm9uZGVmYXVsdHJ1bGUgdmlhIHNlY3Rpb24uCi0vLyBDYWxsIHRoZSBmb2xsb3dpbmcgdmlhIGZ1bmN0aW9ucyBmb3IgdGhlIHJlc3Qgb2YgTk9OREVGQVVMVFJVTEUgVklBOgotLy8gICBsZWZ3VmlhVG9wb2ZzdGFja29ubHkKLS8vICAgbGVmd1ZpYUZvcmVpZ24KLS8vICAgbGVmd1ZpYUZvcmVpZ25TdHIKLS8vICAgbGVmd1ZpYVJlc2lzdGFuY2UKLS8vICAgbGVmd1ZpYUxheWVyCi0vLyAgIGxlZndWaWFMYXllclJlY3QKLS8vICAgbGVmd05vbkRlZmF1bHRSdWxlRW5kVmlhIAotZXh0ZXJuIGludCBsZWZ3Tm9uRGVmYXVsdFJ1bGVTdGFydFZpYShjb25zdCBjaGFyKiB2aWFOYW1lLAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogaXNEZWZhdWx0KTsgICAgLy8gb3B0aW9uYWwoTlVMTCkgLSBERUZBVUxUIAotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxlZndOb25EZWZhdWx0UnVsZVN0YXJ0VmlhIGNhbGwuCi0vLyBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgdmlhIHNlY3Rpb24uCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndOb25EZWZhdWx0UnVsZUVuZFZpYShjb25zdCBjaGFyKiB2aWFOYW1lKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnROb25EZWZhdWx0UnVsZS4KLS8vIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3Tm9uRGVmYXVsdFJ1bGVVc2VWaWEoY29uc3QgY2hhciogdmlhTmFtZSk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0Tm9uRGVmYXVsdFJ1bGUuCi0vLyBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd05vbkRlZmF1bHRSdWxlVXNlVmlhUnVsZShjb25zdCBjaGFyKiB2aWFSdWxlTmFtZSk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0Tm9uRGVmYXVsdFJ1bGUuCi0vLyBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd05vbkRlZmF1bHRSdWxlTWluQ3V0cyhjb25zdCBjaGFyKiBsYXllck5hbWUsIGludCBudW1DdXRzKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBsZWZ3U3RhcnROb25EZWZhdWx0UnVsZSBjYWxsIChpZiBhbnkpLgotLy8gVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndFbmROb25EZWZhdWx0UnVsZShjb25zdCBjaGFyKiBydWxlTmFtZSk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd0luaXQuCi0vLyBUaGlzIHNlY3Rpb24gb2Ygcm91dGluZXMgaXMgb3B0aW9uYWwuCi0vLyBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIEl0IHN0YXJ0cyB0aGUgc3BhY2luZyBzZWN0aW9uLiAKLWV4dGVybiBpbnQgbGVmd1N0YXJ0U3BhY2luZygpOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0U3BhY2luZy4KLS8vIEl0IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoZSBzdGFjayBoYXMgdG8gYmUgU1RBQ0suIAotZXh0ZXJuIGludCBsZWZ3U3BhY2luZyhjb25zdCBjaGFyKiBsYXllck5hbWUxLAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogbGF5ZXJOYW1lMiwKLSAgICAgICAgICAgICAgIGRvdWJsZSBtaW5TcGFjZSwKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN0YWNrKTsgICAgICAgIC8vIG9wdGlvbmFsKE5VTEwpIAotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxlZndTdGFydFNwYWNpbmcgY2FsbCAoaWYgYW55KS4KLS8vIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3RW5kU3BhY2luZygpOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndJbml0LgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBpdCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAKLWV4dGVybiBpbnQgbGVmd1VuaXZlcnNhbE5vaXNlTWFyZ2luIChkb3VibGUgaGlnaCwgZG91YmxlIGxvdyk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd0luaXQuCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGl0IGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuIAotZXh0ZXJuIGludCBsZWZ3RWRnZVJhdGVUaHJlc2hvbGQxIChkb3VibGUgbnVtKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3SW5pdC4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgaXQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gCi1leHRlcm4gaW50IGxlZndFZGdlUmF0ZVRocmVzaG9sZDIgKGRvdWJsZSBudW0pOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndJbml0LgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBpdCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAKLWV4dGVybiBpbnQgbGVmd0VkZ2VSYXRlU2NhbGVGYWN0b3IgKGRvdWJsZSBudW0pOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndJbml0LgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBpdCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhpcyByb3V0aW5lIHN0YXJ0cyB0aGUgbm9pc2V0YWJsZSBzZWN0aW9uLgotLy8gVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAKLWV4dGVybiBpbnQgbGVmd1N0YXJ0Tm9pc2VUYWJsZShpbnQgbnVtKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnROb2lzZVRhYmxlIG9yIGxlZndTdGFydENvcnJlY3RUYWJsZS4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgaXQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcwotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuIAotZXh0ZXJuIGludCBsZWZ3RWRnZVJhdGUoZG91YmxlIG51bSkgOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndFZGdlUmF0ZS4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgaXQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UgaW5zaWRlIGxlZndFZGdlUmF0ZS4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAKLWV4dGVybiBpbnQgbGVmd091dHB1dFJlc2lzdGFuY2UoaW50IG51bVJlc2lzdHMsIGRvdWJsZSogcmVzaXN0YW5jZSk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd091dHB1dFJlc2lzdGFuY2UuCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGl0IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgaW5zaWRlCi0vLyBsZWZ3T3V0cHV0UmVzaXN0YW5jZQotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuIAotZXh0ZXJuIGludCBsZWZ3VmljdGltcyhpbnQgbGVuZ3RoLCBpbnQgbnVtTm9pc2VzLCBkb3VibGUqIG5vaXNlcyk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbGVmd1N0YXJ0Tm9pc2VUYWJsZSBjYWxsIChpZiBhbnkpLgotLy8gVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UgcGVyIHNlY3Rpb24uCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gCi1leHRlcm4gaW50IGxlZndFbmROb2lzZVRhYmxlKCk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd0luaXQuCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGl0IGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGlzIHJvdXRpbmUgc3RhcnRzIHRoZSBjb3JyZWN0VGFibGUgc2VjdGlvbi4KLS8vIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gCi1leHRlcm4gaW50IGxlZndTdGFydENvcnJlY3RUYWJsZShpbnQgbnVtKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBsZWZ3U3RhcnRDb3JyZWN0VGFibGUgY2FsbCAoaWYgYW55KS4KLS8vIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBzZWN0aW9uLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuIAotZXh0ZXJuIGludCBsZWZ3RW5kQ29ycmVjdFRhYmxlKCk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd0luaXQuCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGl0IGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TWluRmVhdHVyZSAoZG91YmxlIHgsIGRvdWJsZSB5KTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3SW5pdC4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgaXQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gCi0vLyBleHRlcm4gaW50IGxlZndEaWVsZWN0cmljIChmbG9hdCBkaWVsZWN0cmljKTsgCi0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd0luaXQuCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGl0IGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGlzIHJvdXRpbmUgc3RhcnRzIHRoZSBpcmRyb3Agc2VjdGlvbi4KLS8vIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gCi1leHRlcm4gaW50IGxlZndTdGFydElyZHJvcCgpOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0SXJkcm9wLgotLy8gSXQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhlIGN1cnJlbnRzTnZvbHRzIGlzIGEgbGlzdCBvZiBjdXJyZW50IGFuZCB2b2x0cy4KLS8vIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gCi1leHRlcm4gaW50IGxlZndJcmRyb3BUYWJsZShjb25zdCBjaGFyKiB0YWJsZU5hbWUsIGNvbnN0IGNoYXIqIGN1cnJlbnRzTnZvbHRzKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBsZWZ3U3RhcnRJcmRyb3AgY2FsbCAoaWYgYW55KS4KLS8vIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuIAotZXh0ZXJuIGludCBsZWZ3RW5kSXJkcm9wKCk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3SW5pdC4KLS8vIEl0IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoZSBjbGFzc1R5cGUgY2FuIGJlIFBBRCBvciBDT1JFLgotLy8gVGhlIHN5bW1ldHJ5IGNhbiBiZSBhIGxpc3Qgb2YgWCBvciBZIG9yIFI5MC4gCi1leHRlcm4gaW50IGxlZndTaXRlKGNvbnN0IGNoYXIqIHNpdGVOYW1lLCBjb25zdCBjaGFyKiBjbGFzc1R5cGUsCi0gICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN5bW1ldHJ5LCBkb3VibGUgd2lkdGgsIGRvdWJsZSBoZWlnaHQpOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd1NpdGUuCi0vLyBJdCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgotLy8gVGhpcyBpcyBhIDUuNiBzeW50YXguCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndTaXRlUm93UGF0dGVybihjb25zdCBjaGFyKiBzaXRlTmFtZSwgaW50IG9yaWVudCk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U2l0ZS4KLS8vIEl0IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCi0vLyBUaGlzIGlzIGEgNS42IHN5bnRheC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhpcyByb3V0aW5lIGlzIHRoZSBzYW1lIGFzIGxlZndTaXRlUm93UGF0dGVybiwgZXhjZXB0IG9yaWVudCBpcyBhIGNoYXIqIAotZXh0ZXJuIGludCBsZWZ3U2l0ZVJvd1BhdHRlcm5TdHIoY29uc3QgY2hhciogc2l0ZU5hbWUsIGNvbnN0IGNoYXIgKm9yaWVudCk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbGVmd1NpdGUgY2FsbCAoaWYgYW55KS4KLS8vIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIGFmdGVyIGxlZndTaXRlLgotLy8gVGhpcyBpcyBhIDUuNCBzeW50YXguCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndFbmRTaXRlKGNvbnN0IGNoYXIqIHNpdGVOYW1lKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3SW5pdC4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgaXQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhpcyByb3V0aW5lIHN0YXJ0cyB0aGUgYXJyYXkgc2VjdGlvbi4gCi1leHRlcm4gaW50IGxlZndTdGFydEFycmF5KGNvbnN0IGNoYXIqIGFycmF5TmFtZSk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0QXJyYXkuIAotLy8gRWl0aGVyIHRoaXMgcm91dGluZSwgbGVmd0FycmF5Q2FucGxhY2UsIGxlZndBcnJheUNhbm5vdG9jY3VweSwKLS8vIGxlZndBcnJheVRyYWNrcywgb3IgbGVmd1N0YXJ0QXJyYXlGbG9vcnBsYW4gbXVzdCBiZSBjYWxsZWQgYXQgbGVhc3Qgb25jZS4KLS8vIEl0IGNhbiBiZSBjYWxsIG11bHRpcGxlIHRpbWVzLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3QXJyYXlTaXRlKGNvbnN0IGNoYXIqIG5hbWUsIGRvdWJsZSBvcmlnWCwgZG91YmxlIG9yaWdZLAotICAgICAgICAgICAgICAgaW50IG9yaWVudCwgZG91YmxlIG51bVgsIGRvdWJsZSBudW1ZLCBkb3VibGUgc3BhY2VYLAotICAgICAgICAgICAgICAgZG91YmxlIHNwYWNlWSk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0QXJyYXkuIAotLy8gRWl0aGVyIHRoaXMgcm91dGluZSwgbGVmd0FycmF5Q2FucGxhY2UsIGxlZndBcnJheUNhbm5vdG9jY3VweSwKLS8vIGxlZndBcnJheVRyYWNrcywgb3IgbGVmd1N0YXJ0QXJyYXlGbG9vcnBsYW4gbXVzdCBiZSBjYWxsZWQgYXQgbGVhc3Qgb25jZS4KLS8vIEl0IGNhbiBiZSBjYWxsIG11bHRpcGxlIHRpbWVzLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGlzIHJvdXRpbmUgaXMgdGhlIHNhbWUgYXMgbGVmd0FycmF5U2l0ZSwgZXhjZXB0IG9yaWVudCBpcyBhIGNoYXIqIAotZXh0ZXJuIGludCBsZWZ3QXJyYXlTaXRlU3RyKGNvbnN0IGNoYXIqIG5hbWUsIGRvdWJsZSBvcmlnWCwgZG91YmxlIG9yaWdZLAotICAgICAgICAgICAgICAgY29uc3QgY2hhciAqb3JpZW50LCBkb3VibGUgbnVtWCwgZG91YmxlIG51bVksIGRvdWJsZSBzcGFjZVgsCi0gICAgICAgICAgICAgICBkb3VibGUgc3BhY2VZKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRBcnJheS4gCi0vLyBFaXRoZXIgdGhpcyByb3V0aW5lLCBsZWZ3QXJyYXlTaXRlLCBsZWZ3QXJyYXlDYW5ub3RvY2N1cHksCi0vLyBsZWZ3QXJyYXlUcmFja3MsIG9yIGxlZndTdGFydEFycmF5Rmxvb3JwbGFuIG11c3QgYmUgY2FsbGVkIGF0IGxlYXN0IG9uY2UuCi0vLyBJdCBjYW4gYmUgY2FsbCBtdWx0aXBsZSB0aW1lcy4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0FycmF5Q2FucGxhY2UoY29uc3QgY2hhciogbmFtZSwgZG91YmxlIG9yaWdYLCBkb3VibGUgb3JpZ1ksCi0gICAgICAgICAgICAgICBpbnQgb3JpZW50LCBkb3VibGUgbnVtWCwgZG91YmxlIG51bVksIGRvdWJsZSBzcGFjZVgsCi0gICAgICAgICAgICAgICBkb3VibGUgc3BhY2VZKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRBcnJheS4gCi0vLyBFaXRoZXIgdGhpcyByb3V0aW5lLCBsZWZ3QXJyYXlTaXRlLCBsZWZ3QXJyYXlDYW5ub3RvY2N1cHksCi0vLyBsZWZ3QXJyYXlUcmFja3MsIG9yIGxlZndTdGFydEFycmF5Rmxvb3JwbGFuIG11c3QgYmUgY2FsbGVkIGF0IGxlYXN0IG9uY2UuCi0vLyBJdCBjYW4gYmUgY2FsbCBtdWx0aXBsZSB0aW1lcy4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhpcyByb3V0aW5lIGlzIHRoZSBzYW1lIGFzIGxlZndBcnJheUNhbnBsYWNlLCBleGNlcHQgb3JpZW50IGlzIGEgY2hhciogCi1leHRlcm4gaW50IGxlZndBcnJheUNhbnBsYWNlU3RyKGNvbnN0IGNoYXIqIG5hbWUsIGRvdWJsZSBvcmlnWCwgZG91YmxlIG9yaWdZLAotICAgICAgICAgICAgICAgY29uc3QgY2hhciAqb3JpZW50LCBkb3VibGUgbnVtWCwgZG91YmxlIG51bVksIGRvdWJsZSBzcGFjZVgsCi0gICAgICAgICAgICAgICBkb3VibGUgc3BhY2VZKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRBcnJheS4gCi0vLyBFaXRoZXIgdGhpcyByb3V0aW5lLCBsZWZ3QXJyYXlTaXRlLCBsZWZ3QXJyYXlDYW5wbGFjZSwKLS8vIGxlZndBcnJheVRyYWNrcywgb3IgbGVmd1N0YXJ0QXJyYXlGbG9vcnBsYW4gbXVzdCBiZSBjYWxsZWQgYXQgbGVhc3Qgb25jZS4KLS8vIEl0IGNhbiBiZSBjYWxsIG11bHRpcGxlIHRpbWVzLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3QXJyYXlDYW5ub3RvY2N1cHkoY29uc3QgY2hhciogbmFtZSwgZG91YmxlIG9yaWdYLCBkb3VibGUgb3JpZ1ksCi0gICAgICAgICAgICAgICBpbnQgb3JpZW50LCBkb3VibGUgbnVtWCwgZG91YmxlIG51bVksIGRvdWJsZSBzcGFjZVgsCi0gICAgICAgICAgICAgICBkb3VibGUgc3BhY2VZKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRBcnJheS4gCi0vLyBFaXRoZXIgdGhpcyByb3V0aW5lLCBsZWZ3QXJyYXlTaXRlLCBsZWZ3QXJyYXlDYW5wbGFjZSwKLS8vIGxlZndBcnJheVRyYWNrcywgb3IgbGVmd1N0YXJ0QXJyYXlGbG9vcnBsYW4gbXVzdCBiZSBjYWxsZWQgYXQgbGVhc3Qgb25jZS4KLS8vIEl0IGNhbiBiZSBjYWxsIG11bHRpcGxlIHRpbWVzLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGlzIHJvdXRpbmUgaXMgdGhlIHNhbWUgYXMgbGVmd0FycmF5VHJhY2tzLCBleGNlcHQgb3JpZW50IGlzIGEgY2hhciogCi1leHRlcm4gaW50IGxlZndBcnJheUNhbm5vdG9jY3VweVN0cihjb25zdCBjaGFyKiBuYW1lLCBkb3VibGUgb3JpZ1gsCi0gICAgICAgICAgICAgICBkb3VibGUgb3JpZ1ksIGNvbnN0IGNoYXIgKm9yaWVudCwgZG91YmxlIG51bVgsIGRvdWJsZSBudW1ZLAotICAgICAgICAgICAgICAgZG91YmxlIHNwYWNlWCwgZG91YmxlIHNwYWNlWSk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0QXJyYXkuIAotLy8gRWl0aGVyIHRoaXMgcm91dGluZSwgbGVmd0FycmF5U2l0ZSwgbGVmd0FycmF5Q2FucGxhY2UsIGxlZndBcnJheUNhbm5vdG9jY3VweSwKLS8vIG9yIGxlZndTdGFydEFycmF5Rmxvb3JwbGFuIG11c3QgYmUgY2FsbGVkIGF0IGxlYXN0IG9uY2UuCi0vLyBJdCBjYW4gYmUgY2FsbCBtdWx0aXBsZSB0aW1lcy4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0FycmF5VHJhY2tzKGNvbnN0IGNoYXIqIHh5LCBkb3VibGUgc3RhcnQsIGludCBudW1UcmFja3MsCi0gICAgICAgICAgICAgICBkb3VibGUgc3BhY2UsIGNvbnN0IGNoYXIqIGxheWVycyk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0QXJyYXkuIAotLy8gRWl0aGVyIHRoaXMgcm91dGluZSwgbGVmd0FycmF5U2l0ZSwgbGVmd0FycmF5Q2FucGxhY2UsIGxlZndBcnJheUNhbm5vdG9jY3VweSwKLS8vIG9yIGxlZndBcnJheVRyYWNrcyBtdXN0IGJlIGNhbGxlZCBhdCBsZWFzdCBvbmNlLgotLy8gSXQgY2FuIGJlIGNhbGwgbXVsdGlwbGUgdGltZXMuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoZSByb3V0aW5lIHN0YXJ0cyB0aGUgYXJyYXkgZmxvb3JwbGFuIHNlY3Rpb24gCi1leHRlcm4gaW50IGxlZndTdGFydEFycmF5Rmxvb3JwbGFuKGNvbnN0IGNoYXIqIG5hbWUpOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0QXJyYXlGbG9vcnBsYW4uCi0vLyBJdCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGUgc2l0ZSBjYW4gYmUgQ0FOUExBQ0Ugb3IgQ0FOTk9UT0NDVVBZIAotZXh0ZXJuIGludCBsZWZ3QXJyYXlGbG9vcnBsYW4oY29uc3QgY2hhciogc2l0ZSwgY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBvcmlnWCwgZG91YmxlIG9yaWdZLCBpbnQgb3JpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bVgsIGludCBudW1ZLCBkb3VibGUgc3BhY2VYLCBkb3VibGUgc3BhY2VZKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndTdGFydEFycmF5Rmxvb3JwbGFuLgotLy8gSXQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhlIHNpdGUgY2FuIGJlIENBTlBMQUNFIG9yIENBTk5PVE9DQ1VQWQotLy8gVGhpcyByb3V0aW5lIGlzIHRoZSBzYW1lIGFzIGxlZndBcnJheUZsb29ycGxhbiwgZXhjZXB0IG9yaWVudCBpcyBhIGNoYXIqIAotZXh0ZXJuIGludCBsZWZ3QXJyYXlGbG9vcnBsYW5TdHIoY29uc3QgY2hhciogc2l0ZSwgY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBvcmlnWCwgZG91YmxlIG9yaWdZLCBjb25zdCBjaGFyICpvcmllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtWCwgaW50IG51bVksIGRvdWJsZSBzcGFjZVgsIGRvdWJsZSBzcGFjZVkpOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxlZndTdGFydEFycmF5Rmxvb3JwbGFuIGNhbGwgKGlmIGFueSkuCi0vLyBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgc2VjdGlvbi4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0VuZEFycmF5Rmxvb3JwbGFuKGNvbnN0IGNoYXIqIG5hbWUpOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydEFycmF5LgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLgotLy8gSXQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhlIHh5IGNhbiBiZSBYIG9yIFkuIAotZXh0ZXJuIGludCBsZWZ3QXJyYXlHY2VsbGdyaWQoY29uc3QgY2hhciogeHksIGRvdWJsZSBzdGFydFhZLCBpbnQgY29sUm93cywgCi0gICAgICAgICAgICAgICBkb3VibGUgc3BhY2VYWSk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0QXJyYXkuCi0vLyBUaGlzIHNlY3Rpb24gb2Ygcm91dGluZXMgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsIG9ubHkgb25jZS4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhlIHJvdXRpbmUgc3RhcnRzIHRoZSBhcnJheSBkZWZhdWx0Y2FwIHNlY3Rpb24gCi1leHRlcm4gaW50IGxlZndTdGFydEFycmF5RGVmYXVsdENhcChpbnQgc2l6ZSk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRBcnJheURlZmF1bHRDYXAuCi0vLyBJdCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3QXJyYXlEZWZhdWx0Q2FwKGRvdWJsZSBudW1QaW5zLCBkb3VibGUgY2FwKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBsZWZ3U3RhcnRBcnJheURlZmF1bHRDYXAgY2FsbCAoaWYgYW55KS4KLS8vIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3RW5kQXJyYXlEZWZhdWx0Q2FwKCk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbGVmd1N0YXJ0QXJyYXkgY2FsbCAoaWYgYW55KS4KLS8vIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBzZWN0aW9uLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3RW5kQXJyYXkoY29uc3QgY2hhciogYXJyYXlOYW1lKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndJbml0LgotLy8gVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoaXMgcm91dGluZSBzdGFydHMgdGhlIG1hY3JvIHNlY3Rpb24uIAotZXh0ZXJuIGludCBsZWZ3U3RhcnRNYWNybyhjb25zdCBjaGFyKiBtYWNyb05hbWUpOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgbWFjcm8gc2VjdGlvbi4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhlIHZhbHVlMSBjYW4gYmUgQ09WRVIsIFJJTkcsIEJMT0NLLCBQQUQsIENPUkUsIG9yIEVOQ0FQLgotLy8gVGhlIHZhbHVlMiBjYW4gYmUgQlVNUCBpZiB2YWx1ZTEgaXMgQ09WRVIsCi0vLyBvciBCTEFDS0JPWCwgb3IgU09GVCBpZiB2YWx1ZTEgaXMgQkxPQ0ssCi0vLyBvciBJTlBVVCwgT1VUUFVULCBJTk9VVCwgUE9XRVIsIG9yIFNQQUNFUiBpZiB2YWx1ZTEgaXMgUEFELAotLy8gb3IgRkVFRFRIUlUsIFRJRUhJR0gsIFRJRUxPVywgU1BBQ0VSLCBBTlRFTk5BQ0VMTCwgb3IgV0VMTFRBUAotLy8gaWYgdmFsdWUxIGlzIENPUkUsCi0vLyBvciBQUkUsIFBPU1QsIFRPUExFRlQsIFRPUFJJR0hULCBCT09UT01MRUZULCBvciBCT1RUT01SSUdIVCBpZiB2YWx1ZTEgaXMKLS8vIEVOQ0FQLiAKLWV4dGVybiBpbnQgbGVmd01hY3JvQ2xhc3MoY29uc3QgY2hhciogdmFsdWUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YWx1ZTIpOyAgICAgLy8gb3B0aW9uYWwoTlVMTCkKLQotLy8gVGhpcyByb3V0aW5lIGlzIG11c3QgYmUgY2FsbGVkIGFmdGVyIGxlZndJbml0LgotLy8gVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoaXMgaXMgYSA1Ljggc3ludGF4LiAKLWV4dGVybiBpbnQgbGVmd01hY3JvRml4ZWRNYXNrKCk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm8uCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBtYWNybyBzZWN0aW9uLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGUgdmFsdWUxIGNhbiBiZSBVU0VSLCBHRU5FUkFURSwgb3IgQkxPQ0suIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9Tb3VyY2UoY29uc3QgY2hhciogdmFsdWUxKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyby4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBwZXIgbWFjcm8gc2VjdGlvbi4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd01hY3JvRm9yZWlnbihjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgZG91YmxlIHhsLCAgICAgICAgICAvLyBvcHRpb25hbCgwKSAtIHB0KHgpIAotICAgICAgICAgICAgICAgZG91YmxlIHlsLCAgICAgICAgICAvLyBvcHRpb25hbCgwKSAtIHB0KHkpIAotICAgICAgICAgICAgICAgaW50IG9yaWVudCk7ICAgICAgICAvLyBvcHRpb25hbCgtMSkgLSAwIHRvIDcgCi0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm8uCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgcGVyIG1hY3JvIHNlY3Rpb24uCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoaXMgcm91dGluZSBpcyB0aGUgc2FtZSBhcyBsZWZ3TWFjcm9Gb3JlaWduLCBleGNlcHQgb3JpZW50IGlzIGEgY2hhciogCi1leHRlcm4gaW50IGxlZndNYWNyb0ZvcmVpZ25TdHIoY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgIGRvdWJsZSB4bCwgICAgICAgICAgICAgLy8gb3B0aW9uYWwoMCkgLSBwdCh4KSAKLSAgICAgICAgICAgICAgIGRvdWJsZSB5bCwgICAgICAgICAgICAgLy8gb3B0aW9uYWwoMCkgLSBwdCh5KSAKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm9yaWVudCk7ICAgLy8gb3B0aW9uYWwoIiIpIAotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgbWFjcm8gc2VjdGlvbi4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd01hY3JvT3JpZ2luKGRvdWJsZSB4bCwgICAvLyBwdCh4KSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB5bCk7ICAvLyBwdCh5KSAKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyby4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UgcGVyIG1hY3JvIHNlY3Rpb24uCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndNYWNyb0VFUShjb25zdCBjaGFyKiBtYWNyb05hbWUpOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgbWFjcm8gc2VjdGlvbi4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd01hY3JvTEVRKGNvbnN0IGNoYXIqIG1hY3JvTmFtZSk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm8uCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBtYWNybyBzZWN0aW9uLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9TaXplKGRvdWJsZSB3aWR0aCwgZG91YmxlIGhlaWdodCk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm8uCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBtYWNybyBzZWN0aW9uLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGUgc3ltbWV0cnkgY2FuIGJlIGEgbGlzdCBvZiBYLCBZLCBvciBSOTAgCi1leHRlcm4gaW50IGxlZndNYWNyb1N5bW1ldHJ5KGNvbnN0IGNoYXIqIHN5bW1ldHJ5KTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyby4KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBvbmx5IG9uY2UgcGVyIG1hY3JvIHNlY3Rpb24uCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndNYWNyb1NpdGUoY29uc3QgY2hhciogc2l0ZU5hbWUpOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvLgotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGF0IGxlYXN0IG9uY2UgcGVyIG1hY3JvIHNlY3Rpb24uCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndNYWNyb1NpdGVQYXR0ZXJuKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBvcmlnWCwgZG91YmxlIG9yaWdZLCAgLy8gb3B0aW9uYWwoMCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcmllbnQsICAgICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwoLTEpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtWCwgaW50IG51bVksICAgICAgICAgIC8vIG9wdGlvbmFsKDApIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgc3BhY2VYLCBkb3VibGUgc3BhY2VZKTsgLy8gb3B0aW9uYWwoMCkgCi0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm8uCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYXQgbGVhc3Qgb25jZSBwZXIgbWFjcm8gc2VjdGlvbi4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhpcyByb3V0aW5lIGlzIHRoZSBzYW1lIGFzIGxlZndNYWNyb1NpdGVQYXR0ZXJuLCBleGNlcHQgb3JpZW50IGlzIGEgY2hhciogCi1leHRlcm4gaW50IGxlZndNYWNyb1NpdGVQYXR0ZXJuU3RyKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBvcmlnWCwgZG91YmxlIG9yaWdZLCAgICAvLyBvcHRpb25hbCgwKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqb3JpZW50LCAgICAgICAgICAvLyBvcHRpb25hbCAoLTEpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtWCwgaW50IG51bVksICAgICAgICAgICAgLy8gb3B0aW9uYWwoMCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBzcGFjZVgsIGRvdWJsZSBzcGFjZVkpOyAvLyBvcHRpb25hbCgwKSAKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyby4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UgcGVyIG1hY3JvIHNlY3Rpb24uCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gCi1leHRlcm4gaW50IGxlZndNYWNyb1Bvd2VyKGRvdWJsZSBwb3dlcik7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbGVmd1N0YXJ0TWFjcm8gY2FsbCAoaWYgYW55KS4KLS8vIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBtYWNybyBzZWN0aW9uLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3RW5kTWFjcm8oY29uc3QgY2hhciogbWFjcm9OYW1lKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyby4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UgcGVyIG1hY3JvIHNlY3Rpb24uCi0vLyBUaGlzIGlzIGEgNS42IHN5bnRheC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotZXh0ZXJuIGludCBsZWZ3U3RhcnRNYWNyb0RlbnNpdHkoY29uc3QgY2hhciogbGF5ZXJOYW1lKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb0RlbnNpdHkuCi0vLyBUaGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KLS8vIFRoaXMgaXMgYSA1LjYgc3ludGF4LgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9EZW5zaXR5TGF5ZXJSZWN0KGRvdWJsZSB4MSwgZG91YmxlIHkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB4MiwgZG91YmxlIHkyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkZW5zaXR5VmFsdWUpOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxlZndTdGFydE1hY3JvUGluIGNhbGwgKGlmIGFueSkuCi0vLyBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgbWFjcm8gc2VjdGlvbi4KLS8vIFRoaXMgaXMgYSA1LjYgc3ludGF4LgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3RW5kTWFjcm9EZW5zaXR5KCk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbGVmd1N0YXJ0TWFjcm8gY2FsbCAoaWYgYW55KS4KLS8vIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZS4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gSXQgc3RhcnRzIHRoZSBtYWNybyBwaW4gc2VjdGlvbiB3aXRoaW4gbWFjcm8uIAotZXh0ZXJuIGludCBsZWZ3U3RhcnRNYWNyb1Bpbihjb25zdCBjaGFyKiBwaW5OYW1lKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndNYWNyb1BpblRhcGVyUnVsZShjb25zdCBjaGFyKiBydWxlTmFtZSk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9QaW4uCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9QaW5Gb3JlaWduKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICBkb3VibGUgeGwsICAgICAgIC8vIG9wdGlvbmFsKDApIAotICAgICAgICAgICAgICAgZG91YmxlIHlsLCAgICAgICAvLyBvcHRpb25hbCgwKSAKLSAgICAgICAgICAgICAgIGludCBvcmllbnQpOyAgICAgLy8gb3B0aW9uYWwoLTEpIC0gMCB0byA3IAotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvUGluLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhzIHJvdXRpbmUgaXMgdGhlIHNhbWUgYXMgbGVmd01hY3JvUGluRm9yZWlnbiwgZXhjZXB0IG9yaWVudCBpcyBhIGNoYXIqIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9QaW5Gb3JlaWduU3RyKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICBkb3VibGUgeGwsICAgICAgICAgICAgIC8vIG9wdGlvbmFsKDApIAotICAgICAgICAgICAgICAgZG91YmxlIHlsLCAgICAgICAgICAgICAvLyBvcHRpb25hbCgwKSAKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG9yaWVudCk7ICAgLy8gb3B0aW9uYWwoIiIpIAotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvUGluLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd01hY3JvUGluTEVRKGNvbnN0IGNoYXIqIHBpbk5hbWUpOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvUGluLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhlIGRpcmVjdGlvbiBjYW4gYmUgSU5QVVQsIE9VVFBVVCwgT1VUUFVUIFRSSVNUQVRFLCBJTk9VVCwgb3IgRkVFRFRIUlUuIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9QaW5EaXJlY3Rpb24oY29uc3QgY2hhciogZGlyZWN0aW9uKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoZSB1c2UgY2FuIGJlIFNJR05BTCwgQU5BTE9HLCBQT1dFUiwgR1JPVU5ELCBvciBDTE9DSy4gCi1leHRlcm4gaW50IGxlZndNYWNyb1BpblVzZShjb25zdCBjaGFyKiB1c2UpOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvUGluLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhlIG5hbWNlIGNhbiBiZSBBQlVUTUVOVCwgUklORywgb3IgRkVFRFRIUlUuIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9QaW5TaGFwZShjb25zdCBjaGFyKiBuYW1lKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndNYWNyb1Bpbk11c3Rqb2luKGNvbnN0IGNoYXIqIG5hbWUpOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvUGluLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4KLS8vIFRoaXMgaXMgYSA1LjYgc3ludGF4LgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9QaW5OZXRFeHByKGNvbnN0IGNoYXIqIG5hbWUpOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvUGluLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4KLS8vIFRoaXMgaXMgYSA1LjYgc3ludGF4LgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9QaW5TdXBwbHlTZW5zaXRpdml0eShjb25zdCBjaGFyKiBwaW5OYW1lKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0vLyBUaGlzIGlzIGEgNS42IHN5bnRheC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd01hY3JvUGluR3JvdW5kU2Vuc2l0aXZpdHkoY29uc3QgY2hhciogcGluTmFtZSk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9QaW4uCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9QaW5PdXRwdXRub2lzZW1hcmdpbihpbnQgaGlnaCwgaW50IGxvdyk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9QaW4uCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9QaW5PdXRwdXRyZXNpc3RhbmNlKGludCBoaWdoLCBpbnQgbG93KTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gCi1leHRlcm4gaW50IGxlZndNYWNyb1BpbklucHV0bm9pc2VtYXJnaW4oaW50IGhpZ2gsIGludCBsb3cpOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvUGluLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAKLWV4dGVybiBpbnQgbGVmd01hY3JvUGluUG93ZXIoZG91YmxlIHBvd2VyKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gCi1leHRlcm4gaW50IGxlZndNYWNyb1BpbkxlYWthZ2UoZG91YmxlIGxlYWthZ2UpOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvUGluLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAKLWV4dGVybiBpbnQgbGVmd01hY3JvUGluQ2FwYWNpdGFuY2UoZG91YmxlIGNhcGFjaXRhbmNlKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gCi1leHRlcm4gaW50IGxlZndNYWNyb1BpblJlc2lzdGFuY2UoZG91YmxlIHJlc2lzdGFuY2UpOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvUGluLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAKLWV4dGVybiBpbnQgbGVmd01hY3JvUGluUHVsbGRvd25yZXMoZG91YmxlIHJlc2lzdGFuY2UpOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvUGluLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAKLWV4dGVybiBpbnQgbGVmd01hY3JvUGluVGllb2Zmcihkb3VibGUgcmVzaXN0YW5jZSk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9QaW4uCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9QaW5WSEkoZG91YmxlIHZvbHRhZ2UpOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvUGluLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAKLWV4dGVybiBpbnQgbGVmd01hY3JvUGluVkxPKGRvdWJsZSB2b2x0YWdlKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gCi1leHRlcm4gaW50IGxlZndNYWNyb1BpblJpc2V2b2x0YWdldGhyZXNob2xkKGRvdWJsZSB2b2x0YWdlKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gCi1leHRlcm4gaW50IGxlZndNYWNyb1BpbkZhbGx2b2x0YWdldGhyZXNob2xkKGRvdWJsZSB2b2x0YWdlKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gCi1leHRlcm4gaW50IGxlZndNYWNyb1BpblJpc2V0aHJlc2goZG91YmxlIGNhcGFjaXRhbmNlKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gCi1leHRlcm4gaW50IGxlZndNYWNyb1BpbkZhbGx0aHJlc2goZG91YmxlIGNhcGFjaXRhbmNlKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gCi1leHRlcm4gaW50IGxlZndNYWNyb1BpblJpc2VzYXRjdXIoZG91YmxlIGN1cnJlbnQpOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvUGluLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAKLWV4dGVybiBpbnQgbGVmd01hY3JvUGluRmFsbHNhdGN1cihkb3VibGUgY3VycmVudCk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9QaW4uCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGUgbmFtZSBjYW4gYmUgQUNUSVZFIG9yIFJFU0lTVElWRS4KLS8vIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gCi1leHRlcm4gaW50IGxlZndNYWNyb1BpbkN1cnJlbnRzb3VyY2UoY29uc3QgY2hhciogbmFtZSk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9QaW4uCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9QaW5JVl9UYWJsZXMoY29uc3QgY2hhciogbG93TmFtZSwgY29uc3QgY2hhciogaGlnaE5hbWUpOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvUGluLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgotLy8gRWl0aGVyIHRoaXMgcm91dGluZSBvciA1LjQgQW50ZW5uYSBzeW50YXgsIGNhbm5vdCBiZSBib3RoCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndNYWNyb1BpbkFudGVubmFzaXplKGRvdWJsZSB2YWx1ZSwKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGxheWVyTmFtZSk7IC8vIG9wdGlvbmFsKE5VTEwpIAotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvUGluLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgotLy8gRWl0aGVyIHRoaXMgcm91dGluZSBvciA1LjQgQW50ZW5uYSBzeW50YXgsIGNhbm5vdCBiZSBib3RoCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndNYWNyb1BpbkFudGVubmFNZXRhbEFyZWEoZG91YmxlIHZhbHVlLAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogbGF5ZXJOYW1lKTsgLy8gb3B0aW9uYWwoTlVMTCkgCi0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9QaW4uCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCi0vLyBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIDUuNCBBbnRlbm5hIHN5bnRheCwgY2Fubm90IGJlIGJvdGgKLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd01hY3JvUGluQW50ZW5uYU1ldGFsTGVuZ3RoKGRvdWJsZSB2YWx1ZSwKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGxheWVyTmFtZSk7IC8vIG9wdGlvbmFsKE5VTEwpIAotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvUGluLgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgotLy8gVGhpcyBpcyBhIDUuNCBzeW50YXguCi0vLyBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIDUuMyBBbnRlbm5hIHN5bnRheCwgY2Fubm90IGJlIGJvdGgKLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd01hY3JvUGluQW50ZW5uYVBhcnRpYWxNZXRhbEFyZWEoZG91YmxlIHZhbHVlLAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogbGF5ZXJOYW1lKTsgLy8gb3B0aW9uYWwoTlVMTCkgCi0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9QaW4uCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCi0vLyBUaGlzIGlzIGEgNS40IHN5bnRheC4KLS8vIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgNS4zIEFudGVubmEgc3ludGF4LCBjYW5ub3QgYmUgYm90aAotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9QaW5BbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWEoZG91YmxlIHZhbHVlLAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogbGF5ZXJOYW1lKTsgLy8gb3B0aW9uYWwoTlVMTCkgCi0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9QaW4uCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCi0vLyBUaGlzIGlzIGEgNS40IHN5bnRheC4KLS8vIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgNS4zIEFudGVubmEgc3ludGF4LCBjYW5ub3QgYmUgYm90aAotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9QaW5BbnRlbm5hUGFydGlhbEN1dEFyZWEoZG91YmxlIHZhbHVlLAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogbGF5ZXJOYW1lKTsgLy8gb3B0aW9uYWwoTlVMTCkgCi0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9QaW4uCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCi0vLyBUaGlzIGlzIGEgNS40IHN5bnRheC4KLS8vIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgNS4zIEFudGVubmEgc3ludGF4LCBjYW5ub3QgYmUgYm90aAotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9QaW5BbnRlbm5hRGlmZkFyZWEoZG91YmxlIHZhbHVlLAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogbGF5ZXJOYW1lKTsgLy8gb3B0aW9uYWwoTlVMTCkgCi0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9QaW4uCi0vLyBUaGUgb3hpZGUgdmFsdWUsIGNhbiBiZSBlaXRoZXIgT1hJREUxLCBPWElERTIsIE9YSURFMywgb3IgT1hJREU0LgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLiBFYWNoIG94aWRlIHZhbHVlIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlCi0vLyBhZnRlciB0aGUgbGVmd1N0YXJ0TWFjcm9QaW4uCi0vLyBUaGlzIGlzIGEgNS41IHN5bnRheC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd01hY3JvUGluQW50ZW5uYU1vZGVsKGNvbnN0IGNoYXIqIG94aWRlKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KLS8vIFRoaXMgaXMgYSA1LjQgc3ludGF4LgotLy8gRWl0aGVyIHRoaXMgcm91dGluZSBvciA1LjMgQW50ZW5uYSBzeW50YXgsIGNhbm5vdCBiZSBib3RoCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndNYWNyb1BpbkFudGVubmFHYXRlQXJlYShkb3VibGUgdmFsdWUsCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyKiBsYXllck5hbWUpOyAvLyBvcHRpb25hbChOVUxMKSAKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0vLyBUaGlzIGlzIGEgNS40IHN5bnRheC4KLS8vIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgNS4zIEFudGVubmEgc3ludGF4LCBjYW5ub3QgYmUgYm90aAotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9QaW5BbnRlbm5hTWF4QXJlYUNhcihkb3VibGUgdmFsdWUsCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyKiBsYXllck5hbWUpOyAvLyBvcHRpb25hbChOVUxMKSAKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1Bpbi4KLS8vIFRoaXMgcm91dGluZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuCi0vLyBUaGlzIGlzIGEgNS40IHN5bnRheC4KLS8vIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgNS4zIEFudGVubmEgc3ludGF4LCBjYW5ub3QgYmUgYm90aAotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9QaW5BbnRlbm5hTWF4U2lkZUFyZWFDYXIoZG91YmxlIHZhbHVlLAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogbGF5ZXJOYW1lKTsgLy8gb3B0aW9uYWwoTlVMTCkgCi0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9QaW4uCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLgotLy8gVGhpcyBpcyBhIDUuNCBzeW50YXguCi0vLyBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIDUuMyBBbnRlbm5hIHN5bnRheCwgY2Fubm90IGJlIGJvdGgKLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd01hY3JvUGluQW50ZW5uYU1heEN1dENhcihkb3VibGUgdmFsdWUsCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyKiBsYXllck5hbWUpOyAvLyBvcHRpb25hbChOVUxMKSAKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBsZWZ3U3RhcnRNYWNyb1BpbiBjYWxsIChpZiBhbnkpLgotLy8gVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UgcGVyIG1hY3JvIHNlY3Rpb24uCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndFbmRNYWNyb1Bpbihjb25zdCBjaGFyKiBwaW5OYW1lKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBsZWZ3U3RhcnRNYWNyb1BpbiBjYWxsIChpZiBhbnkpLgotLy8gVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBJdCBzdGFydHMgdGhlIG1hY3JvIHBpbiBwb3J0IHNlY3Rpb24gd2l0aGluIG1hY3JvIHBpbi4KLS8vIFRoZSBjbGFzc1R5cGUgY2FuIGJlIE5PTkUgb3IgQ09SRS4gCi1leHRlcm4gaW50IGxlZndTdGFydE1hY3JvUGluUG9ydChjb25zdCBjaGFyKiBjbGFzc1R5cGUpOyAvLyBvcHRpb25hbChOVUxMKSAKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1BpblBvcnQuCi0vLyBFaXRoZXIgdGhpcyByb3V0aW5lIG9yIGxlZndNYWNyb1BpblBvcnREZXNpZ25SdWxlV2lkdGggbXVzdCBiZSBjYWxsZWQsIAotLy8gYnV0IGNhbid0IGJlIGJvdGguCi0vLyBTcGFjaW5nIGlzIG9wdGlvbmFsIGZvciBtaW5pbXVtIHNwYWNpbmcuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndNYWNyb1BpblBvcnRMYXllcihjb25zdCBjaGFyKiBsYXllck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgc3BhY2luZyk7ICAgICAgIC8vIG9wdGlvbmFsKDApIAotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvUGluUG9ydC4KLS8vIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgbGVmd01hY3JvUGluUG9ydExheWVyIG11c3QgYmUgY2FsbGVkLCBidXQgY2FuJ3QKLS8vIGJlIGJvdGguCi0vLyB3aWR0aCBpcyBvcHRpb25hbCBmb3IgRGVzaWduUnVsZVdpZHRoCi0vLyBUaGlzIGlzIGEgNS40IHN5bnRheC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd01hY3JvUGluUG9ydERlc2lnblJ1bGVXaWR0aChjb25zdCBjaGFyKiBsYXllck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHdpZHRoKTsgICAgIC8vIG9wdGlvbmFsKDApIAotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndNYWNyb1BpblBvcnRMYXllci4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd01hY3JvUGluUG9ydExheWVyV2lkdGgoZG91YmxlIHdpZHRoKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb1BpblBvcnRMYXllci4KLS8vIEVpdGhlciB0aGlzIHJvdXRpbmUsIGxlZndTdGFydE1hY3JvUGluUG9ydExheWVyUmVjdCwgb3IKLS8vIGxlZndTdGFydE1hY3JvUGluUG9ydExheWVyUG9seWdvbiBtdXN0IGJlIGNhbGxlZC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd01hY3JvUGluUG9ydExheWVyUGF0aChpbnQgbnVtX3BhdGhzLCBkb3VibGUqIHhsLCBkb3VibGUqIHlsLAotICAgICAgICAgICAgICAgaW50IG51bVgsICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwoMCkgCi0gICAgICAgICAgICAgICBpbnQgbnVtWSwgICAgICAgICAgICAgICAvLyBvcHRpb25hbCgwKSAKLSAgICAgICAgICAgICAgIGRvdWJsZSBzcGFjZVgsICAgICAgICAgIC8vIG9wdGlvbmFsKDApIAotICAgICAgICAgICAgICAgZG91YmxlIHNwYWNlWSwgICAgICAgICAgLy8gb3B0aW9uYWwoMCkgCi0gICAgICAgICAgIGludCAgICBtYXNrID0gMCk7ICAgICAgIC8vIG9wdGlvbmFsKDApIAotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvUGluUG9ydExheWVyLgotLy8gRWl0aGVyIHRoaXMgcm91dGluZSwgbGVmd1N0YXJ0TWFjcm9QaW5Qb3J0TGF5ZXJQYXRoLCBvcgotLy8gbGVmd1N0YXJ0TWFjcm9QaW5Qb3J0TGF5ZXJQb2x5Z29uIG11c3QgYmUgY2FsbGVkLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9QaW5Qb3J0TGF5ZXJSZWN0KGRvdWJsZSB4bDEsIGRvdWJsZSB5bDEsCi0gICAgICAgICAgICAgICBkb3VibGUgeGwyLCBkb3VibGUgeWwyLAotICAgICAgICAgICAgICAgaW50IG51bVgsICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwoMCkgCi0gICAgICAgICAgICAgICBpbnQgbnVtWSwgICAgICAgICAgICAgICAvLyBvcHRpb25hbCgwKSAKLSAgICAgICAgICAgICAgIGRvdWJsZSBzcGFjZVgsICAgICAgICAgIC8vIG9wdGlvbmFsKDApIAotICAgICAgICAgICAgICAgZG91YmxlIHNwYWNlWSwgICAgICAgICAgLy8gb3B0aW9uYWwoMCkgCi0gICAgICAgICAgIGludCBtYXNrID0gMCk7ICAgICAgICAgIC8vIG9wdGlvbmFsKDApIAotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvUGluUG9ydExheWVyLgotLy8gRWl0aGVyIHRoaXMgcm91dGluZSwgbGVmd1N0YXJ0TWFjcm9QaW5Qb3J0TGF5ZXJQYXRoLCBvcgotLy8gbGVmd1N0YXJ0TWFjcm9QaW5Qb3J0TGF5ZXJSZWN0IG11c3QgYmUgY2FsbGVkLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9QaW5Qb3J0TGF5ZXJQb2x5Z29uKGludCBudW1fcG9seXMsCi0gICAgICAgICAgICAgICBkb3VibGUqIHhsLCBkb3VibGUqIHlsLAotICAgICAgICAgICAgICAgaW50IG51bVgsICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwoMCkgCi0gICAgICAgICAgICAgICBpbnQgbnVtWSwgICAgICAgICAgICAgICAvLyBvcHRpb25hbCgwKSAKLSAgICAgICAgICAgICAgIGRvdWJsZSBzcGFjZVgsICAgICAgICAgIC8vIG9wdGlvbmFsKDApIAotICAgICAgICAgICAgICAgZG91YmxlIHNwYWNlWSwgICAgICAgICAgLy8gb3B0aW9uYWwoMCkgCi0gICAgICAgICAgIGludCBtYXNrID0gMCk7ICAgICAgICAgIC8vIG9wdGlvbmFsKDApIAotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvUGluUG9ydC4KLS8vIEVpdGhlciB0aGlzIHJvdXRpbmUgb3IgbGVmd1N0YXJ0TWFjcm9QaW5Qb3J0TGF5ZXIgbXVzdCBiZSBjYWxsZWQuIAotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9QaW5Qb3J0VmlhKGRvdWJsZSB4bCwgZG91YmxlIHlsLCBjb25zdCBjaGFyKiB2aWFOYW1lLAotICAgICAgICAgICAgICAgaW50IG51bVgsICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwoMCkgCi0gICAgICAgICAgICAgICBpbnQgbnVtWSwgICAgICAgICAgICAgICAvLyBvcHRpb25hbCgwKSAKLSAgICAgICAgICAgICAgIGRvdWJsZSBzcGFjZVgsICAgICAgICAgIC8vIG9wdGlvbmFsKDApIAotICAgICAgICAgICAgICAgZG91YmxlIHNwYWNlWSwgICAgICAgICAgLy8gb3B0aW9uYWwoMCkgCi0gICAgICAgICAgIGludCBtYXNrID0gMCk7ICAgICAgICAgIC8vIG9wdGlvbmFsKDApIAotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxlZndTdGFydE1hY3JvUGluUG9ydCBjYWxsIChpZiBhbnkpLgotLy8gVGhlIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UgcGVyIG1hY3JvIHNlY3Rpb24uCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndFbmRNYWNyb1BpblBvcnQoKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciB0aGUgbGVmd1N0YXJ0TWFjcm8gY2FsbCAoaWYgYW55KS4KLS8vIFRoZSByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBJdCBzdGFydHMgdGhlIG1hY3JvIG9icyBzZWN0aW9uIHdpdGhpbiBtYWNyby4gCi1leHRlcm4gaW50IGxlZndTdGFydE1hY3JvT2JzKCk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9PYnMuCi0vLyBFaXRoZXIgdGhpcyByb3V0aW5lLCBsZWZ3TWFjcm9PYnNEZXNpZ25SdWxlV2lkdGgsIGxlZndNYWNyb09ic1ZpYSBvcgotLy8gbGVmd01hY3JvRXhjZXB0UEdOZXQgbXVzdCBiZSBjYWxsZWQuCi0vLyBTcGFjaW5nIGlzIG9wdGlvbmFsIGZvciBtaW5pbXVtIHNwYWNpbmcuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndNYWNyb09ic0xheWVyKGNvbnN0IGNoYXIqIGxheWVyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHNwYWNpbmcpOyAgICAgICAvLyBvcHRpb25hbCgwKSAKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb09icy4KLS8vIEVpdGhlciB0aGlzIHJvdXRpbmUsIGxlZndNYWNyb09ic0xheWVyLCBsZWZ3TWFjcm9PYnNWaWEgb3IKLS8vIGxlZndNYWNyb0V4Y2VwdFBHTmV0IG11c3QgYmUgY2FsbGVkLgotLy8gU3BhY2luZyBpcyBvcHRpb25hbCBmb3IgbWluaW11bSBzcGFjaW5nLgotLy8gVGhpcyBpcyBhIDUuNCBzeW50YXguCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndNYWNyb09ic0Rlc2lnblJ1bGVXaWR0aChjb25zdCBjaGFyKiBsYXllck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgd2lkdGgpOyAgICAgICAvLyBvcHRpb25hbCgwKSAKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb09icy4KLS8vIEVpdGhlciB0aGlzIHJvdXRpbmUsIGxlZndNYWNyb09ic0xheWVyLCBsZWZ3TWFjcm9PYnNWaWEgb3IKLS8vIGxlZndNYWNyb09ic0Rlc2lnblJ1bGVXaWR0aCBtdXN0IGJlIGNhbGxlZC4KLS8vIFNwYWNpbmcgaXMgb3B0aW9uYWwgZm9yIG1pbmltdW0gc3BhY2luZy4KLS8vIFRoaXMgaXMgYSA1LjQgc3ludGF4LgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9FeGNlcHRQR05ldChjb25zdCBjaGFyKiBsYXllck5hbWUpOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvT2JzLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9PYnNMYXllcldpZHRoKGRvdWJsZSB3aWR0aCk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd1N0YXJ0TWFjcm9PYnNMYXllci4KLS8vIEVpdGhlciB0aGlzIHJvdXRpbmUsIGxlZndNYWNyb09ic0xheWVyUmVjdCwgb3IKLS8vIGxlZndTdGFydE1hY3JvT2JzTGF5ZXJQb2x5Z29uIG11c3QgYmUgY2FsbGVkLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9PYnNMYXllclBhdGgoaW50IG51bV9wYXRocywgZG91YmxlKiB4bCwgZG91YmxlKiB5bCwKLSAgICAgICAgICAgICAgIGludCBudW1YLCAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsKDApIAotICAgICAgICAgICAgICAgaW50IG51bVksICAgICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwoMCkgCi0gICAgICAgICAgICAgICBkb3VibGUgc3BhY2VYLCAgICAgICAgICAgICAvLyBvcHRpb25hbCgwKSAKLSAgICAgICAgICAgICAgIGRvdWJsZSBzcGFjZVksICAgICAgICAgICAgIC8vIG9wdGlvbmFsKDApIAotICAgICAgICAgICBpbnQgbWFzayA9IDApOyAgICAgICAgICAgICAvLyBvcHRpb25hbCgwKSAKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb09ic0xheWVyLgotLy8gRWl0aGVyIHRoaXMgcm91dGluZSwgbGVmd01hY3JvT2JzTGF5ZXJQYXRoLCBvcgotLy8gbGVmd1N0YXJ0TWFjcm9PYnNMYXllclBvbHlnb24gbXVzdCBiZSBjYWxsZWQuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndNYWNyb09ic0xheWVyUmVjdChkb3VibGUgeGwxLCBkb3VibGUgeWwxLAotICAgICAgICAgICAgICAgZG91YmxlIHhsMiwgZG91YmxlIHlsMiwKLSAgICAgICAgICAgICAgIGludCBudW1YLCAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsKDApIAotICAgICAgICAgICAgICAgaW50IG51bVksICAgICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwoMCkgCi0gICAgICAgICAgICAgICBkb3VibGUgc3BhY2VYLCAgICAgICAgICAgICAvLyBvcHRpb25hbCgwKSAKLSAgICAgICAgICAgICAgIGRvdWJsZSBzcGFjZVksICAgICAgICAgICAgIC8vIG9wdGlvbmFsKDApIAotICAgICAgICAgICBpbnQgbWFzayA9IDApOyAgICAgICAgICAgICAvLyBvcHRpb25hbCgwKSAKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3U3RhcnRNYWNyb09ic0xheWVyLgotLy8gRWl0aGVyIHRoaXMgcm91dGluZSwgbGVmd01hY3JvT2JzTGF5ZXJQYXRoLCBvcgotLy8gbGVmd1N0YXJ0TWFjcm9PYnNMYXllclBhdGggbXVzdCBiZSBjYWxsZWQuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndNYWNyb09ic0xheWVyUG9seWdvbihpbnQgbnVtX3BvbHlzLCBkb3VibGUqIHhsLCBkb3VibGUqIHlsLAotICAgICAgICAgICAgICAgaW50IG51bVgsICAgICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwoMCkgCi0gICAgICAgICAgICAgICBpbnQgbnVtWSwgICAgICAgICAgICAgICAgICAvLyBvcHRpb25hbCgwKSAKLSAgICAgICAgICAgICAgIGRvdWJsZSBzcGFjZVgsICAgICAgICAgICAgIC8vIG9wdGlvbmFsKDApIAotICAgICAgICAgICAgICAgZG91YmxlIHNwYWNlWSwgICAgICAgICAgICAgLy8gb3B0aW9uYWwoMCkgCi0gICAgICAgICAgIGludCBtYXNrID0gMCk7ICAgICAgICAgICAgIC8vIG9wdGlvbmFsKDApIAotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndTdGFydE1hY3JvT2JzLgotLy8gRWl0aGVyIHRoaXMgcm91dGluZSBvciBsZWZ3TWFjcm9PYnNMYXllcnxsZWZ3TWFjcm9PYnNEZXNpZ25SdWxlV2lkdGgKLS8vIG11c3QgYmUgY2FsbGVkLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9PYnNWaWEoZG91YmxlIHhsLCBkb3VibGUgeWwsIGNvbnN0IGNoYXIqIHZpYU5hbWUsCi0gICAgICAgICAgICAgICBpbnQgbnVtWCwgICAgICAgICAgICAgICAgICAvLyBvcHRpb25hbCgwKSAKLSAgICAgICAgICAgICAgIGludCBudW1ZLCAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsKDApIAotICAgICAgICAgICAgICAgZG91YmxlIHNwYWNlWCwgICAgICAgICAgICAgLy8gb3B0aW9uYWwoMCkgCi0gICAgICAgICAgICAgICBkb3VibGUgc3BhY2VZLCAgICAgICAgICAgICAvLyBvcHRpb25hbCgwKSAKLSAgICAgICAgICAgaW50IG1hc2sgPSAwKTsgICAgICAgICAgICAgLy8gb3B0aW9uYWwoMCkgCi0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbGVmd1N0YXJ0TWFjcm9PYnMgY2FsbCAoaWYgYW55KS4KLS8vIFRoZSByb3V0aW5lIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBtYWNybyBzZWN0aW9uLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3RW5kTWFjcm9PYnMoKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciB0aGUgbGVmd1N0YXJ0TWFjcm8gY2FsbCAoaWYgYW55KS4KLS8vIFRoZSByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gSXQgc3RhcnRzIHRoZSBtYWNybyB0aW1pbmcgc2VjdGlvbiB3aXRoaW4gbWFjcm8uCi0vLyBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuIAotZXh0ZXJuIGludCBsZWZ3U3RhcnRNYWNyb1RpbWluZygpOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxlZndTdGFydE1hY3JvVGltaW5nLgotLy8gSXQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhpcyByb3V0aW5lIGlzIGZvciB7RlJPTVBJTiBwaW5OYW1lLi4uOyBbVE9QSU4gcGluTmFtZS4uLjtdIHwgRlJPTVBJTgotLy8gcGluTmFtZS4uLjt9Ci0vLyBUaGlzIHJvdXRpbmNlIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCi0vLyBUaGUgbnVtX2ZyUGluTmFtZXMgY29udGFpbnMgdGhlIG51bWJlciBvZiBvYmplY3QgaW4gdGhlIGFycmF5IGZyb21QaW5zLgotLy8gVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAKLWV4dGVybiBpbnQgbGVmd01hY3JvVGltaW5nUGluKGNvbnN0IGNoYXIqIGZyb21QaW4sIGNvbnN0IGNoYXIqIHRvUGluKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBsZWZ3U3RhcnRNYWNyb1RpbWluZy4KLS8vIEl0IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KLS8vIFRoZSByaXNlRmFsbCBjYW4gYmUgUklTRSBvciBGQUxMLgotLy8gVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAKLWV4dGVybiBpbnQgbGVmd01hY3JvVGltaW5nSW50cmluc2ljKGNvbnN0IGNoYXIqIHJpc2VGYWxsLCBkb3VibGUgbWluLAotICAgICAgICAgICAgICAgZG91YmxlIG1heCwKLSAgICAgICAgICAgICAgIGRvdWJsZSBzbGV3VDEsICAgICAgICAgIC8vIG9wdGlvbmFsKDApIAotICAgICAgICAgICAgICAgZG91YmxlIHNsZXdUMU1pbiwgICAgICAgLy8gb3B0aW9uYWwoMCkgCi0gICAgICAgICAgICAgICBkb3VibGUgc2xld1QxTWF4LCAgICAgICAvLyBvcHRpb25hbCgwKSAKLSAgICAgICAgICAgICAgIGRvdWJsZSBzbGV3VDIsICAgICAgICAgIC8vIG9wdGlvbmFsKDApIAotICAgICAgICAgICAgICAgZG91YmxlIHNsZXdUMk1pbiwgICAgICAgLy8gb3B0aW9uYWwoMCkgCi0gICAgICAgICAgICAgICBkb3VibGUgc2xld1QyTWF4LCAgICAgICAvLyBvcHRpb25hbCgwKSAKLSAgICAgICAgICAgICAgIGRvdWJsZSBzbGV3VDMsICAgICAgICAgIC8vIG9wdGlvbmFsKDApIAotICAgICAgICAgICAgICAgZG91YmxlIHZhck1pbiwgZG91YmxlIHZhck1heCk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbGVmd1N0YXJ0TWFjcm9UaW1pbmcuCi0vLyBJdCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9UaW1pbmdSaXNlcnMoZG91YmxlIG1pbiwgZG91YmxlIG1heCk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbGVmd1N0YXJ0TWFjcm9UaW1pbmcuCi0vLyBJdCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9UaW1pbmdGYWxscnMoZG91YmxlIG1pbiwgZG91YmxlIG1heCk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbGVmd1N0YXJ0TWFjcm9UaW1pbmcuCi0vLyBJdCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9UaW1pbmdSaXNlY3MoZG91YmxlIG1pbiwgZG91YmxlIG1heCk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbGVmd1N0YXJ0TWFjcm9UaW1pbmcuCi0vLyBJdCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9UaW1pbmdGYWxsY3MoZG91YmxlIG1pbiwgZG91YmxlIG1heCk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbGVmd1N0YXJ0TWFjcm9UaW1pbmcuCi0vLyBJdCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9UaW1pbmdSaXNlc2F0dDEoZG91YmxlIG1pbiwgZG91YmxlIG1heCk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbGVmd1N0YXJ0TWFjcm9UaW1pbmcuCi0vLyBJdCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9UaW1pbmdGYWxsc2F0dDEoZG91YmxlIG1pbiwgZG91YmxlIG1heCk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbGVmd1N0YXJ0TWFjcm9UaW1pbmcuCi0vLyBJdCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9UaW1pbmdSaXNldDAoZG91YmxlIG1pbiwgZG91YmxlIG1heCk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbGVmd1N0YXJ0TWFjcm9UaW1pbmcuCi0vLyBJdCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGlzIGFwaSBpcyBvYnNvbGV0ZSBpbiA1LjQuIAotZXh0ZXJuIGludCBsZWZ3TWFjcm9UaW1pbmdGYWxsdDAoZG91YmxlIG1pbiwgZG91YmxlIG1heCk7Ci0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbGVmd1N0YXJ0TWFjcm9UaW1pbmcuCi0vLyBJdCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0vLyBUaGUgdW5hdGVuZXNzIGNhbiBiZSBJTlZFUlQsIE5PTklOVkVSVCBvciBOT05VTkFURS4KLS8vIFRoaXMgYXBpIGlzIG9ic29sZXRlIGluIDUuNC4gCi1leHRlcm4gaW50IGxlZndNYWNyb1RpbWluZ1VuYXRlbmVzcyhjb25zdCBjaGFyKiB1bmF0ZW5lc3MpOwotCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxlZndTdGFydE1hY3JvVGltaW5nIGNhbGwgKGlmIGFueSkuCi0vLyBUaGUgcm91dGluZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgotLy8gVGhpcyBhcGkgaXMgb2Jzb2xldGUgaW4gNS40LiAKLWV4dGVybiBpbnQgbGVmd0VuZE1hY3JvVGltaW5nKCk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd0luaXQuCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGl0IGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3QW50ZW5uYShjb25zdCBjaGFyKiB0eXBlLCAgIC8vIElOUFVUUElOQU5URU5OQVNJWkUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9VVFBVVFBJTkFOVEVOTkFTSVpFIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJTk9VVFBJTkFOVEVOTkFTSVpFCi0gICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZSk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd0luaXQuCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwgYW5kIGl0IGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3U3RhcnRCZWdpbmV4dChjb25zdCBjaGFyKiBuYW1lKTsKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3QmVnaW5leHQuCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwsIGl0IGNhbiBiZSBjYWxsZWQgb25seSBvbmNlLgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3QmVnaW5leHRDcmVhdG9yIChjb25zdCBjaGFyKiBjcmVhdG9yTmFtZSk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd0JlZ2luZXh0LgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLCBpdCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4KLS8vIEl0IGdldHMgdGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUgYW5kIGRhdGUuCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4gCi1leHRlcm4gaW50IGxlZndCZWdpbmV4dERhdGUgKCk7Ci0KLS8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgbGVmd0JlZ2luZXh0LgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsLCBpdCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0JlZ2luZXh0UmV2aXNpb24gKGludCB2ZXJzMSwgaW50IHZlcnMyKTsgICAvLyB2ZXJzMS52ZXJzMiAKLQotLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciBsZWZ3QmVnaW5leHQuCi0vLyBUaGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwsIGl0IGNhbiBiZSBjYWxsZWQgbWFueSB0aW1lcy4KLS8vIEl0IGFsbG93cyB1c2VyIHRvIGN1c3RvbWl6ZSB0aGVpciBvd24gc3ludGF4LgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuIAotZXh0ZXJuIGludCBsZWZ3QmVnaW5leHRTeW50YXggKGNvbnN0IGNoYXIqIHRpdGxlLCBjb25zdCBjaGFyKiBzdHJpbmcpOwotCi0vLyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIGxlZndJbml0LgotLy8gVGhpcyByb3V0aW5lIGlzIG9wdGlvbmFsIGFuZCBpdCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0VuZEJlZ2luZXh0KCk7Ci0KLS8vIEdlbmVyYWwgcm91dGluZXMgdGhhdCBjYW4gYmUgY2FsbGVkIGFueXRpbWUgYWZ0ZXIgdGhlIEluaXQgaXMgY2FsbGVkLgotZXh0ZXJuIGludCBsZWZ3Q3VycmVudExpbmVOdW1iZXIoKTsKLQotLy8gVGhpcyByb3V0aW5lIG11c3QgY2FsbCBsYXN0LCBpdCBlbmRzIHRoZSBMZWYgbGlicmFyeS4KLS8vIEl0IG11c3QgYmUgY2FsbGVkIG9ubHkgb25jZS4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiAKLWV4dGVybiBpbnQgbGVmd0VuZCgpOwotCi0vLyBUaGlzIHJvdXRpbmUgd2lsbCBwcmludCB0aGUgZXJyb3IgbWVzc2FnZS4gCi1leHRlcm4gdm9pZCBsZWZ3UHJpbnRFcnJvcihpbnQgc3RhdHVzKTsKLQotLy8gVGhpcyByb3V0aW5lIHdpbGwgYWxsb3cgdXNlciB0byB3cml0ZSB0aGVpciBvd24gY29tZW1udC4gIEl0IHdpbGwKLS8vIGF1dG9tYWN0aWNhbGx5IGFkZCBhICMgaW5mcm9udCBvZiB0aGUgbGluZS4KLWV4dGVybiB2b2lkIGxlZndBZGRDb21tZW50KGNvbnN0IGNoYXIqIGNvbW1lbnQpOwotCi0vLyBUaGlzIHJvdXRpbmUgd2lsbCBpbmRlbnQgMyBibGFuayBzcGFjZXMgCi1leHRlcm4gdm9pZCBsZWZ3QWRkSW5kZW50KCk7Ci0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi1VU0VfTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZndXcml0ZXJDYWxscy5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZndXcml0ZXJDYWxscy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNjMzZTkuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZi9sZWZ3V3JpdGVyQ2FsbHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjY0ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTIgLSAyMDEzLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0vLyBUaGlzIGZpbGUgY29udGFpbnMgY29kZSBmb3IgaW1wbGVtZW50aW5nIHRoZSBsZWZ3cml0ZXIgNS4zCi0vLyBJdCBoYXMgZnVuY3Rpb25zIHRvIHNldCB0aGUgdXNlciBjYWxsYmFjayBmdW5jdGlvbnMuICBJZiBmdW5jdGlvbnMKLS8vIGFyZSBzZXQsIHRoZSBsZWZ3cml0ZXIgd2lsbCBjYWxsIHRoZSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9ucyB3aGVuCi0vLyBpdCBjb21lcyB0byB0aGUgc2VjdGlvbi4gIElmIHRoZSBzZWN0aW9uIGlzIHJlcXVpcmVkLCBidXQgdXNlcgotLy8gZG9lcyBub3Qgc2V0IGFueSBjYWxsYmFjayBmdW5jdGlvbnMsIGEgd2FybmluZyB3aWxsIGJlIHByaW50ZWQKLS8vIGJvdGggb24gc3RkZXJyIGFuZCBvbiB0aGUgb3V0cHV0IGZpbGUgaWYgdGhlcmUgaXMgb25lLgotLy8gVGhlIGxlZiB3cml0ZXIgZG9lcyBub3QgcHJvdmlkZSBhbnkgZGVmYXVsdCBjYWxsYmFjayBmdW5jdGlvbnMgZm9yCi0vLyB0aGUgcmVxdWlyZWQgc2VjdGlvbnMuCi0vLwotLy8gQXV0aG9yOiBXYW5kYSBkYSBSb3NhCi0vLyBEYXRlOiAgIDA1LzA2Lzk5IAotLy8KLS8vIFJldmlzaW9uczoKLQotI2luY2x1ZGUgImxlZndXcml0ZXJDYWxscy5ocHAiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAibGVmaURlYnVnLmhwcCIKLQotQkVHSU5fTEVGREVGX1BBUlNFUl9OQU1FU1BBQ0UKLQotI2RlZmluZSBNQVhDQlMgICAgMzAKLQotI2RlZmluZSBsZWZ3VmVyc2lvbkNiayAwCi0jZGVmaW5lIGxlZndDYXNlU2Vuc2l0aXZlQ2JrIDEKLSNkZWZpbmUgbGVmd05vV2lyZUV4dGVuc2lvbkNiayAyCi0jZGVmaW5lIGxlZndCdXNCaXRDaGFyc0NiayAzCi0jZGVmaW5lIGxlZndEaXZpZGVyQ2hhckNiayA0Ci0jZGVmaW5lIGxlZndNYW51ZmFjdHVyaW5nR3JpZENiayA1Ci0jZGVmaW5lIGxlZndVc2VNaW5TcGFjaW5nQ2JrIDYKLSNkZWZpbmUgbGVmd0NsZWFyYW5jZU1lYXN1cmVDYmsgNwotI2RlZmluZSBsZWZ3VW5pdHNDYmsgOAotI2RlZmluZSBsZWZ3QW50ZW5uYUlucHV0R2F0ZUFyZWFDYmsgOQotI2RlZmluZSBsZWZ3QW50ZW5uYUluT3V0RGlmZkFyZWFDYmsgMTAKLSNkZWZpbmUgbGVmd0FudGVubmFPdXRwdXREaWZmQXJlYUNiayAxMQotI2RlZmluZSBsZWZ3UHJvcERlZkNiayAxMgotI2RlZmluZSBsZWZ3TGF5ZXJDYmsgMTMKLSNkZWZpbmUgbGVmd1ZpYUNiayAxNAotI2RlZmluZSBsZWZ3VmlhUnVsZUNiayAxNQotI2RlZmluZSBsZWZ3Tm9uRGVmYXVsdENiayAxNgotI2RlZmluZSBsZWZ3Q3Jvc3NUYWxrQ2JrIDE3Ci0jZGVmaW5lIGxlZndOb2lzZVRhYmxlQ2JrIDE4Ci0jZGVmaW5lIGxlZndDb3JyZWN0aW9uVGFibGVDYmsgMTkKLSNkZWZpbmUgbGVmd1NwYWNpbmdDYmsgMjAKLSNkZWZpbmUgbGVmd01pbkZlYXR1cmVDYmsgMjEKLSNkZWZpbmUgbGVmd0RpZWxlY3RyaWNDYmsgMjIKLSNkZWZpbmUgbGVmd0lSRHJvcENiayAyMwotI2RlZmluZSBsZWZ3U2l0ZUNiayAyNAotI2RlZmluZSBsZWZ3QXJyYXlDYmsgMjUKLSNkZWZpbmUgbGVmd01hY3JvQ2JrIDI2Ci0jZGVmaW5lIGxlZndBbnRlbm5hQ2JrIDI3Ci0jZGVmaW5lIGxlZndFeHRDYmsgMjgKLSNkZWZpbmUgbGVmd0VuZExpYkNiayAyOQotCi0vLyBORVcgQ0FMTEJBQ0sgLSB0aGVuIHBsYWNlIGl0IGhlcmUuIAotCi1pbnQgbGVmV1JldFZhbDsKLWV4dGVybiBpbnQgbGVmd0hhc0luaXQ7Ci1leHRlcm4gaW50IGxlZndIYXNJbml0Q2JrOwotCi0jZGVmaW5lIFdSSVRFUl9DQUxMQkFDSyhmdW5jLCB0eXBlKSBcCi0gICAgaWYgKGZ1bmMpIHsgXAotICAgICAgIGlmICgobGVmV1JldFZhbCA9ICgqZnVuYykodHlwZSwgbGVmd1VzZXJEYXRhKSkgPT0gMCkgeyBcCi0gICAgICAgfSBlbHNlIHsgXAotICAgICAgICAgIGxlZmlFcnJvcigxLCAwLCAiVXNlciBjYWxsYmFjayByb3V0aW5lIHJldHVybmVkIGJhZCBzdGF0dXMiKTsgXAotICAgICAgICAgIHJldHVybiBsZWZXUmV0VmFsOyBcCi0gICAgICAgfSBcCi0gICAgfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gICBHbG9iYWwgdmFyaWFibGVzCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1sZWZpVXNlckRhdGEgbGVmd1VzZXJEYXRhID0gMDsKLXN0YXRpYyBjaGFyICpsZWZ3RmlsZU5hbWUgPSAwOwotc3RhdGljIGludCBsZWZ3UmVnaXN0ZXJVbnVzZWQgPSAwOwotCi1leHRlcm4gRklMRSAqbGVmd0ZpbGU7Ci0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAgICAgICBMaXN0IG9mIGNhbGwgYmFjayByb3V0aW5lcwotLy8gIFRoZXNlIGFyZSBmaWxsZWQgaW4gYnkgdGhlIHVzZXIuICBTZWUgdGhlCi0vLyAgICJzZXQiIHJvdXRpbmVzIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBUaGUgY2FsbGJhY2sgcm91dGluZXMKLWxlZndWb2lkQ2JrRm5UeXBlIGxlZndDYWxsYmFja3NTZXFbTUFYQ0JTXSA9IHsKLSAgICAwLCAvLyBsZWZ3VmVyc2lvbkNiawotICAgIDAsIC8vIGxlZndDYXNlU2Vuc2l0aXZlQ2JrCi0gICAgMCwgLy8gbGVmd05vV2lyZUV4dGVuc2lvbkNiawotICAgIDAsIC8vIGxlZndCdXNCaXRDaGFyc0NiawotICAgIDAsIC8vIGxlZndEaXZpZGVyQ2hhckNiawotICAgIDAsIC8vIGxlZndNYW51ZmFjdHVyaW5nR3JpZENiawotICAgIDAsIC8vIGxlZndVc2VNaW5TcGFjaW5nQ2JrCi0gICAgMCwgLy8gbGVmd0NsZWFyYW5jZU1lYXN1cmVDYmsKLSAgICAwLCAvLyBsZWZ3VW5pdHNDYmsgCi0gICAgMCwgLy8gbGVmd0FudGVubmFJbnB1dEdhdGVBcmVhQ2JrCi0gICAgMCwgLy8gbGVmd0FudGVubmFJbk91dERpZmZBcmVhQ2JrCi0gICAgMCwgLy8gbGVmd0FudGVubmFPdXRwdXREaWZmQXJlYUNiawotICAgIDAsIC8vIGxlZndQcm9wRGVmQ2JrCi0gICAgMCwgLy8gbGVmd0xheWVyQ2JrCi0gICAgMCwgLy8gbGVmd1ZpYUNiawotICAgIDAsIC8vIGxlZndWaWFSdWxlQ2JrCi0gICAgMCwgLy8gbGVmd05vbkRlZmF1bHRDYmsKLSAgICAwLCAvLyBsZWZ3Q3Jvc3NUYWxrQ2JrCi0gICAgMCwgLy8gbGVmd05vaXNlVGFibGVDYmsKLSAgICAwLCAvLyBsZWZ3Q29ycmVjdGlvblRhYmxlQ2JrCi0gICAgMCwgLy8gbGVmd1NwYWNpbmdDYmsKLSAgICAwLCAvLyBsZWZ3TWluRmVhdHVyZUNiawotICAgIDAsIC8vIGxlZndEaWVsZWN0cmljQ2JrCi0gICAgMCwgLy8gbGVmd0lSRHJvcENiawotICAgIDAsIC8vIGxlZndTaXRlQ2JrCi0gICAgMCwgLy8gbGVmd0FycmF5Q2JrCi0gICAgMCwgLy8gbGVmd01hY3JvQ2JrCi0gICAgMCwgLy8gbGVmd0FudGVubmFDYmsKLSAgICAwLCAvLyBsZWZ3RXh0Q2JrCi0gICAgMCwgLy8gbGVmd0VuZExpYkNiawotICAgIC8vIEFkZCBORVcgQ0FMTEJBQ0sgaGVyZQotfTsKLQotLy8gdGhlIG9wdGlvbmFsIGFuZCByZXF1aXJlZCBjYWxsYmFja3MKLWludCBsZWZ3Q2FsbGJhY2tzUmVxW01BWENCU10gPSB7Ci0gICAgMCwgICAgLy8gVmVyc2lvbgotICAgIDAsICAgIC8vIENhc2VTZW5zaXRpdmUKLSAgICAwLCAgICAvLyBOb1dpcmVFeHRlbnNpb24KLSAgICAwLCAgICAvLyBCdXNCaXRDaGFycwotICAgIDAsICAgIC8vIERpdmlkZXIKLSAgICAwLCAgICAvLyBNYW51ZmFjdHVyaW5nR3JpZAotICAgIDAsICAgIC8vIFVzZU1pblNwYWNpbmcKLSAgICAwLCAgICAvLyBDbGVhcmFuY2VNZWFzdXJlCi0gICAgMCwgICAgLy8gVW5pdHMKLSAgICAwLCAgICAvLyBBbnRlbm5hSW5wdXRHYXRlQXJlYQotICAgIDAsICAgIC8vIEFudGVubmFJbk91dERpZmZBcmVhCi0gICAgMCwgICAgLy8gQW50ZW5uYU91dHB1dERpZmZBcmVhCi0gICAgMCwgICAgLy8gUHJvcERlZmluaXRpb24KLSAgICAwLCAgICAvLyBMYXllcgotICAgIDAsICAgIC8vIFZpYQotICAgIDAsICAgIC8vIFZpYVJ1bGUKLSAgICAwLCAgICAvLyBOb25EZWZhdWx0Ci0gICAgMCwgICAgLy8gQ3Jvc3NUYWxrCi0gICAgMCwgICAgLy8gTm9pc2VUYWJsZQotICAgIDAsICAgIC8vIENvcnJlY3Rpb25UYWJsZQotICAgIDAsICAgIC8vIFNwYWNpbmcKLSAgICAwLCAgICAvLyBNaW5GZWF0dXJlCi0gICAgMCwgICAgLy8gRGllbGVjdHJpYwotICAgIDAsICAgIC8vIElSRHJvcAotICAgIDAsICAgIC8vIFNpdGUKLSAgICAwLCAgICAvLyBBcnJheQotICAgIDAsICAgIC8vIE1hY3JvCi0gICAgMCwgICAgLy8gQW50ZW5uYQotICAgIDAsICAgIC8vIEV4dGVuc2lvbgotICAgIDAsICAgIC8vIEVuZCBMaWJyYXJ5Ci0gICAgLy8gQWRkIE5FVyBDQUxMQkFDSyBoZXJlCi19OwotCi0vLyBUaGUgc2VjdGlvbiBuYW1lcwotY2hhciBsZWZ3U2VjdGlvbk5hbWVzW01BWENCU10gWzgwXSA9IHsKLSAgICAiVmVyc2lvbiIsCi0gICAgIkNhc2VTZW5zaXRpdmUiLAotICAgICJOb1dpcmVFeHRlbnNpb24iLAotICAgICJCdXNCaXRDaGFycyIsCi0gICAgIkRpdmlkZXJDaGFyIiwKLSAgICAiTWFudWZhY3R1cmluZ0dyaWQiLAotICAgICJVc2VNaW5TcGFjaW5nIiwKLSAgICAiQ2xlYXJhbmNlTWVhc3VyZSIsCi0gICAgIlVuaXRzIiwKLSAgICAiQW50ZW5uYUlucHV0R2F0ZUFyZWEiLAotICAgICJBbnRlbm5hSW5PdXREaWZmQXJlYSIsCi0gICAgIkFudGVubmFPdXRwdXREaWZmQXJlYSIsCi0gICAgIlByb3BlcnR5RGVmaW5pdGlvbiIsCi0gICAgIkxheWVyIiwKLSAgICAiVmlhIiwKLSAgICAiVmlhUnVsZSIsCi0gICAgIk5vbkRlZmF1bHQiLAotICAgICJDcm9zc1RhbGsiLAotICAgICJOb2lzZVRhYmxlIiwKLSAgICAiQ29ycmVjdGlvblRhYmxlIiwKLSAgICAiU3BhY2luZyIsCi0gICAgIk1pbkZlYXR1cmUiLAotICAgICJEaWVsZWN0cmljIiwKLSAgICAiSVJEcm9wIiwKLSAgICAiU2l0ZSIsCi0gICAgIkFycmF5IiwKLSAgICAiTWFjcm8iLAotICAgICJBbnRlbm5hIiwKLSAgICAiRXh0IiwKLSAgICAiRW5kIExpYnJhcnkiLAotICAgIC8vIEFkZCBORVcgQ0FMTEJBQ0sgaGVyZQotfTsKLQotLy8gdGhlIGNhbGwgYmFjayB0eXBlcyBmcm9tIHRoZSBsZWZ3Q2FsbGJhY2tUeXBlX2UKLWxlZndDYWxsYmFja1R5cGVfZSBsZWZ3Q2FsbGJhY2tzVHlwZVtNQVhDQlNdID0gewotICAgIGxlZndWZXJzaW9uQ2JrVHlwZSwKLSAgICBsZWZ3Q2FzZVNlbnNpdGl2ZUNia1R5cGUsCi0gICAgbGVmd05vV2lyZUV4dGVuc2lvbkNia1R5cGUsCi0gICAgbGVmd0J1c0JpdENoYXJzQ2JrVHlwZSwKLSAgICBsZWZ3RGl2aWRlckNoYXJDYmtUeXBlLAotICAgIGxlZndNYW51ZmFjdHVyaW5nR3JpZENia1R5cGUsCi0gICAgbGVmd1VzZU1pblNwYWNpbmdDYmtUeXBlLAotICAgIGxlZndDbGVhcmFuY2VNZWFzdXJlQ2JrVHlwZSwKLSAgICBsZWZ3VW5pdHNDYmtUeXBlLAotICAgIGxlZndBbnRlbm5hSW5wdXRHYXRlQXJlYUNia1R5cGUsCi0gICAgbGVmd0FudGVubmFJbk91dERpZmZBcmVhQ2JrVHlwZSwKLSAgICBsZWZ3QW50ZW5uYU91dHB1dERpZmZBcmVhQ2JrVHlwZSwKLSAgICBsZWZ3UHJvcERlZkNia1R5cGUsCi0gICAgbGVmd0xheWVyQ2JrVHlwZSwKLSAgICBsZWZ3VmlhQ2JrVHlwZSwKLSAgICBsZWZ3VmlhUnVsZUNia1R5cGUsCi0gICAgbGVmd05vbkRlZmF1bHRDYmtUeXBlLAotICAgIGxlZndDcm9zc1RhbGtDYmtUeXBlLAotICAgIGxlZndOb2lzZVRhYmxlQ2JrVHlwZSwKLSAgICBsZWZ3Q29ycmVjdGlvblRhYmxlQ2JrVHlwZSwKLSAgICBsZWZ3U3BhY2luZ0Nia1R5cGUsCi0gICAgbGVmd01pbkZlYXR1cmVDYmtUeXBlLAotICAgIGxlZndEaWVsZWN0cmljQ2JrVHlwZSwKLSAgICBsZWZ3SVJEcm9wQ2JrVHlwZSwKLSAgICBsZWZ3U2l0ZUNia1R5cGUsCi0gICAgbGVmd0FycmF5Q2JrVHlwZSwKLSAgICBsZWZ3TWFjcm9DYmtUeXBlLAotICAgIGxlZndBbnRlbm5hQ2JrVHlwZSwKLSAgICBsZWZ3RXh0Q2JrVHlwZSwKLSAgICBsZWZ3RW5kTGliQ2JrVHlwZSwKLSAgICAvLyBBZGQgTkVXIFRZUEVTIGhlcmUKLX07Ci0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAgIFJvdXRpbmVzIGZvciB0aGUgY2FsbGJhY2tzCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotY29uc3QgY2hhciAqCi1sZWZ3Rk5hbWUoKQotewotICAgIHJldHVybiBsZWZ3RmlsZU5hbWU7Ci19Ci0KLQotaW50Ci1sZWZ3V3JpdGUoRklMRSAgICAgICAgICAqZiwKLSAgICAgICAgICBjb25zdCBjaGFyICAgICpmTmFtZSwKLSAgICAgICAgICBsZWZpVXNlckRhdGEgIHVEYXRhKQotewotICAgIGludCBpOwotCi0gICAgaWYgKGxlZndIYXNJbml0Q2JrID09IDAgJiYgbGVmd0hhc0luaXQgPT0gMCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIChMRUZXUklULTQxMDApOiBsZWZ3V3JpdGUgY2FsbGVkIGJlZm9yZSBsZWZ3SW5pdENia1xuIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBsZWZ3RmlsZU5hbWUgPSAoY2hhciopIGZOYW1lOwotICAgIGxlZndGaWxlID0gZjsKLSAgICBsZWZ3VXNlckRhdGEgPSB1RGF0YTsKLQotICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgbGlzdCBvZiBjYWxsYmFja3MgYW5kIGNhbGwgdGhlIHVzZXIgZGVmaW5lCi0gICAgLy8gY2FsbGJhY2sgcm91dGluZXMgaWYgYW55IGFyZSBzZXQKLQotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhDQlM7IGkrKykgewotICAgICAgICBpZiAobGVmd0NhbGxiYWNrc1NlcVtpXSAhPSAwKSB7ICAgLy8gdXNlciBoYXMgc2V0IGEgY2FsbGJhY2sgZnVuY3Rpb24KLSAgICAgICAgICAgIFdSSVRFUl9DQUxMQkFDSyhsZWZ3Q2FsbGJhY2tzU2VxW2ldLCBsZWZ3Q2FsbGJhY2tzVHlwZVtpXSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobGVmd0NhbGxiYWNrc1JlcVtpXSkgeyAvLyBpdCBpcyByZXF1aXJlZCBidXQgdXNlciBoYXNuJ3Qgc2V0IHVwCi0gICAgICAgICAgICBmcHJpbnRmKGYsCi0gICAgICAgICAgICAgICAgICAgICIjIFdBUk5JTkcgKExFRldSSVQtNDUwMCk6IENhbGxiYWNrIGZvciAlcyBpcyByZXF1aXJlZCwgYnV0IGlzIG5vdCBkZWZpbmVkXG5cbiIsCi0gICAgICAgICAgICAgICAgICAgIGxlZndTZWN0aW9uTmFtZXNbaV0pOwotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAgICAgICAgICJXQVJOSU5HIChMRUZXUklULTQ1MDApOiBDYWxsYmFjayBmb3IgJXMgaXMgcmVxdWlyZWQsIGJ1dCBpcyBub3QgZGVmaW5lZFxuXG4iLAotICAgICAgICAgICAgICAgICAgICBsZWZ3U2VjdGlvbk5hbWVzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZAotbGVmd1NldFVudXNlZENhbGxiYWNrcyhsZWZ3Vm9pZENia0ZuVHlwZSBmdW5jKQotewotICAgIC8vIFNldCBhbGwgb2YgdGhlIGNhbGxiYWNrcyB0aGF0IGhhdmUgbm90IGJlZW4gc2V0IHlldCB0bwotICAgIC8vIHRoZSBnaXZlbiBmdW5jdGlvbi4KLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhDQlM7IGkrKykgewotICAgICAgICBpZiAobGVmd0NhbGxiYWNrc1NlcVtpXSA9PSAwKQotICAgICAgICAgICAgbGVmd0NhbGxiYWNrc1NlcVtpXSA9IChsZWZ3Vm9pZENia0ZuVHlwZSkgZnVuYzsKLSAgICB9Ci19Ci0KLS8vIFRoZXNlIGNvdW50IHVwIHRoZSBudW1iZXIgb2YgdGltZXMgYW4gdW5zZXQgY2FsbGJhY2sgaXMgY2FsbGVkLi4uIAotc3RhdGljIGludCBsZWZ3VW51c2VkQ291bnRbMTAwXTsKLQotaW50Ci1sZWZ3Q291bnRGdW5jKGxlZndDYWxsYmFja1R5cGVfZSAgICBlLAotICAgICAgICAgICAgICBsZWZpVXNlckRhdGEgICAgICAgICAgZCkKLXsKLSAgICBpbnQgaSA9IChpbnQpIGU7Ci0gICAgaWYgKGxlZmlEZWJ1ZygyMykpCi0gICAgICAgIHByaW50ZigiY291bnQgJWQgMHglcFxuIiwgKGludCkgZSwgZCk7Ci0gICAgaWYgKGkgPj0gMCAmJiBpIDwgMTAwKSB7Ci0gICAgICAgIGxlZndVbnVzZWRDb3VudFtpXSArPSAxOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLWxlZndTZXRSZWdpc3RlclVudXNlZENhbGxiYWNrcygpCi17Ci0gICAgaW50IGk7Ci0gICAgbGVmd1JlZ2lzdGVyVW51c2VkID0gMTsKLSAgICBsZWZ3U2V0VW51c2VkQ2FsbGJhY2tzKGxlZndDb3VudEZ1bmMpOwotICAgIGZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykKLSAgICAgICAgbGVmd1VudXNlZENvdW50W2ldID0gMDsKLX0KLQotdm9pZAotbGVmd1ByaW50VW51c2VkQ2FsbGJhY2tzKEZJTEUgKmYpCi17Ci0gICAgaW50IGk7Ci0gICAgaW50IGZpcnN0ID0gMTsKLQotICAgIGlmIChsZWZ3UmVnaXN0ZXJVbnVzZWQgPT0gMCkgewotICAgICAgICBmcHJpbnRmKGYsCi0gICAgICAgICAgICAgICAgIkVSUk9SIChMRUZXUklULTQxMDEpOiBsZWZ3U2V0UmVnaXN0ZXJVbnVzZWRDYWxsYmFja3Mgd2FzIG5vdCBjYWxsZWQgdG8gc2V0dXAgdGhpcyBkYXRhLlxuIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLSAgICAgICAgaWYgKGxlZndVbnVzZWRDb3VudFtpXSkgewotICAgICAgICAgICAgaWYgKGZpcnN0KQotICAgICAgICAgICAgICAgIGZwcmludGYoZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJJTkZPIChMRUZXUklULTQ3MDApOiBMRUYgaXRlbXMgdGhhdCB3ZXJlIHByZXNlbnQgYnV0IGlnbm9yZWQgYmVjYXVzZSBvZiBubyBjYWxsYmFjayB3ZXJlIHNldC5cbiIpOwotICAgICAgICAgICAgZmlyc3QgPSAwOwotICAgICAgICAgICAgc3dpdGNoICgobGVmd0NhbGxiYWNrVHlwZV9lKSBpKSB7Ci0gICAgICAgICAgICBjYXNlIGxlZndWZXJzaW9uQ2JrVHlwZToKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJWZXJzaW9uIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGxlZndDYXNlU2Vuc2l0aXZlQ2JrVHlwZToKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJDYXNlU2Vuc2l0aXZlIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGxlZndOb1dpcmVFeHRlbnNpb25DYmtUeXBlOgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIk5vV2lyZUV4dGVuc2lvbkF0UGlucyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBsZWZ3QnVzQml0Q2hhcnNDYmtUeXBlOgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIkJ1c0JpdENoYXJzIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGxlZndEaXZpZGVyQ2hhckNia1R5cGU6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiRGl2aWRlckNoYXIiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgbGVmd01hbnVmYWN0dXJpbmdHcmlkQ2JrVHlwZToKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJNYW51ZmFjdHVyaW5nR3JpZCIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBsZWZ3VXNlTWluU3BhY2luZ0Nia1R5cGU6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiVXNlTWluU3BhY2luZyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBsZWZ3Q2xlYXJhbmNlTWVhc3VyZUNia1R5cGU6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiQ2xlYXJhbmNlTWVhc3VyZSIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBsZWZ3VW5pdHNDYmtUeXBlOgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIlVuaXRzIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGxlZndBbnRlbm5hSW5wdXRHYXRlQXJlYUNia1R5cGU6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiQW50ZW5uYUlucHV0R2F0ZUFyZWEiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgbGVmd0FudGVubmFJbk91dERpZmZBcmVhQ2JrVHlwZToKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJBbnRlbm5hSW5PdXREaWZmQXJlYSIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBsZWZ3QW50ZW5uYU91dHB1dERpZmZBcmVhQ2JrVHlwZToKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJBbnRlbm5hT3V0cHV0RGlmZkFyZWEiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgbGVmd1Byb3BEZWZDYmtUeXBlOgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIlByb3BlcnR5RGVmaW50aW9uIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGxlZndMYXllckNia1R5cGU6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiTGF5ZXIiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgbGVmd1ZpYUNia1R5cGU6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiVmlhIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGxlZndWaWFSdWxlQ2JrVHlwZToKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJWaWFSdWxlIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGxlZndOb25EZWZhdWx0Q2JrVHlwZToKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJOb25EZWZhdWx0Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGxlZndDcm9zc1RhbGtDYmtUeXBlOgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIkNyb3NzVGFsayIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBsZWZ3Tm9pc2VUYWJsZUNia1R5cGU6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiTm9pc2VUYWJsZSIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBsZWZ3Q29ycmVjdGlvblRhYmxlQ2JrVHlwZToKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJDb3JyZWN0aW9uVGFibGUiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgbGVmd1NwYWNpbmdDYmtUeXBlOgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIlNwYWNpbmciKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgbGVmd01pbkZlYXR1cmVDYmtUeXBlOgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIk1pbkZlYXR1cmUiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgbGVmd0RpZWxlY3RyaWNDYmtUeXBlOgotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIkRpZWxlY3RyaWMiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgbGVmd0lSRHJvcENia1R5cGU6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiSVJEcm9wIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGxlZndTaXRlQ2JrVHlwZToKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJTaXRlIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGxlZndBcnJheUNia1R5cGU6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiQXJyYXkiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgbGVmd01hY3JvQ2JrVHlwZToKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJNYWNybyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBsZWZ3QW50ZW5uYUNia1R5cGU6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiT3V0cHV0QW50ZW5uYSIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBsZWZ3RXh0Q2JrVHlwZToKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJFeHRlbnNpb24iKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgbGVmd0VuZExpYkNia1R5cGU6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiRW5kIExpYnJhcnkiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAvLyBORVcgQ0FMTEJBQ0sgIGFkZCB0aGUgcHJpbnQgaGVyZSAKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiQk9HVVMgRU5UUlkiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZwcmludGYoZiwgIiAlZFxuIiwgbGVmd1VudXNlZENvdW50W2ldKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZAotbGVmd1NldFVzZXJEYXRhKGxlZmlVc2VyRGF0YSBkKQotewotICAgIGxlZndVc2VyRGF0YSA9IGQ7Ci19Ci0KLWxlZmlVc2VyRGF0YQotbGVmd0dldFVzZXJEYXRhKCkKLXsKLSAgICByZXR1cm4gbGVmd1VzZXJEYXRhOwotfQotCi12b2lkCi1sZWZ3U2V0VW5pdHNDYmsobGVmd1ZvaWRDYmtGblR5cGUgZikKLXsKLSAgICBsZWZ3Q2FsbGJhY2tzU2VxW2xlZndVbml0c0Nia10gPSBmOwotfQotCi12b2lkCi1sZWZ3U2V0RGl2aWRlckNoYXJDYmsobGVmd1ZvaWRDYmtGblR5cGUgZikKLXsKLSAgICBsZWZ3Q2FsbGJhY2tzU2VxW2xlZndEaXZpZGVyQ2hhckNia10gPSBmOwotfQotCi12b2lkCi1sZWZ3U2V0TWFudWZhY3R1cmluZ0dyaWRDYmsobGVmd1ZvaWRDYmtGblR5cGUgZikKLXsKLSAgICBsZWZ3Q2FsbGJhY2tzU2VxW2xlZndNYW51ZmFjdHVyaW5nR3JpZENia10gPSBmOwotfQotCi12b2lkCi1sZWZ3U2V0VXNlTWluU3BhY2luZ0NiayhsZWZ3Vm9pZENia0ZuVHlwZSBmKQotewotICAgIGxlZndDYWxsYmFja3NTZXFbbGVmd1VzZU1pblNwYWNpbmdDYmtdID0gZjsKLX0KLQotdm9pZAotbGVmd1NldENsZWFyYW5jZU1lYXN1cmVDYmsobGVmd1ZvaWRDYmtGblR5cGUgZikKLXsKLSAgICBsZWZ3Q2FsbGJhY2tzU2VxW2xlZndDbGVhcmFuY2VNZWFzdXJlQ2JrXSA9IGY7Ci19Ci0KLXZvaWQKLWxlZndTZXROb1dpcmVFeHRlbnNpb25DYmsobGVmd1ZvaWRDYmtGblR5cGUgZikKLXsKLSAgICBsZWZ3Q2FsbGJhY2tzU2VxW2xlZndOb1dpcmVFeHRlbnNpb25DYmtdID0gZjsKLX0KLQotdm9pZAotbGVmd1NldEJ1c0JpdENoYXJzQ2JrKGxlZndWb2lkQ2JrRm5UeXBlIGYpCi17Ci0gICAgbGVmd0NhbGxiYWNrc1NlcVtsZWZ3QnVzQml0Q2hhcnNDYmtdID0gZjsKLX0KLQotdm9pZAotbGVmd1NldENhc2VTZW5zaXRpdmVDYmsobGVmd1ZvaWRDYmtGblR5cGUgZikKLXsKLSAgICBsZWZ3Q2FsbGJhY2tzU2VxW2xlZndDYXNlU2Vuc2l0aXZlQ2JrXSA9IGY7Ci19Ci0KLXZvaWQKLWxlZndTZXRWZXJzaW9uQ2JrKGxlZndWb2lkQ2JrRm5UeXBlIGYpCi17Ci0gICAgbGVmd0NhbGxiYWNrc1NlcVtsZWZ3VmVyc2lvbkNia10gPSBmOwotfQotCi12b2lkCi1sZWZ3U2V0TGF5ZXJDYmsobGVmd1ZvaWRDYmtGblR5cGUgZikKLXsKLSAgICBsZWZ3Q2FsbGJhY2tzU2VxW2xlZndMYXllckNia10gPSBmOwotfQotCi12b2lkCi1sZWZ3U2V0VmlhQ2JrKGxlZndWb2lkQ2JrRm5UeXBlIGYpCi17Ci0gICAgbGVmd0NhbGxiYWNrc1NlcVtsZWZ3VmlhQ2JrXSA9IGY7Ci19Ci0KLXZvaWQKLWxlZndTZXRWaWFSdWxlQ2JrKGxlZndWb2lkQ2JrRm5UeXBlIGYpCi17Ci0gICAgbGVmd0NhbGxiYWNrc1NlcVtsZWZ3VmlhUnVsZUNia10gPSBmOwotfQotCi12b2lkCi1sZWZ3U2V0U3BhY2luZ0NiayhsZWZ3Vm9pZENia0ZuVHlwZSBmKQotewotICAgIGxlZndDYWxsYmFja3NTZXFbbGVmd1NwYWNpbmdDYmtdID0gZjsKLX0KLQotdm9pZAotbGVmd1NldElSRHJvcENiayhsZWZ3Vm9pZENia0ZuVHlwZSBmKQotewotICAgIGxlZndDYWxsYmFja3NTZXFbbGVmd0lSRHJvcENia10gPSBmOwotfQotCi12b2lkCi1sZWZ3U2V0RGllbGVjdHJpY0NiayhsZWZ3Vm9pZENia0ZuVHlwZSBmKQotewotICAgIGxlZndDYWxsYmFja3NTZXFbbGVmd0RpZWxlY3RyaWNDYmtdID0gZjsKLX0KLQotdm9pZAotbGVmd1NldE1pbkZlYXR1cmVDYmsobGVmd1ZvaWRDYmtGblR5cGUgZikKLXsKLSAgICBsZWZ3Q2FsbGJhY2tzU2VxW2xlZndNaW5GZWF0dXJlQ2JrXSA9IGY7Ci19Ci0KLXZvaWQKLWxlZndTZXROb25EZWZhdWx0Q2JrKGxlZndWb2lkQ2JrRm5UeXBlIGYpCi17Ci0gICAgbGVmd0NhbGxiYWNrc1NlcVtsZWZ3Tm9uRGVmYXVsdENia10gPSBmOwotfQotCi12b2lkCi1sZWZ3U2V0U2l0ZUNiayhsZWZ3Vm9pZENia0ZuVHlwZSBmKQotewotICAgIGxlZndDYWxsYmFja3NTZXFbbGVmd1NpdGVDYmtdID0gZjsKLX0KLQotdm9pZAotbGVmd1NldE1hY3JvQ2JrKGxlZndWb2lkQ2JrRm5UeXBlIGYpCi17Ci0gICAgbGVmd0NhbGxiYWNrc1NlcVtsZWZ3TWFjcm9DYmtdID0gZjsKLX0KLQotdm9pZAotbGVmd1NldEFycmF5Q2JrKGxlZndWb2lkQ2JrRm5UeXBlIGYpCi17Ci0gICAgbGVmd0NhbGxiYWNrc1NlcVtsZWZ3QXJyYXlDYmtdID0gZjsKLX0KLQotdm9pZAotbGVmd1NldFByb3BEZWZDYmsobGVmd1ZvaWRDYmtGblR5cGUgZikKLXsKLSAgICBsZWZ3Q2FsbGJhY2tzU2VxW2xlZndQcm9wRGVmQ2JrXSA9IGY7Ci19Ci0KLXZvaWQKLWxlZndTZXRDcm9zc1RhbGtDYmsobGVmd1ZvaWRDYmtGblR5cGUgZikKLXsKLSAgICBsZWZ3Q2FsbGJhY2tzU2VxW2xlZndDcm9zc1RhbGtDYmtdID0gZjsKLX0KLQotdm9pZAotbGVmd1NldE5vaXNlVGFibGVDYmsobGVmd1ZvaWRDYmtGblR5cGUgZikKLXsKLSAgICBsZWZ3Q2FsbGJhY2tzU2VxW2xlZndOb2lzZVRhYmxlQ2JrXSA9IGY7Ci19Ci0KLQotdm9pZAotbGVmd1NldENvcnJlY3Rpb25UYWJsZUNiayhsZWZ3Vm9pZENia0ZuVHlwZSBmKQotewotICAgIGxlZndDYWxsYmFja3NTZXFbbGVmd0NvcnJlY3Rpb25UYWJsZUNia10gPSBmOwotfQotCi0KLXZvaWQKLWxlZndTZXRBbnRlbm5hQ2JrKGxlZndWb2lkQ2JrRm5UeXBlIGYpCi17Ci0gICAgbGVmd0NhbGxiYWNrc1NlcVtsZWZ3QW50ZW5uYUNia10gPSBmOwotfQotCi12b2lkCi1sZWZ3U2V0RXh0Q2JrKGxlZndWb2lkQ2JrRm5UeXBlIGYpCi17Ci0gICAgbGVmd0NhbGxiYWNrc1NlcVtsZWZ3RXh0Q2JrXSA9IGY7Ci19Ci0KLXZvaWQKLWxlZndTZXRFbmRMaWJDYmsobGVmd1ZvaWRDYmtGblR5cGUgZikKLXsKLSAgICBsZWZ3Q2FsbGJhY2tzU2VxW2xlZndFbmRMaWJDYmtdID0gZjsKLX0KLQotLyogTkVXIENBTExCQUNLIC0gRWFjaCBjYWxsYmFjayByb3V0aW5lIG11c3QgaGF2ZSBhIHJvdXRpbmUgdGhhdCBhbGxvd3MKLSAqIHRoZSB1c2VyIHRvIHNldCBpdC4gIFRoZSBzZXQgcm91dGluZXMgZ28gaGVyZS4gKi8KLQotdm9pZAotbGVmd1NldEFudGVubmFJbnB1dEdhdGVBcmVhQ2JrKGxlZndWb2lkQ2JrRm5UeXBlIGYpCi17Ci0gICAgbGVmd0NhbGxiYWNrc1NlcVtsZWZ3QW50ZW5uYUlucHV0R2F0ZUFyZWFDYmtdID0gZjsKLX0KLQotdm9pZAotbGVmd1NldEFudGVubmFJbk91dERpZmZBcmVhQ2JrKGxlZndWb2lkQ2JrRm5UeXBlIGYpCi17Ci0gICAgbGVmd0NhbGxiYWNrc1NlcVtsZWZ3QW50ZW5uYUluT3V0RGlmZkFyZWFDYmtdID0gZjsKLX0KLQotdm9pZAotbGVmd1NldEFudGVubmFPdXRwdXREaWZmQXJlYUNiayhsZWZ3Vm9pZENia0ZuVHlwZSBmKQotewotICAgIGxlZndDYWxsYmFja3NTZXFbbGVmd0FudGVubmFPdXRwdXREaWZmQXJlYUNia10gPSBmOwotfQotCi1leHRlcm4gTEVGSV9MT0dfRlVOQ1RJT04gbGVmd0Vycm9yTG9nRnVuY3Rpb247Ci0KLXZvaWQKLWxlZndTZXRMb2dGdW5jdGlvbihMRUZJX0xPR19GVU5DVElPTiBmKQotewotICAgIGxlZndFcnJvckxvZ0Z1bmN0aW9uID0gZjsKLX0KLWV4dGVybiBMRUZJX1dBUk5JTkdfTE9HX0ZVTkNUSU9OIGxlZndXYXJuaW5nTG9nRnVuY3Rpb247Ci0KLXZvaWQKLWxlZndTZXRXYXJuaW5nTG9nRnVuY3Rpb24oTEVGSV9XQVJOSU5HX0xPR19GVU5DVElPTiBmKQotewotICAgIGxlZndXYXJuaW5nTG9nRnVuY3Rpb24gPSBmOwotfQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmd1dyaXRlckNhbGxzLmhwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGVmd1dyaXRlckNhbGxzLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIzMjM3Mi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xlZndXcml0ZXJDYWxscy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiAtIDIwMTMsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaWZuZGVmIExFRklfV1JJVEVSX0gKLSNkZWZpbmUgTEVGSV9XUklURVJfSAotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSAKLSNpbmNsdWRlICJsZWZpS1JEZWZzLmhwcCIKLSNpbmNsdWRlICJsZWZpRGVmcy5ocHAiCi0jaW5jbHVkZSAibGVmaVVzZXIuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0vKgotICogVGhlIG1haW4gd3JpdGVyIGZ1bmN0aW9uLgotICogVGhlIGZpbGUgc2hvdWxkIGFscmVhZHkgYmUgb3BlbmVkLiAgVGhpcyByZXF1aXJlbWVudCBhbGxvd3MKLSAqIHRoZSB3cml0ZXIgdG8gYmUgdXNlZCB3aXRoIHN0ZGluIG9yIGEgcGlwZS4gIFRoZSBmaWxlIG5hbWUKLSAqIGlzIG9ubHkgdXNlZCBmb3IgZXJyb3IgbWVzc2FnZXMuICBUaGUgaW5jbHVkZVNlYXJjaFBhdGggaXMKLSAqIGEgY29sb24tZGVsaW1pdGVkIGxpc3Qgb2YgZGlyZWN0b3JpZXMgaW4gd2hpY2ggdG8gZmluZAotICogaW5jbHVkZSBmaWxlcy4KLSAqLwotZXh0ZXJuIGludCBsZWZ3V3JpdGUgKCBGSUxFICpmaWxlLAotICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgbGVmaVVzZXJEYXRhIHVzZXJEYXRhICk7Ci0KLS8qCi0gKiBTZXQgYWxsIG9mIHRoZSBjYWxsYmFja3MgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBzZXQgdG8gYSBmdW5jdGlvbgotICogdGhhdCB3aWxsIGFkZCB1cCBob3cgbWFueSB0aW1lcyBhIGdpdmVuIGxlZiBkYXRhIHR5cGUgd2FzIGlnbm9yZWQKLSAqIChpZSBubyBjYWxsYmFjayB3YXMgZG9uZSkuICBUaGUgc3RhdGlzdGljcyBjYW4gbGF0ZXIgYmUgcHJpbnRlZCBvdXQuCi0gKi8KLWV4dGVybiB2b2lkIGxlZndTZXRSZWdpc3RlclVudXNlZENhbGxiYWNrcyAoIHZvaWQgKTsKLWV4dGVybiB2b2lkIGxlZndQcmludFVudXNlZENhbGxiYWNrcyAoIEZJTEUqIGYgKTsKLQotLyoKLSAqIFNldC9nZXQgdGhlIGNsaWVudC1wcm92aWRlZCB1c2VyIGRhdGEuICBsZWZpIGRvZXNuJ3QgbG9vayBhdAotICogdGhpcyBkYXRhIGF0IGFsbCwgaXQgc2ltcGx5IHBhc3NlcyB0aGUgb3BhcXVlIGxlZmlVc2VyRGF0YSBwb2ludGVyCi0gKiBiYWNrIHRvIHRoZSBhcHBsaWNhdGlvbiB3aXRoIGVhY2ggY2FsbGJhY2suICBUaGUgY2xpZW50IGNhbgotICogY2hhbmdlIHRoZSBkYXRhIGF0IGFueSB0aW1lLCBhbmQgaXQgd2lsbCB0YWtlIGVmZmVjdCBvbiB0aGUKLSAqIG5leHQgY2FsbGJhY2suICBUaGUgbGVmaSB3cml0ZXIgYW5kIHdyaXRlciBtYWludGFpbiBzZXBhcmF0ZQotICogdXNlciBkYXRhIHBvaW50ZXJzLgotICovCi1leHRlcm4gdm9pZCBsZWZ3U2V0VXNlckRhdGEgKCBsZWZpVXNlckRhdGEgKTsKLWV4dGVybiBsZWZpVXNlckRhdGEgbGVmd0dldFVzZXJEYXRhICggdm9pZCApOwotIAotLyoKLSAqIEFuIGVudW0gZGVzY3JpYmluZyBhbGwgb2YgdGhlIHR5cGVzIG9mIHdyaXRlciBjYWxsYmFja3MuCi0gKi8KLXR5cGVkZWYgZW51bSB7Ci0gIGxlZndVbnNwZWNpZmllZENia1R5cGUgPSAwLAotICBsZWZ3VmVyc2lvbkNia1R5cGUsCi0gIGxlZndDYXNlU2Vuc2l0aXZlQ2JrVHlwZSwKLSAgbGVmd05vV2lyZUV4dGVuc2lvbkNia1R5cGUsCi0gIGxlZndCdXNCaXRDaGFyc0Nia1R5cGUsCi0gIGxlZndEaXZpZGVyQ2hhckNia1R5cGUsCi0gIGxlZndNYW51ZmFjdHVyaW5nR3JpZENia1R5cGUsCi0gIGxlZndVc2VNaW5TcGFjaW5nQ2JrVHlwZSwKLSAgbGVmd0NsZWFyYW5jZU1lYXN1cmVDYmtUeXBlLAotICBsZWZ3VW5pdHNDYmtUeXBlLAotICBsZWZ3QW50ZW5uYUlucHV0R2F0ZUFyZWFDYmtUeXBlLAotICBsZWZ3QW50ZW5uYUluT3V0RGlmZkFyZWFDYmtUeXBlLAotICBsZWZ3QW50ZW5uYU91dHB1dERpZmZBcmVhQ2JrVHlwZSwKLSAgbGVmd1Byb3BEZWZDYmtUeXBlLAotICBsZWZ3TGF5ZXJDYmtUeXBlLAotICBsZWZ3VmlhQ2JrVHlwZSwKLSAgbGVmd1ZpYVJ1bGVDYmtUeXBlLAotICBsZWZ3Tm9uRGVmYXVsdENia1R5cGUsCi0gIGxlZndDcm9zc1RhbGtDYmtUeXBlLAotICBsZWZ3Tm9pc2VUYWJsZUNia1R5cGUsCi0gIGxlZndDb3JyZWN0aW9uVGFibGVDYmtUeXBlLAotICBsZWZ3U3BhY2luZ0Nia1R5cGUsCi0gIGxlZndNaW5GZWF0dXJlQ2JrVHlwZSwKLSAgbGVmd0RpZWxlY3RyaWNDYmtUeXBlLAotICBsZWZ3SVJEcm9wQ2JrVHlwZSwKLSAgbGVmd1NpdGVDYmtUeXBlLAotICBsZWZ3QXJyYXlDYmtUeXBlLAotICBsZWZ3TWFjcm9DYmtUeXBlLAotICBsZWZ3QW50ZW5uYUNia1R5cGUsCi0gIGxlZndFeHRDYmtUeXBlLAotICBsZWZ3RW5kTGliQ2JrVHlwZQotCi0gIC8qIE5FVyBDQUxMQkFDS1MgLSBlYWNoIGNhbGxiYWNrIGhhcyBpdHMgb3duIHR5cGUuICBGb3IgZWFjaCBjYWxsYmFjawotICAgKiB0aGF0IHlvdSBhZGQsIHlvdSBtdXN0IGFkZCBhbiBpdGVtIHRvIHRoaXMgZW51bS4gKi8KLQotfSBsZWZ3Q2FsbGJhY2tUeXBlX2U7Ci0gCi0gCi0vKiBEZWNsYXJhdGlvbnMgb2YgZnVuY3Rpb24gc2lnbmF0dXJlcyBmb3IgZWFjaCB0eXBlIG9mIGNhbGxiYWNrLgotICogVGhlc2UgZGVjbGFyYXRpb25zIGFyZSB0eXBlLXNhZmUgd2hlbiBjb21waWxpbmcgd2l0aCBBTlNJIEMKLSAqIG9yIEMrKzsgeW91IHdpbGwgb25seSBiZSBhYmxlIHRvIHJlZ2lzdGVyIGEgZnVuY3Rpb24gcG9pbnRlcgotICogd2l0aCB0aGUgY29ycmVjdCBzaWduYXR1cmUgZm9yIGEgZ2l2ZW4gdHlwZSBvZiBjYWxsYmFjay4KLSAqCi0gKiBFYWNoIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIHJldHVybiAwIGlmIHN1Y2Nlc3NmdWwuCi0gKiBBIG5vbi16ZXJvIHJldHVybiBjb2RlIHdpbGwgY2F1c2UgdGhlIHdyaXRlciB0byBhYm9ydC4KLSAqCi0gKiBUaGUgbGVmd0Rlc2lnblN0YXJ0IGFuZCBsZWZ3RGVzaWduRW5kIGNhbGxiYWNrIGlzIG9ubHkgY2FsbGVkIG9uY2UuCi0gKiBPdGhlciBjYWxsYmFja3MgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcywgZWFjaCB0aW1lIHdpdGggYSBkaWZmZXJlbnQKLSAqIHNldCBvZiBkYXRhLgotICoKLSAqIEZvciBlYWNoIGNhbGxiYWNrLCB0aGUgTGVmIEFQSSB3aWxsIG1ha2UgdGhlIGNhbGxiYWNrIHRvIHRoZQotICogZnVuY3Rpb24gc3VwcGxpZWQgYnkgdGhlIGNsaWVudCwgd2hpY2ggc2hvdWxkIGVpdGhlciBtYWtlIGEgY29weQotICogb2YgdGhlIExlZiBvYmplY3QsIG9yIHN0b3JlIHRoZSBkYXRhIGluIHRoZSBjbGllbnQncyBvd24gZGF0YSBzdHJ1Y3R1cmVzLgotICogVGhlIExlZiBBUEkgd2lsbCBkZWxldGUgb3IgcmV1c2UgZWFjaCBvYmplY3QgYWZ0ZXIgbWFraW5nIHRoZSBjYWxsYmFjaywKLSAqIHNvIHRoZSBjbGllbnQgc2hvdWxkIG5vdCBrZWVwIGEgcG9pbnRlciB0byBpdC4KLSAqCi0gKiBBbGwgY2FsbGJhY2tzIHBhc3MgdGhlIHVzZXIgZGF0YSBwb2ludGVyIHByb3ZpZGVkIGluIGxlZndSZWFkKCkKLSAqIG9yIGxlZndTZXRVc2VyRGF0YSgpIGJhY2sgdG8gdGhlIGNsaWVudDsgdGhpcyBjYW4gYmUgdXNlZCBieSB0aGUKLSAqIGNsaWVudCB0byBvYnRhaW4gYWNjZXNzIHRvIHRoZSByZXN0IG9mIHRoZSBjbGllbnQncyBkYXRhIHN0cnVjdHVyZXMuCi0gKgotICogVGhlIHVzZXIgZGF0YSBwb2ludGVyIGlzIG9idGFpbmVkIHVzaW5nIGxlZndHZXRVc2VyRGF0YSgpIGltbWVkaWF0ZWx5Ci0gKiBwcmlvciB0byBtYWtpbmcgZWFjaCBjYWxsYmFjaywgc28gdGhlIGNsaWVudCBpcyBmcmVlIHRvIGNoYW5nZSB0aGUKLSAqIHVzZXIgZGF0YSBvbiB0aGUgZmx5IGlmIG5lY2Vzc2FyeS4KLSAqCi0gKiBDYWxsYmFja3Mgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgYXJlIHBhc3NlZCBhIGNhbGxiYWNrIHR5cGUKLSAqIHBhcmFtZXRlciwgd2hpY2ggYWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIHdyaXRlIGEgc2luZ2xlIGNhbGxiYWNrCi0gKiBmdW5jdGlvbiwgcmVnaXN0ZXIgdGhhdCBmdW5jdGlvbiBmb3IgbXVsdGlwbGUgY2FsbGJhY2tzLCB0aGVuCi0gKiBzd2l0Y2ggYmFzZWQgb24gdGhlIGNhbGxiYWNrIHR5cGUgdG8gaGFuZGxlIHRoZSBhcHByb3ByaWF0ZSB0eXBlIG9mCi0gKiBkYXRhLgotICovCi0gCi0KLS8vIEEgZGVjbGFyYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgcmV0dXJuIG5vdGhpbmcuIAotdHlwZWRlZiBpbnQgKCpsZWZ3Vm9pZENia0ZuVHlwZSkgKCBsZWZ3Q2FsbGJhY2tUeXBlX2UsIGxlZmlVc2VyRGF0YSApOwotCi0gLyogTkVXIENBTExCQUNLIC0gSWYgeW91ciBjYWxsYmFjayByZXR1cm5zIGEgcG9pbnRlciB0byBhIG5ldyBjbGFzcyB0aGVuCi0gICogeW91IG11c3QgYWRkIGEgdHlwZSBmdW5jdGlvbiBoZXJlLiAqLwotCi0vKiBGdW5jdGlvbnMgdG8gY2FsbCB0byByZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uLgotICovCi1leHRlcm4gdm9pZCBsZWZ3U2V0VmVyc2lvbkNiayhsZWZ3Vm9pZENia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBsZWZ3U2V0Q2FzZVNlbnNpdGl2ZUNiayhsZWZ3Vm9pZENia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBsZWZ3U2V0Tm9XaXJlRXh0ZW5zaW9uQ2JrKGxlZndWb2lkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGxlZndTZXRCdXNCaXRDaGFyc0NiayhsZWZ3Vm9pZENia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBsZWZ3U2V0RGl2aWRlckNoYXJDYmsobGVmd1ZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmd1NldE1hbnVmYWN0dXJpbmdHcmlkQ2JrKGxlZndWb2lkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGxlZndTZXRVc2VNaW5TcGFjaW5nQ2JrKGxlZndWb2lkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGxlZndTZXRDbGVhcmFuY2VNZWFzdXJlQ2JrKGxlZndWb2lkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGxlZndTZXRVbml0c0NiayhsZWZ3Vm9pZENia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBsZWZ3QW50ZW5uYUlucHV0R2F0ZUFyZWFDYmsobGVmd1ZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmd0FudGVubmFJbk91dERpZmZBcmVhQ2JrKGxlZndWb2lkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGxlZndBbnRlbm5hT3V0cHV0RGlmZkFyZWFDYmsobGVmd1ZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmd1NldFByb3BEZWZDYmsobGVmd1ZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmd1NldExheWVyQ2JrKGxlZndWb2lkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGxlZndTZXRWaWFDYmsobGVmd1ZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmd1NldFZpYVJ1bGVDYmsobGVmd1ZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmd1NldE5vbkRlZmF1bHRDYmsobGVmd1ZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmd1NldENyb3NzVGFsa0NiayhsZWZ3Vm9pZENia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBsZWZ3U2V0Tm9pc2VUYWJsZUNiayhsZWZ3Vm9pZENia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBsZWZ3U2V0Q29ycmVjdGlvblRhYmxlQ2JrKGxlZndWb2lkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGxlZndTZXRTcGFjaW5nQ2JrKGxlZndWb2lkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGxlZndTZXRNaW5GZWF0dXJlQ2JrKGxlZndWb2lkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGxlZndTZXREaWVsZWN0cmljQ2JrKGxlZndWb2lkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGxlZndTZXRJUkRyb3BDYmsobGVmd1ZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmd1NldFNpdGVDYmsobGVmd1ZvaWRDYmtGblR5cGUpOwotZXh0ZXJuIHZvaWQgbGVmd1NldEFycmF5Q2JrKGxlZndWb2lkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGxlZndTZXRNYWNyb0NiayhsZWZ3Vm9pZENia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBsZWZ3U2V0QW50ZW5uYUNiayhsZWZ3Vm9pZENia0ZuVHlwZSk7Ci1leHRlcm4gdm9pZCBsZWZ3U2V0RXh0Q2JrKGxlZndWb2lkQ2JrRm5UeXBlKTsKLWV4dGVybiB2b2lkIGxlZndTZXRFbmRMaWJDYmsobGVmd1ZvaWRDYmtGblR5cGUpOwotCi0vKiBORVcgQ0FMTEJBQ0sgLSBlYWNoIGNhbGxiYWNrIG11c3QgaGF2ZSBhIGZ1bmN0aW9uIHRvIGFsbG93IHRoZSB1c2VyCi0gKiB0byBzZXQgaXQuICBBZGQgdGhlIGZ1bmN0aW9uIGhlcmUuICovCi0KLS8qCi0gKiBTZXQgYWxsIG9mIHRoZSBjYWxsYmFja3MgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBzZXQgdG8gdGhlIGZvbGxvd2luZwotICogZnVuY3Rpb24uICBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGNoZWNrIHRvIHNlZQotICogaWYgeW91IGZvcmdvdCBhbnl0aGluZy4KLSAqLwotZXh0ZXJuIHZvaWQgbGVmd1NldFVudXNlZENhbGxiYWNrcyAobGVmd1ZvaWRDYmtGblR5cGUgZnVuYyk7Ci0KLS8vIFJvdXRpbmUgdG8gc2V0IHRoZSBtZXNzYWdlIGxvZ2dpbmcgcm91dGluZSBmb3IgZXJyb3JzIAotdHlwZWRlZiB2b2lkICgqTEVGSV9MT0dfRlVOQ1RJT04pKGNvbnN0IGNoYXIqKTsKLWV4dGVybiB2b2lkIGxlZndTZXRMb2dGdW5jdGlvbiggTEVGSV9MT0dfRlVOQ1RJT04gKTsKLQotLy8gUm91dGluZSB0byBzZXQgdGhlIG1lc3NhZ2UgbG9nZ2luZyByb3V0aW5lIGZvciB3YXJuaW5ncyAKLXR5cGVkZWYgdm9pZCAoKkxFRklfV0FSTklOR19MT0dfRlVOQ1RJT04pKGNvbnN0IGNoYXIqKTsKLWV4dGVybiB2b2lkIGxlZndTZXRXYXJuaW5nTG9nRnVuY3Rpb24oIExFRklfV0FSTklOR19MT0dfRlVOQ1RJT04gKTsKLQotRU5EX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi0KLVVTRV9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGV4LmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmL2xleC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Zjk1MzE5Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWYvbGV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAyMDEyIC0gMjAxNCwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotICogCi0gKiBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotICogRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0gKiAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0gKiAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAKLSAqIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0gKiBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCi0gKiAgJEF1dGhvcjogZGVsbCAkCi0gKiAgJFJldmlzaW9uOiAjMSAkCi0gKiAgJERhdGU6IDIwMTcvMDYvMDYgJAotICogICRTdGF0ZTogICQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgbGVoX2gKLSNkZWZpbmUgbGVoX2gKLQotI2luY2x1ZGUgImxlZmlLUkRlZnMuaHBwIgotCi1CRUdJTl9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi12b2lkIGxlZkFkZFN0cmluZ0RlZmluZShjb25zdCBjaGFyICAgICp0b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKnN0cmluZyk7Ci0KLXZvaWQgbGVmQWRkQm9vbGVhbkRlZmluZShjb25zdCBjaGFyICAgKnRva2VuLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB2YWwpOwotCi12b2lkIGxlZkFkZE51bURlZmluZShjb25zdCBjaGFyICAqdG9rZW4sCi0gICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICB2YWwpOwotCi12b2lkIHl5ZXJyb3IoY29uc3QgY2hhciAqcyk7Ci12b2lkIGxlZkVycm9yKGludCAgICAgICAgICAgbXNnTnVtLAotICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpzKTsKLXZvaWQgbGVmV2FybmluZyhpbnQgICAgICAgICBtc2dOdW0sCi0gICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKnMpOwotdm9pZCBsZWZJbmZvKGludCAgICAgICAgbXNnTnVtLAotICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnMpOwotdm9pZCAqbGVmTWFsbG9jKHNpemVfdCBsZWZfc2l6ZSk7Ci12b2lkICpsZWZSZWFsbG9jKHZvaWQgICAqbmFtZSwKLSAgICAgICAgICAgICAgICAgc2l6ZV90ICAgIGxlZl9zaXplKTsKLXZvaWQgbGVmRnJlZSh2b2lkICpuYW1lKTsKLXZvaWQgbGVmU2V0Tm9uRGVmYXVsdChjb25zdCBjaGFyICpuYW1lKTsKLXZvaWQgbGVmVW5zZXROb25EZWZhdWx0KCk7Ci0KLWV4dGVybiBpbnQgeXlsZXgoKTsKLWV4dGVybiB2b2lkIGxleF9pbml0KCk7Ci1leHRlcm4gaW50IGxlZnl5cGFyc2UoKTsKLWV4dGVybiB2b2lkIGxleF91bl9pbml0KCk7Ci0KLWludCBmYWtlX2Z0ZWxsKCk7Ci0KLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWZkaWZmL2RpZmZMZWZSVy5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmZGlmZi9kaWZmTGVmUlcuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGExNTE1Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWZkaWZmL2RpZmZMZWZSVy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAxICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTIgLSAyMDE1LCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3IkCi0vLyAgJFJldmlzaW9uJAotLy8gICREYXRlJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIAotLy8gVGhpcyBwcm9ncmFtIGlzIHRoZSBkaWZmTGVmIGNvcmUgcHJvZ3JhbS4gIEl0IGhhcyBhbGwgdGhlIGNhbGxiYWNrCi0vLyByb3V0aW5lcyBhbmQgd3JpdGUgaXQgb3V0IHRvIGEgdGVtcG9yYXJ5IGZpbGUKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaWZuZGVmIFdJTjMyCi0jICAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYgLyogbm90IFdJTjMyICovCi0jaW5jbHVkZSAibGVmclJlYWRlci5ocHAiCi0jaW5jbHVkZSAibGVmd1dyaXRlci5ocHAiCi0jaW5jbHVkZSAibGVmaURlYnVnLmhwcCIKLQotY2hhciAgICBkZWZhdWx0TmFtZVsxMjhdOwotY2hhciAgICBkZWZhdWx0T3V0WzEyOF07Ci1GSUxFKiAgIGZvdXQ7Ci1pbnQgICAgIHByaW50aW5nID0gMDsgICAgIC8vIFByaW50aW5nIHRoZSBvdXRwdXQuCi12b2lkKiAgIHVzZXJEYXRhOwotCi0vLyBUWF9ESVI6VFJBTlNMQVRJT04gT04KLSAKLXZvaWQgZGF0YUVycm9yKCkgewotICBmcHJpbnRmKGZvdXQsICJFUlJPUjogcmV0dXJuZWQgdXNlciBkYXRhIGlzIG5vdCBjb3JyZWN0IVxuIik7Ci19Ci0gCi0KLXZvaWQgY2hlY2tUeXBlKGxlZnJDYWxsYmFja1R5cGVfZSBjKSB7Ci0gIGlmIChjID49IDAgJiYgYyA8PSBsZWZyTGlicmFyeUVuZENia1R5cGUpIHsKLSAgICAvLyBPSwotICB9IGVsc2UgewotICAgIGZwcmludGYoZm91dCwgIkVSUk9SOiBjYWxsYmFjayB0eXBlIGlzIG91dCBvZiBib3VuZHMhXG4iKTsKLSAgfQotfQotCi0vLyAwNS8yNC8yMDAxIC0gV2FuZGEgZGEgUm9zYS4gIFBDUiAzNzMxNzAKLS8vIFRoaXMgZnVuY3Rpb24gaXMgYWRkZWQgZHVlIHRvIHRoZSByb3VuZGluZyBiZXR3ZWVuIG1hY2hpbmVzIGFyZQotLy8gZGlmZmVyZW50LiAgRm9yIGEgNSwgc29sYXJpZXMgd2lsbCByb3VuZCBkb3duIHdoaWxlIGhwcGEgd2lsbCByb3VuZHVwLgotLy8gVGhpcyBmdW5jdGlvbiB3aWxsIG1ha2Ugc3VyZSBpdCByb3VuZCB1cCBmb3IgYWxsIHRoZSBtYWNoaW5lCi1kb3VibGUgY2hrTnVtKGRvdWJsZSBudW0pIHsKLSAgbG9uZyB0ZW1wTnVtOwotICBpZiAoKG51bSA+IDEwMDAwMDQpIHx8IChudW0gPCAtMTAwMDAwNCkpIHsKLSAgICAgdGVtcE51bSA9IChsb25nKW51bTsKLSAgICAgaWYgKCh0ZW1wTnVtJTUpID09IDApCi0gICAgICAgIHJldHVybiBudW0gKyAzOwotICB9Ci0gIHJldHVybiBudW07Ci19Ci0KLS8vIFByaW50IFZpYQotdm9pZCBsZWZWaWEobGVmaVZpYSogdmlhLCBjaGFyKiBpbk5hbWUpIHsKLSAgaW50IGksIGo7Ci0KLSAgZnByaW50Zihmb3V0LCAiJXMgJXMiLCBpbk5hbWUsIHZpYS0+bmFtZSgpKTsKLSAgaWYgKHZpYS0+aGFzRGVmYXVsdCgpKQotICAgICBmcHJpbnRmKGZvdXQsICIgREVGQVVMVCIpOwotICBpZiAodmlhLT5oYXNHZW5lcmF0ZWQoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiIEdFTkVSQVRFRCIpOwotICBpZiAodmlhLT5oYXNUb3BPZlN0YWNrKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiBUT1BPRlNUQUNLT05MWSIpOwotICBpZiAodmlhLT5oYXNGb3JlaWduKCkpIHsKLSAgICAgZnByaW50Zihmb3V0LCAiIEZPUkVJR04gJXMiLCB2aWEtPmZvcmVpZ24oKSk7Ci0gICAgIGlmICh2aWEtPmhhc0ZvcmVpZ25QbnQoKSkgewotICAgICAgICBmcHJpbnRmKGZvdXQsICIgKCAlZyAlZyApIiwgY2hrTnVtKHZpYS0+Zm9yZWlnblgoKSksCi0gICAgICAgICAgICAgICAgY2hrTnVtKHZpYS0+Zm9yZWlnblkoKSkpOwotICAgICAgICBpZiAodmlhLT5oYXNGb3JlaWduT3JpZW50KCkpCi0gICAgICAgICAgIGZwcmludGYoZm91dCwgIiAlcyIsIGxlZmlPcmllbnRTdHIodmlhLT5mb3JlaWduT3JpZW50KCkpKTsKLSAgICAgfQotICB9Ci0gIGZwcmludGYoZm91dCwgIlxuIik7Ci0gIGlmICh2aWEtPmhhc1Byb3BlcnRpZXMoKSkgewotICAgICBmb3IgKGkgPSAwOyBpIDwgdmlhLT5udW1Qcm9wZXJ0aWVzKCk7IGkrKykgewotICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAlcyBQUk9QIiwgaW5OYW1lLCB2aWEtPm5hbWUoKSk7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIiAlcyIsIHZpYS0+cHJvcE5hbWUoaSkpOwotICAgICAgICBpZiAodmlhLT5wcm9wSXNOdW1iZXIoaSkpCi0gICAgICAgICAgIGZwcmludGYoZm91dCwgIiAlZyIsIGNoa051bSh2aWEtPnByb3BOdW1iZXIoaSkpKTsKLSAgICAgICAgaWYgKHZpYS0+cHJvcElzU3RyaW5nKGkpKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgJXMiLCB2aWEtPnByb3BWYWx1ZShpKSk7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgIH0KLSAgfQotICBpZiAodmlhLT5oYXNWaWFSdWxlKCkpIHsKLSAgICAgZnByaW50Zihmb3V0LCAiJXMgJXMgJWcgJWcgJXMgJXMgJXMgJWcgJWcgJWcgJWcgJWcgJWciLCB2aWEtPm5hbWUoKSwKLSAgICAgICAgICAgICB2aWEtPnZpYVJ1bGVOYW1lKCksIHZpYS0+eEN1dFNpemUoKSwgdmlhLT55Q3V0U2l6ZSgpLAotICAgICAgICAgICAgIHZpYS0+Ym90TWV0YWxMYXllcigpLCAgdmlhLT5jdXRMYXllcigpLCB2aWEtPnRvcE1ldGFsTGF5ZXIoKSwKLSAgICAgICAgICAgICB2aWEtPnhDdXRTcGFjaW5nKCksIHZpYS0+eUN1dFNwYWNpbmcoKSwgdmlhLT54Qm90RW5jKCksCi0gICAgICAgICAgICAgdmlhLT55Qm90RW5jKCksIHZpYS0+eFRvcEVuYygpLCB2aWEtPnlUb3BFbmMoKSk7Ci0gICAgIGlmICh2aWEtPmhhc1Jvd0NvbCgpKQotICAgICAgICBmcHJpbnRmKGZvdXQsICIgJWQgJWQiLCB2aWEtPm51bUN1dFJvd3MoKSwgdmlhLT5udW1DdXRDb2xzKCkpOwotICAgICBpZiAodmlhLT5oYXNPcmlnaW4oKSkKLSAgICAgICAgZnByaW50Zihmb3V0LCAiICVnICVnIiwgdmlhLT54T2Zmc2V0KCksIHZpYS0+eU9mZnNldCgpKTsKLSAgICAgaWYgKHZpYS0+aGFzT2Zmc2V0KCkpCi0gICAgICAgIGZwcmludGYoZm91dCwgIiAlZyAlZyAlZyAlZyIsIHZpYS0+eEJvdE9mZnNldCgpLCB2aWEtPnlCb3RPZmZzZXQoKSwKLSAgICAgICAgICAgICAgICB2aWEtPnhUb3BPZmZzZXQoKSwgdmlhLT55VG9wT2Zmc2V0KCkpOwotICAgICBpZiAodmlhLT5oYXNDdXRQYXR0ZXJuKCkpCi0gICAgICAgIGZwcmludGYoZm91dCwgIiAlcyIsIHZpYS0+Y3V0UGF0dGVybigpKTsKLSAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgfQotICBpZiAodmlhLT5oYXNSZXNpc3RhbmNlKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiVzICVzIFJFU0lTVEFOQ0UgJWdcbiIsaW5OYW1lLCB2aWEtPm5hbWUoKSwKLSAgICAgICAgICAgICBjaGtOdW0odmlhLT5yZXNpc3RhbmNlKCkpKTsKLSAgaWYgKHZpYS0+bnVtTGF5ZXJzKCkgPiAwKSB7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCB2aWEtPm51bUxheWVycygpOyBpKyspIHsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgJXMgTEFZRVIgJXNcbiIsIGluTmFtZSwgdmlhLT5uYW1lKCksCi0gICAgICAgICAgICAgICAgdmlhLT5sYXllck5hbWUoaSkpOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgdmlhLT5udW1SZWN0cyhpKTsgaisrKSB7Ci0JICAgaWYgKHZpYS0+cmVjdENvbG9yTWFzayhpLCBqKSkgewotCQlmcHJpbnRmKGZvdXQsICIlcyAlcyBSRUNUIE1BU0sgJSBkICggJWcgJWcgKSAoICVnICVnIClcbiIsIAotCQkJaW5OYW1lLCB2aWEtPm5hbWUoKSwgdmlhLT5yZWN0Q29sb3JNYXNrKGksIGopLAotCQkJY2hrTnVtKHZpYS0+eGwoaSwgaikpLCBjaGtOdW0odmlhLT55bChpLCBqKSksCi0JCQljaGtOdW0odmlhLT54aChpLCBqKSksIGNoa051bSh2aWEtPnloKGksIGopKSk7Ci0gICAgICAgICAgIH0gZWxzZSB7Ci0JCWZwcmludGYoZm91dCwgIiVzICVzIFJFQ1QgKCAlZyAlZyApICggJWcgJWcgKVxuIiwgaW5OYW1lLAotCQkJdmlhLT5uYW1lKCksIAotCQkJY2hrTnVtKHZpYS0+eGwoaSwgaikpLCBjaGtOdW0odmlhLT55bChpLCBqKSksCi0JCQljaGtOdW0odmlhLT54aChpLCBqKSksIGNoa051bSh2aWEtPnloKGksIGopKSk7Ci0JICAgIH0KLQl9Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCB2aWEtPm51bVBvbHlnb25zKGkpOyBqKyspIHsKLSAgICAgICAgICAgc3RydWN0IGxlZmlHZW9tUG9seWdvbiBwb2x5OwotICAgICAgICAgICBwb2x5ID0gdmlhLT5nZXRQb2x5Z29uKGksIGopOwotCSAgIGlmICh2aWEtPnBvbHlDb2xvck1hc2soaSwgaikpIHsKLSAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzICVzIFBPTFlHT04gTUFTSyAlZCIsIGluTmFtZSwgdmlhLT5uYW1lKCksCi0JCSAgICAgICB2aWEtPnBvbHlDb2xvck1hc2soaSwgaikpOwotICAgICAgICAgICB9IGVsc2UgewotCSAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAlcyBQT0xZR09OIiwgaW5OYW1lLCB2aWEtPm5hbWUoKSk7Ci0JICAgfQotICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHBvbHkubnVtUG9pbnRzOyBrKyspCi0gICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAlZyAlZyIsIHBvbHkueFtrXSwgcG9seS55W2tdKTsKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgfQotICAgICB9Ci0gIH0KLSAgcmV0dXJuOwotfQotCi0vLyBQcmludCBTcGFjaW5nCi12b2lkIGxlZlNwYWNpbmcobGVmaVNwYWNpbmcqIHNwYWNpbmcsIGNoYXIgKmluTmFtZSkgewotICBmcHJpbnRmKGZvdXQsICIlcyBTQU1FTkVUICVzICVzICVnICIsIGluTmFtZSwgc3BhY2luZy0+bmFtZTEoKSwKLSAgICAgICAgICBzcGFjaW5nLT5uYW1lMigpLCBjaGtOdW0oc3BhY2luZy0+ZGlzdGFuY2UoKSkpOwotICBpZiAoc3BhY2luZy0+aGFzU3RhY2soKSkKLSAgICAgZnByaW50Zihmb3V0LCAiIFNUQUNLIik7Ci0gIGZwcmludGYoZm91dCwiXG4iKTsKLSAgcmV0dXJuOwotfQotCi0vLyBQcmludCBWaWEgUnVsZSBMYXllcgotdm9pZCBsZWZWaWFSdWxlTGF5ZXIobGVmaVZpYVJ1bGVMYXllciogdkxheWVyLCBjaGFyKiB2aWFOYW1lKSB7Ci0gIGZwcmludGYoZm91dCwgIlZJQVJVTEUgJXMgTEFZRVIgJXMiLCB2aWFOYW1lLCB2TGF5ZXItPm5hbWUoKSk7Ci0gIGlmICh2TGF5ZXItPmhhc0RpcmVjdGlvbigpKSB7Ci0gICAgIGlmICh2TGF5ZXItPmlzSG9yaXpvbnRhbCgpKQotICAgICAgICBmcHJpbnRmKGZvdXQsICIgRElSRUNUSU9OIEhPUklaT05UQUwiKTsKLSAgICAgaWYgKHZMYXllci0+aXNWZXJ0aWNhbCgpKQotICAgICAgICBmcHJpbnRmKGZvdXQsICIgRElSRUNUSU9OIFZFUlRJQ0FMIik7Ci0gIH0KLSAgaWYgKHZMYXllci0+aGFzRW5jbG9zdXJlKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiBFTkNMT1NVUkUgJWcgJWdcbiIsIGNoa051bSh2TGF5ZXItPmVuY2xvc3VyZU92ZXJoYW5nMSgpKSwKLSAgICAgICAgICAgICBjaGtOdW0odkxheWVyLT5lbmNsb3N1cmVPdmVyaGFuZzIoKSkpOwotICBpZiAodkxheWVyLT5oYXNXaWR0aCgpKQotICAgICBmcHJpbnRmKGZvdXQsICIgV0lEVEggJWcgVE8gJWciLCBjaGtOdW0odkxheWVyLT53aWR0aE1pbigpKSwKLSAgICAgICAgICAgICAgICAgICBjaGtOdW0odkxheWVyLT53aWR0aE1heCgpKSk7Ci0gIGlmICh2TGF5ZXItPmhhc1Jlc2lzdGFuY2UoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiIFJFU0lTVEFOQ0UgJWciLCBjaGtOdW0odkxheWVyLT5yZXNpc3RhbmNlKCkpKTsKLSAgaWYgKHZMYXllci0+aGFzT3ZlcmhhbmcoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiIE9WRVJIQU5HICVnIiwgY2hrTnVtKHZMYXllci0+b3ZlcmhhbmcoKSkpOwotICBpZiAodkxheWVyLT5oYXNNZXRhbE92ZXJoYW5nKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiBNRVRBTE9WRVJIQU5HICVnIiwgY2hrTnVtKHZMYXllci0+bWV0YWxPdmVyaGFuZygpKSk7Ci0gIGlmICh2TGF5ZXItPmhhc1NwYWNpbmcoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiIFNQQUNJTkcgJWcgQlkgJWciLCBjaGtOdW0odkxheWVyLT5zcGFjaW5nU3RlcFgoKSksCi0gICAgICAgICAgICAgY2hrTnVtKHZMYXllci0+c3BhY2luZ1N0ZXBZKCkpKTsKLSAgaWYgKHZMYXllci0+aGFzUmVjdCgpKQotICAgICBmcHJpbnRmKGZvdXQsICIgUkVDVCAoICVnICVnICkgKCAlZyAlZyApIiwgY2hrTnVtKHZMYXllci0+eGwoKSksCi0gICAgICAgICAgICAgY2hrTnVtKHZMYXllci0+eWwoKSksIGNoa051bSh2TGF5ZXItPnhoKCkpLCBjaGtOdW0odkxheWVyLT55aCgpKSk7Ci0gIGZwcmludGYoZm91dCwgIlxuIik7Ci0gIHJldHVybjsKLX0KLSAKLS8vIFByaW50IEdlb21ldHJ5Ci12b2lkIHBydEdlb21ldHJ5KGxlZmlHZW9tZXRyaWVzKiBnZW9tZXRyeSwgY2hhciogaW5OYW1lKSB7Ci0gIGludCAgICAgICAgICAgICAgICAgICBudW1JdGVtcyA9IGdlb21ldHJ5LT5udW1JdGVtcygpOwotICBpbnQgICAgICAgICAgICAgICAgICAgaSwgajsKLSAgbGVmaUdlb21QYXRoKiAgICAgICAgIHBhdGg7Ci0gIGxlZmlHZW9tUGF0aEl0ZXIqICAgICBwYXRoSXRlcjsKLSAgbGVmaUdlb21SZWN0KiAgICAgICAgIHJlY3Q7Ci0gIGxlZmlHZW9tUmVjdEl0ZXIqICAgICByZWN0SXRlcjsKLSAgbGVmaUdlb21Qb2x5Z29uKiAgICAgIHBvbHlnb247Ci0gIGxlZmlHZW9tUG9seWdvbkl0ZXIqICBwb2x5Z29uSXRlcjsKLSAgbGVmaUdlb21WaWEqICAgICAgICAgIHZpYTsKLSAgbGVmaUdlb21WaWFJdGVyKiAgICAgIHZpYUl0ZXI7Ci0gCi0gIGZvciAoaSA9IDA7IGkgPCBudW1JdGVtczsgaSsrKSB7Ci0gICAgIHN3aXRjaCAoZ2VvbWV0cnktPml0ZW1UeXBlKGkpKSB7Ci0gICAgICAgIGNhc2UgIGxlZmlHZW9tQ2xhc3NFOgotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzIENMQVNTICVzXG4iLCBpbk5hbWUsIGdlb21ldHJ5LT5nZXRDbGFzcyhpKSk7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgbGVmaUdlb21MYXllckU6Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgTEFZRVIgJXNcbiIsIGluTmFtZSwgZ2VvbWV0cnktPmdldExheWVyKGkpKTsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBsZWZpR2VvbUxheWVyTWluU3BhY2luZ0U6Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgU1BBQ0lORyAlZ1xuIiwgaW5OYW1lLAotICAgICAgICAgICAgICAgICAgICAgY2hrTnVtKGdlb21ldHJ5LT5nZXRMYXllck1pblNwYWNpbmcoaSkpKTsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBsZWZpR2VvbUxheWVyRXhjZXB0UGdOZXRFOgotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzIEVYQ0VQVFBHTkVUXG4iLCBpbk5hbWUpOwotICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGxlZmlHZW9tTGF5ZXJSdWxlV2lkdGhFOgotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzIERFU0lHTlJVTEVXSURUSCAlZ1xuIiwgaW5OYW1lLAotICAgICAgICAgICAgICAgICAgICAgY2hrTnVtKGdlb21ldHJ5LT5nZXRMYXllclJ1bGVXaWR0aChpKSkpOwotICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGxlZmlHZW9tV2lkdGhFOgotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzIFdJRFRIICVnXG4iLCBpbk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICBjaGtOdW0oZ2VvbWV0cnktPmdldFdpZHRoKGkpKSk7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgbGVmaUdlb21QYXRoRToKLSAgICAgICAgICAgICBwYXRoID0gZ2VvbWV0cnktPmdldFBhdGgoaSk7Ci0JICAgICBpZiAocGF0aC0+Y29sb3JNYXNrICE9IDApIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyBQQVRIIE1BU0sgJWQgIiwgaW5OYW1lLCBwYXRoLT5jb2xvck1hc2spOwotICAgICAgICAgICAgIH0gZWxzZSB7Ci0JCWZwcmludGYoZm91dCwgIiVzIFBBVEggIiwgaW5OYW1lKTsKLSAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcGF0aC0+bnVtUG9pbnRzOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaisxID09IHBhdGgtPm51bVBvaW50cykgLy8gbGFzdCBvbmUgb24gdGhlIGxpc3QKLSAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgKCAlZyAlZyApXG4iLCBjaGtOdW0ocGF0aC0+eFtqXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjaGtOdW0ocGF0aC0+eVtqXSkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgKCAlZyAlZyApIiwgY2hrTnVtKHBhdGgtPnhbal0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hrTnVtKHBhdGgtPnlbal0pKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgbGVmaUdlb21QYXRoSXRlckU6Ci0gICAgICAgICAgICAgcGF0aEl0ZXIgPSBnZW9tZXRyeS0+Z2V0UGF0aEl0ZXIoaSk7Ci0JICAgICBpZiAocGF0aEl0ZXItPmNvbG9yTWFzayAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgUEFUSCBNQVNLICVkIElURVJBVEVEICIsIGluTmFtZSwKLQkJCXBhdGhJdGVyLT5jb2xvck1hc2spOwotICAgICAgICAgICAgfSBlbHNlIHsgCi0JCWZwcmludGYoZm91dCwgIiVzIFBBVEggSVRFUkFURUQgIiwgaW5OYW1lKTsKLQkgICAgfQotICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwYXRoSXRlci0+bnVtUG9pbnRzOyBqKyspCi0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICggJWcgJWcgKSIsIGNoa051bShwYXRoSXRlci0+eFtqXSksCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGtOdW0ocGF0aEl0ZXItPnlbal0pKTsKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgRE8gJWcgQlkgJWcgU1RFUCAlZyAlZ1xuIiwKLSAgICAgICAgICAgICAgICAgICAgIGNoa051bShwYXRoSXRlci0+eFN0YXJ0KSwgY2hrTnVtKHBhdGhJdGVyLT55U3RhcnQpLAotICAgICAgICAgICAgICAgICAgICAgY2hrTnVtKHBhdGhJdGVyLT54U3RlcCksIGNoa051bShwYXRoSXRlci0+eVN0ZXApKTsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBsZWZpR2VvbVJlY3RFOgotICAgICAgICAgICAgIHJlY3QgPSBnZW9tZXRyeS0+Z2V0UmVjdChpKTsKLQkgICAgIGlmIChyZWN0LT5jb2xvck1hc2sgIT0gMCkgewotCQkgZnByaW50Zihmb3V0LCAiJXMgUkVDVCBNQVNLICVkICggJWcgJWcgKSAoICVnICVnIClcbiIsIAotCQkJIGluTmFtZSwgcmVjdC0+Y29sb3JNYXNrLAotCQkJIGNoa051bShyZWN0LT54bCksIGNoa051bShyZWN0LT55bCksIAotCQkJIGNoa051bShyZWN0LT54aCksIGNoa051bShyZWN0LT55aCkpOwotCSAgICAgfSBlbHNlIHsKLQkJZnByaW50Zihmb3V0LCAiJXMgUkVDVCAoICVnICVnICkgKCAlZyAlZyApXG4iLCBpbk5hbWUsCi0JCQljaGtOdW0ocmVjdC0+eGwpLCBjaGtOdW0ocmVjdC0+eWwpLCAKLQkJCWNoa051bShyZWN0LT54aCksIGNoa051bShyZWN0LT55aCkpOwotCSAgICAgfQotICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGxlZmlHZW9tUmVjdEl0ZXJFOgotICAgICAgICAgICAgIHJlY3RJdGVyID0gZ2VvbWV0cnktPmdldFJlY3RJdGVyKGkpOwotCSAgICAgaWYgKHJlY3RJdGVyLT5jb2xvck1hc2sgIT0gMCkgewotCQkgZnByaW50Zihmb3V0LCAiJXMgUkVDVCBNQVNLICVkIElURVJBVEUgKCAlZyAlZyApICggJWcgJWcgKSIsIAotCQkJIGluTmFtZSwgcmVjdEl0ZXItPmNvbG9yTWFzaywKLQkJCSBjaGtOdW0ocmVjdEl0ZXItPnhsKSwgY2hrTnVtKHJlY3RJdGVyLT55bCksCi0JCQkgY2hrTnVtKHJlY3RJdGVyLT54aCksIGNoa051bShyZWN0SXRlci0+eWgpKTsKLQkgICAgIH0gZWxzZSB7Ci0JCSBmcHJpbnRmKGZvdXQsICIlcyBSRUNUIElURVJBVEUgKCAlZyAlZyApICggJWcgJWcgKSIsIGluTmFtZSwKLQkJCSBjaGtOdW0ocmVjdEl0ZXItPnhsKSwgY2hrTnVtKHJlY3RJdGVyLT55bCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2hrTnVtKHJlY3RJdGVyLT54aCksIGNoa051bShyZWN0SXRlci0+eWgpKTsKLQkgICAgIH0KLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgRE8gJWcgQlkgJWcgU1RFUCAlZyAlZyA7XG4iLAotICAgICAgICAgICAgICAgICAgICAgY2hrTnVtKHJlY3RJdGVyLT54U3RhcnQpLCBjaGtOdW0ocmVjdEl0ZXItPnlTdGFydCksCi0gICAgICAgICAgICAgICAgICAgICBjaGtOdW0ocmVjdEl0ZXItPnhTdGVwKSwgY2hrTnVtKHJlY3RJdGVyLT55U3RlcCkpOwotICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGxlZmlHZW9tUG9seWdvbkU6Ci0gICAgICAgICAgICAgcG9seWdvbiA9IGdlb21ldHJ5LT5nZXRQb2x5Z29uKGkpOwotCSAgICAgaWYgKHBvbHlnb24tPmNvbG9yTWFzayAhPSAwKSB7Ci0JCSBmcHJpbnRmKGZvdXQsICIlcyBQT0xZR09OIE1BU0sgJWQgIiwgaW5OYW1lLCBwb2x5Z29uLT5jb2xvck1hc2spOwotCSAgICAgfSBlbHNlIHsKLQkJIGZwcmludGYoZm91dCwgIiVzIFBPTFlHT04gIiwgaW5OYW1lKTsKLQkgICAgIH0KLSAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcG9seWdvbi0+bnVtUG9pbnRzOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaisxID09IHBvbHlnb24tPm51bVBvaW50cykgLy8gbGFzdCBvbmUgb24gdGhlIGxpc3QKLSAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgKCAlZyAlZyApXG4iLCBjaGtOdW0ocG9seWdvbi0+eFtqXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjaGtOdW0ocG9seWdvbi0+eVtqXSkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgKCAlZyAlZyApIiwgY2hrTnVtKHBvbHlnb24tPnhbal0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hrTnVtKHBvbHlnb24tPnlbal0pKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgbGVmaUdlb21Qb2x5Z29uSXRlckU6Ci0gICAgICAgICAgICAgcG9seWdvbkl0ZXIgPSBnZW9tZXRyeS0+Z2V0UG9seWdvbkl0ZXIoaSk7Ci0JICAgICBpZiAocG9seWdvbkl0ZXItPmNvbG9yTWFzayAhPSAwKSB7Ci0JCSBmcHJpbnRmKGZvdXQsICIlcyBQT0xZR09OIE1BU0sgJWQgSVRFUkFURSIsIGluTmFtZSwKLQkJCSBwb2x5Z29uSXRlci0+Y29sb3JNYXNrKTsKLQkgICAgIH0gZWxzZSB7Ci0JCSBmcHJpbnRmKGZvdXQsICIlcyBQT0xZR09OIElURVJBVEUiLCBpbk5hbWUpOwotCSAgICAgfQotICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwb2x5Z29uSXRlci0+bnVtUG9pbnRzOyBqKyspCi0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICggJWcgJWcgKSIsIGNoa051bShwb2x5Z29uSXRlci0+eFtqXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjaGtOdW0ocG9seWdvbkl0ZXItPnlbal0pKTsKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgRE8gJWcgQlkgJWcgU1RFUCAlZyAlZ1xuIiwKLSAgICAgICAgICAgICAgICAgICAgIGNoa051bShwb2x5Z29uSXRlci0+eFN0YXJ0KSwgY2hrTnVtKHBvbHlnb25JdGVyLT55U3RhcnQpLAotICAgICAgICAgICAgICAgICAgICAgY2hrTnVtKHBvbHlnb25JdGVyLT54U3RlcCksIGNoa051bShwb2x5Z29uSXRlci0+eVN0ZXApKTsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBsZWZpR2VvbVZpYUU6Ci0gICAgICAgICAgICAgdmlhID0gZ2VvbWV0cnktPmdldFZpYShpKTsKLQkgICAgIGlmICh2aWEtPnRvcE1hc2tOdW0gIT0gMCB8fCB2aWEtPmJvdHRvbU1hc2tOdW0gIT0gMCB8fCB2aWEtPmN1dE1hc2tOdW0gIT0wKSB7Ci0JCWZwcmludGYoZm91dCwgIiVzIFZJQSBNQVNLICVkJWQlZCAoICVnICVnICkgJXNcbiIsIGluTmFtZSwgCi0JCQl2aWEtPnRvcE1hc2tOdW0sIHZpYS0+Y3V0TWFza051bSwgdmlhLT5ib3R0b21NYXNrTnVtLAotCQkJY2hrTnVtKHZpYS0+eCksCi0JCQljaGtOdW0odmlhLT55KSwgdmlhLT5uYW1lKTsKLQkgICAgIH0gZWxzZSB7Ci0JCWZwcmludGYoZm91dCwgIiVzIFZJQSAoICVnICVnICkgJXNcbiIsIGluTmFtZSwgY2hrTnVtKHZpYS0+eCksCi0JCQljaGtOdW0odmlhLT55KSwgdmlhLT5uYW1lKTsKLQkgICAgIH0KLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBsZWZpR2VvbVZpYUl0ZXJFOgotICAgICAgICAgICAgIHZpYUl0ZXIgPSBnZW9tZXRyeS0+Z2V0VmlhSXRlcihpKTsKLQkgICAgIGlmICh2aWFJdGVyLT50b3BNYXNrTnVtICE9IDAgfHwgdmlhSXRlci0+Y3V0TWFza051bSAhPSAwIHx8IHZpYUl0ZXItPmJvdHRvbU1hc2tOdW0gIT0gMCkgewotCQlmcHJpbnRmKGZvdXQsICIlcyBWSUEgSVRFUkFURSBNQVNLICVkJWQlZCAoICVnICVnICkgJXMiLCBpbk5hbWUsCi0JCQl2aWFJdGVyLT50b3BNYXNrTnVtLCB2aWFJdGVyLT5jdXRNYXNrTnVtLCAKLQkJCXZpYUl0ZXItPmJvdHRvbU1hc2tOdW0sCi0JCQljaGtOdW0odmlhSXRlci0+eCksIGNoa051bSh2aWFJdGVyLT55KSwgdmlhSXRlci0+bmFtZSk7Ci0JICAgICB9IGVsc2UgewotCQlmcHJpbnRmKGZvdXQsICIlcyBWSUEgSVRFUkFURSAoICVnICVnICkgJXMiLCBpbk5hbWUsCi0JCQljaGtOdW0odmlhSXRlci0+eCksIGNoa051bSh2aWFJdGVyLT55KSwgdmlhSXRlci0+bmFtZSk7Ci0JICAgICB9Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIERPICVnIEJZICVnIFNURVAgJWcgJWdcbiIsCi0gICAgICAgICAgICAgICAgICAgICBjaGtOdW0odmlhSXRlci0+eFN0YXJ0KSwgY2hrTnVtKHZpYUl0ZXItPnlTdGFydCksCi0gICAgICAgICAgICAgICAgICAgICBjaGtOdW0odmlhSXRlci0+eFN0ZXApLCBjaGtOdW0odmlhSXRlci0+eVN0ZXApKTsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJCT0dVUyBnZW9tZXRyaWVzIHR5cGUuXG4iKTsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgfQotICB9Ci19Ci0KLS8vIEFudGVubmEKLWludCBhbnRlbm5hQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGRvdWJsZSB2YWx1ZSwgbGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLQotICBzd2l0Y2ggKGMpIHsKLSAgICAgICAgY2FzZSBsZWZyQW50ZW5uYUlucHV0Q2JrVHlwZToKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJBTlRJTlBVVEdBVEVBUkVBICVnXG4iLCBjaGtOdW0odmFsdWUpKTsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBsZWZyQW50ZW5uYUlub3V0Q2JrVHlwZToKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJBTlRJTk9VVERJRkZBUkVBICVnXG4iLCBjaGtOdW0odmFsdWUpKTsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBsZWZyQW50ZW5uYU91dHB1dENia1R5cGU6Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiQU5UT1VUUFVURElGRkFSRUEgJWdcbiIsIGNoa051bSh2YWx1ZSkpOwotICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGxlZnJJbnB1dEFudGVubmFDYmtUeXBlOgotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIklOUFVUUElOQU5URU5OQVNJWkUgJWdcbiIsIGNoa051bSh2YWx1ZSkpOwotICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGxlZnJPdXRwdXRBbnRlbm5hQ2JrVHlwZToKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJPVVRQVVRQSU5BTlRFTk5BU0laRSAlZ1xuIiwgY2hrTnVtKHZhbHVlKSk7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgbGVmcklub3V0QW50ZW5uYUNia1R5cGU6Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiSU5PVVRQSU5BTlRFTk5BU0laRSAlZ1xuIiwgY2hrTnVtKHZhbHVlKSk7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIEFycmF5Ci1pbnQgYXJyYXlDQihsZWZyQ2FsbGJhY2tUeXBlX2UgYywgbGVmaUFycmF5KiBhLCBsZWZpVXNlckRhdGEgdWQpIHsKLSAgaW50ICAgICAgICAgICAgICBpLCBqLCBkZWZDYXBzOwotICBsZWZpU2l0ZVBhdHRlcm4qIHBhdHRlcm47Ci0gIGxlZmlUcmFja1BhdHRlcm4qIHRyYWNrOwotICBsZWZpR2NlbGxQYXR0ZXJuKiBnY2VsbDsKLQotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gICAKLSAgaWYgKGEtPm51bVNpdGVQYXR0ZXJuKCkgPiAwKSB7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBhLT5udW1TaXRlUGF0dGVybigpOyBpKyspIHsKLSAgICAgICAgcGF0dGVybiA9IGEtPnNpdGVQYXR0ZXJuKGkpOwotICAgICAgICBmcHJpbnRmKGZvdXQsICJBUlJBWSAlcyBTSVRFICVzICVnICVnICVzIERPICVnIEJZICVnIFNURVAgJWcgJWdcbiIsCi0gICAgICAgICAgICAgICBhLT5uYW1lKCksIHBhdHRlcm4tPm5hbWUoKSwgY2hrTnVtKHBhdHRlcm4tPngoKSksCi0gICAgICAgICAgICAgICBjaGtOdW0ocGF0dGVybi0+eSgpKSwgbGVmaU9yaWVudFN0cihwYXR0ZXJuLT5vcmllbnQoKSksCi0gICAgICAgICAgICAgICBjaGtOdW0ocGF0dGVybi0+eFN0YXJ0KCkpLCBjaGtOdW0ocGF0dGVybi0+eVN0YXJ0KCkpLAotICAgICAgICAgICAgICAgY2hrTnVtKHBhdHRlcm4tPnhTdGVwKCkpLCBjaGtOdW0ocGF0dGVybi0+eVN0ZXAoKSkpOwotICAgICB9Ci0gIH0KLSAgaWYgKGEtPm51bUNhblBsYWNlKCkgPiAwKSB7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBhLT5udW1DYW5QbGFjZSgpOyBpKyspIHsKLSAgICAgICAgcGF0dGVybiA9IGEtPmNhblBsYWNlKGkpOwotICAgICAgICBmcHJpbnRmKGZvdXQsICJBUlJBWSAlcyBDQU5QTEFDRSAlcyAlZyAlZyAlcyBETyAlZyBCWSAlZyBTVEVQICVnICVnXG4iLAotICAgICAgICAgICAgICAgYS0+bmFtZSgpLCBwYXR0ZXJuLT5uYW1lKCksIGNoa051bShwYXR0ZXJuLT54KCkpLAotICAgICAgICAgICAgICAgY2hrTnVtKHBhdHRlcm4tPnkoKSksIGxlZmlPcmllbnRTdHIocGF0dGVybi0+b3JpZW50KCkpLAotICAgICAgICAgICAgICAgY2hrTnVtKHBhdHRlcm4tPnhTdGFydCgpKSwgY2hrTnVtKHBhdHRlcm4tPnlTdGFydCgpKSwKLSAgICAgICAgICAgICAgIGNoa051bShwYXR0ZXJuLT54U3RlcCgpKSwgY2hrTnVtKHBhdHRlcm4tPnlTdGVwKCkpKTsKLSAgICAgfQotICB9Ci0gIGlmIChhLT5udW1DYW5ub3RPY2N1cHkoKSA+IDApIHsKLSAgICAgZm9yIChpID0gMDsgaSA8IGEtPm51bUNhbm5vdE9jY3VweSgpOyBpKyspIHsKLSAgICAgICAgcGF0dGVybiA9IGEtPmNhbm5vdE9jY3VweShpKTsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiQVJSQVkgJXMgQ0FOTk9UT0NDVVBZICVzICVnICVnICVzIERPICVnIEJZICVnIFNURVAgJWcgJWdcbiIsCi0gICAgICAgICAgICAgICBhLT5uYW1lKCksIHBhdHRlcm4tPm5hbWUoKSwgY2hrTnVtKHBhdHRlcm4tPngoKSksCi0gICAgICAgICAgICAgICBjaGtOdW0ocGF0dGVybi0+eSgpKSwgbGVmaU9yaWVudFN0cihwYXR0ZXJuLT5vcmllbnQoKSksCi0gICAgICAgICAgICAgICBjaGtOdW0ocGF0dGVybi0+eFN0YXJ0KCkpLCBjaGtOdW0ocGF0dGVybi0+eVN0YXJ0KCkpLAotICAgICAgICAgICAgICAgY2hrTnVtKHBhdHRlcm4tPnhTdGVwKCkpLCBjaGtOdW0ocGF0dGVybi0+eVN0ZXAoKSkpOwotICAgICB9Ci0gIH0KLQotICBpZiAoYS0+bnVtVHJhY2soKSA+IDApIHsKLSAgICAgZm9yIChpID0gMDsgaSA8IGEtPm51bVRyYWNrKCk7IGkrKykgewotICAgICAgICB0cmFjayA9IGEtPnRyYWNrKGkpOwotICAgICAgICAvLyAxMS8yMi85OSAtIFdhbmRhIGRhIFJvc2EsIFBDUiAyODM3ODEuICBNZXJnZSB0aGUgdHJhY2sgd2l0aAotICAgICAgICAvLyBsYXllciBuYW1lcy4gIFRoaXMgd2F5LCBpZiB1c2VyIHNwbGl0IHRoZSBsYXllciBpbnRvIGRpZmZlcmVudAotICAgICAgICAvLyBsaW5lLCB0aGUgZGlmZiBwcm9ncmFtIHdvbid0IGdlbmVyYXRlIGV4dHJhIGxpbmVzLgotICAgICAgICBpZiAodHJhY2stPm51bUxheWVycygpID09IDApIHsKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiQVJSQVkgJXMgVFJBQ0tTICVzLCAlZyBETyAlZCBTVEVQICVnXG4iLCBhLT5uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgdHJhY2stPm5hbWUoKSwgY2hrTnVtKHRyYWNrLT5zdGFydCgpKSwgdHJhY2stPm51bVRyYWNrcygpLCAKLSAgICAgICAgICAgICAgICAgICBjaGtOdW0odHJhY2stPnNwYWNlKCkpKTsgCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgIGZwcmludGYoZm91dCwgIkFSUkFZICVzIFRSQUNLUyAlcywgJWcgRE8gJWQgU1RFUCAlZyAiLCBhLT5uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgdHJhY2stPm5hbWUoKSwgY2hrTnVtKHRyYWNrLT5zdGFydCgpKSwgdHJhY2stPm51bVRyYWNrcygpLCAKLSAgICAgICAgICAgICAgICAgICBjaGtOdW0odHJhY2stPnNwYWNlKCkpKTsgCi0gICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB0cmFjay0+bnVtTGF5ZXJzKCk7IGorKykKLSAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgdHJhY2stPmxheWVyTmFtZShqKSk7Ci0gICAgICAgICAgIGZwcmludGYoZm91dCwgIjtcbiIpOyAKLSAgICAgICAgfQotICAgICB9Ci0gIH0KLQotICBpZiAoYS0+bnVtR2NlbGwoKSA+IDApIHsKLSAgICAgZm9yIChpID0gMDsgaSA8IGEtPm51bUdjZWxsKCk7IGkrKykgewotICAgICAgICBnY2VsbCA9IGEtPmdjZWxsKGkpOwotICAgICAgICBmcHJpbnRmKGZvdXQsICJBUlJBWSAlcyBHQ0VMTEdSSUQgJXMsICVnIERPICVkIFNURVAgJWdcbiIsIGEtPm5hbWUoKSwKLSAgICAgICAgICAgICAgICBnY2VsbC0+bmFtZSgpLCBjaGtOdW0oZ2NlbGwtPnN0YXJ0KCkpLCBnY2VsbC0+bnVtQ1JzKCksCi0gICAgICAgICAgICAgICAgY2hrTnVtKGdjZWxsLT5zcGFjZSgpKSk7IAotICAgICB9Ci0gIH0KLQotICBpZiAoYS0+bnVtRmxvb3JQbGFucygpID4gMCkgewotICAgICBmb3IgKGkgPSAwOyBpIDwgYS0+bnVtRmxvb3JQbGFucygpOyBpKyspIHsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IGEtPm51bVNpdGVzKGkpOyBqKyspIHsKLSAgICAgICAgICAgcGF0dGVybiA9IGEtPnNpdGUoaSwgaik7Ci0gICAgICAgICAgIGZwcmludGYoZm91dCwKLSAgICAgICAgICAgICAgICJBUlJBWSAlcyBGTE9PUlBMQU4gJXMgJXMgJXMgJWcgJWcgJXMgRE8gJWQgQlkgJWQgU1RFUCAlZyAlZ1xuIiwKLSAgICAgICAgICAgICAgIGEtPm5hbWUoKSwgYS0+Zmxvb3JQbGFuTmFtZShpKSwgYS0+c2l0ZVR5cGUoaSwgaiksCi0gICAgICAgICAgICAgICBwYXR0ZXJuLT5uYW1lKCksIGNoa051bShwYXR0ZXJuLT54KCkpLCBjaGtOdW0ocGF0dGVybi0+eSgpKSwKLSAgICAgICAgICAgICAgIGxlZmlPcmllbnRTdHIocGF0dGVybi0+b3JpZW50KCkpLCBwYXR0ZXJuLT54U3RhcnQoKSwKLSAgICAgICAgICAgICAgIHBhdHRlcm4tPnlTdGFydCgpLCBjaGtOdW0ocGF0dGVybi0+eFN0ZXAoKSksCi0gICAgICAgICAgICAgICBjaGtOdW0ocGF0dGVybi0+eVN0ZXAoKSkpOwotICAgICAgICB9Ci0gICAgIH0KLSAgfQotCi0gIGRlZkNhcHMgPSBhLT5udW1EZWZhdWx0Q2FwcygpOwotICBpZiAoZGVmQ2FwcyA+IDApIHsKLSAgICAgZm9yIChpID0gMDsgaSA8IGRlZkNhcHM7IGkrKykKLSAgICAgICAgZnByaW50Zihmb3V0LCAiQVJSQVkgJXMgREVGQVVMVENBUCAlZCBNSU5QSU5TICVnIFdJUkVDQVAgJWdcbiIsCi0gICAgICAgICAgICAgICAgYS0+bmFtZSgpLCBkZWZDYXBzLCBjaGtOdW0oYS0+ZGVmYXVsdENhcE1pblBpbnMoaSkpLAotICAgICAgICAgICAgICAgIGNoa051bShhLT5kZWZhdWx0Q2FwKGkpKSk7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIEJ1c2JpdGNoYXIKLWludCBidXNCaXRDaGFyc0NCKGxlZnJDYWxsYmFja1R5cGVfZSBjLCBjb25zdCBjaGFyKiBidXNCaXQsIGxlZmlVc2VyRGF0YSB1ZCkKLXsKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICAvLyB1c2UgdGhlIGxlZiB3cml0ZXIgdG8gd3JpdGUgb3V0IHRoZSBkYXRhCi0gIGZwcmludGYoZm91dCwgIkJVU0JJVENIQVJTICVzXG4iLCBidXNCaXQpOwotICByZXR1cm4gMDsKLX0KLQotLy8gQ2FzZVNlbnNpdGl2ZQotaW50IGNhc2VTZW5zQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGludCBjYXNlU2Vuc2UsIGxlZmlVc2VyRGF0YSB1ZCkgewotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0KLSAgaWYgKGNhc2VTZW5zZSA9PSBUUlVFKQotICAgICBmcHJpbnRmKGZvdXQsICJOQU1FU0NBU0VTRU5TSVRJVkUgT05cbiIpOwotICBlbHNlCi0gICAgIGZwcmludGYoZm91dCwgIk5BTUVTQ0FTRVNFTlNJVElWRSBPRkZcbiIpOwotICByZXR1cm4gMDsKLX0KLQotLy8gRml4ZWRNYXNrCi1pbnQgZml4ZWRNYXNrQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGludCBmaXhlZE1hc2ssIGxlZmlVc2VyRGF0YSB1ZCkgewotICAgIGNoZWNrVHlwZShjKTsKLSAgICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotCi0gICAgaWYgKGZpeGVkTWFzayA9PSAxKSAKLSAgICAgICAgZnByaW50Zihmb3V0LCAiRklYRURNQVNLIDtcbiIpOwotICAgIHJldHVybiAwOwotfQotCi0vLyBDcmVhcmFuY2UKLWludCBjbGVhcmFuY2VDQihsZWZyQ2FsbGJhY2tUeXBlX2UgYywgY29uc3QgY2hhciogbmFtZSwgbGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLQotICBmcHJpbnRmKGZvdXQsICJDTEVBUkFOQ0VNRUFTVVJFICVzXG4iLCBuYW1lKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIENyb3NzdGFsayBjb3JyZWN0dGFibGUKLWludCBjb3JyZWN0VGFibGVDQihsZWZyQ2FsbGJhY2tUeXBlX2UgYywgbGVmaUNvcnJlY3Rpb25UYWJsZSogdGFibGUsCi0gICAgICAgICAgICAgICAgICAgbGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGludCAgICAgICAgICAgICAgICAgICAgICBpLCBqLCBrLCBsOwotICBsZWZpQ29ycmVjdGlvbkVkZ2UgICAgICAgKmVkZ2U7Ci0gIGxlZmlDb3JyZWN0aW9uUmVzaXN0YW5jZSAqcmVzaXN0OwotICBsZWZpQ29ycmVjdGlvblZpY3RpbSAgICAgKnZpY3RpbTsKLSAKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotCi0gIGZwcmludGYoZm91dCwgIkNST1NTVEFMSyBDT1JSRUNUSU9OVEFCTEUgJWRcbiIsIHRhYmxlLT5udW0oKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCB0YWJsZS0+bnVtRWRnZXMoKTsgaSsrKSB7Ci0gICAgIGVkZ2UgPSB0YWJsZS0+ZWRnZShpKTsKLSAgICAgLy8gcmVzaXN0YW5jZXMKLSAgICAgaWYgKGVkZ2UtPm51bVJlc2lzdGFuY2VzKCkpIHsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IGVkZ2UtPm51bVJlc2lzdGFuY2VzKCk7IGorKykgewotICAgICAgICAgICByZXNpc3QgPSBlZGdlLT5yZXNpc3RhbmNlKGopOwotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJDUk9TU1RBTEsgQ09SUkVDVElPTlRBQkxFICVkIFJFU0lTVEFOQ0UgJWdcbiIsCi0gICAgICAgICAgICAgICAgICAgdGFibGUtPm51bSgpLCBjaGtOdW0ocmVzaXN0LT5udW0oaikpKTsKLSAgICAgICAgICAgLy8gdmljdGltcwotICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcmVzaXN0LT5udW1WaWN0aW1zKCk7IGsrKykgewotICAgICAgICAgICAgICB2aWN0aW0gPSByZXNpc3QtPnZpY3RpbShrKTsKLSAgICAgICAgICAgICAgaWYgKHZpY3RpbS0+bGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsCi0gICAgICAgICAgICAgICAgICAgICJDUk9TU1RBTEsgQ09SUkVDVElPTlRBQkxFICVkIFJFU0lTVEFOQ0UgJWcgVklDVElNTEVOICVnXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLT5udW0oKSwgY2hrTnVtKHJlc2lzdC0+bnVtKGopKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjaGtOdW0odmljdGltLT5sZW5ndGgoKSkpOwotICAgICAgICAgICAgICAgICBmb3IgKGwgPSAwOyBsIDwgdmljdGltLT5udW1Db3JyZWN0aW9ucygpOyBsKyspCi0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwKLSAgICAgICAgICAgICAgICAgICAgIkNST1NTVEFMSyBDT1JSRUNUSU9OVEFCTEUgJWQgUkVTSVNUQU5DRSAlZyBWSUNUSU0gR1RIICVnIENPUlJFQ1RJT05GQUNUT1IgJWdcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLT5udW0oKSwgY2hrTnVtKHJlc2lzdC0+bnVtKGopKSwKLSAgICAgICAgICAgICAgICAgICAgICAgY2hrTnVtKHZpY3RpbS0+bGVuZ3RoKCkpLCBjaGtOdW0odmljdGltLT5jb3JyZWN0aW9uKGwpKSk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICB9Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIERpZWxlY3RyaWMKLWludCBkaWVsZWN0cmljQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGRvdWJsZSBkaWVsZWN0cmljLCBsZWZpVXNlckRhdGEgdWQpIHsKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotCi0gIGZwcmludGYoZm91dCwgIkRJRUxFQ1RSSUMgJWdcbiIsIGNoa051bShkaWVsZWN0cmljKSk7Ci0gIHJldHVybiAwOwotfQotCi0vLyBEaXZpZGVyCi1pbnQgZGl2aWRlckNCKGxlZnJDYWxsYmFja1R5cGVfZSBjLCBjb25zdCBjaGFyKiBkaXZpZGVDaGFyLCBsZWZpVXNlckRhdGEgdWQpIHsKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBmcHJpbnRmKGZvdXQsICJESVZJREVSICVzXG4iLCBkaXZpZGVDaGFyKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIENyb3NzdGFsayBlZGdlUmF0ZQotaW50IGVkZ2VSYXRlQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGRvdWJsZSByYXRlLCBsZWZpVXNlckRhdGEgdWQpIHsKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBmcHJpbnRmKGZvdXQsICJDUk9TU1RBTEsgRURHRVJBVEVTQ0FMRUZBQ1RPUiAlZ1xuIiwgY2hrTnVtKHJhdGUpKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIENhbGxiYWNrIHJvdXRpbmUgZm9yIGVkZ2VyYXRldGhyZXNob2xkMQotaW50IGVkZ2VSYXRlMUNCKGxlZnJDYWxsYmFja1R5cGVfZSBjLCBkb3VibGUgcmF0ZSwgbGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgZnByaW50Zihmb3V0LCAiQ1JPU1NUQUxLIEVER0VSQVRFVEhSRVNIT0xEMSAlZ1xuIiwgY2hrTnVtKHJhdGUpKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIENhbGxiYWNrIHJvdXRpbmUgZm9yIGVkZ2VyYXRldGhyZXNob2xkMgotaW50IGVkZ2VSYXRlMkNCKGxlZnJDYWxsYmFja1R5cGVfZSBjLCBkb3VibGUgcmF0ZSwgbGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgZnByaW50Zihmb3V0LCAiQ1JPU1NUQUxLIEVER0VSQVRFVEhSRVNIT0xEMiAlZ1xuIiwgY2hrTnVtKHJhdGUpKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIElucHV0QW50ZW5uYQotaW50IGlucHV0QW50Q0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGRvdWJsZSBhbnRlbm5hLCBsZWZpVXNlckRhdGEgdWQpIHsKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBmcHJpbnRmKGZvdXQsICJJTlBVVElOQU5URU5OQVNJWkUgJWdcbiIsIGNoa051bShhbnRlbm5hKSk7Ci0gIHJldHVybiAwOwotfQotCi0vLyBPdXRwdXRBbnRlbm5hCi1pbnQgb3V0cHV0QW50Q0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGRvdWJsZSBhbnRlbm5hLCBsZWZpVXNlckRhdGEgdWQpIHsKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBmcHJpbnRmKGZvdXQsICJPVVRQVVRJTkFOVEVOTkFTSVpFICVnXG4iLCBjaGtOdW0oYW50ZW5uYSkpOwotICByZXR1cm4gMDsKLX0KLQotCi0vLyBJbk91dEFudGVubmEKLWludCBpbm91dEFudENCKGxlZnJDYWxsYmFja1R5cGVfZSBjLCBkb3VibGUgYW50ZW5uYSwgbGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgZnByaW50Zihmb3V0LCAiSU5PVVRQVVRJTkFOVEVOTkFTSVpFICVnXG4iLCBjaGtOdW0oYW50ZW5uYSkpOwotICByZXR1cm4gMDsKLX0KLQotLy8gSXJkcm9wCi1pbnQgaXJkcm9wQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGxlZmlJUkRyb3AqIGlyZHJvcCwgbGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGludCBpOwotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGZwcmludGYoZm91dCwgIklSRFJPUCBUQUJMRSAlcyAiLCBpcmRyb3AtPm5hbWUoKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBpcmRyb3AtPm51bVZhbHVlcygpOyBpKyspIAotICAgICBmcHJpbnRmKGZvdXQsICIlZyAlZyAiLCBjaGtOdW0oaXJkcm9wLT52YWx1ZTEoaSkpLAotICAgICAgICAgICAgIGNoa051bShpcmRyb3AtPnZhbHVlMihpKSkpOwotICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICByZXR1cm4gMDsKLX0KLQotLy8gTGF5ZXIKLWludCBsYXllckNCKGxlZnJDYWxsYmFja1R5cGVfZSBjLCBsZWZpTGF5ZXIqIGxheWVyLCBsZWZpVXNlckRhdGEgdWQpIHsKLSAgaW50ICAgICAgICAgICAgICAgICBpLCBqLCBrOwotICBkb3VibGUgICAgICAgICAgICAgICp3aWR0aHMsICpjdXJyZW50OwotICBsZWZpTGF5ZXJEZW5zaXR5KiAgIGRlbnNpdHk7Ci0gIGNoYXIgICAgICAgICAgICAgICAgcFR5cGU7Ci0gIGludCAgICAgICAgICAgICAgICAgbnVtUG9pbnRzLCBwcm9wTnVtOwotICBsZWZpQW50ZW5uYVBXTCogICAgIHB3bDsKLSAgaW50ICAgICAgICAgICAgICAgICBuZWVkSGVhZGluZzsKLSAgaW50ICAgICAgICAgICAgICAgICBudW1NaW5DdXQsIG51bU1pbmVuY2xvc2VkOwotICBsZWZpU3BhY2luZ1RhYmxlKiAgIHNwVGFibGU7Ci0gIGxlZmlJbmZsdWVuY2UqICAgICAgaW5mbHVlbmNlOwotICBsZWZpUGFyYWxsZWwqICAgICAgIHBhcmFsbGVsOwotICBsZWZpVHdvV2lkdGhzKiAgICAgIHR3b1dpZHRoczsKLSAgbGVmaUFudGVubmFNb2RlbCogICBhTW9kZWw7Ci0gIGxlZmlPcnRob2dvbmFsKiAgICAgb3J0aG87Ci0KLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBpZiAobGF5ZXItPmhhc1R5cGUoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgVFlQRSAlc1xuIiwgbGF5ZXItPm5hbWUoKSwgbGF5ZXItPnR5cGUoKSk7Ci0gIGlmIChsYXllci0+aGFzTWFzaygpKQotICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBNQVNLICVkXG4iLCBsYXllci0+bmFtZSgpLCBsYXllci0+bWFzaygpKTsKLSAgaWYgKGxheWVyLT5oYXNQaXRjaCgpKQotICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBQSVRDSCAlZ1xuIiwgbGF5ZXItPm5hbWUoKSwgY2hrTnVtKGxheWVyLT5waXRjaCgpKSk7Ci0gIGVsc2UgaWYgKGxheWVyLT5oYXNYWVBpdGNoKCkpCi0gICAgIGZwcmludGYoZm91dCwgIkxBWUVSICVzIFBJVENIICVnICVnXG4iLCBsYXllci0+bmFtZSgpLAotICAgICAgICAgICAgIGNoa051bShsYXllci0+cGl0Y2hYKCkpLCBjaGtOdW0obGF5ZXItPnBpdGNoWSgpKSk7Ci0gIGlmIChsYXllci0+aGFzT2Zmc2V0KCkpCi0gICAgIGZwcmludGYoZm91dCwgIkxBWUVSICVzIE9GRlNFVCAlZ1xuIiwgbGF5ZXItPm5hbWUoKSwKLSAgICAgICAgICAgICBjaGtOdW0obGF5ZXItPm9mZnNldCgpKSk7Ci0gIGVsc2UgaWYgKGxheWVyLT5oYXNYWU9mZnNldCgpKQotICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBPRkZTRVQgJWcgJWdcbiIsIGxheWVyLT5uYW1lKCksCi0gICAgICAgICAgICAgY2hrTnVtKGxheWVyLT5vZmZzZXRYKCkpLCBjaGtOdW0obGF5ZXItPm9mZnNldFkoKSkpOwotICBpZiAobGF5ZXItPmhhc0RpYWdQaXRjaCgpKQotICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBESUFHUElUQ0ggJWdcbiIsIGxheWVyLT5uYW1lKCksCi0gICAgICAgICAgICAgY2hrTnVtKGxheWVyLT5kaWFnUGl0Y2goKSkpOwotICBlbHNlIGlmIChsYXllci0+aGFzWFlEaWFnUGl0Y2goKSkKLSAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgRElBR1BJVENIICVnICVnXG4iLCBsYXllci0+bmFtZSgpLAotICAgICAgICAgICAgIGNoa051bShsYXllci0+ZGlhZ1BpdGNoWCgpKSwgY2hrTnVtKGxheWVyLT5kaWFnUGl0Y2hZKCkpKTsKLSAgaWYgKGxheWVyLT5oYXNEaWFnV2lkdGgoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgRElBR1dJRFRIICVnXG4iLCBsYXllci0+bmFtZSgpLAotICAgICAgICAgICAgIGNoa051bShsYXllci0+ZGlhZ1dpZHRoKCkpKTsKLSAgaWYgKGxheWVyLT5oYXNEaWFnU3BhY2luZygpKQotICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBESUFHU1BBQ0lORyAlZ1xuIiwgbGF5ZXItPm5hbWUoKSwKLSAgICAgICAgICAgICBjaGtOdW0obGF5ZXItPmRpYWdTcGFjaW5nKCkpKTsKLSAgaWYgKGxheWVyLT5oYXNEaWFnTWluRWRnZUxlbmd0aCgpKQotICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBESUFHTUlORURHRUxFTkdUSCAlZ1xuIiwgbGF5ZXItPm5hbWUoKSwKLSAgICAgICAgICAgICBjaGtOdW0obGF5ZXItPmRpYWdNaW5FZGdlTGVuZ3RoKCkpKTsKLSAgaWYgKGxheWVyLT5oYXNXaWR0aCgpKQotICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBXSURUSCAlZ1xuIiwgbGF5ZXItPm5hbWUoKSwKLSAgICAgICAgICAgICBjaGtOdW0obGF5ZXItPndpZHRoKCkpKTsKLSAgaWYgKGxheWVyLT5oYXNBcmVhKCkpCi0gICAgIGZwcmludGYoZm91dCwgIkxBWUVSICVzIEFSRUEgJWdcbiIsIGxheWVyLT5uYW1lKCksCi0gICAgICAgICAgICAgY2hrTnVtKGxheWVyLT5hcmVhKCkpKTsKLSAgaWYgKGxheWVyLT5udW1NaW5TaXplKCkpIHsKLSAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgTUlOU0laRSIsIGxheWVyLT5uYW1lKCkpOwotICAgICBmb3IgKGkgPSAwOyBpIDwgbGF5ZXItPm51bU1pblNpemUoKTsgaSsrKQotICAgICAgICBmcHJpbnRmKGZvdXQsICIgJWcgJWciLCBsYXllci0+bWluU2l6ZVdpZHRoKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllci0+bWluU2l6ZUxlbmd0aChpKSk7Ci0gICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gIH0KLSAgaWYgKGxheWVyLT5oYXNTbG90V2lyZVdpZHRoKCkpCi0gICAgIGZwcmludGYoZm91dCwgIkxBWUVSICVzIFNMT1RXSVJFV0lEVEggJWdcbiIsIGxheWVyLT5uYW1lKCksCi0gICAgICAgICAgICAgY2hrTnVtKGxheWVyLT5zbG90V2lyZVdpZHRoKCkpKTsKLSAgaWYgKGxheWVyLT5oYXNTbG90V2lyZUxlbmd0aCgpKQotICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBTTE9UV0lSRUxFTkdUSCAlZ1xuIiwgbGF5ZXItPm5hbWUoKSwKLSAgICAgICAgICAgICBjaGtOdW0obGF5ZXItPnNsb3RXaXJlTGVuZ3RoKCkpKTsKLSAgaWYgKGxheWVyLT5oYXNTbG90V2lkdGgoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgU0xPVFdJRFRIICVnXG4iLCBsYXllci0+bmFtZSgpLAotICAgICAgICAgICAgIGNoa051bShsYXllci0+c2xvdFdpZHRoKCkpKTsKLSAgaWYgKGxheWVyLT5oYXNTbG90TGVuZ3RoKCkpCi0gICAgIGZwcmludGYoZm91dCwgIkxBWUVSICVzIFNMT1RMRU5HVEggJWdcbiIsIGxheWVyLT5uYW1lKCksCi0gICAgICAgICAgICAgY2hrTnVtKGxheWVyLT5zbG90TGVuZ3RoKCkpKTsKLSAgaWYgKGxheWVyLT5oYXNNYXhBZGphY2VudFNsb3RTcGFjaW5nKCkpCi0gICAgIGZwcmludGYoZm91dCwgIkxBWUVSICVzIE1BWEFESkFDRU5UU0xPVFNQQUNJTkcgJWdcbiIsIGxheWVyLT5uYW1lKCksCi0gICAgICAgICAgICAgY2hrTnVtKGxheWVyLT5tYXhBZGphY2VudFNsb3RTcGFjaW5nKCkpKTsKLSAgaWYgKGxheWVyLT5oYXNNYXhDb2F4aWFsU2xvdFNwYWNpbmcoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgTUFYQ09BWElBTFNMT1RTUEFDSU5HICVnXG4iLCBsYXllci0+bmFtZSgpLAotICAgICAgICAgICAgIGNoa051bShsYXllci0+bWF4Q29heGlhbFNsb3RTcGFjaW5nKCkpKTsKLSAgaWYgKGxheWVyLT5oYXNNYXhFZGdlU2xvdFNwYWNpbmcoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgTUFYRURHRVNMT1RTUEFDSU5HICVnXG4iLCBsYXllci0+bmFtZSgpLAotICAgICAgICAgICAgIGNoa051bShsYXllci0+bWF4RWRnZVNsb3RTcGFjaW5nKCkpKTsKLSAgaWYgKGxheWVyLT5oYXNBcnJheVNwYWNpbmcoKSkgewotICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBBUlJBWVNQQUNJTkciLCBsYXllci0+bmFtZSgpKTsKLSAgICAgaWYgKGxheWVyLT5oYXNMb25nQXJyYXkoKSkKLSAgICAgICAgZnByaW50Zihmb3V0LCAiIExPTkdBUlJBWSIpOwotICAgICBpZiAobGF5ZXItPmhhc1ZpYVdpZHRoKCkpCi0gICAgICAgIGZwcmludGYoZm91dCwgIiBXSURUSCAlZyIsIGNoa051bShsYXllci0+dmlhV2lkdGgoKSkpOwotICAgICBmcHJpbnRmKGZvdXQsICIgQ1VUU1BBQ0lORyAlZyIsIGNoa051bShsYXllci0+Y3V0U3BhY2luZygpKSk7Ci0gICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgIGZvciAoaSA9IDE7IGkgPCBsYXllci0+bnVtQXJyYXlDdXRzKCk7IGkrKykgewotICAgICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBBUlJBWUNVVFMgJWkgU1BBQ0lORyAlZ1xuIiwgbGF5ZXItPm5hbWUoKSwKLSAgICAgICAgICAgICAgICBsYXllci0+YXJyYXlDdXRzKGkpLAotICAgICAgICAgICAgICAgIGxheWVyLT5hcnJheVNwYWNpbmcoaSkpOwotICAgICB9Ci0gIH0KLSAgaWYgKGxheWVyLT5oYXNTcGxpdFdpcmVXaWR0aCgpKQotICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBTUExJVFdJUkVXSURUSCAlZ1xuIiwgbGF5ZXItPm5hbWUoKSwKLSAgICAgICAgICAgICBjaGtOdW0obGF5ZXItPnNwbGl0V2lyZVdpZHRoKCkpKTsKLSAgaWYgKGxheWVyLT5oYXNNaW5pbXVtRGVuc2l0eSgpKQotICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBNSU5JTVVNREVOU0lUWSAlZ1xuIiwgbGF5ZXItPm5hbWUoKSwKLSAgICAgICAgICAgICBjaGtOdW0obGF5ZXItPm1pbmltdW1EZW5zaXR5KCkpKTsKLSAgaWYgKGxheWVyLT5oYXNNYXhpbXVtRGVuc2l0eSgpKQotICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBNQVhJTVVNREVOU0lUWSAlZ1xuIiwgbGF5ZXItPm5hbWUoKSwKLSAgICAgICAgICAgICBjaGtOdW0obGF5ZXItPm1heGltdW1EZW5zaXR5KCkpKTsKLSAgaWYgKGxheWVyLT5oYXNEZW5zaXR5Q2hlY2tXaW5kb3coKSkKLSAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgREVOU0lUWUNIRUNLV0lORE9XICVnICVnXG4iLCBsYXllci0+bmFtZSgpLAotICAgICAgICAgICAgIGNoa051bShsYXllci0+ZGVuc2l0eUNoZWNrV2luZG93TGVuZ3RoKCkpLAotICAgICAgICAgICAgIGNoa051bShsYXllci0+ZGVuc2l0eUNoZWNrV2luZG93V2lkdGgoKSkpOwotICBpZiAobGF5ZXItPmhhc0RlbnNpdHlDaGVja1N0ZXAoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgREVOU0lUWUNIRUNLU1RFUCAlZ1xuIiwgbGF5ZXItPm5hbWUoKSwKLSAgICAgICAgICAgICBjaGtOdW0obGF5ZXItPmRlbnNpdHlDaGVja1N0ZXAoKSkpOwotICBpZiAobGF5ZXItPmhhc0ZpbGxBY3RpdmVTcGFjaW5nKCkpCi0gICAgIGZwcmludGYoZm91dCwgIkxBWUVSICVzIEZJTExBQ1RJVkVTUEFDSU5HICVnXG4iLCBsYXllci0+bmFtZSgpLAotICAgICAgICAgICAgIGNoa051bShsYXllci0+ZmlsbEFjdGl2ZVNwYWNpbmcoKSkpOwotICBudW1NaW5DdXQgPSBsYXllci0+bnVtTWluaW11bWN1dCgpOyAgICAvLyA1LjQuMQotICBpZiAobnVtTWluQ3V0ID4gMCkgewotICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTWluQ3V0OyBpKyspIHsKLSAgICAgICAgIGZwcmludGYoZm91dCwgIkxBWUVSICVzIE1JTklNVU1DVVQgJWQgV0lEVEggJWciLCBsYXllci0+bmFtZSgpLAotICAgICAgICAgICAgICBsYXllci0+bWluaW11bWN1dChpKSwKLSAgICAgICAgICAgICAgbGF5ZXItPm1pbmltdW1jdXRXaWR0aChpKSk7Ci0gICAgICAgICBpZiAobGF5ZXItPmhhc01pbmltdW1jdXRXaXRoaW4oaSkpCi0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgV0lUSElOICVnIiwgbGF5ZXItPm1pbmltdW1jdXRXaXRoaW4oaSkpOwotICAgICAgICAgaWYgKGxheWVyLT5oYXNNaW5pbXVtY3V0Q29ubmVjdGlvbihpKSkKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAlcyIsIGxheWVyLT5taW5pbXVtY3V0Q29ubmVjdGlvbihpKSk7Ci0gICAgICAgICBpZiAobGF5ZXItPmhhc01pbmltdW1jdXROdW1DdXRzKGkpKQotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIExFTkdUSCAlZyBXSVRISU4gJWciLAotICAgICAgICAgICAgbGF5ZXItPm1pbmltdW1jdXRMZW5ndGgoaSksCi0gICAgICAgICAgICBsYXllci0+bWluaW11bWN1dERpc3RhbmNlKGkpKTsKLSAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgIH0KLSAgfQotICBpZiAobGF5ZXItPmhhc01heHdpZHRoKCkpICAgICAgICAgICAgICAvLyA1LjQuMQotICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBNQVhXSURUSCAlZ1xuIiwgbGF5ZXItPm5hbWUoKSwgbGF5ZXItPm1heHdpZHRoKCkpOyAKLSAgaWYgKGxheWVyLT5oYXNNaW53aWR0aCgpKSAgICAgICAgICAgICAgLy8gNS41Ci0gICAgIGZwcmludGYoZm91dCwgIkxBWUVSICVzIE1JTldJRFRIICVnXG4iLCBsYXllci0+bmFtZSgpLCBsYXllci0+bWlud2lkdGgoKSk7IAotICBudW1NaW5lbmNsb3NlZCA9IGxheWVyLT5udW1NaW5lbmNsb3NlZGFyZWEoKTsKLSAgaWYgKG51bU1pbmVuY2xvc2VkID4gMCkgewotICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTWluZW5jbG9zZWQ7IGkrKykgeyAgLy8gNS41LCBtYWRlIGl0IG11bHRpcGxlcwotICAgICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBNSU5FTkNMT1NFREFSRUEgJWciLCBsYXllci0+bmFtZSgpLAotICAgICAgICAgICAgICAgbGF5ZXItPm1pbmVuY2xvc2VkYXJlYShpKSk7Ci0gICAgICAgIGlmIChsYXllci0+aGFzTWluZW5jbG9zZWRhcmVhV2lkdGgoaSkpCi0gICAgICAgICAgIGZwcmludGYoZm91dCwgIiBNSU5FTkNMT1NFREFSRUFXSURUSCAlZyIsCi0gICAgICAgICAgICAgICAgICAgbGF5ZXItPm1pbmVuY2xvc2VkYXJlYVdpZHRoKGkpKTsKLSAgICAgICAgZnByaW50Zihmb3V0LCJcbiIpOwotICAgICB9Ci0gIH0KLSAgaWYgKGxheWVyLT5oYXNNaW5zdGVwKCkpIHsgICAgICAgICAgICAgICAvLyA1LjQuMSAmIDUuNgotICAgICBmb3IgKGkgPSAwOyBpIDwgbGF5ZXItPm51bU1pbnN0ZXAoKTsgaSsrKSB7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIkxBWUVSICVzIE1JTlNURVAgJWciLCBsYXllci0+bmFtZSgpLAotICAgICAgICAgICAgICAgIGxheWVyLT5taW5zdGVwKGkpKTsKLSAgICAgICAgaWYgKGxheWVyLT5oYXNNaW5zdGVwVHlwZShpKSkKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVzIiwgbGF5ZXItPm1pbnN0ZXBUeXBlKGkpKTsKLSAgICAgICAgaWYgKGxheWVyLT5oYXNNaW5zdGVwTGVuZ3Roc3VtKGkpKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgTEVOR1RIU1VNICVnIiwgbGF5ZXItPm1pbnN0ZXBMZW5ndGhzdW0oaSkpOwotICAgICAgICBpZiAobGF5ZXItPmhhc01pbnN0ZXBNYXhlZGdlcyhpKSkKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIE1BWEVER0VTICVkIiwgbGF5ZXItPm1pbnN0ZXBNYXhlZGdlcyhpKSk7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgIH0KLSAgfQotICBpZiAobGF5ZXItPmhhc1Byb3RydXNpb24oKSkgICAgICAgICAgICAvLyA1LjQuMQotICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBQUk9UUlVTSU9OV0lEVEggJWcgTEVOR1RIICVnIFdJRFRIICVnXG4iLAotICAgICAgICAgICAgIGxheWVyLT5uYW1lKCksIGxheWVyLT5wcm90cnVzaW9uV2lkdGgxKCksCi0gICAgICAgICAgICAgbGF5ZXItPnByb3RydXNpb25MZW5ndGgoKSwgbGF5ZXItPnByb3RydXNpb25XaWR0aDIoKSk7Ci0gIGlmIChsYXllci0+aGFzU3BhY2luZ051bWJlcigpKSB7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBsYXllci0+bnVtU3BhY2luZygpOyBpKyspIHsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgU1BBQ0lORyAlZyIsIGxheWVyLT5uYW1lKCksCi0gICAgICAgICAgICAgICAgY2hrTnVtKGxheWVyLT5zcGFjaW5nKGkpKSk7Ci0gICAgICAgIGlmIChsYXllci0+c3BhY2luZ05hbWUoaSkpCi0gICAgICAgICAgIGZwcmludGYoZm91dCwgIiBMQVlFUiAlcyIsIGxheWVyLT5zcGFjaW5nTmFtZShpKSk7Ci0gICAgICAgIGlmIChsYXllci0+aGFzU3BhY2luZ0xheWVyU3RhY2soaSkpCi0gICAgICAgICAgIGZwcmludGYoZm91dCwgIiBTVEFDSyIpOwotICAgICAgICBmcHJpbnRmKGZvdXQsIlxuIik7Ci0gICAgICAgIGlmIChsYXllci0+aGFzU3BhY2luZ0FkamFjZW50KGkpKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBBREpBQ0VOVENVVFMgJWQgV0lUSElOICVnXG4iLCBsYXllci0+bmFtZSgpLAotICAgICAgICAgICAgICAgICAgIGxheWVyLT5zcGFjaW5nQWRqYWNlbnRDdXRzKGkpLAotICAgICAgICAgICAgICAgICAgIGNoa051bShsYXllci0+c3BhY2luZ0FkamFjZW50V2l0aGluKGkpKSk7Ci0gICAgICAgIGlmIChsYXllci0+aGFzU3BhY2luZ0FkamFjZW50RXhjZXB0KGkpKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBFWENFUFRTQU1FUEdORVRcbiIsIGxheWVyLT5uYW1lKCkpOwotICAgICAgICBpZiAobGF5ZXItPmhhc1NwYWNpbmdDZW50ZXJUb0NlbnRlcihpKSkKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgQ0VOVEVSVE9DRU5URVJcbiIsIGxheWVyLT5uYW1lKCkpOwotICAgICAgICBpZiAobGF5ZXItPmhhc1NwYWNpbmdTYW1lbmV0KGkpKSB7Ci0gICAgICAgICAgIGZwcmludGYoZm91dCwgIkxBWUVSICVzIFNBTUVORVQiLCBsYXllci0+bmFtZSgpKTsKLSAgICAgICAgICAgaWYgKGxheWVyLT5oYXNTcGFjaW5nU2FtZW5ldFBHb25seShpKSkKLSAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIFBHT05MWVxuIik7Ci0gICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobGF5ZXItPmhhc1NwYWNpbmdBcmVhKGkpKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBBUkVBICVnXG4iLCBsYXllci0+bmFtZSgpLAotICAgICAgICAgICAgICAgICAgY2hrTnVtKGxheWVyLT5zcGFjaW5nQXJlYShpKSkpOwotICAgICAgICBpZiAobGF5ZXItPmhhc1NwYWNpbmdSYW5nZShpKSkgewotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBSQU5HRSAlZyAlZyIsIGxheWVyLT5uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgY2hrTnVtKGxheWVyLT5zcGFjaW5nUmFuZ2VNaW4oaSkpLAotICAgICAgICAgICAgICAgICAgIGNoa051bShsYXllci0+c3BhY2luZ1JhbmdlTWF4KGkpKSk7Ci0gICAgICAgICAgIGlmIChsYXllci0+aGFzU3BhY2luZ1JhbmdlVXNlTGVuZ3RoVGhyZXNob2xkKGkpKQotICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJVU0VMRU5HVEhUSFJFU0hPTEQgIik7Ci0gICAgICAgICAgZWxzZSBpZiAobGF5ZXItPmhhc1NwYWNpbmdSYW5nZUluZmx1ZW5jZShpKSkgewotICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJJTkZMVUVOQ0UgJWcgIiwKLSAgICAgICAgICAgICAgICAgbGF5ZXItPnNwYWNpbmdSYW5nZUluZmx1ZW5jZShpKSk7Ci0gICAgICAgICAgICAgIGlmIChsYXllci0+aGFzU3BhY2luZ1JhbmdlSW5mbHVlbmNlUmFuZ2UoaSkpCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlJBTkdFICVnICVnICIsCi0gICAgICAgICAgICAgICAgICAgIGxheWVyLT5zcGFjaW5nUmFuZ2VJbmZsdWVuY2VNaW4oaSksCi0gICAgICAgICAgICAgICAgICAgIGxheWVyLT5zcGFjaW5nUmFuZ2VJbmZsdWVuY2VNYXgoaSkpOwotICAgICAgICAgICB9IGVsc2UgaWYgKGxheWVyLT5oYXNTcGFjaW5nUmFuZ2VSYW5nZShpKSkKLSAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlJBTkdFICVnICVnICIsCi0gICAgICAgICAgICAgICAgIGxheWVyLT5zcGFjaW5nUmFuZ2VSYW5nZU1pbihpKSwKLSAgICAgICAgICAgICAgICAgbGF5ZXItPnNwYWNpbmdSYW5nZVJhbmdlTWF4KGkpKTsKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCJcbiIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGxheWVyLT5oYXNTcGFjaW5nTGVuZ3RoVGhyZXNob2xkKGkpKSB7Ci0gICAgICAgICAgIGZwcmludGYoZm91dCwgIkxBWUVSICVzIExFTkdUSFRIUkVTSE9MRCAlZ1xuIiwgbGF5ZXItPm5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICBjaGtOdW0obGF5ZXItPnNwYWNpbmdMZW5ndGhUaHJlc2hvbGQoaSkpKTsKLSAgICAgICAgICAgaWYgKGxheWVyLT5oYXNTcGFjaW5nTGVuZ3RoVGhyZXNob2xkUmFuZ2UoaSkpCi0gICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlJBTkdFICVnICVnIiwKLSAgICAgICAgICAgICAgICAgbGF5ZXItPnNwYWNpbmdMZW5ndGhUaHJlc2hvbGRSYW5nZU1pbihpKSwKLSAgICAgICAgICAgICAgICAgbGF5ZXItPnNwYWNpbmdMZW5ndGhUaHJlc2hvbGRSYW5nZU1heChpKSk7Ci0gICAgICAgICAgIGZwcmludGYoZm91dCwiXG4iKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChsYXllci0+aGFzU3BhY2luZ05vdGNoTGVuZ3RoKGkpKSB7Ci0gICAgICAgICAgIGZwcmludGYoZm91dCwgIkxBWUVSICVzIE5PVENITEVOR1RIICVnXG4iLCBsYXllci0+bmFtZSgpLAotICAgICAgICAgICAgICAgICAgIGNoa051bShsYXllci0+c3BhY2luZ05vdGNoTGVuZ3RoKGkpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobGF5ZXItPmhhc1NwYWNpbmdFbmRPZk5vdGNoV2lkdGgoaSkpIHsKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgRU5ET0ZOT1RDSFdJRFRIICVnIE5PVENIU1BBQ0lORyAlZywgTk9UQ0hMRU5HVEggJWdcbiIsCi0gICAgICAgICAgICAgICAgICAgbGF5ZXItPm5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICBjaGtOdW0obGF5ZXItPnNwYWNpbmdFbmRPZk5vdGNoV2lkdGgoaSkpLAotICAgICAgICAgICAgICAgICAgIGNoa051bShsYXllci0+c3BhY2luZ0VuZE9mTm90Y2hTcGFjaW5nKGkpKSwKLSAgICAgICAgICAgICAgICAgICBjaGtOdW0obGF5ZXItPnNwYWNpbmdFbmRPZk5vdGNoTGVuZ3RoKGkpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxheWVyLT5oYXNTcGFjaW5nUGFyYWxsZWxPdmVybGFwKGkpKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBQQVJBTExFTE9WRVJMQVBcbiIsIGxheWVyLT5uYW1lKCkpOwotICAgICAgICBpZiAobGF5ZXItPmhhc1NwYWNpbmdFbmRPZkxpbmUoaSkpIHsKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgRU5ET0ZMSU5FICVnIFdJVEhJTiAlZyAiLCBsYXllci0+bmFtZSgpLAotICAgICAgICAgICAgICBjaGtOdW0obGF5ZXItPnNwYWNpbmdFb2xXaWR0aChpKSksCi0gICAgICAgICAgICAgIGNoa051bShsYXllci0+c3BhY2luZ0VvbFdpdGhpbihpKSkpOwotICAgICAgICAgICBpZiAobGF5ZXItPmhhc1NwYWNpbmdQYXJlbGxlbEVkZ2UoaSkpIHsKLSAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiUEFSQUxMRUxFREdFICVnIFdJVEhJTiAlZyAiLAotICAgICAgICAgICAgICAgICBjaGtOdW0obGF5ZXItPnNwYWNpbmdQYXJTcGFjZShpKSksCi0gICAgICAgICAgICAgICAgIGNoa051bShsYXllci0+c3BhY2luZ1BhcldpdGhpbihpKSkpOwotICAgICAgICAgICAgICBpZiAobGF5ZXItPmhhc1NwYWNpbmdUd29FZGdlcyhpKSkgewotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJUV09FREdFUyAiKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgICAgIGZwcmludGYoZm91dCwiXG4iKTsKLSAgICAgICAgfQotICAgICB9Ci0gIH0KLSAgaWYgKGxheWVyLT5oYXNTcGFjaW5nVGFibGVPcnRobygpKSB7IAotICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBTUEFDSU5HVEFCTEUgT1JUSE9HT05BTFxuIiwgbGF5ZXItPm5hbWUoKSk7Ci0gICAgIG9ydGhvID0gbGF5ZXItPm9ydGhvZ29uYWwoKTsKLSAgICAgZm9yIChpID0gMDsgaSA8IG9ydGhvLT5udW1PcnRob2dvbmFsKCk7IGkrKykgewotICAgICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBTUEFDSU5HVEFCTEUgT1JUSE9HT05BTCBXSVRISU4gJWcgU1BBQ0lORyAlZ1xuIiwKLSAgICAgICAgICAgICAgICBsYXllci0+bmFtZSgpLCBvcnRoby0+Y3V0V2l0aGluKGkpLAotICAgICAgICAgICAgICAgIG9ydGhvLT5vcnRob1NwYWNpbmcoaSkpOwotICAgICB9Ci0gICAgIGZwcmludGYoZm91dCwgIjtcbiIpOwotICB9Ci0gIGlmIChsYXllci0+bnVtRW5jbG9zdXJlKCkgPiAwKSB7Ci0gICAgIGZwcmludGYoZm91dCwgIkxBWUVSICVzIEVOQ0xPU1VSRSIsIGxheWVyLT5uYW1lKCkpOwotICAgICBmb3IgKGkgPSAwOyBpIDwgbGF5ZXItPm51bUVuY2xvc3VyZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKGxheWVyLT5oYXNFbmNsb3N1cmVSdWxlKGkpKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgJXMiLCBsYXllci0+ZW5jbG9zdXJlUnVsZShpKSk7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIiAlZyAlZyIsIGxheWVyLT5lbmNsb3N1cmVPdmVyaGFuZzEoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLT5lbmNsb3N1cmVPdmVyaGFuZzIoaSkpOwotICAgICAgICBpZiAobGF5ZXItPmhhc0VuY2xvc3VyZVdpZHRoKGkpKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgV0lEVEggJWciLCBsYXllci0+ZW5jbG9zdXJlTWluV2lkdGgoaSkpOwotICAgICAgICBpZiAobGF5ZXItPmhhc0VuY2xvc3VyZUV4Y2VwdEV4dHJhQ3V0KGkpKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgRVhDRVBURVhUUkFDVVQgJWciLAotICAgICAgICAgICAgICAgICAgIGxheWVyLT5lbmNsb3N1cmVFeGNlcHRFeHRyYUN1dChpKSk7Ci0gICAgICAgIGlmIChsYXllci0+aGFzRW5jbG9zdXJlTWluTGVuZ3RoKGkpKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgTEVOR1RIICVnIiwgbGF5ZXItPmVuY2xvc3VyZU1pbkxlbmd0aChpKSk7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgIH0KLSAgfQotICBpZiAobGF5ZXItPm51bVByZWZlckVuY2xvc3VyZSgpID4gMCkgewotICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBQUkVGRVJFTkNMT1NVUkUiLCBsYXllci0+bmFtZSgpKTsKLSAgICAgZm9yIChpID0gMDsgaSA8IGxheWVyLT5udW1QcmVmZXJFbmNsb3N1cmUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChsYXllci0+aGFzUHJlZmVyRW5jbG9zdXJlUnVsZShpKSkKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgbGF5ZXItPnByZWZlckVuY2xvc3VyZVJ1bGUoaSkpOwotICAgICAgICBmcHJpbnRmKGZvdXQsICIlZyAlZyAiLCBsYXllci0+cHJlZmVyRW5jbG9zdXJlT3ZlcmhhbmcxKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllci0+cHJlZmVyRW5jbG9zdXJlT3ZlcmhhbmcyKGkpKTsKLSAgICAgICAgaWYgKGxheWVyLT5oYXNQcmVmZXJFbmNsb3N1cmVXaWR0aChpKSkKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiV0lEVEggJWcgIixsYXllci0+cHJlZmVyRW5jbG9zdXJlTWluV2lkdGgoaSkpOwotICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICB9Ci0gIH0KLSAgaWYgKGxheWVyLT5oYXNSZXNpc3RhbmNlUGVyQ3V0KCkpCi0gICAgIGZwcmludGYoZm91dCwgIkxBWUVSICVzIFJFU0lTVEFOQ0UgJWdcbiIsIGxheWVyLT5uYW1lKCksCi0gICAgICAgICAgICAgY2hrTnVtKGxheWVyLT5yZXNpc3RhbmNlUGVyQ3V0KCkpKTsKLSAgaWYgKGxheWVyLT5oYXNDdXJyZW50RGVuc2l0eVBvaW50KCkpCi0gICAgIGZwcmludGYoZm91dCwgIkxBWUVSICVzIENVUlJFTlRERU4gJWdcbiIsIGxheWVyLT5uYW1lKCksCi0gICAgICAgICAgICAgY2hrTnVtKGxheWVyLT5jdXJyZW50RGVuc2l0eVBvaW50KCkpKTsKLSAgaWYgKGxheWVyLT5oYXNDdXJyZW50RGVuc2l0eUFycmF5KCkpIHsKLSAgICAgbGF5ZXItPmN1cnJlbnREZW5zaXR5QXJyYXkoJm51bVBvaW50cywgJndpZHRocywgJmN1cnJlbnQpOwotICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUG9pbnRzOyBpKyspCi0gICAgICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBDVVJSRU5UREVOICggJWcgJWcgKVxuIiwgbGF5ZXItPm5hbWUoKSwKLSAgICAgICAgICAgICAgICAgY2hrTnVtKHdpZHRoc1tpXSksIGNoa051bShjdXJyZW50W2ldKSk7Ci0gIH0KLSAgaWYgKGxheWVyLT5oYXNEaXJlY3Rpb24oKSkKLSAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgRElSRUNUSU9OICVzXG4iLCBsYXllci0+bmFtZSgpLAotICAgICAgICAgICAgIGxheWVyLT5kaXJlY3Rpb24oKSk7Ci0gIGlmIChsYXllci0+aGFzUmVzaXN0YW5jZSgpKQotICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBSRVNJU1RBTkNFIFJQRVJTUSAlZ1xuIiwgbGF5ZXItPm5hbWUoKSwKLSAgICAgICAgICAgICBjaGtOdW0obGF5ZXItPnJlc2lzdGFuY2UoKSkpOwotICBpZiAobGF5ZXItPmhhc0NhcGFjaXRhbmNlKCkpCi0gICAgIGZwcmludGYoZm91dCwgIkxBWUVSICVzIENBUEFDSVRBTkNFIENQRVJTUURJU1QgJWdcbiIsIGxheWVyLT5uYW1lKCksCi0gICAgICAgICAgICAgY2hrTnVtKGxheWVyLT5jYXBhY2l0YW5jZSgpKSk7Ci0gIGlmIChsYXllci0+aGFzSGVpZ2h0KCkpCi0gICAgIGZwcmludGYoZm91dCwgIkxBWUVSICVzIEhFSUdIVCAlZ1xuIiwgbGF5ZXItPm5hbWUoKSwgY2hrTnVtKGxheWVyLT5oZWlnaHQoKSkpOwotICBpZiAobGF5ZXItPmhhc1RoaWNrbmVzcygpKQotICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBUSElDS05FU1MgJWdcbiIsIGxheWVyLT5uYW1lKCksCi0gICAgICAgICAgICAgY2hrTnVtKGxheWVyLT50aGlja25lc3MoKSkpOwotICBpZiAobGF5ZXItPmhhc1dpcmVFeHRlbnNpb24oKSkKLSAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgV0lSRUVYVEVOU0lPTiAlZ1xuIiwgbGF5ZXItPm5hbWUoKSwKLSAgICAgICAgICAgICBjaGtOdW0obGF5ZXItPndpcmVFeHRlbnNpb24oKSkpOwotICBpZiAobGF5ZXItPmhhc1Nocmlua2FnZSgpKQotICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBTSFJJTktBR0UgJWdcbiIsIGxheWVyLT5uYW1lKCksCi0gICAgICAgICAgICAgY2hrTnVtKGxheWVyLT5zaHJpbmthZ2UoKSkpOwotICBpZiAobGF5ZXItPmhhc0NhcE11bHRpcGxpZXIoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgQ0FQTVVMVElQTElFUiAlZ1xuIiwgbGF5ZXItPm5hbWUoKSwKLSAgICAgICAgICAgICBjaGtOdW0obGF5ZXItPmNhcE11bHRpcGxpZXIoKSkpOwotICBpZiAobGF5ZXItPmhhc0VkZ2VDYXAoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgRURHRUNBUEFDSVRBTkNFICVnXG4iLCBsYXllci0+bmFtZSgpLAotICAgICAgICAgICAgIGNoa051bShsYXllci0+ZWRnZUNhcCgpKSk7Ci0gIGlmIChsYXllci0+aGFzQW50ZW5uYUFyZWEoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgQU5UQVJFQUZBQ1RPUiAlZ1xuIiwgbGF5ZXItPm5hbWUoKSwKLSAgICAgICAgICAgICBjaGtOdW0obGF5ZXItPmFudGVubmFBcmVhKCkpKTsKLSAgaWYgKGxheWVyLT5oYXNBbnRlbm5hTGVuZ3RoKCkpCi0gICAgIGZwcmludGYoZm91dCwgIkxBWUVSICVzIEFOVExFTkdUSEZBQ1RPUiAlZ1xuIiwgbGF5ZXItPm5hbWUoKSwKLSAgICAgICAgICAgICBjaGtOdW0obGF5ZXItPmFudGVubmFMZW5ndGgoKSkpOwotICBmb3IgKGogPSAwOyBqIDwgbGF5ZXItPm51bUFudGVubmFNb2RlbCgpOyBqKyspIHsgLy8gNS41Ci0gICAgIGFNb2RlbCA9IGxheWVyLT5hbnRlbm5hTW9kZWwoaik7Ci0KLSAgICAgaWYgKGFNb2RlbC0+aGFzQW50ZW5uYUFyZWFSYXRpbygpKQotICAgICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyAlcyBBTlRBUkVBUkFUSU8gJWdcbiIsIGxheWVyLT5uYW1lKCksCi0gICAgICAgICAgICAgICAgYU1vZGVsLT5hbnRlbm5hT3hpZGUoKSwKLSAgICAgICAgICAgICAgICBjaGtOdW0oYU1vZGVsLT5hbnRlbm5hQXJlYVJhdGlvKCkpKTsKLSAgICAgaWYgKGFNb2RlbC0+aGFzQW50ZW5uYURpZmZBcmVhUmF0aW8oKSkKLSAgICAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgJXMgQU5URElGRkFSRUFSQVRJTyAlZ1xuIiwgbGF5ZXItPm5hbWUoKSwKLSAgICAgICAgICAgICAgICBhTW9kZWwtPmFudGVubmFPeGlkZSgpLAotICAgICAgICAgICAgICAgIGNoa051bShhTW9kZWwtPmFudGVubmFEaWZmQXJlYVJhdGlvKCkpKTsKLSAgICAgZWxzZSBpZiAoYU1vZGVsLT5oYXNBbnRlbm5hRGlmZkFyZWFSYXRpb1BXTCgpKSB7Ci0gICAgICAgIHB3bCA9IGFNb2RlbC0+YW50ZW5uYURpZmZBcmVhUmF0aW9QV0woKTsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgJXMgQU5URElGRkFSRUFSQVRJTyBQV0wiLCBsYXllci0+bmFtZSgpLAotICAgICAgICAgICAgICAgIGFNb2RlbC0+YW50ZW5uYU94aWRlKCkpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHdsLT5udW1QV0woKTsgaSsrKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgJWcgJWciLCBjaGtOdW0ocHdsLT5QV0xkaWZmdXNpb24oaSkpLAotICAgICAgICAgICAgICAgICAgIGNoa051bShwd2wtPlBXTHJhdGlvKGkpKSk7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgIH0KLSAgICAgaWYgKGFNb2RlbC0+aGFzQW50ZW5uYUN1bUFyZWFSYXRpbygpKQotICAgICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyAlcyBBTlRDVU1BUkVBUkFUSU8gJWdcbiIsIGxheWVyLT5uYW1lKCksCi0gICAgICAgICAgICAgICAgYU1vZGVsLT5hbnRlbm5hT3hpZGUoKSwKLSAgICAgICAgICAgICAgICBjaGtOdW0oYU1vZGVsLT5hbnRlbm5hQ3VtQXJlYVJhdGlvKCkpKTsKLSAgICAgaWYgKGFNb2RlbC0+aGFzQW50ZW5uYUN1bURpZmZBcmVhUmF0aW8oKSkKLSAgICAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgJXMgQU5UQ1VNRElGRkFSRUFSQVRJTyAlZ1xuIiwgbGF5ZXItPm5hbWUoKSwKLSAgICAgICAgICAgICAgICBhTW9kZWwtPmFudGVubmFPeGlkZSgpLAotICAgICAgICAgICAgICAgIGNoa051bShhTW9kZWwtPmFudGVubmFDdW1EaWZmQXJlYVJhdGlvKCkpKTsKLSAgICAgZWxzZSBpZiAoYU1vZGVsLT5oYXNBbnRlbm5hQ3VtRGlmZkFyZWFSYXRpb1BXTCgpKSB7Ci0gICAgICAgIHB3bCA9IGFNb2RlbC0+YW50ZW5uYUN1bURpZmZBcmVhUmF0aW9QV0woKTsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgJXMgQU5UQ1VNRElGRkFSRUFSQVRJTyBQV0wiLCBsYXllci0+bmFtZSgpLAotICAgICAgICAgICAgICAgIGFNb2RlbC0+YW50ZW5uYU94aWRlKCkpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHdsLT5udW1QV0woKTsgaSsrKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgJWcgJWciLCBjaGtOdW0ocHdsLT5QV0xkaWZmdXNpb24oaSkpLAotICAgICAgICAgICAgICAgICAgIGNoa051bShwd2wtPlBXTHJhdGlvKGkpKSk7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgIH0KLSAgICAgaWYgKGFNb2RlbC0+aGFzQW50ZW5uYUFyZWFGYWN0b3IoKSkgewotICAgICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyAlcyBBTlRBUkVBRkFDVE9SICVnIiwgbGF5ZXItPm5hbWUoKSwKLSAgICAgICAgICAgICAgICBhTW9kZWwtPmFudGVubmFPeGlkZSgpLAotICAgICAgICAgICAgICAgIGNoa051bShhTW9kZWwtPmFudGVubmFBcmVhRmFjdG9yKCkpKTsKLSAgICAgICAgaWYgKGFNb2RlbC0+aGFzQW50ZW5uYUFyZWFGYWN0b3JEVU8oKSkKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICBESUZGVVNFT05MWSIpOwotICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICB9Ci0gICAgIGlmIChhTW9kZWwtPmhhc0FudGVubmFTaWRlQXJlYVJhdGlvKCkpCi0gICAgICAgIGZwcmludGYoZm91dCwgIkxBWUVSICVzICVzIEFOVFNJREVBUkVBUkFUSU8gJWdcbiIsIGxheWVyLT5uYW1lKCksCi0gICAgICAgICAgICAgICAgYU1vZGVsLT5hbnRlbm5hT3hpZGUoKSwKLSAgICAgICAgICAgICAgICBjaGtOdW0oYU1vZGVsLT5hbnRlbm5hU2lkZUFyZWFSYXRpbygpKSk7Ci0gICAgIGlmIChhTW9kZWwtPmhhc0FudGVubmFEaWZmU2lkZUFyZWFSYXRpbygpKQotICAgICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyAlcyBBTlRESUZGU0lERUFSRUFSQVRJTyAlZ1xuIiwgbGF5ZXItPm5hbWUoKSwKLSAgICAgICAgICAgICAgICBhTW9kZWwtPmFudGVubmFPeGlkZSgpLAotICAgICAgICAgICAgICAgIGNoa051bShhTW9kZWwtPmFudGVubmFEaWZmU2lkZUFyZWFSYXRpbygpKSk7Ci0gICAgIGVsc2UgaWYgKGFNb2RlbC0+aGFzQW50ZW5uYURpZmZTaWRlQXJlYVJhdGlvUFdMKCkpIHsKLSAgICAgICAgcHdsID0gYU1vZGVsLT5hbnRlbm5hRGlmZlNpZGVBcmVhUmF0aW9QV0woKTsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgJXMgQU5URElGRlNJREVBUkVBUkFUSU8gUFdMIiwgbGF5ZXItPm5hbWUoKSwKLSAgICAgICAgICAgICAgICBhTW9kZWwtPmFudGVubmFPeGlkZSgpKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHB3bC0+bnVtUFdMKCk7IGkrKykKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVnICVnIiwgY2hrTnVtKHB3bC0+UFdMZGlmZnVzaW9uKGkpKSwKLSAgICAgICAgICAgICAgICAgICBjaGtOdW0ocHdsLT5QV0xyYXRpbyhpKSkpOwotICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICB9Ci0gICAgIGlmIChhTW9kZWwtPmhhc0FudGVubmFDdW1TaWRlQXJlYVJhdGlvKCkpCi0gICAgICAgIGZwcmludGYoZm91dCwgIkxBWUVSICVzICVzIEFOVENVTVNJREVBUkVBUkFUSU8gJWdcbiIsIGxheWVyLT5uYW1lKCksCi0gICAgICAgICAgICAgICAgYU1vZGVsLT5hbnRlbm5hT3hpZGUoKSwKLSAgICAgICAgICAgICAgICBjaGtOdW0oYU1vZGVsLT5hbnRlbm5hQ3VtU2lkZUFyZWFSYXRpbygpKSk7Ci0gICAgIGlmIChhTW9kZWwtPmhhc0FudGVubmFDdW1EaWZmU2lkZUFyZWFSYXRpbygpKQotICAgICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyAlcyBBTlRDVU1ESUZGU0lERUFSRUFSQVRJTyAlZ1xuIiwgbGF5ZXItPm5hbWUoKSwKLSAgICAgICAgICAgICAgICBhTW9kZWwtPmFudGVubmFPeGlkZSgpLAotICAgICAgICAgICAgICAgIGNoa051bShhTW9kZWwtPmFudGVubmFDdW1EaWZmU2lkZUFyZWFSYXRpbygpKSk7Ci0gICAgIGVsc2UgaWYgKGFNb2RlbC0+aGFzQW50ZW5uYUN1bURpZmZTaWRlQXJlYVJhdGlvUFdMKCkpIHsKLSAgICAgICAgcHdsID0gYU1vZGVsLT5hbnRlbm5hQ3VtRGlmZlNpZGVBcmVhUmF0aW9QV0woKTsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgJXMgQU5UQ1VNRElGRlNJREVBUkVBUkFUSU8gUFdMIiwgbGF5ZXItPm5hbWUoKSwKLSAgICAgICAgICAgICAgICBhTW9kZWwtPmFudGVubmFPeGlkZSgpKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHB3bC0+bnVtUFdMKCk7IGkrKykKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJWcgJWcgIiwgY2hrTnVtKHB3bC0+UFdMZGlmZnVzaW9uKGkpKSwKLSAgICAgICAgICAgICAgICAgICBjaGtOdW0ocHdsLT5QV0xyYXRpbyhpKSkpOwotICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICB9Ci0gICAgIGlmIChhTW9kZWwtPmhhc0FudGVubmFTaWRlQXJlYUZhY3RvcigpKSB7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIiAgQU5UU0lERUFSRUFGQUNUT1IgJWcgIiwKLSAgICAgICAgICAgICAgICBjaGtOdW0oYU1vZGVsLT5hbnRlbm5hU2lkZUFyZWFGYWN0b3IoKSkpOwotICAgICAgICBpZiAoYU1vZGVsLT5oYXNBbnRlbm5hU2lkZUFyZWFGYWN0b3JEVU8oKSkKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICBESUZGVVNFT05MWSAiKTsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgfQotICB9Ci0KLSAgaWYgKGxheWVyLT5udW1BY2N1cnJlbnREZW5zaXR5KCkpIHsKLSAgICAgZm9yIChpID0gMDsgaSA8IGxheWVyLT5udW1BY2N1cnJlbnREZW5zaXR5KCk7IGkrKykgewotICAgICAgICAgZGVuc2l0eSA9IGxheWVyLT5hY2N1cnJlbnQoaSk7Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBBQ0NVUlJFTlRERU5TSVRZICVzIiwgbGF5ZXItPm5hbWUoKSwKLSAgICAgICAgICAgICAgICAgZGVuc2l0eS0+dHlwZSgpKTsKLSAgICAgICAgIG5lZWRIZWFkaW5nID0gMDsKLSAgICAgICAgIGlmIChkZW5zaXR5LT5oYXNPbmVFbnRyeSgpKQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAlZ1xuIiwgY2hrTnVtKGRlbnNpdHktPm9uZUVudHJ5KCkpKTsKLSAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgIGlmIChkZW5zaXR5LT5udW1GcmVxdWVuY3koKSkgewotLyoKLSAgICAgICAgICAgICAgICBpZiAobmVlZEhlYWRpbmcpIHsKLSAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBBQ0NVUlJFTlRERU5TSVRZICVzIiwgbGF5ZXItPm5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICBkZW5zaXR5LT50eXBlKCkpOwotICAgICAgICAgICAgICAgIH0KLSovCi0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIEZSRVFVRU5DWSIpOwotICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBkZW5zaXR5LT5udW1GcmVxdWVuY3koKTsgaisrKQotICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAlZyIsIGNoa051bShkZW5zaXR5LT5mcmVxdWVuY3koaikpKTsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgICAgICAgIG5lZWRIZWFkaW5nID0gMTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgaWYgKGRlbnNpdHktPm51bVdpZHRocygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5lZWRIZWFkaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgQUNDVVJSRU5UREVOU0lUWSAlcyIsIGxheWVyLT5uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgZGVuc2l0eS0+dHlwZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIFdJRFRIIik7Ci0gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGRlbnNpdHktPm51bVdpZHRocygpOyBqKyspCi0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVnIiwgY2hrTnVtKGRlbnNpdHktPndpZHRoKGopKSk7Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgICAgICAgICBuZWVkSGVhZGluZyA9IDE7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGlmIChkZW5zaXR5LT5udW1UYWJsZUVudHJpZXMoKSkgewotICAgICAgICAgICAgICAgIGlmIChuZWVkSGVhZGluZykgewotICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkxBWUVSICVzIEFDQ1VSUkVOVERFTlNJVFkgJXMiLCBsYXllci0+bmFtZSgpLAotICAgICAgICAgICAgICAgICAgIGRlbnNpdHktPnR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgayA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgayA9IDU7Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIFRBQkxFRU5UUklFUyIpOwotICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBkZW5zaXR5LT5udW1UYWJsZUVudHJpZXMoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgaWYgKGsgPiA0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAiXG5MQVlFUiAlcyBBQ0NVUlJFTlRERU5TSVRZICVzIFRBQkxFRU5UUklFUyAlZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLT5uYW1lKCksIGRlbnNpdHktPnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2hrTnVtKGRlbnNpdHktPnRhYmxlRW50cnkoaikpKTsKLSAgICAgICAgICAgICAgICAgICAgICBrID0gMTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAlZyIsIGNoa051bShkZW5zaXR5LT50YWJsZUVudHJ5KGopKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgaysrOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgICAgICAgICBuZWVkSGVhZGluZyA9IDE7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICB9Ci0gIH0KLSAgaWYgKGxheWVyLT5udW1EY2N1cnJlbnREZW5zaXR5KCkpIHsKLSAgICAgZm9yIChpID0gMDsgaSA8IGxheWVyLT5udW1EY2N1cnJlbnREZW5zaXR5KCk7IGkrKykgewotICAgICAgICAgZGVuc2l0eSA9IGxheWVyLT5kY2N1cnJlbnQoaSk7Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBEQ0NVUlJFTlRERU5TSVRZICVzIiwgbGF5ZXItPm5hbWUoKSwKLSAgICAgICAgICAgICAgICAgZGVuc2l0eS0+dHlwZSgpKTsKLSAgICAgICAgIG5lZWRIZWFkaW5nID0gMDsKLSAgICAgICAgIGlmIChkZW5zaXR5LT5oYXNPbmVFbnRyeSgpKQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAlZ1xuIiwgY2hrTnVtKGRlbnNpdHktPm9uZUVudHJ5KCkpKTsKLSAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgIGlmIChkZW5zaXR5LT5udW1DdXRhcmVhcygpKSB7Ci0vKgotICAgICAgICAgICAgICAgIGlmIChuZWVkSGVhZGluZykgewotICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkxBWUVSICVzIERDQ1VSUkVOVERFTlNJVFkgJXMiLCBsYXllci0+bmFtZSgpLAotICAgICAgICAgICAgICAgICAgIGRlbnNpdHktPnR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgfQotKi8KLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgQ1VUQVJFQSIpOwotICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBkZW5zaXR5LT5udW1DdXRhcmVhcygpOyBqKyspCi0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVnIiwgY2hrTnVtKGRlbnNpdHktPmN1dEFyZWEoaikpKTsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgICAgICAgIG5lZWRIZWFkaW5nID0gMTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgaWYgKGRlbnNpdHktPm51bVdpZHRocygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5lZWRIZWFkaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgRENDVVJSRU5UREVOU0lUWSAlcyIsIGxheWVyLT5uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgZGVuc2l0eS0+dHlwZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIFdJRFRIIik7Ci0gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGRlbnNpdHktPm51bVdpZHRocygpOyBqKyspCi0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVnIiwgY2hrTnVtKGRlbnNpdHktPndpZHRoKGopKSk7Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgICAgICAgICBuZWVkSGVhZGluZyA9IDE7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGlmIChkZW5zaXR5LT5udW1UYWJsZUVudHJpZXMoKSkgewotICAgICAgICAgICAgICAgIGlmIChuZWVkSGVhZGluZykgewotICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkxBWUVSICVzIERDQ1VSUkVOVERFTlNJVFkgJXMiLCBsYXllci0+bmFtZSgpLAotICAgICAgICAgICAgICAgICAgIGRlbnNpdHktPnR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBUQUJMRUVOVFJJRVMiKTsKLSAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZGVuc2l0eS0+bnVtVGFibGVFbnRyaWVzKCk7IGorKykKLSAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgJWciLCBjaGtOdW0oZGVuc2l0eS0+dGFibGVFbnRyeShqKSkpOwotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgICAgICAgICAgICAgbmVlZEhlYWRpbmcgPSAxOwotICAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgfQotICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IGxheWVyLT5udW1TcGFjaW5nVGFibGUoKTsgaSsrKSB7Ci0gICAgIHNwVGFibGUgPSBsYXllci0+c3BhY2luZ1RhYmxlKGkpOwotICAgICBpZiAoc3BUYWJsZS0+aXNJbmZsdWVuY2UoKSkgewotICAgICAgICBpbmZsdWVuY2UgPSBzcFRhYmxlLT5pbmZsdWVuY2UoKTsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IGluZmx1ZW5jZS0+bnVtSW5mbHVlbmNlRW50cnkoKTsgaisrKSB7Ci0gICAgICAgICAgIGZwcmludGYoZm91dCwgIkxBWUVSICVzIFNQQUNJTkdUQUJMRSBJTkZMVUVOQ0UgV0lEVEggJWcgV0lUSElOICVnIFNQQUNJTkcgJWdcbiIsCi0gICAgICAgICAgICAgICAgICAgbGF5ZXItPm5hbWUoKSwgaW5mbHVlbmNlLT53aWR0aChqKSwgaW5mbHVlbmNlLT5kaXN0YW5jZShqKSwKLSAgICAgICAgICAgICAgICAgICBpbmZsdWVuY2UtPnNwYWNpbmcoaikpOwotICAgICAgICB9Ci0gICAgIH0gZWxzZSBpZiAoc3BUYWJsZS0+aXNQYXJhbGxlbCgpKSB7Ci0gICAgICAgIHBhcmFsbGVsID0gc3BUYWJsZS0+cGFyYWxsZWwoKTsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgU1BBQ0lOR1RBQkxFIFBBUkFMTEVMUlVOTEVOR1RIIiwgbGF5ZXItPm5hbWUoKSk7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCBwYXJhbGxlbC0+bnVtTGVuZ3RoKCk7IGorKykgewotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgJWciLCBwYXJhbGxlbC0+bGVuZ3RoKGopKTsKLSAgICAgICAgfQotICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgcGFyYWxsZWwtPm51bVdpZHRoKCk7IGorKykgewotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyBTUEFDSU5HVEFCTEUgUEFSQUxMRUxSVU5MRU5HVEggV0lEVEggJWciLAotICAgICAgICAgICAgICAgICAgIGxheWVyLT5uYW1lKCksIHBhcmFsbGVsLT53aWR0aChqKSk7Ci0gICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBwYXJhbGxlbC0+bnVtTGVuZ3RoKCk7IGsrKykgewotICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgJWciLCBwYXJhbGxlbC0+d2lkdGhTcGFjaW5nKGosIGspKTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgIHR3b1dpZHRocyA9IHNwVGFibGUtPnR3b1dpZHRocygpOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgdHdvV2lkdGhzLT5udW1XaWR0aCgpOyBqKyspIHsKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgVFdPV0lEVEhTIiwgbGF5ZXItPm5hbWUoKSk7Ci0gICAgICAgICAgIGZwcmludGYoZm91dCwgIiBXSURUSCAlZyIsIHR3b1dpZHRocy0+d2lkdGgoaikpOwotICAgICAgICAgICBpZiAodHdvV2lkdGhzLT5oYXNXaWR0aFBSTChqKSkKLSAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIFBSTCAlZyIsIHR3b1dpZHRocy0+d2lkdGhQUkwoaikpOwotICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgdHdvV2lkdGhzLT5udW1XaWR0aFNwYWNpbmcoaik7IGsrKykKLSAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVnIix0d29XaWR0aHMtPndpZHRoU3BhY2luZyhqLCBrKSk7Ci0gICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgICAgIH0KLSAgICAgfQotICB9Ci0gIHByb3BOdW0gPSBsYXllci0+bnVtUHJvcHMoKTsKLSAgaWYgKHByb3BOdW0gPiAwKSB7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBwcm9wTnVtOyBpKyspIHsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgUFJPUCAiLCBsYXllci0+bmFtZSgpKTsKLSAgICAgICAgLy8gdmFsdWUgY2FuIGVpdGhlciBiZSBhIHN0cmluZyBvciBudW1iZXIKLSAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgJXMgIiwgbGF5ZXItPnByb3BOYW1lKGkpLAotICAgICAgICAgICAgICAgIGxheWVyLT5wcm9wVmFsdWUoaSkpOwotICAgICAgICBwVHlwZSA9IGxheWVyLT5wcm9wVHlwZShpKTsKLSAgICAgICAgc3dpdGNoIChwVHlwZSkgewotICAgICAgICAgICBjYXNlICdSJzogZnByaW50Zihmb3V0LCAiUkVBTCIpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIGNhc2UgJ0knOiBmcHJpbnRmKGZvdXQsICJJTlRFR0VSIik7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgY2FzZSAnUyc6IGZwcmludGYoZm91dCwgIlNUUklORyIpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIGNhc2UgJ1EnOiBmcHJpbnRmKGZvdXQsICJRVU9URVNUUklORyIpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIGNhc2UgJ04nOiBmcHJpbnRmKGZvdXQsICJOVU1CRVIiKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgIH0KLSAgfQotCi0gIHJldHVybiAwOwotfQotCi0vLyBNYWNybwotaW50IG1hY3JvQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGxlZmlNYWNybyogbWFjcm8sIGxlZmlVc2VyRGF0YSB1ZCkgewotICBsZWZpU2l0ZVBhdHRlcm4qIHBhdHRlcm47Ci0gIGludCAgICAgICAgICAgICAgcHJvcE51bSwgaSwgaGFzUHJ0U3ltID0gMDsKLQotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGZwcmludGYoZm91dCwgIk1BQ1JPICVzIiwgbWFjcm8tPm5hbWUoKSk7Ci0gIGlmIChtYWNyby0+aGFzQ2xhc3MoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiIENMQVNTICVzIiwgbWFjcm8tPm1hY3JvQ2xhc3MoKSk7Ci0gIGlmIChtYWNyby0+aXNGaXhlZE1hc2soKSkKLSAgICAgZnByaW50Zihmb3V0LCAiIEZJWEVETUFTSyAiKTsKLSAgaWYgKG1hY3JvLT5oYXNFRVEoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiIEVFUSAlcyIsIG1hY3JvLT5FRVEoKSk7Ci0gIGlmIChtYWNyby0+aGFzTEVRKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiBMRVEgJXMiLCBtYWNyby0+TEVRKCkpOwotICBpZiAobWFjcm8tPmhhc1NvdXJjZSgpKQotICAgICBmcHJpbnRmKGZvdXQsICIgU09VUkNFICVzIiwgbWFjcm8tPnNvdXJjZSgpKTsKLSAgaWYgKG1hY3JvLT5oYXNYU3ltbWV0cnkoKSkgewotICAgICBmcHJpbnRmKGZvdXQsICIgU1lNTUVUUlkgWCAiKTsKLSAgICAgaGFzUHJ0U3ltID0gMTsKLSAgfQotICBpZiAobWFjcm8tPmhhc1lTeW1tZXRyeSgpKSB7ICAgLy8gcHJpbnQgWCBZICYgUjkwIGluIG9uZSBsaW5lCi0gICAgIGlmICghaGFzUHJ0U3ltKSB7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIiAgU1lNTUVUUlkgWSAiKTsKLSAgICAgICAgaGFzUHJ0U3ltID0gMTsKLSAgICAgfQotICAgICBlbHNlCi0gICAgICAgIGZwcmludGYoZm91dCwgIlkgIik7Ci0gIH0KLSAgaWYgKG1hY3JvLT5oYXM5MFN5bW1ldHJ5KCkpIHsKLSAgICAgaWYgKCFoYXNQcnRTeW0pIHsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiICBTWU1NRVRSWSBSOTAgIik7Ci0gICAgICAgIGhhc1BydFN5bSA9IDE7Ci0gICAgIH0KLSAgICAgZWxzZQotICAgICAgICBmcHJpbnRmKGZvdXQsICJSOTAgIik7Ci0gIH0KLSAgZnByaW50ZiAoZm91dCwgIlxuIik7Ci0gIGlmIChtYWNyby0+aGFzU2l0ZU5hbWUoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiTUFDUk8gJXMgU0lURSAlc1xuIiwgbWFjcm8tPm5hbWUoKSwgbWFjcm8tPnNpdGVOYW1lKCkpOwotICBpZiAobWFjcm8tPmhhc1NpdGVQYXR0ZXJuKCkpIHsKLSAgICAgZm9yIChpID0gMDsgaSA8IG1hY3JvLT5udW1TaXRlUGF0dGVybigpOyBpKysgKSB7Ci0gICAgICAgIHBhdHRlcm4gPSBtYWNyby0+c2l0ZVBhdHRlcm4oaSk7Ci0gICAgICAgIGlmIChwYXR0ZXJuLT5oYXNTdGVwUGF0dGVybigpKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJNQUNSTyAlcyBTSVRFICVzICVnICVnICVkIERPICVnIEJZICVnIFNURVAgJWcgJWdcbiIsCi0gICAgICAgICAgICAgICAgIG1hY3JvLT5uYW1lKCksIHBhdHRlcm4tPm5hbWUoKSwgY2hrTnVtKHBhdHRlcm4tPngoKSksCi0gICAgICAgICAgICAgICAgIGNoa051bShwYXR0ZXJuLT55KCkpLCBwYXR0ZXJuLT5vcmllbnQoKSwKLSAgICAgICAgICAgICAgICAgY2hrTnVtKHBhdHRlcm4tPnhTdGFydCgpKSwgY2hrTnVtKHBhdHRlcm4tPnlTdGFydCgpKSwKLSAgICAgICAgICAgICAgICAgY2hrTnVtKHBhdHRlcm4tPnhTdGVwKCkpLCBjaGtOdW0ocGF0dGVybi0+eVN0ZXAoKSkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgIGZwcmludGYoZm91dCwgIk1BQ1JPICVzIFNJVEUgJXMgJWcgJWcgJWRcbiIsCi0gICAgICAgICAgICAgICAgIG1hY3JvLT5uYW1lKCksIHBhdHRlcm4tPm5hbWUoKSwgY2hrTnVtKHBhdHRlcm4tPngoKSksCi0gICAgICAgICAgICAgICAgIGNoa051bShwYXR0ZXJuLT55KCkpLCBwYXR0ZXJuLT5vcmllbnQoKSk7Ci0gICAgIH0KLSAgfQotICBpZiAobWFjcm8tPmhhc1NpemUoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiTUFDUk8gJXMgU0laRSAlZyBCWSAlZ1xuIiwgbWFjcm8tPm5hbWUoKSwgCi0gICAgICAgICAgICAgY2hrTnVtKG1hY3JvLT5zaXplWCgpKSwgY2hrTnVtKG1hY3JvLT5zaXplWSgpKSk7Ci0gIGlmIChtYWNyby0+aGFzRm9yZWlnbigpKSB7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBtYWNyby0+bnVtRm9yZWlnbnMoKTsgaSsrKSB7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIk1BQ1JPICVzIEZPUkVJR04gJXMiLCBtYWNyby0+bmFtZSgpLAotICAgICAgICAgICAgICAgIG1hY3JvLT5mb3JlaWduTmFtZShpKSk7Ci0gICAgICAgIGlmIChtYWNyby0+aGFzRm9yZWlnblBvaW50KGkpKSB7Ci0gICAgICAgICAgIGZwcmludGYoZm91dCwgIiAoICVnICVnICkiLCBjaGtOdW0obWFjcm8tPmZvcmVpZ25YKGkpKSwKLSAgICAgICAgICAgICAgICAgICBjaGtOdW0obWFjcm8tPmZvcmVpZ25ZKGkpKSk7Ci0gICAgICAgICAgIGlmIChtYWNyby0+aGFzRm9yZWlnbk9yaWVudChpKSkKLSAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVzIiwgbGVmaU9yaWVudFN0cihtYWNyby0+Zm9yZWlnbk9yaWVudChpKSkpOwotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgIH0KLSAgfQotICBpZiAobWFjcm8tPmhhc09yaWdpbigpKQotICAgICBmcHJpbnRmKGZvdXQsICJNQUNSTyAlcyBPUklHSU4gKCAlZyAlZyApXG4iLCBtYWNyby0+bmFtZSgpLAotICAgICAgICAgICAgIGNoa051bShtYWNyby0+b3JpZ2luWCgpKSwgY2hrTnVtKG1hY3JvLT5vcmlnaW5ZKCkpKTsKLSAgaWYgKG1hY3JvLT5oYXNQb3dlcigpKQotICAgICBmcHJpbnRmKGZvdXQsICJNQUNSTyAlcyBQT1dFUiAlZ1xuIiwgbWFjcm8tPm5hbWUoKSwgY2hrTnVtKG1hY3JvLT5wb3dlcigpKSk7Ci0gIHByb3BOdW0gPSBtYWNyby0+bnVtUHJvcGVydGllcygpOwotICBpZiAocHJvcE51bSA+IDApIHsKLSAgICAgZm9yIChpID0gMDsgaSA8IHByb3BOdW07IGkrKykgewotICAgICAgICBmcHJpbnRmKGZvdXQsICJNQUNSTyAlcyBQUk9QIiwgbWFjcm8tPm5hbWUoKSk7Ci0gICAgICAgIC8vIHZhbHVlIGNhbiBlaXRoZXIgYmUgYSBzdHJpbmcgb3IgbnVtYmVyCi0gICAgICAgIGlmIChtYWNyby0+cHJvcFZhbHVlKGkpKSB7Ci0gICAgICAgICAgIGZwcmludGYoZm91dCwgIiAlcyAlc1xuIiwgbWFjcm8tPnByb3BOYW1lKGkpLCBtYWNyby0+cHJvcFZhbHVlKGkpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgIGZwcmludGYoZm91dCwgIiAlcyAlZ1xuIiwgbWFjcm8tPnByb3BOYW1lKGkpLAotICAgICAgICAgICAgICAgICAgIGNoa051bShtYWNyby0+cHJvcE51bShpKSkpOwotICAgICB9Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIE1hbnVmYWN0dXJpbmdncmlkCi1pbnQgbWFudWZhY3R1cmluZ0NCKGxlZnJDYWxsYmFja1R5cGVfZSBjLCBkb3VibGUgbnVtLCBsZWZpVXNlckRhdGEgdWQpIHsKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBmcHJpbnRmKGZvdXQsICJNQU5VRkFDVFVSSU5HR1JJRCAlZ1xuIiwgY2hrTnVtKG51bSkpOwotICByZXR1cm4gMDsKLX0KLQotLy8gTWF4dmlhc3RhY2sKLWludCBtYXhTdGFja1ZpYUNCKGxlZnJDYWxsYmFja1R5cGVfZSBjLCBsZWZpTWF4U3RhY2tWaWEqIG1heFN0YWNrLAotICBsZWZpVXNlckRhdGEgdWQpIHsKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBmcHJpbnRmKGZvdXQsICJNQVhWSUFTVEFDSyAlZCIsIG1heFN0YWNrLT5tYXhTdGFja1ZpYSgpKTsKLSAgaWYgKG1heFN0YWNrLT5oYXNNYXhTdGFja1ZpYVJhbmdlKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiBSQU5HRSAlcyAlcyIsCi0gICAgICAgICAgICAgbWF4U3RhY2stPm1heFN0YWNrVmlhQm90dG9tTGF5ZXIoKSwKLSAgICAgICAgICAgICBtYXhTdGFjay0+bWF4U3RhY2tWaWFUb3BMYXllcigpKTsKLSAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIE1pbmZlYXR1cmUKLWludCBtaW5GZWF0dXJlQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGxlZmlNaW5GZWF0dXJlKiBtaW4sIGxlZmlVc2VyRGF0YSB1ZCkgewotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGZwcmludGYoZm91dCwgIk1JTkZFQVRVUkUgJWcgJWdcbiIsIGNoa051bShtaW4tPm9uZSgpKSwgY2hrTnVtKG1pbi0+dHdvKCkpKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIFVuaXZlcnNhbG5vaXNlbWFyZ2luCi1pbnQgbm9pc2VNYXJnaW5DQihsZWZyQ2FsbGJhY2tUeXBlX2UgYywgbGVmaU5vaXNlTWFyZ2luKiBtYXJnaW4sCi0gICAgICAgICAgICAgICAgICBsZWZpVXNlckRhdGEgdWQpIHsKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBmcHJpbnRmKGZvdXQsICJVTklWRVJTQUxOT0lTRU1BUkdJTiAlZyAlZ1xuIiwgY2hrTnVtKG1hcmdpbi0+aGlnaCksCi0gICAgICAgICAgY2hrTnVtKG1hcmdpbi0+bG93KSk7Ci0gIHJldHVybiAwOwotfQotCi0vLyBOb2lzZVRhYmxlCi1pbnQgbm9pc2VUYWJsZUNCKGxlZnJDYWxsYmFja1R5cGVfZSBjLCBsZWZpTm9pc2VUYWJsZSogdGFibGUsIGxlZmlVc2VyRGF0YSB1ZCkgewotICBpbnQgICAgICAgICAgICAgICAgIGksIGosIGssIGw7Ci0gIGxlZmlOb2lzZUVkZ2UgICAgICAgKmVkZ2U7Ci0gIGxlZmlOb2lzZVJlc2lzdGFuY2UgKnJlc2lzdDsKLSAgbGVmaU5vaXNlVmljdGltICAgICAqdmljdGltOwotIAotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGZwcmludGYoZm91dCwgIkNST1NTVEFMSyBOT0lTRVRBQkxFICVkXG4iLCB0YWJsZS0+bnVtKCkpOwotICBpZiAodGFibGUtPm51bUVkZ2VzKCkgPiAwKSB7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCB0YWJsZS0+bnVtRWRnZXMoKTsgaSsrKSB7Ci0gICAgICAgIGVkZ2UgPSB0YWJsZS0+ZWRnZShpKTsKLSAgICAgICAgLy8gcmVzaXN0YW5jZXMKLSAgICAgICAgaWYgKGVkZ2UtPm51bVJlc2lzdGFuY2VzKCkpIHsKLSAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGVkZ2UtPm51bVJlc2lzdGFuY2VzKCk7IGorKykgewotICAgICAgICAgICAgICByZXNpc3QgPSBlZGdlLT5yZXNpc3RhbmNlKGopOwotICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJOT0lTRVRBQkxFICVkIFJFU0lTVEFOQ0UgJWdcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgdGFibGUtPm51bSgpLCBjaGtOdW0ocmVzaXN0LT5udW0oaikpKTsKLSAgICAgICAgICAgICAgLy8gdmljdGltcwotICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcmVzaXN0LT5udW1WaWN0aW1zKCk7IGsrKykgewotICAgICAgICAgICAgICAgICB2aWN0aW0gPSByZXNpc3QtPnZpY3RpbShrKTsKLSAgICAgICAgICAgICAgICAgaWYgKHZpY3RpbS0+bGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJDUk9TU1RBTEsgTk9JU0VUQUJMRSAlZCBSRVNJU1RBTkNFICVnIFZJQ1RJTUxFTkdUSCAlIGdcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUtPm51bSgpLCBjaGtOdW0ocmVzaXN0LT5udW0oaikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoa051bSh2aWN0aW0tPmxlbmd0aCgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAobCA9IDA7IGwgPCB2aWN0aW0tPm51bU5vaXNlcygpOyBsKyspCi0gICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkNST1NTVEFMSyBOT0lTRVRBQkxFICVkIFJFU0lTVEFOQ0UgJWcgVklDVElNTEVOR1QgJWcgTk9JU0VGQUNUT1IgJWdcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLT5udW0oKSwgY2hrTnVtKHJlc2lzdC0+bnVtKGopKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2hrTnVtKHZpY3RpbS0+bGVuZ3RoKCkpLCBjaGtOdW0odmljdGltLT5ub2lzZShsKSkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICB9Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIE5vbmRlZmF1bHQKLWludCBub25EZWZhdWx0Q0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGxlZmlOb25EZWZhdWx0KiBkZWYsIGxlZmlVc2VyRGF0YSB1ZCkgewotICBpbnQgICAgICAgICAgaTsKLSAgbGVmaVZpYSogICAgIHZpYTsKLSAgbGVmaVNwYWNpbmcqIHNwYWNpbmc7Ci0gIGNoYXIgICAgICAgICBkZWZOYW1lWzEwMjRdOwotCi0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgaWYgKGRlZi0+aGFzSGFyZHNwYWNpbmcoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiTk9OREVGQVVMVFJVTEUgSEFSRFNQQUNJTkdcbiIpOwotICBmb3IgKGkgPSAwOyBpIDwgZGVmLT5udW1MYXllcnMoKTsgaSsrKSB7Ci0gICAgIGZwcmludGYoZm91dCwgIk5PTkRFRkFVTFRSVUxFICVzIExBWUVSICVzIiwgZGVmLT5uYW1lKCksCi0gICAgICAgICAgICAgZGVmLT5sYXllck5hbWUoaSkpOwotICAgICBpZiAoZGVmLT5oYXNMYXllcldpZHRoKGkpKQotICAgICAgICBmcHJpbnRmKGZvdXQsICIgV0lEVEggJWciLCBjaGtOdW0oZGVmLT5sYXllcldpZHRoKGkpKSk7Ci0gICAgIGlmIChkZWYtPmhhc0xheWVyRGlhZ1dpZHRoKGkpKQotICAgICAgICBmcHJpbnRmKGZvdXQsICIgRElBR1dJRFRIICVnIiwgY2hrTnVtKGRlZi0+bGF5ZXJEaWFnV2lkdGgoaSkpKTsKLSAgICAgaWYgKGRlZi0+aGFzTGF5ZXJTcGFjaW5nKGkpKQotICAgICAgICBmcHJpbnRmKGZvdXQsICIgU1BBQ0lORyAlZyIsIGNoa051bShkZWYtPmxheWVyU3BhY2luZyhpKSkpOwotICAgICBpZiAoZGVmLT5oYXNMYXllcldpcmVFeHRlbnNpb24oaSkpCi0gICAgICAgIGZwcmludGYoZm91dCwgIiBXSVJFRVhURU5TSU9OICVnIiwgY2hrTnVtKGRlZi0+bGF5ZXJXaXJlRXh0ZW5zaW9uKGkpKSk7Ci0gICAgIGlmIChkZWYtPmhhc0xheWVyUmVzaXN0YW5jZShpKSkKLSAgICAgICAgZnByaW50Zihmb3V0LCAiIFJFU0lTVEFOQ0UgUlBFUlNRICVnIiwgY2hrTnVtKGRlZi0+bGF5ZXJSZXNpc3RhbmNlKGkpKSk7Ci0gICAgIGlmIChkZWYtPmhhc0xheWVyQ2FwYWNpdGFuY2UoaSkpCi0gICAgICAgIGZwcmludGYoZm91dCwgIiBDQVBBQ0lUQU5DRSBDUEVSU1FESVNUICVnIiwKLSAgICAgICAgICAgICAgICBjaGtOdW0oZGVmLT5sYXllckNhcGFjaXRhbmNlKGkpKSk7Ci0gICAgIGlmIChkZWYtPmhhc0xheWVyRWRnZUNhcChpKSkKLSAgICAgICAgZnByaW50Zihmb3V0LCAiIEVER0VDQVBBQ0lUQU5DRSAlZyIsIGNoa051bShkZWYtPmxheWVyRWRnZUNhcChpKSkpOwotICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICB9Ci0KLSAgc3ByaW50ZihkZWZOYW1lLCAiTk9OREVGQVVMVFJVTEUgJXMgVklBIiwgZGVmLT5uYW1lKCkpOwotICAvLyBoYW5kbGUgdmlhIGluIG5vbmRlZmF1bHRydWxlCi0gIGZvciAoaSA9IDA7IGkgPCBkZWYtPm51bVZpYXMoKTsgaSsrKSB7Ci0gICAgIHZpYSA9IGRlZi0+dmlhUnVsZShpKTsKLSAgICAgbGVmVmlhKHZpYSwgZGVmTmFtZSk7Ci0gIH0KLQotICBzcHJpbnRmKGRlZk5hbWUsICJOT05ERUZBVUxUUlVMRSAlcyBTUEFDSU5HIiwgZGVmLT5uYW1lKCkpOwotICAvLyBoYW5kbGUgc3BhY2luZyBpbiBub25kZWZhdWx0cnVsZQotICBmb3IgKGkgPSAwOyBpIDwgZGVmLT5udW1TcGFjaW5nUnVsZXMoKTsgaSsrKSB7Ci0gICAgIHNwYWNpbmcgPSBkZWYtPnNwYWNpbmdSdWxlKGkpOwotICAgICBsZWZTcGFjaW5nKHNwYWNpbmcsIGRlZk5hbWUpOwotICB9Ci0KLSAgaWYgKGRlZi0+bnVtVXNlVmlhKCkgPiAwKSB7Ci0gICAgIGZwcmludGYoZm91dCwgIk5PTkRFRkFVTFRSVUxFICVzIFVTRVZJQSIsIGRlZi0+bmFtZSgpKTsKLSAgICAgLy8gaGFuZGxlIHNwYWNpbmcgaW4gbm9uZGVmYXVsdHJ1bGUKLSAgICAgZm9yIChpID0gMDsgaSA8IGRlZi0+bnVtVXNlVmlhKCk7IGkrKykKLSAgICAgICAgZnByaW50Zihmb3V0LCAiICVzIiwgZGVmLT52aWFOYW1lKGkpKTsKLSAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgfQotCi0gIGlmIChkZWYtPm51bVVzZVZpYVJ1bGUoKSA+IDApIHsKLSAgICAgZnByaW50Zihmb3V0LCAiTk9OREVGQVVMVFJVTEUgJXMgVVNFVklBUlVMRSIsIGRlZi0+bmFtZSgpKTsKLSAgICAgLy8gaGFuZGxlIHNwYWNpbmcgaW4gbm9uZGVmYXVsdHJ1bGUKLSAgICAgZm9yIChpID0gMDsgaSA8IGRlZi0+bnVtVXNlVmlhUnVsZSgpOyBpKyspCi0gICAgICAgIGZwcmludGYoZm91dCwgIiAlcyIsIGRlZi0+dmlhUnVsZU5hbWUoaSkpOwotICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICB9Ci0KLSAgaWYgKGRlZi0+bnVtTWluQ3V0cygpID4gMCkgewotICAgICBmcHJpbnRmKGZvdXQsICJOT05ERUZBVUxUUlVMRSAlcyBNSU5DVVRTIiwgZGVmLT5uYW1lKCkpOwotICAgICAvLyBoYW5kbGUgc3BhY2luZyBpbiBub25kZWZhdWx0cnVsZQotICAgICBmb3IgKGkgPSAwOyBpIDwgZGVmLT5udW1NaW5DdXRzKCk7IGkrKykKLSAgICAgICAgZnByaW50Zihmb3V0LCAiICVzICVkIiwgZGVmLT5jdXRMYXllck5hbWUoaSksIGRlZi0+bnVtQ3V0cyhpKSk7Ci0gICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotLy8gTm93aXJlZXh0ZW5zaW9uCi1pbnQgbm9XaXJlRXh0Q0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGNvbnN0IGNoYXIqIHdpcmVFeHQsIGxlZmlVc2VyRGF0YSB1ZCkgewotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGZwcmludGYoZm91dCwgIk5PV0lSRUVYVEVOU0lPTiAlc1xuIiwgd2lyZUV4dCk7Ci0gIHJldHVybiAwOwotfQotCi0vLyBPYnN0cnVjdGlvbgotaW50IG9ic3RydWN0aW9uQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGxlZmlPYnN0cnVjdGlvbiogb2JzLAotICAgICAgICAgICAgICAgICAgbGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGxlZmlHZW9tZXRyaWVzKiBnZW9tZXRyeTsKLQotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGdlb21ldHJ5ID0gb2JzLT5nZW9tZXRyaWVzKCk7Ci0gIHBydEdlb21ldHJ5KGdlb21ldHJ5LCAoY2hhciopIk9CUyIpOwotICByZXR1cm4gMDsKLX0KLQotLy8gUGluCi1pbnQgcGluQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGxlZmlQaW4qIHBpbiwgbGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGludCAgICAgICAgICAgICAgICAgIG51bVBvcnRzLCBpLCBqOwotICBsZWZpR2VvbWV0cmllcyogICAgICBnZW9tZXRyeTsKLSAgbGVmaVBpbkFudGVubmFNb2RlbCogYU1vZGVsOwotIAotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGlmIChwaW4tPmhhc0ZvcmVpZ24oKSkgewotICAgICBpZiAocGluLT5oYXNGb3JlaWduT3JpZW50KCkpCi0gICAgICAgIGZwcmludGYoZm91dCwgIlBJTiAlcyBGT1JFSUdOICVzIFNUUlVDVFVSRSAlZyAlZyAlc1xuIiwgcGluLT5uYW1lKCksCi0gICAgICAgICAgICAgICAgcGluLT5mb3JlaWduTmFtZSgpLCBjaGtOdW0ocGluLT5mb3JlaWduWCgpKSwKLSAgICAgICAgICAgICAgICBjaGtOdW0ocGluLT5mb3JlaWduWSgpKSwgbGVmaU9yaWVudFN0cihwaW4tPmZvcmVpZ25PcmllbnQoKSkpOwotICAgICBlbHNlIGlmIChwaW4tPmhhc0ZvcmVpZ25Qb2ludCgpKQotICAgICAgICBmcHJpbnRmKGZvdXQsICJQSU4gJXMgRk9SRUlHTiAlcyBTVFJVQ1RVUkUgJWcgJWciLCBwaW4tPm5hbWUoKSwKLSAgICAgICAgICAgICAgICBwaW4tPmZvcmVpZ25OYW1lKCksIGNoa051bShwaW4tPmZvcmVpZ25YKCkpLAotICAgICAgICAgICAgICAgIGNoa051bShwaW4tPmZvcmVpZ25ZKCkpKTsKLSAgICAgZWxzZQotICAgICAgICBmcHJpbnRmKGZvdXQsICJQSU4gJXMgRk9SRUlHTiAlc1xuIiwgcGluLT5uYW1lKCksIHBpbi0+Zm9yZWlnbk5hbWUoKSk7Ci0gIH0KLSAgaWYgKHBpbi0+aGFzTEVRKCkpCi0gICAgIGZwcmludGYoZm91dCwgIlBJTiAlcyBMRVEgJXNcbiIsIHBpbi0+bmFtZSgpLCBwaW4tPkxFUSgpKTsKLSAgaWYgKHBpbi0+aGFzRGlyZWN0aW9uKCkpCi0gICAgIGZwcmludGYoZm91dCwgIlBJTiAlcyBESVJFQ1RJT04gJXNcbiIsIHBpbi0+bmFtZSgpLCBwaW4tPmRpcmVjdGlvbigpKTsKLSAgaWYgKHBpbi0+aGFzVXNlKCkpCi0gICAgIGZwcmludGYoZm91dCwgIlBJTiAlcyBVU0UgJXNcbiIsIHBpbi0+bmFtZSgpLCBwaW4tPnVzZSgpKTsKLSAgaWYgKHBpbi0+aGFzU2hhcGUoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiUElOICVzIFNIQVBFICVzXG4iLCBwaW4tPm5hbWUoKSwgcGluLT5zaGFwZSgpKTsKLSAgaWYgKHBpbi0+aGFzTXVzdGpvaW4oKSkKLSAgICAgZnByaW50Zihmb3V0LCAiUElOICVzIE1VU1RKT0lOICVzXG4iLCBwaW4tPm5hbWUoKSwgcGluLT5tdXN0am9pbigpKTsKLSAgaWYgKHBpbi0+aGFzT3V0TWFyZ2luKCkpCi0gICAgIGZwcmludGYoZm91dCwgIlBJTiAlcyBPVVRQVVROT0lTRU1BUkdJTiAlZyAlZ1xuIiwgcGluLT5uYW1lKCksCi0gICAgICAgICAgICAgY2hrTnVtKHBpbi0+b3V0TWFyZ2luSGlnaCgpKSwgY2hrTnVtKHBpbi0+b3V0TWFyZ2luTG93KCkpKTsKLSAgaWYgKHBpbi0+aGFzT3V0UmVzaXN0YW5jZSgpKQotICAgICBmcHJpbnRmKGZvdXQsICJQSU4gJXMgT1VUUFVUUkVTSVNUQU5DRSAlZyAlZ1xuIiwgcGluLT5uYW1lKCksCi0gICAgICAgICAgICAgY2hrTnVtKHBpbi0+b3V0UmVzaXN0YW5jZUhpZ2goKSksIGNoa051bShwaW4tPm91dFJlc2lzdGFuY2VMb3coKSkpOwotICBpZiAocGluLT5oYXNJbk1hcmdpbigpKQotICAgICBmcHJpbnRmKGZvdXQsICJQSU4gJXMgSU5QVVROT0lTRU1BUkdJTiAlZyAlZ1xuIiwgcGluLT5uYW1lKCksCi0gICAgICAgICAgICAgY2hrTnVtKHBpbi0+aW5NYXJnaW5IaWdoKCkpLCBjaGtOdW0ocGluLT5pbk1hcmdpbkxvdygpKSk7Ci0gIGlmIChwaW4tPmhhc1Bvd2VyKCkpCi0gICAgIGZwcmludGYoZm91dCwgIlBJTiAlcyBQT1dFUiAlZ1xuIiwgcGluLT5uYW1lKCksIGNoa051bShwaW4tPnBvd2VyKCkpKTsKLSAgaWYgKHBpbi0+aGFzTGVha2FnZSgpKQotICAgICBmcHJpbnRmKGZvdXQsICJQSU4gJXMgTEVBS0FHRSAlZ1xuIiwgcGluLT5uYW1lKCksIGNoa051bShwaW4tPmxlYWthZ2UoKSkpOwotICBpZiAocGluLT5oYXNNYXhsb2FkKCkpCi0gICAgIGZwcmludGYoZm91dCwgIlBJTiAlcyBNQVhMT0FEICVnXG4iLCBwaW4tPm5hbWUoKSwgY2hrTnVtKHBpbi0+bWF4bG9hZCgpKSk7Ci0gIGlmIChwaW4tPmhhc0NhcGFjaXRhbmNlKCkpCi0gICAgIGZwcmludGYoZm91dCwgIlBJTiAlcyBDQVBBQ0lUQU5DRSAlZ1xuIiwgcGluLT5uYW1lKCksCi0gICAgICAgICAgICAgY2hrTnVtKHBpbi0+Y2FwYWNpdGFuY2UoKSkpOwotICBpZiAocGluLT5oYXNSZXNpc3RhbmNlKCkpCi0gICAgIGZwcmludGYoZm91dCwgIlBJTiAlcyBSRVNJU1RBTkNFICVnXG4iLCBwaW4tPm5hbWUoKSwKLSAgICAgICAgICAgICBjaGtOdW0ocGluLT5yZXNpc3RhbmNlKCkpKTsKLSAgaWYgKHBpbi0+aGFzUHVsbGRvd25yZXMoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiUElOICVzIFBVTExET1dOUkVTICVnXG4iLCBwaW4tPm5hbWUoKSwKLSAgICAgICAgICAgICBjaGtOdW0ocGluLT5wdWxsZG93bnJlcygpKSk7Ci0gIGlmIChwaW4tPmhhc1RpZW9mZnIoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiUElOICVzIFRJRU9GRlIgJWdcbiIsIHBpbi0+bmFtZSgpLCBjaGtOdW0ocGluLT50aWVvZmZyKCkpKTsKLSAgaWYgKHBpbi0+aGFzVkhJKCkpCi0gICAgIGZwcmludGYoZm91dCwgIlBJTiAlcyBWSEkgJWdcbiIsIHBpbi0+bmFtZSgpLCBjaGtOdW0ocGluLT5WSEkoKSkpOwotICBpZiAocGluLT5oYXNWTE8oKSkKLSAgICAgZnByaW50Zihmb3V0LCAiUElOICVzIFZMTyAlZ1xuIiwgcGluLT5uYW1lKCksIGNoa051bShwaW4tPlZMTygpKSk7Ci0gIGlmIChwaW4tPmhhc1Jpc2VWb2x0YWdlKCkpCi0gICAgIGZwcmludGYoZm91dCwgIlBJTiAlcyBSSVNFVk9MVEFHRVRIUkVTSE9MRCAlZ1xuIiwgcGluLT5uYW1lKCksCi0gICAgICAgICAgICAgY2hrTnVtKHBpbi0+cmlzZVZvbHRhZ2UoKSkpOwotICBpZiAocGluLT5oYXNGYWxsVm9sdGFnZSgpKQotICAgICBmcHJpbnRmKGZvdXQsICJQSU4gJXMgRkFMTFZPTFRBR0VUSFJFU0hPTEQgJWdcbiIsIHBpbi0+bmFtZSgpLAotICAgICAgICAgICAgIGNoa051bShwaW4tPmZhbGxWb2x0YWdlKCkpKTsKLSAgaWYgKHBpbi0+aGFzUmlzZVRocmVzaCgpKQotICAgICBmcHJpbnRmKGZvdXQsICJQSU4gJXMgUklTRVRIUkVTSCAlZ1xuIiwgcGluLT5uYW1lKCksCi0gICAgICAgICAgICAgY2hrTnVtKHBpbi0+cmlzZVRocmVzaCgpKSk7Ci0gIGlmIChwaW4tPmhhc0ZhbGxUaHJlc2goKSkKLSAgICAgZnByaW50Zihmb3V0LCAiUElOICVzIEZBTExUSFJFU0ggJWdcbiIsIHBpbi0+bmFtZSgpLAotICAgICAgICAgICAgIGNoa051bShwaW4tPmZhbGxUaHJlc2goKSkpOwotICBpZiAocGluLT5oYXNSaXNlU2F0Y3VyKCkpCi0gICAgIGZwcmludGYoZm91dCwgIlBJTiAlcyBSSVNFU0FUQ1VSICVnXG4iLCBwaW4tPm5hbWUoKSwKLSAgICAgICAgICAgICBjaGtOdW0ocGluLT5yaXNlU2F0Y3VyKCkpKTsKLSAgaWYgKHBpbi0+aGFzRmFsbFNhdGN1cigpKQotICAgICBmcHJpbnRmKGZvdXQsICJQSU4gJXMgRkFMTFNBVENVUiAlZ1xuIiwgcGluLT5uYW1lKCksCi0gICAgICAgICAgICAgY2hrTnVtKHBpbi0+ZmFsbFNhdGN1cigpKSk7Ci0gIGlmIChwaW4tPmhhc1Jpc2VTbGV3TGltaXQoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiUElOICVzIFJJU0VTTEVXTElNSVQgJWdcbiIsIHBpbi0+bmFtZSgpLAotICAgICAgICAgICAgIGNoa051bShwaW4tPnJpc2VTbGV3TGltaXQoKSkpOwotICBpZiAocGluLT5oYXNGYWxsU2xld0xpbWl0KCkpCi0gICAgIGZwcmludGYoZm91dCwgIlBJTiAlcyBGQUxMU0xFV0xJTUlUICVnXG4iLCBwaW4tPm5hbWUoKSwKLSAgICAgICAgICAgICBjaGtOdW0ocGluLT5mYWxsU2xld0xpbWl0KCkpKTsKLSAgaWYgKHBpbi0+aGFzQ3VycmVudFNvdXJjZSgpKQotICAgICBmcHJpbnRmKGZvdXQsICJQSU4gJXMgQ1VSUkVOVFNPVVJDRSAlc1xuIiwgcGluLT5uYW1lKCksCi0gICAgICAgICAgICAgcGluLT5jdXJyZW50U291cmNlKCkpOwotICBpZiAocGluLT5oYXNUYWJsZXMoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiUElOICVzIElWX1RBQkxFUyAlcyAlc1xuIiwgcGluLT5uYW1lKCksCi0gICAgICAgICAgICAgcGluLT50YWJsZUhpZ2hOYW1lKCksIHBpbi0+dGFibGVMb3dOYW1lKCkpOwotICBpZiAocGluLT5oYXNUYXBlclJ1bGUoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiUElOICVzIFRBUEVSUlVMRSAlc1xuIiwgcGluLT5uYW1lKCksIHBpbi0+dGFwZXJSdWxlKCkpOwotICBpZiAocGluLT5oYXNOZXRFeHByKCkpCi0gICAgIGZwcmludGYoZm91dCwgIlBJTiAlcyBORVRFWFBSICVzXG4iLHBpbi0+bmFtZSgpLCAgcGluLT5uZXRFeHByKCkpOwotICBpZiAocGluLT5oYXNTdXBwbHlTZW5zaXRpdml0eSgpKQotICAgICBmcHJpbnRmKGZvdXQsICJQSU4gJXMgU1VQUExZU0VOU0lUSVZJVFkgJXNcbiIsIHBpbi0+bmFtZSgpLAotICAgICAgICAgICAgIHBpbi0+c3VwcGx5U2Vuc2l0aXZpdHkoKSk7Ci0gIGlmIChwaW4tPmhhc0dyb3VuZFNlbnNpdGl2aXR5KCkpCi0gICAgIGZwcmludGYoZm91dCwgIlBJTiAlcyBHUk9VTkRTRU5TSVRJVklUWSAlc1xuIiwgcGluLT5uYW1lKCksCi0gICAgICAgICAgICAgcGluLT5ncm91bmRTZW5zaXRpdml0eSgpKTsKLSAgaWYgKHBpbi0+aGFzQW50ZW5uYVNpemUoKSkgewotICAgICBmb3IgKGkgPSAwOyBpIDwgcGluLT5udW1BbnRlbm5hU2l6ZSgpOyBpKyspIHsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiUElOICVzIEFOVFNJWkUgJWciLCBwaW4tPm5hbWUoKSwKLSAgICAgICAgICAgY2hrTnVtKHBpbi0+YW50ZW5uYVNpemUoaSkpKTsKLSAgICAgICAgaWYgKHBpbi0+YW50ZW5uYVNpemVMYXllcihpKSkKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIExBWUVSICVzXG4iLCBwaW4tPmFudGVubmFTaXplTGF5ZXIoaSkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgIH0KLSAgfQotICBpZiAocGluLT5oYXNBbnRlbm5hTWV0YWxBcmVhKCkpIHsKLSAgICAgZm9yIChpID0gMDsgaSA8IHBpbi0+bnVtQW50ZW5uYU1ldGFsQXJlYSgpOyBpKyspIHsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiUElOICVzIEFOVE1FVEFMQVJFQSAlZyIsIHBpbi0+bmFtZSgpLAotICAgICAgICAgICBjaGtOdW0ocGluLT5hbnRlbm5hTWV0YWxBcmVhKGkpKSk7Ci0gICAgICAgIGlmIChwaW4tPmFudGVubmFNZXRhbEFyZWFMYXllcihpKSkKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIExBWUVSICVzXG4iLCBwaW4tPmFudGVubmFNZXRhbEFyZWFMYXllcihpKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgfQotICB9Ci0gIGlmIChwaW4tPmhhc0FudGVubmFNZXRhbExlbmd0aCgpKSB7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBwaW4tPm51bUFudGVubmFNZXRhbExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiUElOICVzIEFOVE1FVEFMTEVOR1RIICVnIiwgcGluLT5uYW1lKCksCi0gICAgICAgICAgIGNoa051bShwaW4tPmFudGVubmFNZXRhbExlbmd0aChpKSkpOwotICAgICAgICBpZiAocGluLT5hbnRlbm5hTWV0YWxMZW5ndGhMYXllcihpKSkKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIExBWUVSICVzXG4iLCBwaW4tPmFudGVubmFNZXRhbExlbmd0aExheWVyKGkpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICB9Ci0gIH0KLSAgaWYgKHBpbi0+aGFzQW50ZW5uYVBhcnRpYWxNZXRhbEFyZWEoKSkgewotICAgICBmb3IgKGkgPSAwOyBpIDwgcGluLT5udW1BbnRlbm5hUGFydGlhbE1ldGFsQXJlYSgpOyBpKyspIHsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiUElOICVzIEFOVFBBUlRJQUxNRVRBTEFSRUEgJWciLCBwaW4tPm5hbWUoKSwKLSAgICAgICAgICAgICAgICBjaGtOdW0ocGluLT5hbnRlbm5hUGFydGlhbE1ldGFsQXJlYShpKSkpOwotICAgICAgICBpZiAocGluLT5hbnRlbm5hUGFydGlhbE1ldGFsQXJlYUxheWVyKGkpKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgTEFZRVIgJXMiLAotICAgICAgICAgICAgICAgICAgIHBpbi0+YW50ZW5uYVBhcnRpYWxNZXRhbEFyZWFMYXllcihpKSk7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgIH0KLSAgfQotICBpZiAocGluLT5oYXNBbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWEoKSkgewotICAgICBmb3IgKGkgPSAwOyBpIDwgcGluLT5udW1BbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWEoKTsgaSsrKSB7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIlBJTiAlcyBBTlRQQVJUSUFMTUVUQUxTSURFQVJFQSAlZyIsIHBpbi0+bmFtZSgpLAotICAgICAgICAgICAgICAgIGNoa051bShwaW4tPmFudGVubmFQYXJ0aWFsTWV0YWxTaWRlQXJlYShpKSkpOwotICAgICAgICBpZiAocGluLT5hbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWFMYXllcihpKSkKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIExBWUVSICVzICIsCi0gICAgICAgICAgICAgICAgICAgcGluLT5hbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWFMYXllcihpKSk7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgIH0KLSAgfQotICBpZiAocGluLT5oYXNBbnRlbm5hUGFydGlhbEN1dEFyZWEoKSkgewotICAgICBmb3IgKGkgPSAwOyBpIDwgcGluLT5udW1BbnRlbm5hUGFydGlhbEN1dEFyZWEoKTsgaSsrKSB7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIlBJTiAlcyBBTlRQQVJUSUFMQ1VUQVJFQSAlZyIsIHBpbi0+bmFtZSgpLAotICAgICAgICAgICAgICAgIGNoa051bShwaW4tPmFudGVubmFQYXJ0aWFsQ3V0QXJlYShpKSkpOwotICAgICAgICBpZiAocGluLT5hbnRlbm5hUGFydGlhbEN1dEFyZWFMYXllcihpKSkKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIExBWUVSICVzICIsCi0gICAgICAgICAgICAgICAgICAgcGluLT5hbnRlbm5hUGFydGlhbEN1dEFyZWFMYXllcihpKSk7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgIH0KLSAgfQotICBpZiAocGluLT5oYXNBbnRlbm5hRGlmZkFyZWEoKSkgewotICAgICBmb3IgKGkgPSAwOyBpIDwgcGluLT5udW1BbnRlbm5hRGlmZkFyZWEoKTsgaSsrKSB7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIlBJTiAlcyBBTlRESUZGQVJFQSAlZyIsIHBpbi0+bmFtZSgpLAotICAgICAgICAgICAgICAgIGNoa051bShwaW4tPmFudGVubmFEaWZmQXJlYShpKSkpOwotICAgICAgICBpZiAocGluLT5hbnRlbm5hRGlmZkFyZWFMYXllcihpKSkKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIExBWUVSICVzICIsIHBpbi0+YW50ZW5uYURpZmZBcmVhTGF5ZXIoaSkpOwotICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICB9Ci0gIH0KLQotICBmb3IgKGogPSAwOyBqIDwgcGluLT5udW1BbnRlbm5hTW9kZWwoKTsgaisrKSB7Ci0gICAgIGFNb2RlbCA9IHBpbi0+YW50ZW5uYU1vZGVsKGopOwotCi0gICAgIGlmIChhTW9kZWwtPmhhc0FudGVubmFHYXRlQXJlYSgpKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBhTW9kZWwtPm51bUFudGVubmFHYXRlQXJlYSgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiUElOICVzICVzIEFOVEdBVEVBUkVBICVnIiwgcGluLT5uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgYU1vZGVsLT5hbnRlbm5hT3hpZGUoKSwKLSAgICAgICAgICAgICAgICAgICBjaGtOdW0oYU1vZGVsLT5hbnRlbm5hR2F0ZUFyZWEoaSkpKTsKLSAgICAgICAgICAgaWYgKGFNb2RlbC0+YW50ZW5uYUdhdGVBcmVhTGF5ZXIoaSkpCi0gICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBMQVlFUiAlcyAiLAotICAgICAgICAgICAgICAgICAgICAgIGFNb2RlbC0+YW50ZW5uYUdhdGVBcmVhTGF5ZXIoaSkpOwotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICB9Ci0gICAgIH0KLSAgICAgaWYgKGFNb2RlbC0+aGFzQW50ZW5uYU1heEFyZWFDYXIoKSkgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYU1vZGVsLT5udW1BbnRlbm5hTWF4QXJlYUNhcigpOwotICAgICAgICAgICAgIGkrKykgewotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJQSU4gJXMgJXMgQU5UTUFYQVJFQUNBUiAlZyIsIHBpbi0+bmFtZSgpLAotICAgICAgICAgICAgICAgICAgIGFNb2RlbC0+YW50ZW5uYU94aWRlKCksCi0gICAgICAgICAgICAgICAgICAgY2hrTnVtKGFNb2RlbC0+YW50ZW5uYU1heEFyZWFDYXIoaSkpKTsKLSAgICAgICAgICAgaWYgKGFNb2RlbC0+YW50ZW5uYU1heEFyZWFDYXJMYXllcihpKSkKLSAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIExBWUVSICVzICIsCi0gICAgICAgICAgICAgICAgICAgICAgYU1vZGVsLT5hbnRlbm5hTWF4QXJlYUNhckxheWVyKGkpKTsKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgfQotICAgICB9Ci0gICAgIGlmIChhTW9kZWwtPmhhc0FudGVubmFNYXhTaWRlQXJlYUNhcigpKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBhTW9kZWwtPm51bUFudGVubmFNYXhTaWRlQXJlYUNhcigpOwotICAgICAgICAgICAgIGkrKykgewotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJQSU4gJXMgJXMgQU5UTUFYQVJFQUNBUiAlZyIsIHBpbi0+bmFtZSgpLAotICAgICAgICAgICAgICAgICBhTW9kZWwtPmFudGVubmFPeGlkZSgpLAotICAgICAgICAgICAgICAgICBjaGtOdW0oYU1vZGVsLT5hbnRlbm5hTWF4U2lkZUFyZWFDYXIoaSkpKTsKLSAgICAgICAgICAgaWYgKGFNb2RlbC0+YW50ZW5uYU1heFNpZGVBcmVhQ2FyTGF5ZXIoaSkpCi0gICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBMQVlFUiAlcyAiLAotICAgICAgICAgICAgICAgICAgICBhTW9kZWwtPmFudGVubmFNYXhTaWRlQXJlYUNhckxheWVyKGkpKTsKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgfQotICAgICB9Ci0gICAgIGlmIChhTW9kZWwtPmhhc0FudGVubmFNYXhDdXRDYXIoKSkgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYU1vZGVsLT5udW1BbnRlbm5hTWF4Q3V0Q2FyKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJQSU4gJXMgJXMgQU5UTUFYQ1VUQ0FSICVnIiwgcGluLT5uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgYU1vZGVsLT5hbnRlbm5hT3hpZGUoKSwKLSAgICAgICAgICAgICAgICAgICBjaGtOdW0oYU1vZGVsLT5hbnRlbm5hTWF4Q3V0Q2FyKGkpKSk7Ci0gICAgICAgICAgIGlmIChhTW9kZWwtPmFudGVubmFNYXhDdXRDYXJMYXllcihpKSkKLSAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIExBWUVSICVzICIsCi0gICAgICAgICAgICAgICAgICAgICAgYU1vZGVsLT5hbnRlbm5hTWF4Q3V0Q2FyTGF5ZXIoaSkpOwotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICB9Ci0gICAgIH0KLSAgfQotCi0gIGlmIChwaW4tPm51bVByb3BlcnRpZXMoKSA+IDApIHsKLSAgICAgZm9yIChpID0gMDsgaSA8IHBpbi0+bnVtUHJvcGVydGllcygpOyBpKyspIHsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiUElOICVzIFBST1AgIiwgcGluLT5uYW1lKCkpOwotICAgICAgICAvLyB2YWx1ZSBjYW4gZWl0aGVyIGJlIGEgc3RyaW5nIG9yIG51bWJlcgotICAgICAgICBpZiAocGluLT5wcm9wVmFsdWUoaSkpIHsKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgJXNcbiIsIHBpbi0+cHJvcE5hbWUoaSksIHBpbi0+cHJvcFZhbHVlKGkpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzICVnXG4iLCBwaW4tPnByb3BOYW1lKGkpLCBjaGtOdW0ocGluLT5wcm9wTnVtKGkpKSk7Ci0gICAgIH0KLSAgfQotICAKLSAgbnVtUG9ydHMgPSBwaW4tPm51bVBvcnRzKCk7Ci0KLSAgY2hhciBwaW5OYW1lWzEwMjRdOwotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1Qb3J0czsgaSsrKSB7Ci0gICAgIHNwcmludGYocGluTmFtZSwgIlBJTiAlcyBQT1JUIiwgcGluLT5uYW1lKCkpOwotICAgICBnZW9tZXRyeSA9IHBpbi0+cG9ydChpKTsKLSAgICAgcHJ0R2VvbWV0cnkoZ2VvbWV0cnksIHBpbk5hbWUpOwotICB9Ci0gIHJldHVybiAwOyAgCi19Ci0KLWludCBkZW5zaXR5Q0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGxlZmlEZW5zaXR5KiBkZW5zaXR5LAotICAgICAgICAgICAgICAgICAgbGVmaVVzZXJEYXRhIHVkKSB7Ci0gIHN0cnVjdCBsZWZpR2VvbVJlY3QgcmVjdDsKLQotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVuc2l0eS0+bnVtTGF5ZXIoKTsgaSsrKSB7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBkZW5zaXR5LT5udW1SZWN0cyhpKTsgaisrKSB7Ci0gICAgICByZWN0ID0gZGVuc2l0eS0+Z2V0UmVjdChpLGopOwotICAgICAgZnByaW50Zihmb3V0LCAiREVOU0lUWSBMQVlFUiAlcyBSRUNUICVnICVnICVnICVnICVnXG4iLAotICAgICAgICAgICAgICBkZW5zaXR5LT5sYXllck5hbWUoaSksIHJlY3QueGwsIHJlY3QueWwsIHJlY3QueGgsIHJlY3QueWgsCi0gICAgICAgICAgICAgIGRlbnNpdHktPmRlbnNpdHlWYWx1ZShpLGopKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIFByb3BlcnR5IGRlZmluaXRpb24KLWludCBwcm9wRGVmQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGxlZmlQcm9wKiBwcm9wLCBsZWZpVXNlckRhdGEgdWQpIHsKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBmcHJpbnRmKGZvdXQsICJQUk9QREVGICVzICVzIiwKLSAgICAgICAgICBwcm9wLT5wcm9wVHlwZSgpLCBwcm9wLT5wcm9wTmFtZSgpKTsKLSAgaWYgKHByb3AtPmhhc1JhbmdlKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiBSQU5HRSAlZyAlZyIsIGNoa051bShwcm9wLT5sZWZ0KCkpLCBjaGtOdW0ocHJvcC0+cmlnaHQoKSkpOwotICBpZiAocHJvcC0+aGFzTnVtYmVyKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiBOVU1CRVIgJWciLCBjaGtOdW0ocHJvcC0+bnVtYmVyKCkpKTsKLSAgc3dpdGNoIChwcm9wLT5kYXRhVHlwZSgpKSB7Ci0gICAgICBjYXNlICdJJzoKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIFRZUEUgSSIpOwotICAgICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ1InOgotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgVFlQRSBSIik7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnUyc6Ci0gICAgICAgICAgIGZwcmludGYoZm91dCwgIiBUWVBFIFMiKTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdRJzoKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIFRZUEUgUSIpOwotICAgICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ04nOgotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgVFlQRSBOIik7Ci0gICAgICAgICAgIGJyZWFrOwotICB9Ci0gIGZwcmludGYoZm91dCwgIlxuIik7Ci0gIHJldHVybiAwOwotfQotCi0vLyBTaXRlCi1pbnQgc2l0ZUNCKGxlZnJDYWxsYmFja1R5cGVfZSBjLCBsZWZpU2l0ZSogc2l0ZSwgbGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGludCBoYXNQcnRTeW0gPSAwOwotICBpbnQgaTsKLQotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGZwcmludGYoZm91dCwgIlNJVEUgJXMiLCBzaXRlLT5uYW1lKCkpOwotICBpZiAoc2l0ZS0+aGFzQ2xhc3MoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiIENMQVNTICVzIiwgc2l0ZS0+c2l0ZUNsYXNzKCkpOwotICBpZiAoc2l0ZS0+aGFzWFN5bW1ldHJ5KCkpIHsKLSAgICAgZnByaW50Zihmb3V0LCAiIFNZTU1FVFJZIFggIik7Ci0gICAgIGhhc1BydFN5bSA9IDE7Ci0gIH0KLSAgaWYgKHNpdGUtPmhhc1lTeW1tZXRyeSgpKSB7Ci0gICAgIGlmIChoYXNQcnRTeW0pCi0gICAgICAgIGZwcmludGYoZm91dCwgIlkgIik7Ci0gICAgIGVsc2UgewotICAgICAgICBmcHJpbnRmKGZvdXQsICIgU1lNTUVUUlkgWSAiKTsKLSAgICAgICAgaGFzUHJ0U3ltID0gMTsKLSAgICAgfQotICB9Ci0gIGlmIChzaXRlLT5oYXM5MFN5bW1ldHJ5KCkpIHsKLSAgICAgaWYgKGhhc1BydFN5bSkKLSAgICAgICAgZnByaW50Zihmb3V0LCAiUjkwICIpOwotICAgICBlbHNlIHsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiIFNZTU1FVFJZIFI5MCAiKTsKLSAgICAgICAgaGFzUHJ0U3ltID0gMTsKLSAgICAgfQotICB9Ci0gIGlmIChzaXRlLT5oYXNTaXplKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiBTSVpFICVnIEJZICVnIiwgY2hrTnVtKHNpdGUtPnNpemVYKCkpLAotICAgICAgICAgICAgIGNoa051bShzaXRlLT5zaXplWSgpKSk7Ci0gIGZwcmludGYoZm91dCwgIlxuIik7Ci0gIGlmIChzaXRlLT5oYXNSb3dQYXR0ZXJuKCkpIHsgICAgLy8gNS42LCBhIGxpbmUgZm9yIGVhIHJvd3BhdHRlcm4gZm9yIHNvcnRpbmcKLSAgICAgZm9yIChpID0gMDsgaSA8IHNpdGUtPm51bVNpdGVzKCk7IGkrKykKLSAgICAgICAgZnByaW50Zihmb3V0LCAiU0lURSAlcyBST1dQQVRURVJOICVzICVzXG4iLCBzaXRlLT5uYW1lKCksCi0gICAgICAgICAgICAgICAgc2l0ZS0+c2l0ZU5hbWUoaSksIHNpdGUtPnNpdGVPcmllbnRTdHIoaSkpOwotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIFNwYWNpbmcKLWludCBzcGFjaW5nQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGxlZmlTcGFjaW5nKiBzcGFjaW5nLCBsZWZpVXNlckRhdGEgdWQpIHsKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBsZWZTcGFjaW5nKHNwYWNpbmcsIChjaGFyKikiU1BBQ0lORyIpOwotICByZXR1cm4gMDsKLX0KLQotLy8gVGltaW5nCi1pbnQgdGltaW5nQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGxlZmlUaW1pbmcqIHRpbWluZywgbGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGludCBpOwotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGZvciAoaSA9IDA7IGkgPCB0aW1pbmctPm51bUZyb21QaW5zKCk7IGkrKykKLSAgICAgZnByaW50Zihmb3V0LCAiVElNSU5HIEZST01QSU4gJXNcbiIsIHRpbWluZy0+ZnJvbVBpbihpKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCB0aW1pbmctPm51bVRvUGlucygpOyBpKyspCi0gICAgIGZwcmludGYoZm91dCwgIlRJTUlORyBUT1BJTiAlc1xuIiwgdGltaW5nLT50b1BpbihpKSk7Ci0gICAgIGZwcmludGYoZm91dCwgIlRJTUlORyBSSVNFIFNMRVcxICVnICVnICVnICVnXG4iLAotICAgICAgICAgICAgIGNoa051bSh0aW1pbmctPnJpc2VTbGV3T25lKCkpLCBjaGtOdW0odGltaW5nLT5yaXNlU2xld1R3bygpKSwKLSAgICAgICAgICAgICBjaGtOdW0odGltaW5nLT5yaXNlU2xld1RocmVlKCkpLCBjaGtOdW0odGltaW5nLT5yaXNlU2xld0ZvdXIoKSkpOwotICBpZiAodGltaW5nLT5oYXNSaXNlU2xldzIoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiVElNSU5HIFJJU0UgU0xFVzIgJWcgJWcgJWdcbiIsCi0gICAgICAgICAgICAgY2hrTnVtKHRpbWluZy0+cmlzZVNsZXdGaXZlKCkpLCBjaGtOdW0odGltaW5nLT5yaXNlU2xld1NpeCgpKSwKLSAgICAgICAgICAgICBjaGtOdW0odGltaW5nLT5yaXNlU2xld1NldmVuKCkpKTsKLSAgaWYgKHRpbWluZy0+aGFzRmFsbFNsZXcoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiVElNSU5HIEZBTEwgU0xFVzEgJWcgJWcgJWcgJWdcbiIsCi0gICAgICAgICAgICAgY2hrTnVtKHRpbWluZy0+ZmFsbFNsZXdPbmUoKSksIGNoa051bSh0aW1pbmctPmZhbGxTbGV3VHdvKCkpLAotICAgICAgICAgICAgIGNoa051bSh0aW1pbmctPmZhbGxTbGV3VGhyZWUoKSksIGNoa051bSh0aW1pbmctPmZhbGxTbGV3Rm91cigpKSk7Ci0gIGlmICh0aW1pbmctPmhhc0ZhbGxTbGV3MigpKQotICAgICBmcHJpbnRmKGZvdXQsICJUSU1JTkcgRkFMTCBTTEVXMiAlZyAlZyAlZ1xuIiwKLSAgICAgICAgICAgICBjaGtOdW0odGltaW5nLT5mYWxsU2xld0ZpdmUoKSksIGNoa051bSh0aW1pbmctPmZhbGxTbGV3U2l4KCkpLAotICAgICAgICAgICAgIGNoa051bSh0aW1pbmctPnJpc2VTbGV3U2V2ZW4oKSkpOwotICBpZiAodGltaW5nLT5oYXNSaXNlSW50cmluc2ljKCkpIHsKLSAgICAgZnByaW50Zihmb3V0LCAiVElNSU5HIFJJU0UgSU5UUklOU0lDICVnICVnXG4iLAotICAgICAgICAgICAgIGNoa051bSh0aW1pbmctPnJpc2VJbnRyaW5zaWNPbmUoKSksCi0gICAgICAgICAgICAgY2hrTnVtKHRpbWluZy0+cmlzZUludHJpbnNpY1R3bygpKSk7Ci0gICAgIGZwcmludGYoZm91dCwgIlRJTUlORyBSSVNFIFZBUklBQkxFICVnICVnXG4iLAotICAgICAgICAgICAgIGNoa051bSh0aW1pbmctPnJpc2VJbnRyaW5zaWNUaHJlZSgpKSwKLSAgICAgICAgICAgICBjaGtOdW0odGltaW5nLT5yaXNlSW50cmluc2ljRm91cigpKSk7Ci0gIH0KLSAgaWYgKHRpbWluZy0+aGFzRmFsbEludHJpbnNpYygpKSB7Ci0gICAgIGZwcmludGYoZm91dCwgIlRJTUlORyBGQUxMIElOVFJJTlNJQyAlZyAlZ1xuIiwKLSAgICAgICAgICAgICBjaGtOdW0odGltaW5nLT5mYWxsSW50cmluc2ljT25lKCkpLAotICAgICAgICAgICAgIGNoa051bSh0aW1pbmctPmZhbGxJbnRyaW5zaWNUd28oKSkpOwotICAgICBmcHJpbnRmKGZvdXQsICJUSU1JTkcgUklTRSBWQVJJQUJMRSAlZyAlZ1xuIiwKLSAgICAgICAgICAgICBjaGtOdW0odGltaW5nLT5mYWxsSW50cmluc2ljVGhyZWUoKSksCi0gICAgICAgICAgICAgY2hrTnVtKHRpbWluZy0+ZmFsbEludHJpbnNpY0ZvdXIoKSkpOwotICB9Ci0gIGlmICh0aW1pbmctPmhhc1Jpc2VSUygpKQotICAgICBmcHJpbnRmKGZvdXQsICJUSU1JTkcgUklTRVJTICVnICVnXG4iLAotICAgICAgICAgICAgIGNoa051bSh0aW1pbmctPnJpc2VSU09uZSgpKSwgY2hrTnVtKHRpbWluZy0+cmlzZVJTVHdvKCkpKTsKLSAgICAgaWYgKHRpbWluZy0+aGFzUmlzZUNTKCkpCi0gICAgIGZwcmludGYoZm91dCwgIlRJTUlORyBSSVNFQ1MgJWcgJWdcbiIsCi0gICAgICAgICAgICAgY2hrTnVtKHRpbWluZy0+cmlzZUNTT25lKCkpLCBjaGtOdW0odGltaW5nLT5yaXNlQ1NUd28oKSkpOwotICBpZiAodGltaW5nLT5oYXNGYWxsUlMoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiVElNSU5HIEZBTExSUyAlZyAlZ1xuIiwKLSAgICAgICAgICAgICBjaGtOdW0odGltaW5nLT5mYWxsUlNPbmUoKSksIGNoa051bSh0aW1pbmctPmZhbGxSU1R3bygpKSk7Ci0gIGlmICh0aW1pbmctPmhhc0ZhbGxDUygpKQotICAgICBmcHJpbnRmKGZvdXQsICJUSU1JTkcgRkFMTENTICVnICVnXG4iLAotICAgICAgICAgICAgIGNoa051bSh0aW1pbmctPmZhbGxDU09uZSgpKSwgY2hrTnVtKHRpbWluZy0+ZmFsbENTVHdvKCkpKTsKLSAgaWYgKHRpbWluZy0+aGFzVW5hdGVuZXNzKCkpCi0gICAgIGZwcmludGYoZm91dCwgIlRJTUlORyBVTkFURU5FU1MgJXNcbiIsIHRpbWluZy0+dW5hdGVuZXNzKCkpOwotICBpZiAodGltaW5nLT5oYXNSaXNlQXR0MSgpKQotICAgICBmcHJpbnRmKGZvdXQsICJUSU1JTkcgUklTRVNBVFQxICVnICVnXG4iLCBjaGtOdW0odGltaW5nLT5yaXNlQXR0MU9uZSgpKSwKLSAgICAgICAgICAgICBjaGtOdW0odGltaW5nLT5yaXNlQXR0MVR3bygpKSk7Ci0gIGlmICh0aW1pbmctPmhhc0ZhbGxBdHQxKCkpCi0gICAgIGZwcmludGYoZm91dCwgIlRJTUlORyBGQUxMU0FUVDEgJWcgJWdcbiIsIGNoa051bSh0aW1pbmctPmZhbGxBdHQxT25lKCkpLAotICAgICAgICAgICAgIGNoa051bSh0aW1pbmctPmZhbGxBdHQxVHdvKCkpKTsKLSAgaWYgKHRpbWluZy0+aGFzUmlzZVRvKCkpCi0gICAgIGZwcmludGYoZm91dCwgIlRJTUlORyBSSVNFVDAgJWcgJWdcbiIsIGNoa051bSh0aW1pbmctPnJpc2VUb09uZSgpKSwKLSAgICAgICAgICAgICBjaGtOdW0odGltaW5nLT5yaXNlVG9Ud28oKSkpOwotICBpZiAodGltaW5nLT5oYXNGYWxsVG8oKSkKLSAgICAgZnByaW50Zihmb3V0LCAiVElNSU5HIEZBTExUMCAlZyAlZ1xuIiwgY2hrTnVtKHRpbWluZy0+ZmFsbFRvT25lKCkpLAotICAgICAgICAgICAgIGNoa051bSh0aW1pbmctPmZhbGxUb1R3bygpKSk7Ci0gIHJldHVybiAwOwotfQotCi0vLyBVbml0cwotaW50IHVuaXRzQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGxlZmlVbml0cyogdW5pdCwgbGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgaWYgKHVuaXQtPmhhc0RhdGFiYXNlKCkpCi0gICAgIGZwcmludGYoZm91dCwgIlVOSVRTIERBVEFCQVNFICVzICVnXG4iLCB1bml0LT5kYXRhYmFzZU5hbWUoKSwKLSAgICAgICAgICAgICBjaGtOdW0odW5pdC0+ZGF0YWJhc2VOdW1iZXIoKSkpOwotICBpZiAodW5pdC0+aGFzQ2FwYWNpdGFuY2UoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiVU5JVFMgQ0FQQUNJVEFOQ0UgUElDT0ZBUkFEUyAlZ1xuIiwKLSAgICAgICAgICAgICBjaGtOdW0odW5pdC0+Y2FwYWNpdGFuY2UoKSkpOwotICBpZiAodW5pdC0+aGFzUmVzaXN0YW5jZSgpKQotICAgICBmcHJpbnRmKGZvdXQsICJVTklUUyBSRVNJU1RBTkNFIE9ITVMgJWdcbiIsIGNoa051bSh1bml0LT5yZXNpc3RhbmNlKCkpKTsKLSAgaWYgKHVuaXQtPmhhc1Bvd2VyKCkpCi0gICAgIGZwcmludGYoZm91dCwgIlVOSVRTIFBPV0VSIE1JTExJV0FUVFMgJWdcbiIsIGNoa051bSh1bml0LT5wb3dlcigpKSk7Ci0gIGlmICh1bml0LT5oYXNDdXJyZW50KCkpCi0gICAgIGZwcmludGYoZm91dCwgIlVOSVRTIENVUlJFTlQgTUlMTElBTVBTICVnXG4iLCBjaGtOdW0odW5pdC0+Y3VycmVudCgpKSk7Ci0gIGlmICh1bml0LT5oYXNWb2x0YWdlKCkpCi0gICAgIGZwcmludGYoZm91dCwgIlVOSVRTIFZPTFRBR0UgVk9MVFMgJWdcbiIsIGNoa051bSh1bml0LT52b2x0YWdlKCkpKTsKLSAgaWYgKHVuaXQtPmhhc0ZyZXF1ZW5jeSgpKQotICAgICBmcHJpbnRmKGZvdXQsICJVTklUUyBGUkVRVUVOQ1kgTUVHQUhFUlRaICVnXG4iLCBjaGtOdW0odW5pdC0+ZnJlcXVlbmN5KCkpKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIFVzZU1pblNwYWNpbmcKLWludCB1c2VNaW5TcGFjaW5nQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGxlZmlVc2VNaW5TcGFjaW5nKiBzcGFjaW5nLAotICAgICAgICAgICAgICAgICAgICBsZWZpVXNlckRhdGEgdWQpIHsKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBmcHJpbnRmKGZvdXQsICJVU0VNSU5TUEFDSU5HICVzICIsIHNwYWNpbmctPm5hbWUoKSk7Ci0gIGlmIChzcGFjaW5nLT52YWx1ZSgpKQotICAgICAgZnByaW50Zihmb3V0LCAiVVNFTUlOU1BBQ0lORyBPTlxuIik7Ci0gIGVsc2UKLSAgICAgIGZwcmludGYoZm91dCwgIlVTRU1JTlNQQUNJTkcgT0ZGXG4iKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIFZlcnNpb24KLWludCB2ZXJzaW9uQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGRvdWJsZSBudW0sIGxlZmlVc2VyRGF0YSB1ZCkgewotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGZwcmludGYoZm91dCwgIlZFUlNJT04gJWdcbiIsIG51bSk7Ci0gIHJldHVybiAwOwotfQotCi0vLyBWaWEKLWludCB2aWFDQihsZWZyQ2FsbGJhY2tUeXBlX2UgYywgbGVmaVZpYSogdmlhLCBsZWZpVXNlckRhdGEgdWQpIHsKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBsZWZWaWEodmlhLCAoY2hhciopIlZJQSIpOwotICByZXR1cm4gMDsKLX0KLQotLy8gVmlhcnVsZQotaW50IHZpYVJ1bGVDQihsZWZyQ2FsbGJhY2tUeXBlX2UgYywgbGVmaVZpYVJ1bGUqIHZpYVJ1bGUsIGxlZmlVc2VyRGF0YSB1ZCkgewotICBpbnQgICAgICAgICAgICAgICBudW1MYXllcnMsIG51bVZpYXMsIGk7Ci0gIGxlZmlWaWFSdWxlTGF5ZXIqIHZMYXllcjsKLQotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGZwcmludGYoZm91dCwgIlZJQVJVTEUgJXMiLCB2aWFSdWxlLT5uYW1lKCkpOwotICBpZiAodmlhUnVsZS0+aGFzR2VuZXJhdGUoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiIEdFTkVSQVRFIik7Ci0gIGlmICh2aWFSdWxlLT5oYXNEZWZhdWx0KCkpCi0gICAgIGZwcmludGYoZm91dCwgIiBERUZBVUxUIik7Ci0gIGZwcmludGYoZm91dCwgIlxuIik7Ci0KLSAgbnVtTGF5ZXJzID0gdmlhUnVsZS0+bnVtTGF5ZXJzKCk7Ci0gIC8vIGlmIG51bUxheWVycyA9PSAyLCBpdCBpcyBWSUFSVUxFIHdpdGhvdXQgR0VORVJBVEUgYW5kIGhhcyB2aWEgbmFtZQotICAvLyBpZiBudW1MYXllcnMgPT0gMywgaXQgaXMgVklBUlVMRSB3aXRoIEdFTkVSQVRFLCBhbmQgdGhlIDNyZCBsYXllciBpcyBjdXQKLSAgZm9yIChpID0gMDsgaSA8IG51bUxheWVyczsgaSsrKSB7Ci0gICAgIHZMYXllciA9IHZpYVJ1bGUtPmxheWVyKGkpOyAKLSAgICAgbGVmVmlhUnVsZUxheWVyKHZMYXllciwgdmlhUnVsZS0+bmFtZSgpKTsKLSAgfQotCi0gIGlmIChudW1MYXllcnMgPT0gMikgeyAgICAvLyBzaG91bGQgaGF2ZSB2aWFuYW1lcwotICAgICBudW1WaWFzID0gdmlhUnVsZS0+bnVtVmlhcygpOwotICAgICBpZiAobnVtVmlhcyA9PSAwKQotICAgICAgICBmcHJpbnRmKGZvdXQsICJTaG91bGQgaGF2ZSB2aWEgbmFtZXMgaW4gVklBUlVMRS5cbiIpOwotICAgICBlbHNlIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVZpYXM7IGkrKykKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiVklBUlVMRSAlcyAgVklBICVzIDtcbiIsIHZpYVJ1bGUtPm5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICB2aWFSdWxlLT52aWFOYW1lKGkpKTsKLSAgICAgfQotICB9Ci0gIGlmICh2aWFSdWxlLT5udW1Qcm9wcygpID4gMCkgewotICAgICBmb3IgKGkgPSAwOyBpIDwgdmlhUnVsZS0+bnVtUHJvcHMoKTsgaSsrKSB7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIlZJQVJVTEUgJXMgUFJPUCAlcyAiLCB2aWFSdWxlLT5uYW1lKCksCi0gICAgICAgICAgICAgICAgdmlhUnVsZS0+cHJvcE5hbWUoaSkpOwotICAgICAgICBpZiAodmlhUnVsZS0+cHJvcFZhbHVlKGkpKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAiLCB2aWFSdWxlLT5wcm9wVmFsdWUoaSkpOwotICAgICAgICBzd2l0Y2ggKHZpYVJ1bGUtPnByb3BUeXBlKGkpKSB7Ci0gICAgICAgICAgIGNhc2UgJ1InOiBmcHJpbnRmKGZvdXQsICJSRUFMICIpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIGNhc2UgJ0knOiBmcHJpbnRmKGZvdXQsICJJTlRFR0VSICIpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIGNhc2UgJ1MnOiBmcHJpbnRmKGZvdXQsICJTVFJJTkcgIik7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgY2FzZSAnUSc6IGZwcmludGYoZm91dCwgIlFVT1RFU1RSSU5HICIpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIGNhc2UgJ04nOiBmcHJpbnRmKGZvdXQsICJOVU1CRVIgIik7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgfQotICAgICB9Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8vPT09PT09PT0KLSAKLWludCBkaWZmTGVmUmVhZEZpbGUoY2hhciogaW5GaWxlLCBjaGFyKiBvdXRGaWxlKSB7Ci0gIEZJTEUqIGY7Ci0gIGludCAgIHJlczsKLSAKLSAgdXNlckRhdGEgPSAodm9pZCopMHgwMTAyMDMwNDsKLSAgbGVmckluaXQoKTsKLQotICAvLyBGaXggb2YgQ0NSIDc1ODMxMgotICBsZWZyU2V0UmVsYXhNb2RlKCk7Ci0KLSAgbGVmclNldEFudGVubmFJbnB1dENiayhhbnRlbm5hQ0IpOwotICBsZWZyU2V0QW50ZW5uYUlub3V0Q2JrKGFudGVubmFDQik7Ci0gIGxlZnJTZXRBbnRlbm5hT3V0cHV0Q2JrKGFudGVubmFDQik7Ci0gIGxlZnJTZXRBcnJheUNiayhhcnJheUNCKTsKLSAgbGVmclNldEJ1c0JpdENoYXJzQ2JrKGJ1c0JpdENoYXJzQ0IpOwotICBsZWZyU2V0Q2FzZVNlbnNpdGl2ZUNiayhjYXNlU2Vuc0NCKTsKLSAgbGVmclNldEZpeGVkTWFza0NiayhmaXhlZE1hc2tDQik7Ci0gIGxlZnJTZXRDbGVhcmFuY2VNZWFzdXJlQ2JrKGNsZWFyYW5jZUNCKTsKLSAgbGVmclNldENvcnJlY3Rpb25UYWJsZUNiayhjb3JyZWN0VGFibGVDQik7Ci0gIGxlZnJTZXREZW5zaXR5Q2JrKGRlbnNpdHlDQik7Ci0gIGxlZnJTZXREaWVsZWN0cmljQ2JrKGRpZWxlY3RyaWNDQik7Ci0gIGxlZnJTZXREaXZpZGVyQ2hhckNiayhkaXZpZGVyQ0IpOwotICBsZWZyU2V0RWRnZVJhdGVTY2FsZUZhY3RvckNiayhlZGdlUmF0ZUNCKTsKLSAgbGVmclNldEVkZ2VSYXRlVGhyZXNob2xkMUNiayhlZGdlUmF0ZTFDQik7Ci0gIGxlZnJTZXRFZGdlUmF0ZVRocmVzaG9sZDJDYmsoZWRnZVJhdGUyQ0IpOwotICBsZWZyU2V0SW5wdXRBbnRlbm5hQ2JrKGlucHV0QW50Q0IpOwotICBsZWZyU2V0T3V0cHV0QW50ZW5uYUNiayhvdXRwdXRBbnRDQik7Ci0gIGxlZnJTZXRJbm91dEFudGVubmFDYmsoaW5vdXRBbnRDQik7Ci0gIGxlZnJTZXRJUkRyb3BDYmsoaXJkcm9wQ0IpOwotICBsZWZyU2V0TGF5ZXJDYmsobGF5ZXJDQik7Ci0gIGxlZnJTZXRNYWNyb0NiayhtYWNyb0NCKTsKLSAgbGVmclNldE1hbnVmYWN0dXJpbmdDYmsobWFudWZhY3R1cmluZ0NCKTsKLSAgbGVmclNldE1heFN0YWNrVmlhQ2JrKG1heFN0YWNrVmlhQ0IpOwotICBsZWZyU2V0TWluRmVhdHVyZUNiayhtaW5GZWF0dXJlQ0IpOwotICBsZWZyU2V0Tm9pc2VNYXJnaW5DYmsobm9pc2VNYXJnaW5DQik7Ci0gIGxlZnJTZXROb2lzZVRhYmxlQ2JrKG5vaXNlVGFibGVDQik7Ci0gIGxlZnJTZXROb25EZWZhdWx0Q2JrKG5vbkRlZmF1bHRDQik7Ci0gIGxlZnJTZXROb1dpcmVFeHRlbnNpb25DYmsobm9XaXJlRXh0Q0IpOwotICBsZWZyU2V0T2JzdHJ1Y3Rpb25DYmsob2JzdHJ1Y3Rpb25DQik7Ci0gIGxlZnJTZXRQaW5DYmsocGluQ0IpOwotICBsZWZyU2V0UHJvcENiayhwcm9wRGVmQ0IpOwotICBsZWZyU2V0U2l0ZUNiayhzaXRlQ0IpOwotICBsZWZyU2V0U3BhY2luZ0NiayhzcGFjaW5nQ0IpOwotICBsZWZyU2V0VGltaW5nQ2JrKHRpbWluZ0NCKTsKLSAgbGVmclNldFVuaXRzQ2JrKHVuaXRzQ0IpOwotICBsZWZyU2V0VXNlTWluU3BhY2luZ0Niayh1c2VNaW5TcGFjaW5nQ0IpOwotICBsZWZyU2V0VXNlckRhdGEoKHZvaWQqKTMpOwotICBsZWZyU2V0VmVyc2lvbkNiayh2ZXJzaW9uQ0IpOwotICBsZWZyU2V0VmlhQ2JrKHZpYUNCKTsKLSAgbGVmclNldFZpYVJ1bGVDYmsodmlhUnVsZUNCKTsKLQotICBpZiAoKGYgPSBmb3BlbihpbkZpbGUsInIiKSkgPT0gMCkgewotICAgIGZwcmludGYoc3RkZXJyLCJDb3VsZG4ndCBvcGVuIGlucHV0IGZpbGUgJyVzJ1xuIiwgaW5GaWxlKTsKLSAgICByZXR1cm4oMik7Ci0gIH0KLQotICBpZiAoKGZvdXQgPSBmb3BlbihvdXRGaWxlLCJ3IikpID09IDApIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwiQ291bGRuJ3Qgb3BlbiBvdXRwdXQgZmlsZSAnJXMnXG4iLCBvdXRGaWxlKTsKLSAgICBmY2xvc2UoZik7Ci0gICAgcmV0dXJuKDIpOwotICB9Ci0KLSAgcmVzID0gbGVmclJlYWQoZiwgaW5GaWxlLCB1c2VyRGF0YSk7Ci0KLSAgZmNsb3NlKGYpOwotICBmY2xvc2UoZm91dCk7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmZGlmZi9kaWZmTGVmUlcuaHBwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZmRpZmYvZGlmZkxlZlJXLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhYjBjOC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmZGlmZi9kaWZmTGVmUlcuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxMiwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yJAotLy8gICRSZXZpc2lvbiQKLS8vICAkRGF0ZSQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2lmbmRlZiBESUZGREVGUldfSAotI2RlZmluZSBESUZGREVGUldfSAotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotaW50IGRpZmZMZWZSZWFkRmlsZShjaGFyKiBpbkZpbGUsIGNoYXIqIG91dEZpbGUpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWZkaWZmL2RpZmZlckxlZi5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmZGlmZi9kaWZmZXJMZWYuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWVkMmFkLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWZkaWZmL2RpZmZlckxlZi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyIC0gMjAxNiwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yJAotLy8gICRSZXZpc2lvbiQKLS8vICAkRGF0ZSQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAKLS8vIFRoaXMgcHJvZ3JhbSB3aWxsIGRpZmYgdHdvIGxlZiBmaWxlcyBvciB0d28gZGVmIGZpbGVzIGFuZCBsaXN0IHRoZQotLy8gZGlmZmVyZW50IGJldHdlZW4gdGhlIHR3byBmaWxlcy4gIFRoaXMgcHJvYmxlbSBpcyBub3QgaW50ZW5kIHRvCi0vLyBkaWZmIGEgcmVhbCBkZXNpZ24uICBJZiB1c2VyIHJ1bnMgdGhpcyBwcm9ncmFtIHdpbGwgYSBiaWcgZGVzaWduLAotLy8gdGhleSBtYXkgZXhwZXJpZW5jZSBsb25nIGV4ZWN1dGlvbiB0aW1lIGFuZCBtYXkgZXZlbiByYW4gb3V0IG9mCi0vLyBtZW1vcnkuCi0vLwotLy8gVGhpcyBwcm9ncmFtIGlzIHRvIGdpdmUgdXNlciBhIGZlZWwgb2Ygd2hldGhlciB0aGV5IGFyZSB1c2luZyB0aGUKLS8vIHBhcnNlciBjb3JyZWN0bHkuICBBZnRlciB0aGV5IHJlYWQgdGhlIGxlZi9kZWYgZmlsZSBpbiwgYW5kCi0vLyB3cml0ZSB0aGVtIGJhY2sgb3V0IGluIGxlZi9kZWYgZm9ybWF0LgotLy8KLS8vIFRoaXMgcHJvZ3JhbSBzdXBwb3J0IGxlZi9kZWYgNS42LgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpZmRlZiBpYm1ycwotIyAgIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2lmbmRlZiBXSU4zMgotIyAgIGluY2x1ZGUgPHVuaXN0ZC5oPgotZXh0ZXJuIGNoYXIgVmVyc2lvbklkZW50W107Ci0jZWxzZQotY2hhciogVmVyc2lvbklkZW50ID0gIk4vQSI7Ci0jZW5kaWYgLyogbm90IFdJTjMyICovCi0jaW5jbHVkZSAibGVmclJlYWRlci5ocHAiCi0jaW5jbHVkZSAiZGlmZkxlZlJXLmhwcCIKLQotY2hhciAqIGV4ZU5hbWU7ICAgIC8vIHVzZSB0byBzYXZlIHRoZSBleGVjdXRhYmxlIG5hbWUKLQotLy8gVGhpcyBwcm9ncmFtIHJlcXVpcmVzIDIgaW5wdXRzLCBmaWxlTmFtZTEgYW5kIGZpbGVOYW1lMgotdm9pZCBkaWZmVXNhZ2UoKSB7Ci0gICBwcmludGYoIlVzYWdlOiBsZWZkZWZkaWZmIC1sZWZ8LWRlZiBmaWxlTmFtZTEgZmlsZU5hbWUyIFstbyBvdXRwdXRGaWxlTmFtZV1cbiIpOwotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgY2hhciAqZmlsZU5hbWUxLCAqZmlsZU5hbWUyOyAgIC8vIEZvciB0aGUgZmlsZW5hbWVzIHRvIGNvbXBhcmUKLSAgY2hhciAqbGVmT3V0MSwgKmxlZk91dDI7ICAgICAgIC8vIEZvciB0aGUgdG1wIG91dHB1dCBmaWxlcwotCi0jaWZkZWYgV0lOMzIKLSAgICAvLyBFbmFibGUgdHdvLWRpZ2l0IGV4cG9uZW50IGZvcm1hdAotICAgIF9zZXRfb3V0cHV0X2Zvcm1hdChfVFdPX0RJR0lUX0VYUE9ORU5UKTsKLSNlbmRpZgotCi0gIGV4ZU5hbWUgPSBhcmd2WzBdOwotICAKLSAgaWYgKGFyZ2MgIT0gNSkgeyAgICAgICAgICAgICAgIC8vIElmIHBhc3MgaW4gZnJvbSBsZWZkZWZkaWZmLCBhcmdjIGlzCi0gICAgICBkaWZmVXNhZ2UoKTsgICAgICAgICAgICAgICAvLyBhbHdheXMgNQotICAgICAgcmV0dXJuKDEpOwotICB9Ci0KLSAgZmlsZU5hbWUxID0gYXJndlsxXTsKLSAgZmlsZU5hbWUyID0gYXJndlsyXTsKLQotICAvLyBUaGVzZSBhcmUgdGVtcG9yYXJ5IGZpbGVzIHRvIGhvbGQgdGhlIGxlZiBkYXRhIGFzIHRoZXkgYXJlIHJlYWQgaW4sCi0gIC8vIGxhdGVyIHRoZXNlIGZpbGVzIHdpbGwgYmUgc29ydGVkIGZvciBjb21wYXJpc29uLgotICBsZWZPdXQxID0gYXJndlszXTsKLSAgbGVmT3V0MiA9IGFyZ3ZbNF07Ci0KLSAgLy8ganVzdCByZWFkIGluIHRoZSAxc3QgZmlsZSB0byBtZW1vcnkKLSAgcHJpbnRmKCJSZWFkaW5nIGZpbGU6ICVzXG4iLCBmaWxlTmFtZTEpOwotICBpZiAoZGlmZkxlZlJlYWRGaWxlKGZpbGVOYW1lMSwgbGVmT3V0MSkgIT0gMCkKLSAgICAgIHJldHVybigxKTsKLSAgLy8gcmVhZCBhbmQgY29tcGFyZSB3aXRoIHRoZSAxc3QgZmlsZSBpbiBtZW1vcnkKLSAgcHJpbnRmKCJSZWFkaW5nIGZpbGU6ICVzXG4iLCBmaWxlTmFtZTIpOwotICBpZiAoZGlmZkxlZlJlYWRGaWxlKGZpbGVOYW1lMiwgbGVmT3V0MikgIT0gMCkKLSAgICAgIHJldHVybigxKTsKLQotICByZXR1cm4gKDApOwotfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZnJ3L2xlZnJ3LmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWZydy9sZWZydy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYjQ2MTguLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZnJ3L2xlZnJ3LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI2NTYgKzAsMCBAQAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb3B5cmlnaHQgMjAxNCAtIDIwMTcsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvciQKLS8vICAkUmV2aXNpb24kCi0vLyAgJERhdGUkCi0vLyAgJFN0YXRlOiAgJAotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSNpZmRlZiBXSU4zMgotI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlIDogNDc4NikKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2lmbmRlZiBXSU4zMgotIyAgIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2Vsc2UKLSMgICBpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jZW5kaWYgLyogbm90IFdJTjMyICovCi0jaW5jbHVkZSAibGVmclJlYWRlci5ocHAiCi0jaW5jbHVkZSAibGVmd1dyaXRlci5ocHAiCi0jaW5jbHVkZSAibGVmaURlYnVnLmhwcCIKLSNpbmNsdWRlICJsZWZpRW5jcnlwdEludC5ocHAiCi0jaW5jbHVkZSAibGVmaVV0aWwuaHBwIgotCi1jaGFyIGRlZmF1bHROYW1lWzEyOF07Ci1jaGFyIGRlZmF1bHRPdXRbMTI4XTsKLUZJTEUqIGZvdXQ7Ci1pbnQgcHJpbnRpbmcgPSAwOyAgICAgLy8gUHJpbnRpbmcgdGhlIG91dHB1dC4KLWludCBwYXJzZTY1bm0gPSAwOwotaW50IHBhcnNlTGVmNThUeXBlID0gMDsKLWludCBpc1Nlc3Npb25sZXMgPSAwOwotCi0vLyBUWF9ESVI6VFJBTlNMQVRJT04gT04KLSAKLXZvaWQgZGF0YUVycm9yKCkgewotICBmcHJpbnRmKGZvdXQsICJFUlJPUjogcmV0dXJuZWQgdXNlciBkYXRhIGlzIG5vdCBjb3JyZWN0IVxuIik7Ci19Ci0gCi0KLXZvaWQgY2hlY2tUeXBlKGxlZnJDYWxsYmFja1R5cGVfZSBjKSB7Ci0gIGlmIChjID49IDAgJiYgYyA8PSBsZWZyTGlicmFyeUVuZENia1R5cGUpIHsKLSAgICAvLyBPSwotICB9IGVsc2UgewotICAgIGZwcmludGYoZm91dCwgIkVSUk9SOiBjYWxsYmFjayB0eXBlIGlzIG91dCBvZiBib3VuZHMhXG4iKTsKLSAgfQotfQotCi0KLWNoYXIqIG9yaWVudFN0cihpbnQgb3JpZW50KSB7Ci0gIHN3aXRjaCAob3JpZW50KSB7Ci0gICAgICBjYXNlIDA6IHJldHVybiAoKGNoYXIqKSJOIik7Ci0gICAgICBjYXNlIDE6IHJldHVybiAoKGNoYXIqKSJXIik7Ci0gICAgICBjYXNlIDI6IHJldHVybiAoKGNoYXIqKSJTIik7Ci0gICAgICBjYXNlIDM6IHJldHVybiAoKGNoYXIqKSJFIik7Ci0gICAgICBjYXNlIDQ6IHJldHVybiAoKGNoYXIqKSJGTiIpOwotICAgICAgY2FzZSA1OiByZXR1cm4gKChjaGFyKikiRlciKTsKLSAgICAgIGNhc2UgNjogcmV0dXJuICgoY2hhciopIkZTIik7Ci0gICAgICBjYXNlIDc6IHJldHVybiAoKGNoYXIqKSJGRSIpOwotICB9OwotICByZXR1cm4gKChjaGFyKikiQk9HVVMiKTsKLX0KLQotdm9pZCBsZWZWaWEobGVmaVZpYSAqdmlhKSB7Ci0gICAgaW50IGksIGo7Ci0KLSAgICBsZWZyU2V0Q2FzZVNlbnNpdGl2aXR5KDEpOwotICAgIGZwcmludGYoZm91dCwgIlZJQSAlcyAiLCB2aWEtPmxlZmlWaWE6Om5hbWUoKSk7Ci0gICAgaWYgKHZpYS0+bGVmaVZpYTo6aGFzRGVmYXVsdCgpKQotICAgICAgICBmcHJpbnRmKGZvdXQsICJERUZBVUxUIik7Ci0gICAgZWxzZSBpZiAodmlhLT5sZWZpVmlhOjpoYXNHZW5lcmF0ZWQoKSkKLSAgICAgICAgZnByaW50Zihmb3V0LCAiR0VORVJBVEVEIik7Ci0gICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICBpZiAodmlhLT5sZWZpVmlhOjpoYXNUb3BPZlN0YWNrKCkpCi0gICAgICAgIGZwcmludGYoZm91dCwgIiAgVE9QT0ZTVEFDS09OTFlcbiIpOwotICAgIGlmICh2aWEtPmxlZmlWaWE6Omhhc0ZvcmVpZ24oKSkgewotICAgICAgICBmcHJpbnRmKGZvdXQsICIgIEZPUkVJR04gJXMgIiwgdmlhLT5sZWZpVmlhOjpmb3JlaWduKCkpOwotICAgICAgICBpZiAodmlhLT5sZWZpVmlhOjpoYXNGb3JlaWduUG50KCkpIHsKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiggJWcgJWcgKSAiLCB2aWEtPmxlZmlWaWE6OmZvcmVpZ25YKCksCi0gICAgICAgICAgICAgICAgICAgIHZpYS0+bGVmaVZpYTo6Zm9yZWlnblkoKSk7Ci0gICAgICAgICAgICBpZiAodmlhLT5sZWZpVmlhOjpoYXNGb3JlaWduT3JpZW50KCkpCi0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgb3JpZW50U3RyKHZpYS0+bGVmaVZpYTo6Zm9yZWlnbk9yaWVudCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0gICAgfQotICAgIGlmICh2aWEtPmxlZmlWaWE6Omhhc1Byb3BlcnRpZXMoKSkgewotICAgICAgICBmcHJpbnRmKGZvdXQsICIgIFBST1BFUlRZICIpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdmlhLT5sZWZpVmlhOjpudW1Qcm9wZXJ0aWVzKCk7IGkrKykgewotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgdmlhLT5sZWZpVmlhOjpwcm9wTmFtZShpKSk7Ci0gICAgICAgICAgICBpZiAodmlhLT5sZWZpVmlhOjpwcm9wSXNOdW1iZXIoaSkpCi0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJWcgIiwgdmlhLT5sZWZpVmlhOjpwcm9wTnVtYmVyKGkpKTsKLSAgICAgICAgICAgIGlmICh2aWEtPmxlZmlWaWE6OnByb3BJc1N0cmluZyhpKSkKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAiLCB2aWEtPmxlZmlWaWE6OnByb3BWYWx1ZShpKSk7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgaWYgKGkrMSA9PSB2aWEtPmxlZmlWaWE6Om51bVByb3BlcnRpZXMoKSkgIC8vIGVuZCBvZiBwcm9wZXJ0aWVzCi0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICI7XG4iKTsKLSAgICAgICAgICAgIGVsc2UgICAgICAvLyBqdXN0IGFkZCBuZXcgbGluZQotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBzd2l0Y2ggKHZpYS0+bGVmaVZpYTo6cHJvcFR5cGUoaSkpIHsKLSAgICAgICAgICAgIGNhc2UgJ1InOgotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlJFQUwgIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdJJzoKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJJTlRFR0VSICIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnUyc6Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiU1RSSU5HICIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnUSc6Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiUVVPVEVTVFJJTkcgIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdOJzoKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJOVU1CRVIgIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0gICAgfQotICAgIGlmICh2aWEtPmxlZmlWaWE6Omhhc1Jlc2lzdGFuY2UoKSkKLSAgICAgICAgZnByaW50Zihmb3V0LCAiICBSRVNJU1RBTkNFICVnIDtcbiIsIHZpYS0+bGVmaVZpYTo6cmVzaXN0YW5jZSgpKTsKLSAgICBpZiAodmlhLT5sZWZpVmlhOjpudW1MYXllcnMoKSA+IDApIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHZpYS0+bGVmaVZpYTo6bnVtTGF5ZXJzKCk7IGkrKykgewotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICBMQVlFUiAlc1xuIiwgdmlhLT5sZWZpVmlhOjpsYXllck5hbWUoaSkpOwotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHZpYS0+bGVmaVZpYTo6bnVtUmVjdHMoaSk7IGorKykKLSAgICAgICAgICAgICAgICBpZiAodmlhLT5sZWZpVmlhOjpyZWN0Q29sb3JNYXNrKGksIGopKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgICBSRUNUIE1BU0sgJWQgKCAlZiAlZiApICggJWYgJWYgKSA7XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpYS0+bGVmaVZpYTo6cmVjdENvbG9yTWFzayhpLCBqKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWEtPmxlZmlWaWE6OnhsKGksIGopLCB2aWEtPmxlZmlWaWE6OnlsKGksIGopLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpYS0+bGVmaVZpYTo6eGgoaSwgaiksIHZpYS0+bGVmaVZpYTo6eWgoaSwgaikpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgICBSRUNUICggJWYgJWYgKSAoICVmICVmICkgO1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWEtPmxlZmlWaWE6OnhsKGksIGopLCB2aWEtPmxlZmlWaWE6OnlsKGksIGopLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpYS0+bGVmaVZpYTo6eGgoaSwgaiksIHZpYS0+bGVmaVZpYTo6eWgoaSwgaikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB2aWEtPmxlZmlWaWE6Om51bVBvbHlnb25zKGkpOyBqKyspIHsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgbGVmaUdlb21Qb2x5Z29uIHBvbHk7Ci0gICAgICAgICAgICAgICAgcG9seSA9IHZpYS0+bGVmaVZpYTo6Z2V0UG9seWdvbihpLCBqKTsKLSAgICAgICAgICAgICAgICBpZiAodmlhLT5sZWZpVmlhOjpwb2x5Q29sb3JNYXNrKGksIGopKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgICBQT0xZR09OIE1BU0sgJWQiLCB2aWEtPmxlZmlWaWE6OnBvbHlDb2xvck1hc2soaSwgaikpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgICBQT0xZR09OICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHBvbHkubnVtUG9pbnRzOyBrKyspCi0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAlZyAlZyAiLCBwb2x5Lnhba10sIHBvbHkueVtrXSk7Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHZpYS0+bGVmaVZpYTo6aGFzVmlhUnVsZSgpKSB7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIiAgVklBUlVMRSAlcyA7XG4iLCB2aWEtPmxlZmlWaWE6OnZpYVJ1bGVOYW1lKCkpOwotICAgICAgICBmcHJpbnRmKGZvdXQsICIgICAgQ1VUU0laRSAlZyAlZyA7XG4iLCB2aWEtPmxlZmlWaWE6OnhDdXRTaXplKCksCi0gICAgICAgICAgICAgICAgdmlhLT5sZWZpVmlhOjp5Q3V0U2l6ZSgpKTsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiICAgIExBWUVSUyAlcyAlcyAlcyA7XG4iLCB2aWEtPmxlZmlWaWE6OmJvdE1ldGFsTGF5ZXIoKSwKLSAgICAgICAgICAgICAgICB2aWEtPmxlZmlWaWE6OmN1dExheWVyKCksIHZpYS0+bGVmaVZpYTo6dG9wTWV0YWxMYXllcigpKTsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiICAgIENVVFNQQUNJTkcgJWcgJWcgO1xuIiwgdmlhLT5sZWZpVmlhOjp4Q3V0U3BhY2luZygpLAotICAgICAgICAgICAgICAgIHZpYS0+bGVmaVZpYTo6eUN1dFNwYWNpbmcoKSk7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIiAgICBFTkNMT1NVUkUgJWcgJWcgJWcgJWcgO1xuIiwgdmlhLT5sZWZpVmlhOjp4Qm90RW5jKCksCi0gICAgICAgICAgICAgICAgdmlhLT5sZWZpVmlhOjp5Qm90RW5jKCksIHZpYS0+bGVmaVZpYTo6eFRvcEVuYygpLAotICAgICAgICAgICAgICAgIHZpYS0+bGVmaVZpYTo6eVRvcEVuYygpKTsKLSAgICAgICAgaWYgKHZpYS0+bGVmaVZpYTo6aGFzUm93Q29sKCkpCi0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICAgUk9XQ09MICVkICVkIDtcbiIsIHZpYS0+bGVmaVZpYTo6bnVtQ3V0Um93cygpLAotICAgICAgICAgICAgICAgICAgICB2aWEtPmxlZmlWaWE6Om51bUN1dENvbHMoKSk7Ci0gICAgICAgIGlmICh2aWEtPmxlZmlWaWE6Omhhc09yaWdpbigpKQotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICAgIE9SSUdJTiAlZyAlZyA7XG4iLCB2aWEtPmxlZmlWaWE6OnhPZmZzZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgdmlhLT5sZWZpVmlhOjp5T2Zmc2V0KCkpOwotICAgICAgICBpZiAodmlhLT5sZWZpVmlhOjpoYXNPZmZzZXQoKSkKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgICBPRkZTRVQgJWcgJWcgJWcgJWcgO1xuIiwgdmlhLT5sZWZpVmlhOjp4Qm90T2Zmc2V0KCksCi0gICAgICAgICAgICAgICAgICAgIHZpYS0+bGVmaVZpYTo6eUJvdE9mZnNldCgpLCB2aWEtPmxlZmlWaWE6OnhUb3BPZmZzZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgdmlhLT5sZWZpVmlhOjp5VG9wT2Zmc2V0KCkpOwotICAgICAgICBpZiAodmlhLT5sZWZpVmlhOjpoYXNDdXRQYXR0ZXJuKCkpCi0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICAgUEFUVEVSTiAlcyA7XG4iLCB2aWEtPmxlZmlWaWE6OmN1dFBhdHRlcm4oKSk7Ci0gICAgfQotICAgIGZwcmludGYoZm91dCwgIkVORCAlc1xuIiwgdmlhLT5sZWZpVmlhOjpuYW1lKCkpOwotCi0gICAgcmV0dXJuOwotfQotCi12b2lkIGxlZlNwYWNpbmcobGVmaVNwYWNpbmcqIHNwYWNpbmcpIHsKLSAgZnByaW50Zihmb3V0LCAiICBTQU1FTkVUICVzICVzICVnICIsIHNwYWNpbmctPmxlZmlTcGFjaW5nOjpuYW1lMSgpLAotICAgICAgICAgIHNwYWNpbmctPmxlZmlTcGFjaW5nOjpuYW1lMigpLCBzcGFjaW5nLT5sZWZpU3BhY2luZzo6ZGlzdGFuY2UoKSk7Ci0gIGlmIChzcGFjaW5nLT5sZWZpU3BhY2luZzo6aGFzU3RhY2soKSkKLSAgICAgZnByaW50Zihmb3V0LCAiU1RBQ0sgIik7Ci0gIGZwcmludGYoZm91dCwiO1xuIik7Ci0gIHJldHVybjsKLX0KLQotdm9pZCBsZWZWaWFSdWxlTGF5ZXIobGVmaVZpYVJ1bGVMYXllciogdkxheWVyKSB7Ci0gIGZwcmludGYoZm91dCwgIiAgTEFZRVIgJXMgO1xuIiwgdkxheWVyLT5sZWZpVmlhUnVsZUxheWVyOjpuYW1lKCkpOwotICBpZiAodkxheWVyLT5sZWZpVmlhUnVsZUxheWVyOjpoYXNEaXJlY3Rpb24oKSkgewotICAgICBpZiAodkxheWVyLT5sZWZpVmlhUnVsZUxheWVyOjppc0hvcml6b250YWwoKSkKLSAgICAgICAgZnByaW50Zihmb3V0LCAiICAgIERJUkVDVElPTiBIT1JJWk9OVEFMIDtcbiIpOwotICAgICBpZiAodkxheWVyLT5sZWZpVmlhUnVsZUxheWVyOjppc1ZlcnRpY2FsKCkpCi0gICAgICAgIGZwcmludGYoZm91dCwgIiAgICBESVJFQ1RJT04gVkVSVElDQUwgO1xuIik7Ci0gIH0KLSAgaWYgKHZMYXllci0+bGVmaVZpYVJ1bGVMYXllcjo6aGFzRW5jbG9zdXJlKCkpIHsKLSAgICAgZnByaW50Zihmb3V0LCAiICAgIEVOQ0xPU1VSRSAlZyAlZyA7XG4iLAotICAgICAgICAgICAgIHZMYXllci0+bGVmaVZpYVJ1bGVMYXllcjo6ZW5jbG9zdXJlT3ZlcmhhbmcxKCksCi0gICAgICAgICAgICAgdkxheWVyLT5sZWZpVmlhUnVsZUxheWVyOjplbmNsb3N1cmVPdmVyaGFuZzIoKSk7Ci0gIH0KLSAgaWYgKHZMYXllci0+bGVmaVZpYVJ1bGVMYXllcjo6aGFzV2lkdGgoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICAgIFdJRFRIICVnIFRPICVnIDtcbiIsCi0gICAgICAgICAgICAgdkxheWVyLT5sZWZpVmlhUnVsZUxheWVyOjp3aWR0aE1pbigpLAotICAgICAgICAgICAgIHZMYXllci0+bGVmaVZpYVJ1bGVMYXllcjo6d2lkdGhNYXgoKSk7Ci0gIGlmICh2TGF5ZXItPmxlZmlWaWFSdWxlTGF5ZXI6Omhhc1Jlc2lzdGFuY2UoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICAgIFJFU0lTVEFOQ0UgJWcgO1xuIiwKLSAgICAgICAgICAgICB2TGF5ZXItPmxlZmlWaWFSdWxlTGF5ZXI6OnJlc2lzdGFuY2UoKSk7Ci0gIGlmICh2TGF5ZXItPmxlZmlWaWFSdWxlTGF5ZXI6Omhhc092ZXJoYW5nKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgICBPVkVSSEFORyAlZyA7XG4iLAotICAgICAgICAgICAgIHZMYXllci0+bGVmaVZpYVJ1bGVMYXllcjo6b3ZlcmhhbmcoKSk7Ci0gIGlmICh2TGF5ZXItPmxlZmlWaWFSdWxlTGF5ZXI6Omhhc01ldGFsT3ZlcmhhbmcoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICAgIE1FVEFMT1ZFUkhBTkcgJWcgO1xuIiwKLSAgICAgICAgICAgICB2TGF5ZXItPmxlZmlWaWFSdWxlTGF5ZXI6Om1ldGFsT3ZlcmhhbmcoKSk7Ci0gIGlmICh2TGF5ZXItPmxlZmlWaWFSdWxlTGF5ZXI6Omhhc1NwYWNpbmcoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICAgIFNQQUNJTkcgJWcgQlkgJWcgO1xuIiwKLSAgICAgICAgICAgICB2TGF5ZXItPmxlZmlWaWFSdWxlTGF5ZXI6OnNwYWNpbmdTdGVwWCgpLAotICAgICAgICAgICAgIHZMYXllci0+bGVmaVZpYVJ1bGVMYXllcjo6c3BhY2luZ1N0ZXBZKCkpOwotICBpZiAodkxheWVyLT5sZWZpVmlhUnVsZUxheWVyOjpoYXNSZWN0KCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgICBSRUNUICggJWYgJWYgKSAoICVmICVmICkgO1xuIiwKLSAgICAgICAgICAgICB2TGF5ZXItPmxlZmlWaWFSdWxlTGF5ZXI6OnhsKCksIHZMYXllci0+bGVmaVZpYVJ1bGVMYXllcjo6eWwoKSwKLSAgICAgICAgICAgICB2TGF5ZXItPmxlZmlWaWFSdWxlTGF5ZXI6OnhoKCksIHZMYXllci0+bGVmaVZpYVJ1bGVMYXllcjo6eWgoKSk7Ci0gIHJldHVybjsKLX0KLSAKLXZvaWQgcHJ0R2VvbWV0cnkobGVmaUdlb21ldHJpZXMgKmdlb21ldHJ5KSB7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBudW1JdGVtcyA9IGdlb21ldHJ5LT5sZWZpR2VvbWV0cmllczo6bnVtSXRlbXMoKTsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGksIGo7Ci0gICAgbGVmaUdlb21QYXRoICAgICAgICAqcGF0aDsKLSAgICBsZWZpR2VvbVBhdGhJdGVyICAgICpwYXRoSXRlcjsKLSAgICBsZWZpR2VvbVJlY3QgICAgICAgICpyZWN0OwotICAgIGxlZmlHZW9tUmVjdEl0ZXIgICAgKnJlY3RJdGVyOwotICAgIGxlZmlHZW9tUG9seWdvbiAgICAgKnBvbHlnb247Ci0gICAgbGVmaUdlb21Qb2x5Z29uSXRlciAqcG9seWdvbkl0ZXI7Ci0gICAgbGVmaUdlb21WaWEgICAgICAgICAqdmlhOwotICAgIGxlZmlHZW9tVmlhSXRlciAgICAgKnZpYUl0ZXI7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtSXRlbXM7IGkrKykgewotICAgICAgICBzd2l0Y2ggKGdlb21ldHJ5LT5sZWZpR2VvbWV0cmllczo6aXRlbVR5cGUoaSkpIHsKLSAgICAgICAgY2FzZSAgbGVmaUdlb21DbGFzc0U6Ci0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJDTEFTUyAlcyAiLAotICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS0+bGVmaUdlb21ldHJpZXM6OmdldENsYXNzKGkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGxlZmlHZW9tTGF5ZXJFOgotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICAgICAgTEFZRVIgJXMgO1xuIiwKLSAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnktPmxlZmlHZW9tZXRyaWVzOjpnZXRMYXllcihpKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBsZWZpR2VvbUxheWVyRXhjZXB0UGdOZXRFOgotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICAgICAgRVhDRVBUUEdORVQgO1xuIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBsZWZpR2VvbUxheWVyTWluU3BhY2luZ0U6Ci0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICAgICBTUEFDSU5HICVnIDtcbiIsCi0gICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5LT5sZWZpR2VvbWV0cmllczo6Z2V0TGF5ZXJNaW5TcGFjaW5nKGkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGxlZmlHZW9tTGF5ZXJSdWxlV2lkdGhFOgotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICAgICAgREVTSUdOUlVMRVdJRFRIICVnIDtcbiIsCi0gICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5LT5sZWZpR2VvbWV0cmllczo6Z2V0TGF5ZXJSdWxlV2lkdGgoaSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgbGVmaUdlb21XaWR0aEU6Ci0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICAgICBXSURUSCAlZyA7XG4iLAotICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS0+bGVmaUdlb21ldHJpZXM6OmdldFdpZHRoKGkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGxlZmlHZW9tUGF0aEU6Ci0gICAgICAgICAgICBwYXRoID0gZ2VvbWV0cnktPmxlZmlHZW9tZXRyaWVzOjpnZXRQYXRoKGkpOwotICAgICAgICAgICAgaWYgKHBhdGgtPmNvbG9yTWFzayAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICAgICAgUEFUSCBNQVNLICVkICIsIHBhdGgtPmNvbG9yTWFzayk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgICAgIFBBVEggIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcGF0aC0+bnVtUG9pbnRzOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaiArIDEgPT0gcGF0aC0+bnVtUG9pbnRzKSAvLyBsYXN0IG9uZSBvbiB0aGUgbGlzdAotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICAgICAoICVnICVnICkgO1xuIiwgcGF0aC0+eFtqXSwgcGF0aC0+eVtqXSk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICAgICAoICVnICVnIClcbiIsIHBhdGgtPnhbal0sIHBhdGgtPnlbal0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgbGVmaUdlb21QYXRoSXRlckU6Ci0gICAgICAgICAgICBwYXRoSXRlciA9IGdlb21ldHJ5LT5sZWZpR2VvbWV0cmllczo6Z2V0UGF0aEl0ZXIoaSk7Ci0gICAgICAgICAgICBpZiAocGF0aEl0ZXItPmNvbG9yTWFzayAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICAgICAgUEFUSCBNQVNLICVkIElURVJBVEVEICIsIHBhdGhJdGVyLT5jb2xvck1hc2spOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICAgICBQQVRIIElURVJBVEVEICIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBhdGhJdGVyLT5udW1Qb2ludHM7IGorKykKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICAgICAoICVnICVnIClcbiIsIHBhdGhJdGVyLT54W2pdLAotICAgICAgICAgICAgICAgICAgICAgICAgcGF0aEl0ZXItPnlbal0pOwotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICAgICAgRE8gJWcgQlkgJWcgU1RFUCAlZyAlZyA7XG4iLCBwYXRoSXRlci0+eFN0YXJ0LAotICAgICAgICAgICAgICAgICAgICBwYXRoSXRlci0+eVN0YXJ0LCBwYXRoSXRlci0+eFN0ZXAsIHBhdGhJdGVyLT55U3RlcCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBsZWZpR2VvbVJlY3RFOgotICAgICAgICAgICAgcmVjdCA9IGdlb21ldHJ5LT5sZWZpR2VvbWV0cmllczo6Z2V0UmVjdChpKTsKLSAgICAgICAgICAgIGlmIChyZWN0LT5jb2xvck1hc2sgIT0gMCkgewotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgICAgIFJFQ1QgTUFTSyAlZCAoICVmICVmICkgKCAlZiAlZiApIDtcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICByZWN0LT5jb2xvck1hc2ssIHJlY3QtPnhsLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC0+eWwsIHJlY3QtPnhoLCByZWN0LT55aCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgICAgIFJFQ1QgKCAlZiAlZiApICggJWYgJWYgKSA7XG4iLCByZWN0LT54bCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QtPnlsLCByZWN0LT54aCwgcmVjdC0+eWgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgbGVmaUdlb21SZWN0SXRlckU6Ci0gICAgICAgICAgICByZWN0SXRlciA9IGdlb21ldHJ5LT5sZWZpR2VvbWV0cmllczo6Z2V0UmVjdEl0ZXIoaSk7Ci0gICAgICAgICAgICBpZiAocmVjdEl0ZXItPmNvbG9yTWFzayAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICAgICAgUkVDVCBNQVNLICVkIElURVJBVEUgKCAlZiAlZiApICggJWYgJWYgKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY3RJdGVyLT5jb2xvck1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICByZWN0SXRlci0+eGwsIHJlY3RJdGVyLT55bCwgcmVjdEl0ZXItPnhoLCByZWN0SXRlci0+eWgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICAgICBSRUNUIElURVJBVEUgKCAlZiAlZiApICggJWYgJWYgKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY3RJdGVyLT54bCwgcmVjdEl0ZXItPnlsLCByZWN0SXRlci0+eGgsIHJlY3RJdGVyLT55aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICAgICBETyAlZyBCWSAlZyBTVEVQICVnICVnIDtcbiIsCi0gICAgICAgICAgICAgICAgICAgIHJlY3RJdGVyLT54U3RhcnQsIHJlY3RJdGVyLT55U3RhcnQsIHJlY3RJdGVyLT54U3RlcCwKLSAgICAgICAgICAgICAgICAgICAgcmVjdEl0ZXItPnlTdGVwKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGxlZmlHZW9tUG9seWdvbkU6Ci0gICAgICAgICAgICBwb2x5Z29uID0gZ2VvbWV0cnktPmxlZmlHZW9tZXRyaWVzOjpnZXRQb2x5Z29uKGkpOwotICAgICAgICAgICAgaWYgKHBvbHlnb24tPmNvbG9yTWFzayAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICAgICAgUE9MWUdPTiBNQVNLICVkICIsIHBvbHlnb24tPmNvbG9yTWFzayk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgICAgIFBPTFlHT04gIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcG9seWdvbi0+bnVtUG9pbnRzOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaiArIDEgPT0gcG9seWdvbi0+bnVtUG9pbnRzKSAvLyBsYXN0IG9uZSBvbiB0aGUgbGlzdAotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICAgICAoICVnICVnICkgO1xuIiwgcG9seWdvbi0+eFtqXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2x5Z29uLT55W2pdKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgICAgICggJWcgJWcgKVxuIiwgcG9seWdvbi0+eFtqXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2x5Z29uLT55W2pdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGxlZmlHZW9tUG9seWdvbkl0ZXJFOgotICAgICAgICAgICAgcG9seWdvbkl0ZXIgPSBnZW9tZXRyeS0+bGVmaUdlb21ldHJpZXM6OmdldFBvbHlnb25JdGVyKGkpOwotICAgICAgICAgICAgaWYgKHBvbHlnb25JdGVyLT5jb2xvck1hc2sgIT0gMCkgewotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgICAgICBQT0xZR09OIE1BU0sgJWQgSVRFUkFURSAiLCBwb2x5Z29uSXRlci0+Y29sb3JNYXNrKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICAgICAgUE9MWUdPTiBJVEVSQVRFIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcG9seWdvbkl0ZXItPm51bVBvaW50czsgaisrKQotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgICAgICggJWcgJWcgKVxuIiwgcG9seWdvbkl0ZXItPnhbal0sCi0gICAgICAgICAgICAgICAgICAgICAgICBwb2x5Z29uSXRlci0+eVtqXSk7Ci0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICAgICBETyAlZyBCWSAlZyBTVEVQICVnICVnIDtcbiIsCi0gICAgICAgICAgICAgICAgICAgIHBvbHlnb25JdGVyLT54U3RhcnQsIHBvbHlnb25JdGVyLT55U3RhcnQsCi0gICAgICAgICAgICAgICAgICAgIHBvbHlnb25JdGVyLT54U3RlcCwgcG9seWdvbkl0ZXItPnlTdGVwKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGxlZmlHZW9tVmlhRToKLSAgICAgICAgICAgIHZpYSA9IGdlb21ldHJ5LT5sZWZpR2VvbWV0cmllczo6Z2V0VmlhKGkpOwotICAgICAgICAgICAgaWYgKHZpYS0+dG9wTWFza051bSAhPSAwIHx8IHZpYS0+Ym90dG9tTWFza051bSAhPSAwIHx8IHZpYS0+Y3V0TWFza051bSAhPTApIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICAgICBWSUEgTUFTSyAlZCVkJWQgKCAlZyAlZyApICVzIDtcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICB2aWEtPnRvcE1hc2tOdW0sIHZpYS0+Y3V0TWFza051bSwgdmlhLT5ib3R0b21NYXNrTnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgdmlhLT54LCB2aWEtPnksCi0gICAgICAgICAgICAgICAgICAgICAgICB2aWEtPm5hbWUpOwotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgICAgIFZJQSAoICVnICVnICkgJXMgO1xuIiwgdmlhLT54LCB2aWEtPnksCi0gICAgICAgICAgICAgICAgICAgICAgICB2aWEtPm5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgbGVmaUdlb21WaWFJdGVyRToKLSAgICAgICAgICAgIHZpYUl0ZXIgPSBnZW9tZXRyeS0+bGVmaUdlb21ldHJpZXM6OmdldFZpYUl0ZXIoaSk7Ci0gICAgICAgICAgICBpZiAodmlhSXRlci0+dG9wTWFza051bSAhPSAwIHx8IHZpYUl0ZXItPmN1dE1hc2tOdW0gIT0gMCB8fCB2aWFJdGVyLT5ib3R0b21NYXNrTnVtICE9IDApIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICAgICBWSUEgSVRFUkFURSBNQVNLICVkJWQlZCAoICVnICVnICkgJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICB2aWFJdGVyLT50b3BNYXNrTnVtLCB2aWFJdGVyLT5jdXRNYXNrTnVtLCB2aWFJdGVyLT5ib3R0b21NYXNrTnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgdmlhSXRlci0+eCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZpYUl0ZXItPnksIHZpYUl0ZXItPm5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICAgICBWSUEgSVRFUkFURSAoICVnICVnICkgJXNcbiIsIHZpYUl0ZXItPngsCi0gICAgICAgICAgICAgICAgICAgICAgICB2aWFJdGVyLT55LCB2aWFJdGVyLT5uYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgICAgIERPICVnIEJZICVnIFNURVAgJWcgJWcgO1xuIiwKLSAgICAgICAgICAgICAgICAgICAgdmlhSXRlci0+eFN0YXJ0LCB2aWFJdGVyLT55U3RhcnQsCi0gICAgICAgICAgICAgICAgICAgIHZpYUl0ZXItPnhTdGVwLCB2aWFJdGVyLT55U3RlcCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkJPR1VTIGdlb21ldHJpZXMgdHlwZS5cbiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWludCBhbnRlbm5hQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGRvdWJsZSB2YWx1ZSwgbGVmaVVzZXJEYXRhKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgLy8gaWYgKChsb25nKXVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLQotICBzd2l0Y2ggKGMpIHsKLSAgICAgICAgY2FzZSBsZWZyQW50ZW5uYUlucHV0Q2JrVHlwZToKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJBTlRFTk5BSU5QVVRHQVRFQVJFQSAlZyA7XG4iLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgbGVmckFudGVubmFJbm91dENia1R5cGU6Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiQU5URU5OQUlOT1VURElGRkFSRUEgJWcgO1xuIiwgdmFsdWUpOwotICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGxlZnJBbnRlbm5hT3V0cHV0Q2JrVHlwZToKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJBTlRFTk5BT1VUUFVURElGRkFSRUEgJWcgO1xuIiwgdmFsdWUpOwotICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGxlZnJJbnB1dEFudGVubmFDYmtUeXBlOgotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIklOUFVUUElOQU5URU5OQVNJWkUgJWcgO1xuIiwgdmFsdWUpOwotICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGxlZnJPdXRwdXRBbnRlbm5hQ2JrVHlwZToKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJPVVRQVVRQSU5BTlRFTk5BU0laRSAlZyA7XG4iLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgbGVmcklub3V0QW50ZW5uYUNia1R5cGU6Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiSU5PVVRQSU5BTlRFTk5BU0laRSAlZyA7XG4iLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiQk9HVVMgYW50ZW5uYSB0eXBlLlxuIik7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBhcnJheUJlZ2luQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGNvbnN0IGNoYXIqIG5hbWUsIGxlZmlVc2VyRGF0YSkgewotICBpbnQgIHN0YXR1czsKLQotICBjaGVja1R5cGUoYyk7Ci0gIC8vIGlmICgobG9uZyl1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIC8vIHVzZSB0aGUgbGVmIHdyaXRlciB0byB3cml0ZSB0aGUgZGF0YSBvdXQKLSAgc3RhdHVzID0gbGVmd1N0YXJ0QXJyYXkobmFtZSk7Ci0gIGlmIChzdGF0dXMgIT0gTEVGV19PSykKLSAgICAgcmV0dXJuIHN0YXR1czsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBhcnJheUNCKGxlZnJDYWxsYmFja1R5cGVfZSBjLCBsZWZpQXJyYXkqIGEsIGxlZmlVc2VyRGF0YSkgewotICBpbnQgICAgICAgICAgICAgIHN0YXR1cywgaSwgaiwgZGVmQ2FwczsKLSAgbGVmaVNpdGVQYXR0ZXJuKiBwYXR0ZXJuOwotICBsZWZpVHJhY2tQYXR0ZXJuKiB0cmFjazsKLSAgbGVmaUdjZWxsUGF0dGVybiogZ2NlbGw7Ci0KLSAgY2hlY2tUeXBlKGMpOwotICAvLyBpZiAoKGxvbmcpdWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICAgCi0gIGlmIChhLT5sZWZpQXJyYXk6Om51bVNpdGVQYXR0ZXJuKCkgPiAwKSB7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBhLT5sZWZpQXJyYXk6Om51bVNpdGVQYXR0ZXJuKCk7IGkrKykgewotICAgICAgICBwYXR0ZXJuID0gYS0+bGVmaUFycmF5OjpzaXRlUGF0dGVybihpKTsKLSAgICAgICAgc3RhdHVzID0gbGVmd0FycmF5U2l0ZShwYXR0ZXJuLT5sZWZpU2l0ZVBhdHRlcm46Om5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLT5sZWZpU2l0ZVBhdHRlcm46OngoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLT5sZWZpU2l0ZVBhdHRlcm46OnkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLT5sZWZpU2l0ZVBhdHRlcm46Om9yaWVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4tPmxlZmlTaXRlUGF0dGVybjo6eFN0YXJ0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybi0+bGVmaVNpdGVQYXR0ZXJuOjp5U3RhcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLT5sZWZpU2l0ZVBhdHRlcm46OnhTdGVwKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybi0+bGVmaVNpdGVQYXR0ZXJuOjp5U3RlcCgpKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBMRUZXX09LKQotICAgICAgICAgICBkYXRhRXJyb3IoKTsKLSAgICAgfQotICB9Ci0gIGlmIChhLT5sZWZpQXJyYXk6Om51bUNhblBsYWNlKCkgPiAwKSB7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBhLT5sZWZpQXJyYXk6Om51bUNhblBsYWNlKCk7IGkrKykgewotICAgICAgICBwYXR0ZXJuID0gYS0+bGVmaUFycmF5OjpjYW5QbGFjZShpKTsKLSAgICAgICAgc3RhdHVzID0gbGVmd0FycmF5Q2FucGxhY2UocGF0dGVybi0+bGVmaVNpdGVQYXR0ZXJuOjpuYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4tPmxlZmlTaXRlUGF0dGVybjo6eCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLT5sZWZpU2l0ZVBhdHRlcm46OnkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybi0+bGVmaVNpdGVQYXR0ZXJuOjpvcmllbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybi0+bGVmaVNpdGVQYXR0ZXJuOjp4U3RhcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybi0+bGVmaVNpdGVQYXR0ZXJuOjp5U3RhcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybi0+bGVmaVNpdGVQYXR0ZXJuOjp4U3RlcCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLT5sZWZpU2l0ZVBhdHRlcm46OnlTdGVwKCkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IExFRldfT0spCi0gICAgICAgICAgIGRhdGFFcnJvcigpOwotICAgICB9Ci0gIH0KLSAgaWYgKGEtPmxlZmlBcnJheTo6bnVtQ2Fubm90T2NjdXB5KCkgPiAwKSB7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBhLT5sZWZpQXJyYXk6Om51bUNhbm5vdE9jY3VweSgpOyBpKyspIHsKLSAgICAgICAgcGF0dGVybiA9IGEtPmxlZmlBcnJheTo6Y2Fubm90T2NjdXB5KGkpOwotICAgICAgICBzdGF0dXMgPSBsZWZ3QXJyYXlDYW5ub3RvY2N1cHkocGF0dGVybi0+bGVmaVNpdGVQYXR0ZXJuOjpuYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLT5sZWZpU2l0ZVBhdHRlcm46OngoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4tPmxlZmlTaXRlUGF0dGVybjo6eSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybi0+bGVmaVNpdGVQYXR0ZXJuOjpvcmllbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4tPmxlZmlTaXRlUGF0dGVybjo6eFN0YXJ0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLT5sZWZpU2l0ZVBhdHRlcm46OnlTdGFydCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybi0+bGVmaVNpdGVQYXR0ZXJuOjp4U3RlcCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybi0+bGVmaVNpdGVQYXR0ZXJuOjp5U3RlcCgpKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBMRUZXX09LKQotICAgICAgICAgICBkYXRhRXJyb3IoKTsKLSAgICAgfQotICB9Ci0KLSAgaWYgKGEtPmxlZmlBcnJheTo6bnVtVHJhY2soKSA+IDApIHsKLSAgICAgZm9yIChpID0gMDsgaSA8IGEtPmxlZmlBcnJheTo6bnVtVHJhY2soKTsgaSsrKSB7Ci0gICAgICAgIHRyYWNrID0gYS0+bGVmaUFycmF5Ojp0cmFjayhpKTsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiICBUUkFDS1MgJXMsICVnIERPICVkIFNURVAgJWdcbiIsCi0gICAgICAgICAgICAgICAgdHJhY2stPmxlZmlUcmFja1BhdHRlcm46Om5hbWUoKSwKLSAgICAgICAgICAgICAgICB0cmFjay0+bGVmaVRyYWNrUGF0dGVybjo6c3RhcnQoKSwgCi0gICAgICAgICAgICAgICAgdHJhY2stPmxlZmlUcmFja1BhdHRlcm46Om51bVRyYWNrcygpLCAKLSAgICAgICAgICAgICAgICB0cmFjay0+bGVmaVRyYWNrUGF0dGVybjo6c3BhY2UoKSk7IAotICAgICAgICBpZiAodHJhY2stPmxlZmlUcmFja1BhdHRlcm46Om51bUxheWVycygpID4gMCkgewotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgIExBWUVSICIpOwotICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdHJhY2stPmxlZmlUcmFja1BhdHRlcm46Om51bUxheWVycygpOyBqKyspCi0gICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzICIsIHRyYWNrLT5sZWZpVHJhY2tQYXR0ZXJuOjpsYXllck5hbWUoaikpOwotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICI7XG4iKTsgCi0gICAgICAgIH0KLSAgICAgfQotICB9Ci0KLSAgaWYgKGEtPmxlZmlBcnJheTo6bnVtR2NlbGwoKSA+IDApIHsKLSAgICAgZm9yIChpID0gMDsgaSA8IGEtPmxlZmlBcnJheTo6bnVtR2NlbGwoKTsgaSsrKSB7Ci0gICAgICAgIGdjZWxsID0gYS0+bGVmaUFycmF5OjpnY2VsbChpKTsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiICBHQ0VMTEdSSUQgJXMsICVnIERPICVkIFNURVAgJWdcbiIsCi0gICAgICAgICAgICAgICAgZ2NlbGwtPmxlZmlHY2VsbFBhdHRlcm46Om5hbWUoKSwKLSAgICAgICAgICAgICAgICBnY2VsbC0+bGVmaUdjZWxsUGF0dGVybjo6c3RhcnQoKSwgCi0gICAgICAgICAgICAgICAgZ2NlbGwtPmxlZmlHY2VsbFBhdHRlcm46Om51bUNScygpLCAKLSAgICAgICAgICAgICAgICBnY2VsbC0+bGVmaUdjZWxsUGF0dGVybjo6c3BhY2UoKSk7IAotICAgICB9Ci0gIH0KLQotICBpZiAoYS0+bGVmaUFycmF5OjpudW1GbG9vclBsYW5zKCkgPiAwKSB7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBhLT5sZWZpQXJyYXk6Om51bUZsb29yUGxhbnMoKTsgaSsrKSB7Ci0gICAgICAgIHN0YXR1cyA9IGxlZndTdGFydEFycmF5Rmxvb3JwbGFuKGEtPmxlZmlBcnJheTo6Zmxvb3JQbGFuTmFtZShpKSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTEVGV19PSykKLSAgICAgICAgICAgZGF0YUVycm9yKCk7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCBhLT5sZWZpQXJyYXk6Om51bVNpdGVzKGkpOyBqKyspIHsKLSAgICAgICAgICAgcGF0dGVybiA9IGEtPmxlZmlBcnJheTo6c2l0ZShpLCBqKTsKLSAgICAgICAgICAgc3RhdHVzID0gbGVmd0FycmF5Rmxvb3JwbGFuKGEtPmxlZmlBcnJheTo6c2l0ZVR5cGUoaSwgaiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLT5sZWZpU2l0ZVBhdHRlcm46Om5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4tPmxlZmlTaXRlUGF0dGVybjo6eCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybi0+bGVmaVNpdGVQYXR0ZXJuOjp5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLT5sZWZpU2l0ZVBhdHRlcm46Om9yaWVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClwYXR0ZXJuLT5sZWZpU2l0ZVBhdHRlcm46OnhTdGFydCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClwYXR0ZXJuLT5sZWZpU2l0ZVBhdHRlcm46OnlTdGFydCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybi0+bGVmaVNpdGVQYXR0ZXJuOjp4U3RlcCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybi0+bGVmaVNpdGVQYXR0ZXJuOjp5U3RlcCgpKTsKLSAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBMRUZXX09LKQotICAgICAgICAgICAgICBkYXRhRXJyb3IoKTsKLSAgICAgICAgfQotICAgICBzdGF0dXMgPSBsZWZ3RW5kQXJyYXlGbG9vcnBsYW4oYS0+bGVmaUFycmF5OjpmbG9vclBsYW5OYW1lKGkpKTsKLSAgICAgaWYgKHN0YXR1cyAhPSBMRUZXX09LKQotICAgICAgICBkYXRhRXJyb3IoKTsKLSAgICAgfQotICB9Ci0KLSAgZGVmQ2FwcyA9IGEtPmxlZmlBcnJheTo6bnVtRGVmYXVsdENhcHMoKTsKLSAgaWYgKGRlZkNhcHMgPiAwKSB7Ci0gICAgIHN0YXR1cyA9IGxlZndTdGFydEFycmF5RGVmYXVsdENhcChkZWZDYXBzKTsKLSAgICAgaWYgKHN0YXR1cyAhPSBMRUZXX09LKQotICAgICAgICBkYXRhRXJyb3IoKTsKLSAgICAgZm9yIChpID0gMDsgaSA8IGRlZkNhcHM7IGkrKykgewotICAgICAgICBzdGF0dXMgPSBsZWZ3QXJyYXlEZWZhdWx0Q2FwKGEtPmxlZmlBcnJheTo6ZGVmYXVsdENhcE1pblBpbnMoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+bGVmaUFycmF5OjpkZWZhdWx0Q2FwKGkpKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBMRUZXX09LKQotICAgICAgICAgICBkYXRhRXJyb3IoKTsKLSAgICAgfQotICAgICBzdGF0dXMgPSBsZWZ3RW5kQXJyYXlEZWZhdWx0Q2FwKCk7Ci0gICAgIGlmIChzdGF0dXMgIT0gTEVGV19PSykKLSAgICAgICAgZGF0YUVycm9yKCk7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBhcnJheUVuZENCKGxlZnJDYWxsYmFja1R5cGVfZSBjLCBjb25zdCBjaGFyKiBuYW1lLCBsZWZpVXNlckRhdGEpIHsKLSAgaW50ICBzdGF0dXM7Ci0KLSAgY2hlY2tUeXBlKGMpOwotICAvLyBpZiAoKGxvbmcpdWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICAvLyB1c2UgdGhlIGxlZiB3cml0ZXIgdG8gd3JpdGUgdGhlIGRhdGEgb3V0Ci0gIHN0YXR1cyA9IGxlZndFbmRBcnJheShuYW1lKTsKLSAgaWYgKHN0YXR1cyAhPSBMRUZXX09LKQotICAgICByZXR1cm4gc3RhdHVzOwotICByZXR1cm4gMDsKLX0KLQotaW50IGJ1c0JpdENoYXJzQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGNvbnN0IGNoYXIqIGJ1c0JpdCwgbGVmaVVzZXJEYXRhKQotewotICBpbnQgc3RhdHVzOwotCi0gIGNoZWNrVHlwZShjKTsKLSAgLy8gaWYgKChsb25nKXVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgLy8gdXNlIHRoZSBsZWYgd3JpdGVyIHRvIHdyaXRlIG91dCB0aGUgZGF0YQotICBzdGF0dXMgPSBsZWZ3QnVzQml0Q2hhcnMoYnVzQml0KTsKLSAgaWYgKHN0YXR1cyAhPSBMRUZXX09LKQotICAgICBkYXRhRXJyb3IoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBjYXNlU2Vuc0NCKGxlZnJDYWxsYmFja1R5cGVfZSBjLCBpbnQgY2FzZVNlbnNlLCBsZWZpVXNlckRhdGEpIHsKLSAgY2hlY2tUeXBlKGMpOwotICAvLyBpZiAoKGxvbmcpdWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotCi0gIGlmIChjYXNlU2Vuc2UgPT0gVFJVRSkKLSAgICAgZnByaW50Zihmb3V0LCAiTkFNRVNDQVNFU0VOU0lUSVZFIE9OIDtcbiIpOwotICBlbHNlCi0gICAgIGZwcmludGYoZm91dCwgIk5BTUVTQ0FTRVNFTlNJVElWRSBPRkYgO1xuIik7Ci0gIHJldHVybiAwOwotfQotCi1pbnQgZml4ZWRNYXNrQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGludCBmaXhlZE1hc2ssIGxlZmlVc2VyRGF0YSkgewotICAgIGNoZWNrVHlwZShjKTsKLQotICAgIGlmIChmaXhlZE1hc2sgPT0gMSkgCi0gICAgICAgIGZwcmludGYoZm91dCwgIkZJWEVETUFTSyA7XG4iKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGNsZWFyYW5jZUNCKGxlZnJDYWxsYmFja1R5cGVfZSBjLCBjb25zdCBjaGFyKiBuYW1lLCBsZWZpVXNlckRhdGEpIHsKLSAgY2hlY2tUeXBlKGMpOwotICAvLyBpZiAoKGxvbmcpdWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotCi0gIGZwcmludGYoZm91dCwgIkNMRUFSQU5DRU1FQVNVUkUgJXMgO1xuIiwgbmFtZSk7Ci0gIHJldHVybiAwOwotfQotCi1pbnQgZGl2aWRlckNCKGxlZnJDYWxsYmFja1R5cGVfZSBjLCBjb25zdCBjaGFyKiBuYW1lLCBsZWZpVXNlckRhdGEpIHsKLSAgY2hlY2tUeXBlKGMpOwotICAvLyBpZiAoKGxvbmcpdWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotCi0gIGZwcmludGYoZm91dCwgIkRJVklERVIgJXMgO1xuIiwgbmFtZSk7Ci0gIHJldHVybiAwOwotfQotCi1pbnQgbm9XaXJlRXh0Q0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGNvbnN0IGNoYXIqIG5hbWUsIGxlZmlVc2VyRGF0YSkgewotICBjaGVja1R5cGUoYyk7Ci0gIC8vIGlmICgobG9uZyl1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0KLSAgZnByaW50Zihmb3V0LCAiTk9XSVJFRVhURU5TSU9OICVzIDtcbiIsIG5hbWUpOwotICByZXR1cm4gMDsKLX0KLQotaW50IG5vaXNlTWFyQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGxlZmlOb2lzZU1hcmdpbiAqLCBsZWZpVXNlckRhdGEpIHsKLSAgY2hlY2tUeXBlKGMpOwotICAvLyBpZiAoKGxvbmcpdWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICByZXR1cm4gMDsKLX0KLQotaW50IGVkZ2UxQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGRvdWJsZSBuYW1lLCBsZWZpVXNlckRhdGEpIHsKLSAgY2hlY2tUeXBlKGMpOwotICAvLyBpZiAoKGxvbmcpdWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotCi0gIGZwcmludGYoZm91dCwgIkVER0VSQVRFVEhSRVNIT0xEMSAlZyA7XG4iLCBuYW1lKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBlZGdlMkNCKGxlZnJDYWxsYmFja1R5cGVfZSBjLCBkb3VibGUgbmFtZSwgbGVmaVVzZXJEYXRhKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgLy8gaWYgKChsb25nKXVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLQotICBmcHJpbnRmKGZvdXQsICJFREdFUkFURVRIUkVTSE9MRDIgJWcgO1xuIiwgbmFtZSk7Ci0gIHJldHVybiAwOwotfQotCi1pbnQgZWRnZVNjYWxlQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGRvdWJsZSBuYW1lLCBsZWZpVXNlckRhdGEpIHsKLSAgY2hlY2tUeXBlKGMpOwotICAvLyBpZiAoKGxvbmcpdWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotCi0gIGZwcmludGYoZm91dCwgIkVER0VSQVRFU0NBTEVGQUNUT1JFICVnIDtcbiIsIG5hbWUpOwotICByZXR1cm4gMDsKLX0KLQotaW50IG5vaXNlVGFibGVDQihsZWZyQ2FsbGJhY2tUeXBlX2UgYywgbGVmaU5vaXNlVGFibGUgKiwgbGVmaVVzZXJEYXRhKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgLy8gaWYgKChsb25nKXVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLQotICByZXR1cm4gMDsKLX0KLQotaW50IGNvcnJlY3Rpb25DQihsZWZyQ2FsbGJhY2tUeXBlX2UgYywgbGVmaUNvcnJlY3Rpb25UYWJsZSAqLCBsZWZpVXNlckRhdGEpIHsKLSAgY2hlY2tUeXBlKGMpOwotICAvLyBpZiAoKGxvbmcpdWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotCi0gIHJldHVybiAwOwotfQotCi1pbnQgZGllbGVjdHJpY0NCKGxlZnJDYWxsYmFja1R5cGVfZSBjLCBkb3VibGUgZGllbGVjdHJpYywgbGVmaVVzZXJEYXRhKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgLy8gaWYgKChsb25nKXVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLQotICBmcHJpbnRmKGZvdXQsICJESUVMRUNUUklDICVnIDtcbiIsIGRpZWxlY3RyaWMpOwotICByZXR1cm4gMDsKLX0KLQotaW50IGlyZHJvcEJlZ2luQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIHZvaWQqLCBsZWZpVXNlckRhdGEpewotICBjaGVja1R5cGUoYyk7Ci0gIC8vIGlmICgobG9uZyl1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGZwcmludGYoZm91dCwgIklSRFJPUFxuIik7Ci0gIHJldHVybiAwOwotfQotCi1pbnQgaXJkcm9wQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGxlZmlJUkRyb3AqIGlyZHJvcCwgbGVmaVVzZXJEYXRhKSB7Ci0gIGludCBpOwotICBjaGVja1R5cGUoYyk7Ci0gIC8vIGlmICgobG9uZyl1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGZwcmludGYoZm91dCwgIiAgVEFCTEUgJXMgIiwgaXJkcm9wLT5sZWZpSVJEcm9wOjpuYW1lKCkpOwotICBmb3IgKGkgPSAwOyBpIDwgaXJkcm9wLT5sZWZpSVJEcm9wOjpudW1WYWx1ZXMoKTsgaSsrKSAKLSAgICAgZnByaW50Zihmb3V0LCAiJWcgJWcgIiwgaXJkcm9wLT5sZWZpSVJEcm9wOjp2YWx1ZTEoaSksCi0gICAgICAgICAgICAgaXJkcm9wLT5sZWZpSVJEcm9wOjp2YWx1ZTIoaSkpOwotICBmcHJpbnRmKGZvdXQsICI7XG4iKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBpcmRyb3BFbmRDQihsZWZyQ2FsbGJhY2tUeXBlX2UgYywgdm9pZCosIGxlZmlVc2VyRGF0YSl7Ci0gIGNoZWNrVHlwZShjKTsKLSAgLy8gaWYgKChsb25nKXVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgZnByaW50Zihmb3V0LCAiRU5EIElSRFJPUFxuIik7Ci0gIHJldHVybiAwOwotfQotCi1pbnQgbGF5ZXJDQihsZWZyQ2FsbGJhY2tUeXBlX2UgYywgbGVmaUxheWVyKiBsYXllciwgbGVmaVVzZXJEYXRhKSB7Ci0gIGludCBpLCBqLCBrOwotICBpbnQgbnVtUG9pbnRzLCBwcm9wTnVtOwotICBkb3VibGUgKndpZHRocywgKmN1cnJlbnQ7Ci0gIGxlZmlMYXllckRlbnNpdHkqIGRlbnNpdHk7Ci0gIGxlZmlBbnRlbm5hUFdMKiBwd2w7Ci0gIGxlZmlTcGFjaW5nVGFibGUqIHNwVGFibGU7Ci0gIGxlZmlJbmZsdWVuY2UqIGluZmx1ZW5jZTsKLSAgbGVmaVBhcmFsbGVsKiBwYXJhbGxlbDsKLSAgbGVmaVR3b1dpZHRocyogdHdvV2lkdGhzOwotICBjaGFyIHBUeXBlOwotICBpbnQgbnVtTWluQ3V0LCBudW1NaW5lbmNsb3NlZDsKLSAgbGVmaUFudGVubmFNb2RlbCogYU1vZGVsOwotICBsZWZpT3J0aG9nb25hbCogICBvcnRobzsKLQotICBjaGVja1R5cGUoYyk7Ci0gIC8vIGlmICgobG9uZyl1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0KLSAgbGVmclNldENhc2VTZW5zaXRpdml0eSgwKTsKLQotICAvLyBDYWxsIHBhcnNlNjVubVJ1bGVzIGZvciA1Ljcgc3ludGF4IGluIDUuNgotICBpZiAocGFyc2U2NW5tKQotICAgICBsYXllci0+bGVmaUxheWVyOjpwYXJzZTY1bm1SdWxlcygpOwotCi0gIC8vIENhbGwgcGFyc2VMZWY1OFR5cGUgZm9yIDUuOCBzeW50YXggaW4gNS43Ci0gIGlmIChwYXJzZUxlZjU4VHlwZSkKLSAgICAgbGF5ZXItPmxlZmlMYXllcjo6cGFyc2VMRUY1OExheWVyKCk7Ci0KLSAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXNcbiIsIGxheWVyLT5sZWZpTGF5ZXI6Om5hbWUoKSk7Ci0gIGlmIChsYXllci0+bGVmaUxheWVyOjpoYXNUeXBlKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgVFlQRSAlcyA7XG4iLCBsYXllci0+bGVmaUxheWVyOjp0eXBlKCkpOwotICBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzTGF5ZXJUeXBlKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgTEFZRVIgVFlQRSAlcyA7XG4iLCBsYXllci0+bGVmaUxheWVyOjpsYXllclR5cGUoKSk7Ci0gIGlmIChsYXllci0+bGVmaUxheWVyOjpoYXNNYXNrKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgTUFTSyAlZCA7XG4iLCBsYXllci0+bGVmaUxheWVyOjptYXNrKCkpOwotICBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzUGl0Y2goKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICBQSVRDSCAlZyA7XG4iLCBsYXllci0+bGVmaUxheWVyOjpwaXRjaCgpKTsKLSAgZWxzZSBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzWFlQaXRjaCgpKQotICAgICBmcHJpbnRmKGZvdXQsICIgIFBJVENIICVnICVnIDtcbiIsIGxheWVyLT5sZWZpTGF5ZXI6OnBpdGNoWCgpLAotICAgICAgICAgICAgIGxheWVyLT5sZWZpTGF5ZXI6OnBpdGNoWSgpKTsKLSAgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc09mZnNldCgpKQotICAgICBmcHJpbnRmKGZvdXQsICIgIE9GRlNFVCAlZyA7XG4iLCBsYXllci0+bGVmaUxheWVyOjpvZmZzZXQoKSk7Ci0gIGVsc2UgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc1hZT2Zmc2V0KCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgT0ZGU0VUICVnICVnIDtcbiIsIGxheWVyLT5sZWZpTGF5ZXI6Om9mZnNldFgoKSwKLSAgICAgICAgICAgICBsYXllci0+bGVmaUxheWVyOjpvZmZzZXRZKCkpOwotICBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzRGlhZ1BpdGNoKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgRElBR1BJVENIICVnIDtcbiIsIGxheWVyLT5sZWZpTGF5ZXI6OmRpYWdQaXRjaCgpKTsKLSAgZWxzZSBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzWFlEaWFnUGl0Y2goKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICBESUFHUElUQ0ggJWcgJWcgO1xuIiwgbGF5ZXItPmxlZmlMYXllcjo6ZGlhZ1BpdGNoWCgpLAotICAgICAgICAgICAgIGxheWVyLT5sZWZpTGF5ZXI6OmRpYWdQaXRjaFkoKSk7Ci0gIGlmIChsYXllci0+bGVmaUxheWVyOjpoYXNEaWFnV2lkdGgoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICBESUFHV0lEVEggJWcgO1xuIiwgbGF5ZXItPmxlZmlMYXllcjo6ZGlhZ1dpZHRoKCkpOwotICBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzRGlhZ1NwYWNpbmcoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICBESUFHU1BBQ0lORyAlZyA7XG4iLCBsYXllci0+bGVmaUxheWVyOjpkaWFnU3BhY2luZygpKTsKLSAgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc1dpZHRoKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgV0lEVEggJWcgO1xuIiwgbGF5ZXItPmxlZmlMYXllcjo6d2lkdGgoKSk7Ci0gIGlmIChsYXllci0+bGVmaUxheWVyOjpoYXNBcmVhKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgQVJFQSAlZyA7XG4iLCBsYXllci0+bGVmaUxheWVyOjphcmVhKCkpOwotICBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzU2xvdFdpcmVXaWR0aCgpKQotICAgICBmcHJpbnRmKGZvdXQsICIgIFNMT1RXSVJFV0lEVEggJWcgO1xuIiwgbGF5ZXItPmxlZmlMYXllcjo6c2xvdFdpcmVXaWR0aCgpKTsKLSAgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc1Nsb3RXaXJlTGVuZ3RoKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgU0xPVFdJUkVMRU5HVEggJWcgO1xuIiwKLSAgICAgICAgICAgICBsYXllci0+bGVmaUxheWVyOjpzbG90V2lyZUxlbmd0aCgpKTsKLSAgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc1Nsb3RXaWR0aCgpKQotICAgICBmcHJpbnRmKGZvdXQsICIgIFNMT1RXSURUSCAlZyA7XG4iLCBsYXllci0+bGVmaUxheWVyOjpzbG90V2lkdGgoKSk7Ci0gIGlmIChsYXllci0+bGVmaUxheWVyOjpoYXNTbG90TGVuZ3RoKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgU0xPVExFTkdUSCAlZyA7XG4iLCBsYXllci0+bGVmaUxheWVyOjpzbG90TGVuZ3RoKCkpOwotICBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzTWF4QWRqYWNlbnRTbG90U3BhY2luZygpKQotICAgICBmcHJpbnRmKGZvdXQsICIgIE1BWEFESkFDRU5UU0xPVFNQQUNJTkcgJWcgO1xuIiwKLSAgICAgICAgICAgICBsYXllci0+bGVmaUxheWVyOjptYXhBZGphY2VudFNsb3RTcGFjaW5nKCkpOwotICBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzTWF4Q29heGlhbFNsb3RTcGFjaW5nKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgTUFYQ09BWElBTFNMT1RTUEFDSU5HICVnIDtcbiIsCi0gICAgICAgICAgICAgbGF5ZXItPmxlZmlMYXllcjo6bWF4Q29heGlhbFNsb3RTcGFjaW5nKCkpOwotICBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzTWF4RWRnZVNsb3RTcGFjaW5nKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgTUFYRURHRVNMT1RTUEFDSU5HICVnIDtcbiIsCi0gICAgICAgICAgICAgbGF5ZXItPmxlZmlMYXllcjo6bWF4RWRnZVNsb3RTcGFjaW5nKCkpOwotICBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzTWF4RmxvYXRpbmdBcmVhKCkpICAgICAgICAgIC8vIDUuNwotICAgICBmcHJpbnRmKGZvdXQsICIgIE1BWEZMT0FUSU5HQVJFQSAlZyA7XG4iLAotICAgICAgICAgICAgIGxheWVyLT5sZWZpTGF5ZXI6Om1heEZsb2F0aW5nQXJlYSgpKTsKLSAgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc0FycmF5U3BhY2luZygpKSB7ICAgICAgICAgICAvLyA1LjcKLSAgICAgZnByaW50Zihmb3V0LCAiICBBUlJBWVNQQUNJTkcgIik7Ci0gICAgIGlmIChsYXllci0+bGVmaUxheWVyOjpoYXNMb25nQXJyYXkoKSkKLSAgICAgICAgZnByaW50Zihmb3V0LCAiTE9OR0FSUkFZICIpOwotICAgICBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzVmlhV2lkdGgoKSkKLSAgICAgICAgZnByaW50Zihmb3V0LCAiV0lEVEggJWcgIiwgbGF5ZXItPmxlZmlMYXllcjo6dmlhV2lkdGgoKSk7Ci0gICAgIGZwcmludGYoZm91dCwgIkNVVFNQQUNJTkcgJWciLCBsYXllci0+bGVmaUxheWVyOjpjdXRTcGFjaW5nKCkpOwotICAgICBmb3IgKGkgPSAwOyBpIDwgbGF5ZXItPmxlZmlMYXllcjo6bnVtQXJyYXlDdXRzKCk7IGkrKykgCi0gICAgICAgIGZwcmludGYoZm91dCwgIlxuXHRBUlJBWUNVVFMgJWQgU1BBQ0lORyAlZyIsCi0gICAgICAgICAgICAgICAgbGF5ZXItPmxlZmlMYXllcjo6YXJyYXlDdXRzKGkpLAotICAgICAgICAgICAgICAgIGxheWVyLT5sZWZpTGF5ZXI6OmFycmF5U3BhY2luZyhpKSk7Ci0gICAgIGZwcmludGYoZm91dCwgIiA7XG4iKTsKLSAgfQotICBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzU3BsaXRXaXJlV2lkdGgoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICBTUExJVFdJUkVXSURUSCAlZyA7XG4iLAotICAgICAgICAgICAgIGxheWVyLT5sZWZpTGF5ZXI6OnNwbGl0V2lyZVdpZHRoKCkpOwotICBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzTWluaW11bURlbnNpdHkoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICBNSU5JTVVNREVOU0lUWSAlZyA7XG4iLAotICAgICAgICAgICAgIGxheWVyLT5sZWZpTGF5ZXI6Om1pbmltdW1EZW5zaXR5KCkpOwotICBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzTWF4aW11bURlbnNpdHkoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICBNQVhJTVVNREVOU0lUWSAlZyA7XG4iLAotICAgICAgICAgICAgIGxheWVyLT5sZWZpTGF5ZXI6Om1heGltdW1EZW5zaXR5KCkpOwotICBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzRGVuc2l0eUNoZWNrV2luZG93KCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgREVOU0lUWUNIRUNLV0lORE9XICVnICVnIDtcbiIsCi0gICAgICAgICAgICAgbGF5ZXItPmxlZmlMYXllcjo6ZGVuc2l0eUNoZWNrV2luZG93TGVuZ3RoKCksCi0gICAgICAgICAgICAgbGF5ZXItPmxlZmlMYXllcjo6ZGVuc2l0eUNoZWNrV2luZG93V2lkdGgoKSk7Ci0gIGlmIChsYXllci0+bGVmaUxheWVyOjpoYXNEZW5zaXR5Q2hlY2tTdGVwKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgREVOU0lUWUNIRUNLU1RFUCAlZyA7XG4iLAotICAgICAgICAgICAgIGxheWVyLT5sZWZpTGF5ZXI6OmRlbnNpdHlDaGVja1N0ZXAoKSk7Ci0gIGlmIChsYXllci0+bGVmaUxheWVyOjpoYXNGaWxsQWN0aXZlU3BhY2luZygpKQotICAgICBmcHJpbnRmKGZvdXQsICIgIEZJTExBQ1RJVkVTUEFDSU5HICVnIDtcbiIsCi0gICAgICAgICAgICAgbGF5ZXItPmxlZmlMYXllcjo6ZmlsbEFjdGl2ZVNwYWNpbmcoKSk7Ci0gIC8vIDUuNC4xCi0gIG51bU1pbkN1dCA9IGxheWVyLT5sZWZpTGF5ZXI6Om51bU1pbmltdW1jdXQoKTsKLSAgaWYgKG51bU1pbkN1dCA+IDApIHsKLSAgICAgZm9yIChpID0gMDsgaSA8IG51bU1pbkN1dDsgaSsrKSB7Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICIgIE1JTklNVU1DVVQgJWQgV0lEVEggJWcgIiwKLSAgICAgICAgICAgICAgbGF5ZXItPmxlZmlMYXllcjo6bWluaW11bWN1dChpKSwKLSAgICAgICAgICAgICAgbGF5ZXItPmxlZmlMYXllcjo6bWluaW11bWN1dFdpZHRoKGkpKTsKLSAgICAgICAgIGlmIChsYXllci0+bGVmaUxheWVyOjpoYXNNaW5pbXVtY3V0V2l0aGluKGkpKQotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiV0lUSElOICVnICIsIGxheWVyLT5sZWZpTGF5ZXI6Om1pbmltdW1jdXRXaXRoaW4oaSkpOwotICAgICAgICAgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc01pbmltdW1jdXRDb25uZWN0aW9uKGkpKQotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgbGF5ZXItPmxlZmlMYXllcjo6bWluaW11bWN1dENvbm5lY3Rpb24oaSkpOwotICAgICAgICAgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc01pbmltdW1jdXROdW1DdXRzKGkpKQotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTEVOR1RIICVnIFdJVEhJTiAlZyAiLAotICAgICAgICAgICAgbGF5ZXItPmxlZmlMYXllcjo6bWluaW11bWN1dExlbmd0aChpKSwKLSAgICAgICAgICAgIGxheWVyLT5sZWZpTGF5ZXI6Om1pbmltdW1jdXREaXN0YW5jZShpKSk7Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICI7XG4iKTsKLSAgICAgfQotICB9Ci0gIC8vIDUuNC4xCi0gIGlmIChsYXllci0+bGVmaUxheWVyOjpoYXNNYXh3aWR0aCgpKSB7Ci0gICAgIGZwcmludGYoZm91dCwgIiAgTUFYV0lEVEggJWcgO1xuIiwgbGF5ZXItPmxlZmlMYXllcjo6bWF4d2lkdGgoKSk7Ci0gIH0KLSAgLy8gNS41Ci0gIGlmIChsYXllci0+bGVmaUxheWVyOjpoYXNNaW53aWR0aCgpKSB7Ci0gICAgIGZwcmludGYoZm91dCwgIiAgTUlOV0lEVEggJWcgO1xuIiwgbGF5ZXItPmxlZmlMYXllcjo6bWlud2lkdGgoKSk7Ci0gIH0KLSAgLy8gNS41Ci0gIG51bU1pbmVuY2xvc2VkID0gbGF5ZXItPmxlZmlMYXllcjo6bnVtTWluZW5jbG9zZWRhcmVhKCk7Ci0gIGlmIChudW1NaW5lbmNsb3NlZCA+IDApIHsKLSAgICAgZm9yIChpID0gMDsgaSA8IG51bU1pbmVuY2xvc2VkOyBpKyspIHsKLSAgICAgICAgIGZwcmludGYoZm91dCwgIiAgTUlORU5DTE9TRURBUkVBICVnICIsCi0gICAgICAgICAgICAgIGxheWVyLT5sZWZpTGF5ZXI6Om1pbmVuY2xvc2VkYXJlYShpKSk7Ci0gICAgICAgICBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzTWluZW5jbG9zZWRhcmVhV2lkdGgoaSkpCi0gICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIk1JTkVOQ0xPU0VEQVJFQVdJRFRIICVnICIsCi0gICAgICAgICAgICAgICAgICAgICAgbGF5ZXItPmxlZmlMYXllcjo6bWluZW5jbG9zZWRhcmVhV2lkdGgoaSkpOwotICAgICAgICAgZnByaW50ZiAoZm91dCwgIjtcbiIpOyAKLSAgICAgfQotICB9Ci0gIC8vIDUuNC4xICYgNS42Ci0gIGlmIChsYXllci0+bGVmaUxheWVyOjpoYXNNaW5zdGVwKCkpIHsKLSAgICAgZm9yIChpID0gMDsgaSA8IGxheWVyLT5sZWZpTGF5ZXI6Om51bU1pbnN0ZXAoKTsgaSsrKSB7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIiAgTUlOU1RFUCAlZyAiLCBsYXllci0+bGVmaUxheWVyOjptaW5zdGVwKGkpKTsKLSAgICAgICAgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc01pbnN0ZXBUeXBlKGkpKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAiLCBsYXllci0+bGVmaUxheWVyOjptaW5zdGVwVHlwZShpKSk7Ci0gICAgICAgIGlmIChsYXllci0+bGVmaUxheWVyOjpoYXNNaW5zdGVwTGVuZ3Roc3VtKGkpKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJMRU5HVEhTVU0gJWcgIiwKLSAgICAgICAgICAgICAgICAgICBsYXllci0+bGVmaUxheWVyOjptaW5zdGVwTGVuZ3Roc3VtKGkpKTsKLSAgICAgICAgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc01pbnN0ZXBNYXhlZGdlcyhpKSkKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTUFYRURHRVMgJWQgIiwgbGF5ZXItPmxlZmlMYXllcjo6bWluc3RlcE1heGVkZ2VzKGkpKTsKLSAgICAgICAgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc01pbnN0ZXBNaW5BZGpMZW5ndGgoaSkpCi0gICAgICAgICAgIGZwcmludGYoZm91dCwgIk1JTkFESkxFTkdUSCAlZyAiLCBsYXllci0+bGVmaUxheWVyOjptaW5zdGVwTWluQWRqTGVuZ3RoKGkpKTsKLSAgICAgICAgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc01pbnN0ZXBNaW5CZXRMZW5ndGgoaSkpCi0gICAgICAgICAgIGZwcmludGYoZm91dCwgIk1JTkJFVExFTkdUSCAlZyAiLCBsYXllci0+bGVmaUxheWVyOjptaW5zdGVwTWluQmV0TGVuZ3RoKGkpKTsKLSAgICAgICAgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc01pbnN0ZXBYU2FtZUNvcm5lcnMoaSkpCi0gICAgICAgICAgIGZwcmludGYoZm91dCwgIlhTQU1FQ09STkVSUyIpOwotICAgICAgICBmcHJpbnRmKGZvdXQsICI7XG4iKTsKLSAgICAgfQotICB9Ci0gIC8vIDUuNC4xCi0gIGlmIChsYXllci0+bGVmaUxheWVyOjpoYXNQcm90cnVzaW9uKCkpIHsKLSAgICAgZnByaW50Zihmb3V0LCAiICBQUk9UUlVTSU9OV0lEVEggJWcgTEVOR1RIICVnIFdJRFRIICVnIDtcbiIsCi0gICAgICAgICAgICAgbGF5ZXItPmxlZmlMYXllcjo6cHJvdHJ1c2lvbldpZHRoMSgpLAotICAgICAgICAgICAgIGxheWVyLT5sZWZpTGF5ZXI6OnByb3RydXNpb25MZW5ndGgoKSwKLSAgICAgICAgICAgICBsYXllci0+bGVmaUxheWVyOjpwcm90cnVzaW9uV2lkdGgyKCkpOwotICB9IAotICBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzU3BhY2luZ051bWJlcigpKSB7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBsYXllci0+bGVmaUxheWVyOjpudW1TcGFjaW5nKCk7IGkrKykgewotICAgICAgIGZwcmludGYoZm91dCwgIiAgU1BBQ0lORyAlZyAiLCBsYXllci0+bGVmaUxheWVyOjpzcGFjaW5nKGkpKTsKLSAgICAgICBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzU3BhY2luZ05hbWUoaSkpCi0gICAgICAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgIiwgbGF5ZXItPmxlZmlMYXllcjo6c3BhY2luZ05hbWUoaSkpOwotICAgICAgIGlmIChsYXllci0+bGVmaUxheWVyOjpoYXNTcGFjaW5nTGF5ZXJTdGFjayhpKSkKLSAgICAgICAgICBmcHJpbnRmKGZvdXQsICJTVEFDSyAiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgICAgICBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzU3BhY2luZ0FkamFjZW50KGkpKQotICAgICAgICAgIGZwcmludGYoZm91dCwgIkFESkFDRU5UQ1VUUyAlZCBXSVRISU4gJWcgIiwKLSAgICAgICAgICAgICAgICAgIGxheWVyLT5sZWZpTGF5ZXI6OnNwYWNpbmdBZGphY2VudEN1dHMoaSksCi0gICAgICAgICAgICAgICAgICBsYXllci0+bGVmaUxheWVyOjpzcGFjaW5nQWRqYWNlbnRXaXRoaW4oaSkpOwotICAgICAgIGlmIChsYXllci0+bGVmaUxheWVyOjpoYXNTcGFjaW5nQWRqYWNlbnRFeGNlcHQoaSkpICAgIC8vIDUuNwotICAgICAgICAgIGZwcmludGYoZm91dCwgIkVYQ0VQVFNBTUVQR05FVCAiKTsgCi0gICAgICAgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc1NwYWNpbmdDZW50ZXJUb0NlbnRlcihpKSkKLSAgICAgICAgICBmcHJpbnRmKGZvdXQsICJDRU5URVJUT0NFTlRFUiAiKTsKLSAgICAgICBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzU3BhY2luZ1NhbWVuZXQoaSkpICAgICAgICAgICAvLyA1LjcKLSAgICAgICAgICBmcHJpbnRmKGZvdXQsICJTQU1FTkVUICIpOwotICAgICAgICAgICBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzU3BhY2luZ1NhbWVuZXRQR29ubHkoaSkpIC8vIDUuNwotICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJQR09OTFkgIik7Ci0gICAgICAgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc1NwYWNpbmdBcmVhKGkpKSAgICAgICAgICAgICAgLy8gNS43Ci0gICAgICAgICAgZnByaW50Zihmb3V0LCAiQVJFQSAlZyAiLCBsYXllci0+bGVmaUxheWVyOjpzcGFjaW5nQXJlYShpKSk7Ci0gICAgICAgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc1NwYWNpbmdSYW5nZShpKSkgewotICAgICAgICAgIGZwcmludGYoZm91dCwgIlJBTkdFICVnICVnICIsIGxheWVyLT5sZWZpTGF5ZXI6OnNwYWNpbmdSYW5nZU1pbihpKSwKLSAgICAgICAgICAgICAgICAgIGxheWVyLT5sZWZpTGF5ZXI6OnNwYWNpbmdSYW5nZU1heChpKSk7Ci0gICAgICAgICAgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc1NwYWNpbmdSYW5nZVVzZUxlbmd0aFRocmVzaG9sZChpKSkKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJVU0VMRU5HVEhUSFJFU0hPTEQgIik7IAotICAgICAgICAgIGVsc2UgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc1NwYWNpbmdSYW5nZUluZmx1ZW5jZShpKSkgewotICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJJTkZMVUVOQ0UgJWcgIiwKLSAgICAgICAgICAgICAgICAgbGF5ZXItPmxlZmlMYXllcjo6c3BhY2luZ1JhbmdlSW5mbHVlbmNlKGkpKTsKLSAgICAgICAgICAgICAgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc1NwYWNpbmdSYW5nZUluZmx1ZW5jZVJhbmdlKGkpKQotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJSQU5HRSAlZyAlZyAiLAotICAgICAgICAgICAgICAgICAgICBsYXllci0+bGVmaUxheWVyOjpzcGFjaW5nUmFuZ2VJbmZsdWVuY2VNaW4oaSksCi0gICAgICAgICAgICAgICAgICAgIGxheWVyLT5sZWZpTGF5ZXI6OnNwYWNpbmdSYW5nZUluZmx1ZW5jZU1heChpKSk7Ci0gICAgICAgICAgIH0gZWxzZSBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzU3BhY2luZ1JhbmdlUmFuZ2UoaSkpCi0gICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJSQU5HRSAlZyAlZyAiLAotICAgICAgICAgICAgICAgICBsYXllci0+bGVmaUxheWVyOjpzcGFjaW5nUmFuZ2VSYW5nZU1pbihpKSwKLSAgICAgICAgICAgICAgICAgbGF5ZXItPmxlZmlMYXllcjo6c3BhY2luZ1JhbmdlUmFuZ2VNYXgoaSkpOwotICAgICAgIH0gZWxzZSBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzU3BhY2luZ0xlbmd0aFRocmVzaG9sZChpKSkgewotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJMRU5HVEhUSFJFU0hPTEQgJWcgIiwKLSAgICAgICAgICAgICAgbGF5ZXItPmxlZmlMYXllcjo6c3BhY2luZ0xlbmd0aFRocmVzaG9sZChpKSk7Ci0gICAgICAgICAgIGlmIChsYXllci0+bGVmaUxheWVyOjpoYXNTcGFjaW5nTGVuZ3RoVGhyZXNob2xkUmFuZ2UoaSkpCi0gICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlJBTkdFICVnICVnIiwKLSAgICAgICAgICAgICAgICAgbGF5ZXItPmxlZmlMYXllcjo6c3BhY2luZ0xlbmd0aFRocmVzaG9sZFJhbmdlTWluKGkpLAotICAgICAgICAgICAgICAgICBsYXllci0+bGVmaUxheWVyOjpzcGFjaW5nTGVuZ3RoVGhyZXNob2xkUmFuZ2VNYXgoaSkpOwotICAgICAgIH0gZWxzZSBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzU3BhY2luZ05vdGNoTGVuZ3RoKGkpKSB7Ly8gNS43Ci0gICAgICAgICAgIGZwcmludGYoZm91dCwgIk5PVENITEVOR1RIICVnIiwKLSAgICAgICAgICAgICAgICAgICBsYXllci0+bGVmaUxheWVyOjpzcGFjaW5nTm90Y2hMZW5ndGgoaSkpOwotICAgICAgIH0gZWxzZSBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzU3BhY2luZ0VuZE9mTm90Y2hXaWR0aChpKSkgLy8gNS43Ci0gICAgICAgICAgIGZwcmludGYoZm91dCwgIkVORE9GTk9UQ0hXSURUSCAlZyBOT1RDSFNQQUNJTkcgJWcsIE5PVENITEVOR1RIICVnIiwKLSAgICAgICAgICAgICAgICAgICBsYXllci0+bGVmaUxheWVyOjpzcGFjaW5nRW5kT2ZOb3RjaFdpZHRoKGkpLAotICAgICAgICAgICAgICAgICAgIGxheWVyLT5sZWZpTGF5ZXI6OnNwYWNpbmdFbmRPZk5vdGNoU3BhY2luZyhpKSwKLSAgICAgICAgICAgICAgICAgICBsYXllci0+bGVmaUxheWVyOjpzcGFjaW5nRW5kT2ZOb3RjaExlbmd0aChpKSk7Ci0KLSAgICAgICBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzU3BhY2luZ1BhcmFsbGVsT3ZlcmxhcChpKSkgICAvLyA1LjcKLSAgICAgICAgICBmcHJpbnRmKGZvdXQsICJQQVJBTExFTE9WRVJMQVAgIik7IAotICAgICAgIGlmIChsYXllci0+bGVmaUxheWVyOjpoYXNTcGFjaW5nRW5kT2ZMaW5lKGkpKSB7ICAgICAgIC8vIDUuNwotICAgICAgICAgIGZwcmludGYoZm91dCwgIkVORE9GTElORSAlZyBXSVRISU4gJWcgIiwKLSAgICAgICAgICAgICBsYXllci0+bGVmaUxheWVyOjpzcGFjaW5nRW9sV2lkdGgoaSksCi0gICAgICAgICAgICAgbGF5ZXItPmxlZmlMYXllcjo6c3BhY2luZ0VvbFdpdGhpbihpKSk7Ci0gICAgICAgICAgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc1NwYWNpbmdQYXJlbGxlbEVkZ2UoaSkpIHsKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJQQVJBTExFTEVER0UgJWcgV0lUSElOICVnICIsCi0gICAgICAgICAgICAgICAgbGF5ZXItPmxlZmlMYXllcjo6c3BhY2luZ1BhclNwYWNlKGkpLAotICAgICAgICAgICAgICAgIGxheWVyLT5sZWZpTGF5ZXI6OnNwYWNpbmdQYXJXaXRoaW4oaSkpOwotICAgICAgICAgICAgIGlmIChsYXllci0+bGVmaUxheWVyOjpoYXNTcGFjaW5nVHdvRWRnZXMoaSkpIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJUV09FREdFUyAiKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICBmcHJpbnRmKGZvdXQsICI7XG4iKTsKLSAgICAgfQotICB9Ci0gIGlmIChsYXllci0+bGVmaUxheWVyOjpoYXNTcGFjaW5nVGFibGVPcnRobygpKSB7ICAgICAgICAgICAgLy8gNS43Ci0gICAgIGZwcmludGYoZm91dCwgIlNQQUNJTkdUQUJMRSBPUlRIT0dPTkFMIik7IAotICAgICBvcnRobyA9IGxheWVyLT5sZWZpTGF5ZXI6Om9ydGhvZ29uYWwoKTsKLSAgICAgZm9yIChpID0gMDsgaSA8IG9ydGhvLT5sZWZpT3J0aG9nb25hbDo6bnVtT3J0aG9nb25hbCgpOyBpKyspIHsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiXG4gICBXSVRISU4gJWcgU1BBQ0lORyAlZyIsCi0gICAgICAgICAgICAgICAgb3J0aG8tPmxlZmlPcnRob2dvbmFsOjpjdXRXaXRoaW4oaSksCi0gICAgICAgICAgICAgICAgb3J0aG8tPmxlZmlPcnRob2dvbmFsOjpvcnRob1NwYWNpbmcoaSkpOwotICAgICB9Ci0gICAgIGZwcmludGYoZm91dCwgIjtcbiIpOwotICB9Ci0gIGZvciAoaSA9IDA7IGkgPCBsYXllci0+bGVmaUxheWVyOjpudW1FbmNsb3N1cmUoKTsgaSsrKSB7Ci0gICAgIGZwcmludGYoZm91dCwgIkVOQ0xPU1VSRSAiKTsKLSAgICAgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc0VuY2xvc3VyZVJ1bGUoaSkpCi0gICAgICAgIGZwcmludGYoZm91dCwgIiVzICIsIGxheWVyLT5sZWZpTGF5ZXI6OmVuY2xvc3VyZVJ1bGUoaSkpOwotICAgICBmcHJpbnRmKGZvdXQsICIlZyAlZyAiLCBsYXllci0+bGVmaUxheWVyOjplbmNsb3N1cmVPdmVyaGFuZzEoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLT5sZWZpTGF5ZXI6OmVuY2xvc3VyZU92ZXJoYW5nMihpKSk7Ci0gICAgIGlmIChsYXllci0+bGVmaUxheWVyOjpoYXNFbmNsb3N1cmVXaWR0aChpKSkKLSAgICAgICAgZnByaW50Zihmb3V0LCAiV0lEVEggJWcgIiwgbGF5ZXItPmxlZmlMYXllcjo6ZW5jbG9zdXJlTWluV2lkdGgoaSkpOwotICAgICBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzRW5jbG9zdXJlRXhjZXB0RXh0cmFDdXQoaSkpCi0gICAgICAgIGZwcmludGYoZm91dCwgIkVYQ0VQVEVYVFJBQ1VUICVnICIsCi0gICAgICAgICAgICAgICAgbGF5ZXItPmxlZmlMYXllcjo6ZW5jbG9zdXJlRXhjZXB0RXh0cmFDdXQoaSkpOwotICAgICBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzRW5jbG9zdXJlTWluTGVuZ3RoKGkpKQotICAgICAgICBmcHJpbnRmKGZvdXQsICJMRU5HVEggJWcgIiwgbGF5ZXItPmxlZmlMYXllcjo6ZW5jbG9zdXJlTWluTGVuZ3RoKGkpKTsKLSAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0gIH0KLSAgZm9yIChpID0gMDsgaSA8IGxheWVyLT5sZWZpTGF5ZXI6Om51bVByZWZlckVuY2xvc3VyZSgpOyBpKyspIHsKLSAgICAgZnByaW50Zihmb3V0LCAiUFJFRkVSRU5DTE9TVVJFICIpOwotICAgICBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzUHJlZmVyRW5jbG9zdXJlUnVsZShpKSkKLSAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgbGF5ZXItPmxlZmlMYXllcjo6cHJlZmVyRW5jbG9zdXJlUnVsZShpKSk7Ci0gICAgIGZwcmludGYoZm91dCwgIiVnICVnICIsIGxheWVyLT5sZWZpTGF5ZXI6OnByZWZlckVuY2xvc3VyZU92ZXJoYW5nMShpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXItPmxlZmlMYXllcjo6cHJlZmVyRW5jbG9zdXJlT3ZlcmhhbmcyKGkpKTsKLSAgICAgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc1ByZWZlckVuY2xvc3VyZVdpZHRoKGkpKQotICAgICAgICBmcHJpbnRmKGZvdXQsICJXSURUSCAlZyAiLGxheWVyLT5sZWZpTGF5ZXI6OnByZWZlckVuY2xvc3VyZU1pbldpZHRoKGkpKTsKLSAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0gIH0KLSAgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc1Jlc2lzdGFuY2VQZXJDdXQoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICBSRVNJU1RBTkNFICVnIDtcbiIsCi0gICAgICAgICAgICAgbGF5ZXItPmxlZmlMYXllcjo6cmVzaXN0YW5jZVBlckN1dCgpKTsKLSAgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc0N1cnJlbnREZW5zaXR5UG9pbnQoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICBDVVJSRU5UREVOICVnIDtcbiIsCi0gICAgICAgICAgICAgbGF5ZXItPmxlZmlMYXllcjo6Y3VycmVudERlbnNpdHlQb2ludCgpKTsKLSAgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc0N1cnJlbnREZW5zaXR5QXJyYXkoKSkgeyAKLSAgICAgbGF5ZXItPmxlZmlMYXllcjo6Y3VycmVudERlbnNpdHlBcnJheSgmbnVtUG9pbnRzLCAmd2lkdGhzLCAmY3VycmVudCk7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBudW1Qb2ludHM7IGkrKykKLSAgICAgICAgIGZwcmludGYoZm91dCwgIiAgQ1VSUkVOVERFTiAoICVnICVnICkgO1xuIiwgd2lkdGhzW2ldLCBjdXJyZW50W2ldKTsKLSAgfQotICBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzRGlyZWN0aW9uKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgRElSRUNUSU9OICVzIDtcbiIsIGxheWVyLT5sZWZpTGF5ZXI6OmRpcmVjdGlvbigpKTsKLSAgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc1Jlc2lzdGFuY2UoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICBSRVNJU1RBTkNFIFJQRVJTUSAlZyA7XG4iLAotICAgICAgICAgICAgIGxheWVyLT5sZWZpTGF5ZXI6OnJlc2lzdGFuY2UoKSk7Ci0gIGlmIChsYXllci0+bGVmaUxheWVyOjpoYXNDYXBhY2l0YW5jZSgpKQotICAgICBmcHJpbnRmKGZvdXQsICIgIENBUEFDSVRBTkNFIENQRVJTUURJU1QgJWcgO1xuIiwKLSAgICAgICAgICAgICBsYXllci0+bGVmaUxheWVyOjpjYXBhY2l0YW5jZSgpKTsKLSAgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc0VkZ2VDYXAoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICBFREdFQ0FQQUNJVEFOQ0UgJWcgO1xuIiwgbGF5ZXItPmxlZmlMYXllcjo6ZWRnZUNhcCgpKTsKLSAgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc0hlaWdodCgpKQotICAgICBmcHJpbnRmKGZvdXQsICIgIFRZUEUgJWcgO1xuIiwgbGF5ZXItPmxlZmlMYXllcjo6aGVpZ2h0KCkpOwotICBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzVGhpY2tuZXNzKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgVEhJQ0tORVNTICVnIDtcbiIsIGxheWVyLT5sZWZpTGF5ZXI6OnRoaWNrbmVzcygpKTsKLSAgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc1dpcmVFeHRlbnNpb24oKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICBXSVJFRVhURU5TSU9OICVnIDtcbiIsIGxheWVyLT5sZWZpTGF5ZXI6OndpcmVFeHRlbnNpb24oKSk7Ci0gIGlmIChsYXllci0+bGVmaUxheWVyOjpoYXNTaHJpbmthZ2UoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICBTSFJJTktBR0UgJWcgO1xuIiwgbGF5ZXItPmxlZmlMYXllcjo6c2hyaW5rYWdlKCkpOwotICBpZiAobGF5ZXItPmxlZmlMYXllcjo6aGFzQ2FwTXVsdGlwbGllcigpKQotICAgICBmcHJpbnRmKGZvdXQsICIgIENBUE1VTFRJUExJRVIgJWcgO1xuIiwgbGF5ZXItPmxlZmlMYXllcjo6Y2FwTXVsdGlwbGllcigpKTsKLSAgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc0FudGVubmFBcmVhKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgQU5URU5OQUFSRUFGQUNUT1IgJWcgO1xuIiwKLSAgICAgICAgICAgICBsYXllci0+bGVmaUxheWVyOjphbnRlbm5hQXJlYSgpKTsKLSAgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc0FudGVubmFMZW5ndGgoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICBBTlRFTk5BTEVOR1RIRkFDVE9SICVnIDtcbiIsCi0gICAgICAgICAgICAgbGF5ZXItPmxlZmlMYXllcjo6YW50ZW5uYUxlbmd0aCgpKTsKLQotICAvLyA1LjUgQW50ZW5uYU1vZGVsCi0gIGZvciAoaSA9IDA7IGkgPCBsYXllci0+bGVmaUxheWVyOjpudW1BbnRlbm5hTW9kZWwoKTsgaSsrKSB7Ci0gICAgIGFNb2RlbCA9IGxheWVyLT5sZWZpTGF5ZXI6OmFudGVubmFNb2RlbChpKTsKLQotICAgICBmcHJpbnRmKGZvdXQsICIgIEFOVEVOTkFNT0RFTCAlcyA7XG4iLAotICAgICAgICAgICAgIGFNb2RlbC0+bGVmaUFudGVubmFNb2RlbDo6YW50ZW5uYU94aWRlKCkpOwotICAgICAKLSAgICAgaWYgKGFNb2RlbC0+bGVmaUFudGVubmFNb2RlbDo6aGFzQW50ZW5uYUFyZWFSYXRpbygpKQotICAgICAgICBmcHJpbnRmKGZvdXQsICIgIEFOVEVOTkFBUkVBUkFUSU8gJWcgO1xuIiwKLSAgICAgICAgICAgICAgICBhTW9kZWwtPmxlZmlBbnRlbm5hTW9kZWw6OmFudGVubmFBcmVhUmF0aW8oKSk7Ci0gICAgIGlmIChhTW9kZWwtPmxlZmlBbnRlbm5hTW9kZWw6Omhhc0FudGVubmFEaWZmQXJlYVJhdGlvKCkpCi0gICAgICAgIGZwcmludGYoZm91dCwgIiAgQU5URU5OQURJRkZBUkVBUkFUSU8gJWcgO1xuIiwKLSAgICAgICAgICAgICAgICBhTW9kZWwtPmxlZmlBbnRlbm5hTW9kZWw6OmFudGVubmFEaWZmQXJlYVJhdGlvKCkpOwotICAgICBlbHNlIGlmIChhTW9kZWwtPmxlZmlBbnRlbm5hTW9kZWw6Omhhc0FudGVubmFEaWZmQXJlYVJhdGlvUFdMKCkpIHsKLSAgICAgICAgcHdsID0gYU1vZGVsLT5sZWZpQW50ZW5uYU1vZGVsOjphbnRlbm5hRGlmZkFyZWFSYXRpb1BXTCgpOwotICAgICAgICBmcHJpbnRmKGZvdXQsICIgIEFOVEVOTkFESUZGQVJFQVJBVElPIFBXTCAoICIpOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgcHdsLT5sZWZpQW50ZW5uYVBXTDo6bnVtUFdMKCk7IGorKykKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKCAlZyAlZyApICIsIHB3bC0+bGVmaUFudGVubmFQV0w6OlBXTGRpZmZ1c2lvbihqKSwKLSAgICAgICAgICAgICAgICAgICBwd2wtPmxlZmlBbnRlbm5hUFdMOjpQV0xyYXRpbyhqKSk7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIikgO1xuIik7Ci0gICAgIH0KLSAgICAgaWYgKGFNb2RlbC0+bGVmaUFudGVubmFNb2RlbDo6aGFzQW50ZW5uYUN1bUFyZWFSYXRpbygpKQotICAgICAgICBmcHJpbnRmKGZvdXQsICIgIEFOVEVOTkFDVU1BUkVBUkFUSU8gJWcgO1xuIiwKLSAgICAgICAgICAgICAgICBhTW9kZWwtPmxlZmlBbnRlbm5hTW9kZWw6OmFudGVubmFDdW1BcmVhUmF0aW8oKSk7Ci0gICAgIGlmIChhTW9kZWwtPmxlZmlBbnRlbm5hTW9kZWw6Omhhc0FudGVubmFDdW1EaWZmQXJlYVJhdGlvKCkpCi0gICAgICAgIGZwcmludGYoZm91dCwgIiAgQU5URU5OQUNVTURJRkZBUkVBUkFUSU8gJWdcbiIsCi0gICAgICAgICAgICAgICAgYU1vZGVsLT5sZWZpQW50ZW5uYU1vZGVsOjphbnRlbm5hQ3VtRGlmZkFyZWFSYXRpbygpKTsKLSAgICAgaWYgKGFNb2RlbC0+bGVmaUFudGVubmFNb2RlbDo6aGFzQW50ZW5uYUN1bURpZmZBcmVhUmF0aW9QV0woKSkgewotICAgICAgICBwd2wgPSBhTW9kZWwtPmxlZmlBbnRlbm5hTW9kZWw6OmFudGVubmFDdW1EaWZmQXJlYVJhdGlvUFdMKCk7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIiAgQU5URU5OQUNVTURJRkZBUkVBUkFUSU8gUFdMICggIik7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCBwd2wtPmxlZmlBbnRlbm5hUFdMOjpudW1QV0woKTsgaisrKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIoICVnICVnICkgIiwgcHdsLT5sZWZpQW50ZW5uYVBXTDo6UFdMZGlmZnVzaW9uKGopLAotICAgICAgICAgICAgICAgICAgIHB3bC0+bGVmaUFudGVubmFQV0w6OlBXTHJhdGlvKGopKTsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiKSA7XG4iKTsKLSAgICAgfQotICAgICBpZiAoYU1vZGVsLT5sZWZpQW50ZW5uYU1vZGVsOjpoYXNBbnRlbm5hQXJlYUZhY3RvcigpKSB7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIiAgQU5URU5OQUFSRUFGQUNUT1IgJWcgIiwKLSAgICAgICAgICAgICAgICBhTW9kZWwtPmxlZmlBbnRlbm5hTW9kZWw6OmFudGVubmFBcmVhRmFjdG9yKCkpOwotICAgICAgICBpZiAoYU1vZGVsLT5sZWZpQW50ZW5uYU1vZGVsOjpoYXNBbnRlbm5hQXJlYUZhY3RvckRVTygpKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgIERJRkZVU0VPTkxZICIpOwotICAgICAgICBmcHJpbnRmKGZvdXQsICI7XG4iKTsKLSAgICAgfQotICAgICBpZiAoYU1vZGVsLT5sZWZpQW50ZW5uYU1vZGVsOjpoYXNBbnRlbm5hU2lkZUFyZWFSYXRpbygpKQotICAgICAgICBmcHJpbnRmKGZvdXQsICIgIEFOVEVOTkFTSURFQVJFQVJBVElPICVnIDtcbiIsCi0gICAgICAgICAgICAgICAgYU1vZGVsLT5sZWZpQW50ZW5uYU1vZGVsOjphbnRlbm5hU2lkZUFyZWFSYXRpbygpKTsKLSAgICAgaWYgKGFNb2RlbC0+bGVmaUFudGVubmFNb2RlbDo6aGFzQW50ZW5uYURpZmZTaWRlQXJlYVJhdGlvKCkpCi0gICAgICAgIGZwcmludGYoZm91dCwgIiAgQU5URU5OQURJRkZTSURFQVJFQVJBVElPICVnXG4iLAotICAgICAgICAgICAgICAgIGFNb2RlbC0+bGVmaUFudGVubmFNb2RlbDo6YW50ZW5uYURpZmZTaWRlQXJlYVJhdGlvKCkpOwotICAgICBlbHNlIGlmIChhTW9kZWwtPmxlZmlBbnRlbm5hTW9kZWw6Omhhc0FudGVubmFEaWZmU2lkZUFyZWFSYXRpb1BXTCgpKSB7Ci0gICAgICAgIHB3bCA9IGFNb2RlbC0+bGVmaUFudGVubmFNb2RlbDo6YW50ZW5uYURpZmZTaWRlQXJlYVJhdGlvUFdMKCk7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIiAgQU5URU5OQURJRkZTSURFQVJFQVJBVElPIFBXTCAoICIpOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgcHdsLT5sZWZpQW50ZW5uYVBXTDo6bnVtUFdMKCk7IGorKykKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKCAlZyAlZyApICIsIHB3bC0+bGVmaUFudGVubmFQV0w6OlBXTGRpZmZ1c2lvbihqKSwKLSAgICAgICAgICAgICAgICAgICBwd2wtPmxlZmlBbnRlbm5hUFdMOjpQV0xyYXRpbyhqKSk7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIikgO1xuIik7Ci0gICAgIH0KLSAgICAgaWYgKGFNb2RlbC0+bGVmaUFudGVubmFNb2RlbDo6aGFzQW50ZW5uYUN1bVNpZGVBcmVhUmF0aW8oKSkKLSAgICAgICAgZnByaW50Zihmb3V0LCAiICBBTlRFTk5BQ1VNU0lERUFSRUFSQVRJTyAlZyA7XG4iLAotICAgICAgICAgICAgICAgIGFNb2RlbC0+bGVmaUFudGVubmFNb2RlbDo6YW50ZW5uYUN1bVNpZGVBcmVhUmF0aW8oKSk7Ci0gICAgIGlmIChhTW9kZWwtPmxlZmlBbnRlbm5hTW9kZWw6Omhhc0FudGVubmFDdW1EaWZmU2lkZUFyZWFSYXRpbygpKQotICAgICAgICBmcHJpbnRmKGZvdXQsICIgIEFOVEVOTkFDVU1ESUZGU0lERUFSRUFSQVRJTyAlZ1xuIiwKLSAgICAgICAgICAgICAgICBhTW9kZWwtPmxlZmlBbnRlbm5hTW9kZWw6OmFudGVubmFDdW1EaWZmU2lkZUFyZWFSYXRpbygpKTsKLSAgICAgZWxzZSBpZiAoYU1vZGVsLT5sZWZpQW50ZW5uYU1vZGVsOjpoYXNBbnRlbm5hQ3VtRGlmZlNpZGVBcmVhUmF0aW9QV0woKSkgewotICAgICAgICBwd2wgPSBhTW9kZWwtPmxlZmlBbnRlbm5hTW9kZWw6OmFudGVubmFDdW1EaWZmU2lkZUFyZWFSYXRpb1BXTCgpOwotICAgICAgICBmcHJpbnRmKGZvdXQsICIgIEFOVEVOTkFDVU1ESUZGU0lERUFSRUFSQVRJTyBQV0wgKCAiKTsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IHB3bC0+bGVmaUFudGVubmFQV0w6Om51bVBXTCgpOyBqKyspCi0gICAgICAgICAgIGZwcmludGYoZm91dCwgIiggJWcgJWcgKSAiLCBwd2wtPmxlZmlBbnRlbm5hUFdMOjpQV0xkaWZmdXNpb24oaiksCi0gICAgICAgICAgICAgICAgICAgcHdsLT5sZWZpQW50ZW5uYVBXTDo6UFdMcmF0aW8oaikpOwotICAgICAgICBmcHJpbnRmKGZvdXQsICIpIDtcbiIpOwotICAgICB9Ci0gICAgIGlmIChhTW9kZWwtPmxlZmlBbnRlbm5hTW9kZWw6Omhhc0FudGVubmFTaWRlQXJlYUZhY3RvcigpKSB7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIiAgQU5URU5OQVNJREVBUkVBRkFDVE9SICVnICIsCi0gICAgICAgICAgICAgICAgYU1vZGVsLT5sZWZpQW50ZW5uYU1vZGVsOjphbnRlbm5hU2lkZUFyZWFGYWN0b3IoKSk7Ci0gICAgICAgIGlmIChhTW9kZWwtPmxlZmlBbnRlbm5hTW9kZWw6Omhhc0FudGVubmFTaWRlQXJlYUZhY3RvckRVTygpKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgIERJRkZVU0VPTkxZICIpOwotICAgICAgICBmcHJpbnRmKGZvdXQsICI7XG4iKTsKLSAgICAgfQotICAgICBpZiAoYU1vZGVsLT5sZWZpQW50ZW5uYU1vZGVsOjpoYXNBbnRlbm5hQ3VtUm91dGluZ1BsdXNDdXQoKSkKLSAgICAgICAgZnByaW50Zihmb3V0LCAiICBBTlRFTk5BQ1VNUk9VVElOR1BMVVNDVVQgO1xuIik7Ci0gICAgIGlmIChhTW9kZWwtPmxlZmlBbnRlbm5hTW9kZWw6Omhhc0FudGVubmFHYXRlUGx1c0RpZmYoKSkKLSAgICAgICAgZnByaW50Zihmb3V0LCAiICBBTlRFTk5BR0FURVBMVVNESUZGICVnIDtcbiIsCi0gICAgICAgICAgICAgICAgYU1vZGVsLT5sZWZpQW50ZW5uYU1vZGVsOjphbnRlbm5hR2F0ZVBsdXNEaWZmKCkpOwotICAgICBpZiAoYU1vZGVsLT5sZWZpQW50ZW5uYU1vZGVsOjpoYXNBbnRlbm5hQXJlYU1pbnVzRGlmZigpKQotICAgICAgICBmcHJpbnRmKGZvdXQsICIgIEFOVEVOTkFBUkVBTUlOVVNESUZGICVnIDtcbiIsCi0gICAgICAgICAgICAgICAgYU1vZGVsLT5sZWZpQW50ZW5uYU1vZGVsOjphbnRlbm5hQXJlYU1pbnVzRGlmZigpKTsKLSAgICAgaWYgKGFNb2RlbC0+bGVmaUFudGVubmFNb2RlbDo6aGFzQW50ZW5uYUFyZWFEaWZmUmVkdWNlUFdMKCkpIHsKLSAgICAgICAgcHdsID0gYU1vZGVsLT5sZWZpQW50ZW5uYU1vZGVsOjphbnRlbm5hQXJlYURpZmZSZWR1Y2VQV0woKTsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiICBBTlRFTk5BQVJFQURJRkZSRURVQ0VQV0wgKCAiKTsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IHB3bC0+bGVmaUFudGVubmFQV0w6Om51bVBXTCgpOyBqKyspCi0gICAgICAgICAgIGZwcmludGYoZm91dCwgIiggJWcgJWcgKSAiLCBwd2wtPmxlZmlBbnRlbm5hUFdMOjpQV0xkaWZmdXNpb24oaiksCi0gICAgICAgICAgICAgICAgICAgcHdsLT5sZWZpQW50ZW5uYVBXTDo6UFdMcmF0aW8oaikpOwotICAgICAgICBmcHJpbnRmKGZvdXQsICIpIDtcbiIpOwotICAgICB9Ci0gIH0KLQotICBpZiAobGF5ZXItPmxlZmlMYXllcjo6bnVtQWNjdXJyZW50RGVuc2l0eSgpKSB7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBsYXllci0+bGVmaUxheWVyOjpudW1BY2N1cnJlbnREZW5zaXR5KCk7IGkrKykgewotICAgICAgICAgZGVuc2l0eSA9IGxheWVyLT5sZWZpTGF5ZXI6OmFjY3VycmVudChpKTsKLSAgICAgICAgIGZwcmludGYoZm91dCwgIiAgQUNDVVJSRU5UREVOU0lUWSAlcyIsIGRlbnNpdHktPnR5cGUoKSk7IAotICAgICAgICAgaWYgKGRlbnNpdHktPmhhc09uZUVudHJ5KCkpCi0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVnIDtcbiIsIGRlbnNpdHktPm9uZUVudHJ5KCkpOyAKLSAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgICAgICAgICAgaWYgKGRlbnNpdHktPm51bUZyZXF1ZW5jeSgpKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICAgIEZSRVFVRU5DWSIpOwotICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBkZW5zaXR5LT5udW1GcmVxdWVuY3koKTsgaisrKQotICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAlZyIsIGRlbnNpdHktPmZyZXF1ZW5jeShqKSk7Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIDtcbiIpOyAgICAKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgaWYgKGRlbnNpdHktPm51bUN1dGFyZWFzKCkpIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICAgQ1VUQVJFQSIpOwotICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBkZW5zaXR5LT5udW1DdXRhcmVhcygpOyBqKyspCi0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVnIiwgZGVuc2l0eS0+Y3V0QXJlYShqKSk7Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIDtcbiIpOyAgICAKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgaWYgKGRlbnNpdHktPm51bVdpZHRocygpKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICAgIFdJRFRIIik7Ci0gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGRlbnNpdHktPm51bVdpZHRocygpOyBqKyspCi0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVnIiwgZGVuc2l0eS0+d2lkdGgoaikpOwotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiA7XG4iKTsgICAgCi0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGlmIChkZW5zaXR5LT5udW1UYWJsZUVudHJpZXMoKSkgewotICAgICAgICAgICAgICAgIGsgPSA1OwotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgICBUQUJMRUVOVFJJRVMiKTsKLSAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZGVuc2l0eS0+bnVtVGFibGVFbnRyaWVzKCk7IGorKykKLSAgICAgICAgICAgICAgICAgICBpZiAoayA+IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiAgICAgJWciLCBkZW5zaXR5LT50YWJsZUVudHJ5KGopKTsKLSAgICAgICAgICAgICAgICAgICAgICBrID0gMTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAlZyIsIGRlbnNpdHktPnRhYmxlRW50cnkoaikpOwotICAgICAgICAgICAgICAgICAgICAgIGsrKzsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIDtcbiIpOyAgICAKLSAgICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgIH0KLSAgfQotICBpZiAobGF5ZXItPmxlZmlMYXllcjo6bnVtRGNjdXJyZW50RGVuc2l0eSgpKSB7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBsYXllci0+bGVmaUxheWVyOjpudW1EY2N1cnJlbnREZW5zaXR5KCk7IGkrKykgewotICAgICAgICAgZGVuc2l0eSA9IGxheWVyLT5sZWZpTGF5ZXI6OmRjY3VycmVudChpKTsKLSAgICAgICAgIGZwcmludGYoZm91dCwgIiAgRENDVVJSRU5UREVOU0lUWSAlcyIsIGRlbnNpdHktPnR5cGUoKSk7IAotICAgICAgICAgaWYgKGRlbnNpdHktPmhhc09uZUVudHJ5KCkpCi0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVnIDtcbiIsIGRlbnNpdHktPm9uZUVudHJ5KCkpOyAKLSAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgICAgICAgICAgaWYgKGRlbnNpdHktPm51bUN1dGFyZWFzKCkpIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICAgQ1VUQVJFQSIpOwotICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBkZW5zaXR5LT5udW1DdXRhcmVhcygpOyBqKyspCi0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVnIiwgZGVuc2l0eS0+Y3V0QXJlYShqKSk7Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIDtcbiIpOyAgICAKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgaWYgKGRlbnNpdHktPm51bVdpZHRocygpKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICAgIFdJRFRIIik7Ci0gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGRlbnNpdHktPm51bVdpZHRocygpOyBqKyspCi0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVnIiwgZGVuc2l0eS0+d2lkdGgoaikpOwotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiA7XG4iKTsgICAgCi0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGlmIChkZW5zaXR5LT5udW1UYWJsZUVudHJpZXMoKSkgewotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgICBUQUJMRUVOVFJJRVMiKTsKLSAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZGVuc2l0eS0+bnVtVGFibGVFbnRyaWVzKCk7IGorKykKLSAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgJWciLCBkZW5zaXR5LT50YWJsZUVudHJ5KGopKTsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgO1xuIik7ICAgIAotICAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgfQotICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IGxheWVyLT5sZWZpTGF5ZXI6Om51bVNwYWNpbmdUYWJsZSgpOyBpKyspIHsKLSAgICAgc3BUYWJsZSA9IGxheWVyLT5sZWZpTGF5ZXI6OnNwYWNpbmdUYWJsZShpKTsKLSAgICAgZnByaW50Zihmb3V0LCAiICAgU1BBQ0lOR1RBQkxFXG4iKTsKLSAgICAgaWYgKHNwVGFibGUtPmxlZmlTcGFjaW5nVGFibGU6OmlzSW5mbHVlbmNlKCkpIHsKLSAgICAgICAgaW5mbHVlbmNlID0gc3BUYWJsZS0+bGVmaVNwYWNpbmdUYWJsZTo6aW5mbHVlbmNlKCk7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIiAgICAgIElORkxVRU5DRSIpOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgaW5mbHVlbmNlLT5sZWZpSW5mbHVlbmNlOjpudW1JbmZsdWVuY2VFbnRyeSgpOyBqKyspIHsKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4gICAgICAgICAgV0lEVEggJWcgV0lUSElOICVnIFNQQUNJTkcgJWciLAotICAgICAgICAgICAgICAgICAgIGluZmx1ZW5jZS0+bGVmaUluZmx1ZW5jZTo6d2lkdGgoaiksCi0gICAgICAgICAgICAgICAgICAgaW5mbHVlbmNlLT5sZWZpSW5mbHVlbmNlOjpkaXN0YW5jZShqKSwKLSAgICAgICAgICAgICAgICAgICBpbmZsdWVuY2UtPmxlZmlJbmZsdWVuY2U6OnNwYWNpbmcoaikpOwotICAgICAgICB9ICAgCi0gICAgICAgIGZwcmludGYoZm91dCwgIiA7XG4iKTsKLSAgICAgfSBlbHNlIGlmIChzcFRhYmxlLT5sZWZpU3BhY2luZ1RhYmxlOjppc1BhcmFsbGVsKCkpewotICAgICAgICBwYXJhbGxlbCA9IHNwVGFibGUtPmxlZmlTcGFjaW5nVGFibGU6OnBhcmFsbGVsKCk7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIiAgICAgIFBBUkFMTEVMUlVOTEVOR1RIIik7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCBwYXJhbGxlbC0+bGVmaVBhcmFsbGVsOjpudW1MZW5ndGgoKTsgaisrKSB7Ci0gICAgICAgICAgIGZwcmludGYoZm91dCwgIiAlZyIsIHBhcmFsbGVsLT5sZWZpUGFyYWxsZWw6Omxlbmd0aChqKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IHBhcmFsbGVsLT5sZWZpUGFyYWxsZWw6Om51bVdpZHRoKCk7IGorKykgewotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiAgICAgICAgICBXSURUSCAlZyIsCi0gICAgICAgICAgICAgICAgICAgcGFyYWxsZWwtPmxlZmlQYXJhbGxlbDo6d2lkdGgoaikpOwotICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcGFyYWxsZWwtPmxlZmlQYXJhbGxlbDo6bnVtTGVuZ3RoKCk7IGsrKykgewotICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgJWciLCBwYXJhbGxlbC0+bGVmaVBhcmFsbGVsOjp3aWR0aFNwYWNpbmcoaiwgaykpOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZnByaW50Zihmb3V0LCAiIDtcbiIpOwotICAgICB9IGVsc2UgeyAgICAvLyA1LjcgVFdPV0lEVEhTCi0gICAgICAgIHR3b1dpZHRocyA9IHNwVGFibGUtPmxlZmlTcGFjaW5nVGFibGU6OnR3b1dpZHRocygpOwotICAgICAgICBmcHJpbnRmKGZvdXQsICIgICAgICBUV09XSURUSFMiKTsgCi0gICAgICAgIGZvciAoaiA9IDA7IGogPCB0d29XaWR0aHMtPmxlZmlUd29XaWR0aHM6Om51bVdpZHRoKCk7IGorKykgewotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiAgICAgICAgICBXSURUSCAlZyAiLAotICAgICAgICAgICAgICAgICAgIHR3b1dpZHRocy0+bGVmaVR3b1dpZHRoczo6d2lkdGgoaikpOwotICAgICAgICAgICBpZiAodHdvV2lkdGhzLT5sZWZpVHdvV2lkdGhzOjpoYXNXaWR0aFBSTChqKSkKLSAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiUFJMICVnICIsIHR3b1dpZHRocy0+bGVmaVR3b1dpZHRoczo6d2lkdGhQUkwoaikpOwotICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgdHdvV2lkdGhzLT5sZWZpVHdvV2lkdGhzOjpudW1XaWR0aFNwYWNpbmcoaik7IGsrKykKLSAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJWcgIix0d29XaWR0aHMtPmxlZmlUd29XaWR0aHM6OndpZHRoU3BhY2luZyhqLCBrKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZnByaW50Zihmb3V0LCAiIDtcbiIpOwotICAgICB9Ci0gIH0KLQotICBwcm9wTnVtID0gbGF5ZXItPmxlZmlMYXllcjo6bnVtUHJvcHMoKTsKLSAgaWYgKHByb3BOdW0gPiAwKSB7Ci0gICAgIGZwcmludGYoZm91dCwgIiAgUFJPUEVSVFkgIik7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBwcm9wTnVtOyBpKyspIHsKLSAgICAgICAgLy8gdmFsdWUgY2FuIGVpdGhlciBiZSBhIHN0cmluZyBvciBudW1iZXIKLSAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgbGF5ZXItPmxlZmlMYXllcjo6cHJvcE5hbWUoaSkpOwotICAgICAgICBpZiAobGF5ZXItPmxlZmlMYXllcjo6cHJvcElzTnVtYmVyKGkpKQotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJWcgIiwgbGF5ZXItPmxlZmlMYXllcjo6cHJvcE51bWJlcihpKSk7Ci0gICAgICAgIGlmIChsYXllci0+bGVmaUxheWVyOjpwcm9wSXNTdHJpbmcoaSkpIAotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgbGF5ZXItPmxlZmlMYXllcjo6cHJvcFZhbHVlKGkpKTsKLSAgICAgICAgcFR5cGUgPSBsYXllci0+bGVmaUxheWVyOjpwcm9wVHlwZShpKTsKLSAgICAgICAgc3dpdGNoIChwVHlwZSkgewotICAgICAgICAgICBjYXNlICdSJzogZnByaW50Zihmb3V0LCAiUkVBTCAiKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICBjYXNlICdJJzogZnByaW50Zihmb3V0LCAiSU5URUdFUiAiKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICBjYXNlICdTJzogZnByaW50Zihmb3V0LCAiU1RSSU5HICIpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIGNhc2UgJ1EnOiBmcHJpbnRmKGZvdXQsICJRVU9URVNUUklORyAiKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICBjYXNlICdOJzogZnByaW50Zihmb3V0LCAiTlVNQkVSICIpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gCi0gICAgIH0KLSAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0gIH0KLSAgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Omhhc0RpYWdNaW5FZGdlTGVuZ3RoKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgRElBR01JTkVER0VMRU5HVEggJWcgO1xuIiwKLSAgICAgICAgICAgICBsYXllci0+bGVmaUxheWVyOjpkaWFnTWluRWRnZUxlbmd0aCgpKTsKLSAgaWYgKGxheWVyLT5sZWZpTGF5ZXI6Om51bU1pblNpemUoKSkgewotICAgICBmcHJpbnRmKGZvdXQsICIgIE1JTlNJWkUgIik7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBsYXllci0+bGVmaUxheWVyOjpudW1NaW5TaXplKCk7IGkrKykgewotICAgICAgICBmcHJpbnRmKGZvdXQsICIlZyAlZyAiLCBsYXllci0+bGVmaUxheWVyOjptaW5TaXplV2lkdGgoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLT5sZWZpTGF5ZXI6Om1pblNpemVMZW5ndGgoaSkpOyAKLSAgICAgfQotICAgICBmcHJpbnRmKGZvdXQsICI7XG4iKTsKLSAgfQotCi0gIGZwcmludGYoZm91dCwgIkVORCAlc1xuIiwgbGF5ZXItPmxlZmlMYXllcjo6bmFtZSgpKTsgCi0KLSAgLy8gU2V0IGl0IHRvIGNhc2Ugc2Vuc2l0aXZlIGZyb20gaGVyZSBvbgotICBsZWZyU2V0Q2FzZVNlbnNpdGl2aXR5KDEpOwotCi0gIHJldHVybiAwOwotfQotCi1pbnQgbWFjcm9CZWdpbkNCKGxlZnJDYWxsYmFja1R5cGVfZSBjLCBjb25zdCBjaGFyKiBtYWNyb05hbWUsIGxlZmlVc2VyRGF0YSkgewotICBjaGVja1R5cGUoYyk7Ci0gIC8vIGlmICgobG9uZyl1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGZwcmludGYoZm91dCwgIk1BQ1JPICVzXG4iLCAgbWFjcm9OYW1lKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBtYWNyb0ZpeGVkTWFza0NCKGxlZnJDYWxsYmFja1R5cGVfZSBjLCBpbnQsIAotICAgICAgICAgICAgICAgICAgICAgbGVmaVVzZXJEYXRhKSB7Ci0gIGNoZWNrVHlwZShjKTsKLQotICByZXR1cm4gMDsKLX0KLQotaW50IG1hY3JvQ2xhc3NUeXBlQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGNvbnN0IGNoYXIqIG1hY3JvQ2xhc3NUeXBlLAotICAgICAgICAgICAgICAgICAgICAgbGVmaVVzZXJEYXRhKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgLy8gaWYgKChsb25nKXVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgZnByaW50Zihmb3V0LCAiTUFDUk8gQ0xBU1MgJXNcbiIsICBtYWNyb0NsYXNzVHlwZSk7Ci0gIHJldHVybiAwOwotfQotCi1pbnQgbWFjcm9PcmlnaW5DQihsZWZyQ2FsbGJhY2tUeXBlX2UgYywgbGVmaU51bSwKLSAgICAgICAgICAgICAgICAgICAgIGxlZmlVc2VyRGF0YSkgewotICBjaGVja1R5cGUoYyk7Ci0gIC8vIGlmICgobG9uZyl1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIC8vIGZwcmludGYoZm91dCwgIiAgT1JJR0lOICggJWcgJWcgKSA7XG4iLCBtYWNyb051bS54LCBtYWNyb051bS55KTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBtYWNyb1NpemVDQihsZWZyQ2FsbGJhY2tUeXBlX2UgYywgbGVmaU51bSwKLSAgICAgICAgICAgICAgICAgICAgIGxlZmlVc2VyRGF0YSkgewotICBjaGVja1R5cGUoYyk7Ci0gIC8vIGlmICgobG9uZyl1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIC8vIGZwcmludGYoZm91dCwgIiAgU0laRSAlZyBCWSAlZyA7XG4iLCBtYWNyb051bS54LCBtYWNyb051bS55KTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBtYWNyb0NCKGxlZnJDYWxsYmFja1R5cGVfZSBjLCBsZWZpTWFjcm8qIG1hY3JvLCBsZWZpVXNlckRhdGEpIHsKLSAgbGVmaVNpdGVQYXR0ZXJuKiBwYXR0ZXJuOwotICBpbnQgICAgICAgICAgICAgIHByb3BOdW0sIGksIGhhc1BydFN5bSA9IDA7Ci0KLSAgY2hlY2tUeXBlKGMpOwotICAvLyBpZiAoKGxvbmcpdWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBpZiAobWFjcm8tPmxlZmlNYWNybzo6aGFzQ2xhc3MoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICBDTEFTUyAlcyA7XG4iLCBtYWNyby0+bGVmaU1hY3JvOjptYWNyb0NsYXNzKCkpOwotICBpZiAobWFjcm8tPmxlZmlNYWNybzo6aXNGaXhlZE1hc2soKSkKLSAgICAgIGZwcmludGYoZm91dCwgIiAgRklYRURNQVNLIDtcbiIpOwotICBpZiAobWFjcm8tPmxlZmlNYWNybzo6aGFzRUVRKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgRUVRICVzIDtcbiIsIG1hY3JvLT5sZWZpTWFjcm86OkVFUSgpKTsKLSAgaWYgKG1hY3JvLT5sZWZpTWFjcm86Omhhc0xFUSgpKQotICAgICBmcHJpbnRmKGZvdXQsICIgIExFUSAlcyA7XG4iLCBtYWNyby0+bGVmaU1hY3JvOjpMRVEoKSk7Ci0gIGlmIChtYWNyby0+bGVmaU1hY3JvOjpoYXNTb3VyY2UoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICBTT1VSQ0UgJXMgO1xuIiwgbWFjcm8tPmxlZmlNYWNybzo6c291cmNlKCkpOwotICBpZiAobWFjcm8tPmxlZmlNYWNybzo6aGFzWFN5bW1ldHJ5KCkpIHsKLSAgICAgZnByaW50Zihmb3V0LCAiICBTWU1NRVRSWSBYICIpOwotICAgICBoYXNQcnRTeW0gPSAxOwotICB9Ci0gIGlmIChtYWNyby0+bGVmaU1hY3JvOjpoYXNZU3ltbWV0cnkoKSkgeyAgIC8vIHByaW50IFggWSAmIFI5MCBpbiBvbmUgbGluZQotICAgICBpZiAoIWhhc1BydFN5bSkgewotICAgICAgICBmcHJpbnRmKGZvdXQsICIgIFNZTU1FVFJZIFkgIik7Ci0gICAgICAgIGhhc1BydFN5bSA9IDE7Ci0gICAgIH0KLSAgICAgZWxzZQotICAgICAgICBmcHJpbnRmKGZvdXQsICJZICIpOwotICB9Ci0gIGlmIChtYWNyby0+bGVmaU1hY3JvOjpoYXM5MFN5bW1ldHJ5KCkpIHsKLSAgICAgaWYgKCFoYXNQcnRTeW0pIHsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiICBTWU1NRVRSWSBSOTAgIik7Ci0gICAgICAgIGhhc1BydFN5bSA9IDE7Ci0gICAgIH0KLSAgICAgZWxzZQotICAgICAgICBmcHJpbnRmKGZvdXQsICJSOTAgIik7Ci0gIH0KLSAgaWYgKGhhc1BydFN5bSkgewotICAgICBmcHJpbnRmIChmb3V0LCAiO1xuIik7Ci0gICAgIGhhc1BydFN5bSA9IDA7Ci0gIH0KLSAgaWYgKG1hY3JvLT5sZWZpTWFjcm86Omhhc1NpdGVOYW1lKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgU0lURSAlcyA7XG4iLCBtYWNyby0+bGVmaU1hY3JvOjpzaXRlTmFtZSgpKTsKLSAgaWYgKG1hY3JvLT5sZWZpTWFjcm86Omhhc1NpdGVQYXR0ZXJuKCkpIHsKLSAgICAgZm9yIChpID0gMDsgaSA8IG1hY3JvLT5sZWZpTWFjcm86Om51bVNpdGVQYXR0ZXJuKCk7IGkrKyApIHsKLSAgICAgICBwYXR0ZXJuID0gbWFjcm8tPmxlZmlNYWNybzo6c2l0ZVBhdHRlcm4oaSk7Ci0gICAgICAgaWYgKHBhdHRlcm4tPmxlZmlTaXRlUGF0dGVybjo6aGFzU3RlcFBhdHRlcm4oKSkgewotICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgU0lURSAlcyAlZyAlZyAlcyBETyAlZyBCWSAlZyBTVEVQICVnICVnIDtcbiIsCi0gICAgICAgICAgICAgICAgcGF0dGVybi0+bGVmaVNpdGVQYXR0ZXJuOjpuYW1lKCksIHBhdHRlcm4tPmxlZmlTaXRlUGF0dGVybjo6eCgpLAotICAgICAgICAgICAgICAgIHBhdHRlcm4tPmxlZmlTaXRlUGF0dGVybjo6eSgpLAotICAgICAgICAgICAgICAgIG9yaWVudFN0cihwYXR0ZXJuLT5sZWZpU2l0ZVBhdHRlcm46Om9yaWVudCgpKSwKLSAgICAgICAgICAgICAgICBwYXR0ZXJuLT5sZWZpU2l0ZVBhdHRlcm46OnhTdGFydCgpLAotICAgICAgICAgICAgICAgIHBhdHRlcm4tPmxlZmlTaXRlUGF0dGVybjo6eVN0YXJ0KCksCi0gICAgICAgICAgICAgICAgcGF0dGVybi0+bGVmaVNpdGVQYXR0ZXJuOjp4U3RlcCgpLAotICAgICAgICAgICAgICAgIHBhdHRlcm4tPmxlZmlTaXRlUGF0dGVybjo6eVN0ZXAoKSk7Ci0gICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgIFNJVEUgJXMgJWcgJWcgJXMgO1xuIiwKLSAgICAgICAgICAgICAgICBwYXR0ZXJuLT5sZWZpU2l0ZVBhdHRlcm46Om5hbWUoKSwgcGF0dGVybi0+bGVmaVNpdGVQYXR0ZXJuOjp4KCksCi0gICAgICAgICAgICAgICAgcGF0dGVybi0+bGVmaVNpdGVQYXR0ZXJuOjp5KCksCi0gICAgICAgICAgICAgICAgb3JpZW50U3RyKHBhdHRlcm4tPmxlZmlTaXRlUGF0dGVybjo6b3JpZW50KCkpKTsKLSAgICAgICB9Ci0gICAgIH0KLSAgfQotICBpZiAobWFjcm8tPmxlZmlNYWNybzo6aGFzU2l6ZSgpKQotICAgICBmcHJpbnRmKGZvdXQsICIgIFNJWkUgJWcgQlkgJWcgO1xuIiwgbWFjcm8tPmxlZmlNYWNybzo6c2l6ZVgoKSwKLSAgICAgICAgICAgICBtYWNyby0+bGVmaU1hY3JvOjpzaXplWSgpKTsKLQotICBpZiAobWFjcm8tPmxlZmlNYWNybzo6aGFzRm9yZWlnbigpKSB7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBtYWNyby0+bGVmaU1hY3JvOjpudW1Gb3JlaWducygpOyBpKyspIHsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiICBGT1JFSUdOICVzICIsIG1hY3JvLT5sZWZpTWFjcm86OmZvcmVpZ25OYW1lKGkpKTsKLSAgICAgICAgaWYgKG1hY3JvLT5sZWZpTWFjcm86Omhhc0ZvcmVpZ25Qb2ludChpKSkgewotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIoICVnICVnICkgIiwgbWFjcm8tPmxlZmlNYWNybzo6Zm9yZWlnblgoaSksCi0gICAgICAgICAgICAgICAgICAgbWFjcm8tPmxlZmlNYWNybzo6Zm9yZWlnblkoaSkpOwotICAgICAgICAgICBpZiAobWFjcm8tPmxlZmlNYWNybzo6aGFzRm9yZWlnbk9yaWVudChpKSkKLSAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgbWFjcm8tPmxlZmlNYWNybzo6Zm9yZWlnbk9yaWVudFN0cihpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0gICAgIH0KLSAgfQotICBpZiAobWFjcm8tPmxlZmlNYWNybzo6aGFzT3JpZ2luKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgT1JJR0lOICggJWcgJWcgKSA7XG4iLCBtYWNyby0+bGVmaU1hY3JvOjpvcmlnaW5YKCksCi0gICAgICAgICAgICAgbWFjcm8tPmxlZmlNYWNybzo6b3JpZ2luWSgpKTsKLSAgaWYgKG1hY3JvLT5sZWZpTWFjcm86Omhhc1Bvd2VyKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgUE9XRVIgJWcgO1xuIiwgbWFjcm8tPmxlZmlNYWNybzo6cG93ZXIoKSk7Ci0gIHByb3BOdW0gPSBtYWNyby0+bGVmaU1hY3JvOjpudW1Qcm9wZXJ0aWVzKCk7Ci0gIGlmIChwcm9wTnVtID4gMCkgewotICAgICBmcHJpbnRmKGZvdXQsICIgIFBST1BFUlRZICIpOwotICAgICBmb3IgKGkgPSAwOyBpIDwgcHJvcE51bTsgaSsrKSB7Ci0gICAgICAgIC8vIHZhbHVlIGNhbiBlaXRoZXIgYmUgYSBzdHJpbmcgb3IgbnVtYmVyCi0gICAgICAgIGlmIChtYWNyby0+bGVmaU1hY3JvOjpwcm9wVmFsdWUoaSkpIHsKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgJXMgIiwgbWFjcm8tPmxlZmlNYWNybzo6cHJvcE5hbWUoaSksCi0gICAgICAgICAgICAgICAgICAgbWFjcm8tPmxlZmlNYWNybzo6cHJvcFZhbHVlKGkpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzICVnICIsIG1hY3JvLT5sZWZpTWFjcm86OnByb3BOYW1lKGkpLAotICAgICAgICAgICAgICAgICAgIG1hY3JvLT5sZWZpTWFjcm86OnByb3BOdW0oaSkpOwotCi0gICAgICAgIHN3aXRjaCAobWFjcm8tPmxlZmlNYWNybzo6cHJvcFR5cGUoaSkpIHsKLSAgICAgICAgICAgY2FzZSAnUic6IGZwcmludGYoZm91dCwgIlJFQUwgIik7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgY2FzZSAnSSc6IGZwcmludGYoZm91dCwgIklOVEVHRVIgIik7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgY2FzZSAnUyc6IGZwcmludGYoZm91dCwgIlNUUklORyAiKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICBjYXNlICdRJzogZnByaW50Zihmb3V0LCAiUVVPVEVTVFJJTkcgIik7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgY2FzZSAnTic6IGZwcmludGYoZm91dCwgIk5VTUJFUiAiKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IAotICAgICB9Ci0gICAgIGZwcmludGYoZm91dCwgIjtcbiIpOwotICB9Ci0gIC8vZnByaW50Zihmb3V0LCAiRU5EICVzXG4iLCBtYWNyby0+bGVmaU1hY3JvOjpuYW1lKCkpOwotICByZXR1cm4gMDsKLX0KLQotaW50IG1hY3JvRW5kQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGNvbnN0IGNoYXIqIG1hY3JvTmFtZSwgbGVmaVVzZXJEYXRhKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgLy8gaWYgKChsb25nKXVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgZnByaW50Zihmb3V0LCAiRU5EICVzXG4iLCBtYWNyb05hbWUpOwotICByZXR1cm4gMDsKLX0KLQotaW50IG1hbnVmYWN0dXJpbmdDQihsZWZyQ2FsbGJhY2tUeXBlX2UgYywgZG91YmxlIG51bSwgbGVmaVVzZXJEYXRhKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgLy8gaWYgKChsb25nKXVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgZnByaW50Zihmb3V0LCAiTUFOVUZBQ1RVUklOR0dSSUQgJWcgO1xuIiwgbnVtKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBtYXhTdGFja1ZpYUNCKGxlZnJDYWxsYmFja1R5cGVfZSBjLCBsZWZpTWF4U3RhY2tWaWEqIG1heFN0YWNrLAotICBsZWZpVXNlckRhdGEpIHsKLSAgY2hlY2tUeXBlKGMpOwotICAvLyBpZiAoKGxvbmcpdWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBmcHJpbnRmKGZvdXQsICJNQVhWSUFTVEFDSyAlZCAiLCBtYXhTdGFjay0+bGVmaU1heFN0YWNrVmlhOjptYXhTdGFja1ZpYSgpKTsKLSAgaWYgKG1heFN0YWNrLT5sZWZpTWF4U3RhY2tWaWE6Omhhc01heFN0YWNrVmlhUmFuZ2UoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiUkFOR0UgJXMgJXMgIiwKLSAgICAgICAgICAgICBtYXhTdGFjay0+bGVmaU1heFN0YWNrVmlhOjptYXhTdGFja1ZpYUJvdHRvbUxheWVyKCksCi0gICAgICAgICAgICAgbWF4U3RhY2stPmxlZmlNYXhTdGFja1ZpYTo6bWF4U3RhY2tWaWFUb3BMYXllcigpKTsKLSAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0gIHJldHVybiAwOwotfQotCi1pbnQgbWluRmVhdHVyZUNCKGxlZnJDYWxsYmFja1R5cGVfZSBjLCBsZWZpTWluRmVhdHVyZSogbWluLCBsZWZpVXNlckRhdGEpIHsKLSAgY2hlY2tUeXBlKGMpOwotICAvLyBpZiAoKGxvbmcpdWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBmcHJpbnRmKGZvdXQsICJNSU5GRUFUVVJFICVnICVnIDtcbiIsIG1pbi0+bGVmaU1pbkZlYXR1cmU6Om9uZSgpLAotICAgICAgICAgIG1pbi0+bGVmaU1pbkZlYXR1cmU6OnR3bygpKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBub25EZWZhdWx0Q0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGxlZmlOb25EZWZhdWx0KiBkZWYsIGxlZmlVc2VyRGF0YSkgewotICBpbnQgICAgICAgICAgaTsKLSAgbGVmaVZpYSogICAgIHZpYTsKLSAgbGVmaVNwYWNpbmcqIHNwYWNpbmc7Ci0KLSAgY2hlY2tUeXBlKGMpOwotICAvLyBpZiAoKGxvbmcpdWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBmcHJpbnRmKGZvdXQsICJOT05ERUZBVUxUUlVMRSAlc1xuIiwgZGVmLT5sZWZpTm9uRGVmYXVsdDo6bmFtZSgpKTsKLSAgaWYgKGRlZi0+bGVmaU5vbkRlZmF1bHQ6Omhhc0hhcmRzcGFjaW5nKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgSEFSRFNQQUNJTkcgO1xuIik7Ci0gIGZvciAoaSA9IDA7IGkgPCBkZWYtPmxlZmlOb25EZWZhdWx0OjpudW1MYXllcnMoKTsgaSsrKSB7Ci0gICAgIGZwcmludGYoZm91dCwgIiAgTEFZRVIgJXNcbiIsIGRlZi0+bGVmaU5vbkRlZmF1bHQ6OmxheWVyTmFtZShpKSk7Ci0gICAgIGlmIChkZWYtPmxlZmlOb25EZWZhdWx0OjpoYXNMYXllcldpZHRoKGkpKQotICAgICAgICBmcHJpbnRmKGZvdXQsICIgICAgV0lEVEggJWcgO1xuIiwgZGVmLT5sZWZpTm9uRGVmYXVsdDo6bGF5ZXJXaWR0aChpKSk7Ci0gICAgIGlmIChkZWYtPmxlZmlOb25EZWZhdWx0OjpoYXNMYXllclNwYWNpbmcoaSkpCi0gICAgICAgIGZwcmludGYoZm91dCwgIiAgICBTUEFDSU5HICVnIDtcbiIsCi0gICAgICAgICAgICAgICAgZGVmLT5sZWZpTm9uRGVmYXVsdDo6bGF5ZXJTcGFjaW5nKGkpKTsKLSAgICAgaWYgKGRlZi0+bGVmaU5vbkRlZmF1bHQ6Omhhc0xheWVyRGlhZ1dpZHRoKGkpKQotICAgICAgICBmcHJpbnRmKGZvdXQsICIgICAgRElBR1dJRFRIICVnIDtcbiIsCi0gICAgICAgICAgICAgICAgZGVmLT5sZWZpTm9uRGVmYXVsdDo6bGF5ZXJEaWFnV2lkdGgoaSkpOwotICAgICBpZiAoZGVmLT5sZWZpTm9uRGVmYXVsdDo6aGFzTGF5ZXJXaXJlRXh0ZW5zaW9uKGkpKQotICAgICAgICBmcHJpbnRmKGZvdXQsICIgICAgV0lSRUVYVEVOU0lPTiAlZyA7XG4iLAotICAgICAgICAgICAgICAgIGRlZi0+bGVmaU5vbkRlZmF1bHQ6OmxheWVyV2lyZUV4dGVuc2lvbihpKSk7Ci0gICAgIGlmIChkZWYtPmxlZmlOb25EZWZhdWx0OjpoYXNMYXllclJlc2lzdGFuY2UoaSkpCi0gICAgICAgIGZwcmludGYoZm91dCwgIiAgICBSRVNJU1RBTkNFIFJQRVJTUSAlZyA7XG4iLAotICAgICAgICAgICAgICAgIGRlZi0+bGVmaU5vbkRlZmF1bHQ6OmxheWVyUmVzaXN0YW5jZShpKSk7Ci0gICAgIGlmIChkZWYtPmxlZmlOb25EZWZhdWx0OjpoYXNMYXllckNhcGFjaXRhbmNlKGkpKQotICAgICAgICBmcHJpbnRmKGZvdXQsICIgICAgQ0FQQUNJVEFOQ0UgQ1BFUlNRRElTVCAlZyA7XG4iLAotICAgICAgICAgICAgICAgIGRlZi0+bGVmaU5vbkRlZmF1bHQ6OmxheWVyQ2FwYWNpdGFuY2UoaSkpOwotICAgICBpZiAoZGVmLT5sZWZpTm9uRGVmYXVsdDo6aGFzTGF5ZXJFZGdlQ2FwKGkpKQotICAgICAgICBmcHJpbnRmKGZvdXQsICIgICAgRURHRUNBUEFDSVRBTkNFICVnIDtcbiIsCi0gICAgICAgICAgICAgICAgZGVmLT5sZWZpTm9uRGVmYXVsdDo6bGF5ZXJFZGdlQ2FwKGkpKTsKLSAgICAgZnByaW50Zihmb3V0LCAiICBFTkQgJXNcbiIsIGRlZi0+bGVmaU5vbkRlZmF1bHQ6OmxheWVyTmFtZShpKSk7Ci0gIH0KLQotICAvLyBoYW5kbGUgdmlhIGluIG5vbmRlZmF1bHRydWxlCi0gIGZvciAoaSA9IDA7IGkgPCBkZWYtPmxlZmlOb25EZWZhdWx0OjpudW1WaWFzKCk7IGkrKykgewotICAgICB2aWEgPSBkZWYtPmxlZmlOb25EZWZhdWx0Ojp2aWFSdWxlKGkpOwotICAgICBsZWZWaWEodmlhKTsKLSAgfQotCi0gIC8vIGhhbmRsZSBzcGFjaW5nIGluIG5vbmRlZmF1bHRydWxlCi0gIGZvciAoaSA9IDA7IGkgPCBkZWYtPmxlZmlOb25EZWZhdWx0OjpudW1TcGFjaW5nUnVsZXMoKTsgaSsrKSB7Ci0gICAgIHNwYWNpbmcgPSBkZWYtPmxlZmlOb25EZWZhdWx0OjpzcGFjaW5nUnVsZShpKTsKLSAgICAgbGVmU3BhY2luZyhzcGFjaW5nKTsKLSAgfQotCi0gIC8vIGhhbmRsZSB1c2V2aWEKLSAgZm9yIChpID0gMDsgaSA8IGRlZi0+bGVmaU5vbkRlZmF1bHQ6Om51bVVzZVZpYSgpOyBpKyspCi0gICAgIGZwcmludGYoZm91dCwgIiAgICBVU0VWSUEgJXMgO1xuIiwgZGVmLT5sZWZpTm9uRGVmYXVsdDo6dmlhTmFtZShpKSk7Ci0KLSAgLy8gaGFuZGxlIHVzZXZpYXJ1bGUKLSAgZm9yIChpID0gMDsgaSA8IGRlZi0+bGVmaU5vbkRlZmF1bHQ6Om51bVVzZVZpYVJ1bGUoKTsgaSsrKQotICAgICBmcHJpbnRmKGZvdXQsICIgICAgVVNFVklBUlVMRSAlcyA7XG4iLAotICAgICAgICAgICAgIGRlZi0+bGVmaU5vbkRlZmF1bHQ6OnZpYVJ1bGVOYW1lKGkpKTsKLQotICAvLyBoYW5kbGUgbWluY3V0cwotICBmb3IgKGkgPSAwOyBpIDwgZGVmLT5sZWZpTm9uRGVmYXVsdDo6bnVtTWluQ3V0cygpOyBpKyspIHsKLSAgICAgZnByaW50Zihmb3V0LCAiICAgTUlOQ1VUUyAlcyAlZCA7XG4iLCBkZWYtPmxlZmlOb25EZWZhdWx0OjpjdXRMYXllck5hbWUoaSksCi0gICAgICAgICAgICAgZGVmLT5sZWZpTm9uRGVmYXVsdDo6bnVtQ3V0cyhpKSk7Ci0gIH0KLQotICAvLyBoYW5kbGUgcHJvcGVydHkgaW4gbm9uZGVmYXVsdHJ1bGUKLSAgaWYgKGRlZi0+bGVmaU5vbkRlZmF1bHQ6Om51bVByb3BzKCkgPiAwKSB7Ci0gICAgIGZwcmludGYoZm91dCwgIiAgIFBST1BFUlRZICIpOwotICAgICBmb3IgKGkgPSAwOyBpIDwgZGVmLT5sZWZpTm9uRGVmYXVsdDo6bnVtUHJvcHMoKTsgaSsrKSB7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIiVzICIsIGRlZi0+bGVmaU5vbkRlZmF1bHQ6OnByb3BOYW1lKGkpKTsKLSAgICAgICAgaWYgKGRlZi0+bGVmaU5vbkRlZmF1bHQ6OnByb3BJc051bWJlcihpKSkKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVnICIsIGRlZi0+bGVmaU5vbkRlZmF1bHQ6OnByb3BOdW1iZXIoaSkpOyAgIAotICAgICAgICBpZiAoZGVmLT5sZWZpTm9uRGVmYXVsdDo6cHJvcElzU3RyaW5nKGkpKQotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgZGVmLT5sZWZpTm9uRGVmYXVsdDo6cHJvcFZhbHVlKGkpKTsgICAKLSAgICAgICAgc3dpdGNoKGRlZi0+bGVmaU5vbkRlZmF1bHQ6OnByb3BUeXBlKGkpKSB7Ci0gICAgICAgICAgICBjYXNlICdSJzogZnByaW50Zihmb3V0LCAiUkVBTCAiKTsKLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ0knOiBmcHJpbnRmKGZvdXQsICJJTlRFR0VSICIpOwotICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnUyc6IGZwcmludGYoZm91dCwgIlNUUklORyAiKTsKLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ1EnOiBmcHJpbnRmKGZvdXQsICJRVU9URVNUUklORyAiKTsKLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ04nOiBmcHJpbnRmKGZvdXQsICJOVU1CRVIgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgfQotICAgICBmcHJpbnRmKGZvdXQsICI7XG4iKTsKLSAgfQotICBmcHJpbnRmKGZvdXQsICJFTkQgJXMgO1xuIiwgZGVmLT5sZWZpTm9uRGVmYXVsdDo6bmFtZSgpKTsKLQotICByZXR1cm4gMDsKLX0KLQotaW50IG9ic3RydWN0aW9uQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGxlZmlPYnN0cnVjdGlvbiogb2JzLAotICAgICAgICAgICAgICAgICAgbGVmaVVzZXJEYXRhKSB7Ci0gIGxlZmlHZW9tZXRyaWVzKiBnZW9tZXRyeTsKLQotICBjaGVja1R5cGUoYyk7Ci0gIC8vIGlmICgobG9uZyl1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGZwcmludGYoZm91dCwgIiAgT0JTXG4iKTsKLSAgZ2VvbWV0cnkgPSBvYnMtPmxlZmlPYnN0cnVjdGlvbjo6Z2VvbWV0cmllcygpOwotICBwcnRHZW9tZXRyeShnZW9tZXRyeSk7Ci0gIGZwcmludGYoZm91dCwgIiAgRU5EXG4iKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBwaW5DQihsZWZyQ2FsbGJhY2tUeXBlX2UgYywgbGVmaVBpbiogcGluLCBsZWZpVXNlckRhdGEpIHsKLSAgaW50ICAgICAgICAgICAgICAgICAgbnVtUG9ydHMsIGksIGo7Ci0gIGxlZmlHZW9tZXRyaWVzKiAgICAgIGdlb21ldHJ5OwotICBsZWZpUGluQW50ZW5uYU1vZGVsKiBhTW9kZWw7Ci0gCi0gIGNoZWNrVHlwZShjKTsKLSAgLy8gaWYgKChsb25nKXVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgZnByaW50Zihmb3V0LCAiICBQSU4gJXNcbiIsIHBpbi0+bGVmaVBpbjo6bmFtZSgpKTsKLSAgaWYgKHBpbi0+bGVmaVBpbjo6aGFzRm9yZWlnbigpKSB7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBwaW4tPmxlZmlQaW46Om51bUZvcmVpZ25zKCk7IGkrKykgewotICAgICAgICBpZiAocGluLT5sZWZpUGluOjpoYXNGb3JlaWduT3JpZW50KGkpKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICAgRk9SRUlHTiAlcyBTVFJVQ1RVUkUgKCAlZyAlZyApICVzIDtcbiIsCi0gICAgICAgICAgICAgICAgICAgcGluLT5sZWZpUGluOjpmb3JlaWduTmFtZShpKSwgcGluLT5sZWZpUGluOjpmb3JlaWduWChpKSwKLSAgICAgICAgICAgICAgICAgICBwaW4tPmxlZmlQaW46OmZvcmVpZ25ZKGkpLAotICAgICAgICAgICAgICAgICAgIHBpbi0+bGVmaVBpbjo6Zm9yZWlnbk9yaWVudFN0cihpKSk7Ci0gICAgICAgIGVsc2UgaWYgKHBpbi0+bGVmaVBpbjo6aGFzRm9yZWlnblBvaW50KGkpKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICAgRk9SRUlHTiAlcyBTVFJVQ1RVUkUgKCAlZyAlZyApIDtcbiIsCi0gICAgICAgICAgICAgICAgICAgcGluLT5sZWZpUGluOjpmb3JlaWduTmFtZShpKSwgcGluLT5sZWZpUGluOjpmb3JlaWduWChpKSwKLSAgICAgICAgICAgICAgICAgICBwaW4tPmxlZmlQaW46OmZvcmVpZ25ZKGkpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICAgRk9SRUlHTiAlcyA7XG4iLCBwaW4tPmxlZmlQaW46OmZvcmVpZ25OYW1lKGkpKTsKLSAgICAgfQotICB9Ci0gIGlmIChwaW4tPmxlZmlQaW46Omhhc0xFUSgpKQotICAgICBmcHJpbnRmKGZvdXQsICIgICAgTEVRICVzIDtcbiIsIHBpbi0+bGVmaVBpbjo6TEVRKCkpOwotICBpZiAocGluLT5sZWZpUGluOjpoYXNEaXJlY3Rpb24oKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICAgIERJUkVDVElPTiAlcyA7XG4iLCBwaW4tPmxlZmlQaW46OmRpcmVjdGlvbigpKTsKLSAgaWYgKHBpbi0+bGVmaVBpbjo6aGFzVXNlKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgICBVU0UgJXMgO1xuIiwgcGluLT5sZWZpUGluOjp1c2UoKSk7Ci0gIGlmIChwaW4tPmxlZmlQaW46Omhhc1NoYXBlKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgICBTSEFQRSAlcyA7XG4iLCBwaW4tPmxlZmlQaW46OnNoYXBlKCkpOwotICBpZiAocGluLT5sZWZpUGluOjpoYXNNdXN0am9pbigpKQotICAgICBmcHJpbnRmKGZvdXQsICIgICAgTVVTVEpPSU4gJXMgO1xuIiwgcGluLT5sZWZpUGluOjptdXN0am9pbigpKTsKLSAgaWYgKHBpbi0+bGVmaVBpbjo6aGFzT3V0TWFyZ2luKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgICBPVVRQVVROT0lTRU1BUkdJTiAlZyAlZyA7XG4iLAotICAgICAgICAgICAgIHBpbi0+bGVmaVBpbjo6b3V0TWFyZ2luSGlnaCgpLCBwaW4tPmxlZmlQaW46Om91dE1hcmdpbkxvdygpKTsKLSAgaWYgKHBpbi0+bGVmaVBpbjo6aGFzT3V0UmVzaXN0YW5jZSgpKQotICAgICBmcHJpbnRmKGZvdXQsICIgICAgT1VUUFVUUkVTSVNUQU5DRSAlZyAlZyA7XG4iLAotICAgICAgICAgICAgIHBpbi0+bGVmaVBpbjo6b3V0UmVzaXN0YW5jZUhpZ2goKSwKLSAgICAgICAgICAgICBwaW4tPmxlZmlQaW46Om91dFJlc2lzdGFuY2VMb3coKSk7Ci0gIGlmIChwaW4tPmxlZmlQaW46Omhhc0luTWFyZ2luKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgICBJTlBVVE5PSVNFTUFSR0lOICVnICVnIDtcbiIsCi0gICAgICAgICAgICAgcGluLT5sZWZpUGluOjppbk1hcmdpbkhpZ2goKSwgcGluLT5sZWZpUGluOjppbk1hcmdpbkxvdygpKTsKLSAgaWYgKHBpbi0+bGVmaVBpbjo6aGFzUG93ZXIoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICAgIFBPV0VSICVnIDtcbiIsIHBpbi0+bGVmaVBpbjo6cG93ZXIoKSk7Ci0gIGlmIChwaW4tPmxlZmlQaW46Omhhc0xlYWthZ2UoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICAgIExFQUtBR0UgJWcgO1xuIiwgcGluLT5sZWZpUGluOjpsZWFrYWdlKCkpOwotICBpZiAocGluLT5sZWZpUGluOjpoYXNNYXhsb2FkKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgICBNQVhMT0FEICVnIDtcbiIsIHBpbi0+bGVmaVBpbjo6bWF4bG9hZCgpKTsKLSAgaWYgKHBpbi0+bGVmaVBpbjo6aGFzQ2FwYWNpdGFuY2UoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICAgIENBUEFDSVRBTkNFICVnIDtcbiIsIHBpbi0+bGVmaVBpbjo6Y2FwYWNpdGFuY2UoKSk7Ci0gIGlmIChwaW4tPmxlZmlQaW46Omhhc1Jlc2lzdGFuY2UoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICAgIFJFU0lTVEFOQ0UgJWcgO1xuIiwgcGluLT5sZWZpUGluOjpyZXNpc3RhbmNlKCkpOwotICBpZiAocGluLT5sZWZpUGluOjpoYXNQdWxsZG93bnJlcygpKQotICAgICBmcHJpbnRmKGZvdXQsICIgICAgUFVMTERPV05SRVMgJWcgO1xuIiwgcGluLT5sZWZpUGluOjpwdWxsZG93bnJlcygpKTsKLSAgaWYgKHBpbi0+bGVmaVBpbjo6aGFzVGllb2ZmcigpKQotICAgICBmcHJpbnRmKGZvdXQsICIgICAgVElFT0ZGUiAlZyA7XG4iLCBwaW4tPmxlZmlQaW46OnRpZW9mZnIoKSk7Ci0gIGlmIChwaW4tPmxlZmlQaW46Omhhc1ZISSgpKQotICAgICBmcHJpbnRmKGZvdXQsICIgICAgVkhJICVnIDtcbiIsIHBpbi0+bGVmaVBpbjo6VkhJKCkpOwotICBpZiAocGluLT5sZWZpUGluOjpoYXNWTE8oKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICAgIFZMTyAlZyA7XG4iLCBwaW4tPmxlZmlQaW46OlZMTygpKTsKLSAgaWYgKHBpbi0+bGVmaVBpbjo6aGFzUmlzZVZvbHRhZ2UoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICAgIFJJU0VWT0xUQUdFVEhSRVNIT0xEICVnIDtcbiIsCi0gICAgICAgICAgICAgcGluLT5sZWZpUGluOjpyaXNlVm9sdGFnZSgpKTsKLSAgaWYgKHBpbi0+bGVmaVBpbjo6aGFzRmFsbFZvbHRhZ2UoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICAgIEZBTExWT0xUQUdFVEhSRVNIT0xEICVnIDtcbiIsCi0gICAgICAgICAgICAgcGluLT5sZWZpUGluOjpmYWxsVm9sdGFnZSgpKTsKLSAgaWYgKHBpbi0+bGVmaVBpbjo6aGFzUmlzZVRocmVzaCgpKQotICAgICBmcHJpbnRmKGZvdXQsICIgICAgUklTRVRIUkVTSCAlZyA7XG4iLCBwaW4tPmxlZmlQaW46OnJpc2VUaHJlc2goKSk7Ci0gIGlmIChwaW4tPmxlZmlQaW46Omhhc0ZhbGxUaHJlc2goKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICAgIEZBTExUSFJFU0ggJWcgO1xuIiwgcGluLT5sZWZpUGluOjpmYWxsVGhyZXNoKCkpOwotICBpZiAocGluLT5sZWZpUGluOjpoYXNSaXNlU2F0Y3VyKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgICBSSVNFU0FUQ1VSICVnIDtcbiIsIHBpbi0+bGVmaVBpbjo6cmlzZVNhdGN1cigpKTsKLSAgaWYgKHBpbi0+bGVmaVBpbjo6aGFzRmFsbFNhdGN1cigpKQotICAgICBmcHJpbnRmKGZvdXQsICIgICAgRkFMTFNBVENVUiAlZyA7XG4iLCBwaW4tPmxlZmlQaW46OmZhbGxTYXRjdXIoKSk7Ci0gIGlmIChwaW4tPmxlZmlQaW46Omhhc1Jpc2VTbGV3TGltaXQoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICAgIFJJU0VTTEVXTElNSVQgJWcgO1xuIiwgcGluLT5sZWZpUGluOjpyaXNlU2xld0xpbWl0KCkpOwotICBpZiAocGluLT5sZWZpUGluOjpoYXNGYWxsU2xld0xpbWl0KCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgICBGQUxMU0xFV0xJTUlUICVnIDtcbiIsIHBpbi0+bGVmaVBpbjo6ZmFsbFNsZXdMaW1pdCgpKTsKLSAgaWYgKHBpbi0+bGVmaVBpbjo6aGFzQ3VycmVudFNvdXJjZSgpKQotICAgICBmcHJpbnRmKGZvdXQsICIgICAgQ1VSUkVOVFNPVVJDRSAlcyA7XG4iLCBwaW4tPmxlZmlQaW46OmN1cnJlbnRTb3VyY2UoKSk7Ci0gIGlmIChwaW4tPmxlZmlQaW46Omhhc1RhYmxlcygpKQotICAgICBmcHJpbnRmKGZvdXQsICIgICAgSVZfVEFCTEVTICVzICVzIDtcbiIsIHBpbi0+bGVmaVBpbjo6dGFibGVIaWdoTmFtZSgpLAotICAgICAgICAgICAgIHBpbi0+bGVmaVBpbjo6dGFibGVMb3dOYW1lKCkpOwotICBpZiAocGluLT5sZWZpUGluOjpoYXNUYXBlclJ1bGUoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICAgIFRBUEVSUlVMRSAlcyA7XG4iLCBwaW4tPmxlZmlQaW46OnRhcGVyUnVsZSgpKTsKLSAgaWYgKHBpbi0+bGVmaVBpbjo6aGFzTmV0RXhwcigpKQotICAgICBmcHJpbnRmKGZvdXQsICIgICAgTkVURVhQUiBcIiVzXCIgO1xuIiwgcGluLT5sZWZpUGluOjpuZXRFeHByKCkpOwotICBpZiAocGluLT5sZWZpUGluOjpoYXNTdXBwbHlTZW5zaXRpdml0eSgpKQotICAgICBmcHJpbnRmKGZvdXQsICIgICAgU1VQUExZU0VOU0lUSVZJVFkgJXMgO1xuIiwKLSAgICAgICAgICAgICBwaW4tPmxlZmlQaW46OnN1cHBseVNlbnNpdGl2aXR5KCkpOwotICBpZiAocGluLT5sZWZpUGluOjpoYXNHcm91bmRTZW5zaXRpdml0eSgpKQotICAgICBmcHJpbnRmKGZvdXQsICIgICAgR1JPVU5EU0VOU0lUSVZJVFkgJXMgO1xuIiwKLSAgICAgICAgICAgICBwaW4tPmxlZmlQaW46Omdyb3VuZFNlbnNpdGl2aXR5KCkpOwotICBpZiAocGluLT5sZWZpUGluOjpoYXNBbnRlbm5hU2l6ZSgpKSB7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBwaW4tPmxlZmlQaW46Om51bUFudGVubmFTaXplKCk7IGkrKykgewotICAgICAgICBmcHJpbnRmKGZvdXQsICIgICAgQU5URU5OQVNJWkUgJWcgIiwgcGluLT5sZWZpUGluOjphbnRlbm5hU2l6ZShpKSk7Ci0gICAgICAgIGlmIChwaW4tPmxlZmlQaW46OmFudGVubmFTaXplTGF5ZXIoaSkpCi0gICAgICAgICAgIGZwcmludGYoZm91dCwgIkxBWUVSICVzICIsIHBpbi0+bGVmaVBpbjo6YW50ZW5uYVNpemVMYXllcihpKSk7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIjtcbiIpOwotICAgICB9Ci0gIH0KLSAgaWYgKHBpbi0+bGVmaVBpbjo6aGFzQW50ZW5uYU1ldGFsQXJlYSgpKSB7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBwaW4tPmxlZmlQaW46Om51bUFudGVubmFNZXRhbEFyZWEoKTsgaSsrKSB7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIiAgICBBTlRFTk5BTUVUQUxBUkVBICVnICIsCi0gICAgICAgICAgIHBpbi0+bGVmaVBpbjo6YW50ZW5uYU1ldGFsQXJlYShpKSk7Ci0gICAgICAgIGlmIChwaW4tPmxlZmlQaW46OmFudGVubmFNZXRhbEFyZWFMYXllcihpKSkKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgIiwgcGluLT5sZWZpUGluOjphbnRlbm5hTWV0YWxBcmVhTGF5ZXIoaSkpOwotICAgICAgICBmcHJpbnRmKGZvdXQsICI7XG4iKTsKLSAgICAgfQotICB9Ci0gIGlmIChwaW4tPmxlZmlQaW46Omhhc0FudGVubmFNZXRhbExlbmd0aCgpKSB7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBwaW4tPmxlZmlQaW46Om51bUFudGVubmFNZXRhbExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiICAgIEFOVEVOTkFNRVRBTExFTkdUSCAlZyAiLAotICAgICAgICAgICBwaW4tPmxlZmlQaW46OmFudGVubmFNZXRhbExlbmd0aChpKSk7Ci0gICAgICAgIGlmIChwaW4tPmxlZmlQaW46OmFudGVubmFNZXRhbExlbmd0aExheWVyKGkpKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyAiLCBwaW4tPmxlZmlQaW46OmFudGVubmFNZXRhbExlbmd0aExheWVyKGkpKTsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0gICAgIH0KLSAgfQotCi0gIGlmIChwaW4tPmxlZmlQaW46Omhhc0FudGVubmFQYXJ0aWFsTWV0YWxBcmVhKCkpIHsKLSAgICAgZm9yIChpID0gMDsgaSA8IHBpbi0+bGVmaVBpbjo6bnVtQW50ZW5uYVBhcnRpYWxNZXRhbEFyZWEoKTsgaSsrKSB7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIiAgICBBTlRFTk5BUEFSVElBTE1FVEFMQVJFQSAlZyAiLAotICAgICAgICAgICAgICAgIHBpbi0+bGVmaVBpbjo6YW50ZW5uYVBhcnRpYWxNZXRhbEFyZWEoaSkpOwotICAgICAgICBpZiAocGluLT5sZWZpUGluOjphbnRlbm5hUGFydGlhbE1ldGFsQXJlYUxheWVyKGkpKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyAiLAotICAgICAgICAgICAgICAgICAgIHBpbi0+bGVmaVBpbjo6YW50ZW5uYVBhcnRpYWxNZXRhbEFyZWFMYXllcihpKSk7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIjtcbiIpOwotICAgICB9Ci0gIH0KLQotICBpZiAocGluLT5sZWZpUGluOjpoYXNBbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWEoKSkgewotICAgICBmb3IgKGkgPSAwOyBpIDwgcGluLT5sZWZpUGluOjpudW1BbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWEoKTsgaSsrKSB7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIiAgICBBTlRFTk5BUEFSVElBTE1FVEFMU0lERUFSRUEgJWcgIiwKLSAgICAgICAgICAgICAgICBwaW4tPmxlZmlQaW46OmFudGVubmFQYXJ0aWFsTWV0YWxTaWRlQXJlYShpKSk7Ci0gICAgICAgIGlmIChwaW4tPmxlZmlQaW46OmFudGVubmFQYXJ0aWFsTWV0YWxTaWRlQXJlYUxheWVyKGkpKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyAiLAotICAgICAgICAgICAgICAgICAgIHBpbi0+bGVmaVBpbjo6YW50ZW5uYVBhcnRpYWxNZXRhbFNpZGVBcmVhTGF5ZXIoaSkpOwotICAgICAgICBmcHJpbnRmKGZvdXQsICI7XG4iKTsKLSAgICAgfQotICB9Ci0KLSAgaWYgKHBpbi0+bGVmaVBpbjo6aGFzQW50ZW5uYVBhcnRpYWxDdXRBcmVhKCkpIHsKLSAgICAgZm9yIChpID0gMDsgaSA8IHBpbi0+bGVmaVBpbjo6bnVtQW50ZW5uYVBhcnRpYWxDdXRBcmVhKCk7IGkrKykgewotICAgICAgICBmcHJpbnRmKGZvdXQsICIgICAgQU5URU5OQVBBUlRJQUxDVVRBUkVBICVnICIsCi0gICAgICAgICAgICAgICAgcGluLT5sZWZpUGluOjphbnRlbm5hUGFydGlhbEN1dEFyZWEoaSkpOwotICAgICAgICBpZiAocGluLT5sZWZpUGluOjphbnRlbm5hUGFydGlhbEN1dEFyZWFMYXllcihpKSkKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTEFZRVIgJXMgIiwKLSAgICAgICAgICAgICAgICAgICBwaW4tPmxlZmlQaW46OmFudGVubmFQYXJ0aWFsQ3V0QXJlYUxheWVyKGkpKTsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0gICAgIH0KLSAgfQotCi0gIGlmIChwaW4tPmxlZmlQaW46Omhhc0FudGVubmFEaWZmQXJlYSgpKSB7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBwaW4tPmxlZmlQaW46Om51bUFudGVubmFEaWZmQXJlYSgpOyBpKyspIHsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiICAgIEFOVEVOTkFESUZGQVJFQSAlZyAiLAotICAgICAgICAgICAgICAgIHBpbi0+bGVmaVBpbjo6YW50ZW5uYURpZmZBcmVhKGkpKTsKLSAgICAgICAgaWYgKHBpbi0+bGVmaVBpbjo6YW50ZW5uYURpZmZBcmVhTGF5ZXIoaSkpCi0gICAgICAgICAgIGZwcmludGYoZm91dCwgIkxBWUVSICVzICIsIHBpbi0+bGVmaVBpbjo6YW50ZW5uYURpZmZBcmVhTGF5ZXIoaSkpOwotICAgICAgICBmcHJpbnRmKGZvdXQsICI7XG4iKTsKLSAgICAgfQotICB9Ci0KLSAgZm9yIChqID0gMDsgaiA8IHBpbi0+bGVmaVBpbjo6bnVtQW50ZW5uYU1vZGVsKCk7IGorKykgewotICAgICBhTW9kZWwgPSBwaW4tPmxlZmlQaW46OmFudGVubmFNb2RlbChqKTsgCi0gICAgCi0gICAgIGZwcmludGYoZm91dCwgIiAgICBBTlRFTk5BTU9ERUwgJXMgO1xuIiwKLSAgICAgICAgICAgICBhTW9kZWwtPmxlZmlQaW5BbnRlbm5hTW9kZWw6OmFudGVubmFPeGlkZSgpKTsKLQotICAgICBpZiAoYU1vZGVsLT5sZWZpUGluQW50ZW5uYU1vZGVsOjpoYXNBbnRlbm5hR2F0ZUFyZWEoKSkgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYU1vZGVsLT5sZWZpUGluQW50ZW5uYU1vZGVsOjpudW1BbnRlbm5hR2F0ZUFyZWEoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgICBBTlRFTk5BR0FURUFSRUEgJWcgIiwKLSAgICAgICAgICAgICAgICAgICBhTW9kZWwtPmxlZmlQaW5BbnRlbm5hTW9kZWw6OmFudGVubmFHYXRlQXJlYShpKSk7Ci0gICAgICAgICAgIGlmIChhTW9kZWwtPmxlZmlQaW5BbnRlbm5hTW9kZWw6OmFudGVubmFHYXRlQXJlYUxheWVyKGkpKQotICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJMQVlFUiAlcyAiLAotICAgICAgICAgICAgICAgICAgICAgIGFNb2RlbC0+bGVmaVBpbkFudGVubmFNb2RlbDo6YW50ZW5uYUdhdGVBcmVhTGF5ZXIoaSkpOwotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICI7XG4iKTsKLSAgICAgICAgfQotICAgICB9Ci0KLSAgICAgaWYgKGFNb2RlbC0+bGVmaVBpbkFudGVubmFNb2RlbDo6aGFzQW50ZW5uYU1heEFyZWFDYXIoKSkgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYU1vZGVsLT5sZWZpUGluQW50ZW5uYU1vZGVsOjpudW1BbnRlbm5hTWF4QXJlYUNhcigpOwotICAgICAgICAgICBpKyspIHsKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICAgIEFOVEVOTkFNQVhBUkVBQ0FSICVnICIsCi0gICAgICAgICAgICAgICAgICAgYU1vZGVsLT5sZWZpUGluQW50ZW5uYU1vZGVsOjphbnRlbm5hTWF4QXJlYUNhcihpKSk7Ci0gICAgICAgICAgIGlmIChhTW9kZWwtPmxlZmlQaW5BbnRlbm5hTW9kZWw6OmFudGVubmFNYXhBcmVhQ2FyTGF5ZXIoaSkpCi0gICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkxBWUVSICVzICIsCi0gICAgICAgICAgICAgICAgICAgYU1vZGVsLT5sZWZpUGluQW50ZW5uYU1vZGVsOjphbnRlbm5hTWF4QXJlYUNhckxheWVyKGkpKTsKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0gICAgICAgIH0KLSAgICAgfQotCi0gICAgIGlmIChhTW9kZWwtPmxlZmlQaW5BbnRlbm5hTW9kZWw6Omhhc0FudGVubmFNYXhTaWRlQXJlYUNhcigpKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBhTW9kZWwtPmxlZmlQaW5BbnRlbm5hTW9kZWw6Om51bUFudGVubmFNYXhTaWRlQXJlYUNhcigpOwotICAgICAgICAgICBpKyspIHsKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICAgIEFOVEVOTkFNQVhTSURFQVJFQUNBUiAlZyAiLAotICAgICAgICAgICAgICAgICAgIGFNb2RlbC0+bGVmaVBpbkFudGVubmFNb2RlbDo6YW50ZW5uYU1heFNpZGVBcmVhQ2FyKGkpKTsKLSAgICAgICAgICAgaWYgKGFNb2RlbC0+bGVmaVBpbkFudGVubmFNb2RlbDo6YW50ZW5uYU1heFNpZGVBcmVhQ2FyTGF5ZXIoaSkpCi0gICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkxBWUVSICVzICIsCi0gICAgICAgICAgICAgICAgICAgYU1vZGVsLT5sZWZpUGluQW50ZW5uYU1vZGVsOjphbnRlbm5hTWF4U2lkZUFyZWFDYXJMYXllcihpKSk7Ci0gICAgICAgICAgIGZwcmludGYoZm91dCwgIjtcbiIpOwotICAgICAgICB9Ci0gICAgIH0KLQotICAgICBpZiAoYU1vZGVsLT5sZWZpUGluQW50ZW5uYU1vZGVsOjpoYXNBbnRlbm5hTWF4Q3V0Q2FyKCkpIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGFNb2RlbC0+bGVmaVBpbkFudGVubmFNb2RlbDo6bnVtQW50ZW5uYU1heEN1dENhcigpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICAgIEFOVEVOTkFNQVhDVVRDQVIgJWcgIiwKLSAgICAgICAgICAgICAgICAgICBhTW9kZWwtPmxlZmlQaW5BbnRlbm5hTW9kZWw6OmFudGVubmFNYXhDdXRDYXIoaSkpOwotICAgICAgICAgICBpZiAoYU1vZGVsLT5sZWZpUGluQW50ZW5uYU1vZGVsOjphbnRlbm5hTWF4Q3V0Q2FyTGF5ZXIoaSkpCi0gICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkxBWUVSICVzICIsCi0gICAgICAgICAgICAgICAgICAgYU1vZGVsLT5sZWZpUGluQW50ZW5uYU1vZGVsOjphbnRlbm5hTWF4Q3V0Q2FyTGF5ZXIoaSkpOwotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICI7XG4iKTsKLSAgICAgICAgfQotICAgICB9Ci0gIH0KLQotICBpZiAocGluLT5sZWZpUGluOjpudW1Qcm9wZXJ0aWVzKCkgPiAwKSB7Ci0gICAgIGZwcmludGYoZm91dCwgIiAgICBQUk9QRVJUWSAiKTsKLSAgICAgZm9yIChpID0gMDsgaSA8IHBpbi0+bGVmaVBpbjo6bnVtUHJvcGVydGllcygpOyBpKyspIHsKLSAgICAgICAgLy8gdmFsdWUgY2FuIGVpdGhlciBiZSBhIHN0cmluZyBvciBudW1iZXIKLSAgICAgICAgaWYgKHBpbi0+bGVmaVBpbjo6cHJvcFZhbHVlKGkpKSB7Ci0gICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzICVzICIsIHBpbi0+bGVmaVBpbjo6cHJvcE5hbWUoaSksCi0gICAgICAgICAgICAgICAgICAgcGluLT5sZWZpUGluOjpwcm9wVmFsdWUoaSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgJWcgIiwgcGluLT5sZWZpUGluOjpwcm9wTmFtZShpKSwKLSAgICAgICAgICAgICAgICAgICBwaW4tPmxlZmlQaW46OnByb3BOdW0oaSkpOwotICAgICAgICBzd2l0Y2ggKHBpbi0+bGVmaVBpbjo6cHJvcFR5cGUoaSkpIHsKLSAgICAgICAgICAgY2FzZSAnUic6IGZwcmludGYoZm91dCwgIlJFQUwgIik7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgY2FzZSAnSSc6IGZwcmludGYoZm91dCwgIklOVEVHRVIgIik7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgY2FzZSAnUyc6IGZwcmludGYoZm91dCwgIlNUUklORyAiKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICBjYXNlICdRJzogZnByaW50Zihmb3V0LCAiUVVPVEVTVFJJTkcgIik7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgY2FzZSAnTic6IGZwcmludGYoZm91dCwgIk5VTUJFUiAiKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IAotICAgICB9Ci0gICAgIGZwcmludGYoZm91dCwgIjtcbiIpOwotICB9Ci0gIAotICBudW1Qb3J0cyA9IHBpbi0+bGVmaVBpbjo6bnVtUG9ydHMoKTsKLSAgZm9yIChpID0gMDsgaSA8IG51bVBvcnRzOyBpKyspIHsKLSAgICAgZnByaW50Zihmb3V0LCIgICAgUE9SVFxuIik7Ci0gICAgIGdlb21ldHJ5ID0gcGluLT5sZWZpUGluOjpwb3J0KGkpOwotICAgICBwcnRHZW9tZXRyeShnZW9tZXRyeSk7Ci0gICAgIGZwcmludGYoZm91dCwgIiAgICBFTkRcbiIpOwotICB9Ci0gIGZwcmludGYoZm91dCwgIiAgRU5EICVzXG4iLCBwaW4tPmxlZmlQaW46Om5hbWUoKSk7Ci0gIHJldHVybiAwOyAgCi19Ci0KLWludCBkZW5zaXR5Q0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGxlZmlEZW5zaXR5KiBkZW5zaXR5LAotICAgICAgICAgICAgICAgICAgbGVmaVVzZXJEYXRhKSB7Ci0KLSAgc3RydWN0IGxlZmlHZW9tUmVjdCByZWN0OwotCi0gIGNoZWNrVHlwZShjKTsKLSAgLy8gaWYgKChsb25nKXVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgZnByaW50Zihmb3V0LCAiICBERU5TSVRZXG4iKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZW5zaXR5LT5sZWZpRGVuc2l0eTo6bnVtTGF5ZXIoKTsgaSsrKSB7Ci0gICAgZnByaW50Zihmb3V0LCAiICAgIExBWUVSICVzIDtcbiIsIGRlbnNpdHktPmxlZmlEZW5zaXR5OjpsYXllck5hbWUoaSkpOwotICAgIGZvciAoaW50IGogPSAwOyBqIDwgZGVuc2l0eS0+bGVmaURlbnNpdHk6Om51bVJlY3RzKGkpOyBqKyspIHsKLSAgICAgIHJlY3QgPSBkZW5zaXR5LT5sZWZpRGVuc2l0eTo6Z2V0UmVjdChpLGopOwotICAgICAgZnByaW50Zihmb3V0LCAiICAgICAgUkVDVCAlZyAlZyAlZyAlZyAiLCByZWN0LnhsLCByZWN0LnlsLCByZWN0LnhoLAotICAgICAgICAgICAgICByZWN0LnloKTsKLSAgICAgIGZwcmludGYoZm91dCwgIiVnIDtcbiIsIGRlbnNpdHktPmxlZmlEZW5zaXR5OjpkZW5zaXR5VmFsdWUoaSxqKSk7Ci0gICAgfQotICB9Ci0gIGZwcmludGYoZm91dCwgIiAgRU5EXG4iKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBwcm9wRGVmQmVnaW5DQihsZWZyQ2FsbGJhY2tUeXBlX2UgYywgdm9pZCosIGxlZmlVc2VyRGF0YSkgewotCi0gIGNoZWNrVHlwZShjKTsKLSAgLy8gaWYgKChsb25nKXVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgZnByaW50Zihmb3V0LCAiUFJPUEVSVFlERUZJTklUSU9OU1xuIik7Ci0gIHJldHVybiAwOwotfQotCi1pbnQgcHJvcERlZkNCKGxlZnJDYWxsYmFja1R5cGVfZSBjLCBsZWZpUHJvcCogcHJvcCwgbGVmaVVzZXJEYXRhKSB7Ci0KLSAgY2hlY2tUeXBlKGMpOwotICAvLyBpZiAoKGxvbmcpdWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBmcHJpbnRmKGZvdXQsICIgJXMgJXMiLCBwcm9wLT5sZWZpUHJvcDo6cHJvcFR5cGUoKSwKLSAgICAgICAgICBwcm9wLT5sZWZpUHJvcDo6cHJvcE5hbWUoKSk7Ci0gIHN3aXRjaChwcm9wLT5sZWZpUHJvcDo6ZGF0YVR5cGUoKSkgewotICAgICBjYXNlICdJJzoKLSAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgSU5URUdFUiIpOyAKLSAgICAgICAgICBicmVhazsKLSAgICAgY2FzZSAnUic6Ci0gICAgICAgICAgZnByaW50Zihmb3V0LCAiIFJFQUwiKTsgCi0gICAgICAgICAgYnJlYWs7Ci0gICAgIGNhc2UgJ1MnOgotICAgICAgICAgIGZwcmludGYoZm91dCwgIiBTVFJJTkciKTsgCi0gICAgICAgICAgYnJlYWs7Ci0gIH0KLSAgaWYgKHByb3AtPmxlZmlQcm9wOjpoYXNOdW1iZXIoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICVnIiwgcHJvcC0+bGVmaVByb3A6Om51bWJlcigpKTsKLSAgaWYgKHByb3AtPmxlZmlQcm9wOjpoYXNSYW5nZSgpKQotICAgICBmcHJpbnRmKGZvdXQsICIgUkFOR0UgJWcgJWciLCBwcm9wLT5sZWZpUHJvcDo6bGVmdCgpLAotICAgICAgICAgICAgIHByb3AtPmxlZmlQcm9wOjpyaWdodCgpKTsKLSAgaWYgKHByb3AtPmxlZmlQcm9wOjpoYXNTdHJpbmcoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICVzIiwgcHJvcC0+bGVmaVByb3A6OnN0cmluZygpKTsKLSAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBwcm9wRGVmRW5kQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIHZvaWQqLCBsZWZpVXNlckRhdGEpIHsKLQotICBjaGVja1R5cGUoYyk7Ci0gIC8vIGlmICgobG9uZyl1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGZwcmludGYoZm91dCwgIkVORCBQUk9QRVJUWURFRklOSVRJT05TXG4iKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBzaXRlQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGxlZmlTaXRlKiBzaXRlLCBsZWZpVXNlckRhdGEpIHsKLSAgaW50IGhhc1BydFN5bSA9IDA7Ci0gIGludCBpOwotCi0gIGNoZWNrVHlwZShjKTsKLSAgLy8gaWYgKChsb25nKXVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgZnByaW50Zihmb3V0LCAiU0lURSAlc1xuIiwgc2l0ZS0+bGVmaVNpdGU6Om5hbWUoKSk7Ci0gIGlmIChzaXRlLT5sZWZpU2l0ZTo6aGFzQ2xhc3MoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICBDTEFTUyAlcyA7XG4iLCBzaXRlLT5sZWZpU2l0ZTo6c2l0ZUNsYXNzKCkpOwotICBpZiAoc2l0ZS0+bGVmaVNpdGU6Omhhc1hTeW1tZXRyeSgpKSB7Ci0gICAgIGZwcmludGYoZm91dCwgIiAgU1lNTUVUUlkgWCAiKTsKLSAgICAgaGFzUHJ0U3ltID0gMTsKLSAgfQotICBpZiAoc2l0ZS0+bGVmaVNpdGU6Omhhc1lTeW1tZXRyeSgpKSB7Ci0gICAgIGlmIChoYXNQcnRTeW0pCi0gICAgICAgIGZwcmludGYoZm91dCwgIlkgIik7Ci0gICAgIGVsc2UgewotICAgICAgICBmcHJpbnRmKGZvdXQsICIgIFNZTU1FVFJZIFkgIik7Ci0gICAgICAgIGhhc1BydFN5bSA9IDE7Ci0gICAgIH0KLSAgfQotICBpZiAoc2l0ZS0+bGVmaVNpdGU6OmhhczkwU3ltbWV0cnkoKSkgewotICAgICBpZiAoaGFzUHJ0U3ltKQotICAgICAgICBmcHJpbnRmKGZvdXQsICJSOTAgIik7Ci0gICAgIGVsc2UgewotICAgICAgICBmcHJpbnRmKGZvdXQsICIgIFNZTU1FVFJZIFI5MCAiKTsKLSAgICAgICAgaGFzUHJ0U3ltID0gMTsKLSAgICAgfQotICB9Ci0gIGlmIChoYXNQcnRTeW0pCi0gICAgIGZwcmludGYoZm91dCwgIjtcbiIpOwotICBpZiAoc2l0ZS0+bGVmaVNpdGU6Omhhc1NpemUoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICBTSVpFICVnIEJZICVnIDtcbiIsIHNpdGUtPmxlZmlTaXRlOjpzaXplWCgpLAotICAgICAgICAgICAgIHNpdGUtPmxlZmlTaXRlOjpzaXplWSgpKTsKLQotICBpZiAoc2l0ZS0+aGFzUm93UGF0dGVybigpKSB7Ci0gICAgIGZwcmludGYoZm91dCwgIiAgUk9XUEFUVEVSTiAiKTsKLSAgICAgZm9yIChpID0gMDsgaSA8IHNpdGUtPmxlZmlTaXRlOjpudW1TaXRlcygpOyBpKyspCi0gICAgICAgIGZwcmludGYoZm91dCwgIiAgJXMgJXMgIiwgc2l0ZS0+bGVmaVNpdGU6OnNpdGVOYW1lKGkpLAotICAgICAgICAgICAgICAgIHNpdGUtPmxlZmlTaXRlOjpzaXRlT3JpZW50U3RyKGkpKTsKLSAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0gIH0KLQotICBmcHJpbnRmKGZvdXQsICJFTkQgJXNcbiIsIHNpdGUtPmxlZmlTaXRlOjpuYW1lKCkpOwotICByZXR1cm4gMDsKLX0KLQotaW50IHNwYWNpbmdCZWdpbkNCKGxlZnJDYWxsYmFja1R5cGVfZSBjLCB2b2lkKiwgbGVmaVVzZXJEYXRhKXsKLSAgY2hlY2tUeXBlKGMpOwotICAvLyBpZiAoKGxvbmcpdWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBmcHJpbnRmKGZvdXQsICJTUEFDSU5HXG4iKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBzcGFjaW5nQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGxlZmlTcGFjaW5nKiBzcGFjaW5nLCBsZWZpVXNlckRhdGEpIHsKLSAgY2hlY2tUeXBlKGMpOwotICAvLyBpZiAoKGxvbmcpdWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBsZWZTcGFjaW5nKHNwYWNpbmcpOwotICByZXR1cm4gMDsKLX0KLQotaW50IHNwYWNpbmdFbmRDQihsZWZyQ2FsbGJhY2tUeXBlX2UgYywgdm9pZCosIGxlZmlVc2VyRGF0YSl7Ci0gIGNoZWNrVHlwZShjKTsKLSAgLy8gaWYgKChsb25nKXVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgZnByaW50Zihmb3V0LCAiRU5EIFNQQUNJTkdcbiIpOwotICByZXR1cm4gMDsKLX0KLQotaW50IHRpbWluZ0NCKGxlZnJDYWxsYmFja1R5cGVfZSBjLCBsZWZpVGltaW5nKiB0aW1pbmcsIGxlZmlVc2VyRGF0YSkgewotICBpbnQgaTsKLSAgY2hlY2tUeXBlKGMpOwotICAvLyBpZiAoKGxvbmcpdWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBmcHJpbnRmKGZvdXQsICJUSU1JTkdcbiIpOwotICBmb3IgKGkgPSAwOyBpIDwgdGltaW5nLT5udW1Gcm9tUGlucygpOyBpKyspCi0gICAgIGZwcmludGYoZm91dCwgIiBGUk9NUElOICVzIDtcbiIsIHRpbWluZy0+ZnJvbVBpbihpKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCB0aW1pbmctPm51bVRvUGlucygpOyBpKyspCi0gICAgIGZwcmludGYoZm91dCwgIiBUT1BJTiAlcyA7XG4iLCB0aW1pbmctPnRvUGluKGkpKTsKLSAgICAgZnByaW50Zihmb3V0LCAiIFJJU0UgU0xFVzEgJWcgJWcgJWcgJWcgO1xuIiwgdGltaW5nLT5yaXNlU2xld09uZSgpLAotICAgICAgICAgICAgIHRpbWluZy0+cmlzZVNsZXdUd28oKSwgdGltaW5nLT5yaXNlU2xld1RocmVlKCksCi0gICAgICAgICAgICAgdGltaW5nLT5yaXNlU2xld0ZvdXIoKSk7Ci0gIGlmICh0aW1pbmctPmhhc1Jpc2VTbGV3MigpKQotICAgICBmcHJpbnRmKGZvdXQsICIgUklTRSBTTEVXMiAlZyAlZyAlZyA7XG4iLCB0aW1pbmctPnJpc2VTbGV3Rml2ZSgpLAotICAgICAgICAgICAgIHRpbWluZy0+cmlzZVNsZXdTaXgoKSwgdGltaW5nLT5yaXNlU2xld1NldmVuKCkpOwotICBpZiAodGltaW5nLT5oYXNGYWxsU2xldygpKQotICAgICBmcHJpbnRmKGZvdXQsICIgRkFMTCBTTEVXMSAlZyAlZyAlZyAlZyA7XG4iLCB0aW1pbmctPmZhbGxTbGV3T25lKCksCi0gICAgICAgICAgICAgdGltaW5nLT5mYWxsU2xld1R3bygpLCB0aW1pbmctPmZhbGxTbGV3VGhyZWUoKSwKLSAgICAgICAgICAgICB0aW1pbmctPmZhbGxTbGV3Rm91cigpKTsKLSAgaWYgKHRpbWluZy0+aGFzRmFsbFNsZXcyKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiBGQUxMIFNMRVcyICVnICVnICVnIDtcbiIsIHRpbWluZy0+ZmFsbFNsZXdGaXZlKCksCi0gICAgICAgICAgICAgdGltaW5nLT5mYWxsU2xld1NpeCgpLCB0aW1pbmctPnJpc2VTbGV3U2V2ZW4oKSk7Ci0gIGlmICh0aW1pbmctPmhhc1Jpc2VJbnRyaW5zaWMoKSkgewotICAgICBmcHJpbnRmKGZvdXQsICJUSU1JTkcgUklTRSBJTlRSSU5TSUMgJWcgJWcgO1xuIiwKLSAgICAgICAgICAgICB0aW1pbmctPnJpc2VJbnRyaW5zaWNPbmUoKSwgdGltaW5nLT5yaXNlSW50cmluc2ljVHdvKCkpOwotICAgICBmcHJpbnRmKGZvdXQsICJUSU1JTkcgUklTRSBWQVJJQUJMRSAlZyAlZyA7XG4iLAotICAgICAgICAgICAgIHRpbWluZy0+cmlzZUludHJpbnNpY1RocmVlKCksIHRpbWluZy0+cmlzZUludHJpbnNpY0ZvdXIoKSk7Ci0gIH0KLSAgaWYgKHRpbWluZy0+aGFzRmFsbEludHJpbnNpYygpKSB7Ci0gICAgIGZwcmludGYoZm91dCwgIlRJTUlORyBGQUxMIElOVFJJTlNJQyAlZyAlZyA7XG4iLAotICAgICAgICAgICAgIHRpbWluZy0+ZmFsbEludHJpbnNpY09uZSgpLCB0aW1pbmctPmZhbGxJbnRyaW5zaWNUd28oKSk7Ci0gICAgIGZwcmludGYoZm91dCwgIlRJTUlORyBSSVNFIFZBUklBQkxFICVnICVnIDtcbiIsCi0gICAgICAgICAgICAgdGltaW5nLT5mYWxsSW50cmluc2ljVGhyZWUoKSwgdGltaW5nLT5mYWxsSW50cmluc2ljRm91cigpKTsKLSAgfQotICBpZiAodGltaW5nLT5oYXNSaXNlUlMoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiVElNSU5HIFJJU0VSUyAlZyAlZyA7XG4iLAotICAgICAgICAgICAgIHRpbWluZy0+cmlzZVJTT25lKCksIHRpbWluZy0+cmlzZVJTVHdvKCkpOwotICAgICBpZiAodGltaW5nLT5oYXNSaXNlQ1MoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiVElNSU5HIFJJU0VDUyAlZyAlZyA7XG4iLAotICAgICAgICAgICAgIHRpbWluZy0+cmlzZUNTT25lKCksIHRpbWluZy0+cmlzZUNTVHdvKCkpOwotICBpZiAodGltaW5nLT5oYXNGYWxsUlMoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiVElNSU5HIEZBTExSUyAlZyAlZyA7XG4iLAotICAgICAgICAgICAgIHRpbWluZy0+ZmFsbFJTT25lKCksIHRpbWluZy0+ZmFsbFJTVHdvKCkpOwotICBpZiAodGltaW5nLT5oYXNGYWxsQ1MoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiVElNSU5HIEZBTExDUyAlZyAlZyA7XG4iLAotICAgICAgICAgICAgIHRpbWluZy0+ZmFsbENTT25lKCksIHRpbWluZy0+ZmFsbENTVHdvKCkpOwotICBpZiAodGltaW5nLT5oYXNVbmF0ZW5lc3MoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiVElNSU5HIFVOQVRFTkVTUyAlcyA7XG4iLCB0aW1pbmctPnVuYXRlbmVzcygpKTsKLSAgaWYgKHRpbWluZy0+aGFzUmlzZUF0dDEoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiVElNSU5HIFJJU0VTQVRUMSAlZyAlZyA7XG4iLCB0aW1pbmctPnJpc2VBdHQxT25lKCksCi0gICAgICAgICAgICAgdGltaW5nLT5yaXNlQXR0MVR3bygpKTsKLSAgaWYgKHRpbWluZy0+aGFzRmFsbEF0dDEoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiVElNSU5HIEZBTExTQVRUMSAlZyAlZyA7XG4iLCB0aW1pbmctPmZhbGxBdHQxT25lKCksCi0gICAgICAgICAgICAgdGltaW5nLT5mYWxsQXR0MVR3bygpKTsKLSAgaWYgKHRpbWluZy0+aGFzUmlzZVRvKCkpCi0gICAgIGZwcmludGYoZm91dCwgIlRJTUlORyBSSVNFVDAgJWcgJWcgO1xuIiwgdGltaW5nLT5yaXNlVG9PbmUoKSwKLSAgICAgICAgICAgICB0aW1pbmctPnJpc2VUb1R3bygpKTsKLSAgaWYgKHRpbWluZy0+aGFzRmFsbFRvKCkpCi0gICAgIGZwcmludGYoZm91dCwgIlRJTUlORyBGQUxMVDAgJWcgJWcgO1xuIiwgdGltaW5nLT5mYWxsVG9PbmUoKSwKLSAgICAgICAgICAgICB0aW1pbmctPmZhbGxUb1R3bygpKTsKLSAgaWYgKHRpbWluZy0+aGFzU0RGb25lUGluVHJpZ2dlcigpKQotICAgICBmcHJpbnRmKGZvdXQsICIgJXMgVEFCTEVESU1FTlNJT04gJWcgJWcgJWcgO1xuIiwKLSAgICAgICAgICAgICB0aW1pbmctPlNERm9uZVBpblRyaWdnZXJUeXBlKCksIHRpbWluZy0+U0RGdHJpZ2dlck9uZSgpLAotICAgICAgICAgICAgIHRpbWluZy0+U0RGdHJpZ2dlclR3bygpLCB0aW1pbmctPlNERnRyaWdnZXJUaHJlZSgpKTsKLSAgaWYgKHRpbWluZy0+aGFzU0RGdHdvUGluVHJpZ2dlcigpKQotICAgICBmcHJpbnRmKGZvdXQsICIgJXMgJXMgJXMgVEFCTEVESU1FTlNJT04gJWcgJWcgJWcgO1xuIiwKLSAgICAgICAgICAgICB0aW1pbmctPlNERnR3b1BpblRyaWdnZXJUeXBlKCksIHRpbWluZy0+U0RGZnJvbVRyaWdnZXIoKSwKLSAgICAgICAgICAgICB0aW1pbmctPlNERnRvVHJpZ2dlcigpLCB0aW1pbmctPlNERnRyaWdnZXJPbmUoKSwKLSAgICAgICAgICAgICB0aW1pbmctPlNERnRyaWdnZXJUd28oKSwgdGltaW5nLT5TREZ0cmlnZ2VyVGhyZWUoKSk7Ci0gIGZwcmludGYoZm91dCwgIkVORCBUSU1JTkdcbiIpOwotICByZXR1cm4gMDsKLX0KLQotaW50IHVuaXRzQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGxlZmlVbml0cyogdW5pdCwgbGVmaVVzZXJEYXRhKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgLy8gaWYgKChsb25nKXVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgZnByaW50Zihmb3V0LCAiVU5JVFNcbiIpOwotICBpZiAodW5pdC0+bGVmaVVuaXRzOjpoYXNEYXRhYmFzZSgpKQotICAgICBmcHJpbnRmKGZvdXQsICIgIERBVEFCQVNFICVzICVnIDtcbiIsIHVuaXQtPmxlZmlVbml0czo6ZGF0YWJhc2VOYW1lKCksCi0gICAgICAgICAgICAgdW5pdC0+bGVmaVVuaXRzOjpkYXRhYmFzZU51bWJlcigpKTsKLSAgaWYgKHVuaXQtPmxlZmlVbml0czo6aGFzQ2FwYWNpdGFuY2UoKSkKLSAgICAgZnByaW50Zihmb3V0LCAiICBDQVBBQ0lUQU5DRSBQSUNPRkFSQURTICVnIDtcbiIsCi0gICAgICAgICAgICAgdW5pdC0+bGVmaVVuaXRzOjpjYXBhY2l0YW5jZSgpKTsKLSAgaWYgKHVuaXQtPmxlZmlVbml0czo6aGFzUmVzaXN0YW5jZSgpKQotICAgICBmcHJpbnRmKGZvdXQsICIgIFJFU0lTVEFOQ0UgT0hNUyAlZyA7XG4iLCB1bml0LT5sZWZpVW5pdHM6OnJlc2lzdGFuY2UoKSk7Ci0gIGlmICh1bml0LT5sZWZpVW5pdHM6Omhhc1Bvd2VyKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgUE9XRVIgTUlMTElXQVRUUyAlZyA7XG4iLCB1bml0LT5sZWZpVW5pdHM6OnBvd2VyKCkpOwotICBpZiAodW5pdC0+bGVmaVVuaXRzOjpoYXNDdXJyZW50KCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgQ1VSUkVOVCBNSUxMSUFNUFMgJWcgO1xuIiwgdW5pdC0+bGVmaVVuaXRzOjpjdXJyZW50KCkpOwotICBpZiAodW5pdC0+bGVmaVVuaXRzOjpoYXNWb2x0YWdlKCkpCi0gICAgIGZwcmludGYoZm91dCwgIiAgVk9MVEFHRSBWT0xUUyAlZyA7XG4iLCB1bml0LT5sZWZpVW5pdHM6OnZvbHRhZ2UoKSk7Ci0gIGlmICh1bml0LT5sZWZpVW5pdHM6Omhhc0ZyZXF1ZW5jeSgpKQotICAgICBmcHJpbnRmKGZvdXQsICIgIEZSRVFVRU5DWSBNRUdBSEVSVFogJWcgO1xuIiwKLSAgICAgICAgICAgICB1bml0LT5sZWZpVW5pdHM6OmZyZXF1ZW5jeSgpKTsKLSAgZnByaW50Zihmb3V0LCAiRU5EIFVOSVRTXG4iKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludCB1c2VNaW5TcGFjaW5nQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIGxlZmlVc2VNaW5TcGFjaW5nKiBzcGFjaW5nLAotICAgICAgICAgICAgICAgICAgICBsZWZpVXNlckRhdGEpIHsKLSAgY2hlY2tUeXBlKGMpOwotICAvLyBpZiAoKGxvbmcpdWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBmcHJpbnRmKGZvdXQsICJVU0VNSU5TUEFDSU5HICVzICIsIHNwYWNpbmctPmxlZmlVc2VNaW5TcGFjaW5nOjpuYW1lKCkpOwotICBpZiAoc3BhY2luZy0+bGVmaVVzZU1pblNwYWNpbmc6OnZhbHVlKCkpCi0gICAgICBmcHJpbnRmKGZvdXQsICJPTiA7XG4iKTsKLSAgZWxzZQotICAgICAgZnByaW50Zihmb3V0LCAiT0ZGIDtcbiIpOwotICByZXR1cm4gMDsKLX0KLQotaW50IHZlcnNpb25DQihsZWZyQ2FsbGJhY2tUeXBlX2UgYywgZG91YmxlIG51bSwgbGVmaVVzZXJEYXRhKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgLy8gaWYgKChsb25nKXVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgZnByaW50Zihmb3V0LCAiVkVSU0lPTiAlZyA7XG4iLCBudW0pOwotICByZXR1cm4gMDsKLX0KLQotaW50IHZlcnNpb25TdHJDQihsZWZyQ2FsbGJhY2tUeXBlX2UgYywgY29uc3QgY2hhciogdmVyc2lvbk5hbWUsIGxlZmlVc2VyRGF0YSkgewotICBjaGVja1R5cGUoYyk7Ci0gIC8vIGlmICgobG9uZyl1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGZwcmludGYoZm91dCwgIlZFUlNJT04gJXMgO1xuIiwgdmVyc2lvbk5hbWUpOwotICByZXR1cm4gMDsKLX0KLQotaW50IHZpYUNCKGxlZnJDYWxsYmFja1R5cGVfZSBjLCBsZWZpVmlhKiB2aWEsIGxlZmlVc2VyRGF0YSkgewotICBjaGVja1R5cGUoYyk7Ci0gIC8vIGlmICgobG9uZyl1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGxlZlZpYSh2aWEpOwotICByZXR1cm4gMDsKLX0KLQotaW50IHZpYVJ1bGVDQihsZWZyQ2FsbGJhY2tUeXBlX2UgYywgbGVmaVZpYVJ1bGUqIHZpYVJ1bGUsIGxlZmlVc2VyRGF0YSkgewotICBpbnQgICAgICAgICAgICAgICBudW1MYXllcnMsIG51bVZpYXMsIGk7Ci0gIGxlZmlWaWFSdWxlTGF5ZXIqIHZMYXllcjsKLQotICBjaGVja1R5cGUoYyk7Ci0gIC8vIGlmICgobG9uZyl1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGZwcmludGYoZm91dCwgIlZJQVJVTEUgJXMiLCB2aWFSdWxlLT5sZWZpVmlhUnVsZTo6bmFtZSgpKTsKLSAgaWYgKHZpYVJ1bGUtPmxlZmlWaWFSdWxlOjpoYXNHZW5lcmF0ZSgpKQotICAgICBmcHJpbnRmKGZvdXQsICIgR0VORVJBVEUiKTsKLSAgaWYgKHZpYVJ1bGUtPmxlZmlWaWFSdWxlOjpoYXNEZWZhdWx0KCkpCi0gICAgIGZwcmludGYoZm91dCwgIiBERUZBVUxUIik7Ci0gIGZwcmludGYoZm91dCwgIlxuIik7Ci0KLSAgbnVtTGF5ZXJzID0gdmlhUnVsZS0+bGVmaVZpYVJ1bGU6Om51bUxheWVycygpOwotICAvLyBpZiBudW1MYXllcnMgPT0gMiwgaXQgaXMgVklBUlVMRSB3aXRob3V0IEdFTkVSQVRFIGFuZCBoYXMgdmlhIG5hbWUKLSAgLy8gaWYgbnVtTGF5ZXJzID09IDMsIGl0IGlzIFZJQVJVTEUgd2l0aCBHRU5FUkFURSwgYW5kIHRoZSAzcmQgbGF5ZXIgaXMgY3V0Ci0gIGZvciAoaSA9IDA7IGkgPCBudW1MYXllcnM7IGkrKykgewotICAgICB2TGF5ZXIgPSB2aWFSdWxlLT5sZWZpVmlhUnVsZTo6bGF5ZXIoaSk7IAotICAgICBsZWZWaWFSdWxlTGF5ZXIodkxheWVyKTsKLSAgfQotCi0gIGlmIChudW1MYXllcnMgPT0gMiAmJiAhKHZpYVJ1bGUtPmxlZmlWaWFSdWxlOjpoYXNHZW5lcmF0ZSgpKSkgewotICAgICAvLyBzaG91bGQgaGF2ZSB2aWFuYW1lcwotICAgICBudW1WaWFzID0gdmlhUnVsZS0+bGVmaVZpYVJ1bGU6Om51bVZpYXMoKTsKLSAgICAgaWYgKG51bVZpYXMgPT0gMCkKLSAgICAgICAgZnByaW50Zihmb3V0LCAiU2hvdWxkIGhhdmUgdmlhIG5hbWVzIGluIFZJQVJVTEUuXG4iKTsKLSAgICAgZWxzZSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1WaWFzOyBpKyspCi0gICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgVklBICVzIDtcbiIsIHZpYVJ1bGUtPmxlZmlWaWFSdWxlOjp2aWFOYW1lKGkpKTsKLSAgICAgfQotICB9Ci0gIGlmICh2aWFSdWxlLT5sZWZpVmlhUnVsZTo6bnVtUHJvcHMoKSA+IDApIHsKLSAgICAgZnByaW50Zihmb3V0LCAiICBQUk9QRVJUWSAiKTsKLSAgICAgZm9yIChpID0gMDsgaSA8IHZpYVJ1bGUtPmxlZmlWaWFSdWxlOjpudW1Qcm9wcygpOyBpKyspIHsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgdmlhUnVsZS0+bGVmaVZpYVJ1bGU6OnByb3BOYW1lKGkpKTsKLSAgICAgICAgaWYgKHZpYVJ1bGUtPmxlZmlWaWFSdWxlOjpwcm9wVmFsdWUoaSkpCi0gICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzICIsIHZpYVJ1bGUtPmxlZmlWaWFSdWxlOjpwcm9wVmFsdWUoaSkpOwotICAgICAgICBzd2l0Y2ggKHZpYVJ1bGUtPmxlZmlWaWFSdWxlOjpwcm9wVHlwZShpKSkgewotICAgICAgICAgICBjYXNlICdSJzogZnByaW50Zihmb3V0LCAiUkVBTCAiKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICBjYXNlICdJJzogZnByaW50Zihmb3V0LCAiSU5URUdFUiAiKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICBjYXNlICdTJzogZnByaW50Zihmb3V0LCAiU1RSSU5HICIpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIGNhc2UgJ1EnOiBmcHJpbnRmKGZvdXQsICJRVU9URVNUUklORyAiKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICBjYXNlICdOJzogZnByaW50Zihmb3V0LCAiTlVNQkVSICIpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gCi0gICAgIH0KLSAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0gIH0KLSAgZnByaW50Zihmb3V0LCAiRU5EICVzXG4iLCB2aWFSdWxlLT5sZWZpVmlhUnVsZTo6bmFtZSgpKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBleHRlbnNpb25DQihsZWZyQ2FsbGJhY2tUeXBlX2UgYywgY29uc3QgY2hhciogZXh0c24sIGxlZmlVc2VyRGF0YSkgewotICBjaGVja1R5cGUoYyk7Ci0gIC8vIGxlZnJTZXRDYXNlU2Vuc2l0aXZpdHkoMCk7Ci0gIC8vIGlmICgobG9uZyl1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGZwcmludGYoZm91dCwgIkJFR0lORVhUICVzIDtcbiIsIGV4dHNuKTsKLSAgLy8gbGVmclNldENhc2VTZW5zaXRpdml0eSgxKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBkb25lQ0IobGVmckNhbGxiYWNrVHlwZV9lIGMsIHZvaWQqLCBsZWZpVXNlckRhdGEpIHsKLSAgY2hlY2tUeXBlKGMpOwotICAvLyBpZiAoKGxvbmcpdWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBmcHJpbnRmKGZvdXQsICJFTkQgTElCUkFSWVxuIik7Ci0gIHJldHVybiAwOwotfQotIAotdm9pZCBlcnJvckNCKGNvbnN0IGNoYXIqIG1zZykgewotICBwcmludGYgKCIlcyA6ICVzXG4iLCBsZWZyR2V0VXNlckRhdGEoKSwgbXNnKTsKLX0KLQotdm9pZCB3YXJuaW5nQ0IoY29uc3QgY2hhciogbXNnKSB7Ci0gIHByaW50ZiAoIiVzIDogJXNcbiIsIGxlZnJHZXRVc2VyRGF0YSgpLCBtc2cpOwotfQotCi12b2lkKiBtYWxsb2NDQihpbnQgc2l6ZSkgewotICByZXR1cm4gbWFsbG9jKHNpemUpOwotfQotCi12b2lkKiByZWFsbG9jQ0Iodm9pZCogbmFtZSwgaW50IHNpemUpIHsKLSAgcmV0dXJuIHJlYWxsb2MobmFtZSwgc2l6ZSk7Ci19Ci0KLXZvaWQgZnJlZUNCKHZvaWQqIG5hbWUpIHsKLSAgZnJlZShuYW1lKTsKLSAgcmV0dXJuOwotfQotCi12b2lkIGxpbmVOdW1iZXJDQihpbnQgbGluZU5vKSB7Ci0gIGZwcmludGYoZm91dCwgIlBhcnNlZCAlZCBudW1iZXIgb2YgbGluZXMhIVxuIiwgbGluZU5vKTsKLSAgcmV0dXJuOwotfQotCi12b2lkIHByaW50V2FybmluZyhjb25zdCBjaGFyICpzdHIpCi17Ci0gICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgc3RyKTsKLX0KLQotCi0KLWludAotbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgY2hhciogaW5GaWxlWzEwMF07Ci0gIGNoYXIqIG91dEZpbGU7Ci0gIEZJTEUqIGY7Ci0gIGludCByZXM7Ci0gIGludCBub0NhbGxzID0gMDsKLS8vICBsb25nIHN0YXJ0X21lbTsKLSAgaW50IG51bTsKLSAgaW50IHN0YXR1czsKLSAgaW50IHJldFN0ciA9IDA7Ci0gIGludCBudW1JbkZpbGUgPSAwOwotICBpbnQgZmlsZUN0ID0gMDsKLSAgaW50IHJlbGF4ID0gMDsKLSAgY29uc3QgY2hhciogdmVyc2lvbiA9ICJOL0EiOwotICBpbnQgc2V0VmVyID0gMDsKLSAgY2hhciogdXNlckRhdGE7Ci0gIGludCBtc2dDYiA9IDA7Ci0gIGludCB0ZXN0MSA9IDA7Ci0gIGludCB0ZXN0MiA9IDA7Ci0gIGludCBjY3I3NDk4NTMgPSAwOwotICBpbnQgY2NyMTY4ODk0NiA9IDA7Ci0gIGludCBjY3IxNzA5MDg5ID0gMDsKLSAgaW50IHZlcmJvc2UgPSAwOwotCi0vLyBzdGFydF9tZW0gPSAobG9uZylzYnJrKDApOwotCi0gIHVzZXJEYXRhID0gc3RyZHVwICgiKGxlZnJ3LTUxMDApIik7Ci0gIHN0cmNweShkZWZhdWx0TmFtZSwibGVmLmluIik7Ci0gIHN0cmNweShkZWZhdWx0T3V0LCJsaXN0Iik7Ci0gIGluRmlsZVswXSA9IGRlZmF1bHROYW1lOwotICBvdXRGaWxlID0gZGVmYXVsdE91dDsKLSAgZm91dCA9IHN0ZG91dDsKLS8vICB1c2VyRGF0YSA9IDB4MDEwMjAzMDQ7Ci0KLSNpZmRlZiBXSU4zMgotICAgIC8vIEVuYWJsZSB0d28tZGlnaXQgZXhwb25lbnQgZm9ybWF0Ci0gICAgX3NldF9vdXRwdXRfZm9ybWF0KF9UV09fRElHSVRfRVhQT05FTlQpOwotI2VuZGlmCi0KLSAgYXJnYy0tOwotICBhcmd2Kys7Ci0gIHdoaWxlIChhcmdjLS0pIHsKLQotICAgIGlmIChzdHJjbXAoKmFyZ3YsICItZCIpID09IDApIHsKLSAgICAgIGFyZ3YrKzsKLSAgICAgIGFyZ2MtLTsKLSAgICAgIHNzY2FuZigqYXJndiwgIiVkIiwgJm51bSk7Ci0gICAgICBsZWZpU2V0RGVidWcobnVtLCAxKTsKLSAgICB9ZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLW5jIikgPT0gMCkgewotICAgICAgbm9DYWxscyA9IDE7Ci0KLSAgICB9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1wIikgPT0gMCkgewotICAgICAgcHJpbnRpbmcgPSAxOwotCi0gICAgfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItbSIpID09IDApIHsgLy8gdXNlIHRoZSB1c2VyIGVycm9yL3dhcm5pbmcgQ0IKLSAgICAgIG1zZ0NiID0gMTsKLQotICAgIH0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLW8iKSA9PSAwKSB7Ci0gICAgICBhcmd2Kys7Ci0gICAgICBhcmdjLS07Ci0gICAgICBvdXRGaWxlID0gKmFyZ3Y7Ci0gICAgICBpZiAoKGZvdXQgPSBmb3BlbihvdXRGaWxlLCAidyIpKSA9PSAwKSB7Ci0JZnByaW50ZihzdGRlcnIsICJFUlJPUjogY291bGQgbm90IG9wZW4gb3V0cHV0IGZpbGVcbiIpOwotCXJldHVybiAyOwotICAgICAgfQotCi0gICAgfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItdmVyU3RyIikgPT0gMCkgewotICAgICAgICAvKiBOZXcgdG8gc2V0IHRoZSB2ZXJzaW9uIGNhbGxiYWNrIHJvdXRpbmUgdG8gcmV0dXJuIGEgc3RyaW5nICAgICovCi0gICAgICAgIC8qIGluc3RlYWQgb2YgZG91YmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgcmV0U3RyID0gMTsKLQotICAgIH0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLXJlbGF4IikgPT0gMCkgewotICAgICAgICByZWxheCA9IDE7Ci0KLSAgICB9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi02NW5tIikgPT0gMCkgewotICAgICAgICBwYXJzZTY1bm0gPSAxOwotCi0gICAgfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItbGVmNTgiKSA9PSAwKSB7Ci0gICAgICAgIHBhcnNlTGVmNThUeXBlID0gMTsKLQotICAgIH0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLXZlciIpID09IDApIHsKLSAgICAgIGFyZ3YrKzsKLSAgICAgIGFyZ2MtLTsKLSAgICAgIHNldFZlciA9IDE7Ci0gICAgICB2ZXJzaW9uID0gKmFyZ3Y7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItdGVzdDEiKSA9PSAwKSB7Ci0gICAgICB0ZXN0MSA9IDE7IAotICAgIH0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLXRlc3QyIikgPT0gMCkgewotICAgICAgdGVzdDIgPSAxOyAKLSAgICB9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1zZXNzaW9ubGVzcyIpID09IDApIHsKLSAgICAgIGlzU2Vzc2lvbmxlcyA9IDE7IAotICAgIH0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLWNjcjc0OTg1MyIpID09IDApIHsKLSAgICAgIGNjcjc0OTg1MyA9IDE7IAotICAgIH0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLWNjcjE2ODg5NDYiKSA9PSAwKSB7Ci0gICAgICBjY3IxNjg4OTQ2ID0gMTsgCi0gICAgfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItY2NyMTcwOTA4OSIpID09IDApIHsKLSAgICAgIGNjcjE3MDkwODkgPSAxOwotICAgIH0gZWxzZSBpZiAoYXJndlswXVswXSAhPSAnLScpIHsKLSAgICAgIGlmIChudW1JbkZpbGUgPj0gMTAwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IHRvbyBtYW55IGlucHV0IGZpbGVzLCBtYXggPSAzLlxuIik7Ci0gICAgICAgIHJldHVybiAyOwotICAgICAgfQotICAgICAgaW5GaWxlW251bUluRmlsZSsrXSA9ICphcmd2OwotCi0gICAgfSBlbHNlIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IElsbGVnYWwgY29tbWFuZCBsaW5lIG9wdGlvbjogJyVzJ1xuIiwgKmFyZ3YpOwotICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0gICAgYXJndisrOwotICB9Ci0gIAotICAvLyBzZXRzIHRoZSBwYXJzZXIgdG8gYmUgY2FzZSBzZW5zaXRpdmUuLi4KLSAgLy8gZGVmYXVsdCB3YXMgc3VwcG9zZWQgdG8gYmUgdGhlIGNhc2UgYnV0IGZhbHNlLi4uCi0gIC8vIGxlZnJTZXRDYXNlU2Vuc2l0aXZpdHkodHJ1ZSk7Ci0gIGlmIChpc1Nlc3Npb25sZXMpIHsKLQlsZWZyU2V0T3BlbkxvZ0ZpbGVBcHBlbmQoKTsKLSAgfQotCi0gIGxlZnJJbml0U2Vzc2lvbihpc1Nlc3Npb25sZXMgPyAwIDogMSk7Ci0KLSAgaWYgKG5vQ2FsbHMgPT0gMCkgewotICAgICBsZWZyU2V0V2FybmluZ0xvZ0Z1bmN0aW9uKHByaW50V2FybmluZyk7Ci0gICAgIGxlZnJTZXRBbnRlbm5hSW5wdXRDYmsoYW50ZW5uYUNCKTsKLSAgICAgbGVmclNldEFudGVubmFJbm91dENiayhhbnRlbm5hQ0IpOwotICAgICBsZWZyU2V0QW50ZW5uYU91dHB1dENiayhhbnRlbm5hQ0IpOwotICAgICBsZWZyU2V0QXJyYXlCZWdpbkNiayhhcnJheUJlZ2luQ0IpOwotICAgICBsZWZyU2V0QXJyYXlDYmsoYXJyYXlDQik7Ci0gICAgIGxlZnJTZXRBcnJheUVuZENiayhhcnJheUVuZENCKTsKLSAgICAgbGVmclNldEJ1c0JpdENoYXJzQ2JrKGJ1c0JpdENoYXJzQ0IpOwotICAgICBsZWZyU2V0Q2FzZVNlbnNpdGl2ZUNiayhjYXNlU2Vuc0NCKTsKLSAgICAgbGVmclNldEZpeGVkTWFza0NiayhmaXhlZE1hc2tDQik7Ci0gICAgIGxlZnJTZXRDbGVhcmFuY2VNZWFzdXJlQ2JrKGNsZWFyYW5jZUNCKTsKLSAgICAgbGVmclNldERlbnNpdHlDYmsoZGVuc2l0eUNCKTsKLSAgICAgbGVmclNldERpdmlkZXJDaGFyQ2JrKGRpdmlkZXJDQik7Ci0gICAgIGxlZnJTZXROb1dpcmVFeHRlbnNpb25DYmsobm9XaXJlRXh0Q0IpOwotICAgICBsZWZyU2V0Tm9pc2VNYXJnaW5DYmsobm9pc2VNYXJDQik7Ci0gICAgIGxlZnJTZXRFZGdlUmF0ZVRocmVzaG9sZDFDYmsoZWRnZTFDQik7Ci0gICAgIGxlZnJTZXRFZGdlUmF0ZVRocmVzaG9sZDJDYmsoZWRnZTJDQik7Ci0gICAgIGxlZnJTZXRFZGdlUmF0ZVNjYWxlRmFjdG9yQ2JrKGVkZ2VTY2FsZUNCKTsKLSAgICAgbGVmclNldEV4dGVuc2lvbkNiayhleHRlbnNpb25DQik7Ci0gICAgIGxlZnJTZXROb2lzZVRhYmxlQ2JrKG5vaXNlVGFibGVDQik7Ci0gICAgIGxlZnJTZXRDb3JyZWN0aW9uVGFibGVDYmsoY29ycmVjdGlvbkNCKTsKLSAgICAgbGVmclNldERpZWxlY3RyaWNDYmsoZGllbGVjdHJpY0NCKTsKLSAgICAgbGVmclNldElSRHJvcEJlZ2luQ2JrKGlyZHJvcEJlZ2luQ0IpOwotICAgICBsZWZyU2V0SVJEcm9wQ2JrKGlyZHJvcENCKTsKLSAgICAgbGVmclNldElSRHJvcEVuZENiayhpcmRyb3BFbmRDQik7Ci0gICAgIGxlZnJTZXRMYXllckNiayhsYXllckNCKTsKLSAgICAgbGVmclNldExpYnJhcnlFbmRDYmsoZG9uZUNCKTsgCi0gICAgIGxlZnJTZXRNYWNyb0JlZ2luQ2JrKG1hY3JvQmVnaW5DQik7Ci0gICAgIGxlZnJTZXRNYWNyb0NiayhtYWNyb0NCKTsKLSAgICAgbGVmclNldE1hY3JvQ2xhc3NUeXBlQ2JrKG1hY3JvQ2xhc3NUeXBlQ0IpOwotICAgICBsZWZyU2V0TWFjcm9PcmlnaW5DYmsobWFjcm9PcmlnaW5DQik7Ci0gICAgIGxlZnJTZXRNYWNyb1NpemVDYmsobWFjcm9TaXplQ0IpOwotICAgICBsZWZyU2V0TWFjcm9GaXhlZE1hc2tDYmsobWFjcm9GaXhlZE1hc2tDQik7Ci0gICAgIGxlZnJTZXRNYWNyb0VuZENiayhtYWNyb0VuZENCKTsKLSAgICAgbGVmclNldE1hbnVmYWN0dXJpbmdDYmsobWFudWZhY3R1cmluZ0NCKTsKLSAgICAgbGVmclNldE1heFN0YWNrVmlhQ2JrKG1heFN0YWNrVmlhQ0IpOwotICAgICBsZWZyU2V0TWluRmVhdHVyZUNiayhtaW5GZWF0dXJlQ0IpOwotICAgICBsZWZyU2V0Tm9uRGVmYXVsdENiayhub25EZWZhdWx0Q0IpOwotICAgICBsZWZyU2V0T2JzdHJ1Y3Rpb25DYmsob2JzdHJ1Y3Rpb25DQik7Ci0gICAgIGxlZnJTZXRQaW5DYmsocGluQ0IpOwotICAgICBsZWZyU2V0UHJvcEJlZ2luQ2JrKHByb3BEZWZCZWdpbkNCKTsKLSAgICAgbGVmclNldFByb3BDYmsocHJvcERlZkNCKTsKLSAgICAgbGVmclNldFByb3BFbmRDYmsocHJvcERlZkVuZENCKTsKLSAgICAgbGVmclNldFNpdGVDYmsoc2l0ZUNCKTsKLSAgICAgbGVmclNldFNwYWNpbmdCZWdpbkNiayhzcGFjaW5nQmVnaW5DQik7Ci0gICAgIGxlZnJTZXRTcGFjaW5nQ2JrKHNwYWNpbmdDQik7Ci0gICAgIGxlZnJTZXRTcGFjaW5nRW5kQ2JrKHNwYWNpbmdFbmRDQik7Ci0gICAgIGxlZnJTZXRUaW1pbmdDYmsodGltaW5nQ0IpOwotICAgICBsZWZyU2V0VW5pdHNDYmsodW5pdHNDQik7Ci0gICAgIGxlZnJTZXRVc2VNaW5TcGFjaW5nQ2JrKHVzZU1pblNwYWNpbmdDQik7Ci0gICAgIGxlZnJTZXRVc2VyRGF0YSgodm9pZCopMyk7Ci0gICAgIGlmICghcmV0U3RyKQotICAgICAgIGxlZnJTZXRWZXJzaW9uQ2JrKHZlcnNpb25DQik7Ci0gICAgIGVsc2UKLSAgICAgICBsZWZyU2V0VmVyc2lvblN0ckNiayh2ZXJzaW9uU3RyQ0IpOwotICAgICBsZWZyU2V0VmlhQ2JrKHZpYUNCKTsKLSAgICAgbGVmclNldFZpYVJ1bGVDYmsodmlhUnVsZUNCKTsKLSAgICAgbGVmclNldElucHV0QW50ZW5uYUNiayhhbnRlbm5hQ0IpOwotICAgICBsZWZyU2V0T3V0cHV0QW50ZW5uYUNiayhhbnRlbm5hQ0IpOwotICAgICBsZWZyU2V0SW5vdXRBbnRlbm5hQ2JrKGFudGVubmFDQik7Ci0KLSAgICAgaWYgKG1zZ0NiKSB7Ci0gICAgICAgbGVmclNldExvZ0Z1bmN0aW9uKGVycm9yQ0IpOwotICAgICAgIGxlZnJTZXRXYXJuaW5nTG9nRnVuY3Rpb24od2FybmluZ0NCKTsKLSAgICAgfQotCi0gICAgIGxlZnJTZXRNYWxsb2NGdW5jdGlvbihtYWxsb2NDQik7Ci0gICAgIGxlZnJTZXRSZWFsbG9jRnVuY3Rpb24ocmVhbGxvY0NCKTsKLSAgICAgbGVmclNldEZyZWVGdW5jdGlvbihmcmVlQ0IpOwotCi0gICAgIGxlZnJTZXRMaW5lTnVtYmVyRnVuY3Rpb24obGluZU51bWJlckNCKTsKLSAgICAgbGVmclNldERlbHRhTnVtYmVyTGluZXMoNTApOwotICAKLSAgICAgbGVmclNldFJlZ2lzdGVyVW51c2VkQ2FsbGJhY2tzKCk7Ci0KLSAgICAgaWYgKHJlbGF4KQotICAgICAgIGxlZnJTZXRSZWxheE1vZGUoKTsKLQotICAgICBpZiAoc2V0VmVyKQotICAgICAgICh2b2lkKWxlZnJTZXRWZXJzaW9uVmFsdWUodmVyc2lvbik7Ci0KLSAgICAgbGVmclNldEFudGVubmFJbm91dFdhcm5pbmdzKDMwKTsKLSAgICAgbGVmclNldEFudGVubmFJbnB1dFdhcm5pbmdzKDMwKTsKLSAgICAgbGVmclNldEFudGVubmFPdXRwdXRXYXJuaW5ncygzMCk7Ci0gICAgIGxlZnJTZXRBcnJheVdhcm5pbmdzKDMwKTsKLSAgICAgbGVmclNldENhc2VTZW5zaXRpdmVXYXJuaW5ncygzMCk7Ci0gICAgIGxlZnJTZXRDb3JyZWN0aW9uVGFibGVXYXJuaW5ncygzMCk7Ci0gICAgIGxlZnJTZXREaWVsZWN0cmljV2FybmluZ3MoMzApOwotICAgICBsZWZyU2V0RWRnZVJhdGVUaHJlc2hvbGQxV2FybmluZ3MoMzApOwotICAgICBsZWZyU2V0RWRnZVJhdGVUaHJlc2hvbGQyV2FybmluZ3MoMzApOwotICAgICBsZWZyU2V0RWRnZVJhdGVTY2FsZUZhY3Rvcldhcm5pbmdzKDMwKTsKLSAgICAgbGVmclNldElub3V0QW50ZW5uYVdhcm5pbmdzKDMwKTsKLSAgICAgbGVmclNldElucHV0QW50ZW5uYVdhcm5pbmdzKDMwKTsKLSAgICAgbGVmclNldElSRHJvcFdhcm5pbmdzKDMwKTsKLSAgICAgbGVmclNldExheWVyV2FybmluZ3MoMzApOwotICAgICBsZWZyU2V0TWFjcm9XYXJuaW5ncygzMCk7Ci0gICAgIGxlZnJTZXRNYXhTdGFja1ZpYVdhcm5pbmdzKDMwKTsKLSAgICAgbGVmclNldE1pbkZlYXR1cmVXYXJuaW5ncygzMCk7Ci0gICAgIGxlZnJTZXROb2lzZU1hcmdpbldhcm5pbmdzKDMwKTsKLSAgICAgbGVmclNldE5vaXNlVGFibGVXYXJuaW5ncygzMCk7Ci0gICAgIGxlZnJTZXROb25EZWZhdWx0V2FybmluZ3MoMzApOwotICAgICBsZWZyU2V0Tm9XaXJlRXh0ZW5zaW9uV2FybmluZ3MoMzApOwotICAgICBsZWZyU2V0T3V0cHV0QW50ZW5uYVdhcm5pbmdzKDMwKTsKLSAgICAgbGVmclNldFBpbldhcm5pbmdzKDMwKTsKLSAgICAgbGVmclNldFNpdGVXYXJuaW5ncygzMCk7Ci0gICAgIGxlZnJTZXRTcGFjaW5nV2FybmluZ3MoMzApOwotICAgICBsZWZyU2V0VGltaW5nV2FybmluZ3MoMzApOwotICAgICBsZWZyU2V0VW5pdHNXYXJuaW5ncygzMCk7Ci0gICAgIGxlZnJTZXRVc2VNaW5TcGFjaW5nV2FybmluZ3MoMzApOwotICAgICBsZWZyU2V0VmlhUnVsZVdhcm5pbmdzKDMwKTsKLSAgICAgbGVmclNldFZpYVdhcm5pbmdzKDMwKTsKLSAgfQotCi0gICh2b2lkKSBsZWZyU2V0U2hpZnRDYXNlKCk7ICAvLyB3aWxsIHNoaWZ0IG5hbWUgdG8gdXBwZXJjYXNlIGlmIGNhc2VpbnNlbnNpdGl2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgc2V0IHRvIG9mZiBvciBub3Qgc2V0Ci0gIGlmICghaXNTZXNzaW9ubGVzKSB7Ci0JbGVmclNldE9wZW5Mb2dGaWxlQXBwZW5kKCk7Ci0gIH0KLQotICBpZiAoY2NyNzQ5ODUzKSB7Ci0gICAgbGVmclNldFRvdGFsTXNnTGltaXQgKDUpOwotICAgIGxlZnJTZXRMaW1pdFBlck1zZyAoMTYxOCwgMik7Ci0gIH0KLQotICBpZiAoY2NyMTY4ODk0NikgewotICAgIGxlZnJSZWdpc3RlckxlZjU4VHlwZSgiWFlaIiwgIkNVVCIpOwotICAgIGxlZnJSZWdpc3RlckxlZjU4VHlwZSgiWFlaIiwgIkNVVCIpOwotICB9Ci0KLSAgaWYgKHRlc3QxKSB7ICAvLyBmb3Igc3BlY2lhbCB0ZXN0cwotICAgIGZvciAoZmlsZUN0ID0gMDsgZmlsZUN0IDwgbnVtSW5GaWxlOyBmaWxlQ3QrKykgewotICAgICAgbGVmclJlc2V0KCk7Ci0KLSAgICAgIGlmICgoZiA9IGZvcGVuKGluRmlsZVtmaWxlQ3RdLCJyIikpID09IDApIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIkNvdWxkbid0IG9wZW4gaW5wdXQgZmlsZSAnJXMnXG4iLCBpbkZpbGVbZmlsZUN0XSk7Ci0gICAgICAgIHJldHVybigyKTsKLSAgICAgIH0KLQotICAgICAgKHZvaWQpbGVmckVuYWJsZVJlYWRFbmNyeXB0ZWQoKTsKLQotICAgICAgc3RhdHVzID0gbGVmd0luaXQoZm91dCk7IC8vIGluaXRpYWxpemUgdGhlIGxlZiB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBiZSBjYWxsZWQgMXN0Ci0gICAgICBpZiAoc3RhdHVzICE9IExFRldfT0spCi0gICAgICAgICByZXR1cm4gMTsKLSAgCi0gICAgICByZXMgPSBsZWZyUmVhZChmLCBpbkZpbGVbZmlsZUN0XSwgKHZvaWQqKXVzZXJEYXRhKTsKLQotICAgICAgaWYgKHJlcykKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUmVhZGVyIHJldHVybnMgYmFkIHN0YXR1cy5cbiIsIGluRmlsZVtmaWxlQ3RdKTsKLQotICAgICAgKHZvaWQpbGVmclByaW50VW51c2VkQ2FsbGJhY2tzKGZvdXQpOwotICAgICAgKHZvaWQpbGVmclJlbGVhc2VOUmVzZXRNZW1vcnkoKTsKLSAgICAgIC8vKHZvaWQpbGVmclVuc2V0Q2FsbGJhY2tzKCk7Ci0gICAgICAodm9pZClsZWZyVW5zZXRMYXllckNiaygpOwotICAgICAgKHZvaWQpbGVmclVuc2V0Tm9uRGVmYXVsdENiaygpOwotICAgICAgKHZvaWQpbGVmclVuc2V0VmlhQ2JrKCk7Ci0KLSAgICB9Ci0gIH0KLSAgZWxzZSBpZiAodGVzdDIpIHsgIC8vIGZvciBzcGVjaWFsIHRlc3RzCi0gICAgLy8gdGhpcyB0ZXN0IGlzIGRlc2lnbiB0byB0ZXN0IHRoZSAzIEFQSXMsIGxlZnJEaXNhYmxlUGFyc2VyTXNncywKLSAgICAvLyBsZWZyRW5hYmxlUGFyc2VyTXNncyAmIGxlZnJFbmFibGVBbGxNc2dzCi0gICAgLy8gSXQgdXNlcyB0aGUgZmlsZSBjY3I1NjYyMDkubGVmLiAgVGhpcyBmaWxlIHdpbGwgcGFyc2VyIDMgdGltZXMKLSAgICAvLyAxc3QgaXQgd2lsbCBoYXZlIGxlZnJEaXNhYmxlUGFyc2VyTXNncyBzZXQgdG8gYm90aCAyMDA3ICYgMjAwOAotICAgIC8vIDJuZCB3aWxsIGVuYWJsZSAyMDA3IGJ5IGNhbGxpbmcgbGVmckVuYWJsZVBhcnNlck1zZ3MKLSAgICAvLyAzcmQgZW5hYmxlIGFsbCBtc2dzIGJ5IGNhbGwgbGVmckVuYWJsZUFsbE1zZ3MKLQotICAgIGludCBuTXNncyA9IDM7Ci0gICAgaW50IGRNc2dzWzNdOwotICAgIGlmIChudW1JbkZpbGUgIT0gMSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiVGVzdCAyIG1vZGUgbmVlZHMgb25seSAxIGZpbGVcbiIpOwotICAgICAgICByZXR1cm4gMjsKLSAgICB9IAotCi0gICAgZm9yIChpbnQgaWR4PTA7IGlkeDw1OyBpZHgrKykgewotICAgICAgaWYgKGlkeCA9PSAwKSB7ICAvLyBtc2dzIDIwMDUgJiAyMDExCi0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwiXG5QYXNzIDA6IERpc2FibGluZyAyMDA3LCAyMDA4LCAyMDA5XG4iKTsKLSAgICAgICAgIGRNc2dzWzBdID0gMjAwNzsKLSAgICAgICAgIGRNc2dzWzFdID0gMjAwODsKLSAgICAgICAgIGRNc2dzWzJdID0gMjAwOTsKLSAgICAgICAgIGxlZnJEaXNhYmxlUGFyc2VyTXNncyAoMywgKGludCopZE1zZ3MpOwotICAgICAgfSBlbHNlIGlmIChpZHggPT0gMSkgeyAvLyBtc2dzIDIwMDcgJiAyMDA1LCAyMDExIGRpZCBub3QgcHJpbnQgYmVjYXVzZQotICAgICAgICAgZnByaW50ZihzdGRlcnIsIlxuUGFzcyAxOiBFbmFibGUgMjAwN1xuIik7Ci0gICAgICAgICBkTXNnc1swXSA9IDIwMDc7ICAgICAgIC8vIGxlZnJVbnNldExheWVyQ2JrKCkgd2FzIGNhbGxlZAotICAgICAgICAgbGVmckVuYWJsZVBhcnNlck1zZ3MgKDEsIChpbnQqKWRNc2dzKTsKLSAgICAgIH0gZWxzZSBpZiAoaWR4ID09IDIpIHsgLy8gbm90aGluZyB3ZXJlIHByaW50ZWQKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCJcblBhc3MgMjogRGlzYWJsZSBhbGxcbiIpOwotICAgICAgICAgbGVmckRpc2FibGVBbGxNc2dzKCk7Ci0gICAgICB9IGVsc2UgaWYgKGlkeCA9PSAzKSB7IC8vIG5vdGhpbmcgd2VyZSBwcmludGVkLCBsZWZyRGlzYWJsZVBhcnNlck1zZ3MKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCJcblBhc3MgMzogRW5hYmxlIEFsbFxuIik7Ci0gICAgICAgICBsZWZyRW5hYmxlQWxsTXNncygpOwotICAgICAgfSBlbHNlIGlmIChpZHggPT0gNCkgeyAvLyBtc2dzIDIwMDUgd2FzIHByaW50ZWQKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCJcblBhc3MgNDogU2V0IGxpbWl0IG9uIDIwMDcgdXAgMlxuIik7Ci0gICAgICAgICBsZWZyU2V0TGltaXRQZXJNc2cgKDIwMDcsIDIpOwotICAgICAgfSAKLQotICAgICAgaWYgKChmID0gZm9wZW4oaW5GaWxlW2ZpbGVDdF0sInIiKSkgPT0gMCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiQ291bGRuJ3Qgb3BlbiBpbnB1dCBmaWxlICclcydcbiIsIGluRmlsZVtmaWxlQ3RdKTsKLSAgICAgICAgcmV0dXJuKDIpOwotICAgICAgfQotCi0gICAgICAodm9pZClsZWZyRW5hYmxlUmVhZEVuY3J5cHRlZCgpOwotCi0gICAgICBzdGF0dXMgPSBsZWZ3SW5pdChmb3V0KTsgLy8gaW5pdGlhbGl6ZSB0aGUgbGVmIHdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGJlIGNhbGxlZCAxc3QKLSAgICAgIGlmIChzdGF0dXMgIT0gTEVGV19PSykKLSAgICAgICAgIHJldHVybiAxOwotICAKLSAgICAgIHJlcyA9IGxlZnJSZWFkKGYsIGluRmlsZVtmaWxlQ3RdLCAodm9pZCopdXNlckRhdGEpOwotCi0gICAgICBpZiAocmVzKQotICAgICAgICAgZnByaW50ZihzdGRlcnIsICJSZWFkZXIgcmV0dXJucyBiYWQgc3RhdHVzLlxuIiwgaW5GaWxlW2ZpbGVDdF0pOwotCi0gICAgICAodm9pZClsZWZyUHJpbnRVbnVzZWRDYWxsYmFja3MoZm91dCk7Ci0gICAgICAodm9pZClsZWZyUmVsZWFzZU5SZXNldE1lbW9yeSgpOwotICAgICAgLy8odm9pZClsZWZyVW5zZXRDYWxsYmFja3MoKTsKLSAgICAgICh2b2lkKWxlZnJVbnNldExheWVyQ2JrKCk7Ci0gICAgICAodm9pZClsZWZyVW5zZXROb25EZWZhdWx0Q2JrKCk7Ci0gICAgICAodm9pZClsZWZyVW5zZXRWaWFDYmsoKTsKLQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBmb3IgKGZpbGVDdCA9IDA7IGZpbGVDdCA8IG51bUluRmlsZTsgZmlsZUN0KyspIHsKLSAgICAgIGxlZnJSZXNldCgpOwotCi0gICAgICBpZiAoKGYgPSBmb3BlbihpbkZpbGVbZmlsZUN0XSwiciIpKSA9PSAwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCJDb3VsZG4ndCBvcGVuIGlucHV0IGZpbGUgJyVzJ1xuIiwgaW5GaWxlW2ZpbGVDdF0pOwotICAgICAgICByZXR1cm4oMik7Ci0gICAgICB9Ci0KLSAgICAgICh2b2lkKWxlZnJFbmFibGVSZWFkRW5jcnlwdGVkKCk7Ci0KLSAgICAgIHN0YXR1cyA9IGxlZndJbml0KGZvdXQpOyAvLyBpbml0aWFsaXplIHRoZSBsZWYgd3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gYmUgY2FsbGVkIDFzdAotICAgICAgaWYgKHN0YXR1cyAhPSBMRUZXX09LKQotICAgICAgICAgcmV0dXJuIDE7Ci0gIAotICAgICAgaWYgKGNjcjE3MDkwODkpIHsKLSAgICAgICAgLy8gQ0NSIDE3MDkwODkgdGVzdC4KLSAgICAgICAgLy8gTm9uLWluaXRpYWxpemVkIGxlZkRhdGEgY2FzZS4KLSAgICAgICAgbGVmclNldExpbWl0UGVyTXNnKDEwMDAwLCAxMDAwMCk7Ci0gICAgICB9Ci0KLSAgICAgIHJlcyA9IGxlZnJSZWFkKGYsIGluRmlsZVtmaWxlQ3RdLCAodm9pZCopdXNlckRhdGEpOwotCi0gICAgICBpZiAoY2NyMTcwOTA4OSkgewotICAgICAgICAvLyBDQ1IgMTcwOTA4OSB0ZXN0LgotICAgICAgICAvLyBJbml0aWFsaXplZCBsZWZEYXRhIGNhc2UuCi0gICAgICAgIGxlZnJTZXRMaW1pdFBlck1zZygxMDAwMCwgMTAwMDApOwotICAgICAgfQotCi0gICAgICBpZiAocmVzKQotICAgICAgICAgZnByaW50ZihzdGRlcnIsICJSZWFkZXIgcmV0dXJucyBiYWQgc3RhdHVzLlxuIiwgaW5GaWxlW2ZpbGVDdF0pOwotCi0gICAgICAodm9pZClsZWZyUHJpbnRVbnVzZWRDYWxsYmFja3MoZm91dCk7Ci0gICAgICAodm9pZClsZWZyUmVsZWFzZU5SZXNldE1lbW9yeSgpOwotCi0gICAgfQotICAgICh2b2lkKWxlZnJVbnNldENhbGxiYWNrcygpOwotICB9Ci0gIC8vIFVuc2V0IGFsbCB0aGUgY2FsbGJhY2tzCi0gIHZvaWQgbGVmclVuc2V0QW50ZW5uYUlucHV0Q2JrKCk7Ci0gIHZvaWQgbGVmclVuc2V0QW50ZW5uYUlub3V0Q2JrKCk7Ci0gIHZvaWQgbGVmclVuc2V0QW50ZW5uYU91dHB1dENiaygpOwotICB2b2lkIGxlZnJVbnNldEFycmF5QmVnaW5DYmsoKTsKLSAgdm9pZCBsZWZyVW5zZXRBcnJheUNiaygpOwotICB2b2lkIGxlZnJVbnNldEFycmF5RW5kQ2JrKCk7Ci0gIHZvaWQgbGVmclVuc2V0QnVzQml0Q2hhcnNDYmsoKTsKLSAgdm9pZCBsZWZyVW5zZXRDYXNlU2Vuc2l0aXZlQ2JrKCk7Ci0gIHZvaWQgbGVmclVuc2V0Rml4ZWRNYXNrQ2JrKCk7Ci0gIHZvaWQgbGVmclVuc2V0Q2xlYXJhbmNlTWVhc3VyZUNiaygpOwotICB2b2lkIGxlZnJVbnNldENvcnJlY3Rpb25UYWJsZUNiaygpOwotICB2b2lkIGxlZnJVbnNldERlbnNpdHlDYmsoKTsKLSAgdm9pZCBsZWZyVW5zZXREaWVsZWN0cmljQ2JrKCk7Ci0gIHZvaWQgbGVmclVuc2V0RGl2aWRlckNoYXJDYmsoKTsKLSAgdm9pZCBsZWZyVW5zZXRFZGdlUmF0ZVNjYWxlRmFjdG9yQ2JrKCk7Ci0gIHZvaWQgbGVmclVuc2V0RWRnZVJhdGVUaHJlc2hvbGQxQ2JrKCk7Ci0gIHZvaWQgbGVmclVuc2V0RWRnZVJhdGVUaHJlc2hvbGQyQ2JrKCk7Ci0gIHZvaWQgbGVmclVuc2V0RXh0ZW5zaW9uQ2JrKCk7Ci0gIHZvaWQgbGVmclVuc2V0SW5vdXRBbnRlbm5hQ2JrKCk7Ci0gIHZvaWQgbGVmclVuc2V0SW5wdXRBbnRlbm5hQ2JrKCk7Ci0gIHZvaWQgbGVmclVuc2V0SVJEcm9wQmVnaW5DYmsoKTsKLSAgdm9pZCBsZWZyVW5zZXRJUkRyb3BDYmsoKTsKLSAgdm9pZCBsZWZyVW5zZXRJUkRyb3BFbmRDYmsoKTsKLSAgdm9pZCBsZWZyVW5zZXRMYXllckNiaygpOwotICB2b2lkIGxlZnJVbnNldExpYnJhcnlFbmRDYmsoKTsKLSAgdm9pZCBsZWZyVW5zZXRNYWNyb0JlZ2luQ2JrKCk7Ci0gIHZvaWQgbGVmclVuc2V0TWFjcm9DYmsoKTsKLSAgdm9pZCBsZWZyVW5zZXRNYWNyb0NsYXNzVHlwZUNiaygpOwotICB2b2lkIGxlZnJVbnNldE1hY3JvRW5kQ2JrKCk7Ci0gIHZvaWQgbGVmclVuc2V0TWFjcm9PcmlnaW5DYmsoKTsKLSAgdm9pZCBsZWZyVW5zZXRNYWNyb1NpemVDYmsoKTsKLSAgdm9pZCBsZWZyVW5zZXRNYW51ZmFjdHVyaW5nQ2JrKCk7Ci0gIHZvaWQgbGVmclVuc2V0TWF4U3RhY2tWaWFDYmsoKTsKLSAgdm9pZCBsZWZyVW5zZXRNaW5GZWF0dXJlQ2JrKCk7Ci0gIHZvaWQgbGVmclVuc2V0Tm9pc2VNYXJnaW5DYmsoKTsKLSAgdm9pZCBsZWZyVW5zZXROb2lzZVRhYmxlQ2JrKCk7Ci0gIHZvaWQgbGVmclVuc2V0Tm9uRGVmYXVsdENiaygpOwotICB2b2lkIGxlZnJVbnNldE5vV2lyZUV4dGVuc2lvbkNiaygpOwotICB2b2lkIGxlZnJVbnNldE9ic3RydWN0aW9uQ2JrKCk7Ci0gIHZvaWQgbGVmclVuc2V0T3V0cHV0QW50ZW5uYUNiaygpOwotICB2b2lkIGxlZnJVbnNldFBpbkNiaygpOwotICB2b2lkIGxlZnJVbnNldFByb3BCZWdpbkNiaygpOwotICB2b2lkIGxlZnJVbnNldFByb3BDYmsoKTsKLSAgdm9pZCBsZWZyVW5zZXRQcm9wRW5kQ2JrKCk7Ci0gIHZvaWQgbGVmclVuc2V0U2l0ZUNiaygpOwotICB2b2lkIGxlZnJVbnNldFNwYWNpbmdCZWdpbkNiaygpOwotICB2b2lkIGxlZnJVbnNldFNwYWNpbmdDYmsoKTsKLSAgdm9pZCBsZWZyVW5zZXRTcGFjaW5nRW5kQ2JrKCk7Ci0gIHZvaWQgbGVmclVuc2V0VGltaW5nQ2JrKCk7Ci0gIHZvaWQgbGVmclVuc2V0VXNlTWluU3BhY2luZ0NiaygpOwotICB2b2lkIGxlZnJVbnNldFVuaXRzQ2JrKCk7Ci0gIHZvaWQgbGVmclVuc2V0VmVyc2lvbkNiaygpOwotICB2b2lkIGxlZnJVbnNldFZlcnNpb25TdHJDYmsoKTsKLSAgdm9pZCBsZWZyVW5zZXRWaWFDYmsoKTsKLSAgdm9pZCBsZWZyVW5zZXRWaWFSdWxlQ2JrKCk7Ci0KLSAgZmNsb3NlKGZvdXQpOwotCi0gIC8vIFJlbGVhc2UgYWxsb2NhdGVkIHNpbmdsZXRvbiBkYXRhLgotICBsZWZyQ2xlYXIoKTsgICAgCi0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmd3JpdGUvbGVmd3JpdGUuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZndyaXRlL2xlZndyaXRlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU0ZTM1My4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmd3JpdGUvbGVmd3JpdGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjExNiArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyIC0gMjAxNywgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcwotLy8gCi0vLyBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgIHRoZSAgQ2FkZW5jZSAgTEVGL0RFRiAgT3BlbiAgIFNvdXJjZQotLy8gRGlzdHJpYnV0aW9uLCAgUHJvZHVjdCBWZXJzaW9uIDUuOC4gCi0vLyAKLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLyAKLS8vICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vIAotLy8gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotLy8gICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0vLyAgICBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLyAKLS8vIEZvciB1cGRhdGVzLCBzdXBwb3J0LCBvciB0byBiZWNvbWUgcGFydCBvZiB0aGUgTEVGL0RFRiBDb21tdW5pdHksCi0vLyBjaGVjayB3d3cub3BlbmVkYS5vcmcgZm9yIGRldGFpbHMuCi0vLyAKLS8vICAkQXV0aG9yJAotLy8gICRSZXZpc2lvbiQKLS8vICAkRGF0ZSQKLS8vICAkU3RhdGU6ICAkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaWZuZGVmIFdJTjMyCi0jICAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYgLyogbm90IFdJTjMyICovCi0jaW5jbHVkZSAibGVmd1dyaXRlci5ocHAiCi0KLWNoYXIgZGVmYXVsdE91dFsxMjhdOwotCi0vLyBHbG9iYWwgdmFyaWFibGVzCi1GSUxFKiBmb3V0OwotCi0jZGVmaW5lIENIRUNLX1NUQVRVUyhzdGF0dXMpIFwKLSAgaWYgKHN0YXR1cykgeyAgICAgICAgICAgICAgXAotICAgICBsZWZ3UHJpbnRFcnJvcihzdGF0dXMpOyBcCi0gICAgIHJldHVybihzdGF0dXMpOyAgICAgICAgIFwKLSAgfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgY2hhciogb3V0ZmlsZTsKLSAgaW50ICAgc3RhdHVzOyAgICAvLyByZXR1cm4gY29kZSwgaWYgbm9uZSAwIG1lYW5zIGVycm9yCi0gIGludCAgIGxpbmVOdW0gPSAwOwotCi0gIC8vIGFzc2lnbiB0aGUgZGVmYXVsdAotICBzdHJjcHkoZGVmYXVsdE91dCwgImxlZi5pbiIpOwotICBvdXRmaWxlID0gZGVmYXVsdE91dDsKLSAgZm91dCA9IHN0ZG91dDsKLQotICBkb3VibGUgKnhwYXRoOwotICBkb3VibGUgKnlwYXRoOwotICBkb3VibGUgKnhsOwotICBkb3VibGUgKnlsOwotICBkb3VibGUgKnd0aG4sICpzcG5nOwotICBpbnQgICAgKmFzcGM7Ci0gIGludCAgICBlbmNyeXB0ID0gMDsKLQotI2lmZGVmIFdJTjMyCi0gICAgLy8gRW5hYmxlIHR3by1kaWdpdCBleHBvbmVudCBmb3JtYXQKLSAgICBfc2V0X291dHB1dF9mb3JtYXQoX1RXT19ESUdJVF9FWFBPTkVOVCk7Ci0jZW5kaWYKLQotICBhcmdjLS07Ci0gIGFyZ3YrKzsKLSAgd2hpbGUgKGFyZ2MtLSkgewotICAgICBpZiAoc3RyY21wKCphcmd2LCAiLW8iKSA9PSAwKSB7ICAgLy8gb3V0cHV0IGZpbGVuYW1lCi0gICAgICAgIGFyZ3YrKzsKLSAgICAgICAgYXJnYy0tOwotICAgICAgICBvdXRmaWxlID0gKmFyZ3Y7Ci0gICAgICAgIGlmICgoZm91dCA9IGZvcGVuKG91dGZpbGUsICJ3IikpID09IDApIHsKLSAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogY291bGQgbm90IG9wZW4gb3V0cHV0IGZpbGVcbiIpOwotICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgfQotICAgICB9IGVsc2UgaWYgKHN0cm5jbXAoKmFyZ3YsICAiLWgiLCAyKSA9PSAwKSB7ICAvLyBjb21wYXJlIHdpdGggLWhbZWxwXQotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBsZWZ3cml0ZSBbLW8gPGZpbGVuYW1lPl0gWy1lXSBbLWhlbHBdXG4iKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgIH0gZWxzZSBpZiAoc3RybmNtcCgqYXJndiwgICItZSIsIDIpID09IDApIHsgIC8vIGNvbXBhcmUgd2l0aCAtZVtuY3J5cHRdCi0gICAgICAgIGVuY3J5cHQgPSAxOyAKLSAgICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogSWxsZWdhbCBjb21tYW5kIGxpbmUgb3B0aW9uOiAnJXMnXG4iLCAqYXJndik7Ci0gICAgICAgIHJldHVybiAyOwotICAgICB9Ci0gICAgIGFyZ3YrKzsKLSAgfQotCi0gIC8vIGluaXRhbGl6ZQotICBzdGF0dXMgPSBsZWZ3SW5pdChmb3V0KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgLy8gc2V0IHRvIHdyaXRlIGFuIGVuY3J5cHRlZCBmaWxlCi0gIGlmIChlbmNyeXB0KSB7Ci0gICAgIHN0YXR1cyA9IGxlZndFbmNyeXB0KCk7Ci0gICAgIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICB9Ci0KLSAgc3RhdHVzID0gbGVmd1ZlcnNpb24oNSwgOCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotLy8gIHN0YXR1cyA9IGxlZndDYXNlU2Vuc2l0aXZlKCJPTiIpOyAgIDUuNgotLy8gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotLy8gIHN0YXR1cyA9IGxlZndOb1dpcmVFeHRlbnNpb25BdFBpbigiT04iKTsgIDUuNgotLy8gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3QnVzQml0Q2hhcnMoIjw+Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3RGl2aWRlckNoYXIoIjoiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYW51ZmFjdHVyaW5nR3JpZCgzLjUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0ZpeGVkTWFzaygpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1VzZU1pblNwYWNpbmcoIk9CUyIsICJPRkYiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0vLyAgc3RhdHVzID0gbGVmd1VzZU1pblNwYWNpbmcoIlBJTiIsICJPTiIpOyAgNS42Ci0vLyAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndDbGVhcmFuY2VNZWFzdXJlKCJFVUNMSURFQU4iKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIC8vIHN0YXR1cyA9IGxlZndDbGVhcmFuY2VNZWFzdXJlKCJNQVhYWSIpOyAgNS42Ci0gIC8vIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TmV3TGluZSgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICAvLyA1LjQgQU5URU5OQQotICBzdGF0dXMgPSBsZWZ3QW50ZW5uYUlucHV0R2F0ZUFyZWEoNDUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0FudGVubmFJbk91dERpZmZBcmVhKDY1KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndBbnRlbm5hT3V0cHV0RGlmZkFyZWEoNTUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd05ld0xpbmUoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgLy8gVU5JVFMKLSAgc3RhdHVzID0gbGVmd1N0YXJ0VW5pdHMoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndVbml0cygxMDAsIDEwLCAxMDAwMCwgMTAwMDAsIDEwMDAwLCAxMDAwLCAyMDAwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3VW5pdHNGcmVxdWVuY3koMTApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZFVuaXRzKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIC8vIFBST1BFUlRZREVGSU5JVElPTlMKLSAgc3RhdHVzID0gbGVmd1N0YXJ0UHJvcERlZigpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1N0cmluZ1Byb3BEZWYoIkxJQlJBUlkiLCAiTkFNRSIsIDAsIDAsICJDYWRlbmNlOTYiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndJbnRQcm9wRGVmKCJMSUJSQVJZIiwgImludE51bSIsIDAsIDAsIDIwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndSZWFsUHJvcERlZigiTElCUkFSWSIsICJyZWFsTnVtIiwgMCwgMCwgMjEuMjIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1N0cmluZ1Byb3BEZWYoIlBJTiIsICJUWVBFIiwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3SW50UHJvcERlZigiUElOIiwgImludFByb3AiLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndSZWFsUHJvcERlZigiUElOIiwgInJlYWxQcm9wIiwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3U3RyaW5nUHJvcERlZigiTUFDUk8iLCAic3RyaW5nUHJvcCIsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0ludFByb3BEZWYoIk1BQ1JPIiwgImludGVnZXJQcm9wIiwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3UmVhbFByb3BEZWYoIk1BQ1JPIiwgIldFSUdIVCIsIDEuMCwgMTAwLjAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1N0cmluZ1Byb3BEZWYoIlZJQSIsICJzdHJpbmdQcm9wZXJ0eSIsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1JlYWxQcm9wRGVmKCJWSUEiLCAicmVhbFByb3AiLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndJbnRQcm9wRGVmKCJWSUEiLCAiQ09VTlQiLCAxLCAxMDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1N0cmluZ1Byb3BEZWYoIkxBWUVSIiwgImxzcCIsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0ludFByb3BEZWYoIkxBWUVSIiwgImxpcCIsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1JlYWxQcm9wRGVmKCJMQVlFUiIsICJscnAiLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndTdHJpbmdQcm9wRGVmKCJWSUFSVUxFIiwgInZyc3AiLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndSZWFsUHJvcERlZigiVklBUlVMRSIsICJ2cmlwIiwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3SW50UHJvcERlZigiVklBUlVMRSIsICJ2cnJwIiwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3U3RyaW5nUHJvcERlZigiTk9OREVGQVVMVFJVTEUiLCAibmRyc3AiLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndJbnRQcm9wRGVmKCJOT05ERUZBVUxUUlVMRSIsICJuZHJpcCIsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1JlYWxQcm9wRGVmKCJOT05ERUZBVUxUUlVMRSIsICJuZHJycCIsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZFByb3BEZWYoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgLy8gTEFZRVJTCi0gIGRvdWJsZSAqY3VycmVudDsKLSAgZG91YmxlICpkaWZmczsKLSAgZG91YmxlICpyYXRpb3M7Ci0gIGRvdWJsZSAqYXJlYTsKLSAgZG91YmxlICp3aWR0aDsKLQotICBjdXJyZW50ID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpKjE1KTsKLSAgZGlmZnMgPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkqMTUpOwotICByYXRpb3MgPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkqMTUpOwotCi0gIHN0YXR1cyA9IGxlZndTdGFydExheWVyKCJQT0xZUyIsICJNQVNURVJTTElDRSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1N0cmluZ1Byb3BlcnR5KCJsc3AiLCAidG9wIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3SW50UHJvcGVydHkoImxpcCIsIDEpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1JlYWxQcm9wZXJ0eSgibHJwIiwgMi4zKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRMYXllcigiUE9MWVMiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgc3RhdHVzID0gbGVmd1N0YXJ0TGF5ZXIoIkNVVDAxIiwgIkNVVCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyRENDdXJyZW50RGVuc2l0eSgiQVZFUkFHRSIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY3VycmVudFswXSA9IDIuMDsKLSAgY3VycmVudFsxXSA9IDUuMDsKLSAgY3VycmVudFsyXSA9IDEwLjA7Ci0gIHN0YXR1cyA9IGxlZndMYXllckRDQ3V0YXJlYSgzLCBjdXJyZW50KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGN1cnJlbnRbMF0gPSAwLjZFLTY7Ci0gIGN1cnJlbnRbMV0gPSAwLjVFLTY7Ci0gIGN1cnJlbnRbMl0gPSAwLjRFLTY7Ci0gIHN0YXR1cyA9IGxlZndMYXllckRDVGFibGVFbnRyaWVzKDMsIGN1cnJlbnQpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZExheWVyKCJDVVQwMSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICBzdGF0dXMgPSBsZWZ3U3RhcnRMYXllclJvdXRpbmcoIlJYIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nKCJIT1JJWk9OVEFMIiwgMSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nUGl0Y2goMS44KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdEaWFnUGl0Y2goMS41KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdEaWFnV2lkdGgoMS4wKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdEaWFnU3BhY2luZygwLjA1KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdEaWFnTWluRWRnZUxlbmd0aCgwLjA3KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdBcmVhKDM0LjEpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgeGwgPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkqMik7Ci0gIHlsID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpKjIpOwotICB4bFswXSA9IDAuMTQ7Ci0gIHlsWzBdID0gMC4zMDsKLSAgeGxbMV0gPSAwLjA4OwotICB5bFsxXSA9IDAuMzM7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdNaW5zaXplKDIsIHhsLCB5bCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBmcmVlKChjaGFyKil4bCk7Ci0gIGZyZWUoKGNoYXIqKXlsKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1dpcmVFeHRlbnNpb24oMC43NSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nT2Zmc2V0KDAuOSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZygwLjYpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1NwYWNpbmdSYW5nZSgwLjEsIDkpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1Jlc2lzdGFuY2UoIjAuMTAzIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nQ2FwYWNpdGFuY2UoIjAuMDAwMTU2Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nSGVpZ2h0KDkpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1RoaWNrbmVzcygxKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdTaHJpbmthZ2UoMC4xKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdFZGdlQ2FwKDAuMDAwMDUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ0NhcE11bHRpcGxpZXIoMSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nTWlud2lkdGgoMC4xNSk7IAotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ0FudGVubmFBcmVhKDEpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyQW50ZW5uYUN1bUFyZWFSYXRpbyg2LjcpOyAgICAgICAgICAgICAgLy8gNS43Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJBbnRlbm5hQ3VtUm91dGluZ1BsdXNDdXQoKTsgICAgICAgICAgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllckFudGVubmFBcmVhTWludXNEaWZmKDEwMC4wKTsgICAgICAgICAgIC8vIDUuNwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyQW50ZW5uYUdhdGVQbHVzRGlmZigyLjApOyAgICAgICAgICAgICAgLy8gNS43Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJBbnRlbm5hQ3VtRGlmZkFyZWFSYXRpbygxMDAwKTsgICAgICAgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHhsID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpKjUpOwotICB5bCA9IChkb3VibGUqKW1hbGxvYyhzaXplb2YoZG91YmxlKSo1KTsKLSAgeGxbMF0gPSAwLjA7Ci0gIHlsWzBdID0gMS4wOwotICB4bFsxXSA9IDAuMDk5OTk7Ci0gIHlsWzFdID0gMS4wOwotICB4bFsyXSA9IDAuMTsKLSAgeWxbMl0gPSAwLjI7Ci0gIHhsWzNdID0gMS4wOwotICB5bFszXSA9IDAuMTsKLSAgeGxbNF0gPSAxMDA7Ci0gIHlsWzRdID0gMC4xOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJBbnRlbm5hQXJlYURpZmZSZWR1Y2VQd2woNSwgeGwsIHlsKTsgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGZyZWUoKGNoYXIqKXhsKTsKLSAgZnJlZSgoY2hhciopeWwpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJBbnRlbm5hQ3VtRGlmZkFyZWFSYXRpbygxMDAwKTsgICAgICAgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdBbnRlbm5hTGVuZ3RoKDEpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyRENDdXJyZW50RGVuc2l0eSgiQVZFUkFHRSIsIDEwLjApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyQUNDdXJyZW50RGVuc2l0eSgiUEVBSyIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY3VycmVudFswXSA9IDFFNjsKLSAgY3VycmVudFsxXSA9IDEwMEU2OwotICBjdXJyZW50WzJdID0gNDAwRTY7Ci0gIHN0YXR1cyA9IGxlZndMYXllckFDRnJlcXVlbmN5KDMsIGN1cnJlbnQpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY3VycmVudFswXSA9IDIuMEUtNjsKLSAgY3VycmVudFsxXSA9IDEuOUUtNjsKLSAgY3VycmVudFsyXSA9IDEuOEUtNjsKLSAgY3VycmVudFszXSA9IDEuN0UtNjsKLSAgY3VycmVudFs0XSA9IDEuNUUtNjsKLSAgY3VycmVudFs1XSA9IDEuNEUtNjsKLSAgY3VycmVudFs2XSA9IDEuM0UtNjsKLSAgY3VycmVudFs3XSA9IDEuMkUtNjsKLSAgY3VycmVudFs4XSA9IDEuMUUtNjsKLSAgY3VycmVudFs5XSA9IDEuMEUtNjsKLSAgY3VycmVudFsxMF0gPSAwLjlFLTY7Ci0gIGN1cnJlbnRbMTFdID0gMC44RS02OwotICBjdXJyZW50WzEyXSA9IDAuN0UtNjsKLSAgY3VycmVudFsxM10gPSAwLjZFLTY7Ci0gIGN1cnJlbnRbMTRdID0gMC40RS02OwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJBQ1RhYmxlRW50cmllcygxNSwgY3VycmVudCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJBQ0N1cnJlbnREZW5zaXR5KCJBVkVSQUdFIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjdXJyZW50WzBdID0gMUU2OwotICBjdXJyZW50WzFdID0gMTAwRTY7Ci0gIGN1cnJlbnRbMl0gPSA0MDBFNjsKLSAgc3RhdHVzID0gbGVmd0xheWVyQUNGcmVxdWVuY3koMywgY3VycmVudCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjdXJyZW50WzBdID0gMC42RS02OwotICBjdXJyZW50WzFdID0gMC41RS02OwotICBjdXJyZW50WzJdID0gMC40RS02OwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJBQ1RhYmxlRW50cmllcygzLCBjdXJyZW50KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllckFDQ3VycmVudERlbnNpdHkoIlJNUyIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY3VycmVudFswXSA9IDFFNjsKLSAgY3VycmVudFsxXSA9IDQwMEU2OwotICBjdXJyZW50WzJdID0gODAwRTY7Ci0gIHN0YXR1cyA9IGxlZndMYXllckFDRnJlcXVlbmN5KDMsIGN1cnJlbnQpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY3VycmVudFswXSA9IDAuNDsKLSAgY3VycmVudFsxXSA9IDAuODsKLSAgY3VycmVudFsyXSA9IDEwLjA7Ci0gIGN1cnJlbnRbM10gPSA1MC4wOwotICBjdXJyZW50WzRdID0gMTAwLjA7Ci0gIHN0YXR1cyA9IGxlZndMYXllckFDV2lkdGgoNSwgY3VycmVudCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjdXJyZW50WzBdID0gMi4wRS02OwotICBjdXJyZW50WzFdID0gMS45RS02OwotICBjdXJyZW50WzJdID0gMS44RS02OwotICBjdXJyZW50WzNdID0gMS43RS02OwotICBjdXJyZW50WzRdID0gMS41RS02OwotICBjdXJyZW50WzVdID0gMS40RS02OwotICBjdXJyZW50WzZdID0gMS4zRS02OwotICBjdXJyZW50WzddID0gMS4yRS02OwotICBjdXJyZW50WzhdID0gMS4xRS02OwotICBjdXJyZW50WzldID0gMS4wRS02OwotICBjdXJyZW50WzEwXSA9IDAuOUUtNjsKLSAgY3VycmVudFsxMV0gPSAwLjhFLTY7Ci0gIGN1cnJlbnRbMTJdID0gMC43RS02OwotICBjdXJyZW50WzEzXSA9IDAuNkUtNjsKLSAgY3VycmVudFsxNF0gPSAwLjRFLTY7Ci0gIHN0YXR1cyA9IGxlZndMYXllckFDVGFibGVFbnRyaWVzKDE1LCBjdXJyZW50KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRMYXllclJvdXRpbmcoIlJYIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIHN0YXR1cyA9IGxlZndTdGFydExheWVyKCJDVVQxMiIsICJDVVQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllckN1dFNwYWNpbmcoMC43KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllckN1dFNwYWNpbmdMYXllcigiUlgiLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllckN1dFNwYWNpbmdFbmQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJlc2lzdGFuY2VQZXJDdXQoOC4wKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllckN1dFNwYWNpbmcoMC4yMik7ICAgICAgICAgICAgICAgIC8vIDUuNwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyQ3V0U3BhY2luZ0FkamFjZW50KDMsIDAuMjUsIDApOyAgLy8gNS43Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJDdXRTcGFjaW5nRW5kKCk7ICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllckN1dFNwYWNpbmcoMS41KTsgICAgICAgICAgICAgICAgIC8vIDUuNwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyQ3V0U3BhY2luZ1BhcmFsbGVsKCk7ICAgICAgICAgICAgLy8gNS43Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJDdXRTcGFjaW5nRW5kKCk7ICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllckN1dFNwYWNpbmcoMS4yKTsgICAgICAgICAgICAgICAgIC8vIDUuNwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyQ3V0U3BhY2luZ0FkamFjZW50KDIsIDEuNSwgMCk7ICAgLy8gNS43Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJDdXRTcGFjaW5nRW5kKCk7ICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllckFudGVubmFNb2RlbCgiT1hJREUxIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJBbnRlbm5hQXJlYVJhdGlvKDUuNik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJBbnRlbm5hRGlmZkFyZWFSYXRpbyg2LjUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyQW50ZW5uYUFyZWFGYWN0b3IoNS40LCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllckFudGVubmFDdW1EaWZmQXJlYVJhdGlvKDQuNSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBkaWZmc1swXSA9IDUuNDsKLSAgcmF0aW9zWzBdID0gNS40OwotICBkaWZmc1sxXSA9IDYuNTsKLSAgcmF0aW9zWzFdID0gNi41OwotICBkaWZmc1syXSA9IDcuNTsKLSAgcmF0aW9zWzJdID0gNy41OwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJBbnRlbm5hQ3VtRGlmZkFyZWFSYXRpb1B3bCgzLCBkaWZmcywgcmF0aW9zKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllckFudGVubmFDdW1BcmVhUmF0aW8oNi43KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllckFudGVubmFNb2RlbCgiT1hJREUyIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJBbnRlbm5hQ3VtQXJlYVJhdGlvKDMwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJBbnRlbm5hQ3VtUm91dGluZ1BsdXNDdXQoKTsgICAgICAgICAgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllckFudGVubmFBcmVhTWludXNEaWZmKDEwMC4wKTsgICAgICAgICAgIC8vIDUuNwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyQW50ZW5uYUdhdGVQbHVzRGlmZigyLjApOyAgICAgICAgICAgICAgLy8gNS43Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJBbnRlbm5hRGlmZkFyZWFSYXRpbygxMDAwKTsgICAgICAgICAgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllckFudGVubmFDdW1EaWZmQXJlYVJhdGlvKDUwMDApOyAgICAgICAgIC8vIDUuNwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgeGwgPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkqNSk7Ci0gIHlsID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpKjUpOwotICB4bFswXSA9IDAuMDsKLSAgeWxbMF0gPSAxLjA7Ci0gIHhsWzFdID0gMC4wOTk5OTsKLSAgeWxbMV0gPSAxLjA7Ci0gIHhsWzJdID0gMC4xOwotICB5bFsyXSA9IDAuMjsKLSAgeGxbM10gPSAxLjA7Ci0gIHlsWzNdID0gMC4xOwotICB4bFs0XSA9IDEwMDsKLSAgeWxbNF0gPSAwLjE7Ci0gIHN0YXR1cyA9IGxlZndMYXllckFudGVubmFBcmVhRGlmZlJlZHVjZVB3bCg1LCB4bCwgeWwpOyAgIC8vIDUuNwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgZnJlZSgoY2hhciopeGwpOwotICBmcmVlKChjaGFyKil5bCk7Ci0gIGRpZmZzWzBdID0gMTsKLSAgcmF0aW9zWzBdID0gNDsKLSAgZGlmZnNbMV0gPSAyOwotICByYXRpb3NbMV0gPSA1OwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJBbnRlbm5hQ3VtRGlmZkFyZWFSYXRpb1B3bCgyLCBkaWZmcywgcmF0aW9zKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllckFDQ3VycmVudERlbnNpdHkoIlBFQUsiLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGN1cnJlbnRbMF0gPSAxRTY7Ci0gIGN1cnJlbnRbMV0gPSAxMDBFNjsKLSAgc3RhdHVzID0gbGVmd0xheWVyQUNGcmVxdWVuY3koMiwgY3VycmVudCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjdXJyZW50WzBdID0gMC41RS02OwotICBjdXJyZW50WzFdID0gMC40RS02OwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJBQ1RhYmxlRW50cmllcygyLCBjdXJyZW50KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllckFDQ3VycmVudERlbnNpdHkoIkFWRVJBR0UiLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGN1cnJlbnRbMF0gPSAxRTY7Ci0gIGN1cnJlbnRbMV0gPSAxMDBFNjsKLSAgc3RhdHVzID0gbGVmd0xheWVyQUNGcmVxdWVuY3koMiwgY3VycmVudCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjdXJyZW50WzBdID0gMC42RS02OwotICBjdXJyZW50WzFdID0gMC41RS02OwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJBQ1RhYmxlRW50cmllcygyLCBjdXJyZW50KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllckFDQ3VycmVudERlbnNpdHkoIlJNUyIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY3VycmVudFswXSA9IDEwMEU2OwotICBjdXJyZW50WzFdID0gODAwRTY7Ci0gIHN0YXR1cyA9IGxlZndMYXllckFDRnJlcXVlbmN5KDIsIGN1cnJlbnQpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY3VycmVudFswXSA9IDAuNUUtNjsKLSAgY3VycmVudFsxXSA9IDAuNEUtNjsKLSAgc3RhdHVzID0gbGVmd0xheWVyQUNUYWJsZUVudHJpZXMoMiwgY3VycmVudCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3RW5kTGF5ZXIoIkNVVDEyIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIHN0YXR1cyA9IGxlZndTdGFydExheWVyUm91dGluZygiUEMiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmcoIkRJQUc0NSIsIDEpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1BpdGNoKDEuOCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nV2lyZUV4dGVuc2lvbigwLjQpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1NwYWNpbmcoMC42KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdTcGFjaW5nKDEuMik7ICAgICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdTcGFjaW5nRW5kT2ZMaW5lKDEuMywgMC42KTsgICAgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdTcGFjaW5nKDEuMyk7ICAgICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdTcGFjaW5nRW5kT2ZMaW5lKDEuNCwgMC43KTsgICAgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdTcGFjaW5nRU9MUGFyYWxsZWwoMS4xLCAwLjUsIDEpOyAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdTcGFjaW5nKDEuNCk7ICAgICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdTcGFjaW5nRW5kT2ZMaW5lKDEuNSwgMC44KTsgICAgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdTcGFjaW5nRU9MUGFyYWxsZWwoMS4yLCAwLjYsIDApOyAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdPZmZzZXRYWURpc3RhbmNlKDAuOSwgMC43KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdSZXNpc3RhbmNlKCJQV0wgKCAoIDEgMC4xMDMgKSApIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nQ2FwYWNpdGFuY2UoIlBXTCAoICggMSAwLjAwMDE1NiApICggMTAgMC4wMDEgKSApIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJBbnRlbm5hQXJlYVJhdGlvKDUuNCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJBbnRlbm5hRGlmZkFyZWFSYXRpbyg2LjUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgZGlmZnNbMF0gPSA0LjA7Ci0gIHJhdGlvc1swXSA9IDQuMTsKLSAgZGlmZnNbMV0gPSA0LjI7Ci0gIHJhdGlvc1sxXSA9IDQuMzsKLSAgc3RhdHVzID0gbGVmd0xheWVyQW50ZW5uYURpZmZBcmVhUmF0aW9Qd2woMiwgZGlmZnMsIHJhdGlvcyk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJBbnRlbm5hQ3VtQXJlYVJhdGlvKDcuNSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBkaWZmc1swXSA9IDUuMDsKLSAgcmF0aW9zWzBdID0gNS4xOwotICBkaWZmc1sxXSA9IDYuMDsKLSAgcmF0aW9zWzFdID0gNi4xOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJBbnRlbm5hQ3VtRGlmZkFyZWFSYXRpb1B3bCgyLCBkaWZmcywgcmF0aW9zKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllckFudGVubmFBcmVhRmFjdG9yKDQuNSwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJBbnRlbm5hU2lkZUFyZWFSYXRpbyg2LjUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyQW50ZW5uYUN1bURpZmZTaWRlQXJlYVJhdGlvKDQuNik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBkaWZmc1swXSA9IDguMDsKLSAgcmF0aW9zWzBdID0gOC4xOwotICBkaWZmc1sxXSA9IDguMjsKLSAgcmF0aW9zWzFdID0gOC4zOwotICBkaWZmc1syXSA9IDguNDsKLSAgcmF0aW9zWzJdID0gOC41OwotICBkaWZmc1szXSA9IDguNjsKLSAgcmF0aW9zWzNdID0gOC43OwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJBbnRlbm5hQ3VtRGlmZlNpZGVBcmVhUmF0aW9Qd2woNCwgZGlmZnMsIHJhdGlvcyk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJBbnRlbm5hQ3VtU2lkZUFyZWFSYXRpbyg3LjQpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgZGlmZnNbMF0gPSA3LjA7Ci0gIHJhdGlvc1swXSA9IDcuMTsKLSAgZGlmZnNbMV0gPSA3LjI7Ci0gIHJhdGlvc1sxXSA9IDcuMzsKLSAgc3RhdHVzID0gbGVmd0xheWVyQW50ZW5uYURpZmZTaWRlQXJlYVJhdGlvUHdsKDIsIGRpZmZzLCByYXRpb3MpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyQW50ZW5uYVNpZGVBcmVhRmFjdG9yKDkuMCwgIkRJRkZVU0VPTkxZIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJBQ0N1cnJlbnREZW5zaXR5KCJQRUFLIiwgMTAuMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJEQ0N1cnJlbnREZW5zaXR5KCJBVkVSQUdFIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjdXJyZW50WzBdID0gMjAuMDsKLSAgY3VycmVudFsxXSA9IDUwLjA7Ci0gIGN1cnJlbnRbMl0gPSAxMDAuMDsKLSAgc3RhdHVzID0gbGVmd0xheWVyRENXaWR0aCgzLCBjdXJyZW50KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGN1cnJlbnRbMF0gPSAxLjBFLTY7Ci0gIGN1cnJlbnRbMV0gPSAwLjdFLTY7Ci0gIGN1cnJlbnRbMl0gPSAwLjVFLTY7Ci0gIHN0YXR1cyA9IGxlZndMYXllckRDVGFibGVFbnRyaWVzKDMsIGN1cnJlbnQpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZExheWVyUm91dGluZygiUEMiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndTdGFydExheWVyKCJDQSIsICJDVVQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllckN1dFNwYWNpbmcoMC4xNSk7ICAgICAgICAgICAgICAgIC8vIDUuNwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyQ3V0U3BhY2luZ0NlbnRlclRvQ2VudGVyKCk7ICAgICAgLy8gNS43Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJDdXRTcGFjaW5nRW5kKCk7ICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllckVuY2xvc3VyZSgiQkVMT1ciLCAwLjMsIDAuMDEsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyRW5jbG9zdXJlKCJBQk9WRSIsIDAuNSwgMC4wMSwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJQcmVmZXJFbmNsb3N1cmUoIkJFTE9XIiwgMC4wNiwgMC4wMSwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJQcmVmZXJFbmNsb3N1cmUoIkFCT1ZFIiwgMC4wOCwgMC4wMiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJFbmNsb3N1cmUoIiIsIDAuMDIsIDAuMDIsIDEuMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJFbmNsb3N1cmUoTlVMTCwgMC4wNSwgMC4wNSwgMi4wKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllckVuY2xvc3VyZSgiQkVMT1ciLCAwLjA3LCAwLjA3LCAxLjApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyRW5jbG9zdXJlKCJBQk9WRSIsIDAuMDksIDAuMDksIDEuMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSZXNpc3RhbmNlUGVyQ3V0KDEwLjApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyRENDdXJyZW50RGVuc2l0eSgiQVZFUkFHRSIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY3VycmVudFswXSA9IDIuMDsKLSAgY3VycmVudFsxXSA9IDUuMDsKLSAgY3VycmVudFsyXSA9IDEwLjA7Ci0gIHN0YXR1cyA9IGxlZndMYXllckRDV2lkdGgoMywgY3VycmVudCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjdXJyZW50WzBdID0gMC42RS02OwotICBjdXJyZW50WzFdID0gMC41RS02OwotICBjdXJyZW50WzJdID0gMC40RS02OwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJEQ1RhYmxlRW50cmllcygzLCBjdXJyZW50KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRMYXllcigiQ0EiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgc3RhdHVzID0gbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nKCJNMSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZygiRElBRzEzNSIsIDEpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1BpdGNoKDEuOCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZygwLjYpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1NwYWNpbmdSYW5nZSgxLjEsIDEwMC4xKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdTcGFjaW5nUmFuZ2VVc2VMZW5ndGhUaHJlc2hvbGQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdTcGFjaW5nKDAuNjEpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1NwYWNpbmdSYW5nZSgxLjEsIDEwMC4xKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdTcGFjaW5nUmFuZ2VJbmZsdWVuY2UoMi4wMSwgMi4wLCAxMDAwLjApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1NwYWNpbmcoMC42Mik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ1JhbmdlKDEuMSwgMTAwLjEpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1NwYWNpbmdSYW5nZVJhbmdlKDQuMSwgNi41KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdTcGFjaW5nKDAuNjMpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1NwYWNpbmdMZW5ndGhUaHJlc2hvbGQoMS4zNCwgNC41LCA2LjUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1dpcmVFeHRlbnNpb24oNyk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nUmVzaXN0YW5jZSgiMC4xMDMiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdDYXBhY2l0YW5jZSgiMC4wMDAxNTYiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGN1cnJlbnRbMF0gPSAwLjAwOwotICBjdXJyZW50WzFdID0gMC41MDsKLSAgY3VycmVudFsyXSA9IDMuMDA7Ci0gIGN1cnJlbnRbM10gPSA1LjAwOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nU3RhcnRTcGFjaW5ndGFibGVQYXJhbGxlbCg0LCBjdXJyZW50KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGN1cnJlbnRbMF0gPSAwLjE1OwotICBjdXJyZW50WzFdID0gMC4xNTsKLSAgY3VycmVudFsyXSA9IDAuMTU7Ci0gIGN1cnJlbnRbM10gPSAwLjE1OwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ3RhYmxlUGFyYWxsZWxXaWR0aCgwLjAwLCA0LCBjdXJyZW50KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGN1cnJlbnRbMF0gPSAwLjE1OwotICBjdXJyZW50WzFdID0gMC4yMDsKLSAgY3VycmVudFsyXSA9IDAuMjA7Ci0gIGN1cnJlbnRbM10gPSAwLjIwOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ3RhYmxlUGFyYWxsZWxXaWR0aCgwLjI1LCA0LCBjdXJyZW50KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGN1cnJlbnRbMF0gPSAwLjE1OwotICBjdXJyZW50WzFdID0gMC41MDsKLSAgY3VycmVudFsyXSA9IDAuNTA7Ci0gIGN1cnJlbnRbM10gPSAwLjUwOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ3RhYmxlUGFyYWxsZWxXaWR0aCgxLjUwLCA0LCBjdXJyZW50KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGN1cnJlbnRbMF0gPSAwLjE1OwotICBjdXJyZW50WzFdID0gMC41MDsKLSAgY3VycmVudFsyXSA9IDEuMDA7Ci0gIGN1cnJlbnRbM10gPSAxLjAwOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ3RhYmxlUGFyYWxsZWxXaWR0aCgzLjAwLCA0LCBjdXJyZW50KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGN1cnJlbnRbMF0gPSAwLjE1OwotICBjdXJyZW50WzFdID0gMC41MDsKLSAgY3VycmVudFsyXSA9IDEuMDA7Ci0gIGN1cnJlbnRbM10gPSAyLjAwOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ3RhYmxlUGFyYWxsZWxXaWR0aCg1LjAwLCA0LCBjdXJyZW50KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmVFbmRTcGFjaW5ndGFibGUoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdTdGFydFNwYWNpbmd0YWJsZUluZmx1ZW5jZSgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1NwYWNpbmdJbmZsdWVuY2VXaWR0aCgxLjUsIDAuNSwgMC41KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdTcGFjaW5nSW5mbHVlbmNlV2lkdGgoMy4wLCAxLjAsIDEuMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ0luZmx1ZW5jZVdpZHRoKDUuMCwgMi4wLCAyLjApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZUVuZFNwYWNpbmd0YWJsZSgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1N0YXJ0U3BhY2luZ3RhYmxlSW5mbHVlbmNlKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ0luZmx1ZW5jZVdpZHRoKDEuNSwgMC41LCAwLjUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1NwYWNpbmdJbmZsdWVuY2VXaWR0aCg1LjAsIDIuMCwgMi4wKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmVFbmRTcGFjaW5ndGFibGUoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGN1cnJlbnRbMF0gPSAwLjAwOwotICBjdXJyZW50WzFdID0gMC41MDsKLSAgY3VycmVudFsyXSA9IDUuMDA7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdTdGFydFNwYWNpbmd0YWJsZVBhcmFsbGVsKDMsIGN1cnJlbnQpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY3VycmVudFswXSA9IDAuMTU7Ci0gIGN1cnJlbnRbMV0gPSAwLjE1OwotICBjdXJyZW50WzJdID0gMC4xNTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1NwYWNpbmd0YWJsZVBhcmFsbGVsV2lkdGgoMC4wMCwgMywgY3VycmVudCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjdXJyZW50WzBdID0gMC4xNTsKLSAgY3VycmVudFsxXSA9IDAuMjA7Ci0gIGN1cnJlbnRbMl0gPSAwLjIwOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ3RhYmxlUGFyYWxsZWxXaWR0aCgwLjI1LCAzLCBjdXJyZW50KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGN1cnJlbnRbMF0gPSAwLjE1OwotICBjdXJyZW50WzFdID0gMC41MDsKLSAgY3VycmVudFsyXSA9IDEuMDA7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdTcGFjaW5ndGFibGVQYXJhbGxlbFdpZHRoKDMuMDAsIDMsIGN1cnJlbnQpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY3VycmVudFswXSA9IDAuMTU7Ci0gIGN1cnJlbnRbMV0gPSAwLjUwOwotICBjdXJyZW50WzJdID0gMi4wMDsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1NwYWNpbmd0YWJsZVBhcmFsbGVsV2lkdGgoNS4wMCwgMywgY3VycmVudCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5lRW5kU3BhY2luZ3RhYmxlKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBmcmVlKChjaGFyKiljdXJyZW50KTsKLSAgZnJlZSgoY2hhciopZGlmZnMpOwotICBmcmVlKChjaGFyKilyYXRpb3MpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJBbnRlbm5hR2F0ZVBsdXNEaWZmKDIuMCk7ICAgICAgLy8gNS43IAotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyQW50ZW5uYURpZmZBcmVhUmF0aW8oMTAwMCk7ICAgIC8vIDUuNwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyQW50ZW5uYUN1bURpZmZBcmVhUmF0aW8oNTAwMCk7IC8vIDUuNwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZExheWVyUm91dGluZygiTTEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgc3RhdHVzID0gbGVmd1N0YXJ0TGF5ZXIoIlYxIiwgIkNVVCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyQ3V0U3BhY2luZygwLjYpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyQ3V0U3BhY2luZ0xheWVyKCJDQSIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyQ3V0U3BhY2luZ0VuZCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZExheWVyKCJWMSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICBzdGF0dXMgPSBsZWZ3U3RhcnRMYXllclJvdXRpbmcoIk0yIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nKCJWRVJUSUNBTCIsIDAuOSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nUGl0Y2goMS44KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdXaXJlRXh0ZW5zaW9uKDgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1NwYWNpbmcoMC45KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdTcGFjaW5nTGVuZ3RoVGhyZXNob2xkKDEwMC45LCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdTcGFjaW5nKDAuNSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ0xlbmd0aFRocmVzaG9sZCgwLjksIDAsIDAuMSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZygwLjYpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1NwYWNpbmdMZW5ndGhUaHJlc2hvbGQoMS45LCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdTcGFjaW5nKDEuMCk7ICAgICAgICAgICAgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdTcGFjaW5nU2FtZU5ldCgxKTsgICAgICAgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdTcGFjaW5nKDEuMSk7ICAgICAgICAgICAgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdTcGFjaW5nU2FtZU5ldCgwKTsgICAgICAgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdSZXNpc3RhbmNlKCIwLjA2MDgiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdDYXBhY2l0YW5jZSgiMC4wMDAxODQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRMYXllclJvdXRpbmcoIk0yIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIHN0YXR1cyA9IGxlZndTdGFydExheWVyKCJWMiIsICJDVVQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRMYXllcigiVjIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgc3RhdHVzID0gbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nKCJNMyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZygiSE9SSVpPTlRBTCIsIDAuOSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nUGl0Y2hYWURpc3RhbmNlKDEuOCwgMS41KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdEaWFnUGl0Y2hYWURpc3RhbmNlKDEuNSwgMS44KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdXaXJlRXh0ZW5zaW9uKDgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1NwYWNpbmcoMC45KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdSZXNpc3RhbmNlKCIwLjA2MDgiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdDYXBhY2l0YW5jZSgiMC4wMDAxODQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRMYXllclJvdXRpbmcoIk0zIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIGFyZWEgPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkqMyk7Ci0gIHdpZHRoID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpKjMpOwotCi0gIHN0YXR1cyA9IGxlZndTdGFydExheWVyUm91dGluZygiTTQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmcoIkhPUklaT05UQUwiLCAwLjkpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ01pbmltdW1jdXQoMiwgMC41MCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nTWluaW11bWN1dCgyLCAwLjcwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdNaW5pbXVtY3V0Q29ubmVjdGlvbnMoIkZST01CRUxPVyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ01pbmltdW1jdXQoNCwgMS4wKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdNaW5pbXVtY3V0Q29ubmVjdGlvbnMoIkZST01BQk9WRSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ01pbmltdW1jdXQoMiwgMS4xKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdNaW5pbXVtY3V0TGVuZ3RoV2l0aGluKDIwLjAsIDUuMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBhcmVhWzBdICA9IDAuNDA7Ci0gIHdpZHRoWzBdID0gMDsKLSAgYXJlYVsxXSAgPSAwLjQwOwotICB3aWR0aFsxXSA9IDAuMTU7Ci0gIGFyZWFbMl0gID0gMC44MDsKLSAgd2lkdGhbMl0gPSAwLjUwOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nTWluZW5jbG9zZWRhcmVhKDMsIGFyZWEsIHdpZHRoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdNYXh3aWR0aCgxMC4wKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdQcm90cnVzaW9uKDAuMzAsIDAuNjAsIDEuMjApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ01pbnN0ZXAoMC4yMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nTWluc3RlcCgwLjA1KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdNaW5zdGVwV2l0aE9wdGlvbnMoMC4wNSwgTlVMTCwgMC4wOCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nTWluc3RlcFdpdGhPcHRpb25zKDAuMDUsIE5VTEwsIDAuMTYpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ01pbnN0ZXBXaXRoT3B0aW9ucygwLjA1LCAiSU5TREVDT1JORVIiLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdNaW5zdGVwV2l0aE9wdGlvbnMoMC4wNSwgIklOU0lERUNPUk5FUiIsIDAuMTUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ01pbnN0ZXBXaXRoT3B0aW9ucygwLjA1LCAiU1RFUCIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ01pbnN0ZXBXaXRoT3B0aW9ucygwLjA1LCAiU1RFUCIsIDAuMDgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ01pbnN0ZXBXaXRoT3B0aW9ucygwLjA0LCAiU1RFUCIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ01pbnN0ZXBNYXhFZGdlcygxLjAsIDIpOyAgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRMYXllclJvdXRpbmcoIk00Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBmcmVlKChjaGFyKilhcmVhKTsKLSAgZnJlZSgoY2hhciopd2lkdGgpOwotCi0gIHN0YXR1cyA9IGxlZndTdGFydExheWVyKCJpbXBsYW50MSIsICJJTVBMQU5UIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJXaWR0aCgwLjUwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllckN1dFNwYWNpbmcoMC41MCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJDdXRTcGFjaW5nRW5kKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3RW5kTGF5ZXIoImltcGxhbnQxIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIHN0YXR1cyA9IGxlZndTdGFydExheWVyKCJpbXBsYW50MiIsICJJTVBMQU5UIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJXaWR0aCgwLjUwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllckN1dFNwYWNpbmcoMC41MCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJDdXRTcGFjaW5nRW5kKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3RW5kTGF5ZXIoImltcGxhbnQyIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIHN0YXR1cyA9IGxlZndTdGFydExheWVyKCJWMyIsICJDVVQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllck1hc2soMik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJXaWR0aCgwLjYwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRMYXllcigiVjMiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgc3RhdHVzID0gbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nKCJNVCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZygiVkVSVElDQUwiLCAwLjkpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1BpdGNoKDEuOCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZygwLjkpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1Jlc2lzdGFuY2UoIjAuMDYwOCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ0NhcGFjaXRhbmNlKCIwLjAwMDE4NCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZExheWVyUm91dGluZygiTVQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgc3RhdHVzID0gbGVmd1N0YXJ0TGF5ZXIoIk9WRVJMQVAiLCAiT1ZFUkxBUCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZExheWVyKCJPVkVSTEFQIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIHN0YXR1cyA9IGxlZndTdGFydExheWVyUm91dGluZygiTUVUMiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZygiVkVSVElDQUwiLCAwLjkpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyTWFzaygyKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNaW5pbXVtRGVuc2l0eSgyMC4yKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYXhpbXVtRGVuc2l0eSg4MC4wKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndEZW5zaXR5Q2hlY2tXaW5kb3coMjAwLjAsIDIwMC4wKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndEZW5zaXR5Q2hlY2tTdGVwKDEwMC4wKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndGaWxsQWN0aXZlU3BhY2luZygzLjApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZExheWVyUm91dGluZygiTUVUMiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICBzdGF0dXMgPSBsZWZ3U3RhcnRMYXllcigidmlhMzQiLCAiQ1VUIik7ICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllcldpZHRoKDAuMjUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyQ3V0U3BhY2luZygwLjEpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJDdXRTcGFjaW5nQ2VudGVyVG9DZW50ZXIoKTsgICAgICAgICAgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllckN1dFNwYWNpbmdFbmQoKTsgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyRW5jbG9zdXJlKDAsIC4wNSwgLjAxLCAwKTsgICAgICAgICAgICAgLy8gNS43Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJFbmNsb3N1cmVMZW5ndGgoMCwgLjA1LCAwLCAwLjcpOyAgICAgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllckVuY2xvc3VyZSgiQkVMT1ciLCAuMDcsIC4wNywgMS4wKTsgICAgIC8vIDUuNwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyRW5jbG9zdXJlKCJBQk9WRSIsIC4wOSwgLjA5LCAxLjApOyAgICAgLy8gNS43Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJFbmNsb3N1cmVXaWR0aCgwLCAuMDMsIC4wMywgMS4wLCAwLjIpOyAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRMYXllcigidmlhMzQiKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICBzdGF0dXMgPSBsZWZ3U3RhcnRMYXllcigiY3V0MjMiLCAiQ1VUIik7ICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllckN1dFNwYWNpbmcoMC4yMCk7ICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyQ3V0U3BhY2luZ1NhbWVOZXQoKTsgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJDdXRTcGFjaW5nTGF5ZXIoImN1dDEyIiwgMSk7ICAgICAgICAgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllckN1dFNwYWNpbmdFbmQoKTsgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICBzdGF0dXMgPSBsZWZ3TGF5ZXJDdXRTcGFjaW5nKDAuMzApOyAgICAgICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllckN1dFNwYWNpbmdDZW50ZXJUb0NlbnRlcigpOyAgICAgICAgICAgIC8vIDUuNwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyQ3V0U3BhY2luZ1NhbWVOZXQoKTsgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJDdXRTcGFjaW5nQXJlYSgwLjAyKTsgICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllckN1dFNwYWNpbmdFbmQoKTsgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICBzdGF0dXMgPSBsZWZ3TGF5ZXJDdXRTcGFjaW5nKDAuNDApOyAgICAgICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllckN1dFNwYWNpbmdBcmVhKDAuNSk7ICAgICAgICAgICAgICAgICAgIC8vIDUuNwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyQ3V0U3BhY2luZ0VuZCgpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIHN0YXR1cyA9IGxlZndMYXllckN1dFNwYWNpbmcoMC4xMCk7ICAgICAgICAgICAgICAgICAgICAgIC8vIDUuNwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyQ3V0U3BhY2luZ0VuZCgpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIHd0aG4gPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkqMyk7ICAgICAgICAgICAgICAgIC8vIDUuNwotICBzcG5nID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpKjMpOwotICBhc3BjID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpKjMpOwotICB3dGhuWzBdID0gMC4xNTsKLSAgc3BuZ1swXSA9IDAuMTE7Ci0gIHd0aG5bMV0gPSAwLjEzOwotICBzcG5nWzFdID0gMC4xMzsKLSAgd3RoblsyXSA9IDAuMTE7Ci0gIHNwbmdbMl0gPSAwLjE1OwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJDdXRTcGFjaW5nVGFibGVPcnRobygzLCB3dGhuLCBzcG5nKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgYXNwY1swXSA9IDM7Ci0gIHNwbmdbMF0gPSAxOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJBcnJheVNwYWNpbmcoMCwgMi4wLCAwLjIsIDEsIGFzcGMsIHNwbmcpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgYXNwY1swXSA9IDM7Ci0gIHNwbmdbMF0gPSAxOwotICBhc3BjWzFdID0gNDsKLSAgc3BuZ1sxXSA9IDEuNTsKLSAgYXNwY1syXSA9IDU7Ci0gIHNwbmdbMl0gPSAyLjA7Ci0gIHN0YXR1cyA9IGxlZndMYXllckFycmF5U3BhY2luZygxLCAyLjAsIDAuMiwgMywgYXNwYywgc3BuZyk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBmcmVlKChjaGFyKil3dGhuKTsKLSAgZnJlZSgoY2hhciopc3BuZyk7Ci0gIGZyZWUoKGNoYXIqKWFzcGMpOwotICBzdGF0dXMgPSBsZWZ3RW5kTGF5ZXIoImN1dDIzIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIHN0YXR1cyA9IGxlZndTdGFydExheWVyUm91dGluZygiY3V0MjQiKTsgICAgICAgICAgICAgICAgIC8vIDUuNwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZygiSE9SSVpPTlRBTCIsIDEpOyAgICAgICAgICAgICAgLy8gNS43Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nUGl0Y2goMS4yKTsgICAgICAgICAgICAgICAgICAgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdTcGFjaW5nKDAuMTApOyAgICAgICAgICAgICAgICAgIC8vIDUuNwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1NwYWNpbmcoMC4xMik7ICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ05vdGNoTGVuZ3RoKDAuMTUpOyAgICAgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdTcGFjaW5nKDAuMTQpOyAgICAgICAgICAgICAgICAgIC8vIDUuNwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1NwYWNpbmdFbmRPZk5vdGNoV2lkdGgoMC4xNSwgMC4xNiwgMC4wOCk7IC8vIDUuNwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZExheWVyUm91dGluZygiY3V0MjQiKTsgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIHN0YXR1cyA9IGxlZndTdGFydExheWVyUm91dGluZygiY3V0MjUiKTsgICAgICAgICAgICAgICAgIC8vIDUuNwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1BpdGNoKDEuMik7ICAgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nKCJIT1JJWk9OVEFMIiwgMSk7ICAgICAgICAgICAgICAvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdXaXJlRXh0ZW5zaW9uKDcpOyAgICAgICAgICAgICAgIC8vIDUuNwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1N0YXJ0U3BhY2luZ3RhYmxlVHdvV2lkdGhzKCk7ICAgLy8gNS43Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICB3dGhuID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpKjQpOyAgICAgICAgICAgICAgICAvLyA1LjcKLSAgd3RoblswXSA9IDAuMTU7Ci0gIHd0aG5bMV0gPSAwLjIwOwotICB3dGhuWzJdID0gMC41MDsKLSAgd3RoblszXSA9IDEuMDA7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdTcGFjaW5ndGFibGVUd29XaWR0aHNXaWR0aCgwLjAsIDAsIDQsIHd0aG4pOyAgLy8gNS43Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICB3dGhuWzBdID0gMC4yMDsKLSAgd3RoblsxXSA9IDAuMjU7Ci0gIHd0aG5bMl0gPSAwLjUwOwotICB3dGhuWzNdID0gMS4wMDsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1NwYWNpbmd0YWJsZVR3b1dpZHRoc1dpZHRoKDAuMjUsIDAuMSwgNCwgd3Robik7Ly8gNS43Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICB3dGhuWzBdID0gMC41MDsKLSAgd3RoblsxXSA9IDAuNTA7Ci0gIHd0aG5bMl0gPSAwLjYwOwotICB3dGhuWzNdID0gMS4wMDsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1NwYWNpbmd0YWJsZVR3b1dpZHRoc1dpZHRoKDEuNSwgMS41LCA0LCB3dGhuKTsvLyA1LjcKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHd0aG5bMF0gPSAxLjAwOwotICB3dGhuWzFdID0gMS4wMDsKLSAgd3RoblsyXSA9IDEuMDA7Ci0gIHd0aG5bM10gPSAxLjIwOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nU3BhY2luZ3RhYmxlVHdvV2lkdGhzV2lkdGgoMy4wLCAzLjAsIDQsIHd0aG4pOy8vIDUuNwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgZnJlZSh3dGhuKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZUVuZFNwYWNpbmd0YWJsZSgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZExheWVyUm91dGluZygiY3V0MjUiKTsgICAgICAgICAgICAgICAgICAgLy8gNS43Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIC8vIE1BWFZJQVNUQUNLCi0gIHN0YXR1cyA9IGxlZndNYXh2aWFzdGFjayg0LCAibTEiLCAibTciKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgLy8gVklBCi0gIHN0YXR1cyA9IGxlZndTdGFydFZpYSgiUlhfUEMiLCAiREVGQVVMVCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1ZpYVJlc2lzdGFuY2UoMik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3VmlhTGF5ZXIoIlJYIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3VmlhTGF5ZXJSZWN0KC0wLjcsIC0wLjcsIDAuNywgMC43LCAzKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFMYXllcigiQ1VUMTIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFMYXllclJlY3QoLTAuMjUsIC0wLjI1LCAwLjI1LCAwLjI1KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFMYXllcigiUEMiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFMYXllclJlY3QoLTAuNiwgLTAuNiwgMC42LCAwLjYsIDIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1N0cmluZ1Byb3BlcnR5KCJzdHJpbmdQcm9wZXJ0eSIsICJERUZBVUxUIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3UmVhbFByb3BlcnR5KCJyZWFsUHJvcGVydHkiLCAzMi4zMyk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3SW50UHJvcGVydHkoIkNPVU5UIiwgMzQpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZFZpYSgiUEMiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgc3RhdHVzID0gbGVmd1N0YXJ0VmlhKCJNMl9NM19QV1IiLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFSZXNpc3RhbmNlKDAuNCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3VmlhTGF5ZXIoIk0yIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3VmlhTGF5ZXJSZWN0KC0xLjM1LCAtMS4zNSwgMS4zNSwgMS4zNSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3VmlhTGF5ZXIoIlYyIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3VmlhTGF5ZXJSZWN0KC0xLjM1LCAtMS4zNSwgLTAuNDUsIDEuMzUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1ZpYUxheWVyUmVjdCgwLjQ1LCAtMS4zNSwgMS4zNSwgLTAuNDUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1ZpYUxheWVyUmVjdCgwLjQ1LCAwLjQ1LCAxLjM1LCAxLjM1KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFMYXllcigiTTMiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFMYXllclJlY3QoLTEuMzUsIC0xLjM1LCAxLjM1LCAxLjM1KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRWaWEoIk0yX00zX1BXUiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICB4bCA9IChkb3VibGUqKW1hbGxvYyhzaXplb2YoZG91YmxlKSo2KTsKLSAgeWwgPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkqNik7Ci0gIHN0YXR1cyA9IGxlZndTdGFydFZpYSgiSU4xWCIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLS8vICBzdGF0dXMgPSBsZWZ3VmlhVG9wb2ZzdGFja29ubHkoKTsgIDUuNgotLy8gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotLy8gIHN0YXR1cyA9IGxlZndWaWFGb3JlaWduKCJJTjFYIiwgMCwgMCwgLTEpOyAgNS42Ci0vLyAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFMYXllcigibWV0YWwyIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICB4bFswXSA9IC0yLjE7Ci0gIHlsWzBdID0gLTEuMDsKLSAgeGxbMV0gPSAtMC4yOwotICB5bFsxXSA9IDEuMDsKLSAgeGxbMl0gPSAyLjE7Ci0gIHlsWzJdID0gMS4wOwotICB4bFszXSA9IDAuMjsKLSAgeWxbM10gPSAtMS4wOwotICB4bFs0XSA9IDAuMjsKLSAgeWxbNF0gPSAtMS4wOwotICB4bFs1XSA9IDAuMjsKLSAgeWxbNV0gPSAtMS4wOwotICBzdGF0dXMgPSBsZWZ3VmlhTGF5ZXJQb2x5Z29uKDYsIHhsLCB5bCwgMik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICB4bFswXSA9IC0xLjE7Ci0gIHlsWzBdID0gLTIuMDsKLSAgeGxbMV0gPSAtMC4xOwotICB5bFsxXSA9IDIuMDsKLSAgeGxbMl0gPSAxLjE7Ci0gIHlsWzJdID0gMi4wOwotICB4bFszXSA9IDAuMTsKLSAgeWxbM10gPSAtMi4wOwotICBzdGF0dXMgPSBsZWZ3VmlhTGF5ZXJQb2x5Z29uKDQsIHhsLCB5bCwgMSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICB4bFswXSA9IC0zLjE7Ci0gIHlsWzBdID0gLTIuMDsKLSAgeGxbMV0gPSAtMC4zOwotICB5bFsxXSA9IDIuMDsKLSAgeGxbMl0gPSAzLjE7Ci0gIHlsWzJdID0gMi4wOwotICB4bFszXSA9IDAuMzsKLSAgeWxbM10gPSAtMi4wOwotICBzdGF0dXMgPSBsZWZ3VmlhTGF5ZXJQb2x5Z29uKDQsIHhsLCB5bCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICB4bFswXSA9IC00LjE7Ci0gIHlsWzBdID0gLTIuMDsKLSAgeGxbMV0gPSAtMC40OwotICB5bFsxXSA9IDIuMDsKLSAgeGxbMl0gPSA0LjE7Ci0gIHlsWzJdID0gMi4wOwotICB4bFszXSA9IDAuNDsKLSAgeWxbM10gPSAtMi4wOwotICBzdGF0dXMgPSBsZWZ3VmlhTGF5ZXJQb2x5Z29uKDQsIHhsLCB5bCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3VmlhTGF5ZXIoImN1dDIzIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3VmlhTGF5ZXJSZWN0KC0wLjQsIC0wLjQsIDAuNCwgMC40KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHhsWzBdID0gLTIuMTsKLSAgeWxbMF0gPSAtMS4wOwotICB4bFsxXSA9IC0wLjI7Ci0gIHlsWzFdID0gMS4wOwotICB4bFsyXSA9IDIuMTsKLSAgeWxbMl0gPSAxLjA7Ci0gIHhsWzNdID0gMC4yOwotICB5bFszXSA9IC0xLjA7Ci0gIHN0YXR1cyA9IGxlZndWaWFMYXllclBvbHlnb24oNCwgeGwsIHlsKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRWaWEoIklOMVgiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgc3RhdHVzID0gbGVmd1N0YXJ0VmlhKCJteUJsb2NrVmlhIiwgTlVMTCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3VmlhVmlhcnVsZSgiREVGQVVMVCIsIDAuMSwgMC4xLCAibWV0YWwxIiwgInZpYTEyIiwgIm1ldGFsMiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDAuMSwgMC4xLCAwLjA1LCAwLjAxLCAwLjAxLCAwLjA1KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFWaWFydWxlUm93Q29sKDEsIDIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1ZpYVZpYXJ1bGVPcmlnaW4oMS41LCAyLjUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1ZpYVZpYXJ1bGVPZmZzZXQoMS41LCAyLjUsIDMuNSwgNC41KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFWaWFydWxlUGF0dGVybigiMl8xUkYxUkYxUjcxUjBfM19SMUZGRkYiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRWaWEoIm15QmxvY2tWaWEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgc3RhdHVzID0gbGVmd1N0YXJ0VmlhKCJteVZpYTIzIiwgTlVMTCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3VmlhTGF5ZXIoIm1ldGFsMiIpOyAKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFMYXllclBvbHlnb24oNiwgeGwsIHlsKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFMYXllcigiY3V0MjMiKTsgCi0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3VmlhTGF5ZXJSZWN0KC0wLjQsIC0wLjQsIDAuNCwgMC40KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFMYXllcigibWV0YWwzIik7IAotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1ZpYUxheWVyUG9seWdvbig1LCB4bCwgeWwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZFZpYSgibXlWaWEyMyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICBmcmVlKChjaGFyKil4bCk7Ci0gIGZyZWUoKGNoYXIqKXlsKTsKLQotICAvLyBWSUFSVUxFCi0gIHN0YXR1cyA9IGxlZndTdGFydFZpYVJ1bGUoIlZJQUxJU1QxMiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgbGVmd0FkZENvbW1lbnQoIkJyZWFrIHVwIHRoZSBvbGQgbGVmd1ZpYVJ1bGUgaW50byAyIHJvdXRpbmVzIik7Ci0gIGxlZndBZGRDb21tZW50KCJsZWZ3VmlhUnVsZUxheWVyIGFuZCBsZWZ3VmlhUnVsZVZpYSIpOwotLy8gIHN0YXR1cyA9IGxlZndWaWFSdWxlTGF5ZXIoIk0xIiwgIlZFUlRJQ0FMIiwgOS4wLCA5LjYsIDQuNSwgMCk7ICA1LjYKLS8vICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLS8vICBzdGF0dXMgPSBsZWZ3VmlhUnVsZUxheWVyKCJNMiIsICJIT1JJWk9OVEFMIiwgMy4wLCAzLjAsIDAsIDApOyAgNS42Ci0vLyAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFSdWxlTGF5ZXIoIk0xIiwgTlVMTCwgOS4wLCA5LjYsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1ZpYVJ1bGVMYXllcigiTTIiLCBOVUxMLCAzLjAsIDMuMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3VmlhUnVsZVZpYSgiVklBQ0VOVEVSMTIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndTdHJpbmdQcm9wZXJ0eSgidnJzcCIsICJuZXciKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndJbnRQcm9wZXJ0eSgidnJpcCIsIDEpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1JlYWxQcm9wZXJ0eSgidnJycCIsIDQuNSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3RW5kVmlhUnVsZSgiVklBTElTVDEyIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIC8vIFZJQVJVTEUgd2l0aCBHRU5FUkFURQotICBsZWZ3QWRkQ29tbWVudCgiQnJlYWsgdXAgdGhlIG9sZCBsZWZ3VmlhUnVsZUdlbmVhcnRlIGludG8gNCByb3V0aW5lcyIpOwotICBsZWZ3QWRkQ29tbWVudCgibGVmd1N0YXJ0VmlhUnVsZUdlbiwgbGVmd1ZpYVJ1bGVHZW5MYXllciwiKTsKLSAgbGVmd0FkZENvbW1lbnQoImxlZndWaWFSdWxlR2VuTGF5ZXIzLCBhbmQgbGVmd0VuZFZpYVJ1bGVHZW4iKTsKLSAgc3RhdHVzID0gbGVmd1N0YXJ0VmlhUnVsZUdlbigiVklBR0VOMTIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0vLyAgc3RhdHVzID0gbGVmd1ZpYVJ1bGVHZW5MYXllcigiTTEiLCAiVkVSVElDQUwiLCAwLjEsIDE5LCAxLjQsIDApOyAgNS42Ci0vLyAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0vLyAgc3RhdHVzID0gbGVmd1ZpYVJ1bGVHZW5MYXllcigiTTIiLCAiSE9SSVpPTlRBTCIsIDAsIDAsIDEuNCwgMCk7ICA1LjYKLS8vICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1ZpYVJ1bGVHZW5MYXllcigiTTEiLCBOVUxMLCAwLjEsIDE5LCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFSdWxlR2VuTGF5ZXIoIk0yIiwgTlVMTCwgMCwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3VmlhUnVsZUdlbkxheWVyMygiVjEiLCAtMC44LCAtMC44LCAwLjgsIDAuOCwgNS42LCA2LjAsIDAuMik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3RW5kVmlhUnVsZUdlbigiVklBR0VOMTIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgLy8gVklBUlVMRSB3aXRoIEdFTkVSQVRFICYgRU5DTE9TVVJFICYgREVGQVVMVAkKLSAgc3RhdHVzID0gbGVmd1N0YXJ0VmlhUnVsZUdlbigidmlhMTIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFSdWxlR2VuRGVmYXVsdCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1ZpYVJ1bGVHZW5MYXllckVuY2xvc3VyZSgibTEiLCAwLjA1LCAwLjAwNSwgMS4wLCAxMDAuMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3VmlhUnVsZUdlbkxheWVyRW5jbG9zdXJlKCJtMiIsIDAuMDUsIDAuMDA1LCAxLjAsIDEwMC4wKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFSdWxlR2VuTGF5ZXIzKCJjdXQxMiIsIC0wLjA3LCAtMC4wNywgMC4wNywgMC4wNywgMC4xNiwgMC4xNiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3RW5kVmlhUnVsZUdlbigidmlhMTIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgLy8gTk9OREVGQVVMVFJVTEUKLSAgc3RhdHVzID0gbGVmd1N0YXJ0Tm9uRGVmYXVsdFJ1bGUoIlJVTEUxIik7IAotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd05vbkRlZmF1bHRSdWxlSGFyZHNwYWNpbmcoKTsgCi0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotLy8gIHN0YXR1cyA9IGxlZndOb25EZWZhdWx0UnVsZUxheWVyKCJSWCIsIDEwLjAsIDIuMiwgNiwgNi41LCA2LjUsIDYuNSk7ICA1LjYKLS8vICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLS8vICBzdGF0dXMgPSBsZWZ3Tm9uRGVmYXVsdFJ1bGVMYXllcigiUEMiLCAxMC4wLCAyLjIsIDAsIDAsIDYuNSwgMCk7ICA1LjYKLS8vICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLS8vICBzdGF0dXMgPSBsZWZ3Tm9uRGVmYXVsdFJ1bGVMYXllcigiTTEiLCAxMC4wLCAyLjIsIDAsIDYuNSwgMCwgMCk7ICA1LjYKLS8vICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd05vbkRlZmF1bHRSdWxlTGF5ZXIoIlJYIiwgMTAuMCwgMi4yLCA2LCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndOb25EZWZhdWx0UnVsZUxheWVyKCJQQyIsIDEwLjAsIDIuMiwgMCwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3Tm9uRGVmYXVsdFJ1bGVMYXllcigiTTEiLCAxMC4wLCAyLjIsIDAsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1N0YXJ0VmlhKCJuZDFWQVJYMCIsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1ZpYVJlc2lzdGFuY2UoMC4yKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0vLyAgc3RhdHVzID0gbGVmd1ZpYUZvcmVpZ25TdHIoIklOMVgiLCAwLCAwLCAiTiIpOyAgNS42Ci0vLyBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1ZpYUxheWVyKCJSWCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1ZpYUxheWVyUmVjdCgtMywgLTMsIDMsIDMpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1ZpYUxheWVyKCJDVVQxMiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1ZpYUxheWVyUmVjdCgtMS4wLCAtMS4wLCAxLjAsIDEuMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3VmlhTGF5ZXIoIlBDIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3VmlhTGF5ZXJSZWN0KC0zLCAtMywgMywgMyk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3RW5kVmlhKCJuZDFWQVJYMCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1N0YXJ0U3BhY2luZygpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1NwYWNpbmcoIkNVVDAxIiwgIlJYIiwgMC4xLCAiU1RBQ0siKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRTcGFjaW5nKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3RW5kTm9uRGVmYXVsdFJ1bGUoIlJVTEUxIik7IAotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1N0YXJ0Tm9uRGVmYXVsdFJ1bGUoIndpZGUxXzV4Iik7IAotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd05vbkRlZmF1bHRSdWxlTGF5ZXIoImZ3IiwgNC44LCA0LjgsIDAsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd05vbkRlZmF1bHRSdWxlU3RhcnRWaWEoIm5kMVZJQVJYMCIsICJERUZBVUxUIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotLy8gIHN0YXR1cyA9IGxlZndWaWFUb3BvZnN0YWNrb25seSgpOyAgNS42Ci0vLyAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0vLyAgc3RhdHVzID0gbGVmd1ZpYUZvcmVpZ24oIklOMVgiLCAwLCAwLCAtMSk7ICA1LjYKLS8vICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1ZpYVJlc2lzdGFuY2UoMC4yKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFMYXllcigiUlgiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFMYXllclJlY3QoLTMsIC0zLCAzLCAzKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFMYXllcigiQ1VUMTIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFMYXllclJlY3QoLTEuMCwgLTEuMCwgMS4wLCAxLjApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1ZpYUxheWVyKCJQQyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1ZpYUxheWVyUmVjdCgtMywgLTMsIDMsIDMpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd05vbkRlZmF1bHRSdWxlRW5kVmlhKCJuZDFWSUFSWDAiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndOb25EZWZhdWx0UnVsZVVzZVZpYSgidmlhMTJfZml4ZWRfYW5hbG9nX3ZpYSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd05vbkRlZmF1bHRSdWxlTWluQ3V0cygiY3V0MTIiLCAyKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndOb25EZWZhdWx0UnVsZVVzZVZpYSgidmlhMjNfZml4ZWRfYW5hbG9nX3ZpYSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd05vbkRlZmF1bHRSdWxlTWluQ3V0cygiY3V0MjMiLCAyKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndOb25EZWZhdWx0UnVsZVVzZVZpYVJ1bGUoInZpYVJ1bGUyM19maXhlZF9hbmFsb2dfdmlhIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3RW5kTm9uRGVmYXVsdFJ1bGUoIndpZGUxXzV4Iik7IAotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICAvLyBVTklWRVJTQUxOT0lTRU1BUkdJTgotICAvKiBvYnNvbGV0ZSBpbiA1LjQKLSAgc3RhdHVzID0gbGVmd1VuaXZlcnNhbE5vaXNlTWFyZ2luKDAuMSwgMjApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VkZ2VSYXRlVGhyZXNob2xkMSgwLjEpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VkZ2VSYXRlVGhyZXNob2xkMigwLjkpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VkZ2VSYXRlU2NhbGVGYWN0b3IoMS4wKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gICovCi0KLSAgLy8gTk9JU0VUQUJMRQotICAvKiBvYnNvbGV0ZSBpbiA1LjQKLSAgZG91YmxlICpob2xkZXI7Ci0gIGhvbGRlciA9IChkb3VibGUqKW1hbGxvYyhzaXplb2YoZG91YmxlKSoxKTsKLSAgc3RhdHVzID0gbGVmd1N0YXJ0Tm9pc2VUYWJsZSgxKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFZGdlUmF0ZSgyMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBob2xkZXJbMF0gPSAzOwotICBzdGF0dXMgPSBsZWZ3T3V0cHV0UmVzaXN0YW5jZSgxLCBob2xkZXIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgaG9sZGVyWzBdID0gMTA7IAotICBzdGF0dXMgPSBsZWZ3VmljdGltcygyNSwgMSwgaG9sZGVyKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmROb2lzZVRhYmxlKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICAqLwotCi0gIC8vIENPUlJFQ1RJT05UQUJMRQotICAvKiBvYnNvbGV0ZSBpbiA1LjQKLSAgc3RhdHVzID0gbGVmd1N0YXJ0Q29ycmVjdFRhYmxlKDEpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VkZ2VSYXRlKDIwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGhvbGRlclswXSA9IDM7Ci0gIHN0YXR1cyA9IGxlZndPdXRwdXRSZXNpc3RhbmNlKDEsIGhvbGRlcik7IC8vIFNoYXJlIHRoZSBzYW1lIGZ1bmN0aW9ucyB3aXRoCi0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOyAgICAgICAgICAgICAgICAgICAgIC8vIG5vaXNldGFibGUKLSAgaG9sZGVyWzBdID0gMTAuNTsgCi0gIHN0YXR1cyA9IGxlZndWaWN0aW1zKDI1LCAxLCBob2xkZXIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZENvcnJlY3RUYWJsZSgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgZnJlZSgoY2hhciopaG9sZGVyKTsKLSAgKi8KLQotICAvLyBTUEFDSU5HCi0gIHN0YXR1cyA9IGxlZndTdGFydFNwYWNpbmcoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndTcGFjaW5nKCJDVVQwMSIsICJDQSIsIDEuNSwgTlVMTCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3U3BhY2luZygiQ0EiLCAiVjEiLCAxLjUsICJTVEFDSyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1NwYWNpbmcoIk0xIiwgIk0xIiwgMy41LCAiU1RBQ0siKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndTcGFjaW5nKCJWMSIsICJWMiIsIDEuNSwgIlNUQUNLIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3U3BhY2luZygiTTIiLCAiTTIiLCAzLjUsICJTVEFDSyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1NwYWNpbmcoIlYyIiwgIlYzIiwgMS41LCAiU1RBQ0siKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRTcGFjaW5nKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIC8vIE1JTkZFQVRVUkUgJiBESUVMRUNUUklDCi0gIHN0YXR1cyA9IGxlZndNaW5GZWF0dXJlKDAuMSwgMC4xKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIC8qIG9ic29sZXRlIGluIDUuNAotICBzdGF0dXMgPSBsZWZ3RGllbGVjdHJpYygwLjAwMDM0NSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICAqLwotICBzdGF0dXMgPSBsZWZ3TmV3TGluZSgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICAvLyBJUkRST1AKLSAgLyogb2Jzb2xldGUgaW4gNS40Ci0gIHN0YXR1cyA9IGxlZndTdGFydElyZHJvcCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0lyZHJvcFRhYmxlKCJEUkVTSEkiLCAiMC4wMDAxIC0wLjcgMC4wMDEgLTAuOCAwLjAxIC0wLjkgMC4xIC0xLjAiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndJcmRyb3BUYWJsZSgiRFJFU0xPIiwgIjAuMDAwMSAtMS43IDAuMDAxIC0xLjYgMC4wMSAtMS41IDAuMSAtMS4zIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3SXJkcm9wVGFibGUoIkROT1JFU0hJIiwgIjAuMDAwMSAtMC42IDAuMDAxIC0wLjcgMC4wMSAtMC45IDAuMSAtMS4xIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3SXJkcm9wVGFibGUoIkROT1JFU0xPIiwgIjAuMDAwMSAtMS41IDAuMDAxIC0xLjUgMC4wMSAtMS40IDAuMSAtMS40Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3RW5kSXJkcm9wKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICAqLwotCi0gIC8vIFNJVEUKLSAgc3RhdHVzID0gbGVmd1NpdGUoIkNPUkUxIiwgIkNPUkUiLCAiWCIsIDY3LjIsIDYpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1NpdGVSb3dQYXR0ZXJuKCJGc2l0ZSIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1NpdGVSb3dQYXR0ZXJuU3RyKCJMc2l0ZSIsICJOIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3U2l0ZVJvd1BhdHRlcm5TdHIoIkxzaXRlIiwgIkZTIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBsZWZ3RW5kU2l0ZSgiQ09SRTEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndTaXRlKCJDT1JFIiwgIkNPUkUiLCAiWSIsIDMuNiwgMjguOCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBsZWZ3RW5kU2l0ZSgiQ09SRSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1NpdGUoIk1SQ09SRSIsICJDT1JFIiwgIlkiLCAzLjYsIDI4LjgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgbGVmd0VuZFNpdGUoIk1SQ09SRSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1NpdGUoIklPV0lSRUQiLCAiUEFEIiwgTlVMTCwgNTcuNiwgNDMyKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGxlZndFbmRTaXRlKCJJT1dJUkVEIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIC8vIEFSUkFZCi0gIHN0YXR1cyA9IGxlZndTdGFydEFycmF5KCJNN0U0WFhYIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3QXJyYXlTaXRlKCJDT1JFIiwgLTUwMjEuNDUwLCAtNDk5OC4wMDAsIDAsIDE0MzQ2LCA1OTUsIDAuNzAwLAotICAgICAgICAgICAgICAgICAgICAgICAgIDE2LjgwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3QXJyYXlTaXRlU3RyKCJDT1JFIiwgLTUwMjEuNDUwLCAtNDk5OC42MDAsICJGUyIsIDE0MzQ2LCA1OTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMC43MDAsIDE2LjgwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3QXJyYXlTaXRlKCJJTyIsIDYxNDguODAwLCA1ODAwLjAwMCwgMywgMSwgMSwgMC4wMDAsIDAuMDAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndBcnJheVNpdGVTdHIoIklPIiwgNjE0OC44MDAsIDUyNDAuMDAwLCAiRSIsIDEsIDEsIDAuMDAwLCAwLjAwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3QXJyYXlTaXRlKCJDT1ZFUiIsIC03MzE1LjAsIC03MzE1LjAwMCwgMSwgMSwgMSwgMC4wMDAsIDAuMDAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndBcnJheVNpdGVTdHIoIkNPVkVSIiwgNzMxNS4wLCA3MzE1LjAwMCwgIkZOIiwgMSwgMSwgMC4wMDAsIDAuMDAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndBcnJheUNhbnBsYWNlKCJDT1ZFUiIsIC03MzE1LjAwMCwgLTczMTUuMDAwLCAwLCAxLCAxLCAwLjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0FycmF5Q2FucGxhY2VTdHIoIkNPVkVSIiwgLTcyNTAuMDAwLCAtNzI1MC4wMDAsICJOIiwgNSwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAuMDAwLCAwLjAwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3QXJyYXlDYW5ub3RvY2N1cHkoIkNPUkUiLCAtNTAyMS40NTAsIC00OTg5LjYwMCwgNiwgMTAwLCA1OTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjcwMCwgMTYuODAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndBcnJheUNhbm5vdG9jY3VweVN0cigiQ09SRSIsIC01MDIxLjQ1MCwgLTQ5ODkuNjAwLCAiTiIsIDEwMCwgNTk1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC43MDAsIDE2LjgwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3QXJyYXlUcmFja3MoIlgiLCAtNjE0OC44MDAsIDE3NTY5LCAwLjcwMCwgIlJYIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3QXJyYXlUcmFja3MoIlkiLCAtNjE0OC44MDAsIDIwNDk3LCAwLjYwMCwgIlJYIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3U3RhcnRBcnJheUZsb29ycGxhbigiMTAwJSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0FycmF5Rmxvb3JwbGFuKCJDQU5QTEFDRSIsICJDT1ZFUiIsIC03MzE1LjAwMCwgLTczMTUuMDAwLCAxLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMC4wMDAsIDAuMDAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndBcnJheUZsb29ycGxhblN0cigiQ0FOUExBQ0UiLCAiQ09WRVIiLCAtNzI1MC4wMDAsIC03MjUwLjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOIiwgNSwgMSwgNDAuMDAwLCAwLjAwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3QXJyYXlGbG9vcnBsYW4oIkNBTlBMQUNFIiwgIkNPUkUiLCAtNTAyMS4wMDAsIC00OTk4LjAwMCwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0MzQ2LCA1OTUsIDAuNzAwLCAxNi44MDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0FycmF5Rmxvb3JwbGFuU3RyKCJDQU5QTEFDRSIsICJDT1JFIiwgLTUwMjEuMDAwLCAtNDk5OC4wMDAsICJGUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAsIDU5NSwgMC43MDAsIDE2LjgwMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3QXJyYXlGbG9vcnBsYW4oIkNBTk5PVE9DQ1VQWSIsICJDT1JFIiwgLTUwMjEuMDAwLCAtNDk5OC4wMDAsIDcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDM0NiwgNTk1LCAwLjcwMCwgMTYuODAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndBcnJheUZsb29ycGxhblN0cigiQ0FOTk9UT0NDVVBZIiwgIkNPUkUiLCAtNTAyMS4wMDAsIC00OTk4LjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFIiwgMTAwLCA1OTUsIDAuNzAwLCAxNi44MDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZEFycmF5Rmxvb3JwbGFuKCIxMDAlIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3QXJyYXlHY2VsbGdyaWQoIlgiLCAtNjE1Ny4yMDAsIDE0NjcsIDguNDAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndBcnJheUdjZWxsZ3JpZCgiWSIsIC02MTU3LjIwMCwgMTQ2NywgOC40MDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZEFycmF5KCJNN0U0WFhYIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIC8vIE1BQ1JPCi0gIHN0YXR1cyA9IGxlZndTdGFydE1hY3JvKCJDSEszQSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvQ2xhc3MoIlJJTkciLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb0ZpeGVkTWFzaygpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLS8vICBzdGF0dXMgPSBsZWZ3TWFjcm9Tb3VyY2UoIlVTRVIiKTsgIDUuNgotLy8gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9PcmlnaW4oMC45LCAwLjkpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvU2l6ZSgxMC44LCAyOC44KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1N5bW1ldHJ5KCJYIFkgUjkwIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9TaXRlKCJDT1JFIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3U3RhcnRNYWNyb1BpbigiR05EIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5EaXJlY3Rpb24oIklOT1VUIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5NdXN0am9pbigiUEEzIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5UYXBlclJ1bGUoIlJVTEUxIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5Vc2UoIkdST1VORCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvUGluU2hhcGUoIkFCVVRNRU5UIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotLy8gIHN0YXR1cyA9IGxlZndNYWNyb1BpbkxFUSgiQSIpOyAgNS42Ci0vLyAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpblN1cHBseVNlbnNpdGl2aXR5KCJ2ZGRwaW4xIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5OZXRFeHByKCJwb3dlcjEgVkREMSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvUGluQW50ZW5uYU1ldGFsQXJlYSgzLCAiTTEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIC8vIE1BQ1JPIC0gUElOCi0gIHN0YXR1cyA9IGxlZndTdGFydE1hY3JvUGluUG9ydChOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0vLyAgc3RhdHVzID0gbGVmd01hY3JvUGluRm9yZWlnbigiR1JPVU5EIiwgNCwgNywgNik7ICA1LjYKLS8vICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLS8vICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5Gb3JlaWduU3RyKCJWU1MiLCA0LCA3LCAiVyIpOyAgNS42Ci0vLyAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpblBvcnRMYXllcigiTTEiLCAwLjA1KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpblBvcnRMYXllclJlY3QoLTAuOSwgMywgOS45LCA2LCAwLCAwLCAwLCAwLCAzKTsgCi0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3RW5kTWFjcm9QaW5Qb3J0KCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3U3RyaW5nUHJvcGVydHkoIlRZUEUiLCAic3BlY2lhbCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0ludFByb3BlcnR5KCJpbnRQcm9wIiwgMjMpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1JlYWxQcm9wZXJ0eSgicmVhbFByb3AiLCAyNC4yNSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotLyogV01EIC0gQ29tbWVudCB0aGVtIG91dCBkdWUgdG8gbWl4IDUuMyAmIDUuNCBzeW50YXgKLSAgc3RhdHVzID0gbGVmd01hY3JvUGluQW50ZW5uYXNpemUoMSwgIk0xIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5BbnRlbm5hc2l6ZSgyLCAiTTIiKTsKLSovCi0gIHN0YXR1cyA9IGxlZndNYWNyb1BpbkFudGVubmFNb2RlbCgiT1hJREUxIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3RW5kTWFjcm9QaW4oIkdORCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1N0YXJ0TWFjcm9QaW4oIlZERCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvUGluRGlyZWN0aW9uKCJJTk9VVCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvUGluVXNlKCJQT1dFUiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvUGluU2hhcGUoIkFCVVRNRU5UIik7IAotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvUGluTmV0RXhwcigicG93ZXIyIFZERDIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIC8vIE1BQ1JPIC0gUElOIC0gUE9SVAotICBzdGF0dXMgPSBsZWZ3U3RhcnRNYWNyb1BpblBvcnQoTlVMTCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5Qb3J0TGF5ZXIoIk0xIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5Qb3J0TGF5ZXJSZWN0KC0wLjksIDIxLCA5LjksIDI0LCAwLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpblBvcnRWaWEoMTAwLCAzMDAsICJuZDFWSUExMiIsIDEsIDIsIDEsIDIsIDEyMyk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3RW5kTWFjcm9QaW5Qb3J0KCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3U3RhcnRNYWNyb1BpblBvcnQoIkJVTVAiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpblBvcnRMYXllcigiTTIiLCAwLjA2KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRNYWNyb1BpblBvcnQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHhsID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpKjUpOwotICB5bCA9IChkb3VibGUqKW1hbGxvYyhzaXplb2YoZG91YmxlKSo1KTsKLSAgeGxbMF0gPSAzMC44OwotICB5bFswXSA9IDMwLjU7Ci0gIHhsWzFdID0gNDI7Ci0gIHlsWzFdID0gNTMuNTsKLSAgeGxbMl0gPSA2MC44OwotICB5bFsyXSA9IDI1LjU7Ci0gIHhsWzNdID0gNDc7Ci0gIHlsWzNdID0gMTUuNTsKLSAgeGxbNF0gPSAyMC44OwotICB5bFs0XSA9IDAuNTsKLSAgc3RhdHVzID0gbGVmd1N0YXJ0TWFjcm9QaW5Qb3J0KCJDT1JFIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5Qb3J0TGF5ZXIoIlAxIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5Qb3J0TGF5ZXJQb2x5Z29uKDUsIHhsLCB5bCwgNSwgNiwgNDU0LjYsIDM0NS42LCAyKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpblBvcnRMYXllclBvbHlnb24oNSwgeGwsIHlsLCAwLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRNYWNyb1BpblBvcnQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGZyZWUoKGNoYXIqKXhsKTsKLSAgZnJlZSgoY2hhciopeWwpOwotLyogV01EIC0gQ29tbWVudCB0aGVtIG91dCBkdWUgdG8gbWl4IDUuMyAmIDUuNCBzeW50YXgKLSAgc3RhdHVzID0gbGVmd01hY3JvUGluQW50ZW5uYU1ldGFsQXJlYSgzLCAiTTEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpbkFudGVubmFNZXRhbEFyZWEoNCwgIk0yIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5BbnRlbm5hTWV0YWxMZW5ndGgoNSwgIk0xIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5BbnRlbm5hTWV0YWxMZW5ndGgoNiwgIk0yIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotKi8KLSAgc3RhdHVzID0gbGVmd0VuZE1hY3JvUGluKCJWREQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndTdGFydE1hY3JvUGluKCJQQTMiKTsgCi0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5EaXJlY3Rpb24oIklOUFVUIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5OZXRFeHByKCJnbmQxIEdORCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgLy8gNS40Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpbkFudGVubmFQYXJ0aWFsTWV0YWxBcmVhKDQsICJNMSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvUGluQW50ZW5uYVBhcnRpYWxNZXRhbEFyZWEoNSwgIk0yIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5BbnRlbm5hUGFydGlhbE1ldGFsU2lkZUFyZWEoNSwgIk0yIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5BbnRlbm5hR2F0ZUFyZWEoMSwgIk0xIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5BbnRlbm5hR2F0ZUFyZWEoMiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5BbnRlbm5hR2F0ZUFyZWEoMywgIk0zIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5BbnRlbm5hRGlmZkFyZWEoMSwgIk0xIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5BbnRlbm5hTWF4QXJlYUNhcigxLCAiTDEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpbkFudGVubmFNYXhTaWRlQXJlYUNhcigxLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpbkFudGVubmFQYXJ0aWFsQ3V0QXJlYSgxLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpbkFudGVubmFQYXJ0aWFsQ3V0QXJlYSgyLCAiTTIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpbkFudGVubmFQYXJ0aWFsQ3V0QXJlYSgzLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpbkFudGVubmFQYXJ0aWFsQ3V0QXJlYSg0LCAiTTQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpbkFudGVubmFNYXhDdXRDYXIoMSwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3U3RhcnRNYWNyb1BpblBvcnQoIkNPUkUiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpblBvcnRMYXllcigiTTEiLCAwLjAyKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpblBvcnRMYXllclJlY3QoMS4zNSwgLTAuNDUsIDIuMjUsIDAuNDUsIDAsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvUGluUG9ydExheWVyUmVjdCgtMC40NSwgLTAuNDUsIDAuNDUsIDAuNDUsIDAsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZE1hY3JvUGluUG9ydCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1N0YXJ0TWFjcm9QaW5Qb3J0KE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvUGluUG9ydExheWVyKCJQQyIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvUGluUG9ydExheWVyUmVjdCgtMC40NSwgMTIuMTUsIDAuNDUsIDEzLjA1LCAwLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRNYWNyb1BpblBvcnQoKTsgCi0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3U3RhcnRNYWNyb1BpblBvcnQoTlVMTCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5Qb3J0RGVzaWduUnVsZVdpZHRoKCJQQyIsIDIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvUGluUG9ydExheWVyUmVjdCg4LjU1LCA4LjU1LCA5LjQ1LCA5LjQ1LCAwLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpblBvcnRMYXllclJlY3QoNi43NSwgNi43NSwgNy42NSwgNy42NSwgMCwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5Qb3J0TGF5ZXJSZWN0KDYuNzUsIDguNzUsIDcuNjUsIDkuNjUsIDAsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvUGluUG9ydExheWVyUmVjdCg2Ljc1LCAxMC4zNSwgNy42NSwgMTEuMjUsIDAsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZE1hY3JvUGluUG9ydCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZE1hY3JvUGluKCJQQTMiKTsgCi0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICAvLyBNQUNSTyAtIE9CUwotICBzdGF0dXMgPSBsZWZ3U3RhcnRNYWNyb09icygpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvT2JzTGF5ZXIoIk0xIiwgNS42KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb09ic0xheWVyV2lkdGgoNS40KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb09ic0xheWVyUmVjdCg2LjYsIC0wLjYsIDkuNiwgMC42LCAwLCAwLCAwLCAwLCAyKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb09ic0xheWVyUmVjdCg0LjgsIDEyLjksIDkuNiwgMTMuMiwgMCwgMCwgMCwgMCwgMyk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9PYnNMYXllclJlY3QoMywgMTMuOCwgNy44LCAxNi44LCAwLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb09ic0xheWVyUmVjdCgzLCAtMC42LCA2LCAwLjYsIDAsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZE1hY3JvT2JzKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3U3RyaW5nUHJvcGVydHkoInN0cmluZ1Byb3AiLCAiZmlyc3QiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndJbnRQcm9wZXJ0eSgiaW50ZWdlclByb3AiLCAxKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndSZWFsUHJvcGVydHkoIldFSUdIVCIsIDMwLjMxKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRNYWNybygiQ0hLM0EiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgLy8gMm5kIE1BQ1JPCi0gIHN0YXR1cyA9IGxlZndTdGFydE1hY3JvKCJJTlYiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb0VFUSgiQ0hLMSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLS8vICBzdGF0dXMgPSBsZWZ3TWFjcm9MRVEoIkNISzIiKTsgIDUuNgotLy8gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9DbGFzcygiQ09SRSIsICJTUEFDRVIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb0ZvcmVpZ24oIklOVlMiLCAwLCAwLCAtMSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICAvKiBvYnNvbGV0ZSBpbiA1LjQKLSAgc3RhdHVzID0gbGVmd01hY3JvUG93ZXIoMS4wKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gICovCi0gIHN0YXR1cyA9IGxlZndNYWNyb1NpemUoNjcuMiwgMjQpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvU3ltbWV0cnkoIlggWSBSOTAiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1NpdGUoIkNPUkUxIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3U3RhcnRNYWNyb0RlbnNpdHkoIm1ldGFsMSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvRGVuc2l0eUxheWVyUmVjdCgwLCAwLCAxMDAsIDEwMCwgNDUuNSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9EZW5zaXR5TGF5ZXJSZWN0KDEwMCwgMCwgMjAwLCAxMDAsIDQyLjIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZE1hY3JvRGVuc2l0eSgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1N0YXJ0TWFjcm9EZW5zaXR5KCJtZXRhbDIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb0RlbnNpdHlMYXllclJlY3QoMjAwLCAxLCAzMDAsIDIwMCwgNDMuMyk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3RW5kTWFjcm9EZW5zaXR5KCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3U3RhcnRNYWNyb1BpbigiWiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvUGluRGlyZWN0aW9uKCJPVVRQVVQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpblVzZSgiU0lHTkFMIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5TaGFwZSgiQUJVVE1FTlQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIC8qIG9ic29sZXRlIGluIDUuNAotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5SaXNldGhyZXNoKDIyKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpbkZhbGx0aHJlc2goMTAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpblJpc2VzYXRjdXIoNCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5GYWxsc2F0Y3VyKC41KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpblZMTygwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpblZISSg1KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpbkNhcGFjaXRhbmNlKDAuMDgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvUGluUG93ZXIoMC4xKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gICovCi0gIHN0YXR1cyA9IGxlZndNYWNyb1BpbkFudGVubmFNb2RlbCgiT1hJREUxIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3U3RhcnRNYWNyb1BpblBvcnQoTlVMTCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5Qb3J0TGF5ZXIoIk0yIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5Qb3J0TGF5ZXJXaWR0aCg1LjYpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgeHBhdGggPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkqNyk7Ci0gIHlwYXRoID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpKjcpOwotICB4cGF0aFswXSA9IDMwLjg7Ci0gIHlwYXRoWzBdID0gOTsKLSAgeHBhdGhbMV0gPSA0MjsKLSAgeXBhdGhbMV0gPSA5OwotICB4cGF0aFsyXSA9IDMwLjg7Ci0gIHlwYXRoWzJdID0gOTsKLSAgeHBhdGhbM10gPSA0MjsKLSAgeXBhdGhbM10gPSA5OwotICB4cGF0aFs0XSA9IDMwLjg7Ci0gIHlwYXRoWzRdID0gOTsKLSAgeHBhdGhbNV0gPSA0MjsKLSAgeXBhdGhbNV0gPSA5OwotICB4cGF0aFs2XSA9IDMwLjg7Ci0gIHlwYXRoWzZdID0gOTsKLSAgc3RhdHVzID0gbGVmd01hY3JvUGluUG9ydExheWVyUGF0aCg3LCB4cGF0aCwgeXBhdGgsIDAsIDAsIDAsIDAsIDIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZE1hY3JvUGluUG9ydCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZE1hY3JvUGluKCJaIik7IAotICBmcmVlKChjaGFyKil4cGF0aCk7Ci0gIGZyZWUoKGNoYXIqKXlwYXRoKTsKLSAgLy8gTUFDUk8gLSBUSU1JTkcKLSAgLyogb2Jzb2xldGUgaW4gNS40Ci0gIHN0YXR1cyA9IGxlZndTdGFydE1hY3JvVGltaW5nKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9UaW1pbmdQaW4oIkEiLCAiWiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvVGltaW5nSW50cmluc2ljKCJSSVNFIiwgLjM5LCAuNDEsIDEuMiwgLjI1LCAuMjksIDEuOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC42NywgLjg3LCAyLjIsIDAuMTIsIDAuMTMpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvVGltaW5nSW50cmluc2ljKCJGQUxMIiwgLjI1LCAuMjksIDEuMywgLjI2LCAuMzEsIDEuNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC42LCAuOCwgMi4xLCAwLjExLCAwLjE0KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1RpbWluZ1Jpc2Vycyg4My4xNzgsIDkwLjEwOSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9UaW1pbmdGYWxscnMoNzYuMjQ2LCA5Ny4wNDEpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvVGltaW5nUmlzZWNzKDAuNzUxLCAwLjc1MSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9UaW1pbmdGYWxsY3MoMC43NTEsIDAuNzUxKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1RpbWluZ1Jpc2V0MCgwLjY1NDUzLCAwLjY1NDUzKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1RpbWluZ0ZhbGx0MCgwLjM4LCAwLjM4KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1RpbWluZ1Jpc2VzYXR0MSgwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1RpbWluZ0ZhbGxzYXR0MSgwLjE1LCAwLjE1KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1RpbWluZ1VuYXRlbmVzcygiSU5WRVJUIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3RW5kTWFjcm9UaW1pbmcoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gICovCi0gIC8vIE1BQ1JPIC0gT0JTCi0gIHN0YXR1cyA9IGxlZndTdGFydE1hY3JvT2JzKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9PYnNEZXNpZ25SdWxlV2lkdGgoIk0xIiwgMik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9PYnNMYXllclJlY3QoMjQuMSwgMS41LCA0My41LCAyMDguNSwgMCwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICB4cGF0aCA9IChkb3VibGUqKW1hbGxvYyhzaXplb2YoZG91YmxlKSoyKTsKLSAgeXBhdGggPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkqMik7Ci0gIHhwYXRoWzBdID0gOC40OwotICB5cGF0aFswXSA9IDM7Ci0gIHhwYXRoWzFdID0gOC40OwotICB5cGF0aFsxXSA9IDEyNDsKLSAgc3RhdHVzID0gbGVmd01hY3JvT2JzTGF5ZXJQYXRoKDIsIHhwYXRoLCB5cGF0aCwgMCwgMCwgMCwgMCwgMik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICB4cGF0aFswXSA9IDU4Ljg7Ci0gIHlwYXRoWzBdID0gMzsKLSAgeHBhdGhbMV0gPSA1OC44OwotICB5cGF0aFsxXSA9IDEyMzsKLSAgc3RhdHVzID0gbGVmd01hY3JvT2JzTGF5ZXJQYXRoKDIsIHhwYXRoLCB5cGF0aCwgMCwgMCwgMCwgMCwgMyk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICB4cGF0aFswXSA9IDY0LjQ7Ci0gIHlwYXRoWzBdID0gMzsKLSAgeHBhdGhbMV0gPSA2NC40OwotICB5cGF0aFsxXSA9IDEyMzsKLSAgc3RhdHVzID0gbGVmd01hY3JvT2JzTGF5ZXJQYXRoKDIsIHhwYXRoLCB5cGF0aCwgMCwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBmcmVlKChjaGFyKil4cGF0aCk7Ci0gIGZyZWUoKGNoYXIqKXlwYXRoKTsKLSAgeGwgPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkqNSk7Ci0gIHlsID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpKjUpOwotICB4bFswXSA9IDYuNDsKLSAgeGxbMV0gPSAzLjQ7Ci0gIHhsWzJdID0gNS40OwotICB4bFszXSA9IDguNDsKLSAgeGxbNF0gPSA5LjQ7Ci0gIHlsWzBdID0gOS4yOwotICB5bFsxXSA9IDAuMjsKLSAgeWxbMl0gPSA3LjI7Ci0gIHlsWzNdID0gOC4yOwotICB5bFs0XSA9IDEuMjsKLSAgc3RhdHVzID0gbGVmd01hY3JvT2JzTGF5ZXJQb2x5Z29uKDUsIHhsLCB5bCwgMCwgMCwgMCwgMCwgMyk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBmcmVlKChjaGFyKil4bCk7Ci0gIGZyZWUoKGNoYXIqKXlsKTsKLSAgc3RhdHVzID0gbGVmd0VuZE1hY3JvT2JzKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3RW5kTWFjcm8oIklOViIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICAvLyAzcmQgTUFDUk8KLSAgc3RhdHVzID0gbGVmd1N0YXJ0TWFjcm8oIkRGRjMiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb0NsYXNzKCJDT1JFIiwgIkFOVEVOTkFDRUxMIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9Gb3JlaWduU3RyKCJERkYzUyIsIDAsIDAsICJOIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICAvKiBvYnNvbGV0ZSBpbiA1LjQKLSAgc3RhdHVzID0gbGVmd01hY3JvUG93ZXIoNC4wKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gICovCi0gIHN0YXR1cyA9IGxlZndNYWNyb1NpemUoNjcuMiwgMjEwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1N5bW1ldHJ5KCJYIFkgUjkwIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9TaXRlUGF0dGVybigiQ09SRSIsIDM0LCA1NCwgNywgMzAsIDMsIDEsIDEpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvU2l0ZVBhdHRlcm5TdHIoIkNPUkUxIiwgMjEsIDY4LCAiUyIsIDMwLCAzLCAyLCAyKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRNYWNybygiREZGMyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICBzdGF0dXMgPSBsZWZ3U3RhcnRNYWNybygiREZGNCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvQ2xhc3MoIkNPVkVSIiwgIkJVTVAiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb0ZvcmVpZ25TdHIoIkRGRjNTIiwgMCwgMCwgIiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZE1hY3JvKCJERkY0Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIHN0YXR1cyA9IGxlZndTdGFydE1hY3JvKCJERkY1Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9DbGFzcygiQ09WRVIiLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb0ZvcmVpZ25TdHIoIkRGRjNTIiwgMCwgMCwgIiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZE1hY3JvKCJERkY1Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIHN0YXR1cyA9IGxlZndTdGFydE1hY3JvKCJERkY2Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9DbGFzcygiQkxPQ0siLCAiQkxBQ0tCT1giKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb0ZvcmVpZ25TdHIoIkRGRjNTIiwgMCwgMCwgIiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZE1hY3JvKCJERkY2Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIHN0YXR1cyA9IGxlZndTdGFydE1hY3JvKCJERkY3Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9DbGFzcygiUEFEIiwgIkFSRUFJTyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvRm9yZWlnblN0cigiREZGM1MiLCAwLCAwLCAiIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3RW5kTWFjcm8oIkRGRjciKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgc3RhdHVzID0gbGVmd1N0YXJ0TWFjcm8oIkRGRjgiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb0NsYXNzKCJCTE9DSyIsICJTT0ZUIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3RW5kTWFjcm8oIkRGRjgiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgc3RhdHVzID0gbGVmd1N0YXJ0TWFjcm8oIkRGRjkiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb0NsYXNzKCJDT1JFIiwgIldFTExUQVAiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRNYWNybygiREZGOSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICBzdGF0dXMgPSBsZWZ3U3RhcnRNYWNybygibXlUZXN0Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9DbGFzcygiQ09SRSIsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvU2l6ZSgxMC4wLCAxNC4wKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1N5bW1ldHJ5KCJYIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9TaXRlUGF0dGVyblN0cigiRnNpdGUiLCAwLCAwLCAiTiIsIDAsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvU2l0ZVBhdHRlcm5TdHIoIkZzaXRlIiwgMCwgNy4wLCAiRlMiLCAzMCwgMywgMiwgMik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9TaXRlUGF0dGVyblN0cigiRnNpdGUiLCA0LjAsIDAsICJOIiwgMCwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3RW5kTWFjcm8oIm15VGVzdCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICAvLyBBTlRFTk5BLCB0aGlzIHdpbGwgZ2VuZXJhdGUgZXJyb3IgZm9yIDUuNCBzaW5jZSBJIGFscmVhZHkgaGF2ZSBBTlRFTk5BCi0gIC8vIHNvbWV3aGVyZQotICBzdGF0dXMgPSBsZWZ3QW50ZW5uYSgiSU5QVVRQSU5BTlRFTk5BU0laRSIsIDEpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0FudGVubmEoIk9VVFBVVFBJTkFOVEVOTkFTSVpFIiwgLTEpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0FudGVubmEoIklOT1VUUElOQU5URU5OQVNJWkUiLCAtMSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TmV3TGluZSgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICAvLyBCRUdJTkVYVAotICBzdGF0dXMgPSBsZWZ3U3RhcnRCZWdpbmV4dCgiU0lHTkFUVVJFIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBsZWZ3QWRkSW5kZW50KCk7Ci0gIHN0YXR1cyA9IGxlZndCZWdpbmV4dENyZWF0b3IoIkNBREVOQ0UiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIC8vIHNpbmNlIHRoZSBkYXRlIGlzIGRpZmZlcmVudCBlYWNoIHJ1biwKLSAgLy8gY29tbWVudCBpdCBvdXQsIHNvIHRoZSBxdWljayB0ZXN0IHdpbGwgbm90IGZhaWwKLSAgLy8gc3RhdHVzID0gbGVmd0JlZ2luZXh0RGF0ZSgpOyAKLSAgLy8gQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRCZWdpbmV4dCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICBzdGF0dXMgPSBsZWZ3RW5kKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIGxpbmVOdW0gPSBsZWZ3Q3VycmVudExpbmVOdW1iZXIoKTsKLSAgaWYgKGxpbmVOdW0gPT0gMCkKLSAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogTm90aGluZyBoYXMgYmVlbiB3cml0dGVuISEhXG4iKTsKLQotICBmY2xvc2UoZm91dCk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZndyaXRlL2xlZndyaXRlQ2JzLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS9sZWZ3cml0ZS9sZWZ3cml0ZUNicy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YzVjYzUuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZndyaXRlL2xlZndyaXRlQ2JzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDk5NyArMCwwIEBACi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvcHlyaWdodCAyMDEyLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zCi0vLyAKLS8vIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiAgdGhlICBDYWRlbmNlICBMRUYvREVGICBPcGVuICAgU291cmNlCi0vLyBEaXN0cmlidXRpb24sICBQcm9kdWN0IFZlcnNpb24gNS44LiAKLS8vIAotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vIAotLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8gCi0vLyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0vLyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLS8vICAgIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vIAotLy8gRm9yIHVwZGF0ZXMsIHN1cHBvcnQsIG9yIHRvIGJlY29tZSBwYXJ0IG9mIHRoZSBMRUYvREVGIENvbW11bml0eSwKLS8vIGNoZWNrIHd3dy5vcGVuZWRhLm9yZyBmb3IgZGV0YWlscy4KLS8vIAotLy8gICRBdXRob3IkCi0vLyAgJFJldmlzaW9uJAotLy8gICREYXRlJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpZm5kZWYgV0lOMzIKLSMgICBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZiAvKiBub3QgV0lOMzIgKi8KLSNpbmNsdWRlICJsZWZ3V3JpdGVyLmhwcCIKLSNpbmNsdWRlICJsZWZ3V3JpdGVyQ2FsbHMuaHBwIgotCi0vLyBHbG9iYWwgdmFyaWFibGVzCi1jaGFyICBkZWZhdWx0T3V0WzEyOF07Ci1GSUxFKiBmb3V0OwotaW50ICAgdXNlckRhdGE7Ci0KLSNkZWZpbmUgQ0hFQ0tfU1RBVFVTKHN0YXR1cykgXAotICBpZiAoc3RhdHVzKSB7ICAgICAgICAgICAgICBcCi0gICAgIGxlZndQcmludEVycm9yKHN0YXR1cyk7IFwKLSAgICAgcmV0dXJuKHN0YXR1cyk7ICAgICAgICAgXAotICB9Ci0KLXZvaWQgZGF0YUVycm9yKCkgewotICBmcHJpbnRmKGZvdXQsICJFUlJPUjogcmV0dXJuZWQgdXNlciBkYXRhIGlzIG5vdCBjb3JyZWN0IVxuIik7Ci19Ci0KLXZvaWQgY2hlY2tUeXBlKGxlZndDYWxsYmFja1R5cGVfZSBjKSB7Ci0gIGlmIChjID49IDAgJiYgYyA8PSBsZWZ3RW5kTGliQ2JrVHlwZSkgewotICAgIC8vIE9LCi0gIH0gZWxzZSB7Ci0gICAgZnByaW50Zihmb3V0LCAiRVJST1I6IGNhbGxiYWNrIHR5cGUgaXMgb3V0IG9mIGJvdW5kcyFcbiIpOwotICB9Ci19Ci0KLWludCB2ZXJzaW9uQ0IobGVmd0NhbGxiYWNrVHlwZV9lIGMsIGxlZmlVc2VyRGF0YSB1ZCkgewotICBpbnQgc3RhdHVzOwotCi0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKChpbnQpdWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBzdGF0dXMgPSBsZWZ3VmVyc2lvbig1LCA2KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHJldHVybiAwOwotfQotCi1pbnQgYnVzQml0Q2hhcnNDQihsZWZ3Q2FsbGJhY2tUeXBlX2UgYywgbGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGludCBzdGF0dXM7Ci0KLSAgY2hlY2tUeXBlKGMpOwotICBpZiAoKGludCl1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIHN0YXR1cyA9IGxlZndCdXNCaXRDaGFycygiPD4iKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHJldHVybiAwOwotfQotCi1pbnQgZGl2aWRlckNCKGxlZndDYWxsYmFja1R5cGVfZSBjLCBsZWZpVXNlckRhdGEgdWQpIHsKLSAgaW50IHN0YXR1czsKLQotICBjaGVja1R5cGUoYyk7Ci0gIGlmICgoaW50KXVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgc3RhdHVzID0gbGVmd0RpdmlkZXJDaGFyKCI6Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TmV3TGluZSgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIFVOSVRTCi1pbnQgdW5pdHNDQihsZWZ3Q2FsbGJhY2tUeXBlX2UgYywgbGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGludCBzdGF0dXM7Ci0KLSAgY2hlY2tUeXBlKGMpOwotICBpZiAoKGludCl1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIHN0YXR1cyA9IGxlZndTdGFydFVuaXRzKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3VW5pdHMoMTAwLCAxMCwgMTAwMDAsIDEwMDAwLCAxMDAwMCwgMTAwMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3RW5kVW5pdHMoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHJldHVybiAwOwotfQotCi0vLyBQUk9QRVJUWURFRklOSVRJT05TCi1pbnQgcHJvcERlZkNCKGxlZndDYWxsYmFja1R5cGVfZSBjLCBsZWZpVXNlckRhdGEgdWQpIHsKLSAgaW50IHN0YXR1czsKLQotICBjaGVja1R5cGUoYyk7Ci0gIGlmICgoaW50KXVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgc3RhdHVzID0gbGVmd1N0YXJ0UHJvcERlZigpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1N0cmluZ1Byb3BEZWYoIkxJQlJBUlkiLCAiTkFNRSIsIDAsIDAsICJDYWRlbmNlOTYiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndJbnRQcm9wRGVmKCJMSUJSQVJZIiwgImludE51bSIsIDAsIDAsIDIwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndSZWFsUHJvcERlZigiTElCUkFSWSIsICJyZWFsTnVtIiwgMCwgMCwgMjEuMjIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1N0cmluZ1Byb3BEZWYoIlBJTiIsICJUWVBFIiwgMCwgMCwgTlVMTCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3SW50UHJvcERlZigiUElOIiwgImludFByb3AiLCAwLCAwLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndSZWFsUHJvcERlZigiUElOIiwgInJlYWxQcm9wIiwgMCwgMCwgTlVMTCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3U3RyaW5nUHJvcERlZigiTUFDUk8iLCAic3RyaW5nUHJvcCIsIDAsIDAsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0ludFByb3BEZWYoIk1BQ1JPIiwgImludGVnZXJQcm9wIiwgMCwgMCwgTlVMTCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3UmVhbFByb3BEZWYoIk1BQ1JPIiwgIldFSUdIVCIsIDEuMCwgMTAwLjAsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1N0cmluZ1Byb3BEZWYoIlZJQSIsICJzdHJpbmdQcm9wZXJ0eSIsIDAsIDAsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1JlYWxQcm9wRGVmKCJWSUEiLCAicmVhbFByb3AiLCAwLCAwLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndJbnRQcm9wRGVmKCJWSUEiLCAiQ09VTlQiLCAxLCAxMDAsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1N0cmluZ1Byb3BEZWYoIkxBWUVSIiwgImxzcCIsIDAsIDAsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0ludFByb3BEZWYoIkxBWUVSIiwgImxpcCIsIDAsIDAsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1JlYWxQcm9wRGVmKCJMQVlFUiIsICJscnAiLCAwLCAwLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndTdHJpbmdQcm9wRGVmKCJWSUFSVUxFIiwgInZyc3AiLCAwLCAwLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndSZWFsUHJvcERlZigiVklBUlVMRSIsICJ2cmlwIiwgMCwgMCwgTlVMTCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3SW50UHJvcERlZigiVklBUlVMRSIsICJ2cnJwIiwgMCwgMCwgTlVMTCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3U3RyaW5nUHJvcERlZigiTk9OREVGQVVMVFJVTEUiLCAibmRyc3AiLCAwLCAwLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndJbnRQcm9wRGVmKCJOT05ERUZBVUxUUlVMRSIsICJuZHJpcCIsIDAsIDAsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1JlYWxQcm9wRGVmKCJOT05ERUZBVUxUUlVMRSIsICJuZHJycCIsIDAsIDAsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZFByb3BEZWYoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIExBWUVSUwotaW50IGxheWVyQ0IobGVmd0NhbGxiYWNrVHlwZV9lIGMsIGxlZmlVc2VyRGF0YSB1ZCkgewotICBpbnQgICAgc3RhdHVzOwotICBkb3VibGUgKmN1cnJlbnQ7Ci0KLSAgY2hlY2tUeXBlKGMpOwotICBpZiAoKGludCl1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGN1cnJlbnQgPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkqMTUpOwotCi0gIHN0YXR1cyA9IGxlZndTdGFydExheWVyKCJQT0xZUyIsICJNQVNURVJTTElDRSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1N0cmluZ1Byb3BlcnR5KCJsc3AiLCAidG9wIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3SW50UHJvcGVydHkoImxpcCIsIDEpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1JlYWxQcm9wZXJ0eSgibHJwIiwgMi4zKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRMYXllcigiUE9MWVMiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgc3RhdHVzID0gbGVmd1N0YXJ0TGF5ZXIoIkNVVDAxIiwgIkNVVCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZExheWVyKCJDVVQwMSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICBzdGF0dXMgPSBsZWZ3U3RhcnRMYXllclJvdXRpbmcoIlJYIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nKCJIT1JJWk9OVEFMIiwgMSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nUGl0Y2goMS44KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdXaXJlRXh0ZW5zaW9uKDAuNzUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ09mZnNldCgwLjkpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1NwYWNpbmcoMC42KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdTcGFjaW5nUmFuZ2UoMC4xLCA5KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdSZXNpc3RhbmNlKCIwLjEwMyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ0NhcGFjaXRhbmNlKCIwLjAwMDE1NiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ0hlaWdodCg5KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdUaGlja25lc3MoMSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nU2hyaW5rYWdlKDAuMSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nRWRnZUNhcCgwLjAwMDA1KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdBbnRlbm5hQXJlYSgxKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdBbnRlbm5hTGVuZ3RoKDEpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyQUNDdXJyZW50RGVuc2l0eSgiUEVBSyIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY3VycmVudFswXSA9IDFFNjsKLSAgY3VycmVudFsxXSA9IDEwMEU2OwotICBjdXJyZW50WzJdID0gNDAwRTY7Ci0gIHN0YXR1cyA9IGxlZndMYXllckFDRnJlcXVlbmN5KDMsIGN1cnJlbnQpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY3VycmVudFswXSA9IDAuNDsKLSAgY3VycmVudFsxXSA9IDAuODsKLSAgY3VycmVudFsyXSA9IDEwLjA7Ci0gIGN1cnJlbnRbM10gPSA1MC4wOwotICBjdXJyZW50WzRdID0gMTAwLjA7Ci0gIHN0YXR1cyA9IGxlZndMYXllckFDV2lkdGgoNSwgY3VycmVudCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjdXJyZW50WzBdID0gMi4wRS02OwotICBjdXJyZW50WzFdID0gMS45RS02OwotICBjdXJyZW50WzJdID0gMS44RS02OwotICBjdXJyZW50WzNdID0gMS43RS02OwotICBjdXJyZW50WzRdID0gMS41RS02OwotICBjdXJyZW50WzVdID0gMS40RS02OwotICBjdXJyZW50WzZdID0gMS4zRS02OwotICBjdXJyZW50WzddID0gMS4yRS02OwotICBjdXJyZW50WzhdID0gMS4xRS02OwotICBjdXJyZW50WzldID0gMS4wRS02OwotICBjdXJyZW50WzEwXSA9IDAuOUUtNjsKLSAgY3VycmVudFsxMV0gPSAwLjhFLTY7Ci0gIGN1cnJlbnRbMTJdID0gMC43RS02OwotICBjdXJyZW50WzEzXSA9IDAuNkUtNjsKLSAgY3VycmVudFsxNF0gPSAwLjRFLTY7Ci0gIHN0YXR1cyA9IGxlZndMYXllckFDVGFibGVFbnRyaWVzKDE1LCBjdXJyZW50KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllckFDQ3VycmVudERlbnNpdHkoIkFWRVJBR0UiLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGN1cnJlbnRbMF0gPSAxRTY7Ci0gIGN1cnJlbnRbMV0gPSAxMDBFNjsKLSAgY3VycmVudFsyXSA9IDQwMEU2OwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJBQ0ZyZXF1ZW5jeSgzLCBjdXJyZW50KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGN1cnJlbnRbMF0gPSAwLjZFLTY7Ci0gIGN1cnJlbnRbMV0gPSAwLjVFLTY7Ci0gIGN1cnJlbnRbMl0gPSAwLjRFLTY7Ci0gIHN0YXR1cyA9IGxlZndMYXllckFDVGFibGVFbnRyaWVzKDMsIGN1cnJlbnQpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyQUNDdXJyZW50RGVuc2l0eSgiUk1TIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjdXJyZW50WzBdID0gMUU2OwotICBjdXJyZW50WzFdID0gNDAwRTY7Ci0gIGN1cnJlbnRbMl0gPSA4MDBFNjsKLSAgc3RhdHVzID0gbGVmd0xheWVyQUNGcmVxdWVuY3koMywgY3VycmVudCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjdXJyZW50WzBdID0gMC40OwotICBjdXJyZW50WzFdID0gMC44OwotICBjdXJyZW50WzJdID0gMTAuMDsKLSAgY3VycmVudFszXSA9IDUwLjA7Ci0gIGN1cnJlbnRbNF0gPSAxMDAuMDsKLSAgc3RhdHVzID0gbGVmd0xheWVyQUNXaWR0aCg1LCBjdXJyZW50KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGN1cnJlbnRbMF0gPSAyLjBFLTY7Ci0gIGN1cnJlbnRbMV0gPSAxLjlFLTY7Ci0gIGN1cnJlbnRbMl0gPSAxLjhFLTY7Ci0gIGN1cnJlbnRbM10gPSAxLjdFLTY7Ci0gIGN1cnJlbnRbNF0gPSAxLjVFLTY7Ci0gIGN1cnJlbnRbNV0gPSAxLjRFLTY7Ci0gIGN1cnJlbnRbNl0gPSAxLjNFLTY7Ci0gIGN1cnJlbnRbN10gPSAxLjJFLTY7Ci0gIGN1cnJlbnRbOF0gPSAxLjFFLTY7Ci0gIGN1cnJlbnRbOV0gPSAxLjBFLTY7Ci0gIGN1cnJlbnRbMTBdID0gMC45RS02OwotICBjdXJyZW50WzExXSA9IDAuOEUtNjsKLSAgY3VycmVudFsxMl0gPSAwLjdFLTY7Ci0gIGN1cnJlbnRbMTNdID0gMC42RS02OwotICBjdXJyZW50WzE0XSA9IDAuNEUtNjsKLSAgc3RhdHVzID0gbGVmd0xheWVyQUNUYWJsZUVudHJpZXMoMTUsIGN1cnJlbnQpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZExheWVyUm91dGluZygiUlgiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgc3RhdHVzID0gbGVmd1N0YXJ0TGF5ZXIoIkNVVDEyIiwgIkNVVCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyQUNDdXJyZW50RGVuc2l0eSgiUEVBSyIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY3VycmVudFswXSA9IDFFNjsKLSAgY3VycmVudFsxXSA9IDEwMEU2OwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJBQ0ZyZXF1ZW5jeSgyLCBjdXJyZW50KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGN1cnJlbnRbMF0gPSAwLjVFLTY7Ci0gIGN1cnJlbnRbMV0gPSAwLjRFLTY7Ci0gIHN0YXR1cyA9IGxlZndMYXllckFDVGFibGVFbnRyaWVzKDIsIGN1cnJlbnQpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyQUNDdXJyZW50RGVuc2l0eSgiQVZFUkFHRSIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY3VycmVudFswXSA9IDFFNjsKLSAgY3VycmVudFsxXSA9IDEwMEU2OwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJBQ0ZyZXF1ZW5jeSgyLCBjdXJyZW50KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGN1cnJlbnRbMF0gPSAwLjZFLTY7Ci0gIGN1cnJlbnRbMV0gPSAwLjVFLTY7Ci0gIHN0YXR1cyA9IGxlZndMYXllckFDVGFibGVFbnRyaWVzKDIsIGN1cnJlbnQpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyQUNDdXJyZW50RGVuc2l0eSgiUk1TIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjdXJyZW50WzBdID0gMTAwRTY7Ci0gIGN1cnJlbnRbMV0gPSA4MDBFNjsKLSAgc3RhdHVzID0gbGVmd0xheWVyQUNGcmVxdWVuY3koMiwgY3VycmVudCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjdXJyZW50WzBdID0gMC41RS02OwotICBjdXJyZW50WzFdID0gMC40RS02OwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJBQ1RhYmxlRW50cmllcygyLCBjdXJyZW50KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRMYXllcigiQ1VUMTIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgc3RhdHVzID0gbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nKCJQQyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZygiSE9SSVpPTlRBTCIsIDEpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1BpdGNoKDEuOCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nV2lyZUV4dGVuc2lvbigwLjQpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1NwYWNpbmcoMC42KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdSZXNpc3RhbmNlKCJQV0wgKCAoIDEgMC4xMDMgKSApIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nQ2FwYWNpdGFuY2UoIlBXTCAoICggMSAwLjAwMDE1NiApICggMTAgMC4wMDEgKSApIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJEQ0N1cnJlbnREZW5zaXR5KCJBVkVSQUdFIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjdXJyZW50WzBdID0gMjAuMDsKLSAgY3VycmVudFsxXSA9IDUwLjA7Ci0gIGN1cnJlbnRbMl0gPSAxMDAuMDsKLSAgc3RhdHVzID0gbGVmd0xheWVyRENXaWR0aCgzLCBjdXJyZW50KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGN1cnJlbnRbMF0gPSAxLjBFLTY7Ci0gIGN1cnJlbnRbMV0gPSAwLjdFLTY7Ci0gIGN1cnJlbnRbMl0gPSAwLjVFLTY7Ci0gIHN0YXR1cyA9IGxlZndMYXllckRDVGFibGVFbnRyaWVzKDMsIGN1cnJlbnQpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZExheWVyUm91dGluZygiUEMiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgc3RhdHVzID0gbGVmd1N0YXJ0TGF5ZXIoIkNBIiwgIkNVVCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyRENDdXJyZW50RGVuc2l0eSgiQVZFUkFHRSIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgY3VycmVudFswXSA9IDIuMDsKLSAgY3VycmVudFsxXSA9IDUuMDsKLSAgY3VycmVudFsyXSA9IDEwLjA7Ci0gIHN0YXR1cyA9IGxlZndMYXllckRDV2lkdGgoMywgY3VycmVudCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBjdXJyZW50WzBdID0gMC42RS02OwotICBjdXJyZW50WzFdID0gMC41RS02OwotICBjdXJyZW50WzJdID0gMC40RS02OwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJEQ1RhYmxlRW50cmllcygzLCBjdXJyZW50KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRMYXllcigiQ0EiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGZyZWUoKGNoYXIqKWN1cnJlbnQpOwotCi0gIHN0YXR1cyA9IGxlZndTdGFydExheWVyUm91dGluZygiTTEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmcoIkhPUklaT05UQUwiLCAxKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdQaXRjaCgxLjgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1NwYWNpbmcoMC42KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdXaXJlRXh0ZW5zaW9uKDcpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1Jlc2lzdGFuY2UoIjAuMTAzIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nQ2FwYWNpdGFuY2UoIjAuMDAwMTU2Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3RW5kTGF5ZXJSb3V0aW5nKCJNMSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICBzdGF0dXMgPSBsZWZ3U3RhcnRMYXllcigiVjEiLCAiQ1VUIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXIoMC42LCAiQ0EiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRMYXllcigiVjEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgc3RhdHVzID0gbGVmd1N0YXJ0TGF5ZXJSb3V0aW5nKCJNMiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZygiVkVSVElDQUwiLCAwLjkpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1BpdGNoKDEuOCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nV2lyZUV4dGVuc2lvbig4KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdTcGFjaW5nKDAuOSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nUmVzaXN0YW5jZSgiMC4wNjA4Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nQ2FwYWNpdGFuY2UoIjAuMDAwMTg0Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3RW5kTGF5ZXJSb3V0aW5nKCJNMiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICBzdGF0dXMgPSBsZWZ3U3RhcnRMYXllcigiVjIiLCAiQ1VUIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3RW5kTGF5ZXIoIlYyIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIHN0YXR1cyA9IGxlZndTdGFydExheWVyUm91dGluZygiTTMiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmcoIkhPUklaT05UQUwiLCAwLjkpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1BpdGNoKDEuOCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nV2lyZUV4dGVuc2lvbig4KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdTcGFjaW5nKDAuOSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nUmVzaXN0YW5jZSgiMC4wNjA4Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TGF5ZXJSb3V0aW5nQ2FwYWNpdGFuY2UoIjAuMDAwMTg0Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3RW5kTGF5ZXJSb3V0aW5nKCJNMyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICBzdGF0dXMgPSBsZWZ3U3RhcnRMYXllcigiVjMiLCAiQ1VUIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3RW5kTGF5ZXIoIlYzIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIHN0YXR1cyA9IGxlZndTdGFydExheWVyUm91dGluZygiTVQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmcoIlZFUlRJQ0FMIiwgMC45KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdQaXRjaCgxLjgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0xheWVyUm91dGluZ1NwYWNpbmcoMC45KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdSZXNpc3RhbmNlKCIwLjA2MDgiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndMYXllclJvdXRpbmdDYXBhY2l0YW5jZSgiMC4wMDAxODQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRMYXllclJvdXRpbmcoIk1UIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIHN0YXR1cyA9IGxlZndTdGFydExheWVyKCJPVkVSTEFQIiwgIk9WRVJMQVAiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRMYXllcigiT1ZFUkxBUCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIFZJQQotaW50IHZpYUNCKGxlZndDYWxsYmFja1R5cGVfZSBjLCBsZWZpVXNlckRhdGEgdWQpIHsKLSAgaW50ICAgIHN0YXR1czsKLQotICBjaGVja1R5cGUoYyk7Ci0gIHN0YXR1cyA9IGxlZndTdGFydFZpYSgiUlhfUEMiLCAiREVGQVVMVCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1ZpYVJlc2lzdGFuY2UoMik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3VmlhTGF5ZXIoIlJYIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3VmlhTGF5ZXJSZWN0KC0wLjcsIC0wLjcsIDAuNywgMC43KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFMYXllcigiQ1VUMTIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFMYXllclJlY3QoLTAuMjUsIC0wLjI1LCAwLjI1LCAwLjI1KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFMYXllcigiUEMiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFMYXllclJlY3QoLTAuNiwgLTAuNiwgMC42LCAwLjYpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1N0cmluZ1Byb3BlcnR5KCJzdHJpbmdQcm9wZXJ0eSIsICJERUZBVUxUIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3UmVhbFByb3BlcnR5KCJyZWFsUHJvcGVydHkiLCAzMi4zMyk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3SW50UHJvcGVydHkoIkNPVU5UIiwgMzQpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZFZpYSgiUlhfUEMiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgc3RhdHVzID0gbGVmd1N0YXJ0VmlhKCJNMl9NM19QV1IiLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFSZXNpc3RhbmNlKDAuNCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3VmlhTGF5ZXIoIk0yIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3VmlhTGF5ZXJSZWN0KC0xLjM1LCAtMS4zNSwgMS4zNSwgMS4zNSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3VmlhTGF5ZXIoIlYyIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3VmlhTGF5ZXJSZWN0KC0xLjM1LCAtMS4zNSwgLTAuNDUsIDEuMzUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1ZpYUxheWVyUmVjdCgwLjQ1LCAtMS4zNSwgMS4zNSwgLTAuNDUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1ZpYUxheWVyUmVjdCgwLjQ1LCAwLjQ1LCAxLjM1LCAxLjM1KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFMYXllcigiTTMiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFMYXllclJlY3QoLTEuMzUsIC0xLjM1LCAxLjM1LCAxLjM1KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRWaWEoIk0yX00zX1BXUiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICBzdGF0dXMgPSBsZWZ3U3RhcnRWaWEoIklOMVgiLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFMYXllcigiQ1VUMDEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFMYXllclJlY3QoLTAuNDUsIC0wLjQ1LCAwLjQ1LCAwLjQ1KTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndJbnRQcm9wZXJ0eSgiQ09VTlQiLCAxKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRWaWEoIklOMVgiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHJldHVybiAwOwotfQotCi0vLyBWSUFSVUxFCi1pbnQgdmlhUnVsZUNCKGxlZndDYWxsYmFja1R5cGVfZSBjLCBsZWZpVXNlckRhdGEgdWQpIHsKLSAgaW50ICAgIHN0YXR1czsKLQotICBjaGVja1R5cGUoYyk7Ci0gIHN0YXR1cyA9IGxlZndTdGFydFZpYVJ1bGUoIlZJQUxJU1QxMiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgbGVmd0FkZENvbW1lbnQoIkJyZWFrIHVwIHRoZSBvbGQgbGVmd1ZpYVJ1bGUgaW50byAyIHJvdXRpbmVzIik7Ci0gIGxlZndBZGRDb21tZW50KCJsZWZ3VmlhUnVsZUxheWVyIGFuZCBsZWZ3VmlhUnVsZVZpYSIpOwotICBzdGF0dXMgPSBsZWZ3VmlhUnVsZUxheWVyKCJNMSIsIE5VTEwsIDkuMCwgOS42LCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFSdWxlTGF5ZXIoIk0yIiwgTlVMTCwgMy4wLCAzLjAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1ZpYVJ1bGVWaWEoIlZJQUNFTlRFUjEyIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3U3RyaW5nUHJvcGVydHkoInZyc3AiLCAibmV3Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3SW50UHJvcGVydHkoInZyaXAiLCAxKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndSZWFsUHJvcGVydHkoInZycnAiLCA0LjUpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZFZpYVJ1bGUoIlZJQUxJU1QxMiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLQotICAvLyBWSUFSVUxFIHdpdGggR0VORVJBVEUKLSAgbGVmd0FkZENvbW1lbnQoIkJyZWFrIHVwIHRoZSBvbGQgbGVmd1ZpYVJ1bGVHZW5lYXJ0ZSBpbnRvIDQgcm91dGluZXMiKTsKLSAgbGVmd0FkZENvbW1lbnQoImxlZndTdGFydFZpYVJ1bGVHZW4sIGxlZndWaWFSdWxlR2VuTGF5ZXIsIik7Ci0gIGxlZndBZGRDb21tZW50KCJsZWZ3VmlhUnVsZUdlbkxheWVyMywgYW5kIGxlZndFbmRWaWFSdWxlR2VuIik7Ci0gIHN0YXR1cyA9IGxlZndTdGFydFZpYVJ1bGVHZW4oIlZJQUdFTjEyIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3VmlhUnVsZUdlbkxheWVyKCJNMSIsIE5VTEwsIDAuMSwgMTksIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1ZpYVJ1bGVHZW5MYXllcigiTTIiLCBOVUxMLCAwLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFSdWxlR2VuTGF5ZXIzKCJWMSIsIC0wLjgsIC0wLjgsIDAuOCwgMC44LCA1LjYsIDYuMCwgMC4yKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRWaWFSdWxlR2VuKCJWSUFHRU4xMiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLSAgLy8gTk9OREVGQVVMVFJVTEUKLWludCBub25EZWZhdWx0Q0IobGVmd0NhbGxiYWNrVHlwZV9lIGMsIGxlZmlVc2VyRGF0YSB1ZCkgewotICBpbnQgICAgc3RhdHVzOwotCi0gIGNoZWNrVHlwZShjKTsKLSAgc3RhdHVzID0gbGVmd1N0YXJ0Tm9uRGVmYXVsdFJ1bGUoIlJVTEUxIik7IAotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd05vbkRlZmF1bHRSdWxlTGF5ZXIoIlJYIiwgMTAuMCwgMi4yLCA2LCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndOb25EZWZhdWx0UnVsZUxheWVyKCJQQyIsIDEwLjAsIDIuMiwgMCwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3Tm9uRGVmYXVsdFJ1bGVMYXllcigiTTEiLCAxMC4wLCAyLjIsIDAsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1N0YXJ0VmlhKCJuZDFWQVJYMCIsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1ZpYVJlc2lzdGFuY2UoMC4yKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFMYXllcigiUlgiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFMYXllclJlY3QoLTMsIC0zLCAzLCAzKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFMYXllcigiQ1VUMTIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndWaWFMYXllclJlY3QoLTEuMCwgLTEuMCwgMS4wLCAxLjApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1ZpYUxheWVyKCJQQyIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1ZpYUxheWVyUmVjdCgtMywgLTMsIDMsIDMpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZFZpYSgibmQxVkFSWDAiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmROb25EZWZhdWx0UnVsZSgiUlVMRTEiKTsgCi0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICByZXR1cm4gMDsKLX0KLQotLy8gTUlORkVBVFVSRSAmIERJRUxFQ1RSSUMKLWludCBtaW5GZWF0dXJlQ0IobGVmd0NhbGxiYWNrVHlwZV9lIGMsIGxlZmlVc2VyRGF0YSB1ZCkgewotICBpbnQgICAgc3RhdHVzOwotCi0gIGNoZWNrVHlwZShjKTsKLSAgc3RhdHVzID0gbGVmd01pbkZlYXR1cmUoMC4xLCAwLjEpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIFNJVEUKLWludCBzaXRlQ0IobGVmd0NhbGxiYWNrVHlwZV9lIGMsIGxlZmlVc2VyRGF0YSB1ZCkgewotICBpbnQgICAgc3RhdHVzOwotCi0gIGNoZWNrVHlwZShjKTsKLSAgc3RhdHVzID0gbGVmd1NpdGUoIkNPUkUxIiwgIkNPUkUiLCAiWCIsIDY3LjIsIDYpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1NpdGVSb3dQYXR0ZXJuKCJGc2l0ZSIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1NpdGVSb3dQYXR0ZXJuU3RyKCJMc2l0ZSIsICJOIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3U2l0ZVJvd1BhdHRlcm5TdHIoIkxzaXRlIiwgIkZTIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBsZWZ3RW5kU2l0ZSgiQ09SRTEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndTaXRlKCJDT1JFIiwgIkNPUkUiLCAiWSIsIDMuNiwgMjguOCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBsZWZ3RW5kU2l0ZSgiQ09SRSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1NpdGUoIk1SQ09SRSIsICJDT1JFIiwgIlkiLCAzLjYsIDI4LjgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgbGVmd0VuZFNpdGUoIk1SQ09SRSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1NpdGUoIklPV0lSRUQiLCAiUEFEIiwgTlVMTCwgNTcuNiwgNDMyKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIGxlZndFbmRTaXRlKCJJT1dJUkVEIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICByZXR1cm4gMDsKLX0KLQotLy8gTUFDUk8KLWludCBtYWNyb0NCKGxlZndDYWxsYmFja1R5cGVfZSBjLCBsZWZpVXNlckRhdGEgdWQpIHsKLSAgaW50ICAgIHN0YXR1czsKLSAgZG91YmxlICp4cGF0aDsKLSAgZG91YmxlICp5cGF0aDsKLQotICBjaGVja1R5cGUoYyk7Ci0gIHN0YXR1cyA9IGxlZndTdGFydE1hY3JvKCJDSEszQSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvQ2xhc3MoIlJJTkciLCBOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb09yaWdpbigwLjksIDAuOSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9TaXplKDEwLjgsIDI4LjgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvU3ltbWV0cnkoIlggWSBSOTAiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1NpdGUoIkNPUkUiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndTdGFydE1hY3JvUGluKCJHTkQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpbkRpcmVjdGlvbigiSU5PVVQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpblRhcGVyUnVsZSgiUlVMRTEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpblVzZSgiR1JPVU5EIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5TaGFwZSgiQUJVVE1FTlQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIC8vIE1BQ1JPIC0gUElOCi0gIHN0YXR1cyA9IGxlZndTdGFydE1hY3JvUGluUG9ydChOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpblBvcnRMYXllcigiTTEiLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpblBvcnRMYXllclJlY3QoLTAuOSwgMywgOS45LCA2LCAwLCAwLCAwLCAwKTsgCi0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3RW5kTWFjcm9QaW5Qb3J0KCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3U3RyaW5nUHJvcGVydHkoIlRZUEUiLCAic3BlY2lhbCIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0ludFByb3BlcnR5KCJpbnRQcm9wIiwgMjMpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1JlYWxQcm9wZXJ0eSgicmVhbFByb3AiLCAyNC4yNSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5BbnRlbm5hc2l6ZSgxLCAiTTEiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpbkFudGVubmFzaXplKDIsICJNMiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZE1hY3JvUGluKCJHTkQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndTdGFydE1hY3JvUGluKCJWREQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpbkRpcmVjdGlvbigiSU5PVVQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpblVzZSgiUE9XRVIiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpblNoYXBlKCJBQlVUTUVOVCIpOyAKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIC8vIE1BQ1JPIC0gUElOIC0gUE9SVAotICBzdGF0dXMgPSBsZWZ3U3RhcnRNYWNyb1BpblBvcnQoTlVMTCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5Qb3J0TGF5ZXIoIk0xIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5Qb3J0TGF5ZXJSZWN0KC0wLjksIDIxLCA5LjksIDI0LCAwLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRNYWNyb1BpblBvcnQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpbkFudGVubmFNZXRhbEFyZWEoMywgIk0xIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5BbnRlbm5hTWV0YWxBcmVhKDQsICJNMiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvUGluQW50ZW5uYU1ldGFsTGVuZ3RoKDUsICJNMSIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvUGluQW50ZW5uYU1ldGFsTGVuZ3RoKDYsICJNMiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZE1hY3JvUGluKCJWREQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndTdGFydE1hY3JvUGluKCJQQTMiKTsgCi0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5EaXJlY3Rpb24oIklOUFVUIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3U3RhcnRNYWNyb1BpblBvcnQoTlVMTCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5Qb3J0TGF5ZXIoIk0xIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5Qb3J0TGF5ZXJSZWN0KDEuMzUsIC0wLjQ1LCAyLjI1LCAwLjQ1LCAwLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpblBvcnRMYXllclJlY3QoLTAuNDUsIC0wLjQ1LCAwLjQ1LCAwLjQ1LCAwLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRNYWNyb1BpblBvcnQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndTdGFydE1hY3JvUGluUG9ydChOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpblBvcnRMYXllcigiUEMiLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpblBvcnRMYXllclJlY3QoLTAuNDUsIDEyLjE1LCAwLjQ1LCAxMy4wNSwgMCwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3RW5kTWFjcm9QaW5Qb3J0KCk7IAotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1N0YXJ0TWFjcm9QaW5Qb3J0KE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvUGluUG9ydExheWVyKCJQQyIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvUGluUG9ydExheWVyUmVjdCg4LjU1LCA4LjU1LCA5LjQ1LCA5LjQ1LCAwLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpblBvcnRMYXllclJlY3QoNi43NSwgNi43NSwgNy42NSwgNy42NSwgMCwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5Qb3J0TGF5ZXJSZWN0KDYuNzUsIDguNzUsIDcuNjUsIDkuNjUsIDAsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvUGluUG9ydExheWVyUmVjdCg2Ljc1LCAxMC4zNSwgNy42NSwgMTEuMjUsIDAsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZE1hY3JvUGluUG9ydCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZE1hY3JvUGluKCJQQTMiKTsgCi0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICAvLyBNQUNSTyAtIE9CUwotICBzdGF0dXMgPSBsZWZ3U3RhcnRNYWNyb09icygpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvT2JzTGF5ZXIoIk0xIiwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9PYnNMYXllclJlY3QoNi42LCAtMC42LCA5LjYsIDAuNiwgMCwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9PYnNMYXllclJlY3QoNC44LCAxMi45LCA5LjYsIDEzLjIsIDAsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvT2JzTGF5ZXJSZWN0KDMsIDEzLjgsIDcuOCwgMTYuOCwgMCwgMCwgMCwgMCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9PYnNMYXllclJlY3QoMywgLTAuNiwgNiwgMC42LCAwLCAwLCAwLCAwKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndFbmRNYWNyb09icygpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd1N0cmluZ1Byb3BlcnR5KCJzdHJpbmdQcm9wIiwgImZpcnN0Iik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3SW50UHJvcGVydHkoImludGVnZXJQcm9wIiwgMSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3UmVhbFByb3BlcnR5KCJXRUlHSFQiLCAzMC4zMSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3RW5kTWFjcm8oIkNISzNBIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIC8vIDJuZCBNQUNSTwotICBzdGF0dXMgPSBsZWZ3U3RhcnRNYWNybygiSU5WIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9DbGFzcygiQ09SRSIsIE5VTEwpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvRm9yZWlnbigiSU5WUyIsIDAsIDAsIC0xKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1NpemUoNjcuMiwgMjQpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvU3ltbWV0cnkoIlggWSBSOTAiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1NpdGUoIkNPUkUxIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3U3RhcnRNYWNyb1BpbigiWiIpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvUGluRGlyZWN0aW9uKCJPVVRQVVQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpblVzZSgiU0lHTkFMIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3TWFjcm9QaW5TaGFwZSgiQUJVVE1FTlQiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndTdGFydE1hY3JvUGluUG9ydChOVUxMKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb1BpblBvcnRMYXllcigiTTIiLCA1LjYpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgeHBhdGggPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkqNyk7Ci0gIHlwYXRoID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpKjcpOwotICB4cGF0aFswXSA9IDMwLjg7Ci0gIHlwYXRoWzBdID0gOTsKLSAgeHBhdGhbMV0gPSA0MjsKLSAgeXBhdGhbMV0gPSA5OwotICB4cGF0aFsyXSA9IDMwLjg7Ci0gIHlwYXRoWzJdID0gOTsKLSAgeHBhdGhbM10gPSA0MjsKLSAgeXBhdGhbM10gPSA5OwotICB4cGF0aFs0XSA9IDMwLjg7Ci0gIHlwYXRoWzRdID0gOTsKLSAgeHBhdGhbNV0gPSA0MjsKLSAgeXBhdGhbNV0gPSA5OwotICB4cGF0aFs2XSA9IDMwLjg7Ci0gIHlwYXRoWzZdID0gOTsKLSAgc3RhdHVzID0gbGVmd01hY3JvUGluUG9ydExheWVyUGF0aCg3LCB4cGF0aCwgeXBhdGgsIDAsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZE1hY3JvUGluUG9ydCgpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZE1hY3JvUGluKCJaIik7IAotICBmcmVlKChjaGFyKil4cGF0aCk7Ci0gIGZyZWUoKGNoYXIqKXlwYXRoKTsKLSAgLy8gTUFDUk8gLSBPQlMKLSAgc3RhdHVzID0gbGVmd1N0YXJ0TWFjcm9PYnMoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb09ic0xheWVyKCJNMSIsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd01hY3JvT2JzTGF5ZXJSZWN0KDI0LjEsIDEuNSwgNDMuNSwgMjA4LjUsIDAsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgeHBhdGggPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkqMik7Ci0gIHlwYXRoID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpKjIpOwotICB4cGF0aFswXSA9IDguNDsKLSAgeXBhdGhbMF0gPSAzOwotICB4cGF0aFsxXSA9IDguNDsKLSAgeXBhdGhbMV0gPSAxMjQ7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb09ic0xheWVyUGF0aCgyLCB4cGF0aCwgeXBhdGgsIDAsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgeHBhdGhbMF0gPSA1OC44OwotICB5cGF0aFswXSA9IDM7Ci0gIHhwYXRoWzFdID0gNTguODsKLSAgeXBhdGhbMV0gPSAxMjM7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb09ic0xheWVyUGF0aCgyLCB4cGF0aCwgeXBhdGgsIDAsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgeHBhdGhbMF0gPSA2NC40OwotICB5cGF0aFswXSA9IDM7Ci0gIHhwYXRoWzFdID0gNjQuNDsKLSAgeXBhdGhbMV0gPSAxMjM7Ci0gIHN0YXR1cyA9IGxlZndNYWNyb09ic0xheWVyUGF0aCgyLCB4cGF0aCwgeXBhdGgsIDAsIDAsIDAsIDApOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgZnJlZSgoY2hhciopeHBhdGgpOwotICBmcmVlKChjaGFyKil5cGF0aCk7Ci0gIHN0YXR1cyA9IGxlZndFbmRNYWNyb09icygpOwotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZE1hY3JvKCJJTlYiKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHJldHVybiAwOwotfQotCi0vLyBBTlRFTk5BCi1pbnQgYW50ZW5uYUNCKGxlZndDYWxsYmFja1R5cGVfZSBjLCBsZWZpVXNlckRhdGEgdWQpIHsKLSAgaW50ICAgIHN0YXR1czsKLQotICBjaGVja1R5cGUoYyk7Ci0gIHN0YXR1cyA9IGxlZndBbnRlbm5hKCJJTlBVVFBJTkFOVEVOTkFTSVpFIiwgMSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3QW50ZW5uYSgiT1VUUFVUUElOQU5URU5OQVNJWkUiLCAtMSk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3QW50ZW5uYSgiSU5PVVRQSU5BTlRFTk5BU0laRSIsIC0xKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHN0YXR1cyA9IGxlZndOZXdMaW5lKCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICByZXR1cm4gMDsKLX0KLQotLy8gQkVHSU5FWFQKLWludCBleHRDQihsZWZ3Q2FsbGJhY2tUeXBlX2UgYywgbGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGludCAgICBzdGF0dXM7Ci0KLSAgY2hlY2tUeXBlKGMpOwotICBzdGF0dXMgPSBsZWZ3U3RhcnRCZWdpbmV4dCgiU0lHTkFUVVJFIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3QmVnaW5leHRDcmVhdG9yKCJDQURFTkNFIik7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICBzdGF0dXMgPSBsZWZ3QmVnaW5leHREYXRlKCk7IAotICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0VuZEJlZ2luZXh0KCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotICByZXR1cm4gMDsKLX0KLQotaW50IGVuZExpYkNCKGxlZndDYWxsYmFja1R5cGVfZSBjLCBsZWZpVXNlckRhdGEgdWQpIHsKLSAgaW50ICAgIHN0YXR1czsKLQotICBjaGVja1R5cGUoYyk7Ci0gIHN0YXR1cyA9IGxlZndFbmQoKTsKLSAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIHJldHVybiAwOwotfQotCi1tYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICBjaGFyKiBvdXRmaWxlOwotICBpbnQgICBzdGF0dXM7ICAgIC8vIHJldHVybiBjb2RlLCBpZiBub25lIDAgbWVhbnMgZXJyb3IKLSAgaW50ICAgcmVzOwotCi0gIC8vIGFzc2lnbiB0aGUgZGVmYXVsdAotICBzdHJjcHkoZGVmYXVsdE91dCwgImxlZi5pbiIpOwotICBvdXRmaWxlICA9IGRlZmF1bHRPdXQ7Ci0gIGZvdXQgICAgID0gc3Rkb3V0OwotICB1c2VyRGF0YSA9IDB4MDEwMjAzMDQ7Ci0KLSAgZG91YmxlKiBheGlzOwotICBkb3VibGUqIG51bTE7Ci0gIGRvdWJsZSogbnVtMjsKLSAgZG91YmxlKiBudW0zOwotCi0gIGludCAgICAgZW5jcnlwdCA9IDA7IC8vIGlmIHVzZXIgd2FudHMgZW5jcnlwdGVkIG91dHB1dAotCi0gIGFyZ2MtLTsKLSAgYXJndisrOwotICB3aGlsZSAoYXJnYy0tKSB7Ci0gICAgIGlmIChzdHJjbXAoKmFyZ3YsICItbyIpID09IDApIHsgICAvLyBvdXRwdXQgZmlsZW5hbWUKLSAgICAgICAgYXJndisrOwotICAgICAgICBhcmdjLS07Ci0gICAgICAgIG91dGZpbGUgPSAqYXJndjsKLSAgICAgICAgaWYgKChmb3V0ID0gZm9wZW4ob3V0ZmlsZSwgInciKSkgPT0gMCkgewotICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBjb3VsZCBub3Qgb3BlbiBvdXRwdXQgZmlsZVxuIik7Ci0gICAgICAgICAgIHJldHVybiAyOwotICAgICAgICB9Ci0gICAgIH0gZWxzZSBpZiAoc3RybmNtcCgqYXJndiwgICItaCIsIDIpID09IDApIHsgIC8vIGNvbXBhcmUgd2l0aCAtaFtlbHBdCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGxlZndyaXRlIFstbyA8ZmlsZW5hbWU+XSBbLWhlbHBdIFstZV1cbiIpOwotICAgICAgICByZXR1cm4gMTsKLSAgICAgfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItZSIpID09IDApIHsgLy8gdXNlciB3YW50cyB0byB3cml0ZSBvdXQgZW5jcnB5dGVkCi0gICAgICAgIGVuY3J5cHQgPSAxOwotICAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBJbGxlZ2FsIGNvbW1hbmQgbGluZSBvcHRpb246ICclcydcbiIsICphcmd2KTsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgIH0KLSAgICAgYXJndisrOwotICB9Ci0KLSAgLy8gaW5pdGFsaXplCi0gIC8vIHN0YXR1cyA9IGxlZndJbml0KGZvdXQpOwotICAvLyBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgc3RhdHVzID0gbGVmd0luaXRDYmsoZm91dCk7Ci0gIENIRUNLX1NUQVRVUyhzdGF0dXMpOwotCi0gIGlmIChlbmNyeXB0KSB7Ci0gICAgIC8vIHVzZXIgd2FudHMgZW5jcnlwdGVkIG91dHB1dCwgbWFrZSBzdXJlIHRvIGNhbGwgbGVmd0Nsb3NlRW5jcnlwdCgpCi0gICAgIC8vIGJlZm9yZSBjYWxsaW5nIGZjbG9zZSgpOwotICAgICBzdGF0dXMgPSBsZWZ3RW5jcnlwdCgpOwotICAgICBDSEVDS19TVEFUVVMoc3RhdHVzKTsKLSAgfQotCi0gIC8vIHNldCB0aGUgY2FsbGJhY2sgZnVuY3Rpb25zCi0gIGxlZndTZXRBbnRlbm5hQ2JrKGFudGVubmFDQik7Ci0gIGxlZndTZXRCdXNCaXRDaGFyc0NiayhidXNCaXRDaGFyc0NCKTsKLSAgbGVmd1NldERpdmlkZXJDaGFyQ2JrKGRpdmlkZXJDQik7Ci0gIGxlZndTZXRFbmRMaWJDYmsoZW5kTGliQ0IpOwotICBsZWZ3U2V0RXh0Q2JrKGV4dENCKTsKLSAgbGVmd1NldExheWVyQ2JrKGxheWVyQ0IpOwotICBsZWZ3U2V0TWFjcm9DYmsobWFjcm9DQik7Ci0gIGxlZndTZXRNaW5GZWF0dXJlQ2JrKG1pbkZlYXR1cmVDQik7Ci0gIGxlZndTZXROb25EZWZhdWx0Q2JrKG5vbkRlZmF1bHRDQik7Ci0gIGxlZndTZXRQcm9wRGVmQ2JrKHByb3BEZWZDQik7Ci0gIGxlZndTZXRTaXRlQ2JrKHNpdGVDQik7Ci0gIGxlZndTZXRVbml0c0Niayh1bml0c0NCKTsKLSAgbGVmd1NldFVzZXJEYXRhKCh2b2lkKikzKTsKLSAgbGVmd1NldFZlcnNpb25DYmsodmVyc2lvbkNCKTsKLSAgbGVmd1NldFZpYUNiayh2aWFDQik7Ci0gIGxlZndTZXRWaWFSdWxlQ2JrKHZpYVJ1bGVDQik7Ci0KLSAgcmVzID0gbGVmd1dyaXRlKGZvdXQsIG91dGZpbGUsICh2b2lkKil1c2VyRGF0YSk7Ci0KLSAgaWYgKGVuY3J5cHQpIHsKLSAgICAgLy8gb3V0cHV0IGhhcyBiZWVuIHdyaXR0ZW4gaW4gZW5jcnlwdGVkLCBuZWVkIHRvIGNsb3NlIHRoZSBlbmNyeXB0ZWQKLSAgICAgLy8gYnVmZmVyCi0gICAgIHN0YXR1cyA9IGxlZndDbG9zZUVuY3J5cHQoKTsKLSAgICAgQ0hFQ0tfU1RBVFVTKHN0YXR1cyk7Ci0gIH0KLQotICBmY2xvc2UoZm91dCk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZnpsaWIvbGVmemxpYi5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmemxpYi9sZWZ6bGliLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM5NDk4Yi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmemxpYi9sZWZ6bGliLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTIsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgInpsaWIuaCIKLSNpbmNsdWRlICJsZWZ6bGliLmhwcCIKLSNpbmNsdWRlICJsZWZyUmVhZGVyLmhwcCIKLQotLyoKLSAqIFByaXZhdGUgZnVuY3Rpb25zOgotICovCi1zaXplX3QgbGVmR1ppcF9yZWFkKEZJTEUqIGZpbGUsIGNoYXIqIGJ1Ziwgc2l6ZV90IGxlbikgewotICByZXR1cm4gKGd6cmVhZCgoZ3pGaWxlKWZpbGUsIGJ1ZiwgbGVuKSk7Ci19Ci0KLS8qCi0gKiBQdWJsaWMgZnVuY3Rpb25zOgotICovCi1sZWZHWkZpbGUgCi1sZWZHWmlwT3Blbihjb25zdCBjaGFyICpnemlwUGF0aCwgY29uc3QgY2hhciogbW9kZSkgewotCi0gIGlmICghZ3ppcFBhdGgpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgbGVmR1pGaWxlIGZwdHIgPSBnem9wZW4oZ3ppcFBhdGgsIG1vZGUpOwotICBpZiAoZnB0cikgewotICAgIC8qIHN1Y2Nlc3NmdWxseSBvcGVuIHRoZSBnemlwIGZpbGUgKi8KLSAgICAvKiBzZXQgdGhlIHJlYWQgZnVuY3Rpb24gdG8gcmVhZCBmcm9tIGEgY29tcHJlc3NlZCBmaWxlICovCi0gICAgbGVmclNldFJlYWRGdW5jdGlvbihsZWZHWmlwX3JlYWQpOwotICAgIHJldHVybiAobGVmR1pGaWxlKWZwdHI7Ci0gIH0gZWxzZQotICAgIHJldHVybiBOVUxMOwotfQotCi1pbnQgbGVmR1ppcENsb3NlKGxlZkdaRmlsZSBmaWxlUHRyKSB7Ci0gIGxlZnJVbnNldFJlYWRGdW5jdGlvbigpOwotICByZXR1cm4gKGd6Y2xvc2UoKGd6RmlsZSlmaWxlUHRyKSk7Ci19Ci0KLWludCBsZWZyUmVhZEdaaXAobGVmR1pGaWxlIGZpbGUsIGNvbnN0IGNoYXIqIGd6aXBGaWxlLCBsZWZpVXNlckRhdGEgdURhdGEpIHsKLSAgcmV0dXJuIGxlZnJSZWFkKChGSUxFKilmaWxlLCBnemlwRmlsZSwgdURhdGEpOwotfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9tb2R1bGUvbGVmLzUuOC1wMDI5L2xlZnpsaWIvbGVmemxpYi5ocHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmemxpYi9sZWZ6bGliLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY3MTA1NC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvbGVmemxpYi9sZWZ6bGliLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29weXJpZ2h0IDIwMTIsIENhZGVuY2UgRGVzaWduIFN5c3RlbXMKLS8vIAotLy8gVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mICB0aGUgIENhZGVuY2UgIExFRi9ERUYgIE9wZW4gICBTb3VyY2UKLS8vIERpc3RyaWJ1dGlvbiwgIFByb2R1Y3QgVmVyc2lvbiA1LjguIAotLy8gCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8gCi0vLyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLyAKLS8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLS8vICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotLy8gICAgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8gCi0vLyBGb3IgdXBkYXRlcywgc3VwcG9ydCwgb3IgdG8gYmVjb21lIHBhcnQgb2YgdGhlIExFRi9ERUYgQ29tbXVuaXR5LAotLy8gY2hlY2sgd3d3Lm9wZW5lZGEub3JnIGZvciBkZXRhaWxzLgotLy8gCi0vLyAgJEF1dGhvcjogZGVsbCAkCi0vLyAgJFJldmlzaW9uOiAjMSAkCi0vLyAgJERhdGU6IDIwMTcvMDYvMDYgJAotLy8gICRTdGF0ZTogICQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jaWZuZGVmIExFRlpMSUJfSAotCi10eXBlZGVmIHZvaWQqIGxlZkdaRmlsZTsKLQotLyogCi0gKiBOYW1lOiBsZWZHWmlwT3BlbgotICogRGVzY3JpcHRpb246IE9wZW4gYSBnemlwIGZpbGUKLSAqIFJldHVybnM6IEEgZmlsZSBwb2ludGVyCi0gKi8KLWV4dGVybiBsZWZHWkZpbGUgbGVmR1ppcE9wZW4oY29uc3QgY2hhciogZ3ppcEZpbGUsIGNvbnN0IGNoYXIqIG1vZGUpOwotCi0vKiAKLSAqIE5hbWU6IGxlZkdaaXBDbG9zZQotICogRGVzY3JpcHRpb246IENsb3NlIGEgZ3ppcCBmaWxlCi0gKiBSZXR1cm5zOiAwIGlmIG5vIGVycm9ycwotICovCi1leHRlcm4gaW50IGxlZkdaaXBDbG9zZShsZWZHWkZpbGUgZmlsZVB0cik7Ci0KLS8qCi0gKiBOYW1lOiBsZWZyUmVhZEdaaXAKLSAqIERlc2NyaXB0aW9uOiBQYXJzZSBhIGxlZiBnemlwIGZpbGUKLSAqIFJldHVybnM6IDAgaWYgbm8gZXJyb3JzCi0gKi8KLWV4dGVybiBpbnQgbGVmclJlYWRHWmlwKGxlZkdaRmlsZSBmaWxlLCBjb25zdCBjaGFyKiBnemlwRmlsZSwgdm9pZCogdURhdGEpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS90ZW1wbGF0ZS5tayBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZi81LjgtcDAyOS90ZW1wbGF0ZS5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQxMWRhYi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWYvNS44LXAwMjkvdGVtcGxhdGUubWsKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi1TSEVMTD0vYmluL3NoCi0KLU9TX1RZUEUJOj0gJChzaGVsbCB1bmFtZSAtcykKLWlmZXEgKCQoT1NfVFlQRSksQUlYKQotICAgIEFSQ0g9aWJtcnMKLSAgICBDWFg9L3Vzci9iaW4veGxDX3IgLSsgLURpYm1ycwotICAgIENDPS91c3IvYmluL2NjX3IgLURpYm1ycwotZW5kaWYKLWlmZXEgKCQoT1NfVFlQRSksSFAtVVgpCi0gICAgQVJDSD1ocHBhCi0gICAgQ1hYPS9vcHQvYUNDL2Jpbi9hQ0MKLSAgICBDWFhGTEFHUz0rREFwb3J0YWJsZSAtQUEKLSAgICBCSU5fTElOS19GTEFHUz0tbFBXCi1lbmRpZgotCi1pZmVxICgkKE9TX1RZUEUpLFN1bk9TKQotICAgIEFSQ0g9c3VuNHYKLSAgICBDWFg9Q0MKLSAgICBDWFhGTEFHUz0tZwotZW5kaWYKLQotaWZlcSAoJChPU19UWVBFKSxMaW51eCkKLSAgICBBUkNIPWxueDg2IAotICAgIENYWD1nKysKLSAgICBDQz1nY2MKLWVuZGlmCi0KLS5TVUZGSVhFUzogJChTVUZGSVhFUykgLmNwcAotCi0KLVRNUDEJPQkkKExJQlNSQ1M6LmNwcD0ubykKLVRNUDIJPQkkKFRNUDE6LmNjPS5vKQotTElCT0JKUyA9CSQoVE1QMjouYz0ubykKLQotVE1QMwk9CSQoQklOU1JDUzouY3BwPS5vKQotVE1QNAk9CSQoVE1QMzouY2M9Lm8pCi1CSU5PQkpTID0JJChUTVA0Oi5jPS5vKQotCi1hbGw6ICQoTElCVEFSR0VUKSAkKEJJTlRBUkdFVCkKLQotaWZkZWYgQklOVEFSR0VUCi1JTlNUQUxMRURfQklOID0gLi4vYmluLyQoQklOVEFSR0VUKQotZW5kaWYKLQotCi0kKElOU1RBTExFRF9CSU4pOiAkKEJJTlRBUkdFVCkKLQlAbWtkaXIgLXAgLi4vYmluCi0JQGVjaG8gJDwgPVw+ICRACi0JQHJtIC1mICQoSU5TVEFMTEVEX0JJTikKLQlAY3AgJChCSU5UQVJHRVQpICQoSU5TVEFMTEVEX0JJTikKLQotaW5zdGFsbGJpbjogJChJTlNUQUxMRURfQklOKQotCi1pZmRlZiBMSUJUQVJHRVQKLUlOU1RBTExFRF9MSUIgPSAuLi9saWIvJChMSUJUQVJHRVQpCi1lbmRpZgotCi0KLSQoSU5TVEFMTEVEX0xJQik6ICQoTElCVEFSR0VUKQotCUBta2RpciAtcCAuLi9saWIKLQlAZWNobyAkPCA9XD4gJEAKLQlAcm0gLWYgJChJTlNUQUxMRURfTElCKQotCUBjcCAkKExJQlRBUkdFVCkgJChJTlNUQUxMRURfTElCKQotCi1pbnN0YWxsbGliOiAkKElOU1RBTExFRF9MSUIpCi0KLWluc3RhbGwgcmVsZWFzZTogYWxsIGluc3RhbGxoZHJzIGluc3RhbGxsaWIgaW5zdGFsbGJpbgotCi1JTlNUQUxMRURfSERSUyA9ICQoUFVCTElDX0hEUlM6JT0uLi9pbmNsdWRlLyUpCi0kKElOU1RBTExFRF9IRFJTKToJLi4vaW5jbHVkZS8lOgklCi0JQG1rZGlyIC1wIC4uL2luY2x1ZGUKLQlAZWNobyAkPCA9XD4gJEAKLQlAcm0gLWYgJEAKLQlAY3AgLXAgJDwgJEAKLQotaW5zdGFsbGhkcnM6ICQoSU5TVEFMTEVEX0hEUlMpCi0KLS5jcHAubzoKLQkkKENPTVBJTEUuY2MpIC1JLi4vaW5jbHVkZSAkPAotCi0uYy5vOgotCSQoQ09NUElMRS5jKSAtSS4uL2luY2x1ZGUgJDwKLQotJChMSUJUQVJHRVQpOiAkKExJQk9CSlMpCi0Jcm0gLWYgJChMSUJUQVJHRVQpCi0JJChBUikgJChBUkZMQUdTKSAkKExJQlRBUkdFVCkgJF4KLQotJChCSU5UQVJHRVQpOiAkKEJJTk9CSlMpICQoTElCVEFSR0VUKSAkKExETElCUykKLQlybSAtZiAkKEJJTlRBUkdFVCkKLQkkKExJTksuY2MpIC1vICQoQklOVEFSR0VUKSAkKEJJTk9CSlMpICQoTElCVEFSR0VUKSAkKExETElCUykgJChCSU5fTElOS19GTEFHUykKLQotY2xlYW4gZG9jbGVhbjoKLQlybSAtZiAkKExJQlRBUkdFVCkgJChMSUJPQkpTKSAkKEJJTlRBUkdFVCkgJChCSU5PQkpTKSAkKElOU1RBTExFRF9MSUIpIFwKLQkJCSQoSU5TVEFMTEVEX0JJTikgJChJTlNUQUxMRURfSERSUykgbGVmLnRhYi5jKiBsZWYudGFiLmgKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZmRlZlJlYWRtZS50eHQgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL21vZHVsZS9sZWZkZWZSZWFkbWUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzAzMzAxLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvbW9kdWxlL2xlZmRlZlJlYWRtZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi1UaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgdGhlIDUuOCB2ZXJzaW9uIG9mIExpYnJhcnkgRXhjaGFuZ2UgRm9ybWF0IChMRUYpIGFuZCBEZXNpZ24KLUV4Y2hhbmdlIEZvcm1hdCAoREVGKS4gTEVGIGFuZCBERUYgYXJlIGRpc3RyaWJ1dGVkIGZyZWUgb2YgY2hhcmdlLiBTZWUgdGhlCi1MaWNlbnNlLnR4dCBmaWxlIGluIHRoZSBMRUYgYW5kIERFRiBtb2R1bGVzIGZvciBjb25kaXRpb25zIGF0dGFjaGVkIHRvIHRoZSB1c2Ugb2YgdGhpcwotc29mdHdhcmUsIGFuZCB0aGUgY29weWluZyBvciBkaXN0cmlidXRpb24gb2YgaXQuCi0KLVRoZSBNYWtlIHByb2dyYW1zIGZvciBzb21lIHN5c3RlbXMgbWF5IG5vdCBiZSBhYmxlIHRvIHByb2Nlc3MgdGhlIE1ha2VmaWxlIGZvciB0aGUKLUxFRi9ERUYgdXRpbGl0aWVzLiBJZiB5b3VyIHN5c3RlbSdzIG5hdGl2ZSBNYWtlIHByb2dyYW0gcmV0dXJucyBlcnJvcnMgd2hlbiBidWlsZGluZwotTEVGL0RFRiwgdXNlIEdOVSBNYWtlLCBvciBjaGFuZ2UgdGhlIE1ha2VmaWxlcyBzbyB0aGF0IHRoZXkgd29yayBvbiB5b3VyIHN5c3RlbS4KLQotTWl4aW5nIDUuNCwgNS41LCA1LjYgYW5kIDUuNyBTeW50YXggd2l0aCA1LjggU3ludGF4Ci0KLVVzZSBjYXV0aW9uIHdoZW4gbWl4aW5nIHZlcnNpb25zIDUuNCwgNS41LCA1LjYsIGFuZCA1Ljcgc3ludGF4IGluIExFRiBhbmQgREVGIGZpbGVzLiBJZiB5b3UKLWluY2x1ZGUgb2Jzb2xldGUgNS40LCA1LjUsIDUuNiBhbmQgNS43IGNvbnN0cnVjdHMgaW4gYSA1LjggZmlsZSwgdGhlIHJlYWRlciBnZW5lcmF0ZXMgYSB3YXJuaW5nLgotCi1Eb2N1bWVudGF0aW9uCi0KLURvY3VtZW50YXRpb24gZm9yIHRoZSBMRUYgYW5kIERFRiBhcHBsaWNhdGlvbiBwcm9ncmFtbWluZyBpbnRlcmZhY2VzIGNhbiBiZSBmb3VuZCBpbgotdGhlIGxlZi9kb2MgYW5kIGRlZi9kb2Mgc3ViZGlyZWN0b3JpZXMsIGJ1dCBpdCBoYXMgbm90IHlldCBiZWVuIHVwZGF0ZWQgd2l0aCB0aGUKLWNoYW5nZXMgcmVxdWlyZWQgZm9yIHRoZSBuZXcgNS44IHN5bnRheC4gUGxlYXNlIGNvbnRhY3QgQ2FkZW5jZSBmb3IgdGhlIHZlcnNpb24gb2YgCi10aGUgTEVGL0RFRiA1Ljggc3ludGF4LgotCi1CdWcgUmVwb3J0aW5nCi0KLVBsZWFzZSByZXBvcnQgaXNzdWVzIHdpdGggdGhpcyB2ZXJzaW9uIG9mIHRoZSBMRUYvREVGIDUuOCBwYXJzZXIgZGlyZWN0bHkgdG8gQ2FkZW5jZS4KLUVtYWlsIG1ndWluZXlAY2FkZW5jZS5jb20KLQotUGxhdGZvcm1zIFN1cHBvcnRlZAotCi1UaGUgTEVGL0RFRiB1dGlsaXRpZXMgaGF2ZSBiZWVuIHRlc3RlZCBvbiBMaW51eCBSSCA1LjUuIFRoZXkgc2hvdWxkIGFsc28gd29yayBvbiBTb2xhcmlzIDUuMTAuCi0KLUluc3RhbGxhdGlvbgotCi1UaGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGV4cGxhaW5zIGhvdyB0byBjb21waWxlIHRoZSBMRUYgYW5kIERFRiBwYWNrYWdlcy4KLQotSW5zdGFsbGluZyBMRUYgCi0KLVRvIGluc3RhbGwgTEVGLCBkbyB0aGUgZm9sbG93aW5nOgotCi0xLiBDaGFuZ2UgZGlyZWN0b3JpZXMgKGNkKSB0byB0aGUgbGVmIHN1YmRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBwYWNrYWdlJ3Mgc291cmNlIGNvZGUuCi0yLiBUbyBjb21waWxlIGFuZCBidWlsZCB0aGUgcGFja2FnZSwgdHlwZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6Ci1nbWFrZQotCi0zLiBUbyBzZXQgREVCVUcgd2l0aCBPUFRJTUlaRV9GTEFHLCB0eXBlIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKLWdtYWtlIHJlbGVhc2UKLQotNC4gVG8gaW5zdGFsbCBoZWFkZXJzIGJlZm9yZSBjb21waWxpbmcgbGVmcncgbGVmZGlmZiBsZWZ3cml0ZSwgdHlwZSB0aGUgZm9sbG93aW5nCi1jb21tYW5kOgotZ21ha2UgaW5zdGFsbGhkcnMKLQotNS4gT3B0aW9uYWxseSwgdG8gcnVuIHRoZSB0ZXN0cyB0aGF0IGNvbWUgd2l0aCB0aGUgcGFja2FnZSwgdHlwZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6Ci0uL2dtYWtlIHRlc3QKLQotTk9URTogVG8gcmVtb3ZlIHRoZSBwcm9ncmFtIGJpbmFyaWVzIGFuZCBvYmplY3QgZmlsZXMgZnJvbSB0aGUgc291cmNlIGNvZGUgZGlyZWN0b3J5LAotdHlwZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6Ci0KLWdtYWtlIGNsZWFuCi0KLQotSW5zdGFsbGluZyBERUYKLQotVG8gaW5zdGFsbCBERUYsIGRvIHRoZSBmb2xsb3dpbmc6Ci0KLTEuIENoYW5nZSBkaXJlY3RvcmllcyAoY2QpIHRvIHRoZSBkZWYgc3ViZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHBhY2thZ2UncyBzb3VyY2UgY29kZS4KLTIuIFRvIGNvbXBpbGUgYW5kIGJ1aWxkIHRoZSBwYWNrYWdlLCB0eXBlIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKLWdtYWtlCi0KLTMuIFRvIHNldCBERUJVRyB3aXRoIE9QVElNSVpFX0ZMQUcsIHR5cGUgdGhlIGZvbGxvd2luZyBjb21tYW5kOgotZ21ha2UgcmVsZWFzZQotCi00LiBUbyBpbnN0YWxsIGhlYWRlcnMgYmVmb3JlIGNvbXBpbGluZyBkZWZydyBkZWZkaWZmIGRlZndyaXRlLCB0eXBlIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKLWdtYWtlIGluc3RhbGxoZHJzCi0KLTUuIE9wdGlvbmFsbHksIHRvIHJ1biB0aGUgdGVzdHMgdGhhdCBjb21lIHdpdGggdGhlIHBhY2thZ2UsIHR5cGUgdGhlIGZvbGxvd2luZyBjb21tYW5kOgotLi9nbWFrZSB0ZXN0Ci0KLU5PVEU6IFRvIHJlbW92ZSB0aGUgcHJvZ3JhbSBiaW5hcmllcyBhbmQgb2JqZWN0IGZpbGVzIGZyb20gdGhlIHNvdXJjZSBjb2RlIGRpcmVjdG9yeSwKLXR5cGUgdGhlIGZvbGxvd2luZyBjb21tYW5kOgotCi1nbWFrZSBjbGVhbgotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9GbGV4QWNjZXNzUGF0dGVybi5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvRmxleEFjY2Vzc1BhdHRlcm4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTliYmRkNy4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9GbGV4QWNjZXNzUGF0dGVybi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX0ZMRVhfQUNDRVNTX1BBVFRFUk5fSAotI2RlZmluZSBfRkxFWF9BQ0NFU1NfUEFUVEVSTl9ICi0KLSNpbmNsdWRlICJmckJhc2VUeXBlcy5oIgotI2luY2x1ZGUgImRiL29iai9mclNoYXBlLmgiCi0jaW5jbHVkZSAiZGIvb2JqL2ZyVmlhLmgiCi0jaW5jbHVkZSA8bWVtb3J5PgotCi1uYW1lc3BhY2UgZnIgewotICBjbGFzcyBGbGV4QWNjZXNzUGF0dGVybjogcHVibGljIGZyQmxvY2tPYmplY3QgewotICBwdWJsaWM6Ci0gICAgRmxleEFjY2Vzc1BhdHRlcm4oKTogYmVnaW5Qb2ludCgpLGJlZ2luTGF5ZXJOdW0oMCksIHBpbihudWxscHRyKSwgaW5zdHMoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRBY2Nlc3Moc3RkOjp2ZWN0b3I8Ym9vbD4oNiwgZmFsc2UpKSwgYWNjZXNzVmlhRGVmcyhzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxmclZpYURlZio+ID4oMikpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBhcENvc3Qoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSksIG5lYXJlc3RBUERpc3QoMCksIGNvbmZsaWN0KHRydWUpLCBwcmVmZXJyZWQoZmFsc2UpIHt9Ci0gICAgRmxleEFjY2Vzc1BhdHRlcm4oY29uc3QgRmxleEFjY2Vzc1BhdHRlcm4gJmluKTogYmVnaW5Qb2ludChpbi5iZWdpblBvaW50KSwgYmVnaW5MYXllck51bShpbi5iZWdpbkxheWVyTnVtKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaW4oaW4ucGluKSwgbmV0KGluLm5ldCksIGluc3RzKGluLmluc3RzKSwgdmFsaWRBY2Nlc3MoaW4udmFsaWRBY2Nlc3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc1ZpYURlZnMoaW4uYWNjZXNzVmlhRGVmcyksIGFwQ29zdChpbi5hcENvc3QpLCBuZWFyZXN0QVBEaXN0KGluLm5lYXJlc3RBUERpc3QpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mbGljdChpbi5jb25mbGljdCksIHByZWZlcnJlZChpbi5wcmVmZXJyZWQpIHt9Ci0gICAgLy8gZGVwcmVjYXRlZAotICAgIC8vRmxleEFjY2Vzc1BhdHRlcm4oY29uc3QgRmxleEFjY2Vzc1BhdHRlcm4gJmluLCBjb25zdCBmclRyYW5zZm9ybSAmeGZvcm0pIHsKLSAgICAvLyAgZnJQb2ludCBicEluLCBlcEluOwotICAgIC8vICBpbi5nZXRQb2ludHMoYnBJbiwgZXBJbik7Ci0gICAgLy8gIGJwSW4udHJhbnNmb3JtKHhmb3JtKTsKLSAgICAvLyAgZXBJbi50cmFuc2Zvcm0oeGZvcm0pOwotICAgIC8vICBiZWdpblBvaW50LnNldChicEluKTsKLSAgICAvLyAgZW5kUG9pbnQuc2V0KGVwSW4pOwotICAgIC8vICBiZWdpbkxheWVyTnVtID0gaW4uZ2V0QmVnaW5MYXllck51bSgpOwotICAgIC8vICBlbmRMYXllck51bSA9IGluLmdldEVuZExheWVyTnVtKCk7Ci0gICAgLy8gIC8vQVBDb3N0ID0gaW4uZ2V0Q29zdCgpOwotICAgIC8vICAvL3BhdGhzZWdzID0gaW4uZ2V0UGF0aFNlZ3MoKTsKLSAgICAvLyAgLy9mb3IgKGF1dG8gcGF0aFNlZzogaW4uZ2V0UGF0aFNlZ3MoKSkgewotICAgIC8vICAvLyAgcGF0aFNlZy5tb3ZlKHhmb3JtKTsKLSAgICAvLyAgLy8gIHBhdGhzZWdzLnB1c2hfYmFjayhwYXRoU2VnKTsKLSAgICAvLyAgLy99Ci0gICAgLy8gIC8vLy8gdmlhcyA9IGluLmdldFZpYXMoKTsKLSAgICAvLyAgLy9mb3IgKGF1dG8gdmlhOiBpbi5nZXRWaWFzKCkpIHsKLSAgICAvLyAgLy8gIHZpYS5tb3ZlKHhmb3JtKTsKLSAgICAvLyAgLy8gIHZpYXMucHVzaF9iYWNrKHZpYSk7Ci0gICAgLy8gIC8vfQotICAgIC8vICBwaW4gPSBpbi5nZXRQaW4oKTsKLSAgICAvLyAgbmV0ID0gaW4uZ2V0TmV0KCk7Ci0gICAgLy8gIGluc3RzID0gaW4uZ2V0SW5zdHMoKTsKLSAgICAvLyAgdmFsaWRBY2Nlc3MgPSBpbi5nZXRWYWxpZEFjY2VzcygpOwotICAgIC8vICBhY2Nlc3NWaWFEZWZzID0gaW4uZ2V0QWNjZXNzVmlhRGVmcygpOwotICAgIC8vfQotCi0gICAgLy8gZ2V0dGVycwotICAgIC8vdm9pZCBnZXRQb2ludChmclBvaW50ICZpbikgY29uc3QgewotICAgIC8vICBpbi5zZXQoYmVnaW5Qb2ludCk7Ci0gICAgLy99Ci0gICAgdm9pZCBnZXRQb2ludHMoZnJQb2ludCAmYnBJbiwgZnJQb2ludCAmZXBJbikgY29uc3QgewotICAgICAgYnBJbi5zZXQoYmVnaW5Qb2ludCk7Ci0gICAgICAvL2VwSW4uc2V0KGVuZFBvaW50KTsKLSAgICB9Ci0gICAgZnJMYXllck51bSBnZXRCZWdpbkxheWVyTnVtKCkgY29uc3QgewotICAgICAgcmV0dXJuIGJlZ2luTGF5ZXJOdW07Ci0gICAgfQotICAgIC8vZnJMYXllck51bSBnZXRFbmRMYXllck51bSgpIGNvbnN0IHsKLSAgICAvLyAgcmV0dXJuIGVuZExheWVyTnVtOwotICAgIC8vfQotICAgIC8vZnJDb3N0IGdldENvc3QoKSBjb25zdCB7Ci0gICAgLy8gIHJldHVybiBBUENvc3Q7Ci0gICAgLy99Ci0gICAgLy9mckxpc3Q8ZnJQYXRoU2VnPiYgZ2V0UGF0aFNlZ3MoKSB7Ci0gICAgLy8gIHJldHVybiBwYXRoc2VnczsKLSAgICAvL30KLSAgICAvL2NvbnN0IGZyTGlzdDxmclBhdGhTZWc+JiBnZXRQYXRoU2VncygpIGNvbnN0IHsKLSAgICAvLyAgcmV0dXJuIHBhdGhzZWdzOwotICAgIC8vfQotICAgIC8vZnJMaXN0PGZyVmlhPiYgZ2V0VmlhcygpIHsKLSAgICAvLyAgcmV0dXJuIHZpYXM7Ci0gICAgLy99Ci0gICAgLy9jb25zdCBmckxpc3Q8ZnJWaWE+JiBnZXRWaWFzKCkgY29uc3QgewotICAgIC8vICByZXR1cm4gdmlhczsKLSAgICAvL30KLSAgICBmclBpbiogZ2V0UGluKCkgY29uc3QgewotICAgICAgcmV0dXJuIHBpbjsKLSAgICB9Ci0gICAgZnJOZXQqIGdldE5ldCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBuZXQ7Ci0gICAgfQotICAgIGNvbnN0IHN0ZDo6c2V0PGZySW5zdCo+JiBnZXRJbnN0cygpIGNvbnN0IHsKLSAgICAgIHJldHVybiBpbnN0czsKLSAgICB9Ci0gICAgc3RkOjpzZXQ8ZnJJbnN0Kj4mIGdldEluc3RzKCkgewotICAgICAgcmV0dXJuIGluc3RzOwotICAgIH0KLQotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGJvb2w+JiBnZXRWYWxpZEFjY2VzcygpIGNvbnN0IHsKLSAgICAgIHJldHVybiB2YWxpZEFjY2VzczsKLSAgICB9Ci0gICAgc3RkOjp2ZWN0b3I8Ym9vbD4mIGdldFZhbGlkQWNjZXNzKCkgewotICAgICAgcmV0dXJuIHZhbGlkQWNjZXNzOwotICAgIH0KLQotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGZyVmlhRGVmKj4gPiYgZ2V0QWNjZXNzVmlhRGVmcygpIGNvbnN0IHsKLSAgICAgIHJldHVybiBhY2Nlc3NWaWFEZWZzOwotICAgIH0KLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxmclZpYURlZio+ID4mIGdldEFjY2Vzc1ZpYURlZnMoKSB7Ci0gICAgICByZXR1cm4gYWNjZXNzVmlhRGVmczsKLSAgICB9Ci0KLSAgICBpbnQgZ2V0Q29zdCgpIHsKLSAgICAgIHJldHVybiBhcENvc3Q7Ci0gICAgfQotCi0gICAgZnJDb29yZCBnZXROZWFyZXN0QVBEaXN0KCkgewotICAgICAgcmV0dXJuIG5lYXJlc3RBUERpc3Q7Ci0gICAgfQotCi0gICAgYm9vbCBoYXNJbnN0KGZySW5zdCogaW5zdCkgY29uc3QgewotICAgICAgcmV0dXJuICghKGluc3RzLmZpbmQoaW5zdCkgPT0gaW5zdHMuZW5kKCkpKTsKLSAgICB9Ci0KLSAgICBib29sIGhhc1ZhbGlkQWNjZXNzKGNvbnN0IGZyRGlyRW51bSAmZGlyKSB7Ci0gICAgICBzd2l0Y2ggKGRpcikgewotICAgICAgICBjYXNlIChmckRpckVudW06OkUpOgotICAgICAgICAgIHJldHVybiB2YWxpZEFjY2Vzc1swXTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAoZnJEaXJFbnVtOjpTKToKLSAgICAgICAgICByZXR1cm4gdmFsaWRBY2Nlc3NbMV07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgKGZyRGlyRW51bTo6Vyk6Ci0gICAgICAgICAgcmV0dXJuIHZhbGlkQWNjZXNzWzJdOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIChmckRpckVudW06Ok4pOgotICAgICAgICAgIHJldHVybiB2YWxpZEFjY2Vzc1szXTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAoZnJEaXJFbnVtOjpVKToKLSAgICAgICAgICByZXR1cm4gdmFsaWRBY2Nlc3NbNF07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgKGZyRGlyRW51bTo6RCk6Ci0gICAgICAgICAgcmV0dXJuIHZhbGlkQWNjZXNzWzVdOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBib29sIGhhc1ZhbGlkQWNjZXNzKCkgewotICAgICAgcmV0dXJuICh2YWxpZEFjY2Vzc1swXSB8fCB2YWxpZEFjY2Vzc1sxXSB8fCB2YWxpZEFjY2Vzc1syXSB8fCB2YWxpZEFjY2Vzc1szXSB8fCB2YWxpZEFjY2Vzc1s0XSB8fCB2YWxpZEFjY2Vzc1s1XSk7Ci0gICAgfQotCi0gICAgLy8gZnJWaWFEZWYqIGdldEFjY2Vzc1ZpYURlZihjb25zdCBmckRpckVudW0gJmRpcikgewotICAgIC8vICAgaWYgKGRpciA9PSAgZnJEaXJFbnVtOjpVKSB7Ci0gICAgLy8gICAgIHJldHVybiBhY2Nlc3NWaWFEZWZzWzBdOwotICAgIC8vICAgfSBlbHNlIGlmIChkaXIgPT0gZnJEaXJFbnVtOjpEKSB7Ci0gICAgLy8gICAgIHJldHVybiBhY2Nlc3NWaWFEZWZzWzFdOwotICAgIC8vICAgfSBlbHNlIHsKLSAgICAvLyAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgLy8gICB9Ci0gICAgLy8gfQotICAgIGJvb2wgaXNDb25mbGljdCgpIHsKLSAgICAgIHJldHVybiBjb25mbGljdDsKLSAgICB9Ci0KLSAgICBib29sIGlzUHJlZmVycmVkKCkgewotICAgICAgcmV0dXJuIHByZWZlcnJlZDsKLSAgICB9Ci0KLSAgICBzdGQ6OnZlY3RvcjxmclZpYURlZio+JiBnZXRBY2Nlc3NWaWFEZWYoY29uc3QgZnJEaXJFbnVtICZkaXIpIHsKLSAgICAgIGlmIChkaXIgPT0gZnJEaXJFbnVtOjpVKSB7Ci0gICAgICAgIHJldHVybiBhY2Nlc3NWaWFEZWZzWzBdOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGFjY2Vzc1ZpYURlZnNbMV07Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGZyVmlhRGVmKj4mIGdldEFjY2Vzc1ZpYURlZihjb25zdCBmckRpckVudW0gJmRpcikgY29uc3QgewotICAgICAgaWYgKGRpciA9PSBmckRpckVudW06OlUpIHsKLSAgICAgICAgcmV0dXJuIGFjY2Vzc1ZpYURlZnNbMF07Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gYWNjZXNzVmlhRGVmc1sxXTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBzZXR0ZXJzCi0gICAgdm9pZCBzZXRQb2ludHMoY29uc3QgZnJQb2ludCAmYnBJbiwgY29uc3QgZnJQb2ludCAmZXBJbikgewotICAgICAgYmVnaW5Qb2ludC5zZXQoYnBJbik7Ci0gICAgICAvL2VuZFBvaW50LnNldChlcEluKTsKLSAgICB9Ci0gICAgdm9pZCBzZXRCZWdpbkxheWVyTnVtKGZyTGF5ZXJOdW0gaW4pIHsKLSAgICAgIGJlZ2luTGF5ZXJOdW0gPSBpbjsKLSAgICB9Ci0gICAgLy92b2lkIHNldEVuZExheWVyTnVtKGZyTGF5ZXJOdW0gaW4pIHsKLSAgICAvLyAgZW5kTGF5ZXJOdW0gPSBpbjsKLSAgICAvL30KLSAgICAvL3ZvaWQgc2V0Q29zdChmckNvc3QgaW4pIHsKLSAgICAvLyAgQVBDb3N0ID0gaW47Ci0gICAgLy99Ci0KLSAgICB2b2lkIHNldFZhbGlkQWNjZXNzKGNvbnN0IGZyRGlyRW51bSAmZGlyLCBjb25zdCBib29sIGlzVmFsaWQpIHsKLSAgICAgIHN3aXRjaCAoZGlyKSB7Ci0gICAgICAgIGNhc2UgKGZyRGlyRW51bTo6RSk6Ci0gICAgICAgICAgdmFsaWRBY2Nlc3NbMF0gPSBpc1ZhbGlkOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIChmckRpckVudW06OlMpOgotICAgICAgICAgIHZhbGlkQWNjZXNzWzFdID0gaXNWYWxpZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAoZnJEaXJFbnVtOjpXKToKLSAgICAgICAgICB2YWxpZEFjY2Vzc1syXSA9IGlzVmFsaWQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgKGZyRGlyRW51bTo6Tik6Ci0gICAgICAgICAgdmFsaWRBY2Nlc3NbM10gPSBpc1ZhbGlkOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIChmckRpckVudW06OlUpOgotICAgICAgICAgIHZhbGlkQWNjZXNzWzRdID0gaXNWYWxpZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAoZnJEaXJFbnVtOjpEKToKLSAgICAgICAgICB2YWxpZEFjY2Vzc1s1XSA9IGlzVmFsaWQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgc3RkOjpjb3V0IDw8ICJFcnJvcjogdW5leHBlY3RlZCBkaXJlY3Rpb24gaW4gc2V0VmFsaWRBY2Nlc3NcbiI7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gdm9pZCBzZXRBY2Nlc3NWaWFEZWYoY29uc3QgZnJEaXJFbnVtIGRpciwgZnJWaWFEZWYgKnZpYURlZikgewotICAgIC8vICAgaWYgKGRpciA9PSBmckRpckVudW06OlUpIHsKLSAgICAvLyAgICAgYWNjZXNzVmlhRGVmc1swXSA9IHZpYURlZjsKLSAgICAvLyAgIH0gZWxzZSBpZiAoZGlyID09IGZyRGlyRW51bTo6RCkgewotICAgIC8vICAgICBhY2Nlc3NWaWFEZWZzWzFdID0gdmlhRGVmOwotICAgIC8vICAgfSBlbHNlIHsKLSAgICAvLyAgICAgc3RkOjpjb3V0IDw8ICJFcnJvcjogdW5leHBlY3RlZCBkaXJlY3Rpb24gaW4gc2V0QWNjZXNzVmlhXG4iOwotICAgIC8vICAgfQotICAgIC8vIH0KLQotICAgIHZvaWQgYWRkQWNjZXNzVmlhRGVmKGNvbnN0IGZyRGlyRW51bSBkaXIsIGZyVmlhRGVmICp2aWFEZWYpIHsKLSAgICAgIGlmIChkaXIgPT0gZnJEaXJFbnVtOjpVKSB7Ci0gICAgICAgIGFjY2Vzc1ZpYURlZnNbMF0ucHVzaF9iYWNrKHZpYURlZik7Ci0gICAgICB9IGVsc2UgaWYgKGRpciA9PSBmckRpckVudW06OkQpIHsKLSAgICAgICAgYWNjZXNzVmlhRGVmc1sxXS5wdXNoX2JhY2sodmlhRGVmKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCAiRXJyb3I6IHVuZXhwZWN0ZWQgZGlyZWN0aW9uIGluIGFkZEFjY2Vzc1ZpYURlZlxuIjsKLSAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8vZnJMaXN0SXRlcjxmclBhdGhTZWc+IGFkZFBhdGhTZWcoY29uc3QgZnJQYXRoU2VnICZpbikgewotICAgIC8vICBwYXRoc2Vncy5wdXNoX2JhY2soaW4pOwotICAgIC8vICByZXR1cm4gKC0tcGF0aHNlZ3MuZW5kKCkpOwotICAgIC8vfQotICAgIC8vdm9pZCByZW1vdmVQYXRoU2VnKGZyTGlzdEl0ZXI8ZnJQYXRoU2VnPiAmaW4pOwotICAgIC8vZnJMaXN0SXRlcjxmclZpYT4gYWRkVmlhKGNvbnN0IGZyVmlhICZpbikgezsKLSAgICAvLyAgdmlhcy5wdXNoX2JhY2soaW4pOwotICAgIC8vICByZXR1cm4gKC0tdmlhcy5lbmQoKSk7Ci0gICAgLy99Ci0gICAgLy92b2lkIHJlbW92ZVZpYShmckxpc3RJdGVyPGZyVmlhPiAmaW4pOwotICAgIHZvaWQgYWRkVG9QaW4oZnJQaW4qIGluKSB7Ci0gICAgICBwaW4gPSBpbjsKLSAgICB9Ci0gICAgdm9pZCBhZGRUb05ldChmck5ldCogaW4pIHsKLSAgICAgIG5ldCA9IGluOwotICAgIH0KLSAgICB2b2lkIGFkZEluc3QoZnJJbnN0ICppbnN0KSB7Ci0gICAgICBpbnN0cy5pbnNlcnQoaW5zdCk7Ci0gICAgfQotICAgIHZvaWQgYWRkSW5zdHMoY29uc3Qgc3RkOjpzZXQ8ZnJJbnN0Kj4gJmluc3RzSW4pIHsKLSAgICAgIGluc3RzLmluc2VydChpbnN0c0luLmJlZ2luKCksIGluc3RzSW4uZW5kKCkpOwotICAgIH0KLSAgICB2aXJ0dWFsIGZyQmxvY2tPYmplY3RFbnVtIHR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiBmcmNBY2Nlc3NQYXR0ZXJuOwotICAgIH0KLSAgICB2b2lkIHNldENvc3QoaW50IGluKSB7Ci0gICAgICBhcENvc3QgPSBpbjsKLSAgICB9Ci0gICAgdm9pZCBzZXROZWFyZXN0QVBEaXN0KGZyQ29vcmQgaW4pIHsKLSAgICAgIG5lYXJlc3RBUERpc3QgPSBpbjsKLSAgICB9Ci0gICAgdm9pZCBzZXRDb25mbGljdChib29sIGluKSB7Ci0gICAgICBjb25mbGljdCA9IGluOwotICAgIH0KLSAgICB2b2lkIHNldFByZWZlcnJlZChib29sIGluKSB7Ci0gICAgICBwcmVmZXJyZWQgPSBpbjsKLSAgICB9Ci0KLSAgcHJvdGVjdGVkOgotICAgIGZyUG9pbnQgYmVnaW5Qb2ludDsKLSAgICBmckxheWVyTnVtIGJlZ2luTGF5ZXJOdW07Ci0gICAgZnJQaW4qIHBpbjsKLSAgICBmck5ldCogbmV0OwotICAgIHN0ZDo6c2V0PGZySW5zdCo+ICAgIGluc3RzOwotICAgIHN0ZDo6dmVjdG9yPGJvb2w+IHZhbGlkQWNjZXNzOyAvLyAwID0gRSwgMSA9IFMsIDIgPSBXLCAzID0gTiwgNCA9IFUsIDUgPSBECi0gICAgLy8gc3RkOjp2ZWN0b3I8ZnJWaWFEZWYqPiBhY2Nlc3NWaWFEZWZzOyAvLyAwID0gVSwgMSA9IEQKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxmclZpYURlZio+ID4gYWNjZXNzVmlhRGVmczsKLSAgICBpbnQgYXBDb3N0OwotICAgIGZyQ29vcmQgbmVhcmVzdEFQRGlzdDsKLSAgICBib29sIGNvbmZsaWN0LCBwcmVmZXJyZWQ7Ci0gIH07Ci0KLSAgc3RydWN0IEFQQ29tcCB7Ci0gICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxGbGV4QWNjZXNzUGF0dGVybj4gJmEsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxGbGV4QWNjZXNzUGF0dGVybj4gJmIpIHsKLSAgICAgIGlmIChhLT5pc1ByZWZlcnJlZCgpICYmICFiLT5pc1ByZWZlcnJlZCgpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfSBlbHNlIGlmICghYS0+aXNQcmVmZXJyZWQoKSAmJiBiLT5pc1ByZWZlcnJlZCgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghYS0+aXNDb25mbGljdCgpICYmIGItPmlzQ29uZmxpY3QoKSkgewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKGEtPmlzQ29uZmxpY3QoKSAmJiAhYi0+aXNDb25mbGljdCgpKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJldHVybiAoYS5nZXQoKSA8IGIuZ2V0KCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9OwotfQotCi0KLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL0ZsZXhSb3V0ZS5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9GbGV4Um91dGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTllYjcwLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL0ZsZXhSb3V0ZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyogQXV0aG9yczogTHV0b25nIFdhbmcgYW5kIEJhbmdxaSBYdSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImdsb2JhbC5oIgotI2luY2x1ZGUgIkZsZXhSb3V0ZS5oIgotI2luY2x1ZGUgImlvL2lvLmgiCi0jaW5jbHVkZSAidGEvRmxleFRBLmgiCi0jaW5jbHVkZSAiZHIvRmxleERSLmgiCi0jaW5jbHVkZSAiaW8vZnJQaW5QcmVwLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgZnI7Ci0KLXZvaWQgRmxleFJvdXRlOjppbml0KCkgewotICBpbzo6UGFyc2VyIHBhcnNlcihnZXREZXNpZ24oKSk7Ci0gIHBhcnNlci5yZWFkTGVmRGVmKCk7Ci0gIHBhcnNlci5yZWFkR3VpZGUoKTsKLSAgcGFyc2VyLnBvc3RQcm9jZXNzKCk7Ci0gIC8vIGdldCBhY2Nlc3MgcGF0dGVybiBmb3IgcG9zdCBwcm9jZXNzCi0gIEZsZXhQaW5QcmVwIHBwKGdldERlc2lnbigpLT5nZXRUZWNoKCksIGdldERlc2lnbigpLCBwYXJzZXIuZ2V0UHJlZlRyYWNrUGF0dGVybnMoKSwgcGFyc2VyLmdldFRyYWNrT2Zmc2V0TWFwKCkpOwotICBwcC5yZXBvcnRQaW5Mb2MoKTsKLSAgZXhpdCgwKTsKLSAgcHAuaW5pdCgpOwotICBwcC5tYWluKCk7Ci0gIHN0ZDo6Y291dCA8PCAiZmluaXNoZWQgcGluUHJlcFxuIiA8PCBzdGQ6OmZsdXNoOwotICBwYXJzZXIucG9zdFByb2Nlc3NHdWlkZSgpOwotICAvL3BhcnNlci5idWlsZFJ0cmVlNFJvdXRlcygpOwotICAvL3BhcnNlci5idWlsZFJ0cmVlNEluc3RzKCk7Ci0gIC8vZXhpdCgwKTsKLX0KLQotdm9pZCBGbGV4Um91dGU6OnRhKCkgewotICBGbGV4VEEgdGEoZ2V0RGVzaWduKCkpOwotICB0YS5tYWluKCk7Ci19Ci0KLXZvaWQgRmxleFJvdXRlOjpkcigpIHsKLSAgRmxleERSIGRyKGdldERlc2lnbigpKTsKLSAgZHIubWFpbigpOwotfQotCi12b2lkIEZsZXhSb3V0ZTo6ZW5kRlIoKSB7Ci0gIGlvOjpXcml0ZXIgd3JpdGVyKGdldERlc2lnbigpKTsKLSAgd3JpdGVyLndyaXRlRnJvbVRBKCk7Ci0gIHdyaXRlci53cml0ZUZyb21EUigpOwotfQotCi1pbnQgRmxleFJvdXRlOjptYWluKCkgewotICBpbml0KCk7Ci0gIHRhKCk7Ci0gIGRyKCk7Ci0gIGVuZEZSKCk7Ci0KLQotICAvKgotICAvLyBydHJlZSB0ZXN0Ci0gIHZlY3RvcjxydHJlZV9mckNvbm5GaWdfdmFsdWVfdD4gcmVzdWx0MTsKLSAgZGVzaWduLT5nZXRUb3BCbG9jaygpLT5xdWVyeVJ0cmVlNFJvdXRlcyhmckJveCg1ODUwMDAsIDEwOTgwMDAsIDU5MDAwMCwgMTEwMTAwMCksIDYsIHJlc3VsdDEpOwotICBjb3V0IDw8ZW5kbCA8PCJxdWVyeTE6IiA8PGVuZGw7Ci0gIGZvciAoYXV0byAmaXQ6IHJlc3VsdDEpIHsKLSAgICBpZiAoaXQuc2Vjb25kLT50eXBlSWQoKSA9PSBmcmNQYXRoU2VnKSB7Ci0gICAgICBmclBvaW50IHB0MSwgcHQyOwotICAgICAgZHluYW1pY19wb2ludGVyX2Nhc3Q8ZnJQYXRoU2VnPihpdC5zZWNvbmQpLT5nZXRQb2ludHMocHQxLCBwdDIpOwotICAgICAgY291dCA8PCJmb3VuZCBwYXRoc2VnICIgPDxwdDEueCgpIDw8IiAiIDw8cHQxLnkoKSA8PCIgIiA8PCBwdDIueCgpIDw8IiAiIDw8cHQyLnkoKSAKLSAgICAgICAgICAgPDwiICIgPDxkeW5hbWljX3BvaW50ZXJfY2FzdDxmclBhdGhTZWc+KGl0LnNlY29uZCktPmdldE5ldCgpLT5nZXROYW1lKCkgPDxlbmRsOwotICAgIH0gZWxzZSBpZiAoaXQuc2Vjb25kLT50eXBlSWQoKSA9PSBmcmNHdWlkZSkgewotICAgICAgZnJQb2ludCBwdDEsIHB0MjsKLSAgICAgIGR5bmFtaWNfcG9pbnRlcl9jYXN0PGZyR3VpZGU+KGl0LnNlY29uZCktPmdldFBvaW50cyhwdDEsIHB0Mik7Ci0gICAgICBjb3V0IDw8ImZvdW5kIGd1aWRlICAgIiA8PHB0MS54KCkgPDwiICIgPDxwdDEueSgpIDw8IiAiIDw8IHB0Mi54KCkgPDwiICIgPDxwdDIueSgpCi0gICAgICAgICAgIDw8IiAiIDw8ZHluYW1pY19wb2ludGVyX2Nhc3Q8ZnJHdWlkZT4oaXQuc2Vjb25kKS0+Z2V0TmV0KCktPmdldE5hbWUoKTsKLSAgICAgIGlmIChkeW5hbWljX3BvaW50ZXJfY2FzdDxmckd1aWRlPihpdC5zZWNvbmQpLT5nZXRCZWdpbkxheWVyTnVtKCkgIT0KLSAgICAgICAgICBkeW5hbWljX3BvaW50ZXJfY2FzdDxmckd1aWRlPihpdC5zZWNvbmQpLT5nZXRFbmRMYXllck51bSgpKSB7Ci0gICAgICAgIGNvdXQgPDwiIHZpYSBndWlkZSI7Ci0gICAgICB9Ci0gICAgICBjb3V0IDw8ZW5kbDsKLSAgICB9Ci0gIH0KLSAgZXhpdCgwKTsKLSAgKi8KLSAgcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL0ZsZXhSb3V0ZS5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvRmxleFJvdXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZWMyZjUuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvRmxleFJvdXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIF9GTEVYUk9VVEVfSF8KLSNkZWZpbmUgX0ZMRVhST1VURV9IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgImZyQmFzZVR5cGVzLmgiCi0jaW5jbHVkZSAiZnJEZXNpZ24uaCIKLQotbmFtZXNwYWNlIGZyIHsKLSAgY2xhc3MgRmxleFJvdXRlIHsKLSAgcHVibGljOgotICAgIEZsZXhSb3V0ZSgpOiBkZXNpZ24oc3RkOjptYWtlX3VuaXF1ZTxmckRlc2lnbj4oKSkge30KLSAgICBmckRlc2lnbiogZ2V0RGVzaWduKCkgY29uc3QgewotICAgICAgcmV0dXJuIGRlc2lnbi5nZXQoKTsKLSAgICB9Ci0gICAgaW50IG1haW4oKTsKLSAgcHJvdGVjdGVkOgotICAgIHN0ZDo6dW5pcXVlX3B0cjxmckRlc2lnbj4gZGVzaWduOwotICAKLSAgICB2b2lkIGluaXQoKTsKLSAgICAvL3ZvaWQgcGluUHJlcCgpOwotICAgIHZvaWQgdGEoKTsKLSAgICB2b2lkIGRyKCk7Ci0gICAgdm9pZCBlbmRGUigpOwotICB9OwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9NYWtlZmlsZSBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTZjODZhLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyBzdWJkaXIgYW5kIG9iamVjdHMgaW4gY3VycmVudCBkaXIKLSNTVUJESVJTCT0gZGIgaW8gdGEgZHIgZHJjCi1TVUJESVJTCT0gZGIgaW8gdGEgZHIgZHJjCi0jT0JKRUNUUwk9IG1haW4ubwotU1JDX0RJUiA6PSAuCi1TUkNfRklMRVMgOj0gJCh3aWxkY2FyZCAkKFNSQ19ESVIpLyouY3BwKQotT0JKRUNUUyA9ICQocGF0c3Vic3QgJChTUkNfRElSKS8lLmNwcCwgJChTUkNfRElSKS8lLm8sICQoU1JDX0ZJTEVTKSkKLQotCi1hbGw6c3ViZGlycyAke09CSkVDVFN9Ci0KLQkKLWNsZWFuOmNsZWFuc3ViZGlycwotCXJtIC1mICR7T0JKRUNUU30KLQkKLWluY2x1ZGUgJHtNQUtFSU5DTFVERX0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL01ha2VmaWxlIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZTgzMDcuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIHN1YmRpciBhbmQgb2JqZWN0cyBpbiBjdXJyZW50IGRpcgotU1VCRElSUwk9IGluZnJhIG9iaiB0ZWNoIGRyT2JqIHRhT2JqCi1PQkpFQ1RTCT0gCi0KLQotYWxsOnN1YmRpcnMgJHtPQkpFQ1RTfQotCi0JCi1jbGVhbjpjbGVhbnN1YmRpcnMKLQlybSAtZiAke09CSkVDVFN9Ci0JCi1pbmNsdWRlICR7TUFLRUlOQ0xVREV9CmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9kck9iai9NYWtlZmlsZSBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL2RyT2JqL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzNhYTI1Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL2RyT2JqL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyBzdWJkaXIgYW5kIG9iamVjdHMgaW4gY3VycmVudCBkaXIKLVNVQkRJUlMJPSAKLU9CSkVDVFMJPSBkclNoYXBlLm8gZHJWaWEubwotI09CSkVDVFMJPSAKLQotCi1hbGw6c3ViZGlycyAke09CSkVDVFN9Ci0KLQkKLWNsZWFuOmNsZWFuc3ViZGlycwotCXJtIC1mICR7T0JKRUNUU30KLQkKLWluY2x1ZGUgJHtNQUtFSU5DTFVERX0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL2RyT2JqL2RyQWNjZXNzUGF0dGVybi5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvZHJPYmovZHJBY2Nlc3NQYXR0ZXJuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlOTUyMzIuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvZHJPYmovZHJBY2Nlc3NQYXR0ZXJuLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyogQXV0aG9yczogTHV0b25nIFdhbmcgYW5kIEJhbmdxaSBYdSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBfRFJfQUNDRVNTX1BBVFRFUk5fSAotI2RlZmluZSBfRFJfQUNDRVNTX1BBVFRFUk5fSAotCi0jaW5jbHVkZSAiZGIvZHJPYmovZHJCbG9ja09iamVjdC5oIgotI2luY2x1ZGUgImRyL0ZsZXhNYXplVHlwZXMuaCIKLQotbmFtZXNwYWNlIGZyIHsKLSAgY2xhc3MgZHJQaW47Ci0gIGNsYXNzIGZyVmlhRGVmOwotICBjbGFzcyBkckFjY2Vzc1BhdHRlcm46IHB1YmxpYyBkckJsb2NrT2JqZWN0IHsKLSAgcHVibGljOgotICAgIGRyQWNjZXNzUGF0dGVybigpOiBiZWdpblBvaW50KCksIGJlZ2luTGF5ZXJOdW0oMCksIHBpbihudWxscHRyKSwgdmFsaWRBY2Nlc3Moc3RkOjp2ZWN0b3I8Ym9vbD4oNiwgdHJ1ZSkpLAotICAgICAgICAgICAgICAgICAgICAgICB2VShudWxscHRyKSwgdkQobnVsbHB0ciksIHZVSWR4KDApLCB2RElkeCgwKSB7fQotICAgIC8vIGdldHRlcnMKLSAgICB2b2lkIGdldFBvaW50KGZyUG9pbnQgJmJwSW4pIGNvbnN0IHsKLSAgICAgIGJwSW4uc2V0KGJlZ2luUG9pbnQpOwotICAgIH0KLSAgICBmckxheWVyTnVtIGdldEJlZ2luTGF5ZXJOdW0oKSBjb25zdCB7Ci0gICAgICByZXR1cm4gYmVnaW5MYXllck51bTsKLSAgICB9Ci0gICAgZHJQaW4qIGdldFBpbigpIGNvbnN0IHsKLSAgICAgIHJldHVybiBwaW47Ci0gICAgfQotICAgIGJvb2wgaGFzTWF6ZUlkeCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiAoIW1hemVJZHguZW1wdHkoKSk7Ci0gICAgfQotICAgIEZsZXhNYXplSWR4JiBnZXRNYXplSWR4KCkgewotICAgICAgcmV0dXJuIG1hemVJZHg7Ci0gICAgfQotICAgIHZvaWQgZ2V0TWF6ZUlkeChGbGV4TWF6ZUlkeCAmaW4pIGNvbnN0IHsKLSAgICAgIGluLnNldChtYXplSWR4KTsKLSAgICB9Ci0gICAgYm9vbCBoYXNWYWxpZEFjY2Vzcyhjb25zdCBmckRpckVudW0gJmRpcikgewotICAgICAgc3dpdGNoIChkaXIpIHsKLSAgICAgICAgY2FzZSAoZnJEaXJFbnVtOjpFKToKLSAgICAgICAgICByZXR1cm4gdmFsaWRBY2Nlc3NbMF07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgKGZyRGlyRW51bTo6Uyk6Ci0gICAgICAgICAgcmV0dXJuIHZhbGlkQWNjZXNzWzFdOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIChmckRpckVudW06OlcpOgotICAgICAgICAgIHJldHVybiB2YWxpZEFjY2Vzc1syXTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAoZnJEaXJFbnVtOjpOKToKLSAgICAgICAgICByZXR1cm4gdmFsaWRBY2Nlc3NbM107Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgKGZyRGlyRW51bTo6VSk6Ci0gICAgICAgICAgcmV0dXJuIHZhbGlkQWNjZXNzWzRdOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIChmckRpckVudW06OkQpOgotICAgICAgICAgIHJldHVybiB2YWxpZEFjY2Vzc1s1XTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIGJvb2wgaGFzQWNjZXNzVmlhRGVmKGNvbnN0IGZyRGlyRW51bSAmZGlyID0gZnJEaXJFbnVtOjpVKSB7Ci0gICAgICBpZiAoZGlyID09ICBmckRpckVudW06OlUpIHsKLSAgICAgICAgcmV0dXJuICEodlUgPT0gbnVsbHB0cik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gISh2RCA9PSBudWxscHRyKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZnJWaWFEZWYqIGdldEFjY2Vzc1ZpYURlZihjb25zdCBmckRpckVudW0gJmRpciA9IGZyRGlyRW51bTo6VSkgewotICAgICAgaWYgKGRpciA9PSAgZnJEaXJFbnVtOjpVKSB7Ci0gICAgICAgIHJldHVybiAoKnZVKVt2VUlkeF07Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gKCp2RClbdkRJZHhdOwotICAgICAgfQotICAgIH0KLSAgICBib29sIG5leHRBY2Nlc3NWaWFEZWYoY29uc3QgZnJEaXJFbnVtICZkaXIgPSBmckRpckVudW06OlUpIHsKLSAgICAgIGJvb2wgc29sID0gdHJ1ZTsKLSAgICAgIGlmIChkaXIgPT0gIGZyRGlyRW51bTo6VSkgewotICAgICAgICBpZiAoKCp2VSkuc2l6ZSgpID09IDEpIHsKLSAgICAgICAgICBzb2wgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICArK3ZVSWR4OwotICAgICAgICAgIGlmICh2VUlkeCA+PSAoaW50KSgqdlUpLnNpemUoKSkgewotICAgICAgICAgICAgdlVJZHggLT0gKGludCkoKnZVKS5zaXplKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoKCp2RCkuc2l6ZSgpID09IDEpIHsKLSAgICAgICAgICBzb2wgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICArK3ZESWR4OwotICAgICAgICAgIGlmICh2RElkeCA+PSAoaW50KSgqdkQpLnNpemUoKSkgewotICAgICAgICAgICAgdkRJZHggLT0gKGludCkoKnZEKS5zaXplKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc29sOwotICAgIH0KLSAgICBib29sIHByZXZBY2Nlc3NWaWFEZWYoY29uc3QgZnJEaXJFbnVtICZkaXIgPSBmckRpckVudW06OlUpIHsKLSAgICAgIGJvb2wgc29sID0gdHJ1ZTsKLSAgICAgIGlmIChkaXIgPT0gIGZyRGlyRW51bTo6VSkgewotICAgICAgICBpZiAoKCp2VSkuc2l6ZSgpID09IDEpIHsKLSAgICAgICAgICBzb2wgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAtLXZVSWR4OwotICAgICAgICAgIGlmICh2VUlkeCA8IDApIHsKLSAgICAgICAgICAgIHZVSWR4ICs9IChpbnQpKCp2VSkuc2l6ZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCgqdkQpLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgc29sID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLS12RElkeDsKLSAgICAgICAgICBpZiAodkRJZHggPCAwKSB7Ci0gICAgICAgICAgICB2RElkeCArPSAoaW50KSgqdkQpLnNpemUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBzb2w7Ci0gICAgfQotICAgIC8vIHNldHRlcnMKLSAgICB2b2lkIHNldFBvaW50KGNvbnN0IGZyUG9pbnQgJmJwSW4pIHsKLSAgICAgIGJlZ2luUG9pbnQuc2V0KGJwSW4pOwotICAgIH0KLSAgICB2b2lkIHNldEJlZ2luTGF5ZXJOdW0oZnJMYXllck51bSBpbikgewotICAgICAgYmVnaW5MYXllck51bSA9IGluOwotICAgIH0KLSAgICB2b2lkIHNldE1hemVJZHgoY29uc3QgRmxleE1hemVJZHggJmluKSB7Ci0gICAgICBtYXplSWR4LnNldChpbik7Ci0gICAgfQotICAgIHZvaWQgc2V0UGluKGRyUGluKiBpbikgewotICAgICAgcGluID0gaW47Ci0gICAgfQotICAgIHZvaWQgc2V0VmFsaWRBY2Nlc3MoY29uc3Qgc3RkOjp2ZWN0b3I8Ym9vbD4gJmluKSB7Ci0gICAgICB2YWxpZEFjY2VzcyA9IGluOwotICAgIH0KLQotICAgIHZvaWQgc2V0QWNjZXNzVmlhRGVmKGNvbnN0IGZyRGlyRW51bSBkaXIsIHN0ZDo6dmVjdG9yPGZyVmlhRGVmKj4qIHZpYURlZikgewotICAgICAgaWYgKGRpciA9PSBmckRpckVudW06OlUpIHsKLSAgICAgICAgdlUgPSB2aWFEZWY7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB2RCA9IHZpYURlZjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBvdGhlcnMKLSAgICBmckJsb2NrT2JqZWN0RW51bSB0eXBlSWQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gZHJjQWNjZXNzUGF0dGVybjsKLSAgICB9Ci0KLSAgcHJvdGVjdGVkOgotICAgIGZyUG9pbnQgICAgICAgICAgICAgICAgIGJlZ2luUG9pbnQ7Ci0gICAgZnJMYXllck51bSAgICAgICAgICAgICAgYmVnaW5MYXllck51bTsKLSAgICBGbGV4TWF6ZUlkeCAgICAgICAgICAgICBtYXplSWR4OwotICAgIGRyUGluKiAgICAgICAgICAgICAgICAgIHBpbjsKLSAgICBzdGQ6OnZlY3Rvcjxib29sPiAgICAgICB2YWxpZEFjY2VzczsKLSAgICBzdGQ6OnZlY3RvcjxmclZpYURlZio+KiB2VTsKLSAgICBzdGQ6OnZlY3RvcjxmclZpYURlZio+KiB2RDsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICB2VUlkeDsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICB2RElkeDsKLSAgfTsKLX0KLQotCi0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9kck9iai9kckJsb2NrT2JqZWN0LmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9kck9iai9kckJsb2NrT2JqZWN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZWQ0N2MuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvZHJPYmovZHJCbG9ja09iamVjdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyogQXV0aG9yczogTHV0b25nIFdhbmcgYW5kIEJhbmdxaSBYdSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBfRFJfQkxPQ0tPQkpFQ1RfSF8KLSNkZWZpbmUgX0RSX0JMT0NLT0JKRUNUX0hfCi0KLSNpbmNsdWRlICJmckJhc2VUeXBlcy5oIgotI2luY2x1ZGUgImRiL29iai9mckJsb2NrT2JqZWN0LmgiCi0KLW5hbWVzcGFjZSBmciB7Ci0gIGNsYXNzIGRyQmxvY2tPYmplY3Q6IHB1YmxpYyBmckJsb2NrT2JqZWN0IHsKLSAgcHVibGljOgotICAgIC8vIGNvbnN0cnVjdG9ycwotICAgIGRyQmxvY2tPYmplY3QoKSB7fQotICAgIHZpcnR1YWwgfmRyQmxvY2tPYmplY3QoKSB7fQotICAgIC8vIGdldHRlcnMKLSAgICAvLyBzZXR0ZXJzCi0gICAgLy8gb3RoZXJzCi0gICAgZnJCbG9ja09iamVjdEVudW0gdHlwZUlkKCkgY29uc3QgewotICAgICAgcmV0dXJuIGRyY0Jsb2NrT2JqZWN0OwotICAgIH0KLSAgcHJvdGVjdGVkOgotCi0gIH07Ci19Ci0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9kck9iai9kckZpZy5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvZHJPYmovZHJGaWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEzMDY3NS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9kck9iai9kckZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX0RSX0ZJR19IXwotI2RlZmluZSBfRFJfRklHX0hfCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSAiZGIvZHJPYmovZHJCbG9ja09iamVjdC5oIgotI2luY2x1ZGUgImRiL2luZnJhL2ZyQm94LmgiCi0jaW5jbHVkZSAiZGIvaW5mcmEvZnJUcmFuc2Zvcm0uaCIKLQotbmFtZXNwYWNlIGZyIHsKLSAgY2xhc3MgZHJGaWc6IHB1YmxpYyBkckJsb2NrT2JqZWN0IHsKLSAgcHVibGljOgotICAgIC8vIGNvbnN0cnVjdG9ycwotICAgIGRyRmlnKCk6IGRyQmxvY2tPYmplY3QoKSB7fQotICAgIC8vIGdldHRlcnMKLSAgICB2aXJ0dWFsIHZvaWQgZ2V0QkJveChmckJveCAmYm94KSBjb25zdCA9IDA7Ci0gICAgLy92aXJ0dWFsIHZvaWQgZ2V0QkJveChib3hfdCAmYm94KSBjb25zdCA9IDA7Ci0gICAgLy8gc2V0dGVycwotICAgIC8vIG90aGVycwotICAgIGZyQmxvY2tPYmplY3RFbnVtIHR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiBkcmNGaWc7Ci0gICAgfQotICBwcm90ZWN0ZWQ6Ci0gIH07Ci0KLSAgY2xhc3MgZHJOZXQ7Ci0gIGNsYXNzIGRyQ29ubkZpZzogcHVibGljIGRyRmlnIHsKLSAgcHVibGljOgotICAgIC8vIGNvbnN0cnVjdG9ycwotICAgIGRyQ29ubkZpZygpOiBkckZpZygpIHt9Ci0gICAgLy8gZ2V0dGVycwotICAgIHZpcnR1YWwgYm9vbCBoYXNOZXQoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBkck5ldCogZ2V0TmV0KCkgY29uc3QgPSAwOwotICAgIC8vIHNldHRlcnMKLSAgICB2aXJ0dWFsIHZvaWQgYWRkVG9OZXQoZHJOZXQqIGluKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIHJlbW92ZUZyb21OZXQoKSA9IDA7Ci0gICAgLy8gb3RoZXJzCi0gICAgZnJCbG9ja09iamVjdEVudW0gdHlwZUlkKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIGRyY0Nvbm5GaWc7Ci0gICAgfQotCi0gICAgLyogZHJvbSBkckZpZwotICAgICAqIGdldEJCb3gKLSAgICAgKiBtb3ZlCi0gICAgICogb3ZlcmxhcHMKLSAgICAgKi8KLSAgcHJvdGVjdGVkOgotICB9OwotCi0gIGNsYXNzIGRyUGluOwotICBjbGFzcyBkclBpbkZpZzogcHVibGljIGRyQ29ubkZpZyB7Ci0gIHB1YmxpYzoKLSAgICBkclBpbkZpZygpOiBkckNvbm5GaWcoKSB7fQotICAgIC8vIGdldHRlcnMKLSAgICB2aXJ0dWFsIGJvb2wgaGFzUGluKCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgZHJQaW4qIGdldFBpbigpIGNvbnN0ID0gMDsKLSAgICAvLyBzZXR0ZXJzCi0gICAgdmlydHVhbCB2b2lkIGFkZFRvUGluKGRyUGluKiBpbikgPSAwOwotICAgIHZpcnR1YWwgdm9pZCByZW1vdmVGcm9tUGluKCkgPSAwOwotICAgIC8vIG90aGVycwotICAgIGZyQmxvY2tPYmplY3RFbnVtIHR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiBkcmNQaW5GaWc7Ci0gICAgfQotCi0gICAgLyogZHJvbSBkckNvbm5GaWcKLSAgICAgKiBoYXNOZXQKLSAgICAgKiBnZXROZXQKLSAgICAgKiBhZGRUb05ldAotICAgICAqIHJlbW92ZWRyb21OZXQKLSAgICAgKi8KLQotICAgIC8qIGRyb20gZHJGaWcKLSAgICAgKiBnZXRCQm94Ci0gICAgICogbW92ZQotICAgICAqIG92ZXJsYXBzCi0gICAgICovCi0gIHByb3RlY3RlZDoKLSAgfTsKLQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL2RyT2JqL2RyTWFya2VyLmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9kck9iai9kck1hcmtlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDI4MTljLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL2RyT2JqL2RyTWFya2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIF9EUl9NQVJLRVJfSF8KLSNkZWZpbmUgX0RSX01BUktFUl9IXwotCi0jaW5jbHVkZSAiZGIvZHJPYmovZHJCbG9ja09iamVjdC5oIgotLy8jaW5jbHVkZSAiZGIvdGVjaC9mckNvbnN0cmFpbnQuaCIKLQotbmFtZXNwYWNlIGZyIHsKLSAgY2xhc3MgZnJDb25zdHJhaW50OwotICBjbGFzcyBkck5ldDsKLSAgY2xhc3MgZHJNYXplTWFya2VyOiBwdWJsaWMgZHJCbG9ja09iamVjdCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBjb25zdHJ1Y3RvcnMKLSAgICBkck1hemVNYXJrZXIoKTogY29uc3RyYWludChudWxscHRyKSwgdHJpZ05ldHMoKSwgY250KDApIHt9Ci0gICAgLy8gc2V0dGVycwotICAgIHZvaWQgc2V0Q29uc3RyYWludChmckNvbnN0cmFpbnQqIGluKSB7Ci0gICAgICBjb25zdHJhaW50ID0gaW47Ci0gICAgfQotICAgIHZvaWQgYWRkVHJpZ05ldChkck5ldCogaW4pIHsKLSAgICAgIGF1dG8gaXQgPSB0cmlnTmV0cy5maW5kKGluKTsKLSAgICAgIGlmIChpdCA9PSB0cmlnTmV0cy5lbmQoKSkgewotICAgICAgICB0cmlnTmV0c1tpbl0gPSAxOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgKysodHJpZ05ldHNbaW5dKTsKLSAgICAgIH0KLSAgICAgIGNudCsrOwotICAgIH0KLSAgICBib29sIHN1YlRyaWdOZXQoZHJOZXQqIGluKSB7Ci0gICAgICBhdXRvIGl0ID0gdHJpZ05ldHMuZmluZChpbik7Ci0gICAgICBpZiAoaXQgIT0gdHJpZ05ldHMuZW5kKCkpIHsKLSAgICAgICAgaWYgKGl0LT5zZWNvbmQgPT0gMSkgewotICAgICAgICAgIHRyaWdOZXRzLmVyYXNlKGl0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAtLShpdC0+c2Vjb25kKTsKLSAgICAgICAgfQotICAgICAgICAtLWNudDsKLSAgICAgIH0KLSAgICAgIHJldHVybiAoY250KSA/IHRydWUgOiBmYWxzZTsKLSAgICB9Ci0gICAgLy8gZ2V0dGVycwotICAgIGZyQ29uc3RyYWludCogZ2V0Q29uc3RyYWludCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBjb25zdHJhaW50OwotICAgIH0KLSAgICBkck5ldCogZ2V0VHJpZ05ldCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiB0cmlnTmV0cy5jYmVnaW4oKS0+Zmlyc3Q7Ci0gICAgfQotICAgIGNvbnN0IHN0ZDo6bWFwPGRyTmV0KiwgaW50PiYgZ2V0VHJpZ05ldHMoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gdHJpZ05ldHM7Ci0gICAgfQotICAgIHN0ZDo6bWFwPGRyTmV0KiwgaW50PiYgZ2V0VHJpZ05ldHMoKSB7Ci0gICAgICByZXR1cm4gdHJpZ05ldHM7Ci0gICAgfQotICAgIGludCBnZXRDbnQoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gY250OwotICAgIH0KLSAgICAvLyBvdGhlcnMKLSAgICBmckJsb2NrT2JqZWN0RW51bSB0eXBlSWQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gZHJjTWF6ZU1hcmtlcjsKLSAgICB9Ci0gICAgYm9vbCBvcGVyYXRvcjwgKGNvbnN0IGRyTWF6ZU1hcmtlciAmYikgY29uc3QgewotICAgICAgLy9yZXR1cm4gKGNvbnN0cmFpbnQgPT0gYi5jb25zdHJhaW50KSA/ICh0cmlnTmV0IDwgYi50cmlnTmV0KSA6IChjb25zdHJhaW50IDwgYi5jb25zdHJhaW50KTsKLSAgICAgIHJldHVybiAoY29uc3RyYWludCA8IGIuY29uc3RyYWludCk7Ci0gICAgfQotICBwcm90ZWN0ZWQ6Ci0gICAgZnJDb25zdHJhaW50KiAgICAgICAgIGNvbnN0cmFpbnQ7Ci0gICAgc3RkOjptYXA8ZHJOZXQqLCBpbnQ+IHRyaWdOZXRzOwotICAgIGludCAgICAgICAgICAgICAgICAgICBjbnQ7Ci0gIH07Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL2RyT2JqL2RyTmV0LmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9kck9iai9kck5ldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmZlNDc5Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL2RyT2JqL2RyTmV0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyogQXV0aG9yczogTHV0b25nIFdhbmcgYW5kIEJhbmdxaSBYdSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBfRFJfTkVUX0hfCi0jZGVmaW5lIF9EUl9ORVRfSF8KLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlICJkYi9kck9iai9kckJsb2NrT2JqZWN0LmgiCi0jaW5jbHVkZSAiZGIvZHJPYmovZHJQaW4uaCIKLSNpbmNsdWRlICJkYi9kck9iai9kclNoYXBlLmgiCi0jaW5jbHVkZSAiZGIvZHJPYmovZHJWaWEuaCIKLQotbmFtZXNwYWNlIGZyIHsKLSAgY2xhc3MgZnJOZXQ7Ci0gIGNsYXNzIGRyTmV0OiBwdWJsaWMgZHJCbG9ja09iamVjdCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBjb25zdHJ1Y3RvcnMKLSAgICBkck5ldCgpOiBkckJsb2NrT2JqZWN0KCksIHBpbnMoKSwgZXh0Q29ubkZpZ3MoKSwgcm91dGVDb25uRmlncygpLCBiZXN0Um91dGVDb25uRmlncygpLAotICAgICAgICAgICAgIGZOZXQobnVsbHB0ciksIG1vZGlmaWVkKGZhbHNlKSwgbnVtTWFya2VycygwKSwgbnVtUGluc0luKDApLCBwaW5Cb3goKSwgcmlwdXAoZmFsc2UpIHt9Ci0gICAgLy8gZ2V0dGVycwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxkclBpbj4gPiYgZ2V0UGlucygpIGNvbnN0IHsKLSAgICAgIHJldHVybiBwaW5zOwotICAgIH0KLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZHJQaW4+ID4mIGdldFBpbnMoKSB7Ci0gICAgICByZXR1cm4gcGluczsKLSAgICB9Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGRyQ29ubkZpZz4gPiYgZ2V0RXh0Q29ubkZpZ3MoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gZXh0Q29ubkZpZ3M7Ci0gICAgfQotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxkckNvbm5GaWc+ID4mIGdldEV4dENvbm5GaWdzKCkgewotICAgICAgcmV0dXJuIGV4dENvbm5GaWdzOwotICAgIH0KLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZHJDb25uRmlnPiA+JiBnZXRSb3V0ZUNvbm5GaWdzKCkgY29uc3QgewotICAgICAgcmV0dXJuIHJvdXRlQ29ubkZpZ3M7Ci0gICAgfQotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxkckNvbm5GaWc+ID4mIGdldFJvdXRlQ29ubkZpZ3MoKSB7Ci0gICAgICByZXR1cm4gcm91dGVDb25uRmlnczsKLSAgICB9Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGRyQ29ubkZpZz4gPiYgZ2V0QmVzdFJvdXRlQ29ubkZpZ3MoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gYmVzdFJvdXRlQ29ubkZpZ3M7Ci0gICAgfQotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxkckNvbm5GaWc+ID4mIGdldEJlc3RSb3V0ZUNvbm5GaWdzKCkgewotICAgICAgcmV0dXJuIGJlc3RSb3V0ZUNvbm5GaWdzOwotICAgIH0KLSAgICBmck5ldCogZ2V0RnJOZXQoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gZk5ldDsKLSAgICB9Ci0gICAgYm9vbCBpc01vZGlmaWVkKCkgY29uc3QgewotICAgICAgcmV0dXJuIG1vZGlmaWVkOwotICAgIH0KLSAgICBpbnQgZ2V0TnVtTWFya2VycygpIGNvbnN0IHsKLSAgICAgIHJldHVybiBudW1NYXJrZXJzOwotICAgIH0KLSAgICBpbnQgZ2V0TnVtUGluc0luKCkgY29uc3QgewotICAgICAgcmV0dXJuIG51bVBpbnNJbjsKLSAgICB9Ci0gICAgdm9pZCBnZXRQaW5Cb3goZnJCb3ggJmluKSB7Ci0gICAgICBpbi5zZXQocGluQm94KTsKLSAgICB9Ci0gICAgYm9vbCBpc1JpcHVwKCkgY29uc3QgewotICAgICAgcmV0dXJuIHJpcHVwOwotICAgIH0KLQotICAgIC8vIHNldHRlcnMKLSAgICB2b2lkIGFkZFBpbihzdGQ6OnVuaXF1ZV9wdHI8ZHJQaW4+ICZwaW5JbikgewotICAgICAgcGluSW4tPnNldE5ldCh0aGlzKTsKLSAgICAgIC8vcGluSW4tPnNldElkKHBpbnMuc2l6ZSgpKTsKLSAgICAgIHBpbnMucHVzaF9iYWNrKHN0ZDo6bW92ZShwaW5JbikpOwotICAgIH0KLSAgICB2b2lkIGFkZFJvdXRlKHN0ZDo6dW5pcXVlX3B0cjxkckNvbm5GaWc+ICZpbiwgYm9vbCBpc0V4dCA9IGZhbHNlKSB7Ci0gICAgICBpbi0+YWRkVG9OZXQodGhpcyk7Ci0gICAgICBpZiAoaXNFeHQpIHsKLSAgICAgICAgZXh0Q29ubkZpZ3MucHVzaF9iYWNrKHN0ZDo6bW92ZShpbikpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcm91dGVDb25uRmlncy5wdXNoX2JhY2soc3RkOjptb3ZlKGluKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHZvaWQgc2V0QmVzdFJvdXRlQ29ubkZpZ3MoKSB7Ci0gICAgICBmb3IgKGF1dG8gJnVDb25uRmlnOiByb3V0ZUNvbm5GaWdzKSB7Ci0gICAgICAgIGlmICh1Q29ubkZpZy0+dHlwZUlkKCkgPT0gZHJjUGF0aFNlZykgewotICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxkckNvbm5GaWc+IHVQdHIgPSBzdGQ6Om1ha2VfdW5pcXVlPGRyUGF0aFNlZz4oKnN0YXRpY19jYXN0PGRyUGF0aFNlZyo+KHVDb25uRmlnLmdldCgpKSk7Ci0gICAgICAgICAgYmVzdFJvdXRlQ29ubkZpZ3MucHVzaF9iYWNrKHN0ZDo6bW92ZSh1UHRyKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAodUNvbm5GaWctPnR5cGVJZCgpID09IGRyY1ZpYSkgewotICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxkckNvbm5GaWc+IHVQdHIgPSBzdGQ6Om1ha2VfdW5pcXVlPGRyVmlhPigqc3RhdGljX2Nhc3Q8ZHJWaWEqPih1Q29ubkZpZy5nZXQoKSkpOwotICAgICAgICAgIGJlc3RSb3V0ZUNvbm5GaWdzLnB1c2hfYmFjayhzdGQ6Om1vdmUodVB0cikpOwotICAgICAgICB9IGVsc2UgaWYgKHVDb25uRmlnLT50eXBlSWQoKSA9PSBkcmNQYXRjaFdpcmUpIHsKLSAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8ZHJDb25uRmlnPiB1UHRyID0gc3RkOjptYWtlX3VuaXF1ZTxkclBhdGNoV2lyZT4oKnN0YXRpY19jYXN0PGRyUGF0Y2hXaXJlKj4odUNvbm5GaWcuZ2V0KCkpKTsKLSAgICAgICAgICBiZXN0Um91dGVDb25uRmlncy5wdXNoX2JhY2soc3RkOjptb3ZlKHVQdHIpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICB2b2lkIGNsZWFyKCkgewotICAgICAgcm91dGVDb25uRmlncy5jbGVhcigpOwotICAgIH0KLSAgICB2b2lkIHNldEZyTmV0KGZyTmV0KiBpbikgewotICAgICAgZk5ldCA9IGluOwotICAgIH0KLSAgICB2b2lkIHNldE1vZGlmaWVkKGJvb2wgaW4pIHsKLSAgICAgIG1vZGlmaWVkID0gaW47Ci0gICAgfQotCi0gICAgdm9pZCBzZXROdW1NYXJrZXJzKGludCBpbikgewotICAgICAgbnVtTWFya2VycyA9IGluOwotICAgIH0KLSAgICB2b2lkIGFkZE1hcmtlcigpIHsKLSAgICAgIG51bU1hcmtlcnMrKzsKLSAgICB9Ci0gICAgdm9pZCBzZXROdW1QaW5zSW4oaW50IGluKSB7Ci0gICAgICBudW1QaW5zSW4gPSBpbjsKLSAgICB9Ci0gICAgdm9pZCBzZXRQaW5Cb3goY29uc3QgZnJCb3ggJmluKSB7Ci0gICAgICBwaW5Cb3guc2V0KGluKTsKLSAgICB9Ci0gICAgdm9pZCBzZXRSaXB1cCgpIHsKLSAgICAgIHJpcHVwID0gdHJ1ZTsKLSAgICB9Ci0gICAgdm9pZCByZXNldFJpcHVwKCkgewotICAgICAgcmlwdXAgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBvdGhlcnMKLSAgICBmckJsb2NrT2JqZWN0RW51bSB0eXBlSWQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gZHJjTmV0OwotICAgIH0KLQotICAgIGJvb2wgb3BlcmF0b3I8IChjb25zdCBkck5ldCAmYikgY29uc3QgewotICAgICAgcmV0dXJuIChudW1NYXJrZXJzID09IGIubnVtTWFya2VycykgPyAoaWQgPCBiLmlkKSA6IChudW1NYXJrZXJzID4gYi5udW1NYXJrZXJzKTsKLSAgICB9Ci0KLSAgcHJvdGVjdGVkOgotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxkclBpbj4gPiAgICAgICAgIHBpbnM7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGRyQ29ubkZpZz4gPiAgICAgZXh0Q29ubkZpZ3M7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGRyQ29ubkZpZz4gPiAgICAgcm91dGVDb25uRmlnczsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZHJDb25uRmlnPiA+ICAgICBiZXN0Um91dGVDb25uRmlnczsKLSAgICBmck5ldCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmTmV0OwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bU1hcmtlcnM7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtUGluc0luOwotICAgIGZyQm94ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbkJveDsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaXB1cDsKLSAgfTsKLX0KLQotCi0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9kck9iai9kclBpbi5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvZHJPYmovZHJQaW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VkNzRiOC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9kck9iai9kclBpbi5oCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyogQXV0aG9yczogTHV0b25nIFdhbmcgYW5kIEJhbmdxaSBYdSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBfRFJfUElOX0gKLSNkZWZpbmUgX0RSX1BJTl9ICi0KLSNpbmNsdWRlICJkYi9kck9iai9kckJsb2NrT2JqZWN0LmgiCi0jaW5jbHVkZSAiZGIvZHJPYmovZHJBY2Nlc3NQYXR0ZXJuLmgiCi0KLW5hbWVzcGFjZSBmciB7Ci0gIGNsYXNzIGRyTmV0OwotICBjbGFzcyBkclBpbjogcHVibGljIGRyQmxvY2tPYmplY3QgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3JzCi0gICAgZHJQaW4oKTogZHJCbG9ja09iamVjdCgpLCB0ZXJtKG51bGxwdHIpLCBhY2Nlc3NQYXR0ZXJucygpLCBuZXQobnVsbHB0cikge30KLSAgICAvLyBzZXR0ZXJzCi0gICAgdm9pZCBzZXRGclRlcm0oZnJCbG9ja09iamVjdCogaW4pIHsKLSAgICAgIHRlcm0gPSBpbjsKLSAgICB9Ci0gICAgdm9pZCBhZGRBY2Nlc3NQYXR0ZXJuKHN0ZDo6dW5pcXVlX3B0cjxkckFjY2Vzc1BhdHRlcm4+ICZpbikgewotICAgICAgaW4tPnNldFBpbih0aGlzKTsKLSAgICAgIGFjY2Vzc1BhdHRlcm5zLnB1c2hfYmFjayhzdGQ6Om1vdmUoaW4pKTsKLSAgICB9Ci0gICAgdm9pZCBzZXROZXQoZHJOZXQqIGluKSB7Ci0gICAgICBuZXQgPSBpbjsKLSAgICB9Ci0gICAgLy8gZ2V0dGVycwotICAgIGJvb2wgaGFzRnJUZXJtKCkgY29uc3QgewotICAgICAgcmV0dXJuICh0ZXJtKTsKLSAgICB9Ci0gICAgZnJCbG9ja09iamVjdCogZ2V0RnJUZXJtKCkgY29uc3QgewotICAgICAgcmV0dXJuIHRlcm07Ci0gICAgfQotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxkckFjY2Vzc1BhdHRlcm4+ID4mIGdldEFjY2Vzc1BhdHRlcm5zKCkgY29uc3QgewotICAgICAgcmV0dXJuIGFjY2Vzc1BhdHRlcm5zOwotICAgIH0KLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZHJBY2Nlc3NQYXR0ZXJuPiA+JiBnZXRBY2Nlc3NQYXR0ZXJucygpIHsKLSAgICAgIHJldHVybiBhY2Nlc3NQYXR0ZXJuczsKLSAgICB9Ci0gICAgZHJOZXQqIGdldE5ldCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBuZXQ7Ci0gICAgfQotCi0gICAgLy8gb3RoZXJzCi0gICAgZnJCbG9ja09iamVjdEVudW0gdHlwZUlkKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIGRyY1BpbjsKLSAgICB9Ci0gIHByb3RlY3RlZDoKLSAgICBmckJsb2NrT2JqZWN0KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm07ICAvLyBlaXRoZXIgZnJUZXJtIG9yIGZySW5zdFRlcm0KLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZHJBY2Nlc3NQYXR0ZXJuPiA+IGFjY2Vzc1BhdHRlcm5zOwotICAgIGRyTmV0KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0OwotICB9OwotfQotCi0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9kck9iai9kclJlZi5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvZHJPYmovZHJSZWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IxOTRmZi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9kck9iai9kclJlZi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyogQXV0aG9yczogTHV0b25nIFdhbmcgYW5kIEJhbmdxaSBYdSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBfRFJfUkVGX0hfCi0jZGVmaW5lIF9EUl9SRUZfSF8KLQotI2luY2x1ZGUgImRiL2RyT2JqL2RyRmlnLmgiCi0jaW5jbHVkZSAiZGIvaW5mcmEvZnJPcmllbnQuaCIKLQotbmFtZXNwYWNlIGZyIHsKLSAgY2xhc3MgZHJSZWY6IHB1YmxpYyBkclBpbkZpZyB7Ci0gIHB1YmxpYzoKLSAgICAvLyBjb25zdHJ1Y3RvcnMKLSAgICBkclJlZigpOiBkclBpbkZpZygpIHt9Ci0gICAgLy8gZ2V0dGVycwotICAgIHZpcnR1YWwgZnJPcmllbnQgZ2V0T3JpZW50KCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBnZXRPcmlnaW4oZnJQb2ludCAmdG1wT3JpZ2luKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIGdldFRyYW5zZm9ybShmclRyYW5zZm9ybSAmeGZvcm0pIGNvbnN0ID0gMDsKLSAgICAvLyBzZXR0ZXJzCi0gICAgdmlydHVhbCB2b2lkIHNldE9yaWVudChjb25zdCBmck9yaWVudCAmdG1wT3JpZW50KSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIHNldE9yaWdpbihjb25zdCBmclBvaW50ICZ0bXBQb2ludCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBzZXRUcmFuc2Zvcm0oY29uc3QgZnJUcmFuc2Zvcm0gJnhmb3JtKSA9IDA7Ci0gICAgZnJCbG9ja09iamVjdEVudW0gdHlwZUlkKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIGRyY1JlZjsKLSAgICB9Ci0gIHByb3RlY3RlZDoKLSAgfTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9kck9iai9kclNoYXBlLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL2RyT2JqL2RyU2hhcGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzU0MjFkLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL2RyT2JqL2RyU2hhcGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyogQXV0aG9yczogTHV0b25nIFdhbmcgYW5kIEJhbmdxaSBYdSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImRiL29iai9mclNoYXBlLmgiCi0jaW5jbHVkZSAiZGIvZHJPYmovZHJTaGFwZS5oIgotI2luY2x1ZGUgImRiL2RyT2JqL2RyTmV0LmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgZnI7Ci0KLQotZHJQYXRoU2VnOjpkclBhdGhTZWcoY29uc3QgZnJQYXRoU2VnICZpbik6IGxheWVyKGluLmdldExheWVyTnVtKCkpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lcihudWxscHRyKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW5NYXplSWR4KCksIGVuZE1hemVJZHgoKSwgcGF0Y2hTZWcoZmFsc2UpIHsKLSAgaW4uZ2V0UG9pbnRzKGJlZ2luLCBlbmQpOwotICBpbi5nZXRTdHlsZShzdHlsZSk7Ci19Ci0KLWRyUGF0Y2hXaXJlOjpkclBhdGNoV2lyZShjb25zdCBmclBhdGNoV2lyZSAmaW4pOiBsYXllcihpbi5nZXRMYXllck51bSgpKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXIobnVsbHB0cikgewotICBpbi5nZXRPZmZzZXRCb3gob2Zmc2V0Qm94KTsKLSAgaW4uZ2V0T3JpZ2luKG9yaWdpbik7Ci19CmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9kck9iai9kclNoYXBlLmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9kck9iai9kclNoYXBlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZTJlY2QuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvZHJPYmovZHJTaGFwZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX0RSX1NIQVBFX0hfCi0jZGVmaW5lIF9EUl9TSEFQRV9IXwotCi0jaW5jbHVkZSAiZGIvZHJPYmovZHJGaWcuaCIKLSNpbmNsdWRlICJkYi9pbmZyYS9mclNlZ1N0eWxlLmgiCi0jaW5jbHVkZSAiZHIvRmxleE1hemVUeXBlcy5oIgotCi0KLW5hbWVzcGFjZSBmciB7Ci0gIGNsYXNzIGRyTmV0OwotICBjbGFzcyBkclBpbjsKLSAgY2xhc3MgZnJQYXRoU2VnOwotICBjbGFzcyBmclBhdGNoV2lyZTsKLSAgY2xhc3MgZHJTaGFwZTogcHVibGljIGRyUGluRmlnIHsKLSAgcHVibGljOgotICAgIC8vIGNvbnN0cnVjdG9ycwotICAgIGRyU2hhcGUoKTogZHJQaW5GaWcoKSB7fQotICAgIGRyU2hhcGUoY29uc3QgZHJTaGFwZSAmaW4pOiBkclBpbkZpZyhpbikge30KLSAgICAvLyBzZXR0ZXJzCi0gICAgdmlydHVhbCB2b2lkIHNldExheWVyTnVtIChmckxheWVyTnVtIHRtcExheWVyTnVtKSA9IDA7Ci0gICAgLy8gZ2V0dGVycwotICAgIHZpcnR1YWwgZnJMYXllck51bSBnZXRMYXllck51bSgpIGNvbnN0ID0gMDsKLSAgICAvLyBvdGhlcnMKLSAgICAvL2RyQmxvY2tPYmplY3RFbnVtIHR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlID0gMDsKLQotICAgIC8qIGRyb20gZHJQaW5GaWcKLSAgICAgKiBoYXNQaW4KLSAgICAgKiBnZXRQaW4KLSAgICAgKiBhZGRUb1BpbgotICAgICAqIHJlbW92ZWRyb21QaW4KLSAgICAgKi8KLQotICAgIC8qIGRyb20gZHJDb25uRmlnCi0gICAgICogaGFzTmV0Ci0gICAgICogZ2V0TmV0Ci0gICAgICogYWRkVG9OZXQKLSAgICAgKiByZW1vdmVkcm9tTmV0Ci0gICAgICovCi0KLSAgICAvKiBkcm9tIGRyRmlnCi0gICAgICogZ2V0QkJveAotICAgICAqIG1vdmUKLSAgICAgKiBvdmVybGFwcwotICAgICAqLwotCi0gICAgLy92aXJ0dWFsIHZvaWQgc2V0SXRlcihmckxpc3RJdGVyPHN0ZDo6dW5pcXVlX3B0cjxkclNoYXBlPiA+ICZpbikgPSAwOwotICAgIC8vdmlydHVhbCBmckxpc3RJdGVyPHN0ZDo6dW5pcXVlX3B0cjxkclNoYXBlPiA+IGdldEl0ZXIoKSBjb25zdCA9IDA7Ci0gICAgLy92aXJ0dWFsIGJvb2wgaXNFeHQoKSBjb25zdCAgPSAwOwotICAgIC8vdmlydHVhbCB2b2lkIHNldEV4dCgpID0gMDsKLSAgcHJvdGVjdGVkOgotICB9OwotCi0gIGNsYXNzIGRyUGF0aFNlZzogcHVibGljIGRyU2hhcGUgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3JzCi0gICAgZHJQYXRoU2VnKCk6IGRyU2hhcGUoKSwgYmVnaW4oKSwgZW5kKCksIGxheWVyKDApLCBzdHlsZSgpLCBvd25lcihudWxscHRyKSwgCi0gICAgICAgICAgICAgICAgIGJlZ2luTWF6ZUlkeCgpLCBlbmRNYXplSWR4KCksIHBhdGNoU2VnKGZhbHNlKSB7fQotICAgIGRyUGF0aFNlZyhjb25zdCBkclBhdGhTZWcgJmluKTogZHJTaGFwZShpbiksIGJlZ2luKGluLmJlZ2luKSwgZW5kKGluLmVuZCksIGxheWVyKGluLmxheWVyKSwgc3R5bGUoaW4uc3R5bGUpLCBvd25lcihpbi5vd25lciksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW5NYXplSWR4KGluLmJlZ2luTWF6ZUlkeCksIGVuZE1hemVJZHgoaW4uZW5kTWF6ZUlkeCksIHBhdGNoU2VnKGluLnBhdGNoU2VnKSB7fQotICAgIGRyUGF0aFNlZyhjb25zdCBmclBhdGhTZWcgJmluKTsKLSAgICAvLyBnZXR0ZXJzCi0gICAgdm9pZCBnZXRQb2ludHMoZnJQb2ludCAmYmVnaW5JbiwgZnJQb2ludCAmZW5kSW4pIGNvbnN0IHsKLSAgICAgIGJlZ2luSW4uc2V0KGJlZ2luKTsKLSAgICAgIGVuZEluLnNldChlbmQpOwotICAgIH0KLSAgICB2b2lkIGdldFN0eWxlKGZyU2VnU3R5bGUgJnN0eWxlSW4pIGNvbnN0IHsKLSAgICAgIHN0eWxlSW4uc2V0QmVnaW5TdHlsZShzdHlsZS5nZXRCZWdpblN0eWxlKCksIHN0eWxlLmdldEJlZ2luRXh0KCkpOwotICAgICAgc3R5bGVJbi5zZXRFbmRTdHlsZShzdHlsZS5nZXRFbmRTdHlsZSgpLCBzdHlsZS5nZXRFbmRFeHQoKSk7Ci0gICAgICBzdHlsZUluLnNldFdpZHRoKHN0eWxlLmdldFdpZHRoKCkpOwotICAgIH0KLSAgICAvLyBzZXR0ZXJzCi0gICAgdm9pZCBzZXRQb2ludHMoY29uc3QgZnJQb2ludCAmYmVnaW5JbiwgY29uc3QgZnJQb2ludCAmZW5kSW4pIHsKLSAgICAgIGJlZ2luLnNldChiZWdpbkluKTsKLSAgICAgIGVuZC5zZXQoZW5kSW4pOwotICAgIH0KLSAgICB2b2lkIHNldFN0eWxlKGNvbnN0IGZyU2VnU3R5bGUgJnN0eWxlSW4pIHsKLSAgICAgIHN0eWxlLnNldEJlZ2luU3R5bGUoc3R5bGVJbi5nZXRCZWdpblN0eWxlKCksIHN0eWxlSW4uZ2V0QmVnaW5FeHQoKSk7Ci0gICAgICBzdHlsZS5zZXRFbmRTdHlsZShzdHlsZUluLmdldEVuZFN0eWxlKCksIHN0eWxlSW4uZ2V0RW5kRXh0KCkpOwotICAgICAgc3R5bGUuc2V0V2lkdGgoc3R5bGVJbi5nZXRXaWR0aCgpKTsKLSAgICB9Ci0gICAgLy8gb3RoZXJzCi0gICAgZnJCbG9ja09iamVjdEVudW0gdHlwZUlkKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIGRyY1BhdGhTZWc7Ci0gICAgfQotCi0gICAgLyogZHJvbSBkclNoYXBlCi0gICAgICogc2V0TGF5ZXJOdW0KLSAgICAgKiBnZXRMYXllck51bQotICAgICAqLwotICAgIHZvaWQgc2V0TGF5ZXJOdW0gKGZyTGF5ZXJOdW0gbnVtSW4pIG92ZXJyaWRlIHsKLSAgICAgIGxheWVyID0gbnVtSW47Ci0gICAgfQotICAgIGZyTGF5ZXJOdW0gZ2V0TGF5ZXJOdW0oKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gbGF5ZXI7Ci0gICAgfQotICAgIAotICAgIC8qIGRyb20gZHJQaW5GaWcKLSAgICAgKiBoYXNQaW4KLSAgICAgKiBnZXRQaW4KLSAgICAgKiBhZGRUb1BpbgotICAgICAqIHJlbW92ZWRyb21QaW4KLSAgICAgKi8KLSAgICBib29sIGhhc1BpbigpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiAob3duZXIpICYmIChvd25lci0+dHlwZUlkKCkgPT0gZHJjUGluKTsKLSAgICB9Ci0gICAgCi0gICAgZHJQaW4qIGdldFBpbigpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGRyUGluKj4ob3duZXIpOwotICAgIH0KLSAgICAKLSAgICB2b2lkIGFkZFRvUGluKGRyUGluKiBpbikgb3ZlcnJpZGUgewotICAgICAgb3duZXIgPSByZWludGVycHJldF9jYXN0PGRyQmxvY2tPYmplY3QqPihpbik7Ci0gICAgfQotICAgIAotICAgIHZvaWQgcmVtb3ZlRnJvbVBpbigpIG92ZXJyaWRlIHsKLSAgICAgIG93bmVyID0gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICAvKiBkcm9tIGRyQ29ubkZpZwotICAgICAqIGhhc05ldAotICAgICAqIGdldE5ldAotICAgICAqIGFkZFRvTmV0Ci0gICAgICogcmVtb3ZlZHJvbU5ldAotICAgICAqLwotICAgIGJvb2wgaGFzTmV0KCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIChvd25lcikgJiYgKG93bmVyLT50eXBlSWQoKSA9PSBkcmNOZXQpOwotICAgIH0KLSAgICAKLSAgICBkck5ldCogZ2V0TmV0KCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8ZHJOZXQqPihvd25lcik7Ci0gICAgfQotICAgIAotICAgIHZvaWQgYWRkVG9OZXQoZHJOZXQqIGluKSBvdmVycmlkZSB7Ci0gICAgICBvd25lciA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZHJCbG9ja09iamVjdCo+KGluKTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCByZW1vdmVGcm9tTmV0KCkgb3ZlcnJpZGUgewotICAgICAgb3duZXIgPSBudWxscHRyOwotICAgIH0KLQotICAgIC8qIGRyb20gZHJGaWcKLSAgICAgKiBnZXRCQm94Ci0gICAgICogbW92ZSwgaW4gLmNwcAotICAgICAqIG92ZXJsYXBzLCBpbiAuY3BwCi0gICAgICovCi0gICAgLy8gbmVlZHMgdG8gYmUgdXBkYXRlZAotICAgIHZvaWQgZ2V0QkJveCAoZnJCb3ggJmJveEluKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICBib29sIGlzSG9yaXpvbnRhbCA9IHRydWU7Ci0gICAgICBpZiAoYmVnaW4ueCgpID09IGVuZC54KCkpIHsKLSAgICAgICAgaXNIb3Jpem9udGFsID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBhdXRvIHdpZHRoICAgID0gc3R5bGUuZ2V0V2lkdGgoKTsKLSAgICAgIGF1dG8gYmVnaW5FeHQgPSBzdHlsZS5nZXRCZWdpbkV4dCgpOwotICAgICAgYXV0byBlbmRFeHQgICA9IHN0eWxlLmdldEVuZEV4dCgpOwotICAgICAgaWYgKGlzSG9yaXpvbnRhbCkgewotICAgICAgICBib3hJbi5zZXQoYmVnaW4ueCgpIC0gYmVnaW5FeHQsIGJlZ2luLnkoKSAtIHdpZHRoIC8gMiwKLSAgICAgICAgICAgICAgICAgIGVuZC54KCkgICArIGVuZEV4dCwgICBlbmQueSgpICAgKyB3aWR0aCAvIDIpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYm94SW4uc2V0KGJlZ2luLngoKSAtIHdpZHRoIC8gMiwgYmVnaW4ueSgpIC0gYmVnaW5FeHQsCi0gICAgICAgICAgICAgICAgICBlbmQueCgpICAgKyB3aWR0aCAvIDIsIGVuZC55KCkgICArIGVuZEV4dCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy92b2lkIHNldEl0ZXIoZnJMaXN0SXRlcjxzdGQ6OnVuaXF1ZV9wdHI8ZHJTaGFwZT4gPiYgaW4pIG92ZXJyaWRlIHsKLSAgICAvLyAgaXRlciA9IGluOwotICAgIC8vfQotICAgIC8vZnJMaXN0SXRlcjxzdGQ6OnVuaXF1ZV9wdHI8ZHJTaGFwZT4gPiBnZXRJdGVyKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgIC8vICByZXR1cm4gaXRlcjsKLSAgICAvL30KLQotICAgIC8vIGRldGVybWluZSB3aGV0aGVyIHNoYXBlIGlzIHN0b3JlZCBpbiBuZXQgZml4ZWQgb2JqIG9yIHJvdXRlZCBvYmoKLSAgICAvL2Jvb2wgaXNFeHQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgLy8gIHJldHVybiBleHQ7Ci0gICAgLy99Ci0gICAgLy92b2lkIHNldEV4dChib29sIGluKSBvdmVycmlkZSB7Ci0gICAgLy8gIGV4dCA9IGluOwotICAgIC8vfQotICAgIGJvb2wgaGFzTWF6ZUlkeCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiAoIWJlZ2luTWF6ZUlkeC5lbXB0eSgpKTsKLSAgICB9Ci0gICAgdm9pZCBnZXRNYXplSWR4KEZsZXhNYXplSWR4ICZiaSwgRmxleE1hemVJZHggJmVpKSBjb25zdCB7Ci0gICAgICBiaS5zZXQoYmVnaW5NYXplSWR4KTsKLSAgICAgIGVpLnNldChlbmRNYXplSWR4KTsKLSAgICB9Ci0gICAgdm9pZCBzZXRNYXplSWR4KEZsZXhNYXplSWR4ICZiaSwgRmxleE1hemVJZHggJmVpKSB7Ci0gICAgICBiZWdpbk1hemVJZHguc2V0KGJpKTsKLSAgICAgIGVuZE1hemVJZHguc2V0KGVpKTsKLSAgICB9Ci0gICAgdm9pZCBzZXRQYXRjaFNlZyhib29sIGluKSB7Ci0gICAgICBwYXRjaFNlZyA9IGluOwotICAgIH0KLSAgICBib29sIGlzUGF0Y2hTZWcoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gcGF0Y2hTZWc7Ci0gICAgfQotICBwcm90ZWN0ZWQ6Ci0gICAgZnJQb2ludCAgICAgICAgYmVnaW47IC8vIGJlZ2luIGFsd2F5cyBzbWFsbGVyIHRoYW4gZW5kLCBhc3N1bWVkCi0gICAgZnJQb2ludCAgICAgICAgZW5kOwotICAgIGZyTGF5ZXJOdW0gICAgIGxheWVyOwotICAgIGZyU2VnU3R5bGUgICAgIHN0eWxlOwotICAgIGRyQmxvY2tPYmplY3QqIG93bmVyOwotICAgIC8vZnJMaXN0SXRlcjxzdGQ6OnVuaXF1ZV9wdHI8ZHJTaGFwZT4gPiBpdGVyOwotICAgIC8vYm9vbCAgICAgICAgICAgZXh0OwotICAgIEZsZXhNYXplSWR4ICAgIGJlZ2luTWF6ZUlkeDsKLSAgICBGbGV4TWF6ZUlkeCAgICBlbmRNYXplSWR4OwotICAgIGJvb2wgICAgICAgICAgIHBhdGNoU2VnOyAKLSAgfTsKLQotICBjbGFzcyBkclBhdGNoV2lyZTogcHVibGljIGRyU2hhcGUgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3JzCi0gICAgZHJQYXRjaFdpcmUoKTogZHJTaGFwZSgpLCBvZmZzZXRCb3goKSwgb3JpZ2luKCksIGxheWVyKDApLCBvd25lcihudWxscHRyKSB7fTsKLSAgICBkclBhdGNoV2lyZShjb25zdCBkclBhdGNoV2lyZSYgaW4pOiBkclNoYXBlKGluKSwgb2Zmc2V0Qm94KGluLm9mZnNldEJveCksIG9yaWdpbihpbi5vcmlnaW4pLCBsYXllcihpbi5sYXllciksIG93bmVyKGluLm93bmVyKSB7fTsKLSAgICBkclBhdGNoV2lyZShjb25zdCBmclBhdGNoV2lyZSYgaW4pOwotICAgIC8vIG90aGVycwotICAgIGZyQmxvY2tPYmplY3RFbnVtIHR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiBkcmNQYXRjaFdpcmU7Ci0gICAgfQotCi0gICAgLyogZnJvbSBkclNoYXBlCi0gICAgICogc2V0TGF5ZXJOdW0KLSAgICAgKiBnZXRMYXllck51bQotICAgICAqLwotICAgIHZvaWQgc2V0TGF5ZXJOdW0gKGZyTGF5ZXJOdW0gbnVtSW4pIG92ZXJyaWRlIHsKLSAgICAgIGxheWVyID0gbnVtSW47Ci0gICAgfQotICAgIGZyTGF5ZXJOdW0gZ2V0TGF5ZXJOdW0oKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gbGF5ZXI7Ci0gICAgfQotCi0KLSAgICAvKiBmcm9tIGRyUGluRmlnCi0gICAgICogaGFzUGluCi0gICAgICogZ2V0UGluCi0gICAgICogYWRkVG9QaW4KLSAgICAgKiByZW1vdmVGcm9tUGluCi0gICAgICovCi0gICAgYm9vbCBoYXNQaW4oKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gKG93bmVyKSAmJiAob3duZXItPnR5cGVJZCgpID09IGRyY1Bpbik7Ci0gICAgfQotICAgIAotICAgIGRyUGluKiBnZXRQaW4oKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxkclBpbio+KG93bmVyKTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBhZGRUb1BpbihkclBpbiogaW4pIG92ZXJyaWRlIHsKLSAgICAgIG93bmVyID0gcmVpbnRlcnByZXRfY2FzdDxkckJsb2NrT2JqZWN0Kj4oaW4pOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHJlbW92ZUZyb21QaW4oKSBvdmVycmlkZSB7Ci0gICAgICBvd25lciA9IG51bGxwdHI7Ci0gICAgfQotCi0gICAgLyogZnJvbSBkckNvbm5maWcKLSAgICAgKiBoYXNOZXQKLSAgICAgKiBnZXROZXQKLSAgICAgKiBhZGRUb05ldAotICAgICAqIHJlbW92ZWRGcm9tTmV0Ci0gICAgICovCi0gICAgYm9vbCBoYXNOZXQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gKG93bmVyKSAmJiAob3duZXItPnR5cGVJZCgpID09IGRyY05ldCk7Ci0gICAgfQotICAgIAotICAgIGRyTmV0KiBnZXROZXQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxkck5ldCo+KG93bmVyKTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBhZGRUb05ldChkck5ldCogaW4pIG92ZXJyaWRlIHsKLSAgICAgIG93bmVyID0gcmVpbnRlcnByZXRfY2FzdDxkckJsb2NrT2JqZWN0Kj4oaW4pOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHJlbW92ZUZyb21OZXQoKSBvdmVycmlkZSB7Ci0gICAgICBvd25lciA9IG51bGxwdHI7Ci0gICAgfQotCi0gICAgLyogZnJvbSBkckZpZwotICAgICAqIGdldEJCb3gKLSAgICAgKiBzZXRCQm94Ci0gICAgICovCi0gICAgdm9pZCBnZXRCQm94IChmckJveCAmYm94SW4pIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIGZyVHJhbnNmb3JtIHhmb3JtKG9yaWdpbik7Ci0gICAgICBib3hJbi5zZXQob2Zmc2V0Qm94KTsKLSAgICAgIGJveEluLnRyYW5zZm9ybSh4Zm9ybSk7Ci0gICAgfQotICAgIC8vIHZvaWQgc2V0QkJveCAoY29uc3QgZnJCb3ggJmJveEluKSB7Ci0gICAgLy8gICBib3guc2V0KGJveEluKTsKLSAgICAvLyB9Ci0KLSAgICB2b2lkIGdldE9mZnNldEJveCAoZnJCb3ggJmJveEluKSBjb25zdCB7Ci0gICAgICBib3hJbiA9IG9mZnNldEJveDsKLSAgICB9Ci0gICAgdm9pZCBzZXRPZmZzZXRCb3ggKGNvbnN0IGZyQm94ICZib3hJbikgewotICAgICAgb2Zmc2V0Qm94LnNldChib3hJbik7Ci0gICAgfQotCi0gICAgLy8gZnJQb2ludCBnZXRPcmlnaW4oKSBjb25zdCB7Ci0gICAgLy8gICByZXR1cm4gb3JpZ2luOwotICAgIC8vIH0KLSAgICB2b2lkIGdldE9yaWdpbihmclBvaW50ICZpbikgY29uc3QgewotICAgICAgaW4uc2V0KG9yaWdpbik7Ci0gICAgfQotICAgIHZvaWQgc2V0T3JpZ2luKGNvbnN0IGZyUG9pbnQgJmluKSB7Ci0gICAgICBvcmlnaW4uc2V0KGluKTsKLSAgICB9Ci0KLQotICBwcm90ZWN0ZWQ6Ci0gICAgLy8gZnJCb3ggICAgICAgICAgIGJveDsKLSAgICBmckJveCAgICAgICAgICAgb2Zmc2V0Qm94OwotICAgIGZyUG9pbnQgICAgICAgICBvcmlnaW47Ci0gICAgZnJMYXllck51bSAgICAgIGxheWVyOwotICAgIGRyQmxvY2tPYmplY3QqICBvd25lcjsKLSAgfTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9kck9iai9kclZpYS5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9kck9iai9kclZpYS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZTg4OGYuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvZHJPYmovZHJWaWEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyogQXV0aG9yczogTHV0b25nIFdhbmcgYW5kIEJhbmdxaSBYdSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImRiL29iai9mclZpYS5oIgotI2luY2x1ZGUgImRiL2RyT2JqL2RyVmlhLmgiCi0jaW5jbHVkZSAiZGIvZHJPYmovZHJOZXQuaCIKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBmcjsKLQotCi1kclZpYTo6ZHJWaWEoY29uc3QgZnJWaWEgJmluKTogdmlhRGVmKGluLmdldFZpYURlZigpKSwgb3duZXIobnVsbHB0ciksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luTWF6ZUlkeCgpLCBlbmRNYXplSWR4KCkgewotICBpbi5nZXRPcmlnaW4ob3JpZ2luKTsKLX0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL2RyT2JqL2RyVmlhLmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9kck9iai9kclZpYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWFkNTc1Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL2RyT2JqL2RyVmlhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLyogQXV0aG9yczogTHV0b25nIFdhbmcgYW5kIEJhbmdxaSBYdSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBfRFJfVklBX0hfCi0jZGVmaW5lIF9EUl9WSUFfSF8KLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlICJkYi9kck9iai9kclJlZi5oIgotI2luY2x1ZGUgImRiL3RlY2gvZnJWaWFEZWYuaCIKLSNpbmNsdWRlICJkci9GbGV4TWF6ZVR5cGVzLmgiCi0KLW5hbWVzcGFjZSBmciB7Ci0gIGNsYXNzIGRyTmV0OwotICBjbGFzcyBmclZpYTsKLSAgY2xhc3MgZHJWaWE6IHB1YmxpYyBkclJlZiB7Ci0gIHB1YmxpYzoKLSAgICAvLyBjb25zdHJ1Y3RvcnMKLSAgICBkclZpYSgpOiBkclJlZigpIHt9Ci0gICAgZHJWaWEoZnJWaWFEZWYqIGluKTogZHJSZWYoKSwgb3JpZ2luKCksIHZpYURlZihpbiksIG93bmVyKG51bGxwdHIpLCBiZWdpbk1hemVJZHgoKSwgZW5kTWF6ZUlkeCgpIHt9Ci0gICAgZHJWaWEoY29uc3QgZHJWaWEgJmluKTogb3JpZ2luKGluLm9yaWdpbiksIHZpYURlZihpbi52aWFEZWYpLCBvd25lcihpbi5vd25lciksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luTWF6ZUlkeChpbi5iZWdpbk1hemVJZHgpLCBlbmRNYXplSWR4KGluLmVuZE1hemVJZHgpIHt9Ci0gICAgZHJWaWEoY29uc3QgZnJWaWEgJmluKTsKLSAgICAvLyBnZXR0ZXJzCi0gICAgZnJWaWFEZWYqIGdldFZpYURlZigpIGNvbnN0IHsKLSAgICAgIHJldHVybiB2aWFEZWY7Ci0gICAgfQotICAgIHZvaWQgZ2V0TGF5ZXIxQkJveChmckJveCAmYm94SW4pIGNvbnN0IHsKLSAgICAgIGF1dG8gJmZpZ3MgPSB2aWFEZWYtPmdldExheWVyMUZpZ3MoKTsKLSAgICAgIGJvb2wgaXNGaXJzdCA9IHRydWU7Ci0gICAgICBmckJveCBib3g7Ci0gICAgICBmckNvb3JkIHhsID0gMDsKLSAgICAgIGZyQ29vcmQgeWwgPSAwOwotICAgICAgZnJDb29yZCB4aCA9IDA7Ci0gICAgICBmckNvb3JkIHloID0gMDsKLSAgICAgIGZvciAoYXV0byAmZmlnOiBmaWdzKSB7Ci0gICAgICAgIGZpZy0+Z2V0QkJveChib3gpOwotICAgICAgICBpZiAoaXNGaXJzdCkgewotICAgICAgICAgIHhsID0gYm94LmxlZnQoKTsKLSAgICAgICAgICB5bCA9IGJveC5ib3R0b20oKTsKLSAgICAgICAgICB4aCA9IGJveC5yaWdodCgpOwotICAgICAgICAgIHloID0gYm94LnRvcCgpOwotICAgICAgICAgIGlzRmlyc3QgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB4bCA9IHN0ZDo6bWluKHhsLCBib3gubGVmdCgpKTsKLSAgICAgICAgICB5bCA9IHN0ZDo6bWluKHlsLCBib3guYm90dG9tKCkpOwotICAgICAgICAgIHhoID0gc3RkOjptYXgoeGgsIGJveC5yaWdodCgpKTsKLSAgICAgICAgICB5aCA9IHN0ZDo6bWF4KHloLCBib3gudG9wKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBib3hJbi5zZXQoeGwseWwseGgseWgpOwotICAgICAgZnJUcmFuc2Zvcm0geGZvcm07Ci0gICAgICB4Zm9ybS5zZXQob3JpZ2luKTsKLSAgICAgIGJveEluLnRyYW5zZm9ybSh4Zm9ybSk7Ci0gICAgfQotICAgIHZvaWQgZ2V0Q3V0QkJveChmckJveCAmYm94SW4pIGNvbnN0IHsKLSAgICAgIGF1dG8gJmZpZ3MgPSB2aWFEZWYtPmdldEN1dEZpZ3MoKTsKLSAgICAgIGJvb2wgaXNGaXJzdCA9IHRydWU7Ci0gICAgICBmckJveCBib3g7Ci0gICAgICBmckNvb3JkIHhsID0gMDsKLSAgICAgIGZyQ29vcmQgeWwgPSAwOwotICAgICAgZnJDb29yZCB4aCA9IDA7Ci0gICAgICBmckNvb3JkIHloID0gMDsKLSAgICAgIGZvciAoYXV0byAmZmlnOiBmaWdzKSB7Ci0gICAgICAgIGZpZy0+Z2V0QkJveChib3gpOwotICAgICAgICBpZiAoaXNGaXJzdCkgewotICAgICAgICAgIHhsID0gYm94LmxlZnQoKTsKLSAgICAgICAgICB5bCA9IGJveC5ib3R0b20oKTsKLSAgICAgICAgICB4aCA9IGJveC5yaWdodCgpOwotICAgICAgICAgIHloID0gYm94LnRvcCgpOwotICAgICAgICAgIGlzRmlyc3QgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB4bCA9IHN0ZDo6bWluKHhsLCBib3gubGVmdCgpKTsKLSAgICAgICAgICB5bCA9IHN0ZDo6bWluKHlsLCBib3guYm90dG9tKCkpOwotICAgICAgICAgIHhoID0gc3RkOjptYXgoeGgsIGJveC5yaWdodCgpKTsKLSAgICAgICAgICB5aCA9IHN0ZDo6bWF4KHloLCBib3gudG9wKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBib3hJbi5zZXQoeGwseWwseGgseWgpOwotICAgICAgZnJUcmFuc2Zvcm0geGZvcm07Ci0gICAgICB4Zm9ybS5zZXQob3JpZ2luKTsKLSAgICAgIGJveEluLnRyYW5zZm9ybSh4Zm9ybSk7Ci0gICAgfQotICAgIHZvaWQgZ2V0TGF5ZXIyQkJveChmckJveCAmYm94SW4pIGNvbnN0IHsKLSAgICAgIGF1dG8gJmZpZ3MgPSB2aWFEZWYtPmdldExheWVyMkZpZ3MoKTsKLSAgICAgIGJvb2wgaXNGaXJzdCA9IHRydWU7Ci0gICAgICBmckJveCBib3g7Ci0gICAgICBmckNvb3JkIHhsID0gMDsKLSAgICAgIGZyQ29vcmQgeWwgPSAwOwotICAgICAgZnJDb29yZCB4aCA9IDA7Ci0gICAgICBmckNvb3JkIHloID0gMDsKLSAgICAgIGZvciAoYXV0byAmZmlnOiBmaWdzKSB7Ci0gICAgICAgIGZpZy0+Z2V0QkJveChib3gpOwotICAgICAgICBpZiAoaXNGaXJzdCkgewotICAgICAgICAgIHhsID0gYm94LmxlZnQoKTsKLSAgICAgICAgICB5bCA9IGJveC5ib3R0b20oKTsKLSAgICAgICAgICB4aCA9IGJveC5yaWdodCgpOwotICAgICAgICAgIHloID0gYm94LnRvcCgpOwotICAgICAgICAgIGlzRmlyc3QgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB4bCA9IHN0ZDo6bWluKHhsLCBib3gubGVmdCgpKTsKLSAgICAgICAgICB5bCA9IHN0ZDo6bWluKHlsLCBib3guYm90dG9tKCkpOwotICAgICAgICAgIHhoID0gc3RkOjptYXgoeGgsIGJveC5yaWdodCgpKTsKLSAgICAgICAgICB5aCA9IHN0ZDo6bWF4KHloLCBib3gudG9wKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBib3hJbi5zZXQoeGwseWwseGgseWgpOwotICAgICAgZnJUcmFuc2Zvcm0geGZvcm07Ci0gICAgICB4Zm9ybS5zZXQob3JpZ2luKTsKLSAgICAgIGJveEluLnRyYW5zZm9ybSh4Zm9ybSk7Ci0gICAgfQotICAgIC8vIHNldHRlcnMKLSAgICB2b2lkIHNldFZpYURlZihmclZpYURlZiogaW4pIHsKLSAgICAgIHZpYURlZiA9IGluOwotICAgIH0KLSAgICAvLyBvdGhlcnMKLSAgICBmckJsb2NrT2JqZWN0RW51bSB0eXBlSWQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gZHJjVmlhOwotICAgIH0KLQotICAgIC8qIGZyb20gZnJSZWYKLSAgICAgKiBnZXRPcmllbnQKLSAgICAgKiBzZXRPcmllbnQKLSAgICAgKiBnZXRPcmlnaW4KLSAgICAgKiBzZXRPcmlnaW4KLSAgICAgKiBnZXRUcmFuc2Zvcm0KLSAgICAgKiBzZXRUcmFuc2Zvcm0KLSAgICAgKi8KLQotICAgIGZyT3JpZW50IGdldE9yaWVudCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiBmck9yaWVudCgpOwotICAgIH0KLSAgICB2b2lkIHNldE9yaWVudChjb25zdCBmck9yaWVudCAmdG1wT3JpZW50KSBvdmVycmlkZSB7Ci0gICAgICA7Ci0gICAgfQotICAgIHZvaWQgZ2V0T3JpZ2luKGZyUG9pbnQgJnRtcE9yaWdpbikgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgdG1wT3JpZ2luLnNldChvcmlnaW4pOwotICAgIH0KLSAgICB2b2lkIHNldE9yaWdpbihjb25zdCBmclBvaW50ICZ0bXBQb2ludCkgb3ZlcnJpZGUgewotICAgICAgb3JpZ2luLnNldCh0bXBQb2ludCk7Ci0gICAgfQotICAgIHZvaWQgZ2V0VHJhbnNmb3JtKGZyVHJhbnNmb3JtICZ4Zm9ybUluKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICB4Zm9ybUluLnNldChvcmlnaW4pOwotICAgIH0KLSAgICB2b2lkIHNldFRyYW5zZm9ybShjb25zdCBmclRyYW5zZm9ybSAmeGZvcm1Jbikgb3ZlcnJpZGUge30KLQotICAgIC8qIGZyb20gZnJQaW5GaWcKLSAgICAgKiBoYXNQaW4KLSAgICAgKiBnZXRQaW4KLSAgICAgKiBhZGRUb1BpbgotICAgICAqIHJlbW92ZUZyb21QaW4KLSAgICAgKi8KLSAgICBib29sIGhhc1BpbigpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiAob3duZXIpICYmIChvd25lci0+dHlwZUlkKCkgPT0gZHJjUGluKTsKLSAgICB9Ci0gICAgZHJQaW4qIGdldFBpbigpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGRyUGluKj4ob3duZXIpOwotICAgIH0KLSAgICB2b2lkIGFkZFRvUGluKGRyUGluKiBpbikgb3ZlcnJpZGUgewotICAgICAgb3duZXIgPSByZWludGVycHJldF9jYXN0PGRyQmxvY2tPYmplY3QqPihpbik7Ci0gICAgfQotICAgIHZvaWQgcmVtb3ZlRnJvbVBpbigpIG92ZXJyaWRlIHsKLSAgICAgIG93bmVyID0gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICAvKiBmcm9tIGZyQ29ubkZpZwotICAgICAqIGhhc05ldAotICAgICAqIGdldE5ldAotICAgICAqIGFkZFRvTmV0Ci0gICAgICogcmVtb3ZlRnJvbU5ldAotICAgICAqLwotICAgIGJvb2wgaGFzTmV0KCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIChvd25lcikgJiYgKG93bmVyLT50eXBlSWQoKSA9PSBkcmNOZXQpOwotICAgIH0KLSAgICBkck5ldCogZ2V0TmV0KCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8ZHJOZXQqPihvd25lcik7Ci0gICAgfQotICAgIHZvaWQgYWRkVG9OZXQoZHJOZXQqIGluKSBvdmVycmlkZSB7Ci0gICAgICBvd25lciA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZHJCbG9ja09iamVjdCo+KGluKTsKLSAgICB9Ci0gICAgdm9pZCByZW1vdmVGcm9tTmV0KCkgb3ZlcnJpZGUgewotICAgICAgb3duZXIgPSBudWxscHRyOwotICAgIH0KLQotICAgIC8qIGZyb20gZnJGaWcKLSAgICAgKiBnZXRCQm94Ci0gICAgICogbW92ZQotICAgICAqIG92ZXJsYXBzCi0gICAgICovCi0KLSAgICB2b2lkIGdldEJCb3ggKGZyQm94ICZib3hJbikgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgYXV0byAmbGF5ZXIxRmlncyA9IHZpYURlZi0+Z2V0TGF5ZXIxRmlncygpOwotICAgICAgYXV0byAmbGF5ZXIyRmlncyA9IHZpYURlZi0+Z2V0TGF5ZXIyRmlncygpOwotICAgICAgYXV0byAmY3V0RmlncyAgICA9IHZpYURlZi0+Z2V0Q3V0RmlncygpOwotICAgICAgYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKLSAgICAgIGZyQm94IGJveDsKLSAgICAgIGZyQ29vcmQgeGwgPSAwOwotICAgICAgZnJDb29yZCB5bCA9IDA7Ci0gICAgICBmckNvb3JkIHhoID0gMDsKLSAgICAgIGZyQ29vcmQgeWggPSAwOwotICAgICAgZm9yIChhdXRvICZmaWc6IGxheWVyMUZpZ3MpIHsKLSAgICAgICAgZmlnLT5nZXRCQm94KGJveCk7Ci0gICAgICAgIGlmIChpc0ZpcnN0KSB7Ci0gICAgICAgICAgeGwgPSBib3gubGVmdCgpOwotICAgICAgICAgIHlsID0gYm94LmJvdHRvbSgpOwotICAgICAgICAgIHhoID0gYm94LnJpZ2h0KCk7Ci0gICAgICAgICAgeWggPSBib3gudG9wKCk7Ci0gICAgICAgICAgaXNGaXJzdCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHhsID0gc3RkOjptaW4oeGwsIGJveC5sZWZ0KCkpOwotICAgICAgICAgIHlsID0gc3RkOjptaW4oeWwsIGJveC5ib3R0b20oKSk7Ci0gICAgICAgICAgeGggPSBzdGQ6Om1heCh4aCwgYm94LnJpZ2h0KCkpOwotICAgICAgICAgIHloID0gc3RkOjptYXgoeWgsIGJveC50b3AoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGZvciAoYXV0byAmZmlnOiBsYXllcjJGaWdzKSB7Ci0gICAgICAgIGZpZy0+Z2V0QkJveChib3gpOwotICAgICAgICBpZiAoaXNGaXJzdCkgewotICAgICAgICAgIHhsID0gYm94LmxlZnQoKTsKLSAgICAgICAgICB5bCA9IGJveC5ib3R0b20oKTsKLSAgICAgICAgICB4aCA9IGJveC5yaWdodCgpOwotICAgICAgICAgIHloID0gYm94LnRvcCgpOwotICAgICAgICAgIGlzRmlyc3QgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB4bCA9IHN0ZDo6bWluKHhsLCBib3gubGVmdCgpKTsKLSAgICAgICAgICB5bCA9IHN0ZDo6bWluKHlsLCBib3guYm90dG9tKCkpOwotICAgICAgICAgIHhoID0gc3RkOjptYXgoeGgsIGJveC5yaWdodCgpKTsKLSAgICAgICAgICB5aCA9IHN0ZDo6bWF4KHloLCBib3gudG9wKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBmb3IgKGF1dG8gJmZpZzogY3V0RmlncykgewotICAgICAgICBmaWctPmdldEJCb3goYm94KTsKLSAgICAgICAgaWYgKGlzRmlyc3QpIHsKLSAgICAgICAgICB4bCA9IGJveC5sZWZ0KCk7Ci0gICAgICAgICAgeWwgPSBib3guYm90dG9tKCk7Ci0gICAgICAgICAgeGggPSBib3gucmlnaHQoKTsKLSAgICAgICAgICB5aCA9IGJveC50b3AoKTsKLSAgICAgICAgICBpc0ZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgeGwgPSBzdGQ6Om1pbih4bCwgYm94LmxlZnQoKSk7Ci0gICAgICAgICAgeWwgPSBzdGQ6Om1pbih5bCwgYm94LmJvdHRvbSgpKTsKLSAgICAgICAgICB4aCA9IHN0ZDo6bWF4KHhoLCBib3gucmlnaHQoKSk7Ci0gICAgICAgICAgeWggPSBzdGQ6Om1heCh5aCwgYm94LnRvcCgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYm94SW4uc2V0KHhsLHlsLHhoLHloKTsKLSAgICAgIGZyVHJhbnNmb3JtIHhmb3JtOwotICAgICAgeGZvcm0uc2V0KG9yaWdpbik7Ci0gICAgICAvL2NvdXQgPDwib3JpZ2luICIgPDxvcmlnaW4ueCgpIDw8IiAiIDw8b3JpZ2luLnkoKSA8PGVuZGw7Ci0gICAgICBib3hJbi50cmFuc2Zvcm0oeGZvcm0pOwotICAgIH0KLSAgICAKLSAgICAvL3ZvaWQgc2V0SXRlcihmckxpc3RJdGVyPHN0ZDo6dW5pcXVlX3B0cjxmclZpYT4gPiYgaW4pIHsKLSAgICAvLyAgaXRlciA9IGluOwotICAgIC8vfQotICAgIC8vZnJMaXN0SXRlcjxzdGQ6OnVuaXF1ZV9wdHI8ZnJWaWE+ID4gZ2V0SXRlcigpIGNvbnN0IHsKLSAgICAvLyAgcmV0dXJuIGl0ZXI7Ci0gICAgLy99Ci0gICAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgc2hhcGUgaXMgc3RvcmVkIGluIG5ldCBmaXhlZCBvYmogb3Igcm91dGVkIG9iagotICAgIC8vYm9vbCBpc0V4dCgpIGNvbnN0IHsKLSAgICAvLyAgcmV0dXJuIGV4dDsKLSAgICAvL30KLSAgICAvL3ZvaWQgc2V0RXh0KGJvb2wgaW4pIHsKLSAgICAvLyAgZXh0ID0gaW47Ci0gICAgLy99Ci0gICAgYm9vbCBoYXNNYXplSWR4KCkgY29uc3QgewotICAgICAgcmV0dXJuICghYmVnaW5NYXplSWR4LmVtcHR5KCkpOwotICAgIH0KLSAgICB2b2lkIGdldE1hemVJZHgoRmxleE1hemVJZHggJmJpLCBGbGV4TWF6ZUlkeCAmZWkpIGNvbnN0IHsKLSAgICAgIGJpLnNldChiZWdpbk1hemVJZHgpOwotICAgICAgZWkuc2V0KGVuZE1hemVJZHgpOwotICAgIH0KLSAgICB2b2lkIHNldE1hemVJZHgoY29uc3QgRmxleE1hemVJZHggJmJpLCBjb25zdCBGbGV4TWF6ZUlkeCAmZWkpIHsKLSAgICAgIGJlZ2luTWF6ZUlkeC5zZXQoYmkpOwotICAgICAgZW5kTWF6ZUlkeC5zZXQoZWkpOwotICAgIH0KLQotICBwcm90ZWN0ZWQ6Ci0gICAgZnJQb2ludCAgICAgICAgb3JpZ2luOwotICAgIGZyVmlhRGVmKiAgICAgIHZpYURlZjsKLSAgICBkckJsb2NrT2JqZWN0KiBvd25lcjsKLSAgICAvL2ZyTGlzdEl0ZXI8c3RkOjp1bmlxdWVfcHRyPGZyVmlhPiA+IGl0ZXI7Ci0gICAgLy9ib29sICAgICAgICAgICBleHQ7Ci0gICAgRmxleE1hemVJZHggICAgYmVnaW5NYXplSWR4OwotICAgIEZsZXhNYXplSWR4ICAgIGVuZE1hemVJZHg7Ci0gIH07Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvaW5mcmEvTWFrZWZpbGUgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9pbmZyYS9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAzY2VkZi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9pbmZyYS9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgc3ViZGlyIGFuZCBvYmplY3RzIGluIGN1cnJlbnQgZGlyCi1TVUJESVJTCT0gCi1PQkpFQ1RTCT0gZnJQb2ludC5vIGZyQm94Lm8gZnJUaW1lX2hlbHBlci5vIGZyVGltZS5vCi0KLQotYWxsOnN1YmRpcnMgJHtPQkpFQ1RTfQotCi0JCi1jbGVhbjpjbGVhbnN1YmRpcnMKLQlybSAtZiAke09CSkVDVFN9Ci0JCi1pbmNsdWRlICR7TUFLRUlOQ0xVREV9CmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9pbmZyYS9mckJveC5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9pbmZyYS9mckJveC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYWQ0M2EuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvaW5mcmEvZnJCb3guY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyogQXV0aG9yczogTHV0b25nIFdhbmcgYW5kIEJhbmdxaSBYdSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImRiL2luZnJhL2ZyQm94LmgiCi0jaW5jbHVkZSAiZGIvaW5mcmEvZnJUcmFuc2Zvcm0uaCIKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBmcjsKLQotdm9pZCBmckJveDo6dHJhbnNmb3JtKGNvbnN0IGZyVHJhbnNmb3JtICZ4Zm9ybSkgewotICAvL2F1dG8gbGwgPSBiQm94Lmxvd2VyTGVmdC50cmFuc2Zvcm0oeGZvcm0pOwotICAvL2xsLnRyYW5zZm9ybSh4Zm9ybSk7Ci0gIC8vYXV0byB1ciA9IGJCb3gudXBwZXJSaWdodC50cmFuc2Zvcm0oeGZvcm0pOwotICAvL3VyLnRyYW5zZm9ybSh4Zm9ybSk7Ci0gIC8vdGhpcy0+c2V0KGxsLCB1cik7Ci0gIGxsLnRyYW5zZm9ybSh4Zm9ybSk7Ci0gIHVyLnRyYW5zZm9ybSh4Zm9ybSk7Ci0gIHRoaXMtPnNldChsbCwgdXIpOwotfQotCi1ib29sIGZyQm94OjpvdmVybGFwcyhjb25zdCBmckJveCAmYm94SW4sIGJvb2wgaW5jRWRnZXMpIGNvbnN0IHsKLSAgaWYgKGluY0VkZ2VzKSB7Ci0gICAgcmV0dXJuICEocmlnaHQoKSA8IGJveEluLmxlZnQoKSAgIHx8IC8vIGxlZnQKLSAgICAgICAgICAgICB0b3AoKSAgIDwgYm94SW4uYm90dG9tKCkgfHwgLy8gYm90dG9tCi0gICAgICAgICAgICAgbGVmdCgpICA+IGJveEluLnJpZ2h0KCkgIHx8IC8vIHJpZ2h0Ci0gICAgICAgICAgICAgYm90dG9tKCk+IGJveEluLnRvcCgpICAgICAgICAvLyB0b3AKLSAgICAgICAgICAgICApOwotICB9IGVsc2UgewotICAgIHJldHVybiAhKHJpZ2h0KCkgPD0gYm94SW4ubGVmdCgpICAgfHwgLy8gbGVmdAotICAgICAgICAgICAgIHRvcCgpICAgPD0gYm94SW4uYm90dG9tKCkgfHwgLy8gYm90dG9tCi0gICAgICAgICAgICAgbGVmdCgpICA+PSBib3hJbi5yaWdodCgpICB8fCAvLyByaWdodAotICAgICAgICAgICAgIGJvdHRvbSgpPj0gYm94SW4udG9wKCkgICAgICAgIC8vIHRvcAotICAgICAgICAgICAgICk7Ci0gIH0KLX0KLQotdm9pZCBmckJveDo6YmxvYXQoY29uc3QgZnJDb29yZCBkaXN0YW5jZSwgZnJCb3ggJmJveE91dCkgY29uc3QgewotICBib3hPdXQuc2V0KGxlZnQoKSAtIGRpc3RhbmNlLCBib3R0b20oKSAtIGRpc3RhbmNlLCByaWdodCgpICsgZGlzdGFuY2UsIHRvcCgpICsgZGlzdGFuY2UpOwotfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvaW5mcmEvZnJCb3guaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL2luZnJhL2ZyQm94LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMTg5MTguLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvaW5mcmEvZnJCb3guaAorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIF9GUl9CT1hfSF8KLSNkZWZpbmUgX0ZSX0JPWF9IXwotCi0jaW5jbHVkZSAiZGIvaW5mcmEvZnJQb2ludC5oIgotI2luY2x1ZGUgImZyQmFzZVR5cGVzLmgiCi0KLW5hbWVzcGFjZSBmciB7Ci0gIGNsYXNzIGZyQm94IHsKLSAgcHVibGljOgotICAgIC8vIGNvbnN0cnVjdG9yCi0gICAgZnJCb3goKTogbGwoKSwgdXIoKSB7fQotICAgIGZyQm94KGNvbnN0IGZyQm94ICZ0bXBCb3gpOiBsbCh0bXBCb3gubGwpLCB1cih0bXBCb3gudXIpIHt9Ci0gICAgZnJCb3goY29uc3QgYm94X3QgJmluKSB7Ci0gICAgICBhdXRvIG1pbkNvcm5lciA9IGluLm1pbl9jb3JuZXIoKTsKLSAgICAgIGF1dG8gbWF4Q29ybmVyID0gaW4ubWF4X2Nvcm5lcigpOwotICAgICAgc2V0KG1pbkNvcm5lci54KCksIG1pbkNvcm5lci55KCksIG1heENvcm5lci54KCksIG1heENvcm5lci55KCkpOwotICAgIH0KLSAgICBmckJveChmckNvb3JkIGxseCwgZnJDb29yZCBsbHksIGZyQ29vcmQgdXJ4LCBmckNvb3JkIHVyeSkgewotICAgICAgbGwuc2V0KChsbHggPiB1cngpID8gdXJ4IDogbGx4LAotICAgICAgICAgICAgICAgICAgICAobGx5ID4gdXJ5KSA/IHVyeSA6IGxseSk7Ci0gICAgICB1ci5zZXQoKGxseCA+IHVyeCkgPyBsbHggOiB1cngsIAotICAgICAgICAgICAgICAgICAgICAgKGxseSA+IHVyeSkgPyBsbHkgOiB1cnkpOwotICAgIH0KLSAgICBmckJveChjb25zdCBmclBvaW50ICZ0bXBMb3dlckxlZnQsIGNvbnN0IGZyUG9pbnQgJnRtcFVwcGVyUmlnaHQpIAotICAgICAgOiBmckJveCh0bXBMb3dlckxlZnQueCgpLCB0bXBMb3dlckxlZnQueSgpLCB0bXBVcHBlclJpZ2h0LngoKSwgdG1wVXBwZXJSaWdodC55KCkpIHt9Ci0gICAgLy8gc2V0dGVycwotICAgIHZvaWQgc2V0KGNvbnN0IGZyQm94ICZ0bXBCb3gpIHsKLSAgICAgIGxsLnNldCh0bXBCb3gubGwpOwotICAgICAgdXIuc2V0KHRtcEJveC51cik7Ci0gICAgfQotICAgIHZvaWQgc2V0KGZyQ29vcmQgbGx4LCBmckNvb3JkIGxseSwgZnJDb29yZCB1cngsIGZyQ29vcmQgdXJ5KSB7Ci0gICAgICBsbC5zZXQoKGxseCA+IHVyeCkgPyB1cnggOiBsbHgsCi0gICAgICAgICAgICAgKGxseSA+IHVyeSkgPyB1cnkgOiBsbHkpOwotICAgICAgdXIuc2V0KChsbHggPiB1cngpID8gbGx4IDogdXJ4LCAKLSAgICAgICAgICAgICAobGx5ID4gdXJ5KSA/IGxseSA6IHVyeSk7Ci0gICAgfQotICAgIHZvaWQgc2V0KGNvbnN0IGZyUG9pbnQgJnRtcExvd2VyTGVmdCwgY29uc3QgZnJQb2ludCAmdG1wVXBwZXJSaWdodCkgewotICAgICAgc2V0KHRtcExvd2VyTGVmdC54KCksIHRtcExvd2VyTGVmdC55KCksIHRtcFVwcGVyUmlnaHQueCgpLCB0bXBVcHBlclJpZ2h0LnkoKSk7Ci0gICAgfQotICAgIHZvaWQgc2V0VW5zYWZlKGNvbnN0IGZyUG9pbnQgJnRtcExvd2VyTGVmdCwgY29uc3QgZnJQb2ludCAmdG1wVXBwZXJSaWdodCkgewotICAgICAgbGwuc2V0KHRtcExvd2VyTGVmdCk7Ci0gICAgICB1ci5zZXQodG1wVXBwZXJSaWdodCk7Ci0gICAgfQotICAgIC8vIGdldHRlcnMKLSAgICBmckNvb3JkIGxlZnQoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbGwueCgpOwotICAgIH0KLSAgICBmckNvb3JkIGJvdHRvbSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBsbC55KCk7Ci0gICAgfQotICAgIGZyQ29vcmQgcmlnaHQoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gdXIueCgpOwotICAgIH0KLSAgICBmckNvb3JkIHRvcCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiB1ci55KCk7Ci0gICAgfQotICAgIGZyUG9pbnQmIGxvd2VyTGVmdCgpIHsKLSAgICAgIHJldHVybiBsbDsKLSAgICB9Ci0gICAgY29uc3QgZnJQb2ludCYgbG93ZXJMZWZ0KCkgY29uc3QgewotICAgICAgcmV0dXJuIGxsOwotICAgIH0KLSAgICBmclBvaW50JiB1cHBlclJpZ2h0KCkgewotICAgICAgcmV0dXJuIHVyOwotICAgIH0KLSAgICBjb25zdCBmclBvaW50JiB1cHBlclJpZ2h0KCkgY29uc3QgewotICAgICAgcmV0dXJuIHVyOwotICAgIH0KLSAgICBmckNvb3JkIHdpZHRoKCkgY29uc3QgewotICAgICAgZnJDb29yZCB4U3BhbiA9IHJpZ2h0KCkgLSBsZWZ0KCk7Ci0gICAgICBmckNvb3JkIHlTcGFuID0gdG9wKCkgICAtIGJvdHRvbSgpOwotICAgICAgcmV0dXJuICh4U3BhbiA+IHlTcGFuKSA/IHlTcGFuIDogeFNwYW47Ci0gICAgfQotICAgIGZyQ29vcmQgbGVuZ3RoKCkgY29uc3QgewotICAgICAgZnJDb29yZCB4U3BhbiA9IHJpZ2h0KCkgLSBsZWZ0KCk7Ci0gICAgICBmckNvb3JkIHlTcGFuID0gdG9wKCkgICAtIGJvdHRvbSgpOwotICAgICAgcmV0dXJuICh4U3BhbiA+IHlTcGFuKSA/IHhTcGFuIDogeVNwYW47Ci0gICAgfQotICAgIGJvb2wgY29udGFpbnMoY29uc3QgZnJCb3ggJmJveCwgYm9vbCBpbmNFZGdlcyA9IHRydWUpIGNvbnN0IHs7Ci0gICAgICBpZiAoaW5jRWRnZXMpIHsKLSAgICAgICAgcmV0dXJuIChib3gucmlnaHQoKSA8PSB1ci54KCkgJiYgYm94LmxlZnQoKSAgPj0gbGwueCgpICYmCi0gICAgICAgICAgICAgICAgYm94LnRvcCgpICAgPD0gdXIueSgpICYmIGJveC5ib3R0b20oKT49IGxsLnkoKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gKGJveC5yaWdodCgpIDwgdXIueCgpICYmIGJveC5sZWZ0KCkgICA+IGxsLngoKSAmJgotICAgICAgICAgICAgICAgIGJveC50b3AoKSAgIDwgdXIueSgpICYmIGJveC5ib3R0b20oKSA+IGxsLnkoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGJvb2wgY29udGFpbnMoY29uc3QgZnJQb2ludCAmaW4sIGJvb2wgaW5jRWRnZXMgPSB0cnVlKSBjb25zdCB7Ci0gICAgICBpZiAoaW5jRWRnZXMpIHsKLSAgICAgICAgcmV0dXJuIGxsLngoKSA8PSBpbi54KCkgJiYgaW4ueCgpIDw9IHVyLngoKSAmJgotICAgICAgICAgICAgICAgbGwueSgpIDw9IGluLnkoKSAmJiBpbi55KCkgPD0gdXIueSgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGxsLngoKSA8IGluLngoKSAmJiBpbi54KCkgPCB1ci54KCkgJiYKLSAgICAgICAgICAgICAgIGxsLnkoKSA8IGluLnkoKSAmJiBpbi55KCkgPCB1ci55KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHZvaWQgdHJhbnNmb3JtKGNvbnN0IGZyVHJhbnNmb3JtICZ4Zm9ybSk7Ci0gICAgYm9vbCBvdmVybGFwcyhjb25zdCBmckJveCAmYm94SW4sIGJvb2wgaW5jRWRnZXMgPSB0cnVlKSBjb25zdDsKLSAgICB2b2lkIGJsb2F0KGNvbnN0IGZyQ29vcmQgZGlzdGFuY2UsIGZyQm94ICZib3hPdXQpIGNvbnN0OwotICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBmckJveCAmYm94SW4pIGNvbnN0IHsKLSAgICAgIHJldHVybiAobGwgPT0gYm94SW4ubGwpICYmICh1ciA9PSBib3hJbi51cik7Ci0gICAgfQotICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IGZyQm94ICZib3hJbikgY29uc3QgewotICAgICAgaWYgKCEobGwgPT0gYm94SW4ubG93ZXJMZWZ0KCkpKSB7Ci0gICAgICAgIHJldHVybiAobGwgPCBib3hJbi5sb3dlckxlZnQoKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gKHVyIDwgYm94SW4udXBwZXJSaWdodCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gIHByb3RlY3RlZDoKLSAgICBmclBvaW50IGxsLCB1cjsKLSAgfTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9pbmZyYS9mck9yaWVudC5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvaW5mcmEvZnJPcmllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY0ZjMwMC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9pbmZyYS9mck9yaWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX0ZSX09SSUVOVF9IXwotI2RlZmluZSBfRlJfT1JJRU5UX0hfCi0KLSNpbmNsdWRlICJmckJhc2VUeXBlcy5oIgotCi1uYW1lc3BhY2UgZnIgewotICBjbGFzcyBmck9yaWVudCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBjb25zdHJ1Y3RvcgotICAgIGZyT3JpZW50KCk6IG9yaWVudChmcmNSMCkge30KLSAgICBmck9yaWVudChjb25zdCBmck9yaWVudCAmdG1wT3JpZW50KTogb3JpZW50KHRtcE9yaWVudC5vcmllbnQpIHt9Ci0gICAgZnJPcmllbnQoZnJPcmllbnRFbnVtIHRtcE9yaWVudCk6IG9yaWVudCh0bXBPcmllbnQpIHt9Ci0gICAgZnJPcmllbnQoY29uc3QgZnJTdHJpbmcgJm5hbWUpIHsKLSAgICAgIGlmIChuYW1lID09IGZyU3RyaW5nKCJmcmNSOTAiKSkgewotICAgICAgICBvcmllbnQgPSBmcmNSOTA7Ci0gICAgICB9IGVsc2UgaWYgKG5hbWUgPT0gZnJTdHJpbmcoImZyY1IxODAiKSkgewotICAgICAgICBvcmllbnQgPSBmcmNSMTgwOwotICAgICAgfSBlbHNlIGlmIChuYW1lID09IGZyU3RyaW5nKCJmcmNSMjcwIikpIHsKLSAgICAgICAgb3JpZW50ID0gZnJjUjI3MDsKLSAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSBmclN0cmluZygiZnJjTVkiKSkgewotICAgICAgICBvcmllbnQgPSBmcmNNWTsKLSAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSBmclN0cmluZygiZnJjTVlSOTAiKSkgewotICAgICAgICBvcmllbnQgPSBmcmNNWVI5MDsKLSAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSBmclN0cmluZygiZnJjTVgiKSkgewotICAgICAgICBvcmllbnQgPSBmcmNNWDsKLSAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSBmclN0cmluZygiZnJjTVhSOTAiKSkgewotICAgICAgICBvcmllbnQgPSBmcmNNWFI5MDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG9yaWVudCA9IGZyY1IwOwotICAgICAgfQotICAgIH0KLSAgICAvLyBzZXR0ZXJzCi0gICAgdm9pZCBzZXQoZnJPcmllbnRFbnVtIHRtcE9yaWVudCkgewotICAgICAgb3JpZW50ID0gdG1wT3JpZW50OwotICAgIH0KLSAgICB2b2lkIHNldChjb25zdCBmck9yaWVudCAmdG1wT3JpZW50KSB7Ci0gICAgICBvcmllbnQgPSB0bXBPcmllbnQub3JpZW50OwotICAgIH0KLSAgICB2b2lkIHNldChjb25zdCBmclN0cmluZyAmbmFtZSkgewotICAgICAgaWYgKG5hbWUgPT0gZnJTdHJpbmcoImZyY1I5MCIpKSB7Ci0gICAgICAgIG9yaWVudCA9IGZyY1I5MDsKLSAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSBmclN0cmluZygiZnJjUjE4MCIpKSB7Ci0gICAgICAgIG9yaWVudCA9IGZyY1IxODA7Ci0gICAgICB9IGVsc2UgaWYgKG5hbWUgPT0gZnJTdHJpbmcoImZyY1IyNzAiKSkgewotICAgICAgICBvcmllbnQgPSBmcmNSMjcwOwotICAgICAgfSBlbHNlIGlmIChuYW1lID09IGZyU3RyaW5nKCJmcmNNWSIpKSB7Ci0gICAgICAgIG9yaWVudCA9IGZyY01ZOwotICAgICAgfSBlbHNlIGlmIChuYW1lID09IGZyU3RyaW5nKCJmcmNNWVI5MCIpKSB7Ci0gICAgICAgIG9yaWVudCA9IGZyY01ZUjkwOwotICAgICAgfSBlbHNlIGlmIChuYW1lID09IGZyU3RyaW5nKCJmcmNNWCIpKSB7Ci0gICAgICAgIG9yaWVudCA9IGZyY01YOwotICAgICAgfSBlbHNlIGlmIChuYW1lID09IGZyU3RyaW5nKCJmcmNNWFI5MCIpKSB7Ci0gICAgICAgIG9yaWVudCA9IGZyY01YUjkwOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3JpZW50ID0gZnJjUjA7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIGdldHRlcnMKLSAgICAvL2ZyT3JpZW50RW51bSBnZXQoKSBjb25zdCB7Ci0gICAgLy8gIHJldHVybiBvcmllbnQ7Ci0gICAgLy99Ci0gICAgZnJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IHsKLSAgICAgIHN3aXRjaChvcmllbnQpIHsKLSAgICAgICAgLy9jYXNlIGZyY1IwICAgIDogcmV0dXJuIGZyU3RyaW5nKCJmcmNSMCIpOwotICAgICAgICBjYXNlIGZyY1I5MCAgIDogcmV0dXJuIGZyU3RyaW5nKCJmcmNSOTAiKTsKLSAgICAgICAgY2FzZSBmcmNSMTgwICA6IHJldHVybiBmclN0cmluZygiZnJjUjE4MCIpOwotICAgICAgICBjYXNlIGZyY1IyNzAgIDogcmV0dXJuIGZyU3RyaW5nKCJmcmNSMjcwIik7Ci0gICAgICAgIGNhc2UgZnJjTVkgICAgOiByZXR1cm4gZnJTdHJpbmcoImZyY01ZIik7Ci0gICAgICAgIGNhc2UgZnJjTVlSOTAgOiByZXR1cm4gZnJTdHJpbmcoImZyY01ZUjkwIik7Ci0gICAgICAgIGNhc2UgZnJjTVggICAgOiByZXR1cm4gZnJTdHJpbmcoImZyY01YIik7Ci0gICAgICAgIGNhc2UgZnJjTVhSOTAgOiByZXR1cm4gZnJTdHJpbmcoImZyY01YUjkwIik7Ci0gICAgICAgIGRlZmF1bHQgICAgICAgOiByZXR1cm4gZnJTdHJpbmcoImZyY1IwIik7Ci0gICAgICB9Ci0gICAgfQotICAgIHZvaWQgZ2V0TmFtZShmclN0cmluZyAmbmFtZSkgY29uc3QgewotICAgICAgc3dpdGNoKG9yaWVudCkgewotICAgICAgICAvL2Nhc2UgZnJjUjAgICAgOiByZXR1cm4gZnJTdHJpbmcoImZyY1IwIik7Ci0gICAgICAgIGNhc2UgZnJjUjkwICAgOiAKLSAgICAgICAgICBuYW1lID0gImZyY1I5MCI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgZnJjUjE4MCAgOiAKLSAgICAgICAgICBuYW1lID0gImZyY1IxODAiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGZyY1IyNzAgIDogCi0gICAgICAgICAgbmFtZSA9ICJmcmNSMjcwIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBmcmNNWSAgICA6IAotICAgICAgICAgIG5hbWUgPSAiZnJjTVkiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGZyY01ZUjkwIDogCi0gICAgICAgICAgbmFtZSA9ICJmcmNNWVI5MCI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgZnJjTVggICAgOiAKLSAgICAgICAgICBuYW1lID0gImZyY01YIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBmcmNNWFI5MCA6IAotICAgICAgICAgIG5hbWUgPSAiZnJjTVhSOTAiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0ICAgICAgIDogCi0gICAgICAgICAgbmFtZSA9ICJmcmNSMCI7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIG92ZXJsb2FkcwotICAgIC8vZnJPcmllbnRFbnVtIG9wZXJhdG9yKCkoKSBjb25zdCB7Ci0gICAgLy8gIHJldHVybiBvcmllbnQ7Ci0gICAgLy99Ci0gICAgb3BlcmF0b3IgZnJPcmllbnRFbnVtKCkgY29uc3QgewotICAgICAgcmV0dXJuIG9yaWVudDsKLSAgICB9Ci0gIHByb3RlY3RlZDoKLSAgICBmck9yaWVudEVudW0gb3JpZW50OwotICB9OwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL2luZnJhL2ZyUG9pbnQuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvaW5mcmEvZnJQb2ludC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYTBmNmQuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvaW5mcmEvZnJQb2ludC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiZGIvaW5mcmEvZnJQb2ludC5oIgotI2luY2x1ZGUgImRiL2luZnJhL2ZyVHJhbnNmb3JtLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgZnI7Ci0KLXZvaWQgZnJQb2ludDo6dHJhbnNmb3JtKGNvbnN0IGZyVHJhbnNmb3JtICZ4Zm9ybSkgewotICBmckNvb3JkIHRtcFggPSAwOwotICBmckNvb3JkIHRtcFkgPSAwOwotICAvL2NvdXQgPDx4Zm9ybS5vcmllbnQoKSA8PGVuZGw7Ci0gIHN3aXRjaCh4Zm9ybS5vcmllbnQoKSkgewotICAgIGNhc2UgZnJjUjkwIDoKLSAgICAgIHRtcFggPSB4Zm9ybS54T2Zmc2V0KCkgLSB5Q29vcmQ7Ci0gICAgICB0bXBZID0geGZvcm0ueU9mZnNldCgpICsgeENvb3JkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBmcmNSMTgwIDoKLSAgICAgIHRtcFggPSB4Zm9ybS54T2Zmc2V0KCkgLSB4Q29vcmQ7Ci0gICAgICB0bXBZID0geGZvcm0ueU9mZnNldCgpIC0geUNvb3JkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBmcmNSMjcwIDoKLSAgICAgIHRtcFggPSB4Zm9ybS54T2Zmc2V0KCkgKyB5Q29vcmQ7Ci0gICAgICB0bXBZID0geGZvcm0ueU9mZnNldCgpIC0geENvb3JkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBmcmNNWSA6Ci0gICAgICB0bXBYID0geGZvcm0ueE9mZnNldCgpIC0geENvb3JkOwotICAgICAgdG1wWSA9IHhmb3JtLnlPZmZzZXQoKSArIHlDb29yZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgZnJjTVlSOTAgOiAvLyBNWSwgcm90YXRlLCB0aGVuIHNoaWZ0IAotICAgICAgdG1wWCA9IHhmb3JtLnhPZmZzZXQoKSAtIHlDb29yZDsKLSAgICAgIHRtcFkgPSB4Zm9ybS55T2Zmc2V0KCkgLSB4Q29vcmQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGZyY01YIDoKLSAgICAgIHRtcFggPSB4Zm9ybS54T2Zmc2V0KCkgKyB4Q29vcmQ7Ci0gICAgICB0bXBZID0geGZvcm0ueU9mZnNldCgpIC0geUNvb3JkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBmcmNNWFI5MCA6IC8vIE1YLCByb3RhdGUsIHRoZW4gc2hpZnQKLSAgICAgIHRtcFggPSB4Zm9ybS54T2Zmc2V0KCkgKyB5Q29vcmQ7Ci0gICAgICB0bXBZID0geGZvcm0ueU9mZnNldCgpICsgeENvb3JkOwotICAgICAgYnJlYWs7Ci0gICAgLy8gZnJjUjAKLSAgICBkZWZhdWx0IDoKLSAgICAgIHRtcFggPSB4Zm9ybS54T2Zmc2V0KCkgKyB4Q29vcmQ7Ci0gICAgICB0bXBZID0geGZvcm0ueU9mZnNldCgpICsgeUNvb3JkOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgeENvb3JkID0gdG1wWDsKLSAgeUNvb3JkID0gdG1wWTsKLX0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL2luZnJhL2ZyUG9pbnQuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL2luZnJhL2ZyUG9pbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdkMzA1Mi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9pbmZyYS9mclBvaW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIF9GUl9QT0lOVF9IXwotI2RlZmluZSBfRlJfUE9JTlRfSF8KLQotI2luY2x1ZGUgImZyQmFzZVR5cGVzLmgiCi0KLW5hbWVzcGFjZSBmciB7Ci0gIGNsYXNzIGZyVHJhbnNmb3JtOwotCi0gIGNsYXNzIGZyUG9pbnQgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3JzCi0gICAgZnJQb2ludCgpOiB4Q29vcmQoMCksIHlDb29yZCgwKSB7fQotICAgIGZyUG9pbnQoY29uc3QgZnJQb2ludCAmdG1wUG9pbnQpOiB4Q29vcmQodG1wUG9pbnQueENvb3JkKSwgeUNvb3JkKHRtcFBvaW50LnlDb29yZCkge30KLSAgICBmclBvaW50KGNvbnN0IGZyQ29vcmQgdG1wWCwgY29uc3QgZnJDb29yZCB0bXBZKQotICAgICAgOiB4Q29vcmQodG1wWCksIHlDb29yZCh0bXBZKSB7fTsKLSAgICAvLyBzZXR0ZXJzCi0gICAgdm9pZCBzZXQoY29uc3QgZnJQb2ludCAmdG1wUG9pbnQpIHsKLSAgICAgIHhDb29yZCA9IHRtcFBvaW50LnhDb29yZDsKLSAgICAgIHlDb29yZCA9IHRtcFBvaW50LnlDb29yZDsKLSAgICB9Ci0gICAgdm9pZCBzZXQoY29uc3QgZnJDb29yZCB0bXBYLCBjb25zdCBmckNvb3JkIHRtcFkpIHsKLSAgICAgIHhDb29yZCA9IHRtcFg7Ci0gICAgICB5Q29vcmQgPSB0bXBZOwotICAgIH0KLSAgICAvLyBnZXR0ZXJzCi0gICAgZnJDb29yZCB4KCkgY29uc3QgewotICAgICAgcmV0dXJuIHhDb29yZDsKLSAgICB9Ci0gICAgZnJDb29yZCB5KCkgY29uc3QgewotICAgICAgcmV0dXJuIHlDb29yZDsKLSAgICB9Ci0gICAgLy8gb3RoZXJzCi0gICAgdm9pZCB0cmFuc2Zvcm0oY29uc3QgZnJUcmFuc2Zvcm0gJnhmb3JtKTsKLSAgICBib29sIG9wZXJhdG9yPChjb25zdCBmclBvaW50ICZwSW4pIGNvbnN0IHsKLSAgICAgIHJldHVybiAoeENvb3JkID09IHBJbi54Q29vcmQpID8gKHlDb29yZCA8IHBJbi55Q29vcmQpIDogKHhDb29yZCA8IHBJbi54Q29vcmQpOwotICAgIH0KLSAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgZnJQb2ludCAmcEluKSBjb25zdCB7Ci0gICAgICByZXR1cm4gKHhDb29yZCA9PSBwSW4ueENvb3JkKSAmJiAoeUNvb3JkID09IHBJbi55Q29vcmQpOwotICAgIH0KLSAgcHJvdGVjdGVkOgotICAgIGZyQ29vcmQgeENvb3JkLCB5Q29vcmQ7Ci0gIH07Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvaW5mcmEvZnJQcmVmUm91dGluZ0Rpci5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvaW5mcmEvZnJQcmVmUm91dGluZ0Rpci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWJlZmJlLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL2luZnJhL2ZyUHJlZlJvdXRpbmdEaXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX0ZSX1BSRUZST1VUSU5HRElSX0hfCi0jZGVmaW5lIF9GUl9QUkVGUk9VVElOR0RJUl9IXwotCi0jaW5jbHVkZSAiZnJCYXNlVHlwZXMuaCIKLQotbmFtZXNwYWNlIGZyIHsKLSAgY2xhc3MgZnJQcmVmUm91dGluZ0RpciB7Ci0gIHB1YmxpYzoKLSAgICAvLyBjb25zdHJ1Y3RvcgotICAgIGZyUHJlZlJvdXRpbmdEaXIoKTogZGlyKGZyY05vdEFwcGxpY2FibGVQcmVmUm91dGluZ0Rpcikge30KLSAgICBmclByZWZSb3V0aW5nRGlyKGNvbnN0IGZyUHJlZlJvdXRpbmdEaXIgJmluKTogZGlyKGluLmRpcikge30KLSAgICBmclByZWZSb3V0aW5nRGlyKGZyUHJlZlJvdXRpbmdEaXJFbnVtIGRpckluKTogZGlyKGRpckluKSB7fQotICAgIC8vIHNldHRlcnMKLSAgICB2b2lkIHNldChmclByZWZSb3V0aW5nRGlyRW51bSBkaXJJbikgewotICAgICAgZGlyID0gZGlySW47Ci0gICAgfQotICAgIC8vIGdldHRlcnMKLSAgICAvLyBvdmVybG9hZHMKLSAgICBvcGVyYXRvciBmclByZWZSb3V0aW5nRGlyRW51bSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBkaXI7Ci0gICAgfQotICBwcm90ZWN0ZWQ6Ci0gICAgZnJQcmVmUm91dGluZ0RpckVudW0gZGlyOwotICB9OwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL2luZnJhL2ZyU2VnU3R5bGUuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL2luZnJhL2ZyU2VnU3R5bGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY5ZjU2MC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9pbmZyYS9mclNlZ1N0eWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyogQXV0aG9yczogTHV0b25nIFdhbmcgYW5kIEJhbmdxaSBYdSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBfRlJfU0VHU1RZTEVfSF8KLSNkZWZpbmUgX0ZSX1NFR1NUWUxFX0hfCi0KLSNpbmNsdWRlICJmckJhc2VUeXBlcy5oIgotCi1uYW1lc3BhY2UgZnIgewotICBjbGFzcyBmckVuZFN0eWxlIHsKLSAgcHVibGljOgotICAgIC8vIGNvbnN0cnVjdG9yCi0gICAgZnJFbmRTdHlsZSgpOiBzdHlsZShmcmNFeHRlbmRFbmRTdHlsZSkge30KLSAgICBmckVuZFN0eWxlKGNvbnN0IGZyRW5kU3R5bGUgJnN0eWxlSW4pOiBzdHlsZShzdHlsZUluLnN0eWxlKSB7fQotICAgIGZyRW5kU3R5bGUoZnJFbmRTdHlsZUVudW0gc3R5bGVJbik6IHN0eWxlKHN0eWxlSW4pIHt9Ci0gICAgLy8gc2V0dGVycwotICAgIHZvaWQgc2V0KGZyRW5kU3R5bGVFbnVtIHN0eWxlSW4pIHsKLSAgICAgIHN0eWxlID0gc3R5bGVJbjsKLSAgICB9Ci0gICAgdm9pZCBzZXQoY29uc3QgZnJFbmRTdHlsZSAmc3R5bGVJbikgewotICAgICAgc3R5bGUgPSBzdHlsZUluLnN0eWxlOwotICAgIH0KLSAgICAvLyBnZXR0ZXJzCi0gICAgb3BlcmF0b3IgZnJFbmRTdHlsZUVudW0oKSBjb25zdCB7Ci0gICAgICByZXR1cm4gc3R5bGU7Ci0gICAgfQotICBwcm90ZWN0ZWQ6Ci0gICAgZnJFbmRTdHlsZUVudW0gc3R5bGU7Ci0gIH07Ci0KLSAgY2xhc3MgZnJTZWdTdHlsZSB7Ci0gIHB1YmxpYzoKLSAgICAvLyBjb25zdHJ1Y3RvcgotICAgIGZyU2VnU3R5bGUoKTogYmVnaW5FeHQoMCksIGVuZEV4dCgwKSwgd2lkdGgoMCksIGJlZ2luU3R5bGUoKSwgZW5kU3R5bGUoKSB7fQotICAgIGZyU2VnU3R5bGUoY29uc3QgZnJTZWdTdHlsZSAmaW4pOiBiZWdpbkV4dChpbi5iZWdpbkV4dCksIGVuZEV4dChpbi5lbmRFeHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aChpbi53aWR0aCksIGJlZ2luU3R5bGUoaW4uYmVnaW5TdHlsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFN0eWxlKGluLmVuZFN0eWxlKSB7fQotICAgIC8vIHNldHRlcnMKLSAgICB2b2lkIHNldFdpZHRoKGZyVUludDQgd2lkdGhJbikgewotICAgICAgd2lkdGggPSB3aWR0aEluOwotICAgIH0KLSAgICB2b2lkIHNldEJlZ2luU3R5bGUoY29uc3QgZnJFbmRTdHlsZSAmc3R5bGUsIGZyVUludDQgZXh0ID0gMCkgewotICAgICAgYmVnaW5TdHlsZS5zZXQoc3R5bGUpOwotICAgICAgYmVnaW5FeHQgPSBleHQ7Ci0gICAgfQotICAgIHZvaWQgc2V0RW5kU3R5bGUoY29uc3QgZnJFbmRTdHlsZSAmc3R5bGUsIGZyVUludDQgZXh0ID0gMCkgewotICAgICAgZW5kU3R5bGUuc2V0KHN0eWxlKTsKLSAgICAgIGVuZEV4dCA9IGV4dDsKLSAgICB9Ci0gICAgLy8gZ2V0dGVycwotICAgIGZyVUludDQgZ2V0V2lkdGgoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gd2lkdGg7Ci0gICAgfQotICAgIGZyVUludDQgZ2V0QmVnaW5FeHQoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gYmVnaW5FeHQ7Ci0gICAgfQotICAgIGZyRW5kU3R5bGUgZ2V0QmVnaW5TdHlsZSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBiZWdpblN0eWxlOwotICAgIH0KLSAgICBmclVJbnQ0IGdldEVuZEV4dCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBlbmRFeHQ7Ci0gICAgfQotICAgIGZyRW5kU3R5bGUgZ2V0RW5kU3R5bGUoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gZW5kU3R5bGU7Ci0gICAgfQotICBwcm90ZWN0ZWQ6Ci0gICAgZnJVSW50NCBiZWdpbkV4dDsKLSAgICBmclVJbnQ0IGVuZEV4dDsKLSAgICBmclVJbnQ0IHdpZHRoOwotICAgIGZyRW5kU3R5bGUgYmVnaW5TdHlsZTsKLSAgICBmckVuZFN0eWxlIGVuZFN0eWxlOwotICB9OwotCi19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvaW5mcmEvZnJUaW1lLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL2luZnJhL2ZyVGltZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYWM2NjguLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvaW5mcmEvZnJUaW1lLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlIDxpb21hbmlwPgotI2luY2x1ZGUgPGJvb3N0L2lvL2lvc19zdGF0ZS5ocHA+Ci0jaW5jbHVkZSAiZnJUaW1lLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgZnI7Ci0KLXZvaWQgZnJUaW1lOjpwcmludCgpIHsKLSAgYm9vc3Q6OmlvOjppb3NfYWxsX3NhdmVyIGd1YXJkKHN0ZDo6Y291dCk7Ci0gIGF1dG8gdDEgICAgICAgID0gc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7Ci0gIGF1dG8gdGltZV9zcGFuID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86OnNlY29uZHM+KHQxIC0gdDApOwotICBpbnQgaG91ciAgICAgICA9IHRpbWVfc3Bhbi5jb3VudCgpIC8gMzYwMDsKLSAgaW50IG1pbiAgICAgICAgPSAodGltZV9zcGFuLmNvdW50KCkgJSAzNjAwKSAvIDYwOwotICBpbnQgc2VjICAgICAgICA9IHRpbWVfc3Bhbi5jb3VudCgpICUgNjA7Ci0gIGF1dG8gdDIgICAgICAgID0gKGNsb2NrKCkgLSB0KSAvIENMT0NLU19QRVJfU0VDOwotICBpbnQgY2hvdXIgICAgICA9IHQyIC8gMzYwMDsKLSAgaW50IGNtaW4gICAgICAgPSAodDIgJSAzNjAwKSAvIDYwOwotICBpbnQgY3NlYyAgICAgICA9IHQyICUgNjA7Ci0gIHN0ZDo6Y291dCA8PCJjcHUgdGltZSA9ICI7Ci0gIHN0ZDo6Y291dCA8PHN0ZDo6c2V0dygyKSA8PHN0ZDo6c2V0ZmlsbCgnMCcpIDw8Y2hvdXI7Ci0gIHN0ZDo6Y291dCA8PCI6IjsKLSAgc3RkOjpjb3V0IDw8c3RkOjpzZXR3KDIpIDw8c3RkOjpzZXRmaWxsKCcwJykgPDxjbWluOwotICBzdGQ6OmNvdXQgPDwiOiI7Ci0gIHN0ZDo6Y291dCA8PHN0ZDo6c2V0dygyKSA8PHN0ZDo6c2V0ZmlsbCgnMCcpIDw8Y3NlYzsKLSAgc3RkOjpjb3V0IDw8IiwgZWxhcHNlZCB0aW1lID0gIjsKLSAgc3RkOjpjb3V0IDw8c3RkOjpzZXR3KDIpIDw8c3RkOjpzZXRmaWxsKCcwJykgPDxob3VyOwotICBzdGQ6OmNvdXQgPDwiOiI7Ci0gIHN0ZDo6Y291dCA8PHN0ZDo6c2V0dygyKSA8PHN0ZDo6c2V0ZmlsbCgnMCcpIDw8bWluOwotICBzdGQ6OmNvdXQgPDwiOiI7Ci0gIHN0ZDo6Y291dCA8PHN0ZDo6c2V0dygyKSA8PHN0ZDo6c2V0ZmlsbCgnMCcpIDw8c2VjOwotICBzdGQ6OmNvdXQgPDwiLCBtZW1vcnkgPSAiIDw8c3RkOjpmaXhlZCA8PHN0ZDo6c2V0cHJlY2lzaW9uKDIpIDw8Z2V0Q3VycmVudFJTUygpICogMS4wIC8gMTAyNCAvIDEwMjQgPDwiIChNQikiOwotICBzdGQ6OmNvdXQgPDwiLCBwZWFrID0gIiAgIDw8c3RkOjpmaXhlZCA8PHN0ZDo6c2V0cHJlY2lzaW9uKDIpIDw8Z2V0UGVha1JTUygpICAgICogMS4wIC8gMTAyNCAvIDEwMjQgPDwiIChNQikiOwotICBndWFyZC5yZXN0b3JlKCk7Ci19Ci0KLXN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBmclRpbWUgJnQpIHsKLSAgYm9vc3Q6OmlvOjppb3NfYWxsX3NhdmVyIGd1YXJkKHN0ZDo6Y291dCk7Ci0gIGF1dG8gdDEgICAgICAgID0gc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7Ci0gIGF1dG8gdGltZV9zcGFuID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86OnNlY29uZHM+KHQxIC0gdC5nZXRUMCgpKTsKLSAgaW50IGhvdXIgICAgICAgPSB0aW1lX3NwYW4uY291bnQoKSAvIDM2MDA7Ci0gIGludCBtaW4gICAgICAgID0gKHRpbWVfc3Bhbi5jb3VudCgpICUgMzYwMCkgLyA2MDsKLSAgaW50IHNlYyAgICAgICAgPSB0aW1lX3NwYW4uY291bnQoKSAlIDYwOwotICBvcyA8PCJlbGFwc2VkIHRpbWUgPSAiOwotICBvcyA8PHN0ZDo6c2V0dygyKSA8PHN0ZDo6c2V0ZmlsbCgnMCcpIDw8aG91cjsKLSAgb3MgPDwiOiI7Ci0gIG9zIDw8c3RkOjpzZXR3KDIpIDw8c3RkOjpzZXRmaWxsKCcwJykgPDxtaW47Ci0gIG9zIDw8IjoiOwotICBvcyA8PHN0ZDo6c2V0dygyKSA8PHN0ZDo6c2V0ZmlsbCgnMCcpIDw8c2VjOwotICBvcyA8PCIsIG1lbW9yeSA9ICIgPDxzdGQ6OmZpeGVkIDw8c3RkOjpzZXRwcmVjaXNpb24oMikgPDxnZXRDdXJyZW50UlNTKCkgKiAxLjAgLyAxMDI0IC8gMTAyNCA8PCIgKE1CKSI7Ci0gIGd1YXJkLnJlc3RvcmUoKTsKLSAgcmV0dXJuIG9zOwotfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvaW5mcmEvZnJUaW1lLmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9pbmZyYS9mclRpbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkzMGUzMS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9pbmZyYS9mclRpbWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX0ZSX1RJTUVfSF8KLSNkZWZpbmUgX0ZSX1RJTUVfSF8KLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPGNocm9ubz4KLSNpbmNsdWRlIDxjdGltZT4KLS8vI2luY2x1ZGUgPGJvb3N0L2lvL2lvc19zdGF0ZS5ocHA+Ci0KLWV4dGVybiBzaXplX3QgZ2V0UGVha1JTUygpOwotZXh0ZXJuIHNpemVfdCBnZXRDdXJyZW50UlNTKCk7Ci0KLW5hbWVzcGFjZSBmciB7Ci0gIGNsYXNzIGZyVGltZSB7Ci0gIHB1YmxpYzoKLSAgICBmclRpbWUoKTogdDAoc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCkpLCB0KGNsb2NrKCkpIHt9Ci0gICAgLy92b2lkIGJlZ2luKCkgewotICAgIC8vICB0MCA9IHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwotICAgIC8vfQotICAgIC8vdm9pZCBlbmQoKSB7Ci0gICAgLy8gIHQxID0gc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7Ci0gICAgLy99Ci0gICAgc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6dGltZV9wb2ludCBnZXRUMCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiB0MDsKLSAgICB9Ci0gICAgdm9pZCBwcmludCgpOwotICAgIGJvb2wgaXNFeGNlZWQoZG91YmxlIGluKSB7Ci0gICAgICBhdXRvIHQxICAgICAgICA9IHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwotICAgICAgYXV0byB0aW1lX3NwYW4gPSBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZG91YmxlPiA+KHQxIC0gdDApOwotICAgICAgcmV0dXJuICh0aW1lX3NwYW4uY291bnQoKSA+IGluKTsKLSAgICB9Ci0gIHByb3RlY3RlZDoKLSAgICBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjp0aW1lX3BvaW50IHQwOwotICAgIGNsb2NrX3QgdDsKLSAgICAvL3N0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6OnRpbWVfcG9pbnQgdDE7Ci0gIH07Ci19Ci0KLWV4dGVybiBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgZnI6OmZyVGltZSAmdCk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL2luZnJhL2ZyVGltZV9oZWxwZXIuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvaW5mcmEvZnJUaW1lX2hlbHBlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzM2NkODUuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvaW5mcmEvZnJUaW1lX2hlbHBlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyogQXV0aG9yczogTHV0b25nIFdhbmcgYW5kIEJhbmdxaSBYdSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotLyoKLSAqIEF1dGhvcjogIERhdmlkIFJvYmVydCBOYWRlYXUKLSAqIFNpdGU6ICAgIGh0dHA6Ly9OYWRlYXVTb2Z0d2FyZS5jb20vCi0gKiBMaWNlbnNlOiBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDMuMCBVbnBvcnRlZCBMaWNlbnNlCi0gKiAgICAgICAgICBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8zLjAvZGVlZC5lbl9VUwotICovCi0KLSNpZiBkZWZpbmVkKF9XSU4zMikKLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSA8cHNhcGkuaD4KLQotI2VsaWYgZGVmaW5lZChfX3VuaXhfXykgfHwgZGVmaW5lZChfX3VuaXgpIHx8IGRlZmluZWQodW5peCkgfHwgKGRlZmluZWQoX19BUFBMRV9fKSAmJiBkZWZpbmVkKF9fTUFDSF9fKSkKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KLQotI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBkZWZpbmVkKF9fTUFDSF9fKQotI2luY2x1ZGUgPG1hY2gvbWFjaC5oPgotCi0jZWxpZiAoZGVmaW5lZChfQUlYKSB8fCBkZWZpbmVkKF9fVE9TX19BSVhfXykpIHx8IChkZWZpbmVkKF9fc3VuX18pIHx8IGRlZmluZWQoX19zdW4pIHx8IGRlZmluZWQoc3VuKSAmJiAoZGVmaW5lZChfX1NWUjQpIHx8IGRlZmluZWQoX19zdnI0X18pKSkKLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHByb2Nmcy5oPgotCi0jZWxpZiBkZWZpbmVkKF9fbGludXhfXykgfHwgZGVmaW5lZChfX2xpbnV4KSB8fCBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fZ251X2xpbnV4X18pCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2VuZGlmCi0KLSNlbHNlCi0jZXJyb3IgIkNhbm5vdCBkZWZpbmUgZ2V0UGVha1JTUyggKSBvciBnZXRDdXJyZW50UlNTKCApIGZvciBhbiB1bmtub3duIE9TLiIKLSNlbmRpZgotCi0KLQotCi0KLS8qKgotICogUmV0dXJucyB0aGUgcGVhayAobWF4aW11bSBzbyBmYXIpIHJlc2lkZW50IHNldCBzaXplIChwaHlzaWNhbAotICogbWVtb3J5IHVzZSkgbWVhc3VyZWQgaW4gYnl0ZXMsIG9yIHplcm8gaWYgdGhlIHZhbHVlIGNhbm5vdCBiZQotICogZGV0ZXJtaW5lZCBvbiB0aGlzIE9TLgotICovCi1zaXplX3QgZ2V0UGVha1JTUyggKQotewotI2lmIGRlZmluZWQoX1dJTjMyKQotICAgIC8qIFdpbmRvd3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICBQUk9DRVNTX01FTU9SWV9DT1VOVEVSUyBpbmZvOwotICAgIEdldFByb2Nlc3NNZW1vcnlJbmZvKCBHZXRDdXJyZW50UHJvY2VzcyggKSwgJmluZm8sIHNpemVvZihpbmZvKSApOwotICAgIHJldHVybiAoc2l6ZV90KWluZm8uUGVha1dvcmtpbmdTZXRTaXplOwotCi0jZWxpZiAoZGVmaW5lZChfQUlYKSB8fCBkZWZpbmVkKF9fVE9TX19BSVhfXykpIHx8IChkZWZpbmVkKF9fc3VuX18pIHx8IGRlZmluZWQoX19zdW4pIHx8IGRlZmluZWQoc3VuKSAmJiAoZGVmaW5lZChfX1NWUjQpIHx8IGRlZmluZWQoX19zdnI0X18pKSkKLSAgICAvKiBBSVggYW5kIFNvbGFyaXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgc3RydWN0IHBzaW5mbyBwc2luZm87Ci0gICAgaW50IGZkID0gLTE7Ci0gICAgaWYgKCAoZmQgPSBvcGVuKCAiL3Byb2Mvc2VsZi9wc2luZm8iLCBPX1JET05MWSApKSA9PSAtMSApCi0gICAgICAgIHJldHVybiAoc2l6ZV90KTBMOyAgICAgIC8qIENhbid0IG9wZW4/ICovCi0gICAgaWYgKCByZWFkKCBmZCwgJnBzaW5mbywgc2l6ZW9mKHBzaW5mbykgKSAhPSBzaXplb2YocHNpbmZvKSApCi0gICAgewotICAgICAgICBjbG9zZSggZmQgKTsKLSAgICAgICAgcmV0dXJuIChzaXplX3QpMEw7ICAgICAgLyogQ2FuJ3QgcmVhZD8gKi8KLSAgICB9Ci0gICAgY2xvc2UoIGZkICk7Ci0gICAgcmV0dXJuIChzaXplX3QpKHBzaW5mby5wcl9yc3NpemUgKiAxMDI0TCk7Ci0KLSNlbGlmIGRlZmluZWQoX191bml4X18pIHx8IGRlZmluZWQoX191bml4KSB8fCBkZWZpbmVkKHVuaXgpIHx8IChkZWZpbmVkKF9fQVBQTEVfXykgJiYgZGVmaW5lZChfX01BQ0hfXykpCi0gICAgLyogQlNELCBMaW51eCwgYW5kIE9TWCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIHN0cnVjdCBydXNhZ2UgcnVzYWdlOwotICAgIGdldHJ1c2FnZSggUlVTQUdFX1NFTEYsICZydXNhZ2UgKTsKLSNpZiBkZWZpbmVkKF9fQVBQTEVfXykgJiYgZGVmaW5lZChfX01BQ0hfXykKLSAgICByZXR1cm4gKHNpemVfdClydXNhZ2UucnVfbWF4cnNzOwotI2Vsc2UKLSAgICByZXR1cm4gKHNpemVfdCkocnVzYWdlLnJ1X21heHJzcyAqIDEwMjRMKTsKLSNlbmRpZgotCi0jZWxzZQotICAgIC8qIFVua25vd24gT1MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICByZXR1cm4gKHNpemVfdCkwTDsgICAgICAgICAgLyogVW5zdXBwb3J0ZWQuICovCi0jZW5kaWYKLX0KLQotCi0KLQotCi0vKioKLSAqIFJldHVybnMgdGhlIGN1cnJlbnQgcmVzaWRlbnQgc2V0IHNpemUgKHBoeXNpY2FsIG1lbW9yeSB1c2UpIG1lYXN1cmVkCi0gKiBpbiBieXRlcywgb3IgemVybyBpZiB0aGUgdmFsdWUgY2Fubm90IGJlIGRldGVybWluZWQgb24gdGhpcyBPUy4KLSAqLwotc2l6ZV90IGdldEN1cnJlbnRSU1MoICkKLXsKLSNpZiBkZWZpbmVkKF9XSU4zMikKLSAgICAvKiBXaW5kb3dzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgUFJPQ0VTU19NRU1PUllfQ09VTlRFUlMgaW5mbzsKLSAgICBHZXRQcm9jZXNzTWVtb3J5SW5mbyggR2V0Q3VycmVudFByb2Nlc3MoICksICZpbmZvLCBzaXplb2YoaW5mbykgKTsKLSAgICByZXR1cm4gKHNpemVfdClpbmZvLldvcmtpbmdTZXRTaXplOwotCi0jZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykgJiYgZGVmaW5lZChfX01BQ0hfXykKLSAgICAvKiBPU1ggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgc3RydWN0IG1hY2hfdGFza19iYXNpY19pbmZvIGluZm87Ci0gICAgbWFjaF9tc2dfdHlwZV9udW1iZXJfdCBpbmZvQ291bnQgPSBNQUNIX1RBU0tfQkFTSUNfSU5GT19DT1VOVDsKLSAgICBpZiAoIHRhc2tfaW5mbyggbWFjaF90YXNrX3NlbGYoICksIE1BQ0hfVEFTS19CQVNJQ19JTkZPLAotICAgICAgICAodGFza19pbmZvX3QpJmluZm8sICZpbmZvQ291bnQgKSAhPSBLRVJOX1NVQ0NFU1MgKQotICAgICAgICByZXR1cm4gKHNpemVfdCkwTDsgICAgICAvKiBDYW4ndCBhY2Nlc3M/ICovCi0gICAgcmV0dXJuIChzaXplX3QpaW5mby5yZXNpZGVudF9zaXplOwotCi0jZWxpZiBkZWZpbmVkKF9fbGludXhfXykgfHwgZGVmaW5lZChfX2xpbnV4KSB8fCBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fZ251X2xpbnV4X18pCi0gICAgLyogTGludXggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIGxvbmcgcnNzID0gMEw7Ci0gICAgRklMRSogZnAgPSBOVUxMOwotICAgIGlmICggKGZwID0gZm9wZW4oICIvcHJvYy9zZWxmL3N0YXRtIiwgInIiICkpID09IE5VTEwgKQotICAgICAgICByZXR1cm4gKHNpemVfdCkwTDsgICAgICAvKiBDYW4ndCBvcGVuPyAqLwotICAgIGlmICggZnNjYW5mKCBmcCwgIiUqcyVsZCIsICZyc3MgKSAhPSAxICkKLSAgICB7Ci0gICAgICAgIGZjbG9zZSggZnAgKTsKLSAgICAgICAgcmV0dXJuIChzaXplX3QpMEw7ICAgICAgLyogQ2FuJ3QgcmVhZD8gKi8KLSAgICB9Ci0gICAgZmNsb3NlKCBmcCApOwotICAgIHJldHVybiAoc2l6ZV90KXJzcyAqIChzaXplX3Qpc3lzY29uZiggX1NDX1BBR0VTSVpFKTsKLQotI2Vsc2UKLSAgICAvKiBBSVgsIEJTRCwgU29sYXJpcywgYW5kIFVua25vd24gT1MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgcmV0dXJuIChzaXplX3QpMEw7ICAgICAgICAgIC8qIFVuc3VwcG9ydGVkLiAqLwotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9pbmZyYS9mclRyYW5zZm9ybS5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvaW5mcmEvZnJUcmFuc2Zvcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE2N2FiMi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9pbmZyYS9mclRyYW5zZm9ybS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX0ZSX1RSQU5TRk9STV9IXwotI2RlZmluZSBfRlJfVFJBTlNGT1JNX0hfCi0KLSNpbmNsdWRlICJkYi9pbmZyYS9mclBvaW50LmgiCi0jaW5jbHVkZSAiZGIvaW5mcmEvZnJPcmllbnQuaCIKLQotbmFtZXNwYWNlIGZyIHsKLSAgY2xhc3MgZnJUcmFuc2Zvcm0gewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3IKLSAgICBmclRyYW5zZm9ybSgpOiBvZmZzZXQoKSwgb3JpKCkge30KLSAgICBmclRyYW5zZm9ybShjb25zdCBmclBvaW50ICZwb2ludEluLCBjb25zdCBmck9yaWVudCAmb3JpZW50SW4gPSBmck9yaWVudChmcmNSMCkpOiBvZmZzZXQocG9pbnRJbiksIG9yaShvcmllbnRJbikge30KLSAgICBmclRyYW5zZm9ybShmckNvb3JkIHhPZmZzZXRJbiwgZnJDb29yZCB5T2Zmc2V0SW4sIGNvbnN0IGZyT3JpZW50ICZvcmllbnRJbiA9IGZyT3JpZW50KGZyY1IwKSk6IG9mZnNldCh4T2Zmc2V0SW4sIHlPZmZzZXRJbiksIG9yaShvcmllbnRJbikge30KLSAgICAvLyBzZXR0ZXJzCi0gICAgdm9pZCBzZXQoY29uc3QgZnJQb2ludCAmcG9pbnRJbikgewotICAgICAgb2Zmc2V0ID0gcG9pbnRJbjsKLSAgICB9Ci0gICAgdm9pZCBzZXQoY29uc3QgZnJPcmllbnQgJm9yaWVudEluKSB7Ci0gICAgICBvcmkgPSBvcmllbnRJbjsKLSAgICB9Ci0gICAgdm9pZCBzZXQoY29uc3QgZnJQb2ludCAmcG9pbnRJbiwgY29uc3QgZnJPcmllbnQgJm9yaWVudEluKSB7Ci0gICAgICBzZXQocG9pbnRJbik7Ci0gICAgICBzZXQob3JpZW50SW4pOwotICAgIH0KLSAgICB2b2lkIHNldChmckNvb3JkIHhPZmZzZXRJbiwgZnJDb29yZCB5T2Zmc2V0SW4pIHsKLSAgICAgIHNldChmclBvaW50KHhPZmZzZXRJbiwgeU9mZnNldEluKSk7Ci0gICAgfQotICAgIHZvaWQgc2V0KGZyQ29vcmQgeE9mZnNldEluLCBmckNvb3JkIHlPZmZzZXRJbiwgY29uc3QgZnJPcmllbnQgJm9yaWVudEluKSB7Ci0gICAgICBzZXQoeE9mZnNldEluLCB5T2Zmc2V0SW4pOwotICAgICAgc2V0KG9yaWVudEluKTsKLSAgICB9Ci0gICAgLy8gZ2V0dGVycwotICAgIGZyQ29vcmQgeE9mZnNldCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBvZmZzZXQueCgpOwotICAgIH0KLSAgICBmckNvb3JkIHlPZmZzZXQoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gb2Zmc2V0LnkoKTsKLSAgICB9Ci0gICAgZnJPcmllbnQgb3JpZW50KCkgY29uc3QgewotICAgICAgcmV0dXJuIG9yaTsKLSAgICB9Ci0gICAgLy8gdXRpbAotICAgIHZvaWQgdXBkYXRlWGZvcm0oZnJQb2ludCAmc2l6ZSkgewotICAgICAgc3dpdGNoKG9yaWVudCgpKSB7Ci0gICAgICAgIC8vY2FzZSBmcmNSMDogPT0gZGVmYXVsdAotICAgICAgICBjYXNlIGZyY1I5MDoKLSAgICAgICAgICBzZXQoeE9mZnNldCgpICsgc2l6ZS55KCksIHlPZmZzZXQoKSAgICAgICAgICAgKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBmcmNSMTgwOiAvLyB2ZXJpZmllZAotICAgICAgICAgIHNldCh4T2Zmc2V0KCkgKyBzaXplLngoKSwgeU9mZnNldCgpICsgc2l6ZS55KCkpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGZyY1IyNzA6Ci0gICAgICAgICAgc2V0KHhPZmZzZXQoKSwgICAgICAgICAgICB5T2Zmc2V0KCkgKyBzaXplLngoKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgZnJjTVk6IC8vIHZlcmlmaWVkCi0gICAgICAgICAgc2V0KHhPZmZzZXQoKSArIHNpemUueCgpLCB5T2Zmc2V0KCkgICAgICAgICAgICk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgZnJjTVhSOTA6Ci0gICAgICAgICAgc2V0KHhPZmZzZXQoKSwgICAgICAgICAgICB5T2Zmc2V0KCkgICAgICAgICAgICk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgZnJjTVg6IC8vIHZlcmlmaWVkCi0gICAgICAgICAgc2V0KHhPZmZzZXQoKSwgICAgICAgICAgICB5T2Zmc2V0KCkgKyBzaXplLnkoKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgZnJjTVlSOTA6Ci0gICAgICAgICAgc2V0KHhPZmZzZXQoKSArIHNpemUueSgpLCB5T2Zmc2V0KCkgKyBzaXplLngoKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQgICAgICA6IC8vIHZlcmlmaWVkCi0gICAgICAgICAgc2V0KHhPZmZzZXQoKSwgICAgICAgICAgICB5T2Zmc2V0KCkgICAgICAgICAgICk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHZvaWQgcmV2ZXJ0KGZyVHJhbnNmb3JtICZ0cmFuc2Zvcm1JbikgewotICAgICAgZnJDb29yZCByZXNYT2Zmc2V0LCByZXNZT2Zmc2V0OwotICAgICAgZnJPcmllbnQgcmVzT3JpZW50OwotICAgICAgc3dpdGNoKG9yaSkgewotICAgICAgICBjYXNlIGZyY1IwOgotICAgICAgICAgIHJlc1hPZmZzZXQgPSAtb2Zmc2V0LngoKTsKLSAgICAgICAgICByZXNZT2Zmc2V0ID0gLW9mZnNldC55KCk7Ci0gICAgICAgICAgcmVzT3JpZW50ID0gZnJjUjA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgZnJjUjkwOgotICAgICAgICAgIHJlc1hPZmZzZXQgPSAtb2Zmc2V0LnkoKTsKLSAgICAgICAgICByZXNZT2Zmc2V0ID0gb2Zmc2V0LngoKTsKLSAgICAgICAgICByZXNPcmllbnQgPSBmcmNSMjcwOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGZyY1IxODA6Ci0gICAgICAgICAgcmVzWE9mZnNldCA9IG9mZnNldC54KCk7Ci0gICAgICAgICAgcmVzWU9mZnNldCA9IG9mZnNldC55KCk7Ci0gICAgICAgICAgcmVzT3JpZW50ID0gZnJjUjE4MDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBmcmNSMjcwOgotICAgICAgICAgIHJlc1hPZmZzZXQgPSBvZmZzZXQueSgpOwotICAgICAgICAgIHJlc1lPZmZzZXQgPSAtb2Zmc2V0LngoKTsKLSAgICAgICAgICByZXNPcmllbnQgPSBmcmNSOTA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgZnJjTVk6Ci0gICAgICAgICAgcmVzWE9mZnNldCA9IG9mZnNldC54KCk7Ci0gICAgICAgICAgcmVzWU9mZnNldCA9IC1vZmZzZXQueSgpOwotICAgICAgICAgIHJlc09yaWVudCA9IGZyY01ZOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGZyY01ZUjkwOgotICAgICAgICAgIHJlc1hPZmZzZXQgPSBvZmZzZXQueSgpOwotICAgICAgICAgIHJlc1lPZmZzZXQgPSBvZmZzZXQueCgpOwotICAgICAgICAgIHJlc09yaWVudCA9IGZyY01ZUjkwOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGZyY01YOgotICAgICAgICAgIHJlc1hPZmZzZXQgPSAtb2Zmc2V0LngoKTsKLSAgICAgICAgICByZXNZT2Zmc2V0ID0gb2Zmc2V0LnkoKTsKLSAgICAgICAgICByZXNPcmllbnQgPSBmcmNNWDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBmcmNNWFI5MDoKLSAgICAgICAgICByZXNYT2Zmc2V0ID0gLW9mZnNldC55KCk7Ci0gICAgICAgICAgcmVzWU9mZnNldCA9IC1vZmZzZXQueCgpOwotICAgICAgICAgIHJlc09yaWVudCA9IGZyY01YUjkwOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJlc1hPZmZzZXQgPSAtb2Zmc2V0LngoKTsKLSAgICAgICAgICByZXNZT2Zmc2V0ID0gLW9mZnNldC55KCk7Ci0gICAgICAgICAgcmVzT3JpZW50ID0gZnJjUjA7Ci0gICAgICAgICAgc3RkOjpjb3V0IDw8ICJFcnJvcjogdW5yZWNvZ25pemVkIG9yaWVudCBpbiByZXZlcnRcbiI7Ci0gICAgICB9Ci0gICAgICB0cmFuc2Zvcm1Jbi5zZXQocmVzWE9mZnNldCwgcmVzWU9mZnNldCwgcmVzT3JpZW50KTsKLSAgICB9Ci0gIHByb3RlY3RlZDoKLSAgICBmclBvaW50IG9mZnNldDsKLSAgICBmck9yaWVudCBvcmk7Ci0gIH07Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvb2JqL01ha2VmaWxlIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvb2JqL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWI4YjNjLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL29iai9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgc3ViZGlyIGFuZCBvYmplY3RzIGluIGN1cnJlbnQgZGlyCi1TVUJESVJTCT0gCi1PQkpFQ1RTCT0gZnJJbnN0Lm8gZnJTaGFwZS5vIGZyVmlhLm8KLQotCi1hbGw6c3ViZGlycyAke09CSkVDVFN9Ci0KLQkKLWNsZWFuOmNsZWFuc3ViZGlycwotCXJtIC1mICR7T0JKRUNUU30KLQkKLWluY2x1ZGUgJHtNQUtFSU5DTFVERX0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL29iai9mckJsb2NrLmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9vYmovZnJCbG9jay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTg0MzcxLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL29iai9mckJsb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNjMgKzAsMCBAQAotLyogQXV0aG9yczogTHV0b25nIFdhbmcgYW5kIEJhbmdxaSBYdSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBfRlJfQkxPQ0tfSF8KLSNkZWZpbmUgX0ZSX0JMT0NLX0hfCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSAiZnJCYXNlVHlwZXMuaCIKLSNpbmNsdWRlICJkYi9vYmovZnJUcmFja1BhdHRlcm4uaCIKLSNpbmNsdWRlICJkYi9vYmovZnJCbG9ja2FnZS5oIgotI2luY2x1ZGUgImRiL29iai9mckluc3QuaCIKLSNpbmNsdWRlICJkYi9vYmovZnJUZXJtLmgiCi0jaW5jbHVkZSAiZGIvb2JqL2ZyTmV0LmgiCi0jaW5jbHVkZSAiZGIvb2JqL2ZyQm91bmRhcnkuaCIKLSNpbmNsdWRlICJkYi9vYmovZnJDTWFwLmgiCi0jaW5jbHVkZSAiZGIvb2JqL2ZyTWFya2VyLmgiCi0KLW5hbWVzcGFjZSBmciB7Ci0gIG5hbWVzcGFjZSBpbyB7Ci0gICAgY2xhc3MgUGFyc2VyOwotICB9Ci0gIGNsYXNzIGZyR3VpZGU7Ci0gIGNsYXNzIGZyQmxvY2s6IHB1YmxpYyBmckJsb2NrT2JqZWN0IHsKLSAgcHVibGljOgotICAgIC8vIGNvbnN0cnVjdG9ycwotICAgIGZyQmxvY2soKTogZnJCbG9ja09iamVjdCgpLCBuYW1lKCksIGRiVW5pdCgwKSwgbWFjcm9DbGFzcyhNYWNyb0NsYXNzRW51bTo6VU5LTk9XTikge307Ci0gICAgLy8gZ2V0dGVycwotICAgIGZyVUludDQgZ2V0REJVUGVyVVUoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gZGJVbml0OwotICAgIH0KLSAgICB2b2lkIGdldEJCb3goZnJCb3ggJmJveEluKSBjb25zdCB7Ci0gICAgICBpZiAoYm91bmRhcmllcy5zaXplKCkpIHsKLSAgICAgICAgYm91bmRhcmllcy5iZWdpbigpLT5nZXRCQm94KGJveEluKTsKLSAgICAgIH0KLSAgICAgIGZyQ29vcmQgbGx4ID0gYm94SW4ubGVmdCgpOwotICAgICAgZnJDb29yZCBsbHkgPSBib3hJbi5ib3R0b20oKTsKLSAgICAgIGZyQ29vcmQgdXJ4ID0gYm94SW4ucmlnaHQoKTsKLSAgICAgIGZyQ29vcmQgdXJ5ID0gYm94SW4udG9wKCk7Ci0gICAgICBmckJveCB0bXBCb3g7Ci0gICAgICBmb3IgKGF1dG8gJmJvdW5kYXJ5OiBib3VuZGFyaWVzKSB7Ci0gICAgICAgIGJvdW5kYXJ5LmdldEJCb3godG1wQm94KTsKLSAgICAgICAgbGx4ID0gbGx4IDwgdG1wQm94LmxlZnQoKSAgID8gbGx4IDogdG1wQm94LmxlZnQoKTsKLSAgICAgICAgbGx5ID0gbGx5IDwgdG1wQm94LmJvdHRvbSgpID8gbGx5IDogdG1wQm94LmJvdHRvbSgpOwotICAgICAgICB1cnggPSB1cnggPiB0bXBCb3gucmlnaHQoKSAgPyB1cnggOiB0bXBCb3gucmlnaHQoKTsKLSAgICAgICAgdXJ5ID0gdXJ5ID4gdG1wQm94LnRvcCgpICAgID8gdXJ5IDogdG1wQm94LnRvcCgpOwotICAgICAgfQotICAgICAgLy9zdGQ6OmNvdXQgPDwiZGllQm94IGFmdGVyIGJvdW5kICIgPDxsbHggPDwiICIgPDxsbHkgPDwiICIgPDx1cnggPDwiICIgPDx1cnkgPDxzdGQ6OmVuZGw7Ci0gICAgICBmb3IgKGF1dG8gJmluc3Q6IGdldEluc3RzKCkpIHsKLSAgICAgICAgaW5zdC0+Z2V0QkJveCh0bXBCb3gpOwotICAgICAgICBsbHggPSBsbHggPCB0bXBCb3gubGVmdCgpICAgPyBsbHggOiB0bXBCb3gubGVmdCgpOwotICAgICAgICBsbHkgPSBsbHkgPCB0bXBCb3guYm90dG9tKCkgPyBsbHkgOiB0bXBCb3guYm90dG9tKCk7Ci0gICAgICAgIHVyeCA9IHVyeCA+IHRtcEJveC5yaWdodCgpICA/IHVyeCA6IHRtcEJveC5yaWdodCgpOwotICAgICAgICB1cnkgPSB1cnkgPiB0bXBCb3gudG9wKCkgICAgPyB1cnkgOiB0bXBCb3gudG9wKCk7Ci0gICAgICB9Ci0gICAgICAvL3N0ZDo6Y291dCA8PCJkaWVCb3ggYWZ0ZXIgaW5zdCAiIDw8bGx4IDw8IiAiIDw8bGx5IDw8IiAiIDw8dXJ4IDw8IiAiIDw8dXJ5IDw8c3RkOjplbmRsOwotICAgICAgZm9yIChhdXRvICZ0ZXJtOiBnZXRUZXJtcygpKSB7Ci0gICAgICAgIGZvciAoYXV0byAmcGluOiB0ZXJtLT5nZXRQaW5zKCkpIHsKLSAgICAgICAgICBmb3IgKGF1dG8gJmZpZzogcGluLT5nZXRGaWdzKCkpIHsKLSAgICAgICAgICAgIGZpZy0+Z2V0QkJveCh0bXBCb3gpOwotICAgICAgICAgICAgbGx4ID0gbGx4IDwgdG1wQm94LmxlZnQoKSAgID8gbGx4IDogdG1wQm94LmxlZnQoKTsKLSAgICAgICAgICAgIGxseSA9IGxseSA8IHRtcEJveC5ib3R0b20oKSA/IGxseSA6IHRtcEJveC5ib3R0b20oKTsKLSAgICAgICAgICAgIHVyeCA9IHVyeCA+IHRtcEJveC5yaWdodCgpICA/IHVyeCA6IHRtcEJveC5yaWdodCgpOwotICAgICAgICAgICAgdXJ5ID0gdXJ5ID4gdG1wQm94LnRvcCgpICAgID8gdXJ5IDogdG1wQm94LnRvcCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy9zdGQ6OmNvdXQgPDwiZGllQm94IGFmdGVyIHRlcm0gIiA8PGxseCA8PCIgIiA8PGxseSA8PCIgIiA8PHVyeCA8PCIgIiA8PHVyeSA8PHN0ZDo6ZW5kbDsKLSAgICAgIGJveEluLnNldChsbHgsIGxseSwgdXJ4LCB1cnkpOwotICAgIH0KLSAgICB2b2lkIGdldEJvdW5kYXJ5QkJveChmckJveCAmYm94SW4pIGNvbnN0IHsKLSAgICAgIGlmIChib3VuZGFyaWVzLnNpemUoKSkgewotICAgICAgICBib3VuZGFyaWVzLmJlZ2luKCktPmdldEJCb3goYm94SW4pOwotICAgICAgfQotICAgICAgZnJDb29yZCBsbHggPSBib3hJbi5sZWZ0KCk7Ci0gICAgICBmckNvb3JkIGxseSA9IGJveEluLmJvdHRvbSgpOwotICAgICAgZnJDb29yZCB1cnggPSBib3hJbi5yaWdodCgpOwotICAgICAgZnJDb29yZCB1cnkgPSBib3hJbi50b3AoKTsKLSAgICAgIGZyQm94IHRtcEJveDsKLSAgICAgIGZvciAoYXV0byAmYm91bmRhcnk6IGJvdW5kYXJpZXMpIHsKLSAgICAgICAgYm91bmRhcnkuZ2V0QkJveCh0bXBCb3gpOwotICAgICAgICBsbHggPSBsbHggPCB0bXBCb3gubGVmdCgpICAgPyBsbHggOiB0bXBCb3gubGVmdCgpOwotICAgICAgICBsbHkgPSBsbHkgPCB0bXBCb3guYm90dG9tKCkgPyBsbHkgOiB0bXBCb3guYm90dG9tKCk7Ci0gICAgICAgIHVyeCA9IHVyeCA+IHRtcEJveC5yaWdodCgpICA/IHVyeCA6IHRtcEJveC5yaWdodCgpOwotICAgICAgICB1cnkgPSB1cnkgPiB0bXBCb3gudG9wKCkgICAgPyB1cnkgOiB0bXBCb3gudG9wKCk7Ci0gICAgICB9Ci0gICAgICBib3hJbi5zZXQobGx4LCBsbHksIHVyeCwgdXJ5KTsKLSAgICB9Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8ZnJCb3VuZGFyeT4mIGdldEJvdW5kYXJpZXMoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gYm91bmRhcmllczsKLSAgICB9Ci0gICAgc3RkOjp2ZWN0b3I8ZnJCb3VuZGFyeT4mIGdldEJvdW5kYXJpZXMoKSB7Ci0gICAgICByZXR1cm4gYm91bmRhcmllczsKLSAgICB9Ci0gICAgc3RkOjp2ZWN0b3I8IHN0ZDo6dW5pcXVlX3B0cjxmckJsb2NrYWdlPiA+JiBnZXRCbG9ja2FnZXMoKSB7Ci0gICAgICByZXR1cm4gYmxvY2thZ2VzOwotICAgIH0KLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjwgc3RkOjp1bmlxdWVfcHRyPGZyQmxvY2thZ2U+ID4mIGdldEJsb2NrYWdlcygpIGNvbnN0IHsKLSAgICAgIHJldHVybiBibG9ja2FnZXM7Ci0gICAgfQotICAgIGNvbnN0IGZyQ01hcCYgZ2V0Q01hcCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBjTWFwOwotICAgIH0KLSAgICBmckNNYXAmIGdldENNYXAoKSB7Ci0gICAgICByZXR1cm4gY01hcDsKLSAgICB9Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8ZnJHQ2VsbFBhdHRlcm4+JiBnZXRHQ2VsbFBhdHRlcm5zKCkgY29uc3QgewotICAgICAgcmV0dXJuIGdDZWxsUGF0dGVybnM7Ci0gICAgfQotICAgIHN0ZDo6dmVjdG9yPGZyR0NlbGxQYXR0ZXJuPiYgZ2V0R0NlbGxQYXR0ZXJucygpIHsKLSAgICAgIHJldHVybiBnQ2VsbFBhdHRlcm5zOwotICAgIH0KLSAgICBzdGQ6OnZlY3Rvcjxmckd1aWRlKj4gZ2V0R3VpZGVzKCkgY29uc3QgewotICAgICAgc3RkOjp2ZWN0b3I8ZnJHdWlkZSo+IHNvbDsKLSAgICAgIGZvcihhdXRvICZuZXQ6IGdldE5ldHMoKSkgewotICAgICAgICBmb3IgKGF1dG8gJmd1aWRlOiBuZXQtPmdldEd1aWRlcygpKSB7Ci0gICAgICAgICAgc29sLnB1c2hfYmFjayhndWlkZS5nZXQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBzb2w7Ci0gICAgfQotICAgIGNvbnN0IGZyU3RyaW5nJiBnZXROYW1lKCkgY29uc3QgewotICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxmckluc3Q+ID4mIGdldEluc3RzKCkgY29uc3QgewotICAgICAgcmV0dXJuIGluc3RzOwotICAgIH0KLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZnJJbnN0PiA+JiBnZXRJbnN0cygpIHsKLSAgICAgIHJldHVybiBpbnN0czsKLSAgICB9Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGZyTmV0PiA+JiBnZXROZXRzKCkgewotICAgICAgcmV0dXJuIG5ldHM7Ci0gICAgfQotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxmck5ldD4gPiYgZ2V0TmV0cygpIGNvbnN0IHsKLSAgICAgIHJldHVybiBuZXRzOwotICAgIH0KLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZnJOZXQ+ID4mIGdldFNOZXRzKCkgewotICAgICAgcmV0dXJuIHNuZXRzOwotICAgIH0KLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZnJOZXQ+ID4mIGdldFNOZXRzKCkgY29uc3QgewotICAgICAgcmV0dXJuIHNuZXRzOwotICAgIH0KLSAgICBzdGQ6OnZlY3RvcjxmclRyYWNrUGF0dGVybio+IGdldFRyYWNrUGF0dGVybnMoKSBjb25zdCB7Ci0gICAgICBzdGQ6OnZlY3RvcjxmclRyYWNrUGF0dGVybio+IHNvbDsKLSAgICAgIGZvciAoYXV0byAmbTogdHJhY2tQYXR0ZXJucykgewotICAgICAgICBmb3IgKGF1dG8gJm46IG0pIHsKLSAgICAgICAgICBzb2wucHVzaF9iYWNrKG4uZ2V0KCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc29sOwotICAgIH0KLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZnJUcmFja1BhdHRlcm4+ID4mIGdldFRyYWNrUGF0dGVybnMoZnJMYXllck51bSBsTnVtKSBjb25zdCB7Ci0gICAgICByZXR1cm4gdHJhY2tQYXR0ZXJucy5hdChsTnVtKTsKLSAgICB9Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGZyVHJhY2tQYXR0ZXJuPiA+JiBnZXRUcmFja1BhdHRlcm5zKGZyTGF5ZXJOdW0gbE51bSkgewotICAgICAgcmV0dXJuIHRyYWNrUGF0dGVybnMuYXQobE51bSk7Ci0gICAgfQotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxmclRlcm0+ID4mIGdldFRlcm1zKCkgewotICAgICAgcmV0dXJuIHRlcm1zOwotICAgIH0KLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZnJUZXJtPiA+JiBnZXRUZXJtcygpIGNvbnN0IHsKLSAgICAgIHJldHVybiB0ZXJtczsKLSAgICB9Ci0gICAgZnJUZXJtKiBnZXRUZXJtKGNvbnN0IHN0ZDo6c3RyaW5nICZpbikgY29uc3QgewotICAgICAgYXV0byBpdCA9IG5hbWUydGVybS5maW5kKGluKTsKLSAgICAgIGlmIChpdCA9PSBuYW1lMnRlcm0uZW5kKCkpIHsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gaWR4IG11c3QgYmUgbGVnYWwKLSAgICB2b2lkIGdldEdDZWxsQm94KGNvbnN0IGZyUG9pbnQgJmlkeCwgZnJCb3ggJmJveCkgY29uc3QgewotICAgICAgZnJCb3ggZGllQm94OwotICAgICAgZ2V0Qm91bmRhcnlCQm94KGRpZUJveCk7Ci0gICAgICBhdXRvICZncCA9IGdldEdDZWxsUGF0dGVybnMoKTsKLSAgICAgIGF1dG8gJnhncCA9IGdwWzBdOwotICAgICAgYXV0byAmeWdwID0gZ3BbMV07Ci0gICAgICBmckNvb3JkIHhsID0gKGZyQ29vcmQpeGdwLmdldFNwYWNpbmcoKSAqIGlkeC54KCkgICAgICAgKyB4Z3AuZ2V0U3RhcnRDb29yZCgpOwotICAgICAgZnJDb29yZCB5bCA9IChmckNvb3JkKXlncC5nZXRTcGFjaW5nKCkgKiBpZHgueSgpICAgICAgICsgeWdwLmdldFN0YXJ0Q29vcmQoKTsKLSAgICAgIGZyQ29vcmQgeGggPSAoZnJDb29yZCl4Z3AuZ2V0U3BhY2luZygpICogKGlkeC54KCkgKyAxKSArIHhncC5nZXRTdGFydENvb3JkKCk7Ci0gICAgICBmckNvb3JkIHloID0gKGZyQ29vcmQpeWdwLmdldFNwYWNpbmcoKSAqIChpZHgueSgpICsgMSkgKyB5Z3AuZ2V0U3RhcnRDb29yZCgpOwotICAgICAgaWYgKGlkeC54KCkgPT0gMCkgewotICAgICAgICB4bCA9IGRpZUJveC5sZWZ0KCk7Ci0gICAgICB9Ci0gICAgICBpZiAoaWR4LnkoKSA9PSAwKSB7Ci0gICAgICAgIHlsID0gZGllQm94LmJvdHRvbSgpOwotICAgICAgfQotICAgICAgaWYgKGlkeC54KCkgPT0gKGludCl4Z3AuZ2V0Q291bnQoKSAtIDEpIHsKLSAgICAgICAgeGggPSBkaWVCb3gucmlnaHQoKTsKLSAgICAgIH0KLSAgICAgIGlmIChpZHgueSgpID09IChpbnQpeWdwLmdldENvdW50KCkgLSAxKSB7Ci0gICAgICAgIHloID0gZGllQm94LnRvcCgpOwotICAgICAgfQotICAgICAgYm94LnNldCh4bCwgeWwsIHhoLCB5aCk7Ci0gICAgfQotICAgIHZvaWQgZ2V0R0NlbGxDZW50ZXIoY29uc3QgZnJQb2ludCAmaWR4LCBmclBvaW50ICZwdCkgY29uc3QgewotICAgICAgZnJCb3ggZGllQm94OwotICAgICAgZ2V0Qm91bmRhcnlCQm94KGRpZUJveCk7Ci0gICAgICBhdXRvICZncCA9IGdldEdDZWxsUGF0dGVybnMoKTsKLSAgICAgIGF1dG8gJnhncCA9IGdwWzBdOwotICAgICAgYXV0byAmeWdwID0gZ3BbMV07Ci0gICAgICBmckNvb3JkIHhsID0gKGZyQ29vcmQpeGdwLmdldFNwYWNpbmcoKSAqIGlkeC54KCkgICAgICAgKyB4Z3AuZ2V0U3RhcnRDb29yZCgpOwotICAgICAgZnJDb29yZCB5bCA9IChmckNvb3JkKXlncC5nZXRTcGFjaW5nKCkgKiBpZHgueSgpICAgICAgICsgeWdwLmdldFN0YXJ0Q29vcmQoKTsKLSAgICAgIGZyQ29vcmQgeGggPSAoZnJDb29yZCl4Z3AuZ2V0U3BhY2luZygpICogKGlkeC54KCkgKyAxKSArIHhncC5nZXRTdGFydENvb3JkKCk7Ci0gICAgICBmckNvb3JkIHloID0gKGZyQ29vcmQpeWdwLmdldFNwYWNpbmcoKSAqIChpZHgueSgpICsgMSkgKyB5Z3AuZ2V0U3RhcnRDb29yZCgpOwotICAgICAgaWYgKGlkeC54KCkgPT0gMCkgewotICAgICAgICB4bCA9IGRpZUJveC5sZWZ0KCk7Ci0gICAgICB9Ci0gICAgICBpZiAoaWR4LnkoKSA9PSAwKSB7Ci0gICAgICAgIHlsID0gZGllQm94LmJvdHRvbSgpOwotICAgICAgfQotICAgICAgaWYgKGlkeC54KCkgPT0gKGludCl4Z3AuZ2V0Q291bnQoKSAtIDEpIHsKLSAgICAgICAgeGggPSBkaWVCb3gucmlnaHQoKTsKLSAgICAgIH0KLSAgICAgIGlmIChpZHgueSgpID09IChpbnQpeWdwLmdldENvdW50KCkgLSAxKSB7Ci0gICAgICAgIHloID0gZGllQm94LnRvcCgpOwotICAgICAgfQotICAgICAgcHQuc2V0KCh4bCArIHhoKSAvIDIsICh5bCArIHloKSAvIDIpOwotICAgIH0KLSAgICB2b2lkIGdldEdDZWxsSWR4KGNvbnN0IGZyUG9pbnQgJnB0LCBmclBvaW50ICZpZHgpIGNvbnN0IHsKLSAgICAgIGF1dG8gJmdwID0gZ2V0R0NlbGxQYXR0ZXJucygpOwotICAgICAgYXV0byAmeGdwID0gZ3BbMF07Ci0gICAgICBhdXRvICZ5Z3AgPSBncFsxXTsKLSAgICAgIGZyQ29vcmQgaWR4WCA9IChwdC54KCkgLSB4Z3AuZ2V0U3RhcnRDb29yZCgpKSAvIChmckNvb3JkKXhncC5nZXRTcGFjaW5nKCk7Ci0gICAgICBmckNvb3JkIGlkeFkgPSAocHQueSgpIC0geWdwLmdldFN0YXJ0Q29vcmQoKSkgLyAoZnJDb29yZCl5Z3AuZ2V0U3BhY2luZygpOwotICAgICAgaWYgKGlkeFggPCAwKSB7Ci0gICAgICAgIGlkeFggPSAwOwotICAgICAgfQotICAgICAgaWYgKGlkeFkgPCAwKSB7Ci0gICAgICAgIGlkeFkgPSAwOwotICAgICAgfQotICAgICAgaWYgKGlkeFggPj0gKGludCl4Z3AuZ2V0Q291bnQoKSkgewotICAgICAgICBpZHhYID0gKGludCl4Z3AuZ2V0Q291bnQoKSAtIDE7Ci0gICAgICB9Ci0gICAgICBpZiAoaWR4WSA+PSAoaW50KXlncC5nZXRDb3VudCgpKSB7Ci0gICAgICAgIGlkeFkgPSAoaW50KXlncC5nZXRDb3VudCgpIC0gMTsKLSAgICAgIH0KLSAgICAgIGlkeC5zZXQoaWR4WCwgaWR4WSk7Ci0gICAgfQotICAgIE1hY3JvQ2xhc3NFbnVtIGdldE1hY3JvQ2xhc3MoKSB7Ci0gICAgICByZXR1cm4gbWFjcm9DbGFzczsKLSAgICB9Ci0gICAgY29uc3QgZnJMaXN0PHN0ZDo6dW5pcXVlX3B0cjxmck1hcmtlcj4gPiYgZ2V0TWFya2VycygpIGNvbnN0IHsKLSAgICAgIHJldHVybiBtYXJrZXJzOwotICAgIH0KLSAgICBmckxpc3Q8c3RkOjp1bmlxdWVfcHRyPGZyTWFya2VyPiA+JiBnZXRNYXJrZXJzKCkgewotICAgICAgcmV0dXJuIG1hcmtlcnM7Ci0gICAgfQotICAgIGludCBnZXROdW1NYXJrZXJzKCkgY29uc3QgewotICAgICAgcmV0dXJuIG1hcmtlcnMuc2l6ZSgpOwotICAgIH0KLSAgICAvLyBzZXR0ZXJzCi0gICAgdm9pZCBzZXREQlVQZXJVVShmclVJbnQ0IHVJbikgewotICAgICAgZGJVbml0ID0gdUluOwotICAgIH0KLSAgICB2b2lkIHNldE5hbWUoY29uc3QgZnJTdHJpbmcgJm5hbWVJbikgewotICAgICAgbmFtZSA9IG5hbWVJbjsKLSAgICB9Ci0gICAgdm9pZCBhZGRUZXJtKHN0ZDo6dW5pcXVlX3B0cjxmclRlcm0+ICZpbikgewotICAgICAgbmFtZTJ0ZXJtW2luLT5nZXROYW1lKCldID0gaW4uZ2V0KCk7Ci0gICAgICB0ZXJtcy5wdXNoX2JhY2soc3RkOjptb3ZlKGluKSk7Ci0gICAgfQotICAgIHZvaWQgYWRkSW5zdChzdGQ6OnVuaXF1ZV9wdHI8ZnJJbnN0PiAmaW4pIHsKLSAgICAgIG5hbWUyaW5zdFtpbi0+Z2V0TmFtZSgpXSA9IGluLmdldCgpOwotICAgICAgLy9pbi0+c2V0SWQoaW5zdHMuc2l6ZSgpKTsKLSAgICAgIGluc3RzLnB1c2hfYmFjayhzdGQ6Om1vdmUoaW4pKTsKLSAgICB9Ci0gICAgdm9pZCBhZGROZXQoc3RkOjp1bmlxdWVfcHRyPGZyTmV0PiAmaW4pIHsKLSAgICAgIG5hbWUybmV0W2luLT5nZXROYW1lKCldID0gaW4uZ2V0KCk7Ci0gICAgICAvL2luLT5zZXRJZChzbmV0cy5zaXplKCkgKyBuZXRzLnNpemUoKSk7Ci0gICAgICBuZXRzLnB1c2hfYmFjayhzdGQ6Om1vdmUoaW4pKTsKLSAgICB9Ci0gICAgdm9pZCBhZGRTTmV0KHN0ZDo6dW5pcXVlX3B0cjxmck5ldD4gJmluKSB7Ci0gICAgICBuYW1lMnNuZXRbaW4tPmdldE5hbWUoKV0gPSBpbi5nZXQoKTsKLSAgICAgIC8vaW4tPnNldElkKHNuZXRzLnNpemUoKSArIG5ldHMuc2l6ZSgpKTsKLSAgICAgIHNuZXRzLnB1c2hfYmFjayhzdGQ6Om1vdmUoaW4pKTsKLSAgICB9Ci0gICAgdm9pZCBzZXRCb3VuZGFyaWVzKGNvbnN0IHN0ZDo6dmVjdG9yPGZyQm91bmRhcnk+ICZpbikgewotICAgICAgYm91bmRhcmllcyA9IGluOwotICAgIH0KLSAgICB2b2lkIHNldEJsb2NrYWdlcyhzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZnJCbG9ja2FnZT4gPiAmaW4pIHsKLSAgICAgIGZvciAoYXV0byAmYmxrIDogaW4pIHsKLSAgICAgICAgYmxvY2thZ2VzLnB1c2hfYmFjayhzdGQ6Om1vdmUoYmxrKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHZvaWQgc2V0Q01hcChjb25zdCBmckNNYXAgJmNJbikgewotICAgICAgY01hcCA9IGNJbjsKLSAgICB9Ci0gICAgdm9pZCBzZXRHQ2VsbFBhdHRlcm5zKGNvbnN0IHN0ZDo6dmVjdG9yPGZyR0NlbGxQYXR0ZXJuPiAmZ3BJbikgewotICAgICAgZ0NlbGxQYXR0ZXJucyA9IGdwSW47Ci0gICAgfQotICAgIHZvaWQgc2V0TWFjcm9DbGFzcyhjb25zdCBNYWNyb0NsYXNzRW51bSAmaW4pIHsKLSAgICAgIG1hY3JvQ2xhc3MgPSBpbjsKLSAgICB9Ci0gICAgdm9pZCBhZGRNYXJrZXIoc3RkOjp1bmlxdWVfcHRyPGZyTWFya2VyPiAmaW4pIHsKLSAgICAgIGF1dG8gcnB0ciA9IGluLmdldCgpOwotICAgICAgbWFya2Vycy5wdXNoX2JhY2soc3RkOjptb3ZlKGluKSk7Ci0gICAgICBycHRyLT5zZXRJdGVyKC0tKG1hcmtlcnMuZW5kKCkpKTsKLSAgICB9Ci0gICAgdm9pZCByZW1vdmVNYXJrZXIoZnJNYXJrZXIqIGluKSB7Ci0gICAgICBtYXJrZXJzLmVyYXNlKGluLT5nZXRJdGVyKCkpOwotICAgIH0KLSAgICAvLyBvdGhlcnMKLSAgICBmckJsb2NrT2JqZWN0RW51bSB0eXBlSWQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gZnJjQmxvY2s7Ci0gICAgfQotICAgIGZyaWVuZCBjbGFzcyBpbzo6UGFyc2VyOwotCi0gIHByb3RlY3RlZDoKLSAgICBmclN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU7Ci0gICAgZnJVSW50NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYlVuaXQ7Ci0KLSAgICBNYWNyb0NsYXNzRW51bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvQ2xhc3M7Ci0KLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgZnJJbnN0Kj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUyaW5zdDsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZnJJbnN0PiA+ICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RzOwotCi0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGZyVGVybSo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lMnRlcm07Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGZyVGVybT4gPiAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtczsKLQotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBmck5ldCo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTJuZXQ7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGZyTmV0PiA+ICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzOwotICAgIAotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBmck5ldCo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTJzbmV0OwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxmck5ldD4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgc25ldHM7Ci0KLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZnJCbG9ja2FnZT4gPiAgICAgICAgICAgICAgICAgICAgIGJsb2NrYWdlczsKLSAgICAKLSAgICBzdGQ6OnZlY3RvcjxmckJvdW5kYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kYXJpZXM7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGZyVHJhY2tQYXR0ZXJuPiA+ID4gICB0cmFja1BhdHRlcm5zOwotICAgIGZyQ01hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY01hcDsKLSAgICBzdGQ6OnZlY3RvcjxmckdDZWxsUGF0dGVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdDZWxsUGF0dGVybnM7Ci0KLSAgICBmckxpc3Q8c3RkOjp1bmlxdWVfcHRyPGZyTWFya2VyPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlcnM7Ci0gIH07Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvb2JqL2ZyQmxvY2tPYmplY3QuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL29iai9mckJsb2NrT2JqZWN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNGU2OTUuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvb2JqL2ZyQmxvY2tPYmplY3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX0ZSX0JMT0NLT0JKRUNUX0hfCi0jZGVmaW5lIF9GUl9CTE9DS09CSkVDVF9IXwotCi0jaW5jbHVkZSAiZnJCYXNlVHlwZXMuaCIKLQotbmFtZXNwYWNlIGZyIHsKLSAgY2xhc3MgZnJCbG9ja09iamVjdCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBjb25zdHJ1Y3RvcnMKLSAgICAvL2ZyQmxvY2tPYmplY3QoKSB7fQotICAgIGZyQmxvY2tPYmplY3QoKTogaWQoLTEpIHt9Ci0gICAgZnJCbG9ja09iamVjdChjb25zdCBmckJsb2NrT2JqZWN0ICZpbik6IGlkKGluLmlkKSB7fQotICAgIHZpcnR1YWwgfmZyQmxvY2tPYmplY3QoKSB7fQotICAgIC8vIGdldHRlcnMKLSAgICBpbnQgZ2V0SWQoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gaWQ7Ci0gICAgfQotICAgIC8vIHNldHRlcnMKLSAgICB2b2lkIHNldElkKGludCBpbikgewotICAgICAgaWQgPSBpbjsKLSAgICB9Ci0gICAgLy8gb3RoZXJzCi0gICAgdmlydHVhbCBmckJsb2NrT2JqZWN0RW51bSB0eXBlSWQoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gZnJjQmxvY2tPYmplY3Q7Ci0gICAgfQotICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IGZyQmxvY2tPYmplY3QgJnJocykgY29uc3QgewotICAgICAgcmV0dXJuIGlkIDwgcmhzLmlkOwotICAgIH0KLSAgcHJvdGVjdGVkOgotICAgIGludCBpZDsKLSAgfTsKLSAgc3RydWN0IGZyQmxvY2tPYmplY3RDb21wIHsKLSAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgZnJCbG9ja09iamVjdCogbGhzLCBjb25zdCBmckJsb2NrT2JqZWN0KiByaHMpIGNvbnN0IHsKLSAgICAgIHJldHVybiAqbGhzIDwgKnJoczsKLSAgICB9Ci0gIH07Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvb2JqL2ZyQmxvY2thZ2UuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL29iai9mckJsb2NrYWdlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhN2RkOGQuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvb2JqL2ZyQmxvY2thZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIF9GUl9CTE9DS0FHRV9IXwotI2RlZmluZSBfRlJfQkxPQ0tBR0VfSF8KLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlICJmckJhc2VUeXBlcy5oIgotI2luY2x1ZGUgImRiL29iai9mckZpZy5oIgotCi1uYW1lc3BhY2UgZnIgewotICBjbGFzcyBmckJsb2NrYWdlOiBwdWJsaWMgZnJGaWcgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3JzCi0gICAgZnJCbG9ja2FnZSgpOiBmckZpZygpLCBwb2ludHMoKSwgb3duZXIobnVsbHB0cikge30KLSAgICAvLyBnZXR0ZXJzCi0gICAgZnJCbG9ja09iamVjdCogZ2V0T3duZXIoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gb3duZXI7Ci0gICAgfQotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGZyUG9pbnQ+JiBnZXRQb2ludHMoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gcG9pbnRzOwotICAgIH0KLSAgICBzdGQ6OnZlY3RvcjxmclBvaW50PiYgZ2V0UG9pbnRzKCkgewotICAgICAgcmV0dXJuIHBvaW50czsKLSAgICB9Ci0gICAgZnJVSW50NCBnZXROdW1Qb2ludHMoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gcG9pbnRzLnNpemUoKTsKLSAgICB9Ci0gICAgLy8gc2V0dGVycwotICAgIHZvaWQgc2V0T3duZXIoZnJCbG9ja09iamVjdCogaW4pIHsKLSAgICAgIG93bmVyID0gaW47Ci0gICAgfQotICAgIHZvaWQgc2V0UG9pbnRzKGNvbnN0IGZyOjpmckNvbGxlY3Rpb248ZnJQb2ludD4gJnBJbikgewotICAgICAgcG9pbnRzID0gcEluOwotICAgIH0KLSAgICAvLyBvdGhlcnMKLSAgICBmckJsb2NrT2JqZWN0RW51bSB0eXBlSWQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gZnJjQmxvY2thZ2U7Ci0gICAgfQotCi0gICAgdm9pZCBnZXRCQm94KGZyQm94ICZib3hJbikgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgZnJDb29yZCBsbHggPSAwOwotICAgICAgZnJDb29yZCBsbHkgPSAwOwotICAgICAgZnJDb29yZCB1cnggPSAwOwotICAgICAgZnJDb29yZCB1cnkgPSAwOwotICAgICAgaWYgKHBvaW50cy5zaXplKCkpIHsKLSAgICAgICAgbGx4ID0gcG9pbnRzLmJlZ2luKCktPngoKTsKLSAgICAgICAgdXJ4ID0gcG9pbnRzLmJlZ2luKCktPngoKTsKLSAgICAgICAgbGx5ID0gcG9pbnRzLmJlZ2luKCktPnkoKTsKLSAgICAgICAgdXJ5ID0gcG9pbnRzLmJlZ2luKCktPnkoKTsKLSAgICAgIH0KLSAgICAgIGZvciAoYXV0byAmcG9pbnQ6IHBvaW50cykgewotICAgICAgICBsbHggPSAobGx4IDwgcG9pbnQueCgpKSA/IGxseCA6IHBvaW50LngoKTsKLSAgICAgICAgbGx5ID0gKGxseSA8IHBvaW50LnkoKSkgPyBsbHkgOiBwb2ludC55KCk7Ci0gICAgICAgIHVyeCA9ICh1cnggPiBwb2ludC54KCkpID8gdXJ4IDogcG9pbnQueCgpOwotICAgICAgICB1cnkgPSAodXJ5ID4gcG9pbnQueSgpKSA/IHVyeSA6IHBvaW50LnkoKTsKLSAgICAgIH0KLSAgICAgIGJveEluLnNldChsbHgsIGxseSwgdXJ4LCB1cnkpOwotICAgIH0KLSAgICB2b2lkIG1vdmUoY29uc3QgZnJUcmFuc2Zvcm0gJnhmb3JtKSBvdmVycmlkZSB7Ci0gICAgICBmb3IgKGF1dG8gJnBvaW50OiBwb2ludHMpIHsKLSAgICAgICAgcG9pbnQudHJhbnNmb3JtKHhmb3JtKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgYm9vbCBvdmVybGFwcyhjb25zdCBmckJveCAmYm94KSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBwcm90ZWN0ZWQ6Ci0gICAgc3RkOjp2ZWN0b3I8ZnJQb2ludD4gcG9pbnRzOwotICAgIGZyQmxvY2tPYmplY3QqICAgICAgIG93bmVyOyAvLyBvcHRpb25hbCwgc2V0IGxhdGVyCi0gIH07Ci0KLSAgY2xhc3MgZnJMYXllckJsb2NrYWdlOiBwdWJsaWMgZnJCbG9ja2FnZSB7Ci0gIHB1YmxpYzoKLSAgICAvLyBjb25zdHJ1Y3RvcnMKLSAgICBmckxheWVyQmxvY2thZ2UoKTogZnJCbG9ja2FnZSgpIHt9Ci0gICAgLy8gZ2V0dGVycwotICAgIGZyTGF5ZXJOdW0gZ2V0TGF5ZXJOdW0oKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbGF5ZXJOdW07Ci0gICAgfQotICAgIC8vIHNldHRlcnMKLSAgICB2b2lkIHNldExheWVyTnVtKGZyTGF5ZXJOdW0gbnVtSW4pIHsKLSAgICAgIGxheWVyTnVtID0gbnVtSW47Ci0gICAgfQotCi0gICAgLy8gb3RoZXJzCi0gICAgZnJCbG9ja09iamVjdEVudW0gdHlwZUlkKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIGZyY0xheWVyQmxvY2thZ2U7Ci0gICAgfQotICBwcm90ZWN0ZWQ6Ci0gICAgZnJMYXllck51bSBsYXllck51bTsKLSAgfTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9vYmovZnJCb3VuZGFyeS5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvb2JqL2ZyQm91bmRhcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRmOWMyYi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9vYmovZnJCb3VuZGFyeS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyogQXV0aG9yczogTHV0b25nIFdhbmcgYW5kIEJhbmdxaSBYdSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBfRlJfQk9VTkRBUllfSF8KLSNkZWZpbmUgX0ZSX0JPVU5EQVJZX0hfCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSAiZnJCYXNlVHlwZXMuaCIKLSNpbmNsdWRlICJkYi9vYmovZnJGaWcuaCIKLQotbmFtZXNwYWNlIGZyIHsKLSAgY2xhc3MgZnJCb3VuZGFyeTogcHVibGljIGZyRmlnIHsKLSAgcHVibGljOgotICAgIC8vIGNvbnN0cnVjdG9ycwotICAgIGZyQm91bmRhcnkoKTogZnJGaWcoKSB7fQotICAgIC8vIGdldHRlcnMKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxmclBvaW50PiYgZ2V0UG9pbnRzKCkgY29uc3QgewotICAgICAgcmV0dXJuIHBvaW50czsKLSAgICB9Ci0gICAgc3RkOjp2ZWN0b3I8ZnJQb2ludD4mIGdldFBvaW50cygpIHsKLSAgICAgIHJldHVybiBwb2ludHM7Ci0gICAgfQotICAgIGZyVUludDQgZ2V0TnVtUG9pbnRzKCkgY29uc3QgewotICAgICAgcmV0dXJuIHBvaW50cy5zaXplKCk7Ci0gICAgfQotICAgIC8vIHNldHRlcnMKLSAgICB2b2lkIHNldFBvaW50cyhjb25zdCBzdGQ6OnZlY3RvcjxmclBvaW50PiAmcEluKSB7Ci0gICAgICBwb2ludHMgPSBwSW47Ci0gICAgfQotICAgIC8vIG90aGVycwotICAgIGZyQmxvY2tPYmplY3RFbnVtIHR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiBmcmNCb3VuZGFyeTsKLSAgICB9Ci0KLSAgICB2b2lkIGdldEJCb3goZnJCb3ggJmJveEluKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICBmckNvb3JkIGxseCA9IDA7Ci0gICAgICBmckNvb3JkIGxseSA9IDA7Ci0gICAgICBmckNvb3JkIHVyeCA9IDA7Ci0gICAgICBmckNvb3JkIHVyeSA9IDA7Ci0gICAgICBpZiAocG9pbnRzLnNpemUoKSkgewotICAgICAgICBsbHggPSBwb2ludHMuYmVnaW4oKS0+eCgpOwotICAgICAgICB1cnggPSBwb2ludHMuYmVnaW4oKS0+eCgpOwotICAgICAgICBsbHkgPSBwb2ludHMuYmVnaW4oKS0+eSgpOwotICAgICAgICB1cnkgPSBwb2ludHMuYmVnaW4oKS0+eSgpOwotICAgICAgfQotICAgICAgZm9yIChhdXRvICZwb2ludDogcG9pbnRzKSB7Ci0gICAgICAgIGxseCA9IChsbHggPCBwb2ludC54KCkpID8gbGx4IDogcG9pbnQueCgpOwotICAgICAgICBsbHkgPSAobGx5IDwgcG9pbnQueSgpKSA/IGxseSA6IHBvaW50LnkoKTsKLSAgICAgICAgdXJ4ID0gKHVyeCA+IHBvaW50LngoKSkgPyB1cnggOiBwb2ludC54KCk7Ci0gICAgICAgIHVyeSA9ICh1cnkgPiBwb2ludC55KCkpID8gdXJ5IDogcG9pbnQueSgpOwotICAgICAgfQotICAgICAgYm94SW4uc2V0KGxseCwgbGx5LCB1cngsIHVyeSk7Ci0gICAgfQotICAgIHZvaWQgbW92ZShjb25zdCBmclRyYW5zZm9ybSAmeGZvcm0pIG92ZXJyaWRlIHsKLSAgICAgIGZvciAoYXV0byAmcG9pbnQ6IHBvaW50cykgewotICAgICAgICBwb2ludC50cmFuc2Zvcm0oeGZvcm0pOwotICAgICAgfQotICAgIH0KLSAgICBib29sIG92ZXJsYXBzKGNvbnN0IGZyQm94ICZib3gpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHByb3RlY3RlZDoKLSAgICBzdGQ6OnZlY3RvcjxmclBvaW50PiBwb2ludHM7Ci0gIH07Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvb2JqL2ZyQ01hcC5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvb2JqL2ZyQ01hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjUxMjMwLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL29iai9mckNNYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIF9GUl9DTUFQX0hfCi0jZGVmaW5lIF9GUl9DTUFQX0hfCi0KLSNpbmNsdWRlICJkYi9vYmovZnJCbG9ja09iamVjdC5oIgotCi1uYW1lc3BhY2UgZnIgewotICBjbGFzcyBmckdDZWxsUGF0dGVybjogcHVibGljIGZyQmxvY2tPYmplY3QgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3JzCi0gICAgZnJHQ2VsbFBhdHRlcm4oKTogZnJCbG9ja09iamVjdCgpIHt9Ci0gICAgLy8gZ2V0dGVycwotICAgIGJvb2wgaXNIb3Jpem9udGFsKCkgY29uc3QgewotICAgICAgcmV0dXJuIGhvcml6b250YWw7Ci0gICAgfQotICAgIGZyQ29vcmQgZ2V0U3RhcnRDb29yZCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBzdGFydENvb3JkOwotICAgIH0KLSAgICBmclVJbnQ0IGdldFNwYWNpbmcoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gc3BhY2luZzsKLSAgICB9Ci0gICAgZnJVSW50NCBnZXRDb3VudCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBjb3VudDsKLSAgICB9Ci0gICAgLy8gc2V0dGVycwotICAgIHZvaWQgc2V0SG9yaXpvbnRhbChib29sIGlzSCkgewotICAgICAgaG9yaXpvbnRhbCA9IGlzSDsKLSAgICB9Ci0gICAgdm9pZCBzZXRTdGFydENvb3JkKGZyQ29vcmQgc2NJbikgewotICAgICAgc3RhcnRDb29yZCA9IHNjSW47Ci0gICAgfQotICAgIHZvaWQgc2V0U3BhY2luZyhmclVJbnQ0IHNJbikgewotICAgICAgc3BhY2luZyA9IHNJbjsKLSAgICB9Ci0gICAgdm9pZCBzZXRDb3VudChmclVJbnQ0IGNJbikgewotICAgICAgY291bnQgPSBjSW47Ci0gICAgfQotICAgIC8vIG90aGVycwotICBwcm90ZWN0ZWQ6Ci0gICAgYm9vbCAgICBob3Jpem9udGFsOwotICAgIGZyQ29vcmQgc3RhcnRDb29yZDsKLSAgICBmclVJbnQ0IHNwYWNpbmc7Ci0gICAgZnJVSW50NCBjb3VudDsKLSAgfTsKLQotICBjbGFzcyBmckNNYXA6IHB1YmxpYyBmckJsb2NrT2JqZWN0IHsKLSAgcHVibGljOgotICAgIC8vIGNvbnN0cnVjdG9ycwotICAgIGZyQ01hcCgpOiBmckJsb2NrT2JqZWN0KCksIG51bVgoMCksIG51bVkoMCkge30KLSAgICAvLyBnZXR0ZXJzCi0gICAgZnJVSW50NCBnZXRUaHJvdWdoRGVtYW5kKGZyVUludDQgeEluZGV4LCBmclVJbnQ0IHlJbmRleCwgZnJMYXllck51bSBsYXllck51bSkgY29uc3QgewotICAgICAgcmV0dXJuIGNtYXBfdGhyb3VnaC5hdCh4SW5kZXgpLmF0KHlJbmRleCkuYXQobGF5ZXJOdW0vMik7Ci0gICAgfQotICAgIGZyVUludDQgZ2V0TG9jYWxEZW1hbmQoZnJVSW50NCB4SW5kZXgsIGZyVUludDQgeUluZGV4LCBmckxheWVyTnVtIGxheWVyTnVtKSBjb25zdCB7Ci0gICAgICByZXR1cm4gY21hcF9sb2NhbC5hdCh4SW5kZXgpLmF0KHlJbmRleCkuYXQobGF5ZXJOdW0vMik7Ci0gICAgfQotICAgIGZyVUludDQgZ2V0RWRnZTFEZW1hbmQoZnJVSW50NCB4SW5kZXgsIGZyVUludDQgeUluZGV4LCBmckxheWVyTnVtIGxheWVyTnVtKSBjb25zdCB7Ci0gICAgICByZXR1cm4gY21hcF9lZGdlMS5hdCh4SW5kZXgpLmF0KHlJbmRleCkuYXQobGF5ZXJOdW0vMik7Ci0gICAgfQotICAgIGZyVUludDQgZ2V0RWRnZTJEZW1hbmQoZnJVSW50NCB4SW5kZXgsIGZyVUludDQgeUluZGV4LCBmckxheWVyTnVtIGxheWVyTnVtKSBjb25zdCB7Ci0gICAgICByZXR1cm4gY21hcF9lZGdlMi5hdCh4SW5kZXgpLmF0KHlJbmRleCkuYXQobGF5ZXJOdW0vMik7Ci0gICAgfQotICAgIGZyVUludDQgZ2V0VXBEZW1hbmQoZnJVSW50NCB4SW5kZXgsIGZyVUludDQgeUluZGV4LCBmckxheWVyTnVtIGxheWVyTnVtKSBjb25zdCB7Ci0gICAgICByZXR1cm4gY21hcF91cC5hdCh4SW5kZXgpLmF0KHlJbmRleCkuYXQobGF5ZXJOdW0vMik7Ci0gICAgfQotICAgIGZyVUludDQgZ2V0RG93bkRlbWFuZChmclVJbnQ0IHhJbmRleCwgZnJVSW50NCB5SW5kZXgsIGZyTGF5ZXJOdW0gbGF5ZXJOdW0pIGNvbnN0IHsKLSAgICAgIGlmIChsYXllck51bSA9PSAwKSB7IAotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBjbWFwX3VwLmF0KHhJbmRleCkuYXQoeUluZGV4KS5hdChsYXllck51bS8yIC0gMSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGZyVUludDQgZ2V0U3VwcGx5KGZyVUludDQgeEluZGV4LCBmclVJbnQ0IHlJbmRleCwgZnJMYXllck51bSBsYXllck51bSkgY29uc3QgewotICAgICAgcmV0dXJuIHN1cHBseS5hdCh4SW5kZXgpLmF0KHlJbmRleCkuYXQobGF5ZXJOdW0vMik7Ci0gICAgfQotICAgIGZyVUludDQgZ2V0TnVtWCgpIHsKLSAgICAgIHJldHVybiBudW1YOwotICAgIH0KLSAgICBmclVJbnQ0IGdldE51bVkoKSB7Ci0gICAgICByZXR1cm4gbnVtWTsKLSAgICB9Ci0gICAgLy8gc2V0dGVycwotICAgIHZvaWQgc2V0VGhyb3VnaERlbWFuZChmclVJbnQ0IHhJbmRleCwgZnJVSW50NCB5SW5kZXgsIGZyTGF5ZXJOdW0gbGF5ZXJOdW0sIGZyVUludDQgbnVtKSB7Ci0gICAgICBjbWFwX3Rocm91Z2guYXQoeEluZGV4KS5hdCh5SW5kZXgpLmF0KGxheWVyTnVtLzIpID0gbnVtOwotICAgIH0KLSAgICB2b2lkIHNldExvY2FsRGVtYW5kKGZyVUludDQgeEluZGV4LCBmclVJbnQ0IHlJbmRleCwgZnJMYXllck51bSBsYXllck51bSwgZnJVSW50NCBudW0pIHsKLSAgICAgIGNtYXBfbG9jYWwuYXQoeEluZGV4KS5hdCh5SW5kZXgpLmF0KGxheWVyTnVtLzIpICAgPSBudW07Ci0gICAgfQotICAgIHZvaWQgc2V0RWRnZTFEZW1hbmQoZnJVSW50NCB4SW5kZXgsIGZyVUludDQgeUluZGV4LCBmckxheWVyTnVtIGxheWVyTnVtLCBmclVJbnQ0IG51bSkgewotICAgICAgY21hcF9lZGdlMS5hdCh4SW5kZXgpLmF0KHlJbmRleCkuYXQobGF5ZXJOdW0vMikgICA9IG51bTsKLSAgICB9Ci0gICAgdm9pZCBzZXRFZGdlMkRlbWFuZChmclVJbnQ0IHhJbmRleCwgZnJVSW50NCB5SW5kZXgsIGZyTGF5ZXJOdW0gbGF5ZXJOdW0sIGZyVUludDQgbnVtKSB7Ci0gICAgICBjbWFwX2VkZ2UyLmF0KHhJbmRleCkuYXQoeUluZGV4KS5hdChsYXllck51bS8yKSAgID0gbnVtOwotICAgIH0KLSAgICB2b2lkIHNldFVwRGVtYW5kKGZyVUludDQgeEluZGV4LCBmclVJbnQ0IHlJbmRleCwgZnJMYXllck51bSBsYXllck51bSwgZnJVSW50NCBudW0pIHsKLSAgICAgIGNtYXBfdXAuYXQoeEluZGV4KS5hdCh5SW5kZXgpLmF0KGxheWVyTnVtLzIpICAgICAgPSBudW07Ci0gICAgfQotICAgIHZvaWQgc2V0U3VwcGx5KGZyVUludDQgeEluZGV4LCBmclVJbnQ0IHlJbmRleCwgZnJMYXllck51bSBsYXllck51bSwgZnJVSW50NCBudW0pIHsKLSAgICAgIHN1cHBseS5hdCh4SW5kZXgpLmF0KHlJbmRleCkuYXQobGF5ZXJOdW0vMikgICAgICA9IG51bTsKLSAgICB9Ci0gICAgLy8gb3RoZXJzCi0gICAgdm9pZCBpbml0KGZyVUludDQgbnVtWCwgZnJVSW50NCBudW1ZLCBmckxheWVyTnVtIHRvcExheWVyKSB7Ci0gICAgICB0aGlzLT5udW1YID0gbnVtWDsKLSAgICAgIHRoaXMtPm51bVkgPSBudW1ZOwotICAgICAgZnJDb2xsZWN0aW9uPGZyVUludDQ+IHYzKHRvcExheWVyLzIgKyAxLCAwKTsKLSAgICAgIGZyQ29sbGVjdGlvbjxmckNvbGxlY3Rpb248ZnJVSW50ND4gPiB2MihudW1ZLCB2Myk7Ci0gICAgICBmckNvbGxlY3Rpb248ZnJDb2xsZWN0aW9uPGZyQ29sbGVjdGlvbjxmclVJbnQ0PiA+ID4gdjEobnVtWCwgdjIpOwotICAgICAgc3VwcGx5ID0gY21hcF90aHJvdWdoID0gY21hcF9sb2NhbCA9IGNtYXBfZWRnZTE9ICBjbWFwX2VkZ2UyID0gY21hcF91cCA9IHYxOwotICAgIH0KLQotICBwcm90ZWN0ZWQ6Ci0gICAgZnJVSW50NCBudW1YLCBudW1ZOwotICAgIGZyQ29sbGVjdGlvbjxmckNvbGxlY3Rpb248ZnJDb2xsZWN0aW9uPGZyVUludDQ+ID4gPiBzdXBwbHk7Ci0gICAgZnJDb2xsZWN0aW9uPGZyQ29sbGVjdGlvbjxmckNvbGxlY3Rpb248ZnJVSW50ND4gPiA+IGNtYXBfdGhyb3VnaDsKLSAgICBmckNvbGxlY3Rpb248ZnJDb2xsZWN0aW9uPGZyQ29sbGVjdGlvbjxmclVJbnQ0PiA+ID4gY21hcF9sb2NhbDsKLSAgICBmckNvbGxlY3Rpb248ZnJDb2xsZWN0aW9uPGZyQ29sbGVjdGlvbjxmclVJbnQ0PiA+ID4gY21hcF9lZGdlMTsKLSAgICBmckNvbGxlY3Rpb248ZnJDb2xsZWN0aW9uPGZyQ29sbGVjdGlvbjxmclVJbnQ0PiA+ID4gY21hcF9lZGdlMjsKLSAgICBmckNvbGxlY3Rpb248ZnJDb2xsZWN0aW9uPGZyQ29sbGVjdGlvbjxmclVJbnQ0PiA+ID4gY21hcF91cDsKLSAgfTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9vYmovZnJGaWcuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL29iai9mckZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGRhYjk3Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL29iai9mckZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX0ZSX0ZJR19IXwotI2RlZmluZSBfRlJfRklHX0hfCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSAiZGIvb2JqL2ZyQmxvY2tPYmplY3QuaCIKLSNpbmNsdWRlICJkYi9pbmZyYS9mckJveC5oIgotI2luY2x1ZGUgImRiL2luZnJhL2ZyVHJhbnNmb3JtLmgiCi0KLW5hbWVzcGFjZSBmciB7Ci0gIGNsYXNzIGZyRmlnOiBwdWJsaWMgZnJCbG9ja09iamVjdCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBjb25zdHJ1Y3RvcnMKLSAgICBmckZpZygpOiBmckJsb2NrT2JqZWN0KCkge30KLSAgICAvLyBnZXR0ZXJzCi0gICAgdmlydHVhbCB2b2lkIGdldEJCb3goZnJCb3ggJmJveCkgY29uc3QgPSAwOwotICAgIC8vdmlydHVhbCB2b2lkIGdldEJCb3goYm94X3QgJmJveCkgY29uc3QgPSAwOwotICAgIC8vIHNldHRlcnMKLSAgICAvLyBvdGhlcnMKLSAgICAvL2ZyQmxvY2tPYmplY3RFbnVtIHR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgbW92ZShjb25zdCBmclRyYW5zZm9ybSAmeGZvcm0pID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wgb3ZlcmxhcHMoY29uc3QgZnJCb3ggJmJveCkgY29uc3QgPSAwOwotICBwcm90ZWN0ZWQ6Ci0gIH07Ci0KLSAgY2xhc3MgZnJOZXQ7Ci0gIGNsYXNzIGZyQ29ubkZpZzogcHVibGljIGZyRmlnIHsKLSAgcHVibGljOgotICAgIC8vIGNvbnN0cnVjdG9ycwotICAgIGZyQ29ubkZpZygpOiBmckZpZygpIHt9Ci0gICAgLy8gZ2V0dGVycwotICAgIHZpcnR1YWwgYm9vbCBoYXNOZXQoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBmck5ldCogZ2V0TmV0KCkgY29uc3QgPSAwOwotICAgIC8vIHNldHRlcnMKLSAgICB2aXJ0dWFsIHZvaWQgYWRkVG9OZXQoZnJOZXQqIGluKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIHJlbW92ZUZyb21OZXQoKSA9IDA7Ci0gICAgLy8gb3RoZXJzCi0gICAgLy9mckJsb2NrT2JqZWN0RW51bSB0eXBlSWQoKSBjb25zdCBvdmVycmlkZSA9IDA7Ci0KLSAgICAvKiBmcm9tIGZyRmlnCi0gICAgICogZ2V0QkJveAotICAgICAqIG1vdmUKLSAgICAgKiBvdmVybGFwcwotICAgICAqLwotICBwcm90ZWN0ZWQ6Ci0gIH07Ci0KLSAgY2xhc3MgZnJQaW47Ci0gIGNsYXNzIGZyUGluRmlnOiBwdWJsaWMgZnJDb25uRmlnIHsKLSAgcHVibGljOgotICAgIGZyUGluRmlnKCk6IGZyQ29ubkZpZygpIHt9Ci0gICAgLy8gZ2V0dGVycwotICAgIHZpcnR1YWwgYm9vbCBoYXNQaW4oKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBmclBpbiogZ2V0UGluKCkgY29uc3QgPSAwOwotICAgIC8vIHNldHRlcnMKLSAgICB2aXJ0dWFsIHZvaWQgYWRkVG9QaW4oZnJQaW4qIGluKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIHJlbW92ZUZyb21QaW4oKSA9IDA7Ci0gICAgLy8gb3RoZXJzCi0gICAgLy9mckJsb2NrT2JqZWN0RW51bSB0eXBlSWQoKSBjb25zdCBvdmVycmlkZSA9IDA7Ci0KLSAgICAvKiBmcm9tIGZyQ29ubkZpZwotICAgICAqIGhhc05ldAotICAgICAqIGdldE5ldAotICAgICAqIGFkZFRvTmV0Ci0gICAgICogcmVtb3ZlRnJvbU5ldAotICAgICAqLwotCi0gICAgLyogZnJvbSBmckZpZwotICAgICAqIGdldEJCb3gKLSAgICAgKiBtb3ZlCi0gICAgICogb3ZlcmxhcHMKLSAgICAgKi8KLSAgcHJvdGVjdGVkOgotICB9OwotCi19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvb2JqL2ZyR3VpZGUuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL29iai9mckd1aWRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMTg5YTAuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvb2JqL2ZyR3VpZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIF9GUl9HVUlERV9IXwotI2RlZmluZSBfRlJfR1VJREVfSF8KLQotI2luY2x1ZGUgImZyQmFzZVR5cGVzLmgiCi0jaW5jbHVkZSAiZGIvb2JqL2ZyRmlnLmgiCi0KLW5hbWVzcGFjZSBmciB7Ci0gIGNsYXNzIGZyTmV0OwotICBjbGFzcyBmckd1aWRlOiBwdWJsaWMgZnJDb25uRmlnIHsKLSAgcHVibGljOgotICAgIGZyR3VpZGUoKTogZnJDb25uRmlnKCksIGJlZ2luKCksIGVuZCgpLCBiZWdpbkxheWVyKDApLCBlbmRMYXllcigwKSwgcm91dGVPYmooKSwgbmV0KG51bGxwdHIpIHt9Ci0gICAgZnJHdWlkZShjb25zdCBmckd1aWRlICZpbik6IGZyQ29ubkZpZygpLCBiZWdpbihpbi5iZWdpbiksIGVuZChpbi5lbmQpLCBiZWdpbkxheWVyKGluLmJlZ2luTGF5ZXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRMYXllcihpbi5lbmRMYXllciksIHJvdXRlT2JqKCksIG5ldChudWxscHRyKSB7fQotICAgIC8vIGdldHRlcnMKLSAgICB2b2lkIGdldFBvaW50cyhmclBvaW50ICZiZWdpbkluLCBmclBvaW50ICZlbmRJbikgY29uc3QgewotICAgICAgYmVnaW5Jbi5zZXQoYmVnaW4pOwotICAgICAgZW5kSW4uc2V0KGVuZCk7Ci0gICAgfQotICAgIGZyTGF5ZXJOdW0gZ2V0QmVnaW5MYXllck51bSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBiZWdpbkxheWVyOwotICAgIH0KLSAgICBmckxheWVyTnVtIGdldEVuZExheWVyTnVtKCkgY29uc3QgewotICAgICAgcmV0dXJuIGVuZExheWVyOwotICAgIH0KLSAgICBib29sIGhhc1JvdXRlcygpIGNvbnN0IHsKLSAgICAgIHJldHVybiByb3V0ZU9iai5lbXB0eSgpID8gZmFsc2UgOiB0cnVlOwotICAgIH0KLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZnJDb25uRmlnPiA+JiBnZXRSb3V0ZXMoKSB7Ci0gICAgICByZXR1cm4gcm91dGVPYmo7Ci0gICAgfQotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxmckNvbm5GaWc+ID4mIGdldFJvdXRlcygpIGNvbnN0IHsKLSAgICAgIHJldHVybiByb3V0ZU9iajsKLSAgICB9Ci0gICAgLy8gc2V0dGVycwotICAgIHZvaWQgc2V0UG9pbnRzKGNvbnN0IGZyUG9pbnQgJmJlZ2luSW4sIGNvbnN0IGZyUG9pbnQgJmVuZEluKSB7Ci0gICAgICBiZWdpbi5zZXQoYmVnaW5Jbik7Ci0gICAgICBlbmQuc2V0KGVuZEluKTsKLSAgICB9Ci0gICAgdm9pZCBzZXRCZWdpbkxheWVyTnVtIChmckxheWVyTnVtIG51bUluKSB7Ci0gICAgICBiZWdpbkxheWVyID0gbnVtSW47Ci0gICAgfQotICAgIHZvaWQgc2V0RW5kTGF5ZXJOdW0gKGZyTGF5ZXJOdW0gbnVtSW4pIHsKLSAgICAgIGVuZExheWVyID0gbnVtSW47Ci0gICAgfQotICAgIHZvaWQgYWRkUm91dGUoc3RkOjp1bmlxdWVfcHRyPGZyQ29ubkZpZz4gJmNmZ0luKSB7Ci0gICAgICByb3V0ZU9iai5wdXNoX2JhY2soc3RkOjptb3ZlKGNmZ0luKSk7Ci0gICAgfQotICAgIHZvaWQgc2V0Um91dGVzKHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxmckNvbm5GaWc+ID4gJnJvdXRlc0luKSB7Ci0gICAgICByb3V0ZU9iaiA9IHN0ZDo6bW92ZShyb3V0ZXNJbik7Ci0gICAgfQotICAgIC8vIG90aGVycwotICAgIGZyQmxvY2tPYmplY3RFbnVtIHR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiBmcmNHdWlkZTsKLSAgICB9Ci0KLSAgICAvKiBmcm9tIGZyQ29ubkZpZwotICAgICAqIGhhc05ldAotICAgICAqIGdldE5ldAotICAgICAqIGFkZFRvTmV0Ci0gICAgICogcmVtb3ZlRnJvbU5ldAotICAgICAqLwotICAgIGJvb2wgaGFzTmV0KCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIChuZXQpOwotICAgIH0KLSAgICBmck5ldCogZ2V0TmV0KCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIG5ldDsKLSAgICB9Ci0gICAgdm9pZCBhZGRUb05ldChmck5ldCogaW4pIG92ZXJyaWRlIHsKLSAgICAgIG5ldCA9IGluOwotICAgIH0KLSAgICB2b2lkIHJlbW92ZUZyb21OZXQoKSBvdmVycmlkZSB7Ci0gICAgICBuZXQgPSBudWxscHRyOwotICAgIH0KLQotICAgIC8qIGZyb20gZnJGaWcKLSAgICAgKiBnZXRCQm94Ci0gICAgICogbW92ZSwgaW4gLmNwcAotICAgICAqIG92ZXJsYXBzLCBpbmNvbXBsZXRlCi0gICAgICovCi0gICAgLy8gbmVlZHMgdG8gYmUgdXBkYXRlZAotICAgIHZvaWQgZ2V0QkJveChmckJveCAmYm94SW4pIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIGJveEluLnNldChiZWdpbiwgZW5kKTsKLSAgICB9Ci0gICAgdm9pZCBtb3ZlKGNvbnN0IGZyVHJhbnNmb3JtICZ4Zm9ybSkgb3ZlcnJpZGUgewotICAgICAgOwotICAgIH0KLSAgICBib29sIG92ZXJsYXBzKGNvbnN0IGZyQm94ICZib3gpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcHJvdGVjdGVkOgotICAgIGZyUG9pbnQgYmVnaW47Ci0gICAgZnJQb2ludCBlbmQ7Ci0gICAgZnJMYXllck51bSBiZWdpbkxheWVyOwotICAgIGZyTGF5ZXJOdW0gZW5kTGF5ZXI7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGZyQ29ubkZpZz4gPiByb3V0ZU9iajsKLSAgICBmck5ldCogbmV0OwotICB9OwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL29iai9mckluc3QuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvb2JqL2ZySW5zdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOTJkYTYuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvb2JqL2ZySW5zdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiZGIvb2JqL2ZySW5zdC5oIgotI2luY2x1ZGUgImZyQmxvY2suaCIKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgZnI7Ci0KLXZvaWQgZnJJbnN0OjpnZXRCQm94IChmckJveCAmYm94SW4pIGNvbnN0IHsKLSAgZ2V0UmVmQmxvY2soKS0+Z2V0QkJveChib3hJbik7Ci0gIGZyVHJhbnNmb3JtIHhmb3JtOwotICBnZXRUcmFuc2Zvcm0oeGZvcm0pOwotICBmclBvaW50IG9yaWdpbihib3hJbi5sZWZ0KCksIGJveEluLmJvdHRvbSgpKTsKLSAgb3JpZ2luLnRyYW5zZm9ybShmclRyYW5zZm9ybSgwLCAwLCB4Zm9ybS5vcmllbnQoKSkpOwotICB4Zm9ybS5zZXQoeGZvcm0ueE9mZnNldCgpICsgb3JpZ2luLngoKSwgeGZvcm0ueU9mZnNldCgpICsgb3JpZ2luLnkoKSk7Ci0gIGZyUG9pbnQgcyhib3hJbi5yaWdodCgpLCBib3hJbi50b3AoKSk7Ci0gIHhmb3JtLnVwZGF0ZVhmb3JtKHMpOwotICBib3hJbi50cmFuc2Zvcm0oeGZvcm0pOwotfQotCi12b2lkIGZySW5zdDo6Z2V0VXBkYXRlZFhmb3JtKGZyVHJhbnNmb3JtICZpbiwgYm9vbCBub09yaWVudCkgY29uc3QgewotICBnZXRUcmFuc2Zvcm0oaW4pOwotICBmckJveCBtYm94OwotICBnZXRSZWZCbG9jaygpLT5nZXRCb3VuZGFyeUJCb3gobWJveCk7Ci0gIGZyUG9pbnQgb3JpZ2luKG1ib3gubGVmdCgpLCBtYm94LmJvdHRvbSgpKTsKLSAgb3JpZ2luLnRyYW5zZm9ybShmclRyYW5zZm9ybSgwLCAwLCBpbi5vcmllbnQoKSkpOwotICBpbi5zZXQoaW4ueE9mZnNldCgpICsgb3JpZ2luLngoKSwgaW4ueU9mZnNldCgpICsgb3JpZ2luLnkoKSk7Ci0gIGlmICghbm9PcmllbnQpIHsKLSAgICBmclBvaW50IHMobWJveC5yaWdodCgpLCBtYm94LnRvcCgpKTsKLSAgICBpbi51cGRhdGVYZm9ybShzKTsKLSAgfSBlbHNlIHsKLSAgICBpbi5zZXQoZnJPcmllbnQoZnJjUjApKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvb2JqL2ZySW5zdC5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvb2JqL2ZySW5zdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTIxNWZmLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL29iai9mckluc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIF9GUl9JTlNUX0hfCi0jZGVmaW5lIF9GUl9JTlNUX0hfCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSAiZnJCYXNlVHlwZXMuaCIKLSNpbmNsdWRlICJkYi9vYmovZnJSZWYuaCIKLSNpbmNsdWRlICJkYi9vYmovZnJCbG9ja2FnZS5oIgotI2luY2x1ZGUgImRiL29iai9mckluc3RUZXJtLmgiCi0jaW5jbHVkZSAiZGIvb2JqL2ZySW5zdEJsb2NrYWdlLmgiCi0KLW5hbWVzcGFjZSBmciB7Ci0gIGNsYXNzIGZyQmxvY2s7Ci0gIGNsYXNzIGZySW5zdDogcHVibGljIGZyUmVmIHsKLSAgcHVibGljOgotICAgIC8vIGNvbnN0cnVjdG9ycwotICAgIGZySW5zdCgpOiBmclJlZigpIHt9Ci0gICAgLy9mckluc3QoY29uc3QgZnJJbnN0ICZpbnN0SW4pOiBmclJlZigpLCBuYW1lKGluc3RJbi5uYW1lKSwgY2VsbE5hbWUoaW5zdEluLmNlbGxOYW1lKSwKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RUZXJtcygpLCB4Zm9ybShpbnN0SW4ueGZvcm0pIHsKLSAgICAvLyAgaW5zdFRlcm1zLmNsZWFyKCk7Ci0gICAgLy8gIGluc3RUZXJtcy5zaHJpbmtfdG9fZml0KCk7Ci0gICAgLy8gIGZvciAoYXV0byAmbTogaW5zdEluLmluc3RUZXJtcykgewotICAgIC8vICAgIGNvcHlJbnN0VGVybShtKTsKLSAgICAvLyAgfQotICAgIC8vfQotICAgIC8vIGdldHRlcnMKLSAgICBjb25zdCBmclN0cmluZyYgZ2V0TmFtZSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLSAgICBmckJsb2NrKiBnZXRSZWZCbG9jaygpIGNvbnN0IHsKLSAgICAgIHJldHVybiByZWZCbG9jazsKLSAgICB9Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGZySW5zdFRlcm0+ID4mIGdldEluc3RUZXJtcygpIGNvbnN0IHsKLSAgICAgIHJldHVybiBpbnN0VGVybXM7Ci0gICAgfQotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxmckluc3RUZXJtPiA+JiBnZXRJbnN0VGVybXMoKSB7Ci0gICAgICByZXR1cm4gaW5zdFRlcm1zOwotICAgIH0KLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZnJJbnN0QmxvY2thZ2U+ID4mIGdldEluc3RCbG9ja2FnZXMoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gaW5zdEJsb2NrYWdlczsKLSAgICB9Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGZySW5zdEJsb2NrYWdlPiA+JiBnZXRJbnN0QmxvY2thZ2VzKCkgewotICAgICAgcmV0dXJuIGluc3RCbG9ja2FnZXM7Ci0gICAgfQotICAgIC8vIHNldHRlcnMKLSAgICB2b2lkIHNldE5hbWUoY29uc3QgZnJTdHJpbmcgJnRtcFN0cmluZykgewotICAgICAgbmFtZSA9IHRtcFN0cmluZzsKLSAgICB9Ci0gICAgdm9pZCBzZXRSZWZCbG9jayhmckJsb2NrKiBpbikgewotICAgICAgcmVmQmxvY2sgPSBpbjsKLSAgICB9Ci0gICAgdm9pZCBhZGRJbnN0VGVybShzdGQ6OnVuaXF1ZV9wdHI8ZnJJbnN0VGVybT4gJmluKSB7Ci0gICAgICBpbnN0VGVybXMucHVzaF9iYWNrKHN0ZDo6bW92ZShpbikpOwotICAgIH0KLSAgICB2b2lkIGFkZEluc3RCbG9ja2FnZShzdGQ6OnVuaXF1ZV9wdHI8ZnJJbnN0QmxvY2thZ2U+ICZpbikgewotICAgICAgaW5zdEJsb2NrYWdlcy5wdXNoX2JhY2soc3RkOjptb3ZlKGluKSk7Ci0gICAgfQotICAgIC8vIG90aGVycwotICAgIGZyQmxvY2tPYmplY3RFbnVtIHR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiBmcmNJbnN0OwotICAgIH0KLQotCi0gICAgLyogZnJvbSBmclJlZgotICAgICAqIGdldE9yaWVudAotICAgICAqIHNldE9yaWVudAotICAgICAqIGdldE9yaWdpbgotICAgICAqIHNldE9yaWdpbgotICAgICAqIGdldFRyYW5zZm9ybQotICAgICAqIHNldFRyYW5zZm9ybQotICAgICAqLwotCi0gICAgZnJPcmllbnQgZ2V0T3JpZW50KCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIHhmb3JtLm9yaWVudCgpOwotICAgIH0KLSAgICB2b2lkIHNldE9yaWVudChjb25zdCBmck9yaWVudCAmdG1wT3JpZW50KSBvdmVycmlkZSB7Ci0gICAgICB4Zm9ybS5zZXQodG1wT3JpZW50KTsKLSAgICB9Ci0gICAgdm9pZCBnZXRPcmlnaW4oZnJQb2ludCAmdG1wT3JpZ2luKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICB0bXBPcmlnaW4uc2V0KHhmb3JtLnhPZmZzZXQoKSwgeGZvcm0ueU9mZnNldCgpKTsKLSAgICB9Ci0gICAgdm9pZCBzZXRPcmlnaW4oY29uc3QgZnJQb2ludCAmdG1wUG9pbnQpIG92ZXJyaWRlIHsKLSAgICAgIHhmb3JtLnNldCh0bXBQb2ludCk7Ci0gICAgfQotICAgIHZvaWQgZ2V0VHJhbnNmb3JtKGZyVHJhbnNmb3JtICZ4Zm9ybUluKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICB4Zm9ybUluLnNldCh4Zm9ybS54T2Zmc2V0KCksIHhmb3JtLnlPZmZzZXQoKSwgeGZvcm0ub3JpZW50KCkpOwotICAgIH0KLSAgICB2b2lkIHNldFRyYW5zZm9ybShjb25zdCBmclRyYW5zZm9ybSAmeGZvcm1Jbikgb3ZlcnJpZGUgewotICAgICAgeGZvcm0uc2V0KHhmb3JtSW4ueE9mZnNldCgpLCB4Zm9ybUluLnlPZmZzZXQoKSwgeGZvcm1Jbi5vcmllbnQoKSk7Ci0gICAgfQotCi0gICAgLyogZnJvbSBmclBpbkZpZwotICAgICAqIGhhc1BpbgotICAgICAqIGdldFBpbgotICAgICAqIGFkZFRvUGluCi0gICAgICogcmVtb3ZlRnJvbVBpbgotICAgICAqLwotCi0gICAgYm9vbCBoYXNQaW4oKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGZyUGluKiBnZXRQaW4oKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAgdm9pZCBhZGRUb1BpbihmclBpbiogaW4pIG92ZXJyaWRlIHsKLSAgICAgIDsKLSAgICB9Ci0gICAgdm9pZCByZW1vdmVGcm9tUGluKCkgb3ZlcnJpZGUgewotICAgICAgOwotICAgIH0KLQotICAgIC8qIGZyb20gZnJDb25uRmlnCi0gICAgICogaGFzTmV0Ci0gICAgICogZ2V0TmV0Ci0gICAgICogYWRkVG9OZXQKLSAgICAgKiByZW1vdmVGcm9tTmV0Ci0gICAgICovCi0KLSAgICBib29sIGhhc05ldCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZnJOZXQqIGdldE5ldCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgICB2b2lkIGFkZFRvTmV0KGZyTmV0KiBpbikgb3ZlcnJpZGUgewotICAgICAgOwotICAgIH0KLSAgICB2b2lkIHJlbW92ZUZyb21OZXQoKSBvdmVycmlkZSB7Ci0gICAgICA7Ci0gICAgfQotCi0gICAgLyogZnJvbSBmckZpZwotICAgICAqIGdldEJCb3gKLSAgICAgKiBtb3ZlCi0gICAgICogb3ZlcmxhcHMKLSAgICAgKi8KLQotICAgIC8vIEJYIDE4MTIwNCBpbXBsZW1lbnRlZAotICAgIHZvaWQgZ2V0QkJveCAoZnJCb3ggJmJveEluKSBjb25zdCBvdmVycmlkZTsKLSAgICAKLSAgICB2b2lkIG1vdmUoY29uc3QgZnJUcmFuc2Zvcm0gJnhmb3JtKSBvdmVycmlkZSB7Ci0gICAgICA7Ci0gICAgfQotICAgIGJvb2wgb3ZlcmxhcHMoY29uc3QgZnJCb3ggJmJveCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICB2b2lkIGdldFVwZGF0ZWRYZm9ybShmclRyYW5zZm9ybSAmaW4sIGJvb2wgbm9PcmllbnQgPSBmYWxzZSkgY29uc3Q7Ci0gIHByb3RlY3RlZDoKLSAgICBmclN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU7Ci0gICAgZnJCbG9jayogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZCbG9jazsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZnJJbnN0VGVybT4gPiAgICAgIGluc3RUZXJtczsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZnJJbnN0QmxvY2thZ2U+ID4gIGluc3RCbG9ja2FnZXM7Ci0gICAgZnJUcmFuc2Zvcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Zm9ybTsKLSAgfTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9vYmovZnJJbnN0QmxvY2thZ2UuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL29iai9mckluc3RCbG9ja2FnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmIzNjQyLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL29iai9mckluc3RCbG9ja2FnZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyogQXV0aG9yczogTHV0b25nIFdhbmcgYW5kIEJhbmdxaSBYdSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBfRlJfSU5TVEJMT0NLQUdFX0hfCi0jZGVmaW5lIF9GUl9JTlNUQkxPQ0tBR0VfSF8KLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlICJmckJhc2VUeXBlcy5oIgotI2luY2x1ZGUgImRiL29iai9mckJsb2NrT2JqZWN0LmgiCi0jaW5jbHVkZSAiZGIvb2JqL2ZyQmxvY2thZ2UuaCIKLQotbmFtZXNwYWNlIGZyIHsKLSAgY2xhc3MgZnJJbnN0OwotICBjbGFzcyBmckluc3RCbG9ja2FnZTogcHVibGljIGZyQmxvY2tPYmplY3QgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3JzCi0gICAgZnJJbnN0QmxvY2thZ2UoKTogZnJCbG9ja09iamVjdCgpLCBpbnN0KG51bGxwdHIpLCBibG9ja2FnZShudWxscHRyKSB7fQotICAgIC8vZnJJbnN0VGVybShjb25zdCBmckluc3RUZXJtICZpbik6IGZyQmxvY2tPYmplY3QoKSwgaW5zdChpbi5pbnN0KSwgdGVybShpbi50ZXJtKSwgCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0KGluLm5ldCkge30KLSAgICAvLyBnZXR0ZXJzCi0gICAgZnJJbnN0KiBnZXRJbnN0KCkgY29uc3QgewotICAgICAgcmV0dXJuIGluc3Q7Ci0gICAgfQotICAgIGZyQmxvY2thZ2UqIGdldEJsb2NrYWdlKCkgY29uc3QgewotICAgICAgcmV0dXJuIGJsb2NrYWdlOwotICAgIH0KLSAgICAvLyBzZXR0ZXJzCi0gICAgdm9pZCBhZGRUb0luc3QoZnJJbnN0KiBpbikgewotICAgICAgaW5zdCA9IGluOwotICAgIH0KLSAgICAvLyBkbyBub3QgY2FsbCBmcm9tIG91dHNpZGUKLSAgICB2b2lkIGFkZEJsb2NrYWdlKGZyQmxvY2thZ2UqIGluKSB7Ci0gICAgICBibG9ja2FnZSA9IGluOwotICAgIH0KLSAgICAvLyBvdGhlcnMKLSAgICBmckJsb2NrT2JqZWN0RW51bSB0eXBlSWQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gZnJjSW5zdEJsb2NrYWdlOwotICAgIH0KLSAgcHJvdGVjdGVkOgotICAgIGZySW5zdCogICAgIGluc3Q7Ci0gICAgZnJCbG9ja2FnZSogYmxvY2thZ2U7Ci0gIH07Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvb2JqL2ZySW5zdFRlcm0uaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL29iai9mckluc3RUZXJtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NTY4NTAuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvb2JqL2ZySW5zdFRlcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX0ZSX0lOU1RURVJNX0hfCi0jZGVmaW5lIF9GUl9JTlNUVEVSTV9IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgImZyQmFzZVR5cGVzLmgiCi0jaW5jbHVkZSAiZGIvb2JqL2ZyQmxvY2tPYmplY3QuaCIKLSNpbmNsdWRlICJkYi9vYmovZnJUZXJtLmgiCi0KLW5hbWVzcGFjZSBmciB7Ci0gIGNsYXNzIGZyTmV0OwotICBjbGFzcyBmckluc3Q7Ci0KLSAgY2xhc3MgZnJJbnN0VGVybTogcHVibGljIGZyQmxvY2tPYmplY3QgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3JzCi0gICAgZnJJbnN0VGVybSgpOiBmckJsb2NrT2JqZWN0KCksIGluc3QobnVsbHB0ciksIHRlcm0obnVsbHB0ciksIG5ldChudWxscHRyKSB7fQotICAgIGZySW5zdFRlcm0oY29uc3QgZnJJbnN0VGVybSAmaW4pOiBmckJsb2NrT2JqZWN0KCksIGluc3QoaW4uaW5zdCksIHRlcm0oaW4udGVybSksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXQoaW4ubmV0KSB7fQotICAgIC8vIGdldHRlcnMKLSAgICBib29sIGhhc05ldCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiAobmV0KTsKLSAgICB9Ci0gICAgZnJOZXQqIGdldE5ldCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBuZXQ7Ci0gICAgfQotICAgIGZySW5zdCogZ2V0SW5zdCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBpbnN0OwotICAgIH0KLSAgICBmclRlcm0qIGdldFRlcm0oKSBjb25zdCB7Ci0gICAgICByZXR1cm4gdGVybTsKLSAgICB9Ci0gICAgdm9pZCBhZGRUb05ldChmck5ldCogaW4pIHsKLSAgICAgIG5ldCA9IGluOwotICAgIH0KLSAgICAvLyBzZXR0ZXJzCi0gICAgdm9pZCBhZGRUb0luc3QoZnJJbnN0KiBpbikgewotICAgICAgaW5zdCA9IGluOwotICAgIH0KLSAgICAvLyBkbyBub3QgY2FsbCBmcm9tIG91dHNpZGUKLSAgICB2b2lkIGFkZFRlcm0oZnJUZXJtKiBpbikgewotICAgICAgdGVybSA9IGluOwotICAgIH0KLSAgICAvLyBvdGhlcnMKLSAgICBmckJsb2NrT2JqZWN0RW51bSB0eXBlSWQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gZnJjSW5zdFRlcm07Ci0gICAgfQotICBwcm90ZWN0ZWQ6Ci0gICAgZnJJbnN0KiBpbnN0OwotICAgIGZyVGVybSogdGVybTsKLSAgICBmck5ldCogIG5ldDsKLSAgfTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9vYmovZnJNYXJrZXIuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL29iai9mck1hcmtlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGViZmI0Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL29iai9mck1hcmtlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX0ZSX01BUktFUl9IXwotI2RlZmluZSBfRlJfTUFSS0VSX0hfCi0KLSNpbmNsdWRlICJkYi9vYmovZnJGaWcuaCIKLS8vI2luY2x1ZGUgImRiL3RlY2gvZnJDb25zdHJhaW50LmgiCi0KLW5hbWVzcGFjZSBmciB7Ci0gIGNsYXNzIGZyQ29uc3RyYWludDsKLSAgY2xhc3MgZnJNYXJrZXI6IHB1YmxpYyBmckZpZyB7Ci0gIHB1YmxpYzoKLSAgICAvLyBjb25zdHJ1Y3RvcnMKLSAgICBmck1hcmtlcigpOiBmckZpZygpLCBjb25zdHJhaW50KG51bGxwdHIpLCBiYm94KCksIGxheWVyTnVtKDApLCBzcmNzKCksIGl0ZXIoKSB7fQotICAgIGZyTWFya2VyKGNvbnN0IGZyTWFya2VyICZpbik6IGNvbnN0cmFpbnQoaW4uY29uc3RyYWludCksIGJib3goaW4uYmJveCksIGxheWVyTnVtKGluLmxheWVyTnVtKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNzKGluLnNyY3MpLCBpdGVyKCkge30KLSAgICAvLyBzZXR0ZXJzCi0gICAgdm9pZCBzZXRDb25zdHJhaW50KGZyQ29uc3RyYWludCogY29uc3RyYWludEluKSB7Ci0gICAgICBjb25zdHJhaW50ID0gY29uc3RyYWludEluOwotICAgIH0KLQotICAgIHZvaWQgc2V0QkJveChjb25zdCBmckJveCAmYmJveEluKSB7Ci0gICAgICBiYm94ID0gYmJveEluOwotICAgIH0KLQotICAgIHZvaWQgc2V0TGF5ZXJOdW0oY29uc3QgZnJMYXllck51bSAmbGF5ZXJOdW1JbikgewotICAgICAgbGF5ZXJOdW0gPSBsYXllck51bUluOwotICAgIH0KLQotICAgIC8vIHZvaWQgYWRkTmV0KGZyTmV0KiBuZXRJbikgewotICAgIC8vICAgc3Jjcy5wdXNoX2JhY2sobmV0SW4pOwotICAgIC8vIH0KLSAgICAvLyB2b2lkIGFkZEluc3RUZXJtKGZySW5zdFRlcm0qIGluc3RUZXJtSW4pIHsKLSAgICAvLyAgIHNyY3MucHVzaF9iYWNrKGluc3RUZXJtSW4pOwotICAgIC8vIH0KLSAgICAvLyB2b2lkIGFkZFRlcm0oZnJUZXJtKiB0ZXJtSW4pIHsKLSAgICAvLyAgIHNyY3MucHVzaF9iYWNrKHRlcm1Jbik7Ci0gICAgLy8gfQotICAgIHZvaWQgYWRkU3JjKGZyQmxvY2tPYmplY3QgKnNyY0luKSB7Ci0gICAgICBzcmNzLnB1c2hfYmFjayhzcmNJbik7Ci0gICAgfQotICAgIC8vIGdldHRlcnMKLQotICAgIC8qIGZyb20gZnJGaWcKLSAgICAgKiBnZXRCQm94Ci0gICAgICogbW92ZSwgaW4gLmNwcAotICAgICAqIG92ZXJsYXBzIGluIC5jcHAKLSAgICAgKi8KLQotICAgIHZvaWQgZ2V0QkJveChmckJveCAmYmJveEluKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICBiYm94SW4uc2V0KGJib3gpOwotICAgIH0KLQotICAgIGZyTGF5ZXJOdW0gZ2V0TGF5ZXJOdW0oKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbGF5ZXJOdW07Ci0gICAgfQotCi0gICAgLy8gZnJWZWN0b3I8ZnJOZXQqPiBnZXROZXRzKCkgY29uc3QgewotICAgIC8vICAgcmV0dXJuIG5ldHM7Ci0gICAgLy8gfQotCi0gICAgZnJWZWN0b3I8ZnJCbG9ja09iamVjdCo+IGdldFNyY3MoKSB7Ci0gICAgICByZXR1cm4gc3JjczsKLSAgICB9Ci0KLSAgICBmckNvbnN0cmFpbnQqIGdldENvbnN0cmFpbnQoKSB7Ci0gICAgICByZXR1cm4gY29uc3RyYWludDsKLSAgICB9Ci0KLQotICAgIHZvaWQgbW92ZShjb25zdCBmclRyYW5zZm9ybSAmeGZvcm0pIG92ZXJyaWRlIHsKLSAgICAgIAotICAgIH0KLQotICAgIGJvb2wgb3ZlcmxhcHMoY29uc3QgZnJCb3ggJmJveCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIG90aGVycwotICAgIGZyQmxvY2tPYmplY3RFbnVtIHR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiBmcmNNYXJrZXI7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRJdGVyKGZyTGlzdEl0ZXI8c3RkOjp1bmlxdWVfcHRyPGZyTWFya2VyPiA+JiBpbikgewotICAgICAgaXRlciA9IGluOwotICAgIH0KLSAgICBmckxpc3RJdGVyPHN0ZDo6dW5pcXVlX3B0cjxmck1hcmtlcj4gPiBnZXRJdGVyKCkgY29uc3QgewotICAgICAgcmV0dXJuIGl0ZXI7Ci0gICAgfQotCi0gIHByb3RlY3RlZDoKLSAgICBmckNvbnN0cmFpbnQqIGNvbnN0cmFpbnQ7Ci0gICAgZnJCb3ggYmJveDsKLSAgICBmckxheWVyTnVtIGxheWVyTnVtOwotICAgIGZyVmVjdG9yPGZyQmxvY2tPYmplY3QqPiBzcmNzOyAvLyBlaXRoZXIgZnJOZXQgb3IgaW5zdFRlcm0gb3IgdGVybQotICAgIGZyTGlzdEl0ZXI8c3RkOjp1bmlxdWVfcHRyPGZyTWFya2VyPiA+IGl0ZXI7Ci0gIH07Ci19Ci0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9vYmovZnJOZXQuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL29iai9mck5ldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODViOWRiLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL29iai9mck5ldC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX0ZSX05FVF9IXwotI2RlZmluZSBfRlJfTkVUX0hfCi0KLS8vI2luY2x1ZGUgPGJvb3N0L2dyYXBoL2FkamFjZW5jeV9saXN0LmhwcD4KLSNpbmNsdWRlICJmckJhc2VUeXBlcy5oIgotI2luY2x1ZGUgImRiL29iai9mckJsb2NrT2JqZWN0LmgiCi0jaW5jbHVkZSAiZGIvb2JqL2ZyR3VpZGUuaCIKLSNpbmNsdWRlICJkYi9vYmovZnJTaGFwZS5oIgotI2luY2x1ZGUgImRiL29iai9mclZpYS5oIgotCi1uYW1lc3BhY2UgZnIgewotICBjbGFzcyBmckluc3RUZXJtOwotICBjbGFzcyBmclRlcm07Ci0KLSAgY2xhc3MgZnJOZXQ6IHB1YmxpYyBmckJsb2NrT2JqZWN0IHsKLSAgcHVibGljOgotICAgIC8vIGNvbnN0cnVjdG9ycwotICAgIC8vZnJOZXQoKTogZnJCbG9ja09iamVjdCgpIHt9Ci0gICAgZnJOZXQoY29uc3QgZnJTdHJpbmcgJmluKTogZnJCbG9ja09iamVjdCgpLCBuYW1lKGluKSwgaW5zdFRlcm1zKCksIHRlcm1zKCksIHNoYXBlcygpLCB2aWFzKCksIHB3aXJlcygpLCBndWlkZXMoKSwgdHlwZShmck5ldEVudW06OmZyY05vcm1hbE5ldCkge30KLSAgICAvLyBnZXR0ZXJzCi0gICAgY29uc3QgZnJTdHJpbmcmIGdldE5hbWUoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8ZnJJbnN0VGVybSo+JiBnZXRJbnN0VGVybXMoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gaW5zdFRlcm1zOwotICAgIH0KLSAgICBzdGQ6OnZlY3Rvcjxmckluc3RUZXJtKj4mIGdldEluc3RUZXJtcygpIHsKLSAgICAgIHJldHVybiBpbnN0VGVybXM7Ci0gICAgfQotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGZyVGVybSo+JiBnZXRUZXJtcygpIGNvbnN0IHsKLSAgICAgIHJldHVybiB0ZXJtczsKLSAgICB9Ci0gICAgc3RkOjp2ZWN0b3I8ZnJUZXJtKj4mIGdldFRlcm1zKCkgewotICAgICAgcmV0dXJuIHRlcm1zOwotICAgIH0KLSAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPGZyU2hhcGU+ID4mIGdldFNoYXBlcygpIHsKLSAgICAgIHJldHVybiBzaGFwZXM7Ci0gICAgfQotICAgIGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8ZnJTaGFwZT4gPiYgZ2V0U2hhcGVzKCkgY29uc3QgewotICAgICAgcmV0dXJuIHNoYXBlczsKLSAgICB9Ci0gICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxmclZpYT4gPiYgZ2V0VmlhcygpIHsKLSAgICAgIHJldHVybiB2aWFzOwotICAgIH0KLSAgICBjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPGZyVmlhPiA+JiBnZXRWaWFzKCkgY29uc3QgewotICAgICAgcmV0dXJuIHZpYXM7Ci0gICAgfQotICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8ZnJTaGFwZT4gPiYgZ2V0UGF0Y2hXaXJlcygpIHsKLSAgICAgIHJldHVybiBwd2lyZXM7Ci0gICAgfQotICAgIGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8ZnJTaGFwZT4gPiYgZ2V0UGF0Y2hXaXJlcygpIGNvbnN0IHsKLSAgICAgIHJldHVybiBwd2lyZXM7Ci0gICAgfQotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxmckd1aWRlPiA+JiBnZXRHdWlkZXMoKSB7Ci0gICAgICByZXR1cm4gZ3VpZGVzOwotICAgIH0KLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZnJHdWlkZT4gPiYgZ2V0R3VpZGVzKCkgY29uc3QgewotICAgICAgcmV0dXJuIGd1aWRlczsKLSAgICB9Ci0gICAgLy8gc2V0dGVycwotICAgIHZvaWQgYWRkSW5zdFRlcm0oZnJJbnN0VGVybSogaW4pIHsKLSAgICAgIGluc3RUZXJtcy5wdXNoX2JhY2soaW4pOwotICAgIH0KLSAgICB2b2lkIGFkZFRlcm0oZnJUZXJtKiBpbikgewotICAgICAgdGVybXMucHVzaF9iYWNrKGluKTsKLSAgICB9Ci0gICAgdm9pZCBzZXROYW1lKGNvbnN0IGZyU3RyaW5nICZzdHJpbmdJbikgewotICAgICAgbmFtZSA9IHN0cmluZ0luOwotICAgIH0KLSAgICB2b2lkIGFkZFNoYXBlKHN0ZDo6dW5pcXVlX3B0cjxmclNoYXBlPiAmaW4pIHsKLSAgICAgIGluLT5hZGRUb05ldCh0aGlzKTsKLSAgICAgIGF1dG8gcnB0ciA9IGluLmdldCgpOwotICAgICAgc2hhcGVzLnB1c2hfYmFjayhzdGQ6Om1vdmUoaW4pKTsKLSAgICAgIHJwdHItPnNldEl0ZXIoLS1zaGFwZXMuZW5kKCkpOwotICAgIH0KLSAgICB2b2lkIGFkZFZpYShzdGQ6OnVuaXF1ZV9wdHI8ZnJWaWE+ICZpbikgewotICAgICAgaW4tPmFkZFRvTmV0KHRoaXMpOwotICAgICAgYXV0byBycHRyID0gaW4uZ2V0KCk7Ci0gICAgICB2aWFzLnB1c2hfYmFjayhzdGQ6Om1vdmUoaW4pKTsKLSAgICAgIHJwdHItPnNldEl0ZXIoLS12aWFzLmVuZCgpKTsKLSAgICB9Ci0gICAgdm9pZCBhZGRQYXRjaFdpcmUoc3RkOjp1bmlxdWVfcHRyPGZyU2hhcGU+ICZpbikgewotICAgICAgaW4tPmFkZFRvTmV0KHRoaXMpOwotICAgICAgYXV0byBycHRyID0gaW4uZ2V0KCk7Ci0gICAgICBwd2lyZXMucHVzaF9iYWNrKHN0ZDo6bW92ZShpbikpOwotICAgICAgcnB0ci0+c2V0SXRlcigtLXB3aXJlcy5lbmQoKSk7Ci0gICAgfQotICAgIHZvaWQgYWRkR3VpZGUoc3RkOjp1bmlxdWVfcHRyPGZyR3VpZGU+ICZpbikgewotICAgICAgYXV0byBycHRyID0gaW4uZ2V0KCk7Ci0gICAgICBycHRyLT5hZGRUb05ldCh0aGlzKTsKLSAgICAgIGd1aWRlcy5wdXNoX2JhY2soc3RkOjptb3ZlKGluKSk7Ci0gICAgICAvL3JwdHItPnNldEl0ZXIoLS12aWFzLmVuZCgpKTsKLSAgICB9Ci0gICAgdm9pZCBjbGVhckd1aWRlcygpIHsKLSAgICAgIGd1aWRlcy5jbGVhcigpOwotICAgIH0KLSAgICB2b2lkIHJlbW92ZVNoYXBlKGZyU2hhcGUqIGluKSB7Ci0gICAgICBzaGFwZXMuZXJhc2UoaW4tPmdldEl0ZXIoKSk7Ci0gICAgfQotICAgIHZvaWQgcmVtb3ZlVmlhKGZyVmlhKiBpbikgewotICAgICAgdmlhcy5lcmFzZShpbi0+Z2V0SXRlcigpKTsKLSAgICB9Ci0gICAgdm9pZCByZW1vdmVQYXRjaFdpcmUoZnJTaGFwZSogaW4pIHsKLSAgICAgIHB3aXJlcy5lcmFzZShpbi0+Z2V0SXRlcigpKTsKLSAgICB9Ci0gICAgLy8gb3RoZXJzCi0gICAgZnJOZXRFbnVtIGdldFR5cGUoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0gICAgdm9pZCBzZXRUeXBlKGZyTmV0RW51bSBpbikgewotICAgICAgdHlwZSA9IGluOwotICAgIH0KLSAgICB2aXJ0dWFsIGZyQmxvY2tPYmplY3RFbnVtIHR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiBmcmNOZXQ7Ci0gICAgfQotICBwcm90ZWN0ZWQ6Ci0gICAgZnJTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTsKLSAgICBzdGQ6OnZlY3Rvcjxmckluc3RUZXJtKj4gICAgICAgICAgICAgICAgICBpbnN0VGVybXM7Ci0gICAgc3RkOjp2ZWN0b3I8ZnJUZXJtKj4gICAgICAgICAgICAgICAgICAgICAgdGVybXM7ICAgICAvLyB0ZXJtcyBpcyBJTwotICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8ZnJTaGFwZT4gPiAgICAgIHNoYXBlczsKLSAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPGZyVmlhPiA+ICAgICAgICB2aWFzOwotICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8ZnJTaGFwZT4gPiAgICAgIHB3aXJlczsKLSAgICAvL3N0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8ZnJHdWlkZT4gPiAgICBndWlkZXM7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGZyR3VpZGU+ID4gICAgZ3VpZGVzOwotICAgIGZyTmV0RW51bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU7Ci0gIH07Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvb2JqL2ZyUGluLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL29iai9mclBpbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MWZlYjkuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvb2JqL2ZyUGluLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJkYi9vYmovZnJQaW4uaCIKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL29iai9mclBpbi5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvb2JqL2ZyUGluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMGRjNGYuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvb2JqL2ZyUGluLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyogQXV0aG9yczogTHV0b25nIFdhbmcgYW5kIEJhbmdxaSBYdSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBfRlJfUElOX0hfCi0jZGVmaW5lIF9GUl9QSU5fSF8KLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImZyQmFzZVR5cGVzLmgiCi0jaW5jbHVkZSAiZGIvb2JqL2ZyQmxvY2tPYmplY3QuaCIKLSNpbmNsdWRlICJkYi9vYmovZnJTaGFwZS5oIgotI2luY2x1ZGUgIkZsZXhBY2Nlc3NQYXR0ZXJuLmgiCi0KLQotbmFtZXNwYWNlIGZyIHsKLSAgY2xhc3MgZnJUZXJtOwotCi0gIGNsYXNzIGZyUGluOiBwdWJsaWMgZnJCbG9ja09iamVjdCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBjb25zdHJ1Y3RvcnMKLSAgICBmclBpbigpOiBmckJsb2NrT2JqZWN0KCksIHRlcm0obnVsbHB0ciksIHBpbkZpZ3MoKS8qLCBhY2Nlc3NQYXR0ZXJucygpKi8ge30KLSAgICBmclBpbihjb25zdCBmclBpbiAmaW4pOiBmckJsb2NrT2JqZWN0KCksIHRlcm0oaW4udGVybSkvKiwgYWNjZXNzUGF0dGVybnMoaW4uYWNjZXNzUGF0dGVybnMpKi8gewotICAgICAgZm9yIChhdXRvICZ1UGluRmlnOiBpbi5nZXRGaWdzKCkpIHsKLSAgICAgICAgYXV0byBwaW5GaWcgPSB1UGluRmlnLmdldCgpOwotICAgICAgICBpZiAocGluRmlnLT50eXBlSWQoKSA9PSBmcmNSZWN0KSB7Ci0gICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGZyUGluRmlnPiB0bXAgPSBzdGQ6Om1ha2VfdW5pcXVlPGZyUmVjdD4oKnN0YXRpY19jYXN0PGZyUmVjdCo+KHBpbkZpZykpOwotICAgICAgICAgIGFkZFBpbkZpZyh0bXApOwotICAgICAgICB9IGVsc2UgaWYgKHBpbkZpZy0+dHlwZUlkKCkgPT0gZnJjUG9seWdvbikgewotICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxmclBpbkZpZz4gdG1wID0gc3RkOjptYWtlX3VuaXF1ZTxmclBvbHlnb24+KCpzdGF0aWNfY2FzdDxmclBvbHlnb24qPihwaW5GaWcpKTsKLSAgICAgICAgICBhZGRQaW5GaWcodG1wKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzdGQ6OmNvdXQgPDwiVW5zdXBwb3J0ZWQgcGluRmlnIGluIGNvcHkgY29uc3RydWN0b3IiIDw8c3RkOjplbmRsOwotICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZnJQaW4oY29uc3QgZnJQaW4gJmluLCBjb25zdCBmclRyYW5zZm9ybSAmeGZvcm0pOiBmckJsb2NrT2JqZWN0KCksIHRlcm0oaW4udGVybSkvKiwgYWNjZXNzUGF0dGVybnMoaW4uYWNjZXNzUGF0dGVybnMpKi8gewotICAgICAgZm9yIChhdXRvICZ1UGluRmlnOiBpbi5nZXRGaWdzKCkpIHsKLSAgICAgICAgYXV0byBwaW5GaWcgPSB1UGluRmlnLmdldCgpOwotICAgICAgICBpZiAocGluRmlnLT50eXBlSWQoKSA9PSBmcmNSZWN0KSB7Ci0gICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGZyUGluRmlnPiB0bXAgPSBzdGQ6Om1ha2VfdW5pcXVlPGZyUmVjdD4oKnN0YXRpY19jYXN0PGZyUmVjdCo+KHBpbkZpZykpOwotICAgICAgICAgIHRtcC0+bW92ZSh4Zm9ybSk7Ci0gICAgICAgICAgYWRkUGluRmlnKHRtcCk7Ci0gICAgICAgIH0gZWxzZSBpZiAocGluRmlnLT50eXBlSWQoKSA9PSBmcmNQb2x5Z29uKSB7Ci0gICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGZyUGluRmlnPiB0bXAgPSBzdGQ6Om1ha2VfdW5pcXVlPGZyUG9seWdvbj4oKnN0YXRpY19jYXN0PGZyUG9seWdvbio+KHBpbkZpZykpOwotICAgICAgICAgIHRtcC0+bW92ZSh4Zm9ybSk7Ci0gICAgICAgICAgYWRkUGluRmlnKHRtcCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3RkOjpjb3V0IDw8IlVuc3VwcG9ydGVkIHBpbkZpZyBpbiBjb3B5IGNvbnN0cnVjdG9yIiA8PHN0ZDo6ZW5kbDsKLSAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gZ2V0dGVycwotICAgIGZyVGVybSogZ2V0VGVybSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiB0ZXJtOwotICAgIH0KLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjwgc3RkOjp1bmlxdWVfcHRyPGZyUGluRmlnPiA+JiBnZXRGaWdzKCkgY29uc3QgewotICAgICAgcmV0dXJuIHBpbkZpZ3M7Ci0gICAgfQotICAgIHN0ZDo6dmVjdG9yPCBzdGQ6OnVuaXF1ZV9wdHI8ZnJQaW5GaWc+ID4mIGdldEZpZ3MoKSB7Ci0gICAgICByZXR1cm4gcGluRmlnczsKLSAgICB9Ci0gICAgLy9mckxpc3Q8RmxleEFjY2Vzc1BhdHRlcm4+JiBnZXRBY2Nlc3NQYXR0ZXJucygpIHsKLSAgICAvLyAgcmV0dXJuIGFjY2Vzc1BhdHRlcm5zOwotICAgIC8vfQotICAgIGZyVmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxGbGV4QWNjZXNzUGF0dGVybj4gPiYgZ2V0QWNjZXNzUGF0dGVybnMoKSB7Ci0gICAgICByZXR1cm4gYWNjZXNzUGF0dGVybnM7Ci0gICAgfQotCi0gICAgZnJWZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEZsZXhBY2Nlc3NQYXR0ZXJuPiA+JiBnZXRBY2Nlc3NQYXR0ZXJucyhjb25zdCBmck9yaWVudCAmb3JpSW4pIHsKLSAgICAgIHJldHVybiBvcmllbnQyQVBzW29yaUluXTsKLSAgICB9Ci0KLSAgICAvLyBzZXR0ZXJzCi0gICAgLy8gY2Fubm90IGhhdmUgc2V0dGVybSwgbXVzdCBiZSBhdmFpbGFibGUgd2hlbiBjcmVhdGluZwotICAgIHZvaWQgc2V0VGVybShmclRlcm0gKmluKSB7Ci0gICAgICB0ZXJtID0gaW47Ci0gICAgfQotICAgIHZvaWQgYWRkUGluRmlnKHN0ZDo6dW5pcXVlX3B0cjxmclBpbkZpZz4gJmluKSB7Ci0gICAgICBpbi0+YWRkVG9QaW4odGhpcyk7Ci0gICAgICBwaW5GaWdzLnB1c2hfYmFjayhzdGQ6Om1vdmUoaW4pKTsKLSAgICB9Ci0gICAgdm9pZCBhZGRMYXllclNoYXBlKGNvbnN0IGZyTGF5ZXJOdW0gJmxheWVyTnVtLCBjb25zdCBSZWN0YW5nbGUgJnJlY3RJbikgewotICAgICAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0Ojpwb2x5Z29uOjpvcGVyYXRvcnM7Ci0gICAgICBsYXllcjJQb2x5U2V0W2xheWVyTnVtXSArPSByZWN0SW47Ci0gICAgfQotICAgIHZvaWQgYWRkTGF5ZXJTaGFwZShjb25zdCBmckxheWVyTnVtICZsYXllck51bSwgY29uc3QgUG9seWdvbiAmcG9seUluKSB7Ci0gICAgICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q6OnBvbHlnb246Om9wZXJhdG9yczsKLSAgICAgIGxheWVyMlBvbHlTZXRbbGF5ZXJOdW1dICs9IHBvbHlJbjsKLSAgICB9Ci0gICAgc3RkOjptYXA8IGZyTGF5ZXJOdW0sIFBvbHlnb25TZXQgPiYgZ2V0TGF5ZXIyUG9seVNldCgpIHsKLSAgICAgIHJldHVybiBsYXllcjJQb2x5U2V0OwotICAgIH0KLSAgICAvL2ZyTGlzdEl0ZXI8RmxleEFjY2Vzc1BhdHRlcm4+IGFkZEFjY2Vzc1BhdHRlcm4oY29uc3QgRmxleEFjY2Vzc1BhdHRlcm4gJmFwSW4pIHsKLSAgICAvLyAgYWNjZXNzUGF0dGVybnMucHVzaF9iYWNrKGFwSW4pOwotICAgIC8vICByZXR1cm4gKC0tYWNjZXNzUGF0dGVybnMuZW5kKCkpOwotICAgIC8vfQotICAgIHZvaWQgYWRkQWNjZXNzUGF0dGVybihjb25zdCBGbGV4QWNjZXNzUGF0dGVybiAmYXBJbikgewotICAgICAgYXV0byB1cHRyID0gc3RkOjptYWtlX3VuaXF1ZTxGbGV4QWNjZXNzUGF0dGVybj4oYXBJbik7Ci0gICAgICBhY2Nlc3NQYXR0ZXJucy5wdXNoX2JhY2soc3RkOjptb3ZlKHVwdHIpKTsKLSAgICB9Ci0gICAgdm9pZCBhZGRBY2Nlc3NQYXR0ZXJuKGNvbnN0IGZyT3JpZW50ICZvcmlJbiwgY29uc3QgRmxleEFjY2Vzc1BhdHRlcm4gJmFwSW4pIHsKLSAgICAgIGF1dG8gdXB0ciA9IHN0ZDo6bWFrZV91bmlxdWU8RmxleEFjY2Vzc1BhdHRlcm4+KGFwSW4pOwotICAgICAgb3JpZW50MkFQc1tvcmlJbl0ucHVzaF9iYWNrKHN0ZDo6bW92ZSh1cHRyKSk7Ci0gICAgfQotCi0KLSAgICAvLyBvdGhlcnMKLSAgICBmckJsb2NrT2JqZWN0RW51bSB0eXBlSWQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gZnJjUGluOwotICAgIH0KLSAgcHJvdGVjdGVkOgotICAgIGZyVGVybSogdGVybTsKLSAgICBzdGQ6OnZlY3Rvcjwgc3RkOjp1bmlxdWVfcHRyPGZyUGluRmlnPiA+IHBpbkZpZ3M7IC8vIG9wdGlvbmFsLCBzZXQgbGF0ZXIKLSAgICBzdGQ6Om1hcDwgZnJMYXllck51bSwgUG9seWdvblNldD4gbGF5ZXIyUG9seVNldDsKLSAgICBmclZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RmxleEFjY2Vzc1BhdHRlcm4+ID4gYWNjZXNzUGF0dGVybnM7Ci0gICAgc3RkOjptYXA8IGZyT3JpZW50LCBmclZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RmxleEFjY2Vzc1BhdHRlcm4+ID4gPiBvcmllbnQyQVBzOwotICB9OwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL29iai9mclJlZi5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvb2JqL2ZyUmVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiYzNmMzIuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvb2JqL2ZyUmVmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIF9GUl9SRUZfSF8KLSNkZWZpbmUgX0ZSX1JFRl9IXwotCi0jaW5jbHVkZSAiZGIvb2JqL2ZyRmlnLmgiCi0jaW5jbHVkZSAiZGIvaW5mcmEvZnJPcmllbnQuaCIKLQotbmFtZXNwYWNlIGZyIHsKLSAgY2xhc3MgZnJSZWY6IHB1YmxpYyBmclBpbkZpZyB7Ci0gIHB1YmxpYzoKLSAgICAvLyBjb25zdHJ1Y3RvcnMKLSAgICBmclJlZigpOiBmclBpbkZpZygpIHt9Ci0gICAgLy8gZ2V0dGVycwotICAgIHZpcnR1YWwgZnJPcmllbnQgZ2V0T3JpZW50KCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBnZXRPcmlnaW4oZnJQb2ludCAmdG1wT3JpZ2luKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIGdldFRyYW5zZm9ybShmclRyYW5zZm9ybSAmeGZvcm0pIGNvbnN0ID0gMDsKLSAgICAvLyBzZXR0ZXJzCi0gICAgdmlydHVhbCB2b2lkIHNldE9yaWVudChjb25zdCBmck9yaWVudCAmdG1wT3JpZW50KSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIHNldE9yaWdpbihjb25zdCBmclBvaW50ICZ0bXBQb2ludCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBzZXRUcmFuc2Zvcm0oY29uc3QgZnJUcmFuc2Zvcm0gJnhmb3JtKSA9IDA7Ci0gIHByb3RlY3RlZDoKLSAgfTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9vYmovZnJTaGFwZS5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9vYmovZnJTaGFwZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMjlmNmMuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvb2JqL2ZyU2hhcGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyogQXV0aG9yczogTHV0b25nIFdhbmcgYW5kIEJhbmdxaSBYdSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImRiL29iai9mclNoYXBlLmgiCi0jaW5jbHVkZSAiZGIvZHJPYmovZHJTaGFwZS5oIgotI2luY2x1ZGUgImRiL3RhT2JqL3RhU2hhcGUuaCIKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBmcjsKLQotZnJQYXRoU2VnOjpmclBhdGhTZWcoY29uc3QgZHJQYXRoU2VnICZpbikgewotICBpbi5nZXRQb2ludHMoYmVnaW4sIGVuZCk7Ci0gIGxheWVyID0gaW4uZ2V0TGF5ZXJOdW0oKTsKLSAgaW4uZ2V0U3R5bGUoc3R5bGUpOwotICBvd25lciA9IG51bGxwdHI7Ci19Ci0KLWZyUGF0aFNlZzo6ZnJQYXRoU2VnKGNvbnN0IHRhUGF0aFNlZyAmaW4pIHsKLSAgaW4uZ2V0UG9pbnRzKGJlZ2luLCBlbmQpOwotICBsYXllciA9IGluLmdldExheWVyTnVtKCk7Ci0gIGluLmdldFN0eWxlKHN0eWxlKTsKLSAgb3duZXIgPSBudWxscHRyOwotfQotCi1mclBhdGNoV2lyZTo6ZnJQYXRjaFdpcmUoY29uc3QgZHJQYXRjaFdpcmUgJmluKSB7Ci0gIGluLmdldE9yaWdpbihvcmlnaW4pOwotICBpbi5nZXRPZmZzZXRCb3gob2Zmc2V0Qm94KTsKLSAgbGF5ZXIgPSBpbi5nZXRMYXllck51bSgpOwotICBvd25lciA9IG51bGxwdHI7Ci19CmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9vYmovZnJTaGFwZS5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvb2JqL2ZyU2hhcGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk1MjE4My4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9vYmovZnJTaGFwZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTY4ICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX0ZSX1NIQVBFX0hfCi0jZGVmaW5lIF9GUl9TSEFQRV9IXwotCi0jaW5jbHVkZSAiZGIvb2JqL2ZyRmlnLmgiCi0jaW5jbHVkZSAiZGIvaW5mcmEvZnJTZWdTdHlsZS5oIgotCi0KLW5hbWVzcGFjZSBmciB7Ci0gIGNsYXNzIGZyTmV0OwotICBjbGFzcyBmclBpbjsKLSAgY2xhc3MgZHJQYXRoU2VnOwotICBjbGFzcyB0YVBhdGhTZWc7Ci0gIGNsYXNzIGRyUGF0Y2hXaXJlOwotICBjbGFzcyBmclNoYXBlOiBwdWJsaWMgZnJQaW5GaWcgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3JzCi0gICAgZnJTaGFwZSgpOiBmclBpbkZpZygpIHt9Ci0gICAgLy8gc2V0dGVycwotICAgIHZpcnR1YWwgdm9pZCBzZXRMYXllck51bSAoZnJMYXllck51bSB0bXBMYXllck51bSkgPSAwOwotICAgIC8vIGdldHRlcnMKLSAgICB2aXJ0dWFsIGZyTGF5ZXJOdW0gZ2V0TGF5ZXJOdW0oKSBjb25zdCA9IDA7Ci0gICAgLy8gb3RoZXJzCi0gICAgLy9mckJsb2NrT2JqZWN0RW51bSB0eXBlSWQoKSBjb25zdCBvdmVycmlkZSA9IDA7Ci0KLSAgICAvKiBmcm9tIGZyUGluRmlnCi0gICAgICogaGFzUGluCi0gICAgICogZ2V0UGluCi0gICAgICogYWRkVG9QaW4KLSAgICAgKiByZW1vdmVGcm9tUGluCi0gICAgICovCi0KLSAgICAvKiBmcm9tIGZyQ29ubkZpZwotICAgICAqIGhhc05ldAotICAgICAqIGdldE5ldAotICAgICAqIGFkZFRvTmV0Ci0gICAgICogcmVtb3ZlRnJvbU5ldAotICAgICAqLwotCi0gICAgLyogZnJvbSBmckZpZwotICAgICAqIGdldEJCb3gKLSAgICAgKiBtb3ZlCi0gICAgICogb3ZlcmxhcHMKLSAgICAgKi8KLQotICAgIHZpcnR1YWwgdm9pZCBzZXRJdGVyKGZyTGlzdEl0ZXI8c3RkOjp1bmlxdWVfcHRyPGZyU2hhcGU+ID4gJmluKSA9IDA7Ci0gICAgdmlydHVhbCBmckxpc3RJdGVyPHN0ZDo6dW5pcXVlX3B0cjxmclNoYXBlPiA+IGdldEl0ZXIoKSBjb25zdCA9IDA7Ci0gIHByb3RlY3RlZDoKLSAgfTsKLQotICBjbGFzcyBmclJlY3Q6IHB1YmxpYyBmclNoYXBlIHsKLSAgcHVibGljOgotICAgIC8vIGNvbnN0cnVjdG9ycwotICAgIGZyUmVjdCgpOiBmclNoYXBlKCksIGJveCgpLCBsYXllcigwKSwgb3duZXIobnVsbHB0cikge30KLSAgICBmclJlY3QoY29uc3QgZnJSZWN0ICZpbik6IGZyU2hhcGUoKSwgYm94KGluLmJveCksIGxheWVyKGluLmxheWVyKSwgb3duZXIoaW4ub3duZXIpIHt9Ci0gICAgLy8gc2V0dGVycwotICAgIHZvaWQgc2V0QkJveCAoY29uc3QgZnJCb3ggJmJveEluKSB7Ci0gICAgICBib3guc2V0KGJveEluKTsKLSAgICB9Ci0gICAgLy8gZ2V0dGVycwotICAgIC8vIG90aGVycwotICAgIGJvb2wgaXNIb3IoKSBjb25zdCB7Ci0gICAgICBmckNvb3JkIHhTcGFuID0gYm94LnJpZ2h0KCkgLSBib3gubGVmdCgpOwotICAgICAgZnJDb29yZCB5U3BhbiA9IGJveC50b3AoKSAgIC0gYm94LmJvdHRvbSgpOwotICAgICAgcmV0dXJuICh4U3BhbiA+PSB5U3BhbikgPyB0cnVlIDogZmFsc2U7Ci0gICAgfQotICAgIGZyQ29vcmQgd2lkdGgoKSBjb25zdCB7Ci0gICAgICBmckNvb3JkIHhTcGFuID0gYm94LnJpZ2h0KCkgLSBib3gubGVmdCgpOwotICAgICAgZnJDb29yZCB5U3BhbiA9IGJveC50b3AoKSAgIC0gYm94LmJvdHRvbSgpOwotICAgICAgcmV0dXJuICh4U3BhbiA+IHlTcGFuKSA/IHlTcGFuIDogeFNwYW47Ci0gICAgfQotICAgIGZyQmxvY2tPYmplY3RFbnVtIHR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiBmcmNSZWN0OwotICAgIH0KLQotICAgIC8qIGZyb20gZnJTaGFwZQotICAgICAqIHNldExheWVyTnVtCi0gICAgICogZ2V0TGF5ZXJOdW0KLSAgICAgKi8KLSAgICB2b2lkIHNldExheWVyTnVtIChmckxheWVyTnVtIG51bUluKSBvdmVycmlkZSB7Ci0gICAgICBsYXllciA9IG51bUluOwotICAgIH0KLSAgICBmckxheWVyTnVtIGdldExheWVyTnVtKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIGxheWVyOwotICAgIH0KLSAgICAKLSAgICAvKiBmcm9tIGZyUGluRmlnCi0gICAgICogaGFzUGluCi0gICAgICogZ2V0UGluCi0gICAgICogYWRkVG9QaW4KLSAgICAgKiByZW1vdmVGcm9tUGluCi0gICAgICovCi0gICAgYm9vbCBoYXNQaW4oKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gKG93bmVyKSAmJiAob3duZXItPnR5cGVJZCgpID09IGZyY1Bpbik7Ci0gICAgfQotICAgIAotICAgIGZyUGluKiBnZXRQaW4oKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxmclBpbio+KG93bmVyKTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBhZGRUb1BpbihmclBpbiogaW4pIG92ZXJyaWRlIHsKLSAgICAgIG93bmVyID0gcmVpbnRlcnByZXRfY2FzdDxmckJsb2NrT2JqZWN0Kj4oaW4pOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHJlbW92ZUZyb21QaW4oKSBvdmVycmlkZSB7Ci0gICAgICBvd25lciA9IG51bGxwdHI7Ci0gICAgfQotCi0gICAgLyogZnJvbSBmckNvbm5GaWcKLSAgICAgKiBoYXNOZXQKLSAgICAgKiBnZXROZXQKLSAgICAgKiBhZGRUb05ldAotICAgICAqIHJlbW92ZUZyb21OZXQKLSAgICAgKi8KLSAgICBib29sIGhhc05ldCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiAob3duZXIpICYmIChvd25lci0+dHlwZUlkKCkgPT0gZnJjTmV0KTsKLSAgICB9Ci0gICAgCi0gICAgZnJOZXQqIGdldE5ldCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGZyTmV0Kj4ob3duZXIpOwotICAgIH0KLSAgICAKLSAgICB2b2lkIGFkZFRvTmV0KGZyTmV0KiBpbikgb3ZlcnJpZGUgewotICAgICAgb3duZXIgPSByZWludGVycHJldF9jYXN0PGZyQmxvY2tPYmplY3QqPihpbik7Ci0gICAgfQotICAgIAotICAgIHZvaWQgcmVtb3ZlRnJvbU5ldCgpIG92ZXJyaWRlIHsKLSAgICAgIG93bmVyID0gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICAvKiBmcm9tIGZyRmlnCi0gICAgICogZ2V0QkJveAotICAgICAqIG1vdmUsIGluIC5jcHAKLSAgICAgKiBvdmVybGFwcyBpbiAuY3BwCi0gICAgICovCi0gICAgdm9pZCBnZXRCQm94IChmckJveCAmYm94SW4pIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIGJveEluLnNldChib3gpOwotICAgIH0KLSAgICB2b2lkIG1vdmUoY29uc3QgZnJUcmFuc2Zvcm0gJnhmb3JtKSBvdmVycmlkZSB7Ci0gICAgICBib3gudHJhbnNmb3JtKHhmb3JtKTsKLSAgICB9Ci0gICAgYm9vbCBvdmVybGFwcyhjb25zdCBmckJveCAmYm94KSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICBmckJveCByZWN0Qm94OwotICAgICAgZ2V0QkJveChyZWN0Qm94KTsKLSAgICAgIHJldHVybiByZWN0Qm94Lm92ZXJsYXBzKGJveCk7Ci0gICAgfQotICAgIAotICAgIHZvaWQgc2V0SXRlcihmckxpc3RJdGVyPHN0ZDo6dW5pcXVlX3B0cjxmclNoYXBlPiA+JiBpbikgb3ZlcnJpZGUgewotICAgICAgaXRlciA9IGluOwotICAgIH0KLSAgICBmckxpc3RJdGVyPHN0ZDo6dW5pcXVlX3B0cjxmclNoYXBlPiA+IGdldEl0ZXIoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gaXRlcjsKLSAgICB9Ci0KLSAgcHJvdGVjdGVkOgotICAgIGZyQm94ICAgICAgICAgIGJveDsKLSAgICBmckxheWVyTnVtICAgICBsYXllcjsKLSAgICBmckJsb2NrT2JqZWN0KiBvd25lcjsgLy8gZ2VuZXJhbCBiYWNrIHBvaW50ZXIgMAotICAgIGZyTGlzdEl0ZXI8c3RkOjp1bmlxdWVfcHRyPGZyU2hhcGU+ID4gaXRlcjsKLSAgfTsKLQotICBjbGFzcyBmclBhdGNoV2lyZTogcHVibGljIGZyU2hhcGUgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3JzCi0gICAgZnJQYXRjaFdpcmUoKTogZnJTaGFwZSgpLCBvZmZzZXRCb3goKSwgb3JpZ2luKCksIGxheWVyKDApLCBvd25lcihudWxscHRyKSB7fQotICAgIGZyUGF0Y2hXaXJlKGNvbnN0IGZyUGF0Y2hXaXJlICZpbik6IGZyU2hhcGUoKSwgb2Zmc2V0Qm94KGluLm9mZnNldEJveCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbihpbi5vcmlnaW4pLCBsYXllcihpbi5sYXllciksIG93bmVyKGluLm93bmVyKSB7fQotICAgIGZyUGF0Y2hXaXJlKGNvbnN0IGRyUGF0Y2hXaXJlICZpbik7Ci0gICAgLy8gc2V0dGVycwotICAgIC8vIHZvaWQgc2V0QkJveCAoY29uc3QgZnJCb3ggJmJveEluKSB7Ci0gICAgLy8gICBib3guc2V0KGJveEluKTsKLSAgICAvLyB9Ci0gICAgdm9pZCBzZXRPZmZzZXRCb3ggKGNvbnN0IGZyQm94ICZpbikgewotICAgICAgb2Zmc2V0Qm94LnNldChpbik7Ci0gICAgfQotICAgIHZvaWQgc2V0T3JpZ2luKGNvbnN0IGZyUG9pbnQgJmluKSB7Ci0gICAgICBvcmlnaW4uc2V0KGluKTsKLSAgICB9Ci0gICAgLy8gZ2V0dGVycwotICAgIC8vIG90aGVycwotICAgIGZyQmxvY2tPYmplY3RFbnVtIHR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiBmcmNQYXRjaFdpcmU7Ci0gICAgfQotCi0gICAgLyogZnJvbSBmclNoYXBlCi0gICAgICogc2V0TGF5ZXJOdW0KLSAgICAgKiBnZXRMYXllck51bQotICAgICAqLwotICAgIHZvaWQgc2V0TGF5ZXJOdW0gKGZyTGF5ZXJOdW0gbnVtSW4pIG92ZXJyaWRlIHsKLSAgICAgIGxheWVyID0gbnVtSW47Ci0gICAgfQotICAgIGZyTGF5ZXJOdW0gZ2V0TGF5ZXJOdW0oKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gbGF5ZXI7Ci0gICAgfQotICAgIAotICAgIC8qIGZyb20gZnJQaW5GaWcKLSAgICAgKiBoYXNQaW4KLSAgICAgKiBnZXRQaW4KLSAgICAgKiBhZGRUb1BpbgotICAgICAqIHJlbW92ZUZyb21QaW4KLSAgICAgKi8KLSAgICBib29sIGhhc1BpbigpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiAob3duZXIpICYmIChvd25lci0+dHlwZUlkKCkgPT0gZnJjUGluKTsKLSAgICB9Ci0gICAgCi0gICAgZnJQaW4qIGdldFBpbigpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGZyUGluKj4ob3duZXIpOwotICAgIH0KLSAgICAKLSAgICB2b2lkIGFkZFRvUGluKGZyUGluKiBpbikgb3ZlcnJpZGUgewotICAgICAgb3duZXIgPSByZWludGVycHJldF9jYXN0PGZyQmxvY2tPYmplY3QqPihpbik7Ci0gICAgfQotICAgIAotICAgIHZvaWQgcmVtb3ZlRnJvbVBpbigpIG92ZXJyaWRlIHsKLSAgICAgIG93bmVyID0gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICAvKiBmcm9tIGZyQ29ubkZpZwotICAgICAqIGhhc05ldAotICAgICAqIGdldE5ldAotICAgICAqIGFkZFRvTmV0Ci0gICAgICogcmVtb3ZlRnJvbU5ldAotICAgICAqLwotICAgIGJvb2wgaGFzTmV0KCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIChvd25lcikgJiYgKG93bmVyLT50eXBlSWQoKSA9PSBmcmNOZXQpOwotICAgIH0KLSAgICAKLSAgICBmck5ldCogZ2V0TmV0KCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8ZnJOZXQqPihvd25lcik7Ci0gICAgfQotICAgIAotICAgIHZvaWQgYWRkVG9OZXQoZnJOZXQqIGluKSBvdmVycmlkZSB7Ci0gICAgICBvd25lciA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZnJCbG9ja09iamVjdCo+KGluKTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCByZW1vdmVGcm9tTmV0KCkgb3ZlcnJpZGUgewotICAgICAgb3duZXIgPSBudWxscHRyOwotICAgIH0KLQotICAgIC8qIGZyb20gZnJGaWcKLSAgICAgKiBnZXRCQm94Ci0gICAgICogbW92ZSwgaW4gLmNwcAotICAgICAqIG92ZXJsYXBzIGluIC5jcHAKLSAgICAgKi8KLSAgICB2b2lkIGdldEJCb3ggKGZyQm94ICZib3hJbikgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgZnJUcmFuc2Zvcm0geGZvcm0ob3JpZ2luKTsKLSAgICAgIGJveEluLnNldChvZmZzZXRCb3gpOwotICAgICAgYm94SW4udHJhbnNmb3JtKHhmb3JtKTsKLSAgICB9Ci0gICAgdm9pZCBnZXRPZmZzZXRCb3ggKGZyQm94ICZib3hJbikgY29uc3QgewotICAgICAgYm94SW4uc2V0KG9mZnNldEJveCk7Ci0gICAgfQotICAgIC8vIGZyUG9pbnQgZ2V0T3JpZ2luKCkgY29uc3QgewotICAgIC8vICAgcmV0dXJuIG9yaWdpbjsKLSAgICAvLyB9Ci0gICAgdm9pZCBnZXRPcmlnaW4oZnJQb2ludCAmaW4pIGNvbnN0IHsKLSAgICAgIGluLnNldChvcmlnaW4pOwotICAgIH0KLSAgICB2b2lkIG1vdmUoY29uc3QgZnJUcmFuc2Zvcm0gJnhmb3JtKSBvdmVycmlkZSB7Ci0gICAgICAvLyBvZmZzZXRCb3gudHJhbnNmb3JtKHhmb3JtKTsKLSAgICB9Ci0gICAgYm9vbCBvdmVybGFwcyhjb25zdCBmckJveCAmYm94KSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICBmckJveCByZWN0Qm94OwotICAgICAgZ2V0QkJveChyZWN0Qm94KTsKLSAgICAgIHJldHVybiByZWN0Qm94Lm92ZXJsYXBzKGJveCk7Ci0gICAgfQotICAgIAotICAgIHZvaWQgc2V0SXRlcihmckxpc3RJdGVyPHN0ZDo6dW5pcXVlX3B0cjxmclNoYXBlPiA+JiBpbikgb3ZlcnJpZGUgewotICAgICAgaXRlciA9IGluOwotICAgIH0KLSAgICBmckxpc3RJdGVyPHN0ZDo6dW5pcXVlX3B0cjxmclNoYXBlPiA+IGdldEl0ZXIoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gaXRlcjsKLSAgICB9Ci0KLSAgcHJvdGVjdGVkOgotICAgIC8vIGZyQm94ICAgICAgICAgIGJveDsKLSAgICBmckJveCAgICAgICAgICBvZmZzZXRCb3g7Ci0gICAgZnJQb2ludCAgICAgICAgb3JpZ2luOwotICAgIGZyTGF5ZXJOdW0gICAgIGxheWVyOwotICAgIGZyQmxvY2tPYmplY3QqIG93bmVyOyAvLyBnZW5lcmFsIGJhY2sgcG9pbnRlciAwCi0gICAgZnJMaXN0SXRlcjxzdGQ6OnVuaXF1ZV9wdHI8ZnJTaGFwZT4gPiBpdGVyOwotICB9OwotCi0gIGNsYXNzIGZyUG9seWdvbjogcHVibGljIGZyU2hhcGUgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3JzCi0gICAgZnJQb2x5Z29uKCk6IGZyU2hhcGUoKSwgcG9pbnRzKCksIGxheWVyKDApLCBvd25lcihudWxscHRyKSB7fQotICAgIGZyUG9seWdvbihjb25zdCBmclBvbHlnb24gJmluKTogZnJTaGFwZSgpLCBwb2ludHMoaW4ucG9pbnRzKSwgbGF5ZXIoaW4ubGF5ZXIpLCBvd25lcihpbi5vd25lcikge30KLSAgICAvLyBzZXR0ZXJzCi0gICAgdm9pZCBzZXRQb2ludHMgKGNvbnN0IHN0ZDo6dmVjdG9yPGZyUG9pbnQ+ICZwb2ludHNJbikgewotICAgICAgcG9pbnRzID0gcG9pbnRzSW47Ci0gICAgfQotICAgIC8vIGdldHRlcnMKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxmclBvaW50PiYgZ2V0UG9pbnRzKCkgY29uc3QgewotICAgICAgcmV0dXJuIHBvaW50czsKLSAgICB9Ci0gICAgc3RkOjp2ZWN0b3I8ZnJQb2ludD4mIGdldFBvaW50cygpIHsKLSAgICAgIHJldHVybiBwb2ludHM7Ci0gICAgfQotICAgIC8vIG90aGVycwotICAgIGZyQmxvY2tPYmplY3RFbnVtIHR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiBmcmNQb2x5Z29uOwotICAgIH0KLQotICAgIC8qIGZyb20gZnJTaGFwZQotICAgICAqIHNldExheWVyTnVtCi0gICAgICogZ2V0TGF5ZXJOdW0KLSAgICAgKi8KLSAgICB2b2lkIHNldExheWVyTnVtIChmckxheWVyTnVtIG51bUluKSBvdmVycmlkZSB7Ci0gICAgICBsYXllciA9IG51bUluOwotICAgIH0KLSAgICBmckxheWVyTnVtIGdldExheWVyTnVtKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIGxheWVyOwotICAgIH0KLSAgICAKLSAgICAvKiBmcm9tIGZyUGluRmlnCi0gICAgICogaGFzUGluCi0gICAgICogZ2V0UGluCi0gICAgICogYWRkVG9QaW4KLSAgICAgKiByZW1vdmVGcm9tUGluCi0gICAgICovCi0gICAgYm9vbCBoYXNQaW4oKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gKG93bmVyKSAmJiAob3duZXItPnR5cGVJZCgpID09IGZyY1Bpbik7Ci0gICAgfQotICAgIAotICAgIGZyUGluKiBnZXRQaW4oKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxmclBpbio+KG93bmVyKTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBhZGRUb1BpbihmclBpbiogaW4pIG92ZXJyaWRlIHsKLSAgICAgIG93bmVyID0gcmVpbnRlcnByZXRfY2FzdDxmckJsb2NrT2JqZWN0Kj4oaW4pOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHJlbW92ZUZyb21QaW4oKSBvdmVycmlkZSB7Ci0gICAgICBvd25lciA9IG51bGxwdHI7Ci0gICAgfQotCi0gICAgLyogZnJvbSBmckNvbm5GaWcKLSAgICAgKiBoYXNOZXQKLSAgICAgKiBnZXROZXQKLSAgICAgKiBhZGRUb05ldAotICAgICAqIHJlbW92ZUZyb21OZXQKLSAgICAgKi8KLSAgICBib29sIGhhc05ldCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiAob3duZXIpICYmIChvd25lci0+dHlwZUlkKCkgPT0gZnJjTmV0KTsKLSAgICB9Ci0gICAgCi0gICAgZnJOZXQqIGdldE5ldCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGZyTmV0Kj4ob3duZXIpOwotICAgIH0KLSAgICAKLSAgICB2b2lkIGFkZFRvTmV0KGZyTmV0KiBpbikgb3ZlcnJpZGUgewotICAgICAgb3duZXIgPSByZWludGVycHJldF9jYXN0PGZyQmxvY2tPYmplY3QqPihpbik7Ci0gICAgfQotICAgIAotICAgIHZvaWQgcmVtb3ZlRnJvbU5ldCgpIG92ZXJyaWRlIHsKLSAgICAgIG93bmVyID0gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICAvKiBmcm9tIGZyRmlnCi0gICAgICogZ2V0QkJveAotICAgICAqIG1vdmUsIGluIC5jcHAKLSAgICAgKiBvdmVybGFwcywgaW4gLmNwcAotICAgICAqLwotICAgIHZvaWQgZ2V0QkJveCAoZnJCb3ggJmJveEluKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICBmckNvb3JkIGxseCA9IDA7Ci0gICAgICBmckNvb3JkIGxseSA9IDA7Ci0gICAgICBmckNvb3JkIHVyeCA9IDA7Ci0gICAgICBmckNvb3JkIHVyeSA9IDA7Ci0gICAgICBpZiAocG9pbnRzLnNpemUoKSkgewotICAgICAgICBsbHggPSBwb2ludHMuYmVnaW4oKS0+eCgpOwotICAgICAgICB1cnggPSBwb2ludHMuYmVnaW4oKS0+eCgpOwotICAgICAgICBsbHkgPSBwb2ludHMuYmVnaW4oKS0+eSgpOwotICAgICAgICB1cnkgPSBwb2ludHMuYmVnaW4oKS0+eSgpOwotICAgICAgfQotICAgICAgZm9yIChhdXRvICZwb2ludDogcG9pbnRzKSB7Ci0gICAgICAgIGxseCA9IChsbHggPCBwb2ludC54KCkpID8gbGx4IDogcG9pbnQueCgpOwotICAgICAgICBsbHkgPSAobGx5IDwgcG9pbnQueSgpKSA/IGxseSA6IHBvaW50LnkoKTsKLSAgICAgICAgdXJ4ID0gKHVyeCA+IHBvaW50LngoKSkgPyB1cnggOiBwb2ludC54KCk7Ci0gICAgICAgIHVyeSA9ICh1cnkgPiBwb2ludC55KCkpID8gdXJ5IDogcG9pbnQueSgpOwotICAgICAgfQotICAgICAgYm94SW4uc2V0KGxseCwgbGx5LCB1cngsIHVyeSk7Ci0gICAgfQotICAgIHZvaWQgbW92ZShjb25zdCBmclRyYW5zZm9ybSAmeGZvcm0pIG92ZXJyaWRlIHsKLSAgICAgIGZvciAoYXV0byAmcG9pbnQ6IHBvaW50cykgewotICAgICAgICBwb2ludC50cmFuc2Zvcm0oeGZvcm0pOwotICAgICAgfQotICAgIH0KLSAgICBib29sIG92ZXJsYXBzKGNvbnN0IGZyQm94ICZib3gpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzZXRJdGVyKGZyTGlzdEl0ZXI8c3RkOjp1bmlxdWVfcHRyPGZyU2hhcGU+ID4mIGluKSBvdmVycmlkZSB7Ci0gICAgICBpdGVyID0gaW47Ci0gICAgfQotICAgIGZyTGlzdEl0ZXI8c3RkOjp1bmlxdWVfcHRyPGZyU2hhcGU+ID4gZ2V0SXRlcigpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiBpdGVyOwotICAgIH0KLQotICBwcm90ZWN0ZWQ6Ci0gICAgc3RkOjp2ZWN0b3I8ZnJQb2ludD4gcG9pbnRzOwotICAgIGZyTGF5ZXJOdW0gICAgICAgICAgIGxheWVyOwotICAgIGZyQmxvY2tPYmplY3QqICAgICAgIG93bmVyOwotICAgIGZyTGlzdEl0ZXI8c3RkOjp1bmlxdWVfcHRyPGZyU2hhcGU+ID4gaXRlcjsKLSAgfTsKLQotCi0gIGNsYXNzIGZyUGF0aFNlZzogcHVibGljIGZyU2hhcGUgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3JzCi0gICAgZnJQYXRoU2VnKCk6IGZyU2hhcGUoKSwgYmVnaW4oKSwgZW5kKCksIGxheWVyKDApLCBzdHlsZSgpLCBvd25lcihudWxscHRyKSB7fQotICAgIGZyUGF0aFNlZyhjb25zdCBmclBhdGhTZWcgJmluKTogYmVnaW4oaW4uYmVnaW4pLCBlbmQoaW4uZW5kKSwgbGF5ZXIoaW4ubGF5ZXIpLCBzdHlsZShpbi5zdHlsZSksIG93bmVyKGluLm93bmVyKSB7fQotICAgIGZyUGF0aFNlZyhjb25zdCBkclBhdGhTZWcgJmluKTsKLSAgICBmclBhdGhTZWcoY29uc3QgdGFQYXRoU2VnICZpbik7Ci0gICAgLy8gZ2V0dGVycwotICAgIHZvaWQgZ2V0UG9pbnRzKGZyUG9pbnQgJmJlZ2luSW4sIGZyUG9pbnQgJmVuZEluKSBjb25zdCB7Ci0gICAgICBiZWdpbkluLnNldChiZWdpbik7Ci0gICAgICBlbmRJbi5zZXQoZW5kKTsKLSAgICB9Ci0gICAgdm9pZCBnZXRTdHlsZShmclNlZ1N0eWxlICZzdHlsZUluKSBjb25zdCB7Ci0gICAgICBzdHlsZUluLnNldEJlZ2luU3R5bGUoc3R5bGUuZ2V0QmVnaW5TdHlsZSgpLCBzdHlsZS5nZXRCZWdpbkV4dCgpKTsKLSAgICAgIHN0eWxlSW4uc2V0RW5kU3R5bGUoc3R5bGUuZ2V0RW5kU3R5bGUoKSwgc3R5bGUuZ2V0RW5kRXh0KCkpOwotICAgICAgc3R5bGVJbi5zZXRXaWR0aChzdHlsZS5nZXRXaWR0aCgpKTsKLSAgICB9Ci0gICAgLy8gc2V0dGVycwotICAgIHZvaWQgc2V0UG9pbnRzKGNvbnN0IGZyUG9pbnQgJmJlZ2luSW4sIGNvbnN0IGZyUG9pbnQgJmVuZEluKSB7Ci0gICAgICBiZWdpbi5zZXQoYmVnaW5Jbik7Ci0gICAgICBlbmQuc2V0KGVuZEluKTsKLSAgICB9Ci0gICAgdm9pZCBzZXRTdHlsZShjb25zdCBmclNlZ1N0eWxlICZzdHlsZUluKSB7Ci0gICAgICBzdHlsZS5zZXRCZWdpblN0eWxlKHN0eWxlSW4uZ2V0QmVnaW5TdHlsZSgpLCBzdHlsZUluLmdldEJlZ2luRXh0KCkpOwotICAgICAgc3R5bGUuc2V0RW5kU3R5bGUoc3R5bGVJbi5nZXRFbmRTdHlsZSgpLCBzdHlsZUluLmdldEVuZEV4dCgpKTsKLSAgICAgIHN0eWxlLnNldFdpZHRoKHN0eWxlSW4uZ2V0V2lkdGgoKSk7Ci0gICAgfQotICAgIC8vIG90aGVycwotICAgIGZyQmxvY2tPYmplY3RFbnVtIHR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiBmcmNQYXRoU2VnOwotICAgIH0KLQotICAgIC8qIGZyb20gZnJTaGFwZQotICAgICAqIHNldExheWVyTnVtCi0gICAgICogZ2V0TGF5ZXJOdW0KLSAgICAgKi8KLSAgICB2b2lkIHNldExheWVyTnVtIChmckxheWVyTnVtIG51bUluKSBvdmVycmlkZSB7Ci0gICAgICBsYXllciA9IG51bUluOwotICAgIH0KLSAgICBmckxheWVyTnVtIGdldExheWVyTnVtKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIGxheWVyOwotICAgIH0KLSAgICAKLSAgICAvKiBmcm9tIGZyUGluRmlnCi0gICAgICogaGFzUGluCi0gICAgICogZ2V0UGluCi0gICAgICogYWRkVG9QaW4KLSAgICAgKiByZW1vdmVGcm9tUGluCi0gICAgICovCi0gICAgYm9vbCBoYXNQaW4oKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gKG93bmVyKSAmJiAob3duZXItPnR5cGVJZCgpID09IGZyY1Bpbik7Ci0gICAgfQotICAgIAotICAgIGZyUGluKiBnZXRQaW4oKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxmclBpbio+KG93bmVyKTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBhZGRUb1BpbihmclBpbiogaW4pIG92ZXJyaWRlIHsKLSAgICAgIG93bmVyID0gcmVpbnRlcnByZXRfY2FzdDxmckJsb2NrT2JqZWN0Kj4oaW4pOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHJlbW92ZUZyb21QaW4oKSBvdmVycmlkZSB7Ci0gICAgICBvd25lciA9IG51bGxwdHI7Ci0gICAgfQotCi0gICAgLyogZnJvbSBmckNvbm5GaWcKLSAgICAgKiBoYXNOZXQKLSAgICAgKiBnZXROZXQKLSAgICAgKiBhZGRUb05ldAotICAgICAqIHJlbW92ZUZyb21OZXQKLSAgICAgKi8KLSAgICBib29sIGhhc05ldCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiAob3duZXIpICYmIChvd25lci0+dHlwZUlkKCkgPT0gZnJjTmV0KTsKLSAgICB9Ci0gICAgCi0gICAgZnJOZXQqIGdldE5ldCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGZyTmV0Kj4ob3duZXIpOwotICAgIH0KLSAgICAKLSAgICB2b2lkIGFkZFRvTmV0KGZyTmV0KiBpbikgb3ZlcnJpZGUgewotICAgICAgb3duZXIgPSByZWludGVycHJldF9jYXN0PGZyQmxvY2tPYmplY3QqPihpbik7Ci0gICAgfQotICAgIAotICAgIHZvaWQgcmVtb3ZlRnJvbU5ldCgpIG92ZXJyaWRlIHsKLSAgICAgIG93bmVyID0gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICAvKiBmcm9tIGZyRmlnCi0gICAgICogZ2V0QkJveAotICAgICAqIG1vdmUsIGluIC5jcHAKLSAgICAgKiBvdmVybGFwcywgaW4gLmNwcAotICAgICAqLwotICAgIC8vIG5lZWRzIHRvIGJlIHVwZGF0ZWQKLSAgICB2b2lkIGdldEJCb3ggKGZyQm94ICZib3hJbikgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgYm9vbCBpc0hvcml6b250YWwgPSB0cnVlOwotICAgICAgaWYgKGJlZ2luLngoKSA9PSBlbmQueCgpKSB7Ci0gICAgICAgIGlzSG9yaXpvbnRhbCA9IGZhbHNlOwotICAgICAgfQotICAgICAgYXV0byB3aWR0aCAgICA9IHN0eWxlLmdldFdpZHRoKCk7Ci0gICAgICBhdXRvIGJlZ2luRXh0ID0gc3R5bGUuZ2V0QmVnaW5FeHQoKTsKLSAgICAgIGF1dG8gZW5kRXh0ICAgPSBzdHlsZS5nZXRFbmRFeHQoKTsKLSAgICAgIGlmIChpc0hvcml6b250YWwpIHsKLSAgICAgICAgYm94SW4uc2V0KGJlZ2luLngoKSAtIGJlZ2luRXh0LCBiZWdpbi55KCkgLSB3aWR0aCAvIDIsCi0gICAgICAgICAgICAgICAgICBlbmQueCgpICAgKyBlbmRFeHQsICAgZW5kLnkoKSAgICsgd2lkdGggLyAyKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGJveEluLnNldChiZWdpbi54KCkgLSB3aWR0aCAvIDIsIGJlZ2luLnkoKSAtIGJlZ2luRXh0LAotICAgICAgICAgICAgICAgICAgZW5kLngoKSAgICsgd2lkdGggLyAyLCBlbmQueSgpICAgKyBlbmRFeHQpOwotICAgICAgfQotICAgIH0KLSAgICB2b2lkIG1vdmUoY29uc3QgZnJUcmFuc2Zvcm0gJnhmb3JtKSBvdmVycmlkZSB7Ci0gICAgICBiZWdpbi50cmFuc2Zvcm0oeGZvcm0pOwotICAgICAgZW5kLnRyYW5zZm9ybSh4Zm9ybSk7Ci0gICAgfQotICAgIGJvb2wgb3ZlcmxhcHMoY29uc3QgZnJCb3ggJmJveCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQgc2V0SXRlcihmckxpc3RJdGVyPHN0ZDo6dW5pcXVlX3B0cjxmclNoYXBlPiA+JiBpbikgb3ZlcnJpZGUgewotICAgICAgaXRlciA9IGluOwotICAgIH0KLSAgICBmckxpc3RJdGVyPHN0ZDo6dW5pcXVlX3B0cjxmclNoYXBlPiA+IGdldEl0ZXIoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gaXRlcjsKLSAgICB9Ci0gIHByb3RlY3RlZDoKLSAgICBmclBvaW50ICAgICAgICBiZWdpbjsgLy8gYmVnaW4gYWx3YXlzIHNtYWxsZXIgdGhhbiBlbmQsIGFzc3VtZWQKLSAgICBmclBvaW50ICAgICAgICBlbmQ7Ci0gICAgZnJMYXllck51bSAgICAgbGF5ZXI7Ci0gICAgZnJTZWdTdHlsZSAgICAgc3R5bGU7Ci0gICAgZnJCbG9ja09iamVjdCogb3duZXI7Ci0gICAgZnJMaXN0SXRlcjxzdGQ6OnVuaXF1ZV9wdHI8ZnJTaGFwZT4gPiBpdGVyOwotICB9OwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL29iai9mclRlcm0uaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL29iai9mclRlcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk3MWMzNC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9vYmovZnJUZXJtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyogQXV0aG9yczogTHV0b25nIFdhbmcgYW5kIEJhbmdxaSBYdSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBfRlJfVEVSTV9IXwotI2RlZmluZSBfRlJfVEVSTV9IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgImZyQmFzZVR5cGVzLmgiCi0jaW5jbHVkZSAiZGIvb2JqL2ZyQmxvY2tPYmplY3QuaCIKLSNpbmNsdWRlICJkYi9vYmovZnJQaW4uaCIKLQotbmFtZXNwYWNlIGZyIHsKLSAgY2xhc3MgZnJOZXQ7Ci0gIGNsYXNzIGZySW5zdFRlcm07Ci0KLSAgY2xhc3MgZnJUZXJtOiBwdWJsaWMgZnJCbG9ja09iamVjdCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBjb25zdHJ1Y3RvcnMKLSAgICAvL2ZyVGVybSgpOiBmckJsb2NrT2JqZWN0KCksIG5hbWUoKSwgbmV0KCksIHBpbnMoKSB7fQotICAgIGZyVGVybShjb25zdCBmclN0cmluZyAmaW4pOiBmckJsb2NrT2JqZWN0KCksIG5hbWUoaW4pLCBuZXQobnVsbHB0ciksIHBpbnMoKSwgdHlwZShmclRlcm1FbnVtOjpmcmNOb3JtYWxUZXJtKSB7fQotICAgIGZyVGVybShjb25zdCBmclRlcm0gJmluKTogZnJCbG9ja09iamVjdCgpLCBuYW1lKGluLm5hbWUpLCBuZXQoaW4ubmV0KSwgdHlwZShpbi50eXBlKSB7Ci0gICAgICBmb3IgKGF1dG8gJnVQaW46IGluLmdldFBpbnMoKSkgewotICAgICAgICBhdXRvIHBpbiA9IHVQaW4uZ2V0KCk7Ci0gICAgICAgIGF1dG8gdG1wID0gc3RkOjptYWtlX3VuaXF1ZTxmclBpbj4oKnBpbik7Ci0gICAgICAgIGFkZFBpbih0bXApOwotICAgICAgfQotICAgIH0KLSAgICBmclRlcm0oY29uc3QgZnJUZXJtICZpbiwgY29uc3QgZnJUcmFuc2Zvcm0gJnhmb3JtKTogZnJCbG9ja09iamVjdCgpLCBuYW1lKGluLm5hbWUpLCBuZXQoaW4ubmV0KSwgdHlwZShpbi50eXBlKSB7Ci0gICAgICBmb3IgKGF1dG8gJnVQaW46IGluLmdldFBpbnMoKSkgewotICAgICAgICBhdXRvIHBpbiA9IHVQaW4uZ2V0KCk7Ci0gICAgICAgIGF1dG8gdG1wID0gc3RkOjptYWtlX3VuaXF1ZTxmclBpbj4oKnBpbiwgeGZvcm0pOwotICAgICAgICBhZGRQaW4odG1wKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gZ2V0dGVycwotICAgIGJvb2wgaGFzTmV0KCkgY29uc3QgewotICAgICAgcmV0dXJuIChuZXQpOwotICAgIH0KLSAgICBmck5ldCogZ2V0TmV0KCkgY29uc3QgewotICAgICAgcmV0dXJuIG5ldDsKLSAgICB9Ci0gICAgY29uc3QgZnJTdHJpbmcmIGdldE5hbWUoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8IHN0ZDo6dW5pcXVlX3B0cjxmclBpbj4gPiYgZ2V0UGlucygpIGNvbnN0IHsKLSAgICAgIHJldHVybiBwaW5zOwotICAgIH0KLSAgICBzdGQ6OnZlY3Rvcjwgc3RkOjp1bmlxdWVfcHRyPGZyUGluPiA+JiBnZXRQaW5zKCkgewotICAgICAgcmV0dXJuIHBpbnM7Ci0gICAgfQotICAgIC8vIHNldHRlcnMKLSAgICB2b2lkIGFkZFRvTmV0KGZyTmV0KiBpbikgewotICAgICAgbmV0ID0gaW47Ci0gICAgfQotICAgIC8vdm9pZCByZW1vdmVGcm9tTmV0KCkgewotICAgIC8vICBuZXQucmVzZXQoKTsKLSAgICAvL30KLSAgICB2b2lkIGFkZFBpbihzdGQ6OnVuaXF1ZV9wdHI8ZnJQaW4+ICZpbikgewotICAgICAgaW4tPnNldFRlcm0odGhpcyk7Ci0gICAgICBwaW5zLnB1c2hfYmFjayhzdGQ6Om1vdmUoaW4pKTsKLSAgICB9Ci0gICAgdm9pZCBzZXRUeXBlKGZyVGVybUVudW0gaW4pIHsKLSAgICAgIHR5cGUgPSBpbjsKLSAgICB9Ci0gICAgZnJUZXJtRW51bSBnZXRUeXBlKCkgY29uc3QgewotICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotICAgIC8vIG90aGVycwotICAgIGZyQmxvY2tPYmplY3RFbnVtIHR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiBmcmNUZXJtOwotICAgIH0KLSAgcHJvdGVjdGVkOgotICAgIGZyU3RyaW5nIG5hbWU7IC8vIEEsIEIsIFosIFZTUywgVkRECi0gICAgZnJOZXQqIG5ldDsgLy8gc2V0IGxhdGVyLCB0ZXJtIGluIGluc3RUZXJtIGRvZXMgbm90IGhhdmUgbmV0Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGZyUGluPiA+IHBpbnM7IC8vIHNldCBsYXRlcgotICAgIGZyVGVybUVudW0gdHlwZTsKLSAgfTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9vYmovZnJUcmFja1BhdHRlcm4uaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL29iai9mclRyYWNrUGF0dGVybi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2U1MGY1Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL29iai9mclRyYWNrUGF0dGVybi5oCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyogQXV0aG9yczogTHV0b25nIFdhbmcgYW5kIEJhbmdxaSBYdSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBfRlJfVFJBQ0tQQVRURVJOX0hfCi0jZGVmaW5lIF9GUl9UUkFDS1BBVFRFUk5fSF8KLQotI2luY2x1ZGUgImZyQmFzZVR5cGVzLmgiCi0jaW5jbHVkZSAiZGIvb2JqL2ZyQmxvY2tPYmplY3QuaCIKLQotbmFtZXNwYWNlIGZyIHsKLSAgY2xhc3MgZnJUcmFja1BhdHRlcm46IHB1YmxpYyBmckJsb2NrT2JqZWN0IHsKLSAgcHVibGljOgotICAgIC8vIGNvbnN0cnVjdG9ycwotICAgIGZyVHJhY2tQYXR0ZXJuKCkgPSBkZWZhdWx0OwotICAgIGZyVHJhY2tQYXR0ZXJuKGNvbnN0IGZyVHJhY2tQYXR0ZXJuJiB0bXBUcmFja1BhdHRlcm4pIDogCi0gICAgICBob3Jpem9udGFsKHRtcFRyYWNrUGF0dGVybi5ob3Jpem9udGFsKSwgc3RhcnRDb29yZCh0bXBUcmFja1BhdHRlcm4uc3RhcnRDb29yZCksIAotICAgICAgbnVtVHJhY2tzKHRtcFRyYWNrUGF0dGVybi5udW1UcmFja3MpLCB0cmFja1NwYWNpbmcodG1wVHJhY2tQYXR0ZXJuLnRyYWNrU3BhY2luZyksIGxheWVyTnVtKHRtcFRyYWNrUGF0dGVybi5sYXllck51bSkge30KLSAgICBmclRyYWNrUGF0dGVybihib29sIHRtcElzSCwgZnJDb29yZCB0bXBTQywgZnJVSW50NCB0bXBOVCwgZnJVSW50NCB0bXBUUywgZnJMYXllck51bSB0bXBMTikgOgotICAgICAgaG9yaXpvbnRhbCh0bXBJc0gpLCBzdGFydENvb3JkKHRtcFNDKSwgbnVtVHJhY2tzKHRtcE5UKSwgdHJhY2tTcGFjaW5nKHRtcFRTKSwgbGF5ZXJOdW0odG1wTE4pIHt9Ci0gICAgLy8gZ2V0dGVycwotICAgIC8vIHZlcnRpY2FsIHRyYWNrIGhhcyBob3Jpem9udGFsID0gdHJ1ZTsKLSAgICBib29sIGlzSG9yaXpvbnRhbCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBob3Jpem9udGFsOwotICAgIH0KLSAgICBmckNvb3JkIGdldFN0YXJ0Q29vcmQoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gc3RhcnRDb29yZDsKLSAgICB9Ci0gICAgZnJVSW50NCBnZXROdW1UcmFja3MoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbnVtVHJhY2tzOwotICAgIH0KLSAgICBmclVJbnQ0IGdldFRyYWNrU3BhY2luZygpIGNvbnN0IHsKLSAgICAgIHJldHVybiB0cmFja1NwYWNpbmc7Ci0gICAgfQotICAgIGZyTGF5ZXJOdW0gZ2V0TGF5ZXJOdW0oKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbGF5ZXJOdW07Ci0gICAgfQotICAgIC8vIHNldHRlcnMKLSAgICAvLyB2ZXJ0aWNhbCB0cmFjayBoYXMgaG9yaXpvbnRhbCA9IHRydWU7Ci0gICAgdm9pZCBzZXRIb3Jpem9udGFsKGJvb2wgdG1wSXNIb3Jpem9udGFsKSB7Ci0gICAgICBob3Jpem9udGFsID0gdG1wSXNIb3Jpem9udGFsOwotICAgIH0KLSAgICB2b2lkIHNldFN0YXJ0Q29vcmQoZnJDb29yZCB0bXBTdGFydENvb3JkKSB7Ci0gICAgICBzdGFydENvb3JkID0gdG1wU3RhcnRDb29yZDsKLSAgICB9Ci0gICAgdm9pZCBzZXROdW1UcmFja3MoZnJVSW50NCB0bXBOdW1UcmFja3MpIHsKLSAgICAgIG51bVRyYWNrcyA9IHRtcE51bVRyYWNrczsKLSAgICB9Ci0gICAgdm9pZCBzZXRUcmFja1NwYWNpbmcoZnJVSW50NCB0bXBUcmFja1NwYWNpbmcpIHsKLSAgICAgIHRyYWNrU3BhY2luZyA9IHRtcFRyYWNrU3BhY2luZzsKLSAgICB9Ci0gICAgdm9pZCBzZXRMYXllck51bShmckxheWVyTnVtIHRtcExheWVyTnVtKSB7Ci0gICAgICBsYXllck51bSA9IHRtcExheWVyTnVtOwotICAgIH0KLSAgcHJvdGVjdGVkOgotICAgIGJvb2wgICAgICAgaG9yaXpvbnRhbDsKLSAgICBmckNvb3JkICAgIHN0YXJ0Q29vcmQ7Ci0gICAgZnJVSW50NCAgICBudW1UcmFja3M7Ci0gICAgZnJVSW50NCAgICB0cmFja1NwYWNpbmc7Ci0gICAgZnJMYXllck51bSBsYXllck51bTsKLSAgfTsKLQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL29iai9mclZpYS5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9vYmovZnJWaWEuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjRiNTQ2Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL29iai9mclZpYS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiZGIvb2JqL2ZyVmlhLmgiCi0jaW5jbHVkZSAiZGIvZHJPYmovZHJWaWEuaCIKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBmcjsKLQotZnJWaWE6OmZyVmlhKGNvbnN0IGRyVmlhICZpbikgewotICBpbi5nZXRPcmlnaW4ob3JpZ2luKTsKLSAgdmlhRGVmID0gaW4uZ2V0VmlhRGVmKCk7Ci19CmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi9vYmovZnJWaWEuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL29iai9mclZpYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWZlYzdlLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL29iai9mclZpYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX0ZSX1ZJQV9IXwotI2RlZmluZSBfRlJfVklBX0hfCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSAiZGIvb2JqL2ZyUmVmLmgiCi0jaW5jbHVkZSAiZGIvb2JqL2ZyU2hhcGUuaCIKLSNpbmNsdWRlICJkYi90ZWNoL2ZyVmlhRGVmLmgiCi0KLW5hbWVzcGFjZSBmciB7Ci0gIGNsYXNzIGZyTmV0OwotICBjbGFzcyBkclZpYTsKLSAgY2xhc3MgZnJWaWE6IHB1YmxpYyBmclJlZiB7Ci0gIHB1YmxpYzoKLSAgICAvLyBjb25zdHJ1Y3RvcnMKLSAgICBmclZpYSgpOiBmclJlZigpIHt9Ci0gICAgZnJWaWEoZnJWaWFEZWYqIGluKTogZnJSZWYoKSwgb3JpZ2luKCksIHZpYURlZihpbiksIG93bmVyKG51bGxwdHIpIHt9Ci0gICAgZnJWaWEoY29uc3QgZnJWaWEgJmluKTogb3JpZ2luKGluLm9yaWdpbiksIHZpYURlZihpbi52aWFEZWYpLCBvd25lcihpbi5vd25lcikge30KLSAgICBmclZpYShjb25zdCBkclZpYSAmaW4pOwotICAgIC8vIGdldHRlcnMKLSAgICBmclZpYURlZiogZ2V0VmlhRGVmKCkgY29uc3QgewotICAgICAgcmV0dXJuIHZpYURlZjsKLSAgICB9Ci0gICAgdm9pZCBnZXRMYXllcjFCQm94KGZyQm94ICZib3hJbikgY29uc3QgewotICAgICAgYXV0byAmZmlncyA9IHZpYURlZi0+Z2V0TGF5ZXIxRmlncygpOwotICAgICAgYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKLSAgICAgIGZyQm94IGJveDsKLSAgICAgIGZyQ29vcmQgeGwgPSAwOwotICAgICAgZnJDb29yZCB5bCA9IDA7Ci0gICAgICBmckNvb3JkIHhoID0gMDsKLSAgICAgIGZyQ29vcmQgeWggPSAwOwotICAgICAgZm9yIChhdXRvICZmaWc6IGZpZ3MpIHsKLSAgICAgICAgZmlnLT5nZXRCQm94KGJveCk7Ci0gICAgICAgIGlmIChpc0ZpcnN0KSB7Ci0gICAgICAgICAgeGwgPSBib3gubGVmdCgpOwotICAgICAgICAgIHlsID0gYm94LmJvdHRvbSgpOwotICAgICAgICAgIHhoID0gYm94LnJpZ2h0KCk7Ci0gICAgICAgICAgeWggPSBib3gudG9wKCk7Ci0gICAgICAgICAgaXNGaXJzdCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHhsID0gc3RkOjptaW4oeGwsIGJveC5sZWZ0KCkpOwotICAgICAgICAgIHlsID0gc3RkOjptaW4oeWwsIGJveC5ib3R0b20oKSk7Ci0gICAgICAgICAgeGggPSBzdGQ6Om1heCh4aCwgYm94LnJpZ2h0KCkpOwotICAgICAgICAgIHloID0gc3RkOjptYXgoeWgsIGJveC50b3AoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJveEluLnNldCh4bCx5bCx4aCx5aCk7Ci0gICAgICBmclRyYW5zZm9ybSB4Zm9ybTsKLSAgICAgIHhmb3JtLnNldChvcmlnaW4pOwotICAgICAgYm94SW4udHJhbnNmb3JtKHhmb3JtKTsKLSAgICB9Ci0gICAgdm9pZCBnZXRDdXRCQm94KGZyQm94ICZib3hJbikgY29uc3QgewotICAgICAgYXV0byAmZmlncyA9IHZpYURlZi0+Z2V0Q3V0RmlncygpOwotICAgICAgYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKLSAgICAgIGZyQm94IGJveDsKLSAgICAgIGZyQ29vcmQgeGwgPSAwOwotICAgICAgZnJDb29yZCB5bCA9IDA7Ci0gICAgICBmckNvb3JkIHhoID0gMDsKLSAgICAgIGZyQ29vcmQgeWggPSAwOwotICAgICAgZm9yIChhdXRvICZmaWc6IGZpZ3MpIHsKLSAgICAgICAgZmlnLT5nZXRCQm94KGJveCk7Ci0gICAgICAgIGlmIChpc0ZpcnN0KSB7Ci0gICAgICAgICAgeGwgPSBib3gubGVmdCgpOwotICAgICAgICAgIHlsID0gYm94LmJvdHRvbSgpOwotICAgICAgICAgIHhoID0gYm94LnJpZ2h0KCk7Ci0gICAgICAgICAgeWggPSBib3gudG9wKCk7Ci0gICAgICAgICAgaXNGaXJzdCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHhsID0gc3RkOjptaW4oeGwsIGJveC5sZWZ0KCkpOwotICAgICAgICAgIHlsID0gc3RkOjptaW4oeWwsIGJveC5ib3R0b20oKSk7Ci0gICAgICAgICAgeGggPSBzdGQ6Om1heCh4aCwgYm94LnJpZ2h0KCkpOwotICAgICAgICAgIHloID0gc3RkOjptYXgoeWgsIGJveC50b3AoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJveEluLnNldCh4bCx5bCx4aCx5aCk7Ci0gICAgICBmclRyYW5zZm9ybSB4Zm9ybTsKLSAgICAgIHhmb3JtLnNldChvcmlnaW4pOwotICAgICAgYm94SW4udHJhbnNmb3JtKHhmb3JtKTsKLSAgICB9Ci0gICAgdm9pZCBnZXRMYXllcjJCQm94KGZyQm94ICZib3hJbikgY29uc3QgewotICAgICAgYXV0byAmZmlncyA9IHZpYURlZi0+Z2V0TGF5ZXIyRmlncygpOwotICAgICAgYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKLSAgICAgIGZyQm94IGJveDsKLSAgICAgIGZyQ29vcmQgeGwgPSAwOwotICAgICAgZnJDb29yZCB5bCA9IDA7Ci0gICAgICBmckNvb3JkIHhoID0gMDsKLSAgICAgIGZyQ29vcmQgeWggPSAwOwotICAgICAgZm9yIChhdXRvICZmaWc6IGZpZ3MpIHsKLSAgICAgICAgZmlnLT5nZXRCQm94KGJveCk7Ci0gICAgICAgIGlmIChpc0ZpcnN0KSB7Ci0gICAgICAgICAgeGwgPSBib3gubGVmdCgpOwotICAgICAgICAgIHlsID0gYm94LmJvdHRvbSgpOwotICAgICAgICAgIHhoID0gYm94LnJpZ2h0KCk7Ci0gICAgICAgICAgeWggPSBib3gudG9wKCk7Ci0gICAgICAgICAgaXNGaXJzdCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHhsID0gc3RkOjptaW4oeGwsIGJveC5sZWZ0KCkpOwotICAgICAgICAgIHlsID0gc3RkOjptaW4oeWwsIGJveC5ib3R0b20oKSk7Ci0gICAgICAgICAgeGggPSBzdGQ6Om1heCh4aCwgYm94LnJpZ2h0KCkpOwotICAgICAgICAgIHloID0gc3RkOjptYXgoeWgsIGJveC50b3AoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJveEluLnNldCh4bCx5bCx4aCx5aCk7Ci0gICAgICBmclRyYW5zZm9ybSB4Zm9ybTsKLSAgICAgIHhmb3JtLnNldChvcmlnaW4pOwotICAgICAgYm94SW4udHJhbnNmb3JtKHhmb3JtKTsKLSAgICB9Ci0gICAgLy8gc2V0dGVycwotICAgIHZvaWQgc2V0VmlhRGVmKGZyVmlhRGVmKiBpbikgewotICAgICAgdmlhRGVmID0gaW47Ci0gICAgfQotICAgIC8vIG90aGVycwotICAgIGZyQmxvY2tPYmplY3RFbnVtIHR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiBmcmNWaWE7Ci0gICAgfQotCi0gICAgLyogZnJvbSBmclJlZgotICAgICAqIGdldE9yaWVudAotICAgICAqIHNldE9yaWVudAotICAgICAqIGdldE9yaWdpbgotICAgICAqIHNldE9yaWdpbgotICAgICAqIGdldFRyYW5zZm9ybQotICAgICAqIHNldFRyYW5zZm9ybQotICAgICAqLwotCi0gICAgZnJPcmllbnQgZ2V0T3JpZW50KCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIGZyT3JpZW50KCk7Ci0gICAgfQotICAgIHZvaWQgc2V0T3JpZW50KGNvbnN0IGZyT3JpZW50ICZ0bXBPcmllbnQpIG92ZXJyaWRlIHsKLSAgICAgIDsKLSAgICB9Ci0gICAgdm9pZCBnZXRPcmlnaW4oZnJQb2ludCAmdG1wT3JpZ2luKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICB0bXBPcmlnaW4uc2V0KG9yaWdpbik7Ci0gICAgfQotICAgIHZvaWQgc2V0T3JpZ2luKGNvbnN0IGZyUG9pbnQgJnRtcFBvaW50KSBvdmVycmlkZSB7Ci0gICAgICBvcmlnaW4uc2V0KHRtcFBvaW50KTsKLSAgICB9Ci0gICAgdm9pZCBnZXRUcmFuc2Zvcm0oZnJUcmFuc2Zvcm0gJnhmb3JtSW4pIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHhmb3JtSW4uc2V0KG9yaWdpbik7Ci0gICAgfQotICAgIHZvaWQgc2V0VHJhbnNmb3JtKGNvbnN0IGZyVHJhbnNmb3JtICZ4Zm9ybUluKSBvdmVycmlkZSB7fQotCi0gICAgLyogZnJvbSBmclBpbkZpZwotICAgICAqIGhhc1BpbgotICAgICAqIGdldFBpbgotICAgICAqIGFkZFRvUGluCi0gICAgICogcmVtb3ZlRnJvbVBpbgotICAgICAqLwotICAgIGJvb2wgaGFzUGluKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIChvd25lcikgJiYgKG93bmVyLT50eXBlSWQoKSA9PSBmcmNQaW4pOwotICAgIH0KLSAgICBmclBpbiogZ2V0UGluKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8ZnJQaW4qPihvd25lcik7Ci0gICAgfQotICAgIHZvaWQgYWRkVG9QaW4oZnJQaW4qIGluKSBvdmVycmlkZSB7Ci0gICAgICBvd25lciA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZnJCbG9ja09iamVjdCo+KGluKTsKLSAgICB9Ci0gICAgdm9pZCByZW1vdmVGcm9tUGluKCkgb3ZlcnJpZGUgewotICAgICAgb3duZXIgPSBudWxscHRyOwotICAgIH0KLQotICAgIC8qIGZyb20gZnJDb25uRmlnCi0gICAgICogaGFzTmV0Ci0gICAgICogZ2V0TmV0Ci0gICAgICogYWRkVG9OZXQKLSAgICAgKiByZW1vdmVGcm9tTmV0Ci0gICAgICovCi0gICAgYm9vbCBoYXNOZXQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gKG93bmVyKSAmJiAob3duZXItPnR5cGVJZCgpID09IGZyY05ldCk7Ci0gICAgfQotICAgIGZyTmV0KiBnZXROZXQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxmck5ldCo+KG93bmVyKTsKLSAgICB9Ci0gICAgdm9pZCBhZGRUb05ldChmck5ldCogaW4pIG92ZXJyaWRlIHsKLSAgICAgIG93bmVyID0gcmVpbnRlcnByZXRfY2FzdDxmckJsb2NrT2JqZWN0Kj4oaW4pOwotICAgIH0KLSAgICB2b2lkIHJlbW92ZUZyb21OZXQoKSBvdmVycmlkZSB7Ci0gICAgICBvd25lciA9IG51bGxwdHI7Ci0gICAgfQotCi0gICAgLyogZnJvbSBmckZpZwotICAgICAqIGdldEJCb3gKLSAgICAgKiBtb3ZlCi0gICAgICogb3ZlcmxhcHMKLSAgICAgKi8KLQotICAgIHZvaWQgZ2V0QkJveCAoZnJCb3ggJmJveEluKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICBhdXRvICZsYXllcjFGaWdzID0gdmlhRGVmLT5nZXRMYXllcjFGaWdzKCk7Ci0gICAgICBhdXRvICZsYXllcjJGaWdzID0gdmlhRGVmLT5nZXRMYXllcjJGaWdzKCk7Ci0gICAgICBhdXRvICZjdXRGaWdzICAgID0gdmlhRGVmLT5nZXRDdXRGaWdzKCk7Ci0gICAgICBib29sIGlzRmlyc3QgPSB0cnVlOwotICAgICAgZnJCb3ggYm94OwotICAgICAgZnJDb29yZCB4bCA9IDA7Ci0gICAgICBmckNvb3JkIHlsID0gMDsKLSAgICAgIGZyQ29vcmQgeGggPSAwOwotICAgICAgZnJDb29yZCB5aCA9IDA7Ci0gICAgICBmb3IgKGF1dG8gJmZpZzogbGF5ZXIxRmlncykgewotICAgICAgICBmaWctPmdldEJCb3goYm94KTsKLSAgICAgICAgaWYgKGlzRmlyc3QpIHsKLSAgICAgICAgICB4bCA9IGJveC5sZWZ0KCk7Ci0gICAgICAgICAgeWwgPSBib3guYm90dG9tKCk7Ci0gICAgICAgICAgeGggPSBib3gucmlnaHQoKTsKLSAgICAgICAgICB5aCA9IGJveC50b3AoKTsKLSAgICAgICAgICBpc0ZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgeGwgPSBzdGQ6Om1pbih4bCwgYm94LmxlZnQoKSk7Ci0gICAgICAgICAgeWwgPSBzdGQ6Om1pbih5bCwgYm94LmJvdHRvbSgpKTsKLSAgICAgICAgICB4aCA9IHN0ZDo6bWF4KHhoLCBib3gucmlnaHQoKSk7Ci0gICAgICAgICAgeWggPSBzdGQ6Om1heCh5aCwgYm94LnRvcCgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZm9yIChhdXRvICZmaWc6IGxheWVyMkZpZ3MpIHsKLSAgICAgICAgZmlnLT5nZXRCQm94KGJveCk7Ci0gICAgICAgIGlmIChpc0ZpcnN0KSB7Ci0gICAgICAgICAgeGwgPSBib3gubGVmdCgpOwotICAgICAgICAgIHlsID0gYm94LmJvdHRvbSgpOwotICAgICAgICAgIHhoID0gYm94LnJpZ2h0KCk7Ci0gICAgICAgICAgeWggPSBib3gudG9wKCk7Ci0gICAgICAgICAgaXNGaXJzdCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHhsID0gc3RkOjptaW4oeGwsIGJveC5sZWZ0KCkpOwotICAgICAgICAgIHlsID0gc3RkOjptaW4oeWwsIGJveC5ib3R0b20oKSk7Ci0gICAgICAgICAgeGggPSBzdGQ6Om1heCh4aCwgYm94LnJpZ2h0KCkpOwotICAgICAgICAgIHloID0gc3RkOjptYXgoeWgsIGJveC50b3AoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGZvciAoYXV0byAmZmlnOiBjdXRGaWdzKSB7Ci0gICAgICAgIGZpZy0+Z2V0QkJveChib3gpOwotICAgICAgICBpZiAoaXNGaXJzdCkgewotICAgICAgICAgIHhsID0gYm94LmxlZnQoKTsKLSAgICAgICAgICB5bCA9IGJveC5ib3R0b20oKTsKLSAgICAgICAgICB4aCA9IGJveC5yaWdodCgpOwotICAgICAgICAgIHloID0gYm94LnRvcCgpOwotICAgICAgICAgIGlzRmlyc3QgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB4bCA9IHN0ZDo6bWluKHhsLCBib3gubGVmdCgpKTsKLSAgICAgICAgICB5bCA9IHN0ZDo6bWluKHlsLCBib3guYm90dG9tKCkpOwotICAgICAgICAgIHhoID0gc3RkOjptYXgoeGgsIGJveC5yaWdodCgpKTsKLSAgICAgICAgICB5aCA9IHN0ZDo6bWF4KHloLCBib3gudG9wKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBib3hJbi5zZXQoeGwseWwseGgseWgpOwotICAgICAgZnJUcmFuc2Zvcm0geGZvcm07Ci0gICAgICB4Zm9ybS5zZXQob3JpZ2luKTsKLSAgICAgIC8vY291dCA8PCJvcmlnaW4gIiA8PG9yaWdpbi54KCkgPDwiICIgPDxvcmlnaW4ueSgpIDw8ZW5kbDsKLSAgICAgIGJveEluLnRyYW5zZm9ybSh4Zm9ybSk7Ci0gICAgfQotICAgIHZvaWQgbW92ZShjb25zdCBmclRyYW5zZm9ybSAmeGZvcm0pIG92ZXJyaWRlIHsKLSAgICAgIDsKLSAgICB9Ci0gICAgYm9vbCBvdmVybGFwcyhjb25zdCBmckJveCAmYm94KSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHZvaWQgc2V0SXRlcihmckxpc3RJdGVyPHN0ZDo6dW5pcXVlX3B0cjxmclZpYT4gPiYgaW4pIHsKLSAgICAgIGl0ZXIgPSBpbjsKLSAgICB9Ci0gICAgZnJMaXN0SXRlcjxzdGQ6OnVuaXF1ZV9wdHI8ZnJWaWE+ID4gZ2V0SXRlcigpIGNvbnN0IHsKLSAgICAgIHJldHVybiBpdGVyOwotICAgIH0KLQotICAgIC8vZnJpZW5kIHZvaWQgY29weVJlZnJlc2goc3RkOjpzaGFyZWRfcHRyPGZySW5zdD4gJmluc3RJbik7Ci0gIHByb3RlY3RlZDoKLSAgICBmclBvaW50ICAgICAgICBvcmlnaW47Ci0gICAgZnJWaWFEZWYqICAgICAgdmlhRGVmOwotICAgIGZyQmxvY2tPYmplY3QqIG93bmVyOwotICAgIGZyTGlzdEl0ZXI8c3RkOjp1bmlxdWVfcHRyPGZyVmlhPiA+IGl0ZXI7Ci0gIH07Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvdGFPYmovTWFrZWZpbGUgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi90YU9iai9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFkYTk0Ni4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi90YU9iai9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMgc3ViZGlyIGFuZCBvYmplY3RzIGluIGN1cnJlbnQgZGlyCi1TVUJESVJTCT0gCi1PQkpFQ1RTCT0gdGFTaGFwZS5vIHRhVHJhY2subwotI09CSkVDVFMJPSAKLQotCi1hbGw6c3ViZGlycyAke09CSkVDVFN9Ci0KLQkKLWNsZWFuOmNsZWFuc3ViZGlycwotCXJtIC1mICR7T0JKRUNUU30KLQkKLWluY2x1ZGUgJHtNQUtFSU5DTFVERX0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL3RhT2JqL3RhQmxvY2tPYmplY3QuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL3RhT2JqL3RhQmxvY2tPYmplY3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI3OGM3Yi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi90YU9iai90YUJsb2NrT2JqZWN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIF9UQV9CTE9DS09CSkVDVF9IXwotI2RlZmluZSBfVEFfQkxPQ0tPQkpFQ1RfSF8KLQotI2luY2x1ZGUgImZyQmFzZVR5cGVzLmgiCi0jaW5jbHVkZSAiZGIvb2JqL2ZyQmxvY2tPYmplY3QuaCIKLQotbmFtZXNwYWNlIGZyIHsKLSAgY2xhc3MgdGFCbG9ja09iamVjdDogcHVibGljIGZyQmxvY2tPYmplY3QgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3JzCi0gICAgdGFCbG9ja09iamVjdCgpIHt9Ci0gICAgdGFCbG9ja09iamVjdChjb25zdCB0YUJsb2NrT2JqZWN0ICZpbik6IGZyQmxvY2tPYmplY3QoaW4pIHt9Ci0gICAgdmlydHVhbCB+dGFCbG9ja09iamVjdCgpIHt9Ci0gICAgLy8gZ2V0dGVycwotICAgIC8vIHNldHRlcnMKLSAgICAvLyBvdGhlcnMKLSAgICBmckJsb2NrT2JqZWN0RW51bSB0eXBlSWQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gdGFjQmxvY2tPYmplY3Q7Ci0gICAgfQotICBwcm90ZWN0ZWQ6Ci0KLSAgfTsKLX0KLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL3RhT2JqL3RhRmlnLmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi90YU9iai90YUZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWNjZmM3Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL3RhT2JqL3RhRmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyogQXV0aG9yczogTHV0b25nIFdhbmcgYW5kIEJhbmdxaSBYdSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBfVEFfRklHX0hfCi0jZGVmaW5lIF9UQV9GSUdfSF8KLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlICJkYi90YU9iai90YUJsb2NrT2JqZWN0LmgiCi0jaW5jbHVkZSAiZGIvaW5mcmEvZnJCb3guaCIKLSNpbmNsdWRlICJkYi9pbmZyYS9mclRyYW5zZm9ybS5oIgotCi1uYW1lc3BhY2UgZnIgewotICBjbGFzcyB0YUZpZzogcHVibGljIHRhQmxvY2tPYmplY3QgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3JzCi0gICAgdGFGaWcoKTogdGFCbG9ja09iamVjdCgpIHt9Ci0gICAgLy8gZ2V0dGVycwotICAgIHZpcnR1YWwgdm9pZCBnZXRCQm94KGZyQm94ICZib3gpIGNvbnN0ID0gMDsKLSAgICAvL3ZpcnR1YWwgdm9pZCBnZXRCQm94KGJveF90ICZib3gpIGNvbnN0ID0gMDsKLSAgICAvLyBzZXR0ZXJzCi0gICAgLy8gb3RoZXJzCi0gICAgLy9mckJsb2NrT2JqZWN0RW51bSB0eXBlSWQoKSBjb25zdCBvdmVycmlkZSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIG1vdmUoY29uc3QgZnJUcmFuc2Zvcm0gJnhmb3JtKSA9IDA7Ci0gICAgdmlydHVhbCBib29sIG92ZXJsYXBzKGNvbnN0IGZyQm94ICZib3gpIGNvbnN0ID0gMDsKLSAgcHJvdGVjdGVkOgotICB9OwotCi0gIGNsYXNzIGZyTmV0OwotICBjbGFzcyB0YUNvbm5GaWc6IHB1YmxpYyB0YUZpZyB7Ci0gIHB1YmxpYzoKLSAgICAvLyBjb25zdHJ1Y3RvcnMKLSAgICB0YUNvbm5GaWcoKTogdGFGaWcoKSB7fQotICAgIC8vIGdldHRlcnMKLSAgICB2aXJ0dWFsIGJvb2wgaGFzTmV0KCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgZnJOZXQqIGdldE5ldCgpIGNvbnN0ID0gMDsKLSAgICAvLyBzZXR0ZXJzCi0gICAgdmlydHVhbCB2b2lkIGFkZFRvTmV0KGZyTmV0KiBpbikgPSAwOwotICAgIHZpcnR1YWwgdm9pZCByZW1vdmVGcm9tTmV0KCkgPSAwOwotICAgIC8vIG90aGVycwotICAgIC8vZnJCbG9ja09iamVjdEVudW0gdHlwZUlkKCkgY29uc3Qgb3ZlcnJpZGUgPSAwOwotCi0gICAgLyogZnJvbSBmckZpZwotICAgICAqIGdldEJCb3gKLSAgICAgKiBtb3ZlCi0gICAgICogb3ZlcmxhcHMKLSAgICAgKi8KLSAgcHJvdGVjdGVkOgotICB9OwotCi0gIGNsYXNzIHRhUGluOwotICBjbGFzcyB0YVBpbkZpZzogcHVibGljIHRhQ29ubkZpZyB7Ci0gIHB1YmxpYzoKLSAgICB0YVBpbkZpZygpOiB0YUNvbm5GaWcoKSB7fQotICAgIC8vIGdldHRlcnMKLSAgICB2aXJ0dWFsIGJvb2wgaGFzUGluKCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgdGFQaW4qIGdldFBpbigpIGNvbnN0ID0gMDsKLSAgICAvLyBzZXR0ZXJzCi0gICAgdmlydHVhbCB2b2lkIGFkZFRvUGluKHRhUGluKiBpbikgPSAwOwotICAgIHZpcnR1YWwgdm9pZCByZW1vdmVGcm9tUGluKCkgPSAwOwotICAgIC8vIG90aGVycwotICAgIC8vZnJCbG9ja09iamVjdEVudW0gdHlwZUlkKCkgY29uc3Qgb3ZlcnJpZGUgPSAwOwotCi0gICAgLyogZnJvbSBmckNvbm5GaWcKLSAgICAgKiBoYXNOZXQKLSAgICAgKiBnZXROZXQKLSAgICAgKiBhZGRUb05ldAotICAgICAqIHJlbW92ZUZyb21OZXQKLSAgICAgKi8KLQotICAgIC8qIGZyb20gZnJGaWcKLSAgICAgKiBnZXRCQm94Ci0gICAgICogbW92ZQotICAgICAqIG92ZXJsYXBzCi0gICAgICovCi0gIHByb3RlY3RlZDoKLSAgfTsKLQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL3RhT2JqL3RhUGluLmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi90YU9iai90YVBpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDRhZGY1Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL3RhT2JqL3RhUGluLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyogQXV0aG9yczogTHV0b25nIFdhbmcgYW5kIEJhbmdxaSBYdSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBfVEFfUElOX0hfCi0jZGVmaW5lIF9UQV9QSU5fSF8KLQotI2luY2x1ZGUgImRiL3RhT2JqL3RhQmxvY2tPYmplY3QuaCIKLS8vI2luY2x1ZGUgImRiL3RhT2JqL3RhRmlnLmgiCi0jaW5jbHVkZSAiZGIvdGFPYmovdGFTaGFwZS5oIgotI2luY2x1ZGUgImRiL3RhT2JqL3RhVmlhLmgiCi0KLW5hbWVzcGFjZSBmcnsKLSAgLy9jbGFzcyB0YVRyYWNrOwotICBjbGFzcyBmckd1aWRlOwotICAvL2NsYXNzIGZyTmV0OwotICBjbGFzcyB0YVBpbjogcHVibGljIHRhQmxvY2tPYmplY3QgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3JzCi0gICAgLy90YVBpbigpOiBiZWdpbigwKSwgZW5kKDApLCB0cmFja0lkeCgwKSwgd2xlbl9oZWxwZXIoMCksIG5ickJlZ2luKDApLCBuYnJFbmQoMCksCi0gICAgLy8gICAgICAgICBkb3duVmlhQ29vcmRzKCksIHVwVmlhQ29vcmRzKCksIGd1aWRlKG51bGxwdHIpLCBjb3N0KDApIHt9Ci0gICAgLy90YVBpbihjb25zdCB0YUlyb3V0ZSAmaW4pOiB0YUJsb2NrT2JqZWN0KGluKSwgYmVnaW4oaW4uYmVnaW4pLCBlbmQoaW4uZW5kKSwgdHJhY2tJZHgoaW4udHJhY2tJZHgpLCAKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdsZW5faGVscGVyKGluLndsZW5faGVscGVyKSwgbmJyQmVnaW4oaW4ubmJyQmVnaW4pLCBuYnJFbmQoaW4ubmJyRW5kKSwKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25WaWFDb29yZHMoaW4uZG93blZpYUNvb3JkcyksIHVwVmlhQ29vcmRzKGluLnVwVmlhQ29vcmRzKSwgZ3VpZGUoaW4uZ3VpZGUpLAotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdCgwKSB7fQotICAgIHRhUGluKCk6IHRhQmxvY2tPYmplY3QoKSwgZ3VpZGUobnVsbHB0ciksIHBpbkZpZ3MoKSwgd2xlbl9oZWxwZXIoMCksIHBpbihmYWxzZSksIHdsZW5faGVscGVyMigwKSwgY29zdCgwKSwgbnVtQXNzaWduZWQoMCkvKiwgZHJjQ29zdCgwKSovIHt9Ci0gICAgLy8gZ2V0dGVycwotICAgIC8vdm9pZCBnZXRDb29yZHMoZnJDb29yZCAmYnAsIGZyQ29vcmQgJmVwKSBjb25zdCB7Ci0gICAgLy8gIGJwID0gYmVnaW47Ci0gICAgLy8gIGVwID0gZW5kOwotICAgIC8vfQotICAgIC8vdm9pZCBnZXROYnJDb29yZHMoZnJDb29yZCAmYnAsIGZyQ29vcmQgJmVwKSBjb25zdCB7Ci0gICAgLy8gIGJwID0gbmJyQmVnaW47Ci0gICAgLy8gIGVwID0gbmJyRW5kOwotICAgIC8vfQotICAgIC8vdGFUcmFjayogZ2V0VHJhY2soKSBjb25zdCB7Ci0gICAgLy8gIHJldHVybiB0cmFjazsKLSAgICAvL30KLSAgICAvL2ludCBnZXRUcmFja0lkeCgpIGNvbnN0IHsKLSAgICAvLyAgcmV0dXJuIHRyYWNrSWR4OwotICAgIC8vfQotICAgIGludCBnZXRXbGVuSGVscGVyKCkgY29uc3QgewotICAgICAgcmV0dXJuIHdsZW5faGVscGVyOwotICAgIH0KLSAgICBib29sIGhhc1dsZW5IZWxwZXIyKCkgY29uc3QgewotICAgICAgcmV0dXJuIHBpbjsKLSAgICB9Ci0gICAgaW50IGdldFdsZW5IZWxwZXIyKCkgY29uc3QgewotICAgICAgcmV0dXJuIHdsZW5faGVscGVyMjsKLSAgICB9Ci0gICAgLy9jb25zdCBzdGQ6OnZlY3RvcjxmckNvb3JkPiYgZ2V0VmlhQ29vcmRzKGJvb2wgaXNVcFZpYSkgY29uc3QgewotICAgIC8vICByZXR1cm4gaXNVcFZpYSA/IHVwVmlhQ29vcmRzIDogZG93blZpYUNvb3JkczsKLSAgICAvL30KLSAgICAvL3N0ZDo6dmVjdG9yPGZyQ29vcmQ+JiBnZXRWaWFDb29yZHMoYm9vbCBpc1VwVmlhKSB7Ci0gICAgLy8gIHJldHVybiBpc1VwVmlhID8gdXBWaWFDb29yZHMgOiBkb3duVmlhQ29vcmRzOwotICAgIC8vfQotICAgIGZyR3VpZGUqIGdldEd1aWRlKCkgY29uc3QgewotICAgICAgcmV0dXJuIGd1aWRlOwotICAgIH0KLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8dGFQaW5GaWc+ID4mIGdldEZpZ3MoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gcGluRmlnczsKLSAgICB9Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPHRhUGluRmlnPiA+JiBnZXRGaWdzKCkgewotICAgICAgcmV0dXJuIHBpbkZpZ3M7Ci0gICAgfQotICAgIGZyQ29zdCBnZXRDb3N0KCkgY29uc3QgewotICAgICAgcmV0dXJuIGNvc3Q7Ci0gICAgfQotICAgIGludCBnZXROdW1Bc3NpZ25lZCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBudW1Bc3NpZ25lZDsKLSAgICB9Ci0gICAgLy9mckNvc3QgZ2V0RHJjQ29zdCgpIGNvbnN0IHsKLSAgICAvLyAgcmV0dXJuIGRyY0Nvc3Q7Ci0gICAgLy99Ci0gICAgLy8gc2V0dGVycwotICAgIC8vdm9pZCBzZXRDb29yZHMoZnJDb29yZCBicCwgZnJDb29yZCBlcCkgewotICAgIC8vICBiZWdpbiA9IGJwOwotICAgIC8vICBlbmQgPSBlcDsKLSAgICAvL30KLSAgICAvL3ZvaWQgc2V0TmJyQ29vcmRzKGZyQ29vcmQgYnAsIGZyQ29vcmQgZXApIHsKLSAgICAvLyAgbmJyQmVnaW4gPSBicDsKLSAgICAvLyAgbmJyRW5kID0gZXA7Ci0gICAgLy99Ci0gICAgLy92b2lkIHNldFRyYWNrKHRhVHJhY2sgKmluKSB7Ci0gICAgLy8gIHRyYWNrID0gaW47Ci0gICAgLy99Ci0gICAgLy92b2lkIHNldFRyYWNrSWR4KGludCBpbikgewotICAgIC8vICB0cmFja0lkeCA9IGluOwotICAgIC8vfQotICAgIHZvaWQgc2V0V2xlbkhlbHBlcihpbnQgaW4pIHsKLSAgICAgIHdsZW5faGVscGVyID0gaW47Ci0gICAgfQotICAgIHZvaWQgc2V0V2xlbkhlbHBlcjIoZnJDb29yZCBpbikgewotICAgICAgcGluID0gdHJ1ZTsKLSAgICAgIHdsZW5faGVscGVyMiA9IGluOwotICAgIH0KLSAgICAvL3ZvaWQgYWRkVmlhQ29vcmRzKGZyQ29vcmQgaW4sIGJvb2wgaXNVcFZpYSkgewotICAgIC8vICBpZiAoaXNVcFZpYSkgewotICAgIC8vICAgIHVwVmlhQ29vcmRzLnB1c2hfYmFjayhpbik7Ci0gICAgLy8gIH0gZWxzZSB7Ci0gICAgLy8gICAgZG93blZpYUNvb3Jkcy5wdXNoX2JhY2soaW4pOwotICAgIC8vICB9Ci0gICAgLy99Ci0gICAgdm9pZCBzZXRHdWlkZShmckd1aWRlKiBpbikgewotICAgICAgZ3VpZGUgPSBpbjsKLSAgICB9Ci0gICAgdm9pZCBhZGRQaW5GaWcoc3RkOjp1bmlxdWVfcHRyPHRhUGluRmlnPiAmaW4pIHsKLSAgICAgIGluLT5hZGRUb1Bpbih0aGlzKTsKLSAgICAgIHBpbkZpZ3MucHVzaF9iYWNrKHN0ZDo6bW92ZShpbikpOwotICAgIH0KLSAgICB2b2lkIHNldENvc3QoZnJDb3N0IGluKSB7Ci0gICAgICBjb3N0ID0gaW47Ci0gICAgfQotICAgIHZvaWQgYWRkQ29zdChmckNvc3QgaW4pIHsKLSAgICAgIGNvc3QgKz0gaW47Ci0gICAgfQotICAgIHZvaWQgYWRkTnVtQXNzaWduZWQoKSB7Ci0gICAgICBudW1Bc3NpZ25lZCsrOwotICAgIH0KLSAgICAvL3ZvaWQgc2V0RHJjQ29zdChmckNvc3QgaW4pIHsKLSAgICAvLyAgZHJjQ29zdCA9IGluOwotICAgIC8vfQotICAgIC8vIG90aGVycwotICAgIGZyQmxvY2tPYmplY3RFbnVtIHR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiB0YWNQaW47Ci0gICAgfQotICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IHRhUGluICZiKSBjb25zdCB7Ci0gICAgICBpZiAodGhpcy0+Y29zdCAhPSBiLmNvc3QpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMtPmdldENvc3QoKSA+IGIuZ2V0Q29zdCgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHRoaXMtPmdldElkKCkgPCBiLmdldElkKCk7Ci0gICAgICB9Ci0gICAgfQotICBwcm90ZWN0ZWQ6Ci0gICAgLy9mckNvb3JkICAgICAgICAgICAgICAgIGJlZ2luLCBlbmQ7Ci0gICAgLy9pbnQgICAgICAgICAgICAgICAgICAgIHRyYWNrSWR4OwotICAgIC8vZnJDb29yZCAgICAgICAgICAgICAgICBuYnJCZWdpbiwgbmJyRW5kOyAvLyBmb3IgbmJyIGxvY2FsIGd1aWRlcwotICAgIC8vc3RkOjp2ZWN0b3I8ZnJDb29yZD4gICBkb3duVmlhQ29vcmRzOwotICAgIC8vc3RkOjp2ZWN0b3I8ZnJDb29yZD4gICB1cFZpYUNvb3JkczsKLSAgICBmckd1aWRlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGU7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPHRhUGluRmlnPiA+IHBpbkZpZ3M7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdsZW5faGVscGVyOyAvLyBmb3IgbmJyIGdsb2JhbCBndWlkZXMKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGluOwotICAgIGZyQ29vcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bGVuX2hlbHBlcjI7IC8vIGZvciBsb2NhbCBndWlkZXMgYW5kIHBpbiBndWlkZXMKLSAgICBmckNvc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdDsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtQXNzaWduZWQ7Ci0gICAgLy9mckNvc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJjQ29zdDsKLSAgfTsKLSAgc3RydWN0IHRhUGluQ29tcCB7Ci0gICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHRhUGluKiBsaHMsIGNvbnN0IHRhUGluKiByaHMpIGNvbnN0IHsKLSAgICAgIHJldHVybiAqbGhzIDwgKnJoczsKLSAgICB9Ci0gIH07Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL3RhT2JqL3RhU2hhcGUuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvdGFPYmovdGFTaGFwZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZjZiOGIuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvdGFPYmovdGFTaGFwZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiZGIvdGFPYmovdGFTaGFwZS5oIgotI2luY2x1ZGUgImRiL29iai9mclNoYXBlLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgZnI7Ci0KLXRhUGF0aFNlZzo6dGFQYXRoU2VnKGNvbnN0IGZyUGF0aFNlZyAmaW4pIHsKLSAgaW4uZ2V0UG9pbnRzKGJlZ2luLCBlbmQpOwotICBsYXllciA9IGluLmdldExheWVyTnVtKCk7Ci0gIGluLmdldFN0eWxlKHN0eWxlKTsKLSAgb3duZXIgPSBudWxscHRyOwotfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvdGFPYmovdGFTaGFwZS5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvdGFPYmovdGFTaGFwZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDVlMzhjLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL3RhT2JqL3RhU2hhcGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIF9UQV9TSEFQRV9IXwotI2RlZmluZSBfVEFfU0hBUEVfSF8KLQotI2luY2x1ZGUgImRiL3RhT2JqL3RhRmlnLmgiCi0jaW5jbHVkZSAiZGIvaW5mcmEvZnJTZWdTdHlsZS5oIgotCi0KLW5hbWVzcGFjZSBmciB7Ci0gIGNsYXNzIGZyTmV0OwotICBjbGFzcyB0YVBpbjsKLSAgY2xhc3MgZnJQYXRoU2VnOwotICBjbGFzcyB0YVNoYXBlOiBwdWJsaWMgdGFQaW5GaWcgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3JzCi0gICAgdGFTaGFwZSgpOiB0YVBpbkZpZygpIHt9Ci0gICAgLy8gc2V0dGVycwotICAgIHZpcnR1YWwgdm9pZCBzZXRMYXllck51bSAoZnJMYXllck51bSB0bXBMYXllck51bSkgPSAwOwotICAgIC8vIGdldHRlcnMKLSAgICB2aXJ0dWFsIGZyTGF5ZXJOdW0gZ2V0TGF5ZXJOdW0oKSBjb25zdCA9IDA7Ci0gICAgLy8gb3RoZXJzCi0gICAgLy9mckJsb2NrT2JqZWN0RW51bSB0eXBlSWQoKSBjb25zdCBvdmVycmlkZSA9IDA7Ci0KLSAgICAvKiBmcm9tIGZyUGluRmlnCi0gICAgICogaGFzUGluCi0gICAgICogZ2V0UGluCi0gICAgICogYWRkVG9QaW4KLSAgICAgKiByZW1vdmVGcm9tUGluCi0gICAgICovCi0KLSAgICAvKiBmcm9tIGZyQ29ubkZpZwotICAgICAqIGhhc05ldAotICAgICAqIGdldE5ldAotICAgICAqIGFkZFRvTmV0Ci0gICAgICogcmVtb3ZlRnJvbU5ldAotICAgICAqLwotCi0gICAgLyogZnJvbSBmckZpZwotICAgICAqIGdldEJCb3gKLSAgICAgKiBtb3ZlCi0gICAgICogb3ZlcmxhcHMKLSAgICAgKi8KLSAgcHJvdGVjdGVkOgotICB9OwotCi0gIGNsYXNzIHRhUGF0aFNlZzogcHVibGljIHRhU2hhcGUgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3JzCi0gICAgdGFQYXRoU2VnKCk6IHRhU2hhcGUoKSwgYmVnaW4oKSwgZW5kKCksIGxheWVyKDApLCBzdHlsZSgpLCBvd25lcihudWxscHRyKSB7fQotICAgIHRhUGF0aFNlZyhjb25zdCB0YVBhdGhTZWcgJmluKTogYmVnaW4oaW4uYmVnaW4pLCBlbmQoaW4uZW5kKSwgbGF5ZXIoaW4ubGF5ZXIpLCBzdHlsZShpbi5zdHlsZSksIG93bmVyKGluLm93bmVyKSB7fQotICAgIHRhUGF0aFNlZyhjb25zdCBmclBhdGhTZWcgJmluKTsKLSAgICAvLyBnZXR0ZXJzCi0gICAgdm9pZCBnZXRQb2ludHMoZnJQb2ludCAmYmVnaW5JbiwgZnJQb2ludCAmZW5kSW4pIGNvbnN0IHsKLSAgICAgIGJlZ2luSW4uc2V0KGJlZ2luKTsKLSAgICAgIGVuZEluLnNldChlbmQpOwotICAgIH0KLSAgICB2b2lkIGdldFN0eWxlKGZyU2VnU3R5bGUgJnN0eWxlSW4pIGNvbnN0IHsKLSAgICAgIHN0eWxlSW4uc2V0QmVnaW5TdHlsZShzdHlsZS5nZXRCZWdpblN0eWxlKCksIHN0eWxlLmdldEJlZ2luRXh0KCkpOwotICAgICAgc3R5bGVJbi5zZXRFbmRTdHlsZShzdHlsZS5nZXRFbmRTdHlsZSgpLCBzdHlsZS5nZXRFbmRFeHQoKSk7Ci0gICAgICBzdHlsZUluLnNldFdpZHRoKHN0eWxlLmdldFdpZHRoKCkpOwotICAgIH0KLSAgICAvLyBzZXR0ZXJzCi0gICAgdm9pZCBzZXRQb2ludHMoY29uc3QgZnJQb2ludCAmYmVnaW5JbiwgY29uc3QgZnJQb2ludCAmZW5kSW4pIHsKLSAgICAgIGJlZ2luLnNldChiZWdpbkluKTsKLSAgICAgIGVuZC5zZXQoZW5kSW4pOwotICAgIH0KLSAgICB2b2lkIHNldFN0eWxlKGNvbnN0IGZyU2VnU3R5bGUgJnN0eWxlSW4pIHsKLSAgICAgIHN0eWxlLnNldEJlZ2luU3R5bGUoc3R5bGVJbi5nZXRCZWdpblN0eWxlKCksIHN0eWxlSW4uZ2V0QmVnaW5FeHQoKSk7Ci0gICAgICBzdHlsZS5zZXRFbmRTdHlsZShzdHlsZUluLmdldEVuZFN0eWxlKCksIHN0eWxlSW4uZ2V0RW5kRXh0KCkpOwotICAgICAgc3R5bGUuc2V0V2lkdGgoc3R5bGVJbi5nZXRXaWR0aCgpKTsKLSAgICB9Ci0gICAgLy8gb3RoZXJzCi0gICAgZnJCbG9ja09iamVjdEVudW0gdHlwZUlkKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIHRhY1BhdGhTZWc7Ci0gICAgfQotCi0gICAgLyogZnJvbSBmclNoYXBlCi0gICAgICogc2V0TGF5ZXJOdW0KLSAgICAgKiBnZXRMYXllck51bQotICAgICAqLwotICAgIHZvaWQgc2V0TGF5ZXJOdW0gKGZyTGF5ZXJOdW0gbnVtSW4pIG92ZXJyaWRlIHsKLSAgICAgIGxheWVyID0gbnVtSW47Ci0gICAgfQotICAgIGZyTGF5ZXJOdW0gZ2V0TGF5ZXJOdW0oKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gbGF5ZXI7Ci0gICAgfQotICAgIAotICAgIC8qIGZyb20gZnJQaW5GaWcKLSAgICAgKiBoYXNQaW4KLSAgICAgKiBnZXRQaW4KLSAgICAgKiBhZGRUb1BpbgotICAgICAqIHJlbW92ZUZyb21QaW4KLSAgICAgKi8KLSAgICBib29sIGhhc1BpbigpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiAob3duZXIpICYmIChvd25lci0+dHlwZUlkKCkgPT0gdGFjUGluKTsKLSAgICB9Ci0gICAgCi0gICAgdGFQaW4qIGdldFBpbigpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHRhUGluKj4ob3duZXIpOwotICAgIH0KLSAgICAKLSAgICB2b2lkIGFkZFRvUGluKHRhUGluKiBpbikgb3ZlcnJpZGUgewotICAgICAgb3duZXIgPSByZWludGVycHJldF9jYXN0PGZyQmxvY2tPYmplY3QqPihpbik7Ci0gICAgfQotICAgIAotICAgIHZvaWQgcmVtb3ZlRnJvbVBpbigpIG92ZXJyaWRlIHsKLSAgICAgIG93bmVyID0gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICAvKiBmcm9tIGZyQ29ubkZpZwotICAgICAqIGhhc05ldAotICAgICAqIGdldE5ldAotICAgICAqIGFkZFRvTmV0Ci0gICAgICogcmVtb3ZlRnJvbU5ldAotICAgICAqLwotICAgIGJvb2wgaGFzTmV0KCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIChvd25lcikgJiYgKG93bmVyLT50eXBlSWQoKSA9PSBmcmNOZXQpOwotICAgIH0KLSAgICAKLSAgICBmck5ldCogZ2V0TmV0KCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8ZnJOZXQqPihvd25lcik7Ci0gICAgfQotICAgIAotICAgIHZvaWQgYWRkVG9OZXQoZnJOZXQqIGluKSBvdmVycmlkZSB7Ci0gICAgICBvd25lciA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZnJCbG9ja09iamVjdCo+KGluKTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCByZW1vdmVGcm9tTmV0KCkgb3ZlcnJpZGUgewotICAgICAgb3duZXIgPSBudWxscHRyOwotICAgIH0KLQotICAgIC8qIGZyb20gZnJGaWcKLSAgICAgKiBnZXRCQm94Ci0gICAgICogbW92ZSwgaW4gLmNwcAotICAgICAqIG92ZXJsYXBzLCBpbiAuY3BwCi0gICAgICovCi0gICAgLy8gbmVlZHMgdG8gYmUgdXBkYXRlZAotICAgIHZvaWQgZ2V0QkJveCAoZnJCb3ggJmJveEluKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICBib29sIGlzSG9yaXpvbnRhbCA9IHRydWU7Ci0gICAgICBpZiAoYmVnaW4ueCgpID09IGVuZC54KCkpIHsKLSAgICAgICAgaXNIb3Jpem9udGFsID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBhdXRvIHdpZHRoICAgID0gc3R5bGUuZ2V0V2lkdGgoKTsKLSAgICAgIGF1dG8gYmVnaW5FeHQgPSBzdHlsZS5nZXRCZWdpbkV4dCgpOwotICAgICAgYXV0byBlbmRFeHQgICA9IHN0eWxlLmdldEVuZEV4dCgpOwotICAgICAgaWYgKGlzSG9yaXpvbnRhbCkgewotICAgICAgICBib3hJbi5zZXQoYmVnaW4ueCgpIC0gYmVnaW5FeHQsIGJlZ2luLnkoKSAtIHdpZHRoIC8gMiwKLSAgICAgICAgICAgICAgICAgIGVuZC54KCkgICArIGVuZEV4dCwgICBlbmQueSgpICAgKyB3aWR0aCAvIDIpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYm94SW4uc2V0KGJlZ2luLngoKSAtIHdpZHRoIC8gMiwgYmVnaW4ueSgpIC0gYmVnaW5FeHQsCi0gICAgICAgICAgICAgICAgICBlbmQueCgpICAgKyB3aWR0aCAvIDIsIGVuZC55KCkgICArIGVuZEV4dCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHZvaWQgbW92ZShjb25zdCBmclRyYW5zZm9ybSAmeGZvcm0pIG92ZXJyaWRlIHsKLSAgICAgIGJlZ2luLnRyYW5zZm9ybSh4Zm9ybSk7Ci0gICAgICBlbmQudHJhbnNmb3JtKHhmb3JtKTsKLSAgICB9Ci0gICAgYm9vbCBvdmVybGFwcyhjb25zdCBmckJveCAmYm94KSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBwcm90ZWN0ZWQ6Ci0gICAgZnJQb2ludCAgICAgICAgYmVnaW47IC8vIGJlZ2luIGFsd2F5cyBzbWFsbGVyIHRoYW4gZW5kLCBhc3N1bWVkCi0gICAgZnJQb2ludCAgICAgICAgZW5kOwotICAgIGZyTGF5ZXJOdW0gICAgIGxheWVyOwotICAgIGZyU2VnU3R5bGUgICAgIHN0eWxlOwotICAgIGZyQmxvY2tPYmplY3QqIG93bmVyOwotICB9OwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL3RhT2JqL3RhVHJhY2suY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvdGFPYmovdGFUcmFjay5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYmFkMmIuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvdGFPYmovdGFUcmFjay5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiZGIvdGFPYmovdGFUcmFjay5oIgotI2luY2x1ZGUgImRiL3RhT2JqL3RhRmlnLmgiCi0jaW5jbHVkZSAiZGIvdGFPYmovdGFQaW4uaCIKLSNpbmNsdWRlICJmckRlc2lnbi5oIgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIGZyOwotCi0vLyBmb3IgcGF0aHNlZywgcmV0dXJuIG92ZXJsYXBwZWQgbGVuZ3RoICogI292ZXJsYXBzIHBlciBpbnRlcnZhbAotLy8gZm9yIHZpYSwgcmV0dXJuICNvdmVybGFwcwotZnJVSW50NCB0YVRyYWNrOjpnZXRDb3N0KGZyQ29vcmQgeDEsIGZyQ29vcmQgeDIsIGludCB0eXBlLCB0YVBpbkZpZyogZmlnKSBjb25zdCB7Ci0gIGZyVUludDQgY29zdCA9IDA7Ci0gIGRlY2x0eXBlKGNvc3RQbGFuYXIuZXF1YWxfcmFuZ2UoYm9vc3Q6OmljbDo6aW50ZXJ2YWw8ZnJDb29yZD46OmNsb3NlZCh4MSx4MikpKSBpdFJlczsKLSAgc3dpdGNoKHR5cGUpIHsKLSAgICBjYXNlIDA6Ci0gICAgICBpdFJlcyA9IGNvc3RQbGFuYXIuZXF1YWxfcmFuZ2UoYm9vc3Q6OmljbDo6aW50ZXJ2YWw8ZnJDb29yZD46OmNsb3NlZCh4MSx4MikpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgaXRSZXMgPSBjb3N0VmlhMS5lcXVhbF9yYW5nZShib29zdDo6aWNsOjppbnRlcnZhbDxmckNvb3JkPjo6Y2xvc2VkKHgxLHgyKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBpdFJlcyA9IGNvc3RWaWEyLmVxdWFsX3JhbmdlKGJvb3N0OjppY2w6OmludGVydmFsPGZyQ29vcmQ+OjpjbG9zZWQoeDEseDIpKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICA7Ci0gIH0KLSAgZm9yIChhdXRvIGl0ID0gaXRSZXMuZmlyc3Q7IGl0ICE9IGl0UmVzLnNlY29uZDsgKytpdCkgewotICAgIGF1dG8gJmludHYgPSBpdC0+Zmlyc3Q7Ci0gICAgYXV0byAmb2JqUyA9IGl0LT5zZWNvbmQ7Ci0gICAgZnJVSW50NCB0bXBDb3N0ID0gMDsKLSAgICBmclVJbnQ0IGxlbiA9IG1heChpbnR2LnVwcGVyKCkgLSBpbnR2Lmxvd2VyKCksIDEpOwotICAgIGZvciAoYXV0byAmb2JqOiBvYmpTKSB7Ci0gICAgICBpZiAob2JqID09IG51bGxwdHIpIHsKLSAgICAgICAgdG1wQ29zdCsrOwotICAgICAgLy8gb25seSBhZGQgY29zdCBmb3IgZGlmZi1uZXQKLSAgICAgIH0gZWxzZSBpZiAob2JqLT50eXBlSWQoKSA9PSBmcmNOZXQpIHsKLSAgICAgICAgaWYgKGZpZy0+Z2V0UGluKCktPmdldEd1aWRlKCktPmdldE5ldCgpICE9IG9iaikgewotICAgICAgICAgIHRtcENvc3QrKzsKLSAgICAgICAgfQotICAgICAgLy8gdHdvIHRhT2JqcwotICAgICAgfSBlbHNlIGlmIChvYmotPnR5cGVJZCgpID09IHRhY1BhdGhTZWcgfHwgb2JqLT50eXBlSWQoKSA9PSB0YWNWaWEpIHsKLSAgICAgICAgYXV0byB0YU9iaiA9IHN0YXRpY19jYXN0PHRhUGluRmlnKj4ob2JqKTsKLSAgICAgICAgaWYgKGZpZy0+Z2V0UGluKCktPmdldEd1aWRlKCktPmdldE5ldCgpICE9IHRhT2JqLT5nZXRQaW4oKS0+Z2V0R3VpZGUoKS0+Z2V0TmV0KCkpIHsKLSAgICAgICAgICB0bXBDb3N0Kys7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiV2FybmluZzogdGFUcmFjazo6Z2V0Q29zdCB1bnN1cHBvcnRlZCB0eXBlIiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICAgIGNvc3QgKz0gdG1wQ29zdCAqIGxlbjsKLSAgfQotICByZXR1cm4gY29zdDsKLX0KLQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi90YU9iai90YVRyYWNrLmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi90YU9iai90YVRyYWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNzdiNTEuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvdGFPYmovdGFUcmFjay5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX1RBX1RSQUNLX0hfCi0jZGVmaW5lIF9UQV9UUkFDS19IXwotCi0jaW5jbHVkZSAiZGIvdGFPYmovdGFCbG9ja09iamVjdC5oIgotI2luY2x1ZGUgPGJvb3N0L2ljbC9pbnRlcnZhbF9tYXAuaHBwPgotCi1uYW1lc3BhY2UgZnJ7Ci0gIGNsYXNzIGZyVHJhY2tQYXR0ZXJuOwotICBjbGFzcyB0YVBpbkZpZzsKLSAgY2xhc3MgdGFUcmFjazogcHVibGljIHRhQmxvY2tPYmplY3QgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3JzCi0gICAgdGFUcmFjaygpOiB0cmFja0xvYygwKSwgcGxhbmFyKCksIHZpYTEoKSwgdmlhMigpLCBjb3N0UGxhbmFyKCksIGNvc3RWaWExKCksIGNvc3RWaWEyKCkge30KLSAgICAvLyBnZXR0ZXJzCi0gICAgZnJDb29yZCBnZXRUcmFja0xvYygpIGNvbnN0IHsKLSAgICAgIHJldHVybiB0cmFja0xvYzsKLSAgICB9Ci0gICAgZnJVSW50NCBnZXRDb3N0KGZyQ29vcmQgeDEsIGZyQ29vcmQgeDIsIGludCB0eXBlLCB0YVBpbkZpZyogZmlnKSBjb25zdDsKLSAgICAvLyBzZXR0ZXJzCi0gICAgdm9pZCBzZXRUcmFja0xvYyhmckNvb3JkIGxvYykgewotICAgICAgdHJhY2tMb2MgPSBsb2M7Ci0gICAgfQotICAgIC8vIHR5cGUgMC8xLzI6IHBsYW5hci9kb3duL3VwCi0gICAgdm9pZCBhZGRUb0ludHYodGFQaW5GaWcqIG9iaiwgZnJDb29yZCB4MSwgZnJDb29yZCB4MiwgaW50IHR5cGUpIHsKLSAgICAgIHN0ZDo6c2V0PHRhUGluRmlnKj4gdG1wUyB7b2JqfTsKLSAgICAgIHN3aXRjaCh0eXBlKSB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICBwbGFuYXIgKz0gc3RkOjptYWtlX3BhaXIoYm9vc3Q6OmljbDo6aW50ZXJ2YWw8ZnJDb29yZD46OmNsb3NlZCh4MSwgeDIpLCB0bXBTKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgIHZpYTEgICArPSBzdGQ6Om1ha2VfcGFpcihib29zdDo6aWNsOjppbnRlcnZhbDxmckNvb3JkPjo6Y2xvc2VkKHgxLCB4MiksIHRtcFMpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgdmlhMiAgICs9IHN0ZDo6bWFrZV9wYWlyKGJvb3N0OjppY2w6OmludGVydmFsPGZyQ29vcmQ+OjpjbG9zZWQoeDEsIHgyKSwgdG1wUyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgOwotICAgICAgfQotICAgIH0KLSAgICB2b2lkIHJlbW92ZUZyb21JbnR2KHRhUGluRmlnKiBvYmosIGZyQ29vcmQgeDEsIGZyQ29vcmQgeDIsIGludCB0eXBlKSB7Ci0gICAgICBzdGQ6OnNldDx0YVBpbkZpZyo+IHRtcFMge29ian07Ci0gICAgICBzd2l0Y2godHlwZSkgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgcGxhbmFyIC09IHN0ZDo6bWFrZV9wYWlyKGJvb3N0OjppY2w6OmludGVydmFsPGZyQ29vcmQ+OjpjbG9zZWQoeDEsIHgyKSwgdG1wUyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICB2aWExICAgLT0gc3RkOjptYWtlX3BhaXIoYm9vc3Q6OmljbDo6aW50ZXJ2YWw8ZnJDb29yZD46OmNsb3NlZCh4MSwgeDIpLCB0bXBTKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgIHZpYTIgICAtPSBzdGQ6Om1ha2VfcGFpcihib29zdDo6aWNsOjppbnRlcnZhbDxmckNvb3JkPjo6Y2xvc2VkKHgxLCB4MiksIHRtcFMpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIDsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gdHlwZSAwLzEvMjogcGxhbmFyL2Rvd24vdXAKLSAgICB2b2lkIGFkZFRvQ29zdChmckJsb2NrT2JqZWN0KiBvYmosIGZyQ29vcmQgeDEsIGZyQ29vcmQgeDIsIGludCB0eXBlKSB7Ci0gICAgICBzdGQ6OnNldDxmckJsb2NrT2JqZWN0Kj4gdG1wUyB7b2JqfTsKLSAgICAgIHN3aXRjaCh0eXBlKSB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICBjb3N0UGxhbmFyICs9IHN0ZDo6bWFrZV9wYWlyKGJvb3N0OjppY2w6OmludGVydmFsPGZyQ29vcmQ+OjpjbG9zZWQoeDEsIHgyKSwgdG1wUyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICBjb3N0VmlhMSAgICs9IHN0ZDo6bWFrZV9wYWlyKGJvb3N0OjppY2w6OmludGVydmFsPGZyQ29vcmQ+OjpjbG9zZWQoeDEsIHgyKSwgdG1wUyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICBjb3N0VmlhMiAgICs9IHN0ZDo6bWFrZV9wYWlyKGJvb3N0OjppY2w6OmludGVydmFsPGZyQ29vcmQ+OjpjbG9zZWQoeDEsIHgyKSwgdG1wUyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgOwotICAgICAgfQotICAgIH0KLSAgICB2b2lkIHJlbW92ZUZyb21Db3N0KGZyQmxvY2tPYmplY3QqIG9iaiwgZnJDb29yZCB4MSwgZnJDb29yZCB4MiwgaW50IHR5cGUpIHsKLSAgICAgIHN0ZDo6c2V0PGZyQmxvY2tPYmplY3QqPiB0bXBTIHtvYmp9OwotICAgICAgc3dpdGNoKHR5cGUpIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgIGNvc3RQbGFuYXIgLT0gc3RkOjptYWtlX3BhaXIoYm9vc3Q6OmljbDo6aW50ZXJ2YWw8ZnJDb29yZD46OmNsb3NlZCh4MSwgeDIpLCB0bXBTKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgIGNvc3RWaWExICAgLT0gc3RkOjptYWtlX3BhaXIoYm9vc3Q6OmljbDo6aW50ZXJ2YWw8ZnJDb29yZD46OmNsb3NlZCh4MSwgeDIpLCB0bXBTKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgIGNvc3RWaWEyICAgLT0gc3RkOjptYWtlX3BhaXIoYm9vc3Q6OmljbDo6aW50ZXJ2YWw8ZnJDb29yZD46OmNsb3NlZCh4MSwgeDIpLCB0bXBTKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICA7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIG90aGVycwotICAgIGZyQmxvY2tPYmplY3RFbnVtIHR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiB0YWNUcmFjazsKLSAgICB9Ci0gICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgdGFUcmFjayAmYikgY29uc3QgewotICAgICAgcmV0dXJuIHRyYWNrTG9jIDwgYi50cmFja0xvYzsKLSAgICB9Ci0gIHByb3RlY3RlZDoKLSAgICBmckNvb3JkIHRyYWNrTG9jOwotICAgIC8vIGludGVydmFscywgcHMgYnAtLT5lcCwgdmlhTG9jCi0gICAgYm9vc3Q6OmljbDo6aW50ZXJ2YWxfbWFwPGZyQ29vcmQsIHN0ZDo6c2V0PHRhUGluRmlnKj4gPiBwbGFuYXI7Ci0gICAgYm9vc3Q6OmljbDo6aW50ZXJ2YWxfbWFwPGZyQ29vcmQsIHN0ZDo6c2V0PHRhUGluRmlnKj4gPiB2aWExOyAvLyBkb3duIHZpYQotICAgIGJvb3N0OjppY2w6OmludGVydmFsX21hcDxmckNvb3JkLCBzdGQ6OnNldDx0YVBpbkZpZyo+ID4gdmlhMjsgLy8gdXAgdmlhCi0gICAgLy8gYmxvY2sgb3RoZXJzIGJwLCBlcCwgdmlhTG9jCi0gICAgYm9vc3Q6OmljbDo6aW50ZXJ2YWxfbWFwPGZyQ29vcmQsIHN0ZDo6c2V0PGZyQmxvY2tPYmplY3QqPiA+IGNvc3RQbGFuYXI7IC8vIGFsbCBjb3N0IHRvIG90aGVycwotICAgIGJvb3N0OjppY2w6OmludGVydmFsX21hcDxmckNvb3JkLCBzdGQ6OnNldDxmckJsb2NrT2JqZWN0Kj4gPiBjb3N0VmlhMTsgLy8gYWxsIGNvc3QgdG8gb3RoZXJzCi0gICAgYm9vc3Q6OmljbDo6aW50ZXJ2YWxfbWFwPGZyQ29vcmQsIHN0ZDo6c2V0PGZyQmxvY2tPYmplY3QqPiA+IGNvc3RWaWEyOyAvLyBhbGwgY29zdCB0byBvdGhlcnMKLSAgfTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvdGFPYmovdGFWaWEuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL3RhT2JqL3RhVmlhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOWJiZDguLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvdGFPYmovdGFWaWEuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwMCArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIF9UQV9WSUFfSF8KLSNkZWZpbmUgX1RBX1ZJQV9IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgImRiL3RhT2JqL3RhRmlnLmgiCi0jaW5jbHVkZSAiZGIvb2JqL2ZyU2hhcGUuaCIKLSNpbmNsdWRlICJkYi90ZWNoL2ZyVmlhRGVmLmgiCi0jaW5jbHVkZSAiZGIvaW5mcmEvZnJPcmllbnQuaCIKLQotbmFtZXNwYWNlIGZyIHsKLSAgY2xhc3MgZnJOZXQ7Ci0gIGNsYXNzIHRhUmVmOiBwdWJsaWMgdGFQaW5GaWcgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3JzCi0gICAgdGFSZWYoKTogdGFQaW5GaWcoKSB7fQotICAgIC8vIGdldHRlcnMKLSAgICB2aXJ0dWFsIGZyT3JpZW50IGdldE9yaWVudCgpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgZ2V0T3JpZ2luKGZyUG9pbnQgJnRtcE9yaWdpbikgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBnZXRUcmFuc2Zvcm0oZnJUcmFuc2Zvcm0gJnhmb3JtKSBjb25zdCA9IDA7Ci0gICAgLy8gc2V0dGVycwotICAgIHZpcnR1YWwgdm9pZCBzZXRPcmllbnQoY29uc3QgZnJPcmllbnQgJnRtcE9yaWVudCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBzZXRPcmlnaW4oY29uc3QgZnJQb2ludCAmdG1wUG9pbnQpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0VHJhbnNmb3JtKGNvbnN0IGZyVHJhbnNmb3JtICZ4Zm9ybSkgPSAwOwotICBwcm90ZWN0ZWQ6Ci0gIH07Ci0gIGNsYXNzIHRhVmlhOiBwdWJsaWMgdGFSZWYgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3JzCi0gICAgdGFWaWEoKTogdGFSZWYoKSB7fQotICAgIHRhVmlhKGZyVmlhRGVmKiBpbik6IHRhUmVmKCksIG9yaWdpbigpLCB2aWFEZWYoaW4pLCBvd25lcihudWxscHRyKSB7fQotICAgIC8vIGdldHRlcnMKLSAgICBmclZpYURlZiogZ2V0VmlhRGVmKCkgY29uc3QgewotICAgICAgcmV0dXJuIHZpYURlZjsKLSAgICB9Ci0gICAgdm9pZCBnZXRMYXllcjFCQm94KGZyQm94ICZib3hJbikgY29uc3QgewotICAgICAgYXV0byAmZmlncyA9IHZpYURlZi0+Z2V0TGF5ZXIxRmlncygpOwotICAgICAgYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKLSAgICAgIGZyQm94IGJveDsKLSAgICAgIGZyQ29vcmQgeGwgPSAwOwotICAgICAgZnJDb29yZCB5bCA9IDA7Ci0gICAgICBmckNvb3JkIHhoID0gMDsKLSAgICAgIGZyQ29vcmQgeWggPSAwOwotICAgICAgZm9yIChhdXRvICZmaWc6IGZpZ3MpIHsKLSAgICAgICAgZmlnLT5nZXRCQm94KGJveCk7Ci0gICAgICAgIGlmIChpc0ZpcnN0KSB7Ci0gICAgICAgICAgeGwgPSBib3gubGVmdCgpOwotICAgICAgICAgIHlsID0gYm94LmJvdHRvbSgpOwotICAgICAgICAgIHhoID0gYm94LnJpZ2h0KCk7Ci0gICAgICAgICAgeWggPSBib3gudG9wKCk7Ci0gICAgICAgICAgaXNGaXJzdCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHhsID0gc3RkOjptaW4oeGwsIGJveC5sZWZ0KCkpOwotICAgICAgICAgIHlsID0gc3RkOjptaW4oeWwsIGJveC5ib3R0b20oKSk7Ci0gICAgICAgICAgeGggPSBzdGQ6Om1heCh4aCwgYm94LnJpZ2h0KCkpOwotICAgICAgICAgIHloID0gc3RkOjptYXgoeWgsIGJveC50b3AoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJveEluLnNldCh4bCx5bCx4aCx5aCk7Ci0gICAgICBmclRyYW5zZm9ybSB4Zm9ybTsKLSAgICAgIHhmb3JtLnNldChvcmlnaW4pOwotICAgICAgYm94SW4udHJhbnNmb3JtKHhmb3JtKTsKLSAgICB9Ci0gICAgdm9pZCBnZXRDdXRCQm94KGZyQm94ICZib3hJbikgY29uc3QgewotICAgICAgYXV0byAmZmlncyA9IHZpYURlZi0+Z2V0Q3V0RmlncygpOwotICAgICAgYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKLSAgICAgIGZyQm94IGJveDsKLSAgICAgIGZyQ29vcmQgeGwgPSAwOwotICAgICAgZnJDb29yZCB5bCA9IDA7Ci0gICAgICBmckNvb3JkIHhoID0gMDsKLSAgICAgIGZyQ29vcmQgeWggPSAwOwotICAgICAgZm9yIChhdXRvICZmaWc6IGZpZ3MpIHsKLSAgICAgICAgZmlnLT5nZXRCQm94KGJveCk7Ci0gICAgICAgIGlmIChpc0ZpcnN0KSB7Ci0gICAgICAgICAgeGwgPSBib3gubGVmdCgpOwotICAgICAgICAgIHlsID0gYm94LmJvdHRvbSgpOwotICAgICAgICAgIHhoID0gYm94LnJpZ2h0KCk7Ci0gICAgICAgICAgeWggPSBib3gudG9wKCk7Ci0gICAgICAgICAgaXNGaXJzdCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHhsID0gc3RkOjptaW4oeGwsIGJveC5sZWZ0KCkpOwotICAgICAgICAgIHlsID0gc3RkOjptaW4oeWwsIGJveC5ib3R0b20oKSk7Ci0gICAgICAgICAgeGggPSBzdGQ6Om1heCh4aCwgYm94LnJpZ2h0KCkpOwotICAgICAgICAgIHloID0gc3RkOjptYXgoeWgsIGJveC50b3AoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJveEluLnNldCh4bCx5bCx4aCx5aCk7Ci0gICAgICBmclRyYW5zZm9ybSB4Zm9ybTsKLSAgICAgIHhmb3JtLnNldChvcmlnaW4pOwotICAgICAgYm94SW4udHJhbnNmb3JtKHhmb3JtKTsKLSAgICB9Ci0gICAgdm9pZCBnZXRMYXllcjJCQm94KGZyQm94ICZib3hJbikgY29uc3QgewotICAgICAgYXV0byAmZmlncyA9IHZpYURlZi0+Z2V0TGF5ZXIyRmlncygpOwotICAgICAgYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKLSAgICAgIGZyQm94IGJveDsKLSAgICAgIGZyQ29vcmQgeGwgPSAwOwotICAgICAgZnJDb29yZCB5bCA9IDA7Ci0gICAgICBmckNvb3JkIHhoID0gMDsKLSAgICAgIGZyQ29vcmQgeWggPSAwOwotICAgICAgZm9yIChhdXRvICZmaWc6IGZpZ3MpIHsKLSAgICAgICAgZmlnLT5nZXRCQm94KGJveCk7Ci0gICAgICAgIGlmIChpc0ZpcnN0KSB7Ci0gICAgICAgICAgeGwgPSBib3gubGVmdCgpOwotICAgICAgICAgIHlsID0gYm94LmJvdHRvbSgpOwotICAgICAgICAgIHhoID0gYm94LnJpZ2h0KCk7Ci0gICAgICAgICAgeWggPSBib3gudG9wKCk7Ci0gICAgICAgICAgaXNGaXJzdCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHhsID0gc3RkOjptaW4oeGwsIGJveC5sZWZ0KCkpOwotICAgICAgICAgIHlsID0gc3RkOjptaW4oeWwsIGJveC5ib3R0b20oKSk7Ci0gICAgICAgICAgeGggPSBzdGQ6Om1heCh4aCwgYm94LnJpZ2h0KCkpOwotICAgICAgICAgIHloID0gc3RkOjptYXgoeWgsIGJveC50b3AoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJveEluLnNldCh4bCx5bCx4aCx5aCk7Ci0gICAgICBmclRyYW5zZm9ybSB4Zm9ybTsKLSAgICAgIHhmb3JtLnNldChvcmlnaW4pOwotICAgICAgYm94SW4udHJhbnNmb3JtKHhmb3JtKTsKLSAgICB9Ci0gICAgLy8gc2V0dGVycwotICAgIHZvaWQgc2V0VmlhRGVmKGZyVmlhRGVmKiBpbikgewotICAgICAgdmlhRGVmID0gaW47Ci0gICAgfQotICAgIC8vIG90aGVycwotICAgIGZyQmxvY2tPYmplY3RFbnVtIHR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiB0YWNWaWE7Ci0gICAgfQotCi0gICAgLyogZnJvbSBmclJlZgotICAgICAqIGdldE9yaWVudAotICAgICAqIHNldE9yaWVudAotICAgICAqIGdldE9yaWdpbgotICAgICAqIHNldE9yaWdpbgotICAgICAqIGdldFRyYW5zZm9ybQotICAgICAqIHNldFRyYW5zZm9ybQotICAgICAqLwotCi0gICAgZnJPcmllbnQgZ2V0T3JpZW50KCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIGZyT3JpZW50KCk7Ci0gICAgfQotICAgIHZvaWQgc2V0T3JpZW50KGNvbnN0IGZyT3JpZW50ICZ0bXBPcmllbnQpIG92ZXJyaWRlIHsKLSAgICAgIDsKLSAgICB9Ci0gICAgdm9pZCBnZXRPcmlnaW4oZnJQb2ludCAmdG1wT3JpZ2luKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICB0bXBPcmlnaW4uc2V0KG9yaWdpbik7Ci0gICAgfQotICAgIHZvaWQgc2V0T3JpZ2luKGNvbnN0IGZyUG9pbnQgJnRtcFBvaW50KSBvdmVycmlkZSB7Ci0gICAgICBvcmlnaW4uc2V0KHRtcFBvaW50KTsKLSAgICB9Ci0gICAgdm9pZCBnZXRUcmFuc2Zvcm0oZnJUcmFuc2Zvcm0gJnhmb3JtSW4pIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHhmb3JtSW4uc2V0KG9yaWdpbik7Ci0gICAgfQotICAgIHZvaWQgc2V0VHJhbnNmb3JtKGNvbnN0IGZyVHJhbnNmb3JtICZ4Zm9ybUluKSBvdmVycmlkZSB7fQotCi0gICAgLyogZnJvbSBmclBpbkZpZwotICAgICAqIGhhc1BpbgotICAgICAqIGdldFBpbgotICAgICAqIGFkZFRvUGluCi0gICAgICogcmVtb3ZlRnJvbVBpbgotICAgICAqLwotICAgIGJvb2wgaGFzUGluKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIChvd25lcikgJiYgKG93bmVyLT50eXBlSWQoKSA9PSB0YWNQaW4pOwotICAgIH0KLSAgICB0YVBpbiogZ2V0UGluKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dGFQaW4qPihvd25lcik7Ci0gICAgfQotICAgIHZvaWQgYWRkVG9QaW4odGFQaW4qIGluKSBvdmVycmlkZSB7Ci0gICAgICBvd25lciA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZnJCbG9ja09iamVjdCo+KGluKTsKLSAgICB9Ci0gICAgdm9pZCByZW1vdmVGcm9tUGluKCkgb3ZlcnJpZGUgewotICAgICAgb3duZXIgPSBudWxscHRyOwotICAgIH0KLQotICAgIC8qIGZyb20gZnJDb25uRmlnCi0gICAgICogaGFzTmV0Ci0gICAgICogZ2V0TmV0Ci0gICAgICogYWRkVG9OZXQKLSAgICAgKiByZW1vdmVGcm9tTmV0Ci0gICAgICovCi0gICAgYm9vbCBoYXNOZXQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gKG93bmVyKSAmJiAob3duZXItPnR5cGVJZCgpID09IGZyY05ldCk7Ci0gICAgfQotICAgIGZyTmV0KiBnZXROZXQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxmck5ldCo+KG93bmVyKTsKLSAgICB9Ci0gICAgdm9pZCBhZGRUb05ldChmck5ldCogaW4pIG92ZXJyaWRlIHsKLSAgICAgIG93bmVyID0gcmVpbnRlcnByZXRfY2FzdDxmckJsb2NrT2JqZWN0Kj4oaW4pOwotICAgIH0KLSAgICB2b2lkIHJlbW92ZUZyb21OZXQoKSBvdmVycmlkZSB7Ci0gICAgICBvd25lciA9IG51bGxwdHI7Ci0gICAgfQotCi0gICAgLyogZnJvbSBmckZpZwotICAgICAqIGdldEJCb3gKLSAgICAgKiBtb3ZlCi0gICAgICogb3ZlcmxhcHMKLSAgICAgKi8KLQotICAgIHZvaWQgZ2V0QkJveCAoZnJCb3ggJmJveEluKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICBhdXRvICZsYXllcjFGaWdzID0gdmlhRGVmLT5nZXRMYXllcjFGaWdzKCk7Ci0gICAgICBhdXRvICZsYXllcjJGaWdzID0gdmlhRGVmLT5nZXRMYXllcjJGaWdzKCk7Ci0gICAgICBhdXRvICZjdXRGaWdzICAgID0gdmlhRGVmLT5nZXRDdXRGaWdzKCk7Ci0gICAgICBib29sIGlzRmlyc3QgPSB0cnVlOwotICAgICAgZnJCb3ggYm94OwotICAgICAgZnJDb29yZCB4bCA9IDA7Ci0gICAgICBmckNvb3JkIHlsID0gMDsKLSAgICAgIGZyQ29vcmQgeGggPSAwOwotICAgICAgZnJDb29yZCB5aCA9IDA7Ci0gICAgICBmb3IgKGF1dG8gJmZpZzogbGF5ZXIxRmlncykgewotICAgICAgICBmaWctPmdldEJCb3goYm94KTsKLSAgICAgICAgaWYgKGlzRmlyc3QpIHsKLSAgICAgICAgICB4bCA9IGJveC5sZWZ0KCk7Ci0gICAgICAgICAgeWwgPSBib3guYm90dG9tKCk7Ci0gICAgICAgICAgeGggPSBib3gucmlnaHQoKTsKLSAgICAgICAgICB5aCA9IGJveC50b3AoKTsKLSAgICAgICAgICBpc0ZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgeGwgPSBzdGQ6Om1pbih4bCwgYm94LmxlZnQoKSk7Ci0gICAgICAgICAgeWwgPSBzdGQ6Om1pbih5bCwgYm94LmJvdHRvbSgpKTsKLSAgICAgICAgICB4aCA9IHN0ZDo6bWF4KHhoLCBib3gucmlnaHQoKSk7Ci0gICAgICAgICAgeWggPSBzdGQ6Om1heCh5aCwgYm94LnRvcCgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZm9yIChhdXRvICZmaWc6IGxheWVyMkZpZ3MpIHsKLSAgICAgICAgZmlnLT5nZXRCQm94KGJveCk7Ci0gICAgICAgIGlmIChpc0ZpcnN0KSB7Ci0gICAgICAgICAgeGwgPSBib3gubGVmdCgpOwotICAgICAgICAgIHlsID0gYm94LmJvdHRvbSgpOwotICAgICAgICAgIHhoID0gYm94LnJpZ2h0KCk7Ci0gICAgICAgICAgeWggPSBib3gudG9wKCk7Ci0gICAgICAgICAgaXNGaXJzdCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHhsID0gc3RkOjptaW4oeGwsIGJveC5sZWZ0KCkpOwotICAgICAgICAgIHlsID0gc3RkOjptaW4oeWwsIGJveC5ib3R0b20oKSk7Ci0gICAgICAgICAgeGggPSBzdGQ6Om1heCh4aCwgYm94LnJpZ2h0KCkpOwotICAgICAgICAgIHloID0gc3RkOjptYXgoeWgsIGJveC50b3AoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGZvciAoYXV0byAmZmlnOiBjdXRGaWdzKSB7Ci0gICAgICAgIGZpZy0+Z2V0QkJveChib3gpOwotICAgICAgICBpZiAoaXNGaXJzdCkgewotICAgICAgICAgIHhsID0gYm94LmxlZnQoKTsKLSAgICAgICAgICB5bCA9IGJveC5ib3R0b20oKTsKLSAgICAgICAgICB4aCA9IGJveC5yaWdodCgpOwotICAgICAgICAgIHloID0gYm94LnRvcCgpOwotICAgICAgICAgIGlzRmlyc3QgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB4bCA9IHN0ZDo6bWluKHhsLCBib3gubGVmdCgpKTsKLSAgICAgICAgICB5bCA9IHN0ZDo6bWluKHlsLCBib3guYm90dG9tKCkpOwotICAgICAgICAgIHhoID0gc3RkOjptYXgoeGgsIGJveC5yaWdodCgpKTsKLSAgICAgICAgICB5aCA9IHN0ZDo6bWF4KHloLCBib3gudG9wKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBib3hJbi5zZXQoeGwseWwseGgseWgpOwotICAgICAgZnJUcmFuc2Zvcm0geGZvcm07Ci0gICAgICB4Zm9ybS5zZXQob3JpZ2luKTsKLSAgICAgIC8vY291dCA8PCJvcmlnaW4gIiA8PG9yaWdpbi54KCkgPDwiICIgPDxvcmlnaW4ueSgpIDw8ZW5kbDsKLSAgICAgIGJveEluLnRyYW5zZm9ybSh4Zm9ybSk7Ci0gICAgfQotICAgIHZvaWQgbW92ZShjb25zdCBmclRyYW5zZm9ybSAmeGZvcm0pIG92ZXJyaWRlIHsKLSAgICAgIDsKLSAgICB9Ci0gICAgYm9vbCBvdmVybGFwcyhjb25zdCBmckJveCAmYm94KSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBwcm90ZWN0ZWQ6Ci0gICAgZnJQb2ludCAgICAgICAgb3JpZ2luOwotICAgIGZyVmlhRGVmKiAgICAgIHZpYURlZjsKLSAgICBmckJsb2NrT2JqZWN0KiBvd25lcjsKLSAgfTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi90ZWNoL01ha2VmaWxlIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvdGVjaC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYyN2JjNS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi90ZWNoL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyBzdWJkaXIgYW5kIG9iamVjdHMgaW4gY3VycmVudCBkaXIKLVNVQkRJUlMJPSAKLU9CSkVDVFMJPSAKLQotCi1hbGw6c3ViZGlycyAke09CSkVDVFN9Ci0KLQkKLWNsZWFuOmNsZWFuc3ViZGlycwotCXJtIC1mICR7T0JKRUNUU30KLQkKLWluY2x1ZGUgJHtNQUtFSU5DTFVERX0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL3RlY2gvZnJDb25zdHJhaW50LmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi90ZWNoL2ZyQ29uc3RyYWludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjYzODcyLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL3RlY2gvZnJDb25zdHJhaW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIxICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX0ZSX0NPTlNUUkFJTlRfSF8KLSNkZWZpbmUgX0ZSX0NPTlNUUkFJTlRfSF8KLQotI2luY2x1ZGUgImZyQmFzZVR5cGVzLmgiCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPGl0ZXJhdG9yPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlICJkYi90ZWNoL2ZyTG9va3VwVGJsLmgiCi0KLW5hbWVzcGFjZSBmciB7Ci0gIC8vIGVudW0gY2xhc3MgZnJDb25zdHJhaW50VHlwZUVudW0gewotICAvLyAgIFNQQUNJTkcsCi0gIC8vICAgU1BBQ0lOR1RBQkxFCi0gIC8vIH07Ci0KLSAgLy9lbnVtIGNsYXNzIGZyU3BhY2luZ0NvbnN0cmFpbnRUeXBlRW51bSB7Ci0gIC8vICBSQU5HRSwKLSAgLy8gIExFTkdUSFRIUkVTSE9MRCwKLSAgLy8gIEVORE9GTElORSwKLSAgLy8gIFNBTUVORVQsCi0gIC8vICBOT1RDSExFTkdUSCwKLSAgLy8gIEVORE9GTk9UQ0hXSURUSAotICAvL307Ci0KLSAgLy9lbnVtIGNsYXNzIGZyU3BhY2luZ1RhYmxlQ29uc3RyYWludFR5cGVFbnVtIHsKLSAgLy8gIFBBUkFMTEVMUlVOTEVOR1RILAotICAvLyAgVFdPV0lEVEgKLSAgLy99OwotCi0gIGVudW0gY2xhc3MgZnJMZWY1OENvcm5lclNwYWNpbmdFeGNlcHRpb25FbnVtIHsKLSAgICBOT05FLAotICAgIEVYQ0VQVFNBTUVORVQsCi0gICAgRVhDRVBUU0FNRU1FVEFMCi0gIH07Ci0KLQotICAvLyBiYXNlIHR5cGUgZm9yIGRlc2lnbiBydWxlCi0gIGNsYXNzIGZyQ29uc3RyYWludCB7Ci0gIHB1YmxpYzoKLSAgICBmckNvbnN0cmFpbnQoKSB7fQotICAgIHZpcnR1YWwgfmZyQ29uc3RyYWludCgpIHt9Ci0gICAgdmlydHVhbCBmckNvbnN0cmFpbnRUeXBlRW51bSB0eXBlSWQoKSBjb25zdCA9IDA7ICAgIAotICBwcm90ZWN0ZWQ6Ci0gIH07Ci0KLSAgbmFtZXNwYWNlIGlvIHsKLSAgICBjbGFzcyBQYXJzZXI7Ci0gIH0KLSAgY2xhc3MgZnJMZWY1OEN1dENsYXNzQ29uc3RyYWludCA6IHB1YmxpYyBmckNvbnN0cmFpbnQgewotICBwdWJsaWM6Ci0gICAgZnJpZW5kIGNsYXNzIGlvOjpQYXJzZXI7Ci0gICAgLy8gY29uc3RydWN0b3JzOwotICAgIGZyTGVmNThDdXRDbGFzc0NvbnN0cmFpbnQoKSB7fQotICAgIC8vIGdldHRlcnMKLSAgICBmckNvbGxlY3Rpb248IHN0ZDo6c2hhcmVkX3B0cjxmckxlZjU4Q3V0Q2xhc3M+ID4gZ2V0Q3V0Q2xhc3NlcygpIGNvbnN0IHsKLSAgICAgIGZyQ29sbGVjdGlvbjxzdGQ6OnNoYXJlZF9wdHI8ZnJMZWY1OEN1dENsYXNzPiA+IHNvbDsKLSAgICAgIHN0ZDo6dHJhbnNmb3JtKGN1dENsYXNzZXMuYmVnaW4oKSwgY3V0Q2xhc3Nlcy5lbmQoKSwgCi0gICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoc29sKSwgCi0gICAgICAgICAgICAgICAgICAgICBbXShhdXRvICZrdikge3JldHVybiBrdi5zZWNvbmQ7fSk7Ci0gICAgICByZXR1cm4gc29sOwotICAgIH0KLSAgICAvLyBzZXR0ZXJzCi0gICAgdm9pZCBhZGRUb0N1dENsYXNzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxmckxlZjU4Q3V0Q2xhc3M+ICZpbikgewotICAgICAgY3V0Q2xhc3Nlc1tpbi0+Z2V0TmFtZSgpXSA9IGluOwotICAgIH0KLSAgICAvLyBvdGhlcnMKLSAgICBmckNvbnN0cmFpbnRUeXBlRW51bSB0eXBlSWQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gZnJDb25zdHJhaW50VHlwZUVudW06OmZyY0xlZjU4Q3V0Q2xhc3NDb25zdHJhaW50OwotICAgIH0KLSAgcHJvdGVjdGVkOgotICAgIHN0ZDo6bWFwPGZyU3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8ZnJMZWY1OEN1dENsYXNzPiA+IGN1dENsYXNzZXM7Ci0gIH07Ci0KLSAgLy8gc2hvcnQKLQotICBjbGFzcyBmclNob3J0Q29uc3RyYWludCA6IHB1YmxpYyBmckNvbnN0cmFpbnQgewotICBwdWJsaWM6Ci0gICAgZnJDb25zdHJhaW50VHlwZUVudW0gdHlwZUlkKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIGZyQ29uc3RyYWludFR5cGVFbnVtOjpmcmNTaG9ydENvbnN0cmFpbnQ7Ci0gICAgfQotICB9OwotCi0gIC8vIG1pblN0ZXAKLSAgY2xhc3MgZnJNaW5TdGVwQ29uc3RyYWludCA6IHB1YmxpYyBmckNvbnN0cmFpbnQgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3IKLSAgICBmck1pblN0ZXBDb25zdHJhaW50KCkgOiBtaW5TdGVwTGVuZ3RoKC0xKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TGVuZ3RoKC0xKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWRlQ29ybmVyKGZhbHNlKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0c2lkZUNvcm5lcih0cnVlKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcChmYWxzZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RWRnZXMoLTEpIHt9Ci0gICAgLy8gZ2V0dGVyCi0gICAgZnJDb29yZCBnZXRNaW5TdGVwTGVuZ3RoKCkgewotICAgICAgcmV0dXJuIG1pblN0ZXBMZW5ndGg7Ci0gICAgfQotICAgIGJvb2wgaGFzTWF4TGVuZ3RoKCkgewotICAgICAgcmV0dXJuIChtYXhMZW5ndGggIT0gLTEpOwotICAgIH0KLSAgICBmckNvb3JkIGdldE1heExlbmd0aCgpIHsKLSAgICAgIHJldHVybiBtYXhMZW5ndGg7Ci0gICAgfQotICAgIGJvb2wgaGFzSW5zaWRlQ29ybmVyKCkgewotICAgICAgcmV0dXJuIGluc2lkZUNvcm5lcjsKLSAgICB9Ci0gICAgYm9vbCBoYXNPdXRzaWRlQ29ybmVyKCkgewotICAgICAgcmV0dXJuIG91dHNpZGVDb3JuZXI7Ci0gICAgfQotICAgIGJvb2wgaGFzU3RlcCgpIHsKLSAgICAgIHJldHVybiBzdGVwOwotICAgIH0KLSAgICBib29sIGhhc01heEVkZ2VzKCkgewotICAgICAgcmV0dXJuIChtYXhFZGdlcyAhPSAtMSk7Ci0gICAgfQotICAgIGludCBnZXRNYXhFZGdlcygpIHsKLSAgICAgIHJldHVybiBtYXhFZGdlczsKLSAgICB9Ci0gICAgLy8gc2V0dGVyCi0gICAgdm9pZCBzZXRJbnNpZGVDb3JuZXIoYm9vbCBpbikgewotICAgICAgaW5zaWRlQ29ybmVyID0gaW47Ci0gICAgfQotICAgIHZvaWQgc2V0T3V0c2lkZUNvcm5lcihib29sIGluKSB7Ci0gICAgICBvdXRzaWRlQ29ybmVyID0gaW47Ci0gICAgfQotICAgIHZvaWQgc2V0U3RlcChib29sIGluKSB7Ci0gICAgICBzdGVwID0gaW47Ci0gICAgfQotICAgIHZvaWQgc2V0TWluU3RlcExlbmd0aChmckNvb3JkIGluKSB7Ci0gICAgICBtaW5TdGVwTGVuZ3RoID0gaW47Ci0gICAgfQotICAgIHZvaWQgc2V0TWF4TGVuZ3RoKGZyQ29vcmQgaW4pIHsKLSAgICAgIG1heExlbmd0aCA9IGluOwotICAgIH0KLSAgICB2b2lkIHNldE1heEVkZ2VzKGludCBpbikgewotICAgICAgbWF4RWRnZXMgPSBpbjsKLSAgICB9Ci0KLSAgICBmckNvbnN0cmFpbnRUeXBlRW51bSB0eXBlSWQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gZnJDb25zdHJhaW50VHlwZUVudW06OmZyY01pblN0ZXBDb25zdHJhaW50OwotICAgIH0KLQotICBwcm90ZWN0ZWQ6Ci0gICAgZnJDb29yZCBtaW5TdGVwTGVuZ3RoOwotICAgIGZyQ29vcmQgbWF4TGVuZ3RoOwotICAgIGJvb2wgaW5zaWRlQ29ybmVyOwotICAgIGJvb2wgb3V0c2lkZUNvcm5lcjsKLSAgICBib29sIHN0ZXA7Ci0gICAgaW50IG1heEVkZ2VzOwotICB9OwotCi0gIC8vIG1pbkFyZWEKLQotICBjbGFzcyBmckFyZWFDb25zdHJhaW50IDogcHVibGljIGZyQ29uc3RyYWludCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBjb25zdHJ1Y3RvcgotICAgIGZyQXJlYUNvbnN0cmFpbnQoZnJDb29yZCBtaW5BcmVhSW4pIHsKLSAgICAgIG1pbkFyZWEgPSBtaW5BcmVhSW47Ci0gICAgfQotICAgIC8vIGdldHRlcgotICAgIGZyQ29vcmQgZ2V0TWluQXJlYSgpIHsKLSAgICAgIHJldHVybiBtaW5BcmVhOwotICAgIH0KLSAgICAvLyBzZXR0ZXIKLSAgICB2b2lkIHNldE1pbkFyZWEoZnJDb29yZCAmbWluQXJlYUluKSB7Ci0gICAgICBtaW5BcmVhID0gbWluQXJlYUluOwotICAgIH0KLQotICAgIGZyQ29uc3RyYWludFR5cGVFbnVtIHR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiBmckNvbnN0cmFpbnRUeXBlRW51bTo6ZnJjQXJlYUNvbnN0cmFpbnQ7Ci0gICAgfQotICBwcm90ZWN0ZWQ6Ci0gICAgZnJDb29yZCBtaW5BcmVhOwotICB9OwotCi0gIC8vIG1pbldpZHRoCi0gIGNsYXNzIGZyTWluV2lkdGhDb25zdHJhaW50OiBwdWJsaWMgZnJDb25zdHJhaW50IHsKLSAgcHVibGljOgotICAgIC8vIGNvbnN0cnVjdG9yCi0gICAgZnJNaW5XaWR0aENvbnN0cmFpbnQoZnJDb29yZCBtaW5XaWR0aEluKSB7Ci0gICAgICBtaW5XaWR0aCA9IG1pbldpZHRoSW47Ci0gICAgfQotICAgIC8vIGdldHRlcgotICAgIGZyQ29vcmQgZ2V0TWluV2lkdGgoKSB7Ci0gICAgICByZXR1cm4gbWluV2lkdGg7Ci0gICAgfQotICAgIC8vIHNldHRlcgotICAgIHZvaWQgc2V0KGZyQ29vcmQgJm1pbldpZHRoSW4pIHsKLSAgICAgIG1pbldpZHRoID0gbWluV2lkdGhJbjsKLSAgICB9Ci0KLSAgICBmckNvbnN0cmFpbnRUeXBlRW51bSB0eXBlSWQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gZnJDb25zdHJhaW50VHlwZUVudW06OmZyY01pbldpZHRoQ29uc3RyYWludDsKLSAgICB9Ci0gIHByb3RlY3RlZDoKLSAgICBmckNvb3JkIG1pbldpZHRoOwotICB9OwotCi0gIGNsYXNzIGZyTGVmNThTcGFjaW5nRW5kT2ZMaW5lV2l0aGluRW5kVG9FbmRDb25zdHJhaW50IDogcHVibGljIGZyQ29uc3RyYWludCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBjb25zdHJ1Y3RvcnMKLSAgICBmckxlZjU4U3BhY2luZ0VuZE9mTGluZVdpdGhpbkVuZFRvRW5kQ29uc3RyYWludCgpOiBlbmRUb0VuZFNwYWNlKDApLCBjdXRTcGFjZShmYWxzZSksIG9uZUN1dFNwYWNlKDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR3b0N1dFNwYWNlKDApLCBoRXh0ZW5zaW9uKGZhbHNlKSwgZXh0ZW5zaW9uKDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyb25nRGlyRXh0ZW5zaW9uKGZhbHNlKSwgaE90aGVyRW5kV2lkdGgoZmFsc2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyRW5kV2lkdGgoMCkge30KLSAgICAvLyBnZXR0ZXJzCi0gICAgZnJDb29yZCBnZXRFbmRUb0VuZFNwYWNlKCkgY29uc3QgewotICAgICAgcmV0dXJuIGVuZFRvRW5kU3BhY2U7Ci0gICAgfQotICAgIGZyQ29vcmQgZ2V0T25lQ3V0U3BhY2UoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gb25lQ3V0U3BhY2U7Ci0gICAgfQotICAgIGZyQ29vcmQgZ2V0VHdvQ3V0U3BhY2UoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gdHdvQ3V0U3BhY2U7Ci0gICAgfQotICAgIGJvb2wgaGFzRXh0ZW5zaW9uKCkgY29uc3QgewotICAgICAgcmV0dXJuIGhFeHRlbnNpb247Ci0gICAgfQotICAgIGZyQ29vcmQgZ2V0RXh0ZW5zaW9uKCkgY29uc3QgewotICAgICAgcmV0dXJuIGV4dGVuc2lvbjsKLSAgICB9Ci0gICAgZnJDb29yZCBnZXRXcm9uZ0RpckV4dGVuc2lvbigpIGNvbnN0IHsKLSAgICAgIHJldHVybiB3cm9uZ0RpckV4dGVuc2lvbjsKLSAgICB9Ci0gICAgYm9vbCBoYXNPdGhlckVuZFdpZHRoKCkgY29uc3QgewotICAgICAgcmV0dXJuIGhPdGhlckVuZFdpZHRoOwotICAgIH0KLSAgICBmckNvb3JkIGdldE90aGVyRW5kV2lkdGgoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gb3RoZXJFbmRXaWR0aDsKLSAgICB9Ci0gICAgCi0gICAgLy8gc2V0dGVycwotICAgIHZvaWQgc2V0RW5kVG9FbmRTcGFjZShmckNvb3JkIGluKSB7Ci0gICAgICBlbmRUb0VuZFNwYWNlID0gaW47Ci0gICAgfQotICAgIHZvaWQgc2V0Q3V0U3BhY2UoZnJDb29yZCBvbmUsIGZyQ29vcmQgdHdvKSB7Ci0gICAgICBvbmVDdXRTcGFjZSA9IG9uZTsKLSAgICAgIHR3b0N1dFNwYWNlID0gdHdvOwotICAgIH0KLSAgICB2b2lkIHNldEV4dGVuc2lvbihmckNvb3JkIGV4dGVuc2lvbkluKSB7Ci0gICAgICBoRXh0ZW5zaW9uID0gdHJ1ZTsKLSAgICAgIGV4dGVuc2lvbiA9IGV4dGVuc2lvbkluOwotICAgICAgd3JvbmdEaXJFeHRlbnNpb24gPSBleHRlbnNpb25JbjsKLSAgICB9Ci0gICAgdm9pZCBzZXRFeHRlbnNpb24oZnJDb29yZCBleHRlbnNpb25JbiwgZnJDb29yZCB3cm9uZ0RpckV4dGVuc2lvbkluKSB7Ci0gICAgICBoRXh0ZW5zaW9uID0gdHJ1ZTsKLSAgICAgIGV4dGVuc2lvbiA9IGV4dGVuc2lvbkluOwotICAgICAgd3JvbmdEaXJFeHRlbnNpb24gPSB3cm9uZ0RpckV4dGVuc2lvbkluOwotICAgIH0KLSAgICB2b2lkIHNldE90aGVyRW5kV2lkdGgoZnJDb29yZCBpbikgewotICAgICAgaE90aGVyRW5kV2lkdGggPSB0cnVlOwotICAgICAgb3RoZXJFbmRXaWR0aCA9IGluOwotICAgIH0KLSAgICAvLyBvdGhlcnMKLSAgICBmckNvbnN0cmFpbnRUeXBlRW51bSB0eXBlSWQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gZnJDb25zdHJhaW50VHlwZUVudW06OmZyY0xlZjU4U3BhY2luZ0VuZE9mTGluZVdpdGhpbkVuZFRvRW5kQ29uc3RyYWludDsKLSAgICB9Ci0gIHByb3RlY3RlZDoKLSAgICBmckNvb3JkICAgIGVuZFRvRW5kU3BhY2U7Ci0gICAgYm9vbCAgICAgICBjdXRTcGFjZTsKLSAgICBmckNvb3JkICAgIG9uZUN1dFNwYWNlOwotICAgIGZyQ29vcmQgICAgdHdvQ3V0U3BhY2U7Ci0gICAgYm9vbCAgICAgICBoRXh0ZW5zaW9uOwotICAgIGZyQ29vcmQgICAgZXh0ZW5zaW9uOwotICAgIGZyQ29vcmQgICAgd3JvbmdEaXJFeHRlbnNpb247Ci0gICAgYm9vbCAgICAgICBoT3RoZXJFbmRXaWR0aDsKLSAgICBmckNvb3JkICAgIG90aGVyRW5kV2lkdGg7Ci0gIH07Ci0KLSAgY2xhc3MgZnJMZWY1OFNwYWNpbmdFbmRPZkxpbmVXaXRoaW5QYXJhbGxlbEVkZ2VDb25zdHJhaW50IDogcHVibGljIGZyQ29uc3RyYWludCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBjb25zdHJ1Y3RvcnMKLSAgICBmckxlZjU4U3BhY2luZ0VuZE9mTGluZVdpdGhpblBhcmFsbGVsRWRnZUNvbnN0cmFpbnQoKTogc3VidHJhY3RFb2xXaWR0aChmYWxzZSksIHBhclNwYWNlKDApLCBwYXJXaXRoaW4oMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQcmwoZmFsc2UpLCBwcmwoMCksIGhNaW5MZW5ndGgoZmFsc2UpLCBtaW5MZW5ndGgoMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR3b0VkZ2VzKGZhbHNlKSwgc2FtZU1ldGFsKGZhbHNlKSwgbm9uRW9sQ29ybmVyT25seShmYWxzZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFsbGVsU2FtZU1hc2soZmFsc2UpIHt9Ci0gICAgLy8gZ2V0dGVycwotICAgIGJvb2wgaGFzU3VidHJhY3RFb2xXaWR0aCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBzdWJ0cmFjdEVvbFdpZHRoOwotICAgIH0KLSAgICBmckNvb3JkIGdldFBhclNwYWNlKCkgY29uc3QgewotICAgICAgcmV0dXJuIHBhclNwYWNlOwotICAgIH0KLSAgICBmckNvb3JkIGdldFBhcldpdGhpbigpIGNvbnN0IHsKLSAgICAgIHJldHVybiBwYXJXaXRoaW47Ci0gICAgfQotICAgIGJvb2wgaGFzUHJsKCkgY29uc3QgewotICAgICAgcmV0dXJuIGhQcmw7Ci0gICAgfQotICAgIGZyQ29vcmQgZ2V0UHJsKCkgY29uc3QgewotICAgICAgcmV0dXJuIHBybDsKLSAgICB9Ci0gICAgYm9vbCBoYXNNaW5MZW5ndGgoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gaE1pbkxlbmd0aDsKLSAgICB9Ci0gICAgZnJDb29yZCBnZXRNaW5MZW5ndGgoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbWluTGVuZ3RoOwotICAgIH0KLSAgICBib29sIGhhc1R3b0VkZ2VzKCkgY29uc3QgewotICAgICAgcmV0dXJuIHR3b0VkZ2VzOwotICAgIH0KLSAgICBib29sIGhhc1NhbWVNZXRhbCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBzYW1lTWV0YWw7Ci0gICAgfQotICAgIGJvb2wgaGFzTm9uRW9sQ29ybmVyT25seSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBub25Fb2xDb3JuZXJPbmx5OwotICAgIH0KLSAgICBib29sIGhhc1BhcmFsbGVsU2FtZU1hc2soKSBjb25zdCB7Ci0gICAgICByZXR1cm4gcGFyYWxsZWxTYW1lTWFzazsKLSAgICB9Ci0gICAgLy8gc2V0dGVycwotICAgIHZvaWQgc2V0U3VidHJhY3RFb2xXaWR0aChib29sIGluKSB7Ci0gICAgICBzdWJ0cmFjdEVvbFdpZHRoID0gaW47Ci0gICAgfQotICAgIHZvaWQgc2V0UGFyKGZyQ29vcmQgcGFyU3BhY2VJbiwgZnJDb29yZCBwYXJXaXRoaW5JbikgewotICAgICAgcGFyU3BhY2UgPSBwYXJTcGFjZUluOwotICAgICAgcGFyV2l0aGluID0gcGFyV2l0aGluSW47Ci0gICAgfQotICAgIHZvaWQgc2V0UHJsKGZyQ29vcmQgaW4pIHsKLSAgICAgIGhQcmwgPSB0cnVlOwotICAgICAgcHJsID0gaW47Ci0gICAgfQotICAgIHZvaWQgc2V0TWluTGVuZ3RoKGZyQ29vcmQgaW4pIHsKLSAgICAgIGhNaW5MZW5ndGggPSB0cnVlOwotICAgICAgbWluTGVuZ3RoID0gaW47Ci0gICAgfQotICAgIHZvaWQgc2V0VHdvRWRnZXMoYm9vbCBpbikgewotICAgICAgdHdvRWRnZXMgPSBpbjsKLSAgICB9Ci0gICAgdm9pZCBzZXRTYW1lTWV0YWwoYm9vbCBpbikgewotICAgICAgc2FtZU1ldGFsID0gaW47Ci0gICAgfQotICAgIHZvaWQgc2V0Tm9uRW9sQ29ybmVyT25seShib29sIGluKSB7Ci0gICAgICBub25Fb2xDb3JuZXJPbmx5ID0gaW47Ci0gICAgfQotICAgIHZvaWQgc2V0UGFyYWxsZWxTYW1lTWFzayhib29sIGluKSB7Ci0gICAgICBwYXJhbGxlbFNhbWVNYXNrID0gaW47Ci0gICAgfQotICAgIAotICAgIC8vIG90aGVycwotICAgIGZyQ29uc3RyYWludFR5cGVFbnVtIHR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiBmckNvbnN0cmFpbnRUeXBlRW51bTo6ZnJjTGVmNThTcGFjaW5nRW5kT2ZMaW5lV2l0aGluUGFyYWxsZWxFZGdlQ29uc3RyYWludDsKLSAgICB9Ci0gIHByb3RlY3RlZDoKLSAgICBib29sICAgIHN1YnRyYWN0RW9sV2lkdGg7Ci0gICAgZnJDb29yZCBwYXJTcGFjZTsKLSAgICBmckNvb3JkIHBhcldpdGhpbjsKLSAgICBib29sICAgIGhQcmw7Ci0gICAgZnJDb29yZCBwcmw7Ci0gICAgYm9vbCAgICBoTWluTGVuZ3RoOwotICAgIGZyQ29vcmQgbWluTGVuZ3RoOwotICAgIGJvb2wgICAgdHdvRWRnZXM7Ci0gICAgYm9vbCAgICBzYW1lTWV0YWw7Ci0gICAgYm9vbCAgICBub25Fb2xDb3JuZXJPbmx5OwotICAgIGJvb2wgICAgcGFyYWxsZWxTYW1lTWFzazsKLSAgfTsKLQotICBjbGFzcyBmckxlZjU4U3BhY2luZ0VuZE9mTGluZVdpdGhpbk1heE1pbkxlbmd0aENvbnN0cmFpbnQgOiBwdWJsaWMgZnJDb25zdHJhaW50IHsKLSAgcHVibGljOgotICAgIC8vIGNvbnN0cnVjdG9ycwotICAgIGZyTGVmNThTcGFjaW5nRW5kT2ZMaW5lV2l0aGluTWF4TWluTGVuZ3RoQ29uc3RyYWludCgpOiBtYXhMZW5ndGgoZmFsc2UpLCBsZW5ndGgoMCksIHR3b1NpZGVzKGZhbHNlKSB7fQotICAgIC8vIGdldHRlcnMKLSAgICBmckNvb3JkIGdldExlbmd0aCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBsZW5ndGg7Ci0gICAgfQotICAgIGJvb2wgaXNNYXhMZW5ndGgoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbWF4TGVuZ3RoOwotICAgIH0KLSAgICAvLyBzZXR0ZXJzCi0gICAgdm9pZCBzZXRMZW5ndGgoYm9vbCBtYXhMZW5ndGhJbiwgZnJDb29yZCBsZW5ndGhJbiwgYm9vbCB0d29TaWRlc0luID0gZmFsc2UpIHsKLSAgICAgIG1heExlbmd0aCA9IG1heExlbmd0aEluOwotICAgICAgbGVuZ3RoICAgID0gbGVuZ3RoSW47Ci0gICAgICB0d29TaWRlcyAgPSB0d29TaWRlc0luOwotICAgIH0KLSAgICAvLyBvdGhlcnMKLSAgICBmckNvbnN0cmFpbnRUeXBlRW51bSB0eXBlSWQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gZnJDb25zdHJhaW50VHlwZUVudW06OmZyY0xlZjU4U3BhY2luZ0VuZE9mTGluZVdpdGhpbk1heE1pbkxlbmd0aENvbnN0cmFpbnQ7Ci0gICAgfQotICBwcm90ZWN0ZWQ6Ci0gICAgYm9vbCAgICBtYXhMZW5ndGg7Ci0gICAgZnJDb29yZCBsZW5ndGg7Ci0gICAgYm9vbCAgICB0d29TaWRlczsKLSAgfTsKLQotCi0gIGNsYXNzIGZyTGVmNThTcGFjaW5nRW5kT2ZMaW5lV2l0aGluQ29uc3RyYWludCA6IHB1YmxpYyBmckNvbnN0cmFpbnQgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3JzCi0gICAgZnJMZWY1OFNwYWNpbmdFbmRPZkxpbmVXaXRoaW5Db25zdHJhaW50KCk6IGhPcHBvc2l0ZVdpZHRoKGZhbHNlKSwgb3Bwb3NpdGVXaWR0aCgwKSwgZW9sV2l0aGluKDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cm9uZ0RpcldpdGhpbihmYWxzZSksIHNhbWVNYXNrKGZhbHNlKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFRvRW5kQ29uc3RyYWludChudWxscHRyKSwgcGFyYWxsZWxFZGdlQ29uc3RyYWludChudWxscHRyKSB7fQotICAgIC8vIGdldHRlcnMKLSAgICBib29sIGhhc09wcG9zaXRlV2lkdGgoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gaE9wcG9zaXRlV2lkdGg7Ci0gICAgfQotICAgIGZyQ29vcmQgZ2V0T3Bwb3NpdGVXaWR0aCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBvcHBvc2l0ZVdpZHRoOwotICAgIH0KLSAgICBmckNvb3JkIGdldEVvbFdpdGhpbigpIGNvbnN0IHsKLSAgICAgIHJldHVybiBlb2xXaXRoaW47Ci0gICAgfQotICAgIGZyQ29vcmQgZ2V0V3JvbmdEaXJXaXRoaW4oKSBjb25zdCB7Ci0gICAgICByZXR1cm4gd3JvbmdEaXJXaXRoaW47Ci0gICAgfQotICAgIGJvb2wgaGFzU2FtZU1hc2soKSBjb25zdCB7Ci0gICAgICByZXR1cm4gc2FtZU1hc2s7Ci0gICAgfQotICAgIGJvb2wgaGFzRXhjZXB0RXhhY3RXaWR0aCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBmYWxzZTsgLy8gc2tpcCBmb3Igbm93Ci0gICAgfQotICAgIGJvb2wgaGFzRmlsbENvbmNhdmVDb3JuZXIoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gZmFsc2U7IC8vIHNraXAgZm9yIG5vdwotICAgIH0KLSAgICBib29sIGhhc1dpdGhDdXQoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gZmFsc2U7IC8vIHNraXAgZm9yIG5vdwotICAgIH0KLSAgICBib29sIGhhc0VuZFBybFNwYWNpbmcoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gZmFsc2U7IC8vIHNraXAgZm9yIG5vdwotICAgIH0KLSAgICBib29sIGhhc0VuZFRvRW5kQ29uc3RyYWludCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiAoZW5kVG9FbmRDb25zdHJhaW50KSA/IHRydWUgOiBmYWxzZTsKLSAgICB9Ci0gICAgc3RkOjpzaGFyZWRfcHRyPGZyTGVmNThTcGFjaW5nRW5kT2ZMaW5lV2l0aGluRW5kVG9FbmRDb25zdHJhaW50PiBnZXRFbmRUb0VuZENvbnN0cmFpbnQoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gZW5kVG9FbmRDb25zdHJhaW50OwotICAgIH0KLSAgICBib29sIGhhc01pbk1heExlbmd0aCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBmYWxzZTsgLy8gc2tpcCBmb3Igbm93Ci0gICAgfQotICAgIGJvb2wgaGFzRXF1YWxSZWN0V2lkdGgoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gZmFsc2U7IC8vIHNraXAgZm9yIG5vdwotICAgIH0KLSAgICBib29sIGhhc1BhcmFsbGVsRWRnZUNvbnN0cmFpbnQoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gKHBhcmFsbGVsRWRnZUNvbnN0cmFpbnQpID8gdHJ1ZSA6IGZhbHNlOwotICAgIH0KLSAgICBzdGQ6OnNoYXJlZF9wdHI8ZnJMZWY1OFNwYWNpbmdFbmRPZkxpbmVXaXRoaW5QYXJhbGxlbEVkZ2VDb25zdHJhaW50PiBnZXRQYXJhbGxlbEVkZ2VDb25zdHJhaW50KCkgY29uc3QgewotICAgICAgcmV0dXJuIHBhcmFsbGVsRWRnZUNvbnN0cmFpbnQ7Ci0gICAgfQotICAgIGJvb2wgaGFzTWF4TWluTGVuZ3RoQ29uc3RyYWludCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiAobWF4TWluTGVuZ3RoQ29uc3RyYWludCkgPyB0cnVlIDogZmFsc2U7Ci0gICAgfQotICAgIHN0ZDo6c2hhcmVkX3B0cjxmckxlZjU4U3BhY2luZ0VuZE9mTGluZVdpdGhpbk1heE1pbkxlbmd0aENvbnN0cmFpbnQ+IGdldE1heE1pbkxlbmd0aENvbnN0cmFpbnQoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbWF4TWluTGVuZ3RoQ29uc3RyYWludDsKLSAgICB9Ci0gICAgYm9vbCBoYXNFbmNsb3NlQ3V0KCkgY29uc3QgewotICAgICAgcmV0dXJuIGZhbHNlOyAvLyBza2lwIGZvciBub3cKLSAgICB9Ci0gICAgLy8gc2V0dGVycwotICAgIHZvaWQgc2V0T3Bwb3NpdGVXaWR0aChmckNvb3JkIGluKSB7Ci0gICAgICBoT3Bwb3NpdGVXaWR0aCA9IHRydWU7Ci0gICAgICBvcHBvc2l0ZVdpZHRoID0gaW47Ci0gICAgfQotICAgIHZvaWQgc2V0RW9sV2l0aGluKGZyQ29vcmQgaW4pIHsKLSAgICAgIGVvbFdpdGhpbiA9IGluOwotICAgICAgd3JvbmdEaXJXaXRoaW4gPSBpbjsKLSAgICB9Ci0gICAgdm9pZCBzZXRXcm9uZ0RpcldpdGhpbihmckNvb3JkIGluKSB7Ci0gICAgICB3cm9uZ0RpcldpdGhpbiA9IGluOwotICAgIH0KLSAgICB2b2lkIHNldFNhbWVNYXNrKGJvb2wgaW4pIHsKLSAgICAgIHNhbWVNYXNrID0gaW47Ci0gICAgfQotICAgIHZvaWQgc2V0RW5kVG9FbmRDb25zdHJhaW50KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxmckxlZjU4U3BhY2luZ0VuZE9mTGluZVdpdGhpbkVuZFRvRW5kQ29uc3RyYWludD4gJmluKSB7Ci0gICAgICBlbmRUb0VuZENvbnN0cmFpbnQgPSBpbjsKLSAgICB9Ci0gICAgdm9pZCBzZXRQYXJhbGxlbEVkZ2VDb25zdHJhaW50KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxmckxlZjU4U3BhY2luZ0VuZE9mTGluZVdpdGhpblBhcmFsbGVsRWRnZUNvbnN0cmFpbnQ+ICZpbikgewotICAgICAgcGFyYWxsZWxFZGdlQ29uc3RyYWludCA9IGluOwotICAgIH0KLSAgICB2b2lkIHNldE1heE1pbkxlbmd0aENvbnN0cmFpbnQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGZyTGVmNThTcGFjaW5nRW5kT2ZMaW5lV2l0aGluTWF4TWluTGVuZ3RoQ29uc3RyYWludD4gJmluKSB7Ci0gICAgICBtYXhNaW5MZW5ndGhDb25zdHJhaW50ID0gaW47Ci0gICAgfQotICAgIC8vIG90aGVycwotICAgIGZyQ29uc3RyYWludFR5cGVFbnVtIHR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiBmckNvbnN0cmFpbnRUeXBlRW51bTo6ZnJjTGVmNThTcGFjaW5nRW5kT2ZMaW5lV2l0aGluQ29uc3RyYWludDsKLSAgICB9Ci0gIHByb3RlY3RlZDoKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoT3Bwb3NpdGVXaWR0aDsKLSAgICBmckNvb3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHBvc2l0ZVdpZHRoOwotICAgIGZyQ29vcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVvbFdpdGhpbjsKLSAgICBmckNvb3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cm9uZ0RpcldpdGhpbjsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1lTWFzazsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8ZnJMZWY1OFNwYWNpbmdFbmRPZkxpbmVXaXRoaW5FbmRUb0VuZENvbnN0cmFpbnQ+ICAgICBlbmRUb0VuZENvbnN0cmFpbnQ7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPGZyTGVmNThTcGFjaW5nRW5kT2ZMaW5lV2l0aGluUGFyYWxsZWxFZGdlQ29uc3RyYWludD4gcGFyYWxsZWxFZGdlQ29uc3RyYWludDsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8ZnJMZWY1OFNwYWNpbmdFbmRPZkxpbmVXaXRoaW5NYXhNaW5MZW5ndGhDb25zdHJhaW50PiBtYXhNaW5MZW5ndGhDb25zdHJhaW50OwotICB9OwotCi0gIGNsYXNzIGZyTGVmNThTcGFjaW5nRW5kT2ZMaW5lQ29uc3RyYWludCA6IHB1YmxpYyBmckNvbnN0cmFpbnQgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3JzCi0gICAgZnJMZWY1OFNwYWNpbmdFbmRPZkxpbmVDb25zdHJhaW50KCk6IGVvbFNwYWNlKDApLCBlb2xXaWR0aCgwKSwgZXhhY3RXaWR0aChmYWxzZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyb25nRGlyU3BhY2luZyhmYWxzZSksIHdyb25nRGlyU3BhY2UoMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhpbkNvbnN0cmFpbnQobnVsbHB0cikge30KLSAgICAvLyBnZXR0ZXJzCi0gICAgZnJDb29yZCBnZXRFb2xTcGFjZSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBlb2xTcGFjZTsKLSAgICB9Ci0gICAgZnJDb29yZCBnZXRFb2xXaWR0aCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBlb2xXaWR0aDsKLSAgICB9Ci0gICAgYm9vbCBoYXNFeGFjdFdpZHRoKCkgY29uc3QgewotICAgICAgcmV0dXJuIGV4YWN0V2lkdGg7Ci0gICAgfQotICAgIGJvb2wgaGFzV3JvbmdEaXJTcGFjaW5nKCkgY29uc3QgewotICAgICAgcmV0dXJuIHdyb25nRGlyU3BhY2luZzsKLSAgICB9Ci0gICAgZnJDb29yZCBnZXRXcm9uZ0RpclNwYWNlKCkgY29uc3QgewotICAgICAgcmV0dXJuIHdyb25nRGlyU3BhY2U7Ci0gICAgfQotICAgIGJvb2wgaGFzV2l0aGluQ29uc3RyYWludCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiAod2l0aGluQ29uc3RyYWludCkgPyB0cnVlIDogZmFsc2U7Ci0gICAgfQotICAgIHN0ZDo6c2hhcmVkX3B0cjxmckxlZjU4U3BhY2luZ0VuZE9mTGluZVdpdGhpbkNvbnN0cmFpbnQ+IGdldFdpdGhpbkNvbnN0cmFpbnQoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gd2l0aGluQ29uc3RyYWludDsKLSAgICB9Ci0gICAgYm9vbCBoYXNUb0NvbmNhdmVDb3JuZXJDb25zdHJhaW50KCkgY29uc3QgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBib29sIGhhc1RvTm90Y2hMZW5ndGhDb25zdHJhaW50KCkgY29uc3QgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAvLyBzZXR0ZXJzCi0gICAgdm9pZCBzZXRFb2woZnJDb29yZCBlb2xTcGFjZUluLCBmckNvb3JkIGVvbFdpZHRoSW4sIGJvb2wgZXhhY3RXaWR0aEluID0gZmFsc2UpIHsKLSAgICAgIGVvbFNwYWNlID0gZW9sU3BhY2VJbjsKLSAgICAgIGVvbFdpZHRoID0gZW9sV2lkdGhJbjsKLSAgICAgIGV4YWN0V2lkdGggPSBleGFjdFdpZHRoSW47Ci0gICAgfQotICAgIHZvaWQgc2V0V3JvbmdEaXJTcGFjZShib29sIGluKSB7Ci0gICAgICB3cm9uZ0RpclNwYWNpbmcgPSB0cnVlOwotICAgICAgd3JvbmdEaXJTcGFjZSA9IGluOwotICAgIH0KLSAgICB2b2lkIHNldFdpdGhpbkNvbnN0cmFpbnQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGZyTGVmNThTcGFjaW5nRW5kT2ZMaW5lV2l0aGluQ29uc3RyYWludD4gJmluKSB7Ci0gICAgICB3aXRoaW5Db25zdHJhaW50ID0gaW47Ci0gICAgfQotICAgIC8vIG90aGVycwotICAgIGZyQ29uc3RyYWludFR5cGVFbnVtIHR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiBmckNvbnN0cmFpbnRUeXBlRW51bTo6ZnJjTGVmNThTcGFjaW5nRW5kT2ZMaW5lQ29uc3RyYWludDsKLSAgICB9Ci0gIHByb3RlY3RlZDoKLSAgICBmckNvb3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlb2xTcGFjZTsKLSAgICBmckNvb3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlb2xXaWR0aDsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGFjdFdpZHRoOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyb25nRGlyU3BhY2luZzsKLSAgICBmckNvb3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cm9uZ0RpclNwYWNlOwotICAgIHN0ZDo6c2hhcmVkX3B0cjxmckxlZjU4U3BhY2luZ0VuZE9mTGluZVdpdGhpbkNvbnN0cmFpbnQ+IHdpdGhpbkNvbnN0cmFpbnQ7Ci0gIH07Ci0KLSAgY2xhc3MgZnJMZWY1OENvcm5lclNwYWNpbmdTcGFjaW5nQ29uc3RyYWludDsKLQotICAvLyBTUEFDSU5HIENvbnN0cmFpbnRzCi0gIGNsYXNzIGZyU3BhY2luZ0NvbnN0cmFpbnQgOiBwdWJsaWMgZnJDb25zdHJhaW50IHsKLSAgcHVibGljOgotICAgIGZyU3BhY2luZ0NvbnN0cmFpbnQoKTogbWluU3BhY2luZygwKSB7fQotICAgIGZyU3BhY2luZ0NvbnN0cmFpbnQoZnJDb29yZCAmbWluU3BhY2luZ0luKTogbWluU3BhY2luZyhtaW5TcGFjaW5nSW4pIHt9Ci0KLSAgICAvLyBnZXR0ZXIKLSAgICBmckNvb3JkIGdldE1pblNwYWNpbmcoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbWluU3BhY2luZzsKLSAgICB9Ci0gICAgLy8gc2V0dGVyCi0gICAgdm9pZCBzZXRNaW5TcGFjaW5nKGZyQ29vcmQgJm1pblNwYWNpbmdJbikgewotICAgICAgbWluU3BhY2luZyA9IG1pblNwYWNpbmdJbjsKLSAgICB9Ci0gICAgLy8gY2hlY2sKLSAgICBmckNvbnN0cmFpbnRUeXBlRW51bSB0eXBlSWQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gZnJDb25zdHJhaW50VHlwZUVudW06OmZyY1NwYWNpbmdDb25zdHJhaW50OwotICAgIH0KLSAgcHJvdGVjdGVkOgotICAgIGZyQ29vcmQgbWluU3BhY2luZzsKLSAgfTsKLQotICAvLyBQQVJBTExFTEVER0UKLSAgLy9jbGFzcyBmclNwYWNpbmdFbmRPZkxpbmVQYXJhbGxlbEVkZ2VDb25zdHJhaW50IDogcHVibGljIGZyQ29uc3RyYWludCB7Ci0gIC8vcHVibGljOgotICAvLyAgLy8gY29uc3RydWN0b3IKLSAgLy8gIGZyU3BhY2luZ0VuZE9mTGluZVBhcmFsbGVsRWRnZUNvbnN0cmFpbnQoKTogcGFyU3BhY2UoMCksIHBhcldpdGhpbigwKSwgaXNUd29FZGdlcyhmYWxzZSkge30KLSAgLy8gIGZyU3BhY2luZ0VuZE9mTGluZVBhcmFsbGVsRWRnZUNvbnN0cmFpbnQoZnJDb29yZCBwYXJTcGFjZUluLCBmckNvb3JkIHBhcldpdGhpbkluLCBib29sIGlzVHdvRWRnZXNJbikKLSAgLy8gICAgOiBwYXJTcGFjZShwYXJTcGFjZUluKSwgcGFyV2l0aGluKHBhcldpdGhpbkluKSwgaXNUd29FZGdlcyhpc1R3b0VkZ2VzSW4pIHt9Ci0gIC8vICAvLyBnZXR0ZXJzCi0gIC8vICBmckNvb3JkIGdldFBhclNwYWNlKCkgY29uc3QgewotICAvLyAgICByZXR1cm4gcGFyU3BhY2U7Ci0gIC8vICB9Ci0gIC8vICBmckNvb3JkIGdldFBhcldpdGhpbigpIGNvbnN0IHsKLSAgLy8gICAgcmV0dXJuIHBhcldpdGhpbjsKLSAgLy8gIH0KLSAgLy8gIGJvb2wgaGFzVHdvRWRnZXMoKSBjb25zdCB7Ci0gIC8vICAgIHJldHVybiBpc1R3b0VkZ2VzOwotICAvLyAgfQotICAvLyAgLy8gc2V0dGVycwotICAvLyAgdm9pZCBzZXRQYXJTcGFjZShmckNvb3JkIHBhclNwYWNlSW4pIHsKLSAgLy8gICAgcGFyU3BhY2UgPSBwYXJTcGFjZUluOwotICAvLyAgfQotICAvLyAgdm9pZCBzZXRQYXJXaXRoaW4oZnJDb29yZCBwYXJXaXRoaW5JbikgewotICAvLyAgICBwYXJXaXRoaW4gPSBwYXJXaXRoaW5JbjsKLSAgLy8gIH0KLSAgLy8gIHZvaWQgc2V0VHdvRWRnZXMoYm9vbCBpc1R3b0VkZ2VzSW4pIHsKLSAgLy8gICAgaXNUd29FZGdlcyA9IGlzVHdvRWRnZXNJbjsKLSAgLy8gIH0KLSAgLy8gIGZyQ29uc3RyYWludFR5cGVFbnVtIHR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgLy8gICAgcmV0dXJuIGZyQ29uc3RyYWludFR5cGVFbnVtOjpmcmNTcGFjaW5nRW5kT2ZMaW5lUGFyYWxsZWxFZGdlQ29uc3RyYWludDsKLSAgLy8gIH0KLQotICAvL3Byb3RlY3RlZDoKLSAgLy8gIGZyQ29vcmQgcGFyU3BhY2UsIHBhcldpdGhpbjsKLSAgLy8gIGJvb2wgaXNUd29FZGdlczsKLSAgLy99OwotCi0gIC8vY2xhc3MgZnJMZWY1OFNwYWNpbmdFbmRPZkxpbmVQYXJhbGxlbEVkZ2VDb25zdHJhaW50IDogcHVibGljIGZyU3BhY2luZ0VuZE9mTGluZVBhcmFsbGVsRWRnZUNvbnN0cmFpbnQgewotICAvL3B1YmxpYzoKLSAgLy8gIC8vIGNvbnN0cnVjdG9ycwotICAvLyAgZnJMZWY1OFNwYWNpbmdFbmRPZkxpbmVQYXJhbGxlbEVkZ2VDb25zdHJhaW50KCk6IGZyU3BhY2luZ0VuZE9mTGluZVBhcmFsbGVsRWRnZUNvbnN0cmFpbnQoKSwgc3VidHJhY3RFb2xXaWR0aChmYWxzZSkge30KLSAgLy8gIC8vIGdldHRlcnMKLSAgLy8gIGJvb2wgaGFzU3VidHJhY3RFb2xXaWR0aCgpIGNvbnN0IHsKLSAgLy8gICAgcmV0dXJuIHN1YnRyYWN0RW9sV2lkdGg7Ci0gIC8vICB9Ci0gIC8vICAvLyBzZXR0ZXJzCi0gIC8vICB2b2lkIHNldFN1YnRyYWN0RW9sV2lkdGgoYm9vbCBpbikgewotICAvLyAgICBzdWJ0cmFjdEVvbFdpZHRoID0gaW47Ci0gIC8vICB9Ci0gIC8vICAvLyBvdGhlcnMKLSAgLy8gIGZyQ29uc3RyYWludFR5cGVFbnVtIHR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgLy8gICAgcmV0dXJuIGZyQ29uc3RyYWludFR5cGVFbnVtOjpmcmNMZWY1OFNwYWNpbmdFbmRPZkxpbmVQYXJhbGxlbEVkZ2VDb25zdHJhaW50OwotICAvLyAgfQotICAvL3Byb3RlY3RlZDoKLSAgLy8gIGJvb2wgc3VidHJhY3RFb2xXaWR0aDsKLSAgLy99OwotCi0gIC8vIEVPTCBzcGFjaW5nCi0gIGNsYXNzIGZyU3BhY2luZ0VuZE9mTGluZUNvbnN0cmFpbnQgOiBwdWJsaWMgZnJTcGFjaW5nQ29uc3RyYWludCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBjb25zdHJ1Y3RvcgotICAgIGZyU3BhY2luZ0VuZE9mTGluZUNvbnN0cmFpbnQoKTogZnJTcGFjaW5nQ29uc3RyYWludCgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVvbFdpZHRoKC0xKSwgZW9sV2l0aGluKC0xKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJTcGFjZSgtMSksIHBhcldpdGhpbigtMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1R3b0VkZ2VzKGZhbHNlKSB7fQotICAgIC8vIGdldHRlcgotICAgIGZyQ29vcmQgZ2V0RW9sV2lkdGgoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gZW9sV2lkdGg7Ci0gICAgfQotICAgIGZyQ29vcmQgZ2V0RW9sV2l0aGluKCkgY29uc3QgewotICAgICAgcmV0dXJuIGVvbFdpdGhpbjsKLSAgICB9Ci0gICAgZnJDb29yZCBnZXRQYXJTcGFjZSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBwYXJTcGFjZTsKLSAgICB9Ci0gICAgZnJDb29yZCBnZXRQYXJXaXRoaW4oKSBjb25zdCB7Ci0gICAgICByZXR1cm4gcGFyV2l0aGluOwotICAgIH0KLSAgICBib29sIGhhc1BhcmFsbGVsRWRnZSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiAoKHBhclNwYWNlID09IC0xKSA/IGZhbHNlIDogdHJ1ZSk7Ci0gICAgfQotICAgIGJvb2wgaGFzVHdvRWRnZXMoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gaXNUd29FZGdlczsKLSAgICB9Ci0gICAgLy9ib29sIGhhc1BhcmFsbGVsRWRnZSgpIGNvbnN0IHsKLSAgICAvLyAgcmV0dXJuIChwYXJhbGxlbEVkZ2VDb25zdHJhaW50KSA/IHRydWUgOiBmYWxzZTsKLSAgICAvL30KLSAgICAvL3N0ZDo6c2hhcmVkX3B0cjxmclNwYWNpbmdFbmRPZkxpbmVQYXJhbGxlbEVkZ2VDb25zdHJhaW50PiBnZXRQYXJhbGxlbEVkZ2UoKSBjb25zdCB7Ci0gICAgLy8gIHJldHVybiBwYXJhbGxlbEVkZ2VDb25zdHJhaW50OwotICAgIC8vfQotICAgIC8vIHNldHRlcgotICAgIHZvaWQgc2V0RW9sV2l0aGluKGZyQ29vcmQgJmVvbFdpdGhpbkluKSB7Ci0gICAgICBlb2xXaXRoaW4gPSBlb2xXaXRoaW5JbjsKLSAgICB9Ci0gICAgdm9pZCBzZXRFb2xXaWR0aChmckNvb3JkICZlb2xXaWR0aEluKSB7Ci0gICAgICBlb2xXaWR0aCA9IGVvbFdpZHRoSW47Ci0gICAgfQotICAgIHZvaWQgc2V0UGFyU3BhY2UoZnJDb29yZCBwYXJTcGFjZUluKSB7Ci0gICAgICBwYXJTcGFjZSA9IHBhclNwYWNlSW47Ci0gICAgfQotICAgIHZvaWQgc2V0UGFyV2l0aGluKGZyQ29vcmQgcGFyV2l0aGluSW4pIHsKLSAgICAgIHBhcldpdGhpbiA9IHBhcldpdGhpbkluOwotICAgIH0KLSAgICB2b2lkIHNldFR3b0VkZ2VzKGJvb2wgaXNUd29FZGdlc0luKSB7Ci0gICAgICBpc1R3b0VkZ2VzID0gaXNUd29FZGdlc0luOwotICAgIH0KLSAgICAvL3ZvaWQgc2V0UGFyYWxsZWxFZGdlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxmclNwYWNpbmdFbmRPZkxpbmVQYXJhbGxlbEVkZ2VDb25zdHJhaW50PiAmcGFyYWxsZWxFZGdlQ29uc3RyYWludEluKSB7Ci0gICAgLy8gIHBhcmFsbGVsRWRnZUNvbnN0cmFpbnQgPSBwYXJhbGxlbEVkZ2VDb25zdHJhaW50SW47Ci0gICAgLy99Ci0gICAgZnJDb25zdHJhaW50VHlwZUVudW0gdHlwZUlkKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIGZyQ29uc3RyYWludFR5cGVFbnVtOjpmcmNTcGFjaW5nRW5kT2ZMaW5lQ29uc3RyYWludDsKLSAgICB9Ci0KLSAgcHJvdGVjdGVkOgotICAgIGZyQ29vcmQgZW9sV2lkdGgsIGVvbFdpdGhpbjsKLSAgICBmckNvb3JkIHBhclNwYWNlLCBwYXJXaXRoaW47Ci0gICAgYm9vbCBpc1R3b0VkZ2VzOwotICAgIC8vc3RkOjpzaGFyZWRfcHRyPGZyU3BhY2luZ0VuZE9mTGluZVBhcmFsbGVsRWRnZUNvbnN0cmFpbnQ+IHBhcmFsbGVsRWRnZUNvbnN0cmFpbnQ7Ci0gIH07Ci0KLSAgLy9jbGFzcyBmckxlZjU4U3BhY2luZ0VuZE9mTGluZUVuZFRvRW5kQ29uc3RyYWludDogcHVibGljIGZyQ29uc3RyYWludCB7Ci0gIC8vcHVibGljOgotICAvLyAgOwotICAvL3Byb3RlY3RlZDoKLSAgLy8gIDsKLSAgLy99OwotCi0gIC8vY2xhc3MgZnJMZWY1OFNwYWNpbmdFbmRPZkxpbmVDb25zdHJhaW50IDogcHVibGljIGZyU3BhY2luZ0VuZE9mTGluZUNvbnN0cmFpbnQgewotICAvL3B1YmxpYzoKLSAgLy8gIC8vIGNvbnN0cnVjdG9ycwotICAvLyAgZnJMZWY1OFNwYWNpbmdFbmRPZkxpbmVDb25zdHJhaW50KCkgOiBmclNwYWNpbmdFbmRPZkxpbmVDb25zdHJhaW50KCksIHNhbWVNYXNrKGZhbHNlKSwgZXhhY3RXaWR0aChmYWxzZSksCi0gIC8vICAgIHdyb25nRGlyU3BhY2luZyhmYWxzZSksIHdyb25nRGlyU3BhY2UoMCksIGVuZFRvRW5kKGZhbHNlKSwgZW5kVG9FbmRTcGFjZSgwKSwgbWF4TGVuZ3RoKGZhbHNlKSwgCi0gIC8vICAgIG1pbkxlbmd0aChmYWxzZSksIGxlbmd0aCgwKSwgdHdvU2lkZXMoZmFsc2UpIHt9Ci0gIC8vICAvLyBnZXR0ZXJzCi0gIC8vICBzdGQ6OnNoYXJlZF9wdHI8ZnJMZWY1OFNwYWNpbmdFbmRPZkxpbmVQYXJhbGxlbEVkZ2VDb25zdHJhaW50PiBnZXRQYXJhbGxlbEVkZ2UoKSBjb25zdCB7Ci0gIC8vICAgIHJldHVybiBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PGZyTGVmNThTcGFjaW5nRW5kT2ZMaW5lUGFyYWxsZWxFZGdlQ29uc3RyYWludD4ocGFyYWxsZWxFZGdlQ29uc3RyYWludCk7Ci0gIC8vICB9Ci0gIC8vICBib29sIGhhc1NhbWVNYXNrKCkgY29uc3QgewotICAvLyAgICByZXR1cm4gc2FtZU1hc2s7Ci0gIC8vICB9Ci0gIC8vICBib29sIGhhc0V4YWN0V2lkdGgoKSBjb25zdCB7Ci0gIC8vICAgIHJldHVybiBleGFjdFdpZHRoOwotICAvLyAgfQotICAvLyAgYm9vbCBoYXNXcm9uZ0RpclNwYWNpbmcoKSBjb25zdCB7Ci0gIC8vICAgIHJldHVybiB3cm9uZ0RpclNwYWNpbmc7Ci0gIC8vICB9Ci0gIC8vICBmckNvb3JkIGdldFdyb25nRGlyU3BhY2UoKSBjb25zdCB7Ci0gIC8vICAgIHJldHVybiB3cm9uZ0RpclNwYWNlOwotICAvLyAgfQotICAvLyAgYm9vbCBoYXNFbmRUb0VuZCgpIGNvbnN0IHsKLSAgLy8gICAgcmV0dXJuIGVuZFRvRW5kOwotICAvLyAgfQotICAvLyAgZnJDb29yZCBnZXRFbmRUb0VuZFNwYWNlKCkgY29uc3QgewotICAvLyAgICByZXR1cm4gZW5kVG9FbmRTcGFjZTsKLSAgLy8gIH0KLSAgLy8gIGJvb2wgaGFzTWF4TGVuZ3RoKCkgY29uc3QgewotICAvLyAgICByZXR1cm4gbWF4TGVuZ3RoOwotICAvLyAgfQotICAvLyAgYm9vbCBoYXNNaW5MZW5ndGgoKSBjb25zdCB7Ci0gIC8vICAgIHJldHVybiBtaW5MZW5ndGg7Ci0gIC8vICB9Ci0gIC8vICBmckNvb3JkIGdldExlbmd0aCgpIGNvbnN0IHsKLSAgLy8gICAgcmV0dXJuIGxlbmd0aDsKLSAgLy8gIH0KLSAgLy8gIGJvb2wgaGFzVHdvU2lkZXMoKSBjb25zdCB7Ci0gIC8vICAgIHJldHVybiB0d29TaWRlczsKLSAgLy8gIH0KLSAgLy8gIC8vIHNldHRlcnMKLSAgLy8gIHZvaWQgc2V0U2FtZU1hc2soYm9vbCBpbikgewotICAvLyAgICBzYW1lTWFzayA9IGluOwotICAvLyAgfQotICAvLyAgdm9pZCBzZXRFeGFjdFdpZHRoKGJvb2wgaW4pIHsKLSAgLy8gICAgZXhhY3RXaWR0aCA9IGluOwotICAvLyAgfQotICAvLyAgdm9pZCBzZXRXcm9uZ0RpclNwYWNlKGZyQ29vcmQgaW4pIHsKLSAgLy8gICAgd3JvbmdEaXJTcGFjaW5nID0gdHJ1ZTsKLSAgLy8gICAgd3JvbmdEaXJTcGFjZSAgID0gaW47Ci0gIC8vICB9Ci0gIC8vICB2b2lkIHNldEVuZFRvRW5kU3BhY2UoZnJDb29yZCBpbikgewotICAvLyAgICBlbmRUb0VuZCAgICAgID0gdHJ1ZTsKLSAgLy8gICAgZW5kVG9FbmRTcGFjZSA9IGluOwotICAvLyAgfQotICAvLyAgdm9pZCBzZXRNYXhMZW5ndGgoZnJDb29yZCBpbikgewotICAvLyAgICBtYXhMZW5ndGggPSB0cnVlOwotICAvLyAgICBsZW5ndGggPSBpbjsKLSAgLy8gIH0KLSAgLy8gIHZvaWQgc2V0TWluTGVuZ3RoKGZyQ29vcmQgaW4pIHsKLSAgLy8gICAgbWluTGVuZ3RoID0gdHJ1ZTsKLSAgLy8gICAgbGVuZ3RoID0gaW47Ci0gIC8vICB9Ci0gIC8vICB2b2lkIHNldFR3b1NpZGVzKGJvb2wgaW4pIHsKLSAgLy8gICAgdHdvU2lkZXMgPSBpbjsKLSAgLy8gIH0KLSAgLy8gIC8vIG90aGVycwotICAvLyAgZnJDb25zdHJhaW50VHlwZUVudW0gdHlwZUlkKCkgY29uc3Qgb3ZlcnJpZGUgewotICAvLyAgICByZXR1cm4gZnJDb25zdHJhaW50VHlwZUVudW06OmZyY0xlZjU4U3BhY2luZ0VuZE9mTGluZUNvbnN0cmFpbnQ7Ci0gIC8vICB9Ci0gIC8vcHJvdGVjdGVkOgotICAvLyAgYm9vbCBzYW1lTWFzazsKLSAgLy8gIGJvb2wgZXhhY3RXaWR0aDsKLSAgLy8gIGJvb2wgd3JvbmdEaXJTcGFjaW5nOwotICAvLyAgZnJDb29yZCB3cm9uZ0RpclNwYWNlOwotICAvLyAgYm9vbCBlbmRUb0VuZDsKLSAgLy8gIGZyQ29vcmQgZW5kVG9FbmRTcGFjZTsKLSAgLy8gIGJvb2wgbWF4TGVuZ3RoOwotICAvLyAgYm9vbCBtaW5MZW5ndGg7Ci0gIC8vICBmckNvb3JkIGxlbmd0aDsKLSAgLy8gIGJvb2wgdHdvU2lkZXM7Ci0gIC8vfTsKLQotCi0gIGNsYXNzIGZyTGVmNThDdXRTcGFjaW5nTGF5ZXJDb25zdHJhaW50IDogcHVibGljIGZyQ29uc3RyYWludCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBjb25zdHJ1Y3RvcgotICAgIGZyTGVmNThDdXRTcGFjaW5nTGF5ZXJDb25zdHJhaW50KCkgOiBzZWNvbmRMYXllck5hbWUoIiIpLCBjbGFzc05hbWUoIiIpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFib3ZlV2lkdGgoZmFsc2UpLCBhYm92ZVdpZHRoKDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW5jbG9zdXJlKGZhbHNlKSwgZW5jbG9zdXJlKDApIHt9Ci0gICAgLy8gZ2V0dGVyCi0gICAgLy9mclVJbnQ0IGdldFNlY29uZExheWVyTnVtKCkgY29uc3QgewotICAgIC8vICByZXR1cm4gc2Vjb25kTGF5ZXJOdW07Ci0gICAgLy99Ci0gICAgZnJTdHJpbmcgZ2V0U2Vjb25kTGF5ZXJOYW1lKCkgY29uc3QgewotICAgICAgcmV0dXJuIHNlY29uZExheWVyTmFtZTsKLSAgICB9Ci0gICAgLy8gY3V0Y2xhc3MKLSAgICBib29sIGhhc0N1dENsYXNzKCkgY29uc3QgewotICAgICAgcmV0dXJuIChjbGFzc05hbWUgPT0gIiIpOwotICAgIH0KLSAgICBmclN0cmluZyBnZXRDbGFzc05hbWUoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gY2xhc3NOYW1lOwotICAgIH0KLSAgICB2b2lkIGdldENsYXNzTmFtZShmclN0cmluZyAmaW4pIGNvbnN0IHsKLSAgICAgIGluID0gY2xhc3NOYW1lOwotICAgIH0KLSAgICBib29sIGhhc0Fib3ZlV2lkdGgoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gaEFib3ZlV2lkdGg7Ci0gICAgfQotICAgIGZyQ29vcmQgZ2V0QWJvdmVXaWR0aCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBhYm92ZVdpZHRoOwotICAgIH0KLSAgICBib29sIGhhc0VuY2xvc3VyZSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBoRW5jbG9zdXJlOwotICAgIH0KLSAgICBmckNvb3JkIGdldEVuY2xvc3VyZSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBlbmNsb3N1cmU7Ci0gICAgfQotCi0gICAgLy8gc2V0dGVyCi0gICAgLy92b2lkIHNldFNlY29uZExheWVyTnVtKGZyTGF5ZXJOdW0gaW4pIHsKLSAgICAvLyAgc2Vjb25kTGF5ZXJOdW0gPSBpbjsKLSAgICAvL30KLSAgICB2b2lkIHNldFNlY29uZExheWVyTmFtZShjb25zdCBmclN0cmluZyAmaW4pIHsKLSAgICAgIHNlY29uZExheWVyTmFtZSA9IGluOwotICAgIH0KLSAgICB2b2lkIHNldEN1dENsYXNzKGNvbnN0IGZyU3RyaW5nICZjbGFzc05hbWVJbikgewotICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lSW47Ci0gICAgfQotICAgIHZvaWQgc2V0QWJvdmVXaWR0aChmckNvb3JkIGluKSB7Ci0gICAgICBoQWJvdmVXaWR0aCA9IHRydWU7Ci0gICAgICBhYm92ZVdpZHRoICA9IGluOwotICAgIH0KLSAgICB2b2lkIHNldEVuY2xvc3VyZShmckNvb3JkIGluKSB7Ci0gICAgICBoRW5jbG9zdXJlID0gdHJ1ZTsKLSAgICAgIGVuY2xvc3VyZSAgPSBpbjsKLSAgICB9Ci0KLSAgICAvLyBvdGhlcnMKLSAgICBmckNvbnN0cmFpbnRUeXBlRW51bSB0eXBlSWQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gZnJDb25zdHJhaW50VHlwZUVudW06OmZyY0xlZjU4Q3V0U3BhY2luZ0xheWVyQ29uc3RyYWludDsKLSAgICB9Ci0gIHByb3RlY3RlZDoKLSAgICAvL2ZyVUludDQgIHNlY29uZExheWVyTnVtOwotICAgIGZyU3RyaW5nIHNlY29uZExheWVyTmFtZTsKLSAgICAvLyBjdXRjbGFzcwotICAgIGZyU3RyaW5nIGNsYXNzTmFtZTsKLSAgICBib29sICAgICBoQWJvdmVXaWR0aDsKLSAgICBmckNvb3JkICBhYm92ZVdpZHRoOwotICAgIGJvb2wgICAgIGhFbmNsb3N1cmU7Ci0gICAgZnJDb29yZCAgZW5jbG9zdXJlOwotICB9OwotCi0gIGNsYXNzIGZyTGVmNThDdXRTcGFjaW5nQWRqYWNlbnRDdXRzQ29uc3RyYWludCA6IHB1YmxpYyBmckNvbnN0cmFpbnQgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3IKLSAgICBmckxlZjU4Q3V0U3BhY2luZ0FkamFjZW50Q3V0c0NvbnN0cmFpbnQoKSA6IG51bUFkakN1dHMoMCksIGhUd29DdXRzKGZhbHNlKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d29DdXRzKDApLCBoVHdvQ3V0c1NwYWNpbmcoZmFsc2UpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR3b0N1dHNTcGFjaW5nKDApLCBzYW1lQ3V0KGZhbHNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dFdpdGhpbjEoMCksIGN1dFdpdGhpbjIoMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUoIiIpLCB0b0FsbChmYWxzZSkge30KLSAgICAvLyBnZXR0ZXIKLSAgICBmclVJbnQ0IGdldE51bUFkakN1dHMoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbnVtQWRqQ3V0czsKLSAgICB9Ci0gICAgLy8gdHdvIGN1dHMKLSAgICBib29sIGhhc1R3b0N1dHMoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gaFR3b0N1dHM7Ci0gICAgfQotICAgIGZyVUludDQgZ2V0VHdvQ3V0cygpIGNvbnN0IHsKLSAgICAgIHJldHVybiB0d29DdXRzOwotICAgIH0KLSAgICBib29sIGhhc1R3b0N1dHNTcGFjaW5nKCkgY29uc3QgewotICAgICAgcmV0dXJuIGhUd29DdXRzU3BhY2luZzsKLSAgICB9Ci0gICAgZnJDb29yZCBnZXRUd29DdXRzU3BhY2luZygpIGNvbnN0IHsKLSAgICAgIHJldHVybiB0d29DdXRzU3BhY2luZzsKLSAgICB9Ci0gICAgYm9vbCBpc1NhbWVDdXQoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gc2FtZUN1dDsKLSAgICB9Ci0gICAgLy8gd2l0aGluCi0gICAgZnJDb29yZCBnZXRDdXRXaXRoaW4xKCkgY29uc3QgewotICAgICAgcmV0dXJuIGN1dFdpdGhpbjE7Ci0gICAgfQotICAgIGZyQ29vcmQgZ2V0Q3V0V2l0aGluMigpIGNvbnN0IHsKLSAgICAgIHJldHVybiBjdXRXaXRoaW4yOwotICAgIH0KLSAgICAvLyBjdXRjbGFzcwotICAgIGJvb2wgaGFzQ3V0Q2xhc3MoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gKGNsYXNzTmFtZSA9PSAiIik7Ci0gICAgfQotICAgIGZyU3RyaW5nIGdldENsYXNzTmFtZSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBjbGFzc05hbWU7Ci0gICAgfQotICAgIHZvaWQgZ2V0Q2xhc3NOYW1lKGZyU3RyaW5nICZpbikgY29uc3QgewotICAgICAgaW4gPSBjbGFzc05hbWU7Ci0gICAgfQotICAgIGJvb2wgaXNUb0FsbCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiB0b0FsbDsKLSAgICB9Ci0KLSAgICAvLyBzZXR0ZXIKLSAgICB2b2lkIHNldE51bUFkakN1dHMoZnJVSW50NCBpbikgewotICAgICAgbnVtQWRqQ3V0cyA9IGluOwotICAgIH0KLSAgICB2b2lkIHNldFR3b0N1dHMoZnJVSW50NCB0d29DdXRzSW4sIGJvb2wgc2FtZUN1dEluID0gZmFsc2UpIHsKLSAgICAgIGhUd29DdXRzICAgICAgICA9IHRydWU7Ci0gICAgICB0d29DdXRzICAgICAgICAgPSB0d29DdXRzSW47Ci0gICAgICBzYW1lQ3V0ICAgICAgICAgPSBzYW1lQ3V0SW47Ci0gICAgfQotICAgIHZvaWQgc2V0VHdvQ3V0cyhmclVJbnQ0IHR3b0N1dHNJbiwgZnJDb29yZCB0d29DdXRzU3BhY2luZ0luLCBib29sIHNhbWVDdXRJbiA9IGZhbHNlKSB7Ci0gICAgICBoVHdvQ3V0cyAgICAgICAgPSB0cnVlOwotICAgICAgdHdvQ3V0cyAgICAgICAgID0gdHdvQ3V0c0luOwotICAgICAgaFR3b0N1dHNTcGFjaW5nID0gdHJ1ZTsKLSAgICAgIHR3b0N1dHNTcGFjaW5nICA9IHR3b0N1dHNTcGFjaW5nSW47Ci0gICAgICBzYW1lQ3V0ICAgICAgICAgPSBzYW1lQ3V0SW47Ci0gICAgfQotICAgIHZvaWQgc2V0V2l0aGluKGZyQ29vcmQgY3V0V2l0aGluMUluLCBmckNvb3JkIGN1dFdpdGhpbjJJbikgewotICAgICAgY3V0V2l0aGluMSA9IGN1dFdpdGhpbjFJbjsKLSAgICAgIGN1dFdpdGhpbjIgPSBjdXRXaXRoaW4ySW47Ci0gICAgfQotICAgIHZvaWQgc2V0Q3V0Q2xhc3MoY29uc3QgZnJTdHJpbmcgJmNsYXNzTmFtZUluLCBib29sIHRvQWxsSW4pIHsKLSAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZUluOwotICAgICAgdG9BbGwgICAgID0gdG9BbGxJbjsKLSAgICB9Ci0KLSAgICAvLyBvdGhlcnMKLSAgICBmckNvbnN0cmFpbnRUeXBlRW51bSB0eXBlSWQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gZnJDb25zdHJhaW50VHlwZUVudW06OmZyY0xlZjU4Q3V0U3BhY2luZ0FkamFjZW50Q3V0c0NvbnN0cmFpbnQ7Ci0gICAgfQotICBwcm90ZWN0ZWQ6Ci0gICAgZnJVSW50NCAgbnVtQWRqQ3V0czsKLSAgICAvLyB0d28gY3V0cwotICAgIGJvb2wgICAgIGhUd29DdXRzOwotICAgIGZyVUludDQgIHR3b0N1dHM7Ci0gICAgYm9vbCAgICAgaFR3b0N1dHNTcGFjaW5nOwotICAgIGZyQ29vcmQgIHR3b0N1dHNTcGFjaW5nOwotICAgIGJvb2wgICAgIHNhbWVDdXQ7Ci0gICAgLy8gd2l0aGluCi0gICAgZnJDb29yZCAgY3V0V2l0aGluMTsKLSAgICBmckNvb3JkICBjdXRXaXRoaW4yOwotICAgIC8vIGN1dGNsYXNzCi0gICAgZnJTdHJpbmcgY2xhc3NOYW1lOwotICAgIGJvb2wgICAgIHRvQWxsOwotICB9OwotCi0gIGNsYXNzIGZyTGVmNThDdXRTcGFjaW5nUGFyYWxsZWxXaXRoaW5Db25zdHJhaW50IDogcHVibGljIGZyQ29uc3RyYWludCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBjb25zdHJ1Y3RvcgotICAgIGZyTGVmNThDdXRTcGFjaW5nUGFyYWxsZWxXaXRoaW5Db25zdHJhaW50KCkgOiB3aXRoaW4oMCksIGV4Y2VwdFNhbWVOZXQoZmFsc2UpLCBjbGFzc05hbWUoIiIpLCBsb25nRWRnZU9ubHkoZmFsc2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNsb3N1cmUoMCksIGFib3ZlKGZhbHNlKSwgcGFyTGVuZ3RoKDApLCBwYXJXaXRoaW4oMCkge30KLSAgICAvLyBnZXR0ZXIKLSAgICBmckNvb3JkIGdldFdpdGhpbigpIGNvbnN0IHsKLSAgICAgIHJldHVybiB3aXRoaW47Ci0gICAgfQotICAgIGJvb2wgaXNFeGNlcHRTYW1lTmV0KCkgY29uc3QgewotICAgICAgcmV0dXJuIGV4Y2VwdFNhbWVOZXQ7Ci0gICAgfQotICAgIGJvb2wgaGFzQ3V0Q2xhc3MoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gKGNsYXNzTmFtZSA9PSAiIik7Ci0gICAgfQotICAgIGZyU3RyaW5nIGdldENsYXNzTmFtZSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBjbGFzc05hbWU7Ci0gICAgfQotICAgIHZvaWQgZ2V0Q2xhc3NOYW1lKGZyU3RyaW5nICZpbikgY29uc3QgewotICAgICAgaW4gPSBjbGFzc05hbWU7Ci0gICAgfQotICAgIGJvb2wgaXNMb25nRWRnZU9ubHkoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbG9uZ0VkZ2VPbmx5OwotICAgIH0KLSAgICBib29sIGlzRW5jbG9zdXJlKCkgY29uc3QgewotICAgICAgcmV0dXJuIChsb25nRWRnZU9ubHkpID8gZmFsc2UgOiB0cnVlOwotICAgIH0KLSAgICBmckNvb3JkIGdldEVuY2xvc3VyZSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBlbmNsb3N1cmU7Ci0gICAgfQotICAgIGJvb2wgaXNBYm92ZSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBhYm92ZTsKLSAgICB9Ci0gICAgZnJDb29yZCBnZXRQYXJMZW5ndGgoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gcGFyTGVuZ3RoOwotICAgIH0KLSAgICBmckNvb3JkIGdldFBhcldpdGhpbigpIGNvbnN0IHsKLSAgICAgIHJldHVybiBwYXJXaXRoaW47Ci0gICAgfQotCi0gICAgLy8gc2V0dGVyCi0gICAgdm9pZCBzZXRQYXJhbGxlbFdpdGhpbihmckNvb3JkIHdpdGhpbkluLCBib29sIGV4Y2VwdFNhbWVOZXRJbikgewotICAgICAgd2l0aGluICAgICAgICA9IHdpdGhpbkluOwotICAgICAgZXhjZXB0U2FtZU5ldCA9IGV4Y2VwdFNhbWVOZXRJbjsKLSAgICB9Ci0gICAgdm9pZCBzZXRDbGFzc05hbWUoY29uc3QgZnJTdHJpbmcgJmluKSB7Ci0gICAgICBjbGFzc05hbWUgPSBpbjsKLSAgICB9Ci0gICAgdm9pZCBzZXRMb25nRWRnZU9ubHkoYm9vbCBpbikgewotICAgICAgbG9uZ0VkZ2VPbmx5ID0gaW47Ci0gICAgfQotICAgIHZvaWQgc2V0RW5jbG9zdXJlKGZyQ29vcmQgZW5jbG9zdXJlSW4sIGJvb2wgYWJvdmVJbikgewotICAgICAgZW5jbG9zdXJlID0gZW5jbG9zdXJlSW47Ci0gICAgICBhYm92ZSA9IGFib3ZlSW47Ci0gICAgfQotICAgIHZvaWQgc2V0UGFyYWxsZWwoZnJDb29yZCBwYXJMZW5ndGhJbiwgZnJDb29yZCBwYXJXaXRoaW5JbikgewotICAgICAgcGFyTGVuZ3RoID0gcGFyTGVuZ3RoSW47Ci0gICAgICBwYXJXaXRoaW4gPSBwYXJXaXRoaW5JbjsKLSAgICB9Ci0KLSAgICAvLyBvdGhlcnMKLSAgICBmckNvbnN0cmFpbnRUeXBlRW51bSB0eXBlSWQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gZnJDb25zdHJhaW50VHlwZUVudW06OmZyY0xlZjU4Q3V0U3BhY2luZ1BhcmFsbGVsV2l0aGluQ29uc3RyYWludDsKLSAgICB9Ci0gIHByb3RlY3RlZDoKLSAgICBmckNvb3JkICB3aXRoaW47Ci0gICAgYm9vbCAgICAgZXhjZXB0U2FtZU5ldDsKLSAgICBmclN0cmluZyBjbGFzc05hbWU7Ci0gICAgLy8gbG9uZ2VkZ2Vvbmx5Ci0gICAgYm9vbCAgICAgbG9uZ0VkZ2VPbmx5OwotICAgIC8vIGVuY2xvc3VyZQotICAgIGZyQ29vcmQgIGVuY2xvc3VyZTsKLSAgICBib29sICAgICBhYm92ZTsKLSAgICBmckNvb3JkICBwYXJMZW5ndGg7Ci0gICAgZnJDb29yZCAgcGFyV2l0aGluOwotICB9OwotCi0gIC8vIExFRjU4IGN1dCBzcGFjaW5nCi0gIGNsYXNzIGZyTGVmNThDdXRTcGFjaW5nQ29uc3RyYWludCA6IHB1YmxpYyBmckNvbnN0cmFpbnQgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3IKLSAgICBmckxlZjU4Q3V0U3BhY2luZ0NvbnN0cmFpbnQoKSB7fQotICAgIC8vIGdldHRlcgotICAgIGZyQ29vcmQgZ2V0Q3V0U3BhY2luZygpIGNvbnN0IHsKLSAgICAgIHJldHVybiBjdXRTcGFjaW5nOwotICAgIH0KLSAgICBib29sIGhhc1BhcmFsbGVsV2l0aGluQ29uc3RyYWludCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiAocGFyYWxsZWxXaXRoaW5Db25zdHJhaW50KSA/IHRydWUgOiBmYWxzZTsKLSAgICB9Ci0gICAgc3RkOjpzaGFyZWRfcHRyPGZyTGVmNThDdXRTcGFjaW5nUGFyYWxsZWxXaXRoaW5Db25zdHJhaW50PiBnZXRQYXJhbGxlbFdpdGhpbkNvbnN0cmFpbnQoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gcGFyYWxsZWxXaXRoaW5Db25zdHJhaW50OwotICAgIH0KLSAgICBib29sIGhhc0FkamFjZW50Q3V0c0NvbnN0cmFpbnQoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gKGFkamFjZW50Q3V0c0NvbnN0cmFpbnQpID8gdHJ1ZSA6IGZhbHNlOwotICAgIH0KLSAgICBzdGQ6OnNoYXJlZF9wdHI8ZnJMZWY1OEN1dFNwYWNpbmdBZGphY2VudEN1dHNDb25zdHJhaW50PiBnZXRBZGphY2VudEN1dHNDb25zdHJhaW50KCkgY29uc3QgewotICAgICAgcmV0dXJuIGFkamFjZW50Q3V0c0NvbnN0cmFpbnQ7Ci0gICAgfQotICAgIGJvb2wgaGFzTGF5ZXJDb25zdHJhaW50KCkgY29uc3QgewotICAgICAgcmV0dXJuIChsYXllckNvbnN0cmFpbnQpID8gdHJ1ZSA6IGZhbHNlOwotICAgIH0KLSAgICBzdGQ6OnNoYXJlZF9wdHI8ZnJMZWY1OEN1dFNwYWNpbmdMYXllckNvbnN0cmFpbnQ+IGdldExheWVyQ29uc3RyYWludCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBsYXllckNvbnN0cmFpbnQ7Ci0gICAgfQotICAgIC8vIHNldHRlcgotICAgIHZvaWQgc2V0Q3V0U3BhY2luZyhmckNvb3JkIGluKSB7Ci0gICAgICBjdXRTcGFjaW5nID0gaW47Ci0gICAgfQotICAgIHZvaWQgc2V0UGFyYWxsZWxXaXRoaW5Db25zdHJhaW50KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxmckxlZjU4Q3V0U3BhY2luZ1BhcmFsbGVsV2l0aGluQ29uc3RyYWludD4gJmluKSB7Ci0gICAgICBwYXJhbGxlbFdpdGhpbkNvbnN0cmFpbnQgPSBpbjsKLSAgICB9Ci0gICAgdm9pZCBzZXRBZGphY2VudEN1dHNDb25zdHJhaW50KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxmckxlZjU4Q3V0U3BhY2luZ0FkamFjZW50Q3V0c0NvbnN0cmFpbnQ+ICZpbikgewotICAgICAgYWRqYWNlbnRDdXRzQ29uc3RyYWludCA9IGluOwotICAgIH0KLSAgICB2b2lkIHNldExheWVyQ29uc3RyYWludChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8ZnJMZWY1OEN1dFNwYWNpbmdMYXllckNvbnN0cmFpbnQ+ICZpbikgewotICAgICAgbGF5ZXJDb25zdHJhaW50ID0gaW47Ci0gICAgfQotICAgIC8vIG90aGVycwotICAgIGZyQ29uc3RyYWludFR5cGVFbnVtIHR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiBmckNvbnN0cmFpbnRUeXBlRW51bTo6ZnJjTGVmNThDdXRTcGFjaW5nQ29uc3RyYWludDsKLSAgICB9Ci0gIHByb3RlY3RlZDoKLSAgICBmckNvb3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dFNwYWNpbmc7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPGZyTGVmNThDdXRTcGFjaW5nUGFyYWxsZWxXaXRoaW5Db25zdHJhaW50PiBwYXJhbGxlbFdpdGhpbkNvbnN0cmFpbnQ7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPGZyTGVmNThDdXRTcGFjaW5nQWRqYWNlbnRDdXRzQ29uc3RyYWludD4gICBhZGphY2VudEN1dHNDb25zdHJhaW50OwotICAgIHN0ZDo6c2hhcmVkX3B0cjxmckxlZjU4Q3V0U3BhY2luZ0xheWVyQ29uc3RyYWludD4gICAgICAgICAgbGF5ZXJDb25zdHJhaW50OwotICB9OwotCi0KLQotCi0KLSAgY2xhc3MgZnJMZWY1OEN1dFNwYWNpbmdUYWJsZUxheWVyQ29uc3RyYWludCA6IHB1YmxpYyBmckNvbnN0cmFpbnQgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3JzCi0gICAgZnJMZWY1OEN1dFNwYWNpbmdUYWJsZUxheWVyQ29uc3RyYWludCgpOiBzZWNvbmRMYXllck51bSgwKSwgbm9uWmVyb0VuYyhmYWxzZSkge30KLSAgICAvLyBnZXR0ZXJzCi0gICAgZnJMYXllck51bSBnZXRTZWNvbmRMYXllck51bSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBzZWNvbmRMYXllck51bTsKLSAgICB9Ci0gICAgYm9vbCBpc05vblplcm9FbmMoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbm9uWmVyb0VuYzsKLSAgICB9Ci0gICAgLy8gc2V0dGVycwotICAgIHZvaWQgc2V0U2Vjb25kTGF5ZXJOdW0oZnJMYXllck51bSBpbikgewotICAgICAgc2Vjb25kTGF5ZXJOdW0gPSBpbjsKLSAgICB9Ci0gICAgdm9pZCBzZXROb25aZXJvRW5jKGJvb2wgaW4pIHsKLSAgICAgIG5vblplcm9FbmMgPSBpbjsKLSAgICB9Ci0gICAgLy8gb3RoZXJzCi0gICAgZnJDb25zdHJhaW50VHlwZUVudW0gdHlwZUlkKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIGZyQ29uc3RyYWludFR5cGVFbnVtOjpmcmNMZWY1OEN1dFNwYWNpbmdUYWJsZUxheWVyQ29uc3RyYWludDsKLSAgICB9Ci0gIHByb3RlY3RlZDoKLSAgICBmckxheWVyTnVtIHNlY29uZExheWVyTnVtOwotICAgIGJvb2wgICAgICAgbm9uWmVyb0VuYzsKLSAgfTsKLQotICBjbGFzcyBmckxlZjU4Q3V0U3BhY2luZ1RhYmxlUHJsQ29uc3RyYWludCA6IHB1YmxpYyBmckNvbnN0cmFpbnQgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3JzCi0gICAgZnJMZWY1OEN1dFNwYWNpbmdUYWJsZVBybENvbnN0cmFpbnQoKTogcHJsKDApLCBob3Jpem9udGFsKGZhbHNlKSwgdmVydGljYWwoZmFsc2UpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhYWShmYWxzZSkge30KLSAgICAvLyBnZXR0ZXJzCi0gICAgZnJDb29yZCBnZXRQcmwoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gcHJsOwotICAgIH0KLSAgICBib29sIGlzSG9yaXpvbnRhbCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBob3Jpem9udGFsOwotICAgIH0KLSAgICBib29sIGlzVmVydGljYWwoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gdmVydGljYWw7Ci0gICAgfQotICAgIGJvb2wgaXNNYXhYWSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBtYXhYWTsKLSAgICB9Ci0gICAgLy8gc2V0dGVycwotICAgIHZvaWQgc2V0UHJsKGZyQ29vcmQgaW4pIHsKLSAgICAgIHBybCA9IGluOwotICAgIH0KLSAgICB2b2lkIHNldEhvcml6b250YWwoYm9vbCBpbikgewotICAgICAgaG9yaXpvbnRhbCA9IGluOwotICAgIH0KLSAgICB2b2lkIHNldFZlcnRpY2FsKGJvb2wgaW4pIHsKLSAgICAgIHZlcnRpY2FsID0gaW47Ci0gICAgfQotICAgIHZvaWQgc2V0TWF4WFkoYm9vbCBpbikgewotICAgICAgbWF4WFkgPSBpbjsKLSAgICB9Ci0gICAgLy8gb3RoZXJzCi0gICAgZnJDb25zdHJhaW50VHlwZUVudW0gdHlwZUlkKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIGZyQ29uc3RyYWludFR5cGVFbnVtOjpmcmNMZWY1OEN1dFNwYWNpbmdUYWJsZVBybENvbnN0cmFpbnQ7Ci0gICAgfQotICBwcm90ZWN0ZWQ6Ci0gICAgZnJDb29yZCBwcmw7Ci0gICAgYm9vbCAgICBob3Jpem9udGFsOwotICAgIGJvb2wgICAgdmVydGljYWw7Ci0gICAgYm9vbCAgICBtYXhYWTsKLSAgfTsKLQotICAvLyBMRUY1OCBjdXQgc3BhY2luZyB0YWJsZQotICBjbGFzcyBmckxlZjU4Q3V0U3BhY2luZ1RhYmxlQ29uc3RyYWludCA6IHB1YmxpYyBmckNvbnN0cmFpbnQgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3IKLSAgICBmckxlZjU4Q3V0U3BhY2luZ1RhYmxlQ29uc3RyYWludCgpOiBjdXRDbGFzc0hhc0FsbChmYWxzZSksIGRlZmF1bHRDdXRTcGFjaW5nKDApIHt9Ci0gICAgLy8gZ2V0dGVyCi0gICAgc3RkOjpzaGFyZWRfcHRyPGZyMkRMb29rdXBUYmw8ZnJTdHJpbmcsIGZyU3RyaW5nLCBzdGQ6OnBhaXI8ZnJDb29yZCwgZnJDb29yZD4gPiA+IGdldEN1dENsYXNzVGJsKCkgY29uc3QgewotICAgICAgcmV0dXJuIGN1dENsYXNzVGJsOwotICAgIH0KLSAgICBib29sIGhhc1BybENvbnN0cmFpbnQoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gKHBybENvbnN0cmFpbnQpID8gdHJ1ZSA6IGZhbHNlOwotICAgIH0KLSAgICBzdGQ6OnNoYXJlZF9wdHI8ZnJMZWY1OEN1dFNwYWNpbmdUYWJsZVBybENvbnN0cmFpbnQ+IGdldFBybENvbnN0cmFpbnQoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gcHJsQ29uc3RyYWludDsKLSAgICB9Ci0gICAgYm9vbCBoYXNMYXllckNvbnN0cmFpbnQoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gKGxheWVyQ29uc3RyYWludCkgPyB0cnVlIDogZmFsc2U7Ci0gICAgfQotICAgIHN0ZDo6c2hhcmVkX3B0cjxmckxlZjU4Q3V0U3BhY2luZ1RhYmxlTGF5ZXJDb25zdHJhaW50PiBnZXRMYXllckNvbnN0cmFpbnQoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbGF5ZXJDb25zdHJhaW50OwotICAgIH0KLSAgICBib29sIGhhc0FsbCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBjdXRDbGFzc0hhc0FsbDsKLSAgICB9Ci0gICAgZnJDb29yZCBnZXREZWZhdWx0Q3V0U3BhY2luZygpIGNvbnN0IHsKLSAgICAgIHJldHVybiBkZWZhdWx0Q3V0U3BhY2luZzsKLSAgICB9Ci0gICAgLy8gc2V0dGVyCi0gICAgdm9pZCBzZXRDdXRDbGFzc1RibChzdGQ6OnNoYXJlZF9wdHI8ZnIyRExvb2t1cFRibDxmclN0cmluZywgZnJTdHJpbmcsIHN0ZDo6cGFpcjxmckNvb3JkLCBmckNvb3JkPiA+ID4gJmluKSB7Ci0gICAgICBjdXRDbGFzc1RibCA9IGluOwotICAgIH0KLSAgICB2b2lkIHNldFBybENvbnN0cmFpbnQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGZyTGVmNThDdXRTcGFjaW5nVGFibGVQcmxDb25zdHJhaW50PiAmaW4pIHsKLSAgICAgIHBybENvbnN0cmFpbnQgPSBpbjsKLSAgICB9Ci0gICAgdm9pZCBzZXRMYXllckNvbnN0cmFpbnQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGZyTGVmNThDdXRTcGFjaW5nVGFibGVMYXllckNvbnN0cmFpbnQ+ICZpbikgewotICAgICAgbGF5ZXJDb25zdHJhaW50ID0gaW47Ci0gICAgfQotICAgIHZvaWQgc2V0QWxsKGJvb2wgaW4pIHsKLSAgICAgIGN1dENsYXNzSGFzQWxsID0gaW47Ci0gICAgfQotICAgIHZvaWQgc2V0RGVmYXVsdEN1dFNwYWNpbmcoZnJDb29yZCBpbikgewotICAgICAgZGVmYXVsdEN1dFNwYWNpbmcgPSBpbjsKLSAgICB9Ci0gICAgLy8gb3RoZXJzCi0gICAgZnJDb25zdHJhaW50VHlwZUVudW0gdHlwZUlkKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIGZyQ29uc3RyYWludFR5cGVFbnVtOjpmcmNMZWY1OEN1dFNwYWNpbmdUYWJsZUNvbnN0cmFpbnQ7Ci0gICAgfQotICBwcm90ZWN0ZWQ6Ci0gICAgc3RkOjpzaGFyZWRfcHRyPGZyMkRMb29rdXBUYmw8ZnJTdHJpbmcsIGZyU3RyaW5nLCBzdGQ6OnBhaXI8ZnJDb29yZCwgZnJDb29yZD4gPiA+IGN1dENsYXNzVGJsOwotICAgIHN0ZDo6c2hhcmVkX3B0cjxmckxlZjU4Q3V0U3BhY2luZ1RhYmxlUHJsQ29uc3RyYWludD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmxDb25zdHJhaW50OwotICAgIHN0ZDo6c2hhcmVkX3B0cjxmckxlZjU4Q3V0U3BhY2luZ1RhYmxlTGF5ZXJDb25zdHJhaW50PiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllckNvbnN0cmFpbnQ7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dENsYXNzSGFzQWxsOwotICAgIGZyQ29vcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q3V0U3BhY2luZzsKLSAgfTsKLQotICAvLyBuZXcgU1BBQ0lOR1RBQkxFIENvbnN0cmFpbnRzCi0gIGNsYXNzIGZyU3BhY2luZ1RhYmxlUHJsQ29uc3RyYWludCA6IHB1YmxpYyBmckNvbnN0cmFpbnQgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3IKLSAgICAvL2ZyU3BhY2luZ1RhYmxlUHJsQ29uc3RyYWludCgpIHt9Ci0gICAgZnJTcGFjaW5nVGFibGVQcmxDb25zdHJhaW50KGNvbnN0IGZyMkRMb29rdXBUYmw8ZnJDb29yZCwgZnJDb29yZCwgZnJDb29yZD4gJmluKTogdGJsKGluKSB7fQotICAgIC8vIGdldHRlcgotICAgIGNvbnN0IGZyMkRMb29rdXBUYmw8ZnJDb29yZCwgZnJDb29yZCwgZnJDb29yZD4mIGdldExvb2t1cFRibCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiB0Ymw7Ci0gICAgfQotICAgIGZyMkRMb29rdXBUYmw8ZnJDb29yZCwgZnJDb29yZCwgZnJDb29yZD4mIGdldExvb2t1cFRibCgpIHsKLSAgICAgIHJldHVybiB0Ymw7Ci0gICAgfQotICAgIGZyQ29vcmQgZmluZChmckNvb3JkIHdpZHRoLCBmckNvb3JkIHBybCkgY29uc3QgewotICAgICAgcmV0dXJuIHRibC5maW5kKHdpZHRoLCBwcmwpOwotICAgIH0KLSAgICAvLyBzZXR0ZXIKLSAgICB2b2lkIHNldExvb2t1cFRibChjb25zdCBmcjJETG9va3VwVGJsPGZyQ29vcmQsIGZyQ29vcmQsIGZyQ29vcmQ+ICZpbikgewotICAgICAgdGJsID0gaW47Ci0gICAgfQotICAgIGZyQ29uc3RyYWludFR5cGVFbnVtIHR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiBmckNvbnN0cmFpbnRUeXBlRW51bTo6ZnJjU3BhY2luZ1RhYmxlUHJsQ29uc3RyYWludDsKLSAgICB9Ci0gIHByb3RlY3RlZDoKLSAgICBmcjJETG9va3VwVGJsPGZyQ29vcmQsIGZyQ29vcmQsIGZyQ29vcmQ+IHRibDsKLSAgfTsKLQotICBzdHJ1Y3QgZnJTcGFjaW5nVGFibGVUd1Jvd1R5cGUgewotICAgIGZyU3BhY2luZ1RhYmxlVHdSb3dUeXBlKGZyQ29vcmQgaW4xLCBmckNvb3JkIGluMik6IHdpZHRoKGluMSksIHBybChpbjIpIHt9Ci0gICAgZnJDb29yZCB3aWR0aDsKLSAgICBmckNvb3JkIHBybDsKLSAgICBib29sIG9wZXJhdG9yPChjb25zdCBmclNwYWNpbmdUYWJsZVR3Um93VHlwZSAmYikgY29uc3QgewotICAgICAgcmV0dXJuIHdpZHRoIDwgYi53aWR0aCB8fCBwcmwgPCBiLnBybDsKLSAgICB9Ci0gICAgLy9ib29sIG9wZXJhdG9yPD0oY29uc3QgZnJTcGFjaW5nVGFibGVUd1Jvd1R5cGUgJmIpIGNvbnN0IHsKLSAgICAvLyAgcmV0dXJuIHdpZHRoIDw9IGIud2lkdGggfHwgcHJsIDw9IGIucHJsOwotICAgIC8vfQotICAgIC8vYm9vbCBvcGVyYXRvcj4oY29uc3QgZnJTcGFjaW5nVGFibGVUd1Jvd1R5cGUgJmIpIGNvbnN0IHsKLSAgICAvLyAgcmV0dXJuIHdpZHRoID4gYi53aWR0aCB8fCBwcmwgPiBiLnBybDsKLSAgICAvL30KLSAgICAvL2Jvb2wgb3BlcmF0b3I+PShjb25zdCBmclNwYWNpbmdUYWJsZVR3Um93VHlwZSAmYikgY29uc3QgewotICAgIC8vICByZXR1cm4gd2lkdGggPj0gYi53aWR0aCB8fCBwcmwgPj0gYi5wcmw7Ci0gICAgLy99Ci0gICAgLy9ib29sIG9wZXJhdG9yPT0oY29uc3QgZnJTcGFjaW5nVGFibGVUd1Jvd1R5cGUgJmIpIGNvbnN0IHsKLSAgICAvLyAgcmV0dXJuIHdpZHRoID09IGIud2lkdGggJiYgcHJsID09IGIucHJsOwotICAgIC8vfQotICAgIC8vYm9vbCBvcGVyYXRvciE9KGNvbnN0IGZyU3BhY2luZ1RhYmxlVHdSb3dUeXBlICZiKSBjb25zdCB7Ci0gICAgLy8gIHJldHVybiAhKCp0aGlzID09IGIpOwotICAgIC8vfQotICB9OwotICAvLyBuZXcgU1BBQ0lOR1RBQkxFIENvbnN0cmFpbnRzCi0gIGNsYXNzIGZyU3BhY2luZ1RhYmxlVHdDb25zdHJhaW50IDogcHVibGljIGZyQ29uc3RyYWludCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBjb25zdHJ1Y3RvcgotICAgIC8vZnJTcGFjaW5nVGFibGVUd0NvbnN0cmFpbnQoKSB7fQotICAgIGZyU3BhY2luZ1RhYmxlVHdDb25zdHJhaW50KGNvbnN0IGZyMkRMb29rdXBUYmw8ZnJTcGFjaW5nVGFibGVUd1Jvd1R5cGUsIGZyU3BhY2luZ1RhYmxlVHdSb3dUeXBlLCBmckNvb3JkPiAmaW4pOiB0YmwoaW4pIHt9Ci0gICAgLy8gZ2V0dGVyCi0gICAgY29uc3QgZnIyRExvb2t1cFRibDxmclNwYWNpbmdUYWJsZVR3Um93VHlwZSwgZnJTcGFjaW5nVGFibGVUd1Jvd1R5cGUsIGZyQ29vcmQ+JiBnZXRMb29rdXBUYmwoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gdGJsOwotICAgIH0KLSAgICBmcjJETG9va3VwVGJsPGZyU3BhY2luZ1RhYmxlVHdSb3dUeXBlLCBmclNwYWNpbmdUYWJsZVR3Um93VHlwZSwgZnJDb29yZD4mIGdldExvb2t1cFRibCgpIHsKLSAgICAgIHJldHVybiB0Ymw7Ci0gICAgfQotICAgIGZyQ29vcmQgZmluZChmckNvb3JkIHdpZHRoMSwgZnJDb29yZCB3aWR0aDIsIGZyQ29vcmQgcHJsKSBjb25zdCB7Ci0gICAgICByZXR1cm4gdGJsLmZpbmQoZnJTcGFjaW5nVGFibGVUd1Jvd1R5cGUod2lkdGgxLCBwcmwpLCBmclNwYWNpbmdUYWJsZVR3Um93VHlwZSh3aWR0aDIsIHBybCkpOwotICAgIH0KLSAgICAvLyBzZXR0ZXIKLSAgICB2b2lkIHNldExvb2t1cFRibChjb25zdCBmcjJETG9va3VwVGJsPGZyU3BhY2luZ1RhYmxlVHdSb3dUeXBlLCBmclNwYWNpbmdUYWJsZVR3Um93VHlwZSwgZnJDb29yZD4gJmluKSB7Ci0gICAgICB0YmwgPSBpbjsKLSAgICB9Ci0gICAgZnJDb25zdHJhaW50VHlwZUVudW0gdHlwZUlkKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIGZyQ29uc3RyYWludFR5cGVFbnVtOjpmcmNTcGFjaW5nVGFibGVUd0NvbnN0cmFpbnQ7Ci0gICAgfQotICBwcm90ZWN0ZWQ6Ci0gICAgZnIyRExvb2t1cFRibDxmclNwYWNpbmdUYWJsZVR3Um93VHlwZSwgZnJTcGFjaW5nVGFibGVUd1Jvd1R5cGUsIGZyQ29vcmQ+IHRibDsKLSAgfTsKLSAgCi0gIC8vIG9yaWdpbmFsIFNQQUNJTkdUQUJMRSBDb25zdHJhaW50cwotICBjbGFzcyBmclNwYWNpbmdUYWJsZUNvbnN0cmFpbnQgOiBwdWJsaWMgZnJDb25zdHJhaW50IHsKLSAgcHVibGljOgotICAgIC8vIGNvbnN0cnVjdG9yCi0gICAgZnJTcGFjaW5nVGFibGVDb25zdHJhaW50KHN0ZDo6c2hhcmVkX3B0cjxmcjJETG9va3VwVGJsPGZyQ29vcmQsIGZyQ29vcmQsIGZyQ29vcmQ+ID4gcGFyYWxsZWxSdW5MZW5ndGhDb25zdHJhaW50SW4pIHsKLSAgICAgIHBhcmFsbGVsUnVuTGVuZ3RoQ29uc3RyYWludCA9IHBhcmFsbGVsUnVuTGVuZ3RoQ29uc3RyYWludEluOwotICAgIH0KLSAgICAvLyBnZXR0ZXIKLSAgICBzdGQ6OnNoYXJlZF9wdHI8ZnIyRExvb2t1cFRibDxmckNvb3JkLCBmckNvb3JkLCBmckNvb3JkPiA+IGdldFBhcmFsbGVsUnVuTGVuZ3RoQ29uc3RyYWludCgpIHsKLSAgICAgIHJldHVybiBwYXJhbGxlbFJ1bkxlbmd0aENvbnN0cmFpbnQ7Ci0gICAgfQotICAgIC8vIHNldHRlcgotICAgIHZvaWQgc2V0UGFyYWxsZWxSdW5MZW5ndGhDb25zdHJhaW50KHN0ZDo6c2hhcmVkX3B0cjxmcjJETG9va3VwVGJsPGZyQ29vcmQsIGZyQ29vcmQsIGZyQ29vcmQ+ID4gJnBhcmFsbGVsUnVuTGVuZ3RoQ29uc3RyYWludEluKSB7Ci0gICAgICBwYXJhbGxlbFJ1bkxlbmd0aENvbnN0cmFpbnQgPSBwYXJhbGxlbFJ1bkxlbmd0aENvbnN0cmFpbnRJbjsKLSAgICB9Ci0KLSAgICBmckNvbnN0cmFpbnRUeXBlRW51bSB0eXBlSWQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gZnJDb25zdHJhaW50VHlwZUVudW06OmZyY1NwYWNpbmdUYWJsZUNvbnN0cmFpbnQ7Ci0gICAgfQotICBwcm90ZWN0ZWQ6Ci0gICAgc3RkOjpzaGFyZWRfcHRyPGZyMkRMb29rdXBUYmw8ZnJDb29yZCwgZnJDb29yZCwgZnJDb29yZD4gPiBwYXJhbGxlbFJ1bkxlbmd0aENvbnN0cmFpbnQ7Ci0gIH07Ci0gIAotICBjbGFzcyBmckxlZjU4U3BhY2luZ1RhYmxlQ29uc3RyYWludCA6IHB1YmxpYyBmclNwYWNpbmdUYWJsZUNvbnN0cmFpbnQgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3IKLSAgICBmckxlZjU4U3BhY2luZ1RhYmxlQ29uc3RyYWludChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8ZnIyRExvb2t1cFRibDxmckNvb3JkLCBmckNvb3JkLCBmckNvb3JkPiA+ICZwYXJhbGxlbFJ1bkxlbmd0aENvbnN0cmFpbnRJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxpbnQsIHN0ZDo6cGFpcjxmckNvb3JkLCBmckNvb3JkPiA+ICZleGNlcHRXaXRoaW5Db25zdHJhaW50SW4pOiAKLSAgICAgIGZyU3BhY2luZ1RhYmxlQ29uc3RyYWludChwYXJhbGxlbFJ1bkxlbmd0aENvbnN0cmFpbnRJbiksIGV4Y2VwdFdpdGhpbkNvbnN0cmFpbnQoZXhjZXB0V2l0aGluQ29uc3RyYWludEluKSwgCi0gICAgICB3cm9uZ0RpcmVjdGlvbihmYWxzZSksIHNhbWVNYXNrKGZhbHNlKSwgZXhjZXB0RW9sKGZhbHNlKSwgZW9sV2lkdGgoMCkge30KLSAgICAvLyBnZXR0ZXIKLSAgICBib29sIGhhc0V4Y2VwdFdpdGhpbihmckNvb3JkIHZhbCkgY29uc3QgewotICAgICAgYXV0byByb3dJZHggPSBwYXJhbGxlbFJ1bkxlbmd0aENvbnN0cmFpbnQtPmdldFJvd0lkeCh2YWwpOwotICAgICAgcmV0dXJuIChleGNlcHRXaXRoaW5Db25zdHJhaW50LmZpbmQocm93SWR4KSAhPSBleGNlcHRXaXRoaW5Db25zdHJhaW50LmVuZCgpKTsKLSAgICB9Ci0gICAgc3RkOjpwYWlyPGZyQ29vcmQsIGZyQ29vcmQ+IGdldEV4Y2VwdFdpdGhpbihmckNvb3JkIHZhbCkgY29uc3QgewotICAgICAgYXV0byByb3dJZHggPSBwYXJhbGxlbFJ1bkxlbmd0aENvbnN0cmFpbnQtPmdldFJvd0lkeCh2YWwpOwotICAgICAgcmV0dXJuIGV4Y2VwdFdpdGhpbkNvbnN0cmFpbnQuYXQocm93SWR4KTsKLSAgICB9Ci0gICAgYm9vbCBpc1dyb25nRGlyZWN0aW9uKCkgY29uc3QgewotICAgICAgcmV0dXJuIHdyb25nRGlyZWN0aW9uOwotICAgIH0KLSAgICBib29sIGlzU2FtZU1hc2soKSBjb25zdCB7Ci0gICAgICByZXR1cm4gc2FtZU1hc2s7Ci0gICAgfQotICAgIGJvb2wgaGFzRXhjZXB0RW9sKCkgY29uc3QgewotICAgICAgcmV0dXJuIGV4Y2VwdEVvbDsKLSAgICB9Ci0gICAgZnJVSW50NCBnZXRFb2xXaWR0aCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBlb2xXaWR0aDsKLSAgICB9Ci0gICAgLy8gc2V0dGVycwotICAgIHZvaWQgc2V0RXhjZXB0V2l0aGluQ29uc3RyYWludChzdGQ6Om1hcDxpbnQsIHN0ZDo6cGFpcjxmckNvb3JkLCBmckNvb3JkPiA+ICZleGNlcHRXaXRoaW5Db25zdHJhaW50SW4pIHsKLSAgICAgIGV4Y2VwdFdpdGhpbkNvbnN0cmFpbnQgPSBleGNlcHRXaXRoaW5Db25zdHJhaW50SW47Ci0gICAgfQotICAgIHZvaWQgc2V0V3JvbmdEaXJlY3Rpb24oYm9vbCBpbikgewotICAgICAgd3JvbmdEaXJlY3Rpb24gPSBpbjsKLSAgICB9Ci0gICAgdm9pZCBzZXRTYW1lTWFzayhib29sIGluKSB7Ci0gICAgICBzYW1lTWFzayA9IGluOwotICAgIH0KLSAgICB2b2lkIHNldEVvbFdpZHRoKGZyVUludDQgaW4pIHsKLSAgICAgIGV4Y2VwdEVvbCA9IHRydWU7Ci0gICAgICBlb2xXaWR0aCA9IGluOwotICAgIH0KLQotICAgIGZyQ29uc3RyYWludFR5cGVFbnVtIHR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiBmckNvbnN0cmFpbnRUeXBlRW51bTo6ZnJjTGVmNThTcGFjaW5nVGFibGVDb25zdHJhaW50OwotICAgIH0KLSAgcHJvdGVjdGVkOgotICAgIC8vc3RkOjpzaGFyZWRfcHRyPGZyMURMb29rdXBUYmw8ZnJDb29yZCwgc3RkOjpwYWlyPGZyQ29vcmQsIGZyQ29vcmQ+ID4gPiBleGNlcHRXaXRoaW5Db25zdHJhaW50OwotICAgIHN0ZDo6bWFwPGZyQ29vcmQsIHN0ZDo6cGFpcjxmckNvb3JkLCBmckNvb3JkPiA+IGV4Y2VwdFdpdGhpbkNvbnN0cmFpbnQ7Ci0gICAgYm9vbCB3cm9uZ0RpcmVjdGlvbjsKLSAgICBib29sIHNhbWVNYXNrOwotICAgIGJvb2wgZXhjZXB0RW9sOwotICAgIGZyVUludDQgZW9sV2lkdGg7Ci0gIH07Ci0KLSAgLy8gY2xhc3MgZnJTcGFjaW5nVGFibGVUd29XaWR0aENvbnN0cmFpbnQgOiBwdWJsaWMgZnJTcGFjaW5nVGFibGVDb25zdHJhaW50IHsKLSAgLy8gcHVibGljOgotICAvLyAgIC8vIGdldHRlcgotICAvLyAgIC8vIHNldHRlcgotICAvLyAgIC8vIGNoZWNrCi0gIC8vICAgdmlydHVhbCBib29sIGNoZWNrKCkgewotCi0gIC8vICAgfQotICAvLyBwcm90ZWN0ZWQ6Ci0gIC8vICAgZnJDb2xsZWN0aW9uPGZyQ29vcmQ+IHdpZHRoczsKLSAgLy8gICBmckNvbGxlY3Rpb248ZnJDb29yZD4gbGVuZ3RoczsKLSAgLy8gICBmckNvbGxlY3Rpb248ZnJDb2xsZWN0aW9uPGZyQ29vcmQ+ID4gc3BUYmw7Ci0gIC8vIH07Ci0KLSAgLy8gQURKQUNFTlRDVVRTCi0gIGNsYXNzIGZyQ3V0U3BhY2luZ0NvbnN0cmFpbnQgOiBwdWJsaWMgZnJDb25zdHJhaW50IHsKLSAgcHVibGljOgotICAvLyBjb25zdHJ1Y3RvcgotICBmckN1dFNwYWNpbmdDb25zdHJhaW50KCkge30KLSAgZnJDdXRTcGFjaW5nQ29uc3RyYWludCgKLSAgICBmckNvb3JkICZjdXRTcGFjaW5nSW4sCi0gICAgYm9vbCBjZW50ZXJUb0NlbnRlckluLAotICAgIGJvb2wgc2FtZU5ldEluLAotICAgIGZyU3RyaW5nIHNlY29uZExheWVyTmFtZUluLAotICAgIGJvb2wgc3RhY2tJbiwKLSAgICBpbnQgYWRqYWNlbnRDdXRzSW4sCi0gICAgZnJDb29yZCBjdXRXaXRoaW5JbiwKLSAgICBib29sIGlzRXhjZXB0U2FtZVBHTmV0SW4sCi0gICAgYm9vbCBpc1BhcmFsbGVsT3ZlcmxhcEluLAotICAgIGZyQ29vcmQgY3V0QXJlYUluCi0gICkgewotICAgIGN1dFNwYWNpbmcgPSBjdXRTcGFjaW5nSW47Ci0gICAgY2VudGVyVG9DZW50ZXIgPSBjZW50ZXJUb0NlbnRlckluOwotICAgIHNhbWVOZXQgPSBzYW1lTmV0SW47Ci0gICAgc2Vjb25kTGF5ZXJOYW1lID0gc2Vjb25kTGF5ZXJOYW1lSW47Ci0gICAgc3RhY2sgPSBzdGFja0luOwotICAgIGFkamFjZW50Q3V0cyA9IGFkamFjZW50Q3V0c0luOwotICAgIGN1dFdpdGhpbiA9IGN1dFdpdGhpbkluOwotICAgIGV4Y2VwdFNhbWVQR05ldCA9IGlzRXhjZXB0U2FtZVBHTmV0SW47Ci0gICAgcGFyYWxsZWxPdmVybGFwID0gaXNQYXJhbGxlbE92ZXJsYXBJbjsKLSAgICBjdXRBcmVhID0gY3V0QXJlYUluOwotICB9Ci0gIC8vIGdldHRlcgotICBib29sIGhhc0NlbnRlclRvQ2VudGVyKCkgY29uc3QgewotICAgIHJldHVybiBjZW50ZXJUb0NlbnRlcjsKLSAgfQotICBib29sIGdldENlbnRlclRvQ2VudGVyKCkgY29uc3QgewotICAgIHJldHVybiBjZW50ZXJUb0NlbnRlcjsKLSAgfQotICBib29sIGdldFNhbWVOZXQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHNhbWVOZXQ7Ci0gIH0KLSAgYm9vbCBoYXNTYW1lTmV0KCkgY29uc3QgewotICAgIHJldHVybiBzYW1lTmV0OwotICB9Ci0gIGJvb2wgZ2V0U3RhY2soKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0YWNrOwotICB9Ci0gIGJvb2wgaGFzU3RhY2soKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0YWNrOwotICB9Ci0gIGJvb2wgaXNMYXllcigpIGNvbnN0IHsKLSAgICByZXR1cm4gIShzZWNvbmRMYXllck5hbWUuZW1wdHkoKSk7Ci0gIH0KLSAgY29uc3QgZnJTdHJpbmcmIGdldFNlY29uZExheWVyTmFtZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gc2Vjb25kTGF5ZXJOYW1lOwotICB9Ci0gIGJvb2wgaXNBZGphY2VudEN1dHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuICEoYWRqYWNlbnRDdXRzID09IC0xKTsKLSAgfQotICBpbnQgZ2V0QWRqYWNlbnRDdXRzKCkgY29uc3QgewotICAgIHJldHVybiBhZGphY2VudEN1dHM7Ci0gIH0KLSAgZnJDb29yZCBnZXRDdXRXaXRoaW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIGN1dFdpdGhpbjsKLSAgfQotICBib29sIGhhc0V4Y2VwdFNhbWVQR05ldCgpIGNvbnN0IHsKLSAgICByZXR1cm4gZXhjZXB0U2FtZVBHTmV0OwotICB9Ci0gIGJvb2wgZ2V0RXhjZXB0U2FtZVBHTmV0KCkgY29uc3QgewotICAgIHJldHVybiBleGNlcHRTYW1lUEdOZXQ7Ci0gIH0KLSAgYm9vbCBpc1BhcmFsbGVsT3ZlcmxhcCgpIGNvbnN0IHsKLSAgICByZXR1cm4gcGFyYWxsZWxPdmVybGFwOwotICB9Ci0gIGJvb2wgZ2V0UGFyYWxsZWxPdmVybGFwKCkgY29uc3QgewotICAgIHJldHVybiBwYXJhbGxlbE92ZXJsYXA7Ci0gIH0KLSAgYm9vbCBpc0FyZWEoKSBjb25zdCB7Ci0gICAgcmV0dXJuICEoY3V0QXJlYSA9PSAtMSk7Ci0gIH0KLSAgYm9vbCBnZXRDdXRBcmVhKCkgY29uc3QgewotICAgIHJldHVybiBjdXRBcmVhOwotICB9Ci0gIGZyQ29vcmQgZ2V0Q3V0U3BhY2luZygpIGNvbnN0IHsKLSAgICByZXR1cm4gY3V0U3BhY2luZzsKLSAgfQotICBmckNvbnN0cmFpbnRUeXBlRW51bSB0eXBlSWQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gZnJDb25zdHJhaW50VHlwZUVudW06OmZyY0N1dFNwYWNpbmdDb25zdHJhaW50OwotICB9Ci0KLQotCi0gIC8vIHNldHRlcgotCi0gIHByb3RlY3RlZDoKLSAgICBmckNvb3JkIGN1dFNwYWNpbmcgPSAtMTsKLSAgICBib29sIGNlbnRlclRvQ2VudGVyID0gZmFsc2U7Ci0gICAgYm9vbCBzYW1lTmV0ID0gZmFsc2U7Ci0gICAgYm9vbCBzdGFjayA9IGZhbHNlOwotICAgIGJvb2wgZXhjZXB0U2FtZVBHTmV0ID0gZmFsc2U7Ci0gICAgYm9vbCBwYXJhbGxlbE92ZXJsYXAgPSBmYWxzZTsKLSAgICBmclN0cmluZyBzZWNvbmRMYXllck5hbWU7Ci0gICAgaW50IGFkamFjZW50Q3V0cyA9IC0xOwotICAgIGZyQ29vcmQgY3V0V2l0aGluID0gLTE7Ci0gICAgZnJDb29yZCBjdXRBcmVhID0gLTE7Ci0KLSAgfTsKLQotICAvLyBMZWY1OF9DT1JORVJTUEFDSU5HCi0gIGNsYXNzIGZyTGVmNThDb3JuZXJTcGFjaW5nQ29udmV4Q29ybmVyQ29uc3RyYWludDsKLSAgY2xhc3MgZnJMZWY1OENvcm5lclNwYWNpbmdDb25jYXZlQ29ybmVyQ29uc3RyYWludDsKLQotICBjbGFzcyBmckxlZjU4Q29ybmVyU3BhY2luZ0NvbnN0cmFpbnQgOiBwdWJsaWMgZnJDb25zdHJhaW50IHsKLSAgcHVibGljOgotICAgIC8vIGNvbnN0cnVjdG9yCi0gICAgZnJMZWY1OENvcm5lclNwYWNpbmdDb25zdHJhaW50KAotICAgICAgc3RkOjpzaGFyZWRfcHRyPGZyTGVmNThDb3JuZXJTcGFjaW5nQ29uY2F2ZUNvcm5lckNvbnN0cmFpbnQ+IGNvbmNhdmVDb25zdHJhaW50SW4sCi0gICAgICBmckxlZjU4Q29ybmVyU3BhY2luZ0V4Y2VwdGlvbkVudW0gJmV4Y2VwdGlvbkluLAotICAgICAgZnJDb2xsZWN0aW9uPHN0ZDo6c2hhcmVkX3B0cjxmckxlZjU4Q29ybmVyU3BhY2luZ1NwYWNpbmdDb25zdHJhaW50PiA+ICZzcGFjaW5nc0luCi0gICAgKSB7Ci0gICAgICBjb25jYXZlQ29uc3RyYWludCA9IGNvbmNhdmVDb25zdHJhaW50SW47Ci0gICAgICBleGNlcHRpb24gPSBleGNlcHRpb25JbjsKLSAgICAgIHNwYWNpbmdzID0gc3BhY2luZ3NJbjsKLSAgICB9Ci0gICAgZnJMZWY1OENvcm5lclNwYWNpbmdDb25zdHJhaW50KAotICAgICAgc3RkOjpzaGFyZWRfcHRyPGZyTGVmNThDb3JuZXJTcGFjaW5nQ29udmV4Q29ybmVyQ29uc3RyYWludD4gY29udmV4Q29uc3RyYWludEluLAotICAgICAgZnJMZWY1OENvcm5lclNwYWNpbmdFeGNlcHRpb25FbnVtICZleGNlcHRpb25JbiwKLSAgICAgIGZyQ29sbGVjdGlvbjxzdGQ6OnNoYXJlZF9wdHI8ZnJMZWY1OENvcm5lclNwYWNpbmdTcGFjaW5nQ29uc3RyYWludD4gPiAmc3BhY2luZ3NJbgotICAgICkgewotICAgICAgY29udmV4Q29uc3RyYWludCA9IGNvbnZleENvbnN0cmFpbnRJbjsKLSAgICAgIGV4Y2VwdGlvbiA9IGV4Y2VwdGlvbkluOwotICAgICAgc3BhY2luZ3MgPSBzcGFjaW5nc0luOwotICAgIH0KLQotICAgIC8vIGdldHRlcgotICAgIHN0ZDo6c2hhcmVkX3B0cjxmckxlZjU4Q29ybmVyU3BhY2luZ0NvbmNhdmVDb3JuZXJDb25zdHJhaW50PiBnZXRDb25jYXZlQ29uc3RyYWludCgpIHsKLSAgICAgIHJldHVybiBjb25jYXZlQ29uc3RyYWludDsKLSAgICB9Ci0gICAgc3RkOjpzaGFyZWRfcHRyPGZyTGVmNThDb3JuZXJTcGFjaW5nQ29udmV4Q29ybmVyQ29uc3RyYWludD4gZ2V0Q29udmV4Q29uc3RyYWludCgpIHsKLSAgICAgIHJldHVybiBjb252ZXhDb25zdHJhaW50OwotICAgIH0KLSAgICBmckxlZjU4Q29ybmVyU3BhY2luZ0V4Y2VwdGlvbkVudW0gZ2V0RXhjZXB0aW9uKCkgewotICAgICAgcmV0dXJuIGV4Y2VwdGlvbjsKLSAgICB9Ci0gICAgZnJDb2xsZWN0aW9uPHN0ZDo6c2hhcmVkX3B0cjxmckxlZjU4Q29ybmVyU3BhY2luZ1NwYWNpbmdDb25zdHJhaW50PiA+IGdldFNwYWNpbmdzKCkgewotICAgICAgcmV0dXJuIHNwYWNpbmdzOwotICAgIH0KLSAgICAvLyBzZXR0ZXIKLSAgICBmckNvbnN0cmFpbnRUeXBlRW51bSB0eXBlSWQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gZnJDb25zdHJhaW50VHlwZUVudW06OmZyY0xlZjU4Q29ybmVyU3BhY2luZ0NvbnN0cmFpbnQ7Ci0gICAgfQotCi0KLSAgcHJvdGVjdGVkOgotICAgIHN0ZDo6c2hhcmVkX3B0cjxmckxlZjU4Q29ybmVyU3BhY2luZ0NvbmNhdmVDb3JuZXJDb25zdHJhaW50PiBjb25jYXZlQ29uc3RyYWludDsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8ZnJMZWY1OENvcm5lclNwYWNpbmdDb252ZXhDb3JuZXJDb25zdHJhaW50PiBjb252ZXhDb25zdHJhaW50OwotICAgIGZyTGVmNThDb3JuZXJTcGFjaW5nRXhjZXB0aW9uRW51bSBleGNlcHRpb24gPSBmckxlZjU4Q29ybmVyU3BhY2luZ0V4Y2VwdGlvbkVudW06Ok5PTkU7Ci0gICAgZnJDb2xsZWN0aW9uPHN0ZDo6c2hhcmVkX3B0cjxmckxlZjU4Q29ybmVyU3BhY2luZ1NwYWNpbmdDb25zdHJhaW50PiA+IHNwYWNpbmdzOwotCi0gIH07Ci0KLSAgY2xhc3MgZnJMZWY1OENvcm5lclNwYWNpbmdDb25jYXZlQ29ybmVyQ29uc3RyYWludCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBjb25zdHJ1Y3RvcgotICAgIGZyTGVmNThDb3JuZXJTcGFjaW5nQ29uY2F2ZUNvcm5lckNvbnN0cmFpbnQoCi0gICAgICBmckNvb3JkIG1pbkxlbmd0aEluID0gLTEsCi0gICAgICBmckNvb3JkIG5vdGNoTGVuZ3RoSW4gPSAtMQotICAgICkgewotICAgICAgaWYgKG1pbkxlbmd0aEluICE9IC0xKSB7Ci0gICAgICAgIG1pbkxlbmd0aCA9IG1pbkxlbmd0aEluOwotICAgICAgfQotICAgICAgaWYgKG5vdGNoTGVuZ3RoSW4gIT0gLTEpIHsKLSAgICAgICAgbm90Y2hMZW5ndGggPSBub3RjaExlbmd0aEluOwotICAgICAgfQotICAgIH0KLSAgICAvLyBnZXR0ZXIKLSAgICBmckNvb3JkIGdldE1pbkxlbmd0aCgpIHsKLSAgICAgIHJldHVybiBtaW5MZW5ndGg7Ci0gICAgfQotICAgIGZyQ29vcmQgZ2V0Tm90Y2hMZW5ndGgoKSB7Ci0gICAgICByZXR1cm4gbm90Y2hMZW5ndGg7Ci0gICAgfQotICBwcm90ZWN0ZWQ6Ci0gICAgZnJDb29yZCBtaW5MZW5ndGggPSAtMTsKLSAgICBmckNvb3JkIG5vdGNoTGVuZ3RoID0gLTE7Ci0gIH07Ci0KLSAgY2xhc3MgZnJMZWY1OENvcm5lclNwYWNpbmdDb252ZXhDb3JuZXJDb25zdHJhaW50IDogcHVibGljIGZyQ29uc3RyYWludCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBjb25zdHJ1Y3RvcgotICAgIGZyTGVmNThDb3JuZXJTcGFjaW5nQ29udmV4Q29ybmVyQ29uc3RyYWludCgKLSAgICAgIGJvb2wgJnNhbWVNYXNrSW4sIAotICAgICAgYm9vbCAmZWRnZUxlbmd0aEluLCAKLSAgICAgIGJvb2wgJmluY2x1ZGVMU2hhcGVJbiwKLSAgICAgIGZyQ29vcmQgd2l0aGluSW4gPSAtMSwKLSAgICAgIGZyQ29vcmQgZW9sV2lkdGhJbiA9IC0xLAotICAgICAgZnJDb29yZCBsZW5ndGhJbiA9IC0xCi0gICAgKQotICAgICAgOiBzYW1lTWFzayhzYW1lTWFza0luKSwgZWRnZUxlbmd0aChlZGdlTGVuZ3RoSW4pLCBpbmNsdWRlTFNoYXBlKGluY2x1ZGVMU2hhcGVJbikKLSAgICB7Ci0gICAgICBpZiAod2l0aGluSW4gIT0gLTEpIHsKLSAgICAgICAgd2l0aGluID0gd2l0aGluSW47Ci0gICAgICB9Ci0gICAgICBpZiAoZW9sV2lkdGhJbiAhPSAtMSkgewotICAgICAgICBlb2xXaWR0aCA9IGVvbFdpZHRoSW47Ci0gICAgICAgIGlmIChsZW5ndGhJbiAhPSAtMSkgewotICAgICAgICAgIGxlbmd0aCA9IGxlbmd0aEluOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgLy8gZ2V0dGVyCi0gICAgYm9vbCBpc1NhbWVNYXNrKCkgewotICAgICAgcmV0dXJuIHNhbWVNYXNrOwotICAgIH0KLSAgICBib29sIGlzRWRnZUxlbmd0aCgpIHsKLSAgICAgIHJldHVybiBlZGdlTGVuZ3RoOwotICAgIH0KLSAgICBib29sIGlzSW5jbHVkZUxTaGFwZSgpIHsKLSAgICAgIHJldHVybiBpbmNsdWRlTFNoYXBlOwotICAgIH0KLSAgICBmckNvb3JkIGdldFdpdGhpbigpIHsKLSAgICAgIHJldHVybiB3aXRoaW47Ci0gICAgfQotICAgIGZyQ29vcmQgZ2V0RU9MV2lkdGgoKSB7Ci0gICAgICByZXR1cm4gZW9sV2lkdGg7Ci0gICAgfQotICAgIGZyQ29vcmQgZ2V0RXhjZXB0Sm9nTGVuZ3RoKCkgewotICAgICAgcmV0dXJuIGxlbmd0aDsKLSAgICB9Ci0gICAgLy8gc2V0dGVyCi0gICAgdm9pZCBzZXRTYW1lTWFzayhib29sICZzYW1lTWFza0luKSB7Ci0gICAgICBzYW1lTWFzayA9IHNhbWVNYXNrSW47Ci0gICAgfQotICAgIGZyQ29uc3RyYWludFR5cGVFbnVtIHR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiBmckNvbnN0cmFpbnRUeXBlRW51bTo6ZnJjTGVmNThDb3JuZXJTcGFjaW5nQ29udmV4Q29ybmVyQ29uc3RyYWludDsKLSAgICB9Ci0KLQotICBwcm90ZWN0ZWQ6Ci0gICAgZnJDb29yZCB3aXRoaW4gPSAtMTsKLSAgICBmckNvb3JkIGVvbFdpZHRoID0gLTE7Ci0gICAgZnJDb29yZCBsZW5ndGggPSAtMTsKLSAgICBib29sIHNhbWVNYXNrID0gZmFsc2U7Ci0gICAgYm9vbCBlZGdlTGVuZ3RoID0gZmFsc2U7Ci0gICAgYm9vbCBpbmNsdWRlTFNoYXBlID0gZmFsc2U7Ci0gIH07Ci0KLQotCi0KLSAgY2xhc3MgZnJMZWY1OENvcm5lclNwYWNpbmdTcGFjaW5nQ29uc3RyYWludCA6IHB1YmxpYyBmckNvbnN0cmFpbnQgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3IKLSAgICBmckxlZjU4Q29ybmVyU3BhY2luZ1NwYWNpbmdDb25zdHJhaW50KGZyQ29vcmQgJndpZHRoSW4pCi0gICAgICA6IHdpZHRoKHdpZHRoSW4pCi0gICAge30KLSAgICAvLyBnZXR0ZXIKLSAgICBmckNvb3JkIGdldFdpZHRoKCkgewotICAgICAgcmV0dXJuIHdpZHRoOwotICAgIH0KLSAgICAvLyBzZXR0ZXIKLSAgICB2b2lkIHNldFdpZHRoKGZyQ29vcmQgJndpZHRoSW4pIHsKLSAgICAgIHdpZHRoID0gd2lkdGhJbjsKLSAgICB9Ci0KLSAgICBmckNvbnN0cmFpbnRUeXBlRW51bSB0eXBlSWQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gZnJDb25zdHJhaW50VHlwZUVudW06OmZyY0xlZjU4Q29ybmVyU3BhY2luZ1NwYWNpbmdDb25zdHJhaW50OwotICAgIH0KLSAgcHJvdGVjdGVkOgotICAgIGZyQ29vcmQgd2lkdGg7Ci0gIH07Ci0KLSAgY2xhc3MgZnJMZWY1OENvcm5lclNwYWNpbmdTcGFjaW5nMURDb25zdHJhaW50IDogcHVibGljIGZyTGVmNThDb3JuZXJTcGFjaW5nU3BhY2luZ0NvbnN0cmFpbnQgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3IKLSAgICBmckxlZjU4Q29ybmVyU3BhY2luZ1NwYWNpbmcxRENvbnN0cmFpbnQoZnJDb29yZCB3aWR0aEluLCBmckNvb3JkIHNwYWNpbmdJbikKLSAgICAgIDogZnJMZWY1OENvcm5lclNwYWNpbmdTcGFjaW5nQ29uc3RyYWludCh3aWR0aEluKSwgc3BhY2luZyhzcGFjaW5nSW4pCi0gICAge30KLSAgICAvLyBnZXR0ZXIKLSAgICBmckNvb3JkIGdldFNwYWNpbmcoKSB7Ci0gICAgICByZXR1cm4gc3BhY2luZzsKLSAgICB9Ci0gICAgLy8gc2V0dGVyCi0gICAgdm9pZCBzZXRTcGFjaW5nKGZyQ29vcmQgJnNwYWNpbmdJbikgewotICAgICAgc3BhY2luZyA9IHNwYWNpbmdJbjsKLSAgICB9Ci0KLSAgICBmckNvbnN0cmFpbnRUeXBlRW51bSB0eXBlSWQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gZnJDb25zdHJhaW50VHlwZUVudW06OmZyY0xlZjU4Q29ybmVyU3BhY2luZ1NwYWNpbmcxRENvbnN0cmFpbnQ7Ci0gICAgfQotICAgIAotICBwcm90ZWN0ZWQ6Ci0gICAgZnJDb29yZCBzcGFjaW5nID0gLTE7Ci0gIH07Ci0KLSAgY2xhc3MgZnJMZWY1OENvcm5lclNwYWNpbmdTcGFjaW5nMkRDb25zdHJhaW50IDogcHVibGljIGZyTGVmNThDb3JuZXJTcGFjaW5nU3BhY2luZ0NvbnN0cmFpbnQgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3IKLSAgICBmckxlZjU4Q29ybmVyU3BhY2luZ1NwYWNpbmcyRENvbnN0cmFpbnQoZnJDb29yZCB3aWR0aEluLCBmckNvb3JkIGhvcml6b250YWxTcGFjaW5nSW4sIGZyQ29vcmQgdmVydGljYWxTcGFjaW5nSW4pCi0gICAgICA6IGZyTGVmNThDb3JuZXJTcGFjaW5nU3BhY2luZ0NvbnN0cmFpbnQod2lkdGhJbiksIGhvcml6b250YWxTcGFjaW5nKGhvcml6b250YWxTcGFjaW5nSW4pLCB2ZXJ0aWNhbFNwYWNpbmcodmVydGljYWxTcGFjaW5nSW4pCi0gICAge30KLSAgICAvLyBnZXR0ZXIKLSAgICBmckNvb3JkIGdldEhvcml6b250YWxTcGFjaW5nKCkgewotICAgICAgcmV0dXJuIGhvcml6b250YWxTcGFjaW5nOwotICAgIH0KLSAgICBmckNvb3JkIGdldFZlcnRpY2FsU3BhY2luZygpIHsKLSAgICAgIHJldHVybiB2ZXJ0aWNhbFNwYWNpbmc7Ci0gICAgfQotICAgIC8vIHNldHRlcgotICAgIHZvaWQgc2V0SG9yaXpvbnRhbFNwYWNpbmcoZnJDb29yZCAmaG9yaXpvbnRhbFNwYWNpbmdJbikgewotICAgICAgaG9yaXpvbnRhbFNwYWNpbmcgPSBob3Jpem9udGFsU3BhY2luZ0luOwotICAgIH0KLSAgICB2b2lkIHNldFZlcnRpY2FsU3BhY2luZyhmckNvb3JkICZ2ZXJ0aWNhbFNwYWNpbmdJbikgewotICAgICAgdmVydGljYWxTcGFjaW5nID0gdmVydGljYWxTcGFjaW5nSW47Ci0gICAgfQotCi0gICAgZnJDb25zdHJhaW50VHlwZUVudW0gdHlwZUlkKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgcmV0dXJuIGZyQ29uc3RyYWludFR5cGVFbnVtOjpmcmNMZWY1OENvcm5lclNwYWNpbmdTcGFjaW5nMkRDb25zdHJhaW50OwotICAgIH0KLSAgcHJvdGVjdGVkOgotICAgIGZyQ29vcmQgaG9yaXpvbnRhbFNwYWNpbmcgPSAtMSwgdmVydGljYWxTcGFjaW5nID0gLTE7Ci0gIH07Ci0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi90ZWNoL2ZyTGF5ZXIuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL3RlY2gvZnJMYXllci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmJhMTg4Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL3RlY2gvZnJMYXllci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX0ZSX0xBWUVSX0hfCi0jZGVmaW5lIF9GUl9MQVlFUl9IXwotCi0jaW5jbHVkZSAiZnJCYXNlVHlwZXMuaCIKLSNpbmNsdWRlICJkYi9pbmZyYS9mclByZWZSb3V0aW5nRGlyLmgiCi0jaW5jbHVkZSAiZGIvaW5mcmEvZnJTZWdTdHlsZS5oIgotI2luY2x1ZGUgImRiL29iai9mclZpYS5oIgotI2luY2x1ZGUgImRiL3RlY2gvZnJDb25zdHJhaW50LmgiCi0KLW5hbWVzcGFjZSBmciB7Ci0gIG5hbWVzcGFjZSBpbyB7Ci0gICAgY2xhc3MgUGFyc2VyOwotICB9Ci0gIGNsYXNzIGZyTGF5ZXIgewotICBwdWJsaWM6Ci0gICAgZnJpZW5kIGNsYXNzIGlvOjpQYXJzZXI7Ci0gICAgLy8gY29uc3RydWN0b3IKLSAgICBmckxheWVyKCk6IHBpdGNoKDApLCB3aWR0aCgwKSwgZGVmYXVsdFZpYURlZihudWxscHRyKSwgbWluU3BjKG51bGxwdHIpLCBzaG9ydENvbnN0cmFpbnQobnVsbHB0ciksIGFyZWFDb25zdHJhaW50KG51bGxwdHIpLCBtaW5TdGVwQ29uc3RyYWludChudWxscHRyKSB7fQotICAgIGZyTGF5ZXIoZnJMYXllck51bSBsYXllck51bUluLCBjb25zdCBmclN0cmluZyAmbmFtZUluKTogbGF5ZXJOdW0obGF5ZXJOdW1JbiksIG5hbWUobmFtZUluKSwgcGl0Y2goMCksIHdpZHRoKDApLCBtaW5XaWR0aCgtMSksIGRlZmF1bHRWaWFEZWYobnVsbHB0ciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5TcGMobnVsbHB0ciksIHNob3J0Q29uc3RyYWludChudWxscHRyKSwgYXJlYUNvbnN0cmFpbnQobnVsbHB0ciksIG1pblN0ZXBDb25zdHJhaW50KG51bGxwdHIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluV2lkdGhDb25zdHJhaW50KG51bGxwdHIpIHt9Ci0gICAgLy8gc2V0dGVycwotICAgIHZvaWQgc2V0TGF5ZXJOdW0oZnJMYXllck51bSBsYXllck51bUluKSB7Ci0gICAgICBsYXllck51bSA9IGxheWVyTnVtSW47Ci0gICAgfQotICAgIHZvaWQgc2V0TmFtZShjb25zdCBmclN0cmluZyAmbmFtZUluKSB7Ci0gICAgICBuYW1lID0gbmFtZUluOwotICAgIH0KLSAgICB2b2lkIHNldFBpdGNoKGZyVUludDQgaW4pIHsKLSAgICAgIHBpdGNoID0gaW47Ci0gICAgfQotICAgIHZvaWQgc2V0V2lkdGgoZnJVSW50NCB3aWR0aEluKSB7Ci0gICAgICB3aWR0aCA9IHdpZHRoSW47Ci0gICAgfQotICAgIHZvaWQgc2V0TWluV2lkdGgoZnJVSW50NCBtaW5XaWR0aEluKSB7Ci0gICAgICBtaW5XaWR0aCA9IG1pbldpZHRoSW47Ci0gICAgfQotICAgIHZvaWQgc2V0RGlyKGZyUHJlZlJvdXRpbmdEaXJFbnVtIGRpckluKSB7Ci0gICAgICBkaXIuc2V0KGRpckluKTsKLSAgICB9Ci0gICAgdm9pZCBzZXREZWZhdWx0VmlhRGVmKGZyVmlhRGVmKiBpbikgewotICAgICAgZGVmYXVsdFZpYURlZiA9IGluOwotICAgIH0KLSAgICB2b2lkIGFkZENvbnN0cmFpbnQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGZyQ29uc3RyYWludD4gJmNvbnNJbikgewotICAgICAgY29uc3RyYWludHMucHVzaF9iYWNrKGNvbnNJbik7Ci0gICAgfQotICAgIHZvaWQgc2V0VHlwZShmckxheWVyVHlwZUVudW0gdHlwZUluKSB7Ci0gICAgICB0eXBlID0gdHlwZUluOwotICAgIH0KLSAgICB2b2lkIGFkZFZpYURlZihmclZpYURlZiogdmlhRGVmSW4pIHsKLSAgICAgIHZpYURlZnMuaW5zZXJ0KHZpYURlZkluKTsKLSAgICB9Ci0KLSAgICAvLyBnZXR0ZXJzCi0gICAgZnJMYXllck51bSBnZXRMYXllck51bSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBsYXllck51bTsKLSAgICB9Ci0gICAgdm9pZCBnZXROYW1lKGZyU3RyaW5nICZuYW1lSW4pIGNvbnN0IHsKLSAgICAgIG5hbWVJbiA9IG5hbWU7Ci0gICAgfQotICAgIGZyU3RyaW5nIGdldE5hbWUoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0gICAgZnJVSW50NCBnZXRQaXRjaCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBwaXRjaDsKLSAgICB9Ci0gICAgZnJVSW50NCBnZXRXaWR0aCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiB3aWR0aDsKLSAgICB9Ci0gICAgZnJVSW50NCBnZXRNaW5XaWR0aCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBtaW5XaWR0aDsKLSAgICB9Ci0gICAgZnJQcmVmUm91dGluZ0RpciBnZXREaXIoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gZGlyOwotICAgIH0KLSAgICBmclNlZ1N0eWxlIGdldERlZmF1bHRTZWdTdHlsZSgpIGNvbnN0IHsKLSAgICAgIGZyU2VnU3R5bGUgc3R5bGU7Ci0gICAgICBzdHlsZS5zZXRXaWR0aCh3aWR0aCk7Ci0gICAgICBzdHlsZS5zZXRCZWdpblN0eWxlKGZyY0V4dGVuZEVuZFN0eWxlLCB3aWR0aC8yKTsKLSAgICAgIHN0eWxlLnNldEVuZFN0eWxlKGZyY0V4dGVuZEVuZFN0eWxlLCB3aWR0aC8yKTsKLSAgICAgIHJldHVybiBzdHlsZTsKLSAgICB9Ci0gICAgZnJWaWFEZWYqIGdldERlZmF1bHRWaWFEZWYoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gZGVmYXVsdFZpYURlZjsKLSAgICB9Ci0gICAgc3RkOjpzZXQ8ZnJWaWFEZWYqPiBnZXRWaWFEZWZzKCkgY29uc3QgewotICAgICAgcmV0dXJuIHZpYURlZnM7Ci0gICAgfQotICAgIGZyQ29sbGVjdGlvbjxzdGQ6OnNoYXJlZF9wdHI8ZnJDb25zdHJhaW50PiA+IGdldENvbnN0cmFpbnRzKCkgY29uc3QgewotICAgICAgZnJDb2xsZWN0aW9uPHN0ZDo6c2hhcmVkX3B0cjxmckNvbnN0cmFpbnQ+ID4gY29uc3RyYWludHNPdXQ7Ci0gICAgICBmb3IgKGF1dG8gY29uc3RyYWludDogY29uc3RyYWludHMpIHsKLSAgICAgICAgY29uc3RyYWludHNPdXQucHVzaF9iYWNrKGNvbnN0cmFpbnQubG9jaygpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBjb25zdHJhaW50c091dDsKLSAgICB9Ci0gICAgZnJMYXllclR5cGVFbnVtIGdldFR5cGUoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICAvLyBjdXQgY2xhc3NlcwotICAgIGJvb2wgaGFzTGVmNThDdXRDbGFzc0NvbnN0cmFpbnQoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gKGxlZjU4Q3V0Q2xhc3NDb25zdHJhaW50LmxvY2soKSkgPyB0cnVlIDogZmFsc2U7Ci0gICAgfQotICAgIHN0ZDo6c2hhcmVkX3B0cjxmckxlZjU4Q3V0Q2xhc3NDb25zdHJhaW50PiBnZXRMZWY1OEN1dENsYXNzQ29uc3RyYWludCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBsZWY1OEN1dENsYXNzQ29uc3RyYWludC5sb2NrKCk7Ci0gICAgfQotICAgIC8vIGN1dCBzcGFjaW5nIHRhYmxlCi0gICAgYm9vbCBoYXNMZWY1OEN1dFNwYWNpbmdUYWJsZUNvbnN0cmFpbnRzKCkgY29uc3QgewotICAgICAgcmV0dXJuIChsZWY1OEN1dFNwYWNpbmdUYWJsZUNvbnN0cmFpbnRzLnNpemUoKSkgPyB0cnVlIDogZmFsc2U7Ci0gICAgfQotICAgIGZyQ29sbGVjdGlvbjxzdGQ6OnNoYXJlZF9wdHI8ZnJMZWY1OEN1dFNwYWNpbmdUYWJsZUNvbnN0cmFpbnQ+ID4gZ2V0TGVmNThDdXRTcGFjaW5nVGFibGVDb25zdHJhaW50cygpIGNvbnN0IHsKLSAgICAgIGZyQ29sbGVjdGlvbjxzdGQ6OnNoYXJlZF9wdHI8ZnJMZWY1OEN1dFNwYWNpbmdUYWJsZUNvbnN0cmFpbnQ+ID4gc29sOwotICAgICAgc3RkOjp0cmFuc2Zvcm0obGVmNThDdXRTcGFjaW5nVGFibGVDb25zdHJhaW50cy5iZWdpbigpLCBsZWY1OEN1dFNwYWNpbmdUYWJsZUNvbnN0cmFpbnRzLmVuZCgpLCAKLSAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihzb2wpLCAKLSAgICAgICAgICAgICAgICAgICAgIFtdKGF1dG8gJmt2KSB7cmV0dXJuIGt2LmxvY2soKTt9KTsKLSAgICAgIHJldHVybiBzb2w7Ci0gICAgfQotICAgIC8vIGN1dCBzcGFjaW5nCi0gICAgYm9vbCBoYXNMZWY1OEN1dFNwYWNpbmdDb25zdHJhaW50cygpIGNvbnN0IHsKLSAgICAgIHJldHVybiAobGVmNThDdXRTcGFjaW5nQ29uc3RyYWludHMuc2l6ZSgpKSA/IHRydWUgOiBmYWxzZTsKLSAgICB9Ci0gICAgZnJDb2xsZWN0aW9uPHN0ZDo6c2hhcmVkX3B0cjxmckxlZjU4Q3V0U3BhY2luZ0NvbnN0cmFpbnQ+ID4gZ2V0TGVmNThDdXRTcGFjaW5nQ29uc3RyYWludHMoKSBjb25zdCB7Ci0gICAgICBmckNvbGxlY3Rpb248c3RkOjpzaGFyZWRfcHRyPGZyTGVmNThDdXRTcGFjaW5nQ29uc3RyYWludD4gPiBzb2w7Ci0gICAgICBzdGQ6OnRyYW5zZm9ybShsZWY1OEN1dFNwYWNpbmdDb25zdHJhaW50cy5iZWdpbigpLCBsZWY1OEN1dFNwYWNpbmdDb25zdHJhaW50cy5lbmQoKSwgCi0gICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoc29sKSwgCi0gICAgICAgICAgICAgICAgICAgICBbXShhdXRvICZrdikge3JldHVybiBrdi5sb2NrKCk7fSk7Ci0gICAgICByZXR1cm4gc29sOwotICAgIH0KLSAgICAvLyBzcGFjaW5nIGVuZCBvZiBsaW5lCi0gICAgYm9vbCBoYXNMZWY1OFNwYWNpbmdFbmRPZkxpbmVDb25zdHJhaW50cygpIGNvbnN0IHsKLSAgICAgIHJldHVybiAobGVmNThTcGFjaW5nRW5kT2ZMaW5lQ29uc3RyYWludHMuc2l6ZSgpKSA/IHRydWUgOiBmYWxzZTsKLSAgICB9Ci0gICAgZnJDb2xsZWN0aW9uPHN0ZDo6c2hhcmVkX3B0cjxmckxlZjU4U3BhY2luZ0VuZE9mTGluZUNvbnN0cmFpbnQ+ID4gZ2V0TGVmNThTcGFjaW5nRW5kT2ZMaW5lQ29uc3RyYWludHMoKSBjb25zdCB7Ci0gICAgICBmckNvbGxlY3Rpb248c3RkOjpzaGFyZWRfcHRyPGZyTGVmNThTcGFjaW5nRW5kT2ZMaW5lQ29uc3RyYWludD4gPiBzb2w7Ci0gICAgICBzdGQ6OnRyYW5zZm9ybShsZWY1OFNwYWNpbmdFbmRPZkxpbmVDb25zdHJhaW50cy5iZWdpbigpLCBsZWY1OFNwYWNpbmdFbmRPZkxpbmVDb25zdHJhaW50cy5lbmQoKSwgCi0gICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoc29sKSwgCi0gICAgICAgICAgICAgICAgICAgICBbXShhdXRvICZrdikge3JldHVybiBrdi5sb2NrKCk7fSk7Ci0gICAgICByZXR1cm4gc29sOwotICAgIH0KLQotICAgIC8vIG5ldyBmdW5jdGlvbnMKLSAgICBib29sIGhhc01pblNwYWNpbmcoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gKG1pblNwYyk7Ci0gICAgfQotICAgIGZyQ29uc3RyYWludCogZ2V0TWluU3BhY2luZygpIGNvbnN0IHsKLSAgICAgIHJldHVybiBtaW5TcGM7Ci0gICAgfQotICAgIHZvaWQgc2V0TWluU3BhY2luZyhmckNvbnN0cmFpbnQqIGluKSB7Ci0gICAgICBpZiAobWluU3BjICE9IG51bGxwdHIpIHsKLSAgICAgICAgc3RkOjpjb3V0IDw8Ildhcm5pbmc6IG92ZXJyaWRlIG1pbnNwYWNpbmcgcnVsZSwgIjsKLSAgICAgICAgaWYgKG1pblNwYy0+dHlwZUlkKCkgPT0gZnJDb25zdHJhaW50VHlwZUVudW06OmZyY1NwYWNpbmdDb25zdHJhaW50KSB7Ci0gICAgICAgICAgc3RkOjpjb3V0IDw8Im9yaWdpbmFsIHR5cGUgaXMgU1BBQ0lORywgIjsKLSAgICAgICAgfSBlbHNlIGlmIChtaW5TcGMtPnR5cGVJZCgpID09IGZyQ29uc3RyYWludFR5cGVFbnVtOjpmcmNTcGFjaW5nVGFibGVQcmxDb25zdHJhaW50KSB7Ci0gICAgICAgICAgc3RkOjpjb3V0IDw8Im9yaWdpbmFsIHR5cGUgaXMgU1BBQ0lOR1RBQkxFIFBBUkFMTEVMUlVOTEVOR1RILCAiOwotICAgICAgICB9IGVsc2UgaWYgKG1pblNwYy0+dHlwZUlkKCkgPT0gZnJDb25zdHJhaW50VHlwZUVudW06OmZyY1NwYWNpbmdUYWJsZVR3Q29uc3RyYWludCkgewotICAgICAgICAgIHN0ZDo6Y291dCA8PCJvcmlnaW5hbCB0eXBlIGlzIFNQQUNJTkdUQUJMRSBUV09XSURUSFMsICI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3RkOjpjb3V0IDw8Im9yaWdpbmFsIHR5cGUgaXMgVU5LTldPTiwgIjsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW4tPnR5cGVJZCgpID09IGZyQ29uc3RyYWludFR5cGVFbnVtOjpmcmNTcGFjaW5nQ29uc3RyYWludCkgewotICAgICAgICAgIHN0ZDo6Y291dCA8PCJuZXcgdHlwZSBpcyBTUEFDSU5HIjsKLSAgICAgICAgfSBlbHNlIGlmIChpbi0+dHlwZUlkKCkgPT0gZnJDb25zdHJhaW50VHlwZUVudW06OmZyY1NwYWNpbmdUYWJsZVBybENvbnN0cmFpbnQpIHsKLSAgICAgICAgICBzdGQ6OmNvdXQgPDwibmV3IHR5cGUgaXMgU1BBQ0lOR1RBQkxFIFBBUkFMTEVMUlVOTEVOR1RIIjsKLSAgICAgICAgfSBlbHNlIGlmIChpbi0+dHlwZUlkKCkgPT0gZnJDb25zdHJhaW50VHlwZUVudW06OmZyY1NwYWNpbmdUYWJsZVR3Q29uc3RyYWludCkgewotICAgICAgICAgIHN0ZDo6Y291dCA8PCJuZXcgdHlwZSBpcyBTUEFDSU5HVEFCTEUgVFdPV0lEVEhTIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzdGQ6OmNvdXQgPDwibmV3IHR5cGUgaXMgVU5LTldPTiI7Ci0gICAgICAgIH0KLSAgICAgICAgc3RkOjpjb3V0IDw8c3RkOjplbmRsOwotICAgICAgfQotICAgICAgbWluU3BjID0gaW47Ci0gICAgfQotICAgIGJvb2wgaGFzRW9sU3BhY2luZygpIGNvbnN0IHsKLSAgICAgIHJldHVybiAoZW9scy5lbXB0eSgpID8gZmFsc2UgOiB0cnVlKTsKLSAgICB9Ci0gICAgdm9pZCBhZGRFb2xTcGFjaW5nKGZyU3BhY2luZ0VuZE9mTGluZUNvbnN0cmFpbnQqIGluKSB7Ci0gICAgICBlb2xzLnB1c2hfYmFjayhpbik7Ci0gICAgfQotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGZyU3BhY2luZ0VuZE9mTGluZUNvbnN0cmFpbnQqPiYgZ2V0RW9sU3BhY2luZygpIGNvbnN0IHsKLSAgICAgIHJldHVybiBlb2xzOwotICAgIH0KLSAgICBzdGQ6OnZlY3RvcjxmclNwYWNpbmdFbmRPZkxpbmVDb25zdHJhaW50Kj4mIGdldEVvbFNwYWNpbmcoKSB7Ci0gICAgICByZXR1cm4gZW9sczsKLSAgICB9Ci0gICAgdm9pZCBhZGRDdXRDb25zdHJhaW50KGZyQ3V0U3BhY2luZ0NvbnN0cmFpbnQqIGluKSB7Ci0gICAgICBjdXRDb25zdHJhaW50cy5wdXNoX2JhY2soaW4pOwotICAgIH0KLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxmckN1dFNwYWNpbmdDb25zdHJhaW50Kj4mIGdldEN1dENvbnN0cmFpbnQoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gY3V0Q29uc3RyYWludHM7Ci0gICAgfQotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGZyQ3V0U3BhY2luZ0NvbnN0cmFpbnQqPiYgZ2V0Q3V0U3BhY2luZygpIGNvbnN0IHsKLSAgICAgIHJldHVybiBjdXRDb25zdHJhaW50czsKLSAgICB9Ci0gICAgc3RkOjp2ZWN0b3I8ZnJDdXRTcGFjaW5nQ29uc3RyYWludCo+JiBnZXRDdXRTcGFjaW5nKCkgewotICAgICAgcmV0dXJuIGN1dENvbnN0cmFpbnRzOwotICAgIH0KLSAgICBib29sIGhhc0N1dFNwYWNpbmcoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gKCFjdXRDb25zdHJhaW50cy5lbXB0eSgpKTsKLSAgICB9Ci0gICAgdm9pZCBzZXRTaG9ydENvbnN0cmFpbnQoZnJTaG9ydENvbnN0cmFpbnQqIGluKSB7Ci0gICAgICBzaG9ydENvbnN0cmFpbnQgPSBpbjsKLSAgICB9Ci0gICAgZnJTaG9ydENvbnN0cmFpbnQqIGdldFNob3J0Q29uc3RyYWludCgpIHsKLSAgICAgIHJldHVybiBzaG9ydENvbnN0cmFpbnQ7Ci0gICAgfQotICAgIHZvaWQgc2V0QXJlYUNvbnN0cmFpbnQoZnJBcmVhQ29uc3RyYWludCogaW4pIHsKLSAgICAgIGFyZWFDb25zdHJhaW50ID0gaW47Ci0gICAgfQotICAgIGZyQXJlYUNvbnN0cmFpbnQqIGdldEFyZWFDb25zdHJhaW50KCkgewotICAgICAgcmV0dXJuIGFyZWFDb25zdHJhaW50OwotICAgIH0KLSAgICB2b2lkIHNldE1pblN0ZXBDb25zdHJhaW50KGZyTWluU3RlcENvbnN0cmFpbnQqIGluKSB7Ci0gICAgICBtaW5TdGVwQ29uc3RyYWludCA9IGluOwotICAgIH0KLSAgICBmck1pblN0ZXBDb25zdHJhaW50KiBnZXRNaW5TdGVwQ29uc3RyYWludCgpIHsKLSAgICAgIHJldHVybiBtaW5TdGVwQ29uc3RyYWludDsKLSAgICB9Ci0gICAgdm9pZCBzZXRNaW5XaWR0aENvbnN0cmFpbnQoZnJNaW5XaWR0aENvbnN0cmFpbnQqIGluKSB7Ci0gICAgICBtaW5XaWR0aENvbnN0cmFpbnQgPSBpbjsKLSAgICB9Ci0gICAgZnJNaW5XaWR0aENvbnN0cmFpbnQqIGdldE1pbldpZHRoQ29uc3RyYWludCgpIHsKLSAgICAgIHJldHVybiBtaW5XaWR0aENvbnN0cmFpbnQ7Ci0gICAgfQotCi0gIHByb3RlY3RlZDoKLSAgICBmckxheWVyVHlwZUVudW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTsKLSAgICBmckxheWVyTnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJOdW07Ci0gICAgZnJTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU7Ci0gICAgZnJVSW50NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpdGNoOwotICAgIGZyVUludDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDsKLSAgICBmclVJbnQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluV2lkdGg7Ci0gICAgZnJQcmVmUm91dGluZ0RpciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcjsKLSAgICBmclZpYURlZiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZpYURlZjsKLSAgICBzdGQ6OnNldDxmclZpYURlZio+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlhRGVmczsKLSAgICBmckNvbGxlY3Rpb248c3RkOjp3ZWFrX3B0cjxmckNvbnN0cmFpbnQ+ICA+ICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludHM7Ci0gICAgc3RkOjp3ZWFrX3B0cjxmckxlZjU4Q3V0Q2xhc3NDb25zdHJhaW50PiAgICAgICAgICAgICAgICAgICAgICAgIGxlZjU4Q3V0Q2xhc3NDb25zdHJhaW50OyAgICAgCi0gICAgZnJDb2xsZWN0aW9uPHN0ZDo6d2Vha19wdHI8ZnJMZWY1OEN1dFNwYWNpbmdUYWJsZUNvbnN0cmFpbnQ+ID4gIGxlZjU4Q3V0U3BhY2luZ1RhYmxlQ29uc3RyYWludHM7Ci0gICAgZnJDb2xsZWN0aW9uPHN0ZDo6d2Vha19wdHI8ZnJMZWY1OEN1dFNwYWNpbmdDb25zdHJhaW50PiA+ICAgICAgIGxlZjU4Q3V0U3BhY2luZ0NvbnN0cmFpbnRzOwotICAgIGZyQ29sbGVjdGlvbjxzdGQ6OndlYWtfcHRyPGZyTGVmNThTcGFjaW5nRW5kT2ZMaW5lQ29uc3RyYWludD4gPiBsZWY1OFNwYWNpbmdFbmRPZkxpbmVDb25zdHJhaW50czsKLSAgICBmckNvbnN0cmFpbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluU3BjOwotICAgIHN0ZDo6dmVjdG9yPGZyU3BhY2luZ0VuZE9mTGluZUNvbnN0cmFpbnQqPiAgICAgICAgICAgICAgICAgICAgICBlb2xzOwotICAgIHN0ZDo6dmVjdG9yPGZyQ3V0U3BhY2luZ0NvbnN0cmFpbnQqPiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXRDb25zdHJhaW50czsKLSAgICBmclNob3J0Q29uc3RyYWludCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRDb25zdHJhaW50OwotICAgIGZyQXJlYUNvbnN0cmFpbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVhQ29uc3RyYWludDsKLSAgICBmck1pblN0ZXBDb25zdHJhaW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluU3RlcENvbnN0cmFpbnQ7Ci0gICAgZnJNaW5XaWR0aENvbnN0cmFpbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbldpZHRoQ29uc3RyYWludDsKLSAgfTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi90ZWNoL2ZyTG9va3VwVGJsLmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi90ZWNoL2ZyTG9va3VwVGJsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNjIyMzAuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvdGVjaC9mckxvb2t1cFRibC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX0ZSX0xPT0tVUF9UQkxfSF8KLSNkZWZpbmUgX0ZSX0xPT0tVUF9UQkxfSF8KLQotLy8gI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlICJmckJhc2VUeXBlcy5oIgotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi1uYW1lc3BhY2UgZnIgewotICBlbnVtIGNsYXNzIGZySW50ZXJwb2xhdGVUeXBlIHsKLSAgICBmcmNTbmFwRG93biwKLSAgICBmcmNTbmFwVXAsCi0gICAgZnJjTGluZWFyCi0gIH07Ci0KLSAgZW51bSBjbGFzcyBmckV4dHJhcG9sYXRlVHlwZSB7Ci0gICAgZnJjU25hcERvd24sCi0gICAgZnJjU25hcFVwLAotICAgIGZyY0xpbmVhcgotICB9OwotCi0gIC8vIGZyMURMb29rdXBUYmwKLSAgdGVtcGxhdGUgPGNsYXNzIHJvd0NsYXNzLCBjbGFzcyB2YWxDbGFzcz4KLSAgY2xhc3MgZnIxRExvb2t1cFRibCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBjb25zdHJ1Y3RvcgotICAgIGZyMURMb29rdXBUYmwoZnJTdHJpbmcgJnJvd05hbWVJbiwKLSAgICAgICAgICAgICAgICAgIGZyQ29sbGVjdGlvbjxyb3dDbGFzcz4gJnJvd3NJbiwKLSAgICAgICAgICAgICAgICAgIGZyQ29sbGVjdGlvbjx2YWxDbGFzcz4gJnZhbHNJbikgewotICAgICAgcm93TmFtZSA9IHJvd05hbWVJbjsKLSAgICAgIHJvd3MgPSByb3dzSW47Ci0gICAgICB2YWxzID0gdmFsc0luOwotICAgICAgaW50ZXJwb2xhdGVUeXBlUm93ID0gZnJJbnRlcnBvbGF0ZVR5cGU6OmZyY1NuYXBEb3duOwotICAgICAgaW50ZXJwb2xhdGVUeXBlQ29sID0gZnJJbnRlcnBvbGF0ZVR5cGU6OmZyY1NuYXBEb3duOwotICAgICAgZXh0cmFwb2xhdGVUeXBlUm93TG93ZXIgPSBmckV4dHJhcG9sYXRlVHlwZTo6ZnJjU25hcFVwOwotICAgICAgZXh0cmFwb2xhdGVUeXBlUm93VXBwZXIgPSBmckV4dHJhcG9sYXRlVHlwZTo6ZnJjU25hcFVwOwotICAgIH0KLQotICAgIC8vIGdldHRlcnMKLSAgICBmclN0cmluZyBnZXRSb3dOYW1lKCk7Ci0gICAgZnJDb2xsZWN0aW9uPHJvd0NsYXNzPiBnZXRSb3dzKCk7Ci0KLSAgICAvLyBzZXR0ZXJzCi0gICAgdm9pZCBzZXRSb3dOYW1lKGZyU3RyaW5nICZuYW1lKTsKLSAgICB2b2lkIHNldEludGVycG9sYXRlVHlwZVJvdyhmckludGVycG9sYXRlVHlwZSAmdHlwZSk7Ci0gICAgdm9pZCBzZXRJbnRlcnBvbGF0ZVR5cGVDb2woZnJJbnRlcnBvbGF0ZVR5cGUgJnR5cGUpOwotICAgIHZvaWQgc2V0RXh0cmFwb2xhdGVUeXBlUm93TG93ZXIoZnJFeHRyYXBvbGF0ZVR5cGUgJnR5cGUpOwotICAgIHZvaWQgc2V0RXh0cmFwb2xhdGVUeXBlUm93VXBwZXIoZnJFeHRyYXBvbGF0ZVR5cGUgJnR5cGUpOwotCi0gICAgLy8gb3RoZXJzCi0gICAgdmFsQ2xhc3MgZmluZChyb3dDbGFzcyAmcm93VmFsKSB7Ci0gICAgICB2YWxDbGFzcyByZXRWYWw7Ci0gICAgICBmclVJbnQ0IHJvd0lkeCA9IGdldFJvd0lkeChyb3dWYWwpOwotICAgICAgcmV0VmFsID0gdmFsc1tyb3dJZHhdOwotICAgICAgcmV0dXJuIHJldFZhbDsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBmclVJbnQ0IGdldFJvd0lkeChyb3dDbGFzcyAmcm93VmFsKSB7Ci0gICAgICAvLyBjdXJyZW50bHkgb25seSBpbXBsZW1lbnQgc3BhY2luZ3RhYmxlIHN0eWxlCi0gICAgICAvLyBpbnRlcnBvbGF0aW9uCi0gICAgICBmclVJbnQ0IHJldElkeDsKLSAgICAgIGlmIChyb3dWYWwgPj0gcm93cy5mcm9udCgpICYmIHJvd1ZhbCA8PSByb3dzLmJhY2soKSkgewotICAgICAgICBpZiAodHJ1ZSkgewotICAgICAgICAvLyBpZiAoaW50ZXJwb2xhdGVUeXBlUm93ID09IGZySW50ZXJwb2xhdGVUeXBlOjpmcmNTbmFwRG93bikgewotICAgICAgICAgIGF1dG8gcG9zID0gbG93ZXJfYm91bmQocm93cy5iZWdpbigpLCByb3dzLmVuZCgpLCByb3dWYWwpOwotICAgICAgICAgIC8vIGlmICgqcG9zICE9IHJvd1ZhbCAmJiBwb3MgIT0gcm93cy5iZWdpbigpKSB7Ci0gICAgICAgICAgLy8gICAtLXBvczsKLSAgICAgICAgICAvLyB9Ci0gICAgICAgICAgaWYgKHBvcyAhPSByb3dzLmJlZ2luKCkpIHsKLSAgICAgICAgICAgIC0tcG9zOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXRJZHggPSBwb3MgLSByb3dzLmJlZ2luKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIGxvd2VyIGV4dHJhcG9sYXRpb24KLSAgICAgIGVsc2UgaWYgKHJvd1ZhbCA8IHJvd3MuZnJvbnQoKSkgewotICAgICAgICBpZiAodHJ1ZSkgewotICAgICAgICAvLyBpZiAoZXh0cmFwb2xhdGVUeXBlUm93TG93ZXIgPT0gZnJFeHRyYXBvbGF0ZVR5cGU6OmZyY1NuYXBVcCkgewotICAgICAgICAgIHJldElkeCA9IDA7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIHVwcGVyIGV4dHJhcG9sYXRpb24KLSAgICAgIGVsc2UgewotICAgICAgICBpZiAodHJ1ZSkgewotICAgICAgICAvLyBpZiAoZXh0cmFwb2xhdGVUeXBlUm93VXBwZXIgPT0gZnJFeHRyYXBvbGF0ZVR5cGU6OmZyY1NuYXBEb3duKSB7Ci0gICAgICAgICAgcmV0SWR4ID0gcm93cy5zaXplKCkgLSAxOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmV0SWR4OwotICAgIH0KLQotCi0KLSAgICBmckNvbGxlY3Rpb248cm93Q2xhc3M+IHJvd3M7Ci0gICAgZnJDb2xsZWN0aW9uPHZhbENsYXNzPiB2YWxzOwotCi0KLSAgICBmclN0cmluZyByb3dOYW1lOwotCi0gICAgZnJJbnRlcnBvbGF0ZVR5cGUgaW50ZXJwb2xhdGVUeXBlUm93OwotICAgIGZySW50ZXJwb2xhdGVUeXBlIGludGVycG9sYXRlVHlwZUNvbDsKLSAgICBmckV4dHJhcG9sYXRlVHlwZSBleHRyYXBvbGF0ZVR5cGVSb3dMb3dlcjsKLSAgICBmckV4dHJhcG9sYXRlVHlwZSBleHRyYXBvbGF0ZVR5cGVSb3dVcHBlcjsKLQotCi0gIH07Ci0KLQotICAvLyBmcjJETG9va3VwVGJsCi0gIHRlbXBsYXRlIDxjbGFzcyByb3dDbGFzcywgY2xhc3MgY29sQ2xhc3MsIGNsYXNzIHZhbENsYXNzPgotICBjbGFzcyBmcjJETG9va3VwVGJsIHsKLSAgcHVibGljOgotICAgIGZyaWVuZCBjbGFzcyBmckxlZjU4U3BhY2luZ1RhYmxlQ29uc3RyYWludDsKLSAgICAvLyBjb25zdHJ1Y3RvcgotICAgIGZyMkRMb29rdXBUYmwoKSB7fQotICAgIGZyMkRMb29rdXBUYmwoY29uc3QgZnIyRExvb2t1cFRibCAmaW4pOiByb3dzKGluLnJvd3MpLCBjb2xzKGluLmNvbHMpLCB2YWxzKGluLnZhbHMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dOYW1lKGluLnJvd05hbWUpLCBjb2xOYW1lKGluLmNvbE5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZVR5cGVSb3coaW4uaW50ZXJwb2xhdGVUeXBlUm93KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGVUeXBlQ29sKGluLmludGVycG9sYXRlVHlwZUNvbCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhcG9sYXRlVHlwZVJvd0xvd2VyKGluLmV4dHJhcG9sYXRlVHlwZVJvd0xvd2VyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFwb2xhdGVUeXBlUm93VXBwZXIoaW4uZXh0cmFwb2xhdGVUeXBlUm93VXBwZXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYXBvbGF0ZVR5cGVDb2xMb3dlcihpbi5leHRyYXBvbGF0ZVR5cGVDb2xMb3dlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhcG9sYXRlVHlwZUNvbFVwcGVyKGluLmV4dHJhcG9sYXRlVHlwZUNvbFVwcGVyKSB7fQotICAgIGZyMkRMb29rdXBUYmwoY29uc3QgZnJTdHJpbmcgJnJvd05hbWVJbiwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGZyQ29sbGVjdGlvbjxyb3dDbGFzcz4gJnJvd3NJbiwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGZyU3RyaW5nICZjb2xOYW1lSW4sCi0gICAgICAgICAgICAgICAgICBjb25zdCBmckNvbGxlY3Rpb248Y29sQ2xhc3M+ICZjb2xzSW4sCi0gICAgICAgICAgICAgICAgICBjb25zdCBmckNvbGxlY3Rpb248ZnJDb2xsZWN0aW9uPHZhbENsYXNzPiA+ICZ2YWxzSW4pIHsKLSAgICAgIHJvd05hbWUgPSByb3dOYW1lSW47Ci0gICAgICByb3dzID0gcm93c0luOwotICAgICAgY29sTmFtZSA9IGNvbE5hbWVJbjsKLSAgICAgIGNvbHMgPSBjb2xzSW47Ci0gICAgICB2YWxzID0gdmFsc0luOwotICAgICAgaW50ZXJwb2xhdGVUeXBlUm93ID0gZnJJbnRlcnBvbGF0ZVR5cGU6OmZyY1NuYXBEb3duOwotICAgICAgaW50ZXJwb2xhdGVUeXBlQ29sID0gZnJJbnRlcnBvbGF0ZVR5cGU6OmZyY1NuYXBEb3duOwotICAgICAgZXh0cmFwb2xhdGVUeXBlUm93TG93ZXIgPSBmckV4dHJhcG9sYXRlVHlwZTo6ZnJjU25hcFVwOwotICAgICAgZXh0cmFwb2xhdGVUeXBlUm93VXBwZXIgPSBmckV4dHJhcG9sYXRlVHlwZTo6ZnJjU25hcFVwOwotICAgICAgZXh0cmFwb2xhdGVUeXBlQ29sTG93ZXIgPSBmckV4dHJhcG9sYXRlVHlwZTo6ZnJjU25hcERvd247Ci0gICAgICBleHRyYXBvbGF0ZVR5cGVDb2xVcHBlciA9IGZyRXh0cmFwb2xhdGVUeXBlOjpmcmNTbmFwRG93bjsKLSAgICB9Ci0KLSAgICAvLyBnZXR0ZXJzCi0gICAgZnJTdHJpbmcgZ2V0Um93TmFtZSgpIGNvbnN0OwotICAgIGZyU3RyaW5nIGdldENvbE5hbWUoKSBjb25zdDsKLQotICAgIGZyQ29sbGVjdGlvbjxyb3dDbGFzcz4gZ2V0Um93cygpIHsKLSAgICAgIHJldHVybiByb3dzOwotICAgIH0KLSAgICBmckNvbGxlY3Rpb248Y29sQ2xhc3M+IGdldENvbHMoKSB7Ci0gICAgICByZXR1cm4gY29sczsKLSAgICB9Ci0KLSAgICAvLyBzZXR0ZXJzCi0gICAgdm9pZCBzZXRSb3dOYW1lKGZyU3RyaW5nICZuYW1lKTsKLSAgICB2b2lkIHNldENvbE5hbWUoZnJTdHJpbmcgJm5hbWUpOwotICAgIHZvaWQgc2V0SW50ZXJwb2xhdGVUeXBlUm93KGZySW50ZXJwb2xhdGVUeXBlICZ0eXBlKTsKLSAgICB2b2lkIHNldEludGVycG9sYXRlVHlwZUNvbChmckludGVycG9sYXRlVHlwZSAmdHlwZSk7Ci0gICAgdm9pZCBzZXRFeHRyYXBvbGF0ZVR5cGVSb3dMb3dlcihmckV4dHJhcG9sYXRlVHlwZSAmdHlwZSk7Ci0gICAgdm9pZCBzZXRFeHRyYXBvbGF0ZVR5cGVDb2xMb3dlcihmckV4dHJhcG9sYXRlVHlwZSAmdHlwZSk7Ci0gICAgdm9pZCBzZXRFeHRyYXBvbGF0ZVR5cGVSb3dVcHBlcihmckV4dHJhcG9sYXRlVHlwZSAmdHlwZSk7Ci0gICAgdm9pZCBzZXRFeHRyYXBvbGF0ZVR5cGVDb2xVcHBlcihmckV4dHJhcG9sYXRlVHlwZSAmdHlwZSk7Ci0KLSAgICAvLyBvdGhlcnMKLSAgICB2YWxDbGFzcyBmaW5kKGNvbnN0IHJvd0NsYXNzICZyb3dWYWwsIGNvbnN0IGNvbENsYXNzICZjb2xWYWwpIGNvbnN0IHsKLSAgICAgIHZhbENsYXNzIHJldFZhbDsKLSAgICAgIGZyVUludDQgcm93SWR4ID0gZ2V0Um93SWR4KHJvd1ZhbCk7Ci0gICAgICBmclVJbnQ0IGNvbElkeCA9IGdldENvbElkeChjb2xWYWwpOwotICAgICAgLy9zdGQ6OmNvdXQgPDwgInJvd0lkeCA9ICIgPDwgcm93SWR4IDw8ICIsIGNvbElkeCA9ICIgPDwgY29sSWR4IDw8IHN0ZDo6ZW5kbCA8PHN0ZDo6Zmx1c2g7Ci0gICAgICByZXRWYWwgPSB2YWxzW3Jvd0lkeF1bY29sSWR4XTsKLSAgICAgIHJldHVybiByZXRWYWw7Ci0gICAgfQotCi0gICAgLy8gZGVidWcKLSAgICB2b2lkIHByaW50VGJsKCkgY29uc3QgewotICAgICAgc3RkOjpjb3V0IDw8ICJyb3dOYW1lOiAiIDw8IHJvd05hbWUgPDwgc3RkOjplbmRsOwotICAgICAgZm9yIChhdXRvICZtIDogcm93cykgewotICAgICAgICBzdGQ6OmNvdXQgPDwgbSA8PCAiICI7Ci0gICAgICB9Ci0gICAgICBzdGQ6OmNvdXQgPDwgIlxuIGNvbE5hbWU6ICIgPDwgY29sTmFtZSA8PCBzdGQ6OmVuZGw7Ci0gICAgICBmb3IgKGF1dG8gJm0gOiBjb2xzKSB7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCBtIDw8ICIgIjsKLSAgICAgIH0KLSAgICAgIHN0ZDo6Y291dCA8PCAiXG4gdmFsczogIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICBmb3IgKGF1dG8gJm0gOiB2YWxzKSB7Ci0gICAgICAgIGZvciAoYXV0byAmbiA6IG0pIHsKLSAgICAgICAgICBzdGQ6OmNvdXQgPDwgbiA8PCAiICI7Ci0gICAgICAgIH0KLSAgICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBmclVJbnQ0IGdldFJvd0lkeChjb25zdCByb3dDbGFzcyAmcm93VmFsKSBjb25zdCB7Ci0gICAgICAvLyBjdXJyZW50bHkgb25seSBpbXBsZW1lbnQgc3BhY2luZ3RhYmxlIHN0eWxlCi0gICAgICBhdXRvIHBvcyA9IC0tKHN0ZDo6bG93ZXJfYm91bmQocm93cy5iZWdpbigpLCByb3dzLmVuZCgpLCByb3dWYWwpKTsKLSAgICAgIHJldHVybiBzdGQ6Om1heCgwLCAoaW50KXN0ZDo6ZGlzdGFuY2Uocm93cy5iZWdpbigpLCBwb3MpKTsKLSAgICB9Ci0gICAgZnJVSW50NCBnZXRDb2xJZHgoY29uc3QgY29sQ2xhc3MgJmNvbFZhbCkgY29uc3QgewotICAgICAgLy8gY3VycmVudGx5IG9ubHkgaW1wbGVtZW50IHNwYWNpbmd0YWJsZSBzdHlsZQotICAgICAgYXV0byBwb3MgPSAtLShzdGQ6Omxvd2VyX2JvdW5kKGNvbHMuYmVnaW4oKSwgY29scy5lbmQoKSwgY29sVmFsKSk7Ci0gICAgICByZXR1cm4gc3RkOjptYXgoMCwgKGludClzdGQ6OmRpc3RhbmNlKGNvbHMuYmVnaW4oKSwgcG9zKSk7Ci0gICAgfQotICAgIC8vZnJVSW50NCBnZXRSb3dJZHgoY29uc3Qgcm93Q2xhc3MgJnJvd1ZhbCkgY29uc3QgewotICAgIC8vICAvLyBjdXJyZW50bHkgb25seSBpbXBsZW1lbnQgc3BhY2luZ3RhYmxlIHN0eWxlCi0gICAgLy8gIC8vIGludGVycG9sYXRpb24KLSAgICAvLyAgZnJVSW50NCByZXRJZHg7Ci0gICAgLy8gIGlmIChyb3dWYWwgPj0gcm93cy5mcm9udCgpICYmIHJvd1ZhbCA8PSByb3dzLmJhY2soKSkgewotICAgIC8vICAgIGlmICh0cnVlKSB7Ci0gICAgLy8gICAgLy8gaWYgKGludGVycG9sYXRlVHlwZVJvdyA9PSBmckludGVycG9sYXRlVHlwZTo6ZnJjU25hcERvd24pIHsKLSAgICAvLyAgICAgIGF1dG8gcG9zID0gbG93ZXJfYm91bmQocm93cy5iZWdpbigpLCByb3dzLmVuZCgpLCByb3dWYWwpOwotICAgIC8vICAgICAgaWYgKCpwb3MgIT0gcm93VmFsICYmIHBvcyAhPSByb3dzLmJlZ2luKCkpIHsKLSAgICAvLyAgICAgICAgLS1wb3M7Ci0gICAgLy8gICAgICB9Ci0gICAgLy8gICAgICByZXRJZHggPSBwb3MgLSByb3dzLmJlZ2luKCk7Ci0gICAgLy8gICAgfQotICAgIC8vICB9Ci0gICAgLy8gIC8vIGxvd2VyIGV4dHJhcG9sYXRpb24KLSAgICAvLyAgZWxzZSBpZiAocm93VmFsIDwgcm93cy5mcm9udCgpKSB7Ci0gICAgLy8gICAgaWYgKHRydWUpIHsKLSAgICAvLyAgICAvLyBpZiAoZXh0cmFwb2xhdGVUeXBlUm93TG93ZXIgPT0gZnJFeHRyYXBvbGF0ZVR5cGU6OmZyY1NuYXBVcCkgewotICAgIC8vICAgICAgcmV0SWR4ID0gMDsKLSAgICAvLyAgICB9Ci0gICAgLy8gIH0KLSAgICAvLyAgLy8gdXBwZXIgZXh0cmFwb2xhdGlvbgotICAgIC8vICBlbHNlIHsKLSAgICAvLyAgICBpZiAodHJ1ZSkgewotICAgIC8vICAgIC8vIGlmIChleHRyYXBvbGF0ZVR5cGVSb3dVcHBlciA9PSBmckV4dHJhcG9sYXRlVHlwZTo6ZnJjU25hcERvd24pIHsKLSAgICAvLyAgICAgIHJldElkeCA9IHJvd3Muc2l6ZSgpIC0gMTsKLSAgICAvLyAgICB9Ci0gICAgLy8gIH0KLSAgICAvLyAgcmV0dXJuIHJldElkeDsKLSAgICAvL30KLSAgICAvL2ZyVUludDQgZ2V0Q29sSWR4KGNvbnN0IGNvbENsYXNzICZjb2xWYWwpIGNvbnN0IHsKLSAgICAvLyAgLy8gY3VycmVudGx5IG9ubHkgaW1wbGVtZW50IHNwYWNpbmd0YWJsZSBzdHlsZQotICAgIC8vICAvLyBpbnRlcnBvbGF0aW9uCi0gICAgLy8gIGZyVUludDQgcmV0SWR4OwotICAgIC8vICBpZiAoY29sVmFsID49IGNvbHMuZnJvbnQoKSAmJiBjb2xWYWwgPD0gY29scy5iYWNrKCkpIHsKLSAgICAvLyAgICBpZiAodHJ1ZSkgewotICAgIC8vICAgIC8vIGlmIChpbnRlcnBvbGF0ZVR5cGVDb2wgPT0gZnJJbnRlcnBvbGF0ZVR5cGU6OmZyY1NuYXBEb3duKSB7Ci0gICAgLy8gICAgICBhdXRvIHBvcyA9IGxvd2VyX2JvdW5kKGNvbHMuYmVnaW4oKSwgY29scy5lbmQoKSwgY29sVmFsKTsKLSAgICAvLyAgICAgIGlmICgqcG9zICE9IGNvbFZhbCAmJiBwb3MgIT0gY29scy5iZWdpbigpKSB7Ci0gICAgLy8gICAgICAgIC0tcG9zOwotICAgIC8vICAgICAgfQotICAgIC8vICAgICAgcmV0SWR4ID0gcG9zIC0gY29scy5iZWdpbigpOwotICAgIC8vICAgIH0KLSAgICAvLyAgfQotICAgIC8vICAvLyBsb3dlciBleHRyYXBvbGF0aW9uCi0gICAgLy8gIGVsc2UgaWYgKGNvbFZhbCA8IGNvbHMuZnJvbnQoKSkgewotICAgIC8vICAgIGlmICh0cnVlKSB7Ci0gICAgLy8gICAgLy8gaWYgKGV4dHJhcG9sYXRlVHlwZUNvbExvd2VyID09IGZyRXh0cmFwb2xhdGVUeXBlOjpmcmNTbmFwVXApIHsKLSAgICAvLyAgICAgIHJldElkeCA9IDA7Ci0gICAgLy8gICAgfQotICAgIC8vICB9Ci0gICAgLy8gIC8vIHVwcGVyIGV4dHJhcG9sYXRpb24KLSAgICAvLyAgZWxzZSB7Ci0gICAgLy8gICAgaWYgKHRydWUpIHsKLSAgICAvLyAgICAvLyBpZiAoZXh0cmFwb2xhdGVUeXBlQ29sVXBwZXIgPT0gZnJFeHRyYXBvbGF0ZVR5cGU6OmZyY1NuYXBEb3duKSB7Ci0gICAgLy8gICAgICByZXRJZHggPSBjb2xzLnNpemUoKSAtIDE7Ci0gICAgLy8gICAgfQotICAgIC8vICB9Ci0gICAgLy8gIHJldHVybiByZXRJZHg7ICAKLSAgICAvL30KLQotCi0gICAgZnJDb2xsZWN0aW9uPHJvd0NsYXNzPiByb3dzOwotICAgIGZyQ29sbGVjdGlvbjxjb2xDbGFzcz4gY29sczsKLSAgICBmckNvbGxlY3Rpb248ZnJDb2xsZWN0aW9uPHZhbENsYXNzPiA+IHZhbHM7Ci0KLQotICAgIGZyU3RyaW5nIHJvd05hbWU7Ci0gICAgZnJTdHJpbmcgY29sTmFtZTsKLQotICAgIGZySW50ZXJwb2xhdGVUeXBlIGludGVycG9sYXRlVHlwZVJvdzsKLSAgICBmckludGVycG9sYXRlVHlwZSBpbnRlcnBvbGF0ZVR5cGVDb2w7Ci0gICAgZnJFeHRyYXBvbGF0ZVR5cGUgZXh0cmFwb2xhdGVUeXBlUm93TG93ZXI7Ci0gICAgZnJFeHRyYXBvbGF0ZVR5cGUgZXh0cmFwb2xhdGVUeXBlUm93VXBwZXI7Ci0gICAgZnJFeHRyYXBvbGF0ZVR5cGUgZXh0cmFwb2xhdGVUeXBlQ29sTG93ZXI7Ci0gICAgZnJFeHRyYXBvbGF0ZVR5cGUgZXh0cmFwb2xhdGVUeXBlQ29sVXBwZXI7Ci0KLQotICB9OwotCi0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi90ZWNoL2ZyVGVjaE9iamVjdC5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvdGVjaC9mclRlY2hPYmplY3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZkYWY3Ni4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi90ZWNoL2ZyVGVjaE9iamVjdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX0ZSX1RFQ0hPQkpFQ1RfSF8KLSNkZWZpbmUgX0ZSX1RFQ0hPQkpFQ1RfSF8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgImZyQmFzZVR5cGVzLmgiCi0jaW5jbHVkZSAiZGIvdGVjaC9mckxheWVyLmgiCi0jaW5jbHVkZSAiZGIvb2JqL2ZyVmlhLmgiCi0jaW5jbHVkZSAiZGIvdGVjaC9mclZpYVJ1bGVHZW5lcmF0ZS5oIgotCi1uYW1lc3BhY2UgZnIgewotICBuYW1lc3BhY2UgaW8gewotICAgIGNsYXNzIFBhcnNlcjsKLSAgfQotICBjbGFzcyBmclRlY2hPYmplY3QgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3JzCi0gICAgZnJUZWNoT2JqZWN0KCkge30KLSAgICAvLyBnZXR0ZXJzCi0gICAgZnJVSW50NCBnZXREQlVQZXJVVSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBkYlVuaXQ7Ci0gICAgfQotICAgIGZyTGF5ZXIqIGdldExheWVyKGNvbnN0IGZyU3RyaW5nICZuYW1lKSBjb25zdCB7Ci0gICAgICBpZiAobmFtZTJsYXllci5maW5kKG5hbWUpID09IG5hbWUybGF5ZXIuZW5kKCkpIHsKLSAgICAgICAgLy8gc3RkOjpjb3V0IDw8IkVycm9yOiBjYW5ub3QgZmluZCBsYXllciIgPDxzdGQ6OmVuZGw7Ci0gICAgICAgIC8vIGV4aXQoMSk7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG5hbWUybGF5ZXIuYXQobmFtZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGZyTGF5ZXIqIGdldExheWVyKGZyTGF5ZXJOdW0gaW4pIGNvbnN0IHsKLSAgICAgIGlmICgoaW50KWluIDwgMCB8fCBpbiA+PSAoaW50KWxheWVycy5zaXplKCkpIHsKLSAgICAgICAgc3RkOjpjb3V0IDw8IkVycm9yOiBjYW5ub3QgZmluZCBsYXllciIgPDxzdGQ6OmVuZGw7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbGF5ZXJzLmF0KGluKS5nZXQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZnJMYXllck51bSBnZXRCb3R0b21MYXllck51bSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBmckxheWVyTnVtIGdldFRvcExheWVyTnVtKCkgY29uc3QgewotICAgICAgcmV0dXJuIChmckxheWVyTnVtKSgoaW50KWxheWVycy5zaXplKCkgLSAxKTsKLSAgICB9Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGZyTGF5ZXI+ID4mIGdldExheWVycygpIHsKLSAgICAgIHJldHVybiBsYXllcnM7Ci0gICAgfQotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxmckxheWVyPiA+JiBnZXRMYXllcnMoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbGF5ZXJzOwotICAgIH0KLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZnJWaWFEZWY+ID4mIGdldFZpYXMoKSB7Ci0gICAgICByZXR1cm4gdmlhczsKLSAgICB9Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGZyVmlhRGVmPiA+JiBnZXRWaWFzKCkgY29uc3QgewotICAgICAgcmV0dXJuIHZpYXM7Ci0gICAgfQotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxmclZpYVJ1bGVHZW5lcmF0ZT4gPiYgZ2V0VmlhUnVsZUdlbmVyYXRlcygpIHsKLSAgICAgIHJldHVybiB2aWFSdWxlR2VuZXJhdGVzOwotICAgIH0KLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZnJWaWFSdWxlR2VuZXJhdGU+ID4mIGdldFZpYVJ1bGVHZW5lcmF0ZXMoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gdmlhUnVsZUdlbmVyYXRlczsKLSAgICB9Ci0KLSAgICAvLyBzZXR0ZXJzCi0gICAgdm9pZCBzZXREQlVQZXJVVShmclVJbnQ0IHVJbikgewotICAgICAgZGJVbml0ID0gdUluOwotICAgIH0KLSAgICB2b2lkIGFkZExheWVyKHN0ZDo6dW5pcXVlX3B0cjxmckxheWVyPiAmaW4pIHsKLSAgICAgIG5hbWUybGF5ZXJbaW4tPmdldE5hbWUoKV0gPSBpbi5nZXQoKTsKLSAgICAgIGxheWVycy5wdXNoX2JhY2soc3RkOjptb3ZlKGluKSk7Ci0gICAgfQotICAgIHZvaWQgYWRkVmlhKHN0ZDo6dW5pcXVlX3B0cjxmclZpYURlZj4gJmluKSB7Ci0gICAgICBuYW1lMnZpYVtpbi0+Z2V0TmFtZSgpXSA9IGluLmdldCgpOwotICAgICAgdmlhcy5wdXNoX2JhY2soc3RkOjptb3ZlKGluKSk7Ci0gICAgfQotICAgIHZvaWQgYWRkVmlhUnVsZUdlbmVyYXRlKHN0ZDo6dW5pcXVlX3B0cjxmclZpYVJ1bGVHZW5lcmF0ZT4gJmluKSB7Ci0gICAgICBuYW1lMnZpYVJ1bGVHZW5lcmF0ZVtpbi0+Z2V0TmFtZSgpXSA9IGluLmdldCgpOwotICAgICAgdmlhUnVsZUdlbmVyYXRlcy5wdXNoX2JhY2soc3RkOjptb3ZlKGluKSk7Ci0gICAgfQotICAgIHZvaWQgYWRkQ29uc3RyYWludChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8ZnJDb25zdHJhaW50PiAmY29uc3RyYWludEluKSB7Ci0gICAgICBjb25zdHJhaW50cy5wdXNoX2JhY2soY29uc3RyYWludEluKTsKLSAgICB9Ci0gICAgdm9pZCBhZGRVQ29uc3RyYWludChzdGQ6OnVuaXF1ZV9wdHI8ZnJDb25zdHJhaW50PiAmaW4pIHsKLSAgICAgIHVDb25zdHJhaW50cy5wdXNoX2JhY2soc3RkOjptb3ZlKGluKSk7Ci0gICAgfQotCi0gICAgLy8gZGVidWcKLSAgICB2b2lkIHByaW50QWxsQ29uc3RyYWludHMoKSB7Ci0gICAgICBzdGQ6OmNvdXQgPDwgIkxpc3Qgb2YgQ29uc3RyYWludHM6XG4iOwotICAgICAgZm9yIChhdXRvICZsYXllcjogbGF5ZXJzKSB7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCAiICBMYXllciAiIDw8IGxheWVyLT5nZXROYW1lKCkgPDwgIlxuIjsKLSAgICAgICAgZm9yIChhdXRvICZjb25zdHJhaW50OiBsYXllci0+Z2V0Q29uc3RyYWludHMoKSkgewotICAgICAgICAgIGlmIChzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PGZyQ3V0U3BhY2luZ0NvbnN0cmFpbnQ+KGNvbnN0cmFpbnQpKSB7Ci0gICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIiAgICBDVVQgU1BBQ0lORyAiIDw8IHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8ZnJDdXRTcGFjaW5nQ29uc3RyYWludD4oY29uc3RyYWludCktPmdldEN1dFNwYWNpbmcoKSAqIDEuMCAvIGRiVW5pdCA8PCAiXG4iOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxmclNwYWNpbmdDb25zdHJhaW50Pihjb25zdHJhaW50KSkgewotICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICIgICAgUk9VVElORyBTUEFDSU5HICIgPDwgc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxmclNwYWNpbmdDb25zdHJhaW50Pihjb25zdHJhaW50KS0+Z2V0TWluU3BhY2luZygpICogMS4wIC8gZGJVbml0IDw8ICJcbiI7IAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcHJpbnREZWZhdWx0VmlhcygpIHsKLSAgICAgIHN0ZDo6Y291dCA8PCAiTGlzdCBvZiBkZWZhdWx0IHZpYXM6XG4iOwotICAgICAgZm9yIChhdXRvICZsYXllcjogbGF5ZXJzKSB7Ci0gICAgICAgIGlmIChsYXllci0+Z2V0VHlwZSgpID09IGZyTGF5ZXJUeXBlRW51bTo6Q1VUKSB7Ci0gICAgICAgICAgc3RkOjpjb3V0IDw8ICIgIExheWVyICIgPDwgbGF5ZXItPmdldE5hbWUoKSA8PCAiXG4iIDw8IHN0ZDo6Zmx1c2g7Ci0gICAgICAgICAgc3RkOjpjb3V0IDw8ICIgICAgZGVmYXVsdCB2aWE6ICIgPDwgbGF5ZXItPmdldERlZmF1bHRWaWFEZWYoKS0+Z2V0TmFtZSgpIDw8ICJcbiI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgICAKLQotICAgIC8vIG90aGVycwotICAgIHZvaWQgcHJpbnRBbGxWaWFzKCk7Ci0gICAgZnJpZW5kIGNsYXNzIGlvOjpQYXJzZXI7Ci0gIHByb3RlY3RlZDoKLSAgICBmclVJbnQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJVbml0OwotCi0gICAgc3RkOjptYXA8ZnJTdHJpbmcsIGZyTGF5ZXIqPiAgICAgICAgICAgICAgICAgICAgIG5hbWUybGF5ZXI7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGZyTGF5ZXI+ID4gICAgICAgICAgIGxheWVyczsKLQotICAgIHN0ZDo6bWFwPGZyU3RyaW5nLCBmclZpYURlZio+ICAgICAgICAgICAgICAgICAgICBuYW1lMnZpYTsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZnJWaWFEZWY+ID4gICAgICAgICAgdmlhczsKLQotICAgIHN0ZDo6bWFwPGZyU3RyaW5nLCBmclZpYVJ1bGVHZW5lcmF0ZSo+ICAgICAgICAgICBuYW1lMnZpYVJ1bGVHZW5lcmF0ZTsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZnJWaWFSdWxlR2VuZXJhdGU+ID4gdmlhUnVsZUdlbmVyYXRlczsKLQotICAgIGZyQ29sbGVjdGlvbjxzdGQ6OnNoYXJlZF9wdHI8ZnJDb25zdHJhaW50PiA+ICAgICBjb25zdHJhaW50czsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZnJDb25zdHJhaW50PiA+ICAgICAgdUNvbnN0cmFpbnRzOwotICB9OwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL3RlY2gvZnJWaWFEZWYuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL3RlY2gvZnJWaWFEZWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBjOTE1MC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kYi90ZWNoL2ZyVmlhRGVmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyogQXV0aG9yczogTHV0b25nIFdhbmcgYW5kIEJhbmdxaSBYdSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBfRlJfVklBREVGX0hfCi0jZGVmaW5lIF9GUl9WSUFERUZfSF8KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSAiZnJCYXNlVHlwZXMuaCIKLSNpbmNsdWRlICJkYi9vYmovZnJTaGFwZS5oIgotCi1uYW1lc3BhY2UgZnJ7Ci0gIGNsYXNzIGZyTGVmNThDdXRDbGFzcyB7Ci0gIHB1YmxpYzoKLSAgICAvLyBjb25zdHJ1Y3RvcnMKLSAgICBmckxlZjU4Q3V0Q2xhc3MoKTogbmFtZSgiIiksIHZpYVdpZHRoKDApLCB2aWFMZW5ndGgoMCksIG51bUN1dCgxKSB7fQotICAgIC8vIGdldHRlcnMKLSAgICB2b2lkIGdldE5hbWUoZnJTdHJpbmcgJmluKSBjb25zdCB7Ci0gICAgICBpbiA9IG5hbWU7Ci0gICAgfQotICAgIGZyU3RyaW5nIGdldE5hbWUoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0gICAgZnJDb29yZCBnZXRWaWFXaWR0aCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiB2aWFXaWR0aDsKLSAgICB9Ci0gICAgYm9vbCBoYXNWaWFMZW5ndGgoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gKHZpYUxlbmd0aCA9PSB2aWFXaWR0aCkgPyBmYWxzZSA6IHRydWU7Ci0gICAgfQotICAgIGZyQ29vcmQgZ2V0VmlhTGVuZ3RoKCkgY29uc3QgewotICAgICAgcmV0dXJuIHZpYUxlbmd0aDsKLSAgICB9Ci0gICAgLy9ib29sIGhhc051bUN1dCgpIGNvbnN0IHsKLSAgICAvLyAgcmV0dXJuIGhOdW1DdXQ7Ci0gICAgLy99Ci0gICAgZnJVSW50NCBnZXROdW1DdXQoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbnVtQ3V0OwotICAgIH0KLSAgICAvLyBzZXR0ZXJzCi0gICAgdm9pZCBzZXROYW1lKGZyU3RyaW5nICZpbikgewotICAgICAgbmFtZSA9IGluOwotICAgIH0KLSAgICB2b2lkIHNldFZpYVdpZHRoKGZyQ29vcmQgaW4pIHsKLSAgICAgIHZpYVdpZHRoID0gaW47Ci0gICAgfQotICAgIHZvaWQgc2V0VmlhTGVuZ3RoKGZyQ29vcmQgaW4pIHsKLSAgICAgIC8vaFZpYUxlbmd0aCA9IHRydWU7Ci0gICAgICB2aWFMZW5ndGggPSBpbjsKLSAgICB9Ci0gICAgdm9pZCBzZXROdW1DdXQoZnJVSW50NCBpbikgewotICAgICAgbnVtQ3V0ID0gaW47Ci0gICAgfQotICBwcm90ZWN0ZWQ6Ci0gICAgZnJTdHJpbmcgbmFtZTsKLSAgICBmckNvb3JkICB2aWFXaWR0aDsKLSAgICAvL2Jvb2wgICAgIGhWaWFMZW5ndGg7Ci0gICAgZnJDb29yZCAgdmlhTGVuZ3RoOwotICAgIGZyVUludDQgIG51bUN1dDsgLy8gdGhpcyB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gI211bHRpIGN1dHMsIG9ubHkgdXNlZCBmb3IgY2FsY3VsYXRpbmcgcmVzaXN0YW5jZSwgY3VycmVudGx5IGlnbm9yZWQgaW4gcnVsZSBjaGVja2luZyBwcm9jZXNzCi0gIH07Ci0KLQotICBjbGFzcyBmclZpYURlZiB7Ci0gIHB1YmxpYzoKLSAgICAvLyBjb25zdHJ1Y3RvcnMKLSAgICBmclZpYURlZigpOiBuYW1lKCksIGlzRGVmYXVsdChmYWxzZSksIGxheWVyMUZpZ3MoKSwgbGF5ZXIyRmlncygpLCBjdXRGaWdzKCksIGN1dENsYXNzKCkge30KLSAgICAvL2ZyVmlhRGVmKGNvbnN0IGZyVmlhRGVmICZpbik6IG5hbWUoZGVmSW4ubmFtZSksIGlzRGVmYXVsdChkZWZJbi5pc0RlZmF1bHQpLCBjdXRDbGFzcyhkZWZJbi5jdXRDbGFzcykge30KLSAgICBmclZpYURlZihjb25zdCBmclN0cmluZyAmbmFtZUluKTogbmFtZShuYW1lSW4pLCBpc0RlZmF1bHQoZmFsc2UpLCBsYXllcjFGaWdzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIyRmlncygpLCBjdXRGaWdzKCksIGN1dENsYXNzKCkge30KLSAgICAvLyBnZXR0ZXJzCi0gICAgdm9pZCBnZXROYW1lKGZyU3RyaW5nICZuYW1lSW4pIGNvbnN0IHsKLSAgICAgIG5hbWVJbiA9IG5hbWU7Ci0gICAgfQotICAgIGZyU3RyaW5nIGdldE5hbWUoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0gICAgZnJMYXllck51bSBnZXRMYXllcjFOdW0oKSBjb25zdCB7Ci0gICAgICBpZiAobGF5ZXIxRmlncy5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIChsYXllcjFGaWdzLmF0KDApKS0+Z2V0TGF5ZXJOdW0oKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCJFcnJvcjogdmlhIGRvZXMgbm90IGhhdmUgc2hhcGUgb24gbGF5ZXIgMSIgPDxzdGQ6OmVuZGw7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGZyTGF5ZXJOdW0gZ2V0TGF5ZXIyTnVtKCkgY29uc3QgewotICAgICAgaWYgKGxheWVyMkZpZ3Muc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiAobGF5ZXIyRmlncy5hdCgwKSktPmdldExheWVyTnVtKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzdGQ6OmNvdXQgPDwiRXJyb3I6IHZpYSBkb2VzIG5vdCBoYXZlIHNoYXBlIG9uIGxheWVyIDIiIDw8c3RkOjplbmRsOwotICAgICAgICBleGl0KDEpOwotICAgICAgfQotICAgIH0KLSAgICBmckxheWVyTnVtIGdldEN1dExheWVyTnVtKCkgY29uc3QgewotICAgICAgaWYgKGN1dEZpZ3Muc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiAoY3V0Rmlncy5hdCgwKSktPmdldExheWVyTnVtKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzdGQ6OmNvdXQgPDwiRXJyb3I6IHZpYSBkb2VzIG5vdCBoYXZlIHNoYXBlIG9uIGxheWVyIGN1dCIgPDxzdGQ6OmVuZGw7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxmclNoYXBlPiA+JiBnZXRMYXllcjFGaWdzKCkgewotICAgICAgcmV0dXJuIGxheWVyMUZpZ3M7Ci0gICAgfQotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxmclNoYXBlPiA+JiBnZXRMYXllcjJGaWdzKCkgewotICAgICAgcmV0dXJuIGxheWVyMkZpZ3M7Ci0gICAgfQotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxmclNoYXBlPiA+JiBnZXRDdXRGaWdzKCkgewotICAgICAgcmV0dXJuIGN1dEZpZ3M7Ci0gICAgfQotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxmclNoYXBlPiA+JiBnZXRMYXllcjFGaWdzKCkgY29uc3QgewotICAgICAgcmV0dXJuIGxheWVyMUZpZ3M7Ci0gICAgfQotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxmclNoYXBlPiA+JiBnZXRMYXllcjJGaWdzKCkgY29uc3QgewotICAgICAgcmV0dXJuIGxheWVyMkZpZ3M7Ci0gICAgfQotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxmclNoYXBlPiA+JiBnZXRDdXRGaWdzKCkgY29uc3QgewotICAgICAgcmV0dXJuIGN1dEZpZ3M7Ci0gICAgfQotICAgIGJvb2wgZ2V0RGVmYXVsdCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBpc0RlZmF1bHQ7Ci0gICAgfQotICAgIGJvb2wgaGFzQ3V0Q2xhc3MoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gKGN1dENsYXNzLmxvY2soKSkgPyB0cnVlIDogZmFsc2U7Ci0gICAgfQotICAgIHN0ZDo6c2hhcmVkX3B0cjxmckxlZjU4Q3V0Q2xhc3M+IGdldEN1dENsYXNzKCkgY29uc3QgewotICAgICAgcmV0dXJuIGN1dENsYXNzLmxvY2soKTsKLSAgICB9Ci0gICAgYm9vbCBpc011bHRpQ3V0KCkgY29uc3QgewotICAgICAgcmV0dXJuIChjdXRGaWdzLnNpemUoKSA+IDEpID8gdHJ1ZSA6IGZhbHNlOwotICAgIH0KLSAgICAvL3ZvaWQgZ2V0TGF5ZXIxQkJveCAoZnJCb3ggJmJveEluKSBjb25zdDsKLSAgICAvL3ZvaWQgZ2V0Q3V0QkJveCAoZnJCb3ggJmJveEluKSBjb25zdDsKLSAgICAvL3ZvaWQgZ2V0TGF5ZXIyQkJveCAoZnJCb3ggJmJveEluKSBjb25zdDsKLSAgICAvLyBzZXR0ZXJzCi0gICAgdm9pZCBhZGRMYXllcjFGaWcoc3RkOjp1bmlxdWVfcHRyPGZyU2hhcGU+ICZmaWdJbikgewotICAgICAgbGF5ZXIxRmlncy5wdXNoX2JhY2soc3RkOjptb3ZlKGZpZ0luKSk7Ci0gICAgfQotICAgIHZvaWQgYWRkTGF5ZXIyRmlnKHN0ZDo6dW5pcXVlX3B0cjxmclNoYXBlPiAmZmlnSW4pIHsKLSAgICAgIGxheWVyMkZpZ3MucHVzaF9iYWNrKHN0ZDo6bW92ZShmaWdJbikpOwotICAgIH0KLSAgICB2b2lkIGFkZEN1dEZpZyhzdGQ6OnVuaXF1ZV9wdHI8ZnJTaGFwZT4gJmZpZ0luKSB7Ci0gICAgICBjdXRGaWdzLnB1c2hfYmFjayhzdGQ6Om1vdmUoZmlnSW4pKTsKLSAgICB9Ci0gICAgdm9pZCBzZXREZWZhdWx0KGJvb2wgaXNEZWZhdWx0SW4pIHsKLSAgICAgIGlzRGVmYXVsdCA9IGlzRGVmYXVsdEluOwotICAgIH0KLSAgICB2b2lkIHNldEN1dENsYXNzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxmckxlZjU4Q3V0Q2xhc3M+ICZpbikgewotICAgICAgY3V0Q2xhc3MgPSBpbjsKLSAgICB9Ci0gIHByb3RlY3RlZDoKLSAgICBmclN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0RlZmF1bHQ7Ci0gICAgc3RkOjp2ZWN0b3I8IHN0ZDo6dW5pcXVlX3B0cjxmclNoYXBlPiA+ICBsYXllcjFGaWdzOwotICAgIHN0ZDo6dmVjdG9yPCBzdGQ6OnVuaXF1ZV9wdHI8ZnJTaGFwZT4gPiAgbGF5ZXIyRmlnczsKLSAgICBzdGQ6OnZlY3Rvcjwgc3RkOjp1bmlxdWVfcHRyPGZyU2hhcGU+ID4gIGN1dEZpZ3M7Ci0gICAgc3RkOjp3ZWFrX3B0cjxmckxlZjU4Q3V0Q2xhc3M+ICAgICAgICAgICBjdXRDbGFzczsKLSAgfTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvdGVjaC9mclZpYVJ1bGVHZW5lcmF0ZS5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZGIvdGVjaC9mclZpYVJ1bGVHZW5lcmF0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2IxZjgzLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RiL3RlY2gvZnJWaWFSdWxlR2VuZXJhdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIF9GUl9WSUFSVUxFR0VOX0hfCi0jZGVmaW5lIF9GUl9WSUFSVUxFR0VOX0hfCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSAiZGIvaW5mcmEvZnJCb3guaCIKLQotbmFtZXNwYWNlIGZyIHsKLSAgY2xhc3MgZnJWaWFSdWxlR2VuZXJhdGUgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3JzCi0gICAgZnJWaWFSdWxlR2VuZXJhdGUoY29uc3QgZnJTdHJpbmcgJm5hbWVJbik6IG5hbWUobmFtZUluKSwgaXNEZWZhdWx0KGZhbHNlKSwgYm90RW5jKCksIGN1dFJlY3QoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dFNwYWNpbmcoKSwgdG9wRW5jKCksIGJvdExheWVyTnVtKDApLCBjdXRMYXllck51bSgwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wTGF5ZXJOdW0oMCkge30KLSAgICAvLyBnZXR0ZXJzCi0gICAgY29uc3QgZnJTdHJpbmcmIGdldE5hbWUoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0gICAgYm9vbCBnZXREZWZhdWx0KCkgY29uc3QgewotICAgICAgcmV0dXJuIGlzRGVmYXVsdDsKLSAgICB9Ci0gICAgY29uc3QgZnJQb2ludCYgZ2V0TGF5ZXIxRW5jKCkgY29uc3QgewotICAgICAgcmV0dXJuIGJvdEVuYzsKLSAgICB9Ci0gICAgY29uc3QgZnJCb3gmIGdldEN1dFJlY3QoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gY3V0UmVjdDsKLSAgICB9Ci0gICAgY29uc3QgZnJQb2ludCYgZ2V0Q3V0U3BhY2luZygpIGNvbnN0IHsKLSAgICAgIHJldHVybiBjdXRTcGFjaW5nOwotICAgIH0KLSAgICBjb25zdCBmclBvaW50JiBnZXRMYXllcjJFbmMoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gdG9wRW5jOwotICAgIH0KLSAgICBmckxheWVyTnVtIGdldExheWVyMU51bSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBib3RMYXllck51bTsKLSAgICB9Ci0gICAgZnJMYXllck51bSBnZXRMYXllcjJOdW0oKSBjb25zdCB7Ci0gICAgICByZXR1cm4gdG9wTGF5ZXJOdW07Ci0gICAgfQotICAgIGZyTGF5ZXJOdW0gZ2V0Q3V0TGF5ZXJOdW0oKSBjb25zdCB7Ci0gICAgICByZXR1cm4gY3V0TGF5ZXJOdW07Ci0gICAgfQotICAgIC8vIHNldHRlcnMKLSAgICB2b2lkIHNldERlZmF1bHQoYm9vbCBpbikgewotICAgICAgaXNEZWZhdWx0ID0gaW47Ci0gICAgfQotICAgIHZvaWQgc2V0TGF5ZXIxRW5jKGNvbnN0IGZyUG9pbnQgJmluKSB7Ci0gICAgICBib3RFbmMgPSBpbjsKLSAgICB9Ci0gICAgdm9pZCBzZXRDdXRSZWN0KGNvbnN0IGZyQm94ICZpbikgewotICAgICAgY3V0UmVjdCA9IGluOwotICAgIH0KLSAgICB2b2lkIHNldEN1dFNwYWNpbmcoY29uc3QgZnJQb2ludCAmaW4pIHsKLSAgICAgIGN1dFNwYWNpbmcgPSBpbjsKLSAgICB9Ci0gICAgdm9pZCBzZXRMYXllcjJFbmMoY29uc3QgZnJQb2ludCAmaW4pIHsKLSAgICAgIHRvcEVuYyA9IGluOwotICAgIH0KLSAgICB2b2lkIHNldExheWVyMU51bShmckxheWVyTnVtIGluKSB7Ci0gICAgICBib3RMYXllck51bSA9IGluOwotICAgIH0KLSAgICB2b2lkIHNldEN1dExheWVyTnVtKGZyTGF5ZXJOdW0gaW4pIHsKLSAgICAgIGN1dExheWVyTnVtID0gaW47Ci0gICAgfQotICAgIHZvaWQgc2V0TGF5ZXIyTnVtKGZyTGF5ZXJOdW0gaW4pIHsKLSAgICAgIHRvcExheWVyTnVtID0gaW47Ci0gICAgfQotICBwcm90ZWN0ZWQ6Ci0gICAgZnJTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEZWZhdWx0OwotICAgIGZyUG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90RW5jOwotICAgIGZyQm94ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3V0UmVjdDsKLSAgICBmclBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dFNwYWNpbmc7Ci0gICAgZnJQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BFbmM7Ci0gICAgZnJMYXllck51bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3RMYXllck51bTsKLSAgICBmckxheWVyTnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dExheWVyTnVtOwotICAgIGZyTGF5ZXJOdW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wTGF5ZXJOdW07Ci0gIH07Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZHIvRmxleERSLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RyL0ZsZXhEUi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMjI4OTMuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZHIvRmxleERSLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDkyNiArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSA8Y2hyb25vPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8Ym9vc3QvaW8vaW9zX3N0YXRlLmhwcD4KLS8vI2luY2x1ZGUgPHRhc2tmbG93L3Rhc2tmbG93LmhwcD4KLSNpbmNsdWRlICJkci9GbGV4RFIuaCIKLSNpbmNsdWRlICJpby9pby5oIgotI2luY2x1ZGUgImRiL2luZnJhL2ZyVGltZS5oIgotLy8jaW5jbHVkZSA8b21wLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgZnI7Ci0KLS8vIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGU+IHRpbWVfc3Bhbl9pbml0KDApOwotLy8gc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZT4gdGltZV9zcGFuX2luaXQwKDApOwotLy8gc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZT4gdGltZV9zcGFuX2luaXQxKDApOwotLy8gc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZT4gdGltZV9zcGFuX2luaXQyKDApOwotLy8gc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZT4gdGltZV9zcGFuX2luaXQzKDApOwotLy8gc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZT4gdGltZV9zcGFuX3JvdXRlKDApOwotLy8gc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZT4gdGltZV9zcGFuX2VuZCgwKTsKLQotaW50IEZsZXhEUldvcmtlcjo6bWFpbigpIHsKLSAgdXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vOwotICBoaWdoX3Jlc29sdXRpb25fY2xvY2s6OnRpbWVfcG9pbnQgdDAgPSBoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwotICBpZiAoVkVSQk9TRSA+IDEpIHsKLSAgICBmckJveCBzY2FsZWRCb3g7Ci0gICAgc3RyaW5nc3RyZWFtIHNzOwotICAgIHNzIDw8ZW5kbCA8PCJzdGFydCBEUiB3b3JrZXIgKEJPWCkgIgotICAgICAgICAgICAgICAgIDw8IiggIiA8PHJvdXRlQm94LmxlZnQoKSAgICogMS4wIC8gZ2V0VGVjaCgpLT5nZXREQlVQZXJVVSgpIDw8IiAiCi0gICAgICAgICAgICAgICAgPDxyb3V0ZUJveC5ib3R0b20oKSAqIDEuMCAvIGdldFRlY2goKS0+Z2V0REJVUGVyVVUoKSA8PCIgKSAoICIKLSAgICAgICAgICAgICAgICA8PHJvdXRlQm94LnJpZ2h0KCkgICogMS4wIC8gZ2V0VGVjaCgpLT5nZXREQlVQZXJVVSgpIDw8IiAiCi0gICAgICAgICAgICAgICAgPDxyb3V0ZUJveC50b3AoKSAgICAqIDEuMCAvIGdldFRlY2goKS0+Z2V0REJVUGVyVVUoKSA8PCIgKSIgPDxlbmRsOwotICAgIGNvdXQgPDxzcy5zdHIoKSA8PGZsdXNoOwotICB9Ci0gIC8vcmV0dXJuIDA7Ci0KLSAgaW5pdCgpOwotICAvL0ZsZXhNYXplUm91dGUgbWF6ZUluc3QoZ2V0RGVzaWduKCksIHJvdXRlQm94LCBleHRCb3gpOwotICAvL21hemVJbnN0LnNldEluaXREUihpc0luaXREUigpKTsKLSAgLy9tYXplSW5zdC5pbml0KCk7Ci0gIGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6dGltZV9wb2ludCB0MSA9IGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7Ci0gIC8vbWF6ZUluc3Qucm91dGUoKTsKLSAgcm91dGUoKTsKLSAgaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjp0aW1lX3BvaW50IHQyID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKLSAgZW5kKCk7Ci0gIC8vbWF6ZUluc3QuZW5kKCk7Ci0gIGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6dGltZV9wb2ludCB0MyA9IGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7Ci0KLSAgZHVyYXRpb248ZG91YmxlPiB0aW1lX3NwYW4wID0gZHVyYXRpb25fY2FzdDxkdXJhdGlvbjxkb3VibGU+Pih0MSAtIHQwKTsKLSAgLy90aW1lX3NwYW5faW5pdCAgKz0gdGltZV9zcGFuMDsKLSAgZHVyYXRpb248ZG91YmxlPiB0aW1lX3NwYW4xID0gZHVyYXRpb25fY2FzdDxkdXJhdGlvbjxkb3VibGU+Pih0MiAtIHQxKTsKLSAgLy90aW1lX3NwYW5fcm91dGUgKz0gdGltZV9zcGFuMTsKLSAgZHVyYXRpb248ZG91YmxlPiB0aW1lX3NwYW4yID0gZHVyYXRpb25fY2FzdDxkdXJhdGlvbjxkb3VibGU+Pih0MyAtIHQyKTsKLSAgLy90aW1lX3NwYW5fZW5kICAgKz0gdGltZV9zcGFuMjsKLQotICBpZiAoVkVSQk9TRSA+IDEpIHsKLSAgICBzdHJpbmdzdHJlYW0gc3M7Ci0gICAgc3MgICA8PCJ0aW1lIChJTklUL1JPVVRFL1BPU1QpICIgPDx0aW1lX3NwYW4wLmNvdW50KCkgPDwiICIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDx0aW1lX3NwYW4xLmNvdW50KCkgPDwiICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PHRpbWVfc3BhbjIuY291bnQoKSA8PCIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ZW5kbDsKLSAgICBjb3V0IDw8c3Muc3RyKCkgPDxmbHVzaDsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotdm9pZCBGbGV4RFI6OmluaXRGcm9tVEEoKSB7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIC8vIGluaXRpYWxpemUgbGlzdHMKLSAgaW50IGNudCA9IDA7Ci0gIGZvciAoYXV0byAmbmV0OiBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0TmV0cygpKSB7Ci0gICAgZm9yIChhdXRvICZndWlkZTogbmV0LT5nZXRHdWlkZXMoKSkgewotICAgICAgZm9yIChhdXRvICZjb25uRmlnOiBndWlkZS0+Z2V0Um91dGVzKCkpIHsKLSAgICAgICAgaWYgKGNvbm5GaWctPnR5cGVJZCgpID09IGZyY1BhdGhTZWcpIHsKLSAgICAgICAgICB1bmlxdWVfcHRyPGZyU2hhcGU+IHBzID0gbWFrZV91bmlxdWU8ZnJQYXRoU2VnPigqKHN0YXRpY19jYXN0PGZyUGF0aFNlZyo+KGNvbm5GaWcuZ2V0KCkpKSk7Ci0gICAgICAgICAgZnJQb2ludCBicCwgZXA7Ci0gICAgICAgICAgc3RhdGljX2Nhc3Q8ZnJQYXRoU2VnKj4ocHMuZ2V0KCkpLT5nZXRQb2ludHMoYnAsIGVwKTsKLSAgICAgICAgICBpZiAoZXAueCgpIC0gYnAueCgpICsgZXAueSgpIC0gYnAueSgpID09IDEpIHsKLSAgICAgICAgICAgIDsgLy8gc2tpcCBUQSBkdW1teSBzZWdtZW50Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5ldC0+YWRkU2hhcGUocHMpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBjb3V0IDw8IkVycm9yOiBpbml0RnJvbVRBIHVuc3VwcG9ydGVkIHNoYXBlIiA8PGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy9uZXQtPmNsZWFyR3VpZGVzKCk7IC8vIHNob3VsZCBub3QgY2xlYXIgZ3VpZGUgYmVjYXVzZSBvZiBpbml0R0NlbGxCb3VuZGFyeQotICAgIGNudCsrOwotICAgIC8vaWYgKGNudCA8IDEwMDAwMCkgewotICAgIC8vICBpZiAoY250ICUgMTAwMDAgPT0gMCkgewotICAgIC8vICAgIGNvdXQgPDwiICBpbml0RnJvbVRBIGNvbXBsZXRlICIgPDxjbnQgPDwiIG5ldHMiIDw8ZW5kbDsKLSAgICAvLyAgfQotICAgIC8vfSBlbHNlIHsKLSAgICAvLyAgaWYgKGNudCAlIDEwMDAwMCA9PSAwKSB7Ci0gICAgLy8gICAgY291dCA8PCIgIGluaXRGcm9tVEEgY29tcGxldGUgIiA8PGNudCA8PCIgbmV0cyIgPDxlbmRsOwotICAgIC8vICB9Ci0gICAgLy99Ci0gIH0KLSAgLy9nZXRSZWdpb25RdWVyeSgpLT5jbGVhckd1aWRlcygpOyAvLyBzaG91bGQgbm90IGNsZWFyIGd1aWRlIGJlY2F1c2Ugb2YgaW5pdEdDZWxsQm91bmRhcnkKLQotICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgZm9yIChhdXRvICZuZXQ6IGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXROZXRzKCkpIHsKLSAgICAgIGNvdXQgPDwibmV0ICIgPDxuZXQtPmdldE5hbWUoKSA8PCIgaGFzICIgPDxuZXQtPmdldFNoYXBlcygpLnNpemUoKSA8PCIgc2hhcGUiIDw8ZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBGbGV4RFI6OmluaXRHQ2VsbDJCb3VuZGFyeVBpbigpIHsKLSAgYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLSAgLy8gaW5pdGlhaWxpemUgc2l6ZQotICBmckJveCBkaWVCb3g7Ci0gIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXRCb3VuZGFyeUJCb3goZGllQm94KTsKLSAgYXV0byBnQ2VsbFBhdHRlcm5zID0gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldEdDZWxsUGF0dGVybnMoKTsKLSAgYXV0byAmeGdwID0gZ0NlbGxQYXR0ZXJucy5hdCgwKTsKLSAgYXV0byAmeWdwID0gZ0NlbGxQYXR0ZXJucy5hdCgxKTsKLSAgLy9mckNvb3JkIEdDRUxMR1JJRFggICA9IHhncC5nZXRTcGFjaW5nKCk7Ci0gIC8vZnJDb29yZCBHQ0VMTEdSSURZICAgPSB5Z3AuZ2V0U3BhY2luZygpOwotICAvL2ZyQ29vcmQgR0NFTExPRkZTRVRYID0geGdwLmdldFN0YXJ0Q29vcmQoKTsKLSAgLy9mckNvb3JkIEdDRUxMT0ZGU0VUWSA9IHlncC5nZXRTdGFydENvb3JkKCk7Ci0gIC8vZnJDb29yZCBHQ0VMTENOVFggICAgPSB4Z3AuZ2V0Q291bnQoKTsKLSAgLy9mckNvb3JkIEdDRUxMQ05UWSAgICA9IHlncC5nZXRDb3VudCgpOwotICBhdXRvIHRtcFZlYyA9IHZlY3RvcjxtYXA8ZnJOZXQqLCBzZXQ8cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiA+LCBmckJsb2NrT2JqZWN0Q29tcD4gPigoaW50KXlncC5nZXRDb3VudCgpKTsKLSAgZ2NlbGwyQm91bmRhcnlQaW4gPSB2ZWN0b3I8dmVjdG9yPG1hcDxmck5ldCosIHNldDxwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+ID4sIGZyQmxvY2tPYmplY3RDb21wPiA+ID4oKGludCl4Z3AuZ2V0Q291bnQoKSwgdG1wVmVjKTsKLSAgZm9yIChhdXRvICZuZXQ6IGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXROZXRzKCkpIHsKLSAgICBhdXRvIG5ldFB0ciA9IG5ldC5nZXQoKTsKLSAgICBmb3IgKGF1dG8gJmd1aWRlOiBuZXQtPmdldEd1aWRlcygpKSB7Ci0gICAgICBmb3IgKGF1dG8gJmNvbm5GaWc6IGd1aWRlLT5nZXRSb3V0ZXMoKSkgewotICAgICAgICBpZiAoY29ubkZpZy0+dHlwZUlkKCkgPT0gZnJjUGF0aFNlZykgewotICAgICAgICAgIGF1dG8gcHMgPSBzdGF0aWNfY2FzdDxmclBhdGhTZWcqPihjb25uRmlnLmdldCgpKTsKLSAgICAgICAgICBmckxheWVyTnVtIGxheWVyTnVtOwotICAgICAgICAgIGZyUG9pbnQgYnAsIGVwOwotICAgICAgICAgIHBzLT5nZXRQb2ludHMoYnAsIGVwKTsKLSAgICAgICAgICBsYXllck51bSA9IHBzLT5nZXRMYXllck51bSgpOwotICAgICAgICAgIC8vIHNraXAgVEEgZHVtbXkgc2VnbWVudAotICAgICAgICAgIGlmIChlcC54KCkgLSBicC54KCkgKyBlcC55KCkgLSBicC55KCkgPT0gMSB8fCBlcC54KCkgLSBicC54KCkgKyBlcC55KCkgLSBicC55KCkgPT0gMCkgewotICAgICAgICAgICAgY29udGludWU7IAotICAgICAgICAgIH0KLSAgICAgICAgICBmclBvaW50IGlkeDEsIGlkeDI7Ci0gICAgICAgICAgZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldEdDZWxsSWR4KGJwLCBpZHgxKTsKLSAgICAgICAgICBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0R0NlbGxJZHgoZXAsIGlkeDIpOwotICAgICAgICAgIC8vZnJCb3ggZ2NlbGxCb3gxLCBnY2VsbEJveDI7Ci0gICAgICAgICAgLy9nZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0R0NlbGxCb3goaWR4MSwgZ2NlbGxCb3gxKTsKLSAgICAgICAgICAvL2dldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXRHQ2VsbEJveChpZHgyLCBnY2VsbEJveDIpOwotICAgICAgICAgIC8vIHVwZGF0ZSBnY2VsbDJCb3VuZGFyeVBpbgotICAgICAgICAgIC8vIGhvcml6b250YWwKLSAgICAgICAgICBpZiAoYnAueSgpID09IGVwLnkoKSkgewotICAgICAgICAgICAgLy9pbnQgeDEgPSAoYnAueCgpIC0geGdwLmdldFN0YXJ0Q29vcmQoKSkgLyB4Z3AuZ2V0U3BhY2luZygpOwotICAgICAgICAgICAgLy9pbnQgeDIgPSAoZXAueCgpIC0geGdwLmdldFN0YXJ0Q29vcmQoKSkgLyB4Z3AuZ2V0U3BhY2luZygpOwotICAgICAgICAgICAgLy9pbnQgeSAgPSAoYnAueSgpIC0geWdwLmdldFN0YXJ0Q29vcmQoKSkgLyB5Z3AuZ2V0U3BhY2luZygpOwotICAgICAgICAgICAgaW50IHgxID0gaWR4MS54KCk7Ci0gICAgICAgICAgICBpbnQgeDIgPSBpZHgyLngoKTsKLSAgICAgICAgICAgIGludCB5ICA9IGlkeDEueSgpOwotICAgICAgICAgICAgLy9pZiAoeDEgPCAwIHx8IHgyIDwgMCB8fCB5IDwgMCkgewotICAgICAgICAgICAgLy8gIGNvdXQgPDwiV2FybmluZzogaW5pdEdDZWxsMkJvdW5kYXJ5UGluIDwgMCI7Ci0gICAgICAgICAgICAvLyAgZXhpdCgxKTsKLSAgICAgICAgICAgIC8vfQotICAgICAgICAgICAgLy9pZiAoeDEgPj0gKGludClHQ0VMTENOVFgpIHsKLSAgICAgICAgICAgIC8vICB4MSA9IChpbnQpR0NFTExDTlRYIC0gMTsKLSAgICAgICAgICAgIC8vfQotICAgICAgICAgICAgLy9pZiAoeDIgPj0gKGludClHQ0VMTENOVFgpIHsKLSAgICAgICAgICAgIC8vICB4MiA9IChpbnQpR0NFTExDTlRYIC0gMTsKLSAgICAgICAgICAgIC8vfQotICAgICAgICAgICAgLy9pZiAoeSA+PSAoaW50KUdDRUxMQ05UWSkgewotICAgICAgICAgICAgLy8gIHkgPSAoaW50KUdDRUxMQ05UWSAtIDE7Ci0gICAgICAgICAgICAvL30KLSAgICAgICAgICAgIGZvciAoYXV0byB4ID0geDE7IHggPD0geDI7ICsreCkgewotICAgICAgICAgICAgICBmckJveCBnY2VsbEJveDsKLSAgICAgICAgICAgICAgZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldEdDZWxsQm94KGZyUG9pbnQoeCwgeSksIGdjZWxsQm94KTsKLSAgICAgICAgICAgICAgLy9mckNvb3JkIGxlZnRCb3VuZCAgPSB4ICogeGdwLmdldFNwYWNpbmcoKSArIHhncC5nZXRTdGFydENvb3JkKCk7Ci0gICAgICAgICAgICAgIC8vZnJDb29yZCByaWdodEJvdW5kID0gKHggPT0gKGludClHQ0VMTENOVFggLSAxKSA/IGRpZUJveC5yaWdodCgpIDogKHggKyAxKSAqIHhncC5nZXRTcGFjaW5nKCkgKyB4Z3AuZ2V0U3RhcnRDb29yZCgpOwotICAgICAgICAgICAgICBmckNvb3JkIGxlZnRCb3VuZCAgPSBnY2VsbEJveC5sZWZ0KCk7Ci0gICAgICAgICAgICAgIGZyQ29vcmQgcmlnaHRCb3VuZCA9IGdjZWxsQm94LnJpZ2h0KCk7Ci0gICAgICAgICAgICAgIGJvb2wgaGFzTGVmdEJvdW5kICA9IHRydWU7Ci0gICAgICAgICAgICAgIGJvb2wgaGFzUmlnaHRCb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgIGlmIChicC54KCkgPCBsZWZ0Qm91bmQpIHsKLSAgICAgICAgICAgICAgICBoYXNMZWZ0Qm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGhhc0xlZnRCb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChlcC54KCkgPj0gcmlnaHRCb3VuZCkgewotICAgICAgICAgICAgICAgIGhhc1JpZ2h0Qm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGhhc1JpZ2h0Qm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAoaGFzTGVmdEJvdW5kKSB7Ci0gICAgICAgICAgICAgICAgZnJQb2ludCBib3VuZGFyeVB0KGxlZnRCb3VuZCwgYnAueSgpKTsKLSAgICAgICAgICAgICAgICBnY2VsbDJCb3VuZGFyeVBpblt4XVt5XVtuZXRQdHJdLmluc2VydChtYWtlX3BhaXIoYm91bmRhcnlQdCwgbGF5ZXJOdW0pKTsKLSAgICAgICAgICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgICAgICAgICBjb3V0IDw8ICJpbml0IGxlZnQgYm91bmRhcnkgcGluICgiIAotICAgICAgICAgICAgICAgICAgICAgICA8PCBib3VuZGFyeVB0LngoKSAqIDEuMCAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpIDw8ICIsICIgCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IGJvdW5kYXJ5UHQueSgpICogMS4wIC8gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCkgPDwgIikgYXQgKCIKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgeCA8PCIsICIgPDx5IDw8IikgIiAKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgZ2V0VGVjaCgpLT5nZXRMYXllcihsYXllck51bSktPmdldE5hbWUoKSA8PCIgIgotICAgICAgICAgICAgICAgICAgICAgICA8PCBzdHJpbmcoKG5ldCA9PSBudWxscHRyKSA/ICJudWxsIiA6IG5ldC0+Z2V0TmFtZSgpKSA8PCJcbiI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChoYXNSaWdodEJvdW5kKSB7Ci0gICAgICAgICAgICAgICAgZnJQb2ludCBib3VuZGFyeVB0KHJpZ2h0Qm91bmQsIGVwLnkoKSk7Ci0gICAgICAgICAgICAgICAgZ2NlbGwyQm91bmRhcnlQaW5beF1beV1bbmV0UHRyXS5pbnNlcnQobWFrZV9wYWlyKGJvdW5kYXJ5UHQsIGxheWVyTnVtKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgICAgICAgICAgY291dCA8PCAiaW5pdCByaWdodCBib3VuZGFyeSBwaW4gKCIgCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IGJvdW5kYXJ5UHQueCgpICogMS4wIC8gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCkgPDwgIiwgIiAKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgYm91bmRhcnlQdC55KCkgKiAxLjAgLyBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0REJVUGVyVVUoKSA8PCAiKSBhdCAoIgotICAgICAgICAgICAgICAgICAgICAgICA8PCB4IDw8IiwgIiA8PHkgPDwiKSAiIAotICAgICAgICAgICAgICAgICAgICAgICA8PCBnZXRUZWNoKCktPmdldExheWVyKGxheWVyTnVtKS0+Z2V0TmFtZSgpIDw8IiAiCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IHN0cmluZygobmV0ID09IG51bGxwdHIpID8gIm51bGwiIDogbmV0LT5nZXROYW1lKCkpIDw8IlxuIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgaWYgKGJwLngoKSA9PSBlcC54KCkpIHsKLSAgICAgICAgICAgIC8vaW50IHggID0gKGJwLngoKSAtIHhncC5nZXRTdGFydENvb3JkKCkpIC8geGdwLmdldFNwYWNpbmcoKTsKLSAgICAgICAgICAgIC8vaW50IHkxID0gKGJwLnkoKSAtIHlncC5nZXRTdGFydENvb3JkKCkpIC8geWdwLmdldFNwYWNpbmcoKTsKLSAgICAgICAgICAgIC8vaW50IHkyID0gKGVwLnkoKSAtIHlncC5nZXRTdGFydENvb3JkKCkpIC8geWdwLmdldFNwYWNpbmcoKTsKLSAgICAgICAgICAgIGludCB4ICA9IGlkeDEueCgpOwotICAgICAgICAgICAgaW50IHkxID0gaWR4MS55KCk7Ci0gICAgICAgICAgICBpbnQgeTIgPSBpZHgyLnkoKTsKLSAgICAgICAgICAgIC8vaWYgKHkxIDwgMCB8fCB5MiA8IDAgfHwgeCA8IDApIHsKLSAgICAgICAgICAgIC8vICBjb3V0IDw8Ildhcm5pbmc6IGluaXRHQ2VsbDJCb3VuZGFyeVBpbiA8IDAiOwotICAgICAgICAgICAgLy8gIGV4aXQoMSk7Ci0gICAgICAgICAgICAvL30KLSAgICAgICAgICAgIC8vaWYgKHggPj0gKGludClHQ0VMTENOVFgpIHsKLSAgICAgICAgICAgIC8vICB4ID0gKGludClHQ0VMTENOVFggLSAxOwotICAgICAgICAgICAgLy99Ci0gICAgICAgICAgICAvL2lmICh5MSA+PSAoaW50KUdDRUxMQ05UWSkgewotICAgICAgICAgICAgLy8gIHkxID0gKGludClHQ0VMTENOVFkgLSAxOwotICAgICAgICAgICAgLy99Ci0gICAgICAgICAgICAvL2lmICh5MiA+PSAoaW50KUdDRUxMQ05UWSkgewotICAgICAgICAgICAgLy8gIHkyID0gKGludClHQ0VMTENOVFkgLSAxOwotICAgICAgICAgICAgLy99Ci0gICAgICAgICAgICBmb3IgKGF1dG8geSA9IHkxOyB5IDw9IHkyOyArK3kpIHsKLSAgICAgICAgICAgICAgZnJCb3ggZ2NlbGxCb3g7Ci0gICAgICAgICAgICAgIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXRHQ2VsbEJveChmclBvaW50KHgsIHkpLCBnY2VsbEJveCk7Ci0gICAgICAgICAgICAgIC8vZnJDb29yZCBib3R0b21Cb3VuZCA9IHkgKiB5Z3AuZ2V0U3BhY2luZygpICsgeWdwLmdldFN0YXJ0Q29vcmQoKTsKLSAgICAgICAgICAgICAgLy9mckNvb3JkIHRvcEJvdW5kICAgID0gKHkgPT0gKGludClHQ0VMTENOVFkgLSAxKSA/IGRpZUJveC50b3AoKSA6ICh5ICsgMSkgKiB5Z3AuZ2V0U3BhY2luZygpICsgeWdwLmdldFN0YXJ0Q29vcmQoKTsKLSAgICAgICAgICAgICAgZnJDb29yZCBib3R0b21Cb3VuZCA9IGdjZWxsQm94LmJvdHRvbSgpOwotICAgICAgICAgICAgICBmckNvb3JkIHRvcEJvdW5kICAgID0gZ2NlbGxCb3gudG9wKCk7Ci0gICAgICAgICAgICAgIGJvb2wgaGFzQm90dG9tQm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICBib29sIGhhc1RvcEJvdW5kICAgID0gdHJ1ZTsKLSAgICAgICAgICAgICAgaWYgKGJwLnkoKSA8IGJvdHRvbUJvdW5kKSB7Ci0gICAgICAgICAgICAgICAgaGFzQm90dG9tQm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGhhc0JvdHRvbUJvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKGVwLnkoKSA+PSB0b3BCb3VuZCkgewotICAgICAgICAgICAgICAgIGhhc1RvcEJvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBoYXNUb3BCb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChoYXNCb3R0b21Cb3VuZCkgewotICAgICAgICAgICAgICAgIGZyUG9pbnQgYm91bmRhcnlQdChicC54KCksIGJvdHRvbUJvdW5kKTsKLSAgICAgICAgICAgICAgICBnY2VsbDJCb3VuZGFyeVBpblt4XVt5XVtuZXRQdHJdLmluc2VydChtYWtlX3BhaXIoYm91bmRhcnlQdCwgbGF5ZXJOdW0pKTsKLSAgICAgICAgICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgICAgICAgICBjb3V0IDw8ICJpbml0IGJvdHRvbSBib3VuZGFyeSBwaW4gKCIgCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IGJvdW5kYXJ5UHQueCgpICogMS4wIC8gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCkgPDwgIiwgIiAKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgYm91bmRhcnlQdC55KCkgKiAxLjAgLyBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0REJVUGVyVVUoKSA8PCAiKSBhdCAoIgotICAgICAgICAgICAgICAgICAgICAgICA8PCB4IDw8IiwgIiA8PHkgPDwiKSAiIAotICAgICAgICAgICAgICAgICAgICAgICA8PCBnZXRUZWNoKCktPmdldExheWVyKGxheWVyTnVtKS0+Z2V0TmFtZSgpIDw8IiAiCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IHN0cmluZygobmV0ID09IG51bGxwdHIpID8gIm51bGwiIDogbmV0LT5nZXROYW1lKCkpIDw8IlxuIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKGhhc1RvcEJvdW5kKSB7Ci0gICAgICAgICAgICAgICAgZnJQb2ludCBib3VuZGFyeVB0KGVwLngoKSwgdG9wQm91bmQpOwotICAgICAgICAgICAgICAgIGdjZWxsMkJvdW5kYXJ5UGluW3hdW3ldW25ldFB0cl0uaW5zZXJ0KG1ha2VfcGFpcihib3VuZGFyeVB0LCBsYXllck51bSkpOwotICAgICAgICAgICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICAgICAgICAgIGNvdXQgPDwgImluaXQgdG9wIGJvdW5kYXJ5IHBpbiAoIiAKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgYm91bmRhcnlQdC54KCkgKiAxLjAgLyBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0REJVUGVyVVUoKSA8PCAiLCAiIAotICAgICAgICAgICAgICAgICAgICAgICA8PCBib3VuZGFyeVB0LnkoKSAqIDEuMCAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpIDw8ICIpIGF0ICgiCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IHggPDwiLCAiIDw8eSA8PCIpICIgCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IGdldFRlY2goKS0+Z2V0TGF5ZXIobGF5ZXJOdW0pLT5nZXROYW1lKCkgPDwiICIKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RyaW5nKChuZXQgPT0gbnVsbHB0cikgPyAibnVsbCIgOiBuZXQtPmdldE5hbWUoKSkgPDwiXG4iOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb3V0IDw8ICJFcnJvcjogbm9uLW9ydGhvZ29uYWwgcGF0aHNlZyBpbiBpbml0R0NlbGwyQm91bmRyeVBpblxuIjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBGbGV4RFI6OmluaXQoKSB7Ci0gIGZyVGltZSB0OwotICBpZiAoVkVSQk9TRSA+IDApIHsKLSAgICBjb3V0IDw8ZW5kbCA8PCJzdGFydCByb3V0aW5nIGRhdGEgcHJlcGFyYXRpb24iIDw8ZW5kbDsKLSAgfQotICAvL2luaXRGcm9tVEEoKTsKLSAgaW5pdEdDZWxsMkJvdW5kYXJ5UGluKCk7Ci0gIC8vaWYgKFZFUkJPU0UgPiAwKSB7Ci0gIC8vICBjb3V0IDw8ZW5kbCA8PCJpbml0IGRyIG9ianMgLi4uIiA8PGVuZGw7Ci0gIC8vfQotICBnZXRSZWdpb25RdWVyeSgpLT5pbml0RFJPYmooZ2V0VGVjaCgpLT5nZXRMYXllcnMoKS5zaXplKCkpOwotICAvL2dldFJlZ2lvblF1ZXJ5KCktPnByaW50RFJPYmooKTsKLSAgaWYgKFZFUkJPU0UgPiAwKSB7Ci0gICAgdC5wcmludCgpOwotICB9Ci19Ci0KLXZvaWQgRmxleERSOjpyZW1vdmVHQ2VsbDJCb3VuZGFyeVBpbigpIHsKLSAgZ2NlbGwyQm91bmRhcnlQaW4uY2xlYXIoKTsKLSAgZ2NlbGwyQm91bmRhcnlQaW4uc2hyaW5rX3RvX2ZpdCgpOwotfQotCi1tYXA8ZnJOZXQqLCBzZXQ8cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiA+LCBmckJsb2NrT2JqZWN0Q29tcD4gRmxleERSOjppbml0RFJfbWVyZ2VCb3VuZGFyeVBpbihpbnQgc3RhcnRYLCBpbnQgc3RhcnRZLCBpbnQgc2l6ZSwgY29uc3QgZnJCb3ggJnJvdXRlQm94KSB7Ci0gIG1hcDxmck5ldCosIHNldDxwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+ID4sIGZyQmxvY2tPYmplY3RDb21wPiBicDsKLSAgYXV0byBnQ2VsbFBhdHRlcm5zID0gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldEdDZWxsUGF0dGVybnMoKTsKLSAgYXV0byAmeGdwID0gZ0NlbGxQYXR0ZXJucy5hdCgwKTsKLSAgYXV0byAmeWdwID0gZ0NlbGxQYXR0ZXJucy5hdCgxKTsKLSAgZm9yIChpbnQgaSA9IHN0YXJ0WDsgaSA8IChpbnQpeGdwLmdldENvdW50KCkgJiYgaSA8IHN0YXJ0WCArIHNpemU7IGkrKykgewotICAgIGZvciAoaW50IGogPSBzdGFydFk7IGogPCAoaW50KXlncC5nZXRDb3VudCgpICYmIGogPCBzdGFydFkgKyBzaXplOyBqKyspIHsKLSAgICAgIGF1dG8gJmN1cnJCcCA9IGdjZWxsMkJvdW5kYXJ5UGluW2ldW2pdOwotICAgICAgZm9yIChhdXRvICZbbmV0LCBzXTogY3VyckJwKSB7Ci0gICAgICAgIGZvciAoYXV0byAmW3B0LCBsTnVtXTogcykgewotICAgICAgICAgIGlmIChwdC54KCkgPT0gcm91dGVCb3gubGVmdCgpICAgfHwgcHQueCgpID09IHJvdXRlQm94LnJpZ2h0KCkgfHwKLSAgICAgICAgICAgICAgcHQueSgpID09IHJvdXRlQm94LmJvdHRvbSgpIHx8IHB0LnkoKSA9PSByb3V0ZUJveC50b3AoKSkgewotICAgICAgICAgICAgYnBbbmV0XS5pbnNlcnQobWFrZV9wYWlyKHB0LCBsTnVtKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBicDsKLX0KLQotdm9pZCBGbGV4RFI6OmluaXREUihpbnQgc2l6ZSwgYm9vbCBlbmFibGVEUkMpIHsKLSAgYm9vbCBURVNUID0gZmFsc2U7Ci0gIC8vYm9vbCBURVNUID0gdHJ1ZTsKLSAgLy9jb3V0IDw8InNpemVvZiBsaXN0aXRlciAgID0gIiA8PHNpemVvZihmckxpc3RJdGVyPGZyUGF0aFNlZz4pIDw8ZW5kbDsKLSAgLy9jb3V0IDw8InNpemVvZiByYXcgcHRyICAgID0gIiA8PHNpemVvZihmclBhdGhTZWcqKSA8PGVuZGw7Ci0gIC8vY291dCA8PCJzaXplb2YgdW5pcXVlIHB0ciA9ICIgPDxzaXplb2YodW5pcXVlX3B0cjxmclBhdGhTZWc+KSA8PGVuZGw7Ci0gIC8vY291dCA8PCJzaXplb2Ygc2hhcmVkX3B0ciA9ICIgPDxzaXplb2Yoc2hhcmVkX3B0cjxmclBhdGhTZWc+KSA8PGVuZGw7Ci0gIC8vZXhpdCgwKTsKLQotICAvL0ZsZXhHcmlkR3JhcGggZ2coZ2V0VGVjaCgpLCBnZXREZXNpZ24oKSk7Ci0gIC8vLy9mckJveCB0ZXN0QkJveCgyMjUwMDAsIDIyODEwMCwgMjI4MDAwLCAyMzExMDApOyAvLyBuZXQxNzAyIGluIGlzcGQxOV90ZXN0MQotICAvL2ZyQm94IHRlc3RCQm94KDAsIDAsIDIwMDAsIDIwMDApOyAvLyBuZXQxNzAyIGluIGlzcGQxOV90ZXN0MQotICAvLy8vZ2cuc2V0QkJveCh0ZXN0QkJveCk7Ci0gIC8vZ2cuaW5pdCh0ZXN0QkJveCk7Ci0gIC8vZ2cucHJpbnQoKTsKLSAgLy9leGl0KDEpOwotCi0gIGZyVGltZSB0OwotCi0gIGlmIChWRVJCT1NFID4gMCkgewotICAgIGNvdXQgPDxlbmRsIDw8InN0YXJ0IGluaXRpYWwgZGV0YWlsIHJvdXRpbmcgLi4uIiA8PGVuZGw7Ci0gIH0KLSAgZnJCb3ggZGllQm94OwotICBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0Qm91bmRhcnlCQm94KGRpZUJveCk7Ci0KLSAgYXV0byBnQ2VsbFBhdHRlcm5zID0gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldEdDZWxsUGF0dGVybnMoKTsKLSAgYXV0byAmeGdwID0gZ0NlbGxQYXR0ZXJucy5hdCgwKTsKLSAgYXV0byAmeWdwID0gZ0NlbGxQYXR0ZXJucy5hdCgxKTsKLQotICBpbnQgbnVtUXVpY2tNYXJrZXJzID0gMDsKLSAgaWYgKFRFU1QpIHsKLSAgICBGbGV4RFJXb3JrZXIgd29ya2VyKGdldERlc2lnbigpKTsKLSAgICAvL2ZyQm94IHJvdXRlQm94OwotICAgIC8vcm91dGVCb3guc2V0KDAqMjAwMCwgMCoyMDAwLCAxKjIwMDAsIDEqMjAwMCk7Ci0gICAgZnJDb29yZCB4bCA9IDAgKiAyMDAwOwotICAgIGZyQ29vcmQgeWwgPSA0NS42ICogMjAwMDsKLSAgICAvL2ZyQ29vcmQgeGggPSAxMjkgKiAyMDAwOwotICAgIC8vZnJDb29yZCB5aCA9IDk0LjA1ICogMjAwMDsKLSAgICBmclBvaW50IGlkeDsKLSAgICBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0R0NlbGxJZHgoZnJQb2ludCh4bCwgeWwpLCBpZHgpOwotICAgIGlmIChWRVJCT1NFID4gMSkgewotICAgICAgY291dCA8PCIoaSxqKSA9ICgiIDw8aWR4LngoKSA8PCIsICIgPDxpZHgueSgpIDw8IikiIDw8ZW5kbDsKLSAgICB9Ci0gICAgLy9nZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0R0NlbGxCb3goaWR4LCByb3V0ZUJveCk7Ci0gICAgZnJCb3ggcm91dGVCb3gxOwotICAgIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXRHQ2VsbEJveChmclBvaW50KGlkeC54KCksIGlkeC55KCkpLCByb3V0ZUJveDEpOwotICAgIGZyQm94IHJvdXRlQm94MjsKLSAgICBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0R0NlbGxCb3goZnJQb2ludChtaW4oKGludCl4Z3AuZ2V0Q291bnQoKSAtIDEsIGlkeC54KCkgKyBzaXplLTEpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKGludCl5Z3AuZ2V0Q291bnQoKSwgaWR4LnkoKSArIHNpemUtMSkpLCByb3V0ZUJveDIpOwotICAgIGZyQm94IHJvdXRlQm94KHJvdXRlQm94MS5sZWZ0KCksIHJvdXRlQm94MS5ib3R0b20oKSwgcm91dGVCb3gyLnJpZ2h0KCksIHJvdXRlQm94Mi50b3AoKSk7Ci0gICAgYXV0byBicCA9IGluaXREUl9tZXJnZUJvdW5kYXJ5UGluKGlkeC54KCksIGlkeC55KCksIHNpemUsIHJvdXRlQm94KTsKLSAgICAvL3JvdXRlQm94LnNldCgxMjkqMjAwMCwgOTQuMDUqMjAwMCwgMTMyKjIwMDAsIDk2LjkqMjAwMCk7Ci0gICAgd29ya2VyLnNldFJvdXRlQm94KHJvdXRlQm94KTsKLSAgICBmckJveCBleHRCb3g7Ci0gICAgcm91dGVCb3guYmxvYXQoMTAwMCwgZXh0Qm94KTsKLSAgICB3b3JrZXIuc2V0Um91dGVCb3gocm91dGVCb3gpOwotICAgIHdvcmtlci5zZXRFeHRCb3goZXh0Qm94KTsKLSAgICAvL2ludCBpID0gKDEyOSAgICogMjAwMCAtIHhncC5nZXRTdGFydENvb3JkKCkpIC8geGdwLmdldFNwYWNpbmcoKTsKLSAgICAvL2ludCBqID0gKDk0LjA1ICogMjAwMCAtIHlncC5nZXRTdGFydENvb3JkKCkpIC8geWdwLmdldFNwYWNpbmcoKTsKLSAgICAvL3dvcmtlci5zZXREUkl0ZXIoMCwgZ2NlbGwyQm91bmRhcnlQaW5baWR4LngoKV1baWR4LnkoKV0pOwotICAgIHdvcmtlci5zZXREUkl0ZXIoMCwgYnApOwotICAgIHdvcmtlci5zZXRFbmFibGVEUkMoZW5hYmxlRFJDKTsKLSAgICB3b3JrZXIubWFpbigpOwotICAgIGNvdXQgPDwiZG9uZSIgIDw8ZW5kbCA8PGZsdXNoOwotICB9IGVsc2UgewotICAgIC8vdmVjdG9yPEZsZXhEUldvcmtlcj4gd29ya2VyczsKLSAgICBpbnQgY250ID0gMDsKLSAgICAvL2ludCB0b3QgPSAoaW50KXhncC5nZXRDb3VudCgpICogKGludCl5Z3AuZ2V0Q291bnQoKTsKLSAgICBpbnQgdG90ID0gKCgoaW50KXhncC5nZXRDb3VudCgpIC0gMSkgLyBzaXplICsgMSkgKiAoKChpbnQpeWdwLmdldENvdW50KCkgLSAxKSAvIHNpemUgKyAxKTsKLSAgICBpbnQgcHJldl9wZXJjID0gMDsKLSAgICBib29sIGlzRXhjZWVkID0gZmFsc2U7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KXhncC5nZXRDb3VudCgpOyBpICs9IHNpemUpIHsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgKGludCl5Z3AuZ2V0Q291bnQoKTsgaiArPSBzaXplKSB7Ci0gICAgLy9mb3IgKGludCBpID0gMzEwOyBpIDwgMzMwOyBpKyspIHsKLSAgICAvLyAgZm9yIChpbnQgaiA9IDMwMDsgaiA8IDMyMDsgaisrKSB7Ci0gICAgICAgIEZsZXhEUldvcmtlciB3b3JrZXIoZ2V0RGVzaWduKCkpOwotICAgICAgICBmckJveCByb3V0ZUJveDE7Ci0gICAgICAgIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXRHQ2VsbEJveChmclBvaW50KGksIGopLCByb3V0ZUJveDEpOwotICAgICAgICBmckJveCByb3V0ZUJveDI7Ci0gICAgICAgIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXRHQ2VsbEJveChmclBvaW50KG1pbigoaW50KXhncC5nZXRDb3VudCgpIC0gMSwgaSArIHNpemUtMSksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKGludCl5Z3AuZ2V0Q291bnQoKSwgaiArIHNpemUtMSkpLCByb3V0ZUJveDIpOwotICAgICAgICAvL2ZyQm94IHJvdXRlQm94OwotICAgICAgICBmckJveCByb3V0ZUJveChyb3V0ZUJveDEubGVmdCgpLCByb3V0ZUJveDEuYm90dG9tKCksIHJvdXRlQm94Mi5yaWdodCgpLCByb3V0ZUJveDIudG9wKCkpOwotICAgICAgICAvL2dldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXRHQ2VsbEJveChmclBvaW50KGksIGopLCByb3V0ZUJveCk7Ci0gICAgICAgIC8vaWYgKCEocm91dGVCb3gubGVmdCgpICAgPj0gNTA0ICogMjAwMCAgJiYgcm91dGVCb3gucmlnaHQoKSA8PSA1MjUqMjAwMCAmJgotICAgICAgICAvLyAgICByb3V0ZUJveC5ib3R0b20oKSA+PSA1MzguNjUqMjAwMCAmJiByb3V0ZUJveC50b3AoKSAgIDw9IDU1OC42KjIwMDApKSB7Ci0gICAgICAgIC8vICBjb250aW51ZTsKLSAgICAgICAgLy99Ci0gICAgICAgIGZyQm94IGV4dEJveDsKLSAgICAgICAgcm91dGVCb3guYmxvYXQoMTAwMCwgZXh0Qm94KTsKLSAgICAgICAgd29ya2VyLnNldFJvdXRlQm94KHJvdXRlQm94KTsKLSAgICAgICAgd29ya2VyLnNldEV4dEJveChleHRCb3gpOwotICAgICAgICAvL3dvcmtlcnMucHVzaF9iYWNrKHdvcmtlcik7Ci0gICAgICAgIC8vd29ya2VyLnNldERSSXRlcigwLCAmZ2NlbGwyQm91bmRhcnlQaW5baV1bal0pOwotICAgICAgICBhdXRvIGJwID0gaW5pdERSX21lcmdlQm91bmRhcnlQaW4oaSwgaiwgc2l6ZSwgcm91dGVCb3gpOwotICAgICAgICB3b3JrZXIuc2V0RFJJdGVyKDAsIGJwKTsKLSAgICAgICAgLy8gc2V0IGJvdW5kYXJ5IHBpbgotICAgICAgICB3b3JrZXIuc2V0RW5hYmxlRFJDKGVuYWJsZURSQyk7Ci0gICAgICAgIHdvcmtlci5tYWluKCk7Ci0gICAgICAgIG51bVF1aWNrTWFya2VycyArPSB3b3JrZXIuZ2V0TnVtUXVpY2tNYXJrZXJzKCk7Ci0gICAgICAgIC8vY291dCA8PCJpL2ogPSAiIDw8aSA8PCIsICIgPDxqIDw8ZW5kbDsKLSAgICAgICAgY250Kys7Ci0gICAgICAgIGlmIChWRVJCT1NFID4gMCkgewotICAgICAgICAgIGlmIChjbnQgKiAxLjAgLyB0b3QgPj0gcHJldl9wZXJjIC8gMTAwLjAgKyAwLjEpIHsKLSAgICAgICAgICAgIGlmIChwcmV2X3BlcmMgPT0gMCAmJiB0LmlzRXhjZWVkKDIpKSB7Ci0gICAgICAgICAgICAgIGlzRXhjZWVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByZXZfcGVyYyArPSAxMDsKLSAgICAgICAgICAgIC8vaWYgKHRydWUpIHsKLSAgICAgICAgICAgIGlmIChpc0V4Y2VlZCkgewotICAgICAgICAgICAgICBpZiAoZW5hYmxlRFJDKSB7Ci0gICAgICAgICAgICAgICAgY291dCA8PCIgICAgY29tcGxldGluZyAiIDw8cHJldl9wZXJjIDw8IiUgd2l0aCAiIDw8Z2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldE51bU1hcmtlcnMoKSA8PCIgdmlvbGF0aW9ucyIgPDxlbmRsOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNvdXQgPDwiICAgIGNvbXBsZXRpbmcgIiA8PHByZXZfcGVyYyA8PCIlIHdpdGggIiA8PG51bVF1aWNrTWFya2VycyA8PCIgcXVpY2sgdmlvbGF0aW9ucyIgPDxlbmRsOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNvdXQgPDwiICAgICIgPDx0IDw8ZW5kbCA8PGZsdXNoOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL2lmIChjbnQgJSAxMDAwMCA9PSAwKSB7Ci0gICAgICAgIC8vICBjb3V0IDw8IiAgICBjb21wbGV0ZSAiIDw8Y250IDw8Ii8iIDw8dG90IDw8ZW5kbDsKLSAgICAgICAgLy8gIGNvdXQgPDwiICAgICIgPDx0IDw8ZW5kbDsKLSAgICAgICAgLy8gIC8vY291dCA8PCIgIGNvbXBsZXRpbmcgWFglIHdpdGggWVkgdmlvbGF0aW9ucyIgPDxlbmRsOwotICAgICAgICAvLyAgLy9jb3V0IDw8IiAgZWxhcHNlZCB0aW1lID0gMDA6MDQ6NTUsIG1lbW9yeSA9IFpaWlouWlogKE1CKSIgPDxlbmRsOwotICAgICAgICAvL30KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvL2NvdXQgPDwiICBudW1iZXIgb2YgdmlvbGF0aW9ucyA9ICIgPDxudW1NYXJrZXJzIDw8ZW5kbDsKLSAgcmVtb3ZlR0NlbGwyQm91bmRhcnlQaW4oKTsKLSAgY2hlY2tDb25uZWN0aXZpdHkoKTsKLQotICBpZiAoVkVSQk9TRSA+IDApIHsKLSAgICBpZiAoZW5hYmxlRFJDKSB7Ci0gICAgICBjb3V0IDw8IiAgbnVtYmVyIG9mIHZpb2xhdGlvbnMgPSAiICAgICAgIDw8Z2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldE51bU1hcmtlcnMoKSA8PGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvdXQgPDwiICBudW1iZXIgb2YgcXVpY2sgdmlvbGF0aW9ucyA9ICIgPDxudW1RdWlja01hcmtlcnMgPDxlbmRsOwotICAgIH0KLSAgICAvL2NvdXQgPDwiICAgIGJ5IGxheWVyIGFuZCB0eXBlIDoiIDw8ZW5kbDsKLSAgICAvL2NvdXQgPDwiICAgICAgICAgICBNZXRTcGMgRU9MU3BjIExvb3AgQ3V0U3BjIEFkakN1dCBDb3JTcGMgT3RoZXJzIFRvdGFscyIgPDxlbmRsOwotICAgIC8vY291dCA8PCIgICAgTWV0YWwxICAgICAgMCAgICAgIDAgICAgMCAgICAgIDAgICAgICAwICAgICAgMCAgICAgIDAgICAgICAwIiA8PGVuZGw7Ci0gICAgLy9jb3V0IDw8IiAgICBUb3RhbHMgICAgICAwICAgICAgMCAgICAwICAgICAgMCAgICAgIDAgICAgICAwICAgICAgMCAgICAgIDAiIDw8ZW5kbDsKLSAgICAvL2NvdXQgPDwiY3B1IHRpbWUgPSAwMDowMDowMCwgZWxhcHNlZCB0aW1lID0gMDA6MDA6MDAsIG1lbW9yeSA9IDAwMDAuMDAgKE1CKSwgcGVhayA9IDAwMDAuMDAgKE1CKSIgPDxlbmRsOwotICAgIHQucHJpbnQoKTsKLSAgICBjb3V0IDw8Zmx1c2g7Ci0gIH0KLX0KLQotdm9pZCBGbGV4RFI6OnNlYXJjaFJlcGFpcihpbnQgaXRlciwgaW50IHNpemUsIGludCBvZmZzZXQsIGludCBtYXplRW5kSXRlciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZyVUludDQgd29ya2VyRFJDQ29zdCwgZnJVSW50NCB3b3JrZXJNYXJrZXJDb3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuYWJsZURSQywgaW50IHJpcHVwTW9kZSwgYm9vbCBURVNUKSB7Ci0gIGZyVGltZSB0OwotICAvL2Jvb2wgVEVTVCA9IGZhbHNlOwotICAvL2Jvb2wgVEVTVCA9IHRydWU7Ci0gIGlmIChWRVJCT1NFID4gMCkgewotICAgIGNvdXQgPDxlbmRsIDw8InN0YXJ0ICIgPDxpdGVyOwotICAgIHN0cmluZyBzdWZmaXg7Ci0gICAgaWYgKGl0ZXIgPT0gMSB8fCAoaXRlciA+IDIwICYmIGl0ZXIgJSAxMCA9PSAxKSkgewotICAgICAgc3VmZml4ID0gInN0IjsKLSAgICB9IGVsc2UgaWYgKGl0ZXIgPT0gMiB8fCAoaXRlciA+IDIwICYmIGl0ZXIgJSAxMCA9PSAyKSkgewotICAgICAgc3VmZml4ID0gIm5kIjsKLSAgICB9IGVsc2UgaWYgKGl0ZXIgPT0gMyB8fCAoaXRlciA+IDIwICYmIGl0ZXIgJSAxMCA9PSAzKSkgewotICAgICAgc3VmZml4ID0gInJkIjsKLSAgICB9IGVsc2UgewotICAgICAgc3VmZml4ID0gInRoIjsKLSAgICB9Ci0gICAgY291dCA8PHN1ZmZpeCA8PCIgb3B0aW1pemF0aW9uIGl0ZXJhdGlvbiAuLi4iIDw8ZW5kbDsKLSAgfQotICBmckJveCBkaWVCb3g7Ci0gIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXRCb3VuZGFyeUJCb3goZGllQm94KTsKLSAgLy9nZXRSZWdpb25RdWVyeSgpLT5pbml0RFJPYmooZ2V0VGVjaCgpLT5nZXRMYXllcnMoKS5zaXplKCkpOwotICAvL2dldFJlZ2lvblF1ZXJ5KCktPnByaW50RFJPYmooKTsKLSAgYXV0byBnQ2VsbFBhdHRlcm5zID0gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldEdDZWxsUGF0dGVybnMoKTsKLSAgYXV0byAmeGdwID0gZ0NlbGxQYXR0ZXJucy5hdCgwKTsKLSAgYXV0byAmeWdwID0gZ0NlbGxQYXR0ZXJucy5hdCgxKTsKLSAgaW50IG51bVF1aWNrTWFya2VycyA9IDA7Ci0gIGlmIChURVNUKSB7Ci0gICAgY291dCA8PCJzZWFyY2ggYW5kIHJlcGFpciB0ZXN0IG1vZGUiIDw8ZW5kbCA8PGZsdXNoOwotICAgIEZsZXhEUldvcmtlciB3b3JrZXIoZ2V0RGVzaWduKCkpOwotICAgIGZyQm94IHJvdXRlQm94OwotICAgIC8vZnJDb29yZCB4bCA9IDE0OC41ICogMjAwMDsKLSAgICAvL2ZyQ29vcmQgeWwgPSA1NzAgKiAyMDAwOwotICAgIC8vZnJQb2ludCBpZHg7Ci0gICAgLy9nZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0R0NlbGxJZHgoZnJQb2ludCh4bCwgeWwpLCBpZHgpOwotICAgIC8vaWYgKFZFUkJPU0UgPiAxKSB7Ci0gICAgLy8gIGNvdXQgPDwiKGksaikgPSAoIiA8PGlkeC54KCkgPDwiLCAiIDw8aWR4LnkoKSA8PCIpIiA8PGVuZGw7Ci0gICAgLy99Ci0gICAgLy9nZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0R0NlbGxCb3goaWR4LCByb3V0ZUJveCk7Ci0gICAgLy9yb3V0ZUJveC5zZXQoMTU2KjIwMDAsIDEwOC4zKjIwMDAsIDE3NyoyMDAwLCAxMjguMjUqMjAwMCk7Ci0gICAgLy8gcm91dGVCb3guc2V0KDE3NSoyMDAwLCAzLjUqMjAwMCwgMTg1KjIwMDAsIDEzLjUqMjAwMCk7Ci0gICAgcm91dGVCb3guc2V0KDAqMjAwMCwgMCoyMDAwLCAyMDAqMjAwMCwgMjAwKjIwMDApOwotICAgIHdvcmtlci5zZXRSb3V0ZUJveChyb3V0ZUJveCk7Ci0gICAgZnJCb3ggZXh0Qm94OwotICAgIHJvdXRlQm94LmJsb2F0KDEwMDAsIGV4dEJveCk7Ci0gICAgd29ya2VyLnNldFJvdXRlQm94KHJvdXRlQm94KTsKLSAgICB3b3JrZXIuc2V0RXh0Qm94KGV4dEJveCk7Ci0gICAgd29ya2VyLnNldE1hemVFbmRJdGVyKG1hemVFbmRJdGVyKTsKLSAgICAvLyB3b3JrZXIuc2V0VGVzdCh0cnVlKTsKLSAgICB3b3JrZXIuc2V0VGVzdChmYWxzZSk7Ci0gICAgd29ya2VyLnNldERSQ1Rlc3QodHJ1ZSk7Ci0gICAgd29ya2VyLnNldERSSXRlcihpdGVyKTsKLSAgICB3b3JrZXIuc2V0RW5hYmxlRFJDKGVuYWJsZURSQyk7Ci0gICAgd29ya2VyLnNldFJpcHVwTW9kZShyaXB1cE1vZGUpOwotICAgIHdvcmtlci5zZXRDb3N0KHdvcmtlckRSQ0Nvc3QsIHdvcmtlck1hcmtlckNvc3QpOwotICAgIHdvcmtlci5tYWluKCk7Ci0gICAgbnVtUXVpY2tNYXJrZXJzICs9IHdvcmtlci5nZXROdW1RdWlja01hcmtlcnMoKTsKLSAgICBjb3V0IDw8ImRvbmUiICA8PGVuZGwgPDxmbHVzaDsKLSAgfSBlbHNlIHsKLSAgICAvL3ZlY3RvcjxGbGV4RFJXb3JrZXI+IHdvcmtlcnM7Ci0gICAgaW50IGNsaXBTaXplID0gc2l6ZTsKLSAgICBpbnQgY250ID0gMDsKLSAgICBpbnQgdG90ID0gKCgoaW50KXhncC5nZXRDb3VudCgpIC0gMSAtIG9mZnNldCkgLyBjbGlwU2l6ZSArIDEpICogKCgoaW50KXlncC5nZXRDb3VudCgpIC0gMSAtIG9mZnNldCkgLyBjbGlwU2l6ZSArIDEpOwotICAgIGludCBwcmV2X3BlcmMgPSAwOwotICAgIGJvb2wgaXNFeGNlZWQgPSBmYWxzZTsKLSAgICBmb3IgKGludCBpID0gb2Zmc2V0OyBpIDwgKGludCl4Z3AuZ2V0Q291bnQoKTsgaSArPSBjbGlwU2l6ZSkgewotICAgICAgZm9yIChpbnQgaiA9IG9mZnNldDsgaiA8IChpbnQpeWdwLmdldENvdW50KCk7IGogKz0gY2xpcFNpemUpIHsKLSAgICAvL2ZvciAoaW50IGkgPSAzMTI7IGkgPCAzMzA7IGkgKz0gMykgewotICAgIC8vICBmb3IgKGludCBqID0gMzAwOyBqIDwgMzE4OyBqICs9IDMpIHsKLSAgICAgICAgRmxleERSV29ya2VyIHdvcmtlcihnZXREZXNpZ24oKSk7Ci0gICAgICAgIGZyQm94IHJvdXRlQm94MTsKLSAgICAgICAgZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldEdDZWxsQm94KGZyUG9pbnQoaSwgaiksIHJvdXRlQm94MSk7Ci0gICAgICAgIGZyQm94IHJvdXRlQm94MjsKLSAgICAgICAgZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldEdDZWxsQm94KGZyUG9pbnQobWluKChpbnQpeGdwLmdldENvdW50KCkgLSAxLCBpICsgY2xpcFNpemUtMSksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKGludCl5Z3AuZ2V0Q291bnQoKSwgaiArIGNsaXBTaXplLTEpKSwgcm91dGVCb3gyKTsKLSAgICAgICAgZnJCb3ggcm91dGVCb3gocm91dGVCb3gxLmxlZnQoKSwgcm91dGVCb3gxLmJvdHRvbSgpLCByb3V0ZUJveDIucmlnaHQoKSwgcm91dGVCb3gyLnRvcCgpKTsKLSAgICAgICAgZnJCb3ggZXh0Qm94OwotICAgICAgICByb3V0ZUJveC5ibG9hdCgxMDAwLCBleHRCb3gpOwotICAgICAgICB3b3JrZXIuc2V0Um91dGVCb3gocm91dGVCb3gpOwotICAgICAgICB3b3JrZXIuc2V0RXh0Qm94KGV4dEJveCk7Ci0gICAgICAgIHdvcmtlci5zZXRNYXplRW5kSXRlcihtYXplRW5kSXRlcik7Ci0gICAgICAgIHdvcmtlci5zZXREUkl0ZXIoaXRlcik7Ci0gICAgICAgIHdvcmtlci5zZXRFbmFibGVEUkMoZW5hYmxlRFJDKTsKLSAgICAgICAgd29ya2VyLnNldFJpcHVwTW9kZShyaXB1cE1vZGUpOwotICAgICAgICB3b3JrZXIuc2V0Q29zdCh3b3JrZXJEUkNDb3N0LCB3b3JrZXJNYXJrZXJDb3N0KTsKLSAgICAgICAgLy93b3JrZXJzLnB1c2hfYmFjayh3b3JrZXIpOwotICAgICAgICB3b3JrZXIubWFpbigpOwotICAgICAgICBudW1RdWlja01hcmtlcnMgKz0gd29ya2VyLmdldE51bVF1aWNrTWFya2VycygpOwotICAgICAgICBjbnQrKzsKLSAgICAgICAgaWYgKFZFUkJPU0UgPiAwKSB7Ci0gICAgICAgICAgaWYgKGNudCAqIDEuMCAvIHRvdCA+PSBwcmV2X3BlcmMgLyAxMDAuMCArIDAuMSkgewotICAgICAgICAgICAgaWYgKHByZXZfcGVyYyA9PSAwICYmIHQuaXNFeGNlZWQoMikpIHsKLSAgICAgICAgICAgICAgaXNFeGNlZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJldl9wZXJjICs9IDEwOwotICAgICAgICAgICAgLy9pZiAodHJ1ZSkgewotICAgICAgICAgICAgaWYgKGlzRXhjZWVkKSB7Ci0gICAgICAgICAgICAgIGlmIChlbmFibGVEUkMpIHsKLSAgICAgICAgICAgICAgICBjb3V0IDw8IiAgICBjb21wbGV0aW5nICIgPDxwcmV2X3BlcmMgPDwiJSB3aXRoICIgPDxnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0TnVtTWFya2VycygpIDw8IiB2aW9sYXRpb25zIiA8PGVuZGw7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY291dCA8PCIgICAgY29tcGxldGluZyAiIDw8cHJldl9wZXJjIDw8IiUgd2l0aCAiIDw8bnVtUXVpY2tNYXJrZXJzIDw8IiBxdWljayB2aW9sYXRpb25zIiA8PGVuZGw7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgY291dCA8PCIgICAgIiA8PHQgPDxlbmRsIDw8Zmx1c2g7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vaWYgKGNudCA+IDEwMDAwICYmICkgewotICAgICAgICAvLyAgY291dCA8PCIgICAgY29tcGxldGluZyAiIDw8Y250IDw8Ii8iIDw8dG90IDw8ZW5kbDsKLSAgICAgICAgLy8gIGNvdXQgPDwiICAgICIgPDx0IDw8ZW5kbDsKLSAgICAgICAgLy8gIC8vY291dCA8PCIgIGNvbXBsZXRpbmcgWFglIHdpdGggWVkgdmlvbGF0aW9ucyIgPDxlbmRsOwotICAgICAgICAvLyAgLy9jb3V0IDw8IiAgZWxhcHNlZCB0aW1lID0gMDA6MDQ6NTUsIG1lbW9yeSA9IFpaWlouWlogKE1CKSIgPDxlbmRsOwotICAgICAgICAvL30KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgLy9jb3V0IDw8IiAgbnVtYmVyIG9mIHZpb2xhdGlvbnMgPSAiIDw8bnVtTWFya2VycyA8PGVuZGw7Ci0gIGNoZWNrQ29ubmVjdGl2aXR5KCk7Ci0gIGlmIChWRVJCT1NFID4gMCkgewotICAgIGlmIChlbmFibGVEUkMpIHsKLSAgICAgIGNvdXQgPDwiICBudW1iZXIgb2YgdmlvbGF0aW9ucyA9ICIgPDxnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0TnVtTWFya2VycygpIDw8ZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgY291dCA8PCIgIG51bWJlciBvZiBxdWljayB2aW9sYXRpb25zID0gIiA8PG51bVF1aWNrTWFya2VycyA8PGVuZGw7Ci0gICAgfQotICAgIC8vY291dCA8PCIgICAgYnkgbGF5ZXIgYW5kIHR5cGUgOiIgPDxlbmRsOwotICAgIC8vY291dCA8PCIgICAgICAgICAgIE1ldFNwYyBFT0xTcGMgTG9vcCBDdXRTcGMgQWRqQ3V0IENvclNwYyBPdGhlcnMgVG90YWxzIiA8PGVuZGw7Ci0gICAgLy9jb3V0IDw8IiAgICBNZXRhbDEgICAgICAwICAgICAgMCAgICAwICAgICAgMCAgICAgIDAgICAgICAwICAgICAgMCAgICAgIDAiIDw8ZW5kbDsKLSAgICAvL2NvdXQgPDwiICAgIFRvdGFscyAgICAgIDAgICAgICAwICAgIDAgICAgICAwICAgICAgMCAgICAgIDAgICAgICAwICAgICAgMCIgPDxlbmRsOwotICAgIC8vY291dCA8PCJjcHUgdGltZSA9IDAwOjAwOjAwLCBlbGFwc2VkIHRpbWUgPSAwMDowMDowMCwgbWVtb3J5ID0gMDAwMC4wMCAoTUIpLCBwZWFrID0gMDAwMC4wMCAoTUIpIiA8PGVuZGw7Ci0gICAgdC5wcmludCgpOwotICAgIGNvdXQgPDxmbHVzaDsKLSAgfQotfQotCi12b2lkIEZsZXhEUjo6ZW5kKCkgewotICB2ZWN0b3I8dW5zaWduZWQgbG9uZyBsb25nPiB3bGVuKGdldFRlY2goKS0+Z2V0TGF5ZXJzKCkuc2l6ZSgpLCAwKTsKLSAgdmVjdG9yPHVuc2lnbmVkIGxvbmcgbG9uZz4gc0N1dChnZXRUZWNoKCktPmdldExheWVycygpLnNpemUoKSwgMCk7Ci0gIHZlY3Rvcjx1bnNpZ25lZCBsb25nIGxvbmc+IG1DdXQoZ2V0VGVjaCgpLT5nZXRMYXllcnMoKS5zaXplKCksIDApOwotICB1bnNpZ25lZCBsb25nIGxvbmcgdG90V2xlbiA9IDA7Ci0gIHVuc2lnbmVkIGxvbmcgbG9uZyB0b3RTQ3V0ID0gMDsKLSAgdW5zaWduZWQgbG9uZyBsb25nIHRvdE1DdXQgPSAwOwotICBmclBvaW50IGJwLCBlcDsKLSAgZm9yIChhdXRvICZuZXQ6IGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXROZXRzKCkpIHsKLSAgICBmb3IgKGF1dG8gJnNoYXBlOiBuZXQtPmdldFNoYXBlcygpKSB7Ci0gICAgICBpZiAoc2hhcGUtPnR5cGVJZCgpID09IGZyY1BhdGhTZWcpIHsKLSAgICAgICAgYXV0byBvYmogPSBzdGF0aWNfY2FzdDxmclBhdGhTZWcqPihzaGFwZS5nZXQoKSk7Ci0gICAgICAgIG9iai0+Z2V0UG9pbnRzKGJwLCBlcCk7Ci0gICAgICAgIGF1dG8gbE51bSA9IG9iai0+Z2V0TGF5ZXJOdW0oKTsKLSAgICAgICAgZnJDb29yZCBwc0xlbiA9IGVwLngoKSAtIGJwLngoKSArIGVwLnkoKSAtIGJwLnkoKTsKLSAgICAgICAgd2xlbltsTnVtXSArPSBwc0xlbjsKLSAgICAgICAgdG90V2xlbiArPSBwc0xlbjsKLSAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChhdXRvICZ2aWE6IG5ldC0+Z2V0VmlhcygpKSB7Ci0gICAgICBhdXRvIGxOdW0gPSB2aWEtPmdldFZpYURlZigpLT5nZXRDdXRMYXllck51bSgpOwotICAgICAgaWYgKHZpYS0+Z2V0VmlhRGVmKCktPmlzTXVsdGlDdXQoKSkgewotICAgICAgICArK21DdXRbbE51bV07Ci0gICAgICAgICsrdG90TUN1dDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICsrc0N1dFtsTnVtXTsKLSAgICAgICAgKyt0b3RTQ3V0OwotICAgICAgfQotICAgIH0KLSAgfQotICBpZiAoVkVSQk9TRSA+IDApIHsKLSAgICBib29zdDo6aW86Omlvc19hbGxfc2F2ZXIgZ3VhcmQoc3RkOjpjb3V0KTsKLSAgICBjb3V0IDw8ZW5kbCA8PCJ0b3RhbCB3aXJlIGxlbmd0aCA9ICIgPDx0b3RXbGVuIC8gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCkgPDwiIHVtIiA8PGVuZGw7Ci0gICAgZm9yIChpbnQgaSA9IGdldFRlY2goKS0+Z2V0Qm90dG9tTGF5ZXJOdW0oKTsgaSA8PSBnZXRUZWNoKCktPmdldFRvcExheWVyTnVtKCk7IGkrKykgewotICAgICAgaWYgKGdldFRlY2goKS0+Z2V0TGF5ZXIoaSktPmdldFR5cGUoKSA9PSBmckxheWVyVHlwZUVudW06OlJPVVRJTkcpIHsKLSAgICAgICAgY291dCA8PCJ0b3RhbCB3aXJlIGxlbmd0aCBvbiBMQVlFUiAiIDw8Z2V0VGVjaCgpLT5nZXRMYXllcihpKS0+Z2V0TmFtZSgpIDw8IiA9ICIgCi0gICAgICAgICAgICAgPDx3bGVuW2ldIC8gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCkgPDwiIHVtIiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICAgIGNvdXQgPDwidG90YWwgbnVtYmVyIG9mIHZpYXMgPSAiIDw8dG90U0N1dCArIHRvdE1DdXQgPDxlbmRsOwotICAgIGlmICh0b3RNQ3V0ID4gMCkgewotICAgICAgY291dCA8PCJ0b3RhbCBudW1iZXIgb2YgbXVsdGktY3V0IHZpYXMgPSAiIDw8dG90TUN1dCAKLSAgICAgICAgICAgPDwgIiAoIiA8PHNldHcoNSkgPDxmaXhlZCA8PHNldHByZWNpc2lvbigxKSA8PHRvdE1DdXQgKiAxMDAuMCAvICh0b3RTQ3V0ICsgdG90TUN1dCkgPDwiJSkiIDw8ZW5kbDsKLSAgICAgIGNvdXQgPDwidG90YWwgbnVtYmVyIG9mIHNpbmdsZS1jdXQgdmlhcyA9ICIgPDx0b3RTQ3V0IAotICAgICAgICAgICA8PCAiICgiIDw8c2V0dyg1KSA8PGZpeGVkIDw8c2V0cHJlY2lzaW9uKDEpIDw8dG90U0N1dCAqIDEwMC4wIC8gKHRvdFNDdXQgKyB0b3RNQ3V0KSA8PCIlKSIgPDxlbmRsOwotICAgIH0KLSAgICBjb3V0IDw8InVwLXZpYSBzdW1tYXJ5ICh0b3RhbCAiIDw8dG90U0N1dCArIHRvdE1DdXQgPDwiKToiIDw8ZW5kbDsKLSAgICBpbnQgbmFtZUxlbiA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IGdldFRlY2goKS0+Z2V0Qm90dG9tTGF5ZXJOdW0oKTsgaSA8PSBnZXRUZWNoKCktPmdldFRvcExheWVyTnVtKCk7IGkrKykgewotICAgICAgaWYgKGdldFRlY2goKS0+Z2V0TGF5ZXIoaSktPmdldFR5cGUoKSA9PSBmckxheWVyVHlwZUVudW06OkNVVCkgewotICAgICAgICBuYW1lTGVuID0gbWF4KG5hbWVMZW4sIChpbnQpZ2V0VGVjaCgpLT5nZXRMYXllcihpLTEpLT5nZXROYW1lKCkuc2l6ZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaW50IG1heEwgPSAxICsgbmFtZUxlbiArIDQgKyAoaW50KXRvX3N0cmluZyh0b3RTQ3V0KS5sZW5ndGgoKTsKLSAgICBpZiAodG90TUN1dCkgewotICAgICAgbWF4TCArPSA5ICsgNCArIChpbnQpdG9fc3RyaW5nKHRvdE1DdXQpLmxlbmd0aCgpICsgOSArIDQgKyAoaW50KXRvX3N0cmluZyh0b3RTQ3V0ICsgdG90TUN1dCkubGVuZ3RoKCk7Ci0gICAgfQotICAgIGlmICh0b3RNQ3V0KSB7Ci0gICAgICBjb3V0IDw8IiAiIDw8c2V0dyhuYW1lTGVuICsgNCArIChpbnQpdG9fc3RyaW5nKHRvdFNDdXQpLmxlbmd0aCgpICsgOSkgPDwic2luZ2xlLWN1dCI7Ci0gICAgICBjb3V0IDw8c2V0dyg0ICsgKGludCl0b19zdHJpbmcodG90TUN1dCkubGVuZ3RoKCkgKyA5KSA8PCJtdWx0aS1jdXQiIAotICAgICAgICAgICA8PHNldHcoNCArIChpbnQpdG9fc3RyaW5nKHRvdFNDdXQgKyB0b3RNQ3V0KS5sZW5ndGgoKSkgPDwidG90YWwiOwotICAgIH0KLSAgICBjb3V0IDw8ZW5kbDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heEw7IGkrKykgewotICAgICAgY291dCA8PCItIjsKLSAgICB9Ci0gICAgY291dCA8PGVuZGw7Ci0gICAgZm9yIChpbnQgaSA9IGdldFRlY2goKS0+Z2V0Qm90dG9tTGF5ZXJOdW0oKTsgaSA8PSBnZXRUZWNoKCktPmdldFRvcExheWVyTnVtKCk7IGkrKykgewotICAgICAgaWYgKGdldFRlY2goKS0+Z2V0TGF5ZXIoaSktPmdldFR5cGUoKSA9PSBmckxheWVyVHlwZUVudW06OkNVVCkgewotICAgICAgICBjb3V0IDw8IiAiICAgIDw8c2V0dyhuYW1lTGVuKSA8PGdldFRlY2goKS0+Z2V0TGF5ZXIoaS0xKS0+Z2V0TmFtZSgpIAotICAgICAgICAgICAgIDw8IiAgICAiIDw8c2V0dygoaW50KXRvX3N0cmluZyh0b3RTQ3V0KS5sZW5ndGgoKSkgPDxzQ3V0W2ldOwotICAgICAgICBpZiAodG90TUN1dCkgewotICAgICAgICAgIGNvdXQgPDwiICgiICAgPDxzZXR3KDUpIDw8KGRvdWJsZSkoKHNDdXRbaV0gKyBtQ3V0W2ldKSA/IHNDdXRbaV0gKiAxMDAuMCAvIChzQ3V0W2ldICsgbUN1dFtpXSkgOiAwLjApIDw8IiUpIjsKLSAgICAgICAgICBjb3V0IDw8IiAgICAiIDw8c2V0dygoaW50KXRvX3N0cmluZyh0b3RNQ3V0KS5sZW5ndGgoKSkgPDxtQ3V0W2ldIAotICAgICAgICAgICAgICAgPDwiICgiICAgPDxzZXR3KDUpIDw8KGRvdWJsZSkoKHNDdXRbaV0gKyBtQ3V0W2ldKSA/IG1DdXRbaV0gKiAxMDAuMCAvIChzQ3V0W2ldICsgbUN1dFtpXSkgOiAwLjApIDw8IiUpIgotICAgICAgICAgICAgICAgPDwiICAgICIgPDxzZXR3KChpbnQpdG9fc3RyaW5nKHRvdFNDdXQgKyB0b3RNQ3V0KS5sZW5ndGgoKSkgPDxzQ3V0W2ldICsgbUN1dFtpXTsKLSAgICAgICAgfQotICAgICAgICBjb3V0IDw8ZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhMOyBpKyspIHsKLSAgICAgIGNvdXQgPDwiLSI7Ci0gICAgfQotICAgIGNvdXQgPDxlbmRsOwotICAgIGNvdXQgPDwiICIgICAgPDxzZXR3KG5hbWVMZW4pIDw8IiIKLSAgICAgICAgIDw8IiAgICAiIDw8c2V0dygoaW50KXRvX3N0cmluZyh0b3RTQ3V0KS5sZW5ndGgoKSkgPDx0b3RTQ3V0OwotICAgIGlmICh0b3RNQ3V0KSB7Ci0gICAgICBjb3V0IDw8IiAoIiAgIDw8c2V0dyg1KSA8PChkb3VibGUpKCh0b3RTQ3V0ICsgdG90TUN1dCkgPyB0b3RTQ3V0ICogMTAwLjAgLyAodG90U0N1dCArIHRvdE1DdXQpIDogMC4wKSA8PCIlKSI7Ci0gICAgICBjb3V0IDw8IiAgICAiIDw8c2V0dygoaW50KXRvX3N0cmluZyh0b3RNQ3V0KS5sZW5ndGgoKSkgPDx0b3RNQ3V0IAotICAgICAgICAgICA8PCIgKCIgICA8PHNldHcoNSkgPDwoZG91YmxlKSgodG90U0N1dCArIHRvdE1DdXQpID8gdG90TUN1dCAqIDEwMC4wIC8gKHRvdFNDdXQgKyB0b3RNQ3V0KSA6IDAuMCkgPDwiJSkiCi0gICAgICAgICAgIDw8IiAgICAiIDw8c2V0dygoaW50KXRvX3N0cmluZyh0b3RTQ3V0ICsgdG90TUN1dCkubGVuZ3RoKCkpIDw8dG90U0N1dCArIHRvdE1DdXQ7Ci0gICAgfQotICAgIGNvdXQgPDxlbmRsIDw8ZW5kbCA8PGZsdXNoOwotICAgIGd1YXJkLnJlc3RvcmUoKTsKLSAgfQotfQotCi12b2lkIEZsZXhEUjo6cmVwb3J0RFJDKCkgewotICBkb3VibGUgZGJ1ID0gZGVzaWduLT5nZXRUZWNoKCktPmdldERCVVBlclVVKCk7Ci0gIGNvdXQgPDwgRFJDX1JQVF9GSUxFIDw8ICJcbiI7Ci0gIGlmIChEUkNfUlBUX0ZJTEUgIT0gc3RyaW5nKCIiKSkgewotICAgIG9mc3RyZWFtIGRyY1JwdChEUkNfUlBUX0ZJTEUuY19zdHIoKSk7Ci0gICAgaWYgKGRyY1JwdC5pc19vcGVuKCkpIHsKLSAgICAgIGZvciAoYXV0byAmbWFya2VyOiBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0TWFya2VycygpKSB7Ci0gICAgICAgIGRyY1JwdCA8PCAiICB2aW9sYXRpb24gdHlwZTogIiA8PCBpbnQobWFya2VyLT5nZXRDb25zdHJhaW50KCktPnR5cGVJZCgpKSA8PCAiXG4iOwotICAgICAgICAvLyBnZXQgc291cmNlKHMpIG9mIHZpb2xhdGlvbgotICAgICAgICBkcmNScHQgPDwgIiAgICBzcmNzOiAiOwotICAgICAgICBmb3IgKGF1dG8gc3JjOiBtYXJrZXItPmdldFNyY3MoKSkgewotICAgICAgICAgIGlmIChzcmMpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoc3JjLT50eXBlSWQoKSkgewotICAgICAgICAgICAgICBjYXNlIGZyY05ldDoKLSAgICAgICAgICAgICAgICBkcmNScHQgPDwgKHN0YXRpY19jYXN0PGZyTmV0Kj4oc3JjKSktPmdldE5hbWUoKSA8PCAiICI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgZnJjSW5zdFRlcm06IHsKLSAgICAgICAgICAgICAgICBmckluc3RUZXJtKiBpbnN0VGVybSA9IChzdGF0aWNfY2FzdDxmckluc3RUZXJtKj4oc3JjKSk7Ci0gICAgICAgICAgICAgICAgLy8gZHJjUnB0IDw8IGluc3RUZXJtLT5nZXRJbnN0KCktPmdldE5hbWUoKSAKLSAgICAgICAgICAgICAgICAgICAgICAgLy8gPDwgIi8iIDw8IGluc3RUZXJtLT5nZXRUZXJtKCktPmdldE5hbWUoKSA8PCAiICI7Ci0gICAgICAgICAgICAgICAgZHJjUnB0IDw8ICJQaW4gb2YgQ2VsbCAiIDw8IGluc3RUZXJtLT5nZXRJbnN0KCktPmdldE5hbWUoKSA8PCAiICI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgY2FzZSBmcmNUZXJtOiB7Ci0gICAgICAgICAgICAgICAgZnJUZXJtKiB0ZXJtID0gKHN0YXRpY19jYXN0PGZyVGVybSo+KHNyYykpOwotICAgICAgICAgICAgICAgIGRyY1JwdCA8PCB0ZXJtLT5nZXROYW1lKCkgPDwgIiAiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJFcnJvcjogdW5leHBlY3RlZCBzcmMgdHlwZSBpbiBtYXJrZXJcbiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGRyY1JwdCA8PCAiXG4iOwotICAgICAgICAvLyBnZXQgdmlvbGF0aW9uIGJib3gKLSAgICAgICAgZnJCb3ggYmJveDsKLSAgICAgICAgbWFya2VyLT5nZXRCQm94KGJib3gpOwotICAgICAgICBkcmNScHQgPDwgIiAgICBiYm94ID0gKCIgPDwgYmJveC5sZWZ0KCkgLyBkYnUgPDwgIiwgIiA8PCBiYm94LmJvdHRvbSgpIC8gZGJ1IDw8ICIpIC0gKCIKLSAgICAgICAgICAgICAgIDw8IGJib3gucmlnaHQoKSAvIGRidSA8PCAiLCAiIDw8IGJib3gudG9wKCkgLyBkYnUgPDwgIilcbiI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvdXQgPDwgIkVycm9yOiBGYWlsIHRvIG9wZW4gRFJDIHJlcG9ydCBmaWxlXG4iOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBjb3V0IDw8ICJFcnJvcjogRFJDIHJlcG9ydCBmaWxlIGlzIG5vdCBzcGVjaWZpZWRcbiI7Ci0gIH0KLX0KLQotCi1pbnQgRmxleERSOjptYWluKCkgewotICBpbml0KCk7Ci0gIGZyVGltZSB0OwotICBpZiAoVkVSQk9TRSA+IDApIHsKLSAgICBjb3V0IDw8ZW5kbCA8PGVuZGwgPDwic3RhcnQgZGV0YWlsIHJvdXRpbmcgLi4uIjsKLSAgfQotICAvLyBpbml0RFI6IGVuYWJsZURSQwotICBpbml0RFIoNywgdHJ1ZSk7Ci0gIC8vY291dCAgIDw8ZW5kbAotICAvLyAgICAgICA8PCJ0aW1lIChJTklUL1JPVVRFL1BPU1QpICIgPDx0aW1lX3NwYW5faW5pdC5jb3VudCgpIDw8IiAiIAotICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDx0aW1lX3NwYW5fcm91dGUuY291bnQoKSA8PCIgIgotICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDx0aW1lX3NwYW5fZW5kLmNvdW50KCkgPDwiICIKLSAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ZW5kbDsKLSAgLy9pbzo6V3JpdGVyIHdyaXRlcihnZXREZXNpZ24oKSk7Ci0gIC8vd3JpdGVyLndyaXRlRnJvbURSKCJfaW5pdCIpOwotICAvLyBzZWFyY2ggYW5kIHJlcGFpcjogaXRlciwgc2l6ZSwgb2Zmc2V0LCBtYXplRW5kSXRlciwgd29ya2VyRFJDQ29zdCwgd29ya2VyTWFya2VyQ29zdCwgZW5hYmxlRFJDLCByaXB1cE1vZGUsIFRFU1QKLSAgLy8gYXNzdW1lIG9ubHkgbWF6ZUVuZEl0ZXIgPiAxIGlmIGVuYWJsZURSQyBhbmQgcmlwdXBNb2RlID09IDAgKHBhcnRpYWwgcmlwdXApCi0gIGVuZCgpOwotICBzZWFyY2hSZXBhaXIoMSwgNywgMywgMSwgRFJDQ09TVCwgMCwgdHJ1ZSwgMSk7IC8vIGZ1bmMgYXMgZnVsbHkgcmVyb3V0aW5nIGl0ZXIsIG5vIG1hcmtlciBjb3N0Ci0gIC8vZW5kKCk7Ci0gIC8vc2VhcmNoUmVwYWlyKDIsIDcsIDAsIDEsIERSQ0NPU1QsIDAsIHRydWUsIDEpOyAvLyBmdW5jIGFzIHJlcm91dGluZyBpdGVyLCBubyBtYXJrZXIgY29zdAotICAvL2VuZCgpOwotICAvL3NlYXJjaFJlcGFpcigzLCA3LCAwLCAxLCBEUkNDT1NULCAwLCB0cnVlLCAxKTsgLy8gZnVuYyBhcyByZXJvdXRpbmcgaXRlciwgbm8gbWFya2VyIGNvc3QKLSAgLy9lbmQoKTsKLSAgLy9zZWFyY2hSZXBhaXIoNCwgNywgMywgMSwgRFJDQ09TVCwgMCwgdHJ1ZSwgMSk7IC8vIGZ1bmMgYXMgcmVyb3V0aW5nIGl0ZXIsIG5vIG1hcmtlciBjb3N0Ci0gIGVuZCgpOwotICBzZWFyY2hSZXBhaXIoMiwgNywgMCwgMSwgRFJDQ09TVCwgTUFSS0VSQ09TVCwgdHJ1ZSwgMCk7IC8vIHRydWUgc2VhcmNoIGFuZCByZXBhaXIKLSAgZW5kKCk7Ci0gIHNlYXJjaFJlcGFpcigzLCA3LCAzLCAxLCBEUkNDT1NULCBNQVJLRVJDT1NULCB0cnVlLCAwKTsgLy8gdHJ1ZSBzZWFyY2ggYW5kIHJlcGFpcgotICBlbmQoKTsKLSAgc2VhcmNoUmVwYWlyKDQsIDcsIDAsIDEsIERSQ0NPU1QsIE1BUktFUkNPU1QqMiwgdHJ1ZSwgMCk7IC8vIHRydWUgc2VhcmNoIGFuZCByZXBhaXIKLSAgZW5kKCk7Ci0gIHNlYXJjaFJlcGFpcig1LCA3LCAzLCAxLCBEUkNDT1NULCBNQVJLRVJDT1NUKjIsIHRydWUsIDApOyAvLyB0cnVlIHNlYXJjaCBhbmQgcmVwYWlyCi0gIC8vcmVwb3J0RFJDKCk7Ci0gIC8vZW5kKCk7Ci0gIC8vc2VhcmNoUmVwYWlyKDcsIDcsIDAsIDEsIERSQ0NPU1QsIE1BUktFUkNPU1QqMzIsIHRydWUsIDApOwotICAvL2VuZCgpOwotICAvL3NlYXJjaFJlcGFpcig4LCA3LCAzLCAxLCBEUkNDT1NULCBNQVJLRVJDT1NUKjMyLCB0cnVlLCAwKTsKLSAgLy9lbmQoKTsKLSAgLy9zZWFyY2hSZXBhaXIoNCwgMTEsIDUsIDEsIHRydWUpOwotICAvL2VuZCgpOwotICAvL3NlYXJjaFJlcGFpcig1LCAxMywgMCwgMSwgdHJ1ZSk7Ci0gIC8vZW5kKCk7Ci0gIC8vc2VhcmNoUmVwYWlyKDYsIDEzLCA3LCAxLCB0cnVlKTsKLSAgLy9lbmQoKTsKLSAgLy9zZWFyY2hSZXBhaXIoNywgMTcsIDAsIDEsIHRydWUpOwotICAvL2VuZCgpOwotICAvL3NlYXJjaFJlcGFpcig4LCAxNywgOSwgMSwgdHJ1ZSk7Ci0gIC8vZW5kKCk7Ci0gIC8vc2VhcmNoUmVwYWlyKDMsIDcsIDEsIDQpOwotICAvL2VuZCgpOwotICAvL3NlYXJjaFJlcGFpcig0LCAxMSwgMCwgNik7Ci0gIC8vZW5kKCk7Ci0gIC8vQk9UVE9NX1JPVVRJTkdfTEFZRVIgPSAyOwotICAvL3NlYXJjaFJlcGFpcigzLCA3LCAwLCAxLCB0cnVlKTsKLSAgLy9lbmQoKTsKLSAgLy9zZWFyY2hSZXBhaXIoNSwgMTEsIDUsIDYpOwotICAvL2VuZCgpOwotICAvL3NlYXJjaFJlcGFpcig0LCAxNywgMCk7Ci0gIC8vZW5kKCk7Ci0gIC8vc2VhcmNoUmVwYWlyKDIsIDE2LCAxKTsKLSAgLy9lbmQoKTsKLSAgLy9zZWFyY2hSZXBhaXIoMywgMTYsIDIpOwotICAvL2VuZCgpOwotICAvL3NlYXJjaFJlcGFpcig0LCAxNiwgMyk7Ci0gIC8vZW5kKCk7Ci0gIC8vc2VhcmNoUmVwYWlyKDUsIDE2LCA0KTsKLSAgLy9mb3IgKGludCBpID0gMTsgaSA8PSBFTkRfSVRFUkFUSU9OOyBpKyspIHsKLSAgLy8gIGVuZCgpOwotICAvLyAgc2VhcmNoUmVwYWlyKGksIDUsIDApOwotICAvL30KLSAgLy9vbXBfc2V0X251bV90aHJlYWRzKDQwKTsKLSAgLy8jcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYykKLSAgLy9mb3IgKGludCBpID0gMDsgaSA8IDk5OTk5OTk5OTsgaSsrKSB7Ci0gIC8vICBhdXRvIGogPSBpKmk7Ci0gIC8vICBpZiAoVkVSQk9TRSA+IDEwMCkgewotICAvLyAgICBjb3V0IDw8aiA8PGVuZGw7Ci0gIC8vICB9Ci0gIC8vfQotICAvL3RpbWVfc3Bhbl9pbml0ICA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGU+KDApOwotICAvL3RpbWVfc3Bhbl9yb3V0ZSA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGU+KDApOwotICAvL3RpbWVfc3Bhbl9lbmQgICA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGU+KDApOwotICAvL2NvdXQgICA8PGVuZGwgCi0gIC8vICAgICAgIDw8InRpbWUgKElOSVQvUk9VVEUvUE9TVCkgIiA8PHRpbWVfc3Bhbl9pbml0LmNvdW50KCkgPDwiICIgCi0gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PHRpbWVfc3Bhbl9yb3V0ZS5jb3VudCgpIDw8IiAiCi0gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PHRpbWVfc3Bhbl9lbmQuY291bnQoKSA8PCIgIgotICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDxlbmRsOwotCi0gIGlmIChEUkNfUlBUX0ZJTEUgIT0gc3RkOjpzdHJpbmcoIiIpKSB7Ci0gICAgZG91YmxlIGRidSA9IGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldERCVVBlclVVKCk7Ci0gICAgc3RkOjpvZnN0cmVhbSBkcmNScHQoRFJDX1JQVF9GSUxFLmNfc3RyKCkpOwotICAgIGlmIChkcmNScHQuaXNfb3BlbigpKSB7Ci0gICAgICBmb3IgKGF1dG8gJnVtYXJrZXI6IGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXRNYXJrZXJzKCkpIHsKLSAgICAgICAgYXV0byAmbWFya2VyID0gKnVtYXJrZXI7Ci0gICAgICAgIGRyY1JwdCA8PCAiICB2aW9sYXRpb24gdHlwZTogIiA8PCBpbnQobWFya2VyLmdldENvbnN0cmFpbnQoKS0+dHlwZUlkKCkpIDw8ICJcbiI7Ci0gICAgICAgIC8vIGdldCBzb3VyY2Uocykgb2YgdmlvbGF0aW9uCi0gICAgICAgIGRyY1JwdCA8PCAiICAgIHNyY3M6ICI7Ci0gICAgICAgIGZvciAoYXV0byBzcmM6IG1hcmtlci5nZXRTcmNzKCkpIHsKLSAgICAgICAgICBpZiAoc3JjKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHNyYy0+dHlwZUlkKCkpIHsKLSAgICAgICAgICAgICAgY2FzZSBmcmNOZXQ6Ci0gICAgICAgICAgICAgICAgZHJjUnB0IDw8IChzdGF0aWNfY2FzdDxmck5ldCo+KHNyYykpLT5nZXROYW1lKCkgPDwgIiAiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIGZyY0luc3RUZXJtOiB7Ci0gICAgICAgICAgICAgICAgZnJJbnN0VGVybSogaW5zdFRlcm0gPSAoc3RhdGljX2Nhc3Q8ZnJJbnN0VGVybSo+KHNyYykpOwotICAgICAgICAgICAgICAgIC8vIGRyY1JwdCA8PCBpbnN0VGVybS0+Z2V0SW5zdCgpLT5nZXROYW1lKCkgCi0gICAgICAgICAgICAgICAgICAgICAgIC8vIDw8ICIvIiA8PCBpbnN0VGVybS0+Z2V0VGVybSgpLT5nZXROYW1lKCkgPDwgIiAiOwotICAgICAgICAgICAgICAgIGRyY1JwdCA8PCAiUGluIG9mIENlbGwgIiA8PCBpbnN0VGVybS0+Z2V0SW5zdCgpLT5nZXROYW1lKCkgPDwgIiAiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNhc2UgZnJjVGVybTogewotICAgICAgICAgICAgICAgIGZyVGVybSogdGVybSA9IChzdGF0aWNfY2FzdDxmclRlcm0qPihzcmMpKTsKLSAgICAgICAgICAgICAgICBkcmNScHQgPDwgdGVybS0+Z2V0TmFtZSgpIDw8ICIgIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiRXJyb3I6IHVuZXhwZWN0ZWQgc3JjIHR5cGUgaW4gbWFya2VyXG4iOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkcmNScHQgPDwgIlxuIjsKLSAgICAgICAgLy8gZ2V0IHZpb2xhdGlvbiBiYm94Ci0gICAgICAgIGZyQm94IGJib3g7Ci0gICAgICAgIG1hcmtlci5nZXRCQm94KGJib3gpOwotICAgICAgICBkcmNScHQgPDwgIiAgICBiYm94ID0gKCIgPDwgYmJveC5sZWZ0KCkgLyBkYnUgPDwgIiwgIiA8PCBiYm94LmJvdHRvbSgpIC8gZGJ1IDw8ICIpIC0gKCIKLSAgICAgICAgICAgICAgIDw8IGJib3gucmlnaHQoKSAvIGRidSA8PCAiLCAiIDw8IGJib3gudG9wKCkgLyBkYnUgPDwgIilcbiI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN0ZDo6Y291dCA8PCAiRXJyb3I6IEZhaWwgdG8gb3BlbiBEUkMgcmVwb3J0IGZpbGVcbiI7Ci0gICAgfQotICB9Ci0KLQotICBpZiAoVkVSQk9TRSA+IDApIHsKLSAgICBjb3V0IDw8ZW5kbCA8PCJjb21wbGV0ZSBkZXRhaWwgcm91dGluZyI7Ci0gICAgZW5kKCk7Ci0gIH0KLSAgaWYgKFZFUkJPU0UgPiAwKSB7Ci0gICAgdC5wcmludCgpOwotICAgIGNvdXQgPDxlbmRsOwotICB9Ci0gIHJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kci9GbGV4RFIuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RyL0ZsZXhEUi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDRhYTJjLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RyL0ZsZXhEUi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTA3ICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX0ZSX0ZMRVhEUl9IXwotI2RlZmluZSBfRlJfRkxFWERSX0hfCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSAiZnJEZXNpZ24uaCIKLSNpbmNsdWRlICJkYi9kck9iai9kck5ldC5oIgotI2luY2x1ZGUgImRiL2RyT2JqL2RyTWFya2VyLmgiCi0jaW5jbHVkZSAiZHIvRmxleEdyaWRHcmFwaC5oIgotI2luY2x1ZGUgImRyL0ZsZXhXYXZlZnJvbnQuaCIKLQotbmFtZXNwYWNlIGZyIHsKLQotICBjbGFzcyBGbGV4RFIgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3JzCi0gICAgRmxleERSKGZyRGVzaWduKiBkZXNpZ25Jbik6IGRlc2lnbihkZXNpZ25Jbikge30KLSAgICAvLyBnZXR0ZXJzCi0gICAgZnJUZWNoT2JqZWN0KiBnZXRUZWNoKCkgY29uc3QgewotICAgICAgcmV0dXJuIGRlc2lnbi0+Z2V0VGVjaCgpOwotICAgIH0KLSAgICBmckRlc2lnbiogZ2V0RGVzaWduKCkgY29uc3QgewotICAgICAgcmV0dXJuIGRlc2lnbjsKLSAgICB9Ci0gICAgZnJSZWdpb25RdWVyeSogZ2V0UmVnaW9uUXVlcnkoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gZGVzaWduLT5nZXRSZWdpb25RdWVyeSgpOwotICAgIH0KLSAgICAvLyBvdGhlcnMKLSAgICBpbnQgbWFpbigpOwotICBwcm90ZWN0ZWQ6Ci0gICAgZnJEZXNpZ24qICAgICAgICAgIGRlc2lnbjsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxzdGQ6Om1hcDxmck5ldCosIHN0ZDo6c2V0PHN0ZDo6cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiA+LCBmckJsb2NrT2JqZWN0Q29tcD4gPiA+IGdjZWxsMkJvdW5kYXJ5UGluOwotICAgIC8vIG90aGVycwotICAgIHZvaWQgaW5pdCgpOwotICAgIHZvaWQgaW5pdEZyb21UQSgpOwotICAgIHZvaWQgaW5pdEdDZWxsMkJvdW5kYXJ5UGluKCk7Ci0gICAgdm9pZCByZW1vdmVHQ2VsbDJCb3VuZGFyeVBpbigpOwotICAgIHZvaWQgY2hlY2tDb25uZWN0aXZpdHkoKTsKLSAgICB2b2lkIGNoZWNrQ29ubmVjdGl2aXR5X2luaXREUk9ianMoZnJOZXQqIG5ldCwgc3RkOjp2ZWN0b3I8ZnJDb25uRmlnKj4gJm5ldERST2Jqcyk7Ci0gICAgdm9pZCBjaGVja0Nvbm5lY3Rpdml0eV9waW4yZXBNYXAoZnJOZXQqIG5ldCwgc3RkOjp2ZWN0b3I8ZnJDb25uRmlnKj4gJm5ldERST2JqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxmckJsb2NrT2JqZWN0Kiwgc3RkOjpzZXQ8c3RkOjpwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+ID4sIGZyQmxvY2tPYmplY3RDb21wPiAmcGluMmVwTWFwKTsKLSAgICB2b2lkIGNoZWNrQ29ubmVjdGl2aXR5X3BpbjJlcE1hcF9oZWxwZXIoZnJOZXQqIG5ldCwgY29uc3QgZnJQb2ludCAmYnAsIGZyTGF5ZXJOdW0gbE51bSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGZyQmxvY2tPYmplY3QqLCBzdGQ6OnNldDxzdGQ6OnBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4gPiwgZnJCbG9ja09iamVjdENvbXA+ICZwaW4yZXBNYXApOwotICAgIHZvaWQgY2hlY2tDb25uZWN0aXZpdHlfbm9kZU1hcChmck5ldCogbmV0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZnJDb25uRmlnKj4gJm5ldERST2JqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZnJCbG9ja09iamVjdCo+ICZuZXRQaW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxmckJsb2NrT2JqZWN0Kiwgc3RkOjpzZXQ8c3RkOjpwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+ID4sIGZyQmxvY2tPYmplY3RDb21wPiAmcGluMmVwTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4sIHN0ZDo6c2V0PGludD4gPiAmbm9kZU1hcCk7Ci0gICAgdm9pZCBjaGVja0Nvbm5lY3Rpdml0eV9ub2RlTWFwX3JvdXRlT2JqRW5kKGZyTmV0KiBuZXQsIHN0ZDo6dmVjdG9yPGZyQ29ubkZpZyo+ICZuZXRSb3V0ZU9ianMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiwgc3RkOjpzZXQ8aW50PiA+ICZub2RlTWFwKTsKLSAgICB2b2lkIGNoZWNrQ29ubmVjdGl2aXR5X25vZGVNYXBfcm91dGVPYmpTcGxpdChmck5ldCogbmV0LCBzdGQ6OnZlY3RvcjxmckNvbm5GaWcqPiAmbmV0Um91dGVPYmpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiwgc3RkOjpzZXQ8aW50PiA+ICZub2RlTWFwKTsKLSAgICB2b2lkIGNoZWNrQ29ubmVjdGl2aXR5X25vZGVNYXBfcm91dGVPYmpTcGxpdF9oZWxwZXIoY29uc3QgZnJQb2ludCAmY3Jvc3NQdCwgCi0gICAgICAgICAgICAgICAgICAgZnJDb29yZCB0cmFja0Nvb3JkLCBmckNvb3JkIHNwbGl0Q29vcmQsIGZyTGF5ZXJOdW0gbE51bSwgCi0gICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjptYXA8ZnJDb29yZCwgc3RkOjptYXA8ZnJDb29yZCwgc3RkOjpwYWlyPGZyQ29vcmQsIGludD4gPiA+ID4gJm1lcmdlSGVscGVyLAotICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiwgc3RkOjpzZXQ8aW50PiA+ICZub2RlTWFwKTsKLSAgICB2b2lkIGNoZWNrQ29ubmVjdGl2aXR5X25vZGVNYXBfcGluKGZyTmV0KiBuZXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZnJDb25uRmlnKj4gJm5ldFJvdXRlT2JqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGZyQmxvY2tPYmplY3QqPiAmbmV0UGlucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGZyQmxvY2tPYmplY3QqLCBzdGQ6OnNldDxzdGQ6OnBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4gPiwgZnJCbG9ja09iamVjdENvbXA+ICZwaW4yZXBNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4sIHN0ZDo6c2V0PGludD4gPiAmbm9kZU1hcCk7Ci0gICAgYm9vbCBjaGVja0Nvbm5lY3Rpdml0eV9hc3Rhcihmck5ldCogbmV0LCBzdGQ6OnZlY3Rvcjxib29sPiAmYWRqVmlzaXRlZCwgc3RkOjp2ZWN0b3I8aW50PiAmYWRqUHJldklkeCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4sIHN0ZDo6c2V0PGludD4gPiAmbm9kZU1hcCwgaW50ICZnQ250LCBpbnQgJm5DbnQpOwotICAgIHZvaWQgY2hlY2tDb25uZWN0aXZpdHlfZmluYWwoZnJOZXQgKm5ldCwgc3RkOjp2ZWN0b3I8ZnJDb25uRmlnKj4gJm5ldFJvdXRlT2Jqcywgc3RkOjp2ZWN0b3I8ZnJCbG9ja09iamVjdCo+ICZuZXRQaW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Ym9vbD4gJmFkalZpc2l0ZWQsIGludCBnQ250LCBpbnQgbkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiwgc3RkOjpzZXQ8aW50PiA+ICZub2RlTWFwKTsKLSAgICB2b2lkIGluaXREUihpbnQgc2l6ZSwgYm9vbCBlbmFibGVEUkMgPSBmYWxzZSk7Ci0gICAgc3RkOjptYXA8ZnJOZXQqLCBzdGQ6OnNldDxzdGQ6OnBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4gPiwgZnJCbG9ja09iamVjdENvbXA+IGluaXREUl9tZXJnZUJvdW5kYXJ5UGluKGludCBpLCBpbnQgaiwgaW50IHNpemUsIGNvbnN0IGZyQm94ICZyb3V0ZUJveCk7Ci0gICAgdm9pZCBzZWFyY2hSZXBhaXIoaW50IGl0ZXIsIGludCBzaXplLCBpbnQgb2Zmc2V0LCBpbnQgbWF6ZUVuZEl0ZXIgPSAxLCBmclVJbnQ0IHdvcmtlckRSQ0Nvc3QgPSBEUkNDT1NULCBmclVJbnQ0IHdvcmtlck1hcmtlckNvc3QgPSBNQVJLRVJDT1NULCAKLSAgICAgICAgICAgICAgICAgICAgICBib29sIGVuYWJsZURSQyA9IGZhbHNlLCBpbnQgcmlwdXBNb2RlID0gMSwgYm9vbCBURVNUID0gZmFsc2UpOwotICAgIHZvaWQgZW5kKCk7Ci0gICAgdm9pZCByZXBvcnREUkMoKTsKLSAgfTsKLQotICBjbGFzcyBGbGV4RFJXb3JrZXI7Ci0gIGNsYXNzIEZsZXhEUldvcmtlclJlZ2lvblF1ZXJ5IHsKLSAgcHVibGljOgotICAgICAgRmxleERSV29ya2VyUmVnaW9uUXVlcnkoRmxleERSV29ya2VyKiBpbik6IGRyV29ya2VyKGluKSB7fQotICAgICAgZnJEZXNpZ24qIGdldERlc2lnbigpIGNvbnN0OwotICAgICAgRmxleERSV29ya2VyKiBnZXREUldvcmtlcigpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIGRyV29ya2VyOwotICAgICAgfQotICAgICAgdm9pZCBhZGQoZHJDb25uRmlnKiBjb25uRmlnKTsKLSAgICAgIHZvaWQgYWRkKGRyQ29ubkZpZyogY29ubkZpZywgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8cnFfcnB0cl92YWx1ZV90PGRyQ29ubkZpZz4gPiA+ICZhbGxTaGFwZXMpOwotICAgICAgdm9pZCByZW1vdmUoZHJDb25uRmlnKiBjb25uRmlnKTsKLSAgICAgIHZvaWQgcXVlcnkoY29uc3QgZnJCb3ggJmJveCwgZnJMYXllck51bSBsYXllck51bSwgc3RkOjp2ZWN0b3I8ZHJDb25uRmlnKj4gJnJlc3VsdCk7Ci0gICAgICB2b2lkIGluaXQoKTsKLSAgcHJvdGVjdGVkOgotICAgICAgRmxleERSV29ya2VyKiBkcldvcmtlcjsKLSAgICAgIHN0ZDo6dmVjdG9yPGJnaTo6cnRyZWU8cnFfcnB0cl92YWx1ZV90PGRyQ29ubkZpZz4sIGJnaTo6cXVhZHJhdGljPDE2PiA+ID4gc2hhcGVzOyAvLyBvbmx5IGZvciBkclhYWCBpbiBkciB3b3JrZXIKLSAgfTsKLQotICBjbGFzcyBGbGV4RFJNaW5BcmVhVmlvIHsKLSAgcHVibGljOgotICAgIC8vIGNvbnN0cnVjdG9ycwotICAgIEZsZXhEUk1pbkFyZWFWaW8oKSB7fQotICAgIEZsZXhEUk1pbkFyZWFWaW8oZHJOZXQqIG5ldEluLCBGbGV4TWF6ZUlkeCBicEluLCBGbGV4TWF6ZUlkeCBlcEluLCBmckNvb3JkIGdhcEFyZWFJbik6IG5ldChuZXRJbiksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwKGJwSW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwKGVwSW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhcEFyZWEoZ2FwQXJlYUluKSB7fQotICAgIC8vIHNldHRlcnMKLSAgICB2b2lkIHNldERSTmV0KGRyTmV0ICpuZXRJbikgewotICAgICAgbmV0ID0gbmV0SW47Ci0gICAgfQotICAgIHZvaWQgc2V0UG9pbnRzKEZsZXhNYXplSWR4IGJwSW4sIEZsZXhNYXplSWR4IGVwSW4pIHsKLSAgICAgIGJwID0gYnBJbjsKLSAgICAgIGVwID0gZXBJbjsKLSAgICB9Ci0gICAgdm9pZCBzZXRHYXBBcmVhKGZyQ29vcmQgZ2FwQXJlYUluKSB7Ci0gICAgICBnYXBBcmVhID0gZ2FwQXJlYUluOwotICAgIH0KLQotICAgIC8vIGdldHRlcnMKLSAgICBkck5ldCogZ2V0TmV0KCkgY29uc3QgewotICAgICAgcmV0dXJuIG5ldDsKLSAgICB9Ci0gICAgdm9pZCBnZXRQb2ludHMoRmxleE1hemVJZHggJmJwSW4sIEZsZXhNYXplSWR4ICZlcEluKSBjb25zdCB7Ci0gICAgICBicEluID0gYnA7Ci0gICAgICBlcEluID0gZXA7Ci0gICAgfQotICAgIGZyQ29vcmQgZ2V0R2FwQXJlYSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBnYXBBcmVhOwotICAgIH0KLQotICBwcm90ZWN0ZWQ6Ci0gICAgZHJOZXQgKm5ldDsKLSAgICBGbGV4TWF6ZUlkeCBicCwgZXA7Ci0gICAgZnJDb29yZCBnYXBBcmVhOwotICB9OwotCi0gIGNsYXNzIEZsZXhEUldvcmtlciB7Ci0gIHB1YmxpYzoKLSAgICAvLyBjb25zdHJ1Y3RvcnMKLSAgICBGbGV4RFJXb3JrZXIoZnJEZXNpZ24qIGRlc2lnbkluKTogZGVzaWduKGRlc2lnbkluKSwgcm91dGVCb3goKSwgZXh0Qm94KCksIGRySXRlcigwKSwgbWF6ZUVuZEl0ZXIoMSksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNUKGZhbHNlKSwgRFJDVEVTVChmYWxzZSksIGVuYWJsZURSQyh0cnVlKSwgcmlwdXBNb2RlKDEpLCB3b3JrZXJEUkNDb3N0KERSQ0NPU1QpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyTWFya2VyQ29zdChNQVJLRVJDT1NUKSwgYm91bmRhcnlQaW4oKSwgcGluQ250KDApLCBpbml0TnVtTWFya2VycygwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBTVmlhKCksIGZpeGVkT2JqcygpLCBwbGFuYXJIaXN0b3J5TWFya2VycygpLCB2aWFIaXN0b3J5TWFya2VycygpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0cygpLCBncmlkR3JhcGgoZGVzaWduSW4pLCBtYXJrZXJzKCksIHJxKHRoaXMpIHt9Ci0gICAgLy8gc2V0dGVycwotICAgIHZvaWQgc2V0Um91dGVCb3goY29uc3QgZnJCb3ggJmJveEluKSB7Ci0gICAgICByb3V0ZUJveC5zZXQoYm94SW4pOwotICAgIH0KLSAgICB2b2lkIHNldEV4dEJveChjb25zdCBmckJveCAmYm94SW4pIHsKLSAgICAgIGV4dEJveC5zZXQoYm94SW4pOwotICAgIH0KLSAgICB2b2lkIHNldERSSXRlcihpbnQgaW4pIHsKLSAgICAgIGRySXRlciA9IGluOwotICAgIH0KLSAgICB2b2lkIHNldERSSXRlcihpbnQgaW4sIHN0ZDo6bWFwPGZyTmV0Kiwgc3RkOjpzZXQ8c3RkOjpwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+ID4sIGZyQmxvY2tPYmplY3RDb21wPiAmYnApIHsKLSAgICAgIGRySXRlciA9IGluOwotICAgICAgYm91bmRhcnlQaW4gPSBzdGQ6Om1vdmUoYnApOwotICAgIH0KLSAgICB2b2lkIHNldE1hemVFbmRJdGVyKGludCBpbikgewotICAgICAgbWF6ZUVuZEl0ZXIgPSBpbjsKLSAgICB9Ci0gICAgdm9pZCBzZXRUZXN0KGJvb2wgaW4pIHsKLSAgICAgIFRFU1QgPSBpbjsKLSAgICB9Ci0gICAgdm9pZCBzZXREUkNUZXN0KGJvb2wgaW4pIHsKLSAgICAgIERSQ1RFU1QgPSBpbjsKLSAgICB9Ci0gICAgdm9pZCBzZXRFbmFibGVEUkMoYm9vbCBpbikgewotICAgICAgZW5hYmxlRFJDID0gaW47Ci0gICAgfQotICAgIHZvaWQgc2V0UmlwdXBNb2RlKGludCBpbikgewotICAgICAgcmlwdXBNb2RlID0gaW47Ci0gICAgfQotICAgIHZvaWQgc2V0Q29zdChmclVJbnQ0IGRyY0Nvc3RJbiwgZnJVSW50NCBtYXJrZXJDb3N0SW4pIHsKLSAgICAgIHdvcmtlckRSQ0Nvc3QgPSBkcmNDb3N0SW47Ci0gICAgICB3b3JrZXJNYXJrZXJDb3N0ID0gbWFya2VyQ29zdEluOwotICAgIH0KLSAgICAvL3ZvaWQgYWRkTWFya2VyKHN0ZDo6dW5pcXVlX3B0cjxmck1hcmtlcj4gJmluKSB7Ci0gICAgLy8gIGF1dG8gcnB0ciA9IGluLmdldCgpOwotICAgIC8vICBtYXJrZXJzLnB1c2hfYmFjayhzdGQ6Om1vdmUoaW4pKTsKLSAgICAvLyAgcnB0ci0+c2V0SXRlcigtLShtYXJrZXJzLmVuZCgpKSk7Ci0gICAgLy99Ci0gICAgLy92b2lkIHJlbW92ZU1hcmtlcihmck1hcmtlciogaW4pIHsKLSAgICAvLyAgbWFya2Vycy5lcmFzZShpbi0+Z2V0SXRlcigpKTsKLSAgICAvL30KLSAgICB2b2lkIHNldE1hcmtlcnMoc3RkOjp2ZWN0b3I8ZnJNYXJrZXI+ICZpbikgewotICAgICAgbWFya2Vycy5jbGVhcigpOwotICAgICAgZnJCb3ggYm94OwotICAgICAgZm9yIChhdXRvICZtYXJrZXI6IGluKSB7Ci0gICAgICAgIG1hcmtlci5nZXRCQm94KGJveCk7Ci0gICAgICAgIGlmIChnZXRSb3V0ZUJveCgpLm92ZXJsYXBzKGJveCkpIHsKLSAgICAgICAgICBtYXJrZXJzLnB1c2hfYmFjayhtYXJrZXIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHZvaWQgc2V0QmVzdE1hcmtlcnMoKSB7Ci0gICAgICBiZXN0TWFya2VycyA9IG1hcmtlcnM7Ci0gICAgfQotICAgIHZvaWQgY2xlYXJNYXJrZXJzKCkgewotICAgICAgbWFya2Vycy5jbGVhcigpOwotICAgIH0KLSAgICB2b2lkIHNldEluaXROdW1NYXJrZXJzKGludCBpbikgewotICAgICAgaW5pdE51bU1hcmtlcnMgPSBpbjsKLSAgICB9Ci0KLSAgICAvLyBnZXR0ZXJzCi0gICAgZnJUZWNoT2JqZWN0KiBnZXRUZWNoKCkgY29uc3QgewotICAgICAgcmV0dXJuIGRlc2lnbi0+Z2V0VGVjaCgpOwotICAgIH0KLSAgICBmckRlc2lnbiogZ2V0RGVzaWduKCkgY29uc3QgewotICAgICAgcmV0dXJuIGRlc2lnbjsKLSAgICB9Ci0gICAgdm9pZCBnZXRSb3V0ZUJveChmckJveCAmYm94SW4pIGNvbnN0IHsKLSAgICAgIGJveEluLnNldChyb3V0ZUJveCk7Ci0gICAgfQotICAgIGNvbnN0IGZyQm94JiBnZXRSb3V0ZUJveCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiByb3V0ZUJveDsKLSAgICB9Ci0gICAgZnJCb3gmIGdldFJvdXRlQm94KCkgewotICAgICAgcmV0dXJuIHJvdXRlQm94OwotICAgIH0KLSAgICB2b2lkIGdldEV4dEJveChmckJveCAmYm94SW4pIGNvbnN0IHsKLSAgICAgIGJveEluLnNldChleHRCb3gpOwotICAgIH0KLSAgICBjb25zdCBmckJveCYgZ2V0RXh0Qm94KCkgY29uc3QgewotICAgICAgcmV0dXJuIGV4dEJveDsKLSAgICB9Ci0gICAgZnJCb3gmIGdldEV4dEJveCgpIHsKLSAgICAgIHJldHVybiBleHRCb3g7Ci0gICAgfQotICAgIGZyUmVnaW9uUXVlcnkqIGdldFJlZ2lvblF1ZXJ5KCkgY29uc3QgewotICAgICAgcmV0dXJuIGRlc2lnbi0+Z2V0UmVnaW9uUXVlcnkoKTsKLSAgICB9Ci0gICAgYm9vbCBpc0luaXREUigpIGNvbnN0IHsKLSAgICAgIHJldHVybiAoZHJJdGVyID09IDApOwotICAgIH0KLSAgICBpbnQgZ2V0RFJJdGVyKCkgY29uc3QgewotICAgICAgcmV0dXJuIGRySXRlcjsKLSAgICB9Ci0gICAgYm9vbCBpc0VuYWJsZURSQygpIGNvbnN0IHsKLSAgICAgIHJldHVybiBlbmFibGVEUkM7Ci0gICAgfQotICAgIGludCBnZXRSaXB1cE1vZGUoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gcmlwdXBNb2RlOwotICAgIH0KLSAgICAvL2NvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxmck1hcmtlcj4gPiYgZ2V0TWFya2VycygpIGNvbnN0IHsKLSAgICAvLyAgcmV0dXJuIG1hcmtlcnM7Ci0gICAgLy99Ci0gICAgLy9zdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZnJNYXJrZXI+ID4mIGdldE1hcmtlcnMoKSB7Ci0gICAgLy8gIHJldHVybiBtYXJrZXJzOwotICAgIC8vfQotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxkck5ldD4gPiYgZ2V0TmV0cygpIGNvbnN0IHsKLSAgICAgIHJldHVybiBuZXRzOwotICAgIH0KLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZHJOZXQ+ID4mIGdldE5ldHMoKSB7Ci0gICAgICByZXR1cm4gbmV0czsKLSAgICB9Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8ZnJNYXJrZXI+JiBnZXRNYXJrZXJzKCkgY29uc3QgewotICAgICAgcmV0dXJuIG1hcmtlcnM7Ci0gICAgfQotICAgIHN0ZDo6dmVjdG9yPGZyTWFya2VyPiYgZ2V0TWFya2VycygpIHsKLSAgICAgIHJldHVybiBtYXJrZXJzOwotICAgIH0KLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjxmck1hcmtlcj4mIGdldEJlc3RNYXJrZXJzKCkgY29uc3QgewotICAgICAgcmV0dXJuIGJlc3RNYXJrZXJzOwotICAgIH0KLSAgICBzdGQ6OnZlY3Rvcjxmck1hcmtlcj4mIGdldEJlc3RNYXJrZXJzKCkgewotICAgICAgcmV0dXJuIGJlc3RNYXJrZXJzOwotICAgIH0KLSAgICBjb25zdCBGbGV4RFJXb3JrZXJSZWdpb25RdWVyeSYgZ2V0V29ya2VyUmVnaW9uUXVlcnkoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gcnE7Ci0gICAgfQotICAgIEZsZXhEUldvcmtlclJlZ2lvblF1ZXJ5JiBnZXRXb3JrZXJSZWdpb25RdWVyeSgpIHsKLSAgICAgIHJldHVybiBycTsKLSAgICB9Ci0gICAgaW50IGdldEluaXROdW1NYXJrZXJzKCkgY29uc3QgewotICAgICAgcmV0dXJuIGluaXROdW1NYXJrZXJzOwotICAgIH0KLSAgICBpbnQgZ2V0TnVtTWFya2VycygpIGNvbnN0IHsKLSAgICAgIHJldHVybiBtYXJrZXJzLnNpemUoKTsKLSAgICB9Ci0KLSAgICAvLyBvdGhlcnMKLSAgICBpbnQgbWFpbigpOwotICAgIC8vIG90aGVycwotICAgIGludCBnZXROdW1RdWlja01hcmtlcnMoKTsKLSAgICAKLSAgcHJvdGVjdGVkOgotICAgIGZyRGVzaWduKiBkZXNpZ247Ci0gICAgZnJCb3ggICAgIHJvdXRlQm94OwotICAgIGZyQm94ICAgICBleHRCb3g7Ci0gICAgaW50ICAgICAgIGRySXRlcjsKLSAgICBpbnQgICAgICAgbWF6ZUVuZEl0ZXI7Ci0gICAgYm9vbCAgICAgIFRFU1QsIERSQ1RFU1Q7Ci0gICAgYm9vbCAgICAgIGVuYWJsZURSQzsKLSAgICBpbnQgICAgICAgcmlwdXBNb2RlOwotICAgIGZyVUludDQgICB3b3JrZXJEUkNDb3N0LCB3b3JrZXJNYXJrZXJDb3N0OwotICAgIHN0ZDo6bWFwPGZyTmV0Kiwgc3RkOjpzZXQ8c3RkOjpwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+ID4sIGZyQmxvY2tPYmplY3RDb21wPiBib3VuZGFyeVBpbjsKLSAgICBpbnQgICAgICAgcGluQ250OwotICAgIGludCAgICAgICBpbml0TnVtTWFya2VyczsKLSAgICBzdGQ6Om1hcDxGbGV4TWF6ZUlkeCwgZHJBY2Nlc3NQYXR0ZXJuKj4gYXBTVmlhOwotICAgIHN0ZDo6dmVjdG9yPGZyQmxvY2tPYmplY3QqPiAgICAgICAgICAgICBmaXhlZE9ianM7Ci0gICAgc3RkOjpzZXQ8RmxleE1hemVJZHg+ICAgICAgICAgICAgICAgICAgIHBsYW5hckhpc3RvcnlNYXJrZXJzOwotICAgIHN0ZDo6c2V0PEZsZXhNYXplSWR4PiAgICAgICAgICAgICAgICAgICB2aWFIaXN0b3J5TWFya2VyczsKLSAgICBzdGQ6OnZlY3RvcjxGbGV4RFJNaW5BcmVhVmlvPiAgICAgICAgICAgbWluQXJlYVZpb3M7Ci0KLSAgICAvLyBsb2NhbCBzdG9yYWdlCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGRyTmV0PiA+ICAgIG5ldHM7Ci0gICAgRmxleEdyaWRHcmFwaCAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyaWRHcmFwaDsKLSAgICAvL3N0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxmck1hcmtlcj4gPiBtYXJrZXJzOwotICAgIHN0ZDo6dmVjdG9yPGZyTWFya2VyPiAgICAgICAgICAgICAgICAgICBtYXJrZXJzOwotICAgIHN0ZDo6dmVjdG9yPGZyTWFya2VyPiAgICAgICAgICAgICAgICAgICBiZXN0TWFya2VyczsKLSAgICBGbGV4RFJXb3JrZXJSZWdpb25RdWVyeSAgICAgICAgICAgICAgICAgcnE7Ci0KLSAgICAvLyBpbml0Ci0gICAgdm9pZCBpbml0KCk7Ci0gICAgdm9pZCBpbml0TmV0cygpOwotICAgIHZvaWQgaW5pdE5ldE9ianMoc3RkOjpzZXQ8ZnJOZXQqLCBmckJsb2NrT2JqZWN0Q29tcD4gJm5ldHMsIAotICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8ZnJOZXQqLCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZHJDb25uRmlnPiA+LCBmckJsb2NrT2JqZWN0Q29tcD4gJm5ldFJvdXRlT2JqcywKLSAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGZyTmV0Kiwgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGRyQ29ubkZpZz4gPiwgZnJCbG9ja09iamVjdENvbXA+ICZuZXRFeHRPYmpzKTsKLSAgICB2b2lkIGluaXROZXRPYmpzX3BhdGhTZWcoZnJQYXRoU2VnKiBwYXRoU2VnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxmck5ldCosIGZyQmxvY2tPYmplY3RDb21wPiAmbmV0cywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGZyTmV0Kiwgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGRyQ29ubkZpZz4gPiwgZnJCbG9ja09iamVjdENvbXA+ICZuZXRSb3V0ZU9ianMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGZyTmV0Kiwgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGRyQ29ubkZpZz4gPiwgZnJCbG9ja09iamVjdENvbXA+ICZuZXRFeHRPYmpzKTsKLSAgICB2b2lkIGluaXROZXRPYmpzX3ZpYShmclZpYSogdmlhLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PGZyTmV0KiwgZnJCbG9ja09iamVjdENvbXA+ICZuZXRzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxmck5ldCosIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxkckNvbm5GaWc+ID4sIGZyQmxvY2tPYmplY3RDb21wPiAmbmV0Um91dGVPYmpzLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGZyTmV0Kiwgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGRyQ29ubkZpZz4gPiwgZnJCbG9ja09iamVjdENvbXA+ICZuZXRFeHRPYmpzKTsKLSAgICB2b2lkIGluaXROZXRPYmpzX3BhdGNoV2lyZShmclBhdGNoV2lyZSogcHdpcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8ZnJOZXQqLCBmckJsb2NrT2JqZWN0Q29tcD4gJm5ldHMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGZyTmV0Kiwgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGRyQ29ubkZpZz4gPiwgZnJCbG9ja09iamVjdENvbXA+ICZuZXRSb3V0ZU9ianMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8ZnJOZXQqLCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZHJDb25uRmlnPiA+LCBmckJsb2NrT2JqZWN0Q29tcD4gJm5ldEV4dE9ianMpOwotICAgIHZvaWQgaW5pdE5ldHNfaW5pdERSKHN0ZDo6c2V0PGZyTmV0KiwgZnJCbG9ja09iamVjdENvbXA+ICZuZXRzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxmck5ldCosIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxkckNvbm5GaWc+ID4sIGZyQmxvY2tPYmplY3RDb21wPiAmbmV0Um91dGVPYmpzLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGZyTmV0Kiwgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGRyQ29ubkZpZz4gPiwgZnJCbG9ja09iamVjdENvbXA+ICZuZXRFeHRPYmpzKTsKLSAgICB2b2lkIGluaXROZXRzX3NlYXJjaFJlcGFpcihzdGQ6OnNldDxmck5ldCosIGZyQmxvY2tPYmplY3RDb21wPiAmbmV0cywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8ZnJOZXQqLCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZHJDb25uRmlnPiA+LCBmckJsb2NrT2JqZWN0Q29tcD4gJm5ldFJvdXRlT2JqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxmck5ldCosIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxkckNvbm5GaWc+ID4sIGZyQmxvY2tPYmplY3RDb21wPiAmbmV0RXh0T2Jqcyk7Ci0gICAgdm9pZCBpbml0TmV0c19zZWFyY2hSZXBhaXJfcGluMmVwTWFwKGZyTmV0KiBuZXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZHJDb25uRmlnPiA+ICZuZXRSb3V0ZU9ianMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGRyQ29ubkZpZz4gPiAmbmV0RXh0T2JqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZnJCbG9ja09iamVjdCo+ICZuZXRQaW5zLCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGZyQmxvY2tPYmplY3QqLCBzdGQ6OnNldDxzdGQ6OnBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4gPiwgZnJCbG9ja09iamVjdENvbXA+ICZwaW4yZXBNYXAvKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+LCBzdGQ6OnNldDxpbnQ+ID4gJm5vZGVNYXAqLyk7Ci0KLSAgICB2b2lkIGluaXROZXRzX3NlYXJjaFJlcGFpcl9waW4yZXBNYXBfaGVscGVyKGZyTmV0KiBuZXQsIGNvbnN0IGZyUG9pbnQgJmJwLCBmckxheWVyTnVtIGxOdW0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8ZnJCbG9ja09iamVjdCosIHN0ZDo6c2V0PHN0ZDo6cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiA+LCBmckJsb2NrT2JqZWN0Q29tcD4gJnBpbjJlcE1hcCk7Ci0gICAgdm9pZCBpbml0TmV0c19zZWFyY2hSZXBhaXJfbm9kZU1hcChmck5ldCogbmV0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxkckNvbm5GaWc+ID4gJm5ldFJvdXRlT2JqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGZyQmxvY2tPYmplY3QqPiAmbmV0UGlucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGZyQmxvY2tPYmplY3QqLCBzdGQ6OnNldDxzdGQ6OnBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4gPiwgZnJCbG9ja09iamVjdENvbXA+ICZwaW4yZXBNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4sIHN0ZDo6c2V0PGludD4gPiAmbm9kZU1hcCk7Ci0KLSAgICB2b2lkIGluaXROZXRzX3NlYXJjaFJlcGFpcl9ub2RlTWFwX3JvdXRlT2JqRW5kKGZyTmV0KiBuZXQsIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxkckNvbm5GaWc+ID4gJm5ldFJvdXRlT2JqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiwgc3RkOjpzZXQ8aW50PiA+ICZub2RlTWFwKTsKLSAgICB2b2lkIGluaXROZXRzX3NlYXJjaFJlcGFpcl9ub2RlTWFwX3JvdXRlT2JqU3BsaXQoZnJOZXQqIG5ldCwgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGRyQ29ubkZpZz4gPiAmbmV0Um91dGVPYmpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4sIHN0ZDo6c2V0PGludD4gPiAmbm9kZU1hcCk7Ci0gICAgdm9pZCBpbml0TmV0c19zZWFyY2hSZXBhaXJfbm9kZU1hcF9yb3V0ZU9ialNwbGl0X2hlbHBlcihjb25zdCBmclBvaW50ICZjcm9zc1B0LCAKLSAgICAgICAgICAgICAgICAgICBmckNvb3JkIHRyYWNrQ29vcmQsIGZyQ29vcmQgc3BsaXRDb29yZCwgZnJMYXllck51bSBsTnVtLCAKLSAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6Om1hcDxmckNvb3JkLCBzdGQ6Om1hcDxmckNvb3JkLCBzdGQ6OnBhaXI8ZnJDb29yZCwgaW50PiA+ID4gPiAmbWVyZ2VIZWxwZXIsCi0gICAgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+LCBzdGQ6OnNldDxpbnQ+ID4gJm5vZGVNYXApOwotICAgIHZvaWQgaW5pdE5ldHNfc2VhcmNoUmVwYWlyX25vZGVNYXBfcGluKGZyTmV0KiBuZXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxkckNvbm5GaWc+ID4gJm5ldFJvdXRlT2JqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxmckJsb2NrT2JqZWN0Kj4gJm5ldFBpbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8ZnJCbG9ja09iamVjdCosIHN0ZDo6c2V0PHN0ZDo6cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiA+LCBmckJsb2NrT2JqZWN0Q29tcD4gJnBpbjJlcE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4sIHN0ZDo6c2V0PGludD4gPiAmbm9kZU1hcCk7Ci0gICAgdm9pZCBpbml0TmV0c19zZWFyY2hSZXBhaXJfY29ubkNvbXAoZnJOZXQqIG5ldCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+LCBzdGQ6OnNldDxpbnQ+ID4gJm5vZGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAmY29tcElkeCk7Ci0KLQotCi0gICAgdm9pZCBpbml0TmV0KGZyTmV0KiBuZXQsIAotICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZHJDb25uRmlnPiA+ICZyb3V0ZU9ianMsCi0gICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxkckNvbm5GaWc+ID4gJmV4dE9ianMsCi0gICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGZyQmxvY2tPYmplY3QqPiAmdGVybXMpOwotICAgIHZvaWQgaW5pdE5ldF90ZXJtKGRyTmV0KiBkTmV0LCBzdGQ6OnZlY3RvcjxmckJsb2NrT2JqZWN0Kj4gJnRlcm1zKTsKLSAgICB2b2lkIGluaXROZXRfdGVybUdlbkFwKGRyUGluKiBkUGluKTsKLSAgICB2b2lkIGdldFRyYWNrTG9jcyhib29sIGlzSG9yelRyYWNrcywgZnJMYXllck51bSBjdXJyTGF5ZXJOdW0sIGZyQ29vcmQgbG93LCBmckNvb3JkIGhpZ2gsIHN0ZDo6c2V0PGZyQ29vcmQ+ICZ0cmFja0xvY3MpOwotICAgIHZvaWQgaW5pdE5ldF9ib3VuZGFyeShkck5ldCogbmV0LCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZHJDb25uRmlnPiA+ICZleHRPYmpzKTsKLSAgICB2b2lkIGluaXROZXRzX3JlZ2lvblF1ZXJ5KCk7Ci0gICAgdm9pZCBpbml0TmV0c19udW1QaW5zSW4oKTsKLQotICAgIHZvaWQgaW5pdEdyaWRHcmFwaCgpOwotICAgIHZvaWQgaW5pdFRyYWNrQ29vcmRzKHN0ZDo6bWFwPGZyQ29vcmQsIHN0ZDo6bWFwPGZyTGF5ZXJOdW0sIGZyVHJhY2tQYXR0ZXJuKj4gPiAmeE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxmckNvb3JkLCBzdGQ6Om1hcDxmckxheWVyTnVtLCBmclRyYWNrUGF0dGVybio+ID4gJnlNYXApOwotICAgIHZvaWQgaW5pdFRyYWNrQ29vcmRzX3JvdXRlKGRyTmV0KiBuZXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGZyQ29vcmQsIHN0ZDo6bWFwPGZyTGF5ZXJOdW0sIGZyVHJhY2tQYXR0ZXJuKj4gPiAmeE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxmckNvb3JkLCBzdGQ6Om1hcDxmckxheWVyTnVtLCBmclRyYWNrUGF0dGVybio+ID4gJnlNYXApOwotICAgIHZvaWQgaW5pdFRyYWNrQ29vcmRzX3Bpbihkck5ldCogbmV0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8ZnJDb29yZCwgc3RkOjptYXA8ZnJMYXllck51bSwgZnJUcmFja1BhdHRlcm4qPiA+ICZ4TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxmckNvb3JkLCBzdGQ6Om1hcDxmckxheWVyTnVtLCBmclRyYWNrUGF0dGVybio+ID4gJnlNYXApOwotICAgIHZvaWQgaW5pdE1hemVJZHgoKTsKLSAgICB2b2lkIGluaXRNYXplSWR4X2Nvbm5GaWcoZHJDb25uRmlnICpjb25uRmlnKTsKLSAgICB2b2lkIGluaXRNYXplSWR4X2FwKGRyQWNjZXNzUGF0dGVybiAqYXApOwotICAgIHZvaWQgaW5pdE1hemVDb3N0KCk7Ci0gICAgdm9pZCBpbml0TWF6ZUNvc3RfY29ubkZpZygpOwotICAgIHZvaWQgaW5pdE1hemVDb3N0X3BpbigpOwotICAgIHZvaWQgaW5pdE1hemVDb3N0X3Bpbl9oZWxwZXIoY29uc3QgZnJCb3ggJmJveCwgZnJDb29yZCBibG9hdERpc3QsIGZyTUlkeCB6SWR4KTsKLSAgICB2b2lkIGluaXRNYXplQ29zdF9hcCgpOyAvLyBkaXNhYmxlIG1hemUgZWRnZQotICAgIHZvaWQgaW5pdE1hemVDb3N0X21hcmtlcigpOwotICAgIC8vdm9pZCBpbml0TWF6ZUNvc3RfdmlhKCk7Ci0gICAgdm9pZCBpbml0TWF6ZUNvc3RfdmlhX2hlbHBlcihkck5ldCogbmV0LCBib29sIGlzQWRkUGF0aENvc3QpOwotICAgIHZvaWQgaW5pdE1hemVDb3N0X2FwX2hlbHBlcihkck5ldCogbmV0LCBib29sIGlzQWRkUGF0aENvc3QpOwotICAgIHZvaWQgaW5pdE1hemVDb3N0X2JvdW5kYXJ5X2hlbHBlcihkck5ldCogbmV0LCBib29sIGlzQWRkUGF0aENvc3QpOwotICAgIHZvaWQgYWRkVG9Db3N0R3JpZHMoY29uc3QgUmVjdGFuZ2xlICZyZWdpb24sIHN0ZDo6c2V0PHN0ZDo6cGFpcjxmck1JZHgsIGZyTUlkeD4gPiAmY29zdEdyaWRzKTsKLQotICAgIC8vIERSQwotICAgIHZvaWQgaW5pdEZpeGVkT2JqcygpOwotICAgIHZvaWQgaW5pdE1hcmtlcnMoKTsKLQotICAgIC8vIHJvdXRlCi0gICAgdm9pZCByb3V0ZSgpOwotICAgIHZvaWQgYWRkUGF0aENvc3QoZHJDb25uRmlnICpjb25uRmlnKTsKLSAgICB2b2lkIHN1YlBhdGhDb3N0KGRyQ29ubkZpZyAqY29ubkZpZyk7Ci0gICAgLyppbmxpbmUqLyB2b2lkIG1vZFBhdGhDb3N0KGRyQ29ubkZpZyAqY29ubkZpZywgYm9vbCBpc0FkZFBhdGhDb3N0KTsKLSAgICAvLyBtaW5TcGMKLSAgICAvKmlubGluZSovIHZvaWQgbW9kTWluU3BhY2luZ0Nvc3QoZHJOZXQqIG5ldCwgY29uc3QgZnJCb3ggJmJveCwgZnJNSWR4IHosIGJvb2wgaXNBZGRQYXRoQ29zdCwgYm9vbCBpc0N1cnJQcyk7Ci0gICAgLyppbmxpbmUqLyB2b2lkIG1vZE1pblNwYWNpbmdDb3N0UGxhbmVyKGRyTmV0KiBuZXQsIGNvbnN0IGZyQm94ICZib3gsIGZyTUlkeCB6LCBib29sIGlzQWRkUGF0aENvc3QpOwotICAgIC8qaW5saW5lKi8gdm9pZCBtb2RNaW5TcGFjaW5nQ29zdFZpYShjb25zdCBmckJveCAmYm94LCBmck1JZHggeiwgYm9vbCBpc0FkZFBhdGhDb3N0LCBib29sIGlzVXBwZXJWaWEsIGJvb2wgaXNDdXJyUHMpOwotICAgIGlubGluZSBmckNvb3JkIHB0MmJveERpc3RTcXVhcmUoY29uc3QgZnJQb2ludCAmcHQsIGNvbnN0IGZyQm94ICZib3gpOwotICAgIGlubGluZSBmckNvb3JkIGJveDJib3hEaXN0U3F1YXJlKGNvbnN0IGZyQm94ICZib3gxLCBjb25zdCBmckJveCAmYm94MiwgZnJDb29yZCAmZHgsIGZyQ29vcmQgJmR5KTsKLSAgICAvKmlubGluZSovIHZvaWQgbW9kTWluU3BhY2luZ0Nvc3RWaWFfZW9sKGNvbnN0IGZyQm94ICZib3gsIGNvbnN0IGZyQm94ICZ0bXBCeCwgYm9vbCBpc0FkZFBhdGhDb3N0LCBib29sIGlzVXBwZXJWaWEsIGZyTUlkeCBpLCBmck1JZHggaiwgZnJNSWR4IHopOwotICAgIC8qaW5saW5lKi8gdm9pZCBtb2RNaW5TcGFjaW5nQ29zdFZpYV9lb2xfaGVscGVyKGNvbnN0IGZyQm94ICZib3gsIGNvbnN0IGZyQm94ICZ0ZXN0Qm94LCBib29sIGlzQWRkUGF0aENvc3QsIGJvb2wgaXNVcHBlclZpYSwgZnJNSWR4IGksIGZyTUlkeCBqLCBmck1JZHggeik7Ci0gICAgLy8gZW9sU3BjCi0gICAgLyppbmxpbmUqLyB2b2lkIG1vZEVvbFNwYWNpbmdDb3N0X2hlbHBlcihjb25zdCBmckJveCAmdGVzdGJveCwgZnJNSWR4IHosIGJvb2wgaXNBZGRQYXRoQ29zdCwgaW50IHR5cGUpOwotICAgIC8qaW5saW5lKi8gdm9pZCBtb2RFb2xTcGFjaW5nQ29zdChjb25zdCBmckJveCAmYm94LCBmck1JZHggeiwgYm9vbCBpc0FkZFBhdGhDb3N0KTsKLSAgICAvLyBjdXRTcGMKLSAgICAvKmlubGluZSovIHZvaWQgbW9kQ3V0U3BhY2luZ0Nvc3QoY29uc3QgZnJCb3ggJmJveCwgZnJNSWR4IHosIGJvb2wgaXNBZGRQYXRoQ29zdCk7Ci0KLSAgICB2b2lkIG1hemVJdGVySW5pdChzdGQ6OnZlY3Rvcjxkck5ldCo+ICZyZXJvdXRlTmV0cyk7Ci0gICAgdm9pZCBtYXplSXRlckluaXRfaW5pdERSKHN0ZDo6dmVjdG9yPGRyTmV0Kj4gJnJlcm91dGVOZXRzKTsKLSAgICB2b2lkIG1hemVJdGVySW5pdF9zb3J0UmVyb3V0ZU5ldHMoc3RkOjp2ZWN0b3I8ZHJOZXQqPiAmcmVyb3V0ZU5ldHMpOwotICAgIHZvaWQgbWF6ZUl0ZXJJbml0X3NlYXJjaFJlcGFpcihzdGQ6OnZlY3Rvcjxkck5ldCo+ICZyZXJvdXRlTmV0cyk7Ci0KLSAgICB2b2lkIG1hemVOZXRJbml0KGRyTmV0KiBuZXQpOwotICAgIHZvaWQgbWF6ZU5ldEVuZChkck5ldCogbmV0KTsKLSAgICBib29sIHJvdXRlTmV0KGRyTmV0KiBuZXQpOwotICAgIHZvaWQgcm91dGVOZXRfcHJlcChkck5ldCogbmV0LCBzdGQ6OnNldDxkclBpbiosIGZyQmxvY2tPYmplY3RDb21wPiAmcGlucywgCi0gICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPEZsZXhNYXplSWR4LCBzdGQ6OnNldDxkclBpbiosIGZyQmxvY2tPYmplY3RDb21wPiA+ICZtYXplSWR4MnVuQ29ublBpbnMpOwotICAgIHZvaWQgcm91dGVOZXRfc2V0U3JjKHN0ZDo6c2V0PGRyUGluKiwgZnJCbG9ja09iamVjdENvbXA+ICZ1bkNvbm5QaW5zLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxGbGV4TWF6ZUlkeCwgc3RkOjpzZXQ8ZHJQaW4qLCBmckJsb2NrT2JqZWN0Q29tcD4gPiAmbWF6ZUlkeDJ1bkNvbm5QaW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEZsZXhNYXplSWR4PiAmY29ubkNvbXBzLCBGbGV4TWF6ZUlkeCAmY2NNYXplSWR4MSwgRmxleE1hemVJZHggJmNjTWF6ZUlkeDIpOwotICAgIHZvaWQgbWF6ZVBpbkluaXQoKTsKLSAgICBkclBpbiogcm91dGVOZXRfZ2V0TmV4dERzdChGbGV4TWF6ZUlkeCAmY2NNYXplSWR4MSwgRmxleE1hemVJZHggJmNjTWF6ZUlkeDIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPEZsZXhNYXplSWR4LCBzdGQ6OnNldDxkclBpbiosIGZyQmxvY2tPYmplY3RDb21wPiA+ICZtYXplSWR4MnVuQ29ublBpbnMpOwotICAgIHZvaWQgICAgICAgIHJvdXRlTmV0X3Bvc3RBc3RhclVwZGF0ZShzdGQ6OnZlY3RvcjxGbGV4TWF6ZUlkeD4gJnBhdGgsIHN0ZDo6dmVjdG9yPEZsZXhNYXplSWR4PiAmY29ubkNvbXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxkclBpbiosIGZyQmxvY2tPYmplY3RDb21wPiAmdW5Db25uUGlucywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPEZsZXhNYXplSWR4LCBzdGQ6OnNldDxkclBpbiosIGZyQmxvY2tPYmplY3RDb21wPiA+ICZtYXplSWR4MnVuQ29ublBpbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNGaXJzdENvbm4pOwotICAgIHZvaWQgICAgICAgIHJvdXRlTmV0X3Bvc3RBc3RhcldyaXRlUGF0aChkck5ldCogbmV0LCBzdGQ6OnZlY3RvcjxGbGV4TWF6ZUlkeD4gJnBvaW50cyk7Ci0gICAgdm9pZCAgICAgICAgcm91dGVOZXRfcG9zdEFzdGFyUGF0Y2hNaW5BcmVhVmlvKGRyTmV0KiBuZXQsIGNvbnN0IHN0ZDo6dmVjdG9yPEZsZXhNYXplSWR4PiAmcGF0aCk7Ci0gICAgdm9pZCAgICAgICAgcm91dGVOZXRfcG9zdEFzdGFyQWRkUGF0Y2hNZXRhbChkck5ldCogbmV0LCBjb25zdCBGbGV4TWF6ZUlkeCBicElkeCwgY29uc3QgRmxleE1hemVJZHggZXBJZHgsIGNvbnN0IGZyQ29vcmQgZ2FwQXJlYSwgY29uc3QgZnJDb29yZCBwYXRjaFdpZHRoKTsKLSAgICB2b2lkICAgICAgICByb3V0ZU5ldF9wb3N0Um91dGVBZGRQYXRoQ29zdChkck5ldCogbmV0KTsKLSAgICB2b2lkICAgICAgICByb3V0ZU5ldF9wb3N0Um91dGVBZGRQYXRjaE1ldGFsQ29zdChkck5ldCogbmV0KTsKLQotICAgIC8vIGRyYwotICAgIHZvaWQgcm91dGVfZHJjKCk7Ci0gICAgdm9pZCByb3V0ZV9wb3N0Um91dGVWaWFTd2FwKCk7Ci0KLSAgICAvLyBlbmQKLSAgICB2b2lkIGVuZCgpOwotICAgIHZvaWQgZW5kR2V0TW9kTmV0cyhzdGQ6OnNldDxmck5ldCosIGZyQmxvY2tPYmplY3RDb21wPiAmbW9kTmV0cyk7Ci0gICAgdm9pZCBlbmRSZW1vdmVOZXRzKHN0ZDo6c2V0PGZyTmV0KiwgZnJCbG9ja09iamVjdENvbXA+ICZtb2ROZXRzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8ZnJOZXQqLCBzdGQ6OnNldDxzdGQ6OnBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4gPiwgZnJCbG9ja09iamVjdENvbXA+ICZib3VuZFB0cyk7Ci0gICAgdm9pZCBlbmRSZW1vdmVOZXRzX3BhdGhTZWcoZnJQYXRoU2VnKiBwYXRoU2VnLCBzdGQ6OnNldDxzdGQ6OnBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4gPiAmYm91bmRQdHMpOwotICAgIC8vdm9pZCBlbmRSZW1vdmVOZXRzKHN0ZDo6c2V0PGZyTmV0Kj4gJm1vZE5ldHMpOwotICAgIC8vdm9pZCBlbmRSZW1vdmVOZXRzX3BhdGhTZWcoZnJQYXRoU2VnKiBwYXRoU2VnKTsKLSAgICB2b2lkIGVuZFJlbW92ZU5ldHNfdmlhKGZyVmlhKiB2aWEpOwotICAgIHZvaWQgZW5kUmVtb3ZlTmV0c19wYXRjaFdpcmUoZnJQYXRjaFdpcmUqIHB3aXJlKTsKLSAgICB2b2lkIGVuZEFkZE5ldHMoc3RkOjptYXA8ZnJOZXQqLCBzdGQ6OnNldDxzdGQ6OnBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4gPiwgZnJCbG9ja09iamVjdENvbXA+ICZib3VuZFB0cyk7Ci0gICAgdm9pZCBlbmRBZGROZXRzX3BhdGhTZWcoZHJQYXRoU2VnKiBwYXRoU2VnKTsKLSAgICAvL3ZvaWQgZW5kQWRkTmV0cygpOwotICAgIC8vdm9pZCBlbmRBZGROZXRzX3BhdGhTZWcoZHJQYXRoU2VnKiBwYXRoU2VnKTsKLSAgICB2b2lkIGVuZEFkZE5ldHNfdmlhKGRyVmlhKiB2aWEpOwotICAgIHZvaWQgZW5kQWRkTmV0c19wYXRjaFdpcmUoZHJQYXRjaFdpcmUqIHB3aXJlKTsKLSAgICB2b2lkIGVuZEFkZE5ldHNfbWVyZ2UoZnJOZXQqIG5ldCwgc3RkOjpzZXQ8c3RkOjpwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+ID4gJmJvdW5kUHRzKTsKLQotICAgIHZvaWQgZW5kUmVtb3ZlTWFya2VycygpOwotICAgIHZvaWQgZW5kQWRkTWFya2VycygpOwotCi0gIH07Ci0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kci9GbGV4RFJfY29ubi5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kci9GbGV4RFJfY29ubi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZjJjYjMuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZHIvRmxleERSX2Nvbm4uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjI1ICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJkci9GbGV4RFIuaCIKLSNpbmNsdWRlICJpby9pby5oIgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIGZyOwotCi0vLyBjb3BpZWQgZnJvbSBGbGV4RFJXb3JrZXI6OmluaXROZXRzX3NlYXJjaFJlcGFpcl9waW4yZXBNYXBfaGVscGVyCi12b2lkIEZsZXhEUjo6Y2hlY2tDb25uZWN0aXZpdHlfcGluMmVwTWFwX2hlbHBlcihmck5ldCAqbmV0LCBjb25zdCBmclBvaW50ICZicCwgZnJMYXllck51bSBsTnVtLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxmckJsb2NrT2JqZWN0Kiwgc2V0PHBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4gPiwgZnJCbG9ja09iamVjdENvbXA+ICZwaW4yZXBNYXApIHsKLSAgYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIGF1dG8gcmVnaW9uUXVlcnkgPSBnZXRSZWdpb25RdWVyeSgpOwotICB2ZWN0b3I8cnFfcnB0cl92YWx1ZV90PGZyQmxvY2tPYmplY3Q+ID4gcmVzdWx0OwotICAvL3Jlc3VsdC5jbGVhcigpOwotICByZWdpb25RdWVyeS0+cXVlcnkoZnJCb3goYnAsIGJwKSwgbE51bSwgcmVzdWx0KTsKLSAgZm9yIChhdXRvICZbYngsIHJxT2JqXTogcmVzdWx0KSB7Ci0gICAgaWYgKHJxT2JqLT50eXBlSWQoKSA9PSBmcmNJbnN0VGVybSkgewotICAgICAgYXV0byBpbnN0VGVybSA9IHN0YXRpY19jYXN0PGZySW5zdFRlcm0qPihycU9iaik7Ci0gICAgICBpZiAoaW5zdFRlcm0tPmdldE5ldCgpID09IG5ldCkgewotICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgY291dCA8PCIgICAgZm91bmQgIiA8PGluc3RUZXJtLT5nZXRJbnN0KCktPmdldE5hbWUoKSA8PCIvIiA8PGluc3RUZXJtLT5nZXRUZXJtKCktPmdldE5hbWUoKSA8PGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgcGluMmVwTWFwW3JxT2JqXS5pbnNlcnQobWFrZV9wYWlyKGJwLCBsTnVtKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvL2lmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgLy8gIGNvdXQgPDwiICAgIGZvdW5kIG90aGVyIGluc3RUZXJtIiA8PGVuZGw7Ci0gICAgICAgIC8vfQotICAgICAgfQotICAgIH0gZWxzZSBpZiAocnFPYmotPnR5cGVJZCgpID09IGZyY1Rlcm0pIHsKLSAgICAgIGF1dG8gdGVybSA9IHN0YXRpY19jYXN0PGZyVGVybSo+KHJxT2JqKTsKLSAgICAgIGlmICh0ZXJtLT5nZXROZXQoKSA9PSBuZXQpIHsKLSAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgIGNvdXQgPDwiICAgIGZvdW5kIFBJTi8iIDw8dGVybS0+Z2V0TmFtZSgpIDw8ZW5kbDsKLSAgICAgICAgfQotICAgICAgICBwaW4yZXBNYXBbcnFPYmpdLmluc2VydChtYWtlX3BhaXIoYnAsIGxOdW0pKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAvLyAgY291dCA8PCIgICAgZm91bmQgb3RoZXIgdGVybSIgPDxlbmRsOwotICAgICAgICAvL30KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBGbGV4RFI6OmNoZWNrQ29ubmVjdGl2aXR5X3BpbjJlcE1hcChmck5ldCogbmV0LCB2ZWN0b3I8ZnJDb25uRmlnKj4gJm5ldERST2JqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwPGZyQmxvY2tPYmplY3QqLCBzZXQ8cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiA+LCBmckJsb2NrT2JqZWN0Q29tcD4gJnBpbjJlcE1hcCkgewotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgZnJQb2ludCBicCwgZXA7Ci0gIGZvciAoYXV0byAmY29ubkZpZzogbmV0RFJPYmpzKSB7Ci0gICAgaWYgKGNvbm5GaWctPnR5cGVJZCgpID09IGZyY1BhdGhTZWcpIHsKLSAgICAgIGF1dG8gb2JqID0gc3RhdGljX2Nhc3Q8ZnJQYXRoU2VnKj4oY29ubkZpZyk7Ci0gICAgICBvYmotPmdldFBvaW50cyhicCwgZXApOwotICAgICAgYXV0byBsTnVtID0gb2JqLT5nZXRMYXllck51bSgpOwotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgIGNvdXQgPDwiKGJwLCBlcCkgKCIgPDxicC54KCkgLyAyMDAwLjAgPDwiICwiIDw8YnAueSgpIC8gMjAwMC4wIDw8IikgKCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ZXAueCgpIC8gMjAwMC4wIDw8IiAsIiA8PGVwLnkoKSAvIDIwMDAuMCA8PCIpICIgCi0gICAgICAgICAgICA8PGdldFRlY2goKS0+Z2V0TGF5ZXIobE51bSktPmdldE5hbWUoKSA8PGVuZGw7Ci0gICAgICB9Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiICBxdWVyeSBicCIgPDxlbmRsOwotICAgICAgfQotICAgICAgY2hlY2tDb25uZWN0aXZpdHlfcGluMmVwTWFwX2hlbHBlcihuZXQsIGJwLCBsTnVtLCBwaW4yZXBNYXApOwotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8IiAgcXVlcnkgZXAiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIGNoZWNrQ29ubmVjdGl2aXR5X3BpbjJlcE1hcF9oZWxwZXIobmV0LCBlcCwgbE51bSwgcGluMmVwTWFwKTsKLSAgICB9IGVsc2UgaWYgKGNvbm5GaWctPnR5cGVJZCgpID09IGZyY1ZpYSkgewotICAgICAgYXV0byBvYmogPSBzdGF0aWNfY2FzdDxmclZpYSo+KGNvbm5GaWcpOwotICAgICAgb2JqLT5nZXRPcmlnaW4oYnApOwotICAgICAgYXV0byBsMU51bSA9IG9iai0+Z2V0VmlhRGVmKCktPmdldExheWVyMU51bSgpOwotICAgICAgYXV0byBsMk51bSA9IG9iai0+Z2V0VmlhRGVmKCktPmdldExheWVyMk51bSgpOwotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8InB0ICgiIDw8YnAueCgpIC8gMjAwMC4wIDw8IiAsIiA8PGJwLnkoKSAvIDIwMDAuMCA8PCIpICIKLSAgICAgICAgICAgICA8PG9iai0+Z2V0VmlhRGVmKCktPmdldE5hbWUoKSA8PGVuZGw7Ci0gICAgICB9Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiICBxdWVyeSBwdCBsMSIgPDxlbmRsOwotICAgICAgfQotICAgICAgY2hlY2tDb25uZWN0aXZpdHlfcGluMmVwTWFwX2hlbHBlcihuZXQsIGJwLCBsMU51bSwgcGluMmVwTWFwKTsKLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgIHF1ZXJ5IHB0IGwyIiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgICBjaGVja0Nvbm5lY3Rpdml0eV9waW4yZXBNYXBfaGVscGVyKG5ldCwgYnAsIGwyTnVtLCBwaW4yZXBNYXApOwotICAgIH0gZWxzZSB7Ci0gICAgICBjb3V0IDw8IkVycm9yOiBjaGVja0Nvbm5lY3Rpdml0eV9waW4yZXBNYXAgdW5zdXBwb3J0ZWQgdHlwZSIgPDxlbmRsOwotICAgIH0KLSAgfQotCi19Ci0KLXZvaWQgRmxleERSOjpjaGVja0Nvbm5lY3Rpdml0eV9pbml0RFJPYmpzKGZyTmV0KiBuZXQsIHZlY3RvcjxmckNvbm5GaWcqPiAmbmV0RFJPYmpzKSB7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIC8vYm9vbCBlbmFibGVPdXRwdXQgPSB0cnVlOwotICBmb3IgKGF1dG8gJnVQdHI6IG5ldC0+Z2V0U2hhcGVzKCkpIHsKLSAgICBhdXRvIGNvbm5GaWcgPSB1UHRyLmdldCgpOwotICAgIGlmIChjb25uRmlnLT50eXBlSWQoKSA9PSBmcmNQYXRoU2VnKSB7Ci0gICAgICBuZXREUk9ianMucHVzaF9iYWNrKGNvbm5GaWcpOwotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBhdXRvIG9iaiA9IHN0YXRpY19jYXN0PGZyUGF0aFNlZyo+KGNvbm5GaWcpOwotICAgICAgICBmclBvaW50IGJwLCBlcDsKLSAgICAgICAgYXV0byBsTnVtID0gb2JqLT5nZXRMYXllck51bSgpOwotICAgICAgICBvYmotPmdldFBvaW50cyhicCwgZXApOwotICAgICAgICBjb3V0IDw8IiAoIiA8PGJwLngoKSAqIDEuMC8gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCkgPDwiLCAiCi0gICAgICAgICAgICAgICAgICAgIDw8YnAueSgpICogMS4wLyBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0REJVUGVyVVUoKSA8PCIpICgiCi0gICAgICAgICAgICAgICAgICAgIDw8ZXAueCgpICogMS4wLyBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0REJVUGVyVVUoKSA8PCIsICIKLSAgICAgICAgICAgICAgICAgICAgPDxlcC55KCkgKiAxLjAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpIDw8IikgIgotICAgICAgICAgICAgIDw8Z2V0VGVjaCgpLT5nZXRMYXllcihsTnVtKS0+Z2V0TmFtZSgpIDw8ZW5kbDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgY291dCA8PCJFcnJvcjogY2hlY2tDb25uZWN0aXZpdHlfaW5pdERST2JqcyB1bnN1cHBvcnRlZCB0eXBlIiA8PGVuZGw7Ci0gICAgfQotICB9Ci0gIGZvciAoYXV0byAmdVB0cjogbmV0LT5nZXRWaWFzKCkpIHsKLSAgICBhdXRvIGNvbm5GaWcgPSB1UHRyLmdldCgpOwotICAgIGlmIChjb25uRmlnLT50eXBlSWQoKSA9PSBmcmNWaWEpIHsKLSAgICAgIG5ldERST2Jqcy5wdXNoX2JhY2soY29ubkZpZyk7Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGF1dG8gb2JqID0gc3RhdGljX2Nhc3Q8ZnJWaWEqPihjb25uRmlnKTsKLSAgICAgICAgZnJQb2ludCBicDsKLSAgICAgICAgb2JqLT5nZXRPcmlnaW4oYnApOwotICAgICAgICBjb3V0IDw8IiAoIiA8PGJwLngoKSAqIDEuMC8gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCkgPDwiLCAiCi0gICAgICAgICAgICAgICAgICAgIDw8YnAueSgpICogMS4wLyBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0REJVUGVyVVUoKSA8PCIpICIKLSAgICAgICAgICAgICA8PG9iai0+Z2V0VmlhRGVmKCktPmdldE5hbWUoKSA8PGVuZGw7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvdXQgPDwiRXJyb3I6IGNoZWNrQ29ubmVjdGl2aXR5X2luaXREUk9ianMgdW5zdXBwb3J0ZWQgdHlwZSIgPDxlbmRsOwotICAgIH0KLSAgfQotfQotCi12b2lkIEZsZXhEUjo6Y2hlY2tDb25uZWN0aXZpdHlfbm9kZU1hcF9yb3V0ZU9iakVuZChmck5ldCogbmV0LCB2ZWN0b3I8ZnJDb25uRmlnKj4gJm5ldFJvdXRlT2JqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+LCBzZXQ8aW50PiA+ICZub2RlTWFwKSB7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIGZyUG9pbnQgYnAsIGVwOwotICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpbmV0Um91dGVPYmpzLnNpemUoKTsgaSsrKSB7Ci0gICAgYXV0byAmY29ubkZpZyA9IG5ldFJvdXRlT2Jqc1tpXTsKLSAgICBpZiAoY29ubkZpZy0+dHlwZUlkKCkgPT0gZnJjUGF0aFNlZykgewotICAgICAgYXV0byBvYmogPSBzdGF0aWNfY2FzdDxmclBhdGhTZWcqPihjb25uRmlnKTsKLSAgICAgIG9iai0+Z2V0UG9pbnRzKGJwLCBlcCk7Ci0gICAgICBhdXRvIGxOdW0gPSBvYmotPmdldExheWVyTnVtKCk7Ci0gICAgICBub2RlTWFwW21ha2VfcGFpcihicCwgbE51bSldLmluc2VydChpKTsKLSAgICAgIG5vZGVNYXBbbWFrZV9wYWlyKGVwLCBsTnVtKV0uaW5zZXJ0KGkpOwotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8Im5vZGUgaWR4ID0gIiA8PGkgPDwiLCAoIiA8PGJwLngoKSAvIDIwMDAuMCA8PCIsICIgPDxicC55KCkgLyAyMDAwLjAgPDwiKSAoIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDxlcC54KCkgLyAyMDAwLjAgPDwiLCAiIDw8ZXAueSgpIC8gMjAwMC4wIDw8IikgIiAKLSAgICAgICAgICAgICA8PGdldFRlY2goKS0+Z2V0TGF5ZXIobE51bSktPmdldE5hbWUoKSA8PGVuZGw7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChjb25uRmlnLT50eXBlSWQoKSA9PSBmcmNWaWEpIHsKLSAgICAgIGF1dG8gb2JqID0gc3RhdGljX2Nhc3Q8ZnJWaWEqPihjb25uRmlnKTsKLSAgICAgIG9iai0+Z2V0T3JpZ2luKGJwKTsKLSAgICAgIGF1dG8gbDFOdW0gPSBvYmotPmdldFZpYURlZigpLT5nZXRMYXllcjFOdW0oKTsKLSAgICAgIGF1dG8gbDJOdW0gPSBvYmotPmdldFZpYURlZigpLT5nZXRMYXllcjJOdW0oKTsKLSAgICAgIG5vZGVNYXBbbWFrZV9wYWlyKGJwLCBsMU51bSldLmluc2VydChpKTsKLSAgICAgIG5vZGVNYXBbbWFrZV9wYWlyKGJwLCBsMk51bSldLmluc2VydChpKTsKLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCJub2RlIGlkeCA9ICIgPDxpIDw8IiwgKCIgPDxicC54KCkgLyAyMDAwLjAgPDwiLCAiIDw8YnAueSgpIC8gMjAwMC4wIDw8IikgIgotICAgICAgICAgICAgIDw8Z2V0VGVjaCgpLT5nZXRMYXllcihsMU51bSktPmdldE5hbWUoKSA8PCIgLS0+ICIgPDxnZXRUZWNoKCktPmdldExheWVyKGwyTnVtKS0+Z2V0TmFtZSgpIDw8ZW5kbDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgY291dCA8PCJFcnJvcjogY2hlY2tDb25uZWN0aXZpdHlfbm9kZU1hcF9yb3V0ZU9iakVuZCB1bnN1cHBvcnRlZCB0eXBlIiA8PGVuZGw7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgRmxleERSOjpjaGVja0Nvbm5lY3Rpdml0eV9ub2RlTWFwX3JvdXRlT2JqU3BsaXRfaGVscGVyKGNvbnN0IGZyUG9pbnQgJmNyb3NzUHQsIAotICAgICAgICAgICAgIGZyQ29vcmQgdHJhY2tDb29yZCwgZnJDb29yZCBzcGxpdENvb3JkLCBmckxheWVyTnVtIGxOdW0sIAotICAgICAgICAgICAgIHZlY3RvcjxtYXA8ZnJDb29yZCwgbWFwPGZyQ29vcmQsIHBhaXI8ZnJDb29yZCwgaW50PiA+ID4gPiAmbWVyZ2VIZWxwZXIsCi0gICAgICAgICAgICAgbWFwPHBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4sIHNldDxpbnQ+ID4gJm5vZGVNYXApIHsKLSAgYXV0byBpdDEgPSBtZXJnZUhlbHBlcltsTnVtXS5maW5kKHRyYWNrQ29vcmQpOwotICBpZiAoaXQxICE9IG1lcmdlSGVscGVyW2xOdW1dLmVuZCgpKSB7Ci0gICAgYXV0byAmbXAgPSBpdDEtPnNlY29uZDsgLy8gbWFwPGVwLCBwYWlyPGJwLCBvYmpJZHg+ID4KLSAgICBhdXRvIGl0MiA9IG1wLmxvd2VyX2JvdW5kKHNwbGl0Q29vcmQpOwotICAgIGlmIChpdDIgIT0gbXAuZW5kKCkpIHsKLSAgICAgIGF1dG8gJmVuZFAgPSBpdDItPmZpcnN0OwotICAgICAgYXV0byAmW2JlZ2luUCwgb2JqSWR4XSA9IGl0Mi0+c2Vjb25kOwotICAgICAgaWYgKGVuZFAgPiBzcGxpdENvb3JkICYmIGJlZ2luUCA8IHNwbGl0Q29vcmQpIHsKLSAgICAgICAgbm9kZU1hcFttYWtlX3BhaXIoY3Jvc3NQdCwgbE51bSldLmluc2VydChvYmpJZHgpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi12b2lkIEZsZXhEUjo6Y2hlY2tDb25uZWN0aXZpdHlfbm9kZU1hcF9yb3V0ZU9ialNwbGl0KGZyTmV0KiBuZXQsIHZlY3RvcjxmckNvbm5GaWcqPiAmbmV0Um91dGVPYmpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiwgc2V0PGludD4gPiAmbm9kZU1hcCkgewotICBmclBvaW50IGJwLCBlcDsKLSAgLy8gdmVjdG9yPG1hcDx0cmFjaywgbWFwPGVwLCBwYWlyPGJwLCBvYmpJZHg+ID4gPiA+IGludGVydmFsX21hcAotICB2ZWN0b3I8bWFwPGZyQ29vcmQsIG1hcDxmckNvb3JkLCBwYWlyPGZyQ29vcmQsIGludD4gPiA+ID4gaG9yek1lcmdlSGVscGVyKGdldFRlY2goKS0+Z2V0TGF5ZXJzKCkuc2l6ZSgpKTsKLSAgdmVjdG9yPG1hcDxmckNvb3JkLCBtYXA8ZnJDb29yZCwgcGFpcjxmckNvb3JkLCBpbnQ+ID4gPiA+IHZlcnRNZXJnZUhlbHBlcihnZXRUZWNoKCktPmdldExheWVycygpLnNpemUoKSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCluZXRSb3V0ZU9ianMuc2l6ZSgpOyBpKyspIHsKLSAgICBhdXRvICZjb25uRmlnID0gbmV0Um91dGVPYmpzW2ldOwotICAgIGlmIChjb25uRmlnLT50eXBlSWQoKSA9PSBmcmNQYXRoU2VnKSB7Ci0gICAgICBhdXRvIG9iaiA9IHN0YXRpY19jYXN0PGZyUGF0aFNlZyo+KGNvbm5GaWcpOwotICAgICAgb2JqLT5nZXRQb2ludHMoYnAsIGVwKTsKLSAgICAgIGF1dG8gbE51bSA9IG9iai0+Z2V0TGF5ZXJOdW0oKTsKLSAgICAgIC8vIHZlcnQgc2VnCi0gICAgICBpZiAoYnAueCgpID09IGVwLngoKSkgewotICAgICAgICB2ZXJ0TWVyZ2VIZWxwZXJbbE51bV1bYnAueCgpXVtlcC55KCldID0gbWFrZV9wYWlyKGJwLnkoKSwgaSk7Ci0gICAgICAvLyBob3J6IHNlZwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaG9yek1lcmdlSGVscGVyW2xOdW1dW2JwLnkoKV1bZXAueCgpXSA9IG1ha2VfcGFpcihicC54KCksIGkpOwotICAgICAgfQotICAgIH0KLSAgfQotICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpbmV0Um91dGVPYmpzLnNpemUoKTsgaSsrKSB7Ci0gICAgYXV0byAmY29ubkZpZyA9IG5ldFJvdXRlT2Jqc1tpXTsKLSAgICAvLyBlcCBvbiBwYXRoc2VnCi0gICAgaWYgKGNvbm5GaWctPnR5cGVJZCgpID09IGZyY1BhdGhTZWcpIHsKLSAgICAgIGF1dG8gb2JqID0gc3RhdGljX2Nhc3Q8ZnJQYXRoU2VnKj4oY29ubkZpZyk7Ci0gICAgICBvYmotPmdldFBvaW50cyhicCwgZXApOwotICAgICAgYXV0byBsTnVtID0gb2JqLT5nZXRMYXllck51bSgpOwotICAgICAgLy8gdmVydCBzZWcsIGZpbmQgaG9yeiBjcm9zc2luZyBzZWcKLSAgICAgIGlmIChicC54KCkgPT0gZXAueCgpKSB7Ci0gICAgICAgIC8vZmluZCB3aGV0aGVyIHRoZXJlIGlzIGhvcnogdHJhY2sgYXQgYnAKLSAgICAgICAgYXV0byBjcm9zc1B0ICAgID0gYnA7Ci0gICAgICAgIGF1dG8gdHJhY2tDb29yZCA9IGJwLnkoKTsKLSAgICAgICAgYXV0byBzcGxpdENvb3JkID0gYnAueCgpOwotICAgICAgICBjaGVja0Nvbm5lY3Rpdml0eV9ub2RlTWFwX3JvdXRlT2JqU3BsaXRfaGVscGVyKGNyb3NzUHQsIHRyYWNrQ29vcmQsIHNwbGl0Q29vcmQsIGxOdW0sIGhvcnpNZXJnZUhlbHBlciwgbm9kZU1hcCk7Ci0gICAgICAgIC8vZmluZCB3aGV0aGVyIHRoZXJlIGlzIGhvcnogdHJhY2sgYXQgZXAKLSAgICAgICAgY3Jvc3NQdCAgICA9IGVwOwotICAgICAgICB0cmFja0Nvb3JkID0gZXAueSgpOwotICAgICAgICBzcGxpdENvb3JkID0gZXAueCgpOwotICAgICAgICBjaGVja0Nvbm5lY3Rpdml0eV9ub2RlTWFwX3JvdXRlT2JqU3BsaXRfaGVscGVyKGNyb3NzUHQsIHRyYWNrQ29vcmQsIHNwbGl0Q29vcmQsIGxOdW0sIGhvcnpNZXJnZUhlbHBlciwgbm9kZU1hcCk7Ci0gICAgICAvLyBob3J6IHNlZwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy9maW5kIHdoZXRoZXIgdGhlcmUgaXMgdmVydCB0cmFjayBhdCBicAotICAgICAgICBhdXRvIGNyb3NzUHQgICAgPSBicDsKLSAgICAgICAgYXV0byB0cmFja0Nvb3JkID0gYnAueCgpOwotICAgICAgICBhdXRvIHNwbGl0Q29vcmQgPSBicC55KCk7Ci0gICAgICAgIGNoZWNrQ29ubmVjdGl2aXR5X25vZGVNYXBfcm91dGVPYmpTcGxpdF9oZWxwZXIoY3Jvc3NQdCwgdHJhY2tDb29yZCwgc3BsaXRDb29yZCwgbE51bSwgdmVydE1lcmdlSGVscGVyLCBub2RlTWFwKTsKLSAgICAgICAgLy9maW5kIHdoZXRoZXIgdGhlcmUgaXMgdmVydCB0cmFjayBhdCBlcAotICAgICAgICBjcm9zc1B0ICAgID0gZXA7Ci0gICAgICAgIHRyYWNrQ29vcmQgPSBlcC54KCk7Ci0gICAgICAgIHNwbGl0Q29vcmQgPSBlcC55KCk7Ci0gICAgICAgIGNoZWNrQ29ubmVjdGl2aXR5X25vZGVNYXBfcm91dGVPYmpTcGxpdF9oZWxwZXIoY3Jvc3NQdCwgdHJhY2tDb29yZCwgc3BsaXRDb29yZCwgbE51bSwgdmVydE1lcmdlSGVscGVyLCBub2RlTWFwKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGNvbm5GaWctPnR5cGVJZCgpID09IGZyY1ZpYSkgewotICAgICAgYXV0byBvYmogPSBzdGF0aWNfY2FzdDxmclZpYSo+KGNvbm5GaWcpOwotICAgICAgb2JqLT5nZXRPcmlnaW4oYnApOwotICAgICAgYXV0byBsTnVtID0gb2JqLT5nZXRWaWFEZWYoKS0+Z2V0TGF5ZXIxTnVtKCk7Ci0gICAgICAvL2ZpbmQgd2hldGhlciB0aGVyZSBpcyBob3J6IHRyYWNrIGF0IGJwIG9uIGxheWVyMQotICAgICAgYXV0byBjcm9zc1B0ICAgID0gYnA7Ci0gICAgICBhdXRvIHRyYWNrQ29vcmQgPSBicC55KCk7Ci0gICAgICBhdXRvIHNwbGl0Q29vcmQgPSBicC54KCk7Ci0gICAgICBjaGVja0Nvbm5lY3Rpdml0eV9ub2RlTWFwX3JvdXRlT2JqU3BsaXRfaGVscGVyKGNyb3NzUHQsIHRyYWNrQ29vcmQsIHNwbGl0Q29vcmQsIGxOdW0sIGhvcnpNZXJnZUhlbHBlciwgbm9kZU1hcCk7Ci0gICAgICAvL2ZpbmQgd2hldGhlciB0aGVyZSBpcyB2ZXJ0IHRyYWNrIGF0IGJwIG9uIGxheWVyMQotICAgICAgY3Jvc3NQdCAgICA9IGJwOwotICAgICAgdHJhY2tDb29yZCA9IGJwLngoKTsKLSAgICAgIHNwbGl0Q29vcmQgPSBicC55KCk7Ci0gICAgICBjaGVja0Nvbm5lY3Rpdml0eV9ub2RlTWFwX3JvdXRlT2JqU3BsaXRfaGVscGVyKGNyb3NzUHQsIHRyYWNrQ29vcmQsIHNwbGl0Q29vcmQsIGxOdW0sIHZlcnRNZXJnZUhlbHBlciwgbm9kZU1hcCk7Ci0gICAgICAKLSAgICAgIGxOdW0gPSBvYmotPmdldFZpYURlZigpLT5nZXRMYXllcjJOdW0oKTsKLSAgICAgIC8vZmluZCB3aGV0aGVyIHRoZXJlIGlzIGhvcnogdHJhY2sgYXQgYnAgb24gbGF5ZXIyCi0gICAgICBjcm9zc1B0ICAgID0gYnA7Ci0gICAgICB0cmFja0Nvb3JkID0gYnAueSgpOwotICAgICAgc3BsaXRDb29yZCA9IGJwLngoKTsKLSAgICAgIGNoZWNrQ29ubmVjdGl2aXR5X25vZGVNYXBfcm91dGVPYmpTcGxpdF9oZWxwZXIoY3Jvc3NQdCwgdHJhY2tDb29yZCwgc3BsaXRDb29yZCwgbE51bSwgaG9yek1lcmdlSGVscGVyLCBub2RlTWFwKTsKLSAgICAgIC8vZmluZCB3aGV0aGVyIHRoZXJlIGlzIHZlcnQgdHJhY2sgYXQgYnAgb24gbGF5ZXIyCi0gICAgICBjcm9zc1B0ICAgID0gYnA7Ci0gICAgICB0cmFja0Nvb3JkID0gYnAueCgpOwotICAgICAgc3BsaXRDb29yZCA9IGJwLnkoKTsKLSAgICAgIGNoZWNrQ29ubmVjdGl2aXR5X25vZGVNYXBfcm91dGVPYmpTcGxpdF9oZWxwZXIoY3Jvc3NQdCwgdHJhY2tDb29yZCwgc3BsaXRDb29yZCwgbE51bSwgdmVydE1lcmdlSGVscGVyLCBub2RlTWFwKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBGbGV4RFI6OmNoZWNrQ29ubmVjdGl2aXR5X25vZGVNYXBfcGluKGZyTmV0KiBuZXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxmckNvbm5GaWcqPiAmbmV0Um91dGVPYmpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxmckJsb2NrT2JqZWN0Kj4gJm5ldFBpbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwPGZyQmxvY2tPYmplY3QqLCBzZXQ8cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiA+LCBmckJsb2NrT2JqZWN0Q29tcD4gJnBpbjJlcE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiwgc2V0PGludD4gPiAmbm9kZU1hcCkgewotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICBpbnQgY3VyckNudCA9IChpbnQpbmV0Um91dGVPYmpzLnNpemUoKTsKLSAgZm9yIChhdXRvICZbb2JqLCBsb2NTXTogcGluMmVwTWFwKSB7Ci0gICAgbmV0UGlucy5wdXNoX2JhY2sob2JqKTsKLSAgICBmb3IgKGF1dG8gJnByOiBsb2NTKSB7Ci0gICAgICBub2RlTWFwW3ByXS5pbnNlcnQoY3VyckNudCk7Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwicGluIGlkeCA9ICIgPDxjdXJyQ250IDw8IiwgKCIgPDxwci5maXJzdC54KCkgPDwiLCAiIDw8cHIuZmlyc3QueSgpIDw8IikgIiAKLSAgICAgICAgICAgICA8PGdldFRlY2goKS0+Z2V0TGF5ZXIocHIuc2Vjb25kKS0+Z2V0TmFtZSgpIDw8ZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgKytjdXJyQ250OwotICB9Ci19Ci0KLXZvaWQgRmxleERSOjpjaGVja0Nvbm5lY3Rpdml0eV9ub2RlTWFwKGZyTmV0KiBuZXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPGZyQ29ubkZpZyo+ICZuZXRSb3V0ZU9ianMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8ZnJCbG9ja09iamVjdCo+ICZuZXRQaW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwPGZyQmxvY2tPYmplY3QqLCBzZXQ8cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiA+LCBmckJsb2NrT2JqZWN0Q29tcD4gJnBpbjJlcE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+LCBzZXQ8aW50PiA+ICZub2RlTWFwKSB7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIC8vYm9vbCBlbmFibGVPdXRwdXQgPSB0cnVlOwotICBjaGVja0Nvbm5lY3Rpdml0eV9ub2RlTWFwX3JvdXRlT2JqRW5kKG5ldCwgbmV0Um91dGVPYmpzLCBub2RlTWFwKTsKLSAgY2hlY2tDb25uZWN0aXZpdHlfbm9kZU1hcF9yb3V0ZU9ialNwbGl0KG5ldCwgbmV0Um91dGVPYmpzLCBub2RlTWFwKTsKLSAgY2hlY2tDb25uZWN0aXZpdHlfbm9kZU1hcF9waW4obmV0LCBuZXRSb3V0ZU9ianMsIG5ldFBpbnMsIHBpbjJlcE1hcCwgbm9kZU1hcCk7Ci0gIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICBpbnQgaWR4ID0gMDsKLSAgICBmb3IgKGF1dG8gY29ubkZpZzogbmV0Um91dGVPYmpzKSB7Ci0gICAgICBpZiAoY29ubkZpZy0+dHlwZUlkKCkgPT0gZnJjUGF0aFNlZykgewotICAgICAgICBhdXRvIG9iaiA9IHN0YXRpY19jYXN0PGZyUGF0aFNlZyo+KGNvbm5GaWcpOwotICAgICAgICBmclBvaW50IGJwLCBlcDsKLSAgICAgICAgYXV0byBsTnVtID0gb2JqLT5nZXRMYXllck51bSgpOwotICAgICAgICBvYmotPmdldFBvaW50cyhicCwgZXApOwotICAgICAgICBjb3V0IDw8IiMiIDw8aWR4IDw8IiAoIiAKLSAgICAgICAgICAgICA8PGJwLngoKSAqIDEuMC8gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCkgPDwiLCAiCi0gICAgICAgICAgICAgPDxicC55KCkgKiAxLjAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpIDw8IikgKCIKLSAgICAgICAgICAgICA8PGVwLngoKSAqIDEuMC8gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCkgPDwiLCAiCi0gICAgICAgICAgICAgPDxlcC55KCkgKiAxLjAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpIDw8IikgIgotICAgICAgICAgICAgIDw8Z2V0VGVjaCgpLT5nZXRMYXllcihsTnVtKS0+Z2V0TmFtZSgpIDw8ZW5kbDsKLSAgICAgIH0gZWxzZSBpZiAoY29ubkZpZy0+dHlwZUlkKCkgPT0gZnJjVmlhKSB7Ci0gICAgICAgIGF1dG8gb2JqID0gc3RhdGljX2Nhc3Q8ZnJWaWEqPihjb25uRmlnKTsKLSAgICAgICAgZnJQb2ludCBicDsKLSAgICAgICAgb2JqLT5nZXRPcmlnaW4oYnApOwotICAgICAgICBjb3V0IDw8IiMiIDw8aWR4IDw8IiAoIiAKLSAgICAgICAgICAgICA8PGJwLngoKSAqIDEuMC8gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCkgPDwiLCAiCi0gICAgICAgICAgICAgPDxicC55KCkgKiAxLjAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpIDw8IikgIgotICAgICAgICAgICAgIDw8b2JqLT5nZXRWaWFEZWYoKS0+Z2V0TmFtZSgpIDw8ZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiRXJyb3I6IGNoZWNrQ29ubmVjdGl2aXR5X25vZGVNYXAgdW5zdXBwb3J0ZWQgdHlwZSIgPDxlbmRsOwotICAgICAgfQotICAgICAgaWR4Kys7Ci0gICAgfQotICAgIGZvciAoYXV0byBvYmo6IG5ldFBpbnMpIHsKLSAgICAgIGlmIChvYmotPnR5cGVJZCgpID09IGZyY0luc3RUZXJtKSB7Ci0gICAgICAgIGF1dG8gaW5zdFRlcm0gPSBzdGF0aWNfY2FzdDxmckluc3RUZXJtKj4ob2JqKTsKLSAgICAgICAgY291dCA8PCIjIiA8PGlkeCA8PCIgIiA8PGluc3RUZXJtLT5nZXRJbnN0KCktPmdldE5hbWUoKSA8PCIvIiA8PGluc3RUZXJtLT5nZXRUZXJtKCktPmdldE5hbWUoKSA8PGVuZGw7Ci0gICAgICB9IGVsc2UgaWYgKG9iai0+dHlwZUlkKCkgPT0gZnJjVGVybSkgewotICAgICAgICBhdXRvIHRlcm0gPSBzdGF0aWNfY2FzdDxmclRlcm0qPihvYmopOwotICAgICAgICBjb3V0IDw8IiMiIDw8aWR4IDw8IiBQSU4vIiA8PHRlcm0tPmdldE5hbWUoKSA8PGVuZGw7Ci0gICAgICB9Ci0gICAgICBpZHgrKzsKLSAgICB9Ci0gIH0KLX0KLQotYm9vbCBGbGV4RFI6OmNoZWNrQ29ubmVjdGl2aXR5X2FzdGFyKGZyTmV0KiBuZXQsIHZlY3Rvcjxib29sPiAmYWRqVmlzaXRlZCwgdmVjdG9yPGludD4gJmFkalByZXZJZHgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+LCBzZXQ8aW50PiA+ICZub2RlTWFwLCBpbnQgJmdDbnQsIGludCAmbkNudCkgewotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLSAgLy8gYSBzdGFyIHNlYXJjaAotCi0gIC8vIG5vZGUgaW5kZXgsIG5vZGUgdmlzaXRlZAotICB2ZWN0b3I8dmVjdG9yPGludD4gPiBhZGpWZWMobkNudCwgdmVjdG9yPGludD4oKSk7Ci0gIHZlY3Rvcjxib29sPiBvblBhdGhJZHgobkNudCwgZmFsc2UpOwotICBhZGpWaXNpdGVkLmNsZWFyKCk7Ci0gIGFkalByZXZJZHguY2xlYXIoKTsKLSAgYWRqVmlzaXRlZC5yZXNpemUobkNudCwgZmFsc2UpOwotICBhZGpQcmV2SWR4LnJlc2l6ZShuQ250LCAtMSk7Ci0gIGZvciAoYXV0byAmW3ByLCBpZHhTXTogbm9kZU1hcCkgewotICAgIC8vYXV0byAmW3B0LCBsTnVtXSA9IHByOwotICAgIGZvciAoYXV0byBpdDEgPSBpZHhTLmJlZ2luKCk7IGl0MSAhPSBpZHhTLmVuZCgpOyBpdDErKykgewotICAgICAgYXV0byBpdDIgPSBpdDE7Ci0gICAgICBpdDIrKzsKLSAgICAgIGF1dG8gaWR4MSA9ICppdDE7Ci0gICAgICBmb3IgKDsgaXQyICE9IGlkeFMuZW5kKCk7IGl0MisrKSB7Ci0gICAgICAgIGF1dG8gaWR4MiA9ICppdDI7Ci0gICAgICAgIGFkalZlY1tpZHgxXS5wdXNoX2JhY2soaWR4Mik7Ci0gICAgICAgIGFkalZlY1tpZHgyXS5wdXNoX2JhY2soaWR4MSk7Ci0gICAgICAgIC8vY291dCA8PCJhZGQgZWRnZSAjIiA8PGlkeDEgPDwiIC0tICMiIDw8aWR4MiA8PGVuZGw7Ci0gICAgICAgIC8vIG9uZSBwaW4sIG9uZSBnY2VsbAotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHN0cnVjdCB3ZiB7Ci0gICAgaW50IG5vZGVJZHg7Ci0gICAgaW50IHByZXZJZHg7Ci0gICAgaW50IGNvc3Q7Ci0gICAgYm9vbCBvcGVyYXRvcjwoY29uc3Qgd2YgJmIpIGNvbnN0IHsKLSAgICAgIGlmIChjb3N0ID09IGIuY29zdCkgewotICAgICAgICByZXR1cm4gbm9kZUlkeCA+IGIubm9kZUlkeDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBjb3N0ID4gYi5jb3N0OwotICAgICAgfQotICAgIH0KLSAgfTsKLSAgZm9yIChpbnQgZmluZE5vZGUgPSBnQ250OyBmaW5kTm9kZSA8IG5DbnQgLSAxOyBmaW5kTm9kZSsrKSB7Ci0gICAgLy9hZGpWaXNpdGVkID0gb25QYXRoSWR4OwotICAgIC8vY291dCA8PCJmaW5pc2hlZCAiIDw8ZmluZE5vZGUgPDwiIG5vZGVzIiA8PGVuZGw7Ci0gICAgcHJpb3JpdHlfcXVldWU8d2Y+IHBxOwotICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgIC8vY291dCA8PCJ2aXNpdCI7Ci0gICAgfQotICAgIGlmIChmaW5kTm9kZSA9PSBnQ250KSB7Ci0gICAgICAvLyBwdXNoIG9ubHkgZmlyc3QgcGluIGludG8gcHEKLSAgICAgIHBxLnB1c2goe2dDbnQsIC0xLCAwfSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIHB1c2ggZXZlcnkgdmlzaXRlZCBub2RlIGludG8gcHEKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNudDsgaSsrKSB7Ci0gICAgICAgIC8vaWYgKGFkalZpc2l0ZWRbaV0pIHsKLSAgICAgICAgaWYgKG9uUGF0aElkeFtpXSkgewotICAgICAgICAgIC8vIHBlbmFsaXplIGZlZWR0aHJvdWdoIGluIG5vcm1hbCBtb2RlCi0gICAgICAgICAgaWYgKGkgPj0gZ0NudCkgewotICAgICAgICAgICAgcHEucHVzaCh7aSwgYWRqUHJldklkeFtpXSwgMH0pOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcS5wdXNoKHtpLCBhZGpQcmV2SWR4W2ldLCAwfSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGludCBsYXN0Tm9kZUlkeCA9IC0xOwotICAgIHdoaWxlICghcHEuZW1wdHkoKSkgewotICAgICAgYXV0byB3ZnJvbnQgPSBwcS50b3AoKTsKLSAgICAgIHBxLnBvcCgpOwotICAgICAgaWYgKCFvblBhdGhJZHhbd2Zyb250Lm5vZGVJZHhdICYmIGFkalZpc2l0ZWRbd2Zyb250Lm5vZGVJZHhdKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgaWYgKHdmcm9udC5ub2RlSWR4ID4gZ0NudCAmJiB3ZnJvbnQubm9kZUlkeCA8IG5DbnQgJiYgYWRqVmlzaXRlZFt3ZnJvbnQubm9kZUlkeF0gPT0gZmFsc2UpIHsKLSAgICAgICAgYWRqVmlzaXRlZFt3ZnJvbnQubm9kZUlkeF0gPSB0cnVlOwotICAgICAgICBhZGpQcmV2SWR4W3dmcm9udC5ub2RlSWR4XSA9IHdmcm9udC5wcmV2SWR4OwotICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgLy9jb3V0IDw8IiAiIDw8d2Zyb250Lm5vZGVJZHggPDwiICgiIDw8d2Zyb250LmNvc3QgPDwiLCIgPDx3ZnJvbnQucHJldklkeCA8PCIpIiA8PCIgZXhpdCIgPDxlbmRsOwotICAgICAgICAgIGNvdXQgPDwidmlzaXQgIiA8PHdmcm9udC5ub2RlSWR4IDw8IiAoIiA8PHdmcm9udC5jb3N0IDw8IiwiIDw8d2Zyb250LnByZXZJZHggPDwiKSIgPDwiIGV4aXQiIDw8ZW5kbDsKLSAgICAgICAgfQotICAgICAgICBsYXN0Tm9kZUlkeCA9IHdmcm9udC5ub2RlSWR4OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGFkalZpc2l0ZWRbd2Zyb250Lm5vZGVJZHhdID0gdHJ1ZTsKLSAgICAgIGFkalByZXZJZHhbd2Zyb250Lm5vZGVJZHhdID0gd2Zyb250LnByZXZJZHg7Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIC8vY291dCA8PCIgIiA8PHdmcm9udC5ub2RlSWR4IDw8IiAoIiA8PHdmcm9udC5jb3N0IDw8IiwiIDw8d2Zyb250LnByZXZJZHggPDwiKSI7Ci0gICAgICAgIGNvdXQgPDwidmlzaXQgIiA8PHdmcm9udC5ub2RlSWR4IDw8IiAoIiA8PHdmcm9udC5jb3N0IDw8IiwiIDw8d2Zyb250LnByZXZJZHggPDwiKSIgPDxlbmRsOwotICAgICAgfQotICAgICAgLy8gdmlzaXQgb3RoZXIgbm9kZXMKLSAgICAgIGZvciAoYXV0byBuYnJJZHg6IGFkalZlY1t3ZnJvbnQubm9kZUlkeF0pIHsKLSAgICAgICAgaWYgKCFhZGpWaXNpdGVkW25icklkeF0pIHsKLSAgICAgICAgICBwcS5wdXNoKHtuYnJJZHgsIHdmcm9udC5ub2RlSWR4LCB3ZnJvbnQuY29zdCArIDF9KTsKLSAgICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgICBjb3V0IDw8InB1c2ggIiA8PG5icklkeCA8PGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIHRyYWNlIGJhY2sgcGF0aAotICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgIGNvdXQgPDwidHJhY2UgYmFjayBpZCI7Ci0gICAgfQotICAgIHdoaWxlICgobGFzdE5vZGVJZHggIT0gLTEpICYmICghb25QYXRoSWR4W2xhc3ROb2RlSWR4XSkpIHsKLSAgICAgIG9uUGF0aElkeFtsYXN0Tm9kZUlkeF0gPSB0cnVlOwotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8IiAiIDw8bGFzdE5vZGVJZHggPDwiICgiIDw8YWRqUHJldklkeFtsYXN0Tm9kZUlkeF0gPDwiKSI7Ci0gICAgICB9Ci0gICAgICBsYXN0Tm9kZUlkeCA9IGFkalByZXZJZHhbbGFzdE5vZGVJZHhdOwotICAgIH0KLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBjb3V0IDw8ZW5kbDsKLSAgICB9Ci0gICAgYWRqVmlzaXRlZCA9IG9uUGF0aElkeDsKLSAgfQotICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gIGNvdXQgPDwic3RhdDogIiA8PG5ldC0+Z2V0TmFtZSgpIDw8IiAjZ3VpZGUvI3Bpbi8jdW51c2VkID0gIiA8PGdDbnQgPDwiLyIgPDxuQ250IC0gZ0NudCA8PCIvIiAKLSAgICAgICA8PG5DbnQgLSBjb3VudChhZGpWaXNpdGVkLmJlZ2luKCksIGFkalZpc2l0ZWQuZW5kKCksIHRydWUpIDw8ZW5kbDsKLSAgfQotICBpbnQgcGluVmlzaXRlZCA9IGNvdW50KGFkalZpc2l0ZWQuYmVnaW4oKSArIGdDbnQsIGFkalZpc2l0ZWQuZW5kKCksIHRydWUpOwotICAvLyB0cnVlIGVycm9yIHdoZW4gYWxsb3dpbmcgZmVlZHRocm91Z2gKLSAgaWYgKHBpblZpc2l0ZWQgIT0gbkNudCAtIGdDbnQpIHsKLSAgICBjb3V0IDw8IkVycm9yOiAiIDw8bmV0LT5nZXROYW1lKCkgPDwiICIgPDxuQ250IC0gZ0NudCAtIHBpblZpc2l0ZWQgPDwiIHBpbiBub3QgdmlzaXRlZCAjZ3VpZGVzID0gIiA8PGdDbnQgPDxlbmRsOwotICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgIGZvciAoaW50IGkgPSBnQ250OyBpIDwgbkNudDsgaSsrKSB7Ci0gICAgICAgIGlmICghYWRqVmlzaXRlZFtpXSkgewotICAgICAgICAgIGNvdXQgPDwiICBwaW4gaWQgPSAiIDw8aSA8PGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgaWYgKHBpblZpc2l0ZWQgPT0gbkNudCAtIGdDbnQpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotdm9pZCBGbGV4RFI6OmNoZWNrQ29ubmVjdGl2aXR5X2ZpbmFsKGZyTmV0ICpuZXQsIHZlY3RvcjxmckNvbm5GaWcqPiAmbmV0Um91dGVPYmpzLCB2ZWN0b3I8ZnJCbG9ja09iamVjdCo+ICZuZXRQaW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3Rvcjxib29sPiAmYWRqVmlzaXRlZCwgaW50IGdDbnQsIGludCBuQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+LCBzZXQ8aW50PiA+ICZub2RlTWFwKSB7Ci0gIC8vYm9vbCBlbmFibGVPdXRwdXQgPSB0cnVlOwotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICAKLSAgYXV0byByZWdpb25RdWVyeSA9IGdldFJlZ2lvblF1ZXJ5KCk7Ci0KLSAgLy8gZnJvbSBvYmogdG8gcHQKLSAgbWFwPGludCwgc2V0PHBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4gPiA+IHJldmVyc2VOb2RlTWFwOwotICBmb3IgKGF1dG8gJltwciwgaWR4U106IG5vZGVNYXApIHsKLSAgICBmb3IgKGF1dG8gJmlkeDogaWR4UykgewotICAgICAgcmV2ZXJzZU5vZGVNYXBbaWR4XS5pbnNlcnQocHIpOwotICAgIH0KLSAgfQotCi0gIC8vIG5vZGVNYXAgZGVsZXRlIHJlZHVuZGFudCBvYmpzCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClhZGpWaXNpdGVkLnNpemUoKTsgaSsrKSB7Ci0gICAgaWYgKGFkalZpc2l0ZWRbaV0pIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBmb3IgKGF1dG8gJnByOiByZXZlcnNlTm9kZU1hcFtpXSkgewotICAgICAgbm9kZU1hcFtwcl0uZXJhc2UoaSk7Ci0gICAgfQotICAgIGlmIChpIDwgZ0NudCkgewotICAgICAgaWYgKG5ldFJvdXRlT2Jqc1tpXS0+dHlwZUlkKCkgPT0gZnJjUGF0aFNlZykgewotICAgICAgICByZWdpb25RdWVyeS0+cmVtb3ZlRFJPYmooc3RhdGljX2Nhc3Q8ZnJTaGFwZSo+KG5ldFJvdXRlT2Jqc1tpXSkpOwotICAgICAgICBuZXQtPnJlbW92ZVNoYXBlKHN0YXRpY19jYXN0PGZyU2hhcGUqPihuZXRSb3V0ZU9ianNbaV0pKTsKLSAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgIGNvdXQgPDwibmV0ICIgPDxuZXQtPmdldE5hbWUoKSA8PCIgZGVsZXRpbmcgcGF0aHNlZyIgPDxlbmRsOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKG5ldFJvdXRlT2Jqc1tpXS0+dHlwZUlkKCkgPT0gZnJjVmlhKSB7Ci0gICAgICAgIHJlZ2lvblF1ZXJ5LT5yZW1vdmVEUk9iaihzdGF0aWNfY2FzdDxmclZpYSo+KG5ldFJvdXRlT2Jqc1tpXSkpOwotICAgICAgICBuZXQtPnJlbW92ZVZpYShzdGF0aWNfY2FzdDxmclZpYSo+KG5ldFJvdXRlT2Jqc1tpXSkpOwotICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgY291dCA8PCJuZXQgIiA8PG5ldC0+Z2V0TmFtZSgpIDw8IiBkZWxldGluZyB2aWEiIDw8ZW5kbDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogY2hlY2tDb25uZWN0aXZpdHlfZmluYWwgdW5zdXBwb3J0ZXJkIHR5cGUiIDw8ZW5kbDsKLSAgICAgICAgZXhpdCgxKTsKLSAgICAgIH0KLSAgICAgIG5ldFJvdXRlT2Jqc1tpXSA9IG51bGxwdHI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvdXQgPDwiRXJyb3I6IGNoZWNrQ29ubmVjdGl2aXR5X2ZpbmFsIGkgPj0gZ0NudCIgPDxlbmRsOwotICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8vIHJlYnVpbGQgcmV2ZXJzZU5vZGVNYXAKLSAgcmV2ZXJzZU5vZGVNYXAuY2xlYXIoKTsKLSAgZm9yIChhdXRvICZbcHIsIGlkeFNdOiBub2RlTWFwKSB7Ci0gICAgaWYgKGlkeFMuc2l6ZSgpID09IDEpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBmb3IgKGF1dG8gJmlkeDogaWR4UykgewotICAgICAgcmV2ZXJzZU5vZGVNYXBbaWR4XS5pbnNlcnQocHIpOwotICAgIH0KLSAgfQotCi0gIGZvciAoYXV0byAmW2lkeCwgcHRTXTogcmV2ZXJzZU5vZGVNYXApIHsKLSAgICBpZiAoaWR4IDwgZ0NudCAmJiBuZXRSb3V0ZU9ianNbaWR4XS0+dHlwZUlkKCkgPT0gZnJjUGF0aFNlZykgewotICAgICAgYXV0byBwcyA9IHN0YXRpY19jYXN0PGZyUGF0aFNlZyo+KG5ldFJvdXRlT2Jqc1tpZHhdKTsKLSAgICAgIGZyUG9pbnQgYnAsIGVwOwotICAgICAgcHMtPmdldFBvaW50cyhicCwgZXApOwotICAgICAgYXV0byBbbWluUHIsIG1heFByXSA9IG1pbm1heF9lbGVtZW50KHB0Uy5iZWdpbigpLCBwdFMuZW5kKCkpOwotICAgICAgYXV0byAmbWluUHQgPSBtaW5Qci0+Zmlyc3Q7Ci0gICAgICBhdXRvICZtYXhQdCA9IG1heFByLT5maXJzdDsKLSAgICAgIC8vIHNocmluayBzZWdtZW50Ci0gICAgICBpZiAoYnAgPCBtaW5QdCB8fCBtYXhQdCA8IGVwKSB7Ci0gICAgICAgIHJlZ2lvblF1ZXJ5LT5yZW1vdmVEUk9iaihwcyk7Ci0gICAgICAgIHBzLT5zZXRQb2ludHMobWluUHQsIG1heFB0KTsKLSAgICAgICAgcmVnaW9uUXVlcnktPmFkZERST2JqKHBzKTsKLSAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgIGNvdXQgPDwibmV0ICIgPDxuZXQtPmdldE5hbWUoKSA8PCIgc2hyaW5raW5nIHBhdGhzZWciIDw8ZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0KLQotCi0vLyBmZWVkdGhyb3VnaCBhbmQgbG9vcCBjaGVjawotdm9pZCBGbGV4RFI6OmNoZWNrQ29ubmVjdGl2aXR5KCkgewotICAvL2NvdXQgPDwiY2hlY2tpbmcgY29ubmVjdGl2aXR5ICIgPDxlbmRsOwotCi0gIGJvb2wgaXNXcm9uZyA9IGZhbHNlOwotICBmb3IgKGF1dG8gJnVQdHI6IGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXROZXRzKCkpIHsKLSAgICBhdXRvIG5ldCA9IHVQdHIuZ2V0KCk7Ci0gICAgLy9pZiAobmV0LT5nZXROYW1lKCkgIT0gIm5ldDMwOTciKSB7Ci0gICAgLy8gIGNvbnRpbnVlOwotICAgIC8vfQotICAgIHZlY3RvcjxmckNvbm5GaWcqPiBuZXREUk9ianM7Ci0gICAgY2hlY2tDb25uZWN0aXZpdHlfaW5pdERST2JqcyhuZXQsIG5ldERST2Jqcyk7Ci0gICAgCi0gICAgbWFwPGZyQmxvY2tPYmplY3QqLCBzZXQ8cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiA+LCBmckJsb2NrT2JqZWN0Q29tcD4gcGluMmVwTWFwOwotICAgIGNoZWNrQ29ubmVjdGl2aXR5X3BpbjJlcE1hcChuZXQsIG5ldERST2JqcywgcGluMmVwTWFwKTsKLQotICAgIHZlY3RvcjxmckJsb2NrT2JqZWN0Kj4gbmV0UGluczsKLSAgICBtYXA8cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiwgc2V0PGludD4gPiBub2RlTWFwOwotICAgIGNoZWNrQ29ubmVjdGl2aXR5X25vZGVNYXAobmV0LCBuZXREUk9ianMsIG5ldFBpbnMsIHBpbjJlcE1hcCwgbm9kZU1hcCk7Ci0KLSAgICBpbnQgZ0NudCA9IChpbnQpbmV0RFJPYmpzLnNpemUoKTsKLSAgICBpbnQgbkNudCA9IChpbnQpbmV0RFJPYmpzLnNpemUoKSArIChpbnQpbmV0UGlucy5zaXplKCk7Ci0gICAgdmVjdG9yPGJvb2w+IGFkalZpc2l0ZWQ7Ci0gICAgdmVjdG9yPGludD4gIGFkalByZXZJZHg7Ci0gICAgaWYgKCFjaGVja0Nvbm5lY3Rpdml0eV9hc3RhcihuZXQsIGFkalZpc2l0ZWQsIGFkalByZXZJZHgsIG5vZGVNYXAsIGdDbnQsIG5DbnQpKSB7Ci0gICAgICBjb3V0IDw8IkVycm9yOiBjaGVja0Nvbm5lY3Rpdml0eSBicmVhaywgbmV0ICIgPDxuZXQtPmdldE5hbWUoKSA8PGVuZGw7Ci0gICAgICBpc1dyb25nID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gZ2V0IGxvY2sKLSAgICAgIC8vIGRlbGV0ZSAvIHNocmluayBuZXRSb3V0ZU9ianMsIAotICAgICAgY2hlY2tDb25uZWN0aXZpdHlfZmluYWwobmV0LCBuZXREUk9ianMsIG5ldFBpbnMsIGFkalZpc2l0ZWQsIGdDbnQsIG5DbnQsIG5vZGVNYXApOwotICAgICAgLy8gcmVsZWFzZSBsb2NrCi0gICAgfQotICB9Ci0gIGlmIChpc1dyb25nKSB7Ci0gICAgaW86OldyaXRlciB3cml0ZXIoZ2V0RGVzaWduKCkpOwotICAgIHdyaXRlci53cml0ZUZyb21EUigiX2Nvbm4iKTsKLSAgICBleGl0KDEpOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RyL0ZsZXhEUl9lbmQuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZHIvRmxleERSX2VuZC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYjIyNmQuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZHIvRmxleERSX2VuZC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NzAgKzAsMCBAQAotLyogQXV0aG9yczogTHV0b25nIFdhbmcgYW5kIEJhbmdxaSBYdSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImRyL0ZsZXhEUi5oIgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIGZyOwotCi12b2lkIEZsZXhEUldvcmtlcjo6ZW5kR2V0TW9kTmV0cyhzZXQ8ZnJOZXQqLCBmckJsb2NrT2JqZWN0Q29tcD4gJm1vZE5ldHMpIHsKLSAgZm9yIChhdXRvICZuZXQ6IG5ldHMpIHsKLSAgICBpZiAobmV0LT5pc01vZGlmaWVkKCkpIHsKLSAgICAgIG1vZE5ldHMuaW5zZXJ0KG5ldC0+Z2V0RnJOZXQoKSk7Ci0gICAgfQotICB9Ci0gIC8vIGNoYW5nZSBtb2RpZmllZCBmbGFnIHRvIHRydWUgaWYgYW5vdGhlciBzdWJuZXQgZ2V0IHJvdXRlZAotICBmb3IgKGF1dG8gJm5ldDogbmV0cykgewotICAgIGlmICghbmV0LT5pc01vZGlmaWVkKCkgJiYgbW9kTmV0cy5maW5kKG5ldC0+Z2V0RnJOZXQoKSkgIT0gbW9kTmV0cy5lbmQoKSkgewotICAgICAgbmV0LT5zZXRNb2RpZmllZCh0cnVlKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBGbGV4RFJXb3JrZXI6OmVuZFJlbW92ZU5ldHNfcGF0aFNlZyhmclBhdGhTZWcqIHBhdGhTZWcsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ8cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiA+ICZib3VuZFB0cykgewotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICBmclBvaW50IGJlZ2luLCBlbmQ7Ci0gIHBhdGhTZWctPmdldFBvaW50cyhiZWdpbiwgZW5kKTsKLSAgYXV0byByb3V0ZUJveCA9IGdldFJvdXRlQm94KCk7Ci0gIGF1dG8gbmV0ID0gcGF0aFNlZy0+Z2V0TmV0KCk7Ci0gIGF1dG8gcmVnaW9uUXVlcnkgPSBnZXRSZWdpb25RdWVyeSgpOwotICAvLyB2ZXJ0aWNhbCBzZWcKLSAgaWYgKGJlZ2luLngoKSA9PSBlbmQueCgpKSB7Ci0gICAgLy8gaWYgY3Jvc3Mgcm91dGVCQm94Ci0gICAgYm9vbCBjb25kaXRpb24xID0gaXNJbml0RFIoKSA/IChiZWdpbi54KCkgPCByb3V0ZUJveC5yaWdodCgpKSA6IChiZWdpbi54KCkgPD0gcm91dGVCb3gucmlnaHQoKSk7Ci0gICAgaWYgKHJvdXRlQm94LmxlZnQoKSA8PSBiZWdpbi54KCkgJiYgY29uZGl0aW9uMSAmJgotICAgICAgICAvLyEoYmVnaW4ueSgpID49IHJvdXRlQm94LnRvcCgpIHx8IGVuZC55KCkgPD0gcm91dGVCb3guYm90dG9tKCkpKSB7Ci0gICAgICAgICEoYmVnaW4ueSgpID4gcm91dGVCb3gudG9wKCkgfHwgZW5kLnkoKSA8IHJvdXRlQm94LmJvdHRvbSgpKSkgewotICAgICAgLy8gYm90dG9tIHNlZyB0byBleHQKLSAgICAgIGlmIChiZWdpbi55KCkgPCByb3V0ZUJveC5ib3R0b20oKSkgewotICAgICAgICBhdXRvIHVQYXRoU2VnID0gbWFrZV91bmlxdWU8ZnJQYXRoU2VnPigqcGF0aFNlZyk7Ci0gICAgICAgIGZyUG9pbnQgYm91bmRQdChlbmQueCgpLCBtaW4oZW5kLnkoKSwgcm91dGVCb3guYm90dG9tKCkpKTsKLSAgICAgICAgdVBhdGhTZWctPnNldFBvaW50cyhiZWdpbiwgYm91bmRQdCk7Ci0gICAgICAgIHVuaXF1ZV9wdHI8ZnJTaGFwZT4gdVNoYXBlKHN0ZDo6bW92ZSh1UGF0aFNlZykpOwotICAgICAgICBhdXRvIHNwdHIgPSB1U2hhcGUuZ2V0KCk7Ci0gICAgICAgIG5ldC0+YWRkU2hhcGUodVNoYXBlKTsKLSAgICAgICAgcmVnaW9uUXVlcnktPmFkZERST2JqKHNwdHIpOwotICAgICAgICAvLyBhZGQgY3V0U2VncwotICAgICAgICBhdXRvIGxOdW0gPSBzcHRyLT5nZXRMYXllck51bSgpOwotICAgICAgICAvL2N1dFNlZ3NbbWFrZV9wYWlyKGJvdW5kUHQsIGxOdW0pXS5pbnNlcnQoc3B0cik7Ci0gICAgICAgIGJvdW5kUHRzLmluc2VydChtYWtlX3BhaXIoYm91bmRQdCwgbE51bSkpOwotICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgY291dCA8PCJ0cmltIHBhdGhzZWcgdG8gZXh0IGJvdHRvbSIgPDxlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyB0b3Agc2VnIHRvIGV4dAotICAgICAgaWYgKGVuZC55KCkgPiByb3V0ZUJveC50b3AoKSkgewotICAgICAgICBhdXRvIHVQYXRoU2VnID0gbWFrZV91bmlxdWU8ZnJQYXRoU2VnPigqcGF0aFNlZyk7Ci0gICAgICAgIGZyUG9pbnQgYm91bmRQdChiZWdpbi54KCksIG1heChiZWdpbi55KCksIHJvdXRlQm94LnRvcCgpKSk7Ci0gICAgICAgIHVQYXRoU2VnLT5zZXRQb2ludHMoYm91bmRQdCwgZW5kKTsKLSAgICAgICAgdW5pcXVlX3B0cjxmclNoYXBlPiB1U2hhcGUoc3RkOjptb3ZlKHVQYXRoU2VnKSk7Ci0gICAgICAgIGF1dG8gc3B0ciA9IHVTaGFwZS5nZXQoKTsKLSAgICAgICAgbmV0LT5hZGRTaGFwZSh1U2hhcGUpOwotICAgICAgICByZWdpb25RdWVyeS0+YWRkRFJPYmooc3B0cik7Ci0gICAgICAgIC8vIGFkZCBjdXRTZWdzCi0gICAgICAgIGF1dG8gbE51bSA9IHNwdHItPmdldExheWVyTnVtKCk7Ci0gICAgICAgIC8vY3V0U2Vnc1ttYWtlX3BhaXIoYm91bmRQdCwgbE51bSldLmluc2VydChzcHRyKTsKLSAgICAgICAgYm91bmRQdHMuaW5zZXJ0KG1ha2VfcGFpcihib3VuZFB0LCBsTnVtKSk7Ci0gICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICBjb3V0IDw8InRyaW0gcGF0aHNlZyB0byBleHQgdG9wIiA8PGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vc3RkOjpjb3V0IDw8ICIgIHJlbW92aW5nUGF0aFNlZyAiIDw8ICYoKnBhdGhTZWcpIDw8ICIgKCIgPDwgYmVnaW4ueCgpIDw8ICIsICIgPDwgYmVnaW4ueSgpIAotICAgICAgLy8gICAgICAgICAgPDwgIikgLS0gKCIgPDwgZW5kLngoKSA8PCAiLCAiIDw8IGVuZC55KCkgPDwgIikgIiA8PCBkck5ldC0+Z2V0TmFtZSgpIDw8ICAiXG4iIDw8IHN0ZDo6Zmx1c2g7Ci0gICAgICByZWdpb25RdWVyeS0+cmVtb3ZlRFJPYmoocGF0aFNlZyk7IC8vIGRlbGV0ZSBycQotICAgICAgbmV0LT5yZW1vdmVTaGFwZShwYXRoU2VnKTsgLy8gZGVsZXRlIHNlZ21lbnQKLSAgICB9Ci0gIC8vIGhvcml6b250YWwgc2VnCi0gIH0gZWxzZSBpZiAoYmVnaW4ueSgpID09IGVuZC55KCkpIHsKLSAgICAvLyBpZiBjcm9zcyByb3V0ZUJCb3gKLSAgICBib29sIGNvbmRpdGlvbjEgPSBpc0luaXREUigpID8gKGJlZ2luLnkoKSA8IHJvdXRlQm94LnRvcCgpKSA6IChiZWdpbi55KCkgPD0gcm91dGVCb3gudG9wKCkpOwotICAgIGlmIChyb3V0ZUJveC5ib3R0b20oKSA8PSBiZWdpbi55KCkgJiYgY29uZGl0aW9uMSAmJgotICAgICAgICAvLyEoYmVnaW4ueCgpID49IHJvdXRlQm94LnJpZ2h0KCkgfHwgZW5kLngoKSA8PSByb3V0ZUJveC5sZWZ0KCkpKSB7Ci0gICAgICAgICEoYmVnaW4ueCgpID4gcm91dGVCb3gucmlnaHQoKSB8fCBlbmQueCgpIDwgcm91dGVCb3gubGVmdCgpKSkgewotICAgICAgLy8gbGVmdCBzZWcgdG8gZXh0Ci0gICAgICBpZiAoYmVnaW4ueCgpIDwgcm91dGVCb3gubGVmdCgpKSB7Ci0gICAgICAgIGF1dG8gdVBhdGhTZWcgPSBtYWtlX3VuaXF1ZTxmclBhdGhTZWc+KCpwYXRoU2VnKTsKLSAgICAgICAgZnJQb2ludCBib3VuZFB0KG1pbihlbmQueCgpLCByb3V0ZUJveC5sZWZ0KCkpLCBlbmQueSgpKTsKLSAgICAgICAgdVBhdGhTZWctPnNldFBvaW50cyhiZWdpbiwgYm91bmRQdCk7Ci0gICAgICAgIHVuaXF1ZV9wdHI8ZnJTaGFwZT4gdVNoYXBlKHN0ZDo6bW92ZSh1UGF0aFNlZykpOwotICAgICAgICBhdXRvIHNwdHIgPSB1U2hhcGUuZ2V0KCk7Ci0gICAgICAgIG5ldC0+YWRkU2hhcGUodVNoYXBlKTsKLSAgICAgICAgcmVnaW9uUXVlcnktPmFkZERST2JqKHNwdHIpOwotICAgICAgICAvLyBhZGQgY3V0U2VncwotICAgICAgICBhdXRvIGxOdW0gPSBzcHRyLT5nZXRMYXllck51bSgpOwotICAgICAgICAvL2N1dFNlZ3NbbWFrZV9wYWlyKGJvdW5kUHQsIGxOdW0pXS5pbnNlcnQoc3B0cik7Ci0gICAgICAgIGJvdW5kUHRzLmluc2VydChtYWtlX3BhaXIoYm91bmRQdCwgbE51bSkpOwotICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgY291dCA8PCJ0cmltIHBhdGhzZWcgdG8gZXh0IGxlZnQiIDw8ZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gcmlnaHQgc2VnIHRvIGV4dAotICAgICAgaWYgKGVuZC54KCkgPiByb3V0ZUJveC5yaWdodCgpKSB7Ci0gICAgICAgIGF1dG8gdVBhdGhTZWcgPSBtYWtlX3VuaXF1ZTxmclBhdGhTZWc+KCpwYXRoU2VnKTsKLSAgICAgICAgZnJQb2ludCBib3VuZFB0KG1heChiZWdpbi54KCksIHJvdXRlQm94LnJpZ2h0KCkpLCBiZWdpbi55KCkpOwotICAgICAgICB1UGF0aFNlZy0+c2V0UG9pbnRzKGJvdW5kUHQsIGVuZCk7Ci0gICAgICAgIHVuaXF1ZV9wdHI8ZnJTaGFwZT4gdVNoYXBlKHN0ZDo6bW92ZSh1UGF0aFNlZykpOwotICAgICAgICBhdXRvIHNwdHIgPSB1U2hhcGUuZ2V0KCk7Ci0gICAgICAgIG5ldC0+YWRkU2hhcGUodVNoYXBlKTsKLSAgICAgICAgcmVnaW9uUXVlcnktPmFkZERST2JqKHNwdHIpOwotICAgICAgICAvLyBhZGQgY3V0U2VncwotICAgICAgICBhdXRvIGxOdW0gPSBzcHRyLT5nZXRMYXllck51bSgpOwotICAgICAgICAvL2N1dFNlZ3NbbWFrZV9wYWlyKGJvdW5kUHQsIGxOdW0pXS5pbnNlcnQoc3B0cik7Ci0gICAgICAgIGJvdW5kUHRzLmluc2VydChtYWtlX3BhaXIoYm91bmRQdCwgbE51bSkpOwotICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgY291dCA8PCJ0cmltIHBhdGhzZWcgdG8gZXh0IHJpZ2h0IiA8PGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJlZ2lvblF1ZXJ5LT5yZW1vdmVEUk9iaihwYXRoU2VnKTsgLy8gZGVsZXRlIHJxCi0gICAgICBuZXQtPnJlbW92ZVNoYXBlKHBhdGhTZWcpOyAvLyBkZWxldGUgc2VnbWVudAotICAgIH0KLSAgfQotfQotCi12b2lkIEZsZXhEUldvcmtlcjo6ZW5kUmVtb3ZlTmV0c192aWEoZnJWaWEqIHZpYSkgewotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLSAgYXV0byBncmlkQkJveCA9IGdldFJvdXRlQm94KCk7Ci0gIGF1dG8gcmVnaW9uUXVlcnkgPSBnZXRSZWdpb25RdWVyeSgpOwotICBhdXRvIG5ldCA9IHZpYS0+Z2V0TmV0KCk7Ci0gIGZyUG9pbnQgdmlhUG9pbnQ7Ci0gIHZpYS0+Z2V0T3JpZ2luKHZpYVBvaW50KTsKLSAgYm9vbCBjb25kaXRpb24xID0gaXNJbml0RFIoKSA/IAotICAgICAgICAgICAgICAgICAgICAodmlhUG9pbnQueCgpIDwgIGdyaWRCQm94LnJpZ2h0KCkgJiYgdmlhUG9pbnQueSgpIDwgIGdyaWRCQm94LnRvcCgpKSA6IAotICAgICAgICAgICAgICAgICAgICAodmlhUG9pbnQueCgpIDw9IGdyaWRCQm94LnJpZ2h0KCkgJiYgdmlhUG9pbnQueSgpIDw9IGdyaWRCQm94LnRvcCgpKTsKLSAgaWYgKHZpYVBvaW50LngoKSA+PSBncmlkQkJveC5sZWZ0KCkgJiYgdmlhUG9pbnQueSgpID49IGdyaWRCQm94LmJvdHRvbSgpICYmIGNvbmRpdGlvbjEpIHsKLSAgICByZWdpb25RdWVyeS0+cmVtb3ZlRFJPYmoodmlhKTsgLy8gZGVsZXRlIHJxCi0gICAgbmV0LT5yZW1vdmVWaWEodmlhKTsKLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBjb3V0IDw8ImRlbGV0ZSB2aWEgaW4gcm91dGUiIDw8ZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBGbGV4RFJXb3JrZXI6OmVuZFJlbW92ZU5ldHNfcGF0Y2hXaXJlKGZyUGF0Y2hXaXJlKiBwd2lyZSkgewotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLSAgYXV0byBncmlkQkJveCA9IGdldFJvdXRlQm94KCk7Ci0gIGF1dG8gcmVnaW9uUXVlcnkgPSBnZXRSZWdpb25RdWVyeSgpOwotICBhdXRvIG5ldCA9IHB3aXJlLT5nZXROZXQoKTsKLSAgZnJQb2ludCBvcmlnaW47Ci0gIHB3aXJlLT5nZXRPcmlnaW4ob3JpZ2luKTsKLSAgYm9vbCBjb25kaXRpb24xID0gaXNJbml0RFIoKSA/IAotICAgICAgICAgICAgICAgICAgICAob3JpZ2luLngoKSA8ICBncmlkQkJveC5yaWdodCgpICYmIG9yaWdpbi55KCkgPCAgZ3JpZEJCb3gudG9wKCkpIDogCi0gICAgICAgICAgICAgICAgICAgIChvcmlnaW4ueCgpIDw9IGdyaWRCQm94LnJpZ2h0KCkgJiYgb3JpZ2luLnkoKSA8PSBncmlkQkJveC50b3AoKSk7Ci0gIGlmIChvcmlnaW4ueCgpID49IGdyaWRCQm94LmxlZnQoKSAmJiBvcmlnaW4ueSgpID49IGdyaWRCQm94LmJvdHRvbSgpICYmIGNvbmRpdGlvbjEpIHsKLSAgICByZWdpb25RdWVyeS0+cmVtb3ZlRFJPYmoocHdpcmUpOyAvLyBkZWxldGUgcnEKLSAgICBuZXQtPnJlbW92ZVBhdGNoV2lyZShwd2lyZSk7Ci0gICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgY291dCA8PCJkZWxldGUgcHdpcmUgaW4gcm91dGUiIDw8ZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBGbGV4RFJXb3JrZXI6OmVuZFJlbW92ZU5ldHMoc2V0PGZyTmV0KiwgZnJCbG9ja09iamVjdENvbXA+ICZtb2ROZXRzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxmck5ldCosIHNldDxwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+ID4sIGZyQmxvY2tPYmplY3RDb21wPiAmYm91bmRQdHMpIHsKLSAgdmVjdG9yPGZyQmxvY2tPYmplY3QqPiByZXN1bHQ7Ci0gIGdldFJlZ2lvblF1ZXJ5KCktPnF1ZXJ5RFJPYmooZ2V0Um91dGVCb3goKSwgcmVzdWx0KTsKLSAgZm9yIChhdXRvIHJwdHI6IHJlc3VsdCkgewotICAgIGlmIChycHRyLT50eXBlSWQoKSA9PSBmcmNQYXRoU2VnKSB7Ci0gICAgICBhdXRvIGNwdHIgPSBzdGF0aWNfY2FzdDxmclBhdGhTZWcqPihycHRyKTsKLSAgICAgIGlmIChjcHRyLT5oYXNOZXQoKSkgewotICAgICAgICBpZiAobW9kTmV0cy5maW5kKGNwdHItPmdldE5ldCgpKSAhPSBtb2ROZXRzLmVuZCgpKSB7Ci0gICAgICAgICAgZW5kUmVtb3ZlTmV0c19wYXRoU2VnKGNwdHIsIGJvdW5kUHRzW2NwdHItPmdldE5ldCgpXSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiRXJyb3I6IGVuZFJlbW92ZU5ldCBoYXNOZXQoKSBlbXB0eSIgPDxlbmRsOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocnB0ci0+dHlwZUlkKCkgPT0gZnJjVmlhKSB7Ci0gICAgICBhdXRvIGNwdHIgPSBzdGF0aWNfY2FzdDxmclZpYSo+KHJwdHIpOwotICAgICAgaWYgKGNwdHItPmhhc05ldCgpKSB7Ci0gICAgICAgIGlmIChtb2ROZXRzLmZpbmQoY3B0ci0+Z2V0TmV0KCkpICE9IG1vZE5ldHMuZW5kKCkpIHsKLSAgICAgICAgICBlbmRSZW1vdmVOZXRzX3ZpYShjcHRyKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogZW5kUmVtb3ZlTmV0IGhhc05ldCgpIGVtcHR5IiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChycHRyLT50eXBlSWQoKSA9PSBmcmNQYXRjaFdpcmUpIHsKLSAgICAgIGF1dG8gY3B0ciA9IHN0YXRpY19jYXN0PGZyUGF0Y2hXaXJlKj4ocnB0cik7Ci0gICAgICBpZiAoY3B0ci0+aGFzTmV0KCkpIHsKLSAgICAgICAgaWYgKG1vZE5ldHMuZmluZChjcHRyLT5nZXROZXQoKSkgIT0gbW9kTmV0cy5lbmQoKSkgewotICAgICAgICAgIGVuZFJlbW92ZU5ldHNfcGF0Y2hXaXJlKGNwdHIpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb3V0IDw8IkVycm9yOiBlbmRSZW1vdmVOZXQgaGFzTmV0KCkgZW1wdHkiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgY291dCA8PCJFcnJvcjogZW5kUmVtb3ZlTmV0cyB1bnN1cHBvcnRlZCB0eXBlIiA8PGVuZGw7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgRmxleERSV29ya2VyOjplbmRBZGROZXRzX3BhdGhTZWcoZHJQYXRoU2VnKiBwYXRoU2VnLyosIG1hcDxwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+LCBzZXQ8ZnJCbG9ja09iamVjdCo+ID4gJmN1dFNlZ3MqLykgewotICAvL2NvdXQgPDwiYWRkIHBhdGhzZWciIDw8ZW5kbDsKLSAgYXV0byBuZXQgPSBwYXRoU2VnLT5nZXROZXQoKS0+Z2V0RnJOZXQoKTsKLSAgLyoKLSAgZnJQb2ludCBicCwgZXA7Ci0gIHBhdGhTZWctPmdldFBvaW50cyhicCwgZXApOwotICBhdXRvIGxOdW0gPSBwYXRoU2VnLT5nZXRMYXllck51bSgpOwotICBib29sIGlzSG9yelNlZyA9IChicC55KCkgPT0gZXAueSgpKTsKLSAgYXV0byAmcmJveCA9IGdldFJvdXRlQm94KCk7Ci0gIC8vYm9vbCBtZXJnZWQgPSBmYWxzZTsKLSAgLy8gaG9yaXpvbnRhbCBzZWdtZW50Ci0gIGlmIChpc0hvcnpTZWcpIHsKLSAgICAvLyBjaGVjayBpZiBpdCBjYW4gYmUgbWVyZ2VkIG9uIGxlZnQgYm91bmRhcnkKLSAgICBmclBhdGhTZWcqIG1lcmdlV2l0aEwgPSBudWxscHRyOwotICAgIGZyUG9pbnQgICAgcEw7Ci0gICAgZnJQYXRoU2VnKiBtZXJnZVdpdGhSID0gbnVsbHB0cjsKLSAgICBmclBvaW50ICAgIHBSOwotICAgIGlmIChicC54KCkgPT0gcmJveC5sZWZ0KCkgJiYgY3V0U2Vncy5maW5kKG1ha2VfcGFpcihicCwgbE51bSkpICE9IGN1dFNlZ3MuZW5kKCkpIHsKLSAgICAgIGZvciAoYXV0byAmb2JqOiBjdXRTZWdzLmZpbmQobWFrZV9wYWlyKGJwLCBsTnVtKSktPnNlY29uZCkgewotICAgICAgICBpZiAob2JqLT50eXBlSWQoKSA9PSBmcmNQYXRoU2VnKSB7Ci0gICAgICAgICAgYXV0byBuYnJTZWcgPSBzdGF0aWNfY2FzdDxmclBhdGhTZWcqPihvYmopOwotICAgICAgICAgIGZyUG9pbnQgbmJyQnAsIG5ickVwOwotICAgICAgICAgIG5iclNlZy0+Z2V0UG9pbnRzKG5ickJwLCBuYnJFcCk7Ci0gICAgICAgICAgaWYgKG5ickJwLnkoKSA9PSBuYnJFcC55KCkpIHsKLSAgICAgICAgICAgIG1lcmdlV2l0aEwgPSBuYnJTZWc7Ci0gICAgICAgICAgICBwTC5zZXQobmJyQnApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIGNoZWNrIGlmIGl0IGNhbiBiZSBtZXJnZWQgb24gcmlnaHQgYm91bmRhcnkKLSAgICBpZiAoZXAueCgpID09IHJib3gucmlnaHQoKSAmJiBjdXRTZWdzLmZpbmQobWFrZV9wYWlyKGVwLCBsTnVtKSkgIT0gY3V0U2Vncy5lbmQoKSkgewotICAgICAgZm9yIChhdXRvICZvYmo6IGN1dFNlZ3MuZmluZChtYWtlX3BhaXIoZXAsIGxOdW0pKS0+c2Vjb25kKSB7Ci0gICAgICAgIGlmIChvYmotPnR5cGVJZCgpID09IGZyY1BhdGhTZWcpIHsKLSAgICAgICAgICBhdXRvIG5iclNlZyA9IHN0YXRpY19jYXN0PGZyUGF0aFNlZyo+KG9iaik7Ci0gICAgICAgICAgZnJQb2ludCBuYnJCcCwgbmJyRXA7Ci0gICAgICAgICAgbmJyU2VnLT5nZXRQb2ludHMobmJyQnAsIG5ickVwKTsKLSAgICAgICAgICBpZiAobmJyQnAueSgpID09IG5ickVwLnkoKSkgewotICAgICAgICAgICAgbWVyZ2VXaXRoUiA9IG5iclNlZzsKLSAgICAgICAgICAgIHBSLnNldChuYnJFcCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1lcmdlV2l0aEwpIHsKLSAgICAgIGJwLnNldChwTCk7Ci0gICAgICBnZXRSZWdpb25RdWVyeSgpLT5yZW1vdmVEUk9iaihtZXJnZVdpdGhMKTsKLSAgICAgIG5ldC0+cmVtb3ZlU2hhcGUobWVyZ2VXaXRoTCk7Ci0gICAgfQotICAgIGlmIChtZXJnZVdpdGhSKSB7Ci0gICAgICBlcC5zZXQocFIpOwotICAgICAgZ2V0UmVnaW9uUXVlcnkoKS0+cmVtb3ZlRFJPYmoobWVyZ2VXaXRoUik7Ci0gICAgICBuZXQtPnJlbW92ZVNoYXBlKG1lcmdlV2l0aFIpOwotICAgIH0KLSAgLy8gdmVydGljYWwgc2VnbWVudAotICB9IGVsc2UgewotICAgIC8vIGNoZWNrIGlmIGl0IGNhbiBiZSBtZXJnZWQgb24gYm90dG9tIGJvdW5kYXJ5Ci0gICAgZnJQYXRoU2VnKiBtZXJnZVdpdGhCID0gbnVsbHB0cjsKLSAgICBmclBvaW50ICAgIHBCOwotICAgIGZyUGF0aFNlZyogbWVyZ2VXaXRoVCA9IG51bGxwdHI7Ci0gICAgZnJQb2ludCAgICBwVDsKLSAgICBpZiAoYnAueSgpID09IHJib3guYm90dG9tKCkgJiYgY3V0U2Vncy5maW5kKG1ha2VfcGFpcihicCwgbE51bSkpICE9IGN1dFNlZ3MuZW5kKCkpIHsKLSAgICAgIGZvciAoYXV0byAmb2JqOiBjdXRTZWdzLmZpbmQobWFrZV9wYWlyKGJwLCBsTnVtKSktPnNlY29uZCkgewotICAgICAgICBpZiAob2JqLT50eXBlSWQoKSA9PSBmcmNQYXRoU2VnKSB7Ci0gICAgICAgICAgYXV0byBuYnJTZWcgPSBzdGF0aWNfY2FzdDxmclBhdGhTZWcqPihvYmopOwotICAgICAgICAgIGZyUG9pbnQgbmJyQnAsIG5ickVwOwotICAgICAgICAgIG5iclNlZy0+Z2V0UG9pbnRzKG5ickJwLCBuYnJFcCk7Ci0gICAgICAgICAgaWYgKG5ickJwLngoKSA9PSBuYnJFcC54KCkpIHsKLSAgICAgICAgICAgIG1lcmdlV2l0aEIgPSBuYnJTZWc7Ci0gICAgICAgICAgICBwQi5zZXQobmJyQnApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIGNoZWNrIGlmIGl0IGNhbiBiZSBtZXJnZWQgb24gcmlnaHQgYm91bmRhcnkKLSAgICBpZiAoZXAueSgpID09IHJib3gudG9wKCkgJiYgY3V0U2Vncy5maW5kKG1ha2VfcGFpcihlcCwgbE51bSkpICE9IGN1dFNlZ3MuZW5kKCkpIHsKLSAgICAgIGZvciAoYXV0byAmb2JqOiBjdXRTZWdzLmZpbmQobWFrZV9wYWlyKGVwLCBsTnVtKSktPnNlY29uZCkgewotICAgICAgICBpZiAob2JqLT50eXBlSWQoKSA9PSBmcmNQYXRoU2VnKSB7Ci0gICAgICAgICAgYXV0byBuYnJTZWcgPSBzdGF0aWNfY2FzdDxmclBhdGhTZWcqPihvYmopOwotICAgICAgICAgIGZyUG9pbnQgbmJyQnAsIG5ickVwOwotICAgICAgICAgIG5iclNlZy0+Z2V0UG9pbnRzKG5ickJwLCBuYnJFcCk7Ci0gICAgICAgICAgaWYgKG5ickJwLngoKSA9PSBuYnJFcC54KCkpIHsKLSAgICAgICAgICAgIG1lcmdlV2l0aFQgPSBuYnJTZWc7Ci0gICAgICAgICAgICBwVC5zZXQobmJyRXApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChtZXJnZVdpdGhCKSB7Ci0gICAgICBicC5zZXQocEIpOwotICAgICAgZ2V0UmVnaW9uUXVlcnkoKS0+cmVtb3ZlRFJPYmoobWVyZ2VXaXRoQik7Ci0gICAgICBuZXQtPnJlbW92ZVNoYXBlKG1lcmdlV2l0aEIpOwotICAgIH0KLSAgICBpZiAobWVyZ2VXaXRoVCkgewotICAgICAgZXAuc2V0KHBUKTsKLSAgICAgIGdldFJlZ2lvblF1ZXJ5KCktPnJlbW92ZURST2JqKG1lcmdlV2l0aFQpOwotICAgICAgbmV0LT5yZW1vdmVTaGFwZShtZXJnZVdpdGhUKTsKLSAgICB9Ci0gIH0KLSAgcGF0aFNlZy0+c2V0UG9pbnRzKGJwLCBlcCk7Ci0gICovCi0gIHVuaXF1ZV9wdHI8ZnJTaGFwZT4gdVNoYXBlID0gbWFrZV91bmlxdWU8ZnJQYXRoU2VnPigqcGF0aFNlZyk7Ci0gIGF1dG8gcnB0ciA9IHVTaGFwZS5nZXQoKTsKLSAgbmV0LT5hZGRTaGFwZSh1U2hhcGUpOwotICBnZXRSZWdpb25RdWVyeSgpLT5hZGREUk9iaihycHRyKTsKLX0KLQotdm9pZCBGbGV4RFJXb3JrZXI6OmVuZEFkZE5ldHNfdmlhKGRyVmlhKiB2aWEpIHsKLSAgYXV0byBuZXQgPSB2aWEtPmdldE5ldCgpLT5nZXRGck5ldCgpOwotICB1bmlxdWVfcHRyPGZyVmlhPiB1VmlhID0gbWFrZV91bmlxdWU8ZnJWaWE+KCp2aWEpOwotICBhdXRvIHJwdHIgPSB1VmlhLmdldCgpOwotICBuZXQtPmFkZFZpYSh1VmlhKTsKLSAgZ2V0UmVnaW9uUXVlcnkoKS0+YWRkRFJPYmoocnB0cik7Ci19Ci0KLXZvaWQgRmxleERSV29ya2VyOjplbmRBZGROZXRzX3BhdGNoV2lyZShkclBhdGNoV2lyZSogcHdpcmUpIHsKLSAgYXV0byBuZXQgPSBwd2lyZS0+Z2V0TmV0KCktPmdldEZyTmV0KCk7Ci0gIHVuaXF1ZV9wdHI8ZnJTaGFwZT4gdVNoYXBlID0gbWFrZV91bmlxdWU8ZnJQYXRjaFdpcmU+KCpwd2lyZSk7Ci0gIGF1dG8gcnB0ciA9IHVTaGFwZS5nZXQoKTsKLSAgbmV0LT5hZGRQYXRjaFdpcmUodVNoYXBlKTsKLSAgZ2V0UmVnaW9uUXVlcnkoKS0+YWRkRFJPYmoocnB0cik7Ci19Ci0KLXZvaWQgRmxleERSV29ya2VyOjplbmRBZGROZXRzX21lcmdlKGZyTmV0KiBuZXQsIHNldDxwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+ID4gJmJvdW5kUHRzKSB7Ci0gIHZlY3RvcjxycV9ycHRyX3ZhbHVlX3Q8ZnJCbG9ja09iamVjdD4gPiByZXN1bHQ7Ci0gIHZlY3RvcjxmckJsb2NrT2JqZWN0Kj4gZHJPYmpzOwotICB2ZWN0b3I8ZnJQYXRoU2VnKj4gaG9yelBhdGhTZWdzOwotICB2ZWN0b3I8ZnJQYXRoU2VnKj4gdmVydFBhdGhTZWdzOwotICBhdXRvIHJlZ2lvblF1ZXJ5ID0gZ2V0UmVnaW9uUXVlcnkoKTsKLSAgZm9yIChhdXRvICZbcHQsIGxOdW1dOiBib3VuZFB0cykgewotICAgIGJvb2wgc2tpcCA9IGZhbHNlOwotICAgIHJlc3VsdC5jbGVhcigpOwotICAgIHJlZ2lvblF1ZXJ5LT5xdWVyeShmckJveChwdCwgcHQpLCBsTnVtLCByZXN1bHQpOwotICAgIGZvciAoYXV0byAmW2J4LCBvYmpdOiByZXN1bHQpIHsKLSAgICAgIGlmIChvYmotPnR5cGVJZCgpID09IGZyY0luc3RUZXJtKSB7Ci0gICAgICAgIGF1dG8gaW5zdFRlcm0gPSBzdGF0aWNfY2FzdDxmckluc3RUZXJtKj4ob2JqKTsKLSAgICAgICAgaWYgKGluc3RUZXJtLT5nZXROZXQoKSA9PSBuZXQpIHsKLSAgICAgICAgICBza2lwID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChvYmotPnR5cGVJZCgpID09IGZyY1Rlcm0pIHsKLSAgICAgICAgYXV0byB0ZXJtID0gc3RhdGljX2Nhc3Q8ZnJUZXJtKj4ob2JqKTsKLSAgICAgICAgaWYgKHRlcm0tPmdldE5ldCgpID09IG5ldCkgewotICAgICAgICAgIHNraXAgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChza2lwKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgLy8gZ2V0IGFsbCBkck9ianMKLSAgICBkck9ianMuY2xlYXIoKTsKLSAgICBob3J6UGF0aFNlZ3MuY2xlYXIoKTsKLSAgICB2ZXJ0UGF0aFNlZ3MuY2xlYXIoKTsKLSAgICByZWdpb25RdWVyeS0+cXVlcnlEUk9iaihmckJveChwdCwgcHQpLCBsTnVtLCBkck9ianMpOwotICAgIGZvciAoYXV0byAmb2JqOiBkck9ianMpIHsKLSAgICAgIGlmIChvYmotPnR5cGVJZCgpID09IGZyY1BhdGhTZWcpIHsKLSAgICAgICAgYXV0byBwcyA9IHN0YXRpY19jYXN0PGZyUGF0aFNlZyo+KG9iaik7Ci0gICAgICAgIGlmICghKHBzLT5nZXROZXQoKSA9PSBuZXQpKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZnJQb2ludCBicCwgZXA7Ci0gICAgICAgIHBzLT5nZXRQb2ludHMoYnAsIGVwKTsKLSAgICAgICAgaWYgKGJwID09IHB0IHx8IGVwID09IHB0KSB7Ci0gICAgICAgICAgLy8gdmVydGljYWwKLSAgICAgICAgICBpZiAoYnAueCgpID09IGVwLngoKSkgewotICAgICAgICAgICAgdmVydFBhdGhTZWdzLnB1c2hfYmFjayhwcyk7Ci0gICAgICAgICAgLy8gaG9yaXpvbnRhbAotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBob3J6UGF0aFNlZ3MucHVzaF9iYWNrKHBzKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gbWVyZ2UgaG9yeiBwYXRoc2VnCi0gICAgaWYgKChpbnQpaG9yelBhdGhTZWdzLnNpemUoKSA9PSAyICYmIHZlcnRQYXRoU2Vncy5lbXB0eSgpKSB7Ci0gICAgICB1bmlxdWVfcHRyPGZyU2hhcGU+IHVTaGFwZSA9IG1ha2VfdW5pcXVlPGZyUGF0aFNlZz4oKmhvcnpQYXRoU2Vnc1swXSk7Ci0gICAgICBhdXRvIHJwdHIgPSBzdGF0aWNfY2FzdDxmclBhdGhTZWcqPih1U2hhcGUuZ2V0KCkpOwotICAgICAgZnJQb2ludCBicDEsIGVwMSwgYnAyLCBlcDI7Ci0gICAgICBob3J6UGF0aFNlZ3NbMF0tPmdldFBvaW50cyhicDEsIGVwMSk7Ci0gICAgICBob3J6UGF0aFNlZ3NbMV0tPmdldFBvaW50cyhicDIsIGVwMik7Ci0gICAgICBmclBvaW50IGJwKG1pbihicDEueCgpLCBicDIueCgpKSwgYnAxLnkoKSk7Ci0gICAgICBmclBvaW50IGVwKG1heChlcDEueCgpLCBlcDIueCgpKSwgZXAxLnkoKSk7Ci0gICAgICBycHRyLT5zZXRQb2ludHMoYnAsIGVwKTsKLSAgICAgIAotICAgICAgcmVnaW9uUXVlcnktPnJlbW92ZURST2JqKGhvcnpQYXRoU2Vnc1swXSk7Ci0gICAgICByZWdpb25RdWVyeS0+cmVtb3ZlRFJPYmooaG9yelBhdGhTZWdzWzFdKTsKLSAgICAgIG5ldC0+cmVtb3ZlU2hhcGUoaG9yelBhdGhTZWdzWzBdKTsKLSAgICAgIG5ldC0+cmVtb3ZlU2hhcGUoaG9yelBhdGhTZWdzWzFdKTsKLQotICAgICAgbmV0LT5hZGRTaGFwZSh1U2hhcGUpOwotICAgICAgcmVnaW9uUXVlcnktPmFkZERST2JqKHJwdHIpOwotICAgIH0KLSAgICBpZiAoKGludCl2ZXJ0UGF0aFNlZ3Muc2l6ZSgpID09IDIgJiYgaG9yelBhdGhTZWdzLmVtcHR5KCkpIHsKLSAgICAgIHVuaXF1ZV9wdHI8ZnJTaGFwZT4gdVNoYXBlID0gbWFrZV91bmlxdWU8ZnJQYXRoU2VnPigqdmVydFBhdGhTZWdzWzBdKTsKLSAgICAgIGF1dG8gcnB0ciA9IHN0YXRpY19jYXN0PGZyUGF0aFNlZyo+KHVTaGFwZS5nZXQoKSk7Ci0gICAgICBmclBvaW50IGJwMSwgZXAxLCBicDIsIGVwMjsKLSAgICAgIHZlcnRQYXRoU2Vnc1swXS0+Z2V0UG9pbnRzKGJwMSwgZXAxKTsKLSAgICAgIHZlcnRQYXRoU2Vnc1sxXS0+Z2V0UG9pbnRzKGJwMiwgZXAyKTsKLSAgICAgIGZyUG9pbnQgYnAoYnAxLngoKSwgbWluKGJwMS55KCksIGJwMi55KCkpKTsKLSAgICAgIGZyUG9pbnQgZXAoZXAxLngoKSwgbWF4KGVwMS55KCksIGVwMi55KCkpKTsKLSAgICAgIHJwdHItPnNldFBvaW50cyhicCwgZXApOwotICAgICAgCi0gICAgICByZWdpb25RdWVyeS0+cmVtb3ZlRFJPYmoodmVydFBhdGhTZWdzWzBdKTsKLSAgICAgIHJlZ2lvblF1ZXJ5LT5yZW1vdmVEUk9iaih2ZXJ0UGF0aFNlZ3NbMV0pOwotICAgICAgbmV0LT5yZW1vdmVTaGFwZSh2ZXJ0UGF0aFNlZ3NbMF0pOwotICAgICAgbmV0LT5yZW1vdmVTaGFwZSh2ZXJ0UGF0aFNlZ3NbMV0pOwotCi0gICAgICBuZXQtPmFkZFNoYXBlKHVTaGFwZSk7Ci0gICAgICByZWdpb25RdWVyeS0+YWRkRFJPYmoocnB0cik7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgRmxleERSV29ya2VyOjplbmRBZGROZXRzKG1hcDxmck5ldCosIHNldDxwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+ID4sIGZyQmxvY2tPYmplY3RDb21wPiAmYm91bmRQdHMpIHsKLSAgZm9yKGF1dG8gJm5ldDogbmV0cykgewotICAgIGlmICghbmV0LT5pc01vZGlmaWVkKCkpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICAvL2F1dG8gZk5ldCA9IG5ldC0+Z2V0RnJOZXQoKTsKLSAgICAvL2ZvciAoYXV0byAmY29ubkZpZzogbmV0LT5nZXRSb3V0ZUNvbm5GaWdzKCkpIHsKLSAgICBmb3IgKGF1dG8gJmNvbm5GaWc6IG5ldC0+Z2V0QmVzdFJvdXRlQ29ubkZpZ3MoKSkgewotICAgICAgaWYgKGNvbm5GaWctPnR5cGVJZCgpID09IGRyY1BhdGhTZWcpIHsKLSAgICAgICAgZW5kQWRkTmV0c19wYXRoU2VnKHN0YXRpY19jYXN0PGRyUGF0aFNlZyo+KGNvbm5GaWcuZ2V0KCkpLyosIGN1dFNlZ3NbZk5ldF0qLyk7Ci0gICAgICB9IGVsc2UgaWYgKGNvbm5GaWctPnR5cGVJZCgpID09IGRyY1ZpYSkgewotICAgICAgICBlbmRBZGROZXRzX3ZpYShzdGF0aWNfY2FzdDxkclZpYSo+KGNvbm5GaWcuZ2V0KCkpKTsKLSAgICAgIH0gZWxzZSBpZiAoY29ubkZpZy0+dHlwZUlkKCkgPT0gZHJjUGF0Y2hXaXJlKSB7Ci0gICAgICAgIGVuZEFkZE5ldHNfcGF0Y2hXaXJlKHN0YXRpY19jYXN0PGRyUGF0Y2hXaXJlKj4oY29ubkZpZy5nZXQoKSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogZW5kQWRkTmV0cyB1bnN1cHBvcnRlZCB0eXBlIiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGZvciAoYXV0byAmW25ldCwgYlB0c106IGJvdW5kUHRzKSB7Ci0gICAgZW5kQWRkTmV0c19tZXJnZShuZXQsIGJQdHMpOwotICB9Ci19Ci0KLS8qCi12b2lkIEZsZXhEUldvcmtlcjo6ZW5kRmlsdGVyQ3V0U2VncyhtYXA8ZnJOZXQqLCBtYXA8cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiwgc2V0PGZyQmxvY2tPYmplY3QqPiA+ID4gJmN1dFNlZ3MpIHsKLSAgdmVjdG9yPHJxX3JwdHJfdmFsdWVfdDxmckJsb2NrT2JqZWN0PiA+IHJlc3VsdDsKLSAgYXV0byByZWdpb25RdWVyeSA9IGdldFJlZ2lvblF1ZXJ5KCk7Ci0gIC8vIHJlbW92ZSBtZXJnaW5nIHBvaW50IGlmIHRoZXJlIGlzIGEgcGluCi0gIGZvciAoYXV0byAmW25ldCwgbXBdOiBjdXRTZWdzKSB7Ci0gICAgLy9mb3IgKGF1dG8gJltwciwgb2JqU106IG1wKSB7Ci0gICAgZm9yIChhdXRvIGl0ID0gbXAuYmVnaW4oKTsgaXQgIT0gbXAuZW5kKCk7ICkgewotICAgICAgYXV0byBsb2NhbEl0ID0gaXQ7Ci0gICAgICArK2l0OwotICAgICAgYXV0byAmcHIgPSBsb2NhbEl0LT5maXJzdDsKLSAgICAgIC8vYXV0byAmb2JqUyA9IGxvY2FsSXQtPnNlY29uZDsKLSAgICAgIHJlc3VsdC5jbGVhcigpOwotICAgICAgYXV0byAmW3B0LCBsTnVtXSA9IHByOwotICAgICAgcmVnaW9uUXVlcnktPnF1ZXJ5KGZyQm94KHB0LCBwdCksIGxOdW0sIHJlc3VsdCk7Ci0gICAgICBmb3IgKGF1dG8gJltieCwgb2JqXTogcmVzdWx0KSB7Ci0gICAgICAgIGlmIChvYmotPnR5cGVJZCgpID09IGZyY0luc3RUZXJtKSB7Ci0gICAgICAgICAgYXV0byBpbnN0VGVybSA9IHN0YXRpY19jYXN0PGZySW5zdFRlcm0qPihvYmopOwotICAgICAgICAgIGlmIChpbnN0VGVybS0+Z2V0TmV0KCkgPT0gbmV0KSB7Ci0gICAgICAgICAgICBtcC5lcmFzZShsb2NhbEl0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChvYmotPnR5cGVJZCgpID09IGZyY1Rlcm0pIHsKLSAgICAgICAgICBhdXRvIHRlcm0gPSBzdGF0aWNfY2FzdDxmclRlcm0qPihvYmopOwotICAgICAgICAgIGlmICh0ZXJtLT5nZXROZXQoKSA9PSBuZXQpIHsKLSAgICAgICAgICAgIG1wLmVyYXNlKGxvY2FsSXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIC8vIHJlbW92ZSBtZXJnaW5nIHBvaW50IGlmIHRoZXJlIGlzIGEgY3Jvc3Npbmcgc2VnbWVudCAKLX0KLSovCi0KLXZvaWQgRmxleERSV29ya2VyOjplbmRSZW1vdmVNYXJrZXJzKCkgewotICBhdXRvIHJlZ2lvblF1ZXJ5ID0gZ2V0UmVnaW9uUXVlcnkoKTsKLSAgYXV0byB0b3BCbG9jayA9IGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpOwotICB2ZWN0b3I8ZnJNYXJrZXIqPiByZXN1bHQ7Ci0gIHJlZ2lvblF1ZXJ5LT5xdWVyeU1hcmtlcihnZXRSb3V0ZUJveCgpLCByZXN1bHQpOwotICBmb3IgKGF1dG8gbXB0cjogcmVzdWx0KSB7Ci0gICAgcmVnaW9uUXVlcnktPnJlbW92ZU1hcmtlcihtcHRyKTsKLSAgICB0b3BCbG9jay0+cmVtb3ZlTWFya2VyKG1wdHIpOwotICB9Ci19Ci0KLXZvaWQgRmxleERSV29ya2VyOjplbmRBZGRNYXJrZXJzKCkgewotICBhdXRvIHJlZ2lvblF1ZXJ5ID0gZ2V0UmVnaW9uUXVlcnkoKTsKLSAgYXV0byB0b3BCbG9jayA9IGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpOwotICBmckJveCBtQm94OwotICAvL2ZvciAoYXV0byAmbTogZ2V0TWFya2VycygpKSB7Ci0gIGZvciAoYXV0byAmbTogZ2V0QmVzdE1hcmtlcnMoKSkgewotICAgIG0uZ2V0QkJveChtQm94KTsKLSAgICBpZiAoZ2V0Um91dGVCb3goKS5vdmVybGFwcyhtQm94KSkgewotICAgICAgYXV0byB1cHRyID0gbWFrZV91bmlxdWU8ZnJNYXJrZXI+KG0pOwotICAgICAgYXV0byBwdHIgPSB1cHRyLmdldCgpOwotICAgICAgcmVnaW9uUXVlcnktPmFkZE1hcmtlcihwdHIpOwotICAgICAgdG9wQmxvY2stPmFkZE1hcmtlcih1cHRyKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBGbGV4RFJXb3JrZXI6OmVuZCgpIHsKLSAgLy8gc2tpcCBpZiBjdXJyZW50IGNsaXAgZG9lcyBub3QgaGF2ZSBpbnB1dCBEUkNzCi0gIC8vIHJpcHVwTW9kZSA9IDAgbXVzdCBoYXZlIGVuYWJsZURSQyA9IHRydWUgaW4gcHJldmlvdXMgaXRlcmF0aW9uCi0gIGlmIChpc0VuYWJsZURSQygpICYmIGdldFJpcHVwTW9kZSgpID09IDAgJiYgZ2V0SW5pdE51bU1hcmtlcnMoKSA9PSAwKSB7Ci0gICAgcmV0dXJuOwotICAvLyBkbyBub3Qgd3JpdGUgYmFjayBpZiBjdXJyZW50IGNsaXAgaXMgd29yc2UgdGhhbiBpbnB1dAotICB9IGVsc2UgaWYgKGlzRW5hYmxlRFJDKCkgJiYgZ2V0UmlwdXBNb2RlKCkgPT0gMCAmJiBnZXROdW1NYXJrZXJzKCkgPiBnZXRJbml0TnVtTWFya2VycygpKSB7Ci0gICAgLy9jb3V0IDw8InNraXAgY2xpcCB3aXRoICNpbml0L2ZpbmFsID0gIiA8PGdldEluaXROdW1NYXJrZXJzKCkgPDwiLyIgPDxnZXROdW1NYXJrZXJzKCkgPDxlbmRsOwotICAgIHJldHVybjsKLSAgfSBlbHNlIGlmIChpc0VuYWJsZURSQygpICYmIGdldFJpcHVwTW9kZSgpID09IDAgJiYgZ2V0TnVtTWFya2VycygpID09IGdldEluaXROdW1NYXJrZXJzKCkpIHsKLSAgICAvL2NvdXQgPDwid3JpdGUgYmFjayBjbGlwIHdpdGggbm8gaW1wcm92ZW1lbnQgI2ZpbmFsID0gIiA8PGdldE51bU1hcmtlcnMoKSA8PGVuZGw7Ci0gIH0gZWxzZSBpZiAoaXNFbmFibGVEUkMoKSAmJiBnZXRSaXB1cE1vZGUoKSA9PSAwICYmIGdldE51bU1hcmtlcnMoKSA8IGdldEluaXROdW1NYXJrZXJzKCkpIHsKLSAgICAvL2NvdXQgPDwid3JpdGUgYmFjayBjbGlwIHdpdGggI2luaXQvZmluYWwgPSAiIDw8Z2V0SW5pdE51bU1hcmtlcnMoKSA8PCIvIiA8PGdldE51bU1hcmtlcnMoKSA8PGVuZGw7Ci0gIH0KLSAgc2V0PGZyTmV0KiwgZnJCbG9ja09iamVjdENvbXA+IG1vZE5ldHM7Ci0gIGVuZEdldE1vZE5ldHMobW9kTmV0cyk7Ci0gIC8vIGdldCBsb2NrCi0gIG1hcDxmck5ldCosIHNldDxwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+ID4sIGZyQmxvY2tPYmplY3RDb21wPiBib3VuZFB0czsKLSAgZW5kUmVtb3ZlTmV0cyhtb2ROZXRzLCBib3VuZFB0cyk7Ci0gIC8vZW5kUmVtb3ZlTmV0cyhtb2ROZXRzKTsKLSAgLy9lbmRGaWx0ZXJDdXRTZWdzKGN1dFNlZ3MpOwotICBlbmRBZGROZXRzKGJvdW5kUHRzKTsgLy8gaWYgdHdvIHN1Ym5ldHMgaGF2ZSBkaWZmIGlzTW9kaWZpZWQoKSBzdGF0dXMsIHRoZW4gc2hvdWxkIGFsd2F5cyB3cml0ZSBiYWNrCi0gIC8vZW5kQWRkTmV0cygpOwotICBpZiAoaXNFbmFibGVEUkMoKSkgewotICAgIGVuZFJlbW92ZU1hcmtlcnMoKTsKLSAgICBlbmRBZGRNYXJrZXJzKCk7Ci0gIH0KLSAgLy8gcmVsZWFzZSBsb2NrCi0KLX0KLQotaW50IEZsZXhEUldvcmtlcjo6Z2V0TnVtUXVpY2tNYXJrZXJzKCkgewotICBpbnQgdG90TnVtID0gMDsKLSAgZm9yIChhdXRvICZuZXQ6IG5ldHMpIHsKLSAgICB0b3ROdW0gKz0gbmV0LT5nZXROdW1NYXJrZXJzKCk7Ci0gIH0KLSAgcmV0dXJuIHRvdE51bTsKLX0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RyL0ZsZXhEUl9pbml0LmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RyL0ZsZXhEUl9pbml0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NlODRhOC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kci9GbGV4RFJfaW5pdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYyICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJkci9GbGV4RFIuaCIKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBmcjsKLQotdm9pZCBGbGV4RFJXb3JrZXI6OmluaXROZXRPYmpzX3BhdGhTZWcoZnJQYXRoU2VnKiBwYXRoU2VnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0PGZyTmV0KiwgZnJCbG9ja09iamVjdENvbXA+ICZuZXRzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxmck5ldCosIHZlY3Rvcjx1bmlxdWVfcHRyPGRyQ29ubkZpZz4gPiwgZnJCbG9ja09iamVjdENvbXA+ICZuZXRSb3V0ZU9ianMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8ZnJOZXQqLCB2ZWN0b3I8dW5pcXVlX3B0cjxkckNvbm5GaWc+ID4sIGZyQmxvY2tPYmplY3RDb21wPiAmbmV0RXh0T2JqcykgewotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLSAgYXV0byBncmlkQkJveCA9IGdldFJvdXRlQm94KCk7Ci0gIGF1dG8gbmV0ID0gcGF0aFNlZy0+Z2V0TmV0KCk7Ci0gIG5ldHMuaW5zZXJ0KG5ldCk7Ci0gIC8vIHNwbGl0IHNlZwotICBmclBvaW50IGJlZ2luLCBlbmQ7Ci0gIHBhdGhTZWctPmdldFBvaW50cyhiZWdpbiwgZW5kKTsKLSAgLy9jb3V0IDw8ImhlcmUiIDw8ZW5kbDsKLSAgLy8gdmVydGljYWwgc2VnCi0gIGlmIChiZWdpbi54KCkgPT0gZW5kLngoKSkgewotICAgIC8vY291dCA8PCJ2ZXJ0IHNlZyIgPDxlbmRsOwotICAgIC8vIG1heSBjcm9zcyByb3V0ZUJCb3gKLSAgICBib29sIGNvbmRpdGlvbjEgPSBpc0luaXREUigpID8gKGJlZ2luLngoKSA8IGdyaWRCQm94LnJpZ2h0KCkpIDogKGJlZ2luLngoKSA8PSBncmlkQkJveC5yaWdodCgpKTsKLSAgICBpZiAoZ3JpZEJCb3gubGVmdCgpIDw9IGJlZ2luLngoKSAmJiBjb25kaXRpb24xKSB7Ci0gICAgICAvL2NvdXQgPDwgIiBwYXRoU2VnICgiIDw8IGJlZ2luLngoKSA8PCAiLCAiIDw8IGJlZ2luLnkoKSA8PCAiKSAtICgiIDw8IGVuZC54KCkgPDwgIiwgIiA8PCBlbmQueSgpIDw8ICIpXG4iOwotICAgICAgLy8gYm90dG9tIHNlZyB0byBleHQKLSAgICAgIGlmIChiZWdpbi55KCkgPCBncmlkQkJveC5ib3R0b20oKSkgewotICAgICAgICBhdXRvIHVQYXRoU2VnID0gbWFrZV91bmlxdWU8ZHJQYXRoU2VnPigqcGF0aFNlZyk7Ci0gICAgICAgIGF1dG8gcHMgPSB1UGF0aFNlZy5nZXQoKTsKLSAgICAgICAgdVBhdGhTZWctPnNldFBvaW50cyhiZWdpbiwgZnJQb2ludChlbmQueCgpLCBtaW4oZW5kLnkoKSwgZ3JpZEJCb3guYm90dG9tKCkpKSk7Ci0gICAgICAgIHVuaXF1ZV9wdHI8ZHJDb25uRmlnPiB1RFJPYmooc3RkOjptb3ZlKHVQYXRoU2VnKSk7Ci0gICAgICAgIGlmIChlbmQueSgpIDwgZ3JpZEJCb3guYm90dG9tKCkpIHsKLSAgICAgICAgICBuZXRFeHRPYmpzW25ldF0ucHVzaF9iYWNrKHN0ZDo6bW92ZSh1RFJPYmopKTsgLy8gcHVyZSBleHQKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBuZXRSb3V0ZU9ianNbbmV0XS5wdXNoX2JhY2soc3RkOjptb3ZlKHVEUk9iaikpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICBjb3V0IDw8ImZpbmQgcGF0aHNlZyB0byBleHQgYm90dG9tICgiIDw8IGJlZ2luLngoKSAvIDIwMDAuMCA8PCAiLCAiIDw8IGJlZ2luLnkoKSAvIDIwMDAuMCA8PCAiKSB0byAoIgotICAgICAgICAgICAgICAgPDwgZW5kLngoKSAvIDIwMDAuMCA8PCAiLCAiIDw8IG1pbihlbmQueSgpLCBncmlkQkJveC5ib3R0b20oKSkgLyAyMDAwLjAgPDwgIikgb24gTGF5ZXIgIiA8PCBwcy0+Z2V0TGF5ZXJOdW0oKSA8PGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIG1pZGRsZSBzZWcgdG8gcm91dGUKLSAgICAgIGlmICghKGJlZ2luLnkoKSA+PSBncmlkQkJveC50b3AoKSB8fCBlbmQueSgpIDw9IGdyaWRCQm94LmJvdHRvbSgpKSkgewotICAgICAgICBhdXRvIHVQYXRoU2VnID0gbWFrZV91bmlxdWU8ZHJQYXRoU2VnPigqcGF0aFNlZyk7Ci0gICAgICAgIC8vYXV0byBwcyA9IHVQYXRoU2VnLmdldCgpOwotICAgICAgICB1UGF0aFNlZy0+c2V0UG9pbnRzKGZyUG9pbnQoYmVnaW4ueCgpLCBtYXgoYmVnaW4ueSgpLCBncmlkQkJveC5ib3R0b20oKSkpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmclBvaW50KGVuZC54KCksICAgbWluKGVuZC55KCksICAgZ3JpZEJCb3gudG9wKCkpKSk7Ci0gICAgICAgIHVuaXF1ZV9wdHI8ZHJDb25uRmlnPiB1RFJPYmooc3RkOjptb3ZlKHVQYXRoU2VnKSk7Ci0gICAgICAgIG5ldFJvdXRlT2Jqc1tuZXRdLnB1c2hfYmFjayhzdGQ6Om1vdmUodURST2JqKSk7Ci0gICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICBjb3V0IDw8ImZpbmQgcGF0aHNlZyB0byByb3V0ZSB2ZXJ0ICgiIDw8IGJlZ2luLngoKSAvIDIwMDAuMCA8PCAiLCAiIDw8IG1heChiZWdpbi55KCksIGdyaWRCQm94LmJvdHRvbSgpKSAvIDIwMDAuMAotICAgICAgICAgICAgICAgPDwgIikgdG8gKCIgPDwgZW5kLngoKSAvIDIwMDAuMCA8PCAiLCAiIDw8IG1pbihlbmQueSgpLCAgIGdyaWRCQm94LnRvcCgpKSAvIDIwMDAuMCA8PCAiKSIgPDxlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyB0b3Agc2VnIHRvIGV4dAotICAgICAgaWYgKGVuZC55KCkgPiBncmlkQkJveC50b3AoKSkgewotICAgICAgICBhdXRvIHVQYXRoU2VnID0gbWFrZV91bmlxdWU8ZHJQYXRoU2VnPigqcGF0aFNlZyk7Ci0gICAgICAgIGF1dG8gcHMgPSB1UGF0aFNlZy5nZXQoKTsKLSAgICAgICAgdVBhdGhTZWctPnNldFBvaW50cyhmclBvaW50KGJlZ2luLngoKSwgbWF4KGJlZ2luLnkoKSwgZ3JpZEJCb3gudG9wKCkpKSwgZW5kKTsKLSAgICAgICAgdW5pcXVlX3B0cjxkckNvbm5GaWc+IHVEUk9iaihzdGQ6Om1vdmUodVBhdGhTZWcpKTsKLSAgICAgICAgaWYgKGJlZ2luLnkoKSA+IGdyaWRCQm94LnRvcCgpKSB7Ci0gICAgICAgICAgbmV0RXh0T2Jqc1tuZXRdLnB1c2hfYmFjayhzdGQ6Om1vdmUodURST2JqKSk7IC8vIHB1cmUgZXh0Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbmV0Um91dGVPYmpzW25ldF0ucHVzaF9iYWNrKHN0ZDo6bW92ZSh1RFJPYmopKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgY291dCA8PCJmaW5kIHBhdGhzZWcgdG8gZXh0IHRvcCAoYXQgIiA8PCBiZWdpbi54KCkgLyAyMDAwLjAgPDwgIiwgIiAKLSAgICAgICAgICAgICAgIDw8IG1heChiZWdpbi55KCksIGdyaWRCQm94LnRvcCgpKSAvIDIwMDAuMCA8PCAiLCAiIDw8IHBzLT5nZXRMYXllck51bSgpIDw8ICIpICkiIDw8ZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICAgIC8vIGNhbm5vdCBjcm9zcyByb3V0ZUJCb3gKLSAgICB9IGVsc2UgewotICAgICAgYXV0byB1UGF0aFNlZyA9IG1ha2VfdW5pcXVlPGRyUGF0aFNlZz4oKnBhdGhTZWcpOwotICAgICAgdW5pcXVlX3B0cjxkckNvbm5GaWc+IHVEUk9iaihzdGQ6Om1vdmUodVBhdGhTZWcpKTsKLSAgICAgIG5ldEV4dE9ianNbbmV0XS5wdXNoX2JhY2soc3RkOjptb3ZlKHVEUk9iaikpOwotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8ImZpbmQgcGF0aHNlZyB0byBwdXJlIGV4dCB2ZXJ0IiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICAvLyBob3Jpem9udGFsIHNlZwotICB9IGVsc2UgaWYgKGJlZ2luLnkoKSA9PSBlbmQueSgpKSB7Ci0gICAgLy9jb3V0IDw8Imhvcnogc2VnIiA8PGVuZGw7Ci0gICAgLy8gbWF5IGNyb3NzIHJvdXRlQkJveAotICAgIGJvb2wgY29uZGl0aW9uMSA9IGlzSW5pdERSKCkgPyAoYmVnaW4ueSgpIDwgZ3JpZEJCb3gudG9wKCkpIDogKGJlZ2luLnkoKSA8PSBncmlkQkJveC50b3AoKSk7Ci0gICAgaWYgKGdyaWRCQm94LmJvdHRvbSgpIDw9IGJlZ2luLnkoKSAmJiBjb25kaXRpb24xKSB7Ci0gICAgICAvL2NvdXQgPDwgIiBwYXRoU2VnICgiIDw8IGJlZ2luLngoKSAvIDIwMDAuMCA8PCAiLCAiIDw8IGJlZ2luLnkoKSAvIDIwMDAuMCA8PCAiKSAtICgiIAotICAgICAgLy8gICAgICAgICAgICAgICAgICAgICA8PCBlbmQueCgpICAgLyAyMDAwLjAgPDwgIiwgIiA8PCBlbmQueSgpIC8gMjAwMC4wICAgPDwgIilcbiI7Ci0gICAgICAvLyBsZWZ0IHNlZyB0byBleHQKLSAgICAgIGlmIChiZWdpbi54KCkgPCBncmlkQkJveC5sZWZ0KCkpIHsKLSAgICAgICAgYXV0byB1UGF0aFNlZyA9IG1ha2VfdW5pcXVlPGRyUGF0aFNlZz4oKnBhdGhTZWcpOwotICAgICAgICBhdXRvIHBzID0gdVBhdGhTZWcuZ2V0KCk7Ci0gICAgICAgIHVQYXRoU2VnLT5zZXRQb2ludHMoYmVnaW4sIGZyUG9pbnQobWluKGVuZC54KCksIGdyaWRCQm94LmxlZnQoKSksIGVuZC55KCkpKTsKLSAgICAgICAgdW5pcXVlX3B0cjxkckNvbm5GaWc+IHVEUk9iaihzdGQ6Om1vdmUodVBhdGhTZWcpKTsKLSAgICAgICAgaWYgKGVuZC54KCkgPCBncmlkQkJveC5sZWZ0KCkpIHsKLSAgICAgICAgICBuZXRFeHRPYmpzW25ldF0ucHVzaF9iYWNrKHN0ZDo6bW92ZSh1RFJPYmopKTsgLy8gcHVyZSBleHQKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBuZXRSb3V0ZU9ianNbbmV0XS5wdXNoX2JhY2soc3RkOjptb3ZlKHVEUk9iaikpOyAvL3RvdWNoaW5nIGJvdW5kcwotICAgICAgICB9Ci0gICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICBjb3V0IDw8ImZpbmQgcGF0aHNlZyB0byBleHQgbGVmdCAoYXQgIiA8PCBtaW4oZW5kLngoKSwgZ3JpZEJCb3gubGVmdCgpKSAvIDIwMDAuMCA8PCAiLCAiIAotICAgICAgICAgICAgICAgPDwgZW5kLnkoKSAvIDIwMDAuMCA8PCAiLCAiIDw8IHBzLT5nZXRMYXllck51bSgpIDw8ICIpICkiIDw8ZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gbWlkZGxlIHNlZyB0byByb3V0ZQotICAgICAgaWYgKCEoYmVnaW4ueCgpID49IGdyaWRCQm94LnJpZ2h0KCkgfHwgZW5kLngoKSA8PSBncmlkQkJveC5sZWZ0KCkpKSB7Ci0gICAgICAgIGF1dG8gdVBhdGhTZWcgPSBtYWtlX3VuaXF1ZTxkclBhdGhTZWc+KCpwYXRoU2VnKTsKLSAgICAgICAgLy9hdXRvIHBzID0gdVBhdGhTZWcuZ2V0KCk7Ci0gICAgICAgIHVQYXRoU2VnLT5zZXRQb2ludHMoZnJQb2ludChtYXgoYmVnaW4ueCgpLCBncmlkQkJveC5sZWZ0KCkpLCAgYmVnaW4ueSgpKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJQb2ludChtaW4oZW5kLngoKSwgICBncmlkQkJveC5yaWdodCgpKSwgZW5kLnkoKSkpOwotICAgICAgICB1bmlxdWVfcHRyPGRyQ29ubkZpZz4gdURST2JqKHN0ZDo6bW92ZSh1UGF0aFNlZykpOwotICAgICAgICBuZXRSb3V0ZU9ianNbbmV0XS5wdXNoX2JhY2soc3RkOjptb3ZlKHVEUk9iaikpOwotICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgY291dCA8PCJmaW5kIHBhdGhzZWcgdG8gcm91dGUgaG9yeiIgPDxlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyByaWdodCBzZWcgdG8gZXh0Ci0gICAgICBpZiAoZW5kLngoKSA+IGdyaWRCQm94LnJpZ2h0KCkpIHsKLSAgICAgICAgYXV0byB1UGF0aFNlZyA9IG1ha2VfdW5pcXVlPGRyUGF0aFNlZz4oKnBhdGhTZWcpOwotICAgICAgICBhdXRvIHBzID0gdVBhdGhTZWcuZ2V0KCk7Ci0gICAgICAgIHVQYXRoU2VnLT5zZXRQb2ludHMoZnJQb2ludChtYXgoYmVnaW4ueCgpLCBncmlkQkJveC5yaWdodCgpKSwgYmVnaW4ueSgpKSwgZW5kKTsKLSAgICAgICAgdW5pcXVlX3B0cjxkckNvbm5GaWc+IHVEUk9iaihzdGQ6Om1vdmUodVBhdGhTZWcpKTsKLSAgICAgICAgaWYgKGJlZ2luLngoKSA+IGdyaWRCQm94LnJpZ2h0KCkpIHsKLSAgICAgICAgICBuZXRFeHRPYmpzW25ldF0ucHVzaF9iYWNrKHN0ZDo6bW92ZSh1RFJPYmopKTsgLy8gcHVyZSBleHQKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBuZXRSb3V0ZU9ianNbbmV0XS5wdXNoX2JhY2soc3RkOjptb3ZlKHVEUk9iaikpOyAvLyB0b3VjaGluZyBib3VuZHMKLSAgICAgICAgfQotICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgY291dCA8PCJmaW5kIHBhdGhzZWcgdG8gZXh0IHJpZ2h0IChhdCAiIDw8IG1heChiZWdpbi54KCksIGdyaWRCQm94LnJpZ2h0KCkpIC8gMjAwMC4wIDw8ICIsICIgCi0gICAgICAgICAgICAgICA8PCBiZWdpbi55KCkgLyAyMDAwLjAgPDwgIiwgIiA8PCBwcy0+Z2V0TGF5ZXJOdW0oKSA8PCAiKSApIiA8PGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAvLyBjYW5ub3QgY3Jvc3Mgcm91dGVCQm94Ci0gICAgfSBlbHNlIHsKLSAgICAgIGF1dG8gdVBhdGhTZWcgPSBtYWtlX3VuaXF1ZTxkclBhdGhTZWc+KCpwYXRoU2VnKTsKLSAgICAgIHVuaXF1ZV9wdHI8ZHJDb25uRmlnPiB1RFJPYmooc3RkOjptb3ZlKHVQYXRoU2VnKSk7Ci0gICAgICBuZXRFeHRPYmpzW25ldF0ucHVzaF9iYWNrKHN0ZDo6bW92ZSh1RFJPYmopKTsKLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCJmaW5kIHBhdGhzZWcgdG8gcHVyZSBleHQgaG9yeiIgPDxlbmRsOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBjb3V0IDw8Ind0ZiIgPDxlbmRsOwotICB9Ci19Ci0KLXZvaWQgRmxleERSV29ya2VyOjppbml0TmV0T2Jqc192aWEoZnJWaWEqIHZpYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDxmck5ldCosIGZyQmxvY2tPYmplY3RDb21wPiAmbmV0cywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8ZnJOZXQqLCB2ZWN0b3I8dW5pcXVlX3B0cjxkckNvbm5GaWc+ID4sIGZyQmxvY2tPYmplY3RDb21wPiAmbmV0Um91dGVPYmpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwPGZyTmV0KiwgdmVjdG9yPHVuaXF1ZV9wdHI8ZHJDb25uRmlnPiA+LCBmckJsb2NrT2JqZWN0Q29tcD4gJm5ldEV4dE9ianMpIHsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIGF1dG8gZ3JpZEJCb3ggPSBnZXRSb3V0ZUJveCgpOwotICBhdXRvIG5ldCA9IHZpYS0+Z2V0TmV0KCk7Ci0gIG5ldHMuaW5zZXJ0KG5ldCk7Ci0gIGZyUG9pbnQgdmlhUG9pbnQ7Ci0gIHZpYS0+Z2V0T3JpZ2luKHZpYVBvaW50KTsKLSAgYm9vbCBjb25kaXRpb24xID0gaXNJbml0RFIoKSA/IAotICAgICAgICAgICAgICAgICAgICAodmlhUG9pbnQueCgpIDwgIGdyaWRCQm94LnJpZ2h0KCkgJiYgdmlhUG9pbnQueSgpIDwgIGdyaWRCQm94LnRvcCgpKSA6Ci0gICAgICAgICAgICAgICAgICAgICh2aWFQb2ludC54KCkgPD0gZ3JpZEJCb3gucmlnaHQoKSAmJiB2aWFQb2ludC55KCkgPD0gZ3JpZEJCb3gudG9wKCkpOwotICBpZiAodmlhUG9pbnQueCgpID49IGdyaWRCQm94LmxlZnQoKSAmJiB2aWFQb2ludC55KCkgPj0gZ3JpZEJCb3guYm90dG9tKCkgJiYgY29uZGl0aW9uMSkgewotICAgIGF1dG8gdVZpYSA9IG1ha2VfdW5pcXVlPGRyVmlhPigqdmlhKTsKLSAgICB1bmlxdWVfcHRyPGRyQ29ubkZpZz4gdURST2JqKHN0ZDo6bW92ZSh1VmlhKSk7Ci0gICAgbmV0Um91dGVPYmpzW25ldF0ucHVzaF9iYWNrKHN0ZDo6bW92ZSh1RFJPYmopKTsKLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBjb3V0IDw8ImZpbmQgdmlhIHJvdXRlIiA8PGVuZGw7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGF1dG8gdVZpYSA9IG1ha2VfdW5pcXVlPGRyVmlhPigqdmlhKTsKLSAgICB1bmlxdWVfcHRyPGRyQ29ubkZpZz4gdURST2JqKHN0ZDo6bW92ZSh1VmlhKSk7Ci0gICAgbmV0RXh0T2Jqc1tuZXRdLnB1c2hfYmFjayhzdGQ6Om1vdmUodURST2JqKSk7Ci0gICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgY291dCA8PCJmaW5kIHZpYSBleHQiIDw8ZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBGbGV4RFJXb3JrZXI6OmluaXROZXRPYmpzX3BhdGNoV2lyZShmclBhdGNoV2lyZSogcHdpcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDxmck5ldCosIGZyQmxvY2tPYmplY3RDb21wPiAmbmV0cywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxmck5ldCosIHZlY3Rvcjx1bmlxdWVfcHRyPGRyQ29ubkZpZz4gPiwgZnJCbG9ja09iamVjdENvbXA+ICZuZXRSb3V0ZU9ianMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxmck5ldCosIHZlY3Rvcjx1bmlxdWVfcHRyPGRyQ29ubkZpZz4gPiwgZnJCbG9ja09iamVjdENvbXA+ICZuZXRFeHRPYmpzKSB7Ci0gIC8vYm9vbCBlbmFibGVPdXRwdXQgPSB0cnVlOwotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICBhdXRvIGdyaWRCQm94ID0gZ2V0Um91dGVCb3goKTsKLSAgYXV0byBuZXQgPSBwd2lyZS0+Z2V0TmV0KCk7Ci0gIG5ldHMuaW5zZXJ0KG5ldCk7Ci0gIGZyUG9pbnQgb3JpZ2luOwotICBwd2lyZS0+Z2V0T3JpZ2luKG9yaWdpbik7Ci0gIGJvb2wgY29uZGl0aW9uMSA9IGlzSW5pdERSKCkgPyAKLSAgICAgICAgICAgICAgICAgICAgKG9yaWdpbi54KCkgPCAgZ3JpZEJCb3gucmlnaHQoKSAmJiBvcmlnaW4ueSgpIDwgIGdyaWRCQm94LnRvcCgpKSA6Ci0gICAgICAgICAgICAgICAgICAgIChvcmlnaW4ueCgpIDw9IGdyaWRCQm94LnJpZ2h0KCkgJiYgb3JpZ2luLnkoKSA8PSBncmlkQkJveC50b3AoKSk7Ci0gIGlmIChvcmlnaW4ueCgpID49IGdyaWRCQm94LmxlZnQoKSAmJiBvcmlnaW4ueSgpID49IGdyaWRCQm94LmJvdHRvbSgpICYmIGNvbmRpdGlvbjEpIHsKLSAgICBhdXRvIHVQV2lyZSA9IG1ha2VfdW5pcXVlPGRyUGF0Y2hXaXJlPigqcHdpcmUpOwotICAgIHVuaXF1ZV9wdHI8ZHJDb25uRmlnPiB1RFJPYmooc3RkOjptb3ZlKHVQV2lyZSkpOwotICAgIG5ldFJvdXRlT2Jqc1tuZXRdLnB1c2hfYmFjayhzdGQ6Om1vdmUodURST2JqKSk7Ci0gICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgY291dCA8PCJmaW5kIHBhdGNoIHdpcmUgcm91dGUiIDw8ZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgYXV0byB1UFdpcmUgPSBtYWtlX3VuaXF1ZTxkclBhdGNoV2lyZT4oKnB3aXJlKTsKLSAgICB1bmlxdWVfcHRyPGRyQ29ubkZpZz4gdURST2JqKHN0ZDo6bW92ZSh1UFdpcmUpKTsKLSAgICBuZXRFeHRPYmpzW25ldF0ucHVzaF9iYWNrKHN0ZDo6bW92ZSh1RFJPYmopKTsKLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBjb3V0IDw8ImZpbmQgcGF0Y2ggd2lyZSBleHQiIDw8ZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBGbGV4RFJXb3JrZXI6OmluaXROZXRPYmpzKHNldDxmck5ldCosIGZyQmxvY2tPYmplY3RDb21wPiAmbmV0cywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwPGZyTmV0KiwgdmVjdG9yPHVuaXF1ZV9wdHI8ZHJDb25uRmlnPiA+LCBmckJsb2NrT2JqZWN0Q29tcD4gJm5ldFJvdXRlT2JqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8ZnJOZXQqLCB2ZWN0b3I8dW5pcXVlX3B0cjxkckNvbm5GaWc+ID4sIGZyQmxvY2tPYmplY3RDb21wPiAmbmV0RXh0T2JqcykgewotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgdmVjdG9yPGZyQmxvY2tPYmplY3QqPiByZXN1bHQ7Ci0gIGdldFJlZ2lvblF1ZXJ5KCktPnF1ZXJ5RFJPYmooZ2V0RXh0Qm94KCksIHJlc3VsdCk7Ci0gIGludCBjbnQxID0gMDsKLSAgaW50IGNudDIgPSAwOwotICBmb3IgKGF1dG8gcnB0cjogcmVzdWx0KSB7Ci0gICAgaWYgKHJwdHItPnR5cGVJZCgpID09IGZyY1BhdGhTZWcpIHsKLSAgICAgIGF1dG8gY3B0ciA9IHN0YXRpY19jYXN0PGZyUGF0aFNlZyo+KHJwdHIpOwotICAgICAgaWYgKGNwdHItPmhhc05ldCgpKSB7Ci0gICAgICAgIGluaXROZXRPYmpzX3BhdGhTZWcoY3B0ciwgbmV0cywgbmV0Um91dGVPYmpzLCBuZXRFeHRPYmpzKTsKLSAgICAgICAgY250MSsrOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogaW5pdE5ldE9ianMgaGFzTmV0KCkgZW1wdHkiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHJwdHItPnR5cGVJZCgpID09IGZyY1ZpYSkgewotICAgICAgYXV0byBjcHRyID0gc3RhdGljX2Nhc3Q8ZnJWaWEqPihycHRyKTsKLSAgICAgIGlmIChjcHRyLT5oYXNOZXQoKSkgewotICAgICAgICBpbml0TmV0T2Jqc192aWEoY3B0ciwgbmV0cywgbmV0Um91dGVPYmpzLCBuZXRFeHRPYmpzKTsKLSAgICAgICAgY250MisrOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogaW5pdE5ldE9ianMgaGFzTmV0KCkgZW1wdHkiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHJwdHItPnR5cGVJZCgpID09IGZyY1BhdGNoV2lyZSkgewotICAgICAgYXV0byBjcHRyID0gc3RhdGljX2Nhc3Q8ZnJQYXRjaFdpcmUqPihycHRyKTsKLSAgICAgIGlmIChjcHRyLT5oYXNOZXQoKSkgewotICAgICAgICBpbml0TmV0T2Jqc19wYXRjaFdpcmUoY3B0ciwgbmV0cywgbmV0Um91dGVPYmpzLCBuZXRFeHRPYmpzKTsKLSAgICAgICAgY250MSsrOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogaW5pdE5ldE9ianMgaGFzTmV0KCkgZW1wdHkiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgY291dCA8PCBycHRyLT50eXBlSWQoKSA8PCAiXG4iOwotICAgICAgY291dCA8PCJFcnJvcjogaW5pdENvcHlEUk9ianMgdW5zdXBwb3J0ZWQgdHlwZSIgPDxlbmRsOwotICAgIH0KLSAgfQotICBpZiAoaXNJbml0RFIoKSkgewotICAgIHZlY3Rvcjxmckd1aWRlKj4gZ3VpZGVzOwotICAgIGdldFJlZ2lvblF1ZXJ5KCktPnF1ZXJ5R3VpZGUoZ2V0Um91dGVCb3goKSwgZ3VpZGVzKTsKLSAgICBmb3IgKGF1dG8gJmd1aWRlOiBndWlkZXMpIHsKLSAgICAgIGlmIChndWlkZS0+aGFzTmV0KCkpIHsKLSAgICAgICAgYXV0byBuZXQgPSBndWlkZS0+Z2V0TmV0KCk7Ci0gICAgICAgIGlmIChuZXRzLmZpbmQobmV0KSA9PSBuZXRzLmVuZCgpKSB7Ci0gICAgICAgICAgbmV0cy5pbnNlcnQobmV0KTsKLSAgICAgICAgICBuZXRSb3V0ZU9ianNbbmV0XS5jbGVhcigpOwotICAgICAgICAgIG5ldEV4dE9ianNbbmV0XS5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICBjb3V0IDw8ImNudDEvMiA9ICIgPDxjbnQxIDw8Ii8iIDw8Y250MiA8PGVuZGw7Ci0gICAgY291dCA8PCJuZXRzIHNpemUgPSAiIDw8bmV0cy5zaXplKCkgPDxlbmRsOwotICB9Ci19Ci0KLXZvaWQgRmxleERSV29ya2VyOjppbml0TmV0c19pbml0RFIoc2V0PGZyTmV0KiwgZnJCbG9ja09iamVjdENvbXA+ICZuZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8ZnJOZXQqLCB2ZWN0b3I8dW5pcXVlX3B0cjxkckNvbm5GaWc+ID4sIGZyQmxvY2tPYmplY3RDb21wPiAmbmV0Um91dGVPYmpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8ZnJOZXQqLCB2ZWN0b3I8dW5pcXVlX3B0cjxkckNvbm5GaWc+ID4sIGZyQmxvY2tPYmplY3RDb21wPiAmbmV0RXh0T2JqcykgewotICAvL21hcDxmck5ldCosIHZlY3RvcjxmckJsb2NrT2JqZWN0Kj4sIGZyQmxvY2tPYmplY3RDb21wID4gbmV0VGVybXM7Ci0gIG1hcDxmck5ldCosIHNldDxmckJsb2NrT2JqZWN0KiwgZnJCbG9ja09iamVjdENvbXA+LCBmckJsb2NrT2JqZWN0Q29tcCA+IG5ldFRlcm1zOwotICB2ZWN0b3I8ZnJCbG9ja09iamVjdCo+IHJlc3VsdDsKLSAgZ2V0UmVnaW9uUXVlcnkoKS0+cXVlcnlHUlBpbihnZXRSb3V0ZUJveCgpLCByZXN1bHQpOwotICBmb3IgKGF1dG8gb2JqOiByZXN1bHQpIHsKLSAgICBpZiAob2JqLT50eXBlSWQoKSA9PSBmcmNJbnN0VGVybSkgewotICAgICAgYXV0byBuZXQgPSBzdGF0aWNfY2FzdDxmckluc3RUZXJtKj4ob2JqKS0+Z2V0TmV0KCk7Ci0gICAgICBuZXRzLmluc2VydChuZXQpOwotICAgICAgLy9uZXRUZXJtc1tuZXRdLnB1c2hfYmFjayhvYmopOwotICAgICAgbmV0VGVybXNbbmV0XS5pbnNlcnQob2JqKTsKLSAgICB9IGVsc2UgaWYgKG9iai0+dHlwZUlkKCkgPT0gZnJjVGVybSkgewotICAgICAgYXV0byBuZXQgPSBzdGF0aWNfY2FzdDxmclRlcm0qPihvYmopLT5nZXROZXQoKTsKLSAgICAgIG5ldHMuaW5zZXJ0KG5ldCk7Ci0gICAgICAvL25ldFRlcm1zW25ldF0ucHVzaF9iYWNrKG9iaik7Ci0gICAgICBuZXRUZXJtc1tuZXRdLmluc2VydChvYmopOwotICAgIH0gZWxzZSB7Ci0gICAgICBjb3V0IDw8IkVycm9yOiBpbml0TmV0VGVybXMgdW5zdXBwb3J0ZWQgb2JqIiA8PGVuZGw7Ci0gICAgfQotICB9Ci0gIHZlY3Rvcjx1bmlxdWVfcHRyPGRyQ29ubkZpZz4gPiB2Um91dGVPYmpzOwotICB2ZWN0b3I8dW5pcXVlX3B0cjxkckNvbm5GaWc+ID4gdkV4dE9ianM7Ci0gIGZvciAoYXV0byBuZXQ6IG5ldHMpIHsKLSAgICB2Um91dGVPYmpzLmNsZWFyKCk7Ci0gICAgdkV4dE9ianMuY2xlYXIoKTsKLSAgICB2RXh0T2JqcyA9IHN0ZDo6bW92ZShuZXRFeHRPYmpzW25ldF0pOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCluZXRSb3V0ZU9ianNbbmV0XS5zaXplKCk7IGkrKykgewotICAgICAgYXV0byAmb2JqID0gbmV0Um91dGVPYmpzW25ldF1baV07Ci0gICAgICBpZiAob2JqLT50eXBlSWQoKSA9PSBkcmNQYXRoU2VnKSB7Ci0gICAgICAgIGF1dG8gcHMgPSBzdGF0aWNfY2FzdDxkclBhdGhTZWcqPihvYmouZ2V0KCkpOwotICAgICAgICBmclBvaW50IGJwLCBlcDsKLSAgICAgICAgcHMtPmdldFBvaW50cyhicCwgZXApOwotICAgICAgICBhdXRvICZib3ggPSBnZXRSb3V0ZUJveCgpOwotICAgICAgICBpZiAoYm94LmNvbnRhaW5zKGJwKSAmJiBib3guY29udGFpbnMoZXApKSB7Ci0gICAgICAgICAgdlJvdXRlT2Jqcy5wdXNoX2JhY2soc3RkOjptb3ZlKG5ldFJvdXRlT2Jqc1tuZXRdW2ldKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdkV4dE9ianMucHVzaF9iYWNrKHN0ZDo6bW92ZShuZXRSb3V0ZU9ianNbbmV0XVtpXSkpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKG9iai0+dHlwZUlkKCkgPT0gZHJjVmlhKSB7Ci0gICAgICAgIHZSb3V0ZU9ianMucHVzaF9iYWNrKHN0ZDo6bW92ZShuZXRSb3V0ZU9ianNbbmV0XVtpXSkpOwotICAgICAgfSBlbHNlIGlmIChvYmotPnR5cGVJZCgpID09IGRyY1BhdGNoV2lyZSkgewotICAgICAgICB2Um91dGVPYmpzLnB1c2hfYmFjayhzdGQ6Om1vdmUobmV0Um91dGVPYmpzW25ldF1baV0pKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy9pbml0TmV0KG5ldCwgbmV0Um91dGVPYmpzW25ldF0sIG5ldEV4dE9ianNbbmV0XSwgbmV0VGVybXNbbmV0XSk7Ci0gICAgdmVjdG9yPGZyQmxvY2tPYmplY3QqPiB0bXBUZXJtczsKLSAgICB0bXBUZXJtcy5hc3NpZ24obmV0VGVybXNbbmV0XS5iZWdpbigpLCBuZXRUZXJtc1tuZXRdLmVuZCgpKTsKLSAgICAvL2luaXROZXQobmV0LCB2Um91dGVPYmpzLCB2RXh0T2JqcywgbmV0VGVybXNbbmV0XSk7Ci0gICAgaW5pdE5ldChuZXQsIHZSb3V0ZU9ianMsIHZFeHRPYmpzLCB0bXBUZXJtcyk7Ci0gIH0KLX0KLQotLy8gY29waWVkIHRvIEZsZXhEUjo6Y2hlY2tDb25uZWN0aXZpdHlfcGluMmVwTWFwX2hlbHBlcgotdm9pZCBGbGV4RFJXb3JrZXI6OmluaXROZXRzX3NlYXJjaFJlcGFpcl9waW4yZXBNYXBfaGVscGVyKGZyTmV0ICpuZXQsIGNvbnN0IGZyUG9pbnQgJmJwLCBmckxheWVyTnVtIGxOdW0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxmckJsb2NrT2JqZWN0KiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDxwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+ID4sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmckJsb2NrT2JqZWN0Q29tcCA+ICZwaW4yZXBNYXApIHsKLSAgYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIGF1dG8gcmVnaW9uUXVlcnkgPSBnZXRSZWdpb25RdWVyeSgpOwotICB2ZWN0b3I8cnFfcnB0cl92YWx1ZV90PGZyQmxvY2tPYmplY3Q+ID4gcmVzdWx0OwotICAvL3Jlc3VsdC5jbGVhcigpOwotICByZWdpb25RdWVyeS0+cXVlcnkoZnJCb3goYnAsIGJwKSwgbE51bSwgcmVzdWx0KTsKLSAgZm9yIChhdXRvICZbYngsIHJxT2JqXTogcmVzdWx0KSB7Ci0gICAgaWYgKHJxT2JqLT50eXBlSWQoKSA9PSBmcmNJbnN0VGVybSkgewotICAgICAgYXV0byBpbnN0VGVybSA9IHN0YXRpY19jYXN0PGZySW5zdFRlcm0qPihycU9iaik7Ci0gICAgICBpZiAoaW5zdFRlcm0tPmdldE5ldCgpID09IG5ldCkgewotICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgY291dCA8PCJmb3VuZCBpbnN0VGVybSIgPDxlbmRsOwotICAgICAgICB9Ci0gICAgICAgIHBpbjJlcE1hcFtycU9ial0uaW5zZXJ0KG1ha2VfcGFpcihicCwgbE51bSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgIGNvdXQgPDwiZm91bmQgb3RoZXIgaW5zdFRlcm0iIDw8ZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSBpZiAocnFPYmotPnR5cGVJZCgpID09IGZyY1Rlcm0pIHsKLSAgICAgIGF1dG8gdGVybSA9IHN0YXRpY19jYXN0PGZyVGVybSo+KHJxT2JqKTsKLSAgICAgIGlmICh0ZXJtLT5nZXROZXQoKSA9PSBuZXQpIHsKLSAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgIGNvdXQgPDwiZm91bmQgdGVybSIgPDxlbmRsOwotICAgICAgICB9Ci0gICAgICAgIHBpbjJlcE1hcFtycU9ial0uaW5zZXJ0KG1ha2VfcGFpcihicCwgbE51bSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgIGNvdXQgPDwiZm91bmQgb3RoZXIgdGVybSIgPDxlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgRmxleERSV29ya2VyOjppbml0TmV0c19zZWFyY2hSZXBhaXJfcGluMmVwTWFwKGZyTmV0KiBuZXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHVuaXF1ZV9wdHI8ZHJDb25uRmlnPiA+ICZuZXRSb3V0ZU9ianMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnZlY3Rvcjx1bmlxdWVfcHRyPGRyQ29ubkZpZz4gPiAmbmV0RXh0T2JqcywqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp2ZWN0b3I8ZnJCbG9ja09iamVjdD4gJm5ldFBpbnMsKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxmckJsb2NrT2JqZWN0KiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0PHBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4gPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmckJsb2NrT2JqZWN0Q29tcD4gJnBpbjJlcE1hcC8qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwPHBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4sIHNldDxpbnQ+ID4gJm5vZGVNYXAqLykgewotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICBmclBvaW50IGJwLCBlcDsKLSAgLy9hdXRvIHJlZ2lvblF1ZXJ5ID0gZ2V0UmVnaW9uUXVlcnkoKTsKLSAgLy92ZWN0b3I8cnFfcnB0cl92YWx1ZV90PGZyQmxvY2tPYmplY3Q+ID4gcmVzdWx0OwotICAvLyBzaG91bGQgbm90IGNvdW50IGV4dE9ianMgaW4gdW5pb24gZmluZAotICBmb3IgKGF1dG8gJnVQdHI6IG5ldFJvdXRlT2JqcykgewotICAgIGF1dG8gY29ubkZpZyA9IHVQdHIuZ2V0KCk7Ci0gICAgaWYgKGNvbm5GaWctPnR5cGVJZCgpID09IGRyY1BhdGhTZWcpIHsKLSAgICAgIGF1dG8gb2JqID0gc3RhdGljX2Nhc3Q8ZHJQYXRoU2VnKj4oY29ubkZpZyk7Ci0gICAgICBvYmotPmdldFBvaW50cyhicCwgZXApOwotICAgICAgYXV0byBsTnVtID0gb2JqLT5nZXRMYXllck51bSgpOwotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgIGNvdXQgPDwiKGJwLCBlcCkgKCIgPDxicC54KCkgLyAyMDAwLjAgPDwiICwiIDw8YnAueSgpIC8gMjAwMC4wIDw8IikgKCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ZXAueCgpIC8gMjAwMC4wIDw8IiAsIiA8PGVwLnkoKSAvIDIwMDAuMCA8PCIpICIgCi0gICAgICAgICAgICA8PGdldFRlY2goKS0+Z2V0TGF5ZXIobE51bSktPmdldE5hbWUoKSA8PGVuZGw7Ci0gICAgICB9Ci0gICAgICBpZiAoZ2V0Um91dGVCb3goKS5jb250YWlucyhicCkpIHsKLSAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgIGNvdXQgPDwicXVlcnkgYnAiIDw8ZW5kbDsKLSAgICAgICAgfQotICAgICAgICBpbml0TmV0c19zZWFyY2hSZXBhaXJfcGluMmVwTWFwX2hlbHBlcihuZXQsIGJwLCBsTnVtLCBwaW4yZXBNYXApOwotICAgICAgfQotICAgICAgaWYgKGdldFJvdXRlQm94KCkuY29udGFpbnMoZXApKSB7Ci0gICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICBjb3V0IDw8InF1ZXJ5IGVwIiA8PGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgaW5pdE5ldHNfc2VhcmNoUmVwYWlyX3BpbjJlcE1hcF9oZWxwZXIobmV0LCBlcCwgbE51bSwgcGluMmVwTWFwKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGNvbm5GaWctPnR5cGVJZCgpID09IGRyY1ZpYSkgewotICAgICAgYXV0byBvYmogPSBzdGF0aWNfY2FzdDxkclZpYSo+KGNvbm5GaWcpOwotICAgICAgb2JqLT5nZXRPcmlnaW4oYnApOwotICAgICAgYXV0byBsMU51bSA9IG9iai0+Z2V0VmlhRGVmKCktPmdldExheWVyMU51bSgpOwotICAgICAgYXV0byBsMk51bSA9IG9iai0+Z2V0VmlhRGVmKCktPmdldExheWVyMk51bSgpOwotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8ImJwICgiIDw8YnAueCgpIC8gMjAwMC4wIDw8IiAsIiA8PGJwLnkoKSAvIDIwMDAuMCA8PCIpICIKLSAgICAgICAgICAgICA8PGdldFRlY2goKS0+Z2V0TGF5ZXIobDFOdW0pLT5nZXROYW1lKCkgPDxlbmRsOwotICAgICAgfQotICAgICAgaWYgKGdldFJvdXRlQm94KCkuY29udGFpbnMoYnApKSB7Ci0gICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICBjb3V0IDw8InF1ZXJ5IGJwIGwxIiA8PGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgaW5pdE5ldHNfc2VhcmNoUmVwYWlyX3BpbjJlcE1hcF9oZWxwZXIobmV0LCBicCwgbDFOdW0sIHBpbjJlcE1hcCk7Ci0gICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICBjb3V0IDw8InF1ZXJ5IGJwIGwyIiA8PGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgaW5pdE5ldHNfc2VhcmNoUmVwYWlyX3BpbjJlcE1hcF9oZWxwZXIobmV0LCBicCwgbDJOdW0sIHBpbjJlcE1hcCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChjb25uRmlnLT50eXBlSWQoKSA9PSBkcmNQYXRjaFdpcmUpIHsKLSAgICB9IGVsc2UgewotICAgICAgY291dCA8PCJFcnJvcjogaW5pdE5ldHNfc2VhcmNoUmVwYWlyX3BpbjJlcE1hcCB1bnN1cHBvcnRlZCB0eXBlIiA8PGVuZGw7Ci0gICAgfQotICB9Ci0gIC8vY291dCA8PG5ldC0+Z2V0TmFtZSgpIDw8IiAiIDw8cGluMmVwTWFwLnNpemUoKSA8PGVuZGw7Ci19Ci0KLXZvaWQgRmxleERSV29ya2VyOjppbml0TmV0c19zZWFyY2hSZXBhaXJfbm9kZU1hcF9yb3V0ZU9iakVuZChmck5ldCogbmV0LCB2ZWN0b3I8dW5pcXVlX3B0cjxkckNvbm5GaWc+ID4gJm5ldFJvdXRlT2JqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+LCBzZXQ8aW50PiA+ICZub2RlTWFwKSB7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIGZyUG9pbnQgYnAsIGVwOwotICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpbmV0Um91dGVPYmpzLnNpemUoKTsgaSsrKSB7Ci0gICAgYXV0byBjb25uRmlnID0gbmV0Um91dGVPYmpzW2ldLmdldCgpOwotICAgIGlmIChjb25uRmlnLT50eXBlSWQoKSA9PSBkcmNQYXRoU2VnKSB7Ci0gICAgICBhdXRvIG9iaiA9IHN0YXRpY19jYXN0PGRyUGF0aFNlZyo+KGNvbm5GaWcpOwotICAgICAgb2JqLT5nZXRQb2ludHMoYnAsIGVwKTsKLSAgICAgIGF1dG8gbE51bSA9IG9iai0+Z2V0TGF5ZXJOdW0oKTsKLSAgICAgIG5vZGVNYXBbbWFrZV9wYWlyKGJwLCBsTnVtKV0uaW5zZXJ0KGkpOwotICAgICAgbm9kZU1hcFttYWtlX3BhaXIoZXAsIGxOdW0pXS5pbnNlcnQoaSk7Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwibm9kZSBpZHggPSAiIDw8aSA8PCIsICgiIDw8YnAueCgpIC8gMjAwMC4wIDw8IiwgIiA8PGJwLnkoKSAvIDIwMDAuMCA8PCIpICgiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PGVwLngoKSAvIDIwMDAuMCA8PCIsICIgPDxlcC55KCkgLyAyMDAwLjAgPDwiKSAiIAotICAgICAgICAgICAgIDw8Z2V0VGVjaCgpLT5nZXRMYXllcihsTnVtKS0+Z2V0TmFtZSgpIDw8ZW5kbDsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGNvbm5GaWctPnR5cGVJZCgpID09IGRyY1ZpYSkgewotICAgICAgYXV0byBvYmogPSBzdGF0aWNfY2FzdDxkclZpYSo+KGNvbm5GaWcpOwotICAgICAgb2JqLT5nZXRPcmlnaW4oYnApOwotICAgICAgYXV0byBsMU51bSA9IG9iai0+Z2V0VmlhRGVmKCktPmdldExheWVyMU51bSgpOwotICAgICAgYXV0byBsMk51bSA9IG9iai0+Z2V0VmlhRGVmKCktPmdldExheWVyMk51bSgpOwotICAgICAgbm9kZU1hcFttYWtlX3BhaXIoYnAsIGwxTnVtKV0uaW5zZXJ0KGkpOwotICAgICAgbm9kZU1hcFttYWtlX3BhaXIoYnAsIGwyTnVtKV0uaW5zZXJ0KGkpOwotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8Im5vZGUgaWR4ID0gIiA8PGkgPDwiLCAoIiA8PGJwLngoKSAvIDIwMDAuMCA8PCIsICIgPDxicC55KCkgLyAyMDAwLjAgPDwiKSAiCi0gICAgICAgICAgICAgPDxnZXRUZWNoKCktPmdldExheWVyKGwxTnVtKS0+Z2V0TmFtZSgpIDw8IiAtLT4gIiA8PGdldFRlY2goKS0+Z2V0TGF5ZXIobDJOdW0pLT5nZXROYW1lKCkgPDxlbmRsOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoY29ubkZpZy0+dHlwZUlkKCkgPT0gZHJjUGF0Y2hXaXJlKSB7Ci0gICAgICBhdXRvIG9iaiA9IHN0YXRpY19jYXN0PGRyUGF0Y2hXaXJlKj4oY29ubkZpZyk7Ci0gICAgICBvYmotPmdldE9yaWdpbihicCk7Ci0gICAgICBhdXRvIGxOdW0gPSBvYmotPmdldExheWVyTnVtKCk7Ci0gICAgICBub2RlTWFwW21ha2VfcGFpcihicCwgbE51bSldLmluc2VydChpKTsKLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCJub2RlIGlkeCA9ICIgPDxpIDw8IiwgKCIgPDxicC54KCkgLyAyMDAwLjAgPDwiLCAiIDw8YnAueSgpIC8gMjAwMC4wIDw8IikgIgotICAgICAgICAgICAgIDw8Z2V0VGVjaCgpLT5nZXRMYXllcihsTnVtKS0+Z2V0TmFtZSgpIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvdXQgPDwiRXJyb3I6IGluaXROZXRzX3NlYXJjaFJlcGFpcl9ub2RlTWFwIHVuc3VwcG9ydGVkIHR5cGUiIDw8ZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBGbGV4RFJXb3JrZXI6OmluaXROZXRzX3NlYXJjaFJlcGFpcl9ub2RlTWFwX3JvdXRlT2JqU3BsaXRfaGVscGVyKGNvbnN0IGZyUG9pbnQgJmNyb3NzUHQsIAotICAgICAgICAgICAgICAgICAgIGZyQ29vcmQgdHJhY2tDb29yZCwgZnJDb29yZCBzcGxpdENvb3JkLCBmckxheWVyTnVtIGxOdW0sIAotICAgICAgICAgICAgICAgICAgIHZlY3RvcjxtYXA8ZnJDb29yZCwgbWFwPGZyQ29vcmQsIHBhaXI8ZnJDb29yZCwgaW50PiA+ID4gPiAmbWVyZ2VIZWxwZXIsCi0gICAgICAgICAgICAgICAgICAgbWFwPHBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4sIHNldDxpbnQ+ID4gJm5vZGVNYXApIHsKLSAgYXV0byBpdDEgPSBtZXJnZUhlbHBlcltsTnVtXS5maW5kKHRyYWNrQ29vcmQpOwotICBpZiAoaXQxICE9IG1lcmdlSGVscGVyW2xOdW1dLmVuZCgpKSB7Ci0gICAgYXV0byAmbXAgPSBpdDEtPnNlY29uZDsgLy8gbWFwPGVwLCBwYWlyPGJwLCBvYmpJZHg+ID4KLSAgICBhdXRvIGl0MiA9IG1wLmxvd2VyX2JvdW5kKHNwbGl0Q29vcmQpOwotICAgIGlmIChpdDIgIT0gbXAuZW5kKCkpIHsKLSAgICAgIGF1dG8gJmVuZFAgPSBpdDItPmZpcnN0OwotICAgICAgYXV0byAmW2JlZ2luUCwgb2JqSWR4XSA9IGl0Mi0+c2Vjb25kOwotICAgICAgaWYgKGVuZFAgPiBzcGxpdENvb3JkICYmIGJlZ2luUCA8IHNwbGl0Q29vcmQpIHsKLSAgICAgICAgbm9kZU1hcFttYWtlX3BhaXIoY3Jvc3NQdCwgbE51bSldLmluc2VydChvYmpJZHgpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi12b2lkIEZsZXhEUldvcmtlcjo6aW5pdE5ldHNfc2VhcmNoUmVwYWlyX25vZGVNYXBfcm91dGVPYmpTcGxpdChmck5ldCogbmV0LCB2ZWN0b3I8dW5pcXVlX3B0cjxkckNvbm5GaWc+ID4gJm5ldFJvdXRlT2JqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+LCBzZXQ8aW50PiA+ICZub2RlTWFwKSB7Ci0gIGZyUG9pbnQgYnAsIGVwOwotICAvLyB2ZWN0b3I8bWFwPHRyYWNrLCBtYXA8ZXAsIHBhaXI8YnAsIG9iaklkeD4gPiA+ID4gaW50ZXJ2YWxfbWFwCi0gIHZlY3RvcjxtYXA8ZnJDb29yZCwgbWFwPGZyQ29vcmQsIHBhaXI8ZnJDb29yZCwgaW50PiA+ID4gPiBob3J6TWVyZ2VIZWxwZXIoZ2V0VGVjaCgpLT5nZXRMYXllcnMoKS5zaXplKCkpOwotICB2ZWN0b3I8bWFwPGZyQ29vcmQsIG1hcDxmckNvb3JkLCBwYWlyPGZyQ29vcmQsIGludD4gPiA+ID4gdmVydE1lcmdlSGVscGVyKGdldFRlY2goKS0+Z2V0TGF5ZXJzKCkuc2l6ZSgpKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KW5ldFJvdXRlT2Jqcy5zaXplKCk7IGkrKykgewotICAgIGF1dG8gY29ubkZpZyA9IG5ldFJvdXRlT2Jqc1tpXS5nZXQoKTsKLSAgICBpZiAoY29ubkZpZy0+dHlwZUlkKCkgPT0gZHJjUGF0aFNlZykgewotICAgICAgYXV0byBvYmogPSBzdGF0aWNfY2FzdDxkclBhdGhTZWcqPihjb25uRmlnKTsKLSAgICAgIG9iai0+Z2V0UG9pbnRzKGJwLCBlcCk7Ci0gICAgICBhdXRvIGxOdW0gPSBvYmotPmdldExheWVyTnVtKCk7Ci0gICAgICAvLyB2ZXJ0IHNlZwotICAgICAgaWYgKGJwLngoKSA9PSBlcC54KCkpIHsKLSAgICAgICAgdmVydE1lcmdlSGVscGVyW2xOdW1dW2JwLngoKV1bZXAueSgpXSA9IG1ha2VfcGFpcihicC55KCksIGkpOwotICAgICAgLy8gaG9yeiBzZWcKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGhvcnpNZXJnZUhlbHBlcltsTnVtXVticC55KCldW2VwLngoKV0gPSBtYWtlX3BhaXIoYnAueCgpLCBpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KW5ldFJvdXRlT2Jqcy5zaXplKCk7IGkrKykgewotICAgIGF1dG8gY29ubkZpZyA9IG5ldFJvdXRlT2Jqc1tpXS5nZXQoKTsKLSAgICAvLyBlcCBvbiBwYXRoc2VnCi0gICAgaWYgKGNvbm5GaWctPnR5cGVJZCgpID09IGRyY1BhdGhTZWcpIHsKLSAgICAgIGF1dG8gb2JqID0gc3RhdGljX2Nhc3Q8ZHJQYXRoU2VnKj4oY29ubkZpZyk7Ci0gICAgICBvYmotPmdldFBvaW50cyhicCwgZXApOwotICAgICAgYXV0byBsTnVtID0gb2JqLT5nZXRMYXllck51bSgpOwotICAgICAgLy8gdmVydCBzZWcsIGZpbmQgaG9yeiBjcm9zc2luZyBzZWcKLSAgICAgIGlmIChicC54KCkgPT0gZXAueCgpKSB7Ci0gICAgICAgIC8vZmluZCB3aGV0aGVyIHRoZXJlIGlzIGhvcnogdHJhY2sgYXQgYnAKLSAgICAgICAgYXV0byBjcm9zc1B0ICAgID0gYnA7Ci0gICAgICAgIGF1dG8gdHJhY2tDb29yZCA9IGJwLnkoKTsKLSAgICAgICAgYXV0byBzcGxpdENvb3JkID0gYnAueCgpOwotICAgICAgICBpbml0TmV0c19zZWFyY2hSZXBhaXJfbm9kZU1hcF9yb3V0ZU9ialNwbGl0X2hlbHBlcihjcm9zc1B0LCB0cmFja0Nvb3JkLCBzcGxpdENvb3JkLCBsTnVtLCBob3J6TWVyZ2VIZWxwZXIsIG5vZGVNYXApOwotICAgICAgICAvL2ZpbmQgd2hldGhlciB0aGVyZSBpcyBob3J6IHRyYWNrIGF0IGVwCi0gICAgICAgIGNyb3NzUHQgICAgPSBlcDsKLSAgICAgICAgdHJhY2tDb29yZCA9IGVwLnkoKTsKLSAgICAgICAgc3BsaXRDb29yZCA9IGVwLngoKTsKLSAgICAgICAgaW5pdE5ldHNfc2VhcmNoUmVwYWlyX25vZGVNYXBfcm91dGVPYmpTcGxpdF9oZWxwZXIoY3Jvc3NQdCwgdHJhY2tDb29yZCwgc3BsaXRDb29yZCwgbE51bSwgaG9yek1lcmdlSGVscGVyLCBub2RlTWFwKTsKLSAgICAgIC8vIGhvcnogc2VnCi0gICAgICB9IGVsc2UgewotICAgICAgICAvL2ZpbmQgd2hldGhlciB0aGVyZSBpcyB2ZXJ0IHRyYWNrIGF0IGJwCi0gICAgICAgIGF1dG8gY3Jvc3NQdCAgICA9IGJwOwotICAgICAgICBhdXRvIHRyYWNrQ29vcmQgPSBicC54KCk7Ci0gICAgICAgIGF1dG8gc3BsaXRDb29yZCA9IGJwLnkoKTsKLSAgICAgICAgaW5pdE5ldHNfc2VhcmNoUmVwYWlyX25vZGVNYXBfcm91dGVPYmpTcGxpdF9oZWxwZXIoY3Jvc3NQdCwgdHJhY2tDb29yZCwgc3BsaXRDb29yZCwgbE51bSwgdmVydE1lcmdlSGVscGVyLCBub2RlTWFwKTsKLSAgICAgICAgLy9maW5kIHdoZXRoZXIgdGhlcmUgaXMgdmVydCB0cmFjayBhdCBlcAotICAgICAgICBjcm9zc1B0ICAgID0gZXA7Ci0gICAgICAgIHRyYWNrQ29vcmQgPSBlcC54KCk7Ci0gICAgICAgIHNwbGl0Q29vcmQgPSBlcC55KCk7Ci0gICAgICAgIGluaXROZXRzX3NlYXJjaFJlcGFpcl9ub2RlTWFwX3JvdXRlT2JqU3BsaXRfaGVscGVyKGNyb3NzUHQsIHRyYWNrQ29vcmQsIHNwbGl0Q29vcmQsIGxOdW0sIHZlcnRNZXJnZUhlbHBlciwgbm9kZU1hcCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChjb25uRmlnLT50eXBlSWQoKSA9PSBkcmNWaWEpIHsKLSAgICAgIGF1dG8gb2JqID0gc3RhdGljX2Nhc3Q8ZHJWaWEqPihjb25uRmlnKTsKLSAgICAgIG9iai0+Z2V0T3JpZ2luKGJwKTsKLSAgICAgIGF1dG8gbE51bSA9IG9iai0+Z2V0VmlhRGVmKCktPmdldExheWVyMU51bSgpOwotICAgICAgLy9maW5kIHdoZXRoZXIgdGhlcmUgaXMgaG9yeiB0cmFjayBhdCBicCBvbiBsYXllcjEKLSAgICAgIGF1dG8gY3Jvc3NQdCAgICA9IGJwOwotICAgICAgYXV0byB0cmFja0Nvb3JkID0gYnAueSgpOwotICAgICAgYXV0byBzcGxpdENvb3JkID0gYnAueCgpOwotICAgICAgaW5pdE5ldHNfc2VhcmNoUmVwYWlyX25vZGVNYXBfcm91dGVPYmpTcGxpdF9oZWxwZXIoY3Jvc3NQdCwgdHJhY2tDb29yZCwgc3BsaXRDb29yZCwgbE51bSwgaG9yek1lcmdlSGVscGVyLCBub2RlTWFwKTsKLSAgICAgIC8vZmluZCB3aGV0aGVyIHRoZXJlIGlzIHZlcnQgdHJhY2sgYXQgYnAgb24gbGF5ZXIxCi0gICAgICBjcm9zc1B0ICAgID0gYnA7Ci0gICAgICB0cmFja0Nvb3JkID0gYnAueCgpOwotICAgICAgc3BsaXRDb29yZCA9IGJwLnkoKTsKLSAgICAgIGluaXROZXRzX3NlYXJjaFJlcGFpcl9ub2RlTWFwX3JvdXRlT2JqU3BsaXRfaGVscGVyKGNyb3NzUHQsIHRyYWNrQ29vcmQsIHNwbGl0Q29vcmQsIGxOdW0sIHZlcnRNZXJnZUhlbHBlciwgbm9kZU1hcCk7Ci0gICAgICAKLSAgICAgIGxOdW0gPSBvYmotPmdldFZpYURlZigpLT5nZXRMYXllcjJOdW0oKTsKLSAgICAgIC8vZmluZCB3aGV0aGVyIHRoZXJlIGlzIGhvcnogdHJhY2sgYXQgYnAgb24gbGF5ZXIyCi0gICAgICBjcm9zc1B0ICAgID0gYnA7Ci0gICAgICB0cmFja0Nvb3JkID0gYnAueSgpOwotICAgICAgc3BsaXRDb29yZCA9IGJwLngoKTsKLSAgICAgIGluaXROZXRzX3NlYXJjaFJlcGFpcl9ub2RlTWFwX3JvdXRlT2JqU3BsaXRfaGVscGVyKGNyb3NzUHQsIHRyYWNrQ29vcmQsIHNwbGl0Q29vcmQsIGxOdW0sIGhvcnpNZXJnZUhlbHBlciwgbm9kZU1hcCk7Ci0gICAgICAvL2ZpbmQgd2hldGhlciB0aGVyZSBpcyB2ZXJ0IHRyYWNrIGF0IGJwIG9uIGxheWVyMgotICAgICAgY3Jvc3NQdCAgICA9IGJwOwotICAgICAgdHJhY2tDb29yZCA9IGJwLngoKTsKLSAgICAgIHNwbGl0Q29vcmQgPSBicC55KCk7Ci0gICAgICBpbml0TmV0c19zZWFyY2hSZXBhaXJfbm9kZU1hcF9yb3V0ZU9ialNwbGl0X2hlbHBlcihjcm9zc1B0LCB0cmFja0Nvb3JkLCBzcGxpdENvb3JkLCBsTnVtLCB2ZXJ0TWVyZ2VIZWxwZXIsIG5vZGVNYXApOwotICAgIH0KLSAgfQotfQotICAKLXZvaWQgRmxleERSV29ya2VyOjppbml0TmV0c19zZWFyY2hSZXBhaXJfbm9kZU1hcF9waW4oZnJOZXQqIG5ldCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3Rvcjx1bmlxdWVfcHRyPGRyQ29ubkZpZz4gPiAmbmV0Um91dGVPYmpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8ZnJCbG9ja09iamVjdCo+ICZuZXRQaW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8ZnJCbG9ja09iamVjdCosIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0PHBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4gPiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmckJsb2NrT2JqZWN0Q29tcCA+ICZwaW4yZXBNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+LCBzZXQ8aW50PiA+ICZub2RlTWFwKSB7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIGludCBjdXJyQ250ID0gKGludCluZXRSb3V0ZU9ianMuc2l6ZSgpOwotICBmb3IgKGF1dG8gJltvYmosIGxvY1NdOiBwaW4yZXBNYXApIHsKLSAgICBuZXRQaW5zLnB1c2hfYmFjayhvYmopOwotICAgIGZvciAoYXV0byAmcHI6IGxvY1MpIHsKLSAgICAgIG5vZGVNYXBbcHJdLmluc2VydChjdXJyQ250KTsKLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCJwaW4gaWR4ID0gIiA8PGN1cnJDbnQgPDwiLCAoIiA8PHByLmZpcnN0LngoKSA8PCIsICIgPDxwci5maXJzdC55KCkgPDwiKSAiIAotICAgICAgICAgICAgIDw8Z2V0VGVjaCgpLT5nZXRMYXllcihwci5zZWNvbmQpLT5nZXROYW1lKCkgPDxlbmRsOwotICAgICAgfQotICAgIH0KLSAgICArK2N1cnJDbnQ7Ci0gIH0KLX0KLQotdm9pZCBGbGV4RFJXb3JrZXI6OmluaXROZXRzX3NlYXJjaFJlcGFpcl9ub2RlTWFwKGZyTmV0KiBuZXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3Rvcjx1bmlxdWVfcHRyPGRyQ29ubkZpZz4gPiAmbmV0Um91dGVPYmpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxmckJsb2NrT2JqZWN0Kj4gJm5ldFBpbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwPGZyQmxvY2tPYmplY3QqLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0PHBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4gPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJCbG9ja09iamVjdENvbXA+ICZwaW4yZXBNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwPHBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4sIHNldDxpbnQ+ID4gJm5vZGVNYXApIHsKLSAgaW5pdE5ldHNfc2VhcmNoUmVwYWlyX25vZGVNYXBfcm91dGVPYmpFbmQobmV0LCBuZXRSb3V0ZU9ianMsIG5vZGVNYXApOwotICBpbml0TmV0c19zZWFyY2hSZXBhaXJfbm9kZU1hcF9yb3V0ZU9ialNwbGl0KG5ldCwgbmV0Um91dGVPYmpzLCBub2RlTWFwKTsKLSAgaW5pdE5ldHNfc2VhcmNoUmVwYWlyX25vZGVNYXBfcGluKG5ldCwgbmV0Um91dGVPYmpzLCBuZXRQaW5zLCBwaW4yZXBNYXAsIG5vZGVNYXApOwotfQotCi12b2lkIEZsZXhEUldvcmtlcjo6aW5pdE5ldHNfc2VhcmNoUmVwYWlyX2Nvbm5Db21wKGZyTmV0KiBuZXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiwgc2V0PGludD4gPiAmbm9kZU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPGludD4gJmNvbXBJZHgpIHsKLSAgYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLSAgaW50IG5DbnQgPSAoaW50KWNvbXBJZHguc2l6ZSgpOyAvLyB0b3RhbCBub2RlIGNudAotCi0gIHZlY3Rvcjx2ZWN0b3I8aW50PiA+IGFkalZlYyhuQ250LCB2ZWN0b3I8aW50PigpKTsKLSAgdmVjdG9yPGJvb2w+IGFkalZpc2l0ZWQobkNudCwgZmFsc2UpOwotICBmb3IgKGF1dG8gJltwciwgaWR4U106IG5vZGVNYXApIHsKLSAgICAvL2F1dG8gJltwdCwgbE51bV0gPSBwcjsKLSAgICBmb3IgKGF1dG8gaXQxID0gaWR4Uy5iZWdpbigpOyBpdDEgIT0gaWR4Uy5lbmQoKTsgaXQxKyspIHsKLSAgICAgIGF1dG8gaXQyID0gaXQxOwotICAgICAgaXQyKys7Ci0gICAgICBhdXRvIGlkeDEgPSAqaXQxOwotICAgICAgZm9yICg7IGl0MiAhPSBpZHhTLmVuZCgpOyBpdDIrKykgewotICAgICAgICBhdXRvIGlkeDIgPSAqaXQyOwotICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgY291dCA8PCJlZGdlID0gIiA8PGlkeDEgPDwiLyIgPDxpZHgyIDw8ZW5kbCA8PGZsdXNoOwotICAgICAgICB9Ci0gICAgICAgIGFkalZlY1tpZHgxXS5wdXNoX2JhY2soaWR4Mik7Ci0gICAgICAgIGFkalZlY1tpZHgyXS5wdXNoX2JhY2soaWR4MSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgc3RydWN0IHdmIHsKLSAgICBpbnQgbm9kZUlkeDsKLSAgICBpbnQgY29zdDsKLSAgICBib29sIG9wZXJhdG9yPChjb25zdCB3ZiAmYikgY29uc3QgewotICAgICAgaWYgKGNvc3QgPT0gYi5jb3N0KSB7Ci0gICAgICAgIHJldHVybiBub2RlSWR4ID4gYi5ub2RlSWR4OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGNvc3QgPiBiLmNvc3Q7Ci0gICAgICB9Ci0gICAgfQotICB9OwotCi0gIGludCBjdXJyTmV0SWR4ID0gMDsKLSAgYXV0byBpdCA9IGZpbmQoYWRqVmlzaXRlZC5iZWdpbigpLCBhZGpWaXNpdGVkLmVuZCgpLCBmYWxzZSk7Ci0gIHdoaWxlIChpdCAhPSBhZGpWaXNpdGVkLmVuZCgpKSB7Ci0gICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgY291dCA8PCJ1bmlvbiI7Ci0gICAgfQotICAgIHByaW9yaXR5X3F1ZXVlPHdmPiBwcTsKLSAgICBpbnQgc3JjSWR4ID0gZGlzdGFuY2UoYWRqVmlzaXRlZC5iZWdpbigpLCBpdCk7Ci0gICAgcHEucHVzaCh7c3JjSWR4LCAwfSk7Ci0gICAgd2hpbGUgKCFwcS5lbXB0eSgpKSB7Ci0gICAgICBhdXRvIHdmcm9udCA9IHBxLnRvcCgpOwotICAgICAgYXV0byBjdXJySWR4ID0gd2Zyb250Lm5vZGVJZHg7Ci0gICAgICBwcS5wb3AoKTsKLSAgICAgIGlmIChhZGpWaXNpdGVkW2N1cnJJZHhdKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgYWRqVmlzaXRlZFtjdXJySWR4XSA9IHRydWU7Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiICIgPDxjdXJySWR4OwotICAgICAgfQotICAgICAgY29tcElkeFtjdXJySWR4XSA9IGN1cnJOZXRJZHg7Ci0gICAgICBmb3IgKGF1dG8gbmJySWR4OiBhZGpWZWNbY3VycklkeF0pIHsKLSAgICAgICAgaWYgKCFhZGpWaXNpdGVkW25icklkeF0pIHsKLSAgICAgICAgICBwcS5wdXNoKHtuYnJJZHgsIHdmcm9udC5jb3N0ICsgMX0pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgIGNvdXQgPDxlbmRsOwotICAgIH0KLSAgICBpdCA9IGZpbmQoYWRqVmlzaXRlZC5iZWdpbigpLCBhZGpWaXNpdGVkLmVuZCgpLCBmYWxzZSk7Ci0gICAgKytjdXJyTmV0SWR4OwotICB9Ci0gIC8vaWYgKGN1cnJOZXRJZHggPiAxKSB7Ci0gIC8vICBjb3V0IDw8IkBAZGVidWcgIiA8PG5ldC0+Z2V0TmFtZSgpIDw8IiB1bmlvbiBmaW5kIGdldCAiIDw8Y3Vyck5ldElkeCA8PCIgc3VibmV0cyIgPDxlbmRsOwotICAvL30KLX0KLQotdm9pZCBGbGV4RFJXb3JrZXI6OmluaXROZXRzX3NlYXJjaFJlcGFpcihzZXQ8ZnJOZXQqLCBmckJsb2NrT2JqZWN0Q29tcD4gJm5ldHMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8ZnJOZXQqLCB2ZWN0b3I8dW5pcXVlX3B0cjxkckNvbm5GaWc+ID4sIGZyQmxvY2tPYmplY3RDb21wPiAmbmV0Um91dGVPYmpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8ZnJOZXQqLCB2ZWN0b3I8dW5pcXVlX3B0cjxkckNvbm5GaWc+ID4sIGZyQmxvY2tPYmplY3RDb21wPiAmbmV0RXh0T2JqcykgewotICBmb3IgKGF1dG8gbmV0OiBuZXRzKSB7Ci0gICAgLy8gYnVpbGQgYmlnIGdyYXBoOwotICAgIC8vIG5vZGUgbnVtYmVyIDogcm91dGVPYmosIHBpbnMKLSAgICBtYXA8ZnJCbG9ja09iamVjdCosIHNldDxwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+ID4sIGZyQmxvY2tPYmplY3RDb21wPiBwaW4yZXBNYXA7Ci0gICAgaW5pdE5ldHNfc2VhcmNoUmVwYWlyX3BpbjJlcE1hcChuZXQsIG5ldFJvdXRlT2Jqc1tuZXRdLyosIG5ldEV4dE9ianNbbmV0XSwgbmV0UGlucyovLCBwaW4yZXBNYXAvKiwgbm9kZU1hcCovKTsKLQotICAgIHZlY3RvcjxmckJsb2NrT2JqZWN0Kj4gbmV0UGluczsKLSAgICBtYXA8cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiwgc2V0PGludD4gPiBub2RlTWFwOwotICAgIGluaXROZXRzX3NlYXJjaFJlcGFpcl9ub2RlTWFwKG5ldCwgbmV0Um91dGVPYmpzW25ldF0sIG5ldFBpbnMsIHBpbjJlcE1hcCwgbm9kZU1hcCk7Ci0KLSAgICAvL2NvdXQgPDwic2l6ZTEocGluL3JvYmopID0gIiA8PG5ldFBpbnMuc2l6ZSgpIDw8Ii8iIDw8bmV0Um91dGVPYmpzLnNpemUoKSA8PGVuZGw7Ci0gICAgdmVjdG9yPGludD4gY29tcElkeCgoaW50KW5ldFBpbnMuc2l6ZSgpICsgKGludCluZXRSb3V0ZU9ianNbbmV0XS5zaXplKCksIDApOwotICAgIC8vY291dCA8PCJzaXplMihwaW4vcm9iai9jb21wKSA9ICIgPDxuZXRQaW5zLnNpemUoKSA8PCIvIiA8PG5ldFJvdXRlT2Jqc1tuZXRdLnNpemUoKSA8PCIvIiA8PGNvbXBJZHguc2l6ZSgpIDw8ZW5kbDsKLSAgICBpbml0TmV0c19zZWFyY2hSZXBhaXJfY29ubkNvbXAobmV0LCBub2RlTWFwLCBjb21wSWR4KTsKLQotICAgIHZlY3Rvcjx2ZWN0b3I8dW5pcXVlX3B0cjxkckNvbm5GaWc+ID4gPiB2Um91dGVPYmpzOwotICAgIHZlY3Rvcjx2ZWN0b3I8dW5pcXVlX3B0cjxkckNvbm5GaWc+ID4gPiB2RXh0T2JqczsKLSAgICB2ZWN0b3I8dmVjdG9yPGZyQmxvY2tPYmplY3QqPiA+ICAgICAgICAgdlBpbnM7Ci0KLSAgICBhdXRvIGl0ID0gbWF4X2VsZW1lbnQoY29tcElkeC5iZWdpbigpLCBjb21wSWR4LmVuZCgpKTsKLSAgICBpbnQgbnVtU3ViTmV0cyA9IChpdCA9PSBjb21wSWR4LmVuZCgpKSA/IDEgOiAoKCppdCkgKyAxKTsKLSAgICAvLyBwdXQgYWxsIHB1cmUgZXh0IG9ianMgdG8gdGhlIGZpcnN0IHN1Ym5ldAotICAgIHZFeHRPYmpzLnJlc2l6ZShudW1TdWJOZXRzKTsKLSAgICB2RXh0T2Jqc1swXSA9IHN0ZDo6bW92ZShuZXRFeHRPYmpzW25ldF0pOwotCi0gICAgdlJvdXRlT2Jqcy5yZXNpemUobnVtU3ViTmV0cyk7Ci0gICAgdlBpbnMucmVzaXplKG51bVN1Yk5ldHMpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KWNvbXBJZHguc2l6ZSgpOyBpKyspIHsKLSAgICAgIGludCBzdWJOZXRJZHggPSBjb21wSWR4W2ldOwotICAgICAgaWYgKGkgPCAoaW50KW5ldFJvdXRlT2Jqc1tuZXRdLnNpemUoKSkgewotICAgICAgICBhdXRvICZvYmogPSBuZXRSb3V0ZU9ianNbbmV0XVtpXTsKLSAgICAgICAgaWYgKG9iai0+dHlwZUlkKCkgPT0gZHJjUGF0aFNlZykgewotICAgICAgICAgIGF1dG8gcHMgPSBzdGF0aWNfY2FzdDxkclBhdGhTZWcqPihvYmouZ2V0KCkpOwotICAgICAgICAgIGZyUG9pbnQgYnAsIGVwOwotICAgICAgICAgIHBzLT5nZXRQb2ludHMoYnAsIGVwKTsKLSAgICAgICAgICBhdXRvICZib3ggPSBnZXRSb3V0ZUJveCgpOwotICAgICAgICAgIGlmIChib3guY29udGFpbnMoYnApICYmIGJveC5jb250YWlucyhlcCkpIHsKLSAgICAgICAgICAgIHZSb3V0ZU9ianNbc3ViTmV0SWR4XS5wdXNoX2JhY2soc3RkOjptb3ZlKG5ldFJvdXRlT2Jqc1tuZXRdW2ldKSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHZFeHRPYmpzW3N1Yk5ldElkeF0ucHVzaF9iYWNrKHN0ZDo6bW92ZShuZXRSb3V0ZU9ianNbbmV0XVtpXSkpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChvYmotPnR5cGVJZCgpID09IGRyY1ZpYSkgewotICAgICAgICAgIHZSb3V0ZU9ianNbc3ViTmV0SWR4XS5wdXNoX2JhY2soc3RkOjptb3ZlKG5ldFJvdXRlT2Jqc1tuZXRdW2ldKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqLT50eXBlSWQoKSA9PSBkcmNQYXRjaFdpcmUpIHsKLSAgICAgICAgICB2Um91dGVPYmpzW3N1Yk5ldElkeF0ucHVzaF9iYWNrKHN0ZDo6bW92ZShuZXRSb3V0ZU9ianNbbmV0XVtpXSkpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICB2UGluc1tzdWJOZXRJZHhdLnB1c2hfYmFjayhuZXRQaW5zW2kgLSAoaW50KW5ldFJvdXRlT2Jqc1tuZXRdLnNpemUoKV0pOwotICAgICAgfQotICAgIH0KLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU3ViTmV0czsgaSsrKSB7Ci0gICAgICBpbml0TmV0KG5ldCwgdlJvdXRlT2Jqc1tpXSwgdkV4dE9ianNbaV0sIHZQaW5zW2ldKTsKLSAgICB9Ci0KLSAgfQotfQotCi12b2lkIEZsZXhEUldvcmtlcjo6aW5pdE5ldF90ZXJtR2VuQXAoZHJQaW4qIGRQaW4pIHsKLSAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0Ojpwb2x5Z29uOjpvcGVyYXRvcnM7Ci0KLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIGJvb2wgaGFzT25UcmFjayA9IGZhbHNlOwotICBhdXRvIHJvdXRlQm94ID0gZ2V0Um91dGVCb3goKTsKLSAgUmVjdGFuZ2xlIHJvdXRlUmVjdChyb3V0ZUJveC5sZWZ0KCksIHJvdXRlQm94LmJvdHRvbSgpLCByb3V0ZUJveC5yaWdodCgpLCByb3V0ZUJveC50b3AoKSk7Ci0gIGF1dG8gZFBpblRlcm0gPSBkUGluLT5nZXRGclRlcm0oKTsKLSAgaWYgKGRQaW5UZXJtLT50eXBlSWQoKSA9PSBmcmNJbnN0VGVybSkgewotICAgIGZySW5zdFRlcm0gKmluc3RUZXJtID0gc3RhdGljX2Nhc3Q8ZnJJbnN0VGVybSo+KGRQaW5UZXJtKTsKLSAgICAvL2ZyVHJhbnNmb3JtIHhmb3JtOwotICAgIGZySW5zdCAqaW5zdCA9IGluc3RUZXJtLT5nZXRJbnN0KCk7Ci0gICAgLy9mckJveCBtYm94OwotICAgIC8vCi0gICAgLy9pbnN0LT5nZXRUcmFuc2Zvcm0oeGZvcm0pOwotICAgIC8vaW5zdC0+Z2V0UmVmQmxvY2soKS0+Z2V0Qm91bmRhcnlCQm94KG1ib3gpOwotICAgIC8vZnJQb2ludCBzaXplKG1ib3gucmlnaHQoKSwgbWJveC50b3AoKSk7Ci0gICAgLy94Zm9ybS51cGRhdGVYZm9ybShzaXplKTsKLSAgICBmclRyYW5zZm9ybSB4Zm9ybTsKLSAgICBpbnN0LT5nZXRVcGRhdGVkWGZvcm0oeGZvcm0pOwotICAgIAotICAgIGZvciAoYXV0byAmcGluOiBpbnN0VGVybS0+Z2V0VGVybSgpLT5nZXRQaW5zKCkpIHsKLSAgICAgIGF1dG8gcGluUHRyID0gcGluLmdldCgpOwotICAgICAgYXV0byBwaW5MYXllcjJQb2x5U2V0ID0gcGluUHRyLT5nZXRMYXllcjJQb2x5U2V0KCk7Ci0gICAgICBzdGQ6Om1hcDxmckxheWVyTnVtLCBQb2x5Z29uU2V0PiBsYXllcjJQb2x5U2V0OwotICAgICAgLy8gcG9wdWxhdGUgbGF5ZXIyUG9seVNldAotICAgICAgZm9yIChhdXRvIGxheWVySXQgPSBwaW5MYXllcjJQb2x5U2V0LmJlZ2luKCk7IGxheWVySXQgIT0gcGluTGF5ZXIyUG9seVNldC5lbmQoKTsgKytsYXllckl0KSB7Ci0gICAgICAgIGF1dG8gY3VyckxheWVyTnVtID0gbGF5ZXJJdC0+Zmlyc3Q7Ci0gICAgICAgIGF1dG8gY3VyclBvbHlTZXQgPSBsYXllckl0LT5zZWNvbmQ7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPFJlY3RhbmdsZT4gcGluUmVjdHM7Ci0gICAgICAgIGJvb3N0Ojpwb2x5Z29uOjpnZXRfcmVjdGFuZ2xlcyhwaW5SZWN0cywgY3VyclBvbHlTZXQpOwotICAgICAgICBmb3IgKGF1dG8gJnBpblJlY3Q6IHBpblJlY3RzKSB7Ci0gICAgICAgICAgZnJCb3ggdG1wQm94KHhsKHBpblJlY3QpLCB5bChwaW5SZWN0KSwgeGgocGluUmVjdCksIHloKHBpblJlY3QpKTsKLSAgICAgICAgICB0bXBCb3gudHJhbnNmb3JtKHhmb3JtKTsKLSAgICAgICAgICBSZWN0YW5nbGUgdHJhbnNmb3JtZWRSZWN0KHRtcEJveC5sZWZ0KCksIHRtcEJveC5ib3R0b20oKSwgdG1wQm94LnJpZ2h0KCksIHRtcEJveC50b3AoKSk7Ci0gICAgICAgICAgbGF5ZXIyUG9seVNldFtjdXJyTGF5ZXJOdW1dICs9IHRyYW5zZm9ybWVkUmVjdDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gbm93IGxldCB0aGUgd29yayBiZWdpbiB3aXRoIHRyYW5zZm9ybWVkIHBpbiBzaGFwZXMKLSAgICAgIGZvciAoYXV0byBsYXllckl0ID0gbGF5ZXIyUG9seVNldC5iZWdpbigpOyBsYXllckl0ICE9IGxheWVyMlBvbHlTZXQuZW5kKCk7ICsrbGF5ZXJJdCkgewotICAgICAgICBhdXRvIGN1cnJMYXllck51bSA9IGxheWVySXQtPmZpcnN0OwotICAgICAgICBhdXRvIGN1cnJQb2x5c2V0ID0gbGF5ZXJJdC0+c2Vjb25kOwotICAgICAgICBzdGQ6OnZlY3RvcjxSZWN0YW5nbGU+IHBpblJlY3RzOwotICAgICAgICBib29zdDo6cG9seWdvbjo6Z2V0X3JlY3RhbmdsZXMocGluUmVjdHMsIGN1cnJQb2x5c2V0KTsKLSAgICAgICAgZm9yIChhdXRvICZwaW5SZWN0OiBwaW5SZWN0cykgewotICAgICAgICAgIGlmICghaW50ZXJzZWN0KHBpblJlY3QsIHJvdXRlUmVjdCkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBSZWN0YW5nbGUgb3ZlcmxhcFJlY3Q7Ci0gICAgICAgICAgb3ZlcmxhcFJlY3QgPSBnZW5lcmFsaXplZF9pbnRlcnNlY3QocGluUmVjdCwgcm91dGVSZWN0KTsKLSAgICAgICAgICBpZiAoeGwob3ZlcmxhcFJlY3QpID09IHhsKHJvdXRlUmVjdCkpIHsKLSAgICAgICAgICAgIHN0ZDo6c2V0PGZyQ29vcmQ+IHRyYWNrTG9jczsKLSAgICAgICAgICAgIGdldFRyYWNrTG9jcyh0cnVlLCBjdXJyTGF5ZXJOdW0sIHlsKG92ZXJsYXBSZWN0KSwgeWgob3ZlcmxhcFJlY3QpLCB0cmFja0xvY3MpOwotICAgICAgICAgICAgaWYgKCF0cmFja0xvY3MuZW1wdHkoKSkgewotICAgICAgICAgICAgICBoYXNPblRyYWNrID0gdHJ1ZTsKLSAgICAgICAgICAgICAgZm9yIChhdXRvICZ0cmFja0xvYzogdHJhY2tMb2NzKSB7Ci0gICAgICAgICAgICAgICAgYXV0byB1YXAgPSBzdGQ6Om1ha2VfdW5pcXVlPGRyQWNjZXNzUGF0dGVybj4oKTsKLSAgICAgICAgICAgICAgICBmclBvaW50IHN0YXJ0UG9pbnQoeGwob3ZlcmxhcFJlY3QpLCB0cmFja0xvYyk7Ci0gICAgICAgICAgICAgICAgdWFwLT5zZXRCZWdpbkxheWVyTnVtKGN1cnJMYXllck51bSk7Ci0gICAgICAgICAgICAgICAgdWFwLT5zZXRQb2ludChzdGFydFBvaW50KTsKLSAgICAgICAgICAgICAgICBkUGluLT5hZGRBY2Nlc3NQYXR0ZXJuKHVhcCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHhoKG92ZXJsYXBSZWN0KSA9PSB4aChyb3V0ZVJlY3QpKSB7Ci0gICAgICAgICAgICBzdGQ6OnNldDxmckNvb3JkPiB0cmFja0xvY3M7Ci0gICAgICAgICAgICBnZXRUcmFja0xvY3ModHJ1ZSwgY3VyckxheWVyTnVtLCB5bChvdmVybGFwUmVjdCksIHloKG92ZXJsYXBSZWN0KSwgdHJhY2tMb2NzKTsKLSAgICAgICAgICAgIGlmICghdHJhY2tMb2NzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgZm9yIChhdXRvICZ0cmFja0xvYzogdHJhY2tMb2NzKSB7Ci0gICAgICAgICAgICAgICAgYXV0byB1YXAgPSBzdGQ6Om1ha2VfdW5pcXVlPGRyQWNjZXNzUGF0dGVybj4oKTsKLSAgICAgICAgICAgICAgICBmclBvaW50IHN0YXJ0UG9pbnQoeGgob3ZlcmxhcFJlY3QpLCB0cmFja0xvYyk7Ci0gICAgICAgICAgICAgICAgdWFwLT5zZXRCZWdpbkxheWVyTnVtKGN1cnJMYXllck51bSk7Ci0gICAgICAgICAgICAgICAgdWFwLT5zZXRQb2ludChzdGFydFBvaW50KTsKLSAgICAgICAgICAgICAgICBpZiAoIWlzSW5pdERSKCkgfHwgeWgob3ZlcmxhcFJlY3QpICE9IHloKHJvdXRlUmVjdCkpIHsKLSAgICAgICAgICAgICAgICAgIGhhc09uVHJhY2sgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgZFBpbi0+YWRkQWNjZXNzUGF0dGVybih1YXApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoeWwob3ZlcmxhcFJlY3QpID09IHlsKHJvdXRlUmVjdCkpIHsKLSAgICAgICAgICAgIHN0ZDo6c2V0PGZyQ29vcmQ+IHRyYWNrTG9jczsKLSAgICAgICAgICAgIGdldFRyYWNrTG9jcyhmYWxzZSwgY3VyckxheWVyTnVtLCB4bChvdmVybGFwUmVjdCksIHhoKG92ZXJsYXBSZWN0KSwgdHJhY2tMb2NzKTsKLSAgICAgICAgICAgIGlmICghdHJhY2tMb2NzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgaGFzT25UcmFjayA9IHRydWU7Ci0gICAgICAgICAgICAgIGZvciAoYXV0byAmdHJhY2tMb2M6IHRyYWNrTG9jcykgewotICAgICAgICAgICAgICAgIGF1dG8gdWFwID0gc3RkOjptYWtlX3VuaXF1ZTxkckFjY2Vzc1BhdHRlcm4+KCk7Ci0gICAgICAgICAgICAgICAgZnJQb2ludCBzdGFydFBvaW50KHRyYWNrTG9jLCB5bChvdmVybGFwUmVjdCkpOwotICAgICAgICAgICAgICAgIHVhcC0+c2V0QmVnaW5MYXllck51bShjdXJyTGF5ZXJOdW0pOwotICAgICAgICAgICAgICAgIHVhcC0+c2V0UG9pbnQoc3RhcnRQb2ludCk7Ci0gICAgICAgICAgICAgICAgZFBpbi0+YWRkQWNjZXNzUGF0dGVybih1YXApOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICh5aChvdmVybGFwUmVjdCkgPT0geWgocm91dGVSZWN0KSkgewotICAgICAgICAgICAgc3RkOjpzZXQ8ZnJDb29yZD4gdHJhY2tMb2NzOwotICAgICAgICAgICAgZ2V0VHJhY2tMb2NzKGZhbHNlLCBjdXJyTGF5ZXJOdW0sIHhsKG92ZXJsYXBSZWN0KSwgeGgob3ZlcmxhcFJlY3QpLCB0cmFja0xvY3MpOwotICAgICAgICAgICAgaWYgKCF0cmFja0xvY3MuZW1wdHkoKSkgewotICAgICAgICAgICAgICBmb3IgKGF1dG8gJnRyYWNrTG9jOiB0cmFja0xvY3MpIHsKLSAgICAgICAgICAgICAgICBhdXRvIHVhcCA9IHN0ZDo6bWFrZV91bmlxdWU8ZHJBY2Nlc3NQYXR0ZXJuPigpOwotICAgICAgICAgICAgICAgIGZyUG9pbnQgc3RhcnRQb2ludCh0cmFja0xvYywgeWgob3ZlcmxhcFJlY3QpKTsKLSAgICAgICAgICAgICAgICB1YXAtPnNldEJlZ2luTGF5ZXJOdW0oY3VyckxheWVyTnVtKTsKLSAgICAgICAgICAgICAgICB1YXAtPnNldFBvaW50KHN0YXJ0UG9pbnQpOwotICAgICAgICAgICAgICAgIGlmICghaXNJbml0RFIoKSB8fCB4aChvdmVybGFwUmVjdCkgIT0geGgocm91dGVSZWN0KSkgewotICAgICAgICAgICAgICAgICAgaGFzT25UcmFjayA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICBkUGluLT5hZGRBY2Nlc3NQYXR0ZXJuKHVhcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyBvbiB0cmFjay4uLgotICAgICAgICBpZiAoIWhhc09uVHJhY2spIHsKLSAgICAgICAgICBmb3IgKGF1dG8gJnBpblJlY3Q6IHBpblJlY3RzKSB7Ci0gICAgICAgICAgICBpZiAoIWludGVyc2VjdChwaW5SZWN0LCByb3V0ZVJlY3QpKSB7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUmVjdGFuZ2xlIG92ZXJsYXBSZWN0OwotICAgICAgICAgICAgb3ZlcmxhcFJlY3QgPSBnZW5lcmFsaXplZF9pbnRlcnNlY3QocGluUmVjdCwgcm91dGVSZWN0KTsKLSAgICAgICAgICAgIGlmICh4bChvdmVybGFwUmVjdCkgPT0geGwocm91dGVSZWN0KSkgewotICAgICAgICAgICAgICAvLyBzdGQ6OnNldDxmckNvb3JkPiB0cmFja0xvY3M7Ci0gICAgICAgICAgICAgIC8vIGdldFRyYWNrTG9jcyh0cnVlLCBjdXJyTGF5ZXJOdW0sIHlsKG92ZXJsYXBSZWN0KSwgeWgob3ZlcmxhcFJlY3QpLCB0cmFja0xvY3MpOwotICAgICAgICAgICAgICAvLyBpZiAoIXRyYWNrTG9jcy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZm9yIChhdXRvICZ0cmFja0xvYzogdHJhY2tMb2NzKSB7Ci0gICAgICAgICAgICAgICAgICBhdXRvIHVhcCA9IHN0ZDo6bWFrZV91bmlxdWU8ZHJBY2Nlc3NQYXR0ZXJuPigpOwotICAgICAgICAgICAgICAgICAgZnJQb2ludCBzdGFydFBvaW50KHhsKG92ZXJsYXBSZWN0KSwgKHlsKG92ZXJsYXBSZWN0KSArIHloKG92ZXJsYXBSZWN0KSkgLyAyKTsKLSAgICAgICAgICAgICAgICAgIHVhcC0+c2V0QmVnaW5MYXllck51bShjdXJyTGF5ZXJOdW0pOwotICAgICAgICAgICAgICAgICAgdWFwLT5zZXRQb2ludChzdGFydFBvaW50KTsKLSAgICAgICAgICAgICAgICAgIGRQaW4tPmFkZEFjY2Vzc1BhdHRlcm4odWFwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIC8vIH0KLSAgICAgICAgICAgICAgLy8gfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHhoKG92ZXJsYXBSZWN0KSA9PSB4aChyb3V0ZVJlY3QpKSB7Ci0gICAgICAgICAgICAgIC8vIHN0ZDo6c2V0PGZyQ29vcmQ+IHRyYWNrTG9jczsKLSAgICAgICAgICAgICAgLy8gZ2V0VHJhY2tMb2NzKHRydWUsIGN1cnJMYXllck51bSwgeWwob3ZlcmxhcFJlY3QpLCB5aChvdmVybGFwUmVjdCksIHRyYWNrTG9jcyk7Ci0gICAgICAgICAgICAgIC8vIGlmICghdHJhY2tMb2NzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBmb3IgKGF1dG8gJnRyYWNrTG9jOiB0cmFja0xvY3MpIHsKLSAgICAgICAgICAgICAgICAgIGF1dG8gdWFwID0gc3RkOjptYWtlX3VuaXF1ZTxkckFjY2Vzc1BhdHRlcm4+KCk7Ci0gICAgICAgICAgICAgICAgICBmclBvaW50IHN0YXJ0UG9pbnQoeGgob3ZlcmxhcFJlY3QpLCAoeWwob3ZlcmxhcFJlY3QpICsgeWgob3ZlcmxhcFJlY3QpKSAvIDIpOwotICAgICAgICAgICAgICAgICAgdWFwLT5zZXRCZWdpbkxheWVyTnVtKGN1cnJMYXllck51bSk7Ci0gICAgICAgICAgICAgICAgICB1YXAtPnNldFBvaW50KHN0YXJ0UG9pbnQpOwotICAgICAgICAgICAgICAgICAgaWYgKCFpc0luaXREUigpIHx8ICgoeWwob3ZlcmxhcFJlY3QpICsgeWgob3ZlcmxhcFJlY3QpKSAvIDIpICE9IHloKHJvdXRlUmVjdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZFBpbi0+YWRkQWNjZXNzUGF0dGVybih1YXApOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyB9Ci0gICAgICAgICAgICAgIC8vIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh5bChvdmVybGFwUmVjdCkgPT0geWwocm91dGVSZWN0KSkgewotICAgICAgICAgICAgICAvLyBzdGQ6OnNldDxmckNvb3JkPiB0cmFja0xvY3M7Ci0gICAgICAgICAgICAgIC8vIGdldFRyYWNrTG9jcyhmYWxzZSwgY3VyckxheWVyTnVtLCB4bChvdmVybGFwUmVjdCksIHhoKG92ZXJsYXBSZWN0KSwgdHJhY2tMb2NzKTsKLSAgICAgICAgICAgICAgLy8gaWYgKCF0cmFja0xvY3MuZW1wdHkoKSkgewotICAgICAgICAgICAgICAgIC8vIGZvciAoYXV0byAmdHJhY2tMb2M6IHRyYWNrTG9jcykgewotICAgICAgICAgICAgICAgICAgYXV0byB1YXAgPSBzdGQ6Om1ha2VfdW5pcXVlPGRyQWNjZXNzUGF0dGVybj4oKTsKLSAgICAgICAgICAgICAgICAgIGZyUG9pbnQgc3RhcnRQb2ludCgoeGwob3ZlcmxhcFJlY3QpICsgeGgob3ZlcmxhcFJlY3QpKSAvIDIsIHlsKG92ZXJsYXBSZWN0KSk7Ci0gICAgICAgICAgICAgICAgICB1YXAtPnNldEJlZ2luTGF5ZXJOdW0oY3VyckxheWVyTnVtKTsKLSAgICAgICAgICAgICAgICAgIHVhcC0+c2V0UG9pbnQoc3RhcnRQb2ludCk7Ci0gICAgICAgICAgICAgICAgICBkUGluLT5hZGRBY2Nlc3NQYXR0ZXJuKHVhcCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAvLyB9Ci0gICAgICAgICAgICAgIC8vIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh5aChvdmVybGFwUmVjdCkgPT0geWgocm91dGVSZWN0KSkgewotICAgICAgICAgICAgICBzdGQ6OnNldDxmckNvb3JkPiB0cmFja0xvY3M7Ci0gICAgICAgICAgICAgIC8vIGdldFRyYWNrTG9jcyhmYWxzZSwgY3VyckxheWVyTnVtLCB4bChvdmVybGFwUmVjdCksIHhoKG92ZXJsYXBSZWN0KSwgdHJhY2tMb2NzKTsKLSAgICAgICAgICAgICAgLy8gaWYgKCF0cmFja0xvY3MuZW1wdHkoKSkgewotICAgICAgICAgICAgICAgIC8vIGZvciAoYXV0byAmdHJhY2tMb2M6IHRyYWNrTG9jcykgewotICAgICAgICAgICAgICAgICAgYXV0byB1YXAgPSBzdGQ6Om1ha2VfdW5pcXVlPGRyQWNjZXNzUGF0dGVybj4oKTsKLSAgICAgICAgICAgICAgICAgIGZyUG9pbnQgc3RhcnRQb2ludCgoeGwob3ZlcmxhcFJlY3QpICsgeGgob3ZlcmxhcFJlY3QpKSAvIDIsIHloKG92ZXJsYXBSZWN0KSk7Ci0gICAgICAgICAgICAgICAgICB1YXAtPnNldEJlZ2luTGF5ZXJOdW0oY3VyckxheWVyTnVtKTsKLSAgICAgICAgICAgICAgICAgIHVhcC0+c2V0UG9pbnQoc3RhcnRQb2ludCk7Ci0gICAgICAgICAgICAgICAgICBpZiAoIWlzSW5pdERSKCkgfHwgKCh4bChvdmVybGFwUmVjdCkgKyB4aChvdmVybGFwUmVjdCkpIC8gMikgIT0geGgocm91dGVSZWN0KSkgewotICAgICAgICAgICAgICAgICAgICBkUGluLT5hZGRBY2Nlc3NQYXR0ZXJuKHVhcCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIH0KLSAgICAgICAgICAgICAgLy8gfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgfQotICAgICAgCi0gICAgfQotICB9IGVsc2UgaWYgKGRQaW5UZXJtLT50eXBlSWQoKSA9PSBmcmNUZXJtKSB7Ci0gICAgZnJUZXJtICp0ZXJtID0gc3RhdGljX2Nhc3Q8ZnJUZXJtKj4oZFBpblRlcm0pOwotICAgIGZvciAoYXV0byAmcGluOiB0ZXJtLT5nZXRQaW5zKCkpIHsKLSAgICAgIGF1dG8gcGluUHRyID0gcGluLmdldCgpOwotICAgICAgLy8gYXV0byBwaW5MYXllcjJQb2x5U2V0ID0gcGluUHRyLT5nZXRMYXllcjJQb2x5U2V0KCk7Ci0gICAgICBzdGQ6Om1hcDxmckxheWVyTnVtLCBQb2x5Z29uU2V0PiBsYXllcjJQb2x5U2V0ID0gcGluUHRyLT5nZXRMYXllcjJQb2x5U2V0KCk7Ci0gICAgICAvLyBwb3B1bGF0ZSBsYXllcjJQb2x5U2V0Ci0gICAgICAvLyBmb3IgKGF1dG8gbGF5ZXJJdCA9IHBpbkxheWVyMlBvbHlTZXQuYmVnaW4oKTsgbGF5ZXJJdCAhPSBwaW5MYXllcjJQb2x5U2V0LmVuZCgpOyArK2xheWVySXQpIHsKLSAgICAgIC8vICAgYXV0byBjdXJyTGF5ZXJOdW0gPSBsYXllckl0LT5maXJzdDsKLSAgICAgIC8vICAgYXV0byBjdXJyUG9seVNldCA9IGxheWVySXQtPnNlY29uZDsKLSAgICAgIC8vICAgc3RkOjp2ZWN0b3I8UmVjdGFuZ2xlPiBwaW5SZWN0czsKLSAgICAgIC8vICAgYm9vc3Q6OnBvbHlnb246OmdldF9yZWN0YW5nbGVzKHBpblJlY3RzLCBjdXJyUG9seVNldCk7Ci0gICAgICAvLyAgIGZvciAoYXV0byAmcGluUmVjdDogcGluUmVjdHMpIHsKLSAgICAgIC8vICAgICBmckJveCB0bXBCb3goeGwocGluUmVjdCksIHlsKHBpblJlY3QpLCB4aChwaW5SZWN0KSwgeWgocGluUmVjdCkpOwotICAgICAgLy8gICAgIHRtcEJveC50cmFuc2Zvcm0oeGZvcm0pOwotICAgICAgLy8gICAgIFJlY3RhbmdsZSB0cmFuc2Zvcm1lZFJlY3QodG1wQm94LmxlZnQoKSwgdG1wQm94LmJvdHRvbSgpLCB0bXBCb3gucmlnaHQoKSwgdG1wQm94LnRvcCgpKTsKLSAgICAgIC8vICAgICBsYXllcjJQb2x5U2V0W2N1cnJMYXllck51bV0gKz0gdHJhbnNmb3JtZWRSZWN0OwotICAgICAgLy8gICB9Ci0gICAgICAvLyB9Ci0KLSAgICAgIC8vIG5vdyBsZXQgdGhlIHdvcmsgYmVnaW4gd2l0aCB0cmFuc2Zvcm1lZCBwaW4gc2hhcGVzCi0gICAgICBmb3IgKGF1dG8gbGF5ZXJJdCA9IGxheWVyMlBvbHlTZXQuYmVnaW4oKTsgbGF5ZXJJdCAhPSBsYXllcjJQb2x5U2V0LmVuZCgpOyArK2xheWVySXQpIHsKLSAgICAgICAgYXV0byBjdXJyTGF5ZXJOdW0gPSBsYXllckl0LT5maXJzdDsKLSAgICAgICAgYXV0byBjdXJyUG9seXNldCA9IGxheWVySXQtPnNlY29uZDsKLSAgICAgICAgc3RkOjp2ZWN0b3I8UmVjdGFuZ2xlPiBwaW5SZWN0czsKLSAgICAgICAgYm9vc3Q6OnBvbHlnb246OmdldF9yZWN0YW5nbGVzKHBpblJlY3RzLCBjdXJyUG9seXNldCk7Ci0gICAgICAgIGZvciAoYXV0byAmcGluUmVjdDogcGluUmVjdHMpIHsKLSAgICAgICAgICBpZiAoIWludGVyc2VjdChwaW5SZWN0LCByb3V0ZVJlY3QpKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgUmVjdGFuZ2xlIG92ZXJsYXBSZWN0OwotICAgICAgICAgIG92ZXJsYXBSZWN0ID0gZ2VuZXJhbGl6ZWRfaW50ZXJzZWN0KHBpblJlY3QsIHJvdXRlUmVjdCk7Ci0gICAgICAgICAgaWYgKHhsKG92ZXJsYXBSZWN0KSA9PSB4bChyb3V0ZVJlY3QpKSB7Ci0gICAgICAgICAgICBzdGQ6OnNldDxmckNvb3JkPiB0cmFja0xvY3M7Ci0gICAgICAgICAgICBnZXRUcmFja0xvY3ModHJ1ZSwgY3VyckxheWVyTnVtLCB5bChvdmVybGFwUmVjdCksIHloKG92ZXJsYXBSZWN0KSwgdHJhY2tMb2NzKTsKLSAgICAgICAgICAgIGlmICghdHJhY2tMb2NzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgaGFzT25UcmFjayA9IHRydWU7Ci0gICAgICAgICAgICAgIGZvciAoYXV0byAmdHJhY2tMb2M6IHRyYWNrTG9jcykgewotICAgICAgICAgICAgICAgIGF1dG8gdWFwID0gc3RkOjptYWtlX3VuaXF1ZTxkckFjY2Vzc1BhdHRlcm4+KCk7Ci0gICAgICAgICAgICAgICAgZnJQb2ludCBzdGFydFBvaW50KHhsKG92ZXJsYXBSZWN0KSwgdHJhY2tMb2MpOwotICAgICAgICAgICAgICAgIHVhcC0+c2V0QmVnaW5MYXllck51bShjdXJyTGF5ZXJOdW0pOwotICAgICAgICAgICAgICAgIHVhcC0+c2V0UG9pbnQoc3RhcnRQb2ludCk7Ci0gICAgICAgICAgICAgICAgZFBpbi0+YWRkQWNjZXNzUGF0dGVybih1YXApOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICh4aChvdmVybGFwUmVjdCkgPT0geGgocm91dGVSZWN0KSkgewotICAgICAgICAgICAgc3RkOjpzZXQ8ZnJDb29yZD4gdHJhY2tMb2NzOwotICAgICAgICAgICAgZ2V0VHJhY2tMb2NzKHRydWUsIGN1cnJMYXllck51bSwgeWwob3ZlcmxhcFJlY3QpLCB5aChvdmVybGFwUmVjdCksIHRyYWNrTG9jcyk7Ci0gICAgICAgICAgICBpZiAoIXRyYWNrTG9jcy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgIGZvciAoYXV0byAmdHJhY2tMb2M6IHRyYWNrTG9jcykgewotICAgICAgICAgICAgICAgIGF1dG8gdWFwID0gc3RkOjptYWtlX3VuaXF1ZTxkckFjY2Vzc1BhdHRlcm4+KCk7Ci0gICAgICAgICAgICAgICAgZnJQb2ludCBzdGFydFBvaW50KHhoKG92ZXJsYXBSZWN0KSwgdHJhY2tMb2MpOwotICAgICAgICAgICAgICAgIHVhcC0+c2V0QmVnaW5MYXllck51bShjdXJyTGF5ZXJOdW0pOwotICAgICAgICAgICAgICAgIHVhcC0+c2V0UG9pbnQoc3RhcnRQb2ludCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0luaXREUigpIHx8IHloKG92ZXJsYXBSZWN0KSAhPSB5aChyb3V0ZVJlY3QpKSB7Ci0gICAgICAgICAgICAgICAgICBoYXNPblRyYWNrID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgIGRQaW4tPmFkZEFjY2Vzc1BhdHRlcm4odWFwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHlsKG92ZXJsYXBSZWN0KSA9PSB5bChyb3V0ZVJlY3QpKSB7Ci0gICAgICAgICAgICBzdGQ6OnNldDxmckNvb3JkPiB0cmFja0xvY3M7Ci0gICAgICAgICAgICBnZXRUcmFja0xvY3MoZmFsc2UsIGN1cnJMYXllck51bSwgeGwob3ZlcmxhcFJlY3QpLCB4aChvdmVybGFwUmVjdCksIHRyYWNrTG9jcyk7Ci0gICAgICAgICAgICBpZiAoIXRyYWNrTG9jcy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgIGhhc09uVHJhY2sgPSB0cnVlOwotICAgICAgICAgICAgICBmb3IgKGF1dG8gJnRyYWNrTG9jOiB0cmFja0xvY3MpIHsKLSAgICAgICAgICAgICAgICBhdXRvIHVhcCA9IHN0ZDo6bWFrZV91bmlxdWU8ZHJBY2Nlc3NQYXR0ZXJuPigpOwotICAgICAgICAgICAgICAgIGZyUG9pbnQgc3RhcnRQb2ludCh0cmFja0xvYywgeWwob3ZlcmxhcFJlY3QpKTsKLSAgICAgICAgICAgICAgICB1YXAtPnNldEJlZ2luTGF5ZXJOdW0oY3VyckxheWVyTnVtKTsKLSAgICAgICAgICAgICAgICB1YXAtPnNldFBvaW50KHN0YXJ0UG9pbnQpOwotICAgICAgICAgICAgICAgIGRQaW4tPmFkZEFjY2Vzc1BhdHRlcm4odWFwKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoeWgob3ZlcmxhcFJlY3QpID09IHloKHJvdXRlUmVjdCkpIHsKLSAgICAgICAgICAgIHN0ZDo6c2V0PGZyQ29vcmQ+IHRyYWNrTG9jczsKLSAgICAgICAgICAgIGdldFRyYWNrTG9jcyhmYWxzZSwgY3VyckxheWVyTnVtLCB4bChvdmVybGFwUmVjdCksIHhoKG92ZXJsYXBSZWN0KSwgdHJhY2tMb2NzKTsKLSAgICAgICAgICAgIGlmICghdHJhY2tMb2NzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgZm9yIChhdXRvICZ0cmFja0xvYzogdHJhY2tMb2NzKSB7Ci0gICAgICAgICAgICAgICAgYXV0byB1YXAgPSBzdGQ6Om1ha2VfdW5pcXVlPGRyQWNjZXNzUGF0dGVybj4oKTsKLSAgICAgICAgICAgICAgICBmclBvaW50IHN0YXJ0UG9pbnQodHJhY2tMb2MsIHloKG92ZXJsYXBSZWN0KSk7Ci0gICAgICAgICAgICAgICAgdWFwLT5zZXRCZWdpbkxheWVyTnVtKGN1cnJMYXllck51bSk7Ci0gICAgICAgICAgICAgICAgdWFwLT5zZXRQb2ludChzdGFydFBvaW50KTsKLSAgICAgICAgICAgICAgICBpZiAoIWlzSW5pdERSKCkgfHwgeGgob3ZlcmxhcFJlY3QpICE9IHhoKHJvdXRlUmVjdCkpIHsKLSAgICAgICAgICAgICAgICAgIGhhc09uVHJhY2sgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgZFBpbi0+YWRkQWNjZXNzUGF0dGVybih1YXApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gb24gdHJhY2suLi4KLSAgICAgICAgaWYgKCFoYXNPblRyYWNrKSB7Ci0gICAgICAgICAgZm9yIChhdXRvICZwaW5SZWN0OiBwaW5SZWN0cykgewotICAgICAgICAgICAgaWYgKCFpbnRlcnNlY3QocGluUmVjdCwgcm91dGVSZWN0KSkgewotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFJlY3RhbmdsZSBvdmVybGFwUmVjdDsKLSAgICAgICAgICAgIG92ZXJsYXBSZWN0ID0gZ2VuZXJhbGl6ZWRfaW50ZXJzZWN0KHBpblJlY3QsIHJvdXRlUmVjdCk7Ci0gICAgICAgICAgICBpZiAoeGwob3ZlcmxhcFJlY3QpID09IHhsKHJvdXRlUmVjdCkpIHsKLSAgICAgICAgICAgICAgc3RkOjpzZXQ8ZnJDb29yZD4gdHJhY2tMb2NzOwotICAgICAgICAgICAgICAvLyBnZXRUcmFja0xvY3ModHJ1ZSwgY3VyckxheWVyTnVtLCB5bChvdmVybGFwUmVjdCksIHloKG92ZXJsYXBSZWN0KSwgdHJhY2tMb2NzKTsKLSAgICAgICAgICAgICAgLy8gaWYgKCF0cmFja0xvY3MuZW1wdHkoKSkgewotICAgICAgICAgICAgICAgIC8vIGZvciAoYXV0byAmdHJhY2tMb2M6IHRyYWNrTG9jcykgewotICAgICAgICAgICAgICAgICAgYXV0byB1YXAgPSBzdGQ6Om1ha2VfdW5pcXVlPGRyQWNjZXNzUGF0dGVybj4oKTsKLSAgICAgICAgICAgICAgICAgIGZyUG9pbnQgc3RhcnRQb2ludCh4bChvdmVybGFwUmVjdCksICh5bChvdmVybGFwUmVjdCkgKyB5aChvdmVybGFwUmVjdCkpIC8gMik7Ci0gICAgICAgICAgICAgICAgICB1YXAtPnNldEJlZ2luTGF5ZXJOdW0oY3VyckxheWVyTnVtKTsKLSAgICAgICAgICAgICAgICAgIHVhcC0+c2V0UG9pbnQoc3RhcnRQb2ludCk7Ci0gICAgICAgICAgICAgICAgICBkUGluLT5hZGRBY2Nlc3NQYXR0ZXJuKHVhcCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAvLyB9Ci0gICAgICAgICAgICAgIC8vIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh4aChvdmVybGFwUmVjdCkgPT0geGgocm91dGVSZWN0KSkgewotICAgICAgICAgICAgICBzdGQ6OnNldDxmckNvb3JkPiB0cmFja0xvY3M7Ci0gICAgICAgICAgICAgIC8vIGdldFRyYWNrTG9jcyh0cnVlLCBjdXJyTGF5ZXJOdW0sIHlsKG92ZXJsYXBSZWN0KSwgeWgob3ZlcmxhcFJlY3QpLCB0cmFja0xvY3MpOwotICAgICAgICAgICAgICAvLyBpZiAoIXRyYWNrTG9jcy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZm9yIChhdXRvICZ0cmFja0xvYzogdHJhY2tMb2NzKSB7Ci0gICAgICAgICAgICAgICAgICBhdXRvIHVhcCA9IHN0ZDo6bWFrZV91bmlxdWU8ZHJBY2Nlc3NQYXR0ZXJuPigpOwotICAgICAgICAgICAgICAgICAgZnJQb2ludCBzdGFydFBvaW50KHhoKG92ZXJsYXBSZWN0KSwgKHlsKG92ZXJsYXBSZWN0KSArIHloKG92ZXJsYXBSZWN0KSkgLyAyKTsKLSAgICAgICAgICAgICAgICAgIHVhcC0+c2V0QmVnaW5MYXllck51bShjdXJyTGF5ZXJOdW0pOwotICAgICAgICAgICAgICAgICAgdWFwLT5zZXRQb2ludChzdGFydFBvaW50KTsKLSAgICAgICAgICAgICAgICAgIGlmICghaXNJbml0RFIoKSB8fCAoKHlsKG92ZXJsYXBSZWN0KSArIHloKG92ZXJsYXBSZWN0KSkgLyAyKSAhPSB5aChyb3V0ZVJlY3QpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRQaW4tPmFkZEFjY2Vzc1BhdHRlcm4odWFwKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gfQotICAgICAgICAgICAgICAvLyB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoeWwob3ZlcmxhcFJlY3QpID09IHlsKHJvdXRlUmVjdCkpIHsKLSAgICAgICAgICAgICAgc3RkOjpzZXQ8ZnJDb29yZD4gdHJhY2tMb2NzOwotICAgICAgICAgICAgICAvLyBnZXRUcmFja0xvY3MoZmFsc2UsIGN1cnJMYXllck51bSwgeGwob3ZlcmxhcFJlY3QpLCB4aChvdmVybGFwUmVjdCksIHRyYWNrTG9jcyk7Ci0gICAgICAgICAgICAgIC8vIGlmICghdHJhY2tMb2NzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBmb3IgKGF1dG8gJnRyYWNrTG9jOiB0cmFja0xvY3MpIHsKLSAgICAgICAgICAgICAgICAgIGF1dG8gdWFwID0gc3RkOjptYWtlX3VuaXF1ZTxkckFjY2Vzc1BhdHRlcm4+KCk7Ci0gICAgICAgICAgICAgICAgICBmclBvaW50IHN0YXJ0UG9pbnQoKHhsKG92ZXJsYXBSZWN0KSArIHhoKG92ZXJsYXBSZWN0KSkgLyAyLCB5bChvdmVybGFwUmVjdCkpOwotICAgICAgICAgICAgICAgICAgdWFwLT5zZXRCZWdpbkxheWVyTnVtKGN1cnJMYXllck51bSk7Ci0gICAgICAgICAgICAgICAgICB1YXAtPnNldFBvaW50KHN0YXJ0UG9pbnQpOwotICAgICAgICAgICAgICAgICAgZFBpbi0+YWRkQWNjZXNzUGF0dGVybih1YXApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgLy8gfQotICAgICAgICAgICAgICAvLyB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoeWgob3ZlcmxhcFJlY3QpID09IHloKHJvdXRlUmVjdCkpIHsKLSAgICAgICAgICAgICAgc3RkOjpzZXQ8ZnJDb29yZD4gdHJhY2tMb2NzOwotICAgICAgICAgICAgICAvLyBnZXRUcmFja0xvY3MoZmFsc2UsIGN1cnJMYXllck51bSwgeGwob3ZlcmxhcFJlY3QpLCB4aChvdmVybGFwUmVjdCksIHRyYWNrTG9jcyk7Ci0gICAgICAgICAgICAgIC8vIGlmICghdHJhY2tMb2NzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBmb3IgKGF1dG8gJnRyYWNrTG9jOiB0cmFja0xvY3MpIHsKLSAgICAgICAgICAgICAgICAgIGF1dG8gdWFwID0gc3RkOjptYWtlX3VuaXF1ZTxkckFjY2Vzc1BhdHRlcm4+KCk7Ci0gICAgICAgICAgICAgICAgICBmclBvaW50IHN0YXJ0UG9pbnQoKHhsKG92ZXJsYXBSZWN0KSArIHhoKG92ZXJsYXBSZWN0KSkgLyAyLCB5aChvdmVybGFwUmVjdCkpOwotICAgICAgICAgICAgICAgICAgdWFwLT5zZXRCZWdpbkxheWVyTnVtKGN1cnJMYXllck51bSk7Ci0gICAgICAgICAgICAgICAgICB1YXAtPnNldFBvaW50KHN0YXJ0UG9pbnQpOwotICAgICAgICAgICAgICAgICAgaWYgKCFpc0luaXREUigpIHx8ICgoeGwob3ZlcmxhcFJlY3QpICsgeGgob3ZlcmxhcFJlY3QpKSAvIDIpICE9IHhoKHJvdXRlUmVjdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZFBpbi0+YWRkQWNjZXNzUGF0dGVybih1YXApOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyB9Ci0gICAgICAgICAgICAgIC8vIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgIH0KLSAgICAgIAotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBzdGQ6OmNvdXQgPDwgIkVycm9yOiB1bmV4cGVjdGVkIHR5cGUgaW4gaW5pdE5ldF90ZXJtR2VuQXAiOwotICAgIH0KLSAgfQotfQotCi0vLyB3aGVuIGlzSG9yelRyYWNrcyA9PSB0cnVlLCBpdCBtZWFucyB0cmFjayBsb2MgPT0geSBsb2MKLXZvaWQgRmxleERSV29ya2VyOjpnZXRUcmFja0xvY3MoYm9vbCBpc0hvcnpUcmFja3MsIGZyTGF5ZXJOdW0gY3VyckxheWVyTnVtLCBmckNvb3JkIGxvdywgZnJDb29yZCBoaWdoLCBzdGQ6OnNldDxmckNvb3JkPiAmdHJhY2tMb2NzKSB7Ci0gIGZyUHJlZlJvdXRpbmdEaXJFbnVtIGN1cnJQcmVmUm91dGVEaXIgPSBnZXRUZWNoKCktPmdldExheWVyKGN1cnJMYXllck51bSktPmdldERpcigpOyAKLSAgZm9yIChhdXRvICZ0cDogZGVzaWduLT5nZXRUb3BCbG9jaygpLT5nZXRUcmFja1BhdHRlcm5zKGN1cnJMYXllck51bSkpIHsKLSAgICBpZiAodHAtPmlzSG9yaXpvbnRhbCgpICYmIGN1cnJQcmVmUm91dGVEaXIgPT0gZnJjVmVydFByZWZSb3V0aW5nRGlyIHx8Ci0gICAgICAgIXRwLT5pc0hvcml6b250YWwoKSAmJiBjdXJyUHJlZlJvdXRlRGlyID09IGZyY0hvcnpQcmVmUm91dGluZ0RpcikgewotICAgICAgaW50IHRyYWNrTnVtID0gKGxvdyAtIHRwLT5nZXRTdGFydENvb3JkKCkpIC8gKGludCl0cC0+Z2V0VHJhY2tTcGFjaW5nKCk7Ci0gICAgICBpZiAodHJhY2tOdW0gPCAwKSB7Ci0gICAgICAgIHRyYWNrTnVtID0gMDsKLSAgICAgIH0KLSAgICAgIGlmICh0cmFja051bSAqIChpbnQpdHAtPmdldFRyYWNrU3BhY2luZygpICsgdHAtPmdldFN0YXJ0Q29vcmQoKSA8IGxvdykgewotICAgICAgICArK3RyYWNrTnVtOwotICAgICAgfQotICAgICAgZm9yICg7IAotICAgICAgICAgICB0cmFja051bSA8IChpbnQpdHAtPmdldE51bVRyYWNrcygpICYmIAotICAgICAgICAgICB0cmFja051bSAqIChpbnQpdHAtPmdldFRyYWNrU3BhY2luZygpICsgdHAtPmdldFN0YXJ0Q29vcmQoKSA8IGhpZ2g7IAotICAgICAgICAgICArK3RyYWNrTnVtKSB7Ci0gICAgICAgIGZyQ29vcmQgdHJhY2tMb2MgPSB0cmFja051bSAqIHRwLT5nZXRUcmFja1NwYWNpbmcoKSArIHRwLT5nZXRTdGFydENvb3JkKCk7Ci0gICAgICAgIHRyYWNrTG9jcy5pbnNlcnQodHJhY2tMb2MpOwotICAgICAgICBpZiAodHAtPmlzSG9yaXpvbnRhbCgpICYmICFpc0hvcnpUcmFja3MpIHsKLSAgICAgICAgICB0cmFja0xvY3MuaW5zZXJ0KHRyYWNrTG9jKTsKLSAgICAgICAgfSBlbHNlIGlmICghdHAtPmlzSG9yaXpvbnRhbCgpICYmIGlzSG9yelRyYWNrcykgewotICAgICAgICAgIHRyYWNrTG9jcy5pbnNlcnQodHJhY2tMb2MpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgRmxleERSV29ya2VyOjppbml0TmV0X3Rlcm0oZHJOZXQqIGROZXQsIHZlY3RvcjxmckJsb2NrT2JqZWN0Kj4gJnRlcm1zKSB7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIC8vYm9vbCBlbmFibGVPdXRwdXQgPSB0cnVlOwotICBmb3IgKGF1dG8gdGVybTogdGVybXMpIHsKLSAgICBhdXRvIGRQaW4gPSBtYWtlX3VuaXF1ZTxkclBpbj4oKTsKLSAgICBkUGluLT5zZXRGclRlcm0odGVybSk7Ci0gICAgLy8gYXAKLSAgICBmclRyYW5zZm9ybSBpbnN0WGZvcm07IC8vICgwLDApLCBmcmNSMAotICAgIGZyVHJhbnNmb3JtIHNoaWZ0WGZvcm07Ci0gICAgZnJUZXJtKiB0cnVlVGVybSA9IG51bGxwdHI7Ci0gICAgc3RyaW5nICBuYW1lOwotICAgIGJvb2wgaGFzSW5zdCA9IGZhbHNlOwotICAgIGZySW5zdCogaW5zdCA9IG51bGxwdHI7Ci0gICAgaWYgKHRlcm0tPnR5cGVJZCgpID09IGZyY0luc3RUZXJtKSB7Ci0gICAgICBoYXNJbnN0ID0gdHJ1ZTsKLSAgICAgIGluc3QgPSBzdGF0aWNfY2FzdDxmckluc3RUZXJtKj4odGVybSktPmdldEluc3QoKTsKLSAgICAgIC8vaW5zdC0+Z2V0VHJhbnNmb3JtKGluc3RYZm9ybSk7Ci0gICAgICBpbnN0LT5nZXRUcmFuc2Zvcm0oc2hpZnRYZm9ybSk7Ci0gICAgICBzaGlmdFhmb3JtLnNldChmck9yaWVudChmcmNSMCkpOwotICAgICAgaW5zdC0+Z2V0VXBkYXRlZFhmb3JtKGluc3RYZm9ybSk7Ci0gICAgICAvL2luc3QtPmdldFVwZGF0ZWRYZm9ybShzaGlmdFhmb3JtLCB0cnVlKTsgLy8gZ2V0IG5vIG9yaWVudCB2ZXJzaW9uCi0gICAgICB0cnVlVGVybSA9IHN0YXRpY19jYXN0PGZySW5zdFRlcm0qPih0ZXJtKS0+Z2V0VGVybSgpOwotICAgICAgbmFtZSA9IGluc3QtPmdldE5hbWUoKSArIHN0cmluZygiLyIpICsgdHJ1ZVRlcm0tPmdldE5hbWUoKTsKLSAgICB9IGVsc2UgaWYgKHRlcm0tPnR5cGVJZCgpID09IGZyY1Rlcm0pIHsKLSAgICAgIHRydWVUZXJtID0gc3RhdGljX2Nhc3Q8ZnJUZXJtKj4odGVybSk7Ci0gICAgICBuYW1lID0gc3RyaW5nKCJQSU4vIikgKyB0cnVlVGVybS0+Z2V0TmFtZSgpOwotICAgIH0KLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBjb3V0IDw8InBpbiAiIDw8bmFtZTsKLSAgICB9Ci0gICAgZm9yIChhdXRvICZwaW46IHRydWVUZXJtLT5nZXRQaW5zKCkpIHsKLSAgICAgIGZvciAoYXV0byAmYXA6IHBpbi0+Z2V0QWNjZXNzUGF0dGVybnMoaW5zdFhmb3JtLm9yaWVudCgpKSkgewotICAgICAgICBpZiAoaGFzSW5zdCAmJiAhKGFwLT5oYXNJbnN0KGluc3QpKSkgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhcC0+aXNDb25mbGljdCgpKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZnJQb2ludCBicCwgZXA7Ci0gICAgICAgIGFwLT5nZXRQb2ludHMoYnAsIGVwKTsKLSAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgIGNvdXQgPDwiICgiIDw8YnAueCgpICogMS4wIC8gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCkgPDwiLCAiCi0gICAgICAgICAgICAgICAgICAgICAgPDxicC55KCkgKiAxLjAgLyBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0REJVUGVyVVUoKSA8PCIpIG9yaWdpbiI7Ci0gICAgICAgIH0KLSAgICAgICAgYXV0byBiTnVtID0gYXAtPmdldEJlZ2luTGF5ZXJOdW0oKTsKLSAgICAgICAgYnAudHJhbnNmb3JtKHNoaWZ0WGZvcm0pOwotCi0gICAgICAgIGF1dG8gZEFwICA9IG1ha2VfdW5pcXVlPGRyQWNjZXNzUGF0dGVybj4oKTsKLSAgICAgICAgZEFwLT5zZXRQb2ludChicCk7Ci0gICAgICAgIGRBcC0+c2V0QmVnaW5MYXllck51bShiTnVtKTsKLSAgICAgICAgZEFwLT5zZXRWYWxpZEFjY2VzcyhhcC0+Z2V0VmFsaWRBY2Nlc3MoKSk7Ci0gICAgICAgIGlmICghKGFwLT5nZXRBY2Nlc3NWaWFEZWYoZnJEaXJFbnVtOjpVKS5lbXB0eSgpKSkgewotICAgICAgICAgIGRBcC0+c2V0QWNjZXNzVmlhRGVmKGZyRGlyRW51bTo6VSwgJihhcC0+Z2V0QWNjZXNzVmlhRGVmKGZyRGlyRW51bTo6VSkpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIShhcC0+Z2V0QWNjZXNzVmlhRGVmKGZyRGlyRW51bTo6RCkuZW1wdHkoKSkpIHsKLSAgICAgICAgICBkQXAtPnNldEFjY2Vzc1ZpYURlZihmckRpckVudW06OkQsICYoYXAtPmdldEFjY2Vzc1ZpYURlZihmckRpckVudW06OkQpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGdldFJvdXRlQm94KCkuY29udGFpbnMoYnApKSB7Ci0gICAgICAgICAgZFBpbi0+YWRkQWNjZXNzUGF0dGVybihkQXApOwotICAgICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICAgIGNvdXQgPDwiICgiIDw8YnAueCgpICogMS4wIC8gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCkgPDwiLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICA8PGJwLnkoKSAqIDEuMCAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpIDw8IikgYWRkZWQiOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgICBjb3V0IDw8IiAoIiA8PGJwLngoKSAqIDEuMCAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpIDw8IiwgIgotICAgICAgICAgICAgICAgICAgICAgICAgPDxicC55KCkgKiAxLjAgLyBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0REJVUGVyVVUoKSA8PCIpIHNraXBwZWQiOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotCi0gICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgIGNvdXQgPDxlbmRsOwotICAgICAgIGNvdXQgPDwiYXAgc2l6ZSA9ICIgPDxkUGluLT5nZXRBY2Nlc3NQYXR0ZXJucygpLnNpemUoKSA8PGVuZGw7Ci0gICAgfQotCi0gICAgaWYgKGRQaW4tPmdldEFjY2Vzc1BhdHRlcm5zKCkuZW1wdHkoKSkgewotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8Ildhcm5pbmc6IHBpbiAiIDw8bmFtZSA8PCIgZG9lcyBub3QgaGF2ZSBwcmUtY2FsY3VsYXRlZCBhcCwgZ2VuIHRlbXAgYXAgIjsKLSAgICAgICAgLy9mb3IgKGF1dG8gJlticCwgYk51bV06IHB0cykgewotICAgICAgICAvLyAgY291dCA8PCIgKCIgPDxicC54KCkgKiAxLjAgLyBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0REJVUGVyVVUoKSA8PCIsICIKLSAgICAgICAgLy8gICAgICAgICAgICAgIDw8YnAueSgpICogMS4wIC8gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCkgPDwiKSAiOwotICAgICAgICAvL30KLSAgICAgICAgLy9jb3V0IDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIGluaXROZXRfdGVybUdlbkFwKGRQaW4uZ2V0KCkpOwotICAgICAgaWYgKGRQaW4tPmdldEFjY2Vzc1BhdHRlcm5zKCkuZW1wdHkoKSkgewotICAgICAgICBjb3V0IDw8ZW5kbCA8PCJFcnJvcjogcGluICIgPDxuYW1lIDw8IiBzdGlsbCBkb2VzIG5vdCBoYXZlIHRlbXAgYXAiIDw8ZW5kbDsKLSAgICAgICAgZXhpdCgxKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICBmb3IgKGF1dG8gJmFwOiBkUGluLT5nZXRBY2Nlc3NQYXR0ZXJucygpKSB7Ci0gICAgICAgICAgICBmclBvaW50IGJwOwotICAgICAgICAgICAgYXAtPmdldFBvaW50KGJwKTsKLSAgICAgICAgICAgIGNvdXQgPDwiICgiIDw8YnAueCgpICogMS4wIC8gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCkgPDwiLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICA8PGJwLnkoKSAqIDEuMCAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpIDw8IikgIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY291dCA8PGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZFBpbi0+c2V0SWQocGluQ250KTsKLSAgICBwaW5DbnQrKzsKLSAgICBkTmV0LT5hZGRQaW4oZFBpbik7Ci0gIH0KLX0KLQotdm9pZCBGbGV4RFJXb3JrZXI6OmluaXROZXRfYm91bmRhcnkoZHJOZXQqIGROZXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHVuaXF1ZV9wdHI8ZHJDb25uRmlnPiA+ICZleHRPYmpzKSB7Ci0gIC8vYm9vbCBlbmFibGVPdXRwdXQgPSB0cnVlOwotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICAvL2lmICghaXNJbml0RFIoKSAmJiBkTmV0LT5nZXRGck5ldCgpLT5nZXROYW1lKCkgPT0gc3RyaW5nKCJuZXQxNDQ4OCIpKSB7Ci0gIC8vaWYgKCFpc0luaXREUigpICYmIGROZXQtPmdldEZyTmV0KCktPmdldE5hbWUoKSA9PSBzdHJpbmcoIm5ldDEwMDYyOSIpKSB7Ci0gIC8vICBlbmFibGVPdXRwdXQgPSB0cnVlOwotICAvLyAgY291dCA8PCJoZXJlIiA8PGVuZGw7Ci0gIC8vfQotICBhdXRvIGdyaWRCQm94ID0gZ2V0Um91dGVCb3goKTsKLSAgc2V0PHBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4gPiBleHRCb3VuZHM7Ci0gIGlmICghaXNJbml0RFIoKSkgewotICAgIGZvciAoYXV0byAmb2JqOiBleHRPYmpzKSB7Ci0gICAgICBpZiAob2JqLT50eXBlSWQoKSA9PSBkcmNQYXRoU2VnKSB7Ci0gICAgICAgIGF1dG8gcHMgPSBzdGF0aWNfY2FzdDxkclBhdGhTZWcqPihvYmouZ2V0KCkpOwotICAgICAgICBmclBvaW50IGJlZ2luLCBlbmQ7Ci0gICAgICAgIHBzLT5nZXRQb2ludHMoYmVnaW4sIGVuZCk7Ci0gICAgICAgIGZyTGF5ZXJOdW0gbE51bSA9IHBzLT5nZXRMYXllck51bSgpOwotICAgICAgICAvLyB2ZXJ0IHBhdGhzZWcKLSAgICAgICAgaWYgKGJlZ2luLngoKSA9PSBlbmQueCgpICYmIGJlZ2luLngoKSA+PSBncmlkQkJveC5sZWZ0KCkgJiYgZW5kLngoKSA8PSBncmlkQkJveC5yaWdodCgpKSB7Ci0gICAgICAgICAgaWYgKGJlZ2luLnkoKSA9PSBncmlkQkJveC50b3AoKSkgewotICAgICAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgICAgICBjb3V0IDw8ICJ0b3AgYm91bmQgKCIgCi0gICAgICAgICAgICAgICAgICAgPDwgYmVnaW4ueCgpICogMS4wIC8gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCkgPDwgIiwgIiAKLSAgICAgICAgICAgICAgICAgICA8PCBiZWdpbi55KCkgKiAxLjAgLyBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0REJVUGVyVVUoKSA8PCAiKSAtICgiIAotICAgICAgICAgICAgICAgICAgIDw8IGVuZC54KCkgICAqIDEuMCAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpPDwgIiwgIiAKLSAgICAgICAgICAgICAgICAgICA8PCBlbmQueSgpICAgKiAxLjAgLyBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0REJVUGVyVVUoKTw8ICIpICIgCi0gICAgICAgICAgICAgICAgICAgPDwgZ2V0VGVjaCgpLT5nZXRMYXllcihsTnVtKS0+Z2V0TmFtZSgpIDw8IlxuIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGV4dEJvdW5kcy5pbnNlcnQobWFrZV9wYWlyKGJlZ2luLCBsTnVtKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChlbmQueSgpID09IGdyaWRCQm94LmJvdHRvbSgpKSB7Ci0gICAgICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgICAgIGNvdXQgPDwgImJvdHRvbSBib3VuZCAoIgotICAgICAgICAgICAgICAgICAgIDw8IGJlZ2luLngoKSAqIDEuMCAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpIDw8ICIsICIgCi0gICAgICAgICAgICAgICAgICAgPDwgYmVnaW4ueSgpICogMS4wIC8gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCkgPDwgIikgLSAoIiAKLSAgICAgICAgICAgICAgICAgICA8PCBlbmQueCgpICAgKiAxLjAgLyBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0REJVUGVyVVUoKTw8ICIsICIgCi0gICAgICAgICAgICAgICAgICAgPDwgZW5kLnkoKSAgICogMS4wIC8gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCk8PCAiKSAiIAotICAgICAgICAgICAgICAgICAgIDw8IGdldFRlY2goKS0+Z2V0TGF5ZXIobE51bSktPmdldE5hbWUoKSA8PCJcbiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBleHRCb3VuZHMuaW5zZXJ0KG1ha2VfcGFpcihlbmQsIGxOdW0pKTsKLSAgICAgICAgICB9Ci0gICAgICAgIC8vIGhvcnogcGF0aHNlZwotICAgICAgICB9IGVsc2UgaWYgKGJlZ2luLnkoKSA9PSBlbmQueSgpICYmIGJlZ2luLnkoKSA+PSBncmlkQkJveC5ib3R0b20oKSAmJiBlbmQueSgpIDw9IGdyaWRCQm94LnRvcCgpKSB7Ci0gICAgICAgICAgaWYgKGJlZ2luLngoKSA9PSBncmlkQkJveC5yaWdodCgpKSB7Ci0gICAgICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgICAgIGNvdXQgPDwgInJpZ2h0IGJvdW5kICgiCi0gICAgICAgICAgICAgICAgICAgPDwgYmVnaW4ueCgpICogMS4wIC8gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCkgPDwgIiwgIiAKLSAgICAgICAgICAgICAgICAgICA8PCBiZWdpbi55KCkgKiAxLjAgLyBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0REJVUGVyVVUoKSA8PCAiKSAtICgiIAotICAgICAgICAgICAgICAgICAgIDw8IGVuZC54KCkgICAqIDEuMCAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpPDwgIiwgIiAKLSAgICAgICAgICAgICAgICAgICA8PCBlbmQueSgpICAgKiAxLjAgLyBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0REJVUGVyVVUoKTw8ICIpICIgCi0gICAgICAgICAgICAgICAgICAgPDwgZ2V0VGVjaCgpLT5nZXRMYXllcihsTnVtKS0+Z2V0TmFtZSgpIDw8IlxuIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGV4dEJvdW5kcy5pbnNlcnQobWFrZV9wYWlyKGJlZ2luLCBsTnVtKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChlbmQueCgpID09IGdyaWRCQm94LmxlZnQoKSkgewotICAgICAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgICAgICBjb3V0IDw8ICJsZWZ0IGJvdW5kICgiIAotICAgICAgICAgICAgICAgICAgIDw8IGJlZ2luLngoKSAqIDEuMCAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpIDw8ICIsICIgCi0gICAgICAgICAgICAgICAgICAgPDwgYmVnaW4ueSgpICogMS4wIC8gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCkgPDwgIikgLSAoIiAKLSAgICAgICAgICAgICAgICAgICA8PCBlbmQueCgpICAgKiAxLjAgLyBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0REJVUGVyVVUoKTw8ICIsICIgCi0gICAgICAgICAgICAgICAgICAgPDwgZW5kLnkoKSAgICogMS4wIC8gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCk8PCAiKSAiIAotICAgICAgICAgICAgICAgICAgIDw8IGdldFRlY2goKS0+Z2V0TGF5ZXIobE51bSktPmdldE5hbWUoKSA8PCJcbiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBleHRCb3VuZHMuaW5zZXJ0KG1ha2VfcGFpcihlbmQsIGxOdW0pKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIC8vIGluaXREUgotICB9IGVsc2UgewotICAgIGF1dG8gaXQgPSBib3VuZGFyeVBpbi5maW5kKGROZXQtPmdldEZyTmV0KCkpOwotICAgIC8vY291dCA8PHN0cmluZyhkTmV0LT5nZXRGck5ldCgpID09IG51bGxwdHIgPyAibnVsbCIgOiBkTmV0LT5nZXRGck5ldCgpLT5nZXROYW1lKCkpIDw8ZW5kbDsKLSAgICBpZiAoaXQgIT0gYm91bmRhcnlQaW4uZW5kKCkpIHsKLSAgICAgIC8vY291dCA8PCJoZXJlIiA8PGVuZGw7Ci0gICAgICBleHRCb3VuZHMgPSBpdC0+c2Vjb25kOwotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBmb3IgKGF1dG8gJltwdCwgbE51bV06IGl0LT5zZWNvbmQpIHsKLSAgICAgICAgICBjb3V0IDw8ICJpbml0IGJvdW5kICgiIAotICAgICAgICAgICAgICAgPDwgcHQueCgpICogMS4wIC8gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCkgPDwgIiwgIiAKLSAgICAgICAgICAgICAgIDw8IHB0LnkoKSAqIDEuMCAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpIDw8ICIpICIgCi0gICAgICAgICAgICAgICA8PCBnZXRUZWNoKCktPmdldExheWVyKGxOdW0pLT5nZXROYW1lKCkgPDwiXG4iOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGZvciAoYXV0byAmW3B0LCBsTnVtXTogZXh0Qm91bmRzKSB7Ci0gICAgYXV0byBkUGluID0gbWFrZV91bmlxdWU8ZHJQaW4+KCk7Ci0gICAgYXV0byBkQXAgID0gbWFrZV91bmlxdWU8ZHJBY2Nlc3NQYXR0ZXJuPigpOwotICAgIGRBcC0+c2V0UG9pbnQocHQpOwotICAgIGRBcC0+c2V0QmVnaW5MYXllck51bShsTnVtKTsKLSAgICBkUGluLT5hZGRBY2Nlc3NQYXR0ZXJuKGRBcCk7Ci0gICAgLy8gYXAKLSAgICBkUGluLT5zZXRJZChwaW5DbnQpOwotICAgIHBpbkNudCsrOwotICAgIGROZXQtPmFkZFBpbihkUGluKTsKLSAgfQotfQotCi12b2lkIEZsZXhEUldvcmtlcjo6aW5pdE5ldChmck5ldCogbmV0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3Rvcjx1bmlxdWVfcHRyPGRyQ29ubkZpZz4gPiAmcm91dGVPYmpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHVuaXF1ZV9wdHI8ZHJDb25uRmlnPiA+ICZleHRPYmpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPGZyQmxvY2tPYmplY3QqPiAmdGVybXMpIHsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgYXV0byBkTmV0ID0gbWFrZV91bmlxdWU8ZHJOZXQ+KCk7Ci0gIGROZXQtPnNldEZyTmV0KG5ldCk7Ci0gIC8vIHRydWUgcGluCi0gIGluaXROZXRfdGVybShkTmV0LmdldCgpLCB0ZXJtcyk7Ci0gIC8vIGJvdW5kYXJ5IHBpbiwgY291bGQgb3ZlcmxhcCB3aXRoIGFueSBvZiB0cnVlIHBpbnMKLSAgaW5pdE5ldF9ib3VuZGFyeShkTmV0LmdldCgpLCBleHRPYmpzKTsKLSAgLy8gbm8gZXh0IHJvdXRlcyBpbiBpbml0RFIgdG8gYXZvaWQgd2VpcmQgVEEgc2hhcGVzCi0gIGZvciAoYXV0byAmb2JqOiBleHRPYmpzKSB7Ci0gICAgZE5ldC0+YWRkUm91dGUob2JqLCB0cnVlKTsKLSAgfQotICBpZiAoIWlzSW5pdERSKCkpIHsKLSAgICBmb3IgKGF1dG8gJm9iajogcm91dGVPYmpzKSB7Ci0gICAgICBkTmV0LT5hZGRSb3V0ZShvYmosIGZhbHNlKTsKLSAgICB9Ci0gIH0KLSAgZE5ldC0+c2V0SWQobmV0cy5zaXplKCkpOwotICBuZXRzLnB1c2hfYmFjayhzdGQ6Om1vdmUoZE5ldCkpOwotfQotCi12b2lkIEZsZXhEUldvcmtlcjo6aW5pdE5ldHNfcmVnaW9uUXVlcnkoKSB7Ci0gIGF1dG8gJndvcmtlclJlZ2lvblF1ZXJ5ID0gZ2V0V29ya2VyUmVnaW9uUXVlcnkoKTsKLSAgd29ya2VyUmVnaW9uUXVlcnkuaW5pdCgpOwotfQotCi12b2lkIEZsZXhEUldvcmtlcjo6aW5pdE5ldHNfbnVtUGluc0luKCkgewotICB2ZWN0b3I8cnFfcnB0cl92YWx1ZV90PGRyUGluPiA+IGFsbFBpbnM7Ci0gIGZyUG9pbnQgcHQ7Ci0gIGZvciAoYXV0byAmbmV0OiBuZXRzKSB7Ci0gICAgZm9yIChhdXRvICZwaW46IG5ldC0+Z2V0UGlucygpKSB7Ci0gICAgICBmb3IgKGF1dG8gJmFwOiBwaW4tPmdldEFjY2Vzc1BhdHRlcm5zKCkpIHsKLSAgICAgICAgYXAtPmdldFBvaW50KHB0KTsKLSAgICAgICAgLy9waW5SZWdpb25RdWVyeS5pbnNlcnQobWFrZV9wYWlyKGJveF90KHBvaW50X3QocHQueCgpLCBwdC55KCkpLCBwb2ludF90KHB0LngoKSwgcHQueSgpKSksIHBpbi5nZXQoKSkpOwotICAgICAgICBhbGxQaW5zLnB1c2hfYmFjayhtYWtlX3BhaXIoYm94X3QocG9pbnRfdChwdC54KCksIHB0LnkoKSksIHBvaW50X3QocHQueCgpLCBwdC55KCkpKSwgcGluLmdldCgpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICBiZ2k6OnJ0cmVlPHJxX3JwdHJfdmFsdWVfdDxkclBpbj4sIGJnaTo6cXVhZHJhdGljPDE2PiA+IHBpblJlZ2lvblF1ZXJ5KGFsbFBpbnMpOwotICBmb3IgKGF1dG8gJm5ldDogbmV0cykgewotICAgIGZyQ29vcmQgeDEgPSBnZXRFeHRCb3goKS5yaWdodCgpOwotICAgIGZyQ29vcmQgeDIgPSBnZXRFeHRCb3goKS5sZWZ0KCk7Ci0gICAgZnJDb29yZCB5MSA9IGdldEV4dEJveCgpLnRvcCgpOwotICAgIGZyQ29vcmQgeTIgPSBnZXRFeHRCb3goKS5ib3R0b20oKTsKLSAgICBmb3IgKGF1dG8gJnBpbjogbmV0LT5nZXRQaW5zKCkpIHsKLSAgICAgIGZvciAoYXV0byAmYXA6IHBpbi0+Z2V0QWNjZXNzUGF0dGVybnMoKSkgewotICAgICAgICBhcC0+Z2V0UG9pbnQocHQpOwotICAgICAgICBpZiAocHQueCgpIDwgeDEpIHsKLSAgICAgICAgICB4MSA9IHB0LngoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHQueCgpID4geDIpIHsKLSAgICAgICAgICB4MiA9IHB0LngoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHQueSgpIDwgeTEpIHsKLSAgICAgICAgICB5MSA9IHB0LnkoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHQueSgpID4geTIpIHsKLSAgICAgICAgICB5MiA9IHB0LnkoKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHgxIDw9IHgyICYmIHkxIDw9IHkyKSB7Ci0gICAgICBib3hfdCBib29zdGIgPSBib3hfdChwb2ludF90KHgxLCB5MSksIHBvaW50X3QoeDIsIHkyKSk7Ci0gICAgICBhbGxQaW5zLmNsZWFyKCk7Ci0gICAgICBwaW5SZWdpb25RdWVyeS5xdWVyeShiZ2k6OmludGVyc2VjdHMoYm9vc3RiKSwgYmFja19pbnNlcnRlcihhbGxQaW5zKSk7Ci0gICAgICBuZXQtPnNldE51bVBpbnNJbihhbGxQaW5zLnNpemUoKSk7Ci0gICAgICBmckJveCB0bXBCb3goeDEsIHkxLCB4MiwgeTIpOwotICAgICAgbmV0LT5zZXRQaW5Cb3godG1wQm94KTsKLSAgICB9IGVsc2UgewotICAgICAgbmV0LT5zZXROdW1QaW5zSW4oOTk5OTkpOwotICAgICAgbmV0LT5zZXRQaW5Cb3goZ2V0RXh0Qm94KCkpOwotICAgIH0KLSAgfQotfQotCi12b2lkIEZsZXhEUldvcmtlcjo6aW5pdE5ldHMoKSB7Ci0gIHNldDxmck5ldCosIGZyQmxvY2tPYmplY3RDb21wPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0czsKLSAgbWFwPGZyTmV0KiwgdmVjdG9yPHVuaXF1ZV9wdHI8ZHJDb25uRmlnPiA+LCBmckJsb2NrT2JqZWN0Q29tcD4gICAgICBuZXRSb3V0ZU9ianM7Ci0gIG1hcDxmck5ldCosIHZlY3Rvcjx1bmlxdWVfcHRyPGRyQ29ubkZpZz4gPiwgZnJCbG9ja09iamVjdENvbXA+ICAgICAgbmV0RXh0T2JqczsKLSAgLy8gZ2V0IGxvY2sKLSAgaW5pdE5ldE9ianMobmV0cywgbmV0Um91dGVPYmpzLCBuZXRFeHRPYmpzKTsKLSAgLy8gcmVsZWFzZSBsb2NrCi0gIGlmIChpc0luaXREUigpKSB7Ci0gICAgaW5pdE5ldHNfaW5pdERSKG5ldHMsIG5ldFJvdXRlT2JqcywgbmV0RXh0T2Jqcyk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gZmluZCBpbnRlVGVybS90ZXJtcyB1c2luZyBuZXRSb3V0ZU9ianM7Ci0gICAgaW5pdE5ldHNfc2VhcmNoUmVwYWlyKG5ldHMsIG5ldFJvdXRlT2JqcywgbmV0RXh0T2Jqcyk7Ci0gIH0KLSAgaW5pdE5ldHNfcmVnaW9uUXVlcnkoKTsKLSAgaW5pdE5ldHNfbnVtUGluc0luKCk7Ci19Ci0KLXZvaWQgRmxleERSV29ya2VyOjppbml0VHJhY2tDb29yZHNfcm91dGUoZHJOZXQqIG5ldCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxmckNvb3JkLCBtYXA8ZnJMYXllck51bSwgZnJUcmFja1BhdHRlcm4qPiA+ICZ4TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8ZnJDb29yZCwgbWFwPGZyTGF5ZXJOdW0sIGZyVHJhY2tQYXR0ZXJuKj4gPiAmeU1hcCkgewotICAvL2F1dG8gcmJveCA9IGdldFJvdXRlQm94KCk7Ci0gIC8vYXV0byBlYm94ID0gZ2V0RXh0Qm94KCk7Ci0gIC8vIGFkZCBmb3Igcm91dGVzCi0gIHZlY3RvcjxkckNvbm5GaWcqPiBhbGxPYmpzOwotICBmb3IgKGF1dG8gJnVDb25uRmlnOiBuZXQtPmdldEV4dENvbm5GaWdzKCkpIHsKLSAgICBhbGxPYmpzLnB1c2hfYmFjayh1Q29ubkZpZy5nZXQoKSk7Ci0gIH0KLSAgZm9yIChhdXRvICZ1Q29ubkZpZzogbmV0LT5nZXRSb3V0ZUNvbm5GaWdzKCkpIHsKLSAgICBhbGxPYmpzLnB1c2hfYmFjayh1Q29ubkZpZy5nZXQoKSk7Ci0gIH0KLSAgLy9mb3IgKGF1dG8gJnVDb25uRmlnOiBuZXQtPmdldEV4dENvbm5GaWdzKCkpIHsKLSAgZm9yIChhdXRvICZ1Q29ubkZpZzogYWxsT2JqcykgewotICAgIGlmICh1Q29ubkZpZy0+dHlwZUlkKCkgPT0gZHJjUGF0aFNlZykgewotICAgICAgYXV0byBvYmogPSBzdGF0aWNfY2FzdDxkclBhdGhTZWcqPih1Q29ubkZpZyk7Ci0gICAgICBmclBvaW50IGJwLCBlcDsKLSAgICAgIG9iai0+Z2V0UG9pbnRzKGJwLCBlcCk7Ci0gICAgICBhdXRvIGxOdW0gPSBvYmotPmdldExheWVyTnVtKCk7Ci0gICAgICAvLyB2ZXJ0aWNhbAotICAgICAgaWYgKGJwLngoKSA9PSBlcC54KCkpIHsKLSAgICAgICAgLy8gbm9uIHByZWYgZGlyCi0gICAgICAgIGlmIChnZXRUZWNoKCktPmdldExheWVyKGxOdW0pLT5nZXREaXIoKSA9PSBmcmNIb3J6UHJlZlJvdXRpbmdEaXIpIHsKLSAgICAgICAgICBpZiAobE51bSArIDIgPD0gZ2V0VGVjaCgpLT5nZXRUb3BMYXllck51bSgpKSB7Ci0gICAgICAgICAgICB4TWFwW2JwLngoKV1bbE51bSArIDJdID0gbnVsbHB0cjsgLy8gZGVmYXVsdCBhZGQgdHJhY2sgdG8gdXBwZXIgbGF5ZXIKLSAgICAgICAgICB9IGVsc2UgaWYgKGxOdW0gLSAyID49IGdldFRlY2goKS0+Z2V0Qm90dG9tTGF5ZXJOdW0oKSkgewotICAgICAgICAgICAgeE1hcFticC54KCldW2xOdW0gLSAyXSA9IG51bGxwdHI7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvdXQgPDwiRXJyb3I6IGluaXRUcmFja0Nvb3JkcyBjYW5ub3QgYWRkIG5vbi1wcmVmIHRyYWNrIiA8PGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIGFkZCBicCwgZXAKLSAgICAgICAgICAvL2lmICghaXNJbml0RFIoKSkgewotICAgICAgICAgICAgeU1hcFticC55KCldW2xOdW1dID0gbnVsbHB0cjsKLSAgICAgICAgICAgIHlNYXBbZXAueSgpXVtsTnVtXSA9IG51bGxwdHI7Ci0gICAgICAgICAgLy99Ci0gICAgICAgIC8vIHByZWYgZGlyIAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHhNYXBbYnAueCgpXVtsTnVtXSA9IG51bGxwdHI7Ci0gICAgICAgICAgLy8gYWRkIGJwLCBlcAotICAgICAgICAgIC8vaWYgKCFpc0luaXREUigpKSB7Ci0gICAgICAgICAgICBpZiAobE51bSArIDIgPD0gZ2V0VGVjaCgpLT5nZXRUb3BMYXllck51bSgpKSB7Ci0gICAgICAgICAgICAgIHlNYXBbYnAueSgpXVtsTnVtICsgMl0gPSBudWxscHRyOyAvLyBkZWZhdWx0IGFkZCB0cmFjayB0byB1cHBlciBsYXllcgotICAgICAgICAgICAgICB5TWFwW2VwLnkoKV1bbE51bSArIDJdID0gbnVsbHB0cjsgLy8gZGVmYXVsdCBhZGQgdHJhY2sgdG8gdXBwZXIgbGF5ZXIKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobE51bSAtIDIgPj0gZ2V0VGVjaCgpLT5nZXRCb3R0b21MYXllck51bSgpKSB7Ci0gICAgICAgICAgICAgIHlNYXBbYnAueSgpXVtsTnVtIC0gMl0gPSBudWxscHRyOwotICAgICAgICAgICAgICB5TWFwW2VwLnkoKV1bbE51bSAtIDJdID0gbnVsbHB0cjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGNvdXQgPDwiRXJyb3I6IGluaXRUcmFja0Nvb3JkcyBjYW5ub3QgYWRkIG5vbi1wcmVmIHRyYWNrIiA8PGVuZGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgLy99Ci0gICAgICAgIH0KLSAgICAgIC8vIGhvcml6b250YWwKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIG5vbiBwcmVmIGRpcgotICAgICAgICBpZiAoZ2V0VGVjaCgpLT5nZXRMYXllcihsTnVtKS0+Z2V0RGlyKCkgPT0gZnJjVmVydFByZWZSb3V0aW5nRGlyKSB7Ci0gICAgICAgICAgaWYgKGxOdW0gKyAyIDw9IGdldFRlY2goKS0+Z2V0VG9wTGF5ZXJOdW0oKSkgewotICAgICAgICAgICAgeU1hcFticC55KCldW2xOdW0gKyAyXSA9IG51bGxwdHI7Ci0gICAgICAgICAgfSBlbHNlIGlmIChsTnVtIC0gMiA+PSBnZXRUZWNoKCktPmdldEJvdHRvbUxheWVyTnVtKCkpIHsKLSAgICAgICAgICAgIHlNYXBbYnAueSgpXVtsTnVtIC0gMl0gPSBudWxscHRyOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb3V0IDw8IkVycm9yOiBpbml0VHJhY2tDb29yZHMgY2Fubm90IGFkZCBub24tcHJlZiB0cmFjayIgPDxlbmRsOwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBhZGQgYnAsIGVwCi0gICAgICAgICAgLy9pZiAoIWlzSW5pdERSKCkpIHsKLSAgICAgICAgICAgIHhNYXBbYnAueCgpXVtsTnVtXSA9IG51bGxwdHI7Ci0gICAgICAgICAgICB4TWFwW2VwLngoKV1bbE51bV0gPSBudWxscHRyOwotICAgICAgICAgIC8vfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHlNYXBbYnAueSgpXVtsTnVtXSA9IG51bGxwdHI7Ci0gICAgICAgICAgLy8gYWRkIGJwLCBlcAotICAgICAgICAgIC8vaWYgKCFpc0luaXREUigpKSB7Ci0gICAgICAgICAgICBpZiAobE51bSArIDIgPD0gZ2V0VGVjaCgpLT5nZXRUb3BMYXllck51bSgpKSB7Ci0gICAgICAgICAgICAgIHhNYXBbYnAueCgpXVtsTnVtICsgMl0gPSBudWxscHRyOyAvLyBkZWZhdWx0IGFkZCB0cmFjayB0byB1cHBlciBsYXllcgotICAgICAgICAgICAgICB4TWFwW2VwLngoKV1bbE51bSArIDJdID0gbnVsbHB0cjsgLy8gZGVmYXVsdCBhZGQgdHJhY2sgdG8gdXBwZXIgbGF5ZXIKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobE51bSAtIDIgPj0gZ2V0VGVjaCgpLT5nZXRCb3R0b21MYXllck51bSgpKSB7Ci0gICAgICAgICAgICAgIHhNYXBbYnAueCgpXVtsTnVtIC0gMl0gPSBudWxscHRyOwotICAgICAgICAgICAgICB4TWFwW2VwLngoKV1bbE51bSAtIDJdID0gbnVsbHB0cjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGNvdXQgPDwiRXJyb3I6IGluaXRUcmFja0Nvb3JkcyBjYW5ub3QgYWRkIG5vbi1wcmVmIHRyYWNrIiA8PGVuZGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgLy99Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHVDb25uRmlnLT50eXBlSWQoKSA9PSBkcmNWaWEpIHsKLSAgICAgIGF1dG8gb2JqID0gc3RhdGljX2Nhc3Q8ZHJWaWEqPih1Q29ubkZpZyk7Ci0gICAgICBmclBvaW50IHB0OwotICAgICAgb2JqLT5nZXRPcmlnaW4ocHQpOwotICAgICAgLy8gYWRkIHByZWYgZGlyIHRyYWNrIHRvIGxheWVyMQotICAgICAgYXV0byBsYXllcjFOdW0gPSBvYmotPmdldFZpYURlZigpLT5nZXRMYXllcjFOdW0oKTsKLSAgICAgIGlmIChnZXRUZWNoKCktPmdldExheWVyKGxheWVyMU51bSktPmdldERpcigpID09IGZyY0hvcnpQcmVmUm91dGluZ0RpcikgewotICAgICAgICB5TWFwW3B0LnkoKV1bbGF5ZXIxTnVtXSA9IG51bGxwdHI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB4TWFwW3B0LngoKV1bbGF5ZXIxTnVtXSA9IG51bGxwdHI7Ci0gICAgICB9Ci0gICAgICAvLyBhZGQgcHJlZiBkaXIgdHJhY2sgdG8gbGF5ZXIyCi0gICAgICBhdXRvIGxheWVyMk51bSA9IG9iai0+Z2V0VmlhRGVmKCktPmdldExheWVyMk51bSgpOwotICAgICAgaWYgKGdldFRlY2goKS0+Z2V0TGF5ZXIobGF5ZXIyTnVtKS0+Z2V0RGlyKCkgPT0gZnJjSG9yelByZWZSb3V0aW5nRGlyKSB7Ci0gICAgICAgIHlNYXBbcHQueSgpXVtsYXllcjJOdW1dID0gbnVsbHB0cjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHhNYXBbcHQueCgpXVtsYXllcjJOdW1dID0gbnVsbHB0cjsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHVDb25uRmlnLT50eXBlSWQoKSA9PSBkcmNQYXRjaFdpcmUpIHsKLQotICAgIH0gZWxzZSB7Ci0gICAgICBjb3V0IDw8IkVycm9yOiBpbml0VHJhY2tDb29yZHMgdW5zdXBwb3J0ZWQgdHlwZSIgPDxlbmRsOwotICAgIH0KLSAgfQotfQotICAgIAotdm9pZCBGbGV4RFJXb3JrZXI6OmluaXRUcmFja0Nvb3Jkc19waW4oZHJOZXQqIG5ldCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8ZnJDb29yZCwgbWFwPGZyTGF5ZXJOdW0sIGZyVHJhY2tQYXR0ZXJuKj4gPiAmeE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxmckNvb3JkLCBtYXA8ZnJMYXllck51bSwgZnJUcmFja1BhdHRlcm4qPiA+ICZ5TWFwKSB7Ci0gIC8vYXV0byByYm94ID0gZ2V0Um91dGVCb3goKTsKLSAgLy9hdXRvIGVib3ggPSBnZXRFeHRCb3goKTsKLSAgLy8gYWRkIGZvciBhcHMKLSAgZm9yIChhdXRvICZwaW46IG5ldC0+Z2V0UGlucygpKSB7Ci0gICAgZm9yIChhdXRvICZhcDogcGluLT5nZXRBY2Nlc3NQYXR0ZXJucygpKSB7Ci0gICAgICBmclBvaW50IHB0OwotICAgICAgYXAtPmdldFBvaW50KHB0KTsKLSAgICAgIC8vIGFwIG11c3QgYmUgd2l0aGluIHJib3gKLSAgICAgIC8vaWYgKCFlYm94LmNvbnRhaW5zKHB0KSkgewotICAgICAgLy8gIGNvbnRpbnVlOwotICAgICAgLy99Ci0gICAgICBhdXRvIGxOdW0gPSBhcC0+Z2V0QmVnaW5MYXllck51bSgpOwotICAgICAgZnJMYXllck51bSBsTnVtMiA9IDA7Ci0gICAgICBpZiAobE51bSArIDIgPD0gZ2V0VGVjaCgpLT5nZXRUb3BMYXllck51bSgpKSB7Ci0gICAgICAgIGxOdW0yID0gbE51bSArIDI7Ci0gICAgICB9IGVsc2UgaWYgKGxOdW0gLSAyID49IGdldFRlY2goKS0+Z2V0Qm90dG9tTGF5ZXJOdW0oKSkgewotICAgICAgICBsTnVtMiA9IGxOdW0gLSAyOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogaW5pdFRyYWNrQ29vcmRzIGNhbm5vdCBhZGQgbm9uLXByZWYgdHJhY2siIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIGlmIChnZXRUZWNoKCktPmdldExheWVyKGxOdW0pLT5nZXREaXIoKSA9PSBmcmNIb3J6UHJlZlJvdXRpbmdEaXIpIHsKLSAgICAgICAgeU1hcFtwdC55KCldW2xOdW1dID0gbnVsbHB0cjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHhNYXBbcHQueCgpXVtsTnVtXSA9IG51bGxwdHI7Ci0gICAgICB9Ci0gICAgICBpZiAoZ2V0VGVjaCgpLT5nZXRMYXllcihsTnVtMiktPmdldERpcigpID09IGZyY0hvcnpQcmVmUm91dGluZ0RpcikgewotICAgICAgICB5TWFwW3B0LnkoKV1bbE51bTJdID0gbnVsbHB0cjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHhNYXBbcHQueCgpXVtsTnVtMl0gPSBudWxscHRyOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi12b2lkIEZsZXhEUldvcmtlcjo6aW5pdFRyYWNrQ29vcmRzKG1hcDxmckNvb3JkLCBtYXA8ZnJMYXllck51bSwgZnJUcmFja1BhdHRlcm4qPiA+ICZ4TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8ZnJDb29yZCwgbWFwPGZyTGF5ZXJOdW0sIGZyVHJhY2tQYXR0ZXJuKj4gPiAmeU1hcCkgewotICAvLyBhZGQgYm91bmRhcnkgcG9pbnRzCi0gIC8vIGxOdW0gPSAtMTAgdG8gaW5kaWNhdGUgcm91dGVCb3ggYW5kIGV4dEJveCBmckNvb3JkCi0gIGF1dG8gcmJveCA9IGdldFJvdXRlQm94KCk7Ci0gIGF1dG8gZWJveCA9IGdldEV4dEJveCgpOwotICB5TWFwW3Jib3guYm90dG9tKCldWy0xMF0gPSBudWxscHRyOwotICB5TWFwW3Jib3gudG9wKCldWy0xMF0gPSBudWxscHRyOwotICB5TWFwW2Vib3guYm90dG9tKCldWy0xMF0gPSBudWxscHRyOwotICB5TWFwW2Vib3gudG9wKCldWy0xMF0gPSBudWxscHRyOwotICB4TWFwW3Jib3gubGVmdCgpXVstMTBdID0gbnVsbHB0cjsKLSAgeE1hcFtyYm94LnJpZ2h0KCldWy0xMF0gPSBudWxscHRyOwotICB4TWFwW2Vib3gubGVmdCgpXVstMTBdID0gbnVsbHB0cjsKLSAgeE1hcFtlYm94LnJpZ2h0KCldWy0xMF0gPSBudWxscHRyOwotICAvLyBhZGQgYWxsIHRyYWNrIGNvb3JkcwotICBmb3IgKGF1dG8gJm5ldDogbmV0cykgewotICAgIGluaXRUcmFja0Nvb3Jkc19yb3V0ZShuZXQuZ2V0KCksIHhNYXAsIHlNYXApOwotICAgIGluaXRUcmFja0Nvb3Jkc19waW4obmV0LmdldCgpLCB4TWFwLCB5TWFwKTsKLSAgfQotfQotCi12b2lkIEZsZXhEUldvcmtlcjo6aW5pdEdyaWRHcmFwaCgpIHsKLSAgLy8gZ2V0IGFsbCB0cmFjayBjb29yZHMgYmFzZWQgb24gZXhpc3Rpbmcgb2JqcyBhbmQgYXBzCi0gIG1hcDxmckNvb3JkLCBtYXA8ZnJMYXllck51bSwgZnJUcmFja1BhdHRlcm4qPiA+IHhNYXA7Ci0gIG1hcDxmckNvb3JkLCBtYXA8ZnJMYXllck51bSwgZnJUcmFja1BhdHRlcm4qPiA+IHlNYXA7Ci0gIGluaXRUcmFja0Nvb3Jkcyh4TWFwLCB5TWFwKTsKLSAgZ3JpZEdyYXBoLnNldENvc3Qod29ya2VyRFJDQ29zdCwgd29ya2VyTWFya2VyQ29zdCk7Ci0gIGdyaWRHcmFwaC5pbml0KGdldFJvdXRlQm94KCksIGdldEV4dEJveCgpLCB4TWFwLCB5TWFwLCBpc0luaXREUigpKTsKLSAgLy9ncmlkR3JhcGgucHJpbnQoKTsKLX0KLQotdm9pZCBGbGV4RFJXb3JrZXI6OmluaXRNYXplSWR4X2Nvbm5GaWcoZHJDb25uRmlnICpjb25uRmlnKSB7Ci0gIGlmIChjb25uRmlnLT50eXBlSWQoKSA9PSBkcmNQYXRoU2VnKSB7Ci0gICAgYXV0byBvYmogPSBzdGF0aWNfY2FzdDxkclBhdGhTZWcqPihjb25uRmlnKTsKLSAgICBmclBvaW50IGJwLCBlcDsKLSAgICBvYmotPmdldFBvaW50cyhicCwgZXApOwotICAgIGJwLnNldChtYXgoYnAueCgpLCBnZXRFeHRCb3goKS5sZWZ0KCkpLCAgbWF4KGJwLnkoKSwgZ2V0RXh0Qm94KCkuYm90dG9tKCkpKTsKLSAgICBlcC5zZXQobWluKGVwLngoKSwgZ2V0RXh0Qm94KCkucmlnaHQoKSksIG1pbihlcC55KCksIGdldEV4dEJveCgpLnRvcCgpKSk7Ci0gICAgYXV0byBsTnVtID0gb2JqLT5nZXRMYXllck51bSgpOwotICAgIGlmIChncmlkR3JhcGguaGFzTWF6ZUlkeChicCwgbE51bSkgJiYgZ3JpZEdyYXBoLmhhc01hemVJZHgoZXAsIGxOdW0pKSB7Ci0gICAgICBGbGV4TWF6ZUlkeCBiaSwgZWk7Ci0gICAgICBncmlkR3JhcGguZ2V0TWF6ZUlkeChiaSwgYnAsIGxOdW0pOwotICAgICAgZ3JpZEdyYXBoLmdldE1hemVJZHgoZWksIGVwLCBsTnVtKTsKLSAgICAgIG9iai0+c2V0TWF6ZUlkeChiaSwgZWkpOwotICAgICAgLy9jb3V0IDw8ImhhcyBpZHggcGF0aHNlZyIgPDxlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBjb3V0IDw8IkVycm9yOiBpbml0TWF6ZUlkeF9jb25uRmlnIHBhdGhzZWcgbm8gaWR4ICgiIAotICAgICAgICAgICA8PCBicC54KCkgKiAxLjAgLyBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0REJVUGVyVVUoKSAgPDwiLCAiCi0gICAgICAgICAgIDw8IGJwLnkoKSAqIDEuMCAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpICA8PCIpICgiCi0gICAgICAgICAgIDw8IGVwLngoKSAqIDEuMCAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpICA8PCIsICIKLSAgICAgICAgICAgPDwgZXAueSgpICogMS4wIC8gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCkgIDw8IikgIgotICAgICAgICAgICA8PCBnZXRUZWNoKCktPmdldExheWVyKGxOdW0pLT5nZXROYW1lKCkKLSAgICAgICAgICAgPDxlbmRsOwotICAgIH0KLSAgfSBlbHNlIGlmIChjb25uRmlnLT50eXBlSWQoKSA9PSBkcmNWaWEpIHsKLSAgICBhdXRvIG9iaiA9IHN0YXRpY19jYXN0PGRyVmlhKj4oY29ubkZpZyk7Ci0gICAgZnJQb2ludCBicDsKLSAgICBvYmotPmdldE9yaWdpbihicCk7Ci0gICAgYXV0byBsYXllcjFOdW0gPSBvYmotPmdldFZpYURlZigpLT5nZXRMYXllcjFOdW0oKTsKLSAgICBhdXRvIGxheWVyMk51bSA9IG9iai0+Z2V0VmlhRGVmKCktPmdldExheWVyMk51bSgpOwotICAgIGlmIChncmlkR3JhcGguaGFzTWF6ZUlkeChicCwgbGF5ZXIxTnVtKSAmJiBncmlkR3JhcGguaGFzTWF6ZUlkeChicCwgbGF5ZXIyTnVtKSkgewotICAgICAgRmxleE1hemVJZHggYmksIGVpOwotICAgICAgZ3JpZEdyYXBoLmdldE1hemVJZHgoYmksIGJwLCBsYXllcjFOdW0pOwotICAgICAgZ3JpZEdyYXBoLmdldE1hemVJZHgoZWksIGJwLCBsYXllcjJOdW0pOwotICAgICAgb2JqLT5zZXRNYXplSWR4KGJpLCBlaSk7Ci0gICAgICAvL2NvdXQgPDwiaGFzIGlkeCB2aWEiIDw8ZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgY291dCA8PCJFcnJvcjogaW5pdE1hemVJZHhfY29ubkZpZyB2aWEgbm8gaWR4ICgiIAotICAgICAgICAgICA8PCBicC54KCkgKiAxLjAgLyBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0REJVUGVyVVUoKSAgPDwiLCAiCi0gICAgICAgICAgIDw8IGJwLnkoKSAqIDEuMCAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpICA8PCIpICIKLSAgICAgICAgICAgPDwgZ2V0VGVjaCgpLT5nZXRMYXllcihsYXllcjFOdW0gKyAxKS0+Z2V0TmFtZSgpCi0gICAgICAgICAgIDw8ZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoY29ubkZpZy0+dHlwZUlkKCkgPT0gZHJjUGF0Y2hXaXJlKSB7Ci0KLSAgfSBlbHNlIHsKLSAgICBjb3V0IDw8IkVycm9yOiBpbml0TWF6ZUlkeF9jb25uRmlnIHVuc3VwcG9ydGVkIHR5cGUiIDw8ZW5kbDsKLSAgfQotfQotCi12b2lkIEZsZXhEUldvcmtlcjo6aW5pdE1hemVJZHhfYXAoZHJBY2Nlc3NQYXR0ZXJuICphcCkgewotICBmclBvaW50IGJwOwotICBhcC0+Z2V0UG9pbnQoYnApOwotICBhdXRvIGxOdW0gPSBhcC0+Z2V0QmVnaW5MYXllck51bSgpOwotICBpZiAoZ3JpZEdyYXBoLmhhc01hemVJZHgoYnAsIGxOdW0pKSB7Ci0gICAgRmxleE1hemVJZHggYmk7Ci0gICAgZ3JpZEdyYXBoLmdldE1hemVJZHgoYmksIGJwLCBsTnVtKTsKLSAgICBhcC0+c2V0TWF6ZUlkeChiaSk7Ci0gICAgLy9jb3V0IDw8ImhhcyBpZHggdmlhIiA8PGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgY291dCA8PCJFcnJvcjogaW5pdE1hemVJZHhfYXAgbm8gaWR4ICgiIAotICAgICAgICAgPDwgYnAueCgpICogMS4wIC8gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCkgIDw8IiwgIgotICAgICAgICAgPDwgYnAueSgpICogMS4wIC8gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCkgIDw8IikgIgotICAgICAgICAgPDwgZ2V0VGVjaCgpLT5nZXRMYXllcihsTnVtKS0+Z2V0TmFtZSgpCi0gICAgICAgICA8PGVuZGw7Ci0gIH0KLX0KLQotdm9pZCBGbGV4RFJXb3JrZXI6OmluaXRNYXplSWR4KCkgewotICBmb3IgKGF1dG8gJm5ldDogbmV0cykgewotICAgIGZvciAoYXV0byAmY29ubkZpZzogbmV0LT5nZXRFeHRDb25uRmlncygpKSB7Ci0gICAgICBpbml0TWF6ZUlkeF9jb25uRmlnKGNvbm5GaWcuZ2V0KCkpOwotICAgIH0KLSAgICBmb3IgKGF1dG8gJmNvbm5GaWc6IG5ldC0+Z2V0Um91dGVDb25uRmlncygpKSB7Ci0gICAgICBpbml0TWF6ZUlkeF9jb25uRmlnKGNvbm5GaWcuZ2V0KCkpOwotICAgIH0KLSAgICBmb3IgKGF1dG8gJnBpbjogbmV0LT5nZXRQaW5zKCkpIHsKLSAgICAgIGZvciAoYXV0byAmYXA6IHBpbi0+Z2V0QWNjZXNzUGF0dGVybnMoKSkgewotICAgICAgICBpbml0TWF6ZUlkeF9hcChhcC5nZXQoKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgRmxleERSV29ya2VyOjppbml0TWF6ZUNvc3RfYXBfaGVscGVyKGRyTmV0KiBuZXQsIGJvb2wgaXNBZGRQYXRoQ29zdCkgewotICBGbGV4TWF6ZUlkeCBtaTsKLSAgZm9yIChhdXRvICZwaW46IG5ldC0+Z2V0UGlucygpKSB7Ci0gICAgZm9yIChhdXRvICZhcDogcGluLT5nZXRBY2Nlc3NQYXR0ZXJucygpKSB7Ci0gICAgICBhcC0+Z2V0TWF6ZUlkeChtaSk7Ci0gICAgICBpZiAoYXAtPmhhc1ZhbGlkQWNjZXNzKGZyRGlyRW51bTo6VSkpIHsKLSAgICAgICAgaWYgKGlzQWRkUGF0aENvc3QpIHsKLSAgICAgICAgICBncmlkR3JhcGguc2V0U2hhcGVWaWEobWkueCgpLCBtaS55KCksIG1pLnooKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ3JpZEdyYXBoLnJlc2V0U2hhcGVWaWEobWkueCgpLCBtaS55KCksIG1pLnooKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBGbGV4RFJXb3JrZXI6OmluaXRNYXplQ29zdF9hcCgpIHsKLSAgYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIGludCBjbnQgPSAwOwotICBGbGV4TWF6ZUlkeCBtaTsKLSAgZm9yIChhdXRvICZuZXQ6IG5ldHMpIHsKLSAgICBmb3IgKGF1dG8gJnBpbjogbmV0LT5nZXRQaW5zKCkpIHsKLSAgICAgIGZvciAoYXV0byAmYXA6IHBpbi0+Z2V0QWNjZXNzUGF0dGVybnMoKSkgewotICAgICAgICBhcC0+Z2V0TWF6ZUlkeChtaSk7Ci0gICAgICAgIC8vaWYgKGFwLT5oYXNWYWxpZEFjY2VzcyhmckRpckVudW06OkUpIHx8Ci0gICAgICAgIC8vICAgIGFwLT5oYXNWYWxpZEFjY2VzcyhmckRpckVudW06OlMpIHx8Ci0gICAgICAgIC8vICAgIGFwLT5oYXNWYWxpZEFjY2VzcyhmckRpckVudW06OlcpIHx8Ci0gICAgICAgIC8vICAgIGFwLT5oYXNWYWxpZEFjY2VzcyhmckRpckVudW06Ok4pKSB7Ci0gICAgICAgIC8vICBncmlkR3JhcGgucmVzZXRTaGFwZVBsYW5hcihtaS54KCksIG1pLnkoKSwgbWkueigpKTsKLSAgICAgICAgLy99Ci0gICAgICAgIC8vIGN1cnJlbnRseSBoYXNWYWxpZEFjY2VzcyBkb3duIGlzIHNvbWVob3cgdHJ1ZS4uLi4uLgotICAgICAgICAvL2lmIChhcC0+aGFzVmFsaWRBY2Nlc3MoZnJEaXJFbnVtOjpEKSkgewotICAgICAgICAvLyAgZ3JpZEdyYXBoLnJlc2V0U2hhcGVWaWEobWkueCgpLCBtaS55KCksIG1pLnooKSAtIDEpOwotICAgICAgICAvL30KLQotICAgICAgICAvLyBzZXQgd2hlbiByb3V0aW5nIHRoaXMgbmV0Ci0gICAgICAgIC8vaWYgKGFwLT5oYXNWYWxpZEFjY2VzcyhmckRpckVudW06OlUpKSB7Ci0gICAgICAgIC8vICBncmlkR3JhcGgucmVzZXRTaGFwZVZpYShtaS54KCksIG1pLnkoKSwgbWkueigpKTsKLSAgICAgICAgLy8gIC8vZ3JpZEdyYXBoLnJlc2V0U2hhcGVQbGFuYXIobWkueCgpLCBtaS55KCksIG1pLnooKSk7Ci0gICAgICAgIC8vfQotCi0gICAgICAgIGlmIChhcC0+aGFzQWNjZXNzVmlhRGVmKGZyRGlyRW51bTo6VSkpIHsKLSAgICAgICAgICBncmlkR3JhcGguc2V0U1ZpYShtaS54KCksIG1pLnkoKSwgbWkueigpKTsKLSAgICAgICAgICBhcFNWaWFbbWldID0gYXAuZ2V0KCk7Ci0gICAgICAgICAgaWYgKGFwLT5nZXRBY2Nlc3NWaWFEZWYoKSAhPSAKLSAgICAgICAgICAgICAgZ2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0TGF5ZXIoYXAtPmdldEJlZ2luTGF5ZXJOdW0oKSArIDEpLT5nZXREZWZhdWx0VmlhRGVmKCkpIHsKLSAgICAgICAgICAgIGNudCsrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgY291dCA8PCJAQFRlc3Q6ICIgPDxjbnQgPDwiIHN2aWEgZGV0ZWN0ZWQiIDw8ZW5kbDsKLSAgfQotfQotCi12b2lkIEZsZXhEUldvcmtlcjo6aW5pdE1hemVDb3N0X21hcmtlcigpIHsKLSAgLy8gZGVjYXkgYWxsIGV4aXN0aW5nIG1pCi0gIGZvciAoYXV0byBpdCA9IHBsYW5hckhpc3RvcnlNYXJrZXJzLmJlZ2luKCk7IGl0ICE9IHBsYW5hckhpc3RvcnlNYXJrZXJzLmVuZCgpOykgewotICAgIGF1dG8gY3Vyckl0ID0gaXQ7Ci0gICAgYXV0byAmbWkgPSAqY3Vyckl0OwotICAgICsraXQ7Ci0gICAgaWYgKGdyaWRHcmFwaC5kZWNheU1hcmtlckNvc3RQbGFuYXIobWkueCgpLCBtaS55KCksIG1pLnooKSwgTUFSS0VSREVDQVkpKSB7Ci0gICAgICBwbGFuYXJIaXN0b3J5TWFya2Vycy5lcmFzZShjdXJySXQpOwotICAgIH0KLSAgfQotICBmb3IgKGF1dG8gaXQgPSB2aWFIaXN0b3J5TWFya2Vycy5iZWdpbigpOyBpdCAhPSB2aWFIaXN0b3J5TWFya2Vycy5lbmQoKTspIHsKLSAgICBhdXRvIGN1cnJJdCA9IGl0OwotICAgIGF1dG8gJm1pID0gKmN1cnJJdDsKLSAgICArK2l0OwotICAgIGlmIChncmlkR3JhcGguZGVjYXlNYXJrZXJDb3N0VmlhKG1pLngoKSwgbWkueSgpLCBtaS56KCksIE1BUktFUkRFQ0FZKSkgewotICAgICAgdmlhSGlzdG9yeU1hcmtlcnMuZXJhc2UoY3Vyckl0KTsKLSAgICB9Ci0gIH0KLSAgLy8gYWRkIG5ldyBtYXJrZXIgbWkKLSAgYXV0byAmd29ya2VyUmVnaW9uUXVlcnkgPSBnZXRXb3JrZXJSZWdpb25RdWVyeSgpOwotICB2ZWN0b3I8ZHJDb25uRmlnKj4gcmVzdWx0czsKLSAgZnJCb3ggbUJveCwgYmxvYXRCb3g7Ci0gIEZsZXhNYXplSWR4IG1JZHgxLCBtSWR4MjsKLSAgLy9kb3VibGUgZGJ1ID0gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCk7Ci0gIGZvciAoYXV0byAmbWFya2VyOiBtYXJrZXJzKSB7Ci0gICAgcmVzdWx0cy5jbGVhcigpOwotICAgIG1hcmtlci5nZXRCQm94KG1Cb3gpOwotICAgIGlmICghZ2V0Um91dGVCb3goKS5vdmVybGFwcyhtQm94KSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGF1dG8gbE51bSAgID0gbWFya2VyLmdldExheWVyTnVtKCk7Ci0gICAgLy9jb3V0IDw8Im1hcmtlciBAKCIgPDxtQm94LmxlZnQoKSAgLyBkYnUgPDwiLCAiIDw8bUJveC5ib3R0b20oKSAvIGRidSA8PCIpICgiCi0gICAgLy8gICAgICAgICAgICAgICAgICAgPDxtQm94LnJpZ2h0KCkgLyBkYnUgPDwiLCAiIDw8bUJveC50b3AoKSAgICAvIGRidSA8PCIpICIKLSAgICAvLyAgICAgPDxnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihsTnVtKS0+Z2V0TmFtZSgpIDw8ZW5kbDsKLSAgICBmckNvb3JkIHogPSAwOwotICAgIGlmIChnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihsTnVtKS0+Z2V0VHlwZSgpID09IGZyTGF5ZXJUeXBlRW51bTo6Q1VUKSB7Ci0gICAgICB6ID0gZ3JpZEdyYXBoLmdldE1hemVaSWR4KGxOdW0gLSAxKTsKLSAgICB9IGVsc2UgewotICAgICAgeiA9IGdyaWRHcmFwaC5nZXRNYXplWklkeChsTnVtKTsKLSAgICB9Ci0gICAgd29ya2VyUmVnaW9uUXVlcnkucXVlcnkobUJveCwgbE51bSwgcmVzdWx0cyk7Ci0gICAgZm9yIChhdXRvICZjb25uRmlnOiByZXN1bHRzKSB7Ci0gICAgICAvLyBmb3IgcGF0aHNlZy1yZWxhdGVkIG1hcmtlciwgYmxvYXQgbWFya2VyIGJ5IGhhbGYgd2lkdGggYW5kIGFkZCBtYXJrZXIgY29zdCBwbGFuYXIKLSAgICAgIGlmIChjb25uRmlnLT50eXBlSWQoKSA9PSBkcmNQYXRoU2VnKSB7Ci0gICAgICAgIC8vY291dCA8PCJAQHBhdGhzZWciIDw8ZW5kbDsKLSAgICAgICAgY29ubkZpZy0+Z2V0TmV0KCktPnNldFJpcHVwKCk7Ci0gICAgICAgIGZyQ29vcmQgYmxvYXREaXN0ID0gZ2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0TGF5ZXIobE51bSktPmdldFdpZHRoKCkgLyAyOwotICAgICAgICAvL2lmIChtYXJrZXIuZ2V0Q29uc3RyYWludCgpLT50eXBlSWQoKSA9PSBmckNvbnN0cmFpbnRUeXBlRW51bTo6ZnJjTWluV2lkdGhDb25zdHJhaW50KSB7Ci0gICAgICAgIC8vICBibG9hdERpc3QgPSBTSEFQRUJMT0FUV0lEVEg7Ci0gICAgICAgIC8vfQotICAgICAgICBtQm94LmJsb2F0KGJsb2F0RGlzdCwgYmxvYXRCb3gpOwotICAgICAgICBncmlkR3JhcGguZ2V0SWR4Qm94KG1JZHgxLCBtSWR4MiwgYmxvYXRCb3gpOwotICAgICAgICBmb3IgKGludCBpID0gbUlkeDEueCgpOyBpIDw9IG1JZHgyLngoKTsgaSsrKSB7Ci0gICAgICAgICAgZm9yIChpbnQgaiA9IG1JZHgxLnkoKTsgaiA8PSBtSWR4Mi55KCk7IGorKykgewotICAgICAgICAgICAgZ3JpZEdyYXBoLmFkZE1hcmtlckNvc3RQbGFuYXIoaSwgaiwgeik7Ci0gICAgICAgICAgICAvL2NvdXQgPDwiYWRkIG1hcmtlciBjb3N0IHBsYW5hciBAKCIgPDxpIDw8IiwgIiA8PGogPDwiLCAiIDw8eiA8PCIpIiA8PGVuZGw7Ci0gICAgICAgICAgICBwbGFuYXJIaXN0b3J5TWFya2Vycy5pbnNlcnQoRmxleE1hemVJZHgoaSwgaiwgeikpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgLy8gZm9yIHZpYS1yZWxhdGVkIG1hcmtlciwgYWRkIG1hcmtlciBjb3N0IHZpYQotICAgICAgfSBlbHNlIGlmIChjb25uRmlnLT50eXBlSWQoKSA9PSBkcmNWaWEpIHsKLSAgICAgICAgLy9jb3V0IDw8IkBAdmlhIiA8PGVuZGw7Ci0gICAgICAgIGF1dG8gb2JqID0gc3RhdGljX2Nhc3Q8ZHJWaWEqPihjb25uRmlnKTsKLSAgICAgICAgb2JqLT5nZXRNYXplSWR4KG1JZHgxLCBtSWR4Mik7Ci0gICAgICAgIGNvbm5GaWctPmdldE5ldCgpLT5zZXRSaXB1cCgpOwotICAgICAgICBncmlkR3JhcGguYWRkTWFya2VyQ29zdFZpYShtSWR4MS54KCksIG1JZHgxLnkoKSwgbUlkeDEueigpKTsKLSAgICAgICAgLy9jb3V0IDw8ImFkZCBtYXJrZXIgY29zdCB2aWEgQCgiIDw8bUlkeDEueCgpIDw8IiwgIiA8PG1JZHgxLnkoKSA8PCIsICIgPDxtSWR4MS56KCkgPDwiKSIgPDxlbmRsOwotICAgICAgICB2aWFIaXN0b3J5TWFya2Vycy5pbnNlcnQobUlkeDEpOwotICAgICAgfSBlbHNlIGlmIChjb25uRmlnLT50eXBlSWQoKSA9PSBkcmNQYXRjaFdpcmUpIHsKLSAgICAgICAgLy8gVE9ETzogY291bGQgYWRkIG1hcmtlciAvLyBmb3Igbm93IHdlIHRoaW5rIHRoZSBvdGhlciBwYXJ0IGluIHRoZSB2aW9sYXRpb24gd291bGQgbm90IGJlIHBhdGNoV2lyZQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogdW5zdXBwb3J0ZXJkIGRyIHR5cGUiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBGbGV4RFJXb3JrZXI6OmluaXRNYXplQ29zdCgpIHsKLSAgLy8gaW5pdCBNYXplIENvc3QgYnkgcGluIHNoYXBlcwotICBpbml0TWF6ZUNvc3RfcGluKCk7Ci0gIC8vIGFkZGVkIGluIG1hemUgcm91dGUKLSAgLy8gdmlhIGFjY2VzcyBjb3N0Ci0gIC8vaW5pdE1hemVDb3N0X3ZpYSgpOwotICBpbml0TWF6ZUNvc3RfYXAoKTsKLSAgLy8gaW5pdCBNYXplIENvc3QgYnkgY29ubkZpZwotICBpbml0TWF6ZUNvc3RfY29ubkZpZygpOwotfQotCi12b2lkIEZsZXhEUldvcmtlcjo6aW5pdE1hemVDb3N0X3Bpbl9oZWxwZXIoY29uc3QgZnJCb3ggJmJveCwgZnJDb29yZCBibG9hdERpc3QsIGZyTUlkeCB6SWR4KSB7Ci0gIEZsZXhNYXplSWR4IG1JZHgxLCBtSWR4MjsKLSAgZnJCb3ggYmxvYXRCb3g7Ci0gIGJveC5ibG9hdChibG9hdERpc3QsIGJsb2F0Qm94KTsKLSAgZ3JpZEdyYXBoLmdldElkeEJveChtSWR4MSwgbUlkeDIsIGJsb2F0Qm94KTsKLSAgZm9yIChpbnQgaSA9IG1JZHgxLngoKTsgaSA8PSBtSWR4Mi54KCk7IGkrKykgewotICAgIGZvciAoaW50IGogPSBtSWR4MS55KCk7IGogPD0gbUlkeDIueSgpOyBqKyspIHsKLSAgICAgIGdyaWRHcmFwaC5zZXRTaGFwZVBsYW5hcihpLCBqLCB6SWR4KTsKLSAgICAgIGdyaWRHcmFwaC5zZXRTaGFwZVZpYShpLCBqLCB6SWR4KTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBGbGV4RFJXb3JrZXI6OmluaXRNYXplQ29zdF9waW4oKSB7Ci0gIHZlY3RvcjxycV9ycHRyX3ZhbHVlX3Q8ZnJCbG9ja09iamVjdD4gPiByZXN1bHQ7Ci0gIGZyQm94IGJveDsKLSAgZnJDb29yZCB3aWR0aCA9IDA7Ci0gIGZyQ29vcmQgYmxvYXREaXN0ID0gMDsKLSAgZnJNSWR4ICB6SWR4ID0gMDsKLSAgZm9yIChhdXRvIGxheWVyTnVtID0gZ2V0VGVjaCgpLT5nZXRCb3R0b21MYXllck51bSgpOyBsYXllck51bSA8PSBnZXRUZWNoKCktPmdldFRvcExheWVyTnVtKCk7ICsrbGF5ZXJOdW0pIHsKLSAgICByZXN1bHQuY2xlYXIoKTsKLSAgICBpZiAoZ2V0VGVjaCgpLT5nZXRMYXllcihsYXllck51bSktPmdldFR5cGUoKSAhPSBmckxheWVyVHlwZUVudW06OlJPVVRJTkcpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICB6SWR4ID0gZ3JpZEdyYXBoLmdldE1hemVaSWR4KGxheWVyTnVtKTsKLSAgICB3aWR0aCA9IGdldFRlY2goKS0+Z2V0TGF5ZXIobGF5ZXJOdW0pLT5nZXRXaWR0aCgpOwotICAgIGdldFJlZ2lvblF1ZXJ5KCktPnF1ZXJ5KGdldEV4dEJveCgpLCBsYXllck51bSwgcmVzdWx0KTsKLSAgICBmb3IgKGF1dG8gJltib29zdGIsIG9ial06IHJlc3VsdCkgewotICAgICAgLy8gaW5zdHRlcm0gdGVybQotICAgICAgaWYgKG9iai0+dHlwZUlkKCkgPT0gZnJjVGVybSB8fCBvYmotPnR5cGVJZCgpID09IGZyY0luc3RUZXJtKSB7Ci0gICAgICAgIGJveC5zZXQoYm9vc3RiLm1pbl9jb3JuZXIoKS54KCkrMSwgYm9vc3RiLm1pbl9jb3JuZXIoKS55KCkrMSwgYm9vc3RiLm1heF9jb3JuZXIoKS54KCktMSwgYm9vc3RiLm1heF9jb3JuZXIoKS55KCktMSk7Ci0gICAgICAgIGJsb2F0RGlzdCA9IFNIQVBFQkxPQVRXSURUSCAqIHdpZHRoOwotICAgICAgICBpbml0TWF6ZUNvc3RfcGluX2hlbHBlcihib3gsIGJsb2F0RGlzdCwgeklkeCk7Ci0gICAgICAvLyBzbmV0Ci0gICAgICB9IGVsc2UgaWYgKG9iai0+dHlwZUlkKCkgPT0gZnJjUGF0aFNlZyB8fCBvYmotPnR5cGVJZCgpID09IGZyY1ZpYSkgewotICAgICAgICBib3guc2V0KGJvb3N0Yi5taW5fY29ybmVyKCkueCgpKzEsIGJvb3N0Yi5taW5fY29ybmVyKCkueSgpKzEsIGJvb3N0Yi5tYXhfY29ybmVyKCkueCgpLTEsIGJvb3N0Yi5tYXhfY29ybmVyKCkueSgpLTEpOwotICAgICAgICBibG9hdERpc3QgPSBTSEFQRUJMT0FUV0lEVEggKiB3aWR0aDsKLSAgICAgICAgaW5pdE1hemVDb3N0X3Bpbl9oZWxwZXIoYm94LCBibG9hdERpc3QsIHpJZHgpOwotICAgICAgfSBlbHNlIGlmIChvYmotPnR5cGVJZCgpID09IGZyY0Jsb2NrYWdlIHx8IG9iai0+dHlwZUlkKCkgPT0gZnJjSW5zdEJsb2NrYWdlKSB7Ci0gICAgICAgIGlmIChVU0VNSU5TUEFDSU5HX09CUykgewotICAgICAgICAgIGJveC5zZXQoYm9vc3RiLm1pbl9jb3JuZXIoKS54KCkrMSwgYm9vc3RiLm1pbl9jb3JuZXIoKS55KCkrMSwgYm9vc3RiLm1heF9jb3JuZXIoKS54KCktMSwgYm9vc3RiLm1heF9jb3JuZXIoKS55KCktMSk7Ci0gICAgICAgICAgYmxvYXREaXN0ID0gU0hBUEVCTE9BVFdJRFRIICogd2lkdGg7Ci0gICAgICAgICAgaW5pdE1hemVDb3N0X3Bpbl9oZWxwZXIoYm94LCBibG9hdERpc3QsIHpJZHgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGJveC5zZXQoYm9vc3RiLm1pbl9jb3JuZXIoKS54KCkrMSwgYm9vc3RiLm1pbl9jb3JuZXIoKS55KCkrMSwgYm9vc3RiLm1heF9jb3JuZXIoKS54KCktMSwgYm9vc3RiLm1heF9jb3JuZXIoKS55KCktMSk7Ci0gICAgICAgICAgYmxvYXREaXN0ID0gU0hBUEVCTE9BVFdJRFRIICogd2lkdGg7Ci0gICAgICAgICAgaW5pdE1hemVDb3N0X3Bpbl9oZWxwZXIoYm94LCBibG9hdERpc3QsIHpJZHgpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb3V0IDw8Ildhcm5pbmc6IHVuc3VwcG9ydGVkIHR5cGUgaW4gaW5pdE1hemVDb3N0X3BpbiIgPDxlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qCi0gIHNldDxmckJsb2NrT2JqZWN0KiwgZnJCbG9ja09iamVjdENvbXA+IHJlc3VsdFNldDsKLSAgZm9yIChhdXRvIGxheWVyTnVtID0gZ2V0VGVjaCgpLT5nZXRCb3R0b21MYXllck51bSgpOyBsYXllck51bSA8PSBnZXRUZWNoKCktPmdldFRvcExheWVyTnVtKCk7ICsrbGF5ZXJOdW0pIHsKLSAgICBzdGQ6OnZlY3RvcjxycV9ycHRyX3ZhbHVlX3Q8ZnJCbG9ja09iamVjdD4gPiByZXN1bHQ7Ci0gICAgaWYgKGdldFRlY2goKS0+Z2V0TGF5ZXIobGF5ZXJOdW0pLT5nZXRUeXBlKCkgIT0gZnJMYXllclR5cGVFbnVtOjpST1VUSU5HKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgZ2V0UmVnaW9uUXVlcnkoKS0+cXVlcnkoZ2V0RXh0Qm94KCksIGxheWVyTnVtLCByZXN1bHQpOwotICAgIGZvciAoYXV0byAmZWxlOiByZXN1bHQpIHsKLSAgICAgIHJlc3VsdFNldC5pbnNlcnQoZWxlLnNlY29uZCk7ICAKLSAgICB9Ci0gICAgCi0gIH0KLSAgCi0gIGZvciAoYXV0byBvYmo6IHJlc3VsdFNldCkgewotICAgIGlmIChvYmotPnR5cGVJZCgpID09IGZyY0luc3RUZXJtKSB7Ci0gICAgICBmckluc3RUZXJtICppbnN0VGVybSA9IHN0YXRpY19jYXN0PGZySW5zdFRlcm0qPihvYmopOwotICAgICAgZnJUcmFuc2Zvcm0geGZvcm07Ci0gICAgICBmckluc3QgKmluc3QgPSBpbnN0VGVybS0+Z2V0SW5zdCgpOwotICAgICAgLy9mckJveCBtYm94OwotCi0gICAgICAvL2luc3QtPmdldFRyYW5zZm9ybSh4Zm9ybSk7Ci0gICAgICAvL2luc3QtPmdldFJlZkJsb2NrKCktPmdldEJvdW5kYXJ5QkJveChtYm94KTsKLSAgICAgIC8vZnJQb2ludCBzaXplKG1ib3gucmlnaHQoKSwgbWJveC50b3AoKSk7Ci0gICAgICAvL3hmb3JtLnVwZGF0ZVhmb3JtKHNpemUpOwotICAgICAgaW5zdC0+Z2V0VXBkYXRlZFhmb3JtKHhmb3JtKTsKLQotICAgICAgZm9yIChhdXRvICZwaW46IGluc3RUZXJtLT5nZXRUZXJtKCktPmdldFBpbnMoKSkgewotICAgICAgICBhdXRvIHBpblB0ciA9IHBpbi5nZXQoKTsKLSAgICAgICAgYXV0byBwaW5MYXllcjJQb2x5U2V0ID0gcGluUHRyLT5nZXRMYXllcjJQb2x5U2V0KCk7Ci0gICAgICAgIC8vIHN0ZDo6bWFwPGZyTGF5ZXJOdW0sIFBvbHlnb25TZXQ+IGxheWVyMlBvbHlTZXQ7Ci0gICAgICAgIC8vIHBvcHVsYXRlIGxheWVyMlBvbHlTZXQKLSAgICAgICAgZm9yIChhdXRvIGxheWVySXQgPSBwaW5MYXllcjJQb2x5U2V0LmJlZ2luKCk7IGxheWVySXQgIT0gcGluTGF5ZXIyUG9seVNldC5lbmQoKTsgKytsYXllckl0KSB7Ci0gICAgICAgICAgc3RkOjpzZXQ8c3RkOjpwYWlyPGZyTUlkeCwgZnJNSWR4PiA+IGNvc3RHcmlkczsKLSAgICAgICAgICBhdXRvIGN1cnJMYXllck51bSA9IGxheWVySXQtPmZpcnN0OwotICAgICAgICAgIGF1dG8gY3VyclBvbHlTZXQgPSBsYXllckl0LT5zZWNvbmQ7Ci0gICAgICAgICAgYXV0byBjdXJyTGF5ZXJXaWR0aCA9IGdldFRlY2goKS0+Z2V0TGF5ZXIoY3VyckxheWVyTnVtKS0+Z2V0V2lkdGgoKTsKLSAgICAgICAgICAvL2F1dG8gY3VyckxheWVyUHJlZkRpciA9IGdldFRlY2goKS0+Z2V0TGF5ZXIoY3VyckxheWVyTnVtKS0+Z2V0RGlyKCk7Ci0gICAgICAgICAgZnJDb29yZCBibG9hdFdpZHRoID0gU0hBUEVCTE9BVFdJRFRIICogY3VyckxheWVyV2lkdGg7Ci0gICAgICAgICAgc3RkOjp2ZWN0b3I8UmVjdGFuZ2xlPiBwaW5SZWN0czsKLSAgICAgICAgICBib29zdDo6cG9seWdvbjo6Z2V0X3JlY3RhbmdsZXMocGluUmVjdHMsIGN1cnJQb2x5U2V0KTsKLSAgICAgICAgICBmb3IgKGF1dG8gJnBpblJlY3Q6IHBpblJlY3RzKSB7Ci0gICAgICAgICAgICBmckJveCB0bXBCb3goeGwocGluUmVjdCksIHlsKHBpblJlY3QpLCB4aChwaW5SZWN0KSwgeWgocGluUmVjdCkpOwotICAgICAgICAgICAgdG1wQm94LnRyYW5zZm9ybSh4Zm9ybSk7Ci0gICAgICAgICAgICBSZWN0YW5nbGUgdHJhbnNmb3JtZWRSZWN0KHRtcEJveC5sZWZ0KCksIHRtcEJveC5ib3R0b20oKSwgdG1wQm94LnJpZ2h0KCksIHRtcEJveC50b3AoKSk7Ci0gICAgICAgICAgICBibG9hdCh0cmFuc2Zvcm1lZFJlY3QsIGJsb2F0V2lkdGgpOwotICAgICAgICAgICAgYWRkVG9Db3N0R3JpZHModHJhbnNmb3JtZWRSZWN0LCBjb3N0R3JpZHMpOwotICAgICAgICAgIH0KLSAgICAgICAgICBhdXRvIHpJZHggPSBncmlkR3JhcGguZ2V0TWF6ZVpJZHgoY3VyckxheWVyTnVtKTsKLSAgICAgICAgICBmb3IgKGF1dG8gJnBhaXJHcmlkOiBjb3N0R3JpZHMpIHsKLSAgICAgICAgICAgIC8vZ3JpZEdyYXBoLmFkZEVkZ2VTaGFwZUNvc3QocGFpckdyaWQuZmlyc3QsIHBhaXJHcmlkLnNlY29uZCwgeklkeCwgZnJEaXJFbnVtOjpFLCBQSU5TSE9SVENPU1QpOwotICAgICAgICAgICAgLy9ncmlkR3JhcGguYWRkRWRnZVNoYXBlQ29zdChwYWlyR3JpZC5maXJzdCwgcGFpckdyaWQuc2Vjb25kLCB6SWR4LCBmckRpckVudW06OlcsIFBJTlNIT1JUQ09TVCk7Ci0gICAgICAgICAgICAvL2dyaWRHcmFwaC5hZGRFZGdlU2hhcGVDb3N0KHBhaXJHcmlkLmZpcnN0LCBwYWlyR3JpZC5zZWNvbmQsIHpJZHgsIGZyRGlyRW51bTo6TiwgUElOU0hPUlRDT1NUKTsKLSAgICAgICAgICAgIC8vZ3JpZEdyYXBoLmFkZEVkZ2VTaGFwZUNvc3QocGFpckdyaWQuZmlyc3QsIHBhaXJHcmlkLnNlY29uZCwgeklkeCwgZnJEaXJFbnVtOjpTLCBQSU5TSE9SVENPU1QpOwotICAgICAgICAgICAgZ3JpZEdyYXBoLnNldFNoYXBlUGxhbmFyKHBhaXJHcmlkLmZpcnN0LCBwYWlyR3JpZC5zZWNvbmQsIHpJZHgpOwotICAgICAgICAgICAgZ3JpZEdyYXBoLnNldFNoYXBlVmlhKHBhaXJHcmlkLmZpcnN0LCBwYWlyR3JpZC5zZWNvbmQsIHpJZHgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSBpZiAob2JqLT50eXBlSWQoKSA9PSBmcmNUZXJtKSB7Ci0gICAgICBmclRlcm0gKnRlcm0gPSBzdGF0aWNfY2FzdDxmclRlcm0qPihvYmopOwotICAgICAgZm9yIChhdXRvICZwaW46IHRlcm0tPmdldFBpbnMoKSkgewotICAgICAgICBhdXRvIHBpblB0ciA9IHBpbi5nZXQoKTsKLSAgICAgICAgYXV0byBwaW5MYXllcjJQb2x5U2V0ID0gcGluUHRyLT5nZXRMYXllcjJQb2x5U2V0KCk7Ci0gICAgICAgIC8vIHN0ZDo6bWFwPGZyTGF5ZXJOdW0sIFBvbHlnb25TZXQ+IGxheWVyMlBvbHlTZXQ7Ci0gICAgICAgIC8vIHBvcHVsYXRlIGxheWVyMlBvbHlTZXQKLSAgICAgICAgZm9yIChhdXRvIGxheWVySXQgPSBwaW5MYXllcjJQb2x5U2V0LmJlZ2luKCk7IGxheWVySXQgIT0gcGluTGF5ZXIyUG9seVNldC5lbmQoKTsgKytsYXllckl0KSB7Ci0gICAgICAgICAgc3RkOjpzZXQ8c3RkOjpwYWlyPGZyTUlkeCwgZnJNSWR4PiA+IGNvc3RHcmlkczsKLSAgICAgICAgICBhdXRvIGN1cnJMYXllck51bSA9IGxheWVySXQtPmZpcnN0OwotICAgICAgICAgIGF1dG8gY3VyclBvbHlTZXQgPSBsYXllckl0LT5zZWNvbmQ7Ci0gICAgICAgICAgYXV0byBjdXJyTGF5ZXJXaWR0aCA9IGdldFRlY2goKS0+Z2V0TGF5ZXIoY3VyckxheWVyTnVtKS0+Z2V0V2lkdGgoKTsKLSAgICAgICAgICAvL2F1dG8gY3VyckxheWVyUHJlZkRpciA9IGdldFRlY2goKS0+Z2V0TGF5ZXIoY3VyckxheWVyTnVtKS0+Z2V0RGlyKCk7Ci0gICAgICAgICAgZnJDb29yZCBibG9hdFdpZHRoID0gU0hBUEVCTE9BVFdJRFRIICogY3VyckxheWVyV2lkdGg7Ci0gICAgICAgICAgc3RkOjp2ZWN0b3I8UmVjdGFuZ2xlPiBwaW5SZWN0czsKLSAgICAgICAgICBib29zdDo6cG9seWdvbjo6Z2V0X3JlY3RhbmdsZXMocGluUmVjdHMsIGN1cnJQb2x5U2V0KTsKLSAgICAgICAgICBmb3IgKGF1dG8gJnBpblJlY3Q6IHBpblJlY3RzKSB7Ci0gICAgICAgICAgICBmckJveCB0bXBCb3goeGwocGluUmVjdCksIHlsKHBpblJlY3QpLCB4aChwaW5SZWN0KSwgeWgocGluUmVjdCkpOwotICAgICAgICAgICAgUmVjdGFuZ2xlIHRyYW5zZm9ybWVkUmVjdCh0bXBCb3gubGVmdCgpLCB0bXBCb3guYm90dG9tKCksIHRtcEJveC5yaWdodCgpLCB0bXBCb3gudG9wKCkpOwotICAgICAgICAgICAgYmxvYXQodHJhbnNmb3JtZWRSZWN0LCBibG9hdFdpZHRoKTsKLSAgICAgICAgICAgIGFkZFRvQ29zdEdyaWRzKHRyYW5zZm9ybWVkUmVjdCwgY29zdEdyaWRzKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYXV0byB6SWR4ID0gZ3JpZEdyYXBoLmdldE1hemVaSWR4KGN1cnJMYXllck51bSk7Ci0gICAgICAgICAgZm9yIChhdXRvICZwYWlyR3JpZDogY29zdEdyaWRzKSB7Ci0gICAgICAgICAgICAvL2dyaWRHcmFwaC5hZGRFZGdlU2hhcGVDb3N0KHBhaXJHcmlkLmZpcnN0LCBwYWlyR3JpZC5zZWNvbmQsIHpJZHgsIGZyRGlyRW51bTo6RSwgUElOU0hPUlRDT1NUKTsKLSAgICAgICAgICAgIC8vZ3JpZEdyYXBoLmFkZEVkZ2VTaGFwZUNvc3QocGFpckdyaWQuZmlyc3QsIHBhaXJHcmlkLnNlY29uZCwgeklkeCwgZnJEaXJFbnVtOjpXLCBQSU5TSE9SVENPU1QpOwotICAgICAgICAgICAgLy9ncmlkR3JhcGguYWRkRWRnZVNoYXBlQ29zdChwYWlyR3JpZC5maXJzdCwgcGFpckdyaWQuc2Vjb25kLCB6SWR4LCBmckRpckVudW06Ok4sIFBJTlNIT1JUQ09TVCk7Ci0gICAgICAgICAgICAvL2dyaWRHcmFwaC5hZGRFZGdlU2hhcGVDb3N0KHBhaXJHcmlkLmZpcnN0LCBwYWlyR3JpZC5zZWNvbmQsIHpJZHgsIGZyRGlyRW51bTo6UywgUElOU0hPUlRDT1NUKTsKLSAgICAgICAgICAgIGdyaWRHcmFwaC5zZXRTaGFwZVBsYW5hcihwYWlyR3JpZC5maXJzdCwgcGFpckdyaWQuc2Vjb25kLCB6SWR4KTsKLSAgICAgICAgICAgIGdyaWRHcmFwaC5zZXRTaGFwZVZpYShwYWlyR3JpZC5maXJzdCwgcGFpckdyaWQuc2Vjb25kLCB6SWR4KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgKi8KLX0KLQotdm9pZCBGbGV4RFJXb3JrZXI6OmFkZFRvQ29zdEdyaWRzKGNvbnN0IFJlY3RhbmdsZSAmcmVnaW9uLCBzdGQ6OnNldDxzdGQ6OnBhaXI8ZnJNSWR4LCBmck1JZHg+ID4gJmNvc3RHcmlkcykgewotICBmck1JZHggc3RhcnRYSWR4LCBlbmRYSWR4LCBzdGFydFlJZHgsIGVuZFlJZHg7Ci0gIHN0YXJ0WElkeCA9IGdyaWRHcmFwaC5nZXRNYXplWElkeCh4bChyZWdpb24pKTsKLSAgZW5kWElkeCA9IGdyaWRHcmFwaC5nZXRNYXplWElkeCh4aChyZWdpb24pKTsKLSAgc3RhcnRZSWR4ID0gZ3JpZEdyYXBoLmdldE1hemVZSWR4KHlsKHJlZ2lvbikpOwotICBlbmRZSWR4ID0gZ3JpZEdyYXBoLmdldE1hemVZSWR4KHloKHJlZ2lvbikpOwotICBmck1JZHggeERpbSwgeURpbSwgekRpbTsKLSAgZ3JpZEdyYXBoLmdldERpbSh4RGltLHlEaW0sekRpbSk7Ci0gIHhEaW0gLT0gMTsKLSAgeURpbSAtPSAxOwotICB6RGltIC09IDE7Ci0gIGZvciAoYXV0byBjdXJyWElkeCA9IHN0YXJ0WElkeDsgY3VyclhJZHggPCBtaW4oZW5kWElkeCwgeERpbSk7ICsrY3VyclhJZHgpIHsKLSAgICBmb3IgKGF1dG8gY3VycllJZHggPSBzdGFydFlJZHg7IGN1cnJZSWR4IDwgbWluKGVuZFlJZHgsIHlEaW0pOyArK2N1cnJZSWR4KSB7Ci0gICAgICBjb3N0R3JpZHMuaW5zZXJ0KG1ha2VfcGFpcihjdXJyWElkeCwgY3VycllJZHgpKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBGbGV4RFJXb3JrZXI6OmluaXRNYXplQ29zdF9jb25uRmlnKCkgewotICBpbnQgY250ID0gMDsKLSAgZm9yIChhdXRvICZuZXQ6IG5ldHMpIHsKLSAgICBmb3IgKGF1dG8gJmNvbm5GaWc6IG5ldC0+Z2V0RXh0Q29ubkZpZ3MoKSkgewotICAgICAgaWYgKFRFU1QpIHsKLSAgICAgICAgY291dCA8PCIgIGluaXRNYXplQ29zdF9jb25uRmlnICIgPDxuZXQtPmdldEZyTmV0KCktPmdldE5hbWUoKSA8PCIgZXh0Q29ubkZpZ3MiOwotICAgICAgfQotICAgICAgYWRkUGF0aENvc3QoY29ubkZpZy5nZXQoKSk7Ci0gICAgICBjbnQrKzsKLSAgICB9Ci0gICAgZm9yIChhdXRvICZjb25uRmlnOiBuZXQtPmdldFJvdXRlQ29ubkZpZ3MoKSkgewotICAgICAgaWYgKFRFU1QpIHsKLSAgICAgICAgY291dCA8PCIgIGluaXRNYXplQ29zdF9jb25uRmlnICIgPDxuZXQtPmdldEZyTmV0KCktPmdldE5hbWUoKSA8PCIgcm91dGVDb25uRmlncyI7Ci0gICAgICB9Ci0gICAgICBhZGRQYXRoQ29zdChjb25uRmlnLmdldCgpKTsKLSAgICAgIGNudCsrOwotICAgIH0KLSAgfQotICAvL2NvdXQgPDwiaW5pdCAiIDw8Y250IDw8IiBjb25uZmlnIGNvc3RzIiA8PGVuZGw7Ci19Ci0KLXZvaWQgRmxleERSV29ya2VyOjppbml0TWF6ZUNvc3RfdmlhX2hlbHBlcihkck5ldCogbmV0LCBib29sIGlzQWRkUGF0aENvc3QpIHsKLSAgdW5pcXVlX3B0cjxkclZpYT4gdmlhID0gbnVsbHB0cjsKLSAgZnJQb2ludCBicDsKLSAgZm9yIChhdXRvICZwaW46IG5ldC0+Z2V0UGlucygpKSB7Ci0gICAgaWYgKHBpbi0+Z2V0RnJUZXJtKCkgPT0gbnVsbHB0cikgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGZvciAoYXV0byAmYXA6IHBpbi0+Z2V0QWNjZXNzUGF0dGVybnMoKSkgewotICAgICAgaWYgKCFhcC0+aGFzQWNjZXNzVmlhRGVmKGZyRGlyRW51bTo6VSkpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBhcC0+Z2V0UG9pbnQoYnApOwotICAgICAgYXV0byBsTnVtID0gYXAtPmdldEJlZ2luTGF5ZXJOdW0oKTsKLSAgICAgIGZyVmlhRGVmKiB2aWFEZWYgPSBhcC0+Z2V0QWNjZXNzVmlhRGVmKCk7Ci0gICAgICB2aWEgPSBtYWtlX3VuaXF1ZTxkclZpYT4odmlhRGVmKTsKLSAgICAgIHZpYS0+c2V0T3JpZ2luKGJwKTsKLSAgICAgIHZpYS0+YWRkVG9OZXQobmV0KTsKLSAgICAgIGluaXRNYXplSWR4X2Nvbm5GaWcodmlhLmdldCgpKTsKLSAgICAgIEZsZXhNYXplSWR4IGJpLCBlaTsKLSAgICAgIHZpYS0+Z2V0TWF6ZUlkeChiaSwgZWkpOwotICAgICAgaWYgKFRFU1QpIHsKLSAgICAgICAgY291dCA8PCIgIGluaXRNYXplQ29zdF92aWFfaGVscGVyIEAoIiAKLSAgICAgICAgICAgICA8PGJwLngoKSAqIDEuMCAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpIDw8IiwgIgotICAgICAgICAgICAgIDw8YnAueSgpICogMS4wIC8gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCkgPDwiKSAiCi0gICAgICAgICAgICAgPDxnZXRUZWNoKCktPmdldExheWVyKGxOdW0pLT5nZXROYW1lKCkgPDwiICIgCi0gICAgICAgICAgICAgPDxuZXQtPmdldEZyTmV0KCktPmdldE5hbWUoKSA8PCIgIiA8PHZpYS0+Z2V0VmlhRGVmKCktPmdldE5hbWUoKTsKLSAgICAgIH0KLSAgICAgIGlmIChpc0FkZFBhdGhDb3N0KSB7Ci0gICAgICAgIGFkZFBhdGhDb3N0KHZpYS5nZXQoKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzdWJQYXRoQ29zdCh2aWEuZ2V0KCkpOwotICAgICAgfQotCi0gICAgICAvL2JyZWFrOwotCi0gICAgICAvLyBvbmx5IHJlc2VydmUgdXBwZXIgbGF5ZXIgbWV0YWwsIGJ1dCBub3QgdmlhCi0gICAgICAvL2lmIChhcC0+aGFzVmFsaWRBY2Nlc3MoZnJEaXJFbnVtOjpVKSAmJiAKLSAgICAgIC8vICAgIGxOdW0gKyAyIDw9IGdldFRlY2goKS0+Z2V0VG9wTGF5ZXJOdW0oKSkgewotICAgICAgLy8gIC8vYXAtPmdldFBvaW50KGJwKTsKLSAgICAgIC8vICAvL2F1dG8gbE51bSA9IGFwLT5nZXRCZWdpbkxheWVyTnVtKCkgKyAyOwotICAgICAgLy8gIGRyUGF0aFNlZyBjdXJyUGF0aFNlZzsKLSAgICAgIC8vICBjdXJyUGF0aFNlZy5zZXRQb2ludHMoYnAsIGJwKTsKLSAgICAgIC8vICBjdXJyUGF0aFNlZy5zZXRMYXllck51bShsTnVtICsgMik7Ci0gICAgICAvLyAgY3VyclBhdGhTZWcuYWRkVG9OZXQobmV0KTsKLSAgICAgIC8vICBjdXJyUGF0aFNlZy5zZXRTdHlsZShnZXRUZWNoKCktPmdldExheWVyKGxOdW0gKyAyKS0+Z2V0RGVmYXVsdFNlZ1N0eWxlKCkpOwotICAgICAgLy8gIGluaXRNYXplSWR4X2Nvbm5GaWcoJmN1cnJQYXRoU2VnKTsKLSAgICAgIC8vICBGbGV4TWF6ZUlkeCBiaSwgZWk7Ci0gICAgICAvLyAgY3VyclBhdGhTZWcuZ2V0TWF6ZUlkeChiaSwgZWkpOwotICAgICAgLy8gIGlmIChURVNUKSB7Ci0gICAgICAvLyAgICBjb3V0IDw8IiAgaW5pdE1hemVDb3N0X3ZpYV9oZWxwZXIgQCgiIAotICAgICAgLy8gICAgICAgICA8PGJwLngoKSAqIDEuMCAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpIDw8IiwgIgotICAgICAgLy8gICAgICAgICA8PGJwLnkoKSAqIDEuMCAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpIDw8IikgIgotICAgICAgLy8gICAgICAgICA8PGdldFRlY2goKS0+Z2V0TGF5ZXIobE51bSArIDIpLT5nZXROYW1lKCkgPDwiICIgCi0gICAgICAvLyAgICAgICAgIDw8bmV0LT5nZXRGck5ldCgpLT5nZXROYW1lKCk7Ci0gICAgICAvLyAgfQotICAgICAgLy8gIGZyQm94IGJveDsKLSAgICAgIC8vICBjdXJyUGF0aFNlZy5nZXRCQm94KGJveCk7Ci0gICAgICAvLyAgaWYgKGlzQWRkUGF0aENvc3QpIHsKLSAgICAgIC8vICAgIG1vZE1pblNwYWNpbmdDb3N0UGxhbmVyKG5ldCwgYm94LCBiaS56KCksIGlzQWRkUGF0aENvc3QpOwotICAgICAgLy8gIH0gZWxzZSB7Ci0gICAgICAvLyAgICBtb2RNaW5TcGFjaW5nQ29zdFBsYW5lcihuZXQsIGJveCwgYmkueigpLCBpc0FkZFBhdGhDb3N0KTsKLSAgICAgIC8vICB9Ci0gICAgICAvL30KLQotCi0gICAgfQotICB9Ci19Ci0KLXZvaWQgRmxleERSV29ya2VyOjppbml0TWF6ZUNvc3RfYm91bmRhcnlfaGVscGVyKGRyTmV0KiBuZXQsIGJvb2wgaXNBZGRQYXRoQ29zdCkgewotICAvLyBkbyBub3QgY2hlY2sgc2FtZS1uZXQgcnVsZXMgYmV0d2VlbiBleHQgYW5kIHJvdXRlIG9ianMgdG8gYXZvaWQgcGVzc2ltaXNtCi0gIGZvciAoYXV0byAmY29ubkZpZzogbmV0LT5nZXRFeHRDb25uRmlncygpKSB7Ci0gICAgaWYgKFRFU1QpIHsKLSAgICAgIGNvdXQgPDwiICBpbml0TWF6ZUNvc3RfYm91bmRhcnlfaGVscGVyICIgPDxuZXQtPmdldEZyTmV0KCktPmdldE5hbWUoKTsKLSAgICB9Ci0gICAgaWYgKGlzQWRkUGF0aENvc3QpIHsKLSAgICAgIGFkZFBhdGhDb3N0KGNvbm5GaWcuZ2V0KCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdWJQYXRoQ29zdChjb25uRmlnLmdldCgpKTsKLSAgICB9Ci0gICAgLy9pZiAoY29ubkZpZy0+dHlwZUlkKCkgPT0gZHJjUGF0aFNlZykgewotICAgIC8vICBhdXRvIG9iaiA9IHN0YXRpY19jYXN0PGRyUGF0aFNlZyo+KGNvbm5GaWcuZ2V0KCkpOwotICAgIC8vICBmclBvaW50IGJwLCBlcDsKLSAgICAvLyAgb2JqLT5nZXRQb2ludHMoYnAsIGVwKTsKLSAgICAvLyAgYXV0byAmYm94ID0gZ2V0Um91dGVCb3goKTsKLSAgICAvLyAgZnJDb29yZCBkeGJwID0gbWF4KG1heChib3gubGVmdCgpICAgLSBicC54KCksIGJwLngoKSAtIGJveC5yaWdodCgpKSwgMCk7Ci0gICAgLy8gIGZyQ29vcmQgZHlicCA9IG1heChtYXgoYm94LmJvdHRvbSgpIC0gYnAueSgpLCBicC55KCkgLSBib3gudG9wKCkpLCAgIDApOwotICAgIC8vICBmckNvb3JkIGR4ZXAgPSBtYXgobWF4KGJveC5sZWZ0KCkgICAtIGVwLngoKSwgZXAueCgpIC0gYm94LnJpZ2h0KCkpLCAwKTsKLSAgICAvLyAgZnJDb29yZCBkeWVwID0gbWF4KG1heChib3guYm90dG9tKCkgLSBlcC55KCksIGVwLnkoKSAtIGJveC50b3AoKSksICAgMCk7Ci0gICAgLy8gIC8vIGJvdW5kYXJ5IHNlZ21lbnQgYXMgaWYgaXQgZG9lcyBub3QgZXhpc3QKLSAgICAvLyAgaWYgKGR4YnAgKyBkeWJwID09IDAgfHwgZHhlcCArIGR5ZXAgPT0gMCkgewotICAgIC8vICAgIGlmIChURVNUKSB7Ci0gICAgLy8gICAgICBjb3V0IDw8IiAgaW5pdE1hemVDb3N0X2JvdW5kYXJ5X2hlbHBlciB0cnVlIGJvdW5kIGRpc3QoYnAsIGVwKSA9ICgiIAotICAgIC8vICAgICAgICAgICA8PGR4YnAgPDwiLCAiIDw8ZHlicCA8PCIpICgiIAotICAgIC8vICAgICAgICAgICA8PGR4ZXAgPDwiLCAiIDw8ZHllcCA8PCIpICIKLSAgICAvLyAgICAgICAgICAgPDxuZXQtPmdldEZyTmV0KCktPmdldE5hbWUoKTsKLSAgICAvLyAgICB9Ci0gICAgLy8gICAgaWYgKGlzQWRkUGF0aENvc3QpIHsKLSAgICAvLyAgICAgIGFkZFBhdGhDb3N0KG9iaik7Ci0gICAgLy8gICAgfSBlbHNlIHsKLSAgICAvLyAgICAgIHN1YlBhdGhDb3N0KG9iaik7Ci0gICAgLy8gICAgfQotICAgIC8vICB9IGVsc2UgewotICAgIC8vICAgIGlmIChURVNUKSB7Ci0gICAgLy8gICAgICBGbGV4TWF6ZUlkeCBiaSwgZWk7Ci0gICAgLy8gICAgICBvYmotPmdldE1hemVJZHgoYmksIGVpKTsKLSAgICAvLyAgICAgIGNvdXQgPDwiICBpbml0TWF6ZUNvc3RfYm91bmRhcnlfaGVscGVyIHRydWUgYm91bmQgbm90IGVudGVyZWQgZGlzdChicCwgZXApID0gKCIgCi0gICAgLy8gICAgICAgICAgIDw8ZHhicCA8PCIsICIgPDxkeWJwIDw8IikgKCIgCi0gICAgLy8gICAgICAgICAgIDw8ZHhlcCA8PCIsICIgPDxkeWVwIDw8IikgIgotICAgIC8vICAgICAgICAgICA8PG5ldC0+Z2V0RnJOZXQoKS0+Z2V0TmFtZSgpIDw8IiAiCi0gICAgLy8gICAgICAgICAgIDw8YmkgPDwiIC0tICIgPDxlaSA8PGVuZGw7Ci0gICAgLy8gICAgfQotICAgIC8vICB9Ci0gICAgLy8gdmlhIGFzIGlmIHNhbWUtbmV0IG1ldGFsIHNwYWNpbmcgZG9lcyBub3QgZXhpc3QsCi0gICAgLy8gZS5nLiwgdmlhIGVvbCBvbiBtZXRhbCBsYXllciBtYXkgYmUgZmFsc2UgYmVjYXVzZSBtZXRhbCBpcyBjb25uZWN0ZWQKLSAgICAvLyAgIC0tPiBEUkMgZW5naW5lIHRvIGFkZCBjb3N0IGlmIHRydWUgZW9sIAotICAgIC8vIGN1cnJlbnRseSBwcmwgYW5kIHR3IGFyZSBhbHNvIGluY2x1ZGVkIHRvIGF2b2lkIHBlc3NpbWlzdGlzbQotICAgIC8vIGFmdGVyIGFkZGluZyB2aWEgc3BhY2luZyBydWxlLCBhZGRQYXRoQ29zdCBzaG91bGQgYWRkIGFuIGFyZ3VtZW50IHRvIGFsbG93IG9ubHkgbWV0YWwgcnVsZXMKLSAgICAvLyB2aWEgc3BhY2luZyBzaG91bGQgc3RpbGwgYmUgYXBwbGllZAotICAgIC8vfSBlbHNlIGlmIChjb25uRmlnLT50eXBlSWQoKSA9PSBkcmNWaWEpIHsKLSAgICAvLyAgYXV0byBvYmogPSBzdGF0aWNfY2FzdDxkclZpYSo+KGNvbm5GaWcuZ2V0KCkpOwotICAgIC8vICBpZiAoVEVTVCkgewotICAgIC8vICAgIGNvdXQgPDwiICBpbml0TWF6ZUNvc3RfYm91bmRhcnlfaGVscGVyIGZhbHNlIGJvdW5kICIgPDxuZXQtPmdldEZyTmV0KCktPmdldE5hbWUoKTsKLSAgICAvLyAgfQotICAgIC8vICBpZiAoaXNBZGRQYXRoQ29zdCkgewotICAgIC8vICAgIGFkZFBhdGhDb3N0KG9iaik7Ci0gICAgLy8gIH0gZWxzZSB7Ci0gICAgLy8gICAgc3ViUGF0aENvc3Qob2JqKTsKLSAgICAvLyAgfQotICAgIC8vfQotICB9Ci19Ci0KLXZvaWQgRmxleERSV29ya2VyOjppbml0Rml4ZWRPYmpzKCkgewotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgZG91YmxlIGRidSA9IGdldFRlY2goKS0+Z2V0REJVUGVyVVUoKTsKLSAgYXV0byAmZHJjQm94ID0gZ2V0Um91dGVCb3goKTsKLSAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgIGNvdXQgPDwgIiAgRFJDICgiIDw8IGRyY0JveC5sZWZ0KCkgLyBkYnUgPDwgIiwgIiA8PCBkcmNCb3guYm90dG9tKCkgLyBkYnUKLSAgICAgICAgIDw8ICIpIC0tICgiIDw8IGRyY0JveC5yaWdodCgpIC8gZGJ1IDw8ICIsICIgPDwgZHJjQm94LnRvcCgpIC8gZGJ1IDw8ICIpOlxuIjsKLSAgfQotICBib3hfdCBxdWVyeUJveChwb2ludF90KGRyY0JveC5sZWZ0KCksIGRyY0JveC5ib3R0b20oKSksIHBvaW50X3QoZHJjQm94LnJpZ2h0KCksIGRyY0JveC50b3AoKSkpOwotICBzZXQ8ZnJCbG9ja09iamVjdCo+IGRyY09ialNldDsKLSAgLy8gZml4ZWQgb2JqCi0gIGZvciAoYXV0byBsYXllck51bSA9IGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldEJvdHRvbUxheWVyTnVtKCk7IAotICAgICAgIGxheWVyTnVtIDw9IGRlc2lnbi0+Z2V0VGVjaCgpLT5nZXRUb3BMYXllck51bSgpOyArK2xheWVyTnVtKSB7Ci0gICAgYXV0byByZWdpb25RdWVyeSA9IGdldERlc2lnbigpLT5nZXRSZWdpb25RdWVyeSgpOwotICAgIHZlY3RvcjxycV9ycHRyX3ZhbHVlX3Q8ZnJCbG9ja09iamVjdD4gPiBxdWVyeVJlc3VsdDsKLSAgICByZWdpb25RdWVyeS0+cXVlcnkocXVlcnlCb3gsIGxheWVyTnVtLCBxdWVyeVJlc3VsdCk7Ci0gICAgZm9yIChhdXRvICZvYmpQYWlyOiBxdWVyeVJlc3VsdCkgewotICAgICAgZHJjT2JqU2V0Lmluc2VydChvYmpQYWlyLnNlY29uZCk7Ci0gICAgfQotICB9Ci0gIGZvciAoYXV0byBkcmNPYmo6ZHJjT2JqU2V0KSB7Ci0gICAgZml4ZWRPYmpzLnB1c2hfYmFjayhkcmNPYmopOwotICB9Ci0gIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICBjb3V0IDw8ICIjZml4ZWQgb2JqID0gIiA8PCBmaXhlZE9ianMuc2l6ZSgpIDw8ICJcbiI7Ci0gIH0KLX0KLQotdm9pZCBGbGV4RFJXb3JrZXI6OmluaXRNYXJrZXJzKCkgewotICB2ZWN0b3I8ZnJNYXJrZXIqPiByZXN1bHQ7Ci0gIGdldFJlZ2lvblF1ZXJ5KCktPnF1ZXJ5TWFya2VyKGdldFJvdXRlQm94KCksIHJlc3VsdCk7Ci0gIGZvciAoYXV0byBtcHRyOiByZXN1bHQpIHsKLSAgICBtYXJrZXJzLnB1c2hfYmFjaygqbXB0cik7Ci0gIH0KLSAgc2V0SW5pdE51bU1hcmtlcnMoZ2V0TnVtTWFya2VycygpKTsKLX0KLQotdm9pZCBGbGV4RFJXb3JrZXI6OmluaXQoKSB7Ci0gIC8vIGlmIGluaXREUgotICAvLyAgIGdldCBhbGwgaW5zdHRlcm0vdGVybSBmb3IgZWFjaCBuZXQKLSAgLy8gZWxzZQotICAvLyAgIDEuIGdldCBhbGwgaW5zdGVybS90ZXJtIGJhc2VkIG9uIGJlZ2luL2VuZCBvZiBwYXRoc2VnLCB2aWEKLSAgLy8gICAyLiB1bmlvbiBhbmQgZmluZAotICAvLwotICAvL3VzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ubzsKLSAgaW5pdE1hcmtlcnMoKTsKLSAgaWYgKGlzRW5hYmxlRFJDKCkgJiYgZ2V0UmlwdXBNb2RlKCkgPT0gMCAmJiBnZXRJbml0TnVtTWFya2VycygpID09IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW5pdEZpeGVkT2JqcygpOwotICAvL2hpZ2hfcmVzb2x1dGlvbl9jbG9jazo6dGltZV9wb2ludCB0MCA9IGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7Ci0gIGluaXROZXRzKCk7Ci0gIC8vaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjp0aW1lX3BvaW50IHQxID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKLSAgaW5pdEdyaWRHcmFwaCgpOwotICAvL2hpZ2hfcmVzb2x1dGlvbl9jbG9jazo6dGltZV9wb2ludCB0MiA9IGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7Ci0gIGluaXRNYXplSWR4KCk7Ci0gIC8vaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjp0aW1lX3BvaW50IHQzID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKLSAgaW5pdE1hemVDb3N0KCk7Ci0gIC8vaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjp0aW1lX3BvaW50IHQ0ID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKLX0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RyL0ZsZXhEUl9tYXplLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RyL0ZsZXhEUl9tYXplLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkwZTNlMy4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kci9GbGV4RFJfbWF6ZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzU4ICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJkci9GbGV4RFIuaCIKLSNpbmNsdWRlICJkcmMvZnJEUkMuaCIKLSNpbmNsdWRlIDxjaHJvbm8+Ci0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgZnI7Ci0KLWlubGluZSBmckNvb3JkIEZsZXhEUldvcmtlcjo6cHQyYm94RGlzdFNxdWFyZShjb25zdCBmclBvaW50ICZwdCwgY29uc3QgZnJCb3ggJmJveCkgewotICBmckNvb3JkIGR4ID0gbWF4KG1heChib3gubGVmdCgpICAgLSBwdC54KCksIHB0LngoKSAtIGJveC5yaWdodCgpKSwgMCk7Ci0gIGZyQ29vcmQgZHkgPSBtYXgobWF4KGJveC5ib3R0b20oKSAtIHB0LnkoKSwgcHQueSgpIC0gYm94LnRvcCgpKSwgICAwKTsKLSAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5OwotfQotCi1pbmxpbmUgZnJDb29yZCBGbGV4RFJXb3JrZXI6OmJveDJib3hEaXN0U3F1YXJlKGNvbnN0IGZyQm94ICZib3gxLCBjb25zdCBmckJveCAmYm94MiwgZnJDb29yZCAmZHgsIGZyQ29vcmQgJmR5KSB7Ci0gIGR4ID0gbWF4KG1heChib3gxLmxlZnQoKSwgYm94Mi5sZWZ0KCkpICAgICAtIG1pbihib3gxLnJpZ2h0KCksIGJveDIucmlnaHQoKSksIDApOwotICBkeSA9IG1heChtYXgoYm94MS5ib3R0b20oKSwgYm94Mi5ib3R0b20oKSkgLSBtaW4oYm94MS50b3AoKSwgYm94Mi50b3AoKSksICAgICAwKTsKLSAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5OwotfQotCi0KLS8qaW5saW5lKi8gdm9pZCBGbGV4RFJXb3JrZXI6Om1vZE1pblNwYWNpbmdDb3N0UGxhbmVyKGRyTmV0KiBuZXQsIGNvbnN0IGZyQm94ICZib3gsIGZyTUlkeCB6LCBib29sIGlzQWRkUGF0aENvc3QpIHsKLSAgYXV0byBsTnVtID0gZ3JpZEdyYXBoLmdldExheWVyTnVtKHopOwotICAvLyBvYmoxID0gY3VyciBvYmoKLSAgZnJDb29yZCB3aWR0aDEgID0gYm94LndpZHRoKCk7Ci0gIGZyQ29vcmQgbGVuZ3RoMSA9IGJveC5sZW5ndGgoKTsKLSAgLy8gb2JqMiA9IG90aGVyIG9iagotICAvLyBsYXllciBkZWZhdWx0IHdpZHRoCi0gIGZyQ29vcmQgd2lkdGgyICAgICA9IGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldExheWVyKGxOdW0pLT5nZXRXaWR0aCgpOwotICBmckNvb3JkIGhhbGZ3aWR0aDIgPSB3aWR0aDIgLyAyOwotICAvLyBzcGFjaW5nIHZhbHVlIG5lZWRlZAotICBmckNvb3JkIGJsb2F0RGlzdCA9IDA7Ci0gIGF1dG8gY29uID0gZ2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0TGF5ZXIobE51bSktPmdldE1pblNwYWNpbmcoKTsKLSAgaWYgKGNvbikgewotICAgIGlmIChjb24tPnR5cGVJZCgpID09IGZyQ29uc3RyYWludFR5cGVFbnVtOjpmcmNTcGFjaW5nQ29uc3RyYWludCkgewotICAgICAgYmxvYXREaXN0ID0gc3RhdGljX2Nhc3Q8ZnJTcGFjaW5nQ29uc3RyYWludCo+KGNvbiktPmdldE1pblNwYWNpbmcoKTsKLSAgICB9IGVsc2UgaWYgKGNvbi0+dHlwZUlkKCkgPT0gZnJDb25zdHJhaW50VHlwZUVudW06OmZyY1NwYWNpbmdUYWJsZVBybENvbnN0cmFpbnQpIHsKLSAgICAgIGJsb2F0RGlzdCA9IHN0YXRpY19jYXN0PGZyU3BhY2luZ1RhYmxlUHJsQ29uc3RyYWludCo+KGNvbiktPmZpbmQobWF4KHdpZHRoMSwgd2lkdGgyKSwgbGVuZ3RoMSk7Ci0gICAgfSBlbHNlIGlmIChjb24tPnR5cGVJZCgpID09IGZyQ29uc3RyYWludFR5cGVFbnVtOjpmcmNTcGFjaW5nVGFibGVUd0NvbnN0cmFpbnQpIHsKLSAgICAgIGJsb2F0RGlzdCA9IHN0YXRpY19jYXN0PGZyU3BhY2luZ1RhYmxlVHdDb25zdHJhaW50Kj4oY29uKS0+ZmluZCh3aWR0aDEsIHdpZHRoMiwgbGVuZ3RoMSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvdXQgPDwiV2FybmluZzogbWluIHNwYWNpbmcgcnVsZSBub3Qgc3VwcG9ydGVyZCIgPDxlbmRsOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBjb3V0IDw8Ildhcm5pbmc6IG5vIG1pbiBzcGFjaW5nIHJ1bGUiIDw8ZW5kbDsKLSAgICByZXR1cm47Ci0gIH0KLSAgZnJDb29yZCBibG9hdERpc3RTcXVhcmUgPSBibG9hdERpc3QgKiBibG9hdERpc3Q7Ci0KLSAgRmxleE1hemVJZHggbUlkeDE7Ci0gIEZsZXhNYXplSWR4IG1JZHgyOwotICAvLyBhc3N1bWVzIHdpZHRoIGFsd2F5cyA+IDIKLSAgZnJCb3ggYngoYm94LmxlZnQoKSAgIC0gYmxvYXREaXN0IC0gaGFsZndpZHRoMiArIDEsIGJveC5ib3R0b20oKSAtIGJsb2F0RGlzdCAtIGhhbGZ3aWR0aDIgKyAxLAotICAgICAgICAgICBib3gucmlnaHQoKSAgKyBibG9hdERpc3QgKyBoYWxmd2lkdGgyIC0gMSwgYm94LnRvcCgpICAgICsgYmxvYXREaXN0ICsgaGFsZndpZHRoMiAtIDEpOwotICBncmlkR3JhcGguZ2V0SWR4Qm94KG1JZHgxLCBtSWR4MiwgYngpOwotICAvL2lmICghaXNJbml0RFIoKSkgewotICAvLyAgY291dCA8PCIgYm94ICIgPDxib3ggPDwiIGJsb2F0RGlzdCAiIDw8YmxvYXREaXN0IDw8IiBieCAiIDw8YnggPDxlbmRsOwotICAvLyAgY291dCA8PCIgbWlkeDEvMiAoIiA8PG1JZHgxLngoKSA8PCIsICIgPDxtSWR4MS55KCkgPDwiKSAoIgotICAvLyAgICAgICAgICAgICAgICAgICAgICA8PG1JZHgyLngoKSA8PCIsICIgPDxtSWR4Mi55KCkgPDwiKSAoIiA8PGVuZGw7Ci0gIC8vfQotCi0gIGZyUG9pbnQgcHQsIHB0MSwgcHQyLCBwdDMsIHB0NDsKLSAgZnJDb29yZCBkaXN0U3F1YXJlID0gMDsKLSAgaW50IGNudCA9IDA7Ci0gIGZvciAoaW50IGkgPSBtSWR4MS54KCk7IGkgPD0gbUlkeDIueCgpOyBpKyspIHsKLSAgICBmb3IgKGludCBqID0gbUlkeDEueSgpOyBqIDw9IG1JZHgyLnkoKTsgaisrKSB7Ci0gICAgICBncmlkR3JhcGguZ2V0UG9pbnQocHQsIGksIGopOwotICAgICAgcHQxLnNldChwdC54KCkgKyBoYWxmd2lkdGgyLCBwdC55KCkgLSBoYWxmd2lkdGgyKTsKLSAgICAgIHB0Mi5zZXQocHQueCgpICsgaGFsZndpZHRoMiwgcHQueSgpICsgaGFsZndpZHRoMik7Ci0gICAgICBwdDMuc2V0KHB0LngoKSAtIGhhbGZ3aWR0aDIsIHB0LnkoKSAtIGhhbGZ3aWR0aDIpOwotICAgICAgcHQ0LnNldChwdC54KCkgLSBoYWxmd2lkdGgyLCBwdC55KCkgKyBoYWxmd2lkdGgyKTsKLSAgICAgIGRpc3RTcXVhcmUgPSBtaW4ocHQyYm94RGlzdFNxdWFyZShwdDEsIGJveCksIHB0MmJveERpc3RTcXVhcmUocHQyLCBib3gpKTsKLSAgICAgIGRpc3RTcXVhcmUgPSBtaW4ocHQyYm94RGlzdFNxdWFyZShwdDMsIGJveCksIGRpc3RTcXVhcmUpOwotICAgICAgZGlzdFNxdWFyZSA9IG1pbihwdDJib3hEaXN0U3F1YXJlKHB0NCwgYm94KSwgZGlzdFNxdWFyZSk7Ci0gICAgICBpZiAoZGlzdFNxdWFyZSA8IGJsb2F0RGlzdFNxdWFyZSkgewotICAgICAgICBpZiAoaXNBZGRQYXRoQ29zdCkgewotICAgICAgICAgIGdyaWRHcmFwaC5hZGREUkNDb3N0UGxhbmFyKGksIGosIHopOyAvLyBzYWZlIGFjY2VzcwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdyaWRHcmFwaC5zdWJEUkNDb3N0UGxhbmFyKGksIGosIHopOyAvLyBzYWZlIGFjY2VzcwotICAgICAgICB9Ci0gICAgICAgIGlmIChURVNUKSB7Ci0gICAgICAgICAgY291dCA8PCIgICAgKCIgPDxpIDw8IiwgIiA8PGogPDwiLCAiIDw8eiA8PCIpIG1pblNwYyBwbGFuZXIiIDw8ZW5kbDsKLSAgICAgICAgfQotICAgICAgICBjbnQrKzsKLSAgICAgICAgLy9pZiAoIWlzSW5pdERSKCkpIHsKLSAgICAgICAgLy8gIGNvdXQgPDwiIHBsYW5lciBmaW5kIHZpb2wgbUlkeCAoIiA8PGkgPDwiLCAiIDw8aiA8PCIpICIgPDxwdCA8PGVuZGw7Ci0gICAgICAgIC8vfQotICAgICAgfQotICAgIH0KLSAgfQotICAvL2NvdXQgPDwicGxhbmVyIG1vZCAiIDw8Y250IDw8IiBlZGdlcyIgPDxlbmRsOwotfQotCi0KLS8qaW5saW5lKi8gdm9pZCBGbGV4RFJXb3JrZXI6Om1vZE1pblNwYWNpbmdDb3N0KGRyTmV0KiBuZXQsIGNvbnN0IGZyQm94ICZib3gsIGZyTUlkeCB6LCBib29sIGlzQWRkUGF0aENvc3QsIGJvb2wgaXNDdXJyUHMpIHsKLSAgYXV0byBsTnVtID0gZ3JpZEdyYXBoLmdldExheWVyTnVtKHopOwotICAvLyBvYmoxID0gY3VyciBvYmoKLSAgZnJDb29yZCB3aWR0aDEgID0gYm94LndpZHRoKCk7Ci0gIGZyQ29vcmQgbGVuZ3RoMSA9IGJveC5sZW5ndGgoKTsKLSAgLy8gb2JqMiBwbGFuYXIgPSBvdGhlciBvYmoKLSAgLy8gbGF5ZXIgZGVmYXVsdCB3aWR0aAotICBmckNvb3JkIHdpZHRoMnBsYW5hciAgICAgPSBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihsTnVtKS0+Z2V0V2lkdGgoKTsKLSAgZnJDb29yZCBoYWxmd2lkdGgycGxhbmFyID0gd2lkdGgycGxhbmFyIC8gMjsKLSAgLy8gb2JqMiB2aWFMID0gb3RoZXIgb2JqCi0gIGZyVmlhRGVmKiB2aWFEZWZMID0gKGxOdW0gPiBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRCb3R0b21MYXllck51bSgpKSA/IAotICAgICAgICAgICAgICAgICAgICAgIGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldExheWVyKGxOdW0tMSktPmdldERlZmF1bHRWaWFEZWYoKSA6IAotICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHI7Ci0gIGZyVmlhIHZpYUwodmlhRGVmTCk7Ci0gIGZyQm94IHZpYUJveEwoMCwwLDAsMCk7Ci0gIGlmICh2aWFEZWZMKSB7Ci0gICAgdmlhTC5nZXRMYXllcjJCQm94KHZpYUJveEwpOwotICB9Ci0gIGZyQ29vcmQgd2lkdGgydmlhTCAgPSB2aWFCb3hMLndpZHRoKCk7Ci0gIGZyQ29vcmQgbGVuZ3RoMnZpYUwgPSB2aWFCb3hMLmxlbmd0aCgpOwotICAvLyBvYmoyIHZpYVUgPSBvdGhlciBvYmoKLSAgZnJWaWFEZWYqIHZpYURlZlUgPSAobE51bSA8IGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldFRvcExheWVyTnVtKCkpID8gCi0gICAgICAgICAgICAgICAgICAgICAgZ2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0TGF5ZXIobE51bSsxKS0+Z2V0RGVmYXVsdFZpYURlZigpIDogCi0gICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cjsKLSAgZnJWaWEgdmlhVSh2aWFEZWZVKTsKLSAgZnJCb3ggdmlhQm94VSgwLDAsMCwwKTsKLSAgaWYgKHZpYURlZlUpIHsKLSAgICB2aWFVLmdldExheWVyMUJCb3godmlhQm94VSk7Ci0gIH0KLSAgZnJDb29yZCB3aWR0aDJ2aWFVICA9IHZpYUJveFUud2lkdGgoKTsKLSAgZnJDb29yZCBsZW5ndGgydmlhVSA9IHZpYUJveFUubGVuZ3RoKCk7Ci0KLSAgLy8gc3BhY2luZyB2YWx1ZSBuZWVkZWQKLSAgZnJDb29yZCBibG9hdERpc3RQbGFuYXIgPSAwOwotICBmckNvb3JkIGJsb2F0RGlzdFZpYUwgICA9IDA7Ci0gIGZyQ29vcmQgYmxvYXREaXN0VmlhVSAgID0gMDsKLSAgYXV0byBjb24gPSBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihsTnVtKS0+Z2V0TWluU3BhY2luZygpOwotICBpZiAoY29uKSB7Ci0gICAgaWYgKGNvbi0+dHlwZUlkKCkgPT0gZnJDb25zdHJhaW50VHlwZUVudW06OmZyY1NwYWNpbmdDb25zdHJhaW50KSB7Ci0gICAgICBibG9hdERpc3RQbGFuYXIgPSBzdGF0aWNfY2FzdDxmclNwYWNpbmdDb25zdHJhaW50Kj4oY29uKS0+Z2V0TWluU3BhY2luZygpOwotICAgICAgYmxvYXREaXN0VmlhTCAgID0gc3RhdGljX2Nhc3Q8ZnJTcGFjaW5nQ29uc3RyYWludCo+KGNvbiktPmdldE1pblNwYWNpbmcoKTsKLSAgICAgIGJsb2F0RGlzdFZpYVUgICA9IHN0YXRpY19jYXN0PGZyU3BhY2luZ0NvbnN0cmFpbnQqPihjb24pLT5nZXRNaW5TcGFjaW5nKCk7Ci0gICAgfSBlbHNlIGlmIChjb24tPnR5cGVJZCgpID09IGZyQ29uc3RyYWludFR5cGVFbnVtOjpmcmNTcGFjaW5nVGFibGVQcmxDb25zdHJhaW50KSB7Ci0gICAgICBibG9hdERpc3RQbGFuYXIgPSBzdGF0aWNfY2FzdDxmclNwYWNpbmdUYWJsZVBybENvbnN0cmFpbnQqPihjb24pLT5maW5kKG1heCh3aWR0aDEsIHdpZHRoMnBsYW5hciksIGxlbmd0aDEpOwotICAgICAgYmxvYXREaXN0VmlhTCAgID0gc3RhdGljX2Nhc3Q8ZnJTcGFjaW5nVGFibGVQcmxDb25zdHJhaW50Kj4oY29uKS0+ZmluZChtYXgod2lkdGgxLCB3aWR0aDJ2aWFMKSwgaXNDdXJyUHMgPyBsZW5ndGgydmlhTCA6IG1pbihsZW5ndGgxLCBsZW5ndGgydmlhTCkpOwotICAgICAgYmxvYXREaXN0VmlhVSAgID0gc3RhdGljX2Nhc3Q8ZnJTcGFjaW5nVGFibGVQcmxDb25zdHJhaW50Kj4oY29uKS0+ZmluZChtYXgod2lkdGgxLCB3aWR0aDJ2aWFVKSwgaXNDdXJyUHMgPyBsZW5ndGgydmlhVSA6IG1pbihsZW5ndGgxLCBsZW5ndGgydmlhVSkpOwotICAgIH0gZWxzZSBpZiAoY29uLT50eXBlSWQoKSA9PSBmckNvbnN0cmFpbnRUeXBlRW51bTo6ZnJjU3BhY2luZ1RhYmxlVHdDb25zdHJhaW50KSB7Ci0gICAgICBibG9hdERpc3RQbGFuYXIgPSBzdGF0aWNfY2FzdDxmclNwYWNpbmdUYWJsZVR3Q29uc3RyYWludCo+KGNvbiktPmZpbmQod2lkdGgxLCB3aWR0aDJwbGFuYXIsIGxlbmd0aDEpOwotICAgICAgYmxvYXREaXN0VmlhTCAgID0gc3RhdGljX2Nhc3Q8ZnJTcGFjaW5nVGFibGVUd0NvbnN0cmFpbnQqPihjb24pLT5maW5kKHdpZHRoMSwgd2lkdGgydmlhTCwgaXNDdXJyUHMgPyBsZW5ndGgydmlhTCA6IG1pbihsZW5ndGgxLCBsZW5ndGgydmlhTCkpOwotICAgICAgYmxvYXREaXN0VmlhVSAgID0gc3RhdGljX2Nhc3Q8ZnJTcGFjaW5nVGFibGVUd0NvbnN0cmFpbnQqPihjb24pLT5maW5kKHdpZHRoMSwgd2lkdGgydmlhVSwgaXNDdXJyUHMgPyBsZW5ndGgydmlhVSA6IG1pbihsZW5ndGgxLCBsZW5ndGgydmlhVSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBjb3V0IDw8Ildhcm5pbmc6IG1pbiBzcGFjaW5nIHJ1bGUgbm90IHN1cHBvcnRlcmQiIDw8ZW5kbDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgY291dCA8PCJXYXJuaW5nOiBubyBtaW4gc3BhY2luZyBydWxlIiA8PGVuZGw7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gb3RoZXIgb2JqIGVvbCBzcGMgdG8gY3VyciBvYmoKLSAgLy8gbm8gbmVlZCB0byBibG9hdCBlb2xXaXRoaW4gYmVjYXVzZSBlb2xXaXRoaW4gYWx3YXlzIDwgbWluU3BhY2luZwotICBmckNvb3JkIGJsb2F0RGlzdEVvbFggPSAwOwotICBmckNvb3JkIGJsb2F0RGlzdEVvbFkgPSAwOwotICBmb3IgKGF1dG8gY29uOiBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihsTnVtKS0+Z2V0RW9sU3BhY2luZygpKSB7Ci0gICAgYXV0byBlb2xTcGFjZSAgPSBjb24tPmdldE1pblNwYWNpbmcoKTsKLSAgICBhdXRvIGVvbFdpZHRoICA9IGNvbi0+Z2V0RW9sV2lkdGgoKTsKLSAgICAvLyBlb2wgdXAgYW5kIGRvd24KLSAgICBpZiAodmlhRGVmTCAmJiB2aWFCb3hMLnJpZ2h0KCkgLSB2aWFCb3hMLmxlZnQoKSA8IGVvbFdpZHRoKSB7Ci0gICAgICBibG9hdERpc3RFb2xZID0gbWF4KGJsb2F0RGlzdEVvbFksIGVvbFNwYWNlKTsKLSAgICB9IAotICAgIGlmICh2aWFEZWZVICYmIHZpYUJveFUucmlnaHQoKSAtIHZpYUJveFUubGVmdCgpIDwgZW9sV2lkdGgpIHsKLSAgICAgIGJsb2F0RGlzdEVvbFkgPSBtYXgoYmxvYXREaXN0RW9sWSwgZW9sU3BhY2UpOwotICAgIH0gCi0gICAgLy8gZW9sIGxlZnQgYW5kIHJpZ2h0Ci0gICAgaWYgKHZpYURlZkwgJiYgdmlhQm94TC50b3AoKSAtIHZpYUJveEwuYm90dG9tKCkgPCBlb2xXaWR0aCkgewotICAgICAgYmxvYXREaXN0RW9sWCA9IG1heChibG9hdERpc3RFb2xYLCBlb2xTcGFjZSk7Ci0gICAgfQotICAgIGlmICh2aWFEZWZVICYmIHZpYUJveFUudG9wKCkgLSB2aWFCb3hVLmJvdHRvbSgpIDwgZW9sV2lkdGgpIHsKLSAgICAgIGJsb2F0RGlzdEVvbFggPSBtYXgoYmxvYXREaXN0RW9sWCwgZW9sU3BhY2UpOwotICAgIH0KLSAgfQotCi0gIGZyQ29vcmQgYmxvYXREaXN0ID0gbWF4KG1heChibG9hdERpc3RQbGFuYXIsIGJsb2F0RGlzdFZpYUwpLCBibG9hdERpc3RWaWFVKTsKLSAgLy9mckNvb3JkIGJsb2F0RGlzdFNxdWFyZSA9IGJsb2F0RGlzdCAqIGJsb2F0RGlzdDsKLQotICBGbGV4TWF6ZUlkeCBtSWR4MTsKLSAgRmxleE1hemVJZHggbUlkeDI7Ci0gIC8vIGFzc3VtZXMgd2lkdGggYWx3YXlzID4gMgotICBmckJveCBieChib3gubGVmdCgpICAgLSBtYXgoYmxvYXREaXN0LCBibG9hdERpc3RFb2xYKSAtIG1heChtYXgoaGFsZndpZHRoMnBsYW5hciwgdmlhQm94TC5yaWdodCgpICksIHZpYUJveFUucmlnaHQoKSApICsgMSwgCi0gICAgICAgICAgIGJveC5ib3R0b20oKSAtIG1heChibG9hdERpc3QsIGJsb2F0RGlzdEVvbFkpIC0gbWF4KG1heChoYWxmd2lkdGgycGxhbmFyLCB2aWFCb3hMLnRvcCgpICAgKSwgdmlhQm94VS50b3AoKSAgICkgKyAxLAotICAgICAgICAgICBib3gucmlnaHQoKSAgKyBtYXgoYmxvYXREaXN0LCBibG9hdERpc3RFb2xYKSArIG1heChtYXgoaGFsZndpZHRoMnBsYW5hciwgdmlhQm94TC5sZWZ0KCkgICksIHZpYUJveFUubGVmdCgpICApIC0gMSwgCi0gICAgICAgICAgIGJveC50b3AoKSAgICArIG1heChibG9hdERpc3QsIGJsb2F0RGlzdEVvbFkpICsgbWF4KG1heChoYWxmd2lkdGgycGxhbmFyLCB2aWFCb3hMLmJvdHRvbSgpKSwgdmlhQm94VS5ib3R0b20oKSkgLSAxKTsKLSAgZ3JpZEdyYXBoLmdldElkeEJveChtSWR4MSwgbUlkeDIsIGJ4KTsKLSAgLy9pZiAoIWlzSW5pdERSKCkpIHsKLSAgLy8gIGNvdXQgPDwiIGJveCAiIDw8Ym94IDw8IiBibG9hdERpc3QgIiA8PGJsb2F0RGlzdCA8PCIgYnggIiA8PGJ4IDw8ZW5kbDsKLSAgLy8gIGNvdXQgPDwiIG1pZHgxLzIgKCIgPDxtSWR4MS54KCkgPDwiLCAiIDw8bUlkeDEueSgpIDw8IikgKCIKLSAgLy8gICAgICAgICAgICAgICAgICAgICAgPDxtSWR4Mi54KCkgPDwiLCAiIDw8bUlkeDIueSgpIDw8IikgKCIgPDxlbmRsOwotICAvL30KLQotICBmclBvaW50IHB0OwotICBmckJveCB0bXBCeDsKLSAgZnJDb29yZCBkeCwgZHksIHBybDsKLSAgZnJUcmFuc2Zvcm0geGZvcm07Ci0gIGZyQ29vcmQgcmVxRGlzdCA9IDA7Ci0gIGZyQ29vcmQgZGlzdFNxdWFyZSA9IDA7Ci0gIGludCBjbnQgPSAwOwotICBmb3IgKGludCBpID0gbUlkeDEueCgpOyBpIDw9IG1JZHgyLngoKTsgaSsrKSB7Ci0gICAgZm9yIChpbnQgaiA9IG1JZHgxLnkoKTsgaiA8PSBtSWR4Mi55KCk7IGorKykgewotICAgICAgZ3JpZEdyYXBoLmdldFBvaW50KHB0LCBpLCBqKTsKLSAgICAgIHhmb3JtLnNldChwdCk7Ci0gICAgICAvLyBwbGFuYXIKLSAgICAgIHRtcEJ4LnNldChwdC54KCkgLSBoYWxmd2lkdGgycGxhbmFyLCBwdC55KCkgLSBoYWxmd2lkdGgycGxhbmFyLAotICAgICAgICAgICAgICAgIHB0LngoKSArIGhhbGZ3aWR0aDJwbGFuYXIsIHB0LnkoKSArIGhhbGZ3aWR0aDJwbGFuYXIpOwotICAgICAgZGlzdFNxdWFyZSA9IGJveDJib3hEaXN0U3F1YXJlKGJveCwgdG1wQngsIGR4LCBkeSk7Ci0gICAgICBwcmwgPSBtYXgoZHgsIGR5KTsKLSAgICAgIGlmIChjb24tPnR5cGVJZCgpID09IGZyQ29uc3RyYWludFR5cGVFbnVtOjpmcmNTcGFjaW5nQ29uc3RyYWludCkgewotICAgICAgICByZXFEaXN0ID0gc3RhdGljX2Nhc3Q8ZnJTcGFjaW5nQ29uc3RyYWludCo+KGNvbiktPmdldE1pblNwYWNpbmcoKTsKLSAgICAgIH0gZWxzZSBpZiAoY29uLT50eXBlSWQoKSA9PSBmckNvbnN0cmFpbnRUeXBlRW51bTo6ZnJjU3BhY2luZ1RhYmxlUHJsQ29uc3RyYWludCkgewotICAgICAgICByZXFEaXN0ID0gc3RhdGljX2Nhc3Q8ZnJTcGFjaW5nVGFibGVQcmxDb25zdHJhaW50Kj4oY29uKS0+ZmluZChtYXgod2lkdGgxLCB3aWR0aDJwbGFuYXIpLCBwcmwgPiAwID8gbGVuZ3RoMSA6IDApOwotICAgICAgfSBlbHNlIGlmIChjb24tPnR5cGVJZCgpID09IGZyQ29uc3RyYWludFR5cGVFbnVtOjpmcmNTcGFjaW5nVGFibGVUd0NvbnN0cmFpbnQpIHsKLSAgICAgICAgcmVxRGlzdCA9IHN0YXRpY19jYXN0PGZyU3BhY2luZ1RhYmxlVHdDb25zdHJhaW50Kj4oY29uKS0+ZmluZCh3aWR0aDEsIHdpZHRoMnBsYW5hciwgcHJsID4gMCA/IGxlbmd0aDEgOiAwKTsKLSAgICAgIH0KLSAgICAgIGlmIChkaXN0U3F1YXJlIDwgcmVxRGlzdCAqIHJlcURpc3QpIHsKLSAgICAgICAgaWYgKGlzQWRkUGF0aENvc3QpIHsKLSAgICAgICAgICBncmlkR3JhcGguYWRkRFJDQ29zdFBsYW5hcihpLCBqLCB6KTsgLy8gc2FmZSBhY2Nlc3MKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBncmlkR3JhcGguc3ViRFJDQ29zdFBsYW5hcihpLCBqLCB6KTsgLy8gc2FmZSBhY2Nlc3MKLSAgICAgICAgfQotICAgICAgICBpZiAoVEVTVCkgewotICAgICAgICAgIGNvdXQgPDwiICAgICgiIDw8aSA8PCIsICIgPDxqIDw8IiwgIiA8PHogPDwiKSBtaW5TcGMgcGxhbmVyIiA8PGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgY250Kys7Ci0gICAgICB9Ci0gICAgICAvLyB2aWFMCi0gICAgICBpZiAodmlhRGVmTCkgewotICAgICAgICB0bXBCeC5zZXQodmlhQm94TCk7Ci0gICAgICAgIHRtcEJ4LnRyYW5zZm9ybSh4Zm9ybSk7Ci0gICAgICAgIGRpc3RTcXVhcmUgPSBib3gyYm94RGlzdFNxdWFyZShib3gsIHRtcEJ4LCBkeCwgZHkpOwotICAgICAgICBwcmwgPSBtYXgoZHgsIGR5KTsKLSAgICAgICAgLy8gY3VyciBpcyBwcwotICAgICAgICBpZiAoaXNDdXJyUHMpIHsKLSAgICAgICAgICBpZiAoZHggPT0gMCAmJiBkeSA+IDApIHsKLSAgICAgICAgICAgIHBybCA9IHZpYUJveEwucmlnaHQoKSAtIHZpYUJveEwubGVmdCgpOwotICAgICAgICAgIH0gZWxzZSBpZiAoZHggPiAwICYmIGR5ID09IDApIHsKLSAgICAgICAgICAgIHBybCA9IHZpYUJveEwudG9wKCkgLSB2aWFCb3hMLmJvdHRvbSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoY29uLT50eXBlSWQoKSA9PSBmckNvbnN0cmFpbnRUeXBlRW51bTo6ZnJjU3BhY2luZ0NvbnN0cmFpbnQpIHsKLSAgICAgICAgICByZXFEaXN0ID0gc3RhdGljX2Nhc3Q8ZnJTcGFjaW5nQ29uc3RyYWludCo+KGNvbiktPmdldE1pblNwYWNpbmcoKTsKLSAgICAgICAgfSBlbHNlIGlmIChjb24tPnR5cGVJZCgpID09IGZyQ29uc3RyYWludFR5cGVFbnVtOjpmcmNTcGFjaW5nVGFibGVQcmxDb25zdHJhaW50KSB7Ci0gICAgICAgICAgcmVxRGlzdCA9IHN0YXRpY19jYXN0PGZyU3BhY2luZ1RhYmxlUHJsQ29uc3RyYWludCo+KGNvbiktPmZpbmQobWF4KHdpZHRoMSwgd2lkdGgydmlhTCksIHBybCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29uLT50eXBlSWQoKSA9PSBmckNvbnN0cmFpbnRUeXBlRW51bTo6ZnJjU3BhY2luZ1RhYmxlVHdDb25zdHJhaW50KSB7Ci0gICAgICAgICAgcmVxRGlzdCA9IHN0YXRpY19jYXN0PGZyU3BhY2luZ1RhYmxlVHdDb25zdHJhaW50Kj4oY29uKS0+ZmluZCh3aWR0aDEsIHdpZHRoMnZpYUwsIHBybCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRpc3RTcXVhcmUgPCByZXFEaXN0ICogcmVxRGlzdCkgewotICAgICAgICAgIGlmIChpc0FkZFBhdGhDb3N0KSB7Ci0gICAgICAgICAgICBncmlkR3JhcGguYWRkRFJDQ29zdFZpYShpLCBqLCB6IC0gMSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdyaWRHcmFwaC5zdWJEUkNDb3N0VmlhKGksIGosIHogLSAxKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKFRFU1QpIHsKLSAgICAgICAgICAgIGNvdXQgPDwiICAgICgiIDw8aSA8PCIsICIgPDxqIDw8IiwgIiA8PHogLSAxIDw8IikgVSBtaW5TcGMgdmlhIiA8PGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG1vZE1pblNwYWNpbmdDb3N0VmlhX2VvbChib3gsIHRtcEJ4LCBpc0FkZFBhdGhDb3N0LCBmYWxzZSwgaSwgaiwgeik7Ci0gICAgICAgIH0KLSAgICAgICAgLy9tb2RNaW5TcGFjaW5nQ29zdFZpYV9lb2woYm94LCB0bXBCeCwgaXNBZGRQYXRoQ29zdCwgZmFsc2UsIGksIGosIHopOwotICAgICAgfQotICAgICAgaWYgKHZpYURlZlUpIHsKLSAgICAgICAgdG1wQnguc2V0KHZpYUJveFUpOwotICAgICAgICB0bXBCeC50cmFuc2Zvcm0oeGZvcm0pOwotICAgICAgICBkaXN0U3F1YXJlID0gYm94MmJveERpc3RTcXVhcmUoYm94LCB0bXBCeCwgZHgsIGR5KTsKLSAgICAgICAgcHJsID0gbWF4KGR4LCBkeSk7Ci0gICAgICAgIC8vIGN1cnIgaXMgcHMKLSAgICAgICAgaWYgKGlzQ3VyclBzKSB7Ci0gICAgICAgICAgaWYgKGR4ID09IDAgJiYgZHkgPiAwKSB7Ci0gICAgICAgICAgICBwcmwgPSB2aWFCb3hVLnJpZ2h0KCkgLSB2aWFCb3hVLmxlZnQoKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGR4ID4gMCAmJiBkeSA9PSAwKSB7Ci0gICAgICAgICAgICBwcmwgPSB2aWFCb3hVLnRvcCgpIC0gdmlhQm94VS5ib3R0b20oKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbi0+dHlwZUlkKCkgPT0gZnJDb25zdHJhaW50VHlwZUVudW06OmZyY1NwYWNpbmdDb25zdHJhaW50KSB7Ci0gICAgICAgICAgcmVxRGlzdCA9IHN0YXRpY19jYXN0PGZyU3BhY2luZ0NvbnN0cmFpbnQqPihjb24pLT5nZXRNaW5TcGFjaW5nKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29uLT50eXBlSWQoKSA9PSBmckNvbnN0cmFpbnRUeXBlRW51bTo6ZnJjU3BhY2luZ1RhYmxlUHJsQ29uc3RyYWludCkgewotICAgICAgICAgIHJlcURpc3QgPSBzdGF0aWNfY2FzdDxmclNwYWNpbmdUYWJsZVBybENvbnN0cmFpbnQqPihjb24pLT5maW5kKG1heCh3aWR0aDEsIHdpZHRoMnZpYVUpLCBwcmwpOwotICAgICAgICB9IGVsc2UgaWYgKGNvbi0+dHlwZUlkKCkgPT0gZnJDb25zdHJhaW50VHlwZUVudW06OmZyY1NwYWNpbmdUYWJsZVR3Q29uc3RyYWludCkgewotICAgICAgICAgIHJlcURpc3QgPSBzdGF0aWNfY2FzdDxmclNwYWNpbmdUYWJsZVR3Q29uc3RyYWludCo+KGNvbiktPmZpbmQod2lkdGgxLCB3aWR0aDJ2aWFVLCBwcmwpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkaXN0U3F1YXJlIDwgcmVxRGlzdCAqIHJlcURpc3QpIHsKLSAgICAgICAgICBpZiAoaXNBZGRQYXRoQ29zdCkgewotICAgICAgICAgICAgZ3JpZEdyYXBoLmFkZERSQ0Nvc3RWaWEoaSwgaiwgeik7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdyaWRHcmFwaC5zdWJEUkNDb3N0VmlhKGksIGosIHopOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoVEVTVCkgewotICAgICAgICAgICAgY291dCA8PCIgICAgKCIgPDxpIDw8IiwgIiA8PGogPDwiLCAiIDw8eiA8PCIpIFUgbWluU3BjIHZpYSIgPDxlbmRsOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBtb2RNaW5TcGFjaW5nQ29zdFZpYV9lb2woYm94LCB0bXBCeCwgaXNBZGRQYXRoQ29zdCwgdHJ1ZSwgaSwgaiwgeik7Ci0gICAgICAgIH0KLSAgICAgICAgLy9tb2RNaW5TcGFjaW5nQ29zdFZpYV9lb2woYm94LCB0bXBCeCwgaXNBZGRQYXRoQ29zdCwgdHJ1ZSwgaSwgaiwgeik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIC8vY291dCA8PCJwbGFuZXIgbW9kICIgPDxjbnQgPDwiIGVkZ2VzIiA8PGVuZGw7Ci19Ci0KLS8qaW5saW5lKi8gdm9pZCBGbGV4RFJXb3JrZXI6Om1vZE1pblNwYWNpbmdDb3N0VmlhX2VvbF9oZWxwZXIoY29uc3QgZnJCb3ggJmJveCwgY29uc3QgZnJCb3ggJnRlc3RCb3gsIGJvb2wgaXNBZGRQYXRoQ29zdCwgYm9vbCBpc1VwcGVyVmlhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyTUlkeCBpLCBmck1JZHggaiwgZnJNSWR4IHopIHsKLSAgaWYgKHRlc3RCb3gub3ZlcmxhcHMoYm94LCBmYWxzZSkpIHsKLSAgICBpZiAoaXNVcHBlclZpYSkgewotICAgICAgaWYgKGlzQWRkUGF0aENvc3QpIHsKLSAgICAgICAgZ3JpZEdyYXBoLmFkZERSQ0Nvc3RWaWEoaSwgaiwgeik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBncmlkR3JhcGguc3ViRFJDQ29zdFZpYShpLCBqLCB6KTsKLSAgICAgIH0KLSAgICAgIGlmIChURVNUKSB7Ci0gICAgICAgIGNvdXQgPDwiICAgICgiIDw8aSA8PCIsICIgPDxqIDw8IiwgIiA8PHogPDwiKSBVIG1pblNwYyBlb2wgaGVscGVyIiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChpc0FkZFBhdGhDb3N0KSB7Ci0gICAgICAgIGdyaWRHcmFwaC5hZGREUkNDb3N0VmlhKGksIGosIHogLSAxKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGdyaWRHcmFwaC5zdWJEUkNDb3N0VmlhKGksIGosIHogLSAxKTsKLSAgICAgIH0KLSAgICAgIGlmIChURVNUKSB7Ci0gICAgICAgIGNvdXQgPDwiICAgICgiIDw8aSA8PCIsICIgPDxqIDw8IiwgIiA8PHogLSAxIDw8IikgVSBtaW5TcGMgZW9sIGhlbHBlciIgPDxlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vKmlubGluZSovIHZvaWQgRmxleERSV29ya2VyOjptb2RNaW5TcGFjaW5nQ29zdFZpYV9lb2woY29uc3QgZnJCb3ggJmJveCwgY29uc3QgZnJCb3ggJnRtcEJ4LCBib29sIGlzQWRkUGF0aENvc3QsIGJvb2wgaXNVcHBlclZpYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyTUlkeCBpLCBmck1JZHggaiwgZnJNSWR4IHopIHsKLSAgYXV0byBsTnVtID0gZ3JpZEdyYXBoLmdldExheWVyTnVtKHopOwotICBmckJveCB0ZXN0Qm94OwotICBpZiAoZ2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0TGF5ZXIobE51bSktPmhhc0VvbFNwYWNpbmcoKSkgewotICAgIGZvciAoYXV0byBlb2xDb246IGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldExheWVyKGxOdW0pLT5nZXRFb2xTcGFjaW5nKCkpIHsKLSAgICAgIGF1dG8gZW9sU3BhY2UgID0gZW9sQ29uLT5nZXRNaW5TcGFjaW5nKCk7Ci0gICAgICBhdXRvIGVvbFdpZHRoICA9IGVvbENvbi0+Z2V0RW9sV2lkdGgoKTsKLSAgICAgIGF1dG8gZW9sV2l0aGluID0gZW9sQ29uLT5nZXRFb2xXaXRoaW4oKTsKLSAgICAgIC8vIGVvbCB0byB1cCBhbmQgZG93bgotICAgICAgaWYgKHRtcEJ4LnJpZ2h0KCkgLSB0bXBCeC5sZWZ0KCkgPCBlb2xXaWR0aCkgewotICAgICAgICB0ZXN0Qm94LnNldCh0bXBCeC5sZWZ0KCkgLSBlb2xXaXRoaW4sIHRtcEJ4LnRvcCgpLCAgICAgICAgICAgICAgIHRtcEJ4LnJpZ2h0KCkgKyBlb2xXaXRoaW4sIHRtcEJ4LnRvcCgpICsgZW9sU3BhY2UpOwotICAgICAgICBtb2RNaW5TcGFjaW5nQ29zdFZpYV9lb2xfaGVscGVyKGJveCwgdGVzdEJveCwgaXNBZGRQYXRoQ29zdCwgaXNVcHBlclZpYSwgaSwgaiwgeik7Ci0KLSAgICAgICAgdGVzdEJveC5zZXQodG1wQngubGVmdCgpIC0gZW9sV2l0aGluLCB0bXBCeC5ib3R0b20oKSAtIGVvbFNwYWNlLCB0bXBCeC5yaWdodCgpICsgZW9sV2l0aGluLCB0bXBCeC5ib3R0b20oKSk7Ci0gICAgICAgIG1vZE1pblNwYWNpbmdDb3N0VmlhX2VvbF9oZWxwZXIoYm94LCB0ZXN0Qm94LCBpc0FkZFBhdGhDb3N0LCBpc1VwcGVyVmlhLCBpLCBqLCB6KTsKLSAgICAgIH0KLSAgICAgIC8vIGVvbCB0byBsZWZ0IGFuZCByaWdodAotICAgICAgaWYgKHRtcEJ4LnRvcCgpIC0gdG1wQnguYm90dG9tKCkgPCBlb2xXaWR0aCkgewotICAgICAgICB0ZXN0Qm94LnNldCh0bXBCeC5yaWdodCgpLCAgICAgICAgICAgdG1wQnguYm90dG9tKCkgLSBlb2xXaXRoaW4sIHRtcEJ4LnJpZ2h0KCkgKyBlb2xTcGFjZSwgdG1wQngudG9wKCkgKyBlb2xXaXRoaW4pOwotICAgICAgICBtb2RNaW5TcGFjaW5nQ29zdFZpYV9lb2xfaGVscGVyKGJveCwgdGVzdEJveCwgaXNBZGRQYXRoQ29zdCwgaXNVcHBlclZpYSwgaSwgaiwgeik7Ci0KLSAgICAgICAgdGVzdEJveC5zZXQodG1wQngubGVmdCgpIC0gZW9sU3BhY2UsIHRtcEJ4LmJvdHRvbSgpIC0gZW9sV2l0aGluLCB0bXBCeC5sZWZ0KCksICAgICAgICAgICAgIHRtcEJ4LnRvcCgpICsgZW9sV2l0aGluKTsKLSAgICAgICAgbW9kTWluU3BhY2luZ0Nvc3RWaWFfZW9sX2hlbHBlcihib3gsIHRlc3RCb3gsIGlzQWRkUGF0aENvc3QsIGlzVXBwZXJWaWEsIGksIGosIHopOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0KLXZvaWQgRmxleERSV29ya2VyOjptb2RNaW5TcGFjaW5nQ29zdFZpYShjb25zdCBmckJveCAmYm94LCBmck1JZHggeiwgYm9vbCBpc0FkZFBhdGhDb3N0LCBib29sIGlzVXBwZXJWaWEsIGJvb2wgaXNDdXJyUHMpIHsKLSAgYXV0byBsTnVtID0gZ3JpZEdyYXBoLmdldExheWVyTnVtKHopOwotICAvLyBvYmoxID0gY3VyciBvYmoKLSAgZnJDb29yZCB3aWR0aDEgID0gYm94LndpZHRoKCk7Ci0gIGZyQ29vcmQgbGVuZ3RoMSA9IGJveC5sZW5ndGgoKTsKLSAgLy8gb2JqMiA9IG90aGVyIG9iagotICAvLyBkZWZhdWx0IHZpYSBkaW1lbnNpb24KLSAgZnJWaWFEZWYqIHZpYURlZiA9IG51bGxwdHI7Ci0gIGlmIChpc1VwcGVyVmlhKSB7Ci0gICAgdmlhRGVmID0gKGxOdW0gPCBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRUb3BMYXllck51bSgpKSA/IAotICAgICAgICAgICAgIGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldExheWVyKGxOdW0rMSktPmdldERlZmF1bHRWaWFEZWYoKSA6IAotICAgICAgICAgICAgIG51bGxwdHI7Ci0gIH0gZWxzZSB7Ci0gICAgdmlhRGVmID0gKGxOdW0gPiBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRCb3R0b21MYXllck51bSgpKSA/IAotICAgICAgICAgICAgIGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldExheWVyKGxOdW0tMSktPmdldERlZmF1bHRWaWFEZWYoKSA6IAotICAgICAgICAgICAgIG51bGxwdHI7Ci0gIH0KLSAgaWYgKHZpYURlZiA9PSBudWxscHRyKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGZyVmlhIHZpYSh2aWFEZWYpOwotICBmckJveCB2aWFCb3goMCwwLDAsMCk7Ci0gIGlmIChpc1VwcGVyVmlhKSB7Ci0gICAgdmlhLmdldExheWVyMUJCb3godmlhQm94KTsKLSAgfSBlbHNlIHsKLSAgICB2aWEuZ2V0TGF5ZXIyQkJveCh2aWFCb3gpOwotICB9Ci0gIGZyQ29vcmQgd2lkdGgyICA9IHZpYUJveC53aWR0aCgpOwotICBmckNvb3JkIGxlbmd0aDIgPSB2aWFCb3gubGVuZ3RoKCk7Ci0KLSAgLy8gc3BhY2luZyB2YWx1ZSBuZWVkZWQKLSAgZnJDb29yZCBibG9hdERpc3QgPSAwOwotICBhdXRvIGNvbiA9IGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldExheWVyKGxOdW0pLT5nZXRNaW5TcGFjaW5nKCk7Ci0gIGlmIChjb24pIHsKLSAgICBpZiAoY29uLT50eXBlSWQoKSA9PSBmckNvbnN0cmFpbnRUeXBlRW51bTo6ZnJjU3BhY2luZ0NvbnN0cmFpbnQpIHsKLSAgICAgIGJsb2F0RGlzdCA9IHN0YXRpY19jYXN0PGZyU3BhY2luZ0NvbnN0cmFpbnQqPihjb24pLT5nZXRNaW5TcGFjaW5nKCk7Ci0gICAgfSBlbHNlIGlmIChjb24tPnR5cGVJZCgpID09IGZyQ29uc3RyYWludFR5cGVFbnVtOjpmcmNTcGFjaW5nVGFibGVQcmxDb25zdHJhaW50KSB7Ci0gICAgICBibG9hdERpc3QgPSBzdGF0aWNfY2FzdDxmclNwYWNpbmdUYWJsZVBybENvbnN0cmFpbnQqPihjb24pLT5maW5kKG1heCh3aWR0aDEsIHdpZHRoMiksIGlzQ3VyclBzID8gbGVuZ3RoMiA6IG1pbihsZW5ndGgxLCBsZW5ndGgyKSk7Ci0gICAgfSBlbHNlIGlmIChjb24tPnR5cGVJZCgpID09IGZyQ29uc3RyYWludFR5cGVFbnVtOjpmcmNTcGFjaW5nVGFibGVUd0NvbnN0cmFpbnQpIHsKLSAgICAgIGJsb2F0RGlzdCA9IHN0YXRpY19jYXN0PGZyU3BhY2luZ1RhYmxlVHdDb25zdHJhaW50Kj4oY29uKS0+ZmluZCh3aWR0aDEsIHdpZHRoMiwgaXNDdXJyUHMgPyBsZW5ndGgyIDogbWluKGxlbmd0aDEsIGxlbmd0aDIpKTsKLSAgICB9IGVsc2UgewotICAgICAgY291dCA8PCJXYXJuaW5nOiBtaW4gc3BhY2luZyBydWxlIG5vdCBzdXBwb3J0ZXJkIiA8PGVuZGw7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9IGVsc2UgewotICAgIGNvdXQgPDwiV2FybmluZzogbm8gbWluIHNwYWNpbmcgcnVsZSIgPDxlbmRsOwotICAgIHJldHVybjsKLSAgfQotICAvLyBvdGhlciBvYmogZW9sIHNwYyB0byBjdXJyIG9iagotICAvLyBubyBuZWVkIHRvIGJsYW90IGVvbFdpdGhpbiBiZWNhdXNlIGVvbFdpdGhpbiBhbHdheXMgPCBtaW5TcGFjaW5nCi0gIGZyQ29vcmQgYmxvYXREaXN0RW9sWCA9IDA7Ci0gIGZyQ29vcmQgYmxvYXREaXN0RW9sWSA9IDA7Ci0gIGZvciAoYXV0byBjb246IGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldExheWVyKGxOdW0pLT5nZXRFb2xTcGFjaW5nKCkpIHsKLSAgICBhdXRvIGVvbFNwYWNlICA9IGNvbi0+Z2V0TWluU3BhY2luZygpOwotICAgIGF1dG8gZW9sV2lkdGggID0gY29uLT5nZXRFb2xXaWR0aCgpOwotICAgIC8vIGVvbCB1cCBhbmQgZG93bgotICAgIGlmICh2aWFCb3gucmlnaHQoKSAtIHZpYUJveC5sZWZ0KCkgPCBlb2xXaWR0aCkgewotICAgICAgYmxvYXREaXN0RW9sWSA9IG1heChibG9hdERpc3RFb2xZLCBlb2xTcGFjZSk7Ci0gICAgfSAKLSAgICAvLyBlb2wgbGVmdCBhbmQgcmlnaHQKLSAgICBpZiAodmlhQm94LnRvcCgpIC0gdmlhQm94LmJvdHRvbSgpIDwgZW9sV2lkdGgpIHsKLSAgICAgIGJsb2F0RGlzdEVvbFggPSBtYXgoYmxvYXREaXN0RW9sWCwgZW9sU3BhY2UpOwotICAgIH0KLSAgfQotICAvL2ZyQ29vcmQgYmxvYXREaXN0U3F1YXJlID0gYmxvYXREaXN0ICogYmxvYXREaXN0OwotICAKLSAgRmxleE1hemVJZHggbUlkeDE7Ci0gIEZsZXhNYXplSWR4IG1JZHgyOwotICAvLyBhc3N1bWVzIHdpZHRoIGFsd2F5cyA+IDIKLSAgZnJCb3ggYngoYm94LmxlZnQoKSAgIC0gbWF4KGJsb2F0RGlzdCwgYmxvYXREaXN0RW9sWCkgLSAodmlhQm94LnJpZ2h0KCkgLSAwKSArIDEsIAotICAgICAgICAgICAgIGJveC5ib3R0b20oKSAtIG1heChibG9hdERpc3QsIGJsb2F0RGlzdEVvbFkpIC0gKHZpYUJveC50b3AoKSAtIDApICsgMSwKLSAgICAgICAgICAgYm94LnJpZ2h0KCkgICsgbWF4KGJsb2F0RGlzdCwgYmxvYXREaXN0RW9sWCkgKyAoMCAtIHZpYUJveC5sZWZ0KCkpICAtIDEsIAotICAgICAgICAgICAgIGJveC50b3AoKSAgICArIG1heChibG9hdERpc3QsIGJsb2F0RGlzdEVvbFkpICsgKDAgLSB2aWFCb3guYm90dG9tKCkpIC0gMSk7Ci0gIGdyaWRHcmFwaC5nZXRJZHhCb3gobUlkeDEsIG1JZHgyLCBieCk7Ci0KLSAgZnJQb2ludCBwdDsKLSAgZnJCb3ggdG1wQng7Ci0gIGZyQ29vcmQgZGlzdFNxdWFyZSA9IDA7Ci0gIGZyQ29vcmQgZHgsIGR5LCBwcmw7Ci0gIGZyVHJhbnNmb3JtIHhmb3JtOwotICBmckNvb3JkIHJlcURpc3QgPSAwOwotICBmckJveCBzVmlhQm94OwotICBmb3IgKGludCBpID0gbUlkeDEueCgpOyBpIDw9IG1JZHgyLngoKTsgaSsrKSB7Ci0gICAgZm9yIChpbnQgaiA9IG1JZHgxLnkoKTsgaiA8PSBtSWR4Mi55KCk7IGorKykgewotICAgICAgZ3JpZEdyYXBoLmdldFBvaW50KHB0LCBpLCBqKTsKLSAgICAgIHhmb3JtLnNldChwdCk7Ci0gICAgICAvL2lmIChncmlkR3JhcGguaXNTVmlhKGksIGosIGlzVXBwZXJWaWEgPyB6IDogeiAtIDEpKSB7Ci0gICAgICAgIC8vYXV0byBzVmlhRGVmPSBhcFNWaWFbRmxleE1hemVJZHgoaSwgaiwgaXNVcHBlclZpYSA/IHogOiB6IC0gMSldOwotICAgICAgICAvL2ZyVmlhIHNWaWEoc1ZpYURlZik7Ci0gICAgICAgIC8vaWYgKGlzVXBwZXJWaWEpIHsKLSAgICAgICAgLy8gIHNWaWEuZ2V0TGF5ZXIxQkJveChzVmlhQm94KTsKLSAgICAgICAgLy99IGVsc2UgewotICAgICAgICAvLyAgc1ZpYS5nZXRMYXllcjJCQm94KHNWaWFCb3gpOwotICAgICAgICAvL30KLSAgICAgICAgLy90bXBCeC5zZXQoc1ZpYUJveCk7Ci0gICAgICAgIC8vY29udGludWU7Ci0gICAgICAvL30KLSAgICAgIHRtcEJ4LnNldCh2aWFCb3gpOwotICAgICAgdG1wQngudHJhbnNmb3JtKHhmb3JtKTsKLSAgICAgIGRpc3RTcXVhcmUgPSBib3gyYm94RGlzdFNxdWFyZShib3gsIHRtcEJ4LCBkeCwgZHkpOwotICAgICAgcHJsID0gbWF4KGR4LCBkeSk7Ci0gICAgICAvLyBjdXJyIGlzIHBzCi0gICAgICBpZiAoaXNDdXJyUHMpIHsKLSAgICAgICAgaWYgKGR4ID09IDAgJiYgZHkgPiAwKSB7Ci0gICAgICAgICAgcHJsID0gdmlhQm94LnJpZ2h0KCkgLSB2aWFCb3gubGVmdCgpOwotICAgICAgICB9IGVsc2UgaWYgKGR4ID4gMCAmJiBkeSA9PSAwKSB7Ci0gICAgICAgICAgcHJsID0gdmlhQm94LnRvcCgpIC0gdmlhQm94LmJvdHRvbSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoY29uLT50eXBlSWQoKSA9PSBmckNvbnN0cmFpbnRUeXBlRW51bTo6ZnJjU3BhY2luZ0NvbnN0cmFpbnQpIHsKLSAgICAgICAgcmVxRGlzdCA9IHN0YXRpY19jYXN0PGZyU3BhY2luZ0NvbnN0cmFpbnQqPihjb24pLT5nZXRNaW5TcGFjaW5nKCk7Ci0gICAgICB9IGVsc2UgaWYgKGNvbi0+dHlwZUlkKCkgPT0gZnJDb25zdHJhaW50VHlwZUVudW06OmZyY1NwYWNpbmdUYWJsZVBybENvbnN0cmFpbnQpIHsKLSAgICAgICAgcmVxRGlzdCA9IHN0YXRpY19jYXN0PGZyU3BhY2luZ1RhYmxlUHJsQ29uc3RyYWludCo+KGNvbiktPmZpbmQobWF4KHdpZHRoMSwgd2lkdGgyKSwgcHJsKTsKLSAgICAgIH0gZWxzZSBpZiAoY29uLT50eXBlSWQoKSA9PSBmckNvbnN0cmFpbnRUeXBlRW51bTo6ZnJjU3BhY2luZ1RhYmxlVHdDb25zdHJhaW50KSB7Ci0gICAgICAgIHJlcURpc3QgPSBzdGF0aWNfY2FzdDxmclNwYWNpbmdUYWJsZVR3Q29uc3RyYWludCo+KGNvbiktPmZpbmQod2lkdGgxLCB3aWR0aDIsIHBybCk7Ci0gICAgICB9Ci0gICAgICBpZiAoZGlzdFNxdWFyZSA8IHJlcURpc3QgKiByZXFEaXN0KSB7Ci0gICAgICAgIGlmIChpc1VwcGVyVmlhKSB7Ci0gICAgICAgICAgaWYgKGlzQWRkUGF0aENvc3QpIHsKLSAgICAgICAgICAgIGdyaWRHcmFwaC5hZGREUkNDb3N0VmlhKGksIGosIHopOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBncmlkR3JhcGguc3ViRFJDQ29zdFZpYShpLCBqLCB6KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKFRFU1QpIHsKLSAgICAgICAgICAgIGNvdXQgPDwiICAgICgiIDw8aSA8PCIsICIgPDxqIDw8IiwgIiA8PHogPDwiKSBVIG1pblNwYyB2aWEiIDw8ZW5kbDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKGlzQWRkUGF0aENvc3QpIHsKLSAgICAgICAgICAgIGdyaWRHcmFwaC5hZGREUkNDb3N0VmlhKGksIGosIHogLSAxKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZ3JpZEdyYXBoLnN1YkRSQ0Nvc3RWaWEoaSwgaiwgeiAtIDEpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoVEVTVCkgewotICAgICAgICAgICAgY291dCA8PCIgICAgKCIgPDxpIDw8IiwgIiA8PGogPDwiLCAiIDw8eiAtIDEgPDwiKSBVIG1pblNwYyB2aWEiIDw8ZW5kbDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIGVvbCwgb3RoZXIgb2JqIHRvIGN1cnIgb2JqCi0gICAgICBtb2RNaW5TcGFjaW5nQ29zdFZpYV9lb2woYm94LCB0bXBCeCwgaXNBZGRQYXRoQ29zdCwgaXNVcHBlclZpYSwgaSwgaiwgeik7Ci0gICAgfQotICB9Ci0KLX0KLQotCi0vLyB0eXBlID09IDA6IHBsYW5lcgotLy8gdHlwZSA9PSAxOiBkb3duCi0vLyB0eXBlID09IDI6IHVwCi0vKmlubGluZSovIHZvaWQgRmxleERSV29ya2VyOjptb2RFb2xTcGFjaW5nQ29zdF9oZWxwZXIoY29uc3QgZnJCb3ggJnRlc3Rib3gsIGZyTUlkeCB6LCBib29sIGlzQWRkUGF0aENvc3QsIGludCB0eXBlKSB7Ci0gIGF1dG8gbE51bSA9IGdyaWRHcmFwaC5nZXRMYXllck51bSh6KTsKLSAgZnJCb3ggYng7Ci0gIGlmICh0eXBlID09IDApIHsKLSAgICAvLyBsYXllciBkZWZhdWx0IHdpZHRoCi0gICAgZnJDb29yZCB3aWR0aDIgICAgID0gZ2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0TGF5ZXIobE51bSktPmdldFdpZHRoKCk7Ci0gICAgZnJDb29yZCBoYWxmd2lkdGgyID0gd2lkdGgyIC8gMjsKLSAgICAvLyBhc3N1bWVzIHdpZHRoIGFsd2F5cyA+IDIKLSAgICBieC5zZXQodGVzdGJveC5sZWZ0KCkgICAtIGhhbGZ3aWR0aDIgKyAxLCB0ZXN0Ym94LmJvdHRvbSgpIC0gaGFsZndpZHRoMiArIDEsCi0gICAgICAgICAgIHRlc3Rib3gucmlnaHQoKSAgKyBoYWxmd2lkdGgyIC0gMSwgdGVzdGJveC50b3AoKSAgICArIGhhbGZ3aWR0aDIgLSAxKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBkZWZhdWx0IHZpYSBkaW1lbnNpb24KLSAgICBmclZpYURlZiogdmlhRGVmID0gbnVsbHB0cjsKLSAgICBpZiAodHlwZSA9PSAxKSB7Ci0gICAgICB2aWFEZWYgPSAobE51bSA+IGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldEJvdHRvbUxheWVyTnVtKCkpID8gCi0gICAgICAgICAgICAgICBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihsTnVtLTEpLT5nZXREZWZhdWx0VmlhRGVmKCkgOiAKLSAgICAgICAgICAgICAgIG51bGxwdHI7Ci0gICAgfSBlbHNlIGlmICh0eXBlID09IDIpIHsKLSAgICAgIHZpYURlZiA9IChsTnVtIDwgZ2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0VG9wTGF5ZXJOdW0oKSkgPyAKLSAgICAgICAgICAgICAgIGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldExheWVyKGxOdW0rMSktPmdldERlZmF1bHRWaWFEZWYoKSA6IAotICAgICAgICAgICAgICAgbnVsbHB0cjsKLSAgICB9Ci0gICAgaWYgKHZpYURlZiA9PSBudWxscHRyKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGZyVmlhIHZpYSh2aWFEZWYpOwotICAgIGZyQm94IHZpYUJveCgwLDAsMCwwKTsKLSAgICBpZiAodHlwZSA9PSAyKSB7IC8vIHVwcGVyIHZpYQotICAgICAgdmlhLmdldExheWVyMUJCb3godmlhQm94KTsKLSAgICB9IGVsc2UgewotICAgICAgdmlhLmdldExheWVyMkJCb3godmlhQm94KTsKLSAgICB9Ci0gICAgLy8gYXNzdW1lcyB2aWEgYmJveCBhbHdheXMgPiAyCi0gICAgYnguc2V0KHRlc3Rib3gubGVmdCgpICAtICh2aWFCb3gucmlnaHQoKSAtIDApICsgMSwgdGVzdGJveC5ib3R0b20oKSAtICh2aWFCb3gudG9wKCkgLSAwKSArIDEsCi0gICAgICAgICAgIHRlc3Rib3gucmlnaHQoKSArICgwIC0gdmlhQm94LmxlZnQoKSkgIC0gMSwgdGVzdGJveC50b3AoKSAgICArICgwIC0gdmlhQm94LmJvdHRvbSgpKSAtIDEpOwotICB9Ci0KLSAgRmxleE1hemVJZHggbUlkeDE7Ci0gIEZsZXhNYXplSWR4IG1JZHgyOwotICBncmlkR3JhcGguZ2V0SWR4Qm94KG1JZHgxLCBtSWR4MiwgYngpOyAvLyA+PSBieAotICAKLSAgZm9yIChpbnQgaSA9IG1JZHgxLngoKTsgaSA8PSBtSWR4Mi54KCk7IGkrKykgewotICAgIGZvciAoaW50IGogPSBtSWR4MS55KCk7IGogPD0gbUlkeDIueSgpOyBqKyspIHsKLSAgICAgIGlmICh0eXBlID09IDApIHsKLSAgICAgICAgaWYgKGlzQWRkUGF0aENvc3QpIHsKLSAgICAgICAgICBncmlkR3JhcGguYWRkRFJDQ29zdFBsYW5hcihpLCBqLCB6KTsgLy8gc2FmZSBhY2Nlc3MKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBncmlkR3JhcGguc3ViRFJDQ29zdFBsYW5hcihpLCBqLCB6KTsgLy8gc2FmZSBhY2Nlc3MKLSAgICAgICAgfQotICAgICAgICBpZiAoVEVTVCkgewotICAgICAgICAgIGNvdXQgPDwiICAgICgiIDw8aSA8PCIsICIgPDxqIDw8IiwgIiA8PHogPDwiKSBOIGVvbFNwYyIgPDxlbmRsOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gMSkgewotICAgICAgICAvL2lmIChncmlkR3JhcGguaXNTVmlhKGksIGosIHogLSAxKSkgewotICAgICAgICAvLyAgY29udGludWU7Ci0gICAgICAgIC8vfQotICAgICAgICBpZiAoaXNBZGRQYXRoQ29zdCkgewotICAgICAgICAgIGdyaWRHcmFwaC5hZGREUkNDb3N0VmlhKGksIGosIHogLSAxKTsgLy8gc2FmZSBhY2Nlc3MKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBncmlkR3JhcGguc3ViRFJDQ29zdFZpYShpLCBqLCB6IC0gMSk7IC8vIHNhZmUgYWNjZXNzCi0gICAgICAgIH0KLSAgICAgICAgaWYgKFRFU1QpIHsKLSAgICAgICAgICBjb3V0IDw8IiAgICAoIiA8PGkgPDwiLCAiIDw8aiA8PCIsICIgPDx6IC0gMSA8PCIpIFUgZW9sU3BjIiA8PGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSAyKSB7Ci0gICAgICAgIC8vaWYgKGdyaWRHcmFwaC5pc1NWaWEoaSwgaiwgeikpIHsKLSAgICAgICAgLy8gIGNvbnRpbnVlOwotICAgICAgICAvL30KLSAgICAgICAgaWYgKGlzQWRkUGF0aENvc3QpIHsKLSAgICAgICAgICBncmlkR3JhcGguYWRkRFJDQ29zdFZpYShpLCBqLCB6KTsgLy8gc2FmZSBhY2Nlc3MKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBncmlkR3JhcGguc3ViRFJDQ29zdFZpYShpLCBqLCB6KTsgLy8gc2FmZSBhY2Nlc3MKLSAgICAgICAgfQotICAgICAgICBpZiAoVEVTVCkgewotICAgICAgICAgIGNvdXQgPDwiICAgICgiIDw8aSA8PCIsICIgPDxqIDw8IiwgIiA8PHogPDwiKSBVIGVvbFNwYyIgPDxlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8qaW5saW5lKi8gdm9pZCBGbGV4RFJXb3JrZXI6Om1vZEVvbFNwYWNpbmdDb3N0KGNvbnN0IGZyQm94ICZib3gsIGZyTUlkeCB6LCBib29sIGlzQWRkUGF0aENvc3QpIHsKLSAgYXV0byBsTnVtID0gZ3JpZEdyYXBoLmdldExheWVyTnVtKHopOwotICBmckJveCB0ZXN0Qm94OwotICBpZiAoZ2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0TGF5ZXIobE51bSktPmhhc0VvbFNwYWNpbmcoKSkgewotICAgIGZvciAoYXV0byBjb246IGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldExheWVyKGxOdW0pLT5nZXRFb2xTcGFjaW5nKCkpIHsKLSAgICAgIGF1dG8gZW9sU3BhY2UgID0gY29uLT5nZXRNaW5TcGFjaW5nKCk7Ci0gICAgICBhdXRvIGVvbFdpZHRoICA9IGNvbi0+Z2V0RW9sV2lkdGgoKTsKLSAgICAgIGF1dG8gZW9sV2l0aGluID0gY29uLT5nZXRFb2xXaXRoaW4oKTsKLSAgICAgIC8vIGN1cnIgb2JqIHRvIG90aGVyIG9iaiBlb2wKLSAgICAgIC8vaWYgKCFpc0luaXREUigpKSB7Ci0gICAgICAvLyAgY291dCA8PCJlb2xTcGFjZS93aXRoaW4gPSAiIDw8ZW9sU3BhY2UgPDwiICIgPDxlb2xXaXRoaW4gPDxlbmRsOwotICAgICAgLy99Ci0gICAgICAvLyBlb2wgdG8gdXAgYW5kIGRvd24KLSAgICAgIGlmIChib3gucmlnaHQoKSAtIGJveC5sZWZ0KCkgPCBlb2xXaWR0aCkgewotICAgICAgICB0ZXN0Qm94LnNldChib3gubGVmdCgpIC0gZW9sV2l0aGluLCBib3gudG9wKCksICAgICAgICAgICAgICAgYm94LnJpZ2h0KCkgKyBlb2xXaXRoaW4sIGJveC50b3AoKSArIGVvbFNwYWNlKTsKLSAgICAgICAgLy9pZiAoIWlzSW5pdERSKCkpIHsKLSAgICAgICAgLy8gIGNvdXQgPDwiICB0b3BCb3ggIiA8PHRlc3RCb3ggPDxlbmRsOwotICAgICAgICAvL30KLSAgICAgICAgbW9kRW9sU3BhY2luZ0Nvc3RfaGVscGVyKHRlc3RCb3gsIHosIGlzQWRkUGF0aENvc3QsIDApOwotICAgICAgICBtb2RFb2xTcGFjaW5nQ29zdF9oZWxwZXIodGVzdEJveCwgeiwgaXNBZGRQYXRoQ29zdCwgMSk7Ci0gICAgICAgIG1vZEVvbFNwYWNpbmdDb3N0X2hlbHBlcih0ZXN0Qm94LCB6LCBpc0FkZFBhdGhDb3N0LCAyKTsKLSAgICAgICAgdGVzdEJveC5zZXQoYm94LmxlZnQoKSAtIGVvbFdpdGhpbiwgYm94LmJvdHRvbSgpIC0gZW9sU3BhY2UsIGJveC5yaWdodCgpICsgZW9sV2l0aGluLCBib3guYm90dG9tKCkpOwotICAgICAgICAvL2lmICghaXNJbml0RFIoKSkgewotICAgICAgICAvLyAgY291dCA8PCIgIGJvdHRvbUJveCAiIDw8dGVzdEJveCA8PGVuZGw7Ci0gICAgICAgIC8vfQotICAgICAgICBtb2RFb2xTcGFjaW5nQ29zdF9oZWxwZXIodGVzdEJveCwgeiwgaXNBZGRQYXRoQ29zdCwgMCk7Ci0gICAgICAgIG1vZEVvbFNwYWNpbmdDb3N0X2hlbHBlcih0ZXN0Qm94LCB6LCBpc0FkZFBhdGhDb3N0LCAxKTsKLSAgICAgICAgbW9kRW9sU3BhY2luZ0Nvc3RfaGVscGVyKHRlc3RCb3gsIHosIGlzQWRkUGF0aENvc3QsIDIpOwotICAgICAgfQotICAgICAgLy8gZW9sIHRvIGxlZnQgYW5kIHJpZ2h0Ci0gICAgICBpZiAoYm94LnRvcCgpIC0gYm94LmJvdHRvbSgpIDwgZW9sV2lkdGgpIHsKLSAgICAgICAgdGVzdEJveC5zZXQoYm94LnJpZ2h0KCksICAgICAgICAgICBib3guYm90dG9tKCkgLSBlb2xXaXRoaW4sIGJveC5yaWdodCgpICsgZW9sU3BhY2UsIGJveC50b3AoKSArIGVvbFdpdGhpbik7Ci0gICAgICAgIC8vaWYgKCFpc0luaXREUigpKSB7Ci0gICAgICAgIC8vICBjb3V0IDw8IiAgcmlnaHRCb3ggIiA8PHRlc3RCb3ggPDxlbmRsOwotICAgICAgICAvL30KLSAgICAgICAgbW9kRW9sU3BhY2luZ0Nvc3RfaGVscGVyKHRlc3RCb3gsIHosIGlzQWRkUGF0aENvc3QsIDApOwotICAgICAgICBtb2RFb2xTcGFjaW5nQ29zdF9oZWxwZXIodGVzdEJveCwgeiwgaXNBZGRQYXRoQ29zdCwgMSk7Ci0gICAgICAgIG1vZEVvbFNwYWNpbmdDb3N0X2hlbHBlcih0ZXN0Qm94LCB6LCBpc0FkZFBhdGhDb3N0LCAyKTsKLSAgICAgICAgdGVzdEJveC5zZXQoYm94LmxlZnQoKSAtIGVvbFNwYWNlLCBib3guYm90dG9tKCkgLSBlb2xXaXRoaW4sIGJveC5sZWZ0KCksICAgICAgICAgICAgIGJveC50b3AoKSArIGVvbFdpdGhpbik7Ci0gICAgICAgIC8vaWYgKCFpc0luaXREUigpKSB7Ci0gICAgICAgIC8vICBjb3V0IDw8IiAgbGVmdEJveCAiIDw8dGVzdEJveCA8PGVuZGw7Ci0gICAgICAgIC8vfQotICAgICAgICBtb2RFb2xTcGFjaW5nQ29zdF9oZWxwZXIodGVzdEJveCwgeiwgaXNBZGRQYXRoQ29zdCwgMCk7Ci0gICAgICAgIG1vZEVvbFNwYWNpbmdDb3N0X2hlbHBlcih0ZXN0Qm94LCB6LCBpc0FkZFBhdGhDb3N0LCAxKTsKLSAgICAgICAgbW9kRW9sU3BhY2luZ0Nvc3RfaGVscGVyKHRlc3RCb3gsIHosIGlzQWRkUGF0aENvc3QsIDIpOwotICAgICAgfQotICAgICAgLy8gb3RoZXIgb2JqIHRvIGN1cnIgb2JqIGVvbAotICAgIH0KLSAgfQotfQotCi0vKmlubGluZSovIHZvaWQgRmxleERSV29ya2VyOjptb2RDdXRTcGFjaW5nQ29zdChjb25zdCBmckJveCAmYm94LCBmck1JZHggeiwgYm9vbCBpc0FkZFBhdGhDb3N0KSB7Ci0gIGF1dG8gbE51bSA9IGdyaWRHcmFwaC5nZXRMYXllck51bSh6KSArIDE7Ci0gIGlmICghZ2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0TGF5ZXIobE51bSktPmhhc0N1dFNwYWNpbmcoKSkgewotICAgIHJldHVybjsKLSAgfQotICAvLyBvYmoxID0gY3VyciBvYmoKLSAgLy8gb2JqMiA9IG90aGVyIG9iagotICAvLyBkZWZhdWx0IHZpYSBkaW1lbnNpb24KLSAgZnJWaWFEZWYqIHZpYURlZiA9IGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldExheWVyKGxOdW0pLT5nZXREZWZhdWx0VmlhRGVmKCk7Ci0gIGZyVmlhIHZpYSh2aWFEZWYpOwotICBmckJveCB2aWFCb3goMCwwLDAsMCk7Ci0gIHZpYS5nZXRDdXRCQm94KHZpYUJveCk7Ci0KLSAgLy8gc3BhY2luZyB2YWx1ZSBuZWVkZWQKLSAgZnJDb29yZCBibG9hdERpc3QgPSAwOwotICBmb3IgKGF1dG8gY29uOiBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihsTnVtKS0+Z2V0Q3V0U3BhY2luZygpKSB7Ci0gICAgYmxvYXREaXN0ID0gbWF4KGJsb2F0RGlzdCwgY29uLT5nZXRDdXRTcGFjaW5nKCkpOwotICB9Ci0gIC8vZnJDb29yZCBibG9hdERpc3RTcXVhcmUgPSBibG9hdERpc3QgKiBibG9hdERpc3Q7Ci0gIAotICBGbGV4TWF6ZUlkeCBtSWR4MTsKLSAgRmxleE1hemVJZHggbUlkeDI7Ci0gIC8vIGFzc3VtZXMgd2lkdGggYWx3YXlzID4gMgotICBmckJveCBieChib3gubGVmdCgpICAgLSBibG9hdERpc3QgLSAodmlhQm94LnJpZ2h0KCkgLSAwKSArIDEsIAotICAgICAgICAgICBib3guYm90dG9tKCkgLSBibG9hdERpc3QgLSAodmlhQm94LnRvcCgpIC0gMCkgKyAxLAotICAgICAgICAgICBib3gucmlnaHQoKSAgKyBibG9hdERpc3QgKyAoMCAtIHZpYUJveC5sZWZ0KCkpICAtIDEsIAotICAgICAgICAgICBib3gudG9wKCkgICAgKyBibG9hdERpc3QgKyAoMCAtIHZpYUJveC5ib3R0b20oKSkgLSAxKTsKLSAgZ3JpZEdyYXBoLmdldElkeEJveChtSWR4MSwgbUlkeDIsIGJ4KTsKLQotICBmclBvaW50IHB0OwotICBmckJveCB0bXBCeDsKLSAgZnJDb29yZCBkaXN0U3F1YXJlID0gMDsKLSAgZnJDb29yZCBjMmNTcXVhcmUgPSAwOwotICBmckNvb3JkIGR4LCBkeSwgcHJsOwotICBmclRyYW5zZm9ybSB4Zm9ybTsKLSAgLy9mckNvb3JkIHJlcURpc3QgPSAwOwotICBmckNvb3JkIHJlcURpc3RTcXVhcmUgPSAwOwotICBmclBvaW50IGJveENlbnRlciwgdG1wQnhDZW50ZXI7Ci0gIGJveENlbnRlci5zZXQoKGJveC5sZWZ0KCkgKyBib3gucmlnaHQoKSkgLyAyLCAoYm94LmJvdHRvbSgpICsgYm94LnRvcCgpKSAvIDIpOwotICBmckNvb3JkIGN1cnJEaXN0U3F1YXJlID0gMDsKLSAgYm9vbCBoYXNWaW9sID0gZmFsc2U7Ci0gIGZvciAoaW50IGkgPSBtSWR4MS54KCk7IGkgPD0gbUlkeDIueCgpOyBpKyspIHsKLSAgICBmb3IgKGludCBqID0gbUlkeDEueSgpOyBqIDw9IG1JZHgyLnkoKTsgaisrKSB7Ci0gICAgICBmb3IgKGF1dG8gJnVGaWc6IHZpYS5nZXRWaWFEZWYoKS0+Z2V0Q3V0RmlncygpKSB7Ci0gICAgICAgIGF1dG8gb2JqID0gc3RhdGljX2Nhc3Q8ZnJSZWN0Kj4odUZpZy5nZXQoKSk7Ci0gICAgICAgIGdyaWRHcmFwaC5nZXRQb2ludChwdCwgaSwgaik7Ci0gICAgICAgIHhmb3JtLnNldChwdCk7Ci0gICAgICAgIG9iai0+Z2V0QkJveCh0bXBCeCk7Ci0gICAgICAgIC8vdG1wQnguc2V0KHZpYUJveCk7Ci0gICAgICAgIHRtcEJ4LnRyYW5zZm9ybSh4Zm9ybSk7Ci0gICAgICAgIHRtcEJ4Q2VudGVyLnNldCgodG1wQngubGVmdCgpICsgdG1wQngucmlnaHQoKSkgLyAyLCAodG1wQnguYm90dG9tKCkgKyB0bXBCeC50b3AoKSkgLyAyKTsKLSAgICAgICAgZGlzdFNxdWFyZSA9IGJveDJib3hEaXN0U3F1YXJlKGJveCwgdG1wQngsIGR4LCBkeSk7Ci0gICAgICAgIGMyY1NxdWFyZSA9IChib3hDZW50ZXIueCgpIC0gdG1wQnhDZW50ZXIueCgpKSAqIChib3hDZW50ZXIueCgpIC0gdG1wQnhDZW50ZXIueCgpKSArIAotICAgICAgICAgICAgICAgICAgICAoYm94Q2VudGVyLnkoKSAtIHRtcEJ4Q2VudGVyLnkoKSkgKiAoYm94Q2VudGVyLnkoKSAtIHRtcEJ4Q2VudGVyLnkoKSk7IAotICAgICAgICBwcmwgPSBtYXgoZHgsIGR5KTsKLSAgICAgICAgZm9yIChhdXRvIGNvbjogZ2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0TGF5ZXIobE51bSktPmdldEN1dFNwYWNpbmcoKSkgewotICAgICAgICAgIGhhc1Zpb2wgPSBmYWxzZTsKLSAgICAgICAgICAvL3JlcURpc3QgPSBjb24tPmdldEN1dFNwYWNpbmcoKTsKLSAgICAgICAgICByZXFEaXN0U3F1YXJlID0gY29uLT5nZXRDdXRTcGFjaW5nKCkgKiBjb24tPmdldEN1dFNwYWNpbmcoKTsKLSAgICAgICAgICBjdXJyRGlzdFNxdWFyZSA9IGNvbi0+aGFzQ2VudGVyVG9DZW50ZXIoKSA/IGMyY1NxdWFyZSA6IGRpc3RTcXVhcmU7Ci0gICAgICAgICAgaWYgKGNvbi0+aGFzU2FtZU5ldCgpKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGNvbi0+aXNMYXllcigpKSB7Ci0gICAgICAgICAgICA7Ci0gICAgICAgICAgfSBlbHNlIGlmIChjb24tPmlzQWRqYWNlbnRDdXRzKCkpIHsKLSAgICAgICAgICAgIGlmIChjdXJyRGlzdFNxdWFyZSA8IHJlcURpc3RTcXVhcmUpIHsKLSAgICAgICAgICAgICAgaGFzVmlvbCA9IHRydWU7Ci0gICAgICAgICAgICAgIC8vIHNob3VsZCBkaXNhYmxlIGhhc1Zpb2wgYW5kIG1vZGlmeSB0aGlzIHBhcnQgdG8gbmV3IGdyaWQgZ3JhcGgKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgaWYgKGNvbi0+aXNQYXJhbGxlbE92ZXJsYXAoKSkgewotICAgICAgICAgICAgaWYgKHBybCA+IDAgJiYgY3VyckRpc3RTcXVhcmUgPCByZXFEaXN0U3F1YXJlKSB7Ci0gICAgICAgICAgICAgIGhhc1Zpb2wgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSBpZiAoY29uLT5pc0FyZWEoKSkgewotICAgICAgICAgICAgYXV0byBjdXJyQXJlYSA9IG1heChib3gubGVuZ3RoKCkgKiBib3gud2lkdGgoKSwgdG1wQngubGVuZ3RoKCkgKiB0bXBCeC53aWR0aCgpKTsKLSAgICAgICAgICAgIGlmIChjdXJyQXJlYSA+PSBjb24tPmdldEN1dEFyZWEoKSAmJiBjdXJyRGlzdFNxdWFyZSA8IHJlcURpc3RTcXVhcmUpIHsKLSAgICAgICAgICAgICAgaGFzVmlvbCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChjdXJyRGlzdFNxdWFyZSA8IHJlcURpc3RTcXVhcmUpIHsKLSAgICAgICAgICAgICAgaGFzVmlvbCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChoYXNWaW9sKSB7Ci0gICAgICAgICAgICBpZiAoaXNBZGRQYXRoQ29zdCkgewotICAgICAgICAgICAgICBncmlkR3JhcGguYWRkRFJDQ29zdFZpYShpLCBqLCB6KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGdyaWRHcmFwaC5zdWJEUkNDb3N0VmlhKGksIGosIHopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFRFU1QpIHsKLSAgICAgICAgICAgICAgY291dCA8PCIgICAgKCIgPDxpIDw8IiwgIiA8PGogPDwiLCAiIDw8eiA8PCIpIFUgY3V0U3BjIiA8PGVuZGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBGbGV4RFJXb3JrZXI6OmFkZFBhdGhDb3N0KGRyQ29ubkZpZyAqY29ubkZpZykgewotICBtb2RQYXRoQ29zdChjb25uRmlnLCB0cnVlKTsKLX0KLQotdm9pZCBGbGV4RFJXb3JrZXI6OnN1YlBhdGhDb3N0KGRyQ29ubkZpZyAqY29ubkZpZykgewotICBtb2RQYXRoQ29zdChjb25uRmlnLCBmYWxzZSk7Ci19Ci0KLS8qaW5saW5lKi8gdm9pZCBGbGV4RFJXb3JrZXI6Om1vZFBhdGhDb3N0KGRyQ29ubkZpZyAqY29ubkZpZywgYm9vbCBpc0FkZFBhdGhDb3N0KSB7Ci0gIGlmIChjb25uRmlnLT50eXBlSWQoKSA9PSBkcmNQYXRoU2VnKSB7Ci0gICAgYXV0byBvYmogPSBzdGF0aWNfY2FzdDxkclBhdGhTZWcqPihjb25uRmlnKTsKLSAgICBhdXRvIG5ldCA9IG9iai0+Z2V0TmV0KCk7Ci0gICAgRmxleE1hemVJZHggYmksIGVpOwotICAgIG9iai0+Z2V0TWF6ZUlkeChiaSwgZWkpOwotICAgIGlmIChURVNUKSB7Ci0gICAgICBjb3V0IDw8IiAgIjsKLSAgICAgIGlmIChpc0FkZFBhdGhDb3N0KSB7Ci0gICAgICAgIGNvdXQgPDwiYWRkIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwic3ViIjsKLSAgICAgIH0KLSAgICAgIGNvdXQgPDwiUHNDb3N0IGZvciAiIDw8YmkgPDwiIC0tICIgPDxlaSA8PGVuZGw7Ci0gICAgfQotICAgIC8vIG5ldyAKLSAgICBmckJveCBib3g7Ci0gICAgb2JqLT5nZXRCQm94KGJveCk7Ci0gICAgCi0gICAgbW9kTWluU3BhY2luZ0Nvc3RQbGFuZXIobmV0LCBib3gsIGJpLnooKSwgaXNBZGRQYXRoQ29zdCk7Ci0gICAgbW9kTWluU3BhY2luZ0Nvc3RWaWEoYm94LCBiaS56KCksIGlzQWRkUGF0aENvc3QsIHRydWUsICB0cnVlKTsKLSAgICBtb2RNaW5TcGFjaW5nQ29zdFZpYShib3gsIGJpLnooKSwgaXNBZGRQYXRoQ29zdCwgZmFsc2UsIHRydWUpOwotICAgIC8vbW9kTWluU3BhY2luZ0Nvc3QobmV0LCBib3gsIGJpLnooKSwgaXNBZGRQYXRoQ29zdCwgdHJ1ZSk7Ci0gICAgbW9kRW9sU3BhY2luZ0Nvc3QoYm94LCBiaS56KCksIGlzQWRkUGF0aENvc3QpOwotICB9IGVsc2UgaWYgKGNvbm5GaWctPnR5cGVJZCgpID09IGRyY1BhdGNoV2lyZSkgewotICAgIGF1dG8gb2JqID0gc3RhdGljX2Nhc3Q8ZHJQYXRjaFdpcmUqPihjb25uRmlnKTsKLSAgICBhdXRvIG5ldCA9IG9iai0+Z2V0TmV0KCk7Ci0gICAgZnJNSWR4IHpJZHggPSBncmlkR3JhcGguZ2V0TWF6ZVpJZHgob2JqLT5nZXRMYXllck51bSgpKTsKLSAgICAvLyBGbGV4TWF6ZUlkeCBiaSwgZWk7Ci0gICAgLy8gb2JqLT5nZXRNYXplSWR4KGJpLCBlaSk7Ci0gICAgLy8gaWYgKFRFU1QpIHsKLSAgICAvLyAgIGNvdXQgPDwiICAiOwotICAgIC8vICAgaWYgKGlzQWRkUGF0aENvc3QpIHsKLSAgICAvLyAgICAgY291dCA8PCJhZGQiOwotICAgIC8vICAgfSBlbHNlIHsKLSAgICAvLyAgICAgY291dCA8PCJzdWIiOwotICAgIC8vICAgfQotICAgIC8vICAgY291dCA8PCJQc0Nvc3QgZm9yICIgPDxiaSA8PCIgLS0gIiA8PGVpIDw8ZW5kbDsKLSAgICAvLyB9Ci0gICAgLy8gbmV3IAotICAgIGZyQm94IGJveDsKLSAgICBvYmotPmdldEJCb3goYm94KTsKLSAgICAKLSAgICBtb2RNaW5TcGFjaW5nQ29zdFBsYW5lcihuZXQsIGJveCwgeklkeCwgaXNBZGRQYXRoQ29zdCk7Ci0gICAgbW9kTWluU3BhY2luZ0Nvc3RWaWEoYm94LCB6SWR4LCBpc0FkZFBhdGhDb3N0LCB0cnVlLCAgdHJ1ZSk7Ci0gICAgbW9kTWluU3BhY2luZ0Nvc3RWaWEoYm94LCB6SWR4LCBpc0FkZFBhdGhDb3N0LCBmYWxzZSwgdHJ1ZSk7Ci0gICAgLy9tb2RNaW5TcGFjaW5nQ29zdChuZXQsIGJveCwgYmkueigpLCBpc0FkZFBhdGhDb3N0LCB0cnVlKTsKLSAgICBtb2RFb2xTcGFjaW5nQ29zdChib3gsIHpJZHgsIGlzQWRkUGF0aENvc3QpOwotICB9IGVsc2UgaWYgKGNvbm5GaWctPnR5cGVJZCgpID09IGRyY1ZpYSkgewotICAgIGF1dG8gb2JqID0gc3RhdGljX2Nhc3Q8ZHJWaWEqPihjb25uRmlnKTsKLSAgICBhdXRvIG5ldCA9IG9iai0+Z2V0TmV0KCk7Ci0gICAgRmxleE1hemVJZHggYmksIGVpOwotICAgIG9iai0+Z2V0TWF6ZUlkeChiaSwgZWkpOwotICAgIGlmIChURVNUKSB7Ci0gICAgICBjb3V0IDw8IiAgIjsKLSAgICAgIGlmIChpc0FkZFBhdGhDb3N0KSB7Ci0gICAgICAgIGNvdXQgPDwiYWRkIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwic3ViIjsKLSAgICAgIH0KLSAgICAgIGNvdXQgPDwiVmlhQ29zdCBmb3IgIiA8PGJpIDw8IiAtLSAiIDw8ZWkgPDxlbmRsOwotICAgIH0KLSAgICAvLyBuZXcKLSAgICAKLSAgICBmckJveCBib3g7Ci0gICAgb2JqLT5nZXRMYXllcjFCQm94KGJveCk7IC8vIGFzc3VtZXMgZW5jbG9zdXJlIGZvciB2aWEgaXMgYWx3YXlzIHJlY3RhbmdsZQotCi0gICAgbW9kTWluU3BhY2luZ0Nvc3RQbGFuZXIobmV0LCBib3gsIGJpLnooKSwgaXNBZGRQYXRoQ29zdCk7Ci0gICAgbW9kTWluU3BhY2luZ0Nvc3RWaWEoYm94LCBiaS56KCksIGlzQWRkUGF0aENvc3QsIHRydWUsICBmYWxzZSk7Ci0gICAgbW9kTWluU3BhY2luZ0Nvc3RWaWEoYm94LCBiaS56KCksIGlzQWRkUGF0aENvc3QsIGZhbHNlLCBmYWxzZSk7Ci0gICAgLy9tb2RNaW5TcGFjaW5nQ29zdChuZXQsIGJveCwgYmkueigpLCBpc0FkZFBhdGhDb3N0LCBmYWxzZSk7Ci0gICAgbW9kRW9sU3BhY2luZ0Nvc3QoYm94LCBiaS56KCksIGlzQWRkUGF0aENvc3QpOwotICAgIAotICAgIG9iai0+Z2V0TGF5ZXIyQkJveChib3gpOyAvLyBhc3N1bWVzIGVuY2xvc3VyZSBmb3IgdmlhIGlzIGFsd2F5cyByZWN0YW5nbGUKLQotICAgIG1vZE1pblNwYWNpbmdDb3N0UGxhbmVyKG5ldCwgYm94LCBlaS56KCksIGlzQWRkUGF0aENvc3QpOwotICAgIG1vZE1pblNwYWNpbmdDb3N0VmlhKGJveCwgZWkueigpLCBpc0FkZFBhdGhDb3N0LCB0cnVlLCAgZmFsc2UpOwotICAgIG1vZE1pblNwYWNpbmdDb3N0VmlhKGJveCwgZWkueigpLCBpc0FkZFBhdGhDb3N0LCBmYWxzZSwgZmFsc2UpOwotICAgIC8vbW9kTWluU3BhY2luZ0Nvc3QobmV0LCBib3gsIGVpLnooKSwgaXNBZGRQYXRoQ29zdCwgZmFsc2UpOwotICAgIG1vZEVvbFNwYWNpbmdDb3N0KGJveCwgZWkueigpLCBpc0FkZFBhdGhDb3N0KTsKLQotICAgIC8vb2JqLT5nZXRDdXRCQm94KGJveCk7Ci0gICAgZnJUcmFuc2Zvcm0geGZvcm07Ci0gICAgZnJQb2ludCBwdDsKLSAgICBvYmotPmdldE9yaWdpbihwdCk7Ci0gICAgeGZvcm0uc2V0KHB0KTsKLSAgICBmb3IgKGF1dG8gJnVGaWc6IG9iai0+Z2V0VmlhRGVmKCktPmdldEN1dEZpZ3MoKSkgewotICAgICAgLy9pZiAodUZpZy0+dHlwZUlkKCkgPT0gZnJjUmVjdCkgewotICAgICAgICBhdXRvIHJlY3QgPSBzdGF0aWNfY2FzdDxmclJlY3QqPih1RmlnLmdldCgpKTsKLSAgICAgICAgcmVjdC0+Z2V0QkJveChib3gpOwotICAgICAgICBib3gudHJhbnNmb3JtKHhmb3JtKTsKLSAgICAgICAgbW9kQ3V0U3BhY2luZ0Nvc3QoYm94LCBiaS56KCksIGlzQWRkUGF0aENvc3QpOwotICAgICAgLy99Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgRmxleERSV29ya2VyOjptYXplSXRlckluaXRfc29ydFJlcm91dGVOZXRzKHZlY3Rvcjxkck5ldCo+ICZyZXJvdXRlTmV0cykgewotICAvLyBzb3J0Ci0gIHNvcnQocmVyb3V0ZU5ldHMuYmVnaW4oKSwgcmVyb3V0ZU5ldHMuZW5kKCksIAotICAgICAgIFtdKGRyTmV0KiBjb25zdCAmYSwgZHJOZXQqIGNvbnN0ICZiKSB7Ci0gICAgICAgZnJCb3ggYm94QSwgYm94QjsKLSAgICAgICBhLT5nZXRQaW5Cb3goYm94QSk7Ci0gICAgICAgYi0+Z2V0UGluQm94KGJveEIpOwotICAgICAgIGF1dG8gYXJlYUEgPSAoYm94QS5yaWdodCgpIC0gYm94QS5sZWZ0KCkpICogKGJveEEudG9wKCkgLSBib3hBLmJvdHRvbSgpKTsKLSAgICAgICBhdXRvIGFyZWFCID0gKGJveEIucmlnaHQoKSAtIGJveEIubGVmdCgpKSAqIChib3hCLnRvcCgpIC0gYm94Qi5ib3R0b20oKSk7Ci0gICAgICAgcmV0dXJuIChhLT5nZXROdW1QaW5zSW4oKSA9PSBiLT5nZXROdW1QaW5zSW4oKSA/IChhcmVhQSA9PSBhcmVhQiA/IGEtPmdldElkKCkgPCBiLT5nZXRJZCgpIDogYXJlYUEgPCBhcmVhQikgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+Z2V0TnVtUGluc0luKCkgPCBiLT5nZXROdW1QaW5zSW4oKSk7Ci0gICAgICAgfSk7Ci19Ci0KLXZvaWQgRmxleERSV29ya2VyOjptYXplSXRlckluaXRfaW5pdERSKHZlY3Rvcjxkck5ldCo+ICZyZXJvdXRlTmV0cykgewotICBmb3IgKGF1dG8gJm5ldDogbmV0cykgewotICAgIHJlcm91dGVOZXRzLnB1c2hfYmFjayhuZXQuZ2V0KCkpOwotICB9Ci0gIG1hemVJdGVySW5pdF9zb3J0UmVyb3V0ZU5ldHMocmVyb3V0ZU5ldHMpOwotICBmb3IgKGF1dG8gJm5ldDogcmVyb3V0ZU5ldHMpIHsKLSAgICBuZXQtPnNldE1vZGlmaWVkKHRydWUpOwotICAgIG5ldC0+c2V0TnVtTWFya2VycygwKTsKLSAgICAvLyBhZGQgdmlhIGFjY2VzcyBjb3N0IHdoZW4gbmV0IGlzIG5vdCByb3V0ZWQKLSAgICBpZiAoUkVTRVJWRV9WSUFfQUNDRVNTKSB7Ci0gICAgICBpbml0TWF6ZUNvc3RfdmlhX2hlbHBlcihuZXQsIHRydWUpOwotICAgIH0KLSAgICAvL25ldC0+Y2xlYXIoKTsKLSAgfQotfQotCi0vLyB0ZW1wb3Jhcnkgc2V0dGluZ3MgdG8gdGVzdCBzZWFyY2ggYW5kIHJlcGFpcgotdm9pZCBGbGV4RFJXb3JrZXI6Om1hemVJdGVySW5pdF9zZWFyY2hSZXBhaXIodmVjdG9yPGRyTmV0Kj4gJnJlcm91dGVOZXRzKSB7Ci0gIGF1dG8gJndvcmtlclJlZ2lvblF1ZXJ5ID0gZ2V0V29ya2VyUmVnaW9uUXVlcnkoKTsKLSAgaW50IGNudCA9IDA7Ci0gIGlmIChnZXRSaXB1cE1vZGUoKSA9PSAwKSB7Ci0gICAgZm9yIChhdXRvICZuZXQ6IG5ldHMpIHsKLSAgICAgIGlmIChuZXQtPmlzUmlwdXAoKSkgewotICAgICAgICByZXJvdXRlTmV0cy5wdXNoX2JhY2sobmV0LmdldCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSBpZiAoZ2V0UmlwdXBNb2RlKCkgPT0gMSkgewotICAgIGZvciAoYXV0byAmbmV0OiBuZXRzKSB7Ci0gICAgICByZXJvdXRlTmV0cy5wdXNoX2JhY2sobmV0LmdldCgpKTsKLSAgICB9Ci0gIH0KLSAgLy8gY2hhbmdlIHRoZSBkck5ldCBtYWdpY2FsIHNvcnRpbmcgYml0IGhlcmUKLSAgLy8gdG8gZG8KLSAgLy9zb3J0KHJlcm91dGVOZXRzLmJlZ2luKCksIHJlcm91dGVOZXRzLmVuZCgpLCAKLSAgLy8gICAgIFtdKGRyTmV0KiBjb25zdCAmYSwgZHJOZXQqIGNvbnN0ICZiKSB7cmV0dXJuICphIDwgKmI7fSk7Ci0gIG1hemVJdGVySW5pdF9zb3J0UmVyb3V0ZU5ldHMocmVyb3V0ZU5ldHMpOwotICBmb3IgKGF1dG8gJm5ldDogcmVyb3V0ZU5ldHMpIHsKLSAgICBuZXQtPnNldE1vZGlmaWVkKHRydWUpOwotICAgIG5ldC0+c2V0TnVtTWFya2VycygwKTsKLSAgICBmb3IgKGF1dG8gJnVDb25uRmlnOiBuZXQtPmdldFJvdXRlQ29ubkZpZ3MoKSkgewotICAgICAgc3ViUGF0aENvc3QodUNvbm5GaWcuZ2V0KCkpOwotICAgICAgd29ya2VyUmVnaW9uUXVlcnkucmVtb3ZlKHVDb25uRmlnLmdldCgpKTsgLy8gd29ya2VyIHJlZ2lvbiBxdWVyeQotICAgICAgY250Kys7Ci0gICAgfQotICAgIC8vIGFkZCB2aWEgYWNjZXNzIGNvc3Qgd2hlbiBuZXQgaXMgbm90IHJvdXRlZAotICAgIGlmIChSRVNFUlZFX1ZJQV9BQ0NFU1MpIHsKLSAgICAgIGluaXRNYXplQ29zdF92aWFfaGVscGVyKG5ldCwgdHJ1ZSk7Ci0gICAgfQotICAgIG5ldC0+Y2xlYXIoKTsKLSAgfQotICAvL2NvdXQgPDwic3Igc3ViICIgPDxjbnQgPDwiIGNvbm5maWcgY29zdHMiIDw8ZW5kbDsKLX0KLQotdm9pZCBGbGV4RFJXb3JrZXI6Om1hemVJdGVySW5pdCh2ZWN0b3I8ZHJOZXQqPiAmcmVyb3V0ZU5ldHMpIHsKLSAgaW5pdE1hemVDb3N0X21hcmtlcigpOwotICBpZiAoaXNJbml0RFIoKSkgewotICAgIG1hemVJdGVySW5pdF9pbml0RFIocmVyb3V0ZU5ldHMpOwotICB9IGVsc2UgewotICAgIG1hemVJdGVySW5pdF9zZWFyY2hSZXBhaXIocmVyb3V0ZU5ldHMpOwotICB9Ci19Ci0KLXZvaWQgRmxleERSV29ya2VyOjptYXplTmV0SW5pdChkck5ldCogbmV0KSB7Ci0gIGdyaWRHcmFwaC5yZXNldFN0YXR1cygpOwotICAvLyBzdWIgdmlhIGFjY2VzcyBjb3N0IHdoZW4gbmV0IGlzIGFib3V0IHRvIHJvdXRlCi0gIGlmIChSRVNFUlZFX1ZJQV9BQ0NFU1MpIHsKLSAgICBpbml0TWF6ZUNvc3RfdmlhX2hlbHBlcihuZXQsIGZhbHNlKTsKLSAgfQotICBpbml0TWF6ZUNvc3RfYXBfaGVscGVyKG5ldCwgZmFsc2UpOwotICBpbml0TWF6ZUNvc3RfYm91bmRhcnlfaGVscGVyKG5ldCwgZmFsc2UpOwotfQotCi12b2lkIEZsZXhEUldvcmtlcjo6bWF6ZU5ldEVuZChkck5ldCogbmV0KSB7Ci0gIGluaXRNYXplQ29zdF9hcF9oZWxwZXIobmV0LCB0cnVlKTsKLSAgaW5pdE1hemVDb3N0X2JvdW5kYXJ5X2hlbHBlcihuZXQsIHRydWUpOwotfQotCi12b2lkIEZsZXhEUldvcmtlcjo6cm91dGVfZHJjKCkgewotICBEUkNXb3JrZXIgZHJjV29ya2VyKGdldERlc2lnbigpLCBmaXhlZE9ianMpOwotICBkcmNXb3JrZXIuYWRkRFJOZXRzKG5ldHMpOwotICB1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm87Ci0gIGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6dGltZV9wb2ludCB0MCA9IGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7Ci0gIGRyY1dvcmtlci5pbml0KCk7Ci0gIGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6dGltZV9wb2ludCB0MSA9IGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7Ci0gIGRyY1dvcmtlci5zZXR1cCgpOwotICBoaWdoX3Jlc29sdXRpb25fY2xvY2s6OnRpbWVfcG9pbnQgdDIgPSBoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwotICBkcmNXb3JrZXIubWFpbigpOwotICBzZXRNYXJrZXJzKGRyY1dvcmtlci5nZXRWaW9sYXRpb25zKCkpOwotICBoaWdoX3Jlc29sdXRpb25fY2xvY2s6OnRpbWVfcG9pbnQgdDMgPSBoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwotICAvL2RyY1dvcmtlci5yZXBvcnQoKTsKLSAgCi0gIGR1cmF0aW9uPGRvdWJsZT4gdGltZV9zcGFuMCA9IGR1cmF0aW9uX2Nhc3Q8ZHVyYXRpb248ZG91YmxlPj4odDEgLSB0MCk7Ci0KLSAgZHVyYXRpb248ZG91YmxlPiB0aW1lX3NwYW4xID0gZHVyYXRpb25fY2FzdDxkdXJhdGlvbjxkb3VibGU+Pih0MiAtIHQxKTsKLQotICBkdXJhdGlvbjxkb3VibGU+IHRpbWVfc3BhbjIgPSBkdXJhdGlvbl9jYXN0PGR1cmF0aW9uPGRvdWJsZT4+KHQzIC0gdDIpOwotICBpZiAoVkVSQk9TRSA+IDEpIHsKLSAgICBzdHJpbmdzdHJlYW0gc3M7Ci0gICAgc3MgICA8PCJEUkMgIChJTklUL1NFVFVQL01BSU4pICIgPDx0aW1lX3NwYW4wLmNvdW50KCkgPDwiICIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PHRpbWVfc3BhbjEuY291bnQoKSA8PCIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDx0aW1lX3NwYW4yLmNvdW50KCkgPDwiICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ZW5kbDsKLSAgICBzcyA8PCIjdmlvbCA9ICIgPDxtYXJrZXJzLnNpemUoKSA8PGVuZGw7Ci0gICAgY291dCA8PHNzLnN0cigpIDw8Zmx1c2g7Ci0gIH0KLX0KLQotdm9pZCBGbGV4RFJXb3JrZXI6OnJvdXRlX3Bvc3RSb3V0ZVZpYVN3YXAoKSB7Ci0gIGF1dG8gJndvcmtlclJlZ2lvblF1ZXJ5ID0gZ2V0V29ya2VyUmVnaW9uUXVlcnkoKTsKLSAgc2V0PEZsZXhNYXplSWR4PiBtb2RpZmllZFZpYUlkeDsKLSAgZnJCb3ggYm94OwotICB2ZWN0b3I8ZHJDb25uRmlnKj4gcmVzdWx0czsKLSAgZnJQb2ludCBicDsKLSAgRmxleE1hemVJZHggYmksIGVpOwotICBib29sIGZsYWcgPSBmYWxzZTsKLSAgZm9yIChhdXRvICZtYXJrZXI6IGdldE1hcmtlcnMoKSkgewotICAgIHJlc3VsdHMuY2xlYXIoKTsKLSAgICBtYXJrZXIuZ2V0QkJveChib3gpOwotICAgIGF1dG8gbE51bSA9IG1hcmtlci5nZXRMYXllck51bSgpOwotICAgIHdvcmtlclJlZ2lvblF1ZXJ5LnF1ZXJ5KGJveCwgbE51bSwgcmVzdWx0cyk7Ci0gICAgZm9yIChhdXRvICZjb25uRmlnOiByZXN1bHRzKSB7Ci0gICAgICBpZiAoY29ubkZpZy0+dHlwZUlkKCkgPT0gZHJjVmlhKSB7Ci0gICAgICAgIGF1dG8gb2JqID0gc3RhdGljX2Nhc3Q8ZHJWaWEqPihjb25uRmlnKTsKLSAgICAgICAgb2JqLT5nZXRNYXplSWR4KGJpLCBlaSk7Ci0gICAgICAgIGF1dG8gaXQgPSBhcFNWaWEuZmluZChiaSk7Ci0gICAgICAgIGlmIChtb2RpZmllZFZpYUlkeC5maW5kKGJpKSA9PSBtb2RpZmllZFZpYUlkeC5lbmQoKSAmJiBpdCAhPSBhcFNWaWEuZW5kKCkpIHsKLSAgICAgICAgICBhdXRvIGFwID0gaXQtPnNlY29uZDsKLSAgICAgICAgICBpZiAoYXAtPm5leHRBY2Nlc3NWaWFEZWYoKSkgewotICAgICAgICAgICAgYXV0byBuZXdWaWFEZWYgPSBhcC0+Z2V0QWNjZXNzVmlhRGVmKCk7Ci0gICAgICAgICAgICB3b3JrZXJSZWdpb25RdWVyeS5yZW1vdmUob2JqKTsKLSAgICAgICAgICAgIG9iai0+c2V0VmlhRGVmKG5ld1ZpYURlZik7Ci0gICAgICAgICAgICB3b3JrZXJSZWdpb25RdWVyeS5hZGQob2JqKTsKLSAgICAgICAgICAgIG1vZGlmaWVkVmlhSWR4Lmluc2VydChiaSk7Ci0gICAgICAgICAgICBmbGFnID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgaWYgKGZsYWcpIHsKLSAgICByb3V0ZV9kcmMoKTsKLSAgfQotfQotCi12b2lkIEZsZXhEUldvcmtlcjo6cm91dGUoKSB7Ci0gIC8vYm9vbCBlbmFibGVPdXRwdXQgPSB0cnVlOwotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgY291dCA8PCAic3RhcnQgTWF6ZSByb3V0ZSAjbmV0cyA9ICIgPDxuZXRzLnNpemUoKSA8PGVuZGw7Ci0gIH0KLSAgaWYgKGlzRW5hYmxlRFJDKCkgJiYgZ2V0UmlwdXBNb2RlKCkgPT0gMCAmJiBnZXRJbml0TnVtTWFya2VycygpID09IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKERSQ1RFU1QpIHsKLSAgICBEUkNXb3JrZXIgZHJjV29ya2VyKGdldERlc2lnbigpLCBmaXhlZE9ianMpOwotICAgIGRyY1dvcmtlci5hZGREUk5ldHMobmV0cyk7Ci0gICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vOwotICAgIGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6dGltZV9wb2ludCB0MCA9IGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7Ci0gICAgZHJjV29ya2VyLmluaXQoKTsKLSAgICBoaWdoX3Jlc29sdXRpb25fY2xvY2s6OnRpbWVfcG9pbnQgdDEgPSBoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwotICAgIGRyY1dvcmtlci5zZXR1cCgpOwotICAgIGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6dGltZV9wb2ludCB0MiA9IGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7Ci0gICAgZHJjV29ya2VyLm1haW4oKTsKLSAgICBoaWdoX3Jlc29sdXRpb25fY2xvY2s6OnRpbWVfcG9pbnQgdDMgPSBoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwotICAgIGRyY1dvcmtlci5yZXBvcnQoKTsKLSAgICAKLSAgICBkdXJhdGlvbjxkb3VibGU+IHRpbWVfc3BhbjAgPSBkdXJhdGlvbl9jYXN0PGR1cmF0aW9uPGRvdWJsZT4+KHQxIC0gdDApOwotCi0gICAgZHVyYXRpb248ZG91YmxlPiB0aW1lX3NwYW4xID0gZHVyYXRpb25fY2FzdDxkdXJhdGlvbjxkb3VibGU+Pih0MiAtIHQxKTsKLQotICAgIGR1cmF0aW9uPGRvdWJsZT4gdGltZV9zcGFuMiA9IGR1cmF0aW9uX2Nhc3Q8ZHVyYXRpb248ZG91YmxlPj4odDMgLSB0Mik7Ci0gICAgc3RyaW5nc3RyZWFtIHNzOwotICAgIHNzICAgPDwidGltZSAoSU5JVC9TRVRVUC9NQUlOKSAiIDw8dGltZV9zcGFuMC5jb3VudCgpIDw8IiAiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8dGltZV9zcGFuMS5jb3VudCgpIDw8IiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDx0aW1lX3NwYW4yLmNvdW50KCkgPDwiICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PGVuZGw7Ci0gICAgY291dCA8PHNzLnN0cigpIDw8Zmx1c2g7Ci0KLQotICB9IGVsc2UgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF6ZUVuZEl0ZXI7ICsraSkgewotICAgICAgdmVjdG9yPGRyTmV0Kj4gcmVyb3V0ZU5ldHM7Ci0gICAgICBtYXplSXRlckluaXQocmVyb3V0ZU5ldHMpOwotICAgICAgbWluQXJlYVZpb3MuY2xlYXIoKTsKLSAgICAgIC8vaWYgKGkgPT0gMCkgewotICAgICAgLy8gIHdvcmtlckRSQ0Nvc3QgICAgPSBEUkNDT1NUOwotICAgICAgLy8gIHdvcmtlck1hcmtlckNvc3QgPSBNQVJLRVJDT1NUOwotICAgICAgLy99IGVsc2UgewotICAgICAgLy8gIHdvcmtlckRSQ0Nvc3QgKj0gMjsKLSAgICAgIC8vICB3b3JrZXJNYXJrZXJDb3N0ICo9IDI7Ci0gICAgICAvL30KLSAgICAgIGZvciAoYXV0byBuZXQ6IHJlcm91dGVOZXRzKSB7Ci0gICAgICAgIC8vZm9yIChhdXRvICZwaW46IG5ldC0+Z2V0UGlucygpKSB7Ci0gICAgICAgIC8vICBmb3IgKGF1dG8gJmFwOiApCi0gICAgICAgIG1hemVOZXRJbml0KG5ldCk7Ci0gICAgICAgIGJvb2wgaXNSb3V0ZWQgPSByb3V0ZU5ldChuZXQpOwotICAgICAgICBpZiAoaXNSb3V0ZWQgPT0gZmFsc2UpIHsKLSAgICAgICAgICAvLyBUT0RPOiBvdXRwdXQgbWF6ZSBhcmVhCi0gICAgICAgICAgY291dCA8PCAiRmF0YWwgZXJyb3I6IE1hemUgUm91dGUgY2Fubm90IGZpbmQgcGF0aC4gQ29ubmVjdGl2aXR5IENoYW5nZWQuXG4iOwotICAgICAgICAgIGlmIChPVVRfTUFaRV9GSUxFICE9IHN0cmluZygiIikpIHsKLSAgICAgICAgICAgIGdyaWRHcmFwaC5wcmludCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0gICAgICAgIG1hemVOZXRFbmQobmV0KTsKLSAgICAgIH0KLSAgICAgIC8vIGRyYyB3b3JrZXIgaGVyZQotICAgICAgaWYgKGlzRW5hYmxlRFJDKCkpIHsKLSAgICAgICAgcm91dGVfZHJjKCk7Ci0gICAgICAgIHJvdXRlX3Bvc3RSb3V0ZVZpYVN3YXAoKTsKLSAgICAgIH0KLQotICAgICAgLy8gc2F2ZSB0byBiZXN0IGRyYwotICAgICAgaWYgKGkgPT0gMCB8fCAoaXNFbmFibGVEUkMoKSAmJiBnZXRNYXJrZXJzKCkuc2l6ZSgpIDwgZ2V0QmVzdE1hcmtlcnMoKS5zaXplKCkpKSB7Ci0gICAgICAgIGZvciAoYXV0byAmbmV0OiBuZXRzKSB7Ci0gICAgICAgICAgbmV0LT5zZXRCZXN0Um91dGVDb25uRmlncygpOwotICAgICAgICB9Ci0gICAgICAgIHNldEJlc3RNYXJrZXJzKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIHF1aWNrIGRyYwotICAgICAgaW50IHZpb2xOdW0gPSBnZXROdW1RdWlja01hcmtlcnMoKTsKLSAgICAgIGlmIChWRVJCT1NFID4gMSkgewotICAgICAgICBjb3V0IDw8IiNxdWljayB2aW9sID0gIiA8PGdldE51bVF1aWNrTWFya2VycygpIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIGlmIChpc0VuYWJsZURSQygpICYmIGdldE1hcmtlcnMoKS5lbXB0eSgpKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSBlbHNlIGlmICh2aW9sTnVtID09IDApIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgRmxleERSV29ya2VyOjpyb3V0ZU5ldF9wcmVwKGRyTmV0KiBuZXQsIHNldDxkclBpbiosIGZyQmxvY2tPYmplY3RDb21wPiAmdW5Db25uUGlucywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8RmxleE1hemVJZHgsIHNldDxkclBpbiosIGZyQmxvY2tPYmplY3RDb21wPiA+ICZtYXplSWR4MnVuQ29ublBpbnMvKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxGbGV4TWF6ZUlkeCwgZnJWaWFEZWYqPiAmYXBTVmlhKi8pIHsKLSAgZm9yIChhdXRvICZwaW46IG5ldC0+Z2V0UGlucygpKSB7Ci0gICAgdW5Db25uUGlucy5pbnNlcnQocGluLmdldCgpKTsKLSAgICBmb3IgKGF1dG8gJmFwOiBwaW4tPmdldEFjY2Vzc1BhdHRlcm5zKCkpIHsKLSAgICAgIEZsZXhNYXplSWR4IG1pOwotICAgICAgYXAtPmdldE1hemVJZHgobWkpOwotICAgICAgbWF6ZUlkeDJ1bkNvbm5QaW5zW21pXS5pbnNlcnQocGluLmdldCgpKTsKLSAgICAgIGdyaWRHcmFwaC5zZXREc3QobWkpOwotICAgIH0KLSAgfQotfQotCi12b2lkIEZsZXhEUldvcmtlcjo6cm91dGVOZXRfc2V0U3JjKHNldDxkclBpbiosIGZyQmxvY2tPYmplY3RDb21wPiAmdW5Db25uUGlucywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxGbGV4TWF6ZUlkeCwgc2V0PGRyUGluKiwgZnJCbG9ja09iamVjdENvbXA+ID4gJm1hemVJZHgydW5Db25uUGlucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPEZsZXhNYXplSWR4PiAmY29ubkNvbXBzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxleE1hemVJZHggJmNjTWF6ZUlkeDEsIEZsZXhNYXplSWR4ICZjY01hemVJZHgyKSB7Ci0gIGZyTUlkeCB4RGltLCB5RGltLCB6RGltOwotICBncmlkR3JhcGguZ2V0RGltKHhEaW0sIHlEaW0sIHpEaW0pOwotICBjY01hemVJZHgxLnNldCh4RGltIC0gMSwgeURpbSAtIDEsIHpEaW0gLSAxKTsKLSAgY2NNYXplSWR4Mi5zZXQoMCwgMCwgMCk7Ci0gIC8vIGZpcnN0IHBpbiBzZWxlY3Rpb24gYWxnb3JpdGhtIGdvZXMgaGVyZQotICAvLyBjaG9vc2UgdGhlIGNlbnRlciBwaW4KLSAgaW50IHRvdEFQQ250ID0gMDsKLSAgZnJDb29yZCB0b3RYID0gMDsKLSAgZnJDb29yZCB0b3RZID0gMDsKLSAgZnJDb29yZCB0b3RaID0gMDsKLSAgRmxleE1hemVJZHggbWk7Ci0gIGZyUG9pbnQgYnA7Ci0gIGZvciAoYXV0byAmcGluOiB1bkNvbm5QaW5zKSB7Ci0gICAgZm9yIChhdXRvICZhcDogcGluLT5nZXRBY2Nlc3NQYXR0ZXJucygpKSB7Ci0gICAgICBhcC0+Z2V0TWF6ZUlkeChtaSk7Ci0gICAgICBhcC0+Z2V0UG9pbnQoYnApOwotICAgICAgdG90WCArPSBicC54KCk7Ci0gICAgICB0b3RZICs9IGJwLnkoKTsKLSAgICAgIHRvdFogKz0gZ3JpZEdyYXBoLmdldFpIZWlnaHQobWkueigpKTsKLSAgICAgIHRvdEFQQ250Kys7Ci0gICAgfQotICB9Ci0gIHRvdFggLz0gdG90QVBDbnQ7Ci0gIHRvdFkgLz0gdG90QVBDbnQ7Ci0gIHRvdFogLz0gdG90QVBDbnQ7Ci0KLSAgZnJDb29yZCBjdXJyRGlzdCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZnJDb29yZD46Om1heCgpOwotICBkclBpbiogY3VyclBpbiA9IG51bGxwdHI7Ci0gIGZvciAoYXV0byAmcGluOiB1bkNvbm5QaW5zKSB7Ci0gICAgZm9yIChhdXRvICZhcDogcGluLT5nZXRBY2Nlc3NQYXR0ZXJucygpKSB7Ci0gICAgICBhcC0+Z2V0TWF6ZUlkeChtaSk7Ci0gICAgICBhcC0+Z2V0UG9pbnQoYnApOwotICAgICAgZnJDb29yZCBkaXN0ID0gYWJzKHRvdFggLSBicC54KCkpICsgYWJzKHRvdFkgLSBicC55KCkpICsgYWJzKHRvdFogLSBncmlkR3JhcGguZ2V0WkhlaWdodChtaS56KCkpKTsKLSAgICAgIGlmIChkaXN0IDwgY3VyckRpc3QpIHsKLSAgICAgICAgY3VyckRpc3QgPSBkaXN0OwotICAgICAgICBjdXJyUGluICA9IHBpbjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgdW5Db25uUGlucy5lcmFzZShjdXJyUGluKTsKLQotICAvL2F1dG8gY3VyclBpbiA9ICoodW5Db25uUGlucy5iZWdpbigpKTsKLSAgLy91bkNvbm5QaW5zLmVyYXNlKHVuQ29ublBpbnMuYmVnaW4oKSk7Ci0gIC8vIGZpcnN0IHBpbiBzZWxlY3Rpb24gYWxnb3JpdGhtIGVuZHMgaGVyZQotICBmb3IgKGF1dG8gJmFwOiBjdXJyUGluLT5nZXRBY2Nlc3NQYXR0ZXJucygpKSB7Ci0gICAgYXAtPmdldE1hemVJZHgobWkpOwotICAgIGNvbm5Db21wcy5wdXNoX2JhY2sobWkpOwotICAgIGNjTWF6ZUlkeDEuc2V0KG1pbihjY01hemVJZHgxLngoKSwgbWkueCgpKSwKLSAgICAgICAgICAgICAgICAgICBtaW4oY2NNYXplSWR4MS55KCksIG1pLnkoKSksCi0gICAgICAgICAgICAgICAgICAgbWluKGNjTWF6ZUlkeDEueigpLCBtaS56KCkpKTsKLSAgICBjY01hemVJZHgyLnNldChtYXgoY2NNYXplSWR4Mi54KCksIG1pLngoKSksCi0gICAgICAgICAgICAgICAgICAgbWF4KGNjTWF6ZUlkeDIueSgpLCBtaS55KCkpLAotICAgICAgICAgICAgICAgICAgIG1heChjY01hemVJZHgyLnooKSwgbWkueigpKSk7Ci0gICAgYXV0byBpdCA9IG1hemVJZHgydW5Db25uUGlucy5maW5kKG1pKTsKLSAgICBpZiAoaXQgPT0gbWF6ZUlkeDJ1bkNvbm5QaW5zLmVuZCgpKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgYXV0byBpdDIgPSBpdC0+c2Vjb25kLmZpbmQoY3VyclBpbik7Ci0gICAgaWYgKGl0MiA9PSBpdC0+c2Vjb25kLmVuZCgpKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaXQtPnNlY29uZC5lcmFzZShpdDIpOwotCi0gICAgZ3JpZEdyYXBoLnNldFNyYyhtaSk7Ci0gICAgLy8gcmVtb3ZlIGRzdCBsYWJlbCBvbmx5IHdoZW4gbm8gb3RoZXIgcGlucyBzaGFyZSB0aGUgc2FtZSBsb2MKLSAgICBpZiAoaXQtPnNlY29uZC5lbXB0eSgpKSB7Ci0gICAgICBtYXplSWR4MnVuQ29ublBpbnMuZXJhc2UoaXQpOwotICAgICAgZ3JpZEdyYXBoLnJlc2V0RHN0KG1pKTsKLSAgICB9Ci0gIH0KLQotfQotCi1kclBpbiogRmxleERSV29ya2VyOjpyb3V0ZU5ldF9nZXROZXh0RHN0KEZsZXhNYXplSWR4ICZjY01hemVJZHgxLCBGbGV4TWF6ZUlkeCAmY2NNYXplSWR4MiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxGbGV4TWF6ZUlkeCwgc2V0PGRyUGluKiwgZnJCbG9ja09iamVjdENvbXA+ID4gJm1hemVJZHgydW5Db25uUGlucykgewotICBmclBvaW50IHB0OwotICBmclBvaW50IGxsLCB1cjsKLSAgZ3JpZEdyYXBoLmdldFBvaW50KGxsLCBjY01hemVJZHgxLngoKSwgY2NNYXplSWR4MS55KCkpOwotICBncmlkR3JhcGguZ2V0UG9pbnQodXIsIGNjTWF6ZUlkeDIueCgpLCBjY01hemVJZHgyLnkoKSk7Ci0gIGZyQ29vcmQgY3VyckRpc3QgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGZyQ29vcmQ+OjptYXgoKTsKLSAgZHJQaW4qIG5leHREc3QgPSBudWxscHRyOwotICBmb3IgKGF1dG8gJlttYXplSWR4LCBzZXRTXTogbWF6ZUlkeDJ1bkNvbm5QaW5zKSB7Ci0gICAgZ3JpZEdyYXBoLmdldFBvaW50KHB0LCBtYXplSWR4LngoKSwgbWF6ZUlkeC55KCkpOwotICAgIGZyQ29vcmQgZHggPSBtYXgobWF4KGxsLngoKSAtIHB0LngoKSwgcHQueCgpIC0gdXIueCgpKSwgMCk7Ci0gICAgZnJDb29yZCBkeSA9IG1heChtYXgobGwueSgpIC0gcHQueSgpLCBwdC55KCkgLSB1ci55KCkpLCAwKTsKLSAgICBmckNvb3JkIGR6ID0gbWF4KG1heChncmlkR3JhcGguZ2V0WkhlaWdodChjY01hemVJZHgxLnooKSkgLSBncmlkR3JhcGguZ2V0WkhlaWdodChtYXplSWR4LnooKSksIAotICAgICAgICAgICAgICAgICAgICAgICAgIGdyaWRHcmFwaC5nZXRaSGVpZ2h0KG1hemVJZHgueigpKSAtIGdyaWRHcmFwaC5nZXRaSGVpZ2h0KGNjTWF6ZUlkeDIueigpKSksIDApOwotICAgIGlmIChkeCArIGR5ICsgZHogPCBjdXJyRGlzdCkgewotICAgICAgY3VyckRpc3QgPSBkeCArIGR5ICsgZHo7Ci0gICAgICBuZXh0RHN0ID0gKihzZXRTLmJlZ2luKCkpOwotICAgIH0KLSAgICBpZiAoY3VyckRpc3QgPT0gMCkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiBuZXh0RHN0OwotfQotCi12b2lkIEZsZXhEUldvcmtlcjo6bWF6ZVBpbkluaXQoKSB7Ci0gIGdyaWRHcmFwaC5yZXNldFByZXZOb2RlRGlyKCk7Ci19Ci0KLXZvaWQgRmxleERSV29ya2VyOjpyb3V0ZU5ldF9wb3N0QXN0YXJVcGRhdGUodmVjdG9yPEZsZXhNYXplSWR4PiAmcGF0aCwgdmVjdG9yPEZsZXhNYXplSWR4PiAmY29ubkNvbXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ8ZHJQaW4qLCBmckJsb2NrT2JqZWN0Q29tcD4gJnVuQ29ublBpbnMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8RmxleE1hemVJZHgsIHNldDxkclBpbiosIGZyQmxvY2tPYmplY3RDb21wPiA+ICZtYXplSWR4MnVuQ29ublBpbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNGaXJzdENvbm4pIHsKLSAgLy8gZmlyc3QgcG9pbnQgaXMgZHN0Ci0gIHNldDxGbGV4TWF6ZUlkeD4gbG9jYWxDb25uQ29tcHM7Ci0gIGlmICghcGF0aC5lbXB0eSgpKSB7Ci0gICAgYXV0byBtaSA9IHBhdGhbMF07Ci0gICAgdmVjdG9yPGRyUGluKj4gdG1wUGluczsKLSAgICBmb3IgKGF1dG8gcGluOiBtYXplSWR4MnVuQ29ublBpbnNbbWldKSB7Ci0gICAgICAvL3VuQ29ublBpbnMuZXJhc2UocGluKTsKLSAgICAgIHRtcFBpbnMucHVzaF9iYWNrKHBpbik7Ci0gICAgfQotICAgIGZvciAoYXV0byBwaW46IHRtcFBpbnMpIHsKLSAgICAgIHVuQ29ublBpbnMuZXJhc2UocGluKTsKLSAgICAgIGZvciAoYXV0byAmYXA6IHBpbi0+Z2V0QWNjZXNzUGF0dGVybnMoKSkgewotICAgICAgICBGbGV4TWF6ZUlkeCBtaTsKLSAgICAgICAgYXAtPmdldE1hemVJZHgobWkpOwotICAgICAgICBhdXRvIGl0ID0gbWF6ZUlkeDJ1bkNvbm5QaW5zLmZpbmQobWkpOwotICAgICAgICBpZiAoaXQgPT0gbWF6ZUlkeDJ1bkNvbm5QaW5zLmVuZCgpKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgYXV0byBpdDIgPSBpdC0+c2Vjb25kLmZpbmQocGluKTsKLSAgICAgICAgaWYgKGl0MiA9PSBpdC0+c2Vjb25kLmVuZCgpKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaXQtPnNlY29uZC5lcmFzZShpdDIpOwotICAgICAgICBpZiAoaXQtPnNlY29uZC5lbXB0eSgpKSB7Ci0gICAgICAgICAgbWF6ZUlkeDJ1bkNvbm5QaW5zLmVyYXNlKGl0KTsKLSAgICAgICAgICBncmlkR3JhcGgucmVzZXREc3QobWkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChBTExPV19QSU5fQVNfRkVFRFRIUk9VR0gpIHsKLSAgICAgICAgICBsb2NhbENvbm5Db21wcy5pbnNlcnQobWkpOwotICAgICAgICAgIGdyaWRHcmFwaC5zZXRTcmMobWkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgewotICAgIGNvdXQgPDwiRXJyb3I6IHJvdXRlTmV0X3Bvc3RBc3RhclVwZGF0ZSBwYXRoIGlzIGVtcHR5IiA8PGVuZGw7Ci0gIH0KLSAgLy8gbXVzdCBiZSBiZWZvcmUgY29tbWVudCBsaW5lIEFCQyBzbyB0aGF0IHRoZSB1c2VkIGFjdHVhbCBzcmMgaXMgc2V0IGluIGdyaWRncmFwaAotICBpZiAoaXNGaXJzdENvbm4gJiYgKCFBTExPV19QSU5fQVNfRkVFRFRIUk9VR0gpKSB7Ci0gICAgZm9yIChhdXRvICZtaTogY29ubkNvbXBzKSB7Ci0gICAgICBncmlkR3JhcGgucmVzZXRTcmMobWkpOwotICAgIH0KLSAgICBjb25uQ29tcHMuY2xlYXIoKTsKLSAgICBpZiAoKGludClwYXRoLnNpemUoKSA9PSAxKSB7Ci0gICAgICBjb25uQ29tcHMucHVzaF9iYWNrKHBhdGhbMF0pOwotICAgICAgZ3JpZEdyYXBoLnNldFNyYyhwYXRoWzBdKTsKLSAgICB9Ci0gIH0KLSAgLy8gbGluZSBBQkMKLSAgLy8gbXVzdCBoYXZlID4wIGxlbmd0aAotICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpcGF0aC5zaXplKCkgLSAxOyArK2kpIHsKLSAgICBhdXRvIHN0YXJ0ID0gcGF0aFtpXTsKLSAgICBhdXRvIGVuZCA9IHBhdGhbaSArIDFdOwotICAgIGF1dG8gc3RhcnRYID0gc3RhcnQueCgpLCBzdGFydFkgPSBzdGFydC55KCksIHN0YXJ0WiA9IHN0YXJ0LnooKTsKLSAgICBhdXRvIGVuZFggPSBlbmQueCgpLCBlbmRZID0gZW5kLnkoKSwgZW5kWiA9IGVuZC56KCk7Ci0gICAgLy8gaG9yaXpvbnRhbCB3aXJlCi0gICAgaWYgKHN0YXJ0WCAhPSBlbmRYICYmIHN0YXJ0WSA9PSBlbmRZICYmIHN0YXJ0WiA9PSBlbmRaKSB7Ci0gICAgICBmb3IgKGF1dG8gY3VyclggPSBzdGQ6Om1pbihzdGFydFgsIGVuZFgpOyBjdXJyWCA8PSBzdGQ6Om1heChzdGFydFgsIGVuZFgpOyArK2N1cnJYKSB7Ci0gICAgICAgIGxvY2FsQ29ubkNvbXBzLmluc2VydChGbGV4TWF6ZUlkeChjdXJyWCwgc3RhcnRZLCBzdGFydFopKTsKLSAgICAgICAgZ3JpZEdyYXBoLnNldFNyYyhjdXJyWCwgc3RhcnRZLCBzdGFydFopOwotICAgICAgICAvL2dyaWRHcmFwaC5yZXNldERzdChjdXJyWCwgc3RhcnRZLCBzdGFydFopOwotICAgICAgfQotICAgIC8vIHZlcnRpY2FsIHdpcmUKLSAgICB9IGVsc2UgaWYgKHN0YXJ0WCA9PSBlbmRYICYmIHN0YXJ0WSAhPSBlbmRZICYmIHN0YXJ0WiA9PSBlbmRaKSB7Ci0gICAgICBmb3IgKGF1dG8gY3VyclkgPSBzdGQ6Om1pbihzdGFydFksIGVuZFkpOyBjdXJyWSA8PSBzdGQ6Om1heChzdGFydFksIGVuZFkpOyArK2N1cnJZKSB7Ci0gICAgICAgIGxvY2FsQ29ubkNvbXBzLmluc2VydChGbGV4TWF6ZUlkeChzdGFydFgsIGN1cnJZLCBzdGFydFopKTsKLSAgICAgICAgZ3JpZEdyYXBoLnNldFNyYyhzdGFydFgsIGN1cnJZLCBzdGFydFopOwotICAgICAgICAvL2dyaWRHcmFwaC5yZXNldERzdChzdGFydFgsIGN1cnJZLCBzdGFydFopOwotICAgICAgfQotICAgIC8vIHZpYQotICAgIH0gZWxzZSBpZiAoc3RhcnRYID09IGVuZFggJiYgc3RhcnRZID09IGVuZFkgJiYgc3RhcnRaICE9IGVuZFopIHsKLSAgICAgIGZvciAoYXV0byBjdXJyWiA9IHN0ZDo6bWluKHN0YXJ0WiwgZW5kWik7IGN1cnJaIDw9IHN0ZDo6bWF4KHN0YXJ0WiwgZW5kWik7ICsrY3VyclopIHsKLSAgICAgICAgbG9jYWxDb25uQ29tcHMuaW5zZXJ0KEZsZXhNYXplSWR4KHN0YXJ0WCwgc3RhcnRZLCBjdXJyWikpOwotICAgICAgICBncmlkR3JhcGguc2V0U3JjKHN0YXJ0WCwgc3RhcnRZLCBjdXJyWik7Ci0gICAgICAgIC8vZ3JpZEdyYXBoLnJlc2V0RHN0KHN0YXJ0WCwgc3RhcnRZLCBjdXJyWik7Ci0gICAgICB9Ci0gICAgLy8gemVybyBsZW5ndGgKLSAgICB9IGVsc2UgaWYgKHN0YXJ0WCA9PSBlbmRYICYmIHN0YXJ0WSA9PSBlbmRZICYmIHN0YXJ0WiA9PSBlbmRaKSB7Ci0gICAgICAvL3Jvb3QuYWRkUGluR3JpZChzdGFydFgsIHN0YXJ0WSwgc3RhcnRaKTsKLSAgICAgIHN0ZDo6Y291dCA8PCAiV2FybmluZzogemVyby1sZW5ndGggcGF0aCBpbiB1cGRhdGVGbGV4UGluXG4iOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdGQ6OmNvdXQgPDwgIkVycm9yOiBub24tY29saW5lYXIgcGF0aCBpbiB1cGRhdGVGbGV4UGluXG4iOwotICAgIH0KLSAgfQotICBmb3IgKGF1dG8gJm1pOiBsb2NhbENvbm5Db21wcykgewotICAgIGlmIChpc0ZpcnN0Q29ubiAmJiAhQUxMT1dfUElOX0FTX0ZFRURUSFJPVUdIKSB7Ci0gICAgICBjb25uQ29tcHMucHVzaF9iYWNrKG1pKTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKCEobWkgPT0gKihwYXRoLmNiZWdpbigpKSkpIHsKLSAgICAgICAgY29ubkNvbXBzLnB1c2hfYmFjayhtaSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgRmxleERSV29ya2VyOjpyb3V0ZU5ldF9wb3N0QXN0YXJXcml0ZVBhdGgoZHJOZXQqIG5ldCwgdmVjdG9yPEZsZXhNYXplSWR4PiAmcG9pbnRzLyosIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXA8RmxleE1hemVJZHgsIGZyVmlhRGVmKj4gJmFwU1ZpYSovKSB7Ci0gIC8vYm9vbCBlbmFibGVPdXRwdXQgPSB0cnVlOwotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICBpZiAocG9pbnRzLmVtcHR5KCkpIHsKLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBzdGQ6OmNvdXQgPDwgIldhcm5pbmc6IHBhdGggaXMgZW1wdHkgaW4gd3JpdGVNYXplUGF0aFxuIjsKLSAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChURVNUICYmIHBvaW50cy5zaXplKCkpIHsKLSAgICBjb3V0IDw8InBhdGgiOwotICAgIGZvciAoYXV0byAmbUlkeDogcG9pbnRzKSB7Ci0gICAgICBjb3V0IDw8IiAoIiA8PG1JZHgueCgpIDw8IiwgIiA8PG1JZHgueSgpIDw8IiwgIiA8PG1JZHgueigpIDw8IikiOwotICAgIH0KLSAgICBjb3V0IDw8ZW5kbDsKLSAgfQotICBhdXRvICZ3b3JrZXJSZWdpb25RdWVyeSA9IGdldFdvcmtlclJlZ2lvblF1ZXJ5KCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClwb2ludHMuc2l6ZSgpIC0gMTsgKytpKSB7Ci0gICAgRmxleE1hemVJZHggc3RhcnQsIGVuZDsKLSAgICBpZiAocG9pbnRzW2kgKyAxXSA8IHBvaW50c1tpXSkgewotICAgICAgc3RhcnQgPSBwb2ludHNbaSArIDFdOwotICAgICAgZW5kID0gcG9pbnRzW2ldOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdGFydCA9IHBvaW50c1tpXTsKLSAgICAgIGVuZCA9IHBvaW50c1tpICsgMV07Ci0gICAgfQotICAgIGF1dG8gc3RhcnRYID0gc3RhcnQueCgpLCBzdGFydFkgPSBzdGFydC55KCksIHN0YXJ0WiA9IHN0YXJ0LnooKTsKLSAgICBhdXRvIGVuZFggPSBlbmQueCgpLCBlbmRZID0gZW5kLnkoKSwgZW5kWiA9IGVuZC56KCk7Ci0gICAgLy8gaG9yaXpvbnRhbCB3aXJlCi0gICAgaWYgKHN0YXJ0WCAhPSBlbmRYICYmIHN0YXJ0WSA9PSBlbmRZICYmIHN0YXJ0WiA9PSBlbmRaKSB7Ci0gICAgICBmclBvaW50IHN0YXJ0TG9jLCBlbmRMb2M7Ci0gICAgICBmckxheWVyTnVtIGN1cnJMYXllck51bSA9IGdyaWRHcmFwaC5nZXRMYXllck51bShzdGFydFopOwotICAgICAgZ3JpZEdyYXBoLmdldFBvaW50KHN0YXJ0TG9jLCBzdGFydFgsIHN0YXJ0WSk7Ci0gICAgICBncmlkR3JhcGguZ2V0UG9pbnQoZW5kTG9jLCBlbmRYLCBlbmRZKTsKLSAgICAgIGF1dG8gY3VyclBhdGhTZWcgPSBtYWtlX3VuaXF1ZTxkclBhdGhTZWc+KCk7Ci0gICAgICBjdXJyUGF0aFNlZy0+c2V0UG9pbnRzKHN0YXJ0TG9jLCBlbmRMb2MpOwotICAgICAgY3VyclBhdGhTZWctPnNldExheWVyTnVtKGN1cnJMYXllck51bSk7Ci0gICAgICBjdXJyUGF0aFNlZy0+YWRkVG9OZXQobmV0KTsKLSAgICAgIGN1cnJQYXRoU2VnLT5zZXRTdHlsZShnZXRUZWNoKCktPmdldExheWVyKGN1cnJMYXllck51bSktPmdldERlZmF1bHRTZWdTdHlsZSgpKTsKLSAgICAgIGN1cnJQYXRoU2VnLT5zZXRNYXplSWR4KHN0YXJ0LCBlbmQpOwotICAgICAgdW5pcXVlX3B0cjxkckNvbm5GaWc+IHRtcChzdGQ6Om1vdmUoY3VyclBhdGhTZWcpKTsKLSAgICAgIHdvcmtlclJlZ2lvblF1ZXJ5LmFkZCh0bXAuZ2V0KCkpOwotICAgICAgbmV0LT5hZGRSb3V0ZSh0bXApOwotICAgICAgLy8gcXVpY2sgZHJjIGNudAotICAgICAgYm9vbCBwcmV2SGFzQ29zdCA9IGZhbHNlOwotICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0WDsgaSA8IGVuZFg7IGkrKykgewotICAgICAgICBpZiAoZ3JpZEdyYXBoLmhhc0RSQ0Nvc3QoaSwgc3RhcnRZLCBzdGFydFosIGZyRGlyRW51bTo6RSkpIHsKLSAgICAgICAgICBpZiAoIXByZXZIYXNDb3N0KSB7Ci0gICAgICAgICAgICBuZXQtPmFkZE1hcmtlcigpOwotICAgICAgICAgICAgcHJldkhhc0Nvc3QgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoVEVTVCkgewotICAgICAgICAgICAgY291dCA8PCIgcGFzcyBtYXJrZXIgQCgiIDw8aSA8PCIsICIgPDxzdGFydFkgPDwiLCAiIDw8c3RhcnRaIDw8IikgRSIgPDxlbmRsOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBwcmV2SGFzQ29zdCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiIHdyaXRlIGhvcnogcGF0aHNlZyAoIiAKLSAgICAgICAgICAgICA8PHN0YXJ0TG9jLngoKSAqIDEuMCAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpIDw8IiwgIiAKLSAgICAgICAgICAgICA8PHN0YXJ0TG9jLnkoKSAqIDEuMCAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpIDw8IikgKCIgCi0gICAgICAgICAgICAgPDxlbmRMb2MueCgpICAgKiAxLjAgLyBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0REJVUGVyVVUoKSA8PCIsICIgCi0gICAgICAgICAgICAgPDxlbmRMb2MueSgpICAgKiAxLjAgLyBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0REJVUGVyVVUoKSA8PCIpICIgCi0gICAgICAgICAgICAgPDxnZXRUZWNoKCktPmdldExheWVyKGN1cnJMYXllck51bSktPmdldE5hbWUoKSA8PGVuZGw7Ci0gICAgICB9Ci0gICAgLy8gdmVydGljYWwgd2lyZQotICAgIH0gZWxzZSBpZiAoc3RhcnRYID09IGVuZFggJiYgc3RhcnRZICE9IGVuZFkgJiYgc3RhcnRaID09IGVuZFopIHsKLSAgICAgIGZyUG9pbnQgc3RhcnRMb2MsIGVuZExvYzsKLSAgICAgIGZyTGF5ZXJOdW0gY3VyckxheWVyTnVtID0gZ3JpZEdyYXBoLmdldExheWVyTnVtKHN0YXJ0Wik7Ci0gICAgICBncmlkR3JhcGguZ2V0UG9pbnQoc3RhcnRMb2MsIHN0YXJ0WCwgc3RhcnRZKTsKLSAgICAgIGdyaWRHcmFwaC5nZXRQb2ludChlbmRMb2MsIGVuZFgsIGVuZFkpOwotICAgICAgYXV0byBjdXJyUGF0aFNlZyA9IG1ha2VfdW5pcXVlPGRyUGF0aFNlZz4oKTsKLSAgICAgIGN1cnJQYXRoU2VnLT5zZXRQb2ludHMoc3RhcnRMb2MsIGVuZExvYyk7Ci0gICAgICBjdXJyUGF0aFNlZy0+c2V0TGF5ZXJOdW0oY3VyckxheWVyTnVtKTsKLSAgICAgIGN1cnJQYXRoU2VnLT5hZGRUb05ldChuZXQpOwotICAgICAgY3VyclBhdGhTZWctPnNldFN0eWxlKGdldFRlY2goKS0+Z2V0TGF5ZXIoY3VyckxheWVyTnVtKS0+Z2V0RGVmYXVsdFNlZ1N0eWxlKCkpOwotICAgICAgY3VyclBhdGhTZWctPnNldE1hemVJZHgoc3RhcnQsIGVuZCk7Ci0gICAgICB1bmlxdWVfcHRyPGRyQ29ubkZpZz4gdG1wKHN0ZDo6bW92ZShjdXJyUGF0aFNlZykpOwotICAgICAgd29ya2VyUmVnaW9uUXVlcnkuYWRkKHRtcC5nZXQoKSk7Ci0gICAgICBuZXQtPmFkZFJvdXRlKHRtcCk7Ci0gICAgICAvLyBxdWljayBkcmMgY250Ci0gICAgICBib29sIHByZXZIYXNDb3N0ID0gZmFsc2U7Ci0gICAgICBmb3IgKGludCBpID0gc3RhcnRZOyBpIDwgZW5kWTsgaSsrKSB7Ci0gICAgICAgIGlmIChncmlkR3JhcGguaGFzRFJDQ29zdChzdGFydFgsIGksIHN0YXJ0WiwgZnJEaXJFbnVtOjpFKSkgewotICAgICAgICAgIGlmICghcHJldkhhc0Nvc3QpIHsKLSAgICAgICAgICAgIG5ldC0+YWRkTWFya2VyKCk7Ci0gICAgICAgICAgICBwcmV2SGFzQ29zdCA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChURVNUKSB7Ci0gICAgICAgICAgICBjb3V0IDw8IiBwYXNzIG1hcmtlciBAKCIgPDxzdGFydFggPDwiLCAiIDw8aSA8PCIsICIgPDxzdGFydFogPDwiKSBOIiA8PGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHByZXZIYXNDb3N0ID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgd3JpdGUgdmVydCBwYXRoc2VnICgiIAotICAgICAgICAgICAgIDw8c3RhcnRMb2MueCgpICogMS4wIC8gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCkgPDwiLCAiIAotICAgICAgICAgICAgIDw8c3RhcnRMb2MueSgpICogMS4wIC8gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCkgPDwiKSAoIiAKLSAgICAgICAgICAgICA8PGVuZExvYy54KCkgICAqIDEuMCAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpIDw8IiwgIiAKLSAgICAgICAgICAgICA8PGVuZExvYy55KCkgICAqIDEuMCAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpIDw8IikgIiAKLSAgICAgICAgICAgICA8PGdldFRlY2goKS0+Z2V0TGF5ZXIoY3VyckxheWVyTnVtKS0+Z2V0TmFtZSgpIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAvLyB2aWEKLSAgICB9IGVsc2UgaWYgKHN0YXJ0WCA9PSBlbmRYICYmIHN0YXJ0WSA9PSBlbmRZICYmIHN0YXJ0WiAhPSBlbmRaKSB7Ci0gICAgICBmb3IgKGF1dG8gY3VyclogPSBzdGFydFo7IGN1cnJaIDwgZW5kWjsgKytjdXJyWikgewotICAgICAgICBmclBvaW50IGxvYzsKLSAgICAgICAgZnJMYXllck51bSBzdGFydExheWVyTnVtID0gZ3JpZEdyYXBoLmdldExheWVyTnVtKGN1cnJaKTsKLSAgICAgICAgLy9mckxheWVyTnVtIGVuZExheWVyTnVtID0gZ3JpZEdyYXBoLmdldExheWVyTnVtKGN1cnJaICsgMSk7Ci0gICAgICAgIGdyaWRHcmFwaC5nZXRQb2ludChsb2MsIHN0YXJ0WCwgc3RhcnRZKTsKLSAgICAgICAgRmxleE1hemVJZHggbWkoc3RhcnRYLCBzdGFydFksIGN1cnJaKTsgCi0gICAgICAgIGF1dG8gY3V0TGF5ZXJEZWZhdWx0VmlhID0gZ2V0VGVjaCgpLT5nZXRMYXllcihzdGFydExheWVyTnVtICsgMSktPmdldERlZmF1bHRWaWFEZWYoKTsKLSAgICAgICAgaWYgKGdyaWRHcmFwaC5pc1NWaWEoc3RhcnRYLCBzdGFydFksIGN1cnJaKSkgewotICAgICAgICAgIGN1dExheWVyRGVmYXVsdFZpYSA9IGFwU1ZpYS5maW5kKG1pKS0+c2Vjb25kLT5nZXRBY2Nlc3NWaWFEZWYoKTsKLSAgICAgICAgfQotICAgICAgICBhdXRvIGN1cnJWaWEgPSBtYWtlX3VuaXF1ZTxkclZpYT4oY3V0TGF5ZXJEZWZhdWx0VmlhKTsKLSAgICAgICAgY3VyclZpYS0+c2V0T3JpZ2luKGxvYyk7Ci0gICAgICAgIGN1cnJWaWEtPnNldE1hemVJZHgoRmxleE1hemVJZHgoc3RhcnRYLCBzdGFydFksIGN1cnJaKSwgRmxleE1hemVJZHgoc3RhcnRYLCBzdGFydFksIGN1cnJaKzEpKTsKLSAgICAgICAgdW5pcXVlX3B0cjxkckNvbm5GaWc+IHRtcChzdGQ6Om1vdmUoY3VyclZpYSkpOwotICAgICAgICB3b3JrZXJSZWdpb25RdWVyeS5hZGQodG1wLmdldCgpKTsKLSAgICAgICAgbmV0LT5hZGRSb3V0ZSh0bXApOwotICAgICAgICBpZiAoZ3JpZEdyYXBoLmhhc0RSQ0Nvc3Qoc3RhcnRYLCBzdGFydFksIGN1cnJaLCBmckRpckVudW06OlUpKSB7Ci0gICAgICAgICAgbmV0LT5hZGRNYXJrZXIoKTsKLSAgICAgICAgICBpZiAoVEVTVCkgewotICAgICAgICAgICAgY291dCA8PCIgcGFzcyBtYXJrZXIgQCgiIDw8c3RhcnRYIDw8IiwgIiA8PHN0YXJ0WSA8PCIsICIgPDxjdXJyWiA8PCIpIFUiIDw8ZW5kbDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgIGNvdXQgPDwiIHdyaXRlIHZpYSAoIiAKLSAgICAgICAgICAgICAgIDw8bG9jLngoKSAqIDEuMCAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpIDw8IiwgIiAKLSAgICAgICAgICAgICAgIDw8bG9jLnkoKSAqIDEuMCAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpIDw8IikgIiAKLSAgICAgICAgICAgICAgIDw8Y3V0TGF5ZXJEZWZhdWx0VmlhLT5nZXROYW1lKCkgPDxlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgLy8gemVybyBsZW5ndGgKLSAgICB9IGVsc2UgaWYgKHN0YXJ0WCA9PSBlbmRYICYmIHN0YXJ0WSA9PSBlbmRZICYmIHN0YXJ0WiA9PSBlbmRaKSB7Ci0gICAgICBzdGQ6OmNvdXQgPDwgIldhcm5pbmc6IHplcm8tbGVuZ3RoIHBhdGggaW4gdXBkYXRlRmxleFBpblxuIjsKLSAgICB9IGVsc2UgewotICAgICAgc3RkOjpjb3V0IDw8ICJFcnJvcjogbm9uLWNvbGluZWFyIHBhdGggaW4gdXBkYXRlRmxleFBpblxuIjsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBGbGV4RFJXb3JrZXI6OnJvdXRlTmV0X3Bvc3RSb3V0ZUFkZFBhdGhDb3N0KGRyTmV0KiBuZXQpIHsKLSAgaW50IGNudCA9IDA7Ci0gIGZvciAoYXV0byAmY29ubkZpZzogbmV0LT5nZXRSb3V0ZUNvbm5GaWdzKCkpIHsKLSAgICBhZGRQYXRoQ29zdChjb25uRmlnLmdldCgpKTsKLSAgICBjbnQrKzsKLSAgfQotICAvL2NvdXQgPDwidXBkYXRlZCAiIDw8Y250IDw8IiBjb25uZmlnIGNvc3RzIiA8PGVuZGw7Ci19Ci0KLWJvb2wgRmxleERSV29ya2VyOjpyb3V0ZU5ldChkck5ldCogbmV0KSB7Ci0gIGlmIChuZXQtPmdldFBpbnMoKS5zaXplKCkgPD0gMSkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBpZiAoVEVTVCkgewotICAgIGNvdXQgPDwicm91dGUgIiA8PG5ldC0+Z2V0RnJOZXQoKS0+Z2V0TmFtZSgpIDw8ZW5kbDsKLSAgfQotCi0gIHNldDxkclBpbiosIGZyQmxvY2tPYmplY3RDb21wPiB1bkNvbm5QaW5zOwotICBtYXA8RmxleE1hemVJZHgsIHNldDxkclBpbiosIGZyQmxvY2tPYmplY3RDb21wPiA+IG1hemVJZHgydW5Db25uUGluczsKLSAgLy9tYXA8RmxleE1hemVJZHgsIGZyVmlhRGVmKj4gYXBTVmlhOwotICByb3V0ZU5ldF9wcmVwKG5ldCwgdW5Db25uUGlucywgbWF6ZUlkeDJ1bkNvbm5QaW5zLyosIGFwU1ZpYSovKTsKLQotICBGbGV4TWF6ZUlkeCBjY01hemVJZHgxLCBjY01hemVJZHgyOyAvLyBjb25uQ29tcHMgbGwsIHVyIGZsZXhtYXplaWR4Ci0gIHZlY3RvcjxGbGV4TWF6ZUlkeD4gY29ubkNvbXBzOwotICByb3V0ZU5ldF9zZXRTcmModW5Db25uUGlucywgbWF6ZUlkeDJ1bkNvbm5QaW5zLCBjb25uQ29tcHMsIGNjTWF6ZUlkeDEsIGNjTWF6ZUlkeDIpOwotCi0gIHZlY3RvcjxGbGV4TWF6ZUlkeD4gcGF0aDsgLy8gYXN0YXIgbXVzdCByZXR1cm4gd2l0aCA+PSAxIGlkeAotICBib29sIGlzRmlyc3RDb25uID0gdHJ1ZTsKLSAgd2hpbGUoIXVuQ29ublBpbnMuZW1wdHkoKSkgewotICAgIG1hemVQaW5Jbml0KCk7Ci0gICAgYXV0byBuZXh0UGluID0gcm91dGVOZXRfZ2V0TmV4dERzdChjY01hemVJZHgxLCBjY01hemVJZHgyLCBtYXplSWR4MnVuQ29ublBpbnMpOwotICAgIHBhdGguY2xlYXIoKTsKLSAgICBpZiAoZ3JpZEdyYXBoLnNlYXJjaChjb25uQ29tcHMsIG5leHRQaW4sIHBhdGgsIGNjTWF6ZUlkeDEsIGNjTWF6ZUlkeDIpKSB7Ci0gICAgICByb3V0ZU5ldF9wb3N0QXN0YXJVcGRhdGUocGF0aCwgY29ubkNvbXBzLCB1bkNvbm5QaW5zLCBtYXplSWR4MnVuQ29ublBpbnMsIGlzRmlyc3RDb25uKTsKLSAgICAgIHJvdXRlTmV0X3Bvc3RBc3RhcldyaXRlUGF0aChuZXQsIHBhdGgvKiwgYXBTVmlhKi8pOwotICAgICAgcm91dGVOZXRfcG9zdEFzdGFyUGF0Y2hNaW5BcmVhVmlvKG5ldCwgcGF0aCk7Ci0gICAgICBpc0ZpcnN0Q29ubiA9IGZhbHNlOwotICAgIH0KLSAgfQotICByb3V0ZU5ldF9wb3N0Um91dGVBZGRQYXRoQ29zdChuZXQpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBGbGV4RFJXb3JrZXI6OnJvdXRlTmV0X3Bvc3RBc3RhclBhdGNoTWluQXJlYVZpbyhkck5ldCogbmV0LCBjb25zdCB2ZWN0b3I8RmxleE1hemVJZHg+ICZwYXRoKSB7Ci0gIGlmIChwYXRoLmVtcHR5KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgLy8gZ2V0IHBhdGggd2l0aCBzZXBhcmF0ZWQgKHN0YWNrZWQgdmlhcykKLSAgdmVjdG9yPEZsZXhNYXplSWR4PiBwb2ludHM7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClwYXRoLnNpemUoKSAtIDE7ICsraSkgewotICAgIGF1dG8gY3VycklkeCA9IHBhdGhbaV07Ci0gICAgYXV0byBuZXh0SWR4ID0gcGF0aFtpKzFdOwotICAgIGlmIChjdXJySWR4LnooKSA9PSBuZXh0SWR4LnooKSkgewotICAgICAgcG9pbnRzLnB1c2hfYmFjayhjdXJySWR4KTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKGN1cnJJZHgueigpIDwgbmV4dElkeC56KCkpIHsKLSAgICAgICAgZm9yIChhdXRvIHogPSBjdXJySWR4LnooKTsgeiA8IG5leHRJZHgueigpOyArK3opIHsKLSAgICAgICAgICBGbGV4TWF6ZUlkeCB0bXBJZHgoY3VycklkeC54KCksIGN1cnJJZHgueSgpLCB6KTsKLSAgICAgICAgICBwb2ludHMucHVzaF9iYWNrKHRtcElkeCk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoYXV0byB6ID0gY3VycklkeC56KCk7IHogPiBuZXh0SWR4LnooKTsgLS16KSB7Ci0gICAgICAgICAgRmxleE1hemVJZHggdG1wSWR4KGN1cnJJZHgueCgpLCBjdXJySWR4LnkoKSwgeik7Ci0gICAgICAgICAgcG9pbnRzLnB1c2hfYmFjayh0bXBJZHgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHBvaW50cy5wdXNoX2JhY2socGF0aC5iYWNrKCkpOwotCi0KLSAgYXV0byBsYXllck51bSA9IGdyaWRHcmFwaC5nZXRMYXllck51bShwb2ludHMuZnJvbnQoKS56KCkpOwotICBhdXRvIG1pbkFyZWFDb25zdHJhaW50ID0gZ2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0TGF5ZXIobGF5ZXJOdW0pLT5nZXRBcmVhQ29uc3RyYWludCgpOwotICBmckNvb3JkIGN1cnJBcmVhID0gKG1pbkFyZWFDb25zdHJhaW50KSA/IG1pbkFyZWFDb25zdHJhaW50LT5nZXRNaW5BcmVhKCkgOiAwOwotICBmckNvb3JkIHN0YXJ0VmlhSGFsZkVuY0FyZWEgPSAwLCBlbmRWaWFIYWxmRW5jQXJlYSA9IDA7Ci0gIEZsZXhNYXplSWR4IHByZXZJZHggPSBwb2ludHNbMF0sIGN1cnJJZHg7Ci0gIGZvciAoaW50IGkgPSAxOyBpIDwgKGludClwb2ludHMuc2l6ZSgpOyArK2kpIHsKLSAgICBjdXJySWR4ID0gcG9pbnRzW2ldOwotICAgIC8vIGNoZWNrIG1pbkFyZWFWaW9sYXRpb24gd2hlbiBjaGFuZ2UgbGF5ZXIKLSAgICBpZiAoY3VycklkeC56KCkgIT0gcHJldklkeC56KCkpIHsKLSAgICAgIGF1dG8gbGF5ZXJOdW0gPSBncmlkR3JhcGguZ2V0TGF5ZXJOdW0ocHJldklkeC56KCkpOwotICAgICAgYXV0byBtaW5BcmVhQ29uc3RyYWludCA9IGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldExheWVyKGxheWVyTnVtKS0+Z2V0QXJlYUNvbnN0cmFpbnQoKTsKLSAgICAgIGZyQ29vcmQgcmVxQXJlYSA9IChtaW5BcmVhQ29uc3RyYWludCkgPyBtaW5BcmVhQ29uc3RyYWludC0+Z2V0TWluQXJlYSgpIDogMDsKLSAgICAgIC8vIGFkZCBuZXh0IHZpYSBlbmNsb3N1cmUKLSAgICAgIGlmIChjdXJySWR4LnooKSA8IHByZXZJZHgueigpKSB7Ci0gICAgICAgIGN1cnJBcmVhICs9IGdyaWRHcmFwaC5nZXRIYWxmVmlhRW5jQXJlYShwcmV2SWR4LnooKSAtIDEsIGZhbHNlKTsKLSAgICAgICAgZW5kVmlhSGFsZkVuY0FyZWEgPSBncmlkR3JhcGguZ2V0SGFsZlZpYUVuY0FyZWEocHJldklkeC56KCkgLSAxLCBmYWxzZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjdXJyQXJlYSArPSBncmlkR3JhcGguZ2V0SGFsZlZpYUVuY0FyZWEocHJldklkeC56KCksIHRydWUpOwotICAgICAgICBlbmRWaWFIYWxmRW5jQXJlYSA9IGdyaWRHcmFwaC5nZXRIYWxmVmlhRW5jQXJlYShwcmV2SWR4LnooKSwgdHJ1ZSk7Ci0gICAgICB9Ci0gICAgICAvLyBwdXNoIHRvIG1pbkFyZWEgdmlvbGF0aW9uCi0gICAgICBpZiAoY3VyckFyZWEgPCByZXFBcmVhKSB7Ci0gICAgICAgIEZsZXhNYXplSWR4IGJwLCBlcDsKLSAgICAgICAgZnJDb29yZCBnYXBBcmVhID0gcmVxQXJlYSAtIChjdXJyQXJlYSAtIHN0YXJ0VmlhSGFsZkVuY0FyZWEgLSBlbmRWaWFIYWxmRW5jQXJlYSkgLSBzdGQ6Om1pbihzdGFydFZpYUhhbGZFbmNBcmVhLCBlbmRWaWFIYWxmRW5jQXJlYSk7Ci0gICAgICAgIC8vIGJwID0gc3RkOjptaW4ocHJldklkeCwgY3VycklkeCk7Ci0gICAgICAgIC8vIGVwID0gc3RkOjptYXgocHJldklkeCwgY3VycklkeCk7Ci0gICAgICAgIGlmIChwb2ludHNbaS0xXS56KCkgPT0gcG9pbnRzW2ktMl0ueigpKSB7Ci0gICAgICAgICAgYnAgPSBzdGQ6Om1pbihwb2ludHNbaS0xXSwgcG9pbnRzW2ktMl0pOwotICAgICAgICAgIGVwID0gc3RkOjptYXgocG9pbnRzW2ktMV0sIHBvaW50c1tpLTJdKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBicCA9IHBvaW50c1tpLTFdOwotICAgICAgICAgIGVwID0gcG9pbnRzW2ktMV07Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGF1dG8gcGF0Y2hXaWR0aCA9IGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldExheWVyKGxheWVyTnVtKS0+Z2V0V2lkdGgoKTsKLSAgICAgICAgLy8gRmxleERSTWluQXJlYVZpbyBtaW5BcmVhVmlvKG5ldCwgYnAsIGVwLCByZXFBcmVhIC0gKGN1cnJBcmVhIC0gc3RhcnRWaWFIYWxmRW5jQXJlYSkgLSBzdGQ6Om1pbihzdGFydFZpYUhhbGZFbmNBcmVhLCBlbmRWaWFIYWxmRW5jQXJlYSkpOwotICAgICAgICAvLyBtaW5BcmVhVmlvcy5wdXNoX2JhY2sobWluQXJlYVZpbyk7Ci0gICAgICAgIHJvdXRlTmV0X3Bvc3RBc3RhckFkZFBhdGNoTWV0YWwobmV0LCBicCwgZXAsIGdhcEFyZWEsIHBhdGNoV2lkdGgpOwotICAgICAgfQotICAgICAgLy8gaW5pdCBmb3IgbmV4dCBwYXRoCi0gICAgICBpZiAoY3VycklkeC56KCkgPCBwcmV2SWR4LnooKSkgewotICAgICAgICBjdXJyQXJlYSA9IGdyaWRHcmFwaC5nZXRIYWxmVmlhRW5jQXJlYShwcmV2SWR4LnooKSAtIDEsIHRydWUpOwotICAgICAgICBzdGFydFZpYUhhbGZFbmNBcmVhID0gZ3JpZEdyYXBoLmdldEhhbGZWaWFFbmNBcmVhKHByZXZJZHgueigpIC0gMSwgdHJ1ZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjdXJyQXJlYSA9IGdyaWRHcmFwaC5nZXRIYWxmVmlhRW5jQXJlYShwcmV2SWR4LnooKSwgZmFsc2UpOwotICAgICAgICBzdGFydFZpYUhhbGZFbmNBcmVhID0gZ3JpZEdyYXBoLmdldEhhbGZWaWFFbmNBcmVhKHByZXZJZHgueigpLCBmYWxzZSk7Ci0gICAgICB9Ci0gICAgfSAKLSAgICAvLyBhZGQgdGhlIHdpcmUgYXJlYQotICAgIGVsc2UgewotICAgICAgYXV0byBsYXllck51bSA9IGdyaWRHcmFwaC5nZXRMYXllck51bShwcmV2SWR4LnooKSk7Ci0gICAgICBhdXRvIHBhdGhXaWR0aCA9IGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldExheWVyKGxheWVyTnVtKS0+Z2V0V2lkdGgoKTsKLSAgICAgIGZyUG9pbnQgYnAsIGVwOwotICAgICAgZ3JpZEdyYXBoLmdldFBvaW50KGJwLCBwcmV2SWR4LngoKSwgcHJldklkeC55KCkpOwotICAgICAgZ3JpZEdyYXBoLmdldFBvaW50KGVwLCBjdXJySWR4LngoKSwgY3VycklkeC55KCkpOwotICAgICAgZnJDb29yZCBwYXRoTGVuZ3RoID0gYWJzKGJwLngoKSAtIGVwLngoKSkgKyBhYnMoYnAueSgpIC0gZXAueSgpKTsKLSAgICAgIGN1cnJBcmVhICs9IHBhdGhMZW5ndGggKiBwYXRoV2lkdGg7Ci0gICAgfQotICAgIHByZXZJZHggPSBjdXJySWR4OwotICB9Ci19Ci0KLS8vIHZvaWQgRmxleERSV29ya2VyOjpyb3V0ZU5ldF9wb3N0Um91dGVBZGRQYXRjaE1ldGFsQ29zdChkck5ldCogbmV0KSB7Ci0vLyAgIGZvciAoYXV0byAmcGF0Y2g6IG5ldC0+Z2V0Um91dGVQYXRjaENvbm5GaWdzKCkpIHsKLS8vICAgICBhZGRQYXRoQ29zdChwYXRjaC5nZXQoKSk7Ci0vLyAgIH0KLS8vIH0KLQotdm9pZCBGbGV4RFJXb3JrZXI6OnJvdXRlTmV0X3Bvc3RBc3RhckFkZFBhdGNoTWV0YWwoZHJOZXQqIG5ldCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGbGV4TWF6ZUlkeCBicElkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZsZXhNYXplSWR4IGVwSWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJDb29yZCBnYXBBcmVhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJDb29yZCBwYXRjaFdpZHRoKSB7Ci0gIGJvb2wgaXNQYXRjaEhvcno7Ci0gIGJvb2wgaXNMZWZ0Q2xlYW4gPSB0cnVlOwotICBmckxheWVyTnVtIGxheWVyTnVtID0gZ3JpZEdyYXBoLmdldExheWVyTnVtKGJwSWR4LnooKSk7Ci0gIGZyQ29vcmQgcGF0Y2hMZW5ndGggPSBnYXBBcmVhIC8gcGF0Y2hXaWR0aDsKLSAgaWYgKGdhcEFyZWEgJSBwYXRjaFdpZHRoICE9IDApIHsKLSAgICArK3BhdGNoTGVuZ3RoOwotICB9Ci0gIGZyUG9pbnQgb3JpZ2luOwotICBhdXRvICZ3b3JrZXJSZWdpb25RdWVyeSA9IGdldFdvcmtlclJlZ2lvblF1ZXJ5KCk7Ci0gIC8vIHN0YWNrZWQgdmlhCi0gIGlmIChicElkeC54KCkgPT0gZXBJZHgueCgpICYmIGJwSWR4LnkoKSA9PSBlcElkeC55KCkpIHsKLSAgICBpZiAoZ2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0TGF5ZXIobGF5ZXJOdW0pLT5nZXREaXIoKSA9PSBmcmNIb3J6UHJlZlJvdXRpbmdEaXIpIHsKLSAgICAgIGlzUGF0Y2hIb3J6ID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgaXNQYXRjaEhvcnogPSBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgLy8gdmVydGljYWwgcGF0Y2ggCi0gIGVsc2UgaWYgKGJwSWR4LngoKSA9PSBlcElkeC54KCkpIHsKLSAgICBpc1BhdGNoSG9yeiA9IGZhbHNlOwotICB9Ci0gIC8vIGhvcml6b250YWwgcGF0Y2gKLSAgZWxzZSB7Ci0gICAgaXNQYXRjaEhvcnogPSB0cnVlOwotICB9Ci0KLSAgLy8gdHJ5IGJvdHRvbSAvIGxlZnQgb3B0aW9uCi0gIGlmIChpc1BhdGNoSG9yeikgewotICAgIGdyaWRHcmFwaC5nZXRQb2ludChvcmlnaW4sIGJwSWR4LngoKSwgYnBJZHgueSgpKTsKLSAgICBmclBvaW50IHBhdGNoRW5kKG9yaWdpbi54KCkgLSBwYXRjaExlbmd0aCwgb3JpZ2luLnkoKSk7Ci0gICAgaWYgKCFnZXRSb3V0ZUJveCgpLmNvbnRhaW5zKHBhdGNoRW5kKSkgewotICAgICAgaXNMZWZ0Q2xlYW4gPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZnJQb2ludCBwYXRjaExMKG9yaWdpbi54KCkgLSBwYXRjaExlbmd0aCwgb3JpZ2luLnkoKSAtIHBhdGNoV2lkdGggLyAyKTsKLSAgICAgIGZyUG9pbnQgcGF0Y2hVUihvcmlnaW4ueCgpLCBvcmlnaW4ueSgpICsgcGF0Y2hXaWR0aCAvIDIpOwotICAgICAgRmxleE1hemVJZHggc3RhcnRJZHgsIGVuZElkeDsKLSAgICAgIGdyaWRHcmFwaC5nZXRNYXplSWR4KHN0YXJ0SWR4LCBwYXRjaExMLCBsYXllck51bSk7Ci0gICAgICBncmlkR3JhcGguZ2V0TWF6ZUlkeChlbmRJZHgsIHBhdGNoVVIsIGxheWVyTnVtKTsKLSAgICAgIGZvciAoYXV0byB4SWR4ID0gc3RhcnRJZHgueCgpOyB4SWR4IDwgZW5kSWR4LngoKTsgKyt4SWR4KSB7Ci0gICAgICAgIGZvciAoYXV0byB5SWR4ID0gc3RhcnRJZHgueSgpOyB5SWR4IDwgZW5kSWR4LnkoKTsgKyt5SWR4KSB7Ci0gICAgICAgICAgaWYgKGdyaWRHcmFwaC5oYXNEUkNDb3N0KHhJZHgsIHlJZHgsIGJwSWR4LnooKSwgZnJEaXJFbnVtOjpFKSB8fAotICAgICAgICAgICAgICBncmlkR3JhcGguaGFzRFJDQ29zdCh4SWR4LCB5SWR4LCBicElkeC56KCksIGZyRGlyRW51bTo6TikpIHsKLSAgICAgICAgICAgIGlzTGVmdENsZWFuID0gZmFsc2U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gYWRkIHBhdGNoIGlmIGNsZWFuCi0gICAgaWYgKGlzTGVmdENsZWFuKSB7Ci0gICAgICBmclBvaW50IHBhdGNoTEwob3JpZ2luLngoKSAtIHBhdGNoTGVuZ3RoLCBvcmlnaW4ueSgpIC0gcGF0Y2hXaWR0aCAvIDIpOwotICAgICAgZnJQb2ludCBwYXRjaFVSKG9yaWdpbi54KCksIG9yaWdpbi55KCkgKyBwYXRjaFdpZHRoIC8gMik7Ci0gICAgICBhdXRvIHRtcFBhdGNoID0gbWFrZV91bmlxdWU8ZHJQYXRjaFdpcmU+KCk7Ci0gICAgICB0bXBQYXRjaC0+c2V0TGF5ZXJOdW0obGF5ZXJOdW0pOwotICAgICAgdG1wUGF0Y2gtPnNldE9yaWdpbihvcmlnaW4pOwotICAgICAgLy8gdG1wUGF0Y2gtPnNldEJCb3goZnJCb3gocGF0Y2hMTCwgcGF0Y2hVUikpOwotICAgICAgdG1wUGF0Y2gtPnNldE9mZnNldEJveChmckJveCgtcGF0Y2hMZW5ndGgsIC1wYXRjaFdpZHRoIC8gMiwgMCwgcGF0Y2hXaWR0aCAvIDIpKTsKLSAgICAgIHRtcFBhdGNoLT5hZGRUb05ldChuZXQpOwotICAgICAgdW5pcXVlX3B0cjxkckNvbm5GaWc+IHRtcChzdGQ6Om1vdmUodG1wUGF0Y2gpKTsKLSAgICAgIHdvcmtlclJlZ2lvblF1ZXJ5LmFkZCh0bXAuZ2V0KCkpOwotICAgICAgbmV0LT5hZGRSb3V0ZSh0bXApOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBncmlkR3JhcGguZ2V0UG9pbnQob3JpZ2luLCBicElkeC54KCksIGJwSWR4LnkoKSk7Ci0gICAgZnJQb2ludCBwYXRjaEVuZChvcmlnaW4ueCgpLCBvcmlnaW4ueSgpIC0gcGF0Y2hMZW5ndGgpOwotICAgIGlmICghZ2V0Um91dGVCb3goKS5jb250YWlucyhwYXRjaEVuZCkpIHsKLSAgICAgIGlzTGVmdENsZWFuID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZyUG9pbnQgcGF0Y2hMTChvcmlnaW4ueCgpIC0gcGF0Y2hXaWR0aCAvIDIsIG9yaWdpbi55KCkgLSBwYXRjaExlbmd0aCk7Ci0gICAgICBmclBvaW50IHBhdGNoVVIob3JpZ2luLngoKSArIHBhdGNoV2lkdGggLyAyLCBvcmlnaW4ueSgpKTsKLSAgICAgIEZsZXhNYXplSWR4IHN0YXJ0SWR4LCBlbmRJZHg7Ci0gICAgICBncmlkR3JhcGguZ2V0TWF6ZUlkeChzdGFydElkeCwgcGF0Y2hMTCwgbGF5ZXJOdW0pOwotICAgICAgZ3JpZEdyYXBoLmdldE1hemVJZHgoZW5kSWR4LCBwYXRjaFVSLCBsYXllck51bSk7Ci0gICAgICBmb3IgKGF1dG8geElkeCA9IHN0YXJ0SWR4LngoKTsgeElkeCA8IGVuZElkeC54KCk7ICsreElkeCkgewotICAgICAgICBmb3IgKGF1dG8geUlkeCA9IHN0YXJ0SWR4LnkoKTsgeUlkeCA8IGVuZElkeC55KCk7ICsreUlkeCkgewotICAgICAgICAgIGlmIChncmlkR3JhcGguaGFzRFJDQ29zdCh4SWR4LCB5SWR4LCBicElkeC56KCksIGZyRGlyRW51bTo6RSkgfHwKLSAgICAgICAgICAgICAgZ3JpZEdyYXBoLmhhc0RSQ0Nvc3QoeElkeCwgeUlkeCwgYnBJZHgueigpLCBmckRpckVudW06Ok4pKSB7Ci0gICAgICAgICAgICBpc0xlZnRDbGVhbiA9IGZhbHNlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIGFkZCBwYXRjaCBpZiBjbGVhbgotICAgIGlmIChpc0xlZnRDbGVhbikgewotICAgICAgZnJQb2ludCBwYXRjaExMKG9yaWdpbi54KCkgLSBwYXRjaFdpZHRoIC8gMiwgb3JpZ2luLnkoKSAtIHBhdGNoTGVuZ3RoKTsKLSAgICAgIGZyUG9pbnQgcGF0Y2hVUihvcmlnaW4ueCgpICsgcGF0Y2hXaWR0aCAvIDIsIG9yaWdpbi55KCkpOwotICAgICAgYXV0byB0bXBQYXRjaCA9IG1ha2VfdW5pcXVlPGRyUGF0Y2hXaXJlPigpOwotICAgICAgdG1wUGF0Y2gtPnNldExheWVyTnVtKGxheWVyTnVtKTsKLSAgICAgIHRtcFBhdGNoLT5zZXRPcmlnaW4ob3JpZ2luKTsKLSAgICAgIC8vIHRtcFBhdGNoLT5zZXRCQm94KGZyQm94KHBhdGNoTEwsIHBhdGNoVVIpKTsKLSAgICAgIHRtcFBhdGNoLT5zZXRPZmZzZXRCb3goZnJCb3goLXBhdGNoV2lkdGggLyAyLCAtcGF0Y2hMZW5ndGgsIHBhdGNoV2lkdGggLyAyLCAwKSk7Ci0gICAgICB0bXBQYXRjaC0+YWRkVG9OZXQobmV0KTsKLSAgICAgIHVuaXF1ZV9wdHI8ZHJDb25uRmlnPiB0bXAoc3RkOjptb3ZlKHRtcFBhdGNoKSk7Ci0gICAgICB3b3JrZXJSZWdpb25RdWVyeS5hZGQodG1wLmdldCgpKTsKLSAgICAgIG5ldC0+YWRkUm91dGUodG1wKTsKLSAgICB9Ci0gIH0KLSAgLy8gdXNlIHRvcCAvIHJpZ2h0IG9wdGlvbiBpZiBib3R0b20gLyBsZWZ0IGlzIG5vdCB1c2FibGUKLSAgaWYgKCFpc0xlZnRDbGVhbikgewotICAgIGdyaWRHcmFwaC5nZXRQb2ludChvcmlnaW4sIGVwSWR4LngoKSwgZXBJZHgueSgpKTsKLSAgICBpZiAoaXNQYXRjaEhvcnopIHsKLSAgICAgIGZyUG9pbnQgcGF0Y2hMTChvcmlnaW4ueCgpLCBvcmlnaW4ueSgpIC0gcGF0Y2hXaWR0aCAvIDIpOwotICAgICAgZnJQb2ludCBwYXRjaFVSKG9yaWdpbi54KCkgKyBwYXRjaExlbmd0aCwgb3JpZ2luLnkoKSArIHBhdGNoV2lkdGggLyAyKTsKLQotICAgICAgYXV0byB0bXBQYXRjaCA9IG1ha2VfdW5pcXVlPGRyUGF0Y2hXaXJlPigpOwotICAgICAgdG1wUGF0Y2gtPnNldExheWVyTnVtKGxheWVyTnVtKTsKLSAgICAgIHRtcFBhdGNoLT5zZXRPcmlnaW4ob3JpZ2luKTsKLSAgICAgIC8vIHRtcFBhdGNoLT5zZXRCQm94KGZyQm94KHBhdGNoTEwsIHBhdGNoVVIpKTsKLSAgICAgIHRtcFBhdGNoLT5zZXRPZmZzZXRCb3goZnJCb3goMCwgLXBhdGNoV2lkdGggLyAyLCBwYXRjaExlbmd0aCwgcGF0Y2hXaWR0aCAvIDIpKTsKLSAgICAgIHRtcFBhdGNoLT5hZGRUb05ldChuZXQpOwotICAgICAgdW5pcXVlX3B0cjxkckNvbm5GaWc+IHRtcChzdGQ6Om1vdmUodG1wUGF0Y2gpKTsKLSAgICAgIHdvcmtlclJlZ2lvblF1ZXJ5LmFkZCh0bXAuZ2V0KCkpOwotICAgICAgbmV0LT5hZGRSb3V0ZSh0bXApOwotICAgIH0gZWxzZSB7Ci0gICAgICBmclBvaW50IHBhdGNoTEwob3JpZ2luLngoKSAtIHBhdGNoV2lkdGggLyAyLCBvcmlnaW4ueSgpKTsKLSAgICAgIGZyUG9pbnQgcGF0Y2hVUihvcmlnaW4ueCgpICsgcGF0Y2hXaWR0aCAvIDIsIG9yaWdpbi55KCkgKyBwYXRjaExlbmd0aCk7Ci0KLSAgICAgIGF1dG8gdG1wUGF0Y2ggPSBtYWtlX3VuaXF1ZTxkclBhdGNoV2lyZT4oKTsKLSAgICAgIHRtcFBhdGNoLT5zZXRMYXllck51bShsYXllck51bSk7Ci0gICAgICB0bXBQYXRjaC0+c2V0T3JpZ2luKG9yaWdpbik7Ci0gICAgICAvLyB0bXBQYXRjaC0+c2V0QkJveChmckJveChwYXRjaExMLCBwYXRjaFVSKSk7Ci0gICAgICB0bXBQYXRjaC0+c2V0T2Zmc2V0Qm94KGZyQm94KC1wYXRjaFdpZHRoIC8gMiwgMCwgcGF0Y2hXaWR0aCAvIDIsIHBhdGNoTGVuZ3RoKSk7Ci0gICAgICB0bXBQYXRjaC0+YWRkVG9OZXQobmV0KTsKLSAgICAgIHVuaXF1ZV9wdHI8ZHJDb25uRmlnPiB0bXAoc3RkOjptb3ZlKHRtcFBhdGNoKSk7Ci0gICAgICB3b3JrZXJSZWdpb25RdWVyeS5hZGQodG1wLmdldCgpKTsKLSAgICAgIG5ldC0+YWRkUm91dGUodG1wKTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZHIvRmxleERSX3JxLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RyL0ZsZXhEUl9ycS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMTAwY2IuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZHIvRmxleERSX3JxLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiZHIvRmxleERSLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgZnI7Ci0KLWZyRGVzaWduKiBGbGV4RFJXb3JrZXJSZWdpb25RdWVyeTo6Z2V0RGVzaWduKCkgY29uc3QgewotICByZXR1cm4gZHJXb3JrZXItPmdldERlc2lnbigpOwotfQotCi12b2lkIEZsZXhEUldvcmtlclJlZ2lvblF1ZXJ5OjphZGQoZHJDb25uRmlnKiBjb25uRmlnKSB7Ci0gIGZyQm94IGZyYjsKLSAgYm94X3QgYm9vc3RiOwotICBpZiAoY29ubkZpZy0+dHlwZUlkKCkgPT0gZHJjUGF0aFNlZyB8fCBjb25uRmlnLT50eXBlSWQoKSA9PSBmcmNSZWN0IHx8IGNvbm5GaWctPnR5cGVJZCgpID09IGRyY1BhdGNoV2lyZSkgewotICAgIGF1dG8gb2JqID0gc3RhdGljX2Nhc3Q8ZHJTaGFwZSo+KGNvbm5GaWcpOwotICAgIG9iai0+Z2V0QkJveChmcmIpOwotICAgIGJvb3N0YiA9IGJveF90KHBvaW50X3QoZnJiLmxlZnQoKSwgZnJiLmJvdHRvbSgpKSwgcG9pbnRfdChmcmIucmlnaHQoKSwgZnJiLnRvcCgpKSk7Ci0gICAgc2hhcGVzLmF0KG9iai0+Z2V0TGF5ZXJOdW0oKSkuaW5zZXJ0KG1ha2VfcGFpcihib29zdGIsIG9iaikpOwotICB9IGVsc2UgaWYgKGNvbm5GaWctPnR5cGVJZCgpID09IGRyY1ZpYSkgewotICAgIGF1dG8gdmlhID0gc3RhdGljX2Nhc3Q8ZHJWaWEqPihjb25uRmlnKTsKLSAgICBmclRyYW5zZm9ybSB4Zm9ybTsKLSAgICBmclBvaW50IG9yaWdpbjsKLSAgICB2aWEtPmdldE9yaWdpbihvcmlnaW4pOwotICAgIHhmb3JtLnNldChvcmlnaW4pOwotICAgIGZvciAoYXV0byAmdVNoYXBlOiB2aWEtPmdldFZpYURlZigpLT5nZXRMYXllcjFGaWdzKCkpIHsKLSAgICAgIGF1dG8gc2hhcGUgPSB1U2hhcGUuZ2V0KCk7Ci0gICAgICBpZiAoc2hhcGUtPnR5cGVJZCgpID09IGZyY1JlY3QpIHsKLSAgICAgICAgc2hhcGUtPmdldEJCb3goZnJiKTsKLSAgICAgICAgZnJiLnRyYW5zZm9ybSh4Zm9ybSk7Ci0gICAgICAgIGJvb3N0YiA9IGJveF90KHBvaW50X3QoZnJiLmxlZnQoKSwgZnJiLmJvdHRvbSgpKSwgcG9pbnRfdChmcmIucmlnaHQoKSwgZnJiLnRvcCgpKSk7Ci0gICAgICAgIHNoYXBlcy5hdCh2aWEtPmdldFZpYURlZigpLT5nZXRMYXllcjFOdW0oKSkuaW5zZXJ0KG1ha2VfcGFpcihib29zdGIsIHZpYSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogdW5zdXBwb3J0ZWQgcmVnaW9uIHF1ZXJ5IGFkZCIgPDxlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBmb3IgKGF1dG8gJnVTaGFwZTogdmlhLT5nZXRWaWFEZWYoKS0+Z2V0TGF5ZXIyRmlncygpKSB7Ci0gICAgICBhdXRvIHNoYXBlID0gdVNoYXBlLmdldCgpOwotICAgICAgaWYgKHNoYXBlLT50eXBlSWQoKSA9PSBmcmNSZWN0KSB7Ci0gICAgICAgIHNoYXBlLT5nZXRCQm94KGZyYik7Ci0gICAgICAgIGZyYi50cmFuc2Zvcm0oeGZvcm0pOwotICAgICAgICBib29zdGIgPSBib3hfdChwb2ludF90KGZyYi5sZWZ0KCksIGZyYi5ib3R0b20oKSksIHBvaW50X3QoZnJiLnJpZ2h0KCksIGZyYi50b3AoKSkpOwotICAgICAgICBzaGFwZXMuYXQodmlhLT5nZXRWaWFEZWYoKS0+Z2V0TGF5ZXIyTnVtKCkpLmluc2VydChtYWtlX3BhaXIoYm9vc3RiLCB2aWEpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiRXJyb3I6IHVuc3VwcG9ydGVkIHJlZ2lvbiBxdWVyeSBhZGQiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChhdXRvICZ1U2hhcGU6IHZpYS0+Z2V0VmlhRGVmKCktPmdldEN1dEZpZ3MoKSkgewotICAgICAgYXV0byBzaGFwZSA9IHVTaGFwZS5nZXQoKTsKLSAgICAgIGlmIChzaGFwZS0+dHlwZUlkKCkgPT0gZnJjUmVjdCkgewotICAgICAgICBzaGFwZS0+Z2V0QkJveChmcmIpOwotICAgICAgICBmcmIudHJhbnNmb3JtKHhmb3JtKTsKLSAgICAgICAgYm9vc3RiID0gYm94X3QocG9pbnRfdChmcmIubGVmdCgpLCBmcmIuYm90dG9tKCkpLCBwb2ludF90KGZyYi5yaWdodCgpLCBmcmIudG9wKCkpKTsKLSAgICAgICAgc2hhcGVzLmF0KHZpYS0+Z2V0VmlhRGVmKCktPmdldEN1dExheWVyTnVtKCkpLmluc2VydChtYWtlX3BhaXIoYm9vc3RiLCB2aWEpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiRXJyb3I6IHVuc3VwcG9ydGVkIHJlZ2lvbiBxdWVyeSBhZGQiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgY291dCA8PCJFcnJvcjogdW5zdXBwb3J0ZWQgcmVnaW9uIHF1ZXJ5IGFkZCIgPDxlbmRsOwotICB9Ci19Ci0KLQotCi12b2lkIEZsZXhEUldvcmtlclJlZ2lvblF1ZXJ5OjphZGQoZHJDb25uRmlnKiBjb25uRmlnLCB2ZWN0b3I8dmVjdG9yPHJxX3JwdHJfdmFsdWVfdDxkckNvbm5GaWc+ID4gPiAmYWxsU2hhcGVzKSB7Ci0gIGZyQm94IGZyYjsKLSAgYm94X3QgYm9vc3RiOwotICBpZiAoY29ubkZpZy0+dHlwZUlkKCkgPT0gZHJjUGF0aFNlZyB8fCBjb25uRmlnLT50eXBlSWQoKSA9PSBmcmNSZWN0IHx8IGNvbm5GaWctPnR5cGVJZCgpID09IGRyY1BhdGNoV2lyZSkgewotICAgIGF1dG8gb2JqID0gc3RhdGljX2Nhc3Q8ZHJTaGFwZSo+KGNvbm5GaWcpOwotICAgIG9iai0+Z2V0QkJveChmcmIpOwotICAgIGJvb3N0YiA9IGJveF90KHBvaW50X3QoZnJiLmxlZnQoKSwgZnJiLmJvdHRvbSgpKSwgcG9pbnRfdChmcmIucmlnaHQoKSwgZnJiLnRvcCgpKSk7Ci0gICAgYWxsU2hhcGVzLmF0KG9iai0+Z2V0TGF5ZXJOdW0oKSkucHVzaF9iYWNrKG1ha2VfcGFpcihib29zdGIsIG9iaikpOwotICB9IGVsc2UgaWYgKGNvbm5GaWctPnR5cGVJZCgpID09IGRyY1ZpYSkgewotICAgIGF1dG8gdmlhID0gc3RhdGljX2Nhc3Q8ZHJWaWEqPihjb25uRmlnKTsKLSAgICBmclRyYW5zZm9ybSB4Zm9ybTsKLSAgICBmclBvaW50IG9yaWdpbjsKLSAgICB2aWEtPmdldE9yaWdpbihvcmlnaW4pOwotICAgIHhmb3JtLnNldChvcmlnaW4pOwotICAgIGZvciAoYXV0byAmdVNoYXBlOiB2aWEtPmdldFZpYURlZigpLT5nZXRMYXllcjFGaWdzKCkpIHsKLSAgICAgIGF1dG8gc2hhcGUgPSB1U2hhcGUuZ2V0KCk7Ci0gICAgICBpZiAoc2hhcGUtPnR5cGVJZCgpID09IGZyY1JlY3QpIHsKLSAgICAgICAgc2hhcGUtPmdldEJCb3goZnJiKTsKLSAgICAgICAgZnJiLnRyYW5zZm9ybSh4Zm9ybSk7Ci0gICAgICAgIGJvb3N0YiA9IGJveF90KHBvaW50X3QoZnJiLmxlZnQoKSwgZnJiLmJvdHRvbSgpKSwgcG9pbnRfdChmcmIucmlnaHQoKSwgZnJiLnRvcCgpKSk7Ci0gICAgICAgIGFsbFNoYXBlcy5hdCh2aWEtPmdldFZpYURlZigpLT5nZXRMYXllcjFOdW0oKSkucHVzaF9iYWNrKG1ha2VfcGFpcihib29zdGIsIHZpYSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogdW5zdXBwb3J0ZWQgcmVnaW9uIHF1ZXJ5IGFkZCIgPDxlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBmb3IgKGF1dG8gJnVTaGFwZTogdmlhLT5nZXRWaWFEZWYoKS0+Z2V0TGF5ZXIyRmlncygpKSB7Ci0gICAgICBhdXRvIHNoYXBlID0gdVNoYXBlLmdldCgpOwotICAgICAgaWYgKHNoYXBlLT50eXBlSWQoKSA9PSBmcmNSZWN0KSB7Ci0gICAgICAgIHNoYXBlLT5nZXRCQm94KGZyYik7Ci0gICAgICAgIGZyYi50cmFuc2Zvcm0oeGZvcm0pOwotICAgICAgICBib29zdGIgPSBib3hfdChwb2ludF90KGZyYi5sZWZ0KCksIGZyYi5ib3R0b20oKSksIHBvaW50X3QoZnJiLnJpZ2h0KCksIGZyYi50b3AoKSkpOwotICAgICAgICBhbGxTaGFwZXMuYXQodmlhLT5nZXRWaWFEZWYoKS0+Z2V0TGF5ZXIyTnVtKCkpLnB1c2hfYmFjayhtYWtlX3BhaXIoYm9vc3RiLCB2aWEpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiRXJyb3I6IHVuc3VwcG9ydGVkIHJlZ2lvbiBxdWVyeSBhZGQiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChhdXRvICZ1U2hhcGU6IHZpYS0+Z2V0VmlhRGVmKCktPmdldEN1dEZpZ3MoKSkgewotICAgICAgYXV0byBzaGFwZSA9IHVTaGFwZS5nZXQoKTsKLSAgICAgIGlmIChzaGFwZS0+dHlwZUlkKCkgPT0gZnJjUmVjdCkgewotICAgICAgICBzaGFwZS0+Z2V0QkJveChmcmIpOwotICAgICAgICBmcmIudHJhbnNmb3JtKHhmb3JtKTsKLSAgICAgICAgYm9vc3RiID0gYm94X3QocG9pbnRfdChmcmIubGVmdCgpLCBmcmIuYm90dG9tKCkpLCBwb2ludF90KGZyYi5yaWdodCgpLCBmcmIudG9wKCkpKTsKLSAgICAgICAgYWxsU2hhcGVzLmF0KHZpYS0+Z2V0VmlhRGVmKCktPmdldEN1dExheWVyTnVtKCkpLnB1c2hfYmFjayhtYWtlX3BhaXIoYm9vc3RiLCB2aWEpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiRXJyb3I6IHVuc3VwcG9ydGVkIHJlZ2lvbiBxdWVyeSBhZGQiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgY291dCA8PCJFcnJvcjogdW5zdXBwb3J0ZWQgcmVnaW9uIHF1ZXJ5IGFkZCIgPDxlbmRsOwotICB9Ci19Ci0KLXZvaWQgRmxleERSV29ya2VyUmVnaW9uUXVlcnk6OnJlbW92ZShkckNvbm5GaWcqIGNvbm5GaWcpIHsKLSAgZnJCb3ggZnJiOwotICBib3hfdCBib29zdGI7Ci0gIGlmIChjb25uRmlnLT50eXBlSWQoKSA9PSBkcmNQYXRoU2VnIHx8IGNvbm5GaWctPnR5cGVJZCgpID09IGZyY1JlY3QgfHwgY29ubkZpZy0+dHlwZUlkKCkgPT0gZHJjUGF0Y2hXaXJlKSB7Ci0gICAgYXV0byBvYmogPSBzdGF0aWNfY2FzdDxkclNoYXBlKj4oY29ubkZpZyk7Ci0gICAgb2JqLT5nZXRCQm94KGZyYik7Ci0gICAgYm9vc3RiID0gYm94X3QocG9pbnRfdChmcmIubGVmdCgpLCBmcmIuYm90dG9tKCkpLCBwb2ludF90KGZyYi5yaWdodCgpLCBmcmIudG9wKCkpKTsKLSAgICBzaGFwZXMuYXQob2JqLT5nZXRMYXllck51bSgpKS5yZW1vdmUobWFrZV9wYWlyKGJvb3N0Yiwgb2JqKSk7Ci0gIH0gZWxzZSBpZiAoY29ubkZpZy0+dHlwZUlkKCkgPT0gZHJjVmlhKSB7Ci0gICAgYXV0byB2aWEgPSBzdGF0aWNfY2FzdDxkclZpYSo+KGNvbm5GaWcpOwotICAgIGZyVHJhbnNmb3JtIHhmb3JtOwotICAgIGZyUG9pbnQgb3JpZ2luOwotICAgIHZpYS0+Z2V0T3JpZ2luKG9yaWdpbik7Ci0gICAgeGZvcm0uc2V0KG9yaWdpbik7Ci0gICAgZm9yIChhdXRvICZ1U2hhcGU6IHZpYS0+Z2V0VmlhRGVmKCktPmdldExheWVyMUZpZ3MoKSkgewotICAgICAgYXV0byBzaGFwZSA9IHVTaGFwZS5nZXQoKTsKLSAgICAgIGlmIChzaGFwZS0+dHlwZUlkKCkgPT0gZnJjUmVjdCkgewotICAgICAgICBzaGFwZS0+Z2V0QkJveChmcmIpOwotICAgICAgICBmcmIudHJhbnNmb3JtKHhmb3JtKTsKLSAgICAgICAgYm9vc3RiID0gYm94X3QocG9pbnRfdChmcmIubGVmdCgpLCBmcmIuYm90dG9tKCkpLCBwb2ludF90KGZyYi5yaWdodCgpLCBmcmIudG9wKCkpKTsKLSAgICAgICAgc2hhcGVzLmF0KHZpYS0+Z2V0VmlhRGVmKCktPmdldExheWVyMU51bSgpKS5yZW1vdmUobWFrZV9wYWlyKGJvb3N0YiwgdmlhKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb3V0IDw8IkVycm9yOiB1bnN1cHBvcnRlZCByZWdpb24gcXVlcnkgcmVtb3ZlIiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICAgIGZvciAoYXV0byAmdVNoYXBlOiB2aWEtPmdldFZpYURlZigpLT5nZXRMYXllcjJGaWdzKCkpIHsKLSAgICAgIGF1dG8gc2hhcGUgPSB1U2hhcGUuZ2V0KCk7Ci0gICAgICBpZiAoc2hhcGUtPnR5cGVJZCgpID09IGZyY1JlY3QpIHsKLSAgICAgICAgc2hhcGUtPmdldEJCb3goZnJiKTsKLSAgICAgICAgZnJiLnRyYW5zZm9ybSh4Zm9ybSk7Ci0gICAgICAgIGJvb3N0YiA9IGJveF90KHBvaW50X3QoZnJiLmxlZnQoKSwgZnJiLmJvdHRvbSgpKSwgcG9pbnRfdChmcmIucmlnaHQoKSwgZnJiLnRvcCgpKSk7Ci0gICAgICAgIHNoYXBlcy5hdCh2aWEtPmdldFZpYURlZigpLT5nZXRMYXllcjJOdW0oKSkucmVtb3ZlKG1ha2VfcGFpcihib29zdGIsIHZpYSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogdW5zdXBwb3J0ZWQgcmVnaW9uIHF1ZXJ5IHJlbW92ZSIgPDxlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBmb3IgKGF1dG8gJnVTaGFwZTogdmlhLT5nZXRWaWFEZWYoKS0+Z2V0Q3V0RmlncygpKSB7Ci0gICAgICBhdXRvIHNoYXBlID0gdVNoYXBlLmdldCgpOwotICAgICAgaWYgKHNoYXBlLT50eXBlSWQoKSA9PSBmcmNSZWN0KSB7Ci0gICAgICAgIHNoYXBlLT5nZXRCQm94KGZyYik7Ci0gICAgICAgIGZyYi50cmFuc2Zvcm0oeGZvcm0pOwotICAgICAgICBib29zdGIgPSBib3hfdChwb2ludF90KGZyYi5sZWZ0KCksIGZyYi5ib3R0b20oKSksIHBvaW50X3QoZnJiLnJpZ2h0KCksIGZyYi50b3AoKSkpOwotICAgICAgICBzaGFwZXMuYXQodmlhLT5nZXRWaWFEZWYoKS0+Z2V0Q3V0TGF5ZXJOdW0oKSkucmVtb3ZlKG1ha2VfcGFpcihib29zdGIsIHZpYSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogdW5zdXBwb3J0ZWQgcmVnaW9uIHF1ZXJ5IHJlbW92ZSIgPDxlbmRsOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBjb3V0IDw8IkVycm9yOiB1bnN1cHBvcnRlZCByZWdpb24gcXVlcnkgcmVtb3ZlIiA8PGVuZGw7Ci0gIH0KLX0KLQotdm9pZCBGbGV4RFJXb3JrZXJSZWdpb25RdWVyeTo6cXVlcnkoY29uc3QgZnJCb3ggJmJveCwgZnJMYXllck51bSBsYXllck51bSwgdmVjdG9yPGRyQ29ubkZpZyo+ICZyZXN1bHQpIHsKLSAgdmVjdG9yPHJxX3JwdHJfdmFsdWVfdDxkckNvbm5GaWc+ID4gdGVtcDsKLSAgYm94X3QgYm9vc3RiID0gYm94X3QocG9pbnRfdChib3gubGVmdCgpLCBib3guYm90dG9tKCkpLCBwb2ludF90KGJveC5yaWdodCgpLCBib3gudG9wKCkpKTsKLSAgc2hhcGVzLmF0KGxheWVyTnVtKS5xdWVyeShiZ2k6OmludGVyc2VjdHMoYm9vc3RiKSwgYmFja19pbnNlcnRlcih0ZW1wKSk7Ci0gIHRyYW5zZm9ybSh0ZW1wLmJlZ2luKCksIHRlbXAuZW5kKCksIGJhY2tfaW5zZXJ0ZXIocmVzdWx0KSwgW10oYXV0byAma3YpIHtyZXR1cm4ga3Yuc2Vjb25kO30pOwotfQotCi12b2lkIEZsZXhEUldvcmtlclJlZ2lvblF1ZXJ5Ojppbml0KCkgewotICBpbnQgbnVtTGF5ZXJzID0gZ2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0TGF5ZXJzKCkuc2l6ZSgpOwotICBzaGFwZXMuY2xlYXIoKTsKLSAgc2hhcGVzLnJlc2l6ZShudW1MYXllcnMpOwotICB2ZWN0b3I8dmVjdG9yPHJxX3JwdHJfdmFsdWVfdDxkckNvbm5GaWc+ID4gPiBhbGxTaGFwZXMobnVtTGF5ZXJzKTsKLSAgZm9yIChhdXRvICZuZXQ6IGdldERSV29ya2VyKCktPmdldE5ldHMoKSkgewotICAgIGZvciAoYXV0byAmY29ubkZpZzogbmV0LT5nZXRSb3V0ZUNvbm5GaWdzKCkpIHsKLSAgICAgIGFkZChjb25uRmlnLmdldCgpLCBhbGxTaGFwZXMpOwotICAgIH0KLSAgICBmb3IgKGF1dG8gJmNvbm5GaWc6IG5ldC0+Z2V0RXh0Q29ubkZpZ3MoKSkgewotICAgICAgYWRkKGNvbm5GaWcuZ2V0KCksIGFsbFNoYXBlcyk7Ci0gICAgfQotICB9Ci0gIGZvciAoYXV0byBpID0gMDsgaSA8IG51bUxheWVyczsgaSsrKSB7Ci0gICAgc2hhcGVzLmF0KGkpID0gYm9vc3Q6Om1vdmUoYmdpOjpydHJlZTxycV9ycHRyX3ZhbHVlX3Q8ZHJDb25uRmlnPiwgYmdpOjpxdWFkcmF0aWM8MTY+ID4oYWxsU2hhcGVzLmF0KGkpKSk7Ci0gICAgYWxsU2hhcGVzLmF0KGkpLmNsZWFyKCk7Ci0gICAgYWxsU2hhcGVzLmF0KGkpLnNocmlua190b19maXQoKTsKLSAgICAvL2lmIChWRVJCT1NFID4gMCkgewotICAgIC8vICBjb3V0IDw8IiAgY29tcGxldGUgIiA8PGRlc2lnbi0+Z2V0VGVjaCgpLT5nZXRMYXllcihpKS0+Z2V0TmFtZSgpIDw8ZW5kbDsKLSAgICAvL30KLSAgfQotfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZHIvRmxleEdyaWRHcmFwaC5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kci9GbGV4R3JpZEdyYXBoLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU5MWUzMi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kci9GbGV4R3JpZEdyYXBoLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUyNiArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiZHIvRmxleEdyaWRHcmFwaC5oIgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxmc3RyZWFtPgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIGZyOwotCi0vL3ZvaWQgRmxleEdyaWRHcmFwaDo6cmVzZXRDb3N0KGZyTUlkeCB4LCBmck1JZHggeSwgZnJNSWR4IHopIHsKLS8vICByZXNldEdyaWRDb3N0RSh4LCB5LCB6KTsKLS8vICByZXNldEdyaWRDb3N0Tih4LCB5LCB6KTsKLS8vICByZXNldEdyaWRDb3N0VSh4LCB5LCB6KTsKLS8vICByZXNldFNoYXBlUGxhbmFyKHgsIHksIHopOwotLy8gIHJlc2V0U2hhcGVWaWEoeCwgeSwgeik7Ci0vLyAgcmVzZXREUkNDb3N0UGxhbmFyKHgsIHksIHopOwotLy8gIHJlc2V0RFJDQ29zdFZpYSh4LCB5LCB6KTsKLS8vICByZXNldE1hcmtlckNvc3RQbGFuYXIoeCwgeSwgeik7Ci0vLyAgcmVzZXRNYXJrZXJDb3N0VmlhKHgsIHksIHopOwotLy99Ci0KLXZvaWQgRmxleEdyaWRHcmFwaDo6aW5pdEdyaWRzKGNvbnN0IG1hcDxmckNvb3JkLCBtYXA8ZnJMYXllck51bSwgZnJUcmFja1BhdHRlcm4qID4gPiAmeE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxmckNvb3JkLCBtYXA8ZnJMYXllck51bSwgZnJUcmFja1BhdHRlcm4qID4gPiAmeU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxmckxheWVyTnVtLCBmclByZWZSb3V0aW5nRGlyRW51bT4gJnpNYXApIHsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIC8vIGluaXRpYWxpemUgY29vcmQgdmVjdG9ycwotICB4Q29vcmRzLmNsZWFyKCk7Ci0gIHlDb29yZHMuY2xlYXIoKTsKLSAgekNvb3Jkcy5jbGVhcigpOwotICB6SGVpZ2h0cy5jbGVhcigpOwotICB6RGlycy5jbGVhcigpOwotICBoYWxmVmlhRW5jQXJlYS5jbGVhcigpOwotICBmb3IgKGF1dG8gJltrLCB2XTogeE1hcCkgewotICAgIHhDb29yZHMucHVzaF9iYWNrKGspOwotICB9Ci0gIGZvciAoYXV0byAmW2ssIHZdOiB5TWFwKSB7Ci0gICAgeUNvb3Jkcy5wdXNoX2JhY2soayk7Ci0gIH0KLSAgZnJDb29yZCB6SGVpZ2h0ID0gMDsKLSAgZm9yIChhdXRvICZbaywgdl06IHpNYXApIHsKLSAgICB6Q29vcmRzLnB1c2hfYmFjayhrKTsKLSAgICB6SGVpZ2h0ICs9IGdldFRlY2goKS0+Z2V0TGF5ZXIoayktPmdldFBpdGNoKCkgKiBWSUFDT1NUOwotICAgIHpIZWlnaHRzLnB1c2hfYmFjayh6SGVpZ2h0KTsKLSAgICB6RGlycy5wdXNoX2JhY2soKHYgPT0gZnJQcmVmUm91dGluZ0RpckVudW06OmZyY0hvcnpQcmVmUm91dGluZ0RpcikpOwotICAgIGlmIChrICsgMSA8PSBnZXRUZWNoKCktPmdldFRvcExheWVyTnVtKCkgJiYgZ2V0VGVjaCgpLT5nZXRMYXllcihrICsgMSktPmdldFR5cGUoKSA9PSBmckxheWVyVHlwZUVudW06OkNVVCkgewotICAgICAgYXV0byB2aWFEZWYgPSBnZXRUZWNoKCktPmdldExheWVyKGsgKyAxKS0+Z2V0RGVmYXVsdFZpYURlZigpOwotICAgICAgZnJWaWEgdmlhKHZpYURlZik7Ci0gICAgICBmckJveCBsYXllcjFCb3g7Ci0gICAgICBmckJveCBsYXllcjJCb3g7Ci0gICAgICB2aWEuZ2V0TGF5ZXIxQkJveChsYXllcjFCb3gpOwotICAgICAgdmlhLmdldExheWVyMkJCb3gobGF5ZXIyQm94KTsKLSAgICAgIGF1dG8gbGF5ZXIxSGFsZkFyZWEgPSBsYXllcjFCb3gud2lkdGgoKSAqIGxheWVyMUJveC5sZW5ndGgoKSAvIDI7Ci0gICAgICBhdXRvIGxheWVyMkhhbGZBcmVhID0gbGF5ZXIyQm94LndpZHRoKCkgKiBsYXllcjJCb3gubGVuZ3RoKCkgLyAyOwotICAgICAgLy8gY291dCA8PCJ6ID0gIiA8PHpDb29yZHMuc2l6ZSgpIDw8IiAiIDw8ImxheWVyMS8ySGFsZkFyZWEgPSAiIDw8bGF5ZXIxSGFsZkFyZWEgPDwiLyIgPDxsYXllcjJIYWxmQXJlYSA8PGVuZGw7Ci0gICAgICBoYWxmVmlhRW5jQXJlYS5wdXNoX2JhY2sobWFrZV9wYWlyKGxheWVyMUhhbGZBcmVhLCBsYXllcjJIYWxmQXJlYSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBoYWxmVmlhRW5jQXJlYS5wdXNoX2JhY2sobWFrZV9wYWlyKDAsMCkpOwotICAgIH0KLSAgfQotICAvLyBpbml0aWFsaXplIGFsbCBncmlkcwotICBmck1JZHggeERpbSwgeURpbSwgekRpbTsKLSAgZ2V0RGltKHhEaW0sIHlEaW0sIHpEaW0pOwotICBiaXRzLmNsZWFyKCk7Ci0gIGJpdHMucmVzaXplKHhEaW0qeURpbSp6RGltLCAwKTsKLSAgLy8gbmV3Ci0gIHByZXZEaXJzLmNsZWFyKCk7Ci0gIHNyY3MuY2xlYXIoKTsKLSAgZHN0cy5jbGVhcigpOwotICBwcmV2RGlycy5yZXNpemUoeERpbSp5RGltKnpEaW0qMywgMCk7Ci0gIHNyY3MucmVzaXplKHhEaW0qeURpbSp6RGltLCAwKTsKLSAgZHN0cy5yZXNpemUoeERpbSp5RGltKnpEaW0sIDApOwotCi0gIC8vZm9yIChpbnQgayA9IDA7IGsgPCAoaW50KXpEaW07IGsrKykgewotICAvLyAgZm9yIChpbnQgaiA9IDA7IGogPCAoaW50KXlEaW07IGorKykgewotICAvLyAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpeERpbTsgaSsrKSB7Ci0gIC8vICAgICAgcmVzZXRDb3N0KGksIGosIGspOwotICAvLyAgICB9Ci0gIC8vICB9Ci0gIC8vfQotICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgY291dCA8PCJ4ICI7Ci0gICAgZm9yIChhdXRvICZrOiB4Q29vcmRzKSB7Ci0gICAgICBjb3V0IDw8IiAiIDw8azsKLSAgICB9Ci0gICAgY291dCA8PGVuZGw7Ci0gICAgY291dCA8PCJ5ICI7ICAgCi0gICAgZm9yIChhdXRvICZrOiB5Q29vcmRzKSB7Ci0gICAgICBjb3V0IDw8IiAiIDw8azsKLSAgICB9Ci0gICAgY291dCA8PGVuZGw7Ci0gICAgY291dCA8PCJ6ICI7ICAgCi0gICAgZm9yIChhdXRvICZrOiB6Q29vcmRzKSB7Ci0gICAgICBjb3V0IDw8IiAiIDw8azsKLSAgICB9Ci0gICAgY291dCA8PGVuZGw7Ci0gICAgY291dCA8PCJ6IGhlaWdodCAiOyAgIAotICAgIGZvciAoYXV0byAmazogekhlaWdodHMpIHsKLSAgICAgIGNvdXQgPDwiICIgPDxrOwotICAgIH0KLSAgICBjb3V0IDw8ZW5kbDsKLSAgfQotfQotCi12b2lkIEZsZXhHcmlkR3JhcGg6OmluaXRFZGdlcyhjb25zdCBtYXA8ZnJDb29yZCwgbWFwPGZyTGF5ZXJOdW0sIGZyVHJhY2tQYXR0ZXJuKiA+ID4gJnhNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXA8ZnJDb29yZCwgbWFwPGZyTGF5ZXJOdW0sIGZyVHJhY2tQYXR0ZXJuKiA+ID4gJnlNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXA8ZnJMYXllck51bSwgZnJQcmVmUm91dGluZ0RpckVudW0+ICZ6TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJCb3ggJmJib3gsIGJvb2wgaW5pdERSKSB7Ci0gIC8vYm9vbCBlbmFibGVPdXRwdXQgPSB0cnVlOwotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICBmck1JZHggeERpbSwgeURpbSwgekRpbTsKLSAgZ2V0RGltKHhEaW0sIHlEaW0sIHpEaW0pOwotICAvLyBpbml0aWFsaXplIGdyaWQgZ3JhcGgKLSAgZnJNSWR4IHhJZHggPSAwLCB5SWR4ID0gMCwgeklkeCA9IDA7Ci0gIGJvb2wgZmxhZyA9IGZhbHNlOwotCi0gIC8vIGFkZCBjb3N0IHRvIG91dC1vZi1kaWUgZWRnZQotICAvL2ZyQm94IGJsb2NrQm94OwotICAvL2dldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXRCb3VuZGFyeUJCb3goYmxvY2tCb3gpOwotICAvL2ZyQm94IHZpYUJveCwgcGxhbmFyQm94OwotICAvL2ZyVmlhIGRWaWEobnVsbHB0cik7Ci0gIC8vZFZpYS5zZXRPcmlnaW4oZnJQb2ludCgwLDApKTsKLSAgLy9mckNvb3JkIGhhbGZXaWR0aCA9IDA7Ci0gIC8vZnJUcmFuc2Zvcm0geGZvcm07Ci0KLSAgZm9yIChhdXRvICZbbGF5ZXJOdW0sIGRpcl06IHpNYXApIHsKLSAgICBmckxheWVyTnVtIG5vblByZWZMYXllck51bTsKLSAgICAvL3ZpYUJveC5zZXQoMCwwLDAsMCk7Ci0gICAgLy9oYWxmV2lkdGggPSBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihsYXllck51bSktPmdldFdpZHRoKCkgLyAyOwotICAgIC8vcGxhbmFyQm94LnNldCgtaGFsZldpZHRoLCAtaGFsZldpZHRoLCBoYWxmV2lkdGgsIGhhbGZXaWR0aCk7Ci0gICAgaWYgKGxheWVyTnVtICsgMiA8PSBnZXRUZWNoKCktPmdldFRvcExheWVyTnVtKCkpIHsKLSAgICAgIG5vblByZWZMYXllck51bSA9IGxheWVyTnVtICsgMjsKLSAgICAgIC8vZFZpYS5zZXRWaWFEZWYoZ2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0TGF5ZXIobGF5ZXJOdW0gKyAxKS0+Z2V0RGVmYXVsdFZpYURlZigpKTsKLSAgICAgIC8vZFZpYS5nZXRCQm94KHZpYUJveCk7Ci0gICAgfSBlbHNlIGlmIChsYXllck51bSAtIDIgPj0gZ2V0VGVjaCgpLT5nZXRCb3R0b21MYXllck51bSgpKSB7Ci0gICAgICBub25QcmVmTGF5ZXJOdW0gPSBsYXllck51bSAtIDI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG5vblByZWZMYXllck51bSA9IGxheWVyTnVtOwotICAgIH0KLSAgICB5SWR4ID0gMDsKLSAgICBmb3IgKGF1dG8gJlt5Q29vcmQsIHlTdWJNYXBdOiB5TWFwKSB7Ci0gICAgICBhdXRvIHlJdCAgPSB5U3ViTWFwLmZpbmQobGF5ZXJOdW0pOwotICAgICAgYXV0byB5SXQyID0geVN1Yk1hcC5maW5kKGxheWVyTnVtKzIpOwotICAgICAgYXV0byB5SXQzID0geVN1Yk1hcC5maW5kKG5vblByZWZMYXllck51bSk7Ci0gICAgICBib29sIHlGb3VuZCAgPSAoeUl0ICE9IHlTdWJNYXAuZW5kKCkpOwotICAgICAgYm9vbCB5Rm91bmQyID0gKHlJdDIgIT0geVN1Yk1hcC5lbmQoKSk7Ci0gICAgICBib29sIHlGb3VuZDMgPSAoeUl0MyAhPSB5U3ViTWFwLmVuZCgpKTsKLSAgICAgIHhJZHggPSAwOwotICAgICAgZm9yIChhdXRvICZbeENvb3JkLCB4U3ViTWFwXTogeE1hcCkgewotICAgICAgICBhdXRvIHhJdCAgPSB4U3ViTWFwLmZpbmQobGF5ZXJOdW0pOwotICAgICAgICBhdXRvIHhJdDIgPSB4U3ViTWFwLmZpbmQobGF5ZXJOdW0rMik7Ci0gICAgICAgIGF1dG8geEl0MyA9IHhTdWJNYXAuZmluZChub25QcmVmTGF5ZXJOdW0pOwotICAgICAgICBib29sIHhGb3VuZCAgPSAoeEl0ICE9IHhTdWJNYXAuZW5kKCkpOwotICAgICAgICBib29sIHhGb3VuZDIgPSAoeEl0MiAhPSB4U3ViTWFwLmVuZCgpKTsKLSAgICAgICAgYm9vbCB4Rm91bmQzID0gKHhJdDMgIT0geFN1Yk1hcC5lbmQoKSk7Ci0KLSAgICAgICAgLy8gYWRkIGNvc3QgdG8gb3V0LW9mLWRpZSBlZGdlCi0gICAgICAgIC8veGZvcm0uc2V0KGZyUG9pbnQoeENvb3JkLCB5Q29vcmQpKTsKLSAgICAgICAgLy92aWFCb3gudHJhbnNmb3JtKHhmb3JtKTsKLSAgICAgICAgLy9wbGFuYXJCb3gudHJhbnNmb3JtKHhmb3JtKTsKLSAgICAgICAgLy9ib29sIG91dE9mRGllUGxhbmFyID0gIWJsb2NrQm94LmNvbnRhaW5zKHBsYW5hckJveCk7Ci0gICAgICAgIC8vYm9vbCBvdXRPZkRpZVZpYSAgICA9ICFibG9ja0JveC5jb250YWlucyh2aWFCb3gpOwotICAgICAgICBib29sIG91dE9mRGllUGxhbmFyID0gZmFsc2U7Ci0gICAgICAgIGJvb2wgb3V0T2ZEaWVWaWEgICAgPSBmYWxzZTsKLSAgICAgIC8vZm9yIChhdXRvICZbbGF5ZXJOdW0sIGRpcl06IHpNYXApIHsKLSAgICAgICAgLy8gYWRkIGVkZ2UgZm9yIHByZWZlcnJlZCBkaXJlY3Rpb24KLSAgICAgICAgaWYgKGRpciA9PSBmcmNIb3J6UHJlZlJvdXRpbmdEaXIgJiYgeUZvdW5kKSB7Ci0gICAgICAgICAgaWYgKGxheWVyTnVtID49IEJPVFRPTV9ST1VUSU5HX0xBWUVSKSB7Ci0gICAgICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgICAgIGlmIChoYXNFZGdlKHhJZHgsIHlJZHgsIHpJZHgsIGZyRGlyRW51bTo6RSkpIHsKLSAgICAgICAgICAgICAgICBjb3V0IDw8IkVycm9yOiAoIiA8PHhJZHggPDwiLCAiIDw8eUlkeCA8PCIsICIgPDx6SWR4IDw8IiwgRSkgYWxyZWFkeSBzZXQiIDw8ZW5kbDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmxhZyA9IGFkZEVkZ2UoeElkeCwgeUlkeCwgeklkeCwgZnJEaXJFbnVtOjpFLCBiYm94LCBpbml0RFIpOwotICAgICAgICAgICAgaWYgKHlJdC0+c2Vjb25kID09IG51bGxwdHIgfHwgb3V0T2ZEaWVQbGFuYXIpIHsKLSAgICAgICAgICAgICAgc2V0R3JpZENvc3RFKHhJZHgsIHlJZHgsIHpJZHgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgICAgICBpZiAoIWZsYWcpIHsKLSAgICAgICAgICAgICAgICBjb3V0IDw8ImVkZ2Ugb3V0IG9mIGJvdW5kICgiIDw8eElkeCA8PCIsICIgPDx5SWR4IDw8IiwgIiA8PHpJZHggPDwiLCBFKSIgPDxlbmRsOwotICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFoYXNFZGdlKHhJZHgsIHlJZHgsIHpJZHgsIGZyRGlyRW51bTo6RSkpIHsKLSAgICAgICAgICAgICAgICBjb3V0IDw8IkVycm9yOiAoIiA8PHhJZHggPDwiLCAiIDw8eUlkeCA8PCIsICIgPDx6SWR4IDw8IiwgRSkgbm90IHNldCIgPDxlbmRsOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChoYXNHcmlkQ29zdEUoeElkeCwgeUlkeCwgeklkeCkgIT0gKCh5SXQtPnNlY29uZCB8fCBvdXRPZkRpZVBsYW5hcikgPyBmYWxzZSA6IHRydWUpKSB7Ci0gICAgICAgICAgICAgICAgICBjb3V0IDw8ImNoZWNrIGVkZ2UgY29zdCBmYWlsZWQgKCIgPDx4SWR4IDw8IiwgIiA8PHlJZHggPDwiLCAiIDw8eklkeCA8PCIsIEUpICE9IDEiIDw8ZW5kbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY291dCA8PCJhZGQgZWRnZSAoIiA8PHhJZHggPDwiLCAiIDw8eUlkeCA8PCIsICIgPDx6SWR4IDw8IiwgRSkiIDw8ZW5kbDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICAvLyB2aWEgdG8gdXBwZXIgbGF5ZXIKLSAgICAgICAgICBpZiAoeEZvdW5kMikgewotICAgICAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgICAgICBpZiAoaGFzRWRnZSh4SWR4LCB5SWR4LCB6SWR4LCBmckRpckVudW06OlUpKSB7Ci0gICAgICAgICAgICAgICAgY291dCA8PCJFcnJvcjogKCIgPDx4SWR4IDw8IiwgIiA8PHlJZHggPDwiLCAiIDw8eklkeCA8PCIsIFUpIGFscmVhZHkgc2V0IiA8PGVuZGw7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZsYWcgPSBhZGRFZGdlKHhJZHgsIHlJZHgsIHpJZHgsIGZyRGlyRW51bTo6VSwgYmJveCwgaW5pdERSKTsKLSAgICAgICAgICAgIGJvb2wgY29uZGl0aW9uID0gKHlJdC0+c2Vjb25kID09IG51bGxwdHIgfHwgeEl0Mi0+c2Vjb25kID09IG51bGxwdHIpOwotICAgICAgICAgICAgaWYgKGNvbmRpdGlvbiB8fCBvdXRPZkRpZVZpYSkgewotICAgICAgICAgICAgICBzZXRHcmlkQ29zdFUoeElkeCwgeUlkeCwgeklkeCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgICAgIGlmICghZmxhZykgewotICAgICAgICAgICAgICAgIGNvdXQgPDwiZWRnZSBvdXQgb2YgYm91bmQgKCIgPDx4SWR4IDw8IiwgIiA8PHlJZHggPDwiLCAiIDw8eklkeCA8PCIsIFUpIiA8PGVuZGw7Ci0gICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWhhc0VkZ2UoeElkeCwgeUlkeCwgeklkeCwgZnJEaXJFbnVtOjpVKSkgewotICAgICAgICAgICAgICAgIGNvdXQgPDwiRXJyb3I6ICgiIDw8eElkeCA8PCIsICIgPDx5SWR4IDw8IiwgIiA8PHpJZHggPDwiLCBVKSBub3Qgc2V0IiA8PGVuZGw7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY291dCA8PCJhZGQgZWRnZSAoIiA8PHhJZHggPDwiLCAiIDw8eUlkeCA8PCIsICIgPDx6SWR4IDw8IiwgVSkiIDw8ZW5kbDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChkaXIgPT0gZnJjVmVydFByZWZSb3V0aW5nRGlyICYmIHhGb3VuZCkgewotICAgICAgICAgIGlmIChsYXllck51bSA+PSBCT1RUT01fUk9VVElOR19MQVlFUikgewotICAgICAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgICAgICBpZiAoaGFzRWRnZSh4SWR4LCB5SWR4LCB6SWR4LCBmckRpckVudW06Ok4pKSB7Ci0gICAgICAgICAgICAgICAgY291dCA8PCJFcnJvcjogKCIgPDx4SWR4IDw8IiwgIiA8PHlJZHggPDwiLCAiIDw8eklkeCA8PCIsIE4pIGFscmVhZHkgc2V0IiA8PGVuZGw7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZsYWcgPSBhZGRFZGdlKHhJZHgsIHlJZHgsIHpJZHgsIGZyRGlyRW51bTo6TiwgYmJveCwgaW5pdERSKTsKLSAgICAgICAgICAgIGlmICh4SXQtPnNlY29uZCA9PSBudWxscHRyIHx8IG91dE9mRGllUGxhbmFyKSB7Ci0gICAgICAgICAgICAgIHNldEdyaWRDb3N0Tih4SWR4LCB5SWR4LCB6SWR4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICAgICAgaWYgKCFmbGFnKSB7Ci0gICAgICAgICAgICAgICAgY291dCA8PCJlZGdlIG91dCBvZiBib3VuZCAoIiA8PHhJZHggPDwiLCAiIDw8eUlkeCA8PCIsICIgPDx6SWR4IDw8IiwgTikiIDw8ZW5kbDsKLSAgICAgICAgICAgICAgfSBlbHNlIGlmICghaGFzRWRnZSh4SWR4LCB5SWR4LCB6SWR4LCBmckRpckVudW06Ok4pKSB7Ci0gICAgICAgICAgICAgICAgY291dCA8PCJFcnJvcjogKCIgPDx4SWR4IDw8IiwgIiA8PHlJZHggPDwiLCAiIDw8eklkeCA8PCIsIE4pIG5vdCBzZXQiIDw8ZW5kbDsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoaGFzR3JpZENvc3ROKHhJZHgsIHlJZHgsIHpJZHgpICE9ICgoeEl0LT5zZWNvbmQgfHwgb3V0T2ZEaWVQbGFuYXIpID8gZmFsc2UgOiB0cnVlKSkgewotICAgICAgICAgICAgICAgICAgY291dCA8PCJjaGVjayBlZGdlIGNvc3QgZmFpbGVkICgiIDw8eElkeCA8PCIsICIgPDx5SWR4IDw8IiwgIiA8PHpJZHggPDwiLCBOKSAhPSAxIiA8PGVuZGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvdXQgPDwiYWRkIGVkZ2UgKCIgPDx4SWR4IDw8IiwgIiA8PHlJZHggPDwiLCAiIDw8eklkeCA8PCIsIE4pIiA8PGVuZGw7Ci0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICAvLyB2aWEgdG8gdXBwZXIgbGF5ZXIKLSAgICAgICAgICBpZiAoeUZvdW5kMikgewotICAgICAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgICAgICBpZiAoaGFzRWRnZSh4SWR4LCB5SWR4LCB6SWR4LCBmckRpckVudW06OlUpKSB7Ci0gICAgICAgICAgICAgICAgY291dCA8PCJFcnJvcjogKCIgPDx4SWR4IDw8IiwgIiA8PHlJZHggPDwiLCAiIDw8eklkeCA8PCIsIFUpIGFscmVhZHkgc2V0IiA8PGVuZGw7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZsYWcgPSBhZGRFZGdlKHhJZHgsIHlJZHgsIHpJZHgsIGZyRGlyRW51bTo6VSwgYmJveCwgaW5pdERSKTsKLSAgICAgICAgICAgIGJvb2wgY29uZGl0aW9uID0gKHlJdDItPnNlY29uZCA9PSBudWxscHRyIHx8IHhJdC0+c2Vjb25kID09IG51bGxwdHIpOwotICAgICAgICAgICAgaWYgKGNvbmRpdGlvbiB8fCBvdXRPZkRpZVZpYSkgewotICAgICAgICAgICAgICBzZXRHcmlkQ29zdFUoeElkeCwgeUlkeCwgeklkeCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgICAgIGlmICghZmxhZykgewotICAgICAgICAgICAgICAgIGNvdXQgPDwiZWRnZSBvdXQgb2YgYm91bmQgKCIgPDx4SWR4IDw8IiwgIiA8PHlJZHggPDwiLCAiIDw8eklkeCA8PCIsIFUpIiA8PGVuZGw7Ci0gICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWhhc0VkZ2UoeElkeCwgeUlkeCwgeklkeCwgZnJEaXJFbnVtOjpVKSkgewotICAgICAgICAgICAgICAgIGNvdXQgPDwiRXJyb3I6ICgiIDw8eElkeCA8PCIsICIgPDx5SWR4IDw8IiwgIiA8PHpJZHggPDwiLCBVKSBub3Qgc2V0IiA8PGVuZGw7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY291dCA8PCJhZGQgZWRnZSAoIiA8PHhJZHggPDwiLCAiIDw8eUlkeCA8PCIsICIgPDx6SWR4IDw8IiwgVSkiIDw8ZW5kbDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBnZXQgbm9uIHByZWYgdHJhY2sgbGF5ZXIgLS0+IHVzZSB1cHBlciBsYXllciBwcmVmIGRpciB0cmFjayBpZiBwb3NzaWJsZQotICAgICAgICBpZiAoVVNFTk9OUFJFRlRSQUNLUykgewotICAgICAgICAgIC8vIGFkZCBlZGdlIGZvciBub24tcHJlZmVycmVkIGRpcmVjdGlvbgotICAgICAgICAgIC8vIHZlcnRpY2FsIG5vbi1wcmVmIHRyYWNrCi0gICAgICAgICAgaWYgKGRpciA9PSBmcmNIb3J6UHJlZlJvdXRpbmdEaXIgJiYgeEZvdW5kMykgewotICAgICAgICAgICAgaWYgKGxheWVyTnVtID49IEJPVFRPTV9ST1VUSU5HX0xBWUVSKSB7Ci0gICAgICAgICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICAgICAgICBpZiAoaGFzRWRnZSh4SWR4LCB5SWR4LCB6SWR4LCBmckRpckVudW06Ok4pKSB7Ci0gICAgICAgICAgICAgICAgICBjb3V0IDw8IkVycm9yOiAoIiA8PHhJZHggPDwiLCAiIDw8eUlkeCA8PCIsICIgPDx6SWR4IDw8IiwgTikgYWxyZWFkeSBzZXQiIDw8ZW5kbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZmxhZyA9IGFkZEVkZ2UoeElkeCwgeUlkeCwgeklkeCwgZnJEaXJFbnVtOjpOLCBiYm94LCBpbml0RFIpOwotICAgICAgICAgICAgICBzZXRHcmlkQ29zdE4oeElkeCwgeUlkeCwgeklkeCk7Ci0gICAgICAgICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWZsYWcpIHsKLSAgICAgICAgICAgICAgICAgIGNvdXQgPDwiZWRnZSBvdXQgb2YgYm91bmQgKCIgPDx4SWR4IDw8IiwgIiA8PHlJZHggPDwiLCAiIDw8eklkeCA8PCIsIE4pIiA8PGVuZGw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghaGFzRWRnZSh4SWR4LCB5SWR4LCB6SWR4LCBmckRpckVudW06Ok4pKSB7Ci0gICAgICAgICAgICAgICAgICBjb3V0IDw8IkVycm9yOiAoIiA8PHhJZHggPDwiLCAiIDw8eUlkeCA8PCIsICIgPDx6SWR4IDw8IiwgTikgbm90IHNldCIgPDxlbmRsOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICBpZiAoIWhhc0dyaWRDb3N0Tih4SWR4LCB5SWR4LCB6SWR4KSkgewotICAgICAgICAgICAgICAgICAgICBjb3V0IDw8ImNoZWNrIGVkZ2UgY29zdCBmYWlsZWQgKCIgPDx4SWR4IDw8IiwgIiA8PHlJZHggPDwiLCAiIDw8eklkeCA8PCIsIE4pICE9IDEiIDw8ZW5kbDsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGNvdXQgPDwiYWRkIGVkZ2UgKCIgPDx4SWR4IDw8IiwgIiA8PHlJZHggPDwiLCAiIDw8eklkeCA8PCIsIE4pIiA8PGVuZGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgLy8gaG9yaXpvbnRhbCBub24tcHJlZiB0cmFjawotICAgICAgICAgIH0gZWxzZSBpZiAoZGlyID09IGZyY1ZlcnRQcmVmUm91dGluZ0RpciAmJiB5Rm91bmQzKSB7Ci0gICAgICAgICAgICBpZiAobGF5ZXJOdW0gPj0gQk9UVE9NX1JPVVRJTkdfTEFZRVIpIHsKLSAgICAgICAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgICAgICAgIGlmIChoYXNFZGdlKHhJZHgsIHlJZHgsIHpJZHgsIGZyRGlyRW51bTo6RSkpIHsKLSAgICAgICAgICAgICAgICAgIGNvdXQgPDwiRXJyb3I6ICgiIDw8eElkeCA8PCIsICIgPDx5SWR4IDw8IiwgIiA8PHpJZHggPDwiLCBFKSBhbHJlYWR5IHNldCIgPDxlbmRsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBmbGFnID0gYWRkRWRnZSh4SWR4LCB5SWR4LCB6SWR4LCBmckRpckVudW06OkUsIGJib3gsIGluaXREUik7Ci0gICAgICAgICAgICAgIHNldEdyaWRDb3N0RSh4SWR4LCB5SWR4LCB6SWR4KTsKLSAgICAgICAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgICAgICAgIGlmICghZmxhZykgewotICAgICAgICAgICAgICAgICAgY291dCA8PCJlZGdlIG91dCBvZiBib3VuZCAoIiA8PHhJZHggPDwiLCAiIDw8eUlkeCA8PCIsICIgPDx6SWR4IDw8IiwgRSkiIDw8ZW5kbDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFoYXNFZGdlKHhJZHgsIHlJZHgsIHpJZHgsIGZyRGlyRW51bTo6RSkpIHsKLSAgICAgICAgICAgICAgICAgIGNvdXQgPDwiRXJyb3I6ICgiIDw8eElkeCA8PCIsICIgPDx5SWR4IDw8IiwgIiA8PHpJZHggPDwiLCBFKSBub3Qgc2V0IiA8PGVuZGw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgIGlmICghaGFzR3JpZENvc3RFKHhJZHgsIHlJZHgsIHpJZHgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvdXQgPDwiY2hlY2sgZWRnZSBjb3N0IGZhaWxlZCAoIiA8PHhJZHggPDwiLCAiIDw8eUlkeCA8PCIsICIgPDx6SWR4IDw8IiwgRSkgIT0gMSIgPDxlbmRsOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgY291dCA8PCJhZGQgZWRnZSAoIiA8PHhJZHggPDwiLCAiIDw8eUlkeCA8PCIsICIgPDx6SWR4IDw8IiwgRSkiIDw8ZW5kbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgKyt4SWR4OwotICAgICAgfQotICAgICAgKyt5SWR4OwotICAgIH0KLSAgICArK3pJZHg7Ci0gIH0KLX0KLQotCi0vLyBpbml0aWFsaXphdGlvbjogdXBkYXRlIGdyaWQgZ3JhcGggdG9wb2xvZ3ksIGRvZXMgbm90IGFzc2lnbiBlZGdlIGNvc3QKLXZvaWQgRmxleEdyaWRHcmFwaDo6aW5pdChjb25zdCBmckJveCAmcm91dGVCQm94LCBjb25zdCBmckJveCAmZXh0QkJveCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8ZnJDb29yZCwgbWFwPGZyTGF5ZXJOdW0sIGZyVHJhY2tQYXR0ZXJuKiA+ID4gJnhNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWFwPGZyQ29vcmQsIG1hcDxmckxheWVyTnVtLCBmclRyYWNrUGF0dGVybiogPiA+ICZ5TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5pdERSKSB7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIC8vIGdldCB0cmFja3MgaW50ZXJzZWN0aW5nIHdpdGggdGhlIE1hemUgYmJveAotICBtYXA8ZnJMYXllck51bSwgZnJQcmVmUm91dGluZ0RpckVudW0+IHpNYXA7Ci0gIGluaXRUcmFja3MoeE1hcCwgeU1hcCwgek1hcCwgZXh0QkJveCk7Ci0gIGluaXRHcmlkcyh4TWFwLCB5TWFwLCB6TWFwKTsgLy8gYnVpbGRHcmlkR3JhcGgKLSAgaW5pdEVkZ2VzKHhNYXAsIHlNYXAsIHpNYXAsIHJvdXRlQkJveCwgaW5pdERSKTsgLy8gYWRkIGVkZ2VzIGFuZCBlZGdlQ29zdAotICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgZm9yKGludCBpID0gMDsgaSA8IChpbnQpeENvb3Jkcy5zaXplKCk7IGkrKykgewotICAgICAgZm9yKGludCBqID0gMDsgaiA8IChpbnQpeUNvb3Jkcy5zaXplKCk7IGorKykgewotICAgICAgICBmb3IoaW50IGsgPSAwOyBrIDwgKGludCl6Q29vcmRzLnNpemUoKTsgaysrKSB7Ci0gICAgICAgICAgY291dCA8PCJ0ZXN0IHgveS96L0UvTi9VID0gIiAgPDxpIDw8IiAiIDw8aiA8PCIgIiA8PGsgPDwiICIKLSAgICAgICAgICAgICAgIDw8aGFzR3JpZENvc3RFKGksIGosIGspIDw8IiAiCi0gICAgICAgICAgICAgICA8PGhhc0dyaWRDb3N0TihpLCBqLCBrKSA8PCIgIgotICAgICAgICAgICAgICAgPDwiMCIgPDwiICIgPDxlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8vIGluaXRpYWxpemF0aW9uIGhlbHBlcnMKLS8vIGdldCBhbGwgdHJhY2tzIGluZXRlcnNlY3Rpbmcgd2l0aCB0aGUgTWF6ZSBiYm94LCBsZWZ0L2JvdHRvbSBhcmUgaW5jbHVzaXZlCi12b2lkIEZsZXhHcmlkR3JhcGg6OmluaXRUcmFja3MobWFwPGZyQ29vcmQsIG1hcDxmckxheWVyTnVtLCBmclRyYWNrUGF0dGVybiogPiA+ICZ4TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxmckNvb3JkLCBtYXA8ZnJMYXllck51bSwgZnJUcmFja1BhdHRlcm4qID4gPiAmeU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8ZnJMYXllck51bSwgZnJQcmVmUm91dGluZ0RpckVudW0+ICZ6TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyQm94ICZiYm94KSB7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIC8vYm9vbCBlbmFibGVPdXRwdXQgPSB0cnVlOwotICBmb3IgKGF1dG8gJmxheWVyOiBnZXRUZWNoKCktPmdldExheWVycygpKSB7Ci0gICAgaWYgKGxheWVyLT5nZXRUeXBlKCkgIT0gZnJMYXllclR5cGVFbnVtOjpST1VUSU5HKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgY291dCA8PCJpbml0VHJhY2tzOiAiIDw8bGF5ZXItPmdldE5hbWUoKSA8PGVuZGwgPDxmbHVzaDsKLSAgICB9Ci0gICAgZnJMYXllck51bSBjdXJyTGF5ZXJOdW0gPSBsYXllci0+Z2V0TGF5ZXJOdW0oKTsKLSAgICBmclByZWZSb3V0aW5nRGlyRW51bSBjdXJyUHJlZlJvdXRlRGlyID0gbGF5ZXItPmdldERpcigpOwotICAgIC8vYm9vbCBoYXNUcmFjayA9IGZhbHNlOwotICAgIGZvciAoYXV0byAmdHA6IGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXRUcmFja1BhdHRlcm5zKGN1cnJMYXllck51bSkpIHsKLSAgICAgIGJvb2wgZmxhZyA9IFVTRU5PTlBSRUZUUkFDS1MgPyAKLSAgICAgICAgICAgICAgICAgICh0cC0+aXNIb3Jpem9udGFsKCkgICYmIGN1cnJQcmVmUm91dGVEaXIgPT0gZnJjVmVydFByZWZSb3V0aW5nRGlyIHx8Ci0gICAgICAgICAgICAgICAgICAhdHAtPmlzSG9yaXpvbnRhbCgpICYmIGN1cnJQcmVmUm91dGVEaXIgPT0gZnJjSG9yelByZWZSb3V0aW5nRGlyKSA6IAotICAgICAgICAgICAgICAgICAgdHJ1ZTsKLSAgICAgIGlmIChmbGFnKSB7Ci0gICAgICAgIC8vY291dCA8PCJjaGVja1BvaW50IDEiIDw8ZW5kbCA8PGZsdXNoOwotICAgICAgICBpbnQgdHJhY2tOdW0gPSAoKHRwLT5pc0hvcml6b250YWwoKSA/IGJib3gubGVmdCgpIDogYmJveC5ib3R0b20oKSkgLSB0cC0+Z2V0U3RhcnRDb29yZCgpKSAvIChpbnQpdHAtPmdldFRyYWNrU3BhY2luZygpOwotICAgICAgICBpZiAodHJhY2tOdW0gPCAwKSB7Ci0gICAgICAgICAgdHJhY2tOdW0gPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0cmFja051bSAqIChpbnQpdHAtPmdldFRyYWNrU3BhY2luZygpICsgdHAtPmdldFN0YXJ0Q29vcmQoKSA8ICh0cC0+aXNIb3Jpem9udGFsKCkgPyBiYm94LmxlZnQoKSA6IGJib3guYm90dG9tKCkpKSB7Ci0gICAgICAgICAgKyt0cmFja051bTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKDsgCi0gICAgICAgICAgICAgdHJhY2tOdW0gPCAoaW50KXRwLT5nZXROdW1UcmFja3MoKSAmJiAKLSAgICAgICAgICAgICB0cmFja051bSAqIChpbnQpdHAtPmdldFRyYWNrU3BhY2luZygpICsgdHAtPmdldFN0YXJ0Q29vcmQoKSA8ICh0cC0+aXNIb3Jpem9udGFsKCkgPyBiYm94LnJpZ2h0KCkgOiBiYm94LnRvcCgpKTsgCi0gICAgICAgICAgICAgKyt0cmFja051bSkgewotICAgICAgICAgIGZyQ29vcmQgdHJhY2tMb2MgPSB0cmFja051bSAqIHRwLT5nZXRUcmFja1NwYWNpbmcoKSArIHRwLT5nZXRTdGFydENvb3JkKCk7Ci0gICAgICAgICAgLy9jb3V0IDw8ImNoZWNrUG9pbnQgMiIgPDxlbmRsIDw8Zmx1c2g7Ci0gICAgICAgICAgLy9oYXNUcmFjayA9IHRydWU7Ci0gICAgICAgICAgaWYgKHRwLT5pc0hvcml6b250YWwoKSkgewotICAgICAgICAgICAgeE1hcFt0cmFja0xvY11bY3VyckxheWVyTnVtXSA9IHRwLmdldCgpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB5TWFwW3RyYWNrTG9jXVtjdXJyTGF5ZXJOdW1dID0gdHAuZ2V0KCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vaWYgKGhhc1RyYWNrKSB7Ci0gICAgICAvL2NvdXQgPDwiY2hlY2tQb2ludCAzIiA8PGVuZGwgPDxmbHVzaDsKLSAgICAgIHpNYXBbY3VyckxheWVyTnVtXSA9IGN1cnJQcmVmUm91dGVEaXI7Ci0gICAgLy99Ci0gIH0KLSAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgIGNvdXQgPDwiZmluaXNoIGluaXRUcmFja3MiIDw8ZW5kbCA8PGZsdXNoOwotICB9Ci19Ci0KLXZvaWQgRmxleEdyaWRHcmFwaDo6cmVzZXRTdGF0dXMoKSB7Ci0gIC8vZnJNSWR4IHhEaW0sIHlEaW0sIHpEaW07Ci0gIC8vZ2V0RGltKHhEaW0sIHlEaW0sIHpEaW0pOwotICAvL2ZvciAoZnJNSWR4IHogPSAwOyB6IDwgekRpbTsgeisrKSB7Ci0gIC8vICBmb3IgKGZyTUlkeCB5ID0gMDsgeSA8IHlEaW07IHkrKykgewotICAvLyAgICBmb3IgKGZyTUlkeCB4ID0gMDsgeCA8IHhEaW07IHgrKykgewotICAvLyAgICAgIC8vcmVzZXRTcmMoeCwgeSwgeik7Ci0gIC8vICAgICAgLy9yZXNldERzdCh4LCB5LCB6KTsKLSAgLy8gICAgICBzZXRQcmV2QXN0YXJOb2RlRGlyKHgsIHksIHosIGZyRGlyRW51bTo6VU5LTk9XTik7Ci0gIC8vICAgIH0KLSAgLy8gIH0KLSAgLy99Ci0gIHJlc2V0U3JjKCk7Ci0gIHJlc2V0RHN0KCk7Ci0gIHJlc2V0UHJldk5vZGVEaXIoKTsKLX0KLQotdm9pZCBGbGV4R3JpZEdyYXBoOjpyZXNldFNyYygpIHsKLSAgc3Jjcy5hc3NpZ24oc3Jjcy5zaXplKCksIDApOwotfQotCi12b2lkIEZsZXhHcmlkR3JhcGg6OnJlc2V0RHN0KCkgewotICBkc3RzLmFzc2lnbihkc3RzLnNpemUoKSwgMCk7Ci19Ci0KLXZvaWQgRmxleEdyaWRHcmFwaDo6cmVzZXRQcmV2Tm9kZURpcigpIHsKLSAgLy9mck1JZHggeERpbSwgeURpbSwgekRpbTsKLSAgLy9nZXREaW0oeERpbSwgeURpbSwgekRpbSk7Ci0gIC8vZm9yIChmck1JZHggeiA9IDA7IHogPCB6RGltOyB6KyspIHsKLSAgLy8gIGZvciAoZnJNSWR4IHkgPSAwOyB5IDwgeURpbTsgeSsrKSB7Ci0gIC8vICAgIGZvciAoZnJNSWR4IHggPSAwOyB4IDwgeERpbTsgeCsrKSB7Ci0gIC8vICAgICAgc2V0UHJldkFzdGFyTm9kZURpcih4LCB5LCB6LCBmckRpckVudW06OlVOS05PV04pOwotICAvLyAgICB9Ci0gIC8vICB9Ci0gIC8vfQotICBwcmV2RGlycy5hc3NpZ24ocHJldkRpcnMuc2l6ZSgpLCAwKTsKLX0KLQotLy8gcHJpbnQgdGhlIGdyaWQgZ3JhcGggd2l0aCBlZGdlIGFuZCB2ZXJ0ZXggZm9yIGRlYnVnIHB1cnBvc2UKLXZvaWQgRmxleEdyaWRHcmFwaDo6cHJpbnQoKSB7Ci0gIG9mc3RyZWFtIG1hemVMb2coT1VUX01BWkVfRklMRS5jX3N0cigpKTsKLSAgaWYgKG1hemVMb2cuaXNfb3BlbigpKSB7Ci0gICAgLy8gcHJpbnQgZWRnZXMKLSAgICBmckJveCBncmlkQkJveDsKLSAgICBnZXRCQm94KGdyaWRCQm94KTsKLSAgICBtYXplTG9nIDw8ICJwcmludGluZyBNYXplIGdyaWQgKCIgPDwgZ3JpZEJCb3gubGVmdCgpICA8PCAiLCAiIDw8IGdyaWRCQm94LmJvdHRvbSgpIDw8ICIpIC0tICgiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBncmlkQkJveC5yaWdodCgpIDw8ICIsICIgPDwgZ3JpZEJCb3gudG9wKCkgICAgPDwgIilcbiI7Ci0gICAgZnJNSWR4IHhEaW0sIHlEaW0sIHpEaW07Ci0gICAgZ2V0RGltKHhEaW0sIHlEaW0sIHpEaW0pOwotCi0gICAgaWYgKHhEaW0gPT0gMCB8fCB5RGltID09IDAgfHwgekRpbSA9PSAwKSB7Ci0gICAgICBjb3V0IDw8ICJFcnJvcjogZGltZW5zaW9uID09IDBcbiI7Ci0gICAgICByZXR1cm47Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvdXQgPDwgIih4RGltLCB5RGltLCB6RGltKSA9ICgiIDw8IHhEaW0gPDwgIiwgIiA8PCB5RGltIDw8ICIsICIgPDwgekRpbSA8PCAiKVxuIjsKLSAgICB9Ci0KLSAgICAvLyBtYXplTG9nIDw8ICJ4RGltID0gIiA8PCB4RGltIDw8ICIsIHlEaW0gPSAiIDw8IHlEaW0gPDwgIiwgekRpbSA9ICIgPDwgekRpbSA8PCAiXG4iOwotCi0gICAgZnJQb2ludCBwOwotICAgIGZvciAoZnJNSWR4IHhJZHggPSAwOyB4SWR4IDwgeERpbTsgKyt4SWR4KSB7Ci0gICAgICAvLyBtYXplTG9nIDw8ICJ4eHhJZHggPSAiIDw8IHhJZHggPDwgIlxuIiA8PCBzdGQ6OmZsdXNoOwotICAgICAgZm9yIChmck1JZHggeUlkeCA9IDA7IHlJZHggPCB5RGltOyArK3lJZHgpIHsKLSAgICAgICAgZm9yIChmck1JZHggeklkeCA9IDA7IHpJZHggPCB6RGltOyArK3pJZHgpIHsKLSAgICAgICAgICAvLyBtYXplTG9nIDw8ICJ4SWR4ID0gIiA8PCB4SWR4IDw8ICIsIHlJZHggPSAiIDw8IHlJZHggPDwgIiwgeklkeCA9ICIgPDwgeklkeCA8PCAiXG4iIDw8IHN0ZDo6Zmx1c2g7Ci0gICAgICAgICAgaWYgKGhhc0VkZ2UoeElkeCwgeUlkeCwgeklkeCwgZnJEaXJFbnVtOjpOKSkgewotICAgICAgICAgICAgaWYgKHlJZHggKyAxID49IHlEaW0pIHsKLSAgICAgICAgICAgICAgY291dCA8PCJFcnJvcjogbm8gZWRnZSAoIiA8PHhJZHggPDwiLCAiIDw8eUlkeCA8PCIsICIgPDx6SWR4IDw8IiwgTikgIiA8PHlEaW0gPDxlbmRsOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0gCi0gICAgICAgICAgICBtYXplTG9nIDw8ICJFZGdlOiAiIDw8IGdldFBvaW50KHAsIHhJZHgsIHlJZHgpLngoKSAgIDw8ICIgIiA8PCBnZXRQb2ludChwLCB4SWR4LCB5SWR4KS55KCkgICA8PCAiICIgPDwgeklkeAotICAgICAgICAgICAgICAgICAgICA8PCAiICIgICAgICA8PCBnZXRQb2ludChwLCB4SWR4LCB5SWR4KzEpLngoKSA8PCAiICIgPDwgZ2V0UG9pbnQocCwgeElkeCwgeUlkeCsxKS55KCkgPDwgIiAiIDw8IHpJZHggPDwgIlxuIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGhhc0VkZ2UoeElkeCwgeUlkeCwgeklkeCwgZnJEaXJFbnVtOjpFKSkgewotICAgICAgICAgICAgaWYgKHhJZHggKyAxID49IHhEaW0pIHsKLSAgICAgICAgICAgICAgY291dCA8PCJFcnJvcjogbm8gZWRnZSAoIiA8PHhJZHggPDwiLCAiIDw8eUlkeCA8PCIsICIgPDx6SWR4IDw8IiwgRSkgIiA8PCB4RGltIDw8ZW5kbDsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXplTG9nIDw8ICJFZGdlOiAiIDw8IGdldFBvaW50KHAsIHhJZHgsIHlJZHgpLngoKSAgIDw8ICIgIiA8PCBnZXRQb2ludChwLCB4SWR4LCB5SWR4KS55KCkgICA8PCAiICIgPDwgeklkeAotICAgICAgICAgICAgICAgICAgICA8PCAiICIgICAgICA8PCBnZXRQb2ludChwLCB4SWR4KzEsIHlJZHgpLngoKSA8PCAiICIgPDwgZ2V0UG9pbnQocCwgeElkeCsxLCB5SWR4KS55KCkgPDwgIiAiIDw8IHpJZHggPDwgIlxuIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGhhc0VkZ2UoeElkeCwgeUlkeCwgeklkeCwgZnJEaXJFbnVtOjpVKSkgewotICAgICAgICAgICAgaWYgKHpJZHggKyAxID49IHpEaW0pIHsKLSAgICAgICAgICAgICAgY291dCA8PCJFcnJvcjogbm8gZWRnZSAoIiA8PHhJZHggPDwiLCAiIDw8eUlkeCA8PCIsICIgPDx6SWR4IDw8IiwgVSkgIiA8PHpEaW0gPDxlbmRsOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hemVMb2cgPDwgIkVkZ2U6ICIgPDwgZ2V0UG9pbnQocCwgeElkeCwgeUlkeCkueCgpIDw8ICIgIiA8PCBnZXRQb2ludChwLCB4SWR4LCB5SWR4KS55KCkgPDwgIiAiIDw8IHpJZHgKLSAgICAgICAgICAgICAgICAgICAgPDwgIiAiICAgICAgPDwgZ2V0UG9pbnQocCwgeElkeCwgeUlkeCkueCgpIDw8ICIgIiA8PCBnZXRQb2ludChwLCB4SWR4LCB5SWR4KS55KCkgPDwgIiAiIDw8IHpJZHggKyAxIDw8ICJcbiI7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgewotICAgIGNvdXQgPDwgIkVycm9yOiBGYWlsIHRvIG9wZW4gbWF6ZSBsb2dcbiI7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZHIvRmxleEdyaWRHcmFwaC5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZHIvRmxleEdyaWRHcmFwaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODllN2I0Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RyL0ZsZXhHcmlkR3JhcGguaAorKysgL2Rldi9udWxsCkBAIC0xLDcwMCArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIF9GTEVYX0dSSURfR1JBUEhfSAotI2RlZmluZSBfRkxFWF9HUklEX0dSQVBIX0gKLQotI2RlZmluZSBHUklER1JBUEhEUkNDT1NUU0laRSA4Ci0KLSNpbmNsdWRlICJmckJhc2VUeXBlcy5oIgotI2luY2x1ZGUgIkZsZXhNYXplVHlwZXMuaCIKLSNpbmNsdWRlICJmckRlc2lnbi5oIgotI2luY2x1ZGUgImRiL2RyT2JqL2RyUGluLmgiCi0jaW5jbHVkZSAiZHIvRmxleFdhdmVmcm9udC5oIgotLy8jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLQotCi1uYW1lc3BhY2UgZnIgewotICBjbGFzcyBGbGV4R3JpZEdyYXBoIHsKLSAgcHVibGljOgotICAgIC8vIGNvbnN0cnVjdG9ycwotICAgIC8vRmxleEdyaWRHcmFwaCgpIHt9Ci0gICAgRmxleEdyaWRHcmFwaChmckRlc2lnbiogZGVzaWduSW4pOiBkZXNpZ24oZGVzaWduSW4pLyosIHJvdXRlQm94KCkqLywgYml0cygpLCAvKm1hemVNYXJrZXJzKCksKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhDb29yZHMoKSwgeUNvb3JkcygpLCB6Q29vcmRzKCksIHpIZWlnaHRzKCkge30KLSAgICAvLyBnZXR0ZXJzCi0gICAgZnJUZWNoT2JqZWN0KiBnZXRUZWNoKCkgY29uc3QgewotICAgICAgcmV0dXJuIGRlc2lnbi0+Z2V0VGVjaCgpOwotICAgIH0KLSAgICBmckRlc2lnbiogZ2V0RGVzaWduKCkgY29uc3QgewotICAgICAgcmV0dXJuIGRlc2lnbjsKLSAgICB9Ci0gICAgLy8gZ2V0dGVycwotICAgIC8vIHVuc2FmZSBhY2Nlc3MsIG5vIGNoZWNrCi0gICAgYm9vbCBpc0FzdGFyVmlzaXRlZChmck1JZHggeCwgZnJNSWR4IHksIGZyTUlkeCB6KSBjb25zdCB7Ci0gICAgICByZXR1cm4gKGdldFByZXZBc3Rhck5vZGVEaXIoeCwgeSwgeikgPT0gZnJEaXJFbnVtOjpVTktOT1dOKTsKLSAgICB9Ci0gICAgLy8gdW5zYWZlIGFjY2Vzcywgbm8gY2hlY2sKLSAgICBmckRpckVudW0gZ2V0UHJldkFzdGFyTm9kZURpcihmck1JZHggeCwgZnJNSWR4IHksIGZyTUlkeCB6KSBjb25zdCB7Ci0gICAgICBhdXRvIGJhc2VJZHggPSAzICogZ2V0SWR4KHgsIHksIHopOwotICAgICAgcmV0dXJuIChmckRpckVudW0pKCgodW5zaWduZWQgc2hvcnQpKHByZXZEaXJzW2Jhc2VJZHhdICAgICkgPDwgMikgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkIHNob3J0KShwcmV2RGlyc1tiYXNlSWR4ICsgMV0pIDw8IDEpICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCBzaG9ydCkocHJldkRpcnNbYmFzZUlkeCArIDJdKSA8PCAwKSk7Ci0gICAgfQotICAgIC8vIHVuc2FmZSBhY2Nlc3MsIG5vIGNoZWNrCi0gICAgYm9vbCBpc1NyYyhmck1JZHggeCwgZnJNSWR4IHksIGZyTUlkeCB6KSBjb25zdCB7Ci0gICAgICByZXR1cm4gc3Jjc1tnZXRJZHgoeCwgeSwgeildOwotICAgIH0KLSAgICAvLyB1bnNhZmUgYWNjZXNzLCBubyBjaGVjawotICAgIGJvb2wgaXNEc3QoZnJNSWR4IHgsIGZyTUlkeCB5LCBmck1JZHggeikgY29uc3QgewotICAgICAgcmV0dXJuIGRzdHNbZ2V0SWR4KHgsIHksIHopXTsKLSAgICB9Ci0gICAgLy8gdW5zYWZlIGFjY2Vzcywgbm8gY2hlY2sKLSAgICAvL2Jvb2wgaXNCbG9ja2VkKGZyTUlkeCB4LCBmck1JZHggeSwgZnJNSWR4IHopIGNvbnN0IHsKLSAgICAvLyAgcmV0dXJuIGdldEJpdChnZXRJZHgoeCwgeSwgeiksIDUpOwotICAgIC8vfQotICAgIC8vIHVuc2FmZSBhY2Nlc3MsIG5vIGNoZWNrCi0gICAgYm9vbCBpc1NWaWEoZnJNSWR4IHgsIGZyTUlkeCB5LCBmck1JZHggeikgY29uc3QgewotICAgICAgcmV0dXJuIGdldEJpdChnZXRJZHgoeCwgeSwgeiksIDkpOwotICAgIH0KLSAgICAvLyB1bnNhZmUgYWNjZXNzLCBubyBjaGVjawotICAgIGJvb2wgaGFzU2hhcGVQbGFuYXIoZnJNSWR4IHgsIGZyTUlkeCB5LCBmck1JZHggeikgY29uc3QgewotICAgICAgcmV0dXJuIGdldEJpdChnZXRJZHgoeCwgeSwgeiksIDEwKTsKLSAgICB9Ci0gICAgLy8gdW5zYWZlIGFjY2Vzcywgbm8gY2hlY2sKLSAgICBib29sIGhhc1NoYXBlVmlhKGZyTUlkeCB4LCBmck1JZHggeSwgZnJNSWR4IHopIGNvbnN0IHsKLSAgICAgIHJldHVybiBnZXRCaXQoZ2V0SWR4KHgsIHksIHopLCAxMSk7Ci0gICAgfQotICAgIC8vIHVuc2FmZSBhY2Nlc3MsIG5vIGNoZWNrCi0gICAgYm9vbCBoYXNHcmlkQ29zdEUoZnJNSWR4IHgsIGZyTUlkeCB5LCBmck1JZHggeikgY29uc3QgewotICAgICAgcmV0dXJuIGdldEJpdChnZXRJZHgoeCwgeSwgeiksIDEyKTsKLSAgICB9Ci0gICAgLy8gdW5zYWZlIGFjY2Vzcywgbm8gY2hlY2sKLSAgICBib29sIGhhc0dyaWRDb3N0Tihmck1JZHggeCwgZnJNSWR4IHksIGZyTUlkeCB6KSBjb25zdCB7Ci0gICAgICByZXR1cm4gZ2V0Qml0KGdldElkeCh4LCB5LCB6KSwgMTMpOwotICAgIH0KLSAgICAvLyB1bnNhZmUgYWNjZXNzLCBubyBjaGVjawotICAgIGJvb2wgaGFzR3JpZENvc3RVKGZyTUlkeCB4LCBmck1JZHggeSwgZnJNSWR4IHopIGNvbnN0IHsKLSAgICAgIHJldHVybiBnZXRCaXQoZ2V0SWR4KHgsIHksIHopLCAxNCk7Ci0gICAgfQotCi0gICAgLy9jb25zdCBmckJveCYgZ2V0Um91dGVCb3goKSBjb25zdCB7Ci0gICAgLy8gIHJldHVybiByb3V0ZUJveDsKLSAgICAvL30KLSAgICB2b2lkIGdldEJCb3goZnJCb3ggJmluKSBjb25zdCB7Ci0gICAgICBpZiAoeENvb3Jkcy5zaXplKCkgJiYgeUNvb3Jkcy5zaXplKCkpIHsKLSAgICAgICAgaW4uc2V0KHhDb29yZHMuZnJvbnQoKSwgeUNvb3Jkcy5mcm9udCgpLCB4Q29vcmRzLmJhY2soKSwgeUNvb3Jkcy5iYWNrKCkpOwotICAgICAgfQotICAgIH0KLSAgICB2b2lkIGdldERpbShmck1JZHggJnhEaW0sIGZyTUlkeCAmeURpbSwgZnJNSWR4ICZ6RGltKSBjb25zdCB7Ci0gICAgICB4RGltID0geENvb3Jkcy5zaXplKCk7Ci0gICAgICB5RGltID0geUNvb3Jkcy5zaXplKCk7Ci0gICAgICB6RGltID0gekNvb3Jkcy5zaXplKCk7Ci0gICAgfQotICAgIC8vIHVuc2FmZSBhY2Nlc3MKLSAgICBmclBvaW50JiBnZXRQb2ludChmclBvaW50ICZpbiwgZnJNSWR4IHgsIGZyTUlkeCB5KSBjb25zdCB7Ci0gICAgICBpbi5zZXQoeENvb3Jkc1t4XSwgeUNvb3Jkc1t5XSk7Ci0gICAgICByZXR1cm4gaW47Ci0gICAgfQotICAgIC8vIHVuc2FmZSBhY2Nlc3MKLSAgICBmckxheWVyTnVtIGdldExheWVyTnVtKGZyTUlkeCB6KSBjb25zdCB7Ci0gICAgICByZXR1cm4gekNvb3Jkc1t6XTsKLSAgICB9Ci0gICAgYm9vbCBoYXNNYXplWElkeChmckNvb3JkIGluKSBjb25zdCB7Ci0gICAgICByZXR1cm4gc3RkOjpiaW5hcnlfc2VhcmNoKHhDb29yZHMuYmVnaW4oKSwgeENvb3Jkcy5lbmQoKSwgaW4pOwotICAgIH0KLSAgICBib29sIGhhc01hemVZSWR4KGZyQ29vcmQgaW4pIGNvbnN0IHsKLSAgICAgIHJldHVybiBzdGQ6OmJpbmFyeV9zZWFyY2goeUNvb3Jkcy5iZWdpbigpLCB5Q29vcmRzLmVuZCgpLCBpbik7Ci0gICAgfQotICAgIGJvb2wgaGFzTWF6ZVpJZHgoZnJMYXllck51bSBpbikgY29uc3QgewotICAgICAgcmV0dXJuIHN0ZDo6YmluYXJ5X3NlYXJjaCh6Q29vcmRzLmJlZ2luKCksIHpDb29yZHMuZW5kKCksIGluKTsKLSAgICB9Ci0gICAgYm9vbCBoYXNJZHgoY29uc3QgZnJQb2ludCAmcCwgZnJMYXllck51bSBsTnVtKSBjb25zdCB7Ci0gICAgICByZXR1cm4gKGhhc01hemVYSWR4KHAueCgpKSAmJiBoYXNNYXplWUlkeChwLnkoKSkgJiYgaGFzTWF6ZVpJZHgobE51bSkpOwotICAgIH0KLSAgICBib29sIGhhc01hemVJZHgoY29uc3QgZnJQb2ludCAmcCwgZnJMYXllck51bSBsTnVtKSBjb25zdCB7Ci0gICAgICByZXR1cm4gKGhhc01hemVYSWR4KHAueCgpKSAmJiBoYXNNYXplWUlkeChwLnkoKSkgJiYgaGFzTWF6ZVpJZHgobE51bSkpOwotICAgIH0KLSAgICBmck1JZHggZ2V0TWF6ZVhJZHgoZnJDb29yZCBpbikgY29uc3QgewotICAgICAgYXV0byBpdCA9IHN0ZDo6bG93ZXJfYm91bmQoeENvb3Jkcy5iZWdpbigpLCB4Q29vcmRzLmVuZCgpLCBpbik7Ci0gICAgICByZXR1cm4gaXQgLSB4Q29vcmRzLmJlZ2luKCk7Ci0gICAgfQotICAgIGZyTUlkeCBnZXRNYXplWUlkeChmckNvb3JkIGluKSBjb25zdCB7Ci0gICAgICBhdXRvIGl0ID0gc3RkOjpsb3dlcl9ib3VuZCh5Q29vcmRzLmJlZ2luKCksIHlDb29yZHMuZW5kKCksIGluKTsKLSAgICAgIHJldHVybiBpdCAtIHlDb29yZHMuYmVnaW4oKTsKLSAgICB9Ci0gICAgZnJNSWR4IGdldE1hemVaSWR4KGZyTGF5ZXJOdW0gaW4pIGNvbnN0IHsKLSAgICAgIGF1dG8gaXQgPSBzdGQ6Omxvd2VyX2JvdW5kKHpDb29yZHMuYmVnaW4oKSwgekNvb3Jkcy5lbmQoKSwgaW4pOwotICAgICAgcmV0dXJuIGl0IC0gekNvb3Jkcy5iZWdpbigpOwotICAgIH0KLSAgICBGbGV4TWF6ZUlkeCYgZ2V0TWF6ZUlkeChGbGV4TWF6ZUlkeCAmbUlkeCwgY29uc3QgZnJQb2ludCAmcCwgZnJMYXllck51bSBsYXllck51bSkgY29uc3QgewotICAgICAgbUlkeC5zZXQoZ2V0TWF6ZVhJZHgocC54KCkpLCBnZXRNYXplWUlkeChwLnkoKSksIGdldE1hemVaSWR4KGxheWVyTnVtKSk7Ci0gICAgICByZXR1cm4gbUlkeDsKLSAgICB9Ci0gICAgLy8gdW5zYWZlIGFjY2VzcywgeiBhbHdheXMgPSAwCi0gICAgdm9pZCBnZXRJZHhCb3goRmxleE1hemVJZHggJm1JZHgxLCBGbGV4TWF6ZUlkeCAmbUlkeDIsIGNvbnN0IGZyQm94ICZib3gpIGNvbnN0IHsKLSAgICAgIG1JZHgxLnNldChzdGQ6Omxvd2VyX2JvdW5kKHhDb29yZHMuYmVnaW4oKSwgeENvb3Jkcy5lbmQoKSwgYm94LmxlZnQoKSAgKSAtIHhDb29yZHMuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICBzdGQ6Omxvd2VyX2JvdW5kKHlDb29yZHMuYmVnaW4oKSwgeUNvb3Jkcy5lbmQoKSwgYm94LmJvdHRvbSgpKSAtIHlDb29yZHMuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICBtSWR4MS56KCkpOwotICAgICAgbUlkeDIuc2V0KGZyTUlkeChzdGQ6OnVwcGVyX2JvdW5kKHhDb29yZHMuYmVnaW4oKSwgeENvb3Jkcy5lbmQoKSwgYm94LnJpZ2h0KCkgKSAtIHhDb29yZHMuYmVnaW4oKSkgLSAxLAotICAgICAgICAgICAgICAgIGZyTUlkeChzdGQ6OnVwcGVyX2JvdW5kKHlDb29yZHMuYmVnaW4oKSwgeUNvb3Jkcy5lbmQoKSwgYm94LnRvcCgpICAgKSAtIHlDb29yZHMuYmVnaW4oKSkgLSAxLAotICAgICAgICAgICAgICAgIG1JZHgyLnooKSk7Ci0gICAgfQotICAgIGZyQ29vcmQgZ2V0WkhlaWdodChmck1JZHggaW4pIGNvbnN0IHsKLSAgICAgIHJldHVybiB6SGVpZ2h0c1tpbl07Ci0gICAgfQotICAgIGJvb2wgZ2V0WkRpcihmck1JZHggaW4pIGNvbnN0IHsKLSAgICAgIHJldHVybiB6RGlyc1tpbl07Ci0gICAgfQotICAgIGJvb2wgaGFzRWRnZShmck1JZHggeCwgZnJNSWR4IHksIGZyTUlkeCB6LCBmckRpckVudW0gZGlyKSBjb25zdCB7Ci0gICAgICBjb3JyZWN0KHgsIHksIHosIGRpcik7Ci0gICAgICBpZiAoaXNWYWxpZCh4LCB5LCB6KSkgewotICAgICAgICBhdXRvIGlkeCA9IGdldElkeCh4LCB5LCB6KTsKLSAgICAgICAgc3dpdGNoIChkaXIpIHsKLSAgICAgICAgICBjYXNlIGZyRGlyRW51bTo6RToKLSAgICAgICAgICAgIHJldHVybiBnZXRCaXQoaWR4LCAwKTsKLSAgICAgICAgICBjYXNlIGZyRGlyRW51bTo6TjoKLSAgICAgICAgICAgIHJldHVybiBnZXRCaXQoaWR4LCAxKTsKLSAgICAgICAgICBjYXNlIGZyRGlyRW51bTo6VToKLSAgICAgICAgICAgIHJldHVybiBnZXRCaXQoaWR4LCAyKTsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIGJvb2wgaGFzR3JpZENvc3QoZnJNSWR4IHgsIGZyTUlkeCB5LCBmck1JZHggeiwgZnJEaXJFbnVtIGRpcikgewotICAgICAgYm9vbCBzb2wgPSBmYWxzZTsKLSAgICAgIGNvcnJlY3QoeCwgeSwgeiwgZGlyKTsKLSAgICAgIHN3aXRjaChkaXIpIHsKLSAgICAgICAgY2FzZSBmckRpckVudW06OkU6IAotICAgICAgICAgIHNvbCA9IGhhc0dyaWRDb3N0RSh4LCB5LCB6KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBmckRpckVudW06Ok46Ci0gICAgICAgICAgc29sID0gaGFzR3JpZENvc3ROKHgsIHksIHopOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICBzb2wgPSBoYXNHcmlkQ29zdFUoeCwgeSwgeik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc29sOwotICAgIH0KLSAgICBib29sIGhhc1NoYXBlQ29zdChmck1JZHggeCwgZnJNSWR4IHksIGZyTUlkeCB6LCBmckRpckVudW0gZGlyKSB7Ci0gICAgICBib29sIHNvbCA9IGZhbHNlOwotICAgICAgaWYgKGRpciAhPSBmckRpckVudW06OkQgJiYgZGlyICE9IGZyRGlyRW51bTo6VSkgewotICAgICAgICByZXZlcnNlKHgsIHksIHosIGRpcik7Ci0gICAgICAgIHNvbCA9IGhhc1NoYXBlUGxhbmFyKHgsIHksIHopOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY29ycmVjdFUoeCwgeSwgeiwgZGlyKTsKLSAgICAgICAgc29sID0gaGFzU2hhcGVWaWEoeCwgeSwgeik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc29sOwotICAgIH0KLSAgICBib29sIGhhc0RSQ0Nvc3QoZnJNSWR4IHgsIGZyTUlkeCB5LCBmck1JZHggeiwgZnJEaXJFbnVtIGRpcikgewotICAgICAgZnJVSW50NCBzb2wgPSAwOwotICAgICAgaWYgKGRpciAhPSBmckRpckVudW06OkQgJiYgZGlyICE9IGZyRGlyRW51bTo6VSkgewotICAgICAgICByZXZlcnNlKHgsIHksIHosIGRpcik7Ci0gICAgICAgIGF1dG8gaWR4ID0gZ2V0SWR4KHgsIHksIHopOwotICAgICAgICBzb2wgPSAoZ2V0Qml0cyhpZHgsIDE2LCBHUklER1JBUEhEUkNDT1NUU0laRSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY29ycmVjdFUoeCwgeSwgeiwgZGlyKTsKLSAgICAgICAgYXV0byBpZHggPSBnZXRJZHgoeCwgeSwgeik7Ci0gICAgICAgIHNvbCA9IChnZXRCaXRzKGlkeCwgMjQsIEdSSURHUkFQSERSQ0NPU1RTSVpFKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gKHNvbCk7Ci0gICAgfQotICAgIGJvb2wgaGFzTWFya2VyQ29zdChmck1JZHggeCwgZnJNSWR4IHksIGZyTUlkeCB6LCBmckRpckVudW0gZGlyKSB7Ci0gICAgICBmclVJbnQ0IHNvbCA9IDA7Ci0gICAgICBpZiAoZGlyICE9IGZyRGlyRW51bTo6RCAmJiBkaXIgIT0gZnJEaXJFbnVtOjpVKSB7Ci0gICAgICAgIHJldmVyc2UoeCwgeSwgeiwgZGlyKTsKLSAgICAgICAgYXV0byBpZHggPSBnZXRJZHgoeCwgeSwgeik7Ci0gICAgICAgIHNvbCA9IChnZXRCaXRzKGlkeCwgMzIsIEdSSURHUkFQSERSQ0NPU1RTSVpFKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb3JyZWN0VSh4LCB5LCB6LCBkaXIpOwotICAgICAgICBhdXRvIGlkeCA9IGdldElkeCh4LCB5LCB6KTsKLSAgICAgICAgc29sID0gKGdldEJpdHMoaWR4LCA0MCwgR1JJREdSQVBIRFJDQ09TVFNJWkUpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiAoc29sKTsKLSAgICB9Ci0gICAgLy8gdW5zYWZlIGFjY2VzcwotICAgIGZyQ29vcmQgZ2V0RWRnZUxlbmd0aChmck1JZHggeCwgZnJNSWR4IHksIGZyTUlkeCB6LCBmckRpckVudW0gZGlyKSB7Ci0gICAgICBmckNvb3JkIHNvbCA9IDA7Ci0gICAgICBjb3JyZWN0KHgsIHksIHosIGRpcik7Ci0gICAgICAvL2lmIChpc1ZhbGlkKHgsIHksIHosIGRpcikpIHsKLSAgICAgICAgc3dpdGNoIChkaXIpIHsKLSAgICAgICAgICBjYXNlIGZyRGlyRW51bTo6RToKLSAgICAgICAgICAgIHNvbCA9IHhDb29yZHNbeCsxXSAtIHhDb29yZHNbeF07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIGZyRGlyRW51bTo6TjoKLSAgICAgICAgICAgIHNvbCA9IHlDb29yZHNbeSsxXSAtIHlDb29yZHNbeV07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIGZyRGlyRW51bTo6VToKLSAgICAgICAgICAgIHNvbCA9IHpIZWlnaHRzW3orMV0gLSB6SGVpZ2h0c1t6XTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICA7Ci0gICAgICAgIH0KLSAgICAgIC8vfQotICAgICAgcmV0dXJuIHNvbDsKLSAgICB9Ci0gICAgYm9vbCBpc0VkZ2VJbkJveChmck1JZHggeCwgZnJNSWR4IHksIGZyTUlkeCB6LCBmckRpckVudW0gZGlyLCBjb25zdCBmckJveCAmYm94LCBib29sIGluaXREUikgewotICAgICAgYm9vbCBzb2wgPSBmYWxzZTsKLSAgICAgIGNvcnJlY3QoeCwgeSwgeiwgZGlyKTsKLSAgICAgIGlmIChpc1ZhbGlkKHgsIHksIHosIGRpcikpIHsKLSAgICAgICAgYXV0byB4MSA9IHg7Ci0gICAgICAgIGF1dG8geTEgPSB5OwotICAgICAgICBhdXRvIHoxID0gejsKLSAgICAgICAgcmV2ZXJzZSh4MSwgeTEsIHoxLCBkaXIpOwotICAgICAgICBmclBvaW50IHB0LCBwdDE7Ci0gICAgICAgIGdldFBvaW50KHB0LCB4LCB5KTsKLSAgICAgICAgZ2V0UG9pbnQocHQxLCB4MSwgeTEpOwotICAgICAgICBpZiAoYm94LmNvbnRhaW5zKHB0KSAmJiBib3guY29udGFpbnMocHQxKSkgewotICAgICAgICAgIC8vIGluaXREUiBtdXN0IG5vdCB1c2UgdG9wIGFuZCByaWdodG1vc3QgdHJhY2sKLSAgICAgICAgICBpZiAoaW5pdERSICYmIAotICAgICAgICAgICAgICAoKGJveC5yaWdodCgpID09IHB0LngoKSAmJiBib3gucmlnaHQoKSA9PSBwdDEueCgpKSB8fAotICAgICAgICAgICAgICAgKGJveC50b3AoKSAgID09IHB0LnkoKSAmJiBib3gudG9wKCkgICA9PSBwdDEueSgpKSkpIHsKLSAgICAgICAgICAgIHNvbCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzb2wgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzb2wgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc29sID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc29sOwotICAgIH0KLSAgICAvLyBzZXR0ZXJzCi0gICAgYm9vbCBhZGRFZGdlKGZyTUlkeCB4LCBmck1JZHggeSwgZnJNSWR4IHosIGZyRGlyRW51bSBkaXIsIGNvbnN0IGZyQm94ICZib3gsIGJvb2wgaW5pdERSKSB7Ci0gICAgICBib29sIHNvbCA9IGZhbHNlOwotICAgICAgaWYgKCFpc0VkZ2VJbkJveCh4LCB5LCB6LCBkaXIsIGJveCwgaW5pdERSKSkgewotICAgICAgICBzb2wgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vY291dCA8PCJvcmlnIGVkZ2UgKCIgPDx4IDw8IiwgIiA8PHkgPDwiLCAiIDw8eiA8PCIsICIgPDxpbnQoZGlyKSA8PCIpIiA8PGVuZGw7Ci0gICAgICAgIGNvcnJlY3QoeCwgeSwgeiwgZGlyKTsKLSAgICAgICAgLy9jb3V0IDw8ImNvcnIgZWRnZSAoIiA8PHggPDwiLCAiIDw8eSA8PCIsICIgPDx6IDw8IiwgIiA8PGludChkaXIpIDw8IikiIDw8ZW5kbDsKLSAgICAgICAgaWYgKGlzVmFsaWQoeCwgeSwgeiwgZGlyKSkgewotICAgICAgICAgIGF1dG8gaWR4ID0gZ2V0SWR4KHgsIHksIHopOwotICAgICAgICAgIHN3aXRjaCAoZGlyKSB7Ci0gICAgICAgICAgICBjYXNlIGZyRGlyRW51bTo6RToKLSAgICAgICAgICAgICAgc2V0Qml0KGlkeCwgMCk7Ci0gICAgICAgICAgICAgIHNvbCA9IHRydWU7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBmckRpckVudW06Ok46Ci0gICAgICAgICAgICAgIHNldEJpdChpZHgsIDEpOwotICAgICAgICAgICAgICBzb2wgPSB0cnVlOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgZnJEaXJFbnVtOjpVOgotICAgICAgICAgICAgICBzZXRCaXQoaWR4LCAyKTsKLSAgICAgICAgICAgICAgc29sID0gdHJ1ZTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICA7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vY291dCA8PCJub3QgdmFsaWQgZWRnZSI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBzb2w7Ci0gICAgfQotICAgIGJvb2wgcmVtb3ZlRWRnZShmck1JZHggeCwgZnJNSWR4IHksIGZyTUlkeCB6LCBmckRpckVudW0gZGlyKSB7Ci0gICAgICBib29sIHNvbCA9IGZhbHNlOwotICAgICAgY29ycmVjdCh4LCB5LCB6LCBkaXIpOwotICAgICAgaWYgKGlzVmFsaWQoeCwgeSwgeiwgZGlyKSkgewotICAgICAgICBhdXRvIGlkeCA9IGdldElkeCh4LCB5LCB6KTsKLSAgICAgICAgc3dpdGNoIChkaXIpIHsKLSAgICAgICAgICBjYXNlIGZyRGlyRW51bTo6RToKLSAgICAgICAgICAgIHJlc2V0Qml0KGlkeCwgMCk7Ci0gICAgICAgICAgICBzb2wgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBmckRpckVudW06Ok46Ci0gICAgICAgICAgICByZXNldEJpdChpZHgsIDEpOwotICAgICAgICAgICAgc29sID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgZnJEaXJFbnVtOjpVOgotICAgICAgICAgICAgcmVzZXRCaXQoaWR4LCAyKTsKLSAgICAgICAgICAgIHNvbCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc29sOwotICAgIH0KLSAgICB2b2lkIGFkZERSQ0Nvc3RQbGFuYXIoZnJNSWR4IHgsIGZyTUlkeCB5LCBmck1JZHggeikgewotICAgICAgYXV0byBpZHggPSBnZXRJZHgoeCwgeSwgeik7Ci0gICAgICBhZGRUb0JpdHMoaWR4LCAxNiwgR1JJREdSQVBIRFJDQ09TVFNJWkUsIDEpOwotICAgIH0KLSAgICB2b2lkIGFkZERSQ0Nvc3RWaWEoZnJNSWR4IHgsIGZyTUlkeCB5LCBmck1JZHggeikgewotICAgICAgYXV0byBpZHggPSBnZXRJZHgoeCwgeSwgeik7Ci0gICAgICBhZGRUb0JpdHMoaWR4LCAyNCwgR1JJREdSQVBIRFJDQ09TVFNJWkUsIDEpOwotICAgIH0KLSAgICB2b2lkIHN1YkRSQ0Nvc3RQbGFuYXIoZnJNSWR4IHgsIGZyTUlkeCB5LCBmck1JZHggeikgewotICAgICAgYXV0byBpZHggPSBnZXRJZHgoeCwgeSwgeik7Ci0gICAgICBzdWJUb0JpdHMoaWR4LCAxNiwgR1JJREdSQVBIRFJDQ09TVFNJWkUsIDEpOwotICAgIH0KLSAgICB2b2lkIHN1YkRSQ0Nvc3RWaWEoZnJNSWR4IHgsIGZyTUlkeCB5LCBmck1JZHggeikgewotICAgICAgYXV0byBpZHggPSBnZXRJZHgoeCwgeSwgeik7Ci0gICAgICBzdWJUb0JpdHMoaWR4LCAyNCwgR1JJREdSQVBIRFJDQ09TVFNJWkUsIDEpOwotICAgIH0KLSAgICB2b2lkIHJlc2V0RFJDQ29zdFBsYW5hcihmck1JZHggeCwgZnJNSWR4IHksIGZyTUlkeCB6KSB7Ci0gICAgICBhdXRvIGlkeCA9IGdldElkeCh4LCB5LCB6KTsKLSAgICAgIHNldEJpdHMoaWR4LCAxNiwgR1JJREdSQVBIRFJDQ09TVFNJWkUsIDApOwotICAgIH0KLSAgICB2b2lkIHJlc2V0RFJDQ29zdFZpYShmck1JZHggeCwgZnJNSWR4IHksIGZyTUlkeCB6KSB7Ci0gICAgICBhdXRvIGlkeCA9IGdldElkeCh4LCB5LCB6KTsKLSAgICAgIHNldEJpdHMoaWR4LCAyNCwgR1JJREdSQVBIRFJDQ09TVFNJWkUsIDApOwotICAgIH0KLSAgICB2b2lkIGFkZE1hcmtlckNvc3RQbGFuYXIoZnJNSWR4IHgsIGZyTUlkeCB5LCBmck1JZHggeikgewotICAgICAgYXV0byBpZHggPSBnZXRJZHgoeCwgeSwgeik7Ci0gICAgICBhZGRUb0JpdHMoaWR4LCAzMiwgR1JJREdSQVBIRFJDQ09TVFNJWkUsIDEwKTsKLSAgICB9Ci0gICAgdm9pZCBhZGRNYXJrZXJDb3N0VmlhKGZyTUlkeCB4LCBmck1JZHggeSwgZnJNSWR4IHopIHsKLSAgICAgIGF1dG8gaWR4ID0gZ2V0SWR4KHgsIHksIHopOwotICAgICAgYWRkVG9CaXRzKGlkeCwgNDAsIEdSSURHUkFQSERSQ0NPU1RTSVpFLCAxMCk7Ci0gICAgfQotICAgIGJvb2wgZGVjYXlNYXJrZXJDb3N0UGxhbmFyKGZyTUlkeCB4LCBmck1JZHggeSwgZnJNSWR4IHosIGZsb2F0IGQpIHsKLSAgICAgIGF1dG8gaWR4ID0gZ2V0SWR4KHgsIHksIHopOwotICAgICAgaW50IGN1cnJDb3N0ID0gKGdldEJpdHMoaWR4LCAzMiwgR1JJREdSQVBIRFJDQ09TVFNJWkUpKTsKLSAgICAgIGN1cnJDb3N0ICo9IGQ7Ci0gICAgICBjdXJyQ29zdCA9IHN0ZDo6bWF4KDAsIGN1cnJDb3N0KTsKLSAgICAgIHNldEJpdHMoaWR4LCAzMiwgR1JJREdSQVBIRFJDQ09TVFNJWkUsIGN1cnJDb3N0KTsKLSAgICAgIHJldHVybiAoY3VyckNvc3QgPT0gMCk7Ci0gICAgfQotICAgIGJvb2wgZGVjYXlNYXJrZXJDb3N0VmlhKGZyTUlkeCB4LCBmck1JZHggeSwgZnJNSWR4IHosIGZsb2F0IGQpIHsKLSAgICAgIGF1dG8gaWR4ID0gZ2V0SWR4KHgsIHksIHopOwotICAgICAgaW50IGN1cnJDb3N0ID0gKGdldEJpdHMoaWR4LCA0MCwgR1JJREdSQVBIRFJDQ09TVFNJWkUpKTsKLSAgICAgIGN1cnJDb3N0ICo9IGQ7Ci0gICAgICBjdXJyQ29zdCA9IHN0ZDo6bWF4KDAsIGN1cnJDb3N0KTsKLSAgICAgIHNldEJpdHMoaWR4LCA0MCwgR1JJREdSQVBIRFJDQ09TVFNJWkUsIGN1cnJDb3N0KTsKLSAgICAgIHJldHVybiAoY3VyckNvc3QgPT0gMCk7Ci0gICAgfQotICAgIC8vdm9pZCByZXNldE1hcmtlckNvc3RQbGFuYXIoZnJNSWR4IHgsIGZyTUlkeCB5LCBmck1JZHggeikgewotICAgIC8vICBhdXRvIGlkeCA9IGdldElkeCh4LCB5LCB6KTsKLSAgICAvLyAgc2V0Qml0cyhpZHgsIDMyLCBHUklER1JBUEhEUkNDT1NUU0laRSwgMCk7Ci0gICAgLy99Ci0gICAgLy92b2lkIHJlc2V0TWFya2VyQ29zdFZpYShmck1JZHggeCwgZnJNSWR4IHksIGZyTUlkeCB6KSB7Ci0gICAgLy8gIGF1dG8gaWR4ID0gZ2V0SWR4KHgsIHksIHopOwotICAgIC8vICBzZXRCaXRzKGlkeCwgNDAsIEdSSURHUkFQSERSQ0NPU1RTSVpFLCAwKTsKLSAgICAvL30KLSAgICAvL3ZvaWQgcmVzZXRDb3N0KGZyTUlkeCB4LCBmck1JZHggeSwgZnJNSWR4IHopOwotCi0gICAgLy8gdW5zYWZlIGFjY2Vzcywgbm8gaWR4IGNoZWNrCi0gICAgdm9pZCBzZXRQcmV2QXN0YXJOb2RlRGlyKGZyTUlkeCB4LCBmck1JZHggeSwgZnJNSWR4IHosIGZyRGlyRW51bSBkaXIpIHsKLSAgICAgIGF1dG8gYmFzZUlkeCA9IDMgKiBnZXRJZHgoeCwgeSwgeik7Ci0gICAgICBwcmV2RGlyc1tiYXNlSWR4XSAgICAgPSAoKHVuc2lnbmVkIHNob3J0KWRpciA+PiAyKSAmIDE7Ci0gICAgICBwcmV2RGlyc1tiYXNlSWR4ICsgMV0gPSAoKHVuc2lnbmVkIHNob3J0KWRpciA+PiAxKSAmIDE7Ci0gICAgICBwcmV2RGlyc1tiYXNlSWR4ICsgMl0gPSAoKHVuc2lnbmVkIHNob3J0KWRpciAgICAgKSAmIDE7Ci0gICAgfQotICAgIC8vIHVuc2FmZSBhY2Nlc3MsIG5vIGlkeCBjaGVjawotICAgIHZvaWQgc2V0U3JjKGZyTUlkeCB4LCBmck1JZHggeSwgZnJNSWR4IHopIHsKLSAgICAgIHNyY3NbZ2V0SWR4KHgsIHksIHopXSA9IDE7Ci0gICAgfQotICAgIHZvaWQgc2V0U3JjKGNvbnN0IEZsZXhNYXplSWR4ICZtaSkgewotICAgICAgc3Jjc1tnZXRJZHgobWkueCgpLCBtaS55KCksIG1pLnooKSldID0gMTsKLSAgICB9Ci0gICAgLy8gdW5zYWZlIGFjY2Vzcywgbm8gaWR4IGNoZWNrCi0gICAgdm9pZCBzZXREc3QoZnJNSWR4IHgsIGZyTUlkeCB5LCBmck1JZHggeikgewotICAgICAgZHN0c1tnZXRJZHgoeCwgeSwgeildID0gMTsKLSAgICB9Ci0gICAgdm9pZCBzZXREc3QoY29uc3QgRmxleE1hemVJZHggJm1pKSB7Ci0gICAgICBkc3RzW2dldElkeChtaS54KCksIG1pLnkoKSwgbWkueigpKV0gPSAxOwotICAgIH0KLSAgICAvLyB1bnNhZmUgYWNjZXNzLCBubyBpZHggY2hlY2sKLSAgICAvL3ZvaWQgc2V0QmxvY2tlZChmck1JZHggeCwgZnJNSWR4IHksIGZyTUlkeCB6KSB7Ci0gICAgLy8gIHNldEJpdChnZXRJZHgoeCwgeSwgeiksIDUpOwotICAgIC8vfQotICAgIC8vIHVuc2FmZSBhY2Nlc3MKLSAgICB2b2lkIHNldFNWaWEoZnJNSWR4IHgsIGZyTUlkeCB5LCBmck1JZHggeikgewotICAgICAgc2V0Qml0KGdldElkeCh4LCB5LCB6KSwgOSk7Ci0gICAgfQotICAgIHZvaWQgc2V0U2hhcGVQbGFuYXIoZnJNSWR4IHgsIGZyTUlkeCB5LCBmck1JZHggeikgewotICAgICAgc2V0Qml0KGdldElkeCh4LCB5LCB6KSwgMTApOwotICAgIH0KLSAgICB2b2lkIHNldFNoYXBlVmlhKGZyTUlkeCB4LCBmck1JZHggeSwgZnJNSWR4IHopIHsKLSAgICAgIHNldEJpdChnZXRJZHgoeCwgeSwgeiksIDExKTsKLSAgICB9Ci0gICAgdm9pZCBzZXRHcmlkQ29zdEUoZnJNSWR4IHgsIGZyTUlkeCB5LCBmck1JZHggeikgewotICAgICAgc2V0Qml0KGdldElkeCh4LCB5LCB6KSwgMTIpOwotICAgIH0KLSAgICB2b2lkIHNldEdyaWRDb3N0Tihmck1JZHggeCwgZnJNSWR4IHksIGZyTUlkeCB6KSB7Ci0gICAgICBzZXRCaXQoZ2V0SWR4KHgsIHksIHopLCAxMyk7Ci0gICAgfQotICAgIHZvaWQgc2V0R3JpZENvc3RVKGZyTUlkeCB4LCBmck1JZHggeSwgZnJNSWR4IHopIHsKLSAgICAgIHNldEJpdChnZXRJZHgoeCwgeSwgeiksIDE0KTsKLSAgICB9Ci0gICAgLy8gdW5zYWZlIGFjY2Vzcywgbm8gaWR4IGNoZWNrCi0gICAgdm9pZCByZXNldFNyYyhmck1JZHggeCwgZnJNSWR4IHksIGZyTUlkeCB6KSB7Ci0gICAgICBzcmNzW2dldElkeCh4LCB5LCB6KV0gPSAwOwotICAgIH0KLSAgICB2b2lkIHJlc2V0U3JjKGNvbnN0IEZsZXhNYXplSWR4ICZtaSkgewotICAgICAgc3Jjc1tnZXRJZHgobWkueCgpLCBtaS55KCksIG1pLnooKSldID0gMDsKLSAgICB9Ci0gICAgLy8gdW5zYWZlIGFjY2Vzcywgbm8gaWR4IGNoZWNrCi0gICAgdm9pZCByZXNldERzdChmck1JZHggeCwgZnJNSWR4IHksIGZyTUlkeCB6KSB7Ci0gICAgICBkc3RzW2dldElkeCh4LCB5LCB6KV0gPSAwOwotICAgIH0KLSAgICB2b2lkIHJlc2V0RHN0KGNvbnN0IEZsZXhNYXplSWR4ICZtaSkgewotICAgICAgZHN0c1tnZXRJZHgobWkueCgpLCBtaS55KCksIG1pLnooKSldID0gMDsKLSAgICB9Ci0gICAgLy8gdW5zYWZlIGFjY2Vzcywgbm8gaWR4IGNoZWNrCi0gICAgLy92b2lkIHJlc2V0QmxvY2tlZChmck1JZHggeCwgZnJNSWR4IHksIGZyTUlkeCB6KSB7Ci0gICAgLy8gIHJlc2V0Qml0KGdldElkeCh4LCB5LCB6KSwgNSk7Ci0gICAgLy99Ci0gICAgLy8gdW5zYWZlIGFjY2VzcwotICAgIC8vdm9pZCByZXNldFNWaWEoZnJNSWR4IHgsIGZyTUlkeCB5LCBmck1JZHggeikgewotICAgIC8vICByZXNldEJpdChnZXRJZHgoeCwgeSwgeiksIDkpOwotICAgIC8vfQotICAgIC8vdm9pZCByZXNldFNoYXBlUGxhbmFyKGZyTUlkeCB4LCBmck1JZHggeSwgZnJNSWR4IHopIHsKLSAgICAvLyAgcmVzZXRCaXQoZ2V0SWR4KHgsIHksIHopLCAxMCk7Ci0gICAgLy99Ci0gICAgdm9pZCByZXNldFNoYXBlVmlhKGZyTUlkeCB4LCBmck1JZHggeSwgZnJNSWR4IHopIHsKLSAgICAgIHJlc2V0Qml0KGdldElkeCh4LCB5LCB6KSwgMTEpOwotICAgIH0KLSAgICAvL3ZvaWQgcmVzZXRHcmlkQ29zdEUoZnJNSWR4IHgsIGZyTUlkeCB5LCBmck1JZHggeikgewotICAgIC8vICByZXNldEJpdChnZXRJZHgoeCwgeSwgeiksIDEyKTsKLSAgICAvL30KLSAgICAvL3ZvaWQgcmVzZXRHcmlkQ29zdE4oZnJNSWR4IHgsIGZyTUlkeCB5LCBmck1JZHggeikgewotICAgIC8vICByZXNldEJpdChnZXRJZHgoeCwgeSwgeiksIDEzKTsKLSAgICAvL30KLSAgICAvL3ZvaWQgcmVzZXRHcmlkQ29zdFUoZnJNSWR4IHgsIGZyTUlkeCB5LCBmck1JZHggeikgewotICAgIC8vICByZXNldEJpdChnZXRJZHgoeCwgeSwgeiksIDE0KTsKLSAgICAvL30KLQotICAgIC8vdm9pZCBzZXRSb3V0ZUJveChjb25zdCBmckJveCAmaW4pIGNvbnN0IHsKLSAgICAvLyAgcm91dGVCb3guc2V0KGluKTsKLSAgICAvL30KLQotICAgIC8vIGZ1bmN0aW9ucwotICAgIHZvaWQgaW5pdChjb25zdCBmckJveCAmcm91dGVCQm94LCBjb25zdCBmckJveCAmZXh0QkJveCwKLSAgICAgICAgICAgICAgc3RkOjptYXA8ZnJDb29yZCwgc3RkOjptYXA8ZnJMYXllck51bSwgZnJUcmFja1BhdHRlcm4qID4gPiAmeE1hcCwKLSAgICAgICAgICAgICAgc3RkOjptYXA8ZnJDb29yZCwgc3RkOjptYXA8ZnJMYXllck51bSwgZnJUcmFja1BhdHRlcm4qID4gPiAmeU1hcCwKLSAgICAgICAgICAgICAgYm9vbCBpbml0RFIpOwotICAgIHZvaWQgcHJpbnQoKTsKLSAgICB2b2lkIHJlc2V0U3RhdHVzKCk7Ci0gICAgdm9pZCByZXNldFByZXZOb2RlRGlyKCk7Ci0gICAgdm9pZCByZXNldFNyYygpOwotICAgIHZvaWQgcmVzZXREc3QoKTsKLSAgICBib29sIHNlYXJjaChzdGQ6OnZlY3RvcjxGbGV4TWF6ZUlkeD4gJmNvbm5Db21wcywgZHJQaW4qIG5leHRQaW4sIHN0ZDo6dmVjdG9yPEZsZXhNYXplSWR4PiAmcGF0aCwKLSAgICAgICAgICAgICAgICBGbGV4TWF6ZUlkeCAmY2NNYXplSWR4MSwgRmxleE1hemVJZHggJmNjTWF6ZUlkeDIpOwotICAgIHZvaWQgc2V0Q29zdChmclVJbnQ0IGRyY0Nvc3RJbiwgZnJVSW50NCBtYXJrZXJDb3N0SW4pIHsKLSAgICAgIGdnRFJDQ29zdCAgICA9IGRyY0Nvc3RJbjsKLSAgICAgIGdnTWFya2VyQ29zdCA9IG1hcmtlckNvc3RJbjsKLSAgICB9Ci0gICAgZnJDb29yZCBnZXRIYWxmVmlhRW5jQXJlYShmck1JZHggeiwgYm9vbCBpc0xheWVyMSkgY29uc3QgewotICAgICAgcmV0dXJuIChpc0xheWVyMSA/IGhhbGZWaWFFbmNBcmVhW3pdLmZpcnN0OiBoYWxmVmlhRW5jQXJlYVt6XS5zZWNvbmQpOwotICAgIH0KLQotICBwcm90ZWN0ZWQ6Ci0gICAgZnJEZXNpZ24qIGRlc2lnbjsKLSAgICAvL2ZyQm94ICAgICByb3V0ZUJveDsKLSAgICAvLyBuZXcKLSAgICAvLyBbMF0gaGFzRUVkZ2U7IFsxXSBoYXNORWRnZTsgWzJdIGhhc1VwRWRnZQotICAgIC8vIFszXSBlbXB0eTsgICAgWzRdIGVtcHR5OyAgICBbNV0gZW1wdHkKLSAgICAvLyBbNl0gZW1wdHk7ICAgIFs3XSBlbXB0eTsgICAgWzhdIGVtcHR5Ci0gICAgLy8gWzldIGhhc1NwZWNpYWxWaWEKLSAgICAvLyBbMTBdIHNoYXBlIFggY29zdDsgWzExXSBzaGFwZSBVIGNvc3Q7IAotICAgIC8vIFsxMl0gaXMgVy9FIG9uIGdyaWQ7IFsxM10gaXMgTi9TIG9uIGdyaWQ7IFsxNF0gaXMgVSBvbiBncmlkCi0gICAgLy8gWzIzLTE2XSBxdWljayBkcmMgWCBjb3N0OyBbMzEtMjRdIHF1aWNrIGRyYyBVIGNvc3QKLSAgICAvLyBbMzktMzJdIG1hcmtlcmRyYyBYIGNvc3Q7IFs0Ny00MF0gbWFya2VyZHJjIFUgY29zdAotICAgIC8vZnJWZWN0b3I8dW5zaWduZWQgbG9uZyBsb25nPiAgICAgIGJpdHM7Ci0gICAgZnJWZWN0b3I8dW5zaWduZWQgbG9uZyBsb25nPiAgICAgICAgICAgICAgIGJpdHM7Ci0gICAgc3RkOjp2ZWN0b3I8Ym9vbD4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZEaXJzOwotICAgIHN0ZDo6dmVjdG9yPGJvb2w+ICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNzOwotICAgIHN0ZDo6dmVjdG9yPGJvb2w+ICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RzOwotICAgIC8vc3RkOjp2ZWN0b3I8Ym9vbD4gICAgICAgICAgICAgICAgICAgICAgICAgIGdyaWRzRTsKLSAgICAvL3N0ZDo6dmVjdG9yPGJvb2w+ICAgICAgICAgICAgICAgICAgICAgICAgICBncmlkc047Ci0gICAgZnJWZWN0b3I8ZnJDb29yZD4gICAgICAgICAgICAgICAgICAgICAgICAgIHhDb29yZHM7Ci0gICAgZnJWZWN0b3I8ZnJDb29yZD4gICAgICAgICAgICAgICAgICAgICAgICAgIHlDb29yZHM7Ci0gICAgZnJWZWN0b3I8ZnJMYXllck51bT4gICAgICAgICAgICAgICAgICAgICAgIHpDb29yZHM7Ci0gICAgZnJWZWN0b3I8ZnJDb29yZD4gICAgICAgICAgICAgICAgICAgICAgICAgIHpIZWlnaHRzOyAvLyBhY2N1bXVsYXRlZCBaIGRpZmYKLSAgICBzdGQ6OnZlY3Rvcjxib29sPiAgICAgICAgICAgICAgICAgICAgICAgICAgekRpcnM7IC8vIGlzIGhvcnogZGlyCi0gICAgZnJVSW50NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdnRFJDQ29zdDsKLSAgICBmclVJbnQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2dNYXJrZXJDb3N0OwotICAgIC8vIHRlbXBvcmFyeSB2YXJpYWJsZXMKLSAgICBGbGV4V2F2ZWZyb250ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F2ZWZyb250OwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxmckNvb3JkLCBmckNvb3JkPiA+ICBoYWxmVmlhRW5jQXJlYTsgLy8gc3RkOjpwYWlyPGxheWVyMWFyZWEsIGxheWVyMmFyZWE+Ci0KLSAgICAvLyBpbnRlcm5hbCBnZXR0ZXJzCi0gICAgYm9vbCBnZXRCaXQoZnJNSWR4IGlkeCwgZnJNSWR4IHBvcykgY29uc3QgewotICAgICAgcmV0dXJuIChiaXRzW2lkeF0gPj4gcG9zICkgJiAxOwotICAgIH0KLSAgICBmclVJbnQ0IGdldEJpdHMoZnJNSWR4IGlkeCwgZnJNSWR4IHBvcywgZnJVSW50NCBsZW5ndGgpIGNvbnN0IHsKLSAgICAgIGF1dG8gdG1wID0gYml0c1tpZHhdICYgKCgoMXVsbCA8PCBsZW5ndGgpIC0gMSkgPDwgcG9zKTsgLy8gbWFzawotICAgICAgLy9hdXRvIHRtcCA9IGJpdHNbaWR4XSAmICgoKDF1IDw8IGxlbmd0aCkgLSAxKSA8PCBwb3MpOyAvLyBtYXNrCi0gICAgICByZXR1cm4gdG1wID4+IHBvczsKLSAgICB9Ci0gICAgZnJNSWR4IGdldElkeChmck1JZHggeElkeCwgZnJNSWR4IHlJZHgsIGZyTUlkeCB6SWR4KSBjb25zdCB7Ci0gICAgICAvLy8vYXV0byBzb2wgPSB4SWR4ICsgeUlkeCAqIHhDb29yZHMuc2l6ZSgpICsgeklkeCAqIHhDb29yZHMuc2l6ZSgpICogeUNvb3Jkcy5zaXplKCk7Ci0gICAgICAvLy8vaWYgKHNvbCA+PSAwICYmIHNvbCA8IGJpdHMuc2l6ZSgpKSB7Ci0gICAgICAvLyAgcmV0dXJuIHhJZHggKyB5SWR4ICogeENvb3Jkcy5zaXplKCkgKyB6SWR4ICogeENvb3Jkcy5zaXplKCkgKiB5Q29vcmRzLnNpemUoKTsKLSAgICAgIC8vLy99IGVsc2UgewotICAgICAgLy8vLyAgc3RkOjpjb3V0IDw8IkVycm9yOiBjdXJySWR4IHgveS96ICIgPDx4SWR4IDw8Ii8iIDw8eUlkeCA8PCIvIiA8PHpJZHggPDwiICIgPDxzb2wgPDwiIGlzIGlsbGVnYWwiIDw8c3RkOjplbmRsIDw8c3RkOjpmbHVzaDsKLSAgICAgIC8vLy8gIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiZXJyb3IiKTsKLSAgICAgIC8vLy99Ci0gICAgICAKLSAgICAgIC8vICAgICAgKGlzWkRpciA9PSBIKSAgICAgCi0gICAgICByZXR1cm4gKGdldFpEaXIoeklkeCkpID8gKHhJZHggKyB5SWR4ICogeENvb3Jkcy5zaXplKCkgKyB6SWR4ICogeENvb3Jkcy5zaXplKCkgKiB5Q29vcmRzLnNpemUoKSk6IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh5SWR4ICsgeElkeCAqIHlDb29yZHMuc2l6ZSgpICsgeklkeCAqIHhDb29yZHMuc2l6ZSgpICogeUNvb3Jkcy5zaXplKCkpOwotICAgIH0KLSAgICAvLyBpbnRlcm5hbCBzZXR0ZXJzCi0gICAgdm9pZCBzZXRCaXQoZnJNSWR4IGlkeCwgZnJNSWR4IHBvcykgewotICAgICAgYml0c1tpZHhdIHw9IDEgPDwgcG9zOwotICAgIH0KLSAgICB2b2lkIHJlc2V0Qml0KGZyTUlkeCBpZHgsIGZyTUlkeCBwb3MpIHsKLSAgICAgIGJpdHNbaWR4XSAmPSB+KDEgPDwgcG9zKTsKLSAgICB9Ci0gICAgdm9pZCBhZGRUb0JpdHMoZnJNSWR4IGlkeCwgZnJNSWR4IHBvcywgZnJVSW50NCBsZW5ndGgsIGZyVUludDQgdmFsKSB7Ci0gICAgICBhdXRvIHRtcCA9IGdldEJpdHMoaWR4LCBwb3MsIGxlbmd0aCkgKyB2YWw7Ci0gICAgICB0bXAgPSAodG1wID4gKDF1IDw8IGxlbmd0aCkpID8gKDF1IDw8IGxlbmd0aCkgOiB0bXA7Ci0gICAgICBzZXRCaXRzKGlkeCwgcG9zLCBsZW5ndGgsIHRtcCk7Ci0gICAgfQotICAgIHZvaWQgc3ViVG9CaXRzKGZyTUlkeCBpZHgsIGZyTUlkeCBwb3MsIGZyVUludDQgbGVuZ3RoLCBmclVJbnQ0IHZhbCkgewotICAgICAgaW50IHRtcCA9IChpbnQpZ2V0Qml0cyhpZHgsIHBvcywgbGVuZ3RoKSAtIChpbnQpdmFsOwotICAgICAgdG1wID0gKHRtcCA8IDApID8gMCA6IHRtcDsKLSAgICAgIHNldEJpdHMoaWR4LCBwb3MsIGxlbmd0aCwgdG1wKTsKLSAgICB9Ci0gICAgdm9pZCBzZXRCaXRzKGZyTUlkeCBpZHgsIGZyTUlkeCBwb3MsIGZyVUludDQgbGVuZ3RoLCBmclVJbnQ0IHZhbCkgewotICAgICAgLy9zdGQ6OmNvdXQgPDwic2V0Qml0cyAoaWR4L3Bvcy9sZW4vdmFsKSAiIDw8aWR4IDw8IiAiIDw8cG9zIDw8IiAiIDw8bGVuZ3RoIDw8IiAiIDw8dmFsIDw8c3RkOjplbmRsOwotICAgICAgYml0c1tpZHhdICY9IH4oKCgxdWxsIDw8IGxlbmd0aCkgLSAxKSA8PCBwb3MpOyAvLyBjbGVhciByZWxhdGVkIGJpdHMgdG8gMAotICAgICAgYml0c1tpZHhdIHw9ICgodW5zaWduZWQgbG9uZyBsb25nKXZhbCAmICgoMXVsbCA8PCBsZW5ndGgpIC0gMSkpIDw8IHBvczsgLy8gb25seSBnZXQgbGFzdCBsZW5ndGggYml0cyBvZiB2YWwKLSAgICAgIC8vYml0c1tpZHhdICY9IH4oKCgxdSA8PCBsZW5ndGgpIC0gMSkgPDwgcG9zKTsgLy8gY2xlYXIgcmVsYXRlZCBiaXRzIHRvIDAKLSAgICAgIC8vYml0c1tpZHhdIHw9ICh2YWwgJiAoKDF1IDw8IGxlbmd0aCkgLSAxKSkgPDwgcG9zOyAvLyBvbmx5IGdldCBsYXN0IGxlbmd0aCBiaXRzIG9mIHZhbAotICAgIH0KLQotICAgIC8vIGludGVybmFsIHV0aWxpdHkKLSAgICB2b2lkIGNvcnJlY3QoZnJNSWR4ICZ4LCBmck1JZHggJnksIGZyTUlkeCAmeiwgZnJEaXJFbnVtICZkaXIpIGNvbnN0IHsKLSAgICAgIHN3aXRjaCAoZGlyKSB7Ci0gICAgICAgIGNhc2UgZnJEaXJFbnVtOjpXOgotICAgICAgICAgIHgtLTsKLSAgICAgICAgICBkaXIgPSBmckRpckVudW06OkU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgZnJEaXJFbnVtOjpTOgotICAgICAgICAgIHktLTsKLSAgICAgICAgICBkaXIgPSBmckRpckVudW06Ok47Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgZnJEaXJFbnVtOjpEOgotICAgICAgICAgIHotLTsKLSAgICAgICAgICBkaXIgPSBmckRpckVudW06OlU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB2b2lkIGNvcnJlY3RVKGZyTUlkeCAmeCwgZnJNSWR4ICZ5LCBmck1JZHggJnosIGZyRGlyRW51bSAmZGlyKSBjb25zdCB7Ci0gICAgICBzd2l0Y2ggKGRpcikgewotICAgICAgICBjYXNlIGZyRGlyRW51bTo6RDoKLSAgICAgICAgICB6LS07Ci0gICAgICAgICAgZGlyID0gZnJEaXJFbnVtOjpVOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIDsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgdm9pZCByZXZlcnNlKGZyTUlkeCAmeCwgZnJNSWR4ICZ5LCBmck1JZHggJnosIGZyRGlyRW51bSAmZGlyKSBjb25zdCB7Ci0gICAgICBzd2l0Y2ggKGRpcikgewotICAgICAgICBjYXNlIGZyRGlyRW51bTo6RToKLSAgICAgICAgICB4Kys7Ci0gICAgICAgICAgZGlyID0gZnJEaXJFbnVtOjpXOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGZyRGlyRW51bTo6UzoKLSAgICAgICAgICB5LS07Ci0gICAgICAgICAgZGlyID0gZnJEaXJFbnVtOjpOOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGZyRGlyRW51bTo6VzoKLSAgICAgICAgICB4LS07Ci0gICAgICAgICAgZGlyID0gZnJEaXJFbnVtOjpFOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGZyRGlyRW51bTo6TjoKLSAgICAgICAgICB5Kys7Ci0gICAgICAgICAgZGlyID0gZnJEaXJFbnVtOjpTOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGZyRGlyRW51bTo6VToKLSAgICAgICAgICB6Kys7Ci0gICAgICAgICAgZGlyID0gZnJEaXJFbnVtOjpEOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGZyRGlyRW51bTo6RDoKLSAgICAgICAgICB6LS07Ci0gICAgICAgICAgZGlyID0gZnJEaXJFbnVtOjpVOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIDsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgdm9pZCBnZXRQcmV2R3JpZChmck1JZHggJmdyaWRYLCBmck1JZHggJmdyaWRZLCBmck1JZHggJmdyaWRaLCBjb25zdCBmckRpckVudW0gZGlyKSBjb25zdDsKLSAgICB2b2lkIGdldE5leHRHcmlkKGZyTUlkeCAmZ3JpZFgsIGZyTUlkeCAmZ3JpZFksIGZyTUlkeCAmZ3JpZFosIGNvbnN0IGZyRGlyRW51bSBkaXIpOwotICAgIGJvb2wgaXNWYWxpZChmck1JZHggeCwgZnJNSWR4IHksIGZyTUlkeCB6KSBjb25zdCB7Ci0gICAgICBpZiAoeCA8IDAgfHwgeSA8IDAgfHwgeiA8IDAgfHwKLSAgICAgICAgICB4ID49IChmck1JZHgpeENvb3Jkcy5zaXplKCkgfHwgeSA+PSAoZnJNSWR4KXlDb29yZHMuc2l6ZSgpIHx8IHogPj0gKGZyTUlkeCl6Q29vcmRzLnNpemUoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgYm9vbCBpc1ZhbGlkKGZyTUlkeCB4LCBmck1JZHggeSwgZnJNSWR4IHosIGZyRGlyRW51bSBkaXIpIGNvbnN0IHsKLSAgICAgIGF1dG8gc29sID0gaXNWYWxpZCh4LCB5LCB6KTsKLSAgICAgIHJldmVyc2UoeCwgeSwgeiwgZGlyKTsKLSAgICAgIHJldHVybiBzb2wgJiYgaXNWYWxpZCh4LCB5LCB6KTsKLSAgICB9Ci0gICAgLy9ib29sIGlzT3Bwb3NpdGUoY29uc3QgZnJEaXJFbnVtICZkaXIxLCBjb25zdCBmckRpckVudW0gJmRpcjIpIGNvbnN0IHsKLSAgICAvLyAgcmV0dXJuICgoaW50KWRpcjEgKyAoaW50KWRpcjIgPT0gT1BQT1NJVEVESVIpOwotICAgIC8vfQotICAgIC8vIGludGVybmFsIGluaXQgdXRpbGl0eQotICAgIHZvaWQgaW5pdFRyYWNrcyhzdGQ6Om1hcDxmckNvb3JkLCBzdGQ6Om1hcDxmckxheWVyTnVtLCBmclRyYWNrUGF0dGVybiogPiA+ICZob3JMb2MyVHJhY2tQYXR0ZXJucywKLSAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8ZnJDb29yZCwgc3RkOjptYXA8ZnJMYXllck51bSwgZnJUcmFja1BhdHRlcm4qID4gPiAmdmVydExvYzJUcmFja1BhdHRlcm5zLAotICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxmckxheWVyTnVtLCBmclByZWZSb3V0aW5nRGlyRW51bT4gJmxheWVyTnVtMlByZVJvdXRlRGlyLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBmckJveCAmYmJveCk7Ci0gICAgdm9pZCBpbml0R3JpZHMoY29uc3Qgc3RkOjptYXA8ZnJDb29yZCwgc3RkOjptYXA8ZnJMYXllck51bSwgZnJUcmFja1BhdHRlcm4qID4gPiAmeE1hcCwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxmckNvb3JkLCBzdGQ6Om1hcDxmckxheWVyTnVtLCBmclRyYWNrUGF0dGVybiogPiA+ICZ5TWFwLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPGZyTGF5ZXJOdW0sIGZyUHJlZlJvdXRpbmdEaXJFbnVtPiAmek1hcCk7Ci0gICAgdm9pZCBpbml0RWRnZXMoY29uc3Qgc3RkOjptYXA8ZnJDb29yZCwgc3RkOjptYXA8ZnJMYXllck51bSwgZnJUcmFja1BhdHRlcm4qID4gPiAmeE1hcCwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxmckNvb3JkLCBzdGQ6Om1hcDxmckxheWVyTnVtLCBmclRyYWNrUGF0dGVybiogPiA+ICZ5TWFwLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPGZyTGF5ZXJOdW0sIGZyUHJlZlJvdXRpbmdEaXJFbnVtPiAmek1hcCwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBmckJveCAmYmJveCwgYm9vbCBpbml0RFIpOwotICAgIGZyQ29zdCBnZXRFc3RDb3N0KGNvbnN0IEZsZXhNYXplSWR4ICZzcmMsIGNvbnN0IEZsZXhNYXplSWR4ICZkc3RNYXplSWR4MSwgY29uc3QgRmxleE1hemVJZHggJmRzdE1hemVJZHgyLCBjb25zdCBmckRpckVudW0gJmRpcik7Ci0gICAgZnJDb3N0IGdldE5leHRQYXRoQ29zdChjb25zdCBGbGV4V2F2ZWZyb250R3JpZCAmY3VyckdyaWQsIGNvbnN0IGZyRGlyRW51bSAmZGlyKTsKLSAgICBmckRpckVudW0gZ2V0TGFzdERpcihjb25zdCBzdGQ6OmJpdHNldDxXQVZFRlJPTlRCSVRTSVpFPiAmYnVmZmVyKTsKLSAgICB2b2lkIHRyYWNlQmFja1BhdGgoY29uc3QgRmxleFdhdmVmcm9udEdyaWQgJmN1cnJHcmlkLCBzdGQ6OnZlY3RvcjxGbGV4TWF6ZUlkeD4gJnBhdGgsIAotICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxGbGV4TWF6ZUlkeD4gJnJvb3QsIEZsZXhNYXplSWR4ICZjY01hemVJZHgxLCBGbGV4TWF6ZUlkeCAmY2NNYXplSWR4Mik7Ci0gICAgdm9pZCBleHBhbmRXYXZlZnJvbnQoRmxleFdhdmVmcm9udEdyaWQgJmN1cnJHcmlkLCBjb25zdCBGbGV4TWF6ZUlkeCAmZHN0TWF6ZUlkeDEsIGNvbnN0IEZsZXhNYXplSWR4ICZkc3RNYXplSWR4Mik7Ci0gICAgYm9vbCBpc0V4cGFuZGFibGUoY29uc3QgRmxleFdhdmVmcm9udEdyaWQgJmN1cnJHcmlkLCBmckRpckVudW0gZGlyKTsKLSAgICAvL2Jvb2wgaXNPcHBvc2l0ZShjb25zdCBmckRpckVudW0gJmRpcjEsIGNvbnN0IGZyRGlyRW51bSAmZGlyMik7Ci0gICAgRmxleE1hemVJZHggZ2V0VGFpbElkeChjb25zdCBGbGV4TWF6ZUlkeCAmY3VycklkeCwgY29uc3QgRmxleFdhdmVmcm9udEdyaWQgJmN1cnJHcmlkKTsKLSAgICB2b2lkIGV4cGFuZChGbGV4V2F2ZWZyb250R3JpZCAmY3VyckdyaWQsIGNvbnN0IGZyRGlyRW51bSAmZGlyLCBjb25zdCBGbGV4TWF6ZUlkeCAmZHN0TWF6ZUlkeDEsIGNvbnN0IEZsZXhNYXplSWR4ICZkc3RNYXplSWR4Mik7Ci0gIH07Ci19Ci0KLQotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZHIvRmxleEdyaWRHcmFwaF9tYXplLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RyL0ZsZXhHcmlkR3JhcGhfbWF6ZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YzIyYmMuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZHIvRmxleEdyaWRHcmFwaF9tYXplLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUxNCArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiZHIvRmxleEdyaWRHcmFwaC5oIgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIGZyOwotCi0vKmlubGluZSovIHZvaWQgRmxleEdyaWRHcmFwaDo6ZXhwYW5kKEZsZXhXYXZlZnJvbnRHcmlkICZjdXJyR3JpZCwgY29uc3QgZnJEaXJFbnVtICZkaXIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGbGV4TWF6ZUlkeCAmZHN0TWF6ZUlkeDEsIGNvbnN0IEZsZXhNYXplSWR4ICZkc3RNYXplSWR4MikgewotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgZnJDb3N0IG5leHRFc3RDb3N0LCBuZXh0UGF0aENvc3Q7Ci0gIGludCBncmlkWCA9IGN1cnJHcmlkLngoKTsKLSAgaW50IGdyaWRZID0gY3VyckdyaWQueSgpOwotICBpbnQgZ3JpZFogPSBjdXJyR3JpZC56KCk7Ci0KLSAgZ2V0TmV4dEdyaWQoZ3JpZFgsIGdyaWRZLCBncmlkWiwgZGlyKTsKLSAgCi0gIEZsZXhNYXplSWR4IG5leHRJZHgoZ3JpZFgsIGdyaWRZLCBncmlkWik7Ci0gIC8vIGdldCBjb3N0Ci0gIG5leHRFc3RDb3N0ID0gZ2V0RXN0Q29zdChuZXh0SWR4LCBkc3RNYXplSWR4MSwgZHN0TWF6ZUlkeDIsIGRpcik7Ci0gIG5leHRQYXRoQ29zdCA9IGdldE5leHRQYXRoQ29zdChjdXJyR3JpZCwgZGlyKTsgIAotICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgc3RkOjpjb3V0IDw8ICIgIGV4cGFuZGluZyBmcm9tICgiIDw8IGN1cnJHcmlkLngoKSA8PCAiLCAiIDw8IGN1cnJHcmlkLnkoKSA8PCAiLCAiIDw8IGN1cnJHcmlkLnooKSAKLSAgICAgICAgICAgICAgPDwgIikgW3BhdGhDb3N0IC8gdG90YWxDb3N0ID0gIiA8PCBjdXJyR3JpZC5nZXRQYXRoQ29zdCgpIDw8ICIgLyAiIDw8IGN1cnJHcmlkLmdldENvc3QoKSA8PCAiXSB0byAiCi0gICAgICAgICAgICAgIDw8ICIoIiA8PCBncmlkWCA8PCAiLCAiIDw8IGdyaWRZIDw8ICIsICIgPDwgZ3JpZFogPDwgIikgW3BhdGhDb3N0IC8gdG90YWxDb3N0ID0gIiAKLSAgICAgICAgICAgICAgPDwgbmV4dFBhdGhDb3N0IDw8ICIgLyAiIDw8IG5leHRQYXRoQ29zdCArIG5leHRFc3RDb3N0IDw8ICJdXG4iOwotICB9Ci0gIC8vRmxleFdhdmVmcm9udEdyaWQgbmV4dFdhdmVmcm9udEdyaWQoZ3JpZFgsIGdyaWRZLCBncmlkWiwgbmV4dFBhdGhDb3N0LCBuZXh0UGF0aENvc3QgKyBuZXh0RXN0Q29zdCwgY3VyckdyaWQuZ2V0QmFja1RyYWNlQnVmZmVyKCkpOwotICBhdXRvIGxOdW0gPSBnZXRMYXllck51bShjdXJyR3JpZC56KCkpOwotICBhdXRvIHBhdGhXaWR0aCA9IGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldExheWVyKGxOdW0pLT5nZXRXaWR0aCgpOwotICBGbGV4V2F2ZWZyb250R3JpZCBuZXh0V2F2ZWZyb250R3JpZChncmlkWCwgZ3JpZFksIGdyaWRaLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyckdyaWQuZ2V0TGF5ZXJQYXRoQXJlYSgpICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVkZ2VMZW5ndGgoY3VyckdyaWQueCgpLCBjdXJyR3JpZC55KCksIGN1cnJHcmlkLnooKSwgZGlyKSAqIHBhdGhXaWR0aCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRQYXRoQ29zdCwgbmV4dFBhdGhDb3N0ICsgbmV4dEVzdENvc3QsIGN1cnJHcmlkLmdldEJhY2tUcmFjZUJ1ZmZlcigpKTsKLSAgaWYgKGRpciA9PSBmckRpckVudW06OlUgfHwgZGlyID09IGZyRGlyRW51bTo6RCkgewotICAgIG5leHRXYXZlZnJvbnRHcmlkLnJlc2V0TGF5ZXJQYXRoQXJlYSgpOwotICAgIG5leHRXYXZlZnJvbnRHcmlkLmFkZExheWVyUGF0aEFyZWEoKGRpciA9PSBmckRpckVudW06OlUpID8gZ2V0SGFsZlZpYUVuY0FyZWEoY3VyckdyaWQueigpLCBmYWxzZSkgOiBnZXRIYWxmVmlhRW5jQXJlYShncmlkWiwgdHJ1ZSkpOwotICB9Ci0gIC8vIHVwZGF0ZSB3YXZlZnJvbnQgYnVmZmVyCi0gIGF1dG8gdGFpbERpciA9IG5leHRXYXZlZnJvbnRHcmlkLnNoaWZ0QWRkQnVmZmVyKGRpcik7Ci0gIC8vIGNvbW1pdCBncmlkIHByZXYgZGlyZWN0aW9uIGlmIG5lZWRlZAotICBhdXRvIHRhaWxJZHggPSBnZXRUYWlsSWR4KG5leHRJZHgsIG5leHRXYXZlZnJvbnRHcmlkKTsKLSAgaWYgKHRhaWxEaXIgIT0gZnJEaXJFbnVtOjpVTktOT1dOKSB7Ci0gICAgaWYgKGdldFByZXZBc3Rhck5vZGVEaXIodGFpbElkeC54KCksIHRhaWxJZHgueSgpLCB0YWlsSWR4LnooKSkgPT0gZnJEaXJFbnVtOjpVTktOT1dOIHx8Ci0gICAgICAgIGdldFByZXZBc3Rhck5vZGVEaXIodGFpbElkeC54KCksIHRhaWxJZHgueSgpLCB0YWlsSWR4LnooKSkgPT0gdGFpbERpcikgewotICAgICAgc2V0UHJldkFzdGFyTm9kZURpcih0YWlsSWR4LngoKSwgdGFpbElkeC55KCksIHRhaWxJZHgueigpLCB0YWlsRGlyKTsKLSAgICAgIHdhdmVmcm9udC5wdXNoKG5leHRXYXZlZnJvbnRHcmlkKTsKLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgc3RkOjpjb3V0IDw8ICIgICAgY29tbWl0ICgiIDw8IHRhaWxJZHgueCgpIDw8ICIsICIgPDwgdGFpbElkeC55KCkgPDwgIiwgIiA8PCB0YWlsSWR4LnooKSA8PCAiKSBwcmV2IGFjY2Vzc2luZyBkaXIgPSAiIDw8IChpbnQpdGFpbERpciA8PCAiXG4iOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsgIAotICAgIC8vIGFkZCB0byB3YXZlZnJvbnQKLSAgICB3YXZlZnJvbnQucHVzaChuZXh0V2F2ZWZyb250R3JpZCk7Ci0gIH0KLSAgcmV0dXJuOwotfQotCi0vKmlubGluZSovIHZvaWQgRmxleEdyaWRHcmFwaDo6ZXhwYW5kV2F2ZWZyb250KEZsZXhXYXZlZnJvbnRHcmlkICZjdXJyR3JpZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZsZXhNYXplSWR4ICZkc3RNYXplSWR4MSwgY29uc3QgRmxleE1hemVJZHggJmRzdE1hemVJZHgyKSB7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIC8vYm9vbCBlbmFibGVPdXRwdXQgPSB0cnVlOwotICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgY291dCA8PCAic3RhcnQgZXhwYW5kIGZyb20gKCIgPDwgY3VyckdyaWQueCgpIDw8ICIsICIgPDwgY3VyckdyaWQueSgpIDw8ICIsICIgPDwgY3VyckdyaWQueigpIDw8ICIpXG4iOwotICB9Ci0gIC8vaWYgKGN1cnJHcmlkLnkoKSA9PSAxOSAmJiBjdXJyR3JpZC56KCkgPT0gMCkgewotICAvLyAgY291dCA8PCJpcyBleHBhbmRhYmxlICgiIDw8Y3VyckdyaWQueCgpIDw8IiwgIiA8PGN1cnJHcmlkLnkoKSA8PCIsICIgPDxjdXJyR3JpZC56KCkgPDwiKSBORVNXVUQgIgotICAvLyAgICAgICA8PGlzRXhwYW5kYWJsZShjdXJyR3JpZCwgZnJEaXJFbnVtOjpOKQotICAvLyAgICAgICA8PGlzRXhwYW5kYWJsZShjdXJyR3JpZCwgZnJEaXJFbnVtOjpFKQotICAvLyAgICAgICA8PGlzRXhwYW5kYWJsZShjdXJyR3JpZCwgZnJEaXJFbnVtOjpTKQotICAvLyAgICAgICA8PGlzRXhwYW5kYWJsZShjdXJyR3JpZCwgZnJEaXJFbnVtOjpXKQotICAvLyAgICAgICA8PGlzRXhwYW5kYWJsZShjdXJyR3JpZCwgZnJEaXJFbnVtOjpVKQotICAvLyAgICAgICA8PGlzRXhwYW5kYWJsZShjdXJyR3JpZCwgZnJEaXJFbnVtOjpEKQotICAvLyAgICAgICA8PGVuZGw7Ci0gIC8vICBjb3V0IDw8ImhhcyBlZGdlICIgCi0gIC8vICAgICAgIDw8Z3JpZEdyYXBoLmhhc0VkZ2UoY3VyckdyaWQueCgpLCBjdXJyR3JpZC55KCksIGN1cnJHcmlkLnooKSwgZnJEaXJFbnVtOjpOKQotICAvLyAgICAgICA8PGdyaWRHcmFwaC5oYXNFZGdlKGN1cnJHcmlkLngoKSwgY3VyckdyaWQueSgpLCBjdXJyR3JpZC56KCksIGZyRGlyRW51bTo6RSkKLSAgLy8gICAgICAgPDxncmlkR3JhcGguaGFzRWRnZShjdXJyR3JpZC54KCksIGN1cnJHcmlkLnkoKSwgY3VyckdyaWQueigpLCBmckRpckVudW06OlMpCi0gIC8vICAgICAgIDw8Z3JpZEdyYXBoLmhhc0VkZ2UoY3VyckdyaWQueCgpLCBjdXJyR3JpZC55KCksIGN1cnJHcmlkLnooKSwgZnJEaXJFbnVtOjpXKQotICAvLyAgICAgICA8PGdyaWRHcmFwaC5oYXNFZGdlKGN1cnJHcmlkLngoKSwgY3VyckdyaWQueSgpLCBjdXJyR3JpZC56KCksIGZyRGlyRW51bTo6VSkKLSAgLy8gICAgICAgPDxncmlkR3JhcGguaGFzRWRnZShjdXJyR3JpZC54KCksIGN1cnJHcmlkLnkoKSwgY3VyckdyaWQueigpLCBmckRpckVudW06OkQpCi0gIC8vICAgICAgIDw8ZW5kbDsKLSAgLy8gIGludCBncmlkWCA9IGN1cnJHcmlkLngoKTsKLSAgLy8gIGludCBncmlkWSA9IGN1cnJHcmlkLnkoKTsKLSAgLy8gIGludCBncmlkWiA9IGN1cnJHcmlkLnooKTsKLSAgLy8gIGlmICghZ3JpZEdyYXBoLmhhc0VkZ2UoZ3JpZFgsIGdyaWRZLCBncmlkWiwgZnJEaXJFbnVtOjpFKSkgewotICAvLyAgICA7Ci0gIC8vICB9IGVsc2UgewotICAvLyAgICBnZXROZXh0R3JpZChncmlkWCwgZ3JpZFksIGdyaWRaLCBmckRpckVudW06OkUpOwotICAvLyAgICBpZiAoZ3JpZEdyYXBoLmlzQmxvY2tlZChncmlkWCwgZ3JpZFksIGdyaWRaKSkgewotICAvLyAgICAgIGNvdXQgPDwiYmxvY2tlZCIgPDxlbmRsOwotICAvLyAgICB9IGVsc2UgaWYgKGdyaWRHcmFwaC5pc1NyYyhncmlkWCwgZ3JpZFksIGdyaWRaKSkgewotICAvLyAgICAgIGNvdXQgPDwic3JjIiA8PGVuZGw7Ci0gIC8vICAgIH0gZWxzZSBpZiAoZ3JpZEdyYXBoLmdldFByZXZBc3Rhck5vZGVEaXIoZ3JpZFgsIGdyaWRZLCBncmlkWikgIT0gZnJEaXJFbnVtOjpVTktOT1dOKSB7Ci0gIC8vICAgICAgY291dCA8PCJ2aXNpdGVkIiA8PGVuZGw7Ci0gIC8vICAgIH0gZWxzZSB7Ci0gIC8vICAgICAgOwotICAvLyAgICB9Ci0gIC8vICB9Ci0gIC8vfQotICAvL2F1dG8gdG1wR3JpZCA9IGN1cnJXYXZlZnJvbnRHcmlkOwotICAvLy8vIGNvbW1pdCBncmlkIHByZXYgZGlyZWN0aW9uIGlmIG5lZWRlZAotICAvL2F1dG8gdGFpbElkeCA9IGdldFRhaWxJZHgobmV4dElkeCwgbmV4dFdhdmVmcm9udEdyaWQpOwotICAvL2lmICh0YWlsRGlyICE9IGZyRGlyRW51bTo6VU5LTk9XTikgewotICAvLyAgaWYgKGdldFByZXZBc3Rhck5vZGVEaXIodGFpbElkeC54KCksIHRhaWxJZHgueSgpLCB0YWlsSWR4LnooKSkgPT0gZnJEaXJFbnVtOjpVTktOT1dOKSB7Ci0gIC8vICAgIDsKLSAgLy8gIH0KLSAgLy99Ci0gIC8vIE4KLSAgaWYgKGlzRXhwYW5kYWJsZShjdXJyR3JpZCwgZnJEaXJFbnVtOjpOKSkgewotICAgIGV4cGFuZChjdXJyR3JpZCwgZnJEaXJFbnVtOjpOLCBkc3RNYXplSWR4MSwgZHN0TWF6ZUlkeDIpOwotICB9Ci0gIC8vIGVsc2UgewotICAvLyAgIHN0ZDo6Y291dCA8PCJubyBOIiA8PGVuZGw7Ci0gIC8vIH0KLSAgLy8gRQotICBpZiAoaXNFeHBhbmRhYmxlKGN1cnJHcmlkLCBmckRpckVudW06OkUpKSB7Ci0gICAgZXhwYW5kKGN1cnJHcmlkLCBmckRpckVudW06OkUsIGRzdE1hemVJZHgxLCBkc3RNYXplSWR4Mik7Ci0gIH0KLSAgLy8gZWxzZSB7Ci0gIC8vICAgc3RkOjpjb3V0IDw8Im5vIEUiIDw8ZW5kbDsKLSAgLy8gfQotICAvLyBTCi0gIGlmIChpc0V4cGFuZGFibGUoY3VyckdyaWQsIGZyRGlyRW51bTo6UykpIHsKLSAgICBleHBhbmQoY3VyckdyaWQsIGZyRGlyRW51bTo6UywgZHN0TWF6ZUlkeDEsIGRzdE1hemVJZHgyKTsKLSAgfQotICAvLyBlbHNlIHsKLSAgLy8gICBzdGQ6OmNvdXQgPDwibm8gUyIgPDxlbmRsOwotICAvLyB9Ci0gIC8vIFcKLSAgaWYgKGlzRXhwYW5kYWJsZShjdXJyR3JpZCwgZnJEaXJFbnVtOjpXKSkgewotICAgIGV4cGFuZChjdXJyR3JpZCwgZnJEaXJFbnVtOjpXLCBkc3RNYXplSWR4MSwgZHN0TWF6ZUlkeDIpOwotICB9Ci0gIC8vIGVsc2UgewotICAvLyAgIHN0ZDo6Y291dCA8PCJubyBXIiA8PGVuZGw7Ci0gIC8vIH0KLSAgLy8gVQotICBpZiAoaXNFeHBhbmRhYmxlKGN1cnJHcmlkLCBmckRpckVudW06OlUpKSB7Ci0gICAgZXhwYW5kKGN1cnJHcmlkLCBmckRpckVudW06OlUsIGRzdE1hemVJZHgxLCBkc3RNYXplSWR4Mik7Ci0gIH0KLSAgLy8gZWxzZSB7Ci0gIC8vICAgc3RkOjpjb3V0IDw8Im5vIFUiIDw8ZW5kbDsKLSAgLy8gfQotICAvLyBECi0gIGlmIChpc0V4cGFuZGFibGUoY3VyckdyaWQsIGZyRGlyRW51bTo6RCkpIHsKLSAgICBleHBhbmQoY3VyckdyaWQsIGZyRGlyRW51bTo6RCwgZHN0TWF6ZUlkeDEsIGRzdE1hemVJZHgyKTsKLSAgfQotICAvLyBlbHNlIHsKLSAgLy8gICBzdGQ6OmNvdXQgPDwibm8gRCIgPDxlbmRsOwotICAvLyB9Ci19Ci0KLS8qaW5saW5lKi8gZnJDb3N0IEZsZXhHcmlkR3JhcGg6OmdldEVzdENvc3QoY29uc3QgRmxleE1hemVJZHggJnNyYywgY29uc3QgRmxleE1hemVJZHggJmRzdE1hemVJZHgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGbGV4TWF6ZUlkeCAmZHN0TWF6ZUlkeDIsIGNvbnN0IGZyRGlyRW51bSAmZGlyKSB7Ci0gIC8vYm9vbCBlbmFibGVPdXRwdXQgPSB0cnVlOwotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgY291dCA8PCJlc3QgZnJvbSAoIiA8PHNyYy54KCkgPDwiLCAiIDw8c3JjLnkoKSA8PCIsICIgPDxzcmMueigpIDw8IikgIgotICAgICAgICAgPDwidG8gKCIgICAgICAgPDxkc3RNYXplSWR4MS54KCkgPDwiLCAiIDw8ZHN0TWF6ZUlkeDEueSgpIDw8IiwgIiA8PGRzdE1hemVJZHgxLnooKSA8PCIpICgiCi0gICAgICAgICAgICAgICAgICAgICAgICA8PGRzdE1hemVJZHgyLngoKSA8PCIsICIgPDxkc3RNYXplSWR4Mi55KCkgPDwiLCAiIDw8ZHN0TWF6ZUlkeDIueigpIDw8IikiOwotICB9Ci0gIC8vIGJlbmQgY29zdAotICBpbnQgYmVuZENudCA9IDA7Ci0gIGZyUG9pbnQgc3JjUG9pbnQsIGRzdFBvaW50MSwgZHN0UG9pbnQyOwotICBnZXRQb2ludChzcmNQb2ludCwgc3JjLngoKSwgc3JjLnkoKSk7Ci0gIGdldFBvaW50KGRzdFBvaW50MSwgZHN0TWF6ZUlkeDEueCgpLCBkc3RNYXplSWR4MS55KCkpOwotICBnZXRQb2ludChkc3RQb2ludDIsIGRzdE1hemVJZHgyLngoKSwgZHN0TWF6ZUlkeDIueSgpKTsKLSAgLy9hdXRvIG1pbkNvc3RYID0gc3RkOjphYnMoc3JjUG9pbnQueCgpIC0gZHN0UG9pbnQueCgpKSAqIDE7Ci0gIC8vYXV0byBtaW5Db3N0WSA9IHN0ZDo6YWJzKHNyY1BvaW50LnkoKSAtIGRzdFBvaW50LnkoKSkgKiAxOwotICAvL2F1dG8gbWluQ29zdFogPSBzdGQ6OmFicyhncmlkR3JhcGguZ2V0WkhlaWdodChzcmMueigpKSAtIGdyaWRHcmFwaC5nZXRaSGVpZ2h0KGRzdC56KCkpKSAqIFZJQUNPU1Q7Ci0gIGZyQ29vcmQgbWluQ29zdFggPSBtYXgobWF4KGRzdFBvaW50MS54KCkgLSBzcmNQb2ludC54KCksIHNyY1BvaW50LngoKSAtIGRzdFBvaW50Mi54KCkpLCAwKSAqIDE7Ci0gIGZyQ29vcmQgbWluQ29zdFkgPSBtYXgobWF4KGRzdFBvaW50MS55KCkgLSBzcmNQb2ludC55KCksIHNyY1BvaW50LnkoKSAtIGRzdFBvaW50Mi55KCkpLCAwKSAqIDE7Ci0gIGZyQ29vcmQgbWluQ29zdFogPSBtYXgobWF4KGdldFpIZWlnaHQoZHN0TWF6ZUlkeDEueigpKSAtIGdldFpIZWlnaHQoc3JjLnooKSksIAotICAgICAgICAgICAgICAgICAgICAgICBnZXRaSGVpZ2h0KHNyYy56KCkpIC0gZ2V0WkhlaWdodChkc3RNYXplSWR4Mi56KCkpKSwgMCkgKiAxOwotICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgY291dCA8PCIgeC95L3ogbWluIGNvc3QgPSAoIiA8PG1pbkNvc3RYIDw8IiwgIiA8PG1pbkNvc3RZIDw8IiwgIiA8PG1pbkNvc3RaIDw8IikgIiA8PGVuZGw7Ci0gIH0KLQotICBiZW5kQ250ICs9IChtaW5Db3N0WCAmJiBkaXIgIT0gZnJEaXJFbnVtOjpVTktOT1dOICYmIGRpciAhPSBmckRpckVudW06OkUgJiYgZGlyICE9IGZyRGlyRW51bTo6VykgPyAxIDogMDsKLSAgYmVuZENudCArPSAobWluQ29zdFkgJiYgZGlyICE9IGZyRGlyRW51bTo6VU5LTk9XTiAmJiBkaXIgIT0gZnJEaXJFbnVtOjpTICYmIGRpciAhPSBmckRpckVudW06Ok4pID8gMSA6IDA7Ci0gIGJlbmRDbnQgKz0gKG1pbkNvc3RaICYmIGRpciAhPSBmckRpckVudW06OlVOS05PV04gJiYgZGlyICE9IGZyRGlyRW51bTo6VSAmJiBkaXIgIT0gZnJEaXJFbnVtOjpEKSA/IDEgOiAwOwotICAvL2JlbmRDbnQgLT0gYmVuZENudCA/IDEgOiAwOwotICAvLyByZXR1cm4gKGRlbHRhWCArIGRlbHRhWSArIFZJQUNPU1QgKiBkZWx0YVogKyAoKGRlbHRhWCAmJiBkZWx0YVkpID8gMSA6IDApKTsKLSAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgIGNvdXQgPDwgIiAgZXN0IGNvc3QgPSAiIDw8IG1pbkNvc3RYICsgbWluQ29zdFkgKyBtaW5Db3N0WiArIGJlbmRDbnQgPDwgZW5kbDsKLSAgfQotICByZXR1cm4gKG1pbkNvc3RYICsgbWluQ29zdFkgKyBtaW5Db3N0WiArIGJlbmRDbnQpOwotCi19Ci0KLS8qaW5saW5lKi8gZnJEaXJFbnVtIEZsZXhHcmlkR3JhcGg6OmdldExhc3REaXIoY29uc3Qgc3RkOjpiaXRzZXQ8V0FWRUZST05UQklUU0laRT4gJmJ1ZmZlcikgewotICBhdXRvIGN1cnJEaXJWYWwgPSBidWZmZXIudG9fdWxvbmcoKSAmIDBiMTExdTsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGZyRGlyRW51bT4oY3VyckRpclZhbCk7Ci19Ci0KLXZvaWQgRmxleEdyaWRHcmFwaDo6Z2V0TmV4dEdyaWQoZnJNSWR4ICZncmlkWCwgZnJNSWR4ICZncmlkWSwgZnJNSWR4ICZncmlkWiwgY29uc3QgZnJEaXJFbnVtIGRpcikgewotICBzd2l0Y2goZGlyKSB7Ci0gICAgY2FzZSBmckRpckVudW06OkU6Ci0gICAgICArK2dyaWRYOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBmckRpckVudW06OlM6Ci0gICAgICAtLWdyaWRZOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBmckRpckVudW06Olc6Ci0gICAgICAtLWdyaWRYOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBmckRpckVudW06Ok46Ci0gICAgICArK2dyaWRZOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBmckRpckVudW06OlU6Ci0gICAgICArK2dyaWRaOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBmckRpckVudW06OkQ6Ci0gICAgICAtLWdyaWRaOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIDsKLSAgfQotICByZXR1cm47Ci19Ci0KLXZvaWQgRmxleEdyaWRHcmFwaDo6Z2V0UHJldkdyaWQoZnJNSWR4ICZncmlkWCwgZnJNSWR4ICZncmlkWSwgZnJNSWR4ICZncmlkWiwgY29uc3QgZnJEaXJFbnVtIGRpcikgY29uc3QgewotICBzd2l0Y2goZGlyKSB7Ci0gICAgY2FzZSBmckRpckVudW06OkU6Ci0gICAgICAtLWdyaWRYOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBmckRpckVudW06OlM6Ci0gICAgICArK2dyaWRZOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBmckRpckVudW06Olc6Ci0gICAgICArK2dyaWRYOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBmckRpckVudW06Ok46Ci0gICAgICAtLWdyaWRZOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBmckRpckVudW06OlU6Ci0gICAgICAtLWdyaWRaOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBmckRpckVudW06OkQ6Ci0gICAgICArK2dyaWRaOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIDsKLSAgfQotICByZXR1cm47Ci19Ci0KLS8qaW5saW5lKi8gZnJDb3N0IEZsZXhHcmlkR3JhcGg6OmdldE5leHRQYXRoQ29zdChjb25zdCBGbGV4V2F2ZWZyb250R3JpZCAmY3VyckdyaWQsIGNvbnN0IGZyRGlyRW51bSAmZGlyKSB7Ci0gIC8vIGJvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLSAgZnJNSWR4IGdyaWRYID0gY3VyckdyaWQueCgpOwotICBmck1JZHggZ3JpZFkgPSBjdXJyR3JpZC55KCk7Ci0gIGZyTUlkeCBncmlkWiA9IGN1cnJHcmlkLnooKTsKLSAgZnJDb3N0IG5leHRQYXRoQ29zdCA9IGN1cnJHcmlkLmdldFBhdGhDb3N0KCk7Ci0gIC8vIGJlbmRpbmcgY29zdAotICAvL2F1dG8gY3VyckRpciA9IGdldExhc3REaXIoY3VyckdyaWQuZ2V0QmFja1RyYWNlQnVmZmVyKCkpOwotICBhdXRvIGN1cnJEaXIgPSBjdXJyR3JpZC5nZXRMYXN0RGlyKCk7Ci0gIC8vIHN0ZDo6Y291dCA8PCAiKGN1cnJEaXIgPSAiIDw8IChpbnQpY3VyckRpciA8PCAiKSAiOwotICAvLyBpZiAoY3VyckRpciAhPSBkaXIgJiYgKGludCljdXJyRGlyID49IDEgJiYgKGludCljdXJyRGlyIDw9IDQgJiYKLSAgLy8gICAgICAgICAgICAgICAgICAgICAgIChpbnQpZGlyICAgICA+PSAxICYmIChpbnQpZGlyICAgICA8PSA0KSB7Ci0gIC8vICAgKytuZXh0UGF0aENvc3Q7Ci0gIC8vIH0KLSAgaWYgKGN1cnJEaXIgIT0gZGlyICYmIGN1cnJEaXIgIT0gZnJEaXJFbnVtOjpVTktOT1dOKSB7Ci0gICAgKytuZXh0UGF0aENvc3Q7Ci0gIH0KLSAgLy8gLy8gYXR0ZW1wdCB0byByZXNvbHZlIG1pbkFyZWEKLSAgYXV0byBsTnVtID0gZ2V0TGF5ZXJOdW0oY3VyckdyaWQueigpKTsKLSAgYXV0byBwYXRoV2lkdGggPSBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihsTnVtKS0+Z2V0V2lkdGgoKTsKLSAgLy9mckNvb3JkIGN1cnJBcmVhID0gKGN1cnJHcmlkLmdldExheWVyUGF0aExlbmd0aCgpICsgcGF0aFdpZHRoKSAqIHBhdGhXaWR0aDsgCi0gIGZyQ29vcmQgY3VyckFyZWEgPSBjdXJyR3JpZC5nZXRMYXllclBhdGhBcmVhKCk7Ci0gIGlmIChkaXIgPT0gZnJEaXJFbnVtOjpVKSB7Ci0gICAgY3VyckFyZWEgKz0gZ2V0SGFsZlZpYUVuY0FyZWEoY3VyckdyaWQueigpLCB0cnVlKTsKLSAgfSBlbHNlIGlmIChkaXIgPT0gZnJEaXJFbnVtOjpEKSB7Ci0gICAgY3VyckFyZWEgKz0gZ2V0SGFsZlZpYUVuY0FyZWEoY3VyckdyaWQueigpIC0gMSwgZmFsc2UpOwotICB9Ci0gIGF1dG8gbWluQXJlYUNvbnN0cmFpbnQgPSBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihsTnVtKS0+Z2V0QXJlYUNvbnN0cmFpbnQoKTsKLSAgaWYgKG1pbkFyZWFDb25zdHJhaW50ICYmIChkaXIgPT0gZnJEaXJFbnVtOjpVIHx8IGRpciA9PSBmckRpckVudW06OkQpICYmIGN1cnJBcmVhIDwgbWluQXJlYUNvbnN0cmFpbnQtPmdldE1pbkFyZWEoKSkgewotICAgIG5leHRQYXRoQ29zdCArPSBnZ0RSQ0Nvc3QgKiBtaW5BcmVhQ29uc3RyYWludC0+Z2V0TWluQXJlYSgpIC8gcGF0aFdpZHRoOwotICAgIC8vbmV4dFBhdGhDb3N0ICs9IGdnRFJDQ29zdCAqIHBhdGhXaWR0aDsKLSAgICAvLyBpZiAoVEVTVCkgewotICAgIC8vICAgc3RkOjpjb3V0IDw8ICJAQEBNQVIgKCIgPDxjdXJyR3JpZC54KCkgPDwiLCAiIDw8Y3VyckdyaWQueSgpIDw8IiwgIiA8PGN1cnJHcmlkLnooKSA8PCIpIGRpciA9ICIgPDwgKGludClkaXIgPDwgIlxuIjsKLSAgICAvLyB9Ci0gIH0KLSAgLy9mck1JZHggbmV4dEdyaWRYID0gZ3JpZFg7Ci0gIC8vZnJNSWR4IG5leHRHcmlkWSA9IGdyaWRZOwotICAvL2ZyTUlkeCBuZXh0R3JpZFogPSBncmlkWjsKLSAgLy9nZXROZXh0R3JpZChuZXh0R3JpZFgsIG5leHRHcmlkWSwgbmV4dEdyaWRaLCBkaXIpOwotICAvL25leHRQYXRoQ29zdCArPSBncmlkR3JhcGguZ2V0RWRnZUNvc3QoZ3JpZFgsIGdyaWRZLCBncmlkWiwgZGlyKSAqIGdyaWRHcmFwaC5nZXRFZGdlTGVuZ3RoKGdyaWRYLCBncmlkWSwgZ3JpZFosIGRpcik7Ci0gIGJvb2wgZ3JpZENvc3QgICA9IGhhc0dyaWRDb3N0KGdyaWRYLCBncmlkWSwgZ3JpZFosIGRpcik7Ci0gIGJvb2wgZHJjQ29zdCAgICA9IGhhc0RSQ0Nvc3QoZ3JpZFgsIGdyaWRZLCBncmlkWiwgZGlyKTsKLSAgYm9vbCBtYXJrZXJDb3N0ID0gaGFzTWFya2VyQ29zdChncmlkWCwgZ3JpZFksIGdyaWRaLCBkaXIpOwotICBib29sIHNoYXBlQ29zdCAgPSBoYXNTaGFwZUNvc3QoZ3JpZFgsIGdyaWRZLCBncmlkWiwgZGlyKTsKLQotICBuZXh0UGF0aENvc3QgKz0gZ2V0RWRnZUxlbmd0aChncmlkWCwgZ3JpZFksIGdyaWRaLCBkaXIpCi0gICAgICAgICAgICAgICAgICArIChncmlkQ29zdCAgID8gR1JJRENPU1QgICAgICAgICAqIGdldEVkZ2VMZW5ndGgoZ3JpZFgsIGdyaWRZLCBncmlkWiwgZGlyKSA6IDApCi0gICAgICAgICAgICAgICAgICArIChkcmNDb3N0ICAgID8gZ2dEUkNDb3N0ICAgICAgICAqIGdldEVkZ2VMZW5ndGgoZ3JpZFgsIGdyaWRZLCBncmlkWiwgZGlyKSA6IDApCi0gICAgICAgICAgICAgICAgICArIChtYXJrZXJDb3N0ID8gZ2dNYXJrZXJDb3N0ICAgICAqIGdldEVkZ2VMZW5ndGgoZ3JpZFgsIGdyaWRZLCBncmlkWiwgZGlyKSA6IDApCi0gICAgICAgICAgICAgICAgICArIChzaGFwZUNvc3QgID8gU0hBUEVDT1NUICAgICAgICAqIGdldEVkZ2VMZW5ndGgoZ3JpZFgsIGdyaWRZLCBncmlkWiwgZGlyKSA6IDApOwotICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgY291dCA8PCJlZGdlIGdyaWQvc2hhcGUvZHJjL21hcmtlci9sZW5ndGggPSAiIAotICAgICAgICAgPDxoYXNHcmlkQ29zdChncmlkWCwgZ3JpZFksIGdyaWRaLCBkaXIpICAgPDwiLyIKLSAgICAgICAgIDw8aGFzU2hhcGVDb3N0KGdyaWRYLCBncmlkWSwgZ3JpZFosIGRpcikgIDw8Ii8iCi0gICAgICAgICA8PGhhc0RSQ0Nvc3QoZ3JpZFgsIGdyaWRZLCBncmlkWiwgZGlyKSAgICA8PCIvIgotICAgICAgICAgPDxoYXNNYXJrZXJDb3N0KGdyaWRYLCBncmlkWSwgZ3JpZFosIGRpcikgPDwiLyIKLSAgICAgICAgIDw8Z2V0RWRnZUxlbmd0aChncmlkWCwgZ3JpZFksIGdyaWRaLCBkaXIpIDw8ZW5kbDsKLSAgfQotICByZXR1cm4gbmV4dFBhdGhDb3N0OwotCi19Ci0KLS8qaW5saW5lKi8gRmxleE1hemVJZHggRmxleEdyaWRHcmFwaDo6Z2V0VGFpbElkeChjb25zdCBGbGV4TWF6ZUlkeCAmY3VycklkeCwgY29uc3QgRmxleFdhdmVmcm9udEdyaWQgJmN1cnJHcmlkKSB7Ci0gIGludCBncmlkWCA9IGN1cnJJZHgueCgpOwotICBpbnQgZ3JpZFkgPSBjdXJySWR4LnkoKTsKLSAgaW50IGdyaWRaID0gY3VycklkeC56KCk7Ci0gIGF1dG8gYmFja1RyYWNlQnVmZmVyID0gY3VyckdyaWQuZ2V0QmFja1RyYWNlQnVmZmVyKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgV0FWRUZST05UQlVGRkVSU0laRTsgKytpKSB7Ci0gICAgaW50IGN1cnJEaXJWYWwgPSBiYWNrVHJhY2VCdWZmZXIudG9fdWxvbmcoKSAtICgoYmFja1RyYWNlQnVmZmVyLnRvX3Vsb25nKCkgPj4gRElSQklUU0laRSkgPDwgRElSQklUU0laRSk7Ci0gICAgZnJEaXJFbnVtIGN1cnJEaXIgPSBzdGF0aWNfY2FzdDxmckRpckVudW0+KGN1cnJEaXJWYWwpOwotICAgIGJhY2tUcmFjZUJ1ZmZlciA+Pj0gRElSQklUU0laRTsKLSAgICBnZXRQcmV2R3JpZChncmlkWCwgZ3JpZFksIGdyaWRaLCBjdXJyRGlyKTsKLSAgfQotICByZXR1cm4gRmxleE1hemVJZHgoZ3JpZFgsIGdyaWRZLCBncmlkWik7Ci19Ci0KLS8qaW5saW5lKi8gYm9vbCBGbGV4R3JpZEdyYXBoOjppc0V4cGFuZGFibGUoY29uc3QgRmxleFdhdmVmcm9udEdyaWQgJmN1cnJHcmlkLCBmckRpckVudW0gZGlyKSB7Ci0gIGZyTUlkeCBncmlkWCA9IGN1cnJHcmlkLngoKTsKLSAgZnJNSWR4IGdyaWRZID0gY3VyckdyaWQueSgpOwotICBmck1JZHggZ3JpZFogPSBjdXJyR3JpZC56KCk7Ci0gIHJldmVyc2UoZ3JpZFgsIGdyaWRZLCBncmlkWiwgZGlyKTsKLSAgaWYgKCFoYXNFZGdlKGdyaWRYLCBncmlkWSwgZ3JpZFosIGRpcikgfHwgCi0gICAgICBpc1NyYyhncmlkWCwgZ3JpZFksIGdyaWRaKSB8fCAKLSAgICAgIGdldFByZXZBc3Rhck5vZGVEaXIoZ3JpZFgsIGdyaWRZLCBncmlkWikgIT0gZnJEaXJFbnVtOjpVTktOT1dOIHx8Ci0gICAgICBjdXJyR3JpZC5nZXRMYXN0RGlyKCkgPT0gZGlyKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgewotICAgIHJldHVybiB0cnVlOwotICB9Ci19Ci0KLXZvaWQgRmxleEdyaWRHcmFwaDo6dHJhY2VCYWNrUGF0aChjb25zdCBGbGV4V2F2ZWZyb250R3JpZCAmY3VyckdyaWQsIHZlY3RvcjxGbGV4TWF6ZUlkeD4gJnBhdGgsIHZlY3RvcjxGbGV4TWF6ZUlkeD4gJnJvb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxleE1hemVJZHggJmNjTWF6ZUlkeDEsIEZsZXhNYXplSWR4ICZjY01hemVJZHgyKSB7Ci0gIC8vYm9vbCBlbmFibGVPdXRwdXQgPSB0cnVlOwotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgY291dCA8PCAiICAgIHN0YXJ0IHRyYWNlQmFja1BhdGguLi5cbiI7Ci0gIH0KLSAgZnJEaXJFbnVtIHByZXZEaXIgPSBmckRpckVudW06OlVOS05PV04sIGN1cnJEaXI7Ci0gIGludCBjdXJyWCA9IGN1cnJHcmlkLngoKSwgY3VyclkgPSBjdXJyR3JpZC55KCksIGN1cnJaID0gY3VyckdyaWQueigpOwotICAvLyBwb3AgY29udGVudCBpbiBidWZmZXIKLSAgYXV0byBiYWNrVHJhY2VCdWZmZXIgPSBjdXJyR3JpZC5nZXRCYWNrVHJhY2VCdWZmZXIoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBXQVZFRlJPTlRCVUZGRVJTSVpFOyArK2kpIHsKLSAgICAvLyBjdXJyZW50IGdyaWQgaXMgc3JjCi0gICAgaWYgKGlzU3JjKGN1cnJYLCBjdXJyWSwgY3VyclopKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgLy8gZ2V0IGxhc3QgZGlyZWN0aW9uCi0gICAgY3VyckRpciA9IGdldExhc3REaXIoYmFja1RyYWNlQnVmZmVyKTsKLSAgICBiYWNrVHJhY2VCdWZmZXIgPj49IERJUkJJVFNJWkU7Ci0gICAgaWYgKGN1cnJEaXIgPT0gZnJEaXJFbnVtOjpVTktOT1dOKSB7Ci0gICAgICBjb3V0IDw8ICJXYXJuaW5nOiB1bmV4cGVjdGVkIGRpcmVjdGlvbiBpbiB0cmFjQmFja1BhdGhcbiI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgLy8gYWRkIHRvIHJvb3QKLSAgICByb290LnB1c2hfYmFjayhGbGV4TWF6ZUlkeChjdXJyWCwgY3VyclksIGN1cnJaKSk7Ci0gICAgLy8gcHVzaCBwb2ludCB0byBwYXRoCi0gICAgaWYgKGN1cnJEaXIgIT0gcHJldkRpcikgewotICAgICAgcGF0aC5wdXNoX2JhY2soRmxleE1hemVJZHgoY3VyclgsIGN1cnJZLCBjdXJyWikpOwotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8IiAtLSAoIiA8PGN1cnJYIDw8IiwgIiA8PGN1cnJZIDw8IiwgIiA8PGN1cnJaIDw8IikiOwotICAgICAgfQotICAgIH0KLSAgICBnZXRQcmV2R3JpZChjdXJyWCwgY3VyclksIGN1cnJaLCBjdXJyRGlyKTsKLSAgICBwcmV2RGlyID0gY3VyckRpcjsKLSAgfQotICAvLyB0cmFjZSBiYWNrIGFjY29yZGluZyB0byBncmlkIHByZXYgZGlyCi0gIHdoaWxlIChpc1NyYyhjdXJyWCwgY3VyclksIGN1cnJaKSA9PSBmYWxzZSkgewotICAgIC8vIGFkZCB0byByb290Ci0gICAgcm9vdC5wdXNoX2JhY2soRmxleE1hemVJZHgoY3VyclgsIGN1cnJZLCBjdXJyWikpOwotICAgIC8vIGdldCBsYXN0IGRpcmVjdGlvbgotICAgIGN1cnJEaXIgPSBnZXRQcmV2QXN0YXJOb2RlRGlyKGN1cnJYLCBjdXJyWSwgY3VyclopOwotICAgIGlmIChjdXJyRGlyID09IGZyRGlyRW51bTo6VU5LTk9XTikgewotICAgICAgY291dCA8PCAiV2FybmluZzogdW5leHBlY3RlZCBkaXJlY3Rpb24gaW4gdHJhY0JhY2tQYXRoXG4iOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChjdXJyRGlyICE9IHByZXZEaXIpIHsKLSAgICAgIHBhdGgucHVzaF9iYWNrKEZsZXhNYXplSWR4KGN1cnJYLCBjdXJyWSwgY3VyclopKTsKLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgLS0gKCIgPDxjdXJyWCA8PCIsICIgPDxjdXJyWSA8PCIsICIgPDxjdXJyWiA8PCIpIjsKLSAgICAgIH0KLSAgICB9Ci0gICAgZ2V0UHJldkdyaWQoY3VyclgsIGN1cnJZLCBjdXJyWiwgY3VyckRpcik7Ci0gICAgcHJldkRpciA9IGN1cnJEaXI7Ci0gIH0KLSAgLy8gYWRkIGZpbmFsIHBhdGggdG8gc3JjLCBvbmx5IGFkZCB3aGVuIHBhdGggZXhpc3RzOyBubyBwYXRoIGV4aXN0cyAoc3JjID0gZHN0KQotICBpZiAoIXBhdGguZW1wdHkoKSkgewotICAgIHBhdGgucHVzaF9iYWNrKEZsZXhNYXplSWR4KGN1cnJYLCBjdXJyWSwgY3VyclopKTsKLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBjb3V0IDw8IiAtLSAoIiA8PGN1cnJYIDw8IiwgIiA8PGN1cnJZIDw8IiwgIiA8PGN1cnJaIDw8IikiOwotICAgIH0KLSAgfQotICBmb3IgKGF1dG8gJm1pOiBwYXRoKSB7Ci0gICAgY2NNYXplSWR4MS5zZXQobWluKGNjTWF6ZUlkeDEueCgpLCBtaS54KCkpLAotICAgICAgICAgICAgICAgICAgIG1pbihjY01hemVJZHgxLnkoKSwgbWkueSgpKSwKLSAgICAgICAgICAgICAgICAgICBtaW4oY2NNYXplSWR4MS56KCksIG1pLnooKSkpOwotICAgIGNjTWF6ZUlkeDIuc2V0KG1heChjY01hemVJZHgyLngoKSwgbWkueCgpKSwKLSAgICAgICAgICAgICAgICAgICBtYXgoY2NNYXplSWR4Mi55KCksIG1pLnkoKSksCi0gICAgICAgICAgICAgICAgICAgbWF4KGNjTWF6ZUlkeDIueigpLCBtaS56KCkpKTsKLSAgfQotICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgY291dCA8PGVuZGw7Ci0gIH0KLQotfQotCi1ib29sIEZsZXhHcmlkR3JhcGg6OnNlYXJjaCh2ZWN0b3I8RmxleE1hemVJZHg+ICZjb25uQ29tcHMsIGRyUGluKiBuZXh0UGluLCB2ZWN0b3I8RmxleE1hemVJZHg+ICZwYXRoLEZsZXhNYXplSWR4ICZjY01hemVJZHgxLCBGbGV4TWF6ZUlkeCAmY2NNYXplSWR4MikgewotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLSAgaW50IHN0ZXBDbnQgPSAwOwotCi0gIC8vIHByZXAgbmV4dFBpbkJveAotICBmck1JZHggeERpbSwgeURpbSwgekRpbTsKLSAgZ2V0RGltKHhEaW0sIHlEaW0sIHpEaW0pOwotICBGbGV4TWF6ZUlkeCBkc3RNYXplSWR4MSh4RGltIC0gMSwgeURpbSAtIDEsIHpEaW0gLSAxKTsKLSAgRmxleE1hemVJZHggZHN0TWF6ZUlkeDIoMCwgMCwgMCk7Ci0gIEZsZXhNYXplSWR4IG1pOwotICBmb3IgKGF1dG8gJmFwOiBuZXh0UGluLT5nZXRBY2Nlc3NQYXR0ZXJucygpKSB7Ci0gICAgYXAtPmdldE1hemVJZHgobWkpOwotICAgIGRzdE1hemVJZHgxLnNldChtaW4oZHN0TWF6ZUlkeDEueCgpLCBtaS54KCkpLAotICAgICAgICAgICAgICAgICAgICBtaW4oZHN0TWF6ZUlkeDEueSgpLCBtaS55KCkpLAotICAgICAgICAgICAgICAgICAgICBtaW4oZHN0TWF6ZUlkeDEueigpLCBtaS56KCkpKTsKLSAgICBkc3RNYXplSWR4Mi5zZXQobWF4KGRzdE1hemVJZHgyLngoKSwgbWkueCgpKSwKLSAgICAgICAgICAgICAgICAgICAgbWF4KGRzdE1hemVJZHgyLnkoKSwgbWkueSgpKSwKLSAgICAgICAgICAgICAgICAgICAgbWF4KGRzdE1hemVJZHgyLnooKSwgbWkueigpKSk7Ci0gIH0KLQotICAvLyBzdGQ6OmNvdXQgPDwgInN0YXJ0IGFzdGFyU2VhcmNoXG4iOwotICB3YXZlZnJvbnQgPSBGbGV4V2F2ZWZyb250KCk7Ci0gIC8vIGluaXQgd2F2ZWZyb250Ci0gIGZvciAoYXV0byAmaWR4OiBjb25uQ29tcHMpIHsKLSAgICBpZiAoaXNEc3QoaWR4LngoKSwgaWR4LnkoKSwgaWR4LnooKSkpIHsKLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCJtZXNzYWdlOiBhc3RhclNlYXJjaCBkc3QgY292ZXJlZCAoIiA8PGlkeC54KCkgPDwiLCAiIDw8aWR4LnkoKSA8PCIsICIgPDxpZHgueigpIDw8IikiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIHBhdGgucHVzaF9iYWNrKEZsZXhNYXplSWR4KGlkeC54KCksIGlkeC55KCksIGlkeC56KCkpKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAvLyBnZXQgbWluIGFyZWEgbWluIGxlbmd0aAotICAgIGF1dG8gbE51bSA9IGdldExheWVyTnVtKGlkeC56KCkpOwotICAgIC8vYXV0byBwYXRoV2lkdGggPSBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihsTnVtKS0+Z2V0V2lkdGgoKTsKLSAgICBhdXRvIG1pbkFyZWFDb25zdHJhaW50ID0gZ2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0TGF5ZXIobE51bSktPmdldEFyZWFDb25zdHJhaW50KCk7Ci0gICAgZnJDb29yZCBmYWtlQXJlYSA9IG1pbkFyZWFDb25zdHJhaW50LT5nZXRNaW5BcmVhKCk7Ci0KLSAgICBGbGV4V2F2ZWZyb250R3JpZCBjdXJyR3JpZChpZHgueCgpLCBpZHgueSgpLCBpZHgueigpLCBmYWtlQXJlYSwgMCwgZ2V0RXN0Q29zdChpZHgsIGRzdE1hemVJZHgxLCBkc3RNYXplSWR4MiwgZnJEaXJFbnVtOjpVTktOT1dOKSk7Ci0gICAgd2F2ZWZyb250LnB1c2goY3VyckdyaWQpOwotICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgIGNvdXQgPDwic3JjIGFkZCB0byB3YXZlZnJvbnQgKCIgPDxpZHgueCgpIDw8IiwgIiA8PGlkeC55KCkgPDwiLCAiIDw8aWR4LnooKSA8PCIpIiA8PGVuZGw7Ci0gICAgfQotICB9Ci0gIHdoaWxlKCF3YXZlZnJvbnQuZW1wdHkoKSkgewotICAgIC8vIHN0ZDo6Y291dCA8PCAiaGVyZTFcbiI7Ci0gICAgYXV0byBjdXJyR3JpZCA9IHdhdmVmcm9udC50b3AoKTsKLSAgICB3YXZlZnJvbnQucG9wKCk7Ci0gICAgaWYgKGdldFByZXZBc3Rhck5vZGVEaXIoY3VyckdyaWQueCgpLCBjdXJyR3JpZC55KCksIGN1cnJHcmlkLnooKSkgIT0gZnJEaXJFbnVtOjpVTktOT1dOKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgLy8gdGVzdAotICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICsrc3RlcENudDsKLSAgICB9Ci0gICAgLy8gaWYgKHN0ZXBDbnQgJSAxMDAwMDAgPT0gMCkgewotICAgIC8vICAgc3RkOjpjb3V0IDw8ICJ3YXZlZnJvbnQgc2l6ZSA9ICIgPDwgd2F2ZWZyb250LnNpemUoKSA8PCAiIGF0IHN0ZXAgPSAiIDw8IHN0ZXBDbnQgPDwgIlxuIjsKLSAgICAvLyB9Ci0gICAgaWYgKGlzRHN0KGN1cnJHcmlkLngoKSwgY3VyckdyaWQueSgpLCBjdXJyR3JpZC56KCkpKSB7Ci0gICAgICB0cmFjZUJhY2tQYXRoKGN1cnJHcmlkLCBwYXRoLCBjb25uQ29tcHMsIGNjTWF6ZUlkeDEsIGNjTWF6ZUlkeDIpOwotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8ICJwYXRoIGZvdW5kLiBzdGVwQ250ID0gIiA8PCBzdGVwQ250IDw8ICJcbiI7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gZXhwYW5kIGFuZCB1cGRhdGUgd2F2ZWZyb250Ci0gICAgICBleHBhbmRXYXZlZnJvbnQoY3VyckdyaWQsIGRzdE1hemVJZHgxLCBkc3RNYXplSWR4Mik7Ci0gICAgfQotICAgIAotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZHIvRmxleE1hemVUeXBlcy5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZHIvRmxleE1hemVUeXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDZlNTlmLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RyL0ZsZXhNYXplVHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX0ZMRVhfTUFaRV9UWVBFU19IXwotI2RlZmluZSBfRkxFWF9NQVpFX1RZUEVTX0hfCi0KLW5hbWVzcGFjZSBmciB7Ci0gIGNsYXNzIEZsZXhNYXplSWR4IHsKLSAgcHVibGljOgotICAgIEZsZXhNYXplSWR4KCk6IHhJZHgoLTEpLCB5SWR4KC0xKSwgeklkeCgtMSkge30KLSAgICBGbGV4TWF6ZUlkeChmck1JZHggeEluLCBmck1JZHggeUluLCBmck1JZHggekluKTogeElkeCh4SW4pLCB5SWR4KHlJbiksIHpJZHgoekluKSB7fQotICAgIC8vIGdldHRlcnMKLSAgICBmck1JZHggeCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiB4SWR4OwotICAgIH0KLSAgICBmck1JZHggeSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiB5SWR4OwotICAgIH0KLSAgICBmck1JZHggeigpIGNvbnN0IHsKLSAgICAgIHJldHVybiB6SWR4OwotICAgIH0KLSAgICBib29sIGVtcHR5KCkgY29uc3QgewotICAgICAgcmV0dXJuICh4SWR4ID09IC0xICYmIHlJZHggPT0gLTEgJiYgeklkeCA9PSAtMSk7Ci0gICAgfQotICAgIC8vIHNldHRlcnMKLSAgICB2b2lkIHNldChmck1JZHggeEluLCBmck1JZHggeUluLCBmck1JZHggekluKSB7Ci0gICAgICB4SWR4ID0geEluOwotICAgICAgeUlkeCA9IHlJbjsKLSAgICAgIHpJZHggPSB6SW47Ci0gICAgfQotICAgIHZvaWQgc2V0KGNvbnN0IEZsZXhNYXplSWR4ICZpbikgewotICAgICAgeElkeCA9IGluLngoKTsKLSAgICAgIHlJZHggPSBpbi55KCk7Ci0gICAgICB6SWR4ID0gaW4ueigpOwotICAgIH0KLSAgICAvLyBvdGhlcnMKLSAgICBib29sIG9wZXJhdG9yPChjb25zdCBGbGV4TWF6ZUlkeCAmcmhzKSBjb25zdCB7Ci0gICAgICBpZiAodGhpcy0+eElkeCAhPSByaHMueCgpKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLT54SWR4IDwgcmhzLngoKTsKLSAgICAgIH0gZWxzZSBpZiAodGhpcy0+eUlkeCAhPSByaHMueSgpKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLT55SWR4IDwgcmhzLnkoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiB0aGlzLT56SWR4IDwgcmhzLnooKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEZsZXhNYXplSWR4ICZyaHMpIGNvbnN0IHsKLSAgICAgIHJldHVybiAoeElkeCA9PSByaHMueElkeCAmJiB5SWR4ID09IHJocy55SWR4ICYmIHpJZHggPT0gcmhzLnpJZHgpOwotICAgIH0KLQotICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgRmxleE1hemVJZHggJm1JZHgpIHsKLSAgICAgIG9zIDw8IigiIDw8bUlkeC54KCkgPDwiLCAiIDw8bUlkeC55KCkgPDwiLCAiIDw8bUlkeC56KCkgPDwiKSI7Ci0gICAgICByZXR1cm4gb3M7Ci0gICAgfQotCi0gIHByb3RlY3RlZDoKLSAgICBmck1JZHggeElkeDsKLSAgICBmck1JZHggeUlkeDsKLSAgICBmck1JZHggeklkeDsKLSAgfTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kci9GbGV4UmVnaW9uUXVlcnkuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZHIvRmxleFJlZ2lvblF1ZXJ5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU5MWFhZC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kci9GbGV4UmVnaW9uUXVlcnkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJkci9GbGV4UmVnaW9uUXVlcnkuaCIKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgZnI7Ci0KLXZvaWQgRmxleFJlZ2lvblF1ZXJ5OjphZGQoZnJMaXN0SXRlcjxmclBhdGhTZWc+ICZwYXRoU2VnKSB7Ci0gIGZyQm94IGZyYjsKLSAgcGF0aFNlZy0+Z2V0QkJveChmcmIpOwotICBib3hfdCBib29zdGIgPSBib3hfdChwb2ludF90KGZyYi5sZWZ0KCksIGZyYi5ib3R0b20oKSksIHBvaW50X3QoZnJiLnJpZ2h0KCksIGZyYi50b3AoKSkpOwotICAvL2ZyTGlzdEl0ZXI8aW50PiB0ZXN0OwotICAvL2ludCogcHRyID0gbmV3IGludCgzKTsKLSAgLy9zaGFyZWRfcHRyPGZyQ29ubkZpZz4gcHRyID0gbnVsbHB0cjsKLSAgLy9wYXRoc2Vncy5hdChwYXRoU2VnLT5nZXRMYXllck51bSgpKS5pbnNlcnQobWFrZV9wYWlyKGJvb3N0YiwgcHRyKSk7Ci0gIC8vdW5pcXVlX2xvY2sgbG9jayhtdXRleF9wYXRoc2Vncy5hdChwYXRoU2VnLT5nZXRMYXllck51bSgpKSk7Ci0gIC8vdW5pcXVlX2xvY2sgbG9jayhtKTsKLSAgcGF0aHNlZ3MuYXQocGF0aFNlZy0+Z2V0TGF5ZXJOdW0oKSkuaW5zZXJ0KG1ha2VfcGFpcihib29zdGIsIHBhdGhTZWcpKTsKLX0KLQotdm9pZCBGbGV4UmVnaW9uUXVlcnk6OmFkZChmckxpc3RJdGVyPGZyVmlhPiAmdmlhKSB7Ci0gIGZyQm94IGZyYjsKLSAgdmlhLT5nZXRMYXllcjFCQm94KGZyYik7Ci0gIGJveF90IGJvb3N0YiA9IGJveF90KHBvaW50X3QoZnJiLmxlZnQoKSwgZnJiLmJvdHRvbSgpKSwgcG9pbnRfdChmcmIucmlnaHQoKSwgZnJiLnRvcCgpKSk7Ci0gIC8vdW5pcXVlX2xvY2sgbG9jazEobXV0ZXhfdmlhcy5hdCh2aWFzLT5nZXRWaWFEZWYoKS0+Z2V0TGF5ZXIxTnVtKCkpKTsKLSAgdmlhcy5hdCh2aWEtPmdldFZpYURlZigpLT5nZXRMYXllcjFOdW0oKSkuaW5zZXJ0KG1ha2VfcGFpcihib29zdGIsIHZpYSkpOwotICAvL2xvY2sxLnVubG9jaygpOwotCi0gIHZpYS0+Z2V0TGF5ZXIyQkJveChmcmIpOwotICBib29zdGIgPSBib3hfdChwb2ludF90KGZyYi5sZWZ0KCksIGZyYi5ib3R0b20oKSksIHBvaW50X3QoZnJiLnJpZ2h0KCksIGZyYi50b3AoKSkpOwotICAvL3VuaXF1ZV9sb2NrIGxvY2syKG11dGV4X3ZpYXMuYXQodmlhcy0+Z2V0VmlhRGVmKCktPmdldExheWVyMk51bSgpKSk7Ci0gIHZpYXMuYXQodmlhLT5nZXRWaWFEZWYoKS0+Z2V0TGF5ZXIyTnVtKCkpLmluc2VydChtYWtlX3BhaXIoYm9vc3RiLCB2aWEpKTsKLSAgLy9sb2NrMi51bmxvY2soKTsKLQotICB2aWEtPmdldEN1dEJCb3goZnJiKTsKLSAgYm9vc3RiID0gYm94X3QocG9pbnRfdChmcmIubGVmdCgpLCBmcmIuYm90dG9tKCkpLCBwb2ludF90KGZyYi5yaWdodCgpLCBmcmIudG9wKCkpKTsKLSAgLy91bmlxdWVfbG9jayBsb2NrMyhtdXRleF92aWFzLmF0KHZpYXMtPmdldFZpYURlZigpLT5nZXRDdXRMYXllck51bSgpKSk7Ci0gIHZpYXMuYXQodmlhLT5nZXRWaWFEZWYoKS0+Z2V0Q3V0TGF5ZXJOdW0oKSkuaW5zZXJ0KG1ha2VfcGFpcihib29zdGIsIHZpYSkpOwotICAvL2xvY2szLnVubG9jaygpOwotfQotCi12b2lkIEZsZXhSZWdpb25RdWVyeTo6YWRkKGZyTGlzdEl0ZXI8RmxleEFjY2Vzc1BhdHRlcm4+ICZhcCkgewotICBmclBvaW50IGJlZ2luUG9pbnQsIGVuZFBvaW50OwotICBhcC0+Z2V0UG9pbnRzKGJlZ2luUG9pbnQsIGVuZFBvaW50KTsKLSAgYm94X3QgYm9vc3RiID0gYm94X3QocG9pbnRfdChlbmRQb2ludC54KCksIGVuZFBvaW50LnkoKSksIHBvaW50X3QoZW5kUG9pbnQueCgpLCBlbmRQb2ludC55KCkpKTsKLSAgYXBzLmF0KGFwLT5nZXRFbmRMYXllck51bSgpKS5pbnNlcnQobWFrZV9wYWlyKGJvb3N0YiwgYXApKTsKLX0KLQotdm9pZCBGbGV4UmVnaW9uUXVlcnk6OmFkZChmclNoYXBlKiBzaGFwZSkgewotICBmckJveCBmcmI7Ci0gIHNoYXBlLT5nZXRCQm94KGZyYik7Ci0gIGJveF90IGJvb3N0YiA9IGJveF90KHBvaW50X3QoZnJiLmxlZnQoKSwgZnJiLmJvdHRvbSgpKSwgcG9pbnRfdChmcmIucmlnaHQoKSwgZnJiLnRvcCgpKSk7Ci0gIHNoYXBlcy5hdChzaGFwZS0+Z2V0TGF5ZXJOdW0oKSkuaW5zZXJ0KG1ha2VfcGFpcihib29zdGIsIHNoYXBlKSk7Ci19Ci0KLXZvaWQgRmxleFJlZ2lvblF1ZXJ5OjphZGQoZnJWaWEgKnZpYSkgewotICBmckJveCBmcmI7Ci0gIHZpYS0+Z2V0TGF5ZXIxQkJveChmcmIpOwotICBib3hfdCBib29zdGIgPSBib3hfdChwb2ludF90KGZyYi5sZWZ0KCksIGZyYi5ib3R0b20oKSksIHBvaW50X3QoZnJiLnJpZ2h0KCksIGZyYi50b3AoKSkpOwotICBzaGFwZXMuYXQodmlhLT5nZXRWaWFEZWYoKS0+Z2V0TGF5ZXIxTnVtKCkpLmluc2VydChtYWtlX3BhaXIoYm9vc3RiLCB2aWEpKTsKLQotICB2aWEtPmdldExheWVyMkJCb3goZnJiKTsKLSAgYm9vc3RiID0gYm94X3QocG9pbnRfdChmcmIubGVmdCgpLCBmcmIuYm90dG9tKCkpLCBwb2ludF90KGZyYi5yaWdodCgpLCBmcmIudG9wKCkpKTsKLSAgc2hhcGVzLmF0KHZpYS0+Z2V0VmlhRGVmKCktPmdldExheWVyMk51bSgpKS5pbnNlcnQobWFrZV9wYWlyKGJvb3N0YiwgdmlhKSk7Ci0KLSAgdmlhLT5nZXRDdXRCQm94KGZyYik7Ci0gIGJvb3N0YiA9IGJveF90KHBvaW50X3QoZnJiLmxlZnQoKSwgZnJiLmJvdHRvbSgpKSwgcG9pbnRfdChmcmIucmlnaHQoKSwgZnJiLnRvcCgpKSk7Ci0gIHNoYXBlcy5hdCh2aWEtPmdldFZpYURlZigpLT5nZXRDdXRMYXllck51bSgpKS5pbnNlcnQobWFrZV9wYWlyKGJvb3N0YiwgdmlhKSk7Ci19Ci0KLXZvaWQgRmxleFJlZ2lvblF1ZXJ5OjpyZW1vdmUoZnJMaXN0SXRlcjxmclBhdGhTZWc+ICZwYXRoU2VnKSB7Ci0gIGZyQm94IGZyYjsKLSAgcGF0aFNlZy0+Z2V0QkJveChmcmIpOwotICBib3hfdCBib29zdGIgPSBib3hfdChwb2ludF90KGZyYi5sZWZ0KCksIGZyYi5ib3R0b20oKSksIHBvaW50X3QoZnJiLnJpZ2h0KCksIGZyYi50b3AoKSkpOwotICAvL3VuaXF1ZV9sb2NrIGxvY2sobXV0ZXhfcGF0aHNlZ3MuYXQocGF0aFNlZy0+Z2V0TGF5ZXJOdW0oKSkpOwotICBwYXRoc2Vncy5hdChwYXRoU2VnLT5nZXRMYXllck51bSgpKS5yZW1vdmUobWFrZV9wYWlyKGJvb3N0YiwgcGF0aFNlZykpOwotfQotCi12b2lkIEZsZXhSZWdpb25RdWVyeTo6cmVtb3ZlKGZyTGlzdEl0ZXI8ZnJWaWE+ICZ2aWEpIHsKLSAgZnJCb3ggZnJiOwotICB2aWEtPmdldExheWVyMUJCb3goZnJiKTsKLSAgYm94X3QgYm9vc3RiID0gYm94X3QocG9pbnRfdChmcmIubGVmdCgpLCBmcmIuYm90dG9tKCkpLCBwb2ludF90KGZyYi5yaWdodCgpLCBmcmIudG9wKCkpKTsKLSAgLy91bmlxdWVfbG9jayBsb2NrMShtdXRleF92aWFzLmF0KHZpYXMtPmdldFZpYURlZigpLT5nZXRMYXllcjFOdW0oKSkpOwotICB2aWFzLmF0KHZpYS0+Z2V0VmlhRGVmKCktPmdldExheWVyMU51bSgpKS5yZW1vdmUobWFrZV9wYWlyKGJvb3N0YiwgdmlhKSk7Ci0gIC8vbG9jazEudW5sb2NrKCk7Ci0KLSAgdmlhLT5nZXRMYXllcjJCQm94KGZyYik7Ci0gIGJvb3N0YiA9IGJveF90KHBvaW50X3QoZnJiLmxlZnQoKSwgZnJiLmJvdHRvbSgpKSwgcG9pbnRfdChmcmIucmlnaHQoKSwgZnJiLnRvcCgpKSk7Ci0gIC8vdW5pcXVlX2xvY2sgbG9jazIobXV0ZXhfdmlhcy5hdCh2aWFzLT5nZXRWaWFEZWYoKS0+Z2V0TGF5ZXIyTnVtKCkpKTsKLSAgdmlhcy5hdCh2aWEtPmdldFZpYURlZigpLT5nZXRMYXllcjJOdW0oKSkucmVtb3ZlKG1ha2VfcGFpcihib29zdGIsIHZpYSkpOwotICAvL2xvY2syLnVubG9jaygpOwotCi0gIHZpYS0+Z2V0Q3V0QkJveChmcmIpOwotICBib29zdGIgPSBib3hfdChwb2ludF90KGZyYi5sZWZ0KCksIGZyYi5ib3R0b20oKSksIHBvaW50X3QoZnJiLnJpZ2h0KCksIGZyYi50b3AoKSkpOwotICAvL3VuaXF1ZV9sb2NrIGxvY2szKG11dGV4X3ZpYXMuYXQodmlhcy0+Z2V0VmlhRGVmKCktPmdldEN1dExheWVyTnVtKCkpKTsKLSAgdmlhcy5hdCh2aWEtPmdldFZpYURlZigpLT5nZXRDdXRMYXllck51bSgpKS5yZW1vdmUobWFrZV9wYWlyKGJvb3N0YiwgdmlhKSk7Ci0gIC8vbG9jazMudW5sb2NrKCk7Ci19Ci0KLXZvaWQgRmxleFJlZ2lvblF1ZXJ5OjpyZW1vdmUoZnJMaXN0SXRlcjxGbGV4QWNjZXNzUGF0dGVybj4gJmFwKSB7Ci0gIGZyUG9pbnQgYmVnaW5Qb2ludCwgZW5kUG9pbnQ7Ci0gIGFwLT5nZXRQb2ludHMoYmVnaW5Qb2ludCwgZW5kUG9pbnQpOwotICBib3hfdCBib29zdGIgPSBib3hfdChwb2ludF90KGVuZFBvaW50LngoKSwgZW5kUG9pbnQueSgpKSwgcG9pbnRfdChlbmRQb2ludC54KCksIGVuZFBvaW50LnkoKSkpOwotICBhcHMuYXQoYXAtPmdldEVuZExheWVyTnVtKCkpLnJlbW92ZShtYWtlX3BhaXIoYm9vc3RiLCBhcCkpOwotfQotCi12b2lkIEZsZXhSZWdpb25RdWVyeTo6cmVtb3ZlKGZyU2hhcGUqIHNoYXBlKSB7Ci0gIGZyQm94IGZyYjsKLSAgc2hhcGUtPmdldEJCb3goZnJiKTsKLSAgYm94X3QgYm9vc3RiID0gYm94X3QocG9pbnRfdChmcmIubGVmdCgpLCBmcmIuYm90dG9tKCkpLCBwb2ludF90KGZyYi5yaWdodCgpLCBmcmIudG9wKCkpKTsKLSAgc2hhcGVzLmF0KHNoYXBlLT5nZXRMYXllck51bSgpKS5yZW1vdmUobWFrZV9wYWlyKGJvb3N0Yiwgc2hhcGUpKTsKLX0KLQotdm9pZCBGbGV4UmVnaW9uUXVlcnk6OnJlbW92ZShmclZpYSAqdmlhKSB7Ci0gIGZyQm94IGZyYjsKLSAgdmlhLT5nZXRMYXllcjFCQm94KGZyYik7Ci0gIGJveF90IGJvb3N0YiA9IGJveF90KHBvaW50X3QoZnJiLmxlZnQoKSwgZnJiLmJvdHRvbSgpKSwgcG9pbnRfdChmcmIucmlnaHQoKSwgZnJiLnRvcCgpKSk7Ci0gIHNoYXBlcy5hdCh2aWEtPmdldFZpYURlZigpLT5nZXRMYXllcjFOdW0oKSkucmVtb3ZlKG1ha2VfcGFpcihib29zdGIsIHZpYSkpOwotCi0gIHZpYS0+Z2V0TGF5ZXIyQkJveChmcmIpOwotICBib29zdGIgPSBib3hfdChwb2ludF90KGZyYi5sZWZ0KCksIGZyYi5ib3R0b20oKSksIHBvaW50X3QoZnJiLnJpZ2h0KCksIGZyYi50b3AoKSkpOwotICBzaGFwZXMuYXQodmlhLT5nZXRWaWFEZWYoKS0+Z2V0TGF5ZXIyTnVtKCkpLnJlbW92ZShtYWtlX3BhaXIoYm9vc3RiLCB2aWEpKTsKLQotICB2aWEtPmdldEN1dEJCb3goZnJiKTsKLSAgYm9vc3RiID0gYm94X3QocG9pbnRfdChmcmIubGVmdCgpLCBmcmIuYm90dG9tKCkpLCBwb2ludF90KGZyYi5yaWdodCgpLCBmcmIudG9wKCkpKTsKLSAgc2hhcGVzLmF0KHZpYS0+Z2V0VmlhRGVmKCktPmdldEN1dExheWVyTnVtKCkpLnJlbW92ZShtYWtlX3BhaXIoYm9vc3RiLCB2aWEpKTsKLX0KLQotdm9pZCBGbGV4UmVnaW9uUXVlcnk6OnF1ZXJ5KGNvbnN0IGZyQm94ICZib3gsIGZyTGF5ZXJOdW0gbGF5ZXJOdW0sIGZyVmVjdG9yPGZyTGlzdEl0ZXI8ZnJQYXRoU2VnPiA+ICZyZXN1bHQpIHsKLSAgdmVjdG9yPHJxX2l0ZXJfdmFsdWVfdDxmclBhdGhTZWc+ID4gdGVtcDsKLSAgYm94X3QgYm9vc3RiID0gYm94X3QocG9pbnRfdChib3gubGVmdCgpLCBib3guYm90dG9tKCkpLCBwb2ludF90KGJveC5yaWdodCgpLCBib3gudG9wKCkpKTsKLSAgcGF0aHNlZ3MuYXQobGF5ZXJOdW0pLnF1ZXJ5KGJnaTo6aW50ZXJzZWN0cyhib29zdGIpLCBiYWNrX2luc2VydGVyKHRlbXApKTsKLSAgdHJhbnNmb3JtKHRlbXAuYmVnaW4oKSwgdGVtcC5lbmQoKSwgYmFja19pbnNlcnRlcihyZXN1bHQpLCBbXShhdXRvICZrdikge3JldHVybiBrdi5zZWNvbmQ7fSk7Ci19Ci0KLXZvaWQgRmxleFJlZ2lvblF1ZXJ5OjpxdWVyeShjb25zdCBmckJveCAmYm94LCBmclZlY3Rvcjxmckxpc3RJdGVyPGZyUGF0aFNlZz4gPiAmcmVzdWx0KSB7Ci0gIHZlY3RvcjxycV9pdGVyX3ZhbHVlX3Q8ZnJQYXRoU2VnPiA+IHRlbXA7Ci0gIGJveF90IGJvb3N0YiA9IGJveF90KHBvaW50X3QoYm94LmxlZnQoKSwgYm94LmJvdHRvbSgpKSwgcG9pbnRfdChib3gucmlnaHQoKSwgYm94LnRvcCgpKSk7Ci0gIGZvciAoYXV0byAmbTogcGF0aHNlZ3MpIHsKLSAgICBtLnF1ZXJ5KGJnaTo6aW50ZXJzZWN0cyhib29zdGIpLCBiYWNrX2luc2VydGVyKHRlbXApKTsKLSAgfQotICB0cmFuc2Zvcm0odGVtcC5iZWdpbigpLCB0ZW1wLmVuZCgpLCBiYWNrX2luc2VydGVyKHJlc3VsdCksIFtdKGF1dG8gJmt2KSB7cmV0dXJuIGt2LnNlY29uZDt9KTsKLX0KLQotdm9pZCBGbGV4UmVnaW9uUXVlcnk6OnF1ZXJ5KGNvbnN0IGZyQm94ICZib3gsIGZyTGF5ZXJOdW0gbGF5ZXJOdW0sIGZyVmVjdG9yPGZyTGlzdEl0ZXI8ZnJWaWE+ID4gJnJlc3VsdCkgewotICB2ZWN0b3I8cnFfaXRlcl92YWx1ZV90PGZyVmlhPiA+IHRlbXA7Ci0gIGJveF90IGJvb3N0YiA9IGJveF90KHBvaW50X3QoYm94LmxlZnQoKSwgYm94LmJvdHRvbSgpKSwgcG9pbnRfdChib3gucmlnaHQoKSwgYm94LnRvcCgpKSk7Ci0gIHZpYXMuYXQobGF5ZXJOdW0pLnF1ZXJ5KGJnaTo6aW50ZXJzZWN0cyhib29zdGIpLCBiYWNrX2luc2VydGVyKHRlbXApKTsKLSAgdHJhbnNmb3JtKHRlbXAuYmVnaW4oKSwgdGVtcC5lbmQoKSwgYmFja19pbnNlcnRlcihyZXN1bHQpLCBbXShhdXRvICZrdikge3JldHVybiBrdi5zZWNvbmQ7fSk7Ci19Ci0KLXZvaWQgRmxleFJlZ2lvblF1ZXJ5OjpxdWVyeShjb25zdCBmckJveCAmYm94LCBmclZlY3Rvcjxmckxpc3RJdGVyPGZyVmlhPiA+ICZyZXN1bHQpIHsKLSAgdmVjdG9yPHJxX2l0ZXJfdmFsdWVfdDxmclZpYT4gPiB0ZW1wOwotICBib3hfdCBib29zdGIgPSBib3hfdChwb2ludF90KGJveC5sZWZ0KCksIGJveC5ib3R0b20oKSksIHBvaW50X3QoYm94LnJpZ2h0KCksIGJveC50b3AoKSkpOwotICBmb3IgKGF1dG8gJm06IHZpYXMpIHsKLSAgICBtLnF1ZXJ5KGJnaTo6aW50ZXJzZWN0cyhib29zdGIpLCBiYWNrX2luc2VydGVyKHRlbXApKTsKLSAgfQotICB0cmFuc2Zvcm0odGVtcC5iZWdpbigpLCB0ZW1wLmVuZCgpLCBiYWNrX2luc2VydGVyKHJlc3VsdCksIFtdKGF1dG8gJmt2KSB7cmV0dXJuIGt2LnNlY29uZDt9KTsKLX0KLQotdm9pZCBGbGV4UmVnaW9uUXVlcnk6OnF1ZXJ5KGNvbnN0IGZyQm94ICZib3gsIGZyTGF5ZXJOdW0gbGF5ZXJOdW0sIGZyVmVjdG9yPGZyTGlzdEl0ZXI8RmxleEFjY2Vzc1BhdHRlcm4+ID4gJnJlc3VsdCkgewotICB2ZWN0b3I8cnFfaXRlcl92YWx1ZV90PEZsZXhBY2Nlc3NQYXR0ZXJuPiA+IHRlbXA7Ci0gIGJveF90IGJvb3N0YiA9IGJveF90KHBvaW50X3QoYm94LmxlZnQoKSwgYm94LmJvdHRvbSgpKSwgcG9pbnRfdChib3gucmlnaHQoKSwgYm94LnRvcCgpKSk7Ci0gIGFwcy5hdChsYXllck51bSkucXVlcnkoYmdpOjppbnRlcnNlY3RzKGJvb3N0YiksIGJhY2tfaW5zZXJ0ZXIodGVtcCkpOwotICB0cmFuc2Zvcm0odGVtcC5iZWdpbigpLCB0ZW1wLmVuZCgpLCBiYWNrX2luc2VydGVyKHJlc3VsdCksIFtdKGF1dG8gJmt2KSB7cmV0dXJuIGt2LnNlY29uZDt9KTsKLX0KLQotdm9pZCBGbGV4UmVnaW9uUXVlcnk6OnF1ZXJ5KGNvbnN0IGZyQm94ICZib3gsIGZyVmVjdG9yPGZyTGlzdEl0ZXI8RmxleEFjY2Vzc1BhdHRlcm4+ID4gJnJlc3VsdCkgewotICB2ZWN0b3I8cnFfaXRlcl92YWx1ZV90PEZsZXhBY2Nlc3NQYXR0ZXJuPiA+IHRlbXA7Ci0gIGJveF90IGJvb3N0YiA9IGJveF90KHBvaW50X3QoYm94LmxlZnQoKSwgYm94LmJvdHRvbSgpKSwgcG9pbnRfdChib3gucmlnaHQoKSwgYm94LnRvcCgpKSk7Ci0gIGZvciAoYXV0byAmbTogYXBzKSB7Ci0gICAgbS5xdWVyeShiZ2k6OmludGVyc2VjdHMoYm9vc3RiKSwgYmFja19pbnNlcnRlcih0ZW1wKSk7Ci0gIH0KLSAgdHJhbnNmb3JtKHRlbXAuYmVnaW4oKSwgdGVtcC5lbmQoKSwgYmFja19pbnNlcnRlcihyZXN1bHQpLCBbXShhdXRvICZrdikge3JldHVybiBrdi5zZWNvbmQ7fSk7Ci19Ci0KLXZvaWQgRmxleFJlZ2lvblF1ZXJ5OjpxdWVyeShjb25zdCBmckJveCAmYm94LCBmckxheWVyTnVtIGxheWVyTnVtLCBmclZlY3RvcjxmclBpbkZpZyo+ICZyZXN1bHQpIHsKLSAgdmVjdG9yPHJxX3JwdHJfdmFsdWVfdDxmclBpbkZpZz4gPiB0ZW1wOwotICBib3hfdCBib29zdGIgPSBib3hfdChwb2ludF90KGJveC5sZWZ0KCksIGJveC5ib3R0b20oKSksIHBvaW50X3QoYm94LnJpZ2h0KCksIGJveC50b3AoKSkpOwotICBzaGFwZXMuYXQobGF5ZXJOdW0pLnF1ZXJ5KGJnaTo6aW50ZXJzZWN0cyhib29zdGIpLCBiYWNrX2luc2VydGVyKHRlbXApKTsKLSAgdHJhbnNmb3JtKHRlbXAuYmVnaW4oKSwgdGVtcC5lbmQoKSwgYmFja19pbnNlcnRlcihyZXN1bHQpLCBbXShhdXRvICZrdikge3JldHVybiBrdi5zZWNvbmQ7fSk7Ci19Ci0KLXZvaWQgRmxleFJlZ2lvblF1ZXJ5OjpxdWVyeShjb25zdCBmckJveCAmYm94LCBmclZlY3RvcjxmclBpbkZpZyo+ICZyZXN1bHQpIHsKLSAgdmVjdG9yPHJxX3JwdHJfdmFsdWVfdDxmclBpbkZpZz4gPiB0ZW1wOwotICBib3hfdCBib29zdGIgPSBib3hfdChwb2ludF90KGJveC5sZWZ0KCksIGJveC5ib3R0b20oKSksIHBvaW50X3QoYm94LnJpZ2h0KCksIGJveC50b3AoKSkpOwotICBmb3IgKGF1dG8gJm06IHNoYXBlcykgewotICAgIG0ucXVlcnkoYmdpOjppbnRlcnNlY3RzKGJvb3N0YiksIGJhY2tfaW5zZXJ0ZXIodGVtcCkpOwotICB9Ci0gIHRyYW5zZm9ybSh0ZW1wLmJlZ2luKCksIHRlbXAuZW5kKCksIGJhY2tfaW5zZXJ0ZXIocmVzdWx0KSwgW10oYXV0byAma3YpIHtyZXR1cm4ga3Yuc2Vjb25kO30pOwotfQotCi12b2lkIEZsZXhSZWdpb25RdWVyeTo6aW5pdChmckxheWVyTnVtIG51bUxheWVycykgewotICBwYXRoc2Vncy5jbGVhcigpOwotICB2aWFzLmNsZWFyKCk7Ci0gIGFwcy5jbGVhcigpOwotICBzaGFwZXMuY2xlYXIoKTsKLSAgcGF0aHNlZ3MucmVzaXplKG51bUxheWVycyk7Ci0gIHZpYXMucmVzaXplKG51bUxheWVycyk7Ci0gIGFwcy5yZXNpemUobnVtTGF5ZXJzKTsKLSAgc2hhcGVzLnJlc2l6ZShudW1MYXllcnMpOwotfQotCi12b2lkIEZsZXhSZWdpb25RdWVyeTo6cHJpbnQoKSB7Ci0gIGNvdXQgPDxlbmRsOwotICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpZ2V0VGVjaCgpLT5nZXRMYXllcnMoKS5zaXplKCk7IGkrKykgewotICAgIGZyU3RyaW5nIGxheWVyTmFtZTsKLSAgICBnZXRUZWNoKCktPmdldExheWVycygpLmF0KGkpLT5nZXROYW1lKGxheWVyTmFtZSk7Ci0gICAgY291dCA8PGxheWVyTmFtZSA8PCIgcGF0aHNlZyByZWdpb24gcXVlcnkgc2l6ZSA9ICIgPDxwYXRoc2Vncy5hdChpKS5zaXplKCkgPDxlbmRsIDw8Zmx1c2g7Ci0gIH0KLSAgY291dCA8PGVuZGw7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClnZXRUZWNoKCktPmdldExheWVycygpLnNpemUoKTsgaSsrKSB7Ci0gICAgZnJTdHJpbmcgbGF5ZXJOYW1lOwotICAgIGdldFRlY2goKS0+Z2V0TGF5ZXJzKCkuYXQoaSktPmdldE5hbWUobGF5ZXJOYW1lKTsKLSAgICBjb3V0IDw8bGF5ZXJOYW1lIDw8IiB2aWEgcmVnaW9uIHF1ZXJ5IHNpemUgPSAiIDw8dmlhcy5hdChpKS5zaXplKCkgPDxlbmRsIDw8Zmx1c2g7Ci0gIH0KLSAgY291dCA8PGVuZGw7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClnZXRUZWNoKCktPmdldExheWVycygpLnNpemUoKTsgaSsrKSB7Ci0gICAgZnJTdHJpbmcgbGF5ZXJOYW1lOwotICAgIGdldFRlY2goKS0+Z2V0TGF5ZXJzKCkuYXQoaSktPmdldE5hbWUobGF5ZXJOYW1lKTsKLSAgICBjb3V0IDw8bGF5ZXJOYW1lIDw8IiBhcCByZWdpb24gcXVlcnkgc2l6ZSA9ICIgPDxhcHMuYXQoaSkuc2l6ZSgpIDw8ZW5kbCA8PGZsdXNoOwotICB9Ci0gIGNvdXQgPDxlbmRsOwotICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpZ2V0VGVjaCgpLT5nZXRMYXllcnMoKS5zaXplKCk7IGkrKykgewotICAgIGZyU3RyaW5nIGxheWVyTmFtZTsKLSAgICBnZXRUZWNoKCktPmdldExheWVycygpLmF0KGkpLT5nZXROYW1lKGxheWVyTmFtZSk7Ci0gICAgY291dCA8PGxheWVyTmFtZSA8PCIgc2hhcGUgcmVnaW9uIHF1ZXJ5IHNpemUgPSAiIDw8c2hhcGVzLmF0KGkpLnNpemUoKSA8PGVuZGwgPDxmbHVzaDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZHIvRmxleFJlZ2lvblF1ZXJ5LmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kci9GbGV4UmVnaW9uUXVlcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNhOWY3NS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kci9GbGV4UmVnaW9uUXVlcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX0ZMRVhfUkVHSU9OUVVFUllfSF8KLSNkZWZpbmUgX0ZMRVhfUkVHSU9OUVVFUllfSF8KLQotLy8jaW5jbHVkZSA8bXV0ZXg+Ci0vLyNpbmNsdWRlIDxzaGFyZWRfbXV0ZXg+Ci0jaW5jbHVkZSAiZnJCYXNlVHlwZXMuaCIKLSNpbmNsdWRlICJmckRlc2lnbi5oIgotI2luY2x1ZGUgImRiL29iai9mclNoYXBlLmgiCi0jaW5jbHVkZSAiZGIvb2JqL2ZyVmlhLmgiCi0jaW5jbHVkZSAiRmxleEFjY2Vzc1BhdHRlcm4uaCIKLQotbmFtZXNwYWNlIGZyIHsKLSAgY2xhc3MgRmxleFJlZ2lvblF1ZXJ5IHsKLSAgcHVibGljOgotICAgIC8vRmxleFJlZ2lvblF1ZXJ5KCk6IHRlY2goc3RkOjptYWtlX3NoYXJlZDxmclRlY2hPYmplY3Q+KCkpLCBkZXNpZ24oc3RkOjptYWtlX3NoYXJlZDxmckRlc2lnbj4oKSkge307Ci0gICAgRmxleFJlZ2lvblF1ZXJ5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxmclRlY2hPYmplY3Q+ICZ0ZWNoSW4sIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxmckRlc2lnbj4gJmRlc2lnbkluKTogCi0gICAgICAgICAgICAgICAgdGVjaCh0ZWNoSW4pLCBkZXNpZ24oZGVzaWduSW4pIHt9OwotICAgIC8vIGdldHRlcnMKLSAgICBzdGQ6OnNoYXJlZF9wdHI8ZnJUZWNoT2JqZWN0PiBnZXRUZWNoKCkgY29uc3QgewotICAgICAgcmV0dXJuIHRlY2gubG9jaygpOwotICAgIH0KLSAgICBzdGQ6OnNoYXJlZF9wdHI8ZnJEZXNpZ24+IGdldERlc2lnbigpIGNvbnN0IHsKLSAgICAgIHJldHVybiBkZXNpZ24ubG9jaygpOwotICAgIH0KLSAgICAvLyBzZXR0ZXJzCi0gICAgdm9pZCBhZGQoZnJMaXN0SXRlcjxmclBhdGhTZWc+ICZwYXRoU2VnKTsKLSAgICB2b2lkIGFkZChmckxpc3RJdGVyPGZyVmlhPiAmdmlhKTsKLSAgICB2b2lkIGFkZChmckxpc3RJdGVyPEZsZXhBY2Nlc3NQYXR0ZXJuPiAmYXApOwotICAgIHZvaWQgYWRkKGZyU2hhcGUqIHNoYXBlKTsKLSAgICB2b2lkIGFkZChmclZpYSogc2hhcGUpOwotICAgIHZvaWQgcmVtb3ZlKGZyTGlzdEl0ZXI8ZnJQYXRoU2VnPiAmcGF0aFNlZyk7Ci0gICAgdm9pZCByZW1vdmUoZnJMaXN0SXRlcjxmclZpYT4gJnZpYSk7Ci0gICAgdm9pZCByZW1vdmUoZnJMaXN0SXRlcjxGbGV4QWNjZXNzUGF0dGVybj4gJmFwKTsKLSAgICB2b2lkIHJlbW92ZShmclNoYXBlKiBzaGFwZSk7Ci0gICAgdm9pZCByZW1vdmUoZnJWaWEqIHNoYXBlKTsKLSAgICB2b2lkIHF1ZXJ5KGNvbnN0IGZyQm94ICZib3gsIGZyTGF5ZXJOdW0gbGF5ZXJOdW0sIGZyVmVjdG9yPGZyTGlzdEl0ZXI8ZnJQYXRoU2VnPiA+ICZyZXN1bHQpOwotICAgIHZvaWQgcXVlcnkoY29uc3QgZnJCb3ggJmJveCwgZnJMYXllck51bSBsYXllck51bSwgZnJWZWN0b3I8ZnJMaXN0SXRlcjxmclZpYT4gPiAmcmVzdWx0KTsKLSAgICB2b2lkIHF1ZXJ5KGNvbnN0IGZyQm94ICZib3gsIGZyTGF5ZXJOdW0gbGF5ZXJOdW0sIGZyVmVjdG9yPGZyTGlzdEl0ZXI8RmxleEFjY2Vzc1BhdHRlcm4+ID4gJnJlc3VsdCk7Ci0gICAgdm9pZCBxdWVyeShjb25zdCBmckJveCAmYm94LCBmckxheWVyTnVtIGxheWVyTnVtLCBmclZlY3RvcjxmclBpbkZpZyo+ICZyZXN1bHQpOwotICAgIHZvaWQgcXVlcnkoY29uc3QgZnJCb3ggJmJveCwgZnJWZWN0b3I8ZnJMaXN0SXRlcjxmclBhdGhTZWc+ID4gJnJlc3VsdCk7Ci0gICAgdm9pZCBxdWVyeShjb25zdCBmckJveCAmYm94LCBmclZlY3Rvcjxmckxpc3RJdGVyPGZyVmlhPiA+ICZyZXN1bHQpOwotICAgIHZvaWQgcXVlcnkoY29uc3QgZnJCb3ggJmJveCwgZnJWZWN0b3I8ZnJMaXN0SXRlcjxGbGV4QWNjZXNzUGF0dGVybj4gPiAmcmVzdWx0KTsKLSAgICB2b2lkIHF1ZXJ5KGNvbnN0IGZyQm94ICZib3gsIGZyVmVjdG9yPGZyUGluRmlnKj4gJnJlc3VsdCk7Ci0gICAgLy8gb3RoZXJzCi0gICAgdm9pZCBpbml0KGZyTGF5ZXJOdW0gbnVtTGF5ZXJzKTsKLSAgICB2b2lkIHByaW50KCk7Ci0gICAgCi0gIHByb3RlY3RlZDoKLSAgICBzdGQ6OndlYWtfcHRyPGZyVGVjaE9iamVjdD4gICAgIHRlY2g7Ci0gICAgc3RkOjp3ZWFrX3B0cjxmckRlc2lnbj4gICAgICAgICBkZXNpZ247Ci0gICAgc3RkOjp2ZWN0b3I8IGJnaTo6cnRyZWU8IHJxX2l0ZXJfdmFsdWVfdDxmclBhdGhTZWc+LCAgICAgICAgICBiZ2k6OnF1YWRyYXRpYzwxNj4gPiA+IHBhdGhzZWdzOwotICAgIHN0ZDo6dmVjdG9yPCBiZ2k6OnJ0cmVlPCBycV9pdGVyX3ZhbHVlX3Q8ZnJWaWE+LCAgICAgICAgICAgICAgYmdpOjpxdWFkcmF0aWM8MTY+ID4gPiB2aWFzOwotICAgIHN0ZDo6dmVjdG9yPCBiZ2k6OnJ0cmVlPCBycV9pdGVyX3ZhbHVlX3Q8RmxleEFjY2Vzc1BhdHRlcm4+LCAgYmdpOjpxdWFkcmF0aWM8MTY+ID4gPiBhcHM7Ci0gICAgc3RkOjp2ZWN0b3I8IGJnaTo6cnRyZWU8IHJxX3JwdHJfdmFsdWVfdDxmclBpbkZpZz4sICAgICAgICAgICBiZ2k6OnF1YWRyYXRpYzwxNj4gPiA+IHNoYXBlczsKLSAgICAvL211dGFibGUgc3RkOjpzaGFyZWRfbXV0ZXggbTsKLSAgICAvL3N0ZDo6dmVjdG9yPCBtdXRhYmxlIHN0ZDo6c2hhcmVkX211dGV4ID4gbXV0ZXhfcGF0aHNlZ3M7Ci0gICAgLy9zdGQ6OnZlY3RvcjwgbXV0YWJsZSBzdGQ6OnNoYXJlZF9tdXRleCA+IG11dGV4X3ZpYXM7Ci0gICAgLy9zdGQ6OnZlY3RvcjwgbXV0YWJsZSBzdGQ6OnNoYXJlZF9tdXRleCA+IG11dGV4X3NoYXBlczsKLSAgfTsKLX0KLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RyL0ZsZXhXYXZlZnJvbnQuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RyL0ZsZXhXYXZlZnJvbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRiMTEwMS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kci9GbGV4V2F2ZWZyb250LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyogQXV0aG9yczogTHV0b25nIFdhbmcgYW5kIEJhbmdxaSBYdSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBfRkxFWF9XRl9ICi0jZGVmaW5lIF9GTEVYX1dGX0gKLQotI2luY2x1ZGUgPHF1ZXVlPgotI2luY2x1ZGUgPGJpdHNldD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSAiZnJCYXNlVHlwZXMuaCIKLSNpbmNsdWRlICJkci9GbGV4TWF6ZVR5cGVzLmgiCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgImdsb2JhbC5oIgotCi1uYW1lc3BhY2UgZnIgewotICBjbGFzcyBGbGV4V2F2ZWZyb250R3JpZCB7Ci0gIHB1YmxpYzoKLSAgICBGbGV4V2F2ZWZyb250R3JpZCgpOiB4SWR4KC0xKSwgeUlkeCgtMSksIHpJZHgoLTEpLCBwYXRoQ29zdCgwKSwgY29zdCgwKSwgbGF5ZXJQYXRoQXJlYSgwKSwgYmFja1RyYWNlQnVmZmVyKCkge30KLSAgICAvL0ZsZXhXYXZlZnJvbnRHcmlkKGludCB4SW4sIGludCB5SW4sIGludCB6SW4sIGZyQ29zdCBwYXRoQ29zdEluLCBmckNvc3QgY29zdEluLCBzdGQ6OmJpdHNldDxXQVZFRlJPTlRCSVRTSVpFPiBiYWNrVHJhY2VCdWZmZXJJbik6IAotICAgIC8vICAgICAgICAgICAgICAgICAgeElkeCh4SW4pLCB5SWR4KHlJbiksIHpJZHgoekluKSwgcGF0aENvc3QocGF0aENvc3RJbiksIGNvc3QoY29zdEluKSwgbGF5ZXJQYXRoTGVuZ3RoKDApLCBiYWNrVHJhY2VCdWZmZXIoYmFja1RyYWNlQnVmZmVySW4pIHt9Ci0gICAgRmxleFdhdmVmcm9udEdyaWQoaW50IHhJbiwgaW50IHlJbiwgaW50IHpJbiwgZnJDb29yZCBsYXllclBhdGhBcmVhSW4sIGZyQ29zdCBwYXRoQ29zdEluLCBmckNvc3QgY29zdEluKTogCi0gICAgICAgICAgICAgICAgICAgICAgeElkeCh4SW4pLCB5SWR4KHlJbiksIHpJZHgoekluKSwgcGF0aENvc3QocGF0aENvc3RJbiksIGNvc3QoY29zdEluKSwgbGF5ZXJQYXRoQXJlYShsYXllclBhdGhBcmVhSW4pLCBiYWNrVHJhY2VCdWZmZXIoKSB7fQotICAgIEZsZXhXYXZlZnJvbnRHcmlkKGludCB4SW4sIGludCB5SW4sIGludCB6SW4sIGZyQ29vcmQgbGF5ZXJQYXRoQXJlYUluLCBmckNvc3QgcGF0aENvc3RJbiwgZnJDb3N0IGNvc3RJbiwgc3RkOjpiaXRzZXQ8V0FWRUZST05UQklUU0laRT4gYmFja1RyYWNlQnVmZmVySW4pOiAKLSAgICAgICAgICAgICAgICAgICAgICB4SWR4KHhJbiksIHlJZHgoeUluKSwgeklkeCh6SW4pLCBwYXRoQ29zdChwYXRoQ29zdEluKSwgY29zdChjb3N0SW4pLCBsYXllclBhdGhBcmVhKGxheWVyUGF0aEFyZWFJbiksIGJhY2tUcmFjZUJ1ZmZlcihiYWNrVHJhY2VCdWZmZXJJbikge30KLSAgICAvLyBib29sIG9wZXJhdG9yPChjb25zdCBGbGV4V2F2ZWZyb250R3JpZCAmYikgY29uc3QgewotICAgIC8vICAgcmV0dXJuIHRoaXMtPmNvc3QgPiBiLmNvc3Q7Ci0gICAgLy8gfQotICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEZsZXhXYXZlZnJvbnRHcmlkICZiKSBjb25zdCB7Ci0gICAgICBpZiAodGhpcy0+Y29zdCAhPSBiLmNvc3QpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMtPmNvc3QgPiBiLmNvc3Q7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gdGhpcy0+cGF0aENvc3QgPCBiLnBhdGhDb3N0OwotICAgICAgfQotICAgIH0KLSAgICBmck1JZHggeCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiB4SWR4OwotICAgIH0KLSAgICBmck1JZHggeSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiB5SWR4OwotICAgIH0KLSAgICBmck1JZHggeigpIGNvbnN0IHsKLSAgICAgIHJldHVybiB6SWR4OwotICAgIH0KLSAgICBmckNvc3QgZ2V0UGF0aENvc3QoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gcGF0aENvc3Q7Ci0gICAgfQotICAgIGZyQ29zdCBnZXRDb3N0KCkgY29uc3QgewotICAgICAgcmV0dXJuIGNvc3Q7Ci0gICAgfQotICAgIHN0ZDo6Yml0c2V0PFdBVkVGUk9OVEJJVFNJWkU+IGdldEJhY2tUcmFjZUJ1ZmZlcigpIGNvbnN0IHsKLSAgICAgIHJldHVybiBiYWNrVHJhY2VCdWZmZXI7Ci0gICAgfQotICAgIGZyQ29vcmQgZ2V0TGF5ZXJQYXRoQXJlYSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBsYXllclBhdGhBcmVhOwotICAgIH0KLSAgICB2b2lkIHJlc2V0TGF5ZXJQYXRoQXJlYSgpIHsKLSAgICAgIGxheWVyUGF0aEFyZWEgPSAwOwotICAgIH0KLSAgICB2b2lkIGFkZExheWVyUGF0aEFyZWEoZnJDb29yZCBpbikgewotICAgICAgbGF5ZXJQYXRoQXJlYSArPSBpbjsKLSAgICB9Ci0gICAgZnJEaXJFbnVtIGdldExhc3REaXIoKSBjb25zdCB7Ci0gICAgICBhdXRvIGN1cnJEaXJWYWwgPSBiYWNrVHJhY2VCdWZmZXIudG9fdWxvbmcoKSAmIDBiMTExdTsKLSAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxmckRpckVudW0+KGN1cnJEaXJWYWwpOwotICAgIH0KLSAgICBib29sIGlzQnVmZmVyRnVsbCgpIGNvbnN0IHsKLSAgICAgIHN0ZDo6Yml0c2V0PFdBVkVGUk9OVEJJVFNJWkU+IG1hc2sgPSBXQVZFRlJPTlRCVUZGRVJISUdITUFTSzsKLSAgICAgIHJldHVybiAobWFzayAmIGJhY2tUcmFjZUJ1ZmZlcikuYW55KCk7Ci0gICAgfQotICAgIC8vc3RkOjpiaXRzZXQ8RElSQklUU0laRT4gc2hpZnRBZGRCdWZmZXIoY29uc3QgZnJEaXJFbnVtICZkaXIpIHsKLSAgICBmckRpckVudW0gc2hpZnRBZGRCdWZmZXIoY29uc3QgZnJEaXJFbnVtICZkaXIpIHsKLSAgICAgIC8vc3RkOjpiaXRzZXQ8V0FWRUZST05UQklUU0laRT4gbWFzayA9IFdBVkVGUk9OVEJVRkZFUkhJR0hNQVNLOwotICAgICAgLy9zdGQ6OmJpdHNldDxESVJCSVRTSVpFPiByZXRCUyA9IChpbnQpKChtYXNrICYgYmFja1RyYWNlQnVmZmVyKSA+PiAoV0FWRUZST05UQklUU0laRSAtIERJUkJJVFNJWkUpKS50b191bG9uZygpOwotICAgICAgYXV0byByZXRCUyA9IHN0YXRpY19jYXN0PGZyRGlyRW51bT4oKGJhY2tUcmFjZUJ1ZmZlciA+PiAoV0FWRUZST05UQklUU0laRSAtIERJUkJJVFNJWkUpKS50b191bG9uZygpKTsKLSAgICAgIGJhY2tUcmFjZUJ1ZmZlciA8PD0gRElSQklUU0laRTsKLSAgICAgIHN0ZDo6Yml0c2V0PFdBVkVGUk9OVEJJVFNJWkU+IG5ld0JTID0gKHVuc2lnbmVkKWRpcjsKLSAgICAgIGJhY2tUcmFjZUJ1ZmZlciB8PSBuZXdCUzsKLSAgICAgIHJldHVybiByZXRCUzsKLSAgICB9Ci0gIHByb3RlY3RlZDoKLSAgICBmck1JZHggeElkeCwgeUlkeCwgeklkeDsKLSAgICBmckNvc3QgcGF0aENvc3Q7IC8vIHBhdGggY29zdAotICAgIGZyQ29zdCBjb3N0OyAvLyBwYXRoICsgZXN0IGNvc3QKLSAgICBmckNvb3JkIGxheWVyUGF0aEFyZWE7Ci0gICAgc3RkOjpiaXRzZXQ8V0FWRUZST05UQklUU0laRT4gYmFja1RyYWNlQnVmZmVyOwotICB9OwotCi0KLSAgY2xhc3MgRmxleFdhdmVmcm9udCB7Ci0gIHB1YmxpYzoKLSAgICAvLyB2b2lkIGluaXQoc3RkOjpzaGFyZWRfcHRyPEZsZXhNYXplUGluPiByb290UGluKTsKLSAgICBib29sIGVtcHR5KCkgY29uc3QgewotICAgICAgcmV0dXJuIHdhdmVmcm9udFBRLmVtcHR5KCk7Ci0gICAgfQotICAgIGNvbnN0IEZsZXhXYXZlZnJvbnRHcmlkJiB0b3AoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gd2F2ZWZyb250UFEudG9wKCk7Ci0gICAgfQotICAgIHZvaWQgcG9wKCkgewotICAgICAgd2F2ZWZyb250UFEucG9wKCk7Ci0gICAgfQotICAgIHZvaWQgcHVzaChjb25zdCBGbGV4V2F2ZWZyb250R3JpZCAmaW4pIHsKLSAgICAgIHdhdmVmcm9udFBRLnB1c2goaW4pOwotICAgIH0KLSAgICB1bnNpZ25lZCBpbnQgc2l6ZSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiB3YXZlZnJvbnRQUS5zaXplKCk7Ci0gICAgfQotICBwcm90ZWN0ZWQ6Ci0gICAgc3RkOjpwcmlvcml0eV9xdWV1ZTxGbGV4V2F2ZWZyb250R3JpZD4gd2F2ZWZyb250UFE7Ci0gIH07Ci19Ci0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kci9NYWtlZmlsZSBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RyL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzU0NzA1Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RyL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyBzdWJkaXIgYW5kIG9iamVjdHMgaW4gY3VycmVudCBkaXIKLVNVQkRJUlMJPSAKLU9CSkVDVFMJPSBGbGV4RFIubyBGbGV4R3JpZEdyYXBoLm8gRmxleERSX2luaXQubyBGbGV4RFJfbWF6ZS5vIEZsZXhEUl9lbmQubyBGbGV4RFJfY29ubi5vIEZsZXhEUl9ycS5vIEZsZXhHcmlkR3JhcGhfbWF6ZS5vCi0KLQotYWxsOnN1YmRpcnMgJHtPQkpFQ1RTfQotCi0JCi1jbGVhbjpjbGVhbnN1YmRpcnMKLQlybSAtZiAke09CSkVDVFN9Ci0JCi1pbmNsdWRlICR7TUFLRUlOQ0xVREV9CmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kcmMvTWFrZWZpbGUgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kcmMvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZGM3ZGQuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZHJjL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyBzdWJkaXIgYW5kIG9iamVjdHMgaW4gY3VycmVudCBkaXIKLVNVQkRJUlMJPSAKLU9CSkVDVFMJPSBmckRSQ19pbml0Lm8gZnJEUkNfc2V0dXAubyAgZnJEUkNfbWFpbi5vICBmckRSQ191dGlsLm8KLQotYWxsOnN1YmRpcnMgJHtPQkpFQ1RTfQotCi0JCi1jbGVhbjpjbGVhbnN1YmRpcnMKLQlybSAtZiAke09CSkVDVFN9Ci0JCi1pbmNsdWRlICR7TUFLRUlOQ0xVREV9CmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kcmMvZnJEUkMuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RyYy9mckRSQy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWU2MGNkLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RyYy9mckRSQy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMyICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX0ZSX0RSQ19IXwotI2RlZmluZSBfRlJfRFJDX0hfCi0KLSNpbmNsdWRlICJmckJhc2VUeXBlcy5oIgotI2luY2x1ZGUgImZyRGVzaWduLmgiCi0jaW5jbHVkZSAiZGIvdGVjaC9mckNvbnN0cmFpbnQuaCIKLSNpbmNsdWRlICJkYi9vYmovZnJNYXJrZXIuaCIKLSNpbmNsdWRlIDxib29zdC9pY2wvaW50ZXJ2YWxfc2V0LmhwcD4KLSNpbmNsdWRlICJkYi9kck9iai9kck5ldC5oIgotCi1uYW1lc3BhY2UgZnIgewotICBlbnVtIGNsYXNzIGRyY0VkZ2VUeXBlRW51bSB7Ci0gICAgVU5LTk9XTiA9IDAsCi0gICAgRklYRUQgPSAxLAotICAgIFJPVVRFID0gMgotICB9OwotCi0gIGVudW0gY2xhc3MgZHJjU3BlY2lhbE5ldElkRW51bSB7Ci0gICAgT0JTID0gMCwKLSAgICBGTE9BVFBPV0VSID0gMSwKLSAgICBGTE9BVEdST1VORCA9IDIsCi0gICAgRkxPQVRTSUdOQUwgPSAzCi0gIH07Ci0KLSAgY2xhc3MgRFJDTmV0OwotICBjbGFzcyBEUkNFZGdlOwotICAvLyBjbGFzcyBkckNvbm5GaWc7Ci0gIC8vIGNsYXNzIGRyTmV0OwotICAvLyBjbGFzcyBkclZpYTsKLSAgLy8gY2xhc3MgZHJQYXRoU2VnOwotCi0gIGNsYXNzIERSQ1dvcmtlciB7Ci0gIHB1YmxpYzoKLSAgICAvLyBjb25zdHJ1Y3RvcgotICAgIERSQ1dvcmtlcigpIHt9Ci0gICAgRFJDV29ya2VyKGZyRGVzaWduKiBkZXNpZ25JbiwgZnJWZWN0b3I8ZnJCbG9ja09iamVjdCo+IG9ianNJbik6IGRlc2lnbihkZXNpZ25JbiksIG9ianMob2Jqc0luKSwgdGFyZ2V0KG51bGxwdHIpIHt9Ci0gICAgLy8gZ2V0dGVycwotICAgIGZyVmVjdG9yPGZyTWFya2VyPiYgZ2V0VmlvbGF0aW9ucygpIHsKLSAgICAgIHJldHVybiBtYXJrZXJzOwotICAgIH0KLSAgICAvLyBzZXR0ZXJzCi0KLSAgICAvLyBmdW5jdGlvbnMKLSAgICB2b2lkIGluaXQoKTsKLSAgICB2b2lkIGFkZERSTmV0cyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZHJOZXQ+ID4gJm5ldHMpOwotICAgIHZvaWQgc2V0VGFyZ2V0KGZyQmxvY2tPYmplY3QqIGluKSB7Ci0gICAgICB0YXJnZXQgPSBpbjsKLSAgICB9Ci0gICAgdm9pZCBzZXR1cCgpOwotICAgIHZvaWQgbWFpbigpOwotICAgIHZvaWQgcmVwb3J0KCk7Ci0KLSAgcHJvdGVjdGVkOgotICAgIGZyRGVzaWduKiBkZXNpZ247Ci0gICAgLy8gY29uc3RyYWludHMKLSAgICBzdGQ6Om1hcDxmckxheWVyTnVtLCBmclZlY3RvcjxmckNvbnN0cmFpbnQqPiA+IGxheWVyMkNvbnN0cmFpbnRzOwotICAgIC8vIG9iamVjdHMKLSAgICBmclZlY3RvcjxmckJsb2NrT2JqZWN0Kj4gb2JqczsgLy8gYWxsIG9iamVjdHMgdGhhdCB0aGUgRFJDV29ya2VyIHNlZXMgaW50aWlhbGx5LiBTb3J0IGxhdGVyCi0gICAgZnJCbG9ja09iamVjdCogdGFyZ2V0OwotICAgIGZyVmVjdG9yPGRyQ29ubkZpZyo+IGRyQ29ubkZpZ3M7Ci0gICAgZnJWZWN0b3I8ZnJCbG9ja09iamVjdCo+IHRlcm1zOyAvLyBpbmNsdWRpbmcgdGVybXMgYW5kIGluc3RUZXJtcwotICAgIGZyVmVjdG9yPGZyQ29ubkZpZyo+IGNvbm5GaWdzOyAvLyBpbmNsdWRpbmcgd2lyZSBhbmQgdmlhCi0gICAgZnJWZWN0b3I8ZnJCbG9ja09iamVjdCo+IGJsb2NrYWdlczsgCi0gICAgLy8gaW50ZXJuYWwgaW5mb3JtYXRpb24KLSAgICBpbnQgbmV0Q250ID0gNDsKLSAgICBpbnQgdGFyZ2V0TmV0SWQgPSAtMTsKLSAgICBzdGQ6Om1hcDxmck5ldCosIGludD4gbmV0MklkOyAvLyBPQlMncyBuZXRJZCA9PSAwLCBmbG9hdGluZyBwb3dlciBuZXQgSWQgPT0gMSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxvYXRpbmcgZ3JvdW5kIG5ldCBJZCA9PSAyLCBmbG9hdGluZyBzaWduYWwgbmV0ID09IDMKLSAgICBzdGQ6Om1hcDxmclRlcm0qLCBpbnQ+IHRlcm0ySWQ7IAotICAgIGZyVmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxEUkNOZXQ+ID4gZHJjTmV0czsKLSAgICBzdGQ6Om1hcDxmckxheWVyTnVtLCBiZ2k6OnJ0cmVlPHN0ZDo6cGFpcjxzZWdtZW50X3QsIERSQ0VkZ2UqPiwgYmdpOjpxdWFkcmF0aWM8MTY+ID4gPiBsYXllcjJFZGdlUlRyZWU7IC8vIHNlZ21lbnQgdG8gRWRnZQotICAgIHN0ZDo6bWFwPGZyTGF5ZXJOdW0sIGJnaTo6cnRyZWU8c3RkOjpwYWlyPGJveF90LCBpbnQ+LCBiZ2k6OnF1YWRyYXRpYzwxNj4gPiA+IGxheWVyMkZpeGVkUlRyZWUsIGxheWVyMk1lcmdlZFJUcmVlOyAvLyBtYXggcmVjdGFuZ2xlIHRvIG5ldElkCi0gICAgCi0gICAgLy8gb3V0cHV0Ci0gICAgZnJWZWN0b3I8ZnJNYXJrZXI+IG1hcmtlcnM7Ci0KLSAgICAvLyBmdW5jdGlvbnMKLSAgICB2b2lkIHBvcHVsYXRlTGF5ZXJDb25zdHJhaW50cygpOwotICAgIHZvaWQgaW5pdE5ldFJlY3RzKCk7Ci0gICAgdm9pZCBpbml0U3BlY2lhbE5ldHMoKTsKLSAgICB2b2lkIGluaXROZXRSZWN0c190ZXJtcygpOwotICAgIHZvaWQgaW5pdE5ldFJlY3RzX2Nvbm5GaWdzKCk7Ci0gICAgdm9pZCBpbml0TmV0UmVjdHNfYmxvY2thZ2VzKCk7Ci0gICAgdm9pZCBpbml0TmV0UmVjdHNfZHJDb25uRmlncygpOwotICAgIHZvaWQgc29ydE9iaigpOwotICAgIHZvaWQgc2V0dXBFZGdlUlRyZWUoKTsKLSAgICB2b2lkIHNldHVwRWRnZVJUcmVlX25ldChEUkNOZXQqIG5ldCk7Ci0gICAgdm9pZCBzZXR1cE1heFJlY3RSVHJlZSgpOwotICAgIHZvaWQgc2V0dXBNYXhSZWN0UlRyZWVfbmV0KERSQ05ldCogbmV0KTsKLSAgICB2b2lkIHVwZGF0ZU1heFJlY3RSdHJlZShpbnQgbmV0SWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPGZyTGF5ZXJOdW0sIFBvbHlnb25TZXQ+ICZsYXllcjJQb2x5U2V0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxmckxheWVyTnVtLCBiZ2k6OnJ0cmVlPHN0ZDo6cGFpcjxib3hfdCwgaW50PiwgYmdpOjpxdWFkcmF0aWM8MTY+ID4gPiAmbWF4UmVjdFJUcmVlKTsKLSAgICAKLQotICAgIC8vIHJ1bGUgY2hlY2sgcmVsYXRlZAotICAgIHZvaWQgY2hlY2tNZXRhbFNob3J0KCk7Ci0gICAgdm9pZCBjaGVja01ldGFsU3BhY2luZ1J1bGVzKCk7Ci0gICAgdm9pZCBjaGVja01ldGFsU3BhY2luZ1RhYmxlUHJsUnVsZShjb25zdCBiZ2k6OnJ0cmVlPHN0ZDo6cGFpcjxzZWdtZW50X3QsIERSQ0VkZ2UqPiwgYmdpOjpxdWFkcmF0aWM8MTY+ID4gJmVkZ2VSVHJlZSwgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJTcGFjaW5nVGFibGVQcmxDb25zdHJhaW50KiBjb25zdHJhaW50KTsKLSAgICB2b2lkIGNoZWNrTWV0YWxTcGFjaW5nRW5kT2ZMaW5lUnVsZShjb25zdCBiZ2k6OnJ0cmVlPHN0ZDo6cGFpcjxzZWdtZW50X3QsIERSQ0VkZ2UqPiwgYmdpOjpxdWFkcmF0aWM8MTY+ID4gJmVkZ2VSVHJlZSwgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyU3BhY2luZ0VuZE9mTGluZUNvbnN0cmFpbnQqIGNvbnN0cmFpbnQpOwotICAgIHZvaWQgY2hlY2tDdXRTcGFjaW5nUnVsZXMoKTsKLSAgICB2b2lkIGNoZWNrQ3V0U3BhY2luZ1J1bGUoY29uc3QgYmdpOjpydHJlZTxzdGQ6OnBhaXI8c2VnbWVudF90LCBEUkNFZGdlKj4sIGJnaTo6cXVhZHJhdGljPDE2PiA+ICZlZGdlUlRyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyQ3V0U3BhY2luZ0NvbnN0cmFpbnQqIGNvbnN0cmFpbnQpOwotICAgIHZvaWQgY2hlY2tNaW5XaWR0aFJ1bGUoKTsKLSAgICB2b2lkIGNoZWNrTWluV2lkdGhSdWxlX25ldChEUkNOZXQqIGRyY05ldCk7Ci0gICAgdm9pZCBjaGVja01ldGFsTWluQXJlYVJ1bGUoKTsKLSAgICB2b2lkIGNoZWNrTWV0YWxNaW5BcmVhUnVsZV9uZXQoRFJDTmV0KiBkcmNOZXQpOwotICAgIHZvaWQgY2hlY2tNZXRhbE1pblN0ZXBSdWxlKCk7Ci0gICAgdm9pZCBjaGVja01ldGFsTWluU3RlcFJ1bGVfbmV0KERSQ05ldCogZHJjTmV0KTsKLSAgICAKLQotICAgIC8vIHV0aWxpdHkKLSAgICB2b2lkIGFkZERSQ29ubkZpZyhkckNvbm5GaWcqIGluKTsKLSAgICB2b2lkIGdldFNwYWNpbmdUYWJsZVRlc3RCb3goY29uc3Qgc2VnbWVudF90ICZzZWcsIERSQ0VkZ2UqIHBybEVkZ2UsIGZyQ29vcmQgbWF4U3BhY2luZ1ZhbCwgYm94X3QgJnRlc3RCb3gpOwotICAgIGJvb2wgaXNPcHBvc2l0ZURpcihmckRpckVudW0gZGlyMSwgZnJEaXJFbnVtIGRpcjIpOwotICAgIHZvaWQgZ2V0RWRnZVNwYW5Cb3goY29uc3Qgc2VnbWVudF90ICZzZWcsIGNvbnN0IGZyRGlyRW51bSAmZGlyLCBjb25zdCBmckNvb3JkICZzcGFuLCBib3hfdCAmZWRnZVNwYW5Cb3gpOwotICAgIHZvaWQgZ2V0RWRnZVNwYW5SZWN0KGNvbnN0IHNlZ21lbnRfdCAmc2VnLCBjb25zdCBmckRpckVudW0gJmRpciwgY29uc3QgZnJDb29yZCAmc3BhbiwgUmVjdGFuZ2xlICZlZGdlU3BhblJlY3QpOwotICAgIHZvaWQgZ2V0RU9MVGVzdEJveChjb25zdCBzZWdtZW50X3QgJnNlZywgRFJDRWRnZSogZW9sRWRnZSwgY29uc3QgZnJDb29yZCAmZW9sU3BhY2UsIGNvbnN0IGZyQ29vcmQgJmVvbFdpdGhpbiwgYm94X3QgJnRlc3RCb3gpOwotICAgIHZvaWQgZ2V0UGFyYWxsZWxFZGdlQm94cyhjb25zdCBzZWdtZW50X3QgJnNlZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERSQ0VkZ2UgKmVvbEVkZ2UsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJDb29yZCAmcGFyU3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmckNvb3JkICZwYXJXaXRoaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmckNvb3JkICZlb2xXaXRoaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3hfdCAmcGFyYWxsZWxFZGdlQm94TGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveF90ICZwYXJhbGxlbEVkZ2VCb3hSaWdodCk7Ci0gICAgYm9vbCBpc0VvbEVkZ2UoRFJDRWRnZSogZWRnZSk7Ci0gICAgZnJEaXJFbnVtIGxlZnRFZGdlRGlyKGNvbnN0IGZyRGlyRW51bSAmZGlySW4pOwotICAgIGZyRGlyRW51bSByaWdodEVkZ2VEaXIoY29uc3QgZnJEaXJFbnVtICZkaXJJbik7Ci0gICAgdm9pZCBwcmludEVkZ2VSVHJlZSgpOwotICAgIGJvb2wgY292ZXJlZF9ieShjb25zdCBib29zdDo6aWNsOjpkaXNjcmV0ZV9pbnRlcnZhbDxmckNvb3JkLCBzdGQ6Omxlc3M+ICZpbnR2LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBib29zdDo6aWNsOjppbnRlcnZhbF9zZXQ8ZnJDb29yZD4gJmludHZTZXQpOwotICAgIGZyQ29vcmQgcmVjdERpYWdMZW5ndGgoY29uc3QgUmVjdGFuZ2xlICZyZWN0KTsKLQotICB9OwotICAKLSAgY2xhc3MgRFJDTmV0IHsKLSAgcHVibGljOgotICAgIC8vIGNvbnN0cnVjdG9yCi0gICAgRFJDTmV0KCkge30KLSAgICBEUkNOZXQoaW50IG5ldElkSW4pOiBpZChuZXRJZEluKSwgc3JjKG51bGxwdHIpIHt9Ci0gICAgLy8gZ2V0dGVycwotICAgIGludCBnZXRJZCgpIHsKLSAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0gICAgLy8gZnJOZXQqIGdldE5ldCgpIHsKLSAgICAvLyAgIHJldHVybiBkYk5ldDsKLSAgICAvLyB9Ci0gICAgZnJCbG9ja09iamVjdCogZ2V0U3JjKCkgewotICAgICAgcmV0dXJuIHNyYzsKLSAgICB9Ci0gICAgZnJWZWN0b3I8c3RkOjpwYWlyPGZyTGF5ZXJOdW0sIFJlY3RhbmdsZT4gPiYgZ2V0Rml4ZWRSZWN0cygpIHsKLSAgICAgIHJldHVybiBmaXhlZFJlY3RzOwotICAgIH0KLSAgICBmclZlY3RvcjxzdGQ6OnBhaXI8ZnJMYXllck51bSwgUmVjdGFuZ2xlPiA+JiBnZXRSb3V0ZVJlY3RzKCkgewotICAgICAgcmV0dXJuIHJvdXRlUmVjdHM7Ci0gICAgfQotICAgIHN0ZDo6bWFwPGZyTGF5ZXJOdW0sIFBvbHlnb25TZXQ+JiBnZXRMYXllcjJGaXhlZFBvbHlTZXQoKSB7Ci0gICAgICByZXR1cm4gbGF5ZXIyRml4ZWRQb2x5U2V0OwotICAgIH0KLSAgICBzdGQ6Om1hcDxmckxheWVyTnVtLCBQb2x5Z29uU2V0PiYgZ2V0TGF5ZXIyUm91dGVQb2x5U2V0KCkgewotICAgICAgcmV0dXJuIGxheWVyMlJvdXRlUG9seVNldDsKLSAgICB9Ci0gICAgc3RkOjptYXA8ZnJMYXllck51bSwgc3RkOjptYXA8U2VnbWVudCwgRFJDRWRnZSo+ID4mIGdldExheWVyU2VnRWRnZU1hcCgpIHsKLSAgICAgIHJldHVybiBsYXllcjJTZWcyRWRnZTsKLSAgICB9Ci0KLSAgICAvLyBzZXR0ZXJzCi0gICAgdm9pZCBzZXRJZChpbnQgaWRJbikgewotICAgICAgaWQgPSBpZEluOwotICAgIH0KLSAgICAvLyB2b2lkIHNldE5ldChmck5ldCogbmV0SW4pIHsKLSAgICAvLyAgIGRiTmV0ID0gbmV0SW47Ci0gICAgLy8gfQotICAgIHZvaWQgc2V0U3JjKGZyQmxvY2tPYmplY3QgKnNyY0luKSB7Ci0gICAgICBzcmMgPSBzcmNJbjsKLSAgICB9Ci0gICAgdm9pZCBhZGRGaXhlZFJlY3QoY29uc3Qgc3RkOjpwYWlyPGZyTGF5ZXJOdW0sIFJlY3RhbmdsZT4gJmxheWVyUmVjdEluKSB7Ci0gICAgICBmaXhlZFJlY3RzLnB1c2hfYmFjayhsYXllclJlY3RJbik7Ci0gICAgfQotICAgIHZvaWQgYWRkUm91dGVSZWN0KGNvbnN0IHN0ZDo6cGFpcjxmckxheWVyTnVtLCBSZWN0YW5nbGU+ICZsYXllclJlY3RJbikgewotICAgICAgcm91dGVSZWN0cy5wdXNoX2JhY2sobGF5ZXJSZWN0SW4pOwotICAgIH0KLSAgICB2b2lkIGFkZEZpeGVkTGF5ZXJQb2x5KGNvbnN0IGZyTGF5ZXJOdW0gJmxheWVyTnVtSW4sIGNvbnN0IFBvbHlnb24gJnBvbHlJbikgewotICAgICAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0Ojpwb2x5Z29uOjpvcGVyYXRvcnM7Ci0gICAgICBsYXllcjJGaXhlZFBvbHlTZXRbbGF5ZXJOdW1Jbl0gKz0gcG9seUluOwotICAgIH0KLSAgICB2b2lkIGFkZEZpeGVkTGF5ZXJSZWN0KGNvbnN0IGZyTGF5ZXJOdW0gJmxheWVyTnVtSW4sIGNvbnN0IFJlY3RhbmdsZSAmcmVjdEluKSB7Ci0gICAgICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q6OnBvbHlnb246Om9wZXJhdG9yczsKLSAgICAgIGxheWVyMkZpeGVkUG9seVNldFtsYXllck51bUluXSArPSByZWN0SW47Ci0gICAgfQotICAgIHZvaWQgYWRkUm91dGVMYXllclBvbHkoY29uc3QgZnJMYXllck51bSAmbGF5ZXJOdW1JbiwgY29uc3QgUG9seWdvbiAmcG9seUluKSB7Ci0gICAgICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q6OnBvbHlnb246Om9wZXJhdG9yczsKLSAgICAgIGxheWVyMlJvdXRlUG9seVNldFtsYXllck51bUluXSArPSBwb2x5SW47Ci0gICAgfQotICAgIHZvaWQgYWRkUm91dGVMYXllclJlY3QoY29uc3QgZnJMYXllck51bSAmbGF5ZXJOdW1JbiwgY29uc3QgUmVjdGFuZ2xlICZyZWN0SW4pIHsKLSAgICAgIHVzaW5nIG5hbWVzcGFjZSBib29zdDo6cG9seWdvbjo6b3BlcmF0b3JzOwotICAgICAgbGF5ZXIyUm91dGVQb2x5U2V0W2xheWVyTnVtSW5dICs9IHJlY3RJbjsKLSAgICB9Ci0gICAgRFJDRWRnZSogYWRkRFJDRWRnZSgpIHsKLSAgICAgIGRyY0VkZ2VzLnB1c2hfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPERSQ0VkZ2U+KCkpOwotICAgICAgcmV0dXJuIChkcmNFZGdlcy5iYWNrKCkuZ2V0KCkpOwotICAgIH0KLSAgICB2b2lkIGFkZFRvTGF5ZXJTZWdFZGdlTWFwKGNvbnN0IGZyTGF5ZXJOdW0gJmxheWVyTnVtSW4sIGNvbnN0IFNlZ21lbnQgJnNlZ0luLCBEUkNFZGdlKiBlZGdlSW4pIHsKLSAgICAgIGxheWVyMlNlZzJFZGdlW2xheWVyTnVtSW5dW3NlZ0luXSA9IGVkZ2VJbjsKLSAgICB9Ci0KLSAgcHJvdGVjdGVkOgotICAgIGludCBpZDsKLSAgICAvLyBmck5ldCogZGJOZXQ7Ci0gICAgLy8gZnJJbnN0VGVybSAqZGJJbnN0VGVybTsKLSAgICAvLyBmclRlcm0gKmRiVGVybTsKLSAgICBmckJsb2NrT2JqZWN0ICpzcmM7Ci0gICAgZnJWZWN0b3I8c3RkOjpwYWlyPGZyTGF5ZXJOdW0sIFJlY3RhbmdsZT4gPiBmaXhlZFJlY3RzLCByb3V0ZVJlY3RzOwotICAgIHN0ZDo6bWFwPGZyTGF5ZXJOdW0sIFBvbHlnb25TZXQ+IGxheWVyMkZpeGVkUG9seVNldCwgbGF5ZXIyUm91dGVQb2x5U2V0OwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxEUkNFZGdlPiA+IGRyY0VkZ2VzOwotICAgIHN0ZDo6bWFwPGZyTGF5ZXJOdW0sIHN0ZDo6bWFwPFNlZ21lbnQsIERSQ0VkZ2UqPiA+IGxheWVyMlNlZzJFZGdlOwotICB9OwotCi0gIGNsYXNzIERSQ0VkZ2UgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3IKLSAgICBEUkNFZGdlKCkgOiBuZXRJZCgtMSksIHR5cGUoZHJjRWRnZVR5cGVFbnVtOjpVTktOT1dOKSwgZGlyKGZyRGlyRW51bTo6VU5LTk9XTiksIHByZXYobnVsbHB0ciksIG5leHQobnVsbHB0ciksIHNwYW4oLTEpLCB3aWR0aCgtMSkge30KLSAgICAvLyBnZXR0ZXJzCi0gICAgaW50IGdldE5ldElkKCkgewotICAgICAgcmV0dXJuIG5ldElkOwotICAgIH0KLSAgICBmckxheWVyTnVtIGdldExheWVyTnVtKCkgewotICAgICAgcmV0dXJuIGxheWVyTnVtOwotICAgIH0KLSAgICBTZWdtZW50IGdldFNlZ21lbnQoKSB7Ci0gICAgICByZXR1cm4gc2VnOwotICAgIH0KLSAgICBkcmNFZGdlVHlwZUVudW0gZ2V0VHlwZSgpIHsKLSAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLSAgICBmckRpckVudW0gZ2V0RGlyKCkgewotICAgICAgcmV0dXJuIGRpcjsKLSAgICB9Ci0gICAgRFJDRWRnZSogZ2V0UHJldkVkZ2UoKSB7Ci0gICAgICByZXR1cm4gcHJldjsKLSAgICB9Ci0gICAgRFJDRWRnZSogZ2V0TmV4dEVkZ2UoKSB7Ci0gICAgICByZXR1cm4gbmV4dDsKLSAgICB9Ci0gICAgZnJDb29yZCBnZXRTcGFuKCkgewotICAgICAgcmV0dXJuIHNwYW47Ci0gICAgfQotICAgIGZyQ29vcmQgZ2V0V2lkdGgoKSB7Ci0gICAgICByZXR1cm4gd2lkdGg7Ci0gICAgfQotICAgIGJvb3N0Ojpwb2x5Z29uOjpkaXJlY3Rpb25fMWQgZ2V0V2luZGluZygpIHsKLSAgICAgIHJldHVybiB3aW5kaW5nOwotICAgIH0KLQotICAgIC8vIHNldHRlcnMKLSAgICB2b2lkIHNldElkKGNvbnN0IGludCAmbmV0SWRJbikgewotICAgICAgbmV0SWQgPSBuZXRJZEluOwotICAgIH0KLSAgICB2b2lkIHNldExheWVyTnVtKGNvbnN0IGZyTGF5ZXJOdW0gJmxheWVyTnVtSW4pIHsKLSAgICAgIGxheWVyTnVtID0gbGF5ZXJOdW1JbjsKLSAgICB9Ci0gICAgdm9pZCBzZXRTZWdtZW50KGNvbnN0IFNlZ21lbnQgJnNlZ0luKSB7Ci0gICAgICBzZWcgPSBzZWdJbjsKLSAgICB9Ci0gICAgdm9pZCBzZXRUeXBlKGNvbnN0IGRyY0VkZ2VUeXBlRW51bSAmdHlwZUluKSB7Ci0gICAgICB0eXBlID0gdHlwZUluOwotICAgIH0KLSAgICB2b2lkIHNldERpcihjb25zdCBmckRpckVudW0gJmRpckluKSB7Ci0gICAgICBkaXIgPSBkaXJJbjsKLSAgICB9Ci0gICAgdm9pZCBzZXRQcmV2KERSQ0VkZ2UqIHByZXZJbikgewotICAgICAgcHJldiA9IHByZXZJbjsKLSAgICB9Ci0gICAgdm9pZCBzZXROZXh0KERSQ0VkZ2UqIG5leHRJbikgewotICAgICAgbmV4dCA9IG5leHRJbjsKLSAgICB9Ci0gICAgdm9pZCBzZXRTcGFuKGNvbnN0IGZyQ29vcmQgJnNwYW5JbikgewotICAgICAgc3BhbiA9IHNwYW5JbjsKLSAgICB9Ci0gICAgdm9pZCBzZXRXaWR0aChjb25zdCBmckNvb3JkICZ3aWR0aEluKSB7Ci0gICAgICB3aWR0aCA9IHdpZHRoSW47Ci0gICAgfQotICAgIHZvaWQgc2V0V2luZGluZyhjb25zdCBib29zdDo6cG9seWdvbjo6ZGlyZWN0aW9uXzFkICZpbikgewotICAgICAgd2luZGluZyA9IGluOwotICAgIH0KLSAgICAKLSAgICAKLSAgcHJvdGVjdGVkOgotICAgIGludCBuZXRJZDsKLSAgICBTZWdtZW50IHNlZzsKLSAgICBmckxheWVyTnVtIGxheWVyTnVtOwotICAgIGRyY0VkZ2VUeXBlRW51bSB0eXBlOwotICAgIGZyRGlyRW51bSBkaXI7IC8vIHRoZSBkaXJlY3Rpb24gcGVycGVuZGljdWxhciB0byB0aGUgZWRnZSBhbmQgdG93YXJkcyBvdXRzaWRlIG9mIHBvbHlnb24KLSAgICBEUkNFZGdlICpwcmV2LCAqbmV4dDsgLy8gY2xvY2t3aXNlIGxpbmtlZCBsaXN0IG9mIGVkZ2VzIGZvciBtaW5zdGVwIGNoZWNraW5nLCBlb2wgY2hlY2tpbmcKLSAgICBmckNvb3JkIHNwYW4sIHdpZHRoOwotICAgIGJvb3N0Ojpwb2x5Z29uOjpkaXJlY3Rpb25fMWQgd2luZGluZzsKLSAgfTsKLQotfQotCi0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kcmMvZnJEUkNfaW5pdC5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kcmMvZnJEUkNfaW5pdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYWJlZTMuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZHJjL2ZyRFJDX2luaXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjkyICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJkcmMvZnJEUkMuaCIKLSNpbmNsdWRlICJpby9mclNoYXBlVXRpbC5oIgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxpdGVyYXRvcj4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxjaHJvbm8+Ci0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ubzsKLQotdm9pZCBmcjo6RFJDV29ya2VyOjppbml0KCkgewotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICAvLyBwb3B1bGF0ZUxheWVyQ29uc3RyYWludHMoKTsKLSAgaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjp0aW1lX3BvaW50IHQwID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKLSAgc29ydE9iaigpOwotICBoaWdoX3Jlc29sdXRpb25fY2xvY2s6OnRpbWVfcG9pbnQgdDEgPSBoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwotICBpbml0TmV0UmVjdHMoKTsKLSAgaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjp0aW1lX3BvaW50IHQyID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKLSAgLy8gZ2VuZXJhbCBzZXR1cCBpcyBkb25lCi0gIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICBkdXJhdGlvbjxkb3VibGU+IHRpbWVfc3BhbjAgPSBkdXJhdGlvbl9jYXN0PGR1cmF0aW9uPGRvdWJsZT4+KHQxIC0gdDApOwotICAgIGR1cmF0aW9uPGRvdWJsZT4gdGltZV9zcGFuMSA9IGR1cmF0aW9uX2Nhc3Q8ZHVyYXRpb248ZG91YmxlPj4odDIgLSB0MSk7Ci0gICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgc3MgICA8PCJ0aW1lIChTT1JUT0JKL0lOSVRORVRSRUNUUykgIiA8PHRpbWVfc3BhbjAuY291bnQoKSA8PCIgIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PHRpbWVfc3BhbjEuY291bnQoKSA8PCIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKLSAgICBzdGQ6OmNvdXQgPDxzcy5zdHIoKSA8PCBzdGQ6OmZsdXNoOwotICB9Ci19Ci0KLS8vIHZvaWQgZnI6OkRSQ1dvcmtlcjo6cG9wdWxhdGVMYXllckNvbnN0cmFpbnRzKCkgewotLy8gICBmb3IgKGF1dG8gJmxheWVyOiBkZXNpZ24tPmdldFRlY2goKS0+Z2V0TGF5ZXJzKCkpIHsKLS8vICAgICBmckxheWVyTnVtIGN1cnJMYXllck51bSA9IGxheWVyLT5nZXRMYXllck51bSgpOwotLy8gICAgIGZvciAoYXV0byAmY29uc3RyYWludDogbGF5ZXItPmdldENvbnN0cmFpbnRzKCkpIHsKLS8vICAgICAgIGxheWVyMkNvbnN0cmFpbnRzW2N1cnJMYXllck51bV0ucHVzaF9iYWNrKGNvbnN0cmFpbnQuZ2V0KCkpOwotLy8gICAgIH0KLS8vICAgfQotLy8gfQotCi12b2lkIGZyOjpEUkNXb3JrZXI6OmluaXROZXRSZWN0cygpIHsKLSAgaW5pdFNwZWNpYWxOZXRzKCk7Ci0gIGluaXROZXRSZWN0c190ZXJtcygpOwotICBpbml0TmV0UmVjdHNfY29ubkZpZ3MoKTsKLSAgaW5pdE5ldFJlY3RzX2RyQ29ubkZpZ3MoKTsKLSAgaW5pdE5ldFJlY3RzX2Jsb2NrYWdlcygpOwotfQotCi12b2lkIGZyOjpEUkNXb3JrZXI6OmluaXROZXRSZWN0c19kckNvbm5GaWdzKCkgewotICAvLyBkb3VibGUgZGJ1ID0gZGVzaWduLT5nZXRUZWNoKCktPmdldERCVVBlclVVKCk7Ci0gIGZvciAoYXV0byBvYmo6IGRyQ29ubkZpZ3MpIHsKLSAgICBEUkNOZXQqIGRyY05ldCA9IG51bGxwdHI7Ci0gICAgc3dpdGNoIChvYmotPnR5cGVJZCgpKSB7Ci0gICAgICBjYXNlIGRyY1BhdGhTZWc6Ci0gICAgICB7Ci0gICAgICAgIGludCBuZXRJZCA9IC0xOwotICAgICAgICBkclBhdGhTZWcqIHBhdGhTZWcgPSBzdGF0aWNfY2FzdDxkclBhdGhTZWcqPihvYmopOwotICAgICAgICAvLyBnZXQgbmV0SWQKLSAgICAgICAgaWYgKHBhdGhTZWctPmhhc05ldCgpKSB7Ci0gICAgICAgICAgaWYgKG5ldDJJZC5maW5kKHBhdGhTZWctPmdldE5ldCgpLT5nZXRGck5ldCgpKSA9PSBuZXQySWQuZW5kKCkpIHsKLSAgICAgICAgICAgIG5ldElkID0gZHJjTmV0cy5zaXplKCk7Ci0gICAgICAgICAgICBkcmNOZXRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPERSQ05ldD4obmV0SWQpKTsKLSAgICAgICAgICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0ID09IHN0YXRpY19jYXN0PGZyQmxvY2tPYmplY3QqPihwYXRoU2VnLT5nZXROZXQoKS0+Z2V0RnJOZXQoKSkpIHsKLSAgICAgICAgICAgICAgdGFyZ2V0TmV0SWQgPSBuZXRJZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIChkcmNOZXRzLmJhY2soKSktPnNldFNyYyhwYXRoU2VnLT5nZXROZXQoKS0+Z2V0RnJOZXQoKSk7Ci0gICAgICAgICAgICBuZXQySWRbcGF0aFNlZy0+Z2V0TmV0KCktPmdldEZyTmV0KCldID0gbmV0SWQ7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5ldElkID0gbmV0MklkW3BhdGhTZWctPmdldE5ldCgpLT5nZXRGck5ldCgpXTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbmV0SWQgPSBzdGF0aWNfY2FzdDxpbnQ+KGRyY1NwZWNpYWxOZXRJZEVudW06OkZMT0FUU0lHTkFMKTsKLSAgICAgICAgfQotICAgICAgICAvLyBwdXNoIGxheWVyIHNoYXBlCi0gICAgICAgIGlmIChuZXRJZCA9PSAtMSkgewotICAgICAgICAgIHN0ZDo6Y291dCA8PCAiRXJyb3I6IHVuZXhwZWN0ZWQgbmV0SWQgaW4gaW5pdE5ldFJlY3RzX2Nvbm5GaWdzXG4iOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGRyY05ldCA9IGRyY05ldHNbbmV0SWRdLmdldCgpOwotICAgICAgICAKLSAgICAgICAgZnJMYXllck51bSBsYXllck51bSA9IHBhdGhTZWctPmdldExheWVyTnVtKCk7Ci0gICAgICAgIGZyQm94IGJib3g7Ci0gICAgICAgIHBhdGhTZWctPmdldEJCb3goYmJveCk7Ci0gICAgICAgIFJlY3RhbmdsZSBwYXRoU2VnUmVjdChiYm94LmxlZnQoKSwgYmJveC5ib3R0b20oKSwgYmJveC5yaWdodCgpLCBiYm94LnRvcCgpKTsKLSAgICAgICAgLy8gc3RkOjpjb3V0IDw8ICIgIGFkZCBwYXRoc2VnIGJib3ggKCIgPDwgYmJveC5sZWZ0KCkgLyBkYnU8PCAiLCAiIDw8IGJib3guYm90dG9tKCkgLyBkYnUKLSAgICAgICAgLy8gICAgICAgICAgIDw8ICIpIC0tICgiIDw8IGJib3gucmlnaHQoKSAvIGRidSA8PCAiLCAiIDw8IGJib3gudG9wKCkgLyBkYnUgPDwgIikgZnJvbSBuZXQgIiA8PCBuZXRJZCA8PCAiXG4iOwotICAgICAgICBkcmNOZXQtPmFkZFJvdXRlTGF5ZXJSZWN0KGxheWVyTnVtLCBwYXRoU2VnUmVjdCk7Ci0gICAgICAgIC8vIHN0ZDo6Y291dCA8PCAiICBhZGRlZCBwYXRoU2VnXG4iIDw8IHN0ZDo6Zmx1c2g7Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIGRyY1ZpYToKLSAgICAgIHsKLSAgICAgICAgaW50IG5ldElkID0gLTE7Ci0gICAgICAgIGRyVmlhKiB2aWEgPSBzdGF0aWNfY2FzdDxkclZpYSo+KG9iaik7Ci0gICAgICAgIC8vIGdldCBuZXRJZAotICAgICAgICBpZiAodmlhLT5oYXNOZXQoKSkgewotICAgICAgICAgIGlmIChuZXQySWQuZmluZCh2aWEtPmdldE5ldCgpLT5nZXRGck5ldCgpKSA9PSBuZXQySWQuZW5kKCkpIHsKLSAgICAgICAgICAgIG5ldElkID0gZHJjTmV0cy5zaXplKCk7Ci0gICAgICAgICAgICBkcmNOZXRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPERSQ05ldD4obmV0SWQpKTsKLSAgICAgICAgICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0ID09IHN0YXRpY19jYXN0PGZyQmxvY2tPYmplY3QqPih2aWEtPmdldE5ldCgpLT5nZXRGck5ldCgpKSkgewotICAgICAgICAgICAgICB0YXJnZXROZXRJZCA9IG5ldElkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gKGRyY05ldHMuYmFjaygpKS0+c2V0TmV0KHZpYS0+Z2V0TmV0KCkpOwotICAgICAgICAgICAgKGRyY05ldHMuYmFjaygpKS0+c2V0U3JjKHZpYS0+Z2V0TmV0KCktPmdldEZyTmV0KCkpOwotICAgICAgICAgICAgbmV0MklkW3ZpYS0+Z2V0TmV0KCktPmdldEZyTmV0KCldID0gbmV0SWQ7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5ldElkID0gbmV0MklkW3ZpYS0+Z2V0TmV0KCktPmdldEZyTmV0KCldOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBuZXRJZCA9IHN0YXRpY19jYXN0PGludD4oZHJjU3BlY2lhbE5ldElkRW51bTo6RkxPQVRTSUdOQUwpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHB1c2ggbGF5ZXIgc2hhcGUuIFRPRE86IGhhbmRsZSBjdXQgbGF5ZXIgc2hhcGUKLSAgICAgICAgaWYgKG5ldElkID09IC0xKSB7Ci0gICAgICAgICAgc3RkOjpjb3V0IDw8ICJFcnJvcjogdW5leHBlY3RlZCBuZXRJZCBpbiBpbml0TmV0UmVjdHNfY29ubkZpZ3NcbiI7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZHJjTmV0ID0gZHJjTmV0c1tuZXRJZF0uZ2V0KCk7Ci0KLSAgICAgICAgLy8gcHVzaCBsYXllcjEgcmVjdAotICAgICAgICAvLyBkb3VibGUgZGJ1ID0gZGVzaWduLT5nZXRUZWNoKCktPmdldERCVVBlclVVKCk7Ci0gICAgICAgIGZyTGF5ZXJOdW0gbGF5ZXJOdW0xID0gdmlhLT5nZXRWaWFEZWYoKS0+Z2V0TGF5ZXIxTnVtKCk7Ci0gICAgICAgIGZyVHJhbnNmb3JtIHhmb3JtOwotICAgICAgICB2aWEtPmdldFRyYW5zZm9ybSh4Zm9ybSk7Ci0gICAgICAgIGZvciAoYXV0byAmZmlnOiB2aWEtPmdldFZpYURlZigpLT5nZXRMYXllcjFGaWdzKCkpIHsKLSAgICAgICAgICAKLSAgICAgICAgICBmckJveCBiYm94OwotICAgICAgICAgIGZpZy0+Z2V0QkJveChiYm94KTsKLSAgICAgICAgICBiYm94LnRyYW5zZm9ybSh4Zm9ybSk7Ci0gICAgICAgICAgUmVjdGFuZ2xlIGJib3hSZWN0KGJib3gubGVmdCgpLCBiYm94LmJvdHRvbSgpLCBiYm94LnJpZ2h0KCksIGJib3gudG9wKCkpOwotICAgICAgICAgIC8vIHN0ZDo6Y291dCA8PCAiICBhZGQgdG8gbmV0IiA8PCBuZXRJZCA8PCAiIGxheWVyICIgPDwgbGF5ZXJOdW0xIDw8ICIgKCIgPDwgYmJveC5sZWZ0KCkgLyBkYnUgPDwgIiwgIiA8PCBiYm94LmJvdHRvbSgpIC8gZGJ1Ci0gICAgICAgICAgLy8gICAgICAgICAgIDw8ICIpIC0gKCIgPDwgYmJveC5yaWdodCgpIC8gZGJ1IDw8ICIsICIgPDwgYmJveC50b3AoKSAvIGRidSA8PCAiKVxuIjsKLSAgICAgICAgICBkcmNOZXQtPmFkZFJvdXRlTGF5ZXJSZWN0KGxheWVyTnVtMSwgYmJveFJlY3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcHVzaCBjdXQgbGF5ZXIgcmVjdAotICAgICAgICBmckxheWVyTnVtIGN1dExheWVyTnVtID0gdmlhLT5nZXRWaWFEZWYoKS0+Z2V0Q3V0TGF5ZXJOdW0oKTsKLSAgICAgICAgZm9yIChhdXRvICZmaWc6IHZpYS0+Z2V0VmlhRGVmKCktPmdldEN1dEZpZ3MoKSkgewotICAgICAgICAgIGZyQm94IGJib3g7Ci0gICAgICAgICAgZmlnLT5nZXRCQm94KGJib3gpOwotICAgICAgICAgIGJib3gudHJhbnNmb3JtKHhmb3JtKTsKLSAgICAgICAgICBSZWN0YW5nbGUgYmJveFJlY3QoYmJveC5sZWZ0KCksIGJib3guYm90dG9tKCksIGJib3gucmlnaHQoKSwgYmJveC50b3AoKSk7Ci0gICAgICAgICAgZHJjTmV0LT5hZGRSb3V0ZUxheWVyUmVjdChjdXRMYXllck51bSwgYmJveFJlY3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcHVzaCBsYXllcjIgcmVjdAotICAgICAgICBmckxheWVyTnVtIGxheWVyTnVtMiA9IHZpYS0+Z2V0VmlhRGVmKCktPmdldExheWVyMk51bSgpOwotICAgICAgICBmb3IgKGF1dG8gJmZpZzogdmlhLT5nZXRWaWFEZWYoKS0+Z2V0TGF5ZXIyRmlncygpKSB7Ci0gICAgICAgICAgZnJCb3ggYmJveDsKLSAgICAgICAgICBmaWctPmdldEJCb3goYmJveCk7Ci0gICAgICAgICAgYmJveC50cmFuc2Zvcm0oeGZvcm0pOwotICAgICAgICAgIFJlY3RhbmdsZSBiYm94UmVjdChiYm94LmxlZnQoKSwgYmJveC5ib3R0b20oKSwgYmJveC5yaWdodCgpLCBiYm94LnRvcCgpKTsKLSAgICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgIiAgYWRkIHRvIG5ldCIgPDwgbmV0SWQgPDwgIiBsYXllciAiIDw8IGxheWVyTnVtMiA8PCAiICgiIDw8IGJib3gubGVmdCgpIC8gZGJ1IDw8ICIsICIgPDwgYmJveC5ib3R0b20oKSAvIGRidQotICAgICAgICAgIC8vICAgICAgICAgICA8PCAiKSAtICgiIDw8IGJib3gucmlnaHQoKSAvIGRidSA8PCAiLCAiIDw8IGJib3gudG9wKCkgLyBkYnUgPDwgIilcbiI7Ci0gICAgICAgICAgZHJjTmV0LT5hZGRSb3V0ZUxheWVyUmVjdChsYXllck51bTIsIGJib3hSZWN0KTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgZHJjUGF0Y2hXaXJlOgotICAgICAgewotICAgICAgICBpbnQgbmV0SWQgPSAtMTsKLSAgICAgICAgZHJQYXRjaFdpcmUqIHB3aXJlID0gc3RhdGljX2Nhc3Q8ZHJQYXRjaFdpcmUqPihvYmopOwotICAgICAgICAvLyBnZXQgbmV0SWQKLSAgICAgICAgaWYgKHB3aXJlLT5oYXNOZXQoKSkgewotICAgICAgICAgIGlmIChuZXQySWQuZmluZChwd2lyZS0+Z2V0TmV0KCktPmdldEZyTmV0KCkpID09IG5ldDJJZC5lbmQoKSkgewotICAgICAgICAgICAgbmV0SWQgPSBkcmNOZXRzLnNpemUoKTsKLSAgICAgICAgICAgIGRyY05ldHMucHVzaF9iYWNrKHN0ZDo6bWFrZV91bmlxdWU8RFJDTmV0PihuZXRJZCkpOwotICAgICAgICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQgPT0gc3RhdGljX2Nhc3Q8ZnJCbG9ja09iamVjdCo+KHB3aXJlLT5nZXROZXQoKS0+Z2V0RnJOZXQoKSkpIHsKLSAgICAgICAgICAgICAgdGFyZ2V0TmV0SWQgPSBuZXRJZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIChkcmNOZXRzLmJhY2soKSktPnNldFNyYyhwd2lyZS0+Z2V0TmV0KCktPmdldEZyTmV0KCkpOwotICAgICAgICAgICAgbmV0MklkW3B3aXJlLT5nZXROZXQoKS0+Z2V0RnJOZXQoKV0gPSBuZXRJZDsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmV0SWQgPSBuZXQySWRbcHdpcmUtPmdldE5ldCgpLT5nZXRGck5ldCgpXTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbmV0SWQgPSBzdGF0aWNfY2FzdDxpbnQ+KGRyY1NwZWNpYWxOZXRJZEVudW06OkZMT0FUU0lHTkFMKTsKLSAgICAgICAgfQotICAgICAgICAvLyBwdXNoIGxheWVyIHNoYXBlCi0gICAgICAgIGlmIChuZXRJZCA9PSAtMSkgewotICAgICAgICAgIHN0ZDo6Y291dCA8PCAiRXJyb3I6IHVuZXhwZWN0ZWQgbmV0SWQgaW4gaW5pdE5ldFJlY3RzX2Nvbm5GaWdzXG4iOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGRyY05ldCA9IGRyY05ldHNbbmV0SWRdLmdldCgpOwotICAgICAgICAKLSAgICAgICAgZnJMYXllck51bSBsYXllck51bSA9IHB3aXJlLT5nZXRMYXllck51bSgpOwotICAgICAgICBmckJveCBiYm94OwotICAgICAgICBwd2lyZS0+Z2V0QkJveChiYm94KTsKLSAgICAgICAgUmVjdGFuZ2xlIHBhdGNoV2lyZVJlY3QoYmJveC5sZWZ0KCksIGJib3guYm90dG9tKCksIGJib3gucmlnaHQoKSwgYmJveC50b3AoKSk7Ci0gICAgICAgIC8vIHN0ZDo6Y291dCA8PCAiICBhZGQgcGF0aHNlZyBiYm94ICgiIDw8IGJib3gubGVmdCgpIC8gZGJ1PDwgIiwgIiA8PCBiYm94LmJvdHRvbSgpIC8gZGJ1Ci0gICAgICAgIC8vICAgICAgICAgICA8PCAiKSAtLSAoIiA8PCBiYm94LnJpZ2h0KCkgLyBkYnUgPDwgIiwgIiA8PCBiYm94LnRvcCgpIC8gZGJ1IDw8ICIpIGZyb20gbmV0ICIgPDwgbmV0SWQgPDwgIlxuIjsKLSAgICAgICAgZHJjTmV0LT5hZGRSb3V0ZUxheWVyUmVjdChsYXllck51bSwgcGF0Y2hXaXJlUmVjdCk7Ci0gICAgICAgIC8vIHN0ZDo6Y291dCA8PCAiICBhZGRlZCBwd2lyZVxuIiA8PCBzdGQ6OmZsdXNoOwotCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBzdGQ6OmNvdXQgPDwgIldhcm5pbmc6IHVuc3VwcG9ydGVkIGNvbm5GaWcgdHlwZSBpbiBpbml0TmV0UmVjdHNfY29ubkZpZ3MsIHNraXBwZWQuLi5cbiI7Ci0gICAgfQotICB9Ci19Ci0KLQotdm9pZCBmcjo6RFJDV29ya2VyOjppbml0U3BlY2lhbE5ldHMoKSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbmV0Q250OyArK2kpIHsKLSAgICBkcmNOZXRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPERSQ05ldD4oaSkpOwotICB9Ci19Ci0KLXZvaWQgZnI6OkRSQ1dvcmtlcjo6aW5pdE5ldFJlY3RzX3Rlcm1zKCkgewotICBmb3IgKGF1dG8gb2JqOiB0ZXJtcykgewotICAgIERSQ05ldCogZHJjTmV0ID0gbnVsbHB0cjsKLSAgICBzd2l0Y2ggKG9iai0+dHlwZUlkKCkpIHsKLSAgICAgIGNhc2UgZnJjSW5zdFRlcm06Ci0gICAgICB7Ci0gICAgICAgIGludCBuZXRJZCA9IC0xOwotICAgICAgICBmckluc3RUZXJtICppbnN0VGVybSA9IHN0YXRpY19jYXN0PGZySW5zdFRlcm0qPihvYmopOwotICAgICAgICBmckluc3QqIGluc3QgPSBpbnN0VGVybS0+Z2V0SW5zdCgpOwotICAgICAgICBmckJveCBtYm94OwotICAgICAgICBmclRyYW5zZm9ybSB4Zm9ybTsKLSAgICAgICAgaW5zdC0+Z2V0VXBkYXRlZFhmb3JtKHhmb3JtKTsKLSAgICAgICAgYXV0byB0ZXJtID0gaW5zdFRlcm0tPmdldFRlcm0oKTsKLSAgICAgICAgLy8gZ2V0IG5ldElkCi0gICAgICAgIGlmIChpbnN0VGVybS0+aGFzTmV0KCkpIHsKLSAgICAgICAgICBpZiAobmV0MklkLmZpbmQoaW5zdFRlcm0tPmdldE5ldCgpKSA9PSBuZXQySWQuZW5kKCkpIHsKLSAgICAgICAgICAgIG5ldElkID0gZHJjTmV0cy5zaXplKCk7Ci0gICAgICAgICAgICBkcmNOZXRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPERSQ05ldD4obmV0SWQpKTsKLSAgICAgICAgICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0ID09IHN0YXRpY19jYXN0PGZyQmxvY2tPYmplY3QqPihpbnN0VGVybS0+Z2V0TmV0KCkpKSB7Ci0gICAgICAgICAgICAgIHRhcmdldE5ldElkID0gbmV0SWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyAoZHJjTmV0cy5iYWNrKCkpLT5zZXROZXQoaW5zdFRlcm0tPmdldE5ldCgpKTsKLSAgICAgICAgICAgIChkcmNOZXRzLmJhY2soKSktPnNldFNyYyhpbnN0VGVybS0+Z2V0TmV0KCkpOwotICAgICAgICAgICAgbmV0MklkW2luc3RUZXJtLT5nZXROZXQoKV0gPSBuZXRJZDsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmV0SWQgPSBuZXQySWRbaW5zdFRlcm0tPmdldE5ldCgpXTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKHRlcm0tPmdldFR5cGUoKSA9PSBmclRlcm1FbnVtOjpmcmNOb3JtYWxUZXJtIHx8IAotICAgICAgICAgICAgICB0ZXJtLT5nZXRUeXBlKCkgPT0gZnJUZXJtRW51bTo6ZnJjQ2xvY2tUZXJtKSB7Ci0gICAgICAgICAgICAvLyBuZXRJZCA9IHN0YXRpY19jYXN0PGludD4oZHJjU3BlY2lhbE5ldElkRW51bTo6RkxPQVRTSUdOQUwpOwotICAgICAgICAgICAgbmV0SWQgPSBkcmNOZXRzLnNpemUoKTsKLSAgICAgICAgICAgIGRyY05ldHMucHVzaF9iYWNrKHN0ZDo6bWFrZV91bmlxdWU8RFJDTmV0PihuZXRJZCkpOwotICAgICAgICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQgPT0gc3RhdGljX2Nhc3Q8ZnJCbG9ja09iamVjdCo+KGluc3RUZXJtKSkgewotICAgICAgICAgICAgICB0YXJnZXROZXRJZCA9IG5ldElkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKGRyY05ldHMuYmFjaygpKS0+c2V0U3JjKGluc3RUZXJtKTsKLSAgICAgICAgICAgIHRlcm0ySWRbdGVybV0gPSBuZXRJZDsKLSAgICAgICAgICB9IGVsc2UgaWYgKHRlcm0tPmdldFR5cGUoKSA9PSBmclRlcm1FbnVtOjpmcmNQb3dlclRlcm0pIHsKLSAgICAgICAgICAgIG5ldElkID0gc3RhdGljX2Nhc3Q8aW50PihkcmNTcGVjaWFsTmV0SWRFbnVtOjpGTE9BVFBPV0VSKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKHRlcm0tPmdldFR5cGUoKSA9PSBmclRlcm1FbnVtOjpmcmNHcm91bmRUZXJtKSB7Ci0gICAgICAgICAgICBuZXRJZCA9IHN0YXRpY19jYXN0PGludD4oZHJjU3BlY2lhbE5ldElkRW51bTo6RkxPQVRHUk9VTkQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHB1c2ggbGF5ZXIgc2hhcGVzCi0gICAgICAgIGlmIChuZXRJZCA9PSAtMSkgewotICAgICAgICAgIHN0ZDo6Y291dCA8PCAiRXJyb3I6IHVuZXhwZWN0ZWQgbmV0SWQgaW4gaW5pdE5ldFJlY3RzX3Rlcm1zXG4iOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGRyY05ldCA9IGRyY05ldHNbbmV0SWRdLmdldCgpOwotCi0gICAgICAgIGZvciAoYXV0byAmcGluOiB0ZXJtLT5nZXRQaW5zKCkpIHsKLSAgICAgICAgICBhdXRvIHBpbkxheWVyMlBvbHlTZXQgPSBwaW4tPmdldExheWVyMlBvbHlTZXQoKTsKLSAgICAgICAgICBmb3IgKGF1dG8gbGF5ZXJJdCA9IHBpbkxheWVyMlBvbHlTZXQuYmVnaW4oKTsgbGF5ZXJJdCAhPSBwaW5MYXllcjJQb2x5U2V0LmVuZCgpOyArK2xheWVySXQpIHsKLSAgICAgICAgICAgIGF1dG8gJmxheWVyTnVtID0gbGF5ZXJJdC0+Zmlyc3Q7Ci0gICAgICAgICAgICBhdXRvICZwb2x5U2V0ID0gbGF5ZXJJdC0+c2Vjb25kOwotICAgICAgICAgICAgZm9yIChhdXRvICZwb2x5OiBwb2x5U2V0KSB7Ci0gICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBvaW50PiB0cmFuc2Zvcm1lZFBvaW50czsKLSAgICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gYmVnaW5fcG9pbnRzKHBvbHkpOyBpdCAhPSBlbmRfcG9pbnRzKHBvbHkpOyArK2l0KSB7Ci0gICAgICAgICAgICAgICAgZnJQb2ludCB0bXBQdCgoKml0KS54KCksICgqaXQpLnkoKSk7Ci0gICAgICAgICAgICAgICAgdG1wUHQudHJhbnNmb3JtKHhmb3JtKTsKLSAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZFBvaW50cy5wdXNoX2JhY2soUG9pbnQodG1wUHQueCgpLCB0bXBQdC55KCkpKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBQb2x5Z29uIHRtcFBvbHk7Ci0gICAgICAgICAgICAgIHNldF9wb2ludHModG1wUG9seSwgdHJhbnNmb3JtZWRQb2ludHMuYmVnaW4oKSwgdHJhbnNmb3JtZWRQb2ludHMuZW5kKCkpOwotICAgICAgICAgICAgICBkcmNOZXQtPmFkZEZpeGVkTGF5ZXJQb2x5KGxheWVyTnVtLCB0bXBQb2x5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIGZyY1Rlcm06Ci0gICAgICB7Ci0gICAgICAgIGludCBuZXRJZCA9IC0xOwotICAgICAgICBmclRlcm0qIHRlcm0gPSBzdGF0aWNfY2FzdDxmclRlcm0qPihvYmopOwotICAgICAgICAvLyBnZXQgbmV0SWQKLSAgICAgICAgaWYgKHRlcm0tPmhhc05ldCgpKSB7Ci0gICAgICAgICAgaWYgKG5ldDJJZC5maW5kKHRlcm0tPmdldE5ldCgpKSA9PSBuZXQySWQuZW5kKCkpIHsKLSAgICAgICAgICAgIG5ldElkID0gZHJjTmV0cy5zaXplKCk7Ci0gICAgICAgICAgICBkcmNOZXRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPERSQ05ldD4obmV0SWQpKTsKLSAgICAgICAgICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0ID09IHN0YXRpY19jYXN0PGZyQmxvY2tPYmplY3QqPih0ZXJtLT5nZXROZXQoKSkpIHsKLSAgICAgICAgICAgICAgdGFyZ2V0TmV0SWQgPSBuZXRJZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIChkcmNOZXRzLmJhY2soKSktPnNldE5ldCh0ZXJtLT5nZXROZXQoKSk7Ci0gICAgICAgICAgICAoZHJjTmV0cy5iYWNrKCkpLT5zZXRTcmModGVybS0+Z2V0TmV0KCkpOwotICAgICAgICAgICAgbmV0MklkW3Rlcm0tPmdldE5ldCgpXSA9IG5ldElkOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBuZXRJZCA9IG5ldDJJZFt0ZXJtLT5nZXROZXQoKV07Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmICh0ZXJtLT5nZXRUeXBlKCkgPT0gZnJUZXJtRW51bTo6ZnJjTm9ybWFsVGVybSB8fCAKLSAgICAgICAgICAgICAgdGVybS0+Z2V0VHlwZSgpID09IGZyVGVybUVudW06OmZyY0Nsb2NrVGVybSkgewotICAgICAgICAgICAgLy8gbmV0SWQgPSBzdGF0aWNfY2FzdDxpbnQ+KGRyY1NwZWNpYWxOZXRJZEVudW06OkZMT0FUU0lHTkFMKTsKLSAgICAgICAgICAgIG5ldElkID0gZHJjTmV0cy5zaXplKCk7Ci0gICAgICAgICAgICBkcmNOZXRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPERSQ05ldD4obmV0SWQpKTsKLSAgICAgICAgICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0ID09IHN0YXRpY19jYXN0PGZyQmxvY2tPYmplY3QqPih0ZXJtKSkgewotICAgICAgICAgICAgICB0YXJnZXROZXRJZCA9IG5ldElkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKGRyY05ldHMuYmFjaygpKS0+c2V0U3JjKHRlcm0pOwotICAgICAgICAgICAgdGVybTJJZFt0ZXJtXSA9IG5ldElkOwotICAgICAgICAgIH0gZWxzZSBpZiAodGVybS0+Z2V0VHlwZSgpID09IGZyVGVybUVudW06OmZyY1Bvd2VyVGVybSkgewotICAgICAgICAgICAgbmV0SWQgPSBzdGF0aWNfY2FzdDxpbnQ+KGRyY1NwZWNpYWxOZXRJZEVudW06OkZMT0FUUE9XRVIpOwotICAgICAgICAgIH0gZWxzZSBpZiAodGVybS0+Z2V0VHlwZSgpID09IGZyVGVybUVudW06OmZyY0dyb3VuZFRlcm0pIHsKLSAgICAgICAgICAgIG5ldElkID0gc3RhdGljX2Nhc3Q8aW50PihkcmNTcGVjaWFsTmV0SWRFbnVtOjpGTE9BVEdST1VORCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcHVzaCBsYXllciBzaGFwZXMKLSAgICAgICAgaWYgKG5ldElkID09IC0xKSB7Ci0gICAgICAgICAgc3RkOjpjb3V0IDw8ICJFcnJvcjogdW5leHBlY3RlZCBuZXRJZCBpbiBpbml0TmV0UmVjdHNfdGVybXNcbiI7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZHJjTmV0ID0gZHJjTmV0c1tuZXRJZF0uZ2V0KCk7Ci0KLSAgICAgICAgZm9yIChhdXRvICZwaW46IHRlcm0tPmdldFBpbnMoKSkgewotICAgICAgICAgIGF1dG8gcGluTGF5ZXIyUG9seVNldCA9IHBpbi0+Z2V0TGF5ZXIyUG9seVNldCgpOwotICAgICAgICAgIGZvciAoYXV0byBsYXllckl0ID0gcGluTGF5ZXIyUG9seVNldC5iZWdpbigpOyBsYXllckl0ICE9IHBpbkxheWVyMlBvbHlTZXQuZW5kKCk7ICsrbGF5ZXJJdCkgewotICAgICAgICAgICAgYXV0byAmbGF5ZXJOdW0gPSBsYXllckl0LT5maXJzdDsKLSAgICAgICAgICAgIGF1dG8gJnBvbHlTZXQgPSBsYXllckl0LT5zZWNvbmQ7Ci0gICAgICAgICAgICBmb3IgKGF1dG8gJnBvbHk6IHBvbHlTZXQpIHsKLSAgICAgICAgICAgICAgZHJjTmV0LT5hZGRGaXhlZExheWVyUG9seShsYXllck51bSwgcG9seSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgc3RkOjpjb3V0IDw8ICJFcnJvcjogdW5leHBlY3RlZCB0eXBlIGluIGluaXROZXRSZWN0c190ZXJtc1xuIjsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBmcjo6RFJDV29ya2VyOjppbml0TmV0UmVjdHNfY29ubkZpZ3MoKSB7Ci0gIC8vIGRvdWJsZSBkYnUgPSBkZXNpZ24tPmdldFRlY2goKS0+Z2V0REJVUGVyVVUoKTsKLSAgZm9yIChhdXRvIG9iajogY29ubkZpZ3MpIHsKLSAgICBEUkNOZXQqIGRyY05ldCA9IG51bGxwdHI7Ci0gICAgc3dpdGNoIChvYmotPnR5cGVJZCgpKSB7Ci0gICAgICBjYXNlIGZyY1BhdGhTZWc6Ci0gICAgICB7Ci0gICAgICAgIGludCBuZXRJZCA9IC0xOwotICAgICAgICBmclBhdGhTZWcqIHBhdGhTZWcgPSBzdGF0aWNfY2FzdDxmclBhdGhTZWcqPihvYmopOwotICAgICAgICAvLyBnZXQgbmV0SWQKLSAgICAgICAgaWYgKHBhdGhTZWctPmhhc05ldCgpKSB7Ci0gICAgICAgICAgaWYgKG5ldDJJZC5maW5kKHBhdGhTZWctPmdldE5ldCgpKSA9PSBuZXQySWQuZW5kKCkpIHsKLSAgICAgICAgICAgIG5ldElkID0gZHJjTmV0cy5zaXplKCk7Ci0gICAgICAgICAgICBkcmNOZXRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPERSQ05ldD4obmV0SWQpKTsKLSAgICAgICAgICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0ID09IHN0YXRpY19jYXN0PGZyQmxvY2tPYmplY3QqPihwYXRoU2VnLT5nZXROZXQoKSkpIHsKLSAgICAgICAgICAgICAgdGFyZ2V0TmV0SWQgPSBuZXRJZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIChkcmNOZXRzLmJhY2soKSktPnNldE5ldChwYXRoU2VnLT5nZXROZXQoKSk7Ci0gICAgICAgICAgICAoZHJjTmV0cy5iYWNrKCkpLT5zZXRTcmMocGF0aFNlZy0+Z2V0TmV0KCkpOwotICAgICAgICAgICAgbmV0MklkW3BhdGhTZWctPmdldE5ldCgpXSA9IG5ldElkOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBuZXRJZCA9IG5ldDJJZFtwYXRoU2VnLT5nZXROZXQoKV07Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHBhdGhTZWctPmhhc1BpbigpKSB7Ci0gICAgICAgICAgZm9yIChhdXRvIG1hcEl0ID0gdGVybTJJZC5iZWdpbigpOyBtYXBJdCAhPSB0ZXJtMklkLmVuZCgpOyArK21hcEl0KSB7Ci0gICAgICAgICAgICBpZiAobmV0SWQgIT0gLTEpIHsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdXRvIHRlcm0gPSBtYXBJdC0+Zmlyc3Q7Ci0gICAgICAgICAgICBmb3IgKGF1dG8gJnBpbjogdGVybS0+Z2V0UGlucygpKSB7Ci0gICAgICAgICAgICAgIGF1dG8gcGluUHRyID0gcGluLmdldCgpOwotICAgICAgICAgICAgICBpZiAocGluUHRyID09IHBhdGhTZWctPmdldFBpbigpKSB7Ci0gICAgICAgICAgICAgICAgbmV0SWQgPSBtYXBJdC0+c2Vjb25kOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIGlmIChuZXRJZCA9PSAtMSkgewotICAgICAgICAgIC8vICAgbmV0SWQgPSBzdGF0aWNfY2FzdDxpbnQ+KGRyY1NwZWNpYWxOZXRJZEVudW06OkZMT0FUU0lHTkFMKTsKLSAgICAgICAgICAvLyB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbmV0SWQgPSBzdGF0aWNfY2FzdDxpbnQ+KGRyY1NwZWNpYWxOZXRJZEVudW06OkZMT0FUU0lHTkFMKTsKLSAgICAgICAgfQotICAgICAgICAvLyBwdXNoIGxheWVyIHNoYXBlCi0gICAgICAgIGlmIChuZXRJZCA9PSAtMSkgewotICAgICAgICAgIHN0ZDo6Y291dCA8PCAiRXJyb3I6IHVuZXhwZWN0ZWQgbmV0SWQgaW4gaW5pdE5ldFJlY3RzX2Nvbm5GaWdzXG4iOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGRyY05ldCA9IGRyY05ldHNbbmV0SWRdLmdldCgpOwotICAgICAgICAKLSAgICAgICAgZnJMYXllck51bSBsYXllck51bSA9IHBhdGhTZWctPmdldExheWVyTnVtKCk7Ci0gICAgICAgIGZyQm94IGJib3g7Ci0gICAgICAgIHBhdGhTZWctPmdldEJCb3goYmJveCk7Ci0gICAgICAgIFJlY3RhbmdsZSBwYXRoU2VnUmVjdChiYm94LmxlZnQoKSwgYmJveC5ib3R0b20oKSwgYmJveC5yaWdodCgpLCBiYm94LnRvcCgpKTsKLSAgICAgICAgLy8gc3RkOjpjb3V0IDw8ICIgIGFkZCBwYXRoc2VnIGJib3ggKCIgPDwgYmJveC5sZWZ0KCkgLyBkYnU8PCAiLCAiIDw8IGJib3guYm90dG9tKCkgLyBkYnUKLSAgICAgICAgLy8gICAgICAgICAgIDw8ICIpIC0tICgiIDw8IGJib3gucmlnaHQoKSAvIGRidSA8PCAiLCAiIDw8IGJib3gudG9wKCkgLyBkYnUgPDwgIikgZnJvbSBuZXQgIiA8PCBuZXRJZCA8PCAiXG4iOwotICAgICAgICBkcmNOZXQtPmFkZFJvdXRlTGF5ZXJSZWN0KGxheWVyTnVtLCBwYXRoU2VnUmVjdCk7Ci0gICAgICAgIC8vIHN0ZDo6Y291dCA8PCAiICBhZGRlZCBwYXRoU2VnXG4iIDw8IHN0ZDo6Zmx1c2g7Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIGZyY1ZpYToKLSAgICAgIHsKLSAgICAgICAgaW50IG5ldElkID0gLTE7Ci0gICAgICAgIGZyVmlhKiB2aWEgPSBzdGF0aWNfY2FzdDxmclZpYSo+KG9iaik7Ci0gICAgICAgIC8vIGdldCBuZXRJZAotICAgICAgICBpZiAodmlhLT5oYXNOZXQoKSkgewotICAgICAgICAgIGlmIChuZXQySWQuZmluZCh2aWEtPmdldE5ldCgpKSA9PSBuZXQySWQuZW5kKCkpIHsKLSAgICAgICAgICAgIG5ldElkID0gZHJjTmV0cy5zaXplKCk7Ci0gICAgICAgICAgICBkcmNOZXRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPERSQ05ldD4obmV0SWQpKTsKLSAgICAgICAgICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0ID09IHN0YXRpY19jYXN0PGZyQmxvY2tPYmplY3QqPih2aWEtPmdldE5ldCgpKSkgewotICAgICAgICAgICAgICB0YXJnZXROZXRJZCA9IG5ldElkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gKGRyY05ldHMuYmFjaygpKS0+c2V0TmV0KHZpYS0+Z2V0TmV0KCkpOwotICAgICAgICAgICAgKGRyY05ldHMuYmFjaygpKS0+c2V0U3JjKHZpYS0+Z2V0TmV0KCkpOwotICAgICAgICAgICAgbmV0MklkW3ZpYS0+Z2V0TmV0KCldID0gbmV0SWQ7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5ldElkID0gbmV0MklkW3ZpYS0+Z2V0TmV0KCldOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICh2aWEtPmhhc1BpbigpKSB7Ci0gICAgICAgICAgZm9yIChhdXRvIG1hcEl0ID0gdGVybTJJZC5iZWdpbigpOyBtYXBJdCAhPSB0ZXJtMklkLmVuZCgpOyArK21hcEl0KSB7Ci0gICAgICAgICAgICBpZiAobmV0SWQgIT0gLTEpIHsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdXRvIHRlcm0gPSBtYXBJdC0+Zmlyc3Q7Ci0gICAgICAgICAgICBmb3IgKGF1dG8gJnBpbjogdGVybS0+Z2V0UGlucygpKSB7Ci0gICAgICAgICAgICAgIGF1dG8gcGluUHRyID0gcGluLmdldCgpOwotICAgICAgICAgICAgICBpZiAocGluUHRyID09IHZpYS0+Z2V0UGluKCkpIHsKLSAgICAgICAgICAgICAgICBuZXRJZCA9IG1hcEl0LT5zZWNvbmQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKG5ldElkID09IC0xKSB7Ci0gICAgICAgICAgICBuZXRJZCA9IGRyY05ldHMuc2l6ZSgpOwotICAgICAgICAgICAgZHJjTmV0cy5wdXNoX2JhY2soc3RkOjptYWtlX3VuaXF1ZTxEUkNOZXQ+KG5ldElkKSk7Ci0gICAgICAgICAgICBhdXRvIHRlcm0gPSB2aWEtPmdldFBpbigpLT5nZXRUZXJtKCk7Ci0gICAgICAgICAgICB0ZXJtMklkW3Rlcm1dID0gbmV0SWQ7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG5ldElkID0gc3RhdGljX2Nhc3Q8aW50PihkcmNTcGVjaWFsTmV0SWRFbnVtOjpGTE9BVFNJR05BTCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gcHVzaCBsYXllciBzaGFwZS4gVE9ETzogaGFuZGxlIGN1dCBsYXllciBzaGFwZQotICAgICAgICBpZiAobmV0SWQgPT0gLTEpIHsKLSAgICAgICAgICBzdGQ6OmNvdXQgPDwgIkVycm9yOiB1bmV4cGVjdGVkIG5ldElkIGluIGluaXROZXRSZWN0c19jb25uRmlnc1xuIjsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBkcmNOZXQgPSBkcmNOZXRzW25ldElkXS5nZXQoKTsKLQotICAgICAgICAvLyBwdXNoIGxheWVyMSByZWN0Ci0gICAgICAgIC8vIGRvdWJsZSBkYnUgPSBkZXNpZ24tPmdldFRlY2goKS0+Z2V0REJVUGVyVVUoKTsKLSAgICAgICAgZnJMYXllck51bSBsYXllck51bTEgPSB2aWEtPmdldFZpYURlZigpLT5nZXRMYXllcjFOdW0oKTsKLSAgICAgICAgZnJUcmFuc2Zvcm0geGZvcm07Ci0gICAgICAgIHZpYS0+Z2V0VHJhbnNmb3JtKHhmb3JtKTsKLSAgICAgICAgZm9yIChhdXRvICZmaWc6IHZpYS0+Z2V0VmlhRGVmKCktPmdldExheWVyMUZpZ3MoKSkgewotICAgICAgICAgIAotICAgICAgICAgIGZyQm94IGJib3g7Ci0gICAgICAgICAgZmlnLT5nZXRCQm94KGJib3gpOwotICAgICAgICAgIGJib3gudHJhbnNmb3JtKHhmb3JtKTsKLSAgICAgICAgICBSZWN0YW5nbGUgYmJveFJlY3QoYmJveC5sZWZ0KCksIGJib3guYm90dG9tKCksIGJib3gucmlnaHQoKSwgYmJveC50b3AoKSk7Ci0gICAgICAgICAgLy8gc3RkOjpjb3V0IDw8ICIgIGFkZCB0byBuZXQiIDw8IG5ldElkIDw8ICIgbGF5ZXIgIiA8PCBsYXllck51bTEgPDwgIiAoIiA8PCBiYm94LmxlZnQoKSAvIGRidSA8PCAiLCAiIDw8IGJib3guYm90dG9tKCkgLyBkYnUKLSAgICAgICAgICAvLyAgICAgICAgICAgPDwgIikgLSAoIiA8PCBiYm94LnJpZ2h0KCkgLyBkYnUgPDwgIiwgIiA8PCBiYm94LnRvcCgpIC8gZGJ1IDw8ICIpXG4iOwotICAgICAgICAgIGRyY05ldC0+YWRkUm91dGVMYXllclJlY3QobGF5ZXJOdW0xLCBiYm94UmVjdCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwdXNoIGN1dCBsYXllciByZWN0Ci0gICAgICAgIGZyTGF5ZXJOdW0gY3V0TGF5ZXJOdW0gPSB2aWEtPmdldFZpYURlZigpLT5nZXRDdXRMYXllck51bSgpOwotICAgICAgICBmb3IgKGF1dG8gJmZpZzogdmlhLT5nZXRWaWFEZWYoKS0+Z2V0Q3V0RmlncygpKSB7Ci0gICAgICAgICAgZnJCb3ggYmJveDsKLSAgICAgICAgICBmaWctPmdldEJCb3goYmJveCk7Ci0gICAgICAgICAgYmJveC50cmFuc2Zvcm0oeGZvcm0pOwotICAgICAgICAgIFJlY3RhbmdsZSBiYm94UmVjdChiYm94LmxlZnQoKSwgYmJveC5ib3R0b20oKSwgYmJveC5yaWdodCgpLCBiYm94LnRvcCgpKTsKLSAgICAgICAgICBkcmNOZXQtPmFkZFJvdXRlTGF5ZXJSZWN0KGN1dExheWVyTnVtLCBiYm94UmVjdCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwdXNoIGxheWVyMiByZWN0Ci0gICAgICAgIGZyTGF5ZXJOdW0gbGF5ZXJOdW0yID0gdmlhLT5nZXRWaWFEZWYoKS0+Z2V0TGF5ZXIyTnVtKCk7Ci0gICAgICAgIGZvciAoYXV0byAmZmlnOiB2aWEtPmdldFZpYURlZigpLT5nZXRMYXllcjJGaWdzKCkpIHsKLSAgICAgICAgICBmckJveCBiYm94OwotICAgICAgICAgIGZpZy0+Z2V0QkJveChiYm94KTsKLSAgICAgICAgICBiYm94LnRyYW5zZm9ybSh4Zm9ybSk7Ci0gICAgICAgICAgUmVjdGFuZ2xlIGJib3hSZWN0KGJib3gubGVmdCgpLCBiYm94LmJvdHRvbSgpLCBiYm94LnJpZ2h0KCksIGJib3gudG9wKCkpOwotICAgICAgICAgIC8vIHN0ZDo6Y291dCA8PCAiICBhZGQgdG8gbmV0IiA8PCBuZXRJZCA8PCAiIGxheWVyICIgPDwgbGF5ZXJOdW0yIDw8ICIgKCIgPDwgYmJveC5sZWZ0KCkgLyBkYnUgPDwgIiwgIiA8PCBiYm94LmJvdHRvbSgpIC8gZGJ1Ci0gICAgICAgICAgLy8gICAgICAgICAgIDw8ICIpIC0gKCIgPDwgYmJveC5yaWdodCgpIC8gZGJ1IDw8ICIsICIgPDwgYmJveC50b3AoKSAvIGRidSA8PCAiKVxuIjsKLSAgICAgICAgICBkcmNOZXQtPmFkZFJvdXRlTGF5ZXJSZWN0KGxheWVyTnVtMiwgYmJveFJlY3QpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBmcmNQYXRjaFdpcmU6Ci0gICAgICB7Ci0gICAgICAgIGludCBuZXRJZCA9IC0xOwotICAgICAgICBmclBhdGNoV2lyZSogcHdpcmUgPSBzdGF0aWNfY2FzdDxmclBhdGNoV2lyZSo+KG9iaik7Ci0gICAgICAgIC8vIGdldCBuZXRJZAotICAgICAgICBpZiAocHdpcmUtPmhhc05ldCgpKSB7Ci0gICAgICAgICAgaWYgKG5ldDJJZC5maW5kKHB3aXJlLT5nZXROZXQoKSkgPT0gbmV0MklkLmVuZCgpKSB7Ci0gICAgICAgICAgICBuZXRJZCA9IGRyY05ldHMuc2l6ZSgpOwotICAgICAgICAgICAgZHJjTmV0cy5wdXNoX2JhY2soc3RkOjptYWtlX3VuaXF1ZTxEUkNOZXQ+KG5ldElkKSk7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0ICYmIHRhcmdldCA9PSBzdGF0aWNfY2FzdDxmckJsb2NrT2JqZWN0Kj4ocHdpcmUtPmdldE5ldCgpKSkgewotICAgICAgICAgICAgICB0YXJnZXROZXRJZCA9IG5ldElkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gKGRyY05ldHMuYmFjaygpKS0+c2V0TmV0KHB3aXJlLT5nZXROZXQoKSk7Ci0gICAgICAgICAgICAoZHJjTmV0cy5iYWNrKCkpLT5zZXRTcmMocHdpcmUtPmdldE5ldCgpKTsKLSAgICAgICAgICAgIG5ldDJJZFtwd2lyZS0+Z2V0TmV0KCldID0gbmV0SWQ7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5ldElkID0gbmV0MklkW3B3aXJlLT5nZXROZXQoKV07Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHB3aXJlLT5oYXNQaW4oKSkgewotICAgICAgICAgIGZvciAoYXV0byBtYXBJdCA9IHRlcm0ySWQuYmVnaW4oKTsgbWFwSXQgIT0gdGVybTJJZC5lbmQoKTsgKyttYXBJdCkgewotICAgICAgICAgICAgaWYgKG5ldElkICE9IC0xKSB7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXV0byB0ZXJtID0gbWFwSXQtPmZpcnN0OwotICAgICAgICAgICAgZm9yIChhdXRvICZwaW46IHRlcm0tPmdldFBpbnMoKSkgewotICAgICAgICAgICAgICBhdXRvIHBpblB0ciA9IHBpbi5nZXQoKTsKLSAgICAgICAgICAgICAgaWYgKHBpblB0ciA9PSBwd2lyZS0+Z2V0UGluKCkpIHsKLSAgICAgICAgICAgICAgICBuZXRJZCA9IG1hcEl0LT5zZWNvbmQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gaWYgKG5ldElkID09IC0xKSB7Ci0gICAgICAgICAgLy8gICBuZXRJZCA9IHN0YXRpY19jYXN0PGludD4oZHJjU3BlY2lhbE5ldElkRW51bTo6RkxPQVRTSUdOQUwpOwotICAgICAgICAgIC8vIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBuZXRJZCA9IHN0YXRpY19jYXN0PGludD4oZHJjU3BlY2lhbE5ldElkRW51bTo6RkxPQVRTSUdOQUwpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHB1c2ggbGF5ZXIgc2hhcGUKLSAgICAgICAgaWYgKG5ldElkID09IC0xKSB7Ci0gICAgICAgICAgc3RkOjpjb3V0IDw8ICJFcnJvcjogdW5leHBlY3RlZCBuZXRJZCBpbiBpbml0TmV0UmVjdHNfY29ubkZpZ3NcbiI7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZHJjTmV0ID0gZHJjTmV0c1tuZXRJZF0uZ2V0KCk7Ci0gICAgICAgIAotICAgICAgICBmckxheWVyTnVtIGxheWVyTnVtID0gcHdpcmUtPmdldExheWVyTnVtKCk7Ci0gICAgICAgIGZyQm94IGJib3g7Ci0gICAgICAgIHB3aXJlLT5nZXRCQm94KGJib3gpOwotICAgICAgICBSZWN0YW5nbGUgcGF0Y2hXaXJlUmVjdChiYm94LmxlZnQoKSwgYmJveC5ib3R0b20oKSwgYmJveC5yaWdodCgpLCBiYm94LnRvcCgpKTsKLSAgICAgICAgLy8gc3RkOjpjb3V0IDw8ICIgIGFkZCBwYXRoc2VnIGJib3ggKCIgPDwgYmJveC5sZWZ0KCkgLyBkYnU8PCAiLCAiIDw8IGJib3guYm90dG9tKCkgLyBkYnUKLSAgICAgICAgLy8gICAgICAgICAgIDw8ICIpIC0tICgiIDw8IGJib3gucmlnaHQoKSAvIGRidSA8PCAiLCAiIDw8IGJib3gudG9wKCkgLyBkYnUgPDwgIikgZnJvbSBuZXQgIiA8PCBuZXRJZCA8PCAiXG4iOwotICAgICAgICBkcmNOZXQtPmFkZFJvdXRlTGF5ZXJSZWN0KGxheWVyTnVtLCBwYXRjaFdpcmVSZWN0KTsKLSAgICAgICAgLy8gc3RkOjpjb3V0IDw8ICIgIGFkZGVkIHB3aXJlXG4iIDw8IHN0ZDo6Zmx1c2g7Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBzdGQ6OmNvdXQgPDwgIldhcm5pbmc6IHVuc3VwcG9ydGVkIGNvbm5GaWcgdHlwZSBpbiBpbml0TmV0UmVjdHNfY29ubkZpZ3MsIHNraXBwZWQuLi5cbiI7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgZnI6OkRSQ1dvcmtlcjo6aW5pdE5ldFJlY3RzX2Jsb2NrYWdlcygpIHsKLSAgZm9yIChhdXRvIG9iajogYmxvY2thZ2VzKSB7Ci0gICAgRFJDTmV0ICpkcmNOZXQgPSBudWxscHRyOwotICAgIHN3aXRjaCAob2JqLT50eXBlSWQoKSkgewotICAgICAgY2FzZSBmcmNMYXllckJsb2NrYWdlOgotICAgICAgewotICAgICAgICBmckxheWVyQmxvY2thZ2UqIGxheWVyQmxvY2thZ2UgPSBzdGF0aWNfY2FzdDxmckxheWVyQmxvY2thZ2UqPihvYmopOwotICAgICAgICBpbnQgbmV0SWQgPSBzdGF0aWNfY2FzdDxpbnQ+KGRyY1NwZWNpYWxOZXRJZEVudW06Ok9CUyk7Ci0gICAgICAgIC8vIHB1c2ggbGF5ZXIgc2hhcGVzCi0gICAgICAgIGRyY05ldCA9IGRyY05ldHNbbmV0SWRdLmdldCgpOwotICAgICAgICBmckxheWVyTnVtIGxheWVyTnVtID0gbGF5ZXJCbG9ja2FnZS0+Z2V0TGF5ZXJOdW0oKTsKLSAgICAgICAgYXV0byBibG9ja2FnZUZyUG9pbnRzID0gbGF5ZXJCbG9ja2FnZS0+Z2V0UG9pbnRzKCk7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPFBvaW50PiBibG9ja2FnZVBvaW50czsKLSAgICAgICAgZm9yIChhdXRvIHB0OiBibG9ja2FnZUZyUG9pbnRzKSB7Ci0gICAgICAgICAgYmxvY2thZ2VQb2ludHMucHVzaF9iYWNrKFBvaW50KHB0LngoKSwgcHQueSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgUG9seWdvbiBibG9ja2FnZVBvbHk7Ci0gICAgICAgIHNldF9wb2ludHMoYmxvY2thZ2VQb2x5LCBibG9ja2FnZVBvaW50cy5iZWdpbigpLCBibG9ja2FnZVBvaW50cy5lbmQoKSk7Ci0gICAgICAgIGRyY05ldC0+YWRkRml4ZWRMYXllclBvbHkobGF5ZXJOdW0sIGJsb2NrYWdlUG9seSk7Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIGZyY0luc3RCbG9ja2FnZToKLSAgICAgIHsKLSAgICAgICAgLy8gc3RkOjpjb3V0IDw8ICJhZGRpbmcgZnJJbnN0QmxvY2thZ2VcbiI7Ci0gICAgICAgIGZyQmxvY2thZ2UqIGJsb2NrYWdlID0gKHN0YXRpY19jYXN0PGZySW5zdEJsb2NrYWdlKj4ob2JqKSktPmdldEJsb2NrYWdlKCk7Ci0gICAgICAgIGlmIChibG9ja2FnZS0+dHlwZUlkKCkgIT0gZnJjTGF5ZXJCbG9ja2FnZSkgewotICAgICAgICAgIHN0ZDo6Y291dCA8PCAiRXJyb3I6IHVuZXhwZWN0ZWQgYmxvY2thZ2UgdHlwZSBpbiBpbml0TmV0UmVjdHNfYmxvY2thZ2VzXG4iOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGZySW5zdCogaW5zdCA9IChzdGF0aWNfY2FzdDxmckluc3RCbG9ja2FnZSo+KG9iaikpLT5nZXRJbnN0KCk7Ci0gICAgICAgIGZyVHJhbnNmb3JtIHhmb3JtOwotICAgICAgICBpbnN0LT5nZXRVcGRhdGVkWGZvcm0oeGZvcm0pOwotICAgICAgICBmckxheWVyQmxvY2thZ2UqIGxheWVyQmxvY2thZ2UgPSBzdGF0aWNfY2FzdDxmckxheWVyQmxvY2thZ2UqPihibG9ja2FnZSk7Ci0gICAgICAgIGludCBuZXRJZCA9IHN0YXRpY19jYXN0PGludD4oZHJjU3BlY2lhbE5ldElkRW51bTo6T0JTKTsKLSAgICAgICAgLy8gcHVzaCBsYXllciBzaGFwZXMKLSAgICAgICAgZHJjTmV0ID0gZHJjTmV0c1tuZXRJZF0uZ2V0KCk7Ci0gICAgICAgIGZyTGF5ZXJOdW0gbGF5ZXJOdW0gPSBsYXllckJsb2NrYWdlLT5nZXRMYXllck51bSgpOwotICAgICAgICBhdXRvIGJsb2NrYWdlRnJQb2ludHMgPSBsYXllckJsb2NrYWdlLT5nZXRQb2ludHMoKTsKLSAgICAgICAgc3RkOjp2ZWN0b3I8UG9pbnQ+IGJsb2NrYWdlUG9pbnRzOwotICAgICAgICBmb3IgKGF1dG8gcHQ6IGJsb2NrYWdlRnJQb2ludHMpIHsKLSAgICAgICAgICBmclBvaW50IHRtcFB0ID0gcHQ7Ci0gICAgICAgICAgdG1wUHQudHJhbnNmb3JtKHhmb3JtKTsKLSAgICAgICAgICBibG9ja2FnZVBvaW50cy5wdXNoX2JhY2soUG9pbnQodG1wUHQueCgpLCB0bXBQdC55KCkpKTsKLSAgICAgICAgfQotICAgICAgICBQb2x5Z29uIGJsb2NrYWdlUG9seTsKLSAgICAgICAgc2V0X3BvaW50cyhibG9ja2FnZVBvbHksIGJsb2NrYWdlUG9pbnRzLmJlZ2luKCksIGJsb2NrYWdlUG9pbnRzLmVuZCgpKTsKLSAgICAgICAgZHJjTmV0LT5hZGRGaXhlZExheWVyUG9seShsYXllck51bSwgYmxvY2thZ2VQb2x5KTsKLQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHN0ZDo6Y291dCA8PCAiV2FybmluZzogdW5zdXBwb3J0ZWQgYmxvY2thZ2UgdHlwZSBpbiBpbml0TmV0UmVjdHNfYmxvY2thZ2VzLCBza2lwcGVkLi4uXG4iOwotICAgIH0KLSAgfQotfQotCi12b2lkIGZyOjpEUkNXb3JrZXI6OnNvcnRPYmooKSB7Ci0gIGZvciAoYXV0byBvYmo6IG9ianMpIHsKLSAgICBzd2l0Y2ggKG9iai0+dHlwZUlkKCkpIHsKLSAgICAgIGNhc2UgZnJjVGVybToKLSAgICAgICAgdGVybXMucHVzaF9iYWNrKG9iaik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBmcmNJbnN0VGVybToKLSAgICAgICAgdGVybXMucHVzaF9iYWNrKG9iaik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBmcmNWaWE6Ci0gICAgICAgIGNvbm5GaWdzLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxmckNvbm5GaWcqPihvYmopKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGZyY1BhdGhTZWc6Ci0gICAgICAgIGNvbm5GaWdzLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxmckNvbm5GaWcqPihvYmopKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGZyY1BhdGNoV2lyZToKLSAgICAgICAgY29ubkZpZ3MucHVzaF9iYWNrKHN0YXRpY19jYXN0PGZyQ29ubkZpZyo+KG9iaikpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgZnJjTGF5ZXJCbG9ja2FnZToKLSAgICAgICAgYmxvY2thZ2VzLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxmckJsb2NrYWdlKj4ob2JqKSk7Ci0gICAgICBjYXNlIGZyY0luc3RCbG9ja2FnZToKLSAgICAgICAgYmxvY2thZ2VzLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxmckluc3RCbG9ja2FnZSo+KG9iaikpOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgY29udGludWU7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgZnI6OkRSQ1dvcmtlcjo6YWRkRFJOZXRzKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxkck5ldD4gPiAmbmV0cykgewotICBmb3IgKGF1dG8gJm5ldDogbmV0cykgewotICAgIGZvciAoYXV0byAmY29ubjogbmV0LT5nZXRFeHRDb25uRmlncygpKSB7Ci0gICAgICBhZGREUkNvbm5GaWcoY29ubi5nZXQoKSk7Ci0gICAgfQotICAgIGZvciAoYXV0byAmY29ubjogbmV0LT5nZXRSb3V0ZUNvbm5GaWdzKCkpIHsKLSAgICAgIGFkZERSQ29ubkZpZyhjb25uLmdldCgpKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBmcjo6RFJDV29ya2VyOjphZGREUkNvbm5GaWcoZHJDb25uRmlnKiBpbikgewotICBzd2l0Y2ggKGluLT50eXBlSWQoKSkgewotICAgIGNhc2UgZHJjVmlhOgotICAgICAgZHJDb25uRmlncy5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8ZHJWaWEqPihpbikpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBkcmNQYXRoU2VnOgotICAgICAgZHJDb25uRmlncy5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8ZHJQYXRoU2VnKj4oaW4pKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgZHJjUGF0Y2hXaXJlOgotICAgICAgZHJDb25uRmlncy5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8ZHJQYXRjaFdpcmUqPihpbikpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHN0ZDo6Y291dCA8PCAiRXJyb3I6IHVuZXhwZWN0ZWQgaW4gYWRkRFJDb25uRmlnXG4iOwotICB9Ci19CmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kcmMvZnJEUkNfbWFpbi5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kcmMvZnJEUkNfbWFpbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYjRjZTIuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZHJjL2ZyRFJDX21haW4uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTkwICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJkcmMvZnJEUkMuaCIKLSNpbmNsdWRlICJpby9mclNoYXBlVXRpbC5oIgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxpdGVyYXRvcj4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8c2V0PgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm87Ci11c2luZyBuYW1lc3BhY2UgYm9vc3Q6OnBvbHlnb246Om9wZXJhdG9yczsKLQotCi0KLXZvaWQgZnI6OkRSQ1dvcmtlcjo6bWFpbigpIHsKLSAgY2hlY2tNZXRhbFNob3J0KCk7Ci0gIGNoZWNrTWV0YWxTcGFjaW5nUnVsZXMoKTsKLSAgLy8gY2hlY2tNZXRhbE1pbkFyZWFSdWxlKCk7Ci0gIGNoZWNrTWV0YWxNaW5TdGVwUnVsZSgpOwotICBjaGVja01pbldpZHRoUnVsZSgpOwotICBjaGVja0N1dFNwYWNpbmdSdWxlcygpOwotfQotCi12b2lkIGZyOjpEUkNXb3JrZXI6OmNoZWNrTWV0YWxNaW5BcmVhUnVsZSgpIHsKLSAgZm9yIChhdXRvICZkcmNOZXQ6IGRyY05ldHMpIHsKLSAgICBjaGVja01ldGFsTWluQXJlYVJ1bGVfbmV0KGRyY05ldC5nZXQoKSk7Ci0gIH0KLX0KLQotdm9pZCBmcjo6RFJDV29ya2VyOjpjaGVja01ldGFsTWluQXJlYVJ1bGVfbmV0KERSQ05ldCogZHJjTmV0KSB7Ci0gIHN0ZDo6c2V0PGZyTGF5ZXJOdW0+IGxheWVyTnVtczsKLSAgYXV0byAmbGF5ZXIyRml4ZWRQb2x5U2V0ID0gZHJjTmV0LT5nZXRMYXllcjJGaXhlZFBvbHlTZXQoKTsKLSAgYXV0byAmbGF5ZXIyUm91dGVQb2x5U2V0ID0gZHJjTmV0LT5nZXRMYXllcjJSb3V0ZVBvbHlTZXQoKTsKLSAgLy8gc3RkOjptYXA8ZnJMYXllck51bSwgUG9seWdvblNldD4gbGF5ZXIyTWVyZ2VkUG9seVNldDsKLSAgZm9yIChhdXRvIGxheWVySXQgPSBsYXllcjJGaXhlZFBvbHlTZXQuYmVnaW4oKTsgbGF5ZXJJdCAhPSBsYXllcjJGaXhlZFBvbHlTZXQuZW5kKCk7ICsrbGF5ZXJJdCkgewotICAgIGxheWVyTnVtcy5pbnNlcnQobGF5ZXJJdC0+Zmlyc3QpOwotICB9Ci0gIGZvciAoYXV0byBsYXllckl0ID0gbGF5ZXIyUm91dGVQb2x5U2V0LmJlZ2luKCk7IGxheWVySXQgIT0gbGF5ZXIyUm91dGVQb2x5U2V0LmVuZCgpOyArK2xheWVySXQpIHsKLSAgICBsYXllck51bXMuaW5zZXJ0KGxheWVySXQtPmZpcnN0KTsKLSAgfQotICBmb3IgKGF1dG8gbGF5ZXJOdW06IGxheWVyTnVtcykgewotICAgIGF1dG8gbWluQXJlYUNvbnN0cmFpbnQgPSBkZXNpZ24tPmdldFRlY2goKS0+Z2V0TGF5ZXIobGF5ZXJOdW0pLT5nZXRBcmVhQ29uc3RyYWludCgpOwotICAgIGZyQ29vcmQgbGF5ZXJNaW5BcmVhID0gbWluQXJlYUNvbnN0cmFpbnQtPmdldE1pbkFyZWEoKTsKLSAgICBQb2x5Z29uU2V0IG1lcmdlZFBTOwotICAgIG1lcmdlZFBTICs9IGxheWVyMkZpeGVkUG9seVNldFtsYXllck51bV07Ci0gICAgbWVyZ2VkUFMgKz0gbGF5ZXIyUm91dGVQb2x5U2V0W2xheWVyTnVtXTsKLQotICAgIC8vIGNoZWNrIGlmIG1pbkFyZWEgaXMgdmlvbGF0ZWQKLQotICAgIGZvciAoYXV0byAmcG9seTogbWVyZ2VkUFMpIHsKLSAgICAgIGlmIChhcmVhKHBvbHkpIDwgbGF5ZXJNaW5BcmVhKSB7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPFJlY3RhbmdsZT4gbWF4UmVjdHM7Ci0gICAgICAgIFBvbHlnb25TZXQgdGVtcFBTOwotICAgICAgICB0ZW1wUFMgKz0gcG9seTsKLSAgICAgICAgYm9vbCBpc0NvdmVyZWRCeUZpeGVkID0gdHJ1ZTsKLSAgICAgICAgZ2V0X21heF9yZWN0YW5nbGVzKG1heFJlY3RzLCB0ZW1wUFMpOwotICAgICAgICBSZWN0YW5nbGUgbWluTWF4UmVjdDsKLSAgICAgICAgZnJDb29yZCBtaW5NYXhSZWN0QXJlYSA9IC0xOwotICAgICAgICBmb3IgKGF1dG8gJm1heFJlY3Q6IG1heFJlY3RzKSB7Ci0gICAgICAgICAgZnJDb29yZCB0ZW1wTWluTWF4UmVjdEFyZWEgPSBhcmVhKG1heFJlY3QpOwotICAgICAgICAgIGlmIChtaW5NYXhSZWN0QXJlYSA9PSAtMSB8fCB0ZW1wTWluTWF4UmVjdEFyZWEgPCBtaW5NYXhSZWN0QXJlYSkgewotICAgICAgICAgICAgbWluTWF4UmVjdEFyZWEgPSB0ZW1wTWluTWF4UmVjdEFyZWE7Ci0gICAgICAgICAgICBtaW5NYXhSZWN0ID0gbWF4UmVjdDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGlzQ292ZXJlZEJ5Rml4ZWQpIHsKLSAgICAgICAgICAgIGJveF90IG1heEJveChwb2ludF90KHhsKG1heFJlY3QpLCB5bChtYXhSZWN0KSksIHBvaW50X3QoeGgobWF4UmVjdCksIHloKG1heFJlY3QpKSk7Ci0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Ym94X3QsIGludD4gPiBmaXhlZFF1ZXJ5UmVzdWx0OwotICAgICAgICAgICAgbGF5ZXIyRml4ZWRSVHJlZVtsYXllck51bV0ucXVlcnkoYmdpOjppbnRlcnNlY3RzKG1heEJveCksIGJhY2tfaW5zZXJ0ZXIoZml4ZWRRdWVyeVJlc3VsdCkpOwotICAgICAgICAgICAgYm9vbCBpc01heFJlY3RDb3ZlcmVkQnlGaXhlZCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChhdXRvICZmaXhlZFBhaXI6IGZpeGVkUXVlcnlSZXN1bHQpIHsKLSAgICAgICAgICAgICAgYXV0byBmaXhlZFBhaXJOZXRJZCA9IGZpeGVkUGFpci5zZWNvbmQ7Ci0gICAgICAgICAgICAgIGF1dG8gJmZpeGVkQm94ID0gZml4ZWRQYWlyLmZpcnN0OwotICAgICAgICAgICAgICBpZiAoZml4ZWRQYWlyTmV0SWQgIT0gZHJjTmV0LT5nZXRJZCgpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKGJnOjpjb3ZlcmVkX2J5KG1heEJveCwgZml4ZWRCb3gpKSB7Ci0gICAgICAgICAgICAgICAgaXNNYXhSZWN0Q292ZXJlZEJ5Rml4ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWlzTWF4UmVjdENvdmVyZWRCeUZpeGVkKSB7Ci0gICAgICAgICAgICAgIGlzQ292ZXJlZEJ5Rml4ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgLy8gaWYgbm90IGNvdmVyZWQgYnkgZml4ZWQsIHRoZW4gaXQgaXMgYSB2aW9sYXRpb24KLSAgICAgICAgaWYgKCFpc0NvdmVyZWRCeUZpeGVkKSB7Ci0gICAgICAgICAgLy8gcHVzaCB0byB2aW9sYXRpb24KLSAgICAgICAgICBmck1hcmtlciBtaW5BcmVhTWFya2VyOwotICAgICAgICAgIGZyQm94IG1pbkFyZWFCQm94KHhsKG1pbk1heFJlY3QpLCB5bChtaW5NYXhSZWN0KSwgeGgobWluTWF4UmVjdCksIHloKG1pbk1heFJlY3QpKTsKLSAgICAgICAgICBtaW5BcmVhTWFya2VyLnNldENvbnN0cmFpbnQobWluQXJlYUNvbnN0cmFpbnQpOwotICAgICAgICAgIG1pbkFyZWFNYXJrZXIuc2V0QkJveChtaW5BcmVhQkJveCk7Ci0gICAgICAgICAgbWluQXJlYU1hcmtlci5zZXRMYXllck51bShsYXllck51bSk7Ci0gICAgICAgICAgbWluQXJlYU1hcmtlci5hZGRTcmMoZHJjTmV0LT5nZXRTcmMoKSk7Ci0KLSAgICAgICAgICBtYXJrZXJzLnB1c2hfYmFjayhtaW5BcmVhTWFya2VyKTsKLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotCi0KLX0KLQotdm9pZCBmcjo6RFJDV29ya2VyOjpjaGVja01ldGFsTWluU3RlcFJ1bGUoKSB7Ci0gIC8vIHN0ZDo6Y291dCA8PCAiY2hlY2tNZXRhbE1pblN0ZXBSdWxlXG4iOwotICBmb3IgKGF1dG8gJmRyY05ldDogZHJjTmV0cykgewotICAgIC8vIHN0ZDo6Y291dCA8PCAiICBjaGVjayAiIDw8IGRyY05ldC0+Z2V0SWQoKSA8PCAiXG4iOwotICAgIGlmICh0YXJnZXROZXRJZCAhPSAtMSAmJiBkcmNOZXQuZ2V0KCktPmdldElkKCkgIT0gdGFyZ2V0TmV0SWQpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBjaGVja01ldGFsTWluU3RlcFJ1bGVfbmV0KGRyY05ldC5nZXQoKSk7Ci0gIH0KLX0KLQotdm9pZCBmcjo6RFJDV29ya2VyOjpjaGVja01ldGFsTWluU3RlcFJ1bGVfbmV0KERSQ05ldCogZHJjTmV0KSB7Ci0gIGF1dG8gbGF5ZXIyU2VnMkVkZ2UgPSBkcmNOZXQtPmdldExheWVyU2VnRWRnZU1hcCgpOwotICBmb3IgKGF1dG8gbGF5ZXJJdCA9IGxheWVyMlNlZzJFZGdlLmJlZ2luKCk7IGxheWVySXQgIT0gbGF5ZXIyU2VnMkVkZ2UuZW5kKCk7ICsrbGF5ZXJJdCkgewotICAgIGZyTGF5ZXJOdW0gbGF5ZXJOdW0gPSBsYXllckl0LT5maXJzdDsKLSAgICAvLyBzdGQ6OmNvdXQgPDwgIiAgICBjaGVjayBsYXllciAiIDw8IGxheWVyTnVtIDw8ICJcbiI7IAotICAgIGF1dG8gJnNlZzJFZGdlID0gbGF5ZXJJdC0+c2Vjb25kOwotICAgIGF1dG8gY29uc3RyYWludCA9IGRlc2lnbi0+Z2V0VGVjaCgpLT5nZXRMYXllcihsYXllck51bSktPmdldE1pblN0ZXBDb25zdHJhaW50KCk7Ci0gICAgLy8gaWYgKCFjb25zdHJhaW50KSB7Ci0gICAgLy8gICBzdGQ6OmNvdXQgPDwgImxheWVyICIgPDwgbGF5ZXJOdW0gPDwgIiBkb2VzIG5vdCBoYXZlIG1pblN0ZXBcbiI7Ci0gICAgLy8gfQotICAgIGlmIChjb25zdHJhaW50KSB7Ci0gICAgICAvLyBzdGQ6OmNvdXQgPDwgImNoZWNrIG1pblN0ZXAiIDw8IGNvbnN0cmFpbnQtPmhhc0luc2lkZUNvcm5lcigpIDw8ICIgIiA8PCBjb25zdHJhaW50LT5oYXNPdXRzaWRlQ29ybmVyKCkKLSAgICAgIC8vICAgICAgICAgICA8PCAiICIgPDwgY29uc3RyYWludC0+aGFzU3RlcCgpIDw8ICJcbiI7Ci0gICAgICBmckNvb3JkIG1pblN0ZXBMZW5ndGggPSBjb25zdHJhaW50LT5nZXRNaW5TdGVwTGVuZ3RoKCk7Ci0gICAgICAvLyBzdGQ6OmNvdXQgPDwgIm1pblN0ZXBMZW5ndGggPSAiIDw8IG1pblN0ZXBMZW5ndGggPDwgIlxuIjsKLSAgICAgIC8vIC8vIHByZXZlbnQgY2hlY2sgc2FtZSBzZWdtZW50IGZvciBtdWx0aXBsZSB0aW1lcyBvciBub24tcG9seS1vdXRsaW5lIGVkZ2UgYmVpbmcgY2hlY2tlZAotICAgICAgLy8gc3RkOjptYXA8U2VnbWVudCwgYm9vbD4gaXNQb2x5U2VnVmlzaXRlZDsKLSAgICAgIC8vIGZvciAoYXV0byBzZWdJdCA9IHNlZzJFZGdlLmJlZ2luKCk7IHNlZ0l0ICE9IHNlZzJFZGdlLmVuZCgpOyArK3NlZ0l0KSB7Ci0gICAgICAvLyAgIGlmIChzZWdJdC0+c2Vjb25kLT5nZXRQcmV2RWRnZSgpID09IG51bGxwdHIgfHwgc2VnSXQtPnNlY29uZC0+Z2V0TmV4dEVkZ2UoKSA9PSBudWxscHRyKSB7Ci0gICAgICAvLyAgICAgaXNQb2x5U2VnVmlzaXRlZFtzZWdJdC0+Zmlyc3RdID0gdHJ1ZTsKLSAgICAgIC8vICAgfSBlbHNlIHsKLSAgICAgIC8vICAgICBpc1BvbHlTZWdWaXNpdGVkW3NlZ0l0LT5maXJzdF0gPSBmYWxzZTsKLSAgICAgIC8vICAgfQotICAgICAgLy8gfQotICAgICAgLy8gYmVnaW4gY2hlY2sKLSAgICAgIGZvciAoYXV0byBzZWdJdCA9IHNlZzJFZGdlLmJlZ2luKCk7IHNlZ0l0ICE9IHNlZzJFZGdlLmVuZCgpOyArK3NlZ0l0KSB7Ci0gICAgICAgIGlmIChzZWdJdC0+c2Vjb25kLT5nZXROZXh0RWRnZSgpID09IG51bGxwdHIgfHwgc2VnSXQtPnNlY29uZC0+Z2V0UHJldkVkZ2UoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gbWluU3RlcCBjaGVjayBzdGFydHMgd2l0aCBhbiBlZGdlIGxvbmdlciB0aGFuIG1pblN0ZXBMZW5ndGgKLSAgICAgICAgaWYgKGxlbmd0aChzZWdJdC0+Zmlyc3QpIDwgbWluU3RlcExlbmd0aCkgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIHN0ZDo6Y291dCA8PCAiaGVyZTBcbiI7Ci0gICAgICAgIC8vIHNraXAgaWYgbmV4dCBlZGdlIGlzIGFsc28gbG9uZ2VyIHRoYW4gbWluU3RlcExlbmd0aAotICAgICAgICBpZiAobGVuZ3RoKHNlZ0l0LT5zZWNvbmQtPmdldE5leHRFZGdlKCktPmdldFNlZ21lbnQoKSkgPj0gbWluU3RlcExlbmd0aCkgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIHN0ZDo6Y291dCA8PCAiaGVyZTFcbiI7Ci0gICAgICAgIC8vIHB1c2ggcG90ZW50aWFsIHZpb2xhdGluZyBlZGdlcyBpbnRvIGEgcXVldWUgYW5kIGZpbmQgbmV4dCBub24tdmlvbGF0aW5nIGVkZ2UKLSAgICAgICAgZnJWZWN0b3I8U2VnbWVudD4gc2VnczsKLSAgICAgICAgZnJWZWN0b3I8RFJDRWRnZSo+IGVkZ2VzOwotICAgICAgICBmckNvb3JkIHN1bUxlbmd0aCA9IDA7Ci0gICAgICAgIGF1dG8gZWRnZVB0ciA9IHNlZ0l0LT5zZWNvbmQ7Ci0gICAgICAgIC8vIHN0ZDo6Y291dCA8PCAiaGVyZTJcbiI7Ci0gICAgICAgIHdoaWxlIChsZW5ndGgoZWRnZVB0ci0+Z2V0TmV4dEVkZ2UoKS0+Z2V0U2VnbWVudCgpKSA8IG1pblN0ZXBMZW5ndGgpIHsKLSAgICAgICAgICBzZWdzLnB1c2hfYmFjayhlZGdlUHRyLT5nZXROZXh0RWRnZSgpLT5nZXRTZWdtZW50KCkpOwotICAgICAgICAgIGVkZ2VzLnB1c2hfYmFjayhlZGdlUHRyLT5nZXROZXh0RWRnZSgpKTsKLSAgICAgICAgICBzdW1MZW5ndGggKz0gbGVuZ3RoKGVkZ2VQdHItPmdldE5leHRFZGdlKCktPmdldFNlZ21lbnQoKSk7Ci0gICAgICAgICAgZWRnZVB0ciA9IGVkZ2VQdHItPmdldE5leHRFZGdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWRnZVB0ciA9IGVkZ2VQdHItPmdldE5leHRFZGdlKCk7Ci0gICAgICAgIC8vIGVkZ2VQdHIgcG9pbnRzIHRvIHRoZSBsYXN0IGVkZ2UKLSAgICAgICAgLy8gc2tpcCBpZiB0aGVyZSBpcyBvbmx5IG9uZSBlZGdlIGxvbmdlciB0aGFuIG1pblN0ZXBMZW5ndGgKLSAgICAgICAgaWYgKGVkZ2VQdHItPmdldE5leHRFZGdlKCkgPT0gc2VnSXQtPnNlY29uZCkgewotICAgICAgICAgIC8vIHN0ZDo6Y291dCA8PCAic2luZ2xlIGVkZ2Ugc2tpcFxuIjsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgImhlcmUzXG4iOwotICAgICAgICBib29sIGNoZWNrTWluU3RlcCA9IGZhbHNlOwotICAgICAgICBhdXRvIHN0YXJ0U2VnID0gc2VnSXQtPnNlY29uZC0+Z2V0U2VnbWVudCgpOwotICAgICAgICBhdXRvIGVuZFNlZyA9IGVkZ2VQdHItPmdldFNlZ21lbnQoKTsKLSAgICAgICAgaWYgKGNvbnN0cmFpbnQtPmhhc0luc2lkZUNvcm5lcigpIHx8IGNvbnN0cmFpbnQtPmhhc091dHNpZGVDb3JuZXIoKSkgewotICAgICAgICAgIC8vIHBhcmFsbGVsIGNvbnRpbnVlCi0gICAgICAgICAgaWYgKG9yaWVudGF0aW9uKHN0YXJ0U2VnLCBlbmRTZWcpID09IDApIHsKLSAgICAgICAgICAgIC8vIHN0ZDo6Y291dCA8PCAicGFyYWxsZWwgc2tpcFxuIjsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoY29uc3RyYWludC0+aGFzSW5zaWRlQ29ybmVyKCkpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClzZWdzLnNpemUoKSAtIDE7ICsraSkgewotICAgICAgICAgICAgICBpZiAob3JpZW50YXRpb24oc2Vnc1tpXSwgc2Vnc1tpKzFdKSA9PSAtMSAmJiBlZGdlc1tpXS0+Z2V0V2luZGluZygpID09IGJvb3N0Ojpwb2x5Z29uOjpISUdIKSB7Ci0gICAgICAgICAgICAgICAgY2hlY2tNaW5TdGVwID0gdHJ1ZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpc2Vncy5zaXplKCkgLSAxOyArK2kpIHsKLSAgICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uKHNlZ3NbaV0sIHNlZ3NbaSsxXSkgPT0gMSAmJiBlZGdlc1tpXS0+Z2V0V2luZGluZygpID09IGJvb3N0Ojpwb2x5Z29uOjpMT1cpIHsKLSAgICAgICAgICAgICAgICBjaGVja01pblN0ZXAgPSB0cnVlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChvcmllbnRhdGlvbihzZWdJdC0+Zmlyc3QsIGVkZ2VQdHItPmdldFNlZ21lbnQoKSkgIT0gMCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghY2hlY2tNaW5TdGVwKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gY2hlY2sgbWF4RWRnZXMKLSAgICAgICAgaWYgKGNvbnN0cmFpbnQtPmhhc01heEVkZ2VzKCkgJiYgKGludClzZWdzLnNpemUoKSA8PSBjb25zdHJhaW50LT5nZXRNYXhFZGdlcygpKSB7Ci0gICAgICAgICAgLy8gc3RkOjpjb3V0IDw8ICJtYXhFZGdlcyBza2lwXG4iOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNoZWNrIG1heExlbmd0aAotICAgICAgICBpZiAoY29uc3RyYWludC0+aGFzTWF4TGVuZ3RoKCkgJiYgY29uc3RyYWludC0+Z2V0TWF4TGVuZ3RoKCkgPj0gc3VtTGVuZ3RoKSB7Ci0gICAgICAgICAgLy8gc3RkOjpjb3V0IDw8ICJtYXhMZW5ndGggc2tpcFxuIjsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBwb3RlbnRpYWwgdmlvbGF0aW9uLCBhIHJlYWwgdmlvbGF0aW9uIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBub24tZml4ZWQgZWRnZQotICAgICAgICBib29sIGhhc05vbkZpeGVkID0gZmFsc2U7Ci0gICAgICAgIGZvciAoYXV0byBjdXJyRWRnZVB0ciA9IHNlZ0l0LT5zZWNvbmQ7IGN1cnJFZGdlUHRyLT5nZXRQcmV2RWRnZSgpICE9IGVkZ2VQdHI7IGN1cnJFZGdlUHRyID0gY3VyckVkZ2VQdHItPmdldE5leHRFZGdlKCkpIHsKLSAgICAgICAgICBpZiAoY3VyckVkZ2VQdHItPmdldFR5cGUoKSA9PSBkcmNFZGdlVHlwZUVudW06OlJPVVRFKSB7Ci0gICAgICAgICAgICBoYXNOb25GaXhlZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGhhc05vbkZpeGVkKSB7Ci0gICAgICAgICAgLy8gcHVzaCB2aW9sYXRpb24KLSAgICAgICAgICBmck1hcmtlciBtaW5TdGVwTWFya2VyOwotICAgICAgICAgIFBvaW50IGxvd1B0ID0gc3RkOjptaW4oaGlnaChzdGFydFNlZyksIGxvdyhlbmRTZWcpKTsKLSAgICAgICAgICBQb2ludCBoaWdoUHQgPSBzdGQ6Om1heChoaWdoKHN0YXJ0U2VnKSwgbG93KGVuZFNlZykpOwotICAgICAgICAgIGZyQm94IG1pblN0ZXBCQm94KHgobG93UHQpLCB5KGxvd1B0KSwgeChoaWdoUHQpLCB5KGhpZ2hQdCkpOwotICAgICAgICAgIG1pblN0ZXBNYXJrZXIuc2V0Q29uc3RyYWludChjb25zdHJhaW50KTsKLSAgICAgICAgICBtaW5TdGVwTWFya2VyLnNldEJCb3gobWluU3RlcEJCb3gpOwotICAgICAgICAgIG1pblN0ZXBNYXJrZXIuc2V0TGF5ZXJOdW0obGF5ZXJOdW0pOwotICAgICAgICAgIG1pblN0ZXBNYXJrZXIuYWRkU3JjKGRyY05ldC0+Z2V0U3JjKCkpOwotCi0gICAgICAgICAgbWFya2Vycy5wdXNoX2JhY2sobWluU3RlcE1hcmtlcik7Ci0gICAgICAgICAgLy8gc3RkOjpjb3V0IDw8ICJzdGFydCBzZWc6ICgiIDw8IHgobG93KHN0YXJ0U2VnKSkgLyAyMDAwLjAgPDwgIiwgIiA8PCB5KGxvdyhzdGFydFNlZykpIC8gMjAwMC4wIDw8ICIpIC0tICgiCi0gICAgICAgICAgLy8gICAgICAgICAgIDw8IHgoaGlnaChzdGFydFNlZykpIC8gMjAwMC4wIDw8ICIsICIgPDwgeShoaWdoKHN0YXJ0U2VnKSkgLyAyMDAwLjAgCi0gICAgICAgICAgLy8gICAgICAgICAgIDw8ICIsIGVuZCBzZWcgKCIgPDwgeChsb3coZW5kU2VnKSkgLyAyMDAwLjAgPDwgIiwgIiA8PCB5KGxvdyhlbmRTZWcpKSAvIDIwMDAuMCA8PCAiKSAtLSAoIgotICAgICAgICAgIC8vICAgICAgICAgICA8PCB4KGhpZ2goZW5kU2VnKSkgLyAyMDAwLjAgPDwgIiwgIiA8PCB5KGhpZ2goZW5kU2VnKSkgLyAyMDAwLjAgPDwgIilcbiI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLy8gc3RkOjpjb3V0IDw8ICJmaXhlZCBlcnJvciwgc2tpcHBlZFxuIjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0KLXZvaWQgZnI6OkRSQ1dvcmtlcjo6Y2hlY2tNaW5XaWR0aFJ1bGUoKSB7Ci0gIGZvciAoYXV0byAmZHJjTmV0OiBkcmNOZXRzKSB7Ci0gICAgaWYgKHRhcmdldE5ldElkICE9IC0xICYmIHRhcmdldE5ldElkICE9IGRyY05ldC5nZXQoKS0+Z2V0SWQoKSkgewotICAgICAgY29udGludWU7Ci0gICAgfSAKLSAgICBjaGVja01pbldpZHRoUnVsZV9uZXQoZHJjTmV0LmdldCgpKTsKLSAgfQotfQotCi0vLyB0aGlzIGFzc3VtZXMgbWluV2lkdGggdmlvbGF0aW9uIG9ubHkgaGFwcGVucyB0byBvdmVybGFwIGJldHdlZW4KLXZvaWQgZnI6OkRSQ1dvcmtlcjo6Y2hlY2tNaW5XaWR0aFJ1bGVfbmV0KERSQ05ldCogZHJjTmV0KSB7Ci0gIHN0ZDo6c2V0PGZyTGF5ZXJOdW0+IGZpeGVkTGF5ZXJzLCByb3V0ZUxheWVyczsKLSAgc3RkOjp2ZWN0b3I8ZnJMYXllck51bT4gY29tbW9uTGF5ZXJzOwotICBhdXRvICZsYXllcjJGaXhlZFBvbHlTZXQgPSBkcmNOZXQtPmdldExheWVyMkZpeGVkUG9seVNldCgpOwotICBhdXRvICZsYXllcjJSb3V0ZVBvbHlTZXQgPSBkcmNOZXQtPmdldExheWVyMlJvdXRlUG9seVNldCgpOwotICBmb3IgKGF1dG8gbGF5ZXJJdCA9IGxheWVyMkZpeGVkUG9seVNldC5iZWdpbigpOyBsYXllckl0ICE9IGxheWVyMkZpeGVkUG9seVNldC5lbmQoKTsgKytsYXllckl0KSB7Ci0gICAgZml4ZWRMYXllcnMuaW5zZXJ0KGxheWVySXQtPmZpcnN0KTsKLSAgfQotICBmb3IgKGF1dG8gbGF5ZXJJdCA9IGxheWVyMlJvdXRlUG9seVNldC5iZWdpbigpOyBsYXllckl0ICE9IGxheWVyMlJvdXRlUG9seVNldC5lbmQoKTsgKytsYXllckl0KSB7Ci0gICAgcm91dGVMYXllcnMuaW5zZXJ0KGxheWVySXQtPmZpcnN0KTsKLSAgfQotICBzdGQ6OnNldF9pbnRlcnNlY3Rpb24oZml4ZWRMYXllcnMuYmVnaW4oKSwgZml4ZWRMYXllcnMuZW5kKCksIHJvdXRlTGF5ZXJzLmJlZ2luKCksIHJvdXRlTGF5ZXJzLmVuZCgpLCBzdGQ6OmJhY2tfaW5zZXJ0ZXIoY29tbW9uTGF5ZXJzKSk7Ci0gIGZvciAoYXV0byAmbGF5ZXJOdW06IGNvbW1vbkxheWVycykgewotICAgIGZyQ29vcmQgbWluV2lkdGggPSBkZXNpZ24tPmdldFRlY2goKS0+Z2V0TGF5ZXIobGF5ZXJOdW0pLT5nZXRNaW5XaWR0aCgpOwotICAgIGF1dG8gbWluV2lkdGhDb25zdHJhaW50ID0gZGVzaWduLT5nZXRUZWNoKCktPmdldExheWVyKGxheWVyTnVtKS0+Z2V0TWluV2lkdGhDb25zdHJhaW50KCk7Ci0gICAgLy8gUG9seWdvblNldCBvdmxwUFM7Ci0gICAgYXV0byAmZml4ZWRQb2x5U2V0ID0gbGF5ZXIyRml4ZWRQb2x5U2V0W2xheWVyTnVtXTsKLSAgICBhdXRvICZyb3V0ZVBvbHlTZXQgPSBsYXllcjJSb3V0ZVBvbHlTZXRbbGF5ZXJOdW1dOwotICAgIGF1dG8gb3ZscFBTID0gZml4ZWRQb2x5U2V0ICYgcm91dGVQb2x5U2V0OwotICAgIHN0ZDo6dmVjdG9yPFJlY3RhbmdsZT4gbWF4UmVjdHM7Ci0gICAgZ2V0X21heF9yZWN0YW5nbGVzKG1heFJlY3RzLCBvdmxwUFMpOwotICAgIGZvciAoYXV0byAmcmVjdDogbWF4UmVjdHMpIHsKLSAgICAgIGF1dG8gYWN0V2lkdGggPSByZWN0RGlhZ0xlbmd0aChyZWN0KTsKLSAgICAgIGlmIChhY3RXaWR0aCA8IG1pbldpZHRoKSB7Ci0gICAgICAgIGZyTWFya2VyIG1pbldpZHRoTWFya2VyOwotICAgICAgICBmckJveCBtaW5XaWR0aFZpb0JveCh4bChyZWN0KSwgeWwocmVjdCksIHhoKHJlY3QpLCB5aChyZWN0KSk7Ci0gICAgICAgIG1pbldpZHRoTWFya2VyLnNldENvbnN0cmFpbnQobWluV2lkdGhDb25zdHJhaW50KTsKLSAgICAgICAgbWluV2lkdGhNYXJrZXIuc2V0QkJveChtaW5XaWR0aFZpb0JveCk7Ci0gICAgICAgIG1pbldpZHRoTWFya2VyLmFkZFNyYyhkcmNOZXQtPmdldFNyYygpKTsKLSAgICAgICAgbWFya2Vycy5wdXNoX2JhY2sobWluV2lkdGhNYXJrZXIpOwotICAgICAgfQotICAgIH0KLQotICB9Ci19Ci0KLXZvaWQgZnI6OkRSQ1dvcmtlcjo6Y2hlY2tNZXRhbFNob3J0KCkgewotICAvLyBkb3VibGUgZGJ1ID0gZGVzaWduLT5nZXRUZWNoKCktPmdldERCVVBlclVVKCk7Ci0gIGZvciAoYXV0byBsYXllckl0ID0gbGF5ZXIyTWVyZ2VkUlRyZWUuYmVnaW4oKTsgbGF5ZXJJdCAhPSBsYXllcjJNZXJnZWRSVHJlZS5lbmQoKTsgKytsYXllckl0KSB7Ci0gICAgZnJMYXllck51bSBsYXllck51bSA9IGxheWVySXQtPmZpcnN0OwotICAgIGlmIChkZXNpZ24tPmdldFRlY2goKS0+Z2V0TGF5ZXIobGF5ZXJOdW0pLT5nZXRUeXBlKCkgIT0gZnJMYXllclR5cGVFbnVtOjpST1VUSU5HKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBmclNob3J0Q29uc3RyYWludCogc2hvcnRDb25zdHJhaW50ID0gZGVzaWduLT5nZXRUZWNoKCktPmdldExheWVyKGxheWVyTnVtKS0+Z2V0U2hvcnRDb25zdHJhaW50KCk7Ci0KLSAgICBpZiAoc2hvcnRDb25zdHJhaW50ID09IG51bGxwdHIpIHsKLSAgICAgIHN0ZDo6Y291dCA8PCAiRXJyb3I6IHNob3J0IGNvbnN0cmFpbnQgaXMgbm90IGRlZmluZWQgb24gbGF5ZXIgIiA8PCBsYXllck51bSA8PCAiXG4iOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIC8vIHN0ZDo6Y291dCA8PCAiY2hlY2sgc2hvcnQgb24gbGF5ZXIiIDw8IGxheWVyTnVtIDw8IlxuIjsKLSAgICBhdXRvICZtZXJnZWRSVHJlZSA9IGxheWVySXQtPnNlY29uZDsKLSAgICBmb3IgKGF1dG8gaXQgPSBtZXJnZWRSVHJlZS5iZWdpbigpOyBpdCAhPSBtZXJnZWRSVHJlZS5lbmQoKTsgKytpdCkgewotICAgICAgYm94X3Qgb2JqQm94ID0gaXQtPmZpcnN0OwotICAgICAgaW50IG9iak5ldElkID0gaXQtPnNlY29uZDsKLSAgICAgIGlmICh0YXJnZXROZXRJZCAhPSAtMSAmJiB0YXJnZXROZXRJZCAhPSBvYmpOZXRJZCkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIC8vIHN0ZDo6Y291dCA8PCAiY2hlY2sgbWF4UmVjdCAoIiA8PCBvYmpCb3gubWluX2Nvcm5lcigpLmdldDwwPigpIC8gZGJ1IDw8ICIsICIgPDwgb2JqQm94Lm1pbl9jb3JuZXIoKS5nZXQ8MT4oKSAvIGRidSAKLSAgICAgIC8vICAgICAgICAgICA8PCAiKSAtLSAoIiA8PCBvYmpCb3gubWF4X2Nvcm5lcigpLmdldDwwPigpIC8gZGJ1IDw8ICIsICIgPDwgb2JqQm94Lm1heF9jb3JuZXIoKS5nZXQ8MT4oKSAvIGRidSA8PCAiKSBuZXQgIiA8PCBvYmpOZXRJZCA8PCAiXG4iOwotICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGJveF90LCBpbnQ+ID4gcXVlcnlSZXN1bHQ7Ci0gICAgICBtZXJnZWRSVHJlZS5xdWVyeShiZ2k6OmludGVyc2VjdHMob2JqQm94KSwgYmFja19pbnNlcnRlcihxdWVyeVJlc3VsdCkpOwotICAgICAgZm9yIChhdXRvICZzaG9ydFBhaXI6IHF1ZXJ5UmVzdWx0KSB7Ci0gICAgICAgIC8vIHNraXAgc2FtZSBuZXQKLSAgICAgICAgaWYgKHNob3J0UGFpci5zZWNvbmQgPT0gb2JqTmV0SWQpIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgIiAgYWdhaW5zdCBkaWZmbmV0IG1heFJlY3QiIDw8IHNob3J0UGFpci5maXJzdC5taW5fY29ybmVyKCkuZ2V0PDA+KCkgLyBkYnUgPDwgIiwgIiA8PCBzaG9ydFBhaXIuZmlyc3QubWluX2Nvcm5lcigpLmdldDwxPigpIC8gZGJ1IAotICAgICAgICAvLyAgICAgICAgIDw8ICIpIC0tICgiIDw8IHNob3J0UGFpci5maXJzdC5tYXhfY29ybmVyKCkuZ2V0PDA+KCkgLyBkYnUgPDwgIiwgIiA8PCBzaG9ydFBhaXIuZmlyc3QubWF4X2Nvcm5lcigpLmdldDwxPigpIC8gZGJ1IDw8ICIpIG5ldCAiIDw8IHNob3J0UGFpci5zZWNvbmQgPDwgIlxuIjsKLSAgICAgICAgaW50IHNob3J0TmV0SWQgPSBzaG9ydFBhaXIuc2Vjb25kOwotICAgICAgICAvLyBqdXN0IHRvIHJlbW92ZSBjb21waWxlIHdhcm5pbmcKLSAgICAgICAgYm94X3Qgc2hvcnRBcmVhID0gYm94X3QoKTsKLSAgICAgICAgYmc6OmludGVyc2VjdGlvbihvYmpCb3gsIHNob3J0UGFpci5maXJzdCwgc2hvcnRBcmVhKTsKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGJveF90LCBpbnQ+ID4gZml4ZWRRdWVyeVJlc3VsdDsKLSAgICAgICAgbGF5ZXIyRml4ZWRSVHJlZVtsYXllck51bV0ucXVlcnkoYmdpOjppbnRlcnNlY3RzKHNob3J0QXJlYSksIGJhY2tfaW5zZXJ0ZXIoZml4ZWRRdWVyeVJlc3VsdCkpOwotICAgICAgICBib29sIGluRml4ZWRPYmoxID0gZmFsc2UsIGluRml4ZWRPYmoyID0gZmFsc2U7Ci0gICAgICAgIGZvciAoYXV0byAmZml4ZWRQYWlyOiBmaXhlZFF1ZXJ5UmVzdWx0KSB7Ci0gICAgICAgICAgYXV0byBmaXhlZFBhaXJOZXRJZCA9IGZpeGVkUGFpci5zZWNvbmQ7Ci0gICAgICAgICAgaWYgKCFpbkZpeGVkT2JqMSAmJiBmaXhlZFBhaXJOZXRJZCA9PSBvYmpOZXRJZCAmJiBiZzo6Y292ZXJlZF9ieShzaG9ydEFyZWEsIGZpeGVkUGFpci5maXJzdCkpIHsKLSAgICAgICAgICAgIGluRml4ZWRPYmoxID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKCFpbkZpeGVkT2JqMiAmJiBmaXhlZFBhaXJOZXRJZCA9PSBzaG9ydE5ldElkICYmIGJnOjpjb3ZlcmVkX2J5KHNob3J0QXJlYSwgZml4ZWRQYWlyLmZpcnN0KSkgewotICAgICAgICAgICAgaW5GaXhlZE9iajIgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoaW5GaXhlZE9iajEgJiYgaW5GaXhlZE9iajIpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIShpbkZpeGVkT2JqMSAmJiBpbkZpeGVkT2JqMikpIHsKLSAgICAgICAgICAvLyBwdXNoIHRvIHZpb2xhdGlvbgotICAgICAgICAgIGZyTWFya2VyIHNob3J0TWFya2VyOwotICAgICAgICAgIGZyQm94IHNob3J0QkJveChzaG9ydEFyZWEubWluX2Nvcm5lcigpLmdldDwwPigpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRBcmVhLm1pbl9jb3JuZXIoKS5nZXQ8MT4oKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0QXJlYS5tYXhfY29ybmVyKCkuZ2V0PDA+KCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydEFyZWEubWF4X2Nvcm5lcigpLmdldDwxPigpKTsKLSAgICAgICAgICBzaG9ydE1hcmtlci5zZXRDb25zdHJhaW50KHNob3J0Q29uc3RyYWludCk7Ci0gICAgICAgICAgc2hvcnRNYXJrZXIuc2V0QkJveChzaG9ydEJCb3gpOwotICAgICAgICAgIHNob3J0TWFya2VyLnNldExheWVyTnVtKGxheWVyTnVtKTsKLSAgICAgICAgICAvLyBzaG9ydE1hcmtlci5hZGROZXQoZHJjTmV0c1tvYmpOZXRJZF0tPmdldE5ldCgpKTsKLSAgICAgICAgICAvLyBzaG9ydE1hcmtlci5hZGROZXQoZHJjTmV0c1tzaG9ydE5ldElkXS0+Z2V0TmV0KCkpOwotICAgICAgICAgIHNob3J0TWFya2VyLmFkZFNyYyhkcmNOZXRzW29iak5ldElkXS0+Z2V0U3JjKCkpOwotICAgICAgICAgIHNob3J0TWFya2VyLmFkZFNyYyhkcmNOZXRzW3Nob3J0TmV0SWRdLT5nZXRTcmMoKSk7Ci0KLSAgICAgICAgICBtYXJrZXJzLnB1c2hfYmFjayhzaG9ydE1hcmtlcik7Ci0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgInNob3J0QXJlYSBjb21wbGV0ZWx5IGluIGZpeGVkIHNoYXBlXG4iOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBlbmQgZm9yIHNob3J0UGFpcgotICAgIH0KLSAgICAvLyBlbmQgZm9yIG1lcmdlZFJUcmVlIGVsZW1lbnQKLSAgfQotfQotCi0KLXZvaWQgZnI6OkRSQ1dvcmtlcjo6Y2hlY2tDdXRTcGFjaW5nUnVsZXMoKSB7Ci0gIGZvciAoYXV0byBsYXllckl0ID0gbGF5ZXIyRWRnZVJUcmVlLmJlZ2luKCk7IGxheWVySXQgIT0gbGF5ZXIyRWRnZVJUcmVlLmVuZCgpOyArK2xheWVySXQpIHsKLSAgICBmckxheWVyTnVtIGxheWVyTnVtID0gbGF5ZXJJdC0+Zmlyc3Q7Ci0gICAgYXV0byBjdXJyTGF5ZXIgPSBkZXNpZ24tPmdldFRlY2goKS0+Z2V0TGF5ZXIobGF5ZXJOdW0pOwotICAgIGlmIChjdXJyTGF5ZXItPmdldFR5cGUoKSAhPSBmckxheWVyVHlwZUVudW06OkNVVCkgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIC8vIGNvbnZlbnRpb25hbCBjdXQgc3BhY2luZyBydWxlCi0gICAgaWYgKGN1cnJMYXllci0+aGFzQ3V0U3BhY2luZygpKSB7Ci0gICAgICBmb3IgKGF1dG8gY29uc3RyYWludDogY3VyckxheWVyLT5nZXRDdXRDb25zdHJhaW50KCkpIHsKLSAgICAgICAgaWYgKGNvbnN0cmFpbnQtPmdldENlbnRlclRvQ2VudGVyKCkpIHsKLSAgICAgICAgICBzdGQ6OmNvdXQgPDwgIldhcm5pbmc6IGNlbnRlci10by1jZW50ZXIgdG8gYmUgaW1wbGVtZW50ZWRcbiI7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBjaGVja0N1dFNwYWNpbmdSdWxlKGxheWVyMkVkZ2VSVHJlZVtsYXllck51bV0sIGNvbnN0cmFpbnQpOwotCi0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBmcjo6RFJDV29ya2VyOjpjaGVja0N1dFNwYWNpbmdSdWxlKGNvbnN0IGJnaTo6cnRyZWU8c3RkOjpwYWlyPHNlZ21lbnRfdCwgRFJDRWRnZSo+LCBiZ2k6OnF1YWRyYXRpYzwxNj4gPiAmZWRnZVJUcmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyQ3V0U3BhY2luZ0NvbnN0cmFpbnQqIGNvbnN0cmFpbnQpIHsKLSAgLy8gZG91YmxlIGRidSA9IGRlc2lnbi0+Z2V0VGVjaCgpLT5nZXREQlVQZXJVVSgpOwotICBmckNvb3JkIHNwYWNpbmdWYWwgPSBjb25zdHJhaW50LT5nZXRDdXRTcGFjaW5nKCk7Ci0gIGZvciAoYXV0byBzZWdFZGdlSXQgPSBlZGdlUlRyZWUuYmVnaW4oKTsgc2VnRWRnZUl0ICE9IGVkZ2VSVHJlZS5lbmQoKTsgKytzZWdFZGdlSXQpIHsKLSAgICBhdXRvICZzZWcgPSBzZWdFZGdlSXQtPmZpcnN0OwotICAgIFJlY3RhbmdsZSBzZWdTcGFuUmVjdDsKLSAgICBhdXRvICZlZGdlID0gc2VnRWRnZUl0LT5zZWNvbmQ7Ci0gICAgYXV0byBlZGdlRGlyID0gZWRnZS0+Z2V0RGlyKCk7Ci0gICAgYm94X3QgdGVzdEJveDsKLSAgICBnZXRTcGFjaW5nVGFibGVUZXN0Qm94KHNlZywgZWRnZSwgc3BhY2luZ1ZhbCwgdGVzdEJveCk7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHNlZ21lbnRfdCwgRFJDRWRnZSo+ID4gZWRnZVF1ZXJ5UmVzdWx0OwotICAgIGdldEVkZ2VTcGFuUmVjdChzZWcsIGVkZ2VEaXIsIGVkZ2UtPmdldFNwYW4oKSwgc2VnU3BhblJlY3QpOwotICAgIGlmIChlZGdlLT5nZXRQcmV2RWRnZSgpID09IG51bGxwdHIgfHwgZWRnZS0+Z2V0TmV4dEVkZ2UoKSA9PSBudWxscHRyKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgLy8gc2tpcCBpZiB0cmlnZ2VyaW5nIGNvbmRpdGlvbiBpcyBub3QgbWV0Ci0gICAgLy8gYWRqYWNlbnQgY3V0cwotICAgIGlmIChjb25zdHJhaW50LT5nZXRBZGphY2VudEN1dHMoKSAhPSAtMSkgewotICAgICAgaW50IGFkakN1dENudCA9IC0xOwotICAgICAgZnJDb29yZCBjdXRXaXRoaW4gPSBjb25zdHJhaW50LT5nZXRDdXRXaXRoaW4oKTsKLSAgICAgIFJlY3RhbmdsZSBhZGpDdXRRdWVyeVJlY3QgPSBzZWdTcGFuUmVjdDsKLSAgICAgIGFkakN1dFF1ZXJ5UmVjdCA9IGJsb2F0KGFkakN1dFF1ZXJ5UmVjdCwgY3V0V2l0aGluKTsKLSAgICAgIGJveF90IGFkakN1dFF1ZXJ5Qm94ID0gYm94X3QocG9pbnRfdCh4bChhZGpDdXRRdWVyeVJlY3QpLCB5bChhZGpDdXRRdWVyeVJlY3QpKSwgcG9pbnRfdCh4aChhZGpDdXRRdWVyeVJlY3QpLCB5aChhZGpDdXRRdWVyeVJlY3QpKSk7Ci0gICAgICBib3hfdCBhZGpDdXRCb3ggPSBib3hfdChwb2ludF90KHhsKHNlZ1NwYW5SZWN0KSwgeWwoc2VnU3BhblJlY3QpKSwgcG9pbnRfdCh4aChzZWdTcGFuUmVjdCksIHloKHNlZ1NwYW5SZWN0KSkpOwotICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGJveF90LCBpbnQ+ID4gYWRqQ3V0UXVlcnlSZXN1bHQ7Ci0gICAgICBsYXllcjJNZXJnZWRSVHJlZVtlZGdlLT5nZXRMYXllck51bSgpXS5xdWVyeShiZ2k6OmludGVyc2VjdHMoYWRqQ3V0UXVlcnlCb3gpLCBiYWNrX2luc2VydGVyKGFkakN1dFF1ZXJ5UmVzdWx0KSk7Ci0KLSAgICAgIGZvciAoYXV0byAmYWRqQ3V0Qm94UGFpcjogYWRqQ3V0UXVlcnlSZXN1bHQpIHsKLSAgICAgICAgYXV0byBib3hEaXN0ID0gZnJCb3gyQm94RGlzdChhZGpDdXRCb3hQYWlyLmZpcnN0LCBhZGpDdXRCb3gpOwotICAgICAgICBpZiAoYm94RGlzdCA8IGN1dFdpdGhpbikgewotICAgICAgICAgICsrYWRqQ3V0Q250OwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChhZGpDdXRDbnQgPCBjb25zdHJhaW50LT5nZXRBZGphY2VudEN1dHMoKSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gc2Vjb25kIGxheWVyCi0gICAgaWYgKGNvbnN0cmFpbnQtPmdldFNlY29uZExheWVyTmFtZSgpLmVtcHR5KCkpIHsKLSAgICAgIGVkZ2VSVHJlZS5xdWVyeShiZ2k6OmludGVyc2VjdHModGVzdEJveCksIGJhY2tfaW5zZXJ0ZXIoZWRnZVF1ZXJ5UmVzdWx0KSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGF1dG8gc2Vjb25kTGF5ZXIgPSBkZXNpZ24tPmdldFRlY2goKS0+Z2V0TGF5ZXIoY29uc3RyYWludC0+Z2V0U2Vjb25kTGF5ZXJOYW1lKCkpOwotICAgICAgaWYgKHNlY29uZExheWVyID09IG51bGxwdHIpIHsKLSAgICAgICAgc3RkOjpjb3V0IDw8ICJFcnJvcjogc2Vjb25kIGxheWVyIG5vdCBmb3VuZFxuIjsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgbGF5ZXIyRWRnZVJUcmVlW3NlY29uZExheWVyLT5nZXRMYXllck51bSgpXS5xdWVyeShiZ2k6OmludGVyc2VjdHModGVzdEJveCksIGJhY2tfaW5zZXJ0ZXIoZWRnZVF1ZXJ5UmVzdWx0KSk7Ci0gICAgfSAgICAKLSAgICAvLyBnZXQgcG90ZW50aWFsIHZpb2xhdGlvbgotICAgIGZvciAoYXV0byAmcXVlcnlTZWdFZGdlOiBlZGdlUXVlcnlSZXN1bHQpIHsKLSAgICAgIGF1dG8gJnF1ZXJ5U2VnID0gcXVlcnlTZWdFZGdlLmZpcnN0OwotICAgICAgYXV0byAmcXVlcnlFZGdlID0gcXVlcnlTZWdFZGdlLnNlY29uZDsKLSAgICAgIGludCBuZXRJZDEgPSBlZGdlLT5nZXROZXRJZCgpOwotICAgICAgaW50IG5ldElkMiA9IHF1ZXJ5RWRnZS0+Z2V0TmV0SWQoKTsKLSAgICAgIGlmICh0YXJnZXROZXRJZCAhPSAtMSAmJiBuZXRJZDEgIT0gdGFyZ2V0TmV0SWQgJiYgbmV0SWQyICE9IHRhcmdldE5ldElkKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgLy8gb25seSBjaGVjayBwb2x5Z29uIGVkZ2UKLSAgICAgIGlmIChxdWVyeUVkZ2UtPmdldFByZXZFZGdlKCkgPT0gbnVsbHB0ciB8fCBxdWVyeUVkZ2UtPmdldE5leHRFZGdlKCkgPT0gbnVsbHB0cikgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIC8vIG9ubHkgb3Bwb3NpdGUtZGlyIGVkZ2VzIGFyZSBjb3VudGVkIGFzIHNwYWNpbmcgdmlvbGF0aW9uCi0gICAgICBpZiAoIWlzT3Bwb3NpdGVEaXIoZWRnZURpciwgcXVlcnlFZGdlLT5nZXREaXIoKSkpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBSZWN0YW5nbGUgcXVlcnlFZGdlU3BhblJlY3Q7Ci0gICAgICBnZXRFZGdlU3BhblJlY3QocXVlcnlTZWcsIHF1ZXJ5RWRnZS0+Z2V0RGlyKCksIHF1ZXJ5RWRnZS0+Z2V0U3BhbigpLCBxdWVyeUVkZ2VTcGFuUmVjdCk7Ci0gICAgICBib29sIGlzSG9yaXpvbnRhbCA9IChlZGdlRGlyID09IGZyRGlyRW51bTo6TiB8fCBlZGdlRGlyID09IGZyRGlyRW51bTo6Uyk7Ci0gICAgICBmckNvb3JkIHBybCA9IC0xOwotICAgICAgZnJDb29yZCBhY3RTcGFjaW5nOwotICAgICAgSW50ZXJ2YWwgc2VnSW50diwgcXVlcnlTZWdJbnR2OwotICAgICAgLy8gUmVjdGFuZ2xlIHRtcFNlZ1NwYW5SZWN0ID0gc2VnU3BhblJlY3Q7Ci0gICAgICBSZWN0YW5nbGUgdG1wUXVlcnlFZGdlU3BhblJlY3QgPSBxdWVyeUVkZ2VTcGFuUmVjdDsKLSAgICAgIFJlY3RhbmdsZSBnYXBSZWN0ID0gZ2VuZXJhbGl6ZWRfaW50ZXJzZWN0KHRtcFF1ZXJ5RWRnZVNwYW5SZWN0LCBzZWdTcGFuUmVjdCk7Ci0gICAgICBpZiAoaXNIb3Jpem9udGFsKSB7Ci0gICAgICAgIHNlZ0ludHYgPSBob3Jpem9udGFsKHNlZ1NwYW5SZWN0KTsKLSAgICAgICAgcXVlcnlTZWdJbnR2ID0gaG9yaXpvbnRhbChxdWVyeUVkZ2VTcGFuUmVjdCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzZWdJbnR2ID0gdmVydGljYWwoc2VnU3BhblJlY3QpOwotICAgICAgICBxdWVyeVNlZ0ludHYgPSB2ZXJ0aWNhbChxdWVyeUVkZ2VTcGFuUmVjdCk7Ci0gICAgICB9Ci0gICAgICAvLyBzdGQ6OmNvdXQgPDwgIiAgIHNlZ0ludHY6ICIgPDwgbG93KHNlZ0ludHYpIDw8ICIgLS0gIiA8PCBoaWdoKHNlZ0ludHYpIDw8ICJcbiI7Ci0gICAgICAvLyBzdGQ6OmNvdXQgPDwgIiAgIHF1ZXJ5U2VnSW50djogIiA8PCBsb3cocXVlcnlTZWdJbnR2KSA8PCAiIC0tICIgPDwgaGlnaChxdWVyeVNlZ0ludHYpIDw8ICJcbiI7Ci0gICAgICBpZiAoaW50ZXJzZWN0cyhzZWdJbnR2LCBxdWVyeVNlZ0ludHYpKSB7Ci0gICAgICAgIHBybCA9IGRlbHRhKGdlbmVyYWxpemVkX2ludGVyc2VjdChxdWVyeVNlZ0ludHYsIHNlZ0ludHYpKTsKLSAgICAgICAgaWYgKGlzSG9yaXpvbnRhbCkgewotICAgICAgICAgIGFjdFNwYWNpbmcgPSAoeWgoZ2FwUmVjdCkgLSB5bChnYXBSZWN0KSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgYWN0U3BhY2luZyA9ICh4aChnYXBSZWN0KSAtIHhsKGdhcFJlY3QpKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHJsID0gLWRlbHRhKGdlbmVyYWxpemVkX2ludGVyc2VjdChxdWVyeVNlZ0ludHYsIHNlZ0ludHYpKTsKLSAgICAgICAgYWN0U3BhY2luZyA9IHJlY3REaWFnTGVuZ3RoKGdhcFJlY3QpOwotICAgICAgfQotICAgICAgLy8gc2tpcCBpZiBQQVJBTExFTE9WRVJMQVAgc3BlY2lmaWVkIGJ1dCBub3QgbWV0Ci0gICAgICBpZiAoY29uc3RyYWludC0+Z2V0UGFyYWxsZWxPdmVybGFwKCkpIHsKLSAgICAgICAgLy8gbmVnYXRpdmUgLyB6ZXJvIHBybCBkb2VzIG5vdCB0cmlnZ2VyCi0gICAgICAgIGlmIChwcmwgPD0gMCkgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIGVuY2xvc3VyZQotICAgICAgICBmckNvb3JkIGJib3hMbHgsIGJib3hMbHksIGJib3hVcngsIGJib3hVcnk7Ci0gICAgICAgIGJib3hMbHggPSBzdGQ6Om1pbih4bChzZWdTcGFuUmVjdCksIHhsKHF1ZXJ5RWRnZVNwYW5SZWN0KSk7Ci0gICAgICAgIGJib3hMbHkgPSBzdGQ6Om1pbih5bChzZWdTcGFuUmVjdCksIHlsKHF1ZXJ5RWRnZVNwYW5SZWN0KSk7Ci0gICAgICAgIGJib3hVcnggPSBzdGQ6Om1heCh4aChzZWdTcGFuUmVjdCksIHhoKHF1ZXJ5RWRnZVNwYW5SZWN0KSk7Ci0gICAgICAgIGJib3hVcnkgPSBzdGQ6Om1heCh5aChzZWdTcGFuUmVjdCksIHloKHF1ZXJ5RWRnZVNwYW5SZWN0KSk7Ci0gICAgICAgIGJveF90IGN1dEJib3hRdWVyeUJveChwb2ludF90KGJib3hMbHgsIGJib3hMbHkpLCBwb2ludF90KGJib3hVcngsIGJib3hVcnkpKTsKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGJveF90LCBpbnQ+ID4gYWRqQ3V0UXVlcnlSZXN1bHRMb3dlciwgYWRqQ3V0UXVlcnlSZXN1bHRVcHBlcjsKLSAgICAgICAgYm9vbCBjdXRDb3ZlcmVkID0gZmFsc2U7Ci0gICAgICAgIGxheWVyMk1lcmdlZFJUcmVlW2VkZ2UtPmdldExheWVyTnVtKCkgLSAxXS5xdWVyeShiZ2k6OmludGVyc2VjdHMoY3V0QmJveFF1ZXJ5Qm94KSwgYmFja19pbnNlcnRlcihhZGpDdXRRdWVyeVJlc3VsdExvd2VyKSk7Ci0gICAgICAgIGZvciAoYXV0byAmbWV0YWxQYWlyOiBhZGpDdXRRdWVyeVJlc3VsdExvd2VyKSB7Ci0gICAgICAgICAgaWYgKGJnOjpjb3ZlcmVkX2J5KGN1dEJib3hRdWVyeUJveCwgbWV0YWxQYWlyLmZpcnN0KSkgewotICAgICAgICAgICAgY3V0Q292ZXJlZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbGF5ZXIyTWVyZ2VkUlRyZWVbZWRnZS0+Z2V0TGF5ZXJOdW0oKSArIDFdLnF1ZXJ5KGJnaTo6aW50ZXJzZWN0cyhjdXRCYm94UXVlcnlCb3gpLCBiYWNrX2luc2VydGVyKGFkakN1dFF1ZXJ5UmVzdWx0VXBwZXIpKTsKLSAgICAgICAgZm9yIChhdXRvICZtZXRhbFBhaXI6IGFkakN1dFF1ZXJ5UmVzdWx0VXBwZXIpIHsKLSAgICAgICAgICBpZiAoYmc6OmNvdmVyZWRfYnkoY3V0QmJveFF1ZXJ5Qm94LCBtZXRhbFBhaXIuZmlyc3QpKSB7Ci0gICAgICAgICAgICBjdXRDb3ZlcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoY3V0Q292ZXJlZCkgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgIH0KLSAgICAgIGZyQ29vcmQgcmVxU3BhY2luZyA9IGNvbnN0cmFpbnQtPmdldEN1dFNwYWNpbmcoKTsKLSAgICAgIGlmIChhY3RTcGFjaW5nIDwgcmVxU3BhY2luZykgewotICAgICAgICAvLyBza2lwIG9uIHZpb2xhdGlvbiB3aXRoIGJvdGggZWRnZSBmaXhlZAotICAgICAgICBpZiAoZWRnZS0+Z2V0VHlwZSgpID09IGRyY0VkZ2VUeXBlRW51bTo6RklYRUQgJiYgcXVlcnlFZGdlLT5nZXRUeXBlKCkgPT0gZHJjRWRnZVR5cGVFbnVtOjpGSVhFRCkgewotICAgICAgICAKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBib29sIGlzVmlvID0gdHJ1ZTsKLQotICAgICAgICAgIC8vIGlmIHRoZSB2aW9sYXRpb24gYm94IGlzIGNvbXBsZXRlbHkgY292ZXJlZCBieSByZWN0IG9mIGVpdGhlciBpbnZvbHZlZCBuZXQsIHRoZW4gaXQgaXMgbm90IGNvbnNpZGVyZWQgYXMgYSB2aW9sYXRpb24KLSAgICAgICAgICBib3hfdCBjdXRWaW9RdWVyeUJveChwb2ludF90KHhsKGdhcFJlY3QpLCB5bChnYXBSZWN0KSksIHBvaW50X3QoeGgoZ2FwUmVjdCksIHloKGdhcFJlY3QpKSk7Ci0gICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGJveF90LCBpbnQ+ID4gY3V0UXVlcnlSZXN1bHQ7Ci0gICAgICAgICAgYXV0byAmbWVyZ2VkUlRyZWUgPSBsYXllcjJNZXJnZWRSVHJlZVtlZGdlLT5nZXRMYXllck51bSgpXTsKLSAgICAgICAgICBtZXJnZWRSVHJlZS5xdWVyeShiZ2k6OmludGVyc2VjdHMoY3V0VmlvUXVlcnlCb3gpLCBiYWNrX2luc2VydGVyKGN1dFF1ZXJ5UmVzdWx0KSk7Ci0gICAgICAgICAgaW50IG5ldElkMSA9IGVkZ2UtPmdldE5ldElkKCk7Ci0gICAgICAgICAgaW50IG5ldElkMiA9IHF1ZXJ5RWRnZS0+Z2V0TmV0SWQoKTsKLQotICAgICAgICAgIGZvciAoYXV0byAmY3V0VmlvUGFpcjogY3V0UXVlcnlSZXN1bHQpIHsKLSAgICAgICAgICAgIGlmIChjdXRWaW9QYWlyLnNlY29uZCAhPSBuZXRJZDEgJiYgY3V0VmlvUGFpci5zZWNvbmQgIT0gbmV0SWQyKSB7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJnOjpjb3ZlcmVkX2J5KGN1dFZpb1F1ZXJ5Qm94LCBjdXRWaW9QYWlyLmZpcnN0KSkgewotICAgICAgICAgICAgICBpc1ZpbyA9IGZhbHNlOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGlzVmlvKSB7Ci0gICAgICAgICAgICBmck1hcmtlciBjdXRWaW9NYXJrZXI7Ci0gICAgICAgICAgICBmckJveCBjdXRWaW9Cb3goeGwoZ2FwUmVjdCksIHlsKGdhcFJlY3QpLCB4aChnYXBSZWN0KSwgeWgoZ2FwUmVjdCkpOwotICAgICAgICAgICAgY3V0VmlvTWFya2VyLnNldENvbnN0cmFpbnQoY29uc3RyYWludCk7Ci0gICAgICAgICAgICBjdXRWaW9NYXJrZXIuc2V0QkJveChjdXRWaW9Cb3gpOwotICAgICAgICAgICAgY3V0VmlvTWFya2VyLnNldExheWVyTnVtKGVkZ2UtPmdldExheWVyTnVtKCkpOwotICAgICAgICAgICAgY3V0VmlvTWFya2VyLmFkZFNyYyhkcmNOZXRzW2VkZ2UtPmdldE5ldElkKCldLT5nZXRTcmMoKSk7Ci0gICAgICAgICAgICBjdXRWaW9NYXJrZXIuYWRkU3JjKGRyY05ldHNbcXVlcnlFZGdlLT5nZXROZXRJZCgpXS0+Z2V0U3JjKCkpOwotCi0gICAgICAgICAgICBtYXJrZXJzLnB1c2hfYmFjayhjdXRWaW9NYXJrZXIpOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICB9Ci0KLQotICB9Ci19Ci0KLQotdm9pZCBmcjo6RFJDV29ya2VyOjpjaGVja01ldGFsU3BhY2luZ1J1bGVzKCkgewotICBmb3IgKGF1dG8gbGF5ZXJJdCA9IGxheWVyMkVkZ2VSVHJlZS5iZWdpbigpOyBsYXllckl0ICE9IGxheWVyMkVkZ2VSVHJlZS5lbmQoKTsgKytsYXllckl0KSB7Ci0gICAgZnJMYXllck51bSBsYXllck51bSA9IGxheWVySXQtPmZpcnN0OwotICAgIGF1dG8gY3VyckxheWVyID0gZGVzaWduLT5nZXRUZWNoKCktPmdldExheWVyKGxheWVyTnVtKTsKLSAgICBpZiAoY3VyckxheWVyLT5nZXRUeXBlKCkgIT0gZnJMYXllclR5cGVFbnVtOjpST1VUSU5HKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgLy8gZm9yIChhdXRvIGNvbnN0cmFpbnQ6IGRlc2lnbi0+Z2V0VGVjaCgpLT5nZXRMYXllcihsYXllck51bSktPmdldENvbnN0cmFpbnRzKCkpIHsKLSAgICAvLyAgIHN3aXRjaCAoY29uc3RyYWludC0+dHlwZUlkKCkpIHsKLSAgICAvLyAgICAgY2FzZSBmckNvbnN0cmFpbnRUeXBlRW51bTo6ZnJjU3BhY2luZ1RhYmxlQ29uc3RyYWludDoKLSAgICAvLyAgICAgICBjaGVja01ldGFsU3BhY2luZ1RhYmxlUnVsZShsYXllcjJFZGdlUlRyZWVbbGF5ZXJOdW1dLCAoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PGZyU3BhY2luZ1RhYmxlQ29uc3RyYWludD4oY29uc3RyYWludCkpLmdldCgpKTsKLSAgICAvLyAgICAgICBicmVhazsKLSAgICAvLyAgICAgY2FzZSBmckNvbnN0cmFpbnRUeXBlRW51bTo6ZnJjU3BhY2luZ0VuZE9mTGluZUNvbnN0cmFpbnQ6Ci0gICAgLy8gICAgICAgY2hlY2tNZXRhbFNwYWNpbmdFbmRPZkxpbmVSdWxlKGxheWVyMkVkZ2VSVHJlZVtsYXllck51bV0sIChzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8ZnJTcGFjaW5nRW5kT2ZMaW5lQ29uc3RyYWludD4oY29uc3RyYWludCkpLmdldCgpKTsKLSAgICAvLyAgICAgICBicmVhazsKLSAgICAvLyAgICAgZGVmYXVsdDoKLSAgICAvLyAgICAgICBjb250aW51ZTsKLSAgICAvLyAgIH0KLSAgICAvLyB9Ci0KLSAgICAvLyBtaW4gc3BhY2luZyBydWxlCi0gICAgaWYgKGN1cnJMYXllci0+aGFzTWluU3BhY2luZygpKSB7Ci0gICAgICBhdXRvIGNvbnN0cmFpbnQgPSBjdXJyTGF5ZXItPmdldE1pblNwYWNpbmcoKTsKLSAgICAgIHN3aXRjaCAoY29uc3RyYWludC0+dHlwZUlkKCkpIHsKLSAgICAgICAgY2FzZSBmckNvbnN0cmFpbnRUeXBlRW51bTo6ZnJjU3BhY2luZ1RhYmxlUHJsQ29uc3RyYWludDoKLSAgICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgImNoZWNrIHBybCBzcGFjaW5nXG4iOwotICAgICAgICAgIGNoZWNrTWV0YWxTcGFjaW5nVGFibGVQcmxSdWxlKGxheWVyMkVkZ2VSVHJlZVtsYXllck51bV0sIHN0YXRpY19jYXN0PGZyU3BhY2luZ1RhYmxlUHJsQ29uc3RyYWludCo+KGNvbnN0cmFpbnQpKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBzdGQ6OmNvdXQgPDwgIldhcm5pbmc6IFVuc3VwcG9ydGVkIE1pblNwYWNpbmcgcnVsZVxuIjsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGN1cnJMYXllci0+aGFzRW9sU3BhY2luZygpKSB7Ci0gICAgICBmb3IgKGF1dG8gY29uc3RyYWludDogY3VyckxheWVyLT5nZXRFb2xTcGFjaW5nKCkpIHsKLSAgICAgICAgLy8gc3RkOjpjb3V0IDw8ICJjaGVjayBlb2wgc3BhY2luZ1xuIjsKLSAgICAgICAgc3dpdGNoIChjb25zdHJhaW50LT50eXBlSWQoKSkgewotICAgICAgICAgIGNhc2UgZnJDb25zdHJhaW50VHlwZUVudW06OmZyY1NwYWNpbmdFbmRPZkxpbmVDb25zdHJhaW50OgotICAgICAgICAgICAgY2hlY2tNZXRhbFNwYWNpbmdFbmRPZkxpbmVSdWxlKGxheWVyMkVkZ2VSVHJlZVtsYXllck51bV0sIHN0YXRpY19jYXN0PGZyU3BhY2luZ0VuZE9mTGluZUNvbnN0cmFpbnQqPihjb25zdHJhaW50KSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJXYXJuaW5nOiBVbnN1cHBvcnRlZCBFT0wgcnVsZVxuIjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi12b2lkIGZyOjpEUkNXb3JrZXI6OmNoZWNrTWV0YWxTcGFjaW5nVGFibGVQcmxSdWxlKGNvbnN0IGJnaTo6cnRyZWU8c3RkOjpwYWlyPHNlZ21lbnRfdCwgRFJDRWRnZSo+LCBiZ2k6OnF1YWRyYXRpYzwxNj4gPiAmZWRnZVJUcmVlLCAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyU3BhY2luZ1RhYmxlUHJsQ29uc3RyYWludCogY29uc3RyYWludCkgewotICAvLyBkb3VibGUgZGJ1ID0gZGVzaWduLT5nZXRUZWNoKCktPmdldERCVVBlclVVKCk7Ci0gIGF1dG8gcHJsQ29uc3RyYWludCA9IGNvbnN0cmFpbnQtPmdldExvb2t1cFRibCgpOwotICBmckNvb3JkIG1heFNwYWNpbmdWYWwgPSBwcmxDb25zdHJhaW50LmZpbmQocHJsQ29uc3RyYWludC5nZXRSb3dzKCkuYmFjaygpLCBwcmxDb25zdHJhaW50LmdldENvbHMoKS5iYWNrKCkpOwotICBmb3IgKGF1dG8gc2VnRWRnZUl0ID0gZWRnZVJUcmVlLmJlZ2luKCk7IHNlZ0VkZ2VJdCAhPSBlZGdlUlRyZWUuZW5kKCk7ICsrc2VnRWRnZUl0KSB7Ci0gICAgYXV0byAmc2VnID0gc2VnRWRnZUl0LT5maXJzdDsKLSAgICBSZWN0YW5nbGUgc2VnU3BhblJlY3Q7Ci0gICAgYXV0byAmZWRnZSA9IHNlZ0VkZ2VJdC0+c2Vjb25kOwotICAgIGF1dG8gZWRnZURpciA9IGVkZ2UtPmdldERpcigpOwotICAgIGJveF90IHRlc3RCb3g7Ci0gICAgZ2V0U3BhY2luZ1RhYmxlVGVzdEJveChzZWcsIGVkZ2UsIG1heFNwYWNpbmdWYWwsIHRlc3RCb3gpOwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzZWdtZW50X3QsIERSQ0VkZ2UqPiA+IGVkZ2VRdWVyeVJlc3VsdDsKLSAgICBlZGdlUlRyZWUucXVlcnkoYmdpOjppbnRlcnNlY3RzKHRlc3RCb3gpLCBiYWNrX2luc2VydGVyKGVkZ2VRdWVyeVJlc3VsdCkpOwotICAgIGdldEVkZ2VTcGFuUmVjdChzZWcsIGVkZ2VEaXIsIGVkZ2UtPmdldFNwYW4oKSwgc2VnU3BhblJlY3QpOwotICAgIC8vIHN0ZDo6Y291dCA8PCAiICBjaGVjayBlZGdlICgiIDw8IGJnOjpnZXQ8MCwwPihzZWcpIC8gZGJ1IDw8ICIsICIgPDwgYmc6OmdldDwwLDE+KHNlZykgLyBkYnUKLSAgICAvLyAgICAgICAgICAgICA8PCAiKSAtLSAoIiA8PCBiZzo6Z2V0PDEsMD4oc2VnKSAvIGRidSA8PCAiLCAiIDw8IGJnOjpnZXQ8MSwxPihzZWcpIC8gZGJ1Ci0gICAgLy8gICAgICAgICAgICAgPDwgIikgKCIgPDwgaW50KGVkZ2UtPmdldERpcigpKSA8PCAiKSwgdHlwZSA9ICIgPDwgKGludCllZGdlLT5nZXRUeXBlKCkgPDwgIiwgcXVlcnlCb3ggPSAoIiAKLSAgICAvLyAgICAgICAgICAgICA8PCBiZzo6Z2V0PGJnOjptaW5fY29ybmVyLCAwPih0ZXN0Qm94KSAvIGRidSA8PCAiLCAiIDw8IGJnOjpnZXQ8Ymc6Om1pbl9jb3JuZXIsIDE+KHRlc3RCb3gpIC8gZGJ1IDw8ICIpIC0tICgiCi0gICAgLy8gICAgICAgICAgICAgPDwgYmc6OmdldDxiZzo6bWF4X2Nvcm5lciwgMD4odGVzdEJveCkgLyBkYnUgPDwgIiwgIiA8PCBiZzo6Z2V0PGJnOjptYXhfY29ybmVyLCAxPih0ZXN0Qm94KSAvIGRidSA8PCAiKVxuIjsKLSAgICBmb3IgKGF1dG8gJnF1ZXJ5U2VnRWRnZTogZWRnZVF1ZXJ5UmVzdWx0KSB7Ci0gICAgICBhdXRvICZxdWVyeVNlZyA9IHF1ZXJ5U2VnRWRnZS5maXJzdDsKLSAgICAgIGF1dG8gJnF1ZXJ5RWRnZSA9IHF1ZXJ5U2VnRWRnZS5zZWNvbmQ7Ci0gICAgICBpbnQgbmV0SWQxID0gZWRnZS0+Z2V0TmV0SWQoKTsKLSAgICAgIGludCBuZXRJZDIgPSBxdWVyeUVkZ2UtPmdldE5ldElkKCk7Ci0gICAgICBpZiAodGFyZ2V0TmV0SWQgIT0gLTEgJiYgdGFyZ2V0TmV0SWQgIT0gbmV0SWQxICYmIHRhcmdldE5ldElkICE9IG5ldElkMikgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIC8vIG9ubHkgb3Bwb3NpdGUtZGlyIGVkZ2VzIGFyZSBjb3VudGVkIGFzIHBybCB2aW9sYXRpb24KLSAgICAgIGlmICghaXNPcHBvc2l0ZURpcihlZGdlRGlyLCBxdWVyeUVkZ2UtPmdldERpcigpKSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGJveF90IHF1ZXJ5RWRnZVNwYW5Cb3g7Ci0gICAgICBnZXRFZGdlU3BhbkJveChxdWVyeVNlZywgcXVlcnlFZGdlLT5nZXREaXIoKSwgcXVlcnlFZGdlLT5nZXRTcGFuKCksIHF1ZXJ5RWRnZVNwYW5Cb3gpOwotICAgICAgLy8gc3RkOjpjb3V0IDw8ICIgICAgYWdhaW5zdCBlZGdlICgiIDw8IGJnOjpnZXQ8MCwwPihxdWVyeVNlZykgLyBkYnUgPDwgIiwgIiA8PCBiZzo6Z2V0PDAsMT4ocXVlcnlTZWcpIC8gZGJ1Ci0gICAgICAvLyAgICAgICAgICAgPDwgIikgLS0gKCIgPDwgYmc6OmdldDwxLDA+KHF1ZXJ5U2VnKSAvIGRidSA8PCAiLCAiIDw8IGJnOjpnZXQ8MSwxPihxdWVyeVNlZykgLyBkYnUKLSAgICAgIC8vICAgICAgICAgICA8PCAiKSAoIiA8PCBpbnQoZWRnZS0+Z2V0RGlyKCkpIDw8ICIpLCB0eXBlID0gIiA8PCAoaW50KXF1ZXJ5RWRnZS0+Z2V0VHlwZSgpIDw8ICIsIHNwYW5Cb3ggPSAoIiAKLSAgICAgIC8vICAgICAgICAgICA8PCBiZzo6Z2V0PGJnOjptaW5fY29ybmVyLCAwPihxdWVyeUVkZ2VTcGFuQm94KSAvIGRidSA8PCAiLCAiIDw8IGJnOjpnZXQ8Ymc6Om1pbl9jb3JuZXIsIDE+KHF1ZXJ5RWRnZVNwYW5Cb3gpIC8gZGJ1IDw8ICIpIC0tICgiCi0gICAgICAvLyAgICAgICAgICAgPDwgYmc6OmdldDxiZzo6bWF4X2Nvcm5lciwgMD4ocXVlcnlFZGdlU3BhbkJveCkgLyBkYnUgPDwgIiwgIiA8PCBiZzo6Z2V0PGJnOjptYXhfY29ybmVyLCAxPihxdWVyeUVkZ2VTcGFuQm94KSAvIGRidSA8PCAiKVxuIjsKLSAgICAgIGlmICghYmc6OmludGVyc2VjdHMocXVlcnlFZGdlU3BhbkJveCwgdGVzdEJveCkpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBib3hfdCBvdmVybGFwQm94OwotICAgICAgICBiZzo6aW50ZXJzZWN0aW9uKHF1ZXJ5RWRnZVNwYW5Cb3gsIHRlc3RCb3gsIG92ZXJsYXBCb3gpOwotICAgICAgICBpZiAoYmc6OmFyZWEob3ZlcmxhcEJveCkgPT0gMCkgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyB0aGVyZSBtaWdodCBiZSB2aW9sYXRpb24sIGRvIGV4YWN0IGNoZWNrCi0gICAgICAvLyBmckNvb3JkIGVmZldpZHRoID0gc3RkOjptYXgoc3RkOjptaW4oZnJDb29yZChiZzo6bGVuZ3RoKHF1ZXJ5U2VnKSksIHF1ZXJ5RWRnZS0+Z2V0U3BhbigpKSwgc3RkOjptaW4oZnJDb29yZChiZzo6bGVuZ3RoKHNlZykpLCBlZGdlLT5nZXRTcGFuKCkpKTsKLSAgICAgIGZyQ29vcmQgcXVlcnlFZGdlV2lkdGggPSBxdWVyeUVkZ2UtPmdldFdpZHRoKCk7Ci0gICAgICBmckNvb3JkIGVkZ2VXaWR0aCA9IGVkZ2UtPmdldFdpZHRoKCk7Ci0gICAgICAvLyBtaW5zcGFjaW5nIG9icwotICAgICAgaWYgKFVTRU1JTlNQQUNJTkdfT0JTICYmIHF1ZXJ5RWRnZS0+Z2V0TmV0SWQoKSA9PSBpbnQoZHJjU3BlY2lhbE5ldElkRW51bTo6T0JTKSkgewotICAgICAgICBxdWVyeUVkZ2VXaWR0aCA9IGRlc2lnbi0+Z2V0VGVjaCgpLT5nZXRMYXllcihxdWVyeUVkZ2UtPmdldExheWVyTnVtKCkpLT5nZXRXaWR0aCgpOwotICAgICAgfQotICAgICAgaWYgKFVTRU1JTlNQQUNJTkdfT0JTICYmIGVkZ2UtPmdldE5ldElkKCkgPT0gaW50KGRyY1NwZWNpYWxOZXRJZEVudW06Ok9CUykpIHsKLSAgICAgICAgZWRnZVdpZHRoID0gZGVzaWduLT5nZXRUZWNoKCktPmdldExheWVyKGVkZ2UtPmdldExheWVyTnVtKCkpLT5nZXRXaWR0aCgpOwotICAgICAgfQotCi0gICAgICAvLyBmckNvb3JkIGVmZldpZHRoID0gc3RkOjptYXgocXVlcnlFZGdlLT5nZXRXaWR0aCgpLCBlZGdlLT5nZXRXaWR0aCgpKTsKLSAgICAgIGZyQ29vcmQgZWZmV2lkdGggPSBzdGQ6Om1heChxdWVyeUVkZ2VXaWR0aCwgZWRnZVdpZHRoKTsKLSAgICAgIFJlY3RhbmdsZSBxdWVyeUVkZ2VTcGFuUmVjdDsKLSAgICAgIGdldEVkZ2VTcGFuUmVjdChxdWVyeVNlZywgcXVlcnlFZGdlLT5nZXREaXIoKSwgcXVlcnlFZGdlLT5nZXRTcGFuKCksIHF1ZXJ5RWRnZVNwYW5SZWN0KTsKLSAgICAgIC8vIHN0ZDo6Y291dCA8PCAiICAgICBkb3VibGUtY2hlY2sgIiA8PCB4bChxdWVyeUVkZ2VTcGFuUmVjdCkgPDwgIiAiIDw8IHlsKHF1ZXJ5RWRnZVNwYW5SZWN0KSA8PCAiICIgPDwgeGgocXVlcnlFZGdlU3BhblJlY3QpIDw8ICIgIiA8PCB5aChxdWVyeUVkZ2VTcGFuUmVjdCkgPDwgIlxuIjsKLSAgICAgIGJvb2wgaXNIb3Jpem9udGFsID0gKGVkZ2VEaXIgPT0gZnJEaXJFbnVtOjpOIHx8IGVkZ2VEaXIgPT0gZnJEaXJFbnVtOjpTKTsKLSAgICAgIGZyQ29vcmQgcHJsID0gLTE7Ci0gICAgICBmckNvb3JkIGFjdFNwYWNpbmc7Ci0gICAgICBJbnRlcnZhbCBzZWdJbnR2LCBxdWVyeVNlZ0ludHY7Ci0gICAgICAvLyBSZWN0YW5nbGUgdG1wU2VnU3BhblJlY3QgPSBzZWdTcGFuUmVjdDsKLSAgICAgIFJlY3RhbmdsZSB0bXBRdWVyeUVkZ2VTcGFuUmVjdCA9IHF1ZXJ5RWRnZVNwYW5SZWN0OwotICAgICAgUmVjdGFuZ2xlIGdhcFJlY3QgPSBnZW5lcmFsaXplZF9pbnRlcnNlY3QodG1wUXVlcnlFZGdlU3BhblJlY3QsIHNlZ1NwYW5SZWN0KTsKLSAgICAgIGlmIChpc0hvcml6b250YWwpIHsKLSAgICAgICAgc2VnSW50diA9IGhvcml6b250YWwoc2VnU3BhblJlY3QpOwotICAgICAgICBxdWVyeVNlZ0ludHYgPSBob3Jpem9udGFsKHF1ZXJ5RWRnZVNwYW5SZWN0KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNlZ0ludHYgPSB2ZXJ0aWNhbChzZWdTcGFuUmVjdCk7Ci0gICAgICAgIHF1ZXJ5U2VnSW50diA9IHZlcnRpY2FsKHF1ZXJ5RWRnZVNwYW5SZWN0KTsKLSAgICAgIH0KLSAgICAgIC8vIHN0ZDo6Y291dCA8PCAiICAgc2VnSW50djogIiA8PCBsb3coc2VnSW50dikgPDwgIiAtLSAiIDw8IGhpZ2goc2VnSW50dikgPDwgIlxuIjsKLSAgICAgIC8vIHN0ZDo6Y291dCA8PCAiICAgcXVlcnlTZWdJbnR2OiAiIDw8IGxvdyhxdWVyeVNlZ0ludHYpIDw8ICIgLS0gIiA8PCBoaWdoKHF1ZXJ5U2VnSW50dikgPDwgIlxuIjsKLSAgICAgIGlmIChpbnRlcnNlY3RzKHNlZ0ludHYsIHF1ZXJ5U2VnSW50dikpIHsKLSAgICAgICAgcHJsID0gZGVsdGEoZ2VuZXJhbGl6ZWRfaW50ZXJzZWN0KHF1ZXJ5U2VnSW50diwgc2VnSW50dikpOwotICAgICAgICBpZiAoaXNIb3Jpem9udGFsKSB7Ci0gICAgICAgICAgYWN0U3BhY2luZyA9ICh5aChnYXBSZWN0KSAtIHlsKGdhcFJlY3QpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBhY3RTcGFjaW5nID0gKHhoKGdhcFJlY3QpIC0geGwoZ2FwUmVjdCkpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwcmwgPSAtZGVsdGEoZ2VuZXJhbGl6ZWRfaW50ZXJzZWN0KHF1ZXJ5U2VnSW50diwgc2VnSW50dikpOwotICAgICAgICBhY3RTcGFjaW5nID0gcmVjdERpYWdMZW5ndGgoZ2FwUmVjdCk7Ci0gICAgICB9Ci0gICAgICAvLyBSZWN0YW5nbGUgZ2FwUmVjdCA9IGdlbmVyYWxpemVkX2ludGVyc2VjdChxdWVyeUVkZ2VTcGFuUmVjdCwgc2VnU3BhblJlY3QpOwotICAgICAgLy8gZnJDb29yZCBwcmwgPSAoZWRnZURpciA9PSBmckRpckVudW06Ok4gfHwgZWRnZURpciA9PSBmckRpckVudW06OlMpID8gKHhoKGdhcFJlY3QpIC0geGwoZ2FwUmVjdCkpIDogKHloKGdhcFJlY3QpIC0geWwoZ2FwUmVjdCkpOwotICAgICAgLy8gZnJDb29yZCBhY3RTcGFjaW5nID0gKGVkZ2VEaXIgPT0gZnJEaXJFbnVtOjpOIHx8IGVkZ2VEaXIgPT0gZnJEaXJFbnVtOjpTKSA/ICh5aChnYXBSZWN0KSAtIHlsKGdhcFJlY3QpKSA6ICh4aChnYXBSZWN0KSAtIHhsKGdhcFJlY3QpKTsKLSAgICAgIGZyQ29vcmQgcmVxU3BhY2luZyA9IHBybENvbnN0cmFpbnQuZmluZChlZmZXaWR0aCwgcHJsKTsKLSAgICAgIAotICAgICAgLy8gc3RkOjpjb3V0IDw8ICIgIGNoZWNraW5nIGJldHdlZW4gZWRnZSAoIiA8PCBiZzo6Z2V0PDAsMD4oc2VnKSAvIGRidSA8PCAiLCAiIDw8IGJnOjpnZXQ8MCwxPihzZWcpIC8gZGJ1Ci0gICAgICAvLyAgICAgICAgICAgPDwgIikgLS0gKCIgPDwgYmc6OmdldDwxLDA+KHNlZykgLyBkYnUgPDwgIiwgIiA8PCBiZzo6Z2V0PDEsMT4oc2VnKSAvIGRidQotICAgICAgLy8gICAgICAgICAgIDw8ICIpICgiIDw8IGludChlZGdlLT5nZXREaXIoKSkgPDwgIikgYW5kIGVkZ2UgKCIgPDwgYmc6OmdldDwwLDA+KHF1ZXJ5U2VnKSAvIGRidSA8PCAiLCAiIDw8IGJnOjpnZXQ8MCwxPihxdWVyeVNlZykgLyBkYnUKLSAgICAgIC8vICAgICAgICAgICA8PCAiKSAtLSAoIiA8PCBiZzo6Z2V0PDEsMD4ocXVlcnlTZWcpIC8gZGJ1IDw8ICIsICIgPDwgYmc6OmdldDwxLDE+KHF1ZXJ5U2VnKSAvIGRidSA8PCAiKSAoIiA8PCBpbnQocXVlcnlFZGdlLT5nZXREaXIoKSkgPDwgIiksICIKLSAgICAgIC8vICAgICAgICAgICA8PCAicmVxU3BhY2luZyA9ICIgPDwgcmVxU3BhY2luZyA8PCAiLCBhY3RTcGFjaW5nID0gIiA8PCBhY3RTcGFjaW5nIDw8IlxuIjsKLSAgICAgICAgICAKLQotCi0KLSAgICAgIC8vIHRoZXJlIGlzIGEgdmlvbGF0aW9uCi0KLSAgICAgIGlmIChhY3RTcGFjaW5nIDwgcmVxU3BhY2luZykgewotICAgICAgICAvLyBza2lwIG9uIHZpb2xhdGlvbiB3aXRoIGJvdGggZWRnZSBmaXhlZAotICAgICAgICBpZiAoZWRnZS0+Z2V0VHlwZSgpID09IGRyY0VkZ2VUeXBlRW51bTo6RklYRUQgJiYgcXVlcnlFZGdlLT5nZXRUeXBlKCkgPT0gZHJjRWRnZVR5cGVFbnVtOjpGSVhFRCkgewotICAgICAgICAKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBib29sIGlzVmlvID0gdHJ1ZTsKLSAgICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgIiAgICAgIHZpb2xhdGlvblxuIjsKLSAgICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgInBybCB2aW9sYXRpb24gYmV0d2VlbiBlZGdlICgiIDw8IGJnOjpnZXQ8MCwwPihzZWcpIC8gZGJ1IDw8ICIsICIgPDwgYmc6OmdldDwwLDE+KHNlZykgLyBkYnUKLSAgICAgICAgICAvLyAgICAgICAgICAgPDwgIikgLS0gKCIgPDwgYmc6OmdldDwxLDA+KHNlZykgLyBkYnUgPDwgIiwgIiA8PCBiZzo6Z2V0PDEsMT4oc2VnKSAvIGRidQotICAgICAgICAgIC8vICAgICAgICAgICA8PCAiKSAoIiA8PCBpbnQoZWRnZS0+Z2V0RGlyKCkpIDw8ICIpIGFuZCBlZGdlICgiIDw8IGJnOjpnZXQ8MCwwPihxdWVyeVNlZykgLyBkYnUgPDwgIiwgIiA8PCBiZzo6Z2V0PDAsMT4ocXVlcnlTZWcpIC8gZGJ1Ci0gICAgICAgICAgLy8gICAgICAgICAgIDw8ICIpIC0tICgiIDw8IGJnOjpnZXQ8MSwwPihxdWVyeVNlZykgLyBkYnUgPDwgIiwgIiA8PCBiZzo6Z2V0PDEsMT4ocXVlcnlTZWcpIC8gZGJ1IDw8ICIpICgiIDw8IGludChxdWVyeUVkZ2UtPmdldERpcigpKSA8PCAiKVxuIjsKLSAgICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgIiAgcHJsID0gIiA8PCBwcmwgPDwgIiwgd2lkdGggPSAiIDw8IGVmZldpZHRoIDw8ICIsIGFjdFNwYWNpbmcgPSAiIDw8IGFjdFNwYWNpbmcgPDwgIiwgcmVxU3BhY2luZyA9ICIgPDwgcmVxU3BhY2luZyA8PCAiXG4iOyAgICAgICAgICAKLSAgICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgIiAgICBzZWdTcGFuID0gIiA8PCBlZGdlLT5nZXRTcGFuKCkgLyBkYnUgPDwgIiwgcXVlcnlFZGdlU3BhbiA9ICIgPDwgcXVlcnlFZGdlLT5nZXRTcGFuKCkgLyBkYnUgPDwgIlxuIjsKLSAgICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgIiAgICBzZWdTcGFuUmVjdCA9ICgiIDw8IHhsKHNlZ1NwYW5SZWN0KSAvIGRidSA8PCAiLCAiIDw8IHlsKHNlZ1NwYW5SZWN0KSAvIGRidSA8PCAiKSAtLSAoIiA8PCB4aChzZWdTcGFuUmVjdCkgLyBkYnUgPDwgIiwgIiA8PCB5aChzZWdTcGFuUmVjdCkgLyBkYnUgPDwgIilcbiI7Ci0gICAgICAgICAgLy8gc3RkOjpjb3V0IDw8ICIgICAgcXVlcnlFZGdlU3BhblJlY3QgPSAoIiA8PCB4bChxdWVyeUVkZ2VTcGFuUmVjdCkgLyBkYnUgPDwgIiwgIiA8PCB5bChxdWVyeUVkZ2VTcGFuUmVjdCkgLyBkYnUgPDwgIikgLS0gKCIgPDwgeGgocXVlcnlFZGdlU3BhblJlY3QpIC8gZGJ1IDw8ICIsICIgPDwgeWgocXVlcnlFZGdlU3BhblJlY3QpIC8gZGJ1IDw8ICIpXG4iOwotICAgICAgICAgIAotICAgICAgICAgIC8vIGlmIHRoZSB2aW9sYXRpb24gYm94IGlzIGNvbXBsZXRlbHkgY292ZXJlZCBieSByZWN0IG9mIGVpdGhlciBpbnZvbHZlZCBuZXQsIHRoZW4gaXQgaXMgbm90IGNvbnNpZGVyZWQgYXMgYSB2aW9sYXRpb24KLSAgICAgICAgICBib3hfdCBwcmxWaW9RdWVyeUJveChwb2ludF90KHhsKGdhcFJlY3QpLCB5bChnYXBSZWN0KSksIHBvaW50X3QoeGgoZ2FwUmVjdCksIHloKGdhcFJlY3QpKSk7Ci0gICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGJveF90LCBpbnQ+ID4gcHJsUXVlcnlSZXN1bHQ7Ci0gICAgICAgICAgYXV0byAmbWVyZ2VkUlRyZWUgPSBsYXllcjJNZXJnZWRSVHJlZVtlZGdlLT5nZXRMYXllck51bSgpXTsKLSAgICAgICAgICBtZXJnZWRSVHJlZS5xdWVyeShiZ2k6OmludGVyc2VjdHMocHJsVmlvUXVlcnlCb3gpLCBiYWNrX2luc2VydGVyKHBybFF1ZXJ5UmVzdWx0KSk7Ci0gICAgICAgICAgaW50IG5ldElkMSA9IGVkZ2UtPmdldE5ldElkKCk7Ci0gICAgICAgICAgaW50IG5ldElkMiA9IHF1ZXJ5RWRnZS0+Z2V0TmV0SWQoKTsKLQotICAgICAgICAgIGZvciAoYXV0byAmcHJsVmlvUGFpcjogcHJsUXVlcnlSZXN1bHQpIHsKLSAgICAgICAgICAgIGlmIChwcmxWaW9QYWlyLnNlY29uZCAhPSBuZXRJZDEgJiYgcHJsVmlvUGFpci5zZWNvbmQgIT0gbmV0SWQyKSB7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJnOjpjb3ZlcmVkX2J5KHBybFZpb1F1ZXJ5Qm94LCBwcmxWaW9QYWlyLmZpcnN0KSkgewotICAgICAgICAgICAgICBpc1ZpbyA9IGZhbHNlOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoaXNWaW8pIHsKLSAgICAgICAgICAgIGZyTWFya2VyIHBybFZpb01hcmtlcjsKLSAgICAgICAgICAgIGZyQm94IHBybFZpb0JveCh4bChnYXBSZWN0KSwgeWwoZ2FwUmVjdCksIHhoKGdhcFJlY3QpLCB5aChnYXBSZWN0KSk7Ci0gICAgICAgICAgICBwcmxWaW9NYXJrZXIuc2V0Q29uc3RyYWludChjb25zdHJhaW50KTsKLSAgICAgICAgICAgIHBybFZpb01hcmtlci5zZXRCQm94KHBybFZpb0JveCk7Ci0gICAgICAgICAgICBwcmxWaW9NYXJrZXIuc2V0TGF5ZXJOdW0oZWRnZS0+Z2V0TGF5ZXJOdW0oKSk7Ci0gICAgICAgICAgICAvLyBwcmxWaW9NYXJrZXIuYWRkTmV0KGRyY05ldHNbZWRnZS0+Z2V0TmV0SWQoKV0tPmdldE5ldCgpKTsKLSAgICAgICAgICAgIC8vIHBybFZpb01hcmtlci5hZGROZXQoZHJjTmV0c1txdWVyeUVkZ2UtPmdldE5ldElkKCldLT5nZXROZXQoKSk7Ci0gICAgICAgICAgICBwcmxWaW9NYXJrZXIuYWRkU3JjKGRyY05ldHNbZWRnZS0+Z2V0TmV0SWQoKV0tPmdldFNyYygpKTsKLSAgICAgICAgICAgIHBybFZpb01hcmtlci5hZGRTcmMoZHJjTmV0c1txdWVyeUVkZ2UtPmdldE5ldElkKCldLT5nZXRTcmMoKSk7Ci0KLSAgICAgICAgICAgIG1hcmtlcnMucHVzaF9iYWNrKHBybFZpb01hcmtlcik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgZnI6OkRSQ1dvcmtlcjo6Y2hlY2tNZXRhbFNwYWNpbmdFbmRPZkxpbmVSdWxlKGNvbnN0IGJnaTo6cnRyZWU8c3RkOjpwYWlyPHNlZ21lbnRfdCwgRFJDRWRnZSo+LCBiZ2k6OnF1YWRyYXRpYzwxNj4gPiAmZWRnZVJUcmVlLCAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmclNwYWNpbmdFbmRPZkxpbmVDb25zdHJhaW50KiBjb25zdHJhaW50KSB7Ci0gIC8vIGRvdWJsZSBkYnUgPSBkZXNpZ24tPmdldFRlY2goKS0+Z2V0REJVUGVyVVUoKTsKLSAgLy8gZnJTcGFjaW5nRW5kT2ZMaW5lUGFyYWxsZWxFZGdlQ29uc3RyYWludCogZW9sUGFyYWxsZWxFZGdlQ29uc3RyYWludCA9IChjb25zdHJhaW50LT5oYXNQYXJhbGxlbEVkZ2UoKSkgPyBjb25zdHJhaW50LT5nZXRQYXJhbGxlbEVkZ2UoKS5nZXQoKSA6IG51bGxwdHI7Ci0gIGZvciAoYXV0byBzZWdFZGdlSXQgPSBlZGdlUlRyZWUuYmVnaW4oKTsgc2VnRWRnZUl0ICE9IGVkZ2VSVHJlZS5lbmQoKTsgKytzZWdFZGdlSXQpIHsKLSAgICBib29sIGlzVHJpZ2dlcmVkID0gIWNvbnN0cmFpbnQtPmhhc1BhcmFsbGVsRWRnZSgpOyAvLyBpZiBubyBwYXJhbGxlbCBlZGdlLCBhbHdheXMgdHJpZ2dlcmVkCi0gICAgYXV0byAmc2VnID0gc2VnRWRnZUl0LT5maXJzdDsKLSAgICBhdXRvIGVvbFdpdGhpbiA9IGNvbnN0cmFpbnQtPmdldEVvbFdpdGhpbigpOwotICAgIGF1dG8gZW9sV2lkdGggPSBjb25zdHJhaW50LT5nZXRFb2xXaWR0aCgpOwotICAgIGF1dG8gZW9sU3BhY2UgPSBjb25zdHJhaW50LT5nZXRNaW5TcGFjaW5nKCk7Ci0gICAgUmVjdGFuZ2xlIHNlZ1NwYW5SZWN0OwotICAgIGF1dG8gJmVkZ2UgPSBzZWdFZGdlSXQtPnNlY29uZDsKLSAgICBhdXRvIGVkZ2VEaXIgPSBlZGdlLT5nZXREaXIoKTsKLSAgICBib3hfdCB0ZXN0Qm94LCB0cmlnQm94MSwgdHJpZ0JveDI7IC8vIGxlZnQgLyBib3R0b20gdHJpZ2dlciBib3ggYW5kIHJpZ2h0IC8gdG9wIHRyaWdnZXIgYm94Ci0gICAgLy8gc2tpcCBpZiBub3QgZW9sIGVkZ2UKLSAgICBpZiAoIWlzRW9sRWRnZShlZGdlKSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIC8vIHNraXAgaWYgZW9sV2lkdGggbm90IHNhdGlzZmllZAotICAgIGlmIChmckNvb3JkKGJnOjpsZW5ndGgoc2VnKSkgPj0gZW9sV2lkdGgpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBnZXRFZGdlU3BhblJlY3Qoc2VnLCBlZGdlRGlyLCBlZGdlLT5nZXRTcGFuKCksIHNlZ1NwYW5SZWN0KTsgICAgCi0gICAgLy8gZ2V0IHRyaWdnZXIgYm94IGlmIHNwZWNpZmllZAotICAgIGlmIChjb25zdHJhaW50LT5oYXNQYXJhbGxlbEVkZ2UoKSkgewotICAgICAgYm9vbCBpc0xlZnRUcmlnZ2VyZWQgPSBmYWxzZSwgaXNSaWdodFRyaWdnZXJlZCA9IGZhbHNlOwotICAgICAgZ2V0UGFyYWxsZWxFZGdlQm94cyhzZWcsIGVkZ2UsIGNvbnN0cmFpbnQtPmdldFBhclNwYWNlKCksIGNvbnN0cmFpbnQtPmdldFBhcldpdGhpbigpLCBlb2xXaXRoaW4sIHRyaWdCb3gxLCB0cmlnQm94Mik7Ci0gICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c2VnbWVudF90LCBEUkNFZGdlKj4gPiB0cmlnQm94MVF1ZXJ5UmVzdWx0LCB0cmlnQm94MlF1ZXJ5UmVzdWx0OwotICAgICAgZWRnZVJUcmVlLnF1ZXJ5KGJnaTo6aW50ZXJzZWN0cyh0cmlnQm94MSksIGJhY2tfaW5zZXJ0ZXIodHJpZ0JveDFRdWVyeVJlc3VsdCkpOwotICAgICAgZWRnZVJUcmVlLnF1ZXJ5KGJnaTo6aW50ZXJzZWN0cyh0cmlnQm94MiksIGJhY2tfaW5zZXJ0ZXIodHJpZ0JveDJRdWVyeVJlc3VsdCkpOwotICAgICAgLy8gY2hlY2sgbGVmdAotICAgICAgZm9yIChhdXRvICZxdWVyeVNlZ0VkZ2U6IHRyaWdCb3gxUXVlcnlSZXN1bHQpIHsKLSAgICAgICAgYXV0byAmcXVlcnlTZWcgPSBxdWVyeVNlZ0VkZ2UuZmlyc3Q7Ci0gICAgICAgIGF1dG8gJnF1ZXJ5RWRnZSA9IHF1ZXJ5U2VnRWRnZS5zZWNvbmQ7Ci0gICAgICAgIC8vIG9ubHkgb3Bwb3NpdGUtZGlyIGVkZ2VzIGFyZSBjb3VudGVkIGFzIHBybCB2aW9sYXRpb24KLSAgICAgICAgaWYgKCFpc09wcG9zaXRlRGlyKGxlZnRFZGdlRGlyKGVkZ2VEaXIpLCBxdWVyeUVkZ2UtPmdldERpcigpKSkgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGJveF90IHF1ZXJ5RWRnZVNwYW5Cb3g7Ci0gICAgICAgIGdldEVkZ2VTcGFuQm94KHF1ZXJ5U2VnLCBxdWVyeUVkZ2UtPmdldERpcigpLCBxdWVyeUVkZ2UtPmdldFNwYW4oKSwgcXVlcnlFZGdlU3BhbkJveCk7Ci0gICAgICAgIGlmICghYmc6OmludGVyc2VjdHMocXVlcnlFZGdlU3BhbkJveCwgdHJpZ0JveDEpKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgYm94X3Qgb3ZlcmxhcEJveDsKLSAgICAgICAgICBiZzo6aW50ZXJzZWN0aW9uKHF1ZXJ5RWRnZVNwYW5Cb3gsIHRyaWdCb3gxLCBvdmVybGFwQm94KTsKLSAgICAgICAgICBpZiAoYmc6OmFyZWEob3ZlcmxhcEJveCkgPT0gMCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIGxlZnQgaXMgdHJpZ2dlcmVkCi0gICAgICAgIGlzTGVmdFRyaWdnZXJlZCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgLy8gY2hlY2sgcmlnaHQKLSAgICAgIGZvciAoYXV0byAmcXVlcnlTZWdFZGdlOiB0cmlnQm94MlF1ZXJ5UmVzdWx0KSB7Ci0gICAgICAgIGF1dG8gJnF1ZXJ5U2VnID0gcXVlcnlTZWdFZGdlLmZpcnN0OwotICAgICAgICBhdXRvICZxdWVyeUVkZ2UgPSBxdWVyeVNlZ0VkZ2Uuc2Vjb25kOwotICAgICAgICAvLyBvbmx5IG9wcG9zaXRlLWRpciBlZGdlcyBhcmUgY291bnRlZCBhcyBwcmwgdmlvbGF0aW9uCi0gICAgICAgIGlmICghaXNPcHBvc2l0ZURpcihyaWdodEVkZ2VEaXIoZWRnZURpciksIHF1ZXJ5RWRnZS0+Z2V0RGlyKCkpKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgYm94X3QgcXVlcnlFZGdlU3BhbkJveDsKLSAgICAgICAgZ2V0RWRnZVNwYW5Cb3gocXVlcnlTZWcsIHF1ZXJ5RWRnZS0+Z2V0RGlyKCksIHF1ZXJ5RWRnZS0+Z2V0U3BhbigpLCBxdWVyeUVkZ2VTcGFuQm94KTsKLSAgICAgICAgaWYgKCFiZzo6aW50ZXJzZWN0cyhxdWVyeUVkZ2VTcGFuQm94LCB0cmlnQm94MikpIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBib3hfdCBvdmVybGFwQm94OwotICAgICAgICAgIGJnOjppbnRlcnNlY3Rpb24ocXVlcnlFZGdlU3BhbkJveCwgdHJpZ0JveDIsIG92ZXJsYXBCb3gpOwotICAgICAgICAgIGlmIChiZzo6YXJlYShvdmVybGFwQm94KSA9PSAwKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gbGVmdCBpcyB0cmlnZ2VyZWQKLSAgICAgICAgaXNSaWdodFRyaWdnZXJlZCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKChjb25zdHJhaW50LT5oYXNUd29FZGdlcygpICYmIChpc1JpZ2h0VHJpZ2dlcmVkICYmIGlzTGVmdFRyaWdnZXJlZCkpIHx8Ci0gICAgICAgICAgKCFjb25zdHJhaW50LT5oYXNUd29FZGdlcygpICYmIChpc1JpZ2h0VHJpZ2dlcmVkIHx8IGlzTGVmdFRyaWdnZXJlZCkpICkgewotICAgICAgICBpc1RyaWdnZXJlZCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gY2hlY2sgZW9sIHNwYWNpbmcgaWYgaXQgaXMgdHJpZ2dlcmVkCi0gICAgaWYgKGlzVHJpZ2dlcmVkKSB7Ci0gICAgICBnZXRFT0xUZXN0Qm94KHNlZywgZWRnZSwgZW9sU3BhY2UsIGVvbFdpdGhpbiwgdGVzdEJveCk7Ci0gICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c2VnbWVudF90LCBEUkNFZGdlKj4gPiBlZGdlUXVlcnlSZXN1bHQ7Ci0gICAgICBlZGdlUlRyZWUucXVlcnkoYmdpOjppbnRlcnNlY3RzKHRlc3RCb3gpLCBiYWNrX2luc2VydGVyKGVkZ2VRdWVyeVJlc3VsdCkpOwotICAgICAgLy8gc3RkOjpjb3V0IDw8ICIgIGNoZWNrIGVkZ2UgKCIgPDwgYmc6OmdldDwwLDA+KHNlZykgLyBkYnUgPDwgIiwgIiA8PCBiZzo6Z2V0PDAsMT4oc2VnKSAvIGRidQotICAgICAgLy8gICAgICAgICAgICAgPDwgIikgLS0gKCIgPDwgYmc6OmdldDwxLDA+KHNlZykgLyBkYnUgPDwgIiwgIiA8PCBiZzo6Z2V0PDEsMT4oc2VnKSAvIGRidQotICAgICAgLy8gICAgICAgICAgICAgPDwgIikgKCIgPDwgaW50KGVkZ2UtPmdldERpcigpKSA8PCAiKSwgdHlwZSA9ICIgPDwgKGludCllZGdlLT5nZXRUeXBlKCkgPDwgIiwgcXVlcnlCb3ggPSAoIiAKLSAgICAgIC8vICAgICAgICAgICAgIDw8IGJnOjpnZXQ8Ymc6Om1pbl9jb3JuZXIsIDA+KHRlc3RCb3gpIC8gZGJ1IDw8ICIsICIgPDwgYmc6OmdldDxiZzo6bWluX2Nvcm5lciwgMT4odGVzdEJveCkgLyBkYnUgPDwgIikgLS0gKCIKLSAgICAgIC8vICAgICAgICAgICAgIDw8IGJnOjpnZXQ8Ymc6Om1heF9jb3JuZXIsIDA+KHRlc3RCb3gpIC8gZGJ1IDw8ICIsICIgPDwgYmc6OmdldDxiZzo6bWF4X2Nvcm5lciwgMT4odGVzdEJveCkgLyBkYnUgPDwgIilcbiI7IAotICAgICAgZm9yIChhdXRvICZxdWVyeVNlZ0VkZ2U6IGVkZ2VRdWVyeVJlc3VsdCkgewotICAgICAgICBhdXRvICZxdWVyeVNlZyA9IHF1ZXJ5U2VnRWRnZS5maXJzdDsKLSAgICAgICAgYXV0byAmcXVlcnlFZGdlID0gcXVlcnlTZWdFZGdlLnNlY29uZDsKLSAgICAgICAgaW50IG5ldElkMSA9IGVkZ2UtPmdldE5ldElkKCk7Ci0gICAgICAgIGludCBuZXRJZDIgPSBxdWVyeUVkZ2UtPmdldE5ldElkKCk7Ci0gICAgICAgIGlmICh0YXJnZXROZXRJZCAhPSAtMSAmJiB0YXJnZXROZXRJZCAhPSBuZXRJZDEgJiYgdGFyZ2V0TmV0SWQgIT0gbmV0SWQyKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gb25seSBvcHBvc2l0ZS1kaXIgZWRnZXMgYXJlIGNvdW50ZWQgYXMgZW9sIHZpb2xhdGlvbgotICAgICAgICBpZiAoIWlzT3Bwb3NpdGVEaXIoZWRnZURpciwgcXVlcnlFZGdlLT5nZXREaXIoKSkpIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBib3hfdCBxdWVyeUVkZ2VTcGFuQm94OwotICAgICAgICBnZXRFZGdlU3BhbkJveChxdWVyeVNlZywgcXVlcnlFZGdlLT5nZXREaXIoKSwgcXVlcnlFZGdlLT5nZXRTcGFuKCksIHF1ZXJ5RWRnZVNwYW5Cb3gpOwotICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgIiAgICBhZ2FpbnN0IGVkZ2UgKCIgPDwgYmc6OmdldDwwLDA+KHF1ZXJ5U2VnKSAvIGRidSA8PCAiLCAiIDw8IGJnOjpnZXQ8MCwxPihxdWVyeVNlZykgLyBkYnUKLSAgICAgICAgLy8gICAgICAgICAgIDw8ICIpIC0tICgiIDw8IGJnOjpnZXQ8MSwwPihxdWVyeVNlZykgLyBkYnUgPDwgIiwgIiA8PCBiZzo6Z2V0PDEsMT4ocXVlcnlTZWcpIC8gZGJ1Ci0gICAgICAgIC8vICAgICAgICAgICA8PCAiKSAoIiA8PCBpbnQoZWRnZS0+Z2V0RGlyKCkpIDw8ICIpLCB0eXBlID0gIiA8PCAoaW50KXF1ZXJ5RWRnZS0+Z2V0VHlwZSgpIDw8ICIsIHNwYW5Cb3ggPSAoIiAKLSAgICAgICAgLy8gICAgICAgICAgIDw8IGJnOjpnZXQ8Ymc6Om1pbl9jb3JuZXIsIDA+KHF1ZXJ5RWRnZVNwYW5Cb3gpIC8gZGJ1IDw8ICIsICIgPDwgYmc6OmdldDxiZzo6bWluX2Nvcm5lciwgMT4ocXVlcnlFZGdlU3BhbkJveCkgLyBkYnUgPDwgIikgLS0gKCIKLSAgICAgICAgLy8gICAgICAgICAgIDw8IGJnOjpnZXQ8Ymc6Om1heF9jb3JuZXIsIDA+KHF1ZXJ5RWRnZVNwYW5Cb3gpIC8gZGJ1IDw8ICIsICIgPDwgYmc6OmdldDxiZzo6bWF4X2Nvcm5lciwgMT4ocXVlcnlFZGdlU3BhbkJveCkgLyBkYnUgPDwgIilcbiI7Ci0gICAgICAgIGlmICghYmc6OmludGVyc2VjdHMocXVlcnlFZGdlU3BhbkJveCwgdGVzdEJveCkpIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBib3hfdCBvdmVybGFwQm94OwotICAgICAgICAgIGJnOjppbnRlcnNlY3Rpb24ocXVlcnlFZGdlU3BhbkJveCwgdGVzdEJveCwgb3ZlcmxhcEJveCk7Ci0gICAgICAgICAgaWYgKGJnOjphcmVhKG92ZXJsYXBCb3gpID09IDApIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBpdCBpcyBhIHZpb2xhdGlvbgotICAgICAgICBpZiAoZWRnZS0+Z2V0VHlwZSgpID09IGRyY0VkZ2VUeXBlRW51bTo6RklYRUQgJiYgcXVlcnlFZGdlLT5nZXRUeXBlKCkgPT0gZHJjRWRnZVR5cGVFbnVtOjpGSVhFRCkgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIHN0ZDo6Y291dCA8PCAiZW9sIHZpb2xhdGlvbiBiZXR3ZWVuIGVkZ2UgKCIgPDwgYmc6OmdldDwwLDA+KHNlZykgLyBkYnUgPDwgIiwgIiA8PCBiZzo6Z2V0PDAsMT4oc2VnKSAvIGRidQotICAgICAgICAvLyAgICAgICAgICAgPDwgIikgLS0gKCIgPDwgYmc6OmdldDwxLDA+KHNlZykgLyBkYnUgPDwgIiwgIiA8PCBiZzo6Z2V0PDEsMT4oc2VnKSAvIGRidQotICAgICAgICAvLyAgICAgICAgICAgPDwgIikgYW5kIGVkZ2UgKCIgPDwgYmc6OmdldDwwLDA+KHF1ZXJ5U2VnKSAvIGRidSA8PCAiLCAiIDw8IGJnOjpnZXQ8MCwxPihxdWVyeVNlZykgLyBkYnUKLSAgICAgICAgLy8gICAgICAgICAgIDw8ICIpIC0tICgiIDw8IGJnOjpnZXQ8MSwwPihxdWVyeVNlZykgLyBkYnUgPDwgIiwgIiA8PCBiZzo6Z2V0PDEsMT4ocXVlcnlTZWcpIC8gZGJ1IDw8ICIpXG4iOwotICAgICAgICBSZWN0YW5nbGUgcXVlcnlFZGdlU3BhblJlY3Q7Ci0gICAgICAgIGdldEVkZ2VTcGFuUmVjdChxdWVyeVNlZywgcXVlcnlFZGdlLT5nZXREaXIoKSwgcXVlcnlFZGdlLT5nZXRTcGFuKCksIHF1ZXJ5RWRnZVNwYW5SZWN0KTsKLSAgICAgICAgUmVjdGFuZ2xlIGdhcFJlY3QgPSBnZW5lcmFsaXplZF9pbnRlcnNlY3QocXVlcnlFZGdlU3BhblJlY3QsIHNlZ1NwYW5SZWN0KTsKLSAgICAgICAgCi0gICAgICAgIGJvb2wgaXNWaW8gPSB0cnVlOwotCi0gICAgICAgIGJveF90IGVvbFZpb1F1ZXJ5Qm94KHBvaW50X3QoeGwoZ2FwUmVjdCksIHlsKGdhcFJlY3QpKSwgcG9pbnRfdCh4aChnYXBSZWN0KSwgeWgoZ2FwUmVjdCkpKTsKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGJveF90LCBpbnQ+ID4gZW9sUXVlcnlSZXN1bHQ7Ci0gICAgICAgIGF1dG8gJm1lcmdlZFJUcmVlID0gbGF5ZXIyTWVyZ2VkUlRyZWVbZWRnZS0+Z2V0TGF5ZXJOdW0oKV07Ci0gICAgICAgIG1lcmdlZFJUcmVlLnF1ZXJ5KGJnaTo6aW50ZXJzZWN0cyhlb2xWaW9RdWVyeUJveCksIGJhY2tfaW5zZXJ0ZXIoZW9sUXVlcnlSZXN1bHQpKTsKLSAgICAgICAgCi0KLSAgICAgICAgZm9yIChhdXRvICZlb2xWaW9QYWlyOiBlb2xRdWVyeVJlc3VsdCkgewotICAgICAgICAgIGlmIChlb2xWaW9QYWlyLnNlY29uZCAhPSBuZXRJZDEgJiYgZW9sVmlvUGFpci5zZWNvbmQgIT0gbmV0SWQyKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGJnOjpjb3ZlcmVkX2J5KGVvbFZpb1F1ZXJ5Qm94LCBlb2xWaW9QYWlyLmZpcnN0KSkgewotICAgICAgICAgICAgaXNWaW8gPSBmYWxzZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc1ZpbykgewotICAgICAgICAgIGZyTWFya2VyIGVvbFZpb01hcmtlcjsKLSAgICAgICAgICBmckJveCBlb2xWaW9Cb3goeGwoZ2FwUmVjdCksIHlsKGdhcFJlY3QpLCB4aChnYXBSZWN0KSwgeWgoZ2FwUmVjdCkpOwotICAgICAgICAgIGVvbFZpb01hcmtlci5zZXRDb25zdHJhaW50KGNvbnN0cmFpbnQpOwotICAgICAgICAgIGVvbFZpb01hcmtlci5zZXRCQm94KGVvbFZpb0JveCk7Ci0gICAgICAgICAgZW9sVmlvTWFya2VyLnNldExheWVyTnVtKGVkZ2UtPmdldExheWVyTnVtKCkpOwotICAgICAgICAgIC8vIGVvbFZpb01hcmtlci5hZGROZXQoZHJjTmV0c1tlZGdlLT5nZXROZXRJZCgpXS0+Z2V0TmV0KCkpOwotICAgICAgICAgIC8vIGVvbFZpb01hcmtlci5hZGROZXQoZHJjTmV0c1txdWVyeUVkZ2UtPmdldE5ldElkKCldLT5nZXROZXQoKSk7Ci0gICAgICAgICAgZW9sVmlvTWFya2VyLmFkZFNyYyhkcmNOZXRzW2VkZ2UtPmdldE5ldElkKCldLT5nZXRTcmMoKSk7Ci0gICAgICAgICAgZW9sVmlvTWFya2VyLmFkZFNyYyhkcmNOZXRzW3F1ZXJ5RWRnZS0+Z2V0TmV0SWQoKV0tPmdldFNyYygpKTsKLQotICAgICAgICAgIG1hcmtlcnMucHVzaF9iYWNrKGVvbFZpb01hcmtlcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLQotICB9Ci0KLQotfQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kcmMvZnJEUkNfc2V0dXAuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZHJjL2ZyRFJDX3NldHVwLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE1ZWI0Ny4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kcmMvZnJEUkNfc2V0dXAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDkyICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJkcmMvZnJEUkMuaCIKLSNpbmNsdWRlICJpby9mclNoYXBlVXRpbC5oIgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxpdGVyYXRvcj4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxjaHJvbm8+Ci0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ubzsKLXVzaW5nIG5hbWVzcGFjZSBib29zdDo6cG9seWdvbjo6b3BlcmF0b3JzOwotCi0KLXZvaWQgZnI6OkRSQ1dvcmtlcjo6c2V0dXAoKSB7Ci0gIHNldHVwRWRnZVJUcmVlKCk7Ci0gIC8vIHByaW50RWRnZVJUcmVlKCk7Ci0gIHNldHVwTWF4UmVjdFJUcmVlKCk7Ci19Ci0KLXZvaWQgZnI6OkRSQ1dvcmtlcjo6c2V0dXBFZGdlUlRyZWUoKSB7Ci0gIGZvciAoYXV0byAmZHJjTmV0OiBkcmNOZXRzKSB7Ci0gICAgc2V0dXBFZGdlUlRyZWVfbmV0KGRyY05ldC5nZXQoKSk7Ci0gIH0KLX0KLQotdm9pZCBmcjo6RFJDV29ya2VyOjpzZXR1cEVkZ2VSVHJlZV9uZXQoRFJDTmV0KiBuZXQpIHsKLSAgLy8gZG91YmxlIGRidSA9IGRlc2lnbi0+Z2V0VGVjaCgpLT5nZXREQlVQZXJVVSgpOwotICBpbnQgbmV0SWQgPSBuZXQtPmdldElkKCk7Ci0gIHN0ZDo6bWFwPGZyTGF5ZXJOdW0sIHN0ZDo6bWFwPGZyQ29vcmQsIGJvb3N0OjppY2w6OmludGVydmFsX3NldDxmckNvb3JkPiA+ID4gbGF5ZXIySG9yekVkZ2VJbnR2U2V0LCBsYXllcjJWZXJ0RWRnZUludHZTZXQ7IC8vIEhvcnpFZGdlOiBtYXBwZWQgZnJvbSB5TG9jCi0gIHN0ZDo6bWFwPGZyTGF5ZXJOdW0sIHN0ZDo6bWFwPGZyQ29vcmQsIGJvb3N0OjppY2w6OmludGVydmFsX3NldDxmckNvb3JkPiA+ID4gbGF5ZXIyTWVyZ2VkSG9yekVkZ2VJbnR2U2V0LCBsYXllcjJNZXJnZWRWZXJ0RWRnZUludHZTZXQ7IC8vIEhvcnpFZGdlOiBtYXBwZWQgZnJvbSB5TG9jCi0gIHN0ZDo6c2V0PGZyTGF5ZXJOdW0+IGxheWVyTnVtczsKLSAgc3RkOjptYXA8ZnJMYXllck51bSwgUG9seWdvblNldD4gbGF5ZXIyTWVyZ2VkUG9seVNldDsKLSAgYXV0byAmbGF5ZXIyRml4ZWRQb2x5U2V0ID0gbmV0LT5nZXRMYXllcjJGaXhlZFBvbHlTZXQoKTsKLSAgYXV0byAmbGF5ZXIyUm91dGVQb2x5U2V0ID0gbmV0LT5nZXRMYXllcjJSb3V0ZVBvbHlTZXQoKTsKLSAgYXV0byAmbGF5ZXIyU2VnMkVkZ2UgPSBuZXQtPmdldExheWVyU2VnRWRnZU1hcCgpOwotCi0gIC8vIGdldCBzZXQgb2YgbWVyZ2VkIGxheWVyTnVtcwotICBmb3IgKGF1dG8gaXQgPSBsYXllcjJGaXhlZFBvbHlTZXQuYmVnaW4oKTsgaXQgIT0gbGF5ZXIyRml4ZWRQb2x5U2V0LmVuZCgpOyArK2l0KSB7Ci0gICAgbGF5ZXJOdW1zLmluc2VydChpdC0+Zmlyc3QpOwotICB9Ci0gIGZvciAoYXV0byBpdCA9IGxheWVyMlJvdXRlUG9seVNldC5iZWdpbigpOyBpdCAhPSBsYXllcjJSb3V0ZVBvbHlTZXQuZW5kKCk7ICsraXQpIHsKLSAgICBsYXllck51bXMuaW5zZXJ0KGl0LT5maXJzdCk7Ci0gIH0KLQotICAvLyBidWlsZCBmaXhlZCBlZGdlIGludHYgc2V0Ci0gIGZvciAoYXV0byBpdCA9IGxheWVyMkZpeGVkUG9seVNldC5iZWdpbigpOyBpdCAhPSBsYXllcjJGaXhlZFBvbHlTZXQuZW5kKCk7ICsraXQpIHsKLSAgICBmckxheWVyTnVtIGxheWVyTnVtID0gaXQtPmZpcnN0OwotICAgIGZvciAoYXV0byAmb3JpZ1BvbHk6IGl0LT5zZWNvbmQpIHsKLSAgICAgIHN0ZDo6dmVjdG9yPFBvbHlnb24+IHBvbHlzOwotICAgICAgZ2V0UG9seVdpdGhIb2xlKG9yaWdQb2x5LCBwb2x5cyk7Ci0gICAgICBpZiAoIXBvbHlzLmVtcHR5KCkgJiYgd2luZGluZyhwb2x5cy5iYWNrKCkpICE9IGJvb3N0Ojpwb2x5Z29uOjpMT1cpIHsKLSAgICAgICAgc3RkOjpjb3V0IDw8ICJFcnJvcjogb3V0bGluZSBwb2x5IG11c3QgYmUgY2xvY2t3aXNlXG4iOwotICAgICAgfQotICAgICAgZm9yIChhdXRvICZwb2x5OnBvbHlzKSB7Ci0gICAgICAgIGZyVmVjdG9yPFBvaW50PiB2ZXJ0aWNlczsKLSAgICAgICAgZm9yIChhdXRvIHB0SXQgPSBiZWdpbl9wb2ludHMocG9seSk7IHB0SXQgIT0gZW5kX3BvaW50cyhwb2x5KTsgKytwdEl0KSB7Ci0gICAgICAgICAgdmVydGljZXMucHVzaF9iYWNrKCpwdEl0KTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpdmVydGljZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICBhdXRvIHB0MSA9IHZlcnRpY2VzW2ldOwotICAgICAgICAgIGF1dG8gcHQyID0gKChpICsgMSkgPT0gKGludCl2ZXJ0aWNlcy5zaXplKCkpID8gdmVydGljZXNbMF0gOiB2ZXJ0aWNlc1tpICsgMV07Ci0gICAgICAgICAgLy8gYWx3YXlzIGZyb20gc21hbGxlciBwdCB0byBsYXJnZXIgcHQKLSAgICAgICAgICBpZiAocHQxID4gcHQyKSB7Ci0gICAgICAgICAgICBhdXRvIHRtcFB0ID0gcHQyOwotICAgICAgICAgICAgcHQyID0gcHQxOwotICAgICAgICAgICAgcHQxID0gdG1wUHQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIGluc2VydCB0byBpbnR2IHNldAotICAgICAgICAgIGlmIChwdDEueCgpID09IHB0Mi54KCkpIHsKLSAgICAgICAgICAgIC8vIHZlcnRpY2FsIGludHYKLSAgICAgICAgICAgIGF1dG8gZWRnZUludHYgPSBib29zdDo6aWNsOjppbnRlcnZhbDxmckNvb3JkPjo6aW50ZXJ2YWxfdHlwZTo6cmlnaHRfb3BlbihwdDEueSgpLCBwdDIueSgpKTsKLSAgICAgICAgICAgIGxheWVyMlZlcnRFZGdlSW50dlNldFtsYXllck51bV1bcHQxLngoKV0uaW5zZXJ0KGVkZ2VJbnR2KTsKLSAgICAgICAgICB9IGVsc2UgaWYgKHB0MS55KCkgPT0gcHQyLnkoKSkgewotICAgICAgICAgICAgLy8gaG9yaXpvbnRhbCBpbnR2Ci0gICAgICAgICAgICBhdXRvIGVkZ2VJbnR2ID0gYm9vc3Q6OmljbDo6aW50ZXJ2YWw8ZnJDb29yZD46OmludGVydmFsX3R5cGU6OnJpZ2h0X29wZW4ocHQxLngoKSwgcHQyLngoKSk7Ci0gICAgICAgICAgICBsYXllcjJIb3J6RWRnZUludHZTZXRbbGF5ZXJOdW1dW3B0MS55KCldLmluc2VydChlZGdlSW50dik7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiRXJyb3I6IG5vbi1jb2xpbmVhciBwdHMgaW4gc2V0dXBFZGdlUlRyZWVfbmV0LCBza2lwcGVkXG4iOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gZ2V0IGxheWVyMk1lcmdlZFBvbHlTZXQKLSAgZm9yIChhdXRvIGxheWVyTnVtOiBsYXllck51bXMpIHsKLSAgICBpZiAobGF5ZXIyRml4ZWRQb2x5U2V0LmZpbmQobGF5ZXJOdW0pICE9IGxheWVyMkZpeGVkUG9seVNldC5lbmQoKSkgewotICAgICAgbGF5ZXIyTWVyZ2VkUG9seVNldFtsYXllck51bV0gKz0gbGF5ZXIyRml4ZWRQb2x5U2V0W2xheWVyTnVtXTsKLSAgICB9Ci0gICAgaWYgKGxheWVyMlJvdXRlUG9seVNldC5maW5kKGxheWVyTnVtKSAhPSBsYXllcjJSb3V0ZVBvbHlTZXQuZW5kKCkpIHsKLSAgICAgIGxheWVyMk1lcmdlZFBvbHlTZXRbbGF5ZXJOdW1dICs9IGxheWVyMlJvdXRlUG9seVNldFtsYXllck51bV07Ci0gICAgfQotICB9Ci0KLSAgLy8gYnVpbGQgbWVyZ2VkIGVkZ2UgaW50diBzZXQKLSAgZm9yIChhdXRvIGl0ID0gbGF5ZXIyTWVyZ2VkUG9seVNldC5iZWdpbigpOyBpdCAhPSBsYXllcjJNZXJnZWRQb2x5U2V0LmVuZCgpOyArK2l0KSB7Ci0gICAgZnJMYXllck51bSBsYXllck51bSA9IGl0LT5maXJzdDsKLSAgICBmb3IgKGF1dG8gJm9yaWdQb2x5OiBpdC0+c2Vjb25kKSB7Ci0gICAgICBzdGQ6OnZlY3RvcjxQb2x5Z29uPiBwb2x5czsKLSAgICAgIGdldFBvbHlXaXRoSG9sZShvcmlnUG9seSwgcG9seXMpOwotICAgICAgaWYgKCFwb2x5cy5lbXB0eSgpICYmIHdpbmRpbmcocG9seXMuYmFjaygpKSAhPSBib29zdDo6cG9seWdvbjo6TE9XKSB7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCAiRXJyb3I6IG91dGxpbmUgcG9seSBtdXN0IGJlIGNsb2Nrd2lzZVxuIjsKLSAgICAgIH0KLSAgICAgIGZvciAoYXV0byAmcG9seTogcG9seXMpIHsKLSAgICAgICAgZnJWZWN0b3I8UG9pbnQ+IHZlcnRpY2VzOwotICAgICAgICBmb3IgKGF1dG8gcHRJdCA9IGJlZ2luX3BvaW50cyhwb2x5KTsgcHRJdCAhPSBlbmRfcG9pbnRzKHBvbHkpOyArK3B0SXQpIHsKLSAgICAgICAgICB2ZXJ0aWNlcy5wdXNoX2JhY2soKnB0SXQpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCl2ZXJ0aWNlcy5zaXplKCk7ICsraSkgewotICAgICAgICAgIGF1dG8gcHQxID0gdmVydGljZXNbaV07Ci0gICAgICAgICAgYXV0byBwdDIgPSAoKGkgKyAxKSA9PSAoaW50KXZlcnRpY2VzLnNpemUoKSkgPyB2ZXJ0aWNlc1swXSA6IHZlcnRpY2VzW2kgKyAxXTsKLSAgICAgICAgICAvLyBhbHdheXMgZnJvbSBzbWFsbGVyIHB0IHRvIGxhcmdlciBwdAotICAgICAgICAgIGlmIChwdDEgPiBwdDIpIHsKLSAgICAgICAgICAgIGF1dG8gdG1wUHQgPSBwdDI7Ci0gICAgICAgICAgICBwdDIgPSBwdDE7Ci0gICAgICAgICAgICBwdDEgPSB0bXBQdDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gaW5zZXJ0IHRvIGludHYgc2V0Ci0gICAgICAgICAgaWYgKHB0MS54KCkgPT0gcHQyLngoKSkgewotICAgICAgICAgICAgLy8gdmVydGljYWwgaW50dgotICAgICAgICAgICAgYXV0byBlZGdlSW50diA9IGJvb3N0OjppY2w6OmludGVydmFsPGZyQ29vcmQ+OjppbnRlcnZhbF90eXBlOjpyaWdodF9vcGVuKHB0MS55KCksIHB0Mi55KCkpOwotICAgICAgICAgICAgbGF5ZXIyTWVyZ2VkVmVydEVkZ2VJbnR2U2V0W2xheWVyTnVtXVtwdDEueCgpXS5pbnNlcnQoZWRnZUludHYpOwotICAgICAgICAgIH0gZWxzZSBpZiAocHQxLnkoKSA9PSBwdDIueSgpKSB7Ci0gICAgICAgICAgICAvLyBob3Jpem9udGFsIGludHYKLSAgICAgICAgICAgIGF1dG8gZWRnZUludHYgPSBib29zdDo6aWNsOjppbnRlcnZhbDxmckNvb3JkPjo6aW50ZXJ2YWxfdHlwZTo6cmlnaHRfb3BlbihwdDEueCgpLCBwdDIueCgpKTsKLSAgICAgICAgICAgIGxheWVyMk1lcmdlZEhvcnpFZGdlSW50dlNldFtsYXllck51bV1bcHQxLnkoKV0uaW5zZXJ0KGVkZ2VJbnR2KTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJFcnJvcjogbm9uLWNvbGluZWFyIHB0cyBpbiBzZXR1cEVkZ2VSVHJlZV9uZXQsIHNraXBwZWRcbiI7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIC8vIGJ1aWxkIGVkZ2VzIAotICBmb3IgKGF1dG8gaXQgPSBsYXllcjJNZXJnZWRQb2x5U2V0LmJlZ2luKCk7IGl0ICE9IGxheWVyMk1lcmdlZFBvbHlTZXQuZW5kKCk7ICsraXQpIHsKLSAgICBmckxheWVyTnVtIGxheWVyTnVtID0gaXQtPmZpcnN0OwotICAgIGF1dG8gJnBvbHlTZXQgPSBpdC0+c2Vjb25kOwotICAgIC8vIHRoZSBwb2x5IG1heSBoYXZlIGhvbGUsIG5lZWQgdG8gY2FsbCBnZXRQb2x5V2l0aEhvbGUKLSAgICBmb3IgKGF1dG8gJm9yaWdQb2x5OiBwb2x5U2V0KSB7Ci0gICAgICBzdGQ6OnZlY3RvcjxQb2x5Z29uPiBwb2x5czsKLSAgICAgIGdldFBvbHlXaXRoSG9sZShvcmlnUG9seSwgcG9seXMpOwotICAgICAgaWYgKCFwb2x5cy5lbXB0eSgpICYmIHdpbmRpbmcocG9seXMuYmFjaygpKSAhPSBib29zdDo6cG9seWdvbjo6TE9XKSB7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCAiRXJyb3I6IG91dGxpbmUgcG9seSBtdXN0IGJlIGNsb2Nrd2lzZVxuIjsKLSAgICAgIH0KLSAgICAgIC8vIHRoZSBsYXN0IG9uZSBpcyBvdXRsaW5lIGFuZCB0aGUgb3RoZXJzIGFyZSBob2xlcwotICAgICAgZm9yIChhdXRvICZwb2x5OiBwb2x5cykgewotICAgICAgICAvLyBidWlsZCBlZGdlIGJhc2VkIG9uIHBvbHlnb24KLSAgICAgICAgLy8gc3RkOjpjb3V0IDw8ICJAQEAgbmV3IHBvbHlAQEBcbiI7Ci0gICAgICAgIGZyVmVjdG9yPFBvaW50PiB2ZXJ0aWNlczsKLSAgICAgICAgZnJWZWN0b3I8U2VnbWVudD4gc2VnbWVudHM7Ci0gICAgICAgIGZvciAoYXV0byBwdEl0ID0gYmVnaW5fcG9pbnRzKHBvbHkpOyBwdEl0ICE9IGVuZF9wb2ludHMocG9seSk7ICsrcHRJdCkgewotICAgICAgICAgIHZlcnRpY2VzLnB1c2hfYmFjaygqcHRJdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KXZlcnRpY2VzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgYXV0byBwdDEgPSB2ZXJ0aWNlc1tpXTsKLSAgICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgIkBAQGRlYnVnQEBAOiB2aXNpdCB2ZXJ0ZXggKCIgPDwgcHQxLngoKSAvIGRidSA8PCAiLCAiIDw8IHB0MS55KCkgLyBkYnUgPDwgIilcbiI7Ci0gICAgICAgICAgYXV0byBwdDIgPSAoKGkgKyAxKSA9PSAoaW50KXZlcnRpY2VzLnNpemUoKSkgPyB2ZXJ0aWNlc1swXSA6IHZlcnRpY2VzW2kgKyAxXTsKLSAgICAgICAgICBTZWdtZW50IGRpcmVjdGVkRWRnZVNlZyhwdDEsIHB0Mik7Ci0gICAgICAgICAgLy8gYWx3YXlzIGZyb20gc21hbGxlciBwdCB0byBsYXJnZXIgcHQKLSAgICAgICAgICBpZiAocHQxID4gcHQyKSB7Ci0gICAgICAgICAgICBhdXRvIHRtcFB0ID0gcHQyOwotICAgICAgICAgICAgcHQyID0gcHQxOwotICAgICAgICAgICAgcHQxID0gdG1wUHQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIGNyZWF0ZSBuZXcgZWRnZXMKLSAgICAgICAgICBib29sIGlzRml4ZWQgPSBmYWxzZTsKLSAgICAgICAgICBib29sIGlzSG9yaXpvbnRhbCA9IChwdDEueSgpID09IHB0Mi55KCkpOwotICAgICAgICAgIERSQ0VkZ2UgKmRyY0VkZ2UgPSBuZXQtPmFkZERSQ0VkZ2UoKTsKLSAgICAgICAgICBTZWdtZW50IGRyY0VkZ2VTZWcocHQxLCBwdDIpOwotICAgICAgICAgIHNlZ21lbnRzLnB1c2hfYmFjayhkcmNFZGdlU2VnKTsKLSAgICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgIkBAQGRlYnVnQEBAOiBhZGQgZWRnZSAoIiA8PCBwdDEueCgpIC8gZGJ1IDw8ICIsICIgPDwgcHQxLnkoKSAvIGRidSAKLSAgICAgICAgICAvLyAgICAgICAgICAgPDwgIikgLS0gKCIgPDwgcHQyLngoKSAvIGRidSA8PCAiLCAiIDw8IHB0Mi55KCkgLyBkYnUgPDwgIilcbiI7Ci0gICAgICAgICAgbGF5ZXIyU2VnMkVkZ2VbbGF5ZXJOdW1dW2RyY0VkZ2VTZWddID0gZHJjRWRnZTsKLSAgICAgICAgICBkcmNFZGdlLT5zZXRJZChuZXRJZCk7Ci0gICAgICAgICAgZHJjRWRnZS0+c2V0U2VnbWVudChkaXJlY3RlZEVkZ2VTZWcpOwotICAgICAgICAgIGRyY0VkZ2UtPnNldExheWVyTnVtKGxheWVyTnVtKTsKLSAgICAgICAgICBkcmNFZGdlLT5zZXRXaW5kaW5nKHdpbmRpbmcocG9seSkpOwotICAgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgdGhpcyBpcyBmaXhlZCBlZGdlCi0gICAgICAgICAgaWYgKGlzSG9yaXpvbnRhbCkgewotICAgICAgICAgICAgYXV0byB0ZW1wSW50diA9IGJvb3N0OjppY2w6OmludGVydmFsPGZyQ29vcmQ+OjppbnRlcnZhbF90eXBlOjpyaWdodF9vcGVuKHB0MS54KCksIHB0Mi54KCkpOwotICAgICAgICAgICAgaWYgKGxheWVyMkhvcnpFZGdlSW50dlNldC5maW5kKGxheWVyTnVtKSA9PSBsYXllcjJIb3J6RWRnZUludHZTZXQuZW5kKCkgfHwKLSAgICAgICAgICAgICAgICBsYXllcjJIb3J6RWRnZUludHZTZXRbbGF5ZXJOdW1dLmZpbmQocHQxLnkoKSkgPT0gbGF5ZXIySG9yekVkZ2VJbnR2U2V0W2xheWVyTnVtXS5lbmQoKSB8fAotICAgICAgICAgICAgICAgICghYm9vc3Q6OmljbDo6Y29udGFpbnMobGF5ZXIySG9yekVkZ2VJbnR2U2V0W2xheWVyTnVtXVtwdDEueSgpXSwgdGVtcEludHYpKSkgewotICAgICAgICAgICAgICBpc0ZpeGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBpc0ZpeGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXV0byB0ZW1wSW50diA9IGJvb3N0OjppY2w6OmludGVydmFsPGZyQ29vcmQ+OjppbnRlcnZhbF90eXBlOjpyaWdodF9vcGVuKHB0MS55KCksIHB0Mi55KCkpOwotICAgICAgICAgICAgaWYgKGxheWVyMlZlcnRFZGdlSW50dlNldC5maW5kKGxheWVyTnVtKSA9PSBsYXllcjJWZXJ0RWRnZUludHZTZXQuZW5kKCkgfHwKLSAgICAgICAgICAgICAgICBsYXllcjJWZXJ0RWRnZUludHZTZXRbbGF5ZXJOdW1dLmZpbmQocHQxLngoKSkgPT0gbGF5ZXIyVmVydEVkZ2VJbnR2U2V0W2xheWVyTnVtXS5lbmQoKSB8fAotICAgICAgICAgICAgICAgICghYm9vc3Q6OmljbDo6Y29udGFpbnMobGF5ZXIyVmVydEVkZ2VJbnR2U2V0W2xheWVyTnVtXVtwdDEueCgpXSwgdGVtcEludHYpKSkgewotICAgICAgICAgICAgICBpc0ZpeGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBpc0ZpeGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoaXNGaXhlZCkgewotICAgICAgICAgICAgZHJjRWRnZS0+c2V0VHlwZShkcmNFZGdlVHlwZUVudW06OkZJWEVEKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZHJjRWRnZS0+c2V0VHlwZShkcmNFZGdlVHlwZUVudW06OlJPVVRFKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gZGlyLCBwcmV2LCBuZXh0LCBzcGFuIHdpbGwgYmUgc2V0IGxhdGVyCi0gICAgICAgIH0KLSAgICAgICAgLy8gc2V0IHByZXYgbmV4dCBwb2ludGVyCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClzZWdtZW50cy5zaXplKCk7ICsraSkgewotICAgICAgICAgIERSQ0VkZ2UqIGRyY0VkZ2UgPSBsYXllcjJTZWcyRWRnZVtsYXllck51bV1bc2VnbWVudHNbaV1dOwotICAgICAgICAgIERSQ0VkZ2UgKm5leHREUkNFZGdlLCAqcHJldkRSQ0VkZ2U7Ci0gICAgICAgICAgLy8gaWYgKHdpbmRpbmcocG9seSkgPT0gYm9vc3Q6OnBvbHlnb246OkxPVykgewotICAgICAgICAgICAgbmV4dERSQ0VkZ2UgPSBsYXllcjJTZWcyRWRnZVtsYXllck51bV1bc2VnbWVudHNbKGkrMSkgJSAoKGludClzZWdtZW50cy5zaXplKCkpXV07Ci0gICAgICAgICAgICBwcmV2RFJDRWRnZSA9IGxheWVyMlNlZzJFZGdlW2xheWVyTnVtXVtzZWdtZW50c1soaS0xKyhpbnQpc2VnbWVudHMuc2l6ZSgpKSAlICgoaW50KXNlZ21lbnRzLnNpemUoKSldXTsKLSAgICAgICAgICAvLyB9IGVsc2UgewotICAgICAgICAgIC8vICAgbmV4dERSQ0VkZ2UgPSBsYXllcjJTZWcyRWRnZVtsYXllck51bV1bc2VnbWVudHNbKGktMSsoaW50KXNlZ21lbnRzLnNpemUoKSkgJSAoKGludClzZWdtZW50cy5zaXplKCkpXV07Ci0gICAgICAgICAgLy8gICBwcmV2RFJDRWRnZSA9IGxheWVyMlNlZzJFZGdlW2xheWVyTnVtXVtzZWdtZW50c1soaSsxKSAlICgoaW50KXNlZ21lbnRzLnNpemUoKSldXTsKLSAgICAgICAgICAvLyB9Ci0gICAgICAgICAgZHJjRWRnZS0+c2V0TmV4dChuZXh0RFJDRWRnZSk7Ci0gICAgICAgICAgZHJjRWRnZS0+c2V0UHJldihwcmV2RFJDRWRnZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gYnVpbGQgZWRnZSBiYXNlZCBtYXggcmVjdGFuZ2xlcwotICAgICAgc3RkOjp2ZWN0b3I8UmVjdGFuZ2xlPiBtYXhSZWN0czsKLSAgICAgIFBvbHlnb25TZXQgdG1wUG9seVNldDsKLSAgICAgIHRtcFBvbHlTZXQgKz0gb3JpZ1BvbHk7Ci0gICAgICBnZXRfbWF4X3JlY3RhbmdsZXMobWF4UmVjdHMsIHRtcFBvbHlTZXQpOwotICAgICAgZm9yIChhdXRvIHJlY3Q6IG1heFJlY3RzKSB7Ci0gICAgICAgIGZyQ29vcmQgaG9yelNwYW4gPSB4aChyZWN0KSAtIHhsKHJlY3QpOwotICAgICAgICBmckNvb3JkIHZlcnRTcGFuID0geWgocmVjdCkgLSB5bChyZWN0KTsKLSAgICAgICAgLy8gbGVmdCBzaWRlCi0gICAgICAgIFNlZ21lbnQgbGVmdFNlZyhsbChyZWN0KSwgdWwocmVjdCkpOwotICAgICAgICBhdXRvIGxlZnRJbnR2ID0gYm9vc3Q6OmljbDo6aW50ZXJ2YWw8ZnJDb29yZD46OmludGVydmFsX3R5cGU6OnJpZ2h0X29wZW4oeWwocmVjdCksIHloKHJlY3QpKTsKLSAgICAgICAgYXV0byBpbnR2SXRSZXNMZWZ0ID0gbGF5ZXIyTWVyZ2VkVmVydEVkZ2VJbnR2U2V0W2xheWVyTnVtXVt4bChyZWN0KV0uZXF1YWxfcmFuZ2UobGVmdEludHYpOwotICAgICAgICBmb3IgKGF1dG8gaW50dkl0ID0gaW50dkl0UmVzTGVmdC5maXJzdDsgaW50dkl0ICE9IGludHZJdFJlc0xlZnQuc2Vjb25kOyArK2ludHZJdCkgewotICAgICAgICAgIGF1dG8gJnNlZ0ludHYgPSAqaW50dkl0OwotICAgICAgICAgIC8vIHVwZGF0ZSBleGlzdGluZyBlZGdlCi0gICAgICAgICAgaWYgKGJvb3N0OjppY2w6OmNvbnRhaW5zKGxlZnRJbnR2LCBzZWdJbnR2KSkgewotICAgICAgICAgICAgU2VnbWVudCBkcmNFZGdlU2VnKFBvaW50KHhsKHJlY3QpLCBpbnR2SXQtPmxvd2VyKCkpLCBQb2ludCh4bChyZWN0KSwgaW50dkl0LT51cHBlcigpKSk7Ci0gICAgICAgICAgICBEUkNFZGdlKiBkcmNFZGdlID0gbGF5ZXIyU2VnMkVkZ2VbbGF5ZXJOdW1dW2RyY0VkZ2VTZWddOwotICAgICAgICAgICAgZHJjRWRnZS0+c2V0RGlyKGZyRGlyRW51bTo6Vyk7Ci0gICAgICAgICAgICBpZiAoZHJjRWRnZS0+Z2V0U3BhbigpIDwgaG9yelNwYW4pIHsKLSAgICAgICAgICAgICAgZHJjRWRnZS0+c2V0U3Bhbihob3J6U3Bhbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmckNvb3JkIHRtcFdpZHRoID0gc3RkOjptaW4odmVydFNwYW4sIGhvcnpTcGFuKTsKLSAgICAgICAgICAgIGlmIChkcmNFZGdlLT5nZXRXaWR0aCgpIDwgdG1wV2lkdGgpIHsKLSAgICAgICAgICAgICAgZHJjRWRnZS0+c2V0V2lkdGgodG1wV2lkdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBhZGQgbmV3IGVkZ2UgaWYgYW55Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBEUkNFZGdlICpkcmNFZGdlID0gbmV0LT5hZGREUkNFZGdlKCk7Ci0gICAgICAgICAgICBhdXRvIG92bHBJbnR2ID0gYm9vc3Q6OmljbDo6aW50ZXJ2YWw8ZnJDb29yZD46OmludGVydmFsX3R5cGU6OnJpZ2h0X29wZW4oc3RkOjptYXgoaW50dkl0LT5sb3dlcigpLCBsZWZ0SW50di5sb3dlcigpKSwgc3RkOjptaW4oaW50dkl0LT51cHBlcigpLCBsZWZ0SW50di51cHBlcigpKSk7Ci0gICAgICAgICAgICBTZWdtZW50IG92bHBFZGdlU2VnKFBvaW50KHhsKHJlY3QpLCBvdmxwSW50di5sb3dlcigpKSxQb2ludCh4bChyZWN0KSwgb3ZscEludHYudXBwZXIoKSkpOwotICAgICAgICAgICAgbGF5ZXIyU2VnMkVkZ2VbbGF5ZXJOdW1dW292bHBFZGdlU2VnXSA9IGRyY0VkZ2U7Ci0gICAgICAgICAgICBkcmNFZGdlLT5zZXRJZChuZXRJZCk7Ci0gICAgICAgICAgICBkcmNFZGdlLT5zZXRTZWdtZW50KG92bHBFZGdlU2VnKTsKLSAgICAgICAgICAgIGRyY0VkZ2UtPnNldExheWVyTnVtKGxheWVyTnVtKTsKLSAgICAgICAgICAgIGlmIChib29zdDo6aWNsOjpjb250YWlucyhsYXllcjJWZXJ0RWRnZUludHZTZXRbbGF5ZXJOdW1dW3hsKHJlY3QpXSwgb3ZscEludHYpKSB7Ci0gICAgICAgICAgICAgIGRyY0VkZ2UtPnNldFR5cGUoZHJjRWRnZVR5cGVFbnVtOjpGSVhFRCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBkcmNFZGdlLT5zZXRUeXBlKGRyY0VkZ2VUeXBlRW51bTo6Uk9VVEUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZHJjRWRnZS0+c2V0RGlyKGZyRGlyRW51bTo6Vyk7Ci0gICAgICAgICAgICBkcmNFZGdlLT5zZXRTcGFuKGhvcnpTcGFuKTsKLSAgICAgICAgICAgIGZyQ29vcmQgdG1wV2lkdGggPSBzdGQ6Om1pbih2ZXJ0U3BhbiwgaG9yelNwYW4pOwotICAgICAgICAgICAgZHJjRWRnZS0+c2V0V2lkdGgodG1wV2lkdGgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGJvdHRvbSBzaWRlCi0gICAgICAgIFNlZ21lbnQgYm90dG9tU2VnKGxsKHJlY3QpLCBscihyZWN0KSk7Ci0gICAgICAgIGF1dG8gYm90dG9tSW50diA9IGJvb3N0OjppY2w6OmludGVydmFsPGZyQ29vcmQ+OjppbnRlcnZhbF90eXBlOjpyaWdodF9vcGVuKHhsKHJlY3QpLCB4aChyZWN0KSk7Ci0gICAgICAgIGF1dG8gaW50dkl0UmVzQm90dG9tID0gbGF5ZXIyTWVyZ2VkSG9yekVkZ2VJbnR2U2V0W2xheWVyTnVtXVt5bChyZWN0KV0uZXF1YWxfcmFuZ2UoYm90dG9tSW50dik7Ci0gICAgICAgIGZvciAoYXV0byBpbnR2SXQgPSBpbnR2SXRSZXNCb3R0b20uZmlyc3Q7IGludHZJdCAhPSBpbnR2SXRSZXNCb3R0b20uc2Vjb25kOyArK2ludHZJdCkgewotICAgICAgICAgIGF1dG8gJnNlZ0ludHYgPSAqaW50dkl0OwotICAgICAgICAgIC8vIHVwZGF0ZSBleGlzdGluZyBlZGdlCi0gICAgICAgICAgaWYgKGJvb3N0OjppY2w6OmNvbnRhaW5zKGJvdHRvbUludHYsIHNlZ0ludHYpKSB7Ci0gICAgICAgICAgICBTZWdtZW50IGRyY0VkZ2VTZWcoUG9pbnQoaW50dkl0LT5sb3dlcigpLCB5bChyZWN0KSksIFBvaW50KGludHZJdC0+dXBwZXIoKSwgeWwocmVjdCkpKTsKLSAgICAgICAgICAgIERSQ0VkZ2UqIGRyY0VkZ2UgPSBsYXllcjJTZWcyRWRnZVtsYXllck51bV1bZHJjRWRnZVNlZ107Ci0gICAgICAgICAgICBkcmNFZGdlLT5zZXREaXIoZnJEaXJFbnVtOjpTKTsKLSAgICAgICAgICAgIGlmIChkcmNFZGdlLT5nZXRTcGFuKCkgPCB2ZXJ0U3BhbikgewotICAgICAgICAgICAgICBkcmNFZGdlLT5zZXRTcGFuKHZlcnRTcGFuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyQ29vcmQgdG1wV2lkdGggPSBzdGQ6Om1pbih2ZXJ0U3BhbiwgaG9yelNwYW4pOwotICAgICAgICAgICAgaWYgKGRyY0VkZ2UtPmdldFdpZHRoKCkgPCB0bXBXaWR0aCkgewotICAgICAgICAgICAgICBkcmNFZGdlLT5zZXRXaWR0aCh0bXBXaWR0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIGFkZCBuZXcgZWRnZSBpZiBhbnkKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIERSQ0VkZ2UgKmRyY0VkZ2UgPSBuZXQtPmFkZERSQ0VkZ2UoKTsKLSAgICAgICAgICAgIGF1dG8gb3ZscEludHYgPSBib29zdDo6aWNsOjppbnRlcnZhbDxmckNvb3JkPjo6aW50ZXJ2YWxfdHlwZTo6cmlnaHRfb3BlbihzdGQ6Om1heChpbnR2SXQtPmxvd2VyKCksIGJvdHRvbUludHYubG93ZXIoKSksIHN0ZDo6bWluKGludHZJdC0+dXBwZXIoKSwgYm90dG9tSW50di51cHBlcigpKSk7Ci0gICAgICAgICAgICBTZWdtZW50IG92bHBFZGdlU2VnKFBvaW50KG92bHBJbnR2Lmxvd2VyKCksIHlsKHJlY3QpKSxQb2ludChvdmxwSW50di51cHBlcigpLCB5bChyZWN0KSkpOwotICAgICAgICAgICAgbGF5ZXIyU2VnMkVkZ2VbbGF5ZXJOdW1dW292bHBFZGdlU2VnXSA9IGRyY0VkZ2U7Ci0gICAgICAgICAgICBkcmNFZGdlLT5zZXRJZChuZXRJZCk7Ci0gICAgICAgICAgICBkcmNFZGdlLT5zZXRTZWdtZW50KG92bHBFZGdlU2VnKTsKLSAgICAgICAgICAgIGRyY0VkZ2UtPnNldExheWVyTnVtKGxheWVyTnVtKTsKLSAgICAgICAgICAgIGlmIChib29zdDo6aWNsOjpjb250YWlucyhsYXllcjJIb3J6RWRnZUludHZTZXRbbGF5ZXJOdW1dW3lsKHJlY3QpXSwgb3ZscEludHYpKSB7Ci0gICAgICAgICAgICAgIGRyY0VkZ2UtPnNldFR5cGUoZHJjRWRnZVR5cGVFbnVtOjpGSVhFRCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBkcmNFZGdlLT5zZXRUeXBlKGRyY0VkZ2VUeXBlRW51bTo6Uk9VVEUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZHJjRWRnZS0+c2V0RGlyKGZyRGlyRW51bTo6Uyk7Ci0gICAgICAgICAgICBkcmNFZGdlLT5zZXRTcGFuKHZlcnRTcGFuKTsKLSAgICAgICAgICAgIGZyQ29vcmQgdG1wV2lkdGggPSBzdGQ6Om1pbih2ZXJ0U3BhbiwgaG9yelNwYW4pOwotICAgICAgICAgICAgZHJjRWRnZS0+c2V0V2lkdGgodG1wV2lkdGgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgLy8gcmlnaHQgc2lkZQotICAgICAgICBTZWdtZW50IHJpZ2h0U2VnKGxyKHJlY3QpLCB1cihyZWN0KSk7Ci0gICAgICAgIGF1dG8gcmlnaHRJbnR2ID0gYm9vc3Q6OmljbDo6aW50ZXJ2YWw8ZnJDb29yZD46OmludGVydmFsX3R5cGU6OnJpZ2h0X29wZW4oeWwocmVjdCksIHloKHJlY3QpKTsKLSAgICAgICAgYXV0byBpbnR2SXRSZXNSaWdodCA9IGxheWVyMk1lcmdlZFZlcnRFZGdlSW50dlNldFtsYXllck51bV1beGgocmVjdCldLmVxdWFsX3JhbmdlKHJpZ2h0SW50dik7Ci0gICAgICAgIGZvciAoYXV0byBpbnR2SXQgPSBpbnR2SXRSZXNSaWdodC5maXJzdDsgaW50dkl0ICE9IGludHZJdFJlc1JpZ2h0LnNlY29uZDsgKytpbnR2SXQpIHsKLSAgICAgICAgICBhdXRvICZzZWdJbnR2ID0gKmludHZJdDsKLSAgICAgICAgICAvLyB1cGRhdGUgZXhpc3RpbmcgZWRnZQotICAgICAgICAgIGlmIChib29zdDo6aWNsOjpjb250YWlucyhyaWdodEludHYsIHNlZ0ludHYpKSB7Ci0gICAgICAgICAgICBTZWdtZW50IGRyY0VkZ2VTZWcoUG9pbnQoeGgocmVjdCksIGludHZJdC0+bG93ZXIoKSksIFBvaW50KHhoKHJlY3QpLCBpbnR2SXQtPnVwcGVyKCkpKTsKLSAgICAgICAgICAgIERSQ0VkZ2UqIGRyY0VkZ2UgPSBsYXllcjJTZWcyRWRnZVtsYXllck51bV1bZHJjRWRnZVNlZ107Ci0gICAgICAgICAgICBkcmNFZGdlLT5zZXREaXIoZnJEaXJFbnVtOjpFKTsKLSAgICAgICAgICAgIGlmIChkcmNFZGdlLT5nZXRTcGFuKCkgPCBob3J6U3BhbikgewotICAgICAgICAgICAgICBkcmNFZGdlLT5zZXRTcGFuKGhvcnpTcGFuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyQ29vcmQgdG1wV2lkdGggPSBzdGQ6Om1pbih2ZXJ0U3BhbiwgaG9yelNwYW4pOwotICAgICAgICAgICAgaWYgKGRyY0VkZ2UtPmdldFdpZHRoKCkgPCB0bXBXaWR0aCkgewotICAgICAgICAgICAgICBkcmNFZGdlLT5zZXRXaWR0aCh0bXBXaWR0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIGFkZCBuZXcgZWRnZSBpZiBhbnkKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIERSQ0VkZ2UgKmRyY0VkZ2UgPSBuZXQtPmFkZERSQ0VkZ2UoKTsKLSAgICAgICAgICAgIGF1dG8gb3ZscEludHYgPSBib29zdDo6aWNsOjppbnRlcnZhbDxmckNvb3JkPjo6aW50ZXJ2YWxfdHlwZTo6cmlnaHRfb3BlbihzdGQ6Om1heChpbnR2SXQtPmxvd2VyKCksIHJpZ2h0SW50di5sb3dlcigpKSwgc3RkOjptaW4oaW50dkl0LT51cHBlcigpLCByaWdodEludHYudXBwZXIoKSkpOwotICAgICAgICAgICAgU2VnbWVudCBvdmxwRWRnZVNlZyhQb2ludCh4aChyZWN0KSwgb3ZscEludHYubG93ZXIoKSksUG9pbnQoeGgocmVjdCksIG92bHBJbnR2LnVwcGVyKCkpKTsKLSAgICAgICAgICAgIGxheWVyMlNlZzJFZGdlW2xheWVyTnVtXVtvdmxwRWRnZVNlZ10gPSBkcmNFZGdlOwotICAgICAgICAgICAgZHJjRWRnZS0+c2V0SWQobmV0SWQpOwotICAgICAgICAgICAgZHJjRWRnZS0+c2V0U2VnbWVudChvdmxwRWRnZVNlZyk7Ci0gICAgICAgICAgICBkcmNFZGdlLT5zZXRMYXllck51bShsYXllck51bSk7Ci0gICAgICAgICAgICBpZiAoYm9vc3Q6OmljbDo6Y29udGFpbnMobGF5ZXIyVmVydEVkZ2VJbnR2U2V0W2xheWVyTnVtXVt4aChyZWN0KV0sIG92bHBJbnR2KSkgewotICAgICAgICAgICAgICBkcmNFZGdlLT5zZXRUeXBlKGRyY0VkZ2VUeXBlRW51bTo6RklYRUQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgZHJjRWRnZS0+c2V0VHlwZShkcmNFZGdlVHlwZUVudW06OlJPVVRFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRyY0VkZ2UtPnNldERpcihmckRpckVudW06OkUpOwotICAgICAgICAgICAgZHJjRWRnZS0+c2V0U3Bhbihob3J6U3Bhbik7Ci0gICAgICAgICAgICBmckNvb3JkIHRtcFdpZHRoID0gc3RkOjptaW4odmVydFNwYW4sIGhvcnpTcGFuKTsKLSAgICAgICAgICAgIGRyY0VkZ2UtPnNldFdpZHRoKHRtcFdpZHRoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8vIHRvcCBzaWRlCi0gICAgICAgIFNlZ21lbnQgdG9wU2VnKHVsKHJlY3QpLCB1cihyZWN0KSk7Ci0gICAgICAgIGF1dG8gdG9wSW50diA9IGJvb3N0OjppY2w6OmludGVydmFsPGZyQ29vcmQ+OjppbnRlcnZhbF90eXBlOjpyaWdodF9vcGVuKHhsKHJlY3QpLCB4aChyZWN0KSk7Ci0gICAgICAgIGF1dG8gaW50dkl0UmVzVG9wID0gbGF5ZXIyTWVyZ2VkSG9yekVkZ2VJbnR2U2V0W2xheWVyTnVtXVt5aChyZWN0KV0uZXF1YWxfcmFuZ2UodG9wSW50dik7Ci0gICAgICAgIGZvciAoYXV0byBpbnR2SXQgPSBpbnR2SXRSZXNUb3AuZmlyc3Q7IGludHZJdCAhPSBpbnR2SXRSZXNUb3Auc2Vjb25kOyArK2ludHZJdCkgewotICAgICAgICAgIGF1dG8gJnNlZ0ludHYgPSAqaW50dkl0OwotICAgICAgICAgIC8vIHVwZGF0ZSBleGlzdGluZyBlZGdlCi0gICAgICAgICAgaWYgKGJvb3N0OjppY2w6OmNvbnRhaW5zKHRvcEludHYsIHNlZ0ludHYpKSB7Ci0gICAgICAgICAgICBTZWdtZW50IGRyY0VkZ2VTZWcoUG9pbnQoaW50dkl0LT5sb3dlcigpLCB5aChyZWN0KSksIFBvaW50KGludHZJdC0+dXBwZXIoKSwgeWgocmVjdCkpKTsKLSAgICAgICAgICAgIERSQ0VkZ2UqIGRyY0VkZ2UgPSBsYXllcjJTZWcyRWRnZVtsYXllck51bV1bZHJjRWRnZVNlZ107Ci0gICAgICAgICAgICBkcmNFZGdlLT5zZXREaXIoZnJEaXJFbnVtOjpOKTsKLSAgICAgICAgICAgIGlmIChkcmNFZGdlLT5nZXRTcGFuKCkgPCB2ZXJ0U3BhbikgewotICAgICAgICAgICAgICBkcmNFZGdlLT5zZXRTcGFuKHZlcnRTcGFuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyQ29vcmQgdG1wV2lkdGggPSBzdGQ6Om1pbih2ZXJ0U3BhbiwgaG9yelNwYW4pOwotICAgICAgICAgICAgaWYgKGRyY0VkZ2UtPmdldFdpZHRoKCkgPCB0bXBXaWR0aCkgewotICAgICAgICAgICAgICBkcmNFZGdlLT5zZXRXaWR0aCh0bXBXaWR0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIGFkZCBuZXcgZWRnZSBpZiBhbnkKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIERSQ0VkZ2UgKmRyY0VkZ2UgPSBuZXQtPmFkZERSQ0VkZ2UoKTsKLSAgICAgICAgICAgIGF1dG8gb3ZscEludHYgPSBib29zdDo6aWNsOjppbnRlcnZhbDxmckNvb3JkPjo6aW50ZXJ2YWxfdHlwZTo6cmlnaHRfb3BlbihzdGQ6Om1heChpbnR2SXQtPmxvd2VyKCksIHRvcEludHYubG93ZXIoKSksIHN0ZDo6bWluKGludHZJdC0+dXBwZXIoKSwgdG9wSW50di51cHBlcigpKSk7Ci0gICAgICAgICAgICBTZWdtZW50IG92bHBFZGdlU2VnKFBvaW50KG92bHBJbnR2Lmxvd2VyKCksIHloKHJlY3QpKSxQb2ludChvdmxwSW50di51cHBlcigpLCB5aChyZWN0KSkpOwotICAgICAgICAgICAgbGF5ZXIyU2VnMkVkZ2VbbGF5ZXJOdW1dW292bHBFZGdlU2VnXSA9IGRyY0VkZ2U7Ci0gICAgICAgICAgICBkcmNFZGdlLT5zZXRJZChuZXRJZCk7Ci0gICAgICAgICAgICBkcmNFZGdlLT5zZXRTZWdtZW50KG92bHBFZGdlU2VnKTsKLSAgICAgICAgICAgIGRyY0VkZ2UtPnNldExheWVyTnVtKGxheWVyTnVtKTsKLSAgICAgICAgICAgIGlmIChib29zdDo6aWNsOjpjb250YWlucyhsYXllcjJIb3J6RWRnZUludHZTZXRbbGF5ZXJOdW1dW3loKHJlY3QpXSwgb3ZscEludHYpKSB7Ci0gICAgICAgICAgICAgIGRyY0VkZ2UtPnNldFR5cGUoZHJjRWRnZVR5cGVFbnVtOjpGSVhFRCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBkcmNFZGdlLT5zZXRUeXBlKGRyY0VkZ2VUeXBlRW51bTo6Uk9VVEUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZHJjRWRnZS0+c2V0RGlyKGZyRGlyRW51bTo6Tik7Ci0gICAgICAgICAgICBkcmNFZGdlLT5zZXRTcGFuKHZlcnRTcGFuKTsKLSAgICAgICAgICAgIGZyQ29vcmQgdG1wV2lkdGggPSBzdGQ6Om1pbih2ZXJ0U3BhbiwgaG9yelNwYW4pOwotICAgICAgICAgICAgZHJjRWRnZS0+c2V0V2lkdGgodG1wV2lkdGgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBwdXNoIGVkZ2VzIHRvIFJUcmVlCi0gIGZvciAoYXV0byBsYXllckl0ID0gbGF5ZXIyU2VnMkVkZ2UuYmVnaW4oKTsgbGF5ZXJJdCAhPSBsYXllcjJTZWcyRWRnZS5lbmQoKTsgKytsYXllckl0KSB7Ci0gICAgZnJMYXllck51bSBsYXllck51bSA9IGxheWVySXQtPmZpcnN0OwotICAgIGF1dG8gJnNlZzJFZGdlID0gbGF5ZXJJdC0+c2Vjb25kOwotICAgIGZvciAoYXV0byBzZWdJdCA9IHNlZzJFZGdlLmJlZ2luKCk7IHNlZ0l0ICE9IHNlZzJFZGdlLmVuZCgpOyArK3NlZ0l0KSB7Ci0gICAgICBhdXRvICZlZGdlU2VnID0gc2VnSXQtPmZpcnN0OwotICAgICAgc2VnbWVudF90IHJ0cmVlU2VnKHBvaW50X3QobG93KGVkZ2VTZWcpLngoKSwgbG93KGVkZ2VTZWcpLnkoKSksIHBvaW50X3QoaGlnaChlZGdlU2VnKS54KCksIGhpZ2goZWRnZVNlZykueSgpKSk7Ci0gICAgICBsYXllcjJFZGdlUlRyZWVbbGF5ZXJOdW1dLmluc2VydChzdGQ6Om1ha2VfcGFpcihydHJlZVNlZywgc2VnSXQtPnNlY29uZCkpOwotICAgIH0KLSAgfQotfQotCi12b2lkIGZyOjpEUkNXb3JrZXI6OnNldHVwTWF4UmVjdFJUcmVlKCkgewotICBmb3IgKGF1dG8gJmRyY05ldDogZHJjTmV0cykgewotICAgIHNldHVwTWF4UmVjdFJUcmVlX25ldChkcmNOZXQuZ2V0KCkpOwotICB9Ci19Ci0KLXZvaWQgZnI6OkRSQ1dvcmtlcjo6c2V0dXBNYXhSZWN0UlRyZWVfbmV0KERSQ05ldCogbmV0KSB7Ci0gIGludCBuZXRJZCA9IG5ldC0+Z2V0SWQoKTsKLSAgc3RkOjpzZXQ8ZnJMYXllck51bT4gbGF5ZXJOdW1zOwotICBzdGQ6Om1hcDxmckxheWVyTnVtLCBQb2x5Z29uU2V0PiBsYXllcjJNZXJnZWRQb2x5U2V0OwotICBhdXRvICZsYXllcjJGaXhlZFBvbHlTZXQgPSBuZXQtPmdldExheWVyMkZpeGVkUG9seVNldCgpOwotICBhdXRvICZsYXllcjJSb3V0ZVBvbHlTZXQgPSBuZXQtPmdldExheWVyMlJvdXRlUG9seVNldCgpOwotICAKLSAgLy8gYnVpbGQgZml4ZWRSVHJlZQotICB1cGRhdGVNYXhSZWN0UnRyZWUobmV0SWQsIGxheWVyMkZpeGVkUG9seVNldCwgbGF5ZXIyRml4ZWRSVHJlZSk7Ci0KLSAgLy8gYnVpbGQgbWVyZ2VkUlRyZWUKLQotICAvLyBnZXQgc2V0IG9mIG1lcmdlZCBsYXllck51bXMKLSAgZm9yIChhdXRvIGl0ID0gbGF5ZXIyRml4ZWRQb2x5U2V0LmJlZ2luKCk7IGl0ICE9IGxheWVyMkZpeGVkUG9seVNldC5lbmQoKTsgKytpdCkgewotICAgIGxheWVyTnVtcy5pbnNlcnQoaXQtPmZpcnN0KTsKLSAgfQotICBmb3IgKGF1dG8gaXQgPSBsYXllcjJSb3V0ZVBvbHlTZXQuYmVnaW4oKTsgaXQgIT0gbGF5ZXIyUm91dGVQb2x5U2V0LmVuZCgpOyArK2l0KSB7Ci0gICAgbGF5ZXJOdW1zLmluc2VydChpdC0+Zmlyc3QpOwotICB9Ci0KLSAgZm9yIChhdXRvIGxheWVyTnVtOiBsYXllck51bXMpIHsKLSAgICBpZiAobGF5ZXIyRml4ZWRQb2x5U2V0LmZpbmQobGF5ZXJOdW0pICE9IGxheWVyMkZpeGVkUG9seVNldC5lbmQoKSkgewotICAgICAgbGF5ZXIyTWVyZ2VkUG9seVNldFtsYXllck51bV0gKz0gbGF5ZXIyRml4ZWRQb2x5U2V0W2xheWVyTnVtXTsKLSAgICB9Ci0gICAgaWYgKGxheWVyMlJvdXRlUG9seVNldC5maW5kKGxheWVyTnVtKSAhPSBsYXllcjJSb3V0ZVBvbHlTZXQuZW5kKCkpIHsKLSAgICAgIGxheWVyMk1lcmdlZFBvbHlTZXRbbGF5ZXJOdW1dICs9IGxheWVyMlJvdXRlUG9seVNldFtsYXllck51bV07Ci0gICAgfQotICB9Ci0gIHVwZGF0ZU1heFJlY3RSdHJlZShuZXRJZCwgbGF5ZXIyTWVyZ2VkUG9seVNldCwgbGF5ZXIyTWVyZ2VkUlRyZWUpOwotCi19Ci0KLXZvaWQgZnI6OkRSQ1dvcmtlcjo6dXBkYXRlTWF4UmVjdFJ0cmVlKGludCBuZXRJZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxmckxheWVyTnVtLCBQb2x5Z29uU2V0PiAmbGF5ZXIyUG9seVNldCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxmckxheWVyTnVtLCBiZ2k6OnJ0cmVlPHN0ZDo6cGFpcjxib3hfdCwgaW50PiwgYmdpOjpxdWFkcmF0aWM8MTY+ID4gPiAmbWF4UmVjdFJUcmVlKSB7Ci0gIGZvciAoYXV0byBpdCA9IGxheWVyMlBvbHlTZXQuYmVnaW4oKTsgaXQgIT0gbGF5ZXIyUG9seVNldC5lbmQoKTsgKytpdCkgewotICAgIGZyTGF5ZXJOdW0gbGF5ZXJOdW0gPSBpdC0+Zmlyc3Q7Ci0gICAgYXV0byAmcG9seVNldCA9IGl0LT5zZWNvbmQ7Ci0gICAgc3RkOjp2ZWN0b3I8UmVjdGFuZ2xlPiBtYXhSZWN0czsKLSAgICBnZXRfbWF4X3JlY3RhbmdsZXMobWF4UmVjdHMsIHBvbHlTZXQpOwotICAgIGZvciAoYXV0byAmbWF4UmVjdDogbWF4UmVjdHMpIHsKLSAgICAgIGJveF90IGJvb3N0YiA9IGJveF90KHBvaW50X3QoeGwobWF4UmVjdCksIHlsKG1heFJlY3QpKSwgcG9pbnRfdCh4aChtYXhSZWN0KSwgeWgobWF4UmVjdCkpKTsKLSAgICAgIG1heFJlY3RSVHJlZVtsYXllck51bV0uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGJvb3N0YiwgbmV0SWQpKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RyYy9mckRSQ191dGlsLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2RyYy9mckRSQ191dGlsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc1MTI0Ni4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9kcmMvZnJEUkNfdXRpbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NTIgKzAsMCBAQAotLyogQXV0aG9yczogTHV0b25nIFdhbmcgYW5kIEJhbmdxaSBYdSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImRyYy9mckRSQy5oIgotI2luY2x1ZGUgImlvL2ZyU2hhcGVVdGlsLmgiCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPGl0ZXJhdG9yPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGNocm9ubz4KLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vOwotCi12b2lkIGZyOjpEUkNXb3JrZXI6OnByaW50RWRnZVJUcmVlKCkgewotICBkb3VibGUgZGJ1ID0gZGVzaWduLT5nZXRUZWNoKCktPmdldERCVVBlclVVKCk7Ci0gIGZvciAoYXV0byBtYXBJdCA9IGxheWVyMkVkZ2VSVHJlZS5iZWdpbigpOyBtYXBJdCAhPSBsYXllcjJFZGdlUlRyZWUuZW5kKCk7ICsrbWFwSXQpIHsKLSAgICAvLyBmckxheWVyTnVtIGxheWVyTnVtID0gbWFwSXQtPmZpcnN0OwotICAgIC8vIHN0ZDo6Y291dCA8PCAiICBsYXllck51bSA9ICIgPDwgbGF5ZXJOdW0gPDwgIlxuIjsKLSAgICBhdXRvICZlZGdlUlRyZWUgPSBtYXBJdC0+c2Vjb25kOwotICAgIGZvciAoYXV0byBydHJlZUl0ID0gZWRnZVJUcmVlLmJlZ2luKCk7IHJ0cmVlSXQgIT0gZWRnZVJUcmVlLmVuZCgpOyArK3J0cmVlSXQpIHsKLSAgICAgIHNlZ21lbnRfdCBzZWcgPSBydHJlZUl0LT5maXJzdDsKLSAgICAgIGF1dG8gZWRnZSA9IHJ0cmVlSXQtPnNlY29uZDsKLSAgICAgIHBvaW50X3QgcHQxKGJnOjpnZXQ8MCwwPihzZWcpLCBiZzo6Z2V0PDAsMT4oc2VnKSk7Ci0gICAgICBwb2ludF90IHB0MihiZzo6Z2V0PDEsMD4oc2VnKSwgYmc6OmdldDwxLDE+KHNlZykpOwotICAgICAgcG9pbnRfdCBsZWZ0UHQsIHJpZ2h0UHQ7Ci0gICAgICBpZiAoYmc6OmdldDwwPihwdDEpID4gYmc6OmdldDwwPihwdDIpIHx8IGJnOjpnZXQ8MT4ocHQxKSA+IGJnOjpnZXQ8MT4ocHQyKSkgewotICAgICAgICBsZWZ0UHQgPSBwdDI7Ci0gICAgICAgIHJpZ2h0UHQgPSBwdDE7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBsZWZ0UHQgPSBwdDE7Ci0gICAgICAgIHJpZ2h0UHQgPSBwdDI7Ci0gICAgICB9Ci0gICAgICBmckNvb3JkIGxseCA9IDAsIGxseSA9IDAsIHVyeCA9IDAsIHVyeSA9IDA7Ci0gICAgICBsbHggPSBiZzo6Z2V0PDA+KGxlZnRQdCk7Ci0gICAgICB1cnggPSBiZzo6Z2V0PDA+KHJpZ2h0UHQpOwotICAgICAgbGx5ID0gYmc6OmdldDwxPihsZWZ0UHQpOwotICAgICAgdXJ5ID0gYmc6OmdldDwxPihyaWdodFB0KTsKLSAgICAgIHN0ZDo6Y291dCA8PCAiICAgIG5ldCAiIDw8IGVkZ2UtPmdldE5ldElkKCkgPDwgIiAoIiA8PCBsbHggLyBkYnUgPDwgIiwgIiA8PCBsbHkgLyBkYnUKLSAgICAgICAgICAgICAgICA8PCAiKSAtICgiIDw8IHVyeCAvIGRidSA8PCAiLCAiIDw8IHVyeSAvIGRidSA8PCAiKSwgZGlyID0gIiA8PCAoaW50KWVkZ2UtPmdldERpcigpIAotICAgICAgICAgICAgICAgIDw8ICIsIGVkZ2VUeXBlID0gIiA8PCAoaW50KWVkZ2UtPmdldFR5cGUoKSA8PCAiXG4iOwotICAgIH0KLSAgfQotfQotCi0KLQotdm9pZCBmcjo6RFJDV29ya2VyOjpnZXRFZGdlU3BhblJlY3QoY29uc3Qgc2VnbWVudF90ICZzZWcsIGNvbnN0IGZyRGlyRW51bSAmZGlyLCBjb25zdCBmckNvb3JkICZzcGFuLCBSZWN0YW5nbGUgJmVkZ2VTcGFuUmVjdCkgewotICAvLyBkb3VibGUgZGJ1ID0gZGVzaWduLT5nZXRUZWNoKCktPmdldERCVVBlclVVKCk7Ci0gIHBvaW50X3QgbGVmdFB0LCByaWdodFB0OyAvLyBsZWZ0IGlzIHRoZSBzbWFsbGVyIG9uZSwgcmlnaHQgaXMgdGhlIGxhcmdlciBvbmUsIHRydWUgZm9yIHZlcnRpY2FsIGFzIHdlbGwKLSAgcG9pbnRfdCBwdDEoYmc6OmdldDwwLDA+KHNlZyksIGJnOjpnZXQ8MCwxPihzZWcpKTsKLSAgcG9pbnRfdCBwdDIoYmc6OmdldDwxLDA+KHNlZyksIGJnOjpnZXQ8MSwxPihzZWcpKTsKLSAgaWYgKGJnOjpnZXQ8MD4ocHQxKSA+IGJnOjpnZXQ8MD4ocHQyKSB8fCBiZzo6Z2V0PDE+KHB0MSkgPiBiZzo6Z2V0PDE+KHB0MikpIHsKLSAgICBsZWZ0UHQgPSBwdDI7Ci0gICAgcmlnaHRQdCA9IHB0MTsKLSAgfSBlbHNlIHsKLSAgICBsZWZ0UHQgPSBwdDE7Ci0gICAgcmlnaHRQdCA9IHB0MjsKLSAgfQotICAvLyBzdGQ6OmNvdXQgPDwgIiAgZ2V0RWRnZVNwYW5SZWN0OiBmcm9tICgiIDw8IGJnOjpnZXQ8MD4obGVmdFB0KSAvIGRidTw8ICIsICIgPDwgYmc6OmdldDwxPihsZWZ0UHQpIC8gZGJ1PDwgIikgdG8gIgotICAvLyAgICAgICAgICAgPDwgIigiIDw8IGJnOjpnZXQ8MD4ocmlnaHRQdCkgLyBkYnUgPDwgIiwgIiA8PCBiZzo6Z2V0PDE+KHJpZ2h0UHQpIC8gZGJ1IDw8ICIpXG4iOwotICBmckNvb3JkIGxseCA9IC0xLCBsbHkgPSAtMSwgdXJ4ID0gLTEsIHVyeSA9IC0xOwotICBpZiAoZGlyID09IGZyRGlyRW51bTo6RSkgewotICAgIHVyeCA9IGJnOjpnZXQ8MD4ocmlnaHRQdCk7Ci0gICAgbGx4ID0gdXJ4IC0gc3BhbjsKLSAgICBsbHkgPSBiZzo6Z2V0PDE+KGxlZnRQdCk7Ci0gICAgdXJ5ID0gYmc6OmdldDwxPihyaWdodFB0KTsKLSAgfSBlbHNlIGlmIChkaXIgPT0gZnJEaXJFbnVtOjpTKSB7Ci0gICAgbGx4ID0gYmc6OmdldDwwPihsZWZ0UHQpOwotICAgIHVyeCA9IGJnOjpnZXQ8MD4ocmlnaHRQdCk7Ci0gICAgbGx5ID0gYmc6OmdldDwxPihsZWZ0UHQpOwotICAgIHVyeSA9IGxseSArIHNwYW47Ci0gIH0gZWxzZSBpZiAoZGlyID09IGZyRGlyRW51bTo6VykgewotICAgIGxseCA9IGJnOjpnZXQ8MD4obGVmdFB0KTsKLSAgICB1cnggPSBsbHggKyBzcGFuOwotICAgIGxseSA9IGJnOjpnZXQ8MT4obGVmdFB0KTsKLSAgICB1cnkgPSBiZzo6Z2V0PDE+KHJpZ2h0UHQpOwotICB9IGVsc2UgaWYgKGRpciA9PSBmckRpckVudW06Ok4pIHsKLSAgICBsbHggPSBiZzo6Z2V0PDA+KGxlZnRQdCk7Ci0gICAgdXJ4ID0gYmc6OmdldDwwPihyaWdodFB0KTsKLSAgICB1cnkgPSBiZzo6Z2V0PDE+KGxlZnRQdCk7Ci0gICAgbGx5ID0gdXJ5IC0gc3BhbjsKLSAgfSBlbHNlIHsKLSAgICBzdGQ6OmNvdXQgPDwgIkVycm9yOiBVTktOT1dOIGVkZ2UgZGlyZWN0aW9uIGluIGdldEVkZ2VTcGFuUmVjdFxuIjsKLSAgfQotICAvLyBzdGQ6OmNvdXQgPDwgIiAgICIgPDwgbGx4IDw8ICIgIiA8PCBsbHkgPDwgIiAiIDw8IHVyeCA8PCAiICIgPDwgdXJ5IDw8ICJcbiI7Ci0gIGVkZ2VTcGFuUmVjdCA9IFJlY3RhbmdsZShsbHgsIGxseSwgdXJ4LCB1cnkpOwotfQotCi12b2lkIGZyOjpEUkNXb3JrZXI6OmdldEVkZ2VTcGFuQm94KGNvbnN0IHNlZ21lbnRfdCAmc2VnLCBjb25zdCBmckRpckVudW0gJmRpciwgY29uc3QgZnJDb29yZCAmc3BhbiwgYm94X3QgJmVkZ2VTcGFuQm94KSB7Ci0gIHBvaW50X3QgbGVmdFB0LCByaWdodFB0OyAvLyBsZWZ0IGlzIHRoZSBzbWFsbGVyIG9uZSwgcmlnaHQgaXMgdGhlIGxhcmdlciBvbmUsIHRydWUgZm9yIHZlcnRpY2FsIGFzIHdlbGwKLSAgcG9pbnRfdCBwdDEoYmc6OmdldDwwLDA+KHNlZyksIGJnOjpnZXQ8MCwxPihzZWcpKTsKLSAgcG9pbnRfdCBwdDIoYmc6OmdldDwxLDA+KHNlZyksIGJnOjpnZXQ8MSwxPihzZWcpKTsKLSAgaWYgKGJnOjpnZXQ8MD4ocHQxKSA+IGJnOjpnZXQ8MD4ocHQyKSB8fCBiZzo6Z2V0PDE+KHB0MSkgPiBiZzo6Z2V0PDE+KHB0MikpIHsKLSAgICBsZWZ0UHQgPSBwdDI7Ci0gICAgcmlnaHRQdCA9IHB0MTsKLSAgfSBlbHNlIHsKLSAgICBsZWZ0UHQgPSBwdDE7Ci0gICAgcmlnaHRQdCA9IHB0MjsKLSAgfQotICBmckNvb3JkIGxseCA9IDAsIGxseSA9IDAsIHVyeCA9IDAsIHVyeSA9IDA7Ci0gIGlmIChkaXIgPT0gZnJEaXJFbnVtOjpFKSB7Ci0gICAgdXJ4ID0gYmc6OmdldDwwPihsZWZ0UHQpOwotICAgIGxseCA9IHVyeCAtIHNwYW47Ci0gICAgbGx5ID0gYmc6OmdldDwxPihsZWZ0UHQpOwotICAgIHVyeSA9IGJnOjpnZXQ8MT4ocmlnaHRQdCk7Ci0gIH0gZWxzZSBpZiAoZGlyID09IGZyRGlyRW51bTo6UykgewotICAgIGxseCA9IGJnOjpnZXQ8MD4obGVmdFB0KTsKLSAgICB1cnggPSBiZzo6Z2V0PDA+KHJpZ2h0UHQpOwotICAgIGxseSA9IGJnOjpnZXQ8MT4obGVmdFB0KTsKLSAgICB1cnkgPSBsbHkgKyBzcGFuOwotICB9IGVsc2UgaWYgKGRpciA9PSBmckRpckVudW06OlcpIHsKLSAgICBsbHggPSBiZzo6Z2V0PDA+KGxlZnRQdCk7Ci0gICAgdXJ4ID0gbGx4ICsgc3BhbjsKLSAgICBsbHkgPSBiZzo6Z2V0PDE+KGxlZnRQdCk7Ci0gICAgdXJ5ID0gYmc6OmdldDwxPihyaWdodFB0KTsKLSAgfSBlbHNlIGlmIChkaXIgPT0gZnJEaXJFbnVtOjpOKSB7Ci0gICAgbGx4ID0gYmc6OmdldDwwPihsZWZ0UHQpOwotICAgIHVyeCA9IGJnOjpnZXQ8MD4ocmlnaHRQdCk7Ci0gICAgdXJ5ID0gYmc6OmdldDwxPihsZWZ0UHQpOwotICAgIGxseSA9IHVyeSAtIHNwYW47Ci0gIH0gZWxzZSB7Ci0gICAgc3RkOjpjb3V0IDw8ICJFcnJvcjogVU5LTk9XTiBlZGdlIGRpcmVjdGlvbiBpbiBnZXRFZGdlU3BhbkJveFxuIjsKLSAgfQotCi0gIGVkZ2VTcGFuQm94ID0gYm94X3QocG9pbnRfdChsbHgsIGxseSksIHBvaW50X3QodXJ4LCB1cnkpKTsKLX0KLQotYm9vbCBmcjo6RFJDV29ya2VyOjppc09wcG9zaXRlRGlyKGZyRGlyRW51bSBkaXIxLCBmckRpckVudW0gZGlyMikgewotICBpZiAoZGlyMSA9PSBmckRpckVudW06OkUgJiYgZGlyMiA9PSBmckRpckVudW06OlcgfHwgCi0gICAgICBkaXIxID09IGZyRGlyRW51bTo6UyAmJiBkaXIyID09IGZyRGlyRW51bTo6TiB8fCAKLSAgICAgIGRpcjEgPT0gZnJEaXJFbnVtOjpXICYmIGRpcjIgPT0gZnJEaXJFbnVtOjpFIHx8IAotICAgICAgZGlyMSA9PSBmckRpckVudW06Ok4gJiYgZGlyMiA9PSBmckRpckVudW06OlMpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotdm9pZCBmcjo6RFJDV29ya2VyOjpnZXRTcGFjaW5nVGFibGVUZXN0Qm94KGNvbnN0IHNlZ21lbnRfdCAmc2VnLCBEUkNFZGdlKiBwcmxFZGdlLCBmckNvb3JkIG1heFNwYWNpbmdWYWwsIGJveF90ICZ0ZXN0Qm94KSB7Ci0gIGF1dG8gZGlyID0gcHJsRWRnZS0+Z2V0RGlyKCk7Ci0gIHBvaW50X3QgbGVmdFB0LCByaWdodFB0OyAvLyBsZWZ0IGlzIHRoZSBzbWFsbGVyIG9uZSwgcmlnaHQgaXMgdGhlIGxhcmdlciBvbmUsIHRydWUgZm9yIHZlcnRpY2FsIGFzIHdlbGwKLSAgcG9pbnRfdCBwdDEoYmc6OmdldDwwLDA+KHNlZyksIGJnOjpnZXQ8MCwxPihzZWcpKTsKLSAgcG9pbnRfdCBwdDIoYmc6OmdldDwxLDA+KHNlZyksIGJnOjpnZXQ8MSwxPihzZWcpKTsKLSAgaWYgKGJnOjpnZXQ8MD4ocHQxKSA+IGJnOjpnZXQ8MD4ocHQyKSB8fCBiZzo6Z2V0PDE+KHB0MSkgPiBiZzo6Z2V0PDE+KHB0MikpIHsKLSAgICBsZWZ0UHQgPSBwdDI7Ci0gICAgcmlnaHRQdCA9IHB0MTsKLSAgfSBlbHNlIHsKLSAgICBsZWZ0UHQgPSBwdDE7Ci0gICAgcmlnaHRQdCA9IHB0MjsKLSAgfQotICBmckNvb3JkIGxseCA9IDAsIGxseSA9IDAsIHVyeCA9IDAsIHVyeSA9IDA7Ci0gIGlmIChkaXIgPT0gZnJEaXJFbnVtOjpFKSB7Ci0gICAgbGx4ID0gYmc6OmdldDwwPihsZWZ0UHQpOwotICAgIHVyeCA9IGxseCArIG1heFNwYWNpbmdWYWw7Ci0gICAgbGx5ID0gYmc6OmdldDwxPihsZWZ0UHQpIC0gbWF4U3BhY2luZ1ZhbDsKLSAgICB1cnkgPSBiZzo6Z2V0PDE+KHJpZ2h0UHQpICsgbWF4U3BhY2luZ1ZhbDsKLSAgfSBlbHNlIGlmIChkaXIgPT0gZnJEaXJFbnVtOjpTKSB7Ci0gICAgbGx4ID0gYmc6OmdldDwwPihsZWZ0UHQpIC0gbWF4U3BhY2luZ1ZhbDsKLSAgICB1cnggPSBiZzo6Z2V0PDA+KHJpZ2h0UHQpICsgbWF4U3BhY2luZ1ZhbDsKLSAgICB1cnkgPSBiZzo6Z2V0PDE+KGxlZnRQdCk7Ci0gICAgbGx5ID0gdXJ5IC0gbWF4U3BhY2luZ1ZhbDsKLSAgfSBlbHNlIGlmIChkaXIgPT0gZnJEaXJFbnVtOjpXKSB7Ci0gICAgdXJ4ID0gYmc6OmdldDwwPihsZWZ0UHQpOwotICAgIGxseCA9IHVyeCAtIG1heFNwYWNpbmdWYWw7Ci0gICAgbGx5ID0gYmc6OmdldDwxPihsZWZ0UHQpIC0gbWF4U3BhY2luZ1ZhbDsKLSAgICB1cnkgPSBiZzo6Z2V0PDE+KHJpZ2h0UHQpICsgbWF4U3BhY2luZ1ZhbDsKLSAgfSBlbHNlIGlmIChkaXIgPT0gZnJEaXJFbnVtOjpOKSB7Ci0gICAgbGx4ID0gYmc6OmdldDwwPihsZWZ0UHQpIC0gbWF4U3BhY2luZ1ZhbDsKLSAgICB1cnggPSBiZzo6Z2V0PDA+KHJpZ2h0UHQpICsgbWF4U3BhY2luZ1ZhbDsKLSAgICBsbHkgPSBiZzo6Z2V0PDE+KGxlZnRQdCk7Ci0gICAgdXJ5ID0gbGx5ICsgbWF4U3BhY2luZ1ZhbDsKLSAgfSBlbHNlIHsKLSAgICBzdGQ6OmNvdXQgPDwgIkVycm9yOiBVTktOT1dOIGVkZ2UgZGlyZWN0aW9uIGluIGdldFNwYWNpbmdUYWJsZVRlc3RCb3hcbiI7Ci0gIH0KLSAgdGVzdEJveCA9IGJveF90KHBvaW50X3QobGx4LCBsbHkpLCBwb2ludF90KHVyeCwgdXJ5KSk7Ci0KLX0KLQotLy8gbGVmdCBvciBib3R0b20gZGlyZWN0aW9uCi1mcjo6ZnJEaXJFbnVtIGZyOjpEUkNXb3JrZXI6OmxlZnRFZGdlRGlyKGNvbnN0IGZyRGlyRW51bSAmZGlySW4pIHsKLSAgaWYgKGRpckluID09IGZyRGlyRW51bTo6TiB8fCBkaXJJbiA9PSBmckRpckVudW06OlMpIHsKLSAgICByZXR1cm4gZnJEaXJFbnVtOjpXOwotICB9IGVsc2UgewotICAgIHJldHVybiBmckRpckVudW06OlM7Ci0gIH0KLX0KLQotZnI6OmZyRGlyRW51bSBmcjo6RFJDV29ya2VyOjpyaWdodEVkZ2VEaXIoY29uc3QgZnJEaXJFbnVtICZkaXJJbikgewotICBpZiAoZGlySW4gPT0gZnJEaXJFbnVtOjpOIHx8IGRpckluID09IGZyRGlyRW51bTo6UykgewotICAgIHJldHVybiBmckRpckVudW06OkU7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZyRGlyRW51bTo6TjsKLSAgfQotfQotCi1ib29sIGZyOjpEUkNXb3JrZXI6OmlzRW9sRWRnZShEUkNFZGdlKiBlZGdlKSB7Ci0gIC8vIGlmIG5vdCBwb2x5Z29uIGVkZ2UsIHJldHVybiBmYWxzZQotICBpZiAoZWRnZS0+Z2V0UHJldkVkZ2UoKSA9PSBudWxscHRyIHx8IGVkZ2UtPmdldE5leHRFZGdlKCkgPT0gbnVsbHB0cikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBhdXRvIHByZXZFZGdlID0gZWRnZS0+Z2V0UHJldkVkZ2UoKTsKLSAgYXV0byBuZXh0RWRnZSA9IGVkZ2UtPmdldE5leHRFZGdlKCk7Ci0gIC8vIHJldHVybiB0cnVlIGlmZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlCi0gIGlmICgocHJldkVkZ2UtPmdldERpcigpID09IGZyRGlyRW51bTo6VyAmJiBlZGdlLT5nZXREaXIoKSA9PSBmckRpckVudW06Ok4gJiYgbmV4dEVkZ2UtPmdldERpcigpID09IGZyRGlyRW51bTo6RSkgfHwKLSAgICAgIChwcmV2RWRnZS0+Z2V0RGlyKCkgPT0gZnJEaXJFbnVtOjpTICYmIGVkZ2UtPmdldERpcigpID09IGZyRGlyRW51bTo6VyAmJiBuZXh0RWRnZS0+Z2V0RGlyKCkgPT0gZnJEaXJFbnVtOjpOKSB8fCAKLSAgICAgIChwcmV2RWRnZS0+Z2V0RGlyKCkgPT0gZnJEaXJFbnVtOjpFICYmIGVkZ2UtPmdldERpcigpID09IGZyRGlyRW51bTo6UyAmJiBuZXh0RWRnZS0+Z2V0RGlyKCkgPT0gZnJEaXJFbnVtOjpXKSB8fAotICAgICAgKHByZXZFZGdlLT5nZXREaXIoKSA9PSBmckRpckVudW06Ok4gJiYgZWRnZS0+Z2V0RGlyKCkgPT0gZnJEaXJFbnVtOjpFICYmIG5leHRFZGdlLT5nZXREaXIoKSA9PSBmckRpckVudW06OlMpKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLS8vIGJvb2wgZnI6OkRSQ1dvcmtlcjo6aXNDb252ZWNFZGdlKERSQ0VkZ2UqIGVkZ2UpIHsKLS8vICAgLy8gaWYgbm90IHBvbHlnb24gZWRnZSwgcmV0dXJuIGZhbHNlCi0vLyAgIGlmIChlZGdlLT5nZXRQcmV2RWRnZSgpID09IG51bGxwdHIgfHwgZWRnZS0+Z2V0TmV4dEVkZ2UoKSA9PSBudWxscHRyKSB7Ci0vLyAgICAgcmV0dXJuIGZhbHNlOwotLy8gICB9Ci0vLyAgIGF1dG8gcHJldkVkZ2UgPSBlZGdlLT5nZXRQcmV2RWRnZSgpOwotLy8gICBhdXRvIG5leHRFZGdlID0gZWRnZS0+Z2V0TmV4dEVkZ2UoKTsKLS8vICAgLy8gcmV0dXJuIHRydWUgaWZmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWUKLS8vICAgaWYgKChwcmV2RWRnZS0+Z2V0RGlyKCkgPT0gZnJEaXJFbnVtOjpXICYmIGVkZ2UtPmdldERpcigpID09IGZyRGlyRW51bTo6TiAmJiBuZXh0RWRnZS0+Z2V0RGlyKCkgPT0gZnJEaXJFbnVtOjpFKSB8fAotLy8gICAgICAgKHByZXZFZGdlLT5nZXREaXIoKSA9PSBmckRpckVudW06OlMgJiYgZWRnZS0+Z2V0RGlyKCkgPT0gZnJEaXJFbnVtOjpXICYmIG5leHRFZGdlLT5nZXREaXIoKSA9PSBmckRpckVudW06Ok4pIHx8IAotLy8gICAgICAgKHByZXZFZGdlLT5nZXREaXIoKSA9PSBmckRpckVudW06OkUgJiYgZWRnZS0+Z2V0RGlyKCkgPT0gZnJEaXJFbnVtOjpTICYmIG5leHRFZGdlLT5nZXREaXIoKSA9PSBmckRpckVudW06OlcpIHx8Ci0vLyAgICAgICAocHJldkVkZ2UtPmdldERpcigpID09IGZyRGlyRW51bTo6TiAmJiBlZGdlLT5nZXREaXIoKSA9PSBmckRpckVudW06OkUgJiYgbmV4dEVkZ2UtPmdldERpcigpID09IGZyRGlyRW51bTo6UykpIHsKLS8vICAgICByZXR1cm4gdHJ1ZTsKLS8vICAgfSBlbHNlIHsKLS8vICAgICByZXR1cm4gZmFsc2U7Ci0vLyAgIH0KLS8vIH0KLQotLy8gYm9vbCBmcjo6RFJDV29ya2VyOjppc0NvbmNhdmVFZGdlKERSQ0VkZ2UqIGVkZ2UpIHsKLS8vICAgLy8gaWYgbm90IHBvbHlnb24gZWRnZSwgcmV0dXJuIGZhbHNlCi0vLyAgIGlmIChlZGdlLT5nZXRQcmV2RWRnZSgpID09IG51bGxwdHIgfHwgZWRnZS0+Z2V0TmV4dEVkZ2UoKSA9PSBudWxscHRyKSB7Ci0vLyAgICAgcmV0dXJuIGZhbHNlOwotLy8gICB9Ci0vLyAgIGF1dG8gcHJldkVkZ2UgPSBlZGdlLT5nZXRQcmV2RWRnZSgpOwotLy8gICBhdXRvIG5leHRFZGdlID0gZWRnZS0+Z2V0TmV4dEVkZ2UoKTsKLS8vICAgLy8gcmV0dXJuIHRydWUgaWZmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWUKLS8vICAgaWYgKChwcmV2RWRnZS0+Z2V0RGlyKCkgPT0gZnJEaXJFbnVtOjpFICYmIGVkZ2UtPmdldERpcigpID09IGZyRGlyRW51bTo6TiAmJiBuZXh0RWRnZS0+Z2V0RGlyKCkgPT0gZnJEaXJFbnVtOjpXKSB8fAotLy8gICAgICAgKHByZXZFZGdlLT5nZXREaXIoKSA9PSBmckRpckVudW06Ok4gJiYgZWRnZS0+Z2V0RGlyKCkgPT0gZnJEaXJFbnVtOjpXICYmIG5leHRFZGdlLT5nZXREaXIoKSA9PSBmckRpckVudW06OlMpIHx8IAotLy8gICAgICAgKHByZXZFZGdlLT5nZXREaXIoKSA9PSBmckRpckVudW06OlcgJiYgZWRnZS0+Z2V0RGlyKCkgPT0gZnJEaXJFbnVtOjpTICYmIG5leHRFZGdlLT5nZXREaXIoKSA9PSBmckRpckVudW06OkUpIHx8Ci0vLyAgICAgICAocHJldkVkZ2UtPmdldERpcigpID09IGZyRGlyRW51bTo6UyAmJiBlZGdlLT5nZXREaXIoKSA9PSBmckRpckVudW06OkUgJiYgbmV4dEVkZ2UtPmdldERpcigpID09IGZyRGlyRW51bTo6TikpIHsKLS8vICAgICByZXR1cm4gdHJ1ZTsKLS8vICAgfSBlbHNlIHsKLS8vICAgICByZXR1cm4gZmFsc2U7Ci0vLyAgIH0KLS8vIH0KLQotdm9pZCBmcjo6RFJDV29ya2VyOjpnZXRFT0xUZXN0Qm94KGNvbnN0IHNlZ21lbnRfdCAmc2VnLCBEUkNFZGdlKiBlb2xFZGdlLCBjb25zdCBmckNvb3JkICZlb2xTcGFjZSwgY29uc3QgZnJDb29yZCAmZW9sV2l0aGluLCBib3hfdCAmdGVzdEJveCkgewotICBhdXRvIGRpciA9IGVvbEVkZ2UtPmdldERpcigpOwotICBwb2ludF90IGxlZnRQdCwgcmlnaHRQdDsgLy8gbGVmdCBpcyB0aGUgc21hbGxlciBvbmUsIHJpZ2h0IGlzIHRoZSBsYXJnZXIgb25lLCB0cnVlIGZvciB2ZXJ0aWNhbCBhcyB3ZWxsCi0gIHBvaW50X3QgcHQxKGJnOjpnZXQ8MCwwPihzZWcpLCBiZzo6Z2V0PDAsMT4oc2VnKSk7Ci0gIHBvaW50X3QgcHQyKGJnOjpnZXQ8MSwwPihzZWcpLCBiZzo6Z2V0PDEsMT4oc2VnKSk7Ci0gIGlmIChiZzo6Z2V0PDA+KHB0MSkgPiBiZzo6Z2V0PDA+KHB0MikgfHwgYmc6OmdldDwxPihwdDEpID4gYmc6OmdldDwxPihwdDIpKSB7Ci0gICAgbGVmdFB0ID0gcHQyOwotICAgIHJpZ2h0UHQgPSBwdDE7Ci0gIH0gZWxzZSB7Ci0gICAgbGVmdFB0ID0gcHQxOwotICAgIHJpZ2h0UHQgPSBwdDI7Ci0gIH0KLSAgZnJDb29yZCBsbHggPSAwLCBsbHkgPSAwLCB1cnggPSAwLCB1cnkgPSAwOwotICBpZiAoZGlyID09IGZyRGlyRW51bTo6RSkgewotICAgIGxseCA9IGJnOjpnZXQ8MD4obGVmdFB0KTsKLSAgICB1cnggPSBsbHggKyBlb2xTcGFjZTsKLSAgICBsbHkgPSBiZzo6Z2V0PDE+KGxlZnRQdCkgLSBlb2xXaXRoaW47Ci0gICAgdXJ5ID0gYmc6OmdldDwxPihyaWdodFB0KSArIGVvbFdpdGhpbjsKLSAgfSBlbHNlIGlmIChkaXIgPT0gZnJEaXJFbnVtOjpTKSB7Ci0gICAgbGx4ID0gYmc6OmdldDwwPihsZWZ0UHQpIC0gZW9sV2l0aGluOwotICAgIHVyeCA9IGJnOjpnZXQ8MD4ocmlnaHRQdCkgKyBlb2xXaXRoaW47Ci0gICAgdXJ5ID0gYmc6OmdldDwxPihsZWZ0UHQpOwotICAgIGxseSA9IHVyeSAtIGVvbFNwYWNlOwotICB9IGVsc2UgaWYgKGRpciA9PSBmckRpckVudW06OlcpIHsKLSAgICB1cnggPSBiZzo6Z2V0PDA+KGxlZnRQdCk7Ci0gICAgbGx4ID0gdXJ4IC0gZW9sU3BhY2U7Ci0gICAgbGx5ID0gYmc6OmdldDwxPihsZWZ0UHQpIC0gZW9sV2l0aGluOwotICAgIHVyeSA9IGJnOjpnZXQ8MT4ocmlnaHRQdCkgKyBlb2xXaXRoaW47Ci0gIH0gZWxzZSBpZiAoZGlyID09IGZyRGlyRW51bTo6TikgewotICAgIGxseCA9IGJnOjpnZXQ8MD4obGVmdFB0KSAtIGVvbFdpdGhpbjsKLSAgICB1cnggPSBiZzo6Z2V0PDA+KHJpZ2h0UHQpICsgZW9sV2l0aGluOwotICAgIGxseSA9IGJnOjpnZXQ8MT4obGVmdFB0KTsKLSAgICB1cnkgPSBsbHkgKyBlb2xTcGFjZTsKLSAgfSBlbHNlIHsKLSAgICBzdGQ6OmNvdXQgPDwgIkVycm9yOiBVTktOT1dOIGVkZ2UgZGlyZWN0aW9uIGluIGdldFNwYWNpbmdUYWJsZVRlc3RCb3hcbiI7Ci0gIH0KLSAgdGVzdEJveCA9IGJveF90KHBvaW50X3QobGx4LCBsbHkpLCBwb2ludF90KHVyeCwgdXJ5KSk7Ci19Ci0KLXZvaWQgZnI6OkRSQ1dvcmtlcjo6Z2V0UGFyYWxsZWxFZGdlQm94cyhjb25zdCBzZWdtZW50X3QgJnNlZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJDRWRnZSAqZW9sRWRnZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyQ29vcmQgJnBhclNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmckNvb3JkICZwYXJXaXRoaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyQ29vcmQgJmVvbFdpdGhpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94X3QgJnBhcmFsbGVsRWRnZUJveExlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveF90ICZwYXJhbGxlbEVkZ2VCb3hSaWdodCkgewotICBhdXRvIGRpciA9IGVvbEVkZ2UtPmdldERpcigpOwotICBwb2ludF90IGxlZnRQdCwgcmlnaHRQdDsKLSAgcG9pbnRfdCBwdDEoYmc6OmdldDwwLDA+KHNlZyksIGJnOjpnZXQ8MCwxPihzZWcpKTsKLSAgcG9pbnRfdCBwdDIoYmc6OmdldDwxLDA+KHNlZyksIGJnOjpnZXQ8MSwxPihzZWcpKTsKLSAgaWYgKGJnOjpnZXQ8MD4ocHQxKSA+IGJnOjpnZXQ8MD4ocHQyKSB8fCBiZzo6Z2V0PDE+KHB0MSkgPiBiZzo6Z2V0PDE+KHB0MikpIHsKLSAgICBsZWZ0UHQgPSBwdDI7Ci0gICAgcmlnaHRQdCA9IHB0MTsKLSAgfSBlbHNlIHsKLSAgICBsZWZ0UHQgPSBwdDE7Ci0gICAgcmlnaHRQdCA9IHB0MjsKLSAgfQotICBmckNvb3JkIGxseCA9IDAsIGxseSA9IDAsIHVyeCA9IDAsIHVyeSA9IDA7Ci0gIC8vIGxlZnQgLyBib3R0b20gcGFyYWxsZWxFZGdlIHJlY3QKLSAgaWYgKGRpciA9PSBmckRpckVudW06OkUpIHsKLSAgICB1cnkgPSBiZzo6Z2V0PDE+KGxlZnRQdCk7Ci0gICAgbGx5ID0gdXJ5IC0gcGFyU3BhY2U7Ci0gICAgbGx4ID0gYmc6OmdldDwwPihsZWZ0UHQpIC0gcGFyV2l0aGluOwotICAgIHVyeCA9IGJnOjpnZXQ8MD4obGVmdFB0KSArIGVvbFdpdGhpbjsKLSAgfSBlbHNlIGlmIChkaXIgPT0gZnJEaXJFbnVtOjpTKSB7Ci0gICAgdXJ4ID0gYmc6OmdldDwwPihsZWZ0UHQpOwotICAgIGxseCA9IHVyeCAtIHBhclNwYWNlOwotICAgIHVyeSA9IGJnOjpnZXQ8MT4obGVmdFB0KSArIHBhcldpdGhpbjsKLSAgICBsbHkgPSBiZzo6Z2V0PDE+KGxlZnRQdCkgLSBlb2xXaXRoaW47Ci0gIH0gZWxzZSBpZiAoZGlyID09IGZyRGlyRW51bTo6VykgewotICAgIHVyeSA9IGJnOjpnZXQ8MT4obGVmdFB0KTsKLSAgICBsbHkgPSB1cnkgLSBwYXJTcGFjZTsKLSAgICBsbHggPSBiZzo6Z2V0PDA+KGxlZnRQdCkgLSBlb2xXaXRoaW47Ci0gICAgdXJ4ID0gYmc6OmdldDwwPihsZWZ0UHQpICsgcGFyV2l0aGluOwotICB9IGVsc2UgaWYgKGRpciA9PSBmckRpckVudW06Ok4pIHsKLSAgICB1cnggPSBiZzo6Z2V0PDA+KGxlZnRQdCk7Ci0gICAgbGx4ID0gdXJ4IC0gcGFyU3BhY2U7Ci0gICAgdXJ5ID0gYmc6OmdldDwxPihsZWZ0UHQpICsgZW9sV2l0aGluOwotICAgIGxseSA9IGJnOjpnZXQ8MT4obGVmdFB0KSAtIHBhcldpdGhpbjsKLSAgfSBlbHNlIHsKLSAgICBzdGQ6OmNvdXQgPDwgIkVycm9yOiBVTktOT1dOIGVkZ2UgZGlyZWN0aW9uIGluIGdldFBhcmFsbGVsRWRnZVJlY3RcbiI7Ci0gIH0KLSAgcGFyYWxsZWxFZGdlQm94TGVmdCA9ICBib3hfdChwb2ludF90KGxseCwgbGx5KSwgcG9pbnRfdCh1cngsIHVyeSkpOwotICAvLyByaWdodCAvIHRvcCBwYXJhbGxlbEVkZGdlIHJlY3QKLSAgaWYgKGRpciA9PSBmckRpckVudW06OkUpIHsKLSAgICBsbHkgPSBiZzo6Z2V0PDE+KHJpZ2h0UHQpOwotICAgIHVyeSA9IGxseSArIHBhclNwYWNlOwotICAgIGxseCA9IGJnOjpnZXQ8MD4ocmlnaHRQdCkgLSBwYXJXaXRoaW47Ci0gICAgdXJ4ID0gYmc6OmdldDwwPihyaWdodFB0KSArIGVvbFdpdGhpbjsKLSAgfSBlbHNlIGlmIChkaXIgPT0gZnJEaXJFbnVtOjpTKSB7Ci0gICAgbGx4ID0gYmc6OmdldDwwPihyaWdodFB0KTsKLSAgICB1cnggPSBsbHggKyBwYXJTcGFjZTsKLSAgICB1cnkgPSBiZzo6Z2V0PDE+KHJpZ2h0UHQpICsgcGFyV2l0aGluOwotICAgIGxseSA9IGJnOjpnZXQ8MT4ocmlnaHRQdCkgLSBlb2xXaXRoaW47Ci0gIH0gZWxzZSBpZiAoZGlyID09IGZyRGlyRW51bTo6VykgewotICAgIGxseSA9IGJnOjpnZXQ8MT4ocmlnaHRQdCk7Ci0gICAgdXJ5ID0gbGx5ICsgcGFyU3BhY2U7Ci0gICAgbGx4ID0gYmc6OmdldDwwPihyaWdodFB0KSAtIGVvbFdpdGhpbjsKLSAgICB1cnggPSBiZzo6Z2V0PDA+KHJpZ2h0UHQpICsgcGFyV2l0aGluOwotICB9IGVsc2UgaWYgKGRpciA9PSBmckRpckVudW06Ok4pIHsKLSAgICBsbHggPSBiZzo6Z2V0PDA+KHJpZ2h0UHQpOwotICAgIHVyeCA9IGxseCArIHBhclNwYWNlOwotICAgIHVyeSA9IGJnOjpnZXQ8MT4ocmlnaHRQdCkgKyBlb2xXaXRoaW47Ci0gICAgbGx5ID0gYmc6OmdldDwxPihyaWdodFB0KSAtIHBhcldpdGhpbjsKLSAgfSBlbHNlIHsKLSAgICBzdGQ6OmNvdXQgPDwgIkVycm9yOiBVTktOT1dOIGVkZ2UgZGlyZWN0aW9uIGluIGdldFBhcmFsbGVsRWRnZVJlY3RcbiI7Ci0gIH0KLSAgcGFyYWxsZWxFZGdlQm94UmlnaHQgPSBib3hfdChwb2ludF90KGxseCwgbGx5KSwgcG9pbnRfdCh1cngsIHVyeSkpOwotICByZXR1cm47Ci19Ci0KLQotYm9vbCBmcjo6RFJDV29ya2VyOjpjb3ZlcmVkX2J5KGNvbnN0IGJvb3N0OjppY2w6OmRpc2NyZXRlX2ludGVydmFsPGZyQ29vcmQsIHN0ZDo6bGVzcz4gJmludHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OmljbDo6aW50ZXJ2YWxfc2V0PGZyQ29vcmQ+ICZpbnR2U2V0KSB7Ci0gIGF1dG8gaW50dkl0UmVzID0gaW50dlNldC5lcXVhbF9yYW5nZShpbnR2KTsKLSAgZm9yIChhdXRvIGludHZJdCA9IGludHZJdFJlcy5maXJzdDsgaW50dkl0ICE9IGludHZJdFJlcy5zZWNvbmQ7ICsraW50dkl0KSB7Ci0gICAgcmV0dXJuIChib29zdDo6aWNsOjpjb250YWlucygqaW50dkl0LCBpbnR2KSk7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1mcjo6ZnJDb29yZCBmcjo6RFJDV29ya2VyOjpyZWN0RGlhZ0xlbmd0aChjb25zdCBSZWN0YW5nbGUgJnJlY3QpIHsKLSAgZnJDb29yZCBkZWx0YVggPSAoeGgocmVjdCkgLSB4bChyZWN0KSk7Ci0gIGZyQ29vcmQgZGVsdGFZID0gKHloKHJlY3QpIC0geWwocmVjdCkpOwotICByZXR1cm4gZnJDb29yZChzcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSkpOwotfQotCi0KLQotdm9pZCBmcjo6RFJDV29ya2VyOjpyZXBvcnQoKSB7Ci0gIGRvdWJsZSBkYnUgPSBkZXNpZ24tPmdldFRlY2goKS0+Z2V0REJVUGVyVVUoKTsKLSAgc3RkOjpjb3V0IDw8IERSQ19SUFRfRklMRSA8PCAiXG4iOwotICBpZiAoRFJDX1JQVF9GSUxFICE9IHN0ZDo6c3RyaW5nKCIiKSkgewotICAgIHN0ZDo6b2ZzdHJlYW0gZHJjUnB0KERSQ19SUFRfRklMRS5jX3N0cigpKTsKLSAgICBpZiAoZHJjUnB0LmlzX29wZW4oKSkgewotICAgICAgZm9yIChhdXRvICZtYXJrZXI6IG1hcmtlcnMpIHsKLSAgICAgICAgZHJjUnB0IDw8ICIgIHZpb2xhdGlvbiB0eXBlOiAiIDw8IGludChtYXJrZXIuZ2V0Q29uc3RyYWludCgpLT50eXBlSWQoKSkgPDwgIlxuIjsKLSAgICAgICAgLy8gZ2V0IHNvdXJjZShzKSBvZiB2aW9sYXRpb24KLSAgICAgICAgZHJjUnB0IDw8ICIgICAgc3JjczogIjsKLSAgICAgICAgZm9yIChhdXRvIHNyYzogbWFya2VyLmdldFNyY3MoKSkgewotICAgICAgICAgIGlmIChzcmMpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoc3JjLT50eXBlSWQoKSkgewotICAgICAgICAgICAgICBjYXNlIGZyY05ldDoKLSAgICAgICAgICAgICAgICBkcmNScHQgPDwgKHN0YXRpY19jYXN0PGZyTmV0Kj4oc3JjKSktPmdldE5hbWUoKSA8PCAiICI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgZnJjSW5zdFRlcm06IHsKLSAgICAgICAgICAgICAgICBmckluc3RUZXJtKiBpbnN0VGVybSA9IChzdGF0aWNfY2FzdDxmckluc3RUZXJtKj4oc3JjKSk7Ci0gICAgICAgICAgICAgICAgLy8gZHJjUnB0IDw8IGluc3RUZXJtLT5nZXRJbnN0KCktPmdldE5hbWUoKSAKLSAgICAgICAgICAgICAgICAgICAgICAgLy8gPDwgIi8iIDw8IGluc3RUZXJtLT5nZXRUZXJtKCktPmdldE5hbWUoKSA8PCAiICI7Ci0gICAgICAgICAgICAgICAgZHJjUnB0IDw8ICJQaW4gb2YgQ2VsbCAiIDw8IGluc3RUZXJtLT5nZXRJbnN0KCktPmdldE5hbWUoKSA8PCAiICI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgY2FzZSBmcmNUZXJtOiB7Ci0gICAgICAgICAgICAgICAgZnJUZXJtKiB0ZXJtID0gKHN0YXRpY19jYXN0PGZyVGVybSo+KHNyYykpOwotICAgICAgICAgICAgICAgIGRyY1JwdCA8PCB0ZXJtLT5nZXROYW1lKCkgPDwgIiAiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJFcnJvcjogdW5leHBlY3RlZCBzcmMgdHlwZSBpbiBtYXJrZXJcbiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGRyY1JwdCA8PCAiXG4iOwotICAgICAgICAvLyBnZXQgdmlvbGF0aW9uIGJib3gKLSAgICAgICAgZnJCb3ggYmJveDsKLSAgICAgICAgbWFya2VyLmdldEJCb3goYmJveCk7Ci0gICAgICAgIGRyY1JwdCA8PCAiICAgIGJib3ggPSAoIiA8PCBiYm94LmxlZnQoKSAvIGRidSA8PCAiLCAiIDw8IGJib3guYm90dG9tKCkgLyBkYnUgPDwgIikgLSAoIgotICAgICAgICAgICAgICAgPDwgYmJveC5yaWdodCgpIC8gZGJ1IDw8ICIsICIgPDwgYmJveC50b3AoKSAvIGRidSA8PCAiKVxuIjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgc3RkOjpjb3V0IDw8ICJFcnJvcjogRmFpbCB0byBvcGVuIERSQyByZXBvcnQgZmlsZVxuIjsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgc3RkOjpjb3V0IDw8ICJFcnJvcjogRFJDIHJlcG9ydCBmaWxlIGlzIG5vdCBzcGVjaWZpZWRcbiI7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZnJCYXNlVHlwZXMuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2ZyQmFzZVR5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNjVlMWIuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZnJCYXNlVHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIF9GUl9CQVNFX1RZUEVTX0hfCi0jZGVmaW5lIF9GUl9CQVNFX1RZUEVTX0hfCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8bGlzdD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLS8vI2luY2x1ZGUgPGJvb3N0L3Byb3BlcnR5X21hcC9wcm9wZXJ0eV9tYXAuaHBwPgotI2luY2x1ZGUgPGJvb3N0L2dyYXBoL2FkamFjZW5jeV9saXN0LmhwcD4KLS8vI2luY2x1ZGUgPGJvb3N0L2dyYXBoL2Nvbm5lY3RlZF9jb21wb25lbnRzLmhwcD4KLQotI2luY2x1ZGUgPGJvb3N0L2dlb21ldHJ5LmhwcD4KLSNpbmNsdWRlIDxib29zdC9wb2x5Z29uL3BvbHlnb24uaHBwPgotLy8jaW5jbHVkZSA8Ym9vc3QvZ2VvbWV0cnkvZ2VvbWV0cmllcy9wb2ludC5ocHA+Ci0vLyNpbmNsdWRlIDxib29zdC9nZW9tZXRyeS9nZW9tZXRyaWVzL2JveC5ocHA+Ci0vLyNpbmNsdWRlIDxib29zdC9nZW9tZXRyeS9pbmRleC9ydHJlZS5ocHA+Ci0KLW5hbWVzcGFjZSBmciB7Ci0gIHVzaW5nIGZyTGF5ZXJOdW0gPSBpbnQ7Ci0gIHVzaW5nIGZyQ29vcmQgPSBpbnQ7Ci0gIHVzaW5nIGZyVUludDQgPSB1bnNpZ25lZCBpbnQ7Ci0gIHVzaW5nIGZyRGlzdCAgPSBkb3VibGU7Ci0gIHVzaW5nIGZyU3RyaW5nID0gc3RkOjpzdHJpbmc7Ci0gIHVzaW5nIGZyQ29zdCA9IHVuc2lnbmVkIGludDsKLSAgdXNpbmcgZnJNSWR4ID0gaW50OyAvLyBuZWdhdGl2ZSB2YWx1ZSBleHBlY3RlZCAKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIHVzaW5nIGZyQ29sbGVjdGlvbiA9IHN0ZDo6dmVjdG9yPFQ+OwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgdXNpbmcgZnJWZWN0b3IgICAgID0gc3RkOjp2ZWN0b3I8VD47Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICB1c2luZyBmckxpc3QgICAgICAgPSBzdGQ6Omxpc3Q8VD47Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICB1c2luZyBmckxpc3RJdGVyICAgPSB0eXBlbmFtZSBzdGQ6Omxpc3Q8VD46Oml0ZXJhdG9yOwotICAvL3RlbXBsYXRlIDx0eXBlbmFtZSBUPgotICAvL2Jvb2wgZnJMaXN0SXRlckNvbXAgKGNvbnN0IGZyTGlzdEl0ZXI8VD4mIGEsIGNvbnN0IGZyTGlzdEl0ZXI8VD4mIGIpIHsKLSAgLy8gIHJldHVybiAmKCphKSA8ICYoKmIpOwotICAvL307Ci0gIGVudW0gZnJPcmllbnRFbnVtIHsKLSAgICAgIGZyY1IwICAgICAgID0gMCwgLy8gTgotICAgICAgZnJjUjkwICAgICAgPSAxLCAvLyBXCi0gICAgICBmcmNSMTgwICAgICA9IDIsIC8vIFMKLSAgICAgIGZyY1IyNzAgICAgID0gMywgLy8gRQotICAgICAgZnJjTVkgICAgICAgPSA0LCAvLyBGTgotICAgICAgZnJjTVhSOTAgICAgPSA1LCAvLyBGVwotICAgICAgZnJjTVggICAgICAgPSA2LCAvLyBGUwotICAgICAgZnJjTVlSOTAgICAgPSA3ICAvLyBGRQotICB9OwotICBlbnVtIGZyRW5kU3R5bGVFbnVtIHsKLSAgICAgIGZyY1RydW5jYXRlRW5kU3R5bGUgPSAwLCAvLyBleHQgPSAwCi0gICAgICBmcmNFeHRlbmRFbmRTdHlsZSAgID0gMSwgLy8gZXh0ID0gaGFsZiB3aWR0aAotICAgICAgZnJjVmFyaWFibGVFbmRTdHlsZSA9IDIgIC8vIGV4dCA9IHZhcmlhYmxlCi0gIH07Ci0gIGVudW0gZnJQcmVmUm91dGluZ0RpckVudW0gewotICAgICAgZnJjTm90QXBwbGljYWJsZVByZWZSb3V0aW5nRGlyID0gMCwKLSAgICAgIGZyY05vbmVQcmVmUm91dGluZ0RpciAgICAgICAgICA9IDEsCi0gICAgICBmcmNIb3J6UHJlZlJvdXRpbmdEaXIgICAgICAgICAgPSAyLAotICAgICAgZnJjVmVydFByZWZSb3V0aW5nRGlyICAgICAgICAgID0gMyAKLSAgfTsKLSAgZW51bSBmckJsb2NrT2JqZWN0RW51bSB7Ci0gICAgICBmcmNCbG9ja09iamVjdCAgID0gLTEsCi0gICAgICBmcmNOZXQgICAgICAgICAgID0gMCwKLSAgICAgIGZyY1Rlcm0gICAgICAgICAgPSAxLAotICAgICAgZnJjSW5zdCAgICAgICAgICA9IDIsCi0gICAgICBmcmNGaWcgICAgICAgICAgID0gMywKLSAgICAgIGZyY0Nvbm5GaWcgICAgICAgPSA0LAotICAgICAgZnJjUGluRmlnICAgICAgICA9IDUsCi0gICAgICBmcmNTaGFwZSAgICAgICAgID0gNiwKLSAgICAgIGZyY1JlZiAgICAgICAgICAgPSA3LAotICAgICAgZnJjVmlhICAgICAgICAgICA9IDgsCi0gICAgICBmcmNQaW4gICAgICAgICAgID0gOSwKLSAgICAgIGZyY0luc3RUZXJtICAgICAgPSAxMCwKLSAgICAgIGZyY1JlY3QgICAgICAgICAgPSAxMSwKLSAgICAgIGZyY1BvbHlnb24gICAgICAgPSAxMiwKLSAgICAgIGZyY1N0ZWluZXIgICAgICAgPSAxMywKLSAgICAgIGZyY1JvdXRlICAgICAgICAgPSAxNCwKLSAgICAgIGZyY1BhdGhTZWcgICAgICAgPSAxNSwKLSAgICAgIGZyY0d1aWRlICAgICAgICAgPSAxNiwKLSAgICAgIGZyY0Jsb2NrYWdlICAgICAgPSAxNywKLSAgICAgIGZyY0xheWVyQmxvY2thZ2UgPSAxOCwKLSAgICAgIGZyY0Jsb2NrICAgICAgICAgPSAxOSwKLSAgICAgIGZyY0JvdW5kYXJ5ICAgICAgPSAyMCwKLSAgICAgIGZyY0ZsZXhQYXRoU2VnICAgPSAyMSwKLSAgICAgIGZyY0ZsZXhWaWEgICAgICAgPSAyMiwKLSAgICAgIGZyY0luc3RCbG9ja2FnZSAgPSAyMywKLSAgICAgIGZyY0FjY2Vzc1BhdHRlcm4gPSAyNCwKLSAgICAgIGZyY01hcmtlciAgICAgICAgPSAyNSwKLSAgICAgIGZyY1BhdGNoV2lyZSAgICAgPSAyNiwKLSAgICAgIGRyY0Jsb2NrT2JqZWN0LAotICAgICAgZHJjTmV0LAotICAgICAgZHJjUGluLAotICAgICAgZHJjQWNjZXNzUGF0dGVybiwKLSAgICAgIGRyY1BhdGhTZWcsCi0gICAgICBkcmNWaWEsCi0gICAgICBkcmNNYXplTWFya2VyLAotICAgICAgZHJjRmlnLAotICAgICAgZHJjQ29ubkZpZywKLSAgICAgIGRyY1JlZiwKLSAgICAgIGRyY1BpbkZpZywKLSAgICAgIGRyY1BhdGNoV2lyZSwKLSAgICAgIHRhY0Jsb2NrT2JqZWN0LAotICAgICAgdGFjVHJhY2ssCi0gICAgICB0YWNQaW4sCi0gICAgICB0YWNQYXRoU2VnLAotICAgICAgdGFjVmlhCi0gIH07Ci0gIC8vZW51bSBjbGFzcyBkckJsb2NrT2JqZWN0RW51bSB7Ci0gIC8vICBkcmNCbG9ja09iamVjdCA9IDAsCi0gIC8vICBkcmNOZXQsCi0gIC8vICBkcmNQaW4sCi0gIC8vICBkcmNBY2Nlc3NQYXR0ZXJuLAotICAvLyAgZHJjUGF0aFNlZywKLSAgLy8gIGRyY1ZpYQotICAvL307Ci0gIGVudW0gY2xhc3MgZnJHdWlkZUVudW0gewotICAgICAgZnJjR3VpZGVYLAotICAgICAgZnJjR3VpZGVHbG9iYWwsCi0gICAgICBmcmNHdWlkZVRydW5rLAotICAgICAgZnJjR3VpZGVTaG9ydENvbm4KLSAgfTsKLSAgZW51bSBjbGFzcyBmclRlcm1FbnVtIHsKLSAgICBmcmNOb3JtYWxUZXJtLAotICAgIGZyY0Nsb2NrVGVybSwKLSAgICBmcmNQb3dlclRlcm0sCi0gICAgZnJjR3JvdW5kVGVybQotICB9OwotICBlbnVtIGNsYXNzIGZyTmV0RW51bSB7Ci0gICAgZnJjTm9ybWFsTmV0LAotICAgIGZyY0Nsb2NrTmV0LAotICAgIGZyY1Bvd2VyTmV0LAotICAgIGZyY0dyb3VuZE5ldAotICB9OwotICAvL2VudW0gY2xhc3MgZnJMZWY1OEN1dFNwYWNpbmdUYWJsZVR5cGVFbnVtIHsKLSAgLy8gIGZyY0NlbnRlclNwYWNpbmcsCi0gIC8vICBmcmNPcnRob2dvbmFsLAotICAvLyAgZnJjT3RoZXIsCi0gIC8vfTsKLQotICBlbnVtIGNsYXNzIGZyQ29uc3RyYWludFR5cGVFbnVtIHsKLSAgICBmcmNTaG9ydENvbnN0cmFpbnQgPSAwLAotICAgIGZyY0FyZWFDb25zdHJhaW50ID0gMSwKLSAgICBmcmNNaW5XaWR0aENvbnN0cmFpbnQgPSAyLAotICAgIGZyY1NwYWNpbmdDb25zdHJhaW50ID0gMywKLSAgICBmcmNTcGFjaW5nRW5kT2ZMaW5lQ29uc3RyYWludCA9IDQsCi0gICAgZnJjU3BhY2luZ0VuZE9mTGluZVBhcmFsbGVsRWRnZUNvbnN0cmFpbnQgPSA1LAotICAgIGZyY1NwYWNpbmdUYWJsZUNvbnN0cmFpbnQgPSA2LAotICAgIGZyY1NwYWNpbmdUYWJsZVBybENvbnN0cmFpbnQgPSA3LAotICAgIGZyY1NwYWNpbmdUYWJsZVR3Q29uc3RyYWludCA9IDgsCi0gICAgZnJjTGVmNThTcGFjaW5nVGFibGVDb25zdHJhaW50ID0gOSwKLSAgICBmcmNMZWY1OEN1dFNwYWNpbmdUYWJsZUNvbnN0cmFpbnQgPSAxMCwKLSAgICBmcmNMZWY1OEN1dFNwYWNpbmdUYWJsZVBybENvbnN0cmFpbnQgPSAxMSwKLSAgICBmcmNMZWY1OEN1dFNwYWNpbmdUYWJsZUxheWVyQ29uc3RyYWludCA9IDEyLAotICAgIGZyY0xlZjU4Q3V0U3BhY2luZ0NvbnN0cmFpbnQgPSAxMywKLSAgICBmcmNMZWY1OEN1dFNwYWNpbmdQYXJhbGxlbFdpdGhpbkNvbnN0cmFpbnQgPSAxNCwKLSAgICBmcmNMZWY1OEN1dFNwYWNpbmdBZGphY2VudEN1dHNDb25zdHJhaW50ID0gMTUsCi0gICAgZnJjTGVmNThDdXRTcGFjaW5nTGF5ZXJDb25zdHJhaW50ID0gMTYsCi0gICAgZnJjQ3V0U3BhY2luZ0NvbnN0cmFpbnQgPSAxNywKLSAgICBmcmNNaW5TdGVwQ29uc3RyYWludCwKLSAgICBmcmNMZWY1OENvcm5lclNwYWNpbmdDb25zdHJhaW50LAotICAgIGZyY0xlZjU4Q29ybmVyU3BhY2luZ0NvbmNhdmVDb3JuZXJDb25zdHJhaW50LAotICAgIGZyY0xlZjU4Q29ybmVyU3BhY2luZ0NvbnZleENvcm5lckNvbnN0cmFpbnQsCi0gICAgZnJjTGVmNThDb3JuZXJTcGFjaW5nU3BhY2luZ0NvbnN0cmFpbnQsCi0gICAgZnJjTGVmNThDb3JuZXJTcGFjaW5nU3BhY2luZzFEQ29uc3RyYWludCwKLSAgICBmcmNMZWY1OENvcm5lclNwYWNpbmdTcGFjaW5nMkRDb25zdHJhaW50LAotICAgIGZyY0xlZjU4U3BhY2luZ0VuZE9mTGluZUNvbnN0cmFpbnQsCi0gICAgZnJjTGVmNThTcGFjaW5nRW5kT2ZMaW5lV2l0aGluQ29uc3RyYWludCwKLSAgICBmcmNMZWY1OFNwYWNpbmdFbmRPZkxpbmVXaXRoaW5FbmRUb0VuZENvbnN0cmFpbnQsCi0gICAgZnJjTGVmNThTcGFjaW5nRW5kT2ZMaW5lV2l0aGluUGFyYWxsZWxFZGdlQ29uc3RyYWludCwKLSAgICBmcmNMZWY1OFNwYWNpbmdFbmRPZkxpbmVXaXRoaW5NYXhNaW5MZW5ndGhDb25zdHJhaW50LAotICAgIGZyY0xlZjU4Q3V0Q2xhc3NDb25zdHJhaW50Ci0gIH07Ci0KLSAgLy9lbnVtIGNsYXNzIGZyRGlyRW51bSB7IFVOS05PV04gPSAwLCBFID0gMSwgUyA9IDIsIFcgPSAzLCBOID0gNCwgVSA9IDUsIEQgPSA2IH07Ci0gIC8vZW51bSBjbGFzcyBmckRpckVudW0geyBVTktOT1dOID0gMCwgRSA9IDQsIFMgPSAyLCBXID0gMywgTiA9IDEsIFUgPSA2LCBEID0gNSB9OwotICAjZGVmaW5lIE9QUE9TSVRFRElSIDcKLSAgZW51bSBjbGFzcyBmckRpckVudW0geyBVTktOT1dOID0gMCwgRCA9IDEsIFMgPSAyLCBXID0gMywgRSA9IDQsIE4gPSA1LCBVID0gNiB9OwotCi0gIGVudW0gY2xhc3MgZnJMYXllclR5cGVFbnVtIHsKLSAgICBDVVQsCi0gICAgUk9VVElORywKLSAgICBJTVBMQU5UCi0gIH07Ci0KLQotICBlbnVtIGNsYXNzIEFjY2Vzc1BvaW50VHlwZUVudW0gewotICAgIElkZWFsLAotICAgIEdvb2QsCi0gICAgT2ZmZ3JpZCwKLSAgICBOb25lCi0gIH07Ci0KLSAgZW51bSBjbGFzcyBNYWNyb0NsYXNzRW51bSB7Ci0gICAgVU5LTk9XTiwKLSAgICBDT1JFLAotICAgIENPUkVfVElFSElHSCwKLSAgICBDT1JFX1RJRUxPVywKLSAgICBDT1JFX1dFTExUQVAsCi0gICAgQ09SRV9TUEFDRVIsCi0gICAgQ09SRV9BTlRFTk5BQ0VMTCwKLSAgICBFTkRDQVBfUFJFLAotICAgIEJMT0NLCi0gIH07Ci0KLSAgLy9lbnVtIGZyU2hhcGVFbnVtIHsKLSAgLy8gICAgZnJjUmVjdCAgICA9IDAsCi0gIC8vICAgIGZyY1BvbHlnb24gPSAxCi0gIC8vfTsKLSAgY2xhc3MgZnJCbG9ja09iamVjdDsKLSAgc3RydWN0IHZlcnRleF9wcm9wZXJ0aWVzX3QgewotICAgIGZyQmxvY2tPYmplY3QqIG9ialB0cjsKLSAgICAvL2ludCBpbmRleDsKLSAgICAvL2Jvb3N0OjpkZWZhdWx0X2NvbG9yX3R5cGUgY29sb3I7Ci0gICAgLy9mclN0cmluZyBuYW1lOwotICB9OwotICAvL2NsYXNzIGZyUm91dGU7Ci0gIGNsYXNzIGZyQ29ubkZpZzsKLSAgY2xhc3MgZnJJbnN0VGVybTsKLSAgY2xhc3MgZnJUZXJtOwotICBjbGFzcyBmckluc3Q7Ci0gIGNsYXNzIGZyQmxvY2thZ2U7Ci0gIHN0cnVjdCBlZGdlX3Byb3BlcnRpZXNfdCB7Ci0gICAgLy9zdGQ6OnNoYXJlZF9wdHI8ZnJCbG9ja09iamVjdD4gb2JqUHRyOwotICAgIC8vc3RkOjpzaGFyZWRfcHRyPGZyUm91dGU+IG9ialB0cjsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8ZnJDb25uRmlnPiBvYmpQdHI7Ci0gICAgLy9mclN0cmluZyBuYW1lOwotICB9OwotICAvLyBib29zdCBncmFwaAotICB0eXBlZGVmIGJvb3N0OjphZGphY2VuY3lfbGlzdDwgYm9vc3Q6Omxpc3RTLCBib29zdDo6bGlzdFMsIGJvb3N0Ojp1bmRpcmVjdGVkUywgdmVydGV4X3Byb3BlcnRpZXNfdCwgZWRnZV9wcm9wZXJ0aWVzX3QgPiBncmFwaF90OwotICAvL3R5cGVkZWYgYm9vc3Q6OmFkamFjZW5jeV9saXN0PCBib29zdDo6dmVjUywgYm9vc3Q6OnZlY1MsIGJvb3N0Ojp1bmRpcmVjdGVkUywgdmVydGV4X3Byb3BlcnRpZXNfdCwgZWRnZV9wcm9wZXJ0aWVzX3QgPiBncmFwaF90OwotICAvLyBkZXNjcmlwdG9yCi0gIHR5cGVkZWYgYm9vc3Q6OmdyYXBoX3RyYWl0czxncmFwaF90Pjo6dmVydGV4X2Rlc2NyaXB0b3IgICB2ZXJ0ZXhfZGVzY3JpcHRvcl90OwotICB0eXBlZGVmIGJvb3N0OjpncmFwaF90cmFpdHM8Z3JhcGhfdD46OmVkZ2VfZGVzY3JpcHRvciAgICAgZWRnZV9kZXNjcmlwdG9yX3Q7Ci0gIC8vIGl0ZXJhdG9yCi0gIHR5cGVkZWYgYm9vc3Q6OmdyYXBoX3RyYWl0czxncmFwaF90Pjo6dmVydGV4X2l0ZXJhdG9yICAgICB2ZXJ0ZXhfaXRlcmF0b3JfdDsKLSAgdHlwZWRlZiBib29zdDo6Z3JhcGhfdHJhaXRzPGdyYXBoX3Q+OjplZGdlX2l0ZXJhdG9yICAgICAgIGVkZ2VfaXRlcmF0b3JfdDsKLSAgdHlwZWRlZiBib29zdDo6Z3JhcGhfdHJhaXRzPGdyYXBoX3Q+OjpvdXRfZWRnZV9pdGVyYXRvciAgIG91dF9lZGdlX2l0ZXJhdG9yX3Q7Ci0gIHR5cGVkZWYgYm9vc3Q6OmdyYXBoX3RyYWl0czxncmFwaF90Pjo6YWRqYWNlbmN5X2l0ZXJhdG9yICBhZGphY2VuY3lfaXRlcmF0b3JfdDsKLQotICB0eXBlZGVmIHN0ZDo6bWFwPHZlcnRleF9kZXNjcmlwdG9yX3QsIHN0ZDo6c2l6ZV90PiAgICAgICAgdmVydGV4X2Rlc2NyaXB0b3JfbWFwX3Q7Ci0gIC8vdHlwZWRlZiBib29zdDo6cHJvcGVydHlfbWFwPGdyYXBoX3QsICZ2ZXJ0ZXhfcHJvcGVydGllc190OjpvYmpQdHI+Ojp0eXBlICAgICAgICAgICB0ZW1wUE07Ci0gIG5hbWVzcGFjZSBiZyAgPSBib29zdDo6Z2VvbWV0cnk7Ci0gIG5hbWVzcGFjZSBiZ2kgPSBib29zdDo6Z2VvbWV0cnk6OmluZGV4OwotCi0gIC8vdHlwZWRlZiBiZzo6bW9kZWw6OnBvaW50PGludCwgMiwgYmc6OmNzOjpjYXJ0ZXNpYW4+IGJvb3N0UG9pbnQ7Ci0gIHR5cGVkZWYgYmc6Om1vZGVsOjpkMjo6cG9pbnRfeHk8ZnJDb29yZCwgYmc6OmNzOjpjYXJ0ZXNpYW4+IGJvb3N0UG9pbnQ7Ci0gIHR5cGVkZWYgYmc6Om1vZGVsOjpib3g8Ym9vc3RQb2ludD4gYm9vc3RCb3g7Ci0gIHR5cGVkZWYgYmc6Om1vZGVsOjpwb2x5Z29uPGJvb3N0UG9pbnQ+IGJvb3N0UG9seWdvbjsKLSAgdHlwZWRlZiBiZzo6bW9kZWw6OnNlZ21lbnQ8Ym9vc3RQb2ludD4gYm9vc3RTZWdtZW50OwotCi0KLQotICAvL3R5cGVkZWYgYm9vc3Q6Omdlb21ldHJ5Ojptb2RlbDo6cG9pbnQ8ZnJDb29yZCwgMiwgYm9vc3Q6Omdlb21ldHJ5Ojpjczo6Y2FydGVzaWFuPiAgIHBvaW50X3Q7Ci0gIHR5cGVkZWYgYmc6Om1vZGVsOjpkMjo6cG9pbnRfeHk8ZnJDb29yZCwgYmc6OmNzOjpjYXJ0ZXNpYW4+ICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3Q7Ci0gIHR5cGVkZWYgYmc6Om1vZGVsOjpib3g8cG9pbnRfdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveF90OwotICB0eXBlZGVmIGJnOjptb2RlbDo6c2VnbWVudDxwb2ludF90PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50X3Q7Ci0gIGNsYXNzIGZyQ29ubkZpZzsKLSAgdHlwZWRlZiBzdGQ6OnBhaXI8Ym94X3QsIHN0ZDo6c2hhcmVkX3B0cjxmckNvbm5GaWc+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRyZWVfZnJDb25uRmlnX3ZhbHVlX3Q7Ci0gIC8vdHlwZWRlZiBzdGQ6OnBhaXI8Ym94X3QsIGludCogPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRyZWVfdGVzdF90OwotICB0eXBlZGVmIHN0ZDo6cGFpcjxib3hfdCwgc3RkOjpzaGFyZWRfcHRyPGZySW5zdD4gPiBydHJlZV9mckluc3RfdmFsdWVfdDsKLSAgdHlwZWRlZiBzdGQ6OnBhaXI8Ym94X3QsIHN0ZDo6c2hhcmVkX3B0cjxmclRlcm0+ID4gcnRyZWVfZnJUZXJtX3ZhbHVlX3Q7Ci0gIHR5cGVkZWYgc3RkOjpwYWlyPGJveF90LCBzdGQ6OnBhaXI8c3RkOjpzaGFyZWRfcHRyPGZyVGVybT4sIHN0ZDo6c2hhcmVkX3B0cjxmckluc3RUZXJtPiA+ID4gcnRyZWVfZnJUZXJtX2ZySW5zdFRlcm1fdmFsdWVfdDsKLSAgdHlwZWRlZiBzdGQ6OnBhaXI8Ym94X3QsIHN0ZDo6c2hhcmVkX3B0cjxmckJsb2NrYWdlPiA+IHJ0cmVlX2ZyQmxvY2thZ2VfdmFsdWVfdDsKLSAgLy90eXBlZGVmIHN0ZDo6cGFpcjxib3hfdCwgc3RkOjpzdHJpbmcgPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHJlZV92YWx1ZV90OwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgdXNpbmcgcnFfaXRlcl92YWx1ZV90ID0gc3RkOjpwYWlyPGJveF90LCBmckxpc3RJdGVyPFQ+ID47Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICB1c2luZyBycV9wdHJfdmFsdWVfdCAgPSBzdGQ6OnBhaXI8Ym94X3QsIHN0ZDo6c2hhcmVkX3B0cjxUPiA+OwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgdXNpbmcgcnFfcnB0cl92YWx1ZV90ID0gc3RkOjpwYWlyPGJveF90LCBUKiA+OwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgdXNpbmcgcnFfZ2VuZXJpY192YWx1ZV90ID0gc3RkOjpwYWlyPGJveF90LCBUPjsKLQotICAvLyBLTUIgZGF0YSB0eXBlcwotICB0eXBlZGVmIGJvb3N0OjphZGphY2VuY3lfbGlzdCA8IGJvb3N0Ojp2ZWNTLCBib29zdDo6dmVjUywgYm9vc3Q6OnVuZGlyZWN0ZWRTLCB2ZXJ0ZXhfcHJvcGVydGllc190LCBib29zdDo6cHJvcGVydHkgPCBib29zdDo6ZWRnZV93ZWlnaHRfdCwgZG91YmxlID4gPiBLTUJHcmFwaDsgCi0gIC8vIHR5cGVkZWYgc3RkOjpwYWlyPGludCwgaW50PiBLTUJFZGdlOwotCi0gIC8vIERSQyBjaGVjayB0eXBlcwotICB0eXBlZGVmIHN0ZDo6cGFpcjxib29zdFBvaW50LCBib29zdFBvaW50PiBib29zdEVkZ2U7Ci0KLQotICAvLyBCb29zdFBvbHlnb24KLSAgdHlwZWRlZiBib29zdDo6cG9seWdvbjo6cmVjdGFuZ2xlX2RhdGE8aW50PiAgUmVjdGFuZ2xlOwotICB0eXBlZGVmIGJvb3N0Ojpwb2x5Z29uOjpwb2x5Z29uXzkwX2RhdGE8aW50PiBQb2x5Z29uOwotICB0eXBlZGVmIHN0ZDo6dmVjdG9yPGJvb3N0Ojpwb2x5Z29uOjpwb2x5Z29uXzkwX2RhdGE8aW50PiA+IFBvbHlnb25TZXQ7Ci0gIHR5cGVkZWYgYm9vc3Q6OnBvbHlnb246OnBvaW50X2RhdGE8aW50PiBQb2ludDsKLSAgdHlwZWRlZiBib29zdDo6cG9seWdvbjo6aW50ZXJ2YWxfZGF0YTxpbnQ+IEludGVydmFsOwotICB0eXBlZGVmIGJvb3N0Ojpwb2x5Z29uOjpzZWdtZW50X2RhdGE8aW50PiBTZWdtZW50OwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2ZyRGVzaWduLmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9mckRlc2lnbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTIzOTg3Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2ZyRGVzaWduLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIF9GUl9ERVNJR05fSF8KLSNkZWZpbmUgX0ZSX0RFU0lHTl9IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgImdsb2JhbC5oIgotI2luY2x1ZGUgImZyQmFzZVR5cGVzLmgiCi0jaW5jbHVkZSAiZGIvb2JqL2ZyQmxvY2suaCIKLSNpbmNsdWRlICJkYi90ZWNoL2ZyVGVjaE9iamVjdC5oIgotI2luY2x1ZGUgImZyUmVnaW9uUXVlcnkuaCIKLQotbmFtZXNwYWNlIGZyIHsKLSAgbmFtZXNwYWNlIGlvIHsKLSAgICBjbGFzcyBQYXJzZXI7Ci0gIH0KLSAgY2xhc3MgZnJEZXNpZ24gewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3JzCi0gICAgZnJEZXNpZ24oKTogdG9wQmxvY2sobnVsbHB0ciksIHRlY2goc3RkOjptYWtlX3VuaXF1ZTxmclRlY2hPYmplY3Q+KCkpLCAKLSAgICAgICAgICAgICAgICBycShzdGQ6Om1ha2VfdW5pcXVlPGZyUmVnaW9uUXVlcnk+KHRoaXMpKSB7fQotICAgIC8vIGdldHRlcnMKLSAgICBmckJsb2NrKiBnZXRUb3BCbG9jaygpIGNvbnN0IHsKLSAgICAgIHJldHVybiB0b3BCbG9jay5nZXQoKTsKLSAgICB9Ci0gICAgZnJUZWNoT2JqZWN0KiBnZXRUZWNoKCkgY29uc3QgewotICAgICAgcmV0dXJuIHRlY2guZ2V0KCk7Ci0gICAgfQotICAgIGZyUmVnaW9uUXVlcnkqIGdldFJlZ2lvblF1ZXJ5KCkgY29uc3QgewotICAgICAgcmV0dXJuIHJxLmdldCgpOwotICAgIH0KLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZnJCbG9jaz4gPiYgZ2V0UmVmQmxvY2tzKCkgewotICAgICAgcmV0dXJuIHJlZkJsb2NrczsKLSAgICB9Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGZyQmxvY2s+ID4mIGdldFJlZkJsb2NrcygpIGNvbnN0IHsKLSAgICAgIHJldHVybiByZWZCbG9ja3M7Ci0gICAgfQotICAgIC8vIHNldHRlcnMKLSAgICB2b2lkIHNldFRvcEJsb2NrKHN0ZDo6dW5pcXVlX3B0cjxmckJsb2NrPiAmaW4pIHsKLSAgICAgIHRvcEJsb2NrID0gc3RkOjptb3ZlKGluKTsKLSAgICB9Ci0gICAgdm9pZCBhZGRSZWZCbG9jayhzdGQ6OnVuaXF1ZV9wdHI8ZnJCbG9jaz4gJmluKSB7Ci0gICAgICBuYW1lMnJlZkJsb2NrW2luLT5nZXROYW1lKCldID0gaW4uZ2V0KCk7Ci0gICAgICByZWZCbG9ja3MucHVzaF9iYWNrKHN0ZDo6bW92ZShpbikpOwotICAgIH0KLSAgICAvLyBvdGhlcnMKLSAgICB2b2lkIHByaW50QWxsTWFjcm9zKCk7Ci0gICAgdm9pZCBwcmludEFsbENvbXBzKCk7Ci0gICAgdm9pZCBwcmludEFsbFRlcm1zKCk7Ci0gICAgdm9pZCBwcmludENNYXAoKTsKLSAgICBmcmllbmQgY2xhc3MgaW86OlBhcnNlcjsKLSAgcHJvdGVjdGVkOgotICAgIHN0ZDo6dW5pcXVlX3B0cjxmckJsb2NrPiAgICAgICAgICAgICAgICAgICAgICB0b3BCbG9jazsKLSAgICBzdGQ6Om1hcDxmclN0cmluZywgZnJCbG9jayo+ICAgICAgICAgICAgICAgICAgbmFtZTJyZWZCbG9jazsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZnJCbG9jaz4gPiAgICAgICAgcmVmQmxvY2tzOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxmclRlY2hPYmplY3Q+ICAgICAgICAgICAgICAgICB0ZWNoOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxmclJlZ2lvblF1ZXJ5PiAgICAgICAgICAgICAgICBycTsKLSAgfTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9mclJlZ2lvblF1ZXJ5LmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2ZyUmVnaW9uUXVlcnkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGI0NGY4Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2ZyUmVnaW9uUXVlcnkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzEyICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJnbG9iYWwuaCIKLSNpbmNsdWRlICJmckRlc2lnbi5oIgotI2luY2x1ZGUgImZyUmVnaW9uUXVlcnkuaCIKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgZnI7Ci0KLXZvaWQgZnJSZWdpb25RdWVyeTo6YWRkKGZyU2hhcGUqIHNoYXBlKSB7Ci0gIGZyQm94IGZyYjsKLSAgYm94X3QgYm9vc3RiOwotICBpZiAoc2hhcGUtPnR5cGVJZCgpID09IGZyY1BhdGhTZWcgfHwgc2hhcGUtPnR5cGVJZCgpID09IGZyY1JlY3QpIHsKLSAgICBzaGFwZS0+Z2V0QkJveChmcmIpOwotICAgIGJvb3N0YiA9IGJveF90KHBvaW50X3QoZnJiLmxlZnQoKSwgZnJiLmJvdHRvbSgpKSwgcG9pbnRfdChmcmIucmlnaHQoKSwgZnJiLnRvcCgpKSk7Ci0gICAgc2hhcGVzLmF0KHNoYXBlLT5nZXRMYXllck51bSgpKS5pbnNlcnQobWFrZV9wYWlyKGJvb3N0Yiwgc2hhcGUpKTsKLSAgfSBlbHNlIHsKLSAgICBjb3V0IDw8IkVycm9yOiB1bnN1cHBvcnRlZCByZWdpb24gcXVlcnkgYWRkIiA8PGVuZGw7Ci0gIH0KLX0KLQotaW5saW5lIHZvaWQgZnJSZWdpb25RdWVyeTo6YWRkKGZyU2hhcGUqIHNoYXBlLCB2ZWN0b3I8dmVjdG9yPHJxX3JwdHJfdmFsdWVfdDxmckJsb2NrT2JqZWN0PiA+ID4gJmFsbFNoYXBlcykgewotICBmckJveCBmcmI7Ci0gIGJveF90IGJvb3N0YjsKLSAgaWYgKHNoYXBlLT50eXBlSWQoKSA9PSBmcmNQYXRoU2VnIHx8IHNoYXBlLT50eXBlSWQoKSA9PSBmcmNSZWN0KSB7Ci0gICAgc2hhcGUtPmdldEJCb3goZnJiKTsKLSAgICBib29zdGIgPSBib3hfdChwb2ludF90KGZyYi5sZWZ0KCksIGZyYi5ib3R0b20oKSksIHBvaW50X3QoZnJiLnJpZ2h0KCksIGZyYi50b3AoKSkpOwotICAgIGFsbFNoYXBlcy5hdChzaGFwZS0+Z2V0TGF5ZXJOdW0oKSkucHVzaF9iYWNrKG1ha2VfcGFpcihib29zdGIsIHNoYXBlKSk7Ci0gIH0gZWxzZSB7Ci0gICAgY291dCA8PCJFcnJvcjogdW5zdXBwb3J0ZWQgcmVnaW9uIHF1ZXJ5IGFkZCIgPDxlbmRsOwotICB9Ci19Ci0KLXZvaWQgZnJSZWdpb25RdWVyeTo6YWRkRFJPYmooZnJTaGFwZSogc2hhcGUpIHsKLSAgZnJCb3ggZnJiOwotICBib3hfdCBib29zdGI7Ci0gIGlmIChzaGFwZS0+dHlwZUlkKCkgPT0gZnJjUGF0aFNlZyB8fCBzaGFwZS0+dHlwZUlkKCkgPT0gZnJjUmVjdCB8fCBzaGFwZS0+dHlwZUlkKCkgPT0gZnJjUGF0Y2hXaXJlKSB7Ci0gICAgc2hhcGUtPmdldEJCb3goZnJiKTsKLSAgICBib29zdGIgPSBib3hfdChwb2ludF90KGZyYi5sZWZ0KCksIGZyYi5ib3R0b20oKSksIHBvaW50X3QoZnJiLnJpZ2h0KCksIGZyYi50b3AoKSkpOwotICAgIGRyT2Jqcy5hdChzaGFwZS0+Z2V0TGF5ZXJOdW0oKSkuaW5zZXJ0KG1ha2VfcGFpcihib29zdGIsIHNoYXBlKSk7Ci0gIH0gZWxzZSB7Ci0gICAgY291dCA8PCJFcnJvcjogdW5zdXBwb3J0ZWQgcmVnaW9uIHF1ZXJ5IGFkZCIgPDxlbmRsOwotICB9Ci19Ci0KLXZvaWQgZnJSZWdpb25RdWVyeTo6YWRkTWFya2VyKGZyTWFya2VyKiBpbikgewotICBmckJveCBmcmI7Ci0gIGJveF90IGJvb3N0YjsKLSAgaW4tPmdldEJCb3goZnJiKTsKLSAgYm9vc3RiID0gYm94X3QocG9pbnRfdChmcmIubGVmdCgpLCBmcmIuYm90dG9tKCkpLCBwb2ludF90KGZyYi5yaWdodCgpLCBmcmIudG9wKCkpKTsKLSAgbWFya2Vycy5hdChpbi0+Z2V0TGF5ZXJOdW0oKSkuaW5zZXJ0KG1ha2VfcGFpcihib29zdGIsIGluKSk7Ci19Ci0KLWlubGluZSB2b2lkIGZyUmVnaW9uUXVlcnk6OmFkZERST2JqKGZyU2hhcGUqIHNoYXBlLCB2ZWN0b3I8dmVjdG9yPHJxX3JwdHJfdmFsdWVfdDxmckJsb2NrT2JqZWN0PiA+ID4gJmFsbFNoYXBlcykgewotICBmckJveCBmcmI7Ci0gIGJveF90IGJvb3N0YjsKLSAgaWYgKHNoYXBlLT50eXBlSWQoKSA9PSBmcmNQYXRoU2VnIHx8IHNoYXBlLT50eXBlSWQoKSA9PSBmcmNSZWN0IHx8IHNoYXBlLT50eXBlSWQoKSA9PSBmcmNQYXRjaFdpcmUpIHsKLSAgICBzaGFwZS0+Z2V0QkJveChmcmIpOwotICAgIGJvb3N0YiA9IGJveF90KHBvaW50X3QoZnJiLmxlZnQoKSwgZnJiLmJvdHRvbSgpKSwgcG9pbnRfdChmcmIucmlnaHQoKSwgZnJiLnRvcCgpKSk7Ci0gICAgYWxsU2hhcGVzLmF0KHNoYXBlLT5nZXRMYXllck51bSgpKS5wdXNoX2JhY2sobWFrZV9wYWlyKGJvb3N0Yiwgc2hhcGUpKTsKLSAgfSBlbHNlIHsKLSAgICBjb3V0IDw8IkVycm9yOiB1bnN1cHBvcnRlZCByZWdpb24gcXVlcnkgYWRkIiA8PGVuZGw7Ci0gIH0KLX0KLQotdm9pZCBmclJlZ2lvblF1ZXJ5OjpyZW1vdmVEUk9iaihmclNoYXBlKiBzaGFwZSkgewotICBmckJveCBmcmI7Ci0gIGJveF90IGJvb3N0YjsKLSAgaWYgKHNoYXBlLT50eXBlSWQoKSA9PSBmcmNQYXRoU2VnIHx8IHNoYXBlLT50eXBlSWQoKSA9PSBmcmNSZWN0IHx8IHNoYXBlLT50eXBlSWQoKSA9PSBmcmNQYXRjaFdpcmUpIHsKLSAgICBzaGFwZS0+Z2V0QkJveChmcmIpOwotICAgIGJvb3N0YiA9IGJveF90KHBvaW50X3QoZnJiLmxlZnQoKSwgZnJiLmJvdHRvbSgpKSwgcG9pbnRfdChmcmIucmlnaHQoKSwgZnJiLnRvcCgpKSk7Ci0gICAgZHJPYmpzLmF0KHNoYXBlLT5nZXRMYXllck51bSgpKS5yZW1vdmUobWFrZV9wYWlyKGJvb3N0Yiwgc2hhcGUpKTsKLSAgfSBlbHNlIHsKLSAgICBjb3V0IDw8IkVycm9yOiB1bnN1cHBvcnRlZCByZWdpb24gcXVlcnkgYWRkIiA8PGVuZGw7Ci0gIH0KLX0KLQotdm9pZCBmclJlZ2lvblF1ZXJ5OjpyZW1vdmVNYXJrZXIoZnJNYXJrZXIqIGluKSB7Ci0gIGZyQm94IGZyYjsKLSAgYm94X3QgYm9vc3RiOwotICBpbi0+Z2V0QkJveChmcmIpOwotICBib29zdGIgPSBib3hfdChwb2ludF90KGZyYi5sZWZ0KCksIGZyYi5ib3R0b20oKSksIHBvaW50X3QoZnJiLnJpZ2h0KCksIGZyYi50b3AoKSkpOwotICBtYXJrZXJzLmF0KGluLT5nZXRMYXllck51bSgpKS5yZW1vdmUobWFrZV9wYWlyKGJvb3N0YiwgaW4pKTsKLX0KLQotdm9pZCBmclJlZ2lvblF1ZXJ5OjphZGQoZnJWaWEqIHZpYSkgewotICBmckJveCBmcmI7Ci0gIGZyVHJhbnNmb3JtIHhmb3JtOwotICBmclBvaW50IG9yaWdpbjsKLSAgdmlhLT5nZXRPcmlnaW4ob3JpZ2luKTsKLSAgeGZvcm0uc2V0KG9yaWdpbik7Ci0gIGJveF90IGJvb3N0YjsKLSAgZm9yIChhdXRvICZ1U2hhcGU6IHZpYS0+Z2V0VmlhRGVmKCktPmdldExheWVyMUZpZ3MoKSkgewotICAgIGF1dG8gc2hhcGUgPSB1U2hhcGUuZ2V0KCk7Ci0gICAgaWYgKHNoYXBlLT50eXBlSWQoKSA9PSBmcmNSZWN0KSB7Ci0gICAgICBzaGFwZS0+Z2V0QkJveChmcmIpOwotICAgICAgZnJiLnRyYW5zZm9ybSh4Zm9ybSk7Ci0gICAgICBib29zdGIgPSBib3hfdChwb2ludF90KGZyYi5sZWZ0KCksIGZyYi5ib3R0b20oKSksIHBvaW50X3QoZnJiLnJpZ2h0KCksIGZyYi50b3AoKSkpOwotICAgICAgc2hhcGVzLmF0KHZpYS0+Z2V0VmlhRGVmKCktPmdldExheWVyMU51bSgpKS5pbnNlcnQobWFrZV9wYWlyKGJvb3N0YiwgdmlhKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvdXQgPDwiRXJyb3I6IHVuc3VwcG9ydGVkIHJlZ2lvbiBxdWVyeSBhZGQiIDw8ZW5kbDsKLSAgICB9Ci0gIH0KLSAgZm9yIChhdXRvICZ1U2hhcGU6IHZpYS0+Z2V0VmlhRGVmKCktPmdldExheWVyMkZpZ3MoKSkgewotICAgIGF1dG8gc2hhcGUgPSB1U2hhcGUuZ2V0KCk7Ci0gICAgaWYgKHNoYXBlLT50eXBlSWQoKSA9PSBmcmNSZWN0KSB7Ci0gICAgICBzaGFwZS0+Z2V0QkJveChmcmIpOwotICAgICAgZnJiLnRyYW5zZm9ybSh4Zm9ybSk7Ci0gICAgICBib29zdGIgPSBib3hfdChwb2ludF90KGZyYi5sZWZ0KCksIGZyYi5ib3R0b20oKSksIHBvaW50X3QoZnJiLnJpZ2h0KCksIGZyYi50b3AoKSkpOwotICAgICAgc2hhcGVzLmF0KHZpYS0+Z2V0VmlhRGVmKCktPmdldExheWVyMk51bSgpKS5pbnNlcnQobWFrZV9wYWlyKGJvb3N0YiwgdmlhKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvdXQgPDwiRXJyb3I6IHVuc3VwcG9ydGVkIHJlZ2lvbiBxdWVyeSBhZGQiIDw8ZW5kbDsKLSAgICB9Ci0gIH0KLSAgZm9yIChhdXRvICZ1U2hhcGU6IHZpYS0+Z2V0VmlhRGVmKCktPmdldEN1dEZpZ3MoKSkgewotICAgIGF1dG8gc2hhcGUgPSB1U2hhcGUuZ2V0KCk7Ci0gICAgaWYgKHNoYXBlLT50eXBlSWQoKSA9PSBmcmNSZWN0KSB7Ci0gICAgICBzaGFwZS0+Z2V0QkJveChmcmIpOwotICAgICAgZnJiLnRyYW5zZm9ybSh4Zm9ybSk7Ci0gICAgICBib29zdGIgPSBib3hfdChwb2ludF90KGZyYi5sZWZ0KCksIGZyYi5ib3R0b20oKSksIHBvaW50X3QoZnJiLnJpZ2h0KCksIGZyYi50b3AoKSkpOwotICAgICAgc2hhcGVzLmF0KHZpYS0+Z2V0VmlhRGVmKCktPmdldEN1dExheWVyTnVtKCkpLmluc2VydChtYWtlX3BhaXIoYm9vc3RiLCB2aWEpKTsKLSAgICB9IGVsc2UgewotICAgICAgY291dCA8PCJFcnJvcjogdW5zdXBwb3J0ZWQgcmVnaW9uIHF1ZXJ5IGFkZCIgPDxlbmRsOwotICAgIH0KLSAgfQotfQotCi1pbmxpbmUgdm9pZCBmclJlZ2lvblF1ZXJ5OjphZGQoZnJWaWEqIHZpYSwgdmVjdG9yPHZlY3RvcjxycV9ycHRyX3ZhbHVlX3Q8ZnJCbG9ja09iamVjdD4gPiA+ICZhbGxTaGFwZXMpIHsKLSAgZnJCb3ggZnJiOwotICBmclRyYW5zZm9ybSB4Zm9ybTsKLSAgZnJQb2ludCBvcmlnaW47Ci0gIHZpYS0+Z2V0T3JpZ2luKG9yaWdpbik7Ci0gIHhmb3JtLnNldChvcmlnaW4pOwotICBib3hfdCBib29zdGI7Ci0gIGZvciAoYXV0byAmdVNoYXBlOiB2aWEtPmdldFZpYURlZigpLT5nZXRMYXllcjFGaWdzKCkpIHsKLSAgICBhdXRvIHNoYXBlID0gdVNoYXBlLmdldCgpOwotICAgIGlmIChzaGFwZS0+dHlwZUlkKCkgPT0gZnJjUmVjdCkgewotICAgICAgc2hhcGUtPmdldEJCb3goZnJiKTsKLSAgICAgIGZyYi50cmFuc2Zvcm0oeGZvcm0pOwotICAgICAgYm9vc3RiID0gYm94X3QocG9pbnRfdChmcmIubGVmdCgpLCBmcmIuYm90dG9tKCkpLCBwb2ludF90KGZyYi5yaWdodCgpLCBmcmIudG9wKCkpKTsKLSAgICAgIGFsbFNoYXBlcy5hdCh2aWEtPmdldFZpYURlZigpLT5nZXRMYXllcjFOdW0oKSkucHVzaF9iYWNrKG1ha2VfcGFpcihib29zdGIsIHZpYSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBjb3V0IDw8IkVycm9yOiB1bnN1cHBvcnRlZCByZWdpb24gcXVlcnkgYWRkIiA8PGVuZGw7Ci0gICAgfQotICB9Ci0gIGZvciAoYXV0byAmdVNoYXBlOiB2aWEtPmdldFZpYURlZigpLT5nZXRMYXllcjJGaWdzKCkpIHsKLSAgICBhdXRvIHNoYXBlID0gdVNoYXBlLmdldCgpOwotICAgIGlmIChzaGFwZS0+dHlwZUlkKCkgPT0gZnJjUmVjdCkgewotICAgICAgc2hhcGUtPmdldEJCb3goZnJiKTsKLSAgICAgIGZyYi50cmFuc2Zvcm0oeGZvcm0pOwotICAgICAgYm9vc3RiID0gYm94X3QocG9pbnRfdChmcmIubGVmdCgpLCBmcmIuYm90dG9tKCkpLCBwb2ludF90KGZyYi5yaWdodCgpLCBmcmIudG9wKCkpKTsKLSAgICAgIGFsbFNoYXBlcy5hdCh2aWEtPmdldFZpYURlZigpLT5nZXRMYXllcjJOdW0oKSkucHVzaF9iYWNrKG1ha2VfcGFpcihib29zdGIsIHZpYSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBjb3V0IDw8IkVycm9yOiB1bnN1cHBvcnRlZCByZWdpb24gcXVlcnkgYWRkIiA8PGVuZGw7Ci0gICAgfQotICB9Ci0gIGZvciAoYXV0byAmdVNoYXBlOiB2aWEtPmdldFZpYURlZigpLT5nZXRDdXRGaWdzKCkpIHsKLSAgICBhdXRvIHNoYXBlID0gdVNoYXBlLmdldCgpOwotICAgIGlmIChzaGFwZS0+dHlwZUlkKCkgPT0gZnJjUmVjdCkgewotICAgICAgc2hhcGUtPmdldEJCb3goZnJiKTsKLSAgICAgIGZyYi50cmFuc2Zvcm0oeGZvcm0pOwotICAgICAgYm9vc3RiID0gYm94X3QocG9pbnRfdChmcmIubGVmdCgpLCBmcmIuYm90dG9tKCkpLCBwb2ludF90KGZyYi5yaWdodCgpLCBmcmIudG9wKCkpKTsKLSAgICAgIGFsbFNoYXBlcy5hdCh2aWEtPmdldFZpYURlZigpLT5nZXRDdXRMYXllck51bSgpKS5wdXNoX2JhY2sobWFrZV9wYWlyKGJvb3N0YiwgdmlhKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvdXQgPDwiRXJyb3I6IHVuc3VwcG9ydGVkIHJlZ2lvbiBxdWVyeSBhZGQiIDw8ZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBmclJlZ2lvblF1ZXJ5OjphZGREUk9iaihmclZpYSogdmlhKSB7Ci0gIGZyQm94IGZyYjsKLSAgdmlhLT5nZXRCQm94KGZyYik7Ci0gIGJveF90IGJvb3N0Yihwb2ludF90KGZyYi5sZWZ0KCksIGZyYi5ib3R0b20oKSksIHBvaW50X3QoZnJiLnJpZ2h0KCksIGZyYi50b3AoKSkpOwotICBkck9ianMuYXQodmlhLT5nZXRWaWFEZWYoKS0+Z2V0Q3V0TGF5ZXJOdW0oKSkuaW5zZXJ0KG1ha2VfcGFpcihib29zdGIsIHZpYSkpOwotfQotCi1pbmxpbmUgdm9pZCBmclJlZ2lvblF1ZXJ5OjphZGREUk9iaihmclZpYSogdmlhLCB2ZWN0b3I8dmVjdG9yPHJxX3JwdHJfdmFsdWVfdDxmckJsb2NrT2JqZWN0PiA+ID4gJmFsbFNoYXBlcykgewotICBmckJveCBmcmI7Ci0gIHZpYS0+Z2V0QkJveChmcmIpOwotICBib3hfdCBib29zdGIocG9pbnRfdChmcmIubGVmdCgpLCBmcmIuYm90dG9tKCkpLCBwb2ludF90KGZyYi5yaWdodCgpLCBmcmIudG9wKCkpKTsKLSAgYWxsU2hhcGVzLmF0KHZpYS0+Z2V0VmlhRGVmKCktPmdldEN1dExheWVyTnVtKCkpLnB1c2hfYmFjayhtYWtlX3BhaXIoYm9vc3RiLCB2aWEpKTsKLX0KLQotdm9pZCBmclJlZ2lvblF1ZXJ5OjpyZW1vdmVEUk9iaihmclZpYSogdmlhKSB7Ci0gIGZyQm94IGZyYjsKLSAgdmlhLT5nZXRCQm94KGZyYik7Ci0gIGJveF90IGJvb3N0Yihwb2ludF90KGZyYi5sZWZ0KCksIGZyYi5ib3R0b20oKSksIHBvaW50X3QoZnJiLnJpZ2h0KCksIGZyYi50b3AoKSkpOwotICBkck9ianMuYXQodmlhLT5nZXRWaWFEZWYoKS0+Z2V0Q3V0TGF5ZXJOdW0oKSkucmVtb3ZlKG1ha2VfcGFpcihib29zdGIsIHZpYSkpOwotfQotCi12b2lkIGZyUmVnaW9uUXVlcnk6OmFkZChmckluc3RUZXJtKiBpbnN0VGVybSkgewotICBmckJveCBmcmI7Ci0gIGJveF90IGJvb3N0YjsKLQotICAvL2ZyVHJhbnNmb3JtIHhmb3JtOwotICAvL2luc3RUZXJtLT5nZXRJbnN0KCktPmdldFRyYW5zZm9ybSh4Zm9ybSk7Ci0KLSAgLy9mckJveCBtYm94OwotICAvL2luc3RUZXJtLT5nZXRJbnN0KCktPmdldFJlZkJsb2NrKCktPmdldEJvdW5kYXJ5QkJveChtYm94KTsKLSAgLy8vLyBhZGQgb3JpZ2luCi0gIC8veGZvcm0uc2V0KHhmb3JtLnhPZmZzZXQoKSArIG1ib3gubGVmdCgpLCB4Zm9ybS55T2Zmc2V0KCkgKyBtYm94LmJvdHRvbSgpKTsKLSAgLy9mclBvaW50IHNpemUobWJveC5yaWdodCgpLCBtYm94LnRvcCgpKTsKLSAgLy94Zm9ybS51cGRhdGVYZm9ybShzaXplKTsKLSAgZnJUcmFuc2Zvcm0geGZvcm07Ci0gIGluc3RUZXJtLT5nZXRJbnN0KCktPmdldFVwZGF0ZWRYZm9ybSh4Zm9ybSk7Ci0KLSAgZm9yIChhdXRvICZwaW46IGluc3RUZXJtLT5nZXRUZXJtKCktPmdldFBpbnMoKSkgewotICAgIGZvciAoYXV0byAmdUZpZzogcGluLT5nZXRGaWdzKCkpIHsKLSAgICAgIGF1dG8gc2hhcGUgPSB1RmlnLmdldCgpOwotICAgICAgaWYgKHNoYXBlLT50eXBlSWQoKSA9PSBmcmNQYXRoU2VnIHx8IHNoYXBlLT50eXBlSWQoKSA9PSBmcmNSZWN0KSB7Ci0gICAgICAgIHNoYXBlLT5nZXRCQm94KGZyYik7Ci0gICAgICAgIGZyYi50cmFuc2Zvcm0oeGZvcm0pOwotICAgICAgICBib29zdGIgPSBib3hfdChwb2ludF90KGZyYi5sZWZ0KCksIGZyYi5ib3R0b20oKSksIHBvaW50X3QoZnJiLnJpZ2h0KCksIGZyYi50b3AoKSkpOwotICAgICAgICBzaGFwZXMuYXQoc3RhdGljX2Nhc3Q8ZnJTaGFwZSo+KHNoYXBlKS0+Z2V0TGF5ZXJOdW0oKSkuaW5zZXJ0KG1ha2VfcGFpcihib29zdGIsIGluc3RUZXJtKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb3V0IDw8IkVycm9yOiB1bnN1cHBvcnRlZCByZWdpb24gcXVlcnkgYWRkIiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLWlubGluZSB2b2lkIGZyUmVnaW9uUXVlcnk6OmFkZChmckluc3RUZXJtKiBpbnN0VGVybSwgdmVjdG9yPHZlY3RvcjxycV9ycHRyX3ZhbHVlX3Q8ZnJCbG9ja09iamVjdD4gPiA+ICZhbGxTaGFwZXMpIHsKLSAgZnJCb3ggZnJiOwotICBib3hfdCBib29zdGI7Ci0KLSAgLy9mclRyYW5zZm9ybSB4Zm9ybTsKLSAgLy9pbnN0VGVybS0+Z2V0SW5zdCgpLT5nZXRUcmFuc2Zvcm0oeGZvcm0pOwotCi0gIC8vaW5zdFRlcm0tPmdldEluc3QoKS0+Z2V0UmVmQmxvY2soKS0+Z2V0Qm91bmRhcnlCQm94KGZyYik7Ci0gIC8veGZvcm0udXBkYXRlWGZvcm0oZnJiLnVwcGVyUmlnaHQoKSk7Ci0gIGZyVHJhbnNmb3JtIHhmb3JtOwotICBpbnN0VGVybS0+Z2V0SW5zdCgpLT5nZXRVcGRhdGVkWGZvcm0oeGZvcm0pOwotCi0gIGZvciAoYXV0byAmcGluOiBpbnN0VGVybS0+Z2V0VGVybSgpLT5nZXRQaW5zKCkpIHsKLSAgICBmb3IgKGF1dG8gJnVGaWc6IHBpbi0+Z2V0RmlncygpKSB7Ci0gICAgICBhdXRvIHNoYXBlID0gdUZpZy5nZXQoKTsKLSAgICAgIGlmIChzaGFwZS0+dHlwZUlkKCkgPT0gZnJjUGF0aFNlZyB8fCBzaGFwZS0+dHlwZUlkKCkgPT0gZnJjUmVjdCkgewotICAgICAgICBzaGFwZS0+Z2V0QkJveChmcmIpOwotICAgICAgICBmcmIudHJhbnNmb3JtKHhmb3JtKTsKLSAgICAgICAgYm9vc3RiID0gYm94X3QocG9pbnRfdChmcmIubGVmdCgpLCBmcmIuYm90dG9tKCkpLCBwb2ludF90KGZyYi5yaWdodCgpLCBmcmIudG9wKCkpKTsKLSAgICAgICAgYWxsU2hhcGVzLmF0KHN0YXRpY19jYXN0PGZyU2hhcGUqPihzaGFwZSktPmdldExheWVyTnVtKCkpLnB1c2hfYmFjayhtYWtlX3BhaXIoYm9vc3RiLCBpbnN0VGVybSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogdW5zdXBwb3J0ZWQgcmVnaW9uIHF1ZXJ5IGFkZCIgPDxlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi12b2lkIGZyUmVnaW9uUXVlcnk6OmFkZChmclRlcm0qIHRlcm0pIHsKLSAgZnJCb3ggZnJiOwotICBib3hfdCBib29zdGI7Ci0gIGZvciAoYXV0byAmcGluOiB0ZXJtLT5nZXRQaW5zKCkpIHsKLSAgICBmb3IgKGF1dG8gJnVGaWc6IHBpbi0+Z2V0RmlncygpKSB7Ci0gICAgICBhdXRvIHNoYXBlID0gdUZpZy5nZXQoKTsKLSAgICAgIGlmIChzaGFwZS0+dHlwZUlkKCkgPT0gZnJjUGF0aFNlZyB8fCBzaGFwZS0+dHlwZUlkKCkgPT0gZnJjUmVjdCkgewotICAgICAgICBzaGFwZS0+Z2V0QkJveChmcmIpOwotICAgICAgICBib29zdGIgPSBib3hfdChwb2ludF90KGZyYi5sZWZ0KCksIGZyYi5ib3R0b20oKSksIHBvaW50X3QoZnJiLnJpZ2h0KCksIGZyYi50b3AoKSkpOwotICAgICAgICBzaGFwZXMuYXQoc3RhdGljX2Nhc3Q8ZnJTaGFwZSo+KHNoYXBlKS0+Z2V0TGF5ZXJOdW0oKSkuaW5zZXJ0KG1ha2VfcGFpcihib29zdGIsIHRlcm0pKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiRXJyb3I6IHVuc3VwcG9ydGVkIHJlZ2lvbiBxdWVyeSBhZGQiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotaW5saW5lIHZvaWQgZnJSZWdpb25RdWVyeTo6YWRkKGZyVGVybSogdGVybSwgdmVjdG9yPHZlY3RvcjxycV9ycHRyX3ZhbHVlX3Q8ZnJCbG9ja09iamVjdD4gPiA+ICZhbGxTaGFwZXMpIHsKLSAgZnJCb3ggZnJiOwotICBib3hfdCBib29zdGI7Ci0gIGZvciAoYXV0byAmcGluOiB0ZXJtLT5nZXRQaW5zKCkpIHsKLSAgICBmb3IgKGF1dG8gJnVGaWc6IHBpbi0+Z2V0RmlncygpKSB7Ci0gICAgICBhdXRvIHNoYXBlID0gdUZpZy5nZXQoKTsKLSAgICAgIGlmIChzaGFwZS0+dHlwZUlkKCkgPT0gZnJjUGF0aFNlZyB8fCBzaGFwZS0+dHlwZUlkKCkgPT0gZnJjUmVjdCkgewotICAgICAgICBzaGFwZS0+Z2V0QkJveChmcmIpOwotICAgICAgICBib29zdGIgPSBib3hfdChwb2ludF90KGZyYi5sZWZ0KCksIGZyYi5ib3R0b20oKSksIHBvaW50X3QoZnJiLnJpZ2h0KCksIGZyYi50b3AoKSkpOwotICAgICAgICBhbGxTaGFwZXMuYXQoc3RhdGljX2Nhc3Q8ZnJTaGFwZSo+KHNoYXBlKS0+Z2V0TGF5ZXJOdW0oKSkucHVzaF9iYWNrKG1ha2VfcGFpcihib29zdGIsIHRlcm0pKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiRXJyb3I6IHVuc3VwcG9ydGVkIHJlZ2lvbiBxdWVyeSBhZGQiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBmclJlZ2lvblF1ZXJ5OjphZGQoZnJJbnN0QmxvY2thZ2UqIGluc3RCbGspIHsKLSAgZnJCb3ggZnJiOwotICBib3hfdCBib29zdGI7Ci0KLSAgLy9mclRyYW5zZm9ybSB4Zm9ybTsKLSAgLy9pbnN0QmxrLT5nZXRJbnN0KCktPmdldFRyYW5zZm9ybSh4Zm9ybSk7Ci0KLSAgLy9pbnN0QmxrLT5nZXRJbnN0KCktPmdldFJlZkJsb2NrKCktPmdldEJvdW5kYXJ5QkJveChmcmIpOwotICAvL3hmb3JtLnVwZGF0ZVhmb3JtKGZyYi51cHBlclJpZ2h0KCkpOwotICBmclRyYW5zZm9ybSB4Zm9ybTsKLSAgaW5zdEJsay0+Z2V0SW5zdCgpLT5nZXRVcGRhdGVkWGZvcm0oeGZvcm0pOwotICBhdXRvIGJsayA9IGluc3RCbGstPmdldEJsb2NrYWdlKCk7Ci0gIGlmIChibGstPmdldE51bVBvaW50cygpICE9IDQpIHsKLSAgICBjb3V0IDw8IkVycm9yOiB1bnN1cHBvcnRlZCBibG9ja2FnZSB0eXBlIiA8PGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGJsay0+dHlwZUlkKCkgPT0gZnJjTGF5ZXJCbG9ja2FnZSkgewotICAgICAgYmxrLT5nZXRCQm94KGZyYik7Ci0gICAgICBmcmIudHJhbnNmb3JtKHhmb3JtKTsKLSAgICAgIGJvb3N0YiA9IGJveF90KHBvaW50X3QoZnJiLmxlZnQoKSwgZnJiLmJvdHRvbSgpKSwgcG9pbnRfdChmcmIucmlnaHQoKSwgZnJiLnRvcCgpKSk7Ci0gICAgICBzaGFwZXMuYXQoc3RhdGljX2Nhc3Q8ZnJMYXllckJsb2NrYWdlKj4oYmxrKS0+Z2V0TGF5ZXJOdW0oKSkuaW5zZXJ0KG1ha2VfcGFpcihib29zdGIsIGluc3RCbGspKTsKLSAgICB9IGVsc2UgewotICAgICAgY291dCA8PCJFcnJvcjogdW5zdXBwb3J0ZWQgYmxvY2thZ2UgdHlwZSIgPDxlbmRsOwotICAgIH0KLSAgfQotfQotCi1pbmxpbmUgdm9pZCBmclJlZ2lvblF1ZXJ5OjphZGQoZnJJbnN0QmxvY2thZ2UqIGluc3RCbGssIHZlY3Rvcjx2ZWN0b3I8cnFfcnB0cl92YWx1ZV90PGZyQmxvY2tPYmplY3Q+ID4gPiAmYWxsU2hhcGVzKSB7Ci0gIGZyQm94IGZyYjsKLSAgYm94X3QgYm9vc3RiOwotCi0gIC8vZnJUcmFuc2Zvcm0geGZvcm07Ci0gIC8vaW5zdEJsay0+Z2V0SW5zdCgpLT5nZXRUcmFuc2Zvcm0oeGZvcm0pOwotCi0gIC8vaW5zdEJsay0+Z2V0SW5zdCgpLT5nZXRSZWZCbG9jaygpLT5nZXRCb3VuZGFyeUJCb3goZnJiKTsKLSAgLy94Zm9ybS51cGRhdGVYZm9ybShmcmIudXBwZXJSaWdodCgpKTsKLSAgZnJUcmFuc2Zvcm0geGZvcm07Ci0gIGluc3RCbGstPmdldEluc3QoKS0+Z2V0VXBkYXRlZFhmb3JtKHhmb3JtKTsKLSAgYXV0byBibGsgPSBpbnN0QmxrLT5nZXRCbG9ja2FnZSgpOwotICBpZiAoYmxrLT5nZXROdW1Qb2ludHMoKSAhPSA0KSB7Ci0gICAgY291dCA8PCJFcnJvcjogdW5zdXBwb3J0ZWQgYmxvY2thZ2UgdHlwZSIgPDxlbmRsOwotICB9IGVsc2UgewotICAgIGlmIChibGstPnR5cGVJZCgpID09IGZyY0xheWVyQmxvY2thZ2UpIHsKLSAgICAgIGJsay0+Z2V0QkJveChmcmIpOwotICAgICAgZnJiLnRyYW5zZm9ybSh4Zm9ybSk7Ci0gICAgICBib29zdGIgPSBib3hfdChwb2ludF90KGZyYi5sZWZ0KCksIGZyYi5ib3R0b20oKSksIHBvaW50X3QoZnJiLnJpZ2h0KCksIGZyYi50b3AoKSkpOwotICAgICAgYWxsU2hhcGVzLmF0KHN0YXRpY19jYXN0PGZyTGF5ZXJCbG9ja2FnZSo+KGJsayktPmdldExheWVyTnVtKCkpLnB1c2hfYmFjayhtYWtlX3BhaXIoYm9vc3RiLCBpbnN0QmxrKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvdXQgPDwiRXJyb3I6IHVuc3VwcG9ydGVkIGJsb2NrYWdlIHR5cGUiIDw8ZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBmclJlZ2lvblF1ZXJ5OjphZGQoZnJCbG9ja2FnZSogYmxrKSB7Ci0gIGZyQm94IGZyYjsKLSAgYm94X3QgYm9vc3RiOwotICBpZiAoYmxrLT5nZXROdW1Qb2ludHMoKSAhPSA0KSB7Ci0gICAgY291dCA8PCJFcnJvcjogdW5zdXBwb3J0ZWQgYmxvY2thZ2UgdHlwZSIgPDxlbmRsOwotICB9IGVsc2UgewotICAgIGJsay0+Z2V0QkJveChmcmIpOwotICAgIGlmIChibGstPnR5cGVJZCgpID09IGZyY0xheWVyQmxvY2thZ2UpIHsKLSAgICAgIGJsay0+Z2V0QkJveChmcmIpOwotICAgICAgYm9vc3RiID0gYm94X3QocG9pbnRfdChmcmIubGVmdCgpLCBmcmIuYm90dG9tKCkpLCBwb2ludF90KGZyYi5yaWdodCgpLCBmcmIudG9wKCkpKTsKLSAgICAgIHNoYXBlcy5hdChzdGF0aWNfY2FzdDxmckxheWVyQmxvY2thZ2UqPihibGspLT5nZXRMYXllck51bSgpKS5pbnNlcnQobWFrZV9wYWlyKGJvb3N0YiwgYmxrKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvdXQgPDwiRXJyb3I6IHVuc3VwcG9ydGVkIGJsb2NrYWdlIHR5cGUiIDw8ZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotaW5saW5lIHZvaWQgZnJSZWdpb25RdWVyeTo6YWRkKGZyQmxvY2thZ2UqIGJsaywgdmVjdG9yPHZlY3RvcjxycV9ycHRyX3ZhbHVlX3Q8ZnJCbG9ja09iamVjdD4gPiA+ICZhbGxTaGFwZXMpIHsKLSAgZnJCb3ggZnJiOwotICBib3hfdCBib29zdGI7Ci0gIGlmIChibGstPmdldE51bVBvaW50cygpICE9IDQpIHsKLSAgICBjb3V0IDw8IkVycm9yOiB1bnN1cHBvcnRlZCBibG9ja2FnZSB0eXBlIiA8PGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgYmxrLT5nZXRCQm94KGZyYik7Ci0gICAgaWYgKGJsay0+dHlwZUlkKCkgPT0gZnJjTGF5ZXJCbG9ja2FnZSkgewotICAgICAgYmxrLT5nZXRCQm94KGZyYik7Ci0gICAgICBib29zdGIgPSBib3hfdChwb2ludF90KGZyYi5sZWZ0KCksIGZyYi5ib3R0b20oKSksIHBvaW50X3QoZnJiLnJpZ2h0KCksIGZyYi50b3AoKSkpOwotICAgICAgYWxsU2hhcGVzLmF0KHN0YXRpY19jYXN0PGZyTGF5ZXJCbG9ja2FnZSo+KGJsayktPmdldExheWVyTnVtKCkpLnB1c2hfYmFjayhtYWtlX3BhaXIoYm9vc3RiLCBibGspKTsKLSAgICB9IGVsc2UgewotICAgICAgY291dCA8PCJFcnJvcjogdW5zdXBwb3J0ZWQgYmxvY2thZ2UgdHlwZSIgPDxlbmRsOwotICAgIH0KLSAgfQotfQotCi12b2lkIGZyUmVnaW9uUXVlcnk6OmFkZEd1aWRlKGZyR3VpZGUqIGd1aWRlKSB7Ci0gIGZyQm94IGZyYjsKLSAgYm94X3QgYm9vc3RiOwotICBndWlkZS0+Z2V0QkJveChmcmIpOwotICBib29zdGIgPSBib3hfdChwb2ludF90KGZyYi5sZWZ0KCksIGZyYi5ib3R0b20oKSksIHBvaW50X3QoZnJiLnJpZ2h0KCksIGZyYi50b3AoKSkpOwotICBmb3IgKGludCBpID0gZ3VpZGUtPmdldEJlZ2luTGF5ZXJOdW0oKTsgaSA8PSBndWlkZS0+Z2V0RW5kTGF5ZXJOdW0oKTsgaSsrKSB7Ci0gICAgc2hhcGVzLmF0KGkpLmluc2VydChtYWtlX3BhaXIoYm9vc3RiLCBndWlkZSkpOwotICB9Ci19Ci0KLWlubGluZSB2b2lkIGZyUmVnaW9uUXVlcnk6OmFkZEd1aWRlKGZyR3VpZGUqIGd1aWRlLCB2ZWN0b3I8dmVjdG9yPHJxX3JwdHJfdmFsdWVfdDxmckd1aWRlPiA+ID4gJmFsbFNoYXBlcykgewotICBmckJveCBmcmI7Ci0gIGJveF90IGJvb3N0YjsKLSAgZ3VpZGUtPmdldEJCb3goZnJiKTsKLSAgYm9vc3RiID0gYm94X3QocG9pbnRfdChmcmIubGVmdCgpLCBmcmIuYm90dG9tKCkpLCBwb2ludF90KGZyYi5yaWdodCgpLCBmcmIudG9wKCkpKTsKLSAgZm9yIChpbnQgaSA9IGd1aWRlLT5nZXRCZWdpbkxheWVyTnVtKCk7IGkgPD0gZ3VpZGUtPmdldEVuZExheWVyTnVtKCk7IGkrKykgewotICAgIGFsbFNoYXBlcy5hdChpKS5wdXNoX2JhY2sobWFrZV9wYWlyKGJvb3N0YiwgZ3VpZGUpKTsKLSAgfQotfQotdm9pZCBmclJlZ2lvblF1ZXJ5OjpxdWVyeShjb25zdCBmckJveCAmYm94LCBmckxheWVyTnVtIGxheWVyTnVtLCB2ZWN0b3I8cnFfcnB0cl92YWx1ZV90PGZyQmxvY2tPYmplY3Q+ID4gJnJlc3VsdCkgewotICBib3hfdCBib29zdGIgPSBib3hfdChwb2ludF90KGJveC5sZWZ0KCksIGJveC5ib3R0b20oKSksIHBvaW50X3QoYm94LnJpZ2h0KCksIGJveC50b3AoKSkpOwotICBzaGFwZXMuYXQobGF5ZXJOdW0pLnF1ZXJ5KGJnaTo6aW50ZXJzZWN0cyhib29zdGIpLCBiYWNrX2luc2VydGVyKHJlc3VsdCkpOwotICAvL3RyYW5zZm9ybSh0ZW1wLmJlZ2luKCksIHRlbXAuZW5kKCksIGJhY2tfaW5zZXJ0ZXIocmVzdWx0KSwgW10oYXV0byAma3YpIHtyZXR1cm4ga3Yuc2Vjb25kO30pOwotfQotCi12b2lkIGZyUmVnaW9uUXVlcnk6OnF1ZXJ5R3VpZGUoY29uc3QgZnJCb3ggJmJveCwgZnJMYXllck51bSBsYXllck51bSwgdmVjdG9yPHJxX3JwdHJfdmFsdWVfdDxmckd1aWRlPiA+ICZyZXN1bHQpIHsKLSAgYm94X3QgYm9vc3RiID0gYm94X3QocG9pbnRfdChib3gubGVmdCgpLCBib3guYm90dG9tKCkpLCBwb2ludF90KGJveC5yaWdodCgpLCBib3gudG9wKCkpKTsKLSAgZ3VpZGVzLmF0KGxheWVyTnVtKS5xdWVyeShiZ2k6OmludGVyc2VjdHMoYm9vc3RiKSwgYmFja19pbnNlcnRlcihyZXN1bHQpKTsKLSAgLy90cmFuc2Zvcm0odGVtcC5iZWdpbigpLCB0ZW1wLmVuZCgpLCBiYWNrX2luc2VydGVyKHJlc3VsdCksIFtdKGF1dG8gJmt2KSB7cmV0dXJuIGt2LnNlY29uZDt9KTsKLX0KLXZvaWQgZnJSZWdpb25RdWVyeTo6cXVlcnlHdWlkZShjb25zdCBmckJveCAmYm94LCBmckxheWVyTnVtIGxheWVyTnVtLCB2ZWN0b3I8ZnJHdWlkZSo+ICZyZXN1bHQpIHsKLSAgdmVjdG9yPHJxX3JwdHJfdmFsdWVfdDxmckd1aWRlPiA+IHRlbXA7Ci0gIGJveF90IGJvb3N0YiA9IGJveF90KHBvaW50X3QoYm94LmxlZnQoKSwgYm94LmJvdHRvbSgpKSwgcG9pbnRfdChib3gucmlnaHQoKSwgYm94LnRvcCgpKSk7Ci0gIGd1aWRlcy5hdChsYXllck51bSkucXVlcnkoYmdpOjppbnRlcnNlY3RzKGJvb3N0YiksIGJhY2tfaW5zZXJ0ZXIodGVtcCkpOwotICB0cmFuc2Zvcm0odGVtcC5iZWdpbigpLCB0ZW1wLmVuZCgpLCBiYWNrX2luc2VydGVyKHJlc3VsdCksIFtdKGF1dG8gJmt2KSB7cmV0dXJuIGt2LnNlY29uZDt9KTsKLX0KLQotdm9pZCBmclJlZ2lvblF1ZXJ5OjpxdWVyeUd1aWRlKGNvbnN0IGZyQm94ICZib3gsIHZlY3Rvcjxmckd1aWRlKj4gJnJlc3VsdCkgewotICB2ZWN0b3I8cnFfcnB0cl92YWx1ZV90PGZyR3VpZGU+ID4gdGVtcDsKLSAgYm94X3QgYm9vc3RiID0gYm94X3QocG9pbnRfdChib3gubGVmdCgpLCBib3guYm90dG9tKCkpLCBwb2ludF90KGJveC5yaWdodCgpLCBib3gudG9wKCkpKTsKLSAgZm9yIChhdXRvICZtOiBndWlkZXMpIHsKLSAgICBtLnF1ZXJ5KGJnaTo6aW50ZXJzZWN0cyhib29zdGIpLCBiYWNrX2luc2VydGVyKHRlbXApKTsKLSAgfQotICB0cmFuc2Zvcm0odGVtcC5iZWdpbigpLCB0ZW1wLmVuZCgpLCBiYWNrX2luc2VydGVyKHJlc3VsdCksIFtdKGF1dG8gJmt2KSB7cmV0dXJuIGt2LnNlY29uZDt9KTsKLX0KLQotdm9pZCBmclJlZ2lvblF1ZXJ5OjpxdWVyeUdSUGluKGNvbnN0IGZyQm94ICZib3gsIHZlY3RvcjxmckJsb2NrT2JqZWN0Kj4gJnJlc3VsdCkgewotICB2ZWN0b3I8cnFfcnB0cl92YWx1ZV90PGZyQmxvY2tPYmplY3Q+ID4gdGVtcDsKLSAgYm94X3QgYm9vc3RiID0gYm94X3QocG9pbnRfdChib3gubGVmdCgpLCBib3guYm90dG9tKCkpLCBwb2ludF90KGJveC5yaWdodCgpLCBib3gudG9wKCkpKTsKLSAgZ3JQaW5zLnF1ZXJ5KGJnaTo6aW50ZXJzZWN0cyhib29zdGIpLCBiYWNrX2luc2VydGVyKHRlbXApKTsKLSAgdHJhbnNmb3JtKHRlbXAuYmVnaW4oKSwgdGVtcC5lbmQoKSwgYmFja19pbnNlcnRlcihyZXN1bHQpLCBbXShhdXRvICZrdikge3JldHVybiBrdi5zZWNvbmQ7fSk7Ci19Ci0KLXZvaWQgZnJSZWdpb25RdWVyeTo6cXVlcnlEUk9iaihjb25zdCBmckJveCAmYm94LCBmckxheWVyTnVtIGxheWVyTnVtLCB2ZWN0b3I8ZnJCbG9ja09iamVjdCo+ICZyZXN1bHQpIHsKLSAgdmVjdG9yPHJxX3JwdHJfdmFsdWVfdDxmckJsb2NrT2JqZWN0PiA+IHRlbXA7Ci0gIGJveF90IGJvb3N0YiA9IGJveF90KHBvaW50X3QoYm94LmxlZnQoKSwgYm94LmJvdHRvbSgpKSwgcG9pbnRfdChib3gucmlnaHQoKSwgYm94LnRvcCgpKSk7Ci0gIGRyT2Jqcy5hdChsYXllck51bSkucXVlcnkoYmdpOjppbnRlcnNlY3RzKGJvb3N0YiksIGJhY2tfaW5zZXJ0ZXIodGVtcCkpOwotICB0cmFuc2Zvcm0odGVtcC5iZWdpbigpLCB0ZW1wLmVuZCgpLCBiYWNrX2luc2VydGVyKHJlc3VsdCksIFtdKGF1dG8gJmt2KSB7cmV0dXJuIGt2LnNlY29uZDt9KTsKLX0KLQotdm9pZCBmclJlZ2lvblF1ZXJ5OjpxdWVyeURST2JqKGNvbnN0IGZyQm94ICZib3gsIHZlY3RvcjxmckJsb2NrT2JqZWN0Kj4gJnJlc3VsdCkgewotICB2ZWN0b3I8cnFfcnB0cl92YWx1ZV90PGZyQmxvY2tPYmplY3Q+ID4gdGVtcDsKLSAgYm94X3QgYm9vc3RiID0gYm94X3QocG9pbnRfdChib3gubGVmdCgpLCBib3guYm90dG9tKCkpLCBwb2ludF90KGJveC5yaWdodCgpLCBib3gudG9wKCkpKTsKLSAgZm9yIChhdXRvICZtOiBkck9ianMpIHsKLSAgICBtLnF1ZXJ5KGJnaTo6aW50ZXJzZWN0cyhib29zdGIpLCBiYWNrX2luc2VydGVyKHRlbXApKTsKLSAgfQotICB0cmFuc2Zvcm0odGVtcC5iZWdpbigpLCB0ZW1wLmVuZCgpLCBiYWNrX2luc2VydGVyKHJlc3VsdCksIFtdKGF1dG8gJmt2KSB7cmV0dXJuIGt2LnNlY29uZDt9KTsKLX0KLQotdm9pZCBmclJlZ2lvblF1ZXJ5OjpxdWVyeU1hcmtlcihjb25zdCBmckJveCAmYm94LCBmckxheWVyTnVtIGxheWVyTnVtLCB2ZWN0b3I8ZnJNYXJrZXIqPiAmcmVzdWx0KSB7Ci0gIHZlY3RvcjxycV9ycHRyX3ZhbHVlX3Q8ZnJNYXJrZXI+ID4gdGVtcDsKLSAgYm94X3QgYm9vc3RiID0gYm94X3QocG9pbnRfdChib3gubGVmdCgpLCBib3guYm90dG9tKCkpLCBwb2ludF90KGJveC5yaWdodCgpLCBib3gudG9wKCkpKTsKLSAgbWFya2Vycy5hdChsYXllck51bSkucXVlcnkoYmdpOjppbnRlcnNlY3RzKGJvb3N0YiksIGJhY2tfaW5zZXJ0ZXIodGVtcCkpOwotICB0cmFuc2Zvcm0odGVtcC5iZWdpbigpLCB0ZW1wLmVuZCgpLCBiYWNrX2luc2VydGVyKHJlc3VsdCksIFtdKGF1dG8gJmt2KSB7cmV0dXJuIGt2LnNlY29uZDt9KTsKLX0KLQotdm9pZCBmclJlZ2lvblF1ZXJ5OjpxdWVyeU1hcmtlcihjb25zdCBmckJveCAmYm94LCB2ZWN0b3I8ZnJNYXJrZXIqPiAmcmVzdWx0KSB7Ci0gIHZlY3RvcjxycV9ycHRyX3ZhbHVlX3Q8ZnJNYXJrZXI+ID4gdGVtcDsKLSAgYm94X3QgYm9vc3RiID0gYm94X3QocG9pbnRfdChib3gubGVmdCgpLCBib3guYm90dG9tKCkpLCBwb2ludF90KGJveC5yaWdodCgpLCBib3gudG9wKCkpKTsKLSAgZm9yIChhdXRvICZtOiBtYXJrZXJzKSB7Ci0gICAgbS5xdWVyeShiZ2k6OmludGVyc2VjdHMoYm9vc3RiKSwgYmFja19pbnNlcnRlcih0ZW1wKSk7Ci0gIH0KLSAgdHJhbnNmb3JtKHRlbXAuYmVnaW4oKSwgdGVtcC5lbmQoKSwgYmFja19pbnNlcnRlcihyZXN1bHQpLCBbXShhdXRvICZrdikge3JldHVybiBrdi5zZWNvbmQ7fSk7Ci19Ci0KLS8vdm9pZCBmclJlZ2lvblF1ZXJ5OjpxdWVyeShjb25zdCBmckJveCAmYm94LCB2ZWN0b3I8cnFfcnB0cl92YWx1ZV90PGZyQmxvY2tPYmplY3Q+ID4gJnJlc3VsdCkgewotLy8gIGJveF90IGJvb3N0YiA9IGJveF90KHBvaW50X3QoYm94LmxlZnQoKSwgYm94LmJvdHRvbSgpKSwgcG9pbnRfdChib3gucmlnaHQoKSwgYm94LnRvcCgpKSk7Ci0vLyAgZm9yIChhdXRvICZtOiBzaGFwZXMpIHsKLS8vICAgIG0ucXVlcnkoYmdpOjppbnRlcnNlY3RzKGJvb3N0YiksIGJhY2tfaW5zZXJ0ZXIocmVzdWx0KSk7Ci0vLyAgfQotLy8gIC8vdHJhbnNmb3JtKHRlbXAuYmVnaW4oKSwgdGVtcC5lbmQoKSwgYmFja19pbnNlcnRlcihyZXN1bHQpLCBbXShhdXRvICZrdikge3JldHVybiBrdi5zZWNvbmQ7fSk7Ci0vL30KLQotdm9pZCBmclJlZ2lvblF1ZXJ5Ojppbml0KGZyTGF5ZXJOdW0gbnVtTGF5ZXJzKSB7Ci0gIHNoYXBlcy5jbGVhcigpOwotICBzaGFwZXMucmVzaXplKG51bUxheWVycyk7Ci0KLSAgbWFya2Vycy5jbGVhcigpOwotICBtYXJrZXJzLnJlc2l6ZShudW1MYXllcnMpOwotCi0gIHZlY3Rvcjx2ZWN0b3I8cnFfcnB0cl92YWx1ZV90PGZyQmxvY2tPYmplY3Q+ID4gPiBhbGxTaGFwZXMobnVtTGF5ZXJzKTsKLQotICBpbnQgY250ID0gMDsKLSAgZm9yIChhdXRvICZpbnN0OiBkZXNpZ24tPmdldFRvcEJsb2NrKCktPmdldEluc3RzKCkpIHsKLSAgICBmb3IgKGF1dG8gJmluc3RUZXJtOiBpbnN0LT5nZXRJbnN0VGVybXMoKSkgewotICAgICAgYWRkKGluc3RUZXJtLmdldCgpLCBhbGxTaGFwZXMpOwotICAgIH0KLSAgICBmb3IgKGF1dG8gJmluc3RCbGs6IGluc3QtPmdldEluc3RCbG9ja2FnZXMoKSkgewotICAgICAgYWRkKGluc3RCbGsuZ2V0KCksIGFsbFNoYXBlcyk7Ci0gICAgfQotICAgIGNudCsrOwotICAgIGlmIChWRVJCT1NFID4gMCkgewotICAgICAgaWYgKGNudCA8IDEwMDAwMCkgewotICAgICAgICBpZiAoY250ICUgMTAwMDAgPT0gMCkgewotICAgICAgICAgIGNvdXQgPDwiICBjb21wbGV0ZSAiIDw8Y250IDw8IiBpbnN0cyIgPDxlbmRsOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoY250ICUgMTAwMDAwID09IDApIHsKLSAgICAgICAgICBjb3V0IDw8IiAgY29tcGxldGUgIiA8PGNudCA8PCIgaW5zdHMiIDw8ZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICBjbnQgPSAwOwotICBmb3IgKGF1dG8gJnRlcm06IGRlc2lnbi0+Z2V0VG9wQmxvY2soKS0+Z2V0VGVybXMoKSkgewotICAgIGFkZCh0ZXJtLmdldCgpLCBhbGxTaGFwZXMpOwotICAgIGNudCsrOwotICAgIGlmIChWRVJCT1NFID4gMCkgewotICAgICAgaWYgKGNudCA8IDEwMDAwMCkgewotICAgICAgICBpZiAoY250ICUgMTAwMDAgPT0gMCkgewotICAgICAgICAgIGNvdXQgPDwiICBjb21wbGV0ZSAiIDw8Y250IDw8IiB0ZXJtcyIgPDxlbmRsOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoY250ICUgMTAwMDAwID09IDApIHsKLSAgICAgICAgICBjb3V0IDw8IiAgY29tcGxldGUgIiA8PGNudCA8PCIgdGVybXMiIDw8ZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICAvKgotICBjbnQgPSAwOwotICBmb3IgKGF1dG8gJm5ldDogZGVzaWduLT5nZXRUb3BCbG9jaygpLT5nZXROZXRzKCkpIHsKLSAgICBmb3IgKGF1dG8gJnNoYXBlOiBuZXQtPmdldFNoYXBlcygpKSB7Ci0gICAgICBhZGQoc2hhcGUuZ2V0KCksIGFsbFNoYXBlcyk7Ci0gICAgfQotICAgIGZvciAoYXV0byAmdmlhOiBuZXQtPmdldFZpYXMoKSkgewotICAgICAgYWRkKHZpYS5nZXQoKSwgYWxsU2hhcGVzKTsKLSAgICB9Ci0gICAgY250Kys7Ci0gICAgaWYgKFZFUkJPU0UgPiAwKSB7Ci0gICAgICBpZiAoY250ICUgMTAwMDAgPT0gMCkgewotICAgICAgICBjb3V0IDw8IiAgY29tcGxldGUgIiA8PGNudCA8PCIgbmV0cyIgPDxlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotICAqLwotICBjbnQgPSAwOwotICBmb3IgKGF1dG8gJm5ldDogZGVzaWduLT5nZXRUb3BCbG9jaygpLT5nZXRTTmV0cygpKSB7Ci0gICAgZm9yIChhdXRvICZzaGFwZTogbmV0LT5nZXRTaGFwZXMoKSkgewotICAgICAgYWRkKHNoYXBlLmdldCgpLCBhbGxTaGFwZXMpOwotICAgIH0KLSAgICBmb3IgKGF1dG8gJnZpYTogbmV0LT5nZXRWaWFzKCkpIHsKLSAgICAgIGFkZCh2aWEuZ2V0KCksIGFsbFNoYXBlcyk7Ci0gICAgfQotICAgIGNudCsrOwotICAgIGlmIChWRVJCT1NFID4gMCkgewotICAgICAgaWYgKGNudCAlIDEwMDAwID09IDApIHsKLSAgICAgICAgY291dCA8PCIgIGNvbXBsZXRlICIgPDxjbnQgPDwiIHNuZXRzIiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgY250ID0gMDsKLSAgZm9yIChhdXRvICZibGs6IGRlc2lnbi0+Z2V0VG9wQmxvY2soKS0+Z2V0QmxvY2thZ2VzKCkpIHsKLSAgICBhZGQoYmxrLmdldCgpLCBhbGxTaGFwZXMpOwotICAgIGNudCsrOwotICAgIGlmIChWRVJCT1NFID4gMCkgewotICAgICAgaWYgKGNudCAlIDEwMDAwID09IDApIHsKLSAgICAgICAgY291dCA8PCIgIGNvbXBsZXRlICIgPDxjbnQgPDwiIGJsb2NrYWdlcyIgPDxlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZvciAoYXV0byBpID0gMDsgaSA8IG51bUxheWVyczsgaSsrKSB7Ci0gICAgc2hhcGVzLmF0KGkpID0gYm9vc3Q6Om1vdmUoYmdpOjpydHJlZTxycV9ycHRyX3ZhbHVlX3Q8ZnJCbG9ja09iamVjdD4sIGJnaTo6cXVhZHJhdGljPDE2PiA+KGFsbFNoYXBlcy5hdChpKSkpOwotICAgIGFsbFNoYXBlcy5hdChpKS5jbGVhcigpOwotICAgIGFsbFNoYXBlcy5hdChpKS5zaHJpbmtfdG9fZml0KCk7Ci0gICAgaWYgKFZFUkJPU0UgPiAwKSB7Ci0gICAgICBjb3V0IDw8IiAgY29tcGxldGUgIiA8PGRlc2lnbi0+Z2V0VGVjaCgpLT5nZXRMYXllcihpKS0+Z2V0TmFtZSgpIDw8ZW5kbDsKLSAgICB9Ci0gIH0KLQotfQotCi12b2lkIGZyUmVnaW9uUXVlcnk6OmluaXRHdWlkZShmckxheWVyTnVtIG51bUxheWVycykgewotICAvLyBndWlkZXMKLSAgLy9pZiAoVkVSQk9TRSA+IDApIHsKLSAgLy8gIDsKLSAgLy99Ci0gIGd1aWRlcy5jbGVhcigpOwotICBndWlkZXMucmVzaXplKG51bUxheWVycyk7Ci0gIHZlY3Rvcjx2ZWN0b3I8cnFfcnB0cl92YWx1ZV90PGZyR3VpZGU+ID4gPiBhbGxHdWlkZXMobnVtTGF5ZXJzKTsKLQotICBpbnQgY250ID0gMDsKLSAgZm9yIChhdXRvICZuZXQ6IGRlc2lnbi0+Z2V0VG9wQmxvY2soKS0+Z2V0TmV0cygpKSB7Ci0gICAgZm9yIChhdXRvICZndWlkZTogbmV0LT5nZXRHdWlkZXMoKSkgewotICAgICAgYWRkR3VpZGUoZ3VpZGUuZ2V0KCksIGFsbEd1aWRlcyk7Ci0gICAgfQotICAgIGNudCsrOwotICAgIGlmIChWRVJCT1NFID4gMCkgewotICAgICAgaWYgKGNudCA8IDEwMDAwMCkgewotICAgICAgICBpZiAoY250ICUgMTAwMDAgPT0gMCkgewotICAgICAgICAgIGNvdXQgPDwiICBjb21wbGV0ZSAiIDw8Y250IDw8IiBuZXRzIChndWlkZSkiIDw8ZW5kbDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGNudCAlIDEwMDAwMCA9PSAwKSB7Ci0gICAgICAgICAgY291dCA8PCIgIGNvbXBsZXRlICIgPDxjbnQgPDwiIG5ldHMgKGd1aWRlKSIgPDxlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGZvciAoYXV0byBpID0gMDsgaSA8IG51bUxheWVyczsgaSsrKSB7Ci0gICAgZ3VpZGVzLmF0KGkpID0gYm9vc3Q6Om1vdmUoYmdpOjpydHJlZTxycV9ycHRyX3ZhbHVlX3Q8ZnJHdWlkZT4sIGJnaTo6cXVhZHJhdGljPDE2PiA+KGFsbEd1aWRlcy5hdChpKSkpOwotICAgIGFsbEd1aWRlcy5hdChpKS5jbGVhcigpOwotICAgIGFsbEd1aWRlcy5hdChpKS5zaHJpbmtfdG9fZml0KCk7Ci0gICAgaWYgKFZFUkJPU0UgPiAwKSB7Ci0gICAgICBjb3V0IDw8IiAgY29tcGxldGUgIiA8PGRlc2lnbi0+Z2V0VGVjaCgpLT5nZXRMYXllcihpKS0+Z2V0TmFtZSgpIDw8IiAoZ3VpZGUpIjw8ZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBmclJlZ2lvblF1ZXJ5Ojppbml0R1JQaW4odmVjdG9yPHBhaXI8ZnJCbG9ja09iamVjdCosIGZyUG9pbnQ+ID4gJmluKSB7Ci0gIGdyUGlucy5jbGVhcigpOwotICB2ZWN0b3I8cnFfcnB0cl92YWx1ZV90PGZyQmxvY2tPYmplY3Q+ID4gYWxsR1JQaW5zOwotICBib3hfdCBib29zdGI7Ci0gIGZvciAoYXV0byAmW29iaiwgcHRdOiBpbikgewotICAgIGJvb3N0YiA9IGJveF90KHBvaW50X3QocHQueCgpLCBwdC55KCkpLCBwb2ludF90KHB0LngoKSwgcHQueSgpKSk7Ci0gICAgYWxsR1JQaW5zLnB1c2hfYmFjayhtYWtlX3BhaXIoYm9vc3RiLCBvYmopKTsKLSAgfQotICBpbi5jbGVhcigpOwotICBpbi5zaHJpbmtfdG9fZml0KCk7Ci0gIGdyUGlucyA9IGJvb3N0Ojptb3ZlKGJnaTo6cnRyZWU8cnFfcnB0cl92YWx1ZV90PGZyQmxvY2tPYmplY3Q+LCBiZ2k6OnF1YWRyYXRpYzwxNj4gPihhbGxHUlBpbnMpKTsKLX0KLQotdm9pZCBmclJlZ2lvblF1ZXJ5Ojppbml0RFJPYmooZnJMYXllck51bSBudW1MYXllcnMpIHsKLSAgZHJPYmpzLmNsZWFyKCk7Ci0gIGRyT2Jqcy5yZXNpemUobnVtTGF5ZXJzKTsKLQotICB2ZWN0b3I8dmVjdG9yPHJxX3JwdHJfdmFsdWVfdDxmckJsb2NrT2JqZWN0PiA+ID4gYWxsU2hhcGVzKG51bUxheWVycyk7Ci0KLSAgaW50IGNudCA9IDA7Ci0gIGZvciAoYXV0byAmbmV0OiBkZXNpZ24tPmdldFRvcEJsb2NrKCktPmdldE5ldHMoKSkgewotICAgIGZvciAoYXV0byAmc2hhcGU6IG5ldC0+Z2V0U2hhcGVzKCkpIHsKLSAgICAgIGFkZERST2JqKHNoYXBlLmdldCgpLCBhbGxTaGFwZXMpOwotICAgIH0KLSAgICBmb3IgKGF1dG8gJnZpYTogbmV0LT5nZXRWaWFzKCkpIHsKLSAgICAgIGFkZERST2JqKHZpYS5nZXQoKSwgYWxsU2hhcGVzKTsKLSAgICB9Ci0gICAgY250Kys7Ci0gICAgLy9pZiAoVkVSQk9TRSA+IDApIHsKLSAgICAvLyAgaWYgKGNudCA8IDEwMDAwMCkgewotICAgIC8vICAgIGlmIChjbnQgJSAxMDAwMCA9PSAwKSB7Ci0gICAgLy8gICAgICBjb3V0IDw8IiAgY29tcGxldGUgIiA8PGNudCA8PCIgbmV0cyIgPDxlbmRsOwotICAgIC8vICAgIH0KLSAgICAvLyAgfSBlbHNlIHsKLSAgICAvLyAgICBpZiAoY250ICUgMTAwMDAwID09IDApIHsKLSAgICAvLyAgICAgIGNvdXQgPDwiICBjb21wbGV0ZSAiIDw8Y250IDw8IiBuZXRzIiA8PGVuZGw7Ci0gICAgLy8gICAgfQotICAgIC8vICB9Ci0gICAgLy99Ci0gIH0KLQotICBmb3IgKGF1dG8gaSA9IDA7IGkgPCBudW1MYXllcnM7IGkrKykgewotICAgIGRyT2Jqcy5hdChpKSA9IGJvb3N0Ojptb3ZlKGJnaTo6cnRyZWU8cnFfcnB0cl92YWx1ZV90PGZyQmxvY2tPYmplY3Q+LCBiZ2k6OnF1YWRyYXRpYzwxNj4gPihhbGxTaGFwZXMuYXQoaSkpKTsKLSAgICBhbGxTaGFwZXMuYXQoaSkuY2xlYXIoKTsKLSAgICBhbGxTaGFwZXMuYXQoaSkuc2hyaW5rX3RvX2ZpdCgpOwotICAgIC8vaWYgKFZFUkJPU0UgPiAwKSB7Ci0gICAgLy8gIGNvdXQgPDwiICBjb21wbGV0ZSAiIDw8ZGVzaWduLT5nZXRUZWNoKCktPmdldExheWVyKGkpLT5nZXROYW1lKCkgPDxlbmRsOwotICAgIC8vfQotICB9Ci0KLX0KLQotCi0KLQotdm9pZCBmclJlZ2lvblF1ZXJ5OjpwcmludCgpIHsKLSAgY291dCA8PGVuZGw7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCkoZGVzaWduLT5nZXRUZWNoKCktPmdldExheWVycygpLnNpemUoKSk7IGkrKykgewotICAgIGZyU3RyaW5nIGxheWVyTmFtZTsKLSAgICBkZXNpZ24tPmdldFRlY2goKS0+Z2V0TGF5ZXJzKCkuYXQoaSktPmdldE5hbWUobGF5ZXJOYW1lKTsKLSAgICBjb3V0IDw8bGF5ZXJOYW1lIDw8IiBzaGFwZSByZWdpb24gcXVlcnkgc2l6ZSA9ICIgPDxzaGFwZXMuYXQoaSkuc2l6ZSgpIDw8ZW5kbCA8PGZsdXNoOwotICB9Ci19Ci0KLXZvaWQgZnJSZWdpb25RdWVyeTo6cHJpbnRHdWlkZSgpIHsKLSAgY291dCA8PGVuZGw7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCkoZGVzaWduLT5nZXRUZWNoKCktPmdldExheWVycygpLnNpemUoKSk7IGkrKykgewotICAgIGZyU3RyaW5nIGxheWVyTmFtZTsKLSAgICBkZXNpZ24tPmdldFRlY2goKS0+Z2V0TGF5ZXJzKCkuYXQoaSktPmdldE5hbWUobGF5ZXJOYW1lKTsKLSAgICBjb3V0IDw8bGF5ZXJOYW1lIDw8IiBndWlkZSByZWdpb24gcXVlcnkgc2l6ZSA9ICIgPDxndWlkZXMuYXQoaSkuc2l6ZSgpIDw8ZW5kbCA8PGZsdXNoOwotICB9Ci19Ci0KLXZvaWQgZnJSZWdpb25RdWVyeTo6cHJpbnREUk9iaigpIHsKLSAgY291dCA8PGVuZGw7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCkoZGVzaWduLT5nZXRUZWNoKCktPmdldExheWVycygpLnNpemUoKSk7IGkrKykgewotICAgIGZyU3RyaW5nIGxheWVyTmFtZTsKLSAgICBkZXNpZ24tPmdldFRlY2goKS0+Z2V0TGF5ZXJzKCkuYXQoaSktPmdldE5hbWUobGF5ZXJOYW1lKTsKLSAgICBjb3V0IDw8bGF5ZXJOYW1lIDw8IiBkck9iaiByZWdpb24gcXVlcnkgc2l6ZSA9ICIgPDxkck9ianMuYXQoaSkuc2l6ZSgpIDw8ZW5kbCA8PGZsdXNoOwotICB9Ci19Ci0KLXZvaWQgZnJSZWdpb25RdWVyeTo6Y2xlYXJHdWlkZXMoKSB7Ci0gIGZvciAoYXV0byAmbTogZ3VpZGVzKSB7Ci0gICAgbS5jbGVhcigpOwotICB9Ci19CmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9mclJlZ2lvblF1ZXJ5LmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9mclJlZ2lvblF1ZXJ5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZDMwYjcuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZnJSZWdpb25RdWVyeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX0ZSX1JFR0lPTlFVRVJZX0hfCi0jZGVmaW5lIF9GUl9SRUdJT05RVUVSWV9IXwotCi0jaW5jbHVkZSAiZnJCYXNlVHlwZXMuaCIKLQotbmFtZXNwYWNlIGZyIHsKLSAgY2xhc3MgZnJEZXNpZ247Ci0gIGNsYXNzIGZyUmVnaW9uUXVlcnkgewotICBwdWJsaWM6Ci0gICAgZnJSZWdpb25RdWVyeShmckRlc2lnbiogZGVzaWduSW4pOiBkZXNpZ24oZGVzaWduSW4pIHt9Ci0gICAgLy8gZ2V0dGVycwotICAgIGZyRGVzaWduKiBnZXREZXNpZ24oKSBjb25zdCB7Ci0gICAgICByZXR1cm4gZGVzaWduOwotICAgIH0KLSAgICAvLyBzZXR0ZXJzCi0gICAgdm9pZCBhZGQoZnJTaGFwZSogaW4pOwotICAgIHZvaWQgYWRkKGZyVmlhKiBpbik7Ci0gICAgdm9pZCBhZGQoZnJJbnN0VGVybSogaW4pOwotICAgIHZvaWQgYWRkKGZyVGVybSogaW4pOwotICAgIHZvaWQgYWRkKGZyQmxvY2thZ2UqIGluKTsKLSAgICB2b2lkIGFkZChmckluc3RCbG9ja2FnZSogaW4pOwotICAgIHZvaWQgYWRkR3VpZGUoZnJHdWlkZSogaW4pOwotICAgIC8vdm9pZCBhZGRHUlBpbihmckJsb2NrT2JqZWN0KiBpbik7Ci0gICAgdm9pZCBhZGREUk9iaihmclNoYXBlKiBpbik7Ci0gICAgdm9pZCBhZGREUk9iaihmclZpYSogaW4pOwotICAgIHZvaWQgYWRkTWFya2VyKGZyTWFya2VyKiBpbik7Ci0gICAgdm9pZCBhZGQoZnJTaGFwZSogaW4sICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPHJxX3JwdHJfdmFsdWVfdDxmckJsb2NrT2JqZWN0PiA+ID4gJmFsbFNoYXBlcyk7Ci0gICAgdm9pZCBhZGQoZnJWaWEqIGluLCAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPHJxX3JwdHJfdmFsdWVfdDxmckJsb2NrT2JqZWN0PiA+ID4gJmFsbFNoYXBlcyk7Ci0gICAgdm9pZCBhZGQoZnJJbnN0VGVybSogaW4sIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPHJxX3JwdHJfdmFsdWVfdDxmckJsb2NrT2JqZWN0PiA+ID4gJmFsbFNoYXBlcyk7Ci0gICAgdm9pZCBhZGQoZnJUZXJtKiBpbiwgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPHJxX3JwdHJfdmFsdWVfdDxmckJsb2NrT2JqZWN0PiA+ID4gJmFsbFNoYXBlcyk7Ci0gICAgdm9pZCBhZGQoZnJCbG9ja2FnZSogaW4sIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPHJxX3JwdHJfdmFsdWVfdDxmckJsb2NrT2JqZWN0PiA+ID4gJmFsbFNoYXBlcyk7Ci0gICAgdm9pZCBhZGQoZnJJbnN0QmxvY2thZ2UqIGluLCBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxycV9ycHRyX3ZhbHVlX3Q8ZnJCbG9ja09iamVjdD4gPiA+ICZhbGxTaGFwZXMpOwotICAgIHZvaWQgYWRkR3VpZGUoZnJHdWlkZSogaW4sIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPHJxX3JwdHJfdmFsdWVfdDxmckd1aWRlPiA+ID4gJmFsbFNoYXBlcyk7Ci0gICAgdm9pZCBhZGREUk9iaihmclNoYXBlKiBpbiwgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8cnFfcnB0cl92YWx1ZV90PGZyQmxvY2tPYmplY3Q+ID4gPiAmYWxsU2hhcGVzKTsKLSAgICB2b2lkIGFkZERST2JqKGZyVmlhKiBpbiwgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxycV9ycHRyX3ZhbHVlX3Q8ZnJCbG9ja09iamVjdD4gPiA+ICZhbGxTaGFwZXMpOwotICAgIC8vdm9pZCBhZGRHUlBpbihmckJsb2NrT2JqZWN0KiBpbiwgY29uc3QgZnJQb2ludCAmcHQsIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPHJxX3JwdHJfdmFsdWVfdDxmckJsb2NrT2JqZWN0PiA+ID4gJmFsbFNoYXBlcyk7Ci0gICAgdm9pZCBxdWVyeShjb25zdCBmckJveCAmYm94LCBmckxheWVyTnVtIGxheWVyTnVtLCBzdGQ6OnZlY3RvcjxycV9ycHRyX3ZhbHVlX3Q8ZnJCbG9ja09iamVjdD4gPiAmcmVzdWx0KTsKLSAgICB2b2lkIHF1ZXJ5R3VpZGUoY29uc3QgZnJCb3ggJmJveCwgZnJMYXllck51bSBsYXllck51bSwgc3RkOjp2ZWN0b3I8cnFfcnB0cl92YWx1ZV90PGZyR3VpZGU+ID4gJnJlc3VsdCk7Ci0gICAgdm9pZCBxdWVyeUd1aWRlKGNvbnN0IGZyQm94ICZib3gsIGZyTGF5ZXJOdW0gbGF5ZXJOdW0sIHN0ZDo6dmVjdG9yPGZyR3VpZGUqPiAmcmVzdWx0KTsKLSAgICB2b2lkIHF1ZXJ5R3VpZGUoY29uc3QgZnJCb3ggJmJveCwgc3RkOjp2ZWN0b3I8ZnJHdWlkZSo+ICZyZXN1bHQpOwotICAgIHZvaWQgcXVlcnlHUlBpbihjb25zdCBmckJveCAmYm94LCBzdGQ6OnZlY3RvcjxmckJsb2NrT2JqZWN0Kj4gJnJlc3VsdCk7Ci0gICAgdm9pZCBxdWVyeURST2JqKGNvbnN0IGZyQm94ICZib3gsIGZyTGF5ZXJOdW0gbGF5ZXJOdW0sIHN0ZDo6dmVjdG9yPGZyQmxvY2tPYmplY3QqPiAmcmVzdWx0KTsKLSAgICB2b2lkIHF1ZXJ5RFJPYmooY29uc3QgZnJCb3ggJmJveCwgc3RkOjp2ZWN0b3I8ZnJCbG9ja09iamVjdCo+ICZyZXN1bHQpOwotICAgIHZvaWQgcXVlcnlNYXJrZXIoY29uc3QgZnJCb3ggJmJveCwgZnJMYXllck51bSBsYXllck51bSwgc3RkOjp2ZWN0b3I8ZnJNYXJrZXIqPiAmcmVzdWx0KTsKLSAgICB2b2lkIHF1ZXJ5TWFya2VyKGNvbnN0IGZyQm94ICZib3gsIHN0ZDo6dmVjdG9yPGZyTWFya2VyKj4gJnJlc3VsdCk7Ci0KLSAgICAvL3ZvaWQgcXVlcnkoY29uc3QgZnJCb3ggJmJveCwgc3RkOjp2ZWN0b3I8cnFfcnB0cl92YWx1ZV90PGZyQmxvY2tPYmplY3Q+ID4gJnJlc3VsdCk7Ci0gICAgCi0gICAgdm9pZCBjbGVhckd1aWRlcygpOwotICAgIHZvaWQgcmVtb3ZlRFJPYmooZnJTaGFwZSogaW4pOwotICAgIHZvaWQgcmVtb3ZlRFJPYmooZnJWaWEqICAgaW4pOwotICAgIHZvaWQgcmVtb3ZlTWFya2VyKGZyTWFya2VyKiBpbik7Ci0KLSAgICAvLyBpbml0Ci0gICAgdm9pZCBpbml0KGZyTGF5ZXJOdW0gbnVtTGF5ZXJzKTsKLSAgICB2b2lkIGluaXRHdWlkZShmckxheWVyTnVtIG51bUxheWVycyk7Ci0gICAgdm9pZCBpbml0R1JQaW4oc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGZyQmxvY2tPYmplY3QqLCBmclBvaW50PiA+ICZpbik7Ci0gICAgdm9pZCBpbml0RFJPYmooZnJMYXllck51bSBudW1MYXllcnMpOwotICAgIAotICAgIC8vIHV0aWxpdHkKLSAgICB2b2lkIHByaW50KCk7Ci0gICAgdm9pZCBwcmludEd1aWRlKCk7Ci0gICAgdm9pZCBwcmludERST2JqKCk7Ci0KLSAgcHJvdGVjdGVkOgotICAgIGZyRGVzaWduKiAgICAgICAgIGRlc2lnbjsKLSAgICBzdGQ6OnZlY3RvcjxiZ2k6OnJ0cmVlPHJxX3JwdHJfdmFsdWVfdDxmckJsb2NrT2JqZWN0PiwgYmdpOjpxdWFkcmF0aWM8MTY+ID4gPiBzaGFwZXM7IC8vIG9ubHkgZm9yIHBpbiBzaGFwZXMsIG9icyBhbmQgc25ldAotICAgIHN0ZDo6dmVjdG9yPGJnaTo6cnRyZWU8cnFfcnB0cl92YWx1ZV90PGZyR3VpZGU+LCBiZ2k6OnF1YWRyYXRpYzwxNj4gPiA+ICAgICAgIGd1aWRlczsKLSAgICBiZ2k6OnJ0cmVlPHJxX3JwdHJfdmFsdWVfdDxmckJsb2NrT2JqZWN0PiwgYmdpOjpxdWFkcmF0aWM8MTY+ID4gICAgICAgICAgICAgICBnclBpbnM7Ci0gICAgc3RkOjp2ZWN0b3I8YmdpOjpydHJlZTxycV9ycHRyX3ZhbHVlX3Q8ZnJCbG9ja09iamVjdD4sIGJnaTo6cXVhZHJhdGljPDE2PiA+ID4gZHJPYmpzOyAvLyBvbmx5IGZvciBkciBvYmpzLCB2aWEgb25seSBpbiB2aWEgbGF5ZXIKLSAgICBzdGQ6OnZlY3RvcjxiZ2k6OnJ0cmVlPHJxX3JwdHJfdmFsdWVfdDxmck1hcmtlcj4sIGJnaTo6cXVhZHJhdGljPDE2PiA+ID4gICAgICBtYXJrZXJzOyAvLyB1c2UgaW5pdCgpCi0gIH07Ci19Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9nbG9iYWwuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZ2xvYmFsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU3MjYzYy4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9nbG9iYWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJnbG9iYWwuaCIKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBmcjsKLQotc3RyaW5nIERFRl9GSUxFOwotc3RyaW5nIEdVSURFX0ZJTEU7Ci1zdHJpbmcgT1VUR1VJREVfRklMRTsKLXN0cmluZyBMRUZfRklMRTsKLXN0cmluZyBPVVRUQV9GSUxFOwotc3RyaW5nIE9VVF9GSUxFOwotc3RyaW5nIE9VVF9NQVpFX0ZJTEU7Ci1zdHJpbmcgRFJDX1JQVF9GSUxFOwotLy9zdHJpbmcgREJQUk9DRVNTTk9ERSA9ICJOMTZfMTFtXzJ4YTF4ZDN4ZTJ5MnJfdXRyZGwiOwotc3RyaW5nIERCUFJPQ0VTU05PREUgPSAiIjsKLWludCAgICBNQVhfVEhSRUFEUyAgID0gODsKLWludCAgICBWRVJCT1NFICAgICAgID0gMDsKLWludCAgICBCT1RUT01fUk9VVElOR19MQVlFUiA9IDA7Ci1ib29sICAgQUxMT1dfUElOX0FTX0ZFRURUSFJPVUdIID0gZmFsc2U7Ci1ib29sICAgVVNFTk9OUFJFRlRSQUNLUyA9IHRydWU7Ci1ib29sICAgVVNFTUlOU1BBQ0lOR19PQlMgPSB0cnVlOwotYm9vbCAgIFJFU0VSVkVfVklBX0FDQ0VTUyA9IHRydWU7Ci0KLWludCBFTkRfSVRFUkFUSU9OID0gMTsKLQotZnJVSW50NCBUQVZJQUNPU1QgICAgICAgPSAxOwotZnJVSW50NCBUQVBJTkNPU1QgICAgICAgPSA0OwotZnJVSW50NCBUQUFMSUdOQ09TVCAgICAgPSA0OwotZnJVSW50NCBUQURSQ0NPU1QgICAgICAgPSAzMjsKLWZsb2F0ICAgVEFTSEFQRUJMT0FUV0lEVEggPSAxLjU7Ci0KLWZyVUludDQgVklBQ09TVCAgICAgICAgID0gMjsKLS8vIG5ldyBjb3N0IHVzZWQKLWZyVUludDQgR1JJRENPU1QgICAgICAgID0gMjsKLWZyVUludDQgU0hBUEVDT1NUICAgICAgID0gODsKLWZyVUludDQgRFJDQ09TVCAgICAgICAgID0gNDsKLWZyVUludDQgTUFSS0VSQ09TVCAgICAgID0gNDsKLWZsb2F0ICAgTUFSS0VSREVDQVkgICAgID0gMC41OwotZmxvYXQgICBTSEFQRUJMT0FUV0lEVEggPSAzOwotCi1vc3RyZWFtJiBvcGVyYXRvcjw8IChvc3RyZWFtJiBvcywgY29uc3QgZnJQb2ludCAmcEluKSB7Ci0gIG9zIDw8IiggIiA8PHBJbi54KCkgPDwiICIgPDxwSW4ueSgpIDw8IiApIjsKLSAgcmV0dXJuIG9zOwotfQotCi1vc3RyZWFtJiBvcGVyYXRvcjw8IChvc3RyZWFtJiBvcywgY29uc3QgZnJSZWN0ICZwaW5GaWdJbikgewotICBpZiAocGluRmlnSW4uZ2V0UGluKCkpIHsKLSAgICBvcyA8PCJQSU5GSUcgKFBJTk5BTUUvTEFZRVIpICIgPDxwaW5GaWdJbi5nZXRQaW4oKS0+Z2V0VGVybSgpLT5nZXROYW1lKCkgPDwiICIgPDxwaW5GaWdJbi5nZXRMYXllck51bSgpIDw8ZW5kbDsKLSAgfQotICBmckJveCB0bXBCb3g7Ci0gIHBpbkZpZ0luLmdldEJCb3godG1wQm94KTsKLSAgb3MgPDwiICBSRUNUICIgPDx0bXBCb3gubGVmdCgpIDw8IiAiIDw8dG1wQm94LmJvdHRvbSgpIDw8IiAiIDw8dG1wQm94LnJpZ2h0KCkgPDwiICIgPDx0bXBCb3gudG9wKCk7Ci0gIHJldHVybiBvczsKLX0KLQotb3N0cmVhbSYgb3BlcmF0b3I8PCAob3N0cmVhbSYgb3MsIGNvbnN0IGZyUG9seWdvbiAmcGluRmlnSW4pIHsKLSAgaWYgKHBpbkZpZ0luLmdldFBpbigpKSB7Ci0gICAgb3MgPDwiUElORklHIChOQU1FL0xBWUVSKSAiIDw8cGluRmlnSW4uZ2V0UGluKCktPmdldFRlcm0oKS0+Z2V0TmFtZSgpIDw8IiAiIDw8cGluRmlnSW4uZ2V0TGF5ZXJOdW0oKSA8PGVuZGw7Ci0gIH0KLSAgb3MgPDwiICBQT0xZR09OIjsKLSAgZm9yIChhdXRvICZtOiBwaW5GaWdJbi5nZXRQb2ludHMoKSkgewotICAgIG9zIDw8IiAoICIgPDxtLngoKSA8PCIgIiA8PG0ueSgpIDw8IiApIjsKLSAgfQotICByZXR1cm4gb3M7Ci19Ci0KLW9zdHJlYW0mIG9wZXJhdG9yPDwgKG9zdHJlYW0mIG9zLCBjb25zdCBmclBpbiAmcGluSW4pIHsKLSAgb3MgPDwiUElOIChOQU1FKSAiIDw8cGluSW4uZ2V0VGVybSgpLT5nZXROYW1lKCk7Ci0gIGZvciAoYXV0byAmbTogcGluSW4uZ2V0RmlncygpKSB7Ci0gICAgaWYgKG0tPnR5cGVJZCgpID09IGZyY1JlY3QpIHsKLSAgICAgIG9zIDw8ZW5kbCA8PCooc3RhdGljX2Nhc3Q8ZnJSZWN0Kj4obS5nZXQoKSkpOwotICAgIH0gZWxzZSBpZiAobS0+dHlwZUlkKCkgPT0gZnJjUG9seWdvbikgewotICAgICAgb3MgPDxlbmRsIDw8KihzdGF0aWNfY2FzdDxmclBvbHlnb24qPihtLmdldCgpKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG9zIDw8ZW5kbCA8PCJVbnN1cHBvcnRlZCBwaW5GaWcgb2JqZWN0ISI7Ci0gICAgfQotICB9Ci0gIHJldHVybiBvczsKLX0KLQotb3N0cmVhbSYgb3BlcmF0b3I8PCAob3N0cmVhbSYgb3MsIGNvbnN0IGZyVGVybSAmdGVybUluKSB7Ci0gIGZyU3RyaW5nIG5hbWU7Ci0gIGZyU3RyaW5nIG5ldE5hbWU7Ci0gIG5hbWUgPSB0ZXJtSW4uZ2V0TmFtZSgpOwotICBpZiAodGVybUluLmdldE5ldCgpKSB7Ci0gICAgbmV0TmFtZSA9IHRlcm1Jbi5nZXROZXQoKS0+Z2V0TmFtZSgpOwotICB9Ci0gIG9zIDw8IlRFUk0gKE5BTUUvTkVUKSAiIDw8bmFtZSA8PCIgIiA8PG5ldE5hbWU7Ci0gIGZvciAoYXV0byAmbTogdGVybUluLmdldFBpbnMoKSl7Ci0gICAgb3MgPDxlbmRsIDw8Km07Ci0gIH0KLSAgcmV0dXJuIG9zOwotfQotCi1vc3RyZWFtJiBvcGVyYXRvcjw8IChvc3RyZWFtJiBvcywgY29uc3QgZnJJbnN0VGVybSAmaW5zdFRlcm1JbikgewotICBmclN0cmluZyBuYW1lOwotICBmclN0cmluZyBjZWxsTmFtZTsKLSAgZnJTdHJpbmcgdGVybU5hbWU7Ci0gIGZyU3RyaW5nIG5ldE5hbWU7Ci0gIG5hbWUgPSBpbnN0VGVybUluLmdldEluc3QoKS0+Z2V0TmFtZSgpOwotICBjZWxsTmFtZSA9IGluc3RUZXJtSW4uZ2V0SW5zdCgpLT5nZXRSZWZCbG9jaygpLT5nZXROYW1lKCk7Ci0gIHRlcm1OYW1lID0gaW5zdFRlcm1Jbi5nZXRUZXJtKCktPmdldE5hbWUoKTsKLSAgaWYgKGluc3RUZXJtSW4uZ2V0TmV0KCkpIHsKLSAgICBuZXROYW1lID0gaW5zdFRlcm1Jbi5nZXROZXQoKS0+Z2V0TmFtZSgpOwotICB9IAotICBvcyA8PCJJTlNUVEVSTSAoTkFNRS9DRUxML1RFUk0vTkVUKSAiIDw8bmFtZSA8PCIgIiA8PGNlbGxOYW1lIDw8IiAiIDw8dGVybU5hbWUgPDwiICIgPDxuZXROYW1lIDw8ZW5kbDsKLSAgb3MgPDwqaW5zdFRlcm1Jbi5nZXRUZXJtKCk7Ci0gIHJldHVybiBvczsKLX0KLQotb3N0cmVhbSYgb3BlcmF0b3I8PCAob3N0cmVhbSYgb3MsIGNvbnN0IGZyVmlhRGVmICZ2aWFEZWZJbikgewotICBmclN0cmluZyBuYW1lOwotICBuYW1lID0gdmlhRGVmSW4uZ2V0TmFtZSgpOwotICBvcyA8PCJWSUEgIiA8PG5hbWU7Ci0gIGlmICh2aWFEZWZJbi5nZXREZWZhdWx0KCkpIHsKLSAgICBvcyA8PCIgREVGQVVMVCI7Ci0gIH0KLSAgZm9yIChhdXRvICZtOiB2aWFEZWZJbi5nZXRMYXllcjFGaWdzKCkpIHsKLSAgICBpZiAobS0+dHlwZUlkKCkgPT0gZnJjUmVjdCkgewotICAgICAgb3MgPDxlbmRsIDw8KihzdGF0aWNfY2FzdDxmclJlY3QqPihtLmdldCgpKSk7Ci0gICAgfSBlbHNlIGlmIChtLT50eXBlSWQoKSA9PSBmcmNQb2x5Z29uKSB7Ci0gICAgICBvcyA8PGVuZGwgPDwqKHN0YXRpY19jYXN0PGZyUG9seWdvbio+KG0uZ2V0KCkpKTsKLSAgICB9IGVsc2UgewotICAgICAgb3MgPDxlbmRsIDw8IlVuc3VwcG9ydGVkIHBpbkZpZyBvYmplY3QhIjsKLSAgICB9Ci0gIH0KLSAgZm9yIChhdXRvICZtOiB2aWFEZWZJbi5nZXRDdXRGaWdzKCkpIHsKLSAgICBpZiAobS0+dHlwZUlkKCkgPT0gZnJjUmVjdCkgewotICAgICAgb3MgPDxlbmRsIDw8KihzdGF0aWNfY2FzdDxmclJlY3QqPihtLmdldCgpKSk7Ci0gICAgfSBlbHNlIGlmIChtLT50eXBlSWQoKSA9PSBmcmNQb2x5Z29uKSB7Ci0gICAgICBvcyA8PGVuZGwgPDwqKHN0YXRpY19jYXN0PGZyUG9seWdvbio+KG0uZ2V0KCkpKTsKLSAgICB9IGVsc2UgewotICAgICAgb3MgPDxlbmRsIDw8IlVuc3VwcG9ydGVkIHBpbkZpZyBvYmplY3QhIjsKLSAgICB9Ci0gIH0KLSAgZm9yIChhdXRvICZtOiB2aWFEZWZJbi5nZXRMYXllcjJGaWdzKCkpIHsKLSAgICBpZiAobS0+dHlwZUlkKCkgPT0gZnJjUmVjdCkgewotICAgICAgb3MgPDxlbmRsIDw8KihzdGF0aWNfY2FzdDxmclJlY3QqPihtLmdldCgpKSk7Ci0gICAgfSBlbHNlIGlmIChtLT50eXBlSWQoKSA9PSBmcmNQb2x5Z29uKSB7Ci0gICAgICBvcyA8PGVuZGwgPDwqKHN0YXRpY19jYXN0PGZyUG9seWdvbio+KG0uZ2V0KCkpKTsKLSAgICB9IGVsc2UgewotICAgICAgb3MgPDxlbmRsIDw8IlVuc3VwcG9ydGVkIHBpbkZpZyBvYmplY3QhIjsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG9zOwotfQotCi1vc3RyZWFtJiBvcGVyYXRvcjw8IChvc3RyZWFtJiBvcywgY29uc3QgZnJMYXllckJsb2NrYWdlICZibGtJbikgewotICBvcyA8PCJCTEsgKExBWUVSKSAiIDw8YmxrSW4uZ2V0TGF5ZXJOdW0oKTsKLSAgZm9yIChhdXRvICZwb2ludDogYmxrSW4uZ2V0UG9pbnRzKCkpIHsKLSAgICBvcyA8PGVuZGwgPDwiICAiIDw8cG9pbnQueCgpIDw8IiAiIDw8cG9pbnQueSgpOwotICB9Ci0gIHJldHVybiBvczsKLX0KLQotb3N0cmVhbSYgb3BlcmF0b3I8PCAob3N0cmVhbSYgb3MsIGNvbnN0IGZyQmxvY2sgJmJsb2NrSW4pIHsKLSAgZnJCb3ggYm94OwotICBibG9ja0luLmdldEJCb3goYm94KTsKLSAgb3MgPDwiTUFDUk8gIiAgICA8PGJsb2NrSW4uZ2V0TmFtZSgpIDw8ZW5kbAotICAgICAgIDw8IiAgT1JJR0lOICIgPDxib3gubGVmdCgpICA8PCIgIiA8PGJveC5ib3R0b20oKSA8PGVuZGwKLSAgICAgICA8PCIgIFNJWkUgIiAgIDw8Ym94LnJpZ2h0KCkgPDwiICIgPDxib3gudG9wKCk7Ci0gIGZvciAoYXV0byAmbTogYmxvY2tJbi5nZXRUZXJtcygpKSB7Ci0gICAgb3MgPDxlbmRsIDw8Km07Ci0gIH0KLSAgZm9yIChhdXRvICZtOiBibG9ja0luLmdldEJsb2NrYWdlcygpKSB7Ci0gICAgaWYgKG0tPnR5cGVJZCgpID09IGZyY0xheWVyQmxvY2thZ2UpIHsKLSAgICAgIG9zIDw8ZW5kbCA8PCooc3RhdGljX2Nhc3Q8ZnJMYXllckJsb2NrYWdlKj4obS5nZXQoKSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBvcyA8PGVuZGwgPDwiVW5zdXBwb3J0ZWQgbWFjcm8gYmxvY2thZ2UhIjsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG9zOwotfQotCi1vc3RyZWFtJiBvcGVyYXRvcjw8IChvc3RyZWFtJiBvcywgY29uc3QgZnJJbnN0ICZpbnN0SW4pIHsKLSAgZnJQb2ludCB0bXBQb2ludDsKLSAgZnJTdHJpbmcgdG1wU3RyaW5nOwotICBmclN0cmluZyB0bXBOYW1lOwotICBpbnN0SW4uZ2V0T3JpZ2luKHRtcFBvaW50KTsKLSAgYXV0byB0bXBPcmllbnQgPSBpbnN0SW4uZ2V0T3JpZW50KCk7Ci0gIHRtcE5hbWUgPSBpbnN0SW4uZ2V0TmFtZSgpOwotICB0bXBTdHJpbmcgPSBpbnN0SW4uZ2V0UmVmQmxvY2soKS0+Z2V0TmFtZSgpOwotICBvcyA8PCItICIgPDx0bXBOYW1lIDw8IiAiIDw8dG1wU3RyaW5nIDw8IiArIFNUQVRVUyArICggIgotICAgICAgIDw8dG1wUG9pbnQueCgpIDw8IiAiIDw8dG1wUG9pbnQueSgpIDw8IiApICIgPDx0bXBPcmllbnQuZ2V0TmFtZSgpIDw8ZW5kbDsKLSAgZm9yIChhdXRvICZtOiBpbnN0SW4uZ2V0SW5zdFRlcm1zKCkpIHsKLSAgICBvcyA8PGVuZGwgPDwqbTsKLSAgfQotICByZXR1cm4gb3M7Ci19Ci0KLW9zdHJlYW0mIG9wZXJhdG9yPDwgKG9zdHJlYW0mIG9zLCBjb25zdCBmckJveCAmYm94KSB7Ci0gIG9zIDw8IiggIiA8PGJveC5sZWZ0KCkgPDwiICIgPDxib3guYm90dG9tKCkgPDwiICkgKCAiIDw8Ym94LnJpZ2h0KCkgPDwiICIgPDxib3gudG9wKCkgPDwiICkiOwotICByZXR1cm4gb3M7Ci19Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2dsb2JhbC5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZ2xvYmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2Y2RhYTkuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvZ2xvYmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyogQXV0aG9yczogTHV0b25nIFdhbmcgYW5kIEJhbmdxaSBYdSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQoYykgMjAxOCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqICAgICAgICAgICAgICBBbmRyZXcgQi4gS2FobmcsIEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUKLSAqIENvbnRhY3QgICAgICBhYmtAY3MudWNzZC5lZHUsIGx1dzAwMkB1Y3NkLmVkdSBhbmQgYmF4MDAyQHVjc2QuZWR1Ci0gKiBBZmZpbGlhdGlvbjogQ29tcHV0ZXIgU2NpZW5jZSBhbmQgRW5naW5lZXJpbmcgRGVwYXJ0bWVudCwgVUMgU2FuIERpZWdvLAotICogICAgICAgICAgICAgIExhIEpvbGxhLCBDQSA5MjA5My0wNDA0LCBVU0EKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfR0xPQkFMX0hfCi0jZGVmaW5lIF9HTE9CQUxfSF8KLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSAiZnJEZXNpZ24uaCIKLSNpbmNsdWRlICJkYi9vYmovZnJCbG9jay5oIgotCi1leHRlcm4gc3RkOjpzdHJpbmcgREVGX0ZJTEU7Ci1leHRlcm4gc3RkOjpzdHJpbmcgR1VJREVfRklMRTsKLWV4dGVybiBzdGQ6OnN0cmluZyBPVVRHVUlERV9GSUxFOwotZXh0ZXJuIHN0ZDo6c3RyaW5nIExFRl9GSUxFOwotZXh0ZXJuIHN0ZDo6c3RyaW5nIE9VVFRBX0ZJTEU7Ci1leHRlcm4gc3RkOjpzdHJpbmcgT1VUX0ZJTEU7Ci1leHRlcm4gc3RkOjpzdHJpbmcgREJQUk9DRVNTTk9ERTsKLWV4dGVybiBzdGQ6OnN0cmluZyBPVVRfTUFaRV9GSUxFOwotZXh0ZXJuIHN0ZDo6c3RyaW5nIERSQ19SUFRfRklMRTsKLWV4dGVybiBpbnQgTUFYX1RIUkVBRFMgOwotZXh0ZXJuIGludCBWRVJCT1NFICAgICA7Ci1leHRlcm4gaW50IEJPVFRPTV9ST1VUSU5HX0xBWUVSOwotZXh0ZXJuIGJvb2wgQUxMT1dfUElOX0FTX0ZFRURUSFJPVUdIOwotZXh0ZXJuIGJvb2wgVVNFTk9OUFJFRlRSQUNLUzsKLS8vZXh0ZXJuIGludCBURVNUOwotCi1leHRlcm4gaW50IEVORF9JVEVSQVRJT047Ci0KLWV4dGVybiBmcjo6ZnJVSW50NCBUQVZJQUNPU1Q7Ci1leHRlcm4gZnI6OmZyVUludDQgVEFQSU5DT1NUOwotZXh0ZXJuIGZyOjpmclVJbnQ0IFRBQUxJR05DT1NUOwotZXh0ZXJuIGZyOjpmclVJbnQ0IFRBRFJDQ09TVDsKLWV4dGVybiBmbG9hdCAgICAgICBUQVNIQVBFQkxPQVRXSURUSDsKLQotZXh0ZXJuIGZyOjpmclVJbnQ0IFZJQUNPU1Q7Ci1leHRlcm4gYm9vbCBVU0VNSU5TUEFDSU5HX09CUzsKLWV4dGVybiBib29sIFJFU0VSVkVfVklBX0FDQ0VTUzsKLQotZXh0ZXJuIGZyOjpmclVJbnQ0IEdSSURDT1NUOwotZXh0ZXJuIGZyOjpmclVJbnQ0IFNIQVBFQ09TVDsKLWV4dGVybiBmcjo6ZnJVSW50NCBEUkNDT1NUOwotZXh0ZXJuIGZyOjpmclVJbnQ0IE1BUktFUkNPU1Q7Ci1leHRlcm4gZmxvYXQgICAgICAgTUFSS0VSREVDQVk7Ci1leHRlcm4gZmxvYXQgICAgICAgU0hBUEVCTE9BVFdJRFRIOwotCi0jZGVmaW5lIERJUkJJVFNJWkUgMwotI2RlZmluZSBXQVZFRlJPTlRCVUZGRVJTSVpFIDIKLSNkZWZpbmUgV0FWRUZST05UQklUU0laRSAoV0FWRUZST05UQlVGRkVSU0laRSAqIERJUkJJVFNJWkUpCi0jZGVmaW5lIFdBVkVGUk9OVEJVRkZFUkhJR0hNQVNLICgxMTEgPDwgKChXQVZFRlJPTlRCVUZGRVJTSVpFIC0gMSkgKiBESVJCSVRTSVpFKSkKLQotbmFtZXNwYWNlIGZyIHsKLSAgZXh0ZXJuIGZyQ29vcmQgZ2V0R0NFTExHUklEWCgpOwotICBleHRlcm4gZnJDb29yZCBnZXRHQ0VMTEdSSURZKCk7Ci0gIGV4dGVybiBmckNvb3JkIGdldEdDRUxMT0ZGU0VUWCgpOwotICBleHRlcm4gZnJDb29yZCBnZXRHQ0VMTE9GRlNFVFkoKTsKLX0KLQotZXh0ZXJuIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCAoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgZnI6OmZyVmlhRGVmICZ2aWFEZWZJbik7Ci1leHRlcm4gc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8IChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBmcjo6ZnJCbG9jayAmYmxvY2tJbik7Ci1leHRlcm4gc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8IChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBmcjo6ZnJJbnN0ICZpbnN0SW4pOwotZXh0ZXJuIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCAoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgZnI6OmZySW5zdFRlcm0gJmluc3RUZXJtSW4pOwotZXh0ZXJuIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCAoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgZnI6OmZyVGVybSAmdGVybUluKTsKLWV4dGVybiBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwgKHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IGZyOjpmclBpbiAmcGluSW4pOwotZXh0ZXJuIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCAoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgZnI6OmZyUmVjdCAmcGluRmlnKTsKLWV4dGVybiBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwgKHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IGZyOjpmclBvbHlnb24gJnBpbkZpZyk7Ci1leHRlcm4gc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8IChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBmcjo6ZnJOZXQgJm5ldCk7Ci1leHRlcm4gc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8IChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBmcjo6ZnJMYXllckJsb2NrYWdlICZibGspOwotCi1leHRlcm4gc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8IChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBmcjo6ZnJQb2ludCAmcEluKTsKLWV4dGVybiBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwgKHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IGZyOjpmckJveCAmYm94KTsKLQotLy9leHRlcm4gc2l6ZV90IGdldFBlYWtSU1MoKTsKLS8vZXh0ZXJuIHNpemVfdCBnZXRDdXJyZW50UlNTKCk7Ci0KLS8vZXh0ZXJuIHZvaWQgcHJpbnRBbGxNYWNyb3MoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGZyOjpmckRlc2lnbj4gJmRlc2lnbik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvaW8vTWFrZWZpbGUgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9pby9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY4YWMyMy4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9pby9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMgc3ViZGlyIGFuZCBvYmplY3RzIGluIGN1cnJlbnQgZGlyCi1TVUJESVJTCT0gCi0jT0JKRUNUUwk9IGlvLm8gaW9fcGFyc2VyX2hlbHBlci5vIGRlZncubyBmckd1aWRlUHJlcC5vIGZyUGluUHJlcC5vIGZyU2hhcGVVdGlsLm8gZnJVdGlsLm8KLU9CSkVDVFMJPSBpby5vIGlvX3BhcnNlcl9oZWxwZXIubyBkZWZ3Lm8gaW9fZ3VpZGUubyBmclBpblByZXAubyBmclNoYXBlVXRpbC5vIGlvX3Bpbi5vIGZyQVBHLm8KLQotCi1hbGw6c3ViZGlycyAke09CSkVDVFN9Ci0KLQkKLWNsZWFuOmNsZWFuc3ViZGlycwotCXJtIC1mICR7T0JKRUNUU30KLQkKLWluY2x1ZGUgJHtNQUtFSU5DTFVERX0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2lvL2RlZncuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvaW8vZGVmdy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZTljMzguLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvaW8vZGVmdy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMzICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLS8vICNpbmNsdWRlIDxmc3RyZWFtPgotI2lmbmRlZiBXSU4zMgotIyAgIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmIC8qIG5vdCBXSU4zMiAqLwotI2luY2x1ZGUgImRlZnJSZWFkZXIuaHBwIgotI2luY2x1ZGUgImRlZmlBbGlhcy5ocHAiCi0jaW5jbHVkZSAiaW8vaW8uaCIKLSNpbmNsdWRlICJnbG9iYWwuaCIKLSNpbmNsdWRlICJmckJhc2VUeXBlcy5oIgotI2luY2x1ZGUgImRiL29iai9mclNoYXBlLmgiCi0jaW5jbHVkZSAiZGIvb2JqL2ZyVmlhLmgiCi0KLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAotLy8gdHVybiBvZmYgdGhlIHNwZWNpZmljIHdhcm5pbmcuIENhbiBhbHNvIHVzZSAiLVdhbGwiCi0jcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZm9ybWF0PSIKLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdmb3JtYXQtZXh0cmEtYXJncyIKLS8vIHR1cm4gdGhlIHdhcm5pbmdzIGJhY2sgb24KLQotLy91c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIGZyOwotCi1jaGFyIGRlZmF1bHROYW1lWzY0XTsKLWNoYXIgZGVmYXVsdE91dFs2NF07Ci0KLS8vIEdsb2JhbCB2YXJpYWJsZXMKLUZJTEUqIGZvdXQ7Ci1pbzo6V3JpdGVyKiB1c2VyRGF0YTsKLWludCBudW1PYmpzOwotaW50IGlzU3VtU2V0OyAgICAgIC8vIHRvIGtlZXAgdHJhY2sgaWYgd2l0aGluIFNVTQotaW50IGlzUHJvcCA9IDA7ICAgIC8vIGZvciBQUk9QRVJUWURFRklOSVRJT05TCi1pbnQgYmVnT3BlcmFuZDsgICAgLy8gdG8ga2VlcCB0cmFjayBmb3IgY29uc3RyYWludCwgdG8gcHJpbnQgLSBhcyB0aGUgMXN0IGNoYXIKLXN0YXRpYyBkb3VibGUgY3VyVmVyID0gMDsKLXN0YXRpYyBpbnQgc2V0U05ldFdpcmVDYmsgPSAwOwotc3RhdGljIGludCBpc1Nlc3Npb25sZXNzID0gMDsKLXN0YXRpYyBpbnQgaWdub3JlUm93TmFtZXMgPSAwOwotc3RhdGljIGludCBpZ25vcmVWaWFOYW1lcyA9IDA7Ci1zdGF0aWMgaW50IHRlc3REZWJ1Z1ByaW50ID0gMDsgIC8vIHRlc3QgZm9yIGNjcjE0ODg2OTYKLQotLy8gVFhfRElSOlRSQU5TTEFUSU9OIE9OCi0KLXZvaWQgbXlMb2dGdW5jdGlvbihjb25zdCBjaGFyKiBlcnJNc2cpewotICAgZnByaW50Zihmb3V0LCAiRVJST1I6IGZvdW5kIGVycm9yOiAlc1xuIiwgZXJyTXNnKTsKLX0KLQotdm9pZCBteVdhcm5pbmdMb2dGdW5jdGlvbihjb25zdCBjaGFyKiBlcnJNc2cpewotICAgZnByaW50Zihmb3V0LCAiV0FSTklORzogZm91bmQgZXJyb3I6ICVzXG4iLCBlcnJNc2cpOwotfQotCi12b2lkIGRhdGFFcnJvcigpIHsKLSAgZnByaW50Zihmb3V0LCAiRVJST1I6IHJldHVybmVkIHVzZXIgZGF0YSBpcyBub3QgY29ycmVjdCFcbiIpOwotfQotCi12b2lkIGNoZWNrVHlwZShkZWZyQ2FsbGJhY2tUeXBlX2UgYykgewotICBpZiAoYyA+PSAwICYmIGMgPD0gZGVmckRlc2lnbkVuZENia1R5cGUpIHsKLSAgICAvLyBPSwotICB9IGVsc2UgewotICAgIGZwcmludGYoZm91dCwgIkVSUk9SOiBjYWxsYmFjayB0eXBlIGlzIG91dCBvZiBib3VuZHMhXG4iKTsKLSAgfQotfQotCi0KLWludCBkb25lKGRlZnJDYWxsYmFja1R5cGVfZSBjLCB2b2lkKiwgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgZnByaW50Zihmb3V0LCAiRU5EIERFU0lHTlxuIik7Ci0gIHJldHVybiAwOwotfQotCi1pbnQgZW5kZnVuYyhkZWZyQ2FsbGJhY2tUeXBlX2UgYywgdm9pZCosIGRlZmlVc2VyRGF0YSB1ZCkgewotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGlmIChjID09IGRlZnJTTmV0RW5kQ2JrVHlwZSkgewotICAgIGZwcmludGYoZm91dCwgIkVORCBTUEVDSUFMTkVUU1xuIik7Ci0gIH0gZWxzZSBpZiAoYyA9PSBkZWZyUGluRW5kQ2JrVHlwZSkgewotICAgIGZwcmludGYoZm91dCwgIkVORCBQSU5TXG4iKTsKLSAgfSBlbHNlIGlmIChjID09IGRlZnJOZXRFbmRDYmtUeXBlKSB7Ci0gICAgZnByaW50Zihmb3V0LCAiRU5EIE5FVFNcbiIpOwotICB9Ci0gIHJldHVybiAwOwotfQotCi0KLWNoYXIqIG9yaWVudFN0cihpbnQgb3JpZW50KSB7Ci0gIHN3aXRjaCAob3JpZW50KSB7Ci0gICAgICBjYXNlIDA6IHJldHVybiAoKGNoYXIqKSJOIik7Ci0gICAgICBjYXNlIDE6IHJldHVybiAoKGNoYXIqKSJXIik7Ci0gICAgICBjYXNlIDI6IHJldHVybiAoKGNoYXIqKSJTIik7Ci0gICAgICBjYXNlIDM6IHJldHVybiAoKGNoYXIqKSJFIik7Ci0gICAgICBjYXNlIDQ6IHJldHVybiAoKGNoYXIqKSJGTiIpOwotICAgICAgY2FzZSA1OiByZXR1cm4gKChjaGFyKikiRlciKTsKLSAgICAgIGNhc2UgNjogcmV0dXJuICgoY2hhciopIkZTIik7Ci0gICAgICBjYXNlIDc6IHJldHVybiAoKGNoYXIqKSJGRSIpOwotICB9OwotICByZXR1cm4gKChjaGFyKikiQk9HVVMiKTsKLX0KLQotaW50IGNvbXBNU0woZGVmckNhbGxiYWNrVHlwZV9lIGMsIGRlZmlDb21wb25lbnRNYXNrU2hpZnRMYXllciogY28sIGRlZmlVc2VyRGF0YSB1ZCkgewotICBpbnQgaTsKLQotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0KLSAgICBpZiAoY28tPm51bU1hc2tTaGlmdExheWVycygpKSB7Ci0gIGZwcmludGYoZm91dCwgIlxuQ09NUE9ORU5UTUFTS1NISUZUICIpOwotICAKLSAgZm9yIChpID0gMDsgaSA8IGNvLT5udW1NYXNrU2hpZnRMYXllcnMoKTsgaSsrKSB7Ci0gICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzICIsIGNvLT5tYXNrU2hpZnRMYXllcihpKSk7Ci0gIH0KLSAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi1pbnQgY29tcGYoZGVmckNhbGxiYWNrVHlwZV9lIGMsIGRlZmlDb21wb25lbnQqIGNvLCBkZWZpVXNlckRhdGEgdWQpIHsKLSAgaWYgKHRlc3REZWJ1Z1ByaW50KSB7Ci0gICAgICBjby0+cHJpbnQoZm91dCk7Ci0gIH0gZWxzZSB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgY2hlY2tUeXBlKGMpOwotICAgICAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgICAvLyAgbWlzc2luZyBHRU5FUkFURSwgRk9SRUlHTgotICAgICAgICBmcHJpbnRmKGZvdXQsICItICVzICVzICIsIGNvLT5pZCgpLAotICAgICAgICAgICAgICAgIGNvLT5uYW1lKCkpOwotICAgIC8vICAgIGNvLT5jaGFuZ2VJZEFuZE5hbWUoImlkTmFtZSIsICJtb2RlbE5hbWUiKTsKLSAgICAvLyAgICBmcHJpbnRmKGZvdXQsICIlcyAlcyAiLCBjby0+aWQoKSwKLSAgICAvLyAgICAgICAgICAgIGNvLT5uYW1lKCkpOwotICAgICAgICBpZiAoY28tPmhhc05ldHMoKSkgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvLT5udW1OZXRzKCk7IGkrKykKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgY28tPm5ldChpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvLT5oYXNTb3VyY2UoKSkKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgU09VUkNFICVzICIsIGNvLT5zb3VyY2UoKSk7Ci0gICAgICAgIGlmIChjby0+aXNGaXhlZCgpKSAKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgRklYRUQgKCAlZCAlZCApICVzICIsCi0gICAgICAgICAgICAgICAgICAgIGNvLT5wbGFjZW1lbnRYKCksCi0gICAgICAgICAgICAgICAgICAgIGNvLT5wbGFjZW1lbnRZKCksCi0gICAgICAgICAgICAgICAgICAgIC8vb3JpZW50U3RyKGNvLT5wbGFjZW1lbnRPcmllbnQoKSkpOwotICAgICAgICAgICAgICAgICAgICBjby0+cGxhY2VtZW50T3JpZW50U3RyKCkpOwotICAgICAgICBpZiAoY28tPmlzQ292ZXIoKSkgCi0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIENPVkVSICVkICVkICVzICIsCi0gICAgICAgICAgICAgICAgICAgIGNvLT5wbGFjZW1lbnRYKCksCi0gICAgICAgICAgICAgICAgICAgIGNvLT5wbGFjZW1lbnRZKCksCi0gICAgICAgICAgICAgICAgICAgIG9yaWVudFN0cihjby0+cGxhY2VtZW50T3JpZW50KCkpKTsKLSAgICAgICAgaWYgKGNvLT5pc1BsYWNlZCgpKSAKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwiKyBQTEFDRUQgKCAlZCAlZCApICVzICIsCi0gICAgICAgICAgICAgICAgICAgIGNvLT5wbGFjZW1lbnRYKCksCi0gICAgICAgICAgICAgICAgICAgIGNvLT5wbGFjZW1lbnRZKCksCi0gICAgICAgICAgICAgICAgICAgIG9yaWVudFN0cihjby0+cGxhY2VtZW50T3JpZW50KCkpKTsKLSAgICAgICAgaWYgKGNvLT5pc1VucGxhY2VkKCkpIHsKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwiKyBVTlBMQUNFRCAiKTsKLSAgICAgICAgICAgIGlmICgoY28tPnBsYWNlbWVudFgoKSAhPSAtMSkgfHwKLSAgICAgICAgICAgICAgICAoY28tPnBsYWNlbWVudFkoKSAhPSAtMSkpCi0gICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIiVkICVkICVzICIsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvLT5wbGFjZW1lbnRYKCksCi0gICAgICAgICAgICAgICAgICAgICAgIGNvLT5wbGFjZW1lbnRZKCksCi0gICAgICAgICAgICAgICAgICAgICAgIG9yaWVudFN0cihjby0+cGxhY2VtZW50T3JpZW50KCkpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY28tPmhhc0dlbmVyYXRlKCkpIHsKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgR0VORVJBVEUgJXMgIiwgY28tPmdlbmVyYXRlTmFtZSgpKTsKLSAgICAgICAgICAgIGlmIChjby0+bWFjcm9OYW1lKCkgJiYKLSAgICAgICAgICAgICAgICAqKGNvLT5tYWNyb05hbWUoKSkpCi0gICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAiLCBjby0+bWFjcm9OYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjby0+aGFzV2VpZ2h0KCkpCi0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIFdFSUdIVCAlZCAiLCBjby0+d2VpZ2h0KCkpOwotICAgICAgICBpZiAoY28tPmhhc0VFUSgpKQotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBFRVFNQVNURVIgJXMgIiwgY28tPkVFUSgpKTsKLSAgICAgICAgaWYgKGNvLT5oYXNSZWdpb25OYW1lKCkpCi0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIFJFR0lPTiAlcyAiLCBjby0+cmVnaW9uTmFtZSgpKTsKLSAgICAgICAgaWYgKGNvLT5oYXNSZWdpb25Cb3VuZHMoKSkgewotICAgICAgICAgICAgaW50ICp4bCwgKnlsLCAqeGgsICp5aDsKLSAgICAgICAgICAgIGludCBzaXplOwotICAgICAgICAgICAgY28tPnJlZ2lvbkJvdW5kcygmc2l6ZSwgJnhsLCAmeWwsICZ4aCwgJnloKTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsgCi0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBSRUdJT04gJWQgJWQgJWQgJWQgXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgeGxbaV0sIHlsW2ldLCB4aFtpXSwgeWhbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChjby0+bWFza1NoaWZ0U2l6ZSgpKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIE1BU0tTSElGVCAiKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IGNvLT5tYXNrU2hpZnRTaXplKCktMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlZCIsIGNvLT5tYXNrU2hpZnQoaSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY28tPmhhc0hhbG8oKSkgewotICAgICAgICAgICAgaW50IGxlZnQsIGJvdHRvbSwgcmlnaHQsIHRvcDsKLSAgICAgICAgICAgICh2b2lkKSBjby0+aGFsb0VkZ2VzKCZsZWZ0LCAmYm90dG9tLCAmcmlnaHQsICZ0b3ApOwotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBIQUxPICIpOwotICAgICAgICAgICAgaWYgKGNvLT5oYXNIYWxvU29mdCgpKQotICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiU09GVCAiKTsKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVkICVkICVkICVkXG4iLCBsZWZ0LCBib3R0b20sIHJpZ2h0LCB0b3ApOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjby0+aGFzUm91dGVIYWxvKCkpIHsKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgUk9VVEVIQUxPICVkICVzICVzXG4iLCBjby0+aGFsb0Rpc3QoKSwKLSAgICAgICAgICAgICAgICAgICAgY28tPm1pbkxheWVyKCksIGNvLT5tYXhMYXllcigpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY28tPmhhc0ZvcmVpZ25OYW1lKCkpIHsKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgRk9SRUlHTiAlcyAlZCAlZCAlcyAlZCAiLAotICAgICAgICAgICAgICAgICAgICBjby0+Zm9yZWlnbk5hbWUoKSwgY28tPmZvcmVpZ25YKCksCi0gICAgICAgICAgICAgICAgICAgIGNvLT5mb3JlaWduWSgpLCBjby0+Zm9yZWlnbk9yaSgpLAotICAgICAgICAgICAgICAgICAgICBjby0+Zm9yZWlnbk9yaWVudCgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY28tPm51bVByb3BzKCkpIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjby0+bnVtUHJvcHMoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBQUk9QRVJUWSAlcyAlcyAiLCBjby0+cHJvcE5hbWUoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICBjby0+cHJvcFZhbHVlKGkpKTsKLSAgICAgICAgICAgICAgICAvLyBCWCAxODA5MTAgREVGIHJlYWQgaXNzdWUKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvLT5wcm9wVHlwZShpKSkgewotICAgICAgICAgICAgICAgICAgIGNhc2UgJ1InOiBmcHJpbnRmKGZvdXQsICJSRUFMICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICBjYXNlICdJJzogZnByaW50Zihmb3V0LCAiSU5URUdFUiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgY2FzZSAnUyc6IGZwcmludGYoZm91dCwgIlNUUklORyAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgY2FzZSAnUSc6IGZwcmludGYoZm91dCwgIlFVT1RFU1RSSU5HICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICBjYXNlICdOJzogZnByaW50Zihmb3V0LCAiTlVNQkVSICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0gICAgICAgIC0tbnVtT2JqczsKLSAgICAgICAgaWYgKG51bU9ianMgPD0gMCkKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkVORCBDT01QT05FTlRTXG4iKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotCi1pbnQgbmV0cGF0aChkZWZyQ2FsbGJhY2tUeXBlX2UsIGRlZmlOZXQqLCBkZWZpVXNlckRhdGEpIHsKLSAgZnByaW50Zihmb3V0LCAiXG4iKTsKLQotICBmcHJpbnRmIChmb3V0LCAiQ2FsbGJhY2sgb2YgcGFydGlhbCBwYXRoIGZvciBuZXRcbiIpOwotCi0gIHJldHVybiAwOwotfQotCi0KLWludCBuZXROYW1lZihkZWZyQ2FsbGJhY2tUeXBlX2UgYywgY29uc3QgY2hhciogbmV0TmFtZSwgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgICBmcHJpbnRmKGZvdXQsICItICVzICIsIG5ldE5hbWUpOwotICByZXR1cm4gMDsKLX0KLQotaW50IHN1Ym5ldE5hbWVmKGRlZnJDYWxsYmFja1R5cGVfZSBjLCBjb25zdCBjaGFyKiBzdWJuZXROYW1lLCBkZWZpVXNlckRhdGEgdWQpIHsKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICAgIGlmIChjdXJWZXIgPj0gNS42KQotICAgICAgZnByaW50Zihmb3V0LCAiICAgKyBTVUJORVQgQ0JLICVzICIsIHN1Ym5ldE5hbWUpOwotICByZXR1cm4gMDsKLX0KLQotaW50IG5vbmRlZlJ1bGVmKGRlZnJDYWxsYmFja1R5cGVfZSBjLCBjb25zdCBjaGFyKiBydWxlTmFtZSwgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgICBpZiAoY3VyVmVyID49IDUuNikKLSAgICAgIGZwcmludGYoZm91dCwgIiAgICsgTk9OREVGQVVMVFJVTEUgQ0JLICVzICIsIHJ1bGVOYW1lKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBuZXRmKGRlZnJDYWxsYmFja1R5cGVfZSBjLCBkZWZpTmV0KiBuZXQsIGRlZmlVc2VyRGF0YSB1ZCkgewotICAvLyBGb3IgbmV0IGFuZCBzcGVjaWFsIG5ldC4KLSAgaW50ICAgICAgICBpLCBqLCBrLCB3LCB4LCB5LCB6LCBjb3VudCwgbmV3TGF5ZXI7Ci0gIGRlZmlQYXRoKiAgcDsKLSAgZGVmaVN1Ym5ldCAqczsKLSAgaW50ICAgICAgICBwYXRoOwotICBkZWZpVnBpbiAgICp2cGluOwotICAvLyBkZWZpU2hpZWxkICpub1NoaWVsZDsKLSAgZGVmaVdpcmUgICAqd2lyZTsKLQotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGlmIChjICE9IGRlZnJOZXRDYmtUeXBlKQotICAgICAgZnByaW50Zihmb3V0LCAiQk9HVVMgTkVUIFRZUEUgICIpOwotICBpZiAobmV0LT5waW5Jc011c3RKb2luKDApKQotICAgICAgZnByaW50Zihmb3V0LCAiLSBNVVNUSk9JTiAiKTsKLS8vIDUvNi8yMDA0IC0gZG9uJ3QgbmVlZCBzaW5jZSBJIGhhdmUgYSBjYWxsYmFjayBmb3IgdGhlIG5hbWUKLS8vICBlbHNlCi0vLyAgICAgIGZwcmludGYoZm91dCwgIi0gJXMgIiwgbmV0LT5uYW1lKCkpOwotIAotLy8gIG5ldC0+Y2hhbmdlTmV0TmFtZSgibmV3TmV0TmFtZSIpOwotLy8gIGZwcmludGYoZm91dCwgIiVzICIsIG5ldC0+bmFtZSgpKTsKLSAgY291bnQgPSAwOwotICAvLyBjb21wTmFtZSAmIHBpbk5hbWUKLSAgZm9yIChpID0gMDsgaSA8IG5ldC0+bnVtQ29ubmVjdGlvbnMoKTsgaSsrKSB7Ci0gICAgICAvLyBzZXQgdGhlIGxpbWl0IG9mIG9ubHkgNSBpdGVtcyBwZXIgbGluZQotICAgICAgY291bnQrKzsKLSAgICAgIGlmIChjb3VudCA+PSA1KSB7Ci0gICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgICBjb3VudCA9IDA7Ci0gICAgICB9Ci0gICAgICBmcHJpbnRmKGZvdXQsICIoICVzICVzICkgIiwgbmV0LT5pbnN0YW5jZShpKSwKLSAgICAgICAgICAgICAgbmV0LT5waW4oaSkpOwotLy8gICAgICBuZXQtPmNoYW5nZUluc3RhbmNlKCJuZXdJbnN0YW5jZSIsIGkpOwotLy8gICAgICBuZXQtPmNoYW5nZVBpbigibmV3UGluIiwgaSk7Ci0vLyAgICAgIGZwcmludGYoZm91dCwgIiggJXMgJXMgKSAiLCBuZXQtPmluc3RhbmNlKGkpLAotLy8gICAgICAgICAgICAgIG5ldC0+cGluKGkpKTsKLSAgICAgIGlmIChuZXQtPnBpbklzU3ludGhlc2l6ZWQoaSkpCi0gICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBTWU5USEVTSVpFRCAiKTsKLSAgfQotCi0gIC8vIGZwcmludGYoZm91dCwgImFiY1xuIik7Ci0gIC8vIHByaW50IHJvdXRlZCB3aXJlIHNlZ21lbnQKLSAgaW50IGNudCA9IDA7Ci0gIGZwcmludGYoZm91dCwgIlxuIik7Ci0KLSAgaWYgKHRydWUpIHsKLSAgICBpZiAodXNlckRhdGEtPmNvbm5GaWdzLmZpbmQobmV0LT5uYW1lKCkpID09IHVzZXJEYXRhLT5jb25uRmlncy5lbmQoKSkgewotICAgICAgLy9zdGQ6OmNvdXQgPDwiV2FybmluZzogbm8gcm91dGVzIGZvciAiIDw8bmV0LT5uYW1lKCkgPDxzdGQ6OmVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZvciAoYXV0byAmY29ubkZpZzogdXNlckRhdGEtPmNvbm5GaWdzLmF0KG5ldC0+bmFtZSgpKSkgewotICAgICAgICBpZiAoY250ID09IDApIHsKLSAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICsgUk9VVEVEICIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgICBORVcgIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbm5GaWctPnR5cGVJZCgpID09IGZyY1BhdGhTZWcpIHsKLSAgICAgICAgICAvL3N0ZDo6Y291dCA8PCJoZXJlIiA8PHN0ZDo6ZW5kbDsKLSAgICAgICAgICBhdXRvIHBhdGhTZWcgPSBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PGZyUGF0aFNlZz4oY29ubkZpZyk7Ci0gICAgICAgICAgYXV0byBsYXllck5hbWUgPSB1c2VyRGF0YS0+Z2V0VGVjaCgpLT5nZXRMYXllcihwYXRoU2VnLT5nZXRMYXllck51bSgpKS0+Z2V0TmFtZSgpOwotICAgICAgICAgIC8vZnJDb29yZCBkZWZhdWx0V2lkdGggPSB1c2VyRGF0YS0+Z2V0VGVjaCgpLT5nZXRMYXllcihwYXRoU2VnLT5nZXRMYXllck51bSgpKS0+Z2V0V2lkdGgoKTsKLSAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyIsIGxheWVyTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICBmclBvaW50IGJlZ2luLCBlbmQ7Ci0gICAgICAgICAgZnJTZWdTdHlsZSBzZWdTdHlsZTsKLSAgICAgICAgICBwYXRoU2VnLT5nZXRQb2ludHMoYmVnaW4sIGVuZCk7Ci0gICAgICAgICAgLy8gdmVydGljYWwgcmVjdAotICAgICAgICAgIC8vaWYgKGJlZ2luLngoKSA9PSBlbmQueCgpICYmIGVuZC55KCkgLSBiZWdpbi55KCkgPCBkZWZhdWx0V2lkdGgpIHsKLSAgICAgICAgICAvLyAgZnByaW50Zihmb3V0LCAiICggJWQgJWQgKSBSRUNUICggJWQgJWQgJWQgJWQgKSIsIGJlZ2luLngoKSwgYmVnaW4ueSgpLAotICAgICAgICAgIC8vICAgICAgLWRlZmF1bHRXaWR0aC8yLCAtZGVmYXVsdFdpZHRoLzIsIGRlZmF1bHRXaWR0aC8yLCBkZWZhdWx0V2lkdGgvMiArIGVuZC55KCkgLSBiZWdpbi55KCkpOwotICAgICAgICAgIC8vICAvL3N0ZDo6Y291dCA8PCJoZXJlMSIgPDxzdGQ6OmVuZGw7Ci0gICAgICAgICAgLy8vLyBob3Jpem9udGFsIHJlY3QKLSAgICAgICAgICAvL30gZWxzZSBpZiAoYmVnaW4ueSgpID09IGVuZC55KCkgJiYgZW5kLngoKSAtIGJlZ2luLngoKSA8IGRlZmF1bHRXaWR0aCkgewotICAgICAgICAgIC8vICBmcHJpbnRmKGZvdXQsICIgKCAlZCAlZCApIFJFQ1QgKCAlZCAlZCAlZCAlZCApIiwgYmVnaW4ueCgpLCBiZWdpbi55KCksCi0gICAgICAgICAgLy8gICAgICAtZGVmYXVsdFdpZHRoLzIsIC1kZWZhdWx0V2lkdGgvMiwgZGVmYXVsdFdpZHRoLzIgKyBlbmQueCgpIC0gYmVnaW4ueCgpLCBkZWZhdWx0V2lkdGgvMik7Ci0gICAgICAgICAgLy8gIC8vc3RkOjpjb3V0IDw8ImhlcmUyIiA8PHN0ZDo6ZW5kbDsKLSAgICAgICAgICAvL30gZWxzZSB7Ci0gICAgICAgICAgICAvL3N0ZDo6Y291dCA8PCJoZXJlMyIgPDxzdGQ6OmVuZGw7Ci0gICAgICAgICAgICBwYXRoU2VnLT5nZXRTdHlsZShzZWdTdHlsZSk7Ci0gICAgICAgICAgICBpZiAoc2VnU3R5bGUuZ2V0QmVnaW5TdHlsZSgpID09IGZyRW5kU3R5bGUoZnJjRXh0ZW5kRW5kU3R5bGUpKSB7Ci0gICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAoICVkICVkICkiLCBiZWdpbi54KCksIGJlZ2luLnkoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNlZ1N0eWxlLmdldEJlZ2luU3R5bGUoKSA9PSBmckVuZFN0eWxlKGZyY1RydW5jYXRlRW5kU3R5bGUpKSB7Ci0gICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAoICVkICVkIDAgKSIsIGJlZ2luLngoKSwgYmVnaW4ueSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VnU3R5bGUuZ2V0QmVnaW5TdHlsZSgpID09IGZyRW5kU3R5bGUoZnJjVmFyaWFibGVFbmRTdHlsZSkpIHsKLSAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICggJWQgJWQgJWQgKSIsIGJlZ2luLngoKSwgYmVnaW4ueSgpLCBzZWdTdHlsZS5nZXRCZWdpbkV4dCgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzZWdTdHlsZS5nZXRFbmRTdHlsZSgpID09IGZyRW5kU3R5bGUoZnJjRXh0ZW5kRW5kU3R5bGUpKSB7Ci0gICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAoICVkICVkICkiLCBlbmQueCgpLCBlbmQueSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VnU3R5bGUuZ2V0RW5kU3R5bGUoKSA9PSBmckVuZFN0eWxlKGZyY1RydW5jYXRlRW5kU3R5bGUpKSB7Ci0gICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAoICVkICVkIDAgKSIsIGVuZC54KCksIGVuZC55KCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzZWdTdHlsZS5nZXRFbmRTdHlsZSgpID09IGZyRW5kU3R5bGUoZnJjVmFyaWFibGVFbmRTdHlsZSkpIHsKLSAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICggJWQgJWQgJWQgKSIsIGVuZC54KCksIGVuZC55KCksIHNlZ1N0eWxlLmdldEVuZEV4dCgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAvL30KLSAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICB9IGVsc2UgaWYgKGNvbm5GaWctPnR5cGVJZCgpID09IGZyY1ZpYSkgewotICAgICAgICAgIGF1dG8gdmlhID0gc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxmclZpYT4oY29ubkZpZyk7Ci0gICAgICAgICAgYXV0byBsYXllck5hbWUgPSB1c2VyRGF0YS0+Z2V0VGVjaCgpLT5nZXRMYXllcih2aWEtPmdldFZpYURlZigpLT5nZXRMYXllcjFOdW0oKSktPmdldE5hbWUoKTsKLSAgICAgICAgICBhdXRvIHZpYU5hbWUgPSB2aWEtPmdldFZpYURlZigpLT5nZXROYW1lKCk7Ci0gICAgICAgICAgZnJQb2ludCBvcmlnaW47Ci0gICAgICAgICAgdmlhLT5nZXRPcmlnaW4ob3JpZ2luKTsKLSAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAoICVkICVkICkgJXNcbiIsIAotICAgICAgICAgICAgICAgICAgbGF5ZXJOYW1lLmNfc3RyKCksIAotICAgICAgICAgICAgICAgICAgb3JpZ2luLngoKSwgb3JpZ2luLnkoKSwgdmlhTmFtZS5jX3N0cigpKTsKLSAgICAgICAgfSBlbHNlIGlmIChjb25uRmlnLT50eXBlSWQoKSA9PSBmcmNQYXRjaFdpcmUpIHsKLSAgICAgICAgICBhdXRvIHB3aXJlID0gc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxmclBhdGNoV2lyZT4oY29ubkZpZyk7Ci0gICAgICAgICAgYXV0byBsYXllck5hbWUgPSB1c2VyRGF0YS0+Z2V0VGVjaCgpLT5nZXRMYXllcihwd2lyZS0+Z2V0TGF5ZXJOdW0oKSktPmdldE5hbWUoKTsKLSAgICAgICAgICBmclBvaW50IG9yaWdpbjsKLSAgICAgICAgICBmckJveCBvZmZzZXRCb3g7Ci0gICAgICAgICAgcHdpcmUtPmdldE9yaWdpbihvcmlnaW4pOwotICAgICAgICAgIHB3aXJlLT5nZXRPZmZzZXRCb3gob2Zmc2V0Qm94KTsKLSAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAoICVkICVkICkgUkVDVCAoICVkICVkICVkICVkIClcbiIsCi0gICAgICAgICAgICAgICAgICBsYXllck5hbWUuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgIG9yaWdpbi54KCksIG9yaWdpbi55KCksCi0gICAgICAgICAgICAgICAgICBvZmZzZXRCb3gubGVmdCgpLCBvZmZzZXRCb3guYm90dG9tKCksIG9mZnNldEJveC5yaWdodCgpLCBvZmZzZXRCb3gudG9wKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHN0ZDo6Y291dCA8PCJFcnJvcjogdW5rbm93biBkcnQgdHlwZSIgPDxzdGQ6OmVuZGw7Ci0gICAgICAgICAgZXhpdCgyKTsKLSAgICAgICAgfQotICAgICAgICBjbnQrKzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAobmV0LT5oYXNOb25EZWZhdWx0UnVsZSgpKQotICAgICAgZnByaW50Zihmb3V0LCAiKyBOT05ERUZBVUxUUlVMRSAlc1xuIiwgbmV0LT5ub25EZWZhdWx0UnVsZSgpKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgbmV0LT5udW1WcGlucygpOyBpKyspIHsKLSAgICAgIHZwaW4gPSBuZXQtPnZwaW4oaSk7Ci0gICAgICBmcHJpbnRmKGZvdXQsICIgICsgJXMiLCB2cGluLT5uYW1lKCkpOwotICAgICAgaWYgKHZwaW4tPmxheWVyKCkpIAotICAgICAgICAgIGZwcmludGYoZm91dCwgIiAlcyIsIHZwaW4tPmxheWVyKCkpOwotICAgICAgZnByaW50Zihmb3V0LCAiICVkICVkICVkICVkIiwgdnBpbi0+eGwoKSwgdnBpbi0+eWwoKSwgdnBpbi0+eGgoKSwKLSAgICAgICAgICAgICAgdnBpbi0+eWgoKSk7Ci0gICAgICBpZiAodnBpbi0+c3RhdHVzKCkgIT0gJyAnKSB7Ci0gICAgICAgICAgZnByaW50Zihmb3V0LCAiICVjIiwgdnBpbi0+c3RhdHVzKCkpOwotICAgICAgICAgIGZwcmludGYoZm91dCwgIiAlZCAlZCIsIHZwaW4tPnhMb2MoKSwgdnBpbi0+eUxvYygpKTsKLSAgICAgICAgICBpZiAodnBpbi0+b3JpZW50KCkgIT0gLTEpCi0gICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAlcyIsIG9yaWVudFN0cih2cGluLT5vcmllbnQoKSkpOwotICAgICAgfQotICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgfQotCi0gIC8vIHJlZ3VsYXJXaXJpbmcKLSAgLy8gMTgwOTAzIEJYCi0gIAotICBpZiAoZmFsc2UpIHsKLSAgLy8gaWYgKG5ldC0+bnVtV2lyZXMoKSkgewotICAvLyBpZiAoY3VyTmV0LT5pc1ByZVJvdXRlZCA9PSB0cnVlICYmIG5ldC0+bnVtV2lyZXMoKSA+IDApIHsKLSAgICAgZm9yIChpID0gMDsgaSA8IG5ldC0+bnVtV2lyZXMoKTsgaSsrKSB7Ci0gICAgICAgIG5ld0xheWVyID0gMDsKLSAgICAgICAgd2lyZSA9IG5ldC0+d2lyZShpKTsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiXG4gICsgJXMgIiwgd2lyZS0+d2lyZVR5cGUoKSk7Ci0gICAgICAgIGNvdW50ID0gMDsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpcmUtPm51bVBhdGhzKCk7IGorKykgewotICAgICAgICAgICBwID0gd2lyZS0+cGF0aChqKTsKLSAgICAgICAgICAgcC0+aW5pdFRyYXZlcnNlKCk7Ci0gICAgICAgICAgIHdoaWxlICgocGF0aCA9IChpbnQpcC0+bmV4dCgpKSAhPSBERUZJUEFUSF9ET05FKSB7Ci0gICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgIC8vIERvbid0IHdhbnQgdGhlIGxpbmUgdG8gYmUgdG9vIGxvbmcKLSAgICAgICAgICAgICAgaWYgKGNvdW50ID49IDUpIHsKLSAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgICAgICAgICAgICAgICBjb3VudCA9IDA7Ci0gICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAgIHN3aXRjaCAocGF0aCkgewotICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfTEFZRVI6Ci0gICAgICAgICAgICAgICAgICAgICBpZiAobmV3TGF5ZXIgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzICIsIHAtPmdldExheWVyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xheWVyID0gMTsKLSAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuICAgIE5FVyAlcyAiLCBwLT5nZXRMYXllcigpKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX01BU0s6Ci0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTUFTSyAlZCAiLCBwLT5nZXRNYXNrKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1ZJQU1BU0s6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTUFTSyAlZCVkJWQgIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRWaWFUb3BNYXNrKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+Z2V0VmlhQ3V0TWFzaygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+Z2V0VmlhQm90dG9tTWFzaygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9WSUE6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgaWdub3JlVmlhTmFtZXMgPyAiWFhYIiA6IHAtPmdldFZpYSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9WSUFST1RBVElPTjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudFN0cihwLT5nZXRWaWFSb3RhdGlvbigpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfUkVDVDoKLSAgICAgICAgICAgICAgICAgICBwLT5nZXRWaWFSZWN0KCZ3LCAmeCwgJnksICZ6KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJSRUNUICggJWQgJWQgJWQgJWQgKSAiLCB3LCB4LCB5LCB6KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9WSVJUVUFMUE9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgcC0+Z2V0VmlydHVhbFBvaW50KCZ4LCAmeSk7Ci0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiVklSVFVBTCAoICVkICVkICkgIiwgeCwgeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfV0lEVEg6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJWQgIiwgcC0+Z2V0V2lkdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfUE9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+Z2V0UG9pbnQoJngsICZ5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIoICVkICVkICkgIiwgeCwgeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfRkxVU0hQT0lOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRGbHVzaFBvaW50KCZ4LCAmeSwgJnopOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiggJWQgJWQgJWQgKSAiLCB4LCB5LCB6KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9UQVBFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJUQVBFUiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9UQVBFUlJVTEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiVEFQRVJSVUxFICVzICIscC0+Z2V0VGFwZXJSdWxlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1NUWUxFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlNUWUxFICVkICIscC0+Z2V0U3R5bGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgY291bnQgPSAwOwotICAgICB9Ci0gIH0KLSAgCi0KLSAgLy8gU0hJRUxETkVUCi0gIGlmIChuZXQtPm51bVNoaWVsZE5ldHMoKSkgewotICAgICBmb3IgKGkgPSAwOyBpIDwgbmV0LT5udW1TaGllbGROZXRzKCk7IGkrKykgCi0gICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBTSElFTERORVQgJXMiLCBuZXQtPnNoaWVsZE5ldChpKSk7Ci0gIH0KLSAgLyogb2Jzb2xldGUgaW4gNS40Ci0gIGlmIChuZXQtPm51bU5vU2hpZWxkcygpKSB7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBuZXQtPm51bU5vU2hpZWxkcygpOyBpKyspIHsgCi0gICAgICAgICBub1NoaWVsZCA9IG5ldC0+bm9TaGllbGQoaSk7IAotICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4gICsgTk9TSElFTEQgIik7Ci0gICAgICAgICBuZXdMYXllciA9IDA7Ci0gICAgICAgICBmb3IgKGogPSAwOyBqIDwgbm9TaGllbGQtPm51bVBhdGhzKCk7IGorKykgewotICAgICAgICAgICAgcCA9IG5vU2hpZWxkLT5wYXRoKGopOwotICAgICAgICAgICAgcC0+aW5pdFRyYXZlcnNlKCk7Ci0gICAgICAgICAgICB3aGlsZSAoKHBhdGggPSAoaW50KXAtPm5leHQoKSkgIT0gREVGSVBBVEhfRE9ORSkgewotICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgIC8vIERvbid0IHdhbnQgdGhlIGxpbmUgdG8gYmUgdG9vIGxvbmcKLSAgICAgICAgICAgICAgIGlmIChjb3VudCA+PSA1KSB7Ci0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgICAgICAgICAgICBjb3VudCA9IDA7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBzd2l0Y2ggKHBhdGgpIHsKLSAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9MQVlFUjoKLSAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3TGF5ZXIgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAiLCBwLT5nZXRMYXllcigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGF5ZXIgPSAxOwotICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJORVcgJXMgIiwgcC0+Z2V0TGF5ZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfVklBOgotICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzICIsIHAtPmdldFZpYSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9WSUFST1RBVElPTjoKLSAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50U3RyKHAtPmdldFZpYVJvdGF0aW9uKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9XSURUSDoKLSAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlZCAiLCBwLT5nZXRXaWR0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9QT0lOVDoKLSAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRQb2ludCgmeCwgJnkpOwotICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiggJWQgJWQgKSAiLCB4LCB5KTsKLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9GTFVTSFBPSU5UOgotICAgICAgICAgICAgICAgICAgICAgIHAtPmdldEZsdXNoUG9pbnQoJngsICZ5LCAmeik7Ci0gICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKCAlZCAlZCAlZCApICIsIHgsIHksIHopOwotICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1RBUEVSOgotICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlRBUEVSICIpOwotICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1RBUEVSUlVMRToKLSAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJUQVBFUlJVTEUgJXMgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmdldFRhcGVyUnVsZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgfQotICB9Ci0qLwotCi0gIGlmIChuZXQtPmhhc1N1Ym5ldHMoKSkgewotICAgICBmb3IgKGkgPSAwOyBpIDwgbmV0LT5udW1TdWJuZXRzKCk7IGkrKykgewotICAgICAgICBzID0gbmV0LT5zdWJuZXQoaSk7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gCi0gICAgICAgIGlmIChzLT5udW1Db25uZWN0aW9ucygpKSB7Ci0gICAgICAgICAgIGlmIChzLT5waW5Jc011c3RKb2luKDApKQotICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICItIE1VU1RKT0lOICIpOwotICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgKyBTVUJORVQgJXMgIiwgcy0+bmFtZSgpKTsKLSAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHMtPm51bUNvbm5lY3Rpb25zKCk7IGorKykKLSAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICggJXMgJXMgKVxuIiwgcy0+aW5zdGFuY2UoaiksCi0gICAgICAgICAgICAgICAgICAgICAgcy0+cGluKGopKTsKLQotICAgICAgICAgICAvLyByZWd1bGFyV2lyaW5nCi0gICAgICAgICAgIGlmIChzLT5udW1XaXJlcygpKSB7Ci0gICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBzLT5udW1XaXJlcygpOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgbmV3TGF5ZXIgPSAwOwotICAgICAgICAgICAgICAgICB3aXJlID0gcy0+d2lyZShrKTsKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICAlcyAiLCB3aXJlLT53aXJlVHlwZSgpKTsKLSAgICAgICAgICAgICAgICAgY291bnQgPSAwOwotICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lyZS0+bnVtUGF0aHMoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHAgPSB3aXJlLT5wYXRoKGopOwotICAgICAgICAgICAgICAgICAgICBwLT5pbml0VHJhdmVyc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChwYXRoID0gKGludClwLT5uZXh0KCkpICE9IERFRklQQVRIX0RPTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3Qgd2FudCB0aGUgbGluZSB0byBiZSB0b28gbG9uZwotICAgICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQgPj0gNSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwYXRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9MQVlFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdMYXllciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgcC0+Z2V0TGF5ZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGF5ZXIgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTkVXICVzICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRMYXllcigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfVklBOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgaWdub3JlVmlhTmFtZXMgPyAiWFhYIiA6IHAtPmdldFZpYSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfVklBUk9UQVRJT046Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRWaWFSb3RhdGlvblN0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfV0lEVEg6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlZCAiLCBwLT5nZXRXaWR0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfUE9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRQb2ludCgmeCwgJnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKCAlZCAlZCApICIsIHgsIHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9GTFVTSFBPSU5UOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+Z2V0Rmx1c2hQb2ludCgmeCwgJnksICZ6KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiggJWQgJWQgJWQgKSAiLCB4LCB5LCB6KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfVEFQRVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJUQVBFUiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfVEFQRVJSVUxFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiVEFQRVJSVUxFICAlcyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRUYXBlclJ1bGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1NUWUxFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiU1RZTEUgICVkICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmdldFN0eWxlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgfQotCi0gIGlmIChuZXQtPm51bVByb3BzKCkpIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbmV0LT5udW1Qcm9wcygpOyBpKyspIHsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiICArIFBST1BFUlRZICVzICIsIG5ldC0+cHJvcE5hbWUoaSkpOwotICAgICAgICBzd2l0Y2ggKG5ldC0+cHJvcFR5cGUoaSkpIHsKLSAgICAgICAgICAgLy8gY2FzZSAnUic6IGZwcmludGYoZm91dCwgIiVnIFJFQUwgIiwgbmV0LT5wcm9wTnVtYmVyKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgIC8vIGJyZWFrOwotICAgICAgICAgICBjYXNlICdSJzogZnByaW50Zihmb3V0LCAiJWcgIiwgbmV0LT5wcm9wTnVtYmVyKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICBjYXNlICdJJzogZnByaW50Zihmb3V0LCAiJWcgSU5URUdFUiAiLCBuZXQtPnByb3BOdW1iZXIoaSkpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIGNhc2UgJ1MnOiBmcHJpbnRmKGZvdXQsICIlcyBTVFJJTkcgIiwgbmV0LT5wcm9wVmFsdWUoaSkpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIGNhc2UgJ1EnOiBmcHJpbnRmKGZvdXQsICIlcyBRVU9URVNUUklORyAiLCBuZXQtPnByb3BWYWx1ZShpKSk7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgY2FzZSAnTic6IGZwcmludGYoZm91dCwgIiVnIE5VTUJFUiAiLCBuZXQtPnByb3BOdW1iZXIoaSkpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICB9Ci0gIH0KLQotICBpZiAobmV0LT5oYXNXZWlnaHQoKSkKLSAgICBmcHJpbnRmKGZvdXQsICIrIFdFSUdIVCAlZCAiLCBuZXQtPndlaWdodCgpKTsKLSAgaWYgKG5ldC0+aGFzQ2FwKCkpCi0gICAgZnByaW50Zihmb3V0LCAiKyBFU1RDQVAgJWcgIiwgbmV0LT5jYXAoKSk7Ci0gIGlmIChuZXQtPmhhc1NvdXJjZSgpKQotICAgIGZwcmludGYoZm91dCwgIisgU09VUkNFICVzICIsIG5ldC0+c291cmNlKCkpOwotICBpZiAobmV0LT5oYXNGaXhlZGJ1bXAoKSkKLSAgICBmcHJpbnRmKGZvdXQsICIrIEZJWEVEQlVNUCAiKTsKLSAgaWYgKG5ldC0+aGFzRnJlcXVlbmN5KCkpCi0gICAgZnByaW50Zihmb3V0LCAiKyBGUkVRVUVOQ1kgJWcgIiwgbmV0LT5mcmVxdWVuY3koKSk7Ci0gIGlmIChuZXQtPmhhc1BhdHRlcm4oKSkKLSAgICBmcHJpbnRmKGZvdXQsICIrIFBBVFRFUk4gJXMgIiwgbmV0LT5wYXR0ZXJuKCkpOwotICBpZiAobmV0LT5oYXNPcmlnaW5hbCgpKQotICAgIGZwcmludGYoZm91dCwgIisgT1JJR0lOQUwgJXMgIiwgbmV0LT5vcmlnaW5hbCgpKTsKLSAgaWYgKG5ldC0+aGFzVXNlKCkpCi0gICAgZnByaW50Zihmb3V0LCAiKyBVU0UgJXMgIiwgbmV0LT51c2UoKSk7Ci0KLSAgZnByaW50ZiAoZm91dCwgIjtcbiIpOwotICAtLW51bU9ianM7Ci0gIC8vaWYgKG51bU9ianMgPD0gMCkKLSAgLy8gICAgZnByaW50Zihmb3V0LCAiRU5EIE5FVFNcbiIpOwotICByZXR1cm4gMDsKLX0KLQotCi1pbnQgc25ldHBhdGgoZGVmckNhbGxiYWNrVHlwZV9lIGMsIGRlZmlOZXQqIHBwYXRoLCBkZWZpVXNlckRhdGEgdWQpIHsKLSAgaW50ICAgICAgICAgaSwgaiwgeCwgeSwgeiwgY291bnQsIG5ld0xheWVyOwotICBjaGFyKiAgICAgICBsYXllck5hbWU7Ci0gIGRvdWJsZSAgICAgIGRpc3QsIGxlZnQsIHJpZ2h0OwotICBkZWZpUGF0aCogICBwOwotICBkZWZpU3VibmV0ICAqczsKLSAgaW50ICAgICAgICAgcGF0aDsKLSAgZGVmaVNoaWVsZCogc2hpZWxkOwotICBkZWZpV2lyZSogICB3aXJlOwotICBpbnQgICAgICAgICBudW1YLCBudW1ZLCBzdGVwWCwgc3RlcFk7Ci0KLSAgaWYgKGMgIT0gZGVmclNOZXRQYXJ0aWFsUGF0aENia1R5cGUpCi0gICAgICByZXR1cm4gMTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLQotICBmcHJpbnRmIChmb3V0LCAiU1BFQ0lBTE5FVCBwYXJ0aWFsIGRhdGFcbiIpOwotCi0gIGZwcmludGYoZm91dCwgIi0gJXMgIiwgcHBhdGgtPm5hbWUoKSk7Ci0KLSAgY291bnQgPSAwOwotICAvLyBjb21wTmFtZSAmIHBpbk5hbWUKLSAgZm9yIChpID0gMDsgaSA8IHBwYXRoLT5udW1Db25uZWN0aW9ucygpOyBpKyspIHsKLSAgICAgIC8vIHNldCB0aGUgbGltaXQgb2Ygb25seSA1IGl0ZW1zIHByaW50IG91dCBpbiBvbmUgbGluZQotICAgICAgY291bnQrKzsKLSAgICAgIGlmIChjb3VudCA+PSA1KSB7Ci0gICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgICBjb3VudCA9IDA7Ci0gICAgICB9Ci0gICAgICBmcHJpbnRmIChmb3V0LCAiKCAlcyAlcyApICIsIHBwYXRoLT5pbnN0YW5jZShpKSwKLSAgICAgICAgICAgICAgIHBwYXRoLT5waW4oaSkpOwotICAgICAgaWYgKHBwYXRoLT5waW5Jc1N5bnRoZXNpemVkKGkpKQotICAgICAgICAgIGZwcmludGYoZm91dCwgIisgU1lOVEhFU0laRUQgIik7Ci0gIH0KLQotICAvLyBzcGVjaWFsV2lyaW5nCi0gIC8vIFBPTFlHT04KLSAgaWYgKHBwYXRoLT5udW1Qb2x5Z29ucygpKSB7Ci0gICAgIHN0cnVjdCBkZWZpUG9pbnRzIHBvaW50czsKLSAgICBmb3IgKGkgPSAwOyBpIDwgcHBhdGgtPm51bVBvbHlnb25zKCk7IGkrKykgewotICAgICAgZnByaW50Zihmb3V0LCAiXG4gICsgUE9MWUdPTiAlcyAiLCBwcGF0aC0+cG9seWdvbk5hbWUoaSkpOwotICAgICAgcG9pbnRzID0gcHBhdGgtPmdldFBvbHlnb24oaSk7Ci0gICAgICBmb3IgKGogPSAwOyBqIDwgcG9pbnRzLm51bVBvaW50czsgaisrKQotICAgICAgICBmcHJpbnRmKGZvdXQsICIlZCAlZCAiLCBwb2ludHMueFtqXSwgcG9pbnRzLnlbal0pOwotICAgIH0KLSAgfQotICAvLyBSRUNUCi0gIGlmIChwcGF0aC0+bnVtUmVjdGFuZ2xlcygpKSB7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBwcGF0aC0+bnVtUmVjdGFuZ2xlcygpOyBpKyspIHsKLSAgICAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBSRUNUICVzICVkICVkICVkICVkIiwgcHBhdGgtPnJlY3ROYW1lKGkpLAotICAgICAgICAgICAgICAgcHBhdGgtPnhsKGkpLCBwcGF0aC0+eWwoaSksCi0gICAgICAgICAgICAgICBwcGF0aC0+eGgoaSksIHBwYXRoLT55aChpKSk7Ci0gICAgIH0KLSAgfQotCi0gIC8vIENPVkVSLCBGSVhFRCwgUk9VVEVEIG9yIFNISUVMRAotICBpZiAocHBhdGgtPm51bVdpcmVzKCkpIHsKLSAgICAgbmV3TGF5ZXIgPSAwOwotICAgICBmb3IgKGkgPSAwOyBpIDwgcHBhdGgtPm51bVdpcmVzKCk7IGkrKykgewotICAgICAgICBuZXdMYXllciA9IDA7Ci0gICAgICAgIHdpcmUgPSBwcGF0aC0+d2lyZShpKTsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiXG4gICsgJXMgIiwgd2lyZS0+d2lyZVR5cGUoKSk7Ci0gICAgICAgIGlmIChzdHJjbXAgKHdpcmUtPndpcmVUeXBlKCksICJTSElFTEQiKSA9PSAwKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAiLCB3aXJlLT53aXJlU2hpZWxkTmV0TmFtZSgpKTsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpcmUtPm51bVBhdGhzKCk7IGorKykgewotICAgICAgICAgICBwID0gd2lyZS0+cGF0aChqKTsKLSAgICAgICAgICAgcC0+aW5pdFRyYXZlcnNlKCk7Ci0gICAgICAgICAgIHdoaWxlICgocGF0aCA9IChpbnQpcC0+bmV4dCgpKSAhPSBERUZJUEFUSF9ET05FKSB7Ci0gICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgIC8vIERvbid0IHdhbnQgdGhlIGxpbmUgdG8gYmUgdG9vIGxvbmcKLSAgICAgICAgICAgICAgaWYgKGNvdW50ID49IDUpIHsKLSAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgICAgICAgICAgICAgICBjb3VudCA9IDA7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgc3dpdGNoIChwYXRoKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9MQVlFUjoKLSAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdMYXllciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgcC0+Z2V0TGF5ZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGF5ZXIgPSAxOwotICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTkVXICVzICIsIHAtPmdldExheWVyKCkpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9WSUE6Ci0gICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAiLCBpZ25vcmVWaWFOYW1lcyA/ICJYWFgiIDogcC0+Z2V0VmlhKCkpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9WSUFST1RBVElPTjoKLSAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudFN0cihwLT5nZXRWaWFSb3RhdGlvbigpKSk7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1ZJQURBVEE6Ci0gICAgICAgICAgICAgICAgICAgICBwLT5nZXRWaWFEYXRhKCZudW1YLCAmbnVtWSwgJnN0ZXBYLCAmc3RlcFkpOwotICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiRE8gJWQgQlkgJWQgU1RFUCAlZCAlZCAiLCBudW1YLCBudW1ZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwWCwgc3RlcFkpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9XSURUSDoKLSAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVkICIsIHAtPmdldFdpZHRoKCkpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9NQVNLOgotICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTUFTSyAlZCAiLCBwLT5nZXRNYXNrKCkpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9WSUFNQVNLOgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJNQVNLICVkJWQlZCAiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRWaWFUb3BNYXNrKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmdldFZpYUN1dE1hc2soKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRWaWFCb3R0b21NYXNrKCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1BPSU5UOgotICAgICAgICAgICAgICAgICAgICAgcC0+Z2V0UG9pbnQoJngsICZ5KTsKLSAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiggJWQgJWQgKSAiLCB4LCB5KTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfRkxVU0hQT0lOVDoKLSAgICAgICAgICAgICAgICAgICAgIHAtPmdldEZsdXNoUG9pbnQoJngsICZ5LCAmeik7Ci0gICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIoICVkICVkICVkICkgIiwgeCwgeSwgeik7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1RBUEVSOgotICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiVEFQRVIgIik7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1NIQVBFOgotICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBTSEFQRSAlcyAiLCBwLT5nZXRTaGFwZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfU1RZTEU6Ci0gICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIFNUWUxFICVkICIsIHAtPmdldFN0eWxlKCkpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgICAgIGNvdW50ID0gMDsKLSAgICAgfQotICB9Ci0KLSAgaWYgKHBwYXRoLT5oYXNTdWJuZXRzKCkpIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgcHBhdGgtPm51bVN1Ym5ldHMoKTsgaSsrKSB7Ci0gICAgICBzID0gcHBhdGgtPnN1Ym5ldChpKTsKLSAgICAgIGlmIChzLT5udW1Db25uZWN0aW9ucygpKSB7Ci0gICAgICAgICAgaWYgKHMtPnBpbklzTXVzdEpvaW4oMCkpCi0gICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIi0gTVVTVEpPSU4gIik7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICItICVzICIsIHMtPm5hbWUoKSk7Ci0gICAgICAgICAgZm9yIChqID0gMDsgaiA8IHMtPm51bUNvbm5lY3Rpb25zKCk7IGorKykgewotICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgKCAlcyAlcyApXG4iLCBzLT5pbnN0YW5jZShqKSwKLSAgICAgICAgICAgICAgICAgICAgICBzLT5waW4oaikpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIHJlZ3VsYXJXaXJpbmcKLSAgICAgIGlmIChzLT5udW1XaXJlcygpKSB7Ci0gICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bnVtV2lyZXMoKTsgaSsrKSB7Ci0gICAgICAgICAgICB3aXJlID0gcy0+d2lyZShpKTsKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgKyAlcyAiLCB3aXJlLT53aXJlVHlwZSgpKTsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB3aXJlLT5udW1QYXRocygpOyBqKyspIHsKLSAgICAgICAgICAgICAgcCA9IHdpcmUtPnBhdGgoaik7Ci0gICAgICAgICAgICAgIHAtPnByaW50KGZvdXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmIChwcGF0aC0+bnVtUHJvcHMoKSkgewotICAgIGZvciAoaSA9IDA7IGkgPCBwcGF0aC0+bnVtUHJvcHMoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChwcGF0aC0+cHJvcElzU3RyaW5nKGkpKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICsgUFJPUEVSVFkgJXMgJXMgIiwgcHBhdGgtPnByb3BOYW1lKGkpLAotICAgICAgICAgICAgICAgICAgIHBwYXRoLT5wcm9wVmFsdWUoaSkpOwotICAgICAgICBpZiAocHBhdGgtPnByb3BJc051bWJlcihpKSkKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICArIFBST1BFUlRZICVzICVnICIsIHBwYXRoLT5wcm9wTmFtZShpKSwKLSAgICAgICAgICAgICAgICAgICBwcGF0aC0+cHJvcE51bWJlcihpKSk7Ci0gICAgICAgIC8vIEJYIDE4MDkxMCByZWFkIExFRiBpc3N1ZSAobm8gaGVscCkKLSAgICAgICAgc3dpdGNoIChwcGF0aC0+cHJvcFR5cGUoaSkpIHsKLSAgICAgICAgICAgY2FzZSAnUic6IGZwcmludGYoZm91dCwgIlJFQUwgIik7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgY2FzZSAnSSc6IGZwcmludGYoZm91dCwgIklOVEVHRVIgIik7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgY2FzZSAnUyc6IGZwcmludGYoZm91dCwgIlNUUklORyAiKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICBjYXNlICdRJzogZnByaW50Zihmb3V0LCAiUVVPVEVTVFJJTkcgIik7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgY2FzZSAnTic6IGZwcmludGYoZm91dCwgIk5VTUJFUiAiKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgfQotICB9Ci0KLSAgLy8gU0hJRUxECi0gIGNvdW50ID0gMDsKLSAgLy8gdGVzdGluZyB0aGUgU0hJRUxEIGZvciA1LjMsIG9ic29sZXRlIGluIDUuNAotICBpZiAocHBhdGgtPm51bVNoaWVsZHMoKSkgewotICAgIGZvciAoaSA9IDA7IGkgPCBwcGF0aC0+bnVtU2hpZWxkcygpOyBpKyspIHsKLSAgICAgICBzaGllbGQgPSBwcGF0aC0+c2hpZWxkKGkpOwotICAgICAgIGZwcmludGYoZm91dCwgIlxuICArIFNISUVMRCAlcyAiLCBzaGllbGQtPnNoaWVsZE5hbWUoKSk7Ci0gICAgICAgbmV3TGF5ZXIgPSAwOwotICAgICAgIGZvciAoaiA9IDA7IGogPCBzaGllbGQtPm51bVBhdGhzKCk7IGorKykgewotICAgICAgICAgIHAgPSBzaGllbGQtPnBhdGgoaik7Ci0gICAgICAgICAgcC0+aW5pdFRyYXZlcnNlKCk7Ci0gICAgICAgICAgd2hpbGUgKChwYXRoID0gKGludClwLT5uZXh0KCkpICE9IERFRklQQVRIX0RPTkUpIHsKLSAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgIC8vIERvbid0IHdhbnQgdGhlIGxpbmUgdG8gYmUgdG9vIGxvbmcKLSAgICAgICAgICAgICBpZiAoY291bnQgPj0gNSkgewotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgICAgICAgICBjb3VudCA9IDA7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIHN3aXRjaCAocGF0aCkgewotICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9MQVlFUjoKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0xheWVyID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzICIsIHAtPmdldExheWVyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGF5ZXIgPSAxOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIk5FVyAlcyAiLCBwLT5nZXRMYXllcigpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1ZJQToKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgaWdub3JlVmlhTmFtZXMgPyAiWFhYIiA6IHAtPmdldFZpYSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1ZJQVJPVEFUSU9OOgotICAgICAgICAgICAgICAgICAgICBpZiAobmV3TGF5ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50U3RyKHAtPmdldFZpYVJvdGF0aW9uKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJTdHIgJXMgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRWaWFSb3RhdGlvblN0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1dJRFRIOgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlZCAiLCBwLT5nZXRXaWR0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICBjYXNlIERFRklQQVRIX01BU0s6Ci0gICAgICAgIGZwcmludGYoZm91dCwgIk1BU0sgJWQgIiwgcC0+Z2V0TWFzaygpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1ZJQU1BU0s6Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIk1BU0sgJWQlZCVkICIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmdldFZpYVRvcE1hc2soKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+Z2V0VmlhQ3V0TWFzaygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmdldFZpYUJvdHRvbU1hc2soKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9QT0lOVDoKLSAgICAgICAgICAgICAgICAgICAgcC0+Z2V0UG9pbnQoJngsICZ5KTsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKCAlZCAlZCApICIsIHgsIHkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfRkxVU0hQT0lOVDoKLSAgICAgICAgICAgICAgICAgICAgcC0+Z2V0Rmx1c2hQb2ludCgmeCwgJnksICZ6KTsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKCAlZCAlZCAlZCApICIsIHgsIHksIHopOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfVEFQRVI6Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlRBUEVSICIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfU0hBUEU6Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgU0hBUEUgJXMgIiwgcC0+Z2V0U2hhcGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9TVFlMRToKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBTVFlMRSAlZCAiLCBwLT5nZXRTdHlsZSgpKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBsYXllck5hbWUgd2lkdGgKLSAgaWYgKHBwYXRoLT5oYXNXaWR0aFJ1bGVzKCkpIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgcHBhdGgtPm51bVdpZHRoUnVsZXMoKTsgaSsrKSB7Ci0gICAgICAgIHBwYXRoLT53aWR0aFJ1bGUoaSwgJmxheWVyTmFtZSwgJmRpc3QpOwotICAgICAgICBmcHJpbnRmIChmb3V0LCAiXG4gICsgV0lEVEggJXMgJWcgIiwgbGF5ZXJOYW1lLCBkaXN0KTsKLSAgICB9Ci0gIH0KLQotICAvLyBsYXllck5hbWUgc3BhY2luZwotICBpZiAocHBhdGgtPmhhc1NwYWNpbmdSdWxlcygpKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IHBwYXRoLT5udW1TcGFjaW5nUnVsZXMoKTsgaSsrKSB7Ci0gICAgICAgIHBwYXRoLT5zcGFjaW5nUnVsZShpLCAmbGF5ZXJOYW1lLCAmZGlzdCwgJmxlZnQsICZyaWdodCk7Ci0gICAgICAgIGlmIChsZWZ0ID09IHJpZ2h0KQotICAgICAgICAgICAgZnByaW50ZiAoZm91dCwgIlxuICArIFNQQUNJTkcgJXMgJWcgIiwgbGF5ZXJOYW1lLCBkaXN0KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZnByaW50ZiAoZm91dCwgIlxuICArIFNQQUNJTkcgJXMgJWcgUkFOR0UgJWcgJWcgIiwKLSAgICAgICAgICAgICAgICAgICAgIGxheWVyTmFtZSwgZGlzdCwgbGVmdCwgcmlnaHQpOwotICAgIH0KLSAgfQotCi0gIGlmIChwcGF0aC0+aGFzRml4ZWRidW1wKCkpCi0gICAgZnByaW50Zihmb3V0LCAiXG4gICsgRklYRURCVU1QICIpOwotICBpZiAocHBhdGgtPmhhc0ZyZXF1ZW5jeSgpKQotICAgIGZwcmludGYoZm91dCwgIlxuICArIEZSRVFVRU5DWSAlZyAiLCBwcGF0aC0+ZnJlcXVlbmN5KCkpOwotICBpZiAocHBhdGgtPmhhc1ZvbHRhZ2UoKSkKLSAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBWT0xUQUdFICVnICIsIHBwYXRoLT52b2x0YWdlKCkpOwotICBpZiAocHBhdGgtPmhhc1dlaWdodCgpKQotICAgIGZwcmludGYoZm91dCwgIlxuICArIFdFSUdIVCAlZCAiLCBwcGF0aC0+d2VpZ2h0KCkpOwotICBpZiAocHBhdGgtPmhhc0NhcCgpKQotICAgIGZwcmludGYoZm91dCwgIlxuICArIEVTVENBUCAlZyAiLCBwcGF0aC0+Y2FwKCkpOwotICBpZiAocHBhdGgtPmhhc1NvdXJjZSgpKQotICAgIGZwcmludGYoZm91dCwgIlxuICArIFNPVVJDRSAlcyAiLCBwcGF0aC0+c291cmNlKCkpOwotICBpZiAocHBhdGgtPmhhc1BhdHRlcm4oKSkKLSAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBQQVRURVJOICVzICIsIHBwYXRoLT5wYXR0ZXJuKCkpOwotICBpZiAocHBhdGgtPmhhc09yaWdpbmFsKCkpCi0gICAgZnByaW50Zihmb3V0LCAiXG4gICsgT1JJR0lOQUwgJXMgIiwgcHBhdGgtPm9yaWdpbmFsKCkpOwotICBpZiAocHBhdGgtPmhhc1VzZSgpKQotICAgIGZwcmludGYoZm91dCwgIlxuICArIFVTRSAlcyAiLCBwcGF0aC0+dXNlKCkpOwotCi0gIGZwcmludGYoZm91dCwgIlxuIik7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotaW50IHNuZXR3aXJlKGRlZnJDYWxsYmFja1R5cGVfZSBjLCBkZWZpTmV0KiBwcGF0aCwgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGludCAgICAgICAgIGksIGosIHgsIHksIHosIGNvdW50ID0gMCwgbmV3TGF5ZXI7Ci0gIGRlZmlQYXRoKiAgIHA7Ci0gIGludCAgICAgICAgIHBhdGg7Ci0gIGRlZmlXaXJlKiAgIHdpcmU7Ci0gIGRlZmlTaGllbGQqIHNoaWVsZDsKLSAgaW50ICAgICAgICAgbnVtWCwgbnVtWSwgc3RlcFgsIHN0ZXBZOwotCi0gIGlmIChjICE9IGRlZnJTTmV0V2lyZUNia1R5cGUpCi0gICAgICByZXR1cm4gMTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLQotICAvLyBMVyBibG9jawotICAvL2ZwcmludGYgKGZvdXQsICJTUEVDSUFMTkVUIHdpcmUgZGF0YVxuIik7Ci0KLSAgZnByaW50Zihmb3V0LCAiLSAlcyAiLCBwcGF0aC0+bmFtZSgpKTsKLQotICAvLyBQT0xZR09OCi0gIGlmIChwcGF0aC0+bnVtUG9seWdvbnMoKSkgewotICBzdHJ1Y3QgZGVmaVBvaW50cyBwb2ludHM7Ci0gIGZvciAoaSA9IDA7IGkgPCBwcGF0aC0+bnVtUG9seWdvbnMoKTsgaSsrKSB7Ci0gICAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBQT0xZR09OICVzICIsIHBwYXRoLT5wb2x5Z29uTmFtZShpKSk7Ci0KLSAgICAgIHBvaW50cyA9IHBwYXRoLT5nZXRQb2x5Z29uKGkpOwotCi0gICAgICBmb3IgKGogPSAwOyBqIDwgcG9pbnRzLm51bVBvaW50czsgaisrKSB7Ci0gICAgZnByaW50Zihmb3V0LCAiJWQgJWQgIiwgcG9pbnRzLnhbal0sIHBvaW50cy55W2pdKTsKLSAgICAgIH0KLSAgfQotICAvLyBSRUNUCi0gIH0gCi0gIGlmIChwcGF0aC0+bnVtUmVjdGFuZ2xlcygpKSB7Ci0gIGZvciAoaSA9IDA7IGkgPCBwcGF0aC0+bnVtUmVjdGFuZ2xlcygpOyBpKyspIHsKLSAgICAgIGZwcmludGYoZm91dCwgIlxuICArIFJFQ1QgJXMgJWQgJWQgJWQgJWQiLCBwcGF0aC0+cmVjdE5hbWUoaSksCi0gICAgICAgICAgICBwcGF0aC0+eGwoaSksIHBwYXRoLT55bChpKSwKLSAgICAgICAgICAgIHBwYXRoLT54aChpKSwgcHBhdGgtPnloKGkpKTsKLSAgfQotICB9Ci0gIC8vIFZJQQotICBpZiAocHBhdGgtPm51bVZpYVNwZWNzKCkpIHsKLSAgZm9yIChpID0gMDsgaSA8IHBwYXRoLT5udW1WaWFTcGVjcygpOyBpKyspIHsKLSAgICAgIGZwcmludGYoZm91dCwgIlxuICArIFZJQSAlcyAiLCBwcGF0aC0+dmlhTmFtZShpKSksCi0gICAgICBmcHJpbnRmKGZvdXQsICIgJXMiLCBwcGF0aC0+dmlhT3JpZW50U3RyKGkpKTsKLQotICAgICAgZGVmaVBvaW50cyBwb2ludHMgPSBwcGF0aC0+Z2V0VmlhUHRzKGkpOwotCi0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IHBvaW50cy5udW1Qb2ludHM7IGorKykgewotICAgIGZwcmludGYoZm91dCwgIiAlZCAlZCIsIHBvaW50cy54W2pdLCBwb2ludHMueVtqXSk7Ci0gICAgICB9Ci0gIH0KLSAgfQotCi0gIC8vIHNwZWNpYWxXaXJpbmcKLSAgaWYgKHBwYXRoLT5udW1XaXJlcygpKSB7Ci0gICAgIG5ld0xheWVyID0gMDsKLSAgICAgZm9yIChpID0gMDsgaSA8IHBwYXRoLT5udW1XaXJlcygpOyBpKyspIHsKLSAgICAgICAgbmV3TGF5ZXIgPSAwOwotICAgICAgICB3aXJlID0gcHBhdGgtPndpcmUoaSk7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIlxuICArICVzICIsIHdpcmUtPndpcmVUeXBlKCkpOwotICAgICAgICBpZiAoc3RyY21wICh3aXJlLT53aXJlVHlwZSgpLCAiU0hJRUxEIikgPT0gMCkKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgd2lyZS0+d2lyZVNoaWVsZE5ldE5hbWUoKSk7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCB3aXJlLT5udW1QYXRocygpOyBqKyspIHsKLSAgICAgICAgICAgcCA9IHdpcmUtPnBhdGgoaik7Ci0gICAgICAgICAgIHAtPmluaXRUcmF2ZXJzZSgpOwotICAgICAgICAgICB3aGlsZSAoKHBhdGggPSAoaW50KXAtPm5leHQoKSkgIT0gREVGSVBBVEhfRE9ORSkgewotICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAvLyBEb24ndCB3YW50IHRoZSBsaW5lIHRvIGJlIHRvbyBsb25nCi0gICAgICAgICAgICAgIGlmIChjb3VudCA+PSA1KSB7Ci0gICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgICAgICAgICAgY291bnQgPSAwOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIHN3aXRjaCAocGF0aCkgewotICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfTEFZRVI6Ci0gICAgICAgICAgICAgICAgICAgICBpZiAobmV3TGF5ZXIgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzICIsIHAtPmdldExheWVyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xheWVyID0gMTsKLSAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIk5FVyAlcyAiLCBwLT5nZXRMYXllcigpKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfVklBOgotICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgaWdub3JlVmlhTmFtZXMgPyAiWFhYIiA6IHAtPmdldFZpYSgpKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfVklBUk9UQVRJT046Ci0gICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRTdHIocC0+Z2V0VmlhUm90YXRpb24oKSkpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9WSUFEQVRBOgotICAgICAgICAgICAgICAgICAgICAgcC0+Z2V0VmlhRGF0YSgmbnVtWCwgJm51bVksICZzdGVwWCwgJnN0ZXBZKTsKLSAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkRPICVkIEJZICVkIFNURVAgJWQgJWQgIiwgbnVtWCwgbnVtWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFgsIHN0ZXBZKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfV0lEVEg6Ci0gICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlZCAiLCBwLT5nZXRXaWR0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgREVGSVBBVEhfTUFTSzoKLSAgICAgICAgIGZwcmludGYoZm91dCwgIk1BU0sgJWQgIiwgcC0+Z2V0TWFzaygpKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfVklBTUFTSzoKLSAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIk1BU0sgJWQlZCVkICIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRWaWFUb3BNYXNrKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRWaWFDdXRNYXNrKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmdldFZpYUJvdHRvbU1hc2soKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfUE9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgICBwLT5nZXRQb2ludCgmeCwgJnkpOwotICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKCAlZCAlZCApICIsIHgsIHkpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9GTFVTSFBPSU5UOgotICAgICAgICAgICAgICAgICAgICAgcC0+Z2V0Rmx1c2hQb2ludCgmeCwgJnksICZ6KTsKLSAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiggJWQgJWQgJWQgKSAiLCB4LCB5LCB6KTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfVEFQRVI6Ci0gICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJUQVBFUiAiKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfU0hBUEU6Ci0gICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIFNIQVBFICVzICIsIHAtPmdldFNoYXBlKCkpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9TVFlMRToKLSAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgU1RZTEUgJWQgIiwgcC0+Z2V0U3R5bGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgY291bnQgPSAwOwotICAgICB9Ci0gIH0gZWxzZSBpZiAocHBhdGgtPm51bVNoaWVsZHMoKSkgewotICAgIGZvciAoaSA9IDA7IGkgPCBwcGF0aC0+bnVtU2hpZWxkcygpOyBpKyspIHsKLSAgICAgICBzaGllbGQgPSBwcGF0aC0+c2hpZWxkKGkpOwotICAgICAgIGZwcmludGYoZm91dCwgIlxuICArIFNISUVMRCAlcyAiLCBzaGllbGQtPnNoaWVsZE5hbWUoKSk7Ci0gICAgICAgbmV3TGF5ZXIgPSAwOwotICAgICAgIGZvciAoaiA9IDA7IGogPCBzaGllbGQtPm51bVBhdGhzKCk7IGorKykgewotICAgICAgICAgIHAgPSBzaGllbGQtPnBhdGgoaik7Ci0gICAgICAgICAgcC0+aW5pdFRyYXZlcnNlKCk7Ci0gICAgICAgICAgd2hpbGUgKChwYXRoID0gKGludClwLT5uZXh0KCkpICE9IERFRklQQVRIX0RPTkUpIHsKLSAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgIC8vIERvbid0IHdhbnQgdGhlIGxpbmUgdG8gYmUgdG9vIGxvbmcKLSAgICAgICAgICAgICBpZiAoY291bnQgPj0gNSkgewotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgICAgICAgICBjb3VudCA9IDA7Ci0gICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICBzd2l0Y2ggKHBhdGgpIHsKLSAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfTEFZRVI6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXdMYXllciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAiLCBwLT5nZXRMYXllcigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xheWVyID0gMTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJORVcgJXMgIiwgcC0+Z2V0TGF5ZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9WSUE6Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzICIsIGlnbm9yZVZpYU5hbWVzID8gIlhYWCIgOiBwLT5nZXRWaWEoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9WSUFST1RBVElPTjoKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50U3RyKHAtPmdldFZpYVJvdGF0aW9uKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1dJRFRIOgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlZCAiLCBwLT5nZXRXaWR0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICBjYXNlIERFRklQQVRIX01BU0s6Ci0gICAgICAgIGZwcmludGYoZm91dCwgIk1BU0sgJWQgIiwgcC0+Z2V0TWFzaygpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1ZJQU1BU0s6Ci0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTUFTSyAlZCVkJWQgIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRWaWFUb3BNYXNrKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+Z2V0VmlhQ3V0TWFzaygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+Z2V0VmlhQm90dG9tTWFzaygpKTsKLSAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfUE9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgIHAtPmdldFBvaW50KCZ4LCAmeSk7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiggJWQgJWQgKSAiLCB4LCB5KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX0ZMVVNIUE9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgIHAtPmdldEZsdXNoUG9pbnQoJngsICZ5LCAmeik7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiggJWQgJWQgJWQgKSAiLCB4LCB5LCB6KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1RBUEVSOgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJUQVBFUiAiKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1NIQVBFOgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIFNIQVBFICVzICIsIHAtPmdldFNoYXBlKCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfU1RZTEU6Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgU1RZTEUgJWQgIiwgcC0+Z2V0U3R5bGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgfQotICAgIH0gCi0gIH0KLQotICBmcHJpbnRmKGZvdXQsICJcbiIpOwotCi0gIHJldHVybiAwOwotfQotCi1pbnQgc25ldGYoZGVmckNhbGxiYWNrVHlwZV9lIGMsIGRlZmlOZXQqIG5ldCwgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIC8vIEZvciBuZXQgYW5kIHNwZWNpYWwgbmV0LgotICBpbnQgICAgICAgICBpLCBqLCB4LCB5LCB6LCBjb3VudCwgbmV3TGF5ZXI7Ci0gIGNoYXIqICAgICAgIGxheWVyTmFtZTsKLSAgZG91YmxlICAgICAgZGlzdCwgbGVmdCwgcmlnaHQ7Ci0gIGRlZmlQYXRoKiAgIHA7Ci0gIGRlZmlTdWJuZXQgICpzOwotICBpbnQgICAgICAgICBwYXRoOwotICBkZWZpU2hpZWxkKiBzaGllbGQ7Ci0gIGRlZmlXaXJlKiAgIHdpcmU7Ci0gIGludCAgICAgICAgIG51bVgsIG51bVksIHN0ZXBYLCBzdGVwWTsKLQotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGlmIChjICE9IGRlZnJTTmV0Q2JrVHlwZSkKLSAgICAgIGZwcmludGYoZm91dCwgIkJPR1VTIE5FVCBUWVBFICAiKTsKLQotLy8gNS82LzIwMDQgLSBkb24ndCBuZWVkIHNpbmNlIEkgaGF2ZSBhIGNhbGxiYWNrIGZvciB0aGUgbmFtZQotLy8gIGZwcmludGYoZm91dCwgIi0gJXMgIiwgbmV0LT5uYW1lKCkpOwotCi0gIGNvdW50ID0gMDsKLSAgLy8gY29tcE5hbWUgJiBwaW5OYW1lCi0gIGZvciAoaSA9IDA7IGkgPCBuZXQtPm51bUNvbm5lY3Rpb25zKCk7IGkrKykgewotICAgICAgLy8gc2V0IHRoZSBsaW1pdCBvZiBvbmx5IDUgaXRlbXMgcHJpbnQgb3V0IGluIG9uZSBsaW5lCi0gICAgICBjb3VudCsrOwotICAgICAgaWYgKGNvdW50ID49IDUpIHsKLSAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgIGNvdW50ID0gMDsKLSAgICAgIH0KLSAgICAgIGZwcmludGYgKGZvdXQsICIoICVzICVzICkgIiwgbmV0LT5pbnN0YW5jZShpKSwKLSAgICAgICAgICAgICAgIG5ldC0+cGluKGkpKTsKLSAgICAgIGlmIChuZXQtPnBpbklzU3ludGhlc2l6ZWQoaSkpCi0gICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBTWU5USEVTSVpFRCAiKTsKLSAgfQotCi0gIC8vIHNwZWNpYWxXaXJpbmcKLSAgaWYgKG5ldC0+bnVtV2lyZXMoKSkgewotICAgICBuZXdMYXllciA9IDA7Ci0gICAgIGZvciAoaSA9IDA7IGkgPCBuZXQtPm51bVdpcmVzKCk7IGkrKykgewotICAgICAgICBuZXdMYXllciA9IDA7Ci0gICAgICAgIHdpcmUgPSBuZXQtPndpcmUoaSk7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIlxuICArICVzICIsIHdpcmUtPndpcmVUeXBlKCkpOwotICAgICAgICBpZiAoc3RyY21wICh3aXJlLT53aXJlVHlwZSgpLCAiU0hJRUxEIikgPT0gMCkKLSAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgd2lyZS0+d2lyZVNoaWVsZE5ldE5hbWUoKSk7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCB3aXJlLT5udW1QYXRocygpOyBqKyspIHsKLSAgICAgICAgICAgIHAgPSB3aXJlLT5wYXRoKGopOwotICAgICAgICAgICAgcC0+aW5pdFRyYXZlcnNlKCk7Ci0gICAgICAgICAgICBpZiAodGVzdERlYnVnUHJpbnQpIHsKLSAgICAgICAgICAgICAgICBwLT5wcmludChmb3V0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKChwYXRoID0gKGludClwLT5uZXh0KCkpICE9IERFRklQQVRIX0RPTkUpIHsKLSAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAvLyBEb24ndCB3YW50IHRoZSBsaW5lIHRvIGJlIHRvbyBsb25nCi0gICAgICAgICAgICAgICAgICAvL2lmIChjb3VudCA+PSA1KSB7Ci0gICAgICAgICAgICAgICAgICAvLyAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgICAgICAgICAgLy8gICAgY291bnQgPSAwOwotICAgICAgICAgICAgICAgICAgLy99Ci0gICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBhdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9MQVlFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3TGF5ZXIgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAiLCBwLT5nZXRMYXllcigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGF5ZXIgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMVyBtb2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9mcHJpbnRmKGZvdXQsICJORVcgJXMgIiwgcC0+Z2V0TGF5ZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuICAgIE5FVyAlcyAiLCBwLT5nZXRMYXllcigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9WSUE6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgaWdub3JlVmlhTmFtZXMgPyAiWFhYIiA6IHAtPmdldFZpYSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9WSUFST1RBVElPTjoKLSAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudFN0cihwLT5nZXRWaWFSb3RhdGlvbigpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfVklBREFUQToKLSAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRWaWFEYXRhKCZudW1YLCAmbnVtWSwgJnN0ZXBYLCAmc3RlcFkpOwotICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkRPICVkIEJZICVkIFNURVAgJWQgJWQgIiwgbnVtWCwgbnVtWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBYLCBzdGVwWSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfV0lEVEg6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJWQgIiwgcC0+Z2V0V2lkdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfTUFTSzoKLSAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJNQVNLICVkICIsIHAtPmdldE1hc2soKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfVklBTUFTSzoKLSAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJNQVNLICVkJWQlZCAiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmdldFZpYVRvcE1hc2soKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRWaWFDdXRNYXNrKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRWaWFCb3R0b21NYXNrKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfUE9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcC0+Z2V0UG9pbnQoJngsICZ5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIoICVkICVkICkgIiwgeCwgeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfRkxVU0hQT0lOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICBwLT5nZXRGbHVzaFBvaW50KCZ4LCAmeSwgJnopOwotICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiggJWQgJWQgJWQgKSAiLCB4LCB5LCB6KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9UQVBFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJUQVBFUiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9TSEFQRToKLSAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIFNIQVBFICVzICIsIHAtPmdldFNoYXBlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1NUWUxFOgotICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgU1RZTEUgJWQgIiwgcC0+Z2V0U3R5bGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy9mcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICBjb3VudCA9IDA7Ci0gICAgIH0KLSAgfQotCi0gIC8vIFBPTFlHT04KLSAgaWYgKG5ldC0+bnVtUG9seWdvbnMoKSkgewotICAgIHN0cnVjdCBkZWZpUG9pbnRzIHBvaW50czsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBuZXQtPm51bVBvbHlnb25zKCk7IGkrKykgewotICAgICAgaWYgKGN1clZlciA+PSA1LjggKSB7Ci0gICBpZiAoc3RyY21wKG5ldC0+cG9seVJvdXRlU3RhdHVzKGkpLCAiIikgIT0gMCkgewotICAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyAlcyAiLCBuZXQtPnBvbHlSb3V0ZVN0YXR1cyhpKSk7Ci0gICAgIGlmIChzdHJjbXAobmV0LT5wb2x5Um91dGVTdGF0dXMoaSksICJTSElFTEQiKSA9PSAwKSB7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIlxuICArICVzICIsIG5ldC0+cG9seVJvdXRlU3RhdHVzU2hpZWxkTmFtZShpKSk7Ci0gICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIGlmIChzdHJjbXAobmV0LT5wb2x5U2hhcGVUeXBlKGkpLCAiIikgIT0gMCkgewotICAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBTSEFQRSAlcyAiLCBuZXQtPnBvbHlTaGFwZVR5cGUoaSkpOwotICAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKG5ldC0+cG9seU1hc2soaSkpIHsKLSAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBNQVNLICVkICsgUE9MWUdPTiAlIHMgIiwgbmV0LT5wb2x5TWFzayhpKSwKLSAgICAgIG5ldC0+cG9seWdvbk5hbWUoaSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBQT0xZR09OICVzICIsIG5ldC0+cG9seWdvbk5hbWUoaSkpOwotICAgICAgfQotICAgICAgcG9pbnRzID0gbmV0LT5nZXRQb2x5Z29uKGkpOwotICAgICAgZm9yIChqID0gMDsgaiA8IHBvaW50cy5udW1Qb2ludHM7IGorKykKLSAgICAgICAgZnByaW50Zihmb3V0LCAiJWQgJWQgIiwgcG9pbnRzLnhbal0sIHBvaW50cy55W2pdKTsKLSAgICB9Ci0gIH0KLSAgLy8gUkVDVAotICBpZiAobmV0LT5udW1SZWN0YW5nbGVzKCkpIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbmV0LT5udW1SZWN0YW5nbGVzKCk7IGkrKykgewotICAgICAgaWYgKGN1clZlciA+PSA1LjggKSB7Ci0gICAgICAgIGlmIChzdHJjbXAobmV0LT5yZWN0Um91dGVTdGF0dXMoaSksICIiKSAhPSAwKSB7Ci0gICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4gICsgJXMgIiwgbmV0LT5yZWN0Um91dGVTdGF0dXMoaSkpOwotICAgICAgICAgIGlmIChzdHJjbXAobmV0LT5yZWN0Um91dGVTdGF0dXMoaSksICJTSElFTEQiKSA9PSAwKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyAlcyAiLCBuZXQtPnJlY3RSb3V0ZVN0YXR1c1NoaWVsZE5hbWUoaSkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc3RyY21wKG5ldC0+cmVjdFNoYXBlVHlwZShpKSwgIiIpICE9IDApIHsKLSAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBTSEFQRSAlcyAiLCBuZXQtPnJlY3RTaGFwZVR5cGUoaSkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobmV0LT5yZWN0TWFzayhpKSkgewotICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBNQVNLICVkICsgUkVDVCAlcyAlZCAlZCAlZCAlZCIsIAotICAgICAgICAgICAgICAgIG5ldC0+cmVjdE1hc2soaSksIG5ldC0+cmVjdE5hbWUoaSksIG5ldC0+eGwoaSksIAotICAgICAgICAgICAgICAgIG5ldC0+eWwoaSksIG5ldC0+eGgoaSksIG5ldC0+eWgoaSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiXG4gICsgUkVDVCAlcyAlZCAlZCAlZCAlZCIsIAotICAgICAgICAgICAgICAgIG5ldC0+cmVjdE5hbWUoaSksIG5ldC0+eGwoaSksIAotICAgICAgICAgICAgICAgIG5ldC0+eWwoaSksIAotICAgICAgICAgICAgICAgIG5ldC0+eGgoaSksCi0gICAgICAgICAgICAgICAgbmV0LT55aChpKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIC8vIFZJQQotICBpZiAoY3VyVmVyID49IDUuOCAmJiBuZXQtPm51bVZpYVNwZWNzKCkpIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbmV0LT5udW1WaWFTcGVjcygpOyBpKyspIHsKLSAgICAgIGlmIChzdHJjbXAobmV0LT52aWFSb3V0ZVN0YXR1cyhpKSwgIiIpICE9IDApIHsKLSAgICAgICAgZnByaW50Zihmb3V0LCAiXG4gICsgJXMgIiwgbmV0LT52aWFSb3V0ZVN0YXR1cyhpKSk7Ci0gICAgICAgIGlmIChzdHJjbXAobmV0LT52aWFSb3V0ZVN0YXR1cyhpKSwgIlNISUVMRCIpID09IDApIHsKLSAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyAlcyAiLCBuZXQtPnZpYVJvdXRlU3RhdHVzU2hpZWxkTmFtZShpKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChzdHJjbXAobmV0LT52aWFTaGFwZVR5cGUoaSksICIiKSAhPSAwKSB7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIlxuICArIFNIQVBFICVzICIsIG5ldC0+dmlhU2hhcGVUeXBlKGkpKTsKLSAgICAgIH0KLSAgICAgIGlmIChuZXQtPnRvcE1hc2tOdW0oaSkgfHwgbmV0LT5jdXRNYXNrTnVtKGkpIHx8IG5ldC0+Ym90dG9tTWFza051bShpKSkgewotICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBNQVNLICVkJWQlZCArIFZJQSAlcyAiLCBuZXQtPnRvcE1hc2tOdW0oaSksIAotICAgICAgICAgICAgICAgIG5ldC0+Y3V0TWFza051bShpKSwKLSAgICAgICAgICAgICAgICBuZXQtPmJvdHRvbU1hc2tOdW0oaSksCi0gICAgICAgICAgICAgICAgbmV0LT52aWFOYW1lKGkpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYoZm91dCwgIlxuICArIFZJQSAlcyAiLCBuZXQtPnZpYU5hbWUoaSkpOwotICAgICAgfQotICAgICAgZnByaW50Zihmb3V0LCAiICVzIiwgbmV0LT52aWFPcmllbnRTdHIoaSkpOwotICAgICAgCi0gICAgICBkZWZpUG9pbnRzIHBvaW50cyA9IG5ldC0+Z2V0VmlhUHRzKGkpOwotCi0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IHBvaW50cy5udW1Qb2ludHM7IGorKykgewotICAgICAgICBmcHJpbnRmKGZvdXQsICIgJWQgJWQiLCBwb2ludHMueFtqXSwgcG9pbnRzLnlbal0pOwotICAgICAgfQotICAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7IAotICAgIH0KLSAgfQotCi0gIGlmIChuZXQtPmhhc1N1Ym5ldHMoKSkgewotICAgIGZvciAoaSA9IDA7IGkgPCBuZXQtPm51bVN1Ym5ldHMoKTsgaSsrKSB7Ci0gICAgICBzID0gbmV0LT5zdWJuZXQoaSk7Ci0gICAgICBpZiAocy0+bnVtQ29ubmVjdGlvbnMoKSkgewotICAgICAgICAgIGlmIChzLT5waW5Jc011c3RKb2luKDApKQotICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICItIE1VU1RKT0lOICIpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiLSAlcyAiLCBzLT5uYW1lKCkpOwotICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzLT5udW1Db25uZWN0aW9ucygpOyBqKyspIHsKLSAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICggJXMgJXMgKVxuIiwgcy0+aW5zdGFuY2UoaiksCi0gICAgICAgICAgICAgICAgICAgICAgcy0+cGluKGopKTsKLSAgICAgICAgfQotICAgICAgfQotIAotICAgICAgLy8gcmVndWxhcldpcmluZwotICAgICAgaWYgKHMtPm51bVdpcmVzKCkpIHsKLSAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5udW1XaXJlcygpOyBpKyspIHsKLSAgICAgICAgICAgIHdpcmUgPSBzLT53aXJlKGkpOwotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICArICVzICIsIHdpcmUtPndpcmVUeXBlKCkpOwotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpcmUtPm51bVBhdGhzKCk7IGorKykgewotICAgICAgICAgICAgICBwID0gd2lyZS0+cGF0aChqKTsKLSAgICAgICAgICAgICAgcC0+cHJpbnQoZm91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKG5ldC0+bnVtUHJvcHMoKSkgewotICAgIGZvciAoaSA9IDA7IGkgPCBuZXQtPm51bVByb3BzKCk7IGkrKykgewotICAgICAgICBpZiAobmV0LT5wcm9wSXNTdHJpbmcoaSkpCi0gICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgKyBQUk9QRVJUWSAlcyAlcyAiLCBuZXQtPnByb3BOYW1lKGkpLAotICAgICAgICAgICAgICAgICAgIG5ldC0+cHJvcFZhbHVlKGkpKTsKLSAgICAgICAgaWYgKG5ldC0+cHJvcElzTnVtYmVyKGkpKQotICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICsgUFJPUEVSVFkgJXMgJWcgIiwgbmV0LT5wcm9wTmFtZShpKSwKLSAgICAgICAgICAgICAgICAgICBuZXQtPnByb3BOdW1iZXIoaSkpOwotICAgICAgICAvLyBzd2l0Y2ggKG5ldC0+cHJvcFR5cGUoaSkpIHsKLSAgICAgICAgLy8gICAgY2FzZSAnUic6IGZwcmludGYoZm91dCwgIlJFQUwgIik7Ci0gICAgICAgIC8vICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgLy8gICAgY2FzZSAnSSc6IGZwcmludGYoZm91dCwgIklOVEVHRVIgIik7Ci0gICAgICAgIC8vICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgLy8gICAgY2FzZSAnUyc6IGZwcmludGYoZm91dCwgIlNUUklORyAiKTsKLSAgICAgICAgLy8gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAvLyAgICBjYXNlICdRJzogZnByaW50Zihmb3V0LCAiUVVPVEVTVFJJTkcgIik7Ci0gICAgICAgIC8vICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgLy8gICAgY2FzZSAnTic6IGZwcmludGYoZm91dCwgIk5VTUJFUiAiKTsKLSAgICAgICAgLy8gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAvLyB9Ci0gICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgfQotICB9Ci0KLSAgLy8gU0hJRUxECi0gIGNvdW50ID0gMDsKLSAgLy8gdGVzdGluZyB0aGUgU0hJRUxEIGZvciA1LjMsIG9ic29sZXRlIGluIDUuNAotICBpZiAobmV0LT5udW1TaGllbGRzKCkpIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbmV0LT5udW1TaGllbGRzKCk7IGkrKykgewotICAgICAgIHNoaWVsZCA9IG5ldC0+c2hpZWxkKGkpOwotICAgICAgIGZwcmludGYoZm91dCwgIlxuICArIFNISUVMRCAlcyAiLCBzaGllbGQtPnNoaWVsZE5hbWUoKSk7Ci0gICAgICAgbmV3TGF5ZXIgPSAwOwotICAgICAgIGZvciAoaiA9IDA7IGogPCBzaGllbGQtPm51bVBhdGhzKCk7IGorKykgewotICAgICAgICAgIHAgPSBzaGllbGQtPnBhdGgoaik7Ci0gICAgICAgICAgcC0+aW5pdFRyYXZlcnNlKCk7Ci0gICAgICAgICAgd2hpbGUgKChwYXRoID0gKGludClwLT5uZXh0KCkpICE9IERFRklQQVRIX0RPTkUpIHsKLSAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgIC8vIERvbid0IHdhbnQgdGhlIGxpbmUgdG8gYmUgdG9vIGxvbmcKLSAgICAgICAgICAgICBpZiAoY291bnQgPj0gNSkgewotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgICAgICAgICBjb3VudCA9IDA7Ci0gICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICBzd2l0Y2ggKHBhdGgpIHsKLSAgICAgICAgICAgICAgIGNhc2UgREVGSVBBVEhfTEFZRVI6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXdMYXllciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAiLCBwLT5nZXRMYXllcigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xheWVyID0gMTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJORVcgJXMgIiwgcC0+Z2V0TGF5ZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9WSUE6Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzICIsIGlnbm9yZVZpYU5hbWVzID8gIlhYWCIgOiBwLT5nZXRWaWEoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9WSUFST1RBVElPTjoKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50U3RyKHAtPmdldFZpYVJvdGF0aW9uKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1dJRFRIOgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlZCAiLCBwLT5nZXRXaWR0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICBjYXNlIERFRklQQVRIX01BU0s6Ci0gICAgICAgIGZwcmludGYoZm91dCwgIk1BU0sgJWQgIiwgcC0+Z2V0TWFzaygpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1ZJQU1BU0s6Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIk1BU0sgJWQlZCVkICIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmdldFZpYVRvcE1hc2soKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+Z2V0VmlhQ3V0TWFzaygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmdldFZpYUJvdHRvbU1hc2soKSk7Ci0gICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1BPSU5UOgotICAgICAgICAgICAgICAgICAgICBwLT5nZXRQb2ludCgmeCwgJnkpOwotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIoICVkICVkICkgIiwgeCwgeSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9GTFVTSFBPSU5UOgotICAgICAgICAgICAgICAgICAgICBwLT5nZXRGbHVzaFBvaW50KCZ4LCAmeSwgJnopOwotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIoICVkICVkICVkICkgIiwgeCwgeSwgeik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9UQVBFUjoKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiVEFQRVIgIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSBERUZJUEFUSF9TSEFQRToKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBTSEFQRSAlcyAiLCBwLT5nZXRTaGFwZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIERFRklQQVRIX1NUWUxFOgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIFNUWUxFICVkICIsIHAtPmdldFN0eWxlKCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBsYXllck5hbWUgd2lkdGgKLSAgaWYgKG5ldC0+aGFzV2lkdGhSdWxlcygpKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IG5ldC0+bnVtV2lkdGhSdWxlcygpOyBpKyspIHsKLSAgICAgICAgbmV0LT53aWR0aFJ1bGUoaSwgJmxheWVyTmFtZSwgJmRpc3QpOwotICAgICAgICBmcHJpbnRmIChmb3V0LCAiXG4gICsgV0lEVEggJXMgJWcgIiwgbGF5ZXJOYW1lLCBkaXN0KTsKLSAgICB9Ci0gIH0KLQotICAvLyBsYXllck5hbWUgc3BhY2luZwotICBpZiAobmV0LT5oYXNTcGFjaW5nUnVsZXMoKSkgewotICAgIGZvciAoaSA9IDA7IGkgPCBuZXQtPm51bVNwYWNpbmdSdWxlcygpOyBpKyspIHsKLSAgICAgICAgbmV0LT5zcGFjaW5nUnVsZShpLCAmbGF5ZXJOYW1lLCAmZGlzdCwgJmxlZnQsICZyaWdodCk7Ci0gICAgICAgIGlmIChsZWZ0ID09IHJpZ2h0KQotICAgICAgICAgICAgZnByaW50ZiAoZm91dCwgIlxuICArIFNQQUNJTkcgJXMgJWcgIiwgbGF5ZXJOYW1lLCBkaXN0KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZnByaW50ZiAoZm91dCwgIlxuICArIFNQQUNJTkcgJXMgJWcgUkFOR0UgJWcgJWcgIiwKLSAgICAgICAgICAgICAgICAgICAgIGxheWVyTmFtZSwgZGlzdCwgbGVmdCwgcmlnaHQpOwotICAgIH0KLSAgfQotCi0gIGlmIChuZXQtPmhhc0ZpeGVkYnVtcCgpKQotICAgIGZwcmludGYoZm91dCwgIlxuICArIEZJWEVEQlVNUCAiKTsKLSAgaWYgKG5ldC0+aGFzRnJlcXVlbmN5KCkpCi0gICAgZnByaW50Zihmb3V0LCAiXG4gICsgRlJFUVVFTkNZICVnICIsIG5ldC0+ZnJlcXVlbmN5KCkpOwotICBpZiAobmV0LT5oYXNWb2x0YWdlKCkpCi0gICAgZnByaW50Zihmb3V0LCAiXG4gICsgVk9MVEFHRSAlZyAiLCBuZXQtPnZvbHRhZ2UoKSk7Ci0gIGlmIChuZXQtPmhhc1dlaWdodCgpKQotICAgIGZwcmludGYoZm91dCwgIlxuICArIFdFSUdIVCAlZCAiLCBuZXQtPndlaWdodCgpKTsKLSAgaWYgKG5ldC0+aGFzQ2FwKCkpCi0gICAgZnByaW50Zihmb3V0LCAiXG4gICsgRVNUQ0FQICVnICIsIG5ldC0+Y2FwKCkpOwotICBpZiAobmV0LT5oYXNTb3VyY2UoKSkKLSAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBTT1VSQ0UgJXMgIiwgbmV0LT5zb3VyY2UoKSk7Ci0gIGlmIChuZXQtPmhhc1BhdHRlcm4oKSkKLSAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBQQVRURVJOICVzICIsIG5ldC0+cGF0dGVybigpKTsKLSAgaWYgKG5ldC0+aGFzT3JpZ2luYWwoKSkKLSAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBPUklHSU5BTCAlcyAiLCBuZXQtPm9yaWdpbmFsKCkpOwotICBpZiAobmV0LT5oYXNVc2UoKSkKLSAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBVU0UgJXMgIiwgbmV0LT51c2UoKSk7Ci0KLSAgZnByaW50ZiAoZm91dCwgIjtcbiIpOwotICAtLW51bU9ianM7Ci0gIC8vaWYgKG51bU9ianMgPD0gMCkKLSAgLy8gICAgZnByaW50Zihmb3V0LCAiRU5EIFNQRUNJQUxORVRTXG4iKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotaW50IG5kcihkZWZyQ2FsbGJhY2tUeXBlX2UgYywgZGVmaU5vbkRlZmF1bHQqIG5kLCBkZWZpVXNlckRhdGEgdWQpIHsKLSAgLy8gRm9yIG5vbmRlZmF1bHRydWxlCi0gIGludCBpOwotCi0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgaWYgKGMgIT0gZGVmck5vbkRlZmF1bHRDYmtUeXBlKQotICAgICAgZnByaW50Zihmb3V0LCAiQk9HVVMgTk9OREVGQVVMVFJVTEUgVFlQRSAgIik7Ci0gIGZwcmludGYoZm91dCwgIi0gJXNcbiIsIG5kLT5uYW1lKCkpOwotICBpZiAobmQtPmhhc0hhcmRzcGFjaW5nKCkpCi0gICAgICBmcHJpbnRmKGZvdXQsICIgICArIEhBUkRTUEFDSU5HXG4iKTsKLSAgZm9yIChpID0gMDsgaSA8IG5kLT5udW1MYXllcnMoKTsgaSsrKSB7Ci0gICAgZnByaW50Zihmb3V0LCAiICAgKyBMQVlFUiAlcyIsIG5kLT5sYXllck5hbWUoaSkpOwotICAgIGZwcmludGYoZm91dCwgIiBXSURUSCAlZCIsIG5kLT5sYXllcldpZHRoVmFsKGkpKTsKLSAgICBpZiAobmQtPmhhc0xheWVyRGlhZ1dpZHRoKGkpKSAKLSAgICAgIGZwcmludGYoZm91dCwgIiBESUFHV0lEVEggJWQiLAotICAgICAgICAgICAgICBuZC0+bGF5ZXJEaWFnV2lkdGhWYWwoaSkpOwotICAgIGlmIChuZC0+aGFzTGF5ZXJTcGFjaW5nKGkpKSAKLSAgICAgIGZwcmludGYoZm91dCwgIiBTUEFDSU5HICVkIiwgbmQtPmxheWVyU3BhY2luZ1ZhbChpKSk7Ci0gICAgaWYgKG5kLT5oYXNMYXllcldpcmVFeHQoaSkpIAotICAgICAgZnByaW50Zihmb3V0LCAiIFdJUkVFWFQgJWQiLCBuZC0+bGF5ZXJXaXJlRXh0VmFsKGkpKTsKLSAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICB9Ci0gIGZvciAoaSA9IDA7IGkgPCBuZC0+bnVtVmlhcygpOyBpKyspCi0gICAgZnByaW50Zihmb3V0LCAiICAgKyBWSUEgJXNcbiIsIG5kLT52aWFOYW1lKGkpKTsKLSAgZm9yIChpID0gMDsgaSA8IG5kLT5udW1WaWFSdWxlcygpOyBpKyspCi0gICAgZnByaW50Zihmb3V0LCAiICAgKyBWSUFSVUxFICVzXG4iLCBpZ25vcmVWaWFOYW1lcyA/ICJYWFgiIDogbmQtPnZpYVJ1bGVOYW1lKGkpKTsKLSAgZm9yIChpID0gMDsgaSA8IG5kLT5udW1NaW5DdXRzKCk7IGkrKykKLSAgICBmcHJpbnRmKGZvdXQsICIgICArIE1JTkNVVFMgJXMgJWRcbiIsIG5kLT5jdXRMYXllck5hbWUoaSksCi0gICAgICAgICAgICBuZC0+bnVtQ3V0cyhpKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBuZC0+bnVtUHJvcHMoKTsgaSsrKSB7Ci0gICAgZnByaW50Zihmb3V0LCAiICAgKyBQUk9QRVJUWSAlcyAlcyAiLCBuZC0+cHJvcE5hbWUoaSksCi0gICAgICAgICAgICBuZC0+cHJvcFZhbHVlKGkpKTsKLSAgICBzd2l0Y2ggKG5kLT5wcm9wVHlwZShpKSkgewotICAgICAgY2FzZSAnUic6IGZwcmludGYoZm91dCwgIlJFQUxcbiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnSSc6IGZwcmludGYoZm91dCwgIklOVEVHRVJcbiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnUyc6IGZwcmludGYoZm91dCwgIlNUUklOR1xuIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdRJzogZnByaW50Zihmb3V0LCAiUVVPVEVTVFJJTkdcbiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnTic6IGZwcmludGYoZm91dCwgIk5VTUJFUlxuIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIC0tbnVtT2JqczsKLSAgaWYgKG51bU9ianMgPD0gMCkKLSAgICBmcHJpbnRmKGZvdXQsICJFTkQgTk9OREVGQVVMVFJVTEVTXG4iKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludCB0bmFtZShkZWZyQ2FsbGJhY2tUeXBlX2UgYywgY29uc3QgY2hhciogc3RyaW5nLCBkZWZpVXNlckRhdGEgdWQpIHsKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBmcHJpbnRmKGZvdXQsICJURUNITk9MT0dZICVzIDtcbiIsIHN0cmluZyk7Ci0gIHJldHVybiAwOwotfQotCi1pbnQgZG5hbWUoZGVmckNhbGxiYWNrVHlwZV9lIGMsIGNvbnN0IGNoYXIqIHN0cmluZywgZGVmaVVzZXJEYXRhIGRhdGEpIHsKLSAgLy8gc3RkOjpjb3V0IDw8ICJkbmFtZTFcbiI7Ci0gIC8vIGNoZWNrVHlwZShjKTsKLSAgLy8gaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgZnByaW50Zihmb3V0LCAiREVTSUdOICVzIDtcbiIsIHN0cmluZyk7Ci0gIC8vIHN0ZDo6Y291dCA8PCAiZG5hbWUyXG4iOwotICByZXR1cm4gMDsKLX0KLQotCi1jaGFyKiBhZGRyZXNzKGNvbnN0IGNoYXIqIGluKSB7Ci0gIHJldHVybiAoKGNoYXIqKWluKTsKLX0KLQotaW50IGNzKGRlZnJDYWxsYmFja1R5cGVfZSBjLCBpbnQgbnVtLCBkZWZpVXNlckRhdGEgdWQpIHsKLSAgY2hhciogbmFtZTsKLQotICBjaGVja1R5cGUoYyk7Ci0KLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLQotICBzd2l0Y2ggKGMpIHsKLSAgY2FzZSBkZWZyQ29tcG9uZW50U3RhcnRDYmtUeXBlIDogbmFtZSA9IGFkZHJlc3MoIkNPTVBPTkVOVFMiKTsgYnJlYWs7Ci0gIGNhc2UgZGVmck5ldFN0YXJ0Q2JrVHlwZSA6IG5hbWUgPSBhZGRyZXNzKCJORVRTIik7IGJyZWFrOwotICBjYXNlIGRlZnJTdGFydFBpbnNDYmtUeXBlIDogbmFtZSA9IGFkZHJlc3MoIlBJTlMiKTsgYnJlYWs7Ci0gIGNhc2UgZGVmclZpYVN0YXJ0Q2JrVHlwZSA6IG5hbWUgPSBhZGRyZXNzKCJWSUFTIik7IGJyZWFrOwotICBjYXNlIGRlZnJSZWdpb25TdGFydENia1R5cGUgOiBuYW1lID0gYWRkcmVzcygiUkVHSU9OUyIpOyBicmVhazsKLSAgY2FzZSBkZWZyU05ldFN0YXJ0Q2JrVHlwZSA6IG5hbWUgPSBhZGRyZXNzKCJTUEVDSUFMTkVUUyIpOyBicmVhazsKLSAgY2FzZSBkZWZyR3JvdXBzU3RhcnRDYmtUeXBlIDogbmFtZSA9IGFkZHJlc3MoIkdST1VQUyIpOyBicmVhazsKLSAgY2FzZSBkZWZyU2NhbmNoYWluc1N0YXJ0Q2JrVHlwZSA6IG5hbWUgPSBhZGRyZXNzKCJTQ0FOQ0hBSU5TIik7IGJyZWFrOwotICBjYXNlIGRlZnJJT1RpbWluZ3NTdGFydENia1R5cGUgOiBuYW1lID0gYWRkcmVzcygiSU9USU1JTkdTIik7IGJyZWFrOwotICBjYXNlIGRlZnJGUENTdGFydENia1R5cGUgOiBuYW1lID0gYWRkcmVzcygiRkxPT1JQTEFOQ09OU1RSQUlOVFMiKTsgYnJlYWs7Ci0gIGNhc2UgZGVmclRpbWluZ0Rpc2FibGVzU3RhcnRDYmtUeXBlIDogbmFtZSA9IGFkZHJlc3MoIlRJTUlORyBESVNBQkxFUyIpOyBicmVhazsKLSAgY2FzZSBkZWZyUGFydGl0aW9uc1N0YXJ0Q2JrVHlwZSA6IG5hbWUgPSBhZGRyZXNzKCJQQVJUSVRJT05TIik7IGJyZWFrOwotICBjYXNlIGRlZnJQaW5Qcm9wU3RhcnRDYmtUeXBlIDogbmFtZSA9IGFkZHJlc3MoIlBJTlBST1BFUlRJRVMiKTsgYnJlYWs7Ci0gIGNhc2UgZGVmckJsb2NrYWdlU3RhcnRDYmtUeXBlIDogbmFtZSA9IGFkZHJlc3MoIkJMT0NLQUdFUyIpOyBicmVhazsKLSAgY2FzZSBkZWZyU2xvdFN0YXJ0Q2JrVHlwZSA6IG5hbWUgPSBhZGRyZXNzKCJTTE9UUyIpOyBicmVhazsKLSAgY2FzZSBkZWZyRmlsbFN0YXJ0Q2JrVHlwZSA6IG5hbWUgPSBhZGRyZXNzKCJGSUxMUyIpOyBicmVhazsKLSAgY2FzZSBkZWZyTm9uRGVmYXVsdFN0YXJ0Q2JrVHlwZSA6IG5hbWUgPSBhZGRyZXNzKCJOT05ERUZBVUxUUlVMRVMiKTsgYnJlYWs7Ci0gIGNhc2UgZGVmclN0eWxlc1N0YXJ0Q2JrVHlwZSA6IG5hbWUgPSBhZGRyZXNzKCJTVFlMRVMiKTsgYnJlYWs7Ci0gIGRlZmF1bHQgOiBuYW1lID0gYWRkcmVzcygiQk9HVVMiKTsgcmV0dXJuIDE7Ci0gIH0KLSAgZnByaW50Zihmb3V0LCAiXG4lcyAlZCA7XG4iLCBuYW1lLCBudW0pOwotICBudW1PYmpzID0gbnVtOwotICByZXR1cm4gMDsKLX0KLQotaW50IGNvbnN0cmFpbnRzdChkZWZyQ2FsbGJhY2tUeXBlX2UgYywgaW50IG51bSwgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIC8vIEhhbmRsZXMgYm90aCBjb25zdHJhaW50cyBhbmQgYXNzZXJ0aW9ucwotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGlmIChjID09IGRlZnJDb25zdHJhaW50c1N0YXJ0Q2JrVHlwZSkKLSAgICAgIGZwcmludGYoZm91dCwgIlxuQ09OU1RSQUlOVFMgJWQgO1xuXG4iLCBudW0pOwotICBlbHNlCi0gICAgICBmcHJpbnRmKGZvdXQsICJcbkFTU0VSVElPTlMgJWQgO1xuXG4iLCBudW0pOwotICBudW1PYmpzID0gbnVtOwotICByZXR1cm4gMDsKLX0KLQotdm9pZCBvcGVyYW5kKGRlZnJDYWxsYmFja1R5cGVfZSBjLCBkZWZpQXNzZXJ0aW9uKiBhLCBpbnQgaW5kKSB7Ci0gIGludCBpLCBmaXJzdCA9IDE7Ci0gIGNoYXIqIG5ldE5hbWU7Ci0gIGNoYXIqIGZyb21JbnN0LCAqIGZyb21QaW4sICogdG9JbnN0LCAqIHRvUGluOwotCi0gIGlmIChhLT5pc1N1bSgpKSB7Ci0gICAgICAvLyBTdW0gaW4gb3BlcmFuZCwgcmVjdXJzaXZlbHkgY2FsbCBvcGVyYW5kCi0gICAgICBmcHJpbnRmKGZvdXQsICItIFNVTSAoICIpOwotICAgICAgYS0+dW5zZXRTdW0oKTsKLSAgICAgIGlzU3VtU2V0ID0gMTsKLSAgICAgIGJlZ09wZXJhbmQgPSAwOwotICAgICAgb3BlcmFuZCAoYywgYSwgaW5kKTsKLSAgICAgIGZwcmludGYoZm91dCwgIikgIik7Ci0gIH0gZWxzZSB7Ci0gICAgICAvLyBvcGVyYW5kCi0gICAgICBpZiAoaW5kID49IGEtPm51bUl0ZW1zKCkpIHsKLSAgICAgICAgICBmcHJpbnRmKGZvdXQsICJFUlJPUjogd2hlbiB3cml0aW5nIG91dCBTVU0gaW4gQ29uc3RyYWludHMuXG4iKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgfQotICAgICAgaWYgKGJlZ09wZXJhbmQpIHsKLSAgICAgICAgIGZwcmludGYoZm91dCwgIi0gIik7Ci0gICAgICAgICBiZWdPcGVyYW5kID0gMDsKLSAgICAgIH0KLSAgICAgIGZvciAoaSA9IGluZDsgaSA8IGEtPm51bUl0ZW1zKCk7IGkrKykgewotICAgICAgICAgIGlmIChhLT5pc05ldChpKSkgewotICAgICAgICAgICAgICBhLT5uZXQoaSwgJm5ldE5hbWUpOwotICAgICAgICAgICAgICBpZiAoIWZpcnN0KQotICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiLCAiKTsgLy8gcHJpbnQgLCBhcyBzZXBhcmF0b3IKLSAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTkVUICVzICIsIG5ldE5hbWUpOyAKLSAgICAgICAgICB9IGVsc2UgaWYgKGEtPmlzUGF0aChpKSkgewotICAgICAgICAgICAgICBhLT5wYXRoKGksICZmcm9tSW5zdCwgJmZyb21QaW4sICZ0b0luc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvUGluKTsKLSAgICAgICAgICAgICAgaWYgKCFmaXJzdCkKLSAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiwgIik7Ci0gICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlBBVEggJXMgJXMgJXMgJXMgIiwgZnJvbUluc3QsIGZyb21QaW4sIHRvSW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICB0b1Bpbik7Ci0gICAgICAgICAgfSBlbHNlIGlmIChpc1N1bVNldCkgewotICAgICAgICAgICAgICAvLyBTVU0gd2l0aGluIFNVTSwgcmVzZXQgdGhlIGZsYWcKLSAgICAgICAgICAgICAgYS0+c2V0U3VtKCk7Ci0gICAgICAgICAgICAgIG9wZXJhbmQoYywgYSwgaSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGZpcnN0ID0gMDsKLSAgICAgIH0gCi0gICAgICAKLSAgfQotfQotCi1pbnQgY29uc3RyYWludChkZWZyQ2FsbGJhY2tUeXBlX2UgYywgZGVmaUFzc2VydGlvbiogYSwgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIC8vIEhhbmRsZXMgYm90aCBjb25zdHJhaW50cyBhbmQgYXNzZXJ0aW9ucwotCi0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgaWYgKGEtPmlzV2lyZWRsb2dpYygpKQotICAgICAgLy8gV2lyZWxvZ2ljCi0gICAgICBmcHJpbnRmKGZvdXQsICItIFdJUkVETE9HSUMgJXMgKyBNQVhESVNUICVnIDtcbiIsCi0vLyBXaXJlZGxvZ2ljIGRpc3QgaXMgYWxzbyBzdG9yZSBpbiBmYWxsTWF4Ci0vLyAgICAgICAgICAgICAgYS0+bmV0TmFtZSgpLCBhLT5kaXN0YW5jZSgpKTsKLSAgICAgICAgICAgICAgYS0+bmV0TmFtZSgpLCBhLT5mYWxsTWF4KCkpOwotICBlbHNlIHsKLSAgICAgIC8vIENhbGwgdGhlIG9wZXJhbmQgZnVuY3Rpb24KLSAgICAgIGlzU3VtU2V0ID0gMDsgICAgLy8gcmVzZXQgdGhlIGdsb2JhbCB2YXJpYWJsZQotICAgICAgYmVnT3BlcmFuZCA9IDE7Ci0gICAgICBvcGVyYW5kIChjLCBhLCAwKTsKLSAgICAgIC8vIEdldCB0aGUgUmlzZSBhbmQgRmFsbAotICAgICAgaWYgKGEtPmhhc1Jpc2VNYXgoKSkKLSAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIFJJU0VNQVggJWcgIiwgYS0+cmlzZU1heCgpKTsKLSAgICAgIGlmIChhLT5oYXNGYWxsTWF4KCkpCi0gICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBGQUxMTUFYICVnICIsIGEtPmZhbGxNYXgoKSk7Ci0gICAgICBpZiAoYS0+aGFzUmlzZU1pbigpKQotICAgICAgICAgIGZwcmludGYoZm91dCwgIisgUklTRU1JTiAlZyAiLCBhLT5yaXNlTWluKCkpOwotICAgICAgaWYgKGEtPmhhc0ZhbGxNaW4oKSkKLSAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIEZBTExNSU4gJWcgIiwgYS0+ZmFsbE1pbigpKTsKLSAgICAgIGZwcmludGYoZm91dCwgIjtcbiIpOwotICB9Ci0gIC0tbnVtT2JqczsKLSAgaWYgKG51bU9ianMgPD0gMCkgewotICAgICAgaWYgKGMgPT0gZGVmckNvbnN0cmFpbnRDYmtUeXBlKQotICAgICAgICAgIGZwcmludGYoZm91dCwgIkVORCBDT05TVFJBSU5UU1xuIik7Ci0gICAgICBlbHNlIAotICAgICAgICAgIGZwcmludGYoZm91dCwgIkVORCBBU1NFUlRJT05TXG4iKTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotCi1pbnQgcHJvcHN0YXJ0KGRlZnJDYWxsYmFja1R5cGVfZSBjLCB2b2lkKiwgZGVmaVVzZXJEYXRhKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgZnByaW50Zihmb3V0LCAiXG5QUk9QRVJUWURFRklOSVRJT05TXG4iKTsKLSAgaXNQcm9wID0gMTsKLQotICByZXR1cm4gMDsKLX0KLQotCi1pbnQgcHJvcChkZWZyQ2FsbGJhY2tUeXBlX2UgYywgZGVmaVByb3AqIHAsIGRlZmlVc2VyRGF0YSB1ZCkgewotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGlmIChzdHJjbXAocC0+cHJvcFR5cGUoKSwgImRlc2lnbiIpID09IDApCi0gICAgICBmcHJpbnRmKGZvdXQsICJERVNJR04gJXMgIiwgcC0+cHJvcE5hbWUoKSk7Ci0gIGVsc2UgaWYgKHN0cmNtcChwLT5wcm9wVHlwZSgpLCAibmV0IikgPT0gMCkKLSAgICAgIGZwcmludGYoZm91dCwgIk5FVCAlcyAiLCBwLT5wcm9wTmFtZSgpKTsKLSAgZWxzZSBpZiAoc3RyY21wKHAtPnByb3BUeXBlKCksICJjb21wb25lbnQiKSA9PSAwKQotICAgICAgZnByaW50Zihmb3V0LCAiQ09NUE9ORU5UICVzICIsIHAtPnByb3BOYW1lKCkpOwotICBlbHNlIGlmIChzdHJjbXAocC0+cHJvcFR5cGUoKSwgInNwZWNpYWxuZXQiKSA9PSAwKQotICAgICAgZnByaW50Zihmb3V0LCAiU1BFQ0lBTE5FVCAlcyAiLCBwLT5wcm9wTmFtZSgpKTsKLSAgZWxzZSBpZiAoc3RyY21wKHAtPnByb3BUeXBlKCksICJncm91cCIpID09IDApCi0gICAgICBmcHJpbnRmKGZvdXQsICJHUk9VUCAlcyAiLCBwLT5wcm9wTmFtZSgpKTsKLSAgZWxzZSBpZiAoc3RyY21wKHAtPnByb3BUeXBlKCksICJyb3ciKSA9PSAwKQotICAgICAgZnByaW50Zihmb3V0LCAiUk9XICVzICIsIHAtPnByb3BOYW1lKCkpOwotICBlbHNlIGlmIChzdHJjbXAocC0+cHJvcFR5cGUoKSwgImNvbXBvbmVudHBpbiIpID09IDApCi0gICAgICBmcHJpbnRmKGZvdXQsICJDT01QT05FTlRQSU4gJXMgIiwgcC0+cHJvcE5hbWUoKSk7Ci0gIGVsc2UgaWYgKHN0cmNtcChwLT5wcm9wVHlwZSgpLCAicmVnaW9uIikgPT0gMCkKLSAgICAgIGZwcmludGYoZm91dCwgIlJFR0lPTiAlcyAiLCBwLT5wcm9wTmFtZSgpKTsKLSAgZWxzZSBpZiAoc3RyY21wKHAtPnByb3BUeXBlKCksICJub25kZWZhdWx0cnVsZSIpID09IDApCi0gICAgICBmcHJpbnRmKGZvdXQsICJOT05ERUZBVUxUUlVMRSAlcyAiLCBwLT5wcm9wTmFtZSgpKTsKLSAgaWYgKHAtPmRhdGFUeXBlKCkgPT0gJ0knKQotICAgICAgZnByaW50Zihmb3V0LCAiSU5URUdFUiAiKTsKLSAgaWYgKHAtPmRhdGFUeXBlKCkgPT0gJ1InKQotICAgICAgZnByaW50Zihmb3V0LCAiUkVBTCAiKTsKLSAgaWYgKHAtPmRhdGFUeXBlKCkgPT0gJ1MnKQotICAgICAgZnByaW50Zihmb3V0LCAiU1RSSU5HICIpOwotICBpZiAocC0+ZGF0YVR5cGUoKSA9PSAnUScpCi0gICAgICBmcHJpbnRmKGZvdXQsICJTVFJJTkcgIik7Ci0gIGlmIChwLT5oYXNSYW5nZSgpKSB7Ci0gICAgICBmcHJpbnRmKGZvdXQsICJSQU5HRSAlZyAlZyAiLCBwLT5sZWZ0KCksCi0gICAgICAgICAgICAgIHAtPnJpZ2h0KCkpOwotICB9Ci0gIGlmIChwLT5oYXNOdW1iZXIoKSkKLSAgICAgIGZwcmludGYoZm91dCwgIiVnICIsIHAtPm51bWJlcigpKTsKLSAgaWYgKHAtPmhhc1N0cmluZygpKQotICAgICAgZnByaW50Zihmb3V0LCAiXCIlc1wiICIsIHAtPnN0cmluZygpKTsKLSAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotaW50IHByb3BlbmQoZGVmckNhbGxiYWNrVHlwZV9lIGMsIHZvaWQqLCBkZWZpVXNlckRhdGEpIHsKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAoaXNQcm9wKSB7Ci0gICAgICBmcHJpbnRmKGZvdXQsICJFTkQgUFJPUEVSVFlERUZJTklUSU9OU1xuXG4iKTsKLSAgICAgIGlzUHJvcCA9IDA7Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotCi1pbnQgaGlzdChkZWZyQ2FsbGJhY2tUeXBlX2UgYywgY29uc3QgY2hhciogaCwgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgZGVmclNldENhc2VTZW5zaXRpdml0eSgwKTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgZnByaW50Zihmb3V0LCAiSElTVE9SWSAlcyA7XG4iLCBoKTsKLSAgZGVmclNldENhc2VTZW5zaXRpdml0eSgxKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotaW50IGFuKGRlZnJDYWxsYmFja1R5cGVfZSBjLCBjb25zdCBjaGFyKiBoLCBkZWZpVXNlckRhdGEgdWQpIHsKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBmcHJpbnRmKGZvdXQsICJBUlJBWSAlcyA7XG4iLCBoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotaW50IGZuKGRlZnJDYWxsYmFja1R5cGVfZSBjLCBjb25zdCBjaGFyKiBoLCBkZWZpVXNlckRhdGEgdWQpIHsKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBmcHJpbnRmKGZvdXQsICJGTE9PUlBMQU4gJXMgO1xuIiwgaCk7Ci0gIHJldHVybiAwOwotfQotCi0KLWludCBiYm4oZGVmckNhbGxiYWNrVHlwZV9lIGMsIGNvbnN0IGNoYXIqIGgsIGRlZmlVc2VyRGF0YSB1ZCkgewotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGZwcmludGYoZm91dCwgIkJVU0JJVENIQVJTIFwiJXNcIiA7XG4iLCBoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotaW50IHZlcnMoZGVmckNhbGxiYWNrVHlwZV9lIGMsIGRvdWJsZSBkLCBkZWZpVXNlckRhdGEgdWQpIHsKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIAotICAgICAgZGF0YUVycm9yKCk7Ci0gIGZwcmludGYoZm91dCwgIlZFUlNJT04gJWcgO1xuIiwgZCk7ICAKLSAgY3VyVmVyID0gZDsKLQotICBmcHJpbnRmKGZvdXQsICJBTElBUyBhbGlhczEgYWxpYXNWYWx1ZTEgMSA7XG4iKTsKLSAgZnByaW50Zihmb3V0LCAiQUxJQVMgYWxpYXMyIGFsaWFzVmFsdWUyIDAgO1xuIik7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotaW50IHZlcnNTdHIoZGVmckNhbGxiYWNrVHlwZV9lIGMsIGNvbnN0IGNoYXIqIHZlcnNpb25OYW1lLCBkZWZpVXNlckRhdGEgdWQpIHsKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICAvL2ZwcmludGYoZm91dCwgIlZFUlNJT04gJXMgO1xuIiwgdmVyc2lvbk5hbWUpOwotICBmcHJpbnRmKGZvdXQsICJWRVJTSU9OIDUuOCA7XG4iKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotaW50IHVuaXRzRm4oZGVmckNhbGxiYWNrVHlwZV9lIGMsIGRvdWJsZSBkLCBkZWZpVXNlckRhdGEgdWQpIHsKLSAgY2hlY2tUeXBlKGMpOwotICBpZiAodWQgIT0gdXNlckRhdGEpIGRhdGFFcnJvcigpOwotICBmcHJpbnRmKGZvdXQsICJVTklUUyBESVNUQU5DRSBNSUNST05TICVnIDtcblxuIiwgZCk7Ci0gIHJldHVybiAwOwotfQotCi0KLWludCBjYXNlc2VucyhkZWZyQ2FsbGJhY2tUeXBlX2UgYywgaW50IGQsIGRlZmlVc2VyRGF0YSB1ZCkgewotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGlmIChkID09IDEpCi0gICAgIGZwcmludGYoZm91dCwgIk5BTUVTQ0FTRVNFTlNJVElWRSBPTiA7XG4iLCBkKTsKLSAgZWxzZQotICAgICBmcHJpbnRmKGZvdXQsICJOQU1FU0NBU0VTRU5TSVRJVkUgT0ZGIDtcbiIsIGQpOwotICByZXR1cm4gMDsKLX0KLQotCi1pbnQgY2xzKGRlZnJDYWxsYmFja1R5cGVfZSBjLCB2b2lkKiBjbCwgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGRlZmlTaXRlKiBzaXRlOyAgLy8gU2l0ZSBhbmQgQ2FucGxhY2UgYW5kIENhbm5vdE9jY3VweQotICBkZWZpQm94KiBib3g7ICAvLyBEaWVBcmVhIGFuZCAKLSAgZGVmaVBpbkNhcCogcGM7Ci0gIGRlZmlQaW4qIHBpbjsKLSAgaW50IGksIGosIGs7Ci0gIGRlZmlSb3cqIHJvdzsKLSAgZGVmaVRyYWNrKiB0cmFjazsKLSAgZGVmaUdjZWxsR3JpZCogZ2NnOwotICBkZWZpVmlhKiB2aWE7Ci0gIGRlZmlSZWdpb24qIHJlOwotICBkZWZpR3JvdXAqIGdyb3VwOwotICBkZWZpQ29tcG9uZW50TWFza1NoaWZ0TGF5ZXIqIG1hc2tTaGlmdExheWVyID0gTlVMTDsKLSAgZGVmaVNjYW5jaGFpbiogc2M7Ci0gIGRlZmlJT1RpbWluZyogaW90OwotICBkZWZpRlBDKiBmcGM7Ci0gIGRlZmlUaW1pbmdEaXNhYmxlKiB0ZDsKLSAgZGVmaVBhcnRpdGlvbiogcGFydDsKLSAgZGVmaVBpblByb3AqIHBwcm9wOwotICBkZWZpQmxvY2thZ2UqIGJsb2NrOwotICBkZWZpU2xvdCogc2xvdHM7Ci0gIGRlZmlGaWxsKiBmaWxsczsKLSAgZGVmaVN0eWxlcyogc3R5bGVzOwotICBpbnQgeGwsIHlsLCB4aCwgeWg7Ci0gIGNoYXIgKm5hbWUsICphMSwgKmIxOwotICBjaGFyICoqaW5zdCwgKippblBpbiwgKipvdXRQaW47Ci0gIGludCAgKmJpdHM7Ci0gIGludCAgc2l6ZTsKLSAgaW50IGNvcm5lciwgdHlwOwotICBjb25zdCBjaGFyICppdGVtVDsKLSAgY2hhciBkaXI7Ci0gIGRlZmlQaW5BbnRlbm5hTW9kZWwqIGFNb2RlbDsKLSAgc3RydWN0IGRlZmlQb2ludHMgcG9pbnRzOwotCi0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgc3dpdGNoIChjKSB7Ci0KLSAgY2FzZSBkZWZyU2l0ZUNia1R5cGUgOgotICAgICAgICAgc2l0ZSA9IChkZWZpU2l0ZSopY2w7Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICJTSVRFICVzICVnICVnICVzICIsIHNpdGUtPm5hbWUoKSwKLSAgICAgICAgICAgICAgICAgc2l0ZS0+eF9vcmlnKCksIHNpdGUtPnlfb3JpZygpLAotICAgICAgICAgICAgICAgICBvcmllbnRTdHIoc2l0ZS0+b3JpZW50KCkpKTsKLSAgICAgICAgIGZwcmludGYoZm91dCwgIkRPICVnIEJZICVnIFNURVAgJWcgJWcgO1xuIiwKLSAgICAgICAgICAgICAgICAgc2l0ZS0+eF9udW0oKSwgc2l0ZS0+eV9udW0oKSwKLSAgICAgICAgICAgICAgICAgc2l0ZS0+eF9zdGVwKCksIHNpdGUtPnlfc3RlcCgpKTsKLSAgICAgICAgIGJyZWFrOwotICBjYXNlIGRlZnJDYW5wbGFjZUNia1R5cGUgOgotICAgICAgICAgc2l0ZSA9IChkZWZpU2l0ZSopY2w7Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICJDQU5QTEFDRSAlcyAlZyAlZyAlcyAiLCBzaXRlLT5uYW1lKCksCi0gICAgICAgICAgICAgICAgIHNpdGUtPnhfb3JpZygpLCBzaXRlLT55X29yaWcoKSwKLSAgICAgICAgICAgICAgICAgb3JpZW50U3RyKHNpdGUtPm9yaWVudCgpKSk7Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICJETyAlZyBCWSAlZyBTVEVQICVnICVnIDtcbiIsCi0gICAgICAgICAgICAgICAgIHNpdGUtPnhfbnVtKCksIHNpdGUtPnlfbnVtKCksCi0gICAgICAgICAgICAgICAgIHNpdGUtPnhfc3RlcCgpLCBzaXRlLT55X3N0ZXAoKSk7Ci0gICAgICAgICBicmVhazsKLSAgY2FzZSBkZWZyQ2Fubm90T2NjdXB5Q2JrVHlwZSA6IAotICAgICAgICAgc2l0ZSA9IChkZWZpU2l0ZSopY2w7Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICJDQU5OT1RPQ0NVUFkgJXMgJWcgJWcgJXMgIiwKLSAgICAgICAgICAgICAgICAgc2l0ZS0+bmFtZSgpLCBzaXRlLT54X29yaWcoKSwKLSAgICAgICAgICAgICAgICAgc2l0ZS0+eV9vcmlnKCksIG9yaWVudFN0cihzaXRlLT5vcmllbnQoKSkpOwotICAgICAgICAgZnByaW50Zihmb3V0LCAiRE8gJWcgQlkgJWcgU1RFUCAlZyAlZyA7XG4iLAotICAgICAgICAgICAgICAgICBzaXRlLT54X251bSgpLCBzaXRlLT55X251bSgpLAotICAgICAgICAgICAgICAgICBzaXRlLT54X3N0ZXAoKSwgc2l0ZS0+eV9zdGVwKCkpOwotICAgICAgICAgYnJlYWs7Ci0gIGNhc2UgZGVmckRpZUFyZWFDYmtUeXBlIDoKLSAgICAgICAgIGJveCA9IChkZWZpQm94KiljbDsKLSAgICAgICAgIGZwcmludGYoZm91dCwgIkRJRUFSRUEgKCAlZCAlZCApICggJWQgJWQgKSA7XG5cbiIsCi0gICAgICAgICAgICAgICAgIGJveC0+eGwoKSwgYm94LT55bCgpLCBib3gtPnhoKCksCi0gICAgICAgICAgICAgICAgIGJveC0+eWgoKSk7Ci0gICAgICAgICAvKgotICAgICAgICAgZnByaW50Zihmb3V0LCAiRElFQVJFQSAiKTsKLSAgICAgICAgIHBvaW50cyA9IGJveC0+Z2V0UG9pbnQoKTsKLSAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwb2ludHMubnVtUG9pbnRzOyBpKyspCi0gICAgICAgICAgIGZwcmludGYoZm91dCwgIiVkICVkICIsIHBvaW50cy54W2ldLCBwb2ludHMueVtpXSk7Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICI7XG4iKTsqLwotICAgICAgICAgYnJlYWs7Ci0gIGNhc2UgZGVmclBpbkNhcENia1R5cGUgOgotICAgICAgICAgcGMgPSAoZGVmaVBpbkNhcCopY2w7Ci0gICAgICAgICBpZiAodGVzdERlYnVnUHJpbnQpIHsKLSAgICAgICAgICAgICBwYy0+cHJpbnQoZm91dCk7Ci0gICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIk1JTlBJTlMgJWQgV0lSRUNBUCAlZyA7XG4iLAotICAgICAgICAgICAgICAgICAgICAgcGMtPnBpbigpLCBwYy0+Y2FwKCkpOwotICAgICAgICAgICAgIC0tbnVtT2JqczsKLSAgICAgICAgICAgICBpZiAobnVtT2JqcyA8PSAwKQotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJFTkQgREVGQVVMVENBUFxuIik7Ci0gICAgICAgICB9Ci0gICAgICAgICBicmVhazsKLSAgY2FzZSBkZWZyUGluQ2JrVHlwZSA6Ci0gICAgICAgICBwaW4gPSAoZGVmaVBpbiopY2w7Ci0gICAgICAgICBpZiAodGVzdERlYnVnUHJpbnQpIHsKLSAgICAgICAgICAgICBwaW4tPnByaW50KGZvdXQpOwotICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICItICVzICsgTkVUICVzICIsIHBpbi0+cGluTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgcGluLT5uZXROYW1lKCkpOwotICAgIC8vICAgICAgICAgcGluLT5jaGFuZ2VQaW5OYW1lKCJwaW5OYW1lIik7Ci0gICAgLy8gICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAiLCBwaW4tPnBpbk5hbWUoKSk7Ci0gICAgICAgICAgICAgaWYgKHBpbi0+aGFzRGlyZWN0aW9uKCkpCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgRElSRUNUSU9OICVzICIsIHBpbi0+ZGlyZWN0aW9uKCkpOwotICAgICAgICAgICAgIGlmIChwaW4tPmhhc1VzZSgpKQotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIFVTRSAlcyAiLCBwaW4tPnVzZSgpKTsKLSAgICAgICAgICAgICBpZiAocGluLT5oYXNOZXRFeHByKCkpCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgTkVURVhQUiBcIiVzXCIgIiwgcGluLT5uZXRFeHByKCkpOwotICAgICAgICAgICAgIGlmIChwaW4tPmhhc1N1cHBseVNlbnNpdGl2aXR5KCkpCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgU1VQUExZU0VOU0lUSVZJVFkgJXMgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwaW4tPnN1cHBseVNlbnNpdGl2aXR5KCkpOwotICAgICAgICAgICAgIGlmIChwaW4tPmhhc0dyb3VuZFNlbnNpdGl2aXR5KCkpCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgR1JPVU5EU0VOU0lUSVZJVFkgJXMgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwaW4tPmdyb3VuZFNlbnNpdGl2aXR5KCkpOwotICAgICAgICAgICAgIGlmIChwaW4tPmhhc0xheWVyKCkpIHsKLSAgICAgICAgICAgICAgICAgc3RydWN0IGRlZmlQb2ludHMgcG9pbnRzOwotICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGluLT5udW1MYXllcigpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4gICsgTEFZRVIgJXMgIiwgcGluLT5sYXllcihpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwaW4tPmxheWVyTWFzayhpKSkgCi0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJNQVNLICVkICIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwaW4tPmxheWVyTWFzayhpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwaW4tPmhhc0xheWVyU3BhY2luZyhpKSkKLSAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJTUEFDSU5HICVkICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbi0+bGF5ZXJTcGFjaW5nKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBpbi0+aGFzTGF5ZXJEZXNpZ25SdWxlV2lkdGgoaSkpCi0gICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiREVTSUdOUlVMRVdJRFRIICVkICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbi0+bGF5ZXJEZXNpZ25SdWxlV2lkdGgoaSkpOwotICAgICAgICAgICAgICAgICAgICBwaW4tPmJvdW5kcyhpLCAmeGwsICZ5bCwgJnhoLCAmeWgpOwotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIoICVkICVkICkgKCAlZCAlZCApIiwgeGwsIHlsLCB4aCwgeWgpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaW4tPm51bVBvbHlnb25zKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBQT0xZR09OICVzICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGluLT5wb2x5Z29uTmFtZShpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwaW4tPnBvbHlnb25NYXNrKGkpKQotICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIk1BU0sgJWQgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbi0+cG9seWdvbk1hc2soaSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGluLT5oYXNQb2x5Z29uU3BhY2luZyhpKSkKLSAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJTUEFDSU5HICVkICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbi0+cG9seWdvblNwYWNpbmcoaSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGluLT5oYXNQb2x5Z29uRGVzaWduUnVsZVdpZHRoKGkpKQotICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkRFU0lHTlJVTEVXSURUSCAlZCAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaW4tPnBvbHlnb25EZXNpZ25SdWxlV2lkdGgoaSkpOwotICAgICAgICAgICAgICAgICAgICBwb2ludHMgPSBwaW4tPmdldFBvbHlnb24oaSk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwb2ludHMubnVtUG9pbnRzOyBqKyspCi0gICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJWQgJWQgIiwgcG9pbnRzLnhbal0sIHBvaW50cy55W2pdKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGluLT5udW1WaWFzKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgaWYgKHBpbi0+dmlhVG9wTWFzayhpKSB8fCBwaW4tPnZpYUN1dE1hc2soaSkgfHwgcGluLT52aWFCb3R0b21NYXNrKGkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4gICsgVklBICVzIE1BU0sgJWQlZCVkICVkICVkICIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaW4tPnZpYU5hbWUoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbi0+dmlhVG9wTWFzayhpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGluLT52aWFDdXRNYXNrKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaW4tPnZpYUJvdHRvbU1hc2soaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbi0+dmlhUHRYKGkpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGluLT52aWFQdFkoaSkpOwotICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBWSUEgJXMgJWQgJWQgIiwgcGluLT52aWFOYW1lKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGluLT52aWFQdFgoaSksIHBpbi0+dmlhUHRZKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBpZiAocGluLT5oYXNQb3J0KCkpIHsKLSAgICAgICAgICAgICAgICAgc3RydWN0IGRlZmlQb2ludHMgcG9pbnRzOwotICAgICAgICAgICAgICAgICBkZWZpUGluUG9ydCogcG9ydDsKLSAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBpbi0+bnVtUG9ydHMoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBvcnQgPSBwaW4tPnBpblBvcnQoaik7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuICArIFBPUlQiKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBvcnQtPm51bUxheWVyKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiAgICAgKyBMQVlFUiAlcyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQtPmxheWVyKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnQtPmxheWVyTWFzayhpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIk1BU0sgJWQgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC0+bGF5ZXJNYXNrKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnQtPmhhc0xheWVyU3BhY2luZyhpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJTUEFDSU5HICVkICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LT5sYXllclNwYWNpbmcoaSkpOwotICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9ydC0+aGFzTGF5ZXJEZXNpZ25SdWxlV2lkdGgoaSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiREVTSUdOUlVMRVdJRFRIICVkICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LT5sYXllckRlc2lnblJ1bGVXaWR0aChpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHBvcnQtPmJvdW5kcyhpLCAmeGwsICZ5bCwgJnhoLCAmeWgpOwotICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlZCAlZCAlZCAlZCAiLCB4bCwgeWwsIHhoLCB5aCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBvcnQtPm51bVBvbHlnb25zKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiAgICAgKyBQT0xZR09OICVzICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC0+cG9seWdvbk5hbWUoaSkpOwotICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9ydC0+cG9seWdvbk1hc2soaSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTUFTSyAlZCAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC0+cG9seWdvbk1hc2soaSkpOwotICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9ydC0+aGFzUG9seWdvblNwYWNpbmcoaSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiU1BBQ0lORyAlZCAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LT5wb2x5Z29uU3BhY2luZyhpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3J0LT5oYXNQb2x5Z29uRGVzaWduUnVsZVdpZHRoKGkpKQotICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkRFU0lHTlJVTEVXSURUSCAlZCAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LT5wb2x5Z29uRGVzaWduUnVsZVdpZHRoKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzID0gcG9ydC0+Z2V0UG9seWdvbihpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHBvaW50cy5udW1Qb2ludHM7IGsrKykKLSAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIoICVkICVkICkgIiwgcG9pbnRzLnhba10sIHBvaW50cy55W2tdKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcG9ydC0+bnVtVmlhcygpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3J0LT52aWFUb3BNYXNrKGkpIHx8IHBvcnQtPnZpYUN1dE1hc2soaSkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcG9ydC0+dmlhQm90dG9tTWFzayhpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuICAgICArIFZJQSAlcyBNQVNLICVkJWQlZCAoICVkICVkICkgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC0+dmlhTmFtZShpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC0+dmlhVG9wTWFzayhpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC0+dmlhQ3V0TWFzayhpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC0+dmlhQm90dG9tTWFzayhpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC0+dmlhUHRYKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LT52aWFQdFkoaSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiAgICAgKyBWSUEgJXMgKCAlZCAlZCApICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC0+dmlhTmFtZShpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LT52aWFQdFgoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC0+dmlhUHRZKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocG9ydC0+aGFzUGxhY2VtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnQtPmlzUGxhY2VkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4gICAgICsgUExBQ0VEICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIoICVkICVkICkgJXMgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC0+cGxhY2VtZW50WCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LT5wbGFjZW1lbnRZKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudFN0cihwb3J0LT5vcmllbnQoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3J0LT5pc0NvdmVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4gICAgICsgQ09WRVIgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiggJWQgJWQgKSAlcyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LT5wbGFjZW1lbnRYKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQtPnBsYWNlbWVudFkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50U3RyKHBvcnQtPm9yaWVudCgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnQtPmlzRml4ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiAgICAgKyBGSVhFRCAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKCAlZCAlZCApICVzICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQtPnBsYWNlbWVudFgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC0+cGxhY2VtZW50WSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRTdHIocG9ydC0+b3JpZW50KCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBpZiAocGluLT5oYXNQbGFjZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICBpZiAocGluLT5pc1BsYWNlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiAgKyBQTEFDRUQgIik7Ci0gICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIoICVkICVkICkgJXMgIiwgcGluLT5wbGFjZW1lbnRYKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGluLT5wbGFjZW1lbnRZKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudFN0cihwaW4tPm9yaWVudCgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICBpZiAocGluLT5pc0NvdmVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuICArIENPVkVSICIpOwotICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKCAlZCAlZCApICVzICIsIHBpbi0+cGxhY2VtZW50WCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBpbi0+cGxhY2VtZW50WSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRTdHIocGluLT5vcmllbnQoKSkpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIGlmIChwaW4tPmlzRml4ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4gICsgRklYRUQgIik7Ci0gICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIoICVkICVkICkgJXMgIiwgcGluLT5wbGFjZW1lbnRYKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGluLT5wbGFjZW1lbnRZKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudFN0cihwaW4tPm9yaWVudCgpKSk7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgaWYgKHBpbi0+aXNVbnBsYWNlZCgpKQotICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4gICsgVU5QTEFDRUQgIik7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGlmIChwaW4tPmhhc1NwZWNpYWwoKSkgewotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIFNQRUNJQUwgIik7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGlmIChwaW4tPmhhc0FQaW5QYXJ0aWFsTWV0YWxBcmVhKCkpIHsKLSAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBpbi0+bnVtQVBpblBhcnRpYWxNZXRhbEFyZWEoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkFOVEVOTkFQSU5QQVJUSUFMTUVUQUxBUkVBICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaW4tPkFQaW5QYXJ0aWFsTWV0YWxBcmVhKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCoocGluLT5BUGluUGFydGlhbE1ldGFsQXJlYUxheWVyKGkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBMQVlFUiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbi0+QVBpblBhcnRpYWxNZXRhbEFyZWFMYXllcihpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgaWYgKHBpbi0+aGFzQVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhKCkpIHsKLSAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBpbi0+bnVtQVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJBTlRFTk5BUElOUEFSVElBTE1FVEFMU0lERUFSRUEgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbi0+QVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCoocGluLT5BUGluUGFydGlhbE1ldGFsU2lkZUFyZWFMYXllcihpKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgTEFZRVIgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbi0+QVBpblBhcnRpYWxNZXRhbFNpZGVBcmVhTGF5ZXIoaSkpOwotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGlmIChwaW4tPmhhc0FQaW5EaWZmQXJlYSgpKSB7Ci0gICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaW4tPm51bUFQaW5EaWZmQXJlYSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiQU5URU5OQVBJTkRJRkZBUkVBICVkIiwgcGluLT5BUGluRGlmZkFyZWEoaSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKihwaW4tPkFQaW5EaWZmQXJlYUxheWVyKGkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBMQVlFUiAlcyIsIHBpbi0+QVBpbkRpZmZBcmVhTGF5ZXIoaSkpOwotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGlmIChwaW4tPmhhc0FQaW5QYXJ0aWFsQ3V0QXJlYSgpKSB7Ci0gICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaW4tPm51bUFQaW5QYXJ0aWFsQ3V0QXJlYSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiQU5URU5OQVBJTlBBUlRJQUxDVVRBUkVBICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaW4tPkFQaW5QYXJ0aWFsQ3V0QXJlYShpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgqKHBpbi0+QVBpblBhcnRpYWxDdXRBcmVhTGF5ZXIoaSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIExBWUVSICVzIiwgcGluLT5BUGluUGFydGlhbEN1dEFyZWFMYXllcihpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcGluLT5udW1BbnRlbm5hTW9kZWwoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgYU1vZGVsID0gcGluLT5hbnRlbm5hTW9kZWwoaik7Ci0gCi0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiQU5URU5OQU1PREVMICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgYU1vZGVsLT5hbnRlbm5hT3hpZGUoKSk7IAotIAotICAgICAgICAgICAgICAgIGlmIChhTW9kZWwtPmhhc0FQaW5HYXRlQXJlYSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhTW9kZWwtPm51bUFQaW5HYXRlQXJlYSgpOwotICAgICAgICAgICAgICAgICAgICAgICBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiQU5URU5OQVBJTkdBVEVBUkVBICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhTW9kZWwtPkFQaW5HYXRlQXJlYShpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmIChhTW9kZWwtPmhhc0FQaW5HYXRlQXJlYUxheWVyKGkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIExBWUVSICVzIiwgYU1vZGVsLT5BUGluR2F0ZUFyZWFMYXllcihpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGFNb2RlbC0+aGFzQVBpbk1heEFyZWFDYXIoKSkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICBpIDwgYU1vZGVsLT5udW1BUGluTWF4QXJlYUNhcigpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiQU5URU5OQVBJTk1BWEFSRUFDQVIgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFNb2RlbC0+QVBpbk1heEFyZWFDYXIoaSkpOwotICAgICAgICAgICAgICAgICAgICAgICBpZiAoYU1vZGVsLT5oYXNBUGluTWF4QXJlYUNhckxheWVyKGkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgTEFZRVIgJXMiLCBhTW9kZWwtPkFQaW5NYXhBcmVhQ2FyTGF5ZXIoaSkpOwotICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhTW9kZWwtPmhhc0FQaW5NYXhTaWRlQXJlYUNhcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaSA8IGFNb2RlbC0+bnVtQVBpbk1heFNpZGVBcmVhQ2FyKCk7IAotICAgICAgICAgICAgICAgICAgICAgICAgIGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJBTlRFTk5BUElOTUFYU0lERUFSRUFDQVIgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFNb2RlbC0+QVBpbk1heFNpZGVBcmVhQ2FyKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFNb2RlbC0+aGFzQVBpbk1heFNpZGVBcmVhQ2FyTGF5ZXIoaSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBMQVlFUiAlcyIsIGFNb2RlbC0+QVBpbk1heFNpZGVBcmVhQ2FyTGF5ZXIoaSkpOwotICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhTW9kZWwtPmhhc0FQaW5NYXhDdXRDYXIoKSkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYU1vZGVsLT5udW1BUGluTWF4Q3V0Q2FyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJBTlRFTk5BUElOTUFYQ1VUQ0FSICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFNb2RlbC0+QVBpbk1heEN1dENhcihpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmIChhTW9kZWwtPmhhc0FQaW5NYXhDdXRDYXJMYXllcihpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiBMQVlFUiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhTW9kZWwtPkFQaW5NYXhDdXRDYXJMYXllcihpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIjtcbiIpOwotICAgICAgICAgICAgIC0tbnVtT2JqczsKLSAgICAgICAgICAgICAvL2lmIChudW1PYmpzIDw9IDApCi0gICAgICAgICAgICAgLy8gICAgZnByaW50Zihmb3V0LCAiRU5EIFBJTlNcbiIpOwotICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0gIGNhc2UgZGVmckRlZmF1bHRDYXBDYmtUeXBlIDoKLSAgICAgICAgIGkgPSAobG9uZyljbDsKLSAgICAgICAgIGZwcmludGYoZm91dCwgIkRFRkFVTFRDQVAgJWRcbiIsIGkpOwotICAgICAgICAgbnVtT2JqcyA9IGk7Ci0gICAgICAgICBicmVhazsKLSAgY2FzZSBkZWZyUm93Q2JrVHlwZSA6Ci0gICAgICAgICByb3cgPSAoZGVmaVJvdyopY2w7Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICJST1cgJXMgJXMgJS4wZiAlLjBmICVzICIsIGlnbm9yZVJvd05hbWVzID8gIlhYWCIgOiByb3ctPm5hbWUoKSwKLSAgICAgICAgICAgICAgICAgcm93LT5tYWNybygpLCByb3ctPngoKSwgcm93LT55KCksCi0gICAgICAgICAgICAgICAgIG9yaWVudFN0cihyb3ctPm9yaWVudCgpKSk7Ci0gICAgICAgICBpZiAocm93LT5oYXNEbygpKSB7Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiRE8gJWcgQlkgJWcgIiwKLSAgICAgICAgICAgICAgICAgICAgIHJvdy0+eE51bSgpLCByb3ctPnlOdW0oKSk7Ci0gICAgICAgICAgICAgaWYgKHJvdy0+aGFzRG9TdGVwKCkpCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlNURVAgJWcgJWdcbiA7XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIHJvdy0+eFN0ZXAoKSwgcm93LT55U3RlcCgpKTsKLSAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIDtcbiIpOwotICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiA7XG4iKTsKLSAgICAgICAgIGlmIChyb3ctPm51bVByb3BzKCkgPiAwKSB7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93LT5udW1Qcm9wcygpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICsgUFJPUEVSVFkgJXMgJXMgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvdy0+cHJvcE5hbWUoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICByb3ctPnByb3BWYWx1ZShpKSk7Ci0gICAgICAgICAgICAgICAgLy8gQlggMTgwOTEwIERFRiByZWFkIGlzc3VlICh0dXJuZWQgb3V0IG5vdCBoZXJlKQotICAgICAgICAgICAgICAgIHN3aXRjaCAocm93LT5wcm9wVHlwZShpKSkgewotICAgICAgICAgICAgICAgICAgIGNhc2UgJ1InOiBmcHJpbnRmKGZvdXQsICJSRUFMICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICBjYXNlICdJJzogZnByaW50Zihmb3V0LCAiSU5URUdFUiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgY2FzZSAnUyc6IGZwcmludGYoZm91dCwgIlNUUklORyAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgY2FzZSAnUSc6IGZwcmludGYoZm91dCwgIlFVT1RFU1RSSU5HICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICBjYXNlICdOJzogZnByaW50Zihmb3V0LCAiTlVNQkVSICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiA7XG4iKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGJyZWFrOwotICBjYXNlIGRlZnJUcmFja0Nia1R5cGUgOgotICAgICAgICAgdHJhY2sgPSAoZGVmaVRyYWNrKiljbDsKLSAgIGlmICh0cmFjay0+Zmlyc3RUcmFja01hc2soKSkgewotICAgICAgaWYgKHRyYWNrLT5zYW1lTWFzaygpKSB7Ci0gICAgZnByaW50Zihmb3V0LCAiVFJBQ0tTICVzICVnIERPICVnIFNURVAgJWcgTUFTSyAlZCBTQU1FTUFTSyBMQVlFUiAiLAotICAgICAgICAgICAgICAgICB0cmFjay0+bWFjcm8oKSwgdHJhY2stPngoKSwKLSAgICAgICAgICAgICAgICAgdHJhY2stPnhOdW0oKSwgdHJhY2stPnhTdGVwKCksCi0gICAgICAgICAgIHRyYWNrLT5maXJzdFRyYWNrTWFzaygpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgZnByaW50Zihmb3V0LCAiVFJBQ0tTICVzICVnIERPICVnIFNURVAgJWcgTUFTSyAlZCBMQVlFUiAiLAotICAgICAgICAgICAgICAgICB0cmFjay0+bWFjcm8oKSwgdHJhY2stPngoKSwKLSAgICAgICAgICAgICAgICAgdHJhY2stPnhOdW0oKSwgdHJhY2stPnhTdGVwKCksCi0gICAgICAgICAgIHRyYWNrLT5maXJzdFRyYWNrTWFzaygpKTsKLSAgICAgIH0KLSAgIH0gZWxzZSB7Ci0gICAgICBmcHJpbnRmKGZvdXQsICJUUkFDS1MgJXMgJWcgRE8gJWcgU1RFUCAlZyBMQVlFUiAiLAotICAgICAgICAgICAgICAgICB0cmFjay0+bWFjcm8oKSwgdHJhY2stPngoKSwKLSAgICAgICAgICAgICAgICAgdHJhY2stPnhOdW0oKSwgdHJhY2stPnhTdGVwKCkpOwotICAgfQotICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRyYWNrLT5udW1MYXllcnMoKTsgaSsrKQotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJXMgIiwgdHJhY2stPmxheWVyKGkpKTsKLSAgICAgICAgIGZwcmludGYoZm91dCwgIjtcbiIpOyAKLSAgICAgICAgIGJyZWFrOwotICBjYXNlIGRlZnJHY2VsbEdyaWRDYmtUeXBlIDoKLSAgICAgICAgIGdjZyA9IChkZWZpR2NlbGxHcmlkKiljbDsKLSAgICAgICAgIGZwcmludGYoZm91dCwgIkdDRUxMR1JJRCAlcyAlZCBETyAlZCBTVEVQICVnIDtcbiIsCi0gICAgICAgICAgICAgICAgIGdjZy0+bWFjcm8oKSwgZ2NnLT54KCksCi0gICAgICAgICAgICAgICAgIGdjZy0+eE51bSgpLCBnY2ctPnhTdGVwKCkpOwotICAgICAgICAgYnJlYWs7Ci0gIGNhc2UgZGVmclZpYUNia1R5cGUgOgotICAgICAgICAgdmlhID0gKGRlZmlWaWEqKWNsOwotICAgICAgICAgaWYgKHRlc3REZWJ1Z1ByaW50KSB7Ci0gICAgICAgICAgICAgdmlhLT5wcmludChmb3V0KTsKLSAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiLSAlcyBcbiIsIHZpYS0+bmFtZSgpKTsKLSAgICAgICAgICAgICBpZiAodmlhLT5oYXNQYXR0ZXJuKCkpCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgUEFUVEVSTk5BTUUgJXMgIiwgdmlhLT5wYXR0ZXJuKCkpOwotICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB2aWEtPm51bUxheWVycygpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgdmlhLT5sYXllcihpLCAmbmFtZSwgJnhsLCAmeWwsICZ4aCwgJnloKTsKLSAgICAgICAgICAgICAgICAgaW50IHJlY3RNYXNrID0gdmlhLT5yZWN0TWFzayhpKTsKLQotICAgICAgICAgICAgICAgICBpZiAocmVjdE1hc2spIHsKLSAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgUkVDVCAlcyArIE1BU0sgJWQgKCAlZCAlZCApICggJWQgJWQgKSBcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHJlY3RNYXNrLCB4bCwgeWwsIHhoLCB5aCk7Ci0gICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIFJFQ1QgJXMgKCAlZCAlZCApICggJWQgJWQgKSBcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHhsLCB5bCwgeGgsIHloKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAvLyBQT0xZR09OCi0gICAgICAgICAgICAgaWYgKHZpYS0+bnVtUG9seWdvbnMoKSkgewotICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGVmaVBvaW50cyBwb2ludHM7Ci0gICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB2aWEtPm51bVBvbHlnb25zKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgaW50IHBvbHlNYXNrID0gdmlhLT5wb2x5TWFzayhpKTsKLQotICAgICAgICAgICAgICAgICAgICAgaWYgKHBvbHlNYXNrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4gICsgUE9MWUdPTiAlcyArIE1BU0sgJWQgIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWEtPnBvbHlnb25OYW1lKGkpLCBwb2x5TWFzayk7Ci0gICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuICArIFBPTFlHT04gJXMgIiwgdmlhLT5wb2x5Z29uTmFtZShpKSk7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICBwb2ludHMgPSB2aWEtPmdldFBvbHlnb24oaSk7Ci0gICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcG9pbnRzLm51bVBvaW50czsgaisrKQotICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVkICVkICIsIHBvaW50cy54W2pdLCBwb2ludHMueVtqXSk7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiIFxuIik7Ci0gICAgICAgICAgICAgaWYgKHZpYS0+aGFzVmlhUnVsZSgpKSB7Ci0gICAgICAgICAgICAgICAgIGNoYXIgKnZybiwgKmJsLCAqY2wsICp0bDsKLSAgICAgICAgICAgICAgICAgaW50IHhzLCB5cywgeGNzLCB5Y3MsIHhiZSwgeWJlLCB4dGUsIHl0ZTsKLSAgICAgICAgICAgICAgICAgaW50IGNyLCBjYywgeG8sIHlvLCB4Ym8sIHlibywgeHRvLCB5dG87Ci0gICAgICAgICAgICAgICAgICh2b2lkKXZpYS0+dmlhUnVsZSgmdnJuLCAmeHMsICZ5cywgJmJsLCAmY2wsICZ0bCwgJnhjcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ5Y3MsICZ4YmUsICZ5YmUsICZ4dGUsICZ5dGUpOwotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIFZJQVJVTEUgJXNcbiIsIGlnbm9yZVZpYU5hbWVzID8gIlhYWCIgOiB2cm4pOwotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICsgQ1VUU0laRSAlZCAlZFxuIiwgeHMsIHlzKTsKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICArIExBWUVSUyAlcyAlcyAlc1xuIiwgYmwsIGNsLCB0bCk7Ci0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgKyBDVVRTUEFDSU5HICVkICVkXG4iLCB4Y3MsIHljcyk7Ci0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgKyBFTkNMT1NVUkUgJWQgJWQgJWQgJWRcbiIsIHhiZSwgeWJlLCB4dGUsIHl0ZSk7Ci0gICAgICAgICAgICAgICAgIGlmICh2aWEtPmhhc1Jvd0NvbCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICh2b2lkKXZpYS0+cm93Q29sKCZjciwgJmNjKTsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICArIFJPV0NPTCAlZCAlZFxuIiwgY3IsIGNjKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICBpZiAodmlhLT5oYXNPcmlnaW4oKSkgewotICAgICAgICAgICAgICAgICAgICAodm9pZCl2aWEtPm9yaWdpbigmeG8sICZ5byk7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgKyBPUklHSU4gJWQgJWRcbiIsIHhvLCB5byk7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgaWYgKHZpYS0+aGFzT2Zmc2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQpdmlhLT5vZmZzZXQoJnhibywgJnlibywgJnh0bywgJnl0byk7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgKyBPRkZTRVQgJWQgJWQgJWQgJWRcbiIsIHhibywgeWJvLCB4dG8sIHl0byk7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgaWYgKHZpYS0+aGFzQ3V0UGF0dGVybigpKQotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICsgUEFUVEVSTiAnJXMnXG4iLCB2aWEtPmN1dFBhdHRlcm4oKSk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiA7XG4iKTsKLSAgICAgICAgICAgICAtLW51bU9ianM7Ci0gICAgICAgICAgICAgaWYgKG51bU9ianMgPD0gMCkKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiRU5EIFZJQVNcbiIpOwotICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0gIGNhc2UgZGVmclJlZ2lvbkNia1R5cGUgOgotICAgICAgICAgcmUgPSAoZGVmaVJlZ2lvbiopY2w7Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICItICVzICIsIHJlLT5uYW1lKCkpOwotICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJlLT5udW1SZWN0YW5nbGVzKCk7IGkrKykKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlZCAlZCAlZCAlZCBcbiIsIHJlLT54bChpKSwKLSAgICAgICAgICAgICAgICAgICAgIHJlLT55bChpKSwgcmUtPnhoKGkpLAotICAgICAgICAgICAgICAgICAgICAgcmUtPnloKGkpKTsKLSAgICAgICAgIGlmIChyZS0+aGFzVHlwZSgpKQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgVFlQRSAlc1xuIiwgcmUtPnR5cGUoKSk7Ci0gICAgICAgICBpZiAocmUtPm51bVByb3BzKCkpIHsKLSAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmUtPm51bVByb3BzKCk7IGkrKykgewotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIFBST1BFUlRZICVzICVzICIsIHJlLT5wcm9wTmFtZShpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICByZS0+cHJvcFZhbHVlKGkpKTsKLSAgICAgICAgICAgICAgICAgIC8vIEJYIDE4MDkxMCBERUYgcmVhZCBpc3N1ZSAobm90IGhlcmUpCi0gICAgICAgICAgICAgICAgICBzd2l0Y2ggKHJlLT5wcm9wVHlwZShpKSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlICdSJzogZnByaW50Zihmb3V0LCAiUkVBTCAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlICdJJzogZnByaW50Zihmb3V0LCAiSU5URUdFUiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlICdTJzogZnByaW50Zihmb3V0LCAiU1RSSU5HICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1EnOiBmcHJpbnRmKGZvdXQsICJRVU9URVNUUklORyAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlICdOJzogZnByaW50Zihmb3V0LCAiTlVNQkVSICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICI7XG4iKTsgCi0gICAgICAgICAtLW51bU9ianM7Ci0gICAgICAgICBpZiAobnVtT2JqcyA8PSAwKSB7Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiRU5EIFJFR0lPTlNcbiIpOwotICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0gIGNhc2UgZGVmckdyb3VwTmFtZUNia1R5cGUgOgotICAgICAgICAgaWYgKChjaGFyKiljbCkgewotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIi0gJXMiLCAoY2hhciopY2wpOwotICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0gIGNhc2UgZGVmckdyb3VwTWVtYmVyQ2JrVHlwZSA6Ci0gICAgICAgICBpZiAoKGNoYXIqKWNsKSB7Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICVzIiwgKGNoYXIqKWNsKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGJyZWFrOwotICBjYXNlIGRlZnJDb21wb25lbnRNYXNrU2hpZnRMYXllckNia1R5cGUgOgotICAgZnByaW50Zihmb3V0LCAiQ09NUE9ORU5UTUFTS1NISUZUICIpOwotICAgICAgICAKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG1hc2tTaGlmdExheWVyLT5udW1NYXNrU2hpZnRMYXllcnMoKTsgaSsrKSB7Ci0gICAgICAgICAgIGZwcmludGYoZm91dCwgIiVzICIsIG1hc2tTaGlmdExheWVyLT5tYXNrU2hpZnRMYXllcihpKSk7Ci0gICAgICAgIH0gCi0gICAgICAgIGZwcmludGYoZm91dCwgIjtcbiIpOwotICAgYnJlYWs7Ci0gIGNhc2UgZGVmckdyb3VwQ2JrVHlwZSA6Ci0gICAgICAgICBncm91cCA9IChkZWZpR3JvdXAqKWNsOwotICAgICAgICAgaWYgKGdyb3VwLT5oYXNNYXhYKCkgfCBncm91cC0+aGFzTWF4WSgpCi0gICAgICAgICAgICAgfCBncm91cC0+aGFzUGVyaW0oKSkgewotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuICArIFNPRlQgIik7Ci0gICAgICAgICAgICAgaWYgKGdyb3VwLT5oYXNQZXJpbSgpKSAKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTUFYSEFMRlBFUklNRVRFUiAlZCAiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLT5wZXJpbSgpKTsKLSAgICAgICAgICAgICBpZiAoZ3JvdXAtPmhhc01heFgoKSkKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiTUFYWCAlZCAiLCBncm91cC0+bWF4WCgpKTsKLSAgICAgICAgICAgICBpZiAoZ3JvdXAtPmhhc01heFkoKSkgCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIk1BWFkgJWQgIiwgZ3JvdXAtPm1heFkoKSk7Ci0gICAgICAgICB9IAotICAgICAgICAgaWYgKGdyb3VwLT5oYXNSZWdpb25OYW1lKCkpCi0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4gICsgUkVHSU9OICVzICIsIGdyb3VwLT5yZWdpb25OYW1lKCkpOwotICAgICAgICAgaWYgKGdyb3VwLT5oYXNSZWdpb25Cb3goKSkgewotICAgICAgICAgICAgIGludCAqZ3hsLCAqZ3lsLCAqZ3hoLCAqZ3loOwotICAgICAgICAgICAgIGludCBzaXplOwotICAgICAgICAgICAgIGdyb3VwLT5yZWdpb25SZWN0cygmc2l6ZSwgJmd4bCwgJmd5bCwgJmd4aCwgJmd5aCk7Ci0gICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiUkVHSU9OICVkICVkICVkICVkICIsIGd4bFtpXSwgZ3lsW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgIGd4aFtpXSwgZ3loW2ldKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmIChncm91cC0+bnVtUHJvcHMoKSkgewotICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBncm91cC0+bnVtUHJvcHMoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuICArIFBST1BFUlRZICVzICVzICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAtPnByb3BOYW1lKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLT5wcm9wVmFsdWUoaSkpOwotICAgICAgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwLT5wcm9wVHlwZShpKSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlICdSJzogZnByaW50Zihmb3V0LCAiUkVBTCAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlICdJJzogZnByaW50Zihmb3V0LCAiSU5URUdFUiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlICdTJzogZnByaW50Zihmb3V0LCAiU1RSSU5HICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1EnOiBmcHJpbnRmKGZvdXQsICJRVU9URVNUUklORyAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlICdOJzogZnByaW50Zihmb3V0LCAiTlVNQkVSICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICIgO1xuIik7Ci0gICAgICAgICAtLW51bU9ianM7Ci0gICAgICAgICBpZiAobnVtT2JqcyA8PSAwKQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkVORCBHUk9VUFNcbiIpOwotICAgICAgICAgYnJlYWs7Ci0gIGNhc2UgZGVmclNjYW5jaGFpbkNia1R5cGUgOgotICAgICAgICAgc2MgPSAoZGVmaVNjYW5jaGFpbiopY2w7Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICItICVzXG4iLCBzYy0+bmFtZSgpKTsKLSAgICAgICAgIGlmIChzYy0+aGFzU3RhcnQoKSkgewotICAgICAgICAgICAgIHNjLT5zdGFydCgmYTEsICZiMSk7Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICArIFNUQVJUICVzICVzXG4iLCBhMSwgYjEpOwotICAgICAgICAgfQotICAgICAgICAgaWYgKHNjLT5oYXNTdG9wKCkpIHsKLSAgICAgICAgICAgICBzYy0+c3RvcCgmYTEsICZiMSk7Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICArIFNUT1AgJXMgJXNcbiIsIGExLCBiMSk7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoc2MtPmhhc0NvbW1vbkluUGluKCkgfHwKLSAgICAgICAgICAgICBzYy0+aGFzQ29tbW9uT3V0UGluKCkpIHsKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICsgQ09NTU9OU0NBTlBJTlMgIik7Ci0gICAgICAgICAgICAgaWYgKHNjLT5oYXNDb21tb25JblBpbigpKQotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAoIElOICVzICkgIiwgc2MtPmNvbW1vbkluUGluKCkpOwotICAgICAgICAgICAgIGlmIChzYy0+aGFzQ29tbW9uT3V0UGluKCkpCi0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICggT1VUICVzICkgIixzYy0+Y29tbW9uT3V0UGluKCkpOwotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoc2MtPmhhc0Zsb2F0aW5nKCkpIHsKLSAgICAgICAgICAgIHNjLT5mbG9hdGluZygmc2l6ZSwgJmluc3QsICZpblBpbiwgJm91dFBpbiwgJmJpdHMpOwotICAgICAgICAgICAgaWYgKHNpemUgPiAwKQotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgKyBGTE9BVElOR1xuIik7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICAgICVzICIsIGluc3RbaV0pOwotICAgICAgICAgICAgICAgIGlmIChpblBpbltpXSkKLSAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIoIElOICVzICkgIiwgaW5QaW5baV0pOwotICAgICAgICAgICAgICAgIGlmIChvdXRQaW5baV0pCi0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKCBPVVQgJXMgKSAiLCBvdXRQaW5baV0pOwotICAgICAgICAgICAgICAgIGlmIChiaXRzW2ldICE9IC0xKQotICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiggQklUUyAlZCApICIsIGJpdHNbaV0pOwotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGlmIChzYy0+aGFzT3JkZXJlZCgpKSB7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2MtPm51bU9yZGVyZWRMaXN0cygpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzYy0+b3JkZXJlZChpLCAmc2l6ZSwgJmluc3QsICZpblBpbiwgJm91dFBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYml0cyk7Ci0gICAgICAgICAgICAgICAgaWYgKHNpemUgPiAwKQotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICsgT1JERVJFRFxuIik7Ci0gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHNpemU7IGorKykgewotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICAgJXMgIiwgaW5zdFtqXSk7IAotICAgICAgICAgICAgICAgICAgICBpZiAoaW5QaW5bal0pCi0gICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiggSU4gJXMgKSAiLCBpblBpbltqXSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvdXRQaW5bal0pCi0gICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiggT1VUICVzICkgIiwgb3V0UGluW2pdKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJpdHNbal0gIT0gLTEpCi0gICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiggQklUUyAlZCApICIsIGJpdHNbal0pOwotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcbiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLQotICAgICAgICAgaWYgKHNjLT5oYXNQYXJ0aXRpb24oKSkgewotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICArIFBBUlRJVElPTiAlcyAiLAotICAgICAgICAgICAgICAgICAgICBzYy0+cGFydGl0aW9uTmFtZSgpKTsKLSAgICAgICAgICAgIGlmIChzYy0+aGFzUGFydGl0aW9uTWF4Qml0cygpKQotICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJNQVhCSVRTICVkICIsCi0gICAgICAgICAgICAgICAgICAgICAgc2MtPnBhcnRpdGlvbk1heEJpdHMoKSk7Ci0gICAgICAgICB9Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICI7XG4iKTsKLSAgICAgICAgIC0tbnVtT2JqczsKLSAgICAgICAgIGlmIChudW1PYmpzIDw9IDApCi0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiRU5EIFNDQU5DSEFJTlNcbiIpOwotICAgICAgICAgYnJlYWs7Ci0gIGNhc2UgZGVmcklPVGltaW5nQ2JrVHlwZSA6Ci0gICAgICAgICBpb3QgPSAoZGVmaUlPVGltaW5nKiljbDsKLSAgICAgICAgIGZwcmludGYoZm91dCwgIi0gKCAlcyAlcyApXG4iLCBpb3QtPmluc3QoKSwKLSAgICAgICAgICAgICAgICAgaW90LT5waW4oKSk7Ci0gICAgICAgICBpZiAoaW90LT5oYXNTbGV3UmlzZSgpKQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgKyBSSVNFIFNMRVdSQVRFICVnICVnXG4iLAotICAgICAgICAgICAgICAgICAgICAgaW90LT5zbGV3UmlzZU1pbigpLAotICAgICAgICAgICAgICAgICAgICAgaW90LT5zbGV3UmlzZU1heCgpKTsKLSAgICAgICAgIGlmIChpb3QtPmhhc1NsZXdGYWxsKCkpCi0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICArIEZBTEwgU0xFV1JBVEUgJWcgJWdcbiIsCi0gICAgICAgICAgICAgICAgICAgICBpb3QtPnNsZXdGYWxsTWluKCksCi0gICAgICAgICAgICAgICAgICAgICBpb3QtPnNsZXdGYWxsTWF4KCkpOwotICAgICAgICAgaWYgKGlvdC0+aGFzVmFyaWFibGVSaXNlKCkpCi0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICArIFJJU0UgVkFSSUFCTEUgJWcgJWdcbiIsCi0gICAgICAgICAgICAgICAgICAgICBpb3QtPnZhcmlhYmxlUmlzZU1pbigpLAotICAgICAgICAgICAgICAgICAgICAgaW90LT52YXJpYWJsZVJpc2VNYXgoKSk7Ci0gICAgICAgICBpZiAoaW90LT5oYXNWYXJpYWJsZUZhbGwoKSkKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICsgRkFMTCBWQVJJQUJMRSAlZyAlZ1xuIiwKLSAgICAgICAgICAgICAgICAgICAgIGlvdC0+dmFyaWFibGVGYWxsTWluKCksCi0gICAgICAgICAgICAgICAgICAgICBpb3QtPnZhcmlhYmxlRmFsbE1heCgpKTsKLSAgICAgICAgIGlmIChpb3QtPmhhc0NhcGFjaXRhbmNlKCkpCi0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICArIENBUEFDSVRBTkNFICVnXG4iLAotICAgICAgICAgICAgICAgICAgICAgaW90LT5jYXBhY2l0YW5jZSgpKTsKLSAgICAgICAgIGlmIChpb3QtPmhhc0RyaXZlQ2VsbCgpKSB7Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICArIERSSVZFQ0VMTCAlcyAiLAotICAgICAgICAgICAgICAgICAgICAgaW90LT5kcml2ZUNlbGwoKSk7Ci0gICAgICAgICAgICAgaWYgKGlvdC0+aGFzRnJvbSgpKQotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgIEZST01QSU4gJXMgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpb3QtPmZyb20oKSk7Ci0gICAgICAgICAgICAgaWYgKGlvdC0+aGFzVG8oKSkKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICBUT1BJTiAlcyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGlvdC0+dG8oKSk7Ci0gICAgICAgICAgICAgaWYgKGlvdC0+aGFzUGFyYWxsZWwoKSkKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiUEFSQUxMRUwgJWciLAotICAgICAgICAgICAgICAgICAgICAgICAgIGlvdC0+cGFyYWxsZWwoKSk7Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGZwcmludGYoZm91dCwgIjtcbiIpOwotICAgICAgICAgLS1udW1PYmpzOwotICAgICAgICAgaWYgKG51bU9ianMgPD0gMCkKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJFTkQgSU9USU1JTkdTXG4iKTsKLSAgICAgICAgIGJyZWFrOwotICBjYXNlIGRlZnJGUENDYmtUeXBlIDoKLSAgICAgICAgIGZwYyA9IChkZWZpRlBDKiljbDsKLSAgICAgICAgIGZwcmludGYoZm91dCwgIi0gJXMgIiwgZnBjLT5uYW1lKCkpOwotICAgICAgICAgaWYgKGZwYy0+aXNWZXJ0aWNhbCgpKQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlZFUlRJQ0FMICIpOwotICAgICAgICAgaWYgKGZwYy0+aXNIb3Jpem9udGFsKCkpCi0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiSE9SSVpPTlRBTCAiKTsKLSAgICAgICAgIGlmIChmcGMtPmhhc0FsaWduKCkpCi0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiQUxJR04gIik7Ci0gICAgICAgICBpZiAoZnBjLT5oYXNNYXgoKSkKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlZyAiLCBmcGMtPmFsaWduTWF4KCkpOwotICAgICAgICAgaWYgKGZwYy0+aGFzTWluKCkpCi0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJWcgIiwgZnBjLT5hbGlnbk1pbigpKTsKLSAgICAgICAgIGlmIChmcGMtPmhhc0VxdWFsKCkpCi0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJWcgIiwgZnBjLT5lcXVhbCgpKTsKLSAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmcGMtPm51bVBhcnRzKCk7IGkrKykgewotICAgICAgICAgICAgIGZwYy0+Z2V0UGFydChpLCAmY29ybmVyLCAmdHlwLCAmbmFtZSk7Ci0gICAgICAgICAgICAgaWYgKGNvcm5lciA9PSAnQicpCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkJPVFRPTUxFRlQgIik7Ci0gICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJUT1BSSUdIVCAiKTsKLSAgICAgICAgICAgICBpZiAodHlwID09ICdSJykKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiUk9XUyAlcyAiLCBuYW1lKTsKLSAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkNPTVBTICVzICIsIG5hbWUpOwotICAgICAgICAgfQotICAgICAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0gICAgICAgICAtLW51bU9ianM7Ci0gICAgICAgICBpZiAobnVtT2JqcyA8PSAwKQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkVORCBGTE9PUlBMQU5DT05TVFJBSU5UU1xuIik7Ci0gICAgICAgICBicmVhazsKLSAgY2FzZSBkZWZyVGltaW5nRGlzYWJsZUNia1R5cGUgOgotICAgICAgICAgdGQgPSAoZGVmaVRpbWluZ0Rpc2FibGUqKWNsOwotICAgICAgICAgaWYgKHRkLT5oYXNGcm9tVG8oKSkKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICItIEZST01QSU4gJXMgJXMgIiwKLSAgICAgICAgICAgICAgICAgICAgIHRkLT5mcm9tSW5zdCgpLAotICAgICAgICAgICAgICAgICAgICAgdGQtPmZyb21QaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgIHRkLT50b0luc3QoKSwKLSAgICAgICAgICAgICAgICAgICAgIHRkLT50b1BpbigpKTsKLSAgICAgICAgIGlmICh0ZC0+aGFzVGhydSgpKQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIi0gVEhSVVBJTiAlcyAlcyAiLAotICAgICAgICAgICAgICAgICAgICAgdGQtPnRocnVJbnN0KCksCi0gICAgICAgICAgICAgICAgICAgICB0ZC0+dGhydVBpbigpKTsKLSAgICAgICAgIGlmICh0ZC0+aGFzTWFjcm9Gcm9tVG8oKSkKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICItIE1BQ1JPICVzIEZST01QSU4gJXMgJXMgIiwKLSAgICAgICAgICAgICAgICAgICAgIHRkLT5tYWNyb05hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgIHRkLT5mcm9tUGluKCksCi0gICAgICAgICAgICAgICAgICAgICB0ZC0+dG9QaW4oKSk7Ci0gICAgICAgICBpZiAodGQtPmhhc01hY3JvVGhydSgpKQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIi0gTUFDUk8gJXMgVEhSVVBJTiAlcyAlcyAiLAotICAgICAgICAgICAgICAgICAgICAgdGQtPm1hY3JvTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgdGQtPmZyb21QaW4oKSk7Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICI7XG4iKTsKLSAgICAgICAgIGJyZWFrOwotICBjYXNlIGRlZnJQYXJ0aXRpb25DYmtUeXBlIDoKLSAgICAgICAgIHBhcnQgPSAoZGVmaVBhcnRpdGlvbiopY2w7Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICItICVzICIsIHBhcnQtPm5hbWUoKSk7Ci0gICAgICAgICBpZiAocGFydC0+aXNTZXR1cFJpc2UoKSB8Ci0gICAgICAgICAgICAgcGFydC0+aXNTZXR1cEZhbGwoKSB8Ci0gICAgICAgICAgICAgcGFydC0+aXNIb2xkUmlzZSgpIHwKLSAgICAgICAgICAgICBwYXJ0LT5pc0hvbGRGYWxsKCkpIHsKLSAgICAgICAgICAgICAvLyBoYXMgdHVybm9mZiAKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJUVVJOT0ZGICIpOyAKLSAgICAgICAgICAgICBpZiAocGFydC0+aXNTZXR1cFJpc2UoKSkKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiU0VUVVBSSVNFICIpOyAKLSAgICAgICAgICAgICBpZiAocGFydC0+aXNTZXR1cEZhbGwoKSkKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiU0VUVVBGQUxMICIpOyAKLSAgICAgICAgICAgICBpZiAocGFydC0+aXNIb2xkUmlzZSgpKQotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJIT0xEUklTRSAiKTsgCi0gICAgICAgICAgICAgaWYgKHBhcnQtPmlzSG9sZEZhbGwoKSkKLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiSE9MREZBTEwgIik7IAotICAgICAgICAgfQotICAgICAgICAgaXRlbVQgPSBwYXJ0LT5pdGVtVHlwZSgpOwotICAgICAgICAgZGlyID0gcGFydC0+ZGlyZWN0aW9uKCk7Ci0gICAgICAgICBpZiAoc3RyY21wKGl0ZW1ULCAiQ0xPQ0siKSA9PSAwKSB7Ci0gICAgICAgICAgICAgaWYgKGRpciA9PSAnVCcpICAgIC8vIHRvY2xvY2twaW4KLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBUT0NMT0NLUElOICVzICVzICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGFydC0+aW5zdE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LT5waW5OYW1lKCkpOwotICAgICAgICAgICAgIGlmIChkaXIgPT0gJ0YnKSAgICAvLyBmcm9tY2xvY2twaW4KLSAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiKyBGUk9NQ0xPQ0tQSU4gJXMgJXMgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LT5pbnN0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQtPnBpbk5hbWUoKSk7Ci0gICAgICAgICAgICAgaWYgKHBhcnQtPmhhc01pbigpKQotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJNSU4gJWcgJWcgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LT5wYXJ0aXRpb25NaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LT5wYXJ0aXRpb25NYXgoKSk7Ci0gICAgICAgICAgICAgaWYgKHBhcnQtPmhhc01heCgpKQotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJNQVggJWcgJWcgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LT5wYXJ0aXRpb25NaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LT5wYXJ0aXRpb25NYXgoKSk7Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiUElOUyAiKTsKLSAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFydC0+bnVtUGlucygpOyBpKyspCi0gICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlcyAiLCBwYXJ0LT5waW4oaSkpOwotICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoaXRlbVQsICJJTyIpID09IDApIHsKLSAgICAgICAgICAgICBpZiAoZGlyID09ICdUJykgICAgLy8gdG9pb3BpbgotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIFRPSU9QSU4gJXMgJXMgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LT5pbnN0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQtPnBpbk5hbWUoKSk7Ci0gICAgICAgICAgICAgaWYgKGRpciA9PSAnRicpICAgIC8vIGZyb21pb3BpbgotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIEZST01JT1BJTiAlcyAlcyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQtPmluc3ROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGFydC0+cGluTmFtZSgpKTsKLSAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGl0ZW1ULCAiQ09NUCIpID09IDApIHsKLSAgICAgICAgICAgICBpZiAoZGlyID09ICdUJykgICAgLy8gdG9jb21wcGluCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIisgVE9DT01QUElOICVzICVzICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGFydC0+aW5zdE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LT5waW5OYW1lKCkpOwotICAgICAgICAgICAgIGlmIChkaXIgPT0gJ0YnKSAgICAvLyBmcm9tY29tcHBpbgotICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIrIEZST01DT01QUElOICVzICVzICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGFydC0+aW5zdE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LT5waW5OYW1lKCkpOwotICAgICAgICAgfQotICAgICAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0gICAgICAgICAtLW51bU9ianM7Ci0gICAgICAgICBpZiAobnVtT2JqcyA8PSAwKQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkVORCBQQVJUSVRJT05TXG4iKTsKLSAgICAgICAgIGJyZWFrOwotCi0gIGNhc2UgZGVmclBpblByb3BDYmtUeXBlIDoKLSAgICAgICAgIHBwcm9wID0gKGRlZmlQaW5Qcm9wKiljbDsKLSAgICAgICAgIGlmIChwcHJvcC0+aXNQaW4oKSkKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIi0gUElOICVzICIsIHBwcm9wLT5waW5OYW1lKCkpOwotICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIi0gJXMgJXMgIiwKLSAgICAgICAgICAgICAgICAgICAgcHByb3AtPmluc3ROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIHBwcm9wLT5waW5OYW1lKCkpOwotICAgICAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0gICAgICAgICBpZiAocHByb3AtPm51bVByb3BzKCkgPiAwKSB7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHByb3AtPm51bVByb3BzKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgKyBQUk9QRVJUWSAlcyAlcyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgcHByb3AtPnByb3BOYW1lKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgcHByb3AtPnByb3BWYWx1ZShpKSk7Ci0gICAgICAgICAgICAgICAgLy8gQlggMTgwOTEwIERFRiByZWFkIGlzc3VlIChub3QgdGhpcy4uKQotICAgICAgICAgICAgICAgIHN3aXRjaCAocHByb3AtPnByb3BUeXBlKGkpKSB7Ci0gICAgICAgICAgICAgICAgICAgY2FzZSAnUic6IGZwcmludGYoZm91dCwgIlJFQUwgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgIGNhc2UgJ0knOiBmcHJpbnRmKGZvdXQsICJJTlRFR0VSICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICBjYXNlICdTJzogZnByaW50Zihmb3V0LCAiU1RSSU5HICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICBjYXNlICdRJzogZnByaW50Zihmb3V0LCAiUVVPVEVTVFJJTkcgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgIGNhc2UgJ04nOiBmcHJpbnRmKGZvdXQsICJOVU1CRVIgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIjtcbiIpOwotICAgICAgICAgfQotICAgICAgICAgLS1udW1PYmpzOwotICAgICAgICAgaWYgKG51bU9ianMgPD0gMCkKLSAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJFTkQgUElOUFJPUEVSVElFU1xuIik7Ci0gICAgICAgICBicmVhazsKLSAgY2FzZSBkZWZyQmxvY2thZ2VDYmtUeXBlIDoKLSAgICAgICAgIGJsb2NrID0gKGRlZmlCbG9ja2FnZSopY2w7Ci0gICAgICAgICBpZiAodGVzdERlYnVnUHJpbnQpIHsKLSAgICAgICAgICAgICBibG9jay0+cHJpbnQoZm91dCk7Ci0gICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgIGlmIChibG9jay0+aGFzTGF5ZXIoKSkgewotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIi0gTEFZRVIgJXNcbiIsIGJsb2NrLT5sYXllck5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJsb2NrLT5oYXNDb21wb25lbnQoKSkKLSAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICArIENPTVBPTkVOVCAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLT5sYXllckNvbXBvbmVudE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJsb2NrLT5oYXNTbG90cygpKQotICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgICsgU0xPVFNcbiIpOwotICAgICAgICAgICAgICAgIGlmIChibG9jay0+aGFzRmlsbHMoKSkKLSAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICArIEZJTExTXG4iKTsKLSAgICAgICAgICAgICAgICBpZiAoYmxvY2stPmhhc1B1c2hkb3duKCkpCi0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICAgKyBQVVNIRE9XTlxuIik7Ci0gICAgICAgICAgICAgICAgaWYgKGJsb2NrLT5oYXNFeGNlcHRwZ25ldCgpKQotICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgICsgRVhDRVBUUEdORVRcbiIpOwotICAgICAgICAgICAgICAgIGlmIChibG9jay0+aGFzTWFzaygpKQotICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgICsgTUFTSyAlZFxuIiwgYmxvY2stPm1hc2soKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJsb2NrLT5oYXNTcGFjaW5nKCkpCi0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICAgKyBTUEFDSU5HICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2stPm1pblNwYWNpbmcoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJsb2NrLT5oYXNEZXNpZ25SdWxlV2lkdGgoKSkKLSAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICArIERFU0lHTlJVTEVXSURUSCAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLT5kZXNpZ25SdWxlV2lkdGgoKSk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGVsc2UgaWYgKGJsb2NrLT5oYXNQbGFjZW1lbnQoKSkgewotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIi0gUExBQ0VNRU5UXG4iKTsKLSAgICAgICAgICAgICAgICBpZiAoYmxvY2stPmhhc1NvZnQoKSkKLSAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICArIFNPRlRcbiIpOwotICAgICAgICAgICAgICAgIGlmIChibG9jay0+aGFzUGFydGlhbCgpKQotICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgICsgUEFSVElBTCAlZ1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLT5wbGFjZW1lbnRNYXhEZW5zaXR5KCkpOwotICAgICAgICAgICAgICAgIGlmIChibG9jay0+aGFzQ29tcG9uZW50KCkpCi0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICAgKyBDT01QT05FTlQgJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jay0+cGxhY2VtZW50Q29tcG9uZW50TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoYmxvY2stPmhhc1B1c2hkb3duKCkpCi0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICAgKyBQVVNIRE9XTlxuIik7Ci0gICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGJsb2NrLT5udW1SZWN0YW5nbGVzKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgIFJFQ1QgJWQgJWQgJWQgJWRcbiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2stPnhsKGkpLCBibG9jay0+eWwoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICBibG9jay0+eGgoaSksIGJsb2NrLT55aChpKSk7Ci0gICAgICAgICAgICAgfSAKLQotICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBibG9jay0+bnVtUG9seWdvbnMoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICAgUE9MWUdPTiAiKTsKLSAgICAgICAgICAgICAgICBwb2ludHMgPSBibG9jay0+Z2V0UG9seWdvbihpKTsKLSAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcG9pbnRzLm51bVBvaW50czsgaisrKQotICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiVkICVkICIsIHBvaW50cy54W2pdLCBwb2ludHMueVtqXSk7Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0gICAgICAgICAgICAgLS1udW1PYmpzOwotICAgICAgICAgICAgIGlmIChudW1PYmpzIDw9IDApCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkVORCBCTE9DS0FHRVNcbiIpOwotICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0gIGNhc2UgZGVmclNsb3RDYmtUeXBlIDoKLSAgICAgICAgIHNsb3RzID0gKGRlZmlTbG90KiljbDsKLSAgICAgICAgIGlmIChzbG90cy0+aGFzTGF5ZXIoKSkKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIi0gTEFZRVIgJXNcbiIsIHNsb3RzLT5sYXllck5hbWUoKSk7Ci0KLSAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzbG90cy0+bnVtUmVjdGFuZ2xlcygpOyBpKyspIHsKLSAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiAgIFJFQ1QgJWQgJWQgJWQgJWRcbiIsIAotICAgICAgICAgICAgICAgICAgICBzbG90cy0+eGwoaSksIHNsb3RzLT55bChpKSwKLSAgICAgICAgICAgICAgICAgICAgc2xvdHMtPnhoKGkpLCBzbG90cy0+eWgoaSkpOwotICAgICAgICAgfSAKLSAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzbG90cy0+bnVtUG9seWdvbnMoKTsgaSsrKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICBQT0xZR09OICIpOwotICAgICAgICAgICAgcG9pbnRzID0gc2xvdHMtPmdldFBvbHlnb24oaSk7Ci0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcG9pbnRzLm51bVBvaW50czsgaisrKQotICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlZCAlZCAiLCBwb2ludHMueFtqXSwgcG9pbnRzLnlbal0pOwotICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0gICAgICAgICB9Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICI7XG4iKTsKLSAgICAgICAgIC0tbnVtT2JqczsKLSAgICAgICAgIGlmIChudW1PYmpzIDw9IDApCi0gICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiRU5EIFNMT1RTXG4iKTsKLSAgICAgICAgIGJyZWFrOwotICBjYXNlIGRlZnJGaWxsQ2JrVHlwZSA6Ci0gICAgICAgICBmaWxscyA9IChkZWZpRmlsbCopY2w7Ci0gICAgICAgICBpZiAodGVzdERlYnVnUHJpbnQpIHsKLSAgICAgICAgICAgICAgZmlsbHMtPnByaW50KGZvdXQpOwotICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICBpZiAoZmlsbHMtPmhhc0xheWVyKCkpIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICItIExBWUVSICVzIiwgZmlsbHMtPmxheWVyTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsbHMtPmxheWVyTWFzaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiArIE1BU0sgJWQiLCBmaWxscy0+bGF5ZXJNYXNrKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZmlsbHMtPmhhc0xheWVyT3BjKCkpCi0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICsgT1BDIik7Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmaWxscy0+bnVtUmVjdGFuZ2xlcygpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICBSRUNUICVkICVkICVkICVkXG4iLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxzLT54bChpKSwgZmlsbHMtPnlsKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbHMtPnhoKGkpLCBmaWxscy0+eWgoaSkpOwotICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGZpbGxzLT5udW1Qb2x5Z29ucygpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgICBQT0xZR09OICIpOyAKLSAgICAgICAgICAgICAgICAgICBwb2ludHMgPSBmaWxscy0+Z2V0UG9seWdvbihpKTsKLSAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcG9pbnRzLm51bVBvaW50czsgaisrKQotICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiJWQgJWQgIiwgcG9pbnRzLnhbal0sIHBvaW50cy55W2pdKTsKLSAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICI7XG4iKTsKLSAgICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIjtcbiIpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAtLW51bU9ianM7Ci0gICAgICAgICAgICAgaWYgKGZpbGxzLT5oYXNWaWEoKSkgewotICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIi0gVklBICVzIiwgZmlsbHMtPnZpYU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGxzLT52aWFUb3BNYXNrKCkgfHwgZmlsbHMtPnZpYUN1dE1hc2soKQotICAgICAgICAgICAgICAgICAgICB8fCBmaWxscy0+dmlhQm90dG9tTWFzaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIiArIE1BU0sgJWQlZCVkIiwgCi0gICAgICAgICAgICAgICAgICAgIGZpbGxzLT52aWFUb3BNYXNrKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxscy0+dmlhQ3V0TWFzaygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbHMtPnZpYUJvdHRvbU1hc2soKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChmaWxscy0+aGFzVmlhT3BjKCkpCi0gICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiICsgT1BDIik7Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG4iKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmaWxscy0+bnVtVmlhUHRzKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgIHBvaW50cyA9IGZpbGxzLT5nZXRWaWFQdHMoaSk7Ci0gICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBvaW50cy5udW1Qb2ludHM7IGorKykKLSAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIgJWQgJWQiLCBwb2ludHMueFtqXSwgcG9pbnRzLnlbal0pOwotICAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIjtcbiIpOyAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGlmIChudW1PYmpzIDw9IDApCi0gICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkVORCBGSUxMU1xuIik7Ci0gICAgICAgICB9Ci0gICAgICAgICBicmVhazsKLSAgY2FzZSBkZWZyU3R5bGVzQ2JrVHlwZSA6Ci0gICAgICAgICBzdHJ1Y3QgZGVmaVBvaW50cyBwb2ludHM7Ci0gICAgICAgICBzdHlsZXMgPSAoZGVmaVN0eWxlcyopY2w7Ci0gICAgICAgICBmcHJpbnRmKGZvdXQsICItIFNUWUxFICVkICIsIHN0eWxlcy0+c3R5bGUoKSk7Ci0gICAgICAgICBwb2ludHMgPSBzdHlsZXMtPmdldFBvbHlnb24oKTsKLSAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwb2ludHMubnVtUG9pbnRzOyBqKyspCi0gICAgICAgICAgICBmcHJpbnRmKGZvdXQsICIlZCAlZCAiLCBwb2ludHMueFtqXSwgcG9pbnRzLnlbal0pOwotICAgICAgICAgZnByaW50Zihmb3V0LCAiO1xuIik7Ci0gICAgICAgICAtLW51bU9ianM7Ci0gICAgICAgICBpZiAobnVtT2JqcyA8PSAwKQotICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIkVORCBTVFlMRVNcbiIpOwotICAgICAgICAgYnJlYWs7Ci0KLSAgZGVmYXVsdDogZnByaW50Zihmb3V0LCAiQk9HVVMgY2FsbGJhY2sgdG8gY2xzLlxuIik7IHJldHVybiAxOwotICB9Ci0gIHJldHVybiAwOwotfQotCi0KLWludCBkbihkZWZyQ2FsbGJhY2tUeXBlX2UgYywgY29uc3QgY2hhciogaCwgZGVmaVVzZXJEYXRhIHVkKSB7Ci0gIGNoZWNrVHlwZShjKTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLSAgZnByaW50Zihmb3V0LCAiRElWSURFUkNIQVIgXCIlc1wiIDtcbiIsaCk7Ci0gIHJldHVybiAwOwotfQotCi0KLWludCBleHQoZGVmckNhbGxiYWNrVHlwZV9lIHQsIGNvbnN0IGNoYXIqIGMsIGRlZmlVc2VyRGF0YSB1ZCkgewotICBjaGFyKiBuYW1lOwotCi0gIGNoZWNrVHlwZSh0KTsKLSAgaWYgKHVkICE9IHVzZXJEYXRhKSBkYXRhRXJyb3IoKTsKLQotICBzd2l0Y2ggKHQpIHsKLSAgY2FzZSBkZWZyTmV0RXh0Q2JrVHlwZSA6IG5hbWUgPSBhZGRyZXNzKCJuZXQiKTsgYnJlYWs7Ci0gIGNhc2UgZGVmckNvbXBvbmVudEV4dENia1R5cGUgOiBuYW1lID0gYWRkcmVzcygiY29tcG9uZW50Iik7IGJyZWFrOwotICBjYXNlIGRlZnJQaW5FeHRDYmtUeXBlIDogbmFtZSA9IGFkZHJlc3MoInBpbiIpOyBicmVhazsKLSAgY2FzZSBkZWZyVmlhRXh0Q2JrVHlwZSA6IG5hbWUgPSBhZGRyZXNzKCJ2aWEiKTsgYnJlYWs7Ci0gIGNhc2UgZGVmck5ldENvbm5lY3Rpb25FeHRDYmtUeXBlIDogbmFtZSA9IGFkZHJlc3MoIm5ldCBjb25uZWN0aW9uIik7IGJyZWFrOwotICBjYXNlIGRlZnJHcm91cEV4dENia1R5cGUgOiBuYW1lID0gYWRkcmVzcygiZ3JvdXAiKTsgYnJlYWs7Ci0gIGNhc2UgZGVmclNjYW5DaGFpbkV4dENia1R5cGUgOiBuYW1lID0gYWRkcmVzcygic2NhbmNoYWluIik7IGJyZWFrOwotICBjYXNlIGRlZnJJb1RpbWluZ3NFeHRDYmtUeXBlIDogbmFtZSA9IGFkZHJlc3MoImlvIHRpbWluZyIpOyBicmVhazsKLSAgY2FzZSBkZWZyUGFydGl0aW9uc0V4dENia1R5cGUgOiBuYW1lID0gYWRkcmVzcygicGFydGl0aW9uIik7IGJyZWFrOwotICBkZWZhdWx0OiBuYW1lID0gYWRkcmVzcygiQk9HVVMiKTsgcmV0dXJuIDE7Ci0gIH0KLSAgZnByaW50Zihmb3V0LCAiICAlcyBleHRlbnNpb24gJXNcbiIsIG5hbWUsIGMpOwotICByZXR1cm4gMDsKLX0KLQotaW50IGV4dGVuc2lvbihkZWZyQ2FsbGJhY2tUeXBlX2UgYywgY29uc3QgY2hhciogZXh0c24sIGRlZmlVc2VyRGF0YSB1ZCkgewotICBjaGVja1R5cGUoYyk7Ci0gIGlmICh1ZCAhPSB1c2VyRGF0YSkgZGF0YUVycm9yKCk7Ci0gIGZwcmludGYoZm91dCwgIkJFR0lORVhUICVzXG4iLCBleHRzbik7Ci0gIHJldHVybiAwOwotfQotCi12b2lkKiBtYWxsb2NDQihzaXplX3Qgc2l6ZSkgewotICByZXR1cm4gbWFsbG9jKHNpemUpOwotfQotCi12b2lkKiByZWFsbG9jQ0Iodm9pZCogbmFtZSwgc2l6ZV90IHNpemUpIHsKLSAgcmV0dXJuIHJlYWxsb2MobmFtZSwgc2l6ZSk7Ci19Ci0KLXZvaWQgZnJlZUNCKHZvaWQqIG5hbWUpIHsKLSAgZnJlZShuYW1lKTsKLSAgcmV0dXJuOwotfQotCi0KLUJFR0lOX0xFRkRFRl9QQVJTRVJfTkFNRVNQQUNFCi1leHRlcm4gbG9uZyBsb25nIG5saW5lczsKLUVORF9MRUZERUZfUEFSU0VSX05BTUVTUEFDRQotc3RhdGljIGludCBjY3IxMTMxNDQ0ID0gMDsKLQotdm9pZCBsaW5lTnVtYmVyQ0IobG9uZyBsb25nIGxpbmVObykgewotCi0gICAgLy8gVGhlIENDUiAxMTMxNDQ0IHRlc3RzIGFiaWxpdHkgb2YgdGhlIERFRiBwYXJzZXIgdG8gY291bnQgCi0gICAgLy8gaW5wdXQgbGluZSBudW1iZXJzIG91dCBvZiAzMi1iaXQgaW50IHJhbmdlLiBPbiB0aGUgZmlyc3QgY2FsbGJhY2sgCi0gICAgLy8gY2FsbCAxMEcgbGluZXMgd2lsbCBiZSBhZGRlZCB0byBsaW5lIGNvdW50ZXIuIEl0IHNob3VsZCBiZSAKLSAgICAvLyByZWZsZWN0ZWQgaW4gb3V0cHV0LgotICAgIGlmIChjY3IxMTMxNDQ0KSB7Ci0gICAgICAgIGxpbmVObyArPSAxMDAwMDAwMDAwMExMOwotICAgICAgICBkZWZyU2V0TkxpbmVzKGxpbmVObyk7Ci0gICAgICAgIGNjcjExMzE0NDQgPSAwOwotICAgIH0KLQotI2lmZGVmIF9XSU4zMgotICAvLyBmcHJpbnRmKGZvdXQsICJQYXJzZWQgJUk2NGQgbnVtYmVyIG9mIGxpbmVzISFcbiIsIGxpbmVObyk7Ci0jZWxzZSAKLSAgLy8gZnByaW50Zihmb3V0LCAiUGFyc2VkICVsbGQgbnVtYmVyIG9mIGxpbmVzISFcbiIsIGxpbmVObyk7Ci0jZW5kaWYKLX0KLQotaW50IHVuVXNlZENCKGRlZnJDYWxsYmFja1R5cGVfZSwgdm9pZCosIGRlZmlVc2VyRGF0YSkgewotICBmcHJpbnRmKGZvdXQsICJUaGlzIGNhbGxiYWNrIGlzIG5vdCB1c2VkLlxuIik7Ci0gIHJldHVybiAwOwotfQotCi12b2lkIHByaW50V2FybmluZyhjb25zdCBjaGFyICpzdHIpCi17Ci0gICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgc3RyKTsKLX0KLQotaW50IGlvOjpXcml0ZXI6OndyaXRlRGVmKGJvb2wgaXNUQSwgY29uc3Qgc3RkOjpzdHJpbmcgJnN0cikgewotICAvL2ludCBudW0gPSA5OTsKLSAgY2hhciogaW5GaWxlWzZdOwotICAvL2NoYXIqIG91dEZpbGU7Ci0gIEZJTEUqIGY7Ci0gIGludCByZXM7Ci0gIGludCBub0NhbGxzID0gMDsKLS8vICBsb25nIHN0YXJ0X21lbTsKLSAgLy9pbnQgcmV0U3RyID0gMDsKLSAgaW50IG51bUluRmlsZSA9IDA7Ci0gIGludCBmaWxlQ3QgPSAwOwotICBpbnQgdGVzdDEgPSAwOwotICBpbnQgdGVzdDIgPSAwOwotICBpbnQgbm9OZXRDYiA9IDA7Ci0gIGludCBjY3I3NDk4NTMgPSAwOwotICBpbnQgbGluZV9udW1fcHJpbnRfaW50ZXJ2YWwgPSA1MDsKLQotI2lmZGVmIFdJTjMyCi0gICAgLy8gRW5hYmxlIHR3by1kaWdpdCBleHBvbmVudCBmb3JtYXQKLSAgICBfc2V0X291dHB1dF9mb3JtYXQoX1RXT19ESUdJVF9FWFBPTkVOVCk7Ci0jZW5kaWYKLQotLy8gIHN0YXJ0X21lbSA9IChsb25nKXNicmsoMCk7Ci0KLSAgLy8gaW5GaWxlWzBdID0gZGVmYXVsdE5hbWU7Ci0gIGNoYXIgKmNzdHIgPSBuZXcgY2hhcltERUZfRklMRS5sZW5ndGgoKSArIDFdOwotICBzdHJjcHkoY3N0ciwgREVGX0ZJTEUuY19zdHIoKSk7Ci0gIGluRmlsZVtudW1JbkZpbGUrK10gPSBjc3RyOwotICAvLyBzdGQ6OmNvdXQgPDwgaW5GaWxlWzBdIDw8IHN0ZDo6ZW5kbDsKLSAgLy9vdXRGaWxlID0gZGVmYXVsdE91dDsKLSAgLy8gZm91dCA9IHN0ZG91dDsKLSAgaWYgKGlzVEEpIHsKLSAgICBmb3V0ID0gZm9wZW4oT1VUVEFfRklMRS5jX3N0cigpLCAidyIpOwotICB9IGVsc2UgewotICAgIGZvdXQgPSBmb3BlbigoT1VUX0ZJTEUrc3RyKS5jX3N0cigpLCAidyIpOwotICB9Ci0gIHVzZXJEYXRhID0gdGhpczsKLQotICAvLyB3aGlsZSAoYXJnYy0tKSB7Ci0gIC8vICAgaWYgKHN0cmNtcCgqYXJndiwgIi1kIikgPT0gMCkgewotICAvLyAgICAgYXJndisrOwotICAvLyAgICAgYXJnYy0tOwotICAvLyAgICAgc3NjYW5mKCphcmd2LCAiJWQiLCAmbnVtKTsKLSAgLy8gICAgIGRlZmlTZXREZWJ1ZyhudW0sIDEpOwotICAvLyAgIH0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLW5jIikgPT0gMCkgewotICAvLyAgICAgbm9DYWxscyA9IDE7Ci0gIC8vICAgfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItbyIpID09IDApIHsKLSAgLy8gICAgIGFyZ3YrKzsKLSAgLy8gICAgIGFyZ2MtLTsKLSAgLy8gICAgIG91dEZpbGUgPSAqYXJndjsKLSAgLy8gICAgIGlmICgoZm91dCA9IGZvcGVuKG91dEZpbGUsICJ3IikpID09IDApIHsKLSAgLy8gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBjb3VsZCBub3Qgb3BlbiBvdXRwdXQgZmlsZVxuIik7Ci0gIC8vICAgICAgICAgcmV0dXJuIDI7Ci0gIC8vICAgICAgIH0KLSAgLy8gICB9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi12ZXJTdHIiKSA9PSAwKSB7Ci0gIC8vICAgICAgIC8qIE5ldyB0byBzZXQgdGhlIHZlcnNpb24gY2FsbGJhY2sgcm91dGluZSB0byByZXR1cm4gYSBzdHJpbmcgICAgKi8KLSAgLy8gICAgICAgLyogaW5zdGVhZCBvZiBkb3VibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvLyAgICAgICByZXRTdHIgPSAxOwotICAvLyAgIH0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLWkiKSA9PSAwKSB7Ci0gIC8vICAgICAgIGFyZ3YrKzsKLSAgLy8gICAgICAgYXJnYy0tOwotICAvLyAgICAgICBsaW5lX251bV9wcmludF9pbnRlcnZhbCA9IGF0b2koKmFyZ3YpOwotICAvLyAgIH0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLXRlc3QxIikgPT0gMCkgewotICAvLyAgICAgdGVzdDEgPSAxOwotICAvLyAgIH0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLXRlc3QyIikgPT0gMCkgewotICAvLyAgICAgdGVzdDIgPSAxOwotICAvLyAgIH0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLW5vTmV0IikgPT0gMCkgewotICAvLyAgICAgbm9OZXRDYiA9IDE7Ci0gIC8vICAgfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItY2NyNzQ5ODUzIikgPT0gMCkgewotICAvLyAgICAgY2NyNzQ5ODUzID0gMTsKLSAgLy8gICB9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1jY3IxMTMxNDQ0IikgPT0gMCkgewotICAvLyAgICAgICBjY3IxMTMxNDQ0ID0gMTsKLSAgLy8gICB9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi10ZXN0RGVidWdQcmludCIpID09IDApIHsKLSAgLy8gICAgICAgdGVzdERlYnVnUHJpbnQgPSAxOwotICAvLyAgIH0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLXNlc3Npb25sZXNzIikgPT0gMCkgewotICAvLyAgICAgICBpc1Nlc3Npb25sZXNzID0gMTsKLSAgLy8gICB9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1pZ25vcmVSb3dOYW1lcyIpID09IDApIHsKLSAgLy8gICAgICAgaWdub3JlUm93TmFtZXMgPSAxOwotICAvLyAgIH0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLWlnbm9yZVZpYU5hbWVzIikgPT0gMCkgewotICAvLyAgICAgICAgIGlnbm9yZVZpYU5hbWVzID0gMTsKLSAgLy8gICB9IGVsc2UgaWYgKGFyZ3ZbMF1bMF0gIT0gJy0nKSB7Ci0gIC8vICAgICBpZiAobnVtSW5GaWxlID49IDYpIHsKLSAgLy8gICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogdG9vIG1hbnkgaW5wdXQgZmlsZXMsIG1heCA9IDYuXG4iKTsKLSAgLy8gICAgICAgcmV0dXJuIDI7Ci0gIC8vICAgICB9Ci0gIC8vICAgICBpbkZpbGVbbnVtSW5GaWxlKytdID0gKmFyZ3Y7Ci0gIC8vICAgfSBlbHNlIGlmICgoc3RyY21wKCphcmd2LCAiLWgiKSA9PSAwKSB8fCAoc3RyY21wKCphcmd2LCAiLS1oZWxwIikgPT0gMCkpIHsKLSAgLy8gICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGRlZnJ3ICg8b3B0aW9uPnw8ZmlsZT4pKiBcbiIpOwotICAvLyAgICAgZnByaW50ZihzdGRlcnIsICJGaWxlczpcbiIpOwotICAvLyAgICAgZnByaW50ZihzdGRlcnIsICJcdHVwdG8gNiBERUYgZmlsZXMgbWFueSBiZSBzdXBwbGllZC5cbiIpOwotICAvLyAgICAgZnByaW50ZihzdGRlcnIsICJcdGlmIDxkZWZGaWxlTmFtZT4gaXMgc2V0IHRvICdTVERJTicgLSB0YWtlcyBkYXRhIGZyb20gc3RkaW4uXG4iKTsKLSAgLy8gICAgIGZwcmludGYoc3RkZXJyLCAiT3B0aW9uczpcbiIpOwotICAvLyAgICAgZnByaW50ZihzdGRlcnIsICJcdC1pIDxudW1fbGluZXM+IC0tIHNldHMgcHJvY2Vzc2luZyBtc2cgaW50ZXJ2YWwgKGRlZmF1bHQ6IDUwIGxpbmVzKS5cbiIpOwotICAvLyAgICAgZnByaW50ZihzdGRlcnIsICJcdC1uYyAgICAgICAgICAgIC0tIG5vIGZ1bmN0aW9uYWwgY2FsbGJhY2tzIHdpbGwgYmUgY2FsbGVkLlxuIik7Ci0gIC8vICAgICBmcHJpbnRmKHN0ZGVyciwgIlx0LW8gPG91dF9maWxlPiAgLS0gd3JpdGUgb3V0cHV0IHRvIHRoZSBmaWxlLlxuIik7Ci0gIC8vICAgICBmcHJpbnRmKHN0ZGVyciwgIlx0LWlnbm9yZVJvd05hbWVzICAgLS0gZG9uJ3Qgb3V0cHV0IHJvdyBuYW1lcy5cbiIpOwotICAvLyAgICAgZnByaW50ZihzdGRlcnIsICJcdC1pZ25vcmVWaWFOYW1lcyAgIC0tIGRvbid0IG91dHB1dCB2aWEgbmFtZXMuXG4iKTsKLSAgLy8gICAgIHJldHVybiAyOwotICAvLyAgIH0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLXNldFNOZXRXaXJlQ2JrIikgPT0gMCkgewotICAvLyAgICAgc2V0U05ldFdpcmVDYmsgPSAxOwotICAvLyAgIH0gZWxzZSB7Ci0gIC8vICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBJbGxlZ2FsIGNvbW1hbmQgbGluZSBvcHRpb246ICclcydcbiIsICphcmd2KTsKLSAgLy8gICAgIHJldHVybiAyOwotICAvLyAgIH0KLQotICAvLyAgIGFyZ3YrKzsKLSAgLy8gfQotCi0KLQotICAvL2RlZnJTZXRMb2dGdW5jdGlvbihteUxvZ0Z1bmN0aW9uKTsKLSAgLy9kZWZyU2V0V2FybmluZ0xvZ0Z1bmN0aW9uKG15V2FybmluZ0xvZ0Z1bmN0aW9uKTsKLSAgLy8gc3RkOjpjb3V0IDw8ICIxXG4iOwotICBpZiAoaXNTZXNzaW9ubGVzcykgewotICAgICAgZGVmckluaXRTZXNzaW9uKDApOwotICAgIGRlZnJTZXRMb25nTGluZU51bWJlckZ1bmN0aW9uKGxpbmVOdW1iZXJDQik7Ci0gICAgZGVmclNldERlbHRhTnVtYmVyTGluZXMobGluZV9udW1fcHJpbnRfaW50ZXJ2YWwpOwotICB9Ci0KLSAgLy8gZGVmckluaXRTZXNzaW9uKGlzU2Vzc2lvbmxlc3MgPyAwIDogMSk7Ci0gIGRlZnJJbml0U2Vzc2lvbigxKTsKLSAgLy8gc3RkOjpjb3V0IDw8ICIyXG4iOwotICBpZiAobm9DYWxscyA9PSAwKSB7Ci0gICAgLy8gc3RkOjpjb3V0IDw8ICIzXG4iOwotICAgIC8vIGZwcmludGYoZm91dCwgInh4eFxuIik7Ci0gICAgZGVmclNldFdhcm5pbmdMb2dGdW5jdGlvbihwcmludFdhcm5pbmcpOwotCi0KLSAgICBkZWZyU2V0VXNlckRhdGEoKGxlZmlVc2VyRGF0YSl0aGlzKTsKLSAgICAvLyBzdGQ6OmNvdXQgPDwgIjMuNSBcbiI7Ci0gICAgZGVmclNldERlc2lnbkNiayhkbmFtZSk7Ci0gICAgLy8gc3RkOjpjb3V0IDw8ICI0XG4iOwotICAgIGRlZnJTZXRUZWNobm9sb2d5Q2JrKHRuYW1lKTsKLSAgICBkZWZyU2V0RXh0ZW5zaW9uQ2JrKGV4dGVuc2lvbik7Ci0gICAgZGVmclNldERlc2lnbkVuZENiayhkb25lKTsKLSAgICBkZWZyU2V0UHJvcERlZlN0YXJ0Q2JrKHByb3BzdGFydCk7Ci0gICAgZGVmclNldFByb3BDYmsocHJvcCk7Ci0gICAgZGVmclNldFByb3BEZWZFbmRDYmsocHJvcGVuZCk7Ci0gICAgLyogVGVzdCBmb3IgQ0NSIDc2NjI4OSovCi0gICAgaWYgKCFub05ldENiKQotICAgICAgZGVmclNldE5ldENiayhuZXRmKTsKLSAgICBkZWZyU2V0TmV0TmFtZUNiayhuZXROYW1lZik7Ci0gICAgZGVmclNldE5ldE5vbkRlZmF1bHRSdWxlQ2JrKG5vbmRlZlJ1bGVmKTsKLSAgICBkZWZyU2V0TmV0U3VibmV0TmFtZUNiayhzdWJuZXROYW1lZik7Ci0gICAgZGVmclNldE5ldFBhcnRpYWxQYXRoQ2JrKG5ldHBhdGgpOwotICAgIGRlZnJTZXRTTmV0Q2JrKHNuZXRmKTsKLSAgICAvLyBzdGQ6OmNvdXQgPDwgIjVcbiI7Ci0gICAgLy9kZWZyU2V0U05ldFBhcnRpYWxQYXRoQ2JrKHNuZXRwYXRoKTsKLSAgICBpZiAoc2V0U05ldFdpcmVDYmspCi0gICAgICBkZWZyU2V0U05ldFdpcmVDYmsoc25ldHdpcmUpOwotICAgIGRlZnJTZXRDb21wb25lbnRNYXNrU2hpZnRMYXllckNiayhjb21wTVNMKTsKLSAgICBkZWZyU2V0Q29tcG9uZW50Q2JrKGNvbXBmKTsKLSAgICBkZWZyU2V0QWRkUGF0aFRvTmV0KCk7Ci0gICAgZGVmclNldEhpc3RvcnlDYmsoaGlzdCk7Ci0gICAgZGVmclNldENvbnN0cmFpbnRDYmsoY29uc3RyYWludCk7Ci0gICAgZGVmclNldEFzc2VydGlvbkNiayhjb25zdHJhaW50KTsKLSAgICBkZWZyU2V0QXJyYXlOYW1lQ2JrKGFuKTsKLSAgICAvLyBzdGQ6OmNvdXQgPDwgIjZcbiI7Ci0gICAgZGVmclNldEZsb29yUGxhbk5hbWVDYmsoZm4pOwotICAgIGRlZnJTZXREaXZpZGVyQ2JrKGRuKTsKLSAgICBkZWZyU2V0QnVzQml0Q2JrKGJibik7Ci0gICAgZGVmclNldE5vbkRlZmF1bHRDYmsobmRyKTsKLQotICAgIGRlZnJTZXRBc3NlcnRpb25zU3RhcnRDYmsoY29uc3RyYWludHN0KTsKLSAgICBkZWZyU2V0Q29uc3RyYWludHNTdGFydENiayhjb25zdHJhaW50c3QpOwotICAgIGRlZnJTZXRDb21wb25lbnRTdGFydENiayhjcyk7Ci0gICAgZGVmclNldFBpblByb3BTdGFydENiayhjcyk7Ci0gICAgZGVmclNldE5ldFN0YXJ0Q2JrKGNzKTsKLSAgICBkZWZyU2V0U3RhcnRQaW5zQ2JrKGNzKTsKLSAgICBkZWZyU2V0VmlhU3RhcnRDYmsoY3MpOwotICAgIGRlZnJTZXRSZWdpb25TdGFydENiayhjcyk7Ci0gICAgZGVmclNldFNOZXRTdGFydENiayhjcyk7Ci0gICAgLy8gc3RkOjpjb3V0IDw8ICI3XG4iOwotICAgIGRlZnJTZXRHcm91cHNTdGFydENiayhjcyk7Ci0gICAgZGVmclNldFNjYW5jaGFpbnNTdGFydENiayhjcyk7Ci0gICAgZGVmclNldElPVGltaW5nc1N0YXJ0Q2JrKGNzKTsKLSAgICBkZWZyU2V0RlBDU3RhcnRDYmsoY3MpOwotICAgIGRlZnJTZXRUaW1pbmdEaXNhYmxlc1N0YXJ0Q2JrKGNzKTsKLSAgICBkZWZyU2V0UGFydGl0aW9uc1N0YXJ0Q2JrKGNzKTsKLSAgICBkZWZyU2V0QmxvY2thZ2VTdGFydENiayhjcyk7Ci0gICAgZGVmclNldFNsb3RTdGFydENiayhjcyk7Ci0gICAgZGVmclNldEZpbGxTdGFydENiayhjcyk7Ci0gICAgZGVmclNldE5vbkRlZmF1bHRTdGFydENiayhjcyk7Ci0gICAgZGVmclNldFN0eWxlc1N0YXJ0Q2JrKGNzKTsKLQotICAgIC8vIEFsbCBvZiB0aGUgZXh0ZW5zaW9ucyBwb2ludCB0byB0aGUgc2FtZSBmdW5jdGlvbi4KLSAgICBkZWZyU2V0TmV0RXh0Q2JrKGV4dCk7Ci0gICAgZGVmclNldENvbXBvbmVudEV4dENiayhleHQpOwotICAgIGRlZnJTZXRQaW5FeHRDYmsoZXh0KTsKLSAgICBkZWZyU2V0VmlhRXh0Q2JrKGV4dCk7Ci0gICAgLy8gc3RkOjpjb3V0IDw8ICI4XG4iOwotICAgIGRlZnJTZXROZXRDb25uZWN0aW9uRXh0Q2JrKGV4dCk7Ci0gICAgZGVmclNldEdyb3VwRXh0Q2JrKGV4dCk7Ci0gICAgZGVmclNldFNjYW5DaGFpbkV4dENiayhleHQpOwotICAgIGRlZnJTZXRJb1RpbWluZ3NFeHRDYmsoZXh0KTsKLSAgICBkZWZyU2V0UGFydGl0aW9uc0V4dENiayhleHQpOwotCi0gICAgZGVmclNldFVuaXRzQ2JrKHVuaXRzRm4pOwotICAgIC8vaWYgKCFyZXRTdHIpCi0gICAgLy8gICBkZWZyU2V0VmVyc2lvbkNiayh2ZXJzKTsKLSAgICAvL2Vsc2UKLSAgICAgICBkZWZyU2V0VmVyc2lvblN0ckNiayh2ZXJzU3RyKTsKLSAgICBkZWZyU2V0Q2FzZVNlbnNpdGl2ZUNiayhjYXNlc2Vucyk7Ci0KLSAgICAvLyBUaGUgZm9sbG93aW5nIGNhbGxzIGFyZSBhbiBleGFtcGxlIG9mIHVzaW5nIG9uZSBmdW5jdGlvbiAiY2xzIgotICAgIC8vIHRvIGJlIHRoZSBjYWxsYmFjayBmb3IgbWFueSBESUZGRVJFTlQgdHlwZXMgb2YgY29uc3RydWN0cy4KLSAgICAvLyBXZSBoYXZlIHRvIGNhc3QgdGhlIGZ1bmN0aW9uIHR5cGUgdG8gbWVldCB0aGUgcmVxdWlyZW1lbnRzCi0gICAgLy8gb2YgZWFjaCBkaWZmZXJlbnQgc2V0IGZ1bmN0aW9uLgotICAgIGRlZnJTZXRTaXRlQ2JrKChkZWZyU2l0ZUNia0ZuVHlwZSljbHMpOwotICAgIGRlZnJTZXRDYW5wbGFjZUNiaygoZGVmclNpdGVDYmtGblR5cGUpY2xzKTsKLSAgICBkZWZyU2V0Q2Fubm90T2NjdXB5Q2JrKChkZWZyU2l0ZUNia0ZuVHlwZSljbHMpOwotICAgIGRlZnJTZXREaWVBcmVhQ2JrKChkZWZyQm94Q2JrRm5UeXBlKWNscyk7Ci0gICAgZGVmclNldFBpbkNhcENiaygoZGVmclBpbkNhcENia0ZuVHlwZSljbHMpOwotICAgIGRlZnJTZXRQaW5DYmsoKGRlZnJQaW5DYmtGblR5cGUpY2xzKTsKLSAgICBkZWZyU2V0UGluUHJvcENiaygoZGVmclBpblByb3BDYmtGblR5cGUpY2xzKTsKLSAgICBkZWZyU2V0RGVmYXVsdENhcENiaygoZGVmckludGVnZXJDYmtGblR5cGUpY2xzKTsKLSAgICBkZWZyU2V0Um93Q2JrKChkZWZyUm93Q2JrRm5UeXBlKWNscyk7Ci0gICAgZGVmclNldFRyYWNrQ2JrKChkZWZyVHJhY2tDYmtGblR5cGUpY2xzKTsKLSAgICBkZWZyU2V0R2NlbGxHcmlkQ2JrKChkZWZyR2NlbGxHcmlkQ2JrRm5UeXBlKWNscyk7Ci0gICAgZGVmclNldFZpYUNiaygoZGVmclZpYUNia0ZuVHlwZSljbHMpOwotICAgIGRlZnJTZXRSZWdpb25DYmsoKGRlZnJSZWdpb25DYmtGblR5cGUpY2xzKTsKLSAgICBkZWZyU2V0R3JvdXBOYW1lQ2JrKChkZWZyU3RyaW5nQ2JrRm5UeXBlKWNscyk7Ci0gICAgZGVmclNldEdyb3VwTWVtYmVyQ2JrKChkZWZyU3RyaW5nQ2JrRm5UeXBlKWNscyk7Ci0gICAgZGVmclNldEdyb3VwQ2JrKChkZWZyR3JvdXBDYmtGblR5cGUpY2xzKTsKLSAgICBkZWZyU2V0U2NhbmNoYWluQ2JrKChkZWZyU2NhbmNoYWluQ2JrRm5UeXBlKWNscyk7Ci0gICAgZGVmclNldElPVGltaW5nQ2JrKChkZWZySU9UaW1pbmdDYmtGblR5cGUpY2xzKTsKLSAgICBkZWZyU2V0RlBDQ2JrKChkZWZyRlBDQ2JrRm5UeXBlKWNscyk7Ci0gICAgZGVmclNldFRpbWluZ0Rpc2FibGVDYmsoKGRlZnJUaW1pbmdEaXNhYmxlQ2JrRm5UeXBlKWNscyk7Ci0gICAgZGVmclNldFBhcnRpdGlvbkNiaygoZGVmclBhcnRpdGlvbkNia0ZuVHlwZSljbHMpOwotICAgIGRlZnJTZXRCbG9ja2FnZUNiaygoZGVmckJsb2NrYWdlQ2JrRm5UeXBlKWNscyk7Ci0gICAgZGVmclNldFNsb3RDYmsoKGRlZnJTbG90Q2JrRm5UeXBlKWNscyk7Ci0gICAgZGVmclNldEZpbGxDYmsoKGRlZnJGaWxsQ2JrRm5UeXBlKWNscyk7Ci0gICAgZGVmclNldFN0eWxlc0NiaygoZGVmclN0eWxlc0Nia0ZuVHlwZSljbHMpOwotCi0gICAgZGVmclNldEFzc2VydGlvbnNFbmRDYmsoZW5kZnVuYyk7Ci0gICAgZGVmclNldENvbXBvbmVudEVuZENiayhlbmRmdW5jKTsKLSAgICBkZWZyU2V0Q29uc3RyYWludHNFbmRDYmsoZW5kZnVuYyk7Ci0gICAgZGVmclNldE5ldEVuZENiayhlbmRmdW5jKTsKLSAgICBkZWZyU2V0RlBDRW5kQ2JrKGVuZGZ1bmMpOwotICAgIGRlZnJTZXRGUENFbmRDYmsoZW5kZnVuYyk7Ci0gICAgZGVmclNldEdyb3Vwc0VuZENiayhlbmRmdW5jKTsKLSAgICBkZWZyU2V0SU9UaW1pbmdzRW5kQ2JrKGVuZGZ1bmMpOwotICAgIGRlZnJTZXROZXRFbmRDYmsoZW5kZnVuYyk7Ci0gICAgZGVmclNldFBhcnRpdGlvbnNFbmRDYmsoZW5kZnVuYyk7Ci0gICAgZGVmclNldFJlZ2lvbkVuZENiayhlbmRmdW5jKTsKLSAgICBkZWZyU2V0U05ldEVuZENiayhlbmRmdW5jKTsKLSAgICBkZWZyU2V0U2NhbmNoYWluc0VuZENiayhlbmRmdW5jKTsKLSAgICBkZWZyU2V0UGluRW5kQ2JrKGVuZGZ1bmMpOwotICAgIGRlZnJTZXRUaW1pbmdEaXNhYmxlc0VuZENiayhlbmRmdW5jKTsKLSAgICBkZWZyU2V0VmlhRW5kQ2JrKGVuZGZ1bmMpOwotICAgIGRlZnJTZXRQaW5Qcm9wRW5kQ2JrKGVuZGZ1bmMpOwotICAgIGRlZnJTZXRCbG9ja2FnZUVuZENiayhlbmRmdW5jKTsKLSAgICBkZWZyU2V0U2xvdEVuZENiayhlbmRmdW5jKTsKLSAgICBkZWZyU2V0RmlsbEVuZENiayhlbmRmdW5jKTsKLSAgICBkZWZyU2V0Tm9uRGVmYXVsdEVuZENiayhlbmRmdW5jKTsKLSAgICBkZWZyU2V0U3R5bGVzRW5kQ2JrKGVuZGZ1bmMpOwotCi0gICAgZGVmclNldE1hbGxvY0Z1bmN0aW9uKG1hbGxvY0NCKTsKLSAgICBkZWZyU2V0UmVhbGxvY0Z1bmN0aW9uKHJlYWxsb2NDQik7Ci0gICAgZGVmclNldEZyZWVGdW5jdGlvbihmcmVlQ0IpOwotCi0gICAgLy9kZWZyU2V0UmVnaXN0ZXJVbnVzZWRDYWxsYmFja3MoKTsKLQotICAgIC8vIFRlc3RpbmcgdG8gc2V0IHRoZSBudW1iZXIgb2Ygd2FybmluZ3MKLSAgICBkZWZyU2V0QXNzZXJ0aW9uV2FybmluZ3MoMyk7Ci0gICAgZGVmclNldEJsb2NrYWdlV2FybmluZ3MoMyk7Ci0gICAgZGVmclNldENhc2VTZW5zaXRpdmVXYXJuaW5ncygzKTsKLSAgICBkZWZyU2V0Q29tcG9uZW50V2FybmluZ3MoMyk7Ci0gICAgZGVmclNldENvbnN0cmFpbnRXYXJuaW5ncygwKTsKLSAgICBkZWZyU2V0RGVmYXVsdENhcFdhcm5pbmdzKDMpOwotICAgIGRlZnJTZXRHY2VsbEdyaWRXYXJuaW5ncygzKTsKLSAgICBkZWZyU2V0SU9UaW1pbmdXYXJuaW5ncygzKTsKLSAgICBkZWZyU2V0TmV0V2FybmluZ3MoMyk7Ci0gICAgZGVmclNldE5vbkRlZmF1bHRXYXJuaW5ncygzKTsKLSAgICBkZWZyU2V0UGluRXh0V2FybmluZ3MoMyk7Ci0gICAgZGVmclNldFBpbldhcm5pbmdzKDMpOwotICAgIGRlZnJTZXRSZWdpb25XYXJuaW5ncygzKTsKLSAgICBkZWZyU2V0Um93V2FybmluZ3MoMyk7Ci0gICAgZGVmclNldFNjYW5jaGFpbldhcm5pbmdzKDMpOwotICAgIGRlZnJTZXRTTmV0V2FybmluZ3MoMyk7Ci0gICAgZGVmclNldFN0eWxlc1dhcm5pbmdzKDMpOwotICAgIGRlZnJTZXRUcmFja1dhcm5pbmdzKDMpOwotICAgIGRlZnJTZXRVbml0c1dhcm5pbmdzKDMpOwotICAgIGRlZnJTZXRWZXJzaW9uV2FybmluZ3MoMyk7Ci0gICAgZGVmclNldFZpYVdhcm5pbmdzKDMpOwotICB9Ci0KLSAgaWYgKCEgaXNTZXNzaW9ubGVzcykgewotICAgIGRlZnJTZXRMb25nTGluZU51bWJlckZ1bmN0aW9uKGxpbmVOdW1iZXJDQik7Ci0gICAgZGVmclNldERlbHRhTnVtYmVyTGluZXMobGluZV9udW1fcHJpbnRfaW50ZXJ2YWwpOwotICB9Ci0KLSAgKHZvaWQpIGRlZnJTZXRPcGVuTG9nRmlsZUFwcGVuZCgpOwotCi0gIGlmIChjY3I3NDk4NTMpIHsKLSAgICBkZWZyU2V0VG90YWxNc2dMaW1pdCAoNSk7Ci0gICAgZGVmclNldExpbWl0UGVyTXNnICg2MDA4LCAyKTsKLQotICB9IAotCi0gIGlmICh0ZXN0MSkgeyAgLy8gZm9yIHNwZWNpYWwgdGVzdHMKLSAgICAgZm9yIChmaWxlQ3QgPSAwOyBmaWxlQ3QgPCBudW1JbkZpbGU7IGZpbGVDdCsrKSB7Ci0gICAgICAgaWYgKChmID0gZm9wZW4oaW5GaWxlW2ZpbGVDdF0sInIiKSkgPT0gMCkgewotICAgICAgICAgZnByaW50ZihzdGRlcnIsIkNvdWxkbid0IG9wZW4gaW5wdXQgZmlsZSAnJXMnXG4iLCBpbkZpbGVbZmlsZUN0XSk7Ci0gICAgICAgICByZXR1cm4oMik7Ci0gICAgICAgfQotICAgICAgIC8vIFNldCBjYXNlIHNlbnNpdGl2ZSB0byAwIHRvIHN0YXJ0IHdpdGgsIGluIEhpc3RvcnkgJiBQcm9wZXJ0eURlZmluaXRpb24KLSAgICAgICAvLyByZXNldCBpdCB0byAxLgotICAgICAgIHJlcyA9IGRlZnJSZWFkKGYsIGluRmlsZVtmaWxlQ3RdLCB1c2VyRGF0YSwgMSk7Ci0KLSAgICAgICBpZiAocmVzKQotICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUmVhZGVyIHJldHVybnMgYmFkIHN0YXR1cy5cbiIsIGluRmlsZVtmaWxlQ3RdKTsKLQotICAgICAgICh2b2lkKWRlZnJQcmludFVudXNlZENhbGxiYWNrcyhmb3V0KTsKLSAgICAgICAodm9pZClkZWZyUmVsZWFzZU5SZXNldE1lbW9yeSgpOwotICAgICAgICh2b2lkKWRlZnJVbnNldE5vbkRlZmF1bHRDYmsoKTsgCi0gICAgICAgKHZvaWQpZGVmclVuc2V0Tm9uRGVmYXVsdFN0YXJ0Q2JrKCk7IAotICAgICAgICh2b2lkKWRlZnJVbnNldE5vbkRlZmF1bHRFbmRDYmsoKTsgCi0gICAgIH0KLSAgfQotICBlbHNlIGlmICh0ZXN0MikgeyAgLy8gZm9yIHNwZWNpYWwgdGVzdHMKLSAgICAvLyB0aGlzIHRlc3QgaXMgZGVzaWduIHRvIHRlc3QgdGhlIDMgQVBJcywgZGVmckRpc2FibGVQYXJzZXJNc2dzLAotICAgIC8vIGRlZnJFbmFibGVQYXJzZXJNc2dzICYgZGVmckVuYWJsZUFsbE1zZ3MKLSAgICAvLyBJdCB1c2VzIHRoZSBmaWxlIGNjcjUyMzg3OS5kZWYuICBUaGlzIGZpbGUgd2lsbCBwYXJzZXIgMyB0aW1lcwotICAgIC8vIDFzdCBpdCB3aWxsIGhhdmUgZGVmckRpc2FibGVQYXJzZXJNc2dzIHNldCB0byBib3RoIDcwMTAgJiA3MDE2Ci0gICAgLy8gMm5kIHdpbGwgZW5hYmxlIDcwMTYgYnkgY2FsbGluZyBkZWZyRW5hYmxlUGFyc2VyTXNncwotICAgIC8vIDNyZCBlbmFibGUgYWxsIG1zZ3MgYnkgY2FsbCBkZWZyRW5hYmxlQWxsTXNncwotCi0gICAgLy9pbnQgbk1zZ3MgPSAyOwotICAgIGludCBkTXNnc1syXTsKLQotICAgIGZvciAoZmlsZUN0ID0gMDsgZmlsZUN0IDwgbnVtSW5GaWxlOyBmaWxlQ3QrKykgewotICAgICAgIGlmIChmaWxlQ3QgPT0gMCkgewotICAgICAgICAgIGRNc2dzWzBdID0gNzAxMDsKLSAgICAgICAgICBkTXNnc1sxXSA9IDcwMTY7Ci0gICAgICAgICAgZGVmckRpc2FibGVQYXJzZXJNc2dzICgyLCAoaW50KilkTXNncyk7Ci0gICAgICAgfSBlbHNlIGlmIChmaWxlQ3QgPT0gMSkgewotICAgICAgICAgIGRNc2dzWzBdID0gNzAxNjsKLSAgICAgICAgICBkZWZyRW5hYmxlUGFyc2VyTXNncyAoMSwgKGludCopZE1zZ3MpOwotICAgICAgIH0gZWxzZQotICAgICAgICAgIGRlZnJFbmFibGVBbGxNc2dzKCk7Ci0gCi0gICAgICAgaWYgKChmID0gZm9wZW4oaW5GaWxlW2ZpbGVDdF0sInIiKSkgPT0gMCkgewotICAgICAgICAgZnByaW50ZihzdGRlcnIsIkNvdWxkbid0IG9wZW4gaW5wdXQgZmlsZSAnJXMnXG4iLCBpbkZpbGVbZmlsZUN0XSk7Ci0gICAgICAgICByZXR1cm4oMik7Ci0gICAgICAgfQotIAotICAgICAgIHJlcyA9IGRlZnJSZWFkKGYsIGluRmlsZVtmaWxlQ3RdLCB1c2VyRGF0YSwgMSk7Ci0gCi0gICAgICAgaWYgKHJlcykKLSAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlJlYWRlciByZXR1cm5zIGJhZCBzdGF0dXMuXG4iLCBpbkZpbGVbZmlsZUN0XSk7Ci0gCi0gICAgICAgKHZvaWQpZGVmclByaW50VW51c2VkQ2FsbGJhY2tzKGZvdXQpOwotICAgICAgICh2b2lkKWRlZnJSZWxlYXNlTlJlc2V0TWVtb3J5KCk7Ci0gICAgICAgKHZvaWQpZGVmclVuc2V0Tm9uRGVmYXVsdENiaygpOwotICAgICAgICh2b2lkKWRlZnJVbnNldE5vbkRlZmF1bHRTdGFydENiaygpOwotICAgICAgICh2b2lkKWRlZnJVbnNldE5vbkRlZmF1bHRFbmRDYmsoKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgIGZvciAoZmlsZUN0ID0gMDsgZmlsZUN0IDwgbnVtSW5GaWxlOyBmaWxlQ3QrKykgewotICAgICAgIGlmIChzdHJjbXAoaW5GaWxlW2ZpbGVDdF0sICJTVERJTiIpID09IDApIHsKLSAgICAgICAgICAgIGYgPSBzdGRpbjsKLSAgICAgICB9IGVsc2UgaWYgKChmID0gZm9wZW4oaW5GaWxlW2ZpbGVDdF0sInIiKSkgPT0gMCkgewotICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJDb3VsZG4ndCBvcGVuIGlucHV0IGZpbGUgJyVzJ1xuIiwgaW5GaWxlW2ZpbGVDdF0pOwotICAgICAgICAgICAgIHJldHVybigyKTsKLSAgICAgICB9Ci0gICAgICAgLy8gU2V0IGNhc2Ugc2Vuc2l0aXZlIHRvIDAgdG8gc3RhcnQgd2l0aCwgaW4gSGlzdG9yeSAmIFByb3BlcnR5RGVmaW5pdGlvbgotICAgICAgIC8vIHJlc2V0IGl0IHRvIDEuCi0KLSAgICAgICByZXMgPSBkZWZyUmVhZChmLCBpbkZpbGVbZmlsZUN0XSwgdXNlckRhdGEsIDEpOwotCi0gICAgICAgaWYgKHJlcykKLSAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJSZWFkZXIgcmV0dXJucyBiYWQgc3RhdHVzLlxuIiwgaW5GaWxlW2ZpbGVDdF0pOwotCi0gICAgICAgLy8gVGVzdGluZyB0aGUgYWxpYXNlcyBBUEkuCi0gICAgICAgLy9kZWZyQWRkQWxpYXMgKCJhbGlhczEiLCAiYWxpYXNWYWx1ZTEiLCAxKTsKLQotICAgICAgIC8vZGVmaUFsaWFzX2l0ciBhbGlhc1N0b3JlOwotICAgICAgIC8vY29uc3QgY2hhciAgICAqYWxpYXMxVmFsdWUgPSBOVUxMOwotCi0gICAgICAgLy93aGlsZSAoYWxpYXNTdG9yZS5OZXh0KCkpIHsKLSAgICAgICAvLyAgICBpZiAoc3RyY21wKGFsaWFzU3RvcmUuS2V5KCksICJhbGlhczEiKSA9PSAwKSB7Ci0gICAgICAgLy8gICAgICAgICBhbGlhczFWYWx1ZSA9IGFsaWFzU3RvcmUuRGF0YSgpOwotICAgICAgIC8vICAgIH0KLSAgICAgICAvL30gCi0KLSAgICAgICAvL2lmICghYWxpYXMxVmFsdWUgfHwgc3RyY21wKGFsaWFzMVZhbHVlLCAiYWxpYXNWYWx1ZTEiKSkgewotICAgICAgIC8vICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogQWxpYXNlcyBkb24ndCB3b3JrXG4iKTsKLSAgICAgICAvL30KLQotICAgICAgICh2b2lkKWRlZnJQcmludFVudXNlZENhbGxiYWNrcyhmb3V0KTsKLSAgICAgICAodm9pZClkZWZyUmVsZWFzZU5SZXNldE1lbW9yeSgpOwotICAgICAgIC8vIExXIDE4LzAyLzA2Ci0gICAgICAgKHZvaWQpZGVmclVuc2V0Tm9uRGVmYXVsdENiaygpOwotICAgICAgICh2b2lkKWRlZnJVbnNldE5vbkRlZmF1bHRTdGFydENiaygpOwotICAgICAgICh2b2lkKWRlZnJVbnNldE5vbkRlZmF1bHRFbmRDYmsoKTsKLSAgICB9Ci0gICAgKHZvaWQpZGVmclVuc2V0Q2FsbGJhY2tzKCk7Ci0gICAgKHZvaWQpZGVmclNldFVudXNlZENhbGxiYWNrcyh1blVzZWRDQik7Ci0gIH0KLQotICAvLyBVbnNldCBhbGwgdGhlIGNhbGxiYWNrcwotICBkZWZyVW5zZXRBcnJheU5hbWVDYmsgKCk7Ci0gIGRlZnJVbnNldEFzc2VydGlvbkNiayAoKTsKLSAgZGVmclVuc2V0QXNzZXJ0aW9uc1N0YXJ0Q2JrICgpOwotICBkZWZyVW5zZXRBc3NlcnRpb25zRW5kQ2JrICgpOwotICBkZWZyVW5zZXRCbG9ja2FnZUNiayAoKTsKLSAgZGVmclVuc2V0QmxvY2thZ2VTdGFydENiayAoKTsKLSAgZGVmclVuc2V0QmxvY2thZ2VFbmRDYmsgKCk7Ci0gIGRlZnJVbnNldEJ1c0JpdENiayAoKTsKLSAgZGVmclVuc2V0Q2Fubm90T2NjdXB5Q2JrICgpOwotICBkZWZyVW5zZXRDYW5wbGFjZUNiayAoKTsKLSAgZGVmclVuc2V0Q2FzZVNlbnNpdGl2ZUNiayAoKTsKLSAgZGVmclVuc2V0Q29tcG9uZW50Q2JrICgpOwotICBkZWZyVW5zZXRDb21wb25lbnRFeHRDYmsgKCk7Ci0gIGRlZnJVbnNldENvbXBvbmVudFN0YXJ0Q2JrICgpOwotICBkZWZyVW5zZXRDb21wb25lbnRFbmRDYmsgKCk7Ci0gIGRlZnJVbnNldENvbnN0cmFpbnRDYmsgKCk7Ci0gIGRlZnJVbnNldENvbnN0cmFpbnRzU3RhcnRDYmsgKCk7Ci0gIGRlZnJVbnNldENvbnN0cmFpbnRzRW5kQ2JrICgpOwotICBkZWZyVW5zZXREZWZhdWx0Q2FwQ2JrICgpOwotICBkZWZyVW5zZXREZXNpZ25DYmsgKCk7Ci0gIGRlZnJVbnNldERlc2lnbkVuZENiayAoKTsKLSAgZGVmclVuc2V0RGllQXJlYUNiayAoKTsKLSAgZGVmclVuc2V0RGl2aWRlckNiayAoKTsKLSAgZGVmclVuc2V0RXh0ZW5zaW9uQ2JrICgpOwotICBkZWZyVW5zZXRGaWxsQ2JrICgpOwotICBkZWZyVW5zZXRGaWxsU3RhcnRDYmsgKCk7Ci0gIGRlZnJVbnNldEZpbGxFbmRDYmsgKCk7Ci0gIGRlZnJVbnNldEZQQ0NiayAoKTsKLSAgZGVmclVuc2V0RlBDU3RhcnRDYmsgKCk7Ci0gIGRlZnJVbnNldEZQQ0VuZENiayAoKTsKLSAgZGVmclVuc2V0Rmxvb3JQbGFuTmFtZUNiayAoKTsKLSAgZGVmclVuc2V0R2NlbGxHcmlkQ2JrICgpOwotICBkZWZyVW5zZXRHcm91cENiayAoKTsKLSAgZGVmclVuc2V0R3JvdXBFeHRDYmsgKCk7Ci0gIGRlZnJVbnNldEdyb3VwTWVtYmVyQ2JrICgpOwotICBkZWZyVW5zZXRDb21wb25lbnRNYXNrU2hpZnRMYXllckNiayAoKTsKLSAgZGVmclVuc2V0R3JvdXBOYW1lQ2JrICgpOwotICBkZWZyVW5zZXRHcm91cHNTdGFydENiayAoKTsKLSAgZGVmclVuc2V0R3JvdXBzRW5kQ2JrICgpOwotICBkZWZyVW5zZXRIaXN0b3J5Q2JrICgpOwotICBkZWZyVW5zZXRJT1RpbWluZ0NiayAoKTsKLSAgZGVmclVuc2V0SU9UaW1pbmdzU3RhcnRDYmsgKCk7Ci0gIGRlZnJVbnNldElPVGltaW5nc0VuZENiayAoKTsKLSAgZGVmclVuc2V0SU9UaW1pbmdzRXh0Q2JrICgpOwotICBkZWZyVW5zZXROZXRDYmsgKCk7Ci0gIGRlZnJVbnNldE5ldE5hbWVDYmsgKCk7Ci0gIGRlZnJVbnNldE5ldE5vbkRlZmF1bHRSdWxlQ2JrICgpOwotICBkZWZyVW5zZXROZXRDb25uZWN0aW9uRXh0Q2JrICgpOwotICBkZWZyVW5zZXROZXRFeHRDYmsgKCk7Ci0gIGRlZnJVbnNldE5ldFBhcnRpYWxQYXRoQ2JrICgpOwotICBkZWZyVW5zZXROZXRTdWJuZXROYW1lQ2JrICgpOwotICBkZWZyVW5zZXROZXRTdGFydENiayAoKTsKLSAgZGVmclVuc2V0TmV0RW5kQ2JrICgpOwotICBkZWZyVW5zZXROb25EZWZhdWx0Q2JrICgpOwotICBkZWZyVW5zZXROb25EZWZhdWx0U3RhcnRDYmsgKCk7Ci0gIGRlZnJVbnNldE5vbkRlZmF1bHRFbmRDYmsgKCk7Ci0gIGRlZnJVbnNldFBhcnRpdGlvbkNiayAoKTsKLSAgZGVmclVuc2V0UGFydGl0aW9uc0V4dENiayAoKTsKLSAgZGVmclVuc2V0UGFydGl0aW9uc1N0YXJ0Q2JrICgpOwotICBkZWZyVW5zZXRQYXJ0aXRpb25zRW5kQ2JrICgpOwotICBkZWZyVW5zZXRQYXRoQ2JrICgpOwotICBkZWZyVW5zZXRQaW5DYXBDYmsgKCk7Ci0gIGRlZnJVbnNldFBpbkNiayAoKTsKLSAgZGVmclVuc2V0UGluRW5kQ2JrICgpOwotICBkZWZyVW5zZXRQaW5FeHRDYmsgKCk7Ci0gIGRlZnJVbnNldFBpblByb3BDYmsgKCk7Ci0gIGRlZnJVbnNldFBpblByb3BTdGFydENiayAoKTsKLSAgZGVmclVuc2V0UGluUHJvcEVuZENiayAoKTsKLSAgZGVmclVuc2V0UHJvcENiayAoKTsKLSAgZGVmclVuc2V0UHJvcERlZkVuZENiayAoKTsKLSAgZGVmclVuc2V0UHJvcERlZlN0YXJ0Q2JrICgpOwotICBkZWZyVW5zZXRSZWdpb25DYmsgKCk7Ci0gIGRlZnJVbnNldFJlZ2lvblN0YXJ0Q2JrICgpOwotICBkZWZyVW5zZXRSZWdpb25FbmRDYmsgKCk7Ci0gIGRlZnJVbnNldFJvd0NiayAoKTsKLSAgZGVmclVuc2V0U2NhbkNoYWluRXh0Q2JrICgpOwotICBkZWZyVW5zZXRTY2FuY2hhaW5DYmsgKCk7Ci0gIGRlZnJVbnNldFNjYW5jaGFpbnNTdGFydENiayAoKTsKLSAgZGVmclVuc2V0U2NhbmNoYWluc0VuZENiayAoKTsKLSAgZGVmclVuc2V0U2l0ZUNiayAoKTsKLSAgZGVmclVuc2V0U2xvdENiayAoKTsKLSAgZGVmclVuc2V0U2xvdFN0YXJ0Q2JrICgpOwotICBkZWZyVW5zZXRTbG90RW5kQ2JrICgpOwotICBkZWZyVW5zZXRTTmV0V2lyZUNiayAoKTsKLSAgZGVmclVuc2V0U05ldENiayAoKTsKLSAgZGVmclVuc2V0U05ldFN0YXJ0Q2JrICgpOwotICBkZWZyVW5zZXRTTmV0RW5kQ2JrICgpOwotICBkZWZyVW5zZXRTTmV0UGFydGlhbFBhdGhDYmsgKCk7Ci0gIGRlZnJVbnNldFN0YXJ0UGluc0NiayAoKTsKLSAgZGVmclVuc2V0U3R5bGVzQ2JrICgpOwotICBkZWZyVW5zZXRTdHlsZXNTdGFydENiayAoKTsKLSAgZGVmclVuc2V0U3R5bGVzRW5kQ2JrICgpOwotICBkZWZyVW5zZXRUZWNobm9sb2d5Q2JrICgpOwotICBkZWZyVW5zZXRUaW1pbmdEaXNhYmxlQ2JrICgpOwotICBkZWZyVW5zZXRUaW1pbmdEaXNhYmxlc1N0YXJ0Q2JrICgpOwotICBkZWZyVW5zZXRUaW1pbmdEaXNhYmxlc0VuZENiayAoKTsKLSAgZGVmclVuc2V0VHJhY2tDYmsgKCk7Ci0gIGRlZnJVbnNldFVuaXRzQ2JrICgpOwotICBkZWZyVW5zZXRWZXJzaW9uQ2JrICgpOwotICBkZWZyVW5zZXRWZXJzaW9uU3RyQ2JrICgpOwotICBkZWZyVW5zZXRWaWFDYmsgKCk7Ci0gIGRlZnJVbnNldFZpYUV4dENiayAoKTsKLSAgZGVmclVuc2V0VmlhU3RhcnRDYmsgKCk7Ci0gIGRlZnJVbnNldFZpYUVuZENiayAoKTsKLQotICBmY2xvc2UoZm91dCk7Ci0KLSAgLy8gUmVsZWFzZSBhbGxvY2F0ZWQgc2luZ2xldG9uIGRhdGEuCi0gIGRlZnJDbGVhcigpOwotICBkZWxldGVbXSBjc3RyOwotCi0gIHJldHVybiByZXM7Ci19Ci0KLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9pby9mckFQRy5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9pby9mckFQRy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZDhmYjUuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvaW8vZnJBUEcuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzM1ICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJpby9mckFQRy5oIgotCi12b2lkIGZyOjpBUEdXb3JrZXI6OmluaXQoKSB7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgZm9yIChhdXRvICZ1aW5zdFRlcm06IGluc3QtPmdldEluc3RUZXJtcygpKSB7Ci0gICAgZnJJbnN0VGVybSogaW5zdFRlcm0gPSB1aW5zdFRlcm0uZ2V0KCk7Ci0gICAgYXV0byBpbnN0VGVybVR5cGUgPSBpbnN0VGVybS0+Z2V0VGVybSgpLT5nZXRUeXBlKCk7Ci0gICAgaWYgKGluc3RUZXJtVHlwZSAhPSBmclRlcm1FbnVtOjpmcmNOb3JtYWxUZXJtICYmIGluc3RUZXJtVHlwZSAhPSBmclRlcm1FbnVtOjpmcmNDbG9ja1Rlcm0pIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICAvLyBwdXB1bGF0ZSBtYXAgYW5kIHJ0cmVlCi0gICAgZm9yIChhdXRvICZ1cGluOiBpbnN0VGVybS0+Z2V0VGVybSgpLT5nZXRQaW5zKCkpIHsKLSAgICAgIGJvb2wgaGFzVmlhQWNjZXNzID0gZmFsc2U7Ci0gICAgICBmclBpbiogcGluID0gdXBpbi5nZXQoKTsKLSAgICAgIC8vIHVuQ29ubmVjdGVkUGlucy5wdXNoX2JhY2socGluKTsKLSAgICAgIGZyVHJhbnNmb3JtIGluc3RYZm9ybTsgCi0gICAgICBpbnN0LT5nZXRVcGRhdGVkWGZvcm0oaW5zdFhmb3JtKTsKLSAgICAgIGZvciAoYXV0byAmdWFwOiBwaW4tPmdldEFjY2Vzc1BhdHRlcm5zKGluc3RYZm9ybS5vcmllbnQoKSkpIHsKLSAgICAgICAgRmxleEFjY2Vzc1BhdHRlcm4gKmFwID0gdWFwLmdldCgpOwotICAgICAgICBpZiAoIShhcC0+aGFzSW5zdChpbnN0KSkpIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWFwLT5nZXRBY2Nlc3NWaWFEZWYoZnJEaXJFbnVtOjpVKS5lbXB0eSgpKSB7Ci0gICAgICAgICAgLy8gc3RkOjpjb3V0IDw8ICJlbXB0eVxuIjsKLSAgICAgICAgICBoYXNWaWFBY2Nlc3MgPSB0cnVlOwotICAgICAgICAgIHBpbjJBUHNbcGluXS5wdXNoX2JhY2soYXApOwotICAgICAgICAgIGZyUG9pbnQgYnAsIGVwOwotICAgICAgICAgIGFwLT5nZXRQb2ludHMoYnAsIGVwKTsKLSAgICAgICAgICBsYXllcjJBUFJUcmVlW2FwLT5nZXRCZWdpbkxheWVyTnVtKCldLmluc2VydChzdGQ6Om1ha2VfcGFpcihwb2ludF90KGJwLngoKSwgYnAueSgpKSwgYXApKTsKLSAgICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgIiAgIiA8PCBwaW4tPmdldFRlcm0oKS0+Z2V0TmFtZSgpIDw8ICIgaW5zZXJ0IGFwIGF0ICgiIDw8IGJwLngoKSAvIDIwMDAuMCA8PCAiLCAiIDw8IGJwLnkoKSAvIDIwMDAuMCA8PCAiKSBvbiBsYXllciAiIDw8IGFwLT5nZXRCZWdpbkxheWVyTnVtKCkgPDwgIlxuIjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGhhc1ZpYUFjY2VzcyA9PSBmYWxzZSkgewotICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgc3RkOjpjb3V0IDw8ICJXYXJuaW5nOiAiIDw8IGluc3QtPmdldE5hbWUoKSA8PCAiLyIgPDwgcGluLT5nZXRUZXJtKCktPmdldE5hbWUoKSAKLSAgICAgICAgICAgICAgICAgICAgPDwgIiBoYXMgbm8gdmlhIGFjY2VzcyBmb3VuZCBkdXJpbmcgQVBHLiBOb3QgY29uc2lkZXJlZCBmb3IgQVBHXG4iOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICB1bkNvbm5lY3RlZFBpbnMuaW5zZXJ0KHBpbik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIC8vIAotCi19Ci0KLS8vIGdldCB0aGUgcGluIG9yZGVyCi12b2lkIGZyOjpBUEdXb3JrZXI6OnNldHVwKCkgewotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgYXV0byB1blByb2Nlc3NlZExheWVyMkFQUnRyZWUgPSBsYXllcjJBUFJUcmVlOwotICAvLyBmaXJzdCBzb3J0IHRoZSB1bmNvbm5lY3RlZCBwaW5zIHRvIGdldCB0aGUgc3RhcnQgcGluCi0gIHN0ZDo6c2V0PHN0ZDo6cGFpcjxmckNvb3JkLCBmclBpbio+ID4gYXJlYVBpblBhaXJzOwotICBmb3IgKGF1dG8gJnBpbjogdW5Db25uZWN0ZWRQaW5zKSB7Ci0gICAgZnJDb29yZCBwaW5BcmVhID0gMDsKLSAgICBhdXRvICZsYXllcjJQb2x5U2V0ID0gcGluLT5nZXRMYXllcjJQb2x5U2V0KCk7Ci0gICAgZm9yIChhdXRvIGxheWVySXQgPSBsYXllcjJQb2x5U2V0LmJlZ2luKCk7IGxheWVySXQgIT0gbGF5ZXIyUG9seVNldC5lbmQoKTsgKytsYXllckl0KSB7Ci0gICAgICBwaW5BcmVhICs9IGFyZWEobGF5ZXJJdC0+c2Vjb25kKTsKLSAgICB9Ci0gICAgYXJlYVBpblBhaXJzLmluc2VydChzdGQ6Om1ha2VfcGFpcihwaW5BcmVhLCBwaW4pKTsKLSAgfQotICAvLyBnZXQgdGhlIG9yZGVyIG9mIHBpbnMgZm9yIEFQIGV4cGFuc2lvbgotICAvLyBzdGFydCBmcm9tIHRoZSBzbWFsbGVzdCBwaW4sIGdyYWR1YWxseSBleHBhbmQgdG8gZmluZCB0aGUgCi0gIC8vICJib3R0bGVuZWNrIiBvZiBjb25mbGljdGluZyBwaW5zCi0gIGZyUGluKiBjdXJyUGluID0gYXJlYVBpblBhaXJzLmJlZ2luKCktPnNlY29uZDsKLSAgLy8gc3RkOjpjb3V0IDw8ICIgICIgPDwgY3VyclBpbi0+Z2V0VGVybSgpLT5nZXROYW1lKCkgPDwgIlxuIjsKLSAgcGluT3JkZXIucHVzaF9iYWNrKGN1cnJQaW4pOwotICBpZiAodW5Db25uZWN0ZWRQaW5zLmZpbmQoY3VyclBpbikgPT0gdW5Db25uZWN0ZWRQaW5zLmVuZCgpKSB7Ci0gICAgc3RkOjpjb3V0IDw8ICJFcnJvcjogbm90IGZvdW5kIGluIHVuQ29ubmVjdGVkUGluc1xuIjsKLSAgfQotICB1bkNvbm5lY3RlZFBpbnMuZXJhc2UoY3VyclBpbik7Ci0gIGZyUG9pbnQgYnAsIGVwOwotICBwaW4yQVBzW2N1cnJQaW5dLmZyb250KCktPmdldFBvaW50cyhicCwgZXApOwotICBQb2ludCBhcE9yaWdpbihicC54KCksIGJwLnkoKSk7Ci0gIGJvb3N0Ojpwb2x5Z29uOjpzZXRfcG9pbnRzKGFwQkJveFJlY3QsIGFwT3JpZ2luLCBhcE9yaWdpbik7Ci0gIGZvciAoYXV0byBsYXllckl0ID0gdW5Qcm9jZXNzZWRMYXllcjJBUFJ0cmVlLmJlZ2luKCk7IGxheWVySXQgIT0gdW5Qcm9jZXNzZWRMYXllcjJBUFJ0cmVlLmVuZCgpOyArK2xheWVySXQpIHsKLSAgICBhdXRvICZhcFJUcmVlID0gbGF5ZXJJdC0+c2Vjb25kOwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxwb2ludF90LCBGbGV4QWNjZXNzUGF0dGVybio+ID4gcmVtb3ZlQnVmZmVyOwotICAgIGZvciAoYXV0byBydHJlZUl0ID0gYXBSVHJlZS5iZWdpbigpOyBydHJlZUl0ICE9IGFwUlRyZWUuZW5kKCk7ICsrcnRyZWVJdCkgewotICAgICAgYXV0byBsb2MgPSBydHJlZUl0LT5maXJzdDsKLSAgICAgIGF1dG8gYXAgPSBydHJlZUl0LT5zZWNvbmQ7Ci0gICAgICAvLyByZW1vdmUgdGhlIGFwIGZyb20gcnRyZWUgaWYgYXAgaGFzIHRoZSBzYW1lIHBpbiBhcyB0aGUgY3VyclBpbgotICAgICAgaWYgKGFwLT5nZXRQaW4oKSA9PSBjdXJyUGluKSB7Ci0gICAgICAgIC8vIGFwUlRyZWUucmVtb3ZlKHN0ZDo6bWFrZV9wYWlyKGxvYywgYXApKTsKLSAgICAgICAgcmVtb3ZlQnVmZmVyLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihsb2MsIGFwKSk7Ci0gICAgICAgIC8vIHN0ZDo6Y291dCA8PCAiICAgIHJlbW92ZWQgYXAgZnJvbSBydHJlZVxuIjsKLSAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChhdXRvICZlbGVtZW50OiByZW1vdmVCdWZmZXIpIHsKLSAgICAgIGFwUlRyZWUucmVtb3ZlKGVsZW1lbnQpOwotICAgIH0KLSAgfQotICAvLyByZW1haW5pbmcgcGlucwotICAvLyBzdGQ6OmNvdXQgPDwgIiAgc3RhcnQgZnJvbSBzZWNvbmQgcGluXG4iOwotICB3aGlsZSAoIXVuQ29ubmVjdGVkUGlucy5lbXB0eSgpKSB7Ci0gICAgYm94X3QgYXBCQm94KHBvaW50X3QoeGwoYXBCQm94UmVjdCksIHlsKGFwQkJveFJlY3QpKSwgcG9pbnRfdCh4aChhcEJCb3hSZWN0KSwgeWgoYXBCQm94UmVjdCkpKTsKLSAgICBmckNvb3JkIG1pbkRpc3QgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpOwotICAgIFBvaW50IG5leHRBUExvYzsKLSAgICAvLyBmaW5kIG5leHQgcGluIHRvIGFkZCB0byBvcmRlcgotICAgIGZvciAoYXV0byBsYXllckl0ID0gdW5Qcm9jZXNzZWRMYXllcjJBUFJ0cmVlLmJlZ2luKCk7IGxheWVySXQgIT0gdW5Qcm9jZXNzZWRMYXllcjJBUFJ0cmVlLmVuZCgpOyArK2xheWVySXQpIHsKLSAgICAgIGF1dG8gJmFwUlRyZWUgPSBsYXllckl0LT5zZWNvbmQ7Ci0gICAgICBpZiAoYXBSVHJlZS5lbXB0eSgpKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHBvaW50X3QsIEZsZXhBY2Nlc3NQYXR0ZXJuKj4gPiBxcTsKLSAgICAgIGFwUlRyZWUucXVlcnkoYmdpOjpuZWFyZXN0KGFwQkJveCwgMSksIHN0ZDo6YmFja19pbnNlcnRlcihxcSkpOwotICAgICAgZm9yIChhdXRvICZhcFBhaXI6IHFxKSB7Ci0gICAgICAgIGF1dG8gdG1wRGlzdCA9IGJnOjpkaXN0YW5jZShhcEJCb3gsIGFwUGFpci5maXJzdCk7Ci0gICAgICAgIGlmICh0bXBEaXN0IDwgbWluRGlzdCkgewotICAgICAgICAgIG1pbkRpc3QgPSB0bXBEaXN0OwotICAgICAgICAgIGN1cnJQaW4gPSAoYXBQYWlyLnNlY29uZCktPmdldFBpbigpOwotICAgICAgICAgIG5leHRBUExvYyA9IFBvaW50KGFwUGFpci5maXJzdC54KCksIGFwUGFpci5maXJzdC55KCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIHN0ZDo6Y291dCA8PCAiICAiIDw8IGN1cnJQaW4tPmdldFRlcm0oKS0+Z2V0TmFtZSgpIDw8ICJcbiI7Ci0KLSAgICAvLyBhZGQgdGhlIGNsb3Nlc3QgcGluIHRvIG9yZGVyIGFuZCB1cGRhdGUgdW5jb25uZWN0ZWQgaW5mbwotICAgIHBpbk9yZGVyLnB1c2hfYmFjayhjdXJyUGluKTsKLSAgICB1bkNvbm5lY3RlZFBpbnMuZXJhc2UoY3VyclBpbik7Ci0gICAgYm9vc3Q6OnBvbHlnb246OmVuY29tcGFzcyhhcEJCb3hSZWN0LCBuZXh0QVBMb2MpOwotICAgIGZvciAoYXV0byBsYXllckl0ID0gdW5Qcm9jZXNzZWRMYXllcjJBUFJ0cmVlLmJlZ2luKCk7IGxheWVySXQgIT0gdW5Qcm9jZXNzZWRMYXllcjJBUFJ0cmVlLmVuZCgpOyArK2xheWVySXQpIHsKLSAgICAgIGF1dG8gJmFwUlRyZWUgPSBsYXllckl0LT5zZWNvbmQ7Ci0gICAgICBpZiAoYXBSVHJlZS5lbXB0eSgpKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHBvaW50X3QsIEZsZXhBY2Nlc3NQYXR0ZXJuKj4gPiByZW1vdmVCdWZmZXI7Ci0gICAgICBmb3IgKGF1dG8gcnRyZWVJdCA9IGFwUlRyZWUuYmVnaW4oKTsgcnRyZWVJdCAhPSBhcFJUcmVlLmVuZCgpOyArK3J0cmVlSXQpIHsKLSAgICAgICAgYXV0byBsb2MgPSBydHJlZUl0LT5maXJzdDsKLSAgICAgICAgYXV0byBhcCA9IHJ0cmVlSXQtPnNlY29uZDsKLSAgICAgICAgLy8gcmVtb3ZlIHRoZSBhcCBmcm9tIHJ0cmVlIGlmIGFwIGhhcyB0aGUgc2FtZSBwaW4gYXMgdGhlIGN1cnJQaW4KLSAgICAgICAgaWYgKGFwLT5nZXRQaW4oKSA9PSBjdXJyUGluKSB7Ci0gICAgICAgICAgLy8gYXBSVHJlZS5yZW1vdmUoc3RkOjptYWtlX3BhaXIobG9jLCBhcCkpOwotICAgICAgICAgIHJlbW92ZUJ1ZmZlci5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIobG9jLCBhcCkpOwotICAgICAgICAgIC8vIHN0ZDo6Y291dCA8PCAiICAgIHJlbW92ZWQgYXAgZnJvbSBydHJlZVxuIjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZm9yIChhdXRvICZlbGVtZW50OiByZW1vdmVCdWZmZXIpIHsKLSAgICAgICAgYXBSVHJlZS5yZW1vdmUoZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIAotCi0gIH0KLQotfQotCi0vLyBhY2NvcmRpbmcgdG8gcGluIG9yZGVyLCBmaW5kIHRoZSBiZXN0IEFQIGNvbWJpbmF0aW9uIGFuZCBmaW5kIG90aGVyIHVzYWJsZSBBUCAocmVnYXJkaW5nIHRvIGJlc3QgY29tYmluYXRpb24pCi12b2lkIGZyOjpBUEdXb3JrZXI6Om1haW4oKSB7Ci0gIC8vYm9vbCBlbmFibGVPdXRwdXQgPSB0cnVlOwotICBhdXRvIHVuUHJvY2Vzc2VkTGF5ZXIyQVBSdHJlZSA9IGxheWVyMkFQUlRyZWU7Ci0gIGZyVmVjdG9yPEZsZXhBY2Nlc3NQYXR0ZXJuKj4gY3VyckJlc3RBUENvbWI7Ci0gIGZyVmVjdG9yPGZyUG9pbnQ+IGFwQnBzOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZnJWaWE+ID4gY3Vyck9ianM7Ci0gIHN0ZDo6c2V0PEZsZXhBY2Nlc3NQYXR0ZXJuKj4gY3VyclZhbGlkQVBzOwotICBGbGV4QWNjZXNzUGF0dGVybiogYmVzdEFQOwotICAvLyBib29zdDo6cG9seWdvbjo6Y2VudGVyKHByZXZBUExvYywgYXBCQm94UmVjdCk7Ci0gIC8vIGdldCBiZXN0IEFQQwotICBmb3IgKGF1dG8gJmN1cnJQaW46IHBpbk9yZGVyKSB7Ci0gICAgaW50IGJlc3RWaW9DbnQgPSAtMTsKLSAgICBzdGQ6Om1hcDxGbGV4QWNjZXNzUGF0dGVybiosIGZyQ29vcmQ+IGFwMk1pbkRpc3Q7Ci0gICAgaWYgKGFwQnBzLmVtcHR5KCkpIHsKLSAgICAgIFBvaW50IGFwQkJveFJlY3RDZW50ZXI7Ci0gICAgICBib29zdDo6cG9seWdvbjo6Y2VudGVyKGFwQkJveFJlY3RDZW50ZXIsIGFwQkJveFJlY3QpOwotICAgICAgZm9yIChhdXRvICZhcDogcGluMkFQc1tjdXJyUGluXSkgewotICAgICAgICBmclBvaW50IGJwLCBlcDsKLSAgICAgICAgYXAtPmdldFBvaW50cyhicCwgZXApOwotICAgICAgICBQb2ludCBhcEJwKGJwLngoKSwgYnAueSgpKTsKLSAgICAgICAgZnJDb29yZCB0bXBEaXN0ID0gYm9vc3Q6OnBvbHlnb246OmV1Y2xpZGVhbl9kaXN0YW5jZShhcEJwLCBhcEJCb3hSZWN0Q2VudGVyKTsKLSAgICAgICAgYXAyTWluRGlzdFthcF0gPSB0bXBEaXN0OwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBmb3IgKGF1dG8gJmFwOiBwaW4yQVBzW2N1cnJQaW5dKSB7Ci0gICAgICAgIGZvciAoYXV0byAmYmFwOiBjdXJyQmVzdEFQQ29tYikgewotICAgICAgICAgIGZyUG9pbnQgYnAsIGVwLCBiYnAsIGJlcDsKLSAgICAgICAgICBhcC0+Z2V0UG9pbnRzKGJwLCBlcCk7Ci0gICAgICAgICAgYmFwLT5nZXRQb2ludHMoYmJwLCBiZXApOwotICAgICAgICAgIFBvaW50IGFwQnAoYnAueCgpLCBicC55KCkpOwotICAgICAgICAgIFBvaW50IGJhcEJwKGJicC54KCksIGJicC55KCkpOwotICAgICAgICAgIGZyQ29vcmQgdG1wRGlzdCA9IGJvb3N0Ojpwb2x5Z29uOjpldWNsaWRlYW5fZGlzdGFuY2UoYXBCcCwgYmFwQnApOwotICAgICAgICAgIGlmIChhcDJNaW5EaXN0LmZpbmQoYXApID09IGFwMk1pbkRpc3QuZW5kKCkgfHwgdG1wRGlzdCA8IGFwMk1pbkRpc3RbYXBdKSB7Ci0gICAgICAgICAgICBhcDJNaW5EaXN0W2FwXSA9IHRtcERpc3Q7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGZyQ29vcmQsIEZsZXhBY2Nlc3NQYXR0ZXJuKj4gPiBkaXN0QVBzOwotICAgIGZvciAoYXV0byBpdCA9IGFwMk1pbkRpc3QuYmVnaW4oKTsgaXQgIT0gYXAyTWluRGlzdC5lbmQoKTsgKytpdCkgewotICAgICAgZGlzdEFQcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoaXQtPnNlY29uZCwgaXQtPmZpcnN0KSk7Ci0gICAgfQotICAgIHN0ZDo6c29ydChkaXN0QVBzLmJlZ2luKCksIGRpc3RBUHMuZW5kKCkpOwotICAgIC8vIGdyZWVkaWx5IHN0YXJ0IGNoZWNrIGZyb20gdGhlIG5lYXJlc3Qgb25lLCBmaW5kIHRoZSBvbmUgd2l0aCBzbWFsbGVzdCBjb3N0IGFuZCBwcm9jZWVkCi0gICAgLy8gZm9yIChhdXRvICZkaXN0QVA6IGRpc3RBUHMpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpZGlzdEFQcy5zaXplKCk7ICsraSkgewotICAgICAgYXV0byAmYXAgPSBkaXN0QVBzW2ldLnNlY29uZDsKLSAgICAgIHN0ZDo6dmVjdG9yPGZyQmxvY2tPYmplY3QqPiB0bXBPYmpzOwotICAgICAgZm9yIChhdXRvICZvYmo6IGN1cnJPYmpzKSB7Ci0gICAgICAgIHRtcE9ianMucHVzaF9iYWNrKG9iai5nZXQoKSk7Ci0gICAgICB9Ci0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8ZnJWaWE+IHRtcFZpYSA9IHN0ZDo6bWFrZV91bmlxdWU8ZnJWaWE+KChhcC0+Z2V0QWNjZXNzVmlhRGVmKGZyRGlyRW51bTo6VSkuZnJvbnQoKSkpOwotICAgICAgZnJQb2ludCBicCwgZXA7Ci0gICAgICBhcC0+Z2V0UG9pbnRzKGJwLCBlcCk7Ci0gICAgICB0bXBWaWEtPnNldE9yaWdpbihicCk7Ci0gICAgICBmclRyYW5zZm9ybSB2aWFYZm9ybShicCk7Ci0gICAgICB0bXBWaWEtPnNldFRyYW5zZm9ybSh2aWFYZm9ybSk7Ci0gICAgICB0bXBWaWEtPmFkZFRvUGluKGN1cnJQaW4pOwotICAgICAgdG1wT2Jqcy5wdXNoX2JhY2sodG1wVmlhLmdldCgpKTsKLSAgICAgIERSQ1dvcmtlciBkcmNXb3JrZXIoZGVzaWduLCB0bXBPYmpzKTsKLSAgICAgIGRyY1dvcmtlci5pbml0KCk7Ci0gICAgICBkcmNXb3JrZXIuc2V0dXAoKTsKLSAgICAgIGRyY1dvcmtlci5tYWluKCk7Ci0gICAgICBpZiAoZHJjV29ya2VyLmdldFZpb2xhdGlvbnMoKS5lbXB0eSgpKSB7Ci0gICAgICAgIGJlc3RWaW9DbnQgPSAwOwotICAgICAgICBiZXN0QVAgPSBhcDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBudW1WaW8gPSBkcmNXb3JrZXIuZ2V0VmlvbGF0aW9ucygpLnNpemUoKTsKLSAgICAgICAgaWYgKGJlc3RWaW9DbnQgPT0gLTEgfHwgbnVtVmlvIDwgYmVzdFZpb0NudCkgewotICAgICAgICAgIGJlc3RWaW9DbnQgPSBudW1WaW87Ci0gICAgICAgICAgYmVzdEFQID0gYXA7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIHVwZGF0ZSBpZiBjbGVhbiBhcCBmb3VuZCBvciBhbGwgYXAgdmlzaXRlZAotICAgICAgaWYgKGJlc3RWaW9DbnQgPT0gMCB8fCAoaSArIDEpID09IChpbnQpZGlzdEFQcy5zaXplKCkpIHsKLSAgICAgICAgYXBCcHMucHVzaF9iYWNrKGJwKTsKLSAgICAgICAgY3VyckJlc3RBUENvbWIucHVzaF9iYWNrKGJlc3RBUCk7Ci0gICAgICAgIGN1cnJPYmpzLnB1c2hfYmFjayhzdGQ6Om1vdmUodG1wVmlhKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgfQotCi0gIH0KLQotICBmb3IgKGF1dG8gJmFwOiBjdXJyQmVzdEFQQ29tYikgewotICAgIGZyUG9pbnQgYnAsIGVwOwotICAgIGFwLT5nZXRQb2ludHMoYnAsIGVwKTsKLSAgICBhcC0+c2V0UHJlZmVycmVkKHRydWUpOwotICAgIHN0ZDo6Y291dCA8PCAiICBhcCBpbiBiZXN0QVBDb21iOiAoIiA8PCBicC54KCkgLyAyMDAwLjAgPDwgIiwgIiA8PCBicC55KCkgLyAyMDAwLjAgPDwgIilcbiI7Ci0gICAgY3VyclZhbGlkQVBzLmluc2VydChhcCk7Ci0gIH0KLQotICAvLyBmaW5kIGFsbCBvdGhlciBBUHMgd2hpY2ggYXJlIG5vdCBjb25mbGljdGluZyB3aXRoIGJlc3QgQVBDCi0gIGZvciAoYXV0byBpdCA9IHBpbjJBUHMuYmVnaW4oKTsgaXQgIT0gcGluMkFQcy5lbmQoKTsgKytpdCkgewotICAgIGF1dG8gJnBpbiA9IGl0LT5maXJzdDsKLSAgICBhdXRvICZhcHMgPSBpdC0+c2Vjb25kOwotICAgIHN0ZDo6dmVjdG9yPGZyQmxvY2tPYmplY3QqPiBvdGhlck9ianM7Ci0gICAgLy8gZ2V0IHRoZSBhcHMgaW4gQVBDIGV4Y2VwdCB0aGUgY3VycmVudCBvbmUKLSAgICBmb3IgKGF1dG8gJnZpYTogY3Vyck9ianMpIHsKLSAgICAgIGlmICh2aWEtPmhhc1BpbigpICYmIHZpYS0+Z2V0UGluKCkgIT0gcGluKSB7Ci0gICAgICAgIG90aGVyT2Jqcy5wdXNoX2JhY2sodmlhLmdldCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gY2hlY2sgYXAgb2YgdGhlIGN1cnJlbnQgcGluIG9uZSBieSBvbmUKLSAgICBmb3IgKGF1dG8gJmFwOiBhcHMpIHsKLSAgICAgIGF1dG8gdG1wT2JqcyA9IG90aGVyT2JqczsKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxmclZpYT4gdG1wVmlhID0gc3RkOjptYWtlX3VuaXF1ZTxmclZpYT4oKihhcC0+Z2V0QWNjZXNzVmlhRGVmKGZyRGlyRW51bTo6VSkuYmVnaW4oKSkpOwotICAgICAgZnJQb2ludCBicCwgZXA7Ci0gICAgICBhcC0+Z2V0UG9pbnRzKGJwLCBlcCk7Ci0gICAgICB0bXBWaWEtPnNldE9yaWdpbihicCk7Ci0gICAgICBmclRyYW5zZm9ybSB2aWFYZm9ybShicCk7Ci0gICAgICB0bXBWaWEtPnNldFRyYW5zZm9ybSh2aWFYZm9ybSk7Ci0gICAgICB0bXBWaWEtPmFkZFRvUGluKHBpbik7Ci0gICAgICB0bXBPYmpzLnB1c2hfYmFjayh0bXBWaWEuZ2V0KCkpOwotICAgICAgRFJDV29ya2VyIGRyY1dvcmtlcihkZXNpZ24sIHRtcE9ianMpOwotICAgICAgZHJjV29ya2VyLmluaXQoKTsKLSAgICAgIGRyY1dvcmtlci5zZXR1cCgpOwotICAgICAgZHJjV29ya2VyLm1haW4oKTsKLSAgICAgIGlmIChkcmNXb3JrZXIuZ2V0VmlvbGF0aW9ucygpLmVtcHR5KCkpIHsKLSAgICAgICAgY3VyclZhbGlkQVBzLmluc2VydChhcCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgYmVzdEFQQ29tYiA9IGN1cnJCZXN0QVBDb21iOwotICB2YWxpZEFQcyA9IGN1cnJWYWxpZEFQczsKLQotICB1cGRhdGVBUFN0YXR1cygpOwotCi19Ci0KLXZvaWQgZnI6OkFQR1dvcmtlcjo6dXBkYXRlQVBTdGF0dXMoKSB7Ci0gIGZvciAoYXV0byBpdCA9IHBpbjJBUHMuYmVnaW4oKTsgaXQgIT0gcGluMkFQcy5lbmQoKTsgKytpdCkgewotICAgIGF1dG8gJmFwcyA9IGl0LT5zZWNvbmQ7Ci0gICAgZm9yIChhdXRvICZhcDogYXBzKSB7Ci0gICAgICBpZiAodmFsaWRBUHMuZmluZChhcCkgIT0gdmFsaWRBUHMuZW5kKCkpIHsKLSAgICAgICAgYXAtPnNldENvbmZsaWN0KGZhbHNlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBmcjo6QVBHV29ya2VyOjplbmQoKSB7Ci0gIGZvciAoYXV0byAmdWluc3RUZXJtOiBpbnN0LT5nZXRJbnN0VGVybXMoKSkgewotICAgIGZySW5zdFRlcm0qIGluc3RUZXJtID0gdWluc3RUZXJtLmdldCgpOwotICAgIGF1dG8gaW5zdFRlcm1UeXBlID0gaW5zdFRlcm0tPmdldFRlcm0oKS0+Z2V0VHlwZSgpOwotICAgIGlmIChpbnN0VGVybVR5cGUgIT0gZnJUZXJtRW51bTo6ZnJjTm9ybWFsVGVybSAmJiBpbnN0VGVybVR5cGUgIT0gZnJUZXJtRW51bTo6ZnJjQ2xvY2tUZXJtKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgZm9yIChhdXRvICZ1cGluOiBpbnN0VGVybS0+Z2V0VGVybSgpLT5nZXRQaW5zKCkpIHsKLSAgICAgIGZyUGluKiBwaW4gPSB1cGluLmdldCgpOwotICAgICAgZnJUcmFuc2Zvcm0gaW5zdFhmb3JtOyAKLSAgICAgIGluc3QtPmdldFVwZGF0ZWRYZm9ybShpbnN0WGZvcm0pOwotICAgICAgYXV0byAmYXBzID0gcGluLT5nZXRBY2Nlc3NQYXR0ZXJucyhpbnN0WGZvcm0ub3JpZW50KCkpOwotICAgICAgc3RkOjpzb3J0KGFwcy5iZWdpbigpLCBhcHMuZW5kKCksIEFQQ29tcCgpKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2lvL2ZyQVBHLmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9pby9mckFQRy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDFhZTM3Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2lvL2ZyQVBHLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIF9GUl9BUEdfSF8KLSNkZWZpbmUgX0ZSX0FQR19IXwotCi0jaW5jbHVkZSAiZnJCYXNlVHlwZXMuaCIKLSNpbmNsdWRlICJmckRlc2lnbi5oIgotI2luY2x1ZGUgImRiL3RlY2gvZnJDb25zdHJhaW50LmgiCi0jaW5jbHVkZSAiZHJjL2ZyRFJDLmgiCi0KLW5hbWVzcGFjZSBmciB7Ci0gIGNsYXNzIEFQR1dvcmtlciB7Ci0gIHB1YmxpYzoKLSAgICBBUEdXb3JrZXIoKSB7fQotICAgIEFQR1dvcmtlcihmckRlc2lnbiogZGVzaWduSW4sIGZySW5zdCogaW5zdEluKTogZGVzaWduKGRlc2lnbkluKSwgaW5zdChpbnN0SW4pIHsKLQotICAgIH0KLQotICAgIHZvaWQgaW5pdCgpOwotICAgIHZvaWQgc2V0dXAoKTsKLSAgICB2b2lkIG1haW4oKTsKLSAgICB2b2lkIGVuZCgpOwotCi0KLQotICBwcm90ZWN0ZWQ6Ci0gICAgZnJEZXNpZ24qIGRlc2lnbjsKLSAgICBmckluc3QqIGluc3Q7Ci0gICAgLy8gZnJWZWN0b3I8ZnJBY2Nlc3NQYXR0ZXJuKj4gYXBzOwotICAgIHN0ZDo6c2V0PGZyUGluKj4gdW5Db25uZWN0ZWRQaW5zOwotICAgIGZyVmVjdG9yPGZyUGluKj4gcGluT3JkZXI7Ci0gICAgc3RkOjpzZXQ8RmxleEFjY2Vzc1BhdHRlcm4qPiB2YWxpZEFQczsKLSAgICBmclZlY3RvcjxGbGV4QWNjZXNzUGF0dGVybio+IGJlc3RBUENvbWI7Ci0gICAgc3RkOjptYXA8ZnJQaW4qLCBzdGQ6OnZlY3RvcjxGbGV4QWNjZXNzUGF0dGVybio+ID4gcGluMkFQczsKLSAgICBzdGQ6Om1hcDxmckxheWVyTnVtLCBiZ2k6OnJ0cmVlPHN0ZDo6cGFpcjxwb2ludF90LCBGbGV4QWNjZXNzUGF0dGVybio+LCBiZ2k6OnF1YWRyYXRpYzwxNj4gPiA+IGxheWVyMkFQUlRyZWU7Ci0gICAgUmVjdGFuZ2xlIGFwQkJveFJlY3Q7Ci0KLSAgICAvLyBmdW5jdGlvbnMKLSAgICB2b2lkIHVwZGF0ZUFQU3RhdHVzKCk7Ci0gIH07Ci19Ci0KLQotCi0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9pby9mckd1aWRlUHJlcC5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9pby9mckd1aWRlUHJlcC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4YmI0NTYuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvaW8vZnJHdWlkZVByZXAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTM1MiArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGl0ZXJhdG9yPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxib29zdC9ncmFwaC9jb25uZWN0ZWRfY29tcG9uZW50cy5ocHA+Ci0jaW5jbHVkZSAiZ2xvYmFsLmgiCi0jaW5jbHVkZSAiaW8vZnJHdWlkZVByZXAuaCIKLSNpbmNsdWRlICJpby9mclNoYXBlVXRpbC5oIgotI2luY2x1ZGUgImlvL2ZyVXRpbC5oIgotI2luY2x1ZGUgImRiL29iai9mclJvdXRlLmgiCi0vLyNpbmNsdWRlIDx0eXBlaW5mbz4KLQotCi1uYW1lc3BhY2UgZnIgewotICBmckNvb3JkIEdDRUxMR1JJRFggPSAtMTsKLSAgZnJDb29yZCBHQ0VMTEdSSURZID0gLTE7Ci0gIGZyQ29vcmQgR0NFTExPRkZTRVRYID0gLTE7Ci0gIGZyQ29vcmQgR0NFTExPRkZTRVRZID0gLTE7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxmcjo6ZnJMYXllcj4gPiAqZGVzaWduTGF5ZXJzOwotCi0gIGZyQ29vcmQgZ2V0R0NFTExHUklEWCgpIHsKLSAgICByZXR1cm4gR0NFTExHUklEWDsKLSAgfQotCi0gIGZyQ29vcmQgZ2V0R0NFTExHUklEWSgpIHsKLSAgICByZXR1cm4gR0NFTExHUklEWTsKLSAgfQotCi0gIGZyQ29vcmQgZ2V0R0NFTExPRkZTRVRYKCkgewotICAgIHJldHVybiBHQ0VMTE9GRlNFVFg7Ci0gIH0KLQotICBmckNvb3JkIGdldEdDRUxMT0ZGU0VUWSgpIHsKLSAgICByZXR1cm4gR0NFTExPRkZTRVRZOwotICB9Ci0KLSAgCi0gIHZvaWQgc2V0R0NFTExHUklEWChmckNvb3JkICZnQ2VsbEdyaWRYSW4pIHsKLSAgICBHQ0VMTEdSSURYID0gZ0NlbGxHcmlkWEluOwotICB9Ci0gIHZvaWQgc2V0R0NFTExHUklEWShmckNvb3JkICZnQ2VsbEdyaWRZSW4pIHsKLSAgICBHQ0VMTEdSSURZID0gZ0NlbGxHcmlkWUluOwotICB9Ci0gIHZvaWQgc2V0R0NFTExPRkZTRVRYKGZyQ29vcmQgJmdDZWxsT2Zmc2V0WEluKSB7Ci0gICAgR0NFTExPRkZTRVRYID0gZ0NlbGxPZmZzZXRYSW47Ci0gIH0KLSAgdm9pZCBzZXRHQ0VMTE9GRlNFVFkoZnJDb29yZCAmZ0NlbGxPZmZzZXRZSW4pIHsKLSAgICBHQ0VMTE9GRlNFVFkgPSBnQ2VsbE9mZnNldFlJbjsKLSAgfQotCi0gIHZvaWQgZ2V0R0NlbGxQYXJhbShzdGQ6Om1hcDxzdGQ6OnN0cmluZywgZnI6OmZyQ29sbGVjdGlvbjxmcjo6ZnJSZWN0PiA+ICZyYXdHdWlkZSwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGZyOjpmckxheWVyPiA+ICZ2bGF5ZXJzKSB7Ci0gICAgZ2V0R0NlbGxTaXplUGFyYW0ocmF3R3VpZGUsIHZsYXllcnMpOwotICAgIGdldEdDZWxsT2Zmc2V0UGFyYW0ocmF3R3VpZGUsIHZsYXllcnMpOwotICB9Ci0KLSAgdm9pZCBnZXRHQ2VsbFNpemVQYXJhbShzdGQ6Om1hcDxzdGQ6OnN0cmluZywgZnI6OmZyQ29sbGVjdGlvbjxmcjo6ZnJSZWN0PiA+ICZyYXdHdWlkZSwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGZyOjpmckxheWVyPiA+ICZ2bGF5ZXJzKSB7Ci0gICAgc3RkOjptYXA8ZnJDb29yZCwgaW50PiBndWlkZUdyaWRYTWFwLCBndWlkZUdyaWRZTWFwOwotICAgIC8vIGdldCBHQ2VsbCBzaXplIGluZm9ybWF0aW9uIGxvb3AKLSAgICBmb3IgKGF1dG8gZ3VpZGVJdCA9IHJhd0d1aWRlLmJlZ2luKCk7IGd1aWRlSXQgIT0gcmF3R3VpZGUuZW5kKCk7ICsrZ3VpZGVJdCkgewotICAgICAgc3RkOjpzdHJpbmcgbmV0TmFtZSA9IGd1aWRlSXQtPmZpcnN0OwotICAgICAgYXV0byAmcmVjdHMgPSBndWlkZUl0LT5zZWNvbmQ7Ci0gICAgICBmb3IgKGF1dG8gJnJlY3Q6IHJlY3RzKSB7Ci0gICAgICAgIGZyTGF5ZXJOdW0gbGF5ZXJOdW0gPSByZWN0LmdldExheWVyTnVtKCk7Ci0gICAgICAgIGZyQm94IGd1aWRlQkJveDsKLSAgICAgICAgcmVjdC5nZXRCQm94KGd1aWRlQkJveCk7Ci0KLSAgICAgICAgLy8gZ2V0IEdDZWxsIHdpZHRoCi0gICAgICAgIGZyQ29vcmQgZ3VpZGVXaWR0aCA9IC0xOwotICAgICAgICBpZiAodmxheWVyc1tsYXllck51bV0tPmdldERpcigpID09IGZyY0hvcnpQcmVmUm91dGluZ0RpcikgewotICAgICAgICAgIGd1aWRlV2lkdGggPSBndWlkZUJCb3gudG9wKCkgLSBndWlkZUJCb3guYm90dG9tKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAodmxheWVyc1tsYXllck51bV0tPmdldERpcigpID09IGZyY1ZlcnRQcmVmUm91dGluZ0RpcikgewotICAgICAgICAgIGd1aWRlV2lkdGggPSBndWlkZUJCb3gucmlnaHQoKSAtIGd1aWRlQkJveC5sZWZ0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB1cGRhdGUgR0NlbGwgc2l6ZSBpbmZvCi0gICAgICAgIGlmIChndWlkZVdpZHRoID09IC0xKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKHZsYXllcnNbbGF5ZXJOdW1dLT5nZXREaXIoKSA9PSBmcmNIb3J6UHJlZlJvdXRpbmdEaXIpIHsKLSAgICAgICAgICAgIGlmIChndWlkZUdyaWRZTWFwLmZpbmQoZ3VpZGVXaWR0aCkgPT0gZ3VpZGVHcmlkWU1hcC5lbmQoKSkgewotICAgICAgICAgICAgICBndWlkZUdyaWRZTWFwW2d1aWRlV2lkdGhdID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGd1aWRlR3JpZFlNYXBbZ3VpZGVXaWR0aF0rKzsKLSAgICAgICAgICB9IGVsc2UgaWYgKHZsYXllcnNbbGF5ZXJOdW1dLT5nZXREaXIoKSA9PSBmcmNWZXJ0UHJlZlJvdXRpbmdEaXIpIHsKLSAgICAgICAgICAgIGlmIChndWlkZUdyaWRYTWFwLmZpbmQoZ3VpZGVXaWR0aCkgPT0gZ3VpZGVHcmlkWE1hcC5lbmQoKSkgewotICAgICAgICAgICAgICBndWlkZUdyaWRYTWFwW2d1aWRlV2lkdGhdID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGd1aWRlR3JpZFhNYXBbZ3VpZGVXaWR0aF0rKzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgfQotCi0gICAgfQotCi0gICAgZnJDb29yZCB0bXBHQ0VMTEdSSURYID0gLTEsIHRtcEdDRUxMR1JJRFkgPSAtMTsKLSAgICBpbnQgdG1wR0NFTExHUklEWENudCA9IC0xLCB0bXBHQ0VMTEdSSURZQ250ID0gLTE7Ci0gICAgZm9yIChhdXRvIG1hcEl0ID0gZ3VpZGVHcmlkWE1hcC5iZWdpbigpOyBtYXBJdCAhPSBndWlkZUdyaWRYTWFwLmVuZCgpOyArK21hcEl0KSB7Ci0gICAgICBhdXRvIGNudCA9IG1hcEl0LT5zZWNvbmQ7Ci0gICAgICBpZiAoY250ID4gdG1wR0NFTExHUklEWENudCkgewotICAgICAgICB0bXBHQ0VMTEdSSURYQ250ID0gY250OwotICAgICAgICB0bXBHQ0VMTEdSSURYID0gbWFwSXQtPmZpcnN0OwotICAgICAgfQotICAgIH0KLQotICAgIGZvciAoYXV0byBtYXBJdCA9IGd1aWRlR3JpZFlNYXAuYmVnaW4oKTsgbWFwSXQgIT0gZ3VpZGVHcmlkWU1hcC5lbmQoKTsgKyttYXBJdCkgewotICAgICAgYXV0byBjbnQgPSBtYXBJdC0+c2Vjb25kOwotICAgICAgaWYgKGNudCA+IHRtcEdDRUxMR1JJRFlDbnQpIHsKLSAgICAgICAgdG1wR0NFTExHUklEWUNudCA9IGNudDsKLSAgICAgICAgdG1wR0NFTExHUklEWSA9IG1hcEl0LT5maXJzdDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodG1wR0NFTExHUklEWCAhPSAtMSkgewotICAgICAgc2V0R0NFTExHUklEWCh0bXBHQ0VMTEdSSURYKTsKLSAgICB9Ci0gICAgaWYgKHRtcEdDRUxMR1JJRFkgIT0gLTEpIHsKLSAgICAgIHNldEdDRUxMR1JJRFkodG1wR0NFTExHUklEWSk7Ci0gICAgfQotCi0gIH0KLSAgCi0KLQotICB2b2lkIGdldEdDZWxsT2Zmc2V0UGFyYW0oc3RkOjptYXA8c3RkOjpzdHJpbmcsIGZyOjpmckNvbGxlY3Rpb248ZnI6OmZyUmVjdD4gPiAmcmF3R3VpZGUsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxmcjo6ZnJMYXllcj4gPiAmdmxheWVycykgewotICAgIHN0ZDo6bWFwPGZyQ29vcmQsIGludD4gZ3VpZGVPZmZzZXRYTWFwLCBndWlkZU9mZnNldFlNYXA7Ci0gICAgZnJDb29yZCBHQ0VMTEdSSURYID0gZ2V0R0NFTExHUklEWCgpOwotICAgIGZyQ29vcmQgR0NFTExHUklEWSA9IGdldEdDRUxMR1JJRFkoKTsKLQotICAgIC8vIGdldCBHQ2VsbCBvZmZzZXQgaW5mb3JtYXRpb24gbG9vcAotICAgIGZvciAoYXV0byBndWlkZUl0ID0gcmF3R3VpZGUuYmVnaW4oKTsgZ3VpZGVJdCAhPSByYXdHdWlkZS5lbmQoKTsgKytndWlkZUl0KSB7Ci0gICAgICBzdGQ6OnN0cmluZyBuZXROYW1lID0gZ3VpZGVJdC0+Zmlyc3Q7Ci0gICAgICBhdXRvICZyZWN0cyA9IGd1aWRlSXQtPnNlY29uZDsKLSAgICAgIGZvciAoYXV0byAmcmVjdDogcmVjdHMpIHsKLSAgICAgICAgZnJMYXllck51bSBsYXllck51bSA9IHJlY3QuZ2V0TGF5ZXJOdW0oKTsKLSAgICAgICAgZnJCb3ggZ3VpZGVCQm94OwotICAgICAgICByZWN0LmdldEJCb3goZ3VpZGVCQm94KTsKLQotICAgICAgICAvLyBnZXQgR0NlbGwgd2lkdGgKLSAgICAgICAgZnJDb29yZCBndWlkZU9mZnNldCA9IC0xOwotICAgICAgICBpZiAodmxheWVyc1tsYXllck51bV0tPmdldERpcigpID09IGZyY0hvcnpQcmVmUm91dGluZ0RpcikgewotICAgICAgICAgIGd1aWRlT2Zmc2V0ID0gZ3VpZGVCQm94LmxlZnQoKSAlIEdDRUxMR1JJRFg7Ci0gICAgICAgIH0gZWxzZSBpZiAodmxheWVyc1tsYXllck51bV0tPmdldERpcigpID09IGZyY1ZlcnRQcmVmUm91dGluZ0RpcikgewotICAgICAgICAgIGd1aWRlT2Zmc2V0ID0gZ3VpZGVCQm94LmJvdHRvbSgpICUgR0NFTExHUklEWTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHVwZGF0ZSBHQ2VsbCBzaXplIGluZm8KLSAgICAgICAgaWYgKGd1aWRlT2Zmc2V0ID09IC0xKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKHZsYXllcnNbbGF5ZXJOdW1dLT5nZXREaXIoKSA9PSBmcmNIb3J6UHJlZlJvdXRpbmdEaXIpIHsKLSAgICAgICAgICAgIGlmIChndWlkZU9mZnNldFhNYXAuZmluZChndWlkZU9mZnNldCkgPT0gZ3VpZGVPZmZzZXRYTWFwLmVuZCgpKSB7Ci0gICAgICAgICAgICAgIGd1aWRlT2Zmc2V0WE1hcFtndWlkZU9mZnNldF0gPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ3VpZGVPZmZzZXRYTWFwW2d1aWRlT2Zmc2V0XSsrOwotICAgICAgICAgIH0gZWxzZSBpZiAodmxheWVyc1tsYXllck51bV0tPmdldERpcigpID09IGZyY1ZlcnRQcmVmUm91dGluZ0RpcikgewotICAgICAgICAgICAgaWYgKGd1aWRlT2Zmc2V0WU1hcC5maW5kKGd1aWRlT2Zmc2V0KSA9PSBndWlkZU9mZnNldFlNYXAuZW5kKCkpIHsKLSAgICAgICAgICAgICAgZ3VpZGVPZmZzZXRZTWFwW2d1aWRlT2Zmc2V0XSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBndWlkZU9mZnNldFlNYXBbZ3VpZGVPZmZzZXRdKys7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgIH0KLQotICAgIH0KLSAgICBmckNvb3JkIHRtcEdDRUxMT0ZGU0VUWCA9IC0xLCB0bXBHQ0VMTE9GRlNFVFkgPSAtMTsKLSAgICBpbnQgdG1wR0NFTExPRkZTRVRYQ250ID0gLTEsIHRtcEdDRUxMT0ZGU0VUWUNudCA9IC0xOwotICAgIGZvciAoYXV0byBtYXBJdCA9IGd1aWRlT2Zmc2V0WE1hcC5iZWdpbigpOyBtYXBJdCAhPSBndWlkZU9mZnNldFhNYXAuZW5kKCk7ICsrbWFwSXQpIHsKLSAgICAgIGF1dG8gY250ID0gbWFwSXQtPnNlY29uZDsKLSAgICAgIGlmIChjbnQgPiB0bXBHQ0VMTE9GRlNFVFhDbnQpIHsKLSAgICAgICAgdG1wR0NFTExPRkZTRVRYQ250ID0gY250OwotICAgICAgICB0bXBHQ0VMTE9GRlNFVFggPSBtYXBJdC0+Zmlyc3Q7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChhdXRvIG1hcEl0ID0gZ3VpZGVPZmZzZXRZTWFwLmJlZ2luKCk7IG1hcEl0ICE9IGd1aWRlT2Zmc2V0WU1hcC5lbmQoKTsgKyttYXBJdCkgewotICAgICAgYXV0byBjbnQgPSBtYXBJdC0+c2Vjb25kOwotICAgICAgaWYgKGNudCA+IHRtcEdDRUxMT0ZGU0VUWUNudCkgewotICAgICAgICB0bXBHQ0VMTE9GRlNFVFlDbnQgPSBjbnQ7Ci0gICAgICAgIHRtcEdDRUxMT0ZGU0VUWSA9IG1hcEl0LT5maXJzdDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodG1wR0NFTExPRkZTRVRYICE9IC0xKSB7Ci0gICAgICBzZXRHQ0VMTE9GRlNFVFgodG1wR0NFTExPRkZTRVRYKTsKLSAgICB9Ci0gICAgaWYgKHRtcEdDRUxMT0ZGU0VUWSAhPSAtMSkgewotICAgICAgc2V0R0NFTExPRkZTRVRZKHRtcEdDRUxMT0ZGU0VUWSk7Ci0gICAgfQotCi0gIH0KLQotICB2b2lkIGdlbkdDZWxsMlBpbk1hcChzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzaGFyZWRfcHRyPGZyOjpmckJsb2NrPiA+ICZtYWNyb3MsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8ZnI6OmZyTmV0PiA+ICZuZXRzLAotICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjptYXA8ZnJQb2ludCwgc3RkOjpzZXQ8c3RkOjpwYWlyPGZyQmxvY2tPYmplY3QqLCBmckxheWVyTnVtPiA+ID4gPiAmZ0NlbGwyUGluTWFwKSB7Ci0gICAgLy9ib29sIGRlYnVnTW9kZSA9IGZhbHNlOwotICAgIC8vZnJDb29yZCBHQ0VMTEdSSURYID0gZ2V0R0NFTExHUklEWCgpOwotICAgIC8vZnJDb29yZCBHQ0VMTEdSSURZID0gZ2V0R0NFTExHUklEWSgpOwotICAgIC8vZnJDb29yZCBHQ0VMTE9GRlNFVFggPSBnZXRHQ0VMTE9GRlNFVFgoKTsKLSAgICAvL2ZyQ29vcmQgR0NFTExPRkZTRVRZID0gZ2V0R0NFTExPRkZTRVRZKCk7Ci0gICAgaWYgKFZFUkJPU0UgPiAwKSB7Ci0gICAgICBzdGQ6OmNvdXQgPDxzdGQ6OmVuZGwgPDwiZ2VuIGdjZWxsIHRvIHBpbiBtYXAgLi4uIiA8PHN0ZDo6ZW5kbDsKLSAgICB9Ci0gICAgaW50IGNudCA9IDA7Ci0gICAgZm9yIChhdXRvIG5ldEl0ID0gbmV0cy5iZWdpbigpOyBuZXRJdCAhPSBuZXRzLmVuZCgpOyArK25ldEl0KSB7Ci0gICAgICBhdXRvIG5ldE5hbWUgPSBuZXRJdC0+Zmlyc3Q7Ci0gICAgICBhdXRvICZuZXQgPSBuZXRJdC0+c2Vjb25kOwotICAgICAgLy8gc3RkOjpjb3V0IDw8ICJuZXQ6ICIgPDwgbmV0TmFtZSA8PCBzdGQ6OmVuZGw7Ci0gICAgICAvLyB1cGRhdGUgZm9yIGluc3QgdGVybQotICAgICAgZm9yIChhdXRvICZpbnN0VGVybTogbmV0LT5nZXRJbnN0VGVybXMoKSkgewotICAgICAgICBmclN0cmluZyBjZWxsTmFtZTsKLSAgICAgICAgZnJUcmFuc2Zvcm0geGZvcm07Ci0gICAgICAgIGZyQm94ICAgbWJveDsKLSAgICAgICAgaW5zdFRlcm0tPmdldEluc3QoKS0+Z2V0VHJhbnNmb3JtKHhmb3JtKTsKLSAgICAgICAgaW5zdFRlcm0tPmdldEluc3QoKS0+Z2V0UmVmTmFtZShjZWxsTmFtZSk7Ci0gICAgICAgIG1hY3Jvc1tjZWxsTmFtZV0tPmdldEJCb3gobWJveCk7Ci0gICAgICAgIGZyUG9pbnQgc2l6ZShtYm94LnJpZ2h0KCksIG1ib3gudG9wKCkpOwotICAgICAgICB1cGRhdGVYZm9ybSh4Zm9ybSwgc2l6ZSk7Ci0gICAgICAgIGF1dG8gYWJzSW5zdFRlcm0gPSBzdGQ6Om1ha2Vfc2hhcmVkPGZySW5zdFRlcm0+KCppbnN0VGVybSwgeGZvcm0pOwotCi0gICAgICAgIGZyU3RyaW5nIHRlcm1OYW1lLCBpbnN0TmFtZTsKLSAgICAgICAgYXV0byB0ZXJtID0gYWJzSW5zdFRlcm0tPmdldFRlcm0oKTsKLSAgICAgICAgdXBkYXRlR0NlbGwyUGluTWFwKHN0YXRpY19jYXN0PGZyQmxvY2tPYmplY3QqPihpbnN0VGVybS5nZXQoKSksIHRlcm0sIG5ldE5hbWUsIGdDZWxsMlBpbk1hcCk7Ci0gICAgICB9Ci0gICAgICAvLyB1cGRhdGUgZm9yIHRlcm0KLSAgICAgIGZvciAoYXV0byB0ZXJtOiBuZXQtPmdldFRlcm1zKCkpIHsKLSAgICAgICAgdXBkYXRlR0NlbGwyUGluTWFwKHN0YXRpY19jYXN0PGZyQmxvY2tPYmplY3QqPih0ZXJtKSwgdGVybSwgbmV0TmFtZSwgZ0NlbGwyUGluTWFwKTsKLSAgICAgIH0KLSAgICAgIGNudCsrOwotICAgICAgaWYgKFZFUkJPU0UgPiAwKSB7Ci0gICAgICAgIGlmIChjbnQgJSAxMDAwMCA9PSAwKSB7Ci0gICAgICAgICAgc3RkOjpjb3V0IDw8IiAgY29tcGxldGUgIiA8PGNudCA8PCIgbmV0cyIgPDxzdGQ6OmVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIC8vIHVwZGF0ZSBHQ2VsbDJQaW5NYXAgYmFzZWQgb24gd2hldGhlciB0aGUgdGVybSBpcyBpbnRlcnNlY3Rpbmcgd2l0aCBhbnkgR0NlbGwKLSAgdm9pZCB1cGRhdGVHQ2VsbDJQaW5NYXAoZnJCbG9ja09iamVjdCogYmxvY2tPYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZyVGVybSAqdGVybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmV0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6bWFwPGZyUG9pbnQsIHN0ZDo6c2V0PHN0ZDo6cGFpcjxmckJsb2NrT2JqZWN0KiwgZnJMYXllck51bT4gPiA+ID4gJmdDZWxsMlBpbk1hcCkgewotICAgIGJvb2wgZGVidWdNb2RlID0gZmFsc2U7Ci0gICAgZnJDb29yZCBHQ0VMTEdSSURYID0gZ2V0R0NFTExHUklEWCgpOwotICAgIGZyQ29vcmQgR0NFTExHUklEWSA9IGdldEdDRUxMR1JJRFkoKTsKLSAgICBmckNvb3JkIEdDRUxMT0ZGU0VUWCA9IGdldEdDRUxMT0ZGU0VUWCgpOwotICAgIGZyQ29vcmQgR0NFTExPRkZTRVRZID0gZ2V0R0NFTExPRkZTRVRZKCk7Ci0gICAgZnJMYXllck51bSBsYXllck51bTsKLQotICAgIGZvciAoYXV0byAmcGluOiB0ZXJtLT5nZXRQaW5zKCkpIHsKLSAgICAgIC8vc3RkOjpjb3V0IDw8IHRlcm0tPmdldE5hbWUoKSA8PCAiXG4iOyAKLSAgICAgIGZvciAoYXV0byAmdVBpbkZpZzogcGluLT5nZXRGaWdzKCkpIHsKLSAgICAgICAgYXV0byBwaW5GaWcgPSB1UGluRmlnLmdldCgpOwotICAgICAgICBib29zdFBvbHlnb24gcGluRmlnUG9seTsKLSAgICAgICAgZnJDb29yZCBsbHgsIGxseSwgdXJ4LCB1cnk7Ci0gICAgICAgIGZyQ29vcmQgZ0NlbGxNaW5YLCBnQ2VsbE1pblksIGdDZWxsTWF4WCwgZ0NlbGxNYXhZOwotICAgICAgICAKLSAgICAgICAgLy8gZ2V0IHRoZSBleGFjdCBwaW5GaWdQb2x5Ci0gICAgICAgIC8vIGdldCB0aGUgR0NlbGxzIHdoaWNoIHRoZSBCQm94IG9mIHRoZSBwaW5GaWcgaXMgaW50ZXJzZWN0aW5nIHdpdGgKLSAgICAgICAgZnJCb3ggcGluRmlnQkJveDsKLSAgICAgICAgcGluRmlnLT5nZXRCQm94KHBpbkZpZ0JCb3gpOwotICAgICAgICBsbHggPSBwaW5GaWdCQm94LmxlZnQoKTsKLSAgICAgICAgbGx5ID0gcGluRmlnQkJveC5ib3R0b20oKTsKLSAgICAgICAgdXJ4ID0gcGluRmlnQkJveC5yaWdodCgpOwotICAgICAgICB1cnkgPSBwaW5GaWdCQm94LnRvcCgpOwotICAgICAgICAvLyBnZXQgbWluL21heCBHQ2VsbCBjZW50ZXIgeCB5Ci0gICAgICAgIGdDZWxsTWluWCA9IChsbHggLSBHQ0VMTE9GRlNFVFgpIC8gR0NFTExHUklEWCAqIEdDRUxMR1JJRFggKyBHQ0VMTE9GRlNFVFggKyBHQ0VMTEdSSURYIC8gMjsKLSAgICAgICAgZ0NlbGxNaW5ZID0gKGxseSAtIEdDRUxMT0ZGU0VUWSkgLyBHQ0VMTEdSSURZICogR0NFTExHUklEWSArIEdDRUxMT0ZGU0VUWSArIEdDRUxMR1JJRFkgLyAyOwotICAgICAgICBnQ2VsbE1heFggPSAodXJ4IC0gR0NFTExPRkZTRVRYKSAvIEdDRUxMR1JJRFggKiBHQ0VMTEdSSURYICsgR0NFTExPRkZTRVRYICsgR0NFTExHUklEWCAvIDI7Ci0gICAgICAgIGdDZWxsTWF4WSA9ICh1cnkgLSBHQ0VMTE9GRlNFVFkpIC8gR0NFTExHUklEWSAqIEdDRUxMR1JJRFkgKyBHQ0VMTE9GRlNFVFkgKyBHQ0VMTEdSSURZIC8gMjsKLSAgICAgICAgLy8gZ2V0IGV4YWN0IHBpbiBzaGFwZQotICAgICAgICBzd2l0Y2gocGluRmlnLT50eXBlSWQoKSkgewotICAgICAgICAgIGNhc2UgZnJjUmVjdDoKLSAgICAgICAgICAgIGZyUmVjdDJQb2x5KCooc3RhdGljX2Nhc3Q8ZnJSZWN0Kj4ocGluRmlnKSksIHBpbkZpZ1BvbHkpOwotICAgICAgICAgICAgbGF5ZXJOdW0gPSAoc3RhdGljX2Nhc3Q8ZnJSZWN0Kj4ocGluRmlnKSktPmdldExheWVyTnVtKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIGZyY1BvbHlnb246Ci0gICAgICAgICAgICBmclBvbHlnb24yUG9seSgqKHN0YXRpY19jYXN0PGZyUG9seWdvbio+KHBpbkZpZykpLCBwaW5GaWdQb2x5KTsKLSAgICAgICAgICAgIGxheWVyTnVtID0gKHN0YXRpY19jYXN0PGZyUG9seWdvbio+KHBpbkZpZykpLT5nZXRMYXllck51bSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZ2V0IGV4YWN0IG92ZXJsYXBwcGluZyBiZXR3ZWVuIHBpbiBhbmQgZ2NlbGxzCi0gICAgICAgIGZvciAoZnJDb29yZCBnQ2VsbExvY1ggPSBnQ2VsbE1pblg7IGdDZWxsTG9jWCA8PSBnQ2VsbE1heFg7IGdDZWxsTG9jWCArPSBHQ0VMTEdSSURYKSB7Ci0gICAgICAgICAgZm9yIChmckNvb3JkIGdDZWxsTG9jWSA9IGdDZWxsTWluWTsgZ0NlbGxMb2NZIDw9IGdDZWxsTWF4WTsgZ0NlbGxMb2NZICs9IEdDRUxMR1JJRFkpIHsKLSAgICAgICAgICAgIGZyUG9pbnQgZ0NlbGxDZW50ZXIoZ0NlbGxMb2NYLCBnQ2VsbExvY1kpOwotICAgICAgICAgICAgZnJCb3ggZ0NlbGxCb3ggPSBwb2ludDJHQ2VsbEJveChnQ2VsbENlbnRlcik7Ci0gICAgICAgICAgICBib29zdFBvbHlnb24gZ0NlbGxQb2x5OwotICAgICAgICAgICAgZnJCb3gyUG9seShnQ2VsbEJveCwgZ0NlbGxQb2x5KTsKLSAgICAgICAgICAgIGlmIChib29zdDo6Z2VvbWV0cnk6OmludGVyc2VjdHMoZ0NlbGxQb2x5LCBwaW5GaWdQb2x5KSkgewotICAgICAgICAgICAgICBpZiAoZGVidWdNb2RlKSB7Ci0gICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICIgIEdDZWxsOiAoIiA8PCBnQ2VsbEJveC5sZWZ0KCkgPDwgIiwgIiA8PCBnQ2VsbEJveC5ib3R0b20oKQotICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKS0tKCIgPDwgZ0NlbGxCb3gucmlnaHQoKSA8PCAiLCAiIDw8IGdDZWxsQm94LnRvcCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpIGludGVyc2VjdGluZyB3aXRoIFRlcm0vSW5zdFRlcm0gb24gbGF5ZXIgIiA8PCBsYXllck51bSA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKGdDZWxsMlBpbk1hcC5maW5kKG5ldE5hbWUpID09IGdDZWxsMlBpbk1hcC5lbmQoKSkgewotICAgICAgICAgICAgICAgIGdDZWxsMlBpbk1hcFtuZXROYW1lXSA9IHN0ZDo6bWFwPGZyUG9pbnQsIHN0ZDo6c2V0PHN0ZDo6cGFpcjxmckJsb2NrT2JqZWN0KiwgZnJMYXllck51bT4gPiA+KCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKGdDZWxsMlBpbk1hcFtuZXROYW1lXS5maW5kKGdDZWxsQ2VudGVyKSA9PSBnQ2VsbDJQaW5NYXBbbmV0TmFtZV0uZW5kKCkpIHsKLSAgICAgICAgICAgICAgICBnQ2VsbDJQaW5NYXBbbmV0TmFtZV1bZ0NlbGxDZW50ZXJdID0gc3RkOjpzZXQ8c3RkOjpwYWlyPGZyQmxvY2tPYmplY3QqLCBmckxheWVyTnVtPiA+KCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZ0NlbGwyUGluTWFwW25ldE5hbWVdW2dDZWxsQ2VudGVyXS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoYmxvY2tPYmosIGxheWVyTnVtKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZnJCb3ggcG9pbnQyR0NlbGxCb3goZnJQb2ludCAmcG9pbnRJbikgewotICAgIAotICAgIGZyQ29vcmQgbGx4LCBsbHksIHVyeCwgdXJ5OwotICAgIGZyQ29vcmQgR0NFTExHUklEWCA9IGdldEdDRUxMR1JJRFgoKTsKLSAgICBmckNvb3JkIEdDRUxMR1JJRFkgPSBnZXRHQ0VMTEdSSURZKCk7Ci0gICAgZnJDb29yZCBHQ0VMTE9GRlNFVFggPSBnZXRHQ0VMTE9GRlNFVFgoKTsKLSAgICBmckNvb3JkIEdDRUxMT0ZGU0VUWSA9IGdldEdDRUxMT0ZGU0VUWSgpOwotCi0gICAgbGx4ID0gKHBvaW50SW4ueCgpIC0gR0NFTExPRkZTRVRYKSAvIEdDRUxMR1JJRFggKiBHQ0VMTEdSSURYICsgR0NFTExPRkZTRVRYOwotICAgIHVyeCA9IGxseCArIEdDRUxMR1JJRFg7Ci0gICAgbGx5ID0gKHBvaW50SW4ueSgpIC0gR0NFTExPRkZTRVRZKSAvIEdDRUxMR1JJRFkgKiBHQ0VMTEdSSURZICsgR0NFTExPRkZTRVRZOwotICAgIHVyeSA9IGxseSArIEdDRUxMR1JJRFk7Ci0KLSAgICBmckJveCBnQ2VsbEJveChsbHgsIGxseSwgdXJ4LCB1cnkpOwotICAgIHJldHVybiBnQ2VsbEJveDsKLQotICB9Ci0KLSAgdm9pZCB1cGRhdGVYZm9ybShmclRyYW5zZm9ybSAmeGZvcm0sIGZyUG9pbnQgJnNpemUpIHsKLSAgICBzd2l0Y2goeGZvcm0ub3JpZW50KCkpIHsKLSAgICAgIC8vY2FzZSBmcmNSMDogPT0gZGVmYXVsdAotICAgICAgY2FzZSBmcmNSOTA6Ci0gICAgICAgIHhmb3JtLnNldCh4Zm9ybS54T2Zmc2V0KCkgKyBzaXplLnkoKSwgeGZvcm0ueU9mZnNldCgpICAgICAgICAgICApOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgZnJjUjE4MDogLy8gdmVyaWZpZWQKLSAgICAgICAgeGZvcm0uc2V0KHhmb3JtLnhPZmZzZXQoKSArIHNpemUueCgpLCB4Zm9ybS55T2Zmc2V0KCkgKyBzaXplLnkoKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBmcmNSMjcwOgotICAgICAgICB4Zm9ybS5zZXQoeGZvcm0ueE9mZnNldCgpLCAgICAgICAgICAgIHhmb3JtLnlPZmZzZXQoKSArIHNpemUueCgpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGZyY01ZOiAvLyB2ZXJpZmllZAotICAgICAgICB4Zm9ybS5zZXQoeGZvcm0ueE9mZnNldCgpICsgc2l6ZS54KCksIHhmb3JtLnlPZmZzZXQoKSAgICAgICAgICAgKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGZyY01YUjkwOgotICAgICAgICB4Zm9ybS5zZXQoeGZvcm0ueE9mZnNldCgpLCAgICAgICAgICAgIHhmb3JtLnlPZmZzZXQoKSAgICAgICAgICAgKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGZyY01YOiAvLyB2ZXJpZmllZAotICAgICAgICB4Zm9ybS5zZXQoeGZvcm0ueE9mZnNldCgpLCAgICAgICAgICAgIHhmb3JtLnlPZmZzZXQoKSArIHNpemUueSgpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGZyY01ZUjkwOgotICAgICAgICB4Zm9ybS5zZXQoeGZvcm0ueE9mZnNldCgpICsgc2l6ZS55KCksIHhmb3JtLnlPZmZzZXQoKSArIHNpemUueCgpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0ICAgICAgOiAvLyB2ZXJpZmllZAotICAgICAgICB4Zm9ybS5zZXQoeGZvcm0ueE9mZnNldCgpLCAgICAgICAgICAgIHhmb3JtLnlPZmZzZXQoKSAgICAgICAgICAgKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLy8gc3RhbmRhcmRpemUgZ3VpZGUgdG8gdW5pdCBnY2VsbCB3aWR0aCAvIGhlaWdodAotICAvLyB2b2lkIGdldFN0YW5kYXJkR3VpZGUoZnJDb2xsZWN0aW9uPGZyUmVjdD4gJmd1aWRlc0luLAotICAvLyAgICAgICAgICAgICAgICAgICAgICAgZnJDb2xsZWN0aW9uPGZyUmVjdD4gJmd1aWRlc091dCwKLSAgLy8gICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxmcjo6ZnJMYXllcj4gPiBsYXllcnMpIHsKLSAgLy8gICBzdGQ6Om1hcDxmckxheWVyTnVtLCBmckNvbGxlY3Rpb248ZnJCb3g+ID4gbGF5ZXIyQm94TWFwOwotICAgIAotICAvLyAgIGZyQ29vcmQgR0NFTExHUklEWCA9IGdldEdDRUxMR1JJRFgoKTsKLSAgLy8gICBmckNvb3JkIEdDRUxMR1JJRFkgPSBnZXRHQ0VMTEdSSURZKCk7Ci0gIC8vICAgZnJDb29yZCBHQ0VMTE9GRlNFVFggPSBnZXRHQ0VMTE9GRlNFVFgoKTsKLSAgLy8gICBmckNvb3JkIEdDRUxMT0ZGU0VUWSA9IGdldEdDRUxMT0ZGU0VUWSgpOwotCi0gIC8vICAgLy8gZ2VuIGd1aWRlIGJ5IGxheWVyIG1hcAotICAvLyAgIGZvciAoYXV0byAmZ3VpZGU6IGd1aWRlc0luKSB7Ci0gIC8vICAgICBmckxheWVyTnVtIGxheWVyTnVtID0gZ3VpZGUuZ2V0TGF5ZXJOdW0oKTsKLSAgLy8gICAgIGlmIChsYXllcjJCb3hNYXAuZmluZChsYXllck51bSkgPT0gbGF5ZXIyQm94TWFwLmVuZCgpKSB7Ci0gIC8vICAgICAgIGxheWVyMkJveE1hcFtsYXllck51bV0gPSBmckNvbGxlY3Rpb248ZnJCb3g+KCk7Ci0gIC8vICAgICB9Ci0gIC8vICAgICBmckJveCBndWlkZUJCb3g7Ci0gIC8vICAgICBndWlkZS5nZXRCQm94KGd1aWRlQkJveCk7Ci0gIC8vICAgICBsYXllcjJCb3hNYXBbbGF5ZXJOdW1dLnB1c2hfYmFjayhndWlkZUJCb3gpOwotICAvLyAgIH0KLQotCi0gIC8vICAgLy8gcHJvY2VzcyBpbml0aWFsIGd1aWRlIGxheWVyIGJ5IGxheWVyCi0gIC8vICAgZm9yIChhdXRvIG1hcEl0ID0gbGF5ZXIyQm94TWFwLmJlZ2luKCk7IG1hcEl0ICE9IGxheWVyMkJveE1hcC5lbmQoKTsgKyttYXBJdCkgewotCi0gIC8vICAgfQotCi0gIC8vIH0KLQotICB2b2lkIGdldFN0YW5kYXJkR3VpZGUoc3RkOjptYXA8c3RkOjpzdHJpbmcsIGZyOjpmckNvbGxlY3Rpb248ZnI6OmZyUmVjdD4gPiAmdG1wR3VpZGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGZyOjpmckxheWVyPiA+ICZ2bGF5ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c2hhcmVkX3B0cjxmcjo6ZnJOZXQ+ID4gJm5ldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjptYXA8ZnJQb2ludCwgc3RkOjpzZXQ8c3RkOjpwYWlyPGZyQmxvY2tPYmplY3QqLCBmcjo6ZnJMYXllck51bT4gPiA+ID4gJmdDZWxsMlBpbk1hcCkgewotICAgIGJvb2wgZGVidWdNb2RlID0gZmFsc2U7Ci0gICAgLy8gZGVidWcKLSAgICAvLyBzdGQ6OmNvdXQgPDwgIioqKioqKioqKioqKipcbiI7Ci0gICAgLy8gYm9vc3RTZWdtZW50IHNlZzEsIHNlZzI7Ci0gICAgLy8gc2VnMSA9IGJvb3N0U2VnbWVudChib29zdFBvaW50KDI4NjAwLCA0MTU1MDApLCBib29zdFBvaW50KDE0MjYwMCwgNDE1NTAwKSk7Ci0gICAgLy8gc2VnMiA9IGJvb3N0U2VnbWVudChib29zdFBvaW50KDExNTYwMCwgNDA2NTAwKSwgYm9vc3RQb2ludCgxMTU2MDAsIDUyMDUwMCkpOwotICAgIC8vIGJvb3N0OjpnZW9tZXRyeTo6Y29ycmVjdChzZWcxKTsKLSAgICAvLyBib29zdDo6Z2VvbWV0cnk6OmNvcnJlY3Qoc2VnMik7Ci0gICAgLy8gZnJDb2xsZWN0aW9uPGJvb3N0UG9pbnQ+IGludGVyc2VjdFBvaW50czsKLSAgICAvLyBiZzo6aW50ZXJzZWN0aW9uKHNlZzEsIHNlZzIsIGludGVyc2VjdFBvaW50cyk7Ci0gICAgLy8gZm9yIChhdXRvIGludGVyc2VjdFBvaW50OiBpbnRlcnNlY3RQb2ludHMpIHsKLSAgICAvLyAgIGZyUG9pbnQgdG1wU3RlaW5lcjsKLSAgICAvLyAgIHRtcFN0ZWluZXIuc2V0KGJnOjpnZXQ8MD4oaW50ZXJzZWN0UG9pbnQpLCBiZzo6Z2V0PDE+KGludGVyc2VjdFBvaW50KSk7Ci0gICAgLy8gICBzdGQ6OmNvdXQgPDwgIigiIDw8IHRtcFN0ZWluZXIueCgpIDw8ICIsICIgPDwgdG1wU3RlaW5lci55KCkgPDwgIilcbiI7Ci0gICAgLy8gfQotCi0gICAgLy8gZXhpdCgwKTsKLSAgICBpZiAoVkVSQk9TRSA+IDApIHsKLSAgICAgIHN0ZDo6Y291dCA8PHN0ZDo6ZW5kbCA8PCJnZXQgc3RhbmRhcmQgZ3VpZGUgLi4uIiA8PHN0ZDo6ZW5kbDsKLSAgICB9Ci0gICAgaW50IGNudCA9IDA7Ci0gICAgZm9yIChhdXRvIGd1aWRlSXQgPSB0bXBHdWlkZXMuYmVnaW4oKTsgZ3VpZGVJdCAhPSB0bXBHdWlkZXMuZW5kKCk7ICsrZ3VpZGVJdCkgewotICAgICAgYXV0byAmbmV0TmFtZSA9IGd1aWRlSXQtPmZpcnN0OwotICAgICAgYXV0byAmZ3VpZGVzID0gZ3VpZGVJdC0+c2Vjb25kOwotICAgICAgaWYgKGRlYnVnTW9kZSkgewotICAgICAgICBzdGQ6OmNvdXQgPDwgIj09PT09PT09PT09PT09PSIgPDwgbmV0TmFtZSA8PCAiPT09PT09PT09PT09PT09IiA8PCBzdGQ6OmVuZGw7Ci0gICAgICB9Ci0gICAgICBnZXRTdGFuZGFyZEd1aWRlKGd1aWRlcywgdmxheWVycywgbmV0c1tuZXROYW1lXSwgZ0NlbGwyUGluTWFwW25ldE5hbWVdKTsKLSAgICAgIGNudCsrOwotICAgICAgaWYgKFZFUkJPU0UgPiAwKSB7Ci0gICAgICAgIGlmIChjbnQgJSAxMDAwMCA9PSAwKSB7Ci0gICAgICAgICAgc3RkOjpjb3V0IDw8IiAgY29tcGxldGUgIiA8PGNudCA8PCIgbmV0cyIgPDxzdGQ6OmVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAKLSAgfQotCi0gIHZvaWQgZ2V0U3RhbmRhcmRHdWlkZShmckNvbGxlY3Rpb248ZnJSZWN0PiAmZ3VpZGVSZWN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxmcjo6ZnJMYXllcj4gPiAmdmxheWVycywKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxmcjo6ZnJOZXQ+ICZuZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxmclBvaW50LCBzdGQ6OnNldDxzdGQ6OnBhaXI8ZnJCbG9ja09iamVjdCosIGZyOjpmckxheWVyTnVtPiA+ID4gJmdDZWxsMlBpbk1hcCkgewotICAgIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gICAgZnJDb29yZCBHQ0VMTEdSSURYID0gZ2V0R0NFTExHUklEWCgpOwotICAgIGZyQ29vcmQgR0NFTExHUklEWSA9IGdldEdDRUxMR1JJRFkoKTsKLSAgICBmckNvb3JkIEdDRUxMT0ZGU0VUWCA9IGdldEdDRUxMT0ZGU0VUWCgpOwotICAgIGZyQ29vcmQgR0NFTExPRkZTRVRZID0gZ2V0R0NFTExPRkZTRVRZKCk7Ci0gICAgZnJMYXllck51bSBsYXllck51bTsKLSAgICBmclByZWZSb3V0aW5nRGlyIGRpcjsKLSAgICBzdGQ6Om1hcDxmckxheWVyTnVtLCBzdGQ6Om1hcDxmckNvb3JkLCBib29zdDo6aWNsOjppbnRlcnZhbF9zZXQ8ZnJDb29yZD4gPiA+IGxheWVyR0NlbGwySW50dlNldDsKLSAgICAvLyBmckNvbGxlY3Rpb248c2V0PGludD4gPiBpbmRleENsdXN0ZXI7Ci0gICAgLy8gZnJDb2xsZWN0aW9uPGJvb2w+IHZpc2l0ZWQoZ3VpZGVSZWN0cy5zaXplKCksIGZhbHNlKTsKLSAgICBmclN0cmluZyBuZXROYW1lOwotICAgIG5ldC0+Z2V0TmFtZShuZXROYW1lKTsKLSAgICAvL3N0ZDo6Y291dCA8PCBuZXROYW1lIDw8ICJcbiI7Ci0gICAgLy8gZ2V0IGludGVydmFsIHNldCBwZXIgbGF5ZXIgcGVyIEdDZWxsIHJvdwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClndWlkZVJlY3RzLnNpemUoKTsgKytpKSB7Ci0gICAgICBmclBvaW50IGxsLCB1cjsKLSAgICAgIGZyQ29vcmQgbGx4LCBsbHksIHVyeCwgdXJ5OwotICAgICAgbGF5ZXJOdW0gPSBndWlkZVJlY3RzW2ldLmdldExheWVyTnVtKCk7Ci0gICAgICBkaXIgPSB2bGF5ZXJzW2xheWVyTnVtXS0+Z2V0RGlyKCk7Ci0gICAgICAvL2lmIChsYXllckdDZWxsMkludHZTZXQuZmluZChsYXllck51bSkgPT0gbGF5ZXJHQ2VsbDJJbnR2U2V0LmVuZCgpKSB7Ci0gICAgICAvLyAgbGF5ZXJHQ2VsbDJJbnR2U2V0W2xheWVyTnVtXSA9IHN0ZDo6bWFwPGZyQ29vcmQsIGJvb3N0OjppY2w6OmludGVydmFsX3NldDxpbnQ+ID4oKTsKLSAgICAgIC8vfQotICAgICAgLy8gZ2V0IGxvd2VyTGVmdCBhbmQgdXBwZXJSaWdodCBHQ2VsbCBjZW50ZXJzCi0gICAgICBmckJveCBndWlkZUJveDsKLSAgICAgIGd1aWRlUmVjdHNbaV0uZ2V0QkJveChndWlkZUJveCk7Ci0gICAgICBsbCA9IGdldEdDZWxsQ2VudGVyKGZyUG9pbnQoZ3VpZGVCb3gubGVmdCgpLCBndWlkZUJveC5ib3R0b20oKSkpOwotICAgICAgdXIgPSBnZXRHQ2VsbENlbnRlcihmclBvaW50KGd1aWRlQm94LnJpZ2h0KCksIGd1aWRlQm94LnRvcCgpKSk7Ci0gICAgICAvLyBtb2RpZnkgaWYgdXIgYXJlIG9uIGJvdW5kYXJ5Ci0gICAgICBpZiAoKGd1aWRlQm94LnJpZ2h0KCkgLSBHQ0VMTE9GRlNFVFgpICUgR0NFTExHUklEWCA9PSAwKSB7Ci0gICAgICAgIHVyLnNldCh1ci54KCkgLSBHQ0VMTEdSSURYLCB1ci55KCkpOwotICAgICAgfQotICAgICAgaWYgKChndWlkZUJveC50b3AoKSAtIEdDRUxMT0ZGU0VUWSkgJSBHQ0VMTEdSSURZID09IDApIHsKLSAgICAgICAgdXIuc2V0KHVyLngoKSwgdXIueSgpIC0gR0NFTExHUklEWSk7Ci0gICAgICB9Ci0gICAgICAvLyBpbnNlcnQgaW50ZXJ2YWwgbWFwIAotICAgICAgbGx4ID0gbGwueCgpOwotICAgICAgbGx5ID0gbGwueSgpOwotICAgICAgdXJ4ID0gdXIueCgpOwotICAgICAgdXJ5ID0gdXIueSgpOwotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBzdGQ6OmNvdXQgPDwgImd1aWRlUmVjdENlbnRlciAoIiA8PCBsbHggPDwgIiwgIiA8PCBsbHkgPDwgIikgLSAoIiA8PCB1cnggPDwgIiwgIiA8PCB1cnkgPDwgIikgIiA8PCB2bGF5ZXJzW2xheWVyTnVtXS0+Z2V0TmFtZSgpIDw8ICJcbiI7Ci0gICAgICB9Ci0gICAgICBpZiAoZGlyID09IGZyY0hvcnpQcmVmUm91dGluZ0RpcikgewotICAgICAgICBmb3IgKGZyQ29vcmQgZ0NlbGxSb3dDZW50ZXIgPSBsbHk7IGdDZWxsUm93Q2VudGVyIDw9IHVyeTsgZ0NlbGxSb3dDZW50ZXIgKz0gR0NFTExHUklEWSkgewotICAgICAgICAgIC8vaWYgKGxheWVyR0NlbGwySW50dlNldFtsYXllck51bV0uZmluZChnQ2VsbFJvd0NlbnRlcikgPT0gbGF5ZXJHQ2VsbDJJbnR2U2V0W2xheWVyTnVtXS5lbmQoKSkgewotICAgICAgICAgIC8vICBsYXllckdDZWxsMkludHZTZXRbbGF5ZXJOdW1dW2dDZWxsUm93Q2VudGVyXSA9IGJvb3N0OjppY2w6OmludGVydmFsX3NldDxpbnQ+KCk7Ci0gICAgICAgICAgLy99Ci0gICAgICAgICAgbGF5ZXJHQ2VsbDJJbnR2U2V0W2xheWVyTnVtXVtnQ2VsbFJvd0NlbnRlcl0uaW5zZXJ0KGJvb3N0OjppY2w6OmludGVydmFsX3NldDxmckNvb3JkPjo6aW50ZXJ2YWxfdHlwZTo6Y2xvc2VkKGxseCwgdXJ4KSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAoZGlyID09IGZyY1ZlcnRQcmVmUm91dGluZ0RpcikgewotICAgICAgICBmb3IgKGZyQ29vcmQgZ0NlbGxSb3dDZW50ZXIgPSBsbHg7IGdDZWxsUm93Q2VudGVyIDw9IHVyeDsgZ0NlbGxSb3dDZW50ZXIgKz0gR0NFTExHUklEWCkgewotICAgICAgICAgIC8vaWYgKGxheWVyR0NlbGwySW50dlNldFtsYXllck51bV0uZmluZChnQ2VsbFJvd0NlbnRlcikgPT0gbGF5ZXJHQ2VsbDJJbnR2U2V0W2xheWVyTnVtXS5lbmQoKSkgewotICAgICAgICAgIC8vICBsYXllckdDZWxsMkludHZTZXRbbGF5ZXJOdW1dW2dDZWxsUm93Q2VudGVyXSA9IGJvb3N0OjppY2w6OmludGVydmFsX3NldDxpbnQ+KCk7Ci0gICAgICAgICAgLy99Ci0gICAgICAgICAgbGF5ZXJHQ2VsbDJJbnR2U2V0W2xheWVyTnVtXVtnQ2VsbFJvd0NlbnRlcl0uaW5zZXJ0KGJvb3N0OjppY2w6OmludGVydmFsX3NldDxmckNvb3JkPjo6aW50ZXJ2YWxfdHlwZTo6Y2xvc2VkKGxseSwgdXJ5KSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBhcHBlbmRUb3VjaGluZ0d1aWRlSW50dihsYXllckdDZWxsMkludHZTZXQsIHZsYXllcnMpOwotCi0KLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBzdGQ6OmNvdXQgPDwibGF5ZXJHQ2VsbDJJbnR2U2V0ICIgPDxzdGQ6OmVuZGw7Ci0gICAgICBmb3IgKGF1dG8gbGF5ZXJJdCA9IGxheWVyR0NlbGwySW50dlNldC5iZWdpbigpOyBsYXllckl0ICE9IGxheWVyR0NlbGwySW50dlNldC5lbmQoKTsgKytsYXllckl0KSB7Ci0gICAgICAgIGF1dG8gbGF5ZXJOdW0gPSBsYXllckl0LT5maXJzdDsKLSAgICAgICAgYXV0byAmZ0NlbGwyUm93TWFwID0gbGF5ZXJJdC0+c2Vjb25kOwotICAgICAgICBzdGQ6OmNvdXQgPDwgIiAgbGF5ZXJOdW0gPSAiIDw8IGxheWVyTnVtIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgZm9yIChhdXRvIHJvd0l0ID0gZ0NlbGwyUm93TWFwLmJlZ2luKCk7IHJvd0l0ICE9IGdDZWxsMlJvd01hcC5lbmQoKTsgKytyb3dJdCkgewotICAgICAgICAgIGF1dG8gZ0NlbGxSb3dDZW50ZXIgPSByb3dJdC0+Zmlyc3Q7Ci0gICAgICAgICAgYXV0byAmaW50dlNldCA9IHJvd0l0LT5zZWNvbmQ7Ci0gICAgICAgICAgc3RkOjpjb3V0IDw8ICIgICAgZ0NlbGxSb3dDZW50ZXIgPSAiIDw8IGdDZWxsUm93Q2VudGVyIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgIiAgICAgICI7Ci0gICAgICAgICAgZm9yIChhdXRvIGludHZTZXRJdCA9IGludHZTZXQuYmVnaW4oKTsgaW50dlNldEl0ICE9IGludHZTZXQuZW5kKCk7ICsraW50dlNldEl0KSB7Ci0gICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIiAgICAgICgiIDw8IGludHZTZXRJdC0+bG93ZXIoKSA8PCAiLCAiIDw8IGludHZTZXRJdC0+dXBwZXIoKSA8PCAiKVxuIjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gY29sbGVjdCBzdGVpbmVyIHBvaW50IC8gcGluICh2ZXJ0ZXgpIHRvIGJlIGNyZWF0ZWQgaW4gdGhlIGdyYXBoCi0gICAgLy8gYWxvbmcgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBlZGdlcwotICAgIHN0ZDo6c2V0PHN0ZDo6cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiA+IHN0ZWluZXJTZXQ7Ci0gICAgLy8gc3RkOjpzZXQ8c3RkOjpwYWlyPHN0ZDo6cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiwgc3RkOjpwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+ID4sIGd1aWRlU3RlaW5lckNtcD4gc3RlaW5lckVkZ2VTZXQ7Ci0gICAgc3RkOjpzZXQ8c3RkOjpwYWlyPHN0ZDo6cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiwgc3RkOjpwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+ID4gPiBzdGVpbmVyRWRnZVNldDsKLSAgICBzdGQ6Om1hcDxzdGQ6OnBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4sIGZyQmxvY2tPYmplY3QqPiBzdGVpbmVyMlB0cjsKLQotICAgIC8vIGxheWVyR0NlbGwySW50dlNldCBpcyBsYXllck51bSAtLT4gKHRyYWNrQ29vcmQgLS0+IGludHYgc2V0KQotICAgIGZvciAoYXV0byBsYXllckl0ID0gbGF5ZXJHQ2VsbDJJbnR2U2V0LmJlZ2luKCk7IGxheWVySXQgIT0gbGF5ZXJHQ2VsbDJJbnR2U2V0LmVuZCgpOyArK2xheWVySXQpIHsKLSAgICAgIGF1dG8gbGF5ZXJOdW0gPSBsYXllckl0LT5maXJzdDsKLSAgICAgIGF1dG8gJmdDZWxsMlJvd01hcCA9IGxheWVySXQtPnNlY29uZDsgLy8gdHJhY2tDb29yZCAtLT4gaW50diBzZXQKLSAgICAgIC8vIGF1dG8gbGF5ZXJzID0gZ2V0TGF5ZXJzKCk7Ci0gICAgICAvLyBzdGQ6OmNvdXQgPDwgbGF5ZXJzLT5zaXplKCkgPDwgc3RkOjplbmRsOwotICAgICAgLy8gYXV0byBkaXIgPSBsYXllcnMtPmF0KGxheWVyTnVtKS0+Z2V0RGlyKCk7Ci0gICAgICBhdXRvIGRpciA9IHZsYXllcnNbbGF5ZXJOdW1dLT5nZXREaXIoKTsKLSAgICAgIGZvciAoYXV0byByb3dJdCA9IGdDZWxsMlJvd01hcC5iZWdpbigpOyByb3dJdCAhPSBnQ2VsbDJSb3dNYXAuZW5kKCk7ICsrcm93SXQpIHsKLSAgICAgICAgYXV0byAmZ0NlbGxSb3dDZW50ZXIgPSByb3dJdC0+Zmlyc3Q7IC8vIHRyYWNrIENvb3JkCi0gICAgICAgIGF1dG8gJmludHZTZXQgPSByb3dJdC0+c2Vjb25kOwotICAgICAgICBib29zdFNlZ21lbnQgY3VyckJvb3N0U2VnOwotICAgICAgICAvLyBpdGVyYXRlIGN1cnJlbnQgbGF5ZXIgZ3NlZwotICAgICAgICBmb3IgKGF1dG8gY3VyckludHZTZXRJdCA9IGludHZTZXQuYmVnaW4oKTsgY3VyckludHZTZXRJdCAhPSBpbnR2U2V0LmVuZCgpOyArK2N1cnJJbnR2U2V0SXQpIHsKLSAgICAgICAgICBpZiAoZGlyID09IGZyY0hvcnpQcmVmUm91dGluZ0RpcikgewotICAgICAgICAgICAgY3VyckJvb3N0U2VnID0gYm9vc3RTZWdtZW50KGJvb3N0UG9pbnQoY3VyckludHZTZXRJdC0+bG93ZXIoKSwgZ0NlbGxSb3dDZW50ZXIpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdFBvaW50KGN1cnJJbnR2U2V0SXQtPnVwcGVyKCksIGdDZWxsUm93Q2VudGVyKSk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChkaXIgPT0gZnJjVmVydFByZWZSb3V0aW5nRGlyKSB7Ci0gICAgICAgICAgICBjdXJyQm9vc3RTZWcgPSBib29zdFNlZ21lbnQoYm9vc3RQb2ludChnQ2VsbFJvd0NlbnRlciwgY3VyckludHZTZXRJdC0+bG93ZXIoKSksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0UG9pbnQoZ0NlbGxSb3dDZW50ZXIsIGN1cnJJbnR2U2V0SXQtPnVwcGVyKCkpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gaXRlcmF0ZSBsb3dlciBsYXllciBnc2VnCi0gICAgICAgICAgc3RkOjpzZXQ8ZnJQb2ludD4gbG93ZXJTdGVpbmVyczsKLSAgICAgICAgICBmckxheWVyTnVtIGxvd2VyTGF5ZXJOdW0gPSBsYXllck51bSAtIDI7Ci0gICAgICAgICAgZnJMYXllck51bSB1cHBlckxheWVyTnVtID0gbGF5ZXJOdW0gKyAyOwotICAgICAgICAgIC8vIHN0ZDo6bWFwPGZyQ29vcmQsIGJvb3N0OjppY2w6OmludGVydmFsX3NldDxmckNvb3JkPiA+IGxvd2VyR0NlbGwyUm93TWFwOwotICAgICAgICAgIC8vIGlmIChuZXROYW1lID09ICJuZXQxMDcyMTEiICYmIGxvd2VyTGF5ZXJOdW0gPT0gNCkgewotICAgICAgICAgIC8vICAgc3RkOjpjb3V0IDw8ICIgIGRlYnVnMTogY3VyckdDZWxsUm93Q2VudGVyID0gIiA8PCBnQ2VsbFJvd0NlbnRlciA8PCAiICgiIAotICAgICAgICAgIC8vICAgICAgICAgICAgIDw8IGN1cnJJbnR2U2V0SXQtPmxvd2VyKCkgPDwgIiwgIiA8PCBjdXJySW50dlNldEl0LT51cHBlcigpIDw8ICIpXG4iOwotICAgICAgICAgIC8vIH0KLQotICAgICAgICAgIGlmIChsYXllckdDZWxsMkludHZTZXQuZmluZChsb3dlckxheWVyTnVtKSAhPSBsYXllckdDZWxsMkludHZTZXQuZW5kKCkpIHsKLSAgICAgICAgICAgIC8vIGlmIChuZXROYW1lID09ICJuZXQxMDcyMTEiICYmIGxvd2VyTGF5ZXJOdW0gPT0gNCkgewotICAgICAgICAgICAgLy8gICBmb3IgKGF1dG8gc2V0SXQgPSBsYXllckdDZWxsMkludHZTZXRbbG93ZXJMYXllck51bV0uYmVnaW4oKTsgc2V0SXQgIT0gbGF5ZXJHQ2VsbDJJbnR2U2V0W2xvd2VyTGF5ZXJOdW1dLmVuZCgpOyArK3NldEl0KSB7Ci0gICAgICAgICAgICAvLyAgICAgc3RkOjpjb3V0IDw8ICIgICAgZGVidWc6XG4iOwotICAgICAgICAgICAgLy8gICAgIHN0ZDo6Y291dCA8PCAiICAgICAgbG93ZXJHQ2VsbFJvd0NlbnRlciA9ICIgPDwgc2V0SXQtPmZpcnN0IDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgICAgIC8vICAgICBmb3IgKGF1dG8gaXQgPSBzZXRJdC0+c2Vjb25kLmJlZ2luKCk7IGl0ICE9IHNldEl0LT5zZWNvbmQuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgICAgIC8vICAgICAgIHN0ZDo6Y291dCA8PCAiICAgICAgICAgKCIgPDwgaXQtPmxvd2VyKCkgPDwgIiwgIiA8PCBpdC0+dXBwZXIoKSA8PCAiKVxuIjsKLSAgICAgICAgICAgIC8vICAgICB9Ci0gICAgICAgICAgICAvLyAgIH0KLSAgICAgICAgICAgIC8vIH0KLSAgICAgICAgICAgIGdldEdTZWdTdGVpbmVyKGN1cnJCb29zdFNlZywgZGlyLCBsYXllckdDZWxsMkludHZTZXRbbG93ZXJMYXllck51bV0sIGxvd2VyU3RlaW5lcnMpOwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBpZiAoZGVidWdNb2RlKSB7Ci0gICAgICAgICAgLy8gaWYgKG5ldE5hbWUgPT0gIm5ldDEwNzIxMSIpIHsKLSAgICAgICAgICAvLyAgIGZvciAoYXV0byBzZXRJdCA9IGxvd2VyU3RlaW5lcnMuYmVnaW4oKTsgc2V0SXQgIT0gbG93ZXJTdGVpbmVycy5lbmQoKTsgKytzZXRJdCkgewotICAgICAgICAgIC8vICAgICBzdGQ6OmNvdXQgPDwgIiAgICBsb3dlciBzdGVpbmVyIG9uIGxheWVyICIgPDwgbGF5ZXJOdW0gPDwgIiBhdCAoIiA8PCBzZXRJdC0+eCgpIDw8ICIsICIgPDwgc2V0SXQtPnkoKSA8PCAiKVxuIjsKLSAgICAgICAgICAvLyAgIH0KLSAgICAgICAgICAvLyB9Ci0gICAgICAgICAgZm9yIChhdXRvIHNldEl0ID0gbG93ZXJTdGVpbmVycy5iZWdpbigpOyBzZXRJdCAhPSBsb3dlclN0ZWluZXJzLmVuZCgpOyArK3NldEl0KSB7Ci0gICAgICAgICAgICBnZXRJbnRlckxheWVyU3RlaW5lckVkZ2UoKnNldEl0LCBsb3dlckxheWVyTnVtLCBsYXllck51bSwgc3RlaW5lclNldCwgc3RlaW5lckVkZ2VTZXQpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8vIGl0ZXJhdGUgdXBwZXIgbGF5ZXIgZ3NlZwotICAgICAgICAgIHN0ZDo6c2V0PGZyUG9pbnQ+IHVwcGVyU3RlaW5lcnM7Ci0gICAgICAgICAgaWYgKGxheWVyR0NlbGwySW50dlNldC5maW5kKHVwcGVyTGF5ZXJOdW0pICE9IGxheWVyR0NlbGwySW50dlNldC5lbmQoKSkgewotICAgICAgICAgICAgZ2V0R1NlZ1N0ZWluZXIoY3VyckJvb3N0U2VnLCBkaXIsIGxheWVyR0NlbGwySW50dlNldFt1cHBlckxheWVyTnVtXSwgdXBwZXJTdGVpbmVycyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIGlmIChkZWJ1Z01vZGUpIHsKLSAgICAgICAgICAvLyBpZiAobmV0TmFtZSA9PSAibmV0MTA3MjExIikgewotICAgICAgICAgIC8vICAgZm9yIChhdXRvIHNldEl0ID0gdXBwZXJTdGVpbmVycy5iZWdpbigpOyBzZXRJdCAhPSB1cHBlclN0ZWluZXJzLmVuZCgpOyArK3NldEl0KSB7Ci0gICAgICAgICAgLy8gICAgIHN0ZDo6Y291dCA8PCAiICAgIHVwcGVyIHN0ZWluZXIgb24gbGF5ZXIgIiA8PCBsYXllck51bSA8PCAiIGF0ICgiIDw8IHNldEl0LT54KCkgPDwgIiwgIiA8PCBzZXRJdC0+eSgpIDw8ICIpXG4iOwotICAgICAgICAgIC8vICAgfQotICAgICAgICAgIC8vIH0KLSAgICAgICAgICBmb3IgKGF1dG8gc2V0SXQgPSB1cHBlclN0ZWluZXJzLmJlZ2luKCk7IHNldEl0ICE9IHVwcGVyU3RlaW5lcnMuZW5kKCk7ICsrc2V0SXQpIHsKLSAgICAgICAgICAgIGdldEludGVyTGF5ZXJTdGVpbmVyRWRnZSgqc2V0SXQsIGxheWVyTnVtLCB1cHBlckxheWVyTnVtLCBzdGVpbmVyU2V0LCBzdGVpbmVyRWRnZVNldCk7Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAvLyBzZWcgc3RlaW5lcnMKLSAgICAgICAgICBzdGQ6OnNldDxmclBvaW50PiBzZWdTdGVpbmVyczsKLSAgICAgICAgICBzZWdTdGVpbmVycy5pbnNlcnQobG93ZXJTdGVpbmVycy5iZWdpbigpLCBsb3dlclN0ZWluZXJzLmVuZCgpKTsKLSAgICAgICAgICBzZWdTdGVpbmVycy5pbnNlcnQodXBwZXJTdGVpbmVycy5iZWdpbigpLCB1cHBlclN0ZWluZXJzLmVuZCgpKTsKLSAgICAgICAgICAKLSAgICAgICAgICBmclBvaW50IHN0YXJ0LCBlbmQ7Ci0gICAgICAgICAgaWYgKGRpciA9PSBmcmNIb3J6UHJlZlJvdXRpbmdEaXIpIHsKLSAgICAgICAgICAgIHN0YXJ0ID0gZnJQb2ludChjdXJySW50dlNldEl0LT5sb3dlcigpLCBnQ2VsbFJvd0NlbnRlcik7Ci0gICAgICAgICAgICBlbmQgPSBmclBvaW50KGN1cnJJbnR2U2V0SXQtPnVwcGVyKCksIGdDZWxsUm93Q2VudGVyKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGRpciA9PSBmcmNWZXJ0UHJlZlJvdXRpbmdEaXIpIHsKLSAgICAgICAgICAgIHN0YXJ0ID0gZnJQb2ludChnQ2VsbFJvd0NlbnRlciwgY3VyckludHZTZXRJdC0+bG93ZXIoKSk7Ci0gICAgICAgICAgICBlbmQgPSBmclBvaW50KGdDZWxsUm93Q2VudGVyLCBjdXJySW50dlNldEl0LT51cHBlcigpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gZml4IGZvciB0ZXJtIGF0IHNlZ21lbnQgZW5kcG9pbnQgZ2NlbGxzCi0gICAgICAgICAgc3RlaW5lclNldC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoc3RhcnQsIGxheWVyTnVtKSk7Ci0gICAgICAgICAgc3RlaW5lclNldC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoZW5kLCBsYXllck51bSkpOwotICAgICAgICAgIHNlZ1N0ZWluZXJzLmluc2VydChzdGFydCk7Ci0gICAgICAgICAgc2VnU3RlaW5lcnMuaW5zZXJ0KGVuZCk7Ci0gICAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgIAotICAgICAgICAgIC8vIGlmIChuZXROYW1lID09ICJuZXQxMDcyMTEiKSB7Ci0KLSAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiQ3VyciBTZWc6ICgiIDw8IHN0YXJ0LngoKSA8PCAiLCAiIDw8IHN0YXJ0LnkoKSA8PCAiKSAtLSAoIgotICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZC54KCkgPDwgIiwgIiA8PCBlbmQueSgpIDw8ICIpIGxheWVyICIgPDwgbGF5ZXJOdW0gPDwgIlxuIjsKLSAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiU3RlaW5lcnM6XG4iOwotICAgICAgICAgICAgZm9yIChhdXRvIHNldEl0ID0gc2VnU3RlaW5lcnMuYmVnaW4oKTsgc2V0SXQgIT0gc2VnU3RlaW5lcnMuZW5kKCk7ICsrc2V0SXQpIHsKLSAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICIgICgiIDw8IHNldEl0LT54KCkgPDwgIiwgIiA8PCBzZXRJdC0+eSgpIDw8ICIpXG4iOwotICAgICAgICAgICAgICAvLyBpZiAoZGlyID09IGZyY0hvcnpQcmVmUm91dGluZ0RpcikgeyAKLSAgICAgICAgICAgICAgLy8gICBzdGQ6OmNvdXQgPDwgIiAgKCIgPDwgKnNldEl0IDw8ICIsICIgPDwgZ0NlbGxSb3dDZW50ZXIgPDwiKVxuIjsKLSAgICAgICAgICAgICAgLy8gfSBlbHNlIGlmIChkaXIgPT0gZnJjVmVydFByZWZSb3V0aW5nRGlyKSB7Ci0gICAgICAgICAgICAgIC8vICAgc3RkOjpjb3V0IDw8ICIgICgiIDw8IGdDZWxsUm93Q2VudGVyIDw8ICIsICIgPDwgKnNldEl0IDw8IilcbiI7Ci0gICAgICAgICAgICAgIC8vIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvLyBhZGQgY3VycmVudCBsYXllciAKLSAgICAgICAgICBpZiAoIXNlZ1N0ZWluZXJzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIGZvciAoYXV0byBzZXRJdCA9IHNlZ1N0ZWluZXJzLmJlZ2luKCk7IHN0ZDo6bmV4dChzZXRJdCkgIT0gc2VnU3RlaW5lcnMuZW5kKCk7ICsrc2V0SXQpIHsKLSAgICAgICAgICAgICAgc3RlaW5lckVkZ2VTZXQuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHN0ZDo6bWFrZV9wYWlyKCpzZXRJdCwgbGF5ZXJOdW0pLCBzdGQ6Om1ha2VfcGFpcigqKHN0ZDo6bmV4dChzZXRJdCkpLCBsYXllck51bSkpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gYWRkIHN0ZWluZXIgdmVydGV4IAotICAgIGZvciAoYXV0byBzdGVpbmVySXQgPSBzdGVpbmVyU2V0LmJlZ2luKCk7IHN0ZWluZXJJdCAhPSBzdGVpbmVyU2V0LmVuZCgpOyArK3N0ZWluZXJJdCkgewotCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8ZnJTdGVpbmVyPiBzdGVpbmVyID0gc3RkOjptYWtlX3VuaXF1ZTxmclN0ZWluZXI+KCk7Ci0gICAgICBzdGVpbmVyLT5zZXRQb2ludChzdGVpbmVySXQtPmZpcnN0KTsKLSAgICAgIHN0ZWluZXItPnNldExheWVyTnVtKHN0ZWluZXJJdC0+c2Vjb25kKTsKLSAgICAgIHN0ZWluZXItPmFkZFRvTmV0KG5ldCk7Ci0gICAgICBhdXRvIHJwdHIgPSBzdGVpbmVyLmdldCgpOwotICAgICAgc3RlaW5lcjJQdHJbKnN0ZWluZXJJdF0gPSBycHRyOwotICAgICAgbmV0LT5hZGRTdGVpbmVyKHN0ZWluZXIpOwotICAgICAgbmV0LT5hZGRWZXJ0ZXgocnB0cik7Ci0gICAgICAvL3N0ZDo6Y291dCA8PCAiU3RlaW5lcjogIiA8PCBzdGVpbmVySXQtPmZpcnN0IDw8ICIsIGxheWVyICIgPDwgc3RlaW5lckl0LT5zZWNvbmQgPDwgIlxuIjsKLSAgICB9Ci0gICAgLy8gYWRkIGVkZ2UgYmV0d2VlbiBzdGVpbmVycwotICAgIGZvciAoYXV0byBlZGdlSXQgPSBzdGVpbmVyRWRnZVNldC5iZWdpbigpOyBlZGdlSXQgIT0gc3RlaW5lckVkZ2VTZXQuZW5kKCk7ICsrZWRnZUl0KSB7Ci0gICAgICBhdXRvICZzdGFydFN0ZWluZXIgPSBlZGdlSXQtPmZpcnN0OwotICAgICAgYXV0byAmZW5kU3RlaW5lciA9IGVkZ2VJdC0+c2Vjb25kOwotICAgICAgc3RkOjpzaGFyZWRfcHRyPGZyR3VpZGVHbG9iYWw+IGVkZ2UgPSBzdGQ6Om1ha2Vfc2hhcmVkPGZyR3VpZGVHbG9iYWw+KCk7Ci0gICAgICBlZGdlLT5zZXRQb2ludHMoc3RhcnRTdGVpbmVyLmZpcnN0LCBlbmRTdGVpbmVyLmZpcnN0KTsKLSAgICAgIGVkZ2UtPnNldEJlZ2luTGF5ZXJOdW0oc3RhcnRTdGVpbmVyLnNlY29uZCk7Ci0gICAgICBlZGdlLT5zZXRFbmRMYXllck51bShlbmRTdGVpbmVyLnNlY29uZCk7Ci0gICAgICBlZGdlLT5hZGRUb05ldChuZXQpOwotICAgICAgLy8gVE9ETzogbWF5IG5lZWQgdG8gY2hhZ25lIGZyb20gZnJSb3V0ZSB0byBmckd1aWRlCi0gICAgICAvLyBzdGQ6OnNoYXJlZF9wdHI8ZnJSb3V0ZT4gcm91dGUgPSBzdGQ6Om1ha2Vfc2hhcmVkPGZyUm91dGU+KCk7Ci0gICAgICAvLyBmckNvbGxlY3Rpb248c3RkOjpzaGFyZWRfcHRyPGZyQ29ubkZpZz4gPiB0bXBPYmpzOwotICAgICAgLy8gdG1wT2Jqcy5wdXNoX2JhY2soZWRnZSk7Ci0gICAgICAvLyByb3V0ZS0+c2V0T2JqZWN0cyh0bXBPYmpzKTsKLSAgICAgIC8vIHJvdXRlLT5hZGRUb05ldChuZXQpOwotICAgICAgLy8gc3RkOjpjb3V0IDw8ICJlZGdlOiAoIiA8PCBzdGFydFN0ZWluZXIuZmlyc3QueCgpIDw8ICIsICIgPDwgc3RhcnRTdGVpbmVyLmZpcnN0LnkoKSA8PCAiLCAiIDw8IHN0YXJ0U3RlaW5lci5zZWNvbmQKLSAgICAgIC8vICAgICAgICAgICA8PCAiKSwgKCIgICAgPDwgZW5kU3RlaW5lci5maXJzdC54KCkgPDwgIiwgIiA8PCBlbmRTdGVpbmVyLmZpcnN0LnkoKSA8PCAiLCAiIDw8IGVuZFN0ZWluZXIuc2Vjb25kIDw8ICJcbiI7Ci0gICAgICAvL25ldC0+YWRkRWRnZShzdGVpbmVyMlB0cltzdGFydFN0ZWluZXJdLCBzdGVpbmVyMlB0cltlbmRTdGVpbmVyXSwgcm91dGUpOwotICAgICAgbmV0LT5hZGRFZGdlKHN0ZWluZXIyUHRyW3N0YXJ0U3RlaW5lcl0sIHN0ZWluZXIyUHRyW2VuZFN0ZWluZXJdLCBlZGdlKTsKLQotICAgIH0KLQotICAgIC8vIHRlbXAgc29sdXRpb246IGFkZCBwaW4gT2JqIGFzIHZlcnRleAotICAgIHN0ZDo6c2V0PGZyQmxvY2tPYmplY3QqPiB0ZXJtSW5zdFRlcm1TZXQ7Ci0KLSAgICAvLyBhZGQgZWRnZSBiZXR3ZWVuIHN0ZWluZXIgYW5kIHRlcm0vaW5zdFRlcm0KLSAgICBmb3IgKGF1dG8gcGluR0NlbGxJdCA9IGdDZWxsMlBpbk1hcC5iZWdpbigpOyBwaW5HQ2VsbEl0ICE9IGdDZWxsMlBpbk1hcC5lbmQoKTsgKytwaW5HQ2VsbEl0KSB7Ci0gICAgICBhdXRvICZnQ2VsbENlbnRlciA9IHBpbkdDZWxsSXQtPmZpcnN0OwotICAgICAgZm9yIChhdXRvIHNldEl0ID0gcGluR0NlbGxJdC0+c2Vjb25kLmJlZ2luKCk7IHNldEl0ICE9IHBpbkdDZWxsSXQtPnNlY29uZC5lbmQoKTsgKytzZXRJdCkgewotICAgICAgICBhdXRvIHBpbk9iaiA9IHNldEl0LT5maXJzdDsKLSAgICAgICAgYXV0byBwaW5MYXllciA9IHNldEl0LT5zZWNvbmQ7Ci0gICAgICAgIGF1dG8gcGluU3RlaW5lciA9IHN0ZDo6bWFrZV9wYWlyKGdDZWxsQ2VudGVyLCBwaW5MYXllcik7Ci0gICAgICAgIGlmIChzdGVpbmVyMlB0ci5maW5kKHBpblN0ZWluZXIpICE9IHN0ZWluZXIyUHRyLmVuZCgpKSB7Ci0gICAgICAgICAgLy9hdXRvIHN0ZWluZXJQdHIgPSBzdGVpbmVyMlB0cltwaW5TdGVpbmVyXTsKLSAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8ZnJHdWlkZVNob3J0Q29ubj4gZWRnZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8ZnJHdWlkZVNob3J0Q29ubj4oKTsKLSAgICAgICAgICBlZGdlLT5zZXRQb2ludHMocGluU3RlaW5lci5maXJzdCwgcGluU3RlaW5lci5maXJzdCk7Ci0gICAgICAgICAgZWRnZS0+c2V0QmVnaW5MYXllck51bShwaW5MYXllcik7Ci0gICAgICAgICAgZWRnZS0+c2V0RW5kTGF5ZXJOdW0ocGluTGF5ZXIpOwotICAgICAgICAgIGVkZ2UtPmFkZFRvTmV0KG5ldCk7Ci0gICAgICAgICAgLy8gVE9ETzogbWF5IG5lZWQgdG8gY2hhZ25lIGZyb20gZnJSb3V0ZSB0byBmckd1aWRlCi0gICAgICAgICAgLy8gc3RkOjpzaGFyZWRfcHRyPGZyUm91dGU+IHJvdXRlID0gc3RkOjptYWtlX3NoYXJlZDxmclJvdXRlPigpOwotICAgICAgICAgIC8vIGZyQ29sbGVjdGlvbjxzdGQ6OnNoYXJlZF9wdHI8ZnJDb25uRmlnPiA+IHRtcE9ianM7Ci0gICAgICAgICAgLy8gdG1wT2Jqcy5wdXNoX2JhY2soZWRnZSk7Ci0gICAgICAgICAgLy8gcm91dGUtPnNldE9iamVjdHModG1wT2Jqcyk7Ci0gICAgICAgICAgLy8gcm91dGUtPmFkZFRvTmV0KG5ldCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgLy8gdGVtcCBzb2x1dGlvbjogYWRkIHBpbiBPYmogYXMgdmVydGV4Ci0gICAgICAgICAgaWYgKHRlcm1JbnN0VGVybVNldC5maW5kKHBpbk9iaikgPT0gdGVybUluc3RUZXJtU2V0LmVuZCgpKSB7Ci0gICAgICAgICAgICBuZXQtPmFkZFZlcnRleChwaW5PYmopOwotICAgICAgICAgICAgdGVybUluc3RUZXJtU2V0Lmluc2VydChwaW5PYmopOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8vbmV0LT5hZGRFZGdlKHBpbk9iaiwgc3RlaW5lcjJQdHJbcGluU3RlaW5lcl0sIGVkZ2UpOwotICAgICAgICAgIG5ldC0+YWRkRWRnZShzdGVpbmVyMlB0cltwaW5TdGVpbmVyXSwgcGluT2JqLCBlZGdlKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIFRPRE86IG1heSBuZWVkIHRvIGFwcGVuZCByb3V0ZSBndWlkZQotICAgICAgICAgIC8vIHN0ZDo6Y291dCA8PCAiV2FybmluZzogUGFydCBvZiBwaW4gbm90IGNvdmVyZWQgYnkgR1Igc29sdXRpb24uXG4iOwotICAgICAgICB9Ci0gICAgICB9Ci0KLQotICAgIH0KLQotCi0gIH0KLQotICB2b2lkIGdldEludGVyTGF5ZXJTdGVpbmVyRWRnZShmclBvaW50IHN0ZWluZXIsIAotICAgICAgICAgICAgICAgICAgICAgIGZyTGF5ZXJOdW0gbG93ZXJMYXllck51bSwgCi0gICAgICAgICAgICAgICAgICAgICAgZnJMYXllck51bSB1cHBlckxheWVyTnVtLAotICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PHN0ZDo6cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiA+ICZzdGVpbmVyU2V0LAotICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZDo6c2V0PHN0ZDo6cGFpcjxzdGQ6OnBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4sIHN0ZDo6cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiA+LCBndWlkZVN0ZWluZXJDbXA+ICZzdGVpbmVyRWRnZVNldCkgewotICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PHN0ZDo6cGFpcjxzdGQ6OnBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4sIHN0ZDo6cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiA+ID4gJnN0ZWluZXJFZGdlU2V0KSB7Ci0gICAgc3RkOjpwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+IHVwcGVyU3RlaW5lciwgbG93ZXJTdGVpbmVyOwotICAgIGxvd2VyU3RlaW5lciA9IHN0ZDo6bWFrZV9wYWlyKHN0ZWluZXIsIGxvd2VyTGF5ZXJOdW0pOwotICAgIHVwcGVyU3RlaW5lciA9IHN0ZDo6bWFrZV9wYWlyKHN0ZWluZXIsIHVwcGVyTGF5ZXJOdW0pOwotICAgIHN0ZWluZXJTZXQuaW5zZXJ0KGxvd2VyU3RlaW5lcik7Ci0gICAgc3RlaW5lclNldC5pbnNlcnQodXBwZXJTdGVpbmVyKTsKLSAgICBhdXRvIHN0ZWluZXJFZGdlID0gc3RkOjptYWtlX3BhaXIobG93ZXJTdGVpbmVyLCB1cHBlclN0ZWluZXIpOwotICAgIHN0ZWluZXJFZGdlU2V0Lmluc2VydChzdGVpbmVyRWRnZSk7Ci0gIH0KLQotICB2b2lkIGdldEdTZWdTdGVpbmVyKGJvb3N0U2VnbWVudCAmY3VyckdTZWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZyUHJlZlJvdXRpbmdEaXIgJmN1cnJEaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGZyQ29vcmQsIGJvb3N0OjppY2w6OmludGVydmFsX3NldDxmckNvb3JkPiA+ICZuZWlnaGJvckdDZWxsMlJvd01hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8ZnJQb2ludD4gJnN0ZWluZXJzKSB7Ci0gICAgYm9vc3RTZWdtZW50IG5laWdoYm9yR1NlZzsKLSAgICBmb3IgKGF1dG8gcm93SXQgPSBuZWlnaGJvckdDZWxsMlJvd01hcC5iZWdpbigpOyByb3dJdCAhPSBuZWlnaGJvckdDZWxsMlJvd01hcC5lbmQoKTsgKytyb3dJdCkgewotICAgICAgYXV0byAmbmVpZ2hib3JHQ2VsbFJvd0NlbnRlciA9IHJvd0l0LT5maXJzdDsKLSAgICAgIGF1dG8gJm5laWdodGJvckludHZTZXQgPSByb3dJdC0+c2Vjb25kOwotICAgICAgZm9yIChhdXRvIG5laWdodGJvckludHZTZXRJdCA9IG5laWdodGJvckludHZTZXQuYmVnaW4oKTsgbmVpZ2h0Ym9ySW50dlNldEl0ICE9IG5laWdodGJvckludHZTZXQuZW5kKCk7ICsrbmVpZ2h0Ym9ySW50dlNldEl0KSB7Ci0gICAgICAgIGlmIChjdXJyRGlyID09IGZyY0hvcnpQcmVmUm91dGluZ0RpcikgewotICAgICAgICAgIG5laWdoYm9yR1NlZyA9IGJvb3N0U2VnbWVudChib29zdFBvaW50KG5laWdoYm9yR0NlbGxSb3dDZW50ZXIsIG5laWdodGJvckludHZTZXRJdC0+bG93ZXIoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0UG9pbnQobmVpZ2hib3JHQ2VsbFJvd0NlbnRlciwgbmVpZ2h0Ym9ySW50dlNldEl0LT51cHBlcigpKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY3VyckRpciA9PSBmcmNWZXJ0UHJlZlJvdXRpbmdEaXIpIHsKLSAgICAgICAgICBuZWlnaGJvckdTZWcgPSBib29zdFNlZ21lbnQoYm9vc3RQb2ludChuZWlnaHRib3JJbnR2U2V0SXQtPmxvd2VyKCksIG5laWdoYm9yR0NlbGxSb3dDZW50ZXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdFBvaW50KG5laWdodGJvckludHZTZXRJdC0+dXBwZXIoKSwgbmVpZ2hib3JHQ2VsbFJvd0NlbnRlcikpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGlmIChuZWlnaGJvckdDZWxsUm93Q2VudGVyID09IDExNTYwMCkgewotICAgICAgICAvLyAgIHN0ZDo6Y291dCA8PCBuZWlnaGJvckdDZWxsUm93Q2VudGVyIDw8ICJcbiI7Ci0gICAgICAgIC8vIH0KLSAgICAgICAgLy8gVE9ETzogbm90IHN1cmUgd2hldGhlciBpbnRlcnNlY3RzIGlzIGJ1Z2d5IG9yIG5vdAotICAgICAgICBpZiAoYmc6OmludGVyc2VjdHMoY3VyckdTZWcsIG5laWdoYm9yR1NlZykpIHsKLSAgICAgICAgICAvLyBCT09TVCBJTlRFUlNFQ1RJT04gSVMgQlVHR1khISEKLSAgICAgICAgICBmckNvbGxlY3Rpb248Ym9vc3RQb2ludD4gaW50ZXJzZWN0UG9pbnRzOwotICAgICAgICAgIGJnOjppbnRlcnNlY3Rpb24oY3VyckdTZWcsIG5laWdoYm9yR1NlZywgaW50ZXJzZWN0UG9pbnRzKTsKLSAgICAgICAgICAvLyBmb3IgKGF1dG8gaW50ZXJzZWN0UG9pbnQ6IGludGVyc2VjdFBvaW50cykgewotICAgICAgICAgIC8vICAgZnJQb2ludCB0bXBTdGVpbmVyOwotICAgICAgICAgIC8vICAgdG1wU3RlaW5lci5zZXQoYmc6OmdldDwwPihpbnRlcnNlY3RQb2ludCksIGJnOjpnZXQ8MT4oaW50ZXJzZWN0UG9pbnQpKTsKLSAgICAgICAgICAvLyAgIHN0ZWluZXJzLmluc2VydCh0bXBTdGVpbmVyKTsKLSAgICAgICAgICAvLyB9Ci0gICAgICAgICAgZnJQb2ludCBib29zdFN0ZWluZXI7Ci0gICAgICAgICAgYm9vc3RTdGVpbmVyLnNldChiZzo6Z2V0PDA+KGludGVyc2VjdFBvaW50c1swXSksIGJnOjpnZXQ8MT4oaW50ZXJzZWN0UG9pbnRzWzBdKSk7Ci0gICAgICAgICAgZnJQb2ludCB0bXBTdGVpbmVyOwotICAgICAgICAgIGlmIChjdXJyRGlyID09IGZyY0hvcnpQcmVmUm91dGluZ0RpcikgewotICAgICAgICAgICAgdG1wU3RlaW5lci5zZXQobmVpZ2hib3JHQ2VsbFJvd0NlbnRlciwgYmc6OmdldDwwLDE+KGN1cnJHU2VnKSk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChjdXJyRGlyID09IGZyY1ZlcnRQcmVmUm91dGluZ0RpcikgewotICAgICAgICAgICAgdG1wU3RlaW5lci5zZXQoYmc6OmdldDwwLDA+KGN1cnJHU2VnKSwgbmVpZ2hib3JHQ2VsbFJvd0NlbnRlcik7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIGlmICh0bXBTdGVpbmVyLngoKSAhPSBib29zdFN0ZWluZXIueCgpIHx8IHRtcFN0ZWluZXIueSgpICE9IGJvb3N0U3RlaW5lci55KCkpIHsKLSAgICAgICAgICAvLyAgIHN0ZDo6Y291dCA8PCAiV2FybmluZzogaW5jb25zaXN0ZW50IHJlc3RsdCBmcm9tIEJvb3N0XG4iOwotICAgICAgICAgIC8vICAgc3RkOjpjb3V0IDw8ICJCb29zdCAoIiA8PCBib29zdFN0ZWluZXIueCgpIDw8ICIsICIgPDwgYm9vc3RTdGVpbmVyLnkoKSAKLSAgICAgICAgICAvLyAgICAgICAgICAgICA8PCAiKSBhbmQgb3VyICgiIDw8IHRtcFN0ZWluZXIueCgpIDw8ICIsICIgPDwgdG1wU3RlaW5lci55KCkgPDwgIilcbiI7Ci0gICAgICAgICAgLy8gfQotICAgICAgICAgIHN0ZWluZXJzLmluc2VydCh0bXBTdGVpbmVyKTsKLQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBhcHBlbmRUb3VjaGluZ0d1aWRlSW50dihzdGQ6Om1hcDxmckxheWVyTnVtLCBzdGQ6Om1hcDxmckNvb3JkLCBib29zdDo6aWNsOjppbnRlcnZhbF9zZXQ8ZnJDb29yZD4gPiA+ICZsYXllckdDZWxsMkludHZTZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGZyOjpmckxheWVyPiA+ICZ2bGF5ZXJzKSB7Ci0gICAgZnJDb29yZCBHQ0VMTEdSSURYID0gZ2V0R0NFTExHUklEWCgpOwotICAgIGZyQ29vcmQgR0NFTExHUklEWSA9IGdldEdDRUxMR1JJRFkoKTsKLSAgICAvL2ZyQ29vcmQgR0NFTExPRkZTRVRYID0gZ2V0R0NFTExPRkZTRVRYKCk7Ci0gICAgLy9mckNvb3JkIEdDRUxMT0ZGU0VUWSA9IGdldEdDRUxMT0ZGU0VUWSgpOwotCi0gICAgZm9yIChhdXRvIGxheWVySXQgPSBsYXllckdDZWxsMkludHZTZXQuYmVnaW4oKTsgbGF5ZXJJdCAhPSBsYXllckdDZWxsMkludHZTZXQuZW5kKCk7ICsrbGF5ZXJJdCkgewotICAgICAgYXV0byBjdXJyTGF5ZXIgPSBsYXllckl0LT5maXJzdDsKLSAgICAgIGF1dG8gY3VyckRpciA9IHZsYXllcnNbY3VyckxheWVyXS0+Z2V0RGlyKCk7Ci0gICAgICBhdXRvICZnQ2VsbDJJbnR2U2V0ID0gbGF5ZXJJdC0+c2Vjb25kOwotICAgICAgZnJMYXllck51bSBuZXh0TGF5ZXIgPSAtMTsKLSAgICAgIGlmICgoY3VyckxheWVyICsgMikgPCAoaW50KXZsYXllcnMuc2l6ZSgpKSB7Ci0gICAgICAgIG5leHRMYXllciA9IGN1cnJMYXllciArIDI7Ci0gICAgICB9IGVsc2UgaWYgKChjdXJyTGF5ZXIgLSAyKSA+PSAwKSB7Ci0gICAgICAgIG5leHRMYXllciA9IGN1cnJMYXllciAtIDI7Ci0gICAgICB9Ci0gICAgICBpZiAobmV4dExheWVyID09IC0xKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgZnJDb29yZCBnQ2VsbFRyYWNrUGl0Y2ggPSAoY3VyckRpciA9PSBmcmNIb3J6UHJlZlJvdXRpbmdEaXIpID8gR0NFTExHUklEWSA6IEdDRUxMR1JJRFg7Ci0gICAgICAvL2ZyQ29vcmQgZ0NlbGxUcmFja1BpdGNoTmV4dCA9IChjdXJyRGlyID09IGZyY0hvcnpQcmVmUm91dGluZ0RpcikgPyBHQ0VMTEdSSURYIDogR0NFTExHUklEWTsKLSAgICAgIC8vIHN0ZDo6Y291dCA8PCAiZ0NlbGxUcmFja1BpdGNoTmV4dCA9ICIgPDwgZ0NlbGxUcmFja1BpdGNoTmV4dCA8PCAiLCBnQ2VsbFRyYWNrUGl0Y2ggPSAiIDw8IGdDZWxsVHJhY2tQaXRjaCA8PCAiXG4iOwotICAgICAgaWYgKGdDZWxsMkludHZTZXQuZW1wdHkoKSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoYXV0byBnQ2VsbFJvd0l0ID0gZ0NlbGwySW50dlNldC5iZWdpbigpOyBzdGQ6Om5leHQoZ0NlbGxSb3dJdCkgIT0gZ0NlbGwySW50dlNldC5lbmQoKTsgKytnQ2VsbFJvd0l0KSB7Ci0gICAgICAgICAgZnJDb29yZCBjdXJyUm93ID0gZ0NlbGxSb3dJdC0+Zmlyc3Q7Ci0gICAgICAgICAgZnJDb29yZCBuZXh0Um93ID0gKHN0ZDo6bmV4dChnQ2VsbFJvd0l0KSktPmZpcnN0OwotICAgICAgICAgIGF1dG8gJmN1cnJJbnR2U2V0ID0gZ0NlbGxSb3dJdC0+c2Vjb25kOwotICAgICAgICAgIGF1dG8gJm5leHRJbnR2U2V0ID0gKHN0ZDo6bmV4dChnQ2VsbFJvd0l0KSktPnNlY29uZDsKLSAgICAgICAgICBpZiAoKG5leHRSb3cgLSBjdXJyUm93KSAhPSBnQ2VsbFRyYWNrUGl0Y2gpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8vIGNoZWNrIGFuZCBnZXQgYXBwZW5kIGd1aWRlIGludHY7Ci0gICAgICAgICAgYXV0byBvdmVybGFwSW50dlNldCA9IGN1cnJJbnR2U2V0ICYgbmV4dEludHZTZXQ7Ci0gICAgICAgICAgLy8gc3RkOjpjb3V0IDw8ICJvdmVybGFwcGVkIGludHZTZXQgc2l6ZSA9ICIgPDwgb3ZlcmxhcEludHZTZXQuc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgICBmb3IgKGF1dG8gb3ZlcmxhcEludHZTZXRJdCA9IG92ZXJsYXBJbnR2U2V0LmJlZ2luKCk7IG92ZXJsYXBJbnR2U2V0SXQgIT0gb3ZlcmxhcEludHZTZXQuZW5kKCk7ICsrb3ZlcmxhcEludHZTZXRJdCkgewotICAgICAgICAgICAgYm9vbCBuZWVkQnJpZGdlID0gdHJ1ZTsKLSAgICAgICAgICAgIGF1dG8gbmV4dExheWVyU3RhcnRSb3cgPSBvdmVybGFwSW50dlNldEl0LT5sb3dlcigpOwotICAgICAgICAgICAgYXV0byBuZXh0TGF5ZXJFbmRSb3cgPSBvdmVybGFwSW50dlNldEl0LT51cHBlcigpOwotICAgICAgICAgICAgLy8gc3RkOjpjb3V0IDw8IG5leHRMYXllclN0YXJ0Um93IDw8ICIgIiA8PCBuZXh0TGF5ZXJFbmRSb3cgPDwgIlxuIjsKLSAgICAgICAgICAgIC8vIGlmIChuZXh0TGF5ZXJTdGFydFJvdyAhPSBuZXh0TGF5ZXJFbmRSb3cpIHsKLSAgICAgICAgICAgIC8vICAgc3RkOjpjb3V0IDw8ICJXYXJuaW5nOiBwYXJhbGxlbCB0b3VjaGluZyBndWlkZSBhY3Jvc3NpbmcgIiA8PCAobmV4dExheWVyRW5kUm93IC0gbmV4dExheWVyU3RhcnRSb3cpIC8gZ0NlbGxUcmFja1BpdGNoTmV4dCArIDEgPDwgIiBnY2VsbHNcbiI7Ci0KLSAgICAgICAgICAgIC8vIH0KLSAgICAgICAgICAgIC8vIGZvciAoYXV0byBuZXh0TGF5ZXJSb3cgPSBuZXh0TGF5ZXJTdGFydFJvdzsgbmV4dExheWVyUm93IDw9IG5leHRMYXllckVuZFJvdzsgbmV4dExheWVyUm93ICs9IGdDZWxsVHJhY2tQaXRjaE5leHQpIHsKLSAgICAgICAgICAgIC8vICAgbGF5ZXJHQ2VsbDJJbnR2U2V0W25leHRMYXllcl1bbmV4dExheWVyUm93XS5pbnNlcnQoYm9vc3Q6OmljbDo6aW50ZXJ2YWxfc2V0PGZyQ29vcmQ+OjppbnRlcnZhbF90eXBlOjpjbG9zZWQoY3VyclJvdywgbmV4dFJvdykpOwotICAgICAgICAgICAgLy8gfQotCi0gICAgICAgICAgICAvLyBjaGVjayBpZiBicmlkZ2UgYWxyZWFkeSBleGlzdHMKLSAgICAgICAgICAgIGZvciAoYXV0byBuZXh0TGF5ZXJSb3cgPSBuZXh0TGF5ZXJTdGFydFJvdzsgbmV4dExheWVyUm93IDw9IG5leHRMYXllckVuZFJvdzsgKytuZXh0TGF5ZXJSb3cpIHsKLSAgICAgICAgICAgICAgaWYgKGN1cnJMYXllciArIDIgPCAoaW50KXZsYXllcnMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgZnJMYXllck51bSB0bXBOZXh0TGF5ZXIgPSBjdXJyTGF5ZXIgKyAyOwotICAgICAgICAgICAgICAgIGlmIChsYXllckdDZWxsMkludHZTZXQuZmluZCh0bXBOZXh0TGF5ZXIpICE9IGxheWVyR0NlbGwySW50dlNldC5lbmQoKSkgewotICAgICAgICAgICAgICAgICAgaWYgKGxheWVyR0NlbGwySW50dlNldFt0bXBOZXh0TGF5ZXJdLmZpbmQobmV4dExheWVyUm93KSAhPSBsYXllckdDZWxsMkludHZTZXRbdG1wTmV4dExheWVyXS5lbmQoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgImhlcmVcbiI7Ci0gICAgICAgICAgICAgICAgICAgIGF1dG8gYnJpZGdlSW50diA9IGJvb3N0OjppY2w6OmludGVydmFsX3NldDxmckNvb3JkPjo6aW50ZXJ2YWxfdHlwZTo6Y2xvc2VkKGN1cnJSb3csIG5leHRSb3cpOwotICAgICAgICAgICAgICAgICAgICBib29zdDo6aWNsOjppbnRlcnZhbF9zZXQ8ZnJDb29yZD4gYnJpZGdlSW50dlNldDsKLSAgICAgICAgICAgICAgICAgICAgYnJpZGdlSW50dlNldC5pbnNlcnQoYnJpZGdlSW50dik7Ci0gICAgICAgICAgICAgICAgICAgIGF1dG8gYnJpZGdlSW50ZXJzZWN0SW50dlNldCA9IGJyaWRnZUludHZTZXQgJiBsYXllckdDZWxsMkludHZTZXRbdG1wTmV4dExheWVyXVtuZXh0TGF5ZXJSb3ddOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBicmlkZ2VJbnRlcnNlY3RJbnR2U2V0LmJlZ2luKCk7IGl0ICE9IGJyaWRnZUludGVyc2VjdEludHZTZXQuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICBpZiAoKml0ID09IGJyaWRnZUludHYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRCcmlkZ2UgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZDo6Y291dCA8PCAiZXhpc3RpbmcgdXBwZXIgYnJpZGdlXG4iOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmICghYnJpZGdlSW50ZXJzZWN0SW50dlNldC5lbXB0eSgpICYmIGJyaWRnZUludGVyc2VjdEludHZTZXQuc2l6ZSgpID09IDEgJiYgKihicmlkZ2VJbnRlcnNlY3RJbnR2U2V0LmJlZ2luKCkpID09IGJyaWRnZUludHYpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gICBzdGQ6OmNvdXQgPDwgImJyaWRnZSBleGlzdHNcbiI7Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgbmVlZEJyaWRnZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAvLyAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAvLyB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKGN1cnJMYXllciAtIDIgPj0gMCkgewotICAgICAgICAgICAgICAgIGZyTGF5ZXJOdW0gdG1wTmV4dExheWVyID0gY3VyckxheWVyIC0gMjsKLQotICAgICAgICAgICAgICAgIGlmIChsYXllckdDZWxsMkludHZTZXQuZmluZCh0bXBOZXh0TGF5ZXIpICE9IGxheWVyR0NlbGwySW50dlNldC5lbmQoKSkgewotICAgICAgICAgICAgICAgICAgaWYgKGxheWVyR0NlbGwySW50dlNldFt0bXBOZXh0TGF5ZXJdLmZpbmQobmV4dExheWVyUm93KSAhPSBsYXllckdDZWxsMkludHZTZXRbdG1wTmV4dExheWVyXS5lbmQoKSkgewotICAgICAgICAgICAgICAgICAgICBhdXRvIGJyaWRnZUludHYgPSBib29zdDo6aWNsOjppbnRlcnZhbF9zZXQ8ZnJDb29yZD46OmludGVydmFsX3R5cGU6OmNsb3NlZChjdXJyUm93LCBuZXh0Um93KTsKLSAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OmljbDo6aW50ZXJ2YWxfc2V0PGZyQ29vcmQ+IGJyaWRnZUludHZTZXQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyaWRnZUludHZTZXQuaW5zZXJ0KGJyaWRnZUludHYpOwotICAgICAgICAgICAgICAgICAgICBhdXRvIGJyaWRnZUludGVyc2VjdEludHZTZXQgPSBicmlkZ2VJbnR2U2V0ICYgbGF5ZXJHQ2VsbDJJbnR2U2V0W3RtcE5leHRMYXllcl1bbmV4dExheWVyUm93XTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gYnJpZGdlSW50ZXJzZWN0SW50dlNldC5iZWdpbigpOyBpdCAhPSBicmlkZ2VJbnRlcnNlY3RJbnR2U2V0LmVuZCgpOyArK2l0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKCppdCA9PSBicmlkZ2VJbnR2KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZWVkQnJpZGdlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgImV4aXN0aW5nIGxvd2VyIGJyaWRnZVxuIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBpZiAoIWJyaWRnZUludGVyc2VjdEludHZTZXQuZW1wdHkoKSAmJiBicmlkZ2VJbnRlcnNlY3RJbnR2U2V0LnNpemUoKSA9PSAxICYmICooYnJpZGdlSW50ZXJzZWN0SW50dlNldC5iZWdpbigpKSA9PSBicmlkZ2VJbnR2KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgbmVlZEJyaWRnZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAvLyAgIHN0ZDo6Y291dCA8PCAiYnJpZGdlIGV4aXN0c1xuIjsKLSAgICAgICAgICAgICAgICAgICAgLy8gICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgLy8gfQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB9ICAgCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChuZWVkQnJpZGdlKSB7Ci0gICAgICAgICAgICAgIGxheWVyR0NlbGwySW50dlNldFtuZXh0TGF5ZXJdW25leHRMYXllclN0YXJ0Um93XS5pbnNlcnQoYm9vc3Q6OmljbDo6aW50ZXJ2YWxfc2V0PGZyQ29vcmQ+OjppbnRlcnZhbF90eXBlOjpjbG9zZWQoY3VyclJvdywgbmV4dFJvdykpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICB2b2lkIGNoZWNrR1JDb25uZWN0aXZpdHkoc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c2hhcmVkX3B0cjxmcjo6ZnJOZXQ+ID4gJm5ldHMpIHsKLSAgICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICAgIHN0ZDo6Y291dCA8PCAiQ2hlY2tpbmcgR1IgY29ubmVjdGl2aXR5XG4iOwotICAgIGZvciAoYXV0byAmbmV0OiBuZXRzKSB7Ci0gICAgICBmclN0cmluZyBuZXROYW1lOwotICAgICAgbmV0LnNlY29uZC0+Z2V0TmFtZShuZXROYW1lKTsKLSAgICAgIAotICAgICAgdmVydGV4X2Rlc2NyaXB0b3JfbWFwX3QgaWR4TWFwOwotICAgICAgYm9vc3Q6OmFzc29jaWF0aXZlX3Byb3BlcnR5X21hcDx2ZXJ0ZXhfZGVzY3JpcHRvcl9tYXBfdD4gaW5kZXhNYXAoaWR4TWFwKTsKLSAgICAgIHZlcnRleF9pdGVyYXRvcl90IGRpLCBkajsKLSAgICAgIGJvb3N0Ojp0aWUoZGksIGRqKSA9IGJvb3N0Ojp2ZXJ0aWNlcyhuZXQuc2Vjb25kLT5nKTsKLSAgICAgIGZvcihpbnQgaSA9IDA7IGRpICE9IGRqOyArK2RpLCsraSl7Ci0gICAgICAgICAgYm9vc3Q6OnB1dChpbmRleE1hcCwgKCpkaSksIGkpOwotICAgICAgfQotICAgICAgc3RkOjptYXA8dmVydGV4X2Rlc2NyaXB0b3JfdCwgc2l6ZV90PiBjb21wTWFwOwotICAgICAgYm9vc3Q6OmFzc29jaWF0aXZlX3Byb3BlcnR5X21hcDx2ZXJ0ZXhfZGVzY3JpcHRvcl9tYXBfdD4gY29tcG9uZW50TWFwKGNvbXBNYXApOyAgICAgICAgICAgIAotICAgICAgYXV0byBudW1fY29tcHMgPSBib29zdDo6Y29ubmVjdGVkX2NvbXBvbmVudHMobmV0LnNlY29uZC0+ZywgY29tcG9uZW50TWFwLCBib29zdDo6dmVydGV4X2luZGV4X21hcChpbmRleE1hcCkpOyAKLSAgICAgIAotICAgICAgLy8gc3RkOjpjb3V0IDw8IG5ldE5hbWUgPDwgc3RkOjplbmRsOwotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBzdGQ6OmNvdXQgPDwgbmV0TmFtZSA8PCAiOiBncmFwaCBpbmZvOiBudW1fdiA9ICIgPDxib29zdDo6bnVtX3ZlcnRpY2VzKG5ldC5zZWNvbmQtPmcpIAotICAgICAgICAgICAgIDw8IiwgbnVtX2UgPSAiIDw8Ym9vc3Q6Om51bV9lZGdlcyhuZXQuc2Vjb25kLT5nKSAKLSAgICAgICAgICAgICA8PCIsIG51bV9wYXJ0cyA9ICIgPDxudW1fY29tcHMgPDwgc3RkOjplbmRsOwotICAgICAgfQotICAgICAgLy8gaWYgKGJvb3N0OjpudW1fdmVydGljZXMobmV0LnNlY29uZC0+ZykgPT0gMCkgewotICAgICAgLy8gICBzdGQ6OmNvdXQgPDwiV2FybmluZzogIiA8PG5ldE5hbWUgPDwiIGhhcyBubyB3aXJlcyIgPDwgc3RkOjplbmRsOwotICAgICAgLy8gfQotICAgICAgLy8gaWYgKGJvb3N0OjpudW1fdmVydGljZXMobmV0LnNlY29uZC0+ZykgPiAwICYmIAotICAgICAgLy8gICAgIGJvb3N0OjpudW1fdmVydGljZXMobmV0LnNlY29uZC0+ZykgLSBib29zdDo6bnVtX2VkZ2VzKG5ldC5zZWNvbmQtPmcpICE9IDEpIHsKLSAgICAgIC8vICAgc3RkOjpjb3V0IDw8Ildhcm5pbmc6ICIgPDxuZXROYW1lIDw8IiBoYXMgcmVkdW5kYW50IHdpcmVzIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICAvLyB9Ci0gICAgICBpZiAoYm9vc3Q6Om51bV92ZXJ0aWNlcyhuZXQuc2Vjb25kLT5nKSA+IDAgJiYgbnVtX2NvbXBzICE9IDEpIHsKLSAgICAgICAgc3RkOjpjb3V0IDw8Ildhcm5pbmc6ICIgPDxuZXROYW1lIDw8IiBpcyBvcGVuIGFuZCBpdCBoYXMgIiA8PCBudW1fY29tcHMgPDwgIiBwYXJ0cyIgPDwgc3RkOjplbmRsOwotICAgICAgICBzdGQ6Om1hcDxzaXplX3QsIGludD4gY2NDbnQ7Ci0gICAgICAgIGZvciAoYXV0byBtYXBJdCA9IGNvbXBNYXAuYmVnaW4oKTsgbWFwSXQgIT0gY29tcE1hcC5lbmQoKTsgKyttYXBJdCkgewotICAgICAgICAgIGF1dG8gY2NJZHggPSBtYXBJdC0+c2Vjb25kOwotICAgICAgICAgIGlmIChjY0NudC5maW5kKGNjSWR4KSA9PSBjY0NudC5lbmQoKSkgewotICAgICAgICAgICAgY2NDbnRbY2NJZHhdID0gMDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2NDbnRbY2NJZHhdKys7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGF1dG8gc2V0SXQgPSBjY0NudC5iZWdpbigpOyBzZXRJdCAhPSBjY0NudC5lbmQoKTsgKytzZXRJdCkgewotICAgICAgICAgIHN0ZDo6Y291dCA8PCAiICBjY0lkeCA9ICIgPDwgc2V0SXQtPmZpcnN0IDw8ICIsIGNvdW50ID0gIiA8PCBzZXRJdC0+c2Vjb25kIDw8ICJcbiI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkZWJ1ZwotICAgICAgICAvL2lmIChuZXROYW1lID09ICJuZXQxMDcyMTEiKSB7Ci0gICAgICAgIC8vICBzdGQ6Om1hcDxzaXplX3QsIHN0ZDo6c2V0PHZlcnRleF9kZXNjcmlwdG9yX3Q+ID4gY2NWZXJ0ZXg7Ci0gICAgICAgIC8vICBmb3IgKGF1dG8gbWFwSXQgPSBjb21wTWFwLmJlZ2luKCk7IG1hcEl0ICE9IGNvbXBNYXAuZW5kKCk7ICsrbWFwSXQpIHsKLSAgICAgICAgLy8gICAgYXV0byBjY0lkeCA9IG1hcEl0LT5zZWNvbmQ7Ci0gICAgICAgIC8vICAgIGNjVmVydGV4W2NjSWR4XS5pbnNlcnQobWFwSXQtPmZpcnN0KTsKLSAgICAgICAgLy8gIH0KLQotICAgICAgICAvLyAgZm9yIChhdXRvIG1hcEl0ID0gY2NWZXJ0ZXguYmVnaW4oKTsgbWFwSXQgIT0gY2NWZXJ0ZXguZW5kKCk7ICsrbWFwSXQpIHsKLSAgICAgICAgLy8gICAgYXV0byBjY0lkeCA9IG1hcEl0LT5maXJzdDsKLSAgICAgICAgLy8gICAgc3RkOjpjb3V0IDw8ICI9PT09Q0NJZHggIiA8PCBjY0lkeCA8PCAiPT09PVxuIjsKLSAgICAgICAgLy8gICAgaW50IHRtcENudCA9IDA7Ci0gICAgICAgIC8vICAgIGZvciAoYXV0byB2ZXJ0ZXhJdCA9IG1hcEl0LT5zZWNvbmQuYmVnaW4oKTsgdmVydGV4SXQgIT0gbWFwSXQtPnNlY29uZC5lbmQoKTsgKyt2ZXJ0ZXhJdCkgewotICAgICAgICAvLyAgICAgIGF1dG8gdmVydGV4UHRyID0gbmV0LnNlY29uZC0+Z1sqdmVydGV4SXRdLm9ialB0cjsKLSAgICAgICAgLy8gICAgICBzdGQ6OmNvdXQgPDwgImxvY2F0aW9uICIgPDwgdG1wQ250IDw8ICI6ICI7Ci0gICAgICAgIC8vICAgICAgaWYgKHZlcnRleFB0ci0+dHlwZUlkKCkgPT0gZnJjSW5zdFRlcm0pIHsKLSAgICAgICAgLy8gICAgICAgIGF1dG8gcGlucyA9IHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8ZnJJbnN0VGVybT4odmVydGV4UHRyKS0+Z2V0VGVybSgpLT5nZXRQaW5zKCk7Ci0gICAgICAgIC8vICAgICAgICBhdXRvIHBpbkZpZ3MgPSBwaW5zWzBdLT5nZXRGaWdzKCk7Ci0gICAgICAgIC8vICAgICAgICBmclN0cmluZyBpbnN0TmFtZTsKLSAgICAgICAgLy8gICAgICAgIHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8ZnJJbnN0VGVybT4odmVydGV4UHRyKS0+Z2V0SW5zdCgpLT5nZXROYW1lKGluc3ROYW1lKTsKLSAgICAgICAgLy8gICAgICAgIGZyQm94IHBpbkJveDsKLSAgICAgICAgLy8gICAgICAgIHBpbkZpZ3NbMF0tPmdldEJCb3gocGluQm94KTsKLSAgICAgICAgLy8gICAgICAgIHN0ZDo6Y291dCA8PCAiKCIgPDwgcGluQm94LmxlZnQoKSA8PCAiLCAiIDw8IHBpbkJveC5ib3R0b20oKSA8PCAiKSBvZiBpbnN0ICIgPDwgaW5zdE5hbWUgPDwgIlxuIjsKLSAgICAgICAgLy8gICAgICB9IGVsc2UgaWYgKHZlcnRleFB0ci0+dHlwZUlkKCkgPT0gZnJjVGVybSkgewotICAgICAgICAvLyAgICAgICAgYXV0byBwaW5zID0gc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxmclRlcm0+KHZlcnRleFB0ciktPmdldFBpbnMoKTsKLSAgICAgICAgLy8gICAgICAgIGF1dG8gcGluRmlncyA9IHBpbnNbMF0tPmdldEZpZ3MoKTsKLSAgICAgICAgLy8gICAgICAgIGZyQm94IHBpbkJveDsKLSAgICAgICAgLy8gICAgICAgIHBpbkZpZ3NbMF0tPmdldEJCb3gocGluQm94KTsKLSAgICAgICAgLy8gICAgICAgIHN0ZDo6Y291dCA8PCAiKCIgPDwgcGluQm94LmxlZnQoKSA8PCAiLCAiIDw8IHBpbkJveC5ib3R0b20oKSA8PCAiKVxuIjsKLSAgICAgICAgLy8gICAgICB9IGVsc2UgaWYgKHZlcnRleFB0ci0+dHlwZUlkKCkgPT0gZnJjU3RlaW5lcikgewotICAgICAgICAvLyAgICAgICAgYXV0byBzdGVpbmVyID0gc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxmclN0ZWluZXI+KHZlcnRleFB0cik7Ci0gICAgICAgIC8vICAgICAgICBmckJveCBzdGVpbmVyQm94OwotICAgICAgICAvLyAgICAgICAgc3RlaW5lci0+Z2V0QkJveChzdGVpbmVyQm94KTsKLSAgICAgICAgLy8gICAgICAgIHN0ZDo6Y291dCA8PCAiKCIgPDwgc3RlaW5lckJveC5sZWZ0KCkgPDwgIiwgIiA8PCBzdGVpbmVyQm94LmJvdHRvbSgpIDw8ICIsICIgPDwgc3RlaW5lci0+Z2V0TGF5ZXJOdW0oKSA8PCAiKVxuIjsKLSAgICAgICAgLy8gICAgICB9Ci0gICAgICAgIC8vICAgICAgdG1wQ250Kys7Ci0KLSAgICAgICAgLy8gICAgfQotICAgICAgICAvLyAgfQotCi0gICAgICAgIC8vfQotCi0gICAgICB9Ci0KLSAgICB9Ci0gIH0KLQotICBmclBvaW50IGdldEdDZWxsQ2VudGVyKGZyUG9pbnQgcG9pbnRJbikgewotICAgIGZyQ29vcmQgY2VudGVyWCwgY2VudGVyWTsKLSAgICBmclBvaW50IHBvaW50T3V0OwotICAgIGZyQ29vcmQgR0NFTExHUklEWCA9IGdldEdDRUxMR1JJRFgoKTsKLSAgICBmckNvb3JkIEdDRUxMR1JJRFkgPSBnZXRHQ0VMTEdSSURZKCk7Ci0gICAgZnJDb29yZCBHQ0VMTE9GRlNFVFggPSBnZXRHQ0VMTE9GRlNFVFgoKTsKLSAgICBmckNvb3JkIEdDRUxMT0ZGU0VUWSA9IGdldEdDRUxMT0ZGU0VUWSgpOwotCi0gICAgY2VudGVyWCA9IChwb2ludEluLngoKSAtIEdDRUxMT0ZGU0VUWCkgLyBHQ0VMTEdSSURYICogR0NFTExHUklEWCArIEdDRUxMT0ZGU0VUWCArIEdDRUxMR1JJRFggLyAyOwotICAgIGNlbnRlclkgPSAocG9pbnRJbi55KCkgLSBHQ0VMTE9GRlNFVFkpIC8gR0NFTExHUklEWSAqIEdDRUxMR1JJRFkgKyBHQ0VMTE9GRlNFVFkgKyBHQ0VMTEdSSURZIC8gMjsKLSAgICBwb2ludE91dC5zZXQoY2VudGVyWCwgY2VudGVyWSk7Ci0gICAgcmV0dXJuIHBvaW50T3V0OwotCi0KLSAgfQotCi0gIHZvaWQgcHJpbnRHQ2VsbEluZm8oKSB7Ci0gICAgc3RkOjpjb3V0IDw8ICJHQ0VMTEdSSURYID0gIiA8PCBnZXRHQ0VMTEdSSURYKCkgPDwgc3RkOjplbmRsOwotICAgIHN0ZDo6Y291dCA8PCAiR0NFTExHUklEWSA9ICIgPDwgZ2V0R0NFTExHUklEWSgpIDw8IHN0ZDo6ZW5kbDsKLSAgICBzdGQ6OmNvdXQgPDwgIkdDRUxMT0ZGU0VUWCA9ICIgPDwgZ2V0R0NFTExPRkZTRVRYKCkgPDwgc3RkOjplbmRsOwotICAgIHN0ZDo6Y291dCA8PCAiR0NFTExPRkZTRVRZID0gIiA8PCBnZXRHQ0VMTE9GRlNFVFkoKSA8PCBzdGQ6OmVuZGw7Ci0KLSAgfQotCi0gIHZvaWQgZ2V0TG9jYWxOZXRTdGF0cyhjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjptYXA8ZnJQb2ludCwgc3RkOjpzZXQ8c3RkOjpwYWlyPHN0ZDo6c2hhcmVkX3B0cjxmckJsb2NrT2JqZWN0PiwgZnJMYXllck51bT4gPiA+ID4gJmdDZWxsMlBpbk1hcCkgewotICAgIHN0ZDo6Y291dCA8PCAiR2V0dGluZyBsb2NhbCBuZXQgc3RhdHMuLi5cbiI7Ci0gICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IG5ldE5hbWVzOwotICAgIHN0ZDo6c2V0PGZyUG9pbnQ+IGdDZWxsQ2VudGVyczsKLSAgICBpbnQgdG90TG9jYWxOZXRDbnQgPSAwOwotICAgIGZvciAoYXV0byBuZXRJdCA9IGdDZWxsMlBpbk1hcC5iZWdpbigpOyBuZXRJdCAhPSBnQ2VsbDJQaW5NYXAuZW5kKCk7ICsrbmV0SXQpIHsKLSAgICAgIGF1dG8gbmV0TmFtZSA9IG5ldEl0LT5maXJzdDsKLSAgICAgIG5ldE5hbWVzLmluc2VydChuZXROYW1lKTsKLSAgICAgIGF1dG8gJmdDZWxsTWFwID0gbmV0SXQtPnNlY29uZDsKLSAgICAgIGZvciAoYXV0byBnQ2VsbEl0ID0gZ0NlbGxNYXAuYmVnaW4oKTsgZ0NlbGxJdCAhPSBnQ2VsbE1hcC5lbmQoKTsgKytnQ2VsbEl0KSB7Ci0gICAgICAgIGF1dG8gZ0NlbGxDZW50ZXIgPSBnQ2VsbEl0LT5maXJzdDsKLSAgICAgICAgYXV0byAmcGlucyA9IGdDZWxsSXQtPnNlY29uZDsKLSAgICAgICAgZ0NlbGxDZW50ZXJzLmluc2VydChnQ2VsbENlbnRlcik7Ci0gICAgICAgIGlmIChwaW5zLnNpemUoKSA+PSAyKSB7Ci0gICAgICAgICAgdG90TG9jYWxOZXRDbnQrKzsKLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgfQotCi0gICAgc3RkOjpjb3V0IDw8ICIjbG9jYWwgbmV0ID0gIiA8PCB0b3RMb2NhbE5ldENudCAKLSAgICAgICAgICAgICAgPDwgIiwgYW1vbmcgI3RvdGFsIG5ldCA9ICIgPDwgbmV0TmFtZXMuc2l6ZSgpIAotICAgICAgICAgICAgICA8PCAiLCBpbiAjbm9uLWVtcHR5IGdjZWxsID0gIiA8PCBnQ2VsbENlbnRlcnMuc2l6ZSgpIDw8ICJcbiI7IAotICAgIAotICB9Ci0KLQotICB2b2lkIEtNQlRlcm1TdGVpbmVyVHJlZShmck5ldCAmbmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBncmFwaF90ICZuZXRHLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8ZnJDTWFwPiAmY01hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8c3RkOjpzaGFyZWRfcHRyPGZyQ29ubkZpZz4gPiAmcm91dGVzKSB7Ci0gICAgYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBzdGQ6OmNvdXQgPDwgIm5ldDogIiA8PCBuZXQuZ2V0TmFtZSgpIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmZsdXNoOwotICAgIH0KLSAgICAvL2lmIChuZXQuZ2V0TmFtZSgpID09ICJydHIvcm9mXzBfX2JtcmIvZmlmb19kYXRhWzIwMV0iKSB7Ci0gICAgLy8gcmV0dXJuOwotICAgIC8vfQotICAgIC8vaWYgKG5ldC5nZXROYW1lKCkgPT0gInJ0ci9yb2ZfMF9fYm1yYi9maWZvX2RhdGFbMjE3XSIpIHsKLSAgICAvLyByZXR1cm47Ci0gICAgLy99Ci0KLSAgICB2ZXJ0ZXhfZGVzY3JpcHRvcl9tYXBfdCBpZHhNYXA7Ci0gICAgYm9vc3Q6OmFzc29jaWF0aXZlX3Byb3BlcnR5X21hcDx2ZXJ0ZXhfZGVzY3JpcHRvcl9tYXBfdD4gaW5kZXhNYXAoaWR4TWFwKTsKLSAgICB2ZXJ0ZXhfaXRlcmF0b3JfdCBkaSwgZGo7Ci0gICAgLy8gYm9vc3Q6OnRpZShkaSwgZGopID0gYm9vc3Q6OnZlcnRpY2VzKG5ldC5nKTsKLSAgICBib29zdDo6dGllKGRpLCBkaikgPSBib29zdDo6dmVydGljZXMobmV0Ryk7Ci0gICAgZm9yKGludCBpID0gMDsgZGkgIT0gZGo7ICsrZGksKytpKXsKLSAgICAgIGJvb3N0OjpwdXQoaW5kZXhNYXAsICgqZGkpLCBpKTsKLSAgICB9Ci0gICAgc3RkOjptYXA8dmVydGV4X2Rlc2NyaXB0b3JfdCwgc2l6ZV90PiBjb21wTWFwOwotICAgIGJvb3N0Ojphc3NvY2lhdGl2ZV9wcm9wZXJ0eV9tYXA8dmVydGV4X2Rlc2NyaXB0b3JfbWFwX3Q+IGNvbXBvbmVudE1hcChjb21wTWFwKTsgICAgICAgICAgICAKLSAgICAvLyBhdXRvIG51bV9jb21wcyA9IGJvb3N0Ojpjb25uZWN0ZWRfY29tcG9uZW50cyhuZXQuZywgY29tcG9uZW50TWFwLCBib29zdDo6dmVydGV4X2luZGV4X21hcChpbmRleE1hcCkpOyAKLSAgICBhdXRvIG51bV9jb21wcyA9IGJvb3N0Ojpjb25uZWN0ZWRfY29tcG9uZW50cyhuZXRHLCBjb21wb25lbnRNYXAsIGJvb3N0Ojp2ZXJ0ZXhfaW5kZXhfbWFwKGluZGV4TWFwKSk7IAotICAgIGlmIChudW1fY29tcHMgIT0gMSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBpbnQgbnVtVmVydGV4ID0gYm9vc3Q6Om51bV92ZXJ0aWNlcyhuZXRHKTsKLSAgICBkb3VibGUgTEFSR0VET1VCTEUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1heCgpIC8gbnVtVmVydGV4OwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxib29zdDo6Z3JhcGhfdHJhaXRzPEtNQkdyYXBoPjo6dmVydGV4X2Rlc2NyaXB0b3IsIGJvb3N0OjpncmFwaF90cmFpdHM8S01CR3JhcGg+Ojp2ZXJ0ZXhfZGVzY3JpcHRvciA+ID4gcGF0aEVkZ2VzOwotICAgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gcGF0aFdlaWdodHM7Ci0gICAgS01CR3JhcGggZzsKLSAgICBib29zdDo6cHJvcGVydHlfbWFwPEtNQkdyYXBoLCBib29zdDo6ZWRnZV93ZWlnaHRfdD46OnR5cGUgd2VpZ2h0bWFwID0gYm9vc3Q6OmdldChib29zdDo6ZWRnZV93ZWlnaHQsIGcpOwotICAgIHZlcnRleF9pdGVyYXRvcl90IHYsIHZfZW5kOwotICAgIHN0ZDo6bWFwPGZyQmxvY2tPYmplY3QqLCBib29zdDo6Z3JhcGhfdHJhaXRzPEtNQkdyYXBoPjo6dmVydGV4X2Rlc2NyaXB0b3I+IGl0ZXJhdG9yTWFwOwotICAgIGlmIChudW1WZXJ0ZXggPD0gMSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIGFkZCB2ZXJ0ZXgKLSAgICBmb3IgKGJvb3N0Ojp0aWUodiwgdl9lbmQpID0gYm9vc3Q6OnZlcnRpY2VzKG5ldEcpOyB2ICE9IHZfZW5kOyArK3YpIHsKLSAgICAgIGF1dG8gdG1wViA9IGJvb3N0OjphZGRfdmVydGV4KGcpOwotICAgICAgZ1t0bXBWXS5vYmpQdHIgPSBuZXRHWyp2XS5vYmpQdHI7Ci0gICAgICBpdGVyYXRvck1hcFtuZXRHWyp2XS5vYmpQdHJdID0gdG1wVjsKLSAgICB9Ci0gICAgLy8gYWRkIGVkZ2UKLSAgICBmb3IgKGJvb3N0Ojp0aWUodiwgdl9lbmQpID0gYm9vc3Q6OnZlcnRpY2VzKG5ldEcpOyB2ICE9IHZfZW5kOyArK3YpIHsKLSAgICAgIGFkamFjZW5jeV9pdGVyYXRvcl90IGFkal92LCBhZGpfdl9lbmQ7Ci0gICAgICBmb3IgKHRpZShhZGpfdiwgYWRqX3ZfZW5kKSA9IGJvb3N0OjphZGphY2VudF92ZXJ0aWNlcygqdiwgbmV0Ryk7IGFkal92ICE9IGFkal92X2VuZDsgKythZGpfdikgewotICAgICAgICBkb3VibGUgZWRnZVdlaWdodCA9IGdldEtNQkVkZ2VXZWlnaHQobmV0R1sqdl0ub2JqUHRyLCBuZXRHWyphZGpfdl0ub2JqUHRyLCBjTWFwKTsKLSAgICAgICAgYm9vc3Q6OmFkZF9lZGdlKCAoaXRlcmF0b3JNYXBbbmV0R1sqdl0ub2JqUHRyXSksIChpdGVyYXRvck1hcFtuZXRHWyphZGpfdl0ub2JqUHRyXSksIGVkZ2VXZWlnaHQsIGcpOwotICAgICAgfSAKLSAgICB9Ci0gICAgLy8gS01CIGluaXRpYWxpemF0aW9uCi0gICAgc3RkOjp2ZWN0b3I8Ym9vc3Q6OmdyYXBoX3RyYWl0cyA8IEtNQkdyYXBoID46OnZlcnRleF9kZXNjcmlwdG9yPiBwcmVkZWNlc3NvcnMobnVtX3ZlcnRpY2VzKGcpKTsKLSAgICBzdGQ6OnZlY3Rvcjxkb3VibGU+IGRpc3RhbmNlcyhudW1fdmVydGljZXMoZykpOwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGJvb3N0OjpncmFwaF90cmFpdHMgPCBLTUJHcmFwaCA+Ojp2ZXJ0ZXhfZGVzY3JpcHRvcj4gPiBwYXRoczsKLSAgICBzdGQ6Om1hcDxzdGQ6OnBhaXI8Ym9vc3Q6OmdyYXBoX3RyYWl0czxLTUJHcmFwaD46OnZlcnRleF9kZXNjcmlwdG9yLCBib29zdDo6Z3JhcGhfdHJhaXRzPEtNQkdyYXBoPjo6dmVydGV4X2Rlc2NyaXB0b3IgPiwgaW50ID4gZ0VkZ2UyUGF0aElkeE1hcDsKLSAgICAvLyBzaG9ydGVzdCBwYXRoIGZyb20gZWFjaCB0ZXJtaW5hbCB0byBvdGhlcnMKLSAgICBib29zdDo6Z3JhcGhfdHJhaXRzPCBLTUJHcmFwaCA+Ojp2ZXJ0ZXhfaXRlcmF0b3IgdGVybV92LCB0ZXJtX3ZfZW5kOwotICAgIGludCB0ZXJtaW5hbENudCA9IDA7Ci0gICAgZm9yIChib29zdDo6dGllKHRlcm1fdiwgdGVybV92X2VuZCkgPSBib29zdDo6dmVydGljZXMoZyk7IHRlcm1fdiAhPSB0ZXJtX3ZfZW5kOyArK3Rlcm1fdikgewotICAgICAgaWYgKChnWyp0ZXJtX3ZdLm9ialB0ciktPnR5cGVJZCgpID09IGZyY1N0ZWluZXIpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0ZXJtaW5hbENudCsrOwotICAgICAgICBib29zdDo6ZGlqa3N0cmFfc2hvcnRlc3RfcGF0aHMoZywgKnRlcm1fdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpwcmVkZWNlc3Nvcl9tYXAoYm9vc3Q6Om1ha2VfaXRlcmF0b3JfcHJvcGVydHlfbWFwKHByZWRlY2Vzc29ycy5iZWdpbigpLCBib29zdDo6Z2V0KGJvb3N0Ojp2ZXJ0ZXhfaW5kZXgsIGcpKSkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZV9tYXAoYm9vc3Q6Om1ha2VfaXRlcmF0b3JfcHJvcGVydHlfbWFwKGRpc3RhbmNlcy5iZWdpbigpLCBib29zdDo6Z2V0KGJvb3N0Ojp2ZXJ0ZXhfaW5kZXgsIGcpKSkpOwotICAgICAgICBib29zdDo6Z3JhcGhfdHJhaXRzIDwgS01CR3JhcGggPjo6dmVydGV4X2l0ZXJhdG9yIHZpLCB2ZW5kOwotICAgICAgICBmb3IgKGJvb3N0Ojp0aWUodmksIHZlbmQpID0gYm9vc3Q6OnZlcnRpY2VzKGcpOyB2aSAhPSB2ZW5kOyArK3ZpKSB7Ci0gICAgICAgICAgaWYgKCp2aSA9PSAqdGVybV92IHx8IChnWyp2aV0ub2JqUHRyKS0+dHlwZUlkKCkgPT0gZnJjU3RlaW5lcikgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIHN0ZDo6dmVjdG9yPCBib29zdDo6Z3JhcGhfdHJhaXRzPEtNQkdyYXBoPjo6dmVydGV4X2Rlc2NyaXB0b3IgPiBwYXRoOwotICAgICAgICAgIGJvb3N0OjpncmFwaF90cmFpdHM8S01CR3JhcGg+Ojp2ZXJ0ZXhfZGVzY3JpcHRvciBjdXJyZW50LCBlbmQ7Ci0gICAgICAgICAgZG91YmxlIHBhdGhXZWlnaHQgPSBkaXN0YW5jZXNbKnZpXTsKLSAgICAgICAgICBlbmQgPSAqdmk7Ci0gICAgICAgICAgY3VycmVudCA9IGVuZDsKLSAgICAgICAgICB3aGlsZSAoY3VycmVudCAhPSAqdGVybV92KSB7Ci0gICAgICAgICAgICAvL3N0ZDo6Y291dCA8PCAiaGVyZTFcbiIgPDwgc3RkOjpmbHVzaDsKLSAgICAgICAgICAgIHBhdGgucHVzaF9iYWNrKGN1cnJlbnQpOwotICAgICAgICAgICAgY3VycmVudCA9IHByZWRlY2Vzc29yc1tjdXJyZW50XTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcGF0aC5wdXNoX2JhY2soY3VycmVudCk7Ci0gICAgICAgICAgcGF0aEVkZ2VzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihwYXRoLmZyb250KCksIHBhdGguYmFjaygpKSk7Ci0gICAgICAgICAgcGF0aFdlaWdodHMucHVzaF9iYWNrKHBhdGhXZWlnaHQpOwotICAgICAgICAgIGdFZGdlMlBhdGhJZHhNYXBbc3RkOjptYWtlX3BhaXIoc3RkOjptaW4ocGF0aC5mcm9udCgpLCBwYXRoLmJhY2soKSksIHN0ZDo6bWF4KHBhdGguZnJvbnQoKSwgcGF0aC5iYWNrKCkpKV0gPSAoaW50KXBhdGhzLnNpemUoKTsKLSAgICAgICAgICBwYXRocy5wdXNoX2JhY2socGF0aCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBnZW5lcmF0ZSBwYXRoZ3JhcGgKLSAgICBLTUJHcmFwaCBwYXRoRyhwYXRoRWRnZXMuYmVnaW4oKSwgcGF0aEVkZ2VzLmVuZCgpLCBwYXRoV2VpZ2h0cy5iZWdpbigpLCB0ZXJtaW5hbENudCk7Ci0gICAgLy8gc3RkOjp2ZWN0b3I8Ym9vc3Q6OmdyYXBoX3RyYWl0czxLTUJHcmFwaD46OnZlcnRleF9kZXNjcmlwdG9yPiBwYXRoUChudW1fdmVydGljZXMocGF0aEcpKTsKLSAgICAvLyBzdGQ6OnZlY3Rvcjxkb3VibGU+IHBhdGhEKG51bV92ZXJ0aWNlcyhwYXRoRykpOwotICAgIC8vIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPCBib29zdDo6Z3JhcGhfdHJhaXRzPCBLTUJHcmFwaCA+Ojp2ZXJ0ZXhfZGVzY3JpcHRvciA+ID4gcGF0aFBhdGhzOwotICAgIHN0ZDo6dmVjdG9yPGJvb3N0OjpncmFwaF90cmFpdHMgPCBLTUJHcmFwaCA+OjplZGdlX2Rlc2NyaXB0b3I+IHNwYW5uaW5nX3RyZWU7Ci0gICAgc3RkOjpzZXQ8c3RkOjpwYWlyPGJvb3N0OjpncmFwaF90cmFpdHM8S01CR3JhcGg+Ojp2ZXJ0ZXhfZGVzY3JpcHRvciwgYm9vc3Q6OmdyYXBoX3RyYWl0czxLTUJHcmFwaD46OnZlcnRleF9kZXNjcmlwdG9yID4gPiBtc3RFZGdlU2V0OwotICAgIC8vIGdlbmVyYXRlIG1zdCBmcm9tIHBhdGhHcmFwaAotICAgIGJvb3N0OjprcnVza2FsX21pbmltdW1fc3Bhbm5pbmdfdHJlZShwYXRoRywgYmFja19pbnNlcnRlcihzcGFubmluZ190cmVlKSk7Ci0gICAgZm9yIChhdXRvIGVpID0gc3Bhbm5pbmdfdHJlZS5iZWdpbigpOyBlaSAhPSBzcGFubmluZ190cmVlLmVuZCgpOyArK2VpKSB7Ci0gICAgICBhdXRvIHUgPSBzb3VyY2UoKmVpLCBwYXRoRyk7Ci0gICAgICBhdXRvIHYgPSB0YXJnZXQoKmVpLCBwYXRoRyk7Ci0gICAgICBzdGQ6OnBhaXI8Ym9vc3Q6OmdyYXBoX3RyYWl0czxLTUJHcmFwaD46OnZlcnRleF9kZXNjcmlwdG9yLCBib29zdDo6Z3JhcGhfdHJhaXRzPEtNQkdyYXBoPjo6dmVydGV4X2Rlc2NyaXB0b3IgPiAgdGVtcEVkZ2UgPSBzdGQ6Om1ha2VfcGFpcihzdGQ6Om1pbih1LCB2KSwgc3RkOjptYXgodSwgdikpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KXBhdGhzW2dFZGdlMlBhdGhJZHhNYXBbdGVtcEVkZ2VdXS5zaXplKCkgLSAxOyBpKyspIHsKLSAgICAgICAgYXV0byB1ID0gcGF0aHNbZ0VkZ2UyUGF0aElkeE1hcFt0ZW1wRWRnZV1dW2ldOwotICAgICAgICBhdXRvIHYgPSBwYXRoc1tnRWRnZTJQYXRoSWR4TWFwW3RlbXBFZGdlXV1baSArIDFdOwotICAgICAgICBtc3RFZGdlU2V0Lmluc2VydChzdGQ6Om1ha2VfcGFpcihzdGQ6Om1pbih1LCB2KSwgc3RkOjptYXgodSwgdikpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gSXRlcmF0ZSBhbGwgZWRnZXMgaW4gdGhlIG9yaWdpbmFsIGdyYXBoLCBzZXQgd2VpZ2h0IHRvIGluZmluaXR5IGlmIAotICAgIC8vIGl0IGlzIG5vdCBpbiBtc2dFZGdlU2V0Ci0gICAgYXV0byBlcyA9IGJvb3N0OjplZGdlcyhnKTsKLSAgICBmb3IgKGF1dG8gZWl0ID0gZXMuZmlyc3Q7IGVpdCAhPSBlcy5zZWNvbmQ7IGVpdCsrKSB7Ci0gICAgICBhdXRvIHUgPSBzb3VyY2UoKmVpdCwgZyk7Ci0gICAgICBhdXRvIHYgPSB0YXJnZXQoKmVpdCwgZyk7Ci0gICAgICBhdXRvIHRlbXBFZGdlID0gc3RkOjptYWtlX3BhaXIoc3RkOjptaW4odSx2KSwgc3RkOjptYXgodSx2KSk7Ci0gICAgICBpZiAobXN0RWRnZVNldC5maW5kKHRlbXBFZGdlKSA9PSBtc3RFZGdlU2V0LmVuZCgpKSB7Ci0gICAgICAgIHdlaWdodG1hcFsqZWl0XSA9IExBUkdFRE9VQkxFOwotICAgICAgfQotICAgIH0KLSAgICAvLyBnZW5lcmF0ZSBtc3QgaW4gdXBkYXRlZCBncmFwaAotICAgIC8vYm9vc3Q6OmdyYXBoX3RyYWl0czxLTUJHcmFwaD46OnZlcnRleF9kZXNjcmlwdG9yIGZpcnN0VGVybVZlcnRleDsKLSAgICAvL2Jvb3N0OjpncmFwaF90cmFpdHM8S01CR3JhcGg+Ojp2ZXJ0ZXhfZGVzY3JpcHRvciBmaXJzdFZlcnRleDsKLQotICAgIC8vYm9vc3Q6OmdyYXBoX3RyYWl0cyA8IEtNQkdyYXBoID46OnZlcnRleF9pdGVyYXRvciB2aSwgdmVuZDsKLSAgICAvL2ZvciAoYm9vc3Q6OnRpZSh2aSwgdmVuZCkgPSBib29zdDo6dmVydGljZXMoZyk7IHZpICE9IHZlbmQ7ICsrdmkpIHsKLSAgICAvLyAgaWYgKHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8ZnJTdGVpbmVyPihnWyp2aV0ub2JqUHRyKSkgewotICAgIC8vICAgIGNvbnRpbnVlOwotICAgIC8vICB9Ci0gICAgLy8gIGZpcnN0VGVybVZlcnRleCA9ICp2aTsKLSAgICAvLyAgYnJlYWs7Ci0gICAgLy99Ci0gICAgLy9mb3IgKGJvb3N0Ojp0aWUodmksIHZlbmQpID0gYm9vc3Q6OnZlcnRpY2VzKGcpOyB2aSAhPSB2ZW5kOyArK3ZpKSB7Ci0gICAgLy8gIGZpcnN0VmVydGV4ID0gKnZpOwotICAgIC8vICBicmVhazsKLSAgICAvL30KLQotICAgIC8vIHN0ZDo6dmVjdG9yPGJvb3N0OjpncmFwaF90cmFpdHMgPCBLTUJHcmFwaCA+Ojp2ZXJ0ZXhfZGVzY3JpcHRvcj4gcmVzdWx0UHJlZChudW1fdmVydGljZXMoZykpOwotICAgIHN0ZDo6dmVjdG9yPGJvb3N0OjpncmFwaF90cmFpdHMgPCBLTUJHcmFwaCA+OjplZGdlX2Rlc2NyaXB0b3I+IHJlc3VsdF9zcGFubmluZ190cmVlOwotICAgIGJvb3N0OjprcnVza2FsX21pbmltdW1fc3Bhbm5pbmdfdHJlZShnLCBiYWNrX2luc2VydGVyKHJlc3VsdF9zcGFubmluZ190cmVlKSk7Ci0gICAgLy8gc3RkOjpjb3V0IDw8ICJyZXN1bHRcbiI7Ci0gICAgZm9yIChhdXRvIGVpID0gcmVzdWx0X3NwYW5uaW5nX3RyZWUuYmVnaW4oKTsgZWkgIT0gcmVzdWx0X3NwYW5uaW5nX3RyZWUuZW5kKCk7ICsrZWkpIHsKLSAgICAgIGF1dG8gdSA9IHNvdXJjZSgqZWksIGcpOwotICAgICAgYXV0byB2ID0gdGFyZ2V0KCplaSwgZyk7Ci0gICAgICAvLyBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpcGF0aHNbZ0VkZ2UyUGF0aElkeE1hcFt0ZW1wRWRnZV1dLnNpemUoKSAtIDE7IGkrKykgewotICAgICAgICAvLyBhdXRvIHUgPSBwYXRoc1tnRWRnZTJQYXRoSWR4TWFwW3RlbXBFZGdlXV1baV07Ci0gICAgICAgIC8vIGF1dG8gdiA9IHBhdGhzW2dFZGdlMlBhdGhJZHhNYXBbdGVtcEVkZ2VdXVtpICsgMV07Ci0gICAgICAgIC8vIG1zdEVkZ2VTZXQuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHN0ZDo6bWluKHUsIHYpLCBzdGQ6Om1heCh1LCB2KSkpOwotICAgICAgLy8gc3RkOjpjb3V0IDw8ICIgICIgPDwgdSA8PCAiLCAiIDw8IHYgPDwgIlxuIjsKLSAgICAgIC8vIH0KLSAgICAgIGF1dG8gZWRnZSA9IGJvb3N0OjplZGdlKHUsIHYsIGcpLmZpcnN0OwotICAgICAgaWYgKHdlaWdodG1hcFtlZGdlXSAhPSBMQVJHRURPVUJMRSkgewotICAgICAgICBhdXRvIG5ldEdfdSA9IChnW3VdLm9ialB0ciktPmdldFZlcnRleERlc2NyaXB0b3IoKTsKLSAgICAgICAgYXV0byBuZXRHX3YgPSAoZ1t2XS5vYmpQdHIpLT5nZXRWZXJ0ZXhEZXNjcmlwdG9yKCk7Ci0gICAgICAgIGlmIChib29zdDo6ZWRnZShuZXRHX3UsIG5ldEdfdiwgbmV0Rykuc2Vjb25kID09IHRydWUpIHsKLSAgICAgICAgICBlZGdlX2Rlc2NyaXB0b3JfdCByb3V0ZUVkZ2UgPSAoYm9vc3Q6OmVkZ2UobmV0R191LCBuZXRHX3YsIG5ldEcpLmZpcnN0KTsKLSAgICAgICAgICByb3V0ZXMuaW5zZXJ0KG5ldEdbcm91dGVFZGdlXS5vYmpQdHIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0KLSAgfQotCi0gIGRvdWJsZSBnZXRLTUJFZGdlV2VpZ2h0KGZyQmxvY2tPYmplY3QqIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBmckJsb2NrT2JqZWN0KiBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxmckNNYXA+ICZjTWFwKSB7Ci0gICAgLy9yZXR1cm4gMTsKLQotICAgIGZyQ29vcmQgR0NFTExHUklEWCA9IGdldEdDRUxMR1JJRFgoKTsKLSAgICBmckNvb3JkIEdDRUxMR1JJRFkgPSBnZXRHQ0VMTEdSSURZKCk7Ci0gICAgLy9mckNvb3JkIEdDRUxMT0ZGU0VUWCA9IGdldEdDRUxMT0ZGU0VUWCgpOwotICAgIC8vZnJDb29yZCBHQ0VMTE9GRlNFVFkgPSBnZXRHQ0VMTE9GRlNFVFkoKTsKLSAgICBkb3VibGUgd2VpZ2h0ID0gMC4wOwotICAgIGRvdWJsZSBMQVJHRVdFSUdIVCA9IDk5OwotICAgIGRvdWJsZSBTTUFMTFdFSUdIVCA9IDE7Ci0gICAgZG91YmxlIFZJQVdFSUdIVCA9IDEwOwotICAgIGZyTGF5ZXJOdW0gc3RhcnRMYXllck51bSwgZW5kTGF5ZXJOdW07Ci0gICAgLy8gU2luY2UgZXZlcnkgdGVybWluYWwgaGFzIHRvIGJlIGNvbm5lY3RlZCwgc28gc2V0IGRpc3RhbmNlIAotICAgIC8vIGZyb20gZWRnZSB0byB0aGVtIHRvIHplcm8gYXNzdW1pbmcgZWFjaCB0ZXJtIGlzIGNvbm5lY3RlZAotICAgIC8vIHRvIHRoZSBzdGVpbmVyIG9mIHRoZSBHQ2VsbCB0aGF0IHRoZSB0ZXJtaW5hbCBiZWxvbmdzIHRvCi0gICAgLy8gcC5zLiwgcG90ZW50aWFsbHkgYSBwaW4gY2FuIGhhdmUgYWNjZXNzIHBvaW50IG9uIGRpZmZlcmVudCAKLSAgICAvLyBsYXllcnMsIHByZWZlciBhY2Nlc3MgcG9pbnQgb24gaGlnaGVyIGxheWVyIHRoYW4gbG93ZXIgbGF5ZXIKLSAgICBpZiAoc3RhcnQtPnR5cGVJZCgpID09IGZyY0luc3RUZXJtIHx8Ci0gICAgICAgIHN0YXJ0LT50eXBlSWQoKSA9PSBmcmNUZXJtIHx8IAotICAgICAgICBlbmQtPnR5cGVJZCgpID09IGZyY0luc3RUZXJtIHx8IAotICAgICAgICBlbmQtPnR5cGVJZCgpID09IGZyY1Rlcm0pIHsKLSAgICAgIHdlaWdodCA9IFNNQUxMV0VJR0hUOwotICAgICAgcmV0dXJuIHdlaWdodDsKLSAgICB9Ci0KLSAgICAvLyBmb3Igc3RlaW5lciB0byBzdGVpbmVyLCBnZXQgdGhlIHN1bW1hdGlvbiBvZiB0cmFjayB1dGlsaXphdGlvbiAKLSAgICAvLyBhbG9uZyB0aGUgZGlyZWN0IGVkZ2UKLSAgICBmclBvaW50IHN0YXJ0UG9pbnQsIGVuZFBvaW50OwotICAgIGlmIChzdGFydC0+dHlwZUlkKCkgPT0gZnJjU3RlaW5lcikgewotICAgICAgc3RhdGljX2Nhc3Q8ZnJTdGVpbmVyKj4oc3RhcnQpLT5nZXRQb2ludChzdGFydFBvaW50KTsKLSAgICAgIHN0YXJ0TGF5ZXJOdW0gPSBzdGF0aWNfY2FzdDxmclN0ZWluZXIqPihzdGFydCktPmdldExheWVyTnVtKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIGZyQmxvY2tPYmplY3QgaXMgbm9uZSBvZiBUZXJtLCBJbnN0VGVybSBvciBTdGVpbmVyCi0gICAgICByZXR1cm4gTEFSR0VXRUlHSFQ7Ci0gICAgfQotICAgIGlmIChlbmQtPnR5cGVJZCgpID09IGZyY1N0ZWluZXIpIHsKLSAgICAgIHN0YXRpY19jYXN0PGZyU3RlaW5lcio+KGVuZCktPmdldFBvaW50KGVuZFBvaW50KTsKLSAgICAgIGVuZExheWVyTnVtID0gc3RhdGljX2Nhc3Q8ZnJTdGVpbmVyKj4oZW5kKS0+Z2V0TGF5ZXJOdW0oKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIExBUkdFV0VJR0hUOwotICAgIH0KLQotICAgIGlmIChzdGFydFBvaW50LngoKSAhPSBlbmRQb2ludC54KCkgJiYgc3RhcnRQb2ludC55KCkgIT0gZW5kUG9pbnQueSgpKSB7Ci0gICAgICByZXR1cm4gTEFSR0VXRUlHSFQ7Ci0gICAgfQotCi0gICAgLy8gc3RhcnQgc3VtIHVwIHRoZSBjb25nZXN0aW9uIGFsb25nIHRoZSBsaW5lOwotICAgIC8vIHZpYSBndWlkZQotICAgIGlmIChzdGFydFBvaW50LngoKSA9PSBlbmRQb2ludC54KCkgJiYgc3RhcnRQb2ludC55KCkgPT0gZW5kUG9pbnQueSgpKSB7Ci0gICAgICBpZiAoc3RhcnRMYXllck51bSA9PSBlbmRMYXllck51bSkgewotICAgICAgICByZXR1cm4gU01BTExXRUlHSFQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gVklBV0VJR0hUOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBhc3N1bWluZyB0aGF0IGJvdGggc3RhcnRQb2ludCBhbmQgZW5kUG9pbnQgYXJlIGNlbnRlciBvZiBnY2VsbAotICAgICAgaWYgKHN0YXJ0UG9pbnQueCgpID09IGVuZFBvaW50LngoKSkgewotICAgICAgICBhdXRvIHN0YXJ0WSA9IHN0ZDo6bWluKHN0YXJ0UG9pbnQueSgpLCBlbmRQb2ludC55KCkpOwotICAgICAgICBhdXRvIGVuZFkgPSBzdGQ6Om1heChzdGFydFBvaW50LnkoKSwgZW5kUG9pbnQueSgpKTsKLSAgICAgICAgZm9yIChhdXRvIHlDb29yZCA9IHN0YXJ0WTsgeUNvb3JkIDw9IGVuZFk7IHlDb29yZCArPSBHQ0VMTEdSSURZKSB7Ci0gICAgICAgICAgd2VpZ2h0ICs9IGdldEdDZWxsQ29uZ2VzdGlvblNjb3JlKGZyUG9pbnQoc3RhcnRQb2ludC54KCksIHlDb29yZCksIHN0YXJ0TGF5ZXJOdW0sIGNNYXApOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKHN0YXJ0UG9pbnQueSgpID09IGVuZFBvaW50LnkoKSkgewotICAgICAgICBhdXRvIHN0YXJ0WCA9IHN0ZDo6bWluKHN0YXJ0UG9pbnQueCgpLCBlbmRQb2ludC54KCkpOwotICAgICAgICBhdXRvIGVuZFggPSBzdGQ6Om1heChzdGFydFBvaW50LngoKSwgZW5kUG9pbnQueCgpKTsKLSAgICAgICAgZm9yIChhdXRvIHhDb29yZCA9IHN0YXJ0WDsgeENvb3JkIDw9IGVuZFg7IHhDb29yZCArPSBHQ0VMTEdSSURYKSB7Ci0gICAgICAgICAgd2VpZ2h0ICs9IGdldEdDZWxsQ29uZ2VzdGlvblNjb3JlKGZyUG9pbnQoeENvb3JkLCBzdGFydFBvaW50LnkoKSksIHN0YXJ0TGF5ZXJOdW0sIGNNYXApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHdlaWdodDsKLQotCi0gICAgLy8gcmV0dXJuIDEuMDsKLSAgfQotCi0gIGRvdWJsZSBnZXRHQ2VsbENvbmdlc3Rpb25TY29yZShmclBvaW50IHBvaW50LCBmckxheWVyTnVtICZsYXllck51bSwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGZyQ01hcD4gJmNNYXApIHsKLSAgICBkb3VibGUgY29uZ2VzdGlvblNjb3JlID0gMC4wOwotCi0gICAgZnJDb29yZCBHQ0VMTEdSSURYID0gZ2V0R0NFTExHUklEWCgpOwotICAgIGZyQ29vcmQgR0NFTExHUklEWSA9IGdldEdDRUxMR1JJRFkoKTsKLSAgICBmckNvb3JkIEdDRUxMT0ZGU0VUWCA9IGdldEdDRUxMT0ZGU0VUWCgpOwotICAgIGZyQ29vcmQgR0NFTExPRkZTRVRZID0gZ2V0R0NFTExPRkZTRVRZKCk7Ci0KLSAgICBpbnQgeEluZGV4ID0gKHBvaW50LngoKSAtIEdDRUxMT0ZGU0VUWCkgLyBHQ0VMTEdSSURYOwotICAgIHhJbmRleCA9ICh4SW5kZXggPiAoaW50KWNNYXAtPmdldE51bVgoKSkgPyBjTWFwLT5nZXROdW1YKCkgOiB4SW5kZXg7Ci0gICAgaW50IHlJbmRleCA9IChwb2ludC55KCkgLSBHQ0VMTE9GRlNFVFkpIC8gR0NFTExHUklEWTsKLSAgICB5SW5kZXggPSAoeUluZGV4ID4gKGludCljTWFwLT5nZXROdW1ZKCkpID8gY01hcC0+Z2V0TnVtWSgpIDogeUluZGV4OwotCi0gICAgYXV0byBzdXBwbHkgPSBjTWFwLT5nZXRTdXBwbHkoeEluZGV4LCB5SW5kZXgsIGxheWVyTnVtKTsKLSAgICBhdXRvIGVkZ2UxRGVtYW5kID0gY01hcC0+Z2V0RWRnZTFEZW1hbmQoeEluZGV4LCB5SW5kZXgsIGxheWVyTnVtKTsKLSAgICBhdXRvIGVkZ2UyRGVtYW5kID0gY01hcC0+Z2V0RWRnZTJEZW1hbmQoeEluZGV4LCB5SW5kZXgsIGxheWVyTnVtKTsKLSAgICBhdXRvIGxvY2FsRGVtYW5kID0gY01hcC0+Z2V0TG9jYWxEZW1hbmQoeEluZGV4LCB5SW5kZXgsIGxheWVyTnVtKTsKLSAgICBhdXRvIHRocm91Z2hEZW1hbmQgPSBjTWFwLT5nZXRUaHJvdWdoRGVtYW5kKHhJbmRleCwgeUluZGV4LCBsYXllck51bSk7Ci0KLSAgICBjb25nZXN0aW9uU2NvcmUgPSAxLjAgKiAodGhyb3VnaERlbWFuZCArIChlZGdlMURlbWFuZCArIGVkZ2UyRGVtYW5kKSAvIDIuMCArIGxvY2FsRGVtYW5kKSAvIHN1cHBseTsKLQotICAgIHJldHVybiBjb25nZXN0aW9uU2NvcmU7Ci0KLQotICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvaW8vZnJHdWlkZVByZXAuaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2lvL2ZyR3VpZGVQcmVwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNDEyYjAuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvaW8vZnJHdWlkZVByZXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIF9GUl9HVUlERV9QUkVQX0hfCi0jZGVmaW5lIF9GUl9HVUlERV9QUkVQX0hfCi0KLSNpbmNsdWRlICJmckJhc2VUeXBlcy5oIgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHR1cGxlPgotI2luY2x1ZGUgImRiL3RlY2gvZnJMYXllci5oIgotI2luY2x1ZGUgImRiL29iai9mckJsb2NrLmgiCi0vLyNpbmNsdWRlICJmck1hY3JvLmgiCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSA8Ym9vc3QvaWNsL2ludGVydmFsX3NldC5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvaWNsL2ludGVydmFsX21hcC5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvZ3JhcGgvY29ubmVjdGVkX2NvbXBvbmVudHMuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3BlbmRpbmcvZGlzam9pbnRfc2V0cy5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvaWNsL3NwbGl0X2ludGVydmFsX21hcC5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvZ3JhcGgvYWRqYWNlbmN5X2xpc3QuaHBwPgotI2luY2x1ZGUgPGJvb3N0L2dyYXBoL2tydXNrYWxfbWluX3NwYW5uaW5nX3RyZWUuaHBwPgotI2luY2x1ZGUgPGJvb3N0L2dyYXBoL2RpamtzdHJhX3Nob3J0ZXN0X3BhdGhzLmhwcD4KLSNpbmNsdWRlIDxib29zdC9ncmFwaC9wcmltX21pbmltdW1fc3Bhbm5pbmdfdHJlZS5ocHA+Ci0KLQotbmFtZXNwYWNlIGZyIHsKLQotCi0gIGZyQ29vcmQgZ2V0R0NFTExHUklEWCgpOwotICBmckNvb3JkIGdldEdDRUxMR1JJRFkoKTsKLSAgZnJDb29yZCBnZXRHQ0VMTE9GRlNFVFgoKTsKLSAgZnJDb29yZCBnZXRHQ0VMTE9GRlNFVFkoKTsKLSAgCi0gIHZvaWQgc2V0R0NFTExHUklEWChmckNvb3JkICYpOwotICB2b2lkIHNldEdDRUxMR1JJRFkoZnJDb29yZCAmKTsKLSAgdm9pZCBzZXRHQ0VMTE9GRlNFVFgoZnJDb29yZCAmKTsKLSAgdm9pZCBzZXRHQ0VMTE9GRlNFVFkoZnJDb29yZCAmKTsKLQotICBzdHJ1Y3QgZ3VpZGVTdGVpbmVyQ21wIHsKLSAgICBib29sIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjpwYWlyPHN0ZDo6cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiwgc3RkOjpwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+ID4gJmxocywKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpwYWlyPHN0ZDo6cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiwgc3RkOjpwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+ID4gJnJocykgewotICAgICAgaWYgKGxocy5maXJzdCA9PSByaHMuZmlyc3QpIHsKLSAgICAgICAgcmV0dXJuIChsaHMuc2Vjb25kID4gcmhzLnNlY29uZCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gKGxocy5maXJzdCA+IHJocy5maXJzdCk7Ci0gICAgICB9Ci0gICAgfQotICB9OwotCi0gIHZvaWQgZ2V0R0NlbGxQYXJhbShzdGQ6Om1hcDxzdGQ6OnN0cmluZywgZnI6OmZyQ29sbGVjdGlvbjxmcjo6ZnJSZWN0PiA+ICZyYXdHdWlkZSwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGZyOjpmckxheWVyPiA+ICZ2bGF5ZXJzKTsKLSAgdm9pZCBnZXRHQ2VsbFNpemVQYXJhbShzdGQ6Om1hcDxzdGQ6OnN0cmluZywgZnI6OmZyQ29sbGVjdGlvbjxmcjo6ZnJSZWN0PiA+ICZyYXdHdWlkZSwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGZyOjpmckxheWVyPiA+ICZ2bGF5ZXJzKTsKLSAgdm9pZCBnZXRHQ2VsbE9mZnNldFBhcmFtKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBmcjo6ZnJDb2xsZWN0aW9uPGZyOjpmclJlY3Q+ID4gJnJhd0d1aWRlLCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8ZnI6OmZyTGF5ZXI+ID4gJnZsYXllcnMpOwotICB2b2lkIHByaW50R0NlbGxJbmZvKCk7Ci0KLSAgdm9pZCB1cGRhdGVYZm9ybShmclRyYW5zZm9ybSAmeGZvcm0sIGZyUG9pbnQgJnNpemUpOwotICBmckJveCBwb2ludDJHQ2VsbEJveChmclBvaW50ICZwb2ludEluKTsKLSAgdm9pZCBnZW5HQ2VsbDJQaW5NYXAoc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c2hhcmVkX3B0cjxmcjo6ZnJCbG9jaz4gPiAmbWFjcm9zLAotICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzaGFyZWRfcHRyPGZyOjpmck5ldD4gPiAmbmV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6bWFwPGZyUG9pbnQsIHN0ZDo6c2V0PHN0ZDo6cGFpcjxmckJsb2NrT2JqZWN0KiwgZnJMYXllck51bT4gPiA+ID4gJmdDZWxsMlBpbk1hcCk7Ci0gIC8vIHVwZGF0ZSBHQ2VsbDJQaW5NYXAgYmFzZWQgb24gd2hldGhlciB0aGUgdGVybSBpcyBpbnRlcnNlY3Rpbmcgd2l0aCBhbnkgR0NlbGwKLSAgdm9pZCB1cGRhdGVHQ2VsbDJQaW5NYXAoZnJCbG9ja09iamVjdCogYmxvY2tPYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZyVGVybSogdGVybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmV0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6bWFwPGZyUG9pbnQsIHN0ZDo6c2V0PHN0ZDo6cGFpcjxmckJsb2NrT2JqZWN0KiwgZnJMYXllck51bT4gPiA+ID4gJmdDZWxsMlBpbk1hcCk7Ci0gIC8vIHZvaWQgZ2V0U3RhbmRhcmRHdWlkZShmckNvbGxlY3Rpb248ZnJSZWN0PiAmZ3VpZGVzSW4sCi0gIC8vICAgICAgICAgICAgICAgICAgICAgICBmckNvbGxlY3Rpb248ZnJSZWN0PiAmZ3VpZGVzT3V0LAotICAvLyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGZyOjpmckxheWVyPiA+IGxheWVycyk7Ci0gIHZvaWQgZ2V0U3RhbmRhcmRHdWlkZShzdGQ6Om1hcDxzdGQ6OnN0cmluZywgZnI6OmZyQ29sbGVjdGlvbjxmcjo6ZnJSZWN0PiA+ICZ0bXBHdWlkZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8ZnI6OmZyTGF5ZXI+ID4gJnZsYXllcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzaGFyZWRfcHRyPGZyOjpmck5ldD4gPiAmbmV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6Om1hcDxmclBvaW50LCBzdGQ6OnNldDxzdGQ6OnBhaXI8ZnJCbG9ja09iamVjdCosIGZyOjpmckxheWVyTnVtPiA+ID4gPiAmZ0NlbGwyUGluTWFwKTsKLSAgdm9pZCBnZXRTdGFuZGFyZEd1aWRlKGZyQ29sbGVjdGlvbjxmclJlY3Q+ICZndWlkZVJlY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGZyOjpmckxheWVyPiA+ICZ2bGF5ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGZyOjpmck5ldD4gJm5ldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGZyUG9pbnQsIHN0ZDo6c2V0PHN0ZDo6cGFpcjxmckJsb2NrT2JqZWN0KiwgZnI6OmZyTGF5ZXJOdW0+ID4gPiAmZ0NlbGwyUGluTWFwKTsKLSAgLy8gZnJDb2xsZWN0aW9uPHN0ZDo6c2V0PGludD4gPiBnZXRHdWlkZUNsdXN0ZXIoZnJDb2xsZWN0aW9uPGZyUmVjdD4gJmd1aWRlQm94ZXMpOwotICBmclBvaW50IGdldEdDZWxsQ2VudGVyKGZyUG9pbnQgcG9pbnRJbik7Ci0gIGZyQ29sbGVjdGlvbjxmckxheWVyTnVtPiBnZXRQaW5MYXllck51bShzdGQ6OnNoYXJlZF9wdHI8ZnJCbG9ja09iamVjdD4gJnRlcm1Jbik7Ci0gIAotICB2b2lkIGdldEdTZWdTdGVpbmVyKGJvb3N0U2VnbWVudCAmY3VyckdTZWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZyUHJlZlJvdXRpbmdEaXIgJmN1cnJEaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGZyQ29vcmQsIGJvb3N0OjppY2w6OmludGVydmFsX3NldDxmckNvb3JkPiA+ICZuZWlnaGJvckdDZWxsMlJvd01hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8ZnJQb2ludD4gJnN0ZWluZXJzKTsKLSAgdm9pZCBnZXRJbnRlckxheWVyU3RlaW5lckVkZ2UoZnJQb2ludCBzdGVpbmVyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJMYXllck51bSBsb3dlckxheWVyTnVtLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJMYXllck51bSB1cHBlckxheWVyTnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxzdGQ6OnBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4gPiAmc3RlaW5lclNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RkOjpzZXQ8c3RkOjpwYWlyPHN0ZDo6cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiwgc3RkOjpwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+ID4sIGd1aWRlU3RlaW5lckNtcD4gJnN0ZWluZXJFZGdlU2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8c3RkOjpwYWlyPHN0ZDo6cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiwgc3RkOjpwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+ID4gPiAmc3RlaW5lckVkZ2VTZXQpOwotICAKLSAgdm9pZCBjaGVja0dSQ29ubmVjdGl2aXR5KHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8ZnI6OmZyTmV0PiA+ICZuZXRzKTsKLQotICB2b2lkIGFwcGVuZFRvdWNoaW5nR3VpZGVJbnR2KHN0ZDo6bWFwPGZyTGF5ZXJOdW0sIHN0ZDo6bWFwPGZyQ29vcmQsIGJvb3N0OjppY2w6OmludGVydmFsX3NldDxmckNvb3JkPiA+ID4gJmxheWVyR0NlbGwySW50dlNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8ZnI6OmZyTGF5ZXI+ID4gJnZsYXllcnMpOwotICB2b2lkIGdldExvY2FsTmV0U3RhdHMoY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6bWFwPGZyUG9pbnQsIHN0ZDo6c2V0PHN0ZDo6cGFpcjxzdGQ6OnNoYXJlZF9wdHI8ZnJCbG9ja09iamVjdD4sIGZyTGF5ZXJOdW0+ID4gPiA+ICZnQ2VsbDJQaW5NYXApOwotICAKLSAgdm9pZCBLTUJUZXJtU3RlaW5lclRyZWUoZnJOZXQgJm5ldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGhfdCAmbmV0RywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGZyQ01hcD4gJmNNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c2hhcmVkX3B0cjxmckNvbm5GaWc+ID4gJnJvdXRlcyk7Ci0gIGRvdWJsZSBnZXRLTUJFZGdlV2VpZ2h0KGZyQmxvY2tPYmplY3QqIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBmckJsb2NrT2JqZWN0KiBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxmckNNYXA+ICZjTWFwKTsKLSAgZG91YmxlIGdldEdDZWxsQ29uZ2VzdGlvblNjb3JlKGZyUG9pbnQgcG9pbnQsIGZyTGF5ZXJOdW0gJmxheWVyTnVtLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8ZnJDTWFwPiAmY01hcCk7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvaW8vZnJQaW5QcmVwLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2lvL2ZyUGluUHJlcC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3Y2FmM2MuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvaW8vZnJQaW5QcmVwLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIwNTUgKzAsMCBAQAotLyogQXV0aG9yczogTHV0b25nIFdhbmcgYW5kIEJhbmdxaSBYdSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImdsb2JhbC5oIgotI2luY2x1ZGUgImlvL2ZyUGluUHJlcC5oIgotI2luY2x1ZGUgImRiL29iai9mck5ldC5oIgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgInRhL0ZsZXhUQS5oIgotI2luY2x1ZGUgPGJvb3N0L3BvbHlnb24vcG9seWdvbi5ocHA+Ci0jaW5jbHVkZSAiaW8vZnJTaGFwZVV0aWwuaCIKLSNpbmNsdWRlICJGbGV4QWNjZXNzUGF0dGVybi5oIgotI2luY2x1ZGUgPGl0ZXJhdG9yPgotI2luY2x1ZGUgPGNocm9ubz4KLSNpbmNsdWRlICJkcmMvZnJEUkMuaCIKLSNpbmNsdWRlICJpby9mckFQRy5oIgotCi11c2luZyBuYW1lc3BhY2UgYm9vc3Q6OnBvbHlnb246Om9wZXJhdG9yczsKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgZnI7Ci11c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm87Ci0KLXZvaWQgRmxleFBpblByZXA6OnJlcG9ydFBpbkxvYygpIHsKLSAgc3RkOjpjb3V0IDw8ICJQcmludGluZyBNYWNybyBQaW4gQmJveChzKS4uLlxuIjsKLSAgZm9yIChhdXRvICZpbnN0OiBkZXNpZ24tPmdldFRvcEJsb2NrKCktPmdldEluc3RzKCkpIHsKLSAgICBpZiAoaW5zdC0+Z2V0UmVmQmxvY2soKS0+Z2V0TWFjcm9DbGFzcygpICE9IE1hY3JvQ2xhc3NFbnVtOjpCTE9DSykgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIAotICAgIGZvciAoYXV0byAmdWluc3RUZXJtOiBpbnN0LT5nZXRJbnN0VGVybXMoKSkgewotICAgICAgZnJJbnN0VGVybSAqaW5zdFRlcm0gPSB1aW5zdFRlcm0uZ2V0KCk7Ci0gICAgICBhdXRvIGluc3RUZXJtVHlwZSA9IGluc3RUZXJtLT5nZXRUZXJtKCktPmdldFR5cGUoKTsKLSAgICAgIC8vaWYgKGluc3RUZXJtVHlwZSAhPSBmclRlcm1FbnVtOjpmcmNOb3JtYWxUZXJtICYmIGluc3RUZXJtVHlwZSAhPSBmclRlcm1FbnVtOjpmcmNDbG9ja1Rlcm0pIHsKLSAgICAgIC8vICBjb250aW51ZTsKLSAgICAgIC8vfQotICAgICAgc3RkOjpjb3V0IDw8ICJpbnN0TmFtZTogIiA8PCBpbnN0LT5nZXROYW1lKCkgPDwgIjsgIjsKLSAgICAgIHN0ZDo6Y291dCA8PCBpbnN0LT5nZXRSZWZCbG9jaygpLT5nZXROYW1lKCkgPDwgIi8iIDw8IGluc3RUZXJtLT5nZXRUZXJtKCktPmdldE5hbWUoKSA8PCAiOlxuIjsKLSAgICAgIHN0ZDo6Y291dCA8PCAiTG9jYXRpb25zKHMpOlxuIjsKLSAgICAgIGZyVHJhbnNmb3JtIHhmb3JtOwotICAgICAgZnJCb3ggbWJveDsKLSAgICAgIGluc3QtPmdldFRyYW5zZm9ybSh4Zm9ybSk7Ci0gICAgICBpbnN0LT5nZXRSZWZCbG9jaygpLT5nZXRCb3VuZGFyeUJCb3gobWJveCk7Ci0gICAgICBmclBvaW50IHNpemUobWJveC5yaWdodCgpLCBtYm94LnRvcCgpKTsKLSAgICAgIHhmb3JtLnVwZGF0ZVhmb3JtKHNpemUpOwotCi0gICAgICBmb3IgKGF1dG8gJnBpbjogaW5zdFRlcm0tPmdldFRlcm0oKS0+Z2V0UGlucygpKSB7Ci0gICAgICAgIGF1dG8gcGluUHRyID0gcGluLmdldCgpOwotICAgICAgICBtYXA8ZnJMYXllck51bSwgUG9seWdvblNldD4gbGF5ZXJOdW0yUFM7Ci0gICAgICAgIG1lcmdlUGluU2hhcGVzKHBpblB0ciwgeGZvcm0sIGxheWVyTnVtMlBTKTsKLSAgICAgICAgZm9yIChhdXRvIGxheWVySXQgPSBsYXllck51bTJQUy5iZWdpbigpOyBsYXllckl0ICE9IGxheWVyTnVtMlBTLmVuZCgpOyArK2xheWVySXQpIHsKLSAgICAgICAgICBhdXRvIGxheWVyTnVtID0gbGF5ZXJJdC0+Zmlyc3Q7Ci0gICAgICAgICAgYXV0byAmbGF5ZXJQUyA9IGxheWVySXQtPnNlY29uZDsKLSAgICAgICAgICBzdGQ6OnZlY3RvcjxSZWN0YW5nbGU+IG1heFJlY3RzOwotICAgICAgICAgIGdldF9tYXhfcmVjdGFuZ2xlcyhtYXhSZWN0cywgbGF5ZXJQUyk7Ci0gICAgICAgICAgZm9yIChhdXRvICZyZWN0OiBtYXhSZWN0cykgewotICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICIgICgiIDw8IHhsKHJlY3QpIDw8ICIsICIgPDwgeWwocmVjdCkgPDwgIikgLSAoIgotICAgICAgICAgICAgICAgICAgICAgIDw8IHhoKHJlY3QpIDw8ICIsICIgPDwgeWgocmVjdCkgPDwgIikgIiAKLSAgICAgICAgICAgICAgICAgICAgICA8PCBkZXNpZ24tPmdldFRlY2goKS0+Z2V0TGF5ZXIobGF5ZXJOdW0pLT5nZXROYW1lKCkgPDwgIlxuIjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBGbGV4UGluUHJlcDo6aW5pdCgpIHsKLSAgZm9yIChhdXRvIGxheWVyTnVtID0gZGVzaWduLT5nZXRUZWNoKCktPmdldEJvdHRvbUxheWVyTnVtKCk7IGxheWVyTnVtIDw9IGRlc2lnbi0+Z2V0VGVjaCgpLT5nZXRUb3BMYXllck51bSgpOyArK2xheWVyTnVtKSB7Ci0gICAgZm9yIChhdXRvICZ2aWFEZWY6IGRlc2lnbi0+Z2V0VGVjaCgpLT5nZXRMYXllcihsYXllck51bSktPmdldFZpYURlZnMoKSkgewotICAgICAgaW50IGN1dE51bSA9IGludCh2aWFEZWYtPmdldEN1dEZpZ3MoKS5zaXplKCkpOwotICAgICAgdmlhUmF3UHJpb3JpdHlUdXBsZSBwcmlvcml0eTsKLSAgICAgIGdldFZpYVJhd1ByaW9yaXR5KHZpYURlZiwgcHJpb3JpdHkpOwotICAgICAgbGF5ZXJOdW0yVmlhRGVmc1tsYXllck51bV1bY3V0TnVtXVtwcmlvcml0eV0gPSB2aWFEZWY7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgRmxleFBpblByZXA6OmdldFZpYVJhd1ByaW9yaXR5KGZyVmlhRGVmKiB2aWFEZWYsIHZpYVJhd1ByaW9yaXR5VHVwbGUgJnByaW9yaXR5KSB7Ci0gIGJvb2wgaXNOb3REZWZhdWx0VmlhID0gISh2aWFEZWYtPmdldERlZmF1bHQoKSk7Ci0gIGJvb2wgaXNOb3RVcHBlckFsaWduID0gZmFsc2U7Ci0gIC8vIGJvb2wgaXNOb3RMb3dlckFsaWduID0gZmFsc2U7Ci0gIFBvbHlnb25TZXQgdmlhTGF5ZXJQUzE7Ci0KLSAgZm9yIChhdXRvICZmaWc6IHZpYURlZi0+Z2V0TGF5ZXIxRmlncygpKSB7Ci0gICAgZnJCb3ggYmJveDsKLSAgICBmaWctPmdldEJCb3goYmJveCk7Ci0gICAgUmVjdGFuZ2xlIGJib3hSZWN0KGJib3gubGVmdCgpLCBiYm94LmJvdHRvbSgpLCBiYm94LnJpZ2h0KCksIGJib3gudG9wKCkpOwotICAgIHZpYUxheWVyUFMxICs9IGJib3hSZWN0OwotICB9Ci0gIC8vIFJlY3RhbmdsZSBsYXllcjFSZWN0OwotICAvLyBleHRlbnRzKGxheWVyMVJlY3QsIHZpYUxheWVyUFMxKTsKLSAgLy8gYm9vbCBpc0xheWVyMUhvcnogPSAoeGgobGF5ZXIxUmVjdCkgLSB4bChsYXllcjFSZWN0KSkgPiAoeWgobGF5ZXIxUmVjdCkgLSB5bChsYXllcjFSZWN0KSk7Ci0gIC8vIGlzTm90TG93ZXJBbGlnbiA9IChpc0xheWVyMUhvcnogIT0gKGdldFRlY2goKS0+Z2V0TGF5ZXIodmlhRGVmLT5nZXRMYXllcjFOdW0oKSktPmdldERpcigpID09IGZyY0hvcnpQcmVmUm91dGluZ0RpcikpOwotCi0gIFBvbHlnb25TZXQgdmlhTGF5ZXJQUzI7Ci0gIGZvciAoYXV0byAmZmlnOiB2aWFEZWYtPmdldExheWVyMkZpZ3MoKSkgewotICAgIGZyQm94IGJib3g7Ci0gICAgZmlnLT5nZXRCQm94KGJib3gpOwotICAgIFJlY3RhbmdsZSBiYm94UmVjdChiYm94LmxlZnQoKSwgYmJveC5ib3R0b20oKSwgYmJveC5yaWdodCgpLCBiYm94LnRvcCgpKTsKLSAgICB2aWFMYXllclBTMiArPSBiYm94UmVjdDsKLSAgfQotICBSZWN0YW5nbGUgbGF5ZXIyUmVjdDsKLSAgZXh0ZW50cyhsYXllcjJSZWN0LCB2aWFMYXllclBTMik7Ci0gIGJvb2wgaXNMYXllcjJIb3J6ID0gKHhoKGxheWVyMlJlY3QpIC0geGwobGF5ZXIyUmVjdCkpID4gKHloKGxheWVyMlJlY3QpIC0geWwobGF5ZXIyUmVjdCkpOwotICBpc05vdFVwcGVyQWxpZ24gPSAoaXNMYXllcjJIb3J6ICE9IChnZXRUZWNoKCktPmdldExheWVyKHZpYURlZi0+Z2V0TGF5ZXIyTnVtKCkpLT5nZXREaXIoKSA9PSBmcmNIb3J6UHJlZlJvdXRpbmdEaXIpKTsKLQotICBmckNvb3JkIGxheWVyMUFyZWEgPSBhcmVhKHZpYUxheWVyUFMxKTsKLSAgZnJDb29yZCBsYXllcjJBcmVhID0gYXJlYSh2aWFMYXllclBTMik7Ci0KLSAgcHJpb3JpdHkgPSBzdGQ6Om1ha2VfdHVwbGUoaXNOb3REZWZhdWx0VmlhLCBpc05vdFVwcGVyQWxpZ24sIGxheWVyMkFyZWEsIGxheWVyMUFyZWEpOwotfQotCi1pbnQgRmxleFBpblByZXA6Om1haW4oKSB7Ci0gIGlmIChWRVJCT1NFID4gMCkgewotICAgIGNvdXQgPDxlbmRsIDw8InN0YXJ0IHBpbiBwcmVwIC4uLiIgPDxlbmRsOwotICB9Ci0gIC8vIGJvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjp0aW1lX3BvaW50IHQxID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKLSAgcGluUHJlcCgpOyAgLy8gTWF6ZSByZWx5IG9uIHRoaXMKLSAgaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjp0aW1lX3BvaW50IHQyID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKLSAgZHVyYXRpb248ZG91YmxlPiB0aW1lX3NwYW4gPSBkdXJhdGlvbl9jYXN0PGR1cmF0aW9uPGRvdWJsZT4+KHQyIC0gdDEpOwotICBpZiAoVkVSQk9TRSA+IDApIHsKLSAgICBjb3V0IDw8ZW5kbCA8PCJQaW5QcmVwIHJ1bnRpbWUgdGFrZW4gKGhydCk6ICIgPDwgdGltZV9zcGFuLmNvdW50KCkgICAgPDxlbmRsOwotICAgIGNvdXQgPDwiYWNjdVNwYW4wOiAiIDw8IGFjY3VTcGFuMC5jb3VudCgpIDw8IGVuZGw7Ci0gICAgY291dCA8PCJhY2N1U3BhbjE6ICIgPDwgYWNjdVNwYW4xLmNvdW50KCkgPDwgZW5kbDsKLSAgICBjb3V0IDw8ImFjY3VTcGFuMjogIiA8PCBhY2N1U3BhbjIuY291bnQoKSA8PCBlbmRsOwotICAgIGNvdXQgPDwiZHJjU3BhbjA6ICIgPDwgZHJjU3BhbjAuY291bnQoKSA8PCBlbmRsOwotICAgIGNvdXQgPDwiZHJjU3BhbjE6ICIgPDwgZHJjU3BhbjEuY291bnQoKSA8PCBlbmRsOwotICAgIGNvdXQgPDwiZHJjU3BhbjI6ICIgPDwgZHJjU3BhbjIuY291bnQoKSA8PCBlbmRsOwotICB9Ci0gIHJldHVybiAwOwotfQotCi0KLXZvaWQgRmxleFBpblByZXA6OnBpblByZXAoKSB7Ci0gIC8vIGludCBjbnQgPSAwOwotICBpbnQgaW5zdFRlcm1DbnQgPSAwOwotICBpbnQgaW9UZXJtQ250ID0gMDsKLSAgLy8gcGluIHByZXAgZm9yIGluc3QgdGVybXMKLSAgZm9yIChhdXRvIGJsb2NrSXQgPSB0cmFja09mZnNldE1hcC5iZWdpbigpOyBibG9ja0l0ICE9IHRyYWNrT2Zmc2V0TWFwLmVuZCgpOyArK2Jsb2NrSXQpIHsKLSAgICBhdXRvICZvcmllbnRNYXAgPSBibG9ja0l0LT5zZWNvbmQ7Ci0gICAgZm9yIChhdXRvIG9yaWVudEl0ID0gb3JpZW50TWFwLmJlZ2luKCk7IG9yaWVudEl0ICE9IG9yaWVudE1hcC5lbmQoKTsgKytvcmllbnRJdCkgewotICAgICAgLy8gYXV0byBvcmllbnQgPSBvcmllbnRJdC0+Zmlyc3Q7Ci0gICAgICBhdXRvICZvZmZzZXRzMkluc3QgPSBvcmllbnRJdC0+c2Vjb25kOwotICAgICAgZm9yIChhdXRvIG9mZnNldHNJdCA9IG9mZnNldHMySW5zdC5iZWdpbigpOyBvZmZzZXRzSXQgIT0gb2Zmc2V0czJJbnN0LmVuZCgpOyArK29mZnNldHNJdCkgewotICAgICAgICAvLyBhdXRvICZvZmZzZXRzID0gb2Zmc2V0c0l0LT5maXJzdDsKLSAgICAgICAgYXV0byBpbnN0UHRyID0gKihvZmZzZXRzSXQtPnNlY29uZC5iZWdpbigpKTsKLSAgICAgICAgZm9yIChhdXRvICZ1aW5zdFRlcm06IGluc3RQdHItPmdldEluc3RUZXJtcygpKSB7Ci0gICAgICAgICAgZnJJbnN0VGVybSAqaW5zdFRlcm0gPSB1aW5zdFRlcm0uZ2V0KCk7Ci0gICAgICAgICAgYXV0byBpbnN0VGVybVR5cGUgPSBpbnN0VGVybS0+Z2V0VGVybSgpLT5nZXRUeXBlKCk7Ci0gICAgICAgICAgaWYgKGluc3RUZXJtVHlwZSAhPSBmclRlcm1FbnVtOjpmcmNOb3JtYWxUZXJtICYmIGluc3RUZXJtVHlwZSAhPSBmclRlcm1FbnVtOjpmcmNDbG9ja1Rlcm0pIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICArK2luc3RUZXJtQ250OwotICAgICAgICAgIGluc3RUZXJtUGluUHJlcChpbnN0VGVybSwgb2Zmc2V0c0l0LT5zZWNvbmQpOwotICAgICAgICAgIGlmIChpbnN0VGVybUNudCAlIDEwMCA9PSAwKSB7Ci0gICAgICAgICAgICBjb3V0IDw8IiBjb21wbGV0ZSAiIDw8aW5zdFRlcm1DbnQgPDwiIGluc3RUZXJtcyIgPDxlbmRsOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyB1cGRhdGUgYXAgcHJpb3JpdHkKLSAgICAgICAgLy8gdXBkYXRlQVBDb3N0KGluc3RQdHIpOwotCi0gICAgICAgIC8vIGdlbmVyYXRlIEFQQwotICAgICAgICBpZiAoaW5zdFB0ci0+Z2V0UmVmQmxvY2soKS0+Z2V0TWFjcm9DbGFzcygpID09IE1hY3JvQ2xhc3NFbnVtOjpDT1JFIHx8Ci0gICAgICAgICAgICBpbnN0UHRyLT5nZXRSZWZCbG9jaygpLT5nZXRNYWNyb0NsYXNzKCkgPT0gTWFjcm9DbGFzc0VudW06OkNPUkVfVElFSElHSCB8fAotICAgICAgICAgICAgaW5zdFB0ci0+Z2V0UmVmQmxvY2soKS0+Z2V0TWFjcm9DbGFzcygpID09IE1hY3JvQ2xhc3NFbnVtOjpDT1JFX1RJRUxPVyB8fAotICAgICAgICAgICAgaW5zdFB0ci0+Z2V0UmVmQmxvY2soKS0+Z2V0TWFjcm9DbGFzcygpID09IE1hY3JvQ2xhc3NFbnVtOjpDT1JFX0FOVEVOTkFDRUxMKSB7Ci0gICAgICAgICAgc3RkOjpjb3V0IDw8IGluc3RQdHItPmdldE5hbWUoKSA8PCAiKCIgPDwgaW5zdFB0ci0+Z2V0UmVmQmxvY2soKS0+Z2V0TmFtZSgpIDw8ICIpOlxuIjsKLSAgICAgICAgICBBUEdXb3JrZXIgYXBnV29ya2VyKGdldERlc2lnbigpLCBpbnN0UHRyKTsKLSAgICAgICAgICBhcGdXb3JrZXIuaW5pdCgpOwotICAgICAgICAgIGFwZ1dvcmtlci5zZXR1cCgpOwotICAgICAgICAgIGFwZ1dvcmtlci5tYWluKCk7Ci0gICAgICAgICAgYXBnV29ya2VyLmVuZCgpOwotICAgICAgICB9Ci0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgLy8gcGluIHByZXAgZm9yIHRlcm1zCi0gIGZvciAoYXV0byAmdGVybTogZGVzaWduLT5nZXRUb3BCbG9jaygpLT5nZXRUZXJtcygpKSB7Ci0gICAgKytpb1Rlcm1DbnQ7Ci0gICAgdGVybVBpblByZXAodGVybS5nZXQoKSk7Ci0gICAgaWYgKGlvVGVybUNudCAlIDEwMCA9PSAwKSB7Ci0gICAgICBjb3V0IDw8IiBjb21wbGV0ZSAiIDw8aW9UZXJtQ250IDw8IiBpb1Rlcm1zIiA8PGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgc3RkOjpjb3V0IDw8ICJpbnN0VGVybUNudCA9ICIgPDwgaW5zdFRlcm1DbnQgPDwgIlxuIjsKLSAgc3RkOjpjb3V0IDw8ICJpb1Rlcm1DbnQgPSAiIDw8IGlvVGVybUNudCA8PCAiXG4iOwotICBzdGQ6OmNvdXQgPDwgIkFQQ250ID0gIiA8PCBBUENudCA8PCAiXG4iOwotfQotCi12b2lkIEZsZXhQaW5QcmVwOjp1cGRhdGVBUENvc3QoZnJJbnN0ICppbnN0KSB7Ci0gIHN0ZDo6bWFwPGZyVGVybSosIHN0ZDo6dmVjdG9yPEZsZXhBY2Nlc3NQYXR0ZXJuKj4gPiB0ZXJtMkFQczsKLSAgc3RkOjptYXA8ZnJMYXllck51bSwgYmdpOjpydHJlZTxzdGQ6OnBhaXI8cG9pbnRfdCwgRmxleEFjY2Vzc1BhdHRlcm4qPiwgYmdpOjpxdWFkcmF0aWM8MTY+ID4gPiBsYXllcjJBUFJUcmVlOwotICBmb3IgKGF1dG8gJnVpbnN0VGVybTogaW5zdC0+Z2V0SW5zdFRlcm1zKCkpIHsKLSAgICBmckluc3RUZXJtICppbnN0VGVybSA9IHVpbnN0VGVybS5nZXQoKTsKLSAgICBhdXRvIGluc3RUZXJtVHlwZSA9IGluc3RUZXJtLT5nZXRUZXJtKCktPmdldFR5cGUoKTsKLSAgICBpZiAoaW5zdFRlcm1UeXBlICE9IGZyVGVybUVudW06OmZyY05vcm1hbFRlcm0gJiYgaW5zdFRlcm1UeXBlICE9IGZyVGVybUVudW06OmZyY0Nsb2NrVGVybSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIC8vIHBvcHVsYXRlIG1hcCBhbmQgcnRyZWUKLSAgICBmb3IgKGF1dG8gJnVwaW46IGluc3RUZXJtLT5nZXRUZXJtKCktPmdldFBpbnMoKSkgewotICAgICAgZnJQaW4qIHBpbiA9IHVwaW4uZ2V0KCk7Ci0gICAgICBmb3IgKGF1dG8gJnVhcDogcGluLT5nZXRBY2Nlc3NQYXR0ZXJucygpKSB7Ci0gICAgICAgIEZsZXhBY2Nlc3NQYXR0ZXJuKiBhcCA9IHVhcC5nZXQoKTsKLSAgICAgICAgaWYgKGFwLT5oYXNWYWxpZEFjY2VzcyhmckRpckVudW06OlUpKSB7Ci0gICAgICAgICAgdGVybTJBUHNbaW5zdFRlcm0tPmdldFRlcm0oKV0ucHVzaF9iYWNrKGFwKTsKLSAgICAgICAgICBmclBvaW50IGJwLCBlcDsKLSAgICAgICAgICBhcC0+Z2V0UG9pbnRzKGJwLCBlcCk7Ci0gICAgICAgICAgbGF5ZXIyQVBSVHJlZVthcC0+Z2V0QmVnaW5MYXllck51bSgpICsgMl0uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHBvaW50X3QoYnAueCgpLCBicC55KCkpLCBhcCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIC8vIHNldE5lYXJlc3QgQVAgZGlzdGFuY2UgKHRoZSBmdXJ0aGVyIHRoZSBiZXR0ZXIpCi0gIGZvciAoYXV0byBsYXllckl0ID0gbGF5ZXIyQVBSVHJlZS5iZWdpbigpOyBsYXllckl0ICE9IGxheWVyMkFQUlRyZWUuZW5kKCk7ICsrbGF5ZXJJdCkgewotICAgIC8vZnJMYXllck51bSBsYXllck51bSA9IGxheWVySXQtPmZpcnN0OwotICAgIGF1dG8gJmFwUlRyZWUgPSBsYXllckl0LT5zZWNvbmQ7Ci0gICAgZm9yIChhdXRvIGFwSXQgPSBhcFJUcmVlLmJlZ2luKCk7IGFwSXQgIT0gYXBSVHJlZS5lbmQoKTsgKythcEl0KSB7Ci0gICAgICBhdXRvIGxvYyA9IGFwSXQtPmZpcnN0OwotICAgICAgYXV0byBhcCA9IGFwSXQtPnNlY29uZDsKLSAgICAgIC8vIGdldCBuZWFyZXN0IGFwcyB0byBxdWVyeSBxdWV1ZQotICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHBvaW50X3QsIEZsZXhBY2Nlc3NQYXR0ZXJuKj4gPiBxcTsKLSAgICAgIGFwUlRyZWUucXVlcnkoYmdpOjpuZWFyZXN0KGxvYywgdGVybTJBUHNbYXAtPmdldFBpbigpLT5nZXRUZXJtKCldLnNpemUoKSArIDEpLCBzdGQ6OmJhY2tfaW5zZXJ0ZXIocXEpKTsKLSAgICAgIGZyQ29vcmQgbWF4RGlzdCA9IDA7Ci0gICAgICBmb3IgKGF1dG8gJmFwUGFpcjogcXEpIHsKLSAgICAgICAgLy8gYXV0byBkZWx0YVggPSBsb2MueCgpIC0gYXBQYWlyLmZpcnN0LngoKTsKLSAgICAgICAgLy8gYXV0byBkZWx0YVkgPSBsb2MueSgpIC0gYXBQYWlyLmZpcnN0LnkoKTsKLSAgICAgICAgLy8gYXV0byB0bXBEaXN0ID0gZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZOwotICAgICAgICBhdXRvIHRtcERpc3QgPSBiZzo6ZGlzdGFuY2UobG9jLCBhcFBhaXIuZmlyc3QpOwotICAgICAgICBpZiAodG1wRGlzdCA+IG1heERpc3QpIHsKLSAgICAgICAgICBtYXhEaXN0ID0gdG1wRGlzdDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYXAtPnNldE5lYXJlc3RBUERpc3QobWF4RGlzdCk7Ci0gICAgfQotICB9Ci0KLX0KLQotdm9pZCBGbGV4UGluUHJlcDo6aW5zdFRlcm1QaW5QcmVwKGZySW5zdFRlcm0gKmluc3RUZXJtLCBjb25zdCBzdGQ6OnNldDxmckluc3QqLCBmckJsb2NrT2JqZWN0Q29tcD4gJmluc3RzSW4pIHsKLSAgYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLSAgaW50IGluc3RUZXJtQVBDbnQgPSAwOwotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgLy8gYm9vbCBpc1BoeXNpY2FsID0gdHJ1ZTsKLSAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgIGNvdXQgPDwgImluc3RUZXJtUGluUHJlcFxuIjsKLSAgfQotICBmckluc3QqIGluc3QgPSBpbnN0VGVybS0+Z2V0SW5zdCgpOwotICBib29sIGlzTWFjcm8gPSBpbnN0LT5nZXRSZWZCbG9jaygpLT5nZXRNYWNyb0NsYXNzKCkgPT0gTWFjcm9DbGFzc0VudW06OkJMT0NLOwotICBmckJveCBtYm94OwotICBmclRyYW5zZm9ybSB4Zm9ybSwgdGVybVhGb3JtLCByZXZlcnRDZWxsWEZvcm07Ci0KLSAgc3RkOjpzZXQ8ZnJJbnN0Kj4gaW5zdHM7Ci0gIGluc3RzLmluc2VydChpbnN0c0luLmJlZ2luKCksIGluc3RzSW4uZW5kKCkpOwotCi0KLQotICAvLyBkZWJ1ZwotICAvLyBpZiAoaW5zdFRlcm0tPmdldEluc3QoKS0+Z2V0UmVmQmxvY2soKS0+Z2V0TmFtZSgpICE9ICJPUjRYMiIpIHsKLSAgLy8gICByZXR1cm47Ci0gIC8vIH0gCi0KLSAgaW5zdC0+Z2V0VHJhbnNmb3JtKHhmb3JtKTsKLSAgaW5zdC0+Z2V0UmVmQmxvY2soKS0+Z2V0Qm91bmRhcnlCQm94KG1ib3gpOwotICBmclBvaW50IHNpemUobWJveC5yaWdodCgpLCBtYm94LnRvcCgpKTsKLSAgdGVybVhGb3JtLnNldCh4Zm9ybS5vcmllbnQoKSk7Ci0gIHRlcm1YRm9ybS51cGRhdGVYZm9ybShzaXplKTsKLSAgLy8geGZvcm0ucmV2ZXJ0KHJldmVydENlbGxYRm9ybSk7Ci0gIHJldmVydENlbGxYRm9ybS5zZXQoLXhmb3JtLnhPZmZzZXQoKSwgLXhmb3JtLnlPZmZzZXQoKSk7Ci0gIC8vIHN0ZDo6Y291dCA8PCB4Zm9ybS54T2Zmc2V0KCkgPDwgIiAiIDw8IHhmb3JtLnlPZmZzZXQoKSA8PCAiXG4iOwotICAvLyBzdGQ6OmNvdXQgPDwgcmV2ZXJ0Q2VsbFhGb3JtLnhPZmZzZXQoKSA8PCAiICIgPDwgcmV2ZXJ0Q2VsbFhGb3JtLnlPZmZzZXQoKSA8PCAiXG4iOwotICByZXZlcnRDZWxsWEZvcm0uc2V0KGZyY1IwKTsKLSAgeGZvcm0udXBkYXRlWGZvcm0oc2l6ZSk7Ci0gIC8vIHhmb3JtLnJldmVydChyZXZlcnRYRm9ybSk7Ci0gIAotCi0gIC8vIAotICBkb3VibGUgZGJ1ID0gZ2V0VGVjaCgpLT5nZXREQlVQZXJVVSgpOwotICBmckJveCBpbnN0QkJveDsKLSAgaW5zdC0+Z2V0QkJveChpbnN0QkJveCk7Ci0gIGJveF90IGluc3RRdWVyeUJveChwb2ludF90KGluc3RCQm94LmxlZnQoKSwgaW5zdEJCb3guYm90dG9tKCkpLCBwb2ludF90KGluc3RCQm94LnJpZ2h0KCksIGluc3RCQm94LnRvcCgpKSk7Ci0gIC8qCi0gIHN0ZDo6dmVjdG9yPGZyQmxvY2tPYmplY3QqPiBpbnN0T2JqczsKLSAgc3RkOjpzZXQ8ZnJCbG9ja09iamVjdCo+IGluc3RPYmpTZXQ7Ci0gIC8vIHN0ZDo6bWFwPGZyTGF5ZXJOdW0sIFBvbHlnb25TZXQ+IGxheWVyMk9CUzsgCi0gIC8vIHN0ZDo6Y291dCA8PCAiaW5zdCBiYm94ID0gKCIgPDwgaW5zdEJCb3gubGVmdCgpIC8gZGJ1IDw8ICIsICIgPDwgaW5zdEJCb3guYm90dG9tKCkgLyBkYnUKLSAgLy8gICAgICAgICAgIDw8ICIpIC0gKCIgPDwgaW5zdEJCb3gucmlnaHQoKSAvIGRidSA8PCAiLCAiIDw8IGluc3RCQm94LnRvcCgpIC8gZGJ1IDw8ICIpXG4iOwotICBmb3IgKGF1dG8gbGF5ZXJOdW0gPSBkZXNpZ24tPmdldFRlY2goKS0+Z2V0Qm90dG9tTGF5ZXJOdW0oKTsgbGF5ZXJOdW0gPD0gZGVzaWduLT5nZXRUZWNoKCktPmdldFRvcExheWVyTnVtKCk7ICsrbGF5ZXJOdW0pIHsKLSAgICBhdXRvIHJlZ2lvblF1ZXJ5ID0gZGVzaWduLT5nZXRSZWdpb25RdWVyeSgpOwotICAgIHN0ZDo6dmVjdG9yPHJxX3JwdHJfdmFsdWVfdDxmckJsb2NrT2JqZWN0PiA+IHF1ZXJ5UmVzdWx0OwotICAgIHJlZ2lvblF1ZXJ5LT5xdWVyeShpbnN0UXVlcnlCb3gsIGxheWVyTnVtLCBxdWVyeVJlc3VsdCk7Ci0gICAgZm9yIChhdXRvICZvYmpQYWlyOiBxdWVyeVJlc3VsdCkgewotICAgICAgaW5zdE9ialNldC5pbnNlcnQob2JqUGFpci5zZWNvbmQpOwotICAgIH0KLSAgfQotICBmb3IgKGF1dG8gaW5zdE9iajppbnN0T2JqU2V0KSB7Ci0gICAgaWYgKChpbnN0T2JqLT50eXBlSWQoKSA9PSBmcmNJbnN0VGVybSAmJiAoc3RhdGljX2Nhc3Q8ZnJJbnN0VGVybSo+KGluc3RPYmopKS0+Z2V0SW5zdCgpID09IGluc3QpIHx8IAotICAgICAgICAoaW5zdE9iai0+dHlwZUlkKCkgPT0gZnJjSW5zdEJsb2NrYWdlKSkgewotICAgICAgLy8gaWYgKGluc3RPYmotPnR5cGVJZCgpID09IGZyY0luc3RCbG9ja2FnZSkgewotICAgICAgLy8gICBzdGQ6OmNvdXQgPDwgImZyY0luc3RCbG9ja2FnZSBmb3VuZFxuIjsKLSAgICAgIC8vIH0KLSAgICAgIGluc3RPYmpzLnB1c2hfYmFjayhpbnN0T2JqKTsKLSAgICB9Ci0gICAgLy8gLy8gYXR0ZW1wdCB0byBzcGVlZHVwIG1hY3JvIHByb2Nlc3NpbmcKLSAgICAvLyBpZiAoaW5zdE9iai0+dHlwZUlkKCkgPT0gZnJjSW5zdEJsb2NrYWdlKSB7Ci0gICAgLy8gICBmckJsb2NrYWdlKiBibG9ja2FnZSA9IChzdGF0aWNfY2FzdDxmckluc3RCbG9ja2FnZSo+KGluc3RPYmopKS0+Z2V0QmxvY2thZ2UoKTsKLSAgICAvLyAgIGlmIChibG9ja2FnZS0+dHlwZUlkKCkgIT0gZnJjTGF5ZXJCbG9ja2FnZSkgewotICAgIC8vICAgICBzdGQ6OmNvdXQgPDwgIkVycm9yOiB1bmV4cGVjdGVkIGJsb2NrYWdlIHR5cGUgaW4gaW5pdE5ldFJlY3RzX2Jsb2NrYWdlc1xuIjsKLSAgICAvLyAgIH0gZWxzZSB7Ci0gICAgLy8gICAgIGZyVHJhbnNmb3JtIHhmb3JtOwotICAgIC8vICAgICBpbnN0LT5nZXRVcGRhdGVkWGZvcm0oeGZvcm0pOwotICAgIC8vICAgICBmckxheWVyQmxvY2thZ2UqIGxheWVyQmxvY2thZ2UgPSBzdGF0aWNfY2FzdDxmckxheWVyQmxvY2thZ2UqPihibG9ja2FnZSk7Ci0gICAgLy8gICAgIGZyTGF5ZXJOdW0gbGF5ZXJOdW0gPSBsYXllckJsb2NrYWdlLT5nZXRMYXllck51bSgpOwotICAgIC8vICAgICBhdXRvIGJsb2NrYWdlRnJQb2ludHMgPSBsYXllckJsb2NrYWdlLT5nZXRQb2ludHMoKTsKLSAgICAvLyAgICAgc3RkOjp2ZWN0b3I8UG9pbnQ+IGJsb2NrYWdlUG9pbnRzOwotICAgIC8vICAgICBmb3IgKGF1dG8gcHQ6IGJsb2NrYWdlRnJQb2ludHMpIHsKLSAgICAvLyAgICAgICBmclBvaW50IHRtcFB0ID0gcHQ7Ci0gICAgLy8gICAgICAgdG1wUHQudHJhbnNmb3JtKHhmb3JtKTsKLSAgICAvLyAgICAgICBibG9ja2FnZVBvaW50cy5wdXNoX2JhY2soUG9pbnQodG1wUHQueCgpLCB0bXBQdC55KCkpKTsKLSAgICAvLyAgICAgfQotICAgIC8vICAgICBQb2x5Z29uIGJsb2NrYWdlUG9seTsKLSAgICAvLyAgICAgc2V0X3BvaW50cyhibG9ja2FnZVBvbHksIGJsb2NrYWdlUG9pbnRzLmJlZ2luKCksIGJsb2NrYWdlUG9pbnRzLmVuZCgpKTsKLSAgICAvLyAgICAgbGF5ZXIyT0JTW2xheWVyTnVtXSArPSBibG9ja2FnZVBvbHk7Ci0gICAgLy8gICB9Ci0gICAgLy8gfQotICB9Ci0gIC8vIGFsbCBjZWxsIG9iamVjdHMgYXJlIHJlYWQgaW4KLSAgKi8KLSAgaWYgKGVuYWJsZU91dHB1dCkgewotICAvL2lmICh0cnVlKSB7Ci0gICAgc3RkOjpjb3V0IDw8ICJjZWxsIC8gY2VsbCBtYXN0ZXIgLyBvcmllbnQgLyBpbnN0VGVybTogIiAKLSAgICAgICAgICAgICAgPDwgaW5zdFRlcm0tPmdldEluc3QoKS0+Z2V0TmFtZSgpIDw8ICIgLyAiCi0gICAgICAgICAgICAgIDw8IGluc3RUZXJtLT5nZXRJbnN0KCktPmdldFJlZkJsb2NrKCktPmdldE5hbWUoKSA8PCAiIC8gIiAKLSAgICAgICAgICAgICAgPDwgeGZvcm0ub3JpZW50KCkgPDwgIiAvICIgCi0gICAgICAgICAgICAgIDw8IGluc3RUZXJtLT5nZXRUZXJtKCktPmdldE5hbWUoKSA8PCAiXG4iIDw8IHN0ZDo6Zmx1c2g7Ci0gIH0KLSAgLy8gc3RkOjpjb3V0IDw8ICJoZXJlLTFcbiI7Ci0gIGJvb2wgaGFzVmFsaWRBUCA9IGZhbHNlOwotICBmb3IgKGF1dG8gJnBpbjogaW5zdFRlcm0tPmdldFRlcm0oKS0+Z2V0UGlucygpKSB7Ci0gICAgLy8gbWFwPGZyUG9pbnQsIGludD4gZW5kUG9pbnQyQ29zdDsKLSAgICAvLyBtYXA8ZnJQb2ludCwgcGFpcjxmck9yaWVudCwgRmxleEFjY2Vzc1BhdHRlcm4+ID4gZW5kUGlvbnQyQVA7Ci0gICAgYXV0byBwaW5QdHIgPSBwaW4uZ2V0KCk7Ci0gICAgbWFwPGZyTGF5ZXJOdW0sIFBvbHlnb25TZXQ+IGxheWVyTnVtMlBTOwotICAgIC8vIG1hcDxmckxheWVyTnVtLCBSZWN0YW5nbGU+IGxheWVyTnVtMkJCb3g7Ci0gICAgLy8gaW50IG51bUxheWVycyA9IGludChkZXNpZ24tPmdldFRlY2goKS0+Z2V0TGF5ZXJzKCkuc2l6ZSgpKTsKLSAgICAvLyBmckxheWVyTnVtIG1pblBpbkxheWVyTnVtID0gbnVtTGF5ZXJzLCBtYXhQaW5MYXllck51bSA9IDA7Ci0gICAgaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjp0aW1lX3BvaW50IHQxID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKLSAgICBtZXJnZVBpblNoYXBlcyhwaW5QdHIsIHhmb3JtLCBsYXllck51bTJQUyk7Ci0gICAgaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjp0aW1lX3BvaW50IHQyID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKLSAgICBhY2N1U3BhbjAgKz0gZHVyYXRpb25fY2FzdDxkdXJhdGlvbjxkb3VibGU+Pih0MiAtIHQxKTsKLSAgICAKLSAgICBzdGQ6OnZlY3RvcjxmckJsb2NrT2JqZWN0Kj4gcGluT2JqczsKLSAgICBzdGQ6OnNldDxmckJsb2NrT2JqZWN0Kj4gcGluT2JqU2V0OwotICAgIHN0ZDo6dmVjdG9yPFJlY3RhbmdsZT4gbWF4UmVjdHM7Ci0gICAgUmVjdGFuZ2xlIHBpbkJCb3hSZWN0LCBwaW5CbG9hdEJCb3hSZWN0OwotICAgIFBvbHlnb25TZXQgcGluUFM7Ci0gICAgZnJDb29yZCBtYXhQaXRjaCA9IDA7Ci0gICAgZm9yIChhdXRvIGxheWVySXQgPSBsYXllck51bTJQUy5iZWdpbigpOyBsYXllckl0ICE9IGxheWVyTnVtMlBTLmVuZCgpOyArK2xheWVySXQpIHsKLSAgICAgIHBpblBTICs9IGxheWVySXQtPnNlY29uZDsKLSAgICAgIGF1dG8gY3VyckxheWVyUGl0Y2ggPSBnZXRUZWNoKCktPmdldExheWVyKGxheWVySXQtPmZpcnN0KS0+Z2V0UGl0Y2goKTsKLSAgICAgIGlmIChjdXJyTGF5ZXJQaXRjaCA+IG1heFBpdGNoKSB7Ci0gICAgICAgIG1heFBpdGNoID0gY3VyckxheWVyUGl0Y2g7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIGV4dGVudHMocGluQkJveFJlY3QsIHBpblBTKTsKLSAgICAvLyBwaW5CbG9hdEJCb3hSZWN0ID0gYmxvYXQocGluQkJveFJlY3QsIG1heFBpdGNoKTsKLSAgICAvLyBib3hfdCBwaW5CbG9hdEJCb3gocG9pbnRfdCh4bChwaW5CbG9hdEJCb3hSZWN0KSwgeWwocGluQmxvYXRCQm94UmVjdCkpLCBwb2ludF90KHhoKHBpbkJsb2F0QkJveFJlY3QpLCB5aChwaW5CbG9hdEJCb3hSZWN0KSkpOwotICAgIC8vIGZvciAoYXV0byBsYXllck51bSA9IGRlc2lnbi0+Z2V0VGVjaCgpLT5nZXRCb3R0b21MYXllck51bSgpOyBsYXllck51bSA8PSBkZXNpZ24tPmdldFRlY2goKS0+Z2V0VG9wTGF5ZXJOdW0oKTsgKytsYXllck51bSkgewotICAgIC8vICAgYXV0byByZWdpb25RdWVyeSA9IGRlc2lnbi0+Z2V0UmVnaW9uUXVlcnkoKTsKLSAgICAvLyAgIHN0ZDo6dmVjdG9yPHJxX3JwdHJfdmFsdWVfdDxmckJsb2NrT2JqZWN0PiA+IHF1ZXJ5UmVzdWx0OwotICAgIC8vICAgcmVnaW9uUXVlcnktPnF1ZXJ5KHBpbkJsb2F0QkJveCwgbGF5ZXJOdW0sIHF1ZXJ5UmVzdWx0KTsKLSAgICAvLyAgIGZvciAoYXV0byAmb2JqUGFpcjogcXVlcnlSZXN1bHQpIHsKLSAgICAvLyAgICAgcGluT2JqU2V0Lmluc2VydChvYmpQYWlyLnNlY29uZCk7Ci0gICAgLy8gICB9Ci0gICAgLy8gfQotCi0gICAgZ2V0X21heF9yZWN0YW5nbGVzKG1heFJlY3RzLCBwaW5QUyk7Ci0gICAgZm9yIChhdXRvIG1heFJlY3Q6IG1heFJlY3RzKSB7Ci0gICAgICBwaW5CbG9hdEJCb3hSZWN0ID0gYmxvYXQobWF4UmVjdCwgbWF4UGl0Y2gpOwotICAgICAgYm94X3QgcGluQmxvYXRCQm94KHBvaW50X3QoeGwocGluQmxvYXRCQm94UmVjdCksIHlsKHBpbkJsb2F0QkJveFJlY3QpKSwgcG9pbnRfdCh4aChwaW5CbG9hdEJCb3hSZWN0KSwgeWgocGluQmxvYXRCQm94UmVjdCkpKTsKLSAgICAgIGZvciAoYXV0byBsYXllck51bSA9IGRlc2lnbi0+Z2V0VGVjaCgpLT5nZXRCb3R0b21MYXllck51bSgpOyBsYXllck51bSA8PSBkZXNpZ24tPmdldFRlY2goKS0+Z2V0VG9wTGF5ZXJOdW0oKTsgKytsYXllck51bSkgewotICAgICAgICBhdXRvIHJlZ2lvblF1ZXJ5ID0gZGVzaWduLT5nZXRSZWdpb25RdWVyeSgpOwotICAgICAgICBzdGQ6OnZlY3RvcjxycV9ycHRyX3ZhbHVlX3Q8ZnJCbG9ja09iamVjdD4gPiBxdWVyeVJlc3VsdDsKLSAgICAgICAgcmVnaW9uUXVlcnktPnF1ZXJ5KHBpbkJsb2F0QkJveCwgbGF5ZXJOdW0sIHF1ZXJ5UmVzdWx0KTsKLSAgICAgICAgZm9yIChhdXRvICZvYmpQYWlyOiBxdWVyeVJlc3VsdCkgewotICAgICAgICAgIHBpbk9ialNldC5pbnNlcnQob2JqUGFpci5zZWNvbmQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGZvciAoYXV0byBwaW5PYmo6cGluT2JqU2V0KSB7Ci0gICAgICBpZiAoKHBpbk9iai0+dHlwZUlkKCkgPT0gZnJjSW5zdFRlcm0gJiYgKHN0YXRpY19jYXN0PGZySW5zdFRlcm0qPihwaW5PYmopKS0+Z2V0SW5zdCgpID09IGluc3QpIHx8IAotICAgICAgICAgIChwaW5PYmotPnR5cGVJZCgpID09IGZyY0luc3RCbG9ja2FnZSkpIHsKLSAgICAgICAgcGluT2Jqcy5wdXNoX2JhY2socGluT2JqKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgLy8gICBmb3IgKGF1dG8gaXQgPSBsYXllck51bTJQUy5iZWdpbigpOyBpdCAhPSBsYXllck51bTJQUy5lbmQoKTsgKytpdCkgewotICAgIC8vICAgICBhdXRvIGxheWVyTnVtID0gaXQtPmZpcnN0OwotICAgIC8vICAgICBhdXRvICZwb2x5U2V0ID0gaXQtPnNlY29uZDsKLSAgICAvLyAgICAgc3RkOjpjb3V0IDw8ICIgbGF5ZXJOdW0gPSAiIDw8IGxheWVyTnVtIDw8ICJcbiI7Ci0gICAgLy8gICAgIGZvciAoYXV0byAmcG9seTogcG9seVNldCkgewotICAgIC8vICAgICAgIHN0ZDo6Y291dCA8PCAiICBwb2x5OiAiOwotICAgIC8vICAgICAgIGZvciAoYXV0byBwdEl0ID0gYm9vc3Q6OnBvbHlnb246OmJlZ2luX3BvaW50cyhwb2x5KTsgcHRJdCAhPSBib29zdDo6cG9seWdvbjo6ZW5kX3BvaW50cyhwb2x5KTsgKytwdEl0KSB7Ci0gICAgLy8gICAgICAgICBmclBvaW50IHRtcFB0KCgqcHRJdCkueCgpLCAoKnB0SXQpLnkoKSk7Ci0gICAgLy8gICAgICAgICBzdGQ6OmNvdXQgPDwgIigiIDw8IHRtcFB0LngoKSAvIDIwMDAuMCA8PCAiLCIgPDwgdG1wUHQueSgpIC8gMjAwMC4wIDw8ICIpIC0tICI7Ci0gICAgLy8gICAgICAgfQotICAgIC8vICAgICAgIHN0ZDo6Y291dCA8PCAiXG4iOwotICAgIC8vICAgICB9Ci0gICAgLy8gICB9Ci0gICAgLy8gfQotICAgIC8vIHN0ZDo6Y291dCA8PCAiaGVyZTBcbiI7Ci0gICAgLy8gZ2V0UGluTGF5ZXJCQm94KGxheWVyTnVtMlBTLCBsYXllck51bTJCQm94KTsKLSAgICBmb3IgKGF1dG8gbGF5ZXJJdCA9IGxheWVyTnVtMlBTLmJlZ2luKCk7IGxheWVySXQgIT0gbGF5ZXJOdW0yUFMuZW5kKCk7ICsrbGF5ZXJJdCkgewotICAgICAgYm9vbCBoYXNQaW5MYXllckFQID0gZmFsc2U7Ci0gICAgICBtYXA8ZnJDb29yZCwgbWFwPGZyTGF5ZXJOdW0sIGZyVHJhY2tQYXR0ZXJuKj4gPiB4TG9jMlRyYWNrUGF0dGVybnM7IC8vIHRyYWNrIHhDb29yZAotICAgICAgbWFwPGZyQ29vcmQsIG1hcDxmckxheWVyTnVtLCBmclRyYWNrUGF0dGVybio+ID4geUxvYzJUcmFja1BhdHRlcm5zOyAvLyB0cmFjayB5Q29vcmQKLSAgICAgIGZyTGF5ZXJOdW0gY3VyckxheWVyTnVtID0gbGF5ZXJJdC0+Zmlyc3Q7Ci0gICAgICBQb2x5Z29uU2V0IGxheWVyUFMgPSBsYXllck51bTJQU1tjdXJyTGF5ZXJOdW1dOwotICAgICAgbWFwPGZyUG9pbnQsIGludD4gc3RhcnRQb2ludHM7IC8vIHN0YXJ0UG9pbnQgd2l0aCBjb3N0LCBsb3dlciBpcyBtb3JlIHByZWZlcnJhYmxlCi0gICAgICAvLyBzZXQ8cGFpcjxmckxheWVyTnVtLCBmclBvaW50PiA+IGVuZFBvaW50czsKLSAgICAgIC8vIFJlY3RhbmdsZSBsYXllckJCb3ggPSBsYXllck51bTJCQm94W2N1cnJMYXllck51bV07Ci0gICAgICBoaWdoX3Jlc29sdXRpb25fY2xvY2s6OnRpbWVfcG9pbnQgdDEgPSBoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwotICAgICAgZ2V0UGluTGF5ZXJCQm94VHJhY2tQYXR0ZXJucyhjdXJyTGF5ZXJOdW0sIGxheWVyUFMsIHhMb2MyVHJhY2tQYXR0ZXJucywgeUxvYzJUcmFja1BhdHRlcm5zKTsKLSAgICAgIGdldFBpbkxheWVyQVBTdGFydFBvaW50cyhjdXJyTGF5ZXJOdW0sIGxheWVyUFMsIHhMb2MyVHJhY2tQYXR0ZXJucywgeUxvYzJUcmFja1BhdHRlcm5zLCBzdGFydFBvaW50cyk7Ci0gICAgICBoaWdoX3Jlc29sdXRpb25fY2xvY2s6OnRpbWVfcG9pbnQgdDIgPSBoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwotICAgICAgLy8gZ2V0UGluTGF5ZXJBUEVuZFBvaW50cyhjdXJyTGF5ZXJOdW0sIGxheWVyUFMsIHhMb2MyVHJhY2tQYXR0ZXJucywgeUxvYzJUcmFja1BhdHRlcm5zLCBlbmRQb2ludHMpOwotICAgICAgLy8gaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgLy8gICBkb3VibGUgZGJ1ID0gZ2V0VGVjaCgpLT5nZXREQlVQZXJVVSgpOwotICAgICAgLy8gICBmb3IgKGF1dG8gJnN0YXJ0UG9pbnQ6IHN0YXJ0UG9pbnRzKSB7Ci0gICAgICAvLyAgICAgaWYgKCFpc1BoeXNpY2FsKSB7Ci0gICAgICAvLyAgICAgICBzdGQ6OmNvdXQgPDwgIiAgc3RhcnRQb2ludDogIiA8PCAiKCIgPDwgc3RhcnRQb2ludC5maXJzdC54KCkgPDwgIiwgIiA8PCBzdGFydFBvaW50LmZpcnN0LnkoKSA8PCAiLCAiIDw8IGN1cnJMYXllck51bSA8PCAiKVxuIjsKLSAgICAgIC8vICAgICB9IGVsc2UgewotICAgICAgLy8gICAgICAgc3RkOjpjb3V0IDw8ICIgIHN0YXJ0UG9pbnQ6ICIgPDwgIigiIDw8IHN0YXJ0UG9pbnQuZmlyc3QueCgpIC8gZGJ1IDw8ICIsICIgPDwgc3RhcnRQb2ludC5maXJzdC55KCkgLyBkYnUgPDwgIiwgIiA8PCBjdXJyTGF5ZXJOdW0gPDwgIilcbiI7Ci0gICAgICAvLyAgICAgfQotICAgICAgLy8gICB9Ci0gICAgICAvLyAgIGZvciAoYXV0byAmZW5kUG9pbnQ6IGVuZFBvaW50cykgewotICAgICAgLy8gICAgIGlmICghaXNQaHlzaWNhbCkgewotICAgICAgLy8gICAgICAgc3RkOjpjb3V0IDw8ICIgIGVuZFBvaW50OiAoIiA8PCBlbmRQb2ludC5zZWNvbmQueCgpIDw8ICIsICIgPDwgZW5kUG9pbnQuc2Vjb25kLnkoKSA8PCAiLCAiIDw8IGVuZFBvaW50LmZpcnN0IDw8ICIpXG4iOwotICAgICAgLy8gICAgIH0gZWxzZSB7Ci0gICAgICAvLyAgICAgICBzdGQ6OmNvdXQgPDwgIiAgZW5kUG9pbnQ6ICgiIDw8IGVuZFBvaW50LnNlY29uZC54KCkgLyBkYnUgPDwgIiwgIiA8PCBlbmRQb2ludC5zZWNvbmQueSgpIC8gZGJ1IDw8ICIsICIgPDwgZW5kUG9pbnQuZmlyc3QgPDwgIilcbiI7Ci0gICAgICAvLyAgICAgfQotICAgICAgLy8gICB9Ci0gICAgICAvLyB9Ci0KLSAgICAgIC8vIGdldCBhY2Nlc3MgcGF0dGVybiBiYXNlZCBvbiBzdGFydCBwb2ludCBvbmx5Ci0gICAgICBmb3IgKGF1dG8gJnN0YXJ0UG9pbnQ6IHN0YXJ0UG9pbnRzKSB7Ci0gICAgICAgIGF1dG8gJnN0YXJ0UHQgPSBzdGFydFBvaW50LmZpcnN0OwotICAgICAgICBmclBvaW50IGFwU3RhcnRQdCA9IHN0YXJ0UHQ7Ci0gICAgICAgIGFwU3RhcnRQdC50cmFuc2Zvcm0ocmV2ZXJ0Q2VsbFhGb3JtKTsKLSAgICAgICAgYXV0byAmc3RhcnRMYXllck51bSA9IGN1cnJMYXllck51bTsKLSAgICAgICAgRmxleEFjY2Vzc1BhdHRlcm4gYXA7Ci0gICAgICAgIGFwLnNldFBvaW50cyhhcFN0YXJ0UHQsIGFwU3RhcnRQdCk7Ci0gICAgICAgIGFwLnNldEJlZ2luTGF5ZXJOdW0oc3RhcnRMYXllck51bSk7Ci0gICAgICAgIGFwLmFkZFRvUGluKHBpbi5nZXQoKSk7Ci0gICAgICAgIGlmIChpbnN0LT5nZXRSZWZCbG9jaygpLT5nZXRNYWNyb0NsYXNzKCkgPT0gTWFjcm9DbGFzc0VudW06OkJMT0NLKSB7Ci0gICAgICAgICAgYXAuc2V0Q29uZmxpY3QoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIC8vYXAuc2V0RW5kTGF5ZXJOdW0oc3RhcnRMYXllck51bSk7Ci0gICAgICAgIC8vYXAuc2V0Q29zdCgxKTsKLSAgICAgICAgCi0KLQotICAgICAgICBmclBvaW50IGVuZFB0OwotICAgICAgICAvLyBjaGVjayBwbGFuYXIgYWNjZXNzCi0gICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlxuc3RhcnRQdCAoIiA8PCBzdGFydFB0LngoKSAvIGRidSA8PCAiLCAiIDw8IHN0YXJ0UHQueSgpIC8gZGJ1IDw8ICIpXG4iOwotICAgICAgICB9Ci0gICAgICAgIC8vIEUKLSAgICAgICAgYm9vbCBza2lwRSA9IGZhbHNlOwotICAgICAgICBnZXRQbGFuYXJFUChzdGFydExheWVyTnVtLCBzdGFydFB0LCBmckRpckVudW06OkUsIGVuZFB0KTsKLSAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgIHN0ZDo6Y291dCA8PCAiICBFIGVuZFB0IGF0ICgiIDw8IGVuZFB0LngoKSAvIGRidSA8PCAiLCAiIDw8IGVuZFB0LnkoKSAvIGRidSA8PCAiKVxuIjsKLSAgICAgICAgfQotICAgICAgICAvLyBmb3IgKGF1dG8gJm9ic1BvbHk6IGxheWVyMk9CU1tzdGFydExheWVyTnVtXSkgewotICAgICAgICAvLyAgIGlmIChjb250YWlucyhvYnNQb2x5LCBQb2ludChlbmRQdC54KCksIGVuZFB0LnkoKSkpKSB7Ci0gICAgICAgIC8vICAgICBza2lwRSA9IHRydWU7Ci0gICAgICAgIC8vICAgICBicmVhazsKLSAgICAgICAgLy8gICB9Ci0gICAgICAgIC8vIH0KLSAgICAgICAgaWYgKCFza2lwRSkgewotICAgICAgICAgIGlmIChpc01hY3JvIHx8IGlzVmFsaWRQbGFuYXJBY2Nlc3MocGluUHRyLCBpbnN0VGVybSwgcGluT2Jqcywgc3RhcnRMYXllck51bSwgc3RhcnRQdCwgZW5kUHQsIGxheWVyUFMpKSB7Ci0gICAgICAgICAgICBhcC5zZXRWYWxpZEFjY2VzcyhmckRpckVudW06OkUsIHRydWUpOwotICAgICAgICAgICAgKytBUENudDsKLSAgICAgICAgICAgICsraW5zdFRlcm1BUENudDsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXAuc2V0VmFsaWRBY2Nlc3MoZnJEaXJFbnVtOjpFLCBmYWxzZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFMKLSAgICAgICAgYm9vbCBza2lwUyA9IGZhbHNlOwotICAgICAgICBnZXRQbGFuYXJFUChzdGFydExheWVyTnVtLCBzdGFydFB0LCBmckRpckVudW06OlMsIGVuZFB0KTsKLSAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgIHN0ZDo6Y291dCA8PCAiICBTIGVuZFB0IGF0ICgiIDw8IGVuZFB0LngoKSAvIGRidSA8PCAiLCAiIDw8IGVuZFB0LnkoKSAvIGRidSA8PCAiKVxuIjsKLSAgICAgICAgfQotICAgICAgICAvLyBmb3IgKGF1dG8gJm9ic1BvbHk6IGxheWVyMk9CU1tzdGFydExheWVyTnVtXSkgewotICAgICAgICAvLyAgIGlmIChjb250YWlucyhvYnNQb2x5LCBQb2ludChlbmRQdC54KCksIGVuZFB0LnkoKSkpKSB7Ci0gICAgICAgIC8vICAgICBza2lwUyA9IHRydWU7Ci0gICAgICAgIC8vICAgICBicmVhazsKLSAgICAgICAgLy8gICB9Ci0gICAgICAgIC8vIH0KLSAgICAgICAgaWYgKCFza2lwUykgewotICAgICAgICAgIGlmIChpc01hY3JvIHx8IGlzVmFsaWRQbGFuYXJBY2Nlc3MocGluUHRyLCBpbnN0VGVybSwgcGluT2Jqcywgc3RhcnRMYXllck51bSwgc3RhcnRQdCwgZW5kUHQsIGxheWVyUFMpKSB7Ci0gICAgICAgICAgICBhcC5zZXRWYWxpZEFjY2VzcyhmckRpckVudW06OlMsIHRydWUpOwotICAgICAgICAgICAgKytBUENudDsKLSAgICAgICAgICAgICsraW5zdFRlcm1BUENudDsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXAuc2V0VmFsaWRBY2Nlc3MoZnJEaXJFbnVtOjpTLCBmYWxzZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFcKLSAgICAgICAgYm9vbCBza2lwVyA9IGZhbHNlOwotICAgICAgICBnZXRQbGFuYXJFUChzdGFydExheWVyTnVtLCBzdGFydFB0LCBmckRpckVudW06OlcsIGVuZFB0KTsKLSAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgIHN0ZDo6Y291dCA8PCAiICBXIGVuZFB0IGF0ICgiIDw8IGVuZFB0LngoKSAvIGRidSA8PCAiLCAiIDw8IGVuZFB0LnkoKSAvIGRidSA8PCAiKVxuIjsKLSAgICAgICAgfQotICAgICAgICAvLyBmb3IgKGF1dG8gJm9ic1BvbHk6IGxheWVyMk9CU1tzdGFydExheWVyTnVtXSkgewotICAgICAgICAvLyAgIGlmIChjb250YWlucyhvYnNQb2x5LCBQb2ludChlbmRQdC54KCksIGVuZFB0LnkoKSkpKSB7Ci0gICAgICAgIC8vICAgICBza2lwVyA9IHRydWU7Ci0gICAgICAgIC8vICAgICBicmVhazsKLSAgICAgICAgLy8gICB9Ci0gICAgICAgIC8vIH0KLSAgICAgICAgaWYgKCFza2lwVykgewotICAgICAgICAgIGlmIChpc01hY3JvIHx8IGlzVmFsaWRQbGFuYXJBY2Nlc3MocGluUHRyLCBpbnN0VGVybSwgcGluT2Jqcywgc3RhcnRMYXllck51bSwgc3RhcnRQdCwgZW5kUHQsIGxheWVyUFMpKSB7Ci0gICAgICAgICAgICBhcC5zZXRWYWxpZEFjY2VzcyhmckRpckVudW06OlcsIHRydWUpOwotICAgICAgICAgICAgKytBUENudDsKLSAgICAgICAgICAgICsraW5zdFRlcm1BUENudDsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXAuc2V0VmFsaWRBY2Nlc3MoZnJEaXJFbnVtOjpXLCBmYWxzZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIE4KLSAgICAgICAgYm9vbCBza2lwTiA9IGZhbHNlOwotICAgICAgICBnZXRQbGFuYXJFUChzdGFydExheWVyTnVtLCBzdGFydFB0LCBmckRpckVudW06Ok4sIGVuZFB0KTsKLSAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgIHN0ZDo6Y291dCA8PCAiICBOIGVuZFB0IGF0ICgiIDw8IGVuZFB0LngoKSAvIGRidSA8PCAiLCAiIDw8IGVuZFB0LnkoKSAvIGRidSA8PCAiKVxuIjsKLSAgICAgICAgfQotICAgICAgICAvLyBmb3IgKGF1dG8gJm9ic1BvbHk6IGxheWVyMk9CU1tzdGFydExheWVyTnVtXSkgewotICAgICAgICAvLyAgIGlmIChjb250YWlucyhvYnNQb2x5LCBQb2ludChlbmRQdC54KCksIGVuZFB0LnkoKSkpKSB7Ci0gICAgICAgIC8vICAgICBza2lwTiA9IHRydWU7Ci0gICAgICAgIC8vICAgICBicmVhazsKLSAgICAgICAgLy8gICB9Ci0gICAgICAgIC8vIH0KLSAgICAgICAgaWYgKCFza2lwTikgewotICAgICAgICAgIGlmIChpc01hY3JvIHx8IGlzVmFsaWRQbGFuYXJBY2Nlc3MocGluUHRyLCBpbnN0VGVybSwgcGluT2Jqcywgc3RhcnRMYXllck51bSwgc3RhcnRQdCwgZW5kUHQsIGxheWVyUFMpKSB7Ci0gICAgICAgICAgICBhcC5zZXRWYWxpZEFjY2VzcyhmckRpckVudW06Ok4sIHRydWUpOwotICAgICAgICAgICAgKytBUENudDsKLSAgICAgICAgICAgICsraW5zdFRlcm1BUENudDsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXAuc2V0VmFsaWRBY2Nlc3MoZnJEaXJFbnVtOjpOLCBmYWxzZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICAvLyBVCi0gICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICBzdGQ6OmNvdXQgPDwgIiAgVVxuIjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGluc3QtPmdldFJlZkJsb2NrKCktPmdldE1hY3JvQ2xhc3MoKSA9PSBNYWNyb0NsYXNzRW51bTo6Q09SRSB8fAotICAgICAgICAgICAgaW5zdC0+Z2V0UmVmQmxvY2soKS0+Z2V0TWFjcm9DbGFzcygpID09IE1hY3JvQ2xhc3NFbnVtOjpDT1JFX1RJRUhJR0ggfHwKLSAgICAgICAgICAgIGluc3QtPmdldFJlZkJsb2NrKCktPmdldE1hY3JvQ2xhc3MoKSA9PSBNYWNyb0NsYXNzRW51bTo6Q09SRV9USUVMT1cgfHwKLSAgICAgICAgICAgIGluc3QtPmdldFJlZkJsb2NrKCktPmdldE1hY3JvQ2xhc3MoKSA9PSBNYWNyb0NsYXNzRW51bTo6Q09SRV9BTlRFTk5BQ0VMTCkgewotICAgICAgICAgIC8vIGdldCB2aWEgYWNjZXNzZXMKLSAgICAgICAgICBzdGQ6Om1hcDx2aWFQcmlvcml0eVR1cGxlLCBmclZpYURlZio+IHByaW9yaXR5MlZpYURlZjsKLSAgICAgICAgICBhdXRvIHVwcGVyVmlhRGVmID0gZ2V0VGVjaCgpLT5nZXRMYXllcihzdGFydExheWVyTnVtICsgMSktPmdldERlZmF1bHRWaWFEZWYoKTsKLSAgICAgICAgICB2aWFQcmlvcml0eVR1cGxlIHByaW9yaXR5OwotICAgICAgICAgIGlmIChpc1ZhbGlkVmlhQWNjZXNzKHBpblB0ciwgaW5zdFRlcm0sIHBpbk9ianMsIHN0YXJ0TGF5ZXJOdW0sIHN0YXJ0UHQsIHVwcGVyVmlhRGVmLCBwcmlvcml0eSkpIHsKLSAgICAgICAgICAgIGFwLnNldFZhbGlkQWNjZXNzKGZyRGlyRW51bTo6VSwgdHJ1ZSk7Ci0gICAgICAgICAgICArK0FQQ250OwotICAgICAgICAgICAgKytpbnN0VGVybUFQQ250OwotICAgICAgICAgICAgLy8gYXAuYWRkQWNjZXNzVmlhRGVmKGZyRGlyRW51bTo6VSwgdXBwZXJWaWFEZWYpOwotICAgICAgICAgICAgcHJpb3JpdHkyVmlhRGVmW3ByaW9yaXR5XSA9IHVwcGVyVmlhRGVmOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGZvciAoYXV0byBsYXllckl0ID0gbGF5ZXJOdW0yVmlhRGVmcy5iZWdpbigpOyBsYXllckl0ICE9IGxheWVyTnVtMlZpYURlZnMuZW5kKCk7ICsrbGF5ZXJJdCkgewotICAgICAgICAgICAgYXV0byBjdXJyTGF5ZXJOdW0gPSBsYXllckl0LT5maXJzdDsKLSAgICAgICAgICAgIGlmIChjdXJyTGF5ZXJOdW0gIT0gc3RhcnRMYXllck51bSArIDEpIHsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdXRvICZudW1DdXQyVmlhRGVmcyA9IGxheWVySXQtPnNlY29uZDsKLSAgICAgICAgICAgIGludCBudW1DdXQgPSAtMTsKLSAgICAgICAgICAgIGZvciAoYXV0byBudW1DdXRJdCA9IG51bUN1dDJWaWFEZWZzLmJlZ2luKCk7IG51bUN1dEl0ICE9IG51bUN1dDJWaWFEZWZzLmVuZCgpOyArK251bUN1dEl0KSB7Ci0gICAgICAgICAgICAgIGlmIChudW1DdXQgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBudW1DdXQgPSBudW1DdXRJdC0+Zmlyc3Q7Ci0gICAgICAgICAgICAgIGF1dG8gJnZpYVJhd1ByaW9yaXR5MlZpYURlZnMgPSBudW1DdXRJdC0+c2Vjb25kOwotICAgICAgICAgICAgICBpbnQgYXR0ZW1wdENudCA9IDA7Ci0gICAgICAgICAgICAgIGlmIChhcC5oYXNWYWxpZEFjY2VzcyhmckRpckVudW06OlUpKSB7Ci0gICAgICAgICAgICAgICAgKythdHRlbXB0Q250OwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGZvciAoYXV0byB2aWFEZWZJdCA9IHZpYVJhd1ByaW9yaXR5MlZpYURlZnMuYmVnaW4oKTsgdmlhRGVmSXQgIT0gdmlhUmF3UHJpb3JpdHkyVmlhRGVmcy5lbmQoKTsgKyt2aWFEZWZJdCkgewotICAgICAgICAgICAgICAgIGlmIChhdHRlbXB0Q250ID49IG1heFZpYUF0dGVtcHRMaW1pdCkgewotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGF1dG8gdmlhRGVmID0gdmlhRGVmSXQtPnNlY29uZDsKLSAgICAgICAgICAgICAgICBpZiAoIXZpYURlZi0+Z2V0RGVmYXVsdCgpIHx8IHZpYURlZiA9PSB1cHBlclZpYURlZikgewotICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkVmlhQWNjZXNzKHBpblB0ciwgaW5zdFRlcm0sIHBpbk9ianMsIHN0YXJ0TGF5ZXJOdW0sIHN0YXJ0UHQsIHZpYURlZiwgcHJpb3JpdHkpKSB7Ci0gICAgICAgICAgICAgICAgICBhcC5zZXRWYWxpZEFjY2VzcyhmckRpckVudW06OlUsIHRydWUpOwotICAgICAgICAgICAgICAgICAgKytBUENudDsKLSAgICAgICAgICAgICAgICAgICsraW5zdFRlcm1BUENudDsKLSAgICAgICAgICAgICAgICAgICsrYXR0ZW1wdENudDsKLSAgICAgICAgICAgICAgICAgIHByaW9yaXR5MlZpYURlZltwcmlvcml0eV0gPSB2aWFEZWY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGZvciAoYXV0byBtYXBJdCA9IHByaW9yaXR5MlZpYURlZi5iZWdpbigpOyBtYXBJdCAhPSBwcmlvcml0eTJWaWFEZWYuZW5kKCk7ICsrbWFwSXQpIHsKLSAgICAgICAgICAgIGFwLmFkZEFjY2Vzc1ZpYURlZihmckRpckVudW06OlUsIG1hcEl0LT5zZWNvbmQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhcC5oYXNWYWxpZEFjY2VzcygpKSB7Ci0gICAgICAgICAgaGFzVmFsaWRBUCA9IHRydWU7Ci0gICAgICAgICAgaGFzUGluTGF5ZXJBUCA9IHRydWU7Ci0gICAgICAgICAgYXAuYWRkSW5zdHMoaW5zdHMpOwotICAgICAgICAgIHBpblB0ci0+YWRkQWNjZXNzUGF0dGVybih4Zm9ybS5vcmllbnQoKSwgYXApOwotICAgICAgICB9Ci0KLSAgICAgIH0KLSAgICAgIGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6dGltZV9wb2ludCB0MyA9IGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7Ci0gICAgICBhY2N1U3BhbjEgKz0gZHVyYXRpb25fY2FzdDxkdXJhdGlvbjxkb3VibGU+Pih0MiAtIHQxKTsKLSAgICAgIGFjY3VTcGFuMiArPSBkdXJhdGlvbl9jYXN0PGR1cmF0aW9uPGRvdWJsZT4+KHQzIC0gdDIpOwotICAgICAgaWYgKCFoYXNQaW5MYXllckFQKSB7Ci0gICAgICAgIC8vIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgaWYgKHRydWUpIHsKLSAgICAgICAgICBzdGQ6OmNvdXQgPDwgIldhcm5pbmc6ICIgPDwgaW5zdFRlcm0tPmdldEluc3QoKS0+Z2V0TmFtZSgpIDw8ICIvIiA8PCBpbnN0VGVybS0+Z2V0VGVybSgpLT5nZXROYW1lKCkgCi0gICAgICAgICAgICAgICAgICAgIDw8ICIgaGFzIG5vIHZhbGlkIEFQIG9uIGxheWVyICIgPDwgY3VyckxheWVyTnVtIDw8ICIuIENoZWNraW5nIHNoYXBlLWNlbnRlciBhbG9uZyBwcmVmLWRpciBvcHRpb25cbiI7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhcnRQb2ludHMuY2xlYXIoKTsKLSAgICAgICAgaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjp0aW1lX3BvaW50IHQxID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKLSAgICAgICAgZ2V0UGluTGF5ZXJBUFN0YXJ0UG9pbnRzX3NoYXBlQ2VudGVyKGN1cnJMYXllck51bSwgbGF5ZXJQUywgeExvYzJUcmFja1BhdHRlcm5zLCB5TG9jMlRyYWNrUGF0dGVybnMsIHN0YXJ0UG9pbnRzKTsKLSAgICAgICAgaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjp0aW1lX3BvaW50IHQyID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKLSAgICAgICAgYWNjdVNwYW4xICs9IGR1cmF0aW9uX2Nhc3Q8ZHVyYXRpb248ZG91YmxlPj4odDIgLSB0MSk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGF1dG8gJnN0YXJ0UG9pbnQ6IHN0YXJ0UG9pbnRzKSB7Ci0gICAgICAgICAgYXV0byAmc3RhcnRQdCA9IHN0YXJ0UG9pbnQuZmlyc3Q7Ci0gICAgICAgICAgZnJQb2ludCBhcFN0YXJ0UHQgPSBzdGFydFB0OwotICAgICAgICAgIGFwU3RhcnRQdC50cmFuc2Zvcm0ocmV2ZXJ0Q2VsbFhGb3JtKTsKLSAgICAgICAgICBhdXRvICZzdGFydExheWVyTnVtID0gY3VyckxheWVyTnVtOwotICAgICAgICAgIEZsZXhBY2Nlc3NQYXR0ZXJuIGFwOwotICAgICAgICAgIGFwLnNldFBvaW50cyhhcFN0YXJ0UHQsIGFwU3RhcnRQdCk7Ci0gICAgICAgICAgYXAuc2V0QmVnaW5MYXllck51bShzdGFydExheWVyTnVtKTsKLSAgICAgICAgICBhcC5hZGRUb1BpbihwaW4uZ2V0KCkpOwotICAgICAgICAgIC8vYXAuc2V0RW5kTGF5ZXJOdW0oc3RhcnRMYXllck51bSk7Ci0gICAgICAgICAgLy9hcC5zZXRDb3N0KDEpOwotICAgICAgICAgIAotCi0KLSAgICAgICAgICBmclBvaW50IGVuZFB0OwotICAgICAgICAgIC8vIGNoZWNrIHBsYW5hciBhY2Nlc3MKLSAgICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlxuc3RhcnRQdCAoIiA8PCBzdGFydFB0LngoKSAvIGRidSA8PCAiLCAiIDw8IHN0YXJ0UHQueSgpIC8gZGJ1IDw8ICIpXG4iOwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBFCi0gICAgICAgICAgYm9vbCBza2lwRSA9IGZhbHNlOwotICAgICAgICAgIGdldFBsYW5hckVQKHN0YXJ0TGF5ZXJOdW0sIHN0YXJ0UHQsIGZyRGlyRW51bTo6RSwgZW5kUHQpOwotICAgICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiICBFIGVuZFB0IGF0ICgiIDw8IGVuZFB0LngoKSAvIGRidSA8PCAiLCAiIDw8IGVuZFB0LnkoKSAvIGRidSA8PCAiKVxuIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gZm9yIChhdXRvICZvYnNQb2x5OiBsYXllcjJPQlNbc3RhcnRMYXllck51bV0pIHsKLSAgICAgICAgICAvLyAgIGlmIChjb250YWlucyhvYnNQb2x5LCBQb2ludChlbmRQdC54KCksIGVuZFB0LnkoKSkpKSB7Ci0gICAgICAgICAgLy8gICAgIHNraXBFID0gdHJ1ZTsKLSAgICAgICAgICAvLyAgICAgYnJlYWs7Ci0gICAgICAgICAgLy8gICB9Ci0gICAgICAgICAgLy8gfQotICAgICAgICAgIGlmICghc2tpcEUpIHsKLSAgICAgICAgICAgIGlmIChpc01hY3JvIHx8IGlzVmFsaWRQbGFuYXJBY2Nlc3MocGluUHRyLCBpbnN0VGVybSwgcGluT2Jqcywgc3RhcnRMYXllck51bSwgc3RhcnRQdCwgZW5kUHQsIGxheWVyUFMpKSB7Ci0gICAgICAgICAgICAgIGFwLnNldFZhbGlkQWNjZXNzKGZyRGlyRW51bTo6RSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICsrQVBDbnQ7Ci0gICAgICAgICAgICAgICsraW5zdFRlcm1BUENudDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGFwLnNldFZhbGlkQWNjZXNzKGZyRGlyRW51bTo6RSwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBTCi0gICAgICAgICAgYm9vbCBza2lwUyA9IGZhbHNlOwotICAgICAgICAgIGdldFBsYW5hckVQKHN0YXJ0TGF5ZXJOdW0sIHN0YXJ0UHQsIGZyRGlyRW51bTo6UywgZW5kUHQpOwotICAgICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiICBTIGVuZFB0IGF0ICgiIDw8IGVuZFB0LngoKSAvIGRidSA8PCAiLCAiIDw8IGVuZFB0LnkoKSAvIGRidSA8PCAiKVxuIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gZm9yIChhdXRvICZvYnNQb2x5OiBsYXllcjJPQlNbc3RhcnRMYXllck51bV0pIHsKLSAgICAgICAgICAvLyAgIGlmIChjb250YWlucyhvYnNQb2x5LCBQb2ludChlbmRQdC54KCksIGVuZFB0LnkoKSkpKSB7Ci0gICAgICAgICAgLy8gICAgIHNraXBTID0gdHJ1ZTsKLSAgICAgICAgICAvLyAgICAgYnJlYWs7Ci0gICAgICAgICAgLy8gICB9Ci0gICAgICAgICAgLy8gfQotICAgICAgICAgIGlmICghc2tpcFMpIHsKLSAgICAgICAgICAgIGlmIChpc01hY3JvIHx8IGlzVmFsaWRQbGFuYXJBY2Nlc3MocGluUHRyLCBpbnN0VGVybSwgcGluT2Jqcywgc3RhcnRMYXllck51bSwgc3RhcnRQdCwgZW5kUHQsIGxheWVyUFMpKSB7Ci0gICAgICAgICAgICAgIGFwLnNldFZhbGlkQWNjZXNzKGZyRGlyRW51bTo6UywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICsrQVBDbnQ7Ci0gICAgICAgICAgICAgICsraW5zdFRlcm1BUENudDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGFwLnNldFZhbGlkQWNjZXNzKGZyRGlyRW51bTo6UywgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBXCi0gICAgICAgICAgYm9vbCBza2lwVyA9IGZhbHNlOwotICAgICAgICAgIGdldFBsYW5hckVQKHN0YXJ0TGF5ZXJOdW0sIHN0YXJ0UHQsIGZyRGlyRW51bTo6VywgZW5kUHQpOwotICAgICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiICBXIGVuZFB0IGF0ICgiIDw8IGVuZFB0LngoKSAvIGRidSA8PCAiLCAiIDw8IGVuZFB0LnkoKSAvIGRidSA8PCAiKVxuIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gZm9yIChhdXRvICZvYnNQb2x5OiBsYXllcjJPQlNbc3RhcnRMYXllck51bV0pIHsKLSAgICAgICAgICAvLyAgIGlmIChjb250YWlucyhvYnNQb2x5LCBQb2ludChlbmRQdC54KCksIGVuZFB0LnkoKSkpKSB7Ci0gICAgICAgICAgLy8gICAgIHNraXBXID0gdHJ1ZTsKLSAgICAgICAgICAvLyAgICAgYnJlYWs7Ci0gICAgICAgICAgLy8gICB9Ci0gICAgICAgICAgLy8gfQotICAgICAgICAgIGlmICghc2tpcFcpIHsKLSAgICAgICAgICAgIGlmIChpc01hY3JvIHx8IGlzVmFsaWRQbGFuYXJBY2Nlc3MocGluUHRyLCBpbnN0VGVybSwgcGluT2Jqcywgc3RhcnRMYXllck51bSwgc3RhcnRQdCwgZW5kUHQsIGxheWVyUFMpKSB7Ci0gICAgICAgICAgICAgIGFwLnNldFZhbGlkQWNjZXNzKGZyRGlyRW51bTo6VywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICsrQVBDbnQ7Ci0gICAgICAgICAgICAgICsraW5zdFRlcm1BUENudDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGFwLnNldFZhbGlkQWNjZXNzKGZyRGlyRW51bTo6VywgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBOCi0gICAgICAgICAgYm9vbCBza2lwTiA9IGZhbHNlOwotICAgICAgICAgIGdldFBsYW5hckVQKHN0YXJ0TGF5ZXJOdW0sIHN0YXJ0UHQsIGZyRGlyRW51bTo6TiwgZW5kUHQpOwotICAgICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiICBOIGVuZFB0IGF0ICgiIDw8IGVuZFB0LngoKSAvIGRidSA8PCAiLCAiIDw8IGVuZFB0LnkoKSAvIGRidSA8PCAiKVxuIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gZm9yIChhdXRvICZvYnNQb2x5OiBsYXllcjJPQlNbc3RhcnRMYXllck51bV0pIHsKLSAgICAgICAgICAvLyAgIGlmIChjb250YWlucyhvYnNQb2x5LCBQb2ludChlbmRQdC54KCksIGVuZFB0LnkoKSkpKSB7Ci0gICAgICAgICAgLy8gICAgIHNraXBOID0gdHJ1ZTsKLSAgICAgICAgICAvLyAgICAgYnJlYWs7Ci0gICAgICAgICAgLy8gICB9Ci0gICAgICAgICAgLy8gfQotICAgICAgICAgIGlmICghc2tpcE4pIHsKLSAgICAgICAgICAgIGlmIChpc01hY3JvIHx8IGlzVmFsaWRQbGFuYXJBY2Nlc3MocGluUHRyLCBpbnN0VGVybSwgcGluT2Jqcywgc3RhcnRMYXllck51bSwgc3RhcnRQdCwgZW5kUHQsIGxheWVyUFMpKSB7Ci0gICAgICAgICAgICAgIGFwLnNldFZhbGlkQWNjZXNzKGZyRGlyRW51bTo6TiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICsrQVBDbnQ7Ci0gICAgICAgICAgICAgICsraW5zdFRlcm1BUENudDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGFwLnNldFZhbGlkQWNjZXNzKGZyRGlyRW51bTo6TiwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBVCi0gICAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICIgIFVcbiI7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIGlmIChpbnN0LT5nZXRSZWZCbG9jaygpLT5nZXRNYWNyb0NsYXNzKCkgPT0gTWFjcm9DbGFzc0VudW06OkNPUkUgfHwKLSAgICAgICAgICAgICAgaW5zdC0+Z2V0UmVmQmxvY2soKS0+Z2V0TWFjcm9DbGFzcygpID09IE1hY3JvQ2xhc3NFbnVtOjpDT1JFX1RJRUhJR0ggfHwKLSAgICAgICAgICAgICAgaW5zdC0+Z2V0UmVmQmxvY2soKS0+Z2V0TWFjcm9DbGFzcygpID09IE1hY3JvQ2xhc3NFbnVtOjpDT1JFX1RJRUxPVyB8fAotICAgICAgICAgICAgICBpbnN0LT5nZXRSZWZCbG9jaygpLT5nZXRNYWNyb0NsYXNzKCkgPT0gTWFjcm9DbGFzc0VudW06OkNPUkVfQU5URU5OQUNFTEwpIHsKLSAgICAgICAgICAgIC8vIGdldCB2aWEgYWNjZXNzZXMKLSAgICAgICAgICAgIHN0ZDo6bWFwPHZpYVByaW9yaXR5VHVwbGUsIGZyVmlhRGVmKj4gcHJpb3JpdHkyVmlhRGVmOwotICAgICAgICAgICAgYXV0byB1cHBlclZpYURlZiA9IGdldFRlY2goKS0+Z2V0TGF5ZXIoc3RhcnRMYXllck51bSArIDEpLT5nZXREZWZhdWx0VmlhRGVmKCk7Ci0gICAgICAgICAgICB2aWFQcmlvcml0eVR1cGxlIHByaW9yaXR5OwotICAgICAgICAgICAgaWYgKGlzVmFsaWRWaWFBY2Nlc3MocGluUHRyLCBpbnN0VGVybSwgcGluT2Jqcywgc3RhcnRMYXllck51bSwgc3RhcnRQdCwgdXBwZXJWaWFEZWYsIHByaW9yaXR5KSkgewotICAgICAgICAgICAgICBhcC5zZXRWYWxpZEFjY2VzcyhmckRpckVudW06OlUsIHRydWUpOwotICAgICAgICAgICAgICArK0FQQ250OwotICAgICAgICAgICAgICArK2luc3RUZXJtQVBDbnQ7Ci0gICAgICAgICAgICAgIC8vIGFwLmFkZEFjY2Vzc1ZpYURlZihmckRpckVudW06OlUsIHVwcGVyVmlhRGVmKTsKLSAgICAgICAgICAgICAgcHJpb3JpdHkyVmlhRGVmW3ByaW9yaXR5XSA9IHVwcGVyVmlhRGVmOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGF1dG8gbGF5ZXJJdCA9IGxheWVyTnVtMlZpYURlZnMuYmVnaW4oKTsgbGF5ZXJJdCAhPSBsYXllck51bTJWaWFEZWZzLmVuZCgpOyArK2xheWVySXQpIHsKLSAgICAgICAgICAgICAgYXV0byBjdXJyTGF5ZXJOdW0gPSBsYXllckl0LT5maXJzdDsKLSAgICAgICAgICAgICAgaWYgKGN1cnJMYXllck51bSAhPSBzdGFydExheWVyTnVtICsgMSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGF1dG8gJm51bUN1dDJWaWFEZWZzID0gbGF5ZXJJdC0+c2Vjb25kOwotICAgICAgICAgICAgICBpbnQgbnVtQ3V0ID0gLTE7Ci0gICAgICAgICAgICAgIGZvciAoYXV0byBudW1DdXRJdCA9IG51bUN1dDJWaWFEZWZzLmJlZ2luKCk7IG51bUN1dEl0ICE9IG51bUN1dDJWaWFEZWZzLmVuZCgpOyArK251bUN1dEl0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG51bUN1dCAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG51bUN1dCA9IG51bUN1dEl0LT5maXJzdDsKLSAgICAgICAgICAgICAgICBhdXRvICZ2aWFSYXdQcmlvcml0eTJWaWFEZWZzID0gbnVtQ3V0SXQtPnNlY29uZDsKLSAgICAgICAgICAgICAgICBpbnQgYXR0ZW1wdENudCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChhdXRvIHZpYURlZkl0ID0gdmlhUmF3UHJpb3JpdHkyVmlhRGVmcy5iZWdpbigpOyB2aWFEZWZJdCAhPSB2aWFSYXdQcmlvcml0eTJWaWFEZWZzLmVuZCgpOyArK3ZpYURlZkl0KSB7Ci0gICAgICAgICAgICAgICAgICBpZiAoYXR0ZW1wdENudCA+PSBtYXhWaWFBdHRlbXB0TGltaXQpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBhdXRvIHZpYURlZiA9IHZpYURlZkl0LT5zZWNvbmQ7Ci0gICAgICAgICAgICAgICAgICBpZiAoIXZpYURlZi0+Z2V0RGVmYXVsdCgpIHx8IHZpYURlZiA9PSB1cHBlclZpYURlZikgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkVmlhQWNjZXNzKHBpblB0ciwgaW5zdFRlcm0sIHBpbk9ianMsIHN0YXJ0TGF5ZXJOdW0sIHN0YXJ0UHQsIHZpYURlZiwgcHJpb3JpdHkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwLnNldFZhbGlkQWNjZXNzKGZyRGlyRW51bTo6VSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICsrQVBDbnQ7Ci0gICAgICAgICAgICAgICAgICAgICsraW5zdFRlcm1BUENudDsKLSAgICAgICAgICAgICAgICAgICAgKythdHRlbXB0Q250OwotICAgICAgICAgICAgICAgICAgICBwcmlvcml0eTJWaWFEZWZbcHJpb3JpdHldID0gdmlhRGVmOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGF1dG8gbWFwSXQgPSBwcmlvcml0eTJWaWFEZWYuYmVnaW4oKTsgbWFwSXQgIT0gcHJpb3JpdHkyVmlhRGVmLmVuZCgpOyArK21hcEl0KSB7Ci0gICAgICAgICAgICAgIGFwLmFkZEFjY2Vzc1ZpYURlZihmckRpckVudW06OlUsIG1hcEl0LT5zZWNvbmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmIChhcC5oYXNWYWxpZEFjY2VzcygpKSB7Ci0gICAgICAgICAgICBoYXNWYWxpZEFQID0gdHJ1ZTsKLSAgICAgICAgICAgIGhhc1BpbkxheWVyQVAgPSB0cnVlOwotICAgICAgICAgICAgYXAuYWRkSW5zdHMoaW5zdHMpOwotICAgICAgICAgICAgcGluUHRyLT5hZGRBY2Nlc3NQYXR0ZXJuKHhmb3JtLm9yaWVudCgpLCBhcCk7Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjp0aW1lX3BvaW50IHQzID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKLSAgICAgICAgYWNjdVNwYW4yICs9IGR1cmF0aW9uX2Nhc3Q8ZHVyYXRpb248ZG91YmxlPj4odDMgLSB0Mik7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghaGFzUGluTGF5ZXJBUCkgewotICAgICAgICBzdGQ6OmNvdXQgPDwgIldhcm5pbmc6ICIgPDwgaW5zdFRlcm0tPmdldEluc3QoKS0+Z2V0TmFtZSgpIDw8ICIvIiA8PCBpbnN0VGVybS0+Z2V0VGVybSgpLT5nZXROYW1lKCkgCi0gICAgICAgICAgICAgICAgICAgIDw8ICIgaGFzIG5vIHZhbGlkIEFQIG9uIGxheWVyICIgPDwgY3VyckxheWVyTnVtIDw8ICIuIE5lZWQgc2hhcGUtY2VudGVyIG9wdGlvblxuIjsKLSAgICAgIH0KLQotICAgIH0KLQotICB9Ci0gIGlmICghaGFzVmFsaWRBUCkgewotICAgIHN0ZDo6Y291dCA8PCBpbnN0VGVybS0+Z2V0SW5zdCgpLT5nZXROYW1lKCkgPDwgIi8iIDw8IGluc3RUZXJtLT5nZXRUZXJtKCktPmdldE5hbWUoKSA8PCAiIGhhcyBubyB2YWxpZCBBUFxuIjsKLSAgfQotfQotCi12b2lkIEZsZXhQaW5QcmVwOjp0ZXJtUGluUHJlcChmclRlcm0gKnRlcm0pIHsKLSAgYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLSAgLy8gYm9vbCBlbmFibGVPdXRwdXQgPSB0cnVlOwotICAvLyBib29sIGlzUGh5c2ljYWwgPSB0cnVlOwotICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgY291dCA8PCAidGVybVBpblByZXBcbiI7Ci0gIH0KLQotICBkb3VibGUgZGJ1ID0gZ2V0VGVjaCgpLT5nZXREQlVQZXJVVSgpOwotICBzdGQ6OnZlY3RvcjxmckJsb2NrT2JqZWN0Kj4gaW5zdE9ianM7Ci0gIHN0ZDo6c2V0PGZyQmxvY2tPYmplY3QqPiBpbnN0T2JqU2V0OwotICAKLSAgZm9yIChhdXRvICZwaW46IHRlcm0tPmdldFBpbnMoKSkgewotICAgIGF1dG8gcGluUHRyID0gcGluLmdldCgpOwotICAgIG1hcDxmckxheWVyTnVtLCBQb2x5Z29uU2V0PiBsYXllck51bTJQUyA9IHBpblB0ci0+Z2V0TGF5ZXIyUG9seVNldCgpOwotCi0gICAgZm9yIChhdXRvIGxheWVySXQgPSBsYXllck51bTJQUy5iZWdpbigpOyBsYXllckl0ICE9IGxheWVyTnVtMlBTLmVuZCgpOyArK2xheWVySXQpIHsKLSAgICAgIGZyTGF5ZXJOdW0gY3VyckxheWVyTnVtID0gbGF5ZXJJdC0+Zmlyc3Q7Ci0gICAgICBQb2x5Z29uU2V0IGxheWVyUFMgPSBsYXllckl0LT5zZWNvbmQ7Ci0gICAgICBSZWN0YW5nbGUgbGF5ZXJCQm94OwotICAgICAgZXh0ZW50cyhsYXllckJCb3gsIGxheWVyUFMpOwotICAgICAgYm94X3QgbGF5ZXJRdWVyeUJveChwb2ludF90KHhsKGxheWVyQkJveCksIHlsKGxheWVyQkJveCkpLCBwb2ludF90KHhoKGxheWVyQkJveCksIHloKGxheWVyQkJveCkpKTsKLSAgICAgIGF1dG8gcmVnaW9uUXVlcnkgPSBkZXNpZ24tPmdldFJlZ2lvblF1ZXJ5KCk7Ci0gICAgICBzdGQ6OnZlY3RvcjxycV9ycHRyX3ZhbHVlX3Q8ZnJCbG9ja09iamVjdD4gPiBxdWVyeVJlc3VsdDsKLSAgICAgIHJlZ2lvblF1ZXJ5LT5xdWVyeShsYXllclF1ZXJ5Qm94LCBjdXJyTGF5ZXJOdW0sIHF1ZXJ5UmVzdWx0KTsKLSAgICAgIGZvciAoYXV0byAmb2JqUGFpcjogcXVlcnlSZXN1bHQpIHsKLSAgICAgICAgaW5zdE9ialNldC5pbnNlcnQob2JqUGFpci5zZWNvbmQpOwotICAgICAgfQotICAgIH0KLSAgICBmb3IgKGF1dG8gaW5zdE9iajppbnN0T2JqU2V0KSB7Ci0gICAgICBpZiAoaW5zdE9iai0+dHlwZUlkKCkgPT0gZnJjVGVybSkgewotICAgICAgICBpbnN0T2Jqcy5wdXNoX2JhY2soaW5zdE9iaik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAKLSAgZm9yIChhdXRvICZwaW46IHRlcm0tPmdldFBpbnMoKSkgewotICAgIGF1dG8gcGluUHRyID0gcGluLmdldCgpOwotICAgIG1hcDxmckxheWVyTnVtLCBQb2x5Z29uU2V0PiBsYXllck51bTJQUyA9IHBpblB0ci0+Z2V0TGF5ZXIyUG9seVNldCgpOwotICAgIGZvciAoYXV0byBsYXllckl0ID0gbGF5ZXJOdW0yUFMuYmVnaW4oKTsgbGF5ZXJJdCAhPSBsYXllck51bTJQUy5lbmQoKTsgKytsYXllckl0KSB7Ci0gICAgICBtYXA8ZnJDb29yZCwgbWFwPGZyTGF5ZXJOdW0sIGZyVHJhY2tQYXR0ZXJuKj4gPiB4TG9jMlRyYWNrUGF0dGVybnM7IC8vIHRyYWNrIHhDb29yZAotICAgICAgbWFwPGZyQ29vcmQsIG1hcDxmckxheWVyTnVtLCBmclRyYWNrUGF0dGVybio+ID4geUxvYzJUcmFja1BhdHRlcm5zOyAvLyB0cmFjayB5Q29vcmQKLSAgICAgIGZyTGF5ZXJOdW0gY3VyckxheWVyTnVtID0gbGF5ZXJJdC0+Zmlyc3Q7Ci0gICAgICBQb2x5Z29uU2V0IGxheWVyUFMgPSBsYXllck51bTJQU1tjdXJyTGF5ZXJOdW1dOwotICAgICAgbWFwPGZyUG9pbnQsIGludD4gc3RhcnRQb2ludHM7IC8vIHN0YXJ0UG9pbnQgd2l0aCBjb3N0LCBsb3dlciBpcyBtb3JlIHByZWZlcnJhYmxlCi0gICAgICAvLyBzZXQ8cGFpcjxmckxheWVyTnVtLCBmclBvaW50PiA+IGVuZFBvaW50czsKLSAgICAgIC8vIFJlY3RhbmdsZSBsYXllckJCb3ggPSBsYXllck51bTJCQm94W2N1cnJMYXllck51bV07Ci0gICAgICBnZXRQaW5MYXllckJCb3hUcmFja1BhdHRlcm5zKGN1cnJMYXllck51bSwgbGF5ZXJQUywgeExvYzJUcmFja1BhdHRlcm5zLCB5TG9jMlRyYWNrUGF0dGVybnMpOwotICAgICAgZ2V0UGluTGF5ZXJBUFN0YXJ0UG9pbnRzKGN1cnJMYXllck51bSwgbGF5ZXJQUywgeExvYzJUcmFja1BhdHRlcm5zLCB5TG9jMlRyYWNrUGF0dGVybnMsIHN0YXJ0UG9pbnRzKTsKLSAgICAgIC8vIGdldCBhY2Nlc3MgcGF0dGVybiBiYXNlZCBvbiBzdGFydC9lbmQgcG9pbnQgcGFpcgotICAgICAgZm9yIChhdXRvICZzdGFydFBvaW50OiBzdGFydFBvaW50cykgewotICAgICAgICBhdXRvICZzdGFydFB0ID0gc3RhcnRQb2ludC5maXJzdDsKLSAgICAgICAgYXV0byBzdGFydExheWVyTnVtID0gY3VyckxheWVyTnVtOwotICAgICAgICBGbGV4QWNjZXNzUGF0dGVybiBhcDsKLSAgICAgICAgYXAuc2V0UG9pbnRzKHN0YXJ0UHQsIHN0YXJ0UHQpOwotICAgICAgICBhcC5zZXRCZWdpbkxheWVyTnVtKHN0YXJ0TGF5ZXJOdW0pOwotICAgICAgICBhcC5zZXRDb25mbGljdChmYWxzZSk7Ci0gICAgICAgIC8vYXAuc2V0RW5kTGF5ZXJOdW0oc3RhcnRMYXllck51bSk7Ci0gICAgICAgIC8vYXAuc2V0Q29zdCgxKTsKLSAgICAgICAgLy8gYXAuYWRkSW5zdHMoaW5zdHMpOwotCi0gICAgICAgIGZyUG9pbnQgZW5kUHQ7Ci0KLSAgICAgICAgLy8gY2hlY2sgcGxhbmFyIGFjY2VzcwotICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgc3RkOjpjb3V0IDw8ICJcbnN0YXJ0UHQgKCIgPDwgc3RhcnRQdC54KCkgLyBkYnUgPDwgIiwgIiA8PCBzdGFydFB0LnkoKSAvIGRidSA8PCAiKVxuIjsKLSAgICAgICAgfQotICAgICAgICAvLyBFCi0gICAgICAgIAotICAgICAgICBnZXRQbGFuYXJFUChzdGFydExheWVyTnVtLCBzdGFydFB0LCBmckRpckVudW06OkUsIGVuZFB0KTsKLSAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgIHN0ZDo6Y291dCA8PCAiICBFIGVuZFB0IGF0ICgiIDw8IGVuZFB0LngoKSAvIGRidSA8PCAiLCAiIDw8IGVuZFB0LnkoKSAvIGRidSA8PCAiKVxuIjsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNWYWxpZFBsYW5hckFjY2VzcyhwaW5QdHIsIHRlcm0sIGluc3RPYmpzLCBzdGFydExheWVyTnVtLCBzdGFydFB0LCBlbmRQdCwgbGF5ZXJQUykpIHsKLSAgICAgICAgICBhcC5zZXRWYWxpZEFjY2VzcyhmckRpckVudW06OkUsIHRydWUpOwotICAgICAgICAgICsrQVBDbnQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgYXAuc2V0VmFsaWRBY2Nlc3MoZnJEaXJFbnVtOjpFLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gUwotICAgICAgICBnZXRQbGFuYXJFUChzdGFydExheWVyTnVtLCBzdGFydFB0LCBmckRpckVudW06OlMsIGVuZFB0KTsKLSAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgIHN0ZDo6Y291dCA8PCAiICBTIGVuZFB0IGF0ICgiIDw8IGVuZFB0LngoKSAvIGRidSA8PCAiLCAiIDw8IGVuZFB0LnkoKSAvIGRidSA8PCAiKVxuIjsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNWYWxpZFBsYW5hckFjY2VzcyhwaW5QdHIsIHRlcm0sIGluc3RPYmpzLCBzdGFydExheWVyTnVtLCBzdGFydFB0LCBlbmRQdCwgbGF5ZXJQUykpIHsKLSAgICAgICAgICBhcC5zZXRWYWxpZEFjY2VzcyhmckRpckVudW06OlMsIHRydWUpOwotICAgICAgICAgICsrQVBDbnQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgYXAuc2V0VmFsaWRBY2Nlc3MoZnJEaXJFbnVtOjpTLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVwotICAgICAgICBnZXRQbGFuYXJFUChzdGFydExheWVyTnVtLCBzdGFydFB0LCBmckRpckVudW06OlcsIGVuZFB0KTsKLSAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgIHN0ZDo6Y291dCA8PCAiICBXIGVuZFB0IGF0ICgiIDw8IGVuZFB0LngoKSAvIGRidSA8PCAiLCAiIDw8IGVuZFB0LnkoKSAvIGRidSA8PCAiKVxuIjsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNWYWxpZFBsYW5hckFjY2VzcyhwaW5QdHIsIHRlcm0sIGluc3RPYmpzLCBzdGFydExheWVyTnVtLCBzdGFydFB0LCBlbmRQdCwgbGF5ZXJQUykpIHsKLSAgICAgICAgICBhcC5zZXRWYWxpZEFjY2VzcyhmckRpckVudW06OlcsIHRydWUpOwotICAgICAgICAgICsrQVBDbnQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgYXAuc2V0VmFsaWRBY2Nlc3MoZnJEaXJFbnVtOjpXLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTgotICAgICAgICBnZXRQbGFuYXJFUChzdGFydExheWVyTnVtLCBzdGFydFB0LCBmckRpckVudW06Ok4sIGVuZFB0KTsKLSAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgIHN0ZDo6Y291dCA8PCAiICBOIGVuZFB0IGF0ICgiIDw8IGVuZFB0LngoKSAvIGRidSA8PCAiLCAiIDw8IGVuZFB0LnkoKSAvIGRidSA8PCAiKVxuIjsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNWYWxpZFBsYW5hckFjY2VzcyhwaW5QdHIsIHRlcm0sIGluc3RPYmpzLCBzdGFydExheWVyTnVtLCBzdGFydFB0LCBlbmRQdCwgbGF5ZXJQUykpIHsKLSAgICAgICAgICBhcC5zZXRWYWxpZEFjY2VzcyhmckRpckVudW06Ok4sIHRydWUpOwotICAgICAgICAgICsrQVBDbnQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgYXAuc2V0VmFsaWRBY2Nlc3MoZnJEaXJFbnVtOjpOLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFwLmhhc1ZhbGlkQWNjZXNzKCkpIHsKLSAgICAgICAgICBwaW5QdHItPmFkZEFjY2Vzc1BhdHRlcm4oZnJPcmllbnQoZnJjUjApLCBhcCk7Ci0gICAgICAgIH0KLQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi12b2lkIEZsZXhQaW5QcmVwOjpnZXRQaW5MYXllckFQU3RhcnRQb2ludHMoY29uc3QgZnJMYXllck51bSAmY3VyckxheWVyTnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBvbHlnb25TZXQgJmN1cnJMYXllclBTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxmckNvb3JkLCBtYXA8ZnJMYXllck51bSwgZnJUcmFja1BhdHRlcm4qPiA+ICZ4TG9jMlRyYWNrUGF0dGVybnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwPGZyQ29vcmQsIG1hcDxmckxheWVyTnVtLCBmclRyYWNrUGF0dGVybio+ID4gJnlMb2MyVHJhY2tQYXR0ZXJucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8ZnJQb2ludCwgaW50PiAmc3RhcnRQb2ludHMpIHsKLSAgLy8gYm9vbCBlbmFibGVPdXRwdXQgPSB0cnVlOwotICBtYXA8ZnJDb29yZCwgaW50PiB4TG9jMkNvc3QsIHlMb2MyQ29zdDsKLSAgLy8gaW5pdGlhbGl6ZSBsb2MgY29zdAotICAvLyB4Y29zdAotICBmb3IgKGF1dG8geExvY0l0ID0geExvYzJUcmFja1BhdHRlcm5zLmJlZ2luKCk7IHhMb2NJdCAhPSB4TG9jMlRyYWNrUGF0dGVybnMuZW5kKCk7ICsreExvY0l0KSB7Ci0gICAgeExvYzJDb3N0W3hMb2NJdC0+Zmlyc3RdID0gMTsKLSAgfQotCi0gIC8vIHljb3N0Ci0gIGZvciAoYXV0byB5TG9jSXQgPSB5TG9jMlRyYWNrUGF0dGVybnMuYmVnaW4oKTsgeUxvY0l0ICE9IHlMb2MyVHJhY2tQYXR0ZXJucy5lbmQoKTsgKyt5TG9jSXQpIHsKLSAgICB5TG9jMkNvc3RbeUxvY0l0LT5maXJzdF0gPSAxOwotICB9Ci0KLSAgaWYgKGdldFRlY2goKS0+Z2V0TGF5ZXIoY3VyckxheWVyTnVtKS0+Z2V0RGlyKCkgPT0gZnJjVmVydFByZWZSb3V0aW5nRGlyKSB7Ci0gICAgLy8gaWYgdGhlcmUgaXMgb24gZ3JpZCBzdGFydCwgdGhlbiByZXR1cm4KLSAgICBmb3IgKGF1dG8geExvY0l0ID0geExvYzJDb3N0LmJlZ2luKCk7IHhMb2NJdCAhPSB4TG9jMkNvc3QuZW5kKCk7ICsreExvY0l0KSB7Ci0gICAgICBmb3IgKGF1dG8geUxvY0l0ID0geUxvYzJDb3N0LmJlZ2luKCk7IHlMb2NJdCAhPSB5TG9jMkNvc3QuZW5kKCk7ICsreUxvY0l0KSB7Ci0gICAgICAgIFBvaW50IHRlbXBQdCh4TG9jSXQtPmZpcnN0LCB5TG9jSXQtPmZpcnN0KTsKLSAgICAgICAgZm9yIChhdXRvICZwb2x5OiBjdXJyTGF5ZXJQUykgewotICAgICAgICAgIGlmIChjb250YWlucyhwb2x5LCB0ZW1wUHQpKSB7Ci0gICAgICAgICAgICBzdGFydFBvaW50c1tmclBvaW50KHRlbXBQdC54KCksIHRlbXBQdC55KCkpXSA9IDI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIXN0YXJ0UG9pbnRzLmVtcHR5KCkpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLQotICAgIC8vIGFkZCBoYWxmIHBpdGNoIGlmIHBvc3NpYmxlCi0gICAgaWYgKHhMb2MyQ29zdC5zaXplKCkgPiAxKSB7Ci0gICAgICAvLyB4Ci0gICAgICBhdXRvIHhMb2MyQ29zdFRlbXAgPSB4TG9jMkNvc3Q7Ci0gICAgICBhdXRvIHhMb2NOZXh0SXQgPSB4TG9jMkNvc3RUZW1wLmJlZ2luKCk7Ci0gICAgICArK3hMb2NOZXh0SXQ7Ci0gICAgICBmb3IgKGF1dG8geExvY0l0ID0geExvYzJDb3N0VGVtcC5iZWdpbigpOyB4TG9jTmV4dEl0ICE9IHhMb2MyQ29zdFRlbXAuZW5kKCk7ICsreExvY05leHRJdCkgewotICAgICAgICB4TG9jMkNvc3RbKHhMb2NJdC0+Zmlyc3QgKyB4TG9jTmV4dEl0LT5maXJzdCkgLyAyXSA9IHhMb2NJdC0+c2Vjb25kICsgeExvY05leHRJdC0+c2Vjb25kOwotICAgICAgICArK3hMb2NJdDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBnZXQgbG93ZXIgY2VudGVyIGNvb3JkCi0gICAgdmVjdG9yPFJlY3RhbmdsZT4gcmVjdHM7Ci0gICAgZ2V0X21heF9yZWN0YW5nbGVzKHJlY3RzLCBjdXJyTGF5ZXJQUyk7Ci0gICAgZm9yIChhdXRvICZyZWN0OiByZWN0cykgewotICAgICAgUG9pbnQgY2VudGVyUHQ7Ci0gICAgICBib29zdDo6cG9seWdvbjo6Y2VudGVyKGNlbnRlclB0LCByZWN0KTsKLSAgICAgIGlmICh4TG9jMkNvc3QuZmluZChjZW50ZXJQdC54KCkpID09IHhMb2MyQ29zdC5lbmQoKSkgewotICAgICAgICB4TG9jMkNvc3RbY2VudGVyUHQueCgpXSA9IDI7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChhdXRvIHhMb2NJdCA9IHhMb2MyQ29zdC5iZWdpbigpOyB4TG9jSXQgIT0geExvYzJDb3N0LmVuZCgpOyArK3hMb2NJdCkgewotICAgICAgZm9yIChhdXRvIHlMb2NJdCA9IHlMb2MyQ29zdC5iZWdpbigpOyB5TG9jSXQgIT0geUxvYzJDb3N0LmVuZCgpOyArK3lMb2NJdCkgewotICAgICAgICBQb2ludCB0ZW1wUHQoeExvY0l0LT5maXJzdCwgeUxvY0l0LT5maXJzdCk7Ci0gICAgICAgIGZvciAoYXV0byAmcG9seTogY3VyckxheWVyUFMpIHsKLSAgICAgICAgICBpZiAoY29udGFpbnMocG9seSwgdGVtcFB0KSkgewotICAgICAgICAgICAgc3RhcnRQb2ludHNbZnJQb2ludCh0ZW1wUHQueCgpLCB0ZW1wUHQueSgpKV0gPSAyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHN0YXJ0UG9pbnRzLmVtcHR5KCkpIHsKLSAgICAgIGlmICh5TG9jMkNvc3Quc2l6ZSgpID4gMSkgewotICAgICAgICAvLyB5Ci0gICAgICAgIGF1dG8geUxvYzJDb3N0VGVtcCA9IHlMb2MyQ29zdDsKLSAgICAgICAgYXV0byB5TG9jTmV4dEl0ID0geUxvYzJDb3N0VGVtcC5iZWdpbigpOwotICAgICAgICArK3lMb2NOZXh0SXQ7Ci0gICAgICAgIGZvciAoYXV0byB5TG9jSXQgPSB5TG9jMkNvc3RUZW1wLmJlZ2luKCk7IHlMb2NOZXh0SXQgIT0geUxvYzJDb3N0VGVtcC5lbmQoKTsgKyt5TG9jTmV4dEl0KSB7Ci0gICAgICAgICAgeUxvYzJDb3N0Wyh5TG9jSXQtPmZpcnN0ICsgeUxvY05leHRJdC0+Zmlyc3QpIC8gMl0gPSB5TG9jSXQtPnNlY29uZCArIHlMb2NOZXh0SXQtPnNlY29uZDsKLSAgICAgICAgICArK3lMb2NJdDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBnZXQgdXBwZXIgY2VudGVyIGNvb3JkCi0gICAgICBmb3IgKGF1dG8gJnJlY3Q6IHJlY3RzKSB7Ci0gICAgICAgIFBvaW50IGNlbnRlclB0OwotICAgICAgICBib29zdDo6cG9seWdvbjo6Y2VudGVyKGNlbnRlclB0LCByZWN0KTsKLSAgICAgICAgaWYgKHlMb2MyQ29zdC5maW5kKGNlbnRlclB0LnkoKSkgPT0geUxvYzJDb3N0LmVuZCgpKSB7Ci0gICAgICAgICAgeUxvYzJDb3N0W2NlbnRlclB0LnkoKV0gPSAyOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoYXV0byB4TG9jSXQgPSB4TG9jMkNvc3QuYmVnaW4oKTsgeExvY0l0ICE9IHhMb2MyQ29zdC5lbmQoKTsgKyt4TG9jSXQpIHsKLSAgICAgICAgZm9yIChhdXRvIHlMb2NJdCAgPSB5TG9jMkNvc3QuYmVnaW4oKTsgeUxvY0l0ICE9IHlMb2MyQ29zdC5lbmQoKTsgKyt5TG9jSXQpIHsKLSAgICAgICAgICBQb2ludCB0ZW1wUHQoeExvY0l0LT5maXJzdCwgeUxvY0l0LT5maXJzdCk7Ci0gICAgICAgICAgZm9yIChhdXRvICZwb2x5OiBjdXJyTGF5ZXJQUykgewotICAgICAgICAgICAgaWYgKGNvbnRhaW5zKHBvbHksIHRlbXBQdCkpIHsKLSAgICAgICAgICAgICAgc3RhcnRQb2ludHNbZnJQb2ludCh0ZW1wUHQueCgpLCB0ZW1wUHQueSgpKV0gPSAyOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgIH0KLSAgfSBlbHNlIGlmIChnZXRUZWNoKCktPmdldExheWVyKGN1cnJMYXllck51bSktPmdldERpcigpID09IGZyY0hvcnpQcmVmUm91dGluZ0RpcikgewotICAgIC8vIGlmIHRoZXJlIGlzIG9uIGdyaWQgc3RhcnQsIHRoZW4gcmV0dXJuCi0gICAgZm9yIChhdXRvIHhMb2NJdCA9IHhMb2MyQ29zdC5iZWdpbigpOyB4TG9jSXQgIT0geExvYzJDb3N0LmVuZCgpOyArK3hMb2NJdCkgewotICAgICAgZm9yIChhdXRvIHlMb2NJdCA9IHlMb2MyQ29zdC5iZWdpbigpOyB5TG9jSXQgIT0geUxvYzJDb3N0LmVuZCgpOyArK3lMb2NJdCkgewotICAgICAgICBQb2ludCB0ZW1wUHQoeExvY0l0LT5maXJzdCwgeUxvY0l0LT5maXJzdCk7Ci0gICAgICAgIGZvciAoYXV0byAmcG9seTogY3VyckxheWVyUFMpIHsKLSAgICAgICAgICBpZiAoY29udGFpbnMocG9seSwgdGVtcFB0KSkgewotICAgICAgICAgICAgc3RhcnRQb2ludHNbZnJQb2ludCh0ZW1wUHQueCgpLCB0ZW1wUHQueSgpKV0gPSAyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFzdGFydFBvaW50cy5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gYWRkIGhhbGYgcGl0Y2ggaWYgcG9zc2libGUKLSAgICBpZiAoeUxvYzJDb3N0LnNpemUoKSA+IDEpIHsKLSAgICAgIC8vIHkKLSAgICAgIGF1dG8geUxvYzJDb3N0VGVtcCA9IHlMb2MyQ29zdDsKLSAgICAgIGF1dG8geUxvY05leHRJdCA9IHlMb2MyQ29zdFRlbXAuYmVnaW4oKTsKLSAgICAgICsreUxvY05leHRJdDsKLSAgICAgIGZvciAoYXV0byB5TG9jSXQgPSB5TG9jMkNvc3RUZW1wLmJlZ2luKCk7IHlMb2NOZXh0SXQgIT0geUxvYzJDb3N0VGVtcC5lbmQoKTsgKyt5TG9jTmV4dEl0KSB7Ci0gICAgICAgIHlMb2MyQ29zdFsoeUxvY0l0LT5maXJzdCArIHlMb2NOZXh0SXQtPmZpcnN0KSAvIDJdID0geUxvY0l0LT5zZWNvbmQgKyB5TG9jTmV4dEl0LT5zZWNvbmQ7Ci0gICAgICAgICsreUxvY0l0OwotICAgICAgfQotICAgIH0KLQotICAgIC8vIGdldCBsb3dlciBjZW50ZXIgY29vcmQKLSAgICB2ZWN0b3I8UmVjdGFuZ2xlPiByZWN0czsKLSAgICBnZXRfbWF4X3JlY3RhbmdsZXMocmVjdHMsIGN1cnJMYXllclBTKTsKLSAgICBmb3IgKGF1dG8gJnJlY3Q6IHJlY3RzKSB7Ci0gICAgICBQb2ludCBjZW50ZXJQdDsKLSAgICAgIGJvb3N0Ojpwb2x5Z29uOjpjZW50ZXIoY2VudGVyUHQsIHJlY3QpOwotICAgICAgaWYgKHlMb2MyQ29zdC5maW5kKGNlbnRlclB0LnkoKSkgPT0geUxvYzJDb3N0LmVuZCgpKSB7Ci0gICAgICAgIHlMb2MyQ29zdFtjZW50ZXJQdC55KCldID0gMjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGF1dG8geExvY0l0ID0geExvYzJDb3N0LmJlZ2luKCk7IHhMb2NJdCAhPSB4TG9jMkNvc3QuZW5kKCk7ICsreExvY0l0KSB7Ci0gICAgICBmb3IgKGF1dG8geUxvY0l0ID0geUxvYzJDb3N0LmJlZ2luKCk7IHlMb2NJdCAhPSB5TG9jMkNvc3QuZW5kKCk7ICsreUxvY0l0KSB7Ci0gICAgICAgIFBvaW50IHRlbXBQdCh4TG9jSXQtPmZpcnN0LCB5TG9jSXQtPmZpcnN0KTsKLSAgICAgICAgZm9yIChhdXRvICZwb2x5OiBjdXJyTGF5ZXJQUykgewotICAgICAgICAgIGlmIChjb250YWlucyhwb2x5LCB0ZW1wUHQpKSB7Ci0gICAgICAgICAgICBzdGFydFBvaW50c1tmclBvaW50KHRlbXBQdC54KCksIHRlbXBQdC55KCkpXSA9IDI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoc3RhcnRQb2ludHMuZW1wdHkoKSkgewotICAgICAgaWYgKHlMb2MyQ29zdC5zaXplKCkgPiAxKSB7Ci0gICAgICAgIC8vIHgKLSAgICAgICAgYXV0byB4TG9jMkNvc3RUZW1wID0geExvYzJDb3N0OwotICAgICAgICBhdXRvIHhMb2NOZXh0SXQgPSB4TG9jMkNvc3RUZW1wLmJlZ2luKCk7Ci0gICAgICAgICsreExvY05leHRJdDsKLSAgICAgICAgZm9yIChhdXRvIHhMb2NJdCA9IHhMb2MyQ29zdFRlbXAuYmVnaW4oKTsgeExvY05leHRJdCAhPSB4TG9jMkNvc3RUZW1wLmVuZCgpOyArK3hMb2NOZXh0SXQpIHsKLSAgICAgICAgICB4TG9jMkNvc3RbKHhMb2NJdC0+Zmlyc3QgKyB4TG9jTmV4dEl0LT5maXJzdCkgLyAyXSA9IHhMb2NJdC0+c2Vjb25kICsgeExvY05leHRJdC0+c2Vjb25kOwotICAgICAgICAgICsreExvY0l0OwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIGdldCB1cHBlciBjZW50ZXIgY29vcmQKLSAgICAgIGZvciAoYXV0byAmcmVjdDogcmVjdHMpIHsKLSAgICAgICAgUG9pbnQgY2VudGVyUHQ7Ci0gICAgICAgIGJvb3N0Ojpwb2x5Z29uOjpjZW50ZXIoY2VudGVyUHQsIHJlY3QpOwotICAgICAgICBpZiAoeExvYzJDb3N0LmZpbmQoY2VudGVyUHQueCgpKSA9PSB4TG9jMkNvc3QuZW5kKCkpIHsKLSAgICAgICAgICB4TG9jMkNvc3RbY2VudGVyUHQueCgpXSA9IDI7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZm9yIChhdXRvIHhMb2NJdCA9IHhMb2MyQ29zdC5iZWdpbigpOyB4TG9jSXQgIT0geExvYzJDb3N0LmVuZCgpOyArK3hMb2NJdCkgewotICAgICAgICBmb3IgKGF1dG8geUxvY0l0ICA9IHlMb2MyQ29zdC5iZWdpbigpOyB5TG9jSXQgIT0geUxvYzJDb3N0LmVuZCgpOyArK3lMb2NJdCkgewotICAgICAgICAgIFBvaW50IHRlbXBQdCh4TG9jSXQtPmZpcnN0LCB5TG9jSXQtPmZpcnN0KTsKLSAgICAgICAgICBmb3IgKGF1dG8gJnBvbHk6IGN1cnJMYXllclBTKSB7Ci0gICAgICAgICAgICBpZiAoY29udGFpbnMocG9seSwgdGVtcFB0KSkgewotICAgICAgICAgICAgICBzdGFydFBvaW50c1tmclBvaW50KHRlbXBQdC54KCksIHRlbXBQdC55KCkpXSA9IDI7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmIChzdGFydFBvaW50cy5lbXB0eSgpKSB7Ci0gICAgc3RkOjpjb3V0IDw8ICJFcnJvcjogbm8gc3RhcnQgcG9pbnQgZ2VuZXJhdGVkXG4iOwotICB9Ci0gIHJldHVybjsKLX0KLQotdm9pZCBGbGV4UGluUHJlcDo6Z2V0UGluTGF5ZXJBUFN0YXJ0UG9pbnRzX3NoYXBlQ2VudGVyKGNvbnN0IGZyTGF5ZXJOdW0gJmN1cnJMYXllck51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQb2x5Z29uU2V0ICZjdXJyTGF5ZXJQUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8ZnJDb29yZCwgbWFwPGZyTGF5ZXJOdW0sIGZyVHJhY2tQYXR0ZXJuKj4gPiAmeExvYzJUcmFja1BhdHRlcm5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxmckNvb3JkLCBtYXA8ZnJMYXllck51bSwgZnJUcmFja1BhdHRlcm4qPiA+ICZ5TG9jMlRyYWNrUGF0dGVybnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwPGZyUG9pbnQsIGludD4gJnN0YXJ0UG9pbnRzKSB7Ci0gIGZyUHJlZlJvdXRpbmdEaXJFbnVtIGN1cnJEaXIgPSBnZXRUZWNoKCktPmdldExheWVyKGN1cnJMYXllck51bSktPmdldERpcigpOwotICAvLyBib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIG1hcDxmckNvb3JkLCBpbnQ+IHhMb2MyQ29zdCwgeUxvYzJDb3N0OwotICAvLyBpbml0aWFsaXplIGxvYyBjb3N0Ci0gIHN0ZDo6dmVjdG9yPFJlY3RhbmdsZT4gcmVjdHM7Ci0gIGdldF9tYXhfcmVjdGFuZ2xlcyhyZWN0cywgY3VyckxheWVyUFMpOwotICAvLyB4Y29zdAotICBpZiAoY3VyckRpciA9PSBmcmNIb3J6UHJlZlJvdXRpbmdEaXIpIHsKLSAgICBmb3IgKGF1dG8geExvY0l0ID0geExvYzJUcmFja1BhdHRlcm5zLmJlZ2luKCk7IHhMb2NJdCAhPSB4TG9jMlRyYWNrUGF0dGVybnMuZW5kKCk7ICsreExvY0l0KSB7Ci0gICAgICB4TG9jMkNvc3RbeExvY0l0LT5maXJzdF0gPSAxOwotICAgIH0KLSAgICAvLyBzaGFwZSBjZW50ZXIKLSAgICBmb3IgKGF1dG8gJnJlY3Q6IHJlY3RzKSB7Ci0gICAgICBQb2ludCBjZW50ZXJQdDsKLSAgICAgIGNlbnRlcihjZW50ZXJQdCwgcmVjdCk7Ci0gICAgICB5TG9jMkNvc3RbY2VudGVyUHQueSgpXSA9IDE7Ci0gICAgfQotICB9Ci0KLSAgLy8geWNvc3QKLSAgaWYgKGN1cnJEaXIgPT0gZnJjVmVydFByZWZSb3V0aW5nRGlyKSB7Ci0gICAgZm9yIChhdXRvIHlMb2NJdCA9IHlMb2MyVHJhY2tQYXR0ZXJucy5iZWdpbigpOyB5TG9jSXQgIT0geUxvYzJUcmFja1BhdHRlcm5zLmVuZCgpOyArK3lMb2NJdCkgewotICAgICAgeUxvYzJDb3N0W3lMb2NJdC0+Zmlyc3RdID0gMTsKLSAgICB9Ci0gICAgLy8gc2hhcGUgY2VudGVyCi0gICAgZm9yIChhdXRvICZyZWN0OiByZWN0cykgewotICAgICAgUG9pbnQgY2VudGVyUHQ7Ci0gICAgICBjZW50ZXIoY2VudGVyUHQsIHJlY3QpOwotICAgICAgeExvYzJDb3N0W2NlbnRlclB0LngoKV0gPSAxOwotICAgIH0KLSAgfQotCi0gIGZvciAoYXV0byB4TG9jSXQgPSB4TG9jMkNvc3QuYmVnaW4oKTsgeExvY0l0ICE9IHhMb2MyQ29zdC5lbmQoKTsgKyt4TG9jSXQpIHsKLSAgICBmb3IgKGF1dG8geUxvY0l0ID0geUxvYzJDb3N0LmJlZ2luKCk7IHlMb2NJdCAhPSB5TG9jMkNvc3QuZW5kKCk7ICsreUxvY0l0KSB7Ci0gICAgICBQb2ludCB0ZW1wUHQoeExvY0l0LT5maXJzdCwgeUxvY0l0LT5maXJzdCk7Ci0gICAgICBmb3IgKGF1dG8gJnBvbHk6IGN1cnJMYXllclBTKSB7Ci0gICAgICAgIGlmIChjb250YWlucyhwb2x5LCB0ZW1wUHQpKSB7Ci0gICAgICAgICAgc3RhcnRQb2ludHNbZnJQb2ludCh0ZW1wUHQueCgpLCB0ZW1wUHQueSgpKV0gPSAyOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKHN0YXJ0UG9pbnRzLmVtcHR5KCkpIHsKLSAgICBzdGQ6OmNvdXQgPDwgIkVycm9yOiBubyBzdGFydCBwb2ludCBnZW5lcmF0ZWRcbiI7Ci0gIH0KLSAgcmV0dXJuOwotfQotCi12b2lkIEZsZXhQaW5QcmVwOjpnZXRQaW5MYXllckJCb3hUcmFja1BhdHRlcm5zKGNvbnN0IGZyTGF5ZXJOdW0gJmN1cnJMYXllck51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUG9seWdvblNldCAmY3VyckxheWVyUFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxmckNvb3JkLCBtYXA8ZnJMYXllck51bSwgZnJUcmFja1BhdHRlcm4qPiA+ICZ4TG9jMlRyYWNrUGF0dGVybnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxmckNvb3JkLCBtYXA8ZnJMYXllck51bSwgZnJUcmFja1BhdHRlcm4qPiA+ICZ5TG9jMlRyYWNrUGF0dGVybnMpIHsKLSAgbWFwPGZyTGF5ZXJOdW0sIHNldDxmckNvb3JkPiA+IGxheWVyTnVtMlRyYWNrTG9jczsKLSAgZnJMYXllck51bSBuZXh0TGF5ZXJOdW0gPSAtMTsKLSAgaWYgKGN1cnJMYXllck51bSArIDIgPCBpbnQoZ2V0VGVjaCgpLT5nZXRMYXllcnMoKS5zaXplKCkpKSB7Ci0gICAgbmV4dExheWVyTnVtID0gY3VyckxheWVyTnVtICsgMjsKLSAgfSBlbHNlIGlmIChjdXJyTGF5ZXJOdW0gLSAyID49IDApIHsKLSAgICBuZXh0TGF5ZXJOdW0gPSBjdXJyTGF5ZXJOdW0gLSAyOwotICB9IGVsc2UgewotICAgIGNvdXQgPDwgIkVycm9yOiBDdXJyZW50IERlc2lnbiBoYXMgb25seSBvbmUgbWV0YWwgbGF5ZXIgaW4gZ2V0UGluTGF5ZXJCQm94VHJhY2tQYXR0ZXJuc1xuIjsKLSAgICByZXR1cm47Ci0gIH0KLSAgLy8gY291dCA8PCAiIGdldFBpbkxheWVyQkJveFRyYWNrUGF0dGVybnMgIiA8PCBjdXJyTGF5ZXJOdW0gPDwgIiAiIDw8IG5leHRMYXllck51bSA8PCAiXG4iOwotICBhdXRvIGN1cnJMYXllciA9IGdldFRlY2goKS0+Z2V0TGF5ZXIoY3VyckxheWVyTnVtKTsKLSAgYXV0byBuZXh0TGF5ZXIgPSBnZXRUZWNoKCktPmdldExheWVyKG5leHRMYXllck51bSk7Ci0gIC8vIGNvdXQgPDwgIiB4eHgwXG4iOwotICBmclByZWZSb3V0aW5nRGlyRW51bSBjdXJyUHJlZlJvdXRlRGlyID0gY3VyckxheWVyLT5nZXREaXIoKTsKLSAgZnJQcmVmUm91dGluZ0RpckVudW0gbmV4dFByZWZSb3V0ZURpciA9IG5leHRMYXllci0+Z2V0RGlyKCk7Ci0gIC8vIGNvdXQgPDwgIiB4eHgxXG4iOwotICBhdXRvIGN1cnJMYXllclBpdGNoID0gY3VyckxheWVyLT5nZXRQaXRjaCgpOwotICBhdXRvIG5leHRMYXllclBpdGNoID0gbmV4dExheWVyLT5nZXRQaXRjaCgpOwotICAvLyBjb3V0IDw8ICIgeHh4MlxuIjsKLSAgUmVjdGFuZ2xlIGJsb2F0QkJveDsKLSAgZXh0ZW50cyhibG9hdEJCb3gsIGN1cnJMYXllclBTKTsKLSAgLy8gYmxvYXRCQm94ID0gYmxvYXQoYmxvYXRCQm94LCBjdXJyTGF5ZXJQaXRjaCk7Ci0gIGZyQm94IGJib3goeGwoYmxvYXRCQm94KSwgeWwoYmxvYXRCQm94KSwgeGgoYmxvYXRCQm94KSwgeWgoYmxvYXRCQm94KSk7Ci0gIC8vIGdldCBwcmVmIGRpciB0cmFja3MgCi0gIHdoaWxlIChsYXllck51bTJUcmFja0xvY3MuZmluZChjdXJyTGF5ZXJOdW0pID09IGxheWVyTnVtMlRyYWNrTG9jcy5lbmQoKSkgewotICAgIGZvciAoYXV0byAmdHA6IGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXRUcmFja1BhdHRlcm5zKGN1cnJMYXllck51bSkpIHsKLSAgICAgIGlmICh0cC0+aXNIb3Jpem9udGFsKCkgICYmIGN1cnJQcmVmUm91dGVEaXIgPT0gZnJjVmVydFByZWZSb3V0aW5nRGlyIHx8Ci0gICAgICAgICAgIXRwLT5pc0hvcml6b250YWwoKSAmJiBjdXJyUHJlZlJvdXRlRGlyID09IGZyY0hvcnpQcmVmUm91dGluZ0RpcikgewotICAgICAgICBpbnQgbWluVHJhY2tOdW0sIG1heFRyYWNrTnVtOwotICAgICAgICBmckNvb3JkIGxvd2VyQ29vcmQgPSAodHAtPmlzSG9yaXpvbnRhbCgpID8gYmJveC5sZWZ0KCkgOiBiYm94LmJvdHRvbSgpKTsKLSAgICAgICAgZnJDb29yZCB1cHBlckNvb3JkID0gKHRwLT5pc0hvcml6b250YWwoKSA/IGJib3gucmlnaHQoKSA6IGJib3gudG9wKCkpOwotICAgICAgICBtaW5UcmFja051bSA9IChsb3dlckNvb3JkIC0gdHAtPmdldFN0YXJ0Q29vcmQoKSkgLyAoaW50KXRwLT5nZXRUcmFja1NwYWNpbmcoKTsKLSAgICAgICAgaWYgKG1pblRyYWNrTnVtICogKGludCl0cC0+Z2V0VHJhY2tTcGFjaW5nKCkgKyB0cC0+Z2V0U3RhcnRDb29yZCgpIDwgbG93ZXJDb29yZCkgewotICAgICAgICAgICsrbWluVHJhY2tOdW07Ci0gICAgICAgIH0KLSAgICAgICAgbWF4VHJhY2tOdW0gPSAodXBwZXJDb29yZCAtIHRwLT5nZXRTdGFydENvb3JkKCkpIC8gKGludCl0cC0+Z2V0VHJhY2tTcGFjaW5nKCk7Ci0gICAgICAgIGlmIChtYXhUcmFja051bSAqIChpbnQpdHAtPmdldFRyYWNrU3BhY2luZygpICsgdHAtPmdldFN0YXJ0Q29vcmQoKSA+IHVwcGVyQ29vcmQpIHsKLSAgICAgICAgICAtLW1heFRyYWNrTnVtOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNvdXQgPDwgIm1pblRyYWNrTnVtIC8gbWF4VHJhY2tOdW0gPSAiIDw8IG1pblRyYWNrTnVtIDw8ICIgLyAiIDw8IG1heFRyYWNrTnVtIDw8ICJcbiI7Ci0KLQotICAgICAgICBmb3IgKGludCB0cmFja051bSA9IG1pblRyYWNrTnVtOyB0cmFja051bSA8PSBtYXhUcmFja051bTsgKyt0cmFja051bSkgewotICAgICAgICAgIGZyQ29vcmQgdHJhY2tMb2MgPSB0cmFja051bSAqIHRwLT5nZXRUcmFja1NwYWNpbmcoKSArIHRwLT5nZXRTdGFydENvb3JkKCk7Ci0gICAgICAgICAgaWYgKHRwLT5pc0hvcml6b250YWwoKSkgewotICAgICAgICAgICAgeExvYzJUcmFja1BhdHRlcm5zW3RyYWNrTG9jXVtjdXJyTGF5ZXJOdW1dID0gdHAuZ2V0KCk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHlMb2MyVHJhY2tQYXR0ZXJuc1t0cmFja0xvY11bY3VyckxheWVyTnVtXSA9IHRwLmdldCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBsYXllck51bTJUcmFja0xvY3NbY3VyckxheWVyTnVtXS5pbnNlcnQodHJhY2tMb2MpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIGJsb2F0IHRoZSBiYm94IGlmIHRoZXJlIGlzIG5vIHRyYWNrIGZvdW5kIGluIHRoZSBjdXJyZW50IGJib3g7Ci0gICAgYmxvYXRCQm94ID0gYmxvYXQoYmxvYXRCQm94LCBjdXJyTGF5ZXJQaXRjaCk7Ci0gICAgYmJveCA9IGZyQm94KHhsKGJsb2F0QkJveCksIHlsKGJsb2F0QkJveCksIHhoKGJsb2F0QkJveCksIHloKGJsb2F0QkJveCkpOwotICB9Ci0KLSAgZXh0ZW50cyhibG9hdEJCb3gsIGN1cnJMYXllclBTKTsKLSAgLy8gYmxvYXRCQm94ID0gYmxvYXQoYmxvYXRCQm94LCBuZXh0TGF5ZXJQaXRjaCk7Ci0gIGJib3ggPSBmckJveCh4bChibG9hdEJCb3gpLCB5bChibG9hdEJCb3gpLCB4aChibG9hdEJCb3gpLCB5aChibG9hdEJCb3gpKTsKLSAgd2hpbGUgKGxheWVyTnVtMlRyYWNrTG9jcy5maW5kKG5leHRMYXllck51bSkgPT0gbGF5ZXJOdW0yVHJhY2tMb2NzLmVuZCgpKSB7Ci0gICAgZm9yIChhdXRvICZ0cDogZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldFRyYWNrUGF0dGVybnMobmV4dExheWVyTnVtKSkgewotICAgICAgaWYgKHRwLT5pc0hvcml6b250YWwoKSAgJiYgbmV4dFByZWZSb3V0ZURpciA9PSBmcmNWZXJ0UHJlZlJvdXRpbmdEaXIgfHwKLSAgICAgICAgICAhdHAtPmlzSG9yaXpvbnRhbCgpICYmIG5leHRQcmVmUm91dGVEaXIgPT0gZnJjSG9yelByZWZSb3V0aW5nRGlyKSB7Ci0gICAgICAgIGludCBtaW5UcmFja051bSwgbWF4VHJhY2tOdW07Ci0gICAgICAgIGZyQ29vcmQgbG93ZXJDb29yZCA9ICh0cC0+aXNIb3Jpem9udGFsKCkgPyBiYm94LmxlZnQoKSA6IGJib3guYm90dG9tKCkpOwotICAgICAgICBmckNvb3JkIHVwcGVyQ29vcmQgPSAodHAtPmlzSG9yaXpvbnRhbCgpID8gYmJveC5yaWdodCgpIDogYmJveC50b3AoKSk7Ci0gICAgICAgIG1pblRyYWNrTnVtID0gKGxvd2VyQ29vcmQgLSB0cC0+Z2V0U3RhcnRDb29yZCgpKSAvIChpbnQpdHAtPmdldFRyYWNrU3BhY2luZygpOwotICAgICAgICBpZiAobWluVHJhY2tOdW0gKiAoaW50KXRwLT5nZXRUcmFja1NwYWNpbmcoKSArIHRwLT5nZXRTdGFydENvb3JkKCkgPCBsb3dlckNvb3JkKSB7Ci0gICAgICAgICAgKyttaW5UcmFja051bTsKLSAgICAgICAgfQotICAgICAgICBtYXhUcmFja051bSA9ICh1cHBlckNvb3JkIC0gdHAtPmdldFN0YXJ0Q29vcmQoKSkgLyAoaW50KXRwLT5nZXRUcmFja1NwYWNpbmcoKTsKLSAgICAgICAgaWYgKG1heFRyYWNrTnVtICogKGludCl0cC0+Z2V0VHJhY2tTcGFjaW5nKCkgKyB0cC0+Z2V0U3RhcnRDb29yZCgpID4gdXBwZXJDb29yZCkgewotICAgICAgICAgIC0tbWF4VHJhY2tOdW07Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGZvciAoaW50IHRyYWNrTnVtID0gbWluVHJhY2tOdW07IHRyYWNrTnVtIDw9IG1heFRyYWNrTnVtOyArK3RyYWNrTnVtKSB7Ci0gICAgICAgICAgZnJDb29yZCB0cmFja0xvYyA9IHRyYWNrTnVtICogdHAtPmdldFRyYWNrU3BhY2luZygpICsgdHAtPmdldFN0YXJ0Q29vcmQoKTsKLSAgICAgICAgICBpZiAodHAtPmlzSG9yaXpvbnRhbCgpKSB7Ci0gICAgICAgICAgICB4TG9jMlRyYWNrUGF0dGVybnNbdHJhY2tMb2NdW25leHRMYXllck51bV0gPSB0cC5nZXQoKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgeUxvYzJUcmFja1BhdHRlcm5zW3RyYWNrTG9jXVtuZXh0TGF5ZXJOdW1dID0gdHAuZ2V0KCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGxheWVyTnVtMlRyYWNrTG9jc1tuZXh0TGF5ZXJOdW1dLmluc2VydCh0cmFja0xvYyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gYmxvYXQgdGhlIGJib3ggaWYgdGhlcmUgaXMgbm8gdHJhY2sgZm91bmQgaW4gdGhlIGN1cnJlbnQgYmJveDsKLSAgICBibG9hdEJCb3ggPSBibG9hdChibG9hdEJCb3gsIG5leHRMYXllclBpdGNoKTsKLSAgICBiYm94ID0gZnJCb3goeGwoYmxvYXRCQm94KSwgeWwoYmxvYXRCQm94KSwgeGgoYmxvYXRCQm94KSwgeWgoYmxvYXRCQm94KSk7Ci0gIH0KLQotfQotCi0KLXZvaWQgRmxleFBpblByZXA6OmdldFBpbkxheWVyQkJveChjb25zdCBtYXA8ZnJMYXllck51bSwgUG9seWdvblNldD4gJmxheWVyTnVtMlBTLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8ZnJMYXllck51bSwgUmVjdGFuZ2xlPiAmbGF5ZXJOdW0yQkJveCkgewotICBmb3IgKGF1dG8gbWFwSXQgPSBsYXllck51bTJQUy5iZWdpbigpOyBtYXBJdCAhPSBsYXllck51bTJQUy5lbmQoKTsgKyttYXBJdCkgewotICAgIGF1dG8gY3VyckxheWVyTnVtID0gbWFwSXQtPmZpcnN0OwotICAgIFJlY3RhbmdsZSBsYXllckJCb3g7Ci0gICAgaWYgKGV4dGVudHMobGF5ZXJCQm94LCBtYXBJdC0+c2Vjb25kKSkgewotICAgICAgbGF5ZXJOdW0yQkJveFtjdXJyTGF5ZXJOdW1dID0gbGF5ZXJCQm94OwotICAgIH0KLSAgfQotfQotCi12b2lkIEZsZXhQaW5QcmVwOjptZXJnZVBpblNoYXBlcyhmclBpbiogcGluLCBmclRyYW5zZm9ybSAmeGZvcm0sIG1hcDxmckxheWVyTnVtLCBQb2x5Z29uU2V0PiAmbGF5ZXJOdW0yUFMpIHsKLSAgYXV0byBwaW5MYXllcjJQb2x5U2V0ID0gcGluLT5nZXRMYXllcjJQb2x5U2V0KCk7Ci0gIGZvciAoYXV0byBsYXllckl0ID0gcGluTGF5ZXIyUG9seVNldC5iZWdpbigpOyBsYXllckl0ICE9IHBpbkxheWVyMlBvbHlTZXQuZW5kKCk7ICsrbGF5ZXJJdCkgewotICAgIGF1dG8gJmxheWVyTnVtID0gbGF5ZXJJdC0+Zmlyc3Q7Ci0gICAgYXV0byAmcG9seVNldCA9IGxheWVySXQtPnNlY29uZDsKLSAgICBmb3IgKGF1dG8gJnBvbHk6IHBvbHlTZXQpIHsKLSAgICAgIHN0ZDo6dmVjdG9yPFBvaW50PiB0cmFuc2Zvcm1lZFBvaW50czsKLSAgICAgIGZvciAoYXV0byBpdCA9IGJvb3N0Ojpwb2x5Z29uOjpiZWdpbl9wb2ludHMocG9seSk7IGl0ICE9IGJvb3N0Ojpwb2x5Z29uOjplbmRfcG9pbnRzKHBvbHkpOyArK2l0KSB7Ci0gICAgICAgIGZyUG9pbnQgdG1wUHQoKCppdCkueCgpLCAoKml0KS55KCkpOwotICAgICAgICB0bXBQdC50cmFuc2Zvcm0oeGZvcm0pOwotICAgICAgICB0cmFuc2Zvcm1lZFBvaW50cy5wdXNoX2JhY2soUG9pbnQodG1wUHQueCgpLCB0bXBQdC55KCkpKTsKLSAgICAgICAgLy8gc3RkOjpjb3V0IDw8ICIoIiA8PCB0bXBQdC54KCkgPDwgIiwgIiA8PCB0bXBQdC55KCkgPDwgIilcbiI7Ci0gICAgICB9Ci0gICAgICBQb2x5Z29uIHRtcFBvbHk7Ci0gICAgICBib29zdDo6cG9seWdvbjo6c2V0X3BvaW50cyh0bXBQb2x5LCB0cmFuc2Zvcm1lZFBvaW50cy5iZWdpbigpLCB0cmFuc2Zvcm1lZFBvaW50cy5lbmQoKSk7Ci0gICAgICBsYXllck51bTJQU1tsYXllck51bV0gKz0gdG1wUG9seTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBGbGV4UGluUHJlcDo6bWVyZ2VQaW5TaGFwZXMoZnJQaW4qIHBpbiwgbWFwPGZyTGF5ZXJOdW0sIFBvbHlnb25TZXQ+ICZsYXllck51bTJQUykgewotICBhdXRvIHBpbkxheWVyMlBvbHlTZXQgPSBwaW4tPmdldExheWVyMlBvbHlTZXQoKTsKLSAgZm9yIChhdXRvIGxheWVySXQgPSBwaW5MYXllcjJQb2x5U2V0LmJlZ2luKCk7IGxheWVySXQgIT0gcGluTGF5ZXIyUG9seVNldC5lbmQoKTsgKytsYXllckl0KSB7Ci0gICAgYXV0byAmbGF5ZXJOdW0gPSBsYXllckl0LT5maXJzdDsKLSAgICBhdXRvICZwb2x5U2V0ID0gbGF5ZXJJdC0+c2Vjb25kOwotICAgIGZvciAoYXV0byAmcG9seTogcG9seVNldCkgewotICAgICAgc3RkOjp2ZWN0b3I8UG9pbnQ+IHRyYW5zZm9ybWVkUG9pbnRzOwotICAgICAgZm9yIChhdXRvIGl0ID0gYm9vc3Q6OnBvbHlnb246OmJlZ2luX3BvaW50cyhwb2x5KTsgaXQgIT0gYm9vc3Q6OnBvbHlnb246OmVuZF9wb2ludHMocG9seSk7ICsraXQpIHsKLSAgICAgICAgZnJQb2ludCB0bXBQdCgoKml0KS54KCksICgqaXQpLnkoKSk7Ci0gICAgICAgIC8vIHRtcFB0LnRyYW5zZm9ybSh4Zm9ybSk7Ci0gICAgICAgIHRyYW5zZm9ybWVkUG9pbnRzLnB1c2hfYmFjayhQb2ludCh0bXBQdC54KCksIHRtcFB0LnkoKSkpOwotICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgIigiIDw8IHRtcFB0LngoKSA8PCAiLCAiIDw8IHRtcFB0LnkoKSA8PCAiKVxuIjsKLSAgICAgIH0KLSAgICAgIFBvbHlnb24gdG1wUG9seTsKLSAgICAgIGJvb3N0Ojpwb2x5Z29uOjpzZXRfcG9pbnRzKHRtcFBvbHksIHRyYW5zZm9ybWVkUG9pbnRzLmJlZ2luKCksIHRyYW5zZm9ybWVkUG9pbnRzLmVuZCgpKTsKLSAgICAgIGxheWVyTnVtMlBTW2xheWVyTnVtXSArPSB0bXBQb2x5OwotICAgIH0KLSAgfQotfQotCi0KLXZvaWQgRmxleFBpblByZXA6Om1lcmdlUGluU2hhcGVzKGNvbnN0IHNoYXJlZF9wdHI8ZnJQaW4+ICZwaW4sIG1hcDxmckxheWVyTnVtLCBQb2x5Z29uU2V0PiAmbGF5ZXJOdW0yUFMpIHsKLSAgLy8gY291dCA8PCAibWVyZ2VQaW5TaGFwZXNcbiI7Ci0gIGZvciAoYXV0byAmdVBpbkZpZzogcGluLT5nZXRGaWdzKCkpIHsKLSAgICBhdXRvIHBpbkZpZyA9IHVQaW5GaWcuZ2V0KCk7Ci0gICAgaWYgKHBpbkZpZy0+dHlwZUlkKCkgPT0gZnJjUmVjdCkgewotICAgICAgYXV0byByZWN0SW4gPSBzdGF0aWNfY2FzdDxmclJlY3QqPihwaW5GaWcpOwotICAgICAgYXV0byBjdXJyTGF5ZXJOdW0gPSByZWN0SW4tPmdldExheWVyTnVtKCk7Ci0gICAgICAvLyBjb3V0IDw8ICJjdXJyTGF5ZXJOdW0gPSAiIDw8IGN1cnJMYXllck51bSA8PCAiXG4iIDw8IGZsdXNoOwotICAgICAgLy8gY291dCA8PCAidG90YWwgbGF5ZXJOdW0gPSAiIDw8IGdldFRlY2goKS0+Z2V0TGF5ZXJzKCkuc2l6ZSgpIDw8ICJcbiI7Ci0gICAgICBpZiAoZ2V0VGVjaCgpLT5nZXRMYXllcihjdXJyTGF5ZXJOdW0pLT5nZXRUeXBlKCkgIT0gZnJMYXllclR5cGVFbnVtOjpST1VUSU5HKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgLy8gY291dCA8PCAiaGVyZSAiIDw8IGN1cnJMYXllck51bSA8PCAiXG4iIDw8IGZsdXNoOwotICAgICAgUmVjdGFuZ2xlIHJlY3RPdXQ7Ci0gICAgICBmclJlY3QyUmVjdGFuZ2xlKCpyZWN0SW4sIHJlY3RPdXQpOwotICAgICAgbGF5ZXJOdW0yUFNbY3VyckxheWVyTnVtXSArPSByZWN0T3V0OwotICAgIH0gZWxzZSBpZiAocGluRmlnLT50eXBlSWQoKSA9PSBmcmNQb2x5Z29uKSB7Ci0gICAgICBjb3V0IDw8ICJXYXJuaW5nOiBUT0RPOiBzdXBwb3J0IHBvbHlnb24gaW4gbWVyZ2VQaW5TaGFwZXNcbiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvdXQgPDwgIldhcm5pbmc6IHVuc3VwcG9ydGVkIHNoYXBlIGluIG1lcmdlUGluU2hhcGVzXG4iOwotICAgICAgY29udGludWU7Ci0gICAgfQotICB9Ci19Ci0KLS8vIGdldCBlbmRwb2ludCBvZiBwbGFuYXIgYWNjZXNzIGdpdmVuIGEgZGlyZWN0aW9uCi12b2lkIEZsZXhQaW5QcmVwOjpnZXRQbGFuYXJFUChjb25zdCBmckxheWVyTnVtICZsYXllck51bSwgY29uc3QgZnJQb2ludCAmc3RhcnRQdCwgY29uc3QgZnJEaXJFbnVtICZkaXIsIGZyUG9pbnQgJmVuZFB0KSB7Ci0gIGZyQ29vcmQgZW5kWCA9IHN0YXJ0UHQueCgpLCBlbmRZID0gc3RhcnRQdC55KCk7Ci0gIGZyQ29vcmQgc3RlcFNpemUgPSBnZXRUZWNoKCktPmdldExheWVyKGxheWVyTnVtKS0+Z2V0UGl0Y2goKTsKLSAgaWYgKGdldFRlY2goKS0+Z2V0VG9wTGF5ZXJOdW0oKSA+PSBsYXllck51bSArIDIpIHsKLSAgICBzdGVwU2l6ZSA9IGdldFRlY2goKS0+Z2V0TGF5ZXIobGF5ZXJOdW0gKyAyKS0+Z2V0UGl0Y2goKTsKLSAgfQotICBzd2l0Y2ggKGRpcikgewotICAgIGNhc2UgKGZyRGlyRW51bTo6RSk6Ci0gICAgICBlbmRYICs9IHN0ZXBTaXplOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAoZnJEaXJFbnVtOjpTKToKLSAgICAgIGVuZFkgLT0gc3RlcFNpemU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIChmckRpckVudW06OlcpOgotICAgICAgZW5kWCAtPSBzdGVwU2l6ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgKGZyRGlyRW51bTo6Tik6Ci0gICAgICBlbmRZICs9IHN0ZXBTaXplOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHN0ZDo6Y291dCA8PCAidW5leHBlY3RlZCBkaXJlY3Rpb24gaW4gZ2V0UGxhbmFyRVBcbiI7Ci0gIH0KLSAgZW5kUHQuc2V0KGVuZFgsIGVuZFkpOwotfQotCi0KLWJvb2wgRmxleFBpblByZXA6OmlzVmFsaWRWaWFBY2Nlc3MoZnJQaW4gKnBpblB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJJbnN0VGVybSAqaW5zdFRlcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGZyQmxvY2tPYmplY3QqPiBpbnN0T2JqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJMYXllck51bSAmbGF5ZXJOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyUG9pbnQgJnN0YXJ0UHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyVmlhRGVmKiB2aWFEZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpYVByaW9yaXR5VHVwbGUgJnByaW9yaXR5KSB7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIGJvb2wgaXNOb3REZWZhdWx0VmlhLCBpc05vdFVwcGVyQWxpZ24sIGlzTm90TG93ZXJBbGlnbjsKLSAgZnJDb29yZCBub25FbmNsb3NlZEFyZWEgPSAwLCB1cHBlckFyZWEgPSAwLCBsb3dlckFyZWEgPSAwOwotICAKLSAgCi0KLSAgZG91YmxlIGRidSA9IGdldFRlY2goKS0+Z2V0REJVUGVyVVUoKTsKLSAgZnJJbnN0KiBpbnN0ID0gaW5zdFRlcm0tPmdldEluc3QoKTsKLSAgZnJCb3ggbWJveDsKLSAgZnJUcmFuc2Zvcm0geGZvcm0sIHJldmVydENlbGxYRm9ybTsKLQotICAKLQotICAvLyBpbnN0LT5nZXRUcmFuc2Zvcm0oeGZvcm0pOwotICAvLyBpbnN0LT5nZXRSZWZCbG9jaygpLT5nZXRCb3VuZGFyeUJCb3gobWJveCk7Ci0gIC8vIGZyUG9pbnQgc2l6ZShtYm94LnJpZ2h0KCksIG1ib3gudG9wKCkpOwotICAvLyB0ZXJtWEZvcm0uc2V0KHhmb3JtLm9yaWVudCgpKTsKLSAgLy8gdGVybVhGb3JtLnVwZGF0ZVhmb3JtKHNpemUpOwotICBpbnN0LT5nZXRVcGRhdGVkWGZvcm0oeGZvcm0pOwotICAvLyB4Zm9ybS5yZXZlcnQocmV2ZXJ0Q2VsbFhGb3JtKTsKLSAgcmV2ZXJ0Q2VsbFhGb3JtLnNldCgteGZvcm0ueE9mZnNldCgpLCAteGZvcm0ueU9mZnNldCgpKTsKLSAgLy8gc3RkOjpjb3V0IDw8IHhmb3JtLnhPZmZzZXQoKSA8PCAiICIgPDwgeGZvcm0ueU9mZnNldCgpIDw8ICJcbiI7Ci0gIC8vIHN0ZDo6Y291dCA8PCByZXZlcnRDZWxsWEZvcm0ueE9mZnNldCgpIDw8ICIgIiA8PCByZXZlcnRDZWxsWEZvcm0ueU9mZnNldCgpIDw8ICJcbiI7Ci0gIHJldmVydENlbGxYRm9ybS5zZXQoZnJjUjApOwotCi0gIGF1dG8gY2VsbE9ianMgPSBpbnN0T2JqczsKLSAgc3RkOjp1bmlxdWVfcHRyPGZyVmlhPiB2aWEgPSBzdGQ6Om1ha2VfdW5pcXVlPGZyVmlhPih2aWFEZWYpOwotICB2aWEtPnNldE9yaWdpbihzdGFydFB0KTsKLSAgZnJUcmFuc2Zvcm0gdmlhWGZvcm0oc3RhcnRQdCk7Ci0gIHZpYS0+c2V0VHJhbnNmb3JtKHZpYVhmb3JtKTsKLSAgaWYgKGluc3RUZXJtLT5oYXNOZXQoKSkgewotICAgIHZpYS0+YWRkVG9OZXQoaW5zdFRlcm0tPmdldE5ldCgpKTsKLSAgfSBlbHNlIHsKLSAgICB2aWEtPmFkZFRvUGluKHBpblB0cik7Ci0gIH0KLSAgY2VsbE9ianMucHVzaF9iYWNrKHZpYS5nZXQoKSk7Ci0gIERSQ1dvcmtlciBkcmNXb3JrZXIoZGVzaWduLCBjZWxsT2Jqcyk7Ci0gIGlmIChpbnN0VGVybS0+aGFzTmV0KCkpIHsKLSAgICBkcmNXb3JrZXIuc2V0VGFyZ2V0KGluc3RUZXJtLT5nZXROZXQoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgZHJjV29ya2VyLnNldFRhcmdldChpbnN0VGVybSk7Ci0gIH0KLSAgaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjp0aW1lX3BvaW50IHQwID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKLSAgZHJjV29ya2VyLmluaXQoKTsKLSAgaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjp0aW1lX3BvaW50IHQxID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKLSAgZHJjV29ya2VyLnNldHVwKCk7Ci0gIGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6dGltZV9wb2ludCB0MiA9IGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7Ci0gIGRyY1dvcmtlci5tYWluKCk7Ci0gIGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6dGltZV9wb2ludCB0MyA9IGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7Ci0gIGRyY1NwYW4wICs9IGR1cmF0aW9uX2Nhc3Q8ZHVyYXRpb248ZG91YmxlPj4odDEgLSB0MCk7Ci0gIGRyY1NwYW4xICs9IGR1cmF0aW9uX2Nhc3Q8ZHVyYXRpb248ZG91YmxlPj4odDIgLSB0MSk7Ci0gIGRyY1NwYW4yICs9IGR1cmF0aW9uX2Nhc3Q8ZHVyYXRpb248ZG91YmxlPj4odDMgLSB0Mik7Ci0gIC8vIGRyY1dvcmtlci5yZXBvcnQoKTsKLQotICAvLyBnZXQgcHJpb3JpdHkgaW5mb3JtYXRpb24KLSAgLy8gaXNOb3REZWZhdWx0VmlhID0gKGdldFRlY2goKS0+Z2V0TGF5ZXIodmlhRGVmLT5nZXRDdXRMYXllck51bSgpKS0+Z2V0RGVmYXVsdFZpYURlZigpICE9IHZpYURlZik7Ci0gIGlzTm90RGVmYXVsdFZpYSA9ICEodmlhRGVmLT5nZXREZWZhdWx0KCkpOwotICBmckNvb3JkIG92bHBBcmVhOwotICBQb2x5Z29uU2V0IHZpYUxheWVyUFMxOwotICBmb3IgKGF1dG8gJmZpZzogdmlhLT5nZXRWaWFEZWYoKS0+Z2V0TGF5ZXIxRmlncygpKSB7Ci0gICAgZnJCb3ggYmJveDsKLSAgICBmaWctPmdldEJCb3goYmJveCk7Ci0gICAgYmJveC50cmFuc2Zvcm0odmlhWGZvcm0pOwotICAgIFJlY3RhbmdsZSBiYm94UmVjdChiYm94LmxlZnQoKSwgYmJveC5ib3R0b20oKSwgYmJveC5yaWdodCgpLCBiYm94LnRvcCgpKTsKLSAgICAvLyBzdGQ6OmNvdXQgPDwgYmJveC5sZWZ0KCkgPDwgIiAiIDw8IGJib3guYm90dG9tKCkgPDwgIiAiIDw8IGJib3gucmlnaHQoKSA8PCAiICIgPDwgYmJveC50b3AoKSA8PCAiXG4iOwotICAgIHZpYUxheWVyUFMxICs9IGJib3hSZWN0OwotICB9Ci0gIGxvd2VyQXJlYSA9IGFyZWEodmlhTGF5ZXJQUzEpOwotCi0gIFJlY3RhbmdsZSBsYXllcjFSZWN0OwotICBleHRlbnRzKGxheWVyMVJlY3QsIHZpYUxheWVyUFMxKTsKLSAgYm9vbCBpc0xheWVyMUhvcnogPSAoeGgobGF5ZXIxUmVjdCkgLSB4bChsYXllcjFSZWN0KSkgPiAoeWgobGF5ZXIxUmVjdCkgLSB5bChsYXllcjFSZWN0KSk7Ci0gIGlzTm90TG93ZXJBbGlnbiA9IChpc0xheWVyMUhvcnogIT0gKGdldFRlY2goKS0+Z2V0TGF5ZXIodmlhRGVmLT5nZXRMYXllcjFOdW0oKSktPmdldERpcigpID09IGZyY0hvcnpQcmVmUm91dGluZ0RpcikpOwotCi0gIFBvbHlnb25TZXQgdmlhTGF5ZXJQUzI7Ci0gIGZvciAoYXV0byAmZmlnOiB2aWEtPmdldFZpYURlZigpLT5nZXRMYXllcjJGaWdzKCkpIHsKLSAgICBmckJveCBiYm94OwotICAgIGZpZy0+Z2V0QkJveChiYm94KTsKLSAgICBSZWN0YW5nbGUgYmJveFJlY3QoYmJveC5sZWZ0KCksIGJib3guYm90dG9tKCksIGJib3gucmlnaHQoKSwgYmJveC50b3AoKSk7Ci0gICAgdmlhTGF5ZXJQUzIgKz0gYmJveFJlY3Q7Ci0gIH0KLQotICBSZWN0YW5nbGUgbGF5ZXIyUmVjdDsKLSAgZXh0ZW50cyhsYXllcjJSZWN0LCB2aWFMYXllclBTMik7Ci0gIGJvb2wgaXNMYXllcjJIb3J6ID0gKHhoKGxheWVyMlJlY3QpIC0geGwobGF5ZXIyUmVjdCkpID4gKHloKGxheWVyMlJlY3QpIC0geWwobGF5ZXIyUmVjdCkpOwotICBpc05vdFVwcGVyQWxpZ24gPSAoaXNMYXllcjJIb3J6ICE9IChnZXRUZWNoKCktPmdldExheWVyKHZpYURlZi0+Z2V0TGF5ZXIyTnVtKCkpLT5nZXREaXIoKSA9PSBmcmNIb3J6UHJlZlJvdXRpbmdEaXIpKTsKLQotCi0KLSAgZm9yIChhdXRvICZwaW46IGluc3RUZXJtLT5nZXRUZXJtKCktPmdldFBpbnMoKSkgewotICAgIGF1dG8gcGluTGF5ZXIyUG9seVNldCA9IHBpbi0+Z2V0TGF5ZXIyUG9seVNldCgpOwotICAgIGlmIChwaW5MYXllcjJQb2x5U2V0LmZpbmQodmlhRGVmLT5nZXRMYXllcjFOdW0oKSkgIT0gcGluTGF5ZXIyUG9seVNldC5lbmQoKSkgewotICAgICAgUG9seWdvblNldCBwaW5MYXllcjFQUzsKLSAgICAgIGF1dG8gJnBvbHlTZXQgPSBwaW5MYXllcjJQb2x5U2V0W3ZpYURlZi0+Z2V0TGF5ZXIxTnVtKCldOwotICAgICAgZm9yIChhdXRvICZwb2x5OiBwb2x5U2V0KSB7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPFBvaW50PiB0cmFuc2Zvcm1lZFB0czsKLSAgICAgICAgZm9yIChhdXRvIGl0ID0gYm9vc3Q6OnBvbHlnb246OmJlZ2luX3BvaW50cyhwb2x5KTsgaXQgIT0gYm9vc3Q6OnBvbHlnb246OmVuZF9wb2ludHMocG9seSk7ICsraXQpIHsKLSAgICAgICAgICBmclBvaW50IHRtcFB0KCgqaXQpLngoKSwgKCppdCkueSgpKTsKLSAgICAgICAgICB0bXBQdC50cmFuc2Zvcm0oeGZvcm0pOwotICAgICAgICAgIHRyYW5zZm9ybWVkUHRzLnB1c2hfYmFjayhQb2ludCh0bXBQdC54KCksIHRtcFB0LnkoKSkpOwotICAgICAgICB9Ci0gICAgICAgIFBvbHlnb24gdG1wUG9seTsKLSAgICAgICAgYm9vc3Q6OnBvbHlnb246OnNldF9wb2ludHModG1wUG9seSwgdHJhbnNmb3JtZWRQdHMuYmVnaW4oKSwgdHJhbnNmb3JtZWRQdHMuZW5kKCkpOwotICAgICAgICBwaW5MYXllcjFQUyArPSB0bXBQb2x5OwotICAgICAgfQotICAgICAgb3ZscEFyZWEgPSBhcmVhKHZpYUxheWVyUFMxICYgcGluTGF5ZXIxUFMpOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdmxwQXJlYSA9IDA7Ci0gICAgfQotICAgIG5vbkVuY2xvc2VkQXJlYSArPSAoYXJlYSh2aWFMYXllclBTMSkgLSBvdmxwQXJlYSk7Ci0gIH0KLQotICAvLyBwcmlvcml0eSA9IG1ha2VfdHVwbGUoaXNOb3REZWZhdWx0VmlhLCBub25FbmNsb3NlZEFyZWEsIGlzTm90VXBwZXJBbGlnbiwgaXNOb3RMb3dlckFsaWduLCB1cHBlckFyZWEsIGxvd2VyQXJlYSk7Ci0gIHByaW9yaXR5ID0gbWFrZV90dXBsZShpc05vdERlZmF1bHRWaWEsIGlzTm90VXBwZXJBbGlnbiwgbm9uRW5jbG9zZWRBcmVhLCBpc05vdExvd2VyQWxpZ24sIHVwcGVyQXJlYSwgbG93ZXJBcmVhKTsKLQotICBpZiAoZHJjV29ya2VyLmdldFZpb2xhdGlvbnMoKS5lbXB0eSgpKSB7Ci0gICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgc3RkOjpjb3V0IDw8ICIgIEBAQGNsZWFuIHZpYSBhY2Nlc3NcbiI7Ci0gICAgfQotICAgIC8vIG91dHB1dCBmb3IgdmlhIGFjY2VzcyBjaGVjayBzY3JpcHQKLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBmclBvaW50IHRyYW5zZm9ybWVkU1AgPSBzdGFydFB0OwotICAgICAgdHJhbnNmb3JtZWRTUC50cmFuc2Zvcm0ocmV2ZXJ0Q2VsbFhGb3JtKTsKLSAgICAgIHN0ZDo6bWFwPGZyT3JpZW50RW51bSwgc3RkOjpzdHJpbmc+IG9yaWVudDJOYW1lID0ge3tmcmNSMCwgIlIwIn0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmcmNSOTAsICJSOTAifSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZyY1IxODAsICJSMTgwIn0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmcmNSMjcwLCAiUjI3MCJ9LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZnJjTVksICJNWSJ9LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZnJjTVhSOTAsICJNWDkwIn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZyY01YLCAiTVgifSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZnJjTVlSOTAsICJNWTkwIn19OwotICAgICAgc3RkOjpjb3V0IDw8ICJsaWJQcmVwT3V0VmlhQ2xlYW4gIiA8PCBpbnN0VGVybS0+Z2V0SW5zdCgpLT5nZXRSZWZCbG9jaygpLT5nZXROYW1lKCkgPDwgIiAiCi0gICAgICAgICAgICAgICAgPDwgaW5zdFRlcm0tPmdldFRlcm0oKS0+Z2V0TmFtZSgpIDw8ICIgIiA8PCB2aWFEZWYtPmdldE5hbWUoKSA8PCAiICIKLSAgICAgICAgICAgICAgICA8PCB0cmFuc2Zvcm1lZFNQLngoKSA8PCAiICIgPDwgdHJhbnNmb3JtZWRTUC55KCkgCi0gICAgICAgICAgICAgICAgPDwgIiAiIDw8IG9yaWVudDJOYW1lW2luc3RUZXJtLT5nZXRJbnN0KCktPmdldE9yaWVudCgpXSA8PCAiICIgPDwgbm9uRW5jbG9zZWRBcmVhIDw8ICJcbiI7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgewotICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgIHN0ZDo6Y291dCA8PCAiICBAQEBkaXJ0eSB2aWEgYWNjZXNzXG4iOwotICAgICAgZnJQb2ludCB0cmFuc2Zvcm1lZFNQID0gc3RhcnRQdDsKLSAgICAgIHRyYW5zZm9ybWVkU1AudHJhbnNmb3JtKHJldmVydENlbGxYRm9ybSk7Ci0gICAgICBzdGQ6Om1hcDxmck9yaWVudEVudW0sIHN0ZDo6c3RyaW5nPiBvcmllbnQyTmFtZSA9IHt7ZnJjUjAsICJSMCJ9LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZnJjUjkwLCAiUjkwIn0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmcmNSMTgwLCAiUjE4MCJ9LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZnJjUjI3MCwgIlIyNzAifSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZyY01ZLCAiTVkifSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZyY01YUjkwLCAiTVg5MCJ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmcmNNWCwgIk1YIn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZyY01ZUjkwLCAiTVk5MCJ9fTsKLSAgICAgIHN0ZDo6Y291dCA8PCAibGliUHJlcE91dFZpYURpcnR5ICIgPDwgaW5zdFRlcm0tPmdldEluc3QoKS0+Z2V0UmVmQmxvY2soKS0+Z2V0TmFtZSgpIDw8ICIgIgotICAgICAgICAgICAgICAgIDw8IGluc3RUZXJtLT5nZXRUZXJtKCktPmdldE5hbWUoKSA8PCAiICIgPDwgdmlhRGVmLT5nZXROYW1lKCkgPDwgIiAiCi0gICAgICAgICAgICAgICAgPDwgdHJhbnNmb3JtZWRTUC54KCkgPDwgIiAiIDw8IHRyYW5zZm9ybWVkU1AueSgpIAotICAgICAgICAgICAgICAgIDw8ICIgIiA8PCBvcmllbnQyTmFtZVtpbnN0VGVybS0+Z2V0SW5zdCgpLT5nZXRPcmllbnQoKV0gPDwgIlxuIjsKLSAgICAgIGF1dG8gdmlvbGF0aW9ucyA9IGRyY1dvcmtlci5nZXRWaW9sYXRpb25zKCk7Ci0gICAgICBmb3IgKGF1dG8gJm1hcmtlcjogdmlvbGF0aW9ucykgewotICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgIiAgI21hcmtlciA9ICIgPDwgdmlvbGF0aW9ucy5zaXplKCkgPDwgIlxuIjsKLSAgICAgICAgZnJCb3ggYmJveDsKLSAgICAgICAgbWFya2VyLmdldEJCb3goYmJveCk7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCAiICB2aW9sYXRpb24gdHlwZTogIiA8PCBpbnQobWFya2VyLmdldENvbnN0cmFpbnQoKS0+dHlwZUlkKCkpIDw8ICJcbiI7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCAiICAgIGJib3ggPSAoIiA8PCBiYm94LmxlZnQoKSAvIGRidSA8PCAiLCAiIDw8IGJib3guYm90dG9tKCkgLyBkYnUgPDwgIikgLSAoIgotICAgICAgICAgICAgICAgICAgPDwgYmJveC5yaWdodCgpIC8gZGJ1IDw8ICIsICIgPDwgYmJveC50b3AoKSAvIGRidSA8PCAiKVxuIjsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLWJvb2wgRmxleFBpblByZXA6OmlzVmFsaWRWaWFBY2Nlc3MoZnJQaW4gKnBpblB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJUZXJtICp0ZXJtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxmckJsb2NrT2JqZWN0Kj4gaW5zdE9ianMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyTGF5ZXJOdW0gJmxheWVyTnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmclBvaW50ICZzdGFydFB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmclZpYURlZiogdmlhRGVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWFQcmlvcml0eVR1cGxlICZwcmlvcml0eSkgewotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICBib29sIGlzTm90RGVmYXVsdFZpYSwgaXNOb3RVcHBlckFsaWduLCBpc05vdExvd2VyQWxpZ247Ci0gIGZyQ29vcmQgbm9uRW5jbG9zZWRBcmVhID0gMCwgdXBwZXJBcmVhID0gMCwgbG93ZXJBcmVhID0gMDsKLQotICBkb3VibGUgZGJ1ID0gZ2V0VGVjaCgpLT5nZXREQlVQZXJVVSgpOwotCi0gIGF1dG8gY2VsbE9ianMgPSBpbnN0T2JqczsKLSAgc3RkOjp1bmlxdWVfcHRyPGZyVmlhPiB2aWEgPSBzdGQ6Om1ha2VfdW5pcXVlPGZyVmlhPih2aWFEZWYpOwotICB2aWEtPnNldE9yaWdpbihzdGFydFB0KTsKLSAgZnJUcmFuc2Zvcm0gdmlhWGZvcm0oc3RhcnRQdCk7Ci0gIHZpYS0+c2V0VHJhbnNmb3JtKHZpYVhmb3JtKTsKLSAgaWYgKHRlcm0tPmhhc05ldCgpKSB7Ci0gICAgdmlhLT5hZGRUb05ldCh0ZXJtLT5nZXROZXQoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgdmlhLT5hZGRUb1BpbihwaW5QdHIpOwotICB9Ci0gIGNlbGxPYmpzLnB1c2hfYmFjayh2aWEuZ2V0KCkpOwotICBEUkNXb3JrZXIgZHJjV29ya2VyKGRlc2lnbiwgY2VsbE9ianMpOwotICBpZiAodGVybS0+aGFzTmV0KCkpIHsKLSAgICBkcmNXb3JrZXIuc2V0VGFyZ2V0KHRlcm0tPmdldE5ldCgpKTsKLSAgfSBlbHNlIHsKLSAgICBkcmNXb3JrZXIuc2V0VGFyZ2V0KHRlcm0pOwotICB9Ci0gIGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6dGltZV9wb2ludCB0MCA9IGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7Ci0gIGRyY1dvcmtlci5pbml0KCk7Ci0gIGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6dGltZV9wb2ludCB0MSA9IGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7Ci0gIGRyY1dvcmtlci5zZXR1cCgpOwotICBoaWdoX3Jlc29sdXRpb25fY2xvY2s6OnRpbWVfcG9pbnQgdDIgPSBoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwotICBkcmNXb3JrZXIubWFpbigpOwotICBoaWdoX3Jlc29sdXRpb25fY2xvY2s6OnRpbWVfcG9pbnQgdDMgPSBoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwotICBkcmNTcGFuMCArPSBkdXJhdGlvbl9jYXN0PGR1cmF0aW9uPGRvdWJsZT4+KHQxIC0gdDApOwotICBkcmNTcGFuMSArPSBkdXJhdGlvbl9jYXN0PGR1cmF0aW9uPGRvdWJsZT4+KHQyIC0gdDEpOwotICBkcmNTcGFuMiArPSBkdXJhdGlvbl9jYXN0PGR1cmF0aW9uPGRvdWJsZT4+KHQzIC0gdDIpOwotCi0gIC8vIGdldCBwcmlvcml0eSBpbmZvcm1hdGlvbgotICAvLyBpc05vdERlZmF1bHRWaWEgPSAoZ2V0VGVjaCgpLT5nZXRMYXllcih2aWFEZWYtPmdldEN1dExheWVyTnVtKCkpLT5nZXREZWZhdWx0VmlhRGVmKCkgIT0gdmlhRGVmKTsgCi0gIGlzTm90RGVmYXVsdFZpYSA9ICEodmlhRGVmLT5nZXREZWZhdWx0KCkpOwotICBmckNvb3JkIG92bHBBcmVhOwotICAvLyBzdGQ6OnVuaXF1ZV9wdHI8ZnJWaWE+IG9yaWdWaWEgPSBzdGQ6Om1ha2VfdW5pcXVlPGZyVmlhPih2aWFEZWYpOwotICAvLyBmclBvaW50IHRyYW5zZm9ybWVkU1AgPSBzdGFydFB0OwotICAvLyBvcmlnVmlhLT5zZXRPcmlnaW4odHJhbnNmb3JtZWRTUCk7Ci0gIC8vIGZyVHJhbnNmb3JtIHRyYW5zZm9ybWVkVmlhWGZvcm0oc3RhcnRQdCk7Ci0gIC8vIG9yaWdWaWEtPnNldFRyYW5zZm9ybSh0cmFuc2Zvcm1lZFZpYVhmb3JtKTsKLSAgZm9yIChhdXRvICZwaW46IHRlcm0tPmdldFBpbnMoKSkgewotICAgIGF1dG8gcGluTGF5ZXIyUG9seVNldCA9IHBpbi0+Z2V0TGF5ZXIyUG9seVNldCgpOwotICAgIFBvbHlnb25TZXQgdmlhTGF5ZXJQUzE7Ci0gICAgZm9yIChhdXRvICZmaWc6IHZpYS0+Z2V0VmlhRGVmKCktPmdldExheWVyMUZpZ3MoKSkgewotICAgICAgZnJCb3ggYmJveDsKLSAgICAgIGZpZy0+Z2V0QkJveChiYm94KTsKLSAgICAgIGJib3gudHJhbnNmb3JtKHZpYVhmb3JtKTsKLSAgICAgIFJlY3RhbmdsZSBiYm94UmVjdChiYm94LmxlZnQoKSwgYmJveC5ib3R0b20oKSwgYmJveC5yaWdodCgpLCBiYm94LnRvcCgpKTsKLSAgICAgIHZpYUxheWVyUFMxICs9IGJib3hSZWN0OwotICAgIH0KLSAgICBsb3dlckFyZWEgPSBhcmVhKHZpYUxheWVyUFMxKTsKLSAgICBpZiAocGluTGF5ZXIyUG9seVNldC5maW5kKHZpYURlZi0+Z2V0TGF5ZXIxTnVtKCkpICE9IHBpbkxheWVyMlBvbHlTZXQuZW5kKCkpIHsKLSAgICAgIFBvbHlnb25TZXQgcGluTGF5ZXIxUFM7Ci0gICAgICBhdXRvICZwb2x5U2V0ID0gcGluTGF5ZXIyUG9seVNldFt2aWFEZWYtPmdldExheWVyMU51bSgpXTsKLSAgICAgIGZvciAoYXV0byAmcG9seTogcG9seVNldCkgewotICAgICAgICBzdGQ6OnZlY3RvcjxQb2ludD4gdHJhbnNmb3JtZWRQdHM7Ci0gICAgICAgIGZvciAoYXV0byBpdCA9IGJvb3N0Ojpwb2x5Z29uOjpiZWdpbl9wb2ludHMocG9seSk7IGl0ICE9IGJvb3N0Ojpwb2x5Z29uOjplbmRfcG9pbnRzKHBvbHkpOyArK2l0KSB7Ci0gICAgICAgICAgZnJQb2ludCB0bXBQdCgoKml0KS54KCksICgqaXQpLnkoKSk7Ci0gICAgICAgICAgLy8gdG1wUHQudHJhbnNmb3JtKHhmb3JtKTsKLSAgICAgICAgICB0cmFuc2Zvcm1lZFB0cy5wdXNoX2JhY2soUG9pbnQodG1wUHQueCgpLCB0bXBQdC55KCkpKTsKLSAgICAgICAgfQotICAgICAgICBQb2x5Z29uIHRtcFBvbHk7Ci0gICAgICAgIGJvb3N0Ojpwb2x5Z29uOjpzZXRfcG9pbnRzKHRtcFBvbHksIHRyYW5zZm9ybWVkUHRzLmJlZ2luKCksIHRyYW5zZm9ybWVkUHRzLmVuZCgpKTsKLSAgICAgICAgcGluTGF5ZXIxUFMgKz0gdG1wUG9seTsKLSAgICAgIH0KLSAgICAgIG92bHBBcmVhID0gYXJlYSh2aWFMYXllclBTMSAmIHBpbkxheWVyMVBTKTsKLSAgICB9IGVsc2UgewotICAgICAgb3ZscEFyZWEgPSAwOwotICAgIH0KLSAgICBub25FbmNsb3NlZEFyZWEgKz0gKGFyZWEodmlhTGF5ZXJQUzEpIC0gb3ZscEFyZWEpOwotCi0gICAgUmVjdGFuZ2xlIGxheWVyMVJlY3Q7Ci0gICAgZXh0ZW50cyhsYXllcjFSZWN0LCB2aWFMYXllclBTMSk7Ci0gICAgYm9vbCBpc0xheWVyMUhvcnogPSAoeGgobGF5ZXIxUmVjdCkgLSB4bChsYXllcjFSZWN0KSkgPiAoeWgobGF5ZXIxUmVjdCkgLSB5bChsYXllcjFSZWN0KSk7Ci0gICAgaXNOb3RMb3dlckFsaWduID0gKGlzTGF5ZXIxSG9yeiAhPSAoZ2V0VGVjaCgpLT5nZXRMYXllcih2aWFEZWYtPmdldExheWVyMU51bSgpKS0+Z2V0RGlyKCkgPT0gZnJjSG9yelByZWZSb3V0aW5nRGlyKSk7Ci0KLSAgICBQb2x5Z29uU2V0IHZpYUxheWVyUFMyOwotICAgIGZvciAoYXV0byAmZmlnOiB2aWEtPmdldFZpYURlZigpLT5nZXRMYXllcjJGaWdzKCkpIHsKLSAgICAgIGZyQm94IGJib3g7Ci0gICAgICBmaWctPmdldEJCb3goYmJveCk7Ci0gICAgICBSZWN0YW5nbGUgYmJveFJlY3QoYmJveC5sZWZ0KCksIGJib3guYm90dG9tKCksIGJib3gucmlnaHQoKSwgYmJveC50b3AoKSk7Ci0gICAgICB2aWFMYXllclBTMiArPSBiYm94UmVjdDsKLSAgICB9Ci0gICAgLy8gdXBwZXJBcmVhID0gYXJlYSh2aWFMYXllclBTMik7Ci0gICAgLy8gaWYgKHBpbkxheWVyMlBvbHlTZXQuZmluZCh2aWFEZWYtPmdldExheWVyMk51bSgpKSAhPSBwaW5MYXllcjJQb2x5U2V0LmVuZCgpKSB7Ci0gICAgLy8gICBvdmxwQXJlYSA9IGFyZWEodmlhTGF5ZXJQUzIgJiBwaW5MYXllcjJQb2x5U2V0W3ZpYURlZi0+Z2V0TGF5ZXIyTnVtKCldKTsKLSAgICAvLyB9IGVsc2UgewotICAgIC8vICAgb3ZscEFyZWEgPSAwOwotICAgIC8vIH0KLSAgICAvLyBub25FbmNsb3NlZEFyZWEgKz0gKGFyZWEodmlhTGF5ZXJQUzIpIC0gb3ZscEFyZWEpOwotCi0gICAgUmVjdGFuZ2xlIGxheWVyMlJlY3Q7Ci0gICAgZXh0ZW50cyhsYXllcjJSZWN0LCB2aWFMYXllclBTMik7Ci0gICAgYm9vbCBpc0xheWVyMkhvcnogPSAoeGgobGF5ZXIyUmVjdCkgLSB4bChsYXllcjJSZWN0KSkgPiAoeWgobGF5ZXIyUmVjdCkgLSB5bChsYXllcjJSZWN0KSk7Ci0gICAgaXNOb3RVcHBlckFsaWduID0gKGlzTGF5ZXIySG9yeiAhPSAoZ2V0VGVjaCgpLT5nZXRMYXllcih2aWFEZWYtPmdldExheWVyMk51bSgpKS0+Z2V0RGlyKCkgPT0gZnJjSG9yelByZWZSb3V0aW5nRGlyKSk7Ci0KLQotICB9Ci0KLSAgLy8gcHJpb3JpdHkgPSBtYWtlX3R1cGxlKGlzTm90RGVmYXVsdFZpYSwgbm9uRW5jbG9zZWRBcmVhLCBpc05vdFVwcGVyQWxpZ24sIGlzTm90TG93ZXJBbGlnbiwgdXBwZXJBcmVhLCBsb3dlckFyZWEpOwotICBwcmlvcml0eSA9IG1ha2VfdHVwbGUoaXNOb3REZWZhdWx0VmlhLCBpc05vdFVwcGVyQWxpZ24sIG5vbkVuY2xvc2VkQXJlYSwgaXNOb3RMb3dlckFsaWduLCB1cHBlckFyZWEsIGxvd2VyQXJlYSk7Ci0KLQotCi0KLQotICBpZiAoZHJjV29ya2VyLmdldFZpb2xhdGlvbnMoKS5lbXB0eSgpKSB7Ci0gICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgc3RkOjpjb3V0IDw8ICIgIEBAQGNsZWFuIHZpYSBhY2Nlc3NcbiI7Ci0gICAgICAvLyBvdXRwdXQgZm9yIHZpYSBhY2Nlc3MgY2hlY2sgc2NyaXB0Ci0gICAgICBmclBvaW50IHRyYW5zZm9ybWVkU1AgPSBzdGFydFB0OwotICAgICAgc3RkOjptYXA8ZnJPcmllbnRFbnVtLCBzdGQ6OnN0cmluZz4gb3JpZW50Mk5hbWUgPSB7e2ZyY1IwLCAiUjAifSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZyY1I5MCwgIlI5MCJ9LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZnJjUjE4MCwgIlIxODAifSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZyY1IyNzAsICJSMjcwIn0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmcmNNWSwgIk1ZIn0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmcmNNWFI5MCwgIk1YOTAifSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZnJjTVgsICJNWCJ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmcmNNWVI5MCwgIk1ZOTAifX07Ci0gICAgICBzdGQ6OmNvdXQgPDwgInRlcm1QcmVwT3V0VmlhQ2xlYW4gIiA8PCB0ZXJtLT5nZXROYW1lKCkgPDwgIiAiIDw8IHZpYURlZi0+Z2V0TmFtZSgpIDw8ICIgIgotICAgICAgICAgICAgICAgIDw8IHRyYW5zZm9ybWVkU1AueCgpIDw8ICIgIiA8PCB0cmFuc2Zvcm1lZFNQLnkoKSA8PCAiXG4iOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBzdGQ6OmNvdXQgPDwgIiAgQEBAZGlydHkgdmlhIGFjY2Vzc1xuIjsKLSAgICAgIGZyUG9pbnQgdHJhbnNmb3JtZWRTUCA9IHN0YXJ0UHQ7Ci0gICAgICBzdGQ6Om1hcDxmck9yaWVudEVudW0sIHN0ZDo6c3RyaW5nPiBvcmllbnQyTmFtZSA9IHt7ZnJjUjAsICJSMCJ9LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZnJjUjkwLCAiUjkwIn0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmcmNSMTgwLCAiUjE4MCJ9LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZnJjUjI3MCwgIlIyNzAifSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZyY01ZLCAiTVkifSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZyY01YUjkwLCAiTVg5MCJ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmcmNNWCwgIk1YIn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZyY01ZUjkwLCAiTVk5MCJ9fTsKLSAgICAgIHN0ZDo6Y291dCA8PCAibGliUHJlcE91dFZpYURpcnR5ICIgPDwgdGVybS0+Z2V0TmFtZSgpIDw8ICIgIiA8PCB2aWFEZWYtPmdldE5hbWUoKSA8PCAiICIKLSAgICAgICAgICAgICAgICA8PCB0cmFuc2Zvcm1lZFNQLngoKSA8PCAiICIgPDwgdHJhbnNmb3JtZWRTUC55KCkgPDwgIlxuIjsKLSAgICAgIGF1dG8gdmlvbGF0aW9ucyA9IGRyY1dvcmtlci5nZXRWaW9sYXRpb25zKCk7Ci0gICAgICBmb3IgKGF1dG8gJm1hcmtlcjogdmlvbGF0aW9ucykgewotICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgIiAgI21hcmtlciA9ICIgPDwgdmlvbGF0aW9ucy5zaXplKCkgPDwgIlxuIjsKLSAgICAgICAgZnJCb3ggYmJveDsKLSAgICAgICAgbWFya2VyLmdldEJCb3goYmJveCk7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCAiICB2aW9sYXRpb24gdHlwZTogIiA8PCBpbnQobWFya2VyLmdldENvbnN0cmFpbnQoKS0+dHlwZUlkKCkpIDw8ICJcbiI7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCAiICAgIGJib3ggPSAoIiA8PCBiYm94LmxlZnQoKSAvIGRidSA8PCAiLCAiIDw8IGJib3guYm90dG9tKCkgLyBkYnUgPDwgIikgLSAoIgotICAgICAgICAgICAgICAgICAgPDwgYmJveC5yaWdodCgpIC8gZGJ1IDw8ICIsICIgPDwgYmJveC50b3AoKSAvIGRidSA8PCAiKVxuIjsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLWJvb2wgRmxleFBpblByZXA6OmlzVmFsaWRQbGFuYXJBY2Nlc3MoZnJQaW4qIHBpblB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJJbnN0VGVybSAqaW5zdFRlcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGZyQmxvY2tPYmplY3QqPiBpbnN0T2JqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJMYXllck51bSAmbGF5ZXJOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyUG9pbnQgJnN0YXJ0UHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyUG9pbnQgJmVuZFB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQb2x5Z29uU2V0ICZsYXllclBTKSB7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIGRvdWJsZSBkYnUgPSBnZXRUZWNoKCktPmdldERCVVBlclVVKCk7Ci0gIAotICBmb3IgKGF1dG8gJnBvbHk6IGxheWVyUFMpIHsKLSAgICBpZiAoY29udGFpbnMocG9seSwgUG9pbnQoZW5kUHQueCgpLCBlbmRQdC55KCkpKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIGZySW5zdCogaW5zdCA9IGluc3RUZXJtLT5nZXRJbnN0KCk7Ci0gIGZyQm94IG1ib3g7Ci0gIGZyVHJhbnNmb3JtIHhmb3JtLCB0ZXJtWEZvcm0sIHJldmVydENlbGxYRm9ybTsKLQotICAKLQotICBpbnN0LT5nZXRUcmFuc2Zvcm0oeGZvcm0pOwotICBpbnN0LT5nZXRSZWZCbG9jaygpLT5nZXRCb3VuZGFyeUJCb3gobWJveCk7Ci0gIGZyUG9pbnQgc2l6ZShtYm94LnJpZ2h0KCksIG1ib3gudG9wKCkpOwotICB0ZXJtWEZvcm0uc2V0KHhmb3JtLm9yaWVudCgpKTsKLSAgdGVybVhGb3JtLnVwZGF0ZVhmb3JtKHNpemUpOwotICAvLyB4Zm9ybS5yZXZlcnQocmV2ZXJ0Q2VsbFhGb3JtKTsKLSAgcmV2ZXJ0Q2VsbFhGb3JtLnNldCgteGZvcm0ueE9mZnNldCgpLCAteGZvcm0ueU9mZnNldCgpKTsKLSAgLy8gc3RkOjpjb3V0IDw8IHhmb3JtLnhPZmZzZXQoKSA8PCAiICIgPDwgeGZvcm0ueU9mZnNldCgpIDw8ICJcbiI7Ci0gIC8vIHN0ZDo6Y291dCA8PCByZXZlcnRDZWxsWEZvcm0ueE9mZnNldCgpIDw8ICIgIiA8PCByZXZlcnRDZWxsWEZvcm0ueU9mZnNldCgpIDw8ICJcbiI7Ci0gIHJldmVydENlbGxYRm9ybS5zZXQoZnJjUjApOwotICAvLyB4Zm9ybS51cGRhdGVYZm9ybShzaXplKTsKLSAgLy8geGZvcm0ucmV2ZXJ0KHJldmVydFhGb3JtKTsKLQotCi0gIGF1dG8gY2VsbE9ianMgPSBpbnN0T2JqczsKLQotICAvLyBpbnN0YW50aWF0ZSBhIHdpcmUgYW5kIGNoZWNrIERSQwotICBzdGQ6OnVuaXF1ZV9wdHI8ZnJQYXRoU2VnPiBhcFNlZyA9IHN0ZDo6bWFrZV91bmlxdWU8ZnJQYXRoU2VnPigpIDsKLSAgYXBTZWctPnNldExheWVyTnVtKGxheWVyTnVtKTsKLSAgaWYgKHN0YXJ0UHQgPCBlbmRQdCkgewotICAgIGFwU2VnLT5zZXRQb2ludHMoc3RhcnRQdCwgZW5kUHQpOwotICB9IGVsc2UgewotICAgIGFwU2VnLT5zZXRQb2ludHMoZW5kUHQsIHN0YXJ0UHQpOwotICB9Ci0gIGFwU2VnLT5zZXRTdHlsZShnZXRUZWNoKCktPmdldExheWVyKGxheWVyTnVtKS0+Z2V0RGVmYXVsdFNlZ1N0eWxlKCkpOwotICBpZiAoaW5zdFRlcm0tPmhhc05ldCgpKSB7Ci0gICAgYXBTZWctPmFkZFRvTmV0KGluc3RUZXJtLT5nZXROZXQoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgYXBTZWctPmFkZFRvUGluKHBpblB0cik7Ci0gIH0KLSAgY2VsbE9ianMucHVzaF9iYWNrKGFwU2VnLmdldCgpKTsKLSAgRFJDV29ya2VyIGRyY1dvcmtlcihkZXNpZ24sIGNlbGxPYmpzKTsKLSAgaWYgKGluc3RUZXJtLT5oYXNOZXQoKSkgewotICAgIGRyY1dvcmtlci5zZXRUYXJnZXQoaW5zdFRlcm0tPmdldE5ldCgpKTsKLSAgfSBlbHNlIHsKLSAgICBkcmNXb3JrZXIuc2V0VGFyZ2V0KGluc3RUZXJtKTsKLSAgfQotICBoaWdoX3Jlc29sdXRpb25fY2xvY2s6OnRpbWVfcG9pbnQgdDAgPSBoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwotICBkcmNXb3JrZXIuaW5pdCgpOwotICBoaWdoX3Jlc29sdXRpb25fY2xvY2s6OnRpbWVfcG9pbnQgdDEgPSBoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwotICBkcmNXb3JrZXIuc2V0dXAoKTsKLSAgaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjp0aW1lX3BvaW50IHQyID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKLSAgZHJjV29ya2VyLm1haW4oKTsKLSAgaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjp0aW1lX3BvaW50IHQzID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKLSAgZHJjU3BhbjAgKz0gZHVyYXRpb25fY2FzdDxkdXJhdGlvbjxkb3VibGU+Pih0MSAtIHQwKTsKLSAgZHJjU3BhbjEgKz0gZHVyYXRpb25fY2FzdDxkdXJhdGlvbjxkb3VibGU+Pih0MiAtIHQxKTsKLSAgZHJjU3BhbjIgKz0gZHVyYXRpb25fY2FzdDxkdXJhdGlvbjxkb3VibGU+Pih0MyAtIHQyKTsKLQotICBmckNvb3JkIGxheWVyV2lkdGggPSBnZXRUZWNoKCktPmdldExheWVyKGxheWVyTnVtKS0+Z2V0V2lkdGgoKTsKLQotICBpZiAoZHJjV29ya2VyLmdldFZpb2xhdGlvbnMoKS5lbXB0eSgpKSB7Ci0gICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgc3RkOjpjb3V0IDw8ICIgIEBAQGNsZWFuIHBsYW5hciBhY2Nlc3NcbiI7Ci0gICAgICBmclBvaW50IHRyYW5zU1AsIHRyYW5zRVA7Ci0gICAgICBpZiAoc3RhcnRQdCA8IGVuZFB0KSB7Ci0gICAgICAgIHRyYW5zU1AgPSBzdGFydFB0OwotICAgICAgICB0cmFuc0VQID0gZW5kUHQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0cmFuc1NQID0gZW5kUHQ7Ci0gICAgICAgIHRyYW5zRVAgPSBzdGFydFB0OwotICAgICAgfQotICAgICAgdHJhbnNTUC50cmFuc2Zvcm0ocmV2ZXJ0Q2VsbFhGb3JtKTsKLSAgICAgIHRyYW5zRVAudHJhbnNmb3JtKHJldmVydENlbGxYRm9ybSk7Ci0gICAgICBzdGQ6Om1hcDxmck9yaWVudEVudW0sIHN0ZDo6c3RyaW5nPiBvcmllbnQyTmFtZSA9IHt7ZnJjUjAsICJSMCJ9LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZnJjUjkwLCAiUjkwIn0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmcmNSMTgwLCAiUjE4MCJ9LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZnJjUjI3MCwgIlIyNzAifSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZyY01ZLCAiTVkifSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZyY01YUjkwLCAiTVg5MCJ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmcmNNWCwgIk1YIn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZyY01ZUjkwLCAiTVk5MCJ9fTsKLSAgICAgIGlmICh0cmFuc1NQLngoKSA9PSB0cmFuc0VQLngoKSkgewotICAgICAgICBzdGQ6OmNvdXQgPDwgImxpYlByZXBPdXRTZWdDbGVhbiAiIDw8IGluc3RUZXJtLT5nZXRJbnN0KCktPmdldFJlZkJsb2NrKCktPmdldE5hbWUoKSA8PCAiICIKLSAgICAgICAgICAgICAgICAgIDw8IGluc3RUZXJtLT5nZXRUZXJtKCktPmdldE5hbWUoKSA8PCAiICIKLSAgICAgICAgICAgICAgICAgPDwgdHJhbnNTUC54KCkgPDwgIiAiIDw8IHRyYW5zU1AueSgpIC0gbGF5ZXJXaWR0aCAvIDIgPDwgIiAiCi0gICAgICAgICAgICAgICAgIDw8IHRyYW5zRVAueCgpIDw8ICIgIiA8PCB0cmFuc0VQLnkoKSArIGxheWVyV2lkdGggLyAyIDw8ICIgIgotICAgICAgICAgICAgICAgICA8PCAiICIgPDwgb3JpZW50Mk5hbWVbaW5zdFRlcm0tPmdldEluc3QoKS0+Z2V0T3JpZW50KCldIDw8ICJcbiI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzdGQ6OmNvdXQgPDwgImxpYlByZXBPdXRTZWdDbGVhbiAiIDw8IGluc3RUZXJtLT5nZXRJbnN0KCktPmdldFJlZkJsb2NrKCktPmdldE5hbWUoKSA8PCAiICIKLSAgICAgICAgICAgICAgICAgIDw8IGluc3RUZXJtLT5nZXRUZXJtKCktPmdldE5hbWUoKSA8PCAiICIKLSAgICAgICAgICAgICAgICAgPDwgdHJhbnNTUC54KCkgLSBsYXllcldpZHRoIC8gMiA8PCAiICIgPDwgdHJhbnNTUC55KCkgPDwgIiAiCi0gICAgICAgICAgICAgICAgIDw8IHRyYW5zRVAueCgpICsgbGF5ZXJXaWR0aCAvIDIgPDwgIiAiIDw8IHRyYW5zRVAueSgpIDw8ICIgIgotICAgICAgICAgICAgICAgICA8PCAiICIgPDwgb3JpZW50Mk5hbWVbaW5zdFRlcm0tPmdldEluc3QoKS0+Z2V0T3JpZW50KCldIDw8ICJcbiI7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgewotICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgIHN0ZDo6Y291dCA8PCAiICBAQEBkaXJ0eSBwbGFuYXIgYWNjZXNzXG4iOwotICAgICAgZnJQb2ludCB0cmFuc1NQLCB0cmFuc0VQOwotICAgICAgaWYgKHN0YXJ0UHQgPCBlbmRQdCkgewotICAgICAgICB0cmFuc1NQID0gc3RhcnRQdDsKLSAgICAgICAgdHJhbnNFUCA9IGVuZFB0OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdHJhbnNTUCA9IGVuZFB0OwotICAgICAgICB0cmFuc0VQID0gc3RhcnRQdDsKLSAgICAgIH0KLSAgICAgIHRyYW5zU1AudHJhbnNmb3JtKHJldmVydENlbGxYRm9ybSk7Ci0gICAgICB0cmFuc0VQLnRyYW5zZm9ybShyZXZlcnRDZWxsWEZvcm0pOwotICAgICAgc3RkOjptYXA8ZnJPcmllbnRFbnVtLCBzdGQ6OnN0cmluZz4gb3JpZW50Mk5hbWUgPSB7e2ZyY1IwLCAiUjAifSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZyY1I5MCwgIlI5MCJ9LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZnJjUjE4MCwgIlIxODAifSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZyY1IyNzAsICJSMjcwIn0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmcmNNWSwgIk1ZIn0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmcmNNWFI5MCwgIk1YOTAifSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZnJjTVgsICJNWCJ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmcmNNWVI5MCwgIk1ZOTAifX07Ci0gICAgICBpZiAodHJhbnNTUC54KCkgPT0gdHJhbnNFUC54KCkpIHsKLSAgICAgICAgc3RkOjpjb3V0IDw8ICJsaWJQcmVwT3V0U2VnRGlydHkgIiA8PCBpbnN0VGVybS0+Z2V0SW5zdCgpLT5nZXRSZWZCbG9jaygpLT5nZXROYW1lKCkgPDwgIiAiCi0gICAgICAgICAgICAgICAgICA8PCBpbnN0VGVybS0+Z2V0VGVybSgpLT5nZXROYW1lKCkgPDwgIiAiCi0gICAgICAgICAgICAgICAgIDw8IHRyYW5zU1AueCgpIDw8ICIgIiA8PCB0cmFuc1NQLnkoKSAtIGxheWVyV2lkdGggLyAyIDw8ICIgIgotICAgICAgICAgICAgICAgICA8PCB0cmFuc0VQLngoKSA8PCAiICIgPDwgdHJhbnNFUC55KCkgKyBsYXllcldpZHRoIC8gMiA8PCAiICIKLSAgICAgICAgICAgICAgICAgPDwgIiAiIDw8IG9yaWVudDJOYW1lW2luc3RUZXJtLT5nZXRJbnN0KCktPmdldE9yaWVudCgpXSA8PCAiXG4iOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3RkOjpjb3V0IDw8ICJsaWJQcmVwT3V0U2VnRGlydHkgIiA8PCBpbnN0VGVybS0+Z2V0SW5zdCgpLT5nZXRSZWZCbG9jaygpLT5nZXROYW1lKCkgPDwgIiAiCi0gICAgICAgICAgICAgICAgICA8PCBpbnN0VGVybS0+Z2V0VGVybSgpLT5nZXROYW1lKCkgPDwgIiAiCi0gICAgICAgICAgICAgICAgIDw8IHRyYW5zU1AueCgpIC0gbGF5ZXJXaWR0aCAvIDIgPDwgIiAiIDw8IHRyYW5zU1AueSgpIDw8ICIgIgotICAgICAgICAgICAgICAgICA8PCB0cmFuc0VQLngoKSArIGxheWVyV2lkdGggLyAyIDw8ICIgIiA8PCB0cmFuc0VQLnkoKSA8PCAiICIKLSAgICAgICAgICAgICAgICAgPDwgIiAiIDw8IG9yaWVudDJOYW1lW2luc3RUZXJtLT5nZXRJbnN0KCktPmdldE9yaWVudCgpXSA8PCAiXG4iOwotICAgICAgfQotICAgICAgYXV0byB2aW9sYXRpb25zID0gZHJjV29ya2VyLmdldFZpb2xhdGlvbnMoKTsKLSAgICAgIGZvciAoYXV0byAmbWFya2VyOiB2aW9sYXRpb25zKSB7Ci0gICAgICAgIC8vIHN0ZDo6Y291dCA8PCAiICAjbWFya2VyID0gIiA8PCB2aW9sYXRpb25zLnNpemUoKSA8PCAiXG4iOwotICAgICAgICBmckJveCBiYm94OwotICAgICAgICBtYXJrZXIuZ2V0QkJveChiYm94KTsKLSAgICAgICAgc3RkOjpjb3V0IDw8ICIgIHZpb2xhdGlvbiB0eXBlOiAiIDw8IGludChtYXJrZXIuZ2V0Q29uc3RyYWludCgpLT50eXBlSWQoKSkgPDwgIlxuIjsKLSAgICAgICAgc3RkOjpjb3V0IDw8ICIgICAgYmJveCA9ICgiIDw8IGJib3gubGVmdCgpIC8gZGJ1IDw8ICIsICIgPDwgYmJveC5ib3R0b20oKSAvIGRidSA8PCAiKSAtICgiCi0gICAgICAgICAgICAgICAgICA8PCBiYm94LnJpZ2h0KCkgLyBkYnUgPDwgIiwgIiA8PCBiYm94LnRvcCgpIC8gZGJ1IDw8ICIpXG4iOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLQotICB9Ci0KLX0KLQotCi1ib29sIEZsZXhQaW5QcmVwOjppc1ZhbGlkUGxhbmFyQWNjZXNzKGZyUGluKiBwaW5QdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyVGVybSAqdGVybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8ZnJCbG9ja09iamVjdCo+IGluc3RPYmpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmckxheWVyTnVtICZsYXllck51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJQb2ludCAmc3RhcnRQdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJQb2ludCAmZW5kUHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBvbHlnb25TZXQgJmxheWVyUFMpIHsKLSAgYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLSAgZG91YmxlIGRidSA9IGdldFRlY2goKS0+Z2V0REJVUGVyVVUoKTsKLQotICBhdXRvIGNlbGxPYmpzID0gaW5zdE9ianM7Ci0gIGZvciAoYXV0byAmcG9seTogbGF5ZXJQUykgewotICAgIGlmIChjb250YWlucyhwb2x5LCBQb2ludChlbmRQdC54KCksIGVuZFB0LnkoKSkpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgLy8gaW5zdGFudGlhdGUgYSB3aXJlIGFuZCBjaGVjayBEUkMKLSAgc3RkOjp1bmlxdWVfcHRyPGZyUGF0aFNlZz4gYXBTZWcgPSBzdGQ6Om1ha2VfdW5pcXVlPGZyUGF0aFNlZz4oKSA7Ci0gIGFwU2VnLT5zZXRMYXllck51bShsYXllck51bSk7Ci0gIGlmIChzdGFydFB0IDwgZW5kUHQpIHsKLSAgICBhcFNlZy0+c2V0UG9pbnRzKHN0YXJ0UHQsIGVuZFB0KTsKLSAgfSBlbHNlIHsKLSAgICBhcFNlZy0+c2V0UG9pbnRzKGVuZFB0LCBzdGFydFB0KTsKLSAgfQotICBhcFNlZy0+c2V0U3R5bGUoZ2V0VGVjaCgpLT5nZXRMYXllcihsYXllck51bSktPmdldERlZmF1bHRTZWdTdHlsZSgpKTsKLSAgaWYgKHRlcm0tPmhhc05ldCgpKSB7Ci0gICAgYXBTZWctPmFkZFRvTmV0KHRlcm0tPmdldE5ldCgpKTsKLSAgfSBlbHNlIHsKLSAgICBhcFNlZy0+YWRkVG9QaW4ocGluUHRyKTsKLSAgfQotICBjZWxsT2Jqcy5wdXNoX2JhY2soYXBTZWcuZ2V0KCkpOwotICBEUkNXb3JrZXIgZHJjV29ya2VyKGRlc2lnbiwgY2VsbE9ianMpOwotICBpZiAodGVybS0+aGFzTmV0KCkpIHsKLSAgICBkcmNXb3JrZXIuc2V0VGFyZ2V0KHRlcm0tPmdldE5ldCgpKTsKLSAgfSBlbHNlIHsKLSAgICBkcmNXb3JrZXIuc2V0VGFyZ2V0KHRlcm0pOwotICB9Ci0gIGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6dGltZV9wb2ludCB0MCA9IGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7Ci0gIGRyY1dvcmtlci5pbml0KCk7Ci0gIGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6dGltZV9wb2ludCB0MSA9IGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7Ci0gIGRyY1dvcmtlci5zZXR1cCgpOwotICBoaWdoX3Jlc29sdXRpb25fY2xvY2s6OnRpbWVfcG9pbnQgdDIgPSBoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwotICBkcmNXb3JrZXIubWFpbigpOwotICBoaWdoX3Jlc29sdXRpb25fY2xvY2s6OnRpbWVfcG9pbnQgdDMgPSBoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwotICBkcmNTcGFuMCArPSBkdXJhdGlvbl9jYXN0PGR1cmF0aW9uPGRvdWJsZT4+KHQxIC0gdDApOwotICBkcmNTcGFuMSArPSBkdXJhdGlvbl9jYXN0PGR1cmF0aW9uPGRvdWJsZT4+KHQyIC0gdDEpOwotICBkcmNTcGFuMiArPSBkdXJhdGlvbl9jYXN0PGR1cmF0aW9uPGRvdWJsZT4+KHQzIC0gdDIpOwotCi0gIGZyQ29vcmQgbGF5ZXJXaWR0aCA9IGdldFRlY2goKS0+Z2V0TGF5ZXIobGF5ZXJOdW0pLT5nZXRXaWR0aCgpOwotCi0gIGlmIChkcmNXb3JrZXIuZ2V0VmlvbGF0aW9ucygpLmVtcHR5KCkpIHsKLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBzdGQ6OmNvdXQgPDwgIiAgQEBAY2xlYW4gcGxhbmFyIGFjY2Vzc1xuIjsKLSAgICAgIGZyUG9pbnQgdHJhbnNTUCwgdHJhbnNFUDsKLSAgICAgIGlmIChzdGFydFB0IDwgZW5kUHQpIHsKLSAgICAgICAgdHJhbnNTUCA9IHN0YXJ0UHQ7Ci0gICAgICAgIHRyYW5zRVAgPSBlbmRQdDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRyYW5zU1AgPSBlbmRQdDsKLSAgICAgICAgdHJhbnNFUCA9IHN0YXJ0UHQ7Ci0gICAgICB9Ci0gICAgICBzdGQ6Om1hcDxmck9yaWVudEVudW0sIHN0ZDo6c3RyaW5nPiBvcmllbnQyTmFtZSA9IHt7ZnJjUjAsICJSMCJ9LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZnJjUjkwLCAiUjkwIn0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmcmNSMTgwLCAiUjE4MCJ9LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZnJjUjI3MCwgIlIyNzAifSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZyY01ZLCAiTVkifSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZyY01YUjkwLCAiTVg5MCJ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmcmNNWCwgIk1YIn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZyY01ZUjkwLCAiTVk5MCJ9fTsKLSAgICAgIGlmICh0cmFuc1NQLngoKSA9PSB0cmFuc0VQLngoKSkgewotICAgICAgICBzdGQ6OmNvdXQgPDwgInRlcm1QcmVwT3V0U2VnQ2xlYW4gIiA8PCB0ZXJtLT5nZXROYW1lKCkgPDwgIiAiCi0gICAgICAgICAgICAgICAgIDw8IHRyYW5zU1AueCgpIDw8ICIgIiA8PCB0cmFuc1NQLnkoKSAtIGxheWVyV2lkdGggLyAyIDw8ICIgIgotICAgICAgICAgICAgICAgICA8PCB0cmFuc0VQLngoKSA8PCAiICIgPDwgdHJhbnNFUC55KCkgKyBsYXllcldpZHRoIC8gMiA8PCAiICIgPDwgIlxuIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCAidGVybVByZXBPdXRTZWdDbGVhbiAiIDw8IHRlcm0tPmdldE5hbWUoKSA8PCAiICIKLSAgICAgICAgICAgICAgICAgPDwgdHJhbnNTUC54KCkgLSBsYXllcldpZHRoIC8gMiA8PCAiICIgPDwgdHJhbnNTUC55KCkgPDwgIiAiCi0gICAgICAgICAgICAgICAgIDw8IHRyYW5zRVAueCgpICsgbGF5ZXJXaWR0aCAvIDIgPDwgIiAiIDw8IHRyYW5zRVAueSgpIDw8ICIgIiA8PCAiXG4iOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBzdGQ6OmNvdXQgPDwgIiAgQEBAZGlydHkgcGxhbmFyIGFjY2Vzc1xuIjsKLSAgICAgIGZyUG9pbnQgdHJhbnNTUCwgdHJhbnNFUDsKLSAgICAgIGlmIChzdGFydFB0IDwgZW5kUHQpIHsKLSAgICAgICAgdHJhbnNTUCA9IHN0YXJ0UHQ7Ci0gICAgICAgIHRyYW5zRVAgPSBlbmRQdDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRyYW5zU1AgPSBlbmRQdDsKLSAgICAgICAgdHJhbnNFUCA9IHN0YXJ0UHQ7Ci0gICAgICB9Ci0gICAgICBzdGQ6Om1hcDxmck9yaWVudEVudW0sIHN0ZDo6c3RyaW5nPiBvcmllbnQyTmFtZSA9IHt7ZnJjUjAsICJSMCJ9LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZnJjUjkwLCAiUjkwIn0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmcmNSMTgwLCAiUjE4MCJ9LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZnJjUjI3MCwgIlIyNzAifSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZyY01ZLCAiTVkifSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZyY01YUjkwLCAiTVg5MCJ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmcmNNWCwgIk1YIn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZyY01ZUjkwLCAiTVk5MCJ9fTsKLSAgICAgIGlmICh0cmFuc1NQLngoKSA9PSB0cmFuc0VQLngoKSkgewotICAgICAgICBzdGQ6OmNvdXQgPDwgInRlcm1QcmVwT3V0U2VnRGlydHkgIiA8PCB0ZXJtLT5nZXROYW1lKCkgPDwgIiAiCi0gICAgICAgICAgICAgICAgIDw8IHRyYW5zU1AueCgpIDw8ICIgIiA8PCB0cmFuc1NQLnkoKSAtIGxheWVyV2lkdGggLyAyIDw8ICIgIgotICAgICAgICAgICAgICAgICA8PCB0cmFuc0VQLngoKSA8PCAiICIgPDwgdHJhbnNFUC55KCkgKyBsYXllcldpZHRoIC8gMiA8PCAiICIgPDwgIlxuIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCAibGliUHJlcE91dFNlZ0RpcnR5ICIgPDwgdGVybS0+Z2V0TmFtZSgpIDw8ICIgIgotICAgICAgICAgICAgICAgICA8PCB0cmFuc1NQLngoKSAtIGxheWVyV2lkdGggLyAyIDw8ICIgIiA8PCB0cmFuc1NQLnkoKSA8PCAiICIKLSAgICAgICAgICAgICAgICAgPDwgdHJhbnNFUC54KCkgKyBsYXllcldpZHRoIC8gMiA8PCAiICIgPDwgdHJhbnNFUC55KCkgPDwgIiAiIDw8ICJcbiI7Ci0gICAgICB9Ci0gICAgICBhdXRvIHZpb2xhdGlvbnMgPSBkcmNXb3JrZXIuZ2V0VmlvbGF0aW9ucygpOwotICAgICAgZm9yIChhdXRvICZtYXJrZXI6IHZpb2xhdGlvbnMpIHsKLSAgICAgICAgLy8gc3RkOjpjb3V0IDw8ICIgICNtYXJrZXIgPSAiIDw8IHZpb2xhdGlvbnMuc2l6ZSgpIDw8ICJcbiI7Ci0gICAgICAgIGZyQm94IGJib3g7Ci0gICAgICAgIG1hcmtlci5nZXRCQm94KGJib3gpOwotICAgICAgICBzdGQ6OmNvdXQgPDwgIiAgdmlvbGF0aW9uIHR5cGU6ICIgPDwgaW50KG1hcmtlci5nZXRDb25zdHJhaW50KCktPnR5cGVJZCgpKSA8PCAiXG4iOwotICAgICAgICBzdGQ6OmNvdXQgPDwgIiAgICBiYm94ID0gKCIgPDwgYmJveC5sZWZ0KCkgLyBkYnUgPDwgIiwgIiA8PCBiYm94LmJvdHRvbSgpIC8gZGJ1IDw8ICIpIC0gKCIKLSAgICAgICAgICAgICAgICAgIDw8IGJib3gucmlnaHQoKSAvIGRidSA8PCAiLCAiIDw8IGJib3gudG9wKCkgLyBkYnUgPDwgIilcbiI7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvaW8vZnJQaW5QcmVwLmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9pby9mclBpblByZXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcwNmM4Ny4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9pby9mclBpblByZXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIF9GUl9QSU5fUFJFUF9ICi0jZGVmaW5lIF9GUl9QSU5fUFJFUF9ICi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSAiZnJEZXNpZ24uaCIKLSNpbmNsdWRlICJmckJhc2VUeXBlcy5oIgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHR1cGxlPgotI2luY2x1ZGUgPGNocm9ubz4KLQotbmFtZXNwYWNlIGZyIHsKLSAgY2xhc3MgZnJOZXQ7Ci0gIGNsYXNzIEZsZXhUcmFjazsKLSAgLy8gbm90IGRlZmF1bHQgdmlhLCBub3QgYWxpZ24gdXBwZXIgbGF5ZXIsIG5vbi1lbmNsb3NlZCBhcmVhLCBub3QgYWxpZ24gbG93ZXIgbGF5ZXIsCi0gIC8vIHVwcGVyIGxheWVyIGFyZWEsIGxvd2VyIGxheWVyIGFyZWEKLSAgdHlwZWRlZiBzdGQ6OnR1cGxlPGJvb2wsIGJvb2wsIGZyQ29vcmQsIGJvb2wsIGZyQ29vcmQsIGZyQ29vcmQ+IHZpYVByaW9yaXR5VHVwbGU7Ci0gIC8vIG5vdCBkZWZhdWx0IHZpYSwgbm90IGFsaWduIHVwcGVyIGxheWVyLAotICAvLyB1cHBlciBsYXllciBhcmVhLCBsb3dlciBsYXllciBhcmVhCi0gIHR5cGVkZWYgc3RkOjp0dXBsZTxib29sLCBib29sLCBmckNvb3JkLCBmckNvb3JkPiB2aWFSYXdQcmlvcml0eVR1cGxlOwotCi0gIGNsYXNzIEZsZXhQaW5QcmVwIHsKLSAgcHVibGljOgotICAgIC8vIGNvbnN0cnVjdG9yCi0gICAgRmxleFBpblByZXAoZnJUZWNoT2JqZWN0KiB0ZWNoSW4sCi0gICAgICAgICAgICAgICAgZnJEZXNpZ24qIGRlc2lnbkluLAotICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGZyVHJhY2tQYXR0ZXJuKj4gJnByZWZUcmFja1BhdHRlcm5zSW4sCi0gICAgICAgICAgICAgICAgc3RkOjptYXA8ZnJCbG9jayosIHN0ZDo6bWFwPGZyT3JpZW50LCBzdGQ6Om1hcDxzdGQ6OnZlY3RvcjxmckNvb3JkPiwgc3RkOjpzZXQ8ZnJJbnN0KiwgZnJCbG9ja09iamVjdENvbXA+ID4gPiwgZnJCbG9ja09iamVjdENvbXA+ICZ0cmFja09mZnNldE1hcEluKToKLSAgICAgICAgICAgICAgICB0ZWNoKHRlY2hJbiksIGRlc2lnbihkZXNpZ25JbiksIHByZWZUcmFja1BhdHRlcm5zKHByZWZUcmFja1BhdHRlcm5zSW4pLCB0cmFja09mZnNldE1hcCh0cmFja09mZnNldE1hcEluKSB7fTsKLQotICAgIC8vIGdldHRlcnMKLSAgICAvLyBzdGQ6OnNoYXJlZF9wdHI8ZnJUZWNoT2JqZWN0PiBnZXRUZWNoKCkgY29uc3QgewotICAgIC8vICAgcmV0dXJuIHRlY2gubG9jaygpOwotICAgIC8vIH0KLSAgICAvLyBzdGQ6OnNoYXJlZF9wdHI8ZnJEZXNpZ24+IGdldERlc2lnbigpIGNvbnN0IHsKLSAgICAvLyAgIHJldHVybiBkZXNpZ24ubG9jaygpOwotICAgIC8vIH0KLSAgICBmclRlY2hPYmplY3QqIGdldFRlY2goKSBjb25zdCB7Ci0gICAgICByZXR1cm4gdGVjaDsKLSAgICB9Ci0gICAgZnJEZXNpZ24qIGdldERlc2lnbigpIGNvbnN0IHsKLSAgICAgIHJldHVybiBkZXNpZ247Ci0gICAgfQotICAgIC8vIG90aGVycwotICAgIHZvaWQgaW5pdCgpOwotICAgIGludCBtYWluKCk7Ci0gICAgdm9pZCByZXBvcnRQaW5Mb2MoKTsKLSAgICAKLQotICAgIHZvaWQgcGluUHJlcCgpOwotICAgIHZvaWQgbmV0UGluUHJlcChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8ZnJOZXQ+ICZuZXQpOwotICAgIHZvaWQgbWVyZ2VQaW5TaGFwZXMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGZyUGluPiAmcGluLCBzdGQ6Om1hcDxmckxheWVyTnVtLCBQb2x5Z29uU2V0PiAmbGF5ZXJOdW0yUFMpOwotICAgIHZvaWQgbWVyZ2VQaW5TaGFwZXMoZnJQaW4qIHBpbiwgZnJUcmFuc2Zvcm0gJnhmb3JtLCBzdGQ6Om1hcDxmckxheWVyTnVtLCBQb2x5Z29uU2V0PiAmbGF5ZXJOdW0yUFMpOwotICAgIHZvaWQgbWVyZ2VQaW5TaGFwZXMoZnJQaW4qIHBpbiwgc3RkOjptYXA8ZnJMYXllck51bSwgUG9seWdvblNldD4gJmxheWVyTnVtMlBTKTsKLSAgICB2b2lkIGdldFBpbkxheWVyQkJveChjb25zdCBzdGQ6Om1hcDxmckxheWVyTnVtLCBQb2x5Z29uU2V0PiAmbGF5ZXJOdW0yUFMsIAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGZyTGF5ZXJOdW0sIFJlY3RhbmdsZT4gJmxheWVyTnVtMkJCb3gpOwotICAgIHZvaWQgZ2V0UGluVHJhY2tQYXR0ZXJucyhjb25zdCBzdGQ6Om1hcDxmckxheWVyTnVtLCBQb2x5Z29uU2V0PiAmbGF5ZXJOdW0yUFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGZyQ29vcmQsIHN0ZDo6bWFwPGZyTGF5ZXJOdW0sIHN0ZDo6c2hhcmVkX3B0cjxmclRyYWNrUGF0dGVybj4gPiA+ICZ4TG9jMlRyYWNrUGF0dGVybnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGZyQ29vcmQsIHN0ZDo6bWFwPGZyTGF5ZXJOdW0sIHN0ZDo6c2hhcmVkX3B0cjxmclRyYWNrUGF0dGVybj4gPiA+ICZ5TG9jMlRyYWNrUGF0dGVybnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGZyTGF5ZXJOdW0sIGZyUHJlZlJvdXRpbmdEaXJFbnVtPiAmbGF5ZXJOdW0yUHJlZlJvdXRlRGlyKTsKLSAgICB2b2lkIGdldExheWVyT25HcmlkUG9pbnRzKGNvbnN0IHN0ZDo6bWFwPGZyTGF5ZXJOdW0sIFBvbHlnb25TZXQ+ICZsYXllck51bTJQUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPGZyQ29vcmQsIHN0ZDo6bWFwPGZyTGF5ZXJOdW0sIHN0ZDo6c2hhcmVkX3B0cjxmclRyYWNrUGF0dGVybj4gPiA+ICZ4TG9jMlRyYWNrUGF0dGVybnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxmckNvb3JkLCBzdGQ6Om1hcDxmckxheWVyTnVtLCBzdGQ6OnNoYXJlZF9wdHI8ZnJUcmFja1BhdHRlcm4+ID4gPiAmeUxvYzJUcmFja1BhdHRlcm5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8ZnJMYXllck51bSwgZnJQcmVmUm91dGluZ0RpckVudW0+IGxheWVyTnVtMlByZWZSb3V0ZURpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGZyTGF5ZXJOdW0sIHN0ZDo6c2V0PGZyUG9pbnQ+ID4gJmxheWVyTnVtMk9uR3JpZFBvaW50cyk7Ci0gICAgdm9pZCBmaWx0ZXJPbkdyaWRBY2Nlc3NQb2ludChjb25zdCBzdGQ6Om1hcDxmckxheWVyTnVtLCBQb2x5Z29uU2V0PiAmbGF5ZXJOdW0yUFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxmckxheWVyTnVtLCBzdGQ6OnNldDxmclBvaW50PiA+ICZsYXllck51bTJPbkdyaWRQb2ludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxmckxheWVyTnVtLCBzdGQ6OnNldDxmclBvaW50PiA+ICZsYXllck51bTJPbkdyaWRBY2Nlc3NQb2ludHMpOwotCi0gICAgdm9pZCBnZXRQaW5HQ2VsbFNwYW4oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGZyUGluPiAmcGluLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPGZyTGF5ZXJOdW0sIFBvbHlnb25TZXQ+ICZsYXllck51bTJQUywKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxmclBvaW50LCBzdGQ6OnNldDxmckxheWVyTnVtPiA+ICZvdmxwR0NlbGwyTGF5ZXIpOwotICAgIHZvaWQgZ2VuQW5kUG9wdWxhdGVMYXllcjJBUFJ0cmVlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxmck5ldD4gJm5ldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxmckxheWVyTnVtLCBQb2x5Z29uU2V0PiAmbGF5ZXJOdW0yUFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8ZnJMYXllck51bSwgc3RkOjpzZXQ8ZnJQb2ludD4gPiAmbGF5ZXJOdW0yT25HcmlkUG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGZyTGF5ZXJOdW0sIGJnaTo6cnRyZWU8IHJxX2l0ZXJfdmFsdWVfdDxGbGV4QWNjZXNzUGF0dGVybj4sIGJnaTo6cXVhZHJhdGljPDE2PiA+ID4gJmxheWVyMkFQcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8ZnJQaW4+ICZwaW4pOwotICAgIHZvaWQgYWRkT2ZmR3JpZFBpbkFjY2Vzc1BhdHRlcm4oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGZyTmV0PiAmbmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8ZnJMYXllck51bSwgUG9seWdvblNldD4gJmxheWVyTnVtMlBTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8ZnJQb2ludCwgc3RkOjpzZXQ8ZnJMYXllck51bT4gPiAmb3ZscEdDZWxsMkxheWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8ZnJMYXllck51bSwgYmdpOjpydHJlZTwgcnFfaXRlcl92YWx1ZV90PEZsZXhBY2Nlc3NQYXR0ZXJuPiwgYmdpOjpxdWFkcmF0aWM8MTY+ID4gPiAmbGF5ZXIyQVBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGZyUGluPiAmcGluKTsKLSAgICAvLyBib29sIGluc3RUZXJtUGluUHJlcChmckluc3RUZXJtICppbnN0VGVybSwKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxmclBpbiosIHN0ZDo6c2V0PHN0ZDo6cGFpcjxzdGQ6OnBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4sIHN0ZDo6cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiA+ID4gPiAmcGluMkFQRVBzKTsKLSAgICB2b2lkIGluc3RUZXJtUGluUHJlcChmckluc3RUZXJtKiBpbnN0VGVybSwgY29uc3Qgc3RkOjpzZXQ8ZnJJbnN0KiwgZnJCbG9ja09iamVjdENvbXA+ICZpbnN0c0luKTsKLSAgICAvLyB2b2lkIHRlcm1QaW5QcmVwKGZyVGVybSogdGVybSwKLSAgICAvLyAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGZyUGluKiwgc3RkOjpzZXQ8c3RkOjpwYWlyPHN0ZDo6cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiwgc3RkOjpwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+ID4gPiA+ICZwaW4yQVBFUHMpOwotICAgIHZvaWQgdGVybVBpblByZXAoZnJUZXJtICp0ZXJtKTsKLSAgICB2b2lkIGdldFBpbkJCb3hUcmFja1BhdHRlcm5zKGNvbnN0IHN0ZDo6bWFwPGZyTGF5ZXJOdW0sIFJlY3RhbmdsZT4gJmxheWVyTnVtMkJCb3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxmckNvb3JkLCBzdGQ6Om1hcDxmckxheWVyTnVtLCBzdGQ6OnNoYXJlZF9wdHI8ZnJUcmFja1BhdHRlcm4+ID4gPiAmeExvYzJUcmFja1BhdHRlcm5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8ZnJDb29yZCwgc3RkOjptYXA8ZnJMYXllck51bSwgc3RkOjpzaGFyZWRfcHRyPGZyVHJhY2tQYXR0ZXJuPiA+ID4gJnlMb2MyVHJhY2tQYXR0ZXJucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGZyTGF5ZXJOdW0sIGZyUHJlZlJvdXRpbmdEaXJFbnVtPiAmbGF5ZXJOdW0yUHJlZlJvdXRlRGlyKTsKLSAgICB2b2lkIGdldFBpbkxheWVyQkJveFRyYWNrUGF0dGVybnMoY29uc3QgZnJMYXllck51bSAmY3VyckxheWVyTnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQb2x5Z29uU2V0ICZjdXJyTGF5ZXJQUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8ZnJDb29yZCwgc3RkOjptYXA8ZnJMYXllck51bSwgZnJUcmFja1BhdHRlcm4qPiA+ICZ4TG9jMlRyYWNrUGF0dGVybnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGZyQ29vcmQsIHN0ZDo6bWFwPGZyTGF5ZXJOdW0sIGZyVHJhY2tQYXR0ZXJuKj4gPiAmeUxvYzJUcmFja1BhdHRlcm5zKTsKLSAgICB2b2lkIGdldFBpbkxheWVyQVBTdGFydFBvaW50cyhjb25zdCBmckxheWVyTnVtICZjdXJyTGF5ZXJOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUG9seWdvblNldCAmY3VyckxheWVyUFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8ZnJDb29yZCwgc3RkOjptYXA8ZnJMYXllck51bSwgZnJUcmFja1BhdHRlcm4qPiA+ICZ4TG9jMlRyYWNrUGF0dGVybnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8ZnJDb29yZCwgc3RkOjptYXA8ZnJMYXllck51bSwgZnJUcmFja1BhdHRlcm4qPiA+ICZ5TG9jMlRyYWNrUGF0dGVybnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8ZnJQb2ludCwgaW50PiAmc3RhcnRQb2ludHMpOwotICAgIHZvaWQgZ2V0UGluTGF5ZXJBUFN0YXJ0UG9pbnRzX3NoYXBlQ2VudGVyKGNvbnN0IGZyTGF5ZXJOdW0gJmN1cnJMYXllck51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQb2x5Z29uU2V0ICZjdXJyTGF5ZXJQUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxmckNvb3JkLCBzdGQ6Om1hcDxmckxheWVyTnVtLCBmclRyYWNrUGF0dGVybio+ID4gJnhMb2MyVHJhY2tQYXR0ZXJucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxmckNvb3JkLCBzdGQ6Om1hcDxmckxheWVyTnVtLCBmclRyYWNrUGF0dGVybio+ID4gJnlMb2MyVHJhY2tQYXR0ZXJucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxmclBvaW50LCBpbnQ+ICZzdGFydFBvaW50cyk7Ci0gICAgdm9pZCBnZXRQaW5MYXllckFQRW5kUG9pbnRzKGNvbnN0IGZyTGF5ZXJOdW0gJmN1cnJMYXllck51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUG9seWdvblNldCAmY3VyckxheWVyUFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGZyQ29vcmQsIHN0ZDo6bWFwPGZyTGF5ZXJOdW0sIGZyVHJhY2tQYXR0ZXJuKj4gPiAmeExvYzJUcmFja1BhdHRlcm5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxmckNvb3JkLCBzdGQ6Om1hcDxmckxheWVyTnVtLCBmclRyYWNrUGF0dGVybio+ID4gJnlMb2MyVHJhY2tQYXR0ZXJucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8c3RkOjpwYWlyPGZyTGF5ZXJOdW0sIGZyUG9pbnQ+ID4gJmVuZFBvaW50cyk7Ci0gICAgdm9pZCBnZXRBY2Nlc3NQYXR0ZXJuKGNvbnN0IGZyUG9pbnQgJnN0YXJ0UG9pbnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmckxheWVyTnVtICZzdGFydExheWVyTnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmclBvaW50ICZlbmRQb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJMYXllck51bSAmZW5kTGF5ZXJOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZsZXhBY2Nlc3NQYXR0ZXJuICZhcCk7Ci0gICAgCi0gICAgdm9pZCBnZXRQbGFuYXJFUChjb25zdCBmckxheWVyTnVtICZsYXllck51bSwgY29uc3QgZnJQb2ludCAmc3RhcnRQdCwgY29uc3QgZnJEaXJFbnVtICZkaXIsIGZyUG9pbnQgJmVuZFB0KTsKLQotICAgIGJvb2wgaXNWYWxpZFZpYUFjY2VzcyhmclBpbiAqcGluUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmckluc3RUZXJtICppbnN0VGVybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8ZnJCbG9ja09iamVjdCo+IGluc3RPYmpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmckxheWVyTnVtICZsYXllck51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJQb2ludCAmc3RhcnRQdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnJWaWFEZWYqIHZpYURlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdmlhUHJpb3JpdHlUdXBsZSAmcHJpb3JpdHkpOwotICAgIGJvb2wgaXNWYWxpZFZpYUFjY2VzcyhmclBpbiAqcGluUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmclRlcm0gKnRlcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGZyQmxvY2tPYmplY3QqPiBpbnN0T2JqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJMYXllck51bSAmbGF5ZXJOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyUG9pbnQgJnN0YXJ0UHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZyVmlhRGVmKiB2aWFEZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHZpYVByaW9yaXR5VHVwbGUgJnByaW9yaXR5KTsKLSAgICBib29sIGlzVmFsaWRQbGFuYXJBY2Nlc3MoZnJQaW4qIHBpblB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJJbnN0VGVybSAqaW5zdFRlcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGZyQmxvY2tPYmplY3QqPiBpbnN0T2JqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJMYXllck51bSAmbGF5ZXJOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyUG9pbnQgJnN0YXJ0UHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyUG9pbnQgJmVuZFB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQb2x5Z29uU2V0ICZsYXllclBTKTsKLSAgICBib29sIGlzVmFsaWRQbGFuYXJBY2Nlc3MoZnJQaW4qIHBpblB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJUZXJtICp0ZXJtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxmckJsb2NrT2JqZWN0Kj4gaW5zdE9ianMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyTGF5ZXJOdW0gJmxheWVyTnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmclBvaW50ICZzdGFydFB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmclBvaW50ICZlbmRQdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUG9seWdvblNldCAmbGF5ZXJQUyk7Ci0gICAgdm9pZCB1cGRhdGVBUENvc3QoZnJJbnN0ICppbnN0KTsKLSAgICB2b2lkIGdldFZpYVJhd1ByaW9yaXR5KGZyVmlhRGVmKiB2aWFEZWYsIHZpYVJhd1ByaW9yaXR5VHVwbGUgJnByaW9yaXR5KTsKLSAgcHJvdGVjdGVkOgotICAgIGZyVGVjaE9iamVjdCAqdGVjaDsKLSAgICBmckRlc2lnbiAqZGVzaWduOwotICAgIGludCBBUENudCA9IDA7Ci0gICAgc3RkOjp2ZWN0b3I8ZnJUcmFja1BhdHRlcm4qPiBwcmVmVHJhY2tQYXR0ZXJuczsKLSAgICBzdGQ6Om1hcDxmckJsb2NrKiwgc3RkOjptYXA8ZnJPcmllbnQsIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPGZyQ29vcmQ+LCBzdGQ6OnNldDxmckluc3QqLCBmckJsb2NrT2JqZWN0Q29tcD4gPiA+LCBmckJsb2NrT2JqZWN0Q29tcD4gdHJhY2tPZmZzZXRNYXA7Ci0gICAgc3RkOjptYXA8ZnJMYXllck51bSwgc3RkOjptYXA8aW50LCBzdGQ6Om1hcDx2aWFSYXdQcmlvcml0eVR1cGxlLCBmclZpYURlZio+ID4gPiBsYXllck51bTJWaWFEZWZzOwotICAgIGludCBtYXhWaWFBdHRlbXB0TGltaXQgPSAzOwotICAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGU+IGFjY3VTcGFuMCwgYWNjdVNwYW4xLCBhY2N1U3BhbjI7Ci0gICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZT4gZHJjU3BhbjAsIGRyY1NwYW4xLCBkcmNTcGFuMjsKLSAgfTsKLX0KLQotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvaW8vZnJTaGFwZVV0aWwuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvaW8vZnJTaGFwZVV0aWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGRlNzE5Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2lvL2ZyU2hhcGVVdGlsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDgwMSArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW8vZnJTaGFwZVV0aWwuaCIKLSNpbmNsdWRlIDxib29zdC9pY2wvaW50ZXJ2YWxfbWFwLmhwcD4KLQotbmFtZXNwYWNlIGZyIHsKLSAgdm9pZCBmclJlY3QyUG9seShmclJlY3QgJnJlY3RJbiwgYm9vc3RQb2x5Z29uICZwb2x5T3V0KSB7Ci0gICAgZnJCb3ggdG1wQm94OwotICAgIHJlY3RJbi5nZXRCQm94KHRtcEJveCk7Ci0gICAgcG9seU91dCA9IGJvb3N0UG9seWdvbigpOwotICAgIGJnOjphcHBlbmQocG9seU91dCwgYm9vc3RQb2ludCh0bXBCb3gubGVmdCgpLCB0bXBCb3guYm90dG9tKCkpKTsKLSAgICBiZzo6YXBwZW5kKHBvbHlPdXQsIGJvb3N0UG9pbnQodG1wQm94LmxlZnQoKSwgdG1wQm94LnRvcCgpKSk7Ci0gICAgYmc6OmFwcGVuZChwb2x5T3V0LCBib29zdFBvaW50KHRtcEJveC5yaWdodCgpLCB0bXBCb3gudG9wKCkpKTsKLSAgICBiZzo6YXBwZW5kKHBvbHlPdXQsIGJvb3N0UG9pbnQodG1wQm94LnJpZ2h0KCksIHRtcEJveC5ib3R0b20oKSkpOwotICAgIGJnOjphcHBlbmQocG9seU91dCwgYm9vc3RQb2ludCh0bXBCb3gubGVmdCgpLCB0bXBCb3guYm90dG9tKCkpKTsKLSAgfQotCi0gIHZvaWQgZnJQb2x5Z29uMlBvbHkoZnJQb2x5Z29uICZwb2x5Z29uSW4sIGJvb3N0UG9seWdvbiAmcG9seU91dCkgewotICAgIHBvbHlPdXQgPSBib29zdFBvbHlnb24oKTsKLSAgICBhdXRvIHBvbHlQb2ludHMgPSBwb2x5Z29uSW4uZ2V0UG9pbnRzKCk7Ci0gICAgZm9yIChhdXRvICZwb2ludDogcG9seVBvaW50cykgewotICAgICAgYmc6OmFwcGVuZChwb2x5T3V0LCBib29zdFBvaW50KChpbnQpcG9pbnQueCgpLCAoaW50KXBvaW50LnkoKSkpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgZnJCb3gyUG9seShmckJveCAmYm94SW4sIGJvb3N0UG9seWdvbiAmcG9seU91dCkgewotICAgIHBvbHlPdXQgPSBib29zdFBvbHlnb24oKTsKLSAgICBiZzo6YXBwZW5kKHBvbHlPdXQsIGJvb3N0UG9pbnQoYm94SW4ubGVmdCgpLCBib3hJbi5ib3R0b20oKSkpOwotICAgIGJnOjphcHBlbmQocG9seU91dCwgYm9vc3RQb2ludChib3hJbi5sZWZ0KCksIGJveEluLnRvcCgpKSk7Ci0gICAgYmc6OmFwcGVuZChwb2x5T3V0LCBib29zdFBvaW50KGJveEluLnJpZ2h0KCksIGJveEluLnRvcCgpKSk7Ci0gICAgYmc6OmFwcGVuZChwb2x5T3V0LCBib29zdFBvaW50KGJveEluLnJpZ2h0KCksIGJveEluLmJvdHRvbSgpKSk7Ci0gICAgYmc6OmFwcGVuZChwb2x5T3V0LCBib29zdFBvaW50KGJveEluLmxlZnQoKSwgYm94SW4uYm90dG9tKCkpKTsKLSAgfQotCi0gIHZvaWQgZnJCb3gyUmVjdGFuZ2xlKGZyQm94ICZib3hJbiwgUmVjdGFuZ2xlICZyZWN0T3V0KSB7Ci0gICAgcmVjdE91dCA9IFJlY3RhbmdsZShib3hJbi5sZWZ0KCksIGJveEluLmJvdHRvbSgpLCBib3hJbi5yaWdodCgpLCBib3hJbi50b3AoKSk7Ci0gIH0KLQotICB2b2lkIGZyUmVjdDJSZWN0YW5nbGUoZnJSZWN0ICZyZWN0SW4sIFJlY3RhbmdsZSAmcmVjdE91dCkgewotICAgIGZyQm94IHJlY3RJbkJveDsKLSAgICByZWN0SW4uZ2V0QkJveChyZWN0SW5Cb3gpOwotICAgIHJlY3RPdXQgPSBSZWN0YW5nbGUocmVjdEluQm94LmxlZnQoKSwgcmVjdEluQm94LmJvdHRvbSgpLCByZWN0SW5Cb3gucmlnaHQoKSwgcmVjdEluQm94LnRvcCgpKTsKLSAgfQotCi0gIHZvaWQgZnJCbG9ja2FnZTJQb2x5KGZyQmxvY2thZ2UgJmJsb2NrYWdlSW4sIGJvb3N0UG9seWdvbiAmcG9seU91dCkgewotICAgIGF1dG8gcG9pbnRzID0gYmxvY2thZ2VJbi5nZXRQb2ludHMoKTsKLSAgICBwb2x5T3V0ID0gYm9vc3RQb2x5Z29uKCk7Ci0gICAgZm9yIChhdXRvIHBvaW50OiBwb2ludHMpIHsKLSAgICAgIGJnOjphcHBlbmQocG9seU91dCwgYm9vc3RQb2ludChwb2ludC54KCksIHBvaW50LnkoKSkpOwotICAgIH0KLSAgfQotCi0gIC8vIFVzZSBiZWZvcmUgY2hlY2tpbmcgb3ZlcmxhcHBpbmcKLSAgZG91YmxlIGZyQm94MkJveERpc3QoZnJCb3ggJmJveDEsIGZyQm94ICZib3gyKSB7Ci0gICAgZnJDb29yZCB4RGlzdCA9IHN0ZDo6bWF4KDAsIHN0ZDo6bWF4KGJveDEubGVmdCgpLCBib3gyLmxlZnQoKSkgLSBzdGQ6Om1pbihib3gxLnJpZ2h0KCksIGJveDIucmlnaHQoKSkgKTsKLSAgICBmckNvb3JkIHlEaXN0ID0gc3RkOjptYXgoMCwgc3RkOjptYXgoYm94MS5ib3R0b20oKSwgYm94Mi5ib3R0b20oKSkgLSBzdGQ6Om1pbihib3gxLnRvcCgpLCBib3gyLnRvcCgpKSk7Ci0gICAgcmV0dXJuIHN0ZDo6c3FydCh4RGlzdCAqIHhEaXN0ICsgeURpc3QgKiB5RGlzdCk7Ci0gIH0KLQotICBkb3VibGUgZnJCb3gyQm94RGlzdChib3hfdCAmYm94MSwgYm94X3QgJmJveDIpIHsKLSAgICBmckNvb3JkIGxseDEsIGxseTEsIHVyeDEsIHVyeTEsIGxseDIsIGxseTIsIHVyeDIsIHVyeTI7Ci0gICAgbGx4MSA9IGJnOjpnZXQ8Ymc6Om1pbl9jb3JuZXIsIDA+KGJveDEpOwotICAgIGxseTEgPSBiZzo6Z2V0PGJnOjptaW5fY29ybmVyLCAxPihib3gxKTsKLSAgICB1cngxID0gYmc6OmdldDxiZzo6bWF4X2Nvcm5lciwgMD4oYm94MSk7Ci0gICAgdXJ5MSA9IGJnOjpnZXQ8Ymc6Om1heF9jb3JuZXIsIDE+KGJveDEpOwotICAgIGxseDIgPSBiZzo6Z2V0PGJnOjptaW5fY29ybmVyLCAwPihib3gyKTsKLSAgICBsbHkyID0gYmc6OmdldDxiZzo6bWluX2Nvcm5lciwgMT4oYm94Mik7Ci0gICAgdXJ4MiA9IGJnOjpnZXQ8Ymc6Om1heF9jb3JuZXIsIDA+KGJveDIpOwotICAgIHVyeTIgPSBiZzo6Z2V0PGJnOjptYXhfY29ybmVyLCAxPihib3gyKTsKLSAgICBmckNvb3JkIHhEaXN0ID0gc3RkOjptYXgoMCwgc3RkOjptYXgobGx4MSwgbGx4MikgLSBzdGQ6Om1pbih1cngxLCB1cngyKSk7Ci0gICAgZnJDb29yZCB5RGlzdCA9IHN0ZDo6bWF4KDAsIHN0ZDo6bWF4KGxseTEsIGxseTIpIC0gc3RkOjptaW4odXJ5MSwgdXJ5MikpOwotICAgIHJldHVybiBzdGQ6OnNxcnQoeERpc3QgKiB4RGlzdCArIHlEaXN0ICogeURpc3QpOwotICB9Ci0KLSAgYm9vbCBpc1NhbWVQb2ludChib29zdFBvaW50ICZwdDEsIGJvb3N0UG9pbnQgJnB0MikgewotICAgIGF1dG8geDEgPSBiZzo6Z2V0PDA+KHB0MSk7Ci0gICAgYXV0byB5MSA9IGJnOjpnZXQ8MT4ocHQxKTsKLSAgICBhdXRvIHgyID0gYmc6OmdldDwwPihwdDIpOwotICAgIGF1dG8geTIgPSBiZzo6Z2V0PDE+KHB0Mik7Ci0gICAgcmV0dXJuICh4MSA9PSB4MiAmJiB5MSA9PSB5Mik7Ci0gIH0KLQotICBmckNvb3JkIGdldEVkZ2VXaWR0aChib29zdEVkZ2UgJmVkZ2UpIHsKLSAgICBhdXRvIHBvaW50MSA9IGVkZ2UuZmlyc3Q7Ci0gICAgYXV0byBwb2ludDIgPSBlZGdlLnNlY29uZDsKLSAgICBhdXRvIHB0MVggPSBiZzo6Z2V0PDA+KHBvaW50MSk7Ci0gICAgYXV0byBwdDFZID0gYmc6OmdldDwxPihwb2ludDEpOwotICAgIGF1dG8gcHQyWCA9IGJnOjpnZXQ8MD4ocG9pbnQyKTsKLSAgICBhdXRvIHB0MlkgPSBiZzo6Z2V0PDE+KHBvaW50Mik7Ci0KLSAgICBpZiAocHQxWCA9PSBwdDJYKSB7Ci0gICAgICByZXR1cm4gKHN0ZDo6YWJzKHB0MlkgLSBwdDFZKSk7Ci0gICAgfSBlbHNlIGlmIChwdDFZID09IHB0MlkpIHsKLSAgICAgIHJldHVybiAoc3RkOjphYnMocHQyWCAtIHB0MVgpKTsKLSAgICB9IGVsc2UgewotICAgICAgc3RkOjpjb3V0IDw8ICJXYXJuaW5nOiBlZGdlIGlzIG5vdCBvcnRob2dvbmFsXG4iOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIH0KLQotICB2b2lkIHBvbHlDb3ZlcmluZyhib29zdFBvbHlnb24gJnBvbHlnb24sIGZyQ29sbGVjdGlvbjxmclJlY3Q+ICZyZWN0cykgewotICAgIC8vIGRlYnVnIAotICAgIC8vIHN0ZDo6Y291dCA8PCAiICBzdGFydCBwb2x5Q292ZXJpbmdcbiIgPDwgc3RkOjpmbHVzaDsgCi0gICAgZnJDb2xsZWN0aW9uPGZyQ29vcmQ+IHgsIHk7Ci0gICAgZnJDb2xsZWN0aW9uPGJvb3N0UG9pbnQ+IHBvaW50czsKLSAgICBzdGQ6OnNldDxmckNvb3JkPiB4SW50diwgeUludHY7Ci0gICAgc3RkOjp2ZWN0b3I8ZnJDb29yZD4geFRpY2ssIHlUaWNrOwotICAgIHN0ZDo6c2V0PHN0ZDo6cGFpcjxpbnQsaW50PiA+IEhTbGljZVN0YXJ0LCBWU2xpY2VTdGFydDsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjxib29sPiA+IGlzT2NjdXBpZWQ7Ci0gICAgc3RkOjpzZXQ8c3RkOjpwYWlyPGludCwgaW50PiA+IG1heEhTbGljZSwgbWF4VlNsaWNlOwotICAgIHN0ZDo6c2V0PHN0ZDo6dHVwbGU8aW50LCBpbnQsIGludCwgaW50PiA+IG1heFJlY3RTZXQ7Ci0gICAgc3RkOjpwYWlyPGludCwgaW50PiB0bXBQb2ludDsKLQotCi0KLSAgICAKLSAgICAvLyBleHRlcmlvciByaW5nCi0gICAgYXV0byByaW5nID0gYmc6OmV4dGVyaW9yX3JpbmcocG9seWdvbik7Ci0gICAgZm9yIChhdXRvIGl0ID0gcmluZy5iZWdpbigpOyBpdCAhPSByaW5nLmVuZCgpOyArK2l0KSB7Ci0gICAgICBwb2ludHMucHVzaF9iYWNrKCppdCk7Ci0gICAgfQotICAgIC8vIGludGVyaW9yIHJpbmdzCi0gICAgQk9PU1RfRk9SRUFDSChhdXRvICYgcmluZywgYmc6OmludGVyaW9yX3JpbmdzKHBvbHlnb24pKSB7Ci0gICAgICBmb3IgKGF1dG8gaXQgPSByaW5nLmJlZ2luKCk7IGl0ICE9IHJpbmcuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgcG9pbnRzLnB1c2hfYmFjaygqaXQpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIHB1c2hfYmFjayB0byB4IGFuZCB5IAotICAgIGZvciAoYXV0byAmcG9pbnQ6IHBvaW50cykgewotICAgICAgeC5wdXNoX2JhY2socG9pbnQuZ2V0PDA+KCkpOwotICAgICAgeS5wdXNoX2JhY2socG9pbnQuZ2V0PDE+KCkpOwotICAgIH0KLSAgICB4SW50diA9IHN0ZDo6c2V0PGZyQ29vcmQ+KHguYmVnaW4oKSwgeC5lbmQoKSk7Ci0gICAgeUludHYgPSBzdGQ6OnNldDxmckNvb3JkPih5LmJlZ2luKCksIHkuZW5kKCkpOwotCi0gICAgc3RkOjpjb3B5KHhJbnR2LmJlZ2luKCksIHhJbnR2LmVuZCgpLCBzdGQ6OmJhY2tfaW5zZXJ0ZXIoeFRpY2spKTsKLSAgICBzdGQ6OmNvcHkoeUludHYuYmVnaW4oKSwgeUludHYuZW5kKCksIHN0ZDo6YmFja19pbnNlcnRlcih5VGljaykpOwotCi0gICAgLy8gc3RkOjpjb3V0IDw8ICIgICAgcG9seUNvdmVyaW5nOiBudW0gcG9pbnRzID0gIiA8PCBwb2ludHMuc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKLSAgICAvLyBzdGQ6OmNvdXQgPDwgIiAgICBwb2x5Q292ZXJpbmc6IHx4VGlja3wgPSAiIDw8IHhUaWNrLnNpemUoKSA8PCAiLCB8eVRpY2t8ID0gIiA8PCB5VGljay5zaXplKCkgPDwgc3RkOjplbmRsOwotCi0gICAgaXNPY2N1cGllZCA9IHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGJvb2w+ID4oeFRpY2suc2l6ZSgpIC0gMSwgc3RkOjp2ZWN0b3I8Ym9vbD4oeVRpY2suc2l6ZSgpIC0gMSwgZmFsc2UpKTsKLQotICAgIC8vIGRlYnVnIAotICAgIC8vIHN0ZDo6Y291dCA8PCAiICAgIHN0YXJ0IGJ1aWxkaW5nIGstbWFwXG4iIDw8IHN0ZDo6Zmx1c2g7IAotICAgIC8vIGJ1aWxkIGstbWFwCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KXhUaWNrLnNpemUoKSAtIDE7IGkrKykgewotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAoaW50KXlUaWNrLnNpemUoKSAtIDE7IGorKykgewotICAgICAgICBmckNvb3JkIHRlbXBYID0gKHhUaWNrLmF0KGkpICsgeFRpY2suYXQoaSArIDEpKSAvIDI7Ci0gICAgICAgIGZyQ29vcmQgdGVtcFkgPSAoeVRpY2suYXQoaikgKyB5VGljay5hdChqICsgMSkpIC8gMjsKLSAgICAgICAgYm9vc3RQb2ludCB0ZW1wUHQodGVtcFgsIHRlbXBZKTsKLSAgICAgICAgaWYgKGJnOjpjb3ZlcmVkX2J5KHRlbXBQdCwgcG9seWdvbikpIHsKLSAgICAgICAgICBpc09jY3VwaWVkW2ldW2pdID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIHByaW50Qm9vbE1hdHJpeChpc09jY3VwaWVkKTsKLQotICAgIC8vIGRlYnVnIAotICAgIC8vIHN0ZDo6Y291dCA8PCAiICAgIHN0YXJ0IGJ1aWxkaW5nIHNsaWNlc1xuIiA8PCBzdGQ6OmZsdXNoOyAKLSAgICAvLyBidWlsZCBzbGljZXMKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpaXNPY2N1cGllZC5zaXplKCk7IGkrKykgewotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAoaW50KWlzT2NjdXBpZWRbaV0uc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgaWYgKGlzT2NjdXBpZWRbaV1bal0gPT0gZmFsc2UpIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyBob3Jpem9udGFsCi0gICAgICAgICAgLy8gZGVidWcKLSAgICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgIiAgICAgIEggc2xpY2VzXG4iIDw8IHN0ZDo6Zmx1c2g7Ci0gICAgICAgICAgaWYgKGdldE1heEhTbGljZShpLCBqLCBpc09jY3VwaWVkLCBtYXhIU2xpY2UsIHRtcFBvaW50KSkgewotICAgICAgICAgICAgLy8gc3RkOjpjb3V0IDw8ICIgICAgICAgIGdldHRpbmcgbWF4IEggcmVjdFxuIiA8PCBzdGQ6OmZsdXNoOwotICAgICAgICAgICAgLy8gc3RkOjpjb3V0IDw8ICIgICAgICAgICAgc3RhcnRpbmcgcG9pbnQgPSAoIiA8PCB0bXBQb2ludC5maXJzdCA8PCAiLCAiIDw8IHRtcFBvaW50LnNlY29uZCA8PCAiKVxuIjsKLSAgICAgICAgICAgIGdldE1heEhSZWN0KHRtcFBvaW50LCBpc09jY3VwaWVkLCBtYXhIU2xpY2UsIG1heFJlY3RTZXQpOwotICAgICAgICAgICAgLy8gc3RkOjpjb3V0IDw8ICIgICAgICAgIGZpbmlzaCBnZXR0aW5nIG1heCBIIHJlY3RcbiIgPDwgc3RkOjpmbHVzaDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gdmVydGljYWwKLSAgICAgICAgICAvLyBkZWJ1ZwotICAgICAgICAgIC8vIHN0ZDo6Y291dCA8PCAiICAgICAgViBzbGljZXNcbiIgPDwgc3RkOjpmbHVzaDsKLSAgICAgICAgICBpZiAoZ2V0TWF4VlNsaWNlKGksIGosIGlzT2NjdXBpZWQsIG1heFZTbGljZSwgdG1wUG9pbnQpKSB7Ci0gICAgICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgIiAgICAgICAgZ2V0dGluZyBtYXggViByZWN0XG4iIDw8IHN0ZDo6Zmx1c2g7Ci0gICAgICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgIiAgICAgICAgICBzdGFydGluZyBwb2ludCA9ICgiIDw8IHRtcFBvaW50LmZpcnN0IDw8ICIsICIgPDwgdG1wUG9pbnQuc2Vjb25kIDw8ICIpXG4iOwotICAgICAgICAgICAgZ2V0TWF4VlJlY3QodG1wUG9pbnQsIGlzT2NjdXBpZWQsIG1heFZTbGljZSwgbWF4UmVjdFNldCk7Ci0gICAgICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgIiAgICAgICAgZmluaXNoIGdldHRpbmcgbWF4IFYgcmVjdFxuIiA8PCBzdGQ6OmZsdXNoOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIGRlYnVnIAotICAgIC8vIHN0ZDo6Y291dCA8PCAiICAgIHN0YXJ0IG91dHB1dGluZyByZXN1bHRcbiIgPDwgc3RkOjpmbHVzaDsgCi0gICAgLy8gc3RkOjpjb3V0IDw8ICIgICAgICBudW0gcmVjdHMgPSAiIDw8IG1heFJlY3RTZXQuc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKLSAgICBmb3IgKGF1dG8gaXQgPSBtYXhSZWN0U2V0LmJlZ2luKCk7IGl0ICE9IG1heFJlY3RTZXQuZW5kKCk7ICsraXQpIHsKLSAgICAgIGF1dG8gJnRtcFR1cGxlID0gKml0OwotICAgICAgLy8gc3RkOjpjb3V0IDw8ICIgICAgICAgKCIgPDwgZ2V0PDA+KHRtcFR1cGxlKSA8PCAiLCAiIDw8IGdldDwxPih0bXBUdXBsZSkgPDwgIikgLS0gKCIgCi0gICAgICAvLyAgICAgICAgICAgPDwgZ2V0PDI+KHRtcFR1cGxlKSA8PCAiLCAiIDw8IGdldDwzPih0bXBUdXBsZSkgPDwgIikiIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIGZyQm94IHRtcEJveDsKLSAgICAgIGZyUmVjdCB0bXBSZWN0OwotICAgICAgdG1wQm94LnNldCh4VGlja1tnZXQ8MD4odG1wVHVwbGUpXSwgeVRpY2tbZ2V0PDE+KHRtcFR1cGxlKV0sIHhUaWNrW2dldDwyPih0bXBUdXBsZSkgKyAxXSwgeVRpY2tbZ2V0PDM+KHRtcFR1cGxlKSArIDFdKTsKLSAgICAgIHRtcFJlY3Quc2V0QkJveCh0bXBCb3gpOwotICAgICAgcmVjdHMucHVzaF9iYWNrKHRtcFJlY3QpOwotICAgIH0KLQotICB9Ci0KLSAgLy8gZXZlcnkgcmVjdCBpbiBtYXhSZWN0U2V0IGlzIG1heGltdW0gYW1vbmcgYWxsIHJlY3RzIHNlZW4gc28gZmFyCi0gIHZvaWQgbWFpbnRhaW5NYXhSZWN0cyhzdGQ6OnR1cGxlPGludCwgaW50LCBpbnQsIGludD4gJm5ld1JlY3QsIHN0ZDo6c2V0PHN0ZDo6dHVwbGU8aW50LCBpbnQsIGludCwgaW50PiA+ICZtYXhSZWN0U2V0KSB7Ci0gICAgLy8gc3RkOjpjb3V0IDw8ICJwcm9jZXNzTmV3UmVjdCBvZiAoIiA8PCBzdGQ6OmdldDwwPihuZXdSZWN0KSA8PCAiLCAiIDw8IHN0ZDo6Z2V0PDE+KG5ld1JlY3QpIDw8ICIpIC0tICgiIAotICAgIC8vICAgICAgICAgICA8PCBzdGQ6OmdldDwyPihuZXdSZWN0KSA8PCAiLCAiIDw8IHN0ZDo6Z2V0PDM+KG5ld1JlY3QpIDw8ICIpIiA8PCBzdGQ6OmVuZGw7Ci0KLSAgICBib29zdEJveCB0bXBOZXdSZWN0KGJvb3N0UG9pbnQoc3RkOjpnZXQ8MD4obmV3UmVjdCksIHN0ZDo6Z2V0PDE+KG5ld1JlY3QpKSwgYm9vc3RQb2ludChzdGQ6OmdldDwyPihuZXdSZWN0KSwgc3RkOjpnZXQ8Mz4obmV3UmVjdCkpKTsKLSAgICAKLSAgICBpZiAobWF4UmVjdFNldC5zaXplKCkgPT0gMCkgewotICAgICAgLy8gc3RkOjpjb3V0IDw8ICJAQEBkZWJ1Z0BAQDogaW5zZXJ0ICgiIDw8IHN0ZDo6Z2V0PDA+KG5ld1JlY3QpIDw8ICIsICIgPDwgc3RkOjpnZXQ8MT4obmV3UmVjdCkgCi0gICAgICAvLyAgICAgICAgICAgPDwgIikgLS0gKCIgPDwgc3RkOjpnZXQ8Mj4obmV3UmVjdCkgPDwgIiwiIDw8IHN0ZDo6Z2V0PDM+KG5ld1JlY3QpIDw8ICIpXG4iOwotICAgICAgCi0gICAgICBtYXhSZWN0U2V0Lmluc2VydChuZXdSZWN0KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobWF4UmVjdFNldC5maW5kKG5ld1JlY3QpICE9IG1heFJlY3RTZXQuZW5kKCkpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxpbnQsIGludCwgaW50LCBpbnQ+ID4gY292ZXJlZFJlY3RzOwotICAgIC8vIGlzU2tpcCA9IGZhbHNlOwotICAgIGZvciAoYXV0byBpdCA9IG1heFJlY3RTZXQuYmVnaW4oKTsgaXQgIT0gbWF4UmVjdFNldC5lbmQoKTsgaXQrKykgewotICAgICAgYm9vc3RCb3ggdG1wUmVjdChib29zdFBvaW50KHN0ZDo6Z2V0PDA+KCppdCksIHN0ZDo6Z2V0PDE+KCppdCkpLCBib29zdFBvaW50KHN0ZDo6Z2V0PDI+KCppdCksIHN0ZDo6Z2V0PDM+KCppdCkpKTsKLSAgICAgIC8vIHN0ZDo6Y291dCA8PCAiICAgIGNoZWNraW5nIGFnYWluc3QgKCIgPDwgc3RkOjpnZXQ8MD4oKml0KSA8PCAiLCAiIDw8IHN0ZDo6Z2V0PDE+KCppdCkgPDwgIikgLS0gKCIgCi0gICAgICAgICAgICAvLyA8PCBzdGQ6OmdldDwyPigqaXQpIDw8ICIsICIgPDwgc3RkOjpnZXQ8Mz4oKml0KSA8PCAiKSIgPDwgc3RkOjplbmRsOwotICAgICAgaWYgKGJnOjpjb3ZlcmVkX2J5KHRtcE5ld1JlY3QsIHRtcFJlY3QpKSB7Ci0gICAgICAgIC8vIHN0ZDo6Y291dCA8PCAiQEBAZGVidWdAQEA6IGNvdmVyZWRfYnkgKCIgPDwgc3RkOjpnZXQ8MD4oKml0KSA8PCAiLCAiIDw8IHN0ZDo6Z2V0PDE+KCppdCkgCi0gICAgICAgIC8vICAgICAgICAgICA8PCAiKSAtLSAoIiA8PCBzdGQ6OmdldDwyPigqaXQpIDw8ICIsIiA8PCBzdGQ6OmdldDwzPigqaXQpIDw8ICIpXG4iOwotICAgICAgCi0gICAgICAgIC8vIG5ld1JlY3QgaXMgc3RyaWN0bHkgd2l0aGluIHNvbWUgZXhpc3RpbmcgUmVjdAotICAgICAgICByZXR1cm47Ci0gICAgICB9IGVsc2UgaWYgKGJnOjpjb3ZlcmVkX2J5KHRtcFJlY3QsIHRtcE5ld1JlY3QpKSB7Ci0gICAgICAgIGNvdmVyZWRSZWN0cy5wdXNoX2JhY2soKml0KTsKLSAgICAgICAgLy8gbWF4UmVjdFNldC5lcmFzZShpdCk7Ci0gICAgICAgIC8vIG1heFJlY3RTZXQuaW5zZXJ0KG5ld1JlY3QpOwotICAgICAgICAvLyBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIWNvdmVyZWRSZWN0cy5lbXB0eSgpKSB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpY292ZXJlZFJlY3RzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGF1dG8gaXQgPSBtYXhSZWN0U2V0LmZpbmQoY292ZXJlZFJlY3RzW2ldKTsKLSAgICAgICAgLy8gc3RkOjpjb3V0IDw8ICJAQEBkZWJ1Z0BAQDogZXJhc2UgKCIgPDwgc3RkOjpnZXQ8MD4oY292ZXJlZFJlY3RzW2ldKSA8PCAiLCAiIDw8IHN0ZDo6Z2V0PDE+KGNvdmVyZWRSZWN0c1tpXSkgCi0gICAgICAgIC8vICAgICAgICAgPDwgIikgLS0gKCIgPDwgc3RkOjpnZXQ8Mj4oY292ZXJlZFJlY3RzW2ldKSA8PCAiLCIgPDwgc3RkOjpnZXQ8Mz4oY292ZXJlZFJlY3RzW2ldKSA8PCAiKVxuIjsKLSAgICAgIAotICAgICAgICBtYXhSZWN0U2V0LmVyYXNlKGl0KTsKLSAgICAgIH0KLSAgICAgIAotICAgIH0KLSAgICAvLyBzdGQ6OmNvdXQgPDwgIkBAQGRlYnVnQEBAOiBpbnNlcnQgKCIgPDwgc3RkOjpnZXQ8MD4obmV3UmVjdCkgPDwgIiwgIiA8PCBzdGQ6OmdldDwxPihuZXdSZWN0KSAKLSAgICAvLyAgICAgICAgICAgICA8PCAiKSAtLSAoIiA8PCBzdGQ6OmdldDwyPihuZXdSZWN0KSA8PCAiLCIgPDwgc3RkOjpnZXQ8Mz4obmV3UmVjdCkgPDwgIilcbiI7Ci0gICAgICAKLSAgICBtYXhSZWN0U2V0Lmluc2VydChuZXdSZWN0KTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBib29sIHByb2Nlc3NOZXdSZWN0KHN0ZDo6dHVwbGU8aW50LCBpbnQsIGludCwgaW50PiAmbmV3UmVjdCwgc3RkOjpzZXQ8c3RkOjp0dXBsZTxpbnQsIGludCwgaW50LCBpbnQ+ID4gJm1heFJlY3RTZXQpIHsKLSAgICAvLyBzdGQ6OmNvdXQgPDwgInByb2Nlc3NOZXdSZWN0IG9mICgiIDw8IHN0ZDo6Z2V0PDA+KG5ld1JlY3QpIDw8ICIsICIgPDwgc3RkOjpnZXQ8MT4obmV3UmVjdCkgPDwgIikgLS0gKCIgCi0gICAgLy8gICAgICAgICAgIDw8IHN0ZDo6Z2V0PDI+KG5ld1JlY3QpIDw8ICIsICIgPDwgc3RkOjpnZXQ8Mz4obmV3UmVjdCkgPDwgIikiIDw8IHN0ZDo6ZW5kbDsKLQotICAgIGJvb3N0Qm94IHRtcE5ld1JlY3QoYm9vc3RQb2ludChzdGQ6OmdldDwwPihuZXdSZWN0KSwgc3RkOjpnZXQ8MT4obmV3UmVjdCkpLCBib29zdFBvaW50KHN0ZDo6Z2V0PDI+KG5ld1JlY3QpLCBzdGQ6OmdldDwzPihuZXdSZWN0KSkpOwotICAgIGJvb2wgaXNDaGFuZ2VkID0gdHJ1ZTsKLSAgICBpZiAobWF4UmVjdFNldC5maW5kKG5ld1JlY3QpICE9IG1heFJlY3RTZXQuZW5kKCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKG1heFJlY3RTZXQuc2l6ZSgpID09IDApIHsKLSAgICAgIC8vIHN0ZDo6Y291dCA8PCAiQEBAZGVidWdAQEA6IGluc2VydCAoIiA8PCBzdGQ6OmdldDwwPihuZXdSZWN0KSA8PCAiLCAiIDw8IHN0ZDo6Z2V0PDE+KG5ld1JlY3QpIAotICAgICAgLy8gICAgICAgICAgIDw8ICIpIC0tICgiIDw8IHN0ZDo6Z2V0PDI+KG5ld1JlY3QpIDw8ICIsIiA8PCBzdGQ6OmdldDwzPihuZXdSZWN0KSA8PCAiKVxuIjsKLSAgICAgIG1heFJlY3RTZXQuaW5zZXJ0KG5ld1JlY3QpOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgaXNDaGFuZ2VkID0gZmFsc2U7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxpbnQsIGludCwgaW50LCBpbnQ+ID4gY292ZXJlZFJlY3RzOwotICAgIC8vIGlzU2tpcCA9IGZhbHNlOwotICAgIGZvciAoYXV0byBpdCA9IG1heFJlY3RTZXQuYmVnaW4oKTsgaXQgIT0gbWF4UmVjdFNldC5lbmQoKTsgaXQrKykgewotICAgICAgYm9vc3RCb3ggdG1wUmVjdChib29zdFBvaW50KHN0ZDo6Z2V0PDA+KCppdCksIHN0ZDo6Z2V0PDE+KCppdCkpLCBib29zdFBvaW50KHN0ZDo6Z2V0PDI+KCppdCksIHN0ZDo6Z2V0PDM+KCppdCkpKTsKLSAgICAgIC8vIHN0ZDo6Y291dCA8PCAiICAgIGNoZWNraW5nIGFnYWluc3QgKCIgPDwgc3RkOjpnZXQ8MD4oKml0KSA8PCAiLCAiIDw8IHN0ZDo6Z2V0PDE+KCppdCkgPDwgIikgLS0gKCIgCi0gICAgICAgICAgICAvLyA8PCBzdGQ6OmdldDwyPigqaXQpIDw8ICIsICIgPDwgc3RkOjpnZXQ8Mz4oKml0KSA8PCAiKSIgPDwgc3RkOjplbmRsOwotICAgICAgaWYgKGJnOjpjb3ZlcmVkX2J5KHRtcE5ld1JlY3QsIHRtcFJlY3QpKSB7Ci0gICAgICAgIC8vIG5ld1JlY3QgaXMgc3RyaWN0bHkgd2l0aGluIHNvbWUgZXhpc3RpbmcgUmVjdAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9IGVsc2UgaWYgKGJnOjpjb3ZlcmVkX2J5KHRtcFJlY3QsIHRtcE5ld1JlY3QpKSB7Ci0gICAgICAgIGNvdmVyZWRSZWN0cy5wdXNoX2JhY2soKml0KTsKLSAgICAgICAgLy8gbWF4UmVjdFNldC5lcmFzZShpdCk7Ci0gICAgICAgIC8vIG1heFJlY3RTZXQuaW5zZXJ0KG5ld1JlY3QpOwotICAgICAgICBpc0NoYW5nZWQgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGlzQ2hhbmdlZCA9PSB0cnVlKSB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpY292ZXJlZFJlY3RzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGF1dG8gaXQgPSBtYXhSZWN0U2V0LmZpbmQoY292ZXJlZFJlY3RzW2ldKTsKLSAgICAgICAgbWF4UmVjdFNldC5lcmFzZShpdCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBib29sIGdldE1heEhTbGljZShpbnQgeElkeCwgaW50IHlJZHgsIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGJvb2w+ID4gJmlzT2NjdXBpZWQsIHN0ZDo6c2V0PHN0ZDo6cGFpcjxpbnQsIGludD4gPiAmc2xpY2VTZXQsIHN0ZDo6cGFpcjxpbnQsIGludD4gJnJldFB0KSB7Ci0gICAgLy8gc3RkOjpjb3V0IDw8ICJnZXRNYXhIU2xpY2UiIDw8IHN0ZDo6ZW5kbDsKLSAgICBpbnQgeGwsIHhoOwotICAgIHhsID0geGggPSB4SWR4OwotICAgIHdoaWxlICh4bCAtIDEgPj0gMCAmJiBpc09jY3VwaWVkW3hsIC0gMV1beUlkeF0gPT0gdHJ1ZSkgewotICAgICAgeGwtLTsKLSAgICB9Ci0gICAgd2hpbGUgKHhoICsgMSA8IChpbnQpaXNPY2N1cGllZC5zaXplKCkgJiYgaXNPY2N1cGllZFt4aCArIDFdW3lJZHhdID09IHRydWUpIHsKLSAgICAgIHhoKys7Ci0gICAgfQotICAgIHN0ZDo6cGFpcjxpbnQsIGludD4gdG1wUHQgPSBzdGQ6Om1ha2VfcGFpcih4bCwgeUlkeCk7Ci0gICAgcmV0UHQgPSB0bXBQdDsKLSAgICBpZiAoc2xpY2VTZXQuZmluZCh0bXBQdCkgIT0gc2xpY2VTZXQuZW5kKCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgc2xpY2VTZXQuaW5zZXJ0KHRtcFB0KTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotCi0KLQotICBib29sIGdldE1heFZTbGljZShpbnQgeElkeCwgaW50IHlJZHgsIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGJvb2w+ID4gJmlzT2NjdXBpZWQsIHN0ZDo6c2V0PHN0ZDo6cGFpcjxpbnQsIGludD4gPiAmc2xpY2VTZXQsIHN0ZDo6cGFpcjxpbnQsIGludD4gJnJldFB0KSB7Ci0gICAgLy8gc3RkOjpjb3V0IDw8ICJnZXRNYXhWU2xpY2UiIDw8IHN0ZDo6ZW5kbDsKLSAgICBpbnQgeWwsIHloOwotICAgIHlsID0geWggPSB5SWR4OwotICAgIHdoaWxlICh5bCAtIDEgPj0gMCAmJiBpc09jY3VwaWVkW3hJZHhdW3lsIC0gMV0gPT0gdHJ1ZSkgewotICAgICAgeWwtLTsKLSAgICB9Ci0gICAgd2hpbGUgKHloICsgMSA8IChpbnQpaXNPY2N1cGllZFt4SWR4XS5zaXplKCkgJiYgaXNPY2N1cGllZFt4SWR4XVt5aCArIDFdID09IHRydWUpIHsKLSAgICAgIHloKys7Ci0gICAgfQotICAgIHN0ZDo6cGFpcjxpbnQsIGludD4gdG1wUHQgPSBzdGQ6Om1ha2VfcGFpcih4SWR4LCB5bCk7Ci0gICAgcmV0UHQgPSB0bXBQdDsKLSAgICBpZiAoc2xpY2VTZXQuZmluZCh0bXBQdCkgIT0gc2xpY2VTZXQuZW5kKCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgc2xpY2VTZXQuaW5zZXJ0KHRtcFB0KTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotCi0KLSAgdm9pZCBnZXRNYXhIUmVjdChzdGQ6OnBhaXI8aW50LCBpbnQ+IHN0YXJ0UHQsIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGJvb2w+ID4gJmlzT2NjdXBpZWQsIHN0ZDo6c2V0PHN0ZDo6cGFpcjxpbnQsIGludD4gPiAmc2xpY2VTZXQsIHN0ZDo6c2V0PHN0ZDo6dHVwbGU8aW50LCBpbnQsIGludCwgaW50PiA+ICZtYXhSZWN0U2V0KSB7Ci0gICAgLy8gc3RkOjpjb3V0IDw8ICJnZXRNYXhIUmVjdCBzdGFydCBwbnQgPSAoIiA8PCBzdGFydFB0LmZpcnN0IDw8ICIsICIgPDwgc3RhcnRQdC5zZWNvbmQgPDwgIikiIDw8IHN0ZDo6ZW5kbDsKLSAgICBpbnQgeGwsIHhoLCB5bCwgeWg7Ci0gICAgeGwgPSB4aCA9IHN0YXJ0UHQuZmlyc3Q7Ci0gICAgeWwgPSB5aCA9IHN0YXJ0UHQuc2Vjb25kOwotICAgIHdoaWxlICh4aCArIDEgPCAoaW50KWlzT2NjdXBpZWQuc2l6ZSgpICYmIGlzT2NjdXBpZWRbeGggKyAxXVtzdGFydFB0LnNlY29uZF0gPT0gdHJ1ZSkgewotICAgICAgeGgrKzsKLSAgICB9Ci0gICAgCi0KLSAgICAvLyB1cHdhcmQKLSAgICBib29sIGZsYWcgPSB0cnVlOwotICAgIHdoaWxlIChmbGFnKSB7Ci0gICAgICAvLyBzdGQ6OmNvdXQgPDwgIiAgICAgIHVwd2FyZFxuIiA8PCBzdGQ6OmZsdXNoOwotICAgICAgaWYgKHloICsgMSA8IChpbnQpaXNPY2N1cGllZFt4bF0uc2l6ZSgpKSB7Ci0gICAgICAgIGZvciAoaW50IHRlbXBYID0geGw7IHRlbXBYIDw9IHhoOyB0ZW1wWCsrKSB7Ci0gICAgICAgICAgaWYgKGlzT2NjdXBpZWRbdGVtcFhdW3loICsgMV0gPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIGZsYWcgPSBmYWxzZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZmxhZyA9PSB0cnVlKSB7Ci0gICAgICAgICAgeWgrKzsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZmxhZyA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBkb3dud2FyZAotICAgIGZsYWcgPSB0cnVlOwotICAgIHdoaWxlIChmbGFnKSB7Ci0gICAgICAvLyBzdGQ6OmNvdXQgPDwgIiAgICAgIGRvd253YXJkXG4iIDw8IHN0ZDo6Zmx1c2g7Ci0gICAgICBpZiAoeWwgLSAxID49IDApIHsKLSAgICAgICAgLy8geWwtLTsKLSAgICAgICAgZm9yIChpbnQgdGVtcFggPSB4bDsgdGVtcFggPD0geGg7IHRlbXBYKyspIHsKLSAgICAgICAgICBpZiAoaXNPY2N1cGllZFt0ZW1wWF1beWwgLSAxXSA9PSBmYWxzZSkgewotICAgICAgICAgICAgZmxhZyA9IGZhbHNlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChmbGFnID09IHRydWUpIHsKLSAgICAgICAgICB5bC0tOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmbGFnID0gZmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICAvLyBzdGQ6OmNvdXQgPDwgInhsID0gIiA8PCB4bCA8PCAiLCAiIDw8ICJ4aCA9ICIgPDwgeGggPDwgc3RkOjplbmRsOwotICAgIC8vIHN0ZDo6Y291dCA8PCAieWwgPSAiIDw8IHlsIDw8ICIsIHloID0gIiA8PCB5aCA8PCBzdGQ6OmVuZGw7Ci0gICAgc3RkOjp0dXBsZTxpbnQsIGludCwgaW50LCBpbnQ+IHRtcFR1cGxlID0gc3RkOjptYWtlX3R1cGxlKHhsLCB5bCwgeGgsIHloKTsKLSAgICAvLyBwcmludFJlY3QodG1wVHVwbGUpOwotICAgIG1haW50YWluTWF4UmVjdHModG1wVHVwbGUsIG1heFJlY3RTZXQpOwotICAgIC8vIHJldHVybiAobWFpbnRhaW5SZWN0cyh0bXBUdXBsZSwgbWF4UmVjdFNldCkpOwotCi0gIH0KLQotCi0gIHZvaWQgZ2V0TWF4VlJlY3Qoc3RkOjpwYWlyPGludCwgaW50PiBzdGFydFB0LCBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjxib29sPiA+ICZpc09jY3VwaWVkLCBzdGQ6OnNldDxzdGQ6OnBhaXI8aW50LCBpbnQ+ID4gJnNsaWNlU2V0LCBzdGQ6OnNldDxzdGQ6OnR1cGxlPGludCwgaW50LCBpbnQsIGludD4gPiAmbWF4UmVjdFNldCkgewotICAgIC8vIHN0ZDo6Y291dCA8PCAiZ2V0TWF4VlJlY3Qgc3RhcnQgcG50ID0gKCIgPDwgc3RhcnRQdC5maXJzdCA8PCAiLCAiIDw8IHN0YXJ0UHQuc2Vjb25kIDw8ICIpIiA8PCBzdGQ6OmVuZGw7Ci0gICAgaW50IHhsLCB4aCwgeWwsIHloOwotICAgIHhsID0geGggPSBzdGFydFB0LmZpcnN0OwotICAgIHlsID0geWggPSBzdGFydFB0LnNlY29uZDsKLSAgICB3aGlsZSAoeWggKyAxIDwgKGludClpc09jY3VwaWVkW3N0YXJ0UHQuZmlyc3RdLnNpemUoKSAmJiBpc09jY3VwaWVkW3N0YXJ0UHQuZmlyc3RdW3loICsgMV0pIHsKLSAgICAgIHloKys7Ci0gICAgfQotCi0gICAgLy8gdXB3YXJkCi0gICAgYm9vbCBmbGFnID0gdHJ1ZTsKLSAgICB3aGlsZSAoZmxhZykgewotICAgICAgaWYgKHhoICsgMSA8IChpbnQpaXNPY2N1cGllZC5zaXplKCkpIHsKLSAgICAgICAgLy8geGgrKzsKLSAgICAgICAgZm9yIChpbnQgdGVtcFkgPSB5bDsgdGVtcFkgPD0geWg7IHRlbXBZKyspIHsKLSAgICAgICAgICBpZiAoaXNPY2N1cGllZFt4aCArIDFdW3RlbXBZXSA9PSBmYWxzZSkgewotICAgICAgICAgICAgZmxhZyA9IGZhbHNlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChmbGFnID09IHRydWUpIHsKLSAgICAgICAgICB4aCsrOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmbGFnID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIGRvd253YXJkCi0gICAgZmxhZyA9IHRydWU7Ci0gICAgd2hpbGUgKGZsYWcpIHsKLSAgICAgIGlmICh4bCAtIDEgPj0gMCkgewotICAgICAgICAvLyB4bC0tOwotICAgICAgICBmb3IgKGludCB0ZW1wWSA9IHlsOyB0ZW1wWSA8PSB5aDsgdGVtcFkrKykgewotICAgICAgICAgIGlmIChpc09jY3VwaWVkW3hsIC0gMV1bdGVtcFldID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBmbGFnID0gZmFsc2U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZsYWcgPT0gdHJ1ZSkgewotICAgICAgICAgIHhsLS07Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZsYWcgPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8gc3RkOjpjb3V0IDw8ICJ4bCA9ICIgPDwgeGwgPDwgIiwgIiA8PCAieGggPSAiIDw8IHhoIDw8IHN0ZDo6ZW5kbDsKLSAgICAvLyBzdGQ6OmNvdXQgPDwgInlsID0gIiA8PCB5bCA8PCAiLCAiIDw8ICJ5aCA9ICIgPDwgeWggPDwgc3RkOjplbmRsOwotICAgIHN0ZDo6dHVwbGU8aW50LCBpbnQsIGludCwgaW50PiB0bXBUdXBsZSA9IHN0ZDo6bWFrZV90dXBsZSh4bCwgeWwsIHhoLCB5aCk7Ci0gICAgbWFpbnRhaW5NYXhSZWN0cyh0bXBUdXBsZSwgbWF4UmVjdFNldCk7Ci0gICAgLy8gcmV0dXJuIChwcm9jZXNzTmV3UmVjdCh0bXBUdXBsZSwgbWF4UmVjdFNldCkpOwotCi0gIH0KLQotICB2b2lkIGdldFBvbHlXaXRoSG9sZShjb25zdCBzdGQ6OnZlY3RvcjxQb2ludD4gJnZlcnRpY2VzLCBQb2x5Z29uICZvdXRsaW5lLCBzdGQ6OnZlY3RvcjxQb2x5Z29uPiAmaG9sZXMpIHsKLSAgICB0eXBlZGVmIGJvb3N0OjppY2w6OmludGVydmFsX21hcDxpbnQsIGludD4gSW50dk1hcDsKLSAgICBzdGQ6OnZlY3RvcjxQb2x5Z29uPiBwb2x5czsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8UG9pbnQsIFBvaW50PiA+IGVkZ2VzOwotICAgIHN0ZDo6dmVjdG9yPGJvb2w+IHZhbGlkRWRnZXM7Ci0gICAgc3RkOjptYXA8aW50LCBJbnR2TWFwPiBob3J6SW50djJFZGdlLCB2ZXJ0SW50djJFZGdlOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCl2ZXJ0aWNlcy5zaXplKCk7ICsraSkgewotICAgICAgUG9pbnQgY3VyclB0ID0gdmVydGljZXNbaV07Ci0gICAgICBQb2ludCBuZXh0UHQgPSB2ZXJ0aWNlc1soaSArIDEpICUgdmVydGljZXMuc2l6ZSgpXTsKLSAgICAgIGVkZ2VzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihjdXJyUHQsIG5leHRQdCkpOwotICAgICAgdmFsaWRFZGdlcy5wdXNoX2JhY2sodHJ1ZSk7Ci0KLSAgICAgIGludCBlZGdlSWR4ID0gLTE7Ci0gICAgICBib29sIGlzSG9yaXpvbnRhbCA9IHRydWU7Ci0gICAgICBhdXRvIGl0UmVzSG9yeiA9IGhvcnpJbnR2MkVkZ2VbbmV4dFB0LnkoKV0uZXF1YWxfcmFuZ2UoYm9vc3Q6OmljbDo6aW50ZXJ2YWw8aW50Pjo6Y2xvc2VkKG5leHRQdC54KCksIG5leHRQdC54KCkpKTsKLSAgICAgIGludCBob3J6Q250ID0gMDsKLSAgICAgIGZvciAoYXV0byBpdCA9IGl0UmVzSG9yei5maXJzdDsgaXQgIT0gaXRSZXNIb3J6LnNlY29uZDsgKytpdCkgewotICAgICAgICBpZiAoaG9yekNudCA+IDApIHsKLSAgICAgICAgICBzdGQ6OmNvdXQgPDwgIkVycm9yOiBtb3JlIHRoYW4gb25lIGludGVydmFsIGZvdW5kXG4iOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoaXQtPnNlY29uZCAtIDEpID4gZWRnZUlkeCAmJiB2YWxpZEVkZ2VzWyhpdC0+c2Vjb25kICAtIDEpXSA9PSB0cnVlKSB7Ci0gICAgICAgICAgZWRnZUlkeCA9IGl0LT5zZWNvbmQgLSAxOwotICAgICAgICAgIGlzSG9yaXpvbnRhbCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaG9yekNudCsrOwotICAgICAgfQotICAgICAgLy8gdmVydAotICAgICAgYXV0byBpdFJlc1ZlcnQgPSB2ZXJ0SW50djJFZGdlW25leHRQdC54KCldLmVxdWFsX3JhbmdlKGJvb3N0OjppY2w6OmludGVydmFsPGludD46OmNsb3NlZChuZXh0UHQueSgpLCBuZXh0UHQueSgpKSk7Ci0gICAgICBpbnQgdmVydENudCA9IDA7Ci0gICAgICBmb3IgKGF1dG8gaXQgPSBpdFJlc1ZlcnQuZmlyc3Q7IGl0ICE9IGl0UmVzVmVydC5zZWNvbmQ7ICsraXQpIHsKLSAgICAgICAgaWYgKHZlcnRDbnQgPiAwKSB7Ci0gICAgICAgICAgc3RkOjpjb3V0IDw8ICJFcnJvcjogbW9yZSB0aGFuIG9uZSBpbnRlcnZhbCBmb3VuZFxuIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGl0LT5zZWNvbmQgIC0gMSkgPiBlZGdlSWR4ICYmIHZhbGlkRWRnZXNbKGl0LT5zZWNvbmQgIC0gMSldID09IHRydWUpIHsKLSAgICAgICAgICBlZGdlSWR4ID0gaXQtPnNlY29uZCAtIDE7Ci0gICAgICAgICAgaXNIb3Jpem9udGFsID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgdmVydENudCsrOwotICAgICAgfQotICAgICAgLy8gZ2V0IHBvbHkKLSAgICAgIGlmIChlZGdlSWR4ID09IC0xKSB7Ci0gICAgICAgIDsKLSAgICAgIH0gZWxzZSBpZiAoKGkgLSBlZGdlSWR4KSA+IDIpIHsKLSAgICAgICAgc3RkOjp2ZWN0b3I8UG9pbnQ+IHZlcnRpY2VzOwotICAgICAgICBpbnQgZWRnZUNudCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGN1cnJFZGdlSWR4ID0gZWRnZUlkeDsgY3VyckVkZ2VJZHggPD0gaTsgKytjdXJyRWRnZUlkeCkgewotICAgICAgICAgIGlmICh2YWxpZEVkZ2VzW2N1cnJFZGdlSWR4XSA9PSBmYWxzZSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVkZ2VDbnQrKzsKLSAgICAgICAgICB2ZXJ0aWNlcy5wdXNoX2JhY2soZWRnZXNbY3VyckVkZ2VJZHhdLnNlY29uZCk7Ci0gICAgICAgICAgaWYgKGN1cnJFZGdlSWR4ID09IGVkZ2VJZHgpIHsKLSAgICAgICAgICAgIGlmIChuZXh0UHQgPT0gZWRnZXNbY3VyckVkZ2VJZHhdLmZpcnN0KSB7Ci0gICAgICAgICAgICAgIC8vIGNvdXQgPDwgIiAgaW52YWxpZGF0ZSAiIDw8IGN1cnJFZGdlSWR4IDw8IGVuZGw7Ci0gICAgICAgICAgICAgIHZhbGlkRWRnZXNbY3VyckVkZ2VJZHhdID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBQb2ludCB0bXBFbmRQb2ludCA9IGVkZ2VzW2N1cnJFZGdlSWR4XS5zZWNvbmQ7Ci0gICAgICAgICAgICAgIGVkZ2VzW2N1cnJFZGdlSWR4XS5zZWNvbmQgPSBuZXh0UHQ7Ci0gICAgICAgICAgICAgIGlmIChpc0hvcml6b250YWwpIHsKLSAgICAgICAgICAgICAgICBob3J6SW50djJFZGdlW25leHRQdC55KCldIC09IHN0ZDo6bWFrZV9wYWlyKGJvb3N0OjppY2w6OmludGVydmFsPGludD46OnJpZ2h0X29wZW4oc3RkOjptaW4odG1wRW5kUG9pbnQueCgpLCBuZXh0UHQueCgpKSwgc3RkOjptYXgodG1wRW5kUG9pbnQueCgpLCBuZXh0UHQueCgpKSksIGVkZ2VJZHgpOwotICAgICAgICAgICAgICAgIC8vIGNvdXQgPDwgIiAgZXJhc2UgeSA9ICIgPDwgbmV4dFB0LnkoKSA8PCAiLCB4ID0gWyIgPDwgbWluKHRtcEVuZFBvaW50LngoKSwgbmV4dFB0LngoKSkgPDwgIiwgIiA8PCBtYXgodG1wRW5kUG9pbnQueCgpLCBuZXh0UHQueCgpKSA8PCAiXSBlZGdlSWR4ID0gIiA8PCBlZGdlSWR4IDw8ICJcbiI7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdmVydEludHYyRWRnZVtuZXh0UHQueCgpXSAtPSBzdGQ6Om1ha2VfcGFpcihib29zdDo6aWNsOjppbnRlcnZhbDxpbnQ+OjpyaWdodF9vcGVuKHN0ZDo6bWluKHRtcEVuZFBvaW50LnkoKSwgbmV4dFB0LnkoKSksIHN0ZDo6bWF4KHRtcEVuZFBvaW50LnkoKSwgbmV4dFB0LnkoKSkpLCBlZGdlSWR4KTsKLSAgICAgICAgICAgICAgICAvLyBjb3V0IDw8ICIgIGVyYXNlIHggPSAiIDw8IG5leHRQdC54KCkgPDwgIiwgeCA9IFsiIDw8IG1pbih0bXBFbmRQb2ludC55KCksIG5leHRQdC55KCkpIDw8ICIsICIgPDwgbWF4KHRtcEVuZFBvaW50LnkoKSwgbmV4dFB0LnkoKSkgPDwgIl0gZWRnZUlkeCA9ICIgPDwgZWRnZUlkeCA8PCAiXG4iOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGNvdXQgPDwgIiAgaW52YWxpZGF0ZSAiIDw8IGN1cnJFZGdlSWR4IDw8IGVuZGw7Ci0gICAgICAgICAgICB2YWxpZEVkZ2VzW2N1cnJFZGdlSWR4XSA9IGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZWRnZUNudCA+IDIpIHsKLSAgICAgICAgICAvLyBjb3V0IDw8ICJwb2x5IHN0YXJ0SWR4ID0gIiA8PCBlZGdlSWR4IDw8ICIsIGVuZElkeCA9ICIgPDwgaSA8PCBlbmRsOwotICAgICAgICAgIFBvbHlnb24gdG1wUG9seTsKLSAgICAgICAgICBQb2ludCBwdDEsIHB0MiwgcHQzOwotICAgICAgICAgIHB0MSA9IHZlcnRpY2VzLmJhY2soKTsKLSAgICAgICAgICBwdDIgPSB2ZXJ0aWNlcy5mcm9udCgpOwotICAgICAgICAgIHB0MyA9IHZlcnRpY2VzW3ZlcnRpY2VzLnNpemUoKSAtIDJdOwotICAgICAgICAgIC8vIGNvdXQgPDwgInh4eDJcbiI7Ci0KLSAgICAgICAgICBpZiAoKHB0MS54KCkgPT0gcHQyLngoKSAmJiBwdDIueCgpID09IHB0My54KCkpIHx8Ci0gICAgICAgICAgICAgIChwdDEueSgpID09IHB0Mi55KCkgJiYgcHQyLnkoKSA9PSBwdDMueSgpKSkgewotICAgICAgICAgICAgdmVydGljZXMucG9wX2JhY2soKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgc2V0X3BvaW50cyh0bXBQb2x5LCB2ZXJ0aWNlcy5iZWdpbigpLCB2ZXJ0aWNlcy5lbmQoKSk7Ci0gICAgICAgICAgcG9seXMucHVzaF9iYWNrKHRtcFBvbHkpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBjb3V0IDw8ICJlcmFzZSBzdGFydElkeCA9ICIgPDwgZWRnZUlkeCA8PCAiLCBlbmRJZHggPSAiIDw8IGkgPDwgZW5kbDsKLSAgICAgICAgZm9yIChpbnQgY3VyckVkZ2VJZHggPSBlZGdlSWR4OyBjdXJyRWRnZUlkeCA8PSBpOyArK2N1cnJFZGdlSWR4KSB7Ci0gICAgICAgICAgaWYgKHZhbGlkRWRnZXNbY3VyckVkZ2VJZHhdID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGN1cnJFZGdlSWR4ID09IGVkZ2VJZHgpIHsKLSAgICAgICAgICAgIGlmIChuZXh0UHQgPT0gZWRnZXNbY3VyckVkZ2VJZHhdLmZpcnN0KSB7Ci0gICAgICAgICAgICAgIHZhbGlkRWRnZXNbY3VyckVkZ2VJZHhdID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBlZGdlc1tjdXJyRWRnZUlkeF0uc2Vjb25kID0gbmV4dFB0OwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2YWxpZEVkZ2VzW2N1cnJFZGdlSWR4XSA9IGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBpbnNlcnQgdG8gaW50ZXJ2YWwgbWFwCi0gICAgICBpZiAoZWRnZUlkeCA9PSAtMSkgewotICAgICAgICBpZiAoY3VyclB0LngoKSA9PSBuZXh0UHQueCgpKSB7Ci0gICAgICAgICAgYXV0byBlZGdlSW50diA9IGJvb3N0OjppY2w6OmludGVydmFsPGludD46OmNsb3NlZChzdGQ6Om1pbihjdXJyUHQueSgpLCBuZXh0UHQueSgpKSwgc3RkOjptYXgoY3VyclB0LnkoKSwgbmV4dFB0LnkoKSkpOwotICAgICAgICAgIHZlcnRJbnR2MkVkZ2VbbmV4dFB0LngoKV0gKz0gc3RkOjptYWtlX3BhaXIoZWRnZUludHYsIGkgKyAxKTsKLSAgICAgICAgICAvLyBjb3V0IDw8ICJhZGQgeCA9ICIgPDwgY3VyclB0LngoKSA8PCAiLCB5ID0gWyIgPDwgZWRnZUludHYubG93ZXIoKSA8PCAiLCAiIDw8IGVkZ2VJbnR2LnVwcGVyKCkgPDwgIl1cbiI7Ci0gICAgICAgIH0gCi0gICAgICAgIGlmIChjdXJyUHQueSgpID09IG5leHRQdC55KCkpIHsKLSAgICAgICAgICBhdXRvIGVkZ2VJbnR2ID0gYm9vc3Q6OmljbDo6aW50ZXJ2YWw8aW50Pjo6Y2xvc2VkKHN0ZDo6bWluKGN1cnJQdC54KCksIG5leHRQdC54KCkpLCBzdGQ6Om1heChjdXJyUHQueCgpLCBuZXh0UHQueCgpKSk7Ci0gICAgICAgICAgaG9yekludHYyRWRnZVtuZXh0UHQueSgpXSArPSBzdGQ6Om1ha2VfcGFpcihlZGdlSW50diwgaSArIDEpOwotICAgICAgICAgIC8vIGNvdXQgPDwgImFkZCB5ID0gIiA8PCBjdXJyUHQueSgpIDw8ICIsIHggPSBbIiA8PCBlZGdlSW50di5sb3dlcigpIDw8ICIsICIgPDwgZWRnZUludHYudXBwZXIoKSA8PCAiXVxuIjsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgfQotICAgIAotICAgIHN0ZDo6dmVjdG9yPFBvaW50PiB0bXBQdHM7Ci0gICAgZm9yIChpbnQgY3VyckVkZ2VJZHggPSAwOyBjdXJyRWRnZUlkeCA8IGludChlZGdlcy5zaXplKCkpOyArK2N1cnJFZGdlSWR4KSB7Ci0gICAgICBpZiAodmFsaWRFZGdlc1tjdXJyRWRnZUlkeF0gPT0gZmFsc2UpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICB0bXBQdHMucHVzaF9iYWNrKGVkZ2VzW2N1cnJFZGdlSWR4XS5zZWNvbmQpOwotICAgICAgLy8gc3RkOjpjb3V0IDw8ICJwdXNoaW5nICgiIDw8IHRtcFB0cy5iYWNrKCkueCgpIDw8ICIsICIgPDwgdG1wUHRzLmJhY2soKS55KCkgPDwgIlxuIjsKLSAgICB9Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpcG9seXMuc2l6ZSgpIC0gMTsgKytpKSB7Ci0gICAgICBob2xlcy5wdXNoX2JhY2socG9seXNbaV0pOwotICAgIH0KLSAgICBpZiAocG9seXMuc2l6ZSgpID4gMCkgewotICAgICAgb3V0bGluZSA9IHBvbHlzLmJhY2soKTsKLSAgICB9Ci0KLQotICB9Ci0KLSAgYm9vbCBpc0NvbGluZWFyKGNvbnN0IFBvaW50ICZwdDEsIGNvbnN0IFBvaW50ICZwdDIsIGNvbnN0IFBvaW50ICZwdDMpIHsKLSAgICByZXR1cm4gKChwdDEueCgpID09IHB0Mi54KCkgJiYgcHQyLngoKSA9PSBwdDMueCgpKSB8fAotICAgICAgICAgICAgKHB0MS55KCkgPT0gcHQyLnkoKSAmJiBwdDIueSgpID09IHB0My55KCkpKTsKLSAgfQotCi0gIHZvaWQgZ2V0UG9seVdpdGhIb2xlKGNvbnN0IFBvbHlnb24gJnBvbHlJbiwgc3RkOjp2ZWN0b3I8UG9seWdvbj4gJnBvbHlzKSB7Ci0gICAgdHlwZWRlZiBib29zdDo6aWNsOjppbnRlcnZhbF9tYXA8aW50LCBpbnQ+IEludHZNYXA7Ci0gICAgc3RkOjp2ZWN0b3I8UG9pbnQ+IHZlcnRpY2VzOwotICAgIGZvciAoYXV0byBwdEl0ID0gYmVnaW5fcG9pbnRzKHBvbHlJbik7IHB0SXQgIT0gZW5kX3BvaW50cyhwb2x5SW4pOyArK3B0SXQpIHsKLSAgICAgIHZlcnRpY2VzLnB1c2hfYmFjaygqcHRJdCk7Ci0gICAgfQotCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPFBvaW50LCBQb2ludD4gPiBlZGdlczsKLSAgICBzdGQ6OnZlY3Rvcjxib29sPiB2YWxpZEVkZ2VzOwotICAgIHN0ZDo6bWFwPGludCwgSW50dk1hcD4gaG9yekludHYyRWRnZSwgdmVydEludHYyRWRnZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpdmVydGljZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgIFBvaW50IGN1cnJQdCA9IHZlcnRpY2VzW2ldOwotICAgICAgUG9pbnQgbmV4dFB0ID0gdmVydGljZXNbKGkgKyAxKSAlIHZlcnRpY2VzLnNpemUoKV07Ci0gICAgICBlZGdlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoY3VyclB0LCBuZXh0UHQpKTsKLSAgICAgIHZhbGlkRWRnZXMucHVzaF9iYWNrKHRydWUpOwotCi0gICAgICBpbnQgZWRnZUlkeCA9IC0xOwotICAgICAgYm9vbCBpc0hvcml6b250YWwgPSB0cnVlOwotICAgICAgYXV0byBpdFJlc0hvcnogPSBob3J6SW50djJFZGdlW25leHRQdC55KCldLmVxdWFsX3JhbmdlKGJvb3N0OjppY2w6OmludGVydmFsPGludD46OmNsb3NlZChuZXh0UHQueCgpLCBuZXh0UHQueCgpKSk7Ci0gICAgICBpbnQgaG9yekNudCA9IDA7Ci0gICAgICBmb3IgKGF1dG8gaXQgPSBpdFJlc0hvcnouZmlyc3Q7IGl0ICE9IGl0UmVzSG9yei5zZWNvbmQ7ICsraXQpIHsKLSAgICAgICAgaWYgKGhvcnpDbnQgPiAwKSB7Ci0gICAgICAgICAgc3RkOjpjb3V0IDw8ICJFcnJvcjogbW9yZSB0aGFuIG9uZSBpbnRlcnZhbCBmb3VuZFxuIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGl0LT5zZWNvbmQgLSAxKSA+IGVkZ2VJZHggJiYgdmFsaWRFZGdlc1soaXQtPnNlY29uZCAgLSAxKV0gPT0gdHJ1ZSkgewotICAgICAgICAgIGVkZ2VJZHggPSBpdC0+c2Vjb25kIC0gMTsKLSAgICAgICAgICBpc0hvcml6b250YWwgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGhvcnpDbnQrKzsKLSAgICAgIH0KLSAgICAgIC8vIHZlcnQKLSAgICAgIGF1dG8gaXRSZXNWZXJ0ID0gdmVydEludHYyRWRnZVtuZXh0UHQueCgpXS5lcXVhbF9yYW5nZShib29zdDo6aWNsOjppbnRlcnZhbDxpbnQ+OjpjbG9zZWQobmV4dFB0LnkoKSwgbmV4dFB0LnkoKSkpOwotICAgICAgaW50IHZlcnRDbnQgPSAwOwotICAgICAgZm9yIChhdXRvIGl0ID0gaXRSZXNWZXJ0LmZpcnN0OyBpdCAhPSBpdFJlc1ZlcnQuc2Vjb25kOyArK2l0KSB7Ci0gICAgICAgIGlmICh2ZXJ0Q250ID4gMCkgewotICAgICAgICAgIHN0ZDo6Y291dCA8PCAiRXJyb3I6IG1vcmUgdGhhbiBvbmUgaW50ZXJ2YWwgZm91bmRcbiI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChpdC0+c2Vjb25kICAtIDEpID4gZWRnZUlkeCAmJiB2YWxpZEVkZ2VzWyhpdC0+c2Vjb25kICAtIDEpXSA9PSB0cnVlKSB7Ci0gICAgICAgICAgZWRnZUlkeCA9IGl0LT5zZWNvbmQgLSAxOwotICAgICAgICAgIGlzSG9yaXpvbnRhbCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHZlcnRDbnQrKzsKLSAgICAgIH0KLSAgICAgIC8vIGdldCBwb2x5Ci0gICAgICBpZiAoZWRnZUlkeCA9PSAtMSkgewotICAgICAgICA7Ci0gICAgICB9IGVsc2UgaWYgKChpIC0gZWRnZUlkeCkgPiAyKSB7Ci0gICAgICAgIC8vIHN0ZDo6Y291dCA8PCAicHVzaCBuZXcgcG9seVxuIjsKLSAgICAgICAgc3RkOjp2ZWN0b3I8UG9pbnQ+IHZlcnRpY2VzOwotICAgICAgICBpbnQgZWRnZUNudCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGN1cnJFZGdlSWR4ID0gZWRnZUlkeDsgY3VyckVkZ2VJZHggPD0gaTsgKytjdXJyRWRnZUlkeCkgewotICAgICAgICAgIGlmICh2YWxpZEVkZ2VzW2N1cnJFZGdlSWR4XSA9PSBmYWxzZSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICh2ZXJ0aWNlcy5zaXplKCkgPCAyKSB7Ci0gICAgICAgICAgICBlZGdlQ250Kys7Ci0gICAgICAgICAgICB2ZXJ0aWNlcy5wdXNoX2JhY2soZWRnZXNbY3VyckVkZ2VJZHhdLnNlY29uZCk7Ci0gICAgICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgInB1c2hpbmcgKCIgPDwgdmVydGljZXMuYmFjaygpLngoKSAvIDIwMDAuMCA8PCAiLCAiIDw8IHZlcnRpY2VzLmJhY2soKS55KCkgLyAyMDAwLjAgPDwgIilcbiI7Ci0gICAgICAgICAgfSBlbHNlIGlmICghaXNDb2xpbmVhcih2ZXJ0aWNlcy5iYWNrKCksIHZlcnRpY2VzW3ZlcnRpY2VzLnNpemUoKSAtIDJdLCBlZGdlc1tjdXJyRWRnZUlkeF0uc2Vjb25kKSkgewotICAgICAgICAgICAgZWRnZUNudCsrOwotICAgICAgICAgICAgdmVydGljZXMucHVzaF9iYWNrKGVkZ2VzW2N1cnJFZGdlSWR4XS5zZWNvbmQpOwotICAgICAgICAgICAgLy8gc3RkOjpjb3V0IDw8ICJwdXNoaW5nICgiIDw8IHZlcnRpY2VzLmJhY2soKS54KCkgLyAyMDAwLjAgPDwgIiwgIiA8PCB2ZXJ0aWNlcy5iYWNrKCkueSgpIC8gMjAwMC4wIDw8ICIpXG4iOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgInBvcCAoIiA8PCB2ZXJ0aWNlcy5iYWNrKCkueCgpIC8gMjAwMC4wIDw8ICIsICIgPDwgdmVydGljZXMuYmFjaygpLnkoKSAvIDIwMDAuMCA8PCAiKVxuIjsKLSAgICAgICAgICAgIHZlcnRpY2VzLnBvcF9iYWNrKCk7Ci0gICAgICAgICAgICB2ZXJ0aWNlcy5wdXNoX2JhY2soZWRnZXNbY3VyckVkZ2VJZHhdLnNlY29uZCk7Ci0gICAgICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgInB1c2ggKCIgPDwgdmVydGljZXMuYmFjaygpLngoKSAvIDIwMDAuMCA8PCAiLCAiIDw8IHZlcnRpY2VzLmJhY2soKS55KCkgLyAyMDAwLjAgPDwgIilcbiI7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChjdXJyRWRnZUlkeCA9PSBlZGdlSWR4KSB7Ci0gICAgICAgICAgICBpZiAobmV4dFB0ID09IGVkZ2VzW2N1cnJFZGdlSWR4XS5maXJzdCkgewotICAgICAgICAgICAgICAvLyBjb3V0IDw8ICIgIGludmFsaWRhdGUgIiA8PCBjdXJyRWRnZUlkeCA8PCBlbmRsOwotICAgICAgICAgICAgICB2YWxpZEVkZ2VzW2N1cnJFZGdlSWR4XSA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgUG9pbnQgdG1wRW5kUG9pbnQgPSBlZGdlc1tjdXJyRWRnZUlkeF0uc2Vjb25kOwotICAgICAgICAgICAgICBlZGdlc1tjdXJyRWRnZUlkeF0uc2Vjb25kID0gbmV4dFB0OwotICAgICAgICAgICAgICBpZiAoaXNIb3Jpem9udGFsKSB7Ci0gICAgICAgICAgICAgICAgaG9yekludHYyRWRnZVtuZXh0UHQueSgpXSAtPSBzdGQ6Om1ha2VfcGFpcihib29zdDo6aWNsOjppbnRlcnZhbDxpbnQ+OjpyaWdodF9vcGVuKHN0ZDo6bWluKHRtcEVuZFBvaW50LngoKSwgbmV4dFB0LngoKSksIHN0ZDo6bWF4KHRtcEVuZFBvaW50LngoKSwgbmV4dFB0LngoKSkpLCBlZGdlSWR4KTsKLSAgICAgICAgICAgICAgICAvLyBjb3V0IDw8ICIgIGVyYXNlIHkgPSAiIDw8IG5leHRQdC55KCkgPDwgIiwgeCA9IFsiIDw8IG1pbih0bXBFbmRQb2ludC54KCksIG5leHRQdC54KCkpIDw8ICIsICIgPDwgbWF4KHRtcEVuZFBvaW50LngoKSwgbmV4dFB0LngoKSkgPDwgIl0gZWRnZUlkeCA9ICIgPDwgZWRnZUlkeCA8PCAiXG4iOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHZlcnRJbnR2MkVkZ2VbbmV4dFB0LngoKV0gLT0gc3RkOjptYWtlX3BhaXIoYm9vc3Q6OmljbDo6aW50ZXJ2YWw8aW50Pjo6cmlnaHRfb3BlbihzdGQ6Om1pbih0bXBFbmRQb2ludC55KCksIG5leHRQdC55KCkpLCBzdGQ6Om1heCh0bXBFbmRQb2ludC55KCksIG5leHRQdC55KCkpKSwgZWRnZUlkeCk7Ci0gICAgICAgICAgICAgICAgLy8gY291dCA8PCAiICBlcmFzZSB4ID0gIiA8PCBuZXh0UHQueCgpIDw8ICIsIHggPSBbIiA8PCBtaW4odG1wRW5kUG9pbnQueSgpLCBuZXh0UHQueSgpKSA8PCAiLCAiIDw8IG1heCh0bXBFbmRQb2ludC55KCksIG5leHRQdC55KCkpIDw8ICJdIGVkZ2VJZHggPSAiIDw8IGVkZ2VJZHggPDwgIlxuIjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBjb3V0IDw8ICIgIGludmFsaWRhdGUgIiA8PCBjdXJyRWRnZUlkeCA8PCBlbmRsOwotICAgICAgICAgICAgdmFsaWRFZGdlc1tjdXJyRWRnZUlkeF0gPSBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVkZ2VDbnQgPiAyKSB7Ci0gICAgICAgICAgLy8gY291dCA8PCAicG9seSBzdGFydElkeCA9ICIgPDwgZWRnZUlkeCA8PCAiLCBlbmRJZHggPSAiIDw8IGkgPDwgZW5kbDsKLSAgICAgICAgICBQb2x5Z29uIHRtcFBvbHk7Ci0gICAgICAgICAgUG9pbnQgcHQxLCBwdDIsIHB0MzsKLSAgICAgICAgICBwdDEgPSB2ZXJ0aWNlcy5iYWNrKCk7Ci0gICAgICAgICAgcHQyID0gdmVydGljZXMuZnJvbnQoKTsKLSAgICAgICAgICBwdDMgPSB2ZXJ0aWNlc1t2ZXJ0aWNlcy5zaXplKCkgLSAyXTsKLSAgICAgICAgICAvLyBjb3V0IDw8ICJ4eHgyXG4iOwotCi0gICAgICAgICAgaWYgKChwdDEueCgpID09IHB0Mi54KCkgJiYgcHQyLngoKSA9PSBwdDMueCgpKSB8fAotICAgICAgICAgICAgICAocHQxLnkoKSA9PSBwdDIueSgpICYmIHB0Mi55KCkgPT0gcHQzLnkoKSkpIHsKLSAgICAgICAgICAgIHZlcnRpY2VzLnBvcF9iYWNrKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHNldF9wb2ludHModG1wUG9seSwgdmVydGljZXMuYmVnaW4oKSwgdmVydGljZXMuZW5kKCkpOwotICAgICAgICAgIHBvbHlzLnB1c2hfYmFjayh0bXBQb2x5KTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gY291dCA8PCAiZXJhc2Ugc3RhcnRJZHggPSAiIDw8IGVkZ2VJZHggPDwgIiwgZW5kSWR4ID0gIiA8PCBpIDw8IGVuZGw7Ci0gICAgICAgIGZvciAoaW50IGN1cnJFZGdlSWR4ID0gZWRnZUlkeDsgY3VyckVkZ2VJZHggPD0gaTsgKytjdXJyRWRnZUlkeCkgewotICAgICAgICAgIGlmICh2YWxpZEVkZ2VzW2N1cnJFZGdlSWR4XSA9PSBmYWxzZSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChjdXJyRWRnZUlkeCA9PSBlZGdlSWR4KSB7Ci0gICAgICAgICAgICBpZiAobmV4dFB0ID09IGVkZ2VzW2N1cnJFZGdlSWR4XS5maXJzdCkgewotICAgICAgICAgICAgICB2YWxpZEVkZ2VzW2N1cnJFZGdlSWR4XSA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgZWRnZXNbY3VyckVkZ2VJZHhdLnNlY29uZCA9IG5leHRQdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdmFsaWRFZGdlc1tjdXJyRWRnZUlkeF0gPSBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gaW5zZXJ0IHRvIGludGVydmFsIG1hcAotICAgICAgaWYgKGVkZ2VJZHggPT0gLTEpIHsKLSAgICAgICAgaWYgKGN1cnJQdC54KCkgPT0gbmV4dFB0LngoKSkgewotICAgICAgICAgIGF1dG8gZWRnZUludHYgPSBib29zdDo6aWNsOjppbnRlcnZhbDxpbnQ+OjpjbG9zZWQoc3RkOjptaW4oY3VyclB0LnkoKSwgbmV4dFB0LnkoKSksIHN0ZDo6bWF4KGN1cnJQdC55KCksIG5leHRQdC55KCkpKTsKLSAgICAgICAgICB2ZXJ0SW50djJFZGdlW25leHRQdC54KCldICs9IHN0ZDo6bWFrZV9wYWlyKGVkZ2VJbnR2LCBpICsgMSk7Ci0gICAgICAgICAgLy8gY291dCA8PCAiYWRkIHggPSAiIDw8IGN1cnJQdC54KCkgPDwgIiwgeSA9IFsiIDw8IGVkZ2VJbnR2Lmxvd2VyKCkgPDwgIiwgIiA8PCBlZGdlSW50di51cHBlcigpIDw8ICJdXG4iOwotICAgICAgICB9IAotICAgICAgICBpZiAoY3VyclB0LnkoKSA9PSBuZXh0UHQueSgpKSB7Ci0gICAgICAgICAgYXV0byBlZGdlSW50diA9IGJvb3N0OjppY2w6OmludGVydmFsPGludD46OmNsb3NlZChzdGQ6Om1pbihjdXJyUHQueCgpLCBuZXh0UHQueCgpKSwgc3RkOjptYXgoY3VyclB0LngoKSwgbmV4dFB0LngoKSkpOwotICAgICAgICAgIGhvcnpJbnR2MkVkZ2VbbmV4dFB0LnkoKV0gKz0gc3RkOjptYWtlX3BhaXIoZWRnZUludHYsIGkgKyAxKTsKLSAgICAgICAgICAvLyBjb3V0IDw8ICJhZGQgeSA9ICIgPDwgY3VyclB0LnkoKSA8PCAiLCB4ID0gWyIgPDwgZWRnZUludHYubG93ZXIoKSA8PCAiLCAiIDw8IGVkZ2VJbnR2LnVwcGVyKCkgPDwgIl1cbiI7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgIH0KLSAgICAKLSAgICAvLyBzdGQ6OnZlY3RvcjxQb2ludD4gdG1wUHRzOwotICAgIC8vIGZvciAoaW50IGN1cnJFZGdlSWR4ID0gMDsgY3VyckVkZ2VJZHggPCBlZGdlcy5zaXplKCk7ICsrY3VyckVkZ2VJZHgpIHsKLSAgICAvLyAgIGlmICh2YWxpZEVkZ2VzW2N1cnJFZGdlSWR4XSA9PSBmYWxzZSkgewotICAgIC8vICAgICBjb250aW51ZTsKLSAgICAvLyAgIH0KLSAgICAvLyAgIHRtcFB0cy5wdXNoX2JhY2soZWRnZXNbY3VyckVkZ2VJZHhdLnNlY29uZCk7Ci0gICAgLy8gICAvLyBzdGQ6OmNvdXQgPDwgInB1c2hpbmcgKCIgPDwgdG1wUHRzLmJhY2soKS54KCkgPDwgIiwgIiA8PCB0bXBQdHMuYmFjaygpLnkoKSA8PCAiXG4iOwotICAgIC8vIH0KLQotICAgIC8vIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClwb2x5cy5zaXplKCkgLSAxOyArK2kpIHsKLSAgICAvLyAgIGhvbGVzLnB1c2hfYmFjayhwb2x5c1tpXSk7Ci0gICAgLy8gfQotICAgIC8vIGlmIChwb2x5cy5zaXplKCkgPiAwKSB7Ci0gICAgLy8gICBvdXRsaW5lID0gcG9seXMuYmFjaygpOwotICAgIC8vIH0KLQotCi0gIH0KLQotfQotCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2lvL2ZyU2hhcGVVdGlsLmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9pby9mclNoYXBlVXRpbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzlmZTg4Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2lvL2ZyU2hhcGVVdGlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiZnJCYXNlVHlwZXMuaCIKLSNpbmNsdWRlICJkYi9vYmovZnJTaGFwZS5oIgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlICJkYi9vYmovZnJCbG9ja2FnZS5oIgotI2luY2x1ZGUgPGJvb3N0L2dlb21ldHJ5LmhwcD4KLSNpbmNsdWRlIDxib29zdC9nZW9tZXRyeS9nZW9tZXRyaWVzL3BvaW50X3h5LmhwcD4KLSNpbmNsdWRlIDxib29zdC9nZW9tZXRyeS9nZW9tZXRyaWVzL3BvbHlnb24uaHBwPgotI2luY2x1ZGUgPGJvb3N0L2dlb21ldHJ5L2dlb21ldHJpZXMvYWRhcHRlZC9ib29zdF90dXBsZS5ocHA+IAotI2luY2x1ZGUgPGJvb3N0L2ZvcmVhY2guaHBwPgotI2luY2x1ZGUgPHR1cGxlPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi1uYW1lc3BhY2UgZnIgewotICB2b2lkIGZyUmVjdDJQb2x5KGZyUmVjdCAmcmVjdEluLCBib29zdFBvbHlnb24gJnBvbHlPdXQpOwotICB2b2lkIGZyUG9seWdvbjJQb2x5KGZyUG9seWdvbiAmcG9seWdvbkluLCBib29zdFBvbHlnb24gJnBvbHlPdXQpOwotICB2b2lkIGZyQm94MlBvbHkoZnJCb3ggJmJveEluLCBib29zdFBvbHlnb24gJnBvbHlPdXQpOwotICB2b2lkIGZyQm94MlJlY3RhbmdsZShmckJveCAmYm94SW4sIFJlY3RhbmdsZSAmcmVjdE91dCk7Ci0gIHZvaWQgZnJSZWN0MlJlY3RhbmdsZShmclJlY3QgJnJlY3RJbiwgUmVjdGFuZ2xlICZyZWN0T3V0KTsKLSAgZG91YmxlIGZyQm94MkJveERpc3QoZnJCb3ggJmJveDEsIGZyQm94ICZib3gyKTsKLSAgZG91YmxlIGZyQm94MkJveERpc3QoYm94X3QgJmJveDEsIGJveF90ICZib3gyKTsKLSAgdm9pZCBmckJsb2NrYWdlMlBvbHkoZnJCbG9ja2FnZSAmYmxvY2thZ2VJbiwgYm9vc3RQb2x5Z29uICZwb2x5T3V0KTsKLSAgYm9vbCBpc1NhbWVQb2ludChib29zdFBvaW50ICZwdDEsIGJvb3N0UG9pbnQgJnB0Mik7Ci0gIHZvaWQgcG9seUNvdmVyaW5nKGJvb3N0UG9seWdvbiAmcG9seWdvbiwgZnJDb2xsZWN0aW9uPGZyUmVjdD4gJnJlY3RzKTsKLSAgdm9pZCBtYWludGFpbk1heFJlY3RzKHN0ZDo6dHVwbGU8aW50LCBpbnQsIGludCwgaW50PiAmbmV3UmVjdCwgc3RkOjpzZXQ8c3RkOjp0dXBsZTxpbnQsIGludCwgaW50LCBpbnQ+ID4gJm1heFJlY3RTZXQpOwotICBib29sIHByb2Nlc3NOZXdSZWN0KHN0ZDo6dHVwbGU8aW50LCBpbnQsIGludCwgaW50PiAmbmV3UmVjdCwgc3RkOjpzZXQ8c3RkOjp0dXBsZTxpbnQsIGludCwgaW50LCBpbnQ+ID4gJm1heFJlY3RTZXQpOwotICBib29sIGdldE1heEhTbGljZShpbnQgeElkeCwgaW50IHlJZHgsIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGJvb2w+ID4gJmlzT2NjdXBpZWQsIHN0ZDo6c2V0PHN0ZDo6cGFpcjxpbnQsIGludD4gPiAmc2xpY2VTZXQsIHN0ZDo6cGFpcjxpbnQsIGludD4gJnJldFB0KTsKLSAgYm9vbCBnZXRNYXhWU2xpY2UoaW50IHhJZHgsIGludCB5SWR4LCBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjxib29sPiA+ICZpc09jY3VwaWVkLCBzdGQ6OnNldDxzdGQ6OnBhaXI8aW50LCBpbnQ+ID4gJnNsaWNlU2V0LCBzdGQ6OnBhaXI8aW50LCBpbnQ+ICZyZXRQdCk7Ci0gIHZvaWQgZ2V0TWF4SFJlY3Qoc3RkOjpwYWlyPGludCwgaW50PiBzdGFydFB0LCBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjxib29sPiA+ICZpc09jY3VwaWVkLCBzdGQ6OnNldDxzdGQ6OnBhaXI8aW50LCBpbnQ+ID4gJnNsaWNlU2V0LCBzdGQ6OnNldDxzdGQ6OnR1cGxlPGludCwgaW50LCBpbnQsIGludD4gPiAmbWF4UmVjdFNldCk7Ci0gIHZvaWQgZ2V0TWF4VlJlY3Qoc3RkOjpwYWlyPGludCwgaW50PiBzdGFydFB0LCBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjxib29sPiA+ICZpc09jY3VwaWVkLCBzdGQ6OnNldDxzdGQ6OnBhaXI8aW50LCBpbnQ+ID4gJnNsaWNlU2V0LCBzdGQ6OnNldDxzdGQ6OnR1cGxlPGludCwgaW50LCBpbnQsIGludD4gPiAmbWF4UmVjdFNldCk7Ci0gIGZyQ29vcmQgZ2V0RWRnZVdpZHRoKGJvb3N0RWRnZSAmZWRnZSk7Ci0gIHZvaWQgZ2V0UG9seVdpdGhIb2xlKGNvbnN0IHN0ZDo6dmVjdG9yPFBvaW50PiAmdmVydGljZXMsIFBvbHlnb24gJm91dGxpbmUsIHN0ZDo6dmVjdG9yPFBvbHlnb24+ICZob2xlcyk7Ci0gIHZvaWQgZ2V0UG9seVdpdGhIb2xlKGNvbnN0IHN0ZDo6dmVjdG9yPFBvaW50PiAmdmVydGljZXMsIHN0ZDo6dmVjdG9yPFBvbHlnb24+ICZwb2x5cyk7Ci0gIHZvaWQgZ2V0UG9seVdpdGhIb2xlKGNvbnN0IFBvbHlnb24gJnBvbHlJbiwgc3RkOjp2ZWN0b3I8UG9seWdvbj4gJnBvbHlzKTsKLSAgYm9vbCBpc0NvbGluZWFyKGNvbnN0IFBvaW50ICZwdDEsIGNvbnN0IFBvaW50ICZwdDIsIGNvbnN0IFBvaW50ICZwdDMpOwotCi19CmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9pby9mclV0aWwuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvaW8vZnJVdGlsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg4ZDk5NC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9pby9mclV0aWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogQXV0aG9yczogTHV0b25nIFdhbmcgYW5kIEJhbmdxaSBYdSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImlvL2ZyVXRpbC5oIgotCi1uYW1lc3BhY2UgZnIgewotICBleHRlcm4gc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGZyTGF5ZXI+ID4gKmRlc2lnbkxheWVyczsKLSAgdm9pZCBzZXRMYXllcnMoc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGZyTGF5ZXI+ID4gKnZsYXllcnMpIHsKLSAgICBkZXNpZ25MYXllcnMgPSB2bGF5ZXJzOwotICB9Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxmcjo6ZnJMYXllcj4gPiogZ2V0TGF5ZXJzKCkgewotICAgIHJldHVybiBkZXNpZ25MYXllcnM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2lvL2ZyVXRpbC5oIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvaW8vZnJVdGlsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NDI2NzEuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvaW8vZnJVdGlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIF9GUl9VVElMX0hfCi0jZGVmaW5lIF9GUl9VVElMX0hfCi0KLSNpbmNsdWRlICJmckJhc2VUeXBlcy5oIgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlICJkYi90ZWNoL2ZyTGF5ZXIuaCIKLQotbmFtZXNwYWNlIGZyIHsKLSAgdm9pZCBzZXRMYXllcnMoc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGZyOjpmckxheWVyPiA+ICp2bGF5ZXJzKTsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGZyOjpmckxheWVyPiA+KiBnZXRMYXllcnMoKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9pby9pby5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9pby9pby5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MjNiNmMuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvaW8vaW8uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTAwNSArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxzc3RyZWFtPgotCi0jaW5jbHVkZSAiZ2xvYmFsLmgiCi0jaW5jbHVkZSAiaW8vaW8uaCIKLSNpbmNsdWRlICJkYi90ZWNoL2ZyQ29uc3RyYWludC5oIgotCi0vLyNpbmNsdWRlIDxib29zdC9wb2x5Z29uL3BvbHlnb24uaHBwPgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIGZyOwotLy91c2luZyBuYW1lc3BhY2UgYm9vc3Q6OnBvbHlnb246Om9wZXJhdG9yczsKLQotaW50IGlvOjpQYXJzZXI6OmdldERlZlZpYXMoZGVmckNhbGxiYWNrVHlwZV9lIHR5cGUsIGRlZmlWaWEqIHZpYSwgZGVmaVVzZXJEYXRhIGRhdGEpIHsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIGlmICgodHlwZSAhPSBkZWZyVmlhQ2JrVHlwZSkpIHsKLSAgICBjb3V0IDw8IlR5cGUgaXMgbm90IGRlZnJWaWFDYmtUeXBlISIgPDxlbmRsOwotICAgIGV4aXQoMSk7Ci0gIH0KLQotICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgY291dCA8PCItICIgPDx2aWEtPm5hbWUoKSA8PGVuZGw7Ci0gICAgLy9jb3V0IDw8IiAgbnVtTGF5ZXJzID0gIiA8PHZpYS0+bnVtTGF5ZXJzKCkgPDxlbmRsOwotICB9Ci0gIC8vIHZpYVJ1bGUgZGVmaW5lZCB2aWEKLSAgaWYgKHZpYS0+aGFzVmlhUnVsZSgpKSB7Ci0gICAgY2hhciogdmlhUnVsZU5hbWU7Ci0gICAgY2hhciogYm90TGF5ZXI7Ci0gICAgY2hhciogY3V0TGF5ZXI7Ci0gICAgY2hhciogdG9wTGF5ZXI7Ci0gICAgaW50IHhTaXplLCB5U2l6ZSwgeEN1dFNwYWNpbmcsIHlDdXRTcGFjaW5nLCB4Qm90RW5jLCB5Qm90RW5jLCB4VG9wRW5jLCB5VG9wRW5jOwotICAgIHZpYS0+dmlhUnVsZSgmdmlhUnVsZU5hbWUsICZ4U2l6ZSwgJnlTaXplLCAmYm90TGF5ZXIsICZjdXRMYXllciwgJnRvcExheWVyLAotICAgICAgICAgICAgICAgICAmeEN1dFNwYWNpbmcsICZ5Q3V0U3BhY2luZywgJnhCb3RFbmMsICZ5Qm90RW5jLCAmeFRvcEVuYywgJnlUb3BFbmMpOwotICAgIGludCB4T2Zmc2V0ID0gMDsKLSAgICBpbnQgeU9mZnNldCA9IDA7Ci0gICAgaWYgKHZpYS0+aGFzT3JpZ2luKCkpIHsKLSAgICAgIHZpYS0+b3JpZ2luKCZ4T2Zmc2V0LCAmeU9mZnNldCk7Ci0gICAgfQotICAgIGludCB4Qm90T2Zmc2V0ID0gMDsKLSAgICBpbnQgeUJvdE9mZnNldCA9IDA7Ci0gICAgaW50IHhUb3BPZmZzZXQgPSAwOwotICAgIGludCB5VG9wT2Zmc2V0ID0gMDsKLSAgICBpZiAodmlhLT5oYXNPZmZzZXQoKSkgewotICAgICAgdmlhLT5vZmZzZXQoJnhCb3RPZmZzZXQsICZ5Qm90T2Zmc2V0LCAmeFRvcE9mZnNldCwgJnlUb3BPZmZzZXQpOwotICAgIH0KLSAgICBpbnQgbnVtQ3V0Um93cyA9IDE7Ci0gICAgaW50IG51bUN1dENvbHMgPSAxOwotICAgIGlmICh2aWEtPmhhc1Jvd0NvbCgpKSB7Ci0gICAgICB2aWEtPnJvd0NvbCgmbnVtQ3V0Um93cywgJm51bUN1dENvbHMpOwotICAgIH0KLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBjb3V0IDw8IiArIFZJQVJVTEUgIiAgICA8PHZpYVJ1bGVOYW1lIDw8ZW5kbDsKLSAgICAgIC8vY291dCA8PCIgKyBDVVRTSVpFICIgPDx4U2l6ZSAqIDEuMCAvICgoaW86OlBhcnNlciopZGF0YSktPnRtcEJsb2NrLT5nZXREQlVQZXJVVSgpIDw8IiAiIAotICAgICAgLy8gICAgICAgICAgICAgICAgICAgICA8PHlTaXplICogMS4wIC8gKChpbzo6UGFyc2VyKilkYXRhKS0+dG1wQmxvY2stPmdldERCVVBlclVVKCkgPDxlbmRsOwotICAgICAgY291dCA8PCIgKyBDVVRTSVpFICIgICAgPDx4U2l6ZSAgICAgICA8PCIgIiA8PHlTaXplICAgICAgIDw8ZW5kbDsKLSAgICAgIGNvdXQgPDwiICsgTEFZRVJTICIgICAgIDw8Ym90TGF5ZXIgICAgPDwiICIgPDxjdXRMYXllciAgICA8PCIgIiAgIDw8dG9wTGF5ZXIgPDxlbmRsOwotICAgICAgY291dCA8PCIgKyBDVVRTUEFDSU5HICIgPDx4Q3V0U3BhY2luZyA8PCIgIiA8PHlDdXRTcGFjaW5nIDw8ZW5kbDsKLSAgICAgIGNvdXQgPDwiICsgRU5DTE9TVVJFICIgIDw8eEJvdEVuYyAgICAgPDwiICIgPDx5Qm90RW5jICAgICA8PCIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDx4VG9wRW5jICAgICA8PCIgIiA8PHlUb3BFbmMgICAgIDw8ZW5kbDsKLSAgICAgIGlmICh2aWEtPmhhc1Jvd0NvbCgpKSB7Ci0gICAgICAgIGNvdXQgPDwiICsgUk9XQ09MICIgPDxudW1DdXRSb3dzIDw8IiAiIDw8bnVtQ3V0Q29scyA8PGVuZGw7Ci0gICAgICB9Ci0gICAgICBpZiAodmlhLT5oYXNPcmlnaW4oKSkgewotICAgICAgICBjb3V0IDw8IiArIE9SSUdJTiAiIDw8eE9mZnNldCA8PCIgIiA8PHlPZmZzZXQgPDxlbmRsOwotICAgICAgfQotICAgICAgaWYgKHZpYS0+aGFzT2Zmc2V0KCkpIHsKLSAgICAgICAgY291dCA8PCIgKyBPRkZTRVQgIiA8PHhCb3RPZmZzZXQgPDwiICIgPDx5Qm90T2Zmc2V0IDw8IiAiIDw8eFRvcE9mZnNldCA8PCIgIiA8PHlUb3BPZmZzZXQgPDxlbmRsOwotICAgICAgfQotICAgICAgY291dCA8PCIgOyIgPDxlbmRsOwotCi0gICAgfQotCi0gICAgLy8gY3JlYXRlIGN1dCBmaWdzCi0gICAgZnJMYXllck51bSBjdXRMYXllck51bSA9IDA7Ci0gICAgaWYgKCgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPm5hbWUybGF5ZXIuZmluZChjdXRMYXllcikgPT0gKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+bmFtZTJsYXllci5lbmQoKSkgewotICAgICAgY291dCA8PCJFcnJvcjogY2Fubm90IGZpbmQgY3V0IGxheWVyIiA8PGVuZGw7Ci0gICAgICBleGl0KDEpOwotICAgIH0gZWxzZSB7Ci0gICAgICBjdXRMYXllck51bSA9ICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPm5hbWUybGF5ZXIuZmluZChjdXRMYXllciktPnNlY29uZC0+Z2V0TGF5ZXJOdW0oKTsKLSAgICB9Ci0gICAgZnJMYXllck51bSBib3RMYXllck51bSA9IDA7Ci0gICAgaWYgKCgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPm5hbWUybGF5ZXIuZmluZChib3RMYXllcikgPT0gKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+bmFtZTJsYXllci5lbmQoKSkgewotICAgICAgY291dCA8PCJFcnJvcjogY2Fubm90IGZpbmQgYm90IGxheWVyIiA8PGVuZGw7Ci0gICAgICBleGl0KDEpOwotICAgIH0gZWxzZSB7Ci0gICAgICBib3RMYXllck51bSA9ICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPm5hbWUybGF5ZXIuZmluZChib3RMYXllciktPnNlY29uZC0+Z2V0TGF5ZXJOdW0oKTsKLSAgICB9Ci0gICAgLy8gY3JlYXRlIGN1dCBmaWdzCi0gICAgZnJMYXllck51bSB0b3BMYXllck51bSA9IDA7Ci0gICAgaWYgKCgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPm5hbWUybGF5ZXIuZmluZCh0b3BMYXllcikgPT0gKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+bmFtZTJsYXllci5lbmQoKSkgewotICAgICAgY291dCA8PCJFcnJvcjogY2Fubm90IGZpbmQgdG9wIGxheWVyIiA8PGVuZGw7Ci0gICAgICBleGl0KDEpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0b3BMYXllck51bSA9ICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPm5hbWUybGF5ZXIuZmluZCh0b3BMYXllciktPnNlY29uZC0+Z2V0TGF5ZXJOdW0oKTsKLSAgICB9Ci0KLSAgICBmckNvb3JkIGN1cnJYID0gMDsKLSAgICBmckNvb3JkIGN1cnJZID0gMDsKLSAgICB2ZWN0b3I8dW5pcXVlX3B0cjxmclNoYXBlPiA+IGN1dEZpZ3M7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DdXRSb3dzOyBpKyspIHsKLSAgICAgIGN1cnJYID0gMDsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbnVtQ3V0Q29sczsgaisrKSB7Ci0gICAgICAgIGF1dG8gcmVjdCA9IG1ha2VfdW5pcXVlPGZyUmVjdD4oKTsKLSAgICAgICAgZnJCb3ggdG1wQm94KGN1cnJYLCBjdXJyWSwgY3VyclggKyB4U2l6ZSwgY3VyclkgKyB5U2l6ZSk7Ci0gICAgICAgIHJlY3QtPnNldEJCb3godG1wQm94KTsKLSAgICAgICAgcmVjdC0+c2V0TGF5ZXJOdW0oY3V0TGF5ZXJOdW0pOwotICAgICAgICAvL2NvdXQgPDwiY3V0RmlnICgiIDw8Y3VyclggPDwiLCAiIDw8Y3VyclkgPDwiKSAoIiA8PGN1cnJYK3hTaXplIDw8IiwiIDw8Y3VyclkreVNpemUgPDwiKSAiIDw8Y3V0TGF5ZXIgPDxlbmRsOwotCi0gICAgICAgIHVuaXF1ZV9wdHI8ZnJTaGFwZT4gdG1wKHN0ZDo6bW92ZShyZWN0KSk7Ci0gICAgICAgIGN1dEZpZ3MucHVzaF9iYWNrKHN0ZDo6bW92ZSh0bXApKTsKLQotICAgICAgICBjdXJyWCArPSB4U2l6ZSArIHhDdXRTcGFjaW5nOwotICAgICAgfQotICAgICAgY3VyclkgKz0geVNpemUgKyB5Q3V0U3BhY2luZzsKLSAgICB9Ci0gICAgY3VyclggLT0geEN1dFNwYWNpbmc7IC8vIG1heCBjdXQgWAotICAgIGN1cnJZIC09IHlDdXRTcGFjaW5nOyAvLyBtYXggY3V0IFkKLSAgICAvL2NvdXQgPDwibWF4IHgveSAiIDw8Y3VyclggPDwiICIgPDxjdXJyWSA8PGVuZGw7Ci0KLSAgICBmclRyYW5zZm9ybSBjdXRYZm9ybSgtY3VyclggLyAyICsgeE9mZnNldCwgLWN1cnJZIC8gMiArIHlPZmZzZXQpOwotICAgIGZvciAoYXV0byAmdVNoYXBlOiBjdXRGaWdzKSB7Ci0gICAgICBhdXRvIHJlY3QgPSBzdGF0aWNfY2FzdDxmclJlY3QqPih1U2hhcGUuZ2V0KCkpOwotICAgICAgLy9jb3V0IDw8Im9yaWcgIiA8PCpyZWN0IDw8ZW5kbDsKLSAgICAgIHJlY3QtPm1vdmUoY3V0WGZvcm0pOwotICAgICAgLy9jb3V0IDw8Im1vdmUgIiA8PCpyZWN0IDw8ZW5kbDsKLSAgICB9Ci0KLSAgICB1bmlxdWVfcHRyPGZyU2hhcGU+IHVCb3RGaWcgPSBtYWtlX3VuaXF1ZTxmclJlY3Q+KCk7Ci0gICAgYXV0byBib3RGaWcgPSBzdGF0aWNfY2FzdDxmclJlY3QqPih1Qm90RmlnLmdldCgpKTsKLSAgICB1bmlxdWVfcHRyPGZyU2hhcGU+IHVUb3BGaWcgPSBtYWtlX3VuaXF1ZTxmclJlY3Q+KCk7Ci0gICAgYXV0byB0b3BGaWcgPSBzdGF0aWNfY2FzdDxmclJlY3QqPih1VG9wRmlnLmdldCgpKTsKLQotICAgIGZyQm94IGJvdEJveCgwIC0geEJvdEVuYywgMCAtIHlCb3RFbmMsIGN1cnJYICsgeEJvdEVuYywgY3VyclkgKyB5Qm90RW5jKTsKLSAgICBmckJveCB0b3BCb3goMCAtIHhUb3BFbmMsIDAgLSB5VG9wRW5jLCBjdXJyWCArIHhUb3BFbmMsIGN1cnJZICsgeVRvcEVuYyk7Ci0KLSAgICBmclRyYW5zZm9ybSBib3RYZm9ybSgtY3VyclggLyAyICsgeE9mZnNldCArIHhCb3RPZmZzZXQsIC1jdXJyWSAvIDIgKyB5T2Zmc2V0ICsgeUJvdE9mZnNldCk7Ci0gICAgZnJUcmFuc2Zvcm0gdG9wWGZvcm0oLWN1cnJYIC8gMiArIHhPZmZzZXQgKyB4VG9wT2Zmc2V0LCAtY3VyclkgLyAyICsgeU9mZnNldCArIHlUb3BPZmZzZXQpOwotICAgIGJvdEJveC50cmFuc2Zvcm0oYm90WGZvcm0pOwotICAgIHRvcEJveC50cmFuc2Zvcm0odG9wWGZvcm0pOwotCi0gICAgYm90RmlnLT5zZXRCQm94KGJvdEJveCk7Ci0gICAgdG9wRmlnLT5zZXRCQm94KHRvcEJveCk7Ci0gICAgYm90RmlnLT5zZXRMYXllck51bShib3RMYXllck51bSk7Ci0gICAgdG9wRmlnLT5zZXRMYXllck51bSh0b3BMYXllck51bSk7Ci0KLSAgICAvLyBjcmVhdGUgdmlhCi0gICAgYXV0byB2aWFEZWYgPSBtYWtlX3VuaXF1ZTxmclZpYURlZj4odmlhLT5uYW1lKCkpOwotICAgIHZpYURlZi0+YWRkTGF5ZXIxRmlnKHVCb3RGaWcpOwotICAgIHZpYURlZi0+YWRkTGF5ZXIyRmlnKHVUb3BGaWcpOwotICAgIGZvciAoYXV0byAmdVNoYXBlOiBjdXRGaWdzKSB7Ci0gICAgICB2aWFEZWYtPmFkZEN1dEZpZyh1U2hhcGUpOwotICAgIH0KLSAgICAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5hZGRWaWEodmlhRGVmKTsKLSAgLy8gUkVDVCBkZWZpbmVkIHZpYQotICB9IGVsc2UgewotICAgIGlmICh2aWEtPm51bVBvbHlnb25zKCkpIHsKLSAgICAgIGNvdXQgPDwiRXJyb3I6IHVuc3VwcG9ydCBwb2x5Z29uIGluIGRlZiB2aWEiIDw8ZW5kbDsKLSAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAgIGNoYXIqIGxheWVyTmFtZTsKLSAgICBpbnQgeGw7Ci0gICAgaW50IHlsOwotICAgIGludCB4aDsKLSAgICBpbnQgeWg7Ci0gICAgbWFwPGZyTGF5ZXJOdW0sIHNldDxpbnQ+ID4gbE51bTJJbnQ7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2aWEtPm51bUxheWVycygpOyArK2kpIHsKLSAgICAgIHZpYS0+bGF5ZXIoaSwgJmxheWVyTmFtZSwgJnhsLCAmeWwsICZ4aCwgJnloKTsKLSAgICAgIGlmICgoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5uYW1lMmxheWVyLmZpbmQobGF5ZXJOYW1lKSA9PSAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5uYW1lMmxheWVyLmVuZCgpKSB7Ci0gICAgICAgIGlmIChWRVJCT1NFID4gLTEpIHsKLSAgICAgICAgICBjb3V0IDw8Ildhcm5pbmc6IGxheWVyICIgPDxsYXllck5hbWUgPDwiIGlzIHNraXBpcGVkIGZvciAiIDw8dmlhLT5uYW1lKCkgPDxlbmRsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotICAgICAgYXV0byBsYXllck51bSA9ICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPm5hbWUybGF5ZXIuYXQobGF5ZXJOYW1lKS0+Z2V0TGF5ZXJOdW0oKTsKLSAgICAgIGxOdW0ySW50W2xheWVyTnVtXS5pbnNlcnQoaSk7Ci0gICAgICAvL2NvdXQgPDwibGF5ZXJOdW0gIiA8PGxheWVyTnVtIDw8IiBpICIgPDxpIDw8ZW5kbDsKLSAgICB9Ci0gICAgaWYgKChpbnQpbE51bTJJbnQuc2l6ZSgpICE9IDMpIHsKLSAgICAgIGlmIChWRVJCT1NFID4gLTEpIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogdW5zdXBwb3J0ZWQgdmlhIiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgICBleGl0KDEpOwotICAgIH0KLSAgICBpZiAobE51bTJJbnQuYmVnaW4oKS0+Zmlyc3QgKyAyICE9ICgtLWxOdW0ySW50LmVuZCgpKS0+Zmlyc3QpIHsKLSAgICAgIGlmIChWRVJCT1NFID4gLTEpIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogbm9uLWNvbnNlY3V0aXZlIGxheWVycyIgPDxlbmRsOwotICAgICAgfQotICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgYXV0byB2aWFEZWYgPSBtYWtlX3VuaXF1ZTxmclZpYURlZj4odmlhLT5uYW1lKCkpOwotICAgIGludCBjbnQgPSAwOwotICAgIGZvciAoYXV0byAmW2xheWVyTnVtLCBpbnRTXTogbE51bTJJbnQpIHsKLSAgICAgIGZvciAoYXV0byBpOiBpbnRTKSB7Ci0gICAgICAgIHZpYS0+bGF5ZXIoaSwgJmxheWVyTmFtZSwgJnhsLCAmeWwsICZ4aCwgJnloKTsKLSAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgIGNvdXQgPDwiICsgUkVDVCAiIDw8bGF5ZXJOYW1lIDw8IiAoICIgPDx4bCA8PCIgIiA8PHlsIDw8IiApICggIiA8PHhoIDw8IiAiIDw8eWggPDwiICkiIDw8ZW5kbDsKLSAgICAgICAgfQotICAgICAgICB1bmlxdWVfcHRyPGZyUmVjdD4gcGluRmlnID0gbWFrZV91bmlxdWU8ZnJSZWN0PigpOwotICAgICAgICBwaW5GaWctPnNldEJCb3goZnJCb3goeGwsIHlsLCB4aCwgeWgpKTsKLSAgICAgICAgcGluRmlnLT5zZXRMYXllck51bShsYXllck51bSk7Ci0gICAgICAgIHVuaXF1ZV9wdHI8ZnJTaGFwZT4gdG1wKHN0ZDo6bW92ZShwaW5GaWcpKTsKLSAgICAgICAgc3dpdGNoKGNudCkgewotICAgICAgICAgIGNhc2UgMCA6Ci0gICAgICAgICAgICB2aWFEZWYtPmFkZExheWVyMUZpZyh0bXApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgIHZpYURlZi0+YWRkQ3V0RmlnKHRtcCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdmlhRGVmLT5hZGRMYXllcjJGaWcodG1wKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvL2ZvciAoaW50IGogPSAwOyBqIDwgdmlhLT5udW1Qb2x5Z29ucyhpKTsgKytqKSB7Ci0gICAgICAvLyAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgLy8gICAgY291dCA8PCIgICAgUE9MWUdPTiI7IAotICAgICAgLy8gIH0KLSAgICAgIC8vICB2ZWN0b3I8ZnJQb2ludD4gdG1wUG9pbnRzOwotICAgICAgLy8gIGZvciAoaW50IGsgPSAwOyBrIDwgdmlhLT5nZXRQb2x5Z29uKGksIGopLm51bVBvaW50czsgaysrKSB7Ci0gICAgICAvLyAgICBmckNvb3JkIHggPSByb3VuZCh2aWEtPmdldFBvbHlnb24oaSwgaikueFtrXSAqICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmdldERCVVBlclVVKCkpOwotICAgICAgLy8gICAgZnJDb29yZCB5ID0gcm91bmQodmlhLT5nZXRQb2x5Z29uKGksIGopLnlba10gKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKTsKLSAgICAgIC8vICAgIHRtcFBvaW50cy5wdXNoX2JhY2soZnJQb2ludCh4LCB5KSk7Ci0gICAgICAvLyAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAvLyAgICAgICBjb3V0IDw8IiAiIDw8eCAqIDEuMCAvICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmdldERCVVBlclVVKCkgPDwiICIgCi0gICAgICAvLyAgICAgICAgICAgICAgICAgIDw8eSAqIDEuMCAvICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmdldERCVVBlclVVKCk7Ci0gICAgICAvLyAgICB9Ci0gICAgICAvLyAgfQotICAgICAgLy8gIHVuaXF1ZV9wdHI8ZnJQb2x5Z29uPiBwaW5GaWcgPSBtYWtlX3VuaXF1ZTxmclBvbHlnb24+KCk7Ci0gICAgICAvLyAgcGluRmlnLT5zZXRQb2ludHModG1wUG9pbnRzKTsKLSAgICAgIC8vICBwaW5GaWctPnNldExheWVyTnVtKGxheWVyTnVtKTsKLSAgICAgIC8vICB1bmlxdWVfcHRyPGZyU2hhcGU+IHRtcChzdGQ6Om1vdmUocGluRmlnKSk7Ci0gICAgICAvLyAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgLy8gICAgY291dCA8PCIgOyIgPDxlbmRsOwotICAgICAgLy8gIH0KLSAgICAgIC8vICBzd2l0Y2goY250KSB7Ci0gICAgICAvLyAgICBjYXNlIDAgOgotICAgICAgLy8gICAgICB2aWFEZWYtPmFkZExheWVyMUZpZyh0bXApOwotICAgICAgLy8gICAgICBicmVhazsKLSAgICAgIC8vICAgIGNhc2UgMSA6Ci0gICAgICAvLyAgICAgIHZpYURlZi0+YWRkQ3V0RmlnKHRtcCk7Ci0gICAgICAvLyAgICAgIGJyZWFrOwotICAgICAgLy8gICAgZGVmYXVsdDoKLSAgICAgIC8vICAgICAgdmlhRGVmLT5hZGRMYXllcjJGaWcodG1wKTsKLSAgICAgIC8vICAgICAgYnJlYWs7Ci0gICAgICAvLyAgfQotICAgICAgLy99Ci0gICAgICBjbnQrKzsKLSAgICB9Ci0gICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgY291dCA8PCIgOyIgPDxlbmRsOwotICAgIH0KLSAgICAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5hZGRWaWEodmlhRGVmKTsKLSAgfQotCi0gIHJldHVybiAwOwotfQotCi1pbnQgaW86OlBhcnNlcjo6Z2V0RGVmQ29tcG9uZW50cyhkZWZyQ2FsbGJhY2tUeXBlX2UgdHlwZSwgZGVmaUNvbXBvbmVudCogY29tcCwgZGVmaVVzZXJEYXRhIGRhdGEpIHsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIGlmICgodHlwZSAhPSBkZWZyQ29tcG9uZW50Q2JrVHlwZSkpIHsKLSAgICBjb3V0IDw8IlR5cGUgaXMgbm90IGRlZnJDb21wb25lbnRDYmtUeXBlISIgPDxlbmRsOwotICAgIGV4aXQoMSk7Ci0gIH0KLQotICBpZiAoKChpbzo6UGFyc2VyKilkYXRhKS0+ZGVzaWduLT5uYW1lMnJlZkJsb2NrLmZpbmQoY29tcC0+bmFtZSgpKSA9PSAoKGlvOjpQYXJzZXIqKWRhdGEpLT5kZXNpZ24tPm5hbWUycmVmQmxvY2suZW5kKCkpIHsKLSAgICBpZiAoVkVSQk9TRSA+IC0xKSB7Ci0gICAgICBjb3V0IDw8IkVycm9yOiBsaWJyYXJ5IGNlbGwgbm90IGZvdW5kISIgPDxlbmRsOwotICAgIH0KLSAgICBleGl0KDEpOwotICB9Ci0gIAotICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgY291dCA8PCItICIgPDxjb21wLT5pZCgpIDw8IiAiIDw8Y29tcC0+bmFtZSgpIDw8IiArIFNUQVRVUyAoICIgPDxjb21wLT5wbGFjZW1lbnRYKCkKLSAgICAgICAgIDw8IiAiIDw8Y29tcC0+cGxhY2VtZW50WSgpIDw8IiApICIgPDxjb21wLT5wbGFjZW1lbnRPcmllbnQoKSA8PGVuZGw7Ci0gIH0KLQotICAKLSAgYXV0byB1SW5zdCA9IG1ha2VfdW5pcXVlPGZySW5zdD4oKTsKLSAgYXV0byB0bXBJbnN0ID0gdUluc3QuZ2V0KCk7Ci0gIHRtcEluc3QtPnNldElkKCgoaW86OlBhcnNlciopZGF0YSktPm51bUluc3RzKTsKLSAgKChpbzo6UGFyc2VyKilkYXRhKS0+bnVtSW5zdHMrKzsKLSAgdG1wSW5zdC0+c2V0TmFtZShjb21wLT5pZCgpKTsKLSAgdG1wSW5zdC0+c2V0T3JpZ2luKGZyUG9pbnQoY29tcC0+cGxhY2VtZW50WCgpLCBjb21wLT5wbGFjZW1lbnRZKCkpKTsKLSAgdG1wSW5zdC0+c2V0T3JpZW50KGZyT3JpZW50RW51bShjb21wLT5wbGFjZW1lbnRPcmllbnQoKSkpOwotICB0bXBJbnN0LT5zZXRSZWZCbG9jaygoKGlvOjpQYXJzZXIqKWRhdGEpLT5kZXNpZ24tPm5hbWUycmVmQmxvY2suYXQoY29tcC0+bmFtZSgpKSk7Ci0gIGZvciAoYXV0byAmdVRlcm06IHRtcEluc3QtPmdldFJlZkJsb2NrKCktPmdldFRlcm1zKCkpIHsKLSAgICBhdXRvIHRlcm0gPSB1VGVybS5nZXQoKTsKLSAgICB1bmlxdWVfcHRyPGZySW5zdFRlcm0+IGluc3RUZXJtID0gbWFrZV91bmlxdWU8ZnJJbnN0VGVybT4oKTsKLSAgICBpbnN0VGVybS0+c2V0SWQoKChpbzo6UGFyc2VyKilkYXRhKS0+bnVtVGVybXMpOwotICAgICgoaW86OlBhcnNlciopZGF0YSktPm51bVRlcm1zKys7Ci0gICAgaW5zdFRlcm0tPmFkZFRvSW5zdCh0bXBJbnN0KTsKLSAgICBpbnN0VGVybS0+YWRkVGVybSh0ZXJtKTsKLSAgICB0bXBJbnN0LT5hZGRJbnN0VGVybShpbnN0VGVybSk7Ci0gIH0KLSAgZm9yIChhdXRvICZ1QmxrOiB0bXBJbnN0LT5nZXRSZWZCbG9jaygpLT5nZXRCbG9ja2FnZXMoKSkgewotICAgIGF1dG8gYmxrID0gdUJsay5nZXQoKTsKLSAgICB1bmlxdWVfcHRyPGZySW5zdEJsb2NrYWdlPiBpbnN0QmxrID0gbWFrZV91bmlxdWU8ZnJJbnN0QmxvY2thZ2U+KCk7Ci0gICAgaW5zdEJsay0+c2V0SWQoKChpbzo6UGFyc2VyKilkYXRhKS0+bnVtQmxvY2thZ2VzKTsKLSAgICAoKGlvOjpQYXJzZXIqKWRhdGEpLT5udW1CbG9ja2FnZXMrKzsKLSAgICBpbnN0QmxrLT5hZGRUb0luc3QodG1wSW5zdCk7Ci0gICAgaW5zdEJsay0+YWRkQmxvY2thZ2UoYmxrKTsKLSAgICB0bXBJbnN0LT5hZGRJbnN0QmxvY2thZ2UoaW5zdEJsayk7Ci0gIH0KLQotICBpZiAoKChpbzo6UGFyc2VyKilkYXRhKS0+dG1wQmxvY2stPm5hbWUyaW5zdC5maW5kKGNvbXAtPmlkKCkpICE9ICgoaW86OlBhcnNlciopZGF0YSktPnRtcEJsb2NrLT5uYW1lMmluc3QuZW5kKCkpIHsKLSAgICBpZiAoVkVSQk9TRSA+IC0xKSB7Ci0gICAgICBjb3V0IDw8IkVycm9yOiBzYW1lIGNlbGwgbmFtZSEiIDw8ZW5kbDsKLSAgICB9Ci0gICAgZXhpdCgxKTsKLSAgfQotICAoKGlvOjpQYXJzZXIqKWRhdGEpLT50bXBCbG9jay0+YWRkSW5zdCh1SW5zdCk7Ci0gIGlmICgoKGlvOjpQYXJzZXIqKWRhdGEpLT50bXBCbG9jay0+aW5zdHMuc2l6ZSgpIDwgMTAwMDAwKSB7Ci0gICAgaWYgKCgoaW86OlBhcnNlciopZGF0YSktPnRtcEJsb2NrLT5pbnN0cy5zaXplKCkgJSAxMDAwMCA9PSAwKSB7Ci0gICAgICBjb3V0IDw8ImRlZkluIHJlYWQgIiA8PCgoaW86OlBhcnNlciopZGF0YSktPnRtcEJsb2NrLT5pbnN0cy5zaXplKCkgPDwiIGNvbXBvbmVudHMiIDw8ZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKCgoaW86OlBhcnNlciopZGF0YSktPnRtcEJsb2NrLT5pbnN0cy5zaXplKCkgJSAxMDAwMDAgPT0gMCkgewotICAgICAgY291dCA8PCJkZWZJbiByZWFkICIgPDwoKGlvOjpQYXJzZXIqKWRhdGEpLT50bXBCbG9jay0+aW5zdHMuc2l6ZSgpIDw8IiBjb21wb25lbnRzIiA8PGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBpbzo6UGFyc2VyOjpnZXREZWZTdHJpbmcoZGVmckNhbGxiYWNrVHlwZV9lIHR5cGUsIGNvbnN0IGNoYXIqIHN0ciwgZGVmaVVzZXJEYXRhIGRhdGEpIHsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIGlmICgodHlwZSA9PSBkZWZyRGVzaWduU3RhcnRDYmtUeXBlKSkgewotICAgIGF1dG8gJnRtcEJsb2NrID0gKChpbzo6UGFyc2VyKilkYXRhKS0+dG1wQmxvY2s7Ci0gICAgdG1wQmxvY2sgPSBtYWtlX3VuaXF1ZTxmckJsb2NrPigpOwotICAgIHRtcEJsb2NrLT5zZXROYW1lKHN0cmluZyhzdHIpKTsKLSAgICB0bXBCbG9jay0+dHJhY2tQYXR0ZXJucy5jbGVhcigpOwotICAgIHRtcEJsb2NrLT50cmFja1BhdHRlcm5zLnJlc2l6ZSgoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5sYXllcnMuc2l6ZSgpKTsKLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBjb3V0IDw8IkRFU0lHTiAiIDw8dG1wQmxvY2stPmdldE5hbWUoKSA8PCIgOyIgPDxlbmRsOwotICAgIH0KLSAgfQotICByZXR1cm4gMDsKLX0KLQotaW50IGlvOjpQYXJzZXI6OmdldERlZlZvaWQoZGVmckNhbGxiYWNrVHlwZV9lIHR5cGUsIHZvaWQqIHZhcmlhYmxlLCBkZWZpVXNlckRhdGEgZGF0YSkgewotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLSAgaWYgKCh0eXBlID09IGRlZnJEZXNpZ25FbmRDYmtUeXBlKSkgewotICAgICgoaW86OlBhcnNlciopZGF0YSktPnRtcEJsb2NrLT5zZXRJZCgwKTsKLSAgICAoKGlvOjpQYXJzZXIqKWRhdGEpLT5kZXNpZ24tPnNldFRvcEJsb2NrKCgoaW86OlBhcnNlciopZGF0YSktPnRtcEJsb2NrKTsKLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBjb3V0IDw8IkVORCBERVNJR04iIDw8ZW5kbDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBpbzo6UGFyc2VyOjpnZXREZWZEaWVBcmVhKGRlZnJDYWxsYmFja1R5cGVfZSB0eXBlLCBkZWZpQm94KiBib3gsIGRlZmlVc2VyRGF0YSBkYXRhKSB7Ci0gIC8vYm9vbCBlbmFibGVPdXRwdXQgPSB0cnVlOwotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICBpZiAoKHR5cGUgIT0gZGVmckRpZUFyZWFDYmtUeXBlKSkgewotICAgIGNvdXQgPDwiVHlwZSBpcyBub3QgZGVmckRpZUFyZWFDYmtUeXBlISIgPDxlbmRsOwotICAgIGV4aXQoMSk7Ci0gIH0KLSAgLy8oKGlvOjpQYXJzZXIqKWRhdGEpLT50bXBCbG9jay0+c2V0QkJveChmckJveChib3gtPnhsKCksIGJveC0+eWwoKSwgYm94LT54aCgpLCBib3gtPnloKCkpKTsKLSAgdmVjdG9yPGZyQm91bmRhcnk+IGJvdW5kczsKLSAgZnJCb3VuZGFyeSBib3VuZDsKLSAgdmVjdG9yPGZyUG9pbnQ+IHBvaW50czsKLSAgcG9pbnRzLnB1c2hfYmFjayhmclBvaW50KGJveC0+eGwoKSwgYm94LT55bCgpKSk7Ci0gIHBvaW50cy5wdXNoX2JhY2soZnJQb2ludChib3gtPnhoKCksIGJveC0+eWwoKSkpOwotICBwb2ludHMucHVzaF9iYWNrKGZyUG9pbnQoYm94LT54aCgpLCBib3gtPnloKCkpKTsKLSAgcG9pbnRzLnB1c2hfYmFjayhmclBvaW50KGJveC0+eGwoKSwgYm94LT55aCgpKSk7Ci0gIGJvdW5kLnNldFBvaW50cyhwb2ludHMpOwotICBib3VuZHMucHVzaF9iYWNrKGJvdW5kKTsKLSAgKChpbzo6UGFyc2VyKilkYXRhKS0+dG1wQmxvY2stPnNldEJvdW5kYXJpZXMoYm91bmRzKTsKLSAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgIGNvdXQgPDwiRElFQVJFQSAoICIgPDxib3gtPnhsKCkgPDwiICIgPDxib3gtPnlsKCkgPDwiICkgKCAiIDw8Ym94LT54aCgpIDw8IiAiIDw8Ym94LT55aCgpIDw8IiApIDsiIDw8ZW5kbDsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotLy9pbnQgRmxleFJvdXRlOjpnZXREZWZJbnRlZ2VyKGRlZnJDYWxsYmFja1R5cGVfZSB0eXBlLCBpbnQgbnVtYmVyLCBkZWZpVXNlckRhdGEgZGF0YSkgewotLy8gIGlmICh0eXBlID09IGRlZnJDb21wb25lbnRTdGFydENia1R5cGUpIHsKLS8vICAgICgoRmxleFJvdXRlKilkYXRhKS0+Y29tcHMgPSB2ZWN0b3I8Q29tcG9uZW50PigoKEZsZXhSb3V0ZSopZGF0YSktPm51bUNvbXBzKTsKLS8vICB9Ci0vLyAgaWYgKHR5cGUgPT0gZGVmck5ldFN0YXJ0Q2JrVHlwZSkgewotLy8gICAgKChGbGV4Um91dGUqKWRhdGEpLT5udW1OZXRzID0gbnVtYmVyOwotLy8gICAgKChGbGV4Um91dGUqKWRhdGEpLT5uZXRzID0gdmVjdG9yPE5ldD4oKChGbGV4Um91dGUqKWRhdGEpLT5udW1OZXRzKTsKLS8vICB9Ci0vLyAgaWYgKHR5cGUgPT0gZGVmclNOZXRTdGFydENia1R5cGUpIHsKLS8vICAgIGNvdXQgPDwgInNwZWNpYWwgbmV0IGNvdW50ID0gIiA8PCBudW1iZXIgPDwgZW5kbDsKLS8vICAgICgoRmxleFJvdXRlKilkYXRhKS0+bnVtU05ldHMgPSBudW1iZXI7Ci0vLyAgICAvLyAoKEZsZXhSb3V0ZSopZGF0YSktPnNuZXRzID0gdmVjdG9yPFNOZXQ+KG51bWJlcik7Ci0vLyAgfQotLy8gIHJldHVybiAwOwotLy99Ci0KLWludCBpbzo6UGFyc2VyOjpnZXREZWZOZXRzKGRlZnJDYWxsYmFja1R5cGVfZSB0eXBlLCBkZWZpTmV0KiBuZXQsIGRlZmlVc2VyRGF0YSBkYXRhKSB7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIC8vYm9vbCBlbmFibGVPdXRwdXQgPSB0cnVlOwotICBib29sIGlzU05ldCA9IGZhbHNlOwotCi0gIGlmICh0eXBlICE9IGRlZnJOZXRDYmtUeXBlICYmIHR5cGUgIT0gZGVmclNOZXRDYmtUeXBlKSB7Ci0gICAgY291dCA8PCJUeXBlIGlzIG5vdCBkZWZyKFMpTmV0Q2JrVHlwZSEiIDw8ZW5kbDsKLSAgICBleGl0KDEpOwotICB9Ci0KLSAgaWYgKHR5cGUgPT0gZGVmclNOZXRDYmtUeXBlKSB7Ci0gICAgLy9jb3V0IDw8IlR5cGUgaXMgU3BlY2lhbCBOZXQ6ICIgPDxuZXQtPm5hbWUoKSA8PGVuZGw7Ci0gICAgLy9leGl0KDEpOwotICAgIGlzU05ldCA9IHRydWU7Ci0gIH0KLQotICB1bmlxdWVfcHRyPGZyTmV0PiB1TmV0SW4gPSBtYWtlX3VuaXF1ZTxmck5ldD4obmV0LT5uYW1lKCkpOwotICBhdXRvIG5ldEluID0gdU5ldEluLmdldCgpOwotICBuZXRJbi0+c2V0SWQoKChpbzo6UGFyc2VyKilkYXRhKS0+bnVtTmV0cyk7Ci0gICgoaW86OlBhcnNlciopZGF0YSktPm51bU5ldHMrKzsKLSAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgIGNvdXQgPDwiLSAiIDw8bmV0LT5uYW1lKCk7Ci0gIH0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXQtPm51bUNvbm5lY3Rpb25zKCk7IGkrKykgewotICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgIGlmIChpICUgNCA9PSAwKSB7Ci0gICAgICAgIGNvdXQgPDxlbmRsIDw8IiAiOwotICAgICAgfQotICAgICAgY291dCA8PCIgKCAiIDw8bmV0LT5pbnN0YW5jZShpKSA8PCIgIiA8PG5ldC0+cGluKGkpIDw8IiApIjsKLSAgICB9Ci0gICAgCi0gICAgaWYgKCFzdHJjbXAobmV0LT5pbnN0YW5jZShpKSwgIlBJTiIpKSB7Ci0gICAgICAvLyBJT3MKLSAgICAgIGlmICgoKGlvOjpQYXJzZXIqKWRhdGEpLT50bXBCbG9jay0+bmFtZTJ0ZXJtLmZpbmQobmV0LT5waW4oaSkpID09ICgoaW86OlBhcnNlciopZGF0YSktPnRtcEJsb2NrLT5uYW1lMnRlcm0uZW5kKCkpIHsKLSAgICAgICAgaWYgKFZFUkJPU0UgPiAtMSkgewotICAgICAgICAgIGNvdXQgPDwiRXJyb3I6IHRlcm0gbm90IGZvdW5kISIgPDxlbmRsOwotICAgICAgICB9Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgICB9Ci0gICAgICBhdXRvIHRlcm0gPSAoKGlvOjpQYXJzZXIqKWRhdGEpLT50bXBCbG9jay0+bmFtZTJ0ZXJtW25ldC0+cGluKGkpXTsgLy8gZnJUZXJtKgotICAgICAgdGVybS0+YWRkVG9OZXQobmV0SW4pOwotICAgICAgbmV0SW4tPmFkZFRlcm0odGVybSk7Ci0gICAgICAvLyBhZGQgcGh5c2ljYWwsIGFic29sdXRlIGNvb3JkaW5hdGUgcGlucwotICAgICAgLy9mb3IgKGF1dG8gJnBpbjogdGVybS0+Z2V0UGlucygpKSB7Ci0gICAgICAvLyAgc2hhcmVkX3B0cjxmclBpbj4gbmV3UGluID0gbWFrZV9zaGFyZWQ8ZnJQaW4+KCpwaW4pOwotICAgICAgLy8gIGZvciAoYXV0byAmcGluRmlnOiBuZXdQaW4tPmdldEZpZ3MoKSkgewotICAgICAgLy8gICAgaWYgKHBpbkZpZy0+dHlwZUlkKCkgPT0gZnJjUmVjdCB8fCBwaW5GaWctPnR5cGVJZCgpID09IGZyY1BvbHlnb24pIHsKLSAgICAgIC8vICAgICAgcGluRmlnLT5hZGRUb05ldChuZXRJbik7Ci0gICAgICAvLyAgICB9IGVsc2UgewotICAgICAgLy8gICAgICBjb3V0IDw8IkVycm9yOiBjdXJyZW50bHkgb25seSBzdXBwb3J0IHJlY3QgYW5kIHBvbHlnb24gd2l0aCBuZXQiIDw8ZW5kbDsKLSAgICAgIC8vICAgIH0KLSAgICAgIC8vICB9Ci0gICAgICAvLyAgLy9uZXdQaW4tPmFkZFRvTmV0KG5ldEluKTsgLy8gY3VycmVudGx5IG9ubHkgc3VwcG9ydCByZWN0IGFuZCBwb2x5Z29uCi0gICAgICAvLyAgbmV0SW4tPmFkZFBpbihuZXdQaW4pOwotICAgICAgLy99Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIEluc3RhbmNlcwotICAgICAgaWYgKCFzdHJjbXAobmV0LT5pbnN0YW5jZShpKSwgIioiKSkgewotICAgICAgICBmb3IgKGF1dG8gJmluc3Q6ICgoaW86OlBhcnNlciopZGF0YSktPnRtcEJsb2NrLT5nZXRJbnN0cygpKSB7Ci0gICAgICAgICAgZm9yIChhdXRvICZ1SW5zdFRlcm06IGluc3QtPmdldEluc3RUZXJtcygpKSB7Ci0gICAgICAgICAgICBhdXRvIGluc3RUZXJtID0gdUluc3RUZXJtLmdldCgpOwotICAgICAgICAgICAgYXV0byBuYW1lID0gaW5zdFRlcm0tPmdldFRlcm0oKS0+Z2V0TmFtZSgpOwotICAgICAgICAgICAgaWYgKG5hbWUgPT0gZnJTdHJpbmcobmV0LT5waW4oaSkpKSB7Ci0gICAgICAgICAgICAgIGluc3RUZXJtLT5hZGRUb05ldChuZXRJbik7Ci0gICAgICAgICAgICAgIG5ldEluLT5hZGRJbnN0VGVybShpbnN0VGVybSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCgoaW86OlBhcnNlciopZGF0YSktPnRtcEJsb2NrLT5uYW1lMmluc3QuZmluZChuZXQtPmluc3RhbmNlKGkpKSA9PSAoKGlvOjpQYXJzZXIqKWRhdGEpLT50bXBCbG9jay0+bmFtZTJpbnN0LmVuZCgpKSB7Ci0gICAgICAgICAgaWYgKFZFUkJPU0UgPiAtMSkgewotICAgICAgICAgICAgY291dCA8PCJFcnJvcjogY29tcG9uZW50IG5vdCBmb3VuZCEiIDw8ZW5kbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotICAgICAgICBhdXRvIGluc3QgPSAoKGlvOjpQYXJzZXIqKWRhdGEpLT50bXBCbG9jay0+bmFtZTJpbnN0W25ldC0+aW5zdGFuY2UoaSldOyAvL2ZySW5zdCoKLSAgICAgICAgYm9vbCBmbGFnID0gICBmYWxzZTsKLSAgICAgICAgZm9yIChhdXRvICZ1SW5zdFRlcm06IGluc3QtPmdldEluc3RUZXJtcygpKSB7Ci0gICAgICAgICAgYXV0byBpbnN0VGVybSA9IHVJbnN0VGVybS5nZXQoKTsKLSAgICAgICAgICBhdXRvIG5hbWUgPSBpbnN0VGVybS0+Z2V0VGVybSgpLT5nZXROYW1lKCk7Ci0gICAgICAgICAgaWYgKG5hbWUgPT0gZnJTdHJpbmcobmV0LT5waW4oaSkpKSB7Ci0gICAgICAgICAgICBmbGFnID0gdHJ1ZTsKLSAgICAgICAgICAgIGluc3RUZXJtLT5hZGRUb05ldChuZXRJbik7Ci0gICAgICAgICAgICBuZXRJbi0+YWRkSW5zdFRlcm0oaW5zdFRlcm0pOwotICAgICAgICAgICAgLy8gYWRkIHBoeXNpY2FsLCBhYnNvbHV0ZSBjb29yZGluYXRlIHBpbnMKLSAgICAgICAgICAgIC8vZnJCb3ggbWJveDsKLSAgICAgICAgICAgIC8vaW5zdC0+Z2V0UmVmQmxvY2soKS0+Z2V0Qm91bmRhcnlCQm94KG1ib3gpOwotICAgICAgICAgICAgLy9mclRyYW5zZm9ybSB4Zm9ybTsKLSAgICAgICAgICAgIC8vaW5zdC0+Z2V0VHJhbnNmb3JtKHhmb3JtKTsKLSAgICAgICAgICAgIC8vZnJQb2ludCBzaXplKG1ib3gucmlnaHQoKSwgbWJveC50b3AoKSk7Ci0gICAgICAgICAgICAvL3hmb3JtLnVwZGF0ZVhmb3JtKHNpemUpOwotICAgICAgICAgICAgLy9mb3IgKGF1dG8gJnBpbjogaW5zdFRlcm0tPmdldFRlcm0oKS0+Z2V0UGlucygpKSB7Ci0gICAgICAgICAgICAvLyAgc2hhcmVkX3B0cjxmclBpbj4gbmV3UGluID0gbWFrZV9zaGFyZWQ8ZnJQaW4+KCpwaW4sIHhmb3JtKTsKLSAgICAgICAgICAgIC8vICBmb3IgKGF1dG8gJnBpbkZpZzogbmV3UGluLT5nZXRGaWdzKCkpIHsKLSAgICAgICAgICAgIC8vICAgIGlmIChwaW5GaWctPnR5cGVJZCgpID09IGZyY1JlY3QgfHwgcGluRmlnLT50eXBlSWQoKSA9PSBmcmNQb2x5Z29uKSB7Ci0gICAgICAgICAgICAvLyAgICAgIHBpbkZpZy0+YWRkVG9OZXQobmV0SW4pOwotICAgICAgICAgICAgLy8gICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vICAgICAgY291dCA8PCJFcnJvcjogY3VycmVudGx5IG9ubHkgc3VwcG9ydCByZWN0IGFuZCBwb2x5Z29uIHdpdGggbmV0IiA8PGVuZGw7Ci0gICAgICAgICAgICAvLyAgICB9Ci0gICAgICAgICAgICAvLyAgfQotICAgICAgICAgICAgLy8gIC8vbmV3UGluLT5hZGRUb05ldChuZXRJbik7IC8vIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgcmVjdCBhbmQgcG9seWdvbgotICAgICAgICAgICAgLy8gIG5ldEluLT5hZGRQaW4obmV3UGluKTsKLSAgICAgICAgICAgIC8vfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFmbGFnKSB7Ci0gICAgICAgICAgaWYgKFZFUkJPU0UgPiAtMSkgewotICAgICAgICAgICAgY291dCA8PCJFcnJvcjogY29tcG9uZW50IHBpbiBub3QgZm91bmQhIiA8PGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgLy8gcmVhZCBwcmUtcm91dGUKLSAgLy9jb3V0IDw8ICJOZXQgIiA8PCBuZXQtPm5hbWUoKSA8PCAiIGhhcyAiIDw8IG5ldC0+bnVtV2lyZXMoKSA8PCAiIHdpcmVzXG4iOwotICAvL2NvdXQgPDwgIk5ldCAiIDw8IG5ldC0+bmFtZSgpIDw8ICIgaGFzICIgPDwgbmV0LT5udW1QYXRocygpIDw8ICIgcGF0aHNcbiI7IC8vIG5vIHBhdGhzCi0gIC8vY291dCA8PCAiTmV0ICIgPDwgbmV0LT5uYW1lKCkgPDwgIiBoYXMgIiA8PCBuZXQtPm51bVZwaW5zKCkgPDwgIiB2cGluc1xuIjsgLy8gbm8gdnBpbnMKLSAgCi0gIC8vIGluaXRpYWxpemUKLSAgc3RyaW5nIGxheWVyTmFtZSAgID0gIiI7Ci0gIHN0cmluZyB2aWFOYW1lICAgICA9ICIiOwotICBzdHJpbmcgc2hhcGUgICAgICAgPSAiIjsKLSAgYm9vbCBoYXNCZWdpblBvaW50ID0gZmFsc2U7Ci0gIGJvb2wgaGFzRW5kUG9pbnQgICA9IGZhbHNlOwotICBmckNvb3JkIGJlZ2luWCAgICAgPSAtMTsKLSAgZnJDb29yZCBiZWdpblkgICAgID0gLTE7Ci0gIGZyQ29vcmQgYmVnaW5FeHQgICA9IC0xOwotICBmckNvb3JkIGVuZFggICAgICAgPSAtMTsKLSAgZnJDb29yZCBlbmRZICAgICAgID0gLTE7Ci0gIGZyQ29vcmQgZW5kRXh0ICAgICA9IC0xOwotICBib29sIGhhc1JlY3QgICAgICAgPSBmYWxzZTsKLSAgZnJDb29yZCBsZWZ0ICAgICAgID0gLTE7Ci0gIGZyQ29vcmQgYm90dG9tICAgICA9IC0xOwotICBmckNvb3JkIHJpZ2h0ICAgICAgPSAtMTsKLSAgZnJDb29yZCB0b3AgICAgICAgID0gLTE7Ci0gIGZyQ29vcmQgd2lkdGggICAgICA9IDA7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCluZXQtPm51bVdpcmVzKCk7IGkrKykgewotICAgIGRlZmlXaXJlKiB0bXBXaXJlID0gbmV0LT53aXJlKGkpOwotICAgIC8vY291dCA8PCAiV2lyZSAiIDw8IGkgPDwgIlxuIjsKLSAgICAvL2NvdXQgPDwgIiAgVHlwZTogIiA8PCB0bXBXaXJlLT53aXJlVHlwZSgpIDw8IGVuZGw7Ci0gICAgLy9jb3V0IDw8ICIgIGhhcyAiIDw8IHRtcFdpcmUtPm51bVBhdGhzKCkgPDwgIiBwYXRoc1xuIjsKLSAgICAKLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgY291dCA8PGVuZGwgPDwiICArICIgPDx0bXBXaXJlLT53aXJlVHlwZSgpOwotICAgIH0KLSAgICAvLyBlYWNoIHBhdGggaXMgYSBkZWYgbGluZQotICAgIGZvciAoaW50IGogPSAwOyBqIDwgKGludCl0bXBXaXJlLT5udW1QYXRocygpOyBqKyspIHsKLSAgICAgIGRlZmlQYXRoKiBwYXRoICAgICA9IHRtcFdpcmUtPnBhdGgoaik7Ci0gICAgICBwYXRoLT5pbml0VHJhdmVyc2UoKTsKLSAgICAgIC8vIGluaXRpYWxpemUKLSAgICAgIGxheWVyTmFtZSAgICAgPSAiIjsKLSAgICAgIHZpYU5hbWUgICAgICAgPSAiIjsKLSAgICAgIHNoYXBlICAgICAgICAgPSAiIjsKLSAgICAgIGhhc0JlZ2luUG9pbnQgPSBmYWxzZTsKLSAgICAgIGhhc0VuZFBvaW50ICAgPSBmYWxzZTsKLSAgICAgIGJlZ2luWCAgICAgICAgPSAtMTsKLSAgICAgIGJlZ2luWSAgICAgICAgPSAtMTsKLSAgICAgIGJlZ2luRXh0ICAgICAgPSAtMTsKLSAgICAgIGVuZFggICAgICAgICAgPSAtMTsKLSAgICAgIGVuZFkgICAgICAgICAgPSAtMTsKLSAgICAgIGVuZEV4dCAgICAgICAgPSAtMTsKLSAgICAgIGhhc1JlY3QgICAgICAgPSBmYWxzZTsKLSAgICAgIGxlZnQgICAgICAgICAgPSAtMTsKLSAgICAgIGJvdHRvbSAgICAgICAgPSAtMTsKLSAgICAgIHJpZ2h0ICAgICAgICAgPSAtMTsKLSAgICAgIHRvcCAgICAgICAgICAgPSAtMTsKLSAgICAgIHdpZHRoICAgICAgICAgPSAwOwotICAgICAgLy9jb3V0IDw8InBhdGggaGVyZSIgPDxlbmRsOwotICAgICAgCi0gICAgICBpbnQgcGF0aElkOwotICAgICAgd2hpbGUgKChwYXRoSWQgPSBwYXRoLT5uZXh0KCkpICE9IERFRklQQVRIX0RPTkUpIHsKLSAgICAgICAgLy9jb3V0IDw8ICIgIHBhdGhJZCA9ICIgPDwgcGF0aElkIDw8IGVuZGw7Ci0gICAgICAgIHN3aXRjaChwYXRoSWQpIHsKLSAgICAgICAgICBjYXNlIERFRklQQVRIX0xBWUVSOgotICAgICAgICAgICAgbGF5ZXJOYW1lID0gc3RyaW5nKHBhdGgtPmdldExheWVyKCkpOwotICAgICAgICAgICAgaWYgKCgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPm5hbWUybGF5ZXIuZmluZChsYXllck5hbWUpID09ICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPm5hbWUybGF5ZXIuZW5kKCkpIHsKLSAgICAgICAgICAgICAgaWYgKFZFUkJPU0UgPiAtMSkgewotICAgICAgICAgICAgICAgIGNvdXQgPDwiRXJyb3I6IHVuc3VwcG9ydGVkIGxheWVyOiAiIDw8bGF5ZXJOYW1lIDw8ZW5kbDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAvL2NvbnRpbnVlOwotICAgICAgICAgICAgICBleGl0KDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgICAgICBpZiAoIWopIHsKLSAgICAgICAgICAgICAgICBjb3V0IDw8IiAiIDw8bGF5ZXJOYW1lOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNvdXQgPDxlbmRsIDw8IiAgICBORVcgIiA8PGxheWVyTmFtZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBERUZJUEFUSF9WSUE6Ci0gICAgICAgICAgICB2aWFOYW1lID0gc3RyaW5nKHBhdGgtPmdldFZpYSgpKTsKLSAgICAgICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICAgICAgY291dCA8PCIgIiA8PHZpYU5hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIERFRklQQVRIX1dJRFRIOgotICAgICAgICAgICAgd2lkdGggPSBwYXRoLT5nZXRXaWR0aCgpOwotICAgICAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgICAgICBjb3V0IDw8IiAiIDw8d2lkdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIERFRklQQVRIX1BPSU5UOgotICAgICAgICAgICAgaWYgKCFoYXNCZWdpblBvaW50KSB7Ci0gICAgICAgICAgICAgIHBhdGgtPmdldFBvaW50KCZiZWdpblgsICZiZWdpblkpOwotICAgICAgICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgICAgICAgY291dCA8PCIgKCAiIDw8YmVnaW5YIDw8IiAiIDw8YmVnaW5ZIDw8IiApIjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBoYXNCZWdpblBvaW50ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIHBhdGgtPmdldFBvaW50KCZlbmRYLCAmZW5kWSk7Ci0gICAgICAgICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICAgICAgICBjb3V0IDw8IiAoICIgPDxlbmRYIDw8IiAiIDw8ZW5kWSA8PCIgKSI7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaGFzRW5kUG9pbnQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBERUZJUEFUSF9GTFVTSFBPSU5UOgotICAgICAgICAgICAgaWYgKCFoYXNCZWdpblBvaW50KSB7Ci0gICAgICAgICAgICAgIHBhdGgtPmdldEZsdXNoUG9pbnQoJmJlZ2luWCwgJmJlZ2luWSwgJmJlZ2luRXh0KTsKLSAgICAgICAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgICAgICAgIGNvdXQgPDwiICggIiA8PGJlZ2luWCA8PCIgIiA8PGJlZ2luWSA8PCIgIiA8PGJlZ2luRXh0IDw8IiApIjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBoYXNCZWdpblBvaW50ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIHBhdGgtPmdldEZsdXNoUG9pbnQoJmVuZFgsICZlbmRZLCAmZW5kRXh0KTsKLSAgICAgICAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgICAgICAgIGNvdXQgPDwiICggIiA8PGVuZFggPDwiICIgPDxlbmRZIDw8IiAiIDw8ZW5kRXh0IDw8IiApIjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBoYXNFbmRQb2ludCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIERFRklQQVRIX1NIQVBFOgotICAgICAgICAgICAgc2hhcGUgPSBwYXRoLT5nZXRTaGFwZSgpOwotICAgICAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgICAgICBjb3V0IDw8IiArIFNIQVBFICIgPDxzaGFwZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgREVGSVBBVEhfUkVDVDoKLSAgICAgICAgICAgIHBhdGgtPmdldFZpYVJlY3QoJmxlZnQsICZib3R0b20sICZyaWdodCwgJnRvcCk7Ci0gICAgICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgICAgIGNvdXQgPDwiIFJFQ1QgKCAiIDw8bGVmdCA8PCIgIiA8PGJvdHRvbSA8PCIgIiA8PHJpZ2h0IDw8IiAiIDw8dG9wIDw8IiApIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhc1JlY3QgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBERUZJUEFUSF9WSVJUVUFMUE9JTlQ6Ci0gICAgICAgICAgICBpZiAoIWhhc0JlZ2luUG9pbnQpIHsKLSAgICAgICAgICAgICAgcGF0aC0+Z2V0VmlydHVhbFBvaW50KCZiZWdpblgsICZiZWdpblkpOwotICAgICAgICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgICAgICAgY291dCA8PCIgKCAiIDw8YmVnaW5YIDw8IiAiIDw8YmVnaW5ZIDw8IiApIjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBoYXNCZWdpblBvaW50ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIHBhdGgtPmdldFZpcnR1YWxQb2ludCgmZW5kWCwgJmVuZFkpOwotICAgICAgICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgICAgICAgY291dCA8PCIgKCAiIDw8ZW5kWCA8PCIgIiA8PGVuZFkgPDwiICkiOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGhhc0VuZFBvaW50ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQgOiBjb3V0IDw8IiBuZXQgIiA8PG5ldC0+bmFtZSgpIDw8IiB1bmtub3duIHBhdGhJZCAiIDw8cGF0aElkIDw8ZW5kbDsgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotCi0gICAgICBhdXRvIGxheWVyTnVtID0gKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+bmFtZTJsYXllcltsYXllck5hbWVdLT5nZXRMYXllck51bSgpOwotICAgICAgLy8gYWRkIHJlY3QKLSAgICAgIGlmIChoYXNSZWN0KSB7Ci0gICAgICAgIC8vc2hhcmVkX3B0cjxmckJsb2NrT2JqZWN0PiByZWN0ID0gbWFrZV9zaGFyZWQ8ZnJSZWN0PigpOyAvLyBpbmNvbXBsZXRlCi0gICAgICAgIC8vIGVuZCBzdGVpbmVyID0gZnJSZWN0Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICAvLyBhZGQgd2lyZSwgY3VycmVudGx5IGRvIG5vdCBjb25zaWRlciBleHRlbnNpb24KLSAgICAgIGlmIChoYXNFbmRQb2ludCkgewotICAgICAgICAvLyByb3V0ZQotICAgICAgICBhdXRvIHRtcFAgPSBtYWtlX3VuaXF1ZTxmclBhdGhTZWc+KCk7Ci0KLSAgICAgICAgLy8gYXZvaWQgYmVnaW4gPiBlbmQgY2FzZQotICAgICAgICBpZiAoYmVnaW5YID4gZW5kWCB8fCBiZWdpblkgPiBlbmRZKSB7Ci0gICAgICAgICAgdG1wUC0+c2V0UG9pbnRzKGZyUG9pbnQoZW5kWCwgZW5kWSksIGZyUG9pbnQoYmVnaW5YLCBiZWdpblkpKTsKLSAgICAgICAgICBzd2FwKGJlZ2luRXh0LCBlbmRFeHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHRtcFAtPnNldFBvaW50cyhmclBvaW50KGJlZ2luWCwgYmVnaW5ZKSwgZnJQb2ludChlbmRYLCBlbmRZKSk7Ci0gICAgICAgIH0KLSAgICAgICAgdG1wUC0+YWRkVG9OZXQobmV0SW4pOwotICAgICAgICB0bXBQLT5zZXRMYXllck51bShsYXllck51bSk7Ci0KLSAgICAgICAgd2lkdGggPSAod2lkdGgpID8gd2lkdGggOiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5uYW1lMmxheWVyW2xheWVyTmFtZV0tPmdldFdpZHRoKCk7Ci0gICAgICAgIGF1dG8gZGVmYXVsdEJlZ2luRXh0ID0gd2lkdGggLyAyOwotICAgICAgICBhdXRvIGRlZmF1bHRFbmRFeHQgICA9IHdpZHRoIC8gMjsKLQotICAgICAgICBmckVuZFN0eWxlRW51bSB0bXBCZWdpbkVudW07Ci0gICAgICAgIGlmIChiZWdpbkV4dCA9PSAtMSkgewotICAgICAgICAgIHRtcEJlZ2luRW51bSA9IGZyY0V4dGVuZEVuZFN0eWxlOwotICAgICAgICB9IGVsc2UgaWYgKGJlZ2luRXh0ID09IDApIHsKLSAgICAgICAgICB0bXBCZWdpbkVudW0gPSBmcmNUcnVuY2F0ZUVuZFN0eWxlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHRtcEJlZ2luRW51bSA9IGZyY1ZhcmlhYmxlRW5kU3R5bGU7Ci0gICAgICAgIH0KLSAgICAgICAgZnJFbmRTdHlsZSB0bXBCZWdpblN0eWxlKHRtcEJlZ2luRW51bSk7Ci0KLSAgICAgICAgZnJFbmRTdHlsZUVudW0gdG1wRW5kRW51bTsKLSAgICAgICAgaWYgKGVuZEV4dCA9PSAtMSkgewotICAgICAgICAgIHRtcEVuZEVudW0gPSBmcmNFeHRlbmRFbmRTdHlsZTsKLSAgICAgICAgfSBlbHNlIGlmIChlbmRFeHQgPT0gMCkgewotICAgICAgICAgIHRtcEVuZEVudW0gPSBmcmNUcnVuY2F0ZUVuZFN0eWxlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHRtcEVuZEVudW0gPSBmcmNWYXJpYWJsZUVuZFN0eWxlOwotICAgICAgICB9Ci0gICAgICAgIGZyRW5kU3R5bGUgdG1wRW5kU3R5bGUodG1wRW5kRW51bSk7Ci0KLSAgICAgICAgZnJTZWdTdHlsZSB0bXBTZWdTdHlsZTsKLSAgICAgICAgdG1wU2VnU3R5bGUuc2V0V2lkdGgod2lkdGgpOwotICAgICAgICB0bXBTZWdTdHlsZS5zZXRCZWdpblN0eWxlKHRtcEJlZ2luU3R5bGUsIHRtcEJlZ2luRW51bSA9PSBmcmNFeHRlbmRFbmRTdHlsZSA/IGRlZmF1bHRCZWdpbkV4dCA6IGJlZ2luRXh0KTsKLSAgICAgICAgdG1wU2VnU3R5bGUuc2V0RW5kU3R5bGUodG1wRW5kU3R5bGUsIHRtcEVuZEVudW0gPT0gZnJjRXh0ZW5kRW5kU3R5bGUgPyBkZWZhdWx0RW5kRXh0IDogZW5kRXh0KTsKLSAgICAgICAgdG1wUC0+c2V0U3R5bGUodG1wU2VnU3R5bGUpOwotICAgICAgICB1bmlxdWVfcHRyPGZyU2hhcGU+IHRtcFMoc3RkOjptb3ZlKHRtcFApKTsKLSAgICAgICAgbmV0SW4tPmFkZFNoYXBlKHRtcFMpOwotICAgICAgfQotCi0gICAgICAvLyBhZGQgdmlhCi0gICAgICBpZiAodmlhTmFtZSAhPSAiIikgewotICAgICAgICBpZiAoKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+bmFtZTJ2aWEuZmluZCh2aWFOYW1lKSA9PSAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5uYW1lMnZpYS5lbmQoKSkgewotICAgICAgICAgIGlmIChWRVJCT1NFID4gLTEpIHsKLSAgICAgICAgICAgIGNvdXQgPDwiRXJyb3I6IHVuc3VwcG9ydGVkIHZpYTogIiA8PHZpYU5hbWUgPDxlbmRsOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmclBvaW50IHA7Ci0gICAgICAgICAgaWYgKGhhc0VuZFBvaW50KSB7Ci0gICAgICAgICAgICBwLnNldChlbmRYLCBlbmRZKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcC5zZXQoYmVnaW5YLCBiZWdpblkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBhdXRvIHZpYURlZiA9ICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPm5hbWUydmlhW3ZpYU5hbWVdOwotICAgICAgICAgIGF1dG8gdG1wUCA9IG1ha2VfdW5pcXVlPGZyVmlhPih2aWFEZWYpOwotICAgICAgICAgIHRtcFAtPnNldE9yaWdpbihwKTsKLSAgICAgICAgICB0bXBQLT5hZGRUb05ldChuZXRJbik7Ci0gICAgICAgICAgbmV0SW4tPmFkZFZpYSh0bXBQKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gLy8gZW5kIHBhdGgKLSAgfSAvLyBlbmQgd2lyZQotIAotICBmck5ldEVudW0gbmV0VHlwZSA9IGZyTmV0RW51bTo6ZnJjTm9ybWFsTmV0OwotICBpZiAobmV0LT5oYXNVc2UoKSkgewotICAgIHN0cmluZyBzdHIobmV0LT51c2UoKSk7Ci0gICAgaWYgKHN0ciA9PSAiU0lHTkFMIikgewotICAgICAgOwotICAgIH0gZWxzZSBpZiAoc3RyID09ICJDTE9DSyIpIHsKLSAgICAgIG5ldFR5cGUgPSBmck5ldEVudW06OmZyY0Nsb2NrTmV0OwotICAgIH0gZWxzZSBpZiAoc3RyID09ICJQT1dFUiIpIHsKLSAgICAgIG5ldFR5cGUgPSBmck5ldEVudW06OmZyY1Bvd2VyTmV0OwotICAgIH0gZWxzZSBpZiAoc3RyID09ICJHUk9VTkQiKSB7Ci0gICAgICBuZXRUeXBlID0gZnJOZXRFbnVtOjpmcmNHcm91bmROZXQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvdXQgPDwiRXJyb3I6IHVuc3VwcG9ydGVkIE5FVCBVU0UgaW4gZGVmIiA8PGVuZGw7Ci0gICAgICBleGl0KDEpOwotICAgIH0KLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBjb3V0IDw8IiArIFVTRSAiIDw8c3RyIDw8ZW5kbDsKLSAgICB9Ci0gIH0KLSAgbmV0SW4tPnNldFR5cGUobmV0VHlwZSk7Ci0KLSAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgIGNvdXQgPDxlbmRsIDw8IiA7IiA8PGVuZGw7Ci0gIH0KLQotICAvL2lmIChlbmFibGVPdXRwdXQpIHsKLSAgLy8gIGNvdXQgPDxuZXQtPm5hbWUoKSA8PGVuZGw7Ci0gIC8vLy9jb3V0IDw8Im51bVJlY3QgIiA8PG5ldC0+bnVtUmVjdGFuZ2xlcygpIDw8ZW5kbDsgLy8gcmVjdCBhbHdheXMgMAotICAvL30KLQotCi0gIGlmIChpc1NOZXQpIHsKLSAgICAoKGlvOjpQYXJzZXIqKWRhdGEpLT50bXBCbG9jay0+YWRkU05ldCh1TmV0SW4pOyAKLSAgICBpZiAoKChpbzo6UGFyc2VyKilkYXRhKS0+dG1wQmxvY2stPnNuZXRzLnNpemUoKSA8IDEwMDAwMCkgewotICAgICAgaWYgKCgoaW86OlBhcnNlciopZGF0YSktPnRtcEJsb2NrLT5zbmV0cy5zaXplKCkgJSAxMDAwMCA9PSAwKSB7Ci0gICAgICAgIGNvdXQgPDwiZGVmSW4gcmVhZCAiIDw8KChpbzo6UGFyc2VyKilkYXRhKS0+dG1wQmxvY2stPnNuZXRzLnNpemUoKSA8PCIgc25ldHMiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKCgoaW86OlBhcnNlciopZGF0YSktPnRtcEJsb2NrLT5zbmV0cy5zaXplKCkgJSAxMDAwMCA9PSAwKSB7Ci0gICAgICAgIGNvdXQgPDwiZGVmSW4gcmVhZCAiIDw8KChpbzo6UGFyc2VyKilkYXRhKS0+dG1wQmxvY2stPnNuZXRzLnNpemUoKSA8PCIgc25ldHMiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgKChpbzo6UGFyc2VyKilkYXRhKS0+dG1wQmxvY2stPmFkZE5ldCh1TmV0SW4pOyAKLSAgICBpZiAoKChpbzo6UGFyc2VyKilkYXRhKS0+dG1wQmxvY2stPm5ldHMuc2l6ZSgpIDwgMTAwMDAwKSB7Ci0gICAgICBpZiAoKChpbzo6UGFyc2VyKilkYXRhKS0+dG1wQmxvY2stPm5ldHMuc2l6ZSgpICUgMTAwMDAgPT0gMCkgewotICAgICAgICBjb3V0IDw8ImRlZkluIHJlYWQgIiA8PCgoaW86OlBhcnNlciopZGF0YSktPnRtcEJsb2NrLT5uZXRzLnNpemUoKSA8PCIgbmV0cyIgPDxlbmRsOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoKChpbzo6UGFyc2VyKilkYXRhKS0+dG1wQmxvY2stPm5ldHMuc2l6ZSgpICUgMTAwMDAwID09IDApIHsKLSAgICAgICAgY291dCA8PCJkZWZJbiByZWFkICIgPDwoKGlvOjpQYXJzZXIqKWRhdGEpLT50bXBCbG9jay0+bmV0cy5zaXplKCkgPDwiIG5ldHMiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotaW50IGlvOjpQYXJzZXI6OmdldERlZlRlcm1pbmFscyhkZWZyQ2FsbGJhY2tUeXBlX2UgdHlwZSwgZGVmaVBpbiogdGVybSwgZGVmaVVzZXJEYXRhIGRhdGEpIHsKLSAgYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIGlmICh0eXBlICE9IGRlZnJQaW5DYmtUeXBlKSB7Ci0gICAgY291dCA8PCJUeXBlIGlzIG5vdCBkZWZyUGluQ2JrVHlwZSEiIDw8ZW5kbDsKLSAgICBleGl0KDEpOwotICB9Ci0KLSAgZnJUZXJtRW51bSB0ZXJtVHlwZSA9IGZyVGVybUVudW06OmZyY05vcm1hbFRlcm07Ci0KLSAgaWYgKHRlcm0tPmhhc1VzZSgpKSB7Ci0gICAgc3RyaW5nIHN0cih0ZXJtLT51c2UoKSk7Ci0gICAgaWYgKHN0ciA9PSAiU0lHTkFMIikgewotICAgICAgOwotICAgIH0gZWxzZSBpZiAoc3RyID09ICJDTE9DSyIpIHsKLSAgICAgIHRlcm1UeXBlID0gZnJUZXJtRW51bTo6ZnJjQ2xvY2tUZXJtOwotICAgIH0gZWxzZSBpZiAoc3RyID09ICJQT1dFUiIpIHsKLSAgICAgIHRlcm1UeXBlID0gZnJUZXJtRW51bTo6ZnJjUG93ZXJUZXJtOwotICAgIH0gZWxzZSBpZiAoc3RyID09ICJHUk9VTkQiKSB7Ci0gICAgICB0ZXJtVHlwZSA9IGZyVGVybUVudW06OmZyY0dyb3VuZFRlcm07Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvdXQgPDwiRXJyb3I6IHVuc3VwcG9ydGVkIFBJTiBVU0UgaW4gbGVmIiA8PGVuZGw7Ci0gICAgICBleGl0KDEpOwotICAgIH0KLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBjb3V0IDw8IiAgICBVU0UgIiA8PHN0ciA8PCIgOyIgPDxlbmRsOwotICAgIH0KLSAgfQotCi0gIGlmICh0ZXJtLT5oYXNQb3J0KCkpIHsKLSAgICBjb3V0IDw8IkVycm9yOiBtdWx0aXBsZSBwaW4gcG9ydHMgZXhpc3RpbmcgaW4gREVGIiA8PGVuZGw7Ci0gICAgZXhpdCgxKTsKLSAgfSBlbHNlIHsKLSAgICAvL2NvdXQgPDwiICBwaW5OYW1lICA9ICIgPDx0ZXJtLT5waW5OYW1lKCkgPDxlbmRsOwotICAgIC8vY291dCA8PCIgIGhhc0xheWVyID0gIiA8PHRlcm0tPmhhc0xheWVyKCkgPDxlbmRsOwotICAgIC8vY291dCA8PCIgIG51bUxheWVyID0gIiA8PHRlcm0tPm51bUxheWVyKCkgPDxlbmRsOwotICAgIC8vY291dCA8PCIgIG51bVBvbHlzID0gIiA8PHRlcm0tPm51bVBvbHlnb25zKCkgPDxlbmRsOwotICAgIC8vY291dCA8PCIgIG51bVBvcnRzID0gIiA8PHRlcm0tPm51bVBvcnRzKCkgPDxlbmRsOwotCi0gICAgLy8gdGVybQotICAgIGF1dG8gdVRlcm1JbiA9IG1ha2VfdW5pcXVlPGZyVGVybT4odGVybS0+cGluTmFtZSgpKTsKLSAgICBhdXRvIHRlcm1JbiA9IHVUZXJtSW4uZ2V0KCk7Ci0gICAgdGVybUluLT5zZXRJZCgoKGlvOjpQYXJzZXIqKWRhdGEpLT5udW1UZXJtcyk7Ci0gICAgKChpbzo6UGFyc2VyKilkYXRhKS0+bnVtVGVybXMrKzsKLSAgICB0ZXJtSW4tPnNldFR5cGUodGVybVR5cGUpOwotICAgIC8vIHRlcm0gc2hvdWxkIGFkZCBwaW4KLSAgICAvLyBwaW4KLSAgICBhdXRvIHBpbkluICA9IG1ha2VfdW5pcXVlPGZyUGluPigpOwotICAgIHBpbkluLT5zZXRJZCgwKTsKLSAgICAvL3BpbkluLT5zZXRUZXJtKHRlcm1Jbik7Ci0gICAgLy8gcGluIHNob3VsZCBhZGQgcGluRmlncwotICAgIC8vIHRlcm0KLSAgICAvL2ZyT3JpZW50RW51bSBvcmllbnQgPSBmck9yaWVudEVudW0odGVybS0+b3JpZW50KCkpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVybS0+bnVtTGF5ZXIoKTsgKytpKSB7Ci0gICAgICAvL2NvdXQgPDwiICBsYXllck5hbWU9ICIgPDx0ZXJtLT5sYXllcihpKSA8PGVuZGw7Ci0gICAgICBzdHJpbmcgbGF5ZXIgPSB0ZXJtLT5sYXllcihpKTsKLSAgICAgIGlmICgoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5uYW1lMmxheWVyLmZpbmQobGF5ZXIpID09ICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPm5hbWUybGF5ZXIuZW5kKCkpIHsKLSAgICAgICAgaWYgKFZFUkJPU0UgPiAtMSkgewotICAgICAgICAgIGNvdXQgPDwiRXJyb3I6IHVuc3VwcG9ydGVkIGxheWVyOiAiIDw8bGF5ZXIgPDxlbmRsOwotICAgICAgICB9Ci0gICAgICAgIC8vY29udGludWU7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgICB9Ci0KLSAgICAgIGZyTGF5ZXJOdW0gbGF5ZXJOdW0gPSAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5uYW1lMmxheWVyW2xheWVyXS0+Z2V0TGF5ZXJOdW0oKTsKLSAgICAgIGZyQ29vcmQgeGwgPSAwOwotICAgICAgZnJDb29yZCB5bCA9IDA7Ci0gICAgICBmckNvb3JkIHhoID0gMDsKLSAgICAgIGZyQ29vcmQgeWggPSAwOwotICAgICAgdGVybS0+Ym91bmRzKGksICZ4bCwgJnlsLCAmeGgsICZ5aCk7Ci0gICAgICAvLyBwaW5GaWcKLSAgICAgIHVuaXF1ZV9wdHI8ZnJSZWN0PiBwaW5GaWcgPSBtYWtlX3VuaXF1ZTxmclJlY3Q+KCk7Ci0gICAgICBwaW5GaWctPnNldEJCb3goZnJCb3goeGwsIHlsLCB4aCwgeWgpKTsKLSAgICAgIHBpbkZpZy0+YWRkVG9QaW4ocGluSW4uZ2V0KCkpOwotICAgICAgcGluRmlnLT5zZXRMYXllck51bShsYXllck51bSk7Ci0gICAgICBwaW5GaWctPm1vdmUoZnJUcmFuc2Zvcm0odGVybS0+cGxhY2VtZW50WCgpLCB0ZXJtLT5wbGFjZW1lbnRZKCksIGZyT3JpZW50RW51bSh0ZXJtLT5vcmllbnQoKSkpKTsKLSAgICAgIC8vY291dCA8PCJtb3ZlIiA8PGVuZGw7Ci0gICAgICBmckJveCB0cmFuc2Zvcm1lZEJCb3g7Ci0gICAgICBwaW5GaWctPmdldEJCb3godHJhbnNmb3JtZWRCQm94KTsKLSAgICAgIC8vIHBpbkZpZyBjb21wbGV0ZWQKLSAgICAgIC8vIHBpbgotICAgICAgdW5pcXVlX3B0cjxmclBpbkZpZz4gdXB0cihzdGQ6Om1vdmUocGluRmlnKSk7Ci0gICAgICBwaW5Jbi0+YWRkUGluRmlnKHVwdHIpOwotICAgICAgLy8gUmVjdGFuZ2xlIHBpbkZpZ1JlY3QoeGwsIHlsLCB4aCwgeWgpOwotICAgICAgLy8gc3RkOjpjb3V0IDw8ICJSZWN0IiA8PCB0cmFuc2Zvcm1lZEJCb3gubGVmdCgpIDw8ICIsICIgPDwgdHJhbnNmb3JtZWRCQm94LmJvdHRvbSgpIDw8ICIsICIgPDwgdHJhbnNmb3JtZWRCQm94LnJpZ2h0KCkgPDwgIiwgIiA8PCB0cmFuc2Zvcm1lZEJCb3gudG9wKCkgPDwgIlxuIjsKLSAgICAgIFJlY3RhbmdsZSBwaW5GaWdSZWN0KHRyYW5zZm9ybWVkQkJveC5sZWZ0KCksIHRyYW5zZm9ybWVkQkJveC5ib3R0b20oKSwgdHJhbnNmb3JtZWRCQm94LnJpZ2h0KCksIHRyYW5zZm9ybWVkQkJveC50b3AoKSk7Ci0gICAgICBwaW5Jbi0+YWRkTGF5ZXJTaGFwZShsYXllck51bSwgcGluRmlnUmVjdCk7Ci0gICAgICAvLyBwaW4gY29tcGxldGVkCi0gICAgfQotICAgIC8vIHBvbHlnb24KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlcm0tPm51bVBvbHlnb25zKCk7ICsraSkgewotICAgICAgLy9jb3V0IDw8IiAgcG9seU5hbWU9ICIgPDx0ZXJtLT5wb2x5Z29uTmFtZShpKSA8PGVuZGw7Ci0gICAgICBzdHJpbmcgbGF5ZXIgPSB0ZXJtLT5wb2x5Z29uTmFtZShpKTsKLSAgICAgIGlmICgoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5uYW1lMmxheWVyLmZpbmQobGF5ZXIpID09ICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPm5hbWUybGF5ZXIuZW5kKCkpIHsKLSAgICAgICAgaWYgKFZFUkJPU0UgPiAtMSkgewotICAgICAgICAgIGNvdXQgPDwiRXJyb3I6IHVuc3VwcG9ydGVkIGxheWVyOiAiIDw8bGF5ZXIgPDxlbmRsOwotICAgICAgICB9Ci0gICAgICAgIC8vY29udGludWU7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgICB9Ci0KLSAgICAgIGZyTGF5ZXJOdW0gbGF5ZXJOdW0gPSAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5uYW1lMmxheWVyW2xheWVyXS0+Z2V0TGF5ZXJOdW0oKTsKLSAgICAgIGF1dG8gcG9seVBvaW50cyA9IHRlcm0tPmdldFBvbHlnb24oaSk7Ci0gICAgICBmckNvbGxlY3Rpb248ZnJQb2ludD4gdG1wUG9pbnRzOwotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwb2x5UG9pbnRzLm51bVBvaW50czsgaisrKSB7Ci0gICAgICAgIHRtcFBvaW50cy5wdXNoX2JhY2soZnJQb2ludCgocG9seVBvaW50cy54KVtqXSwgKHBvbHlQb2ludHMueSlbal0pKTsKLSAgICAgIH0KLQotICAgICAgLy8gcGluRmlnCi0gICAgICB1bmlxdWVfcHRyPGZyUG9seWdvbj4gcGluRmlnID0gbWFrZV91bmlxdWU8ZnJQb2x5Z29uPigpOwotICAgICAgcGluRmlnLT5zZXRQb2ludHModG1wUG9pbnRzKTsKLSAgICAgIHBpbkZpZy0+YWRkVG9QaW4ocGluSW4uZ2V0KCkpOwotICAgICAgcGluRmlnLT5zZXRMYXllck51bShsYXllck51bSk7Ci0gICAgICBwaW5GaWctPm1vdmUoZnJUcmFuc2Zvcm0odGVybS0+cGxhY2VtZW50WCgpLCB0ZXJtLT5wbGFjZW1lbnRZKCksIGZyT3JpZW50RW51bSh0ZXJtLT5vcmllbnQoKSkpKTsKLSAgICAgIC8vIHBpbkZpZyBjb21wbGV0ZWQKLSAgICAgIC8vIHBpbgotICAgICAgdW5pcXVlX3B0cjxmclBpbkZpZz4gdXB0cihzdGQ6Om1vdmUocGluRmlnKSk7Ci0gICAgICBwaW5Jbi0+YWRkUGluRmlnKHVwdHIpOwotICAgICAgUG9seWdvbiBwaW5GaWdQb2x5OwotICAgICAgZnJWZWN0b3I8UG9pbnQ+IGJvb3N0UG9seVBvaW50czsKLSAgICAgIGZyVHJhbnNmb3JtIHRtcFhmb3JtKHRlcm0tPnBsYWNlbWVudFgoKSwgdGVybS0+cGxhY2VtZW50WSgpLCBmck9yaWVudEVudW0odGVybS0+b3JpZW50KCkpKTsKLSAgICAgIGZvciAoYXV0byAmcHQ6IHRtcFBvaW50cykgewotICAgICAgICBwdC50cmFuc2Zvcm0odG1wWGZvcm0pOwotICAgICAgICBib29zdFBvbHlQb2ludHMucHVzaF9iYWNrKFBvaW50KHB0LngoKSwgcHQueSgpKSk7Ci0gICAgICAgIC8vIHN0ZDo6Y291dCA8PCBwdC54KCkgPDwgIiAiIDw8IHB0LnkoKSA8PCAiXG4iOwotICAgICAgfQotICAgICAgYm9vc3Q6OnBvbHlnb246OnNldF9wb2ludHMocGluRmlnUG9seSwgYm9vc3RQb2x5UG9pbnRzLmJlZ2luKCksIGJvb3N0UG9seVBvaW50cy5lbmQoKSk7Ci0gICAgICBwaW5Jbi0+YWRkTGF5ZXJTaGFwZShsYXllck51bSwgcGluRmlnUG9seSk7Ci0gICAgICAvLyBwaW4gY29tcGxldGVkCi0gICAgfQotICAgIHRlcm1Jbi0+YWRkUGluKHBpbkluKTsKLSAgICAvL2NvdXQgPDwiICBwbGFjZVhZICA9ICgiIDw8dGVybS0+cGxhY2VtZW50WCgpIDw8IiwiIDw8dGVybS0+cGxhY2VtZW50WSgpIDw8IikiIDw8ZW5kbDsKLSAgICAoKGlvOjpQYXJzZXIqKWRhdGEpLT50bXBCbG9jay0+YWRkVGVybSh1VGVybUluKTsKLSAgfQotCi0gIGlmICgoKGlvOjpQYXJzZXIqKWRhdGEpLT50bXBCbG9jay0+dGVybXMuc2l6ZSgpICUgMTAwMCA9PSAwKSB7Ci0gICAgY291dCA8PCJkZWZJbiByZWFkICIgPDwoKGlvOjpQYXJzZXIqKWRhdGEpLT50bXBCbG9jay0+dGVybXMuc2l6ZSgpIDw8IiBwaW5zIiA8PGVuZGw7Ci0gIH0KLQotICByZXR1cm4gMDsKLQotfQotCi1pbnQgaW86OlBhcnNlcjo6Z2V0RGVmVHJhY2tzKGRlZnJDYWxsYmFja1R5cGVfZSB0eXBlLCBkZWZpVHJhY2sqIHRyYWNrLCBkZWZpVXNlckRhdGEgZGF0YSkgewotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgaWYgKCh0eXBlICE9IGRlZnJUcmFja0Nia1R5cGUpKSB7Ci0gICAgY291dCA8PCJUeXBlIGlzIG5vdCBkZWZyVHJhY2tDYmtUeXBlISIgPDxlbmRsOwotICAgIGV4aXQoMSk7Ci0gIH0KLQotICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgY291dCA8PCJUUkFDS1MgIiA8PHRyYWNrLT5tYWNybygpIDw8IiAiIDw8dHJhY2stPngoKSAKLSAgICAgICAgIDw8IiBETyAiIDw8dHJhY2stPnhOdW0oKSA8PCIgU1RFUCAiIDw8dHJhY2stPnhTdGVwKCkgCi0gICAgICAgICA8PCIgTEFZRVIgIiA8PHRyYWNrLT5sYXllcigwKSA8PGVuZGw7Ci0gIH0KLQotICB1bmlxdWVfcHRyPGZyVHJhY2tQYXR0ZXJuPiB0bXBUcmFja1BhdHRlcm4gPSBtYWtlX3VuaXF1ZTxmclRyYWNrUGF0dGVybj4oKTsKLSAgaWYgKCgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPm5hbWUybGF5ZXIuZmluZCh0cmFjay0+bGF5ZXIoMCkpID09ICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPm5hbWUybGF5ZXIuZW5kKCkpIHsKLSAgICBjb3V0IDw8IkVycm9yOiBjYW5ub3QgZmluZCBsYXllcjogIiA8PHRyYWNrLT5sYXllcigwKSA8PGVuZGw7Ci0gICAgZXhpdCgyKTsKLSAgfQotICB0bXBUcmFja1BhdHRlcm4tPnNldExheWVyTnVtKCgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPm5hbWUybGF5ZXIuYXQodHJhY2stPmxheWVyKDApKS0+Z2V0TGF5ZXJOdW0oKSk7Ci0gIGlmICghc3RyY21wKHRyYWNrLT5tYWNybygpLCAiWCIpKSB7Ci0gICAgdG1wVHJhY2tQYXR0ZXJuLT5zZXRIb3Jpem9udGFsKHRydWUpOwotICB9IGVsc2UgaWYgKCFzdHJjbXAodHJhY2stPm1hY3JvKCksICJZIikpIHsKLSAgICB0bXBUcmFja1BhdHRlcm4tPnNldEhvcml6b250YWwoZmFsc2UpOwotICB9IGVsc2UgewotICAgIGNvdXQgPDwiRXJyb3I6IHVuc3VwcG9ydGVyZCBkaXJlY3Rpb246ICIgPDx0cmFjay0+bWFjcm8oKSA8PGVuZGw7Ci0gICAgZXhpdCgyKTsKLSAgfQotICB0bXBUcmFja1BhdHRlcm4tPnNldFN0YXJ0Q29vcmQodHJhY2stPngoKSk7Ci0gIHRtcFRyYWNrUGF0dGVybi0+c2V0TnVtVHJhY2tzKHRyYWNrLT54TnVtKCkpOwotICB0bXBUcmFja1BhdHRlcm4tPnNldFRyYWNrU3BhY2luZyh0cmFjay0+eFN0ZXAoKSk7Ci0gICgoaW86OlBhcnNlciopZGF0YSktPnRtcEJsb2NrLT50cmFja1BhdHRlcm5zLmF0KHRtcFRyYWNrUGF0dGVybi0+Z2V0TGF5ZXJOdW0oKSkucHVzaF9iYWNrKHN0ZDo6bW92ZSh0bXBUcmFja1BhdHRlcm4pKTsKLSAgLy9jb3V0IDw8ImhlcmUiIDw8ZW5kbDsKLQotICByZXR1cm4gMDsKLX0KLQotaW50IGlvOjpQYXJzZXI6OmdldERlZlVuaXRzKGRlZnJDYWxsYmFja1R5cGVfZSB0eXBlLCBkb3VibGUgbnVtYmVyLCBkZWZpVXNlckRhdGEgZGF0YSkgewotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLSAgKChpbzo6UGFyc2VyKilkYXRhKS0+dG1wQmxvY2stPnNldERCVVBlclVVKHN0YXRpY19jYXN0PGZyVUludDQ+KG51bWJlcikpOwotICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgY291dCA8PCJVTklUUyBESVNUQU5DRSBNSUNST05TICIgPDwoKGlvOjpQYXJzZXIqKWRhdGEpLT50bXBCbG9jay0+Z2V0REJVUGVyVVUoKSA8PCIgOyIgPDxlbmRsOwotICB9Ci0gIHJldHVybiAwOwotfQotCi12b2lkIGlvOjpQYXJzZXI6OnJlYWREZWYoKSB7Ci0gIEZJTEUqIGY7Ci0gIGludCByZXM7Ci0gIAotICBkZWZySW5pdCgpOwotICBkZWZyUmVzZXQoKTsKLQotICBkZWZySW5pdFNlc3Npb24oMSk7Ci0gIAotICBkZWZyU2V0VXNlckRhdGEoKGRlZmlVc2VyRGF0YSl0aGlzKTsKLQotICBkZWZyU2V0RGVzaWduQ2JrKGdldERlZlN0cmluZyk7Ci0gIGRlZnJTZXREZXNpZ25FbmRDYmsoZ2V0RGVmVm9pZCk7Ci0gIGRlZnJTZXREaWVBcmVhQ2JrKGdldERlZkRpZUFyZWEpOwotICBkZWZyU2V0VW5pdHNDYmsoZ2V0RGVmVW5pdHMpOwotICBkZWZyU2V0VHJhY2tDYmsoZ2V0RGVmVHJhY2tzKTsKLSAgZGVmclNldENvbXBvbmVudENiayhnZXREZWZDb21wb25lbnRzKTsKLSAgZGVmclNldFBpbkNiayhnZXREZWZUZXJtaW5hbHMpOwotICAvL2RlZnJTZXRTTmV0U3RhcnRDYmsoZ2V0RGVmSW50ZWdlcik7Ci0gIGRlZnJTZXRTTmV0Q2JrKGdldERlZk5ldHMpOwotICBkZWZyU2V0TmV0Q2JrKGdldERlZk5ldHMpOwotICBkZWZyU2V0QWRkUGF0aFRvTmV0KCk7Ci0gIGRlZnJTZXRWaWFDYmsoZ2V0RGVmVmlhcyk7Ci0KLSAgLy8gZGVidWcKLSAgLy8gZXhpdCgxKTsKLQotICBpZiAoKGYgPSBmb3BlbihERUZfRklMRS5jX3N0cigpLCJyIikpID09IDApIHsKLSAgICBjb3V0IDw8IkNvdWxkbid0IG9wZW4gZGVmIGZpbGUiIDw8ZW5kbDsKLSAgICBleGl0KDIpOwotICB9Ci0KLSAgcmVzID0gZGVmclJlYWQoZiwgREVGX0ZJTEUuY19zdHIoKSwgKGRlZmlVc2VyRGF0YSl0aGlzLCAxKTsKLSAgaWYgKHJlcyAhPSAwKSB7Ci0gICAgY291dCA8PCJERUYgcGFyc2VyIHJldHVybnMgYW4gZXJyb3IhIiA8PGVuZGw7Ci0gICAgZXhpdCgyKTsKLSAgfQotICBmY2xvc2UoZik7Ci0KLSAgLy9udW1QaW5zID0gcmVhZFBpbkNudDsKLQotICBkZWZyQ2xlYXIoKTsKLX0KLQotaW50IGlvOjpQYXJzZXI6OmdldExlZjU4U3BhY2luZ1RhYmxlX3BhcmFsbGVsUnVuTGVuZ3RoKHZvaWQgKmRhdGEsIGZyTGF5ZXIqIHRtcExheWVyLCBjb25zdCBzdHJpbmcgJnNJbikgewotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLSAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgIGNvdXQgPDxlbmRsIDw8IiAgU1BBQ0lOR1RBQkxFIiA8PGVuZGw7Ci0gICAgY291dCA8PCIgIFBBUkFMTEVMUlVOTEVOR1RIIjsKLSAgfQotCi0gIGJvb2wgICAgaXNXcm9uZ0RpcmVjdGlvbiAgICA9IGZhbHNlOwotICBib29sICAgIGlzU2FtZU1hc2sgICAgICAgICAgPSBmYWxzZTsKLQotICBib29sICAgIGV4Y2VwdEVvbCAgICAgICAgICAgPSBmYWxzZTsKLSAgZnJDb29yZCBlb2xXaWR0aCAgICAgICAgICAgID0gMDsKLQotICAvL2Jvb2wgICAgaGFzRXhjbHVkZVNwYWNpbmcgICA9IGZhbHNlOyAvLyBwZXIgV0lEVEgKLSAgZnJDb29yZCBsb3dFeGNsdWRlU3BhY2luZyAgID0gMDsKLSAgZnJDb29yZCBoaWdoRXhjbHVkZVNwYWNpbmcgID0gMDsKLQotICAvLyAyZCBzcGFjaW5nIHRhYmxlCi0gIGZyQ29sbGVjdGlvbjxmckNvb3JkPiByb3dWYWxzLCBjb2xWYWxzOwotICBmckNvbGxlY3Rpb248ZnJDb2xsZWN0aW9uPGZyQ29vcmQ+ID4gdGJsVmFsczsKLSAgZnJDb2xsZWN0aW9uPGZyQ29vcmQ+IHRibFJvd1ZhbHM7Ci0gIAotICAvLyBleGNlcHQgd2l0aGluCi0gIG1hcDxmckNvb3JkLCBwYWlyPGZyQ29vcmQsIGZyQ29vcmQ+ID4gZXdWYWxzOwotCi0gIGludCBzdGFnZSA9IDA7Ci0KLSAgaXN0cmluZ3N0cmVhbSBpc3RyKHNJbik7Ci0gIHN0cmluZyB3b3JkOwotICB3aGlsZSAoaXN0ciA+PiB3b3JkKSB7Ci0gICAgaWYgKHdvcmQgPT0gc3RyaW5nKCJXUk9OR0RJUkVDVElPTiIpKSB7Ci0gICAgICAvL2lzV3JvbmdEaXJlY3Rpb24gPSB0cnVlOwotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8IiBXUk9OR0RJUkVDVElPTiI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiU0FNRU1BU0siKSkgewotICAgICAgaXNTYW1lTWFzayA9IHRydWU7Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiIFNBTUVNQVNLIjsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJFWENFUFRFT0wiKSkgewotICAgICAgLy9leGNlcHRFb2wgPSB0cnVlOwotICAgICAgZG91YmxlIHRtcDsKLSAgICAgIGlmIChpc3RyID4+IHRtcCkgewotICAgICAgICAvL2VvbFdpZHRoID0gZnJDb29yZChyb3VuZCh0bXAgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKSk7Ci0gICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICBjb3V0IDw8IiBFWENFUFRFT0wgIiA8PHRtcDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogZ2V0TGVmNThTcGFjaW5nVGFibGVfcGFyYWxsZWxSdW5MZW5ndGgiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJFWENFUFRXSVRISU4iKSkgewotICAgICAgLy9oYXNFeGNsdWRlU3BhY2luZyA9IHRydWU7Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiIEVYQ0VQVFdJVEhJTiI7Ci0gICAgICB9Ci0gICAgICBkb3VibGUgdG1wOwotICAgICAgaWYgKGlzdHIgPj4gdG1wKSB7Ci0gICAgICAgIGxvd0V4Y2x1ZGVTcGFjaW5nID0gZnJDb29yZChyb3VuZCh0bXAgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKSk7Ci0gICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICBjb3V0IDw8IiAiIDw8dG1wOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb3V0IDw8IkVycm9yOiBnZXRMZWY1OFNwYWNpbmdUYWJsZV9wYXJhbGxlbFJ1bkxlbmd0aCIgPDxlbmRsOwotICAgICAgfQotICAgICAgaWYgKGlzdHIgPj4gdG1wKSB7Ci0gICAgICAgIGhpZ2hFeGNsdWRlU3BhY2luZyA9IGZyQ29vcmQocm91bmQodG1wICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSkpOwotICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgY291dCA8PCIgIiA8PHRtcDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogZ2V0TGVmNThTcGFjaW5nVGFibGVfcGFyYWxsZWxSdW5MZW5ndGgiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIGV3VmFsc1tyb3dWYWxzLnNpemUoKS0xXSA9IG1ha2VfcGFpcihsb3dFeGNsdWRlU3BhY2luZywgaGlnaEV4Y2x1ZGVTcGFjaW5nKTsKLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJXSURUSCIpKSB7Ci0gICAgICBpZiAodGJsUm93VmFscy5zaXplKCkpIHsKLSAgICAgICAgdGJsVmFscy5wdXNoX2JhY2sodGJsUm93VmFscyk7Ci0gICAgICAgIHRibFJvd1ZhbHMuY2xlYXIoKTsKLSAgICAgIH0KLSAgICAgIC8vaGFzRXhjbHVkZVNwYWNpbmcgICA9IGZhbHNlOwotICAgICAgc3RhZ2UgPSAxOwotICAgICAgZG91YmxlIHRtcDsKLSAgICAgIGlmIChpc3RyID4+IHRtcCkgewotICAgICAgICByb3dWYWxzLnB1c2hfYmFjayhmckNvb3JkKHJvdW5kKHRtcCAqICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmdldERCVVBlclVVKCkpKSk7Ci0gICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICBjb3V0IDw8ZW5kbCA8PCIgIFdJRFRIICIgPDx0bXA7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiRXJyb3I6IGdldExlZjU4U3BhY2luZ1RhYmxlX3BhcmFsbGVsUnVuTGVuZ3RoIiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiOyIpKSB7Ci0gICAgICBpZiAoc3RhZ2UgPT0gMSAmJiB0YmxSb3dWYWxzLnNpemUoKSkgewotICAgICAgICB0YmxWYWxzLnB1c2hfYmFjayh0YmxSb3dWYWxzKTsKLSAgICAgICAgdGJsUm93VmFscy5jbGVhcigpOwotICAgICAgfQotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8IiA7IjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgLy8gZ2V0IGxlbmd0aAotICAgICAgaWYgKHN0YWdlID09IDApIHsKLSAgICAgICAgY29sVmFscy5wdXNoX2JhY2soZnJDb29yZChyb3VuZChzdG9kKHdvcmQpICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSkpKTsKLSAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgIGNvdXQgPDwiICIgPDx3b3JkOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoc3RhZ2UgPT0gMSkgewotICAgICAgICB0YmxSb3dWYWxzLnB1c2hfYmFjayhmckNvb3JkKHJvdW5kKHN0b2Qod29yZCkgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKSkpOwotICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgY291dCA8PCIgIiA8PHdvcmQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vaWYgKHN0YWdlID09IDApIHsKLSAgICAgIC8vICByb3dWYWxzLnB1c2hfYmFjayhmckNvb3JkKHJvdW5kKHN0b2Qod29yZCkgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKSkpOwotICAgICAgLy8gIGNvdXQgPDwicHVzaGVkIGJhY2sgcm93IHZhbHVlICIgPDx3b3JkIDw8ZW5kbDsKLSAgICAgIC8vfQotICAgIH0KLSAgfQotCi0gIHN0cmluZyByb3dOYW1lKCJXSURUSCIpOwotICBzdHJpbmcgY29sTmFtZSgiUEFSQUxMRUxSVU5MRU5HVEgiKTsKLSAgc2hhcmVkX3B0cjxmcjJETG9va3VwVGJsPGZyQ29vcmQsIGZyQ29vcmQsIGZyQ29vcmQ+ID4gcHJsVGJsID0gbWFrZV9zaGFyZWQ8Ci0gICAgZnIyRExvb2t1cFRibDxmckNvb3JkLCBmckNvb3JkLCBmckNvb3JkPiA+KHJvd05hbWUsIHJvd1ZhbHMsIGNvbE5hbWUsIGNvbFZhbHMsIHRibFZhbHMpOwotICBzaGFyZWRfcHRyPGZyTGVmNThTcGFjaW5nVGFibGVDb25zdHJhaW50PiBzcGFjaW5nVGFibGVDb25zdHJhaW50ID0gbWFrZV9zaGFyZWQ8ZnJMZWY1OFNwYWNpbmdUYWJsZUNvbnN0cmFpbnQ+KHBybFRibCwgZXdWYWxzKTsKLSAgc3BhY2luZ1RhYmxlQ29uc3RyYWludC0+c2V0V3JvbmdEaXJlY3Rpb24oaXNXcm9uZ0RpcmVjdGlvbik7Ci0gIHNwYWNpbmdUYWJsZUNvbnN0cmFpbnQtPnNldFNhbWVNYXNrKGlzU2FtZU1hc2spOwotICBpZiAoZXhjZXB0RW9sKSB7Ci0gICAgc3BhY2luZ1RhYmxlQ29uc3RyYWludC0+c2V0RW9sV2lkdGgoZW9sV2lkdGgpOwotICB9Ci0gIAotICAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5hZGRDb25zdHJhaW50KHNwYWNpbmdUYWJsZUNvbnN0cmFpbnQpOwotICB0bXBMYXllci0+YWRkQ29uc3RyYWludChzcGFjaW5nVGFibGVDb25zdHJhaW50KTsKLQotICAvL2lmIChlbmFibGVPdXRwdXQpIHsKLSAgLy8gIGNvdXQgPDxlbmRsOwotICAvL30KLQotCi0gIC8vY291dCA8PCJ0YmxWYWxzICIgPDxlbmRsOwotICAvL2ZvciAoYXV0byAmdjE6IHRibFZhbHMpIHsKLSAgLy8gIGZvciAoYXV0byAmdjI6IHYxKSB7Ci0gIC8vICAgIGNvdXQgPDwiICIgPDx2MjsKLSAgLy8gIH0KLSAgLy8gIGNvdXQgPDxlbmRsOwotICAvL30KLSAgLy9jb3V0IDw8ImV3VmFscyAiIDw8ZW5kbDsKLSAgLy9mb3IgKGF1dG8gJml0OiBld1ZhbHMpIHsKLSAgLy8gIGNvdXQgPDwiaWR4ID0gIiA8PGl0LmZpcnN0IDw8IiwgIiA8PCJsL2ggPSAiIDw8aXQuc2Vjb25kLmZpcnN0IDw8Ii8iIDw8aXQuc2Vjb25kLnNlY29uZCA8PGVuZGw7Ci0gIC8vfQotCi0KLSAgLy9jb3V0IDw8c0luIDw8ZW5kbDsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBpbzo6UGFyc2VyOjpnZXRMZWY1OFNwYWNpbmdUYWJsZSh2b2lkICpkYXRhLCBmckxheWVyKiB0bXBMYXllciwgY29uc3Qgc3RyaW5nICZzSW4pIHsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICBjb3V0IDw8ZW5kbCA8PCIgIFBST1BFUlRZIExFRjU4X1NQQUNJTkdUQUJMRSBcIiI7Ci0gIH0KLSAgaXN0cmluZ3N0cmVhbSBpc3RyKHNJbik7Ci0gIHN0cmluZyB3b3JkOwotICBzdHJpbmdzdHJlYW0gc3M7Ci0KLSAgc3RyaW5nIGtleXdvcmQ7Ci0gIHdoaWxlIChpc3RyID4+IHdvcmQpIHsKLSAgICBpZiAod29yZCA9PSBzdHJpbmcoIlNQQUNJTkdUQUJMRSIpKSB7Ci0gICAgICBzcy5zdHIoIiIpOwotICAgIH0gZWxzZSBpZiAod29yZCA9PSBzdHJpbmcoIlBBUkFMTEVMUlVOTEVOR1RIIikpIHsKLSAgICAgIC8vY291dCA8PCJmb3VuZCBQQVJBTExFTFJVTkxFTkdUSCIgPDxlbmRsOwotICAgICAga2V5d29yZCA9ICJQQVJBTExFTFJVTkxFTkdUSCI7Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiOyIpKSB7Ci0gICAgICBzcyA8PCIgIiA8PHdvcmQ7Ci0gICAgICBpZiAoa2V5d29yZCA9PSBzdHJpbmcoIlBBUkFMTEVMUlVOTEVOR1RIIikpIHsKLSAgICAgICAgZ2V0TGVmNThTcGFjaW5nVGFibGVfcGFyYWxsZWxSdW5MZW5ndGgoZGF0YSwgdG1wTGF5ZXIsIHNzLnN0cigpKTsKLSAgICAgIH0KLSAgICAgIC8vY291dCA8PCJmb3VuZCA7IiA8PGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vY291dCA8PCJmb3VuZCAiIDw8d29yZCA8PGVuZGw7Ci0gICAgICBzcyA8PCIgIiA8PHdvcmQ7Ci0gICAgfQotICB9Ci0gIC8vY291dCA8PHNzLnN0cigpIDw8ZW5kbDsKLSAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgIGNvdXQgPDwiXCIgOyIgPDxlbmRsOwotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotaW50IGlvOjpQYXJzZXI6OmdldExlZjU4U3BhY2luZ19lbmRPZkxpbmVXaXRoaW4odm9pZCAqZGF0YSwgZnJMYXllciogdG1wTGF5ZXIsIGNvbnN0IHN0cmluZyAmc0luKSB7Ci0gIC8vYm9vbCBlbmFibGVPdXRwdXQgPSB0cnVlOwotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICAvL2NvdXQgPDxlbmRsIDw8Inh4eCAiIDw8c0luIDw8ZW5kbDsKLSAgLy9pZiAoZW5hYmxlT3V0cHV0KSB7Ci0gIC8vICBjb3V0IDw8ZW5kbCA8PCIgIFNQQUNJTkciOwotICAvL30KLSAgLy9jb3V0IDw8InRlc3Q6ICIgPDxzSW4gPDxlbmRsOwotICAvLyBtaW5zcGFjaW5nCi0gIGZyQ29vcmQgZW9sU3BhY2UgICAgICAgICAgID0gMDsKLSAgZnJDb29yZCBlb2xXaWR0aCAgICAgICAgICAgPSAwOwotCi0gIGJvb2wgICAgaGFzRXhhY3RXaWR0aCAgICAgID0gZmFsc2U7Ci0KLSAgYm9vbCAgICBoYXNXcm9uZ0RpclNwYWNpbmcgPSBmYWxzZTsKLSAgZnJDb29yZCB3cm9uZ0RpclNwYWNlICAgICAgPSAwOwotCi0gIGJvb2wgICAgaGFzT3Bwb3NpdGVXaWR0aCAgID0gZmFsc2U7Ci0gIGZyQ29vcmQgb3Bwb3NpdGVXaWR0aCAgICAgID0gMDsKLQotICBmckNvb3JkIGVvbFdpdGhpbiAgICAgICAgICA9IDA7Ci0KLSAgYm9vbCAgICBoYXNXcm9uZ0RpcldpdGhpbiAgPSBmYWxzZTsKLSAgZnJDb29yZCB3cm9uZ0RpcldpdGhpbiAgICAgPSAwOwotCi0gIGJvb2wgICAgaGFzU2FtZU1hc2sgICAgICAgID0gZmFsc2U7Ci0KLSAgLy8gRU5EVE9FTkQKLSAgYm9vbCAgICBoYXNFbmRUb0VuZCAgICAgICAgICA9IGZhbHNlOwotICBmckNvb3JkIGVuZFRvRW5kU3BhY2UgICAgICAgID0gMDsKLSAgYm9vbCAgICBoYXNDdXRTcGFjZSAgICAgICAgICA9IGZhbHNlOwotICBmckNvb3JkIG9uZUN1dFNwYWNlICAgICAgICAgID0gMDsKLSAgZnJDb29yZCB0d29DdXRTcGFjZSAgICAgICAgICA9IDA7Ci0gIGJvb2wgICAgaGFzRXh0ZW5zaW9uICAgICAgICAgPSBmYWxzZTsKLSAgZnJDb29yZCBleHRlbnNpb24gICAgICAgICAgICA9IDA7Ci0gIGJvb2wgICAgaGFzV3JvbmdEaXJFeHRlbnNpb24gPSBmYWxzZTsKLSAgZnJDb29yZCB3cm9uZ0RpckV4dGVuc2lvbiAgICA9IDA7Ci0gIGJvb2wgICAgaGFzT3RoZXJFbmRXaWR0aCAgICAgPSBmYWxzZTsKLSAgZnJDb29yZCBvdGhlckVuZFdpZHRoICAgICAgICA9IDA7Ci0gIAotICAvLyBNSU5MRU5HVEgvTUFYTEVOR1RICi0gIGJvb2wgICAgaGFzTGVuZ3RoICAgICAgICAgID0gZmFsc2U7Ci0gIGJvb2wgICAgaXNNYXggICAgICAgICAgICAgID0gZmFsc2U7Ci0gIGZyQ29vcmQgbGVuZ3RoICAgICAgICAgICAgID0gMDsKLSAgYm9vbCAgICBoYXNUd29TaWRlcyAgICAgICAgPSBmYWxzZTsKLQotICAvLyBQQVJBTExFTEVER0UKLSAgYm9vbCAgICBoYXNQYXJhbGxlbEVkZ2UgICAgICAgICAgPSBmYWxzZTsKLSAgYm9vbCAgICBoYXNTdWJ0cmFjdEVvbFdpZHRoICAgICAgPSBmYWxzZTsKLSAgZnJDb29yZCBwYXJTcGFjZSAgICAgICAgICAgICAgICAgPSAwOwotICBmckNvb3JkIHBhcldpdGhpbiAgICAgICAgICAgICAgICA9IDA7Ci0gIGJvb2wgICAgaGFzUHJsICAgICAgICAgICAgICAgICAgID0gZmFsc2U7Ci0gIGZyQ29vcmQgcHJsICAgICAgICAgICAgICAgICAgICAgID0gMDsKLSAgYm9vbCAgICBoYXNQYXJhbGxlbEVkZ2VNaW5MZW5ndGggPSBmYWxzZTsKLSAgZnJDb29yZCBwYXJhbGxlbEVkZ2VNaW5MZW5ndGggICAgPSAwOwotICBib29sICAgIGhhc1R3b0VkZ2VzICAgICAgICAgICAgICA9IGZhbHNlOwotICBib29sICAgIGhhc1NhbWVNZXRhbCAgICAgICAgICAgICA9IGZhbHNlOwotICBib29sICAgIGhhc05vbkVvbENvcm5lck9ubHkgICAgICA9IGZhbHNlOwotICBib29sICAgIGhhc1BhcmFsbGVsU2FtZU1hc2sgICAgICA9IGZhbHNlOwotCi0gIGJvb2wgICAgc2tpcCA9IGZhbHNlOwotICAvL3N0cmluZyBzdGFnZSA9ICIiOwotCi0gIGlzdHJpbmdzdHJlYW0gaXN0cihzSW4pOwotICBzdHJpbmcgd29yZDsKLSAgaW50IHN0YWdlID0gMDsKLSAgd2hpbGUgKGlzdHIgPj4gd29yZCkgewotICAgIGlmICh3b3JkID09IHN0cmluZygiU1BBQ0lORyIpKSB7Ci0gICAgICBkb3VibGUgdG1wOwotICAgICAgaWYgKGlzdHIgPj4gdG1wKSB7Ci0gICAgICAgIGVvbFNwYWNlID0gZnJDb29yZChyb3VuZCh0bXAgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKSk7Ci0gICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICBjb3V0IDw8ZW5kbCA8PCIgIFNQQUNJTkcgIiA8PHRtcDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogZ2V0TGVmNThTcGFjaW5nX2VvbFNwYWNlIiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgICBzdGFnZSA9IDA7Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiRU5ET0ZMSU5FIikpIHsKLSAgICAgIGRvdWJsZSB0bXA7Ci0gICAgICBpZiAoaXN0ciA+PiB0bXApIHsKLSAgICAgICAgZW9sV2lkdGggPSBmckNvb3JkKHJvdW5kKHRtcCAqICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmdldERCVVBlclVVKCkpKTsKLSAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgIGNvdXQgPDwiIEVORE9GTElORSAiIDw8dG1wOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb3V0IDw8IkVycm9yOiBnZXRMZWY1OFNwYWNpbmdfZW9sU3BhY2UiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIHN0YWdlID0gMDsKLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJFWEFDVFdJRFRIIikpIHsKLSAgICAgIGhhc0V4YWN0V2lkdGggPSB0cnVlOwotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8IiBFWEFDVFdJRFRIIjsKLSAgICAgIH0KLSAgICAgIHN0YWdlID0gMDsKLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJXUk9OR0RJUlNQQUNJTkciKSkgewotICAgICAgaGFzV3JvbmdEaXJTcGFjaW5nID0gdHJ1ZTsKLSAgICAgIGRvdWJsZSB0bXA7Ci0gICAgICBpZiAoaXN0ciA+PiB0bXApIHsKLSAgICAgICAgd3JvbmdEaXJTcGFjZSA9IGZyQ29vcmQocm91bmQodG1wICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSkpOwotICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgY291dCA8PCIgV1JPTkdESVJTUEFDSU5HICIgPDx0bXA7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiRXJyb3I6IGdldExlZjU4U3BhY2luZ19lb2xTcGFjZSIgPDxlbmRsOwotICAgICAgfQotICAgICAgc3RhZ2UgPSAwOwotICAgIH0gZWxzZSBpZiAod29yZCA9PSBzdHJpbmcoIk9QUE9TSVRFV0lEVEgiKSkgewotICAgICAgaGFzT3Bwb3NpdGVXaWR0aCA9IHRydWU7Ci0gICAgICBkb3VibGUgdG1wOwotICAgICAgaWYgKGlzdHIgPj4gdG1wKSB7Ci0gICAgICAgIG9wcG9zaXRlV2lkdGggPSBmckNvb3JkKHJvdW5kKHRtcCAqICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmdldERCVVBlclVVKCkpKTsKLSAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgIGNvdXQgPDwiIE9QUE9TSVRFV0lEVEggIiA8PHRtcDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogZ2V0TGVmNThTcGFjaW5nX2VvbFNwYWNlIiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgICBzdGFnZSA9IDA7Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiV0lUSElOIikpIHsKLSAgICAgIGRvdWJsZSB0bXA7Ci0gICAgICBpZiAoaXN0ciA+PiB0bXApIHsKLSAgICAgICAgZW9sV2l0aGluID0gZnJDb29yZChyb3VuZCh0bXAgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKSk7Ci0gICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICBjb3V0IDw8IiBXSVRISU4gIiA8PHRtcDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogZ2V0TGVmNThTcGFjaW5nX2VvbFNwYWNlIiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgICBzdGFnZSA9IDE7Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiU0FNRU1BU0siKSkgewotICAgICAgaGFzU2FtZU1hc2sgPSB0cnVlOwotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8IiBTQU1FTUFTSyI7Ci0gICAgICB9Ci0gICAgICBzdGFnZSA9IDA7Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiRVhDRVBURVhBQ1RXSURUSCIpKSB7Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiIEVYQ0VQVEVYQUNUV0lEVEgoU0tJUCkiOwotICAgICAgfQotICAgICAgc3RhZ2UgPSAwOwotICAgICAgc2tpcCA9IHRydWU7Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiRklMTENPTkNBVkVDT1JORVIiKSkgewotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8IiBGSUxMQ09OQ0FWRUNPUk5FUihTS0lQKSI7Ci0gICAgICB9Ci0gICAgICBzdGFnZSA9IDA7Ci0gICAgICBza2lwID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJXSVRIQ1VUIikpIHsKLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgV0lUSENVVChTS0lQKSI7Ci0gICAgICB9Ci0gICAgICBzdGFnZSA9IDA7Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiRU5EUFJMU1BBQ0lORyIpKSB7Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiIEVORFBSTFNQQUNJTkcoU0tJUCkiOwotICAgICAgfQotICAgICAgc3RhZ2UgPSAwOwotICAgICAgc2tpcCA9IHRydWU7Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiRU5EVE9FTkQiKSkgewotICAgICAgaGFzRW5kVG9FbmQgPSB0cnVlOwotICAgICAgZG91YmxlIHRtcDsKLSAgICAgIGlmIChpc3RyID4+IHRtcCkgewotICAgICAgICBlbmRUb0VuZFNwYWNlID0gZnJDb29yZChyb3VuZCh0bXAgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKSk7Ci0gICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICBjb3V0IDw8IiBFTkRUT0VORCAiIDw8dG1wOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb3V0IDw8IkVycm9yOiBnZXRMZWY1OFNwYWNpbmdfZW9sU3BhY2UiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIHN0YWdlID0gMjsKLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJNQVhMRU5HVEgiKSkgewotICAgICAgaGFzTGVuZ3RoID0gdHJ1ZTsKLSAgICAgIGlzTWF4ICAgICA9IHRydWU7Ci0gICAgICBkb3VibGUgdG1wOwotICAgICAgaWYgKGlzdHIgPj4gdG1wKSB7Ci0gICAgICAgIGxlbmd0aCA9IGZyQ29vcmQocm91bmQodG1wICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSkpOwotICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgY291dCA8PCIgTUFYTEVOR1RIICIgPDx0bXA7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiRXJyb3I6IGdldExlZjU4U3BhY2luZ19lb2xTcGFjZSIgPDxlbmRsOwotICAgICAgfQotICAgICAgc3RhZ2UgPSAwOwotICAgIH0gZWxzZSBpZiAoc3RhZ2UgIT0gMyAmJiB3b3JkID09IHN0cmluZygiTUlOTEVOR1RIIikpIHsKLSAgICAgIGhhc0xlbmd0aCA9IHRydWU7Ci0gICAgICBpc01heCAgICAgPSBmYWxzZTsKLSAgICAgIGRvdWJsZSB0bXA7Ci0gICAgICBpZiAoaXN0ciA+PiB0bXApIHsKLSAgICAgICAgbGVuZ3RoID0gZnJDb29yZChyb3VuZCh0bXAgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKSk7Ci0gICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICBjb3V0IDw8IiBNSU5MRU5HVEggIiA8PHRtcDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogZ2V0TGVmNThTcGFjaW5nX2VvbFNwYWNlIiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgICBzdGFnZSA9IDA7Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiVFdPU0lERVMiKSkgewotICAgICAgaGFzVHdvU2lkZXMgPSB0cnVlOwotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8IiBUV09TSURFUyI7Ci0gICAgICB9Ci0gICAgICBzdGFnZSA9IDA7Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiRVFVQUxSRUNUV0lEVEgiKSkgewotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8IiBFUVVBTFJFQ1RXSURUSChTS0lQKSI7Ci0gICAgICB9Ci0gICAgICBzdGFnZSA9IDA7Ci0gICAgICBza2lwID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJQQVJBTExFTEVER0UiKSkgewotICAgICAgaGFzUGFyYWxsZWxFZGdlID0gdHJ1ZTsKLSAgICAgIHN0cmluZyB0bXA7Ci0gICAgICAvLyByZWFkIHRvIHBhclNwYWNlCi0gICAgICBpZiAoaXN0ciA+PiB0bXApIHsKLSAgICAgICAgaWYgKHRtcCA9PSBzdHJpbmcoIlNVQlRSQUNURU9MV0lEVEgiKSkgewotICAgICAgICAgIGhhc1N1YnRyYWN0RW9sV2lkdGggPSB0cnVlOwotICAgICAgICAgIGRvdWJsZSB0bXAyOwotICAgICAgICAgIGlmIChpc3RyID4+IHRtcDIpIHsKLSAgICAgICAgICAgIHBhclNwYWNlID0gZnJDb29yZChyb3VuZCh0bXAyICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSkpOwotICAgICAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgICAgICBjb3V0IDw8IiBQQVJBTExFTEVER0UgU1VCVFJBQ1RFT0xXSURUSCAiIDw8dG1wMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY291dCA8PCJFcnJvcjogZ2V0TGVmNThTcGFjaW5nX2VvbFNwYWNlIiA8PGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHBhclNwYWNlID0gZnJDb29yZChyb3VuZChzdG9kKHRtcCkgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKSk7Ci0gICAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgICAgY291dCA8PCIgUEFSQUxMRUxFREdFICIgPDx0bXA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb3V0IDw8IkVycm9yOiBnZXRMZWY1OFNwYWNpbmdfZW9sU3BhY2UiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIC8vIHJlYWQgdG8gcGFyV2l0aGluCi0gICAgICBpZiAoaXN0ciA+PiB0bXApIHsKLSAgICAgICAgaWYgKHRtcCA9PSBzdHJpbmcoIldJVEhJTiIpKSB7Ci0gICAgICAgICAgZG91YmxlIHRtcDI7Ci0gICAgICAgICAgaWYgKGlzdHIgPj4gdG1wMikgewotICAgICAgICAgICAgcGFyV2l0aGluID0gZnJDb29yZChyb3VuZCh0bXAyICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSkpOwotICAgICAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgICAgICBjb3V0IDw8IiAoUEUpV0lUSElOICIgPDx0bXAyOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb3V0IDw8IkVycm9yOiBnZXRMZWY1OFNwYWNpbmdfZW9sU3BhY2UiIDw8ZW5kbDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgY291dCA8PCJFcnJvcjogZ2V0TGVmNThTcGFjaW5nX2VvbFNwYWNlIiA8PGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHN0YWdlID0gMzsKLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJFTkNMT1NFQ1VUIikpIHsKLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgRU5DTE9TRUNVVChTS0lQKSI7Ci0gICAgICB9Ci0gICAgICBzdGFnZSA9IDA7Ci0gICAgICBza2lwID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCI7IikpIHsKLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgOyI7Ci0gICAgICB9Ci0gICAgICBzdGFnZSA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIHN0YWdlID0gMSwgcmVhZCB3cm9uZ0RpcldpdGhpbgotICAgICAgaWYgKHN0YWdlID09IDEpIHsKLSAgICAgICAgaGFzV3JvbmdEaXJXaXRoaW4gPSB0cnVlOwotICAgICAgICBjb3V0IDw8Zmx1c2g7Ci0gICAgICAgIHdyb25nRGlyV2l0aGluID0gZnJDb29yZChyb3VuZChzdG9kKHdvcmQpICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSkpOwotICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgY291dCA8PCIgIiA8PHdvcmQ7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhZ2UgPSAwOwotICAgICAgLy8gc3RhZ2UgPSAyLCByZWFkIGVuZCB0byBlbmQgZnJvbSBvbmVjdXRzcGFjZQotICAgICAgfSBlbHNlIGlmIChzdGFnZSA9PSAyKSB7Ci0gICAgICAgIGF1dG8gdG1wID0gd29yZDsKLSAgICAgICAgaWYgKHRtcCA9PSBzdHJpbmcoIkVYVEVOU0lPTiIpKSB7Ci0gICAgICAgICAgaGFzRXh0ZW5zaW9uID0gdHJ1ZTsKLSAgICAgICAgICBkb3VibGUgdG1wMjsKLSAgICAgICAgICBpZiAoaXN0ciA+PiB0bXAyKSB7Ci0gICAgICAgICAgICBleHRlbnNpb24gPSBmckNvb3JkKHJvdW5kKHRtcDIgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKSk7Ci0gICAgICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgICAgIGNvdXQgPDwiIEVYVEVOU0lPTiAiIDw8dG1wMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY291dCA8PCJFcnJvcjogZ2V0TGVmNThTcGFjaW5nX2VvbFNwYWNlIiA8PGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgICAgIHN0YWdlID0gMjA7Ci0gICAgICAgIH0gZWxzZSBpZiAodG1wID09IHN0cmluZygiT1RIRVJFTkRXSURUSCIpKSB7Ci0gICAgICAgICAgaGFzT3RoZXJFbmRXaWR0aCA9IHRydWU7Ci0gICAgICAgICAgZG91YmxlIHRtcDI7Ci0gICAgICAgICAgaWYgKGlzdHIgPj4gdG1wMikgewotICAgICAgICAgICAgb3RoZXJFbmRXaWR0aCA9IGZyQ29vcmQocm91bmQodG1wMiAqICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmdldERCVVBlclVVKCkpKTsKLSAgICAgICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICAgICAgY291dCA8PCIgT1RIRVJFTkRXSURUSCAiIDw8dG1wMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY291dCA8PCJFcnJvcjogZ2V0TGVmNThTcGFjaW5nX2VvbFNwYWNlIiA8PGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGhhc0N1dFNwYWNlID0gdHJ1ZTsKLSAgICAgICAgICBvbmVDdXRTcGFjZSA9IGZyQ29vcmQocm91bmQoc3RvZCh0bXApICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSkpOwotICAgICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICAgIGNvdXQgPDwiICIgPDx0bXA7Ci0gICAgICAgICAgfQotICAgICAgICAgIGRvdWJsZSB0bXAyOwotICAgICAgICAgIGlmIChpc3RyID4+IHRtcDIpIHsKLSAgICAgICAgICAgIHR3b0N1dFNwYWNlID0gZnJDb29yZChyb3VuZCh0bXAyICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSkpOwotICAgICAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgICAgICBjb3V0IDw8IiAiIDw8dG1wMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY291dCA8PCJFcnJvcjogZ2V0TGVmNThTcGFjaW5nX2VvbFNwYWNlIiA8PGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAvLyBzdGFnZSA9IDIwLCByZWFkIGVuZCB0byBlbmQgd3JvbmdEaXJFeHRlbnNpb24KLSAgICAgIH0gZWxzZSBpZiAoc3RhZ2UgPT0gMjApIHsKLSAgICAgICAgaGFzV3JvbmdEaXJFeHRlbnNpb24gPSB0cnVlOwotICAgICAgICB3cm9uZ0RpckV4dGVuc2lvbiA9IGZyQ29vcmQocm91bmQoc3RvZCh3b3JkKSAqICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmdldERCVVBlclVVKCkpKTsKLSAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgIGNvdXQgPDwiICIgPDx3b3JkOwotICAgICAgICB9Ci0gICAgICAgIHN0YWdlID0gMjsKLSAgICAgIC8vIHN0YWdlID0gMywgcmVhZCBwYXJhbGxlbGVkZ2UgZnJvbSBwcmwKLSAgICAgIH0gZWxzZSBpZiAoc3RhZ2UgPT0gMykgewotICAgICAgICBpZiAod29yZCA9PSBzdHJpbmcoIlBSTCIpKSB7Ci0gICAgICAgICAgaGFzUHJsID0gdHJ1ZTsKLSAgICAgICAgICBkb3VibGUgdG1wMjsKLSAgICAgICAgICBpZiAoaXN0ciA+PiB0bXAyKSB7Ci0gICAgICAgICAgICBwcmwgPSBmckNvb3JkKHJvdW5kKHRtcDIgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKSk7Ci0gICAgICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgICAgIGNvdXQgPDwiIFBSTCAiIDw8dG1wMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY291dCA8PCJFcnJvcjogZ2V0TGVmNThTcGFjaW5nX2VvbFNwYWNlIiA8PGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJNSU5MRU5HVEgiKSkgewotICAgICAgICAgIGhhc1BhcmFsbGVsRWRnZU1pbkxlbmd0aCA9IHRydWU7Ci0gICAgICAgICAgZG91YmxlIHRtcDI7Ci0gICAgICAgICAgaWYgKGlzdHIgPj4gdG1wMikgewotICAgICAgICAgICAgcGFyYWxsZWxFZGdlTWluTGVuZ3RoID0gZnJDb29yZChyb3VuZCh0bXAyICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSkpOwotICAgICAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgICAgICBjb3V0IDw8IiAoUEUpTUlOTEVOR1RIICIgPDx0bXAyOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb3V0IDw8IkVycm9yOiBnZXRMZWY1OFNwYWNpbmdfZW9sU3BhY2UiIDw8ZW5kbDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAod29yZCA9PSBzdHJpbmcoIlRXT0VER0VTIikpIHsKLSAgICAgICAgICBoYXNUd29FZGdlcyA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAod29yZCA9PSBzdHJpbmcoIlNBTUVNRVRBTCIpKSB7Ci0gICAgICAgICAgaGFzU2FtZU1ldGFsID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiTk9ORU9MQ09STkVST05MWSIpKSB7Ci0gICAgICAgICAgaGFzTm9uRW9sQ29ybmVyT25seSA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAod29yZCA9PSBzdHJpbmcoIlBBUkFMTEVMU0FNRU1BU0siKSkgewotICAgICAgICAgIGhhc1BhcmFsbGVsU2FtZU1hc2sgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmIChza2lwKSB7Ci0gICAgOwotICB9IGVsc2UgewotICAgIGF1dG8gY29uID0gbWFrZV9zaGFyZWQ8ZnJMZWY1OFNwYWNpbmdFbmRPZkxpbmVDb25zdHJhaW50PigpOwotICAgIGNvbi0+c2V0RW9sKGVvbFNwYWNlLCBlb2xXaWR0aCwgaGFzRXhhY3RXaWR0aCk7Ci0gICAgaWYgKGhhc1dyb25nRGlyU3BhY2luZykgewotICAgICAgY29uLT5zZXRXcm9uZ0RpclNwYWNlKHdyb25nRGlyU3BhY2UpOwotICAgIH0KLQotICAgIGF1dG8gd2l0aGluID0gbWFrZV9zaGFyZWQ8ZnJMZWY1OFNwYWNpbmdFbmRPZkxpbmVXaXRoaW5Db25zdHJhaW50PigpOwotICAgIGNvbi0+c2V0V2l0aGluQ29uc3RyYWludCh3aXRoaW4pOwotICAgIGlmIChoYXNPcHBvc2l0ZVdpZHRoKSB7Ci0gICAgICB3aXRoaW4tPnNldE9wcG9zaXRlV2lkdGgob3Bwb3NpdGVXaWR0aCk7Ci0gICAgfQotICAgIHdpdGhpbi0+c2V0RW9sV2l0aGluKGVvbFdpdGhpbik7Ci0gICAgaWYgKGhhc1dyb25nRGlyV2l0aGluKSB7Ci0gICAgICB3aXRoaW4tPnNldFdyb25nRGlyV2l0aGluKHdyb25nRGlyV2l0aGluKTsKLSAgICB9Ci0gICAgaWYgKGhhc1NhbWVNYXNrKSB7Ci0gICAgICB3aXRoaW4tPnNldFNhbWVNYXNrKGhhc1NhbWVNYXNrKTsKLSAgICB9Ci0gICAgaWYgKGhhc0VuZFRvRW5kKSB7Ci0gICAgICBhdXRvIGVuZFRvRW5kID0gbWFrZV9zaGFyZWQ8ZnJMZWY1OFNwYWNpbmdFbmRPZkxpbmVXaXRoaW5FbmRUb0VuZENvbnN0cmFpbnQ+KCk7Ci0gICAgICB3aXRoaW4tPnNldEVuZFRvRW5kQ29uc3RyYWludChlbmRUb0VuZCk7Ci0gICAgICBlbmRUb0VuZC0+c2V0RW5kVG9FbmRTcGFjZShlbmRUb0VuZFNwYWNlKTsKLSAgICAgIGlmIChoYXNDdXRTcGFjZSkgewotICAgICAgICBlbmRUb0VuZC0+c2V0Q3V0U3BhY2Uob25lQ3V0U3BhY2UsIHR3b0N1dFNwYWNlKTsKLSAgICAgIH0KLSAgICAgIGlmIChoYXNFeHRlbnNpb24pIHsKLSAgICAgICAgaWYgKGhhc1dyb25nRGlyRXh0ZW5zaW9uKSB7Ci0gICAgICAgICAgZW5kVG9FbmQtPnNldEV4dGVuc2lvbihleHRlbnNpb24sIHdyb25nRGlyRXh0ZW5zaW9uKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBlbmRUb0VuZC0+c2V0RXh0ZW5zaW9uKGV4dGVuc2lvbik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChoYXNPdGhlckVuZFdpZHRoKSB7Ci0gICAgICAgIGVuZFRvRW5kLT5zZXRPdGhlckVuZFdpZHRoKG90aGVyRW5kV2lkdGgpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoaGFzUGFyYWxsZWxFZGdlKSB7Ci0gICAgICBhdXRvIHBhcmFsbGVsRWRnZSA9IG1ha2Vfc2hhcmVkPGZyTGVmNThTcGFjaW5nRW5kT2ZMaW5lV2l0aGluUGFyYWxsZWxFZGdlQ29uc3RyYWludD4oKTsKLSAgICAgIHdpdGhpbi0+c2V0UGFyYWxsZWxFZGdlQ29uc3RyYWludChwYXJhbGxlbEVkZ2UpOwotICAgICAgaWYgKGhhc1N1YnRyYWN0RW9sV2lkdGgpIHsKLSAgICAgICAgcGFyYWxsZWxFZGdlLT5zZXRTdWJ0cmFjdEVvbFdpZHRoKGhhc1N1YnRyYWN0RW9sV2lkdGgpOwotICAgICAgfQotICAgICAgcGFyYWxsZWxFZGdlLT5zZXRQYXIocGFyU3BhY2UsIHBhcldpdGhpbik7Ci0gICAgICBpZiAoaGFzUHJsKSB7Ci0gICAgICAgIHBhcmFsbGVsRWRnZS0+c2V0UHJsKHBybCk7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzUGFyYWxsZWxFZGdlTWluTGVuZ3RoKSB7Ci0gICAgICAgIHBhcmFsbGVsRWRnZS0+c2V0TWluTGVuZ3RoKHBhcmFsbGVsRWRnZU1pbkxlbmd0aCk7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzVHdvRWRnZXMpIHsKLSAgICAgICAgcGFyYWxsZWxFZGdlLT5zZXRUd29FZGdlcyhoYXNUd29FZGdlcyk7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzU2FtZU1ldGFsKSB7Ci0gICAgICAgIHBhcmFsbGVsRWRnZS0+c2V0U2FtZU1ldGFsKGhhc1NhbWVNZXRhbCk7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzTm9uRW9sQ29ybmVyT25seSkgewotICAgICAgICBwYXJhbGxlbEVkZ2UtPnNldE5vbkVvbENvcm5lck9ubHkoaGFzTm9uRW9sQ29ybmVyT25seSk7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzUGFyYWxsZWxTYW1lTWFzaykgewotICAgICAgICBwYXJhbGxlbEVkZ2UtPnNldFBhcmFsbGVsU2FtZU1hc2soaGFzUGFyYWxsZWxTYW1lTWFzayk7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChoYXNMZW5ndGgpIHsKLSAgICAgIGF1dG8gbGVuID0gbWFrZV9zaGFyZWQ8ZnJMZWY1OFNwYWNpbmdFbmRPZkxpbmVXaXRoaW5NYXhNaW5MZW5ndGhDb25zdHJhaW50PigpOwotICAgICAgd2l0aGluLT5zZXRNYXhNaW5MZW5ndGhDb25zdHJhaW50KGxlbik7Ci0gICAgICBsZW4tPnNldExlbmd0aChpc01heCwgbGVuZ3RoLCBoYXNUd29TaWRlcyk7Ci0gICAgfQotCi0gICAgKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+YWRkQ29uc3RyYWludChjb24pOwotICAgIC8vdG1wTGF5ZXItPmFkZENvbnN0cmFpbnQoY29uKTsKLSAgICB0bXBMYXllci0+bGVmNThTcGFjaW5nRW5kT2ZMaW5lQ29uc3RyYWludHMucHVzaF9iYWNrKGNvbik7Ci0gIH0KLQotICAvL2lmIChlbmFibGVPdXRwdXQpIHsKLSAgLy8gIGNvdXQgPDxlbmRsOwotICAvL30KLQotICByZXR1cm4gMDsKLX0KLQotCi1pbnQgaW86OlBhcnNlcjo6Z2V0TGVmNThTcGFjaW5nKHZvaWQgKmRhdGEsIGZyTGF5ZXIqIHRtcExheWVyLCBjb25zdCBzdHJpbmcgJnNJbikgewotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLSAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgIGNvdXQgPDxlbmRsIDw8IiAgUFJPUEVSVFkgTEVGNThfU1BBQ0lORyBcIiI7Ci0gIH0KLSAgLy9jb3V0IDw8c0luIDw8ZW5kbDsKLSAgaXN0cmluZ3N0cmVhbSBpc3RyKHNJbik7Ci0gIHN0cmluZyB3b3JkOwotICBzdHJpbmdzdHJlYW0gc3M7Ci0KLSAgc3RyaW5nIGtleXdvcmQ7Ci0gIHN0cmluZyBrZXl3b3JkMjsKLSAgd2hpbGUgKGlzdHIgPj4gd29yZCkgewotICAgIGlmICh3b3JkID09IHN0cmluZygiU1BBQ0lORyIpKSB7Ci0gICAgICBzcy5zdHIoIiIpOwotICAgICAgLy9zcy5zdHIoc3RyaW5nKCJTUEFDSU5HIikpOwotICAgICAgLy9zcy5jbGVhcigpOwotICAgICAgLy9zcy5zdHIoIiIpOwotICAgICAgc3MgPDx3b3JkOwotICAgICAgLy9jb3V0IDw8Inh4eCAiIDw8c3Muc3RyKCkgPDxlbmRsOwotICAgICAga2V5d29yZCA9ICIiOwotICAgIH0gZWxzZSBpZiAod29yZCA9PSBzdHJpbmcoIkVPTFBFUlBFTkRJQ1VMQVIiKSkgewotICAgICAga2V5d29yZCA9ICJFT0xQRVJQRU5ESUNVTEFSIjsKLSAgICAgIHNzIDw8IiAiIDw8d29yZDsKLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJBUkVBIikpIHsKLSAgICAgIGtleXdvcmQgPSAiQVJFQSI7Ci0gICAgICBzcyA8PCIgIiA8PHdvcmQ7Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiTEFZRVIiKSkgewotICAgICAga2V5d29yZCA9ICJMQVlFUiI7Ci0gICAgICBzcyA8PCIgIiA8PHdvcmQ7Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiTk9UQ0hMRU5HVEgiKSkgewotICAgICAga2V5d29yZCA9ICJOT1RDSExFTkdUSCI7Ci0gICAgICBzcyA8PCIgIiA8PHdvcmQ7Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiTk9UQ0hTUEFOIikpIHsKLSAgICAgIGtleXdvcmQgPSAiTk9UQ0hTUEFOIjsKLSAgICAgIHNzIDw8IiAiIDw8d29yZDsKLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJFTkRPRkxJTkUiKSkgewotICAgICAga2V5d29yZCA9ICJFTkRPRkxJTkUiOwotICAgICAgc3MgPDwiICIgPDx3b3JkOwotICAgIH0gZWxzZSBpZiAod29yZCA9PSBzdHJpbmcoIkNPTlZFWENPUk5FUlMiKSkgewotICAgICAga2V5d29yZCA9ICJDT05WRVhDT1JORVJTIjsKLSAgICAgIHNzIDw8IiAiIDw8d29yZDsKLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJUT0NPTkNBVkVDT1JORVIiKSkgewotICAgICAga2V5d29yZDIgPSAiVE9DT05DQVZFQ09STkVSIjsKLSAgICAgIHNzIDw8IiAiIDw8d29yZDsKLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJUT05PVENITEVOR1RIIikpIHsKLSAgICAgIGtleXdvcmQyID0gIlRPTk9UQ0hMRU5HVEgiOwotICAgICAgc3MgPDwiICIgPDx3b3JkOwotICAgIH0gZWxzZSBpZiAod29yZCA9PSBzdHJpbmcoIjsiKSkgewotICAgICAgc3MgPDwiICIgPDx3b3JkOwotICAgICAgaWYgKGtleXdvcmQgPT0gc3RyaW5nKCJFTkRPRkxJTkUiKSkgewotICAgICAgICBpZiAoa2V5d29yZDIgPT0gc3RyaW5nKCIiKSkgewotICAgICAgICAgIGdldExlZjU4U3BhY2luZ19lbmRPZkxpbmVXaXRoaW4oZGF0YSwgdG1wTGF5ZXIsIHNzLnN0cigpKTsKLSAgICAgICAgfSBlbHNlIGlmIChrZXl3b3JkMiA9PSBzdHJpbmcoIlRPQ09OQ0FWRUNPUk5FUiIpKSB7Ci0gICAgICAgICAgOwotICAgICAgICB9IGVsc2UgaWYgKGtleXdvcmQyID09IHN0cmluZygiVE9OT1RDSExFTkdUSCIpKSB7Ci0gICAgICAgICAgOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgOyAvLyBoYXMga2V5d29yZCwgb3IgU0FNRU1BU0ssIG9yIFdST05HRElSRUNUSU9OLCBvciBub3RoaW5nCi0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNzIDw8IiAiIDw8d29yZDsKLSAgICB9Ci0gIH0KLSAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgIGNvdXQgPDwiXCIgOyIgPDxlbmRsOwotICB9Ci0gIHJldHVybiAwOwotfQotCi1pbnQgaW86OlBhcnNlcjo6Z2V0TGVmNThDdXRDbGFzcyh2b2lkICpkYXRhLCBmckxheWVyKiB0bXBMYXllciwgY29uc3Qgc3RyaW5nICZzSW4pIHsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICBjb3V0IDw8ZW5kbCA8PCIgIFBST1BFUlRZIExFRjU4X0NVVENMQVNTIFwiIjsKLSAgfQotICBpc3RyaW5nc3RyZWFtIGlzdHIoc0luKTsKLSAgc3RyaW5nIHdvcmQ7Ci0KLSAgc3RyaW5nICBuYW1lICAgICAgID0gIiI7Ci0gIGZyQ29vcmQgdmlhV2lkdGggICA9IDA7Ci0gIGJvb2wgICAgaFZpYUxlbmd0aCA9IGZhbHNlOwotICBmckNvb3JkIHZpYUxlbmd0aCAgPSAwOwotICBib29sICAgIGhOdW1DdXQgICAgPSBmYWxzZTsKLSAgZnJVSW50NCBudW1DdXQgICAgID0gMDsKLQotICBhdXRvIGxlZjU4Q3V0Q2xhc3NDb24gPSBtYWtlX3NoYXJlZDxmckxlZjU4Q3V0Q2xhc3NDb25zdHJhaW50PigpOwotICBpZiAodG1wTGF5ZXItPmxlZjU4Q3V0Q2xhc3NDb25zdHJhaW50LmxvY2soKSkgewotICAgIGNvdXQgPDwiV2FybmluZzogUFJPUEVSVFkgTEVGNThfQ1VUQ0xBU1MgYWxyZWFkeSBleGlzdHMiIDw8ZW5kbDsKLSAgfQotICB0bXBMYXllci0+bGVmNThDdXRDbGFzc0NvbnN0cmFpbnQgPSBsZWY1OEN1dENsYXNzQ29uOwotICAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5hZGRDb25zdHJhaW50KGxlZjU4Q3V0Q2xhc3NDb24pOwotCi0gIHdoaWxlIChpc3RyID4+IHdvcmQpIHsKLSAgICBpZiAod29yZCA9PSBzdHJpbmcoIkNVVENMQVNTIikpIHsKLSAgICAgIC8vIGluaXRpYWxpemF0aW9uCi0gICAgICBuYW1lICAgICAgID0gIiI7Ci0gICAgICB2aWFXaWR0aCAgID0gMDsKLSAgICAgIGhWaWFMZW5ndGggPSBmYWxzZTsKLSAgICAgIHZpYUxlbmd0aCAgPSAwOwotICAgICAgaE51bUN1dCAgICA9IGZhbHNlOwotICAgICAgbnVtQ3V0ICAgICA9IDA7Ci0gICAgICBpZiAoaXN0ciA+PiBuYW1lKSB7Ci0gICAgICAgIDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiRXJyb3I6IGdldExlZjU4Q3V0Q2xhc3MiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PGVuZGwgPDwiICBDVVRDTEFTUyAiIDw8bmFtZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gIldJRFRIIikgewotICAgICAgZG91YmxlIHRtcDsKLSAgICAgIGlmIChpc3RyID4+IHRtcCkgewotICAgICAgICB2aWFXaWR0aCA9IGZyQ29vcmQocm91bmQodG1wICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogZ2V0TGVmNThDdXRDbGFzcyIgPDxlbmRsOwotICAgICAgfQotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8IiBXSURUSCAiIDw8dG1wOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAod29yZCA9PSAiTEVOR1RIIikgewotICAgICAgZG91YmxlIHRtcDsKLSAgICAgIGlmIChpc3RyID4+IHRtcCkgewotICAgICAgICBoVmlhTGVuZ3RoID0gdHJ1ZTsKLSAgICAgICAgdmlhTGVuZ3RoID0gZnJDb29yZChyb3VuZCh0bXAgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb3V0IDw8IkVycm9yOiBnZXRMZWY1OEN1dENsYXNzIiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiIExFTkdUSCAiIDw8dG1wOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAod29yZCA9PSAiQ1VUUyIpIHsKLSAgICAgIGlmIChpc3RyID4+IG51bUN1dCkgewotICAgICAgICBoTnVtQ3V0ID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiRXJyb3I6IGdldExlZjU4Q3V0Q2xhc3MiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgQ1VUUyAiIDw8bnVtQ3V0OwotICAgICAgfQotICAgIH0gZWxzZSBpZiAod29yZCA9PSAiOyIpIHsKLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgOyI7Ci0gICAgICB9Ci0gICAgICAvLyBwdXNoIHJ1bGUgaGVyZTsKLSAgICAgIGF1dG8gY29uID0gbWFrZV9zaGFyZWQ8ZnJMZWY1OEN1dENsYXNzPigpOwotICAgICAgY29uLT5zZXROYW1lKG5hbWUpOwotICAgICAgY29uLT5zZXRWaWFXaWR0aCh2aWFXaWR0aCk7Ci0gICAgICBpZiAoaFZpYUxlbmd0aCkgewotICAgICAgICBjb24tPnNldFZpYUxlbmd0aCh2aWFMZW5ndGgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY29uLT5zZXRWaWFMZW5ndGgodmlhV2lkdGgpOwotICAgICAgfQotICAgICAgaWYgKGhOdW1DdXQpIHsKLSAgICAgICAgY29uLT5zZXROdW1DdXQobnVtQ3V0KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbi0+c2V0TnVtQ3V0KDEpOwotICAgICAgfQotICAgICAgbGVmNThDdXRDbGFzc0Nvbi0+YWRkVG9DdXRDbGFzcyhjb24pOwotICAgIH0KLSAgfQotICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgY291dCA8PCJcIiA7IiA8PGVuZGw7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBpbzo6UGFyc2VyOjpnZXRMZWY1OEN1dFNwYWNpbmdfaGVscGVyKHZvaWQgKmRhdGEsIGZyTGF5ZXIqIHRtcExheWVyLCBjb25zdCBzdHJpbmcgJnNJbikgewotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotCi0gIHN0cmluZyBrZXl3b3JkID0gIiI7Ci0KLSAgaXN0cmluZ3N0cmVhbSBpc3RyKHNJbik7Ci0gIHN0cmluZyB3b3JkOwotICBzdHJpbmdzdHJlYW0gc3M7Ci0gIHdoaWxlIChpc3RyID4+IHdvcmQpIHsKLSAgICBpZiAod29yZCA9PSBzdHJpbmcoIlNQQUNJTkciKSkgewotICAgICAga2V5d29yZCA9ICIiOwotICAgICAgc3Muc3RyKCIiKTsKLSAgICAgIHNzIDw8d29yZDsKLSAgICB9IGVsc2UgaWYgKGtleXdvcmQgPT0gIiIgJiYgd29yZCA9PSBzdHJpbmcoIlNBTUVNQVNLIikpIHsKLSAgICAgIGtleXdvcmQgPSAiU0FNRU1BU0siOwotICAgICAgc3MgPDwiICIgPDx3b3JkOwotICAgIH0gZWxzZSBpZiAod29yZCA9PSBzdHJpbmcoIk1BWFhZIikpIHsKLSAgICAgIGtleXdvcmQgPSAiTUFYWFkiOwotICAgICAgc3MgPDwiICIgPDx3b3JkOwotICAgIH0gZWxzZSBpZiAod29yZCA9PSBzdHJpbmcoIkxBWUVSIikpIHsKLSAgICAgIGtleXdvcmQgPSAiTEFZRVIiOwotICAgICAgc3MgPDwiICIgPDx3b3JkOwotICAgIH0gZWxzZSBpZiAod29yZCA9PSBzdHJpbmcoIkFESkFDRU5UQ1VUUyIpKSB7Ci0gICAgICBrZXl3b3JkID0gIkFESkFDRU5UQ1VUUyI7Ci0gICAgICBzcyA8PCIgIiA8PHdvcmQ7Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiUEFSQUxMRUxPVkVSTEFQIikpIHsKLSAgICAgIGtleXdvcmQgPSAiUEFSQUxMRUxPVkVSTEFQIjsKLSAgICAgIHNzIDw8IiAiIDw8d29yZDsKLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJQQVJBTExFTFdJVEhJTiIpKSB7Ci0gICAgICBrZXl3b3JkID0gIlBBUkFMTEVMV0lUSElOIjsKLSAgICAgIHNzIDw8IiAiIDw8d29yZDsKLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJTQU1FTUVUQUxTSEFSRURFREdFIikpIHsKLSAgICAgIGtleXdvcmQgPSAiU0FNRU1FVEFMU0hBUkVERURHRSI7Ci0gICAgICBzcyA8PCIgIiA8PHdvcmQ7Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiQVJFQSIpKSB7Ci0gICAgICBrZXl3b3JkID0gIkFSRUEiOwotICAgICAgc3MgPDwiICIgPDx3b3JkOwotICAgIH0gZWxzZSB7Ci0gICAgICBzcyA8PCIgIiA8PHdvcmQ7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGtleXdvcmQgPT0gIkxBWUVSIikgewotICAgIGdldExlZjU4Q3V0U3BhY2luZ19sYXllcihkYXRhLCB0bXBMYXllciwgc3Muc3RyKCkpOwotICB9IGVsc2UgaWYgKGtleXdvcmQgPT0gIkFESkFDRU5UQ1VUUyIpIHsKLSAgICBnZXRMZWY1OEN1dFNwYWNpbmdfYWRqYWNlbnRDdXRzKGRhdGEsIHRtcExheWVyLCBzcy5zdHIoKSk7Ci0gIH0gZWxzZSBpZiAoa2V5d29yZCA9PSAiUEFSQUxMRUxXSVRISU4iKSB7Ci0gICAgZ2V0TGVmNThDdXRTcGFjaW5nX3BhcmFsbGVsV2l0aGluKGRhdGEsIHRtcExheWVyLCBzcy5zdHIoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgOyAvL3NraXAgdW5zdXBwb3J0ZWQgcnVsZXMKLSAgfQotICAKLSAgcmV0dXJuIDA7Ci0KLX0KLQotaW50IGlvOjpQYXJzZXI6OmdldExlZjU4Q3V0U3BhY2luZyh2b2lkICpkYXRhLCBmckxheWVyKiB0bXBMYXllciwgY29uc3Qgc3RyaW5nICZzSW4pIHsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICBjb3V0IDw8ZW5kbCA8PCIgIFBST1BFUlRZIExFRjU4X1NQQUNJTkcgXCIiOwotICB9Ci0gIGlzdHJpbmdzdHJlYW0gaXN0cihzSW4pOwotICBzdHJpbmcgd29yZDsKLSAgc3RyaW5nc3RyZWFtIHNzOwotICB3aGlsZSAoaXN0ciA+PiB3b3JkKSB7Ci0gICAgaWYgKHdvcmQgPT0gc3RyaW5nKCJTUEFDSU5HIikpIHsKLSAgICAgIHNzLnN0cigiIik7Ci0gICAgICBzcyA8PHdvcmQ7Ci0gICAgfSBlbHNlIGlmICh3b3JkID09ICI7IikgewotICAgICAgc3MgPDwiICIgPDx3b3JkOwotICAgICAgZ2V0TGVmNThDdXRTcGFjaW5nX2hlbHBlcihkYXRhLCB0bXBMYXllciwgc3Muc3RyKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzcyA8PCIgIiA8PHdvcmQ7Ci0gICAgfQotICB9Ci0gIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICBjb3V0IDw8IlwiIDsiIDw8ZW5kbDsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotaW50IGlvOjpQYXJzZXI6OmdldExlZjU4Q3V0U3BhY2luZ19sYXllcih2b2lkICpkYXRhLCBmckxheWVyKiB0bXBMYXllciwgY29uc3Qgc3RyaW5nICZzSW4pIHsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0KLSAgZnJDb29yZCAgY3V0U3BhY2luZyAgICAgICAgPSAwOwotCi0gIGJvb2wgICAgIHNraXAgICAgICAgICAgICAgID0gZmFsc2U7Ci0gIC8vZnJMYXllck51bSBzZWNvbmRMYXllck51bSAgPSAwOwotICBmclN0cmluZyBzZWNvbmRMYXllck5hbWUgICA9ICIiOwotICAvLyBjdXRjbGFzcwotICBmclN0cmluZyBjbGFzc05hbWUgICAgICAgICA9ICIiOwotICBib29sICAgICBoYXNBYm92ZVdpZHRoICAgICA9IGZhbHNlOwotICBmckNvb3JkICBhYm92ZVdpZHRoICAgICAgICA9IDA7Ci0gIGJvb2wgICAgIGhhc0VuYyAgICAgICAgICAgID0gZmFsc2U7Ci0gIGZyQ29vcmQgIGVuY2xvc3VyZSAgICAgICAgID0gMDsKLQotICBpc3RyaW5nc3RyZWFtIGlzdHIoc0luKTsKLSAgc3RyaW5nIHdvcmQ7Ci0KLSAgc3RyaW5nIGtleXdvcmQgPSAiIjsKLSAgLy9pbnQgc3RhZ2UgPSAwOwotICB3aGlsZSAoaXN0ciA+PiB3b3JkKSB7Ci0gICAgaWYgKHdvcmQgPT0gc3RyaW5nKCJTUEFDSU5HIikpIHsKLSAgICAgIGRvdWJsZSB0bXA7Ci0gICAgICBpZiAoaXN0ciA+PiB0bXApIHsKLSAgICAgICAgY3V0U3BhY2luZyA9IGZyQ29vcmQocm91bmQodG1wICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogZ2V0TGVmNThDdXRTcGFjaW5nX2xheWVyIiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDxlbmRsIDw8IiAgU1BBQ0lORyAiIDw8dG1wOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAod29yZCA9PSBzdHJpbmcoIkxBWUVSIikpIHsKLSAgICAgIGlmIChpc3RyID4+IHNlY29uZExheWVyTmFtZSkgewotICAgICAgICAvL2lmICgoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5sYXllcnMuZmluZChsYXllck5hbWUpID09ICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmxheWVycy5lbmQoKSkgewotICAgICAgICAvLyAgc2tpcCA9IHRydWU7IC8vIHNraXAgZm9yIHZpYTAKLSAgICAgICAgLy99IGVsc2UgewotICAgICAgICAvLyAgc2Vjb25kTGF5ZXJOdW0gPSAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5sYXllcnMuYXQobGF5ZXJOYW1lKS0+Z2V0TGF5ZXJOdW0oKTsKLSAgICAgICAgLy99Ci0gICAgICAgIAotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogZ2V0TGVmNThDdXRTcGFjaW5nX2xheWVyIiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiIExBWUVSICIgPDxzZWNvbmRMYXllck5hbWU7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiQ1VUQ0xBU1MiKSkgewotICAgICAgaWYgKGlzdHIgPj4gY2xhc3NOYW1lKSB7Ci0gICAgICAgIDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiRXJyb3I6IGdldExlZjU4Q3V0U3BhY2luZ19sYXllciIgPDxlbmRsOwotICAgICAgfQotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8IiBDVVRDTEFTUyAiIDw8Y2xhc3NOYW1lOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAod29yZCA9PSBzdHJpbmcoIlNIT1JURURHRU9OTFkiKSkgewotICAgICAgc2tpcCA9IHRydWU7Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiIFNIT1JURURHRU9OTFkoU0tJUCkiOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAod29yZCA9PSBzdHJpbmcoIlBSTCIpKSB7Ci0gICAgICBza2lwID0gdHJ1ZTsKLSAgICAgIGRvdWJsZSB0bXA7Ci0gICAgICBpZiAoaXN0ciA+PiB0bXApIHsKLSAgICAgICAgOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogZ2V0TGVmNThDdXRTcGFjaW5nX2xheWVyIiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiIFBSTChTS0lQKSAiIDw8dG1wOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAod29yZCA9PSBzdHJpbmcoIkNPTkNBVkVDT1JORVIiKSkgewotICAgICAgc2tpcCA9IHRydWU7Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiIENPTkNBVkVDT1JORVIoU0tJUCkiOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAod29yZCA9PSBzdHJpbmcoIldJRFRIIikpIHsKLSAgICAgIHNraXAgPSB0cnVlOwotICAgICAgc3RyaW5nIHRtcFM7Ci0gICAgICBkb3VibGUgdG1wRDsKLSAgICAgIGlmIChpc3RyID4+IHRtcEQpIHsKLSAgICAgICAgOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogZ2V0TGVmNThDdXRTcGFjaW5nX2xheWVyIiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiIFdJRFRIKFNLSVApICIgPDx0bXBEOwotICAgICAgfQotICAgICAgaWYgKGlzdHIgPj4gdG1wUykgewotICAgICAgICA7IC8vIEVOQ0xPU1VSRQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogZ2V0TGVmNThDdXRTcGFjaW5nX2xheWVyIiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgICBpZiAoaXN0ciA+PiB0bXBEKSB7Ci0gICAgICAgIDsgLy8gZW5jbG9zdXJlCi0gICAgICB9IGVsc2UgewotICAgICAgICBjb3V0IDw8IkVycm9yOiBnZXRMZWY1OEN1dFNwYWNpbmdfbGF5ZXIiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgRU5DTE9TVVJFICIgPDx0bXBEOwotICAgICAgfQotICAgICAgaWYgKGlzdHIgPj4gdG1wUykgewotICAgICAgICA7IC8vIEVER0VMRU5HVEgKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiRXJyb3I6IGdldExlZjU4Q3V0U3BhY2luZ19sYXllciIgPDxlbmRsOwotICAgICAgfQotICAgICAgaWYgKGlzdHIgPj4gdG1wRCkgewotICAgICAgICA7IC8vIGVkZ2VMZW5ndGgKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiRXJyb3I6IGdldExlZjU4Q3V0U3BhY2luZ19sYXllciIgPDxlbmRsOwotICAgICAgfQotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8IiBFREdFTEVOR1RIICIgPDx0bXBEOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAod29yZCA9PSBzdHJpbmcoIlBBUkFMTEVMIikpIHsKLSAgICAgIHNraXAgPSB0cnVlOwotICAgICAgc3RyaW5nIHRtcFM7Ci0gICAgICBkb3VibGUgdG1wRDsKLSAgICAgIGlmIChpc3RyID4+IHRtcEQpIHsKLSAgICAgICAgOyAvLyBwYXJMZW5ndGgKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiRXJyb3I6IGdldExlZjU4Q3V0U3BhY2luZ19sYXllciIgPDxlbmRsOwotICAgICAgfQotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8IiBQQVJBTExFTChTS0lQKSAiIDw8dG1wRDsKLSAgICAgIH0KLSAgICAgIGlmIChpc3RyID4+IHRtcFMpIHsKLSAgICAgICAgOyAvLyBXSVRISU4KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiRXJyb3I6IGdldExlZjU4Q3V0U3BhY2luZ19sYXllciIgPDxlbmRsOwotICAgICAgfQotICAgICAgaWYgKGlzdHIgPj4gdG1wRCkgewotICAgICAgICA7IC8vIHBhcldpdGhpbgotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogZ2V0TGVmNThDdXRTcGFjaW5nX2xheWVyIiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiIFdJVEhJTiAiIDw8dG1wRDsKLSAgICAgIH0KLSAgICAgIGlmIChpc3RyID4+IHRtcFMpIHsKLSAgICAgICAgOyAvLyBFTkNMT1NVUkUKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiRXJyb3I6IGdldExlZjU4Q3V0U3BhY2luZ19sYXllciIgPDxlbmRsOwotICAgICAgfQotICAgICAgaWYgKGlzdHIgPj4gdG1wRCkgewotICAgICAgICA7IC8vIGVuY2xvc3VyZQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogZ2V0TGVmNThDdXRTcGFjaW5nX2xheWVyIiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiIEVOQ0xPU1VSRSAiIDw8dG1wRDsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJFREdFTEVOR1RIIikpIHsKLSAgICAgIHNraXAgPSB0cnVlOwotICAgICAgc3RyaW5nIHRtcFM7Ci0gICAgICBkb3VibGUgdG1wRDsKLSAgICAgIGlmIChpc3RyID4+IHRtcEQpIHsKLSAgICAgICAgOyAvLyBlZGdlTGVuZ3RoCi0gICAgICB9IGVsc2UgewotICAgICAgICBjb3V0IDw8IkVycm9yOiBnZXRMZWY1OEN1dFNwYWNpbmdfbGF5ZXIiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgRURHRUxFTkdUSChTS0lQKSAiIDw8dG1wRDsKLSAgICAgIH0KLSAgICAgIGlmIChpc3RyID4+IHRtcFMpIHsKLSAgICAgICAgOyAvLyBFTkNMT1NVUkUKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiRXJyb3I6IGdldExlZjU4Q3V0U3BhY2luZ19sYXllciIgPDxlbmRsOwotICAgICAgfQotICAgICAgaWYgKGlzdHIgPj4gdG1wRCkgewotICAgICAgICA7IC8vIGVkZ2VFbmNsb3N1cmUKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiRXJyb3I6IGdldExlZjU4Q3V0U3BhY2luZ19sYXllciIgPDxlbmRsOwotICAgICAgfQotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8IiBFTkNMT1NVUkUgIiA8PHRtcEQ7Ci0gICAgICB9Ci0gICAgICBpZiAoaXN0ciA+PiB0bXBEKSB7Ci0gICAgICAgIDsgLy8gYWRqRW5jbG9zdXJlCi0gICAgICB9IGVsc2UgewotICAgICAgICBjb3V0IDw8IkVycm9yOiBnZXRMZWY1OEN1dFNwYWNpbmdfbGF5ZXIiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgIiA8PHRtcEQ7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiRVhURU5TSU9OIikpIHsKLSAgICAgIHNraXAgPSB0cnVlOwotICAgICAgZG91YmxlIHRtcDsKLSAgICAgIGlmIChpc3RyID4+IHRtcCkgewotICAgICAgICA7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb3V0IDw8IkVycm9yOiBnZXRMZWY1OEN1dFNwYWNpbmdfbGF5ZXIiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgRVhURU5TSU9OKFNLSVApICIgPDx0bXA7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiTk9ORU9MQ09OVkVYQ09STkVSIikpIHsKLSAgICAgIHNraXAgPSB0cnVlOwotICAgICAgZG91YmxlIHRtcDsKLSAgICAgIGlmIChpc3RyID4+IHRtcCkgewotICAgICAgICA7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb3V0IDw8IkVycm9yOiBnZXRMZWY1OEN1dFNwYWNpbmdfbGF5ZXIiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgTk9ORU9MQ09OVkVYQ09STkVSICIgPDx0bXA7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiTUlOTEVOR1RIIikpIHsKLSAgICAgIHNraXAgPSB0cnVlOwotICAgICAgZG91YmxlIHRtcDsKLSAgICAgIGlmIChpc3RyID4+IHRtcCkgewotICAgICAgICA7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb3V0IDw8IkVycm9yOiBnZXRMZWY1OEN1dFNwYWNpbmdfbGF5ZXIiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgTUlOTEVOR1RIKFNLSVApICIgPDx0bXA7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiQUJPVkVXSURUSCIpKSB7Ci0gICAgICBoYXNBYm92ZVdpZHRoID0gdHJ1ZTsKLSAgICAgIGRvdWJsZSB0bXA7Ci0gICAgICBpZiAoaXN0ciA+PiB0bXApIHsKLSAgICAgICAgYWJvdmVXaWR0aCA9IGZyQ29vcmQocm91bmQodG1wICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogZ2V0TGVmNThDdXRTcGFjaW5nX2xheWVyIiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiIEFCT1ZFV0lEVEggIiA8PHRtcDsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJFTkNMT1NVUkUiKSkgewotICAgICAgaGFzRW5jID0gdHJ1ZTsKLSAgICAgIGRvdWJsZSB0bXA7Ci0gICAgICBpZiAoaXN0ciA+PiB0bXApIHsKLSAgICAgICAgZW5jbG9zdXJlID0gZnJDb29yZChyb3VuZCh0bXAgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb3V0IDw8IkVycm9yOiBnZXRMZWY1OEN1dFNwYWNpbmdfbGF5ZXIiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgRU5DTE9TVVJFICIgPDx0bXA7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiTUFTS09WRVJMQVAiKSkgewotICAgICAgc2tpcCA9IHRydWU7Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiIE1BU0tPVkVSTEFQKFNLSVApIjsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJXUk9OR0RJUkVDVElPTiIpKSB7Ci0gICAgICBza2lwID0gdHJ1ZTsKLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgV1JPTkdESVJFQ1RJT04oU0tJUCkiOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAod29yZCA9PSBzdHJpbmcoIjsiKSkgewotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8IiA7IjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgOwotICAgIH0KLSAgfQotCi0gIGlmIChza2lwKSB7Ci0gICAgOwotICB9IGVsc2UgewotICAgIGF1dG8gbHIgPSBtYWtlX3NoYXJlZDxmckxlZjU4Q3V0U3BhY2luZ0xheWVyQ29uc3RyYWludD4oKTsKLSAgICAvL2xyLT5zZXRTZWNvbmRMYXllck51bShzZWNvbmRMYXllck51bSk7Ci0gICAgbHItPnNldFNlY29uZExheWVyTmFtZShzZWNvbmRMYXllck5hbWUpOwotICAgIGlmICghKGNsYXNzTmFtZSA9PSAiIikpIHsKLSAgICAgIGxyLT5zZXRDdXRDbGFzcyhjbGFzc05hbWUpOwotICAgICAgaWYgKGhhc0Fib3ZlV2lkdGgpIHsKLSAgICAgICAgbHItPnNldEFib3ZlV2lkdGgoYWJvdmVXaWR0aCk7Ci0gICAgICAgIGlmIChoYXNFbmMpIHsKLSAgICAgICAgICBsci0+c2V0RW5jbG9zdXJlKGVuY2xvc3VyZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBhdXRvIGNvbiA9IG1ha2Vfc2hhcmVkPGZyTGVmNThDdXRTcGFjaW5nQ29uc3RyYWludD4oKTsKLSAgICBjb24tPnNldEN1dFNwYWNpbmcoY3V0U3BhY2luZyk7Ci0gICAgY29uLT5zZXRMYXllckNvbnN0cmFpbnQobHIpOwotICAgIHRtcExheWVyLT5sZWY1OEN1dFNwYWNpbmdDb25zdHJhaW50cy5wdXNoX2JhY2soY29uKTsKLSAgICAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5hZGRDb25zdHJhaW50KGNvbik7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0vLyBsZWZkZWYgcmVmIHNwYWNpbmcKLWludCBpbzo6UGFyc2VyOjpnZXRMZWY1OEN1dFNwYWNpbmdfYWRqYWNlbnRDdXRzKHZvaWQgKmRhdGEsIGZyTGF5ZXIqIHRtcExheWVyLCBjb25zdCBzdHJpbmcgJnNJbikgewotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLQotICBib29sICAgICBza2lwICAgICAgICAgICAgICA9IGZhbHNlOwotCi0gIGZyQ29vcmQgIGN1dFNwYWNpbmcgICAgICAgID0gMDsKLSAgZnJVSW50NCAgbnVtQWRqQ3V0cyAgICAgICAgPSAwOwotICAvLyB0d28gY3V0cwotICBib29sICAgICBoYXNUd29DdXRzICAgICAgICA9IGZhbHNlOwotICBmclVJbnQ0ICB0d29DdXRzICAgICAgICAgICA9IDA7Ci0gIGJvb2wgICAgIGhhc1R3b0N1dHNTcGFjaW5nID0gZmFsc2U7Ci0gIGZyQ29vcmQgIHR3b0N1dHNTcGFjaW5nICAgID0gMDsKLSAgYm9vbCAgICAgaGFzU2FtZUN1dCAgICAgICAgPSBmYWxzZTsKLSAgLy8gd2l0aGluCi0gIGZyQ29vcmQgIGN1dFdpdGhpbjEgICAgICAgID0gMDsKLSAgZnJDb29yZCAgY3V0V2l0aGluMiAgICAgICAgPSAwOwotICAvLyBjdXRjbGFzcwotICBmclN0cmluZyBjbGFzc05hbWUgICAgICAgICA9ICIiOwotICBib29sICAgICBoYXNUb0FsbCAgICAgICAgICA9IGZhbHNlOwotCi0gIGlzdHJpbmdzdHJlYW0gaXN0cihzSW4pOwotICBzdHJpbmcgd29yZDsKLQotICBzdHJpbmcga2V5d29yZCA9ICIiOwotICBpbnQgc3RhZ2UgPSAwOwotICB3aGlsZSAoaXN0ciA+PiB3b3JkKSB7Ci0gICAgaWYgKHdvcmQgPT0gc3RyaW5nKCJTUEFDSU5HIikpIHsKLSAgICAgIGRvdWJsZSB0bXA7Ci0gICAgICBpZiAoaXN0ciA+PiB0bXApIHsKLSAgICAgICAgY3V0U3BhY2luZyA9IGZyQ29vcmQocm91bmQodG1wICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogZ2V0TGVmNThDdXRTcGFjaW5nX2FkamFjZW50Q3V0cyIgPDxlbmRsOwotICAgICAgfQotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8ZW5kbCA8PCIgIFNQQUNJTkcgIiA8PHRtcDsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJBREpBQ0VOVENVVFMiKSkgewotICAgICAgaWYgKGlzdHIgPj4gbnVtQWRqQ3V0cykgewotICAgICAgICA7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb3V0IDw8IkVycm9yOiBnZXRMZWY1OEN1dFNwYWNpbmdfYWRqYWNlbnRDdXRzIiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiIEFESkFDRU5UQ1VUUyAiIDw8bnVtQWRqQ3V0czsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJFWEFDVEFMSUdORUQiKSkgewotICAgICAgc2tpcCA9IHRydWU7Ci0gICAgICBkb3VibGUgdG1wOwotICAgICAgaWYgKGlzdHIgPj4gdG1wKSB7Ci0gICAgICAgIC8vY3V0U3BhY2luZyA9IGZyQ29vcmQocm91bmQodG1wICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogZ2V0TGVmNThDdXRTcGFjaW5nX2FkamFjZW50Q3V0cyIgPDxlbmRsOwotICAgICAgfQotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8IiBFWEFDVEFMSUdORUQoU0tJUCkiOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAod29yZCA9PSBzdHJpbmcoIlRXT0NVVFMiKSkgewotICAgICAgaGFzVHdvQ3V0cyA9IHRydWU7Ci0gICAgICBpZiAoaXN0ciA+PiB0d29DdXRzKSB7Ci0gICAgICAgIDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiRXJyb3I6IGdldExlZjU4Q3V0U3BhY2luZ19hZGphY2VudEN1dHMiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgVFdPQ1VUUyAiIDw8dHdvQ3V0czsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJUV09DVVRTU1BBQ0lORyIpKSB7Ci0gICAgICBoYXNUd29DdXRzU3BhY2luZyA9IHRydWU7Ci0gICAgICBkb3VibGUgdG1wOwotICAgICAgaWYgKGlzdHIgPj4gdG1wKSB7Ci0gICAgICAgIHR3b0N1dHNTcGFjaW5nID0gZnJDb29yZChyb3VuZCh0bXAgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb3V0IDw8IkVycm9yOiBnZXRMZWY1OEN1dFNwYWNpbmdfYWRqYWNlbnRDdXRzIiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiIFRXT0NVVFNTUEFDSU5HICIgPDx0bXA7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiU0FNRUNVVCIpKSB7Ci0gICAgICBoYXNTYW1lQ3V0ID0gdHJ1ZTsKLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgU0FNRUNVVCI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiV0lUSElOIikpIHsKLSAgICAgIHN0YWdlID0gMTsKLSAgICAgIGRvdWJsZSB0bXA7Ci0gICAgICBpZiAoaXN0ciA+PiB0bXApIHsKLSAgICAgICAgY3V0V2l0aGluMSA9IGZyQ29vcmQocm91bmQodG1wICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSkpOwotICAgICAgICBjdXRXaXRoaW4yID0gZnJDb29yZChyb3VuZCh0bXAgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb3V0IDw8IkVycm9yOiBnZXRMZWY1OEN1dFNwYWNpbmdfYWRqYWNlbnRDdXRzIiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiIFdJVEhJTiAiIDw8dG1wOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAod29yZCA9PSBzdHJpbmcoIkVYQ0VQVFNBTUVQR05FVCIpKSB7Ci0gICAgICBza2lwID0gdHJ1ZTsKLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgRVhDRVBUU0FNRVBHTkVUKFNLSVApIjsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJFWENFUFRBTExXSVRISU4iKSkgewotICAgICAgc2tpcCA9IHRydWU7Ci0gICAgICBkb3VibGUgdG1wOwotICAgICAgaWYgKGlzdHIgPj4gdG1wKSB7Ci0gICAgICAgIDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiRXJyb3I6IGdldExlZjU4Q3V0U3BhY2luZ19hZGphY2VudEN1dHMiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgRVhDRVBUQUxMV0lUSElOKFNLSVApICIgPDx0bXA7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiRU5DTE9TVVJFIikpIHsKLSAgICAgIHNraXAgPSB0cnVlOwotICAgICAgc3RyaW5nIHRtcDsKLSAgICAgIGlmIChpc3RyID4+IHRtcCkgewotICAgICAgICA7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb3V0IDw8IkVycm9yOiBnZXRMZWY1OEN1dFNwYWNpbmdfYWRqYWNlbnRDdXRzIiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiIEVOQ0xPU1VSRShTS0lQKSAiIDw8dG1wOwotICAgICAgfQotICAgICAgZG91YmxlIHRtcEQ7Ci0gICAgICBpZiAoaXN0ciA+PiB0bXBEKSB7Ci0gICAgICAgIDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiRXJyb3I6IGdldExlZjU4Q3V0U3BhY2luZ19hZGphY2VudEN1dHMiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgIiA8PHRtcEQ7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiQ1VUQ0xBU1MiKSkgewotICAgICAgaWYgKGlzdHIgPj4gY2xhc3NOYW1lKSB7Ci0gICAgICAgIDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiRXJyb3I6IGdldExlZjU4Q3V0U3BhY2luZ19hZGphY2VudEN1dHMiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgQ1VUQ0xBU1MgIiA8PGNsYXNzTmFtZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJUTyIpKSB7Ci0gICAgICBoYXNUb0FsbCA9IHRydWU7Ci0gICAgICBzdHJpbmcgdG1wOwotICAgICAgaWYgKGlzdHIgPj4gdG1wKSB7Ci0gICAgICAgIGlmICh0bXAgPT0gIkFMTCIpIHsKLSAgICAgICAgICA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgY291dCA8PCJFcnJvcjogZ2V0TGVmNThDdXRTcGFjaW5nX2FkamFjZW50Q3V0cyIgPDxlbmRsOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb3V0IDw8IkVycm9yOiBnZXRMZWY1OEN1dFNwYWNpbmdfYWRqYWNlbnRDdXRzIiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiIFRPIEFMTCI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiTk9QUkwiKSkgewotICAgICAgc2tpcCA9IHRydWU7Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiIE5PUFJMKFNLSVApIjsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJTSURFUEFSQUxMRUxPVkVSTEFQIikpIHsKLSAgICAgIHNraXAgPSB0cnVlOwotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8IiBTSURFUEFSQUxMRUxPVkVSTEFQKFNLSVApIjsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJTQU1FTUFTSyIpKSB7Ci0gICAgICBza2lwID0gdHJ1ZTsKLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgU0FNRU1BU0soU0tJUCkiOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAod29yZCA9PSBzdHJpbmcoIjsiKSkgewotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8IiA7IjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKHN0YWdlID09IDEpIHsKLSAgICAgICAgZG91YmxlIHRtcDsKLSAgICAgICAgaWYgKGlzdHIgPj4gdG1wKSB7Ci0gICAgICAgICAgY3V0V2l0aGluMiA9IGZyQ29vcmQocm91bmQodG1wICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGNvdXQgPDwiRXJyb3I6IGdldExlZjU4Q3V0U3BhY2luZ19hZGphY2VudEN1dHMiIDw8ZW5kbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgY291dCA8PCIgIiA8PHRtcDsKLSAgICAgICAgfQotICAgICAgICBzdGFnZSA9IDA7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgY291dCA8PCIgIiA8PHdvcmQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAoc2tpcCkgewotICAgIDsKLSAgfSBlbHNlewotICAgIGF1dG8gYWMgPSBtYWtlX3NoYXJlZDxmckxlZjU4Q3V0U3BhY2luZ0FkamFjZW50Q3V0c0NvbnN0cmFpbnQ+KCk7Ci0gICAgYWMtPnNldE51bUFkakN1dHMobnVtQWRqQ3V0cyk7Ci0gICAgaWYgKGhhc1R3b0N1dHMpIHsKLSAgICAgIGlmIChoYXNUd29DdXRzU3BhY2luZykgewotICAgICAgICBhYy0+c2V0VHdvQ3V0cyh0d29DdXRzLCB0d29DdXRzU3BhY2luZywgaGFzU2FtZUN1dCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBhYy0+c2V0VHdvQ3V0cyh0d29DdXRzLCBoYXNTYW1lQ3V0KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgYWMtPnNldFdpdGhpbihjdXRXaXRoaW4xLCBjdXRXaXRoaW4yKTsKLSAgICBpZiAoIShjbGFzc05hbWUgPT0gIiIpKSB7Ci0gICAgICBhYy0+c2V0Q3V0Q2xhc3MoY2xhc3NOYW1lLCBoYXNUb0FsbCk7Ci0gICAgfQotCi0gICAgYXV0byBjb24gPSBtYWtlX3NoYXJlZDxmckxlZjU4Q3V0U3BhY2luZ0NvbnN0cmFpbnQ+KCk7Ci0gICAgY29uLT5zZXRDdXRTcGFjaW5nKGN1dFNwYWNpbmcpOwotICAgIGNvbi0+c2V0QWRqYWNlbnRDdXRzQ29uc3RyYWludChhYyk7Ci0gICAgdG1wTGF5ZXItPmxlZjU4Q3V0U3BhY2luZ0NvbnN0cmFpbnRzLnB1c2hfYmFjayhjb24pOwotICAgICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmFkZENvbnN0cmFpbnQoY29uKTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotaW50IGlvOjpQYXJzZXI6OmdldExlZjU4Q3V0U3BhY2luZ19wYXJhbGxlbFdpdGhpbih2b2lkICpkYXRhLCBmckxheWVyKiB0bXBMYXllciwgY29uc3Qgc3RyaW5nICZzSW4pIHsKLSAgYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0KLSAgYm9vbCAgICAgc2tpcCAgICAgICAgICAgICA9IGZhbHNlOwotICBmckNvb3JkICBjdXRTcGFjaW5nICAgICAgID0gMDsKLSAgZnJDb29yZCAgd2l0aGluICAgICAgICAgICA9IDA7Ci0gIGJvb2wgICAgIGhhc0V4Y2VwdFNhbWVOZXQgPSBmYWxzZTsKLSAgYm9vbCAgICAgaGFzQ3V0Q2xhc3MgICAgICA9IGZhbHNlOwotICBmclN0cmluZyBjbGFzc05hbWUgICAgICAgID0gIiI7Ci0gIGJvb2wgICAgIGhhc0xvbmdFZGdlT25seSAgPSBmYWxzZTsKLSAgLy9ib29sICAgICBoYXNFbmMgICAgICAgICAgID0gZmFsc2U7Ci0gIGZyQ29vcmQgIGVuY2xvc3VyZSAgICAgICAgPSAwOwotICBib29sICAgICBpc0Fib3ZlICAgICAgICAgID0gZmFsc2U7Ci0gIC8vYm9vbCAgICAgaGFzUGFyYWxsZWwgICAgICA9IGZhbHNlOwotICBmckNvb3JkICBwYXJMZW5ndGggICAgICAgID0gMDsKLSAgZnJDb29yZCAgcGFyV2l0aGluICAgICAgICA9IDA7Ci0KLSAgaXN0cmluZ3N0cmVhbSBpc3RyKHNJbik7Ci0gIHN0cmluZyB3b3JkOwotCi0gIHN0cmluZyBrZXl3b3JkID0gIiI7Ci0gIGludCBzdGFnZSA9IDA7Ci0gIHdoaWxlIChpc3RyID4+IHdvcmQpIHsKLSAgICBpZiAod29yZCA9PSBzdHJpbmcoIlNQQUNJTkciKSkgewotICAgICAgZG91YmxlIHRtcDsKLSAgICAgIGlmIChpc3RyID4+IHRtcCkgewotICAgICAgICBjdXRTcGFjaW5nID0gZnJDb29yZChyb3VuZCh0bXAgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb3V0IDw8IkVycm9yOiBnZXRMZWY1OEN1dFNwYWNpbmdfcGFyYWxsZWxXaXRoaW4iIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PGVuZGwgPDwiICBTUEFDSU5HICIgPDx0bXA7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiUEFSQUxMRUxXSVRISU4iKSkgewotICAgICAgZG91YmxlIHRtcDsKLSAgICAgIGlmIChpc3RyID4+IHRtcCkgewotICAgICAgICB3aXRoaW4gPSBmckNvb3JkKHJvdW5kKHRtcCAqICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmdldERCVVBlclVVKCkpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiRXJyb3I6IGdldExlZjU4Q3V0U3BhY2luZ19wYXJhbGxlbFdpdGhpbiIgPDxlbmRsOwotICAgICAgfQotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8IiBQQVJBTExFTFdJVEhJTiAiIDw8dG1wOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAod29yZCA9PSBzdHJpbmcoIkVYQ0VQVFNBTUVORVQiKSkgewotICAgICAgaGFzRXhjZXB0U2FtZU5ldCA9IHRydWU7Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiIEVYQ0VQVFNBTUVORVQiOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAod29yZCA9PSBzdHJpbmcoIkNVVENMQVNTIikpIHsKLSAgICAgIGhhc0N1dENsYXNzID0gdHJ1ZTsKLSAgICAgIGlmIChpc3RyID4+IGNsYXNzTmFtZSkgewotICAgICAgICA7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb3V0IDw8IkVycm9yOiBnZXRMZWY1OEN1dFNwYWNpbmdfcGFyYWxsZWxXaXRoaW4iIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgQ1VUQ0xBU1MgIiA8PGNsYXNzTmFtZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJMT05HRURHRU9OTFkiKSkgewotICAgICAgaGFzTG9uZ0VkZ2VPbmx5ID0gdHJ1ZTsKLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgTE9OR0VER0VPTkxZIjsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJFTkNMT1NVUkUiKSkgewotICAgICAgLy9oYXNFbmMgPSB0cnVlOwotICAgICAgZG91YmxlIHRtcDsKLSAgICAgIGlmIChpc3RyID4+IHRtcCkgewotICAgICAgICBlbmNsb3N1cmUgPSBmckNvb3JkKHJvdW5kKHRtcCAqICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmdldERCVVBlclVVKCkpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiRXJyb3I6IGdldExlZjU4Q3V0U3BhY2luZ19wYXJhbGxlbFdpdGhpbiIgPDxlbmRsOwotICAgICAgfQotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8IiBFTkNMT1NVUkUgIiA8PHRtcDsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJBQk9WRSIpKSB7Ci0gICAgICBpc0Fib3ZlID0gdHJ1ZTsKLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgQUJPVkUiOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAod29yZCA9PSBzdHJpbmcoIkJFTE9XIikpIHsKLSAgICAgIGlzQWJvdmUgPSBmYWxzZTsKLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgQkVMT1ciOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAod29yZCA9PSBzdHJpbmcoIlBBUkFMTEVMIikpIHsKLSAgICAgIC8vaGFzUGFyYWxsZWwgPSB0cnVlOwotICAgICAgZG91YmxlIHRtcDsKLSAgICAgIGlmIChpc3RyID4+IHRtcCkgewotICAgICAgICBwYXJMZW5ndGggPSBmckNvb3JkKHJvdW5kKHRtcCAqICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmdldERCVVBlclVVKCkpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiRXJyb3I6IGdldExlZjU4Q3V0U3BhY2luZ19wYXJhbGxlbFdpdGhpbiIgPDxlbmRsOwotICAgICAgfQotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8IiBQQVJBTExFTCAiIDw8dG1wOwotICAgICAgfQotICAgICAgc3RhZ2UgPSAxOwotICAgIH0gZWxzZSBpZiAoc3RhZ2UgPT0gMSAmJiB3b3JkID09IHN0cmluZygiV0lUSElOIikpIHsKLSAgICAgIGRvdWJsZSB0bXA7Ci0gICAgICBpZiAoaXN0ciA+PiB0bXApIHsKLSAgICAgICAgcGFyV2l0aGluID0gZnJDb29yZChyb3VuZCh0bXAgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb3V0IDw8IkVycm9yOiBnZXRMZWY1OEN1dFNwYWNpbmdfcGFyYWxsZWxXaXRoaW4iIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgV0lUSElOICIgPDx0bXA7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgIiA8PHdvcmQ7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKHNraXApIHsKLSAgICA7Ci0gIH0gZWxzZSB7Ci0gICAgYXV0byBwdyA9IG1ha2Vfc2hhcmVkPGZyTGVmNThDdXRTcGFjaW5nUGFyYWxsZWxXaXRoaW5Db25zdHJhaW50PigpOwotICAgIHB3LT5zZXRQYXJhbGxlbFdpdGhpbih3aXRoaW4sIGhhc0V4Y2VwdFNhbWVOZXQpOwotICAgIGlmIChoYXNDdXRDbGFzcykgewotICAgICAgcHctPnNldENsYXNzTmFtZShjbGFzc05hbWUpOwotICAgICAgcHctPnNldExvbmdFZGdlT25seShoYXNMb25nRWRnZU9ubHkpOwotICAgICAgcHctPnNldEVuY2xvc3VyZShlbmNsb3N1cmUsIGlzQWJvdmUpOwotICAgICAgcHctPnNldFBhcmFsbGVsKHBhckxlbmd0aCwgcGFyV2l0aGluKTsKLSAgICB9Ci0KLSAgICBhdXRvIGNvbiA9IG1ha2Vfc2hhcmVkPGZyTGVmNThDdXRTcGFjaW5nQ29uc3RyYWludD4oKTsKLSAgICBjb24tPnNldEN1dFNwYWNpbmcoY3V0U3BhY2luZyk7Ci0gICAgY29uLT5zZXRQYXJhbGxlbFdpdGhpbkNvbnN0cmFpbnQocHcpOwotICAgIHRtcExheWVyLT5sZWY1OEN1dFNwYWNpbmdDb25zdHJhaW50cy5wdXNoX2JhY2soY29uKTsKLSAgICAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5hZGRDb25zdHJhaW50KGNvbik7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBpbzo6UGFyc2VyOjpnZXRMZWY1OEN1dFNwYWNpbmdUYWJsZSh2b2lkICpkYXRhLCBmckxheWVyKiB0bXBMYXllciwgY29uc3Qgc3RyaW5nICZzSW4pIHsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICBjb3V0IDw8ZW5kbCA8PCIgIFBST1BFUlRZIExFRjU4X1NQQUNJTkdUQUJMRSBcIiI7Ci0gIH0KLSAgaXN0cmluZ3N0cmVhbSBpc3RyKHNJbik7Ci0gIHN0cmluZyB3b3JkOwotICBzdHJpbmdzdHJlYW0gc3M7Ci0gIHdoaWxlIChpc3RyID4+IHdvcmQpIHsKLSAgICBpZiAod29yZCA9PSBzdHJpbmcoIlNQQUNJTkdUQUJMRSIpKSB7Ci0gICAgICBzcy5zdHIoIiIpOwotICAgICAgc3MgPDx3b3JkOwotICAgIH0gZWxzZSBpZiAod29yZCA9PSAiOyIpIHsKLSAgICAgIHNzIDw8IiAiIDw8d29yZDsKLSAgICAgIGdldExlZjU4Q3V0U3BhY2luZ1RhYmxlX2hlbHBlcihkYXRhLCB0bXBMYXllciwgc3Muc3RyKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzcyA8PCIgIiA8PHdvcmQ7Ci0gICAgfQotICB9Ci0gIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICBjb3V0IDw8IlwiIDsiIDw8ZW5kbDsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotaW50IGlvOjpQYXJzZXI6OmdldExlZjU4Q3V0U3BhY2luZ1RhYmxlX2hlbHBlcih2b2lkICpkYXRhLCBmckxheWVyKiB0bXBMYXllciwgY29uc3Qgc3RyaW5nICZzSW4pIHsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIC8vYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLSAgLy9pZiAoZW5hYmxlT3V0cHV0KSB7Ci0gIC8vICBjb3V0IDw8ZW5kbCA8PCIgIFBST1BFUlRZIExFRjU4X1NQQUNJTkdUQUJMRSBcIiIgPDxlbmRsOwotICAvL30KLQotICBzdHJpbmcga2V5d29yZCA9ICIiOwotCi0gIGlzdHJpbmdzdHJlYW0gaXN0cihzSW4pOwotICBzdHJpbmcgd29yZDsKLSAgc3RyaW5nc3RyZWFtIHNzOwotICB3aGlsZSAoaXN0ciA+PiB3b3JkKSB7Ci0gICAgaWYgKHdvcmQgPT0gc3RyaW5nKCJTUEFDSU5HVEFCTEUiKSkgewotICAgICAga2V5d29yZCA9ICIiOwotICAgICAgc3Muc3RyKCIiKTsKLSAgICAgIHNzIDw8d29yZDsKLSAgICAgIC8vaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgLy8gIGNvdXQgPDwiICBTUEFDSU5HVEFCTEUiOwotICAgICAgLy99Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiQ0VOVEVSU1BBQ0lORyIpKSB7Ci0gICAgICAvL2lmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgIC8vICBjb3V0IDw8IiBDRU5URVJTUEFDSU5HIjsKLSAgICAgIC8vfQotICAgICAga2V5d29yZCA9ICJDRU5URVJTUEFDSU5HIjsKLSAgICAgIHNzIDw8IiAiIDw8d29yZDsKLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJPUlRIT0dPTkFMIikpIHsKLSAgICAgIC8vaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgLy8gIGNvdXQgPDwiIENFTlRFUlNQQUNJTkciOwotICAgICAgLy99Ci0gICAgICBrZXl3b3JkID0gIk9SVEhPR09OQUwiOwotICAgICAgc3MgPDwiICIgPDx3b3JkOwotICAgIH0gZWxzZSB7Ci0gICAgICBzcyA8PCIgIiA8PHdvcmQ7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGtleXdvcmQgPT0gIkNFTlRFUlNQQUNJTkciKSB7Ci0gICAgOyAvL3NraXAgY2VudGVyIHNwYWNpbmcgcnVsZXMKLSAgfSBlbHNlIGlmIChrZXl3b3JkID09ICJPUlRIT0dPTkFMIikgewotICAgIDsgLy9za2lwIG9ydGhvZ29uYWwgcnVsZXMKLSAgfSBlbHNlIHsKLSAgICBnZXRMZWY1OEN1dFNwYWNpbmdUYWJsZV9vdGhlcnMoZGF0YSwgdG1wTGF5ZXIsIHNzLnN0cigpKTsKLSAgfQotICAKLSAgLy9pZiAoZW5hYmxlT3V0cHV0KSB7Ci0gIC8vICBjb3V0IDw8IlwiIDsiIDw8ZW5kbDsKLSAgLy99Ci0KLSAgcmV0dXJuIDA7Ci0KLX0KLQotaW50IGlvOjpQYXJzZXI6OmdldExlZjU4Q3V0U3BhY2luZ1RhYmxlX2RlZmF1bHQodm9pZCAqZGF0YSwgZnJMYXllciogdG1wTGF5ZXIsIGNvbnN0IHN0cmluZyAmc0luLCAKLSAgICBjb25zdCBzaGFyZWRfcHRyPGZyTGVmNThDdXRTcGFjaW5nVGFibGVDb25zdHJhaW50PiAmY29uKSB7Ci0gIC8vY291dCA8PHNJbiA8PGVuZGw7Ci0gIC8vYm9vbCBlbmFibGVPdXRwdXQgPSB0cnVlOwotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICAKLSAgZnJDb29yZCBkZWZhdWx0Q3V0U3BhY2luZyA9IDA7Ci0KLSAgaXN0cmluZ3N0cmVhbSBpc3RyKHNJbik7Ci0gIHN0cmluZyB3b3JkOwotCi0gIHdoaWxlIChpc3RyID4+IHdvcmQpIHsKLSAgICBpZiAod29yZCA9PSBzdHJpbmcoIkRFRkFVTFQiKSkgewotICAgICAgZG91YmxlIHRtcDsKLSAgICAgIGlmIChpc3RyID4+IHRtcCkgewotICAgICAgICBkZWZhdWx0Q3V0U3BhY2luZyA9IGZyQ29vcmQocm91bmQodG1wICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogZ2V0TGVmNThDdXRTcGFjaW5nVGFibGVfZGVmYXVsdCIgPDxlbmRsOwotICAgICAgfQotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8ZW5kbCA8PCIgIERFRkFVTFQgIiA8PHRtcDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgOyAvLyBza2lwIHVua25vd24gcnVsZXMKLSAgICB9Ci0gIH0KLQotICBjb24tPnNldERlZmF1bHRDdXRTcGFjaW5nKGRlZmF1bHRDdXRTcGFjaW5nKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBpbzo6UGFyc2VyOjpnZXRMZWY1OEN1dFNwYWNpbmdUYWJsZV9wcmwodm9pZCAqZGF0YSwgZnJMYXllciogdG1wTGF5ZXIsIGNvbnN0IHN0cmluZyAmc0luLCAKLSAgICBjb25zdCBzaGFyZWRfcHRyPGZyTGVmNThDdXRTcGFjaW5nVGFibGVDb25zdHJhaW50PiAmY29uKSB7Ci0gIC8vY291dCA8PHNJbiA8PGVuZGw7Ci0gIC8vYm9vbCBlbmFibGVPdXRwdXQgPSB0cnVlOwotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICAKLSAgZnJDb29yZCBwcmwgICAgICAgICAgPSAwOwotICBib29sICAgIGlzSG9yaXpvbnRhbCA9IGZhbHNlOwotICBib29sICAgIGlzVmVydGljYWwgICA9IGZhbHNlOwotICBib29sICAgIGlzTWF4WFkgICAgICA9IGZhbHNlOwotCi0gIGlzdHJpbmdzdHJlYW0gaXN0cihzSW4pOwotICBzdHJpbmcgd29yZDsKLQotICB3aGlsZSAoaXN0ciA+PiB3b3JkKSB7Ci0gICAgaWYgKHdvcmQgPT0gc3RyaW5nKCJQUkwiKSkgewotICAgICAgZG91YmxlIHRtcDsKLSAgICAgIGlmIChpc3RyID4+IHRtcCkgewotICAgICAgICBwcmwgPSBmckNvb3JkKHJvdW5kKHRtcCAqICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmdldERCVVBlclVVKCkpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiRXJyb3I6IGdldExlZjU4Q3V0U3BhY2luZ1RhYmxlX3BybCIgPDxlbmRsOwotICAgICAgfQotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8IiBQUkwgIiA8PHRtcDsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJIT1JJWk9OVEFMIikpIHsKLSAgICAgIGlzSG9yaXpvbnRhbCA9IHRydWU7Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiIEhPUklaT05UQUwiOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAod29yZCA9PSBzdHJpbmcoIlZFUlRJQ0FMIikpIHsKLSAgICAgIGlzVmVydGljYWwgPSB0cnVlOwotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8IiBWRVJUSUNBTCI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiTUFYWFkiKSkgewotICAgICAgaXNNYXhYWSA9IHRydWU7Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiIE1BWFhZIjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgOyAvLyBza2lwIHVua25vd24gcnVsZXMKLSAgICB9Ci0gIH0KLQotICBhdXRvIHB0ciA9IG1ha2Vfc2hhcmVkPGZyTGVmNThDdXRTcGFjaW5nVGFibGVQcmxDb25zdHJhaW50PigpOwotICBwdHItPnNldFBybChwcmwpOwotICBwdHItPnNldEhvcml6b250YWwoaXNIb3Jpem9udGFsKTsKLSAgcHRyLT5zZXRWZXJ0aWNhbChpc1ZlcnRpY2FsKTsKLSAgcHRyLT5zZXRNYXhYWShpc01heFhZKTsKLSAgY29uLT5zZXRQcmxDb25zdHJhaW50KHB0cik7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBpbzo6UGFyc2VyOjpnZXRMZWY1OEN1dFNwYWNpbmdUYWJsZV9sYXllcih2b2lkICpkYXRhLCBmckxheWVyKiB0bXBMYXllciwgY29uc3Qgc3RyaW5nICZzSW4sIAotICAgIGNvbnN0IHNoYXJlZF9wdHI8ZnJMZWY1OEN1dFNwYWNpbmdUYWJsZUNvbnN0cmFpbnQ+ICZjb24sIGZyTGF5ZXJOdW0gJnNlY29uZExheWVyTnVtKSB7Ci0KLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0KLSAgZnJTdHJpbmcgc2Vjb25kTGF5ZXJOYW1lICAgID0gIiI7Ci0gIGJvb2wgICAgIGlzTm9uWmVyb0VuY2xvc3VyZSA9IGZhbHNlOwotCi0gIGlzdHJpbmdzdHJlYW0gaXN0cihzSW4pOwotICBzdHJpbmcgd29yZDsKLQotICB3aGlsZSAoaXN0ciA+PiB3b3JkKSB7Ci0gICAgaWYgKHdvcmQgPT0gc3RyaW5nKCJMQVlFUiIpKSB7Ci0gICAgICBpZiAoaXN0ciA+PiBzZWNvbmRMYXllck5hbWUpIHsKLSAgICAgICAgOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogZ2V0TGVmNThDdXRTcGFjaW5nVGFibGVfbGF5ZXIiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgTEFZRVIgIiA8PHNlY29uZExheWVyTmFtZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJOT05aRVJPRU5DTE9TVVJFIikpIHsKLSAgICAgIGlzTm9uWmVyb0VuY2xvc3VyZSA9IHRydWU7Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDxlbmRsIDw8IiAgTk9OWkVST0VOQ0xPU1VSRSI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIDsgLy8gc2tpcCB1bmtub3duIHJ1bGVzCi0gICAgfQotICB9Ci0KLSAgYXV0byBwdHIgPSBtYWtlX3NoYXJlZDxmckxlZjU4Q3V0U3BhY2luZ1RhYmxlTGF5ZXJDb25zdHJhaW50PigpOwotICAvL2NvdXQgPDxzZWNvbmRMYXllck5hbWUgPDxlbmRsIDw8Zmx1c2g7Ci0gIHNlY29uZExheWVyTnVtID0gKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+bmFtZTJsYXllci5hdChzZWNvbmRMYXllck5hbWUpLT5nZXRMYXllck51bSgpOwotICBwdHItPnNldFNlY29uZExheWVyTnVtKHNlY29uZExheWVyTnVtKTsKLSAgcHRyLT5zZXROb25aZXJvRW5jKGlzTm9uWmVyb0VuY2xvc3VyZSk7Ci0gIGNvbi0+c2V0TGF5ZXJDb25zdHJhaW50KHB0cik7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotaW50IGlvOjpQYXJzZXI6OmdldExlZjU4Q3V0U3BhY2luZ1RhYmxlX2N1dENsYXNzKHZvaWQgKmRhdGEsIGZyTGF5ZXIqIHRtcExheWVyLCBjb25zdCBzdHJpbmcgJnNJbiwgCi0gICAgY29uc3Qgc2hhcmVkX3B0cjxmckxlZjU4Q3V0U3BhY2luZ1RhYmxlQ29uc3RyYWludD4gJmNvbiwgYm9vbCBoYXNTZWNvbmRMYXllciwgZnJMYXllck51bSBzZWNvbmRMYXllck51bSkgewotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLQotICBhdXRvIGRlZmF1bHRDdXRTcGFjaW5nID0gY29uLT5nZXREZWZhdWx0Q3V0U3BhY2luZygpOwotICAvLyAyZCBzcGFjaW5nIHRhYmxlCi0gIC8vZnJDb2xsZWN0aW9uPGZyU3RyaW5nPiByb3dWYWxzLCBjb2xWYWxzOwotICBmckNvbGxlY3Rpb248ZnJDb2xsZWN0aW9uPHBhaXI8ZnJDb29yZCwgZnJDb29yZD4gPiA+IHRibFZhbHM7Ci0gIC8vZnJDb2xsZWN0aW9uPHBhaXI8ZnJDb29yZCwgZnJDb29yZD4gPiB0YmxSb3dWYWxzOwotCi0gIC8vY291dCA8PGVuZGwgPDxzSW4gPDxlbmRsOwotICAvLyBjaGVjayBudW1Sb3dzIGFuZCBudW1Db2xzCi0gIGlzdHJpbmdzdHJlYW0gaXN0cjEoc0luKTsKLSAgc3RyaW5nIHdvcmQ7Ci0gIGludCBudW1Db2xzID0gMDsKLSAgaW50IG51bVJvd3MgPSAwOwotICBib29sIGlzUHJldk51bSAgID0gZmFsc2U7Ci0gIHdoaWxlIChpc3RyMSA+PiB3b3JkKSB7Ci0gICAgLy8gIi0iIGlzIHRyZWF0ZWQgYXMgbnVtYmVyIDAKLSAgICBpZiAod29yZCA9PSAiLSIpIHsKLSAgICAgIHdvcmQgPSAiMCI7Ci0gICAgfQotICAgIHN0cmluZ3N0cmVhbSB0bXBzcyh3b3JkKTsKLSAgICBkb3VibGUgdG1wZDsKLSAgICAvLyBpcyBhIG51bWJlcgotICAgIGlmICh0bXBzcyA+PiB0bXBkKSB7Ci0gICAgICBpc1ByZXZOdW0gPSB0cnVlOwotICAgICAgbnVtQ29scysrOwotICAgIC8vIGlzIGEgc3RyaW5nCi0gICAgfSBlbHNlIHsKLSAgICAgIGlmICh3b3JkID09ICI7IikgewotICAgICAgICBudW1Sb3dzKys7Ci0gICAgICB9IGVsc2UgaWYgKGlzUHJldk51bSkgewotICAgICAgICBudW1Sb3dzKys7Ci0gICAgICAgIG51bUNvbHMgPSAwOwotICAgICAgfQotICAgICAgaXNQcmV2TnVtID0gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgbnVtQ29scyAvPSAyOwotICAvL2NvdXQgPDxlbmRsIDw8IiNyb3dzL2NvbHMgPSAiIDw8bnVtUm93cyA8PCIvIiA8PG51bUNvbHMgPDxlbmRsOwotICAKLSAgdmVjdG9yPGZyU3RyaW5nPiBjb2xOYW1lczsKLSAgdmVjdG9yPGludD4gICAgICBkdXBDb2xOYW1lczsgLy9kdXBsaWNhdGUgc2lkZSBhbmQgYWxsCi0gIAotICB2ZWN0b3I8ZnJTdHJpbmc+IHJvd05hbWVzOwotICB2ZWN0b3I8aW50PiAgICAgIGR1cFJvd05hbWVzOyAvL2R1cGxpY2F0ZSBzaWRlIGFuZCBhbGwKLSAgCi0gIHZlY3Rvcjx2ZWN0b3I8cGFpcjxmckNvb3JkLCBmckNvb3JkPiA+ID4gdG1wVGJsOwotICB2ZWN0b3I8cGFpcjxmckNvb3JkLCBmckNvb3JkPiA+IHRtcFRibFJvdzsKLSAgCi0gIGlzdHJpbmdzdHJlYW0gaXN0cjIoc0luKTsKLSAgd29yZCA9ICIiOwotICBpbnQgc3RhZ2UgPSAwOyAvLyAwID0gcmVhZCBjb2x1bW5zOyAxID0gcmVhZCByb3dzCi0gIGludCByZWFkTnVtID0gMDsgLy8gbnVtYmVycyByZWFkIGluIGEgcm93Ci0gIHdoaWxlIChpc3RyMiA+PiB3b3JkKSB7Ci0gICAgLy8gIi0iIGlzIHRyZWF0ZWQgYXMgbnVtYmVyIDAKLSAgICAvL2lmICh3b3JkID09ICI7IikgewotICAgIC8vICBjb3V0IDw8ImZvdW5kIDsiIDw8ZW5kbDsKLSAgICAvL30KLSAgICBpZiAod29yZCA9PSAiLSIpIHsKLSAgICAgIHdvcmQgPSB0b19zdHJpbmcoZGVmYXVsdEN1dFNwYWNpbmcgKiAxLjAgLyAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKTsKLSAgICB9Ci0gICAgaWYgKHdvcmQgPT0gIkNVVENMQVNTIikgewotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8ZW5kbCA8PCIgIENVVENMQVNTIjsKLSAgICAgIH0KLSAgICAvLyByZWFkIG51bUNvbHMgdGltZXMKLSAgICB9IGVsc2UgaWYgKChpbnQpY29sTmFtZXMuc2l6ZSgpIDwgbnVtQ29scykgewotICAgICAgaWYgKHdvcmQgPT0gIlNJREUiIHx8IHdvcmQgPT0gIkVORCIpIHsKLSAgICAgICAgKigtLWNvbE5hbWVzLmVuZCgpKSA9ICooLS1jb2xOYW1lcy5lbmQoKSkgKyB3b3JkOwotICAgICAgICAqKC0tZHVwQ29sTmFtZXMuZW5kKCkpID0gMTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbE5hbWVzLnB1c2hfYmFjayh3b3JkKTsKLSAgICAgICAgZHVwQ29sTmFtZXMucHVzaF9iYWNrKDIpOwotICAgICAgfQotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8IiAiIDw8d29yZDsKLSAgICAgIH0KLSAgICAgIC8vY291dCA8PCJ0ZXN0WCIgPDxlbmRsOwotICAgIH0gZWxzZSBpZiAoc3RhZ2UgPT0gMCAmJiAoaW50KWNvbE5hbWVzLnNpemUoKSA9PSBudW1Db2xzKSB7Ci0gICAgICAvLyBsYXN0IHdvcmQgb2YgY29sdW1uCi0gICAgICBpZiAod29yZCA9PSAiU0lERSIgfHwgd29yZCA9PSAiRU5EIikgewotICAgICAgICAqKC0tY29sTmFtZXMuZW5kKCkpID0gKigtLWNvbE5hbWVzLmVuZCgpKSArIHdvcmQ7Ci0gICAgICAgICooLS1kdXBDb2xOYW1lcy5lbmQoKSkgPSAxOwotICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgY291dCA8PCIgIiA8PHdvcmQ7Ci0gICAgICAgIH0KLSAgICAgIC8vIGZpcnN0IHdvcmQgb2Ygcm93Ci0gICAgICB9IGVsc2UgewotICAgICAgICByb3dOYW1lcy5wdXNoX2JhY2sod29yZCk7Ci0gICAgICAgIGR1cFJvd05hbWVzLnB1c2hfYmFjaygyKTsKLSAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgIGNvdXQgPDxlbmRsIDw8IiAgIiA8PHdvcmQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHN0YWdlID0gMTsKLSAgICAgIC8vY291dCA8PCJ0ZXN0WFgiIDw8ZW5kbDsKLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gIjsiKSB7Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiIDsiOwotICAgICAgfQotICAgICAgdG1wVGJsLnB1c2hfYmFjayh0bXBUYmxSb3cpOwotICAgICAgLy9jb3V0IDw8InRlc3RYWFgiIDw8ZW5kbDsKLSAgICB9IGVsc2UgaWYgKHN0YWdlID09IDEpIHsKLSAgICAgIGlmICh3b3JkID09ICJTSURFIiB8fCB3b3JkID09ICJFTkQiKSB7Ci0gICAgICAgICooLS1yb3dOYW1lcy5lbmQoKSkgPSAqKC0tcm93TmFtZXMuZW5kKCkpICsgd29yZDsKLSAgICAgICAgKigtLWR1cFJvd05hbWVzLmVuZCgpKSA9IDE7Ci0gICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICBjb3V0IDw8IiAiIDw8d29yZDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3RyaW5nc3RyZWFtIHNzKHdvcmQpOwotICAgICAgICBkb3VibGUgZmlyc3ROdW07Ci0gICAgICAgIC8vY291dCA8PCJ0ZXN0OiAiIDw8d29yZCA8PGVuZGw7Ci0gICAgICAgIC8vIG51bWJlcgotICAgICAgICBpZiAoc3MgPj4gZmlyc3ROdW0pIHsKLSAgICAgICAgICBmckNvb3JkIHZhbDEgPSBmckNvb3JkKHJvdW5kKGZpcnN0TnVtICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSkpOwotICAgICAgICAgIHN0cmluZyB0bXBTOwotICAgICAgICAgIGlmIChpc3RyMiA+PiB0bXBTKSB7Ci0gICAgICAgICAgICA7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvdXQgPDwiRXJyb3I6IGdldExlZjU4Q3V0U3BhY2luZ1RhYmxlX2N1dENsYXNzIiA8PGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgICAgIHN0cmluZ3N0cmVhbSB0bXBTUyh0bXBTKTsKLSAgICAgICAgICBkb3VibGUgc2Vjb25kTnVtOwotICAgICAgICAgIGlmICh0bXBTUyA+PiBzZWNvbmROdW0pIHsKLSAgICAgICAgICAgIGZyQ29vcmQgdmFsMiA9IGZyQ29vcmQocm91bmQoc2Vjb25kTnVtICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSkpOwotICAgICAgICAgICAgdG1wVGJsUm93LnB1c2hfYmFjayhtYWtlX3BhaXIodmFsMSwgdmFsMikpOwotICAgICAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgICAgICBjb3V0IDw8IiAiIDw8Zmlyc3ROdW0gPDwiICIgPDxzZWNvbmROdW07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHRoZSBudW1iZXIgaXMgIi0iLCB1c2UgZGVmYXVsdCBzcGFjaW5nCi0gICAgICAgICAgICBmckNvb3JkIHZhbDIgPSBkZWZhdWx0Q3V0U3BhY2luZzsKLSAgICAgICAgICAgIHRtcFRibFJvdy5wdXNoX2JhY2sobWFrZV9wYWlyKHZhbDEsIHZhbDIpKTsKLSAgICAgICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICAgICAgY291dCA8PCIgIiA8PGZpcnN0TnVtIDw8IiAiIDw8ZGVmYXVsdEN1dFNwYWNpbmcgKiAxLjAgLyAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICByZWFkTnVtICs9IDE7Ci0gICAgICAgIC8vIGZpcnN0IHdvcmQKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByb3dOYW1lcy5wdXNoX2JhY2sod29yZCk7Ci0gICAgICAgICAgZHVwUm93TmFtZXMucHVzaF9iYWNrKDIpOwotICAgICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICAgIGNvdXQgPDxlbmRsIDw8IiAgIiA8PHdvcmQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChyZWFkTnVtKSB7Ci0gICAgICAgICAgICB0bXBUYmwucHVzaF9iYWNrKHRtcFRibFJvdyk7Ci0gICAgICAgICAgICB0bXBUYmxSb3cuY2xlYXIoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmVhZE51bSA9IDA7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vY291dCA8PCJ0ZXN0WFhYWCIgPDxlbmRsOwotICAgIH0KLSAgfQotCi0gIC8vY291dCA8PGVuZGwgPDwiY29sdW1uOiI7Ci0gIC8vZm9yIChhdXRvICZzdHI6IGNvbE5hbWVzKSB7Ci0gIC8vICBjb3V0IDw8IiAiIDw8c3RyOwotICAvL30KLSAgLy8KLSAgLy9jb3V0IDw8ZW5kbCA8PCJyb3c6IjsKLSAgLy9mb3IgKGF1dG8gJnN0cjogcm93TmFtZXMpIHsKLSAgLy8gIGNvdXQgPDwiICIgPDxzdHI7Ci0gIC8vfQotCi0gIC8vY291dCA8PGVuZGwgPDwidGFibGU6ICI7Ci0gIC8vZm9yIChhdXRvICZ2MTogdG1wVGJsKSB7Ci0gIC8vICBjb3V0IDw8InRlc3QgaGVyZSI7Ci0gIC8vICBjb3V0IDw8ZW5kbCA8PCIgICAgIjsKLSAgLy8gIGZvciAoYXV0byAmdjI6IHYxKSB7Ci0gIC8vICAgIGNvdXQgPDwidGVzdCBoZXJlIjsKLSAgLy8gICAgY291dCA8PCIgIiA8PHYyLmZpcnN0IDw8IiAiIDw8djIuc2Vjb25kOwotICAvLyAgfQotICAvL30KLSAgLy9jb3V0IDw8Zmx1c2g7Ci0KLSAgdmVjdG9yPGZyU3RyaW5nPiBleHBDb2xOYW1lczsKLSAgLy9jb3V0IDw8ZW5kbCA8PCJuZXcgZXhwYW5kIGNvbHVtbjoiOwotICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpY29sTmFtZXMuc2l6ZSgpOyBpKyspIHsKLSAgICBpZiAoZHVwQ29sTmFtZXMuYXQoaSkgPT0gMikgewotICAgICAgc3RyaW5nIG5hbWUxID0gY29sTmFtZXMuYXQoaSkgKyAiU0lERSI7Ci0gICAgICBzdHJpbmcgbmFtZTIgPSBjb2xOYW1lcy5hdChpKSArICJFTkQiOwotICAgICAgZXhwQ29sTmFtZXMucHVzaF9iYWNrKG5hbWUxKTsKLSAgICAgIGV4cENvbE5hbWVzLnB1c2hfYmFjayhuYW1lMik7Ci0gICAgICAvL2NvdXQgPDwiICIgPDxuYW1lMSA8PCIgIiA8PG5hbWUyOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdHJpbmcgbmFtZSA9IGNvbE5hbWVzLmF0KGkpOwotICAgICAgZXhwQ29sTmFtZXMucHVzaF9iYWNrKG5hbWUpOwotICAgICAgLy9jb3V0IDw8IiAiIDw8bmFtZTsKLSAgICB9OwotICB9Ci0gIAotICB2ZWN0b3I8ZnJTdHJpbmc+IGV4cFJvd05hbWVzOwotICAvL2NvdXQgPDxlbmRsIDw8Im5ldyBleHBhbmQgcm93czoiOwotICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpcm93TmFtZXMuc2l6ZSgpOyBpKyspIHsKLSAgICBpZiAoZHVwUm93TmFtZXMuYXQoaSkgPT0gMikgewotICAgICAgc3RyaW5nIG5hbWUxID0gcm93TmFtZXMuYXQoaSkgKyAiU0lERSI7Ci0gICAgICBzdHJpbmcgbmFtZTIgPSByb3dOYW1lcy5hdChpKSArICJFTkQiOwotICAgICAgZXhwUm93TmFtZXMucHVzaF9iYWNrKG5hbWUxKTsKLSAgICAgIGV4cFJvd05hbWVzLnB1c2hfYmFjayhuYW1lMik7Ci0gICAgICAvL2NvdXQgPDwiICIgPDxuYW1lMSA8PCIgIiA8PG5hbWUyOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdHJpbmcgbmFtZSA9IHJvd05hbWVzLmF0KGkpOwotICAgICAgZXhwUm93TmFtZXMucHVzaF9iYWNrKG5hbWUpOwotICAgICAgLy9jb3V0IDw8IiAiIDw8bmFtZTsKLSAgICB9OwotICB9Ci0KLSAgdmVjdG9yPHZlY3RvcjxwYWlyPGZyQ29vcmQsIGZyQ29vcmQ+ID4gPiBleHBUbXBUYmw7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClyb3dOYW1lcy5zaXplKCk7IGkrKykgewotICAgIHZlY3RvcjxwYWlyPGZyQ29vcmQsIGZyQ29vcmQ+ID4gZXhwVG1wVGJsUm93OwotICAgIGZvciAoaW50IGogPSAwOyBqIDwgKGludCljb2xOYW1lcy5zaXplKCk7IGorKykgewotICAgICAgZXhwVG1wVGJsUm93LnB1c2hfYmFjayh0bXBUYmwuYXQoaSkuYXQoaikpOwotICAgICAgaWYgKGR1cENvbE5hbWVzLmF0KGopID09IDIpIHsKLSAgICAgICAgZXhwVG1wVGJsUm93LnB1c2hfYmFjayh0bXBUYmwuYXQoaSkuYXQoaikpOwotICAgICAgfQotICAgIH0KLSAgICBleHBUbXBUYmwucHVzaF9iYWNrKGV4cFRtcFRibFJvdyk7Ci0gICAgaWYgKGR1cFJvd05hbWVzLmF0KGkpID09IDIpIHsKLSAgICAgIGV4cFRtcFRibC5wdXNoX2JhY2soZXhwVG1wVGJsUm93KTsKLSAgICB9Ci0gIH0KLSAgLy9jb3V0IDw8Im5ldyBleHBhbmQgdGFibGU6ICI7Ci0gIC8vZm9yIChhdXRvICZ2MTogZXhwVG1wVGJsKSB7Ci0gIC8vICBjb3V0IDw8ZW5kbCA8PCIgICAgIjsKLSAgLy8gIGZvciAoYXV0byAmdjI6IHYxKSB7Ci0gIC8vICAgIGNvdXQgPDwiICIgPDx2Mi5maXJzdCA8PCIgIiA8PHYyLnNlY29uZDsKLSAgLy8gIH0KLSAgLy99Ci0KLSAgdmVjdG9yPHBhaXI8ZnJTdHJpbmcsIGludD4gPiBleHBDb2xOYW1lc19oZWxwZXI7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClleHBDb2xOYW1lcy5zaXplKCk7IGkrKykgewotICAgIGV4cENvbE5hbWVzX2hlbHBlci5wdXNoX2JhY2sobWFrZV9wYWlyKGV4cENvbE5hbWVzLmF0KGkpLCBpKSk7Ci0gIH0KLSAgc29ydChleHBDb2xOYW1lc19oZWxwZXIuYmVnaW4oKSwgZXhwQ29sTmFtZXNfaGVscGVyLmVuZCgpLCAKLSAgICAgICBbXShjb25zdCBwYWlyPGZyU3RyaW5nLCBpbnQ+ICZhLCBjb25zdCBwYWlyPGZyU3RyaW5nLCBpbnQ+ICZiKSAKLSAgICAgICB7cmV0dXJuIGEuZmlyc3QgPCBiLmZpcnN0O30pOwotICBzb3J0KGV4cENvbE5hbWVzLmJlZ2luKCksIGV4cENvbE5hbWVzLmVuZCgpKTsKLQotICAvL2NvdXQgPDxlbmRsIDw8InNvcnRlZCBleHBhbmQgY29sdW1uOiI7Ci0gIC8vZm9yIChhdXRvICZpdDogZXhwQ29sTmFtZXNfaGVscGVyKSB7Ci0gIC8vICBjb3V0IDw8IiAiIDw8aXQuZmlyc3Q7Ci0gIC8vfQotCi0gIHZlY3RvcjxwYWlyPGZyU3RyaW5nLCBpbnQ+ID4gZXhwUm93TmFtZXNfaGVscGVyOwotICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpZXhwUm93TmFtZXMuc2l6ZSgpOyBpKyspIHsKLSAgICBleHBSb3dOYW1lc19oZWxwZXIucHVzaF9iYWNrKG1ha2VfcGFpcihleHBSb3dOYW1lcy5hdChpKSwgaSkpOwotICB9Ci0gIHNvcnQoZXhwUm93TmFtZXNfaGVscGVyLmJlZ2luKCksIGV4cFJvd05hbWVzX2hlbHBlci5lbmQoKSwgCi0gICAgICAgW10oY29uc3QgcGFpcjxmclN0cmluZywgaW50PiAmYSwgY29uc3QgcGFpcjxmclN0cmluZywgaW50PiAmYikgCi0gICAgICAge3JldHVybiBhLmZpcnN0IDwgYi5maXJzdDt9KTsKLSAgc29ydChleHBSb3dOYW1lcy5iZWdpbigpLCBleHBSb3dOYW1lcy5lbmQoKSk7Ci0KLSAgLy9jb3V0IDw8ZW5kbCA8PCJzb3J0ZWQgZXhwYW5kIHJvdzoiOwotICAvL2ZvciAoYXV0byAmaXQ6IGV4cFJvd05hbWVzX2hlbHBlcikgewotICAvLyAgY291dCA8PCIgIiA8PGl0LmZpcnN0OwotICAvL30KLQotICB0YmxWYWxzID0gZXhwVG1wVGJsOwotICAvL2NvdXQgPDxlbmRsIDw8InNvcnRlZCB0Ymw6IjsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KWV4cFJvd05hbWVzX2hlbHBlci5zaXplKCk7IGkrKykgewotICAgIC8vY291dCA8PGVuZGw7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCAoaW50KWV4cENvbE5hbWVzX2hlbHBlci5zaXplKCk7IGorKykgewotICAgICAgaW50IG9yaWdfaSA9IGV4cFJvd05hbWVzX2hlbHBlci5hdChpKS5zZWNvbmQ7Ci0gICAgICBpbnQgb3JpZ19qID0gZXhwQ29sTmFtZXNfaGVscGVyLmF0KGopLnNlY29uZDsKLSAgICAgIHRibFZhbHMuYXQoaSkuYXQoaikgPSBleHBUbXBUYmwuYXQob3JpZ19pKS5hdChvcmlnX2opOwotICAgICAgLy9jb3V0IDw8IiAiIDw8dGJsVmFscy5hdChpKS5hdChqKS5maXJzdCA8PCIgIiA8PHRibFZhbHMuYXQoaSkuYXQoaikuc2Vjb25kOwotICAgIH0KLSAgfQotCi0gIHN0cmluZyByb3dOYW1lKCJDVVRDTEFTUyIpOwotICBzdHJpbmcgY29sTmFtZSgiQ1VUQ0xBU1MiKTsKLSAgYXV0byBwdHIgPSBtYWtlX3NoYXJlZDxmcjJETG9va3VwVGJsPGZyU3RyaW5nLCBmclN0cmluZywgcGFpcjxmckNvb3JkLCBmckNvb3JkPiA+ID4ocm93TmFtZSwgCi0gICAgICBleHBSb3dOYW1lcywgY29sTmFtZSwgZXhwQ29sTmFtZXMsIHRibFZhbHMpOwotICBjb24tPnNldEN1dENsYXNzVGJsKHB0cik7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIGxlZmRlZiByZWYgMm5kIHNwYWNpbmcgdGFibGUsIG5vIG9ydGhvZ29uYWwgY2FzZQotaW50IGlvOjpQYXJzZXI6OmdldExlZjU4Q3V0U3BhY2luZ1RhYmxlX290aGVycyh2b2lkICpkYXRhLCBmckxheWVyKiB0bXBMYXllciwgY29uc3Qgc3RyaW5nICZzSW4pIHsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0KLSAgaXN0cmluZ3N0cmVhbSBpc3RyKHNJbik7Ci0gIHN0cmluZyB3b3JkOwotCi0gIHN0cmluZ3N0cmVhbSBzc0RlZmF1bHQ7Ci0gIHN0cmluZ3N0cmVhbSBzc0xheWVyOyAgICAKLSAgc3RyaW5nc3RyZWFtIHNzUHJsOwotICBzdHJpbmdzdHJlYW0gc3NDdXRDbGFzczsgCi0gIAotICBzdHJpbmcga2V5d29yZCA9ICIiOwotICB3aGlsZSAoaXN0ciA+PiB3b3JkKSB7Ci0gICAgaWYgKHdvcmQgPT0gc3RyaW5nKCJTUEFDSU5HVEFCTEUiKSkgewotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8ZW5kbCA8PCIgIFNQQUNJTkdUQUJMRSI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiREVGQVVMVCIpKSB7Ci0gICAgICBrZXl3b3JkID0gIkRFRkFVTFQiOwotICAgICAgc3NEZWZhdWx0IDw8d29yZDsKLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJTQU1FTUFTSyIpKSB7Ci0gICAgICBrZXl3b3JkID0gIlNBTUVNQVNLIjsKLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJTQU1FTkVUIikgfHwgd29yZCA9PSBzdHJpbmcoIlNBTUVNRVRBTCIpIHx8IHdvcmQgPT0gc3RyaW5nKCJTQU1FVklBIikpIHsKLSAgICAgIGtleXdvcmQgPSAiU0FNRU5FVE1FVEFMVklBIjsKLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJMQVlFUiIpKSB7Ci0gICAgICBrZXl3b3JkID0gIkxBWUVSIjsKLSAgICAgIHNzTGF5ZXIgPDx3b3JkOwotICAgIH0gZWxzZSBpZiAod29yZCA9PSBzdHJpbmcoIkNFTlRFUlRPQ0VOVEVSIikpIHsKLSAgICAgIGtleXdvcmQgPSAiQ0VOVEVSVE9DRU5URVIiOwotICAgIH0gZWxzZSBpZiAod29yZCA9PSBzdHJpbmcoIkNFTlRFUkFOREVER0UiKSkgewotICAgICAga2V5d29yZCA9ICJDRU5URVJBTkRFREdFIjsKLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJQUkwiKSkgewotICAgICAga2V5d29yZCA9ICJQUkwiOwotICAgICAgc3NQcmwgPDwiUFJMIjsKLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJQUkxUV09TSURFUyIpKSB7Ci0gICAgICBrZXl3b3JkID0gIlBSTFRXT1NJREVTIjsKLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJFTkRFWFRFTlNJT04iKSkgewotICAgICAga2V5d29yZCA9ICJFTkRFWFRFTlNJT04iOwotICAgIH0gZWxzZSBpZiAod29yZCA9PSBzdHJpbmcoIkVYQUNUQUxJR05FRFNQQUNJTkciKSkgewotICAgICAga2V5d29yZCA9ICJFWEFDVEFMSUdORURTUEFDSU5HIjsKLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gc3RyaW5nKCJOT05PUFBPU0lURUVOQ0xPU1VSRVNQQUNJTkciKSkgewotICAgICAga2V5d29yZCA9ICJOT05PUFBPU0lURUVOQ0xPU1VSRVNQQUNJTkciOwotICAgIH0gZWxzZSBpZiAod29yZCA9PSBzdHJpbmcoIk9QUE9TSVRFRU5DTE9TVVJFUkVTSVpFU1BBQ0lORyIpKSB7Ci0gICAgICBrZXl3b3JkID0gIk9QUE9TSVRFRU5DTE9TVVJFUkVTSVpFU1BBQ0lORyI7Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IHN0cmluZygiQ1VUQ0xBU1MiKSkgewotICAgICAga2V5d29yZCA9ICJDVVRDTEFTUyI7Ci0gICAgICBzc0N1dENsYXNzIDw8d29yZDsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKGtleXdvcmQgPT0gIkRFRkFVTFQiKSB7Ci0gICAgICAgIHNzRGVmYXVsdCA8PCIgIiA8PHdvcmQ7Ci0gICAgICB9IGVsc2UgaWYgKGtleXdvcmQgPT0gIkNVVENMQVNTIikgewotICAgICAgICBzc0N1dENsYXNzIDw8IiAiIDw8d29yZDsKLSAgICAgIH0gZWxzZSBpZiAoa2V5d29yZCA9PSAiUFJMIikgewotICAgICAgICBzc1BybCA8PCIgIiA8PHdvcmQ7Ci0gICAgICB9IGVsc2UgaWYgKGtleXdvcmQgPT0gIkxBWUVSIikgewotICAgICAgICBzc0xheWVyIDw8IiAiIDw8d29yZDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBhdXRvIGNvbiA9IG1ha2Vfc2hhcmVkPGZyTGVmNThDdXRTcGFjaW5nVGFibGVDb25zdHJhaW50PigpOwotCi0gIGJvb2wgaGFzU2Vjb25kTGF5ZXIgICAgICAgPSBmYWxzZTsKLSAgZnJMYXllck51bSBzZWNvbmRMYXllck51bSA9IDA7Ci0KLSAgYm9vbCBpc0ZpcnN0VmlhTGF5ZXJIYXZpbmdTZWNvbmRMYXllck51bSA9IGZhbHNlOwotCi0gIGlmIChzc0RlZmF1bHQuc3RyKCkgIT0gIiIpIHsKLSAgICBnZXRMZWY1OEN1dFNwYWNpbmdUYWJsZV9kZWZhdWx0KGRhdGEsIHRtcExheWVyLCBzc0RlZmF1bHQuc3RyKCksIGNvbik7Ci0gIH0KLSAgaWYgKHNzUHJsLnN0cigpICE9ICIiKSB7Ci0gICAgZ2V0TGVmNThDdXRTcGFjaW5nVGFibGVfcHJsKGRhdGEsIHRtcExheWVyLCBzc1BybC5zdHIoKSwgY29uKTsKLSAgfQotICBpZiAoc3NMYXllci5zdHIoKSAhPSAiIikgewotICAgIGlmICh0bXBMYXllci0+Z2V0TGF5ZXJOdW0oKSA9PSAxKSB7Ci0gICAgICBpc0ZpcnN0VmlhTGF5ZXJIYXZpbmdTZWNvbmRMYXllck51bSA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdldExlZjU4Q3V0U3BhY2luZ1RhYmxlX2xheWVyKGRhdGEsIHRtcExheWVyLCBzc0xheWVyLnN0cigpLCBjb24sIHNlY29uZExheWVyTnVtKTsKLSAgICB9Ci0gIH0KLSAgaWYgKHNzQ3V0Q2xhc3Muc3RyKCkgIT0gIiIgJiYgIWlzRmlyc3RWaWFMYXllckhhdmluZ1NlY29uZExheWVyTnVtKSB7Ci0gICAgZ2V0TGVmNThDdXRTcGFjaW5nVGFibGVfY3V0Q2xhc3MoZGF0YSwgdG1wTGF5ZXIsIHNzQ3V0Q2xhc3Muc3RyKCksIGNvbiwgaGFzU2Vjb25kTGF5ZXIsIHNlY29uZExheWVyTnVtKTsKLSAgfQotCi0gIGlmIChpc0ZpcnN0VmlhTGF5ZXJIYXZpbmdTZWNvbmRMYXllck51bSkgewotICAgIDsKLSAgfSBlbHNlIHsKLSAgICB0bXBMYXllci0+bGVmNThDdXRTcGFjaW5nVGFibGVDb25zdHJhaW50cy5wdXNoX2JhY2soY29uKTsKLSAgICAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5hZGRDb25zdHJhaW50KGNvbik7Ci0KLSAgICAvL2lmIChzc0xheWVyLnN0cigpID09ICIiKSB7Ci0gICAgLy8gIGlmICh0bXBMYXllci0+Z2V0TGF5ZXJOdW0oKSA9PSAzKSB7Ci0gICAgLy8gICAgYXV0byByZXN1bHQgPSBjb24tPmdldEN1dENsYXNzVGJsKCktPmZpbmQoc3RyaW5nKCJWeGFTSURFIiksIHN0cmluZygiVnhhRU5EIikpOwotICAgIC8vICAgIGNvdXQgPDwiVnhhU0lERS9WeGFFTkQgIiA8PHJlc3VsdC5maXJzdCA8PCIgIiA8PHJlc3VsdC5zZWNvbmQgPDxlbmRsOwotICAgIC8vICAgIHJlc3VsdCA9IGNvbi0+Z2V0Q3V0Q2xhc3NUYmwoKS0+ZmluZChzdHJpbmcoIlZ4YUxSR0VORCIpLCBzdHJpbmcoIlZ4YVJFQ1RTSURFIikpOwotICAgIC8vICAgIGNvdXQgPDwiVnhhTFJHRU5EL1Z4YVJFQ1RTSURFICIgPDxyZXN1bHQuZmlyc3QgPDwiICIgPDxyZXN1bHQuc2Vjb25kIDw8ZW5kbDsKLSAgICAvLyAgfQotICAgIC8vfQotCi0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotLy8vL2ludCBGbGV4Um91dGU6OmdldExlZjU4Q29ybmVyU3BhY2luZyh2b2lkICpkYXRhLCBjb25zdCBzdHJpbmcgJnN0cmluZ0luKSB7Ci0vLy8vICBpc3RyaW5nc3RyZWFtIGlzdHIoc3RyaW5nSW4pOwotLy8vLyAgc3RyaW5nIHdvcmQ7Ci0vLy8vICBib29sIGhhc0Nvcm5lclNwYWNpbmcgPSBmYWxzZTsKLS8vLy8KLS8vLy8gIGJvb2wgaGFzQ29udmV4Q29ybmVyICA9IGZhbHNlOwotLy8vLyAgYm9vbCBoYXNTYW1lTWFzayAgICAgID0gZmFsc2U7Ci0vLy8vICBib29sIGhhc0Nvcm5lck9ubHkgICAgPSBmYWxzZTsKLS8vLy8gIGZyVUludDQgd2l0aGluICAgICAgICA9IDA7Ci0vLy8vICBib29sIGhhc0V4Y2VwdEVvbCAgICAgPSBmYWxzZTsKLS8vLy8gIGZyVUludDQgZW9sV2lkdGggICAgICA9IDA7Ci0vLy8vCi0vLy8vICBib29sIGhhc0NvbmNhdmVDb3JuZXIgPSBmYWxzZTsKLS8vLy8gIGJvb2wgaGFzTWluTGVuZ3RoICAgICA9IGZhbHNlOwotLy8vLyAgZnJVSW50NCBtaW5MZW5ndGggICAgID0gMDsKLS8vLy8gIGJvb2wgaGFzRXhjZXB0Tm90Y2ggICA9IGZhbHNlOwotLy8vLyAgZnJVSW50NCBub3RjaExlbmd0aCAgID0gMDsKLS8vLy8KLS8vLy8gIGJvb2wgZXhjZXB0U2FtZU5ldCAgID0gZmFsc2U7Ci0vLy8vICBib29sIGV4Y2VwdFNhbWVNZXRhbCA9IGZhbHNlOwotLy8vLwotLy8vLyAgYm9vbCBoYXNXaWR0aFNwYWNpbmcgPSBmYWxzZTsKLS8vLy8gIGZyQ29sbGVjdGlvbjwgZnJDb2xsZWN0aW9uPGZyVUludDQ+ID4gd2lkdGhTcGFjaW5nOwotLy8vLyAgZnJDb2xsZWN0aW9uPGZyVUludDQ+IHRtcFdpZHRoU3BhY2luZzsKLS8vLy8KLS8vLy8gIGJvb2wgZG9Db3JuZXJTcGFjaW5nID0gZmFsc2U7Ci0vLy8vICBib29sIGRvQ29udmV4Q29ybmVyICA9IGZhbHNlOwotLy8vLyAgYm9vbCBkb0NvbmNhdmVDb3JuZXIgPSBmYWxzZTsKLS8vLy8gIGJvb2wgZG9XaWR0aFNwYWNpbmcgID0gZmFsc2U7Ci0vLy8vCi0vLy8vICB3aGlsZSAoaXN0ciA+PiB3b3JkKSB7Ci0vLy8vICAgIC8vY291dCA8PCIgIiA8PHdvcmQ7Ci0vLy8vCi0vLy8vICAgIGlmICh3b3JkID09ICI7IikgewotLy8vLyAgICAgIGRvQ29ybmVyU3BhY2luZyA9IGZhbHNlOwotLy8vLyAgICAgIGRvQ29udmV4Q29ybmVyICA9IGZhbHNlOwotLy8vLyAgICAgIGRvQ29uY2F2ZUNvcm5lciA9IGZhbHNlOwotLy8vLyAgICAgIGRvV2lkdGhTcGFjaW5nICA9IGZhbHNlOwotLy8vLyAgICAgIGNvbnRpbnVlOwotLy8vLyAgICB9Ci0vLy8vCi0vLy8vICAgIGlmICghZG9Db3JuZXJTcGFjaW5nICYmIHdvcmQgPT0gIkNPUk5FUlNQQUNJTkciKSB7Ci0vLy8vICAgICAgZG9Db3JuZXJTcGFjaW5nID0gdHJ1ZTsKLS8vLy8gICAgICBoYXNDb3JuZXJTcGFjaW5nID0gdHJ1ZTsKLS8vLy8gICAgICBjb3V0IDw8IkNPUk5FUlNQQUNJTkciOwotLy8vLyAgICAgIGNvbnRpbnVlOwotLy8vLyAgICB9Ci0vLy8vICAgIGlmIChkb0Nvcm5lclNwYWNpbmcgJiYgIHdvcmQgPT0gIkNPTlZFWENPUk5FUiIpIHsKLS8vLy8gICAgICBkb0NvbnZleENvcm5lciAgPSB0cnVlOwotLy8vLyAgICAgIGhhc0NvbnZleENvcm5lciA9IHRydWU7Ci0vLy8vICAgICAgZG9Db25jYXZlQ29ybmVyID0gZmFsc2U7Ci0vLy8vICAgICAgZG9XaWR0aFNwYWNpbmcgID0gZmFsc2U7Ci0vLy8vICAgICAgY291dCA8PGVuZGwgPDwiICBDT05WRVhDT1JORVIiOwotLy8vLyAgICAgIGNvbnRpbnVlOwotLy8vLyAgICB9Ci0vLy8vICAgIGlmIChkb0Nvcm5lclNwYWNpbmcgJiYgIHdvcmQgPT0gIkNPTkNBVkVDT1JORVIiKSB7Ci0vLy8vICAgICAgZG9Db252ZXhDb3JuZXIgID0gZmFsc2U7Ci0vLy8vICAgICAgZG9Db25jYXZlQ29ybmVyID0gdHJ1ZTsKLS8vLy8gICAgICBoYXNDb25jYXZlQ29ybmVyID0gdHJ1ZTsKLS8vLy8gICAgICBkb1dpZHRoU3BhY2luZyAgPSBmYWxzZTsKLS8vLy8gICAgICBjb3V0IDw8ZW5kbCA8PCIgIENPTkNBVkVDT1JORVIiOwotLy8vLyAgICAgIGNvbnRpbnVlOwotLy8vLyAgICB9Ci0vLy8vCi0vLy8vICAgIGlmIChkb0Nvcm5lclNwYWNpbmcgJiYgIHdvcmQgPT0gIkVYQ0VQVFNBTUVORVQiKSB7Ci0vLy8vICAgICAgZG9Db252ZXhDb3JuZXIgID0gZmFsc2U7Ci0vLy8vICAgICAgZG9Db25jYXZlQ29ybmVyID0gZmFsc2U7Ci0vLy8vICAgICAgZG9XaWR0aFNwYWNpbmcgID0gZmFsc2U7Ci0vLy8vICAgICAgZXhjZXB0U2FtZU5ldCAgID0gdHJ1ZTsKLS8vLy8gICAgICBjb3V0IDw8ZW5kbCA8PCIgIEVYQ0VQVFNBTUVORVQiOwotLy8vLyAgICAgIGNvbnRpbnVlOwotLy8vLyAgICB9Ci0vLy8vICAgIAotLy8vLyAgICBpZiAoZG9Db3JuZXJTcGFjaW5nICYmICB3b3JkID09ICJFWENFUFRTQU1FTUVUQUwiKSB7Ci0vLy8vICAgICAgZG9Db252ZXhDb3JuZXIgID0gZmFsc2U7Ci0vLy8vICAgICAgZG9Db25jYXZlQ29ybmVyID0gZmFsc2U7Ci0vLy8vICAgICAgZG9XaWR0aFNwYWNpbmcgID0gZmFsc2U7Ci0vLy8vICAgICAgZXhjZXB0U2FtZU1ldGFsID0gdHJ1ZTsKLS8vLy8gICAgICBjb3V0IDw8ZW5kbCA8PCIgIEVYQ0VQVFNBTUVNRVRBTCI7Ci0vLy8vICAgICAgY29udGludWU7Ci0vLy8vICAgIH0KLS8vLy8KLS8vLy8gICAgaWYgKGRvQ29ybmVyU3BhY2luZyAmJiAgd29yZCA9PSAiV0lEVEgiKSB7Ci0vLy8vICAgICAgZG9Db252ZXhDb3JuZXIgID0gZmFsc2U7Ci0vLy8vICAgICAgZG9Db25jYXZlQ29ybmVyID0gZmFsc2U7Ci0vLy8vICAgICAgZG9XaWR0aFNwYWNpbmcgID0gdHJ1ZTsKLS8vLy8gICAgICBoYXNXaWR0aFNwYWNpbmcgPSB0cnVlOwotLy8vLyAgICAgIGlmICghdG1wV2lkdGhTcGFjaW5nLmVtcHR5KCkpIHsKLS8vLy8gICAgICAgIHdpZHRoU3BhY2luZy5wdXNoX2JhY2sodG1wV2lkdGhTcGFjaW5nKTsKLS8vLy8gICAgICB9Ci0vLy8vICAgICAgdG1wV2lkdGhTcGFjaW5nLmNsZWFyKCk7Ci0vLy8vICAgICAgY291dCA8PGVuZGwgPDwiICBXSURUSCI7Ci0vLy8vICAgICAgY29udGludWU7Ci0vLy8vICAgIH0KLS8vLy8gICAgCi0vLy8vICAgIGlmIChkb0NvbnZleENvcm5lciAmJiB3b3JkID09ICJTQU1FTUFTSyIpIHsKLS8vLy8gICAgICBoYXNTYW1lTWFzayA9IHRydWU7Ci0vLy8vICAgICAgY291dCA8PCIgU0FNRU1BU0siOwotLy8vLyAgICB9Ci0vLy8vICAgIGlmIChkb0NvbnZleENvcm5lciAmJiB3b3JkID09ICJDT1JORVJPTkxZIikgewotLy8vLyAgICAgIGhhc0Nvcm5lck9ubHkgPSB0cnVlOwotLy8vLyAgICAgIGRvdWJsZSB0bXBXaXRoaW47Ci0vLy8vICAgICAgaXN0ciA+PiB0bXBXaXRoaW47Ci0vLy8vICAgICAgd2l0aGluID0gcm91bmQodG1wV2l0aGluICogKChGbGV4Um91dGUqKWRhdGEpLT51bml0cyk7Ci0vLy8vICAgICAgY291dCA8PGVuZGwgPDwiICAgIENPUk5FUk9OTFkgIiA8PHdpdGhpbiAqIDEuMCAvICgoRmxleFJvdXRlKilkYXRhKS0+dW5pdHM7Ci0vLy8vICAgIH0KLS8vLy8gICAgLy8gY3VycmVudGx5IGRvIG5vdCBzdXBwb3J0IEVYQ0VQVEpPR0xFTkdUSAotLy8vLyAgICBpZiAoZG9Db252ZXhDb3JuZXIgJiYgd29yZCA9PSAiRVhDRVBURU9MIikgewotLy8vLyAgICAgIGhhc0V4Y2VwdEVvbCA9IHRydWU7Ci0vLy8vICAgICAgZG91YmxlIHRtcEVvbFdpZHRoOwotLy8vLyAgICAgIGlzdHIgPj4gdG1wRW9sV2lkdGg7Ci0vLy8vICAgICAgZW9sV2lkdGggPSByb3VuZCh0bXBFb2xXaWR0aCAqICgoRmxleFJvdXRlKilkYXRhKS0+dW5pdHMpOwotLy8vLyAgICAgIGNvdXQgPDxlbmRsIDw8IiAgICBFWENFUFRFT0wgIiA8PGVvbFdpZHRoICogMS4wIC8gKChGbGV4Um91dGUqKWRhdGEpLT51bml0czsKLS8vLy8gICAgfQotLy8vLyAgICAKLS8vLy8gICAgaWYgKGRvQ29uY2F2ZUNvcm5lciAmJiB3b3JkID09ICJNSU5MRU5HVEgiKSB7Ci0vLy8vICAgICAgaGFzTWluTGVuZ3RoID0gdHJ1ZTsKLS8vLy8gICAgICBkb3VibGUgdG1wTWluTGVuZ3RoOwotLy8vLyAgICAgIGlzdHIgPj4gdG1wTWluTGVuZ3RoOwotLy8vLyAgICAgIG1pbkxlbmd0aCA9IHJvdW5kKHRtcE1pbkxlbmd0aCAqICgoRmxleFJvdXRlKilkYXRhKS0+dW5pdHMpOwotLy8vLyAgICAgIGNvdXQgPDxlbmRsIDw8IiAgICBNSU5MRU5HVEggIiA8PG1pbkxlbmd0aCAqIDEuMCAvICgoRmxleFJvdXRlKilkYXRhKS0+dW5pdHM7Ci0vLy8vICAgIH0KLS8vLy8gICAgaWYgKGRvQ29uY2F2ZUNvcm5lciAmJiB3b3JkID09ICJFWENFUFROT1RDSCIpIHsKLS8vLy8gICAgICBoYXNFeGNlcHROb3RjaCA9IHRydWU7Ci0vLy8vICAgICAgZG91YmxlIHRtcE5vdGNoTGVuZ3RoOwotLy8vLyAgICAgIGlzdHIgPj4gdG1wTm90Y2hMZW5ndGg7Ci0vLy8vICAgICAgbm90Y2hMZW5ndGggPSByb3VuZCh0bXBOb3RjaExlbmd0aCAqICgoRmxleFJvdXRlKilkYXRhKS0+dW5pdHMpOwotLy8vLyAgICAgIGNvdXQgPDxlbmRsIDw8IiAgICBFWENFUFROT1RDSCAiIDw8bm90Y2hMZW5ndGggKiAxLjAgLyAoKEZsZXhSb3V0ZSopZGF0YSktPnVuaXRzOwotLy8vLyAgICB9Ci0vLy8vCi0vLy8vICAgIGlmIChkb1dpZHRoU3BhY2luZyAmJiAgd29yZCA9PSAiU1BBQ0lORyIpIHsKLS8vLy8gICAgICBjb3V0IDw8IiBTUEFDSU5HIjsKLS8vLy8gICAgICBjb250aW51ZTsKLS8vLy8gICAgfQotLy8vLwotLy8vLyAgICBpZiAoZG9XaWR0aFNwYWNpbmcgJiYgIHdvcmQgIT0gIlNQQUNJTkciKSB7Ci0vLy8vICAgICAgZnJVSW50NCB0bXAgPSByb3VuZChzdG9kKHdvcmQpICogKChGbGV4Um91dGUqKWRhdGEpLT51bml0cyk7Ci0vLy8vICAgICAgdG1wV2lkdGhTcGFjaW5nLnB1c2hfYmFjayh0bXApOwotLy8vLyAgICAgIGNvdXQgPDwiICIgPDx0bXAgKiAxLjAgLyAoKEZsZXhSb3V0ZSopZGF0YSktPnVuaXRzOwotLy8vLyAgICAgIGNvbnRpbnVlOwotLy8vLyAgICB9Ci0vLy8vCi0vLy8vICB9Ci0vLy8vCi0vLy8vICBpZiAoIXRtcFdpZHRoU3BhY2luZy5lbXB0eSgpKSB7Ci0vLy8vICAgIHdpZHRoU3BhY2luZy5wdXNoX2JhY2sodG1wV2lkdGhTcGFjaW5nKTsKLS8vLy8gIH0KLS8vLy8KLS8vLy8gIGNvdXQgPDxlbmRsOwotLy8vLyAgcmV0dXJuIDA7Ci0vLy8vfQotCi1pbnQgaW86OlBhcnNlcjo6Z2V0TGVmTGF5ZXJzKGxlZnJDYWxsYmFja1R5cGVfZSB0eXBlLCBsZWZpTGF5ZXIqIGxheWVyLCBsZWZpVXNlckRhdGEgZGF0YSkgewotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLSAgLy9ib29sIGVuYWJsZURvdWJsZUNoZWNrID0gdHJ1ZTsKLSAgLy9ib29sIGVuYWJsZURvdWJsZUNoZWNrID0gZmFsc2U7Ci0gIGlmICh0eXBlICE9IGxlZnJMYXllckNia1R5cGUpIHsKLSAgICBjb3V0IDw8IlR5cGUgaXMgbm90IGxlZnJMYXllckNia1R5cGUhIiA8PGVuZGw7Ci0gICAgZXhpdCgxKTsKLSAgfQotICB1bmlxdWVfcHRyPGZyTGF5ZXI+IHVMYXllciA9IG1ha2VfdW5pcXVlPGZyTGF5ZXI+KCk7Ci0gIGF1dG8gdG1wTGF5ZXIgPSB1TGF5ZXIuZ2V0KCk7Ci0KLSAgaWYgKCFzdHJjbXAobGF5ZXItPnR5cGUoKSwgIlJPVVRJTkciKSkgewotICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgIGNvdXQgPDwiTEFZRVIgIiAgICAgICA8PGxheWVyLT5uYW1lKCkgPDxlbmRsOwotICAgICAgY291dCA8PCIgIFRZUEUgICAgICAiIDw8bGF5ZXItPnR5cGUoKSA8PGVuZGw7Ci0gICAgICBjb3V0IDw8IiAgRElSRUNUSU9OICIgPDxsYXllci0+ZGlyZWN0aW9uKCkgPDxlbmRsOwotICAgICAgLy9jb3V0IDw8IiAgTUlOV0lEVEggICIgPDxsYXllci0+bWlud2lkdGgoKSA8PGVuZGw7Ci0gICAgICBjb3V0IDw8IiAgQVJFQSAgICAgICIgPDxsYXllci0+YXJlYSgpIDw8ZW5kbDsKLSAgICAgIGNvdXQgPDwiICBXSURUSCAgICAgIiA8PGxheWVyLT53aWR0aCgpIDw8ZW5kbDsKLSAgICB9Ci0gICAgdG1wTGF5ZXItPnNldExheWVyTnVtKCgoaW86OlBhcnNlciopZGF0YSktPnJlYWRMYXllckNudCsrKTsKLSAgICB0bXBMYXllci0+c2V0TmFtZShsYXllci0+bmFtZSgpKTsKLSAgICB0bXBMYXllci0+c2V0V2lkdGgocm91bmQobGF5ZXItPndpZHRoKCkgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKSk7Ci0gICAgaWYgKGxheWVyLT5oYXNNaW53aWR0aCgpKSB7Ci0gICAgICB0bXBMYXllci0+c2V0TWluV2lkdGgocm91bmQobGF5ZXItPm1pbndpZHRoKCkgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRtcExheWVyLT5zZXRNaW5XaWR0aCh0bXBMYXllci0+Z2V0V2lkdGgoKSk7Ci0gICAgfQotICAgIC8vIGFkZCBtaW5XaWR0aCBjb25zdHJhaW50Ci0gICAgYXV0byBtaW5XaWR0aENvbnN0cmFpbnQgPSBtYWtlX3VuaXF1ZTxmck1pbldpZHRoQ29uc3RyYWludD4odG1wTGF5ZXItPmdldE1pbldpZHRoKCkpOwotICAgIHRtcExheWVyLT5zZXRNaW5XaWR0aENvbnN0cmFpbnQobWluV2lkdGhDb25zdHJhaW50LmdldCgpKTsKLSAgICB1bmlxdWVfcHRyPGZyQ29uc3RyYWludD4gbWluV2lkdGhUZW1wUHRyID0gc3RkOjptb3ZlKG1pbldpZHRoQ29uc3RyYWludCk7Ci0gICAgKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+YWRkVUNvbnN0cmFpbnQobWluV2lkdGhUZW1wUHRyKTsKLSAgICAvL3RtcExheWVyLT5hZGRDb25zdHJhaW50KG1pbldpZHRoQ29uc3RyYWludCk7Ci0KLSAgICB0bXBMYXllci0+c2V0VHlwZShmckxheWVyVHlwZUVudW06OlJPVVRJTkcpOwotICAgIC8vdG1wTGF5ZXIuaWR4ICAgICAgICA9ICgoRmxleFJvdXRlKilkYXRhKS0+cmVhZExheWVyQ250OwotICAgIC8vdG1wTGF5ZXIubGF5ZXJOYW1lICA9IGxheWVyLT5uYW1lKCk7Ci0gICAgLy90bXBMYXllci50eXBlICAgICAgID0gbGF5ZXItPnR5cGUoKTsKLSAgICBpZiAoIXN0cmNtcChsYXllci0+ZGlyZWN0aW9uKCksICJIT1JJWk9OVEFMIikpIHsKLSAgICAgIHRtcExheWVyLT5zZXREaXIoZnJjSG9yelByZWZSb3V0aW5nRGlyKTsKLSAgICB9IGVsc2UgaWYgKCFzdHJjbXAobGF5ZXItPmRpcmVjdGlvbigpLCAiVkVSVElDQUwiKSkgewotICAgICAgdG1wTGF5ZXItPnNldERpcihmcmNWZXJ0UHJlZlJvdXRpbmdEaXIpOwotICAgIH0KLSAgICB0bXBMYXllci0+c2V0UGl0Y2gocm91bmQobGF5ZXItPnBpdGNoKCkgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKSk7Ci0KLSAgICAvLyBBZGQgc2hvcnQgcnVsZSBmb3IgZXZlcnkgbGF5ZXIKLSAgICBhdXRvIHNob3J0Q29uc3RyYWludCA9IG1ha2VfdW5pcXVlPGZyU2hvcnRDb25zdHJhaW50PigpOwotICAgIHRtcExheWVyLT5zZXRTaG9ydENvbnN0cmFpbnQoc2hvcnRDb25zdHJhaW50LmdldCgpKTsKLSAgICB1bmlxdWVfcHRyPGZyQ29uc3RyYWludD4gc2hvcnRUZW1wUHRyID0gc3RkOjptb3ZlKHNob3J0Q29uc3RyYWludCk7Ci0gICAgLy9zdGQ6OmNvdXQgPDwgImFkZCBzaG9ydENvbnN0cmFpbnQgdG8gbGF5ZXIgIiA8PHRtcExheWVyLT5nZXROYW1lKCkgPDwgIlxuIjsKLSAgICAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5hZGRVQ29uc3RyYWludChzaG9ydFRlbXBQdHIpOwotICAgIC8vdG1wTGF5ZXItPmFkZENvbnN0cmFpbnQoc2hvcnRDb25zdHJhaW50KTsKLQotCi0gICAgLy9jb3V0IDw8Im51bWJlciBvZiBwcm9wcyAiIDw8bGF5ZXItPm51bVByb3BzKCkgPDxlbmRsOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGF5ZXItPm51bVByb3BzKCk7IGkrKykgewotICAgICAgaWYgKHN0cmluZyhsYXllci0+cHJvcE5hbWUoaSkpID09IHN0cmluZygiTEVGNThfUFJPVFJVU0lPTldJRFRIIikgfHwKLSAgICAgICAgICBzdHJpbmcobGF5ZXItPnByb3BOYW1lKGkpKSA9PSBzdHJpbmcoIkxFRjU4X01JTlNURVAiKSB8fAotICAgICAgICAgIHN0cmluZyhsYXllci0+cHJvcE5hbWUoaSkpID09IHN0cmluZygiTEVGNThfRU5DTE9TVVJFU1BBQ0lORyIpIHx8Ci0gICAgICAgICAgc3RyaW5nKGxheWVyLT5wcm9wTmFtZShpKSkgPT0gc3RyaW5nKCJMRUY1OF9WT0xUQUdFU1BBQ0lORyIpIHx8Ci0gICAgICAgICAgc3RyaW5nKGxheWVyLT5wcm9wTmFtZShpKSkgPT0gc3RyaW5nKCJMRUY1OF9BTlRFTk5BR0FURVBMVVNESUZGIikgfHwKLSAgICAgICAgICBzdHJpbmcobGF5ZXItPnByb3BOYW1lKGkpKSA9PSBzdHJpbmcoIkxFRjU4X0FOVEVOTkFHQVRFUFdMIikgfHwKLSAgICAgICAgICBzdHJpbmcobGF5ZXItPnByb3BOYW1lKGkpKSA9PSBzdHJpbmcoIkxFRjU4X0FOVEVOTkFHQVRFUFdMIikgfHwKLSAgICAgICAgICBzdHJpbmcobGF5ZXItPnByb3BOYW1lKGkpKSA9PSBzdHJpbmcoIkxFRjU4X0ZPUkJJRERFTlNQQUNJTkciKSAKLSAgICAgICAgICkgewotICAgICAgICA7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvL2NvdXQgPDwibmFtZTogICAgICIgPDxsYXllci0+cHJvcE5hbWUoaSkgPDxlbmRsOwotICAgICAgICAvL2NvdXQgPDwidmFsdWU6ICAgICIgPDxsYXllci0+cHJvcFZhbHVlKGkpIDw8ZW5kbDsKLSAgICAgICAgLy9jb3V0IDw8Im51bWJlcjogICAiIDw8bGF5ZXItPnByb3BOdW1iZXIoaSkgPDxlbmRsOwotICAgICAgICAvL2NvdXQgPDwidHlwZTogICAgICIgPDxsYXllci0+cHJvcFR5cGUoaSkgPDxlbmRsOwotICAgICAgICAvL2NvdXQgPDwiaXNOdW1iZXI6ICIgPDxsYXllci0+cHJvcElzTnVtYmVyKGkpIDw8ZW5kbDsKLSAgICAgICAgLy9jb3V0IDw8ImlzU3RyaW5nOiAiIDw8bGF5ZXItPnByb3BJc1N0cmluZyhpKSA8PGVuZGw7Ci0gICAgICAgIC8vaWYgKCFzdHJjbXAobGF5ZXItPnByb3BOYW1lKGkpLCAiTEVGNThfQ09STkVSU1BBQ0lORyIpICYmIGxheWVyLT5wcm9wSXNTdHJpbmcoaSkpIHsKLSAgICAgICAgLy8gIC8vY291dCA8PCJzdGFydCBwYXJzaW5nIExFRjU4X0NPUk5FUlNQQUNJTkciIDw8ZW5kbDsKLSAgICAgICAgLy8gIGdldExlZjU4Q29ybmVyU3BhY2luZyhkYXRhLCBsYXllci0+cHJvcFZhbHVlKGkpKTsKLSAgICAgICAgLy99Ci0gICAgICAgIGlmICghc3RyY21wKGxheWVyLT5wcm9wTmFtZShpKSwgIkxFRjU4X1NQQUNJTkciKSAmJiBsYXllci0+cHJvcElzU3RyaW5nKGkpKSB7Ci0gICAgICAgICAgLy9jb3V0IDw8InN0YXJ0IHBhcnNpbmcgTEVGNThfQ09STkVSU1BBQ0lORyIgPDxlbmRsOwotICAgICAgICAgIC8vY291dCA8PCJuYW1lOiAgICAgIiA8PGxheWVyLT5wcm9wTmFtZShpKSA8PGVuZGw7Ci0gICAgICAgICAgLy9jb3V0IDw8InZhbHVlOiAgICAiIDw8bGF5ZXItPnByb3BWYWx1ZShpKSA8PGVuZGw7Ci0gICAgICAgICAgZ2V0TGVmNThTcGFjaW5nKGRhdGEsIHRtcExheWVyLCBsYXllci0+cHJvcFZhbHVlKGkpKTsKLSAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGxheWVyLT5wcm9wTmFtZShpKSwgIkxFRjU3X1NQQUNJTkciKSAmJiBsYXllci0+cHJvcElzU3RyaW5nKGkpKSB7Ci0gICAgICAgICAgZ2V0TGVmNThTcGFjaW5nKGRhdGEsIHRtcExheWVyLCBsYXllci0+cHJvcFZhbHVlKGkpKTsKLSAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGxheWVyLT5wcm9wTmFtZShpKSwgIkxFRjU4X1NQQUNJTkdUQUJMRSIpICYmIGxheWVyLT5wcm9wSXNTdHJpbmcoaSkpIHsKLSAgICAgICAgICAvL2NvdXQgPDwic3RhcnQgcGFyc2luZyBMRUY1OF9DT1JORVJTUEFDSU5HIiA8PGVuZGw7Ci0gICAgICAgICAgLy9jb3V0IDw8Im5hbWU6ICAgICAiIDw8bGF5ZXItPnByb3BOYW1lKGkpIDw8ZW5kbDsKLSAgICAgICAgICAvL2NvdXQgPDwidmFsdWU6ICAgICIgPDxsYXllci0+cHJvcFZhbHVlKGkpIDw8ZW5kbDsKLSAgICAgICAgICBnZXRMZWY1OFNwYWNpbmdUYWJsZShkYXRhLCB0bXBMYXllciwgbGF5ZXItPnByb3BWYWx1ZShpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLy9jb3V0IDw8IiAgbmFtZTogICAgICIgPDxsYXllci0+cHJvcE5hbWUoaSkgPDxlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gcmVhZCBtaW5BcmVhIHJ1bGUKLSAgICBpZiAobGF5ZXItPmhhc0FyZWEoKSkgewotICAgICAgZnJDb29yZCBtaW5BcmVhID0gZnJDb29yZChyb3VuZChsYXllci0+YXJlYSgpICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSAqICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmdldERCVVBlclVVKCkpKTsKLSAgICAgIHVuaXF1ZV9wdHI8ZnJDb25zdHJhaW50PiB1Q29uID0gbWFrZV91bmlxdWU8ZnJBcmVhQ29uc3RyYWludD4obWluQXJlYSk7Ci0gICAgICBhdXRvIHJwdHIgPSBzdGF0aWNfY2FzdDxmckFyZWFDb25zdHJhaW50Kj4odUNvbi5nZXQoKSk7Ci0gICAgICAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5hZGRVQ29uc3RyYWludCh1Q29uKTsKLSAgICAgIC8vc3RkOjpjb3V0IDw8ICJBZGQgbWluQXJlYSBjb25zdHJhaW50IHRvICIgPDwgdG1wTGF5ZXItPmdldE5hbWUoKSA8PCAiXG4iOwotICAgICAgdG1wTGF5ZXItPnNldEFyZWFDb25zdHJhaW50KHJwdHIpOwotICAgIH0KLQotICAgIGlmIChsYXllci0+aGFzTWluc3RlcCgpKSB7Ci0gICAgICBpZiAobGF5ZXItPm51bU1pbnN0ZXAoKSA+IDEpIHsKLSAgICAgICAgc3RkOjpjb3V0IDw8ICJFUlJPUjogb25seSBvbmUgbWluU3RlcCBydWxlIHNob3VsZCBiZSBkZWZpbmVkIGZvciBhIGdpdmVuIGxheWVyLiBPbmx5IHRoZSBsYXN0IG9uZSBpcyBjaGVja2VkXG4iOwotICAgICAgfQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYXllci0+bnVtTWluc3RlcCgpOyArK2kpIHsKLSAgICAgICAgdW5pcXVlX3B0cjxmckNvbnN0cmFpbnQ+IHVDb24gPSBtYWtlX3VuaXF1ZTxmck1pblN0ZXBDb25zdHJhaW50PigpOwotICAgICAgICBhdXRvIHJwdHIgPSBzdGF0aWNfY2FzdDxmck1pblN0ZXBDb25zdHJhaW50Kj4odUNvbi5nZXQoKSk7Ci0gICAgICAgIGlmIChsYXllci0+aGFzTWluc3RlcFR5cGUoaSkpIHsKLSAgICAgICAgICBpZiAoc3RyY21wKGxheWVyLT5taW5zdGVwVHlwZShpKSwgIklOU0lERUNPUk5FUiIpID09IDApIHsKLSAgICAgICAgICAgIHJwdHItPnNldEluc2lkZUNvcm5lcih0cnVlKTsKLSAgICAgICAgICAgIHJwdHItPnNldE91dHNpZGVDb3JuZXIoZmFsc2UpOwotICAgICAgICAgICAgcnB0ci0+c2V0U3RlcChmYWxzZSk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobGF5ZXItPm1pbnN0ZXBUeXBlKGkpLCAiT1VUU0lERUNPUk5FUiIpID09IDApIHsKLSAgICAgICAgICAgIHJwdHItPnNldEluc2lkZUNvcm5lcihmYWxzZSk7Ci0gICAgICAgICAgICBycHRyLT5zZXRPdXRzaWRlQ29ybmVyKHRydWUpOwotICAgICAgICAgICAgcnB0ci0+c2V0U3RlcChmYWxzZSk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobGF5ZXItPm1pbnN0ZXBUeXBlKGkpLCAiU1RFUCIpID09IDApIHsKLSAgICAgICAgICAgIHJwdHItPnNldEluc2lkZUNvcm5lcihmYWxzZSk7Ci0gICAgICAgICAgICBycHRyLT5zZXRPdXRzaWRlQ29ybmVyKGZhbHNlKTsKLSAgICAgICAgICAgIHJwdHItPnNldFN0ZXAodHJ1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChsYXllci0+aGFzTWluc3RlcExlbmd0aHN1bShpKSkgewotICAgICAgICAgIHJwdHItPnNldE1heExlbmd0aChmckNvb3JkKGxheWVyLT5taW5zdGVwTGVuZ3Roc3VtKGkpICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsYXllci0+aGFzTWluc3RlcE1heGVkZ2VzKGkpKSB7Ci0gICAgICAgICAgcnB0ci0+c2V0TWF4RWRnZXMobGF5ZXItPm1pbnN0ZXBNYXhlZGdlcyhpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcnB0ci0+c2V0TWluU3RlcExlbmd0aChsYXllci0+bWluc3RlcChpKSAqICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmdldERCVVBlclVVKCkpOwotICAgICAgICAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5hZGRVQ29uc3RyYWludCh1Q29uKTsKLSAgICAgICAgLy9zdGQ6OmNvdXQgPDwgIkFkZCBtaW5TdGVwIGNvbnN0cmFpbnQgdG8gIiA8PCB0bXBMYXllci0+Z2V0TmFtZSgpIDw8ICJcbiI7Ci0gICAgICAgIHRtcExheWVyLT5zZXRNaW5TdGVwQ29uc3RyYWludChycHRyKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyByZWFkIHNwYWNpbmcgcnVsZQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGF5ZXItPm51bVNwYWNpbmcoKTsgKytpKSB7Ci0gICAgICAvL3N0ZDo6c2hhcmVkX3B0cjxmclNwYWNpbmdDb25zdHJhaW50PiBtaW5TcGFjaW5nQ29zbnRyYWludDsKLSAgICAgIGZyQ29vcmQgbWluU3BhY2luZyA9IGZyQ29vcmQocm91bmQobGF5ZXItPnNwYWNpbmcoaSkgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKSk7Ci0gICAgICAvLyBtaW5TcGFjaW5nQ29zbnRyYWludCA9IG1ha2Vfc2hhcmVkPGZyTWluU3BhY2luZ0NvbnN0cmFpbnQ+KG1pblNwYWNpbmcpOwotICAgICAgaWYgKGxheWVyLT5oYXNTcGFjaW5nUmFuZ2UoaSkpIHsKLSAgICAgICAgY291dCA8PCIgV0FSTklORzogaGFzU3BhY2luZyBSYW5nZSB1bnN1cHBvcnRlZCIgPDxlbmRsOwotICAgICAgfSBlbHNlIGlmIChsYXllci0+aGFzU3BhY2luZ0xlbmd0aFRocmVzaG9sZChpKSkgewotICAgICAgICBjb3V0IDw8IiBXQVJOSU5HOiBoYXNTcGFjaW5nTGVuZ3RoVGhyZXNob2xkIHVuc3VwcG9ydGVkIiA8PGVuZGw7Ci0gICAgICB9IGVsc2UgaWYgKGxheWVyLT5oYXNTcGFjaW5nRW5kT2ZMaW5lKGkpKSB7Ci0gICAgICAgIC8vIG5ldwotICAgICAgICB1bmlxdWVfcHRyPGZyQ29uc3RyYWludD4gdUNvbiA9IG1ha2VfdW5pcXVlPGZyU3BhY2luZ0VuZE9mTGluZUNvbnN0cmFpbnQ+KCk7Ci0gICAgICAgIGF1dG8gcnB0ciA9IHN0YXRpY19jYXN0PGZyU3BhY2luZ0VuZE9mTGluZUNvbnN0cmFpbnQqPih1Q29uLmdldCgpKTsKLSAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgIGNvdXQgPDwiICBTUEFDSU5HICIgPDxsYXllci0+c3BhY2luZyhpKSA8PCIgRU5ET0ZMSU5FICIgPDxsYXllci0+c3BhY2luZ0VvbFdpZHRoKGkpCi0gICAgICAgICAgICAgICA8PCIgV0lUSElOICIgPDxsYXllci0+c3BhY2luZ0VvbFdpdGhpbihpKTsKLSAgICAgICAgfQotICAgICAgICBmckNvb3JkIGVvbFdpZHRoID0gZnJDb29yZChyb3VuZChsYXllci0+c3BhY2luZ0VvbFdpZHRoKGkpICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSkpOwotICAgICAgICBmckNvb3JkIGVvbFdpdGhpbiA9IGZyQ29vcmQocm91bmQobGF5ZXItPnNwYWNpbmdFb2xXaXRoaW4oaSkgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKSk7Ci0gICAgICAgIHJwdHItPnNldE1pblNwYWNpbmcobWluU3BhY2luZyk7Ci0gICAgICAgIHJwdHItPnNldEVvbFdpZHRoKGVvbFdpZHRoKTsKLSAgICAgICAgcnB0ci0+c2V0RW9sV2l0aGluKGVvbFdpdGhpbik7Ci0gICAgICAgIGlmIChsYXllci0+aGFzU3BhY2luZ1BhcmVsbGVsRWRnZShpKSkgewotICAgICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICAgIGNvdXQgPDwiIFBBUkFMTEVMRURHRSAiIDw8bGF5ZXItPnNwYWNpbmdQYXJTcGFjZShpKSA8PCIgV0lUSElOICIgPDxsYXllci0+c3BhY2luZ1BhcldpdGhpbihpKTsKLSAgICAgICAgICAgIGlmIChsYXllci0+aGFzU3BhY2luZ1R3b0VkZ2VzKGkpKSB7Ci0gICAgICAgICAgICAgIGNvdXQgPDwiIFRXT0VER0VTIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZnJDb29yZCBwYXJTcGFjZSA9IGZyQ29vcmQocm91bmQobGF5ZXItPnNwYWNpbmdQYXJTcGFjZShpKSAqICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmdldERCVVBlclVVKCkpKTsKLSAgICAgICAgICBmckNvb3JkIHBhcldpdGhpbiA9IGZyQ29vcmQocm91bmQobGF5ZXItPnNwYWNpbmdQYXJXaXRoaW4oaSkgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKSk7Ci0gICAgICAgICAgcnB0ci0+c2V0UGFyU3BhY2UocGFyU3BhY2UpOwotICAgICAgICAgIHJwdHItPnNldFBhcldpdGhpbihwYXJXaXRoaW4pOwotICAgICAgICAgIHJwdHItPnNldFR3b0VkZ2VzKGxheWVyLT5oYXNTcGFjaW5nVHdvRWRnZXMoaSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICBjb3V0IDw8IiA7IiA8PGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+YWRkVUNvbnN0cmFpbnQodUNvbik7Ci0gICAgICAgIHRtcExheWVyLT5hZGRFb2xTcGFjaW5nKHJwdHIpOwotICAgICAgICAKLSAgICAgICAgLy8gZG91YmxlIGNoZWNrCi0gICAgICAgIC8vaWYgKGVuYWJsZURvdWJsZUNoZWNrKSB7Ci0gICAgICAgIC8vICBjb3V0IDw8IkAgU1BBQ0lORyAiIDw8bWluU3BhY2luZyA8PCIgRU5ET0ZMSU5FICIgPDxlb2xXaWR0aCA8PCIgV0lUSElOICIgPDxlb2xXaXRoaW47Ci0gICAgICAgIC8vICBpZiAocnB0ci0+aGFzUGFyYWxsZWxFZGdlKCkpIHsKLSAgICAgICAgLy8gICAgY291dCA8PCIgUEFSQUxMRUxFREdFICIgPDxycHRyLT5nZXRQYXJTcGFjZSgpOwotICAgICAgICAvLyAgICBjb3V0IDw8IiBXSVRISU4gIiA8PHJwdHItPmdldFBhclNwYWNlKCk7Ci0gICAgICAgIC8vICAgIGlmIChycHRyLT5oYXNUd29FZGdlcygpKSB7Ci0gICAgICAgIC8vICAgICAgY291dCA8PCIgVFdPRURHRVMiOwotICAgICAgICAvLyAgICB9Ci0gICAgICAgIC8vICB9Ci0gICAgICAgIC8vICBjb3V0IDw8IiA7IiA8PGVuZGw7Ci0gICAgICAgIC8vICBjb3V0IDw8ImVvbCBzaXplID0gIiA8PHRtcExheWVyLT5nZXRFb2xTcGFjaW5nKCkuc2l6ZSgpIDw8ZW5kbDsKLSAgICAgICAgLy99Ci0gICAgICB9IGVsc2UgaWYgKGxheWVyLT5oYXNTcGFjaW5nU2FtZW5ldChpKSkgewotICAgICAgICBjb3V0IDw8IiBXQVJOSU5HOiBoYXNTcGFjaW5nU2FtZW5ldCB1bnN1cHBvcnRlZCIgPDxlbmRsOwotICAgICAgfSBlbHNlIGlmIChsYXllci0+aGFzU3BhY2luZ05vdGNoTGVuZ3RoKGkpKSB7Ci0gICAgICAgIGNvdXQgPDwiIFdBUk5JTkc6IGhhc1NwYWNpbmdOb3RjaExlbmd0aCB1bnN1cHBvcnRlZCIgPDxlbmRsOwotICAgICAgfSBlbHNlIGlmIChsYXllci0+aGFzU3BhY2luZ0VuZE9mTm90Y2hXaWR0aChpKSkgewotICAgICAgICBjb3V0IDw8IiBXQVJOSU5HOiBoYXNTcGFjaW5nRW5kT2ZOb3RjaFdpZHRoIHVuc3VwcG9ydGVkIiA8PGVuZGw7Ci0gICAgICB9IGVsc2UgeyAvLyBtaW4gc3BhY2luZwotICAgICAgICAvLyBvbGQKLSAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgIGNvdXQgPDwiICBTUEFDSU5HICIgPDxsYXllci0+c3BhY2luZyhpKSA8PCIgOyIgPDxlbmRsOwotICAgICAgICB9Ci0gICAgICAgIC8vYXV0byBzcGFjaW5nQ29uc3RyYWludCA9IG1ha2Vfc2hhcmVkPGZyU3BhY2luZ0NvbnN0cmFpbnQ+KG1pblNwYWNpbmcpOwotICAgICAgICAvLygoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmFkZENvbnN0cmFpbnQoc3BhY2luZ0NvbnN0cmFpbnQpOwotICAgICAgICAvL3RtcExheWVyLT5hZGRDb25zdHJhaW50KHNwYWNpbmdDb25zdHJhaW50KTsKLSAgICAgICAgLy8gbmV3Ci0gICAgICAgIHVuaXF1ZV9wdHI8ZnJDb25zdHJhaW50PiB1Q29uID0gbWFrZV91bmlxdWU8ZnJTcGFjaW5nQ29uc3RyYWludD4obWluU3BhY2luZyk7Ci0gICAgICAgIGF1dG8gcnB0ciA9IHVDb24uZ2V0KCk7Ci0gICAgICAgICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmFkZFVDb25zdHJhaW50KHVDb24pOwotICAgICAgICB0bXBMYXllci0+c2V0TWluU3BhY2luZyhycHRyKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyByZWFkIHNwYWNpbmdUYWJsZQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGF5ZXItPm51bVNwYWNpbmdUYWJsZSgpOyArK2kpIHsKLSAgICAgIC8vIG9sZAotICAgICAgc3RkOjpzaGFyZWRfcHRyPGZyU3BhY2luZ1RhYmxlQ29uc3RyYWludD4gc3BhY2luZ1RhYmxlQ29uc3RyYWludDsKLSAgICAgIGF1dG8gc3BUYWJsZSA9IGxheWVyLT5zcGFjaW5nVGFibGUoaSk7Ci0gICAgICBpZiAoc3BUYWJsZS0+aXNJbmZsdWVuY2UoKSkgewotICAgICAgICBjb3V0IDw8IiBXQVJOSU5HOiBTUEFDSU5HVEFCTEUgSU5GTFVFTkNFIHVuc3VwcG9ydGVkIiA8PGVuZGw7Ci0gICAgICB9IGVsc2UgaWYgKHNwVGFibGUtPmlzUGFyYWxsZWwoKSkgewotICAgICAgICAvLyBvbGQKLSAgICAgICAgc2hhcmVkX3B0cjxmcjJETG9va3VwVGJsPGZyQ29vcmQsIGZyQ29vcmQsIGZyQ29vcmQ+ID4gcHJsVGJsOwotICAgICAgICBhdXRvIHBhcmFsbGVsID0gc3BUYWJsZS0+cGFyYWxsZWwoKTsKLSAgICAgICAgZnJDb2xsZWN0aW9uPGZyQ29vcmQ+IHJvd1ZhbHMsIGNvbFZhbHM7Ci0gICAgICAgIGZyQ29sbGVjdGlvbjxmckNvbGxlY3Rpb248ZnJDb29yZD4gPiB0YmxWYWxzOwotICAgICAgICBmckNvbGxlY3Rpb248ZnJDb29yZD4gdGJsUm93VmFsczsKLSAgICAgICAgZnJTdHJpbmcgcm93TmFtZSgiV0lEVEgiKSwgY29sTmFtZSgiUEFSQUxMRUxSVU5MRU5HVEgiKTsKLSAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgIGNvdXQgPDwiICBTUEFDSU5HVEFCTEUiIDw8ZW5kbDsKLSAgICAgICAgICBjb3V0IDw8IiAgUEFSQUxMRUxSVU5MRU5HVEgiOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcGFyYWxsZWwtPm51bUxlbmd0aCgpOyArK2opIHsKLSAgICAgICAgICBmckNvb3JkIHBybCA9IGZyQ29vcmQocm91bmQocGFyYWxsZWwtPmxlbmd0aChqKSAqICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmdldERCVVBlclVVKCkpKTsKLSAgICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgICBjb3V0IDw8IiAiIDw8cHJsICogMS4wIC8gKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY29sVmFscy5wdXNoX2JhY2socHJsKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHBhcmFsbGVsLT5udW1XaWR0aCgpOyArK2opIHsKLSAgICAgICAgICBmckNvb3JkIHdpZHRoID0gZnJDb29yZChyb3VuZChwYXJhbGxlbC0+d2lkdGgoaikgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKSk7Ci0gICAgICAgICAgcm93VmFscy5wdXNoX2JhY2sod2lkdGgpOwotICAgICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICAgIGNvdXQgPDxlbmRsIDw8IiAgV0lEVEggIiA8PHdpZHRoICogMS4wIC8gKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgdGJsUm93VmFscy5jbGVhcigpOwotICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgcGFyYWxsZWwtPm51bUxlbmd0aCgpOyArK2spIHsKLSAgICAgICAgICAgIC8vZnJDb29yZCBwcmwgPSBmckNvb3JkKHJvdW5kKHBhcmFsbGVsLT5sZW5ndGgoaykgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKSk7Ci0gICAgICAgICAgICBmckNvb3JkIHNwYWNpbmcgPSBmckNvb3JkKHJvdW5kKHBhcmFsbGVsLT53aWR0aFNwYWNpbmcoaiwgaykgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKSk7Ci0gICAgICAgICAgICB0YmxSb3dWYWxzLnB1c2hfYmFjayhzcGFjaW5nKTsKLSAgICAgICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICAgICAgY291dCA8PCIgIiA8PHNwYWNpbmcgKiAxLjAgLyAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICB0YmxWYWxzLnB1c2hfYmFjayh0YmxSb3dWYWxzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgY291dCA8PCIgOyIgPDxlbmRsOwotICAgICAgICB9Ci0gICAgICAgIC8vIG9sZAotICAgICAgICBwcmxUYmwgPSBtYWtlX3NoYXJlZDxmcjJETG9va3VwVGJsPGZyQ29vcmQsIGZyQ29vcmQsIGZyQ29vcmQ+ID4ocm93TmFtZSwgcm93VmFscywgY29sTmFtZSwgY29sVmFscywgdGJsVmFscyk7Ci0gICAgICAgIHNwYWNpbmdUYWJsZUNvbnN0cmFpbnQgPSBtYWtlX3NoYXJlZDxmclNwYWNpbmdUYWJsZUNvbnN0cmFpbnQ+KHBybFRibCk7Ci0gICAgICAgICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmFkZENvbnN0cmFpbnQoc3BhY2luZ1RhYmxlQ29uc3RyYWludCk7Ci0gICAgICAgIHRtcExheWVyLT5hZGRDb25zdHJhaW50KHNwYWNpbmdUYWJsZUNvbnN0cmFpbnQpOwotICAgICAgICAvL2lmICh0bXBMYXllci0+Z2V0TGF5ZXJOdW0oKSA9PSAyKSB7Ci0gICAgICAgIC8vICBwcmxUYmwtPnByaW50VGJsKCk7Ci0gICAgICAgIC8vICBjb3V0IDw8InNob3VsZCBjcmFzaCBoZXJlIiA8PGZsdXNoIDw8cHJsVGJsLT5maW5kKDE0MCwgMTYwKSA8PGZsdXNoIDw8ZW5kbDsKLSAgICAgICAgLy8gIGV4aXQoMCk7Ci0gICAgICAgIC8vfQotCi0gICAgICAgIC8vIG5ldwotICAgICAgICB1bmlxdWVfcHRyPGZyQ29uc3RyYWludD4gdUNvbiA9IG1ha2VfdW5pcXVlPGZyU3BhY2luZ1RhYmxlUHJsQ29uc3RyYWludD4oZnIyRExvb2t1cFRibChyb3dOYW1lLCByb3dWYWxzLCBjb2xOYW1lLCBjb2xWYWxzLCB0YmxWYWxzKSk7Ci0gICAgICAgIGF1dG8gcnB0ciA9IHN0YXRpY19jYXN0PGZyU3BhY2luZ1RhYmxlUHJsQ29uc3RyYWludCo+KHVDb24uZ2V0KCkpOwotICAgICAgICAvL2NvdXQgPDwiQHRlc3QgIiA8PHJwdHItPmZpbmQoMC40NyoyMDAwLCAwLjQ3KjIwMDApIC8gMjAwMC4wIDw8ZW5kbDsKLSAgICAgICAgLy9jb3V0IDw8IkB0ZXN0ICIgPDxycHRyLT5maW5kKDAuNDcqMjAwMCwgMC40OCoyMDAwKSAvIDIwMDAuMCA8PGVuZGw7Ci0gICAgICAgIC8vY291dCA8PCJAdGVzdCAiIDw8cnB0ci0+ZmluZCgwLjQ2KjIwMDAsIDAuNDgqMjAwMCkgLyAyMDAwLjAgPDxlbmRsOwotICAgICAgICAvL2NvdXQgPDwiQHRlc3QgIiA8PHJwdHItPmZpbmQoMC40NyoyMDAwLCAwLjQ2KjIwMDApIC8gMjAwMC4wIDw8ZW5kbDsKLSAgICAgICAgKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+YWRkVUNvbnN0cmFpbnQodUNvbik7Ci0gICAgICAgIHRtcExheWVyLT5zZXRNaW5TcGFjaW5nKHJwdHIpOwotICAgICAgfSBlbHNlIHsgLy8gdHdvIHdpZHRoIHNwYWNpbmcgcnVsZQotICAgICAgICBhdXRvIHR3ID0gc3BUYWJsZS0+dHdvV2lkdGhzKCk7Ci0gICAgICAgIC8vYm9vbCBoYXNQcmwgPSBmYWxzZTsKLSAgICAgICAgZnJDb29yZCBkZWZhdWx0UHJsID0gLWFicyhmckNvb3JkKHJvdW5kKHR3LT53aWR0aFNwYWNpbmcoMCwwKSAqICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmdldERCVVBlclVVKCkpKSk7Ci0gICAgICAgIC8vY291dCA8PCJkZWZhdWx0IHBybDogIiA8PGRlZmF1bHRQcmwgPDxlbmRsOwotICAgICAgICBmckNvbGxlY3Rpb248ZnJTcGFjaW5nVGFibGVUd1Jvd1R5cGU+IHJvd1ZhbHMsIGNvbFZhbHM7Ci0gICAgICAgIGZyQ29sbGVjdGlvbjxmckNvbGxlY3Rpb248ZnJDb29yZD4gPiB0YmxWYWxzOwotICAgICAgICBmckNvbGxlY3Rpb248ZnJDb29yZD4gdGJsUm93VmFsczsKLSAgICAgICAgZnJTdHJpbmcgcm93TmFtZSgiV0lEVEgxUFJMIiksIGNvbE5hbWUoIldJRFRIMlBSTCIpOwotICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgY291dCA8PCIgIFNQQUNJTkdUQUJMRSBUV09XSURUSFMiOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdHctPm51bVdpZHRoKCk7ICsraikgewotICAgICAgICAgIGZyQ29vcmQgd2lkdGggPSBmckNvb3JkKHJvdW5kKHR3LT53aWR0aChqKSAqICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmdldERCVVBlclVVKCkpKTsKLSAgICAgICAgICBmckNvb3JkIHBybCAgID0gZGVmYXVsdFBybDsKLSAgICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgICBjb3V0IDw8ZW5kbCA8PCIgICAgV0lEVEggIiA8PHR3LT53aWR0aChqKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHR3LT5oYXNXaWR0aFBSTChqKSkgewotICAgICAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgICAgICBjb3V0IDw8IiBQUkwgIiA8PHR3LT53aWR0aFBSTChqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBybCA9IGZyQ29vcmQocm91bmQodHctPndpZHRoUFJMKGopICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSkpOwotICAgICAgICAgICAgZGVmYXVsdFBybCA9IHBybDsKLSAgICAgICAgICAgIC8vaGFzUHJsID0gdHJ1ZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy9pZiAoIWhhc1BybCkgewotICAgICAgICAgICAgLy8gIGRlZmF1bHRQcmwgPSAtYWJzKGZyQ29vcmQocm91bmQodHctPndpZHRoU3BhY2luZyhqLDApICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSkpKTsKLSAgICAgICAgICAgIC8vICBwcmwgPSBkZWZhdWx0UHJsOwotICAgICAgICAgICAgLy99Ci0gICAgICAgICAgfQotICAgICAgICAgIGNvbFZhbHMucHVzaF9iYWNrKGZyU3BhY2luZ1RhYmxlVHdSb3dUeXBlKHdpZHRoLCBwcmwpKTsKLSAgICAgICAgICByb3dWYWxzLnB1c2hfYmFjayhmclNwYWNpbmdUYWJsZVR3Um93VHlwZSh3aWR0aCwgcHJsKSk7Ci0gICAgICAgICAgdGJsUm93VmFscy5jbGVhcigpOwotICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgdHctPm51bVdpZHRoU3BhY2luZyhqKTsgaysrKSB7Ci0gICAgICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgICAgIGNvdXQgPDwiICIgPDx0dy0+d2lkdGhTcGFjaW5nKGosIGspOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJDb29yZCBzcGFjaW5nID0gZnJDb29yZChyb3VuZCh0dy0+d2lkdGhTcGFjaW5nKGosIGspICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSkpOwotICAgICAgICAgICAgdGJsUm93VmFscy5wdXNoX2JhY2soc3BhY2luZyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHRibFZhbHMucHVzaF9iYWNrKHRibFJvd1ZhbHMpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICBjb3V0IDw8IiA7IiA8PGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgdW5pcXVlX3B0cjxmckNvbnN0cmFpbnQ+IHVDb24gPSBtYWtlX3VuaXF1ZTxmclNwYWNpbmdUYWJsZVR3Q29uc3RyYWludD4oZnIyRExvb2t1cFRibChyb3dOYW1lLCByb3dWYWxzLCBjb2xOYW1lLCBjb2xWYWxzLCB0YmxWYWxzKSk7Ci0gICAgICAgIGF1dG8gcnB0ciA9IHN0YXRpY19jYXN0PGZyU3BhY2luZ1RhYmxlVHdDb25zdHJhaW50Kj4odUNvbi5nZXQoKSk7Ci0gICAgICAgIC8vY291dCA8PCJAdGVzdCAiIDw8cnB0ci0+ZmluZCgwLjE1NioyMDAwLCAwLjA3MioyMDAwLCAwLjAwMCoyMDAwKSAvIDIwMDAuMCA8PGVuZGw7Ci0gICAgICAgIC8vY291dCA8PCJAdGVzdCAiIDw8cnB0ci0+ZmluZCgwLjE1NioyMDAwLCAwLjE1NioyMDAwLCAwLjAwMCoyMDAwKSAvIDIwMDAuMCA8PGVuZGw7Ci0gICAgICAgIC8vY291dCA8PCJAdGVzdCAiIDw8cnB0ci0+ZmluZCgwLjIwOSoyMDAwLCAwLjA3MioyMDAwLCAwLjMwMCoyMDAwKSAvIDIwMDAuMCA8PGVuZGw7Ci0gICAgICAgIC8vY291dCA8PCJAdGVzdCAiIDw8cnB0ci0+ZmluZCgwLjIwOSoyMDAwLCAwLjE1NioyMDAwLCAwLjMwMCoyMDAwKSAvIDIwMDAuMCA8PGVuZGw7Ci0gICAgICAgIC8vY291dCA8PCJAdGVzdCAiIDw8cnB0ci0+ZmluZCgwLjAwMCoyMDAwLCAwLjAwMCoyMDAwLCAtMC4wMDEqMjAwMCkgLyAyMDAwLjAgPDxlbmRsOwotICAgICAgICAvL2NvdXQgPDwiQHRlc3QgIiA8PHJwdHItPmZpbmQoMC4wMDAqMjAwMCwgMC4wMDAqMjAwMCwgMC4wMDAqMjAwMCkgLyAyMDAwLjAgPDxlbmRsOwotICAgICAgICAvL2NvdXQgPDwiQHRlc3QgIiA8PHJwdHItPmZpbmQoMC4wMDAqMjAwMCwgMC4wMDAqMjAwMCwgMC4zMDAqMjAwMCkgLyAyMDAwLjAgPDxlbmRsOwotICAgICAgICAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5hZGRVQ29uc3RyYWludCh1Q29uKTsKLSAgICAgICAgdG1wTGF5ZXItPnNldE1pblNwYWNpbmcocnB0cik7Ci0gICAgICAgIC8vdmVjdG9yPGludD4gdHR0dHRlc3QgPSB7MCwxLDIsMyw0LDUsNiw3fTsKLSAgICAgICAgLy9hdXRvIGl0MSA9IHVwcGVyX2JvdW5kKHR0dHR0ZXN0LmJlZ2luKCksIHR0dHR0ZXN0LmVuZCgpLCAtMSk7Ci0gICAgICAgIC8vLS1pdDE7Ci0gICAgICAgIC8vYXV0byBpdDIgPSB1cHBlcl9ib3VuZCh0dHR0dGVzdC5iZWdpbigpLCB0dHR0dGVzdC5lbmQoKSwgMyk7Ci0gICAgICAgIC8vLS1pdDI7Ci0gICAgICAgIC8vY291dCA8PCJkaXN0MTogIiA8PGRpc3RhbmNlKHR0dHR0ZXN0LmJlZ2luKCksIGl0MSkgPDxlbmRsOwotICAgICAgICAvL2NvdXQgPDwiZGlzdDI6ICIgPDxkaXN0YW5jZSh0dHR0dGVzdC5iZWdpbigpLCBpdDIpIDw8ZW5kbDsKLQotICAgICAgfQotICAgIH0KLSAgICAKLQotICAgICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmFkZExheWVyKHVMYXllcik7Ci0gIH0gZWxzZSBpZiAoc3RyY21wKGxheWVyLT50eXBlKCksICJDVVQiKSA9PSAwICYmICgoaW86OlBhcnNlciopZGF0YSktPnJlYWRMYXllckNudCA+IDApIHsKLSAgICAvL2NvdXQgPDwiTEFZRVIgIiA8PGxheWVyLT5uYW1lKCkgPDxlbmRsIDw8Zmx1c2g7Ci0gICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgY291dCA8PCJMQVlFUiAiICAgICAgIDw8bGF5ZXItPm5hbWUoKSA8PGVuZGw7Ci0gICAgICBjb3V0IDw8IiAgVFlQRSAgICAgICIgPDxsYXllci0+dHlwZSgpIDw8ZW5kbDsKLSAgICB9Ci0gICAgdG1wTGF5ZXItPnNldExheWVyTnVtKCgoaW86OlBhcnNlciopZGF0YSktPnJlYWRMYXllckNudCsrKTsKLSAgICB0bXBMYXllci0+c2V0TmFtZShsYXllci0+bmFtZSgpKTsKLSAgICB0bXBMYXllci0+c2V0VHlwZShmckxheWVyVHlwZUVudW06OkNVVCk7Ci0gICAgLy90bXBMYXllci5pZHggICAgICAgID0gKChGbGV4Um91dGUqKWRhdGEpLT5yZWFkTGF5ZXJDbnQ7Ci0gICAgLy90bXBMYXllci5sYXllck5hbWUgID0gbGF5ZXItPm5hbWUoKTsKLSAgICAvL3RtcExheWVyLnR5cGUgICAgICAgPSBsYXllci0+dHlwZSgpOwotICAgIC8vaWYgKGxheWVyLT5udW1TcGFjaW5nKCkgPiAxKSB7Ci0gICAgLy8gIGNvdXQgPDwgIk51bVNwYWNpbmcgPSAiIDw8IGxheWVyLT5udW1TcGFjaW5nKCkgPDwgZW5kbDsKLSAgICAvLyAgdG1wTGF5ZXIubWluU3BhY2luZyA9IDA7Ci0gICAgLy8gIC8vIGNvdXQgPDwiVW5zdXBwb3J0ZWQgQ1VUIHNwYWNpbmchISEiIDw8ZW5kbDsKLSAgICAvLyAgLy8gZXhpdCgyKTsKLSAgICAvL30KLSAgICAvLy8vIFRPRE86IG5lZWQgdG8gaGFuZGxlIG11bHRpcGxlIHNwYWNpbmcgcnVsZXMKLSAgICAvL2ZvciAoaW50IGkgPSAwOyBpIDwgbGF5ZXItPm51bVNwYWNpbmcoKTsgKytpKSB7Ci0gICAgLy8gIGlmIChsYXllci0+aGFzU3BhY2luZ0FkamFjZW50KGkpKSB7Ci0gICAgLy8gICAgY291dCA8PCIgIFNQQUNJTkcgIiA8PGxheWVyLT5zcGFjaW5nKGkpIDw8IiBBREpBQ0VOVENVVFMgIiA8PGxheWVyLT5zcGFjaW5nQWRqYWNlbnRDdXRzKGkpCi0gICAgLy8gICAgICAgICA8PCIgV0lUSElOICIgPDxsYXllci0+c3BhY2luZ0FkamFjZW50V2l0aGluKGkpIDw8ZW5kbDsKLSAgICAvLyAgfSBlbHNlIHsKLSAgICAvLyAgICB0bXBMYXllci5taW5TcGFjaW5nID0gbWF4KHRtcExheWVyLm1pblNwYWNpbmcsIGxvY190KHJvdW5kKGxheWVyLT5zcGFjaW5nKGkpKiAoKEZsZXhSb3V0ZSopZGF0YSktPnVuaXRzKSkpOwotICAgIC8vICAgIGNvdXQgPDwiICBTUEFDSU5HICIgPDxsYXllci0+c3BhY2luZyhpKSA8PGVuZGw7Ci0gICAgLy8gIH0KLSAgICAvL30KLSAgICAvLygoRmxleFJvdXRlKilkYXRhKS0+bGF5ZXJzLnB1c2hfYmFjayh0bXBMYXllcik7Ci0gICAgLy8KLSAgICAvLygoRmxleFJvdXRlKilkYXRhKS0+bGF5ZXIySWR4W3RtcExheWVyLmxheWVyTmFtZV0gPSB0bXBMYXllci5pZHg7Ci0gICAgLy8KLSAgICAvLysrKCgoRmxleFJvdXRlKilkYXRhKS0+cmVhZExheWVyQ250KTsKLQotICAgIGF1dG8gc2hvcnRDb25zdHJhaW50ID0gbWFrZV9zaGFyZWQ8ZnJTaG9ydENvbnN0cmFpbnQ+KCk7Ci0gICAgc3RkOjpjb3V0IDw8ICJhZGQgc2hvcnRDb25zdHJhaW50IHRvIGxheWVyICIgPDx0bXBMYXllci0+Z2V0TmFtZSgpIDw8ICJcbiI7Ci0gICAgKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+YWRkQ29uc3RyYWludChzaG9ydENvbnN0cmFpbnQpOwotICAgIHRtcExheWVyLT5hZGRDb25zdHJhaW50KHNob3J0Q29uc3RyYWludCk7Ci0gICAgdG1wTGF5ZXItPnNldFNob3J0Q29uc3RyYWludChzaG9ydENvbnN0cmFpbnQuZ2V0KCkpOwotCi0gICAgLy8gcmVhZCBzcGFjaW5nIGNvbnN0cmFpbnQKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxheWVyLT5udW1TcGFjaW5nKCk7ICsraSkgewotICAgICAgc3RkOjpzaGFyZWRfcHRyPGZyQ3V0U3BhY2luZ0NvbnN0cmFpbnQ+IGN1dFNwYWNpbmdDb25zdHJhaW50OwotICAgICAgZnJDb29yZCBjdXRBcmVhID0gZnJDb29yZChyb3VuZChsYXllci0+c3BhY2luZ0FyZWEoaSkgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKSk7Ci0gICAgICBmckNvb3JkIGN1dFNwYWNpbmcgPSBmckNvb3JkKHJvdW5kKGxheWVyLT5zcGFjaW5nKGkpICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSkpOwotICAgICAgYm9vbCBjZW50ZXJUb0NlbnRlciA9IGxheWVyLT5oYXNTcGFjaW5nQ2VudGVyVG9DZW50ZXIoaSk7Ci0gICAgICBib29sIHNhbWVOZXQgPSBsYXllci0+aGFzU3BhY2luZ1NhbWVuZXQoaSk7Ci0gICAgICBib29sIHN0YWNrID0gbGF5ZXItPmhhc1NwYWNpbmdMYXllclN0YWNrKGkpOwotICAgICAgYm9vbCBleGNlcHRTYW1lUEdOZXQgPSBsYXllci0+aGFzU3BhY2luZ1NhbWVuZXRQR29ubHkoaSk7Ci0gICAgICBib29sIHBhcmFsbGVsT3ZlcmxhcCA9IGxheWVyLT5oYXNTcGFjaW5nUGFyYWxsZWxPdmVybGFwKGkpOwotICAgICAgZnJTdHJpbmcgc2Vjb25kTGF5ZXJOYW1lOwotICAgICAgaW50IGFkamFjZW50Q3V0cyA9IGxheWVyLT5zcGFjaW5nQWRqYWNlbnRDdXRzKGkpOwotICAgICAgZnJDb29yZCBjdXRXaXRoaW4gPSBmckNvb3JkKHJvdW5kKGxheWVyLT5zcGFjaW5nQWRqYWNlbnRXaXRoaW4oaSkgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKSk7Ci0KLSAgICAgIC8vIHN0ZDo6Y291dCA8PCBjdXRTcGFjaW5nIDw8ICIgIiA8PCBjZW50ZXJUb0NlbnRlciA8PCAiICIgPDwgc2FtZU5ldCA8PCAiICIgPDwgc3RhY2sgPDwgIiAiIDw8IGV4Y2VwdFNhbWVQR05ldCAKLSAgICAgIC8vICAgICAgICAgICA8PCAiICIgPDwgcGFyYWxsZWxPdmVybGFwIDw8ICIgIiA8PCBzZWNvbmRMYXllck5hbWUgPDwgIiAiIDw8IGFkamFjZW50Q3V0cyA8PCAiICIgPDwgY3V0V2l0aGluIDw8ICJcbiI7Ci0KLSAgICAgIC8vIHN0ZDo6Y291dCA8PCAicmF3IGN1dEFyZWEgPSAiIDw8IGxheWVyLT5zcGFjaW5nQXJlYShpKSA8PCAiXG4iOwotICAgICAgLy8gc3RkOjpjb3V0IDw8ICJjdXRBcmVhID0gIiA8PCBjdXRBcmVhIDw8ICJcbiI7Ci0gICAgICAvLyBpbml0aWFsaXplIGZvciBpbnZhbGlkIHZhcmlhYmxlcwotICAgICAgY3V0QXJlYSA9IChjdXRBcmVhID09IDApID8gLTEgOiBjdXRBcmVhOwotICAgICAgY3V0V2l0aGluID0gKGN1dFdpdGhpbiA9PSAwKSA/IC0xIDogY3V0V2l0aGluOwotICAgICAgYWRqYWNlbnRDdXRzID0gKGFkamFjZW50Q3V0cyA9PSAwKSA/IC0xIDogYWRqYWNlbnRDdXRzOwotICAgICAgLy8gc3RkOjpjb3V0IDw8ICJjdXRBcmVhID0gIiA8PCBjdXRBcmVhIDw8ICJcbiI7Ci0KLQotICAgICAgLy8gaWYgKGxheWVyLT5oYXNTcGFjaW5nQWRqYWNlbnQoaSkpIHsKLQotICAgICAgLy8gfSBlbHNlIHsKLQotICAgICAgLy8gfQotCi0gICAgICBjdXRTcGFjaW5nQ29uc3RyYWludCA9IG1ha2Vfc2hhcmVkPGZyQ3V0U3BhY2luZ0NvbnN0cmFpbnQ+KGN1dFNwYWNpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlclRvQ2VudGVyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtZU5ldCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZExheWVyTmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGphY2VudEN1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dFdpdGhpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0U2FtZVBHTmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbGxlbE92ZXJsYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dEFyZWEpOwotCi0gICAgICAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5hZGRDb25zdHJhaW50KGN1dFNwYWNpbmdDb25zdHJhaW50KTsKLSAgICAgIHRtcExheWVyLT5hZGRDb25zdHJhaW50KGN1dFNwYWNpbmdDb25zdHJhaW50KTsKLSAgICAgIHRtcExheWVyLT5hZGRDdXRDb25zdHJhaW50KGN1dFNwYWNpbmdDb25zdHJhaW50LmdldCgpKTsKLQotICAgIH0KLQotICAgIC8vIGxlZjU4Ci0gICAgLy9jb3V0IDw8Im51bWJlciBvZiBwcm9wcyAiIDw8bGF5ZXItPm51bVByb3BzKCkgPDxlbmRsOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGF5ZXItPm51bVByb3BzKCk7IGkrKykgewotICAgICAgaWYgKHN0cmluZyhsYXllci0+cHJvcE5hbWUoaSkpID09IHN0cmluZygiTEVGNThfRU5DTE9TVVJFRURHRSIpIHx8Ci0gICAgICAgICAgc3RyaW5nKGxheWVyLT5wcm9wTmFtZShpKSkgPT0gc3RyaW5nKCJMRUY1OF9FTkNMT1NVUkUiKSB8fAotICAgICAgICAgIHN0cmluZyhsYXllci0+cHJvcE5hbWUoaSkpID09IHN0cmluZygiTEVGNThfRU5DTE9TVVJFVEFCTEUiKQotICAgICAgICAgKSB7Ci0gICAgICAgIDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vY291dCA8PCJuYW1lOiAgICAgIiA8PGxheWVyLT5wcm9wTmFtZShpKSA8PGVuZGw7Ci0gICAgICAgIC8vY291dCA8PCJ2YWx1ZTogICAgIiA8PGxheWVyLT5wcm9wVmFsdWUoaSkgPDxlbmRsOwotICAgICAgICAvL2NvdXQgPDwibnVtYmVyOiAgICIgPDxsYXllci0+cHJvcE51bWJlcihpKSA8PGVuZGw7Ci0gICAgICAgIC8vY291dCA8PCJ0eXBlOiAgICAgIiA8PGxheWVyLT5wcm9wVHlwZShpKSA8PGVuZGw7Ci0gICAgICAgIC8vY291dCA8PCJpc051bWJlcjogIiA8PGxheWVyLT5wcm9wSXNOdW1iZXIoaSkgPDxlbmRsOwotICAgICAgICAvL2NvdXQgPDwiaXNTdHJpbmc6ICIgPDxsYXllci0+cHJvcElzU3RyaW5nKGkpIDw8ZW5kbDsKLSAgICAgICAgLy9pZiAoIXN0cmNtcChsYXllci0+cHJvcE5hbWUoaSksICJMRUY1OF9DT1JORVJTUEFDSU5HIikgJiYgbGF5ZXItPnByb3BJc1N0cmluZyhpKSkgewotICAgICAgICAvLyAgLy9jb3V0IDw8InN0YXJ0IHBhcnNpbmcgTEVGNThfQ09STkVSU1BBQ0lORyIgPDxlbmRsOwotICAgICAgICAvLyAgZ2V0TGVmNThDb3JuZXJTcGFjaW5nKGRhdGEsIGxheWVyLT5wcm9wVmFsdWUoaSkpOwotICAgICAgICAvL30KLSAgICAgICAgaWYgKCFzdHJjbXAobGF5ZXItPnByb3BOYW1lKGkpLCAiTEVGNThfQ1VUQ0xBU1MiKSAmJiBsYXllci0+cHJvcElzU3RyaW5nKGkpKSB7Ci0gICAgICAgICAgLy9jb3V0IDw8InN0YXJ0IHBhcnNpbmcgTEVGNThfQ09STkVSU1BBQ0lORyIgPDxlbmRsOwotICAgICAgICAgIC8vY291dCA8PCJuYW1lOiAgICAgIiA8PGxheWVyLT5wcm9wTmFtZShpKSA8PGVuZGw7Ci0gICAgICAgICAgLy9jb3V0IDw8InZhbHVlOiAgICAiIDw8bGF5ZXItPnByb3BWYWx1ZShpKSA8PGVuZGw7Ci0gICAgICAgICAgZ2V0TGVmNThDdXRDbGFzcyhkYXRhLCB0bXBMYXllciwgbGF5ZXItPnByb3BWYWx1ZShpKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChsYXllci0+cHJvcE5hbWUoaSksICJMRUY1OF9TUEFDSU5HIikgJiYgbGF5ZXItPnByb3BJc1N0cmluZyhpKSkgewotICAgICAgICAgIC8vY291dCA8PCJzdGFydCBwYXJzaW5nIExFRjU4X0NPUk5FUlNQQUNJTkciIDw8ZW5kbDsKLSAgICAgICAgICAvL2NvdXQgPDwibmFtZTogICAgICIgPDxsYXllci0+cHJvcE5hbWUoaSkgPDxlbmRsOwotICAgICAgICAgIC8vY291dCA8PCJ2YWx1ZTogICAgIiA8PGxheWVyLT5wcm9wVmFsdWUoaSkgPDxlbmRsOwotICAgICAgICAgIGdldExlZjU4Q3V0U3BhY2luZyhkYXRhLCB0bXBMYXllciwgbGF5ZXItPnByb3BWYWx1ZShpKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChsYXllci0+cHJvcE5hbWUoaSksICJMRUY1OF9TUEFDSU5HVEFCTEUiKSAmJiBsYXllci0+cHJvcElzU3RyaW5nKGkpKSB7Ci0gICAgICAgICAgLy9jb3V0IDw8InN0YXJ0IHBhcnNpbmcgTEVGNThfQ09STkVSU1BBQ0lORyIgPDxlbmRsOwotICAgICAgICAgIC8vY291dCA8PCJuYW1lOiAgICAgIiA8PGxheWVyLT5wcm9wTmFtZShpKSA8PGVuZGw7Ci0gICAgICAgICAgLy9jb3V0IDw8InZhbHVlOiAgICAiIDw8bGF5ZXItPnByb3BWYWx1ZShpKSA8PGVuZGw7Ci0gICAgICAgICAgZ2V0TGVmNThDdXRTcGFjaW5nVGFibGUoZGF0YSwgdG1wTGF5ZXIsIGxheWVyLT5wcm9wVmFsdWUoaSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGNvdXQgPDwiICBuYW1lOiAgICAgIiA8PGxheWVyLT5wcm9wTmFtZShpKSA8PGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+YWRkTGF5ZXIodUxheWVyKTsKLSAgfSBlbHNlIHsKLSAgICA7Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotaW50IGlvOjpQYXJzZXI6OmdldExlZk1hY3JvcyhsZWZyQ2FsbGJhY2tUeXBlX2UgdHlwZSwgbGVmaU1hY3JvKiBtYWNybywgbGVmaVVzZXJEYXRhIGRhdGEpIHsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIGlmICgodHlwZSAhPSBsZWZyTWFjcm9DYmtUeXBlKSkgewotICAgIGNvdXQgPDwiVHlwZSBpcyBub3QgbGVmck1hY3JvQ2JrVHlwZSEiIDw8ZW5kbDsKLSAgICBleGl0KDIpOwotICB9Ci0KLSAgZnJDb29yZCBvcmlnaW5YID0gcm91bmQobWFjcm8tPm9yaWdpblgoKSAqICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmdldERCVVBlclVVKCkpOyAKLSAgZnJDb29yZCBvcmlnaW5ZID0gcm91bmQobWFjcm8tPm9yaWdpblkoKSAqICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmdldERCVVBlclVVKCkpOwotICBmckNvb3JkIHNpemVYICAgPSByb3VuZChtYWNyby0+c2l6ZVgoKSAgICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSk7Ci0gIGZyQ29vcmQgc2l6ZVkgICA9IHJvdW5kKG1hY3JvLT5zaXplWSgpICAgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKTsKLSAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgIGNvdXQgPDwiICBPUklHSU4gIiA8PG9yaWdpblggKiAxLjAgLyAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpIDw8IiAiIAotICAgICAgICAgICAgICAgICAgICAgICA8PG9yaWdpblkgKiAxLjAgLyAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpIDw8IiA7IiA8PGVuZGw7Ci0gICAgY291dCA8PCIgIFNJWkUgICAiIDw8c2l6ZVggICAqIDEuMCAvICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmdldERCVVBlclVVKCkgPDwiICIgCi0gICAgICAgICAgICAgICAgICAgICAgIDw8c2l6ZVkgICAqIDEuMCAvICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmdldERCVVBlclVVKCkgPDwiIDsiIDw8ZW5kbDsKLSAgfQotICB2ZWN0b3I8ZnJCb3VuZGFyeT4gYm91bmRzOwotICBmckJvdW5kYXJ5IGJvdW5kOwotICB2ZWN0b3I8ZnJQb2ludD4gcG9pbnRzOwotICBwb2ludHMucHVzaF9iYWNrKGZyUG9pbnQob3JpZ2luWCwgb3JpZ2luWSkpOwotICBwb2ludHMucHVzaF9iYWNrKGZyUG9pbnQoc2l6ZVgsICAgb3JpZ2luWSkpOwotICBwb2ludHMucHVzaF9iYWNrKGZyUG9pbnQoc2l6ZVgsICAgc2l6ZVkpKTsKLSAgcG9pbnRzLnB1c2hfYmFjayhmclBvaW50KG9yaWdpblgsIHNpemVZKSk7Ci0gIGJvdW5kLnNldFBvaW50cyhwb2ludHMpOwotICBib3VuZHMucHVzaF9iYWNrKGJvdW5kKTsKLSAgLy8oKGlvOjpQYXJzZXIqKWRhdGEpLT50bXBCbG9jay0+c2V0QkJveChmckJveChvcmlnaW5YLCBvcmlnaW5ZLCBzaXplWCwgc2l6ZVkpKTsKLSAgKChpbzo6UGFyc2VyKilkYXRhKS0+dG1wQmxvY2stPnNldEJvdW5kYXJpZXMoYm91bmRzKTsKLQotICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgaWYgKG1hY3JvLT5oYXNDbGFzcygpKSB7Ci0gICAgICBzdGQ6OmNvdXQgPDwgbWFjcm8tPm1hY3JvQ2xhc3MoKSA8PCAiXG4iOwotICAgIH0KLSAgfQotICBpZiAobWFjcm8tPmhhc0NsYXNzKCkpIHsKLSAgICBpZiAoc3RyY21wKG1hY3JvLT5tYWNyb0NsYXNzKCksICJDT1JFIikgPT0gMCkgewotICAgICAgKChpbzo6UGFyc2VyKilkYXRhKS0+dG1wQmxvY2stPnNldE1hY3JvQ2xhc3MoTWFjcm9DbGFzc0VudW06OkNPUkUpOwotICAgIH0gZWxzZSBpZiAoc3RyY21wKG1hY3JvLT5tYWNyb0NsYXNzKCksICJDT1JFIFRJRUhJR0giKSA9PSAwKSB7Ci0gICAgICAoKGlvOjpQYXJzZXIqKWRhdGEpLT50bXBCbG9jay0+c2V0TWFjcm9DbGFzcyhNYWNyb0NsYXNzRW51bTo6Q09SRV9USUVISUdIKTsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcChtYWNyby0+bWFjcm9DbGFzcygpLCAiQ09SRSBUSUVMT1ciKSA9PSAwKSB7Ci0gICAgICAoKGlvOjpQYXJzZXIqKWRhdGEpLT50bXBCbG9jay0+c2V0TWFjcm9DbGFzcyhNYWNyb0NsYXNzRW51bTo6Q09SRV9USUVMT1cpOwotICAgIH0gZWxzZSBpZiAoc3RyY21wKG1hY3JvLT5tYWNyb0NsYXNzKCksICJDT1JFIFdFTExUQVAiKSA9PSAwKSB7Ci0gICAgICAoKGlvOjpQYXJzZXIqKWRhdGEpLT50bXBCbG9jay0+c2V0TWFjcm9DbGFzcyhNYWNyb0NsYXNzRW51bTo6Q09SRV9XRUxMVEFQKTsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcChtYWNyby0+bWFjcm9DbGFzcygpLCAiQ09SRSBTUEFDRVIiKSA9PSAwKSB7Ci0gICAgICAoKGlvOjpQYXJzZXIqKWRhdGEpLT50bXBCbG9jay0+c2V0TWFjcm9DbGFzcyhNYWNyb0NsYXNzRW51bTo6Q09SRV9TUEFDRVIpOwotICAgIH0gZWxzZSBpZiAoc3RyY21wKG1hY3JvLT5tYWNyb0NsYXNzKCksICJDT1JFIEFOVEVOTkFDRUxMIikgPT0gMCkgewotICAgICAgKChpbzo6UGFyc2VyKilkYXRhKS0+dG1wQmxvY2stPnNldE1hY3JvQ2xhc3MoTWFjcm9DbGFzc0VudW06OkNPUkVfQU5URU5OQUNFTEwpOwotICAgIH0gZWxzZSBpZiAoc3RyY21wKG1hY3JvLT5tYWNyb0NsYXNzKCksICJFTkRDQVAgUFJFIikgPT0gMCkgewotICAgICAgKChpbzo6UGFyc2VyKilkYXRhKS0+dG1wQmxvY2stPnNldE1hY3JvQ2xhc3MoTWFjcm9DbGFzc0VudW06OkVORENBUF9QUkUpOwotICAgIH0gZWxzZSBpZiAoc3RyY21wKG1hY3JvLT5tYWNyb0NsYXNzKCksICJCTE9DSyIpID09IDApIHsKLSAgICAgICgoaW86OlBhcnNlciopZGF0YSktPnRtcEJsb2NrLT5zZXRNYWNyb0NsYXNzKE1hY3JvQ2xhc3NFbnVtOjpCTE9DSyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvdXQgPDwgIldhcm5pbmc6IHVua25vd24gbWFjcm9DbGFzcyAiIDw8IG1hY3JvLT5tYWNyb0NsYXNzKCkgPDwgIiwgc2tpcHBlZCBtYWNyb0NsYXNzIHByb3BlcnR5XG4iOyAKLSAgICB9Ci0gIH0KLQotCi0gIHJldHVybiAwOwotfQotCi1pbnQgaW86OlBhcnNlcjo6Z2V0TGVmUGlucyhsZWZyQ2FsbGJhY2tUeXBlX2UgdHlwZSwgbGVmaVBpbiogcGluLCBsZWZpVXNlckRhdGEgZGF0YSkgewotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgaWYgKHR5cGUgIT0gbGVmclBpbkNia1R5cGUpIHsKLSAgICBjb3V0IDw8IlR5cGUgaXMgbm90IGxlZnJQaW5DYmtUeXBlISIgPDxlbmRsOwotICAgIGV4aXQoMSk7Ci0gIH0KLQotICAvLyB0ZXJtCi0gIHVuaXF1ZV9wdHI8ZnJUZXJtPiAgICAgICAgIHVUZXJtID0gbWFrZV91bmlxdWU8ZnJUZXJtPihwaW4tPm5hbWUoKSk7Ci0gIGF1dG8gdGVybSA9IHVUZXJtLmdldCgpOwotICB0ZXJtLT5zZXRJZCgoKGlvOjpQYXJzZXIqKWRhdGEpLT5udW1UZXJtcyk7Ci0gICgoaW86OlBhcnNlciopZGF0YSktPm51bVRlcm1zKys7Ci0gIC8vIHRlcm0gc2hvdWxkIGFkZCBwaW4KLSAgLy8gaW5zdFRlcm0KLSAgLy9zaGFyZWRfcHRyPGZySW5zdFRlcm0+IGluc3RUZXJtID0gbWFrZV9zaGFyZWQ8ZnJJbnN0VGVybT4oKTsKLSAgLy9pbnN0VGVybS0+YWRkVG9JbnN0KCgoRmxleFJvdXRlKilkYXRhKS0+dG1wTWFjcm8pOwotICAvL2luc3RUZXJtLT5hZGRUZXJtKHRlcm0pOwotICAvLyBpbnN0VGVybSBjcmVhdGlvbiBjb21wbGV0ZWQKLQotICAvLyBpbnN0IAotICAoKGlvOjpQYXJzZXIqKWRhdGEpLT50bXBCbG9jay0+YWRkVGVybSh1VGVybSk7Ci0gIC8vIGluc3QgY29tcGxldGVkCi0KLSAgCi0gIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICBjb3V0IDw8IiAgUElOICIgPDxwaW4tPm5hbWUoKSA8PGVuZGw7Ci0gIH0KLSAgCi0gIGZyVGVybUVudW0gdGVybVR5cGUgPSBmclRlcm1FbnVtOjpmcmNOb3JtYWxUZXJtOwotICBpZiAocGluLT5oYXNVc2UoKSkgewotICAgIHN0cmluZyBzdHIocGluLT51c2UoKSk7Ci0gICAgaWYgKHN0ciA9PSAiU0lHTkFMIikgewotICAgICAgOwotICAgIH0gZWxzZSBpZiAoc3RyID09ICJDTE9DSyIpIHsKLSAgICAgIHRlcm1UeXBlID0gZnJUZXJtRW51bTo6ZnJjQ2xvY2tUZXJtOwotICAgIH0gZWxzZSBpZiAoc3RyID09ICJQT1dFUiIpIHsKLSAgICAgIHRlcm1UeXBlID0gZnJUZXJtRW51bTo6ZnJjUG93ZXJUZXJtOwotICAgIH0gZWxzZSBpZiAoc3RyID09ICJHUk9VTkQiKSB7Ci0gICAgICB0ZXJtVHlwZSA9IGZyVGVybUVudW06OmZyY0dyb3VuZFRlcm07Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvdXQgPDwiRXJyb3I6IHVuc3VwcG9ydGVkIFBJTiBVU0UgaW4gbGVmIiA8PGVuZGw7Ci0gICAgICBleGl0KDEpOwotICAgIH0KLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBjb3V0IDw8IiAgICBVU0UgIiA8PHN0ciA8PCIgOyIgPDxlbmRsOwotICAgIH0KLSAgfQotICB0ZXJtLT5zZXRUeXBlKHRlcm1UeXBlKTsKLQotICBpbnQgbnVtUG9ydHMgPSBwaW4tPm51bVBvcnRzKCk7Ci0gIGludCBudW1JdGVtcyA9IDA7Ci0gIGludCBpdGVtVHlwZSA9IDA7Ci0gIC8vIGNvdXQgPDwicGluLT5udW1Qb3J0czogIiA8PG51bVBvcnRzIDw8ZW5kbDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Qb3J0czsgKytpKSB7Ci0gICAgbnVtSXRlbXMgPSBwaW4tPnBvcnQoaSktPm51bUl0ZW1zKCk7Ci0gICAgLy8gY291dCA8PCJwaW4tPnBvcnRzKCIgPDxpIDw8IiktPm51bUl0ZW1zOiAiIDw8bnVtSXRlbXMgPDxlbmRsOwotICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgIGNvdXQgPDwiICAgIFBPUlQiIDw8ZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBwaW4KLSAgICBhdXRvIHBpbkluID0gbWFrZV91bmlxdWU8ZnJQaW4+KCk7Ci0gICAgcGluSW4tPnNldElkKGkpOwotICAgIC8vcGluSW4tPnNldFRlcm0odGVybSk7Ci0gICAgLy8gcGluIHNob3VsZCBhZGQgcGluRmlncwotCi0gICAgLy8gdGVybQotCi0gICAgZnJMYXllck51bSBsYXllck51bSA9IDA7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBudW1JdGVtczsgKytqKSB7Ci0gICAgICBpdGVtVHlwZSA9IHBpbi0+cG9ydChpKS0+aXRlbVR5cGUoaik7Ci0gICAgICBpZiAoaXRlbVR5cGUgPT0gMSkgewotICAgICAgICBzdHJpbmcgbGF5ZXIgPSBwaW4tPnBvcnQoaSktPmdldExheWVyKGopOwotICAgICAgICBpZiAoKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+bmFtZTJsYXllci5maW5kKGxheWVyKSA9PSAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5uYW1lMmxheWVyLmVuZCgpKSB7Ci0gICAgICAgICAgaWYgKFZFUkJPU0UgPiAtMSkgewotICAgICAgICAgICAgY291dCA8PCJXYXJuaW5nOiBsYXllciAiIDw8bGF5ZXIgPDwiIGlzIHNraXBwZWQgZm9yICIgPDwoKGlvOjpQYXJzZXIqKWRhdGEpLT50bXBCbG9jay0+Z2V0TmFtZSgpIDw8Ii8iIDw8cGluLT5uYW1lKCkgPDxlbmRsOwotICAgICAgICAgIH0KLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGxheWVyTnVtID0gKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+bmFtZTJsYXllci5hdChsYXllciktPmdldExheWVyTnVtKCk7Ci0gICAgICAgIC8vY291dCA8PCIgIGxheWVyOiAiIDw8cGluLT5wb3J0KGkpLT5nZXRMYXllcihqKSA8PGVuZGw7Ci0gICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICBjb3V0IDw8IiAgICBMQVlFUiAiIDw8bGF5ZXIgPDwiIDsiIDw8ZW5kbDsKLSAgICAgICAgfQotICAgICAgICAvL2NvdXQgPDwiICAgIExBWUVSTlVNICIgPDxsYXllck51bSA8PCIgOyIgPDxlbmRsOwotICAgICAgfSBlbHNlIGlmIChpdGVtVHlwZSA9PSA4KSB7Ci0gICAgICAgIGZyQ29vcmQgeGwgPSByb3VuZChwaW4tPnBvcnQoaSktPmdldFJlY3QoaiktPnhsICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSk7Ci0gICAgICAgIGZyQ29vcmQgeWwgPSByb3VuZChwaW4tPnBvcnQoaSktPmdldFJlY3QoaiktPnlsICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSk7Ci0gICAgICAgIGZyQ29vcmQgeGggPSByb3VuZChwaW4tPnBvcnQoaSktPmdldFJlY3QoaiktPnhoICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSk7Ci0gICAgICAgIGZyQ29vcmQgeWggPSByb3VuZChwaW4tPnBvcnQoaSktPmdldFJlY3QoaiktPnloICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSk7Ci0KLSAgICAgICAgLy8gcGluRmlnCi0gICAgICAgIC8vc2hhcmVkX3B0cjxmclBpbkZpZz4gcGluRmlnID0gbWFrZV9zaGFyZWQ8ZnJSZWN0PigpOwotICAgICAgICB1bmlxdWVfcHRyPGZyUmVjdD4gcGluRmlnID0gbWFrZV91bmlxdWU8ZnJSZWN0PigpOwotICAgICAgICBwaW5GaWctPnNldEJCb3goZnJCb3goeGwsIHlsLCB4aCwgeWgpKTsKLSAgICAgICAgcGluRmlnLT5hZGRUb1BpbihwaW5Jbi5nZXQoKSk7Ci0gICAgICAgIHBpbkZpZy0+c2V0TGF5ZXJOdW0obGF5ZXJOdW0pOwotICAgICAgICAvLyBwaW5GaWcgY29tcGxldGVkCi0gICAgICAgIC8vIHBpbgotICAgICAgICB1bmlxdWVfcHRyPGZyUGluRmlnPiB1cHRyKHN0ZDo6bW92ZShwaW5GaWcpKTsKLSAgICAgICAgcGluSW4tPmFkZFBpbkZpZyh1cHRyKTsKLSAgICAgICAgUmVjdGFuZ2xlIHBpbkZpZ1JlY3QoeGwsIHlsLCB4aCwgeWgpOwotICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgIigiIDw8IHhsIDw8ICIsICIgPDwgeWwgPDwgIikgLS0gKCIgPDwgeGggPDwgIiwgIiA8PCB5aCA8PCAiKVxuIjsKLSAgICAgICAgcGluSW4tPmFkZExheWVyU2hhcGUobGF5ZXJOdW0sIHBpbkZpZ1JlY3QpOwotICAgICAgICAvLyBwaW4gY29tcGxldGVkCi0KLSAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgIGNvdXQgPDwiICAgICAgUkVDVCAiIDw8eGwgKiAxLjAgLyAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpIDw8IiAiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8eWwgKiAxLjAgLyAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpIDw8IiAiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8eGggKiAxLjAgLyAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpIDw8IiAiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8eWggKiAxLjAgLyAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpIDw8IiA7IiA8PGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAKLSAgICAgIH0gZWxzZSBpZiAoaXRlbVR5cGUgPT0gMTApIHsKLSAgICAgICAgLy9Qb2x5Z29uIHBvbHlnb247Ci0gICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICBjb3V0IDw8IiAgICAgIFBPTFlHT04iOyAKLSAgICAgICAgfQotICAgICAgICBmckNvbGxlY3Rpb248ZnJQb2ludD4gdG1wUG9pbnRzOwotICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHBpbi0+cG9ydChpKS0+Z2V0UG9seWdvbihqKS0+bnVtUG9pbnRzOyBrKyspIHsKLSAgICAgICAgICBmckNvb3JkIHggPSByb3VuZChwaW4tPnBvcnQoaSktPmdldFBvbHlnb24oaiktPnhba10gKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKTsKLSAgICAgICAgICBmckNvb3JkIHkgPSByb3VuZChwaW4tPnBvcnQoaSktPmdldFBvbHlnb24oaiktPnlba10gKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKTsKLSAgICAgICAgICB0bXBQb2ludHMucHVzaF9iYWNrKGZyUG9pbnQoeCwgeSkpOwotICAgICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICAgICBjb3V0IDw8IiAiIDw8eCAqIDEuMCAvICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmdldERCVVBlclVVKCkgPDwiICIgCi0gICAgICAgICAgICAgICAgICAgICAgICA8PHkgKiAxLjAgLyAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBwaW5GaWcKLSAgICAgICAgdW5pcXVlX3B0cjxmclBvbHlnb24+IHBpbkZpZyA9IG1ha2VfdW5pcXVlPGZyUG9seWdvbj4oKTsKLSAgICAgICAgcGluRmlnLT5zZXRQb2ludHModG1wUG9pbnRzKTsKLSAgICAgICAgcGluRmlnLT5hZGRUb1BpbihwaW5Jbi5nZXQoKSk7Ci0gICAgICAgIHBpbkZpZy0+c2V0TGF5ZXJOdW0obGF5ZXJOdW0pOwotICAgICAgICAvLyBwaW5GaWcgY29tcGxldGVkCi0gICAgICAgIC8vIHBpbgotICAgICAgICB1bmlxdWVfcHRyPGZyUGluRmlnPiB1cHRyKHN0ZDo6bW92ZShwaW5GaWcpKTsKLSAgICAgICAgcGluSW4tPmFkZFBpbkZpZyh1cHRyKTsKLSAgICAgICAgUG9seWdvbiBwaW5GaWdQb2x5OwotICAgICAgICBmclZlY3RvcjxQb2ludD4gYm9vc3RQb2x5UG9pbnRzOwotICAgICAgICBmb3IgKGF1dG8gJnB0OiB0bXBQb2ludHMpIHsKLSAgICAgICAgICBib29zdFBvbHlQb2ludHMucHVzaF9iYWNrKFBvaW50KHB0LngoKSwgcHQueSgpKSk7Ci0gICAgICAgICAgLy8gc3RkOjpjb3V0IDw8IHB0LngoKSA8PCAiICIgPDwgcHQueSgpIDw8ICJcbiI7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vc3Q6OnBvbHlnb246OnNldF9wb2ludHMocGluRmlnUG9seSwgYm9vc3RQb2x5UG9pbnRzLmJlZ2luKCksIGJvb3N0UG9seVBvaW50cy5lbmQoKSk7Ci0gICAgICAgIHBpbkluLT5hZGRMYXllclNoYXBlKGxheWVyTnVtLCBwaW5GaWdQb2x5KTsKLSAgICAgICAgLy8gcGluIGNvbXBsZXRlZAotCi0gICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICBjb3V0IDw8IiA7IiA8PGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChWRVJCT1NFID4gLTEpIHsKLSAgICAgICAgICBjb3V0IDw8InVuc3VwcG9ydGVkIGxlZmlHZW9tZXRyaWVzISIgPDxlbmRsOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgICAvLyBleGl0KDIpOwotICAgICAgfQotICAgICAgLy9jb3V0IDw8IiAgZW51bTogIiA8PHBpbi0+cG9ydChpKS0+aXRlbVR5cGUoaikgPDxlbmRsOwotICAgIH0KLSAgICB0ZXJtLT5hZGRQaW4ocGluSW4pOwotICAgIC8vIHRlcm0gY29tcGxldGVkCi0gICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgY291dCA8PCIgICAgRU5EIiA8PGVuZGw7Ci0gICAgfQotICB9Ci0gIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICBjb3V0IDw8IiAgRU5EICIgPDxwaW4tPm5hbWUoKSA8PGVuZGw7Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotCi1pbnQgaW86OlBhcnNlcjo6Z2V0TGVmT2JzKGxlZnJDYWxsYmFja1R5cGVfZSB0eXBlLCBsZWZpT2JzdHJ1Y3Rpb24qIG9icywgbGVmaVVzZXJEYXRhIGRhdGEpIHsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0KLSAgaWYgKHR5cGUgIT0gbGVmck9ic3RydWN0aW9uQ2JrVHlwZSkgewotICAgIGNvdXQgPDwiVHlwZSBpcyBub3QgbGVmck9ic3RydWN0aW9uQ2JrVHlwZSEiIDw8ZW5kbDsKLSAgICBleGl0KDEpOwotICB9Ci0KLSAgdmVjdG9yPHVuaXF1ZV9wdHI8ZnJCbG9ja2FnZT4gPiBibGtzOwotCi0gIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICBjb3V0IDw8IiAgT0JTIiA8PGVuZGw7Ci0gIH0KLSAgCi0gIGF1dG8gZ2VvbWV0cnkgPSBvYnMtPmdlb21ldHJpZXMoKTsKLSAgaW50IG51bUl0ZW1zICA9IGdlb21ldHJ5LT5udW1JdGVtcygpOwotICAKLSAgc3RyaW5nIGxheWVyID0gIiI7Ci0gIGZyTGF5ZXJOdW0gbGF5ZXJOdW0gPSAwOwotICBmb3IgKGludCBpID0gMDsgaSA8IG51bUl0ZW1zOyArK2kpIHsKLSAgICBpZiAoZ2VvbWV0cnktPml0ZW1UeXBlKGkpID09IGxlZmlHZW9tTGF5ZXJFKSB7Ci0gICAgICBsYXllciA9IGdlb21ldHJ5LT5nZXRMYXllcihpKTsKLSAgICAgIGlmICgoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5uYW1lMmxheWVyLmZpbmQobGF5ZXIpICE9ICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPm5hbWUybGF5ZXIuZW5kKCkpIHsKLSAgICAgICAgbGF5ZXJOdW0gPSAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5uYW1lMmxheWVyW2xheWVyXS0+Z2V0TGF5ZXJOdW0oKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChWRVJCT1NFID4gMikgewotICAgICAgICAgIGNvdXQgPDwiV2FybmluZzogbGF5ZXIgIiA8PGdlb21ldHJ5LT5nZXRMYXllcihpKSA8PCIgaXMgc2tpcHBlZCBmb3IgIiA8PCgoaW86OlBhcnNlciopZGF0YSktPnRtcEJsb2NrLT5nZXROYW1lKCkgPDwiL09CUyIgPDxlbmRsOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiICAgIExBWUVSICIgPDxsYXllciA8PCIgOyIgPDxlbmRsOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoZ2VvbWV0cnktPml0ZW1UeXBlKGkpID09IGxlZmlHZW9tUmVjdEUpIHsKLSAgICAgIGF1dG8gcmVjdCA9IGdlb21ldHJ5LT5nZXRSZWN0KGkpOwotICAgICAgZnJDb29yZCB4bCA9IHJvdW5kKHJlY3QtPnhsICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSk7Ci0gICAgICBmckNvb3JkIHlsID0gcm91bmQocmVjdC0+eWwgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKTsKLSAgICAgIGZyQ29vcmQgeGggPSByb3VuZChyZWN0LT54aCAqICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmdldERCVVBlclVVKCkpOwotICAgICAgZnJDb29yZCB5aCA9IHJvdW5kKHJlY3QtPnloICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSk7Ci0gICAgICBmckJveCBib3goeGwsIHlsLCB4aCwgeWgpOwotICAgICAgeGwgPSBib3gubGVmdCgpOwotICAgICAgeWwgPSBib3guYm90dG9tKCk7Ci0gICAgICB4aCA9IGJveC5yaWdodCgpOwotICAgICAgeWggPSBib3gudG9wKCk7Ci0gICAgICB2ZWN0b3I8ZnJQb2ludD4gcG9pbnRzOwotICAgICAgcG9pbnRzLnB1c2hfYmFjayhmclBvaW50KHhsLHlsKSk7Ci0gICAgICBwb2ludHMucHVzaF9iYWNrKGZyUG9pbnQoeGgseWwpKTsKLSAgICAgIHBvaW50cy5wdXNoX2JhY2soZnJQb2ludCh4aCx5aCkpOwotICAgICAgcG9pbnRzLnB1c2hfYmFjayhmclBvaW50KHhsLHloKSk7Ci0gICAgICBhdXRvIGJsayA9IG1ha2VfdW5pcXVlPGZyTGF5ZXJCbG9ja2FnZT4oKTsKLSAgICAgIGJsay0+c2V0SWQoKChpbzo6UGFyc2VyKilkYXRhKS0+bnVtQmxvY2thZ2VzKTsKLSAgICAgICgoaW86OlBhcnNlciopZGF0YSktPm51bUJsb2NrYWdlcysrOwotICAgICAgYmxrLT5zZXRMYXllck51bShsYXllck51bSk7Ci0gICAgICBibGstPnNldFBvaW50cyhwb2ludHMpOwotICAgICAgYmxrcy5wdXNoX2JhY2soc3RkOjptb3ZlKGJsaykpOwotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8IiAgICAgIFJFQ1QgIiA8PHJlY3QtPnhsIDw8IiAiIDw8cmVjdC0+eWwgPDwiICIgPDxyZWN0LT54aCA8PCIgIiA8PHJlY3QtPnloIDw8IiA7IiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChWRVJCT1NFID4gMikgewotICAgICAgICBjb3V0IDw8Ildhcm5pbmc6IHVuc3VwcG9ydGVkIE9CUyIgPDxlbmRsOwotICAgICAgfQotICAgICAgY29udGludWU7Ci0gICAgfQotICB9Ci0gICgoaW86OlBhcnNlciopZGF0YSktPnRtcEJsb2NrLT5zZXRCbG9ja2FnZXMoYmxrcyk7Ci0gIHJldHVybiAwOwotfQotCi1pbnQgaW86OlBhcnNlcjo6Z2V0TGVmU3RyaW5nKGxlZnJDYWxsYmFja1R5cGVfZSB0eXBlLCBjb25zdCBjaGFyKiBzdHIsIGxlZmlVc2VyRGF0YSBkYXRhKSB7Ci0gIC8vYm9vbCBlbmFibGVPdXRwdXQgPSB0cnVlOwotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICBpZiAodHlwZSA9PSBsZWZyTWFjcm9CZWdpbkNia1R5cGUpIHsKLSAgICBhdXRvICZ0bXBCbG9jayA9ICgoaW86OlBhcnNlciopZGF0YSktPnRtcEJsb2NrOwotICAgIHRtcEJsb2NrID0gbWFrZV91bmlxdWU8ZnJCbG9jaz4oKTsKLSAgICB0bXBCbG9jay0+c2V0TmFtZShzdHJpbmcoc3RyKSk7Ci0gICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgY291dCA8PCJNQUNSTyAiIDw8dG1wQmxvY2stPmdldE5hbWUoKSA8PGVuZGw7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUgPT0gbGVmck1hY3JvRW5kQ2JrVHlwZSkgewotICAgIGF1dG8gJnRtcEJsb2NrID0gKChpbzo6UGFyc2VyKilkYXRhKS0+dG1wQmxvY2s7Ci0gICAgdG1wQmxvY2stPnNldElkKCgoaW86OlBhcnNlciopZGF0YSktPm51bVJlZkJsb2NrcyArIDEpOwotICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgIGNvdXQgPDwiRU5EICIgPDx0bXBCbG9jay0+Z2V0TmFtZSgpIDw8IiAiIDw8KChpbzo6UGFyc2VyKilkYXRhKS0+bnVtUmVmQmxvY2tzICsgMSA8PGVuZGw7Ci0gICAgfQotICAgICgoaW86OlBhcnNlciopZGF0YSktPmRlc2lnbi0+YWRkUmVmQmxvY2soKChpbzo6UGFyc2VyKilkYXRhKS0+dG1wQmxvY2spOwotICAgICgoaW86OlBhcnNlciopZGF0YSktPm51bVJlZkJsb2NrcysrOwotICAgICgoaW86OlBhcnNlciopZGF0YSktPm51bVRlcm1zICAgICA9IDA7Ci0gICAgKChpbzo6UGFyc2VyKilkYXRhKS0+bnVtQmxvY2thZ2VzID0gMDsKLSAgfSBlbHNlIHsKLSAgICBjb3V0IDw8IlR5cGUgaXMgbm90IHN1cHBvcnRlZCEiIDw8ZW5kbDsKLSAgICAvLyBleGl0KDIpOwotICB9Ci0gIHJldHVybiAwOwotfQotCi1pbnQgaW86OlBhcnNlcjo6Z2V0TGVmVW5pdHMobGVmckNhbGxiYWNrVHlwZV9lIHR5cGUsIGxlZmlVbml0cyogdW5pdHMsIGxlZmlVc2VyRGF0YSBkYXRhKSB7Ci0gIC8vYm9vbCBlbmFibGVPdXRwdXQgPSB0cnVlOwotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5zZXREQlVQZXJVVShmclVJbnQ0KHVuaXRzLT5kYXRhYmFzZU51bWJlcigpKSk7Ci0gIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICBjb3V0IDw8IkRBVEFCQVNFIE1JQ1JPTlMgIiA8PCgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmdldERCVVBlclVVKCkgPDxlbmRsOwotICB9Ci0gIHJldHVybiAwOwotfQotCi1pbnQgaW86OlBhcnNlcjo6Z2V0TGVmVmlhcyhsZWZyQ2FsbGJhY2tUeXBlX2UgdHlwZSwgbGVmaVZpYSogdmlhLCBsZWZpVXNlckRhdGEgZGF0YSkgewotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgaWYgKHR5cGUgIT0gbGVmclZpYUNia1R5cGUpIHsKLSAgICBjb3V0IDw8IlR5cGUgaXMgbm90IGxlZnJWaWFDYmtUeXBlISIgPDxlbmRsOwotICAgIC8vIGV4aXQoMSk7Ci0gIH0KLSAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgIGNvdXQgPDwiVklBICIgPDx2aWEtPm5hbWUoKTsKLSAgICBpZiAodmlhLT5oYXNEZWZhdWx0KCkpIHsKLSAgICAgIGNvdXQgPDwiIERFRkFVTFQiOwotICAgIH0KLSAgICBjb3V0IDw8ZW5kbDsKLSAgfQotICBpZiAodmlhLT5udW1MYXllcnMoKSAhPSAzKSB7Ci0gICAgaWYgKFZFUkJPU0UgPiAtMSkgewotICAgICAgY291dCA8PCJFcnJvcjogdW5zdXBwb3J0ZWQgdmlhIiA8PGVuZGw7Ci0gICAgfQotICAgIGV4aXQoMSk7Ci0gIH0KLSAgbWFwPGZyTGF5ZXJOdW0sIGludD4gbE51bTJJbnQ7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdmlhLT5udW1MYXllcnMoKTsgKytpKSB7Ci0gICAgaWYgKCgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPm5hbWUybGF5ZXIuZmluZCh2aWEtPmxheWVyTmFtZShpKSkgPT0gKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+bmFtZTJsYXllci5lbmQoKSkgewotICAgICAgaWYgKFZFUkJPU0UgPiAtMSkgewotICAgICAgICBjb3V0IDw8Ildhcm5pbmc6IGxheWVyICIgPDx2aWEtPmxheWVyTmFtZShpKSA8PCIgaXMgc2tpcGlwZWQgZm9yICIgPDx2aWEtPm5hbWUoKSA8PGVuZGw7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgbE51bTJJbnRbKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+bmFtZTJsYXllci5hdCh2aWEtPmxheWVyTmFtZShpKSktPmdldExheWVyTnVtKCldID0gaTsKLSAgfQotICAvL2ZvciAoYXV0byAmbTogbE51bTJJbnQpIHsKLSAgLy8gIGNvdXQgPDwicHJpbnQgIiA8PG0uZmlyc3QgPDwiICIgPDxtLnNlY29uZCA8PGVuZGw7Ci0gIC8vfQotICBpZiAobE51bTJJbnQuYmVnaW4oKS0+Zmlyc3QgKyAyICE9ICgtLWxOdW0ySW50LmVuZCgpKS0+Zmlyc3QpIHsKLSAgICBpZiAoVkVSQk9TRSA+IC0xKSB7Ci0gICAgICBjb3V0IDw8IkVycm9yOiBub24tY29uc2VjdXRpdmUgbGF5ZXJzIiA8PGVuZGw7Ci0gICAgfQotICAgIGV4aXQoMSk7Ci0gIH0KLQotICBhdXRvIHZpYURlZiA9IG1ha2VfdW5pcXVlPGZyVmlhRGVmPih2aWEtPm5hbWUoKSk7Ci0gIGlmICh2aWEtPmhhc0RlZmF1bHQoKSkgewotICAgIHZpYURlZi0+c2V0RGVmYXVsdCgxKTsKLSAgfQotICBpbnQgY250ID0gMDsKLSAgZm9yIChhdXRvICZtOiBsTnVtMkludCkgewotICAgIGludCBpID0gbS5zZWNvbmQ7Ci0gICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgY291dCA8PCIgIExBWUVSICIgPDx2aWEtPmxheWVyTmFtZShpKSA8PCIgOyIgPDxlbmRsOwotICAgIH0KLSAgICAvL2F1dG8gbGF5ZXJOdW0gPSAoKEZsZXhSb3V0ZSopZGF0YSktPmxheWVyc1t2aWEtPmxheWVyTmFtZShpKV0tPmdldExheWVyTnVtKCk7Ci0gICAgYXV0byBsYXllck51bSA9IG0uZmlyc3Q7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCB2aWEtPm51bVJlY3RzKGkpOyArK2opIHsKLSAgICAgIGZyQ29vcmQgeGwgPSByb3VuZCh2aWEtPnhsKGksIGopICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSk7Ci0gICAgICBmckNvb3JkIHlsID0gcm91bmQodmlhLT55bChpLCBqKSAqICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmdldERCVVBlclVVKCkpOwotICAgICAgZnJDb29yZCB4aCA9IHJvdW5kKHZpYS0+eGgoaSwgaikgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKTsKLSAgICAgIGZyQ29vcmQgeWggPSByb3VuZCh2aWEtPnloKGksIGopICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSk7Ci0gICAgICB1bmlxdWVfcHRyPGZyUmVjdD4gcGluRmlnID0gbWFrZV91bmlxdWU8ZnJSZWN0PigpOwotICAgICAgcGluRmlnLT5zZXRCQm94KGZyQm94KHhsLCB5bCwgeGgsIHloKSk7Ci0gICAgICBwaW5GaWctPnNldExheWVyTnVtKGxheWVyTnVtKTsKLSAgICAgIHVuaXF1ZV9wdHI8ZnJTaGFwZT4gdG1wKHN0ZDo6bW92ZShwaW5GaWcpKTsKLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgICAgUkVDVCAiICAgPDx4bCAqIDEuMCAvICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmdldERCVVBlclVVKCkgPDwiICIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8eWwgKiAxLjAgLyAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpIDw8IiAiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PHhoICogMS4wIC8gKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSA8PCIgIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDx5aCAqIDEuMCAvICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmdldERCVVBlclVVKCkgPDwiIDsiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIHN3aXRjaChjbnQpIHsKLSAgICAgICAgY2FzZSAwIDoKLSAgICAgICAgICB2aWFEZWYtPmFkZExheWVyMUZpZyh0bXApOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEgOgotICAgICAgICAgIHZpYURlZi0+YWRkQ3V0RmlnKHRtcCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgdmlhRGVmLT5hZGRMYXllcjJGaWcodG1wKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCB2aWEtPm51bVBvbHlnb25zKGkpOyArK2opIHsKLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgICAgUE9MWUdPTiI7IAotICAgICAgfQotICAgICAgdmVjdG9yPGZyUG9pbnQ+IHRtcFBvaW50czsKLSAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgdmlhLT5nZXRQb2x5Z29uKGksIGopLm51bVBvaW50czsgaysrKSB7Ci0gICAgICAgIGZyQ29vcmQgeCA9IHJvdW5kKHZpYS0+Z2V0UG9seWdvbihpLCBqKS54W2tdICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSk7Ci0gICAgICAgIGZyQ29vcmQgeSA9IHJvdW5kKHZpYS0+Z2V0UG9seWdvbihpLCBqKS55W2tdICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSk7Ci0gICAgICAgIHRtcFBvaW50cy5wdXNoX2JhY2soZnJQb2ludCh4LCB5KSk7Ci0gICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICAgY291dCA8PCIgIiA8PHggKiAxLjAgLyAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpIDw8IiAiIAotICAgICAgICAgICAgICAgICAgICAgIDw8eSAqIDEuMCAvICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPmdldERCVVBlclVVKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHVuaXF1ZV9wdHI8ZnJQb2x5Z29uPiBwaW5GaWcgPSBtYWtlX3VuaXF1ZTxmclBvbHlnb24+KCk7Ci0gICAgICBwaW5GaWctPnNldFBvaW50cyh0bXBQb2ludHMpOwotICAgICAgcGluRmlnLT5zZXRMYXllck51bShsYXllck51bSk7Ci0gICAgICB1bmlxdWVfcHRyPGZyU2hhcGU+IHRtcChzdGQ6Om1vdmUocGluRmlnKSk7Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiIDsiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIHN3aXRjaChjbnQpIHsKLSAgICAgICAgY2FzZSAwIDoKLSAgICAgICAgICB2aWFEZWYtPmFkZExheWVyMUZpZyh0bXApOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEgOgotICAgICAgICAgIHZpYURlZi0+YWRkQ3V0RmlnKHRtcCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgdmlhRGVmLT5hZGRMYXllcjJGaWcodG1wKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgY250Kys7Ci0gIH0KLSAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgIGNvdXQgPDwiRU5EICIgPDx2aWEtPm5hbWUoKSA8PGVuZGw7Ci0gIH0KLQotICAvLyBhZGQgdmlhIGNsYXNzIGluZm9ybWF0aW9uCi0gIGF1dG8gY3V0TGF5ZXJOdW0gPSB2aWFEZWYtPmdldEN1dExheWVyTnVtKCk7Ci0gIGF1dG8gY3V0TGF5ZXIgICAgPSAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXRMYXllcihjdXRMYXllck51bSk7Ci0gIGlmIChjdXRMYXllci0+aGFzTGVmNThDdXRDbGFzc0NvbnN0cmFpbnQoKSkgewotICAgIGJvb2wgZ2V0Q3V0Q2xhc3MgPSBmYWxzZTsKLSAgICBmb3IgKGF1dG8gJmN1dENsYXNzOiBjdXRMYXllci0+Z2V0TGVmNThDdXRDbGFzc0NvbnN0cmFpbnQoKS0+Z2V0Q3V0Q2xhc3NlcygpKSB7Ci0gICAgICAvL2ludCAgbnVtQ3V0ID0gMDsKLSAgICAgIGJvb2wgZmxhZyAgID0gdHJ1ZTsKLSAgICAgIGZvciAoYXV0byAmY3V0RmlnOiB2aWFEZWYtPmdldEN1dEZpZ3MoKSkgewotICAgICAgICBpZiAoY3V0RmlnLT50eXBlSWQoKSA9PSBmcmNSZWN0KSB7Ci0gICAgICAgICAgZnJCb3ggYm94OwotICAgICAgICAgIGN1dEZpZy0+Z2V0QkJveChib3gpOwotICAgICAgICAgIGF1dG8gd2lkdGggID0gYm94LnJpZ2h0KCkgLSBib3gubGVmdCgpOwotICAgICAgICAgIGF1dG8gaGVpZ2h0ID0gYm94LnRvcCgpIC0gYm94LmJvdHRvbSgpOwotICAgICAgICAgIGlmIChtaW4od2lkdGgsIGhlaWdodCkgIT0gY3V0Q2xhc3MtPmdldFZpYVdpZHRoKCkpIHsKLSAgICAgICAgICAgIGZsYWcgPSBmYWxzZTsKLSAgICAgICAgICAgIC8vYnJlYWs7Ci0gICAgICAgICAgfSBlbHNlIGlmIChtYXgod2lkdGgsIGhlaWdodCkgIT0gY3V0Q2xhc3MtPmdldFZpYUxlbmd0aCgpKSB7Ci0gICAgICAgICAgICBmbGFnID0gZmFsc2U7Ci0gICAgICAgICAgICAvL2JyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmbGFnID0gZmFsc2U7Ci0gICAgICAgICAgY291dCA8PCJXYXJuaW5nOiBjdXQgc2hhcGUgaXMgbm90IGEgcmVjdGFibGUgLyBkb2VzIG5vdCBoYXZlIGEgY3V0IGNsYXNzIiA8PGVuZGw7Ci0gICAgICAgICAgLy9icmVhazsKLSAgICAgICAgfQotICAgICAgICAvL251bUN1dCsrOwotICAgICAgfQotICAgICAgLy9pZiAoZmxhZyAmJiBudW1DdXQgPT0gKGludCljdXRDbGFzcy0+Z2V0TnVtQ3V0KCkpIHsKLSAgICAgIGlmIChmbGFnKSB7Ci0gICAgICAgIHZpYURlZi0+c2V0Q3V0Q2xhc3MoY3V0Q2xhc3MpOwotICAgICAgICAvL2NvdXQgPDwiQ1VUQ0xBU1MgIiA8PGN1dENsYXNzLT5nZXROYW1lKCkgPDxlbmRsOwotICAgICAgICBnZXRDdXRDbGFzcyA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICghZ2V0Q3V0Q2xhc3MpIHsKLSAgICAgIGNvdXQgPDwiV2FybmluZzogbm8gY3V0IGNsYXNzIGF2YWlsYWJsZSBmb3IgdmlhICIgPDx2aWFEZWYtPmdldE5hbWUoKSA8PGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+YWRkVmlhKHZpYURlZik7Ci0gIHJldHVybiAwOwotfQotCi1pbnQgaW86OlBhcnNlcjo6Z2V0TGVmVmlhUnVsZXMobGVmckNhbGxiYWNrVHlwZV9lIHR5cGUsIGxlZmlWaWFSdWxlKiB2aWFSdWxlLCBsZWZpVXNlckRhdGEgZGF0YSkgewotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgaWYgKHR5cGUgIT0gbGVmclZpYVJ1bGVDYmtUeXBlKSB7Ci0gICAgY291dCA8PCJUeXBlIGlzIG5vdCBsZWZyVmlhUnVsZUNia1R5cGUhIiA8PGVuZGw7Ci0gICAgLy8gZXhpdCgxKTsKLSAgfQotICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgY291dCA8PCJWSUFSVUxFICIgPDx2aWFSdWxlLT5uYW1lKCk7Ci0gICAgaWYgKHZpYVJ1bGUtPmhhc0dlbmVyYXRlKCkpIHsKLSAgICAgIGNvdXQgPDwiIEdFTkVSQVRFIjsKLSAgICB9IGVsc2UgewotICAgICAgY291dCA8PCJFcnJvcjogZ2V0TGVmVmlhUnVsZXMgZG9lcyBub3Qgc3VwcG9ydCBub24tZ2VuZXJhdGUgcnVsZXMiIDw8ZW5kbDsKLSAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAgIGlmICh2aWFSdWxlLT5oYXNEZWZhdWx0KCkpIHsKLSAgICAgIGNvdXQgPDwiIERFRkFVTFQiOwotICAgIH0KLSAgICBjb3V0IDw8ZW5kbDsKLSAgfQotICBpZiAodmlhUnVsZS0+bnVtTGF5ZXJzKCkgIT0gMykgewotICAgIGlmIChWRVJCT1NFID4gLTEpIHsKLSAgICAgIGNvdXQgPDwiRXJyb3I6IHVuc3VwcG9ydGVkIHZpYSIgPDxlbmRsOwotICAgIH0KLSAgICBleGl0KDEpOwotICB9Ci0gIG1hcDxmckxheWVyTnVtLCBpbnQ+IGxOdW0ySW50OwotICBmb3IgKGludCBpID0gMDsgaSA8IHZpYVJ1bGUtPm51bUxheWVycygpOyArK2kpIHsKLSAgICBhdXRvIHZpYVJ1bGVMYXllciA9IHZpYVJ1bGUtPmxheWVyKGkpOwotICAgIGlmICgoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5uYW1lMmxheWVyLmZpbmQodmlhUnVsZUxheWVyLT5uYW1lKCkpID09ICgoaW86OlBhcnNlciopZGF0YSktPnRlY2gtPm5hbWUybGF5ZXIuZW5kKCkpIHsKLSAgICAgIGlmIChWRVJCT1NFID4gLTEpIHsKLSAgICAgICAgY291dCA8PCJXYXJuaW5nOiBsYXllciAiIDw8dmlhUnVsZUxheWVyLT5uYW1lKCkgPDwiIGlzIHNraXBpcGVkIGZvciAiIDw8dmlhUnVsZS0+bmFtZSgpIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBsTnVtMkludFsoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5uYW1lMmxheWVyLmF0KHZpYVJ1bGVMYXllci0+bmFtZSgpKS0+Z2V0TGF5ZXJOdW0oKV0gPSBpOwotICB9Ci0gIGlmIChsTnVtMkludC5iZWdpbigpLT5maXJzdCArIDIhPSAoLS1sTnVtMkludC5lbmQoKSktPmZpcnN0KSB7Ci0gICAgaWYgKFZFUkJPU0UgPiAtMSkgewotICAgICAgY291dCA8PCJFcnJvcjogbm9uLWNvbnNlY3V0aXZlIGxheWVycyIgPDxlbmRsOwotICAgIH0KLSAgICBleGl0KDEpOwotICB9Ci0KLSAgaWYgKCF2aWFSdWxlLT5oYXNHZW5lcmF0ZSgpKSB7Ci0gICAgY291dCA8PCJFcnJvcjogZ2V0TGVmVmlhUnVsZXMgZG9lcyBub3Qgc3VwcG9ydCBub24tZ2VuZXJhdGUgcnVsZXMiIDw8ZW5kbDsKLSAgICBleGl0KDEpOwotICB9Ci0gIGF1dG8gdmlhUnVsZUdlbiA9IG1ha2VfdW5pcXVlPGZyVmlhUnVsZUdlbmVyYXRlPih2aWFSdWxlLT5uYW1lKCkpOwotICBpZiAodmlhUnVsZS0+aGFzRGVmYXVsdCgpKSB7Ci0gICAgdmlhUnVsZUdlbi0+c2V0RGVmYXVsdCgxKTsKLSAgfQotICBpbnQgY250ID0gMDsKLSAgZm9yIChhdXRvICZbbE51bSwgaV06IGxOdW0ySW50KSB7Ci0gICAgYXV0byB2aWFSdWxlTGF5ZXIgPSB2aWFSdWxlLT5sYXllcihpKTsKLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBjb3V0IDw8IiAgTEFZRVIgIiA8PHZpYVJ1bGVMYXllci0+bmFtZSgpIDw8IiA7IiA8PGVuZGw7Ci0gICAgfQotICAgIGlmICh2aWFSdWxlTGF5ZXItPmhhc0VuY2xvc3VyZSgpKSB7Ci0gICAgICBmckNvb3JkIHggPSByb3VuZCh2aWFSdWxlTGF5ZXItPmVuY2xvc3VyZU92ZXJoYW5nMSgpICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSk7Ci0gICAgICBmckNvb3JkIHkgPSByb3VuZCh2aWFSdWxlTGF5ZXItPmVuY2xvc3VyZU92ZXJoYW5nMigpICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSk7Ci0gICAgICBmclBvaW50IGVuYyh4LCB5KTsKLSAgICAgIHN3aXRjaChjbnQpIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgIHZpYVJ1bGVHZW4tPnNldExheWVyMUVuYyhlbmMpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgY291dCA8PCJFcnJvcjogZ2V0VmlhUnVsZUdlbmVyYXRlcyBjdXRMYXllciBjYW5ub3QgaGF2ZSBvdmVyaGFuZHMiIDw8ZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB2aWFSdWxlR2VuLT5zZXRMYXllcjJFbmMoZW5jKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgICAgRU5DTE9TVVJFICIgPDx2aWFSdWxlTGF5ZXItPmVuY2xvc3VyZU92ZXJoYW5nMSgpIDw8IiAiIDw8dmlhUnVsZUxheWVyLT5lbmNsb3N1cmVPdmVyaGFuZzEoKSA8PCIgOyIgPDxlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBpZiAodmlhUnVsZUxheWVyLT5oYXNSZWN0KCkpIHsKLSAgICAgIGZyQ29vcmQgeGwgPSByb3VuZCh2aWFSdWxlTGF5ZXItPnhsKCkgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKTsKLSAgICAgIGZyQ29vcmQgeWwgPSByb3VuZCh2aWFSdWxlTGF5ZXItPnlsKCkgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKTsKLSAgICAgIGZyQ29vcmQgeGggPSByb3VuZCh2aWFSdWxlTGF5ZXItPnhoKCkgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKTsKLSAgICAgIGZyQ29vcmQgeWggPSByb3VuZCh2aWFSdWxlTGF5ZXItPnloKCkgKiAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5nZXREQlVQZXJVVSgpKTsKLSAgICAgIGZyQm94IGJveCh4bCwgeWwsIHhoLCB5aCk7Ci0gICAgICBzd2l0Y2goY250KSB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICBjb3V0IDw8IkVycm9yOiBnZXRWaWFSdWxlR2VuZXJhdGVzIGJvdExheWVyIGNhbm5vdCBoYXZlIHJlY3QiIDw8ZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgIHZpYVJ1bGVHZW4tPnNldEN1dFJlY3QoYm94KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBjb3V0IDw8IkVycm9yOiBnZXRWaWFSdWxlR2VuZXJhdGVzIHRvcExheWVyIGNhbm5vdCBoYXZlIHJlY3QiIDw8ZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgICAgUkVDVCAiIDw8dmlhUnVsZUxheWVyLT54bCgpIDw8IiAiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgPDx2aWFSdWxlTGF5ZXItPnlsKCkgPDwiICIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8PHZpYVJ1bGVMYXllci0+eGgoKSA8PCIgIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8dmlhUnVsZUxheWVyLT55aCgpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwiIDsiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHZpYVJ1bGVMYXllci0+aGFzU3BhY2luZygpKSB7Ci0gICAgICBmckNvb3JkIHggPSByb3VuZCh2aWFSdWxlTGF5ZXItPnNwYWNpbmdTdGVwWCgpICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSk7Ci0gICAgICBmckNvb3JkIHkgPSByb3VuZCh2aWFSdWxlTGF5ZXItPnNwYWNpbmdTdGVwWSgpICogKChpbzo6UGFyc2VyKilkYXRhKS0+dGVjaC0+Z2V0REJVUGVyVVUoKSk7Ci0gICAgICBmclBvaW50IHB0KHgsIHkpOwotICAgICAgc3dpdGNoKGNudCkgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgY291dCA8PCJFcnJvcjogZ2V0VmlhUnVsZUdlbmVyYXRlcyBib3RMYXllciBjYW5ub3QgaGF2ZSBzcGFjaW5nIiA8PGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICB2aWFSdWxlR2VuLT5zZXRDdXRTcGFjaW5nKHB0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBjb3V0IDw8IkVycm9yOiBnZXRWaWFSdWxlR2VuZXJhdGVzIHRvcExheWVyIGNhbm5vdCBoYXZlIHNwYWNpbmciIDw8ZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgICAgU1BBQ0lORyAiIDw8dmlhUnVsZUxheWVyLT5zcGFjaW5nU3RlcFgoKSA8PCIgQlkgIiA8PHZpYVJ1bGVMYXllci0+c3BhY2luZ1N0ZXBZKCkgPDwiIDsiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgY250Kys7Ci0gIH0KLQotICAoKGlvOjpQYXJzZXIqKWRhdGEpLT50ZWNoLT5hZGRWaWFSdWxlR2VuZXJhdGUodmlhUnVsZUdlbik7Ci0gIHJldHVybiAwOwotfQotCi12b2lkIGlvOjpQYXJzZXI6OnJlYWRMZWYoKSB7Ci0gIEZJTEUqIGY7Ci0gIGludCByZXM7Ci0KLSAgbGVmckluaXRTZXNzaW9uKDEpOwotCi0gIGxlZnJTZXRVc2VyRGF0YSAoKGxlZmlVc2VyRGF0YSl0aGlzKTsKLQotICBsZWZyU2V0TWFjcm9DYmsoZ2V0TGVmTWFjcm9zKTsKLSAgbGVmclNldE1hY3JvQmVnaW5DYmsoZ2V0TGVmU3RyaW5nKTsKLSAgbGVmclNldE1hY3JvRW5kQ2JrKGdldExlZlN0cmluZyk7Ci0gIGxlZnJTZXRVbml0c0NiayhnZXRMZWZVbml0cyk7Ci0gIGxlZnJTZXRQaW5DYmsoZ2V0TGVmUGlucyk7Ci0gIGxlZnJTZXRPYnN0cnVjdGlvbkNiayhnZXRMZWZPYnMpOwotICBsZWZyU2V0TGF5ZXJDYmsoZ2V0TGVmTGF5ZXJzKTsKLSAgbGVmclNldFZpYUNiayhnZXRMZWZWaWFzKTsKLSAgbGVmclNldFZpYVJ1bGVDYmsoZ2V0TGVmVmlhUnVsZXMpOwotCi0gIGlmICgoZiA9IGZvcGVuKExFRl9GSUxFLmNfc3RyKCksInIiKSkgPT0gMCkgewotICAgIGNvdXQgPDwiQ291bGRuJ3Qgb3BlbiBsZWYgZmlsZSIgPDxlbmRsOwotICAgIGV4aXQoMik7Ci0gIH0KLQotICByZXMgPSBsZWZyUmVhZChmLCBMRUZfRklMRS5jX3N0cigpLCAobGVmaVVzZXJEYXRhKXRoaXMpOwotICBpZiAocmVzICE9IDApIHsKLSAgICBjb3V0IDw8IkxFRiBwYXJzZXIgcmV0dXJucyBhbiBlcnJvciEiIDw8ZW5kbDsKLSAgICBleGl0KDIpOwotICB9Ci0gIGZjbG9zZShmKTsKLQotICBsZWZyQ2xlYXIoKTsKLX0KLQotdm9pZCBpbzo6UGFyc2VyOjpyZWFkTGVmRGVmKCkgewotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLQotICBpZiAoVkVSQk9TRSA+IDApIHsKLSAgICBjb3V0IDw8ZW5kbCA8PCJyZWFkaW5nIGxlZiAuLi4iIDw8ZW5kbDsKLSAgfQotCi0gIHJlYWRMZWYoKTsKLQotICBpZiAoVkVSQk9TRSA+IDApIHsKLSAgICBjb3V0IDw8ZW5kbDsKLSAgICBjb3V0IDw8InVuaXRzOiAgICAgICAiIDw8dGVjaC0+Z2V0REJVUGVyVVUoKSAgICAgIDw8ZW5kbDsKLSAgICBjb3V0IDw8IiNsYXllcnM6ICAgICAiIDw8dGVjaC0+bGF5ZXJzLnNpemUoKSAgICAgIDw8ZW5kbDsKLSAgICBjb3V0IDw8IiNtYWNyb3M6ICAgICAiIDw8ZGVzaWduLT5yZWZCbG9ja3Muc2l6ZSgpIDw8ZW5kbDsKLSAgICBjb3V0IDw8IiN2aWFzOiAgICAgICAiIDw8dGVjaC0+dmlhcy5zaXplKCkgICAgICAgIDw8ZW5kbDsKLSAgICBjb3V0IDw8IiN2aWFydWxlZ2VuOiAiIDw8dGVjaC0+dmlhUnVsZUdlbmVyYXRlcy5zaXplKCkgPDxlbmRsOwotICB9Ci0gIC8vZXhpdCgxKTsKLSAgYXV0byBudW1MZWZWaWEgPSB0ZWNoLT52aWFzLnNpemUoKTsKLQotICAvL3RlY2gtPnByaW50QWxsQ29uc3RyYWludHMoKTsKLSAgCi0gIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAvL2Rlc2lnbi0+cHJpbnRBbGxNYWNyb3MoKTsKLSAgICAvLyBwcmludEFsbExheWVycygpOwotICAgIC8vdGVjaC0+cHJpbnRBbGxWaWFzKCk7Ci0gICAgLy9wcmludExheWVyTWFwcygpOwotICB9Ci0KLSAgaWYgKFZFUkJPU0UgPiAwKSB7Ci0gICAgY291dCA8PGVuZGwgPDwicmVhZGluZyBkZWYgLi4uIiA8PGVuZGw7Ci0gIH0KLQotICByZWFkRGVmKCk7Ci0KLSAgaWYgKFZFUkJPU0UgPiAwKSB7Ci0gICAgY291dCA8PGVuZGw7Ci0gICAgZnJCb3ggZGllQm94OwotICAgIGRlc2lnbi0+Z2V0VG9wQmxvY2soKS0+Z2V0Qm91bmRhcnlCQm94KGRpZUJveCk7Ci0gICAgY291dCA8PCJkZXNpZ246ICAgICAgIiA8PGRlc2lnbi0+Z2V0VG9wQmxvY2soKS0+Z2V0TmFtZSgpICAgIDw8ZW5kbDsKLSAgICBjb3V0IDw8ImRpZSBhcmVhOiAgICAiIDw8ZGllQm94ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDxlbmRsOwotICAgIGNvdXQgPDwidHJhY2tQdHM6ICAgICIgPDxkZXNpZ24tPmdldFRvcEJsb2NrKCktPmdldFRyYWNrUGF0dGVybnMoKS5zaXplKCkgPDxlbmRsOwotICAgIGNvdXQgPDwiZGVmdmlhczogICAgICIgPDx0ZWNoLT52aWFzLnNpemUoKSAtIG51bUxlZlZpYSAgICAgICA8PGVuZGw7Ci0gICAgY291dCA8PCIjY29tcG9uZW50czogIiA8PGRlc2lnbi0+Z2V0VG9wQmxvY2soKS0+aW5zdHMuc2l6ZSgpIDw8ZW5kbDsKLSAgICBjb3V0IDw8IiN0ZXJtaW5hbHM6ICAiIDw8ZGVzaWduLT5nZXRUb3BCbG9jaygpLT50ZXJtcy5zaXplKCkgPDxlbmRsOwotICAgIGNvdXQgPDwiI3NuZXRzOiAgICAgICIgPDxkZXNpZ24tPmdldFRvcEJsb2NrKCktPnNuZXRzLnNpemUoKSA8PGVuZGw7Ci0gICAgY291dCA8PCIjbmV0czogICAgICAgIiA8PGRlc2lnbi0+Z2V0VG9wQmxvY2soKS0+bmV0cy5zaXplKCkgIDw8ZW5kbDsKLSAgICAvL2NvdXQgPDwiI3BpbnM6ICAgICAgICIgPDxudW1QaW5zIDw8ZW5kbDsKLSAgfQotICAvL2NvdXQgPDxmbHVzaDsKLQotICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgLy90ZWNoLT5wcmludEFsbFZpYXMoKTsKLSAgICAvL2Rlc2lnbi0+cHJpbnRBbGxDb21wcygpOwotICAgIC8vcHJpbnRDb21wTWFwcygpOwotICAgIC8vZGVzaWduLT5wcmludEFsbFRlcm1zKCk7Ci0gICAgLy9wcmludFRlcm1NYXBzKCk7Ci0gICAgLy9wcmludEFsbE5ldHMoKTsKLSAgICAvL3ByaW50QWxsVHJhY2tHZW5zKCk7Ci0gICAgLy9wcmludEFsbFRyYWNrUGF0dGVybnMoKTsKLSAgfQotICAvL2V4aXQoMSk7Ci0KLX0KLQotdm9pZCBpbzo6UGFyc2VyOjpyZWFkR3VpZGUoKSB7Ci0KLSAgaWYgKFZFUkJPU0UgPiAwKSB7Ci0gICAgY291dCA8PGVuZGwgPDwicmVhZGluZyBndWlkZSAuLi4iIDw8ZW5kbDsKLSAgfQotCi0gIGludCBudW1HdWlkZXMgPSAwOwotCi0gIHN0cmluZyBuZXROYW1lID0gIiI7Ci0gIGZyTmV0KiBuZXQgPSBudWxscHRyOwotCi0gIGlmc3RyZWFtIGZpbihHVUlERV9GSUxFLmNfc3RyKCkpOwotICBzdHJpbmcgbGluZTsKLSAgZnJCb3ggIGJveDsKLSAgZnJMYXllck51bSBsYXllck51bTsKLQotICBpZiAoZmluLmlzX29wZW4oKSl7Ci0gICAgd2hpbGUgKGZpbi5nb29kKCkpIHsKLSAgICAgIGdldGxpbmUoZmluLCBsaW5lKTsKLSAgICAgIC8vY291dCA8PGxpbmUgPDxlbmRsIDw8bGluZS5zaXplKCkgPDxlbmRsOwotICAgICAgaWYgKGxpbmUgPT0gIigiIHx8IGxpbmUgPT0gIiIpIGNvbnRpbnVlOwotICAgICAgaWYgKGxpbmUgPT0gIikiKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBzdHJpbmdzdHJlYW0gc3MobGluZSk7Ci0gICAgICBzdHJpbmcgd29yZCA9ICIiOwotICAgICAgdmVjdG9yPHN0cmluZz4gdkxpbmU7Ci0gICAgICB3aGlsZSAoIXNzLmVvZigpKSB7Ci0gICAgICAgIHNzID4+d29yZDsKLSAgICAgICAgdkxpbmUucHVzaF9iYWNrKHdvcmQpOwotICAgICAgICAvL2NvdXQgPDx3b3JkIDw8IiAiOwotICAgICAgfQotICAgICAgLy9jb3V0IDw8ZW5kbDsKLQotICAgICAgaWYgKHZMaW5lLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIGNvdXQgPDwiRXJyb3I6IHJlYWRpbmcgZ3VpZGUgZmlsZSEiIDw8ZW5kbDsKLSAgICAgICAgZXhpdCgyKTsKLSAgICAgIH0gZWxzZSBpZiAodkxpbmUuc2l6ZSgpID09IDEpIHsKLSAgICAgICAgbmV0TmFtZSA9IHZMaW5lWzBdOwotICAgICAgICBpZiAoZGVzaWduLT50b3BCbG9jay0+bmFtZTJuZXQuZmluZCh2TGluZVswXSkgPT0gZGVzaWduLT50b3BCbG9jay0+bmFtZTJuZXQuZW5kKCkpIHsKLSAgICAgICAgICBjb3V0IDw8IkVycm9yOiBjYW5ub3QgZmluZCBuZXQ6ICIgPDx2TGluZVswXSA8PGVuZGw7Ci0gICAgICAgICAgZXhpdCgyKTsKLSAgICAgICAgfQotICAgICAgICBuZXQgPSBkZXNpZ24tPnRvcEJsb2NrLT5uYW1lMm5ldFtuZXROYW1lXTsgCi0gICAgICB9IGVsc2UgaWYgKHZMaW5lLnNpemUoKSA9PSA1KSB7Ci0gICAgICAgIGlmICh0ZWNoLT5uYW1lMmxheWVyLmZpbmQodkxpbmVbNF0pID09IHRlY2gtPm5hbWUybGF5ZXIuZW5kKCkpIHsKLSAgICAgICAgICBjb3V0IDw8IkVycm9yOiBjYW5ub3QgZmluZCBsYXllcjogIiA8PHZMaW5lWzRdIDw8ZW5kbDsKLSAgICAgICAgICBleGl0KDIpOwotICAgICAgICB9Ci0gICAgICAgIGxheWVyTnVtID0gdGVjaC0+bmFtZTJsYXllclt2TGluZVs0XV0tPmdldExheWVyTnVtKCk7Ci0gICAgICAgIGJveC5zZXQoc3RvaSh2TGluZVswXSksIHN0b2kodkxpbmVbMV0pLCBzdG9pKHZMaW5lWzJdKSwgc3RvaSh2TGluZVszXSkpOwotICAgICAgICBmclJlY3QgcmVjdDsKLSAgICAgICAgcmVjdC5zZXRCQm94KGJveCk7Ci0gICAgICAgIHJlY3Quc2V0TGF5ZXJOdW0obGF5ZXJOdW0pOwotICAgICAgICAvL3RtcEd1aWRlc1tuZXROYW1lXS5wdXNoX2JhY2socmVjdCk7Ci0gICAgICAgIHRtcEd1aWRlc1tuZXRdLnB1c2hfYmFjayhyZWN0KTsKLSAgICAgICAgKytudW1HdWlkZXM7Ci0gICAgICAgIGlmIChudW1HdWlkZXMgPCAxMDAwMDAwKSB7Ci0gICAgICAgICAgaWYgKG51bUd1aWRlcyAlIDEwMDAwMCA9PSAwKSB7Ci0gICAgICAgICAgICBjb3V0IDw8Imd1aWRlSW4gcmVhZCAiIDw8bnVtR3VpZGVzIDw8IiBndWlkZXMiIDw8ZW5kbDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKG51bUd1aWRlcyAlIDEwMDAwMDAgPT0gMCkgewotICAgICAgICAgICAgY291dCA8PCJndWlkZUluIHJlYWQgIiA8PG51bUd1aWRlcyA8PCIgZ3VpZGVzIiA8PGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiRXJyb3I6IHJlYWRpbmcgZ3VpZGUgZmlsZSEiIDw8ZW5kbDsKLSAgICAgICAgZXhpdCgyKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZmluLmNsb3NlKCk7Ci0gIH0gZWxzZSB7Ci0gICAgY291dCA8PCJFcnJvcjogZmFpbGVkIHRvIG9wZW4gZ3VpZGUgZmlsZSIgPDxlbmRsOwotICAgIGV4aXQoMik7Ci0gIH0KLQotCi0gIGlmIChWRVJCT1NFID4gMCkgewotICAgIGNvdXQgPDxlbmRsOwotICAgIGNvdXQgPDwiI2d1aWRlczogICAgICIgPDxudW1HdWlkZXMgPDxlbmRsOwotICB9Ci0KLX0KLQotdm9pZCBpbzo6V3JpdGVyOjpmaWxsQ29ubkZpZ3NfbmV0KGZyTmV0KiBuZXQsIGJvb2wgaXNUQSkgewotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLSAgYXV0byBuZXROYW1lID0gbmV0LT5nZXROYW1lKCk7Ci0gIGlmIChpc1RBKSB7Ci0gICAgZm9yIChhdXRvICZ1R3VpZGU6IG5ldC0+Z2V0R3VpZGVzKCkpIHsKLSAgICAgIC8vY291dCA8PCJmaW5kIGd1aWRlIiA8PGVuZGw7Ci0gICAgICBmb3IgKGF1dG8gJnVDb25uRmlnOiB1R3VpZGUtPmdldFJvdXRlcygpKSB7Ci0gICAgICAgIGF1dG8gY29ubkZpZyA9IHVDb25uRmlnLmdldCgpOwotICAgICAgICBpZiAoY29ubkZpZy0+dHlwZUlkKCkgPT0gZnJjUGF0aFNlZykgewotICAgICAgICAgIGNvbm5GaWdzW25ldE5hbWVdLnB1c2hfYmFjayhtYWtlX3NoYXJlZDxmclBhdGhTZWc+KCpzdGF0aWNfY2FzdDxmclBhdGhTZWcqPihjb25uRmlnKSkpOwotICAgICAgICB9IGVsc2UgaWYgKGNvbm5GaWctPnR5cGVJZCgpID09IGZyY1ZpYSkgewotICAgICAgICAgIGNvbm5GaWdzW25ldE5hbWVdLnB1c2hfYmFjayhtYWtlX3NoYXJlZDxmclZpYT4oKnN0YXRpY19jYXN0PGZyVmlhKj4oY29ubkZpZykpKTsKLSAgICAgICAgICAvL2ZyUG9pbnQgYnAsIGVwOwotICAgICAgICAgIC8vc3RhdGljX3BvaW50ZXJfY2FzdDxmckd1aWRlPihvYmpQdHIpLT5nZXRQb2ludHMoYnAsIGVwKTsKLSAgICAgICAgICAvL2NvdXQgPDwiZmlsbENvbm5GaWdzX25ldCBmb3VuZCB2aWEgaW4gZ3VpZGUgIiA8PGJwIDw8IiAiIDw8ZXAgPDwiICIKLSAgICAgICAgICAvLyAgICAgPDxzdGF0aWNfcG9pbnRlcl9jYXN0PGZyR3VpZGU+KG9ialB0ciktPmdldEJlZ2luTGF5ZXJOdW0oKSA8PCIgIiAKLSAgICAgICAgICAvLyAgICAgPDxzdGF0aWNfcG9pbnRlcl9jYXN0PGZyR3VpZGU+KG9ialB0ciktPmdldEVuZExheWVyTnVtKCkgPDxlbmRsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGNvdXQgPDwiRXJyb3I6IGlvOjpXcml0ZXI6OmZpbGxpQ29ubkZpZ3MgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIHR5cGUiIDw8ZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBjb3V0IDw8IG5ldE5hbWUgPDwgIjpcbiI7Ci0gICAgfQotICAgIGZvciAoYXV0byAmc2hhcGU6IG5ldC0+Z2V0U2hhcGVzKCkpIHsKLSAgICAgIGlmIChzaGFwZS0+dHlwZUlkKCkgPT0gZnJjUGF0aFNlZykgewotICAgICAgICBhdXRvIHBhdGhTZWcgPSAqc3RhdGljX2Nhc3Q8ZnJQYXRoU2VnKj4oc2hhcGUuZ2V0KCkpOwotICAgICAgICBmclBvaW50IHN0YXJ0LCBlbmQ7Ci0gICAgICAgIHBhdGhTZWcuZ2V0UG9pbnRzKHN0YXJ0LCBlbmQpOwotCi0gICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICBmckxheWVyTnVtIGN1cnJMYXllck51bSA9IHBhdGhTZWcuZ2V0TGF5ZXJOdW0oKTsKLSAgICAgICAgICBjb3V0IDw8ICIgIGNvbm5maWcgcGF0aHNlZyAoIiA8PCBzdGFydC54KCkgLyAyMDAwLjA8PCAiLCAiIDw8IHN0YXJ0LnkoKSAvIDIwMDAuMCAKLSAgICAgICAgICAgICAgIDw8ICIpIC0gKCIgPDwgZW5kLngoKSAvIDIwMDAuMCA8PCAiLCAiIDw8IGVuZC55KCkgLyAyMDAwLjAgPDwgIikgIiA8PCBjdXJyTGF5ZXJOdW0gIDw8IlxuIjsgCi0gICAgICAgIH0KLSAgICAgICAgY29ubkZpZ3NbbmV0TmFtZV0ucHVzaF9iYWNrKG1ha2Vfc2hhcmVkPGZyUGF0aFNlZz4ocGF0aFNlZykpOwotICAgICAgfQotICAgIH0KLSAgICBmb3IgKGF1dG8gJnZpYTogbmV0LT5nZXRWaWFzKCkpIHsKLSAgICAgIGNvbm5GaWdzW25ldE5hbWVdLnB1c2hfYmFjayhtYWtlX3NoYXJlZDxmclZpYT4oKnZpYSkpOwotICAgIH0KLSAgICBmb3IgKGF1dG8gJnNoYXBlOiBuZXQtPmdldFBhdGNoV2lyZXMoKSkgewotICAgICAgYXV0byBwd2lyZSA9IHN0YXRpY19jYXN0PGZyUGF0Y2hXaXJlKj4oc2hhcGUuZ2V0KCkpOwotICAgICAgY29ubkZpZ3NbbmV0TmFtZV0ucHVzaF9iYWNrKG1ha2Vfc2hhcmVkPGZyUGF0Y2hXaXJlPigqcHdpcmUpKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBpbzo6V3JpdGVyOjpzcGxpdFZpYV9oZWxwZXIoZnJMYXllck51bSBsYXllck51bSwgaW50IGlzSCwgZnJDb29yZCB0cmFja0xvYywgZnJDb29yZCB4LCBmckNvb3JkIHksIAotICB2ZWN0b3I8IHZlY3RvcjwgbWFwPGZyQ29vcmQsIHZlY3RvcjxzaGFyZWRfcHRyPGZyUGF0aFNlZz4gPiA+ID4gPiAmbWVyZ2VkUGF0aFNlZ3MpIHsKLSAgaWYgKGxheWVyTnVtID49IDAgJiYgbGF5ZXJOdW0gPCAoaW50KShnZXRUZWNoKCktPmdldExheWVycygpLnNpemUoKSkgJiYKLSAgICAgIG1lcmdlZFBhdGhTZWdzLmF0KGxheWVyTnVtKS5hdChpc0gpLmZpbmQodHJhY2tMb2MpICE9IG1lcmdlZFBhdGhTZWdzLmF0KGxheWVyTnVtKS5hdChpc0gpLmVuZCgpKSB7Ci0gICAgZm9yIChhdXRvICZwYXRoU2VnOiBtZXJnZWRQYXRoU2Vncy5hdChsYXllck51bSkuYXQoaXNIKS5hdCh0cmFja0xvYykpIHsKLSAgICAgIGZyUG9pbnQgYmVnaW4sIGVuZDsKLSAgICAgIHBhdGhTZWctPmdldFBvaW50cyhiZWdpbiwgZW5kKTsKLSAgICAgIGlmICgoaXNIID09IDAgJiYgKGJlZ2luLngoKSA8IHgpICYmIChlbmQueCgpID4geCkpIHx8Ci0gICAgICAgICAgKGlzSCA9PSAxICYmIChiZWdpbi55KCkgPCB5KSAmJiAoZW5kLnkoKSA+IHkpKSkgewotICAgICAgICBmclNlZ1N0eWxlIHN0eWxlMSwgc3R5bGUyLCBzdHlsZV9kZWZhdWx0OwotICAgICAgICBwYXRoU2VnLT5nZXRTdHlsZShzdHlsZTEpOwotICAgICAgICBwYXRoU2VnLT5nZXRTdHlsZShzdHlsZTIpOwotICAgICAgICBzdHlsZV9kZWZhdWx0ID0gZ2V0VGVjaCgpLT5nZXRMYXllcihsYXllck51bSktPmdldERlZmF1bHRTZWdTdHlsZSgpOwotICAgICAgICBzaGFyZWRfcHRyPGZyUGF0aFNlZz4gbmV3UGF0aFNlZyA9IG1ha2Vfc2hhcmVkPGZyUGF0aFNlZz4oKnBhdGhTZWcpOwotICAgICAgICBwYXRoU2VnLT5zZXRQb2ludHMoYmVnaW4sIGZyUG9pbnQoeCx5KSk7Ci0gICAgICAgIHN0eWxlMS5zZXRFbmRTdHlsZShzdHlsZV9kZWZhdWx0LmdldEVuZFN0eWxlKCksIHN0eWxlX2RlZmF1bHQuZ2V0RW5kRXh0KCkpOwotICAgICAgICBwYXRoU2VnLT5zZXRTdHlsZShzdHlsZTEpOwotICAgICAgICBuZXdQYXRoU2VnLT5zZXRQb2ludHMoZnJQb2ludCh4LHkpLCBlbmQpOwotICAgICAgICBzdHlsZTIuc2V0QmVnaW5TdHlsZShzdHlsZV9kZWZhdWx0LmdldEJlZ2luU3R5bGUoKSwgc3R5bGVfZGVmYXVsdC5nZXRCZWdpbkV4dCgpKTsKLSAgICAgICAgbmV3UGF0aFNlZy0+c2V0U3R5bGUoc3R5bGUyKTsKLSAgICAgICAgbWVyZ2VkUGF0aFNlZ3MuYXQobGF5ZXJOdW0pLmF0KGlzSCkuYXQodHJhY2tMb2MpLnB1c2hfYmFjayhuZXdQYXRoU2VnKTsKLSAgICAgICAgLy8gdmlhIGNhbiBvbmx5IGludGVyc2VjdCBhdCBtb3N0IG9uZSBtZXJnZWQgcGF0aHNlZyBvbiBvbmUgdHJhY2sKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLQotCi0KLS8vIG1lcmdlIHBhdGhzZWcsIGRlbGV0ZSByZWR1bmRhbnQgdmlhCi12b2lkIGlvOjpXcml0ZXI6Om1lcmdlU3BsaXRDb25uRmlncyhsaXN0PHNoYXJlZF9wdHI8ZnJDb25uRmlnPiA+ICZjb25uRmlncykgewotICAvL2lmIChWRVJCT1NFID4gMCkgewotICAvLyAgY291dCA8PGVuZGwgPDwibWVyZ2UgYW5kIHNwbGl0IC4uLiIgPDxlbmRsOwotICAvL30KLSAgLy8gaW5pdGlhbHppZSBwYXRoc2VnIGFuZCB2aWEgbWFwCi0gIC8vbWFwPCB0dXBsZTxsYXllck51bSwgaXNIb3Jpem9udGFsLCB0cmFja0xvYz4sCi0gIC8vICAgICBtYXA8ZnJDb29yZCwgdmVjdG9yPCB0dXBsZTxzaGFyZWRfcHRyPGZyUGF0aFNlZz4sIGlzQmVnaW4+ID4gPiAKLSAgLy8gICA+IG1hcDsKLSAgbWFwIDwgdHVwbGU8ZnJMYXllck51bSwgYm9vbCwgZnJDb29yZD4sCi0gICAgICAgIG1hcDxmckNvb3JkLCB2ZWN0b3I8IHR1cGxlPHNoYXJlZF9wdHI8ZnJQYXRoU2VnPiwgYm9vbD4gPiAKLSAgICAgICAgICAgPgotICAgICAgPiBwYXRoU2VnTWVyZ2VNYXA7Ci0gIG1hcCA8IHR1cGxlPGZyQ29vcmQsIGZyQ29vcmQsIGZyTGF5ZXJOdW0+LCBzaGFyZWRfcHRyPGZyVmlhPiA+IHZpYU1lcmdlTWFwOwotICBmb3IgKGF1dG8gJmNvbm5GaWc6IGNvbm5GaWdzKSB7Ci0gICAgaWYgKGNvbm5GaWctPnR5cGVJZCgpID09IGZyY1BhdGhTZWcpIHsKLSAgICAgIGF1dG8gcGF0aFNlZyA9IGR5bmFtaWNfcG9pbnRlcl9jYXN0PGZyUGF0aFNlZz4oY29ubkZpZyk7Ci0gICAgICBmclBvaW50IGJlZ2luLCBlbmQ7Ci0gICAgICBwYXRoU2VnLT5nZXRQb2ludHMoYmVnaW4sIGVuZCk7Ci0gICAgICBmckxheWVyTnVtIGxheWVyTnVtID0gcGF0aFNlZy0+Z2V0TGF5ZXJOdW0oKTsKLSAgICAgIGlmIChiZWdpbiA9PSBlbmQpIHsKLSAgICAgICAgLy8gc3RkOjpjb3V0IDw8ICJXYXJuaW5nOiAwIGxlbmd0aCBjb25uZmlnXG4iOwotICAgICAgICBjb250aW51ZTsgLy8gaWYgc2VnbWVudCBsZW5ndGggPSAwLCBpZ25vcmUKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIHN0ZDo6Y291dCA8PCAieHh4XG4iOwotICAgICAgICBib29sIGlzSCA9IChiZWdpbi54KCkgPT0gZW5kLngoKSkgPyBmYWxzZSA6IHRydWU7Ci0gICAgICAgIGZyQ29vcmQgdHJhY2tMb2MgICA9IGlzSCA/IGJlZ2luLnkoKSA6IGJlZ2luLngoKTsKLSAgICAgICAgZnJDb29yZCBiZWdpbkNvb3JkID0gaXNIID8gYmVnaW4ueCgpIDogYmVnaW4ueSgpOwotICAgICAgICBmckNvb3JkIGVuZENvb3JkICAgPSBpc0ggPyBlbmQueCgpICAgOiBlbmQueSgpOwotICAgICAgICBwYXRoU2VnTWVyZ2VNYXBbbWFrZV90dXBsZShsYXllck51bSwgaXNILCB0cmFja0xvYyldW2JlZ2luQ29vcmRdLnB1c2hfYmFjayhtYWtlX3R1cGxlKHBhdGhTZWcsIHRydWUpKTsKLSAgICAgICAgcGF0aFNlZ01lcmdlTWFwW21ha2VfdHVwbGUobGF5ZXJOdW0sIGlzSCwgdHJhY2tMb2MpXVtlbmRDb29yZF0ucHVzaF9iYWNrKG1ha2VfdHVwbGUocGF0aFNlZywgZmFsc2UpKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGNvbm5GaWctPnR5cGVJZCgpID09IGZyY1ZpYSkgewotICAgICAgYXV0byB2aWEgPSBkeW5hbWljX3BvaW50ZXJfY2FzdDxmclZpYT4oY29ubkZpZyk7Ci0gICAgICBhdXRvIGN1dExheWVyTnVtID0gdmlhLT5nZXRWaWFEZWYoKS0+Z2V0Q3V0TGF5ZXJOdW0oKTsKLSAgICAgIC8vYXV0byBsYXllcjFOdW0gPSB2aWEtPmdldExheWVyMU51bSgpOwotICAgICAgLy9hdXRvIGxheWVyMk51bSA9IHZpYS0+Z2V0TGF5ZXIyTnVtKCk7Ci0gICAgICBmclBvaW50IHZpYVBvaW50OwotICAgICAgdmlhLT5nZXRPcmlnaW4odmlhUG9pbnQpOwotICAgICAgdmlhTWVyZ2VNYXBbbWFrZV90dXBsZSh2aWFQb2ludC54KCksIHZpYVBvaW50LnkoKSwgY3V0TGF5ZXJOdW0pXSA9IHZpYTsKLSAgICAgIC8vY291dCA8PCJmb3VuZCB2aWEiIDw8ZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgOwotICAgIH0KLSAgfQotCi0gIC8vIG1lcmdlIHBhdGhTZWcKLSAgbWFwPGZyQ29vcmQsIHZlY3RvcjxzaGFyZWRfcHRyPGZyUGF0aFNlZz4gPiA+IHRtcDE7Ci0gIHZlY3RvcjwgbWFwPGZyQ29vcmQsIHZlY3RvcjxzaGFyZWRfcHRyPGZyUGF0aFNlZz4gPiA+ID4gdG1wMigyLCB0bXAxKTsKLSAgLy8gbWVyZ2VkUGF0aFNlZ3NbbGF5ZXJOdW1dW2lzSG9yaXpvbnRhbF0gaXMgYSBtYXA8dHJhY2tMb2MsIHZlY3RvcjxzaGFyZWRfcHRyPGZyUGF0aFNlZz4gPiA+Ci0gIHZlY3RvcjwgdmVjdG9yPCBtYXA8ZnJDb29yZCwgdmVjdG9yPHNoYXJlZF9wdHI8ZnJQYXRoU2VnPiA+ID4gPiA+IG1lcmdlZFBhdGhTZWdzKGdldFRlY2goKS0+Z2V0TGF5ZXJzKCkuc2l6ZSgpLCB0bXAyKTsKLQotICBmb3IgKGF1dG8gJml0MTogcGF0aFNlZ01lcmdlTWFwKSB7Ci0gICAgYXV0byBsYXllck51bSA9IGdldDwwPihpdDEuZmlyc3QpOwotICAgIGludCAgaXNIID0gZ2V0PDE+KGl0MS5maXJzdCk7Ci0gICAgYXV0byB0cmFja0xvYyA9IGdldDwyPihpdDEuZmlyc3QpOwotICAgIGJvb2wgaGFzU2VnID0gZmFsc2U7Ci0gICAgaW50IGNudCA9IDA7Ci0gICAgc2hhcmVkX3B0cjxmclBhdGhTZWc+IG5ld1BhdGhTZWc7Ci0gICAgZnJTZWdTdHlsZSBzdHlsZTsKLSAgICBmclBvaW50IGJlZ2luLCBlbmQ7Ci0gICAgZm9yIChhdXRvICZpdDI6IGl0MS5zZWNvbmQpIHsKLSAgICAgIC8vYXV0byBjb29yZCA9IGl0Mi5maXJzdDsKLSAgICAgIC8vY291dCA8PCJjb29yZCAiIDw8Y29vcmQgPDxlbmRsOwotICAgICAgZm9yIChhdXRvICZwYXRoU2VnVHVwbGU6IGl0Mi5zZWNvbmQpIHsKLSAgICAgICAgY250ICs9IGdldDwxPihwYXRoU2VnVHVwbGUpPyAxIDogLTE7Ci0gICAgICB9Ci0gICAgICAvLyBuZXdQYXRoU2VnIGJlZ2luCi0gICAgICBpZiAoIWhhc1NlZyAmJiBjbnQgPiAwKSB7Ci0gICAgICAgIHN0eWxlLnNldEJlZ2luU3R5bGUoZnJjVHJ1bmNhdGVFbmRTdHlsZSwgMCk7Ci0gICAgICAgIHN0eWxlLnNldEVuZFN0eWxlKGZyY1RydW5jYXRlRW5kU3R5bGUsIDApOwotICAgICAgICBuZXdQYXRoU2VnID0gbWFrZV9zaGFyZWQ8ZnJQYXRoU2VnPigqKGdldDwwPigqKGl0Mi5zZWNvbmQuYmVnaW4oKSkpKSk7Ci0gICAgICAgIGZvciAoYXV0byAmcGF0aFNlZ1R1cGxlOiBpdDIuc2Vjb25kKSB7Ci0gICAgICAgICAgYXV0byBwYXRoU2VnID0gZ2V0PDA+KHBhdGhTZWdUdXBsZSk7Ci0gICAgICAgICAgYXV0byBpc0JlZ2luID0gZ2V0PDE+KHBhdGhTZWdUdXBsZSk7Ci0gICAgICAgICAgaWYgKGlzQmVnaW4pIHsKLSAgICAgICAgICAgIHBhdGhTZWctPmdldFBvaW50cyhiZWdpbiwgZW5kKTsKLSAgICAgICAgICAgIGZyU2VnU3R5bGUgdG1wU3R5bGU7Ci0gICAgICAgICAgICBwYXRoU2VnLT5nZXRTdHlsZSh0bXBTdHlsZSk7Ci0gICAgICAgICAgICBpZiAodG1wU3R5bGUuZ2V0QmVnaW5FeHQoKSA+IHN0eWxlLmdldEJlZ2luRXh0KCkpIHsKLSAgICAgICAgICAgICAgc3R5bGUuc2V0QmVnaW5TdHlsZSh0bXBTdHlsZS5nZXRCZWdpblN0eWxlKCksIHRtcFN0eWxlLmdldEJlZ2luRXh0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBuZXdQYXRoU2VnLT5zZXRTdHlsZShzdHlsZSk7Ci0gICAgICAgIGhhc1NlZyA9IHRydWU7Ci0gICAgICAvLyBuZXdQYXRoU2VnIGVuZAotICAgICAgfSBlbHNlIGlmIChoYXNTZWcgJiYgY250ID09IDApIHsKLSAgICAgICAgbmV3UGF0aFNlZy0+Z2V0UG9pbnRzKGJlZ2luLCBlbmQpOwotICAgICAgICBmb3IgKGF1dG8gJnBhdGhTZWdUdXBsZTogaXQyLnNlY29uZCkgewotICAgICAgICAgIGF1dG8gcGF0aFNlZyA9IGdldDwwPihwYXRoU2VnVHVwbGUpOwotICAgICAgICAgIGF1dG8gaXNCZWdpbiA9IGdldDwxPihwYXRoU2VnVHVwbGUpOwotICAgICAgICAgIGlmICghaXNCZWdpbikgewotICAgICAgICAgICAgZnJQb2ludCB0bXA7Ci0gICAgICAgICAgICBwYXRoU2VnLT5nZXRQb2ludHModG1wLCBlbmQpOwotICAgICAgICAgICAgZnJTZWdTdHlsZSB0bXBTdHlsZTsKLSAgICAgICAgICAgIHBhdGhTZWctPmdldFN0eWxlKHRtcFN0eWxlKTsKLSAgICAgICAgICAgIGlmICh0bXBTdHlsZS5nZXRFbmRFeHQoKSA+IHN0eWxlLmdldEVuZEV4dCgpKSB7Ci0gICAgICAgICAgICAgIHN0eWxlLnNldEVuZFN0eWxlKHRtcFN0eWxlLmdldEVuZFN0eWxlKCksIHRtcFN0eWxlLmdldEVuZEV4dCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbmV3UGF0aFNlZy0+c2V0UG9pbnRzKGJlZ2luLCBlbmQpOwotICAgICAgICBuZXdQYXRoU2VnLT5zZXRTdHlsZShzdHlsZSk7Ci0gICAgICAgIGhhc1NlZyA9IGZhbHNlOwotICAgICAgICAobWVyZ2VkUGF0aFNlZ3MuYXQobGF5ZXJOdW0pLmF0KGlzSCkpW3RyYWNrTG9jXS5wdXNoX2JhY2sobmV3UGF0aFNlZyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gc3BsaXQgcGF0aHNlZyBmcm9tIHZpYQotICAvLyBtZXJnZWRQYXRoU2Vnc1tsYXllck51bV1baXNIb3Jpem9udGFsXSBpcyBhIG1hcDxmckNvb3JkLCB2ZWN0b3I8c2hhcmVkX3B0cjxmclBhdGhTZWc+ID4gPgotICAvL21hcCA8IHR1cGxlPGZyQ29vcmQsIGZyQ29vcmQsIGZyTGF5ZXJOdW0+LCBzaGFyZWRfcHRyPGZyVmlhPiA+IHZpYU1lcmdlTWFwOwotICBmb3IgKGF1dG8gJml0MTogdmlhTWVyZ2VNYXApIHsKLSAgICBhdXRvIHggICAgICAgICAgID0gZ2V0PDA+KGl0MS5maXJzdCk7Ci0gICAgYXV0byB5ICAgICAgICAgICA9IGdldDwxPihpdDEuZmlyc3QpOwotICAgIGF1dG8gY3V0TGF5ZXJOdW0gPSBnZXQ8Mj4oaXQxLmZpcnN0KTsKLSAgICBmckNvb3JkIHRyYWNrTG9jOwotCi0gICAgYXV0byBsYXllck51bSA9IGN1dExheWVyTnVtIC0gMTsKLSAgICBpbnQgIGlzSCAgICAgID0gMTsKLSAgICB0cmFja0xvYyA9IChpc0ggPT0gMSkgPyB5IDogeDsKLSAgICBzcGxpdFZpYV9oZWxwZXIobGF5ZXJOdW0sIGlzSCwgdHJhY2tMb2MsIHgsIHksIG1lcmdlZFBhdGhTZWdzKTsKLQotICAgIGxheWVyTnVtID0gY3V0TGF5ZXJOdW0gLSAxOwotICAgIGlzSCA9IDA7Ci0gICAgdHJhY2tMb2MgPSAoaXNIID09IDEpID8geSA6IHg7Ci0gICAgc3BsaXRWaWFfaGVscGVyKGxheWVyTnVtLCBpc0gsIHRyYWNrTG9jLCB4LCB5LCBtZXJnZWRQYXRoU2Vncyk7Ci0KLSAgICBsYXllck51bSA9IGN1dExheWVyTnVtICsgMTsKLSAgICB0cmFja0xvYyA9IChpc0ggPT0gMSkgPyB5IDogeDsKLSAgICBzcGxpdFZpYV9oZWxwZXIobGF5ZXJOdW0sIGlzSCwgdHJhY2tMb2MsIHgsIHksIG1lcmdlZFBhdGhTZWdzKTsKLQotICAgIGxheWVyTnVtID0gY3V0TGF5ZXJOdW0gKyAxOwotICAgIGlzSCA9IDA7Ci0gICAgdHJhY2tMb2MgPSAoaXNIID09IDEpID8geSA6IHg7Ci0gICAgc3BsaXRWaWFfaGVscGVyKGxheWVyTnVtLCBpc0gsIHRyYWNrTG9jLCB4LCB5LCBtZXJnZWRQYXRoU2Vncyk7Ci0gIH0KLQotICAvLyBzcGxpdCBpbnRlcnNlY3RpbmcgcGF0aFNlZ3MKLSAgZm9yIChhdXRvICZpdDE6IG1lcmdlZFBhdGhTZWdzKSB7Ci0gICAgLy8gdmVydGljYWwgZm9yIG1hcEl0MQotICAgIGZvciAoYXV0byAmbWFwSXQxOiBpdDEuYXQoMCkpIHsKLSAgICAgIC8vIGhvcml6b250YWwgZm9yIG1hcEl0MgotICAgICAgZm9yIChhdXRvICZtYXBJdDI6IGl0MS5hdCgxKSkgewotICAgICAgICAvLyBhdCBtb3N0IHNwbGl0IG9uY2UKLSAgICAgICAgLy8gc2VnMSBpcyB2ZXJ0aWNhbAotICAgICAgICBmb3IgKGF1dG8gJnNlZzE6IG1hcEl0MS5zZWNvbmQpIHsKLSAgICAgICAgICBib29sIHNraXAgPSBmYWxzZTsKLSAgICAgICAgICAvLyBzZWcyIGlzIGhvcml6b250YWwKLSAgICAgICAgICBmclBvaW50IHNlZzFCZWdpbiwgc2VnMUVuZDsKLSAgICAgICAgICBzZWcxLT5nZXRQb2ludHMoc2VnMUJlZ2luLCBzZWcxRW5kKTsKLSAgICAgICAgICBmb3IgKGF1dG8gJnNlZzI6IG1hcEl0Mi5zZWNvbmQpIHsKLSAgICAgICAgICAgIGZyUG9pbnQgc2VnMkJlZ2luLCBzZWcyRW5kOwotICAgICAgICAgICAgc2VnMi0+Z2V0UG9pbnRzKHNlZzJCZWdpbiwgc2VnMkVuZCk7Ci0gICAgICAgICAgICBib29sIHB1c2hOZXdTZWcxID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sIHB1c2hOZXdTZWcyID0gZmFsc2U7Ci0gICAgICAgICAgICBzaGFyZWRfcHRyPGZyUGF0aFNlZz4gbmV3U2VnMTsKLSAgICAgICAgICAgIHNoYXJlZF9wdHI8ZnJQYXRoU2VnPiBuZXdTZWcyOwotICAgICAgICAgICAgLy8gY2hlY2sgd2hldGhlciBzZWcxIG5lZWRzIHRvIGJlIHNwbGl0LCBicmVhayBzZWcxCi0gICAgICAgICAgICBpZiAoc2VnMkJlZ2luLnkoKSA+IHNlZzFCZWdpbi55KCkgJiYgc2VnMkJlZ2luLnkoKSA8IHNlZzFFbmQueSgpKSB7Ci0gICAgICAgICAgICAgIHB1c2hOZXdTZWcxID0gdHJ1ZTsKLSAgICAgICAgICAgICAgbmV3U2VnMSA9IG1ha2Vfc2hhcmVkPGZyUGF0aFNlZz4oKnNlZzEpOwotICAgICAgICAgICAgICAvLyBtb2RpZnkgc2VnMQotICAgICAgICAgICAgICBzZWcxLT5zZXRQb2ludHMoc2VnMUJlZ2luLCBmclBvaW50KHNlZzFFbmQueCgpLCBzZWcyRW5kLnkoKSkpOwotICAgICAgICAgICAgICAvLyBtb2RpZnkgbmV3U2VnMQotICAgICAgICAgICAgICBuZXdTZWcxLT5zZXRQb2ludHMoZnJQb2ludChzZWcxRW5kLngoKSwgc2VnMkJlZ2luLnkoKSksIHNlZzFFbmQpOwotICAgICAgICAgICAgICAvLyBtb2RpZnkgZW5kc3R5bGUKLSAgICAgICAgICAgICAgYXV0byBsYXllck51bSA9IHNlZzEtPmdldExheWVyTnVtKCk7Ci0gICAgICAgICAgICAgIGZyU2VnU3R5bGUgdG1wU3R5bGUxOwotICAgICAgICAgICAgICBmclNlZ1N0eWxlIHRtcFN0eWxlMjsKLSAgICAgICAgICAgICAgZnJTZWdTdHlsZSBzdHlsZV9kZWZhdWx0OwotICAgICAgICAgICAgICBzZWcxLT5nZXRTdHlsZSh0bXBTdHlsZTEpOwotICAgICAgICAgICAgICBzZWcxLT5nZXRTdHlsZSh0bXBTdHlsZTIpOwotICAgICAgICAgICAgICBzdHlsZV9kZWZhdWx0ID0gZ2V0VGVjaCgpLT5nZXRMYXllcihsYXllck51bSktPmdldERlZmF1bHRTZWdTdHlsZSgpOwotICAgICAgICAgICAgICB0bXBTdHlsZTEuc2V0RW5kU3R5bGUoZnJjRXh0ZW5kRW5kU3R5bGUsIHN0eWxlX2RlZmF1bHQuZ2V0RW5kRXh0KCkpOwotICAgICAgICAgICAgICBzZWcxLT5zZXRTdHlsZSh0bXBTdHlsZTEpOwotICAgICAgICAgICAgICB0bXBTdHlsZTIuc2V0QmVnaW5TdHlsZShmcmNFeHRlbmRFbmRTdHlsZSwgc3R5bGVfZGVmYXVsdC5nZXRCZWdpbkV4dCgpKTsKLSAgICAgICAgICAgICAgbmV3U2VnMS0+c2V0U3R5bGUodG1wU3R5bGUyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgc2VnMiBuZWVkcyB0byBiZSBzcGxpdCwgYnJlYWsgc2VnMgotICAgICAgICAgICAgaWYgKHNlZzFCZWdpbi54KCkgPiBzZWcyQmVnaW4ueCgpICYmIHNlZzFCZWdpbi54KCkgPCBzZWcyRW5kLngoKSkgewotICAgICAgICAgICAgICBwdXNoTmV3U2VnMiA9IHRydWU7Ci0gICAgICAgICAgICAgIG5ld1NlZzIgPSBtYWtlX3NoYXJlZDxmclBhdGhTZWc+KCpzZWcxKTsKLSAgICAgICAgICAgICAgLy8gbW9kaWZ5IHNlZzIKLSAgICAgICAgICAgICAgc2VnMi0+c2V0UG9pbnRzKHNlZzJCZWdpbiwgZnJQb2ludChzZWcxRW5kLngoKSwgc2VnMkVuZC55KCkpKTsKLSAgICAgICAgICAgICAgLy8gbW9kaWZ5IG5ld1NlZzIKLSAgICAgICAgICAgICAgbmV3U2VnMi0+c2V0UG9pbnRzKGZyUG9pbnQoc2VnMUVuZC54KCksIHNlZzJCZWdpbi55KCkpLCBzZWcyRW5kKTsKLSAgICAgICAgICAgICAgLy8gbW9kaWZ5IGVuZHN0eWxlCi0gICAgICAgICAgICAgIGF1dG8gbGF5ZXJOdW0gPSBzZWcyLT5nZXRMYXllck51bSgpOwotICAgICAgICAgICAgICBmclNlZ1N0eWxlIHRtcFN0eWxlMTsKLSAgICAgICAgICAgICAgZnJTZWdTdHlsZSB0bXBTdHlsZTI7Ci0gICAgICAgICAgICAgIGZyU2VnU3R5bGUgc3R5bGVfZGVmYXVsdDsKLSAgICAgICAgICAgICAgc2VnMi0+Z2V0U3R5bGUodG1wU3R5bGUxKTsKLSAgICAgICAgICAgICAgc2VnMi0+Z2V0U3R5bGUodG1wU3R5bGUyKTsKLSAgICAgICAgICAgICAgc3R5bGVfZGVmYXVsdCA9IGdldFRlY2goKS0+Z2V0TGF5ZXIobGF5ZXJOdW0pLT5nZXREZWZhdWx0U2VnU3R5bGUoKTsKLSAgICAgICAgICAgICAgdG1wU3R5bGUxLnNldEVuZFN0eWxlKGZyY0V4dGVuZEVuZFN0eWxlLCBzdHlsZV9kZWZhdWx0LmdldEVuZEV4dCgpKTsKLSAgICAgICAgICAgICAgc2VnMi0+c2V0U3R5bGUodG1wU3R5bGUxKTsKLSAgICAgICAgICAgICAgdG1wU3R5bGUyLnNldEJlZ2luU3R5bGUoZnJjRXh0ZW5kRW5kU3R5bGUsIHN0eWxlX2RlZmF1bHQuZ2V0QmVnaW5FeHQoKSk7Ci0gICAgICAgICAgICAgIG5ld1NlZzItPnNldFN0eWxlKHRtcFN0eWxlMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocHVzaE5ld1NlZzEpIHsKLSAgICAgICAgICAgICAgbWFwSXQxLnNlY29uZC5wdXNoX2JhY2sobmV3U2VnMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocHVzaE5ld1NlZzIpIHsKLSAgICAgICAgICAgICAgbWFwSXQyLnNlY29uZC5wdXNoX2JhY2sobmV3U2VnMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocHVzaE5ld1NlZzEgfHwgcHVzaE5ld1NlZzIpIHsKLSAgICAgICAgICAgICAgc2tpcCA9IHRydWU7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9jb3V0IDw8ImZvdW5kIiA8PGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChza2lwKSBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLy8gd3JpdGUgYmFjayBwYXRoc2VnCi0gIGNvbm5GaWdzLmNsZWFyKCk7Ci0gIGZvciAoYXV0byAmaXQxOiBtZXJnZWRQYXRoU2VncykgewotICAgIGZvciAoYXV0byAmaXQyOiBpdDEpIHsKLSAgICAgIGZvciAoYXV0byAmaXQzOiBpdDIpIHsKLSAgICAgICAgZm9yIChhdXRvICZpdDQ6IGl0My5zZWNvbmQpIHsKLSAgICAgICAgICBjb25uRmlncy5wdXNoX2JhY2soaXQ0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIHdyaXRlIGJhY2sgdmlhCi0gIC8vbWFwIDwgdHVwbGU8ZnJDb29yZCwgZnJDb29yZCwgZnJMYXllck51bT4sIHNoYXJlZF9wdHI8ZnJWaWE+ID4gdmlhTWVyZ2VNYXA7Ci0gIGZvciAoYXV0byAmaXQ6IHZpYU1lcmdlTWFwKSB7Ci0gICAgY29ubkZpZ3MucHVzaF9iYWNrKGl0LnNlY29uZCk7Ci0gIH0KLQotfQotCi12b2lkIGlvOjpXcml0ZXI6OmZpbGxDb25uRmlncyhib29sIGlzVEEpIHsKLSAgY29ubkZpZ3MuY2xlYXIoKTsKLSAgaWYgKFZFUkJPU0UgPiAwKSB7Ci0gICAgY291dCA8PGVuZGwgPDwicG9zdCBwcm9jZXNzaW5nIC4uLiIgPDxlbmRsOwotICB9Ci0gIGZvciAoYXV0byAmbmV0OiBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0TmV0cygpKSB7Ci0gICAgZmlsbENvbm5GaWdzX25ldChuZXQuZ2V0KCksIGlzVEEpOwotICB9Ci0gIGlmIChpc1RBKSB7Ci0gICAgZm9yIChhdXRvICZpdDogY29ubkZpZ3MpIHsKLSAgICAgIG1lcmdlU3BsaXRDb25uRmlncyhpdC5zZWNvbmQpOwotICAgIH0KLSAgfQotfQotCi12b2lkIGlvOjpXcml0ZXI6OndyaXRlRnJvbVRBKCkgewotICBmaWxsQ29ubkZpZ3ModHJ1ZSk7Ci0gIHdyaXRlRGVmKHRydWUpOwotfQotCi12b2lkIGlvOjpXcml0ZXI6OndyaXRlRnJvbURSKGNvbnN0IHN0cmluZyAmc3RyKSB7Ci0gIGZpbGxDb25uRmlncyhmYWxzZSk7Ci0gIHdyaXRlRGVmKGZhbHNlLCBzdHIpOwotfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvaW8vaW8uaCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2lvL2lvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYjU3NWMuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvaW8vaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIF9GUl9JT19IXwotI2RlZmluZSBfRlJfSU9fSF8KLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxsaXN0PgotI2luY2x1ZGUgPGJvb3N0L2ljbC9pbnRlcnZhbF9zZXQuaHBwPgotI2luY2x1ZGUgImZyRGVzaWduLmgiCi0KLSNpbmNsdWRlICJkZWZyUmVhZGVyLmhwcCIKLSNpbmNsdWRlICJkZWZ3V3JpdGVyLmhwcCIKLSNpbmNsdWRlICJsZWZyUmVhZGVyLmhwcCIKLQotbmFtZXNwYWNlIGZyIHsKLSAgbmFtZXNwYWNlIGlvIHsKLSAgICBjbGFzcyBQYXJzZXIgewotICAgIHB1YmxpYzoKLSAgICAgIC8vIGNvbnN0cnVjdG9ycwotICAgICAgUGFyc2VyKGZyRGVzaWduKiBkZXNpZ25Jbik6IGRlc2lnbihkZXNpZ25JbiksIHRlY2goZGVzaWduLT5nZXRUZWNoKCkpLCB0bXBCbG9jayhudWxscHRyKSwgcmVhZExheWVyQ250KDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcEd1aWRlcygpLCB0bXBHUlBpbnMoKSwgdHJhY2tPZmZzZXRNYXAoKSwgcHJlZlRyYWNrUGF0dGVybnMoKSwgbnVtUmVmQmxvY2tzKDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUluc3RzKDApLCBudW1UZXJtcygwKSwgbnVtTmV0cygwKSwgbnVtQmxvY2thZ2VzKDApIHt9Ci0gICAgICAvLyBvdGhlcnMKLSAgICAgIHZvaWQgcmVhZExlZkRlZigpOwotICAgICAgdm9pZCByZWFkR3VpZGUoKTsKLSAgICAgIHZvaWQgcG9zdFByb2Nlc3MoKTsKLSAgICAgIHZvaWQgcG9zdFByb2Nlc3NHdWlkZSgpOwotICAgICAgLy8gcnRyZWUgaW5pdAotICAgICAgLy92b2lkIGJ1aWxkUnRyZWU0Um91dGVzKCk7Ci0gICAgICAvL3ZvaWQgYnVpbGRSdHJlZTRJbnN0cygpOwotICAgICAgc3RkOjptYXA8ZnJCbG9jayosIHN0ZDo6bWFwPGZyT3JpZW50LCBzdGQ6Om1hcDxzdGQ6OnZlY3RvcjxmckNvb3JkPiwgc3RkOjpzZXQ8ZnJJbnN0KiwgZnJCbG9ja09iamVjdENvbXA+ID4gPiwgZnJCbG9ja09iamVjdENvbXA+ICZnZXRUcmFja09mZnNldE1hcCgpIHsKLSAgICAgICAgcmV0dXJuIHRyYWNrT2Zmc2V0TWFwOwotICAgICAgfQotICAgICAgc3RkOjp2ZWN0b3I8ZnJUcmFja1BhdHRlcm4qPiAmZ2V0UHJlZlRyYWNrUGF0dGVybnMoKSB7Ci0gICAgICAgIHJldHVybiBwcmVmVHJhY2tQYXR0ZXJuczsKLSAgICAgIH0KLQotICAgIHByb3RlY3RlZDoKLSAgICAgIHZvaWQgcmVhZExlZigpOwotICAgICAgdm9pZCByZWFkRGVmKCk7Ci0KLSAgICAgIGZyRGVzaWduKiAgICAgICBkZXNpZ247Ci0gICAgICBmclRlY2hPYmplY3QqICAgdGVjaDsKLQotICAgICAgc3RkOjp1bmlxdWVfcHRyPGZyQmxvY2s+ICAgICAgICB0bXBCbG9jazsKLSAgICAgIC8vIHRlbXBvcmFyeSB2YXJpYWJsZXMKLSAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZExheWVyQ250OwotICAgICAgc3RkOjptYXA8ZnJOZXQqLCBzdGQ6OnZlY3RvcjxmclJlY3Q+LCBmckJsb2NrT2JqZWN0Q29tcD4gdG1wR3VpZGVzOwotICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGZyQmxvY2tPYmplY3QqLCBmclBvaW50PiA+IHRtcEdSUGluczsKLSAgICAgIHN0ZDo6bWFwPGZyQmxvY2sqLCAKLSAgICAgICAgICAgICAgIHN0ZDo6bWFwPGZyT3JpZW50LCBzdGQ6Om1hcDxzdGQ6OnZlY3RvcjxmckNvb3JkPiwgc3RkOjpzZXQ8ZnJJbnN0KiwgZnJCbG9ja09iamVjdENvbXA+ID4gPiwKLSAgICAgICAgICAgICAgIGZyQmxvY2tPYmplY3RDb21wPiB0cmFja09mZnNldE1hcDsKLSAgICAgIHN0ZDo6dmVjdG9yPGZyVHJhY2tQYXR0ZXJuKj4gcHJlZlRyYWNrUGF0dGVybnM7Ci0gICAgICBpbnQgbnVtUmVmQmxvY2tzOwotICAgICAgaW50IG51bUluc3RzOwotICAgICAgaW50IG51bVRlcm1zOyAgICAgLy8gaW5jbHVkaW5nIGluc3R0ZXJtIGFuZCB0ZXJtCi0gICAgICBpbnQgbnVtTmV0czsgICAgICAvLyBpbmNsdWRpbmcgc25ldCBhbmQgbmV0Ci0gICAgICBpbnQgbnVtQmxvY2thZ2VzOyAvLyBpbmNsdWRpbmcgaW5zdEJsb2NrYWdlIGFuZCBibG9ja2FnZQotCi0gICAgICAvLyBMRUYvREVGIHBhcnNlciBoZWxwZXIKLSAgICAgIHN0YXRpYyBpbnQgZ2V0RGVmRGllQXJlYShkZWZyQ2FsbGJhY2tUeXBlX2UgdHlwZSwgZGVmaUJveCogYm94LCBkZWZpVXNlckRhdGEgZGF0YSk7Ci0gICAgICBzdGF0aWMgaW50IGdldERlZlRyYWNrcyhkZWZyQ2FsbGJhY2tUeXBlX2UgdHlwZSwgZGVmaVRyYWNrKiB0cmFjaywgZGVmaVVzZXJEYXRhIGRhdGEpOwotICAgICAgc3RhdGljIGludCBnZXREZWZWaWFzKGRlZnJDYWxsYmFja1R5cGVfZSB0eXBlLCBkZWZpVmlhKiBjb21wLCBkZWZpVXNlckRhdGEgZGF0YSk7Ci0gICAgICBzdGF0aWMgaW50IGdldERlZkNvbXBvbmVudHMoZGVmckNhbGxiYWNrVHlwZV9lIHR5cGUsIGRlZmlDb21wb25lbnQqIGNvbXAsIGRlZmlVc2VyRGF0YSBkYXRhKTsKLSAgICAgIHN0YXRpYyBpbnQgZ2V0RGVmVGVybWluYWxzKGRlZnJDYWxsYmFja1R5cGVfZSB0eXBlLCBkZWZpUGluKiB0ZXJtLCBkZWZpVXNlckRhdGEgZGF0YSk7Ci0gICAgICBzdGF0aWMgaW50IGdldERlZk5ldHMoZGVmckNhbGxiYWNrVHlwZV9lIHR5cGUsIGRlZmlOZXQqIG5ldCwgZGVmaVVzZXJEYXRhIGRhdGEpOwotICAgICAgc3RhdGljIGludCBnZXREZWZJbnRlZ2VyKGRlZnJDYWxsYmFja1R5cGVfZSB0eXBlLCBpbnQgbnVtYmVyLCBkZWZpVXNlckRhdGEgZGF0YSk7Ci0gICAgICBzdGF0aWMgaW50IGdldERlZlN0cmluZyhkZWZyQ2FsbGJhY2tUeXBlX2UgdHlwZSwgY29uc3QgY2hhciogc3RyLCBkZWZpVXNlckRhdGEgZGF0YSk7Ci0gICAgICBzdGF0aWMgaW50IGdldERlZlZvaWQoZGVmckNhbGxiYWNrVHlwZV9lIHR5cGUsIHZvaWQqIHZhcmlhYmxlLCBkZWZpVXNlckRhdGEgZGF0YSk7Ci0gICAgICBzdGF0aWMgaW50IGdldERlZlVuaXRzKGRlZnJDYWxsYmFja1R5cGVfZSB0eXBlLCBkb3VibGUgbnVtYmVyLCBkZWZpVXNlckRhdGEgZGF0YSk7Ci0gICAgICBzdGF0aWMgaW50IGdldExlZk1hY3JvcyhsZWZyQ2FsbGJhY2tUeXBlX2UgdHlwZSwgbGVmaU1hY3JvKiBtYWNybywgbGVmaVVzZXJEYXRhIGRhdGEpOwotICAgICAgc3RhdGljIGludCBnZXRMZWZQaW5zKGxlZnJDYWxsYmFja1R5cGVfZSB0eXBlLCBsZWZpUGluKiBwaW4sIGxlZmlVc2VyRGF0YSBkYXRhKTsKLSAgICAgIHN0YXRpYyBpbnQgZ2V0TGVmT2JzKGxlZnJDYWxsYmFja1R5cGVfZSB0eXBlLCBsZWZpT2JzdHJ1Y3Rpb24qIG9icywgbGVmaVVzZXJEYXRhIGRhdGEpOwotICAgICAgc3RhdGljIGludCBnZXRMZWZTdHJpbmcobGVmckNhbGxiYWNrVHlwZV9lIHR5cGUsIGNvbnN0IGNoYXIqIHN0cmluZywgbGVmaVVzZXJEYXRhIGRhdGEpOwotICAgICAgc3RhdGljIGludCBnZXRMZWZVbml0cyhsZWZyQ2FsbGJhY2tUeXBlX2UgdHlwZSwgbGVmaVVuaXRzKiB1bml0cywgbGVmaVVzZXJEYXRhIGRhdGEpOwotICAgICAgc3RhdGljIGludCBnZXRMZWZMYXllcnMobGVmckNhbGxiYWNrVHlwZV9lIHR5cGUsIGxlZmlMYXllciogbGF5ZXIsIGxlZmlVc2VyRGF0YSBkYXRhKTsKLSAgICAgIHN0YXRpYyBpbnQgZ2V0TGVmVmlhcyhsZWZyQ2FsbGJhY2tUeXBlX2UgdHlwZSwgbGVmaVZpYSogdmlhLCBsZWZpVXNlckRhdGEgZGF0YSk7Ci0gICAgICBzdGF0aWMgaW50IGdldExlZlZpYVJ1bGVzKGxlZnJDYWxsYmFja1R5cGVfZSB0eXBlLCBsZWZpVmlhUnVsZSogdmlhLCBsZWZpVXNlckRhdGEgZGF0YSk7Ci0gICAgICAKLSAgICAgIHN0YXRpYyBpbnQgZ2V0TGVmNThDb3JuZXJTcGFjaW5nKHZvaWQgKmRhdGEsIGNvbnN0IHN0ZDo6c3RyaW5nICZzSW4pOwotICAgICAgc3RhdGljIGludCBnZXRMZWY1OFNwYWNpbmdUYWJsZSh2b2lkICpkYXRhLCBmckxheWVyKiB0bXBMYXllciwgY29uc3Qgc3RkOjpzdHJpbmcgJnNJbik7Ci0gICAgICBzdGF0aWMgaW50IGdldExlZjU4U3BhY2luZ1RhYmxlX3BhcmFsbGVsUnVuTGVuZ3RoKHZvaWQgKmRhdGEsIGZyTGF5ZXIqIHRtcExheWVyLCBjb25zdCBzdGQ6OnN0cmluZyAmc0luKTsKLSAgICAgIHN0YXRpYyBpbnQgZ2V0TGVmNThTcGFjaW5nKHZvaWQgKmRhdGEsIGZyTGF5ZXIqIHRtcExheWVyLCBjb25zdCBzdGQ6OnN0cmluZyAmc0luKTsKLSAgICAgIHN0YXRpYyBpbnQgZ2V0TGVmNThTcGFjaW5nX2VuZE9mTGluZVdpdGhpbih2b2lkICpkYXRhLCBmckxheWVyKiB0bXBMYXllciwgY29uc3Qgc3RkOjpzdHJpbmcgJnNJbik7Ci0gICAgICBzdGF0aWMgaW50IGdldExlZjU4Q3V0Q2xhc3Modm9pZCAqZGF0YSwgZnJMYXllciogdG1wTGF5ZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICZzSW4pOwotICAgICAgc3RhdGljIGludCBnZXRMZWY1OEN1dFNwYWNpbmcodm9pZCAqZGF0YSwgZnJMYXllciogdG1wTGF5ZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICZzSW4pOwotICAgICAgc3RhdGljIGludCBnZXRMZWY1OEN1dFNwYWNpbmdfaGVscGVyKHZvaWQgKmRhdGEsIGZyTGF5ZXIqIHRtcExheWVyLCBjb25zdCBzdGQ6OnN0cmluZyAmc0luKTsKLSAgICAgIHN0YXRpYyBpbnQgZ2V0TGVmNThDdXRTcGFjaW5nX3BhcmFsbGVsV2l0aGluKHZvaWQgKmRhdGEsIGZyTGF5ZXIqIHRtcExheWVyLCBjb25zdCBzdGQ6OnN0cmluZyAmc0luKTsKLSAgICAgIHN0YXRpYyBpbnQgZ2V0TGVmNThDdXRTcGFjaW5nX2FkamFjZW50Q3V0cyh2b2lkICpkYXRhLCBmckxheWVyKiB0bXBMYXllciwgY29uc3Qgc3RkOjpzdHJpbmcgJnNJbik7Ci0gICAgICBzdGF0aWMgaW50IGdldExlZjU4Q3V0U3BhY2luZ19sYXllcih2b2lkICpkYXRhLCBmckxheWVyKiB0bXBMYXllciwgY29uc3Qgc3RkOjpzdHJpbmcgJnNJbik7Ci0gICAgICBzdGF0aWMgaW50IGdldExlZjU4Q3V0U3BhY2luZ1RhYmxlKHZvaWQgKmRhdGEsIGZyTGF5ZXIqIHRtcExheWVyLCBjb25zdCBzdGQ6OnN0cmluZyAmc0luKTsKLSAgICAgIHN0YXRpYyBpbnQgZ2V0TGVmNThDdXRTcGFjaW5nVGFibGVfaGVscGVyKHZvaWQgKmRhdGEsIGZyTGF5ZXIqIHRtcExheWVyLCBjb25zdCBzdGQ6OnN0cmluZyAmc0luKTsKLSAgICAgIHN0YXRpYyBpbnQgZ2V0TGVmNThDdXRTcGFjaW5nVGFibGVfb3RoZXJzKHZvaWQgKmRhdGEsIGZyTGF5ZXIqIHRtcExheWVyLCBjb25zdCBzdGQ6OnN0cmluZyAmc0luKTsKLSAgICAgIHN0YXRpYyBpbnQgZ2V0TGVmNThDdXRTcGFjaW5nVGFibGVfcHJsKHZvaWQgKmRhdGEsIGZyTGF5ZXIqIHRtcExheWVyLCBjb25zdCBzdGQ6OnN0cmluZyAmc0luLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxmckxlZjU4Q3V0U3BhY2luZ1RhYmxlQ29uc3RyYWludD4gJmNvbik7Ci0gICAgICBzdGF0aWMgaW50IGdldExlZjU4Q3V0U3BhY2luZ1RhYmxlX2RlZmF1bHQodm9pZCAqZGF0YSwgZnJMYXllciogdG1wTGF5ZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICZzSW4sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGZyTGVmNThDdXRTcGFjaW5nVGFibGVDb25zdHJhaW50PiAmY29uKTsKLSAgICAgIHN0YXRpYyBpbnQgZ2V0TGVmNThDdXRTcGFjaW5nVGFibGVfbGF5ZXIodm9pZCAqZGF0YSwgZnJMYXllciogdG1wTGF5ZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICZzSW4sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8ZnJMZWY1OEN1dFNwYWNpbmdUYWJsZUNvbnN0cmFpbnQ+ICZjb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyTGF5ZXJOdW0gJnNlY29uZExheWVyTnVtKTsKLSAgICAgIHN0YXRpYyBpbnQgZ2V0TGVmNThDdXRTcGFjaW5nVGFibGVfY3V0Q2xhc3Modm9pZCAqZGF0YSwgZnJMYXllciogdG1wTGF5ZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICZzSW4sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8ZnJMZWY1OEN1dFNwYWNpbmdUYWJsZUNvbnN0cmFpbnQ+ICZjb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzU2Vjb25kTGF5ZXIsIGZyTGF5ZXJOdW0gc2Vjb25kTGF5ZXJOdW0pOwotCi0gICAgICAvLyBwb3N0UHJvY2VzcyBmdW5jdGlvbnMKLSAgICAgIHZvaWQgYnVpbGRDTWFwKCk7Ci0gICAgICB2b2lkIGJ1aWxkR0NlbGxQYXR0ZXJucygpOwotICAgICAgdm9pZCBidWlsZEdDZWxsUGF0dGVybnNfaGVscGVyKGZyQ29vcmQgJkdDRUxMR1JJRFgsIGZyQ29vcmQgJkdDRUxMR1JJRFksIGZyQ29vcmQgJkdDRUxMT0ZGU0VUWCwgZnJDb29yZCAmR0NFTExPRkZTRVRZKTsKLSAgICAgIHZvaWQgYnVpbGRHQ2VsbFBhdHRlcm5zX2dldFdpZHRoKGZyQ29vcmQgJkdDRUxMR1JJRFgsIGZyQ29vcmQgJkdDRUxMR1JJRFkpOwotICAgICAgdm9pZCBidWlsZEdDZWxsUGF0dGVybnNfZ2V0T2Zmc2V0KGZyQ29vcmQgR0NFTExHUklEWCwgZnJDb29yZCBHQ0VMTEdSSURZLCBmckNvb3JkICZHQ0VMTE9GRlNFVFgsIGZyQ29vcmQgJkdDRUxMT0ZGU0VUWSk7Ci0gICAgICB2b2lkIGluaXREZWZhdWx0VmlhcygpOwotICAgICAgdm9pZCBpbml0RGVmYXVsdFZpYXNfTjE2KGNvbnN0IHN0ZDo6c3RyaW5nICZpbik7Ci0KLSAgICAgIC8vIGluc3RhbmNlIGFuYWx5c2lzCi0gICAgICB2b2lkIGluc3RBbmFseXNpcygpOwotCi0gICAgICAvLyBwb3N0UHJvY2Vzc0d1aWRlIGZ1bmN0aW9ucwotICAgICAgdm9pZCBnZW5HdWlkZXMoZnJOZXQqIG5ldCwgc3RkOjp2ZWN0b3I8ZnJSZWN0PiAmcmVjdHMpOwotICAgICAgdm9pZCBnZW5HdWlkZXNfbWVyZ2Uoc3RkOjp2ZWN0b3I8ZnJSZWN0PiAmcmVjdHMsIHN0ZDo6dmVjdG9yPHN0ZDo6bWFwPGZyQ29vcmQsIGJvb3N0OjppY2w6OmludGVydmFsX3NldDxmckNvb3JkPiA+ID4gJmludHZzKTsKLSAgICAgIHZvaWQgZ2VuR3VpZGVzX3NwbGl0KHN0ZDo6dmVjdG9yPGZyUmVjdD4gJnJlY3RzLCBzdGQ6OnZlY3RvcjxzdGQ6Om1hcDxmckNvb3JkLCBib29zdDo6aWNsOjppbnRlcnZhbF9zZXQ8ZnJDb29yZD4gPiA+ICZpbnR2cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiwgc3RkOjpzZXQ8ZnJCbG9ja09iamVjdCosIGZyQmxvY2tPYmplY3RDb21wPiA+ICZnQ2VsbDJQaW5NYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxmckJsb2NrT2JqZWN0Kiwgc3RkOjpzZXQ8c3RkOjpwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+ID4sIGZyQmxvY2tPYmplY3RDb21wPiAmcGluMkdDZWxsTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1JldHJ5KTsKLSAgICAgIHZvaWQgZ2VuR3VpZGVzX2dDZWxsMlBpbk1hcChmck5ldCogbmV0LCBzdGQ6Om1hcDxzdGQ6OnBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4sIHN0ZDo6c2V0PGZyQmxvY2tPYmplY3QqLCBmckJsb2NrT2JqZWN0Q29tcD4gPiAmZ0NlbGwyUGluTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPGZyQmxvY2tPYmplY3QqLCBzdGQ6OnNldDxzdGQ6OnBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4gPiwgZnJCbG9ja09iamVjdENvbXA+ICZwaW4yR0NlbGxNYXApOwotICAgICAgdm9pZCBnZW5HdWlkZXNfZ0NlbGwyVGVybU1hcChzdGQ6Om1hcDxzdGQ6OnBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4sIHN0ZDo6c2V0PGZyQmxvY2tPYmplY3QqLCBmckJsb2NrT2JqZWN0Q29tcD4gPiAmZ0NlbGwyUGluTWFwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8ZnJCbG9ja09iamVjdCosIHN0ZDo6c2V0PHN0ZDo6cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiA+LCBmckJsb2NrT2JqZWN0Q29tcD4gJnBpbjJHQ2VsbE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJUZXJtKiB0ZXJtLCBmckJsb2NrT2JqZWN0KiBvcmlnVGVybSk7Ci0gICAgICB2b2lkIGdlbkd1aWRlc19pbml0UGluMkdDZWxsTWFwKGZyTmV0KiBuZXQsIHN0ZDo6bWFwPGZyQmxvY2tPYmplY3QqLCBzdGQ6OnNldDxzdGQ6OnBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4gPiwgZnJCbG9ja09iamVjdENvbXA+ICZwaW4yR0NlbGxNYXApOwotICAgICAgdm9pZCBnZW5HdWlkZXNfYnVpbGROb2RlTWFwKHN0ZDo6bWFwPHN0ZDo6cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiwgc3RkOjpzZXQ8aW50PiA+ICZub2RlTWFwLCBpbnQgJmdDbnQsIGludCAmbkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxmclJlY3Q+ICZyZWN0cywgc3RkOjptYXA8ZnJCbG9ja09iamVjdCosIHN0ZDo6c2V0PHN0ZDo6cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiA+LCBmckJsb2NrT2JqZWN0Q29tcD4gJnBpbjJHQ2VsbE1hcCk7Ci0gICAgICBib29sIGdlbkd1aWRlc19hc3Rhcihmck5ldCAqbmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Ym9vbD4gJmFkalZpc2l0ZWQsIHN0ZDo6dmVjdG9yPGludD4gJmFkalByZXZJZHgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+LCBzdGQ6OnNldDxpbnQ+ID4gJm5vZGVNYXAsIGludCAmZ0NudCwgaW50ICZuQ250LCBib29sIGZvcmNlRmVlZFRocm91Z2gsIGJvb2wgcmV0cnkpOwotICAgICAgdm9pZCBnZW5HdWlkZXNfZmluYWwoZnJOZXQgKm5ldCwgc3RkOjp2ZWN0b3I8ZnJSZWN0PiAmcmVjdHMsIHN0ZDo6dmVjdG9yPGJvb2w+ICZhZGpWaXNpdGVkLCBzdGQ6OnZlY3RvcjxpbnQ+ICZhZGpQcmV2SWR4LCBpbnQgZ0NudCwgaW50IG5DbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxmckJsb2NrT2JqZWN0Kiwgc3RkOjpzZXQ8c3RkOjpwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+ID4sIGZyQmxvY2tPYmplY3RDb21wPiAmcGluMkdDZWxsTWFwKTsKLQotICAgICAgLy8gd3JpdGUgZ3VpZGUKLSAgICAgIHZvaWQgd3JpdGVHdWlkZUZpbGUoKTsKLSAgICB9OwotICAgIGNsYXNzIFdyaXRlciB7Ci0gICAgcHVibGljOgotICAgICAgLy8gY29uc3RydWN0b3JzCi0gICAgICAvL1dyaXRlcigpOiB0ZWNoKHN0ZDo6bWFrZV9zaGFyZWQ8ZnJUZWNoT2JqZWN0PigpKSwgZGVzaWduKHN0ZDo6bWFrZV9zaGFyZWQ8ZnJEZXNpZ24+KCkpIHt9OwotICAgICAgV3JpdGVyKGZyRGVzaWduKiBkZXNpZ25Jbik6IHRlY2goZGVzaWduSW4tPmdldFRlY2goKSksIGRlc2lnbihkZXNpZ25Jbikge30KLSAgICAgIC8vIGdldHRlcnMKLSAgICAgIGZyVGVjaE9iamVjdCogZ2V0VGVjaCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIHRlY2g7Ci0gICAgICB9Ci0gICAgICBmckRlc2lnbiogZ2V0RGVzaWduKCkgY29uc3QgewotICAgICAgICByZXR1cm4gZGVzaWduOwotICAgICAgfQotICAgICAgLy8gb3RoZXJzCi0gICAgICB2b2lkIHdyaXRlRnJvbVRBKCk7Ci0gICAgICB2b2lkIHdyaXRlRnJvbURSKGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIgPSAiIik7Ci0gICAgICBzdGQ6Om1hcDwgZnJTdHJpbmcsIHN0ZDo6bGlzdDxzdGQ6OnNoYXJlZF9wdHI8ZnJDb25uRmlnPiA+ID4gY29ubkZpZ3M7IC8vIGFsbCBjb25uRmlncyByZWFkeSB0byBkZWYKLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICBmclRlY2hPYmplY3QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlY2g7Ci0gICAgICBmckRlc2lnbiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lnbjsKLSAgICAgIC8vc3RkOjpsaXN0PCAvLyB0ZW1wIGZvciBtZXJnZSBhbmQgc3BsaXQKLSAgICAgIAotCi0gICAgICB2b2lkIGZpbGxDb25uRmlncyhib29sIGlzVEEpOwotICAgICAgdm9pZCBmaWxsQ29ubkZpZ3NfbmV0KGZyTmV0KiBuZXQsIGJvb2wgaXNUQSk7Ci0gICAgICB2b2lkIG1lcmdlU3BsaXRDb25uRmlncyhzdGQ6Omxpc3Q8c3RkOjpzaGFyZWRfcHRyPGZyQ29ubkZpZz4gPiAmY29ubkZpZ3MpOwotICAgICAgdm9pZCBzcGxpdFZpYV9oZWxwZXIoZnJMYXllck51bSBsYXllck51bSwgaW50IGlzSCwgZnJDb29yZCB0cmFja0xvYywgZnJDb29yZCB4LCBmckNvb3JkIHksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8IHN0ZDo6dmVjdG9yPCBzdGQ6Om1hcDxmckNvb3JkLCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8ZnJQYXRoU2VnPiA+ID4gPiA+ICZtZXJnZWRQYXRoU2Vncyk7Ci0gICAgICBpbnQgd3JpdGVEZWYoYm9vbCBpc1RBLCBjb25zdCBzdGQ6OnN0cmluZyAmc3RyID0gIiIpOwotICAgIH07Ci0gIH0KLX0KLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2lvL2lvX2d1aWRlLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2lvL2lvX2d1aWRlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZiNDFhZC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9pby9pb19ndWlkZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5NjkgKzAsMCBAQAotLyogQXV0aG9yczogTHV0b25nIFdhbmcgYW5kIEJhbmdxaSBYdSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotLy8jaW5jbHVkZSA8Y2hyb25vPgotI2luY2x1ZGUgImlvL2lvLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgZnI7Ci0vKiBub3RlOiBNMSBndWlkZSBzcGVjaWFsIHRyZWF0bWVudC4gc2VhcmNoICJubyBNMSBjcm9zcy1nY2VsbCByb3V0aW5nIGFsbG93ZWQiICovCi0KLXZvaWQgaW86OlBhcnNlcjo6Z2VuR3VpZGVzX21lcmdlKHZlY3RvcjxmclJlY3Q+ICZyZWN0cywgdmVjdG9yPG1hcDxmckNvb3JkLCBib29zdDo6aWNsOjppbnRlcnZhbF9zZXQ8ZnJDb29yZD4gPiA+ICZpbnR2cykgewotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLSAgLy9hdXRvICZncCA9IGRlc2lnbi0+Z2V0VG9wQmxvY2soKS0+Z2V0R0NlbGxQYXR0ZXJucygpOwotICAvL2F1dG8gJnhncCA9IGdwWzBdOwotICAvL2F1dG8gJnlncCA9IGdwWzFdOwotICAvLyB1c2UgZnJDb29yZCB0byBwcmV2ZW50IG5lZ2F0aXZlIHByb2JsZW1zCi0gIC8vZnJDb29yZCBHQ0VMTEdSSURYICAgPSB4Z3AuZ2V0U3BhY2luZygpOwotICAvL2ZyQ29vcmQgR0NFTExHUklEWSAgID0geWdwLmdldFNwYWNpbmcoKTsKLSAgLy9mckNvb3JkIEdDRUxMT0ZGU0VUWCA9IHhncC5nZXRTdGFydENvb3JkKCk7Ci0gIC8vZnJDb29yZCBHQ0VMTE9GRlNFVFkgPSB5Z3AuZ2V0U3RhcnRDb29yZCgpOwotICAvL2ZyQ29vcmQgR0NFTExDTlRYICAgID0geGdwLmdldENvdW50KCk7Ci0gIC8vZnJDb29yZCBHQ0VMTENOVFkgICAgPSB5Z3AuZ2V0Q291bnQoKTsKLQotICBmb3IgKGF1dG8gJnJlY3Q6IHJlY3RzKSB7Ci0gICAgZnJCb3ggYm94OwotICAgIHJlY3QuZ2V0QkJveChib3gpOwotICAgIC8vZnJDb29yZCB4MSA9IChib3gubG93ZXJMZWZ0KCkueCgpICAtIEdDRUxMT0ZGU0VUWCkgICAgIC8gR0NFTExHUklEWDsKLSAgICAvL2ZyQ29vcmQgeTEgPSAoYm94Lmxvd2VyTGVmdCgpLnkoKSAgLSBHQ0VMTE9GRlNFVFkpICAgICAvIEdDRUxMR1JJRFk7Ci0gICAgZnJQb2ludCBpZHg7Ci0gICAgZnJQb2ludCBwdChib3gubG93ZXJMZWZ0KCkpOwotICAgIGRlc2lnbi0+Z2V0VG9wQmxvY2soKS0+Z2V0R0NlbGxJZHgocHQsIGlkeCk7Ci0gICAgZnJDb29yZCB4MSA9IGlkeC54KCk7Ci0gICAgZnJDb29yZCB5MSA9IGlkeC55KCk7Ci0gICAgLy9mckNvb3JkIHgyID0gKGJveC51cHBlclJpZ2h0KCkueCgpIC0gR0NFTExPRkZTRVRYIC0gMSkgLyBHQ0VMTEdSSURYOwotICAgIC8vZnJDb29yZCB5MiA9IChib3gudXBwZXJSaWdodCgpLnkoKSAtIEdDRUxMT0ZGU0VUWSAtIDEpIC8gR0NFTExHUklEWTsKLSAgICBwdC5zZXQoYm94LnJpZ2h0KCkgLSAxLCBib3gudG9wKCkgLSAxKTsKLSAgICBkZXNpZ24tPmdldFRvcEJsb2NrKCktPmdldEdDZWxsSWR4KHB0LCBpZHgpOwotICAgIGZyQ29vcmQgeDIgPSBpZHgueCgpOwotICAgIGZyQ29vcmQgeTIgPSBpZHgueSgpOwotICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgIGNvdXQgPDwgIiByZWN0ICIgPDwgcmVjdCA8PCAiICIgPDwgeDEgPDwgIiAiIDw8IHkxIDw8ICIgIiA8PCB4MiA8PCAiICIgPDwgeTIgPDwgIlxuIjsKLSAgICB9Ci0gICAgYXV0byBsYXllck51bSA9IHJlY3QuZ2V0TGF5ZXJOdW0oKTsKLSAgICAvL2lmICh4MSA+IHgyIHx8IHkxID4geTIpIHsKLSAgICAvLyAgY291dCA8PCJFcnJvcjogZ2VuR3VpZGVzIHN0YXJ0ID4gZW5kIiA8PGVuZGw7Ci0gICAgLy8gIGV4aXQoMSk7Ci0gICAgLy99Ci0gICAgLy9pZiAoeDEgPj0gKGludClHQ0VMTENOVFgpIHsKLSAgICAvLyAgeDEgPSAoaW50KUdDRUxMQ05UWCAtIDE7Ci0gICAgLy99Ci0gICAgLy9pZiAoeTEgPj0gKGludClHQ0VMTENOVFkpIHsKLSAgICAvLyAgeTEgPSAoaW50KUdDRUxMQ05UWSAtIDE7Ci0gICAgLy99Ci0gICAgLy9pZiAoeDIgPj0gKGludClHQ0VMTENOVFgpIHsKLSAgICAvLyAgeDIgPSAoaW50KUdDRUxMQ05UWCAtIDE7Ci0gICAgLy99Ci0gICAgLy9pZiAoeTIgPj0gKGludClHQ0VMTENOVFkpIHsKLSAgICAvLyAgeTIgPSAoaW50KUdDRUxMQ05UWSAtIDE7Ci0gICAgLy99Ci0gICAgaWYgKHRlY2gtPmdldExheWVyKGxheWVyTnVtKS0+Z2V0RGlyKCkgPT0gZnJjSG9yelByZWZSb3V0aW5nRGlyKSB7Ci0gICAgICBmb3IgKGF1dG8gaSA9IHkxOyBpIDw9IHkyOyBpKyspIHsKLSAgICAgICAgaW50dnNbbGF5ZXJOdW1dW2ldLmluc2VydChib29zdDo6aWNsOjppbnRlcnZhbDxmckNvb3JkPjo6Y2xvc2VkKHgxLCB4MikpOwotICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgY291dCA8PCJwdXNoICIgPDxsYXllck51bSA8PCIgIiA8PGkgPDwiICIgPDx4MSA8PCIgIiA8PHgyIDw8ZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBmb3IgKGF1dG8gaSA9IHgxOyBpIDw9IHgyOyBpKyspIHsKLSAgICAgICAgaW50dnNbbGF5ZXJOdW1dW2ldLmluc2VydChib29zdDo6aWNsOjppbnRlcnZhbDxmckNvb3JkPjo6Y2xvc2VkKHkxLCB5MikpOwotICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgY291dCA8PCJwdXNoICIgPDxsYXllck51bSA8PCIgIiA8PGkgPDwiICIgPDx5MSA8PCIgIiA8PHkyIDw8ZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICAvLyB0cmFja0lkeCwgYmVnaW5JZHgsIGVuZElkeCwgbGF5ZXJOdW0KLSAgdmVjdG9yPHR1cGxlPGZyQ29vcmQsIGZyQ29vcmQsIGZyQ29vcmQsIGZyTGF5ZXJOdW0+ID4gdG91Y2hHdWlkZXM7Ci0gIC8vIGFwcGVuZCB0b3VjaGluZyBlZGdlcwotICBmb3IgKGludCBsTnVtID0gMDsgbE51bSA8IChpbnQpaW50dnMuc2l6ZSgpOyBsTnVtKyspIHsKLSAgICBhdXRvICZtID0gaW50dnNbbE51bV07Ci0gICAgaW50IHByZXZUcmFja0lkeCA9IC0yOwotICAgIGZvciAoYXV0byAmW3RyYWNrSWR4LCBpbnR2U106IG0pIHsKLSAgICAgIGlmICh0cmFja0lkeCA9PSBwcmV2VHJhY2tJZHggKyAxKSB7Ci0gICAgICAgIGF1dG8gJnByZXZJbnR2UyA9IG1bcHJldlRyYWNrSWR4XTsKLSAgICAgICAgYXV0byBuZXdJbnR2ID0gaW50dlMgJiBwcmV2SW50dlM7Ci0gICAgICAgIGZvciAoYXV0byBpdCA9IG5ld0ludHYuYmVnaW4oKTsgaXQgIT0gbmV3SW50di5lbmQoKTsgaXQrKykgewotICAgICAgICAgIGF1dG8gYmVnaW5JZHggPSBpdC0+bG93ZXIoKTsKLSAgICAgICAgICBhdXRvIGVuZElkeCAgID0gaXQtPnVwcGVyKCk7Ci0gICAgICAgICAgYm9vbCBoYXZlTFUgPSBmYWxzZTsKLSAgICAgICAgICAvLyBsb3dlciBsYXllciBpbnRlcnNlY3Rpb24KLSAgICAgICAgICBpZiAobE51bSAtIDIgPj0gMCkgewotICAgICAgICAgICAgYXV0byBuYnJMYXllck51bSA9IGxOdW0gLSAyOwotICAgICAgICAgICAgZm9yIChhdXRvIGl0MiA9IGludHZzW25ickxheWVyTnVtXS5sb3dlcl9ib3VuZChiZWdpbklkeCk7IAotICAgICAgICAgICAgICAgICAgICAgIGl0MiAhPSBpbnR2c1tuYnJMYXllck51bV0uZW5kKCkgJiYgaXQyLT5maXJzdCA8PSBlbmRJZHg7IGl0MisrKSB7Ci0gICAgICAgICAgICAgIGlmIChib29zdDo6aWNsOjpjb250YWlucyhpdDItPnNlY29uZCwgdHJhY2tJZHgpICYmCi0gICAgICAgICAgICAgICAgICBib29zdDo6aWNsOjpjb250YWlucyhpdDItPnNlY29uZCwgcHJldlRyYWNrSWR4KSkgewotICAgICAgICAgICAgICAgIGhhdmVMVSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGxOdW0gKyAyIDwgKGludClpbnR2cy5zaXplKCkgJiYgIWhhdmVMVSkgewotICAgICAgICAgICAgYXV0byBuYnJMYXllck51bSA9IGxOdW0gKyAyOwotICAgICAgICAgICAgZm9yIChhdXRvIGl0MiA9IGludHZzW25ickxheWVyTnVtXS5sb3dlcl9ib3VuZChiZWdpbklkeCk7IAotICAgICAgICAgICAgICAgICAgICAgIGl0MiAhPSBpbnR2c1tuYnJMYXllck51bV0uZW5kKCkgJiYgaXQyLT5maXJzdCA8PSBlbmRJZHg7IGl0MisrKSB7Ci0gICAgICAgICAgICAgIGlmIChib29zdDo6aWNsOjpjb250YWlucyhpdDItPnNlY29uZCwgdHJhY2tJZHgpICYmCi0gICAgICAgICAgICAgICAgICBib29zdDo6aWNsOjpjb250YWlucyhpdDItPnNlY29uZCwgcHJldlRyYWNrSWR4KSkgewotICAgICAgICAgICAgICAgIGhhdmVMVSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKCFoYXZlTFUpIHsKLSAgICAgICAgICAgIC8vIGFkZCB0b3VjaGluZyBndWlkZTsKLSAgICAgICAgICAgIC8vY291dCA8PCJmb3VuZCB0b3VjaGluZyBndWlkZSIgPDxlbmRsOwotICAgICAgICAgICAgaWYgKGxOdW0gKyAyIDwgKGludClpbnR2cy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgdG91Y2hHdWlkZXMucHVzaF9iYWNrKG1ha2VfdHVwbGUoYmVnaW5JZHgsIHByZXZUcmFja0lkeCwgdHJhY2tJZHgsIGxOdW0gKyAyKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGxOdW0gLSAyID49IDApIHsKLSAgICAgICAgICAgICAgdG91Y2hHdWlkZXMucHVzaF9iYWNrKG1ha2VfdHVwbGUoYmVnaW5JZHgsIHByZXZUcmFja0lkeCwgdHJhY2tJZHgsIGxOdW0gLSAyKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBjb3V0IDw8IkVycm9yOiBnZW5HdWlkZXNfbWVyZ2UgY2Fubm90IGZpbmQgdG91Y2hpbmcgbGF5ZXIiIDw8ZW5kbDsKLSAgICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHByZXZUcmFja0lkeCA9IHRyYWNrSWR4OwotICAgIH0KLSAgfQotCi0gIGZvciAoYXV0byAmW3RyYWNrSWR4LCBiZWdpbklkeCwgZW5kSWR4LCBsTnVtXTogdG91Y2hHdWlkZXMpIHsKLSAgICBpbnR2c1tsTnVtXVt0cmFja0lkeF0uaW5zZXJ0KGJvb3N0OjppY2w6OmludGVydmFsPGZyQ29vcmQ+OjpjbG9zZWQoYmVnaW5JZHgsIGVuZElkeCkpOwotICB9Ci0gIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICBpZiAodG91Y2hHdWlkZXMuc2l6ZSgpKSB7Ci0gICAgICBjb3V0IDw8ImZvdW5kICIgPDx0b3VjaEd1aWRlcy5zaXplKCkgPDwiIHRvdWNoaW5nIGd1aWRlcyIgPDxlbmRsOwotICAgIH0KLSAgfQotCi19Ci0KLXZvaWQgaW86OlBhcnNlcjo6Z2VuR3VpZGVzX3NwbGl0KHZlY3RvcjxmclJlY3Q+ICZyZWN0cywgdmVjdG9yPG1hcDxmckNvb3JkLCBib29zdDo6aWNsOjppbnRlcnZhbF9zZXQ8ZnJDb29yZD4gPiA+ICZpbnR2cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+LCBzZXQ8ZnJCbG9ja09iamVjdCosIGZyQmxvY2tPYmplY3RDb21wPiA+ICZnQ2VsbDJQaW5NYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8ZnJCbG9ja09iamVjdCosIHNldDxwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+ID4sIGZyQmxvY2tPYmplY3RDb21wPiAmcGluMkdDZWxsTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXRyeSkgewotCi0gIHJlY3RzLmNsZWFyKCk7Ci0gIC8vbGF5ZXJOdW0tPnRyYWNrSWR4LT5iZWdpbklkeC0+c2V0IG9mIG9iagotICB2ZWN0b3I8bWFwPGZyQ29vcmQsIG1hcDxmckNvb3JkLCBzZXQ8ZnJCbG9ja09iamVjdCosIGZyQmxvY2tPYmplY3RDb21wPiA+ID4gPiBwaW5faGVscGVyKGRlc2lnbi0+Z2V0VGVjaCgpLT5nZXRMYXllcnMoKS5zaXplKCkpOwotICBmb3IgKGF1dG8gJltwciwgb2JqU106IGdDZWxsMlBpbk1hcCkgewotICAgIGF1dG8gJnBvaW50ID0gcHIuZmlyc3Q7Ci0gICAgYXV0byAmbE51bSAgPSBwci5zZWNvbmQ7Ci0gICAgaWYgKGRlc2lnbi0+Z2V0VGVjaCgpLT5nZXRMYXllcihsTnVtKS0+Z2V0RGlyKCkgPT0gZnJjSG9yelByZWZSb3V0aW5nRGlyKSB7Ci0gICAgICBwaW5faGVscGVyW2xOdW1dW3BvaW50LnkoKV1bcG9pbnQueCgpXSA9IG9ialM7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBpbl9oZWxwZXJbbE51bV1bcG9pbnQueCgpXVtwb2ludC55KCldID0gb2JqUzsKLSAgICB9Ci0gIH0KLQotICBmb3IgKGludCBsYXllck51bSA9IDA7IGxheWVyTnVtIDwgKGludClpbnR2cy5zaXplKCk7IGxheWVyTnVtKyspIHsKLSAgICBhdXRvIGRpciA9IGRlc2lnbi0+Z2V0VGVjaCgpLT5nZXRMYXllcihsYXllck51bSktPmdldERpcigpOwotICAgIGZvciAoYXV0byAmW3RyYWNrSWR4LCBjdXJyX2ludHZzXTogaW50dnNbbGF5ZXJOdW1dKSB7Ci0gICAgICAvLyBzcGxpdCBieSBsb3dlci91cHBlciBzZWcKLSAgICAgIGZvciAoYXV0byBpdCA9IGN1cnJfaW50dnMuYmVnaW4oKTsgaXQgIT0gY3Vycl9pbnR2cy5lbmQoKTsgaXQrKykgewotICAgICAgICBzZXQ8ZnJDb29yZD4gbGluZUlkeDsKLSAgICAgICAgYXV0byBiZWdpbklkeCA9IGl0LT5sb3dlcigpOwotICAgICAgICBhdXRvIGVuZElkeCAgID0gaXQtPnVwcGVyKCk7Ci0gICAgICAgIC8vIGhhcmRjb2RlIGxheWVyTnVtID09IDAgbm90IHVzZWQgZm9yIEdSCi0gICAgICAgIGlmICghcmV0cnkgJiYgbGF5ZXJOdW0gPT0gMCkgewotICAgICAgICAgIC8vIHNwbGl0IGJ5IHBpbgotICAgICAgICAgIGlmIChwaW5faGVscGVyW2xheWVyTnVtXS5maW5kKHRyYWNrSWR4KSAhPSBwaW5faGVscGVyW2xheWVyTnVtXS5lbmQoKSkgewotICAgICAgICAgICAgYXV0byAmcGluX2hlbHBlcl9tYXAgPSBwaW5faGVscGVyW2xheWVyTnVtXVt0cmFja0lkeF07Ci0gICAgICAgICAgICBmb3IgKGF1dG8gaXQyID0gcGluX2hlbHBlcl9tYXAubG93ZXJfYm91bmQoYmVnaW5JZHgpOyAKLSAgICAgICAgICAgICAgICAgaXQyICE9IHBpbl9oZWxwZXJfbWFwLmVuZCgpICYmIGl0Mi0+Zmlyc3QgPD0gZW5kSWR4OyBpdDIrKykgewotICAgICAgICAgICAgICAvL2FkZCBwaW4yR0NlbGxtYXAKLSAgICAgICAgICAgICAgZm9yIChhdXRvIG9iajogaXQyLT5zZWNvbmQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGlyID09IGZyY0hvcnpQcmVmUm91dGluZ0RpcikgewotICAgICAgICAgICAgICAgICAgcGluMkdDZWxsTWFwW29ial0uaW5zZXJ0KG1ha2VfcGFpcihmclBvaW50KGl0Mi0+Zmlyc3QsIHRyYWNrSWR4KSwgbGF5ZXJOdW0pKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgcGluMkdDZWxsTWFwW29ial0uaW5zZXJ0KG1ha2VfcGFpcihmclBvaW50KHRyYWNrSWR4LCBpdDItPmZpcnN0KSwgbGF5ZXJOdW0pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgLy9jb3V0IDw8InBpbiBzcGxpdCIgPDxlbmRsOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBmb3IgKGludCB4ID0gYmVnaW5JZHg7IHggPD0gZW5kSWR4OyB4KyspIHsKLSAgICAgICAgICAgIGZyUmVjdCB0bXBSZWN0OwotICAgICAgICAgICAgaWYgKGRpciA9PSBmcmNIb3J6UHJlZlJvdXRpbmdEaXIpIHsKLSAgICAgICAgICAgICAgdG1wUmVjdC5zZXRCQm94KGZyQm94KHgsIHRyYWNrSWR4LCB4LCB0cmFja0lkeCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgdG1wUmVjdC5zZXRCQm94KGZyQm94KHRyYWNrSWR4LCB4LCB0cmFja0lkeCwgeCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdG1wUmVjdC5zZXRMYXllck51bShsYXllck51bSk7Ci0gICAgICAgICAgICByZWN0cy5wdXNoX2JhY2sodG1wUmVjdCk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vbGluZUlkeC5pbnNlcnQoYmVnaW5JZHgpOwotICAgICAgICAgIC8vbGluZUlkeC5pbnNlcnQoZW5kSWR4KTsKLSAgICAgICAgICAvLyBsb3dlciBsYXllciBpbnRlcnNlY3Rpb24KLSAgICAgICAgICBpZiAobGF5ZXJOdW0gLSAyID49IDApIHsKLSAgICAgICAgICAgIGF1dG8gbmJyTGF5ZXJOdW0gPSBsYXllck51bSAtIDI7Ci0gICAgICAgICAgICBmb3IgKGF1dG8gaXQyID0gaW50dnNbbmJyTGF5ZXJOdW1dLmxvd2VyX2JvdW5kKGJlZ2luSWR4KTsgCi0gICAgICAgICAgICAgICAgICAgICAgaXQyICE9IGludHZzW25ickxheWVyTnVtXS5lbmQoKSAmJiBpdDItPmZpcnN0IDw9IGVuZElkeDsgaXQyKyspIHsKLSAgICAgICAgICAgICAgaWYgKGJvb3N0OjppY2w6OmNvbnRhaW5zKGl0Mi0+c2Vjb25kLCB0cmFja0lkeCkpIHsKLSAgICAgICAgICAgICAgICBsaW5lSWR4Lmluc2VydChpdDItPmZpcnN0KTsgLy9pdDItPmZpcnN0IGlzIGludGVyc2VjdGlvbiBmckNvb3JkCi0gICAgICAgICAgICAgICAgLy9jb3V0IDw8ImZvdW5kIHNwbGl0IHBvaW50IiA8PGVuZGw7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGxheWVyTnVtICsgMiA8IChpbnQpaW50dnMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBhdXRvIG5ickxheWVyTnVtID0gbGF5ZXJOdW0gKyAyOwotICAgICAgICAgICAgZm9yIChhdXRvIGl0MiA9IGludHZzW25ickxheWVyTnVtXS5sb3dlcl9ib3VuZChiZWdpbklkeCk7IAotICAgICAgICAgICAgICAgICAgICAgIGl0MiAhPSBpbnR2c1tuYnJMYXllck51bV0uZW5kKCkgJiYgaXQyLT5maXJzdCA8PSBlbmRJZHg7IGl0MisrKSB7Ci0gICAgICAgICAgICAgIGlmIChib29zdDo6aWNsOjpjb250YWlucyhpdDItPnNlY29uZCwgdHJhY2tJZHgpKSB7Ci0gICAgICAgICAgICAgICAgbGluZUlkeC5pbnNlcnQoaXQyLT5maXJzdCk7Ci0gICAgICAgICAgICAgICAgLy9jb3V0IDw8ImZvdW5kIHNwbGl0IHBvaW50IiA8PGVuZGw7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gc3BsaXQgYnkgcGluCi0gICAgICAgICAgaWYgKHBpbl9oZWxwZXJbbGF5ZXJOdW1dLmZpbmQodHJhY2tJZHgpICE9IHBpbl9oZWxwZXJbbGF5ZXJOdW1dLmVuZCgpKSB7Ci0gICAgICAgICAgICBhdXRvICZwaW5faGVscGVyX21hcCA9IHBpbl9oZWxwZXJbbGF5ZXJOdW1dW3RyYWNrSWR4XTsKLSAgICAgICAgICAgIGZvciAoYXV0byBpdDIgPSBwaW5faGVscGVyX21hcC5sb3dlcl9ib3VuZChiZWdpbklkeCk7IAotICAgICAgICAgICAgICAgICBpdDIgIT0gcGluX2hlbHBlcl9tYXAuZW5kKCkgJiYgaXQyLT5maXJzdCA8PSBlbmRJZHg7IGl0MisrKSB7Ci0gICAgICAgICAgICAgIGxpbmVJZHguaW5zZXJ0KGl0Mi0+Zmlyc3QpOwotICAgICAgICAgICAgICAvL2FkZCBwaW4yR0NlbGxtYXAKLSAgICAgICAgICAgICAgZm9yIChhdXRvIG9iajogaXQyLT5zZWNvbmQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGlyID09IGZyY0hvcnpQcmVmUm91dGluZ0RpcikgewotICAgICAgICAgICAgICAgICAgcGluMkdDZWxsTWFwW29ial0uaW5zZXJ0KG1ha2VfcGFpcihmclBvaW50KGl0Mi0+Zmlyc3QsIHRyYWNrSWR4KSwgbGF5ZXJOdW0pKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgcGluMkdDZWxsTWFwW29ial0uaW5zZXJ0KG1ha2VfcGFpcihmclBvaW50KHRyYWNrSWR4LCBpdDItPmZpcnN0KSwgbGF5ZXJOdW0pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgLy9jb3V0IDw8InBpbiBzcGxpdCIgPDxlbmRsOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBhZGQgcmVjdAotICAgICAgICAgIGlmIChsaW5lSWR4LmVtcHR5KCkpIHsKLSAgICAgICAgICAgIGNvdXQgPDwiRXJyb3I6IGdlbkd1aWRlc19zcGxpdCBsaW5lSWR4IGlzIGVtcHR5IiA8PGVuZGw7Ci0gICAgICAgICAgICBleGl0KDEpOwotICAgICAgICAgIH0gZWxzZSBpZiAobGluZUlkeC5zaXplKCkgPT0gMSkgewotICAgICAgICAgICAgYXV0byB4ID0gKihsaW5lSWR4LmJlZ2luKCkpOwotICAgICAgICAgICAgZnJSZWN0IHRtcFJlY3Q7Ci0gICAgICAgICAgICBpZiAoZGlyID09IGZyY0hvcnpQcmVmUm91dGluZ0RpcikgewotICAgICAgICAgICAgICB0bXBSZWN0LnNldEJCb3goZnJCb3goeCwgdHJhY2tJZHgsIHgsIHRyYWNrSWR4KSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICB0bXBSZWN0LnNldEJCb3goZnJCb3godHJhY2tJZHgsIHgsIHRyYWNrSWR4LCB4KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0bXBSZWN0LnNldExheWVyTnVtKGxheWVyTnVtKTsKLSAgICAgICAgICAgIHJlY3RzLnB1c2hfYmFjayh0bXBSZWN0KTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXV0byBwcmV2SXQgPSBsaW5lSWR4LmJlZ2luKCk7Ci0gICAgICAgICAgICBmb3IgKGF1dG8gY3Vyckl0ID0gKCsrKGxpbmVJZHguYmVnaW4oKSkpOyBjdXJySXQgIT0gbGluZUlkeC5lbmQoKTsgY3Vyckl0KyspIHsKLSAgICAgICAgICAgICAgZnJSZWN0IHRtcFJlY3Q7Ci0gICAgICAgICAgICAgIGlmIChkaXIgPT0gZnJjSG9yelByZWZSb3V0aW5nRGlyKSB7Ci0gICAgICAgICAgICAgICAgdG1wUmVjdC5zZXRCQm94KGZyQm94KCpwcmV2SXQsIHRyYWNrSWR4LCAqY3Vyckl0LCB0cmFja0lkeCkpOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRtcFJlY3Quc2V0QkJveChmckJveCh0cmFja0lkeCwgKnByZXZJdCwgdHJhY2tJZHgsICpjdXJySXQpKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB0bXBSZWN0LnNldExheWVyTnVtKGxheWVyTnVtKTsKLSAgICAgICAgICAgICAgcHJldkl0ID0gY3Vyckl0OwotICAgICAgICAgICAgICByZWN0cy5wdXNoX2JhY2sodG1wUmVjdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJlY3RzLnNocmlua190b19maXQoKTsKLX0KLQotCi12b2lkIGlvOjpQYXJzZXI6Omdlbkd1aWRlc19nQ2VsbDJUZXJtTWFwKG1hcDxwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+LCBzZXQ8ZnJCbG9ja09iamVjdCosIGZyQmxvY2tPYmplY3RDb21wPiA+ICZnQ2VsbDJQaW5NYXAsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8ZnJCbG9ja09iamVjdCosIHNldDxwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+ID4sIGZyQmxvY2tPYmplY3RDb21wPiAmcGluMkdDZWxsTWFwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJUZXJtKiB0ZXJtLCBmckJsb2NrT2JqZWN0KiBvcmlnVGVybSkgewotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgLy9hdXRvICZncCA9IGRlc2lnbi0+Z2V0VG9wQmxvY2soKS0+Z2V0R0NlbGxQYXR0ZXJucygpOwotICAvL2F1dG8gJnhncCA9IGdwWzBdOwotICAvL2F1dG8gJnlncCA9IGdwWzFdOwotICAvLyBmckNvb3JkIHRvIHByZXZlbnQgbmVnYXRpdmUgcHJvYmxlbXMKLSAgLy9mckNvb3JkIEdDRUxMR1JJRFggICA9IHhncC5nZXRTcGFjaW5nKCk7Ci0gIC8vZnJDb29yZCBHQ0VMTEdSSURZICAgPSB5Z3AuZ2V0U3BhY2luZygpOwotICAvL2ZyQ29vcmQgR0NFTExPRkZTRVRYID0geGdwLmdldFN0YXJ0Q29vcmQoKTsKLSAgLy9mckNvb3JkIEdDRUxMT0ZGU0VUWSA9IHlncC5nZXRTdGFydENvb3JkKCk7Ci0gIC8vZnJDb29yZCBHQ0VMTENOVFggICAgPSB4Z3AuZ2V0Q291bnQoKTsKLSAgLy9mckNvb3JkIEdDRUxMQ05UWSAgICA9IHlncC5nZXRDb3VudCgpOwotCi0gIGZvciAoYXV0byAmdVBpbjogdGVybS0+Z2V0UGlucygpKSB7Ci0gICAgZm9yIChhdXRvICZ1RmlnOiB1UGluLT5nZXRGaWdzKCkpIHsKLSAgICAgIGF1dG8gZmlnID0gdUZpZy5nZXQoKTsKLSAgICAgIGlmIChmaWctPnR5cGVJZCgpID09IGZyY1JlY3QpIHsKLSAgICAgICAgYXV0byBzaGFwZSA9IHN0YXRpY19jYXN0PGZyUmVjdCo+KGZpZyk7Ci0gICAgICAgIGF1dG8gbE51bSAgPSBzaGFwZS0+Z2V0TGF5ZXJOdW0oKTsKLSAgICAgICAgZnJCb3ggYm94OwotICAgICAgICBzaGFwZS0+Z2V0QkJveChib3gpOwotICAgICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgICAgY291dCA8PCIgIGJveCAiIDw8Ym94IDw8ZW5kbDsKLSAgICAgICAgfQotICAgICAgICAvL2ZyQ29vcmQgeDEgPSAoYm94Lmxvd2VyTGVmdCgpLngoKSAtIDEgIC0gR0NFTExPRkZTRVRYKSAvIEdDRUxMR1JJRFg7Ci0gICAgICAgIC8vZnJDb29yZCB5MSA9IChib3gubG93ZXJMZWZ0KCkueSgpIC0gMSAgLSBHQ0VMTE9GRlNFVFkpIC8gR0NFTExHUklEWTsKLSAgICAgICAgZnJQb2ludCBpZHg7Ci0gICAgICAgIGZyUG9pbnQgcHQoYm94LmxlZnQoKSAtIDEsIGJveC5ib3R0b20oKSAtIDEpOwotICAgICAgICBkZXNpZ24tPmdldFRvcEJsb2NrKCktPmdldEdDZWxsSWR4KHB0LCBpZHgpOwotICAgICAgICBmckNvb3JkIHgxID0gaWR4LngoKTsKLSAgICAgICAgZnJDb29yZCB5MSA9IGlkeC55KCk7Ci0gICAgICAgIC8vZnJDb29yZCB4MiA9IChib3gudXBwZXJSaWdodCgpLngoKSAgICAgLSBHQ0VMTE9GRlNFVFgpIC8gR0NFTExHUklEWDsKLSAgICAgICAgLy9mckNvb3JkIHkyID0gKGJveC51cHBlclJpZ2h0KCkueSgpICAgICAtIEdDRUxMT0ZGU0VUWSkgLyBHQ0VMTEdSSURZOwotICAgICAgICBwdC5zZXQoYm94LnVwcGVyUmlnaHQoKSk7Ci0gICAgICAgIGRlc2lnbi0+Z2V0VG9wQmxvY2soKS0+Z2V0R0NlbGxJZHgocHQsIGlkeCk7Ci0gICAgICAgIGZyQ29vcmQgeDIgPSBpZHgueCgpOwotICAgICAgICBmckNvb3JkIHkyID0gaWR4LnkoKTsKLSAgICAgICAgLy8gaXNwZDE4X3Rlc3Q0IGFuZCBpc3BkMThfdGVzdDUgaGF2ZSB6ZXJvIG92ZXJsYXAgZ3VpZGUKLSAgICAgICAgLy8gZXhjbHVkZXMgZG91YmxlLXplcm8gb3ZlcmxhcCBhcmVhIG9uIHRoZSB1cHBlci1yaWdodCBjb3JuZXIgZHVlIHRvIGluaXREUiByZXF1aXJlbWVudHMKLSAgICAgICAgYm9vbCBjb25kaXRpb24yID0gZmFsc2U7IC8vIHVwcGVyIHJpZ2h0IGNvcm5lciBoYXMgemVyby1sZW5ndGggb3ZlcmxhcHBlZCB3aXRoIGdjZWxsCi0gICAgICAgIGZyQm94IGdjZWxsQm94OwotICAgICAgICBmclBvaW50IHRtcElkeDsKLSAgICAgICAgZGVzaWduLT5nZXRUb3BCbG9jaygpLT5nZXRHQ2VsbElkeChib3gubG93ZXJMZWZ0KCksIHRtcElkeCk7Ci0gICAgICAgIGRlc2lnbi0+Z2V0VG9wQmxvY2soKS0+Z2V0R0NlbGxCb3godG1wSWR4LCBnY2VsbEJveCk7Ci0gICAgICAgIGlmIChib3gubG93ZXJMZWZ0KCkgPT0gZ2NlbGxCb3gubG93ZXJMZWZ0KCkpIHsKLSAgICAgICAgICBjb25kaXRpb24yID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAvL2lmICgoYm94Lmxvd2VyTGVmdCgpLngoKSA9PSAoeDEgKyAxKSAqIChpbnQpR0NFTExHUklEWCArIChpbnQpR0NFTExPRkZTRVRYKSAmJgotICAgICAgICAvLyAgICAoYm94Lmxvd2VyTGVmdCgpLnkoKSA9PSAoeTEgKyAxKSAqIChpbnQpR0NFTExHUklEWSArIChpbnQpR0NFTExPRkZTRVRZKSkgewotICAgICAgICAvLyAgY29uZGl0aW9uMiA9IHRydWU7Ci0gICAgICAgIC8vfQotICAgICAgICAvL2lmICh4MSA8IDApIHsKLSAgICAgICAgLy8gIGNvdXQgPDwiV2FybmluZzogZ2VuR3VpZGVzIHgxIDwgMCwgYXV0b21hdGljYWxseSBzZXQgdG8gMCIgPDxlbmRsOwotICAgICAgICAvLyAgLy9leGl0KDEpOwotICAgICAgICAvLyAgeDEgPSAwOwotICAgICAgICAvL30KLSAgICAgICAgLy9pZiAoeTEgPCAwKSB7Ci0gICAgICAgIC8vICBjb3V0IDw8Ildhcm5pbmc6IGdlbkd1aWRlcyB5MSA8IDAsIGF1dG9tYXRpY2FsbHkgc2V0IHRvIDAiIDw8ZW5kbDsKLSAgICAgICAgLy8gIC8vZXhpdCgxKTsKLSAgICAgICAgLy8gIHkxID0gMDsKLSAgICAgICAgLy99Ci0gICAgICAgIC8vaWYgKHgxID4geDIgfHwgeTEgPiB5MikgewotICAgICAgICAvLyAgY291dCA8PCJFcnJvcjogZ2VuR3VpZGVzX2dDZWxsMlRlcm1NYXAgc3RhcnQgPiBlbmQiIDw8ZW5kbDsKLSAgICAgICAgLy8gIGNvdXQgPDwiICB4MS94MiwgeTEveTIgPSAiIDw8eDEgPDwiICIgPDx4MiA8PCIgIiA8PHkxIDw8IiAiIDw8eTIgPDxlbmRsOwotICAgICAgICAvLyAgZXhpdCgxKTsKLSAgICAgICAgLy99Ci0gICAgICAgIC8vaWYgKHgxID49IChpbnQpR0NFTExDTlRYKSB7Ci0gICAgICAgIC8vICB4MSA9IEdDRUxMQ05UWCAtIDE7Ci0gICAgICAgIC8vfQotICAgICAgICAvL2lmICh4MiA+PSAoaW50KUdDRUxMQ05UWCkgewotICAgICAgICAvLyAgLy9jb3V0IDw8Ildhcm5pbmc6IGdlbkd1aWRlcyB4MiA+PSBHQ0VMTENOVFgsIGF1dG9tYXRpY2FsbHkgc2V0IHRvIEdDRUxMQ05UWCIgPDxlbmRsOwotICAgICAgICAvLyAgLy9jb3V0IDw8IiAgYmJveCAiIDw8Ym94IDw8IiAiIDw8bE51bSA8PGVuZGw7Ci0gICAgICAgIC8vICAvL2V4aXQoMSk7Ci0gICAgICAgIC8vICB4MiA9IEdDRUxMQ05UWCAtIDE7Ci0gICAgICAgIC8vfQotICAgICAgICAvL2lmICh5MSA+PSAoaW50KUdDRUxMQ05UWSkgewotICAgICAgICAvLyAgeTEgPSBHQ0VMTENOVFkgLSAxOwotICAgICAgICAvL30KLSAgICAgICAgLy9pZiAoeTIgPj0gKGludClHQ0VMTENOVFkpIHsKLSAgICAgICAgLy8gIC8vY291dCA8PCJXYXJuaW5nOiBnZW5HdWlkZXMgeTIgPj0gR0NFTExDTlRZLCBhdXRvbWF0aWNhbGx5IHNldCB0byBHQ0VMTENOVFkiIDw8ZW5kbDsKLSAgICAgICAgLy8gIC8vY291dCA8PCIgIGJib3ggIiA8PGJveCA8PCIgIiA8PGxOdW0gPDxlbmRsOwotICAgICAgICAvLyAgLy9leGl0KDEpOwotICAgICAgICAvLyAgeTIgPSBHQ0VMTENOVFkgLSAxOwotICAgICAgICAvL30KLSAgICAgICAgZm9yIChpbnQgeCA9IHgxOyB4IDw9IHgyOyB4KyspIHsKLSAgICAgICAgICBmb3IgKGludCB5ID0geTE7IHkgPD0geTI7IHkrKykgewotICAgICAgICAgICAgaWYgKGNvbmRpdGlvbjIgJiYgeCA9PSB0bXBJZHgueCgpIC0gMSAmJiB5ID09IHRtcElkeC55KCkgLSAxKSB7Ci0gICAgICAgICAgICAgIGlmIChWRVJCT1NFID4gMCkgewotICAgICAgICAgICAgICAgIGNvdXQgPDwiV2FybmluZzogZ2VuR3VpZGVzX2dDZWxsMlRlcm1NYXAgYXZvaWQgY29uZGl0aW9uMiwgbWF5IHJlc3VsdCBpbiBndWlkZSBvcGVuIiA8PGVuZGw7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGdDZWxsMlBpbk1hcFttYWtlX3BhaXIoZnJQb2ludCh4LCB5KSwgbE51bSldLmluc2VydChvcmlnVGVybSk7Ci0gICAgICAgICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICAgICAgICBjb3V0IDw8IiAoeCx5LGxOdW0pID0gKCIgPDx4IDw8IiwgIiA8PHkgPDwiLCAiIDw8bE51bSA8PCIpIiA8PGVuZGw7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vcGluMkdDZWxsTWFwW29yaWdUZXJtXS5pbnNlcnQobWFrZV9wYWlyKGZyUG9pbnQoeCx5KSwgbE51bSkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogZ2VuR3VpZGVzX2dDZWxsMlRlcm1NYXAgdW5zdXBvcHJ0ZWQgcGluZmlnIiA8PGVuZGw7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgaW86OlBhcnNlcjo6Z2VuR3VpZGVzX2dDZWxsMlBpbk1hcChmck5ldCogbmV0LCBtYXA8cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiwgc2V0PGZyQmxvY2tPYmplY3QqLCBmckJsb2NrT2JqZWN0Q29tcD4gPiAmZ0NlbGwyUGluTWFwLAotICAgIG1hcDxmckJsb2NrT2JqZWN0Kiwgc2V0PHBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4gPiwgZnJCbG9ja09iamVjdENvbXA+ICZwaW4yR0NlbGxNYXApIHsKLSAgYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIGZvciAoYXV0byAmaW5zdFRlcm06IG5ldC0+Z2V0SW5zdFRlcm1zKCkpIHsKLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBjb3V0IDw8Imluc3RUZXJtICIgPDxpbnN0VGVybS0+Z2V0SW5zdCgpLT5nZXROYW1lKCkgPDwiLyIgPDxpbnN0VGVybS0+Z2V0VGVybSgpLT5nZXROYW1lKCkgPDxlbmRsOwotICAgIH0KLSAgICAvL2ZyVHJhbnNmb3JtIHhmb3JtOwotICAgIC8vaW5zdFRlcm0tPmdldEluc3QoKS0+Z2V0VHJhbnNmb3JtKHhmb3JtKTsKLSAgICAvL2ZyQm94ICAgbWJveDsKLSAgICAvL2luc3RUZXJtLT5nZXRJbnN0KCktPmdldFJlZkJsb2NrKCktPmdldEJvdW5kYXJ5QkJveChtYm94KTsKLSAgICAvL2ZyUG9pbnQgc2l6ZShtYm94LnJpZ2h0KCksIG1ib3gudG9wKCkpOwotICAgIC8veGZvcm0udXBkYXRlWGZvcm0oc2l6ZSk7Ci0gICAgZnJUcmFuc2Zvcm0geGZvcm07Ci0gICAgaW5zdFRlcm0tPmdldEluc3QoKS0+Z2V0VXBkYXRlZFhmb3JtKHhmb3JtKTsKLSAgICBhdXRvIG9yaWdUZXJtID0gaW5zdFRlcm0tPmdldFRlcm0oKTsKLSAgICBhdXRvIHVUZXJtID0gbWFrZV91bmlxdWU8ZnJUZXJtPigqb3JpZ1Rlcm0sIHhmb3JtKTsKLSAgICBhdXRvIHRlcm0gPSB1VGVybS5nZXQoKTsKLSAgICBnZW5HdWlkZXNfZ0NlbGwyVGVybU1hcChnQ2VsbDJQaW5NYXAsIHBpbjJHQ2VsbE1hcCwgdGVybSwgaW5zdFRlcm0pOwotICAgIC8vaWYgKHBpbjJHQ2VsbE1hcC5maW5kKG9yaWdUZXJtKSA9PSBwaW4yR0NlbGxNYXAuZW5kKCkgfHwgcGluMkdDZWxsTWFwW29yaWdUZXJtXS5lbXB0eSgpKSB7Ci0gICAgLy8gIGNvdXQgPDwiRXJyb3I6IGdjZWxsIG5vdCBjb3ZlciAiIDw8aW5zdFRlcm0tPmdldEluc3QoKS0+Z2V0TmFtZSgpIDw8Ii8iIDw8b3JpZ1Rlcm0tPmdldE5hbWUoKSA8PGVuZGw7Ci0gICAgLy8gIGV4aXQoMSk7Ci0gICAgLy99Ci0gIH0KLSAgZm9yIChhdXRvICZ0ZXJtOiBuZXQtPmdldFRlcm1zKCkpIHsKLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBjb3V0IDw8IiAgICB0ZXJtIFBJTi8iIDw8dGVybS0+Z2V0TmFtZSgpIDw8ZW5kbDsKLSAgICB9Ci0gICAgZ2VuR3VpZGVzX2dDZWxsMlRlcm1NYXAoZ0NlbGwyUGluTWFwLCBwaW4yR0NlbGxNYXAsIHRlcm0sIHRlcm0pOwotICAgIC8vaWYgKHBpbjJHQ2VsbE1hcC5maW5kKHRlcm0pID09IHBpbjJHQ2VsbE1hcC5lbmQoKSB8fCBwaW4yR0NlbGxNYXBbdGVybV0uZW1wdHkoKSkgewotICAgIC8vICBjb3V0IDw8IkVycm9yOiBnY2VsbCBub3QgY292ZXIgUElOLyIgPDx0ZXJtLT5nZXROYW1lKCkgPDxlbmRsOwotICAgIC8vICBleGl0KDEpOwotICAgIC8vfQotICB9Ci19Ci0KLXZvaWQgaW86OlBhcnNlcjo6Z2VuR3VpZGVzX2luaXRQaW4yR0NlbGxNYXAoZnJOZXQqIG5ldCwgc3RkOjptYXA8ZnJCbG9ja09iamVjdCosIHN0ZDo6c2V0PHN0ZDo6cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiA+LCBmckJsb2NrT2JqZWN0Q29tcD4gJnBpbjJHQ2VsbE1hcCkgewotICBmb3IgKGF1dG8gJmluc3RUZXJtOiBuZXQtPmdldEluc3RUZXJtcygpKSB7Ci0gICAgcGluMkdDZWxsTWFwW2luc3RUZXJtXTsKLSAgfQotICBmb3IgKGF1dG8gJnRlcm06IG5ldC0+Z2V0VGVybXMoKSkgewotICAgIHBpbjJHQ2VsbE1hcFt0ZXJtXTsKLSAgfQotfQotCi12b2lkIGlvOjpQYXJzZXI6Omdlbkd1aWRlcyhmck5ldCAqbmV0LCB2ZWN0b3I8ZnJSZWN0PiAmcmVjdHMpIHsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIC8vY291dCA8PCJuZXQgIiA8PG5ldC0+Z2V0TmFtZSgpIDw8ZW5kbCA8PGZsdXNoOwotICB2ZWN0b3I8bWFwPGZyQ29vcmQsIGJvb3N0OjppY2w6OmludGVydmFsX3NldDxmckNvb3JkPiA+ID4gaW50dnModGVjaC0+Z2V0TGF5ZXJzKCkuc2l6ZSgpKTsKLSAgZ2VuR3VpZGVzX21lcmdlKHJlY3RzLCBpbnR2cyk7IC8vIG1lcmdlIGFuZCBhZGQgdG91Y2hpbmcgZ3VpZGUKLSAgLy9jb3V0IDw8Im1lcmdlIGRvbmUiIDw8ZW5kbCA8PGZsdXNoOwotICAKLSAgLy8gZ2NlbGwgdG8gcGluIG1hcAotICBtYXA8cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiwgc2V0PGZyQmxvY2tPYmplY3QqLCBmckJsb2NrT2JqZWN0Q29tcD4gPiBnQ2VsbDJQaW5NYXA7Ci0gIG1hcDxmckJsb2NrT2JqZWN0Kiwgc2V0PHBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4gPiwgZnJCbG9ja09iamVjdENvbXA+IHBpbjJHQ2VsbE1hcDsgCi0gIGdlbkd1aWRlc19nQ2VsbDJQaW5NYXAobmV0LCBnQ2VsbDJQaW5NYXAsIHBpbjJHQ2VsbE1hcCk7Ci0gIC8vY291dCA8PCJnY2VsbDJwaW4gbWFwIGRvbmUiIDw8ZW5kbCA8PGZsdXNoOwotICBnZW5HdWlkZXNfaW5pdFBpbjJHQ2VsbE1hcChuZXQsIHBpbjJHQ2VsbE1hcCk7Ci0gIC8vY291dCA8PCJpbml0IHBpbjJnY2VsbCBkb25lIiA8PGVuZGwgPDxmbHVzaDsKLQotICBib29sIHJldHJ5ID0gZmFsc2U7Ci0gIHdoaWxlKDEpIHsKLSAgICBnZW5HdWlkZXNfc3BsaXQocmVjdHMsIGludHZzLCBnQ2VsbDJQaW5NYXAsIHBpbjJHQ2VsbE1hcCwgcmV0cnkpOyAvL3NwbGl0IG9uIExVIGludGVyc2VjdGluZyBndWlkZXMgYW5kIHBpbnMKLSAgICAvL2NvdXQgPDwic3BsaXQgZG9uZSIgPDxlbmRsIDw8Zmx1c2g7Ci0KLSAgICAvLyBmaWx0ZXIgcGluMkdDZWxsTWFwIHdpdGggYXBzCi0gICAgCi0gICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgZm9yIChhdXRvICZbZ2NlbGwsIG9ialNdOiBnQ2VsbDJQaW5NYXApIHsKLSAgICAgICAgY291dCA8PCJnY2VsbCAoIiA8PGdjZWxsLmZpcnN0LngoKSA8PCIsICIgPDxnY2VsbC5maXJzdC55KCkgPDwiKSAiIDw8Z2NlbGwuc2Vjb25kIDw8ZW5kbDsKLSAgICAgICAgZm9yIChhdXRvIG9iajogb2JqUykgewotICAgICAgICAgIGlmIChvYmotPnR5cGVJZCgpID09IGZyY0luc3RUZXJtKSB7Ci0gICAgICAgICAgICBhdXRvIHB0ciA9IHN0YXRpY19jYXN0PGZySW5zdFRlcm0qPihvYmopOwotICAgICAgICAgICAgY291dCA8PCIgIHBpbiAiIDw8cHRyLT5nZXRJbnN0KCktPmdldE5hbWUoKSA8PCIvIiA8PHB0ci0+Z2V0VGVybSgpLT5nZXROYW1lKCkgPDxlbmRsOyAKLSAgICAgICAgICB9IGVsc2UgaWYgKG9iai0+dHlwZUlkKCkgPT0gZnJjVGVybSkgewotICAgICAgICAgICAgYXV0byBwdHIgPSBzdGF0aWNfY2FzdDxmclRlcm0qPihvYmopOwotICAgICAgICAgICAgY291dCA8PCIgIHBpbiBQSU4vIiA8PHB0ci0+Z2V0TmFtZSgpIDw8ZW5kbDsgCi0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvdXQgPDwiRXJyb3I6IGdlbkd1aWRlcyB1bmtub3duIHR5cGUiIDw8ZW5kbDsgCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBmb3IgKGF1dG8gJltvYmosIGxvY1NdOiBwaW4yR0NlbGxNYXApIHsKLSAgICAgICAgaWYgKG9iai0+dHlwZUlkKCkgPT0gZnJjSW5zdFRlcm0pIHsKLSAgICAgICAgICBhdXRvIHB0ciA9IHN0YXRpY19jYXN0PGZySW5zdFRlcm0qPihvYmopOwotICAgICAgICAgIGNvdXQgPDwicGluICIgPDxwdHItPmdldEluc3QoKS0+Z2V0TmFtZSgpIDw8Ii8iIDw8cHRyLT5nZXRUZXJtKCktPmdldE5hbWUoKSA8PGVuZGw7IAotICAgICAgICB9IGVsc2UgaWYgKG9iai0+dHlwZUlkKCkgPT0gZnJjVGVybSkgewotICAgICAgICAgIGF1dG8gcHRyID0gc3RhdGljX2Nhc3Q8ZnJUZXJtKj4ob2JqKTsKLSAgICAgICAgICBjb3V0IDw8InBpbiBQSU4vIiA8PHB0ci0+Z2V0TmFtZSgpIDw8ZW5kbDsgCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgY291dCA8PCJFcnJvcjogZ2VuR3VpZGVzIHVua25vd24gdHlwZSIgPDxlbmRsOyAKLSAgICAgICAgfQotICAgICAgICBmb3IgKGF1dG8gJltwdCwgbE51bV06IGxvY1MpIHsKLSAgICAgICAgICBjb3V0IDw8IiAgZ2NlbGwgKCIgPDxwdC54KCkgPDwiLCAiIDw8cHQueSgpIDw8IikgIiA8PGxOdW0gPDxlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpbnQgaSA9IDA7Ci0gICAgICBmb3IgKGF1dG8gJnJlY3Q6IHJlY3RzKSB7Ci0gICAgICAgIGZyQm94IGJveDsKLSAgICAgICAgcmVjdC5nZXRCQm94KGJveCk7Ci0gICAgICAgIGNvdXQgPDwiZ3VpZGUgbXMgIiA8PGkgPDwiICIgPDxib3ggPDwiICIgPDxkZXNpZ24tPmdldFRlY2goKS0+Z2V0TGF5ZXIocmVjdC5nZXRMYXllck51bSgpKS0+Z2V0TmFtZSgpIDw8ZW5kbDsKLSAgICAgICAgaSsrOwotICAgICAgfQotICAgIH0KLSAgICAKLQotICAgIGlmIChwaW4yR0NlbGxNYXAuZW1wdHkoKSkgewotICAgICAgY291dCA8PCJFcnJvcjogZ2VuR3VpZGVzIGVtcHR5IHBpbjJHQ2VsbE1hcCIgPDxlbmRsOyAKLSAgICAgIGNvdXQgPDwiIGdjZWxsMnBpbi5zaXplKCkgPSAiIDw8Z0NlbGwyUGluTWFwLnNpemUoKSA8PGVuZGw7Ci0gICAgfQotICAgIGZvciAoYXV0byAmW29iaiwgbG9jU106IHBpbjJHQ2VsbE1hcCkgewotICAgICAgaWYgKGxvY1MuZW1wdHkoKSkgewotICAgICAgICBpZiAob2JqLT50eXBlSWQoKSA9PSBmcmNJbnN0VGVybSkgewotICAgICAgICAgIGF1dG8gcHRyID0gc3RhdGljX2Nhc3Q8ZnJJbnN0VGVybSo+KG9iaik7Ci0gICAgICAgICAgY291dCA8PCJFcnJvcjogcGluICIgPDxwdHItPmdldEluc3QoKS0+Z2V0TmFtZSgpIDw8Ii8iIDw8cHRyLT5nZXRUZXJtKCktPmdldE5hbWUoKSA8PCIgbm90IGNvdmVyZWQgYnkgZ3VpZGUiIDw8ZW5kbDsgCi0gICAgICAgIH0gZWxzZSBpZiAob2JqLT50eXBlSWQoKSA9PSBmcmNUZXJtKSB7Ci0gICAgICAgICAgYXV0byBwdHIgPSBzdGF0aWNfY2FzdDxmclRlcm0qPihvYmopOwotICAgICAgICAgIGNvdXQgPDwiRXJyb3I6IHBpbiBQSU4vIiA8PHB0ci0+Z2V0TmFtZSgpIDw8IiBub3QgY292ZXJlZCBieSBndWlkZSIgPDxlbmRsOyAKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBjb3V0IDw8IkVycm9yOiBnZW5HdWlkZXMgdW5rbm93biB0eXBlIiA8PGVuZGw7IAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gc3RlaW5lciAoaS5lLiwgZ2NlbGwgZW5kIGFuZCBwaW4gZ2NlbGwgaWR4KSB0byBndWlkZSBpZHggKHBpbiBpZHgpCi0gICAgbWFwPHBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4sIHNldDxpbnQ+ID4gbm9kZU1hcDsKLSAgICBpbnQgZ0NudCA9IDA7Ci0gICAgaW50IG5DbnQgPSAwOwotICAgIGdlbkd1aWRlc19idWlsZE5vZGVNYXAobm9kZU1hcCwgZ0NudCwgbkNudCwgcmVjdHMsIHBpbjJHQ2VsbE1hcCk7Ci0gICAgLy9jb3V0IDw8ImJ1aWxkIG5vZGUgbWFwIGRvbmUiIDw8ZW5kbCA8PGZsdXNoOwotCi0gICAgdmVjdG9yPGJvb2w+IGFkalZpc2l0ZWQ7Ci0gICAgdmVjdG9yPGludD4gIGFkalByZXZJZHg7Ci0gICAgaWYgKGdlbkd1aWRlc19hc3RhcihuZXQsIGFkalZpc2l0ZWQsIGFkalByZXZJZHgsIG5vZGVNYXAsIGdDbnQsIG5DbnQsIGZhbHNlLCByZXRyeSkpIHsKLSAgICAgIC8vY291dCA8PCJhc3RhciBkb25lIiA8PGVuZGwgPDxmbHVzaDsKLSAgICAgIGdlbkd1aWRlc19maW5hbChuZXQsIHJlY3RzLCBhZGpWaXNpdGVkLCBhZGpQcmV2SWR4LCBnQ250LCBuQ250LCBwaW4yR0NlbGxNYXApOwotICAgICAgYnJlYWs7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChyZXRyeSkgewotICAgICAgICBpZiAoIUFMTE9XX1BJTl9BU19GRUVEVEhST1VHSCkgewotICAgICAgICAgIGlmIChnZW5HdWlkZXNfYXN0YXIobmV0LCBhZGpWaXNpdGVkLCBhZGpQcmV2SWR4LCBub2RlTWFwLCBnQ250LCBuQ250LCB0cnVlLCByZXRyeSkpIHsKLSAgICAgICAgICAgIGdlbkd1aWRlc19maW5hbChuZXQsIHJlY3RzLCBhZGpWaXNpdGVkLCBhZGpQcmV2SWR4LCBnQ250LCBuQ250LCBwaW4yR0NlbGxNYXApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvdXQgPDwiRXJyb3I6IGNyaXRpY2FsIGVycm9yIGd1aWRlIG5vdCBjb25uZWN0ZWQsIGV4aXQgbm93IDEhIiA8PGVuZGw7Ci0gICAgICAgICAgICBleGl0KDEpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBjb3V0IDw8IkVycm9yOiBjcml0aWNhbCBlcnJvciBndWlkZSBub3QgY29ubmVjdGVkLCBleGl0IG5vdyAyISIgPDxlbmRsOwotICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHJ5ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy9idWlsZCBndWlkZQotICAgIC8vbWFwPGludCwgaW50PiBwaW5HdWlkZVJlc2lkZW5jeTsKLSAgICAvL2dlbkd1aWRlc19maW5hbChuZXQsIHJlY3RzLCBhZGpWaXNpdGVkLCBhZGpQcmV2SWR4LCBnQ250LCBuQ250LCBwaW4yR0NlbGxNYXApOwotICAgIC8vY291dCA8PCJmaW5hbCBkb25lIiA8PGVuZGwgPDxmbHVzaDsKLSAgICAvL2JyZWFrOwotICB9Ci19Ci0KLXZvaWQgaW86OlBhcnNlcjo6Z2VuR3VpZGVzX2ZpbmFsKGZyTmV0ICpuZXQsIHZlY3RvcjxmclJlY3Q+ICZyZWN0cywgdmVjdG9yPGJvb2w+ICZhZGpWaXNpdGVkLCB2ZWN0b3I8aW50PiAmYWRqUHJldklkeCwgaW50IGdDbnQsIGludCBuQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwPGZyQmxvY2tPYmplY3QqLCBzZXQ8cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiA+LCBmckJsb2NrT2JqZWN0Q29tcD4gJnBpbjJHQ2VsbE1hcCkgewotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLSAgdmVjdG9yPGZyQmxvY2tPYmplY3QqPiBwaW4ycHRyOwotICBmb3IgKGF1dG8gJltvYmosIGlkeFNdOiBwaW4yR0NlbGxNYXApIHsKLSAgICBwaW4ycHRyLnB1c2hfYmFjayhvYmopOwotICB9Ci0gIC8vIGZpbmQgcGluIGluIHdoaWNoIGd1aWRlCi0gIC8vdmVjdG9yPHZlY3RvcjxpbnQ+ID4gcGluSWR4Mkd1aWRlcyhuQ250IC0gZ0NudCk7Ci0gIHZlY3Rvcjx2ZWN0b3I8cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiA+ID4gcGluSWR4MkdDZWxsVXBkYXRlZChuQ250IC0gZ0NudCk7Ci0gIHZlY3Rvcjx2ZWN0b3I8aW50PiA+IGd1aWRlSWR4MlBpbnMoZ0NudCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClhZGpQcmV2SWR4LnNpemUoKTsgaSsrKSB7Ci0gICAgaWYgKCFhZGpWaXNpdGVkW2ldKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKGkgPCBnQ250ICYmIGFkalByZXZJZHhbaV0gPj0gZ0NudCkgewotICAgICAgLy8gcGluIGlkeCA9IGFkalByZXZJZHhbaV0gLSBnQ250Ci0gICAgICAvLyBndWlkZSBpZHggPSBpCi0gICAgICAvL3BpbkluR3VpZGVzW2FkalByZXZJZHhbaV0gLSBnQ250XS5wdXNoX2JhY2soaSk7Ci0gICAgICBhdXRvIHBpbklkeCA9IGFkalByZXZJZHhbaV0gLSBnQ250OwotICAgICAgYXV0byBndWlkZUlkeCA9IGk7Ci0gICAgICBmckJveCBib3g7Ci0gICAgICBhdXRvICZyZWN0ID0gcmVjdHNbZ3VpZGVJZHhdOwotICAgICAgcmVjdC5nZXRCQm94KGJveCk7Ci0gICAgICBhdXRvIGxOdW0gPSByZWN0LmdldExheWVyTnVtKCk7Ci0gICAgICBhdXRvIG9iaiA9IHBpbjJwdHJbcGluSWR4XTsKLSAgICAgIC8vY291dCA8PCIgcGluMSBpZCAiIDw8YWRqUHJldklkeFtpXSA8PCIgcHJldiAiIDw8aSA8PGVuZGw7Ci0gICAgICBpZiAocGluMkdDZWxsTWFwW29ial0uZmluZChtYWtlX3BhaXIoYm94Lmxvd2VyTGVmdCgpLCBsTnVtKSkgIT0gcGluMkdDZWxsTWFwW29ial0uZW5kKCkpIHsKLSAgICAgICAgcGluSWR4MkdDZWxsVXBkYXRlZFtwaW5JZHhdLnB1c2hfYmFjayhtYWtlX3BhaXIoYm94Lmxvd2VyTGVmdCgpLCBsTnVtKSk7Ci0gICAgICB9IGVsc2UgaWYgKHBpbjJHQ2VsbE1hcFtvYmpdLmZpbmQobWFrZV9wYWlyKGJveC51cHBlclJpZ2h0KCksIGxOdW0pKSAhPSBwaW4yR0NlbGxNYXBbb2JqXS5lbmQoKSkgewotICAgICAgICBwaW5JZHgyR0NlbGxVcGRhdGVkW3BpbklkeF0ucHVzaF9iYWNrKG1ha2VfcGFpcihib3gudXBwZXJSaWdodCgpLCBsTnVtKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb3V0IDw8IkVycm9yOiBnZW5HdWlkZXNfZmluYWwgZXJyb3IgMSIgPDxlbmRsOwotICAgICAgfQotICAgICAgZ3VpZGVJZHgyUGluc1tndWlkZUlkeF0ucHVzaF9iYWNrKHBpbklkeCk7Ci0gICAgfSBlbHNlIGlmIChpID49IGdDbnQgJiYgYWRqUHJldklkeFtpXSA+PSAwICYmIGFkalByZXZJZHhbaV0gPCBnQ250KSB7Ci0gICAgICAvLyBwaW4gaWR4ID0gaQotICAgICAgLy8gZ3VpZGUgaWR4ID0gYWRqUHJldklkeFtpXQotICAgICAgLy9waW5Jbkd1aWRlc1tpIC0gZ0NudF0ucHVzaF9iYWNrKGFkalByZXZJZHhbaV0pOwotICAgICAgYXV0byBwaW5JZHggPSBpIC0gZ0NudDsKLSAgICAgIGF1dG8gZ3VpZGVJZHggPSBhZGpQcmV2SWR4W2ldOwotICAgICAgZnJCb3ggYm94OwotICAgICAgYXV0byAmcmVjdCA9IHJlY3RzW2d1aWRlSWR4XTsKLSAgICAgIHJlY3QuZ2V0QkJveChib3gpOwotICAgICAgYXV0byBsTnVtID0gcmVjdC5nZXRMYXllck51bSgpOwotICAgICAgYXV0byBvYmogPSBwaW4ycHRyW3BpbklkeF07Ci0gICAgICAvL2NvdXQgPDwiIHBpbjIgaWQgIiA8PGkgPDwiIHByZXYgIiA8PGFkalByZXZJZHhbaV0gPDxlbmRsOwotICAgICAgaWYgKHBpbjJHQ2VsbE1hcFtvYmpdLmZpbmQobWFrZV9wYWlyKGJveC5sb3dlckxlZnQoKSwgbE51bSkpICE9IHBpbjJHQ2VsbE1hcFtvYmpdLmVuZCgpKSB7Ci0gICAgICAgIHBpbklkeDJHQ2VsbFVwZGF0ZWRbcGluSWR4XS5wdXNoX2JhY2sobWFrZV9wYWlyKGJveC5sb3dlckxlZnQoKSwgbE51bSkpOwotICAgICAgfSBlbHNlIGlmIChwaW4yR0NlbGxNYXBbb2JqXS5maW5kKG1ha2VfcGFpcihib3gudXBwZXJSaWdodCgpLCBsTnVtKSkgIT0gcGluMkdDZWxsTWFwW29ial0uZW5kKCkpIHsKLSAgICAgICAgcGluSWR4MkdDZWxsVXBkYXRlZFtwaW5JZHhdLnB1c2hfYmFjayhtYWtlX3BhaXIoYm94LnVwcGVyUmlnaHQoKSwgbE51bSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogZ2VuR3VpZGVzX2ZpbmFsIGVycm9yIDIiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIGd1aWRlSWR4MlBpbnNbZ3VpZGVJZHhdLnB1c2hfYmFjayhwaW5JZHgpOwotICAgIH0KLSAgfQotICBmb3IgKGF1dG8gJmd1aWRlczogcGluSWR4MkdDZWxsVXBkYXRlZCkgewotICAgIGlmIChndWlkZXMuZW1wdHkoKSkgewotICAgICAgY291dCA8PCJFcnJvcjogZ2VuR3VpZGVzX2ZpbmFsIHBpbiBub3QgaW4gYW55IGd1aWRlIiA8PGVuZGw7Ci0gICAgfQotICB9Ci0gIAotICAvL2F1dG8gJmdwID0gZGVzaWduLT5nZXRUb3BCbG9jaygpLT5nZXRHQ2VsbFBhdHRlcm5zKCk7Ci0gIC8vYXV0byAmeGdwID0gZ3BbMF07Ci0gIC8vYXV0byAmeWdwID0gZ3BbMV07Ci0gIC8vLy8gdXNlIGZyQ29vcmQgdG8gcHJldmVudCBuZWdhdGl2ZSBwcm9ibGVtcwotICAvL2ZyQ29vcmQgR0NFTExHUklEWCAgID0geGdwLmdldFNwYWNpbmcoKTsKLSAgLy9mckNvb3JkIEdDRUxMR1JJRFkgICA9IHlncC5nZXRTcGFjaW5nKCk7Ci0gIC8vZnJDb29yZCBHQ0VMTE9GRlNFVFggPSB4Z3AuZ2V0U3RhcnRDb29yZCgpOwotICAvL2ZyQ29vcmQgR0NFTExPRkZTRVRZID0geWdwLmdldFN0YXJ0Q29vcmQoKTsKLSAgLy9mckNvb3JkIEdDRUxMQ05UWCAgICA9IHhncC5nZXRDb3VudCgpOwotICAvL2ZyQ29vcmQgR0NFTExDTlRZICAgID0geWdwLmdldENvdW50KCk7Ci0gICAKLSAgbWFwPHBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4sIHNldDxpbnQ+ID4gdXBkYXRlZE5vZGVNYXA7Ci0gIC8vIHBpbklkeDJHQ2VsbFVwZGF0ZWQgdGVsbHMgcGluIHJlc2lkZW5jeSBpbiBnY2VsbAotICBmb3IgKGludCBpID0gMDsgaSA8IG5DbnQgLSBnQ250OyBpKyspIHsKLSAgICBhdXRvIG9iaiA9IHBpbjJwdHJbaV07Ci0gICAgZm9yIChhdXRvICZbcHQsIGxOdW1dOiBwaW5JZHgyR0NlbGxVcGRhdGVkW2ldKSB7Ci0gICAgICAvL2ZyUG9pbnQgYWJzUHQocHQueCgpICogR0NFTExHUklEWCArIEdDRUxMT0ZGU0VUWCArIEdDRUxMR1JJRFggLyAyLAotICAgICAgLy8gICAgICAgICAgICAgIHB0LnkoKSAqIEdDRUxMR1JJRFkgKyBHQ0VMTE9GRlNFVFkgKyBHQ0VMTEdSSURZIC8gMik7Ci0gICAgICBmclBvaW50IGFic1B0OwotICAgICAgZGVzaWduLT5nZXRUb3BCbG9jaygpLT5nZXRHQ2VsbENlbnRlcihwdCwgYWJzUHQpOwotICAgICAgdG1wR1JQaW5zLnB1c2hfYmFjayhtYWtlX3BhaXIob2JqLCBhYnNQdCkpOwotICAgICAgdXBkYXRlZE5vZGVNYXBbbWFrZV9wYWlyKHB0LCBsTnVtKV0uaW5zZXJ0KGkgKyBnQ250KTsKLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCJwaW4gICBmaW5hbCAiIDw8aSArIGdDbnQgPDwiICIgPDxwdCA8PCIgIiA8PGRlc2lnbi0+Z2V0VGVjaCgpLT5nZXRMYXllcihsTnVtKS0+Z2V0TmFtZSgpIDw8ZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBnQ250OyBpKyspIHsKLSAgICBpZiAoIWFkalZpc2l0ZWRbaV0pIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBhdXRvICZyZWN0ID0gcmVjdHNbaV07Ci0gICAgZnJCb3ggYm94OwotICAgIHJlY3QuZ2V0QkJveChib3gpOwotICAgIHVwZGF0ZWROb2RlTWFwW21ha2VfcGFpcihmclBvaW50KGJveC5sZWZ0KCksICBib3guYm90dG9tKCkpLCByZWN0LmdldExheWVyTnVtKCkpXS5pbnNlcnQoaSk7Ci0gICAgdXBkYXRlZE5vZGVNYXBbbWFrZV9wYWlyKGZyUG9pbnQoYm94LnJpZ2h0KCksIGJveC50b3AoKSksICAgIHJlY3QuZ2V0TGF5ZXJOdW0oKSldLmluc2VydChpKTsKLSAgICAvL2NvdXQgPDwiYWRkIGd1aWRlICIgPDxpIDw8IiB0byAiIDw8ZnJQb2ludChib3gubGVmdCgpLCAgYm94LmJvdHRvbSgpKSA8PCIgIiA8PHJlY3QuZ2V0TGF5ZXJOdW0oKSA8PGVuZGw7Ci0gICAgLy9jb3V0IDw8ImFkZCBndWlkZSAiIDw8aSA8PCIgdG8gIiA8PGZyUG9pbnQoYm94LnJpZ2h0KCksIGJveC50b3AoKSkgICAgPDwiICIgPDxyZWN0LmdldExheWVyTnVtKCkgPDxlbmRsOwotICB9Ci0gIGZvciAoYXV0byAmW3ByLCBpZHhTXTogdXBkYXRlZE5vZGVNYXApIHsKLSAgICBhdXRvICZbcHQsIGxOdW1dID0gcHI7Ci0gICAgaWYgKChpbnQpaWR4Uy5zaXplKCkgPT0gMSkgewotICAgICAgYXV0byBpZHggPSAqKGlkeFMuYmVnaW4oKSk7Ci0gICAgICBpZiAoaWR4IDwgZ0NudCkgewotICAgICAgICAvLyBubyB1cHBlci9sb3dlciBndWlkZQotICAgICAgICBpZiAodXBkYXRlZE5vZGVNYXAuZmluZChtYWtlX3BhaXIocHQsIGxOdW0gKyAyKSkgPT0gdXBkYXRlZE5vZGVNYXAuZW5kKCkgJiYKLSAgICAgICAgICAgIHVwZGF0ZWROb2RlTWFwLmZpbmQobWFrZV9wYWlyKHB0LCBsTnVtIC0gMikpID09IHVwZGF0ZWROb2RlTWFwLmVuZCgpKSB7Ci0gICAgICAgICAgYXV0byAmcmVjdCA9IHJlY3RzW2lkeF07Ci0gICAgICAgICAgZnJCb3ggYm94OwotICAgICAgICAgIHJlY3QuZ2V0QkJveChib3gpOwotICAgICAgICAgIGlmIChib3gubG93ZXJMZWZ0KCkgPT0gcHQpIHsKLSAgICAgICAgICAgIHJlY3Quc2V0QkJveChmckJveChib3gucmlnaHQoKSwgYm94LnRvcCgpLCBib3gucmlnaHQoKSwgYm94LnRvcCgpKSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlY3Quc2V0QkJveChmckJveChib3gubGVmdCgpLCBib3guYm90dG9tKCksIGJveC5sZWZ0KCksIGJveC5ib3R0b20oKSkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogcGluIGRhbmdsaW5nIGlkICIgPDxpZHggPDwiICIgPDxwdCA8PCIgIiA8PGxOdW0gPDxlbmRsOwotICAgICAgICBleGl0KDEpOwotICAgICAgfQotICAgIH0KLSAgfQotICAvLyBndWlkZUlkeDJQaW5zIGVuYWJsZXMgZmlkaW5nIGZyb20gZ3VpZGUgdG8gcGluCi0gIC8vIGFkalZpc2l0ZWQgdGVsbHMgZ3VpZGUgdG8gd3JpdGUgYmFjawotICBmb3IgKGludCBpID0gMDsgaSA8IGdDbnQ7IGkrKykgewotICAgIGlmICghYWRqVmlzaXRlZFtpXSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGF1dG8gJnJlY3QgPSByZWN0c1tpXTsKLSAgICBmckJveCBib3g7Ci0gICAgcmVjdC5nZXRCQm94KGJveCk7Ci0gICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgY291dCA8PCJndWlkZSBmaW5hbCAiIDw8aSA8PCIgIiA8PGJveCA8PCIgIiA8PGRlc2lnbi0+Z2V0VGVjaCgpLT5nZXRMYXllcihyZWN0LmdldExheWVyTnVtKCkpLT5nZXROYW1lKCkgPDxlbmRsOwotICAgIH0KLSAgICBhdXRvIGd1aWRlID0gbWFrZV91bmlxdWU8ZnJHdWlkZT4oKTsKLSAgICBmclBvaW50IGJlZ2luLCBlbmQ7Ci0gICAgLy9iZWdpbi5zZXQoYm94LmxlZnQoKSAgICogR0NFTExHUklEWCArIEdDRUxMT0ZGU0VUWCArIEdDRUxMR1JJRFggLyAyLCAKLSAgICAvLyAgICAgICAgICBib3guYm90dG9tKCkgKiBHQ0VMTEdSSURZICsgR0NFTExPRkZTRVRZICsgR0NFTExHUklEWSAvIDIpOwotICAgIGRlc2lnbi0+Z2V0VG9wQmxvY2soKS0+Z2V0R0NlbGxDZW50ZXIoYm94Lmxvd2VyTGVmdCgpLCBiZWdpbik7Ci0gICAgLy9lbmQuc2V0KGJveC5yaWdodCgpICogR0NFTExHUklEWCArIEdDRUxMT0ZGU0VUWCArIEdDRUxMR1JJRFggLyAyLCAKLSAgICAvLyAgICAgICAgYm94LnRvcCgpICAgKiBHQ0VMTEdSSURZICsgR0NFTExPRkZTRVRZICsgR0NFTExHUklEWSAvIDIpOwotICAgIGRlc2lnbi0+Z2V0VG9wQmxvY2soKS0+Z2V0R0NlbGxDZW50ZXIoYm94LnVwcGVyUmlnaHQoKSwgZW5kKTsKLSAgICBndWlkZS0+c2V0UG9pbnRzKGJlZ2luLCBlbmQpOwotICAgIGd1aWRlLT5zZXRCZWdpbkxheWVyTnVtKHJlY3QuZ2V0TGF5ZXJOdW0oKSk7Ci0gICAgZ3VpZGUtPnNldEVuZExheWVyTnVtKHJlY3QuZ2V0TGF5ZXJOdW0oKSk7Ci0gICAgZ3VpZGUtPmFkZFRvTmV0KG5ldCk7Ci0gICAgbmV0LT5hZGRHdWlkZShndWlkZSk7Ci0gICAgLy9jb3V0IDw8ImFkZCBndWlkZSAiIDw8YmVnaW4gPDwiICIgPDxlbmQgPDwiICIgPDxyZWN0LmdldExheWVyTnVtKCkgPDxlbmRsOwotICB9Ci19Ci0KLXZvaWQgaW86OlBhcnNlcjo6Z2VuR3VpZGVzX2J1aWxkTm9kZU1hcChtYXA8cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiwgc2V0PGludD4gPiAmbm9kZU1hcCwgaW50ICZnQ250LCBpbnQgJm5DbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPGZyUmVjdD4gJnJlY3RzLCBtYXA8ZnJCbG9ja09iamVjdCosIHNldDxwYWlyPGZyUG9pbnQsIGZyTGF5ZXJOdW0+ID4sIGZyQmxvY2tPYmplY3RDb21wPiAmcGluMkdDZWxsTWFwKSB7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIC8vIGd1aWRlSWR4Ci0gIC8vbWFwPHBhaXI8ZnJQb2ludCwgZnJMYXllck51bT4sIHNldDxpbnQ+ID4gbm9kZU1hcDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KXJlY3RzLnNpemUoKTsgaSsrKSB7Ci0gICAgYXV0byAmcmVjdCA9IHJlY3RzW2ldOwotICAgIGZyQm94IGJveDsKLSAgICByZWN0LmdldEJCb3goYm94KTsKLSAgICBub2RlTWFwW21ha2VfcGFpcihib3gubG93ZXJMZWZ0KCksIHJlY3QuZ2V0TGF5ZXJOdW0oKSldLmluc2VydChpKTsKLSAgICBub2RlTWFwW21ha2VfcGFpcihib3gudXBwZXJSaWdodCgpLCByZWN0LmdldExheWVyTnVtKCkpXS5pbnNlcnQoaSk7Ci0gIH0KLSAgZ0NudCA9IHJlY3RzLnNpemUoKTsgLy8gdG90YWwgZ3VpZGUgY250Ci0gIGludCBub2RlSWR4ID0gcmVjdHMuc2l6ZSgpOwotICBmb3IgKGF1dG8gJltvYmosIGxvY1NdOiBwaW4yR0NlbGxNYXApIHsKLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBpZiAob2JqLT50eXBlSWQoKSA9PSBmcmNJbnN0VGVybSkgewotICAgICAgICBhdXRvIGluc3RUZXJtID0gc3RhdGljX2Nhc3Q8ZnJJbnN0VGVybSo+KG9iaik7Ci0gICAgICAgIGNvdXQgPDwiaW5zdFRlcm0gIiA8PG5vZGVJZHggPDwiICIgPDxpbnN0VGVybS0+Z2V0SW5zdCgpLT5nZXROYW1lKCkgPDwiLyIgPDxpbnN0VGVybS0+Z2V0VGVybSgpLT5nZXROYW1lKCk7Ci0gICAgICB9IGVsc2UgaWYgKG9iai0+dHlwZUlkKCkgPT0gZnJjVGVybSkgewotICAgICAgICBhdXRvIHRlcm0gPSBzdGF0aWNfY2FzdDxmclRlcm0qPihvYmopOwotICAgICAgICBjb3V0IDw8InRlcm0gIiA8PG5vZGVJZHggPDwiIFBJTi8iIDw8dGVybS0+Z2V0TmFtZSgpOwotICAgICAgfQotICAgIH0KLSAgICBmb3IgKGF1dG8gJmxvYzogbG9jUykgewotICAgICAgbm9kZU1hcFtsb2NdLmluc2VydChub2RlSWR4KTsKLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgIiA8PGxvYy5maXJzdCA8PCIgIiA8PGRlc2lnbi0+Z2V0VGVjaCgpLT5nZXRMYXllcihsb2Muc2Vjb25kKS0+Z2V0TmFtZSgpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBjb3V0IDw8ZW5kbDsKLSAgICB9Ci0gICAgbm9kZUlkeCsrOwotICB9Ci0gIG5DbnQgPSBub2RlSWR4OyAvLyB0b3RhbCBub2RlIGNudAotfQotCi0KLQotYm9vbCBpbzo6UGFyc2VyOjpnZW5HdWlkZXNfYXN0YXIoZnJOZXQqIG5ldCwgdmVjdG9yPGJvb2w+ICZhZGpWaXNpdGVkLCB2ZWN0b3I8aW50PiAmYWRqUHJldklkeCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8cGFpcjxmclBvaW50LCBmckxheWVyTnVtPiwgc2V0PGludD4gPiAmbm9kZU1hcCwgaW50ICZnQ250LCBpbnQgJm5DbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlRmVlZFRocm91Z2gsIGJvb2wgcmV0cnkpIHsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIC8vIGEgc3RhciBzZWFyY2gKLQotICAvLyBub2RlIGluZGV4LCBub2RlIHZpc2l0ZWQKLSAgdmVjdG9yPHZlY3RvcjxpbnQ+ID4gYWRqVmVjKG5DbnQsIHZlY3RvcjxpbnQ+KCkpOwotICB2ZWN0b3I8Ym9vbD4gb25QYXRoSWR4KG5DbnQsIGZhbHNlKTsKLSAgYWRqVmlzaXRlZC5jbGVhcigpOwotICBhZGpQcmV2SWR4LmNsZWFyKCk7Ci0gIGFkalZpc2l0ZWQucmVzaXplKG5DbnQsIGZhbHNlKTsKLSAgYWRqUHJldklkeC5yZXNpemUobkNudCwgLTEpOwotICAvL3ZlY3Rvcjxib29sPiBhZGpWaXNpdGVkKG5DbnQsIGZhbHNlKTsKLSAgLy92ZWN0b3I8aW50PiAgYWRqUHJldklkeChuQ250LCAtMSk7Ci0gIGZvciAoYXV0byAmW3ByLCBpZHhTXTogbm9kZU1hcCkgewotICAgIGF1dG8gJltwdCwgbE51bV0gPSBwcjsKLSAgICBmb3IgKGF1dG8gaXQxID0gaWR4Uy5iZWdpbigpOyBpdDEgIT0gaWR4Uy5lbmQoKTsgaXQxKyspIHsKLSAgICAgIGF1dG8gaXQyID0gaXQxOwotICAgICAgaXQyKys7Ci0gICAgICBhdXRvIGlkeDEgPSAqaXQxOwotICAgICAgZm9yICg7IGl0MiAhPSBpZHhTLmVuZCgpOyBpdDIrKykgewotICAgICAgICBhdXRvIGlkeDIgPSAqaXQyOwotICAgICAgICAvLyB0d28gcGlucywgbm8gZWRnZQotICAgICAgICBpZiAoaWR4MSA+PSBnQ250ICYmIGlkeDIgPj0gZ0NudCkgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAvLyB0d28gZ2NlbGxzLCBoYXMgZWRnZQotICAgICAgICB9IGVsc2UgaWYgKGlkeDEgPCBnQ250ICYmIGlkeDIgPCBnQ250KSB7Ci0gICAgICAgICAgLy8gbm8gTTEgY3Jvc3MtZ2NlbGwgcm91dGluZyBhbGxvd2VkCi0gICAgICAgICAgaWYgKGxOdW0gIT0gMCkgewotICAgICAgICAgICAgYWRqVmVjW2lkeDFdLnB1c2hfYmFjayhpZHgyKTsKLSAgICAgICAgICAgIGFkalZlY1tpZHgyXS5wdXNoX2JhY2soaWR4MSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vY291dCA8PCJhZGQgZWRnZTEgIiA8PGlkeDEgPDwiICIgPDxpZHgyIDw8ZW5kbDsKLSAgICAgICAgLy8gb25lIHBpbiwgb25lIGdjZWxsCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgYXV0byBnSWR4ID0gbWluKGlkeDEsIGlkeDIpOwotICAgICAgICAgIGF1dG8gcElkeCA9IG1heChpZHgxLCBpZHgyKTsKLSAgICAgICAgICAvLyBvbmx5IG91dCBlZGdlCi0gICAgICAgICAgaWYgKEFMTE9XX1BJTl9BU19GRUVEVEhST1VHSCB8fCBmb3JjZUZlZWRUaHJvdWdoKSB7Ci0gICAgICAgICAgICBhZGpWZWNbcElkeF0ucHVzaF9iYWNrKGdJZHgpOwotICAgICAgICAgICAgYWRqVmVjW2dJZHhdLnB1c2hfYmFjayhwSWR4KTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHBJZHggPT0gZ0NudCkgewotICAgICAgICAgICAgICBhZGpWZWNbcElkeF0ucHVzaF9iYWNrKGdJZHgpOwotICAgICAgICAgICAgICAvL2NvdXQgPDwiYWRkIGVkZ2UyICIgPDxwSWR4IDw8IiAiIDw8Z0lkeCA8PGVuZGw7Ci0gICAgICAgICAgICAvLyBvbmx5IGluIGVkZ2UKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGFkalZlY1tnSWR4XS5wdXNoX2JhY2socElkeCk7Ci0gICAgICAgICAgICAgIC8vY291dCA8PCJhZGQgZWRnZTMgIiA8PGdJZHggPDwiICIgPDxwSWR4IDw8ZW5kbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIGFkZCBpbnRlcnNlY3RpbmcgZ3VpZGUyZ3VpZGUgZWRnZSBleGNsdWRlcyBwaW4KLSAgICAgIGlmIChpZHgxIDwgZ0NudCAmJiBub2RlTWFwLmZpbmQobWFrZV9wYWlyKHB0LCBsTnVtICsgMikpICE9IG5vZGVNYXAuZW5kKCkpIHsKLSAgICAgICAgZm9yIChhdXRvIG5icklkeDogbm9kZU1hcFttYWtlX3BhaXIocHQsIGxOdW0gKyAyKV0pIHsKLSAgICAgICAgICBpZiAobmJySWR4IDwgZ0NudCkgewotICAgICAgICAgICAgYWRqVmVjW2lkeDFdLnB1c2hfYmFjayhuYnJJZHgpOwotICAgICAgICAgICAgYWRqVmVjW25icklkeF0ucHVzaF9iYWNrKGlkeDEpOwotICAgICAgICAgICAgLy9jb3V0IDw8ImFkZCBlZGdlNCAiIDw8aWR4MSA8PCIgIiA8PG5icklkeCA8PGVuZGw7Ci0gICAgICAgICAgICAvL2NvdXQgPDwiYWRkIGVkZ2U1ICIgPDxuYnJJZHggPDwiICIgPDxpZHgxIDw8ZW5kbDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBzdHJ1Y3Qgd2YgewotICAgIGludCBub2RlSWR4OwotICAgIGludCBwcmV2SWR4OwotICAgIGludCBjb3N0OwotICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IHdmICZiKSBjb25zdCB7Ci0gICAgICBpZiAoY29zdCA9PSBiLmNvc3QpIHsKLSAgICAgICAgcmV0dXJuIG5vZGVJZHggPiBiLm5vZGVJZHg7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gY29zdCA+IGIuY29zdDsKLSAgICAgIH0KLSAgICB9Ci0gIH07Ci0gIGZvciAoaW50IGZpbmROb2RlID0gZ0NudDsgZmluZE5vZGUgPCBuQ250IC0gMTsgZmluZE5vZGUrKykgewotICAgIC8vYWRqVmlzaXRlZCA9IG9uUGF0aElkeDsKLSAgICAvL2NvdXQgPDwiZmluaXNoZWQgIiA8PGZpbmROb2RlIDw8IiBub2RlcyIgPDxlbmRsOwotICAgIHByaW9yaXR5X3F1ZXVlPHdmPiBwcTsKLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAvL2NvdXQgPDwidmlzaXQiOwotICAgIH0KLSAgICBpZiAoZmluZE5vZGUgPT0gZ0NudCkgewotICAgICAgLy8gcHVzaCBvbmx5IGZpcnN0IHBpbiBpbnRvIHBxCi0gICAgICBwcS5wdXNoKHtnQ250LCAtMSwgMH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBwdXNoIGV2ZXJ5IHZpc2l0ZWQgbm9kZSBpbnRvIHBxCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5DbnQ7IGkrKykgewotICAgICAgICAvL2lmIChhZGpWaXNpdGVkW2ldKSB7Ci0gICAgICAgIGlmIChvblBhdGhJZHhbaV0pIHsKLSAgICAgICAgICAvLyBwZW5hbGl6ZSBmZWVkdGhyb3VnaCBpbiBub3JtYWwgbW9kZQotICAgICAgICAgIGlmIChBTExPV19QSU5fQVNfRkVFRFRIUk9VR0ggJiYgaSA+PSBnQ250KSB7Ci0gICAgICAgICAgICBwcS5wdXNoKHtpLCBhZGpQcmV2SWR4W2ldLCAyfSk7Ci0gICAgICAgICAgLy8gcGVuYWxpemUgZmVlZHRocm91Z2ggaW4gZmFsbGJhY2sgbW9kZQotICAgICAgICAgIH0gZWxzZSBpZiAoZm9yY2VGZWVkVGhyb3VnaCAmJiBpID49IGdDbnQpIHsKLSAgICAgICAgICAgIHBxLnB1c2goe2ksIGFkalByZXZJZHhbaV0sIDEwfSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBxLnB1c2goe2ksIGFkalByZXZJZHhbaV0sIDB9KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaW50IGxhc3ROb2RlSWR4ID0gLTE7Ci0gICAgd2hpbGUgKCFwcS5lbXB0eSgpKSB7Ci0gICAgICBhdXRvIHdmcm9udCA9IHBxLnRvcCgpOwotICAgICAgcHEucG9wKCk7Ci0gICAgICBpZiAoIW9uUGF0aElkeFt3ZnJvbnQubm9kZUlkeF0gJiYgYWRqVmlzaXRlZFt3ZnJvbnQubm9kZUlkeF0pIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAod2Zyb250Lm5vZGVJZHggPiBnQ250ICYmIHdmcm9udC5ub2RlSWR4IDwgbkNudCAmJiBhZGpWaXNpdGVkW3dmcm9udC5ub2RlSWR4XSA9PSBmYWxzZSkgewotICAgICAgICBhZGpWaXNpdGVkW3dmcm9udC5ub2RlSWR4XSA9IHRydWU7Ci0gICAgICAgIGFkalByZXZJZHhbd2Zyb250Lm5vZGVJZHhdID0gd2Zyb250LnByZXZJZHg7Ci0gICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICAvL2NvdXQgPDwiICIgPDx3ZnJvbnQubm9kZUlkeCA8PCIgKCIgPDx3ZnJvbnQuY29zdCA8PCIsIiA8PHdmcm9udC5wcmV2SWR4IDw8IikiIDw8IiBleGl0IiA8PGVuZGw7Ci0gICAgICAgICAgY291dCA8PCJ2aXNpdCAiIDw8d2Zyb250Lm5vZGVJZHggPDwiICgiIDw8d2Zyb250LmNvc3QgPDwiLCIgPDx3ZnJvbnQucHJldklkeCA8PCIpIiA8PCIgZXhpdCIgPDxlbmRsOwotICAgICAgICB9Ci0gICAgICAgIGxhc3ROb2RlSWR4ID0gd2Zyb250Lm5vZGVJZHg7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYWRqVmlzaXRlZFt3ZnJvbnQubm9kZUlkeF0gPSB0cnVlOwotICAgICAgYWRqUHJldklkeFt3ZnJvbnQubm9kZUlkeF0gPSB3ZnJvbnQucHJldklkeDsKLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgLy9jb3V0IDw8IiAiIDw8d2Zyb250Lm5vZGVJZHggPDwiICgiIDw8d2Zyb250LmNvc3QgPDwiLCIgPDx3ZnJvbnQucHJldklkeCA8PCIpIjsKLSAgICAgICAgY291dCA8PCJ2aXNpdCAiIDw8d2Zyb250Lm5vZGVJZHggPDwiICgiIDw8d2Zyb250LmNvc3QgPDwiLCIgPDx3ZnJvbnQucHJldklkeCA8PCIpIiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgICAvLyB2aXNpdCBvdGhlciBub2RlcwotICAgICAgZm9yIChhdXRvIG5icklkeDogYWRqVmVjW3dmcm9udC5ub2RlSWR4XSkgewotICAgICAgICBpZiAoIWFkalZpc2l0ZWRbbmJySWR4XSkgewotICAgICAgICAgIHBxLnB1c2goe25icklkeCwgd2Zyb250Lm5vZGVJZHgsIHdmcm9udC5jb3N0ICsgMX0pOwotICAgICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICAgIGNvdXQgPDwicHVzaCAiIDw8bmJySWR4IDw8ZW5kbDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gdHJhY2UgYmFjayBwYXRoCi0gICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgY291dCA8PCJ0cmFjZSBiYWNrIGlkIjsKLSAgICB9Ci0gICAgd2hpbGUgKChsYXN0Tm9kZUlkeCAhPSAtMSkgJiYgKCFvblBhdGhJZHhbbGFzdE5vZGVJZHhdKSkgewotICAgICAgb25QYXRoSWR4W2xhc3ROb2RlSWR4XSA9IHRydWU7Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiICIgPDxsYXN0Tm9kZUlkeCA8PCIgKCIgPDxhZGpQcmV2SWR4W2xhc3ROb2RlSWR4XSA8PCIpIjsKLSAgICAgIH0KLSAgICAgIGxhc3ROb2RlSWR4ID0gYWRqUHJldklkeFtsYXN0Tm9kZUlkeF07Ci0gICAgfQotICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgIGNvdXQgPDxlbmRsOwotICAgIH0KLSAgICBhZGpWaXNpdGVkID0gb25QYXRoSWR4OwotICB9Ci0gIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgY291dCA8PCJzdGF0OiAiIDw8bmV0LT5nZXROYW1lKCkgPDwiICNndWlkZS8jcGluLyN1bnVzZWQgPSAiIDw8Z0NudCA8PCIvIiA8PG5DbnQgLSBnQ250IDw8Ii8iIAotICAgICAgIDw8bkNudCAtIGNvdW50KGFkalZpc2l0ZWQuYmVnaW4oKSwgYWRqVmlzaXRlZC5lbmQoKSwgdHJ1ZSkgPDxlbmRsOwotICB9Ci0gIGludCBwaW5WaXNpdGVkID0gY291bnQoYWRqVmlzaXRlZC5iZWdpbigpICsgZ0NudCwgYWRqVmlzaXRlZC5lbmQoKSwgdHJ1ZSk7Ci0gIC8vIHRydWUgZXJyb3Igd2hlbiBhbGxvd2luZyBmZWVkdGhyb3VnaAotICBpZiAocGluVmlzaXRlZCAhPSBuQ250IC0gZ0NudCAmJiAoQUxMT1dfUElOX0FTX0ZFRURUSFJPVUdIIHx8IGZvcmNlRmVlZFRocm91Z2gpICYmIHJldHJ5KSB7Ci0gICAgY291dCA8PCJFcnJvcjogIiA8PG5ldC0+Z2V0TmFtZSgpIDw8IiAiIDw8bkNudCAtIGdDbnQgLSBwaW5WaXNpdGVkIDw8IiBwaW4gbm90IHZpc2l0ZWQgI2d1aWRlcyA9ICIgPDxnQ250IDw8ZW5kbDsKLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBmb3IgKGludCBpID0gZ0NudDsgaSA8IG5DbnQ7IGkrKykgewotICAgICAgICBpZiAoIWFkalZpc2l0ZWRbaV0pIHsKLSAgICAgICAgICBjb3V0IDw8IiAgcGluIGlkID0gIiA8PGkgPDxlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIC8vIGZhbGxiYWNrIHRvIGZlZWR0aHJvdWdoIGluIG5leHQgaXRlcgotICBpZiAocGluVmlzaXRlZCAhPSBuQ250IC0gZ0NudCAmJiAhQUxMT1dfUElOX0FTX0ZFRURUSFJPVUdIICYmICFmb3JjZUZlZWRUaHJvdWdoICYmIHJldHJ5KSB7Ci0gICAgY291dCA8PCJXYXJuaW5nOiAiIDw8bmV0LT5nZXROYW1lKCkgPDwiICIgPDxuQ250IC0gZ0NudCAtIHBpblZpc2l0ZWQgPDwiIHBpbiBub3QgdmlzaXRlZCwgZmFsbCBiYWNrIHRvIGZlZWRyb3VnaCBtb2RlIiA8PGVuZGw7Ci0gICAgLy9pZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgLy8gIGZvciAoaW50IGkgPSBnQ250OyBpIDwgbkNudDsgaSsrKSB7Ci0gICAgLy8gICAgaWYgKCFhZGpWaXNpdGVkW2ldKSB7Ci0gICAgLy8gICAgICBjb3V0IDw8IiAgcGluIGlkID0gIiA8PGkgPDxlbmRsOwotICAgIC8vICAgIH0KLSAgICAvLyAgfQotICAgIC8vfQotICB9Ci0gIC8vIGZhbGxiYWNrIHRvIGZlZWR0aHJvdWdoIGluIG5leHQgaXRlcgotICAvL2lmIChwaW5WaXNpdGVkICE9IG5DbnQgLSBnQ250ICYmICFyZXRyeSkgewotICAvLyAgY291dCA8PCJXYXJuaW5nOiAiIDw8bmV0LT5nZXROYW1lKCkgPDwiICIgPDxuQ250IC0gZ0NudCAtIHBpblZpc2l0ZWQgPDwiIHBpbiBub3QgdmlzaXRlZCwgZmFsbCBiYWNrIHRvIHJldHJ5IG1vZGUiIDw8ZW5kbDsKLSAgLy8gIC8vaWYgKGVuYWJsZU91dHB1dCkgewotICAvLyAgLy8gIGZvciAoaW50IGkgPSBnQ250OyBpIDwgbkNudDsgaSsrKSB7Ci0gIC8vICAvLyAgICBpZiAoIWFkalZpc2l0ZWRbaV0pIHsKLSAgLy8gIC8vICAgICAgY291dCA8PCIgIHBpbiBpZCA9ICIgPDxpIDw8ZW5kbDsKLSAgLy8gIC8vICAgIH0KLSAgLy8gIC8vICB9Ci0gIC8vICAvL30KLSAgLy99Ci0gIGlmIChwaW5WaXNpdGVkID09IG5DbnQgLSBnQ250KSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9pby9pb19wYXJzZXJfaGVscGVyLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2lvL2lvX3BhcnNlcl9oZWxwZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2U2YTRkLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2lvL2lvX3BhcnNlcl9oZWxwZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzgyICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8Ym9vc3QvZ3JhcGgvY29ubmVjdGVkX2NvbXBvbmVudHMuaHBwPgotLy8jaW5jbHVkZSA8Ym9vc3QvcHJvcGVydHlfbWFwL3Byb3BlcnR5X21hcC5ocHA+Ci0jaW5jbHVkZSAiZ2xvYmFsLmgiCi0jaW5jbHVkZSAiaW8vaW8uaCIKLSNpbmNsdWRlICJmckJhc2VUeXBlcy5oIgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0KLSNpbmNsdWRlICJmckd1aWRlUHJlcC5oIgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBmcjsKLQotdm9pZCBpbzo6UGFyc2VyOjppbml0RGVmYXVsdFZpYXMoKSB7Ci0gIGZvciAoaW50IGxheWVyTnVtID0gMTsgbGF5ZXJOdW0gPCAoaW50KXRlY2gtPmdldExheWVycygpLnNpemUoKTsgbGF5ZXJOdW0gKz0gMikgewotICAgIG1hcDxmclZpYURlZiosIGJvb2w+ICAgIGlzV2l0aGluTGF5ZXIxOwotICAgIG1hcDxmclZpYURlZiosIGJvb2w+ICAgIGlzV2l0aGluTGF5ZXIyOwotICAgIG1hcDxmclZpYURlZiosIGZyQ29vcmQ+IGxheWVyMUFyZWE7Ci0gICAgbWFwPGZyVmlhRGVmKiwgZnJDb29yZD4gbGF5ZXIyQXJlYTsKLSAgICBtYXA8ZnJWaWFEZWYqLCBpbnQ+ICAgICBudW1DdXRzOwotICAgIGZvciAoYXV0byAmdVZpYURlZjogdGVjaC0+Z2V0VmlhcygpKSB7Ci0gICAgICBhdXRvIHZpYURlZiA9IHVWaWFEZWYuZ2V0KCk7Ci0gICAgICBpZiAodmlhRGVmLT5nZXRDdXRMYXllck51bSgpID09IGxheWVyTnVtICYmIHZpYURlZi0+Z2V0RGVmYXVsdCgpKSB7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCAiYWRkICIgPDwgdmlhRGVmLT5nZXROYW1lKCkgPDwgIiB0byBsYXllciAiIDw8IGxheWVyTnVtIDw8ICJcbiI7Ci0gICAgICAgIHRlY2gtPmdldExheWVyKGxheWVyTnVtKS0+YWRkVmlhRGVmKHZpYURlZik7Ci0gICAgICAgIG51bUN1dHNbdmlhRGVmXSA9IHZpYURlZi0+Z2V0Q3V0RmlncygpLnNpemUoKTsKLSAgICAgICAgaXNXaXRoaW5MYXllcjFbdmlhRGVmXSA9IHRydWU7Ci0gICAgICAgIGlzV2l0aGluTGF5ZXIyW3ZpYURlZl0gPSB0cnVlOwotICAgICAgICBsYXllcjFBcmVhW3ZpYURlZl0gICAgID0gMDsKLSAgICAgICAgbGF5ZXIyQXJlYVt2aWFEZWZdICAgICA9IDA7Ci0gICAgICAgIGZvciAoYXV0byAmcGluRmlnOiB2aWFEZWYtPmdldExheWVyMUZpZ3MoKSkgewotICAgICAgICAgIGlmIChwaW5GaWctPnR5cGVJZCgpID09IGZyY1JlY3QpIHsKLSAgICAgICAgICAgIGF1dG8gcm91dGVMYXllck51bSA9IHZpYURlZi0+Z2V0TGF5ZXIxTnVtKCk7Ci0gICAgICAgICAgICBmckJveCBib3g7Ci0gICAgICAgICAgICBwaW5GaWctPmdldEJCb3goYm94KTsKLSAgICAgICAgICAgIGxheWVyMUFyZWFbdmlhRGVmXSArPSAoYm94LnJpZ2h0KCkgLSBib3gubGVmdCgpKSAqIChib3gudG9wKCkgLSBib3guYm90dG9tKCkpOwotICAgICAgICAgICAgaWYgKHRlY2gtPmdldExheWVycygpLmF0KHJvdXRlTGF5ZXJOdW0pLT5nZXREaXIoKSA9PSBmcmNIb3J6UHJlZlJvdXRpbmdEaXIpIHsKLSAgICAgICAgICAgICAgaWYgKGZyQ29vcmQodGVjaC0+Z2V0TGF5ZXJzKCkuYXQocm91dGVMYXllck51bSktPmdldFdpZHRoKCkpIDw9IGJveC50b3AoKSAtIGJveC5ib3R0b20oKSkgewotICAgICAgICAgICAgICAgIGlzV2l0aGluTGF5ZXIxW3ZpYURlZl0gPSBmYWxzZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgaWYgKGZyQ29vcmQodGVjaC0+Z2V0TGF5ZXJzKCkuYXQocm91dGVMYXllck51bSktPmdldFdpZHRoKCkpIDw9IGJveC5yaWdodCgpIC0gYm94LmxlZnQoKSkgewotICAgICAgICAgICAgICAgIGlzV2l0aGluTGF5ZXIxW3ZpYURlZl0gPSBmYWxzZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSBpZiAocGluRmlnLT50eXBlSWQoKSA9PSBmcmNQb2x5Z29uKSB7Ci0gICAgICAgICAgICBjb3V0IDw8IkVycm9yOiBpbml0RGVmYXVsdFZpYXMgZG9lcyBub3Qgc3VwcG9ydCBwb2x5Z29ucyIgPDxlbmRsOwotICAgICAgICAgICAgZXhpdCgwKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY291dCA8PCJFcnJvcjogaW5pdERlZmF1bHRWaWFzIGNhbm5vdCBmaW5kIHJlY3Qgb3IgcG9seSBzaGFwZXMiIDw8ZW5kbDsKLSAgICAgICAgICAgIGV4aXQoMCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvciAoYXV0byAmcGluRmlnOiB2aWFEZWYtPmdldExheWVyMkZpZ3MoKSkgewotICAgICAgICAgIGlmIChwaW5GaWctPnR5cGVJZCgpID09IGZyY1JlY3QpIHsKLSAgICAgICAgICAgIGF1dG8gcm91dGVMYXllck51bSA9IHZpYURlZi0+Z2V0TGF5ZXIyTnVtKCk7Ci0gICAgICAgICAgICBmckJveCBib3g7Ci0gICAgICAgICAgICBwaW5GaWctPmdldEJCb3goYm94KTsKLSAgICAgICAgICAgIGxheWVyMkFyZWFbdmlhRGVmXSArPSAoYm94LnJpZ2h0KCkgLSBib3gubGVmdCgpKSAqIChib3gudG9wKCkgLSBib3guYm90dG9tKCkpOwotICAgICAgICAgICAgaWYgKHRlY2gtPmdldExheWVycygpLmF0KHJvdXRlTGF5ZXJOdW0pLT5nZXREaXIoKSA9PSBmcmNIb3J6UHJlZlJvdXRpbmdEaXIpIHsKLSAgICAgICAgICAgICAgaWYgKGZyQ29vcmQodGVjaC0+Z2V0TGF5ZXJzKCkuYXQocm91dGVMYXllck51bSktPmdldFdpZHRoKCkpIDw9IGJveC50b3AoKSAtIGJveC5ib3R0b20oKSkgewotICAgICAgICAgICAgICAgIGlzV2l0aGluTGF5ZXIyW3ZpYURlZl0gPSBmYWxzZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgaWYgKGZyQ29vcmQodGVjaC0+Z2V0TGF5ZXJzKCkuYXQocm91dGVMYXllck51bSktPmdldFdpZHRoKCkpIDw9IGJveC5yaWdodCgpIC0gYm94LmxlZnQoKSkgewotICAgICAgICAgICAgICAgIGlzV2l0aGluTGF5ZXIyW3ZpYURlZl0gPSBmYWxzZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSBpZiAocGluRmlnLT50eXBlSWQoKSA9PSBmcmNQb2x5Z29uKSB7Ci0gICAgICAgICAgICBjb3V0IDw8IkVycm9yOiBpbml0RGVmYXVsdFZpYXMgZG9lcyBub3Qgc3VwcG9ydCBwb2x5Z29ucyIgPDxlbmRsOwotICAgICAgICAgICAgZXhpdCgwKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY291dCA8PCJFcnJvcjogaW5pdERlZmF1bHRWaWFzIGNhbm5vdCBmaW5kIHJlY3Qgb3IgcG9seSBzaGFwZXMiIDw8ZW5kbDsKLSAgICAgICAgICAgIGV4aXQoMCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgICAKLSAgICAvLyBzaW5nbGUtY3V0IG9ubHkKLSAgICBmclZpYURlZiogZGVmYXVsdFNpbmdsZUN1dFZpYSA9IG51bGxwdHI7Ci0gICAgZm9yIChhdXRvICZpdDogbnVtQ3V0cykgewotICAgICAgYXV0byB2aWFEZWYgPSBpdC5maXJzdDsKLSAgICAgIGlmIChudW1DdXRzW3ZpYURlZl0gPT0gMSkgewotICAgICAgICBpZiAoaXNXaXRoaW5MYXllcjFbdmlhRGVmXSAmJiBpc1dpdGhpbkxheWVyMlt2aWFEZWZdKSB7Ci0gICAgICAgICAgaWYgKGRlZmF1bHRTaW5nbGVDdXRWaWEpIHsKLSAgICAgICAgICAgIGF1dG8gZGVmYXVsdFZpYUFyZWEgPSBsYXllcjFBcmVhW2RlZmF1bHRTaW5nbGVDdXRWaWFdICsgbGF5ZXIyQXJlYVtkZWZhdWx0U2luZ2xlQ3V0VmlhXTsKLSAgICAgICAgICAgIGF1dG8gY3VycmVudFZpYUFyZWEgPSBsYXllcjFBcmVhW3ZpYURlZl0gKyBsYXllcjJBcmVhW3ZpYURlZl07Ci0gICAgICAgICAgICBpZiAoY3VycmVudFZpYUFyZWEgPCBkZWZhdWx0VmlhQXJlYSkgewotICAgICAgICAgICAgICBkZWZhdWx0U2luZ2xlQ3V0VmlhID0gdmlhRGVmOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkZWZhdWx0U2luZ2xlQ3V0VmlhID0gdmlhRGVmOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBpZiAoIWRlZmF1bHRTaW5nbGVDdXRWaWEpIHsKLSAgICAgIGZvciAoYXV0byAmaXQ6IG51bUN1dHMpIHsKLSAgICAgICAgYXV0byB2aWFEZWYgPSBpdC5maXJzdDsKLSAgICAgICAgaWYgKG51bUN1dHNbdmlhRGVmXSA9PSAxKSB7Ci0gICAgICAgICAgaWYgKGlzV2l0aGluTGF5ZXIxW3ZpYURlZl0gfHwgaXNXaXRoaW5MYXllcjJbdmlhRGVmXSkgewotICAgICAgICAgICAgaWYgKGRlZmF1bHRTaW5nbGVDdXRWaWEpIHsKLSAgICAgICAgICAgICAgYXV0byBkZWZhdWx0VmlhQXJlYSA9IGxheWVyMUFyZWFbZGVmYXVsdFNpbmdsZUN1dFZpYV0gKyBsYXllcjJBcmVhW2RlZmF1bHRTaW5nbGVDdXRWaWFdOwotICAgICAgICAgICAgICBhdXRvIGN1cnJlbnRWaWFBcmVhID0gbGF5ZXIxQXJlYVt2aWFEZWZdICsgbGF5ZXIyQXJlYVt2aWFEZWZdOwotICAgICAgICAgICAgICBpZiAoY3VycmVudFZpYUFyZWEgPCBkZWZhdWx0VmlhQXJlYSkgewotICAgICAgICAgICAgICAgIGRlZmF1bHRTaW5nbGVDdXRWaWEgPSB2aWFEZWY7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGRlZmF1bHRTaW5nbGVDdXRWaWEgPSB2aWFEZWY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICghZGVmYXVsdFNpbmdsZUN1dFZpYSkgewotICAgICAgZm9yIChhdXRvICZpdDogbnVtQ3V0cykgewotICAgICAgICBhdXRvIHZpYURlZiA9IGl0LmZpcnN0OwotICAgICAgICBpZiAobnVtQ3V0c1t2aWFEZWZdID09IDEpIHsKLSAgICAgICAgICAgIGlmIChkZWZhdWx0U2luZ2xlQ3V0VmlhKSB7Ci0gICAgICAgICAgICAgIGF1dG8gZGVmYXVsdFZpYUFyZWEgPSBsYXllcjFBcmVhW2RlZmF1bHRTaW5nbGVDdXRWaWFdICsgbGF5ZXIyQXJlYVtkZWZhdWx0U2luZ2xlQ3V0VmlhXTsKLSAgICAgICAgICAgICAgYXV0byBjdXJyZW50VmlhQXJlYSA9IGxheWVyMUFyZWFbdmlhRGVmXSArIGxheWVyMkFyZWFbdmlhRGVmXTsKLSAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWaWFBcmVhIDwgZGVmYXVsdFZpYUFyZWEpIHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0U2luZ2xlQ3V0VmlhID0gdmlhRGVmOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBkZWZhdWx0U2luZ2xlQ3V0VmlhID0gdmlhRGVmOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGRlZmF1bHRTaW5nbGVDdXRWaWEpIHsKLSAgICAgIHRlY2gtPmdldExheWVyKGxheWVyTnVtKS0+c2V0RGVmYXVsdFZpYURlZihkZWZhdWx0U2luZ2xlQ3V0VmlhKTsKLSAgICB9IGVsc2UgewotICAgICAgY291dCA8PCJFcnJvcjogbm8gZGVmYXVsdCBzaW5nbGUtY3V0IHZpYSBhdmFpbGFibGUhIiA8PGVuZGw7Ci0gICAgICBleGl0KDApOwotICAgIH0KLSAgfQotfQotCi0vLyAxMW1fMnhhMXhkM3hlMnkycgotdm9pZCBpbzo6UGFyc2VyOjppbml0RGVmYXVsdFZpYXNfTjE2KGNvbnN0IHN0cmluZyAmbm9kZSkgewotICBmb3IgKGludCBsYXllck51bSA9IDE7IGxheWVyTnVtIDwgKGludCl0ZWNoLT5nZXRMYXllcnMoKS5zaXplKCk7IGxheWVyTnVtICs9IDIpIHsKLSAgICBmb3IgKGF1dG8gJnVWaWFEZWY6IHRlY2gtPmdldFZpYXMoKSkgewotICAgICAgYXV0byB2aWFEZWYgPSB1VmlhRGVmLmdldCgpOwotICAgICAgaWYgKHZpYURlZi0+Z2V0Q3V0TGF5ZXJOdW0oKSA9PSBsYXllck51bSAmJiBub2RlID09ICJOMTZfMTFtXzJ4YTF4ZDN4ZTJ5MnJfdXRyZGwiKSB7Ci0gICAgICAgIHN3aXRjaChsYXllck51bSkgewotICAgICAgICAgIGNhc2UgMSA6IC8vIFZJQTEKLSAgICAgICAgICAgICAgICAgICBpZiAodmlhRGVmLT5nZXROYW1lKCkgPT0gIk5SX1ZJQTFfUEgiKSB7Ci0gICAgICAgICAgICAgICAgICAgICB0ZWNoLT5nZXRMYXllcihsYXllck51bSktPnNldERlZmF1bHRWaWFEZWYodmlhRGVmKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAzIDogLy8gVklBMgotICAgICAgICAgICAgICAgICAgIGlmICh2aWFEZWYtPmdldE5hbWUoKSA9PSAiVklBMl8wXzI1XzNfMzJfSFZfVnhhIikgewotICAgICAgICAgICAgICAgICAgICAgdGVjaC0+Z2V0TGF5ZXIobGF5ZXJOdW0pLT5zZXREZWZhdWx0VmlhRGVmKHZpYURlZik7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgNSA6IC8vIFZJQTMKLSAgICAgICAgICAgICAgICAgICBpZiAodmlhRGVmLT5nZXROYW1lKCkgPT0gIlZJQTNfM18zNF80XzM1X1ZIX1Z4ZCIpIHsKLSAgICAgICAgICAgICAgICAgICAgIHRlY2gtPmdldExheWVyKGxheWVyTnVtKS0+c2V0RGVmYXVsdFZpYURlZih2aWFEZWYpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDcgOiAvLyBWSUE0Ci0gICAgICAgICAgICAgICAgICAgaWYgKHZpYURlZi0+Z2V0TmFtZSgpID09ICJWSUE0XzBfNTBfMF81MF9IVl9WeGUiKSB7Ci0gICAgICAgICAgICAgICAgICAgICB0ZWNoLT5nZXRMYXllcihsYXllck51bSktPnNldERlZmF1bHRWaWFEZWYodmlhRGVmKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSA5IDogLy8gVklBNQotICAgICAgICAgICAgICAgICAgIGlmICh2aWFEZWYtPmdldE5hbWUoKSA9PSAiVklBNV8wXzUwXzBfNTBfVkhfVnhlIikgewotICAgICAgICAgICAgICAgICAgICAgdGVjaC0+Z2V0TGF5ZXIobGF5ZXJOdW0pLT5zZXREZWZhdWx0VmlhRGVmKHZpYURlZik7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTE6IC8vIFZJQTYKLSAgICAgICAgICAgICAgICAgICBpZiAodmlhRGVmLT5nZXROYW1lKCkgPT0gIlZJQTZfMF81MF8wXzUwX0hWX1Z4ZSIpIHsKLSAgICAgICAgICAgICAgICAgICAgIHRlY2gtPmdldExheWVyKGxheWVyTnVtKS0+c2V0RGVmYXVsdFZpYURlZih2aWFEZWYpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDEzOiAvLyBWSUE3Ci0gICAgICAgICAgICAgICAgICAgaWYgKHZpYURlZi0+Z2V0TmFtZSgpID09ICJOUl9WSUE3X1ZIIikgewotICAgICAgICAgICAgICAgICAgICAgdGVjaC0+Z2V0TGF5ZXIobGF5ZXJOdW0pLT5zZXREZWZhdWx0VmlhRGVmKHZpYURlZik7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTU6IC8vIFZJQTgKLSAgICAgICAgICAgICAgICAgICBpZiAodmlhRGVmLT5nZXROYW1lKCkgPT0gIlZJQThfMF8yN18wXzI3X0hWX1Z5IikgewotICAgICAgICAgICAgICAgICAgICAgdGVjaC0+Z2V0TGF5ZXIobGF5ZXJOdW0pLT5zZXREZWZhdWx0VmlhRGVmKHZpYURlZik7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTc6IC8vIFZJQTkKLSAgICAgICAgICAgICAgICAgICBpZiAodmlhRGVmLT5nZXROYW1lKCkgPT0gIlZJQTlfMThfNzJfMThfNzJfVkhfVnIiKSB7Ci0gICAgICAgICAgICAgICAgICAgICB0ZWNoLT5nZXRMYXllcihsYXllck51bSktPnNldERlZmF1bHRWaWFEZWYodmlhRGVmKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAxOTogLy8gVklBMTAKLSAgICAgICAgICAgICAgICAgICBpZiAodmlhRGVmLT5nZXROYW1lKCkgPT0gIlZJQTEwXzE4XzcyXzE4XzcyX0hWX1ZyIikgewotICAgICAgICAgICAgICAgICAgICAgdGVjaC0+Z2V0TGF5ZXIobGF5ZXJOdW0pLT5zZXREZWZhdWx0VmlhRGVmKHZpYURlZik7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6IDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmICh2aWFEZWYtPmdldEN1dExheWVyTnVtKCkgPT0gbGF5ZXJOdW0gJiYgbm9kZSA9PSAiTjE2XzltXzJ4YTF4ZDR4ZTF6X3V0cmRsIikgewotICAgICAgICBzd2l0Y2gobGF5ZXJOdW0pIHsKLSAgICAgICAgICBjYXNlIDEgOiAvLyBWSUExCi0gICAgICAgICAgICAgICAgICAgaWYgKHZpYURlZi0+Z2V0TmFtZSgpID09ICJOUl9WSUExX1BIIikgewotICAgICAgICAgICAgICAgICAgICAgdGVjaC0+Z2V0TGF5ZXIobGF5ZXJOdW0pLT5zZXREZWZhdWx0VmlhRGVmKHZpYURlZik7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMyA6IC8vIFZJQTIKLSAgICAgICAgICAgICAgICAgICBpZiAodmlhRGVmLT5nZXROYW1lKCkgPT0gIlZJQTJfMF8yNV8zXzMyX0hWX1Z4YSIpIHsKLSAgICAgICAgICAgICAgICAgICAgIHRlY2gtPmdldExheWVyKGxheWVyTnVtKS0+c2V0RGVmYXVsdFZpYURlZih2aWFEZWYpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDUgOiAvLyBWSUEzCi0gICAgICAgICAgICAgICAgICAgaWYgKHZpYURlZi0+Z2V0TmFtZSgpID09ICJWSUEzXzNfMzRfNF8zNV9WSF9WeGQiKSB7Ci0gICAgICAgICAgICAgICAgICAgICB0ZWNoLT5nZXRMYXllcihsYXllck51bSktPnNldERlZmF1bHRWaWFEZWYodmlhRGVmKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSA3IDogLy8gVklBNAotICAgICAgICAgICAgICAgICAgIGlmICh2aWFEZWYtPmdldE5hbWUoKSA9PSAiVklBNF8wXzUwXzBfNTBfSFZfVnhlIikgewotICAgICAgICAgICAgICAgICAgICAgdGVjaC0+Z2V0TGF5ZXIobGF5ZXJOdW0pLT5zZXREZWZhdWx0VmlhRGVmKHZpYURlZik7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgOSA6IC8vIFZJQTUKLSAgICAgICAgICAgICAgICAgICBpZiAodmlhRGVmLT5nZXROYW1lKCkgPT0gIlZJQTVfMF81MF8wXzUwX1ZIX1Z4ZSIpIHsKLSAgICAgICAgICAgICAgICAgICAgIHRlY2gtPmdldExheWVyKGxheWVyTnVtKS0+c2V0RGVmYXVsdFZpYURlZih2aWFEZWYpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDExOiAvLyBWSUE2Ci0gICAgICAgICAgICAgICAgICAgaWYgKHZpYURlZi0+Z2V0TmFtZSgpID09ICJWSUE2XzBfNTBfMF81MF9IVl9WeGUiKSB7Ci0gICAgICAgICAgICAgICAgICAgICB0ZWNoLT5nZXRMYXllcihsYXllck51bSktPnNldERlZmF1bHRWaWFEZWYodmlhRGVmKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAxMzogLy8gVklBNwotICAgICAgICAgICAgICAgICAgIGlmICh2aWFEZWYtPmdldE5hbWUoKSA9PSAiVklBN18wXzUwXzBfNTBfVkhfVnhlIikgewotICAgICAgICAgICAgICAgICAgICAgdGVjaC0+Z2V0TGF5ZXIobGF5ZXJOdW0pLT5zZXREZWZhdWx0VmlhRGVmKHZpYURlZik7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTU6IC8vIFZJQTgKLSAgICAgICAgICAgICAgICAgICBpZiAodmlhRGVmLT5nZXROYW1lKCkgPT0gIlZJQThfMThfNzJfMThfNzJfSFZfVnoiKSB7Ci0gICAgICAgICAgICAgICAgICAgICB0ZWNoLT5nZXRMYXllcihsYXllck51bSktPnNldERlZmF1bHRWaWFEZWYodmlhRGVmKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAxNzogLy8gVklBOQotICAgICAgICAgICAgICAgICAgIGlmICh2aWFEZWYtPmdldE5hbWUoKSA9PSAiUlZfNDUwXzQ1MF80NTBfNDUwX1hYX1JWIikgewotICAgICAgICAgICAgICAgICAgICAgdGVjaC0+Z2V0TGF5ZXIobGF5ZXJOdW0pLT5zZXREZWZhdWx0VmlhRGVmKHZpYURlZik7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6IDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmICh2aWFEZWYtPmdldEN1dExheWVyTnVtKCkgPT0gbGF5ZXJOdW0gJiYgbm9kZSA9PSAiTjE2XzltXzJ4YTF4ZDN4ZTJ6X3V0cmRsIikgewotICAgICAgICBzd2l0Y2gobGF5ZXJOdW0pIHsKLSAgICAgICAgICBjYXNlIDEgOiAvLyBWSUExCi0gICAgICAgICAgICAgICAgICAgaWYgKHZpYURlZi0+Z2V0TmFtZSgpID09ICJOUl9WSUExX1BIIikgewotICAgICAgICAgICAgICAgICAgICAgdGVjaC0+Z2V0TGF5ZXIobGF5ZXJOdW0pLT5zZXREZWZhdWx0VmlhRGVmKHZpYURlZik7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMyA6IC8vIFZJQTIKLSAgICAgICAgICAgICAgICAgICBpZiAodmlhRGVmLT5nZXROYW1lKCkgPT0gIlZJQTJfMF8yNV8zXzMyX0hWX1Z4YSIpIHsKLSAgICAgICAgICAgICAgICAgICAgIHRlY2gtPmdldExheWVyKGxheWVyTnVtKS0+c2V0RGVmYXVsdFZpYURlZih2aWFEZWYpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDUgOiAvLyBWSUEzCi0gICAgICAgICAgICAgICAgICAgaWYgKHZpYURlZi0+Z2V0TmFtZSgpID09ICJWSUEzXzNfMzRfNF8zNV9WSF9WeGQiKSB7Ci0gICAgICAgICAgICAgICAgICAgICB0ZWNoLT5nZXRMYXllcihsYXllck51bSktPnNldERlZmF1bHRWaWFEZWYodmlhRGVmKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSA3IDogLy8gVklBNAotICAgICAgICAgICAgICAgICAgIGlmICh2aWFEZWYtPmdldE5hbWUoKSA9PSAiVklBNF8wXzUwXzBfNTBfSFZfVnhlIikgewotICAgICAgICAgICAgICAgICAgICAgdGVjaC0+Z2V0TGF5ZXIobGF5ZXJOdW0pLT5zZXREZWZhdWx0VmlhRGVmKHZpYURlZik7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgOSA6IC8vIFZJQTUKLSAgICAgICAgICAgICAgICAgICBpZiAodmlhRGVmLT5nZXROYW1lKCkgPT0gIlZJQTVfMF81MF8wXzUwX1ZIX1Z4ZSIpIHsKLSAgICAgICAgICAgICAgICAgICAgIHRlY2gtPmdldExheWVyKGxheWVyTnVtKS0+c2V0RGVmYXVsdFZpYURlZih2aWFEZWYpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDExOiAvLyBWSUE2Ci0gICAgICAgICAgICAgICAgICAgaWYgKHZpYURlZi0+Z2V0TmFtZSgpID09ICJWSUE2XzBfNTBfMF81MF9IVl9WeGUiKSB7Ci0gICAgICAgICAgICAgICAgICAgICB0ZWNoLT5nZXRMYXllcihsYXllck51bSktPnNldERlZmF1bHRWaWFEZWYodmlhRGVmKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAxMzogLy8gVklBNwotICAgICAgICAgICAgICAgICAgIGlmICh2aWFEZWYtPmdldE5hbWUoKSA9PSAiVklBN18xOF83Ml8xOF83Ml9WSF9WeiIpIHsKLSAgICAgICAgICAgICAgICAgICAgIHRlY2gtPmdldExheWVyKGxheWVyTnVtKS0+c2V0RGVmYXVsdFZpYURlZih2aWFEZWYpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDE1OiAvLyBWSUE4Ci0gICAgICAgICAgICAgICAgICAgaWYgKHZpYURlZi0+Z2V0TmFtZSgpID09ICJWSUE4XzE4XzcyXzE4XzcyX0hWX1Z6IikgewotICAgICAgICAgICAgICAgICAgICAgdGVjaC0+Z2V0TGF5ZXIobGF5ZXJOdW0pLT5zZXREZWZhdWx0VmlhRGVmKHZpYURlZik7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTc6IC8vIFZJQTkKLSAgICAgICAgICAgICAgICAgICBpZiAodmlhRGVmLT5nZXROYW1lKCkgPT0gIlJWXzQ1MF80NTBfNDUwXzQ1MF9YWF9SViIpIHsKLSAgICAgICAgICAgICAgICAgICAgIHRlY2gtPmdldExheWVyKGxheWVyTnVtKS0+c2V0RGVmYXVsdFZpYURlZih2aWFEZWYpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OiA7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBpbzo6UGFyc2VyOjpwb3N0UHJvY2VzcygpIHsKLSAgaWYgKERCUFJPQ0VTU05PREUgPT0gIk4xNl8xMW1fMnhhMXhkM3hlMnkycl91dHJkbCIpIHsKLSAgICBpbml0RGVmYXVsdFZpYXNfTjE2KERCUFJPQ0VTU05PREUpOwotICB9IGVsc2UgewotICAgIGluaXREZWZhdWx0VmlhcygpOwotICB9Ci0gIHRlY2gtPnByaW50RGVmYXVsdFZpYXMoKTsKLQotCi0gIGluc3RBbmFseXNpcygpOwotCi0gIC8vIGluaXQgcmVnaW9uIHF1ZXJ5Ci0gIGNvdXQgPDxlbmRsIDw8ImluaXQgcmVnaW9uIHF1ZXJ5IC4uLiIgPDxlbmRsOwotICBkZXNpZ24tPmdldFJlZ2lvblF1ZXJ5KCktPmluaXQoZGVzaWduLT5nZXRUZWNoKCktPmdldExheWVycygpLnNpemUoKSk7Ci0gIGRlc2lnbi0+Z2V0UmVnaW9uUXVlcnkoKS0+cHJpbnQoKTsKLSAgLy8gdGVzdAotICAvKgotICBmckJveCBib3goMzcyNTAwLCAxNzY1NTAwLCAzNzU1MDAsIDE3Njg1MDApOwotICBmb3IgKGZyTGF5ZXJOdW0gaSA9IDA7IGkgPCAoaW50KWRlc2lnbi0+Z2V0VGVjaCgpLT5nZXRMYXllcnMoKS5zaXplKCk7IGkrKykgewotICAgIHZlY3RvcjxycV9ycHRyX3ZhbHVlX3Q8ZnJCbG9ja09iamVjdD4gPiByZXN1bHQ7Ci0gICAgZGVzaWduLT5nZXRSZWdpb25RdWVyeSgpLT5xdWVyeShib3gsIGksIHJlc3VsdCk7Ci0gICAgZm9yIChhdXRvICZbYkJveCwgcnB0cl06IHJlc3VsdCkgewotICAgICAgY291dCA8PCJiQm94ICgiIDw8Ymc6OmdldDxiZzo6bWluX2Nvcm5lciwgMD4oYkJveCkgKiAxLjAgLyBkZXNpZ24tPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCkgPDwiLCAiCi0gICAgICAgICAgICAgICAgICAgICAgPDxiZzo6Z2V0PGJnOjptaW5fY29ybmVyLCAxPihiQm94KSAqIDEuMCAvIGRlc2lnbi0+Z2V0VG9wQmxvY2soKS0+Z2V0REJVUGVyVVUoKSA8PCIpICgiCi0gICAgICAgICAgICAgICAgICAgICAgPDxiZzo6Z2V0PGJnOjptYXhfY29ybmVyLCAwPihiQm94KSAqIDEuMCAvIGRlc2lnbi0+Z2V0VG9wQmxvY2soKS0+Z2V0REJVUGVyVVUoKSA8PCIsICIKLSAgICAgICAgICAgICAgICAgICAgICA8PGJnOjpnZXQ8Ymc6Om1heF9jb3JuZXIsIDE+KGJCb3gpICogMS4wIC8gZGVzaWduLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpIDw8IikgIgotICAgICAgICAgICAgICAgICAgICAgIDw8ZGVzaWduLT5nZXRUZWNoKCktPmdldExheWVyKGkpLT5nZXROYW1lKCkgPDxlbmRsOwotICAgICAgaWYgKHJwdHItPnR5cGVJZCgpID09IGZyY0luc3RUZXJtKSB7Ci0gICAgICAgIGNvdXQgPDwiIGluc3RUZXJtICIgPDxzdGF0aWNfY2FzdDxmckluc3RUZXJtKj4ocnB0ciktPmdldEluc3QoKS0+Z2V0TmFtZSgpIDw8Ii8iCi0gICAgICAgICAgICAgPDxzdGF0aWNfY2FzdDxmckluc3RUZXJtKj4ocnB0ciktPmdldFRlcm0oKS0+Z2V0TmFtZSgpIDw8ZW5kbDsKLSAgICAgIH0gZWxzZSBpZiAocnB0ci0+dHlwZUlkKCkgPT0gZnJjVGVybSkgewotICAgICAgICBjb3V0IDw8IiAgICAgdGVybSBQSU4vIiA8PHN0YXRpY19jYXN0PGZyVGVybSo+KHJwdHIpLT5nZXROYW1lKCkgPDxlbmRsOwotICAgICAgfSBlbHNlIGlmIChycHRyLT50eXBlSWQoKSA9PSBmcmNMYXllckJsb2NrYWdlKSB7Ci0gICAgICAgIGNvdXQgPDwiICAgICBsYmxrIiA8PGVuZGw7Ci0gICAgICB9IGVsc2UgaWYgKHJwdHItPnR5cGVJZCgpID09IGZyY1BhdGhTZWcpIHsKLSAgICAgICAgY291dCA8PCIgICAgIHBzZWcgIjsKLSAgICAgICAgaWYgKHN0YXRpY19jYXN0PGZyUGF0aFNlZyo+KHJwdHIpLT5oYXNOZXQoKSkgewotICAgICAgICAgIGNvdXQgPDxzdGF0aWNfY2FzdDxmclBhdGhTZWcqPihycHRyKS0+Z2V0TmV0KCktPmdldE5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICBjb3V0IDw8ZW5kbDsKLSAgICAgIH0gZWxzZSBpZiAocnB0ci0+dHlwZUlkKCkgPT0gZnJjVmlhKSB7Ci0gICAgICAgIGNvdXQgPDwiICAgICAgdmlhICI7Ci0gICAgICAgIGlmIChzdGF0aWNfY2FzdDxmclZpYSo+KHJwdHIpLT5oYXNOZXQoKSkgewotICAgICAgICAgIGNvdXQgPDxzdGF0aWNfY2FzdDxmclZpYSo+KHJwdHIpLT5nZXROZXQoKS0+Z2V0TmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNvdXQgPDxlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogdW5rbm93biB0eXBlIGluIHJxIHRlc3QiIDw8ZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0qLwotfQotCi12b2lkIGlvOjpQYXJzZXI6OnBvc3RQcm9jZXNzR3VpZGUoKSB7Ci0gIGlmIChWRVJCT1NFID4gMCkgewotICAgIGNvdXQgPDxlbmRsIDw8InBvc3QgcHJvY2VzcyBndWlkZXMgLi4uIiA8PGVuZGw7Ci0gIH0KLSAgYnVpbGRHQ2VsbFBhdHRlcm5zKCk7Ci0gIAotICBpbnQgY250ID0gMDsKLSAgLy9mb3IgKGF1dG8gJltuZXROYW1lLCByZWN0c106dG1wR3VpZGVzKSB7Ci0gIC8vICBpZiAoZGVzaWduLT5nZXRUb3BCbG9jaygpLT5uYW1lMm5ldC5maW5kKG5ldE5hbWUpID09IGRlc2lnbi0+Z2V0VG9wQmxvY2soKS0+bmFtZTJuZXQuZW5kKCkpIHsKLSAgLy8gICAgY291dCA8PCJFcnJvcjogcG9zdFByb2Nlc3NHdWlkZSBjYW5ub3QgZmluZCBuZXQiIDw8ZW5kbDsKLSAgLy8gICAgZXhpdCgxKTsKLSAgLy8gIH0KLSAgLy8gIGF1dG8gbmV0ID0gZGVzaWduLT5nZXRUb3BCbG9jaygpLT5uYW1lMm5ldFtuZXROYW1lXTsKLSAgZm9yIChhdXRvICZbbmV0LCByZWN0c106dG1wR3VpZGVzKSB7Ci0gICAgZ2VuR3VpZGVzKG5ldCwgcmVjdHMpOwotICAgIGNudCsrOwotICAgIGlmIChWRVJCT1NFID4gMCkgewotICAgICAgaWYgKGNudCA8IDEwMDAwMCkgewotICAgICAgICBpZiAoY250ICUgMTAwMDAgPT0gMCkgewotICAgICAgICAgIGNvdXQgPDwiICBjb21wbGV0ZSAiIDw8Y250IDw8IiBuZXRzIiA8PGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChjbnQgJSAxMDAwMDAgPT0gMCkgewotICAgICAgICAgIGNvdXQgPDwiICBjb21wbGV0ZSAiIDw8Y250IDw8IiBuZXRzIiA8PGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBnbG9iYWwgdW5pcXVlIGlkIGZvciBndWlkZXMKLSAgaW50IGN1cnJJZCA9IDA7Ci0gIGZvciAoYXV0byAmbmV0OiBkZXNpZ24tPmdldFRvcEJsb2NrKCktPmdldE5ldHMoKSkgewotICAgIGZvciAoYXV0byAmZ3VpZGU6IG5ldC0+Z2V0R3VpZGVzKCkpIHsKLSAgICAgIGd1aWRlLT5zZXRJZChjdXJySWQpOwotICAgICAgY3VycklkKys7Ci0gICAgfQotICB9Ci0KLSAgYnVpbGRDTWFwKCk7Ci0gIAotICBjb3V0IDw8ZW5kbCA8PCJpbml0IGd1aWRlIHF1ZXJ5IC4uLiIgPDxlbmRsOwotICBkZXNpZ24tPmdldFJlZ2lvblF1ZXJ5KCktPmluaXRHdWlkZShkZXNpZ24tPmdldFRlY2goKS0+Z2V0TGF5ZXJzKCkuc2l6ZSgpKTsKLSAgZGVzaWduLT5nZXRSZWdpb25RdWVyeSgpLT5wcmludEd1aWRlKCk7Ci0gIGNvdXQgPDxlbmRsIDw8ImluaXQgZ3IgcGluIHF1ZXJ5IC4uLiIgPDxlbmRsOwotICBkZXNpZ24tPmdldFJlZ2lvblF1ZXJ5KCktPmluaXRHUlBpbih0bXBHUlBpbnMpOwotCi0gIGlmIChPVVRHVUlERV9GSUxFID09IHN0cmluZygiIikpIHsKLSAgICA7Ci0gIH0gZWxzZSB7Ci0gICAgd3JpdGVHdWlkZUZpbGUoKTsKLSAgfQotCi19Ci0KLXZvaWQgaW86OlBhcnNlcjo6YnVpbGRHQ2VsbFBhdHRlcm5zX2hlbHBlcihmckNvb3JkICZHQ0VMTEdSSURYLCBmckNvb3JkICZHQ0VMTEdSSURZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyQ29vcmQgJkdDRUxMT0ZGU0VUWCwgZnJDb29yZCAmR0NFTExPRkZTRVRZKSB7Ci0gIGJ1aWxkR0NlbGxQYXR0ZXJuc19nZXRXaWR0aChHQ0VMTEdSSURYLCBHQ0VMTEdSSURZKTsKLSAgYnVpbGRHQ2VsbFBhdHRlcm5zX2dldE9mZnNldChHQ0VMTEdSSURYLCBHQ0VMTEdSSURZLCBHQ0VMTE9GRlNFVFgsIEdDRUxMT0ZGU0VUWSk7Ci19Ci0KLXZvaWQgaW86OlBhcnNlcjo6YnVpbGRHQ2VsbFBhdHRlcm5zX2dldFdpZHRoKGZyQ29vcmQgJkdDRUxMR1JJRFgsIGZyQ29vcmQgJkdDRUxMR1JJRFkpIHsKLSAgbWFwPGZyQ29vcmQsIGludD4gZ3VpZGVHcmlkWE1hcCwgZ3VpZGVHcmlkWU1hcDsKLSAgLy8gZ2V0IEdDZWxsIHNpemUgaW5mb3JtYXRpb24gbG9vcAotICBmb3IgKGF1dG8gJltuZXROYW1lLCByZWN0c106IHRtcEd1aWRlcykgewotICAgIGZvciAoYXV0byAmcmVjdDogcmVjdHMpIHsKLSAgICAgIGZyTGF5ZXJOdW0gbGF5ZXJOdW0gPSByZWN0LmdldExheWVyTnVtKCk7Ci0gICAgICBmckJveCBndWlkZUJCb3g7Ci0gICAgICByZWN0LmdldEJCb3goZ3VpZGVCQm94KTsKLSAgICAgIGZyQ29vcmQgZ3VpZGVXaWR0aCA9ICh0ZWNoLT5nZXRMYXllcihsYXllck51bSktPmdldERpcigpID09IGZyY0hvcnpQcmVmUm91dGluZ0RpcikgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKGd1aWRlQkJveC50b3AoKSAtIGd1aWRlQkJveC5ib3R0b20oKSk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3VpZGVCQm94LnJpZ2h0KCkgLSBndWlkZUJCb3gubGVmdCgpKTsKLSAgICAgIGlmICh0ZWNoLT5nZXRMYXllcihsYXllck51bSktPmdldERpcigpID09IGZyY0hvcnpQcmVmUm91dGluZ0RpcikgewotICAgICAgICBpZiAoZ3VpZGVHcmlkWU1hcC5maW5kKGd1aWRlV2lkdGgpID09IGd1aWRlR3JpZFlNYXAuZW5kKCkpIHsKLSAgICAgICAgICBndWlkZUdyaWRZTWFwW2d1aWRlV2lkdGhdID0gMDsKLSAgICAgICAgfQotICAgICAgICBndWlkZUdyaWRZTWFwW2d1aWRlV2lkdGhdKys7Ci0gICAgICB9IGVsc2UgaWYgKHRlY2gtPmdldExheWVyKGxheWVyTnVtKS0+Z2V0RGlyKCkgPT0gZnJjVmVydFByZWZSb3V0aW5nRGlyKSB7Ci0gICAgICAgIGlmIChndWlkZUdyaWRYTWFwLmZpbmQoZ3VpZGVXaWR0aCkgPT0gZ3VpZGVHcmlkWE1hcC5lbmQoKSkgewotICAgICAgICAgIGd1aWRlR3JpZFhNYXBbZ3VpZGVXaWR0aF0gPSAwOwotICAgICAgICB9Ci0gICAgICAgIGd1aWRlR3JpZFhNYXBbZ3VpZGVXaWR0aF0rKzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgZnJDb29yZCB0bXBHQ0VMTEdSSURYID0gLTEsIHRtcEdDRUxMR1JJRFkgPSAtMTsKLSAgaW50IHRtcEdDRUxMR1JJRFhDbnQgPSAtMSwgdG1wR0NFTExHUklEWUNudCA9IC0xOwotICBmb3IgKGF1dG8gbWFwSXQgPSBndWlkZUdyaWRYTWFwLmJlZ2luKCk7IG1hcEl0ICE9IGd1aWRlR3JpZFhNYXAuZW5kKCk7ICsrbWFwSXQpIHsKLSAgICBhdXRvIGNudCA9IG1hcEl0LT5zZWNvbmQ7Ci0gICAgaWYgKGNudCA+IHRtcEdDRUxMR1JJRFhDbnQpIHsKLSAgICAgIHRtcEdDRUxMR1JJRFhDbnQgPSBjbnQ7Ci0gICAgICB0bXBHQ0VMTEdSSURYID0gbWFwSXQtPmZpcnN0OwotICAgIH0KLSAgICAvL2NvdXQgPDwiWCB3aWR0aD0iIDw8bWFwSXQtPmZpcnN0IDw8Ii8iIDw8bWFwSXQtPnNlY29uZCA8PGVuZGw7Ci0gIH0KLSAgZm9yIChhdXRvIG1hcEl0ID0gZ3VpZGVHcmlkWU1hcC5iZWdpbigpOyBtYXBJdCAhPSBndWlkZUdyaWRZTWFwLmVuZCgpOyArK21hcEl0KSB7Ci0gICAgYXV0byBjbnQgPSBtYXBJdC0+c2Vjb25kOwotICAgIGlmIChjbnQgPiB0bXBHQ0VMTEdSSURZQ250KSB7Ci0gICAgICB0bXBHQ0VMTEdSSURZQ250ID0gY250OwotICAgICAgdG1wR0NFTExHUklEWSA9IG1hcEl0LT5maXJzdDsKLSAgICB9Ci0gICAgLy9jb3V0IDw8Ilkgd2lkdGg9IiA8PG1hcEl0LT5maXJzdCA8PCIvIiA8PG1hcEl0LT5zZWNvbmQgPDxlbmRsOwotICB9Ci0gIGlmICh0bXBHQ0VMTEdSSURYICE9IC0xKSB7Ci0gICAgR0NFTExHUklEWCA9IHRtcEdDRUxMR1JJRFg7Ci0gIH0gZWxzZSB7Ci0gICAgY291dCA8PCJFcnJvcjogbm8gR0NFTExHUklEWCIgPDxlbmRsOwotICAgIGV4aXQoMSk7Ci0gIH0KLSAgaWYgKHRtcEdDRUxMR1JJRFkgIT0gLTEpIHsKLSAgICBHQ0VMTEdSSURZID0gdG1wR0NFTExHUklEWTsKLSAgfSBlbHNlIHsKLSAgICBjb3V0IDw8IkVycm9yOiBubyBHQ0VMTEdSSURZIiA8PGVuZGw7Ci0gICAgZXhpdCgxKTsKLSAgfQotfQotCi12b2lkIGlvOjpQYXJzZXI6OmJ1aWxkR0NlbGxQYXR0ZXJuc19nZXRPZmZzZXQoZnJDb29yZCBHQ0VMTEdSSURYLCBmckNvb3JkIEdDRUxMR1JJRFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJDb29yZCAmR0NFTExPRkZTRVRYLCBmckNvb3JkICZHQ0VMTE9GRlNFVFkpIHsKLSAgc3RkOjptYXA8ZnJDb29yZCwgaW50PiBndWlkZU9mZnNldFhNYXAsIGd1aWRlT2Zmc2V0WU1hcDsKLSAgLy8gZ2V0IEdDZWxsIG9mZnNldCBpbmZvcm1hdGlvbiBsb29wCi0gIGZvciAoYXV0byAmW25ldE5hbWUsIHJlY3RzXTogdG1wR3VpZGVzKSB7Ci0gICAgZm9yIChhdXRvICZyZWN0OiByZWN0cykgewotICAgICAgLy9mckxheWVyTnVtIGxheWVyTnVtID0gcmVjdC5nZXRMYXllck51bSgpOwotICAgICAgZnJCb3ggZ3VpZGVCQm94OwotICAgICAgcmVjdC5nZXRCQm94KGd1aWRlQkJveCk7Ci0gICAgICBmckNvb3JkIGd1aWRlWE9mZnNldCA9IGd1aWRlQkJveC5sZWZ0KCkgJSBHQ0VMTEdSSURYOwotICAgICAgZnJDb29yZCBndWlkZVlPZmZzZXQgPSBndWlkZUJCb3guYm90dG9tKCkgJSBHQ0VMTEdSSURZOwotICAgICAgaWYgKGd1aWRlWE9mZnNldCA8IDApIHsKLSAgICAgICAgZ3VpZGVYT2Zmc2V0ID0gR0NFTExHUklEWCAtIGd1aWRlWE9mZnNldDsKLSAgICAgIH0KLSAgICAgIGlmIChndWlkZVlPZmZzZXQgPCAwKSB7Ci0gICAgICAgIGd1aWRlWU9mZnNldCA9IEdDRUxMR1JJRFkgLSBndWlkZVlPZmZzZXQ7Ci0gICAgICB9Ci0gICAgICBpZiAoZ3VpZGVPZmZzZXRYTWFwLmZpbmQoZ3VpZGVYT2Zmc2V0KSA9PSBndWlkZU9mZnNldFhNYXAuZW5kKCkpIHsKLSAgICAgICAgZ3VpZGVPZmZzZXRYTWFwW2d1aWRlWE9mZnNldF0gPSAwOwotICAgICAgfQotICAgICAgZ3VpZGVPZmZzZXRYTWFwW2d1aWRlWE9mZnNldF0rKzsKLSAgICAgIGlmIChndWlkZU9mZnNldFlNYXAuZmluZChndWlkZVlPZmZzZXQpID09IGd1aWRlT2Zmc2V0WU1hcC5lbmQoKSkgewotICAgICAgICBndWlkZU9mZnNldFlNYXBbZ3VpZGVZT2Zmc2V0XSA9IDA7Ci0gICAgICB9Ci0gICAgICBndWlkZU9mZnNldFlNYXBbZ3VpZGVZT2Zmc2V0XSsrOwotICAgIH0KLSAgfQotICBmckNvb3JkIHRtcEdDRUxMT0ZGU0VUWCA9IC0xLCB0bXBHQ0VMTE9GRlNFVFkgPSAtMTsKLSAgaW50IHRtcEdDRUxMT0ZGU0VUWENudCA9IC0xLCB0bXBHQ0VMTE9GRlNFVFlDbnQgPSAtMTsKLSAgZm9yIChhdXRvIG1hcEl0ID0gZ3VpZGVPZmZzZXRYTWFwLmJlZ2luKCk7IG1hcEl0ICE9IGd1aWRlT2Zmc2V0WE1hcC5lbmQoKTsgKyttYXBJdCkgewotICAgIGF1dG8gY250ID0gbWFwSXQtPnNlY29uZDsKLSAgICBpZiAoY250ID4gdG1wR0NFTExPRkZTRVRYQ250KSB7Ci0gICAgICB0bXBHQ0VMTE9GRlNFVFhDbnQgPSBjbnQ7Ci0gICAgICB0bXBHQ0VMTE9GRlNFVFggPSBtYXBJdC0+Zmlyc3Q7Ci0gICAgfQotICB9Ci0gIGZvciAoYXV0byBtYXBJdCA9IGd1aWRlT2Zmc2V0WU1hcC5iZWdpbigpOyBtYXBJdCAhPSBndWlkZU9mZnNldFlNYXAuZW5kKCk7ICsrbWFwSXQpIHsKLSAgICBhdXRvIGNudCA9IG1hcEl0LT5zZWNvbmQ7Ci0gICAgaWYgKGNudCA+IHRtcEdDRUxMT0ZGU0VUWUNudCkgewotICAgICAgdG1wR0NFTExPRkZTRVRZQ250ID0gY250OwotICAgICAgdG1wR0NFTExPRkZTRVRZID0gbWFwSXQtPmZpcnN0OwotICAgIH0KLSAgfQotICBpZiAodG1wR0NFTExPRkZTRVRYICE9IC0xKSB7Ci0gICAgR0NFTExPRkZTRVRYID0gdG1wR0NFTExPRkZTRVRYOwotICB9IGVsc2UgewotICAgIGNvdXQgPDwiRXJyb3I6IG5vIEdDRUxMR1JJRFgiIDw8ZW5kbDsKLSAgICBleGl0KDEpOwotICB9IAotICBpZiAodG1wR0NFTExPRkZTRVRZICE9IC0xKSB7Ci0gICAgR0NFTExPRkZTRVRZID0gdG1wR0NFTExPRkZTRVRZOwotICB9IGVsc2UgewotICAgIGNvdXQgPDwiRXJyb3I6IG5vIEdDRUxMR1JJRFgiIDw8ZW5kbDsKLSAgICBleGl0KDEpOwotICB9Ci19Ci0KLXZvaWQgaW86OlBhcnNlcjo6YnVpbGRHQ2VsbFBhdHRlcm5zKCkgewotICAvLyBob3Jpem9udGFsID0gZmFsc2UgaXMgZ2NlbGwgbGluZXMgYWxvbmcgeSBkaXJlY3Rpb24gKHgtZ3JpZCkKLSAgZnJCb3ggZGllQm94OwotICBkZXNpZ24tPmdldFRvcEJsb2NrKCktPmdldEJvdW5kYXJ5QkJveChkaWVCb3gpOwotCi0gIGZyQ29vcmQgR0NFTExPRkZTRVRYLCBHQ0VMTE9GRlNFVFksIEdDRUxMR1JJRFgsIEdDRUxMR1JJRFk7Ci0gIGJ1aWxkR0NlbGxQYXR0ZXJuc19oZWxwZXIoR0NFTExHUklEWCwgR0NFTExHUklEWSwgR0NFTExPRkZTRVRYLCBHQ0VMTE9GRlNFVFkpOwotCi0gIGZyR0NlbGxQYXR0ZXJuIHhncDsKLSAgeGdwLnNldEhvcml6b250YWwoZmFsc2UpOwotICAvLyBmaW5kIGZpcnN0IGNvb3JkID49IGRpZUJveC5sZWZ0KCkKLSAgZnJDb29yZCBzdGFydENvb3JkWCA9IGRpZUJveC5sZWZ0KCkgLyAoZnJDb29yZClHQ0VMTEdSSURYICogKGZyQ29vcmQpR0NFTExHUklEWDsKLSAgLy9jb3V0IDw8ImhlcmUgIiA8PGRpZUJveC5sZWZ0KCkgPDwiICIgPDxHQ0VMTEdSSURYIDw8ZW5kbDsKLSAgaWYgKHN0YXJ0Q29vcmRYIDwgZGllQm94LmxlZnQoKSkgewotICAgIHN0YXJ0Q29vcmRYICs9IChmckNvb3JkKUdDRUxMR1JJRFg7Ci0gIH0KLSAgeGdwLnNldFN0YXJ0Q29vcmQoc3RhcnRDb29yZFgpOwotICAvL3hncC5zZXRTdGFydENvb3JkKEdDRUxMT0ZGU0VUWCk7Ci0gIHhncC5zZXRTcGFjaW5nKEdDRUxMR1JJRFgpOwotICBpZiAoKGRpZUJveC5yaWdodCgpIC0gKGZyQ29vcmQpR0NFTExPRkZTRVRYKSAvIChmckNvb3JkKUdDRUxMR1JJRFggPCAxKSB7Ci0gICAgY291dCA8PCJFcnJvcjogZ2NlbGwgY250IDwgMSIgPDxlbmRsOwotICAgIGV4aXQoMSk7Ci0gIH0KLSAgLy94Z3Auc2V0Q291bnQoKGRpZUJveC5yaWdodCgpIC0gR0NFTExPRkZTRVRYKSAvIEdDRUxMR1JJRFggKyAxKTsKLSAgeGdwLnNldENvdW50KChkaWVCb3gucmlnaHQoKSAtIChmckNvb3JkKXN0YXJ0Q29vcmRYKSAvIChmckNvb3JkKUdDRUxMR1JJRFgpOwotICAKLSAgZnJHQ2VsbFBhdHRlcm4geWdwOwotICB5Z3Auc2V0SG9yaXpvbnRhbCh0cnVlKTsKLSAgLy8gZmluZCBmaXJzdCBjb29yZCA+PSBkaWVCb3guYm90dG9tKCkKLSAgZnJDb29yZCBzdGFydENvb3JkWSA9IGRpZUJveC5ib3R0b20oKSAvIChmckNvb3JkKUdDRUxMR1JJRFkgKiAoZnJDb29yZClHQ0VMTEdSSURZOwotICBpZiAoc3RhcnRDb29yZFkgPCBkaWVCb3guYm90dG9tKCkpIHsKLSAgICBzdGFydENvb3JkWSArPSAoZnJDb29yZClHQ0VMTEdSSURZOwotICB9Ci0gIHlncC5zZXRTdGFydENvb3JkKHN0YXJ0Q29vcmRZKTsKLSAgLy95Z3Auc2V0U3RhcnRDb29yZChHQ0VMTE9GRlNFVFkpOwotICB5Z3Auc2V0U3BhY2luZyhHQ0VMTEdSSURZKTsKLSAgaWYgKChkaWVCb3gudG9wKCkgLSAoZnJDb29yZClHQ0VMTE9GRlNFVFkpIC8gKGZyQ29vcmQpR0NFTExHUklEWSA8IDEpIHsKLSAgICBjb3V0IDw8IkVycm9yOiBnY2VsbCBjbnQgPCAxIiA8PGVuZGw7Ci0gICAgZXhpdCgxKTsKLSAgfQotICAvL3lncC5zZXRDb3VudCgoZGllQm94LnRvcCgpIC0gR0NFTExPRkZTRVRZKSAvIEdDRUxMR1JJRFkgKyAxKTsKLSAgeWdwLnNldENvdW50KChkaWVCb3gudG9wKCkgLSBzdGFydENvb3JkWSkgLyAoZnJDb29yZClHQ0VMTEdSSURZKTsKLQotICBpZiAoVkVSQk9TRSA+IDApIHsKLSAgICBjb3V0IDw8IkdDRUxMR1JJRCBYICIgPDx5Z3AuZ2V0U3RhcnRDb29yZCgpIDw8IiBETyAiIDw8eWdwLmdldENvdW50KCkgPDwiIFNURVAgIiA8PHlncC5nZXRTcGFjaW5nKCkgPDwiIDsiIDw8ZW5kbDsKLSAgICBjb3V0IDw8IkdDRUxMR1JJRCBZICIgPDx4Z3AuZ2V0U3RhcnRDb29yZCgpIDw8IiBETyAiIDw8eGdwLmdldENvdW50KCkgPDwiIFNURVAgIiA8PHhncC5nZXRTcGFjaW5nKCkgPDwiIDsiIDw8ZW5kbDsKLSAgfQotCi0gIGRlc2lnbi0+Z2V0VG9wQmxvY2soKS0+c2V0R0NlbGxQYXR0ZXJucyh7eGdwLCB5Z3B9KTsKLQotICBhdXRvICZjbWFwID0gZGVzaWduLT5nZXRUb3BCbG9jaygpLT5nZXRDTWFwKCk7Ci0gIGNtYXAuaW5pdCh4Z3AuZ2V0Q291bnQoKSwgeWdwLmdldENvdW50KCksIHRlY2gtPmxheWVycy5zaXplKCkpOwotCi0gIGZvciAoaW50IGxheWVyTnVtID0gMDsgbGF5ZXJOdW0gPD0gKGludCl0ZWNoLT5nZXRMYXllcnMoKS5zaXplKCk7IGxheWVyTnVtICs9IDIpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpeGdwLmdldENvdW50KCk7IGkrKykgewotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAoaW50KXlncC5nZXRDb3VudCgpOyBqKyspIHsKLSAgICAgICAgZnJCb3ggZ2NlbGxCb3g7Ci0gICAgICAgIGRlc2lnbi0+Z2V0VG9wQmxvY2soKS0+Z2V0R0NlbGxCb3goZnJQb2ludChpLCBqKSwgZ2NlbGxCb3gpOwotICAgICAgICBib29sIGlzSCA9ICh0ZWNoLT5nZXRMYXllcnMoKS5hdChsYXllck51bSktPmdldERpcigpID09IGZyY0hvcnpQcmVmUm91dGluZ0Rpcik7Ci0gICAgICAgIGZyQ29vcmQgZ2NMb3cgID0gaXNIID8gZ2NlbGxCb3guYm90dG9tKCkgOiBnY2VsbEJveC5yaWdodCgpOwotICAgICAgICBmckNvb3JkIGdjSGlnaCA9IGlzSCA/IGdjZWxsQm94LnRvcCgpICAgIDogZ2NlbGxCb3gubGVmdCgpOwotICAgICAgICAvL2lmIChpc0gpIHsKLSAgICAgICAgLy8gIGlmIChqID09IChpbnQpeWdwLmdldENvdW50KCkgLSAxKSB7Ci0gICAgICAgIC8vICAgIGdjSGlnaCA9IGRpZUJveC50b3AoKTsKLSAgICAgICAgLy8gIH0KLSAgICAgICAgLy99IGVsc2UgewotICAgICAgICAvLyAgaWYgKGkgPT0gKGludCl4Z3AuZ2V0Q291bnQoKSAtIDEpIHsKLSAgICAgICAgLy8gICAgZ2NIaWdoID0gZGllQm94LnJpZ2h0KCk7Ci0gICAgICAgIC8vICB9Ci0gICAgICAgIC8vfQotICAgICAgICBpbnQgdHJhY2tDbnQgPSAwOwotICAgICAgICBmb3IgKGF1dG8gJnRwOiBkZXNpZ24tPmdldFRvcEJsb2NrKCktPmdldFRyYWNrUGF0dGVybnMobGF5ZXJOdW0pKSB7Ci0gICAgICAgICAgaWYgKCh0ZWNoLT5nZXRMYXllcihsYXllck51bSktPmdldERpcigpID09IGZyY0hvcnpQcmVmUm91dGluZ0RpciAmJgotICAgICAgICAgICAgICAgdHAtPmlzSG9yaXpvbnRhbCgpID09IGZhbHNlKSB8fAotICAgICAgICAgICAgICAodGVjaC0+Z2V0TGF5ZXIobGF5ZXJOdW0pLT5nZXREaXIoKSA9PSBmcmNWZXJ0UHJlZlJvdXRpbmdEaXIgJiYKLSAgICAgICAgICAgICAgIHRwLT5pc0hvcml6b250YWwoKSA9PSB0cnVlKSkgewotICAgICAgICAgICAgaW50IHRyYWNrTnVtID0gKGdjTG93IC0gdHAtPmdldFN0YXJ0Q29vcmQoKSkgLyAoaW50KXRwLT5nZXRUcmFja1NwYWNpbmcoKTsKLSAgICAgICAgICAgIGlmICh0cmFja051bSA8IDApIHsKLSAgICAgICAgICAgICAgdHJhY2tOdW0gPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRyYWNrTnVtICogKGludCl0cC0+Z2V0VHJhY2tTcGFjaW5nKCkgKyB0cC0+Z2V0U3RhcnRDb29yZCgpIDwgZ2NMb3cpIHsKLSAgICAgICAgICAgICAgdHJhY2tOdW0rKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoOyB0cmFja051bSA8IChpbnQpdHAtPmdldE51bVRyYWNrcygpICYmIHRyYWNrTnVtICogKGludCl0cC0+Z2V0VHJhY2tTcGFjaW5nKCkgKyB0cC0+Z2V0U3RhcnRDb29yZCgpIDwgZ2NIaWdoOyB0cmFja051bSsrKSB7Ci0gICAgICAgICAgICAgIHRyYWNrQ250Kys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY21hcC5zZXRTdXBwbHkoaSxqLGxheWVyTnVtLCB0cmFja0NudCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIC8vZGVzaWduLT5nZXRUb3BCbG9jaygpLT5zZXRDTWFwKGNtYXApOwotfQotCi12b2lkIGlvOjpQYXJzZXI6OmJ1aWxkQ01hcCgpIHsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIGlmIChWRVJCT1NFID4gMCkgewotICAgIGNvdXQgPDxlbmRsIDw8ImJ1aWxkaW5nIGNtYXAgLi4uICIgPDxlbmRsOwotICB9Ci0KLSAgYXV0byBndWlkZXMgPSBkZXNpZ24tPmdldFRvcEJsb2NrKCktPmdldEd1aWRlcygpOwotICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgY291dCA8PCJhbGwgZ3VpZGVzID0gIiA8PGd1aWRlcy5zaXplKCkgPDxlbmRsOwotICB9Ci0gIC8vYXV0byAmZ0NlbGxQYXR0ZXJucyA9IGRlc2lnbi0+Z2V0VG9wQmxvY2soKS0+Z2V0R0NlbGxQYXR0ZXJucygpOwotICAvL2F1dG8gJnhncCA9IGdDZWxsUGF0dGVybnMuYXQoMCk7Ci0gIC8vYXV0byAmeWdwID0gZ0NlbGxQYXR0ZXJucy5hdCgxKTsKLSAgYXV0byAmY21hcCA9IGRlc2lnbi0+Z2V0VG9wQmxvY2soKS0+Z2V0Q01hcCgpOwotCi0gIGZyUG9pbnQgYmVnaW4sIGVuZDsKLSAgZnJVSW50NCB4SW5kZXgxICAgPSAwOwotICBmclVJbnQ0IHlJbmRleDEgICA9IDA7Ci0gIGZyVUludDQgbGF5ZXJOdW0xID0gMDsKLSAgZnJVSW50NCB4SW5kZXgyICAgPSAwOwotICBmclVJbnQ0IHlJbmRleDIgICA9IDA7Ci0gIGZyVUludDQgbGF5ZXJOdW0yID0gMDsKLSAgZm9yIChhdXRvICZndWlkZTogZ3VpZGVzKSB7Ci0gICAgZ3VpZGUtPmdldFBvaW50cyhiZWdpbiwgZW5kKTsKLSAgICAvL3hJbmRleDEgPSAoYmVnaW4ueCgpIC0geGdwLmdldFN0YXJ0Q29vcmQoKSkgLyB4Z3AuZ2V0U3BhY2luZygpOwotICAgIC8veUluZGV4MSA9IChiZWdpbi55KCkgLSB5Z3AuZ2V0U3RhcnRDb29yZCgpKSAvIHlncC5nZXRTcGFjaW5nKCk7Ci0gICAgLy94SW5kZXgyID0gKGVuZC54KCkgICAtIHhncC5nZXRTdGFydENvb3JkKCkpIC8geGdwLmdldFNwYWNpbmcoKTsKLSAgICAvL3lJbmRleDIgPSAoZW5kLnkoKSAgIC0geWdwLmdldFN0YXJ0Q29vcmQoKSkgLyB5Z3AuZ2V0U3BhY2luZygpOwotICAgIAotICAgIC8veEluZGV4MSA9ICh4SW5kZXgxID49IHhncC5nZXRDb3VudCgpKSA/IHhncC5nZXRDb3VudCgpIC0gMSA6IHhJbmRleDE7Ci0gICAgLy94SW5kZXgyID0gKHhJbmRleDIgPj0geGdwLmdldENvdW50KCkpID8geGdwLmdldENvdW50KCkgLSAxIDogeEluZGV4MjsKLSAgICAvL3lJbmRleDEgPSAoeUluZGV4MSA+PSB5Z3AuZ2V0Q291bnQoKSkgPyB5Z3AuZ2V0Q291bnQoKSAtIDEgOiB5SW5kZXgxOwotICAgIC8veUluZGV4MiA9ICh5SW5kZXgyID49IHlncC5nZXRDb3VudCgpKSA/IHlncC5nZXRDb3VudCgpIC0gMSA6IHlJbmRleDI7Ci0gICAgZnJQb2ludCBpZHg7Ci0gICAgZGVzaWduLT5nZXRUb3BCbG9jaygpLT5nZXRHQ2VsbElkeChiZWdpbiwgaWR4KTsKLSAgICB4SW5kZXgxID0gaWR4LngoKTsKLSAgICB5SW5kZXgxID0gaWR4LnkoKTsKLSAgICBkZXNpZ24tPmdldFRvcEJsb2NrKCktPmdldEdDZWxsSWR4KGVuZCwgaWR4KTsKLSAgICB4SW5kZXgyID0gaWR4LngoKTsKLSAgICB5SW5kZXgyID0gaWR4LnkoKTsKLQotICAgIGxheWVyTnVtMSA9IGd1aWRlLT5nZXRCZWdpbkxheWVyTnVtKCk7Ci0gICAgbGF5ZXJOdW0yID0gZ3VpZGUtPmdldEVuZExheWVyTnVtKCk7Ci0gICAgYm9vbCBpc0hMaW5lID0gKHhJbmRleDEgPT0geEluZGV4MikgPyBmYWxzZSA6IHRydWU7Ci0gICAgYm9vbCBpc1ZpYSAgID0gKGxheWVyTnVtMSA9PSBsYXllck51bTIpID8gZmFsc2UgOiB0cnVlOwotICAgIGJvb2wgaXNMb2NhbCA9ICh4SW5kZXgxID09IHhJbmRleDIgJiYgeUluZGV4MSA9PSB5SW5kZXgyKSA/IHRydWUgOiBmYWxzZTsKLQotICAgIGlmIChpc1ZpYSkgewotICAgICAgY21hcC5zZXRVcERlbWFuZCh4SW5kZXgxLCB5SW5kZXgxLCBsYXllck51bTEsIGNtYXAuZ2V0VXBEZW1hbmQoeEluZGV4MSwgeUluZGV4MSwgbGF5ZXJOdW0xKSArIDEpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoaXNMb2NhbCkgewotICAgICAgICBjbWFwLnNldExvY2FsRGVtYW5kKHhJbmRleDEsIHlJbmRleDEsIGxheWVyTnVtMSwgY21hcC5nZXRMb2NhbERlbWFuZCh4SW5kZXgxLCB5SW5kZXgxLCBsYXllck51bTEpICsgMSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjbWFwLnNldEVkZ2UyRGVtYW5kKHhJbmRleDEsIHlJbmRleDEsIGxheWVyTnVtMSwgY21hcC5nZXRFZGdlMkRlbWFuZCh4SW5kZXgxLCB5SW5kZXgxLCBsYXllck51bTEpICsgMSk7Ci0gICAgICAgIGNtYXAuc2V0RWRnZTFEZW1hbmQoeEluZGV4MiwgeUluZGV4MiwgbGF5ZXJOdW0yLCBjbWFwLmdldEVkZ2UxRGVtYW5kKHhJbmRleDIsIHlJbmRleDIsIGxheWVyTnVtMikgKyAxKTsKLSAgICAgICAgaWYgKGlzSExpbmUpIHsKLSAgICAgICAgICBmb3IgKGF1dG8gaSA9IHhJbmRleDEgKyAxOyBpIDwgeEluZGV4MjsgaSsrKSB7Ci0gICAgICAgICAgICBjbWFwLnNldFRocm91Z2hEZW1hbmQoaSwgeUluZGV4MSwgbGF5ZXJOdW0xLCBjbWFwLmdldFRocm91Z2hEZW1hbmQoaSwgeUluZGV4MSwgbGF5ZXJOdW0xKSArIDEpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmb3IgKGF1dG8gaSA9IHlJbmRleDEgKyAxOyBpIDwgeUluZGV4MjsgaSsrKSB7Ci0gICAgICAgICAgICBjbWFwLnNldFRocm91Z2hEZW1hbmQoeEluZGV4MSwgaSwgbGF5ZXJOdW0xLCBjbWFwLmdldFRocm91Z2hEZW1hbmQoeEluZGV4MSwgaSwgbGF5ZXJOdW0xKSArIDEpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIAotICAvL2lmIChWRVJCT1NFID4gMCkgewotICAvLyAgY291dCA8PGVuZGwgPDwiZW5kIGJ1aWxkaW5nIGNtYXAiIDw8ZW5kbDsKLSAgLy99Ci0KLSAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgIGRlc2lnbi0+cHJpbnRDTWFwKCk7Ci0gIH0KLQotfQotCi12b2lkIGlvOjpQYXJzZXI6OndyaXRlR3VpZGVGaWxlKCkgewotICAvL2F1dG8gJmdwID0gZGVzaWduLT5nZXRUb3BCbG9jaygpLT5nZXRHQ2VsbFBhdHRlcm5zKCk7Ci0gIC8vYXV0byAmeGdwID0gZ3BbMF07Ci0gIC8vYXV0byAmeWdwID0gZ3BbMV07Ci0gIC8vIHVzZSBmckNvb3JkIHRvIHByZXZlbnQgbmVnYXRpdmUgcHJvYmxlbXMKLSAgLy9mckNvb3JkIEdDRUxMR1JJRFggICA9IHhncC5nZXRTcGFjaW5nKCk7Ci0gIC8vZnJDb29yZCBHQ0VMTEdSSURZICAgPSB5Z3AuZ2V0U3BhY2luZygpOwotICBvZnN0cmVhbSBvdXRwdXRHdWlkZShPVVRHVUlERV9GSUxFLmNfc3RyKCkpOwotICBpZiAob3V0cHV0R3VpZGUuaXNfb3BlbigpKSB7Ci0gICAgZm9yIChhdXRvICZuZXQ6IGRlc2lnbi0+dG9wQmxvY2stPmdldE5ldHMoKSkgewotICAgICAgYXV0byBuZXROYW1lID0gbmV0LT5nZXROYW1lKCk7Ci0gICAgICBvdXRwdXRHdWlkZSA8PCBuZXROYW1lIDw8IGVuZGw7Ci0gICAgICBvdXRwdXRHdWlkZSA8PCAiKFxuIjsgCi0gICAgICBmb3IgKGF1dG8gJmd1aWRlOiBuZXQtPmdldEd1aWRlcygpKSB7Ci0gICAgICAgIGZyUG9pbnQgYnAsIGVwOwotICAgICAgICBndWlkZS0+Z2V0UG9pbnRzKGJwLCBlcCk7Ci0gICAgICAgIGZyUG9pbnQgYnBJZHgsIGVwSWR4OwotICAgICAgICBkZXNpZ24tPmdldFRvcEJsb2NrKCktPmdldEdDZWxsSWR4KGJwLCBicElkeCk7Ci0gICAgICAgIGRlc2lnbi0+Z2V0VG9wQmxvY2soKS0+Z2V0R0NlbGxJZHgoZXAsIGVwSWR4KTsKLSAgICAgICAgZnJCb3ggYmJveCwgZWJveDsKLSAgICAgICAgZGVzaWduLT5nZXRUb3BCbG9jaygpLT5nZXRHQ2VsbEJveChicElkeCwgYmJveCk7Ci0gICAgICAgIGRlc2lnbi0+Z2V0VG9wQmxvY2soKS0+Z2V0R0NlbGxCb3goZXBJZHgsIGVib3gpOwotICAgICAgICBmckxheWVyTnVtIGJOdW0gPSBndWlkZS0+Z2V0QmVnaW5MYXllck51bSgpOwotICAgICAgICBmckxheWVyTnVtIGVOdW0gPSBndWlkZS0+Z2V0RW5kTGF5ZXJOdW0oKTsKLSAgICAgICAgLy8gYXBwZW5kIHVuaXQgZ3VpZGUgaW4gY2FzZSBvZiBzdGFja2VkIHZpYQotICAgICAgICBpZiAoYk51bSAhPSBlTnVtKSB7Ci0gICAgICAgICAgYXV0byBzdGFydExheWVyTmFtZSA9IHRlY2gtPmdldExheWVyKGJOdW0pLT5nZXROYW1lKCk7Ci0gICAgICAgICAgLy9vdXRwdXRHdWlkZSA8PCBicC54KCkgLSBHQ0VMTEdSSURYIC8gMiA8PCAiICIgPDwgYnAueSgpIC0gR0NFTExHUklEWSAvIDIgPDwgIiAiCi0gICAgICAgICAgLy8gICAgICAgICAgICA8PCBicC54KCkgKyBHQ0VMTEdSSURYIC8gMiA8PCAiICIgPDwgYnAueSgpICsgR0NFTExHUklEWSAvIDIgPDwgIiAiCi0gICAgICAgICAgLy8gICAgICAgICAgICA8PCBzdGFydExheWVyTmFtZSA8PCIuNSIgPDwgZW5kbDsKLSAgICAgICAgICBvdXRwdXRHdWlkZSA8PCBiYm94LmxlZnQoKSAgPDwgIiAiIDw8IGJib3guYm90dG9tKCkgPDwgIiAiCi0gICAgICAgICAgICAgICAgICAgICAgPDwgYmJveC5yaWdodCgpIDw8ICIgIiA8PCBiYm94LnRvcCgpICAgIDw8ICIgIgotICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXJ0TGF5ZXJOYW1lIDw8Ii41IiA8PCBlbmRsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGF1dG8gbGF5ZXJOYW1lID0gdGVjaC0+Z2V0TGF5ZXIoYk51bSktPmdldE5hbWUoKTsKLSAgICAgICAgICAvL291dHB1dEd1aWRlIDw8IGJwLngoKSAtIEdDRUxMR1JJRFggLyAyIDw8ICIgIiA8PCBicC55KCkgLSBHQ0VMTEdSSURZIC8gMiA8PCAiICIKLSAgICAgICAgICAvLyAgICAgICAgICAgIDw8IGVwLngoKSArIEdDRUxMR1JJRFggLyAyIDw8ICIgIiA8PCBlcC55KCkgKyBHQ0VMTEdSSURZIC8gMiA8PCAiICIKLSAgICAgICAgICAvLyAgICAgICAgICAgIDw8IGxheWVyTmFtZSA8PCBlbmRsOwotICAgICAgICAgIG91dHB1dEd1aWRlIDw8IGJib3gubGVmdCgpICA8PCAiICIgPDwgYmJveC5ib3R0b20oKSA8PCAiICIKLSAgICAgICAgICAgICAgICAgICAgICA8PCBlYm94LnJpZ2h0KCkgPDwgIiAiIDw8IGVib3gudG9wKCkgICAgPDwgIiAiCi0gICAgICAgICAgICAgICAgICAgICAgPDwgbGF5ZXJOYW1lIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIG91dHB1dEd1aWRlIDw8ICIpXG4iOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvaW8vaW9fcGluLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL2lvL2lvX3Bpbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNjc5YzguLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvaW8vaW9fcGluLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW8uaCIKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBmcjsKLQotdm9pZCBpbzo6UGFyc2VyOjppbnN0QW5hbHlzaXMoKSB7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIC8vYm9vbCBlbmFibGVPdXRwdXQgPSB0cnVlOwotICBpZiAoVkVSQk9TRSA+IDApIHsKLSAgICBjb3V0IDw8ZW5kbCA8PCJsaWJjZWxsIGFuYWx5c2lzIC4uLiIgPDxlbmRsOwotICB9Ci0gIHRyYWNrT2Zmc2V0TWFwLmNsZWFyKCk7Ci0gIHByZWZUcmFja1BhdHRlcm5zLmNsZWFyKCk7Ci0gIC8vdmVjdG9yPGZyVHJhY2tQYXR0ZXJuKj4gcHJlZlRyYWNrUGF0dGVybnM7Ci0gIGZvciAoYXV0byAmdHJhY2tQYXR0ZXJuOiBkZXNpZ24tPmdldFRvcEJsb2NrKCktPmdldFRyYWNrUGF0dGVybnMoKSkgewotICAgIGF1dG8gaXNWZXJ0aWNhbFRyYWNrID0gdHJhY2tQYXR0ZXJuLT5pc0hvcml6b250YWwoKTsgLy8geWVzID0gdmVydGljYWwgdHJhY2sKLSAgICBpZiAoZGVzaWduLT5nZXRUZWNoKCktPmdldExheWVyKHRyYWNrUGF0dGVybi0+Z2V0TGF5ZXJOdW0oKSktPmdldERpcigpID09IGZyY0hvcnpQcmVmUm91dGluZ0RpcikgewotICAgICAgaWYgKCFpc1ZlcnRpY2FsVHJhY2spIHsKLSAgICAgICAgcHJlZlRyYWNrUGF0dGVybnMucHVzaF9iYWNrKHRyYWNrUGF0dGVybik7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChpc1ZlcnRpY2FsVHJhY2spIHsKLSAgICAgICAgcHJlZlRyYWNrUGF0dGVybnMucHVzaF9iYWNrKHRyYWNrUGF0dGVybik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaW50IG51bUxheWVycyA9IGRlc2lnbi0+Z2V0VGVjaCgpLT5nZXRMYXllcnMoKS5zaXplKCk7Ci0gIG1hcDxmckJsb2NrKiwgdHVwbGU8ZnJMYXllck51bSwgZnJMYXllck51bT4sIGZyQmxvY2tPYmplY3RDb21wPiByZWZCbG9ja1BpbkxheWVyUmFuZ2U7Ci0gIGZvciAoYXV0byAmdVJlZkJsb2NrOiBkZXNpZ24tPmdldFJlZkJsb2NrcygpKSB7Ci0gICAgYXV0byByZWZCbG9jayA9IHVSZWZCbG9jay5nZXQoKTsKLSAgICBmckxheWVyTnVtIG1pbkxheWVyTnVtID0gbnVtTGF5ZXJzOwotICAgIGZyTGF5ZXJOdW0gbWF4TGF5ZXJOdW0gPSAwOwotICAgIGZvciAoYXV0byAmdVRlcm06IHJlZkJsb2NrLT5nZXRUZXJtcygpKSB7Ci0gICAgICBmb3IgKGF1dG8gJnVQaW46IHVUZXJtLT5nZXRQaW5zKCkpIHsKLSAgICAgICAgZm9yIChhdXRvICZ1UGluRmlnOiB1UGluLT5nZXRGaWdzKCkpIHsKLSAgICAgICAgICBhdXRvIHBpbkZpZyA9IHVQaW5GaWcuZ2V0KCk7Ci0gICAgICAgICAgaWYgKHBpbkZpZy0+dHlwZUlkKCkgPT0gZnJjUmVjdCkgewotICAgICAgICAgICAgYXV0byBsTnVtID0gc3RhdGljX2Nhc3Q8ZnJSZWN0Kj4ocGluRmlnKS0+Z2V0TGF5ZXJOdW0oKTsKLSAgICAgICAgICAgIG1pbkxheWVyTnVtID0gbWluKG1pbkxheWVyTnVtLCBsTnVtKTsKLSAgICAgICAgICAgIG1heExheWVyTnVtID0gbWF4KG1heExheWVyTnVtLCBsTnVtKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY291dCA8PCJFcnJvcjogaW5zdEFuYWx5c2lzIHVuc3VwcG9ydGVkIHBpbkZpZyIgPDxlbmRsOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBtYXhMYXllck51bSA9IG1pbihtYXhMYXllck51bSArIDIsIG51bUxheWVycyk7Ci0gICAgcmVmQmxvY2tQaW5MYXllclJhbmdlW3JlZkJsb2NrXSA9IG1ha2VfdHVwbGUobWluTGF5ZXJOdW0sIG1heExheWVyTnVtKTsKLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBjb3V0IDw8IiAgIiA8PHJlZkJsb2NrLT5nZXROYW1lKCkgPDwiIFBJTiBsYXllciAoIgotICAgICAgICAgICA8PGRlc2lnbi0+Z2V0VGVjaCgpLT5nZXRMYXllcihtaW5MYXllck51bSktPmdldE5hbWUoKSA8PCIsICIKLSAgICAgICAgICAgPDxkZXNpZ24tPmdldFRlY2goKS0+Z2V0TGF5ZXIobWF4TGF5ZXJOdW0pLT5nZXROYW1lKCkgPDwiKSIgPDxlbmRsOwotICAgIH0KLSAgfQotICAvL2NvdXQgPDwiICByZWZCbG9jayBwaW4gbGF5ZXIgcmFuZ2UgZG9uZSIgPDxlbmRsOwotCi0gIGlmIChWRVJCT1NFID4gMCkgewotICAgIGNvdXQgPDxlbmRsIDw8Imluc3RhbmNlIGFuYWx5c2lzIC4uLiIgPDxlbmRsOwotICB9Ci0gIC8vbWFwPGZyQmxvY2sqLCBtYXA8ZnJPcmllbnQsIG1hcDx2ZWN0b3I8ZnJDb29yZD4sIGZySW5zdCo+ID4gPiB0cmFja09mZnNldE1hcDsKLSAgdmVjdG9yPGZyQ29vcmQ+IG9mZnNldDsKLSAgaW50IGNudCA9IDA7Ci0gIGZvciAoYXV0byAmaW5zdDogZGVzaWduLT5nZXRUb3BCbG9jaygpLT5nZXRJbnN0cygpKSB7Ci0gICAgZnJQb2ludCBvcmlnaW47Ci0gICAgaW5zdC0+Z2V0T3JpZ2luKG9yaWdpbik7Ci0gICAgYXV0byBvcmllbnQgPSBpbnN0LT5nZXRPcmllbnQoKTsKLSAgICBhdXRvIFttaW5MYXllck51bSwgbWF4TGF5ZXJOdW1dID0gcmVmQmxvY2tQaW5MYXllclJhbmdlW2luc3QtPmdldFJlZkJsb2NrKCldOwotICAgIG9mZnNldC5jbGVhcigpOwotICAgIGZvciAoYXV0byAmdHA6IHByZWZUcmFja1BhdHRlcm5zKSB7Ci0gICAgICBpZiAodHAtPmdldExheWVyTnVtKCkgPj0gbWluTGF5ZXJOdW0gJiYgdHAtPmdldExheWVyTnVtKCkgPD0gbWF4TGF5ZXJOdW0pIHsKLSAgICAgICAgLy8gdmVydGljYWwgdHJhY2sKLSAgICAgICAgaWYgKHRwLT5pc0hvcml6b250YWwoKSkgewotICAgICAgICAgIG9mZnNldC5wdXNoX2JhY2sob3JpZ2luLngoKSAlIHRwLT5nZXRUcmFja1NwYWNpbmcoKSk7Ci0gICAgICAgICAgLy9jb3V0IDw8Imluc3Qvb2Zmc2V0L2xheWVyICIgPDxpbnN0LT5nZXROYW1lKCkgPDwiICIgPDxvcmlnaW4ueSgpICUgdHAtPmdldFRyYWNrU3BhY2luZygpIAotICAgICAgICAgIC8vICAgICA8PCIgIiA8PGRlc2lnbi0+Z2V0VGVjaCgpLT5nZXRMYXllcih0cC0+Z2V0TGF5ZXJOdW0oKSktPmdldE5hbWUoKSA8PGVuZGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb2Zmc2V0LnB1c2hfYmFjayhvcmlnaW4ueSgpICUgdHAtPmdldFRyYWNrU3BhY2luZygpKTsKLSAgICAgICAgICAvL2NvdXQgPDwiaW5zdC9vZmZzZXQvbGF5ZXIgIiA8PGluc3QtPmdldE5hbWUoKSA8PCIgIiA8PG9yaWdpbi54KCkgJSB0cC0+Z2V0VHJhY2tTcGFjaW5nKCkKLSAgICAgICAgICAvLyAgICAgPDwiICIgPDxkZXNpZ24tPmdldFRlY2goKS0+Z2V0TGF5ZXIodHAtPmdldExheWVyTnVtKCkpLT5nZXROYW1lKCkgPDxlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIHRyYWNrT2Zmc2V0TWFwW2luc3QtPmdldFJlZkJsb2NrKCldW29yaWVudF1bb2Zmc2V0XSA9IGluc3QuZ2V0KCk7Ci0gICAgdHJhY2tPZmZzZXRNYXBbaW5zdC0+Z2V0UmVmQmxvY2soKV1bb3JpZW50XVtvZmZzZXRdLmluc2VydChpbnN0LmdldCgpKTsKLSAgICBjbnQrKzsKLSAgICBpZiAoVkVSQk9TRSA+IDApIHsKLSAgICAgIGlmIChjbnQgPCAxMDAwMDApIHsKLSAgICAgICAgaWYgKGNudCAlIDEwMDAwID09IDApIHsKLSAgICAgICAgICBjb3V0IDw8IiAgY29tcGxldGUgIiA8PGNudCA8PCIgaW5zdGFuY2VzIiA8PGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChjbnQgJSAxMDAwMDAgPT0gMCkgewotICAgICAgICAgIGNvdXQgPDwiICBjb21wbGV0ZSAiIDw8Y250IDw8IiBpbnN0YW5jZXMiIDw8ZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICBjb3V0IDw8ZW5kbCA8PCJzdW1tYXJ5OiAiIDw8ZW5kbDsKLSAgfQotICBjbnQgPSAwOwotICBmclN0cmluZyBvcmllbnROYW1lOwotICBmb3IgKGF1dG8gJltyZWZCbG9jaywgb3JpZW50TWFwXTogdHJhY2tPZmZzZXRNYXApIHsKLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBjb3V0IDw8IiAgIiA8PHJlZkJsb2NrLT5nZXROYW1lKCkgPDwiIChPUklFTlQvI2RpZmYgcGF0dGVybnMpIjsKLSAgICB9Ci0gICAgZm9yIChhdXRvICZbb3JpZW50LCBvZmZzZXRNYXBdOiBvcmllbnRNYXApIHsKLSAgICAgIGNudCArPSBvZmZzZXRNYXAuc2l6ZSgpOwotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBvcmllbnQuZ2V0TmFtZShvcmllbnROYW1lKTsKLSAgICAgICAgY291dCA8PCIgKCIgPDxvcmllbnROYW1lIDw8IiwgIiA8PG9mZnNldE1hcC5zaXplKCkgPDwiKSI7Ci0gICAgICAgIGZvciAoYXV0byAmW3ZlYywgaW5zdF06IG9mZnNldE1hcCkgewotICAgICAgICAgIGNvdXQgPDwiICIgPDwoKmluc3QuYmVnaW4oKSktPmdldE5hbWUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBjb3V0IDw8ZW5kbDsKLSAgICB9Ci0gIH0KLSAgaWYgKFZFUkJPU0UgPiAwKSB7Ci0gICAgY291dCA8PCIjdW5pcXVlIGluc3RhbmNlcyA9ICIgPDxjbnQgPDxlbmRsOwotICB9Ci19CmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy9tYWluLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL21haW4uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWE5MmU5Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL21haW4uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8Y2hyb25vPgotI2luY2x1ZGUgIkZsZXhSb3V0ZS5oIgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIGZyOwotCi1pbnQgcmVhZFBhcmFtcyhjb25zdCBzdHJpbmcgJmZpbGVOYW1lKSB7Ci0gIGludCByZWFkUGFyYW1DbnQgPSAwOwotICBmc3RyZWFtIGZpbihmaWxlTmFtZS5jX3N0cigpKTsKLSAgc3RyaW5nIGxpbmU7Ci0gIGlmIChmaW4uaXNfb3BlbigpKXsKLSAgICB3aGlsZSAoZmluLmdvb2QoKSl7Ci0gICAgICBnZXRsaW5lKGZpbiwgbGluZSk7Ci0gICAgICBpZiAobGluZVswXSAhPSAnIycpewotICAgICAgICBjaGFyIGRlbGltaXRlcj0nOic7Ci0gICAgICAgIGludCBwb3MgPSBsaW5lLmZpbmQoZGVsaW1pdGVyKTsKLSAgICAgICAgc3RyaW5nIGZpZWxkID0gbGluZS5zdWJzdHIoMCwgcG9zKTsKLSAgICAgICAgc3RyaW5nIHZhbHVlID0gbGluZS5zdWJzdHIocG9zICsgMSk7Ci0gICAgICAgIHN0cmluZ3N0cmVhbSBzcyh2YWx1ZSk7Ci0gICAgICAgIGlmIChmaWVsZCA9PSAibGVmIikgICAgICAgICAgIHsgTEVGX0ZJTEUgPSB2YWx1ZTsgKytyZWFkUGFyYW1DbnQ7fQotICAgICAgICBlbHNlIGlmIChmaWVsZCA9PSAiZGVmIikgICAgICB7IERFRl9GSUxFID0gdmFsdWU7ICsrcmVhZFBhcmFtQ250O30KLSAgICAgICAgZWxzZSBpZiAoZmllbGQgPT0gImd1aWRlIikgICAgeyBHVUlERV9GSUxFID0gdmFsdWU7ICsrcmVhZFBhcmFtQ250O30KLSAgICAgICAgZWxzZSBpZiAoZmllbGQgPT0gIm91dHB1dFRBIikgeyBPVVRUQV9GSUxFID0gdmFsdWU7ICsrcmVhZFBhcmFtQ250O30KLSAgICAgICAgZWxzZSBpZiAoZmllbGQgPT0gIm91dHB1dCIpICAgeyBPVVRfRklMRSA9IHZhbHVlOyArK3JlYWRQYXJhbUNudDt9Ci0gICAgICAgIGVsc2UgaWYgKGZpZWxkID09ICJvdXRwdXRndWlkZSIpIHsgT1VUR1VJREVfRklMRSA9IHZhbHVlOyArK3JlYWRQYXJhbUNudDt9Ci0gICAgICAgIGVsc2UgaWYgKGZpZWxkID09ICJvdXRwdXRNYXplIikgeyBPVVRfTUFaRV9GSUxFID0gdmFsdWU7ICsrcmVhZFBhcmFtQ250O30KLSAgICAgICAgZWxzZSBpZiAoZmllbGQgPT0gIm91dHB1dERSQyIpIHsgRFJDX1JQVF9GSUxFID0gdmFsdWU7ICsrcmVhZFBhcmFtQ250O30KLSAgICAgICAgZWxzZSBpZiAoZmllbGQgPT0gInRocmVhZHMiKSAgeyBNQVhfVEhSRUFEUyA9IGF0b2kodmFsdWUuY19zdHIoKSk7ICsrcmVhZFBhcmFtQ250O30KLSAgICAgICAgZWxzZSBpZiAoZmllbGQgPT0gInZlcmJvc2UiKSAgICBWRVJCT1NFID0gYXRvaSh2YWx1ZS5jX3N0cigpKTsKLSAgICAgICAgZWxzZSBpZiAoZmllbGQgPT0gImRiUHJvY2Vzc05vZGUiKSB7IERCUFJPQ0VTU05PREUgPSB2YWx1ZTsgKytyZWFkUGFyYW1DbnQ7fQotICAgICAgfQotICAgIH0KLSAgICBmaW4uY2xvc2UoKTsKLSAgfQotICBpZiAocmVhZFBhcmFtQ250IDwgNSkgewotICAgIHJldHVybiAyOwotICB9IGVsc2UgewotICAgIHJldHVybiAwOwotICB9Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotCi0gIC8vY291dCA8PENQWF9NSU4gPDxlbmRsOwotICAvL3JldHVybiAwOwotICB1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm87Ci0gIGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6dGltZV9wb2ludCB0MSA9IGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7Ci0gIC8vZG91YmxlIHN0YXJ0VGltZSA9IG9tcF9nZXRfd3RpbWUoKTsKLQotICAvL3N0ZDo6aW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwotICBjb3V0IDw8ICJUZWFtIG51bWJlcjogMjFcbiI7Ci0gIGNvdXQgPDwgIlRlYW0gbmFtZTogVUNTRCBBQktHUk9VUFxuIjsKLSAgY291dCA8PCAiTWVtYmVyOiBBbmRyZXcgQi4gS2FobmcsIEx1dG9uZyBXYW5nLCBCYW5ncWkgWHVcbiI7Ci0gIGNvdXQgPDwgIkFmZmlsaWF0aW9uOiBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIFNhbiBEaWVnb1xuIjsKLSAgaWYgKGFyZ2MgPT0gMSkgewotICAgIGNvdXQgPDwiRXJyb3I6IHR5cGUgJy0taGVscCcgZm9yIHRoZSBoZWxwLiIgPDxlbmRsOwotICAgIHJldHVybiAyOwotICB9Ci0KLSAgaWYgKGFyZ2MgPT0gMikgewotICAgIGludCByZWFkU3VjY2VzcyA9IHJlYWRQYXJhbXMoc3RyaW5nKGFyZ3ZbMV0pKTsKLSAgICBpZiAocmVhZFN1Y2Nlc3MpIHsKLSAgICAgIGNvdXQgPDwiRXJyb3IgcmVhZGluZyBwYXJhbSBmaWxlISEhIiA8PGVuZGw7Ci0gICAgICByZXR1cm4gMjsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgYXJndisrOwotICAgIGFyZ2MtLTsKLSAgICB3aGlsZSAoYXJnYy0tKSB7Ci0gICAgICBpZiAoc3RyY21wKCphcmd2LCAiLWxlZiIpID09IDApIHsKLSAgICAgICAgYXJndisrOwotICAgICAgICBhcmdjLS07Ci0gICAgICAgIExFRl9GSUxFID0gKmFyZ3Y7Ci0gICAgICAgIC8vY291dCA8PCJsZWY6ICIgPDxMRUZfRklMRSA8PGVuZGw7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1kZWYiKSA9PSAwKSB7Ci0gICAgICAgIGFyZ3YrKzsKLSAgICAgICAgYXJnYy0tOwotICAgICAgICBERUZfRklMRSA9ICphcmd2OwotICAgICAgICAvL2NvdXQgPDwiZGVmOiAiIDw8REVGX0ZJTEUgPDxlbmRsOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItZ3VpZGUiKSA9PSAwKSB7Ci0gICAgICAgIGFyZ3YrKzsKLSAgICAgICAgYXJnYy0tOwotICAgICAgICBHVUlERV9GSUxFID0gKmFyZ3Y7Ci0gICAgICAgIC8vY291dCA8PCJndWlkZTogIiA8PEdVSURFX0ZJTEUgPDxlbmRsOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItdGhyZWFkcyIpID09IDApIHsKLSAgICAgICAgYXJndisrOwotICAgICAgICBhcmdjLS07Ci0gICAgICAgIHNzY2FuZigqYXJndiwgIiVkIiwgJk1BWF9USFJFQURTKTsKLSAgICAgICAgLy9jb3V0IDw8InRocmVhZDogIiA8PE1BWF9USFJFQURTIDw8ZW5kbDsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLW91dHB1dCIpID09IDApIHsKLSAgICAgICAgYXJndisrOwotICAgICAgICBhcmdjLS07Ci0gICAgICAgIE9VVF9GSUxFID0gKmFyZ3Y7Ci0gICAgICAgIC8vY291dCA8PCJvdXRwdXQ6ICIgPDxPVVRfRklMRSA8PGVuZGw7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi12ZXJib3NlIikgPT0gMCkgewotICAgICAgICBhcmd2Kys7Ci0gICAgICAgIGFyZ2MtLTsKLSAgICAgICAgVkVSQk9TRSA9IGF0b2koKmFyZ3YpOwotICAgICAgICAvL2NvdXQgPDwib3V0cHV0OiAiIDw8T1VUX0ZJTEUgPDxlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291dCA8PCJFUlJPUjogSWxsZWdhbCBjb21tYW5kIGxpbmUgb3B0aW9uOiAiIDw8KmFyZ3YgPDxlbmRsOwotICAgICAgICByZXR1cm4gMjsKLSAgICAgIH0KLSAgICAgIGFyZ3YrKzsKLSAgICB9Ci0gIH0KLSAgCi0gIEZsZXhSb3V0ZSByb3V0ZXI7Ci0gIHJvdXRlci5tYWluKCk7Ci0gIAotICBoaWdoX3Jlc29sdXRpb25fY2xvY2s6OnRpbWVfcG9pbnQgdDIgPSBoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwotICBkdXJhdGlvbjxkb3VibGU+IHRpbWVfc3BhbiA9IGR1cmF0aW9uX2Nhc3Q8ZHVyYXRpb248ZG91YmxlPj4odDIgLSB0MSk7Ci0gIGlmIChWRVJCT1NFID4gMCkgewotICAgIGNvdXQgPDxlbmRsIDw8IlJ1bnRpbWUgdGFrZW4gKGhydCk6ICIgPDwgdGltZV9zcGFuLmNvdW50KCkgICAgPDxlbmRsOwotICB9Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvdGEvRmxleFRBLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL3RhL0ZsZXhUQS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZDNhY2UuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvdGEvRmxleFRBLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg3NCArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSAiZ2xvYmFsLmgiCi0jaW5jbHVkZSAiRmxleFRBLmgiCi0jaW5jbHVkZSAiZGIvaW5mcmEvZnJUaW1lLmgiCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotLy8jaW5jbHVkZSA8b21wLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgZnI7Ci11c2luZyBuYW1lc3BhY2UgYm9vc3Q6OnBvbHlnb246Om9wZXJhdG9yczsKLQotaW50IEZsZXhUQVdvcmtlcjo6bWFpbigpIHsKLSAgdXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vOwotICBoaWdoX3Jlc29sdXRpb25fY2xvY2s6OnRpbWVfcG9pbnQgdDAgPSBoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwotICBpZiAoVkVSQk9TRSA+IDEpIHsKLSAgICBzdHJpbmdzdHJlYW0gc3M7Ci0gICAgLy9jb3V0IDw8ZW5kbCA8PCJzdGFydCBUQSB3b3JrZXIgKEJPWC9MQVlFUikgIiA8PHJvdXRlQm94IDw8IiAiIDw8bGF5ZXJOdW0gPDxlbmRsOwotICAgIHNzIDw8ZW5kbCA8PCJzdGFydCBUQSB3b3JrZXIgKEJPWCkgKCIKLSAgICAgICA8PHJvdXRlQm94LmxlZnQoKSAgICogMS4wIC8gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCkgPDwiLCAiCi0gICAgICAgPDxyb3V0ZUJveC5ib3R0b20oKSAqIDEuMCAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpIDw8IikgKCIKLSAgICAgICA8PHJvdXRlQm94LnJpZ2h0KCkgICogMS4wIC8gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCkgPDwiLCAiCi0gICAgICAgPDxyb3V0ZUJveC50b3AoKSAgICAqIDEuMCAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpIDw8IikgIjsKLSAgICBpZiAoZ2V0RGlyKCkgPT0gZnJQcmVmUm91dGluZ0RpckVudW06OmZyY0hvcnpQcmVmUm91dGluZ0RpcikgewotICAgICAgc3MgPDwiSCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNzIDw8IlYiOwotICAgIH0KLSAgICBzcyA8PGVuZGw7Ci0gICAgY291dCA8PHNzLnN0cigpOwotICB9Ci0KLQotICAvL2Fzc2lnbklyb3V0ZXMoKTsKLSAgLy9yZWFzc2lnbklyb3V0ZXMoKTsKLSAgLy9zYXZlVG9HdWlkZXMoKTsKLSAgLy9yZXBvcnRDb3N0cygpOwotICBpbml0KCk7Ci0gIGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6dGltZV9wb2ludCB0MSA9IGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7Ci0gIGFzc2lnbigpOwotICBoaWdoX3Jlc29sdXRpb25fY2xvY2s6OnRpbWVfcG9pbnQgdDIgPSBoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwotICBlbmQoKTsKLSAgaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjp0aW1lX3BvaW50IHQzID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKLQotICBkdXJhdGlvbjxkb3VibGU+IHRpbWVfc3BhbjAgPSBkdXJhdGlvbl9jYXN0PGR1cmF0aW9uPGRvdWJsZT4+KHQxIC0gdDApOwotICBkdXJhdGlvbjxkb3VibGU+IHRpbWVfc3BhbjEgPSBkdXJhdGlvbl9jYXN0PGR1cmF0aW9uPGRvdWJsZT4+KHQyIC0gdDEpOwotICBkdXJhdGlvbjxkb3VibGU+IHRpbWVfc3BhbjIgPSBkdXJhdGlvbl9jYXN0PGR1cmF0aW9uPGRvdWJsZT4+KHQzIC0gdDIpOwotCi0gIGlmIChWRVJCT1NFID4gMSkgewotICAgIHN0cmluZ3N0cmVhbSBzczsKLSAgICBzcyAgIDw8InRpbWUgKElOSVQvQVNTSUdOL1BPU1QpICIgPDx0aW1lX3NwYW4wLmNvdW50KCkgPDwiICIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8dGltZV9zcGFuMS5jb3VudCgpIDw8IiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8dGltZV9zcGFuMi5jb3VudCgpIDw8IiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ZW5kbDsKLSAgICBjb3V0IDw8c3Muc3RyKCkgPDxmbHVzaDsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotaW50IEZsZXhUQTo6aW5pdFRBX2hlbHBlcihpbnQgaXRlciwgaW50IHNpemUsIGludCBvZmZzZXQsIGJvb2wgaXNILCBpbnQgJm51bVBhbmVscykgewotICAvL2ZyQm94IGRpZUJveDsKLSAgLy9nZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0Qm91bmRhcnlCQm94KGRpZUJveCk7Ci0KLSAgYXV0byBnQ2VsbFBhdHRlcm5zID0gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldEdDZWxsUGF0dGVybnMoKTsKLSAgYXV0byAmeGdwID0gZ0NlbGxQYXR0ZXJucy5hdCgwKTsKLSAgYXV0byAmeWdwID0gZ0NlbGxQYXR0ZXJucy5hdCgxKTsKLSAgaW50IHNvbCA9IDA7Ci0gIG51bVBhbmVscyA9IDA7Ci0gIGlmIChpc0gpIHsKLSAgICBmb3IgKGludCBpID0gb2Zmc2V0OyBpIDwgKGludCl5Z3AuZ2V0Q291bnQoKTsgaSArPSBzaXplKSB7Ci0gICAgICBGbGV4VEFXb3JrZXIgd29ya2VyKGdldERlc2lnbigpKTsKLSAgICAgIGZyQm94IGJlZ2luQm94LCBlbmRCb3g7Ci0gICAgICBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0R0NlbGxCb3goZnJQb2ludCgwLCBpKSwgYmVnaW5Cb3gpOwotICAgICAgZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldEdDZWxsQm94KGZyUG9pbnQoKGludCl4Z3AuZ2V0Q291bnQoKSAtIDEsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKGkgKyBzaXplIC0gMSwgKGludCl5Z3AuZ2V0Q291bnQoKSAtIDEpKSwgZW5kQm94KTsKLSAgICAgIGZyQm94IHJvdXRlQm94KGJlZ2luQm94LmxlZnQoKSwgYmVnaW5Cb3guYm90dG9tKCksIGVuZEJveC5yaWdodCgpLCBlbmRCb3gudG9wKCkpOwotICAgICAgZnJCb3ggZXh0Qm94OwotICAgICAgcm91dGVCb3guYmxvYXQoeWdwLmdldFNwYWNpbmcoKSAvIDIsIGV4dEJveCk7Ci0gICAgICB3b3JrZXIuc2V0Um91dGVCb3gocm91dGVCb3gpOwotICAgICAgd29ya2VyLnNldEV4dEJveChleHRCb3gpOwotICAgICAgd29ya2VyLnNldERpcihmclByZWZSb3V0aW5nRGlyRW51bTo6ZnJjSG9yelByZWZSb3V0aW5nRGlyKTsKLSAgICAgIHdvcmtlci5zZXRUQUl0ZXIoaXRlcik7Ci0gICAgICB3b3JrZXIubWFpbigpOwotICAgICAgLy9pbnQgbnVtQXNzaWduZWQgPSB3b3JrZXIuZ2V0TnVtQXNzaWduZWQoKTsKLSAgICAgIHNvbCArPSB3b3JrZXIuZ2V0TnVtQXNzaWduZWQoKTsKLSAgICAgIG51bVBhbmVscysrOwotICAgICAgLy9pZiAoVkVSQk9TRSA+IDApIHsKLSAgICAgIC8vICBjb3V0IDw8IkRvbmUgd2l0aCAiIDw8bnVtQXNzaWduZWQgPDwiaG9yaXpvbnRhbCB3aXJlcyI7Ci0gICAgICAvL30KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgZm9yIChpbnQgaSA9IG9mZnNldDsgaSA8IChpbnQpeGdwLmdldENvdW50KCk7IGkgKz0gc2l6ZSkgewotICAgICAgRmxleFRBV29ya2VyIHdvcmtlcihnZXREZXNpZ24oKSk7Ci0gICAgICBmckJveCBiZWdpbkJveCwgZW5kQm94OwotICAgICAgZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldEdDZWxsQm94KGZyUG9pbnQoaSwgMCksICAgICAgICAgICAgICAgICAgICAgICBiZWdpbkJveCk7Ci0gICAgICBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0R0NlbGxCb3goZnJQb2ludChtaW4oaSArIHNpemUgLSAxLCAoaW50KXhncC5nZXRDb3VudCgpIC0gMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KXlncC5nZXRDb3VudCgpIC0gMSksIGVuZEJveCk7Ci0gICAgICBmckJveCByb3V0ZUJveChiZWdpbkJveC5sZWZ0KCksIGJlZ2luQm94LmJvdHRvbSgpLCBlbmRCb3gucmlnaHQoKSwgZW5kQm94LnRvcCgpKTsKLSAgICAgIGZyQm94IGV4dEJveDsKLSAgICAgIHJvdXRlQm94LmJsb2F0KHhncC5nZXRTcGFjaW5nKCkgLyAyLCBleHRCb3gpOwotICAgICAgd29ya2VyLnNldFJvdXRlQm94KHJvdXRlQm94KTsKLSAgICAgIHdvcmtlci5zZXRFeHRCb3goZXh0Qm94KTsKLSAgICAgIHdvcmtlci5zZXREaXIoZnJQcmVmUm91dGluZ0RpckVudW06OmZyY1ZlcnRQcmVmUm91dGluZ0Rpcik7Ci0gICAgICB3b3JrZXIuc2V0VEFJdGVyKGl0ZXIpOwotICAgICAgd29ya2VyLm1haW4oKTsKLSAgICAgIC8vaW50IG51bUFzc2lnbmVkID0gd29ya2VyLmdldE51bUFzc2lnbmVkKCk7Ci0gICAgICBzb2wgKz0gd29ya2VyLmdldE51bUFzc2lnbmVkKCk7Ci0gICAgICBudW1QYW5lbHMrKzsKLSAgICAgIC8vaWYgKFZFUkJPU0UgPiAwKSB7Ci0gICAgICAvLyAgY291dCA8PCJEb25lIHdpdGggIiA8PG51bUFzc2lnbmVkIDw8InZlcnRpY2FsIHdpcmVzIjsKLSAgICAgIC8vfQotICAgIH0KLSAgfQotICByZXR1cm4gc29sOwotfQotCi12b2lkIEZsZXhUQTo6aW5pdFRBKGludCBzaXplKSB7Ci0gIGZyVGltZSB0OwotCi0gIGlmIChWRVJCT1NFID4gMSkgewotICAgIGNvdXQgPDxlbmRsIDw8InN0YXJ0IGluaXRpYWwgdHJhY2sgYXNzaWdubWVudCAuLi4iIDw8ZW5kbDsKLSAgfQotCi0gIGF1dG8gYm90dG9tTE51bSA9IGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldEJvdHRvbUxheWVyTnVtKCk7Ci0gIGF1dG8gYm90dG9tTGF5ZXIgPSBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihib3R0b21MTnVtKTsKLSAgaWYgKGJvdHRvbUxheWVyLT5nZXRUeXBlKCkgIT0gZnJMYXllclR5cGVFbnVtOjpST1VUSU5HKSB7Ci0gICAgYm90dG9tTE51bSsrOwotICAgIGJvdHRvbUxheWVyID0gZ2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0TGF5ZXIoYm90dG9tTE51bSk7Ci0gIH0KLSAgYm9vbCBpc0JvdHRvbUxheWVySCA9IChib3R0b21MYXllci0+Z2V0RGlyKCkgPT0gZnJQcmVmUm91dGluZ0RpckVudW06OmZyY0hvcnpQcmVmUm91dGluZ0Rpcik7Ci0KLSAgaW50IG51bUFzc2lnbmVkID0gMDsKLSAgaW50IG51bVBhbmVscyA9IDA7Ci0KLSAgLy8gSCBmaXJzdAotICBpZiAoaXNCb3R0b21MYXllckgpIHsKLSAgICBudW1Bc3NpZ25lZCA9IGluaXRUQV9oZWxwZXIoMCwgc2l6ZSwgMCwgdHJ1ZSwgbnVtUGFuZWxzKTsKLSAgICBpZiAoVkVSQk9TRSA+IDApIHsKLSAgICAgIGNvdXQgPDwiRG9uZSB3aXRoICIgPDxudW1Bc3NpZ25lZCA8PCIgaG9yaXpvbnRhbCB3aXJlcyBpbiAiIDw8bnVtUGFuZWxzIDw8IiBmcmJveGVzIGFuZCAiOwotICAgIH0KLSAgICBpbml0VEFfaGVscGVyKDAsIHNpemUsIDAsIGZhbHNlLCBudW1QYW5lbHMpOwotICAgIGlmIChWRVJCT1NFID4gMCkgewotICAgICAgY291dCA8PG51bUFzc2lnbmVkIDw8IiB2ZXJ0aWNhbCB3aXJlcyBpbiAiIDw8bnVtUGFuZWxzIDw8IiBmcmJveGVzLiIgPDxlbmRsOwotICAgIH0KLSAgLy8gViBmaXJzdAotICB9IGVsc2UgewotICAgIGluaXRUQV9oZWxwZXIoMCwgc2l6ZSwgMCwgZmFsc2UsIG51bVBhbmVscyk7Ci0gICAgaWYgKFZFUkJPU0UgPiAwKSB7Ci0gICAgICBjb3V0IDw8IkRvbmUgd2l0aCAiIDw8bnVtQXNzaWduZWQgPDwiIHZlcnRpY2FsIHdpcmVzIGluICIgPDxudW1QYW5lbHMgPDwiIGZyYm94ZXMgYW5kICI7Ci0gICAgfQotICAgIGluaXRUQV9oZWxwZXIoMCwgc2l6ZSwgMCwgdHJ1ZSwgbnVtUGFuZWxzKTsKLSAgICBpZiAoVkVSQk9TRSA+IDApIHsKLSAgICAgIGNvdXQgPDxudW1Bc3NpZ25lZCA8PCIgaG9yaXpvbnRhbCB3aXJlcyBpbiAiIDw8bnVtUGFuZWxzIDw8IiBmcmJveGVzLiIgPDxlbmRsOwotICAgIH0KLSAgfQotfQotCi12b2lkIEZsZXhUQTo6c2VhcmNoUmVwYWlyKGludCBpdGVyLCBpbnQgc2l6ZSwgaW50IG9mZnNldCkgewotICBmclRpbWUgdDsKLQotICBpZiAoVkVSQk9TRSA+IDEpIHsKLSAgICBpZiAoaXRlciA9PSAtMSkgewotICAgICAgY291dCA8PGVuZGwgPDwic3RhcnQgcG9saXNoaW5nIC4uLiIgPDxlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBjb3V0IDw8ZW5kbCA8PCJzdGFydCAiIDw8aXRlcjsKLSAgICAgIHN0cmluZyBzdWZmaXg7Ci0gICAgICBpZiAoaXRlciA9PSAxIHx8IChpdGVyID4gMjAgJiYgaXRlciAlIDEwID09IDEpKSB7Ci0gICAgICAgIHN1ZmZpeCA9ICJzdCI7Ci0gICAgICB9IGVsc2UgaWYgKGl0ZXIgPT0gMiB8fCAoaXRlciA+IDIwICYmIGl0ZXIgJSAxMCA9PSAyKSkgewotICAgICAgICBzdWZmaXggPSAibmQiOwotICAgICAgfSBlbHNlIGlmIChpdGVyID09IDMgfHwgKGl0ZXIgPiAyMCAmJiBpdGVyICUgMTAgPT0gMykpIHsKLSAgICAgICAgc3VmZml4ID0gInJkIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN1ZmZpeCA9ICJ0aCI7Ci0gICAgICB9Ci0gICAgICBjb3V0IDw8c3VmZml4IDw8IiBvcHRpbWl6YXRpb24gaXRlcmF0aW9uIC4uLiIgPDxlbmRsOwotICAgIH0KLSAgfQotICBhdXRvIGJvdHRvbUxOdW0gPSBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRCb3R0b21MYXllck51bSgpOwotICBhdXRvIGJvdHRvbUxheWVyID0gZ2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0TGF5ZXIoYm90dG9tTE51bSk7Ci0gIGlmIChib3R0b21MYXllci0+Z2V0VHlwZSgpICE9IGZyTGF5ZXJUeXBlRW51bTo6Uk9VVElORykgewotICAgIGJvdHRvbUxOdW0rKzsKLSAgICBib3R0b21MYXllciA9IGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldExheWVyKGJvdHRvbUxOdW0pOwotICB9Ci0gIGJvb2wgaXNCb3R0b21MYXllckggPSAoYm90dG9tTGF5ZXItPmdldERpcigpID09IGZyUHJlZlJvdXRpbmdEaXJFbnVtOjpmcmNIb3J6UHJlZlJvdXRpbmdEaXIpOwotCi0gIC8vaW50IHNvbCA9IDA7Ci0gIGludCBudW1Bc3NpZ25lZCA9IDA7Ci0gIGludCBudW1QYW5lbHMgPSAwOwotICAvLyBIIGZpcnN0Ci0gIGlmIChpc0JvdHRvbUxheWVySCkgewotICAgIG51bUFzc2lnbmVkID0gaW5pdFRBX2hlbHBlcihpdGVyLCBzaXplLCBvZmZzZXQsIHRydWUsIG51bVBhbmVscyk7Ci0gICAgaWYgKFZFUkJPU0UgPiAwKSB7Ci0gICAgICBjb3V0IDw8IkRvbmUgd2l0aCAiIDw8bnVtQXNzaWduZWQgPDwiIGhvcml6b250YWwgd2lyZXMgaW4gIiA8PG51bVBhbmVscyA8PCIgZnJib3hlcyBhbmQgIjsKLSAgICB9Ci0gICAgbnVtQXNzaWduZWQgPSBpbml0VEFfaGVscGVyKGl0ZXIsIHNpemUsIG9mZnNldCwgZmFsc2UsIG51bVBhbmVscyk7Ci0gICAgaWYgKFZFUkJPU0UgPiAwKSB7Ci0gICAgICBjb3V0IDw8bnVtQXNzaWduZWQgPDwiIHZlcnRpY2FsIHdpcmVzIGluICIgPDxudW1QYW5lbHMgPDwiIGZyYm94ZXMuIiA8PGVuZGw7Ci0gICAgfQotICAvLyBWIGZpcnN0Ci0gIH0gZWxzZSB7Ci0gICAgbnVtQXNzaWduZWQgPSBpbml0VEFfaGVscGVyKGl0ZXIsIHNpemUsIG9mZnNldCwgZmFsc2UsIG51bVBhbmVscyk7Ci0gICAgaWYgKFZFUkJPU0UgPiAwKSB7Ci0gICAgICBjb3V0IDw8IkRvbmUgd2l0aCAiIDw8bnVtQXNzaWduZWQgPDwiIHZlcnRpY2FsIHdpcmVzIGluICIgPDxudW1QYW5lbHMgPDwiIGZyYm94ZXMgYW5kICI7Ci0gICAgfQotICAgIG51bUFzc2lnbmVkID0gaW5pdFRBX2hlbHBlcihpdGVyLCBzaXplLCBvZmZzZXQsIHRydWUsIG51bVBhbmVscyk7Ci0gICAgaWYgKFZFUkJPU0UgPiAwKSB7Ci0gICAgICBjb3V0IDw8bnVtQXNzaWduZWQgPDwiIGhvcml6b250YWwgd2lyZXMgaW4gIiA8PG51bVBhbmVscyA8PCIgZnJib3hlcy4iIDw8ZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotaW50IEZsZXhUQTo6bWFpbigpIHsKLSAgZnJUaW1lIHQ7Ci0gIGlmIChWRVJCT1NFID4gMCkgewotICAgIGNvdXQgPDxlbmRsIDw8ZW5kbCA8PCJzdGFydCB0cmFjayBhc3NpZ25tZW50IiA8PGVuZGw7Ci0gIH0KLSAgaW5pdFRBKDUwKTsKLSAgc2VhcmNoUmVwYWlyKDEsIDUwLCAwKTsKLSAgLy9zZWFyY2hSZXBhaXIoMiwgNTAsIDApOwotICAvL3NlYXJjaFJlcGFpcigtMSwgNTAsIDApOwotCi0gIGlmIChWRVJCT1NFID4gMCkgewotICAgIGNvdXQgPDxlbmRsIDw8ImNvbXBsZXRlIHRyYWNrIGFzc2lnbm1lbnQiOwotICAgIC8vZW5kKCk7Ci0gIH0KLSAgaWYgKFZFUkJPU0UgPiAwKSB7Ci0gICAgY291dCA8PGVuZGw7Ci0gICAgdC5wcmludCgpOwotICAgIGNvdXQgPDxlbmRsOwotICB9Ci0gIHJldHVybiAwOwotfQotCi0vKgotdm9pZCBGbGV4VEFXb3JrZXI6OmdldEFsbEd1aWRlcygpIHsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIHZlY3RvcjxycV9ycHRyX3ZhbHVlX3Q8ZnJHdWlkZT4gPiByZXN1bHQxOwotICBnZXREZXNpZ24oKS0+Z2V0UmVnaW9uUXVlcnkoKS0+cXVlcnlHdWlkZShyb3V0ZUJveCwgbGF5ZXJOdW0sIHJlc3VsdDEpOwotICAvL2NvdXQgPDxlbmRsIDw8InF1ZXJ5MToiIDw8ZW5kbDsKLSAgZm9yIChhdXRvICZbYm9vc3RiLCBndWlkZV06IHJlc3VsdDEpIHsKLSAgICBmclBvaW50IHB0MSwgcHQyOwotICAgIGd1aWRlLT5nZXRQb2ludHMocHQxLCBwdDIpOwotICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgIGNvdXQgPDwiZm91bmQgZ3VpZGUgKCIgCi0gICAgICAgICAgIDw8cHQxLngoKSAqIDEuMCAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpIDw8IiwgIiAKLSAgICAgICAgICAgPDxwdDEueSgpICogMS4wIC8gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCkgPDwiKSAoIiAKLSAgICAgICAgICAgPDxwdDIueCgpICogMS4wIC8gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCkgPDwiLCAiIAotICAgICAgICAgICA8PHB0Mi55KCkgKiAxLjAgLyBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0REJVUGVyVVUoKSA8PCIpICIgCi0gICAgICAgICAgIDw8Z3VpZGUtPmdldE5ldCgpLT5nZXROYW1lKCkgPDwgIlxuIjsKLSAgICB9Ci0gICAgZ3VpZGVzLnB1c2hfYmFjayhndWlkZSk7Ci0gICAgLy9jb3V0IDw8ZW5kbDsKLSAgfQotICBzb3J0KGd1aWRlcy5iZWdpbigpLCBndWlkZXMuZW5kKCksIFtdKGNvbnN0IGZyR3VpZGUgKmEsIGNvbnN0IGZyR3VpZGUgKmIpIHtyZXR1cm4gKmEgPCAqYjt9KTsKLX0KLSovCi0KLS8qCi12b2lkIEZsZXhUQVdvcmtlcjo6Z2V0QWxsVHJhY2tzKCkgewotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLSAgLy8gdVB0ciBmb3IgdHAKLSAgZm9yIChhdXRvICZ0cDogZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldFRyYWNrUGF0dGVybnMobGF5ZXJOdW0pKSB7Ci0gICAgaWYgKChnZXRUZWNoKCktPmdldExheWVycygpLmF0KGxheWVyTnVtKS0+Z2V0RGlyKCkgPT0gZnJjSG9yelByZWZSb3V0aW5nRGlyICYmCi0gICAgICAgICB0cC0+aXNIb3Jpem9udGFsKCkgPT0gZmFsc2UpIHx8Ci0gICAgICAgIChnZXRUZWNoKCktPmdldExheWVycygpLmF0KGxheWVyTnVtKS0+Z2V0RGlyKCkgPT0gZnJjVmVydFByZWZSb3V0aW5nRGlyICYmCi0gICAgICAgICB0cC0+aXNIb3Jpem9udGFsKCkgPT0gdHJ1ZSkpIHsKLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCJUUkFDS1MgIiA8PCh0cC0+aXNIb3Jpem9udGFsKCkgPyBzdHJpbmcoIlggIikgOiBzdHJpbmcoIlkgIikpCi0gICAgICAgICAgICAgPDx0cC0+Z2V0U3RhcnRDb29yZCgpIDw8IiBETyAiIDw8dHAtPmdldE51bVRyYWNrcygpIDw8IiBTVEVQICIKLSAgICAgICAgICAgICA8PHRwLT5nZXRUcmFja1NwYWNpbmcoKSA8PCIgTEFZRVIgIiA8PHRwLT5nZXRMYXllck51bSgpIAotICAgICAgICAgICAgIDw8IiA7IiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgICBpZiAoZ2V0VGVjaCgpLT5nZXRMYXllcnMoKS5hdChsYXllck51bSktPmdldERpcigpID09IGZyY0hvcnpQcmVmUm91dGluZ0RpcikgewotICAgICAgICBpbnQgdHJhY2tOdW0gPSAocm91dGVCb3guYm90dG9tKCkgLSB0cC0+Z2V0U3RhcnRDb29yZCgpKSAvIChpbnQpdHAtPmdldFRyYWNrU3BhY2luZygpOwotICAgICAgICBpZiAodHJhY2tOdW0gPCAwKSB7Ci0gICAgICAgICAgdHJhY2tOdW0gPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0cmFja051bSAqIChpbnQpdHAtPmdldFRyYWNrU3BhY2luZygpICsgdHAtPmdldFN0YXJ0Q29vcmQoKSA8IHJvdXRlQm94LmJvdHRvbSgpKSB7Ci0gICAgICAgICAgdHJhY2tOdW0rKzsKLSAgICAgICAgfQotICAgICAgICBmb3IgKDsgdHJhY2tOdW0gPCAoaW50KXRwLT5nZXROdW1UcmFja3MoKSAmJiB0cmFja051bSAqIChpbnQpdHAtPmdldFRyYWNrU3BhY2luZygpICsgdHAtPmdldFN0YXJ0Q29vcmQoKSA8IHJvdXRlQm94LnRvcCgpOyB0cmFja051bSsrKSB7Ci0gICAgICAgICAgdW5pcXVlX3B0cjxGbGV4VHJhY2s+IGZ0ID0gbWFrZV91bmlxdWU8RmxleFRyYWNrPigpOwotICAgICAgICAgIGZ0LT5zZXRUcmFja1BhdHRlcm4odHAuZ2V0KCkpOwotICAgICAgICAgIGZ0LT5zZXRUcmFja0xvYyh0cmFja051bSAqIHRwLT5nZXRUcmFja1NwYWNpbmcoKSArIHRwLT5nZXRTdGFydENvb3JkKCkpOwotICAgICAgICAgIHRyYWNrcy5wdXNoX2JhY2soc3RkOjptb3ZlKGZ0KSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCB0cmFja051bSA9IChyb3V0ZUJveC5sZWZ0KCkgLSB0cC0+Z2V0U3RhcnRDb29yZCgpKSAvIChpbnQpdHAtPmdldFRyYWNrU3BhY2luZygpOwotICAgICAgICBpZiAodHJhY2tOdW0gPCAwKSB7Ci0gICAgICAgICAgdHJhY2tOdW0gPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0cmFja051bSAqIChpbnQpdHAtPmdldFRyYWNrU3BhY2luZygpICsgdHAtPmdldFN0YXJ0Q29vcmQoKSA8IHJvdXRlQm94LmxlZnQoKSkgewotICAgICAgICAgIHRyYWNrTnVtKys7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yICg7IHRyYWNrTnVtIDwgKGludCl0cC0+Z2V0TnVtVHJhY2tzKCkgJiYgdHJhY2tOdW0gKiAoaW50KXRwLT5nZXRUcmFja1NwYWNpbmcoKSArIHRwLT5nZXRTdGFydENvb3JkKCkgPCByb3V0ZUJveC5yaWdodCgpOyB0cmFja051bSsrKSB7Ci0gICAgICAgICAgdW5pcXVlX3B0cjxGbGV4VHJhY2s+IGZ0ID0gbWFrZV91bmlxdWU8RmxleFRyYWNrPigpOwotICAgICAgICAgIGZ0LT5zZXRUcmFja1BhdHRlcm4odHAuZ2V0KCkpOwotICAgICAgICAgIGZ0LT5zZXRUcmFja0xvYyh0cmFja051bSAqIHRwLT5nZXRUcmFja1NwYWNpbmcoKSArIHRwLT5nZXRTdGFydENvb3JkKCkpOwotICAgICAgICAgIHRyYWNrcy5wdXNoX2JhY2soc3RkOjptb3ZlKGZ0KSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgIH0KLSAgfQotICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgZm9yIChhdXRvICZ0OiB0cmFja3MpIHsKLSAgICAgIGNvdXQgPDwiVFJBQ0tMT0MgIiA8PHQtPmdldFRyYWNrTG9jKCkgPDxlbmRsOwotICAgIH0KLSAgfQotfQotKi8KLQotLy8gcmV0dXJuX3ZhbCA9IDA6IGxlZnQgc2V0LCByaWdodCBzZXQKLS8vIHJldHVybl92YWwgPSAxOiBsZWZ0IHNldCwgcmlnaHQgbm90IHNldAotLy8gcmV0dXJuX3ZhbCA9IDI6IGxlZnQgbm90IHNldCwgcmlnaHQgc2V0Ci0vLyByZXR1cm5fdmFsID0gMzogbGVmdCBub3Qgc2V0LCByaWdodCBub3Qgc2V0Ci0vKgotdm9pZCBGbGV4VEFXb3JrZXI6Omdlbklyb3V0ZXNfc2V0QmVnaW5FbmQoRmxleElyb3V0ZSogaXJvdXRlLCBib29sIGlzSCkgewotICBhdXRvIGd1aWRlID0gaXJvdXRlLT5nZXRHdWlkZSgpOwotICBhdXRvIG5ldCAgID0gZ3VpZGUtPmdldE5ldCgpOwotICBpZiAoZ3VpZGUpIHsKLSAgICA7Ci0gIH0gZWxzZSB7Ci0gICAgY291dCA8PCJFcnJvcjogZ2VuSXJvdXRlc19zZXRCZWdpbkVuZCBjYW5ub3QgbG9jayBndWlkZSIgPDxlbmRsOwotICAgIGV4aXQoMSk7Ci0gIH0KLSAgYm9vbCAgICBoYXNNYXhCZWdpbiA9IGZhbHNlOwotICBib29sICAgIGhhc01pbkVuZCAgID0gZmFsc2U7Ci0gIGZyQ29vcmQgbWF4QmVnaW4gICAgPSAwOwotICBmckNvb3JkIG1pbkVuZCAgICAgID0gMDsKLSAgZnJQb2ludCBzZWdCZWdpbiwgc2VnRW5kOwotICAKLSAgZnJQb2ludCBicCwgZXA7Ci0gIGd1aWRlLT5nZXRQb2ludHMoYnAsIGVwKTsKLSAgZnJQb2ludCBjcDsKLSAgLy8gbGF5ZXJOdW0gaW4gRmxleFRBV29ya2VyCi0gIHZlY3Rvcjxmckd1aWRlKj4gbmJyR3VpZGVzOwotICBhdXRvIHJxID0gZ2V0RGVzaWduKCktPmdldFJlZ2lvblF1ZXJ5KCk7Ci0gIGludCB3bGVuID0gMDsKLSAgZnJCb3ggYm94OwotICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotICAgIG5ickd1aWRlcy5jbGVhcigpOwotICAgIC8vIGNoZWNrIGxlZnQKLSAgICBpZiAoaSA9PSAwKSB7Ci0gICAgICBib3guc2V0KGJwLCBicCk7Ci0gICAgICBjcCA9IGJwOwotICAgIC8vIGNoZWNrIHJpZ2h0Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJveC5zZXQoZXAsIGVwKTsKLSAgICAgIGNwID0gZXA7Ci0gICAgfQotICAgIGlmIChsYXllck51bSAtIDIgPj0gMCkgewotICAgICAgcnEtPnF1ZXJ5R3VpZGUoYm94LCBsYXllck51bSAtIDIsIG5ickd1aWRlcyk7Ci0gICAgfSAKLSAgICBpZiAobGF5ZXJOdW0gKyAyIDwgKGludClkZXNpZ24tPmdldFRlY2goKS0+Z2V0TGF5ZXJzKCkuc2l6ZSgpKSB7Ci0gICAgICBycS0+cXVlcnlHdWlkZShib3gsIGxheWVyTnVtICsgMiwgbmJyR3VpZGVzKTsKLSAgICB9IAotICAgIGZvciAoYXV0byAmZ3VpZGU6IG5ickd1aWRlcykgewotICAgICAgaWYgKGd1aWRlLT5nZXROZXQoKSA9PSBuZXQpIHsKLSAgICAgICAgZm9yIChhdXRvICZjb25uRmlnOiBndWlkZS0+Z2V0Um91dGVzKCkpIHsKLSAgICAgICAgICBpZiAoY29ubkZpZy0+dHlwZUlkKCkgPT0gZnJjUGF0aFNlZykgewotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZnJQYXRoU2VnKj4oY29ubkZpZy5nZXQoKSktPmdldFBvaW50cyhzZWdCZWdpbiwgc2VnRW5kKTsKLSAgICAgICAgICAgIGlmIChpID09IDApIHsKLSAgICAgICAgICAgICAgaWYgKGhhc01heEJlZ2luKSB7Ci0gICAgICAgICAgICAgICAgbWF4QmVnaW4gPSBtYXgobWF4QmVnaW4sIChpc0ggPyBzZWdCZWdpbi54KCkgOiBzZWdCZWdpbi55KCkpKTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtYXhCZWdpbiA9IChpc0ggPyBzZWdCZWdpbi54KCkgOiBzZWdCZWdpbi55KCkpOwotICAgICAgICAgICAgICAgIGhhc01heEJlZ2luID0gdHJ1ZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgaWYgKGhhc01pbkVuZCkgewotICAgICAgICAgICAgICAgIG1pbkVuZCA9IG1pbihtaW5FbmQsIChpc0ggPyBzZWdCZWdpbi54KCkgOiBzZWdCZWdpbi55KCkpKTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtaW5FbmQgPSAoaXNIID8gc2VnQmVnaW4ueCgpIDogc2VnQmVnaW4ueSgpKTsKLSAgICAgICAgICAgICAgICBoYXNNaW5FbmQgPSB0cnVlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZyUG9pbnQgbmJyQnAsIG5ickVwOwotICAgICAgICBpZiAoY3AgPT0gbmJyRXApIHsKLSAgICAgICAgICB3bGVuIC09IDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgd2xlbiArPSAxOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZnJQb2ludCBndWlkZUJlZ2luLCBndWlkZUVuZDsKLSAgZ3VpZGUtPmdldFBvaW50cyhndWlkZUJlZ2luLCBndWlkZUVuZCk7Ci0gIGlmICghaGFzTWF4QmVnaW4pIHsKLSAgICBtYXhCZWdpbiA9IChpc0ggPyBndWlkZUJlZ2luLngoKSA6IGd1aWRlQmVnaW4ueSgpKTsKLSAgfQotICBpZiAoIWhhc01pbkVuZCkgewotICAgIG1pbkVuZCA9IChpc0ggPyBndWlkZUVuZC54KCkgOiBndWlkZUVuZC55KCkpOwotICB9Ci0gIGlmIChtYXhCZWdpbiA+IG1pbkVuZCkgewotICAgIHN3YXAobWF4QmVnaW4sIG1pbkVuZCk7Ci0gIH0KLSAgaWYgKG1heEJlZ2luID09IG1pbkVuZCkgewotICAgIG1pbkVuZCArPSAxOwotICB9Ci0KLSAgaXJvdXRlLT5zZXRCZWdpbihtYXhCZWdpbik7Ci0gIGlyb3V0ZS0+c2V0RW5kKG1pbkVuZCk7Ci0gIGlyb3V0ZS0+c2V0V2xlbkhlbHBlcih3bGVuKTsKLQotfQotKi8KLQotLyoKLXZvaWQgRmxleFRBV29ya2VyOjpnZW5Jcm91dGVzKCkgewotICB1bmlxdWVfcHRyPEZsZXhJcm91dGU+IGlyb3V0ZTsKLSAgYm9vbCBpc0ggPSAoZ2V0RGlyKCkgPT0gZnJjSG9yelByZWZSb3V0aW5nRGlyKSA/IHRydWUgOiBmYWxzZTsKLSAgZm9yIChhdXRvIGd1aWRlOiBndWlkZXMpIHsKLSAgICBpZiAoZ3VpZGUpIHsKLSAgICAgIDsKLSAgICB9IGVsc2UgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlyb3V0ZSA9IG1ha2VfdW5pcXVlPEZsZXhJcm91dGU+KCk7Ci0gICAgaXJvdXRlLT5zZXRHdWlkZShndWlkZSk7Ci0gICAgZ2VuSXJvdXRlc19zZXRCZWdpbkVuZChpcm91dGUuZ2V0KCksIGlzSCk7Ci0gICAgaXJvdXRlcy5wdXNoX2JhY2soc3RkOjptb3ZlKGlyb3V0ZSkpOwotICB9Ci0gIHNvcnQoaXJvdXRlcy5iZWdpbigpLCBpcm91dGVzLmVuZCgpLCAKLSAgICAgICBbXShjb25zdCB1bmlxdWVfcHRyPEZsZXhJcm91dGU+ICZhLCBjb25zdCB1bmlxdWVfcHRyPEZsZXhJcm91dGU+ICZiKSB7Ci0gICAgICAgICBpZiAoYS0+Z2V0RW5kKCkgLSBhLT5nZXRCZWdpbigpID09IGItPmdldEVuZCgpIC0gYi0+Z2V0QmVnaW4oKSkgewotICAgICAgICAgICByZXR1cm4gKihhLT5nZXRHdWlkZSgpKSA8ICooYi0+Z2V0R3VpZGUoKSk7Ci0gICAgICAgICB9IGVsc2UgewotICAgICAgICAgICByZXR1cm4gKGEtPmdldEVuZCgpIC0gYS0+Z2V0QmVnaW4oKSkgPiAoYi0+Z2V0RW5kKCkgLSBiLT5nZXRCZWdpbigpKTsKLSAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgICApOwotfQotKi8KLS8qCi12b2lkIEZsZXhUQVdvcmtlcjo6aW5pdCgpIHsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIGdldEFsbEd1aWRlcygpOwotICAvL2lmIChlbmFibGVPdXRwdXQpIHsKLSAgLy8gIHN0cmluZ3N0cmVhbSBzczsKLSAgLy8gIHNzIDw8IiNndWlkZXNzID0gIiA8PGd1aWRlcy5zaXplKCkgPDxlbmRsOwotICAvLyAgY291dCA8PHNzLnN0cigpIDw8Zmx1c2g7Ci0gIC8vfQotICAvL3NvcnQoZ3VpZGVzLmJlZ2luKCksIGd1aWRlcy5lbmQoKSwgCi0gIC8vICAgICBbXShjb25zdCB3ZWFrX3B0cjxmckd1aWRlPiAmYSwgY29uc3Qgd2Vha19wdHI8ZnJHdWlkZT4gJmIpIHsKLSAgLy8gICAgICAgZnJCZWdpbgotCi0gIC8vICAgICAgIHJldHVybiBhLmxvY2soKS0+Z2V0VHJhY2tMb2MoKSA+IGItPmdldFRyYWNrTG9jKCk7Ci0gIC8vICAgICB9Ci0gIC8vICAgICk7Ci0KLSAgZ2VuSXJvdXRlcygpOwotCi0gIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICBzdHJpbmdzdHJlYW0gc3M7Ci0gICAgc3MgPDwiI2d1aWRlcyA9ICIgPDxndWlkZXMuc2l6ZSgpIDw8ZW5kbDsKLSAgICBjb3V0IDw8c3Muc3RyKCkgPDxmbHVzaDsKLSAgfQotICBnZXRBbGxUcmFja3MoKTsKLSAgc29ydCh0cmFja3MuYmVnaW4oKSwgdHJhY2tzLmVuZCgpLCAKLSAgICAgICBbXShjb25zdCB1bmlxdWVfcHRyPEZsZXhUcmFjaz4gJmEsIGNvbnN0IHVuaXF1ZV9wdHI8RmxleFRyYWNrPiAmYikgewotICAgICAgICAgcmV0dXJuIGEtPmdldFRyYWNrTG9jKCkgPiBiLT5nZXRUcmFja0xvYygpOwotICAgICAgIH0KLSAgICAgICk7Ci0gIGF1dG8gbGFzdCA9IHVuaXF1ZSh0cmFja3MuYmVnaW4oKSwgdHJhY2tzLmVuZCgpLCAKLSAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IHVuaXF1ZV9wdHI8RmxleFRyYWNrPiAmYSwgY29uc3QgdW5pcXVlX3B0cjxGbGV4VHJhY2s+ICZiKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLT5nZXRUcmFja0xvYygpID09IGItPmdldFRyYWNrTG9jKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgKTsKLSAgdHJhY2tzLmVyYXNlKGxhc3QsIHRyYWNrcy5lbmQoKSk7Ci0KLX0KLSovCi0KLS8vYm9vbCBGbGV4VEFXb3JrZXI6OmlzVmlhT25QYXRoU2VnKGNvbnN0IHNoYXJlZF9wdHI8ZnJQYXRoU2VnPiAmcGF0aFNlZywgY29uc3Qgc2hhcmVkX3B0cjxmclZpYT4gJnZpYSkgewotLy8gIGZyUG9pbnQgYmVnaW4sIGVuZCwgdmlhUG9pbnQ7Ci0vLyAgcGF0aFNlZy0+Z2V0UG9pbnRzKGJlZ2luLCBlbmQpOwotLy8gIHZpYS0+Z2V0T3JpZ2luKHZpYVBvaW50KTsKLS8vICAvLyB2ZXJ0aWNhbCBzZWcKLS8vICBpZiAoYmVnaW4ueCgpID09IGVuZC54KCkgJiYgYmVnaW4ueCgpID09IHZpYVBvaW50LngoKSAmJiBiZWdpbi55KCkgPD0gdmlhUG9pbnQueSgpICYmIGVuZC55KCkgPj0gdmlhUG9pbnQueSgpKSB7Ci0vLyAgICByZXR1cm4gdHJ1ZTsKLS8vICB9Ci0vLyAgLy8gaG9yaXpvbnRhbCBzZWcKLS8vICBpZiAoYmVnaW4ueSgpID09IGVuZC55KCkgJiYgYmVnaW4ueSgpID09IHZpYVBvaW50LnkoKSAmJiBiZWdpbi54KCkgPD0gdmlhUG9pbnQueCgpICYmIGVuZC54KCkgPj0gdmlhUG9pbnQueCgpKSB7Ci0vLyAgICByZXR1cm4gdHJ1ZTsKLS8vICB9Ci0vLyAgcmV0dXJuIGZhbHNlOwotLy99Ci0KLS8vYm9vbCBGbGV4VEFXb3JrZXI6OmlzVmlhT25UcmFjayhjb25zdCBzaGFyZWRfcHRyPEZsZXhUcmFjaz4gJnRyYWNrLCBjb25zdCBzaGFyZWRfcHRyPGZyVmlhPiAmdmlhKSB7Ci0vLyAgZnJQb2ludCB2aWFQb2ludDsKLS8vICB2aWEtPmdldE9yaWdpbih2aWFQb2ludCk7Ci0vLyAgYm9vbCBpc1ZlcnRpY2FsTGF5ZXIgPSB0cmFjay0+Z2V0VHJhY2tQYXR0ZXJuKCktPmlzSG9yaXpvbnRhbCgpOwotLy8gIHJldHVybiAoKGlzVmVydGljYWxMYXllciA/IHZpYVBvaW50LngoKSA6IHZpYVBvaW50LnkoKSkgPT0gdHJhY2stPmdldFRyYWNrTG9jKCkpOwotLy99Ci0KLS8vYm9vbCBGbGV4VEFXb3JrZXI6OmlzUGF0aFNlZ09uVHJhY2soY29uc3Qgc2hhcmVkX3B0cjxGbGV4VHJhY2s+ICZ0cmFjaywgY29uc3Qgc2hhcmVkX3B0cjxmclBhdGhTZWc+ICZwYXRoU2VnKSB7Ci0vLyAgZnJQb2ludCBiZWdpbiwgZW5kOwotLy8gIHBhdGhTZWctPmdldFBvaW50cyhiZWdpbiwgZW5kKTsKLS8vICBib29sIGlzVmVydGljYWxMYXllciA9IHRyYWNrLT5nZXRUcmFja1BhdHRlcm4oKS0+aXNIb3Jpem9udGFsKCk7Ci0vLyAgaWYgKGlzVmVydGljYWxMYXllcikgewotLy8gICAgaWYgKGJlZ2luLngoKSA9PSBlbmQueCgpICYmIGJlZ2luLngoKSA9PSB0cmFjay0+Z2V0VHJhY2tMb2MoKSkgewotLy8gICAgICByZXR1cm4gdHJ1ZTsKLS8vICAgIH0gZWxzZSB7Ci0vLyAgICAgIHJldHVybiBmYWxzZTsKLS8vICAgIH0KLS8vICB9IGVsc2UgewotLy8gICAgaWYgKGJlZ2luLnkoKSA9PSBlbmQueSgpICYmIGJlZ2luLnkoKSA9PSB0cmFjay0+Z2V0VHJhY2tMb2MoKSkgewotLy8gICAgICByZXR1cm4gdHJ1ZTsKLS8vICAgIH0gZWxzZSB7Ci0vLyAgICAgIHJldHVybiBmYWxzZTsKLS8vICAgIH0KLS8vICB9Ci0vL30KLQotLy9ib29sIEZsZXhUQVdvcmtlcjo6aGFzUGF0aFNlZ0xpbWl0KGNvbnN0IHNoYXJlZF9wdHI8ZnJHdWlkZT4gJmd1aWRlLCBjb25zdCBzaGFyZWRfcHRyPGZyUGF0aFNlZz4gJnBhdGhTZWcsIAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2hlY2tMb3dlckxheWVyLCBib29sIGNoZWNrVXBwZXJMYXllcikgewotLy8gIGJvb2wgaW5pdCA9IGZhbHNlOwotLy8gIGZyQ29vcmQgbGltaXQgPSAwOwotLy8KLS8vICBhdXRvIHYgPSBndWlkZS0+Z2V0QmVnaW5Db25uKCk7Ci0vLyAgZ2V0UGF0aFNlZ0xpbWl0X2hlbHBlcihndWlkZSwgcGF0aFNlZywgY2hlY2tMb3dlckxheWVyLCBjaGVja1VwcGVyTGF5ZXIsIHRydWUsIHYsIGluaXQsIGxpbWl0KTsKLS8vICB2ID0gZ3VpZGUtPmdldEVuZENvbm4oKTsKLS8vICBnZXRQYXRoU2VnTGltaXRfaGVscGVyKGd1aWRlLCBwYXRoU2VnLCBjaGVja0xvd2VyTGF5ZXIsIGNoZWNrVXBwZXJMYXllciwgdHJ1ZSwgdiwgaW5pdCwgbGltaXQpOwotLy8gIHJldHVybiBpbml0OwotLy99Ci0KLS8vIG9ubHUgdXNlZCBmb3IgdXBwZXIvbG93ZXIgbGF5ZXIsIGtlZXAgZXhpc3Rpbmcgc2FtZS1sYXllciBjb25uZWN0aW9uCi0vL3ZvaWQgRmxleFRBV29ya2VyOjpnZXRQYXRoU2VnTGltaXRfaGVscGVyKGNvbnN0IHNoYXJlZF9wdHI8ZnJHdWlkZT4gJmd1aWRlLCBjb25zdCBzaGFyZWRfcHRyPGZyUGF0aFNlZz4gJnBhdGhTZWcsIAotLy8gIGJvb2wgY2hlY2tMb3dlckxheWVyLCBib29sIGNoZWNrVXBwZXJMYXllciwgYm9vbCBpc0JlZ2luLCBjb25zdCBzaGFyZWRfcHRyPGZyQmxvY2tPYmplY3Q+ICZ2LCBib29sICZpbml0LCAKLS8vICBmckNvb3JkICZsaW1pdCkgewotLy8KLS8vICBhdXRvIG5ldCAgID0gZ3VpZGUtPmdldE5ldCgpOwotLy8KLS8vICBmclBvaW50IGJlZ2luLCBlbmQsIHZpYVBvaW50OwotLy8gIHBhdGhTZWctPmdldFBvaW50cyhiZWdpbiwgZW5kKTsKLS8vICAvL2F1dG8gcGF0aFNlZ0xheWVyTnVtID0gcGF0aFNlZy0+Z2V0TGF5ZXJOdW0oKTsKLS8vICAKLS8vICBmckNvbGxlY3Rpb248c2hhcmVkX3B0cjxmckd1aWRlPiA+IGNvbm5HdWlkZXM7Ci0vLyAgaWYgKHYtPnR5cGVJZCgpID09IGZyY1N0ZWluZXIpIHsKLS8vICAgIHN0YXRpY19wb2ludGVyX2Nhc3Q8ZnJTdGVpbmVyPih2KS0+Z2V0Q29ubkd1aWRlcyhjb25uR3VpZGVzKTsKLS8vICB9IGVsc2UgewotLy8gICAgcmV0dXJuOwotLy8gIH0KLS8vCi0vLyAgYXV0byBuYnJHdWlkZSA9IGNvbm5HdWlkZXMuYXQoMik7Ci0vLyAgaWYgKG5ickd1aWRlICYmIGNoZWNrTG93ZXJMYXllciAmJiBuYnJHdWlkZS0+aGFzUm91dGVzKCkpIHsKLS8vICAgIGZvciAoYXV0byAmY29ubkZpZzogbmJyR3VpZGUtPmdldFJvdXRlcygpKSB7Ci0vLyAgICAgIGlmIChjb25uRmlnLT50eXBlSWQoKSA9PSBmcmNWaWEpIHsKLS8vICAgICAgICBhdXRvIHZpYSA9IHN0YXRpY19wb2ludGVyX2Nhc3Q8ZnJWaWE+KGNvbm5GaWcpOwotLy8gICAgICAgIGlmIChpc1ZpYU9uUGF0aFNlZyhwYXRoU2VnLCB2aWEpKSB7Ci0vLyAgICAgICAgICB2aWEtPmdldE9yaWdpbih2aWFQb2ludCk7Ci0vLyAgICAgICAgICAvLyBhc3N1bWVzIGFsd2F5cyBwcmVmZXJyZWQtZGlyZWN0aW9uIHJvdXRpbmcKLS8vICAgICAgICAgIGlmIChnZXRUZWNoKCktPmdldExheWVyKHBhdGhTZWctPmdldExheWVyTnVtKCkpLT5nZXREaXIoKSA9PSBmcmNIb3J6UHJlZlJvdXRpbmdEaXIpIHsKLS8vICAgICAgICAgICAgaWYgKGluaXQpIHsKLS8vICAgICAgICAgICAgICBsaW1pdCA9IGlzQmVnaW4gPyBtaW4obGltaXQsIHZpYVBvaW50LngoKSkgOiBtYXgobGltaXQsIHZpYVBvaW50LngoKSk7Ci0vLyAgICAgICAgICAgIH0gZWxzZSB7Ci0vLyAgICAgICAgICAgICAgbGltaXQgPSB2aWFQb2ludC54KCk7Ci0vLyAgICAgICAgICAgICAgaW5pdCA9IHRydWU7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgIH0gZWxzZSB7Ci0vLyAgICAgICAgICAgIGlmIChpbml0KSB7Ci0vLyAgICAgICAgICAgICAgbGltaXQgPSBpc0JlZ2luID8gbWluKGxpbWl0LCB2aWFQb2ludC55KCkpIDogbWF4KGxpbWl0LCB2aWFQb2ludC55KCkpOwotLy8gICAgICAgICAgICB9IGVsc2UgewotLy8gICAgICAgICAgICAgIGxpbWl0ID0gdmlhUG9pbnQueSgpOwotLy8gICAgICAgICAgICAgIGluaXQgPSB0cnVlOwotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgfQotLy8gIG5ickd1aWRlID0gY29ubkd1aWRlcy5hdCgzKTsKLS8vICBpZiAobmJyR3VpZGUgJiYgY2hlY2tVcHBlckxheWVyICYmIG5ickd1aWRlLT5oYXNSb3V0ZXMoKSkgewotLy8gICAgZm9yIChhdXRvICZjb25uRmlnOiBuYnJHdWlkZS0+Z2V0Um91dGVzKCkpIHsKLS8vICAgICAgaWYgKGNvbm5GaWctPnR5cGVJZCgpID09IGZyY1ZpYSkgewotLy8gICAgICAgIGF1dG8gdmlhID0gc3RhdGljX3BvaW50ZXJfY2FzdDxmclZpYT4oY29ubkZpZyk7Ci0vLyAgICAgICAgaWYgKGlzVmlhT25QYXRoU2VnKHBhdGhTZWcsIHZpYSkpIHsKLS8vICAgICAgICAgIHZpYS0+Z2V0T3JpZ2luKHZpYVBvaW50KTsKLS8vICAgICAgICAgIC8vIGFzc3VtZXMgYWx3YXlzIHByZWZlcnJlZC1kaXJlY3Rpb24gcm91dGluZwotLy8gICAgICAgICAgaWYgKGdldFRlY2goKS0+Z2V0TGF5ZXIocGF0aFNlZy0+Z2V0TGF5ZXJOdW0oKSktPmdldERpcigpID09IGZyY0hvcnpQcmVmUm91dGluZ0RpcikgewotLy8gICAgICAgICAgICBpZiAoaW5pdCkgewotLy8gICAgICAgICAgICAgIGxpbWl0ID0gaXNCZWdpbiA/IG1pbihsaW1pdCwgdmlhUG9pbnQueCgpKSA6IG1heChsaW1pdCwgdmlhUG9pbnQueCgpKTsKLS8vICAgICAgICAgICAgfSBlbHNlIHsKLS8vICAgICAgICAgICAgICBsaW1pdCA9IHZpYVBvaW50LngoKTsKLS8vICAgICAgICAgICAgICBpbml0ID0gdHJ1ZTsKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgfSBlbHNlIHsKLS8vICAgICAgICAgICAgaWYgKGluaXQpIHsKLS8vICAgICAgICAgICAgICBsaW1pdCA9IGlzQmVnaW4gPyBtaW4obGltaXQsIHZpYVBvaW50LnkoKSkgOiBtYXgobGltaXQsIHZpYVBvaW50LnkoKSk7Ci0vLyAgICAgICAgICAgIH0gZWxzZSB7Ci0vLyAgICAgICAgICAgICAgbGltaXQgPSB2aWFQb2ludC55KCk7Ci0vLyAgICAgICAgICAgICAgaW5pdCA9IHRydWU7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0vLyAgICAgIH0KLS8vICAgIH0KLS8vICB9Ci0vLwotLy99Ci0KLQotLy9mckNvb3JkIEZsZXhUQVdvcmtlcjo6Z2V0UGF0aFNlZ0xpbWl0KGNvbnN0IHNoYXJlZF9wdHI8ZnJHdWlkZT4gJmd1aWRlLCBjb25zdCBzaGFyZWRfcHRyPGZyUGF0aFNlZz4gJnBhdGhTZWcsIAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2hlY2tMb3dlckxheWVyLCBib29sIGNoZWNrVXBwZXJMYXllciwgYm9vbCBpc0JlZ2luKSB7Ci0vLyAgYm9vbCBpbml0ID0gZmFsc2U7Ci0vLyAgZnJDb29yZCBsaW1pdCA9IDA7Ci0vLwotLy8gIGF1dG8gdiA9IGd1aWRlLT5nZXRCZWdpbkNvbm4oKTsKLS8vICBnZXRQYXRoU2VnTGltaXRfaGVscGVyKGd1aWRlLCBwYXRoU2VnLCBjaGVja0xvd2VyTGF5ZXIsIGNoZWNrVXBwZXJMYXllciwgaXNCZWdpbiwgdiwgaW5pdCwgbGltaXQpOwotLy8gIHYgPSBndWlkZS0+Z2V0RW5kQ29ubigpOwotLy8gIGdldFBhdGhTZWdMaW1pdF9oZWxwZXIoZ3VpZGUsIHBhdGhTZWcsIGNoZWNrTG93ZXJMYXllciwgY2hlY2tVcHBlckxheWVyLCBpc0JlZ2luLCB2LCBpbml0LCBsaW1pdCk7Ci0vLyAgcmV0dXJuIGxpbWl0OwotLy99Ci0KLS8vIGxlZnQgYW5kIGJvdHRvbSBjYW4gZXF1YWwKLS8vYm9vbCBGbGV4VEFXb3JrZXI6OmlzVHJhY2tJbkd1aWRlKGNvbnN0IHNoYXJlZF9wdHI8ZnJHdWlkZT4gJmd1aWRlLCBjb25zdCBzaGFyZWRfcHRyPEZsZXhUcmFjaz4gJnRyYWNrKSB7Ci0vLyAgYXV0byB0cmFja0xvYyA9IHRyYWNrLT5nZXRUcmFja0xvYygpOwotLy8gIGZyUG9pbnQgYmVnaW4sIGVuZDsKLS8vICBndWlkZS0+Z2V0UG9pbnRzKGJlZ2luLCBlbmQpOwotLy8gIC8vIGlzSG9yaXpvbnRhbCA9PSAxIG1lYW5zIHZlcnRpY2FsIGxheWVyICEhIQotLy8gIGJvb2wgaXNWZXJ0aWNhbExheWVyID0gdHJhY2stPmdldFRyYWNrUGF0dGVybigpLT5pc0hvcml6b250YWwoKTsKLS8vICBhdXRvIGd1aWRlTG9jICA9IGlzVmVydGljYWxMYXllciA/IGJlZ2luLngoKSA6IGJlZ2luLnkoKTsKLS8vICBhdXRvIGd1aWRlTG93ICA9IGd1aWRlTG9jIC0gKGlzVmVydGljYWxMYXllciA/IGdldEdDRUxMR1JJRFgoKSAvIDIgOiBnZXRHQ0VMTEdSSURZKCkgLyAyKTsKLS8vICBhdXRvIGd1aWRlSGlnaCA9IGd1aWRlTG9jICsgKGlzVmVydGljYWxMYXllciA/IGdldEdDRUxMR1JJRFgoKSAvIDIgOiBnZXRHQ0VMTEdSSURZKCkgLyAyKTsKLS8vICByZXR1cm4gKHRyYWNrTG9jID49IGd1aWRlTG93ICYmIHRyYWNrTG9jIDwgZ3VpZGVIaWdoKTsKLS8vfQotCi0vL2ludCBGbGV4VEFXb3JrZXI6OmdldFdsZW5Db3N0X2hlbHBlcihjb25zdCBzaGFyZWRfcHRyPEZsZXhJcm91dGU+ICZpcm91dGUpIHsKLS8vICBhdXRvIGd1aWRlID0gaXJvdXRlLT5nZXRHdWlkZSgpOwotLy8gIGlmIChndWlkZSAmJiBndWlkZS0+aXNHbG9iYWwoKSkgewotLy8gICAgOwotLy8gIH0gZWxzZSB7Ci0vLyAgICByZXR1cm4gMDsKLS8vICB9Ci0vLyAgZnJDb2xsZWN0aW9uPHNoYXJlZF9wdHI8ZnJHdWlkZT4gPiBjb25uR3VpZGVzOwotLy8gIGZyQ29sbGVjdGlvbjxzaGFyZWRfcHRyPGZyR3VpZGU+ID4gY29ubkd1aWRlczI7Ci0vLyAgc2hhcmVkX3B0cjxmclN0ZWluZXI+IHN0ZWluZXI7Ci0vLyAgc2hhcmVkX3B0cjxmclN0ZWluZXI+IHN0ZWluZXIyOwotLy8gIGludCB3bGVuID0gMDsKLS8vICAvLyBsZWZ0IGFuZCByaWdodCBzdGVpbmVycwotLy8gIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0vLyAgICBpZiAoaSA9PSAwKSB7Ci0vLyAgICAgIHN0ZWluZXIgPSBzdGF0aWNfcG9pbnRlcl9jYXN0PGZyU3RlaW5lcj4oZ3VpZGUtPmdldEJlZ2luQ29ubigpKTsKLS8vICAgIH0gZWxzZSB7Ci0vLyAgICAgIHN0ZWluZXIgPSBzdGF0aWNfcG9pbnRlcl9jYXN0PGZyU3RlaW5lcj4oZ3VpZGUtPmdldEVuZENvbm4oKSk7Ci0vLyAgICB9Ci0vLyAgICBzdGVpbmVyLT5nZXRDb25uR3VpZGVzKGNvbm5HdWlkZXMpOwotLy8gICAgLy8gZG93biBhbmQgdXAgdmlhcwotLy8gICAgZm9yIChpbnQgaiA9IDI7IGogPCA0OyBqKyspIHsKLS8vICAgICAgaWYgKGNvbm5HdWlkZXMuYXQoaikpIHsKLS8vICAgICAgICBpZiAoaiA9PSAyKSB7Ci0vLyAgICAgICAgICBzdGVpbmVyMiA9IHN0YXRpY19wb2ludGVyX2Nhc3Q8ZnJTdGVpbmVyPihjb25uR3VpZGVzLmF0KGopLT5nZXRCZWdpbkNvbm4oKSk7Ci0vLyAgICAgICAgfSBlbHNlIHsKLS8vICAgICAgICAgIHN0ZWluZXIyID0gc3RhdGljX3BvaW50ZXJfY2FzdDxmclN0ZWluZXI+KGNvbm5HdWlkZXMuYXQoaiktPmdldEVuZENvbm4oKSk7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIHN0ZWluZXIyLT5nZXRDb25uR3VpZGVzKGNvbm5HdWlkZXMyKTsKLS8vICAgICAgICBpZiAoY29ubkd1aWRlczIuYXQoMCkgJiYgY29ubkd1aWRlczIuYXQoMCktPmlzR2xvYmFsKCkpIHsKLS8vICAgICAgICAgIHdsZW4gLT0gMTsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgaWYgKGNvbm5HdWlkZXMyLmF0KDEpICYmIGNvbm5HdWlkZXMyLmF0KDEpLT5pc0dsb2JhbCgpKSB7Ci0vLyAgICAgICAgICB3bGVuICs9IDE7Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgfQotLy8gIHJldHVybiB3bGVuOwotLy99Ci0KLS8qCi1mclVJbnQ0IEZsZXhUQVdvcmtlcjo6Z2V0V2xlbkNvc3QoRmxleElyb3V0ZSogaXJvdXRlLCBGbGV4VHJhY2sqIHRyYWNrLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzSCwgaW50IHdsZW5faGVscGVyKSB7Ci0KLSAgLy9hdXRvICZncCA9IGRlc2lnbi0+Z2V0VG9wQmxvY2soKS0+Z2V0R0NlbGxQYXR0ZXJucygpOwotICAvL2F1dG8gJnhncCA9IGdwWzBdOwotICAvL2F1dG8gJnlncCA9IGdwWzFdOwotICAvLyB1c2UgZnJDb29yZCB0byBwcmV2ZW50IG5lZ2F0aXZlIHByb2JsZW1zCi0gIC8vZnJDb29yZCBHQ0VMTEdSSURYICAgPSB4Z3AuZ2V0U3BhY2luZygpOwotICAvL2ZyQ29vcmQgR0NFTExHUklEWSAgID0geWdwLmdldFNwYWNpbmcoKTsKLSAgLy9mckNvb3JkIEdDRUxMT0ZGU0VUWCA9IHhncC5nZXRTdGFydENvb3JkKCk7Ci0gIC8vZnJDb29yZCBHQ0VMTE9GRlNFVFkgPSB5Z3AuZ2V0U3RhcnRDb29yZCgpOwotICAvL2ZyQ29vcmQgR0NFTExDTlRYICAgID0geGdwLmdldENvdW50KCk7Ci0gIC8vZnJDb29yZCBHQ0VMTENOVFkgICAgPSB5Z3AuZ2V0Q291bnQoKTsKLSAgYXV0byBndWlkZSA9IGlyb3V0ZS0+Z2V0R3VpZGUoKTsKLSAgLy9pZiAoZ3VpZGUgJiYgZ3VpZGUtPmlzR2xvYmFsKCkpIHsKLSAgLy8gIDsKLSAgLy99IGVsc2UgewotICAvLyAgcmV0dXJuIDA7Ci0gIC8vfQotICBmclBvaW50IGJlZ2luLCBlbmQ7Ci0gIGd1aWRlLT5nZXRQb2ludHMoYmVnaW4sIGVuZCk7Ci0gIGZyQm94IGVuZEJveDsKLSAgZnJQb2ludCBpZHg7Ci0gIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXRHQ2VsbElkeChlbmQsIGlkeCk7Ci0gIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXRHQ2VsbEJveChpZHgsIGVuZEJveCk7Ci0gIGludCB3bGVuID0gMDsKLSAgaWYgKHdsZW5faGVscGVyIDw9IDApIHsKLSAgICBpZiAoaXNIKSB7Ci0gICAgICB3bGVuID0gYWJzKHdsZW5faGVscGVyKSAqICh0cmFjay0+Z2V0VHJhY2tMb2MoKSAtIGVuZEJveC5ib3R0b20oKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHdsZW4gPSBhYnMod2xlbl9oZWxwZXIpICogKHRyYWNrLT5nZXRUcmFja0xvYygpIC0gZW5kQm94LmxlZnQoKSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChpc0gpIHsKLSAgICAgIHdsZW4gPSBhYnMod2xlbl9oZWxwZXIpICogKGVuZEJveC50b3AoKSAtIHRyYWNrLT5nZXRUcmFja0xvYygpKTsKLSAgICB9IGVsc2UgewotICAgICAgd2xlbiA9IGFicyh3bGVuX2hlbHBlcikgKiAoZW5kQm94LnJpZ2h0KCkgLSB0cmFjay0+Z2V0VHJhY2tMb2MoKSk7Ci0gICAgfQotICB9Ci0gIGlmICh3bGVuIDwgMCkgewotICAgIGNvdXQgPDwiRXJyb3I6IGdldFdsZW5Db3N0IGhhcyB3bGVuQ29zdCA8IDAiIDw8ZW5kbDsKLSAgICBjb3V0IDw8IiAgdHJhY2tMb2MgIiA8PHRyYWNrLT5nZXRUcmFja0xvYygpIDw8IiBib3ggIiA8PGVuZEJveCA8PGVuZGw7Ci0gICAgcmV0dXJuIChmclVJbnQ0KTA7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIChmclVJbnQ0KXdsZW47Ci0gIH0KLX0KLSovCi0KLS8qCi12b2lkIEZsZXhUQVdvcmtlcjo6YXNzaWduSXJvdXRlcygpIHsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIGJvb2wgaXNIID0gKGdldERpcigpID09IGZyY0hvcnpQcmVmUm91dGluZ0RpcikgPyB0cnVlIDogZmFsc2U7Ci0gIGZvcihhdXRvICZ1SXJvdXRlOiBpcm91dGVzKSB7Ci0gICAgYXV0byBpcm91dGUgPSB1SXJvdXRlLmdldCgpOwotICAgIGludCBiZXN0VHJhY2sgPSAtMTsKLSAgICBmclVJbnQ0IGJlc3RDb3N0ID0gVUlOVF9NQVg7Ci0gICAgLy9pbnQgd2xlbl9oZWxwZXIgID0gZ2V0V2xlbkNvc3RfaGVscGVyKGlyb3V0ZSk7Ci0gICAgaW50IHdsZW5faGVscGVyICA9IGlyb3V0ZS0+Z2V0V2xlbkhlbHBlcigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCl0cmFja3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgIGZyVUludDQgY3VyckNvc3QgPSAwOwotICAgICAgYXV0byB0cmFjayA9IHRyYWNrcy5hdChpKS5nZXQoKTsKLSAgICAgIGN1cnJDb3N0ICs9IDEwMCp0cmFjay0+Z2V0T3ZlcmxhcENvc3QoaXJvdXRlLT5nZXRCZWdpbigpLCBpcm91dGUtPmdldEVuZCgpKTsKLSAgICAgIGN1cnJDb3N0ICs9IGdldFdsZW5Db3N0KGlyb3V0ZSwgdHJhY2ssIGlzSCwgd2xlbl9oZWxwZXIpOwotICAgICAgaWYgKGN1cnJDb3N0IDwgYmVzdENvc3QpIHsKLSAgICAgICAgYmVzdFRyYWNrID0gaTsKLSAgICAgICAgYmVzdENvc3QgPSBjdXJyQ29zdDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGJlc3RUcmFjayA9PSAtMSkgewotICAgICAgY291dCA8PCJFcnJvcjogY2Fubm90IGZpbmQgYSB0cmFjayIgPDxlbmRsOwotICAgICAgZXhpdCgxKTsKLSAgICB9IGVsc2UgewotICAgICAgaXJvdXRlLT5zZXRUcmFjayh0cmFja3MuYXQoYmVzdFRyYWNrKS5nZXQoKSk7Ci0gICAgICB0cmFja3MuYXQoYmVzdFRyYWNrKS0+YWRkVG9PdmVybGFwQ29zdChpcm91dGUtPmdldEJlZ2luKCksIGlyb3V0ZS0+Z2V0RW5kKCkpOwotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBhdXRvIGRidSA9IGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpOwotICAgICAgICBhdXRvIGxheWVyTmFtZSA9IGdldFRlY2goKS0+Z2V0TGF5ZXIobGF5ZXJOdW0pLT5nZXROYW1lKCk7Ci0gICAgICAgIHN0cmluZ3N0cmVhbSBzczsKLSAgICAgICAgaWYgKGlzSCkgewotICAgICAgICAgIHNzICAgPDwiYXNzaWduZWQgKCAiIAotICAgICAgICAgICAgICAgPDxpcm91dGUtPmdldEJlZ2luKCkgICAgICAgICAgICAgICAgKiAxLjAgLyBkYnUgPDwiICIKLSAgICAgICAgICAgICAgIDw8aXJvdXRlLT5nZXRUcmFjaygpLT5nZXRUcmFja0xvYygpICogMS4wIC8gZGJ1IDw8IiApICggIgotICAgICAgICAgICAgICAgPDxpcm91dGUtPmdldEVuZCgpICAgICAgICAgICAgICAgICAgKiAxLjAgLyBkYnUgPDwiICIKLSAgICAgICAgICAgICAgIDw8aXJvdXRlLT5nZXRUcmFjaygpLT5nZXRUcmFja0xvYygpICogMS4wIC8gZGJ1IDw8IiApICIKLSAgICAgICAgICAgICAgIDw8bGF5ZXJOYW1lIDw8ZW5kbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzcyAgIDw8ImFzc2lnbmVkICggIiAKLSAgICAgICAgICAgICAgIDw8aXJvdXRlLT5nZXRUcmFjaygpLT5nZXRUcmFja0xvYygpICogMS4wIC8gZGJ1IDw8IiAiCi0gICAgICAgICAgICAgICA8PGlyb3V0ZS0+Z2V0QmVnaW4oKSAgICAgICAgICAgICAgICAqIDEuMCAvIGRidSA8PCIgKSAoICIKLSAgICAgICAgICAgICAgIDw8aXJvdXRlLT5nZXRUcmFjaygpLT5nZXRUcmFja0xvYygpICogMS4wIC8gZGJ1IDw8IiAiCi0gICAgICAgICAgICAgICA8PGlyb3V0ZS0+Z2V0RW5kKCkgICAgICAgICAgICAgICAgICAqIDEuMCAvIGRidSA8PCIgKSAiCi0gICAgICAgICAgICAgICA8PGxheWVyTmFtZSA8PGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgY291dCA8PHNzLnN0cigpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotKi8KLQotLyoKLXZvaWQgRmxleFRBV29ya2VyOjpyZWFzc2lnbklyb3V0ZXMoKSB7Ci0gIDsKLX0KLSovCi0KLS8qCi12b2lkIEZsZXhUQVdvcmtlcjo6c2F2ZVRvR3VpZGVzKCkgewotICBib29sIGlzSCA9IChnZXREaXIoKSA9PSBmcmNIb3J6UHJlZlJvdXRpbmdEaXIpID8gdHJ1ZSA6IGZhbHNlOwotICBhdXRvIGRlZmF1bHRTZWdTdHlsZSA9IGdldFRlY2goKS0+Z2V0TGF5ZXIobGF5ZXJOdW0pLT5nZXREZWZhdWx0U2VnU3R5bGUoKTsKLSAgZnJQb2ludCBiZWdpbiwgZW5kOwotICBmb3IgKGF1dG8gJmlyb3V0ZTogaXJvdXRlcykgewotICAgIGlmIChpcm91dGUtPmdldFRyYWNrKCkpIHsKLSAgICAgIHVuaXF1ZV9wdHI8ZnJQYXRoU2VnPiBwYXRoU2VnID0gbWFrZV91bmlxdWU8ZnJQYXRoU2VnPigpOwotICAgICAgaWYgKGlzSCkgewotICAgICAgICBiZWdpbi5zZXQoaXJvdXRlLT5nZXRCZWdpbigpLCBpcm91dGUtPmdldFRyYWNrKCktPmdldFRyYWNrTG9jKCkpOwotICAgICAgICBlbmQuc2V0KGlyb3V0ZS0+Z2V0RW5kKCksIGlyb3V0ZS0+Z2V0VHJhY2soKS0+Z2V0VHJhY2tMb2MoKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBiZWdpbi5zZXQoaXJvdXRlLT5nZXRUcmFjaygpLT5nZXRUcmFja0xvYygpLCBpcm91dGUtPmdldEJlZ2luKCkpOwotICAgICAgICBlbmQuc2V0KGlyb3V0ZS0+Z2V0VHJhY2soKS0+Z2V0VHJhY2tMb2MoKSwgaXJvdXRlLT5nZXRFbmQoKSk7Ci0gICAgICB9Ci0gICAgICBwYXRoU2VnLT5zZXRQb2ludHMoYmVnaW4sIGVuZCk7Ci0gICAgICBwYXRoU2VnLT5zZXRMYXllck51bShsYXllck51bSk7Ci0gICAgICBwYXRoU2VnLT5hZGRUb05ldChpcm91dGUtPmdldEd1aWRlKCktPmdldE5ldCgpKTsKLSAgICAgIHBhdGhTZWctPnNldFN0eWxlKGRlZmF1bHRTZWdTdHlsZSk7Ci0gICAgICBhdXRvIGd1aWRlID0gaXJvdXRlLT5nZXRHdWlkZSgpOwotICAgICAgaWYgKGd1aWRlKSB7Ci0gICAgICAgIHZlY3Rvcjx1bmlxdWVfcHRyPGZyQ29ubkZpZz4gPiB0bXA7Ci0gICAgICAgIHRtcC5wdXNoX2JhY2soc3RkOjptb3ZlKHBhdGhTZWcpKTsKLSAgICAgICAgZ3VpZGUtPnNldFJvdXRlcyh0bXApOwotICAgICAgfQotICAgICAgLy8gbW9kaWZ5IHVwcGVyL2xvd2VyIHNlZ3MKLSAgICAgIC8vIHVwcGVyL2xvd2VyIHNlZyB3aWxsIGhhdmUgbG9uZ2VzdCB3aXJlbGVuZ3RoCi0gICAgfQotICB9Ci19Ci0qLwotCi0vKgotdm9pZCBGbGV4VEFXb3JrZXI6OnJlcG9ydENvc3RzKCkgewotICBib29sIGlzSCA9IChnZXREaXIoKSA9PSBmcmNIb3J6UHJlZlJvdXRpbmdEaXIpID8gdHJ1ZSA6IGZhbHNlOwotICBmckNvb3JkIGJlZ2luLCBlbmQ7Ci0gIGlmIChpc0gpIHsKLSAgICBiZWdpbiA9IHJvdXRlQm94LmxlZnQoKTsKLSAgICBlbmQgICA9IHJvdXRlQm94LnJpZ2h0KCk7Ci0gIH0gZWxzZSB7Ci0gICAgYmVnaW4gPSByb3V0ZUJveC5ib3R0b20oKTsKLSAgICBlbmQgICA9IHJvdXRlQm94LnRvcCgpOwotICB9Ci0gIGZyQ29vcmQgd2xlbiA9IDA7Ci0gIGZvciAoYXV0byAmaXJvdXRlOiBpcm91dGVzKSB7Ci0gICAgd2xlbiArPSBpcm91dGUtPmdldEVuZCgpIC0gaXJvdXRlLT5nZXRCZWdpbigpOwotICB9Ci0gIGZyVUludDQgb3ZlcmxhcENvc3QgPSAwOwotICBmb3IgKGF1dG8gJnRyYWNrOiB0cmFja3MpIHsKLSAgICBvdmVybGFwQ29zdCArPSB0cmFjay0+cmVwb3J0T3ZlcmxhcENvc3QoYmVnaW4sIGVuZCk7Ci0gIH0KLSAgaWYgKFZFUkJPU0UgPiAxKSB7Ci0gICAgc3RyaW5nc3RyZWFtIHNzOwotICAgIHNzIDw8IndsZW4vb3ZscCA9ICIgPDx3bGVuIDw8Ii8iIDw8b3ZlcmxhcENvc3QgPDxlbmRsOyAKLSAgICBjb3V0IDw8c3Muc3RyKCk7Ci0gIH0KLX0KLSovCi0KLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvdGEvRmxleFRBLmggYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy90YS9GbGV4VEEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVlYTc4Yi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy90YS9GbGV4VEEuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3NiArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIF9GUl9GTEVYVEFfSF8KLSNkZWZpbmUgX0ZSX0ZMRVhUQV9IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotLy8jaW5jbHVkZSAiZGIvdGVjaC9mclRlY2hPYmplY3QuaCIKLSNpbmNsdWRlICJmckRlc2lnbi5oIgotLy8jaW5jbHVkZSAiZGIvb2JqL2ZyR3VpZGUuaCIKLS8vI2luY2x1ZGUgImRiL29iai9mclZpYS5oIgotLy8jaW5jbHVkZSAiZGIvdGFPYmovdGFUcmFjay5oIgotI2luY2x1ZGUgImRiL3RhT2JqL3RhUGluLmgiCi0jaW5jbHVkZSA8c2V0PgotCi0vLyNpbmNsdWRlIDxib29zdC9pY2wvaW50ZXJ2YWxfbWFwLmhwcD4KLS8vI2luY2x1ZGUgPGJvb3N0L3Bvb2wvcG9vbF9hbGxvYy5ocHA+Ci0KLW5hbWVzcGFjZSBmciB7Ci0gIC8vY2xhc3MgRmxleElyb3V0ZSB7Ci0gIC8vcHVibGljOgotICAvLyAgRmxleElyb3V0ZSgpOiBndWlkZSgpLCB0cmFjaygpLCBiZWdpbigwKSwgZW5kKDApLCB3bGVuX2hlbHBlcigwKSB7fTsKLSAgLy8gIC8vIGdldHRlcnMKLSAgLy8gIGZyQ29vcmQgZ2V0QmVnaW4oKSBjb25zdCB7Ci0gIC8vICAgIHJldHVybiBiZWdpbjsKLSAgLy8gIH0KLSAgLy8gIGZyQ29vcmQgZ2V0RW5kKCkgY29uc3QgewotICAvLyAgICByZXR1cm4gZW5kOwotICAvLyAgfQotICAvLyAgZnJHdWlkZSogZ2V0R3VpZGUoKSBjb25zdCB7Ci0gIC8vICAgIHJldHVybiBndWlkZTsKLSAgLy8gIH0KLSAgLy8gIEZsZXhUcmFjayogZ2V0VHJhY2soKSBjb25zdCB7Ci0gIC8vICAgIHJldHVybiB0cmFjazsKLSAgLy8gIH0KLSAgLy8gIGludCBnZXRXbGVuSGVscGVyKCkgY29uc3QgewotICAvLyAgICByZXR1cm4gd2xlbl9oZWxwZXI7Ci0gIC8vICB9Ci0gIC8vICAvLyBzZXR0ZXJzCi0gIC8vICB2b2lkIHNldEd1aWRlKGZyR3VpZGUqIGluKSB7Ci0gIC8vICAgIGd1aWRlID0gaW47Ci0gIC8vICB9Ci0gIC8vICB2b2lkIHNldFRyYWNrKEZsZXhUcmFjayogaW4pIHsKLSAgLy8gICAgdHJhY2sgPSBpbjsKLSAgLy8gIH0KLSAgLy8gIHZvaWQgc2V0QmVnaW4oZnJDb29yZCBpbikgewotICAvLyAgICBiZWdpbiA9IGluOwotICAvLyAgfQotICAvLyAgdm9pZCBzZXRFbmQoZnJDb29yZCBpbikgewotICAvLyAgICBlbmQgPSBpbjsKLSAgLy8gIH0KLSAgLy8gIHZvaWQgc2V0V2xlbkhlbHBlcihpbnQgaW4pIHsKLSAgLy8gICAgd2xlbl9oZWxwZXIgPSBpbjsKLSAgLy8gIH0KLSAgLy9wcm90ZWN0ZWQ6Ci0gIC8vICBmckd1aWRlKiAgIGd1aWRlOwotICAvLyAgRmxleFRyYWNrKiB0cmFjazsKLSAgLy8gIGZyQ29vcmQgICAgYmVnaW47Ci0gIC8vICBmckNvb3JkICAgIGVuZDsKLSAgLy8gIGludCAgICAgICAgd2xlbl9oZWxwZXI7Ci0gIC8vfTsKLQotCi0gIGNsYXNzIEZsZXhUQSB7Ci0gIHB1YmxpYzoKLSAgICAvLyBjb25zdHJ1Y3RvcnMKLSAgICAvL0ZsZXhUQSgpOiB0ZWNoKHN0ZDo6bWFrZV9zaGFyZWQ8ZnJUZWNoT2JqZWN0PigpKSwgZGVzaWduKHN0ZDo6bWFrZV9zaGFyZWQ8ZnJEZXNpZ24+KCkpIHt9OwotICAgIEZsZXhUQShmckRlc2lnbiogaW4pOiB0ZWNoKGluLT5nZXRUZWNoKCkpLCBkZXNpZ24oaW4pIHt9OwotICAgIC8vIGdldHRlcnMKLSAgICBmclRlY2hPYmplY3QqIGdldFRlY2goKSBjb25zdCB7Ci0gICAgICByZXR1cm4gdGVjaDsKLSAgICB9Ci0gICAgZnJEZXNpZ24qIGdldERlc2lnbigpIGNvbnN0IHsKLSAgICAgIHJldHVybiBkZXNpZ247Ci0gICAgfQotICAgIC8vIG90aGVycwotICAgIGludCBtYWluKCk7Ci0gIHByb3RlY3RlZDoKLSAgICBmclRlY2hPYmplY3QqICAgdGVjaDsKLSAgICBmckRlc2lnbiogICAgICAgZGVzaWduOwotICAgIC8vIG90aGVycwotICAgIHZvaWQgbWFpbl9oZWxwZXIoZnJMYXllck51bSBsTnVtLCBpbnQgbWF4T2Zmc2V0SXRlciwgaW50IHBhbmVsV2lkdGgpOwotICAgIHZvaWQgaW5pdFRBKGludCBzaXplKTsKLSAgICB2b2lkIHNlYXJjaFJlcGFpcihpbnQgaXRlciwgaW50IHNpemUsIGludCBvZmZzZXQpOwotICAgIGludCAgaW5pdFRBX2hlbHBlcihpbnQgaXRlciwgaW50IHNpemUsIGludCBvZmZzZXQsIGJvb2wgaXNILCBpbnQgJm51bVBhbmVscyk7Ci0gIH07Ci0KLQotICBjbGFzcyBGbGV4VEFXb3JrZXI7Ci0gIGNsYXNzIEZsZXhUQVdvcmtlclJlZ2lvblF1ZXJ5IHsKLSAgcHVibGljOgotICAgIEZsZXhUQVdvcmtlclJlZ2lvblF1ZXJ5KEZsZXhUQVdvcmtlciogaW4pOiB0YVdvcmtlcihpbikge30KLSAgICBmckRlc2lnbiogZ2V0RGVzaWduKCkgY29uc3Q7Ci0gICAgRmxleFRBV29ya2VyKiBnZXRUQVdvcmtlcigpIGNvbnN0IHsKLSAgICAgIHJldHVybiB0YVdvcmtlcjsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBhZGQodGFQaW5GaWcqIGZpZyk7Ci0gICAgdm9pZCByZW1vdmUodGFQaW5GaWcqIGZpZyk7Ci0gICAgLy92b2lkIHF1ZXJ5KGNvbnN0IGZyQm94ICZib3gsIGZyTGF5ZXJOdW0gbGF5ZXJOdW0sIHN0ZDo6dmVjdG9yPHJxX3JwdHJfdmFsdWVfdDx0YUNvbm5GaWc+ID4gJnJlc3VsdCk7Ci0gICAgdm9pZCBxdWVyeShjb25zdCBmckJveCAmYm94LCBmckxheWVyTnVtIGxheWVyTnVtLCBzdGQ6OnNldDx0YVBpbiosIGZyQmxvY2tPYmplY3RDb21wPiAmcmVzdWx0KTsKLQotICAgIHZvaWQgYWRkQ29zdChjb25zdCBmckJveCAmYm94LCBmckxheWVyTnVtIGxheWVyTnVtLCBmckJsb2NrT2JqZWN0KiBvYmosIGZyQ29uc3RyYWludCogY29uKTsKLSAgICB2b2lkIHJlbW92ZUNvc3QoY29uc3QgZnJCb3ggJmJveCwgZnJMYXllck51bSBsYXllck51bSwgZnJCbG9ja09iamVjdCogb2JqLCBmckNvbnN0cmFpbnQqIGNvbik7Ci0gICAgdm9pZCBxdWVyeUNvc3QoY29uc3QgZnJCb3ggJmJveCwgZnJMYXllck51bSBsYXllck51bSwgc3RkOjp2ZWN0b3I8cnFfZ2VuZXJpY192YWx1ZV90PHN0ZDo6cGFpcjxmckJsb2NrT2JqZWN0KiwgZnJDb25zdHJhaW50Kj4gPiA+ICZyZXN1bHQpOwotICAgIAotICAgIC8vdm9pZCBhZGRBUChjb25zdCBmckJveCAmYm94LCBmckxheWVyTnVtIGxheWVyTnVtLCBmckJsb2NrT2JqZWN0KiBvYmosIGZyQ29uc3RyYWludCogY29uKTsKLSAgICAvL3ZvaWQgcmVtb3ZlQVAoY29uc3QgZnJCb3ggJmJveCwgZnJMYXllck51bSBsYXllck51bSwgZnJCbG9ja09iamVjdCogb2JqLCBmckNvbnN0cmFpbnQqIGNvbik7Ci0gICAgLy92b2lkIHF1ZXJ5QVAoY29uc3QgZnJCb3ggJmJveCwgZnJMYXllck51bSBsYXllck51bSwgc3RkOjp2ZWN0b3I8cnFfcnB0cl92YWx1ZV90PGZyQmxvY2tPYmplY3Q+ID4gJnJlc3VsdCk7Ci0gICAgCi0gICAgdm9pZCBpbml0KCk7Ci0gIHByb3RlY3RlZDoKLSAgICBGbGV4VEFXb3JrZXIqIHRhV29ya2VyOwotICAgIHN0ZDo6dmVjdG9yPGJnaTo6cnRyZWU8cnFfcnB0cl92YWx1ZV90PHRhUGluRmlnPiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBiZ2k6OnF1YWRyYXRpYzwxNj4vKiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBiZ2k6OmluZGV4YWJsZTxycV9ycHRyX3ZhbHVlX3Q8dGFQaW5GaWc+ID4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBiZ2k6OmVxdWFsX3RvPHJxX3JwdHJfdmFsdWVfdDx0YVBpbkZpZz4gPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0Ojpwb29sX2FsbG9jYXRvcjxycV9ycHRyX3ZhbHVlX3Q8dGFQaW5GaWc+ID4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPgotICAgICAgICAgICAgICAgPiBzaGFwZXM7IC8vIHJlc291cmNlIG1hcAotICAgIC8vIGZpeGVkIG9ianMsIG93bmVyOjogbnVsbHB0ciBvciBuZXQsIGNvbiA9IHNob3J0IAotICAgIHN0ZDo6dmVjdG9yPGJnaTo6cnRyZWU8cnFfZ2VuZXJpY192YWx1ZV90PHN0ZDo6cGFpcjxmckJsb2NrT2JqZWN0KiwgZnJDb25zdHJhaW50Kj4gPiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBiZ2k6OnF1YWRyYXRpYzwxNj4vKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJnaTo6aW5kZXhhYmxlPHJxX2dlbmVyaWNfdmFsdWVfdDxzdGQ6OnBhaXI8ZnJCbG9ja09iamVjdCosIGZyQ29uc3RyYWludCo+ID4gPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJnaTo6ZXF1YWxfdG88cnFfZ2VuZXJpY192YWx1ZV90PHN0ZDo6cGFpcjxmckJsb2NrT2JqZWN0KiwgZnJDb25zdHJhaW50Kj4gPiA+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnBvb2xfYWxsb2NhdG9yPHJxX2dlbmVyaWNfdmFsdWVfdDxzdGQ6OnBhaXI8ZnJCbG9ja09iamVjdCosIGZyQ29uc3RyYWludCo+ID4gPiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICA+IAotICAgICAgICAgICAgICAgPiBjb3N0czsKLSAgICAvLyBhcCwgb3duZXI6bmV0Ci0gICAgLy9zdGQ6OnZlY3RvcjxiZ2k6OnJ0cmVlPHJxX3JwdHJfdmFsdWVfdDxmckJsb2NrT2JqZWN0PiwgYmdpOjpxdWFkcmF0aWM8MTY+ID4gPiBhcHM7Ci0gICAgCi0gICAgdm9pZCBtb2RDb3N0KHRhUGluRmlnKiBmaWcsIGJvb2wgaXNBZGRDb3N0KTsKLSAgfTsKLQotICAvL2NsYXNzIEZsZXhUQVdvcmtlclNvcnQgewotICAvL3B1YmxpYzoKLSAgLy8gIEZsZXhUQVdvcmtlclNvcnQoc3RkOjp2ZWN0b3I8aXJvdXRlPiAqaW4pOiBwdHIoaW4pIHt9Ci0gIC8vICBib29sIG9wZXJhdG9yKCkoY29uc3QgdGFJcm91dGUgJmxocywgY29uc3QgdGFJcm91dGUgJnJocykgY29uc3QgewotICAvLyAgICByZXR1cm4gcHRyCi0gIC8vcHJvdGVjdGVkOgotICAvLyAgc3RkOjp2ZWN0b3I8aXJvdXRlcz4gKnB0cjsKLSAgLy99Ci0KLQotICBjbGFzcyBGbGV4VEFXb3JrZXIgewotICBwdWJsaWM6Ci0gICAgLy8gY29uc3RydWN0b3JzCi0gICAgRmxleFRBV29ya2VyKGZyRGVzaWduKiBkZXNpZ25Jbik6IGRlc2lnbihkZXNpZ25JbiksIHJxKHRoaXMpLCBudW1Bc3NpZ25lZCgwKSwgdG90Q29zdCgwKSwgbWF4UmV0cnkoMSkvKiwgdG90RHJjQ29zdCgwKSovIHt9OwotICAgIC8vIHNldHRlcnMKLSAgICB2b2lkIHNldFJvdXRlQm94KGNvbnN0IGZyQm94ICZib3hJbikgewotICAgICAgcm91dGVCb3guc2V0KGJveEluKTsKLSAgICB9Ci0gICAgdm9pZCBzZXRFeHRCb3goY29uc3QgZnJCb3ggJmJveEluKSB7Ci0gICAgICBleHRCb3guc2V0KGJveEluKTsKLSAgICB9Ci0gICAgdm9pZCBzZXREaXIoZnJQcmVmUm91dGluZ0RpckVudW0gaW4pIHsKLSAgICAgIGRpciA9IGluOwotICAgIH0KLSAgICB2b2lkIHNldFRBSXRlcihpbnQgaW4pIHsKLSAgICAgIHRhSXRlciA9IGluOwotICAgIH0KLSAgICB2b2lkIGFkZElyb3V0ZShzdGQ6OnVuaXF1ZV9wdHI8dGFQaW4+ICZpbiwgYm9vbCBpc0V4dCA9IGZhbHNlKSB7Ci0gICAgICBpbi0+c2V0SWQoaXJvdXRlcy5zaXplKCkgKyBleHRJcm91dGVzLnNpemUoKSk7Ci0gICAgICBpZiAoaXNFeHQpIHsKLSAgICAgICAgZXh0SXJvdXRlcy5wdXNoX2JhY2soc3RkOjptb3ZlKGluKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpcm91dGVzLnB1c2hfYmFjayhzdGQ6Om1vdmUoaW4pKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgdm9pZCBhZGRUb1JlYXNzaWduSXJvdXRlcyh0YVBpbiogaW4pIHsKLSAgICAgIHJlYXNzaWduSXJvdXRlcy5pbnNlcnQoaW4pOwotICAgIH0KLSAgICB2b2lkIHJlbW92ZUZyb21SZWFzc2lnbklyb3V0ZXModGFQaW4qIGluKSB7Ci0gICAgICBhdXRvIGl0ID0gcmVhc3NpZ25Jcm91dGVzLmZpbmQoaW4pOwotICAgICAgaWYgKGl0ICE9IHJlYXNzaWduSXJvdXRlcy5lbmQoKSkgewotICAgICAgICByZWFzc2lnbklyb3V0ZXMuZXJhc2UoaXQpOwotICAgICAgfQotICAgIH0KLSAgICB0YVBpbiogcG9wRnJvbVJlYXNzaWduSXJvdXRlcygpIHsKLSAgICAgIHRhUGluICpzb2wgPSBudWxscHRyOwotICAgICAgaWYgKCFyZWFzc2lnbklyb3V0ZXMuZW1wdHkoKSkgewotICAgICAgICBzb2wgPSAqcmVhc3NpZ25Jcm91dGVzLmJlZ2luKCk7Ci0gICAgICAgIHJlYXNzaWduSXJvdXRlcy5lcmFzZShyZWFzc2lnbklyb3V0ZXMuYmVnaW4oKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc29sOwotICAgIH0KLSAgICAvLyBnZXR0ZXJzCi0gICAgZnJUZWNoT2JqZWN0KiBnZXRUZWNoKCkgY29uc3QgewotICAgICAgcmV0dXJuIGRlc2lnbi0+Z2V0VGVjaCgpOwotICAgIH0KLSAgICBmckRlc2lnbiogZ2V0RGVzaWduKCkgY29uc3QgewotICAgICAgcmV0dXJuIGRlc2lnbjsKLSAgICB9Ci0gICAgY29uc3QgZnJCb3gmIGdldFJvdXRlQm94KCkgY29uc3QgewotICAgICAgcmV0dXJuIHJvdXRlQm94OwotICAgIH0KLSAgICBjb25zdCBmckJveCYgZ2V0RXh0Qm94KCkgY29uc3QgewotICAgICAgcmV0dXJuIGV4dEJveDsKLSAgICB9Ci0gICAgZnJQcmVmUm91dGluZ0RpckVudW0gZ2V0RGlyKCkgY29uc3QgewotICAgICAgcmV0dXJuIGRpcjsKLSAgICB9Ci0gICAgaW50IGdldFRBSXRlcigpIGNvbnN0IHsKLSAgICAgIHJldHVybiB0YUl0ZXI7Ci0gICAgfQotICAgIGJvb2wgaXNJbml0VEEoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gKHRhSXRlciA9PSAwKTsKLSAgICB9Ci0gICAgZnJSZWdpb25RdWVyeSogZ2V0UmVnaW9uUXVlcnkoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gZGVzaWduLT5nZXRSZWdpb25RdWVyeSgpOwotICAgIH0KLSAgICB2b2lkIGdldFRyYWNrSWR4KGZyQ29vcmQgbG9jMSwgZnJDb29yZCBsb2MyLCBmckxheWVyTnVtIGxOdW0sIGludCAmaWR4MSwgaW50ICZpZHgyKSBjb25zdCB7Ci0gICAgICBpZHgxID0gaW50KHN0ZDo6bG93ZXJfYm91bmQodHJhY2tMb2NzW2xOdW1dLmJlZ2luKCksIHRyYWNrTG9jc1tsTnVtXS5lbmQoKSwgbG9jMSkgLSB0cmFja0xvY3NbbE51bV0uYmVnaW4oKSk7Ci0gICAgICBpZHgyID0gaW50KHN0ZDo6dXBwZXJfYm91bmQodHJhY2tMb2NzW2xOdW1dLmJlZ2luKCksIHRyYWNrTG9jc1tsTnVtXS5lbmQoKSwgbG9jMikgLSB0cmFja0xvY3NbbE51bV0uYmVnaW4oKSkgLSAxOwotICAgIH0KLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxmckNvb3JkPiYgZ2V0VHJhY2tMb2NzKGZyTGF5ZXJOdW0gaW4pIGNvbnN0IHsKLSAgICAgIHJldHVybiB0cmFja0xvY3NbaW5dOwotICAgIH0KLSAgICAvL2NvbnN0IHN0ZDo6dmVjdG9yPHRhVHJhY2s+JiBnZXRUcmFja3MoZnJMYXllck51bSBpbikgY29uc3QgewotICAgIC8vICByZXR1cm4gdHJhY2tzW2luXTsKLSAgICAvL30KLSAgICAvL3N0ZDo6dmVjdG9yPHRhVHJhY2s+JiBnZXRUcmFja3MoZnJMYXllck51bSBpbikgewotICAgIC8vICByZXR1cm4gdHJhY2tzW2luXTsKLSAgICAvL30KLSAgICBjb25zdCBGbGV4VEFXb3JrZXJSZWdpb25RdWVyeSYgZ2V0V29ya2VyUmVnaW9uUXVlcnkoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gcnE7Ci0gICAgfQotICAgIEZsZXhUQVdvcmtlclJlZ2lvblF1ZXJ5JiBnZXRXb3JrZXJSZWdpb25RdWVyeSgpIHsKLSAgICAgIHJldHVybiBycTsKLSAgICB9Ci0gICAgaW50IGdldE51bUFzc2lnbmVkKCkgY29uc3QgewotICAgICAgcmV0dXJuIG51bUFzc2lnbmVkOwotICAgIH0KLSAgICAvLyBvdGhlcnMKLSAgICBpbnQgbWFpbigpOwotICAgIAotICBwcm90ZWN0ZWQ6Ci0gICAgZnJUZWNoT2JqZWN0KiAgICAgICAgICAgICAgICAgICAgICB0ZWNoOwotICAgIGZyRGVzaWduKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaWduOwotICAgIGZyQm94ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVCb3g7Ci0gICAgZnJCb3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRCb3g7Ci0gICAgZnJQcmVmUm91dGluZ0RpckVudW0gICAgICAgICAgICAgICBkaXI7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YUl0ZXI7Ci0gICAgRmxleFRBV29ya2VyUmVnaW9uUXVlcnkgICAgICAgICAgICBycTsKLQotICAgIC8vc3RkOjp2ZWN0b3I8ZnJHdWlkZSo+ICAgICAgICAgICAgZ3VpZGVzOwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjx0YVBpbj4gPiBpcm91dGVzOyAvLyB1bnNvcnRlcmQgaXJvdXRlcwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjx0YVBpbj4gPiBleHRJcm91dGVzOwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGZyQ29vcmQ+ID4gICB0cmFja0xvY3M7Ci0gICAgLy9zdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjx0YVRyYWNrPiA+ICAgdHJhY2tzOwotICAgIC8vc3RkOjpwcmlvcml0eV9xdWV1ZTx0YUlyb3V0ZSosIHN0ZDo6dmVjdG9yPHRhSXJvdXRlKj4sIHRhSXJvdXRlQ29tcD4gcHE7Ci0gICAgc3RkOjpzZXQ8dGFQaW4qLCB0YVBpbkNvbXA+ICByZWFzc2lnbklyb3V0ZXM7IC8vIGlyb3V0ZXMgdG8gYmUgYXNzaWduZWQgaW4gc29ydGVkIG9yZGVyCi0KLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUFzc2lnbmVkOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90Q29zdDsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJldHJ5OwotICAgIC8vZnJVSW50NCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3REcmNDb3N0OwotICAgIAotICAgIC8vLy8gb3RoZXJzCi0gICAgdm9pZCBpbml0KCk7Ci0gICAgdm9pZCBpbml0Rml4ZWRPYmpzKCk7Ci0gICAgdm9pZCBpbml0Rml4ZWRPYmpzX2hlbHBlcihjb25zdCBmckJveCAmYm94LCBmckNvb3JkIGJsb2F0RGlzdCwgZnJMYXllck51bSBsTnVtLCBmck5ldCogbmV0KTsKLSAgICB2b2lkIGluaXRUcmFja3MoKTsKLSAgICB2b2lkIGluaXRJcm91dGVzKCk7Ci0gICAgdm9pZCBpbml0SXJvdXRlKGZyR3VpZGUgKmluKTsKLSAgICB2b2lkIGluaXRJcm91dGVfaGVscGVyKGZyR3VpZGUqIGd1aWRlLCBmckNvb3JkICZtYXhCZWdpbiwgZnJDb29yZCAmbWluRW5kLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PGZyQ29vcmQ+ICZkb3duVmlhQ29vcmRTZXQsIHN0ZDo6c2V0PGZyQ29vcmQ+ICZ1cFZpYUNvb3JkU2V0LCBpbnQgJndsZW4sIGZyQ29vcmQgJndsZW4yKTsKLSAgICB2b2lkIGluaXRJcm91dGVfaGVscGVyX2dlbmVyaWMoZnJHdWlkZSogZ3VpZGUsIGZyQ29vcmQgJm1heEJlZ2luLCBmckNvb3JkICZtaW5FbmQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxmckNvb3JkPiAmZG93blZpYUNvb3JkU2V0LCBzdGQ6OnNldDxmckNvb3JkPiAmdXBWaWFDb29yZFNldCwgaW50ICZ3bGVuLCBmckNvb3JkICZ3bGVuMik7Ci0gICAgdm9pZCBpbml0SXJvdXRlX2hlbHBlcl9nZW5lcmljX2hlbHBlcihmckd1aWRlKiBndWlkZSwgZnJDb29yZCAmd2xlbjIpOwotICAgIGJvb2wgaW5pdElyb3V0ZV9oZWxwZXJfcGluKGZyR3VpZGUqIGd1aWRlLCBmckNvb3JkICZtYXhCZWdpbiwgZnJDb29yZCAmbWluRW5kLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxmckNvb3JkPiAmZG93blZpYUNvb3JkU2V0LCBzdGQ6OnNldDxmckNvb3JkPiAmdXBWaWFDb29yZFNldCwgaW50ICZ3bGVuLCBmckNvb3JkICZ3bGVuMik7Ci0gICAgdm9pZCBpbml0Q29zdHMoKTsKLSAgICB2b2lkIHNvcnRJcm91dGVzKCk7Ci0KLSAgICAvLyBxdWljayBkcmMKLSAgICBpbmxpbmUgZnJDb29yZCBib3gyYm94RGlzdFNxdWFyZShjb25zdCBmckJveCAmYm94MSwgY29uc3QgZnJCb3ggJmJveDIsIGZyQ29vcmQgJmR4LCBmckNvb3JkICZkeSk7Ci0gICAgdm9pZCBhZGRDb3N0KHRhUGluRmlnKiBmaWcsIHN0ZDo6c2V0PHRhUGluKiwgZnJCbG9ja09iamVjdENvbXA+ICpwaW5TID0gbnVsbHB0cik7Ci0gICAgdm9pZCBzdWJDb3N0KHRhUGluRmlnKiBmaWcsIHN0ZDo6c2V0PHRhUGluKiwgZnJCbG9ja09iamVjdENvbXA+ICpwaW5TID0gbnVsbHB0cik7Ci0gICAgdm9pZCBtb2RDb3N0KHRhUGluRmlnKiBmaWcsIGJvb2wgaXNBZGRDb3N0LCBzdGQ6OnNldDx0YVBpbiosIGZyQmxvY2tPYmplY3RDb21wPiAqcGluUyA9IG51bGxwdHIpOwotICAgIHZvaWQgbW9kTWluU3BhY2luZ0Nvc3RQbGFuYXIoY29uc3QgZnJCb3ggJmJveCwgZnJMYXllck51bSBsTnVtLCB0YVBpbkZpZyogZmlnLCBib29sIGlzQWRkQ29zdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDx0YVBpbiosIGZyQmxvY2tPYmplY3RDb21wPiAqcGluUyA9IG51bGxwdHIpOwotICAgIHZvaWQgbW9kTWluU3BhY2luZ0Nvc3RWaWEoY29uc3QgZnJCb3ggJmJveCwgZnJMYXllck51bSBsTnVtLCB0YVBpbkZpZyogZmlnLCBib29sIGlzQWRkQ29zdCwgYm9vbCBpc1VwcGVyVmlhLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNDdXJyUHMsIHN0ZDo6c2V0PHRhUGluKiwgZnJCbG9ja09iamVjdENvbXA+ICpwaW5TID0gbnVsbHB0cik7Ci0gICAgdm9pZCBtb2RDdXRTcGFjaW5nQ29zdChjb25zdCBmckJveCAmYm94LCBmckxheWVyTnVtIGxOdW0sIHRhUGluRmlnKiBmaWcsIGJvb2wgaXNBZGRDb3N0LCBzdGQ6OnNldDx0YVBpbiosIGZyQmxvY2tPYmplY3RDb21wPiAqcGluUyA9IG51bGxwdHIpOwotCi0gICAgLy8gaW5pdFRBCi0gICAgdm9pZCBhc3NpZ24oKTsKLSAgICB2b2lkIGFzc2lnbklyb3V0ZSh0YVBpbiogaXJvdXRlKTsKLSAgICB2b2lkIGFzc2lnbklyb3V0ZV9pbml0KHRhUGluKiBpcm91dGUsIHN0ZDo6c2V0PHRhUGluKiwgZnJCbG9ja09iamVjdENvbXA+ICpwaW5TKTsKLSAgICB2b2lkIGFzc2lnbklyb3V0ZV9hdmFpbFRyYWNrcyh0YVBpbiogaXJvdXRlLCBmckxheWVyTnVtICZsTnVtLCBpbnQgJmlkeDEsIGludCAmaWR4Mik7Ci0gICAgaW50ICBhc3NpZ25Jcm91dGVfYmVzdFRyYWNrKHRhUGluKiBpcm91dGUsIGZyTGF5ZXJOdW0gbE51bSwgaW50IGlkeDEsIGludCBpZHgyKTsKLSAgICB2b2lkIGFzc2lnbklyb3V0ZV9iZXN0VHJhY2tfaGVscGVyKHRhUGluKiBpcm91dGUsIGZyTGF5ZXJOdW0gbE51bSwgaW50IHRyYWNrSWR4LCBmclVJbnQ0ICZiZXN0Q29zdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmckNvb3JkICZiZXN0VHJhY2tMb2MsIGludCAmYmVzdFRyYWNrSWR4LCBmclVJbnQ0ICZkcmNDb3N0KTsKLSAgICBmclVJbnQ0IGFzc2lnbklyb3V0ZV9nZXRDb3N0KHRhUGluICppcm91dGUsIGZyQ29vcmQgdHJhY2tMb2MsIGZyVUludDQgJmRyY0Nvc3QpOwotICAgIGZyVUludDQgYXNzaWduSXJvdXRlX2dldFdsZW5Db3N0KHRhUGluICppcm91dGUsIGZyQ29vcmQgdHJhY2tMb2MpOwotICAgIGZyVUludDQgYXNzaWduSXJvdXRlX2dldFBpbkNvc3QodGFQaW4qIGlyb3V0ZSwgZnJDb29yZCB0cmFja0xvYyk7Ci0gICAgZnJVSW50NCBhc3NpZ25Jcm91dGVfZ2V0QWxpZ25Db3N0KHRhUGluKiBpcm91dGUsIGZyQ29vcmQgdHJhY2tMb2MpOwotICAgIGZyVUludDQgYXNzaWduSXJvdXRlX2dldERSQ0Nvc3QodGFQaW4gKmlyb3V0ZSwgZnJDb29yZCB0cmFja0xvYyk7Ci0gICAgZnJVSW50NCBhc3NpZ25Jcm91dGVfZ2V0RFJDQ29zdF9oZWxwZXIodGFQaW4qIGlyb3V0ZSwgY29uc3QgZnJCb3ggJmJveCwgZnJMYXllck51bSBsTnVtKTsKLSAgICB2b2lkIGFzc2lnbklyb3V0ZV91cGRhdGVJcm91dGUodGFQaW4qIGlyb3V0ZSwgZnJDb29yZCBiZXN0VHJhY2tMb2MsIHN0ZDo6c2V0PHRhUGluKiwgZnJCbG9ja09iamVjdENvbXA+ICpwaW5TKTsKLSAgICB2b2lkIGFzc2lnbklyb3V0ZV91cGRhdGVPdGhlcnMoc3RkOjpzZXQ8dGFQaW4qLCBmckJsb2NrT2JqZWN0Q29tcD4gJnBpblMpOwotCi0gICAgLy8gZW5kCi0gICAgdm9pZCBlbmQoKTsKLSAgICB2b2lkIHNhdmVUb0d1aWRlcygpOwotCi0gICAgLy9mckNvc3QgZ2V0Q29zdCgpOwotICAgIC8vdm9pZCBnZXRBbGxHdWlkZXMoKTsKLSAgICAvL3ZvaWQgZ2V0QWxsVHJhY2tzKCk7Ci0KLSAgICAvL3ZvaWQgZ2VuSXJvdXRlcygpOwotICAgIC8vdm9pZCBnZW5Jcm91dGVzX3NldEJlZ2luRW5kKEZsZXhJcm91dGUqIGlyb3V0ZSwgYm9vbCBpc0gpOwotICAgIC8vdm9pZCBhc3NpZ25Jcm91dGVzKCk7Ci0gICAgLy8vL2ludCBnZXRXbGVuQ29zdF9oZWxwZXIoRmxleElyb3V0ZSogaXJvdXRlKTsKLSAgICAvL2ZyVUludDQgZ2V0V2xlbkNvc3QoRmxleElyb3V0ZSogaXJvdXRlLCBGbGV4VHJhY2sqIHRyYWNrLCAKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0gsIGludCB3bGVuX2hlbHBlcik7Ci0gICAgLy92b2lkIHJlYXNzaWduSXJvdXRlcygpOwotICAgIC8vdm9pZCBzYXZlVG9HdWlkZXMoKTsKLSAgICAvL3ZvaWQgcmVwb3J0Q29zdHMoKTsKLQotCi0KLSAgICAvL2Jvb2wgaXNUcmFja0luR3VpZGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGZyR3VpZGU+ICZndWlkZSwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEZsZXhUcmFjaz4gJnRyYWNrKTsKLQotICAgIC8qIGFzc3VtcHRpb24KLSAgICAgKiBsYXllciBkaXJlY3Rpb24gaXMgYWx3YXlzIGFsdGVybmF0aXZlCi0gICAgICogaW4gdHJhY2sgYXNzaWdubWVudCwgb25seSBkbyBuZXRzIHdpdGggZ3VpZGVzIG9ubHksIG5vIHBoeXNpY2FsIHdpcmVzIGFuZCB2aWFzCi0gICAgICogZWFjaCB0cmFjayBoYXMgb25lIGNhbmRpZGF0ZQotICAgICAqIGVhY2ggZ2xvYmFsIG9yIGxvY2FsIGd1aWRlIGhhcyAwPD14PD0xIHBhdGhzZWcsIHBhdGhzZWdvbmx5Ci0gICAgICogZWFjaCB2aWEgZ3VpZGUgaGFzID49MCBwaHlzaWNhbCB2aWFzLCB2aWEgb25seQotICAgICAqLwotICAgIC8vYm9vbCBpc1ZpYU9uUGF0aFNlZyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8ZnJQYXRoU2VnPiAmcGF0aFNlZywgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGZyVmlhPiAmdmlhKTsKLSAgICAvL2Jvb2wgaXNWaWFPblRyYWNrKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxGbGV4VHJhY2s+ICZ0cmFjaywgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGZyVmlhPiAmdmlhKTsKLSAgICAvL2Jvb2wgaXNQYXRoU2VnT25UcmFjayhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RmxleFRyYWNrPiAmdHJhY2ssIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxmclBhdGhTZWc+ICZwYXRoU2VnKTsKLSAgICAvLyBjaGVjayB3aGV0aGVyIG5iciBwYXRoU2VnIGxlbmd0aCBpcyBib3VuZGVkIGJ5IG5vbi1jdXJyZW50LWxheWVyIHNlZ21lbnRzCi0gICAgLy9ib29sIGhhc1BhdGhTZWdMaW1pdChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8ZnJHdWlkZT4gJmd1aWRlLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8ZnJQYXRoU2VnPiAmcGF0aFNlZywgCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICBib29sIGNoZWNrTG93ZXJMYXllciwgYm9vbCBjaGVja1VwcGVyTGF5ZXIpOwotICAgIC8vZnJDb29yZCBnZXRQYXRoU2VnTGltaXQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGZyR3VpZGU+ICZndWlkZSwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGZyUGF0aFNlZz4gJnBhdGhTZWcsIAotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjaGVja0xvd2VyTGF5ZXIsIGJvb2wgY2hlY2tVcHBlckxheWVyLCBib29sIGlzQmVnaW4pOwotICAgIC8vdm9pZCBnZXRQYXRoU2VnTGltaXRfaGVscGVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxmckd1aWRlPiAmZ3VpZGUsIAotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxmclBhdGhTZWc+ICZwYXRoU2VnLCAKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNoZWNrTG93ZXJMYXllciwgYm9vbCBjaGVja1VwcGVyTGF5ZXIsIGJvb2wgaXNCZWdpbiwgCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGZyQmxvY2tPYmplY3Q+ICZ2LCAKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZpbml0LCBmckNvb3JkICZsaW1pdCk7IC8vIGluaXQgYW5kIGxpbWl0IG11c3QgYmUgcmVmZXJlbmNlCi0gIH07Ci0KLX0KLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL3RhL0ZsZXhUQV9hc3NpZ24uY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvdGEvRmxleFRBX2Fzc2lnbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZDM5M2UuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvdGEvRmxleFRBX2Fzc2lnbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQ4ICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlIDxjbWF0aD4KLSNpbmNsdWRlICJ0YS9GbGV4VEEuaCIKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBmcjsKLQotaW5saW5lIGZyQ29vcmQgRmxleFRBV29ya2VyOjpib3gyYm94RGlzdFNxdWFyZShjb25zdCBmckJveCAmYm94MSwgY29uc3QgZnJCb3ggJmJveDIsIGZyQ29vcmQgJmR4LCBmckNvb3JkICZkeSkgewotICBkeCA9IG1heChtYXgoYm94MS5sZWZ0KCksIGJveDIubGVmdCgpKSAgICAgLSBtaW4oYm94MS5yaWdodCgpLCBib3gyLnJpZ2h0KCkpLCAwKTsKLSAgZHkgPSBtYXgobWF4KGJveDEuYm90dG9tKCksIGJveDIuYm90dG9tKCkpIC0gbWluKGJveDEudG9wKCksIGJveDIudG9wKCkpLCAgICAgMCk7Ci0gIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTsKLX0KLQotLy8gbXVzdCBiZSBjdXJyZW50IFRBIGxheWVyCi12b2lkIEZsZXhUQVdvcmtlcjo6bW9kTWluU3BhY2luZ0Nvc3RQbGFuYXIoY29uc3QgZnJCb3ggJmJveCwgZnJMYXllck51bSBsTnVtLCB0YVBpbkZpZyogZmlnLCBib29sIGlzQWRkQ29zdCwgc2V0PHRhUGluKiwgZnJCbG9ja09iamVjdENvbXA+ICpwaW5TKSB7Ci0gIC8vYm9vbCBlbmFibGVPdXRwdXQgPSB0cnVlOwotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICBkb3VibGUgZGJ1ID0gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCk7Ci0gIC8vIG9iajEgPSBjdXJyIG9iagotICBmckNvb3JkIHdpZHRoMSAgPSBib3gud2lkdGgoKTsKLSAgZnJDb29yZCBsZW5ndGgxID0gYm94Lmxlbmd0aCgpOwotICAvLyBvYmoyID0gb3RoZXIgb2JqCi0gIC8vIGxheWVyIGRlZmF1bHQgd2lkdGgKLSAgZnJDb29yZCB3aWR0aDIgICAgID0gZ2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0TGF5ZXIobE51bSktPmdldFdpZHRoKCk7Ci0gIGZyQ29vcmQgaGFsZndpZHRoMiA9IHdpZHRoMiAvIDI7Ci0gIC8vIHNwYWNpbmcgdmFsdWUgbmVlZGVkCi0gIGZyQ29vcmQgYmxvYXREaXN0ID0gMDsKLSAgYXV0byBjb24gPSBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihsTnVtKS0+Z2V0TWluU3BhY2luZygpOwotICBpZiAoY29uKSB7Ci0gICAgaWYgKGNvbi0+dHlwZUlkKCkgPT0gZnJDb25zdHJhaW50VHlwZUVudW06OmZyY1NwYWNpbmdDb25zdHJhaW50KSB7Ci0gICAgICBibG9hdERpc3QgPSBzdGF0aWNfY2FzdDxmclNwYWNpbmdDb25zdHJhaW50Kj4oY29uKS0+Z2V0TWluU3BhY2luZygpOwotICAgIH0gZWxzZSBpZiAoY29uLT50eXBlSWQoKSA9PSBmckNvbnN0cmFpbnRUeXBlRW51bTo6ZnJjU3BhY2luZ1RhYmxlUHJsQ29uc3RyYWludCkgewotICAgICAgYmxvYXREaXN0ID0gc3RhdGljX2Nhc3Q8ZnJTcGFjaW5nVGFibGVQcmxDb25zdHJhaW50Kj4oY29uKS0+ZmluZChtYXgod2lkdGgxLCB3aWR0aDIpLCBsZW5ndGgxKTsKLSAgICB9IGVsc2UgaWYgKGNvbi0+dHlwZUlkKCkgPT0gZnJDb25zdHJhaW50VHlwZUVudW06OmZyY1NwYWNpbmdUYWJsZVR3Q29uc3RyYWludCkgewotICAgICAgYmxvYXREaXN0ID0gc3RhdGljX2Nhc3Q8ZnJTcGFjaW5nVGFibGVUd0NvbnN0cmFpbnQqPihjb24pLT5maW5kKHdpZHRoMSwgd2lkdGgyLCBsZW5ndGgxKTsKLSAgICB9IGVsc2UgewotICAgICAgY291dCA8PCJXYXJuaW5nOiBtaW4gc3BhY2luZyBydWxlIG5vdCBzdXBwb3J0ZXJkIiA8PGVuZGw7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9IGVsc2UgewotICAgIGNvdXQgPDwiV2FybmluZzogbm8gbWluIHNwYWNpbmcgcnVsZSIgPDxlbmRsOwotICAgIHJldHVybjsKLSAgfQotICBmckNvb3JkIGJsb2F0RGlzdFNxdWFyZSA9IGJsb2F0RGlzdCAqIGJsb2F0RGlzdDsKLQotICBib29sIGlzSCA9IChnZXREaXIoKSA9PSBmclByZWZSb3V0aW5nRGlyRW51bTo6ZnJjSG9yelByZWZSb3V0aW5nRGlyKTsKLQotICAvLyBub3cgYXNzdW1lIHRyYWNrIGluIEggZGlyZWN0aW9uCi0gIGZyQ29vcmQgYm94TG93ICA9IGlzSCA/IGJveC5ib3R0b20oKSA6IGJveC5sZWZ0KCk7Ci0gIGZyQ29vcmQgYm94SGlnaCA9IGlzSCA/IGJveC50b3AoKSAgICA6IGJveC5yaWdodCgpOwotICBmckNvb3JkIGJveExlZnQgPSBpc0ggPyBib3gubGVmdCgpICAgOiBib3guYm90dG9tKCk7Ci0gIGZyQ29vcmQgYm94UmlnaHQ9IGlzSCA/IGJveC5yaWdodCgpICA6IGJveC50b3AoKTsKLSAgZnJCb3ggYm94MShib3hMZWZ0LCBib3hMb3csIGJveFJpZ2h0LCBib3hIaWdoKTsKLQotICBpbnQgaWR4MSwgaWR4MjsKLSAgZ2V0VHJhY2tJZHgoYm94TG93IC0gYmxvYXREaXN0IC0gaGFsZndpZHRoMiArIDEsIGJveEhpZ2ggKyBibG9hdERpc3QgKyBoYWxmd2lkdGgyIC0gMSwgbE51bSwgaWR4MSwgaWR4Mik7Ci0KLSAgZnJCb3ggYm94MigtaGFsZndpZHRoMiwgLWhhbGZ3aWR0aDIsIGhhbGZ3aWR0aDIsIGhhbGZ3aWR0aDIpOwotICBmclRyYW5zZm9ybSB4Zm9ybTsKLSAgZnJDb29yZCBkeCwgZHk7Ci0gIGF1dG8gJnRyYWNrTG9jcyA9IGdldFRyYWNrTG9jcyhsTnVtKTsKLSAgYXV0byAmd29ya2VyUmVnaW9uUXVlcnkgPSBnZXRXb3JrZXJSZWdpb25RdWVyeSgpOwotICBmb3IgKGludCBpID0gaWR4MTsgaSA8PSBpZHgyOyBpKyspIHsKLSAgICAvL2NvdXQgPDwiQEBAICIgPDxpIDw8ZW5kbCA8PGZsdXNoOwotICAgIGF1dG8gdHJhY2tMb2MgPSB0cmFja0xvY3NbaV07Ci0gICAgeGZvcm0uc2V0KGZyUG9pbnQoYm94TGVmdCwgdHJhY2tMb2MpKTsKLSAgICBib3gyLnRyYW5zZm9ybSh4Zm9ybSk7Ci0gICAgYm94MmJveERpc3RTcXVhcmUoYm94MSwgYm94MiwgZHgsIGR5KTsKLSAgICBmckNvb3JkIG1heFggPSAoZnJDb29yZCkoc3FydCgxLjAgKiBibG9hdERpc3RTcXVhcmUgLSAxLjAgKiBkeSAqIGR5KSk7Ci0gICAgaWYgKG1heFggKiBtYXhYICsgZHkgKiBkeSA9PSBibG9hdERpc3RTcXVhcmUpIHsKLSAgICAgIG1heFggPSBtYXgoMCwgbWF4WCAtIDEpOwotICAgIH0KLSAgICBmckNvb3JkIGJsb2NrTGVmdCAgPSBib3hMZWZ0ICAtIG1heFggLSBoYWxmd2lkdGgyOwotICAgIGZyQ29vcmQgYmxvY2tSaWdodCA9IGJveFJpZ2h0ICsgbWF4WCArIGhhbGZ3aWR0aDI7Ci0gICAgZnJCb3ggdG1wQm94OwotICAgIGlmIChpc0gpIHsKLSAgICAgIHRtcEJveC5zZXQoYmxvY2tMZWZ0LCB0cmFja0xvYywgYmxvY2tSaWdodCwgdHJhY2tMb2MpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0bXBCb3guc2V0KHRyYWNrTG9jLCBibG9ja0xlZnQsIHRyYWNrTG9jLCBibG9ja1JpZ2h0KTsKLSAgICB9Ci0gICAgaWYgKGlzQWRkQ29zdCkgewotICAgICAgd29ya2VyUmVnaW9uUXVlcnkuYWRkQ29zdCh0bXBCb3gsIGxOdW0sIGZpZywgY29uKTsKLSAgICAgIGlmIChwaW5TKSB7Ci0gICAgICAgIHdvcmtlclJlZ2lvblF1ZXJ5LnF1ZXJ5KHRtcEJveCwgbE51bSwgKnBpblMpOwotICAgICAgfQotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8IiAgYWRkIG1pblNwYyBwbGFuYXJAKCIKLSAgICAgICAgICAgICA8PHRtcEJveC5sZWZ0KCkgIC8gZGJ1IDw8IiwgIiA8PHRtcEJveC5ib3R0b20oKSAvIGRidSA8PCIpICgiIAotICAgICAgICAgICAgIDw8dG1wQm94LnJpZ2h0KCkgLyBkYnUgPDwiLCAiIDw8dG1wQm94LnRvcCgpICAgIC8gZGJ1IDw8IikgIiAKLSAgICAgICAgICAgICA8PGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldExheWVyKGxOdW0pLT5nZXROYW1lKCkgPDxlbmRsIDw8Zmx1c2g7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHdvcmtlclJlZ2lvblF1ZXJ5LnJlbW92ZUNvc3QodG1wQm94LCBsTnVtLCBmaWcsIGNvbik7Ci0gICAgICBpZiAocGluUykgewotICAgICAgICB3b3JrZXJSZWdpb25RdWVyeS5xdWVyeSh0bXBCb3gsIGxOdW0sICpwaW5TKTsKLSAgICAgIH0KLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgIHN1YiBtaW5TcGMgcGxhbmFyQCgiIAotICAgICAgICAgICAgIDw8dG1wQm94LmxlZnQoKSAgLyBkYnUgPDwiLCAiIDw8dG1wQm94LmJvdHRvbSgpIC8gZGJ1IDw8IikgKCIgCi0gICAgICAgICAgICAgPDx0bXBCb3gucmlnaHQoKSAvIGRidSA8PCIsICIgPDx0bXBCb3gudG9wKCkgICAgLyBkYnUgPDwiKSAiIAotICAgICAgICAgICAgIDw8Z2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0TGF5ZXIobE51bSktPmdldE5hbWUoKSA8PGVuZGwgPDxmbHVzaDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotLy8gZ2l2ZW4gYSBzaGFwZSBvbiBhbnkgcm91dGluZyBsYXllciBuLCBibG9jayB2aWEgQChuKzEpIGlmIGlzVXBwZXJWaWEgaXMgdHJ1ZQotdm9pZCBGbGV4VEFXb3JrZXI6Om1vZE1pblNwYWNpbmdDb3N0VmlhKGNvbnN0IGZyQm94ICZib3gsIGZyTGF5ZXJOdW0gbE51bSwgdGFQaW5GaWcqIGZpZywgYm9vbCBpc0FkZENvc3QsIGJvb2wgaXNVcHBlclZpYSwgYm9vbCBpc0N1cnJQcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0PHRhUGluKiwgZnJCbG9ja09iamVjdENvbXA+ICpwaW5TKSB7Ci0gIC8vYm9vbCBlbmFibGVPdXRwdXQgPSB0cnVlOwotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICBkb3VibGUgZGJ1ID0gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCk7Ci0gIC8vIG9iajEgPSBjdXJyIG9iagotICBmckNvb3JkIHdpZHRoMSAgPSBib3gud2lkdGgoKTsKLSAgZnJDb29yZCBsZW5ndGgxID0gYm94Lmxlbmd0aCgpOwotICAvLyBvYmoyID0gb3RoZXIgb2JqCi0gIC8vIGRlZmF1bHQgdmlhIGRpbWVuc2lvbgotICBmclZpYURlZiogdmlhRGVmID0gbnVsbHB0cjsKLSAgZnJMYXllck51bSBjdXRMTnVtID0gMDsKLSAgaWYgKGlzVXBwZXJWaWEpIHsKLSAgICB2aWFEZWYgPSAobE51bSA8IGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldFRvcExheWVyTnVtKCkpID8gCi0gICAgICAgICAgICAgZ2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0TGF5ZXIobE51bSsxKS0+Z2V0RGVmYXVsdFZpYURlZigpIDogCi0gICAgICAgICAgICAgbnVsbHB0cjsKLSAgICBjdXRMTnVtID0gbE51bSArIDE7Ci0gIH0gZWxzZSB7Ci0gICAgdmlhRGVmID0gKGxOdW0gPiBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRCb3R0b21MYXllck51bSgpKSA/IAotICAgICAgICAgICAgIGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldExheWVyKGxOdW0tMSktPmdldERlZmF1bHRWaWFEZWYoKSA6IAotICAgICAgICAgICAgIG51bGxwdHI7Ci0gICAgY3V0TE51bSA9IGxOdW0gLSAxOwotICB9Ci0gIGlmICh2aWFEZWYgPT0gbnVsbHB0cikgewotICAgIHJldHVybjsKLSAgfQotICBmclZpYSB2aWEodmlhRGVmKTsKLSAgZnJCb3ggdmlhQm94KDAsMCwwLDApOwotICBpZiAoaXNVcHBlclZpYSkgewotICAgIHZpYS5nZXRMYXllcjFCQm94KHZpYUJveCk7Ci0gIH0gZWxzZSB7Ci0gICAgdmlhLmdldExheWVyMkJCb3godmlhQm94KTsKLSAgfQotICBmckNvb3JkIHdpZHRoMiAgPSB2aWFCb3gud2lkdGgoKTsKLSAgZnJDb29yZCBsZW5ndGgyID0gdmlhQm94Lmxlbmd0aCgpOwotCi0gIGJvb2wgaXNIID0gKGdldERpcigpID09IGZyUHJlZlJvdXRpbmdEaXJFbnVtOjpmcmNIb3J6UHJlZlJvdXRpbmdEaXIpOwotICBmckxheWVyTnVtIGZvbGxvd1RyYWNrTE51bSA9IChpbnQpZ2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0Qm90dG9tTGF5ZXJOdW0oKSAtIDE7Ci0gIGlmIChjdXRMTnVtIC0gMSA+PSBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRCb3R0b21MYXllck51bSgpICYmIAotICAgICAgZ2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0TGF5ZXIoY3V0TE51bSAtIDEpLT5nZXRUeXBlKCkgPT0gZnJMYXllclR5cGVFbnVtOjpST1VUSU5HICYmCi0gICAgICBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihjdXRMTnVtIC0gMSktPmdldERpcigpID09IGdldERpcigpKSB7Ci0gICAgZm9sbG93VHJhY2tMTnVtID0gY3V0TE51bSAtIDE7Ci0gIH0gZWxzZSBpZiAoY3V0TE51bSArIDEgPD0gZ2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0VG9wTGF5ZXJOdW0oKSAmJiAKLSAgICAgICAgICAgICBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihjdXRMTnVtICsgMSktPmdldFR5cGUoKSA9PSBmckxheWVyVHlwZUVudW06OlJPVVRJTkcgJiYKLSAgICAgICAgICAgICBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihjdXRMTnVtICsgMSktPmdldERpcigpID09IGdldERpcigpKSB7Ci0gICAgZm9sbG93VHJhY2tMTnVtID0gY3V0TE51bSArIDE7Ci0gIH0gZWxzZSB7Ci0gICAgY291dCA8PCJXYXJuaW5nOiB2aWEgbGF5ZXIgY29ubmVjdGVkIHRvIG5vbi1yb3V0aW5nIGxheWVyLCBza2lwcGVkIGluIG1vZE1pblNwYWNpbmdDb3N0VmlhIiA8PGVuZGw7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gc3BhY2luZyB2YWx1ZSBuZWVkZWQKLSAgZnJDb29yZCBibG9hdERpc3QgPSAwOwotICBhdXRvIGNvbiA9IGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldExheWVyKGxOdW0pLT5nZXRNaW5TcGFjaW5nKCk7Ci0gIGlmIChjb24pIHsKLSAgICBpZiAoY29uLT50eXBlSWQoKSA9PSBmckNvbnN0cmFpbnRUeXBlRW51bTo6ZnJjU3BhY2luZ0NvbnN0cmFpbnQpIHsKLSAgICAgIGJsb2F0RGlzdCA9IHN0YXRpY19jYXN0PGZyU3BhY2luZ0NvbnN0cmFpbnQqPihjb24pLT5nZXRNaW5TcGFjaW5nKCk7Ci0gICAgfSBlbHNlIGlmIChjb24tPnR5cGVJZCgpID09IGZyQ29uc3RyYWludFR5cGVFbnVtOjpmcmNTcGFjaW5nVGFibGVQcmxDb25zdHJhaW50KSB7Ci0gICAgICBibG9hdERpc3QgPSBzdGF0aWNfY2FzdDxmclNwYWNpbmdUYWJsZVBybENvbnN0cmFpbnQqPihjb24pLT5maW5kKG1heCh3aWR0aDEsIHdpZHRoMiksIGlzQ3VyclBzID8gbGVuZ3RoMiA6IG1pbihsZW5ndGgxLCBsZW5ndGgyKSk7Ci0gICAgfSBlbHNlIGlmIChjb24tPnR5cGVJZCgpID09IGZyQ29uc3RyYWludFR5cGVFbnVtOjpmcmNTcGFjaW5nVGFibGVUd0NvbnN0cmFpbnQpIHsKLSAgICAgIGJsb2F0RGlzdCA9IHN0YXRpY19jYXN0PGZyU3BhY2luZ1RhYmxlVHdDb25zdHJhaW50Kj4oY29uKS0+ZmluZCh3aWR0aDEsIHdpZHRoMiwgaXNDdXJyUHMgPyBsZW5ndGgyIDogbWluKGxlbmd0aDEsIGxlbmd0aDIpKTsKLSAgICB9IGVsc2UgewotICAgICAgY291dCA8PCJXYXJuaW5nOiBtaW4gc3BhY2luZyBydWxlIG5vdCBzdXBwb3J0ZXJkIiA8PGVuZGw7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9IGVsc2UgewotICAgIGNvdXQgPDwiV2FybmluZzogbm8gbWluIHNwYWNpbmcgcnVsZSIgPDxlbmRsOwotICAgIHJldHVybjsKLSAgfQotICAvLyBvdGhlciBvYmogZW9sIHNwYyB0byBjdXJyIG9iagotICAvLyBubyBuZWVkIHRvIGJsb2F0IGVvbFdpdGhpbiBiZWNhdXNlIGVvbFdpdGhpbiBhbHdheXMgPCBtaW5TcGFjaW5nCi0gIC8vZnJDb29yZCBibG9hdERpc3RFb2xYID0gMDsKLSAgLy9mckNvb3JkIGJsb2F0RGlzdEVvbFkgPSAwOwotICAvL2ZvciAoYXV0byBjb246IGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldExheWVyKGxOdW0pLT5nZXRFb2xTcGFjaW5nKCkpIHsKLSAgLy8gIGF1dG8gZW9sU3BhY2UgID0gY29uLT5nZXRNaW5TcGFjaW5nKCk7Ci0gIC8vICBhdXRvIGVvbFdpZHRoICA9IGNvbi0+Z2V0RW9sV2lkdGgoKTsKLSAgLy8gIC8vIGVvbCB1cCBhbmQgZG93bgotICAvLyAgaWYgKHZpYUJveC5yaWdodCgpIC0gdmlhQm94LmxlZnQoKSA8IGVvbFdpZHRoKSB7Ci0gIC8vICAgIGJsb2F0RGlzdEVvbFkgPSBtYXgoYmxvYXREaXN0RW9sWSwgZW9sU3BhY2UpOwotICAvLyAgfSAKLSAgLy8gIC8vIGVvbCBsZWZ0IGFuZCByaWdodAotICAvLyAgaWYgKHZpYUJveC50b3AoKSAtIHZpYUJveC5ib3R0b20oKSA8IGVvbFdpZHRoKSB7Ci0gIC8vICAgIGJsb2F0RGlzdEVvbFggPSBtYXgoYmxvYXREaXN0RW9sWCwgZW9sU3BhY2UpOwotICAvLyAgfQotICAvL30KLSAgLy9mckNvb3JkIGJsb2F0RGlzdFNxdWFyZSA9IGJsb2F0RGlzdCAqIGJsb2F0RGlzdDsKLQotICBpbnQgaWR4MSwgaWR4MjsKLSAgaWYgKGlzSCkgewotICAgIGdldFRyYWNrSWR4KGJveC5ib3R0b20oKSAtIGJsb2F0RGlzdCAtICh2aWFCb3gudG9wKCkgLSAwKSArIDEsIAotICAgICAgICAgICAgICAgIGJveC50b3AoKSAgICArIGJsb2F0RGlzdCArICgwIC0gdmlhQm94LmJvdHRvbSgpKSAtIDEsCi0gICAgICAgICAgICAgICAgZm9sbG93VHJhY2tMTnVtLCBpZHgxLCBpZHgyKTsKLSAgfSBlbHNlIHsKLSAgICBnZXRUcmFja0lkeChib3gubGVmdCgpICAgLSBibG9hdERpc3QgLSAodmlhQm94LnJpZ2h0KCkgLSAwKSArIDEsIAotICAgICAgICAgICAgICAgIGJveC5yaWdodCgpICArIGJsb2F0RGlzdCArICgwIC0gdmlhQm94LmxlZnQoKSkgLSAxLAotICAgICAgICAgICAgICAgIGZvbGxvd1RyYWNrTE51bSwgaWR4MSwgaWR4Mik7Ci0gIH0KLQotICBhdXRvICZ0cmFja0xvY3MgPSBnZXRUcmFja0xvY3MoZm9sbG93VHJhY2tMTnVtKTsKLSAgYXV0byAmd29ya2VyUmVnaW9uUXVlcnkgPSBnZXRXb3JrZXJSZWdpb25RdWVyeSgpOwotICBmckJveCB0bXBCeDsKLSAgZnJUcmFuc2Zvcm0geGZvcm07Ci0gIGZyQ29vcmQgZHgsIGR5LCBwcmw7Ci0gIC8vZnJDb29yZCBkaXN0U3F1YXJlOwotICBmckNvb3JkIHJlcURpc3QgPSAwOwotICBmckNvb3JkIG1heFgsIGJsb2NrTGVmdCwgYmxvY2tSaWdodDsKLSAgZnJCb3ggYmxvY2tCb3g7Ci0gIGZvciAoaW50IGkgPSBpZHgxOyBpIDw9IGlkeDI7IGkrKykgewotICAgIC8vY291dCA8PCJAQEAgIiA8PGkgPDxlbmRsIDw8Zmx1c2g7Ci0gICAgYXV0byB0cmFja0xvYyA9IHRyYWNrTG9jc1tpXTsKLSAgICBpZiAoaXNIKSB7Ci0gICAgICB4Zm9ybS5zZXQoZnJQb2ludChib3gubGVmdCgpLCB0cmFja0xvYykpOwotICAgIH0gZWxzZSB7Ci0gICAgICB4Zm9ybS5zZXQoZnJQb2ludCh0cmFja0xvYywgYm94LmJvdHRvbSgpKSk7Ci0gICAgfQotICAgIHRtcEJ4LnNldCh2aWFCb3gpOwotICAgIHRtcEJ4LnRyYW5zZm9ybSh4Zm9ybSk7Ci0gICAgLy9kaXN0U3F1YXJlID0gYm94MmJveERpc3RTcXVhcmUoYm94LCB0bXBCeCwgZHgsIGR5KTsKLSAgICBib3gyYm94RGlzdFNxdWFyZShib3gsIHRtcEJ4LCBkeCwgZHkpOwotICAgIGlmIChpc0gpIHsgLy8gdHJhY2sgaXMgaG9yaXpvbnRhbAotICAgICAgaWYgKGR5ID4gMCkgeyAvLyB2aWEgYXQgdGhlIGJvdHRvbSBvZiBib3gKLSAgICAgICAgaWYgKGlzQ3VyclBzKSB7IC8vIHBybCBtYXhlZCBvdXQgdG8gYmUgdmlhQm94Ci0gICAgICAgICAgcHJsID0gdmlhQm94LnJpZ2h0KCkgLSB2aWFCb3gubGVmdCgpOwotICAgICAgICB9IGVsc2UgeyAvLyBwcmwgbWF4ZWQgb3V0IHRvIGJlIHNtYWxsZXIgb2YgYm94IGFuZCB2aWFCb3gKLSAgICAgICAgICBwcmwgPSBtaW4oYm94LnJpZ2h0KCkgLSBib3gubGVmdCgpLCB2aWFCb3gucmlnaHQoKSAtIHZpYUJveC5sZWZ0KCkpOwotICAgICAgICB9Ci0gICAgICAvLyB2aWEgYXQgdGhlIHNpZGUgb2YgYm94Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoaXNDdXJyUHMpIHsgLy8gcHJsIG1heGVkIG91dCB0byBiZSB2aWFCb3gKLSAgICAgICAgICBwcmwgPSB2aWFCb3gudG9wKCkgLSB2aWFCb3guYm90dG9tKCk7Ci0gICAgICAgIH0gZWxzZSB7IC8vIHBybCBtYXhlZCBvdXQgdG8gYmUgc21hbGxlciBvZiBib3ggYW5kIHZpYUJveAotICAgICAgICAgIHBybCA9IG1pbihib3gudG9wKCkgLSBib3guYm90dG9tKCksIHZpYUJveC50b3AoKSAtIHZpYUJveC5ib3R0b20oKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgeyAvLyB0cmFjayBpcyB2ZXJ0aWNhbAotICAgICAgaWYgKGR4ID4gMCkgeyAvLyB2aWEgYXQgdGhlIGJvdHRvbSBvZiBib3gKLSAgICAgICAgaWYgKGlzQ3VyclBzKSB7IC8vIHBybCBtYXhlZCBvdXQgdG8gYmUgdmlhQm94Ci0gICAgICAgICAgcHJsID0gdmlhQm94LnRvcCgpIC0gdmlhQm94LmJvdHRvbSgpOwotICAgICAgICB9IGVsc2UgeyAvLyBwcmwgbWF4ZWQgb3V0IHRvIGJlIHNtYWxsZXIgb2YgYm94IGFuZCB2aWFCb3gKLSAgICAgICAgICBwcmwgPSBtaW4oYm94LnRvcCgpIC0gYm94LmJvdHRvbSgpLCB2aWFCb3gudG9wKCkgLSB2aWFCb3guYm90dG9tKCkpOwotICAgICAgICB9Ci0gICAgICAvLyB2aWEgYXQgdGhlIHNpZGUgb2YgYm94Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoaXNDdXJyUHMpIHsgLy8gcHJsIG1heGVkIG91dCB0byBiZSB2aWFCb3gKLSAgICAgICAgICBwcmwgPSB2aWFCb3gucmlnaHQoKSAtIHZpYUJveC5sZWZ0KCk7Ci0gICAgICAgIH0gZWxzZSB7IC8vIHBybCBtYXhlZCBvdXQgdG8gYmUgc21hbGxlciBvZiBib3ggYW5kIHZpYUJveAotICAgICAgICAgIHBybCA9IG1pbihib3gucmlnaHQoKSAtIGJveC5sZWZ0KCksIHZpYUJveC5yaWdodCgpIC0gdmlhQm94LmxlZnQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGNvbi0+dHlwZUlkKCkgPT0gZnJDb25zdHJhaW50VHlwZUVudW06OmZyY1NwYWNpbmdDb25zdHJhaW50KSB7Ci0gICAgICByZXFEaXN0ID0gc3RhdGljX2Nhc3Q8ZnJTcGFjaW5nQ29uc3RyYWludCo+KGNvbiktPmdldE1pblNwYWNpbmcoKTsKLSAgICB9IGVsc2UgaWYgKGNvbi0+dHlwZUlkKCkgPT0gZnJDb25zdHJhaW50VHlwZUVudW06OmZyY1NwYWNpbmdUYWJsZVBybENvbnN0cmFpbnQpIHsKLSAgICAgIHJlcURpc3QgPSBzdGF0aWNfY2FzdDxmclNwYWNpbmdUYWJsZVBybENvbnN0cmFpbnQqPihjb24pLT5maW5kKG1heCh3aWR0aDEsIHdpZHRoMiksIHBybCk7Ci0gICAgfSBlbHNlIGlmIChjb24tPnR5cGVJZCgpID09IGZyQ29uc3RyYWludFR5cGVFbnVtOjpmcmNTcGFjaW5nVGFibGVUd0NvbnN0cmFpbnQpIHsKLSAgICAgIHJlcURpc3QgPSBzdGF0aWNfY2FzdDxmclNwYWNpbmdUYWJsZVR3Q29uc3RyYWludCo+KGNvbiktPmZpbmQod2lkdGgxLCB3aWR0aDIsIHBybCk7Ci0gICAgfQotCi0gICAgaWYgKGlzSCkgewotICAgICAgaWYgKGR5ID49IHJlcURpc3QpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBtYXhYID0gKGZyQ29vcmQpKHNxcnQoMS4wICogcmVxRGlzdCAqIHJlcURpc3QgLSAxLjAgKiBkeSAqIGR5KSk7Ci0gICAgICBpZiAobWF4WCAqIG1heFggKyBkeSAqIGR5ID09IHJlcURpc3QgKiByZXFEaXN0KSB7Ci0gICAgICAgIG1heFggPSBtYXgoMCwgbWF4WCAtIDEpOwotICAgICAgfQotICAgICAgYmxvY2tMZWZ0ICA9IGJveC5sZWZ0KCkgIC0gbWF4WCAtICh2aWFCb3gucmlnaHQoKSAtIDApOwotICAgICAgYmxvY2tSaWdodCA9IGJveC5yaWdodCgpICsgbWF4WCArICgwLSB2aWFCb3gubGVmdCgpKTsKLQotICAgICAgYmxvY2tCb3guc2V0KGJsb2NrTGVmdCwgdHJhY2tMb2MsIGJsb2NrUmlnaHQsIHRyYWNrTG9jKTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKGR4ID49IHJlcURpc3QpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBtYXhYID0gKGZyQ29vcmQpKHNxcnQoMS4wICogcmVxRGlzdCAqIHJlcURpc3QgLSAxLjAgKiBkeCAqIGR4KSk7Ci0gICAgICBpZiAobWF4WCAqIG1heFggKyBkeCAqIGR4ID09IHJlcURpc3QgKiByZXFEaXN0KSB7Ci0gICAgICAgIG1heFggPSBtYXgoMCwgbWF4WCAtIDEpOwotICAgICAgfQotICAgICAgYmxvY2tMZWZ0ICA9IGJveC5ib3R0b20oKSAtIG1heFggLSAodmlhQm94LnRvcCgpIC0gMCk7Ci0gICAgICBibG9ja1JpZ2h0ID0gYm94LnRvcCgpICAgICsgbWF4WCArICgwLSB2aWFCb3guYm90dG9tKCkpOwotCi0gICAgICBibG9ja0JveC5zZXQodHJhY2tMb2MsIGJsb2NrTGVmdCwgdHJhY2tMb2MsIGJsb2NrUmlnaHQpOwotICAgIH0KLQotICAgIGlmIChpc0FkZENvc3QpIHsKLSAgICAgIHdvcmtlclJlZ2lvblF1ZXJ5LmFkZENvc3QoYmxvY2tCb3gsIGN1dExOdW0sIGZpZywgY29uKTsKLSAgICAgIGlmIChwaW5TKSB7Ci0gICAgICAgIHdvcmtlclJlZ2lvblF1ZXJ5LnF1ZXJ5KGJsb2NrQm94LCBjdXRMTnVtLCAqcGluUyk7Ci0gICAgICB9Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiICBhZGQgbWluU3BjIHZpYUAoIgotICAgICAgICAgICAgIDw8YmxvY2tCb3gubGVmdCgpICAvIGRidSA8PCIsICIgPDxibG9ja0JveC5ib3R0b20oKSAvIGRidSA8PCIpICgiIAotICAgICAgICAgICAgIDw8YmxvY2tCb3gucmlnaHQoKSAvIGRidSA8PCIsICIgPDxibG9ja0JveC50b3AoKSAgICAvIGRidSA8PCIpICIgCi0gICAgICAgICAgICAgPDxnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihjdXRMTnVtKS0+Z2V0TmFtZSgpIDw8ZW5kbCA8PGZsdXNoOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICB3b3JrZXJSZWdpb25RdWVyeS5yZW1vdmVDb3N0KGJsb2NrQm94LCBjdXRMTnVtLCBmaWcsIGNvbik7Ci0gICAgICBpZiAocGluUykgewotICAgICAgICB3b3JrZXJSZWdpb25RdWVyeS5xdWVyeShibG9ja0JveCwgY3V0TE51bSwgKnBpblMpOwotICAgICAgfQotICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICBjb3V0IDw8IiAgc3ViIG1pblNwYyB2aWFAKCIgCi0gICAgICAgICAgICAgPDxibG9ja0JveC5sZWZ0KCkgIC8gZGJ1IDw8IiwgIiA8PGJsb2NrQm94LmJvdHRvbSgpIC8gZGJ1IDw8IikgKCIgCi0gICAgICAgICAgICAgPDxibG9ja0JveC5yaWdodCgpIC8gZGJ1IDw8IiwgIiA8PGJsb2NrQm94LnRvcCgpICAgIC8gZGJ1IDw8IikgIiAKLSAgICAgICAgICAgICA8PGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldExheWVyKGN1dExOdW0pLT5nZXROYW1lKCkgPDxlbmRsIDw8Zmx1c2g7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLX0KLQotdm9pZCBGbGV4VEFXb3JrZXI6Om1vZEN1dFNwYWNpbmdDb3N0KGNvbnN0IGZyQm94ICZib3gsIGZyTGF5ZXJOdW0gbE51bSwgdGFQaW5GaWcqIGZpZywgYm9vbCBpc0FkZENvc3QsIHNldDx0YVBpbiosIGZyQmxvY2tPYmplY3RDb21wPiAqcGluUykgewotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgZG91YmxlIGRidSA9IGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpOwotICBpZiAoIWdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldExheWVyKGxOdW0pLT5oYXNDdXRTcGFjaW5nKCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgLy8gb2JqMSA9IGN1cnIgb2JqCi0gIC8vIG9iajIgPSBvdGhlciBvYmoKLSAgLy8gZGVmYXVsdCB2aWEgZGltZW5zaW9uCi0gIGZyVmlhRGVmKiB2aWFEZWYgPSBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihsTnVtKS0+Z2V0RGVmYXVsdFZpYURlZigpOwotICBmclZpYSB2aWEodmlhRGVmKTsKLSAgZnJCb3ggdmlhQm94KDAsMCwwLDApOwotICB2aWEuZ2V0Q3V0QkJveCh2aWFCb3gpOwotCi0gIGJvb2wgaXNIID0gKGdldERpcigpID09IGZyUHJlZlJvdXRpbmdEaXJFbnVtOjpmcmNIb3J6UHJlZlJvdXRpbmdEaXIpOwotICBmckxheWVyTnVtIGZvbGxvd1RyYWNrTE51bSA9IChpbnQpZ2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0Qm90dG9tTGF5ZXJOdW0oKSAtIDE7Ci0gIGlmIChsTnVtIC0gMSA+PSBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRCb3R0b21MYXllck51bSgpICYmIAotICAgICAgZ2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0TGF5ZXIobE51bSAtIDEpLT5nZXRUeXBlKCkgPT0gZnJMYXllclR5cGVFbnVtOjpST1VUSU5HICYmCi0gICAgICBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihsTnVtIC0gMSktPmdldERpcigpID09IGdldERpcigpKSB7Ci0gICAgZm9sbG93VHJhY2tMTnVtID0gbE51bSAtIDE7Ci0gIH0gZWxzZSBpZiAobE51bSArIDEgPD0gZ2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0VG9wTGF5ZXJOdW0oKSAmJiAKLSAgICAgICAgICAgICBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihsTnVtICsgMSktPmdldFR5cGUoKSA9PSBmckxheWVyVHlwZUVudW06OlJPVVRJTkcgJiYKLSAgICAgICAgICAgICBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihsTnVtICsgMSktPmdldERpcigpID09IGdldERpcigpKSB7Ci0gICAgZm9sbG93VHJhY2tMTnVtID0gbE51bSArIDE7Ci0gIH0gZWxzZSB7Ci0gICAgY291dCA8PCJXYXJuaW5nOiB2aWEgbGF5ZXIgY29ubmVjdGVkIHRvIG5vbi1yb3V0aW5nIGxheWVyLCBza2lwcGVkIGluIG1vZE1pblNwYWNpbmdDb3N0VmlhIiA8PGVuZGw7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gc3BhY2luZyB2YWx1ZSBuZWVkZWQKLSAgZnJDb29yZCBibG9hdERpc3QgPSAwOwotICBmb3IgKGF1dG8gY29uOiBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihsTnVtKS0+Z2V0Q3V0U3BhY2luZygpKSB7Ci0gICAgYmxvYXREaXN0ID0gbWF4KGJsb2F0RGlzdCwgY29uLT5nZXRDdXRTcGFjaW5nKCkpOwotICB9Ci0KLSAgaW50IGlkeDEsIGlkeDI7Ci0gIGlmIChpc0gpIHsKLSAgICBnZXRUcmFja0lkeChib3guYm90dG9tKCkgLSBibG9hdERpc3QgLSAodmlhQm94LnRvcCgpIC0gMCkgKyAxLCAKLSAgICAgICAgICAgICAgICBib3gudG9wKCkgICAgKyBibG9hdERpc3QgKyAoMCAtIHZpYUJveC5ib3R0b20oKSkgLSAxLAotICAgICAgICAgICAgICAgIGZvbGxvd1RyYWNrTE51bSwgaWR4MSwgaWR4Mik7Ci0gIH0gZWxzZSB7Ci0gICAgZ2V0VHJhY2tJZHgoYm94LmxlZnQoKSAgIC0gYmxvYXREaXN0IC0gKHZpYUJveC5yaWdodCgpIC0gMCkgKyAxLCAKLSAgICAgICAgICAgICAgICBib3gucmlnaHQoKSAgKyBibG9hdERpc3QgKyAoMCAtIHZpYUJveC5sZWZ0KCkpIC0gMSwKLSAgICAgICAgICAgICAgICBmb2xsb3dUcmFja0xOdW0sIGlkeDEsIGlkeDIpOwotICB9Ci0KLSAgYXV0byAmdHJhY2tMb2NzID0gZ2V0VHJhY2tMb2NzKGZvbGxvd1RyYWNrTE51bSk7Ci0gIGF1dG8gJndvcmtlclJlZ2lvblF1ZXJ5ID0gZ2V0V29ya2VyUmVnaW9uUXVlcnkoKTsKLSAgZnJCb3ggdG1wQng7Ci0gIGZyVHJhbnNmb3JtIHhmb3JtOwotICBmckNvb3JkIGR4LCBkeSwgYzJjdHJhY2tkaXN0OwotICAvL2ZyQ29vcmQgZGlzdFNxdWFyZTsKLSAgZnJDb29yZCByZXFEaXN0ID0gMDsKLSAgZnJDb29yZCBtYXhYLCBibG9ja0xlZnQsIGJsb2NrUmlnaHQ7Ci0gIGZyQm94IGJsb2NrQm94OwotICBmclBvaW50IGJveENlbnRlciwgdG1wQnhDZW50ZXI7Ci0gIGJveENlbnRlci5zZXQoKGJveC5sZWZ0KCkgKyBib3gucmlnaHQoKSkgLyAyLCAoYm94LmJvdHRvbSgpICsgYm94LnRvcCgpKSAvIDIpOwotICBib29sIGhhc1Zpb2wgPSBmYWxzZTsKLSAgZm9yIChpbnQgaSA9IGlkeDE7IGkgPD0gaWR4MjsgaSsrKSB7Ci0gICAgYXV0byB0cmFja0xvYyA9IHRyYWNrTG9jc1tpXTsKLSAgICAvL2NvdXQgPDwiQEBAIiA8PHRyYWNrTG9jIDw8ZW5kbDsKLSAgICBpZiAoaXNIKSB7Ci0gICAgICB4Zm9ybS5zZXQoZnJQb2ludChib3gubGVmdCgpLCB0cmFja0xvYykpOwotICAgIH0gZWxzZSB7Ci0gICAgICB4Zm9ybS5zZXQoZnJQb2ludCh0cmFja0xvYywgYm94LmJvdHRvbSgpKSk7Ci0gICAgfQotICAgIHRtcEJ4LnNldCh2aWFCb3gpOwotICAgIHRtcEJ4LnRyYW5zZm9ybSh4Zm9ybSk7Ci0gICAgLy9kaXN0U3F1YXJlID0gYm94MmJveERpc3RTcXVhcmUoYm94LCB0bXBCeCwgZHgsIGR5KTsKLSAgICBib3gyYm94RGlzdFNxdWFyZShib3gsIHRtcEJ4LCBkeCwgZHkpOwotCi0gICAgZm9yIChhdXRvIGNvbjogZ2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0TGF5ZXIobE51bSktPmdldEN1dFNwYWNpbmcoKSkgewotICAgICAgaGFzVmlvbCAgICAgICA9IGZhbHNlOwotICAgICAgcmVxRGlzdCAgICAgICA9IGNvbi0+Z2V0Q3V0U3BhY2luZygpOwotICAgICAgYm9vbCBpc0MyQyA9IGNvbi0+aGFzQ2VudGVyVG9DZW50ZXIoKTsKLSAgICAgIGlmIChpc0gpIHsKLSAgICAgICAgYzJjdHJhY2tkaXN0ID0gYWJzKGJveENlbnRlci55KCkgLSB0cmFja0xvYyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjMmN0cmFja2Rpc3QgPSBhYnMoYm94Q2VudGVyLngoKSAtIHRyYWNrTG9jKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGlzSCkgewotICAgICAgICBpZiAoaXNDMkMpIHsKLSAgICAgICAgICBpZiAoYzJjdHJhY2tkaXN0ID49IHJlcURpc3QpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoZHkgPj0gcmVxRGlzdCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vY291dCA8PCJAQEBAIiA8PHRyYWNrTG9jIDw8ZW5kbDsKLSAgICAgICAgaWYgKGlzQzJDKSB7Ci0gICAgICAgICAgbWF4WCA9IChmckNvb3JkKShzcXJ0KDEuMCAqIHJlcURpc3QgKiByZXFEaXN0IC0gMS4wICogYzJjdHJhY2tkaXN0ICogYzJjdHJhY2tkaXN0KSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbWF4WCA9IChmckNvb3JkKShzcXJ0KDEuMCAqIHJlcURpc3QgKiByZXFEaXN0IC0gMS4wICogZHkgKiBkeSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtYXhYICogbWF4WCArIGR5ICogZHkgPT0gcmVxRGlzdCAqIHJlcURpc3QpIHsKLSAgICAgICAgICBtYXhYID0gbWF4KDAsIG1heFggLSAxKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNDMkMpIHsKLSAgICAgICAgICBibG9ja0xlZnQgID0gYm94Q2VudGVyLngoKSAtIG1heFg7Ci0gICAgICAgICAgYmxvY2tSaWdodCA9IGJveENlbnRlci54KCkgKyBtYXhYOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGJsb2NrTGVmdCAgPSBib3gubGVmdCgpICAtIG1heFggLSAodmlhQm94LnJpZ2h0KCkgLSAwKTsKLSAgICAgICAgICBibG9ja1JpZ2h0ID0gYm94LnJpZ2h0KCkgKyBtYXhYICsgKDAtIHZpYUJveC5sZWZ0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGJsb2NrQm94LnNldChibG9ja0xlZnQsIHRyYWNrTG9jLCBibG9ja1JpZ2h0LCB0cmFja0xvYyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoaXNDMkMpIHsKLSAgICAgICAgICBpZiAoYzJjdHJhY2tkaXN0ID49IHJlcURpc3QpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoZHggPj0gcmVxRGlzdCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vY291dCA8PCJAQEBAIiA8PHRyYWNrTG9jIDw8ZW5kbDsKLSAgICAgICAgaWYgKGlzQzJDKSB7Ci0gICAgICAgICAgbWF4WCA9IChmckNvb3JkKShzcXJ0KDEuMCAqIHJlcURpc3QgKiByZXFEaXN0IC0gMS4wICogYzJjdHJhY2tkaXN0ICogYzJjdHJhY2tkaXN0KSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbWF4WCA9IChmckNvb3JkKShzcXJ0KDEuMCAqIHJlcURpc3QgKiByZXFEaXN0IC0gMS4wICogZHggKiBkeCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtYXhYICogbWF4WCArIGR4ICogZHggPT0gcmVxRGlzdCAqIHJlcURpc3QpIHsKLSAgICAgICAgICBtYXhYID0gbWF4KDAsIG1heFggLSAxKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNDMkMpIHsKLSAgICAgICAgICBibG9ja0xlZnQgID0gYm94Q2VudGVyLnkoKSAtIG1heFg7Ci0gICAgICAgICAgYmxvY2tSaWdodCA9IGJveENlbnRlci55KCkgKyBtYXhYOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGJsb2NrTGVmdCAgPSBib3guYm90dG9tKCkgIC0gbWF4WCAtICh2aWFCb3gudG9wKCkgLSAwKTsKLSAgICAgICAgICBibG9ja1JpZ2h0ID0gYm94LnRvcCgpICAgICArIG1heFggKyAoMC0gdmlhQm94LmJvdHRvbSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJsb2NrQm94LnNldCh0cmFja0xvYywgYmxvY2tMZWZ0LCB0cmFja0xvYywgYmxvY2tSaWdodCk7Ci0gICAgICB9Ci0gICAgICBpZiAoY29uLT5oYXNTYW1lTmV0KCkpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAoY29uLT5pc0xheWVyKCkpIHsKLSAgICAgICAgOwotICAgICAgfSBlbHNlIGlmIChjb24tPmlzQWRqYWNlbnRDdXRzKCkpIHsKLSAgICAgICAgaGFzVmlvbCA9IHRydWU7Ci0gICAgICAgIC8vIHNob3VsZCBkaXNhYmxlIGhhc1Zpb2wgYW5kIG1vZGlmeSB0aGlzIHBhcnQgdG8gbmV3IGdyaWQgZ3JhcGgKLSAgICAgIH0gZWxzZSBpZiAoY29uLT5pc1BhcmFsbGVsT3ZlcmxhcCgpKSB7Ci0gICAgICAgIGlmIChpc0gpIHsKLSAgICAgICAgICBpZiAoZHkgPiAwKSB7Ci0gICAgICAgICAgICBibG9ja0JveC5zZXQobWF4KGJveC5sZWZ0KCkgIC0gKHZpYUJveC5yaWdodCgpIC0gMCkgKyAxLCBibG9ja0xlZnQpLCB0cmFja0xvYywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluKGJveC5yaWdodCgpICsgKDAgLSB2aWFCb3gubGVmdCgpKSAgLSAxLCBibG9ja1JpZ2h0KSwgdHJhY2tMb2MpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoZHggPiAwKSB7Ci0gICAgICAgICAgICBibG9ja0JveC5zZXQodHJhY2tMb2MsIG1heChib3guYm90dG9tKCkgLSAodmlhQm94LnRvcCgpIC0gMCkgICAgICsgMSwgYmxvY2tMZWZ0KSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tMb2MsIG1pbihib3gudG9wKCkgICAgKyAoMCAtIHZpYUJveC5ib3R0b20oKSkgIC0gMSwgYmxvY2tSaWdodCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoYmxvY2tCb3gubGVmdCgpIDw9IGJsb2NrQm94LnJpZ2h0KCkgJiYgYmxvY2tCb3guYm90dG9tKCkgPD0gYmxvY2tCb3gudG9wKCkpIHsKLSAgICAgICAgICBoYXNWaW9sID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChjb24tPmlzQXJlYSgpKSB7Ci0gICAgICAgIGF1dG8gY3VyckFyZWEgPSBtYXgoYm94Lmxlbmd0aCgpICogYm94LndpZHRoKCksIHRtcEJ4Lmxlbmd0aCgpICogdG1wQngud2lkdGgoKSk7Ci0gICAgICAgIGlmIChjdXJyQXJlYSA+PSBjb24tPmdldEN1dEFyZWEoKSkgewotICAgICAgICAgIGhhc1Zpb2wgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBoYXNWaW9sID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChoYXNWaW9sKSB7Ci0gICAgICAgIGlmIChpc0FkZENvc3QpIHsKLSAgICAgICAgICB3b3JrZXJSZWdpb25RdWVyeS5hZGRDb3N0KGJsb2NrQm94LCBsTnVtLCBmaWcsIGNvbik7Ci0gICAgICAgICAgaWYgKHBpblMpIHsKLSAgICAgICAgICAgIHdvcmtlclJlZ2lvblF1ZXJ5LnF1ZXJ5KGJsb2NrQm94LCBsTnVtLCAqcGluUyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICAgIGNvdXQgPDwiICBhZGQgY3V0U3BjIHZpYUAoIgotICAgICAgICAgICAgICAgICA8PGJsb2NrQm94LmxlZnQoKSAgLyBkYnUgPDwiLCAiIDw8YmxvY2tCb3guYm90dG9tKCkgLyBkYnUgPDwiKSAoIiAKLSAgICAgICAgICAgICAgICAgPDxibG9ja0JveC5yaWdodCgpIC8gZGJ1IDw8IiwgIiA8PGJsb2NrQm94LnRvcCgpICAgIC8gZGJ1IDw8IikgIiAKLSAgICAgICAgICAgICAgICAgPDxnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihsTnVtKS0+Z2V0TmFtZSgpIDw8ZW5kbCA8PGZsdXNoOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB3b3JrZXJSZWdpb25RdWVyeS5yZW1vdmVDb3N0KGJsb2NrQm94LCBsTnVtLCBmaWcsIGNvbik7Ci0gICAgICAgICAgaWYgKHBpblMpIHsKLSAgICAgICAgICAgIHdvcmtlclJlZ2lvblF1ZXJ5LnF1ZXJ5KGJsb2NrQm94LCBsTnVtLCAqcGluUyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICAgIGNvdXQgPDwiICBzdWIgY3V0U3BjIHZpYUAoIiAKLSAgICAgICAgICAgICAgICAgPDxibG9ja0JveC5sZWZ0KCkgIC8gZGJ1IDw8IiwgIiA8PGJsb2NrQm94LmJvdHRvbSgpIC8gZGJ1IDw8IikgKCIgCi0gICAgICAgICAgICAgICAgIDw8YmxvY2tCb3gucmlnaHQoKSAvIGRidSA8PCIsICIgPDxibG9ja0JveC50b3AoKSAgICAvIGRidSA8PCIpICIgCi0gICAgICAgICAgICAgICAgIDw8Z2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0TGF5ZXIobE51bSktPmdldE5hbWUoKSA8PGVuZGwgPDxmbHVzaDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBGbGV4VEFXb3JrZXI6OmFkZENvc3QodGFQaW5GaWcqIGZpZywgc2V0PHRhUGluKiwgZnJCbG9ja09iamVjdENvbXA+ICpwaW5TKSB7Ci0gIG1vZENvc3QoZmlnLCB0cnVlLCBwaW5TKTsKLX0KLQotdm9pZCBGbGV4VEFXb3JrZXI6OnN1YkNvc3QodGFQaW5GaWcqIGZpZywgc2V0PHRhUGluKiwgZnJCbG9ja09iamVjdENvbXA+ICpwaW5TKSB7Ci0gIG1vZENvc3QoZmlnLCBmYWxzZSwgcGluUyk7Ci19Ci0KLXZvaWQgRmxleFRBV29ya2VyOjptb2RDb3N0KHRhUGluRmlnKiBmaWcsIGJvb2wgaXNBZGRDb3N0LCBzZXQ8dGFQaW4qLCBmckJsb2NrT2JqZWN0Q29tcD4gKnBpblMpIHsKLSAgaWYgKGZpZy0+dHlwZUlkKCkgPT0gdGFjUGF0aFNlZykgewotICAgIGF1dG8gb2JqID0gc3RhdGljX2Nhc3Q8dGFQYXRoU2VnKj4oZmlnKTsKLSAgICBhdXRvIGxheWVyTnVtID0gb2JqLT5nZXRMYXllck51bSgpOwotICAgIGZyQm94IGJveDsKLSAgICBvYmotPmdldEJCb3goYm94KTsKLSAgICBtb2RNaW5TcGFjaW5nQ29zdFBsYW5hcihib3gsIGxheWVyTnVtLCBvYmosIGlzQWRkQ29zdCwgcGluUyk7IC8vIG11c3QgYmUgY3VycmVudCBUQSBsYXllcgotICAgIG1vZE1pblNwYWNpbmdDb3N0VmlhKGJveCwgbGF5ZXJOdW0sIG9iaiwgaXNBZGRDb3N0LCB0cnVlLCB0cnVlLCBwaW5TKTsKLSAgICBtb2RNaW5TcGFjaW5nQ29zdFZpYShib3gsIGxheWVyTnVtLCBvYmosIGlzQWRkQ29zdCwgZmFsc2UsIHRydWUsIHBpblMpOwotICB9IGVsc2UgaWYgKGZpZy0+dHlwZUlkKCkgPT0gdGFjVmlhKSB7Ci0gICAgYXV0byBvYmogPSBzdGF0aWNfY2FzdDx0YVZpYSo+KGZpZyk7Ci0gICAgZnJCb3ggYm94OwotICAgIG9iai0+Z2V0TGF5ZXIxQkJveChib3gpOyAvLyBhc3N1bWVzIGVuY2xvc3VyZSBmb3IgdmlhIGlzIGFsd2F5cyByZWN0YW5nbGUKLSAgICBhdXRvIGxheWVyTnVtID0gb2JqLT5nZXRWaWFEZWYoKS0+Z2V0TGF5ZXIxTnVtKCk7Ci0gICAgLy8gY3VycmVudCBUQSBsYXllcgotICAgIGlmIChnZXREaXIoKSA9PSBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihsYXllck51bSktPmdldERpcigpKSB7Ci0gICAgICBtb2RNaW5TcGFjaW5nQ29zdFBsYW5hcihib3gsIGxheWVyTnVtLCBvYmosIGlzQWRkQ29zdCwgcGluUyk7Ci0gICAgfQotICAgIG1vZE1pblNwYWNpbmdDb3N0VmlhKGJveCwgbGF5ZXJOdW0sIG9iaiwgaXNBZGRDb3N0LCB0cnVlLCBmYWxzZSwgcGluUyk7Ci0gICAgbW9kTWluU3BhY2luZ0Nvc3RWaWEoYm94LCBsYXllck51bSwgb2JqLCBpc0FkZENvc3QsIGZhbHNlLCBmYWxzZSwgcGluUyk7Ci0KLSAgICBvYmotPmdldExheWVyMkJCb3goYm94KTsgLy8gYXNzdW1lcyBlbmNsb3N1cmUgZm9yIHZpYSBpcyBhbHdheXMgcmVjdGFuZ2xlCi0gICAgbGF5ZXJOdW0gPSBvYmotPmdldFZpYURlZigpLT5nZXRMYXllcjJOdW0oKTsKLSAgICAvLyBjdXJyZW50IFRBIGxheWVyCi0gICAgaWYgKGdldERpcigpID09IGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldExheWVyKGxheWVyTnVtKS0+Z2V0RGlyKCkpIHsKLSAgICAgIG1vZE1pblNwYWNpbmdDb3N0UGxhbmFyKGJveCwgbGF5ZXJOdW0sIG9iaiwgaXNBZGRDb3N0LCBwaW5TKTsKLSAgICB9Ci0gICAgbW9kTWluU3BhY2luZ0Nvc3RWaWEoYm94LCBsYXllck51bSwgb2JqLCBpc0FkZENvc3QsIHRydWUsIGZhbHNlLCBwaW5TKTsKLSAgICBtb2RNaW5TcGFjaW5nQ29zdFZpYShib3gsIGxheWVyTnVtLCBvYmosIGlzQWRkQ29zdCwgZmFsc2UsIGZhbHNlLCBwaW5TKTsKLQotICAgIGZyVHJhbnNmb3JtIHhmb3JtOwotICAgIGZyUG9pbnQgcHQ7Ci0gICAgb2JqLT5nZXRPcmlnaW4ocHQpOwotICAgIHhmb3JtLnNldChwdCk7Ci0gICAgZm9yIChhdXRvICZ1RmlnOiBvYmotPmdldFZpYURlZigpLT5nZXRDdXRGaWdzKCkpIHsKLSAgICAgIGF1dG8gcmVjdCA9IHN0YXRpY19jYXN0PGZyUmVjdCo+KHVGaWcuZ2V0KCkpOwotICAgICAgcmVjdC0+Z2V0QkJveChib3gpOwotICAgICAgYm94LnRyYW5zZm9ybSh4Zm9ybSk7Ci0gICAgICBsYXllck51bSA9IG9iai0+Z2V0VmlhRGVmKCktPmdldEN1dExheWVyTnVtKCk7Ci0gICAgICBtb2RDdXRTcGFjaW5nQ29zdChib3gsIGxheWVyTnVtLCBvYmosIGlzQWRkQ29zdCwgcGluUyk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGNvdXQgPDwiRXJyb3I6IHVuc3VwcG9ydGVkIHJlZ2lvbiBxdWVyeSBhZGQiIDw8ZW5kbDsKLSAgfQotfQotCi12b2lkIEZsZXhUQVdvcmtlcjo6YXNzaWduSXJvdXRlX2F2YWlsVHJhY2tzKHRhUGluKiBpcm91dGUsIGZyTGF5ZXJOdW0gJmxOdW0sIGludCAmaWR4MSwgaW50ICZpZHgyKSB7Ci0gIC8vYm9vbCBlbmFibGVPdXRwdXQgPSB0cnVlOwotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICBsTnVtID0gaXJvdXRlLT5nZXRHdWlkZSgpLT5nZXRCZWdpbkxheWVyTnVtKCk7Ci0gIGZyUG9pbnQgZ2JwLCBnZXAsIGdJZHg7Ci0gIGZyQm94IGdCb3g7Ci0gIGlyb3V0ZS0+Z2V0R3VpZGUoKS0+Z2V0UG9pbnRzKGdicCwgZ2VwKTsKLSAgZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldEdDZWxsSWR4KGdicCwgZ0lkeCk7Ci0gIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXRHQ2VsbEJveChnSWR4LCBnQm94KTsKLSAgYm9vbCBpc0ggPSAoZ2V0RGlyKCkgPT0gZnJQcmVmUm91dGluZ0RpckVudW06OmZyY0hvcnpQcmVmUm91dGluZ0Rpcik7Ci0gIGZyQ29vcmQgY29vcmRMb3cgID0gaXNIID8gZ0JveC5ib3R0b20oKSA6IGdCb3gubGVmdCgpOwotICBmckNvb3JkIGNvb3JkSGlnaCA9IGlzSCA/IGdCb3gudG9wKCkgICAgOiBnQm94LnJpZ2h0KCk7Ci0gIGNvb3JkSGlnaC0tOyAvLyB0byBhdm9pZCBoaWdoZXIgdHJhY2sgPT0gZ3VpZGUgdG9wL3JpZ2h0Ci0gIGdldFRyYWNrSWR4KGNvb3JkTG93LCBjb29yZEhpZ2gsIGxOdW0sIGlkeDEsIGlkeDIpOwotICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgZG91YmxlIGRidSA9IGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpOwotICAgIGNvdXQgPDwiIG1pbi9tYXggdHJhY2tAIiA8PGdldFRyYWNrTG9jcyhsTnVtKVtpZHgxXSAvIGRidTsKLSAgICBpZiAoaWR4MiA+IGlkeDEpIHsKLSAgICAgIGNvdXQgPDwiLyIgPDxnZXRUcmFja0xvY3MobE51bSlbaWR4Ml0gLyBkYnU7Ci0gICAgfQotICAgIGNvdXQgPDxlbmRsOwotICB9Ci19Ci0KLWZyVUludDQgRmxleFRBV29ya2VyOjphc3NpZ25Jcm91dGVfZ2V0V2xlbkNvc3QodGFQaW4qIGlyb3V0ZSwgZnJDb29yZCB0cmFja0xvYykgewotICBhdXRvIGd1aWRlID0gaXJvdXRlLT5nZXRHdWlkZSgpOwotICBib29sIGlzSCA9IChnZXREaXIoKSA9PSBmclByZWZSb3V0aW5nRGlyRW51bTo6ZnJjSG9yelByZWZSb3V0aW5nRGlyKTsKLSAgZnJQb2ludCBiZWdpbiwgZW5kOwotICBndWlkZS0+Z2V0UG9pbnRzKGJlZ2luLCBlbmQpOwotICBmckJveCBlbmRCb3g7Ci0gIGZyUG9pbnQgaWR4OwotICBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0R0NlbGxJZHgoZW5kLCBpZHgpOwotICBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0R0NlbGxCb3goaWR4LCBlbmRCb3gpOwotICBpbnQgd2xlbiA9IDA7Ci0gIGF1dG8gd2xlbl9oZWxwZXIgPSBpcm91dGUtPmdldFdsZW5IZWxwZXIoKTsKLSAgaWYgKHdsZW5faGVscGVyIDw9IDApIHsKLSAgICBpZiAoaXNIKSB7Ci0gICAgICB3bGVuID0gYWJzKHdsZW5faGVscGVyKSAqICh0cmFja0xvYyAtIGVuZEJveC5ib3R0b20oKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHdsZW4gPSBhYnMod2xlbl9oZWxwZXIpICogKHRyYWNrTG9jIC0gZW5kQm94LmxlZnQoKSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChpc0gpIHsKLSAgICAgIHdsZW4gPSBhYnMod2xlbl9oZWxwZXIpICogKGVuZEJveC50b3AoKSAgIC0gdHJhY2tMb2MpOwotICAgIH0gZWxzZSB7Ci0gICAgICB3bGVuID0gYWJzKHdsZW5faGVscGVyKSAqIChlbmRCb3gucmlnaHQoKSAtIHRyYWNrTG9jKTsKLSAgICB9Ci0gIH0KLSAgaWYgKHdsZW4gPCAwKSB7Ci0gICAgZG91YmxlIGRidSA9IGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpOwotICAgIGNvdXQgPDwiRXJyb3I6IGdldFdsZW5Db3N0IGhhcyB3bGVuQ29zdCA8IDAiIDw8IiwgdHJhY2tMb2NAIiA8PHRyYWNrTG9jIC8gZGJ1IDw8IiBib3ggKCIgCi0gICAgICAgICA8PGVuZEJveC5sZWZ0KCkgIC8gZGJ1ICA8PCIsICIgPDxlbmRCb3guYm90dG9tKCkgLyBkYnUgPDwiKSAoIiAKLSAgICAgICAgIDw8ZW5kQm94LnJpZ2h0KCkgLyBkYnUgIDw8IiwgIiA8PGVuZEJveC50b3AoKSAgICAvIGRidSA8PCIpIiA8PGVuZGw7Ci0gICAgcmV0dXJuIChmclVJbnQ0KTA7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIChmclVJbnQ0KXdsZW47Ci0gIH0KLX0KLQotZnJVSW50NCBGbGV4VEFXb3JrZXI6OmFzc2lnbklyb3V0ZV9nZXRQaW5Db3N0KHRhUGluKiBpcm91dGUsIGZyQ29vcmQgdHJhY2tMb2MpIHsKLSAgZnJVSW50NCBzb2wgPSAwOwotICBpZiAoaXJvdXRlLT5oYXNXbGVuSGVscGVyMigpKSB7Ci0gICAgc29sID0gYWJzKHRyYWNrTG9jIC0gaXJvdXRlLT5nZXRXbGVuSGVscGVyMigpKTsKLSAgfQotICByZXR1cm4gc29sOwotfQotCi1mclVJbnQ0IEZsZXhUQVdvcmtlcjo6YXNzaWduSXJvdXRlX2dldERSQ0Nvc3RfaGVscGVyKHRhUGluKiBpcm91dGUsIGNvbnN0IGZyQm94ICZib3gsIGZyTGF5ZXJOdW0gbE51bSkgewotICBhdXRvICZ3b3JrZXJSZWdpb25RdWVyeSA9IGdldFdvcmtlclJlZ2lvblF1ZXJ5KCk7Ci0gIHZlY3RvcjxycV9nZW5lcmljX3ZhbHVlX3Q8c3RkOjpwYWlyPGZyQmxvY2tPYmplY3QqLCBmckNvbnN0cmFpbnQqPiA+ID4gcmVzdWx0OwotICBpbnQgb3ZlcmxhcCA9IDA7Ci0gIHdvcmtlclJlZ2lvblF1ZXJ5LnF1ZXJ5Q29zdChib3gsIGxOdW0sIHJlc3VsdCk7Ci0gIGJvb2wgaXNDdXQgPSBmYWxzZTsKLSAgZm9yIChhdXRvICZbYm9vc3RiLCBwcl06IHJlc3VsdCkgewotICAgIGF1dG8gJltvYmosIGNvbl0gPSBwcjsKLSAgICBmckNvb3JkIHRtcE92bHAgPSAtIG1heChib3gubGVmdCgpLCAgIGJvb3N0Yi5taW5fY29ybmVyKCkueCgpKSArIG1pbihib3gucmlnaHQoKSwgIGJvb3N0Yi5tYXhfY29ybmVyKCkueCgpKSAKLSAgICAgICAgICAgICAgICAgICAgICAtIG1heChib3guYm90dG9tKCksIGJvb3N0Yi5taW5fY29ybmVyKCkueSgpKSArIG1pbihib3gudG9wKCksICAgIGJvb3N0Yi5tYXhfY29ybmVyKCkueSgpKSArIDE7Ci0gICAgaWYgKHRtcE92bHAgPD0gMCkgewotICAgICAgY291dCA8PCJFcnJvcjogYXNzaWduSXJvdXRlX2dldERSQ0Nvc3RfaGVscGVyIG92ZXJsYXAgPCAwIiA8PGVuZGw7Ci0gICAgICBleGl0KDEpOwotICAgIH0KLSAgICAvLyB1bmtub3duIG9iaiwgYWx3YXlzIGFkZCBjb3N0Ci0gICAgaWYgKG9iaiA9PSBudWxscHRyKSB7Ci0gICAgICBvdmVybGFwICs9IHRtcE92bHA7Ci0gICAgLy8gb25seSBhZGQgY29zdCBmb3IgZGlmZi1uZXQKLSAgICB9IGVsc2UgaWYgKG9iai0+dHlwZUlkKCkgPT0gZnJjTmV0KSB7Ci0gICAgICBpZiAoaXJvdXRlLT5nZXRHdWlkZSgpLT5nZXROZXQoKSAhPSBvYmopIHsKLSAgICAgICAgb3ZlcmxhcCArPSB0bXBPdmxwOwotICAgICAgfQotICAgIC8vIHR3byB0YU9ianMKLSAgICB9IGVsc2UgaWYgKG9iai0+dHlwZUlkKCkgPT0gdGFjUGF0aFNlZyB8fCBvYmotPnR5cGVJZCgpID09IHRhY1ZpYSkgewotICAgICAgYXV0byB0YU9iaiA9IHN0YXRpY19jYXN0PHRhUGluRmlnKj4ob2JqKTsKLSAgICAgIC8vIGNhbiBleGNsdWRlIHNhbWUgaXJvdXRlIG9ianMgYWxzbwotICAgICAgaWYgKHRhT2JqLT5nZXRQaW4oKSA9PSBpcm91dGUpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAoaXJvdXRlLT5nZXRHdWlkZSgpLT5nZXROZXQoKSAhPSB0YU9iai0+Z2V0UGluKCktPmdldEd1aWRlKCktPmdldE5ldCgpKSB7Ci0gICAgICAgIG92ZXJsYXAgKz0gdG1wT3ZscDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgY291dCA8PCJXYXJuaW5nOiBhc3NpZ25Jcm91dGVfZ2V0RFJDQ29zdF9oZWxwZXIgdW5zdXBwb3J0ZWQgdHlwZSIgPDxlbmRsOwotICAgIH0KLSAgfQotICBmckNvb3JkIHBpdGNoID0gMDsKLSAgaWYgKGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldExheWVyKGxOdW0pLT5nZXRUeXBlKCkgPT0gZnJMYXllclR5cGVFbnVtOjpST1VUSU5HKSB7Ci0gICAgcGl0Y2ggPSBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihsTnVtKS0+Z2V0UGl0Y2goKTsKLSAgICBpc0N1dCA9IGZhbHNlOwotICB9IGVsc2UgaWYgKGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldFRvcExheWVyTnVtKCkgPj0gbE51bSArIDEgJiYgZ2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0TGF5ZXIobE51bSArIDEpLT5nZXRUeXBlKCkgPT0gZnJMYXllclR5cGVFbnVtOjpST1VUSU5HKSB7Ci0gICAgcGl0Y2ggPSBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihsTnVtICsgMSktPmdldFBpdGNoKCk7Ci0gICAgaXNDdXQgPSB0cnVlOwotICB9IGVsc2UgaWYgKGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldEJvdHRvbUxheWVyTnVtKCkgPD0gbE51bSAtIDEgJiYgZ2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0TGF5ZXIobE51bSAtIDEpLT5nZXRUeXBlKCkgPT0gZnJMYXllclR5cGVFbnVtOjpST1VUSU5HKSB7Ci0gICAgcGl0Y2ggPSBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihsTnVtIC0gMSktPmdldFBpdGNoKCk7Ci0gICAgaXNDdXQgPSB0cnVlOwotICB9IGVsc2UgewotICAgIGNvdXQgPDwiRXJyb3I6IGFzc2lnbklyb3V0ZV9nZXREUkNDb3N0X2hlbHBlciB1bmtub3duIGxheWVyIHR5cGUiIDw8ZW5kbDsKLSAgICBleGl0KDEpOwotICB9Ci0gIC8vIGFsd2F5cyBwZW5hbGl6ZSB0d28gcGl0Y2ggcGVyIGN1dCwgcmVnYXJkbGVzcyBvZiBjbnRzCi0gIHJldHVybiAob3ZlcmxhcCA9PSAwKSA/IDAgOiAoaXNDdXQgPyBwaXRjaCAqIDI6IG1heChwaXRjaCAqIDIsIG92ZXJsYXApKTsKLX0KLQotZnJVSW50NCBGbGV4VEFXb3JrZXI6OmFzc2lnbklyb3V0ZV9nZXREUkNDb3N0KHRhUGluKiBpcm91dGUsIGZyQ29vcmQgdHJhY2tMb2MpIHsKLSAgZnJVSW50NCBjb3N0ID0gMDsKLSAgZnJQb2ludCBicCwgZXA7Ci0gIGJvb2wgaXNIID0gKGdldERpcigpID09IGZyUHJlZlJvdXRpbmdEaXJFbnVtOjpmcmNIb3J6UHJlZlJvdXRpbmdEaXIpOwotICBmb3IgKGF1dG8gJnVQaW5GaWc6IGlyb3V0ZS0+Z2V0RmlncygpKSB7Ci0gICAgaWYgKHVQaW5GaWctPnR5cGVJZCgpID09IHRhY1BhdGhTZWcpIHsKLSAgICAgIGF1dG8gb2JqID0gc3RhdGljX2Nhc3Q8dGFQYXRoU2VnKj4odVBpbkZpZy5nZXQoKSk7Ci0gICAgICBvYmotPmdldFBvaW50cyhicCwgZXApOwotICAgICAgaWYgKGlzSCkgewotICAgICAgICBicC5zZXQoYnAueCgpLCB0cmFja0xvYyk7Ci0gICAgICAgIGVwLnNldChlcC54KCksIHRyYWNrTG9jKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGJwLnNldCh0cmFja0xvYywgYnAueSgpKTsKLSAgICAgICAgZXAuc2V0KHRyYWNrTG9jLCBlcC55KCkpOwotICAgICAgfQotICAgICAgZnJVSW50NCB3aXJlQ29zdCA9IGFzc2lnbklyb3V0ZV9nZXREUkNDb3N0X2hlbHBlcihpcm91dGUsIGZyQm94KGJwLCBlcCksIG9iai0+Z2V0TGF5ZXJOdW0oKSk7Ci0gICAgICAvL2lmICghaXNJbml0VEEoKSkgewotICAgICAgLy8gIGNvdXQgPDwid2lyZUNvc3RAIiA8PHdpcmVDb3N0IDw8ZW5kbDsKLSAgICAgIC8vfQotICAgICAgY29zdCArPSB3aXJlQ29zdDsKLSAgICB9IGVsc2UgaWYgKHVQaW5GaWctPnR5cGVJZCgpID09IHRhY1ZpYSkgewotICAgICAgYXV0byBvYmogPSBzdGF0aWNfY2FzdDx0YVZpYSo+KHVQaW5GaWcuZ2V0KCkpOwotICAgICAgb2JqLT5nZXRPcmlnaW4oYnApOwotICAgICAgaWYgKGlzSCkgewotICAgICAgICBicC5zZXQoYnAueCgpLCB0cmFja0xvYyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBicC5zZXQodHJhY2tMb2MsIGJwLnkoKSk7Ci0gICAgICB9Ci0gICAgICAvL2Nvc3QgKz0gVEFWSUFDT1NUICogYXNzaWduSXJvdXRlX2dldERSQ0Nvc3RfaGVscGVyKGlyb3V0ZSwgZnJCb3goYnAsIGJwKSwgb2JqLT5nZXRWaWFEZWYoKS0+Z2V0Q3V0TGF5ZXJOdW0oKSk7Ci0gICAgICBmclVJbnQ0IHZpYUNvc3QgPSBhc3NpZ25Jcm91dGVfZ2V0RFJDQ29zdF9oZWxwZXIoaXJvdXRlLCBmckJveChicCwgYnApLCBvYmotPmdldFZpYURlZigpLT5nZXRDdXRMYXllck51bSgpKTsKLSAgICAgIC8vaWYgKCFpc0luaXRUQSgpKSB7Ci0gICAgICAvLyAgY291dCA8PCJ2aWFDb3N0QCIgPDx2aWFDb3N0IDw8ZW5kbDsKLSAgICAgIC8vfQotICAgICAgY29zdCArPSB2aWFDb3N0OwotICAgIH0gZWxzZSB7Ci0gICAgICBjb3V0IDw8IkVycm9yOiBhc3NpZ25Jcm91dGVfdXBkYXRlSXJvdXRlIHVuc3VwcG9ydGVkIHBpbkZpZyIgPDxlbmRsOwotICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGNvc3Q7Ci19Ci0KLWZyVUludDQgRmxleFRBV29ya2VyOjphc3NpZ25Jcm91dGVfZ2V0QWxpZ25Db3N0KHRhUGluKiBpcm91dGUsIGZyQ29vcmQgdHJhY2tMb2MpIHsKLSAgZnJVSW50NCBzb2wgPSAwOwotICBmckNvb3JkIHBpdGNoID0gMDsKLSAgYm9vbCBpc0ggPSAoZ2V0RGlyKCkgPT0gZnJQcmVmUm91dGluZ0RpckVudW06OmZyY0hvcnpQcmVmUm91dGluZ0Rpcik7Ci0gIGZvciAoYXV0byAmdVBpbkZpZzogaXJvdXRlLT5nZXRGaWdzKCkpIHsKLSAgICBpZiAodVBpbkZpZy0+dHlwZUlkKCkgPT0gdGFjUGF0aFNlZykgewotICAgICAgYXV0byBvYmo9ICBzdGF0aWNfY2FzdDx0YVBhdGhTZWcqPih1UGluRmlnLmdldCgpKTsKLSAgICAgIGZyUG9pbnQgYnAsIGVwOwotICAgICAgb2JqLT5nZXRQb2ludHMoYnAsIGVwKTsKLSAgICAgIGF1dG8gbE51bSA9IG9iai0+Z2V0TGF5ZXJOdW0oKTsKLSAgICAgIHBpdGNoID0gZ2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0TGF5ZXIobE51bSktPmdldFBpdGNoKCk7Ci0gICAgICBhdXRvICZ3b3JrZXJSZWdpb25RdWVyeSA9IGdldFdvcmtlclJlZ2lvblF1ZXJ5KCk7Ci0gICAgICBzZXQ8dGFQaW4qLCBmckJsb2NrT2JqZWN0Q29tcD4gcmVzdWx0OwotICAgICAgZnJCb3ggYm94OwotICAgICAgaWYgKGlzSCkgewotICAgICAgICBib3guc2V0KGJwLngoKSwgdHJhY2tMb2MsIGVwLngoKSwgdHJhY2tMb2MpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYm94LnNldCh0cmFja0xvYywgYnAueSgpLCB0cmFja0xvYywgZXAueSgpKTsKLSAgICAgIH0KLSAgICAgIHdvcmtlclJlZ2lvblF1ZXJ5LnF1ZXJ5KGJveCwgbE51bSwgcmVzdWx0KTsKLSAgICAgIGZvciAoYXV0byAmaXJvdXRlMjogcmVzdWx0KSB7Ci0gICAgICAgIGlmIChpcm91dGUyLT5nZXRHdWlkZSgpLT5nZXROZXQoKSA9PSBpcm91dGUtPmdldEd1aWRlKCktPmdldE5ldCgpKSB7Ci0gICAgICAgICAgc29sID0gMTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBpZiAoc29sID09IDEpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICByZXR1cm4gcGl0Y2ggKiBzb2w7Ci19Ci0KLWZyVUludDQgRmxleFRBV29ya2VyOjphc3NpZ25Jcm91dGVfZ2V0Q29zdCh0YVBpbiogaXJvdXRlLCBmckNvb3JkIHRyYWNrTG9jLCBmclVJbnQ0ICZvdXREcmNDb3N0KSB7Ci0gIC8vYm9vbCBlbmFibGVPdXRwdXQgPSB0cnVlOwotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICBvdXREcmNDb3N0ICAgICA9IGFzc2lnbklyb3V0ZV9nZXREUkNDb3N0KGlyb3V0ZSwgdHJhY2tMb2MpOwotICBpbnQgZHJjQ29zdCAgICA9IFRBRFJDQ09TVCAqIG91dERyY0Nvc3Q7Ci0gIGludCB3bGVuQ29zdCAgID0gYXNzaWduSXJvdXRlX2dldFdsZW5Db3N0KGlyb3V0ZSwgdHJhY2tMb2MpOwotICBpbnQgcGluQ29zdCAgICA9IFRBUElOQ09TVCAqIGFzc2lnbklyb3V0ZV9nZXRQaW5Db3N0KGlyb3V0ZSwgdHJhY2tMb2MpOwotICBpbnQgYWxpZ25Db3N0ICA9IFRBQUxJR05DT1NUICogYXNzaWduSXJvdXRlX2dldEFsaWduQ29zdChpcm91dGUsIHRyYWNrTG9jKTsKLSAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgIGNvdXQgPDwiICAgIGRyYy93bGVuL3Bpbi9hbGlnbiBjb3N0ID0gIiA8PGRyY0Nvc3QgPDwiLyIgPDx3bGVuQ29zdCA8PCIvIiA8PHBpbkNvc3QgPDwiLyIgPDxhbGlnbkNvc3QgPDxlbmRsOwotICB9Ci0gIHJldHVybiBtYXgoZHJjQ29zdCArIHdsZW5Db3N0ICsgcGluQ29zdCAtIGFsaWduQ29zdCwgMCk7Ci19Ci0KLXZvaWQgRmxleFRBV29ya2VyOjphc3NpZ25Jcm91dGVfYmVzdFRyYWNrX2hlbHBlcih0YVBpbiogaXJvdXRlLCBmckxheWVyTnVtIGxOdW0sIGludCB0cmFja0lkeCwgZnJVSW50NCAmYmVzdENvc3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyQ29vcmQgJmJlc3RUcmFja0xvYywgaW50ICZiZXN0VHJhY2tJZHgsIGZyVUludDQgJmRyY0Nvc3QpIHsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIGRvdWJsZSBkYnUgPSBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0REJVUGVyVVUoKTsKLSAgYXV0byB0cmFja0xvYyA9IGdldFRyYWNrTG9jcyhsTnVtKVt0cmFja0lkeF07Ci0gIGF1dG8gY3VyckNvc3QgPSBhc3NpZ25Jcm91dGVfZ2V0Q29zdChpcm91dGUsIHRyYWNrTG9jLCBkcmNDb3N0KTsKLSAgaWYgKGlzSW5pdFRBKCkpIHsKLSAgICBpZiAoY3VyckNvc3QgPCBiZXN0Q29zdCkgewotICAgICAgYmVzdENvc3QgPSBjdXJyQ29zdDsKLSAgICAgIGJlc3RUcmFja0xvYyA9IHRyYWNrTG9jOwotICAgICAgYmVzdFRyYWNrSWR4ID0gdHJhY2tJZHg7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChkcmNDb3N0IDwgYmVzdENvc3QpIHsKLSAgICAgIGJlc3RDb3N0ID0gZHJjQ29zdDsKLSAgICAgIGJlc3RUcmFja0xvYyA9IHRyYWNrTG9jOwotICAgICAgYmVzdFRyYWNrSWR4ID0gdHJhY2tJZHg7Ci0gICAgfQotICB9Ci0gIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICBjb3V0IDw8IiAgdHJ5IHRyYWNrQCIgPDx0cmFja0xvYyAvIGRidSA8PCIsIGNvc3QvZHJjPSIgPDxjdXJyQ29zdCA8PCIvIiA8PGRyY0Nvc3QgPDxlbmRsOwotICB9Ci19Ci0KLWludCBGbGV4VEFXb3JrZXI6OmFzc2lnbklyb3V0ZV9iZXN0VHJhY2sodGFQaW4qIGlyb3V0ZSwgZnJMYXllck51bSBsTnVtLCBpbnQgaWR4MSwgaW50IGlkeDIpIHsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIGRvdWJsZSAgZGJ1ID0gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCk7Ci0gIGZyQ29vcmQgYmVzdFRyYWNrTG9jID0gMDsKLSAgaW50ICAgICBiZXN0VHJhY2tJZHggPSAtMTsKLSAgZnJVSW50NCBiZXN0Q29zdCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZnJVSW50ND46Om1heCgpOwotICBmclVJbnQ0IGRyY0Nvc3QgPSAwOwotICAvL3doaWxlICgxKSB7Ci0gIC8vIGlmIHdsZW4yLCB0aGVuIHRyeSBmcm9tICB3bGVuMgotICAvLyBlbHNlIHRyeSBmcm9tIHdsZW4xIGRpcgotICBpZiAoaXJvdXRlLT5oYXNXbGVuSGVscGVyMigpKSB7Ci0gICAgZnJDb29yZCB3bGVuMmNvb3JkID0gaXJvdXRlLT5nZXRXbGVuSGVscGVyMigpOwotICAgIGlmIChpcm91dGUtPmdldFdsZW5IZWxwZXIoKSA+IDApIHsKLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgdXNlIHdsZW4yQCIgPDx3bGVuMmNvb3JkIC8gZGJ1IDw8Iiwgd2xlbkAiIDw8aXJvdXRlLT5nZXRXbGVuSGVscGVyKCkgPDxlbmRsOwotICAgICAgfQotICAgICAgaW50IHN0YXJ0VHJhY2tJZHggPSBpbnQoc3RkOjpsb3dlcl9ib3VuZCh0cmFja0xvY3NbbE51bV0uYmVnaW4oKSwgdHJhY2tMb2NzW2xOdW1dLmVuZCgpLCB3bGVuMmNvb3JkKSAtIHRyYWNrTG9jc1tsTnVtXS5iZWdpbigpKTsKLSAgICAgIHN0YXJ0VHJhY2tJZHggPSBtaW4oc3RhcnRUcmFja0lkeCwgaWR4Mik7Ci0gICAgICBzdGFydFRyYWNrSWR4ID0gbWF4KHN0YXJ0VHJhY2tJZHgsIGlkeDEpOwotICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0VHJhY2tJZHg7IGkgPD0gaWR4MjsgaSsrKSB7Ci0gICAgICAgIGFzc2lnbklyb3V0ZV9iZXN0VHJhY2tfaGVscGVyKGlyb3V0ZSwgbE51bSwgaSwgYmVzdENvc3QsIGJlc3RUcmFja0xvYywgYmVzdFRyYWNrSWR4LCBkcmNDb3N0KTsKLSAgICAgICAgaWYgKCFkcmNDb3N0KSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChkcmNDb3N0KSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSBzdGFydFRyYWNrSWR4IC0gMTsgaSA+PSBpZHgxOyBpLS0pIHsKLSAgICAgICAgICBhc3NpZ25Jcm91dGVfYmVzdFRyYWNrX2hlbHBlcihpcm91dGUsIGxOdW0sIGksIGJlc3RDb3N0LCBiZXN0VHJhY2tMb2MsIGJlc3RUcmFja0lkeCwgZHJjQ29zdCk7Ci0gICAgICAgICAgaWYgKCFkcmNDb3N0KSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGlyb3V0ZS0+Z2V0V2xlbkhlbHBlcigpID09IDApIHsKLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgdXNlIHdsZW4yQCIgPDx3bGVuMmNvb3JkIC8gZGJ1IDw8Iiwgd2xlbkAiIDw8aXJvdXRlLT5nZXRXbGVuSGVscGVyKCkgPDxlbmRsOwotICAgICAgfQotICAgICAgaW50IHN0YXJ0VHJhY2tJZHggPSBpbnQoc3RkOjpsb3dlcl9ib3VuZCh0cmFja0xvY3NbbE51bV0uYmVnaW4oKSwgdHJhY2tMb2NzW2xOdW1dLmVuZCgpLCB3bGVuMmNvb3JkKSAtIHRyYWNrTG9jc1tsTnVtXS5iZWdpbigpKTsKLSAgICAgIHN0YXJ0VHJhY2tJZHggPSBtaW4oc3RhcnRUcmFja0lkeCwgaWR4Mik7Ci0gICAgICBzdGFydFRyYWNrSWR4ID0gbWF4KHN0YXJ0VHJhY2tJZHgsIGlkeDEpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpZHgyIC0gaWR4MTsgaSsrKSB7Ci0gICAgICAgIGludCBjdXJyVHJhY2tJZHggPSBzdGFydFRyYWNrSWR4ICsgaTsKLSAgICAgICAgaWYgKGN1cnJUcmFja0lkeCA+PSBpZHgxICYmIGN1cnJUcmFja0lkeCA8PSBpZHgyKSB7Ci0gICAgICAgICAgYXNzaWduSXJvdXRlX2Jlc3RUcmFja19oZWxwZXIoaXJvdXRlLCBsTnVtLCBjdXJyVHJhY2tJZHgsIGJlc3RDb3N0LCBiZXN0VHJhY2tMb2MsIGJlc3RUcmFja0lkeCwgZHJjQ29zdCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFkcmNDb3N0KSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY3VyclRyYWNrSWR4ID0gc3RhcnRUcmFja0lkeCAtIGkgLSAxOwotICAgICAgICBpZiAoY3VyclRyYWNrSWR4ID49IGlkeDEgJiYgY3VyclRyYWNrSWR4IDw9IGlkeDIpIHsKLSAgICAgICAgICBhc3NpZ25Jcm91dGVfYmVzdFRyYWNrX2hlbHBlcihpcm91dGUsIGxOdW0sIGN1cnJUcmFja0lkeCwgYmVzdENvc3QsIGJlc3RUcmFja0xvYywgYmVzdFRyYWNrSWR4LCBkcmNDb3N0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWRyY0Nvc3QpIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiIHVzZSB3bGVuMkAiIDw8d2xlbjJjb29yZCAvIGRidSA8PCIsIHdsZW5AIiA8PGlyb3V0ZS0+Z2V0V2xlbkhlbHBlcigpIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIGludCBzdGFydFRyYWNrSWR4ID0gaW50KHN0ZDo6bG93ZXJfYm91bmQodHJhY2tMb2NzW2xOdW1dLmJlZ2luKCksIHRyYWNrTG9jc1tsTnVtXS5lbmQoKSwgd2xlbjJjb29yZCkgLSB0cmFja0xvY3NbbE51bV0uYmVnaW4oKSk7Ci0gICAgICBzdGFydFRyYWNrSWR4ID0gbWluKHN0YXJ0VHJhY2tJZHgsIGlkeDIpOwotICAgICAgc3RhcnRUcmFja0lkeCA9IG1heChzdGFydFRyYWNrSWR4LCBpZHgxKTsKLSAgICAgIGZvciAoaW50IGkgPSBzdGFydFRyYWNrSWR4OyBpID49IGlkeDE7IGktLSkgewotICAgICAgICBhc3NpZ25Jcm91dGVfYmVzdFRyYWNrX2hlbHBlcihpcm91dGUsIGxOdW0sIGksIGJlc3RDb3N0LCBiZXN0VHJhY2tMb2MsIGJlc3RUcmFja0lkeCwgZHJjQ29zdCk7Ci0gICAgICAgIGlmICghZHJjQ29zdCkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZHJjQ29zdCkgewotICAgICAgICBmb3IgKGludCBpID0gc3RhcnRUcmFja0lkeCArIDE7IGkgPD0gaWR4MjsgaSsrKSB7Ci0gICAgICAgICAgYXNzaWduSXJvdXRlX2Jlc3RUcmFja19oZWxwZXIoaXJvdXRlLCBsTnVtLCBpLCBiZXN0Q29zdCwgYmVzdFRyYWNrTG9jLCBiZXN0VHJhY2tJZHgsIGRyY0Nvc3QpOwotICAgICAgICAgIGlmICghZHJjQ29zdCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChpcm91dGUtPmdldFdsZW5IZWxwZXIoKSA+IDApIHsKLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgdXNlIHdsZW5AIiA8PGlyb3V0ZS0+Z2V0V2xlbkhlbHBlcigpIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIGZvciAoaW50IGkgPSBpZHgyOyBpID49IGlkeDE7IGktLSkgewotICAgICAgICBhc3NpZ25Jcm91dGVfYmVzdFRyYWNrX2hlbHBlcihpcm91dGUsIGxOdW0sIGksIGJlc3RDb3N0LCBiZXN0VHJhY2tMb2MsIGJlc3RUcmFja0lkeCwgZHJjQ29zdCk7Ci0gICAgICAgIGlmICghZHJjQ29zdCkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChpcm91dGUtPmdldFdsZW5IZWxwZXIoKSA9PSAwKSB7Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiIHVzZSB3bGVuQCIgPDxpcm91dGUtPmdldFdsZW5IZWxwZXIoKSA8PGVuZGw7Ci0gICAgICB9Ci0gICAgICBmb3IgKGludCBpID0gKGlkeDEgKyBpZHgyKSAvIDI7IGkgPD0gaWR4MjsgaSsrKSB7Ci0gICAgICAgIGFzc2lnbklyb3V0ZV9iZXN0VHJhY2tfaGVscGVyKGlyb3V0ZSwgbE51bSwgaSwgYmVzdENvc3QsIGJlc3RUcmFja0xvYywgYmVzdFRyYWNrSWR4LCBkcmNDb3N0KTsKLSAgICAgICAgaWYgKCFkcmNDb3N0KSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChkcmNDb3N0KSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAoaWR4MSArIGlkeDIpIC8gMiAtIDE7IGkgPj0gaWR4MTsgaS0tKSB7Ci0gICAgICAgICAgYXNzaWduSXJvdXRlX2Jlc3RUcmFja19oZWxwZXIoaXJvdXRlLCBsTnVtLCBpLCBiZXN0Q29zdCwgYmVzdFRyYWNrTG9jLCBiZXN0VHJhY2tJZHgsIGRyY0Nvc3QpOwotICAgICAgICAgIGlmICghZHJjQ29zdCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgY291dCA8PCIgdXNlIHdsZW5AIiA8PGlyb3V0ZS0+Z2V0V2xlbkhlbHBlcigpIDw8ZW5kbDsKLSAgICAgIH0KLSAgICAgIGZvciAoaW50IGkgPSBpZHgxOyBpIDw9IGlkeDI7IGkrKykgewotICAgICAgICBhc3NpZ25Jcm91dGVfYmVzdFRyYWNrX2hlbHBlcihpcm91dGUsIGxOdW0sIGksIGJlc3RDb3N0LCBiZXN0VHJhY2tMb2MsIGJlc3RUcmFja0lkeCwgZHJjQ29zdCk7Ci0gICAgICAgIGlmICghZHJjQ29zdCkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGlmIChiZXN0VHJhY2tJZHggPT0gLTEpIHsKLSAgICBjb3V0IDw8IkVycm9yOiBhc3NpZ25Jcm91dGVfYmVzdFRyYWNrIHNlbGVjdCBubyB0cmFjayIgPDxlbmRsOwotICAgIGV4aXQoMSk7Ci0gIH0KLSAgaWYgKGVuYWJsZU91dHB1dCkgewotICAvL2lmICh0cnVlKSB7Ci0gICAgY291dCA8PCIgIHNlbGVjdCB0cmFja0AiIDw8YmVzdFRyYWNrTG9jIC8gZGJ1IDw8IiwgY29zdD0iIDw8YmVzdENvc3QgPDxlbmRsOwotICB9Ci0gIC8vdG90Q29zdCAgICAtPSBpcm91dGUtPmdldENvc3QoKTsKLSAgLy90b3REcmNDb3N0IC09IGlyb3V0ZS0+Z2V0RHJjQ29zdCgpOwotICB0b3RDb3N0ICAgICs9IGRyY0Nvc3Q7Ci0gIGlyb3V0ZS0+c2V0Q29zdChkcmNDb3N0KTsKLSAgLy90b3REcmNDb3N0ICs9IGRyY0Nvc3Q7Ci0gIHJldHVybiBiZXN0VHJhY2tMb2M7Ci19Ci0gIAotdm9pZCBGbGV4VEFXb3JrZXI6OmFzc2lnbklyb3V0ZV91cGRhdGVJcm91dGUodGFQaW4qIGlyb3V0ZSwgZnJDb29yZCBiZXN0VHJhY2tMb2MsIHNldDx0YVBpbiosIGZyQmxvY2tPYmplY3RDb21wPiAqcGluUykgewotICBhdXRvICZ3b3JrZXJSZWdpb25RdWVyeSA9IGdldFdvcmtlclJlZ2lvblF1ZXJ5KCk7Ci0gIGJvb2wgaXNIID0gKGdldERpcigpID09IGZyUHJlZlJvdXRpbmdEaXJFbnVtOjpmcmNIb3J6UHJlZlJvdXRpbmdEaXIpOwotICBmclBvaW50IGJwLCBlcDsKLQotICAvLyB1cGRhdGUgY29vcmQKLSAgZm9yIChhdXRvICZ1UGluRmlnOiBpcm91dGUtPmdldEZpZ3MoKSkgewotICAgIGlmICh1UGluRmlnLT50eXBlSWQoKSA9PSB0YWNQYXRoU2VnKSB7Ci0gICAgICBhdXRvIG9iaiA9IHN0YXRpY19jYXN0PHRhUGF0aFNlZyo+KHVQaW5GaWcuZ2V0KCkpOwotICAgICAgb2JqLT5nZXRQb2ludHMoYnAsIGVwKTsKLSAgICAgIGlmIChpc0gpIHsKLSAgICAgICAgYnAuc2V0KGJwLngoKSwgYmVzdFRyYWNrTG9jKTsKLSAgICAgICAgZXAuc2V0KGVwLngoKSwgYmVzdFRyYWNrTG9jKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGJwLnNldChiZXN0VHJhY2tMb2MsIGJwLnkoKSk7Ci0gICAgICAgIGVwLnNldChiZXN0VHJhY2tMb2MsIGVwLnkoKSk7Ci0gICAgICB9Ci0gICAgICBvYmotPnNldFBvaW50cyhicCwgZXApOwotICAgIH0gZWxzZSBpZiAodVBpbkZpZy0+dHlwZUlkKCkgPT0gdGFjVmlhKSB7Ci0gICAgICBhdXRvIG9iaiA9IHN0YXRpY19jYXN0PHRhVmlhKj4odVBpbkZpZy5nZXQoKSk7Ci0gICAgICBvYmotPmdldE9yaWdpbihicCk7Ci0gICAgICBpZiAoaXNIKSB7Ci0gICAgICAgIGJwLnNldChicC54KCksIGJlc3RUcmFja0xvYyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBicC5zZXQoYmVzdFRyYWNrTG9jLCBicC55KCkpOwotICAgICAgfQotICAgICAgb2JqLT5zZXRPcmlnaW4oYnApOwotICAgIH0gZWxzZSB7Ci0gICAgICBjb3V0IDw8IkVycm9yOiBhc3NpZ25Jcm91dGVfdXBkYXRlSXJvdXRlIHVuc3VwcG9ydGVkIHBpbkZpZyIgPDxlbmRsOwotICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gIH0KLSAgLy8gYWRkQ29zdAotICBmb3IgKGF1dG8gJnVQaW5GaWc6IGlyb3V0ZS0+Z2V0RmlncygpKSB7Ci0gICAgYWRkQ29zdCh1UGluRmlnLmdldCgpLCBpc0luaXRUQSgpID8gbnVsbHB0ciA6IHBpblMpOwotICAgIHdvcmtlclJlZ2lvblF1ZXJ5LmFkZCh1UGluRmlnLmdldCgpKTsKLSAgfQotICBpcm91dGUtPmFkZE51bUFzc2lnbmVkKCk7Ci19Ci0KLXZvaWQgRmxleFRBV29ya2VyOjphc3NpZ25Jcm91dGVfaW5pdCh0YVBpbiogaXJvdXRlLCBzZXQ8dGFQaW4qLCBmckJsb2NrT2JqZWN0Q29tcD4gKnBpblMpIHsKLSAgYXV0byAmd29ya2VyUmVnaW9uUXVlcnkgPSBnZXRXb3JrZXJSZWdpb25RdWVyeSgpOwotICAvLyBzdWJDb3N0Ci0gIGlmICghaXNJbml0VEEoKSkgewotICAgIGZvciAoYXV0byAmdVBpbkZpZzogaXJvdXRlLT5nZXRGaWdzKCkpIHsKLSAgICAgIHdvcmtlclJlZ2lvblF1ZXJ5LnJlbW92ZSh1UGluRmlnLmdldCgpKTsKLSAgICAgIHN1YkNvc3QodVBpbkZpZy5nZXQoKSwgcGluUyk7Ci0gICAgfQotICAgIHRvdENvc3QgICAgLT0gaXJvdXRlLT5nZXRDb3N0KCk7Ci0gICAgLy90b3REcmNDb3N0IC09IGlyb3V0ZS0+Z2V0RHJjQ29zdCgpOwotICB9Ci19Ci0KLXZvaWQgRmxleFRBV29ya2VyOjphc3NpZ25Jcm91dGVfdXBkYXRlT3RoZXJzKHNldDx0YVBpbiosIGZyQmxvY2tPYmplY3RDb21wPiAmcGluUykgewotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLSAgYm9vbCBpc0ggPSAoZ2V0RGlyKCkgPT0gZnJQcmVmUm91dGluZ0RpckVudW06OmZyY0hvcnpQcmVmUm91dGluZ0Rpcik7Ci0gIGZyUG9pbnQgYnAsIGVwOwotICBpZiAoaXNJbml0VEEoKSkgewotICAgIHJldHVybjsKLSAgfQotICBmb3IgKGF1dG8gJmlyb3V0ZTogcGluUykgewotICAgIHJlbW92ZUZyb21SZWFzc2lnbklyb3V0ZXMoaXJvdXRlKTsKLSAgICAvLyByZWNhbGN1bGF0ZSBjb3N0Ci0gICAgZnJVSW50NCBkcmNDb3N0ID0gMDsKLSAgICBmckNvb3JkIHRyYWNrTG9jID0gc3RkOjpudW1lcmljX2xpbWl0czxmckNvb3JkPjo6bWF4KCk7Ci0gICAgZm9yIChhdXRvICZ1UGluRmlnOiBpcm91dGUtPmdldEZpZ3MoKSkgewotICAgICAgaWYgKHVQaW5GaWctPnR5cGVJZCgpID09IHRhY1BhdGhTZWcpIHsKLSAgICAgICAgc3RhdGljX2Nhc3Q8dGFQYXRoU2VnKj4odVBpbkZpZy5nZXQoKSktPmdldFBvaW50cyhicCwgZXApOwotICAgICAgICBpZiAoaXNIKSB7Ci0gICAgICAgICAgdHJhY2tMb2MgPSBicC55KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdHJhY2tMb2MgPSBicC54KCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICh0cmFja0xvYyA9PSBzdGQ6Om51bWVyaWNfbGltaXRzPGZyQ29vcmQ+OjptYXgoKSkgewotICAgICAgY291dCA8PCJFcnJvcjogRmxleFRBV29ya2VyOjphc3NpZ25Jcm91dGVfdXBkYXRlT3RoZXJzIGRvZXMgbm90IGZpbmQgdHJhY2tMb2MiIDw8ZW5kbDsKLSAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAgIHRvdENvc3QgICAgLT0gaXJvdXRlLT5nZXRDb3N0KCk7Ci0gICAgLy90b3REcmNDb3N0IC09IGlyb3V0ZS0+Z2V0RHJjQ29zdCgpOwotICAgIC8vYXV0byB0bXBDb3N0ID0gYXNzaWduSXJvdXRlX2dldENvc3QoaXJvdXRlLCB0cmFja0xvYywgZHJjQ29zdCk7Ci0gICAgYXNzaWduSXJvdXRlX2dldENvc3QoaXJvdXRlLCB0cmFja0xvYywgZHJjQ29zdCk7Ci0gICAgaXJvdXRlLT5zZXRDb3N0KGRyY0Nvc3QpOwotICAgIC8vaXJvdXRlLT5zZXRDb3N0KHRtcENvc3QpOwotICAgIC8vaXJvdXRlLT5zZXREcmNDb3N0KGRyY0Nvc3QpOwotICAgIC8vdG90Q29zdCAgICArPSBpcm91dGUtPmdldENvc3QoKTsKLSAgICAvL3RvdERyY0Nvc3QgKz0gaXJvdXRlLT5nZXREcmNDb3N0KCk7Ci0gICAgdG90Q29zdCAgICArPSBpcm91dGUtPmdldENvc3QoKTsKLSAgICBpZiAoZHJjQ29zdCAmJiBpcm91dGUtPmdldE51bUFzc2lnbmVkKCkgPCBtYXhSZXRyeSkgewotICAgICAgYWRkVG9SZWFzc2lnbklyb3V0ZXMoaXJvdXRlKTsKLSAgICB9Ci0gIH0KLSAgaWYgKGVuYWJsZU91dHB1dCAmJiBwaW5TLnNpemUoKSkgewotICAgIGNvdXQgPDwidXBkYXRlZCAiIDw8cGluUy5zaXplKCkgPDwiIGlyb3V0ZXMiIDw8ZW5kbDsKLSAgfQotfQotCi12b2lkIEZsZXhUQVdvcmtlcjo6YXNzaWduSXJvdXRlKHRhUGluKiBpcm91dGUpIHsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICBib29sICAgaXNIID0gKGdldERpcigpID09IGZyUHJlZlJvdXRpbmdEaXJFbnVtOjpmcmNIb3J6UHJlZlJvdXRpbmdEaXIpOwotICAgIGRvdWJsZSBkYnUgPSBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0REJVUGVyVVUoKTsKLSAgICBmclBvaW50IGJwLCBlcDsKLSAgICBmckNvb3JkIGJjLCBlYywgdHJhY2tMb2M7Ci0gICAgY291dCA8PCJhc3NpZ25pbmcgIiA8PGlyb3V0ZS0+Z2V0SWQoKSA8PCIgIiA8PGlyb3V0ZS0+Z2V0R3VpZGUoKS0+Z2V0TmV0KCktPmdldE5hbWUoKTsKLSAgICBhdXRvIGd1aWRlTE51bSA9IGlyb3V0ZS0+Z2V0R3VpZGUoKS0+Z2V0QmVnaW5MYXllck51bSgpOwotICAgIGZvciAoYXV0byAmdVBpbkZpZzogaXJvdXRlLT5nZXRGaWdzKCkpIHsKLSAgICAgIGlmICh1UGluRmlnLT50eXBlSWQoKSA9PSB0YWNQYXRoU2VnKSB7Ci0gICAgICAgIGF1dG8gb2JqID0gc3RhdGljX2Nhc3Q8dGFQYXRoU2VnKj4odVBpbkZpZy5nZXQoKSk7Ci0gICAgICAgIG9iai0+Z2V0UG9pbnRzKGJwLCBlcCk7Ci0gICAgICAgIGJjID0gaXNIID8gYnAueCgpIDogYnAueSgpOwotICAgICAgICBlYyA9IGlzSCA/IGVwLngoKSA6IGVwLnkoKTsKLSAgICAgICAgdHJhY2tMb2MgPSBpc0ggPyBicC55KCkgOiBicC54KCk7Ci0gICAgICAgIGNvdXQgPDwiICgiIDw8YmMgLyBkYnUgPDwiLS0+IiA8PGVjIC8gZGJ1IDw8IiksIGxlbkAiIDw8KGVjIC0gYmMpIC8gZGJ1IDw8IiwgdHJhY2tAIiA8PHRyYWNrTG9jIC8gZGJ1Ci0gICAgICAgICAgICAgPDwiLCAiIDw8Z2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0TGF5ZXIoaXJvdXRlLT5nZXRHdWlkZSgpLT5nZXRCZWdpbkxheWVyTnVtKCkpLT5nZXROYW1lKCk7Ci0gICAgICB9IGVsc2UgaWYgKHVQaW5GaWctPnR5cGVJZCgpID09IHRhY1ZpYSkgewotICAgICAgICBhdXRvIG9iaiA9IHN0YXRpY19jYXN0PHRhVmlhKj4odVBpbkZpZy5nZXQoKSk7Ci0gICAgICAgIGF1dG8gY3V0TE51bSA9IG9iai0+Z2V0VmlhRGVmKCktPmdldEN1dExheWVyTnVtKCk7Ci0gICAgICAgIG9iai0+Z2V0T3JpZ2luKGJwKTsKLSAgICAgICAgYmMgPSBpc0ggPyBicC54KCkgOiBicC55KCk7Ci0gICAgICAgIGNvdXQgPDxzdHJpbmcoKGN1dExOdW0gPiBndWlkZUxOdW0pID8gIiwgVUAiIDogIiwgREAiKSA8PGJjIC8gZGJ1OwotICAgICAgfQotICAgIH0KLSAgICBjb3V0IDw8Iiwgd2xlbl9oQCIgPDxpcm91dGUtPmdldFdsZW5IZWxwZXIoKSA8PCIsIGNvc3RAIiA8PGlyb3V0ZS0+Z2V0Q29zdCgpIDw8ZW5kbDsKLSAgfQotCi0gIHNldDx0YVBpbiosIGZyQmxvY2tPYmplY3RDb21wPiBwaW5TOwotICBhc3NpZ25Jcm91dGVfaW5pdChpcm91dGUsICZwaW5TKTsKLSAgZnJMYXllck51bSBsTnVtOwotICBpbnQgaWR4MSwgaWR4MjsKLSAgYXNzaWduSXJvdXRlX2F2YWlsVHJhY2tzKGlyb3V0ZSwgbE51bSwgaWR4MSwgaWR4Mik7Ci0gIGF1dG8gYmVzdFRyYWNrTG9jID0gYXNzaWduSXJvdXRlX2Jlc3RUcmFjayhpcm91dGUsIGxOdW0sIGlkeDEsIGlkeDIpOwotCi0gIGFzc2lnbklyb3V0ZV91cGRhdGVJcm91dGUoaXJvdXRlLCBiZXN0VHJhY2tMb2MsICZwaW5TKTsKLSAgYXNzaWduSXJvdXRlX3VwZGF0ZU90aGVycyhwaW5TKTsKLX0KLQotdm9pZCBGbGV4VEFXb3JrZXI6OmFzc2lnbigpIHsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIGlmIChnZXRUQUl0ZXIoKSA9PSAtMSkgewotICAgIHJldHVybjsKLSAgfQotICAvL2lmIChpc0luaXRUQSgpKSB7Ci0gICAgaW50IG1heEJ1ZmZlclNpemUgPSAyMDsKLSAgICB2ZWN0b3I8dGFQaW4qPiBidWZmZXJzKG1heEJ1ZmZlclNpemUsIG51bGxwdHIpOwotICAgIGludCBjdXJyQnVmZmVySWR4ID0gMDsKLSAgICBhdXRvIGlyb3V0ZSA9IHBvcEZyb21SZWFzc2lnbklyb3V0ZXMoKTsKLSAgICB3aGlsZSAoaXJvdXRlICE9IG51bGxwdHIpIHsKLSAgICAgIGF1dG8gaXQgPSBmaW5kKGJ1ZmZlcnMuYmVnaW4oKSwgYnVmZmVycy5lbmQoKSwgaXJvdXRlKTsKLSAgICAgIC8vIGluIHRoZSBidWZmZXIsIHNraXAKLSAgICAgIGlmIChpdCAhPSBidWZmZXJzLmVuZCgpIHx8IGlyb3V0ZS0+Z2V0TnVtQXNzaWduZWQoKSA+PSBtYXhSZXRyeSkgewotICAgICAgICA7Ci0gICAgICAvLyBub3QgaW4gdGhlIGJ1ZmZlciwgcmUtYXNzaWduCi0gICAgICB9IGVsc2UgewotICAgICAgICBhc3NpZ25Jcm91dGUoaXJvdXRlKTsKLSAgICAgICAgLy8gcmUgYWRkIGxhc3QgYnVmZmVyIGl0ZW0gdG8gcmVhc3NpZ25pcm91dGVzIGlmIGRyY2Nvc3QgPiAwCi0gICAgICAgIC8vaWYgKGJ1ZmZlcnNbY3VyckJ1ZmZlcklkeF0pIHsKLSAgICAgICAgLy8gIGlmIChidWZmZXJzW2N1cnJCdWZmZXJJZHhdLT5nZXREcmNDb3N0KCkpIHsKLSAgICAgICAgLy8gICAgYWRkVG9SZWFzc2lnbklyb3V0ZXMoYnVmZmVyc1tjdXJyQnVmZmVySWR4XSk7Ci0gICAgICAgIC8vICB9Ci0gICAgICAgIC8vfQotICAgICAgICBidWZmZXJzW2N1cnJCdWZmZXJJZHhdID0gaXJvdXRlOwotICAgICAgICBjdXJyQnVmZmVySWR4ID0gKGN1cnJCdWZmZXJJZHggKyAxKSAlIG1heEJ1ZmZlclNpemU7Ci0gICAgICAgIGlmIChlbmFibGVPdXRwdXQgJiYgIWlzSW5pdFRBKCkpIHsKLSAgICAgICAgICAvL2NvdXQgPDwidG90Q29zdEAiIDw8dG90Q29zdCA8PCIvIiA8PHRvdERyY0Nvc3QgPDxlbmRsOwotICAgICAgICAgIGNvdXQgPDwidG90Q29zdEAiIDw8dG90Q29zdCA8PGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgbnVtQXNzaWduZWQrKzsKLSAgICAgIH0KLSAgICAgIGlyb3V0ZSA9IHBvcEZyb21SZWFzc2lnbklyb3V0ZXMoKTsKLSAgICB9Ci0gIC8vfQotfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvdGEvRmxleFRBX2VuZC5jcHAgYi9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy90YS9GbGV4VEFfZW5kLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MwYzRkMi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy90YS9GbGV4VEFfZW5kLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qIEF1dGhvcnM6IEx1dG9uZyBXYW5nIGFuZCBCYW5ncWkgWHUgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTksIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJ0YS9GbGV4VEEuaCIKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBmcjsKLQotdm9pZCBGbGV4VEFXb3JrZXI6OnNhdmVUb0d1aWRlcygpIHsKLSAgZm9yIChhdXRvICZpcm91dGU6IGlyb3V0ZXMpIHsKLSAgICBmb3IgKGF1dG8gJnVQaW5GaWc6IGlyb3V0ZS0+Z2V0RmlncygpKSB7Ci0gICAgICBpZiAodVBpbkZpZy0+dHlwZUlkKCkgPT0gdGFjUGF0aFNlZykgewotICAgICAgICB1bmlxdWVfcHRyPGZyUGF0aFNlZz4gcGF0aFNlZyA9IG1ha2VfdW5pcXVlPGZyUGF0aFNlZz4oKnN0YXRpY19jYXN0PHRhUGF0aFNlZyo+KHVQaW5GaWcuZ2V0KCkpKTsKLSAgICAgICAgcGF0aFNlZy0+YWRkVG9OZXQoaXJvdXRlLT5nZXRHdWlkZSgpLT5nZXROZXQoKSk7Ci0gICAgICAgIGF1dG8gZ3VpZGUgPSBpcm91dGUtPmdldEd1aWRlKCk7Ci0gICAgICAgIHZlY3Rvcjx1bmlxdWVfcHRyPGZyQ29ubkZpZz4gPiB0bXA7Ci0gICAgICAgIHRtcC5wdXNoX2JhY2soc3RkOjptb3ZlKHBhdGhTZWcpKTsKLSAgICAgICAgZ3VpZGUtPnNldFJvdXRlcyh0bXApOwotICAgICAgfQotICAgICAgLy8gbW9kaWZ5IHVwcGVyL2xvd2VyIHNlZ3MKLSAgICAgIC8vIHVwcGVyL2xvd2VyIHNlZyB3aWxsIGhhdmUgbG9uZ2VzdCB3aXJlbGVuZ3RoCi0gICAgfQotICB9Ci19Ci0KLQotdm9pZCBGbGV4VEFXb3JrZXI6OmVuZCgpIHsKLSAgLy9pZiAoZ2V0VEFJdGVyKCkgPD0gMCkgewotICAgIHNhdmVUb0d1aWRlcygpOwotICAvL30KLX0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL3RhL0ZsZXhUQV9pbml0LmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL3RhL0ZsZXhUQV9pbml0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFjYTJhMy4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy90YS9GbGV4VEFfaW5pdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3ODcgKzAsMCBAQAotLyogQXV0aG9yczogTHV0b25nIFdhbmcgYW5kIEJhbmdxaSBYdSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgInRhL0ZsZXhUQS5oIgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIGZyOwotCi12b2lkIEZsZXhUQVdvcmtlcjo6aW5pdFRyYWNrcygpIHsKLSAgLy9ib29sIGVuYWJsZU91dHB1dCA9IHRydWU7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIC8vdHJhY2tzLmNsZWFyKCk7Ci0gIC8vdHJhY2tzLnJlc2l6ZShnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcnMoKS5zaXplKCkpOwotICB0cmFja0xvY3MuY2xlYXIoKTsKLSAgdHJhY2tMb2NzLnJlc2l6ZShnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcnMoKS5zaXplKCkpOwotICB2ZWN0b3I8c2V0PGZyQ29vcmQ+ID4gdHJhY2tDb29yZFNldHMoZ2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0TGF5ZXJzKCkuc2l6ZSgpKTsKLSAgLy8gdVB0ciBmb3IgdHAKLSAgZm9yIChpbnQgbE51bSA9IDA7IGxOdW0gPCAoaW50KWdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldExheWVycygpLnNpemUoKTsgbE51bSsrKSB7Ci0gICAgYXV0byBsYXllciA9IGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldExheWVyKGxOdW0pOwotICAgIGlmIChsYXllci0+Z2V0VHlwZSgpICE9IGZyTGF5ZXJUeXBlRW51bTo6Uk9VVElORykgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmIChsYXllci0+Z2V0RGlyKCkgIT0gZ2V0RGlyKCkpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBmb3IgKGF1dG8gJnRwOiBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0VHJhY2tQYXR0ZXJucyhsTnVtKSkgewotICAgICAgaWYgKChnZXREaXIoKSA9PSBmcmNIb3J6UHJlZlJvdXRpbmdEaXIgJiYgdHAtPmlzSG9yaXpvbnRhbCgpID09IGZhbHNlKSB8fAotICAgICAgICAgIChnZXREaXIoKSA9PSBmcmNWZXJ0UHJlZlJvdXRpbmdEaXIgJiYgdHAtPmlzSG9yaXpvbnRhbCgpID09IHRydWUpKSB7Ci0gICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICBjb3V0IDw8IlRSQUNLUyAiIDw8KHRwLT5pc0hvcml6b250YWwoKSA/IHN0cmluZygiWCAiKSA6IHN0cmluZygiWSAiKSkKLSAgICAgICAgICAgICAgIDw8dHAtPmdldFN0YXJ0Q29vcmQoKSA8PCIgRE8gIiA8PHRwLT5nZXROdW1UcmFja3MoKSA8PCIgU1RFUCAiCi0gICAgICAgICAgICAgICA8PHRwLT5nZXRUcmFja1NwYWNpbmcoKSA8PCIgTEFZRVIgIiA8PHRwLT5nZXRMYXllck51bSgpIAotICAgICAgICAgICAgICAgPDwiIDsiIDw8ZW5kbDsKLSAgICAgICAgfQotICAgICAgICBib29sIGlzSCA9IChnZXREaXIoKSA9PSBmcmNIb3J6UHJlZlJvdXRpbmdEaXIpOwotICAgICAgICBmckNvb3JkIHRlbXBDb29yZDEgPSAoaXNIID8gZ2V0Um91dGVCb3goKS5ib3R0b20oKSA6IGdldFJvdXRlQm94KCkubGVmdCgpKTsKLSAgICAgICAgZnJDb29yZCB0ZW1wQ29vcmQyID0gKGlzSCA/IGdldFJvdXRlQm94KCkudG9wKCkgICAgOiBnZXRSb3V0ZUJveCgpLnJpZ2h0KCkpOwotICAgICAgICBpbnQgdHJhY2tOdW0gPSAodGVtcENvb3JkMSAtIHRwLT5nZXRTdGFydENvb3JkKCkpIC8gKGludCl0cC0+Z2V0VHJhY2tTcGFjaW5nKCk7Ci0gICAgICAgIGlmICh0cmFja051bSA8IDApIHsKLSAgICAgICAgICB0cmFja051bSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRyYWNrTnVtICogKGludCl0cC0+Z2V0VHJhY2tTcGFjaW5nKCkgKyB0cC0+Z2V0U3RhcnRDb29yZCgpIDwgdGVtcENvb3JkMSkgewotICAgICAgICAgIHRyYWNrTnVtKys7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yICg7IHRyYWNrTnVtIDwgKGludCl0cC0+Z2V0TnVtVHJhY2tzKCkgJiYgdHJhY2tOdW0gKiAoaW50KXRwLT5nZXRUcmFja1NwYWNpbmcoKSArIHRwLT5nZXRTdGFydENvb3JkKCkgPCB0ZW1wQ29vcmQyOyB0cmFja051bSsrKSB7Ci0gICAgICAgICAgZnJDb29yZCB0cmFja0Nvb3JkID0gdHJhY2tOdW0gKiB0cC0+Z2V0VHJhY2tTcGFjaW5nKCkgKyB0cC0+Z2V0U3RhcnRDb29yZCgpOwotICAgICAgICAgIC8vY291dCA8PCJUUkFDS0xPQyAiIDw8dHJhY2tDb29yZCAqIDEuMCAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpIDw8ZW5kbDsKLSAgICAgICAgICB0cmFja0Nvb3JkU2V0c1tsTnVtXS5pbnNlcnQodHJhY2tDb29yZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KXRyYWNrQ29vcmRTZXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgY291dCA8PCJsTnVtICIgPDxpIDw8IjoiOwotICAgIH0KLSAgICBmb3IgKGF1dG8gY29vcmQ6IHRyYWNrQ29vcmRTZXRzW2ldKSB7Ci0gICAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAgIGNvdXQgPDwiICIgPDxjb29yZCAqIDEuMCAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpOwotICAgICAgfQotICAgICAgLy90YVRyYWNrIHQ7Ci0gICAgICAvL3Quc2V0VHJhY2tMb2MoY29vcmQpOwotICAgICAgLy90cmFja3NbaV0ucHVzaF9iYWNrKHN0ZDo6bW92ZSh0KSk7Ci0gICAgICB0cmFja0xvY3NbaV0ucHVzaF9iYWNrKGNvb3JkKTsKLSAgICB9Ci0gICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgY291dCA8PGVuZGw7Ci0gICAgfQotICB9Ci19Ci0KLWJvb2wgRmxleFRBV29ya2VyOjppbml0SXJvdXRlX2hlbHBlcl9waW4oZnJHdWlkZSogZ3VpZGUsIGZyQ29vcmQgJm1heEJlZ2luLCBmckNvb3JkICZtaW5FbmQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ8ZnJDb29yZD4gJmRvd25WaWFDb29yZFNldCwgc2V0PGZyQ29vcmQ+ICZ1cFZpYUNvb3JkU2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJndsZW4sIGZyQ29vcmQgJndsZW4yKSB7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0gIGZyUG9pbnQgYnAsIGVwOwotICBndWlkZS0+Z2V0UG9pbnRzKGJwLCBlcCk7Ci0gIGlmICghKGJwID09IGVwKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGF1dG8gbmV0ICAgICAgPSBndWlkZS0+Z2V0TmV0KCk7Ci0gIGF1dG8gbGF5ZXJOdW0gPSBndWlkZS0+Z2V0QmVnaW5MYXllck51bSgpOwotICBib29sIGlzSCAgICAgID0gKGdldERpcigpID09IGZyUHJlZlJvdXRpbmdEaXJFbnVtOjpmcmNIb3J6UHJlZlJvdXRpbmdEaXIpOwotICBib29sIGhhc0Rvd24gID0gZmFsc2U7Ci0gIGJvb2wgaGFzVXAgICAgPSBmYWxzZTsKLQotICB2ZWN0b3I8ZnJHdWlkZSo+IG5ickd1aWRlczsKLSAgYXV0byBycSA9IGdldFJlZ2lvblF1ZXJ5KCk7Ci0gIGZyQm94IGJveDsKLSAgYm94LnNldChicCwgYnApOwotICBuYnJHdWlkZXMuY2xlYXIoKTsKLSAgaWYgKGxheWVyTnVtIC0gMiA+PSAwKSB7Ci0gICAgcnEtPnF1ZXJ5R3VpZGUoYm94LCBsYXllck51bSAtIDIsIG5ickd1aWRlcyk7Ci0gICAgZm9yIChhdXRvICZuYnJHdWlkZTogbmJyR3VpZGVzKSB7Ci0gICAgICBpZiAobmJyR3VpZGUtPmdldE5ldCgpID09IG5ldCkgewotICAgICAgICBoYXNEb3duID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9IAotICBuYnJHdWlkZXMuY2xlYXIoKTsKLSAgaWYgKGxheWVyTnVtICsgMiA8IChpbnQpZGVzaWduLT5nZXRUZWNoKCktPmdldExheWVycygpLnNpemUoKSkgewotICAgIHJxLT5xdWVyeUd1aWRlKGJveCwgbGF5ZXJOdW0gKyAyLCBuYnJHdWlkZXMpOwotICAgIGZvciAoYXV0byAmbmJyR3VpZGU6IG5ickd1aWRlcykgewotICAgICAgaWYgKG5ickd1aWRlLT5nZXROZXQoKSA9PSBuZXQpIHsKLSAgICAgICAgaGFzVXAgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0gCi0KLSAgdmVjdG9yPGZyQmxvY2tPYmplY3QqPiByZXN1bHQ7Ci0gIGJveC5zZXQoYnAsIGJwKTsKLSAgcnEtPnF1ZXJ5R1JQaW4oYm94LCByZXN1bHQpOwotICBmclRyYW5zZm9ybSBpbnN0WGZvcm07IC8vICgwLDApLCBmcmNSMAotICBmclRyYW5zZm9ybSBzaGlmdFhmb3JtOwotICBmclRlcm0qIHRydWVUZXJtID0gbnVsbHB0cjsKLSAgLy9zdHJpbmcgIG5hbWU7Ci0gIGZvciAoYXV0byAmdGVybTogcmVzdWx0KSB7Ci0gICAgYm9vbCBoYXNJbnN0ID0gZmFsc2U7Ci0gICAgZnJJbnN0KiBpbnN0ID0gbnVsbHB0cjsKLSAgICBpZiAodGVybS0+dHlwZUlkKCkgPT0gZnJjSW5zdFRlcm0pIHsKLSAgICAgIGlmIChzdGF0aWNfY2FzdDxmckluc3RUZXJtKj4odGVybSktPmdldE5ldCgpICE9IG5ldCkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGhhc0luc3QgPSB0cnVlOwotICAgICAgaW5zdCA9IHN0YXRpY19jYXN0PGZySW5zdFRlcm0qPih0ZXJtKS0+Z2V0SW5zdCgpOwotICAgICAgaW5zdC0+Z2V0VHJhbnNmb3JtKHNoaWZ0WGZvcm0pOwotICAgICAgc2hpZnRYZm9ybS5zZXQoZnJPcmllbnQoZnJjUjApKTsKLSAgICAgIGluc3QtPmdldFVwZGF0ZWRYZm9ybShpbnN0WGZvcm0pOwotICAgICAgdHJ1ZVRlcm0gPSBzdGF0aWNfY2FzdDxmckluc3RUZXJtKj4odGVybSktPmdldFRlcm0oKTsKLSAgICB9IGVsc2UgaWYgKHRlcm0tPnR5cGVJZCgpID09IGZyY1Rlcm0pIHsKLSAgICAgIGlmIChzdGF0aWNfY2FzdDxmclRlcm0qPih0ZXJtKS0+Z2V0TmV0KCkgIT0gbmV0KSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgdHJ1ZVRlcm0gPSBzdGF0aWNfY2FzdDxmclRlcm0qPih0ZXJtKTsKLSAgICB9Ci0gICAgaWYgKHRydWVUZXJtKSB7Ci0gICAgICBmb3IgKGF1dG8gJnBpbjogdHJ1ZVRlcm0tPmdldFBpbnMoKSkgewotICAgICAgICBmb3IgKGF1dG8gJmFwOiBwaW4tPmdldEFjY2Vzc1BhdHRlcm5zKGluc3RYZm9ybS5vcmllbnQoKSkpIHsKLSAgICAgICAgICBpZiAoaGFzSW5zdCAmJiAhKGFwLT5oYXNJbnN0KGluc3QpKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGZyUG9pbnQgYXBCcCwgYXBFcDsKLSAgICAgICAgICBhcC0+Z2V0UG9pbnRzKGFwQnAsIGFwRXApOwotICAgICAgICAgIGlmIChlbmFibGVPdXRwdXQpIHsKLSAgICAgICAgICAgIGNvdXQgPDwiICgiIDw8YXBCcC54KCkgKiAxLjAgLyBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0REJVUGVyVVUoKSA8PCIsICIKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8YXBCcC55KCkgKiAxLjAgLyBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0REJVUGVyVVUoKSA8PCIpIG9yaWdpbiI7Ci0gICAgICAgICAgfQotICAgICAgICAgIGF1dG8gYk51bSA9IGFwLT5nZXRCZWdpbkxheWVyTnVtKCk7Ci0gICAgICAgICAgYXBCcC50cmFuc2Zvcm0oc2hpZnRYZm9ybSk7Ci0gICAgICAgICAgaWYgKGxheWVyTnVtID09IGJOdW0gJiYgZ2V0Um91dGVCb3goKS5jb250YWlucyhhcEJwKSkgewotICAgICAgICAgICAgd2xlbjIgPSBpc0ggPyBhcEJwLnkoKSA6IGFwQnAueCgpOwotICAgICAgICAgICAgbWF4QmVnaW4gPSBpc0ggPyBhcEJwLngoKSA6IGFwQnAueSgpOwotICAgICAgICAgICAgbWluRW5kICAgPSBpc0ggPyBhcEJwLngoKSA6IGFwQnAueSgpOwotICAgICAgICAgICAgd2xlbiA9IDA7Ci0gICAgICAgICAgICBpZiAoaGFzRG93bikgewotICAgICAgICAgICAgICBkb3duVmlhQ29vcmRTZXQuaW5zZXJ0KG1heEJlZ2luKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChoYXNVcCkgewotICAgICAgICAgICAgICB1cFZpYUNvb3JkU2V0Lmluc2VydChtYXhCZWdpbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBGbGV4VEFXb3JrZXI6OmluaXRJcm91dGVfaGVscGVyKGZyR3VpZGUqIGd1aWRlLCBmckNvb3JkICZtYXhCZWdpbiwgZnJDb29yZCAmbWluRW5kLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ8ZnJDb29yZD4gJmRvd25WaWFDb29yZFNldCwgc2V0PGZyQ29vcmQ+ICZ1cFZpYUNvb3JkU2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmd2xlbiwgZnJDb29yZCAmd2xlbjIpIHsKLSAgaWYgKCFpbml0SXJvdXRlX2hlbHBlcl9waW4oZ3VpZGUsIG1heEJlZ2luLCBtaW5FbmQsIGRvd25WaWFDb29yZFNldCwgdXBWaWFDb29yZFNldCwgd2xlbiwgd2xlbjIpKSB7Ci0gICAgaW5pdElyb3V0ZV9oZWxwZXJfZ2VuZXJpYyhndWlkZSwgbWF4QmVnaW4sIG1pbkVuZCwgZG93blZpYUNvb3JkU2V0LCB1cFZpYUNvb3JkU2V0LCB3bGVuLCB3bGVuMik7Ci0gIH0KLX0KLQotCi12b2lkIEZsZXhUQVdvcmtlcjo6aW5pdElyb3V0ZV9oZWxwZXJfZ2VuZXJpY19oZWxwZXIoZnJHdWlkZSogZ3VpZGUsIGZyQ29vcmQgJndsZW4yKSB7Ci0gIGJvb2wgZW5hYmxlT3V0cHV0ID0gZmFsc2U7Ci0KLSAgZnJQb2ludCBicCwgZXA7Ci0gIGd1aWRlLT5nZXRQb2ludHMoYnAsIGVwKTsKLSAgYXV0byBuZXQgPSBndWlkZS0+Z2V0TmV0KCk7Ci0gIGJvb2wgaXNIID0gKGdldERpcigpID09IGZyUHJlZlJvdXRpbmdEaXJFbnVtOjpmcmNIb3J6UHJlZlJvdXRpbmdEaXIpOwotCi0gIGF1dG8gcnEgPSBnZXRSZWdpb25RdWVyeSgpOwotICB2ZWN0b3I8ZnJCbG9ja09iamVjdCo+IHJlc3VsdDsKLQotICBmckJveCBib3g7Ci0gIGJveC5zZXQoYnAsIGJwKTsKLSAgcnEtPnF1ZXJ5R1JQaW4oYm94LCByZXN1bHQpOwotICBpZiAoIShlcCA9PSBicCkpIHsKLSAgICBib3guc2V0KGVwLCBlcCk7Ci0gICAgcnEtPnF1ZXJ5R1JQaW4oYm94LCByZXN1bHQpOwotICB9Ci0gIGZyVHJhbnNmb3JtIGluc3RYZm9ybTsgLy8gKDAsMCksIGZyY1IwCi0gIGZyVHJhbnNmb3JtIHNoaWZ0WGZvcm07Ci0gIGZyVGVybSogdHJ1ZVRlcm0gPSBudWxscHRyOwotICAvL3N0cmluZyAgbmFtZTsKLSAgZm9yIChhdXRvICZ0ZXJtOiByZXN1bHQpIHsKLSAgICBib29sIGhhc0luc3QgPSBmYWxzZTsKLSAgICBmckluc3QqIGluc3QgPSBudWxscHRyOwotICAgIGlmICh0ZXJtLT50eXBlSWQoKSA9PSBmcmNJbnN0VGVybSkgewotICAgICAgaWYgKHN0YXRpY19jYXN0PGZySW5zdFRlcm0qPih0ZXJtKS0+Z2V0TmV0KCkgIT0gbmV0KSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgaGFzSW5zdCA9IHRydWU7Ci0gICAgICBpbnN0ID0gc3RhdGljX2Nhc3Q8ZnJJbnN0VGVybSo+KHRlcm0pLT5nZXRJbnN0KCk7Ci0gICAgICBpbnN0LT5nZXRUcmFuc2Zvcm0oc2hpZnRYZm9ybSk7Ci0gICAgICBzaGlmdFhmb3JtLnNldChmck9yaWVudChmcmNSMCkpOwotICAgICAgaW5zdC0+Z2V0VXBkYXRlZFhmb3JtKGluc3RYZm9ybSk7Ci0gICAgICB0cnVlVGVybSA9IHN0YXRpY19jYXN0PGZySW5zdFRlcm0qPih0ZXJtKS0+Z2V0VGVybSgpOwotICAgIH0gZWxzZSBpZiAodGVybS0+dHlwZUlkKCkgPT0gZnJjVGVybSkgewotICAgICAgaWYgKHN0YXRpY19jYXN0PGZyVGVybSo+KHRlcm0pLT5nZXROZXQoKSAhPSBuZXQpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICB0cnVlVGVybSA9IHN0YXRpY19jYXN0PGZyVGVybSo+KHRlcm0pOwotICAgIH0KLSAgICBpZiAodHJ1ZVRlcm0pIHsKLSAgICAgIGZvciAoYXV0byAmcGluOiB0cnVlVGVybS0+Z2V0UGlucygpKSB7Ci0gICAgICAgIGZvciAoYXV0byAmYXA6IHBpbi0+Z2V0QWNjZXNzUGF0dGVybnMoaW5zdFhmb3JtLm9yaWVudCgpKSkgewotICAgICAgICAgIGlmIChoYXNJbnN0ICYmICEoYXAtPmhhc0luc3QoaW5zdCkpKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZnJQb2ludCBhcEJwLCBhcEVwOwotICAgICAgICAgIGFwLT5nZXRQb2ludHMoYXBCcCwgYXBFcCk7Ci0gICAgICAgICAgaWYgKGVuYWJsZU91dHB1dCkgewotICAgICAgICAgICAgY291dCA8PCIgKCIgPDxhcEJwLngoKSAqIDEuMCAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpIDw8IiwgIgotICAgICAgICAgICAgICAgICAgICAgICAgPDxhcEJwLnkoKSAqIDEuMCAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpIDw8Iikgb3JpZ2luIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYXBCcC50cmFuc2Zvcm0oc2hpZnRYZm9ybSk7Ci0gICAgICAgICAgaWYgKGdldFJvdXRlQm94KCkuY29udGFpbnMoYXBCcCkpIHsKLSAgICAgICAgICAgIHdsZW4yID0gaXNIID8gYXBCcC55KCkgOiBhcEJwLngoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBGbGV4VEFXb3JrZXI6OmluaXRJcm91dGVfaGVscGVyX2dlbmVyaWMoZnJHdWlkZSogZ3VpZGUsIGZyQ29vcmQgJm1pbkJlZ2luLCBmckNvb3JkICZtYXhFbmQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0PGZyQ29vcmQ+ICZkb3duVmlhQ29vcmRTZXQsIHNldDxmckNvb3JkPiAmdXBWaWFDb29yZFNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmd2xlbiwgZnJDb29yZCAmd2xlbjIpIHsKLSAgYXV0byAgICBuZXQgICAgICAgICA9IGd1aWRlLT5nZXROZXQoKTsKLSAgYXV0byAgICBsYXllck51bSAgICA9IGd1aWRlLT5nZXRCZWdpbkxheWVyTnVtKCk7Ci0gIGJvb2wgICAgaGFzTWluQmVnaW4gPSBmYWxzZTsKLSAgYm9vbCAgICBoYXNNYXhFbmQgICA9IGZhbHNlOwotICAgICAgICAgIG1pbkJlZ2luICAgID0gc3RkOjpudW1lcmljX2xpbWl0czxmckNvb3JkPjo6bWF4KCk7Ci0gICAgICAgICAgbWF4RW5kICAgICAgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGZyQ29vcmQ+OjptaW4oKTsKLSAgICAgICAgICB3bGVuICAgICAgICA9IDA7Ci0gICAgICAgICAgLy93bGVuMiAgICAgICA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZnJDb29yZD46Om1heCgpOwotICBib29sICAgIGlzSCAgICAgICAgID0gKGdldERpcigpID09IGZyUHJlZlJvdXRpbmdEaXJFbnVtOjpmcmNIb3J6UHJlZlJvdXRpbmdEaXIpOwotICBkb3duVmlhQ29vcmRTZXQuY2xlYXIoKTsKLSAgdXBWaWFDb29yZFNldC5jbGVhcigpOwotICBmclBvaW50IG5ickJwLCBuYnJFcDsKLSAgZnJQb2ludCBuYnJTZWdCZWdpbiwgbmJyU2VnRW5kOwotICAKLSAgZnJQb2ludCBicCwgZXA7Ci0gIGd1aWRlLT5nZXRQb2ludHMoYnAsIGVwKTsKLSAgZnJQb2ludCBjcDsKLSAgLy8gbGF5ZXJOdW0gaW4gRmxleFRBV29ya2VyCi0gIHZlY3Rvcjxmckd1aWRlKj4gbmJyR3VpZGVzOwotICBhdXRvIHJxID0gZ2V0UmVnaW9uUXVlcnkoKTsKLSAgZnJCb3ggYm94OwotICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotICAgIG5ickd1aWRlcy5jbGVhcigpOwotICAgIC8vIGNoZWNrIGxlZnQKLSAgICBpZiAoaSA9PSAwKSB7Ci0gICAgICBib3guc2V0KGJwLCBicCk7Ci0gICAgICBjcCA9IGJwOwotICAgIC8vIGNoZWNrIHJpZ2h0Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJveC5zZXQoZXAsIGVwKTsKLSAgICAgIGNwID0gZXA7Ci0gICAgfQotICAgIGlmIChsYXllck51bSAtIDIgPj0gMCkgewotICAgICAgcnEtPnF1ZXJ5R3VpZGUoYm94LCBsYXllck51bSAtIDIsIG5ickd1aWRlcyk7Ci0gICAgfSAKLSAgICBpZiAobGF5ZXJOdW0gKyAyIDwgKGludClkZXNpZ24tPmdldFRlY2goKS0+Z2V0TGF5ZXJzKCkuc2l6ZSgpKSB7Ci0gICAgICBycS0+cXVlcnlHdWlkZShib3gsIGxheWVyTnVtICsgMiwgbmJyR3VpZGVzKTsKLSAgICB9IAotICAgIGZvciAoYXV0byAmbmJyR3VpZGU6IG5ickd1aWRlcykgewotICAgICAgaWYgKG5ickd1aWRlLT5nZXROZXQoKSA9PSBuZXQpIHsKLSAgICAgICAgbmJyR3VpZGUtPmdldFBvaW50cyhuYnJCcCwgbmJyRXApOwotICAgICAgICBpZiAoIW5ickd1aWRlLT5oYXNSb3V0ZXMoKSkgewotICAgICAgICAgIC8vIHZpYSBsb2NhdGlvbiBhc3N1bWVkIGluIGNlbnRlcgotICAgICAgICAgIGF1dG8gcHNMTnVtID0gbmJyR3VpZGUtPmdldEJlZ2luTGF5ZXJOdW0oKTsKLSAgICAgICAgICBpZiAocHNMTnVtID09IGxheWVyTnVtIC0gMikgewotICAgICAgICAgICAgZG93blZpYUNvb3JkU2V0Lmluc2VydCgoaXNIID8gbmJyQnAueCgpIDogbmJyQnAueSgpKSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVwVmlhQ29vcmRTZXQuaW5zZXJ0KChpc0ggPyBuYnJCcC54KCkgOiBuYnJCcC55KCkpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZm9yIChhdXRvICZjb25uRmlnOiBuYnJHdWlkZS0+Z2V0Um91dGVzKCkpIHsKLSAgICAgICAgICAgIGlmIChjb25uRmlnLT50eXBlSWQoKSA9PSBmcmNQYXRoU2VnKSB7Ci0gICAgICAgICAgICAgIGF1dG8gb2JqID0gc3RhdGljX2Nhc3Q8ZnJQYXRoU2VnKj4oY29ubkZpZy5nZXQoKSk7Ci0gICAgICAgICAgICAgIG9iai0+Z2V0UG9pbnRzKG5iclNlZ0JlZ2luLCBuYnJTZWdFbmQpOwotICAgICAgICAgICAgICBhdXRvIHBzTE51bSA9IG9iai0+Z2V0TGF5ZXJOdW0oKTsKLSAgICAgICAgICAgICAgaWYgKGkgPT0gMCkgewotICAgICAgICAgICAgICAgIG1pbkJlZ2luID0gbWluKG1pbkJlZ2luLCAoaXNIID8gbmJyU2VnQmVnaW4ueCgpIDogbmJyU2VnQmVnaW4ueSgpKSk7Ci0gICAgICAgICAgICAgICAgaGFzTWluQmVnaW4gPSB0cnVlOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1heEVuZCA9IG1heChtYXhFbmQsIChpc0ggPyBuYnJTZWdCZWdpbi54KCkgOiBuYnJTZWdCZWdpbi55KCkpKTsKLSAgICAgICAgICAgICAgICBoYXNNYXhFbmQgPSB0cnVlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIC8vaWYgKG5ickJwID09IG5ickVwKSB7Ci0gICAgICAgICAgICAgIC8vICB3bGVuMiA9IGlzSCA/ICgobmJyU2VnQmVnaW4ueSgpICsgbmJyU2VnRW5kKCkueSgpKSAvIDIpIDogKChuYnJTZWdCZWdpbi54KCkgKyBuYnJTZWdFbmQoKS54KCkpIC8gMikKLSAgICAgICAgICAgICAgLy99Ci0gICAgICAgICAgICAgIGlmIChwc0xOdW0gPT0gbGF5ZXJOdW0gLSAyKSB7Ci0gICAgICAgICAgICAgICAgZG93blZpYUNvb3JkU2V0Lmluc2VydCgoaXNIID8gbmJyU2VnQmVnaW4ueCgpIDogbmJyU2VnQmVnaW4ueSgpKSk7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdXBWaWFDb29yZFNldC5pbnNlcnQoKGlzSCA/IG5iclNlZ0JlZ2luLngoKSA6IG5iclNlZ0JlZ2luLnkoKSkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChjcCA9PSBuYnJFcCkgewotICAgICAgICAgIHdsZW4gLT0gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY3AgPT0gbmJyQnApIHsKLSAgICAgICAgICB3bGVuICs9IDE7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAoIWhhc01pbkJlZ2luKSB7Ci0gICAgbWluQmVnaW4gPSAoaXNIID8gYnAueCgpIDogYnAueSgpKTsKLSAgfQotICBpZiAoIWhhc01heEVuZCkgewotICAgIG1heEVuZCA9IChpc0ggPyBlcC54KCkgOiBlcC55KCkpOwotICB9Ci0gIGlmIChtaW5CZWdpbiA+IG1heEVuZCkgewotICAgIHN3YXAobWluQmVnaW4sIG1heEVuZCk7Ci0gIH0KLSAgaWYgKG1pbkJlZ2luID09IG1heEVuZCkgewotICAgIG1heEVuZCArPSAxOwotICB9Ci0KLSAgLy8gd2xlbjIgcHVyZWx5IGRlcGVuZHMgb24gYXAgcmVnYXJkbGVzcyBvZiB0cmFjawotICBpbml0SXJvdXRlX2hlbHBlcl9nZW5lcmljX2hlbHBlcihndWlkZSwgd2xlbjIpOwotfQotCi12b2lkIEZsZXhUQVdvcmtlcjo6aW5pdElyb3V0ZShmckd1aWRlICpndWlkZSkgewotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgYXV0byBpcm91dGUgPSBtYWtlX3VuaXF1ZTx0YVBpbj4oKTsKLSAgaXJvdXRlLT5zZXRHdWlkZShndWlkZSk7Ci0gIGZyQm94IGd1aWRlQm94OwotICBndWlkZS0+Z2V0QkJveChndWlkZUJveCk7Ci0gIGF1dG8gbGF5ZXJOdW0gPSBndWlkZS0+Z2V0QmVnaW5MYXllck51bSgpOwotICBib29sIGlzRXh0ID0gIShnZXRSb3V0ZUJveCgpLmNvbnRhaW5zKGd1aWRlQm94KSk7Ci0gIGlmIChpc0V4dCkgewotICAgIC8vIGV4dElyb3V0ZSBlbXB0eSwgc2tpcAotICAgIGlmIChndWlkZS0+Z2V0Um91dGVzKCkuZW1wdHkoKSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBkb3VibGUgZGJ1ID0gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCk7Ci0gICAgICBjb3V0IDw8ImV4dEAoIiA8PGd1aWRlQm94LmxlZnQoKSAvIGRidSAgPDwiLCAiIDw8Z3VpZGVCb3guYm90dG9tKCkgLyBkYnUgPDwiKSAoIgotICAgICAgICAgICAgICAgICAgICAgPDxndWlkZUJveC5yaWdodCgpIC8gZGJ1IDw8IiwgIiA8PGd1aWRlQm94LnRvcCgpICAgIC8gZGJ1IDw8IikiIDw8ZW5kbDsKLSAgICB9Ci0gIH0KLSAgCi0gIGZyQ29vcmQgbWF4QmVnaW4sIG1pbkVuZDsKLSAgc2V0PGZyQ29vcmQ+IGRvd25WaWFDb29yZFNldCwgdXBWaWFDb29yZFNldDsKLSAgaW50IHdsZW4gPSAwOwotICBmckNvb3JkIHdsZW4yID0gc3RkOjpudW1lcmljX2xpbWl0czxmckNvb3JkPjo6bWF4KCk7Ci0gIGluaXRJcm91dGVfaGVscGVyKGd1aWRlLCBtYXhCZWdpbiwgbWluRW5kLCBkb3duVmlhQ29vcmRTZXQsIHVwVmlhQ29vcmRTZXQsIHdsZW4sIHdsZW4yKTsKLQotICBmckNvb3JkIHRyYWNrTG9jID0gMDsKLSAgZnJQb2ludCBzZWdCZWdpbiwgc2VnRW5kOwotICBib29sICAgIGlzSCAgICAgICAgID0gKGdldERpcigpID09IGZyUHJlZlJvdXRpbmdEaXJFbnVtOjpmcmNIb3J6UHJlZlJvdXRpbmdEaXIpOwotICAvLyBzZXQgdHJhY2tJZHgKLSAgaWYgKCFpc0luaXRUQSgpKSB7Ci0gICAgZm9yIChhdXRvICZjb25uRmlnOiBndWlkZS0+Z2V0Um91dGVzKCkpIHsKLSAgICAgIGlmIChjb25uRmlnLT50eXBlSWQoKSA9PSBmcmNQYXRoU2VnKSB7Ci0gICAgICAgIGF1dG8gb2JqID0gc3RhdGljX2Nhc3Q8ZnJQYXRoU2VnKj4oY29ubkZpZy5nZXQoKSk7Ci0gICAgICAgIG9iai0+Z2V0UG9pbnRzKHNlZ0JlZ2luLCBzZWdFbmQpOwotICAgICAgICB0cmFja0xvYyA9IChpc0ggPyBzZWdCZWdpbi55KCkgOiBzZWdCZWdpbi54KCkpOwotICAgICAgICAvL2F1dG8gcHNMTnVtID0gb2JqLT5nZXRMYXllck51bSgpOwotICAgICAgICAvL2ludCBpZHgxID0gMDsKLSAgICAgICAgLy9pbnQgaWR4MiA9IDA7Ci0gICAgICAgIC8vZ2V0VHJhY2tJZHgodHJhY2tMb2MsIHBzTE51bSwgaWR4MSwgaWR4Mik7Ci0gICAgICAgIC8vaXJvdXRlLnNldFRyYWNrSWR4KGlkeDEpOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICB0cmFja0xvYyA9IDA7Ci0gIH0KLQotICB1bmlxdWVfcHRyPHRhUGluRmlnPiBwcyA9IG1ha2VfdW5pcXVlPHRhUGF0aFNlZz4oKTsKLSAgYXV0byBycHRyID0gc3RhdGljX2Nhc3Q8dGFQYXRoU2VnKj4ocHMuZ2V0KCkpOwotICBpZiAoaXNIKSB7Ci0gICAgcnB0ci0+c2V0UG9pbnRzKGZyUG9pbnQobWF4QmVnaW4sIHRyYWNrTG9jKSwgZnJQb2ludChtaW5FbmQsIHRyYWNrTG9jKSk7Ci0gIH0gZWxzZSB7Ci0gICAgcnB0ci0+c2V0UG9pbnRzKGZyUG9pbnQodHJhY2tMb2MsIG1heEJlZ2luKSwgZnJQb2ludCh0cmFja0xvYywgbWluRW5kKSk7Ci0gIH0KLSAgcnB0ci0+c2V0TGF5ZXJOdW0obGF5ZXJOdW0pOwotICBycHRyLT5zZXRTdHlsZShnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihsYXllck51bSktPmdldERlZmF1bHRTZWdTdHlsZSgpKTsKLSAgLy8gb3duZXIgc2V0IHdoZW4gYWRkIHRvIHRhUGluCi0gIGlyb3V0ZS0+YWRkUGluRmlnKHBzKTsKLQotICAvL2lyb3V0ZS5zZXRDb29yZHMobWF4QmVnaW4sIG1pbkVuZCk7Ci0gIC8vZm9yIChhdXRvIGNvb3JkOiB1cFZpYUNvb3JkU2V0KSB7Ci0gIC8vICBpcm91dGUuYWRkVmlhQ29vcmRzKGNvb3JkLCB0cnVlKTsKLSAgLy99Ci0gIC8vZm9yIChhdXRvIGNvb3JkOiBkb3duVmlhQ29vcmRTZXQpIHsKLSAgLy8gIGlyb3V0ZS5hZGRWaWFDb29yZHMoY29vcmQsIGZhbHNlKTsKLSAgLy99Ci0gIGZvciAoYXV0byBjb29yZDogdXBWaWFDb29yZFNldCkgewotICAgIHVuaXF1ZV9wdHI8dGFQaW5GaWc+IHZpYSA9IG1ha2VfdW5pcXVlPHRhVmlhPihnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihsYXllck51bSArIDEpLT5nZXREZWZhdWx0VmlhRGVmKCkpOwotICAgIGF1dG8gclZpYVB0ciA9IHN0YXRpY19jYXN0PHRhVmlhKj4odmlhLmdldCgpKTsKLSAgICByVmlhUHRyLT5zZXRPcmlnaW4oaXNIID8gZnJQb2ludChjb29yZCwgdHJhY2tMb2MpIDogZnJQb2ludCh0cmFja0xvYywgY29vcmQpKTsKLSAgICBpcm91dGUtPmFkZFBpbkZpZyh2aWEpOwotICB9Ci0gIGZvciAoYXV0byBjb29yZDogZG93blZpYUNvb3JkU2V0KSB7Ci0gICAgdW5pcXVlX3B0cjx0YVBpbkZpZz4gdmlhID0gbWFrZV91bmlxdWU8dGFWaWE+KGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldExheWVyKGxheWVyTnVtIC0gMSktPmdldERlZmF1bHRWaWFEZWYoKSk7Ci0gICAgYXV0byByVmlhUHRyID0gc3RhdGljX2Nhc3Q8dGFWaWEqPih2aWEuZ2V0KCkpOwotICAgIHJWaWFQdHItPnNldE9yaWdpbihpc0ggPyBmclBvaW50KGNvb3JkLCB0cmFja0xvYykgOiBmclBvaW50KHRyYWNrTG9jLCBjb29yZCkpOwotICAgIGlyb3V0ZS0+YWRkUGluRmlnKHZpYSk7Ci0gIH0KLSAgaXJvdXRlLT5zZXRXbGVuSGVscGVyKHdsZW4pOwotICBpZiAod2xlbjIgPCBzdGQ6Om51bWVyaWNfbGltaXRzPGZyQ29vcmQ+OjptYXgoKSkgewotICAgIGlyb3V0ZS0+c2V0V2xlbkhlbHBlcjIod2xlbjIpOwotICB9Ci0gIGFkZElyb3V0ZShpcm91dGUsIGlzRXh0KTsKLSAgLy9pcm91dGUuc2V0SWQoaXJvdXRlcy5zaXplKCkpOyAvLyBzZXQgaWQKLSAgLy9pcm91dGVzLnB1c2hfYmFjayhpcm91dGUpOwotfQotCi0KLQotdm9pZCBGbGV4VEFXb3JrZXI6OmluaXRJcm91dGVzKCkgewotICAvL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLSAgdmVjdG9yPHJxX3JwdHJfdmFsdWVfdDxmckd1aWRlPiA+IHJlc3VsdDsKLSAgYXV0byByZWdpb25RdWVyeSA9IGdldFJlZ2lvblF1ZXJ5KCk7Ci0gIGZvciAoaW50IGxOdW0gPSAwOyBsTnVtIDwgKGludClnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcnMoKS5zaXplKCk7IGxOdW0rKykgewotICAgIGF1dG8gbGF5ZXIgPSBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihsTnVtKTsKLSAgICBpZiAobGF5ZXItPmdldFR5cGUoKSAhPSBmckxheWVyVHlwZUVudW06OlJPVVRJTkcpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBpZiAobGF5ZXItPmdldERpcigpICE9IGdldERpcigpKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgcmVzdWx0LmNsZWFyKCk7Ci0gICAgcmVnaW9uUXVlcnktPnF1ZXJ5R3VpZGUoZ2V0RXh0Qm94KCksIGxOdW0sIHJlc3VsdCk7Ci0gICAgLy9jb3V0IDw8ZW5kbCA8PCJxdWVyeTE6IiA8PGVuZGw7Ci0gICAgZm9yIChhdXRvICZbYm9vc3RiLCBndWlkZV06IHJlc3VsdCkgewotICAgICAgZnJQb2ludCBwdDEsIHB0MjsKLSAgICAgIGd1aWRlLT5nZXRQb2ludHMocHQxLCBwdDIpOwotICAgICAgLy9pZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICAvLyAgY291dCA8PCJmb3VuZCBndWlkZSAoIiAKLSAgICAgIC8vICAgICAgIDw8cHQxLngoKSAqIDEuMCAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpIDw8IiwgIiAKLSAgICAgIC8vICAgICAgIDw8cHQxLnkoKSAqIDEuMCAvIGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpIDw8IikgKCIgCi0gICAgICAvLyAgICAgICA8PHB0Mi54KCkgKiAxLjAgLyBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0REJVUGVyVVUoKSA8PCIsICIgCi0gICAgICAvLyAgICAgICA8PHB0Mi55KCkgKiAxLjAgLyBnZXREZXNpZ24oKS0+Z2V0VG9wQmxvY2soKS0+Z2V0REJVUGVyVVUoKSA8PCIpICIgCi0gICAgICAvLyAgICAgICA8PGd1aWRlLT5nZXROZXQoKS0+Z2V0TmFtZSgpIDw8ICJcbiI7Ci0gICAgICAvL30KLSAgICAgIC8vZ3VpZGVzLnB1c2hfYmFjayhndWlkZSk7Ci0gICAgICAvL2NvdXQgPDxlbmRsOwotICAgICAgaW5pdElyb3V0ZShndWlkZSk7Ci0gICAgfQotICAgIC8vc29ydChndWlkZXMuYmVnaW4oKSwgZ3VpZGVzLmVuZCgpLCBbXShjb25zdCBmckd1aWRlICphLCBjb25zdCBmckd1aWRlICpiKSB7cmV0dXJuICphIDwgKmI7fSk7Ci0gIH0KLQotICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgYm9vbCAgIGlzSCA9IChnZXREaXIoKSA9PSBmclByZWZSb3V0aW5nRGlyRW51bTo6ZnJjSG9yelByZWZSb3V0aW5nRGlyKTsKLSAgICBkb3VibGUgZGJ1ID0gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCk7Ci0gICAgZm9yIChhdXRvICZpcm91dGU6IGlyb3V0ZXMpIHsKLSAgICAgIGZyUG9pbnQgYnAsIGVwOwotICAgICAgZnJDb29yZCBiYywgZWMsIHRyYWNrTG9jOwotICAgICAgY291dCA8PGlyb3V0ZS0+Z2V0SWQoKSA8PCIgIiA8PGlyb3V0ZS0+Z2V0R3VpZGUoKS0+Z2V0TmV0KCktPmdldE5hbWUoKTsKLSAgICAgIGF1dG8gZ3VpZGVMTnVtID0gaXJvdXRlLT5nZXRHdWlkZSgpLT5nZXRCZWdpbkxheWVyTnVtKCk7Ci0gICAgICBmb3IgKGF1dG8gJnVQaW5GaWc6IGlyb3V0ZS0+Z2V0RmlncygpKSB7Ci0gICAgICAgIGlmICh1UGluRmlnLT50eXBlSWQoKSA9PSB0YWNQYXRoU2VnKSB7Ci0gICAgICAgICAgYXV0byBvYmogPSBzdGF0aWNfY2FzdDx0YVBhdGhTZWcqPih1UGluRmlnLmdldCgpKTsKLSAgICAgICAgICBvYmotPmdldFBvaW50cyhicCwgZXApOwotICAgICAgICAgIGJjID0gaXNIID8gYnAueCgpIDogYnAueSgpOwotICAgICAgICAgIGVjID0gaXNIID8gZXAueCgpIDogZXAueSgpOwotICAgICAgICAgIHRyYWNrTG9jID0gaXNIID8gYnAueSgpIDogYnAueCgpOwotICAgICAgICAgIGNvdXQgPDwiICgiIDw8YmMgLyBkYnUgPDwiLS0+IiA8PGVjIC8gZGJ1IDw8IiksIGxlbkAiIDw8KGVjIC0gYmMpIC8gZGJ1IDw8IiwgdHJhY2tAIiA8PHRyYWNrTG9jIC8gZGJ1Ci0gICAgICAgICAgICAgICA8PCIsICIgPDxnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihpcm91dGUtPmdldEd1aWRlKCktPmdldEJlZ2luTGF5ZXJOdW0oKSktPmdldE5hbWUoKTsKLSAgICAgICAgfSBlbHNlIGlmICh1UGluRmlnLT50eXBlSWQoKSA9PSB0YWNWaWEpIHsKLSAgICAgICAgICBhdXRvIG9iaiA9IHN0YXRpY19jYXN0PHRhVmlhKj4odVBpbkZpZy5nZXQoKSk7Ci0gICAgICAgICAgYXV0byBjdXRMTnVtID0gb2JqLT5nZXRWaWFEZWYoKS0+Z2V0Q3V0TGF5ZXJOdW0oKTsKLSAgICAgICAgICBvYmotPmdldE9yaWdpbihicCk7Ci0gICAgICAgICAgYmMgPSBpc0ggPyBicC54KCkgOiBicC55KCk7Ci0gICAgICAgICAgY291dCA8PHN0cmluZygoY3V0TE51bSA+IGd1aWRlTE51bSkgPyAiLCBVQCIgOiAiLCBEQCIpIDw8YmMgLyBkYnU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNvdXQgPDwiLCB3bGVuX2hAIiA8PGlyb3V0ZS0+Z2V0V2xlbkhlbHBlcigpIDw8ZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotCi0KLXZvaWQgRmxleFRBV29ya2VyOjppbml0Q29zdHMoKSB7Ci0gIC8vYm9vbCBlbmFibGVPdXRwdXQgPSB0cnVlOwotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICBib29sIGlzSCA9IChnZXREaXIoKSA9PSBmclByZWZSb3V0aW5nRGlyRW51bTo6ZnJjSG9yelByZWZSb3V0aW5nRGlyKTsKLSAgZnJQb2ludCBicCwgZXA7Ci0gIGZyQ29vcmQgYmMsIGVjOwotICAvLyBpbml0IGNvc3QKLSAgaWYgKGlzSW5pdFRBKCkpIHsKLSAgICBmb3IgKGF1dG8gJmlyb3V0ZTogaXJvdXRlcykgewotICAgICAgYXV0byBwaXRjaCA9IGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldExheWVyKGlyb3V0ZS0+Z2V0R3VpZGUoKS0+Z2V0QmVnaW5MYXllck51bSgpKS0+Z2V0UGl0Y2goKTsKLSAgICAgIGZvciAoYXV0byAmdVBpbkZpZzogaXJvdXRlLT5nZXRGaWdzKCkpIHsKLSAgICAgICAgaWYgKHVQaW5GaWctPnR5cGVJZCgpID09IHRhY1BhdGhTZWcpIHsKLSAgICAgICAgICBhdXRvIG9iaiA9IHN0YXRpY19jYXN0PHRhUGF0aFNlZyo+KHVQaW5GaWcuZ2V0KCkpOwotICAgICAgICAgIG9iai0+Z2V0UG9pbnRzKGJwLCBlcCk7Ci0gICAgICAgICAgYmMgPSBpc0ggPyBicC54KCkgOiBicC55KCk7Ci0gICAgICAgICAgZWMgPSBpc0ggPyBlcC54KCkgOiBlcC55KCk7Ci0gICAgICAgICAgaXJvdXRlLT5zZXRDb3N0KGVjIC0gYmMgKyBpcm91dGUtPmhhc1dsZW5IZWxwZXIyKCkgKiBwaXRjaCAqIDEwMDApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgewotICAgIGF1dG8gJndvcmtlclJlZ2lvblF1ZXJ5ID0gZ2V0V29ya2VyUmVnaW9uUXVlcnkoKTsKLSAgICAvLyB1cGRhdGUgd29ya2VyIHJxCi0gICAgZm9yIChhdXRvICZpcm91dGU6IGlyb3V0ZXMpIHsKLSAgICAgIGZvciAoYXV0byAmdVBpbkZpZzogaXJvdXRlLT5nZXRGaWdzKCkpIHsKLSAgICAgICAgd29ya2VyUmVnaW9uUXVlcnkuYWRkKHVQaW5GaWcuZ2V0KCkpOwotICAgICAgICBhZGRDb3N0KHVQaW5GaWcuZ2V0KCkpOwotICAgICAgfQotICAgIH0KLSAgICBmb3IgKGF1dG8gJmlyb3V0ZTogZXh0SXJvdXRlcykgewotICAgICAgZm9yIChhdXRvICZ1UGluRmlnOiBpcm91dGUtPmdldEZpZ3MoKSkgewotICAgICAgICB3b3JrZXJSZWdpb25RdWVyeS5hZGQodVBpbkZpZy5nZXQoKSk7Ci0gICAgICAgIGFkZENvc3QodVBpbkZpZy5nZXQoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIHVwZGF0ZSBpcm91dGUgY29zdAotICAgIGZvciAoYXV0byAmaXJvdXRlOiBpcm91dGVzKSB7Ci0gICAgICBmclVJbnQ0IGRyY0Nvc3QgPSAwOwotICAgICAgZnJDb29yZCB0cmFja0xvYyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZnJDb29yZD46Om1heCgpOwotICAgICAgZm9yIChhdXRvICZ1UGluRmlnOiBpcm91dGUtPmdldEZpZ3MoKSkgewotICAgICAgICBpZiAodVBpbkZpZy0+dHlwZUlkKCkgPT0gdGFjUGF0aFNlZykgewotICAgICAgICAgIHN0YXRpY19jYXN0PHRhUGF0aFNlZyo+KHVQaW5GaWcuZ2V0KCkpLT5nZXRQb2ludHMoYnAsIGVwKTsKLSAgICAgICAgICBpZiAoaXNIKSB7Ci0gICAgICAgICAgICB0cmFja0xvYyA9IGJwLnkoKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJhY2tMb2MgPSBicC54KCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAodHJhY2tMb2MgPT0gc3RkOjpudW1lcmljX2xpbWl0czxmckNvb3JkPjo6bWF4KCkpIHsKLSAgICAgICAgY291dCA8PCJFcnJvcjogRmxleFRBV29ya2VyOjppbml0Q29zdHMgZG9lcyBub3QgZmluZCB0cmFja0xvYyIgPDxlbmRsOwotICAgICAgICBleGl0KDEpOwotICAgICAgfQotICAgICAgLy9hdXRvIHRtcENvc3QgPSBhc3NpZ25Jcm91dGVfZ2V0Q29zdChpcm91dGUuZ2V0KCksIHRyYWNrTG9jLCBkcmNDb3N0KTsKLSAgICAgIGFzc2lnbklyb3V0ZV9nZXRDb3N0KGlyb3V0ZS5nZXQoKSwgdHJhY2tMb2MsIGRyY0Nvc3QpOwotICAgICAgaXJvdXRlLT5zZXRDb3N0KGRyY0Nvc3QpOwotICAgICAgdG90Q29zdCArPSBkcmNDb3N0OwotICAgICAgLy9pcm91dGUtPnNldERyY0Nvc3QoZHJjQ29zdCk7Ci0gICAgICAvL3RvdERyY0Nvc3QgKz0gZHJjQ29zdDsKLSAgICAgIGlmIChlbmFibGVPdXRwdXQgJiYgIWlzSW5pdFRBKCkpIHsKLSAgICAgICAgYm9vbCAgIGlzSCA9IChnZXREaXIoKSA9PSBmclByZWZSb3V0aW5nRGlyRW51bTo6ZnJjSG9yelByZWZSb3V0aW5nRGlyKTsKLSAgICAgICAgZG91YmxlIGRidSA9IGdldERlc2lnbigpLT5nZXRUb3BCbG9jaygpLT5nZXREQlVQZXJVVSgpOwotICAgICAgICBmclBvaW50IGJwLCBlcDsKLSAgICAgICAgZnJDb29yZCBiYywgZWMsIHRyYWNrTG9jOwotICAgICAgICBjb3V0IDw8aXJvdXRlLT5nZXRJZCgpIDw8IiAiIDw8aXJvdXRlLT5nZXRHdWlkZSgpLT5nZXROZXQoKS0+Z2V0TmFtZSgpOwotICAgICAgICBhdXRvIGd1aWRlTE51bSA9IGlyb3V0ZS0+Z2V0R3VpZGUoKS0+Z2V0QmVnaW5MYXllck51bSgpOwotICAgICAgICBmb3IgKGF1dG8gJnVQaW5GaWc6IGlyb3V0ZS0+Z2V0RmlncygpKSB7Ci0gICAgICAgICAgaWYgKHVQaW5GaWctPnR5cGVJZCgpID09IHRhY1BhdGhTZWcpIHsKLSAgICAgICAgICAgIGF1dG8gb2JqID0gc3RhdGljX2Nhc3Q8dGFQYXRoU2VnKj4odVBpbkZpZy5nZXQoKSk7Ci0gICAgICAgICAgICBvYmotPmdldFBvaW50cyhicCwgZXApOwotICAgICAgICAgICAgYmMgPSBpc0ggPyBicC54KCkgOiBicC55KCk7Ci0gICAgICAgICAgICBlYyA9IGlzSCA/IGVwLngoKSA6IGVwLnkoKTsKLSAgICAgICAgICAgIHRyYWNrTG9jID0gaXNIID8gYnAueSgpIDogYnAueCgpOwotICAgICAgICAgICAgY291dCA8PCIgKCIgPDxiYyAvIGRidSA8PCItLT4iIDw8ZWMgLyBkYnUgPDwiKSwgbGVuQCIgPDwoZWMgLSBiYykgLyBkYnUgPDwiLCB0cmFja0AiIDw8dHJhY2tMb2MgLyBkYnUKLSAgICAgICAgICAgICAgICAgPDwiLCAiIDw8Z2V0RGVzaWduKCktPmdldFRlY2goKS0+Z2V0TGF5ZXIoaXJvdXRlLT5nZXRHdWlkZSgpLT5nZXRCZWdpbkxheWVyTnVtKCkpLT5nZXROYW1lKCk7Ci0gICAgICAgICAgfSBlbHNlIGlmICh1UGluRmlnLT50eXBlSWQoKSA9PSB0YWNWaWEpIHsKLSAgICAgICAgICAgIGF1dG8gb2JqID0gc3RhdGljX2Nhc3Q8dGFWaWEqPih1UGluRmlnLmdldCgpKTsKLSAgICAgICAgICAgIGF1dG8gY3V0TE51bSA9IG9iai0+Z2V0VmlhRGVmKCktPmdldEN1dExheWVyTnVtKCk7Ci0gICAgICAgICAgICBvYmotPmdldE9yaWdpbihicCk7Ci0gICAgICAgICAgICBiYyA9IGlzSCA/IGJwLngoKSA6IGJwLnkoKTsKLSAgICAgICAgICAgIGNvdXQgPDxzdHJpbmcoKGN1dExOdW0gPiBndWlkZUxOdW0pID8gIiwgVUAiIDogIiwgREAiKSA8PGJjIC8gZGJ1OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL2NvdXQgPDwiLCB3bGVuX2hAIiA8PGlyb3V0ZS0+Z2V0V2xlbkhlbHBlcigpIDw8IiwgY29zdEAiIDw8aXJvdXRlLT5nZXRDb3N0KCkgPDwiLCBkcmNDb3N0QCIgPDxpcm91dGUtPmdldERyY0Nvc3QoKSA8PGVuZGw7Ci0gICAgICAgIGNvdXQgPDwiLCB3bGVuX2hAIiA8PGlyb3V0ZS0+Z2V0V2xlbkhlbHBlcigpIDw8IiwgY29zdEAiIDw8aXJvdXRlLT5nZXRDb3N0KCkgPDxlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi12b2lkIEZsZXhUQVdvcmtlcjo6c29ydElyb3V0ZXMoKSB7Ci0gIC8vYm9vbCBlbmFibGVPdXRwdXQgPSB0cnVlOwotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICAvLyBpbml0IGNvc3QKLSAgaWYgKGlzSW5pdFRBKCkpIHsKLSAgICBmb3IgKGF1dG8gJmlyb3V0ZTogaXJvdXRlcykgewotICAgICAgYWRkVG9SZWFzc2lnbklyb3V0ZXMoaXJvdXRlLmdldCgpKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgZm9yIChhdXRvICZpcm91dGU6IGlyb3V0ZXMpIHsKLSAgICAgIGlmIChpcm91dGUtPmdldENvc3QoKSkgewotICAgICAgICBhZGRUb1JlYXNzaWduSXJvdXRlcyhpcm91dGUuZ2V0KCkpOwotICAgICAgfQotICAgIH0KLSAgfQotICBpZiAoZW5hYmxlT3V0cHV0ICYmICFpc0luaXRUQSgpKSB7Ci0gICAgYm9vbCAgIGlzSCA9IChnZXREaXIoKSA9PSBmclByZWZSb3V0aW5nRGlyRW51bTo6ZnJjSG9yelByZWZSb3V0aW5nRGlyKTsKLSAgICBkb3VibGUgZGJ1ID0gZ2V0RGVzaWduKCktPmdldFRvcEJsb2NrKCktPmdldERCVVBlclVVKCk7Ci0gICAgZm9yIChhdXRvICZpcm91dGU6IHJlYXNzaWduSXJvdXRlcykgewotICAgICAgZnJQb2ludCBicCwgZXA7Ci0gICAgICBmckNvb3JkIGJjLCBlYywgdHJhY2tMb2M7Ci0gICAgICBjb3V0IDw8aXJvdXRlLT5nZXRJZCgpIDw8IiAiIDw8aXJvdXRlLT5nZXRHdWlkZSgpLT5nZXROZXQoKS0+Z2V0TmFtZSgpOwotICAgICAgYXV0byBndWlkZUxOdW0gPSBpcm91dGUtPmdldEd1aWRlKCktPmdldEJlZ2luTGF5ZXJOdW0oKTsKLSAgICAgIGZvciAoYXV0byAmdVBpbkZpZzogaXJvdXRlLT5nZXRGaWdzKCkpIHsKLSAgICAgICAgaWYgKHVQaW5GaWctPnR5cGVJZCgpID09IHRhY1BhdGhTZWcpIHsKLSAgICAgICAgICBhdXRvIG9iaiA9IHN0YXRpY19jYXN0PHRhUGF0aFNlZyo+KHVQaW5GaWcuZ2V0KCkpOwotICAgICAgICAgIG9iai0+Z2V0UG9pbnRzKGJwLCBlcCk7Ci0gICAgICAgICAgYmMgPSBpc0ggPyBicC54KCkgOiBicC55KCk7Ci0gICAgICAgICAgZWMgPSBpc0ggPyBlcC54KCkgOiBlcC55KCk7Ci0gICAgICAgICAgdHJhY2tMb2MgPSBpc0ggPyBicC55KCkgOiBicC54KCk7Ci0gICAgICAgICAgY291dCA8PCIgKCIgPDxiYyAvIGRidSA8PCItLT4iIDw8ZWMgLyBkYnUgPDwiKSwgbGVuQCIgPDwoZWMgLSBiYykgLyBkYnUgPDwiLCB0cmFja0AiIDw8dHJhY2tMb2MgLyBkYnUKLSAgICAgICAgICAgICAgIDw8IiwgIiA8PGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldExheWVyKGlyb3V0ZS0+Z2V0R3VpZGUoKS0+Z2V0QmVnaW5MYXllck51bSgpKS0+Z2V0TmFtZSgpOwotICAgICAgICB9IGVsc2UgaWYgKHVQaW5GaWctPnR5cGVJZCgpID09IHRhY1ZpYSkgewotICAgICAgICAgIGF1dG8gb2JqID0gc3RhdGljX2Nhc3Q8dGFWaWEqPih1UGluRmlnLmdldCgpKTsKLSAgICAgICAgICBhdXRvIGN1dExOdW0gPSBvYmotPmdldFZpYURlZigpLT5nZXRDdXRMYXllck51bSgpOwotICAgICAgICAgIG9iai0+Z2V0T3JpZ2luKGJwKTsKLSAgICAgICAgICBiYyA9IGlzSCA/IGJwLngoKSA6IGJwLnkoKTsKLSAgICAgICAgICBjb3V0IDw8c3RyaW5nKChjdXRMTnVtID4gZ3VpZGVMTnVtKSA/ICIsIFVAIiA6ICIsIERAIikgPDxiYyAvIGRidTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy9jb3V0IDw8Iiwgd2xlbl9oQCIgPDxpcm91dGUtPmdldFdsZW5IZWxwZXIoKSA8PCIsIGNvc3RAIiA8PGlyb3V0ZS0+Z2V0Q29zdCgpIDw8IiwgZHJjQ29zdEAiIDw8aXJvdXRlLT5nZXREcmNDb3N0KCkgPDxlbmRsOwotICAgICAgY291dCA8PCIsIHdsZW5faEAiIDw8aXJvdXRlLT5nZXRXbGVuSGVscGVyKCkgPDwiLCBjb3N0QCIgPDxpcm91dGUtPmdldENvc3QoKSA8PGVuZGw7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgRmxleFRBV29ya2VyOjppbml0Rml4ZWRPYmpzX2hlbHBlcihjb25zdCBmckJveCAmYm94LCBmckNvb3JkIGJsb2F0RGlzdCwgZnJMYXllck51bSBsTnVtLCBmck5ldCogbmV0KSB7Ci0gIC8vYm9vbCBlbmFibGVPdXRwdXQgPSB0cnVlOwotICBib29sIGVuYWJsZU91dHB1dCA9IGZhbHNlOwotICBkb3VibGUgZGJ1ID0gZ2V0VGVjaCgpLT5nZXREQlVQZXJVVSgpOwotICBmckJveCBibG9hdEJveDsKLSAgYm94LmJsb2F0KGJsb2F0RGlzdCwgYmxvYXRCb3gpOwotICBhdXRvIGNvbiA9IGdldERlc2lnbigpLT5nZXRUZWNoKCktPmdldExheWVyKGxOdW0pLT5nZXRTaG9ydENvbnN0cmFpbnQoKTsKLSAgYm9vbCBpc0ggPSAoZ2V0RGlyKCkgPT0gZnJQcmVmUm91dGluZ0RpckVudW06OmZyY0hvcnpQcmVmUm91dGluZ0Rpcik7Ci0gIGludCBpZHgxLCBpZHgyOwotICAvL2ZyQ29vcmQgeDEsIHgyOwotICBpZiAoaXNIKSB7Ci0gICAgZ2V0VHJhY2tJZHgoYmxvYXRCb3guYm90dG9tKCksIGJsb2F0Qm94LnRvcCgpLCAgIGxOdW0sIGlkeDEsIGlkeDIpOwotICAgIC8veDEgPSBibG9hdEJveC5ib3R0b20oKTsKLSAgICAvL3gyID0gYmxvYXRCb3gudG9wKCk7Ci0gIH0gZWxzZSB7Ci0gICAgZ2V0VHJhY2tJZHgoYmxvYXRCb3gubGVmdCgpLCAgIGJsb2F0Qm94LnJpZ2h0KCksIGxOdW0sIGlkeDEsIGlkeDIpOwotICAgIC8veDEgPSBibG9hdEJveC5sZWZ0KCk7Ci0gICAgLy94MiA9IGJsb2F0Qm94LnJpZ2h0KCk7Ci0gIH0KLSAgYXV0byAmdHJhY2tMb2NzID0gZ2V0VHJhY2tMb2NzKGxOdW0pOwotICAvL2F1dG8gJnRyYWNrcyA9IGdldFRyYWNrcyhsTnVtKTsKLSAgYXV0byAmd29ya2VyUmVnaW9uUXVlcnkgPSBnZXRXb3JrZXJSZWdpb25RdWVyeSgpOwotICBmb3IgKGludCBpID0gaWR4MTsgaSA8PSBpZHgyOyBpKyspIHsKLSAgICAvLyBuZXcKLSAgICAvL2F1dG8gJnRyYWNrID0gdHJhY2tzW2ldOwotICAgIC8vdHJhY2suYWRkVG9Db3N0KG5ldCwgeDEsIHgyLCAwKTsKLSAgICAvL3RyYWNrLmFkZFRvQ29zdChuZXQsIHgxLCB4MiwgMSk7Ci0gICAgLy90cmFjay5hZGRUb0Nvc3QobmV0LCB4MSwgeDIsIDIpOwotICAgIC8vIG9sZAotICAgIGF1dG8gdHJhY2tMb2MgPSB0cmFja0xvY3NbaV07Ci0gICAgZnJCb3ggdG1wQm94OwotICAgIGlmIChpc0gpIHsKLSAgICAgIHRtcEJveC5zZXQoYmxvYXRCb3gubGVmdCgpLCB0cmFja0xvYywgYmxvYXRCb3gucmlnaHQoKSwgdHJhY2tMb2MpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0bXBCb3guc2V0KHRyYWNrTG9jLCBibG9hdEJveC5ib3R0b20oKSwgdHJhY2tMb2MsIGJsb2F0Qm94LnRvcCgpKTsKLSAgICB9Ci0gICAgd29ya2VyUmVnaW9uUXVlcnkuYWRkQ29zdCh0bXBCb3gsIGxOdW0sIG5ldCwgY29uKTsKLSAgICBpZiAoZW5hYmxlT3V0cHV0KSB7Ci0gICAgICBjb3V0IDw8IiAgYWRkIGZpeGVkIG9iaiBjb3N0ICgiCi0gICAgICAgICAgIDw8dG1wQm94LmxlZnQoKSAgLyBkYnUgPDwiLCAiIDw8dG1wQm94LmJvdHRvbSgpIC8gZGJ1IDw8IikgKCIgCi0gICAgICAgICAgIDw8dG1wQm94LnJpZ2h0KCkgLyBkYnUgPDwiLCAiIDw8dG1wQm94LnRvcCgpICAgIC8gZGJ1IDw8IikgIiAKLSAgICAgICAgICAgPDxnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcihsTnVtKS0+Z2V0TmFtZSgpOwotICAgICAgaWYgKG5ldCAhPSBudWxscHRyKSB7Ci0gICAgICAgIGNvdXQgPDwiICIgPDxuZXQtPmdldE5hbWUoKTsKLSAgICAgIH0KLSAgICAgIGNvdXQgPDxlbmRsIDw8Zmx1c2g7Ci0gICAgfQotICB9Ci19Ci0KLQotdm9pZCBGbGV4VEFXb3JrZXI6OmluaXRGaXhlZE9ianMoKSB7Ci0gIC8vYm9vbCBlbmFibGVPdXRwdXQgPSBmYWxzZTsKLSAgLy8vL2Jvb2wgZW5hYmxlT3V0cHV0ID0gdHJ1ZTsKLSAgLy9kb3VibGUgZGJ1ID0gZ2V0VGVjaCgpLT5nZXREQlVQZXJVVSgpOwotICB2ZWN0b3I8cnFfcnB0cl92YWx1ZV90PGZyQmxvY2tPYmplY3Q+ID4gcmVzdWx0OwotICBmckJveCBib3g7Ci0gIGZyQ29vcmQgd2lkdGggPSAwOwotICBmckNvb3JkIGJsb2F0RGlzdCA9IDA7Ci0gIGZvciAoYXV0byBsYXllck51bSA9IGdldFRlY2goKS0+Z2V0Qm90dG9tTGF5ZXJOdW0oKTsgbGF5ZXJOdW0gPD0gZ2V0VGVjaCgpLT5nZXRUb3BMYXllck51bSgpOyArK2xheWVyTnVtKSB7Ci0gICAgcmVzdWx0LmNsZWFyKCk7Ci0gICAgaWYgKGdldFRlY2goKS0+Z2V0TGF5ZXIobGF5ZXJOdW0pLT5nZXRUeXBlKCkgIT0gZnJMYXllclR5cGVFbnVtOjpST1VUSU5HIHx8Ci0gICAgICAgIGdldFRlY2goKS0+Z2V0TGF5ZXIobGF5ZXJOdW0pLT5nZXREaXIoKSAgIT0gZ2V0RGlyKCkpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICB3aWR0aCA9IGdldFRlY2goKS0+Z2V0TGF5ZXIobGF5ZXJOdW0pLT5nZXRXaWR0aCgpOwotICAgIGdldFJlZ2lvblF1ZXJ5KCktPnF1ZXJ5KGdldEV4dEJveCgpLCBsYXllck51bSwgcmVzdWx0KTsKLSAgICBmb3IgKGF1dG8gJltib29zdGIsIG9ial06IHJlc3VsdCkgewotICAgICAgLy8gaW5zdHRlcm0gdGVybQotICAgICAgaWYgKG9iai0+dHlwZUlkKCkgPT0gZnJjVGVybSB8fCBvYmotPnR5cGVJZCgpID09IGZyY0luc3RUZXJtKSB7Ci0gICAgICAgIGJveC5zZXQoYm9vc3RiLm1pbl9jb3JuZXIoKS54KCkrMSwgYm9vc3RiLm1pbl9jb3JuZXIoKS55KCkrMSwgYm9vc3RiLm1heF9jb3JuZXIoKS54KCktMSwgYm9vc3RiLm1heF9jb3JuZXIoKS55KCktMSk7Ci0gICAgICAgIGJsb2F0RGlzdCA9IFRBU0hBUEVCTE9BVFdJRFRIICogd2lkdGg7Ci0gICAgICAgIGZyTmV0KiBuZXRQdHIgPSBudWxscHRyOwotICAgICAgICBpZiAob2JqLT50eXBlSWQoKSA9PSBmcmNUZXJtKSB7Ci0gICAgICAgICAgbmV0UHRyID0gc3RhdGljX2Nhc3Q8ZnJUZXJtKj4ob2JqKS0+Z2V0TmV0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbmV0UHRyID0gc3RhdGljX2Nhc3Q8ZnJJbnN0VGVybSo+KG9iaiktPmdldE5ldCgpOwotICAgICAgICB9Ci0gICAgICAgIGluaXRGaXhlZE9ianNfaGVscGVyKGJveCwgYmxvYXREaXN0LCBsYXllck51bSwgbmV0UHRyKTsKLSAgICAgIC8vIHNuZXQKLSAgICAgIH0gZWxzZSBpZiAob2JqLT50eXBlSWQoKSA9PSBmcmNQYXRoU2VnIHx8IG9iai0+dHlwZUlkKCkgPT0gZnJjVmlhKSB7Ci0gICAgICAgIGJveC5zZXQoYm9vc3RiLm1pbl9jb3JuZXIoKS54KCkrMSwgYm9vc3RiLm1pbl9jb3JuZXIoKS55KCkrMSwgYm9vc3RiLm1heF9jb3JuZXIoKS54KCktMSwgYm9vc3RiLm1heF9jb3JuZXIoKS55KCktMSk7Ci0gICAgICAgIGJsb2F0RGlzdCA9IFRBU0hBUEVCTE9BVFdJRFRIICogd2lkdGg7Ci0gICAgICAgIGZyTmV0KiBuZXRQdHIgPSBudWxscHRyOwotICAgICAgICBpZiAob2JqLT50eXBlSWQoKSA9PSBmcmNQYXRoU2VnKSB7Ci0gICAgICAgICAgbmV0UHRyID0gc3RhdGljX2Nhc3Q8ZnJQYXRoU2VnKj4ob2JqKS0+Z2V0TmV0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbmV0UHRyID0gc3RhdGljX2Nhc3Q8ZnJWaWEqPihvYmopLT5nZXROZXQoKTsKLSAgICAgICAgfQotICAgICAgICBpbml0Rml4ZWRPYmpzX2hlbHBlcihib3gsIGJsb2F0RGlzdCwgbGF5ZXJOdW0sIG5ldFB0cik7Ci0gICAgICB9IGVsc2UgaWYgKG9iai0+dHlwZUlkKCkgPT0gZnJjQmxvY2thZ2UgfHwgb2JqLT50eXBlSWQoKSA9PSBmcmNJbnN0QmxvY2thZ2UpIHsKLSAgICAgICAgaWYgKFVTRU1JTlNQQUNJTkdfT0JTKSB7Ci0gICAgICAgICAgYm94LnNldChib29zdGIubWluX2Nvcm5lcigpLngoKSsxLCBib29zdGIubWluX2Nvcm5lcigpLnkoKSsxLCBib29zdGIubWF4X2Nvcm5lcigpLngoKS0xLCBib29zdGIubWF4X2Nvcm5lcigpLnkoKS0xKTsKLSAgICAgICAgICBibG9hdERpc3QgPSBUQVNIQVBFQkxPQVRXSURUSCAqIHdpZHRoOwotICAgICAgICAgIGluaXRGaXhlZE9ianNfaGVscGVyKGJveCwgYmxvYXREaXN0LCBsYXllck51bSwgbnVsbHB0cik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgYm94LnNldChib29zdGIubWluX2Nvcm5lcigpLngoKSsxLCBib29zdGIubWluX2Nvcm5lcigpLnkoKSsxLCBib29zdGIubWF4X2Nvcm5lcigpLngoKS0xLCBib29zdGIubWF4X2Nvcm5lcigpLnkoKS0xKTsKLSAgICAgICAgICBibG9hdERpc3QgPSBUQVNIQVBFQkxPQVRXSURUSCAqIHdpZHRoOwotICAgICAgICAgIGluaXRGaXhlZE9ianNfaGVscGVyKGJveCwgYmxvYXREaXN0LCBsYXllck51bSwgbnVsbHB0cik7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvdXQgPDwiV2FybmluZzogdW5zdXBwb3J0ZWQgdHlwZSBpbiBpbml0Rml4ZWRPYmpzIiA8PGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLQotdm9pZCBGbGV4VEFXb3JrZXI6OmluaXQoKSB7Ci0gIHJxLmluaXQoKTsKLSAgaW5pdFRyYWNrcygpOwotICBpZiAoZ2V0VEFJdGVyKCkgIT0gLTEpIHsKLSAgICBpbml0Rml4ZWRPYmpzKCk7Ci0gIH0KLSAgaW5pdElyb3V0ZXMoKTsKLSAgaWYgKGdldFRBSXRlcigpICE9IC0xKSB7Ci0gICAgaW5pdENvc3RzKCk7Ci0gICAgc29ydElyb3V0ZXMoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvdGEvRmxleFRBX3JxLmNwcCBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL3RhL0ZsZXhUQV9ycS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYWRiNGIuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvdGEvRmxleFRBX3JxLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKiBBdXRob3JzOiBMdXRvbmcgV2FuZyBhbmQgQmFuZ3FpIFh1ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAidGEvRmxleFRBLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgZnI7Ci0KLWZyRGVzaWduKiBGbGV4VEFXb3JrZXJSZWdpb25RdWVyeTo6Z2V0RGVzaWduKCkgY29uc3QgewotICByZXR1cm4gdGFXb3JrZXItPmdldERlc2lnbigpOwotfQotCi12b2lkIEZsZXhUQVdvcmtlclJlZ2lvblF1ZXJ5OjphZGQodGFQaW5GaWcqIGZpZykgewotICBib3hfdCBib29zdGI7Ci0gIGZyUG9pbnQgYnAsIGVwOwotICBpZiAoZmlnLT50eXBlSWQoKSA9PSB0YWNQYXRoU2VnKSB7Ci0gICAgYXV0byBvYmogPSBzdGF0aWNfY2FzdDx0YVBhdGhTZWcqPihmaWcpOwotICAgIG9iai0+Z2V0UG9pbnRzKGJwLCBlcCk7Ci0gICAgYm9vc3RiID0gYm94X3QocG9pbnRfdChicC54KCksIGJwLnkoKSksIHBvaW50X3QoZXAueCgpLCBlcC55KCkpKTsKLSAgICBzaGFwZXMuYXQob2JqLT5nZXRMYXllck51bSgpKS5pbnNlcnQobWFrZV9wYWlyKGJvb3N0Yiwgb2JqKSk7Ci0gIH0gZWxzZSBpZiAoZmlnLT50eXBlSWQoKSA9PSB0YWNWaWEpIHsKLSAgICBhdXRvIG9iaiA9IHN0YXRpY19jYXN0PHRhVmlhKj4oZmlnKTsKLSAgICBvYmotPmdldE9yaWdpbihicCk7Ci0gICAgYm9vc3RiID0gYm94X3QocG9pbnRfdChicC54KCksIGJwLnkoKSksIHBvaW50X3QoYnAueCgpLCBicC55KCkpKTsKLSAgICBzaGFwZXMuYXQob2JqLT5nZXRWaWFEZWYoKS0+Z2V0Q3V0TGF5ZXJOdW0oKSkuaW5zZXJ0KG1ha2VfcGFpcihib29zdGIsIG9iaikpOwotICB9IGVsc2UgewotICAgIGNvdXQgPDwiRXJyb3I6IHVuc3VwcG9ydGVkIHJlZ2lvbiBxdWVyeSBhZGQiIDw8ZW5kbDsKLSAgfQotfQotCi12b2lkIEZsZXhUQVdvcmtlclJlZ2lvblF1ZXJ5OjpyZW1vdmUodGFQaW5GaWcqIGZpZykgewotICBib3hfdCBib29zdGI7Ci0gIGZyUG9pbnQgYnAsIGVwOwotICBpZiAoZmlnLT50eXBlSWQoKSA9PSB0YWNQYXRoU2VnKSB7Ci0gICAgYXV0byBvYmogPSBzdGF0aWNfY2FzdDx0YVBhdGhTZWcqPihmaWcpOwotICAgIG9iai0+Z2V0UG9pbnRzKGJwLCBlcCk7Ci0gICAgYm9vc3RiID0gYm94X3QocG9pbnRfdChicC54KCksIGJwLnkoKSksIHBvaW50X3QoZXAueCgpLCBlcC55KCkpKTsKLSAgICBzaGFwZXMuYXQob2JqLT5nZXRMYXllck51bSgpKS5yZW1vdmUobWFrZV9wYWlyKGJvb3N0Yiwgb2JqKSk7Ci0gIH0gZWxzZSBpZiAoZmlnLT50eXBlSWQoKSA9PSB0YWNWaWEpIHsKLSAgICBhdXRvIG9iaiA9IHN0YXRpY19jYXN0PHRhVmlhKj4oZmlnKTsKLSAgICBvYmotPmdldE9yaWdpbihicCk7Ci0gICAgYm9vc3RiID0gYm94X3QocG9pbnRfdChicC54KCksIGJwLnkoKSksIHBvaW50X3QoYnAueCgpLCBicC55KCkpKTsKLSAgICBzaGFwZXMuYXQob2JqLT5nZXRWaWFEZWYoKS0+Z2V0Q3V0TGF5ZXJOdW0oKSkucmVtb3ZlKG1ha2VfcGFpcihib29zdGIsIG9iaikpOwotICB9IGVsc2UgewotICAgIGNvdXQgPDwiRXJyb3I6IHVuc3VwcG9ydGVkIHJlZ2lvbiBxdWVyeSBhZGQiIDw8ZW5kbDsKLSAgfQotfQotCi12b2lkIEZsZXhUQVdvcmtlclJlZ2lvblF1ZXJ5OjpxdWVyeShjb25zdCBmckJveCAmYm94LCBmckxheWVyTnVtIGxheWVyTnVtLCBzZXQ8dGFQaW4qLCBmckJsb2NrT2JqZWN0Q29tcD4gJnJlc3VsdCkgewotICB2ZWN0b3I8cnFfcnB0cl92YWx1ZV90PHRhUGluRmlnPiA+IHRlbXA7Ci0gIGJveF90IGJvb3N0YiA9IGJveF90KHBvaW50X3QoYm94LmxlZnQoKSwgYm94LmJvdHRvbSgpKSwgcG9pbnRfdChib3gucmlnaHQoKSwgYm94LnRvcCgpKSk7Ci0gIHNoYXBlcy5hdChsYXllck51bSkucXVlcnkoYmdpOjppbnRlcnNlY3RzKGJvb3N0YiksIGJhY2tfaW5zZXJ0ZXIodGVtcCkpOwotICAvL3RyYW5zZm9ybSh0ZW1wLmJlZ2luKCksIHRlbXAuZW5kKCksIGJhY2tfaW5zZXJ0ZXIocmVzdWx0KSwgW10oYXV0byAma3YpIHtyZXR1cm4ga3Yuc2Vjb25kLT5nZXRQaW4oKTt9KTsKLSAgZm9yIChhdXRvICZbYm9vc3RiLCBycHRyXTogdGVtcCkgewotICAgIHJlc3VsdC5pbnNlcnQocnB0ci0+Z2V0UGluKCkpOwotICB9Ci19Ci0KLXZvaWQgRmxleFRBV29ya2VyUmVnaW9uUXVlcnk6OmluaXQoKSB7Ci0gIGludCBudW1MYXllcnMgPSBnZXREZXNpZ24oKS0+Z2V0VGVjaCgpLT5nZXRMYXllcnMoKS5zaXplKCk7Ci0gIHNoYXBlcy5jbGVhcigpOwotICBzaGFwZXMucmVzaXplKG51bUxheWVycyk7Ci0gIGNvc3RzLmNsZWFyKCk7Ci0gIGNvc3RzLnJlc2l6ZShudW1MYXllcnMpOwotICAvL2Fwcy5jbGVhcigpOwotICAvL2Fwcy5yZXNpemUobnVtTGF5ZXJzKTsKLSAgLy92ZWN0b3I8dmVjdG9yPHJxX3JwdHJfdmFsdWVfdDxkckNvbm5GaWc+ID4gPiBhbGxTaGFwZXMobnVtTGF5ZXJzKTsKLSAgLy9mb3IgKGF1dG8gJm5ldDogZ2V0RFJXb3JrZXIoKS0+Z2V0TmV0cygpKSB7Ci0gIC8vICBmb3IgKGF1dG8gJmNvbm5GaWc6IG5ldC0+Z2V0Um91dGVDb25uRmlncygpKSB7Ci0gIC8vICAgIGFkZChjb25uRmlnLmdldCgpLCBhbGxTaGFwZXMpOwotICAvLyAgfQotICAvLyAgZm9yIChhdXRvICZjb25uRmlnOiBuZXQtPmdldEV4dENvbm5GaWdzKCkpIHsKLSAgLy8gICAgYWRkKGNvbm5GaWcuZ2V0KCksIGFsbFNoYXBlcyk7Ci0gIC8vICB9Ci0gIC8vfQotICAvL2ZvciAoYXV0byBpID0gMDsgaSA8IG51bUxheWVyczsgaSsrKSB7Ci0gIC8vICBzaGFwZXMuYXQoaSkgPSBib29zdDo6bW92ZShiZ2k6OnJ0cmVlPHJxX3JwdHJfdmFsdWVfdDxkckNvbm5GaWc+LCBiZ2k6OnF1YWRyYXRpYzwxNj4gPihhbGxTaGFwZXMuYXQoaSkpKTsKLSAgLy8gIGFsbFNoYXBlcy5hdChpKS5jbGVhcigpOwotICAvLyAgYWxsU2hhcGVzLmF0KGkpLnNocmlua190b19maXQoKTsKLSAgLy8gIC8vaWYgKFZFUkJPU0UgPiAwKSB7Ci0gIC8vICAvLyAgY291dCA8PCIgIGNvbXBsZXRlICIgPDxkZXNpZ24tPmdldFRlY2goKS0+Z2V0TGF5ZXIoaSktPmdldE5hbWUoKSA8PGVuZGw7Ci0gIC8vICAvL30KLSAgLy99Ci19Ci0KLXZvaWQgRmxleFRBV29ya2VyUmVnaW9uUXVlcnk6OmFkZENvc3QoY29uc3QgZnJCb3ggJmJveCwgZnJMYXllck51bSBsYXllck51bSwgZnJCbG9ja09iamVjdCogb2JqLCBmckNvbnN0cmFpbnQqIGNvbikgewotICBjb3N0cy5hdChsYXllck51bSkuaW5zZXJ0KG1ha2VfcGFpcihib3hfdChwb2ludF90KGJveC5sZWZ0KCksIGJveC5ib3R0b20oKSksIHBvaW50X3QoYm94LnJpZ2h0KCksIGJveC50b3AoKSkpLCBtYWtlX3BhaXIob2JqLCBjb24pKSk7Ci19Ci0KLXZvaWQgRmxleFRBV29ya2VyUmVnaW9uUXVlcnk6OnJlbW92ZUNvc3QoY29uc3QgZnJCb3ggJmJveCwgZnJMYXllck51bSBsYXllck51bSwgZnJCbG9ja09iamVjdCogb2JqLCBmckNvbnN0cmFpbnQqIGNvbikgewotICBjb3N0cy5hdChsYXllck51bSkucmVtb3ZlKG1ha2VfcGFpcihib3hfdChwb2ludF90KGJveC5sZWZ0KCksIGJveC5ib3R0b20oKSksIHBvaW50X3QoYm94LnJpZ2h0KCksIGJveC50b3AoKSkpLCBtYWtlX3BhaXIob2JqLCBjb24pKSk7Ci19Ci0KLXZvaWQgRmxleFRBV29ya2VyUmVnaW9uUXVlcnk6OnF1ZXJ5Q29zdChjb25zdCBmckJveCAmYm94LCBmckxheWVyTnVtIGxheWVyTnVtLCB2ZWN0b3I8cnFfZ2VuZXJpY192YWx1ZV90PHBhaXI8ZnJCbG9ja09iamVjdCosIGZyQ29uc3RyYWludCo+ID4gPiAmcmVzdWx0KSB7Ci0gIGJveF90IGJvb3N0YiA9IGJveF90KHBvaW50X3QoYm94LmxlZnQoKSwgYm94LmJvdHRvbSgpKSwgcG9pbnRfdChib3gucmlnaHQoKSwgYm94LnRvcCgpKSk7Ci0gIGNvc3RzLmF0KGxheWVyTnVtKS5xdWVyeShiZ2k6OmludGVyc2VjdHMoYm9vc3RiKSwgYmFja19pbnNlcnRlcihyZXN1bHQpKTsKLX0KLQotLy92b2lkIEZsZXhUQVdvcmtlclJlZ2lvblF1ZXJ5OjphZGRBUChjb25zdCBmckJveCAmYm94LCBmckxheWVyTnVtIGxheWVyTnVtLCBmckJsb2NrT2JqZWN0KiBvYmosIGZyQ29uc3RyYWludCogY29uKSB7Ci0vLyAgYXBzLmF0KGxheWVyTnVtKS5pbnNlcnQobWFrZV9wYWlyKGJveF90KHBvaW50X3QoYm94LmxlZnQoKSwgYm94LmJvdHRvbSgpKSwgcG9pbnRfdChib3gucmlnaHQoKSwgYm94LnRvcCgpKSksIG9iaikpOwotLy99Ci0vLwotLy92b2lkIEZsZXhUQVdvcmtlclJlZ2lvblF1ZXJ5OjpyZW1vdmVBUChjb25zdCBmckJveCAmYm94LCBmckxheWVyTnVtIGxheWVyTnVtLCBmckJsb2NrT2JqZWN0KiBvYmosIGZyQ29uc3RyYWludCogY29uKSB7Ci0vLyAgYXBzLmF0KGxheWVyTnVtKS5yZW1vdmUobWFrZV9wYWlyKGJveF90KHBvaW50X3QoYm94LmxlZnQoKSwgYm94LmJvdHRvbSgpKSwgcG9pbnRfdChib3gucmlnaHQoKSwgYm94LnRvcCgpKSksIG9iaikpOwotLy99Ci0vLwotLy92b2lkIEZsZXhUQVdvcmtlclJlZ2lvblF1ZXJ5OjpxdWVyeUFQKGNvbnN0IGZyQm94ICZib3gsIGZyTGF5ZXJOdW0gbGF5ZXJOdW0sIHZlY3RvcjxycV9ycHRyX3ZhbHVlX3Q8ZnJCbG9ja09iamVjdD4gPiAmcmVzdWx0KSB7Ci0vLyAgYm94X3QgYm9vc3RiID0gYm94X3QocG9pbnRfdChib3gubGVmdCgpLCBib3guYm90dG9tKCkpLCBwb2ludF90KGJveC5yaWdodCgpLCBib3gudG9wKCkpKTsKLS8vICBhcHMuYXQobGF5ZXJOdW0pLnF1ZXJ5KGJnaTo6aW50ZXJzZWN0cyhib29zdGIpLCBiYWNrX2luc2VydGVyKHJlc3VsdCkpOwotLy99CmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvUGRuUGluRHVtcGVyL3NyYy90YS9NYWtlZmlsZSBiL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL3RhL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDFlMTJjLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL3RhL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyBzdWJkaXIgYW5kIG9iamVjdHMgaW4gY3VycmVudCBkaXIKLVNVQkRJUlMJPSAKLU9CSkVDVFMJPSBGbGV4VEEubyBGbGV4VEFfaW5pdC5vIEZsZXhUQV9hc3NpZ24ubyBGbGV4VEFfZW5kLm8gRmxleFRBX3JxLm8KLQotCi1hbGw6c3ViZGlycyAke09CSkVDVFN9Ci0KLQkKLWNsZWFuOmNsZWFuc3ViZGlycwotCXJtIC1mICR7T0JKRUNUU30KLQkKLWluY2x1ZGUgJHtNQUtFSU5DTFVERX0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9QZG5QaW5EdW1wZXIvc3JjL3V0aWxpdHkuY3BwIGIvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvdXRpbGl0eS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ODdjZDQuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL1BkblBpbkR1bXBlci9zcmMvdXRpbGl0eS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyogQXV0aG9yczogTHV0b25nIFdhbmcgYW5kIEJhbmdxaSBYdSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotLy8jaW5jbHVkZSAiRmxleFJvdXRlLmgiCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlICJnbG9iYWwuaCIKLSNpbmNsdWRlICJmckRlc2lnbi5oIgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBmcjsKLQotdm9pZCBmckRlc2lnbjo6cHJpbnRBbGxDb21wcygpIHsKLSAgY291dCA8PGVuZGwgPDwicHJpbnQgYWxsIGNvbXBvbmVudHM6ICI7Ci0gIGZvciAoYXV0byAmbTogdG9wQmxvY2stPmdldEluc3RzKCkpIHsKLSAgICBjb3V0IDw8ZW5kbCA8PCptIDw8ZW5kbDsKLSAgfQotfQotCi12b2lkIGZyRGVzaWduOjpwcmludEFsbE1hY3JvcygpIHsKLSAgY291dCA8PGVuZGw7Ci0gIGNvdXQgPDwicHJpbnQgYWxsIG1hY3JvczogIiA8PGVuZGw7Ci0gIGZvciAoYXV0byAmbTogcmVmQmxvY2tzKSB7Ci0gICAgY291dCA8PGVuZGwgPDwqKG0pIDw8ZW5kbDsKLSAgfQotfQotCi0vLy8vdm9pZCBGbGV4Um91dGU6OnByaW50QWxsTmV0cygpIHsKLS8vLy8gIGNvdXQgPDxlbmRsOwotLy8vLyAgY291dCA8PCJwcmludCBhbGwgbmV0czogIiA8PGVuZGw7Ci0vLy8vICBmb3IgKGF1dG8gJm06IG5ldHMpIHsKLS8vLy8gICAgY291dCA8PGVuZGwgPDwqKG0uc2Vjb25kKSA8PGVuZGw7Ci0vLy8vICB9Ci0vLy8vfQotCi12b2lkIGZyRGVzaWduOjpwcmludEFsbFRlcm1zKCkgewotICBjb3V0IDw8ZW5kbCA8PCJwcmludCBhbGwgdGVybWluYWxzOiAiOwotICBmb3IgKGF1dG8gJm06IHRvcEJsb2NrLT5nZXRUZXJtcygpKSB7Ci0gICAgY291dCA8PGVuZGwgPDwqbSA8PGVuZGw7Ci0gIH0KLX0KLQotdm9pZCBmclRlY2hPYmplY3Q6OnByaW50QWxsVmlhcygpIHsKLSAgY291dCA8PGVuZGwgPDwicHJpbnQgYWxsIHZpYXM6ICIgPDxlbmRsOwotICBmb3IgKGF1dG8gJm06IHZpYXMpIHsKLSAgICBjb3V0IDw8ZW5kbCA8PCoobSkgPDxlbmRsOwotICB9Ci19Ci0KLXZvaWQgZnJEZXNpZ246OnByaW50Q01hcCgpIHsKLSAgY291dCA8PGVuZGwgPDwicHJpbnQgY21hcDogIjsKLSAgaW50IHhDbnQgPSAwOwotICBpbnQgeUNudCA9IDA7Ci0gIGZvciAoYXV0byAmZ2NwOiB0b3BCbG9jay0+Z2V0R0NlbGxQYXR0ZXJucygpKSB7Ci0gICAgaWYgKGdjcC5pc0hvcml6b250YWwoKSkgewotICAgICAgeUNudCA9IGdjcC5nZXRDb3VudCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICB4Q250ID0gZ2NwLmdldENvdW50KCk7Ci0gICAgfQotICB9Ci0gIGNvdXQgPDwieC95ID0gIiA8PHhDbnQgPDwiICIgPDx5Q250IDw8ZW5kbDsKLSAgYXV0byAmY21hcCA9IHRvcEJsb2NrLT5nZXRDTWFwKCk7Ci0gIGZvciAoaW50IGxOdW0gPSAwOyBsTnVtIDw9IChpbnQpZ2V0VGVjaCgpLT5nZXRMYXllcnMoKS5zaXplKCk7IGxOdW0gKz0gMikgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgeENudDsgaSsrKSB7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IHlDbnQ7IGorKykgewotICAgICAgICBjb3V0IDw8IngveS96L3MvdC9sL2UxL2UyL3UgPSAiIAotICAgICAgICAgICAgIDw8aSA8PCIgIiA8PGogPDwiICIgPDxsTnVtIDw8IiAiCi0gICAgICAgICAgICAgPDxjbWFwLmdldFN1cHBseShpLGosbE51bSkgPDwiICIKLSAgICAgICAgICAgICA8PGNtYXAuZ2V0VGhyb3VnaERlbWFuZChpLGosbE51bSkgPDwiICIKLSAgICAgICAgICAgICA8PGNtYXAuZ2V0TG9jYWxEZW1hbmQoaSxqLGxOdW0pIDw8IiAiCi0gICAgICAgICAgICAgPDxjbWFwLmdldEVkZ2UxRGVtYW5kKGksaixsTnVtKSA8PCIgIgotICAgICAgICAgICAgIDw8Y21hcC5nZXRFZGdlMkRlbWFuZChpLGosbE51bSkgPDwiICIKLSAgICAgICAgICAgICA8PGNtYXAuZ2V0VXBEZW1hbmQoaSxqLGxOdW0pIDw8IiAiOwotICAgICAgICBpZiAoY21hcC5nZXRUaHJvdWdoRGVtYW5kKGksaixsTnVtKSArIGNtYXAuZ2V0TG9jYWxEZW1hbmQoaSxqLGxOdW0pICsKLSAgICAgICAgICAgIGNtYXAuZ2V0RWRnZTFEZW1hbmQoaSxqLGxOdW0pICAgPiBjbWFwLmdldFN1cHBseShpLGosbE51bSkgfHwKLSAgICAgICAgICAgIGNtYXAuZ2V0VGhyb3VnaERlbWFuZChpLGosbE51bSkgKyBjbWFwLmdldExvY2FsRGVtYW5kKGksaixsTnVtKSArCi0gICAgICAgICAgICBjbWFwLmdldEVkZ2UyRGVtYW5kKGksaixsTnVtKSAgID4gY21hcC5nZXRTdXBwbHkoaSxqLGxOdW0pKSB7Ci0gICAgICAgICAgY291dCA8PCJHQ2VsbCBvdmVyZmxvdyI7Ci0gICAgICAgIH0KLSAgICAgICAgY291dCA8PGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvc2NyaXB0cy9QZG5QaW5EdW1wZXIgYi9zY3JpcHRzL3Bkbi9zcmMvc2NyaXB0cy9QZG5QaW5EdW1wZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVlZjUwMWEuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL3NjcmlwdHMvUGRuUGluRHVtcGVyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL3NjcmlwdHMvYXBwbHlfcGRuIGIvc2NyaXB0cy9wZG4vc3JjL3NjcmlwdHMvYXBwbHlfcGRuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNGY4YjM1Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9zY3JpcHRzL2FwcGx5X3BkbgorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLSMhL2Jpbi9zaAotIyB0aGUgbmV4dCBsaW5lIHJlc3RhcnRzIHVzaW5nIHRjbHNoIFwKLWV4ZWMgdGNsc2ggIiQwIiAkezErIiRAIn0KLQotcGFja2FnZSByZXF1aXJlIFRjbCA4LjUKLXBhY2thZ2UgcmVxdWlyZSBwZG4KLQotIyBub3QgYXZhaWxhYmxlIGluIDguNToKLXByb2MgbG1hcCBhcmdzIHsKLSAgICBzZXQgYm9keSBbbGluZGV4ICRhcmdzIGVuZF0KLSAgICBzZXQgYXJncyBbbHJhbmdlICRhcmdzIDAgZW5kLTFdCi0gICAgc2V0IG4gMAotICAgIHNldCBwYWlycyBbbGlzdF0KLSAgICBmb3JlYWNoIHt2YXJuYW1lcyBsaXN0dmFsfSAkYXJncyB7Ci0gICAgICAgIHNldCB2YXJsaXN0IFtsaXN0XQotICAgICAgICBmb3JlYWNoIHZhcm5hbWUgJHZhcm5hbWVzIHsKLSAgICAgICAgICAgIHVwdmFyIDEgJHZhcm5hbWUgdmFyJG4KLSAgICAgICAgICAgIGxhcHBlbmQgdmFybGlzdCB2YXIkbgotICAgICAgICAgICAgaW5jciBuCi0gICAgICAgIH0KLSAgICAgICAgbGFwcGVuZCBwYWlycyAkdmFybGlzdCAkbGlzdHZhbAotICAgIH0KLSAgICBzZXQgdGVtcCBbbGlzdF0KLSAgICBmb3JlYWNoIHsqfSRwYWlycyB7Ci0gICAgICAgIGxhcHBlbmQgdGVtcCBbdXBsZXZlbCAxICRib2R5XQotICAgIH0KLSAgICBzZXQgdGVtcAotfQotCi0jIElucHV0ID0gTWFjcm8tcGFja2VkIERFRiAoY3VycmVudGx5IGZyb20gaW5ub3Z1cykKLSMgT3V0cHV0ID0gRGVmIHdpdGggUEROCi0KLXNldCA6OnN0YXJ0X3RpbWUgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQotCi1wZG4gaW5pdCBbbGluZGV4ICRhcmd2IDBdCi0KLXB1dHMgIlRvdGFsIHdhbGx0aW1lIHRpbGwgUEROIHNldHVwID0gW2V4cHIge1tleHByIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdIC0gJDo6c3RhcnRfdGltZX1dLzEwMDAuMH1dIHNlY29uZHMiCi0KLXB1dHMgIiMjUG93ZXIgRGVsaXZlcnkgTmV0d29yayBHZW5lcmF0b3I6IEdlbmVyYXRpbmcgUEROIERFRiIKLXNldCA6OnN0YXJ0X3RpbWUgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQotCi1wZG4gcG93ZXJfZ3JpZAotcGRuIG91dHB1dF9kZWYKLQotcHV0cyAiVG90YWwgd2FsbHRpbWUgdG8gZ2VuZXJhdGUgUEROIERFRiA9IFtleHByIHtbZXhwciB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSAtICQ6OnN0YXJ0X3RpbWV9XS8xMDAwLjB9XSBzZWNvbmRzIgotCi0KLXB1dHMgIk1hY3JvLXBhY2tlZCBpbnB1dCBkZWYgaXMgJEZwT3V0RGVmIgotcHV0cyAiIyNUQVNLIDggRmluYWwgREVGIGdlbmVyYXRpb24gd2l0aCBQRE4gOiBTdGl0Y2hpbmcgbWFjcm8tcGFja2VkIERFRiB3aXRoIFNQRUNJQUwgTkVUUyIKLQotc2V0IGNtZCAiZXhlYyBkZWZfZ2VuICQ6OkZwT3V0RGVmIFtwZG4gZ2V0IGNvbmZpZyBkZWZfb3V0cHV0XSAkOjpkZXNpZ24gJHs6OmRlc2lnbn1fcG9zdF9UOC5kZWYiCi1ldmFsICRjbWQKLQotcHV0cyAiVG90YWwgd2FsbHRpbWUgdGlsbCBmaW5hbCBERUYgc3RpdGNoaW5nID0gW2V4cHIge1tleHByIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdIC0gJDo6c3RhcnRfdGltZX1dLzEwMDAuMH1dIHNlY29uZHMiCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9zY3JpcHRzL2NyZWF0ZV9wZ19ncmlkLnRjbCBiL3NjcmlwdHMvcGRuL3NyYy9zY3JpcHRzL2NyZWF0ZV9wZ19ncmlkLnRjbAppbmRleCAwOTk3YmFkLi42ODAzZDRlIDEwMDc1NQotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvc2NyaXB0cy9jcmVhdGVfcGdfZ3JpZC50Y2wKKysrIGIvc2NyaXB0cy9wZG4vc3JjL3NjcmlwdHMvY3JlYXRlX3BnX2dyaWQudGNsCkBAIC0yNiw4ICsyNiwyMiBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKIG5hbWVzcGFjZSBldmFsIDo6cGRuIHsKKyAgICB2YXJpYWJsZSBibG9jaworICAgIHZhcmlhYmxlIHRlY2gKKyAgICB2YXJpYWJsZSBsaWJzCiAgICAgdmFyaWFibGUgZGVzaWduX2RhdGEge30KKyAgICB2YXJpYWJsZSBkZWZhdWx0X2dyaWRfZGF0YSB7fQogICAgIHZhcmlhYmxlIGRlZl9vdXRwdXQKKyAgICB2YXJpYWJsZSB3aWR0aHMKKyAgICB2YXJpYWJsZSBwaXRjaGVzCisgICAgdmFyaWFibGUgbG9mZnNldAorICAgIHZhcmlhYmxlIGJvZmZzZXQKKyAgICB2YXJpYWJsZSBzaXRlCisgICAgdmFyaWFibGUgc2l0ZV93aWR0aAorICAgIHZhcmlhYmxlIHNpdGVfbmFtZQorICAgIHZhcmlhYmxlIHJvd19oZWlnaHQKKyAgICB2YXJpYWJsZSBtZXRhbF9sYXllcnMge30KKyAgICB2YXJpYWJsZSBtZXRhbF9sYXllcnNfZGlyIHt9CiAgICAgCiAgICAgIyMgcHJvY2VkdXJlIGZvciBmaWxlIGV4aXN0ZW5jZSBjaGVjaywgcmV0dXJucyAwIGlmIGZpbGUgZG9lcyBub3QgZXhpc3Qgb3IgZmlsZSBleGlzdHMsIGJ1dCBlbXB0eQogICAgIHByb2MgLXMge2ZpbGVuYW1lfSB7CkBAIC0zOSwxNjYgKzUzLDIwMCBAQAogICAgICAgICAKICAgICAgICAgcmV0dXJuIFtkaWN0IGdldCAkZGVzaWduX2RhdGEgeyp9JGFyZ3NdCiAgICAgfQorICAgIHByb2MgZ2V0X21hY3JvX3Bvd2VyX3BpbnMge2luc3RfbmFtZX0geworICAgICAgICBzZXQgc3BlY2lmaWNhdGlvbiBbc2VsZWN0X2luc3RhbmNlX3NwZWNpZmljYXRpb24gJGluc3RfbmFtZV0KKyAgICAgICAgaWYge1tkaWN0IGV4aXN0cyAkc3BlY2lmaWNhdGlvbiBwb3dlcl9waW5zXX0geworICAgICAgICAgICAgcmV0dXJuIFtkaWN0IGdldCAkc3BlY2lmaWNhdGlvbiBwb3dlcl9waW5zXQorICAgICAgICB9CisgICAgICAgIHJldHVybiAiVkREUEUgVkREQ0UiCisgICAgfQorICAgIHByb2MgZ2V0X21hY3JvX2dyb3VuZF9waW5zIHtpbnN0X25hbWV9IHsKKyAgICAgICAgc2V0IHNwZWNpZmljYXRpb24gW3NlbGVjdF9pbnN0YW5jZV9zcGVjaWZpY2F0aW9uICRpbnN0X25hbWVdCisgICAgICAgIGlmIHtbZGljdCBleGlzdHMgJHNwZWNpZmljYXRpb24gZ3JvdW5kX3BpbnNdfSB7CisgICAgICAgICAgICByZXR1cm4gW2RpY3QgZ2V0ICRzcGVjaWZpY2F0aW9uIGdyb3VuZF9waW5zXQorICAgICAgICB9CisgICAgICAgIHJldHVybiAiVlNTRSIKKyAgICB9CisgICAgCisgICAgcHJvYyB0cmFuc2Zvcm1fYm94IHt4bWluIHltaW4geG1heCB5bWF4IG9yaWdpbiBvcmllbnRhdGlvbn0geworICAgICAgICBzd2l0Y2ggLWV4YWN0ICRvcmllbnRhdGlvbiB7CisgICAgICAgICAgICBSMCAgICB7c2V0IG5ld19ib3ggW2xpc3QgJHhtaW4gJHltaW4gJHhtYXggJHltYXhdfQorICAgICAgICAgICAgUjkwICAge3NldCBuZXdfYm94IFtsaXN0IFtleHByIC0xICogJHltYXhdICR4bWluIFtleHByIC0xICogJHltaW5dICR4bWF4XX0KKyAgICAgICAgICAgIFIxODAgIHtzZXQgbmV3X2JveCBbbGlzdCBbZXhwciAtMSAqICR4bWF4XSBbZXhwciAtMSAqICR5bWF4XSBbZXhwciAtMSAqICR4bWluXSBbZXhwciAtMSAqICR5bWluXV19CisgICAgICAgICAgICBSMjcwICB7c2V0IG5ld19ib3ggW2xpc3QgJHltaW4gW2V4cHIgLTEgKiAkeG1heF0gJHltYXggW2V4cHIgLTEgKiAkeG1pbl1dfQorICAgICAgICAgICAgTVggICAge3NldCBuZXdfYm94IFtsaXN0ICR4bWluIFtleHByIC0xICogJHltYXhdICR4bWF4IFtleHByIC0xICogJHltaW5dXX0KKyAgICAgICAgICAgIE1ZICAgIHtzZXQgbmV3X2JveCBbbGlzdCBbZXhwciAtMSAqICR4bWF4XSAkeW1pbiBbZXhwciAtMSAqICR4bWluXSAkeW1heF19CisgICAgICAgICAgICBNWFI5MCB7c2V0IG5ld19ib3ggW2xpc3QgJHltaW4gJHhtaW4gJHltYXggJHhtYXhdfQorICAgICAgICAgICAgTVlSOTAge3NldCBuZXdfYm94IFtsaXN0IFtleHByIC0xICogJHltYXhdIFtleHByIC0xICogJHhtYXhdIFtleHByIC0xICogJHltaW5dIFtleHByIC0xICogJHhtaW5dXX0KKyAgICAgICAgICAgIGRlZmF1bHQge2Vycm9yICJJbGxlZ2FsIG9yaWVudGF0aW9uICRvcmllbnRhdGlvbiBzcGVjaWZpZWQifQorICAgICAgICB9CisgICAgICAgIHJldHVybiBbbGlzdCBcCisgICAgICAgICAgICBbZXhwciBbbGluZGV4ICRuZXdfYm94IDBdICsgW2xpbmRleCAkb3JpZ2luIDBdXSBcCisgICAgICAgICAgICBbZXhwciBbbGluZGV4ICRuZXdfYm94IDFdICsgW2xpbmRleCAkb3JpZ2luIDFdXSBcCisgICAgICAgICAgICBbZXhwciBbbGluZGV4ICRuZXdfYm94IDJdICsgW2xpbmRleCAkb3JpZ2luIDBdXSBcCisgICAgICAgICAgICBbZXhwciBbbGluZGV4ICRuZXdfYm94IDNdICsgW2xpbmRleCAkb3JpZ2luIDFdXSBcCisgICAgICAgIF0KKyAgICB9CiAgICAgCiAgICAgcHJvYyBnZXRfbWVtb3J5X2luc3RhbmNlX3BnX3BpbnMge30gewotICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICAgICAgICMgQ3JlYXRpbmcgcnVuLnBhcmFtIGZpbGUgZm9yIFBkblBpbkR1bXBlcgotICAgICAgICAjCi0gICAgICAgICMKLSAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICB2YXJpYWJsZSBibG9jaworICAgICAgICB2YXJpYWJsZSBvcmlnX3N0cmlwZV9sb2NzCiAKLSAgICAgICAgc2V0IE9QMSBbb3BlbiBydW4ucGFyYW0gd10KKyAgICAgICAgZm9yZWFjaCBpbnN0IFskYmxvY2sgZ2V0SW5zdHNdIHsKKyAgICAgICAgICAgIHNldCBpbnN0X25hbWUgWyRpbnN0IGdldE5hbWVdCisgICAgICAgICAgICBzZXQgbWFzdGVyIFskaW5zdCBnZXRNYXN0ZXJdCiAKLSAgICAgICAgc2V0IGNtZCAiZXhlYyB0b3VjaCBkdW1teS5ndWlkZSIKLSAgICAgICAgY2F0Y2gge2V2YWwgJGNtZH0KKyAgICAgICAgICAgIGlmIHtbJG1hc3RlciBnZXRUeXBlXSA9PSAiQ09SRSJ9IHtjb250aW51ZX0KKyAgICAgICAgICAgIGlmIHtbJG1hc3RlciBnZXRUeXBlXSA9PSAiSU8ifSB7Y29udGludWV9CisgICAgICAgICAgICBpZiB7WyRtYXN0ZXIgZ2V0VHlwZV0gPT0gIlBBRCJ9IHtjb250aW51ZX0KKyAgICAgICAgICAgIGlmIHtbJG1hc3RlciBnZXRUeXBlXSA9PSAiUEFEX1NQQUNFUiJ9IHtjb250aW51ZX0KKyAgICAgICAgICAgIGlmIHtbJG1hc3RlciBnZXRUeXBlXSA9PSAiU1BBQ0VSIn0ge2NvbnRpbnVlfQorICAgICAgICAgICAgaWYge1skbWFzdGVyIGdldFR5cGVdID09ICJOT05FIn0ge2NvbnRpbnVlfQorICAgICAgICAgICAgaWYge1skbWFzdGVyIGdldFR5cGVdID09ICJFTkRDQVBfUFJFIn0ge2NvbnRpbnVlfQorICAgICAgICAgICAgaWYge1skbWFzdGVyIGdldFR5cGVdID09ICJFTkRDQVBfQk9UVE9NTEVGVCJ9IHtjb250aW51ZX0KKyAgICAgICAgICAgIGlmIHtbJG1hc3RlciBnZXRUeXBlXSA9PSAiRU5EQ0FQX0JPVFRPTVJJR0hUIn0ge2NvbnRpbnVlfQorICAgICAgICAgICAgaWYge1skbWFzdGVyIGdldFR5cGVdID09ICJFTkRDQVBfVE9QTEVGVCJ9IHtjb250aW51ZX0KKyAgICAgICAgICAgIGlmIHtbJG1hc3RlciBnZXRUeXBlXSA9PSAiRU5EQ0FQX1RPUFJJR0hUIn0ge2NvbnRpbnVlfQorICAgICAgICAgICAgaWYge1skbWFzdGVyIGdldFR5cGVdID09ICJFTkRDQVAifSB7Y29udGludWV9CisgICAgICAgICAgICBpZiB7WyRtYXN0ZXIgZ2V0VHlwZV0gPT0gIkVORENBUCJ9IHtjb250aW51ZX0KKyAgICAgICAgICAgIGlmIHtbJG1hc3RlciBnZXRUeXBlXSA9PSAiRU5EQ0FQIn0ge2NvbnRpbnVlfQorICAgICAgICAgICAgaWYge1skbWFzdGVyIGdldFR5cGVdID09ICJFTkRDQVAifSB7Y29udGludWV9CisgICAgICAgICAgICBpZiB7WyRtYXN0ZXIgZ2V0VHlwZV0gPT0gIkNPUkVfU1BBQ0VSIn0ge2NvbnRpbnVlfQorICAgICAgICAgICAgaWYge1skbWFzdGVyIGdldFR5cGVdID09ICJDT1JFX1RJRUhJR0gifSB7Y29udGludWV9CisgICAgICAgICAgICBpZiB7WyRtYXN0ZXIgZ2V0VHlwZV0gPT0gIkNPUkVfVElFTE9XIn0ge2NvbnRpbnVlfQogCi0gICAgICAgIGlmIHtbLXMgJDo6RnBPdXREZWZdfSB7Ci0gICAgICAgICAgcHV0cyAiTUFDUk8gUGFja2VkIERFRiBGaWxlICQ6OkZwT3V0RGVmICBleGlzdHMgYW5kIG5vdCBlbXB0eS4uIgotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHB1dHMgIkZpbGUgJDo6RnBPdXREZWYgZG9lcyBub3QgZXhpc3QsIG9yIGV4aXN0cyBidXQgZW1wdHkiCi0gICAgICAgICAgZXhpdAotICAgICAgICB9CisgICAgICAgICAgICBmb3JlYWNoIHRlcm1fbmFtZSBbY29uY2F0IFtnZXRfbWFjcm9fcG93ZXJfcGlucyAkaW5zdF9uYW1lXSBbZ2V0X21hY3JvX2dyb3VuZF9waW5zICRpbnN0X25hbWVdXSB7CisgICAgICAgICAgICAgICAgc2V0IGluc3RfdGVybSBbJGluc3QgZmluZElUZXJtICR0ZXJtX25hbWVdCisgICAgICAgICAgICAgICAgaWYgeyRpbnN0X3Rlcm0gPT0gIk5VTEwifSB7Y29udGludWV9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc2V0IG10ZXJtIFskaW5zdF90ZXJtIGdldE1UZXJtXQorICAgICAgICAgICAgICAgIHNldCB0eXBlIFskbXRlcm0gZ2V0U2lnVHlwZV0KIAorICAgICAgICAgICAgICAgIGZvcmVhY2ggbVBpbiBbJG10ZXJtIGdldE1QaW5zXSB7CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggZ2VvbSBbJG1QaW4gZ2V0R2VvbWV0cnldIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldCBsYXllciBbWyRnZW9tIGdldFRlY2hMYXllcl0gZ2V0TmFtZV0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNldCBib3ggW3RyYW5zZm9ybV9ib3ggWyRnZW9tIHhNaW5dIFskZ2VvbSB5TWluXSBbJGdlb20geE1heF0gWyRnZW9tIHlNYXhdIFskaW5zdCBnZXRPcmlnaW5dIFskaW5zdCBnZXRPcmllbnRdXQogCi0gICAgICAgIGlmIHtbLXMgJHs6OmZsYXRMZWZ9XX0gewotICAgICAgICAgIHB1dHMgIkZsYXQgTEVGIEZpbGUgJHs6OmZsYXRMZWZ9ICBleGlzdHMgYW5kIG5vdCBlbXB0eS4uIgotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHB1dHMgIkZpbGUgJHs6OmZsYXRMZWZ9IGRvZXMgbm90IGV4aXN0LCBvciBleGlzdHMgYnV0IGVtcHR5LiBQbGVhc2UgY2hlY2sgUEROLmNmZyIKLSAgICAgICAgICBleGl0Ci0gICAgICAgIH0KLSAgICAgICAgcGRuIHdyaXRlX21hY3JvY2VsbF9saXN0ICJtYWNyb2NlbGwubGlzdCIKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldCB3aWR0aCAgW2V4cHIgYWJzKFtsaW5kZXggJGJveCAyXSAtIFtsaW5kZXggJGJveCAwXSldCisgICAgICAgICAgICAgICAgICAgICAgICBzZXQgaGVpZ2h0IFtleHByIGFicyhbbGluZGV4ICRib3ggM10gLSBbbGluZGV4ICRib3ggMV0pXQogCi0gICAgICAgIHB1dHMgJE9QMSAibGVmOiR7OjpmbGF0TGVmfSIKLSAgICAgICAgcHV0cyAkT1AxICJkZWY6JHs6OkZwT3V0RGVmfSIKLSAgICAgICAgcHV0cyAkT1AxICJndWlkZTpkdW1teS5ndWlkZSIKLSAgICAgICAgcHV0cyAkT1AxICJvdXRwdXQ6ZHVtbXkuZGVmIgotICAgICAgICBwdXRzICRPUDEgIm1hY3JvTGlzdDptYWNyb2NlbGwubGlzdCIKLSAgICAgICAgcHV0cyAkT1AxICJ0aHJlYWRzOjE2IgotICAgICAgICBwdXRzICRPUDEgImNweHRocmVhZHM6OCIKLSAgICAgICAgcHV0cyAkT1AxICJ2ZXJib3NlOjIiCi0gICAgICAgIHB1dHMgJE9QMSAiZ2FwOjAiCi0gICAgICAgIHB1dHMgJE9QMSAidGltZW91dDoyNDAwIgotICAgICAgICBjbG9zZSAkT1AxCi0KLSAgICAgICAgcHV0cyAiVG90YWwgd2FsbHRpbWUgdGlsbCBtYWNybyBwaW4gZ2VvbWV0cnkgY3JlYXRpb24gPSBbZXhwciB7W2V4cHIge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gLSAkOjpzdGFydF90aW1lfV0vMTAwMC4wfV0gc2Vjb25kcyIKLQotICAgICAgICBwdXRzICIjI1Bvd2VyIERlbGl2ZXJ5IE5ldHdvcmsgR2VuZXJhdG9yOiBHZW5lcmF0aW5nIGlucHV0cyBmb3IgUEROIEdlbiIKLQotCi0gICAgICAgICNzZXQgY21kICJleGVjICR7d2R9L3NjcmlwdHMvcGRuX2lucHV0X2dlbiAkZGVzaWduIgotICAgICAgICAjZXZhbCAkY21kCi0gICAgICAgICNleGVjICJQZG5QaW5EdW1wZXIgcnVuLnBhcmFtID4gcGluLmxvYyIKLSAgICAgICAgI3NldCBjaCBbb3BlbiAicGluLmxvYyJdCi0gICAgICAgIHNldCBjaCBbb3BlbiAifFBkblBpbkR1bXBlciBydW4ucGFyYW0gfCB0ZWUgcGluX2R1bXBlci5sb2ciXQotCi0gICAgICAgIHNldCBtZW1fcGluc192ZGRfaG9yIHt9Ci0gICAgICAgIHNldCBtZW1fcGluc192ZGRfdmVyIHt9Ci0gICAgICAgIHNldCBtZW1fcGluc192c3NfaG9yIHt9Ci0gICAgICAgIHNldCBtZW1fcGluc192c3NfdmVyIHt9Ci0KLSAgICAgICAgaWYge1tpbmZvIHZhcnMgOjptYWNyb19wb3dlcl9waW5zXSA9PSAiIn0gewotICAgICAgICAgICAgIHNldCA6Om1hY3JvX3Bvd2VyX3BpbnMgIlZERFBFIFZERENFIgotICAgICAgICB9Ci0gICAgICAgIGlmIHtbaW5mbyB2YXJzIDo6bWFjcm9fZ3JvdW5kX3BpbnNdID09ICIifSB7Ci0gICAgICAgICAgICBzZXQgOjptYWNyb19ncm91bmRfcGlucyAiVlNTRSIKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgd2hpbGUgeyFbZW9mICRjaF19IHsKLSAgICAgICAgICAgIHNldCBsaW5lIFtnZXRzICRjaF0KLSAgICAgICAgICAgIHNldCBsaW5lIFtyZWdzdWIgLWFsbCB7W1woXClcLVwsXX0gJGxpbmUge31dCi0KLSAgICAgICAgICAgIGlmIHtbcmVnZXhwIHteaW5zdE5hbWUuKi8oW14vXSopOn0gJGxpbmUgLSBwaW5fbmFtZV19IHsKLSAgICAgICAgICAgICAgICBpZiB7W2xzZWFyY2ggJDo6bWFjcm9fcG93ZXJfcGlucyAkcGluX25hbWVdICE9IC0xfSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldCBuZXQgdmRkCi0gICAgICAgICAgICAgICAgfSBlbHNlaWYge1tsc2VhcmNoICQ6Om1hY3JvX2dyb3VuZF9waW5zICRwaW5fbmFtZV0gIT0gLTF9IHsKLSAgICAgICAgICAgICAgICAgICAgc2V0IG5ldCB2c3MKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gdmFycyBuZXRdICE9ICIifSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1bnNldCBuZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHskd2lkdGggPiAkaGVpZ2h0fSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHhsIFtsaW5kZXggJGJveCAwXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB4dSBbbGluZGV4ICRib3ggMl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgeSAgW2V4cHIgKFtsaW5kZXggJGJveCAxXSArIFtsaW5kZXggJGJveCAzXSkvMl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgd2lkdGggW2V4cHIgYWJzKFtsaW5kZXggJGJveCAzXSAtIFtsaW5kZXggJGJveCAxXSldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwcGVuZCBvcmlnX3N0cmlwZV9sb2NzKCR7bGF5ZXJ9X1BJTl9ob3IsJHR5cGUpIFtsaXN0ICR4bCAkeSAkeHUgJHdpZHRoXQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgeCAgW2V4cHIgKFtsaW5kZXggJGJveCAwXSArIFtsaW5kZXggJGJveCAyXSkvMl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgeWwgW2xpbmRleCAkYm94IDFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHl1IFtsaW5kZXggJGJveCAzXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB3aWR0aCBbZXhwciBhYnMoW2xpbmRleCAkYm94IDJdIC0gW2xpbmRleCAkYm94IDBdKV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIG9yaWdfc3RyaXBlX2xvY3MoJHtsYXllcn1fUElOX3ZlciwkdHlwZSkgW2xpc3QgJHggJHlsICR5dSAkd2lkdGhdCisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIHtbaW5mbyB2YXJzIG5ldF0gIT0gIiIgJiYgW2xsZW5ndGggJGxpbmVdID09IDV9IHsKLSAgICAgICAgICAgICAgICBzZXQgd2lkdGggIFtleHByIGFicyhbbGluZGV4ICRsaW5lIDJdIC0gW2xpbmRleCAkbGluZSAwXSldCi0gICAgICAgICAgICAgICAgc2V0IGhlaWdodCBbZXhwciBhYnMoW2xpbmRleCAkbGluZSAzXSAtIFtsaW5kZXggJGxpbmUgMV0pXQotCi0gICAgICAgICAgICAgICAgaWYgeyR3aWR0aCA+ICRoZWlnaHR9IHsKLSAgICAgICAgICAgICAgICAgICBsYXBwZW5kIG1lbV9waW5zXyR7bmV0fV9ob3IgJGxpbmUKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgIGxhcHBlbmQgbWVtX3BpbnNfJHtuZXR9X3ZlciAkbGluZQotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gICAgCiAgICAgICAgIH0KLQotICAgICAgICBpZiB7W2NhdGNoIHtjbG9zZSAkY2h9IG1zZ119IHsKLSAgICAgICAgICAgIHB1dHMgIkVSUk9SOiBQZG5QaW5EdW1wZXIgZmFpbGVkIC0gY2hlY2sgcGluX2R1bXBlci5sb2ciCi0gICAgICAgICAgICBwdXRzICRtc2cKLSAgICAgICAgICAgIGV4aXQKLSAgICAgICAgfQotCi0gICAgICAgIGZvcmVhY2ggcGluICRtZW1fcGluc192ZGRfaG9yIHsKLSAgICAgICAgICAgIHNldCB4bCBbbGluZGV4ICRwaW4gMF0KLSAgICAgICAgICAgIHNldCB4dSBbbGluZGV4ICRwaW4gMl0KLSAgICAgICAgICAgIHNldCB5ICBbZXhwciAoW2xpbmRleCAkcGluIDFdICsgW2xpbmRleCAkcGluIDNdKS8yXQotICAgICAgICAgICAgbGFwcGVuZCA6Om9yaWdfc3RyaXBlX2xvY3MoW2xpbmRleCAkcGluIDRdX1BJTl9ob3IsUE9XRVIpIFtsaXN0ICR4bCAkeSAkeHVdCi0gICAgICAgIH0KLQotICAgICAgICBmb3JlYWNoIHBpbiAkbWVtX3BpbnNfdmRkX3ZlciB7Ci0gICAgICAgICAgICBzZXQgeCAgW2V4cHIgKFtsaW5kZXggJHBpbiAwXSArIFtsaW5kZXggJHBpbiAyXSkvMl0KLSAgICAgICAgICAgIHNldCB5bCBbbGluZGV4ICRwaW4gMV0KLSAgICAgICAgICAgIHNldCB5dSBbbGluZGV4ICRwaW4gM10KLSAgICAgICAgICAgIGxhcHBlbmQgOjpvcmlnX3N0cmlwZV9sb2NzKFtsaW5kZXggJHBpbiA0XV9QSU5fdmVyLFBPV0VSKSBbbGlzdCAkeCAkeWwgJHl1XQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yZWFjaCBwaW4gJG1lbV9waW5zX3Zzc19ob3IgewotICAgICAgICAgICAgc2V0IHhsIFtsaW5kZXggJHBpbiAwXQotICAgICAgICAgICAgc2V0IHh1IFtsaW5kZXggJHBpbiAyXQotICAgICAgICAgICAgc2V0IHkgIFtleHByIChbbGluZGV4ICRwaW4gMV0gKyBbbGluZGV4ICRwaW4gM10pLzJdCi0gICAgICAgICAgICBsYXBwZW5kIDo6b3JpZ19zdHJpcGVfbG9jcyhbbGluZGV4ICRwaW4gNF1fUElOX2hvcixHUk9VTkQpIFtsaXN0ICR4bCAkeSAkeHVdCi0gICAgICAgIH0KLQotICAgICAgICBmb3JlYWNoIHBpbiAkbWVtX3BpbnNfdnNzX3ZlciB7Ci0gICAgICAgICAgICBzZXQgeCAgW2V4cHIgKFtsaW5kZXggJHBpbiAwXSArIFtsaW5kZXggJHBpbiAyXSkvMl0KLSAgICAgICAgICAgIHNldCB5bCBbbGluZGV4ICRwaW4gMV0KLSAgICAgICAgICAgIHNldCB5dSBbbGluZGV4ICRwaW4gM10KLSAgICAgICAgICAgIGxhcHBlbmQgOjpvcmlnX3N0cmlwZV9sb2NzKFtsaW5kZXggJHBpbiA0XV9QSU5fdmVyLEdST1VORCkgW2xpc3QgJHggJHlsICR5dV0KLSAgICAgICAgfQorIyAgICAgICAgcHV0cyAiVG90YWwgd2FsbHRpbWUgdGlsbCBtYWNybyBwaW4gZ2VvbWV0cnkgY3JlYXRpb24gPSBbZXhwciB7W2V4cHIge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gLSAkOjpzdGFydF90aW1lfV0vMTAwMC4wfV0gc2Vjb25kcyIKICAgICB9CiAKLSAgICBwcm9jIGluaXQge1BETl9jZmd9IHsKKyAgICBwcm9jIHNldF9jb3JlX2FyZWEge3htaW4geW1pbiB4bWF4IHltYXh9IHsKKyAgICAgICAgdmFyaWFibGUgZGVzaWduX2RhdGEKKworICAgICAgICBkaWN0IHNldCBkZXNpZ25fZGF0YSBjb25maWcgY29yZV9hcmVhIFtsaXN0ICR4bWluICR5bWluICR4bWF4ICR5bWF4XQorICAgIH0KKworICAgIHByb2MgaW5pdCB7b3BlbmRiX2Jsb2NrIHtQRE5fY2ZnICJQRE4uY2ZnIn19IHsKKyAgICAgICAgdmFyaWFibGUgZGIKKyAgICAgICAgdmFyaWFibGUgYmxvY2sKKyAgICAgICAgdmFyaWFibGUgdGVjaAorICAgICAgICB2YXJpYWJsZSBsaWJzCiAgICAgICAgIHZhcmlhYmxlIGRlc2lnbl9kYXRhCiAgICAgICAgIHZhcmlhYmxlIGRlZl9vdXRwdXQKLQotICAgICAgICBpZiB7Wy1zICRQRE5fY2ZnXX0gewotICAgICAgICAgIHB1dHMgIkZpbGUgJFBETl9jZmcgZXhpc3RzIGFuZCBub3QgZW1wdHkuLiIKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFyaWFibGUgZGVmYXVsdF9ncmlkX2RhdGEKKyAgICAgICAgdmFyaWFibGUgc3RyaXBlX2xvY3MKKyAgICAgICAgdmFyaWFibGUgZGVzaWduX25hbWUKKyAgICAgICAgdmFyaWFibGUgc2l0ZQorICAgICAgICB2YXJpYWJsZSByb3dfaGVpZ2h0CisgICAgICAgIHZhcmlhYmxlIHNpdGVfd2lkdGgKKyAgICAgICAgdmFyaWFibGUgc2l0ZV9uYW1lCisgICAgICAgIHZhcmlhYmxlIG1ldGFsX2xheWVycworICAgICAgICB2YXJpYWJsZSBkZWZfdW5pdHMKKyAgICAgICAgdmFyaWFibGUgc3RyaXBlc19zdGFydF93aXRoCisgICAgICAgIHZhcmlhYmxlIHJhaWxzX3N0YXJ0X3dpdGgKKyAgICAgICAgCisjICAgICAgICBzZXQgOjpzdGFydF90aW1lIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10KKyAgICAgICAgaWYgeyFbLXMgJFBETl9jZmddfSB7CiAgICAgICAgICAgcHV0cyAiRmlsZSAkUEROX2NmZyBkb2VzIG5vdCBleGlzdCwgb3IgZXhpc3RzIGJ1dCBlbXB0eSIKLSAgICAgICAgICBleGl0CisgICAgICAgICAgZXhpdCAxCiAgICAgICAgIH0KIAogICAgICAgICBzb3VyY2UgJFBETl9jZmcKIAotICAgICAgICBwdXRzICJEZXNpZ24gTmFtZSBpcyAkOjpkZXNpZ24iCi0gICAgICAgIHNldCBkZWZfb3V0cHV0ICIkezo6ZGVzaWdufV9wZG4uZGVmIgorICAgICAgICBzZXQgYmxvY2sgJG9wZW5kYl9ibG9jaworICAgICAgICBzZXQgZGVmX3VuaXRzIFskYmxvY2sgZ2V0RGVmVW5pdHNdCisgICAgICAgIHNldCBkZXNpZ25fbmFtZSBbJGJsb2NrIGdldE5hbWVdCisgICAgICAgIHNldCBkYiBbJGJsb2NrIGdldERhdGFCYXNlXQorICAgICAgICBzZXQgdGVjaCBbJGRiIGdldFRlY2hdCisgICAgICAgIHNldCBsaWJzIFskZGIgZ2V0TGlic10KKworICAgICAgICBpbml0X21ldGFsX2xheWVycworICAgICAgICBpbml0X3ZpYV90ZWNoCiAgICAgICAgIAotICAgICAgICAjIFNvdXJjaW5nIHVzZXIgaW5wdXRzIGZpbGUKLSAgICAgICAgIwotICAgICAgICBzZXQgOjpyb3dfaGVpZ2h0IFtleHByIHskOjpkZWZfdW5pdHMgKiAkOjpyb3dfaGVpZ2h0fV0KLQotICAgICAgICAjIyMjIyBHZXQgaW5mb3JtYXRpb24gZnJvbSBCRU9MIExFRgotICAgICAgICBwdXRzIC1ub25ld2xpbmUgIlJlYWRpbmcgQkVPTCBMRUYgYW5kIGdhdGhlcmluZyBpbmZvcm1hdGlvbiAuLi4iCi0gICAgICAgICMjZ2V0X2luZm9fZnJvbV90ZWNobGVmCi0gICAgICAgIHB1dHMgIiBET05FIFxbVG90YWwgZWxhcHNlZCB3YWxsdGltZSA9IFtleHByIHtbZXhwciB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSAtICQ6OnN0YXJ0X3RpbWV9XS8xMDAwLjB9XSBzZWNvbmRzXF0iCi0KLSAgICAgICAgIyNwdXRzIC1ub25ld2xpbmUgIkRvaW5nIHNhbml0eSBjaGVja3MsIGdhdGhlcmluZyBpbmZvcm1hdGlvbiBhbmQgY3JlYXRpbmcgREVGIGhlYWRlcnMgLi4uIgotICAgICAgICAjIyMjIyBCYXNpYyBzYW5pdHkgY2hlY2tzIHRvIHNlZSBpZiBpbnB1dHMgYXJlIGdpdmVuIGNvcnJlY3RseQotICAgICAgICBpZiB7W2xzZWFyY2ggJDo6bWV0X2xheWVyX2xpc3QgJDo6cmFpbHNfbWxheWVyXSA8IDB9IHsKLQkgICAgICAgIHB1dHMgIkVSUk9SOiBMYXllciBzcGVjaWZpZWQgZm9yIHN0ZC4gY2VsbCByYWlscyBub3QgaW4gbGlzdCBvZiBsYXllcnMuIEVYSVRJTkcuLi4uLiIKLQkgICAgICAgIGV4aXQKKyAgICAgICAgc2V0IGRpZV9hcmVhIFskYmxvY2sgZ2V0RGllQXJlYV0KKyAgICAgICAgcHV0cyAiRGVzaWduIE5hbWUgaXMgJGRlc2lnbl9uYW1lIgorICAgICAgICBzZXQgZGVmX291dHB1dCAiJHtkZXNpZ25fbmFtZX1fcGRuLmRlZiIKKyAgICAgICAgCisgICAgICAgIGlmIHtbaW5mbyB2YXJzIDo6cG93ZXJfbmV0c10gPT0gIiJ9IHsKKyAgICAgICAgICAgIHNldCA6OnBvd2VyX25ldHMgIlZERCIKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYge1tpbmZvIHZhcnMgOjpncm91bmRfbmV0c10gPT0gIiJ9IHsKKyAgICAgICAgICAgIHNldCA6Omdyb3VuZF9uZXRzICJWU1MiCiAgICAgICAgIH0KIAotICAgICAgICBzZXQgOjp2aWFzIHt9CisgICAgICAgIGlmIHtbaW5mbyB2YXJzIDo6c3RyaXBlc19zdGFydF93aXRoXSA9PSAiIn0geworICAgICAgICAgICAgc2V0IHN0cmlwZXNfc3RhcnRfd2l0aCAiR1JPVU5EIgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0IHN0cmlwZXNfc3RhcnRfd2l0aCAkOjpzdHJpcGVzX3N0YXJ0X3dpdGgKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYge1tpbmZvIHZhcnMgOjpyYWlsc19zdGFydF93aXRoXSA9PSAiIn0geworICAgICAgICAgICAgc2V0IHJhaWxzX3N0YXJ0X3dpdGggIkdST1VORCIKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldCByYWlsc19zdGFydF93aXRoICQ6OnJhaWxzX3N0YXJ0X3dpdGgKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZGljdCBzZXQgZGVzaWduX2RhdGEgcG93ZXJfbmV0cyAkOjpwb3dlcl9uZXRzCisgICAgICAgIGRpY3Qgc2V0IGRlc2lnbl9kYXRhIGdyb3VuZF9uZXRzICQ6Omdyb3VuZF9uZXRzCisKKyAgICAgICAgIyBTb3VyY2luZyB1c2VyIGlucHV0cyBmaWxlCisgICAgICAgICMKKyAgICAgICAgc2V0IHNpdGVzIHt9CisgICAgICAgIGZvcmVhY2ggbGliICRsaWJzIHsKKyAgICAgICAgICAgIHNldCBzaXRlcyBbY29uY2F0ICRzaXRlcyBbJGxpYiBnZXRTaXRlc11dCisgICAgICAgIH0KKyAgICAgICAgc2V0IHNpdGUgW2xpbmRleCAkc2l0ZXMgMF0KKworICAgICAgICBzZXQgc2l0ZV9uYW1lIFskc2l0ZSBnZXROYW1lXQorICAgICAgICBzZXQgc2l0ZV93aWR0aCBbJHNpdGUgZ2V0V2lkdGhdIAorICAgICAgICAKKyAgICAgICAgc2V0IHJvd19oZWlnaHQgWyRzaXRlIGdldEhlaWdodF0KKworICAgICAgICAjIyMjIyBHZXQgaW5mb3JtYXRpb24gZnJvbSBCRU9MIExFRgorICAgICAgICBwdXRzICJSZWFkaW5nIEJFT0wgTEVGIGFuZCBnYXRoZXJpbmcgaW5mb3JtYXRpb24gLi4uIgorCisjICAgICAgICBwdXRzICIgRE9ORSBcW1RvdGFsIGVsYXBzZWQgd2FsbHRpbWUgPSBbZXhwciB7W2V4cHIge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gLSAkOjpzdGFydF90aW1lfV0vMTAwMC4wfV0gc2Vjb25kc1xdIgorCisgICAgICAgIGlmIHtbaW5mbyB2YXJzIDo6bGF5ZXJzXSAhPSAiIn0geworICAgICAgICAgICAgZm9yZWFjaCBsYXllciAkOjpsYXllcnMgeworICAgICAgICAgICAgICAgIGlmIHtbZGljdCBleGlzdHMgJDo6bGF5ZXJzICRsYXllciB3aWR0aHRhYmxlXX0geworICAgICAgICAgICAgICAgICAgICBkaWN0IHNldCA6OmxheWVycyAkbGF5ZXIgd2lkdGh0YWJsZSBbbG1hcCB4IFtkaWN0IGdldCAkOjpsYXllcnMgJGxheWVyIHdpZHRodGFibGVdIHtleHByICR4ICogJGRlZl91bml0c31dCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0X2xheWVyX2luZm8gJDo6bGF5ZXJzCisgICAgICAgIH0KKwogICAgICAgICBpZiB7W2luZm8gdmFycyA6OmhhbG9dICE9ICIifSB7CiAgICAgICAgICAgICBpZiB7W2xsZW5ndGggJDo6aGFsb10gPT0gMX0gewogICAgICAgICAgICAgICAgIHNldCBkZWZhdWx0X2hhbG8gIiQ6OmhhbG8gJDo6aGFsbyAkOjpoYWxvICQ6OmhhbG8iCkBAIC0yMDcsMTMwICsyNTUsMzAwIEBACiAgICAgICAgICAgICB9IGVsc2VpZiB7W2xsZW5ndGggJDo6aGFsb10gPT0gNH0gewogICAgICAgICAgICAgICAgIHNldCBkZWZhdWx0X2hhbG8gJDo6aGFsbwogCSAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHB1dHMgIkVSUk9SOiBJbGxlZ2FsIG51bWJlciBvZiBlbGVtZW50cyBkZWZpbmVkIGZvciA6OmhhbG8gXCIkOjpoYWxvXCIiCi0gICAgICAgICAgICAgICAgZXhpdAorICAgICAgICAgICAgICAgIGVycm9yICJFUlJPUjogSWxsZWdhbCBudW1iZXIgb2YgZWxlbWVudHMgZGVmaW5lZCBmb3IgOjpoYWxvIFwiJDo6aGFsb1wiIgogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc2V0IGRlZmF1bHRfaGFsbyAiMCAwIDAgMCIKICAgICAgICAgfQogCi0gICAgICAgIGRpY3Qgc2V0IGRlc2lnbl9kYXRhIGNvbmZpZyBbbGlzdCBcCi0gICAgICAgICAgICBkZWZfb3V0cHV0ICAgJGRlZl9vdXRwdXQgXAotICAgICAgICAgICAgZGVzaWduICAgICAgICQ6OmRlc2lnbiBcCi0gICAgICAgICAgICBkZWZfdW5pdHMgICAgJDo6ZGVmX3VuaXRzIFwKLSAgICAgICAgICAgIGNvcmVfYXJlYSAgICBbbGlzdCAkOjpjb3JlX2FyZWFfbGx4ICQ6OmNvcmVfYXJlYV9sbHkgJDo6Y29yZV9hcmVhX3VyeCAkOjpjb3JlX2FyZWFfdXJ5XSBcCi0gICAgICAgICAgICBkaWVfYXJlYSAgICAgW2xpc3QgJDo6ZGllX2FyZWFfbGx4ICAkOjpkaWVfYXJlYV9sbHkgICQ6OmRpZV9hcmVhX3VyeCAgJDo6ZGllX2FyZWFfdXJ5XSBcCi0gICAgICAgICAgICBkZWZhdWx0X2hhbG8gW2xtYXAgeCAkZGVmYXVsdF9oYWxvIHtleHByICR4ICogJDo6ZGVmX3VuaXRzfV0gXAotICAgICAgICBdCisgICAgICAgIGRpY3Qgc2V0IGRlc2lnbl9kYXRhIGNvbmZpZyBkZWZfb3V0cHV0ICAgJGRlZl9vdXRwdXQKKyAgICAgICAgZGljdCBzZXQgZGVzaWduX2RhdGEgY29uZmlnIGRlc2lnbiAgICAgICAkZGVzaWduX25hbWUKKyAgICAgICAgZGljdCBzZXQgZGVzaWduX2RhdGEgY29uZmlnIGRpZV9hcmVhICAgICBbbGlzdCBbJGRpZV9hcmVhIHhNaW5dICBbJGRpZV9hcmVhIHlNaW5dIFskZGllX2FyZWEgeE1heF0gWyRkaWVfYXJlYSB5TWF4XV0KKyAgICAgICAgZGljdCBzZXQgZGVzaWduX2RhdGEgY29uZmlnIGRlZmF1bHRfaGFsbyBbbG1hcCB4ICRkZWZhdWx0X2hhbG8ge2V4cHIgJHggKiAkZGVmX3VuaXRzfV0KICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgZm9yZWFjaCBsYXkgJDo6bWV0X2xheWVyX2xpc3QgeyAKLQkgICAgc2V0IDo6c3RyaXBlX2xvY3MoJGxheSxQT1dFUikgIiIKLQkgICAgc2V0IDo6c3RyaXBlX2xvY3MoJGxheSxHUk9VTkQpICIiCi0JICAgIHNldCA6OnN0cmlwZV9sb2NzX2JsaygkbGF5LFBPV0VSKSAiIgotCSAgICBzZXQgOjpzdHJpcGVfbG9jc19ibGsoJGxheSxHUk9VTkQpICIiCQorICAgICAgICBpZiB7W2luZm8gdmFycyA6OmNvcmVfYXJlYV9sbHhdICE9ICIiICYmIFtpbmZvIHZhcnMgOjpjb3JlX2FyZWFfbGx5XSAhPSAiIiAmJiBbaW5mbyB2YXJzIDo6Y29yZV9hcmVhX3VyeF0gIT0gIiIgJiYgW2luZm8gdmFycyA6OmNvcmVfYXJlYV91cnldICE9ICIifSB7CisgICAgICAgICAgICAgc2V0X2NvcmVfYXJlYSBbZXhwciAkOjpjb3JlX2FyZWFfbGx4ICogJGRlZl91bml0c10gW2V4cHIgJDo6Y29yZV9hcmVhX2xseSAqICRkZWZfdW5pdHNdIFtleHByICQ6OmNvcmVfYXJlYV91cnggKiAkZGVmX3VuaXRzXSBbZXhwciAkOjpjb3JlX2FyZWFfdXJ5ICogJGRlZl91bml0c10KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZm9yZWFjaCBsYXkgJG1ldGFsX2xheWVycyB7IAorCSAgICBzZXQgc3RyaXBlX2xvY3MoJGxheSxQT1dFUikgIiIKKwkgICAgc2V0IHN0cmlwZV9sb2NzKCRsYXksR1JPVU5EKSAiIgorICAgICAgICB9CisKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICAjIFJlbW92ZSBleGlzdGluZyByb3dzCisgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICBmb3JlYWNoIHJvdyBbJGJsb2NrIGdldFJvd3NdIHsKKyAgICAgICAgICAgIGRiUm93X2Rlc3Ryb3kgJHJvdworICAgICAgICB9CisKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICAjIFJlbW92ZSBleGlzdGluZyBwb3dlci9ncm91bmQgbmV0cworICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgZm9yZWFjaCBwZ19uZXQgW2NvbmNhdCBbZGljdCBnZXQgJGRlc2lnbl9kYXRhIHBvd2VyX25ldHNdIFtkaWN0IGdldCAkZGVzaWduX2RhdGEgZ3JvdW5kX25ldHNdXSB7CisgICAgICAgICAgICBzZXQgbmV0IFskYmxvY2sgZmluZE5ldCAkcGdfbmV0XQorICAgICAgICAgICAgaWYgeyRuZXQgIT0gIk5VTEwifSB7CisgICAgICAgICAgICAgICAgZGJOZXRfZGVzdHJveSAkbmV0CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICMgQ3JlYXRpbmcgYmxvY2thZ2VzIGJhc2VkIG9uIG1hY3JvIGxvY2F0aW9ucwogICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAgICAgICAgcGRuIHJlYWRfbWFjcm9fYm91bmRhcmllcyAkOjpGcE91dERlZiAkOjpjZWxsTGVmCisgICAgICAgIHBkbiByZWFkX21hY3JvX2JvdW5kYXJpZXMKIAogICAgICAgICBwZG4gZ2V0X21lbW9yeV9pbnN0YW5jZV9wZ19waW5zCiAKKyAgICAgICAgaWYgeyRkZWZhdWx0X2dyaWRfZGF0YSA9PSB7fX0geworICAgICAgICAgICAgc2V0IGRlZmF1bHRfZ3JpZF9kYXRhIFtsaW5kZXggW2RpY3QgZ2V0ICRkZXNpZ25fZGF0YSBncmlkIHN0ZGNlbGxdIDBdCisgICAgICAgIH0KKworICAgICAgICAjIyMjIyBCYXNpYyBzYW5pdHkgY2hlY2tzIHRvIHNlZSBpZiBpbnB1dHMgYXJlIGdpdmVuIGNvcnJlY3RseQorICAgICAgICBpZiB7W2xzZWFyY2ggJG1ldGFsX2xheWVycyBbZ2V0X3JhaWxzX2xheWVyXV0gPCAwfSB7CisJICAgIGVycm9yICJFUlJPUjogTGF5ZXIgc3BlY2lmaWVkIGZvciBzdGQuIGNlbGwgcmFpbHMgbm90IGluIGxpc3Qgb2YgbGF5ZXJzLiIKKyAgICAgICAgfQorCisjICAgICAgICBwdXRzICJUb3RhbCB3YWxsdGltZSB0aWxsIFBETiBzZXR1cCA9IFtleHByIHtbZXhwciB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSAtICQ6OnN0YXJ0X3RpbWV9XS8xMDAwLjB9XSBzZWNvbmRzIgorCiAgICAgICAgIHJldHVybiAkZGVzaWduX2RhdGEKICAgICB9CiAgICAgCiAgICAgcHJvYyBzcGVjaWZ5X2dyaWQge3R5cGUgc3BlY2lmaWNhdGlvbn0gewogICAgICAgICB2YXJpYWJsZSBkZXNpZ25fZGF0YQotICAgICAgICAKLSAgICAgICAgc2V0IHNwZWNpZmljYXRpb24gW2xpc3QgJHNwZWNpZmljYXRpb25dCisKKyAgICAgICAgc2V0IHNwZWNpZmljYXRpb25zIHt9CiAgICAgICAgIGlmIHtbZGljdCBleGlzdHMgJGRlc2lnbl9kYXRhIGdyaWQgJHR5cGVdfSB7Ci0gICAgICAgICAgICBzZXQgc3BlY2lmaWNhdGlvbiBbY29uY2F0IFtkaWN0IGdldCAkZGVzaWduX2RhdGEgZ3JpZCAkdHlwZV0gJHNwZWNpZmljYXRpb25dCisgICAgICAgICAgICBzZXQgc3BlY2lmaWNhdGlvbnMgW2RpY3QgZ2V0ICRkZXNpZ25fZGF0YSBncmlkICR0eXBlXQogICAgICAgICB9Ci0gICAgICAgIGRpY3Qgc2V0IGRlc2lnbl9kYXRhIGdyaWQgJHR5cGUgJHNwZWNpZmljYXRpb24KKyAgICAgICAgbGFwcGVuZCBzcGVjaWZpY2F0aW9ucyAkc3BlY2lmaWNhdGlvbgorICAgICAgICAKKyAgICAgICAgZGljdCBzZXQgZGVzaWduX2RhdGEgZ3JpZCAkdHlwZSAkc3BlY2lmaWNhdGlvbnMKICAgICB9CiAgICAgCiAgICAgcHJvYyBhZGRfZ3JpZCB7Z3JpZF9kYXRhfSB7CiAgICAgICAgIHZhcmlhYmxlIGRlc2lnbl9kYXRhCi0KKyAgICAgICAgdmFyaWFibGUgZGVmX3VuaXRzCisgICAgICAgIHZhcmlhYmxlIHdpZHRocworICAgICAgICB2YXJpYWJsZSBwaXRjaGVzCisgICAgICAgIHZhcmlhYmxlIGxvZmZzZXQKKyAgICAgICAgdmFyaWFibGUgYm9mZnNldAorICAgICAgICAKICAgICAgICAgIyMjIyMgQ3JlYXRpbmcgbWFwcyBmb3IgZGlyZWN0aW9ucywgd2lkdGhzIGFuZCBwaXRjaGVzCi0gICAgICAgIHNldCBkZWZfdW5pdHMgW2RpY3QgZ2V0ICRkZXNpZ25fZGF0YSBjb25maWcgZGVmX3VuaXRzXQogICAgICAgICBzZXQgYXJlYSBbZGljdCBnZXQgJGdyaWRfZGF0YSBhcmVhXQogCi0gICAgICAgIHNldCBpZHggMAotICAgICAgICBmb3JlYWNoIGxheSBbZGljdCBnZXQgJGdyaWRfZGF0YSBsYXllcnNdIHsgCi0JICAgICAgICBzZXQgOjpkaXIoJGxheSkgW2xpbmRleCBbZGljdCBnZXQgJGdyaWRfZGF0YSBkaXJdICRpZHhdCi0JICAgICAgICBzZXQgOjp3aWR0aHMoJGxheSkgW2V4cHIgW2xpbmRleCBbZGljdCBnZXQgJGdyaWRfZGF0YSB3aWR0aHNdICRpZHhdICogJGRlZl91bml0c10gCi0JICAgICAgICBzZXQgOjpwaXRjaGVzKCRsYXkpIFtleHByIFtsaW5kZXggW2RpY3QgZ2V0ICRncmlkX2RhdGEgcGl0Y2hlc10gJGlkeF0gKiAkZGVmX3VuaXRzXQotCSAgICAgICAgc2V0IDo6bGlvb2Zmc2V0KCRsYXkpIFtleHByIChbbGluZGV4IFtkaWN0IGdldCAkZ3JpZF9kYXRhIGxvZmZzZXRdICRpZHhdICogJGRlZl91bml0cyldCi0JICAgICAgICBzZXQgOjpiaW9vZmZzZXQoJGxheSkgW2V4cHIgKFtsaW5kZXggW2RpY3QgZ2V0ICRncmlkX2RhdGEgYm9mZnNldF0gJGlkeF0gKiAkZGVmX3VuaXRzKV0KLQkgICAgICAgIHNldCA6OmxvZmZzZXQoJGxheSkgW2V4cHIgKFtsaW5kZXggW2RpY3QgZ2V0ICRncmlkX2RhdGEgbG9mZnNldF0gJGlkeF0pICogJGRlZl91bml0c10KLQkgICAgICAgIHNldCA6OmJvZmZzZXQoJGxheSkgW2V4cHIgKFtsaW5kZXggW2RpY3QgZ2V0ICRncmlkX2RhdGEgYm9mZnNldF0gJGlkeF0pICogJGRlZl91bml0c10KLQkgICAgICAgIGluY3IgaWR4Ci0JICAgICAgICAjI3B1dHMgIk9GRlNFVDogbGF5ZXIgaXMgJGxheSwgJDo6Ymlvb2Zmc2V0KCRsYXkpLCAkOjpsaW9vZmZzZXQoJGxheSkiCisgICAgICAgIGZvcmVhY2ggbGF5IFtkaWN0IGtleXMgW2RpY3QgZ2V0ICRncmlkX2RhdGEgbGF5ZXJzXV0geyAKKwkgICAgc2V0IHdpZHRocygkbGF5KSAgICBbZXhwciByb3VuZChbZGljdCBnZXQgJGdyaWRfZGF0YSBsYXllcnMgJGxheSB3aWR0aF0gKiAkZGVmX3VuaXRzKV0gCisJICAgIHNldCBwaXRjaGVzKCRsYXkpICAgW2V4cHIgcm91bmQoW2RpY3QgZ2V0ICRncmlkX2RhdGEgbGF5ZXJzICRsYXkgcGl0Y2hdICogJGRlZl91bml0cyldCisJICAgIHNldCBsb2Zmc2V0KCRsYXkpICAgW2V4cHIgcm91bmQoW2RpY3QgZ2V0ICRncmlkX2RhdGEgbGF5ZXJzICRsYXkgb2Zmc2V0XSAqICRkZWZfdW5pdHMpXQorCSAgICBzZXQgYm9mZnNldCgkbGF5KSAgIFtleHByIHJvdW5kKFtkaWN0IGdldCAkZ3JpZF9kYXRhIGxheWVycyAkbGF5IG9mZnNldF0gKiAkZGVmX3VuaXRzKV0KICAgICAgICAgfQogCiAgICAgICAgICMjIFBvd2VyIG5ldHMKLSAgICAgICAgc2V0IDo6cm93X2luZGV4IDEKLSAgICAgICAgZm9yZWFjaCBwd3JfbmV0ICQ6OnBvd2VyX25ldHMgewotCSAgICAgICAgc2V0IHRhZyAiUE9XRVIiCi0JICAgICAgICBnZW5lcmF0ZV9zdHJpcGVzX3ZpYXMgJHRhZyAkcHdyX25ldCAkZ3JpZF9kYXRhCisgICAgICAgICMjIHB1dHMgIlBvd2VyIHN0cmFwcyIKKyAgICAgICAgZm9yZWFjaCBwd3JfbmV0IFtkaWN0IGdldCAkZGVzaWduX2RhdGEgcG93ZXJfbmV0c10geworCSAgICBzZXQgdGFnICJQT1dFUiIKKwkgICAgZ2VuZXJhdGVfc3RyaXBlc192aWFzICR0YWcgJHB3cl9uZXQgJGdyaWRfZGF0YQogICAgICAgICB9CiAgICAgICAgICMjIEdyb3VuZCBuZXRzCi0gICAgICAgIGZvcmVhY2ggZ25kX25ldCAkOjpncm91bmRfbmV0cyB7Ci0JICAgICAgICBzZXQgdGFnICJHUk9VTkQiCi0JICAgICAgICBnZW5lcmF0ZV9zdHJpcGVzX3ZpYXMgJHRhZyAkZ25kX25ldCAkZ3JpZF9kYXRhCisgICAgICAgICMjIHB1dHMgIkdyb3VuZCBzdHJhcHMiCisgICAgICAgIGZvcmVhY2ggZ25kX25ldCBbZGljdCBnZXQgJGRlc2lnbl9kYXRhIGdyb3VuZF9uZXRzXSB7CisJICAgIHNldCB0YWcgIkdST1VORCIKKwkgICAgZ2VuZXJhdGVfc3RyaXBlc192aWFzICR0YWcgJGduZF9uZXQgJGdyaWRfZGF0YQogICAgICAgICB9CiAKICAgICB9CiAKLSAgICBwcm9jIHBvd2VyX2dyaWQge30geworICAgIHByb2Mgc2VsZWN0X2luc3RhbmNlX3NwZWNpZmljYXRpb24ge2luc3RhbmNlfSB7CiAgICAgICAgIHZhcmlhYmxlIGRlc2lnbl9kYXRhCiAgICAgICAgIHZhcmlhYmxlIGluc3RhbmNlcworCisgICAgICAgIHNldCBtYWNyb19zcGVjaWZpY2F0aW9ucyBbZGljdCBnZXQgJGRlc2lnbl9kYXRhIGdyaWQgbWFjcm9dCiAgICAgICAgIAorICAgICAgICAjIElmIHRoZXJlIGlzIGEgc3BlY2lmY2F0aW9uIHRoYXQgbWF0Y2hlcyB0aGlzIGluc3RhbmNlIG5hbWUsIHVzZSB0aGF0CisgICAgICAgIGZvcmVhY2ggc3BlY2lmaWNhdGlvbiAkbWFjcm9fc3BlY2lmaWNhdGlvbnMgeworICAgICAgICAgICAgaWYgeyFbZGljdCBleGlzdHMgJHNwZWNpZmljYXRpb24gaW5zdGFuY2VdfSB7Y29udGludWV9CisgICAgICAgICAgICBpZiB7W2RpY3QgZ2V0ICRzcGVjaWZpY2F0aW9uIGluc3RhbmNlXSA9PSAkaW5zdGFuY2V9IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gJHNwZWNpZmljYXRpb24KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgIyBJZiB0aGVyZSBpcyBhIHNwZWNpZmljYXRpb24gdGhhdCBtYXRjaGVzIHRoaXMgbWFjcm8gbmFtZSwgdXNlIHRoYXQKKyAgICAgICAgaWYge1tkaWN0IGV4aXN0cyAkaW5zdGFuY2VzICRpbnN0YW5jZV19IHsKKyAgICAgICAgICAgIHNldCBpbnN0YW5jZV9tYWNybyBbZGljdCBnZXQgJGluc3RhbmNlcyAkaW5zdGFuY2UgbWFjcm9dCisKKyAgICAgICAgICAgICMgSWYgdGhlcmUgYXJlIG9yaWVudGF0aW9uIGJhc2VkIHNwZWNpZmNhdGlvbnMgZm9yIHRoaXMgbWFjcm8sIHVzZSB0aGUgYXBwcm9wcmlhdGUgb25lIGlmIGF2YWlsYWJsZQorICAgICAgICAgICAgZm9yZWFjaCBzcGVjICRtYWNyb19zcGVjaWZpY2F0aW9ucyB7CisgICAgICAgICAgICAgICAgaWYgeyEoW2RpY3QgZXhpc3RzICRzcGVjIG1hY3JvXSAmJiBbZGljdCBnZXQgJHNwZWMgb3JpZW50XSAmJiBbZGljdCBnZXQgJHNwZWMgbWFjcm9dID09ICRpbnN0YW5jZV9tYWNybyl9IHtjb250aW51ZX0KKyAgICAgICAgICAgICAgICBpZiB7W2xzZWFyY2ggW2RpY3QgZ2V0ICRzcGVjIG9yaWVudF0gW2RpY3QgZ2V0ICRpbnN0YW5jZXMgJGluc3RhbmNlIG9yaWVudF1dICE9IC0xfSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAkc3BlYworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICAjIFRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZSBtYWNybyBzcGVjaWZpYyBzcGVjIHRoYXQgZG9lc250IGhhdmUgYW4gb3JpZW50YXRpb24gcXVhbGlmaWVyCisgICAgICAgICAgICBmb3JlYWNoIHNwZWMgJG1hY3JvX3NwZWNpZmljYXRpb25zIHsKKyAgICAgICAgICAgICAgICBpZiB7IShbZGljdCBleGlzdHMgJHNwZWMgbWFjcm9dICYmIFtkaWN0IGdldCAkc3BlYyBtYWNyb10gPT0gJGluc3RhbmNlX21hY3JvKX0ge2NvbnRpbnVlfQorICAgICAgICAgICAgICAgIGlmIHtbbHNlYXJjaCBbZGljdCBnZXQgJHNwZWMgb3JpZW50XSBbZGljdCBnZXQgJGluc3RhbmNlcyAkaW5zdGFuY2Ugb3JpZW50XV0gIT0gLTF9IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRzcGVjCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjIElmIHRoZXJlIGFyZSBvcmllbnRhdGlvbiBiYXNlZCBzcGVjaWZjYXRpb25zLCB1c2UgdGhlIGFwcHJvcHJpYXRlIG9uZSBpZiBhdmFpbGFibGUKKyAgICAgICAgICAgIGZvcmVhY2ggc3BlYyAkbWFjcm9fc3BlY2lmaWNhdGlvbnMgeworICAgICAgICAgICAgICAgIGlmIHshKCFbZGljdCBleGlzdHMgJHNwZWMgbWFjcm9dICYmICFbZGljdCBleGlzdHMgJHNwZWMgaW5zdGFuY2VdICYmIFtkaWN0IGV4aXN0cyAkc3BlYyBvcmllbnRdKX0ge2NvbnRpbnVlfQorICAgICAgICAgICAgICAgIGlmIHtbbHNlYXJjaCBbZGljdCBnZXQgJHNwZWMgb3JpZW50XSBbZGljdCBnZXQgJGluc3RhbmNlcyAkaW5zdGFuY2Ugb3JpZW50XV0gIT0gLTF9IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRzcGVjCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgIyBUaGVyZSBzaG91bGQgb25seSBiZSBvbmUgbWFjcm8gc3BlY2lmaWMgc3BlYyB0aGF0IGRvZXNudCBoYXZlIGFuIG9yaWVudGF0aW9uIHF1YWxpZmllcgorICAgICAgICBmb3JlYWNoIHNwZWMgJG1hY3JvX3NwZWNpZmljYXRpb25zIHsKKyAgICAgICAgICAgIGlmIHshKCFbZGljdCBleGlzdHMgJHNwZWMgbWFjcm9dICYmICFbZGljdCBleGlzdHMgJHNwZWMgaW5zdGFuY2VdKX0ge2NvbnRpbnVlfQorICAgICAgICAgICAgcmV0dXJuICRzcGVjCisgICAgICAgIH0KKworICAgICAgICBlcnJvciAiRXJyb3I6IG5vIG1hdGNoaW5nIGdyaWQgc3BlY2lmaWNhdGlvbiBmb3VuZCBmb3IgJGluc3RhbmNlIgorICAgIH0KKyAgICAKKyAgICBwcm9jIGdldF9pbnN0YW5jZV9zcGVjaWZpY2F0aW9uIHtpbnN0YW5jZX0geworICAgICAgICB2YXJpYWJsZSBpbnN0YW5jZXMKKworICAgICAgICBzZXQgc3BlY2lmaWNhdGlvbiBbc2VsZWN0X2luc3RhbmNlX3NwZWNpZmljYXRpb24gJGluc3RhbmNlXQorCisgICAgICAgIGlmIHshW2RpY3QgZXhpc3RzICRzcGVjaWZpY2F0aW9uIGJsb2NrYWdlXX0geworICAgICAgICAgICAgZGljdCBzZXQgc3BlY2lmaWNhdGlvbiBibG9ja2FnZSB7fQorICAgICAgICB9CisgICAgICAgIGRpY3Qgc2V0IHNwZWNpZmljYXRpb24gYXJlYSBbZGljdCBnZXQgJGluc3RhbmNlcyAkaW5zdGFuY2UgbWFjcm9fYm91bmRhcnldCisgICAgICAgIAorICAgICAgICByZXR1cm4gJHNwZWNpZmljYXRpb24KKyAgICB9CisgICAgCisgICAgcHJvYyBpbml0X21ldGFsX2xheWVycyB7fSB7CisgICAgICAgIHZhcmlhYmxlIHRlY2gKKyAgICAgICAgdmFyaWFibGUgbWV0YWxfbGF5ZXJzCisgICAgICAgIHZhcmlhYmxlIG1ldGFsX2xheWVyc19kaXIKKworICAgICAgICBzZXQgbWV0YWxfbGF5ZXJzIHt9ICAgICAgICAKKyAgICAgICAgc2V0IG1ldGFsX2xheWVyc19kaXIge30KKyAgICAgICAgCisgICAgICAgIGZvcmVhY2ggbGF5ZXIgWyR0ZWNoIGdldExheWVyc10geworICAgICAgICAgICAgaWYge1skbGF5ZXIgZ2V0VHlwZV0gPT0gIlJPVVRJTkcifSB7CisgICAgICAgICAgICAgICAgbGFwcGVuZCBtZXRhbF9sYXllcnMgWyRsYXllciBnZXROYW1lXQorICAgICAgICAgICAgICAgIGxhcHBlbmQgbWV0YWxfbGF5ZXJzX2RpciBbJGxheWVyIGdldERpcmVjdGlvbl0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByb2MgZ2V0X2luc3RhbmNlX2xseCB7aW5zdGFuY2V9IHsKKyAgICAgICAgdmFyaWFibGUgaW5zdGFuY2VzCisgICAgICAgIHJldHVybiBbbGluZGV4IFtkaWN0IGdldCAkaW5zdGFuY2VzICRpbnN0YW5jZSBoYWxvX2JvdW5kYXJ5XSAwXQorICAgIH0KKyAgICAKKyAgICBwcm9jIGdldF9pbnN0YW5jZV9sbHkge2luc3RhbmNlfSB7CisgICAgICAgIHZhcmlhYmxlIGluc3RhbmNlcworICAgICAgICByZXR1cm4gW2xpbmRleCBbZGljdCBnZXQgJGluc3RhbmNlcyAkaW5zdGFuY2UgaGFsb19ib3VuZGFyeV0gMV0KKyAgICB9CisgICAgCisgICAgcHJvYyBnZXRfaW5zdGFuY2VfdXJ4IHtpbnN0YW5jZX0geworICAgICAgICB2YXJpYWJsZSBpbnN0YW5jZXMKKyAgICAgICAgcmV0dXJuIFtsaW5kZXggW2RpY3QgZ2V0ICRpbnN0YW5jZXMgJGluc3RhbmNlIGhhbG9fYm91bmRhcnldIDJdCisgICAgfQorICAgIAorICAgIHByb2MgZ2V0X2luc3RhbmNlX3VyeSB7aW5zdGFuY2V9IHsKKyAgICAgICAgdmFyaWFibGUgaW5zdGFuY2VzCisgICAgICAgIHJldHVybiBbbGluZGV4IFtkaWN0IGdldCAkaW5zdGFuY2VzICRpbnN0YW5jZSBoYWxvX2JvdW5kYXJ5XSAzXQorICAgIH0KKyAgICAKKyAgICBwcm9jIGdldF9tYWNyb19ibG9ja2FnZV9sYXllcnMge2luc3RhbmNlfSB7CisgICAgICAgIHZhcmlhYmxlIG1ldGFsX2xheWVycworICAgICAgICAKKyAgICAgICAgc2V0IHNwZWNpZmljYXRpb24gW3NlbGVjdF9pbnN0YW5jZV9zcGVjaWZpY2F0aW9uICRpbnN0YW5jZV0KKyAgICAgICAgaWYge1tkaWN0IGV4aXN0cyAkc3BlY2lmaWNhdGlvbiBibG9ja2FnZV19IHsKKyAgICAgICAgICAgIHJldHVybiBbZGljdCBnZXQgJHNwZWNpZmljYXRpb24gYmxvY2thZ2VdCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFtscmFuZ2UgJG1ldGFsX2xheWVycyAwIDNdCisgICAgfQorICAgIAorICAgIHByb2MgcHJpbnRfc3RyYXRlZ3kge3R5cGUgc3BlY2lmaWNhdGlvbn0geworICAgICAgICBwdXRzICJUeXBlOiAkdHlwZSIKKyAgICAgICAgaWYge1tkaWN0IGV4aXN0cyAkc3BlY2lmaWNhdGlvbiByYWlsc119IHsKKyAgICAgICAgICAgIHB1dHMgIiAgICBGb2xsb3cgUGlucyBMYXllcjogW2RpY3QgZ2V0ICRzcGVjaWZpY2F0aW9uIHJhaWxzXSIKKyAgICAgICAgfQorICAgICAgICBpZiB7W2RpY3QgZXhpc3RzICRzcGVjaWZpY2F0aW9uIGluc3RhbmNlXX0geworICAgICAgICAgICAgcHV0cyAiICAgIEluc3RhbmNlOiBbZGljdCBnZXQgJHNwZWNpZmljYXRpb24gb3JpZW50XSIKKyAgICAgICAgfQorICAgICAgICBpZiB7W2RpY3QgZXhpc3RzICRzcGVjaWZpY2F0aW9uIG1hY3JvXX0geworICAgICAgICAgICAgcHV0cyAiICAgIE1hY3JvOiBbZGljdCBnZXQgJHNwZWNpZmljYXRpb24gb3JpZW50XSIKKyAgICAgICAgfQorICAgICAgICBpZiB7W2RpY3QgZXhpc3RzICRzcGVjaWZpY2F0aW9uIG9yaWVudF19IHsKKyAgICAgICAgICAgIHB1dHMgIiAgICBNYWNybyBvcmllbnRhdGlvbjogW2RpY3QgZ2V0ICRzcGVjaWZpY2F0aW9uIG9yaWVudF0iCisgICAgICAgIH0KKyAgICAgICAgZGljdCBmb3Ige2xheWVyX25hbWUgbGF5ZXJ9IFtkaWN0IGdldCAkc3BlY2lmaWNhdGlvbiBsYXllcnNdIHsKKyAgICAgICAgICAgIHB1dHMgW2Zvcm1hdCAiICAgIExheWVyOiAlcywgV2lkdGg6ICVmIFBpdGNoOiAlZiBPZmZzZXQ6ICVmIiAkbGF5ZXJfbmFtZSBbZGljdCBnZXQgJGxheWVyIHdpZHRoXSAgW2RpY3QgZ2V0ICRsYXllciBwaXRjaF0gW2RpY3QgZ2V0ICRsYXllciBvZmZzZXRdXQorICAgICAgICB9CisgICAgICAgIHB1dHMgIiAgICBDb25uZWN0OiBbZGljdCBnZXQgJHNwZWNpZmljYXRpb24gY29ubmVjdF0iCisgICAgfQorICAgIAorICAgIHByb2MgcGxhbl9ncmlkIHt9IHsKKyAgICAgICAgdmFyaWFibGUgZGVzaWduX2RhdGEKKyAgICAgICAgdmFyaWFibGUgaW5zdGFuY2VzCisgICAgICAgIHZhcmlhYmxlIGRlZmF1bHRfZ3JpZF9kYXRhCisgICAgICAgIHZhcmlhYmxlIGRlZl91bml0cworCiAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgTWFpbiBDb2RlICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi0gICAgICAgIHNldCBkZWZfdW5pdHMgW2RpY3QgZ2V0ICRkZXNpZ25fZGF0YSBjb25maWcgZGVmX3VuaXRzXQogICAgICAgICBwdXRzICIqKioqKiogSU5GTyAqKioqKioiCisgICAgICAgIGZvcmVhY2ggc3BlY2lmaWNhdGlvbiBbZGljdCBnZXQgJGRlc2lnbl9kYXRhIGdyaWQgc3RkY2VsbF0geworICAgICAgICAgICAgcHJpbnRfc3RyYXRlZ3kgc3RkY2VsbCAkc3BlY2lmaWNhdGlvbgorICAgICAgICB9CisgICAgICAgIGZvcmVhY2ggc3BlY2lmaWNhdGlvbiBbZGljdCBnZXQgJGRlc2lnbl9kYXRhIGdyaWQgbWFjcm9dIHsKKyAgICAgICAgICAgIHByaW50X3N0cmF0ZWd5IG1hY3JvICRzcGVjaWZpY2F0aW9uCisgICAgICAgIH0KICAgICAgICAgcHV0cyAiKioqKiBFTkQgSU5GTyAqKioqIgogCiAgICAgICAgIGZvcmVhY2ggc3BlY2lmaWNhdGlvbiBbZGljdCBnZXQgJGRlc2lnbl9kYXRhIGdyaWQgc3RkY2VsbF0gewotICAgICAgICAgICAgZGljdCBzZXQgc3BlY2lmaWNhdGlvbiBibG9ja2FnZSBbZ2V0X21hY3JvX2hhbG9fYm91bmRhcmllc10KKyAgICAgICAgICAgIGlmIHtbZGljdCBleGlzdHMgJHNwZWNpZmljYXRpb24gbmFtZV19IHsKKyAgICAgICAgICAgICAgICBwdXRzICJJbnNlcnRpbmcgc3RkY2VsbCBncmlkIC0gW2RpY3QgZ2V0ICRzcGVjaWZpY2F0aW9uIG5hbWVdIgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwdXRzICJJbnNlcnRpbmcgc3RkY2VsbCBncmlkIgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZGljdCBzZXQgc3BlY2lmaWNhdGlvbiBibG9ja2FnZSBbZGljdCBrZXlzICRpbnN0YW5jZXNdCiAgICAgICAgICAgICBpZiB7IVtkaWN0IGV4aXN0cyAkc3BlY2lmaWNhdGlvbiBhcmVhXX0gewotICAgICAgICAgICAgICAgIGRpY3Qgc2V0IHNwZWNpZmljYXRpb24gYXJlYSBbbG1hcCB4IFtsaXN0ICQ6OmNvcmVfYXJlYV9sbHggJDo6Y29yZV9hcmVhX2xseSAkOjpjb3JlX2FyZWFfdXJ4ICQ6OmNvcmVfYXJlYV91cnldIHtleHByICR4ICogJDo6ZGVmX3VuaXRzfV0KKyAgICAgICAgICAgICAgICBkaWN0IHNldCBzcGVjaWZpY2F0aW9uIGFyZWEgW2RpY3QgZ2V0ICRkZXNpZ25fZGF0YSBjb25maWcgY29yZV9hcmVhXQogICAgICAgICAgICAgfQogICAgICAgICAgICAgcGRuIGFkZF9ncmlkICRzcGVjaWZpY2F0aW9uCiAgICAgICAgIH0KICAgICAgICAgCi0gICAgICAgIGZvcmVhY2ggaW5zdGFuY2UgW2RpY3Qga2V5cyAkaW5zdGFuY2VzXSB7Ci0gICAgICAgICAgICBmb3JlYWNoIHNwZWNpZmljYXRpb24gW2RpY3QgZ2V0ICRkZXNpZ25fZGF0YSBncmlkIG1hY3JvXSB7Ci0gICAgICAgICAgICAgICAgaWYgeyFbZGljdCBleGlzdHMgJHNwZWNpZmljYXRpb24gYmxvY2thZ2VdfSB7Ci0gICAgICAgICAgICAgICAgICAgIGRpY3Qgc2V0IHNwZWNpZmljYXRpb24gYmxvY2thZ2Uge30KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYge1tkaWN0IGV4aXN0cyAkc3BlY2lmaWNhdGlvbiBpbnN0YW5jZV19IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgeyRpbnN0YW5jZSA9PSBbZGljdCBnZXQgJHNwZWNpZmljYXRpb24gaW5zdGFuY2VdfSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaWN0IHNldCBzcGVjaWZpY2F0aW9uIGFyZWEgW2xtYXAgeCBbZGljdCBnZXQgJGluc3RhbmNlcyAkaW5zdGFuY2UgbWFjcm9fYm91bmRhcnldIHtleHByICR4ICogJDo6ZGVmX3VuaXRzfV0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBkbiBhZGRfZ3JpZCAkc3BlY2lmaWNhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZWlmIHtbZGljdCBleGlzdHMgJHNwZWNpZmljYXRpb24gbWFjcm9dfSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIHtbZGljdCBnZXQgJGluc3RhbmNlcyAkaW5zdGFuY2UgbWFjcm9dID09IFtkaWN0IGdldCAkc3BlY2lmaWNhdGlvbiBtYWNyb119IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpY3Qgc2V0IHNwZWNpZmljYXRpb24gYXJlYSBbbG1hcCB4IFtkaWN0IGdldCAkaW5zdGFuY2VzICRpbnN0YW5jZSBtYWNyb19ib3VuZGFyeV0ge2V4cHIgJHggKiAkOjpkZWZfdW5pdHN9XQotICAgICAgICAgICAgICAgICAgICAgICAgcGRuIGFkZF9ncmlkICRzcGVjaWZpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZGljdCBzZXQgc3BlY2lmaWNhdGlvbiBhcmVhIFtsbWFwIHggW2RpY3QgZ2V0ICRpbnN0YW5jZXMgJGluc3RhbmNlIG1hY3JvX2JvdW5kYXJ5XSB7ZXhwciAkeCAqICQ6OmRlZl91bml0c31dCi0gICAgICAgICAgICAgICAgICAgIHBkbiBhZGRfZ3JpZCAkc3BlY2lmaWNhdGlvbgotICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgaWYge1tsbGVuZ3RoIFtkaWN0IGtleXMgJGluc3RhbmNlc11dID4gMH0geworICAgICAgICAgICAgcHV0cyAiSW5zZXJ0aW5nIG1hY3JvIGdyaWQgZm9yIFtsbGVuZ3RoIFtkaWN0IGtleXMgJGluc3RhbmNlc11dIG1hY3JvcyIKKyAgICAgICAgICAgIGZvcmVhY2ggaW5zdGFuY2UgW2RpY3Qga2V5cyAkaW5zdGFuY2VzXSB7CisgICAgICAgICAgICAgICAgcGRuIGFkZF9ncmlkIFtnZXRfaW5zdGFuY2Vfc3BlY2lmaWNhdGlvbiAkaW5zdGFuY2VdCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgCi0gICAgbmFtZXNwYWNlIGV4cG9ydCBpbml0IGdldF9tZW1vcnlfaW5zdGFuY2VfcGdfcGlucyAKLSAgICBuYW1lc3BhY2UgZXhwb3J0IHNwZWNpZnlfZ3JpZCBwb3dlcl9ncmlkIGFkZF9ncmlkIGdldAorICAgIHByb2Mgb3BlbmRiX3VwZGF0ZV9ncmlkIHt9IHsKKyAgICAgICAgcHV0cyAiV3JpdGluZyB0byBkYXRhYmFzZSIKKyAgICAgICAgd3JpdGVfb3BlbmRiX3ZpYXMKKyAgICAgICAgd3JpdGVfb3BlbmRiX3NwZWNpYWxuZXRzCisgICAgICAgIHdyaXRlX29wZW5kYl9yb3dzCisgICAgfQorICAgICAgICAKKyAgICBwcm9jIGFwcGx5IHtibG9jayBjb25maWd9IHsKKyAgICAgICAgcGRuIGluaXQgJGJsb2NrICRjb25maWcKKworICAgICAgICBwdXRzICIjI1Bvd2VyIERlbGl2ZXJ5IE5ldHdvcmsgR2VuZXJhdG9yOiBHZW5lcmF0aW5nIFBETiBERUYiCisjICAgICAgICAgc2V0IDo6c3RhcnRfdGltZSBbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdCisKKyAgICAgICAgcGRuIHBsYW5fZ3JpZAorICAgICAgICBvcGVuZGJfdXBkYXRlX2dyaWQKKworIyAgICAgICAgcHV0cyAiVG90YWwgd2FsbHRpbWUgdG8gZ2VuZXJhdGUgUEROIERFRiA9IFtleHByIHtbZXhwciB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSAtICQ6OnN0YXJ0X3RpbWV9XS8xMDAwLjB9XSBzZWNvbmRzIgorICAgIH0KKworICAgIG5hbWVzcGFjZSBleHBvcnQgaW5pdCBhcHBseSBnZXRfbWVtb3J5X2luc3RhbmNlX3BnX3BpbnMgb3BlbmRiX3VwZGF0ZV9ncmlkIHNldF9jb3JlX2FyZWEKKyAgICBuYW1lc3BhY2UgZXhwb3J0IHNwZWNpZnlfZ3JpZCBwbGFuX2dyaWQgYWRkX2dyaWQgZ2V0CiAgICAgbmFtZXNwYWNlIGVuc2VtYmxlIGNyZWF0ZQogfQogCi1wYWNrYWdlIHByb3ZpZGUgcGRuIDAuMS4wCitwYWNrYWdlIHByb3ZpZGUgcGRuIDAuMy4wCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvc2NyaXB0cy9kZWZfZ2VuIGIvc2NyaXB0cy9wZG4vc3JjL3NjcmlwdHMvZGVmX2dlbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjg3NjI3NC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvc2NyaXB0cy9kZWZfZ2VuCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLSMhL3Vzci9iaW4vcGVybAotdXNlIEN3ZDsKLSRwcmVfZGVmID0gJEFSR1ZbMF07Ci0kcGRuX2RlZiA9ICRBUkdWWzFdOwotJGRlc2lnbiA9ICRBUkdWWzJdOwotJG91dHB1dF9kZWYgPSAkQVJHVlszXTsKLSR3ZCA9IGN3ZDsKLQotcHJpbnQgIklucHV0IERFRiBmaWxlIGlzICRwcmVfZGVmXG4iOwotcHJpbnQgIlBETiBzcGVjaWFsIG5ldHMgREVGIGZpbGUgaXMgJHBkbl9kZWZcbiI7Ci1wcmludCAiT3V0cHV0IG1lcmdlZCBERUYgZmlsZSBpbiBjdXJyZW50IHdvcmsgZGlyIGlzICRvdXRwdXRfZGVmXG4iOwotCi1pZiAoLWUgJHByZV9kZWYpIHsKLQotICAgIG9wZW4oRlAxLCRwcmVfZGVmKTsKLSAgICBvcGVuKEZQMywkcGRuX2RlZik7Ci0gICAgCi0KLSAgICAKLSAgICBvcGVuKE9QMSwiPiRvdXRwdXRfZGVmIik7Ci0gICAgJGZsYWcgPSAwOwotICAgICR2ZmxhZyA9IDA7Ci0gICAgQHNsaW5lcyA9ICgpOwotICAgIEBzbGluZXMgPSAoKTsKLSAgICBAcmxpbmVzID0gKCk7Ci0KLSAgICAjIyB0byBnZXQgcm93cywgc3BlY2lhbCBuZXRzIGFuZCB2aWFzCi0gICAgd2hpbGUoPEZQMz4pIHsKLSAgICAgICAgaWYgKCRfID1+bS9eVklBUy8pIHsKLSAgICAgICAgICAgICR2ZmxhZyA9IDE7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICgkdmZsYWcgPT0gMSkgewotICAgICAgICAgICAgcHVzaChAdmxpbmVzLCRfKTsKLSAgICAgICAgICAgICMjcHJpbnQgIiRfIjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgkXyA9fm0vXkVORCBWSUFTLykgewotICAgICAgICAgICAgJHZmbGFnID0gMDsKLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoJF8gPX5tL15TUEVDSUFMTkVUUy8pIHsKLSAgICAgICAgICAgICRmbGFnID0gMTsKLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoJGZsYWcgPT0gMSkgewotICAgICAgICAgICAgaWYgKCRfICF+bS9eJC8pIHsKLSAgICAgICAgICAgICAgICBwdXNoIChAc2xpbmVzLCRfKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCRfID1+bS9eRU5EIFNQRUNJQUxORVRTLykgewotICAgICAgICAgICAgJGZsYWcgPSAwOwotCi0gICAgICAgIH0KLQotICAgICAgICBpZiAoJF8gPX5tL15ST1cvKSB7Ci0gICAgICAgICAgICAkcmZsYWcgPSAxOwotCi0gICAgICAgIH0KLSAgICAgICAgaWYgKCRfID1+bS9eRU5EIERFU0lHTi8pIHsKLSAgICAgICAgICAgICRyZmxhZyA9IDA7Ci0KLSAgICAgICAgfSAgIAotCi0gICAgICAgIGlmICgkcmZsYWcgPT0gMSkgewotICAgICAgICAgICAgaWYgKCRfICF+bS9eJC8pIHsKLSAgICAgICAgICAgICAgICBwdXNoIChAcmxpbmVzLCRfKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgfQotICAgIGNsb3NlKEZQMyk7Ci0KLSAgICAkY29tcCA9IDA7Ci0gICAgJG5ldCA9IDA7Ci0gICAgJG5fZmxhZyA9IDA7Ci0gICAgd2hpbGUoPEZQMT4pIHsKLSAgICAgICAgIyNwcmludCAiQG1hY3JvX2FycmF5XG4iOwotICAgICAgICBpZiAoJF8gIX5tL14kLyApIHsKLSAgICAgICAgICAgICMjcHJpbnQgIiRfIjsKLSAgICAgICAgICAgIEBjdXIgPSBzcGxpdCgvXHMrLywkXyk7Ci0gICAgICAgICAgICAkdGVtcCA9ICRjdXJbMl07Ci0gICAgICAgICAgICAjI3ByaW50ICJUaGlyZCBlbGVtZW50IGlzICRjdXJbMl0gYW5kIG1hY3JvIGhhc2ggaXMgJG1hY3JvX2hhc2h7JGN1clsyXX0gXG4iOwotICAgICAgICAgICAgaWYgKCRfID1+bS9eUk9XLykgewotICAgICAgICAgICAgICAgICMjcHJpbnRmIE9QMSAiJF8iOwotICAgICAgICAgICAgICAgICRuX2ZsYWcgPSAxOwotICAgICAgICAgICAgICAgICMjcHJpbnQgIkRvZXMgbm90IG1hdGNoIC0tLS0tIFxuIjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCRuX2ZsYWcgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgIHByaW50ZiBPUDEgIiRfIjsKLSAgICAgICAgICAgICAgI3ByaW50ICIkXyI7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgaWYgKCRuX2ZsYWcgPT0gIDEgJiYgJF8gPX5tLyA7LykgewotICAgICAgICAgICAgICAjbmV4dDsKLSAgICAgICAgICAgICAgJG5fZmxhZyA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoJF8gPX5tL15ESUVBUkVBLykgewotICAgICAgICAgICAgIyNwcmludGYgT1AxICJAdmxpbmVzIjsKLSAgICAgICAgICAgIGZvcmVhY2ggJGVsZW0wIChAdmxpbmVzKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmIE9QMSAiJGVsZW0wIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvcmVhY2ggJGVsZW0zIChAcmxpbmVzKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmIE9QMSAiJGVsZW0zIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICgkXyA9fm0vXkVORCBQSU5TLykgewotICAgICAgICAgICAgJG5ldCA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoJG5ldCA9PSAxKSB7Ci0gICAgICAgICAgICAjI3ByaW50ZiBPUDEgIkBzbGluZXMiOwotICAgICAgICAgICAgZm9yZWFjaCAkZWxlbTIgKEBzbGluZXMpIHsKLSAgICAgICAgICAgICAgICBwcmludGYgT1AxICIkZWxlbTIiOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAkbmV0ID0gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGNsb3NlKEZQMSk7Ci0gICAgY2xvc2UoT1AxKTsgCi0KLX0KLQotCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Bkbi9zcmMvc2NyaXB0cy9kZWZfd3JpdGVyLnRjbCBiL3NjcmlwdHMvcGRuL3NyYy9zY3JpcHRzL2RlZl93cml0ZXIudGNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMTY0Mjc2Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcGRuL3NyYy9zY3JpcHRzL2RlZl93cml0ZXIudGNsCisrKyAvZGV2L251bGwKQEAgLTEsMzE1ICswLDAgQEAKLW5hbWVzcGFjZSBldmFsIDo6cGRuIHsKLSAgICB2YXJpYWJsZSBkZWZPdXQKLSAgICAKLSAgICBwcm9jIG9wZW5fZGVmIHtmaWxlX25hbWV9IHsKLSAgICAgICAgdmFyaWFibGUgZGVmT3V0Ci0gICAgICAgIHNldCBkZWZPdXQgW29wZW4gJGZpbGVfbmFtZSB3XQotICAgIH0KLSAgICAKLSAgICBwcm9jIGNsb3NlX2RlZiB7fSB7Ci0gICAgICAgIHZhcmlhYmxlIGRlZk91dAotICAgICAgICBjbG9zZSAkZGVmT3V0Ci0gICAgfQotICAgIAotICAgIHByb2MgZGVmX291dCB7YXJnc30gewotICAgICAgICB2YXJpYWJsZSBkZWZPdXQKLSAgICAgICAgCi0gICAgICAgIGlmIHtbbGxlbmd0aCAkYXJnc10gPT0gMn0gewotICAgICAgICAgICAgcHV0cyBbbGluZGV4ICRhcmdzIDBdICRkZWZPdXQgW2xpbmRleCAkYXJncyAxXQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHV0cyAkZGVmT3V0IFtsaW5kZXggJGFyZ3MgMF0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm9jIGRlZl9oZWFkZXIge2NvbmZpZ30gewotICAgICAgICBzZXQgZGVmX3VuaXRzIFtkaWN0IGdldCAkY29uZmlnIGRlZl91bml0c10KLSAgICAgICAgCi0gICAgICAgIGRlZl9vdXQgIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyIKLSAgICAgICAgZGVmX291dCAiIyBDcmVhdGVkIGJ5IGFwcGx5X3BkbiBzY3JpcHQiCi0gICAgICAgIGRlZl9vdXQgIiMgQ3JlYXRlZCBvbjogW2Nsb2NrIGZvcm1hdCBbY2xvY2sgc2Vjb25kc10gLWZvcm1hdCB7JUEsIHRoZSAlZCBvZiAlQiwgJVl9XSIKLSAgICAgICAgZGVmX291dCAiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIgotCi0gICAgICAgIGRlZl9vdXQgIlZFUlNJT04gNS44IDsiCi0gICAgICAgIGRlZl9vdXQgIkRJVklERVJDSEFSIFwiL1wiIDsiCi0gICAgICAgIGRlZl9vdXQgIkJVU0JJVENIQVJTIFwiXFtcXVwiIDsiCi0gICAgICAgIGRlZl9vdXQgIkRFU0lHTiBbZGljdCBnZXQgJGNvbmZpZyBkZXNpZ25dIDsiCi0gICAgICAgIGRlZl9vdXQgIlVOSVRTIERJU1RBTkNFIE1JQ1JPTlMgJGRlZl91bml0cyA7IgotICAgICAgICBkZWZfb3V0ICIiCi0KLSAgICAgICAgc2V0IGRpZV9hcmVhX2xseCBbZXhwciBbbGluZGV4IFtkaWN0IGdldCAkY29uZmlnIGRpZV9hcmVhXSAwXSAqICRkZWZfdW5pdHNdCi0gICAgICAgIHNldCBkaWVfYXJlYV9sbHkgW2V4cHIgW2xpbmRleCBbZGljdCBnZXQgJGNvbmZpZyBkaWVfYXJlYV0gMV0gKiAkZGVmX3VuaXRzXQotICAgICAgICBzZXQgZGllX2FyZWFfdXJ4IFtleHByIFtsaW5kZXggW2RpY3QgZ2V0ICRjb25maWcgZGllX2FyZWFdIDJdICogJGRlZl91bml0c10KLSAgICAgICAgc2V0IGRpZV9hcmVhX3VyeSBbZXhwciBbbGluZGV4IFtkaWN0IGdldCAkY29uZmlnIGRpZV9hcmVhXSAzXSAqICRkZWZfdW5pdHNdCi0KLSAgICAgICAgZGVmX291dCAiUFJPUEVSVFlERUZJTklUSU9OUyAKLSAgICAgICAgICAgIERFU0lHTiBGRV9DT1JFX0JPWF9MTF9YIFJFQUwgW2xpbmRleCBbZGljdCBnZXQgJGNvbmZpZyBjb3JlX2FyZWFdIDBdIDsKLSAgICAgICAgICAgIERFU0lHTiBGRV9DT1JFX0JPWF9VUl9YIFJFQUwgW2xpbmRleCBbZGljdCBnZXQgJGNvbmZpZyBjb3JlX2FyZWFdIDFdIDsKLSAgICAgICAgICAgIERFU0lHTiBGRV9DT1JFX0JPWF9MTF9ZIFJFQUwgW2xpbmRleCBbZGljdCBnZXQgJGNvbmZpZyBjb3JlX2FyZWFdIDJdIDsKLSAgICAgICAgICAgIERFU0lHTiBGRV9DT1JFX0JPWF9VUl9ZIFJFQUwgW2xpbmRleCBbZGljdCBnZXQgJGNvbmZpZyBjb3JlX2FyZWFdIDNdIDsKLSAgICAgICAgRU5EIFBST1BFUlRZREVGSU5JVElPTlMiCi0KLSAgICAgICAgZGVmX291dCAiIgotICAgICAgICBkZWZfb3V0ICJESUVBUkVBICggW2V4cHIgcm91bmQoJGRpZV9hcmVhX2xseCldIFtleHByIHJvdW5kKCRkaWVfYXJlYV9sbHkpXSApICggW2V4cHIgcm91bmQoJGRpZV9hcmVhX3VyeCldIFtleHByIHJvdW5kKCRkaWVfYXJlYV91cnkpXSApIDsiCi0KLSAgICAgICAgIyMjIyMgR2VuZXJhdGluZyB2aWEgcnVsZXMKLSAgICAgICAgZ2VuZXJhdGVfdmlhcnVsZXMKLSAgICB9Ci0gICAgCi0gICAgcHJvYyB3cml0ZV92aWFzIHtuZXRfbmFtZX0gewotICAgICAgICBmb3JlYWNoIHZpYSAkOjp2aWFzIHsKLSAgICAgICAgICAgIGlmIHtbZGljdCBnZXQgJHZpYSBuZXRfbmFtZV0gPT0gJG5ldF9uYW1lfSB7Ci0gICAgICAgICAgICAgICAgc2V0IGNvbm5lY3QgW2RpY3QgZ2V0ICR2aWEgY29ubmVjdGlvbnNdCi0gICAgICAgICAgICAgICAgc2V0IGkxIFtkaWN0IGdldCAkY29ubmVjdCBsYXllcjFdCi0gICAgICAgICAgICAgICAgc2V0IGkyIFtkaWN0IGdldCAkY29ubmVjdCBsYXllcjJdCi0gICAgICAgICAgICAgICAgc2V0IHZpYXJ1bGVzIFtkaWN0IGdldCAkY29ubmVjdCBydWxlc10KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzZXQgaW50ZXJzZWN0aW9ucyBbZGljdCBnZXQgJGNvbm5lY3QgaW50ZXJzZWN0aW9uc10KLQotICAgICAgICAgICAgICAgIHNldCBsYXllcjEgW2RpY3QgZ2V0ICRjb25uZWN0IGxheWVyMV0KLSAgICAgICAgICAgICAgICByZWdleHAgeyguKilfUElOfSBbZGljdCBnZXQgJGNvbm5lY3QgbGF5ZXIxXSAtIGxheWVyMSAKLQotICAgICAgICAgICAgICAgIHNldCBsYXllcjIgW2RpY3QgZ2V0ICRjb25uZWN0IGxheWVyMl0KLSAgICAgICAgICAgICAgICBzZXQgaTEgW2xzZWFyY2ggJDo6bWV0X2xheWVyX2xpc3QgJGxheWVyMV0KLSAgICAgICAgICAgICAgICBzZXQgaTIgW2xzZWFyY2ggJDo6bWV0X2xheWVyX2xpc3QgJGxheWVyMl0KLSAgICAgICAgICAgICAgICBpZiB7JGkxID09IC0xfSB7cHV0cyAiTGF5ZXIxIFtkaWN0IGdldCAkY29ubmVjdCBsYXllcjFdLCBMYXllcjIgJGxheWVyMiI7IGV4aXQgLTF9Ci0gICAgICAgICAgICAgICAgaWYgeyRpMiA9PSAtMX0ge3B1dHMgIkxheWVyMSBbZGljdCBnZXQgJGNvbm5lY3QgbGF5ZXIxXSwgTGF5ZXIyICRsYXllcjIiOyBleGl0IC0xfQotCSAgICAgICAgIyBGb3IgZWFjaCBsYXllciBiZXR3ZWVuIGwxIGFuZCBsMiwgYWRkIHZpYXMgYXQgdGhlIGludGVyc2VjdGlvbgotCSAgICAgICAgZm9yIHtzZXQgaSAkaTF9IHskaSA8ICRpMn0ge2luY3IgaX0gewotCQkgICAgc2V0IGxheSBbbGluZGV4ICQ6Om1ldF9sYXllcl9saXN0ICRpXQotCQkgICAgc2V0IHJ1bGUgW2xpbmRleCAkdmlhcnVsZXMgJGldCi0JCSAgICBmb3JlYWNoIGxvYyAkaW50ZXJzZWN0aW9ucyB7Ci0JCSAgICAgICAgZGVmX291dCAiICAgIE5FVyAkbGF5IDAgKyBTSEFQRSBTVFJJUEUgKCBbZXhwciByb3VuZChbbGluZGV4ICRsb2MgMF0pXSBbZXhwciByb3VuZChbbGluZGV4ICRsb2MgMV0pXSApICRydWxlIgotCQkgICAgfQotCSAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgIyNwcm9jIHRvIGNyZWF0ZSBmcmFnbWVudHMgcm93cyBiYXNlZCBvbiBtYWNyb3MgKGJsb2NrYWdlcykKLQotICAgIHByb2MgaW5pdF9vcmllbnRhdGlvbiB7aGVpZ2h0fSB7Ci0gICAgICAgIHZhcmlhYmxlIGxvd2VzdF9yYWlsCi0gICAgICAgIHZhcmlhYmxlIG9yaWVudF9yb3dzCi0gICAgICAgIAotICAgICAgICBzZXQgbG93ZXN0X3JhaWwgJGhlaWdodAotICAgICAgICBpZiB7JDo6cmFpbHNfc3RhcnRfd2l0aCA9PSAiR1JPVU5EIn0gewotICAgICAgICAgICAgc2V0IG9yaWVudF9yb3dzIHswICJOIiAxICJGUyJ9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXQgb3JpZW50X3Jvd3MgezAgIkZTIiAxICJOIn0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb2Mgb3JpZW50YXRpb24ge2hlaWdodH0gewotICAgICAgICB2YXJpYWJsZSBsb3dlc3RfcmFpbAotICAgICAgICB2YXJpYWJsZSBvcmllbnRfcm93cwotICAgICAgICAKLSAgICAgICAgc2V0IHJvd19saW5lIFtleHByIGludCgoJGhlaWdodCAtICRsb3dlc3RfcmFpbCkgLyAkOjpyb3dfaGVpZ2h0KV0KLSAgICAgICAgcmV0dXJuIFtkaWN0IGdldCAkb3JpZW50X3Jvd3MgW2V4cHIgJHJvd19saW5lICUgMl1dCi0gICAgfQotICAgICAgICAKLSAgICBwcm9jIHdyaXRlX3JvdyB7aGVpZ2h0IHN0YXJ0IGVuZH0gewotICAgICAgICBzZXQgc3RhcnQgIFtleHByIGludCgkc3RhcnQpXQotICAgICAgICBzZXQgaGVpZ2h0IFtleHByIGludCgkaGVpZ2h0KV0KLSAgICAgICAgc2V0IGVuZCAgICBbZXhwciBpbnQoJGVuZCldCi0KLSAgICAgICAgaWYgeyRzdGFydCA9PSAkZW5kfSB7cmV0dXJufQotCXNldCBzaXRlX3dpZHRoIFtleHByIHtpbnQocm91bmQoJDo6c2l0ZV93aWR0aCAqICQ6OmRlZl91bml0cykpfV0KLQlpZiB7W2V4cHIgeyBpbnQoJHN0YXJ0IC0gKCQ6OmNvcmVfYXJlYV9sbHggKiAkOjpkZWZfdW5pdHMpKSAlICRzaXRlX3dpZHRofV0gPT0gMH0gewotCQlzZXQgeCAkc3RhcnQKLQotCX0gZWxzZSB7Ci0JCXNldCBvZmZzZXQgW2V4cHIgeyBpbnQoJHN0YXJ0IC0gKCQ6OmNvcmVfYXJlYV9sbHggKiAkOjpkZWZfdW5pdHMpKSAlICRzaXRlX3dpZHRofV0KLQkJc2V0IHggW2V4cHIgeyRzdGFydCArICRzaXRlX3dpZHRoIC0gJG9mZnNldH1dCi0KLQl9Ci0KLQlzZXQgbnVtICBbZXhwciB7KCRlbmQgLSAkeCkvJHNpdGVfd2lkdGh9XQotICAgICAgICBkZWZfb3V0ICJST1cgUk9XXyQ6OnJvd19pbmRleCAkOjpzaXRlX25hbWUgJHggJGhlaWdodCBbb3JpZW50YXRpb24gJGhlaWdodF0gRE8gJG51bSBCWSAxIFNURVAgJHNpdGVfd2lkdGggMCA7IgotICAgICAgICAKLSAgICAgICAgaW5jciA6OnJvd19pbmRleAotICAgIH0KLQotICAgIHByb2Mgd3JpdGVfcm93cyB7fSB7Ci0gICAgICAgIHNldCBzdHJpcGVzIFtjb25jYXQgJDo6c3RyaXBlX2xvY3MoJDo6cmFpbHNfbWxheWVyLFBPV0VSKSAkOjpzdHJpcGVfbG9jcygkOjpyYWlsc19tbGF5ZXIsR1JPVU5EKV0KLSAgICAgICAgc2V0IHN0cmlwZXMgW2xtYXAgeCAkc3RyaXBlcyB7ZXhwciB7W2xpbmRleCAkeCAwXSA9PSBbbGluZGV4ICR4IDJdID8gW2NvbnRpbnVlXSA6ICR4fX1dCi0gICAgICAgIHNldCBzdHJpcGVzIFtsc29ydCAtcmVhbCAtaW5kZXggMSAkc3RyaXBlc10KLSAgICAgICAgc2V0IGhlaWdodHMgW2xzb3J0IC11bmlxdWUgLXJlYWwgW2xtYXAgeCAkc3RyaXBlcyB7bGluZGV4ICR4IDF9XV0KLQotICAgICAgICBpbml0X29yaWVudGF0aW9uIFtsaW5kZXggJGhlaWdodHMgMF0KLQotCWZvcmVhY2ggaGVpZ2h0IFtscmFuZ2UgJGhlaWdodHMgMCBlbmQtMV0gewotICAgICAgICAgICAgc2V0IGxvd2VyX3JhaWxzIFtsc29ydCAtcmVhbCAtaW5kZXggMiBbbG1hcCB4ICRzdHJpcGVzIHtleHByIHtbbGluZGV4ICR4IDFdID09ICRoZWlnaHQgPyAkeCA6IFtjb250aW51ZV0gfX1dXQotICAgICAgICAgICAgc2V0IGxvd2VyX3JhaWxzIFtsbWFwIHggJGxvd2VyX3JhaWxzIHtleHByIHtbbGluZGV4ICR4IDBdID09IFtsaW5kZXggJHggMl0gPyBbY29udGludWVdIDogJHh9fV0KLSAgICAgICAgICAgIHNldCB1cHBlcl9yYWlscyBbbHNvcnQgLXJlYWwgLWluZGV4IDIgW2xtYXAgeCAkc3RyaXBlcyB7ZXhwciB7W2xpbmRleCAkeCAxXSA9PSAkaGVpZ2h0ICsgJDo6cm93X2hlaWdodCA/ICR4IDogW2NvbnRpbnVlXSB9fV1dCi0gICAgICAgICAgICBzZXQgdXBwZXJfcmFpbHMgW2xtYXAgeCAkdXBwZXJfcmFpbHMge2V4cHIge1tsaW5kZXggJHggMF0gPT0gW2xpbmRleCAkeCAyXSA/IFtjb250aW51ZV0gOiAkeH19XQotICAgICAgICAgICAgc2V0IHVwcGVyX2V4dGVudHMgW2NvbmNhdCB7Kn1bbG1hcCB4ICR1cHBlcl9yYWlscyB7bGlzdCBbbGluZGV4ICR4IDBdIFtsaW5kZXggJHggMl19XV0KLQotICAgICAgICAgICAgZm9yZWFjaCBscmFpbCAkbG93ZXJfcmFpbHMgewotICAgICAgICAgICAgICAgIHNldCBpZHggMAotICAgICAgICAgICAgICAgIHNldCBzdGFydCBbbGluZGV4ICRscmFpbCAwXQotICAgICAgICAgICAgICAgIHNldCBlbmQgICBbbGluZGV4ICRscmFpbCAyXQotCi0gICAgICAgICAgICAgICAgIyBGaW5kIGluZGV4IG9mIGZpcnN0IG51bWJlciB0aGF0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhpcyByYWlsCi0gICAgICAgICAgICAgICAgd2hpbGUgeyRpZHggPCBbbGxlbmd0aCAkdXBwZXJfZXh0ZW50c119IHsKLSAgICAgICAgICAgICAgICAgICAgaWYge1tsaW5kZXggJHVwcGVyX2V4dGVudHMgJGlkeF0gPiAkc3RhcnR9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW5jciBpZHgKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiB7W2xpbmRleCAkdXBwZXJfZXh0ZW50cyAkaWR4XSA8PSAkc3RhcnR9IHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiB7JGlkeCAlIDIgPT0gMH0gewotICAgICAgICAgICAgICAgICAgICAjIElmIHRoZSBpbmRleCBpcyBldmVuLCB0aGVuIHRoZSBzdGFydCBvZiB0aGUgcmFpbCBoYXMgbm8gbWF0Y2hpbmcgcmFpbCBhYm92ZSBpdAotICAgICAgICAgICAgICAgICAgICBzZXQgcm93X3N0YXJ0IFtsaW5kZXggJHVwcGVyX2V4dGVudHMgJGlkeF0KLSAgICAgICAgICAgICAgICAgICAgaW5jciBpZHgKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAjIElmIHRoZSBpbmRleCBpcyBvZGQsIHRoZW4gdGhlIHN0YXJ0IG9mIHRoZSByYWlsIGhhcyBtYXRjaGluIHJhaWwgYWJvdmUgaXQKLSAgICAgICAgICAgICAgICAgICAgc2V0IHJvd19zdGFydCAkc3RhcnQKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiB7JGVuZCA8PSBbbGluZGV4ICR1cHBlcl9leHRlbnRzICRpZHhdfSB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlX3JvdyAkaGVpZ2h0ICRyb3dfc3RhcnQgJGVuZAotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSB7JGlkeCA8IFtsbGVuZ3RoICR1cHBlcl9leHRlbnRzXSAmJiAkZW5kID4gW2xpbmRleCAkdXBwZXJfZXh0ZW50cyBbZXhwciAkaWR4ICsgMV1dfSB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlX3JvdyAkaGVpZ2h0ICRyb3dfc3RhcnQgW2xpbmRleCAkdXBwZXJfZXh0ZW50cyAkaWR4XQotICAgICAgICAgICAgICAgICAgICBzZXQgcm93X3N0YXJ0IFtsaW5kZXggJHVwcGVyX2V4dGVudHMgW2V4cHIgJGlkeCArIDFdXQotICAgICAgICAgICAgICAgICAgICBzZXQgaWR4IFtleHByICRpZHggKyAyXQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgICNwcm9jIHRvIHdyaXRlIHNwZWNpYWwgbmV0cyBpbiB0aGUgb3V0cHV0IGRlZiBmaWxlLCBmb3IgZWFjaCBsYXllciBhbmQgZWFjaCBkb21haW5zLCAKLSAgICBwcm9jIHdyaXRlX2RlZiB7bGF5IHRhZ30gewotICAgICAgICBzZXQgZGlyIFtnZXRfZGlyICRsYXldCi0gICAgICAgIAotCSAgICBpZiB7JGRpciA9PSAiaG9yIn0gewotCQkgICAgZm9yZWFjaCBsX3N0ciAkOjpzdHJpcGVfbG9jcygkbGF5LCR0YWcpIHsKLQkJCSAgICBzZXQgbDEgW2V4cHIgcm91bmQoW2xpbmRleCAkbF9zdHIgMF0pXQotCQkJICAgIHNldCBsMiBbZXhwciByb3VuZChbbGluZGV4ICRsX3N0ciAxXSldCi0JCQkgICAgc2V0IGwzIFtleHByIHJvdW5kKFtsaW5kZXggJGxfc3RyIDJdKV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB7JGwxID09ICRsM30ge2NvbnRpbnVlfQotCQkJICAgIGlmIHskbGF5ID09ICQ6OnJhaWxzX21sYXllcn0gewotCQkJCSAgICBpZiB7JDo6c2VnX2NvdW50ID09IDEgfSB7Ci0JCQkJCSAgICBkZWZfb3V0ICIgICAgJGxheSBbZXhwciByb3VuZCgkOjp3aWR0aHMoJGxheSkpXSArIFNIQVBFIEZPTExPV1BJTiAoICRsMSAkbDIgKSAoICRsMyAqICkiCi0JCQkJCSAgICBzZXQgOjpzZWdfY291bnQgMgotCQkJCSAgICB9IGVsc2UgewotCQkJCQkgICAgZGVmX291dCAiICAgIE5FVyAkbGF5IFtleHByIHJvdW5kKCQ6OndpZHRocygkbGF5KSldICsgU0hBUEUgRk9MTE9XUElOICggJGwxICRsMiApICggJGwzICogKSIKLQkJCQkJICAgIHNldCA6OnNlZ19jb3VudCAyCi0JCQkJICAgIH0KLQkJCSAgICB9IGVsc2UgewotCQkJCSAgICBpZiB7JDo6c2VnX2NvdW50ID09IDEgfSB7Ci0JCQkJCSAgICBkZWZfb3V0ICIgICAgJGxheSBbZXhwciByb3VuZCgkOjp3aWR0aHMoJGxheSkpXSArIFNIQVBFIFNUUklQRSAoICRsMSAkbDIgKSAoICRsMyAqICkiCi0JCQkJCSAgICBzZXQgOjpzZWdfY291bnQgMgotCQkJCSAgICB9IGVsc2UgewotCQkJCQkgICAgZGVmX291dCAiICAgIE5FVyAkbGF5IFtleHByIHJvdW5kKCQ6OndpZHRocygkbGF5KSldICsgU0hBUEUgU1RSSVBFICggJGwxICRsMiApICggJGwzICogKSIKLQkJCQkJICAgIHNldCA6OnNlZ19jb3VudCAyCi0JCQkJICAgIH0KLQkJCSAgICB9Ci0KLQkJICAgIH0KLQotCSAgICB9IGVsc2VpZiB7JGRpciA9PSAidmVyIn0gewotCQkgICAgZm9yZWFjaCBsX3N0ciAkOjpzdHJpcGVfbG9jcygkbGF5LCR0YWcpIHsKLQkJCSAgICBzZXQgbDEgW2V4cHIgcm91bmQoW2xpbmRleCAkbF9zdHIgMF0pXQotCQkJICAgIHNldCBsMiBbZXhwciByb3VuZChbbGluZGV4ICRsX3N0ciAxXSldCi0JCQkgICAgc2V0IGwzIFtleHByIHJvdW5kKFtsaW5kZXggJGxfc3RyIDJdKV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB7JGwyID09ICRsM30ge2NvbnRpbnVlfQotCQkJICAgIGlmIHskbGF5ID09ICQ6OnJhaWxzX21sYXllcn0gewotCQkJCSAgICBpZiB7JDo6c2VnX2NvdW50ID09IDEgfSB7Ci0JCQkJCSAgICBkZWZfb3V0ICIgICAgJGxheSBbZXhwciByb3VuZCgkOjp3aWR0aHMoJGxheSkpXSArIFNIQVBFIEZPTExPV1BJTiAoICRsMSAkbDIgKSAoICogJGwzICkiCi0JCQkJCSAgICBzZXQgOjpzZWdfY291bnQgMgotCQkJCSAgICB9IGVsc2UgewotCQkJCQkgICAgZGVmX291dCAiICAgIE5FVyAkbGF5IFtleHByIHJvdW5kKCQ6OndpZHRocygkbGF5KSldICsgU0hBUEUgRk9MTE9XUElOICggJGwxICRsMiApICggKiAkbDMgKSIJCi0JCQkJCSAgICBzZXQgOjpzZWdfY291bnQgMgotCQkJCSAgICB9Ci0JCQkgICAgfSBlbHNlIHsKLQkJCQkgICAgaWYgeyQ6OnNlZ19jb3VudCA9PSAxIH0gewotCQkJCQkgICAgZGVmX291dCAiICAgICRsYXkgW2V4cHIgcm91bmQoJDo6d2lkdGhzKCRsYXkpKV0gKyBTSEFQRSBTVFJJUEUgKCAkbDEgJGwyICkgKCAqICRsMyApIgotCQkJCQkgICAgc2V0IDo6c2VnX2NvdW50IDIKLQkJCQkgICAgfSBlbHNlIHsKLQkJCQkJICAgIGRlZl9vdXQgIiAgICBORVcgJGxheSBbZXhwciByb3VuZCgkOjp3aWR0aHMoJGxheSkpXSArIFNIQVBFIFNUUklQRSAoICRsMSAkbDIgKSAoICogJGwzICkiCi0JCQkJCSAgICBzZXQgOjpzZWdfY291bnQgMgotCQkJCSAgICB9Ci0JCQkgICAgfQotCQkgICAgfQkJCi0KLQkgICAgfQotCi0KLSAgICB9Ci0KLQotCi0gICAgcHJvYyBvdXRwdXRfZGVmIHt9IHsKLSAgICAgICAgdmFyaWFibGUgZGVzaWduX2RhdGEKLSAgICAgICAgCi0gICAgICAgICMjIyMjCi0gICAgICAgICMgU3RhcnQgd3JpdGluZyB0byB0aGUgREVGIGZpbGUKLSAgICAgICAgb3Blbl9kZWYgW2RpY3QgZ2V0ICRkZXNpZ25fZGF0YSBjb25maWcgZGVmX291dHB1dF0KLQotICAgICAgICBkZWZfaGVhZGVyIFtkaWN0IGdldCAkZGVzaWduX2RhdGEgY29uZmlnXQotCi0gICAgICAgICMjIyMjIEdlbmVyYXRpbmcgdGhlIFNQRUNJQUxORVRTIGhlYWRlcgotCi0gICAgICAgIHNldCBzaXplX29mX3BnX25ldHMgW2V4cHIge1tsbGVuZ3RoICQ6OnBvd2VyX25ldHNdICsgW2xsZW5ndGggJDo6Z3JvdW5kX25ldHNdfV0KLSAgICAgICAgZGVmX291dCAiXG5TUEVDSUFMTkVUUyAkc2l6ZV9vZl9wZ19uZXRzIDsiCi0gICAgICAgIGZvcmVhY2ggbmV0X25hbWUgJDo6cG93ZXJfbmV0cyB7Ci0gICAgICAgICAgICBzZXQgdGFnICJQT1dFUiIKLSAgICAgICAgICAgIGRlZl9vdXQgLW5vbmV3bGluZSAiLSAkbmV0X25hbWUgICggKiAkbmV0X25hbWUgKSIKLSAgICAgICAgICAgIGZvcmVhY2ggcGluX25hbWUgJDo6bWFjcm9fcG93ZXJfcGlucyB7Ci0gICAgICAgICAgICAgICAgZGVmX291dCAtbm9uZXdsaW5lICIgKCAqICRwaW5fbmFtZSApIgotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmX291dCAiIgotICAgICAgICAgICAgCi0gICAgICAgICAgICBkZWZfb3V0IC1ub25ld2xpbmUgIiAgKyBST1VURUQgIiAKLQotICAgICAgICAgICAgc2V0IDo6c2VnX2NvdW50IDEKLSAgICAgICAgICAgIGZvcmVhY2ggbGF5ICQ6Om1ldF9sYXllcl9saXN0IHsKLSAgICAgICAgICAgICAgICB3cml0ZV9kZWYgJGxheSAkdGFnCQotICAgICAgICAgICAgfQotICAgICAgICAgICAgd3JpdGVfdmlhcyAkbmV0X25hbWUKLSAgICAgICAgICAgIGRlZl9vdXQgIiAgKyBVU0UgJHRhZ1xuIDsiCi0gICAgICAgIH0KLQotICAgICAgICBmb3JlYWNoIG5ldF9uYW1lICQ6Omdyb3VuZF9uZXRzIHsKLSAgICAgICAgICAgIHNldCB0YWcgIkdST1VORCIKLSAgICAgICAgICAgIGRlZl9vdXQgLW5vbmV3bGluZSAiLSAkbmV0X25hbWUgICggKiAkbmV0X25hbWUgKSIKLSAgICAgICAgICAgIGZvcmVhY2ggcGluX25hbWUgJDo6bWFjcm9fZ3JvdW5kX3BpbnMgewotICAgICAgICAgICAgICAgIGRlZl9vdXQgLW5vbmV3bGluZSAiICggKiAkcGluX25hbWUgKSIKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZl9vdXQgIiIKLSAgICAgICAgICAgIGRlZl9vdXQgLW5vbmV3bGluZSAiICArIFJPVVRFRCAiIAotCi0gICAgICAgICAgICBzZXQgOjpzZWdfY291bnQgMQotICAgICAgICAgICAgZm9yZWFjaCBsYXkgJDo6bWV0X2xheWVyX2xpc3QgewotICAgICAgICAgICAgICAgIHdyaXRlX2RlZiAkbGF5ICR0YWcJCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3cml0ZV92aWFzICRuZXRfbmFtZQotICAgICAgICAgICAgZGVmX291dCAiICArIFVTRSAkdGFnXG4gOyIKLSAgICAgICAgfQotICAgICAgICBkZWZfb3V0ICJcbkVORCBTUEVDSUFMTkVUUyIKLQotICAgICAgICB3cml0ZV9yb3dzCi0gICAgICAgIGRlZl9vdXQgIlxuRU5EIERFU0lHTiIKLQotICAgICAgICBjbG9zZV9kZWYKLQotICAgICAgICBwdXRzICJUb3RhbCB3YWxsdGltZSA9IFtleHByIHtbZXhwciB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSAtICQ6OnN0YXJ0X3RpbWV9XS8xMDAwLjB9XSBzZWNvbmRzIgotICAgICAgICBwdXRzIFtkaWN0IGdldCAkZGVzaWduX2RhdGEgY29uZmlnIGRlZl9vdXRwdXRdCi0gICAgICAgIGlmIHtbY2F0Y2gge2dsb2IgW2RpY3QgZ2V0ICRkZXNpZ25fZGF0YSBjb25maWcgZGVmX291dHB1dF19XX0gewotICAgICAgICAgIHB1dHMgIkVSUk9SOiBDb3VsZCBub3QgZ2VuZXJhdGUgUEROIERFRiAuLi4iCi0gICAgICAgICAgcHV0cyAiRXhpdGluZy4uLiIKLSAgICAgICAgICBleGl0Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcHV0cyAiIyMjUEFTU0VEIFBETiBERUYgY3JlYXRpb24gLi4uLi4iCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgbmFtZXNwYWNlIGV4cG9ydCBvdXRwdXRfZGVmIGRlZl9vdXQKLX0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9zY3JpcHRzL2dlbl9ibG9ja2FnZS50Y2wgYi9zY3JpcHRzL3Bkbi9zcmMvc2NyaXB0cy9nZW5fYmxvY2thZ2UudGNsCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggYjY5MjdmNC4uOWMwNmUwYgotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvc2NyaXB0cy9nZW5fYmxvY2thZ2UudGNsCisrKyBiL3NjcmlwdHMvcGRuL3NyYy9zY3JpcHRzL2dlbl9ibG9ja2FnZS50Y2wKQEAgLTIsMTYgKzIsNiBAQAogICAgIHZhcmlhYmxlIG1hY3JvcyB7fQogICAgIHZhcmlhYmxlIGluc3RhbmNlcyB7fQogICAgIAotICAgIHByb2Mgd3JpdGVfbWFjcm9jZWxsX2xpc3Qge2ZpbGVfbmFtZX0gewotICAgICAgICB2YXJpYWJsZSBtYWNyb3MKLSAgICAgICAgCi0gICAgICAgIHNldCBjaCBbb3BlbiAkZmlsZV9uYW1lICJ3Il0KLSAgICAgICAgZm9yZWFjaCBtYWNyb19uYW1lIFtkaWN0IGtleXMgJG1hY3Jvc10gewotICAgICAgICAgICAgcHV0cyAkY2ggJG1hY3JvX25hbWUKLSAgICAgICAgfQotICAgICAgICBjbG9zZSAkY2gKLSAgICB9Ci0gICAgCiAgICAgcHJvYyBnZXRfbWFjcm9fYm91bmRhcmllcyB7fSB7CiAgICAgICAgIHZhcmlhYmxlIGluc3RhbmNlcwogCkBAIC0zNCwxMTQgKzI0LDg5IEBACiAgICAgICAgIHJldHVybiAkYm91bmRhcmllcwogICAgIH0KICAgICAKLSAgICBwcm9jIHJlYWRfbWFjcm9fYm91bmRhcmllcyB7ZGVmIGxlZl9maWxlc30geworICAgIHByb2MgcmVhZF9tYWNyb19ib3VuZGFyaWVzIHt9IHsKKyAgICAgICAgdmFyaWFibGUgbGlicwogICAgICAgICB2YXJpYWJsZSBtYWNyb3MKICAgICAgICAgdmFyaWFibGUgaW5zdGFuY2VzCi0gICAgICAgIAotICAgICAgICBmb3JlYWNoIGZpbGUgJGxlZl9maWxlcyB7Ci0gICAgICAgICAgICBzZXQgY2ggW29wZW4gJGZpbGVdCiAKLSAgICAgICAgICAgIHdoaWxlIHshW2VvZiAkY2hdfSB7Ci0gICAgICAgICAgICAgICAgc2V0IGxpbmUgW2dldHMgJGNoXQorICAgICAgICBmb3JlYWNoIGxpYiAkbGlicyB7CisgICAgICAgICAgICBmb3JlYWNoIGNlbGwgWyRsaWIgZ2V0TWFzdGVyc10geworICAgICAgICAgICAgICAgIGlmIHtbJGNlbGwgZ2V0VHlwZV0gPT0gIkNPUkUifSB7Y29udGludWV9CisgICAgICAgICAgICAgICAgaWYge1skY2VsbCBnZXRUeXBlXSA9PSAiSU8ifSB7Y29udGludWV9CisgICAgICAgICAgICAgICAgaWYge1skY2VsbCBnZXRUeXBlXSA9PSAiUEFEIn0ge2NvbnRpbnVlfQorICAgICAgICAgICAgICAgIGlmIHtbJGNlbGwgZ2V0VHlwZV0gPT0gIlBBRF9TUEFDRVIifSB7Y29udGludWV9CisgICAgICAgICAgICAgICAgaWYge1skY2VsbCBnZXRUeXBlXSA9PSAiU1BBQ0VSIn0ge2NvbnRpbnVlfQorICAgICAgICAgICAgICAgIGlmIHtbJGNlbGwgZ2V0VHlwZV0gPT0gIk5PTkUifSB7Y29udGludWV9CisgICAgICAgICAgICAgICAgaWYge1skY2VsbCBnZXRUeXBlXSA9PSAiRU5EQ0FQX1BSRSJ9IHtjb250aW51ZX0KKyAgICAgICAgICAgICAgICBpZiB7WyRjZWxsIGdldFR5cGVdID09ICJFTkRDQVBfQk9UVE9NTEVGVCJ9IHtjb250aW51ZX0KKyAgICAgICAgICAgICAgICBpZiB7WyRjZWxsIGdldFR5cGVdID09ICJFTkRDQVBfQk9UVE9NUklHSFQifSB7Y29udGludWV9CisgICAgICAgICAgICAgICAgaWYge1skY2VsbCBnZXRUeXBlXSA9PSAiRU5EQ0FQX1RPUExFRlQifSB7Y29udGludWV9CisgICAgICAgICAgICAgICAgaWYge1skY2VsbCBnZXRUeXBlXSA9PSAiRU5EQ0FQX1RPUFJJR0hUIn0ge2NvbnRpbnVlfQorICAgICAgICAgICAgICAgIGlmIHtbJGNlbGwgZ2V0VHlwZV0gPT0gIkVORENBUCJ9IHtjb250aW51ZX0KKyAgICAgICAgICAgICAgICBpZiB7WyRjZWxsIGdldFR5cGVdID09ICJDT1JFX1NQQUNFUiJ9IHtjb250aW51ZX0KKyAgICAgICAgICAgICAgICBpZiB7WyRjZWxsIGdldFR5cGVdID09ICJDT1JFX1RJRUhJR0gifSB7Y29udGludWV9CisgICAgICAgICAgICAgICAgaWYge1skY2VsbCBnZXRUeXBlXSA9PSAiQ09SRV9USUVMT1cifSB7Y29udGludWV9CiAKLSAgICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCB7XnMqTUFDUk8gKFteXHNdKil9ICRsaW5lIC0gbWFjcm9fbmFtZV19IHsKLSAgICAgICAgICAgICAgICAgICAgc2V0IHJlamVjdCAwCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlIHshW2VvZiAkY2hdfSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXQgbGluZSBbZ2V0cyAkY2hdCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCAiRU5EICRtYWNyb19uYW1lIiAkbGluZV19IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tyZWdleHAge15ccypDTEFTUyBDT1JFfSAkbGluZV19IHtzZXQgcmVqZWN0IDF9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCB7XlxzKkNMQVNTIElPfSAkbGluZV19IHtzZXQgcmVqZWN0IDF9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCB7XlxzKkNMQVNTIEVORENBUH0gJGxpbmVdfSB7c2V0IHJlamVjdCAxfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgeyRyZWplY3QgPT0gMX0ge2JyZWFrfQotCi0gICAgICAgICAgICAgICAgICAgICAgICByZWdleHAge15ccypTSVpFIChbMC05XC5dKikgQlkgKFswLTlcLl0qKX0gJGxpbmUgLSB3aWR0aCBoZWlnaHQKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiB7JHJlamVjdCA9PSAwfSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaWN0IHNldCBtYWNyb3MgJG1hY3JvX25hbWUgW2xpc3Qgd2lkdGggJHdpZHRoIGhlaWdodCAkaGVpZ2h0XQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xvc2UgJGNoCi0gICAgICAgIH0KLQotICAgICAgICBzZXQgY2ggW29wZW4gJGRlZl0KLSAgICAgICAgd2hpbGUgeyFbZW9mICRjaF19IHsKLSAgICAgICAgICAgIHNldCBsaW5lIFtnZXRzICRjaF0KLQotICAgICAgICAgICAgcmVnZXhwIHtVTklUUyBESVNUQU5DRSBNSUNST05TIChbMC05XSopfSAkbGluZSAtIGRidQotCi0gICAgICAgICAgICBpZiB7W3JlZ2V4cCB7XkNPTVBPTkVOVFMgWzAtOV0qfSAkbGluZV19IHsKLSAgICAgICAgICAgICAgICBzZXQgaW5zdGFuY2VzIFtyZWFkX2RlZl9jb21wb25lbnRzICRjaCBbZGljdCBrZXlzICRtYWNyb3NdXQorICAgICAgICAgICAgICAgIGRpY3Qgc2V0IG1hY3JvcyBbJGNlbGwgZ2V0TmFtZV0gW2xpc3QgXAorICAgICAgICAgICAgICAgICAgICB3aWR0aCAgWyRjZWxsIGdldFdpZHRoXSBcCisgICAgICAgICAgICAgICAgICAgIGhlaWdodCBbJGNlbGwgZ2V0SGVpZ2h0XSBcCisgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGNsb3NlICRjaAogCi0gICAgICAgIHNldCBtYWNyb19ib3VuZGFyaWVzIHt9CisgICAgICAgIHNldCBpbnN0YW5jZXMgW3JlYWRfZGVmX2NvbXBvbmVudHMgW2RpY3Qga2V5cyAkbWFjcm9zXV0KKwogICAgICAgICBmb3JlYWNoIGluc3RhbmNlIFtkaWN0IGtleXMgJGluc3RhbmNlc10gewogICAgICAgICAgICAgc2V0IG1hY3JvX25hbWUgW2RpY3QgZ2V0ICRpbnN0YW5jZXMgJGluc3RhbmNlIG1hY3JvXQotICAgICAgICAgICAgc2V0IHdpZHRoICBbZXhwciBbZGljdCBnZXQgJG1hY3JvcyAkbWFjcm9fbmFtZSB3aWR0aF0gKiAkZGJ1XQotICAgICAgICAgICAgc2V0IGhlaWdodCBbZXhwciBbZGljdCBnZXQgJG1hY3JvcyAkbWFjcm9fbmFtZSBoZWlnaHRdICokZGJ1XQogCi0gICAgICAgICAgICBzZXQgbGx4IFtkaWN0IGdldCAkaW5zdGFuY2VzICRpbnN0YW5jZSB4XQotICAgICAgICAgICAgc2V0IGxseSBbZGljdCBnZXQgJGluc3RhbmNlcyAkaW5zdGFuY2UgeV0KKyAgICAgICAgICAgIHNldCBsbHggW2RpY3QgZ2V0ICRpbnN0YW5jZXMgJGluc3RhbmNlIHhtaW5dCisgICAgICAgICAgICBzZXQgbGx5IFtkaWN0IGdldCAkaW5zdGFuY2VzICRpbnN0YW5jZSB5bWluXQorICAgICAgICAgICAgc2V0IHVyeCBbZGljdCBnZXQgJGluc3RhbmNlcyAkaW5zdGFuY2UgeG1heF0KKyAgICAgICAgICAgIHNldCB1cnkgW2RpY3QgZ2V0ICRpbnN0YW5jZXMgJGluc3RhbmNlIHltYXhdCiAKLSAgICAgICAgICAgIHNldCBvcmllbnQgW2RpY3QgZ2V0ICRpbnN0YW5jZXMgJGluc3RhbmNlIG9yaWVudF0gICAgCi0gICAgICAgICAgICBpZiB7JG9yaWVudCA9PSAiTiIgfHwgJG9yaWVudCA9PSAiRk4iIHx8ICRvcmllbnQgPT0gIlMiIHx8ICRvcmllbnQgPT0gIkZTIn0geyAKLSAgICAgICAgICAgICAgICBzZXQgdXJ4IFtleHByICRsbHggKyAkd2lkdGhdCi0gICAgICAgICAgICAgICAgc2V0IHVyeSBbZXhwciAkbGx5ICsgJGhlaWdodF0KLSAgICAgICAgICAgIH0gZWxzZWlmIHskb3JpZW50ID09ICJXIiB8fCAkb3JpZW50ID09ICJGVyIgfHwgJG9yaWVudCA9PSAiRSIgfHwgJG9yaWVudCA9PSAiRkUifSB7IAotICAgICAgICAgICAgICAgIHNldCB1cnggW2V4cHIgJGxseCArICRoZWlnaHRdCi0gICAgICAgICAgICAgICAgc2V0IHVyeSBbZXhwciAkbGx5ICsgJHdpZHRoXQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkaWN0IHNldCBpbnN0YW5jZXMgJGluc3RhbmNlIG1hY3JvX2JvdW5kYXJ5IFtsbWFwIHggW2xpc3QgJGxseCAkbGx5ICR1cnggJHVyeV0ge2V4cHIgJHggKiAxLjAgLyAkZGJ1fV0KKyAgICAgICAgICAgIGRpY3Qgc2V0IGluc3RhbmNlcyAkaW5zdGFuY2UgbWFjcm9fYm91bmRhcnkgW2xpc3QgJGxseCAkbGx5ICR1cnggJHVyeV0KIAogICAgICAgICAgICAgc2V0IGhhbG8gW2RpY3QgZ2V0ICRpbnN0YW5jZXMgJGluc3RhbmNlIGhhbG9dCi0gICAgICAgICAgICBzZXQgbGx4IFtleHByICRsbHggLSBbbGluZGV4ICRoYWxvIDBdXQotICAgICAgICAgICAgc2V0IGxseSBbZXhwciAkbGx5IC0gW2xpbmRleCAkaGFsbyAxXV0KLSAgICAgICAgICAgIHNldCB1cnggW2V4cHIgJHVyeCArIFtsaW5kZXggJGhhbG8gMl1dCi0gICAgICAgICAgICBzZXQgdXJ5IFtleHByICR1cnkgKyBbbGluZGV4ICRoYWxvIDNdXQorICAgICAgICAgICAgc2V0IGxseCBbZXhwciByb3VuZCgkbGx4IC0gW2xpbmRleCAkaGFsbyAwXSldCisgICAgICAgICAgICBzZXQgbGx5IFtleHByIHJvdW5kKCRsbHkgLSBbbGluZGV4ICRoYWxvIDFdKV0KKyAgICAgICAgICAgIHNldCB1cnggW2V4cHIgcm91bmQoJHVyeCArIFtsaW5kZXggJGhhbG8gMl0pXQorICAgICAgICAgICAgc2V0IHVyeSBbZXhwciByb3VuZCgkdXJ5ICsgW2xpbmRleCAkaGFsbyAzXSldCiAKLSAgICAgICAgICAgIGRpY3Qgc2V0IGluc3RhbmNlcyAkaW5zdGFuY2UgaGFsb19ib3VuZGFyeSBbbG1hcCB4IFtsaXN0ICRsbHggJGxseSAkdXJ4ICR1cnldIHtleHByICR4ICogMS4wIC8gJGRidX1dCisgICAgICAgICAgICBkaWN0IHNldCBpbnN0YW5jZXMgJGluc3RhbmNlIGhhbG9fYm91bmRhcnkgW2xpc3QgJGxseCAkbGx5ICR1cnggJHVyeV0KICAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAkbWFjcm9fYm91bmRhcmllcwogICAgIH0KIAotICAgIHByb2MgcmVhZF9kZWZfY29tcG9uZW50cyB7Y2ggbWFjcm9zfSB7CisgICAgcHJvYyByZWFkX2RlZl9jb21wb25lbnRzIHttYWNyb3N9IHsKICAgICAgICAgdmFyaWFibGUgZGVzaWduX2RhdGEKKyAgICAgICAgdmFyaWFibGUgYmxvY2sKICAgICAgICAgc2V0IGluc3RhbmNlcyB7fQogCi0gICAgICAgIHdoaWxlIHshW2VvZiAkY2hdfSB7Ci0gICAgICAgICAgICBzZXQgbGluZSBbZ2V0cyAkY2hdCi0KLSAgICAgICAgICAgIGlmIHtbcmVnZXhwIHtFTkQgQ09NUE9ORU5UU30gJGxpbmVdfSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICRpbnN0YW5jZXMKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd2hpbGUgeyFbcmVnZXhwIHs7fSAkbGluZV19IHsKLSAgICAgICAgICAgICAgICBzZXQgbGluZSAiJGxpbmUgW2dldHMgJGNoXSIKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0IG1hY3JvX25hbWUgW2xpbmRleCAkbGluZSAyXQorICAgICAgICBmb3JlYWNoIGluc3QgWyRibG9jayBnZXRJbnN0c10geworICAgICAgICAgICAgc2V0IG1hY3JvX25hbWUgW1skaW5zdCBnZXRNYXN0ZXJdIGdldE5hbWVdCiAgICAgICAgICAgICBpZiB7W2xzZWFyY2ggJG1hY3JvcyAkbWFjcm9fbmFtZV0gIT0gLTF9IHsKICAgICAgICAgICAgICAgICBzZXQgZGF0YSB7fQotICAgICAgICAgICAgICAgIGlmIHtbc2V0IGlkeCBbbHNlYXJjaCAkbGluZSAiRklYRUQiXV0gIT0gLTF9IHsKLSAgICAgICAgICAgICAgICAgICAgZGljdCBzZXQgZGF0YSBtYWNybyAkbWFjcm9fbmFtZQotICAgICAgICAgICAgICAgICAgICBkaWN0IHNldCBkYXRhIHggW2xpbmRleCAkbGluZSBbZXhwciAkaWR4ICsgMl1dCi0gICAgICAgICAgICAgICAgICAgIGRpY3Qgc2V0IGRhdGEgeSBbbGluZGV4ICRsaW5lIFtleHByICRpZHggKyAzXV0KLSAgICAgICAgICAgICAgICAgICAgZGljdCBzZXQgZGF0YSBvcmllbnQgW2xpbmRleCAkbGluZSBbZXhwciAkaWR4ICsgNV1dCi0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRpY3Qgc2V0IGRhdGEgbmFtZSBbJGluc3QgZ2V0TmFtZV0KKyAgICAgICAgICAgICAgICBkaWN0IHNldCBkYXRhIG1hY3JvICRtYWNyb19uYW1lCisgICAgICAgICAgICAgICAgZGljdCBzZXQgZGF0YSB4IFtsaW5kZXggWyRpbnN0IGdldE9yaWdpbl0gMF0KKyAgICAgICAgICAgICAgICBkaWN0IHNldCBkYXRhIHkgW2xpbmRleCBbJGluc3QgZ2V0T3JpZ2luXSAxXQorICAgICAgICAgICAgICAgIGRpY3Qgc2V0IGRhdGEgeG1pbiBbWyRpbnN0IGdldEJCb3hdIHhNaW5dCisgICAgICAgICAgICAgICAgZGljdCBzZXQgZGF0YSB5bWluIFtbJGluc3QgZ2V0QkJveF0geU1pbl0KKyAgICAgICAgICAgICAgICBkaWN0IHNldCBkYXRhIHhtYXggW1skaW5zdCBnZXRCQm94XSB4TWF4XQorICAgICAgICAgICAgICAgIGRpY3Qgc2V0IGRhdGEgeW1heCBbWyRpbnN0IGdldEJCb3hdIHlNYXhdCisgICAgICAgICAgICAgICAgZGljdCBzZXQgZGF0YSBvcmllbnQgWyRpbnN0IGdldE9yaWVudF0KIAotICAgICAgICAgICAgICAgIGlmIHtbc2V0IGlkeCBbbHNlYXJjaCAkbGluZSAiSEFMTyJdXSAhPSAtMX0gewotICAgICAgICAgICAgICAgICAgICBkaWN0IHNldCBkYXRhIGhhbG8gW2xyYW5nZSAkbGluZSBbZXhwciAkaWR4ICsgMV0gW2V4cHIgJGlkeCArIDRdXQorICAgICAgICAgICAgICAgIGlmIHtbJGluc3QgZ2V0SGFsb10gIT0gIk5VTEwifSB7CisgICAgICAgICAgICAgICAgICAgIGRpY3Qgc2V0IGRhdGEgaGFsbyBbbGlzdCBcCisgICAgICAgICAgICAgICAgICAgICAgICBbWyRpbnN0IGdldEhhbG9dIHhNaW5dIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtbJGluc3QgZ2V0SGFsb10geU1pbl0gXAorICAgICAgICAgICAgICAgICAgICAgICAgW1skaW5zdCBnZXRIYWxvXSB4TWF4XSBcCisgICAgICAgICAgICAgICAgICAgICAgICBbWyRpbnN0IGdldEhhbG9dIHlNYXhdIFwKKyAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGRpY3Qgc2V0IGRhdGEgaGFsbyBbZGljdCBnZXQgJGRlc2lnbl9kYXRhIGNvbmZpZyBkZWZhdWx0X2hhbG9dCiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgZGljdCBzZXQgaW5zdGFuY2VzIFtsaW5kZXggJGxpbmUgMV0gJGRhdGEKKyAgICAgICAgICAgICAgICBkaWN0IHNldCBpbnN0YW5jZXMgWyRpbnN0IGdldE5hbWVdICRkYXRhCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL3NjcmlwdHMvb3BlbmRiX3dyaXRlci50Y2wgYi9zY3JpcHRzL3Bkbi9zcmMvc2NyaXB0cy9vcGVuZGJfd3JpdGVyLnRjbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjViNjkxCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9wZG4vc3JjL3NjcmlwdHMvb3BlbmRiX3dyaXRlci50Y2wKQEAgLTAsMCArMSwyNzcgQEAKK25hbWVzcGFjZSBldmFsIDo6cGRuIHsKKyAgICB2YXJpYWJsZSBnbG9iYWxfY29ubmVjdGlvbnMgeworICAgICAgICBWREQgeworICAgICAgICAgICAge2luc3RfbmFtZSAuKiBwaW5fbmFtZSBWRER9CisgICAgICAgICAgICB7aW5zdF9uYW1lIC4qIHBpbl9uYW1lIFZERFBFfQorICAgICAgICAgICAge2luc3RfbmFtZSAuKiBwaW5fbmFtZSBWRERDRX0KKyAgICAgICAgfQorICAgICAgICBWU1MgeworICAgICAgICAgICAge2luc3RfbmFtZSAuKiBwaW5fbmFtZSBWU1N9CisgICAgICAgICAgICB7aW5zdF9uYW1lIC4qIHBpbl9uYW1lIFZTU0V9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJvYyB3cml0ZV9vcGVuZGJfdmlhcyB7fSB7CisgICAgICAgIHZhcmlhYmxlIHBoeXNpY2FsX3ZpYXJ1bGVzCisgICAgICAgIHZhcmlhYmxlIGJsb2NrCisgICAgICAgIHZhcmlhYmxlIHRlY2gKKworICAgICAgICBkaWN0IGZvciB7bmFtZSBydWxlfSAkcGh5c2ljYWxfdmlhcnVsZXMgeworICAgICAgICAgICAgc2V0IHZpYSBbZGJWaWFfY3JlYXRlICRibG9jayAkbmFtZV0KKyAgICAgICAgICAgICR2aWEgc2V0VmlhR2VuZXJhdGVSdWxlIFskdGVjaCBmaW5kVmlhR2VuZXJhdGVSdWxlIFtkaWN0IGdldCAkcnVsZSBydWxlXV0KKyAgICAgICAgICAgIHNldCBwYXJhbXMgWyR2aWEgZ2V0VmlhUGFyYW1zXQorICAgICAgICAgICAgJHBhcmFtcyBzZXRCb3R0b21MYXllciBbJHRlY2ggZmluZExheWVyIFtsaW5kZXggW2RpY3QgZ2V0ICRydWxlIGxheWVyc10gMF1dCisgICAgICAgICAgICAkcGFyYW1zIHNldEN1dExheWVyIFskdGVjaCBmaW5kTGF5ZXIgW2xpbmRleCBbZGljdCBnZXQgJHJ1bGUgbGF5ZXJzXSAyXV0KKyAgICAgICAgICAgICRwYXJhbXMgc2V0VG9wTGF5ZXIgWyR0ZWNoIGZpbmRMYXllciBbbGluZGV4IFtkaWN0IGdldCAkcnVsZSBsYXllcnNdIDFdXQorICAgICAgICAgICAgJHBhcmFtcyBzZXRYQ3V0U2l6ZSBbbGluZGV4IFtkaWN0IGdldCAkcnVsZSBjdXRzaXplXSAwXQorICAgICAgICAgICAgJHBhcmFtcyBzZXRZQ3V0U2l6ZSBbbGluZGV4IFtkaWN0IGdldCAkcnVsZSBjdXRzaXplXSAxXQorICAgICAgICAgICAgJHBhcmFtcyBzZXRYQ3V0U3BhY2luZyBbbGluZGV4IFtkaWN0IGdldCAkcnVsZSBjdXRzcGFjaW5nXSAwXQorICAgICAgICAgICAgJHBhcmFtcyBzZXRZQ3V0U3BhY2luZyBbbGluZGV4IFtkaWN0IGdldCAkcnVsZSBjdXRzcGFjaW5nXSAxXQorICAgICAgICAgICAgJHBhcmFtcyBzZXRYQm90dG9tRW5jbG9zdXJlIFtsaW5kZXggW2RpY3QgZ2V0ICRydWxlIGVuY2xvc3VyZV0gMF0KKyAgICAgICAgICAgICRwYXJhbXMgc2V0WUJvdHRvbUVuY2xvc3VyZSBbbGluZGV4IFtkaWN0IGdldCAkcnVsZSBlbmNsb3N1cmVdIDFdCisgICAgICAgICAgICAkcGFyYW1zIHNldFhUb3BFbmNsb3N1cmUgW2xpbmRleCBbZGljdCBnZXQgJHJ1bGUgZW5jbG9zdXJlXSAyXQorICAgICAgICAgICAgJHBhcmFtcyBzZXRZVG9wRW5jbG9zdXJlIFtsaW5kZXggW2RpY3QgZ2V0ICRydWxlIGVuY2xvc3VyZV0gM10KKyAgICAgICAgICAgICRwYXJhbXMgc2V0TnVtQ3V0Um93cyBbbGluZGV4IFtkaWN0IGdldCAkcnVsZSByb3djb2xdIDBdCisgICAgICAgICAgICAkcGFyYW1zIHNldE51bUN1dENvbHMgW2xpbmRleCBbZGljdCBnZXQgJHJ1bGUgcm93Y29sXSAxXQorCisgICAgICAgICAgICAkdmlhIHNldFZpYVBhcmFtcyAkcGFyYW1zCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm9jIHdyaXRlX29wZW5kYl9zcGVjaWFsbmV0IHtuZXRfbmFtZSBzaWduYWxfdHlwZX0geworICAgICAgICB2YXJpYWJsZSBibG9jaworICAgICAgICB2YXJpYWJsZSBpbnN0YW5jZXMKKyAgICAgICAgdmFyaWFibGUgbWV0YWxfbGF5ZXJzCisgICAgICAgIHZhcmlhYmxlIHRlY2ggCisgICAgICAgIHZhcmlhYmxlIHN0cmlwZV9sb2NzCisgICAgICAgIHZhcmlhYmxlIHdpZHRocworICAgICAgICB2YXJpYWJsZSBnbG9iYWxfY29ubmVjdGlvbnMKKyAgICAgICAgCisgICAgICAgIHNldCBuZXQgWyRibG9jayBmaW5kTmV0ICRuZXRfbmFtZV0KKyAgICAgICAgaWYgeyRuZXQgPT0gIk5VTEwifSB7CisgICAgICAgICAgICBzZXQgbmV0IFtkYk5ldF9jcmVhdGUgJGJsb2NrICRuZXRfbmFtZV0KKyAgICAgICAgfQorICAgICAgICAkbmV0IHNldFNwZWNpYWwKKyAgICAgICAgJG5ldCBzZXRTaWdUeXBlICRzaWduYWxfdHlwZQorCisgICAgICAgIGZvcmVhY2ggaW5zdCBbJGJsb2NrIGdldEluc3RzXSB7CisgICAgICAgICAgICBzZXQgbWFzdGVyIFskaW5zdCBnZXRNYXN0ZXJdCisgICAgICAgICAgICBmb3JlYWNoIG10ZXJtIFskbWFzdGVyIGdldE1UZXJtc10geworICAgICAgICAgICAgICAgIGlmIHtbJG10ZXJtIGdldFNpZ1R5cGVdID09ICRzaWduYWxfdHlwZX0geworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIHBhdHRlcm4gW2RpY3QgZ2V0ICRnbG9iYWxfY29ubmVjdGlvbnMgJG5ldF9uYW1lXSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCBbZGljdCBnZXQgJHBhdHRlcm4gaW5zdF9uYW1lXSBbJGluc3QgZ2V0TmFtZV1dICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlZ2V4cCBbZGljdCBnZXQgJHBhdHRlcm4gcGluX25hbWVdIFskbXRlcm0gZ2V0TmFtZV1dfSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJJVGVybV9jb25uZWN0ICRpbnN0ICRuZXQgJG10ZXJtCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JlYWNoIGl0ZXJtIFskaW5zdCBnZXRJVGVybXNdIHsKKyAgICAgICAgICAgICAgICBpZiB7WyRpdGVybSBnZXROZXRdICE9ICJOVUxMIiAmJiBbWyRpdGVybSBnZXROZXRdIGdldE5hbWVdID09ICRuZXRfbmFtZX0geworICAgICAgICAgICAgICAgICAgICAkaXRlcm0gc2V0U3BlY2lhbAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAkbmV0IHNldFdpbGRDb25uZWN0ZWQKKyAgICAgICAgc2V0IHN3aXJlIFtkYlNXaXJlX2NyZWF0ZSAkbmV0ICJST1VURUQiXQorCisgICAgICAgIGZvcmVhY2ggbGF5ICRtZXRhbF9sYXllcnMgeworICAgICAgICAgICAgc2V0IGxheWVyIFskdGVjaCBmaW5kTGF5ZXIgJGxheV0KKworICAgICAgICAgICAgc2V0IGRpciBbZ2V0X2RpciAkbGF5XQorICAgICAgICAgICAgaWYgeyRkaXIgPT0gImhvciJ9IHsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIGxfc3RyICRzdHJpcGVfbG9jcygkbGF5LCRzaWduYWxfdHlwZSkgeworICAgICAgICAgICAgICAgICAgICBzZXQgbDEgW2xpbmRleCAkbF9zdHIgMF0KKyAgICAgICAgICAgICAgICAgICAgc2V0IGwyIFtsaW5kZXggJGxfc3RyIDFdCisgICAgICAgICAgICAgICAgICAgIHNldCBsMyBbbGluZGV4ICRsX3N0ciAyXQorICAgICAgICAgICAgICAgICAgICBpZiB7JGwxID09ICRsM30ge2NvbnRpbnVlfQorICAgICAgICAgICAgICAgICAgICBpZiB7JGxheSA9PSBbZ2V0X3JhaWxzX2xheWVyXX0geworICAgICAgICAgICAgICAgICAgICAgICAgZGJTQm94X2NyZWF0ZSAkc3dpcmUgJGxheWVyIFtleHByIHJvdW5kKCRsMSldIFtleHByIHJvdW5kKCRsMiAtICgkd2lkdGhzKCRsYXkpLzIpKV0gW2V4cHIgcm91bmQoJGwzKV0gW2V4cHIgcm91bmQoJGwyICsgKCR3aWR0aHMoJGxheSkvMikpXSAiRk9MTE9XUElOIgorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZGJTQm94X2NyZWF0ZSAkc3dpcmUgJGxheWVyIFtleHByIHJvdW5kKCRsMSldIFtleHByIHJvdW5kKCRsMiAtICgkd2lkdGhzKCRsYXkpLzIpKV0gW2V4cHIgcm91bmQoJGwzKV0gW2V4cHIgcm91bmQoJGwyICsgKCR3aWR0aHMoJGxheSkvMikpXSAiU1RSSVBFIgorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2VpZiB7JGRpciA9PSAidmVyIn0geworICAgICAgICAgICAgICAgIGZvcmVhY2ggbF9zdHIgJHN0cmlwZV9sb2NzKCRsYXksJHNpZ25hbF90eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIHNldCBsMSBbbGluZGV4ICRsX3N0ciAwXQorICAgICAgICAgICAgICAgICAgICBzZXQgbDIgW2xpbmRleCAkbF9zdHIgMV0KKyAgICAgICAgICAgICAgICAgICAgc2V0IGwzIFtsaW5kZXggJGxfc3RyIDJdCisgICAgICAgICAgICAgICAgICAgIGlmIHskbDIgPT0gJGwzfSB7Y29udGludWV9CisgICAgICAgICAgICAgICAgICAgIGlmIHskbGF5ID09IFtnZXRfcmFpbHNfbGF5ZXJdfSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkYlNCb3hfY3JlYXRlICRzd2lyZSAkbGF5ZXIgW2V4cHIgcm91bmQoJGwxIC0gKCR3aWR0aHMoJGxheSkvMikpXSBbZXhwciByb3VuZCgkbDIpXSBbZXhwciByb3VuZCgkbDEgKyAoJHdpZHRocygkbGF5KS8yKSldIFtleHByIHJvdW5kKCRsMyldICJGT0xMT1dQSU4iCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkYlNCb3hfY3JlYXRlICRzd2lyZSAkbGF5ZXIgW2V4cHIgcm91bmQoJGwxIC0gKCR3aWR0aHMoJGxheSkvMikpXSBbZXhwciByb3VuZCgkbDIpXSBbZXhwciByb3VuZCgkbDEgKyAoJHdpZHRocygkbGF5KS8yKSldIFtleHByIHJvdW5kKCRsMyldICJTVFJJUEUiCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YXJpYWJsZSB2aWFzCisgICAgICAgIGZvcmVhY2ggdmlhICR2aWFzIHsKKyAgICAgICAgICAgIGlmIHtbZGljdCBnZXQgJHZpYSBuZXRfbmFtZV0gPT0gJG5ldF9uYW1lfSB7CisJICAgICAgICAjIEZvciBlYWNoIGxheWVyIGJldHdlZW4gbDEgYW5kIGwyLCBhZGQgdmlhcyBhdCB0aGUgaW50ZXJzZWN0aW9uCisgICAgICAgICAgICAgICAgZm9yZWFjaCB2aWFfaW5zdCBbZGljdCBnZXQgJHZpYSBjb25uZWN0aW9uc10geworICAgICAgICAgICAgICAgICAgICBzZXQgdmlhX25hbWUgW2RpY3QgZ2V0ICR2aWFfaW5zdCBuYW1lXQorICAgICAgICAgICAgICAgICAgICBzZXQgeCAgICAgICAgW2RpY3QgZ2V0ICR2aWFfaW5zdCB4XQorICAgICAgICAgICAgICAgICAgICBzZXQgeSAgICAgICAgW2RpY3QgZ2V0ICR2aWFfaW5zdCB5XQorICAgICAgICAgICAgICAgICAgICBzZXQgbGF5ICAgICAgW2RpY3QgZ2V0ICR2aWFfaW5zdCBsb3dlcl9sYXllcl0KKyAgICAgICAgICAgICAgICAgICAgcmVnZXhwIHsoLiopX1BJTn0gJGxheSAtIGxheQorICAgICAgICAgICAgICAgICAgICBzZXQgbGF5ZXIgWyR0ZWNoIGZpbmRMYXllciAkbGF5XQorICAgICAgICAgICAgICAgICAgICBkYlNCb3hfY3JlYXRlICRzd2lyZSBbJGJsb2NrIGZpbmRWaWEgJHZpYV9uYW1lXSAkeCAkeSAiU1RSSVBFIgorCSAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgICAgICAKKyAgICBwcm9jIHdyaXRlX29wZW5kYl9zcGVjaWFsbmV0cyB7fSB7CisgICAgICAgIHZhcmlhYmxlIGJsb2NrCisgICAgICAgIHZhcmlhYmxlIGRlc2lnbl9kYXRhCisgICAgICAgIAorICAgICAgICBmb3JlYWNoIG5ldF9uYW1lIFtkaWN0IGdldCAkZGVzaWduX2RhdGEgcG93ZXJfbmV0c10geworICAgICAgICAgICAgd3JpdGVfb3BlbmRiX3NwZWNpYWxuZXQgIlZERCIgIlBPV0VSIgorICAgICAgICB9CisKKyAgICAgICAgZm9yZWFjaCBuZXRfbmFtZSBbZGljdCBnZXQgJGRlc2lnbl9kYXRhIGdyb3VuZF9uZXRzXSB7CisgICAgICAgICAgICB3cml0ZV9vcGVuZGJfc3BlY2lhbG5ldCAiVlNTIiAiR1JPVU5EIgorICAgICAgICB9CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICBwcm9jIGluaXRfb3JpZW50YXRpb24ge2hlaWdodH0geworICAgICAgICB2YXJpYWJsZSBsb3dlc3RfcmFpbAorICAgICAgICB2YXJpYWJsZSBvcmllbnRfcm93cworICAgICAgICB2YXJpYWJsZSByYWlsc19zdGFydF93aXRoCisKKyAgICAgICAgc2V0IGxvd2VzdF9yYWlsICRoZWlnaHQKKyAgICAgICAgaWYgeyRyYWlsc19zdGFydF93aXRoID09ICJHUk9VTkQifSB7CisgICAgICAgICAgICBzZXQgb3JpZW50X3Jvd3MgezAgIlIwIiAxICJNWCJ9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXQgb3JpZW50X3Jvd3MgezAgIk1YIiAxICJSMCJ9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm9jIG9yaWVudGF0aW9uIHtoZWlnaHR9IHsKKyAgICAgICAgdmFyaWFibGUgbG93ZXN0X3JhaWwKKyAgICAgICAgdmFyaWFibGUgb3JpZW50X3Jvd3MKKyAgICAgICAgdmFyaWFibGUgcm93X2hlaWdodAorICAgICAgICAKKyAgICAgICAgc2V0IHJvd19saW5lIFtleHByIGludCgoJGhlaWdodCAtICRsb3dlc3RfcmFpbCkgLyAkcm93X2hlaWdodCldCisgICAgICAgIHJldHVybiBbZGljdCBnZXQgJG9yaWVudF9yb3dzIFtleHByICRyb3dfbGluZSAlIDJdXQorICAgIH0KKyAgICAgICAgCisgICAgcHJvYyB3cml0ZV9vcGVuZGJfcm93IHtoZWlnaHQgc3RhcnQgZW5kfSB7CisgICAgICAgIHZhcmlhYmxlIHJvd19pbmRleAorICAgICAgICB2YXJpYWJsZSBibG9jaworICAgICAgICB2YXJpYWJsZSBzaXRlCisgICAgICAgIHZhcmlhYmxlIHNpdGVfd2lkdGgKKyAgICAgICAgdmFyaWFibGUgZGVmX3VuaXRzCisgICAgICAgIHZhcmlhYmxlIGRlc2lnbl9kYXRhCisgICAgICAgIAorICAgICAgICBzZXQgc3RhcnQgIFtleHByIGludCgkc3RhcnQpXQorICAgICAgICBzZXQgaGVpZ2h0IFtleHByIGludCgkaGVpZ2h0KV0KKyAgICAgICAgc2V0IGVuZCAgICBbZXhwciBpbnQoJGVuZCldCisKKyAgICAgICAgaWYgeyRzdGFydCA9PSAkZW5kfSB7cmV0dXJufQorICAgICAgICAKKyAgICAgICAgc2V0IGxseCBbbGluZGV4IFtkaWN0IGdldCAkZGVzaWduX2RhdGEgY29uZmlnIGNvcmVfYXJlYV0gMF0KKwlpZiB7W2V4cHIgeyBpbnQoJHN0YXJ0IC0gJGxseCkgJSAkc2l0ZV93aWR0aH1dID09IDB9IHsKKwkJc2V0IHggJHN0YXJ0CisJfSBlbHNlIHsKKwkJc2V0IG9mZnNldCBbZXhwciB7IGludCgkc3RhcnQgLSAkbGx4KSAlICRzaXRlX3dpZHRofV0KKwkJc2V0IHggW2V4cHIgeyRzdGFydCArICRzaXRlX3dpZHRoIC0gJG9mZnNldH1dCisJfQorCisJc2V0IG51bSAgW2V4cHIgeygkZW5kIC0gJHgpLyRzaXRlX3dpZHRofV0KKyAgICAgICAgCisgICAgICAgIGRiUm93X2NyZWF0ZSAkYmxvY2sgUk9XXyRyb3dfaW5kZXggJHNpdGUgJHggJGhlaWdodCBbb3JpZW50YXRpb24gJGhlaWdodF0gIkhPUklaT05UQUwiICRudW0gJHNpdGVfd2lkdGgKKyAgICAgICAgaW5jciByb3dfaW5kZXgKKyAgICB9CisKKyAgICBwcm9jIHdyaXRlX29wZW5kYl9yb3dzIHt9IHsKKyAgICAgICAgdmFyaWFibGUgc3RyaXBlX2xvY3MKKyAgICAgICAgdmFyaWFibGUgcm93X2hlaWdodAorICAgICAgICB2YXJpYWJsZSByb3dfaW5kZXgKKworICAgICAgICBzZXQgcm93X2luZGV4IDEKKyAgICAgICAgCisgICAgICAgIHNldCBzdHJpcGVzIFtjb25jYXQgJHN0cmlwZV9sb2NzKFtnZXRfcmFpbHNfbGF5ZXJdLFBPV0VSKSAkc3RyaXBlX2xvY3MoW2dldF9yYWlsc19sYXllcl0sR1JPVU5EKV0KKyAgICAgICAgc2V0IG5ld19zdHJpcGVzIHt9CisgICAgICAgIGZvcmVhY2ggc3RyaXBlICRzdHJpcGVzIHsKKyAgICAgICAgICAgIGlmIHtbbGluZGV4ICRzdHJpcGUgMF0gIT0gW2xpbmRleCAkc3RyaXBlIDJdfSB7CisgICAgICAgICAgICAgICAgbGFwcGVuZCBuZXdfc3RyaXBlcyAkc3RyaXBlCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2V0IHN0cmlwZXMgJG5ld19zdHJpcGVzCisgICAgICAgIHNldCBzdHJpcGVzIFtsc29ydCAtcmVhbCAtaW5kZXggMSAkc3RyaXBlc10KKyAgICAgICAgc2V0IGhlaWdodHMge30KKyAgICAgICAgZm9yZWFjaCBzdHJpcGUgJHN0cmlwZXMgeworICAgICAgICAgICAgbGFwcGVuZCBoZWlnaHRzIFtsaW5kZXggJHN0cmlwZSAxXQorICAgICAgICB9CisgICAgICAgIHNldCBoZWlnaHRzIFtsc29ydCAtdW5pcXVlIC1yZWFsICRoZWlnaHRzXQorCisgICAgICAgIGluaXRfb3JpZW50YXRpb24gW2xpbmRleCAkaGVpZ2h0cyAwXQorCisJZm9yZWFjaCBoZWlnaHQgW2xyYW5nZSAkaGVpZ2h0cyAwIGVuZC0xXSB7CisgICAgICAgICAgICBzZXQgcmFpbHMge30KKyAgICAgICAgICAgIGZvcmVhY2ggc3RyaXBlICRzdHJpcGVzIHsKKyAgICAgICAgICAgICAgICBpZiB7W2xpbmRleCAkc3RyaXBlIDFdID09ICRoZWlnaHR9IHsKKyAgICAgICAgICAgICAgICAgICAgbGFwcGVuZCByYWlscyAkc3RyaXBlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IGxvd2VyX3JhaWxzIFtsc29ydCAtcmVhbCAtaW5kZXggMiAkcmFpbHNdCisgICAgICAgICAgICBzZXQgcmFpbHMge30KKyAgICAgICAgICAgIGZvcmVhY2ggc3RyaXBlICRzdHJpcGVzIHsKKyAgICAgICAgICAgICAgICBpZiB7W2xpbmRleCAkc3RyaXBlIDFdID09ICgkaGVpZ2h0ICsgJHJvd19oZWlnaHQpfSB7CisgICAgICAgICAgICAgICAgICAgIGxhcHBlbmQgcmFpbHMgJHN0cmlwZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB1cHBlcl9yYWlscyBbbHNvcnQgLXJlYWwgLWluZGV4IDIgJHJhaWxzXQorICAgICAgICAgICAgc2V0IHVwcGVyX2V4dGVudHMge30KKyAgICAgICAgICAgIGZvcmVhY2ggdXBwZXJfcmFpbCAkdXBwZXJfcmFpbHMgeworICAgICAgICAgICAgICAgIGxhcHBlbmQgdXBwZXJfZXh0ZW50cyBbbGluZGV4ICR1cHBlcl9yYWlsIDBdCisgICAgICAgICAgICAgICAgbGFwcGVuZCB1cHBlcl9leHRlbnRzIFtsaW5kZXggJHVwcGVyX3JhaWwgMl0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yZWFjaCBscmFpbCAkbG93ZXJfcmFpbHMgeworICAgICAgICAgICAgICAgIHNldCBpZHggMAorICAgICAgICAgICAgICAgIHNldCBzdGFydCBbbGluZGV4ICRscmFpbCAwXQorICAgICAgICAgICAgICAgIHNldCBlbmQgICBbbGluZGV4ICRscmFpbCAyXQorCisgICAgICAgICAgICAgICAgIyBGaW5kIGluZGV4IG9mIGZpcnN0IG51bWJlciB0aGF0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhpcyByYWlsCisgICAgICAgICAgICAgICAgd2hpbGUgeyRpZHggPCBbbGxlbmd0aCAkdXBwZXJfZXh0ZW50c119IHsKKyAgICAgICAgICAgICAgICAgICAgaWYge1tsaW5kZXggJHVwcGVyX2V4dGVudHMgJGlkeF0gPiAkc3RhcnR9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW5jciBpZHgKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiB7W2xpbmRleCAkdXBwZXJfZXh0ZW50cyAkaWR4XSA8PSAkc3RhcnR9IHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiB7JGlkeCAlIDIgPT0gMH0geworICAgICAgICAgICAgICAgICAgICAjIElmIHRoZSBpbmRleCBpcyBldmVuLCB0aGVuIHRoZSBzdGFydCBvZiB0aGUgcmFpbCBoYXMgbm8gbWF0Y2hpbmcgcmFpbCBhYm92ZSBpdAorICAgICAgICAgICAgICAgICAgICBzZXQgcm93X3N0YXJ0IFtsaW5kZXggJHVwcGVyX2V4dGVudHMgJGlkeF0KKyAgICAgICAgICAgICAgICAgICAgaW5jciBpZHgKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAjIElmIHRoZSBpbmRleCBpcyBvZGQsIHRoZW4gdGhlIHN0YXJ0IG9mIHRoZSByYWlsIGhhcyBtYXRjaGluIHJhaWwgYWJvdmUgaXQKKyAgICAgICAgICAgICAgICAgICAgc2V0IHJvd19zdGFydCAkc3RhcnQKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiB7JGVuZCA8PSBbbGluZGV4ICR1cHBlcl9leHRlbnRzICRpZHhdfSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlX29wZW5kYl9yb3cgJGhlaWdodCAkcm93X3N0YXJ0ICRlbmQKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgeyRpZHggPCBbbGxlbmd0aCAkdXBwZXJfZXh0ZW50c10gJiYgJGVuZCA+IFtsaW5kZXggJHVwcGVyX2V4dGVudHMgW2V4cHIgJGlkeCArIDFdXX0geworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfb3BlbmRiX3JvdyAkaGVpZ2h0ICRyb3dfc3RhcnQgW2xpbmRleCAkdXBwZXJfZXh0ZW50cyAkaWR4XQorICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHJvd19zdGFydCBbbGluZGV4ICR1cHBlcl9leHRlbnRzIFtleHByICRpZHggKyAxXV0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNldCBpZHggW2V4cHIgJGlkeCArIDJdCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBuYW1lc3BhY2UgZXhwb3J0IHdyaXRlX29wZW5kYl92aWFzIHdyaXRlX29wZW5kYl9zcGVjaWFsbmV0cyB3cml0ZV9vcGVuZGJfcm93cyAgICAKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9zY3JpcHRzL3BnX2dyaWRfcHJvY3MudGNsIGIvc2NyaXB0cy9wZG4vc3JjL3NjcmlwdHMvcGdfZ3JpZF9wcm9jcy50Y2wKaW5kZXggOTY3NmU3Zi4uMjc2OTI1MCAxMDA3NTUKLS0tIGEvc2NyaXB0cy9wZG4vc3JjL3NjcmlwdHMvcGdfZ3JpZF9wcm9jcy50Y2wKKysrIGIvc2NyaXB0cy9wZG4vc3JjL3NjcmlwdHMvcGdfZ3JpZF9wcm9jcy50Y2wKQEAgLTEsMTQgKzEsMzE5IEBACiBuYW1lc3BhY2UgZXZhbCA6OnBkbiB7CiAKKyAgICB2YXJpYWJsZSBsb2dpY2FsX3ZpYXJ1bGVzIHt9CisgICAgdmFyaWFibGUgcGh5c2ljYWxfdmlhcnVsZXMge30KKyAgICB2YXJpYWJsZSB2aWFzIHt9CisgICAgdmFyaWFibGUgc3RyaXBlX2xvY3MKKyAgICB2YXJpYWJsZSBvcmlnX3N0cmlwZV9sb2NzCisgICAgdmFyaWFibGUgbGF5ZXJzIHt9CisgICAgCiAjVGhpcyBmaWxlIGNvbnRhaW5zIHByb2NlZHVyZXMgdGhhdCBhcmUgdXNlZCBmb3IgUEROIGdlbmVyYXRpb24KIAotcHJvYyBnZXRfZGlyIHtsYXllcl9uYW1lfSB7Ci0gICAgc2V0IGlkeCBbbHNlYXJjaCAkOjptZXRfbGF5ZXJfbGlzdCAkbGF5ZXJfbmFtZV0KLSAgICByZXR1cm4gW2xpbmRleCAkOjptZXRfbGF5ZXJfZGlyICRpZHhdCi19CisgICAgcHJvYyBnZXRfZGlyIHtsYXllcl9uYW1lfSB7CisgICAgICAgIHZhcmlhYmxlIG1ldGFsX2xheWVycyAKKyAgICAgICAgdmFyaWFibGUgbWV0YWxfbGF5ZXJzX2RpciAKKyAgICAgICAgaWYge1tyZWdleHAgey4qX1BJTl8oaG9yfHZlcil9ICRsYXllcl9uYW1lIC0gZGlyXX0geworICAgICAgICAgICAgcmV0dXJuICRkaXIKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgc2V0IGlkeCBbbHNlYXJjaCAkbWV0YWxfbGF5ZXJzICRsYXllcl9uYW1lXQorICAgICAgICBpZiB7W2xpbmRleCAkbWV0YWxfbGF5ZXJzX2RpciAkaWR4XSA9PSAiSE9SSVpPTlRBTCJ9IHsKKyAgICAgICAgICAgIHJldHVybiAiaG9yIgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuICJ2ZXIiCisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJvYyBnZXRfcmFpbHNfbGF5ZXIge30geworICAgICAgICB2YXJpYWJsZSBkZWZhdWx0X2dyaWRfZGF0YQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIFtkaWN0IGdldCAkZGVmYXVsdF9ncmlkX2RhdGEgcmFpbHNdCisgICAgfQorCisgICAgcHJvYyBpbml0X3ZpYV90ZWNoIHt9IHsKKyAgICAgICAgdmFyaWFibGUgdGVjaAorICAgICAgICB2YXJpYWJsZSBkZWZfdmlhX3RlY2gKKyAgICAgICAgCisgICAgICAgIHNldCBkZWZfdmlhX3RlY2gge30KKyAgICAgICAgZm9yZWFjaCB2aWFfcnVsZSBbJHRlY2ggZ2V0VmlhR2VuZXJhdGVSdWxlc10geworICAgICAgICAgICAgc2V0IGxvd2VyIFskdmlhX3J1bGUgZ2V0VmlhTGF5ZXJSdWxlIDBdCisgICAgICAgICAgICBzZXQgdXBwZXIgWyR2aWFfcnVsZSBnZXRWaWFMYXllclJ1bGUgMV0KKyAgICAgICAgICAgIHNldCBjdXQgICBbJHZpYV9ydWxlIGdldFZpYUxheWVyUnVsZSAyXQorCisJICAgIGRpY3Qgc2V0IGRlZl92aWFfdGVjaCBbJHZpYV9ydWxlIGdldE5hbWVdIFtsaXN0IFwKKyAgICAgICAgICAgICAgICBsb3dlciBbbGlzdCBsYXllciBbWyRsb3dlciBnZXRMYXllcl0gZ2V0TmFtZV0gZW5jbG9zdXJlIFskbG93ZXIgZ2V0RW5jbG9zdXJlXV0gXAorICAgICAgICAgICAgICAgIHVwcGVyIFtsaXN0IGxheWVyIFtbJHVwcGVyIGdldExheWVyXSBnZXROYW1lXSBlbmNsb3N1cmUgWyR1cHBlciBnZXRFbmNsb3N1cmVdXSBcCisgICAgICAgICAgICAgICAgY3V0ICAgW2xpc3QgbGF5ZXIgW1skY3V0IGdldExheWVyXSBnZXROYW1lXSBzcGFjaW5nIFskY3V0IGdldFNwYWNpbmddIHNpemUgW2xpc3QgW1skY3V0IGdldFJlY3RdIGR4XSBbWyRjdXQgZ2V0UmVjdF0gZHldXV0gXAorICAgICAgICAgICAgXQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByb2Mgc2VsZWN0X3ZpYWluZm8ge2xvd2VyfSB7CisgICAgICAgIHZhcmlhYmxlIGRlZl92aWFfdGVjaAorCisgICAgICAgIHNldCBsYXllcl9uYW1lICRsb3dlcgorICAgICAgICByZWdleHAgeyguKilfUElOfSAkbG93ZXIgLSBsYXllcl9uYW1lCisgICAgICAgIAorICAgICAgICByZXR1cm4gW2RpY3QgZmlsdGVyICRkZWZfdmlhX3RlY2ggc2NyaXB0IHtydWxlX25hbWUgcnVsZX0ge2V4cHIge1tkaWN0IGdldCAkcnVsZSBsb3dlciBsYXllcl0gPT0gJGxheWVyX25hbWV9fV0KKyAgICB9CisgICAgCisgICAgcHJvYyBzZXRfbGF5ZXJfaW5mbyB7bGF5ZXJfaW5mb30geworICAgICAgICB2YXJpYWJsZSBsYXllcnMKKyAgICAgICAgCisgICAgICAgIHNldCBsYXllcnMgJGxheWVyX2luZm8KKyAgICB9CisgICAgCisgICAgcHJvYyBnZXRfbGF5ZXJfaW5mbyB7fSB7CisgICAgICAgIHZhcmlhYmxlIGxheWVycyAKKyAgICAgICAgCisgICAgICAgIHJldHVybiAkbGF5ZXJzCisgICAgfQorICAgIAorICAgICMgTGF5ZXJzIHRoYXQgaGF2ZSBhIHdpZHRodGFibGUgd2lsbCBvbmx5IHN1cHBvcnQgc29tZSB3aWR0aCB2YWx1ZXMsIHRoZSB3aWR0aHRhYmxlIGRlZmluZXMgdGhlIAorICAgICMgc2V0IG9mIHdpZHRocyB0aGF0IGFyZSBhbGxvd2VkLCBvciBhbnkgd2lkdGggZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBsYXN0IHZhbHVlIGluIHRoZQorICAgICMgdGFibGUKKyAgICBwcm9jIGdldF9hZGp1c3RlZF93aWR0aCB7bGF5ZXIgd2lkdGh9IHsKKyAgICAgICAgc2V0IGxheWVycyBbZ2V0X2xheWVyX2luZm9dCisgICAgICAgIAorICAgICAgICBpZiB7W2RpY3QgZXhpc3RzICRsYXllcnMgJGxheWVyXSAmJiBbZGljdCBleGlzdHMgJGxheWVycyAkbGF5ZXIgd2lkdGh0YWJsZV19IHsKKyAgICAgICAgICAgIHNldCB3aWR0aHRhYmxlIFtkaWN0IGdldCAkbGF5ZXJzICRsYXllciB3aWR0aHRhYmxlXQorICAgICAgICAgICAgaWYge1tsc2VhcmNoICR3aWR0aHRhYmxlICR3aWR0aF0gPiAwfSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICR3aWR0aAorICAgICAgICAgICAgfSBlbHNlaWYgeyR3aWR0aCA+IFtsaW5kZXggJHdpZHRodGFibGUgZW5kXX0geworICAgICAgICAgICAgICAgIHJldHVybiAkd2lkdGgKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yZWFjaCB2YWx1ZSAkd2lkdGh0YWJsZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIHskdmFsdWUgPiAkd2lkdGh9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuICR3aWR0aAorICAgIH0KKyAgICAKKyAgICAjIEdpdmVuIHRoZSB2aWEgcnVsZSBleHByZXNzZWQgaW4gdmlhX2luZm8sIHdoYXQgaXMgdGhlIHZpYSB3aXRoIHRoZSBsYXJnZXN0IGN1dCBhcmVhIHRoYXQgd2UgY2FuIG1ha2UKKyAgICBwcm9jIGdldF92aWFfb3B0aW9uIHtsb3dlcl9kaXIgcnVsZV9uYW1lIHZpYV9pbmZvIHggeSB3aWR0aCBoZWlnaHR9IHsKKyAgICAgICAgc2V0IGN1dF93aWR0aCAgW2xpbmRleCBbZGljdCBnZXQgJHZpYV9pbmZvIGN1dCBzaXplXSAwXQorICAgICAgICBzZXQgY3V0X2hlaWdodCBbbGluZGV4IFtkaWN0IGdldCAkdmlhX2luZm8gY3V0IHNpemVdIDFdCisKKyAgICAgICAgIyBBZGp1c3QgdGhlIHdpZHRoIGFuZCBoZWlnaHQgdmFsdWVzIHRvIHRoZSBuZXh0IGxhcmdlc3QgYWxsb3dlZCB2YWx1ZSBpZiBuZWNlc3NhcnkKKyAgICAgICAgc2V0IGxvd2VyX3dpZHRoICBbZ2V0X2FkanVzdGVkX3dpZHRoIFtkaWN0IGdldCAkdmlhX2luZm8gbG93ZXIgbGF5ZXJdICR3aWR0aF0KKyAgICAgICAgc2V0IGxvd2VyX2hlaWdodCBbZ2V0X2FkanVzdGVkX3dpZHRoIFtkaWN0IGdldCAkdmlhX2luZm8gbG93ZXIgbGF5ZXJdICRoZWlnaHRdCisgICAgICAgIHNldCB1cHBlcl93aWR0aCAgW2dldF9hZGp1c3RlZF93aWR0aCBbZGljdCBnZXQgJHZpYV9pbmZvIHVwcGVyIGxheWVyXSAkd2lkdGhdCisgICAgICAgIHNldCB1cHBlcl9oZWlnaHQgW2dldF9hZGp1c3RlZF93aWR0aCBbZGljdCBnZXQgJHZpYV9pbmZvIHVwcGVyIGxheWVyXSAkaGVpZ2h0XQorICAgICAgICAKKyAgICAgICAgc2V0IGxvd2VyX2VuY2xvc3VyZSBbbGluZGV4IFtkaWN0IGdldCAkdmlhX2luZm8gbG93ZXIgZW5jbG9zdXJlXSAwXQorICAgICAgICBzZXQgbWF4X2xvd2VyX2VuY2xvc3VyZSBbbGluZGV4IFtkaWN0IGdldCAkdmlhX2luZm8gbG93ZXIgZW5jbG9zdXJlXSAxXQorICAgICAgICAKKyAgICAgICAgaWYgeyRtYXhfbG93ZXJfZW5jbG9zdXJlIDwgJGxvd2VyX2VuY2xvc3VyZX0geworICAgICAgICAgICAgc2V0IHN3YXAgJGxvd2VyX2VuY2xvc3VyZQorICAgICAgICAgICAgc2V0IGxvd2VyX2VuY2xvc3VyZSAkbWF4X2xvd2VyX2VuY2xvc3VyZQorICAgICAgICAgICAgc2V0IG1heF9sb3dlcl9lbmNsb3N1cmUgJHN3YXAKKyAgICAgICAgfQorCisgICAgICAgIHNldCB1cHBlcl9lbmNsb3N1cmUgW2xpbmRleCBbZGljdCBnZXQgJHZpYV9pbmZvIHVwcGVyIGVuY2xvc3VyZV0gMF0KKyAgICAgICAgc2V0IG1heF91cHBlcl9lbmNsb3N1cmUgW2xpbmRleCBbZGljdCBnZXQgJHZpYV9pbmZvIHVwcGVyIGVuY2xvc3VyZV0gMV0KKworICAgICAgICBpZiB7JG1heF91cHBlcl9lbmNsb3N1cmUgPCAkdXBwZXJfZW5jbG9zdXJlfSB7CisgICAgICAgICAgICBzZXQgc3dhcCAkdXBwZXJfZW5jbG9zdXJlCisgICAgICAgICAgICBzZXQgdXBwZXJfZW5jbG9zdXJlICRtYXhfdXBwZXJfZW5jbG9zdXJlCisgICAgICAgICAgICBzZXQgbWF4X3VwcGVyX2VuY2xvc3VyZSAkc3dhcAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAjIFdoYXQgYXJlIHRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIGFuZCBjb2x1bW5zIHRoYXQgd2UgY2FuIGZpdCBpbiB0aGlzIHNwYWNlPworICAgICAgICBzZXQgaSAwCisgICAgICAgIHNldCB2aWFfd2lkdGhfbG93ZXIgMAorICAgICAgICBzZXQgdmlhX3dpZHRoX3VwcGVyIDAKKyAgICAgICAgd2hpbGUgeyR2aWFfd2lkdGhfbG93ZXIgPCAkbG93ZXJfd2lkdGggJiYgJHZpYV93aWR0aF91cHBlciA8ICR1cHBlcl93aWR0aH0geworICAgICAgICAgICAgaW5jciBpCisgICAgICAgICAgICBzZXQgeGN1dF9waXRjaCBbbGluZGV4IFtkaWN0IGdldCAkdmlhX2luZm8gY3V0IHNwYWNpbmddIDBdCisgICAgICAgICAgICBzZXQgdmlhX3dpZHRoX2xvd2VyIFtleHByICRjdXRfd2lkdGggKyAkeGN1dF9waXRjaCAqICgkaSAtIDEpICsgMiAqICRsb3dlcl9lbmNsb3N1cmVdCisgICAgICAgICAgICBzZXQgdmlhX3dpZHRoX3VwcGVyIFtleHByICRjdXRfd2lkdGggKyAkeGN1dF9waXRjaCAqICgkaSAtIDEpICsgMiAqICR1cHBlcl9lbmNsb3N1cmVdCisgICAgICAgIH0KKyAgICAgICAgc2V0IHhjdXRfc3BhY2luZyBbZXhwciAkeGN1dF9waXRjaCAtICRjdXRfd2lkdGhdCisgICAgICAgIHNldCBjb2x1bW5zIFtleHByICRpIC0gMV0KKworICAgICAgICBzZXQgaSAwCisgICAgICAgIHNldCB2aWFfaGVpZ2h0X2xvd2VyIDAKKyAgICAgICAgc2V0IHZpYV9oZWlnaHRfdXBwZXIgMAorICAgICAgICB3aGlsZSB7JHZpYV9oZWlnaHRfbG93ZXIgPCAkbG93ZXJfaGVpZ2h0ICYmICR2aWFfaGVpZ2h0X3VwcGVyIDwgJHVwcGVyX2hlaWdodH0geworICAgICAgICAgICAgaW5jciBpCisgICAgICAgICAgICBzZXQgeWN1dF9waXRjaCBbbGluZGV4IFtkaWN0IGdldCAkdmlhX2luZm8gY3V0IHNwYWNpbmddIDFdCisgICAgICAgICAgICBzZXQgdmlhX2hlaWdodF9sb3dlciBbZXhwciAkY3V0X2hlaWdodCArICR5Y3V0X3BpdGNoICogKCRpIC0gMSkgKyAyICogJGxvd2VyX2VuY2xvc3VyZV0KKyAgICAgICAgICAgIHNldCB2aWFfaGVpZ2h0X3VwcGVyIFtleHByICRjdXRfaGVpZ2h0ICsgJHljdXRfcGl0Y2ggKiAoJGkgLSAxKSArIDIgKiAkdXBwZXJfZW5jbG9zdXJlXQorICAgICAgICB9CisgICAgICAgIHNldCB5Y3V0X3NwYWNpbmcgW2V4cHIgJHljdXRfcGl0Y2ggLSAkY3V0X2hlaWdodF0KKyAgICAgICAgc2V0IHJvd3MgW2V4cHIgJGkgLSAxXQorCisJc2V0IGxvd2VyX2VuY193aWR0aCAgW2V4cHIgcm91bmQoKCRsb3dlcl93aWR0aCAgLSAoJGN1dF93aWR0aCAgICsgJHhjdXRfcGl0Y2ggKiAoJGNvbHVtbnMgLSAxKSkpIC8gMildCisJc2V0IGxvd2VyX2VuY19oZWlnaHQgW2V4cHIgcm91bmQoKCRsb3dlcl9oZWlnaHQgLSAoJGN1dF9oZWlnaHQgICsgJHljdXRfcGl0Y2ggKiAoJHJvd3MgICAgLSAxKSkpIC8gMildCisJc2V0IHVwcGVyX2VuY193aWR0aCAgW2V4cHIgcm91bmQoKCR1cHBlcl93aWR0aCAgLSAoJGN1dF93aWR0aCAgICsgJHhjdXRfcGl0Y2ggKiAoJGNvbHVtbnMgLSAxKSkpIC8gMildCisJc2V0IHVwcGVyX2VuY19oZWlnaHQgW2V4cHIgcm91bmQoKCR1cHBlcl9oZWlnaHQgLSAoJGN1dF9oZWlnaHQgICsgJHljdXRfcGl0Y2ggKiAoJHJvd3MgICAgLSAxKSkpIC8gMildCisKKyAgICAgICAgIyBBZGp1c3QgY2FsY3VsYXRlZCB2aWEgd2lkdGggdmFsdWVzIHRvIGVuc3VyZSB0aGF0IGFuIGFsbG93ZWQgc2l6ZSBpcyBnZW5lcmF0ZWQKKyAgICAgICAgc2V0IGxvd2VyX3NpemVfbWF4X2VuY2xvc3VyZSBbZ2V0X2FkanVzdGVkX3dpZHRoIFtkaWN0IGdldCAkdmlhX2luZm8gbG93ZXIgbGF5ZXJdIFtleHByIHJvdW5kKCgkY3V0X3dpZHRoICAgKyAkeGN1dF9waXRjaCAqICgkY29sdW1ucyAtIDEpICsgJG1heF9sb3dlcl9lbmNsb3N1cmUgKiAyKSldXQorICAgICAgICBzZXQgdXBwZXJfc2l6ZV9tYXhfZW5jbG9zdXJlIFtnZXRfYWRqdXN0ZWRfd2lkdGggW2RpY3QgZ2V0ICR2aWFfaW5mbyB1cHBlciBsYXllcl0gW2V4cHIgcm91bmQoKCRjdXRfd2lkdGggICArICR4Y3V0X3BpdGNoICogKCRjb2x1bW5zIC0gMSkgKyAkbWF4X3VwcGVyX2VuY2xvc3VyZSAqIDIpKV1dCisgICAgICAgIAorICAgICAgICBzZXQgbWF4X2xvd2VyX2VuY2xvc3VyZSBbZXhwciByb3VuZCgoJGxvd2VyX3NpemVfbWF4X2VuY2xvc3VyZSAgLSAoJGN1dF93aWR0aCAgICsgJHhjdXRfcGl0Y2ggKiAoJGNvbHVtbnMgLSAxKSkpIC8gMildCisgICAgICAgIHNldCBtYXhfdXBwZXJfZW5jbG9zdXJlIFtleHByIHJvdW5kKCgkdXBwZXJfc2l6ZV9tYXhfZW5jbG9zdXJlICAtICgkY3V0X3dpZHRoICAgKyAkeGN1dF9waXRjaCAqICgkY29sdW1ucyAtIDEpKSkgLyAyKV0KKworICAgICAgICAjIFVzZSB0aGUgbGFyZ2VzdCB2YWx1ZSBvZiBlbmNsb3N1cmUgaW4gdGhlIGRpcmVjdGlvbiBvZiB0aGUgbGF5ZXIKKyAgICAgICAgIyBVc2UgdGhlIHNtYWxsZXN0IHZhbHVlIG9mIGVuY2xvc3VyZSBwZXJwZW5kaWN1bGFyIHRvIGRpcmVjdGlvbiBvZiB0aGUgbGF5ZXIKKwlpZiB7JGxvd2VyX2RpciA9PSAiaG9yIn0geworICAgICAgICAgICAgaWYgeyRsb3dlcl9lbmNfaGVpZ2h0IDwgJG1heF9sb3dlcl9lbmNsb3N1cmV9IHsKKyAgICAgICAgICAgICAgICBzZXQgeEJvdEVuYyAkbWF4X2xvd2VyX2VuY2xvc3VyZQorICAgICAgICAgICAgICAgIGlmIHskbG93ZXJfZW5jX3dpZHRoID4gJHhCb3RFbmN9IHsKKyAgICAgICAgICAgICAgICAgICAgc2V0IHhCb3RFbmMgJGxvd2VyX2VuY193aWR0aAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2V0IHhCb3RFbmMgJGxvd2VyX2VuY193aWR0aAorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHlCb3RFbmMgJGxvd2VyX2VuY19oZWlnaHQKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldCB4Qm90RW5jICRsb3dlcl9lbmNfd2lkdGgKKyAgICAgICAgICAgIGlmIHskbG93ZXJfZW5jX3dpZHRoIDwgJG1heF9sb3dlcl9lbmNsb3N1cmV9IHsKKyAgICAgICAgICAgICAgICBzZXQgeUJvdEVuYyAkbWF4X2xvd2VyX2VuY2xvc3VyZQorICAgICAgICAgICAgICAgIGlmIHskbG93ZXJfZW5jX2hlaWdodCA+ICR5Qm90RW5jfSB7CisgICAgICAgICAgICAgICAgICAgIHNldCB5Qm90RW5jICRsb3dlcl9lbmNfaGVpZ2h0CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZXQgeUJvdEVuYyAkbG93ZXJfZW5jX2hlaWdodAorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgIyBVc2UgdGhlIGxhcmdlc3QgdmFsdWUgb2YgZW5jbG9zdXJlIGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlIGxheWVyCisgICAgICAgICMgVXNlIHRoZSBzbWFsbGVzdCB2YWx1ZSBvZiBlbmNsb3N1cmUgcGVycGVuZGljdWxhciB0byBkaXJlY3Rpb24gb2YgdGhlIGxheWVyCisJaWYge1tnZXRfZGlyIFtkaWN0IGdldCAkdmlhX2luZm8gdXBwZXIgbGF5ZXJdXSA9PSAiaG9yIn0geworICAgICAgICAgICAgaWYgeyR1cHBlcl9lbmNfaGVpZ2h0IDwgJG1heF91cHBlcl9lbmNsb3N1cmV9IHsKKyAgICAgICAgICAgICAgICBzZXQgeFRvcEVuYyAkbWF4X3VwcGVyX2VuY2xvc3VyZQorICAgICAgICAgICAgICAgIGlmIHskdXBwZXJfZW5jX3dpZHRoID4gJHhUb3BFbmN9IHsKKyAgICAgICAgICAgICAgICAgICAgc2V0IHhUb3BFbmMgJHVwcGVyX2VuY193aWR0aAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2V0IHhUb3BFbmMgJHVwcGVyX2VuY193aWR0aAorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHlUb3BFbmMgJHVwcGVyX2VuY19oZWlnaHQKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldCB4VG9wRW5jICR1cHBlcl9lbmNfd2lkdGgKKyAgICAgICAgICAgIGlmIHskdXBwZXJfZW5jX3dpZHRoIDwgJG1heF91cHBlcl9lbmNsb3N1cmV9IHsKKyAgICAgICAgICAgICAgICBzZXQgeVRvcEVuYyAkbWF4X3VwcGVyX2VuY2xvc3VyZQorICAgICAgICAgICAgICAgIGlmIHskdXBwZXJfZW5jX2hlaWdodCA+ICR5VG9wRW5jfSB7CisgICAgICAgICAgICAgICAgICAgIHNldCB5VG9wRW5jICR1cHBlcl9lbmNfaGVpZ2h0CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZXQgeVRvcEVuYyAkdXBwZXJfZW5jX2hlaWdodAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBzZXQgcnVsZSBbbGlzdCBcCisgICAgICAgICAgICBydWxlICRydWxlX25hbWUgXAorICAgICAgICAgICAgY3V0c2l6ZSBbZGljdCBnZXQgJHZpYV9pbmZvIGN1dCBzaXplXSBcCisgICAgICAgICAgICBsYXllcnMgW2xpc3QgW2RpY3QgZ2V0ICR2aWFfaW5mbyBsb3dlciBsYXllcl0gW2RpY3QgZ2V0ICR2aWFfaW5mbyBjdXQgbGF5ZXJdIFtkaWN0IGdldCAkdmlhX2luZm8gdXBwZXIgbGF5ZXJdXSBcCisgICAgICAgICAgICBjdXRzcGFjaW5nIFtsaXN0IFwKKyAgICAgICAgICAgICAgICBbZXhwciBbbGluZGV4IFtkaWN0IGdldCAkdmlhX2luZm8gY3V0IHNwYWNpbmddIDBdIC0gW2xpbmRleCBbZGljdCBnZXQgJHZpYV9pbmZvIGN1dCBzaXplXSAwXV0gXAorICAgICAgICAgICAgICAgIFtleHByIFtsaW5kZXggW2RpY3QgZ2V0ICR2aWFfaW5mbyBjdXQgc3BhY2luZ10gMV0gLSBbbGluZGV4IFtkaWN0IGdldCAkdmlhX2luZm8gY3V0IHNpemVdIDFdXSBcCisgICAgICAgICAgICBdIFwKKyAgICAgICAgICAgIHJvd2NvbCBbbGlzdCAkcm93cyAkY29sdW1uc10gXAorICAgICAgICAgICAgZW5jbG9zdXJlIFtsaXN0ICR4Qm90RW5jICR5Qm90RW5jICR4VG9wRW5jICR5VG9wRW5jXSBcCisgICAgICAgIF0KKyAgICAgICAgCisgICAgICAgIHJldHVybiAkcnVsZQorICAgIH0KKyAgICAKKyAgICBwcm9jIGdldF92aWFydWxlX25hbWUge2xvd2VyIHggeSB3aWR0aCBoZWlnaHR9IHsKKyAgICAgICAgc2V0IHJ1bGVzIFtzZWxlY3RfdmlhaW5mbyAkbG93ZXJdCisgICAgICAgIHNldCBmaXJzdF9rZXkgW2xpbmRleCBbZGljdCBrZXlzICRydWxlc10gMF0KKyAgICAgICAgc2V0IGN1dF9sYXllciBbZGljdCBnZXQgJHJ1bGVzICRmaXJzdF9rZXkgY3V0IGxheWVyXQorCisgICAgICAgIHJldHVybiAke2N1dF9sYXllcn1fJHt3aWR0aH14JHtoZWlnaHR9CisgICAgfQorICAgIAorICAgIHByb2MgZ2V0X2N1dF9hcmVhIHtydWxlfSB7CisgICAgICAgIHJldHVybiBbZXhwciBbbGluZGV4IFtkaWN0IGdldCAkcnVsZSByb3djb2xdIDBdICogW2xpbmRleCBbZGljdCBnZXQgJHJ1bGUgcm93Y29sXSAwXSAqIFtsaW5kZXggW2RpY3QgZ2V0ICRydWxlIGN1dHNpemVdIDBdICogW2xpbmRleCBbZGljdCBnZXQgJHJ1bGUgY3V0c2l6ZV0gMV1dCisgICAgfQorICAgIAorICAgIHByb2Mgc2VsZWN0X3J1bGUge3J1bGUxIHJ1bGUyfSB7CisgICAgICAgIGlmIHtbZ2V0X2N1dF9hcmVhICRydWxlMl0gPiBbZ2V0X2N1dF9hcmVhICRydWxlMV19IHsKKyAgICAgICAgICAgIHJldHVybiAkcnVsZTIKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gJHJ1bGUxCisgICAgfQorICAgIAorICAgIHByb2MgZ2V0X3ZpYSB7bG93ZXIgeCB5IHdpZHRoIGhlaWdodH0geworICAgICAgICAjIEZpcnN0IGN1ciB3aWxsIGFzc3VtZSB0aGF0IGFsbCBjcm9zc2luZyBwb2ludHMgKHggeSkgYXJlIG9uIGdyaWQgZm9yIGJvdGggbG93ZXIgYW5kIHVwcGVyIGxheWVycworICAgICAgICAjIFRPRE86IFJlZmluZSB0aGUgYWxnb3JpdGhtIHRvIGNvcGUgd2l0aCBvZmZncmlkIGludGVyc2VjdGlvbiBwb2ludHMKKyAgICAgICAgdmFyaWFibGUgcGh5c2ljYWxfdmlhcnVsZXMKKyAgICAgICAgCisgICAgICAgIHNldCBydWxlX25hbWUgW2dldF92aWFydWxlX25hbWUgJGxvd2VyICR4ICR5ICR3aWR0aCAkaGVpZ2h0XQorCisgICAgICAgIGlmIHshW2RpY3QgZXhpc3RzICRwaHlzaWNhbF92aWFydWxlcyAkcnVsZV9uYW1lXX0geworICAgICAgICAgICAgc2V0IHNlbGVjdGVkX3J1bGUge30KKworICAgICAgICAgICAgZGljdCBmb3Ige25hbWUgcnVsZX0gW3NlbGVjdF92aWFpbmZvICRsb3dlcl0geworICAgICAgICAgICAgICAgIHNldCByZXN1bHQgW2dldF92aWFfb3B0aW9uIFtnZXRfZGlyICRsb3dlcl0gJG5hbWUgJHJ1bGUgJHggJHkgJHdpZHRoICRoZWlnaHRdCisgICAgICAgICAgICAgICAgaWYgeyRzZWxlY3RlZF9ydWxlID09IHt9fSB7CisgICAgICAgICAgICAgICAgICAgIHNldCBzZWxlY3RlZF9ydWxlICRyZXN1bHQKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAjIENob29zZSB0aGUgYmVzdCBiZXR3ZWVuIHNlbGVjdGVkIHJ1bGUgYW5kIGN1cnJlbnQgcmVzdWx0LCB0aGUgd2lubmVyIGJlY29tZXMgdGhlIG5ldyBzZWxlY3RlZCBydWxlCisgICAgICAgICAgICAgICAgICAgIHNldCBzZWxlY3RlZF9ydWxlIFtzZWxlY3RfcnVsZSAkc2VsZWN0ZWRfcnVsZSAkcmVzdWx0XQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGljdCBzZXQgcGh5c2ljYWxfdmlhcnVsZXMgJHJ1bGVfbmFtZSAkc2VsZWN0ZWRfcnVsZQorICAgICAgICB9ICAgICAgICAKKyAgICAgICAgCisgICAgICAgIHJldHVybiAkcnVsZV9uYW1lCisgICAgfQorICAgIAorICAgIHByb2MgZ2VuZXJhdGVfdmlhcyB7bGF5ZXIxIGxheWVyMiBpbnRlcnNlY3Rpb25zfSB7CisgICAgICAgIHZhcmlhYmxlIGxvZ2ljYWxfdmlhcnVsZXMKKyAgICAgICAgdmFyaWFibGUgcGh5c2ljYWxfdmlhcnVsZXMKKyAgICAgICAgdmFyaWFibGUgbWV0YWxfbGF5ZXJzCisKKyAgICAgICAgc2V0IHZpYXMge30KKyAgICAgICAgc2V0IGxheWVyMV9uYW1lICRsYXllcjEKKyAgICAgICAgc2V0IGxheWVyMl9uYW1lICRsYXllcjIKKyAgICAgICAgcmVnZXhwIHsoLiopX1BJTl8oaG9yfHZlcil9ICRsYXllcjEgLSBsYXllcjFfbmFtZSBsYXllcjFfZGlyZWN0aW9uCisgICAgICAgIAorICAgICAgICBzZXQgaTEgW2xzZWFyY2ggJG1ldGFsX2xheWVycyAkbGF5ZXIxX25hbWVdCisgICAgICAgIHNldCBpMiBbbHNlYXJjaCAkbWV0YWxfbGF5ZXJzICRsYXllcjJfbmFtZV0KKyAgICAgICAgaWYgeyRpMSA9PSAtMX0ge3B1dHMgIkxheWVyMSBbZGljdCBnZXQgJGNvbm5lY3QgbGF5ZXIxXSwgTGF5ZXIyICRsYXllcjIiOyBleGl0IC0xfQorICAgICAgICBpZiB7JGkyID09IC0xfSB7cHV0cyAiTGF5ZXIxIFtkaWN0IGdldCAkY29ubmVjdCBsYXllcjFdLCBMYXllcjIgJGxheWVyMiI7IGV4aXQgLTF9CisKKwkjIEZvciBlYWNoIGxheWVyIGJldHdlZW4gbDEgYW5kIGwyLCBhZGQgdmlhcyBhdCB0aGUgaW50ZXJzZWN0aW9uCisgICAgICAgIGZvcmVhY2ggaW50ZXJzZWN0aW9uICRpbnRlcnNlY3Rpb25zIHsKKyAgICAgICAgICAgIGlmIHshW2RpY3QgZXhpc3RzICRsb2dpY2FsX3ZpYXJ1bGVzIFtkaWN0IGdldCAkaW50ZXJzZWN0aW9uIHJ1bGVdXX0geworICAgICAgICAgICAgICAgIHB1dHMgIk1pc3Npbmcga2V5IFtkaWN0IGdldCAkaW50ZXJzZWN0aW9uIHJ1bGVdIgorICAgICAgICAgICAgICAgIHB1dHMgIkF2YWlsYWJsZSBrZXlzIFtkaWN0IGtleXMgJGxvZ2ljYWxfdmlhcnVsZXNdIgorICAgICAgICAgICAgICAgIGV4aXQgLTEKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCBsb2dpY2FsX3J1bGUgW2RpY3QgZ2V0ICRsb2dpY2FsX3ZpYXJ1bGVzIFtkaWN0IGdldCAkaW50ZXJzZWN0aW9uIHJ1bGVdXQorCisgICAgICAgICAgICBzZXQgeCBbZGljdCBnZXQgJGludGVyc2VjdGlvbiB4XQorICAgICAgICAgICAgc2V0IHkgW2RpY3QgZ2V0ICRpbnRlcnNlY3Rpb24geV0KKyAgICAgICAgICAgIHNldCB3aWR0aCAgW2RpY3QgZ2V0ICRsb2dpY2FsX3J1bGUgd2lkdGhdCisgICAgICAgICAgICBzZXQgaGVpZ2h0ICBbZGljdCBnZXQgJGxvZ2ljYWxfcnVsZSBoZWlnaHRdCisgICAgICAgICAgICAKKyAgICAgICAgICAgIHNldCBjb25uZWN0aW9uX2xheWVycyBbbGlzdCAkbGF5ZXIxIHsqfVtscmFuZ2UgJG1ldGFsX2xheWVycyBbZXhwciAkaTEgKyAxXSBbZXhwciAkaTIgLSAxXV1dCisJICAgIGZvcmVhY2ggbGF5ICRjb25uZWN0aW9uX2xheWVycyB7CisgICAgICAgICAgICAgICAgc2V0IHZpYV9uYW1lIFtnZXRfdmlhICRsYXkgJHggJHkgJHdpZHRoICRoZWlnaHRdCisKKyAgICAgICAgICAgICAgICBsYXBwZW5kIHZpYXMgW2xpc3QgbmFtZSAkdmlhX25hbWUgbG93ZXJfbGF5ZXIgJGxheSB4IFtleHByIHJvdW5kKFtkaWN0IGdldCAkaW50ZXJzZWN0aW9uIHhdKV0geSBbZXhwciByb3VuZChbZGljdCBnZXQgJGludGVyc2VjdGlvbiB5XSldXQorCSAgICB9CisJfQorICAgICAgICAgICAgICAgIAorICAgICAgICByZXR1cm4gJHZpYXMKKyAgICB9CiAKICMjIFByb2MgdG8gZ2VuZXJhdGUgdmlhIGxvY2F0aW9ucywgYm90aCBmb3IgYSBub3JtYWwgdmlhIGFuZCBzdGFja2VkIHZpYQogcHJvYyBnZW5lcmF0ZV92aWFfc3RhY2tzIHtsMSBsMiB0YWcgZ3JpZF9kYXRhfSB7CisgICAgdmFyaWFibGUgbG9naWNhbF92aWFydWxlcworICAgIHZhcmlhYmxlIGRlZmF1bHRfZ3JpZF9kYXRhCisgICAgdmFyaWFibGUgb3JpZ19zdHJpcGVfbG9jcworICAgIHZhcmlhYmxlIGRlZl91bml0cworICAgIAogICAgIHNldCBibG9ja2FnZSBbZGljdCBnZXQgJGdyaWRfZGF0YSBibG9ja2FnZV0KICAgICBzZXQgYXJlYSBbZGljdCBnZXQgJGdyaWRfZGF0YSBhcmVhXQogICAgIApAQCAtMTcsMTQ1ICszMjIsMjAyIEBACiAgICAgc2V0IGludGVyc2VjdGlvbnMgIiIKICAgICAjY2hlY2sgaWYgbGF5ZXIgcGFpciBpcyBvcnRob2dvbmFsLCBjYXNlIDEKICAgICBzZXQgbGF5ZXIxICRsMQotICAgIGlmIHtbbHNlYXJjaCAkOjptZXRfbGF5ZXJfbGlzdCAkbGF5ZXIxXSAhPSAtMX0geworICAgIGlmIHtbZGljdCBleGlzdHMgJGdyaWRfZGF0YSBsYXllcnMgJGxheWVyMV19IHsKICAgICAgICAgc2V0IGxheWVyMV9kaXJlY3Rpb24gW2dldF9kaXIgJGxheWVyMV0KKyAgICAgICAgc2V0IGxheWVyMV93aWR0aCBbZGljdCBnZXQgJGdyaWRfZGF0YSBsYXllcnMgJGxheWVyMSB3aWR0aF0KKyAgICAgICAgc2V0IGxheWVyMV93aWR0aCBbZXhwciByb3VuZCgkbGF5ZXIxX3dpZHRoICogJGRlZl91bml0cyldCiAgICAgfSBlbHNlaWYge1tyZWdleHAgeyguKilfUElOXyhob3J8dmVyKX0gJGwxIC0gbGF5ZXIxIGxheWVyMV9kaXJlY3Rpb25dfSB7CiAgICAgICAgICMKICAgICB9IGVsc2UgewogICAgICAgICBwdXRzICJJbnZhbGlkIGRpcmVjdGlvbiBmb3IgbGF5ZXIgJGwxIgogICAgIH0KKyAgICAKKyAgICBzZXQgbGF5ZXIyICRsMgorICAgIGlmIHtbZGljdCBleGlzdHMgJGdyaWRfZGF0YSBsYXllcnMgJGxheWVyMl19IHsKKyAgICAgICAgc2V0IGxheWVyMl93aWR0aCBbZGljdCBnZXQgJGdyaWRfZGF0YSBsYXllcnMgJGxheWVyMiB3aWR0aF0KKyAgICAgICAgc2V0IGxheWVyMl93aWR0aCBbZXhwciByb3VuZCgkbGF5ZXIyX3dpZHRoICogJGRlZl91bml0cyldCisgICAgfSBlbHNlaWYge1tkaWN0IGV4aXN0cyAkZGVmYXVsdF9ncmlkX2RhdGEgbGF5ZXJzICRsYXllcjJdfSB7CisgICAgICAgIHNldCBsYXllcjJfd2lkdGggW2RpY3QgZ2V0ICRkZWZhdWx0X2dyaWRfZGF0YSBsYXllcnMgJGxheWVyMiB3aWR0aF0KKyAgICAgICAgc2V0IGxheWVyMl93aWR0aCBbZXhwciByb3VuZCgkbGF5ZXIyX3dpZHRoICogJGRlZl91bml0cyldCisgICAgfSBlbHNlIHsKKyAgICAgICAgcHV0cyAiTm8gd2lkdGggaW5mb3JtYXRpb24gYXZhaWxhYmxlIGZvciBsYXllciAkbGF5ZXIyIgorICAgIH0KKyAgICAKICAgICBzZXQgaWdub3JlX2NvdW50IDAKICAgICAKICAgICBpZiB7JGxheWVyMV9kaXJlY3Rpb24gPT0gImhvciIgJiYgW2dldF9kaXIgJGwyXSA9PSAidmVyIn0gewogCi0gICAgICAgICNsb29wIG92ZXIgZWFjaCBzdHJpcGUgb2YgbGF5ZXIgMSBhbmQgbGF5ZXIgMiAKLQlmb3JlYWNoIGwxX3N0ciAkOjpvcmlnX3N0cmlwZV9sb2NzKCRsMSwkdGFnKSB7Ci0JICAgIHNldCBhMSAgW2V4cHIge1tsaW5kZXggJGwxX3N0ciAxXX1dCisgICAgICAgIGlmIHtbYXJyYXkgbmFtZXMgb3JpZ19zdHJpcGVfbG9jcyAiJGwxLCR0YWciXSAhPSAiIn0geworICAgICAgICAgICAgIyMgcHV0cyAiQ2hlY2tpbmcgW2xsZW5ndGggJG9yaWdfc3RyaXBlX2xvY3MoJGwxLCR0YWcpXSBob3Jpem9udGFsIHN0cmlwZXMgb24gJGwxLCAkdGFnIgorICAgICAgICAgICAgIyMgcHV0cyAiICB2ZXJzdXMgW2xsZW5ndGggJG9yaWdfc3RyaXBlX2xvY3MoJGwyLCR0YWcpXSB2ZXJ0aWNhbCAgIHN0cmlwZXMgb24gJGwyLCAkdGFnIgorICAgICAgICAgICAgIyMgcHV0cyAiICAgICBhbmQgW2xsZW5ndGggJGJsb2NrYWdlXSBibG9ja2FnZXMiCisgICAgICAgICAgICAjbG9vcCBvdmVyIGVhY2ggc3RyaXBlIG9mIGxheWVyIDEgYW5kIGxheWVyIDIgCisJICAgIGZvcmVhY2ggbDFfc3RyICRvcmlnX3N0cmlwZV9sb2NzKCRsMSwkdGFnKSB7CisJICAgICAgICBzZXQgYTEgIFtleHByIHtbbGluZGV4ICRsMV9zdHIgMV19XQogCi0JICAgIGZvcmVhY2ggbDJfc3RyICQ6Om9yaWdfc3RyaXBlX2xvY3MoJGwyLCR0YWcpIHsKLQkJc2V0IGZsYWcgMQotCQlzZXQgYTIJW2V4cHIge1tsaW5kZXggJGwyX3N0ciAwXX1dCisJICAgICAgICBmb3JlYWNoIGwyX3N0ciAkb3JpZ19zdHJpcGVfbG9jcygkbDIsJHRhZykgeworCQkgICAgc2V0IGZsYWcgMQorCQkgICAgc2V0IGEyCVtleHByIHtbbGluZGV4ICRsMl9zdHIgMF19XQogCi0gICAgICAgICAgICAgICAgIyBJZ25vcmUgaWYgb3V0c2lkZSB0aGUgYXJlYQotICAgICAgICAgICAgICAgIGlmIHshKCRhMiA+PSBbbGluZGV4ICRhcmVhIDBdICYmICRhMiA8PSBbbGluZGV4ICRhcmVhIDJdICYmICRhMSA+PSBbbGluZGV4ICRhcmVhIDFdICYmICRhMSA8PSBbbGluZGV4ICRhcmVhIDNdKX0ge2NvbnRpbnVlfQotCSAgICAgICAgaWYgeyRhMiA+IFtsaW5kZXggJGwxX3N0ciAyXSB8fCAkYTIgPCBbbGluZGV4ICRsMV9zdHIgMF19IHtjb250aW51ZX0KLQkgICAgICAgIGlmIHskYTEgPiBbbGluZGV4ICRsMl9zdHIgMl0gfHwgJGExIDwgW2xpbmRleCAkbDJfc3RyIDFdfSB7Y29udGludWV9CisgICAgICAgICAgICAgICAgICAgICMgSWdub3JlIGlmIG91dHNpZGUgdGhlIGFyZWEKKyAgICAgICAgICAgICAgICAgICAgaWYgeyEoJGEyID49IFtsaW5kZXggJGFyZWEgMF0gJiYgJGEyIDw9IFtsaW5kZXggJGFyZWEgMl0gJiYgJGExID49IFtsaW5kZXggJGFyZWEgMV0gJiYgJGExIDw9IFtsaW5kZXggJGFyZWEgM10pfSB7Y29udGludWV9CisJICAgICAgICAgICAgaWYgeyRhMiA+IFtsaW5kZXggJGwxX3N0ciAyXSB8fCAkYTIgPCBbbGluZGV4ICRsMV9zdHIgMF19IHtjb250aW51ZX0KKwkgICAgICAgICAgICBpZiB7JGExID4gW2xpbmRleCAkbDJfc3RyIDJdIHx8ICRhMSA8IFtsaW5kZXggJGwyX3N0ciAxXX0ge2NvbnRpbnVlfQogCi0gICAgICAgICAgICAgICAgaWYge1tsaW5kZXggJGwyX3N0ciAxXSA9PSBbbGluZGV4ICRhcmVhIDNdfSB7Y29udGludWV9Ci0gICAgICAgICAgICAgICAgaWYge1tsaW5kZXggJGwyX3N0ciAyXSA9PSBbbGluZGV4ICRhcmVhIDFdfSB7Y29udGludWV9CisgICAgICAgICAgICAgICAgICAgIGlmIHtbbGluZGV4ICRsMl9zdHIgMV0gPT0gW2xpbmRleCAkYXJlYSAzXX0ge2NvbnRpbnVlfQorICAgICAgICAgICAgICAgICAgICBpZiB7W2xpbmRleCAkbDJfc3RyIDJdID09IFtsaW5kZXggJGFyZWEgMV19IHtjb250aW51ZX0KIAotICAgICAgICAgICAgICAgICNsb29wIG92ZXIgZWFjaCBibG9ja2FnZSBnZW9tZXRyeSAobWFjcm9zIGFyZSBibG9ja2FnZXMpCi0JCWZvcmVhY2ggYmxrMSAkYmxvY2thZ2UgewotCQkgICAgc2V0IGIxIFtleHByIHtbbGluZGV4ICRibGsxIDBdICogJDo6ZGVmX3VuaXRzIH1dCi0JCSAgICBzZXQgYjIgW2V4cHIge1tsaW5kZXggJGJsazEgMV0gKiAkOjpkZWZfdW5pdHMgfV0KLQkJICAgIHNldCBiMyBbZXhwciB7W2xpbmRleCAkYmxrMSAyXSAqICQ6OmRlZl91bml0cyB9XQotCQkgICAgc2V0IGI0IFtleHByIHtbbGluZGV4ICRibGsxIDNdICogJDo6ZGVmX3VuaXRzIH1dCi0JCSAgICAjIyBDaGVjayBpZiBzdHJpcGVzIGFyZSB0byBiZSBibG9ja2VkIG9uIHRoZXNlIGJsb2NrYWdlcyAoYmxvY2thZ2VzIGFyZSBzcGVjaWZpYyB0byBlYWNoIGxheWVyKS4gSWYgeWVzLCBkbyBub3QgZHJvcCB2aWFzCi0JCSAgICBpZiB7ICBbbHNlYXJjaCAkOjptYWNyb19ibG9ja2FnZV9sYXllcl9saXN0ICRsMV0gPj0gMCB8fCBbbHNlYXJjaCAkOjptYWNyb19ibG9ja2FnZV9sYXllcl9saXN0ICRsMl0gPj0gMCB9IHsKLQkJCWlmIHsoJGEyID4gJGIxICYmICRhMiA8ICRiMyAmJiAkYTEgPiAkYjIgJiYgJGExIDwgJGI0ICkgfSB7Ci0JCQkgICAgc2V0IGZsYWcgMAotCQkJfSAKLQkJCWlmIHskYTIgPiAkYjEgJiYgJGEyIDwgJGIzICYmICRhMSA9PSAkYjIgJiYgJGExID09IFtsaW5kZXggJGFyZWEgMV19IHsKLQkJCSAgICBzZXQgZmxhZyAwCi0JCQl9IAotCQkJaWYgeyRhMiA+ICRiMSAmJiAkYTIgPCAkYjMgJiYgJGExID09ICRiNCAmJiAkYTEgPT0gW2xpbmRleCAkYXJlYSAzXX0gewotCQkJICAgIHNldCBmbGFnIDAKLQkJCX0gCisgICAgICAgICAgICAgICAgICAgICNsb29wIG92ZXIgZWFjaCBibG9ja2FnZSBnZW9tZXRyeSAobWFjcm9zIGFyZSBibG9ja2FnZXMpCisJCSAgICBmb3JlYWNoIGJsazEgJGJsb2NrYWdlIHsKKwkJICAgICAgICBzZXQgYjEgW2dldF9pbnN0YW5jZV9sbHggJGJsazFdCisJCSAgICAgICAgc2V0IGIyIFtnZXRfaW5zdGFuY2VfbGx5ICRibGsxXQorCQkgICAgICAgIHNldCBiMyBbZ2V0X2luc3RhbmNlX3VyeCAkYmxrMV0KKwkJICAgICAgICBzZXQgYjQgW2dldF9pbnN0YW5jZV91cnkgJGJsazFdCisJCSAgICAgICAgIyMgQ2hlY2sgaWYgc3RyaXBlcyBhcmUgdG8gYmUgYmxvY2tlZCBvbiB0aGVzZSBibG9ja2FnZXMgKGJsb2NrYWdlcyBhcmUgc3BlY2lmaWMgdG8gZWFjaCBsYXllcikuIElmIHllcywgZG8gbm90IGRyb3AgdmlhcworCQkgICAgICAgIGlmIHsgIFtsc2VhcmNoIFtnZXRfbWFjcm9fYmxvY2thZ2VfbGF5ZXJzICRibGsxXSAkbDFdID49IDAgfHwgW2xzZWFyY2ggW2dldF9tYWNyb19ibG9ja2FnZV9sYXllcnMgJGJsazFdICRsMl0gPj0gMCB9IHsKKwkJCSAgICBpZiB7KCRhMiA+ICRiMSAmJiAkYTIgPCAkYjMgJiYgJGExID4gJGIyICYmICRhMSA8ICRiNCApIH0geworCQkJICAgICAgICBzZXQgZmxhZyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisJCQkgICAgfSAKKwkJCSAgICBpZiB7JGEyID4gJGIxICYmICRhMiA8ICRiMyAmJiAkYTEgPT0gJGIyICYmICRhMSA9PSBbbGluZGV4ICRhcmVhIDFdfSB7CisJCQkgICAgICAgIHNldCBmbGFnIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKwkJCSAgICB9IAorCQkJICAgIGlmIHskYTIgPiAkYjEgJiYgJGEyIDwgJGIzICYmICRhMSA9PSAkYjQgJiYgJGExID09IFtsaW5kZXggJGFyZWEgM119IHsKKwkJCSAgICAgICAgc2V0IGZsYWcgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworCQkJICAgIH0gCisJCSAgICAgICAgfQogCQkgICAgfQotCQl9CiAKLQkJaWYgeyRmbGFnID09IDF9IHsKLSAgICAgICAgICAgICAgICAgICAgIyMgaWYgbm8gYmxvY2thZ2UgcmVzdHJpY3Rpb24sIGFwcGVuZCBpbnRlcnNlY3RpbmcgcG9pbnRzIHRvIHRoaXMgImludGVyc2VjdGlvbnMiCi0JCSAgICBsYXBwZW5kIGludGVyc2VjdGlvbnMgIiRhMiAkYTEiCi0JCX0KLQkgICAgfQorCQkgICAgaWYgeyRmbGFnID09IDF9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICMjIGlmIG5vIGJsb2NrYWdlIHJlc3RyaWN0aW9uLCBhcHBlbmQgaW50ZXJzZWN0aW5nIHBvaW50cyB0byB0aGlzICJpbnRlcnNlY3Rpb25zIgorICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tyZWdleHAgey4qX1BJTl8oaG9yfHZlcil9ICRsMSAtIGRpcl19IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgbGF5ZXIxX3dpZHRoIFtsaW5kZXggJGwxX3N0ciAzXSA7ICMgQWxyZWFkeSBpbiBkZWYgdW5pdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNldCBydWxlX25hbWUgJHtsMX0ke2xheWVyMn1fJHtsYXllcjJfd2lkdGh9eCR7bGF5ZXIxX3dpZHRofQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgeyFbZGljdCBleGlzdHMgJGxvZ2ljYWxfdmlhcnVsZXMgJHJ1bGVfbmFtZV19IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0IHNldCBsb2dpY2FsX3ZpYXJ1bGVzICRydWxlX25hbWUgW2xpc3QgbG93ZXIgJGwxIHVwcGVyICRsYXllcjIgd2lkdGggJHtsYXllcjJfd2lkdGh9IGhlaWdodCAke2xheWVyMV93aWR0aH1dCisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCSAgICAgICAgbGFwcGVuZCBpbnRlcnNlY3Rpb25zICJydWxlICRydWxlX25hbWUgeCAkYTIgeSAkYTEiCisJCSAgICB9CisJICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgIH0gZWxzZWlmIHskbGF5ZXIxX2RpcmVjdGlvbiA9PSAidmVyIiAmJiBbZ2V0X2RpciAkbDJdID09ICJob3IifSB7CiAgICAgICAgICMjU2Vjb25kIGNhc2Ugb2Ygb3J0aG9nb25hbCBpbnRlcnNlY3Rpb24sIHNpbWlsYXIgY3JpdGVyaWEgYXMgYWJvdmUsIGJ1dCBqdXN0IGZsaXAgb2YgY29vcmRpbmF0ZXMgdG8gZmluZCBpbnRlcnNlY3Rpb25zCi0JZm9yZWFjaCBsMV9zdHIgJDo6b3JpZ19zdHJpcGVfbG9jcygkbDEsJHRhZykgewotCSAgICBzZXQgbjEgIFtleHByIHtbbGluZGV4ICRsMV9zdHIgMF19XQotICAgICAgICAgICAgCi0JICAgIGZvcmVhY2ggbDJfc3RyICQ6Om9yaWdfc3RyaXBlX2xvY3MoJGwyLCR0YWcpIHsKLQkJc2V0IGZsYWcgMQotCQlzZXQgbjIJW2V4cHIge1tsaW5kZXggJGwyX3N0ciAxXX1dCi0gICAgICAgICAgICAgICAgIyBJZ25vcmUgaWYgb3V0c2lkZSB0aGUgYXJlYQotICAgICAgICAgICAgICAgIGlmIHshKCRuMSA+PSBbbGluZGV4ICRhcmVhIDBdICYmICRuMSA8PSBbbGluZGV4ICRhcmVhIDJdICYmICRuMiA+PSBbbGluZGV4ICRhcmVhIDFdICYmICRuMiA8PSBbbGluZGV4ICRhcmVhIDNdKX0ge2NvbnRpbnVlfQotCSAgICAgICAgaWYgeyRuMiA+IFtsaW5kZXggJGwxX3N0ciAyXSB8fCAkbjIgPCBbbGluZGV4ICRsMV9zdHIgMV19IHtjb250aW51ZX0KLQkgICAgICAgIGlmIHskbjEgPiBbbGluZGV4ICRsMl9zdHIgMl0gfHwgJG4xIDwgW2xpbmRleCAkbDJfc3RyIDBdfSB7Y29udGludWV9Ci0JCQkKLQkJZm9yZWFjaCBibGsxICRibG9ja2FnZSB7Ci0JCQlzZXQgYjEgW2V4cHIge1tsaW5kZXggJGJsazEgMF0gKiAkOjpkZWZfdW5pdHMgfV0KLQkJCXNldCBiMiBbZXhwciB7W2xpbmRleCAkYmxrMSAxXSAqICQ6OmRlZl91bml0cyB9XQotCQkJc2V0IGIzIFtleHByIHtbbGluZGV4ICRibGsxIDJdICogJDo6ZGVmX3VuaXRzIH1dCi0JCQlzZXQgYjQgW2V4cHIge1tsaW5kZXggJGJsazEgM10gKiAkOjpkZWZfdW5pdHMgfV0KLQkJCWlmIHsgIFtsc2VhcmNoICQ6Om1hY3JvX2Jsb2NrYWdlX2xheWVyX2xpc3QgJGwxXSA+PSAwIHx8IFtsc2VhcmNoICQ6Om1hY3JvX2Jsb2NrYWdlX2xheWVyX2xpc3QgJGwyXSA+PSAwIH0gewotCQkJCWlmIHsoJG4xID49ICRiMSAmJiAkbjEgPD0gJGIzICYmICRuMiA+PSAkYjIgJiYgJG4yIDw9ICRiNCl9IHsKLQkJCQkJc2V0IGZsYWcgMAkKLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgICAgICAgaWYge1thcnJheSBuYW1lcyBvcmlnX3N0cmlwZV9sb2NzICIkbDEsJHRhZyJdICE9ICIifSB7CisgICAgICAgICAgICAjIyBwdXRzICJDaGVja2luZyBbbGxlbmd0aCAkb3JpZ19zdHJpcGVfbG9jcygkbDEsJHRhZyldIHZlcnRpY2FsICAgc3RyaXBlcyBvbiAkbDEsICR0YWciCisgICAgICAgICAgICAjIyBwdXRzICIgIHZlcnN1cyBbbGxlbmd0aCAkb3JpZ19zdHJpcGVfbG9jcygkbDIsJHRhZyldIGhvcml6b250YWwgc3RyaXBlcyBvbiAkbDIsICR0YWciCisgICAgICAgICAgICAjIyBwdXRzICIgICAgIGFuZCBbbGxlbmd0aCAkYmxvY2thZ2VdIGJsb2NrYWdlcyIKKwkgICAgZm9yZWFjaCBsMV9zdHIgJG9yaWdfc3RyaXBlX2xvY3MoJGwxLCR0YWcpIHsKKwkgICAgICAgIHNldCBuMSAgW2V4cHIge1tsaW5kZXggJGwxX3N0ciAwXX1dCiAKLQkJaWYgeyRmbGFnID09IDF9IHsKLQkJCWxhcHBlbmQgaW50ZXJzZWN0aW9ucyAiJG4xICRuMiIKLQkJfQorCSAgICAgICAgZm9yZWFjaCBsMl9zdHIgJG9yaWdfc3RyaXBlX2xvY3MoJGwyLCR0YWcpIHsKKwkJICAgIHNldCBmbGFnIDEKKwkJICAgIHNldCBuMglbZXhwciB7W2xpbmRleCAkbDJfc3RyIDFdfV0KKworICAgICAgICAgICAgICAgICAgICAjIElnbm9yZSBpZiBvdXRzaWRlIHRoZSBhcmVhCisgICAgICAgICAgICAgICAgICAgIGlmIHshKCRuMSA+PSBbbGluZGV4ICRhcmVhIDBdICYmICRuMSA8PSBbbGluZGV4ICRhcmVhIDJdICYmICRuMiA+PSBbbGluZGV4ICRhcmVhIDFdICYmICRuMiA8PSBbbGluZGV4ICRhcmVhIDNdKX0ge2NvbnRpbnVlfQorCSAgICAgICAgICAgIGlmIHskbjIgPiBbbGluZGV4ICRsMV9zdHIgMl0gfHwgJG4yIDwgW2xpbmRleCAkbDFfc3RyIDFdfSB7Y29udGludWV9CisJICAgICAgICAgICAgaWYgeyRuMSA+IFtsaW5kZXggJGwyX3N0ciAyXSB8fCAkbjEgPCBbbGluZGV4ICRsMl9zdHIgMF19IHtjb250aW51ZX0KKworCQkgICAgZm9yZWFjaCBibGsxICRibG9ja2FnZSB7CisJCQkgICAgc2V0IGIxIFtnZXRfaW5zdGFuY2VfbGx4ICRibGsxXQorCQkJICAgIHNldCBiMiBbZ2V0X2luc3RhbmNlX2xseSAkYmxrMV0KKwkJCSAgICBzZXQgYjMgW2dldF9pbnN0YW5jZV91cnggJGJsazFdCisJCQkgICAgc2V0IGI0IFtnZXRfaW5zdGFuY2VfdXJ5ICRibGsxXQorCQkJICAgIGlmIHsgIFtsc2VhcmNoIFtnZXRfbWFjcm9fYmxvY2thZ2VfbGF5ZXJzICRibGsxXSAkbDFdID49IDAgfHwgW2xzZWFyY2ggW2dldF9tYWNyb19ibG9ja2FnZV9sYXllcnMgJGJsazFdICRsMl0gPj0gMCB9IHsKKwkJCQkgICAgaWYgeygkbjEgPj0gJGIxICYmICRuMSA8PSAkYjMgJiYgJG4yID49ICRiMiAmJiAkbjIgPD0gJGI0KX0geworCQkJCQkgICAgc2V0IGZsYWcgMAkKKwkJCQkgICAgfQorCQkJICAgIH0KKwkJICAgIH0KKworCQkgICAgaWYgeyRmbGFnID09IDF9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyBpZiBubyBibG9ja2FnZSByZXN0cmljdGlvbiwgYXBwZW5kIGludGVyc2VjdGluZyBwb2ludHMgdG8gdGhpcyAiaW50ZXJzZWN0aW9ucyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCB7LipfUElOXyhob3J8dmVyKX0gJGwxIC0gZGlyXX0geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgbGF5ZXIxX3dpZHRoIFtsaW5kZXggJGwxX3N0ciAzXSA7ICMgQWxyZWFkeSBpbiBkZWYgdW5pdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHJ1bGVfbmFtZSAke2wxfSR7bGF5ZXIyfV8ke2xheWVyMV93aWR0aH14JHtsYXllcjJfd2lkdGh9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgeyFbZGljdCBleGlzdHMgJGxvZ2ljYWxfdmlhcnVsZXMgJHJ1bGVfbmFtZV19IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdCBzZXQgbG9naWNhbF92aWFydWxlcyAkcnVsZV9uYW1lIFtsaXN0IGxvd2VyICRsMSB1cHBlciAkbGF5ZXIyIHdpZHRoICR7bGF5ZXIxX3dpZHRofSBoZWlnaHQgJHtsYXllcjJfd2lkdGh9XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJCSAgICBsYXBwZW5kIGludGVyc2VjdGlvbnMgInJ1bGUgJHJ1bGVfbmFtZSB4ICRuMSB5ICRuMiIKKwkJICAgIH0KIAogCi0JICAgIH0KKwkgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSB7IAogCSNDaGVjayBpZiBzdHJpcGVzIGhhdmUgb3J0aG9nb25hbCBpbnRlcnNlY3Rpb25zLiBJZiBub3QsIGV4aXQKLQlwdXRzICJFUlJPUjogQWRkaW5nIHZpYXMgYmV0d2VlbiBzYW1lIGRpcmVjdGlvbiBsYXllcnMgaXMgbm90IHN1cHBvcnRlZCB5ZXQuIEVYSVRJTkcuLi4uLiIKKwlwdXRzICJFUlJPUjogQWRkaW5nIHZpYXMgYmV0d2VlbiBzYW1lIGRpcmVjdGlvbiBsYXllcnMgaXMgbm90IHN1cHBvcnRlZCB5ZXQuIgorICAgICAgICBwdXRzICJMYXllcjogJGwxLCBEaXJlY3Rpb246ICRsYXllcjFfZGlyZWN0aW9uIgorICAgICAgICBwdXRzICJMYXllcjogJGwyLCBEaXJlY3Rpb246IFtnZXRfZGlyICRsMl0iCiAJZXhpdAogICAgIH0KIAotICAgIHJldHVybiBbbGlzdCBsYXllcjEgJGwxIGxheWVyMiAkbDIgcnVsZXMgW2RpY3QgZ2V0ICRncmlkX2RhdGEgdmlhc10gaW50ZXJzZWN0aW9ucyAkaW50ZXJzZWN0aW9uc10KKyAgICByZXR1cm4gW2dlbmVyYXRlX3ZpYXMgJGwxICRsMiAkaW50ZXJzZWN0aW9uc10KIH0KIAogIyBwcm9jIHRvIGdlbmVyYXRlIGZvbGxvdyBwaW4gbGF5ZXJzIG9yIHN0YW5kYXJkIGNlbGwgcmFpbHMKIAogcHJvYyBnZW5lcmF0ZV9sb3dlcl9tZXRhbF9mb2xsb3dwaW5fcmFpbHMge3RhZyBhcmVhfSB7Ci0JI0Fzc3VtZXMgaG9yaXpvbnRhbCBzdHJpcGVzCi0Jc2V0IGxheSAkOjpyYWlsc19tbGF5ZXIKKyAgICB2YXJpYWJsZSBvcmlnX3N0cmlwZV9sb2NzCisgICAgdmFyaWFibGUgc3RyaXBlX2xvY3MKKyAgICB2YXJpYWJsZSByb3dfaGVpZ2h0CisgICAgdmFyaWFibGUgcmFpbHNfc3RhcnRfd2l0aAogCi0JaWYgeyR0YWcgPT0gJDo6cmFpbHNfc3RhcnRfd2l0aH0geyA7I0lmIHN0YXJ0aW5nIGZyb20gYm90dG9tIHdpdGggdGhpcyBuZXQsIAorCSNBc3N1bWVzIGhvcml6b250YWwgc3RyaXBlcworCXNldCBsYXkgW2dldF9yYWlsc19sYXllcl0KKworCWlmIHskdGFnID09ICRyYWlsc19zdGFydF93aXRofSB7IDsjSWYgc3RhcnRpbmcgZnJvbSBib3R0b20gd2l0aCB0aGlzIG5ldCwgCiAJCXNldCBsbHkgW2xpbmRleCAkYXJlYSAxXQogCX0gZWxzZSB7Ci0JCXNldCBsbHkgW2V4cHIge1tsaW5kZXggJGFyZWEgMV0gKyAkOjpyb3dfaGVpZ2h0fV0KKwkJc2V0IGxseSBbZXhwciB7W2xpbmRleCAkYXJlYSAxXSArICRyb3dfaGVpZ2h0fV0KIAl9Ci0JbGFwcGVuZCA6OnN0cmlwZV9sb2NzKCRsYXksJHRhZykgIltsaW5kZXggJGFyZWEgMF0gJGxseSBbbGluZGV4ICRhcmVhIDJdIgotCWxhcHBlbmQgOjpvcmlnX3N0cmlwZV9sb2NzKCRsYXksJHRhZykgIltsaW5kZXggJGFyZWEgMF0gJGxseSBbbGluZGV4ICRhcmVhIDJdIgorCWxhcHBlbmQgc3RyaXBlX2xvY3MoJGxheSwkdGFnKSAiW2xpbmRleCAkYXJlYSAwXSAkbGx5IFtsaW5kZXggJGFyZWEgMl0iCisJbGFwcGVuZCBvcmlnX3N0cmlwZV9sb2NzKCRsYXksJHRhZykgIltsaW5kZXggJGFyZWEgMF0gJGxseSBbbGluZGV4ICRhcmVhIDJdIgogCiAKIAkjUmFpbCBldmVyeSBhbHRlcm5hdGUgcm93cyAtIEFzc3VtaW5nIGhvcml6b250YWwgcm93cyBhbmQgZnVsbCB3aWR0aCByYWlscwotCWZvciB7c2V0IHkgW2V4cHIgeyRsbHkgKyAoMiAqICQ6OnJvd19oZWlnaHQpfV19IHskeSA8PSBbbGluZGV4ICRhcmVhIDNdfSB7c2V0IHkgW2V4cHIgeyR5ICsgKDIgKiAkOjpyb3dfaGVpZ2h0KX1dfSB7Ci0JICAgIGxhcHBlbmQgOjpzdHJpcGVfbG9jcygkbGF5LCR0YWcpICJbbGluZGV4ICRhcmVhIDBdICR5IFtsaW5kZXggJGFyZWEgMl0iCi0JICAgIGxhcHBlbmQgOjpvcmlnX3N0cmlwZV9sb2NzKCRsYXksJHRhZykgIltsaW5kZXggJGFyZWEgMF0gJHkgW2xpbmRleCAkYXJlYSAyXSIKKwlmb3Ige3NldCB5IFtleHByIHskbGx5ICsgKDIgKiAkcm93X2hlaWdodCl9XX0geyR5IDw9IFtsaW5kZXggJGFyZWEgM119IHtzZXQgeSBbZXhwciB7JHkgKyAoMiAqICRyb3dfaGVpZ2h0KX1dfSB7CisJICAgIGxhcHBlbmQgc3RyaXBlX2xvY3MoJGxheSwkdGFnKSAiW2xpbmRleCAkYXJlYSAwXSAkeSBbbGluZGV4ICRhcmVhIDJdIgorCSAgICBsYXBwZW5kIG9yaWdfc3RyaXBlX2xvY3MoJGxheSwkdGFnKSAiW2xpbmRleCAkYXJlYSAwXSAkeSBbbGluZGV4ICRhcmVhIDJdIgogCX0KIH0KIAogCiAjIHByb2MgZm9yIGNyZWF0aW5nIHBkbiBtZXNoIGZvciB1cHBlciBtZXRhbCBsYXllcnMKIHByb2MgZ2VuZXJhdGVfdXBwZXJfbWV0YWxfbWVzaF9zdHJpcGVzIHt0YWcgbGF5ZXIgYXJlYX0geworICAgIHZhcmlhYmxlIHdpZHRocworICAgIHZhcmlhYmxlIHBpdGNoZXMKKyAgICB2YXJpYWJsZSBsb2Zmc2V0CisgICAgdmFyaWFibGUgYm9mZnNldAorICAgIHZhcmlhYmxlIG9yaWdfc3RyaXBlX2xvY3MKKyAgICB2YXJpYWJsZSBzdHJpcGVfbG9jcworICAgIHZhcmlhYmxlIHN0cmlwZXNfc3RhcnRfd2l0aAorICAgIAogCWlmIHtbZ2V0X2RpciAkbGF5ZXJdID09ICJob3IifSB7Ci0JCXNldCBvZmZzZXQgW2V4cHIgW2xpbmRleCAkYXJlYSAxXSArICQ6OmJvZmZzZXQoJGxheWVyKV0KLQkJaWYgeyR0YWcgIT0gJDo6c3RyaXBlc19zdGFydF93aXRofSB7IDsjSWYgbm90IHN0YXJ0aW5nIGZyb20gYm90dG9tIHdpdGggdGhpcyBuZXQsIAotCQkJc2V0IG9mZnNldCBbZXhwciB7JG9mZnNldCArICgkOjpwaXRjaGVzKCRsYXllcikgLyAyKX1dCisJCXNldCBvZmZzZXQgW2V4cHIgW2xpbmRleCAkYXJlYSAxXSArICRib2Zmc2V0KCRsYXllcildCisJCWlmIHskdGFnICE9ICRzdHJpcGVzX3N0YXJ0X3dpdGh9IHsgOyNJZiBub3Qgc3RhcnRpbmcgZnJvbSBib3R0b20gd2l0aCB0aGlzIG5ldCwgCisJCQlzZXQgb2Zmc2V0IFtleHByIHskb2Zmc2V0ICsgKCRwaXRjaGVzKCRsYXllcikgLyAyKX1dCiAJCX0KLQkJZm9yIHtzZXQgeSAkb2Zmc2V0fSB7JHkgPCBbZXhwciB7W2xpbmRleCAkYXJlYSAzXSAtICQ6OndpZHRocygkbGF5ZXIpfV19IHtzZXQgeSBbZXhwciB7JDo6cGl0Y2hlcygkbGF5ZXIpICsgJHl9XX0gewotCQkJbGFwcGVuZCA6OnN0cmlwZV9sb2NzKCRsYXllciwkdGFnKSAiW2xpbmRleCAkYXJlYSAwXSAkeSBbbGluZGV4ICRhcmVhIDJdIgotCQkJbGFwcGVuZCA6Om9yaWdfc3RyaXBlX2xvY3MoJGxheWVyLCR0YWcpICJbbGluZGV4ICRhcmVhIDBdICR5IFtsaW5kZXggJGFyZWEgMl0iCi0JCQorCQlmb3Ige3NldCB5ICRvZmZzZXR9IHskeSA8IFtleHByIHtbbGluZGV4ICRhcmVhIDNdIC0gJHdpZHRocygkbGF5ZXIpfV19IHtzZXQgeSBbZXhwciB7JHBpdGNoZXMoJGxheWVyKSArICR5fV19IHsKKwkJCWxhcHBlbmQgc3RyaXBlX2xvY3MoJGxheWVyLCR0YWcpICJbbGluZGV4ICRhcmVhIDBdICR5IFtsaW5kZXggJGFyZWEgMl0iCisJCQlsYXBwZW5kIG9yaWdfc3RyaXBlX2xvY3MoJGxheWVyLCR0YWcpICJbbGluZGV4ICRhcmVhIDBdICR5IFtsaW5kZXggJGFyZWEgMl0iCiAJCX0KIAl9IGVsc2VpZiB7W2dldF9kaXIgJGxheWVyXSA9PSAidmVyIn0gewotCQlzZXQgb2Zmc2V0IFtleHByIFtsaW5kZXggJGFyZWEgMF0gKyAkOjpsb2Zmc2V0KCRsYXllcildCisJCXNldCBvZmZzZXQgW2V4cHIgW2xpbmRleCAkYXJlYSAwXSArICRsb2Zmc2V0KCRsYXllcildCiAKLQkJaWYgeyR0YWcgIT0gJDo6c3RyaXBlc19zdGFydF93aXRofSB7IDsjSWYgbm90IHN0YXJ0aW5nIGZyb20gYm90dG9tIHdpdGggdGhpcyBuZXQsIAotCQkJc2V0IG9mZnNldCBbZXhwciB7JG9mZnNldCArICgkOjpwaXRjaGVzKCRsYXllcikgLyAyKX1dCisJCWlmIHskdGFnICE9ICRzdHJpcGVzX3N0YXJ0X3dpdGh9IHsgOyNJZiBub3Qgc3RhcnRpbmcgZnJvbSBib3R0b20gd2l0aCB0aGlzIG5ldCwgCisJCQlzZXQgb2Zmc2V0IFtleHByIHskb2Zmc2V0ICsgKCRwaXRjaGVzKCRsYXllcikgLyAyKX1dCiAJCX0KLQkJZm9yIHtzZXQgeCAkb2Zmc2V0fSB7JHggPCBbZXhwciB7W2xpbmRleCAkYXJlYSAyXSAtICQ6OndpZHRocygkbGF5ZXIpfV19IHtzZXQgeCBbZXhwciB7JDo6cGl0Y2hlcygkbGF5ZXIpICsgJHh9XX0gewotCQkJbGFwcGVuZCA6OnN0cmlwZV9sb2NzKCRsYXllciwkdGFnKSAiJHggW2xpbmRleCAkYXJlYSAxXSBbbGluZGV4ICRhcmVhIDNdIgotCQkJbGFwcGVuZCA6Om9yaWdfc3RyaXBlX2xvY3MoJGxheWVyLCR0YWcpICIkeCBbbGluZGV4ICRhcmVhIDFdIFtsaW5kZXggJGFyZWEgM10iCisJCWZvciB7c2V0IHggJG9mZnNldH0geyR4IDwgW2V4cHIge1tsaW5kZXggJGFyZWEgMl0gLSAkd2lkdGhzKCRsYXllcil9XX0ge3NldCB4IFtleHByIHskcGl0Y2hlcygkbGF5ZXIpICsgJHh9XX0geworCQkJbGFwcGVuZCBzdHJpcGVfbG9jcygkbGF5ZXIsJHRhZykgIiR4IFtsaW5kZXggJGFyZWEgMV0gW2xpbmRleCAkYXJlYSAzXSIKKwkJCWxhcHBlbmQgb3JpZ19zdHJpcGVfbG9jcygkbGF5ZXIsJHRhZykgIiR4IFtsaW5kZXggJGFyZWEgMV0gW2xpbmRleCAkYXJlYSAzXSIKIAkJfQogCX0gZWxzZSB7CiAJCXB1dHMgIkVSUk9SOiBJbnZhbGlkIGRpcmVjdGlvbiBcIltnZXRfZGlyICRsYXllcl1cIiBmb3IgbWV0YWwgbGF5ZXIgJHtsYXllcn0uIFNob3VsZCBiZSBlaXRoZXIgXCJob3JcIiBvciBcInZlclwiLiBFWElUSU5HLi4uLi4iCkBAIC0xNjcsMjEgKzUyOSwyNSBAQAogIyBpbnB1dHMgdG8gdGhpcyBwcm9jIGFyZSBsYXllciBuYW1lLCBkb21haW4gKHRhZyksIGFuZCBibG9ja2FnZSBiYm94IGNvb3JpZG5hdGVzCiAKIHByb2MgZ2VuZXJhdGVfbWV0YWxfd2l0aF9ibG9ja2FnZSB7bGF5ZXIgYXJlYSB0YWcgYjEgYjIgYjMgYjR9IHsKLQlzZXQgOjp0ZW1wX2xvY3MoJGxheWVyLCR0YWcpICIiCi0Jc2V0IDo6dGVtcF9sb2NzKCRsYXllciwkdGFnKSAkOjpzdHJpcGVfbG9jcygkbGF5ZXIsJHRhZykKLQlzZXQgOjpzdHJpcGVfbG9jcygkbGF5ZXIsJHRhZykgIiIKLQlmb3JlYWNoIGxfc3RyICQ6OnRlbXBfbG9jcygkbGF5ZXIsJHRhZykgeworICAgIHZhcmlhYmxlIHN0cmlwZV9sb2NzCisJc2V0IHRlbXBfbG9jcygkbGF5ZXIsJHRhZykgIiIKKwlzZXQgdGVtcF9sb2NzKCRsYXllciwkdGFnKSAkc3RyaXBlX2xvY3MoJGxheWVyLCR0YWcpCisJc2V0IHN0cmlwZV9sb2NzKCRsYXllciwkdGFnKSAiIgorCWZvcmVhY2ggbF9zdHIgJHRlbXBfbG9jcygkbGF5ZXIsJHRhZykgewogCQlzZXQgbG9jMSBbbGluZGV4ICRsX3N0ciAwXQogCQlzZXQgbG9jMiBbbGluZGV4ICRsX3N0ciAxXQogCQlzZXQgbG9jMyBbbGluZGV4ICRsX3N0ciAyXQogCQlsb2NhdGlvbl9zdHJpcGVfYmxvY2thZ2UgJGxvYzEgJGxvYzIgJGxvYzMgJGxheWVyICRhcmVhICR0YWcgJGIxICRiMiAkYjMgJGI0CiAJfQogCQkKLSAgICAgICAgc2V0IDo6c3RyaXBlX2xvY3MoJGxheWVyLCR0YWcpIFtsc29ydCAtdW5pcXVlICQ6OnN0cmlwZV9sb2NzKCRsYXllciwkdGFnKV0KKyAgICAgICAgc2V0IHN0cmlwZV9sb2NzKCRsYXllciwkdGFnKSBbbHNvcnQgLXVuaXF1ZSAkc3RyaXBlX2xvY3MoJGxheWVyLCR0YWcpXQogfQogCiAjIHN1YiBwcm9jIGNhbGxlZCBmcm9tIHByZXZpb3VzIHByb2MKIHByb2MgbG9jYXRpb25fc3RyaXBlX2Jsb2NrYWdlIHtsb2MxIGxvYzIgbG9jMyBsYXkgYXJlYSB0YWcgYjEgYjIgYjMgYjR9IHsKKyAgICB2YXJpYWJsZSB3aWR0aHMKKyAgICB2YXJpYWJsZSBzdHJpcGVfbG9jcworCiAgICAgICAgIHNldCBhcmVhX2xseCBbbGluZGV4ICRhcmVhIDBdCiAgICAgICAgIHNldCBhcmVhX2xseSBbbGluZGV4ICRhcmVhIDFdCiAgICAgICAgIHNldCBhcmVhX3VyeCBbbGluZGV4ICRhcmVhIDJdCkBAIC0xOTEsOSArNTU3LDE3IEBACiAJCSMjQ2hlY2sgaWYgc3RyaXBlIGlzIHBhc3NpbmcgdGhyb3VnaCBibG9ja2FnZQogCQkjI3B1dHMgIkhPUklaT05UQUwgQkxPQ0tBR0UgIgogCQlzZXQgeDEgJGxvYzEKLQkJc2V0IHkxIFtleHByIG1heCgkbG9jMiAtICQ6OndpZHRocygkbGF5KS8yLCBbbGluZGV4ICRhcmVhIDFdKV0KKyAgICAgICAgICAgICAgICBzZXQgeTEgW2V4cHIgJGxvYzIgLSAkd2lkdGhzKCRsYXkpLzJdCisgICAgICAgICAgICAgICAgaWYge1tsaW5kZXggJGFyZWEgMV0gPiAkeTF9IHsKKyAgICAgICAgICAgICAgICAgICAgc2V0IHkxIFtsaW5kZXggJGFyZWEgMV0KKyAgICAgICAgICAgICAgICB9CisJCXNldCB5MSBbZXhwciAkbG9jMiAtICR3aWR0aHMoJGxheSkvMl0KIAkJc2V0IHgyICRsb2MzCi0JCXNldCB5MiBbZXhwciBtaW4oJHkxICsgICQ6OndpZHRocygkbGF5KSxbbGluZGV4ICRhcmVhIDNdKV0KKyAgICAgICAgICAgICAgICBzZXQgeTIgW2V4cHIgJHkxICsgICR3aWR0aHMoJGxheSldCisgICAgICAgICAgICAgICAgaWYge1tsaW5kZXggJGFyZWEgM10gPCAkeTJ9IHsKKyAgICAgICAgICAgICAgICAgICAgc2V0IHkyIFtsaW5kZXggJGFyZWEgM10KKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAjcHV0cyAic2VnbWVudDogIFtmb3JtYXQgeyU5LjFmICU5LjFmfSAkbG9jMSAkbG9jM10iICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAjcHV0cyAiYmxvY2thZ2U6IFtmb3JtYXQgeyU5LjFmICU5LjFmfSAkYjEgJGIzXSIKIAkJaWYgeyAgKCR5MSA+PSAkYjIpICYmICgkeTIgPD0gJGI0KSAmJiAoICgkeDEgPD0gJGIzICYmICR4MiA+PSAkYjMpIHx8ICgkeDEgPD0gJGIxICYmICR4MiA+PSAkYjEpICB8fCAoJHgxIDw9ICRiMSAmJiAkeDIgPj0gJGIzKSB8fCAoJHgxIDw9ICRiMyAmJiAkeDIgPj0gJGIxKSApICB9IHsKQEAgLTIwMiw1NyArNTc2LDU0IEBACiAJCQkJI3B1dHMgIiAgQ0FTRTMgb2YgYmxvY2thZ2UgaW4gYmV0d2VlbiBsZWZ0IGFuZCByaWdodCBlZGdlIG9mIGNvcmUsIGN1dCB0aGUgc3RyaXBlIGludG8gdHdvIHNlZ21lbnRzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjcHV0cyAiICAgICR4MSAkbG9jMiAkYjEiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNwdXRzICIgICAgJGIzICRsb2MyICR4MiIKLQkJCQlsYXBwZW5kIDo6c3RyaXBlX2xvY3MoJGxheSwkdGFnKSAiJHgxICRsb2MyICRiMSIKLQkJCQlsYXBwZW5kIDo6c3RyaXBlX2xvY3MoJGxheSwkdGFnKSAiJGIzICRsb2MyICR4MiIJCisJCQkJbGFwcGVuZCBzdHJpcGVfbG9jcygkbGF5LCR0YWcpICIkeDEgJGxvYzIgJGIxIgorCQkJCWxhcHBlbmQgc3RyaXBlX2xvY3MoJGxheSwkdGFnKSAiJGIzICRsb2MyICR4MiIJCiAJCQl9IGVsc2VpZiB7JHgxIDw9ICRiMyAmJiAkeDIgPj0gJGIzfSB7CQogCQkJCSNwdXRzICIgIENBU0UzIG9mIGJsb2NrYWdlIGluIGJldHdlZW4gbGVmdCBhbmQgcmlnaHQgZWRnZSBvZiBjb3JlLCBidXQgc3RyaXBlIGV4dGVuZGluZyBvdXQgb25seSBpbiBvbmUgc2lkZSAocmlnaHQpIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjcHV0cyAiICAgICRiMyAkbG9jMiAkeDIiCi0JCQkJbGFwcGVuZCA6OnN0cmlwZV9sb2NzKCRsYXksJHRhZykgIiRiMyAkbG9jMiAkeDIiCQorCQkJCWxhcHBlbmQgc3RyaXBlX2xvY3MoJGxheSwkdGFnKSAiJGIzICRsb2MyICR4MiIJCiAJCQl9IGVsc2VpZiB7JHgxIDw9ICRiMSAmJiAkeDIgPj0gJGIxfSB7CQogCQkJCSNwdXRzICIgIENBU0UzIG9mIGJsb2NrYWdlIGluIGJldHdlZW4gbGVmdCBhbmQgcmlnaHQgZWRnZSBvZiBjb3JlLCBidXQgc3RyaXBlIGV4dGVuZGluZyBvdXQgb25seSBpbiBvbmUgc2lkZSAobGVmdCkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNwdXRzICIgICAgJHgxICRsb2MyICRiMSIKLQkJCQlsYXBwZW5kIDo6c3RyaXBlX2xvY3MoJGxheSwkdGFnKSAiJHgxICRsb2MyICRiMSIKKwkJCQlsYXBwZW5kIHN0cmlwZV9sb2NzKCRsYXksJHRhZykgIiR4MSAkbG9jMiAkYjEiCiAJCQl9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICNwdXRzICIgIENBU0U1IG5vIG1hdGNoIC0gZWxpbWluYXRlZCBzZWdtZW50IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICNwdXRzICIgICAgJGxvYzEgJGxvYzIgJGxvYzMiCiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gCiAJCX0gZWxzZSB7Ci0JCQlsYXBwZW5kIDo6c3RyaXBlX2xvY3MoJGxheSwkdGFnKSAiJHgxICRsb2MyICR4MiIKKwkJCWxhcHBlbmQgc3RyaXBlX2xvY3MoJGxheSwkdGFnKSAiJHgxICRsb2MyICR4MiIKIAkJCSNwdXRzICJzdHJpcGUgZG9lcyBub3QgcGFzcyB0aHJ1IGFueSBsYXllciBibG9ja2FnZSAtLS0gQ0FTRSA0IChkbyBub3QgY2hhbmdlIHRoZSBzdHJpcGUgbG9jYXRpb24pIgogCQl9CiAJfQogCiAJaWYge1tnZXRfZGlyICRsYXldID09ICJ2ZXIifSB7CiAJCSMjQ2hlY2sgaWYgdmVyaXRjYWwgc3RyaXBlIGlzIHBhc3NpbmcgdGhyb3VnaCBibG9ja2FnZSwgc2FtZSBzdHJhdGVneSBhcyBhYm92ZQotCQlzZXQgeDEgJGxvYzEKKwkJc2V0IHgxICRsb2MxIDsjIFtleHByIG1heCgkbG9jMSAtICAkd2lkdGhzKCRsYXkpLzIsIFtsaW5kZXggJGFyZWEgMF0pXQogCQlzZXQgeTEgJGxvYzIKKwkJc2V0IHgyICRsb2MxIDsjIFtleHByIG1pbigkbG9jMSArICAkd2lkdGhzKCRsYXkpLzIsIFtsaW5kZXggJGFyZWEgMl0pXQogCQlzZXQgeTIgJGxvYzMKLQkJc2V0IHgyIFtleHByIHsgJHgxICsgICQ6OndpZHRocygkbGF5KSB9XQotCQlpZiB7ICgkeDEgPj0gJGIxKSAgICYmICgkeDIgPD0gJGIzKSAmJiAoICgkeTEgPD0gJGIyICYmICR5MiA+PSAkYjIpIHx8ICgkeTEgPD0gJGI0ICYmICR5MiA+PSAkYjQpICB8fCAoJHkxIDw9ICRiMiAmJiAkeTIgPj0gJGI0KSB8fCAoJHkxIDw9ICRiNCAmJiAkeTIgPj0gJGIyKSAgICkgfSB7CisKKwkJaWYgeyR4MiA+ICRiMSAmJiAkeDEgPCAkYjN9IHsKIAogCQkJaWYgeyR5MSA8PSAkYjIgJiYgJHkyID49ICRiNH0gewkKIAkJCQkjI3B1dHMgIkNBU0UzIG9mIGJsb2NrYWdlIGluIGJldHdlZW4gdG9wIGFuZCBib3R0b20gZWRnZSBvZiBjb3JlLCBjdXQgdGhlIHN0cmlwZSBpbnRvIHR3byBzZWdtZW50cwotCQkJCWxhcHBlbmQgOjpzdHJpcGVfbG9jcygkbGF5LCR0YWcpICIkeDEgJHkxICRiMiIKLQkJCQlsYXBwZW5kIDo6c3RyaXBlX2xvY3MoJGxheSwkdGFnKSAiJHgxICRiNCAkeTIiCQotCQkJfQotCQkJaWYgeyR5MSA8PSAkYjQgJiYgJHkyID49ICRiNH0gewkKKwkJCQlsYXBwZW5kIHN0cmlwZV9sb2NzKCRsYXksJHRhZykgIiRsb2MxICR5MSAkYjIiCisJCQkJbGFwcGVuZCBzdHJpcGVfbG9jcygkbGF5LCR0YWcpICIkbG9jMSAkYjQgJHkyIgkKKwkJCX0gZWxzZWlmIHskeTEgPD0gJGI0ICYmICR5MiA+PSAkYjR9IHsJCiAJCQkJIyNwdXRzICJDQVNFMyBvZiBibG9ja2FnZSBpbiBiZXR3ZWVuIHRvcCBhbmQgYm90dG9tIGVkZ2Ugb2YgY29yZSwgYnV0IHN0cmlwZSBleHRlbmRpbmcgb3V0IG9ubHkgaW4gb25lIHNpZGUgKHJpZ2h0KSIKLQkJCQlsYXBwZW5kIDo6c3RyaXBlX2xvY3MoJGxheSwkdGFnKSAiJHgxICRiNCAkeTIiCQotCQkJfQotCQkJaWYgeyR5MSA8PSAkYjIgJiYgJHkyID49ICRiMn0gewkKKwkJCQlsYXBwZW5kIHN0cmlwZV9sb2NzKCRsYXksJHRhZykgIiRsb2MxICRiNCAkeTIiCQorCQkJfSBlbHNlaWYgeyR5MSA8PSAkYjIgJiYgJHkyID49ICRiMn0gewkKIAkJCQkjI3B1dHMgIkNBU0UzIG9mIGJsb2NrYWdlIGluIGJldHdlZW4gdG9wIGFuZCBib3R0b20gZWRnZSBvZiBjb3JlLCBidXQgc3RyaXBlIGV4dGVuZGluZyBvdXQgb25seSBpbiBvbmUgc2lkZSAobGVmdCkiCi0JCQkJbGFwcGVuZCA6OnN0cmlwZV9sb2NzKCRsYXksJHRhZykgIiR4MSAkeTEgJGIyIgorCQkJCWxhcHBlbmQgc3RyaXBlX2xvY3MoJGxheSwkdGFnKSAiJGxvYzEgJHkxICRiMiIKKwkJCX0gZWxzZWlmIHskeTEgPD0gJGI0ICYmICR5MSA+PSAkYjIgJiYgJHkyID49ICRiMiAmJiAkeTIgPD0gJGI0fSB7CQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjI2NvbXBsZXRlbHkgZW5jbG9zZWQgLSByZW1vdmUgc2VnbWVudAogCQkJfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAjcHV0cyAiICBDQVNFNSBubyBtYXRjaCAtIGVsaW1pbmF0ZWQgc2VnbWVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjcHV0cyAiICBDQVNFNSBubyBtYXRjaCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjcHV0cyAiICAgICRsb2MxICRsb2MyICRsb2MzIgorCQkJICAgIGxhcHBlbmQgc3RyaXBlX2xvY3MoJGxheSwkdGFnKSAiJGxvYzEgJHkxICR5MiIKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotCi0KLSAKIAkJfSBlbHNlIHsKLQkJCWxhcHBlbmQgOjpzdHJpcGVfbG9jcygkbGF5LCR0YWcpICIkeDEgJHkxICR5MiIKKwkJCWxhcHBlbmQgc3RyaXBlX2xvY3MoJGxheSwkdGFnKSAiJGxvYzEgJHkxICR5MiIKIAkJfQogCX0KIH0KQEAgLTI2MCwzNyArNjMxLDM3IEBACiAKICMjIHRoaXMgaXMgYSB0b3AtbGV2ZWwgcHJvYyB0byBnZW5lcmF0ZSBQRE4gc3RyaXBlcyBhbmQgaW5zZXJ0IHZpYXMgYmV0d2VlbiB0aGVzZSBzdHJpcGVzCiBwcm9jIGdlbmVyYXRlX3N0cmlwZXNfdmlhcyB7dGFnIG5ldF9uYW1lIGdyaWRfZGF0YX0gewotCisgICAgICAgIHZhcmlhYmxlIHZpYXMKKyAgICAgICAgCiAgICAgICAgIHNldCBhcmVhIFtkaWN0IGdldCAkZ3JpZF9kYXRhIGFyZWFdCiAgICAgICAgIHNldCBibG9ja2FnZSBbZGljdCBnZXQgJGdyaWRfZGF0YSBibG9ja2FnZV0KLSAgICAgICAgCi0JIyNwdXRzIC1ub25ld2xpbmUgIkFkZGluZyBzdHJpcGVzIGZvciAkbmV0X25hbWUgLi4uIgotCWZvcmVhY2ggbGF5IFtkaWN0IGdldCAkZ3JpZF9kYXRhIGxheWVyc10gewogCi0JICAgIGlmIHskbGF5ID09ICQ6OnJhaWxzX21sYXllcn0geworCSMjIHB1dHMgIkFkZGluZyBzdHJpcGVzIGZvciAkbmV0X25hbWUgLi4uIgorCWZvcmVhY2ggbGF5IFtkaWN0IGtleXMgW2RpY3QgZ2V0ICRncmlkX2RhdGEgbGF5ZXJzXV0geworCSAgICAjIyBwdXRzICIgICAgTGF5ZXIgJGxheSAuLi4iCisKKwkgICAgaWYgeyRsYXkgPT0gW2dldF9yYWlsc19sYXllcl19IHsKIAkgICAgICAgICNTdGQuIGNlbGwgcmFpbHMKIAkgICAgICAgIGdlbmVyYXRlX2xvd2VyX21ldGFsX2ZvbGxvd3Bpbl9yYWlscyAkdGFnICRhcmVhCiAKIAkgICAgICAgIGZvcmVhY2ggYmxrMSAkYmxvY2thZ2UgewotCQkgICAgICAgIHNldCBiMSBbZXhwciB7W2xpbmRleCAkYmxrMSAwXSAqICQ6OmRlZl91bml0cyB9XQotCQkgICAgICAgIHNldCBiMiBbZXhwciB7W2xpbmRleCAkYmxrMSAxXSAqICQ6OmRlZl91bml0cyB9XQotCQkgICAgICAgIHNldCBiMyBbZXhwciB7W2xpbmRleCAkYmxrMSAyXSAqICQ6OmRlZl91bml0cyB9XQotCQkgICAgICAgIHNldCBiNCBbZXhwciB7W2xpbmRleCAkYmxrMSAzXSAqICQ6OmRlZl91bml0cyB9XQotCQkgICAgICAgIGdlbmVyYXRlX21ldGFsX3dpdGhfYmxvY2thZ2UgJDo6cmFpbHNfbWxheWVyICRhcmVhICR0YWcgJGIxICRiMiAkYjMgJGI0CisJCSAgICAgICAgc2V0IGIxIFtnZXRfaW5zdGFuY2VfbGx4ICRibGsxXQorCQkgICAgICAgIHNldCBiMiBbZ2V0X2luc3RhbmNlX2xseSAkYmxrMV0KKwkJICAgICAgICBzZXQgYjMgW2dldF9pbnN0YW5jZV91cnggJGJsazFdCisJCSAgICAgICAgc2V0IGI0IFtnZXRfaW5zdGFuY2VfdXJ5ICRibGsxXQorCQkgICAgICAgIGdlbmVyYXRlX21ldGFsX3dpdGhfYmxvY2thZ2UgW2dldF9yYWlsc19sYXllcl0gJGFyZWEgJHRhZyAkYjEgJGIyICRiMyAkYjQKIAkgICAgICAgIH0KIAogICAgICAgICAgICAgfSBlbHNlIHsKIAkgICAgICAgICNVcHBlciBsYXllciBzdHJpcGVzCi0JCWlmIHskOjp3aWR0aHMoJGxheSkgIT0gW2V4cHIgey0xICogJDo6ZGVmX3VuaXRzfV0gfHwgJDo6cGl0Y2hlcygkbGF5KSAhPSBbZXhwciB7LTEgKiAkOjpkZWZfdW5pdHN9XX0gewotCQkJZ2VuZXJhdGVfdXBwZXJfbWV0YWxfbWVzaF9zdHJpcGVzICR0YWcgJGxheSAkYXJlYQotCQl9CisJCWdlbmVyYXRlX3VwcGVyX21ldGFsX21lc2hfc3RyaXBlcyAkdGFnICRsYXkgJGFyZWEKIAotCQlpZiB7ICBbbHNlYXJjaCAkOjptYWNyb19ibG9ja2FnZV9sYXllcl9saXN0ICRsYXldID49IDAgfSB7Ci0JCQlmb3JlYWNoIGJsazIgJGJsb2NrYWdlIHsKLQkJCQlzZXQgYzEgW2V4cHIge1tsaW5kZXggJGJsazIgMF0gKiAkOjpkZWZfdW5pdHMgfV0KLQkJCQlzZXQgYzIgW2V4cHIge1tsaW5kZXggJGJsazIgMV0gKiAkOjpkZWZfdW5pdHMgfV0KLQkJCQlzZXQgYzMgW2V4cHIge1tsaW5kZXggJGJsazIgMl0gKiAkOjpkZWZfdW5pdHMgfV0KLQkJCQlzZXQgYzQgW2V4cHIge1tsaW5kZXggJGJsazIgM10gKiAkOjpkZWZfdW5pdHMgfV0KKwkJZm9yZWFjaCBibGsyICRibG9ja2FnZSB7CisJCSAgICAgICAgaWYgeyAgW2xzZWFyY2ggW2dldF9tYWNyb19ibG9ja2FnZV9sYXllcnMgJGJsazJdICRsYXldID49IDAgfSB7CisJCQkJc2V0IGMxIFtnZXRfaW5zdGFuY2VfbGx4ICRibGsyXQorCQkJCXNldCBjMiBbZ2V0X2luc3RhbmNlX2xseSAkYmxrMl0KKwkJCQlzZXQgYzMgW2dldF9pbnN0YW5jZV91cnggJGJsazJdCisJCQkJc2V0IGM0IFtnZXRfaW5zdGFuY2VfdXJ5ICRibGsyXQogCiAJCQkJZ2VuZXJhdGVfbWV0YWxfd2l0aF9ibG9ja2FnZSAkbGF5ICRhcmVhICR0YWcgJGMxICRjMiAkYzMgJGM0CiAJCQl9CkBAIC0yOTksMTYgKzY3MCwxNCBAQAogCX0KIAogCSNWaWEgc3RhY2tzCi0JIyNwdXRzIC1ub25ld2xpbmUgIkFkZGluZyB2aWFzIGZvciAkbmV0X25hbWUgLi4uIgorCSMjIHB1dHMgIkFkZGluZyB2aWFzIGZvciAkbmV0X25hbWUgKFtsbGVuZ3RoIFtkaWN0IGdldCAkZ3JpZF9kYXRhIGNvbm5lY3RdXSBjb25uZWN0aW9ucykuLi4iCiAJZm9yZWFjaCB0dXBsZSBbZGljdCBnZXQgJGdyaWRfZGF0YSBjb25uZWN0XSB7CiAJCXNldCBsMSBbbGluZGV4ICR0dXBsZSAwXQogCQlzZXQgbDIgW2xpbmRleCAkdHVwbGUgMV0KLQorICAgICAgICAgICAgICAgICMjIHB1dHMgIiAgICAkbDEgdG8gJGwyIgogICAgICAgICAgICAgICAgIHNldCBjb25uZWN0aW9ucyBbZ2VuZXJhdGVfdmlhX3N0YWNrcyAkbDEgJGwyICR0YWcgJGdyaWRfZGF0YV0KLQkJbGFwcGVuZCA6OnZpYXMgW2xpc3QgbmV0X25hbWUgJG5ldF9uYW1lIGNvbm5lY3Rpb25zICRjb25uZWN0aW9uc10KKwkJbGFwcGVuZCB2aWFzIFtsaXN0IG5ldF9uYW1lICRuZXRfbmFtZSBjb25uZWN0aW9ucyAkY29ubmVjdGlvbnNdCiAJfQotCSMjcHV0cyAiIERPTkUgXFtUb3RhbCBlbGFwc2VkIHdhbGx0aW1lID0gW2V4cHIge1tleHByIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdIC0gJDo6c3RhcnRfdGltZX1dLzEwMDAuMH1dIHNlY29uZHNcXSIKLQogfQogCiAgICAgbmFtZXNwYWNlIGV4cG9ydCB3cml0ZV9kZWYgd3JpdGVfdmlhcwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wZG4vc3JjL3NjcmlwdHMvcGtnSW5kZXgudGNsIGIvc2NyaXB0cy9wZG4vc3JjL3NjcmlwdHMvcGtnSW5kZXgudGNsCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggZTQ0MTUyZS4uNDhlODA2MgotLS0gYS9zY3JpcHRzL3Bkbi9zcmMvc2NyaXB0cy9wa2dJbmRleC50Y2wKKysrIGIvc2NyaXB0cy9wZG4vc3JjL3NjcmlwdHMvcGtnSW5kZXgudGNsCkBAIC05LDEwICs5LDEzIEBACiAjIGZ1bGwgcGF0aCBuYW1lIG9mIHRoaXMgZmlsZSdzIGRpcmVjdG9yeS4KIAogcHJvYyBzb3VyY2VfcGRuIHtkaXJ9IHsKKyAgICBpZiB7W3BhY2thZ2UgdmNvbXBhcmUgW3BhY2thZ2UgcHJlc2VudCBUY2xdIDguNl0gPT0gLTF9IHsKKyAgICAgICAgc291cmNlIFtmaWxlIGpvaW4gJGRpciB0Y2w4cDUudGNsXQorICAgIH0KICAgICBzb3VyY2UgW2ZpbGUgam9pbiAkZGlyIHBnX2dyaWRfcHJvY3MudGNsXQogICAgIHNvdXJjZSBbZmlsZSBqb2luICRkaXIgZ2VuX2Jsb2NrYWdlLnRjbF0KLSAgICBzb3VyY2UgW2ZpbGUgam9pbiAkZGlyIGRlZl93cml0ZXIudGNsXQorICAgIHNvdXJjZSBbZmlsZSBqb2luICRkaXIgb3BlbmRiX3dyaXRlci50Y2xdCiAgICAgc291cmNlIFtmaWxlIGpvaW4gJGRpciBjcmVhdGVfcGdfZ3JpZC50Y2xdCiB9CiAKLXBhY2thZ2UgaWZuZWVkZWQgcGRuIDAuMS4wIFtsaXN0IHNvdXJjZV9wZG4gJGRpcl0KK3BhY2thZ2UgaWZuZWVkZWQgcGRuIDAuMy4wIFtsaXN0IHNvdXJjZV9wZG4gJGRpcl0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGRuL3NyYy9zY3JpcHRzL3RjbDhwNS50Y2wgYi9zY3JpcHRzL3Bkbi9zcmMvc2NyaXB0cy90Y2w4cDUudGNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZjFmM2UKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL3Bkbi9zcmMvc2NyaXB0cy90Y2w4cDUudGNsCkBAIC0wLDAgKzEsMTEgQEAKK2lmIHtbcGFja2FnZSB2Y29tcGFyZSBbcGFja2FnZSBwcmVzZW50IFRjbF0gOC42XSA9PSAtMX0geworICAgIHByb2MgbG1hcCB7YXJnc30geworICAgICAgICBzZXQgcmVzdWx0IHt9CisgICAgICAgIHNldCB2YXIgW2xpbmRleCAkYXJncyAwXQorICAgICAgICBmb3JlYWNoIGl0ZW0gW2xpbmRleCAkYXJncyAxXSB7CisgICAgICAgICAgICB1cGxldmVsIDEgInNldCAkdmFyICRpdGVtIgorICAgICAgICAgICAgbGFwcGVuZCByZXN1bHQgW3VwbGV2ZWwgMSBbbGluZGV4ICRhcmdzIGVuZF1dCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICRyZXN1bHQKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL3JlcGxhY2VfZ3AudGNsIGIvc2NyaXB0cy9yZXBsYWNlX2dwLnRjbAppbmRleCAyOGJmZjE2Li5iOWMxYzViIDEwMDc1NQotLS0gYS9zY3JpcHRzL3JlcGxhY2VfZ3AudGNsCisrKyBiL3NjcmlwdHMvcmVwbGFjZV9ncC50Y2wKQEAgLTUsNyArNSw3IEBACiByZXAgc2V0X2RlbnNpdHkgJDo6ZW52KFBMX1RBUkdFVF9ERU5TSVRZKQogCiByZXAgaW1wb3J0X2xlZiAkOjplbnYoTUVSR0VEX0xFRikKLXJlcCBpbXBvcnRfZGVmICQ6OmVudih0YXBjZWxsX3Jlc3VsdF9maWxlX3RhZykuZGVmCityZXAgaW1wb3J0X2RlZiAkOjplbnYocGRuX3Jlc3VsdF9maWxlX3RhZykuZGVmCiByZXAgc2V0X291dHB1dCAkOjplbnYocmVwbGFjZWlvX3RtcF9maWxlX3RhZykKIAogaWYgeyAkOjplbnYoUExfVElNRV9EUklWRU4pIH0gewo=